diff --git a/accessibility-checker-extension/webpack.config.js b/accessibility-checker-extension/webpack.config.js index 52d6b977a..3db8296da 100644 --- a/accessibility-checker-extension/webpack.config.js +++ b/accessibility-checker-extension/webpack.config.js @@ -190,7 +190,7 @@ module.exports = { return false; } // Exclude 2023.01.* through 2023.04.* versions - if (/[/\\]2023\.(01|02|03|04|05|06|07)\.[^/\\]*[/\\]/.test(resourcePath)) { + if (/[/\\]2023\.(01|02|03|04|05|06|07|08)\.[^/\\]*[/\\]/.test(resourcePath)) { return false; } return true; diff --git a/rule-server/src/static/archives.json b/rule-server/src/static/archives.json index 4d5729658..b9bca79ff 100644 --- a/rule-server/src/static/archives.json +++ b/rule-server/src/static/archives.json @@ -4,6 +4,12 @@ "name": "Latest Deployment", "path": "/archives/latest" }, + { + "id": "02September2026", + "name": "02 September 2026 Deployment (IBM 7.3)", + "version": "4.0.32", + "path": "/archives/2026.09.02" + }, { "id": "21August2026", "name": "21 August 2026 Deployment (IBM 7.3)", @@ -235,7 +241,8 @@ "id": "30August2023", "name": "30 August 2023 Deployment (IBM 7.2)", "version": "3.1.60", - "path": "/archives/2023.08.30" + "path": "/archives/2023.08.30", + "hidden": true }, { "id": "09August2023", diff --git a/rule-server/src/static/archives/2026.09.02/doc/assets/NeedsReview16.svg b/rule-server/src/static/archives/2026.09.02/doc/assets/NeedsReview16.svg new file mode 100644 index 000000000..917834a38 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/assets/NeedsReview16.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/rule-server/src/static/archives/2026.09.02/doc/assets/Recommendation16.svg b/rule-server/src/static/archives/2026.09.02/doc/assets/Recommendation16.svg new file mode 100644 index 000000000..b57dc73d5 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/assets/Recommendation16.svg @@ -0,0 +1,15 @@ + + + + + + +i + diff --git a/rule-server/src/static/archives/2026.09.02/doc/assets/Violation16.svg b/rule-server/src/static/archives/2026.09.02/doc/assets/Violation16.svg new file mode 100644 index 000000000..5f8c9c710 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/assets/Violation16.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/rule-server/src/static/archives/2026.09.02/doc/common/help.css b/rule-server/src/static/archives/2026.09.02/doc/common/help.css new file mode 100644 index 000000000..813063236 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/common/help.css @@ -0,0 +1,268 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +@import url("https://1.www.s81c.com/common/carbon-for-ibm-dotcom/tag/v1/latest/plex.css"); +@import url('https://unpkg.com/carbon-components@10.58.15/css/carbon-components.min.css'); +@import url("https://1.www.s81c.com/common/carbon-for-ibm-dotcom/tag/v1/latest/themes.css"); + +bx-list-item>code, p>code, td>code { + background-color: var(--cds-layer); + border-radius: 4px; + bottom: 0.0625em; + color: var(--cds-text-primary); + display: inline; + font-size: .75rem; + font-size: .875em; + font-weight: 400; + letter-spacing: .32px; + line-height: 1.33333; + padding: 0 0.5em; + position: relative; +} + +.toolHelp a { + color: var(--cds-link-primary) +} + +.toolHelp .toolMain p ~ p { + margin-top: .5rem; +} + +.toolHelp .toolHead h3 { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; +} + +.toolHelp .toolHead .issueLevel { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; +} + +.toolHelp .toolHead #ruleMessage { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; + margin-top: .5rem; + margin-bottom: .5rem; +} + +.toolHelp .toolHead #groupLabel { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; +} + +/* productive-heading-03 */ +.toolHelp .toolMain h3 { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; +} + +.toolHelp .toolSide .bx--list__item { + color: black; + font-size: 0.875rem; + line-height: 18px; +} + +/* productive-heading-03 */ +.toolHelp .toolSide h3 { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; +} + +@media (min-width: 42rem) { + html, body, .toolHelp .bx--row:nth-child(2) { + height: 100%; + } +} +body { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + color: var(--cds-text-primary); + background-color: var(--cds-ui-background); +} + +.toolHelp { + padding: 0px; + margin: 0px; + max-width: 100%; + background-color: #e8daff; +} + +.toolHelp p { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; +font-style: normal; +font-weight: 400; +font-size: 14px; +line-height: 20px; +/* or 143% */ + +letter-spacing: 0.16px; +} + +.dds-theme-zone-g90 .toolHelp { + background-color: #31135E; +} + +.toolHelp .bx--row { + margin: 0px; +} + +.toolHelp .toolHead { + margin-bottom: 1rem; + padding-top: 1rem; +} +.toolHelp .toolMain { + background-color: var(--cds-ui-background); + padding-top: 1rem; + padding-bottom: 1rem; + border-top: solid var(--cds-text-primary) 1px; +} +.toolHelp .toolMain h2 { + margin-top: 32px; + margin-bottom: 0.5rem; +} +.toolHelp .toolMain h3 { + margin-top: 1.5rem; + margin-bottom: 0.5rem; +} +.toolHelp .toolMain p { + margin-top: 0px; +} + +.toolHelp .toolSide { + padding: 16px 16px 16px 32px; + background-color: var(--cds-ui-background); + color: var(--cds-text-primary); + border-top: solid var(--cds-text-primary) 1px; +} +@media (min-width: 42rem) { + .toolHelp .toolSide { + border-left: solid var(--cds-text-primary) 1px; + } +} + +.toolHelp .toolSide h2 { + margin-top: 32px; + margin-bottom: 0.5rem; +} +.toolHelp .toolSide h3 { + margin-top: 1.5rem; + margin-bottom: 0.5rem; +} +.toolHelp .toolSide p { + margin-top: 0px; +} +@media (min-width: 66rem) { + .toolHelp .toolMain p, bx-list-item { + max-width: 66.66%; + } +} +cds-code-snippet[type="multi"]::after { + height: 0px; +} + +#ruleInfo { + margin-top: 1rem; +} + +#ruleInfo p { + font-size: 14px; +} + +mark-down table tbody tr:hover { + background: var(--cds-layer-hover); +} +mark-down table tbody tr:hover td, mark-down table tbody tr:hover th { + background: var(--cds-layer-hover); + -webkit-border-after: 1px solid var(--cds-layer-hover); + border-block-end: 1px solid var(--cds-layer-hover); + -webkit-border-before: 1px solid var(--cds-layer-hover); + border-block-start: 1px solid var(--cds-layer-hover); + color: var(--cds-text-primary,#161616); +} + +mark-down table { + margin-top: 1rem; + width: 100%; +} + +@media (min-width: 66rem) { + mark-down table { + max-width: 66.66%; + } +} + +mark-down table thead { + font-size: var(--cds-heading-compact-01-font-size,0.875rem); + font-weight: var(--cds-heading-compact-01-font-weight,600); + line-height: var(--cds-heading-compact-01-line-height,1.28572); + letter-spacing: var(--cds-heading-compact-01-letter-spacing,0.16px); + background-color: var(--cds-layer-accent); +} + +mark-down table tr { + border: none; + block-size: 3rem; + inline-size: 100%; +} + +mark-down table th { + background-color: var(--cds-layer-accent); + color: var(--cds-text-primary,#161616); + -webkit-padding-end: 1rem; + padding-inline-end: 1rem; + -webkit-padding-start: 1rem; + padding-inline-start: 1rem; +} + +mark-down table td, mark-down table th { + text-align: start; + vertical-align: middle; +} + +mark-down table tbody { + font-size: var(--cds-body-compact-01-font-size,0.875rem); + font-weight: var(--cds-body-compact-01-font-weight,400); + line-height: var(--cds-body-compact-01-line-height,1.28572); + letter-spacing: var(--cds-body-compact-01-letter-spacing,0.16px); + background-color: var(--cds-layer); + inline-size: 100%; +} + +mark-down table td, mark-down table tbody th { + background: var(--cds-layer); + -webkit-border-after: 1px solid var(--cds-border-subtle); + border-block-end: 1px solid var(--cds-border-subtle); + -webkit-border-before: 1px solid var(--cds-layer); + border-block-start: 1px solid var(--cds-layer); + color: var(--cds-text-secondary,#525252); + -webkit-padding-end: 1rem; + padding-inline-end: 1rem; + -webkit-padding-start: 1rem; + padding-inline-start: 1rem; +} \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.09.02/doc/common/help.js b/rule-server/src/static/archives/2026.09.02/doc/common/help.js new file mode 100644 index 000000000..e979485ad --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/common/help.js @@ -0,0 +1,225 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ + +class HTMLBaseElement extends HTMLElement { + constructor(...args) { + const self = super(...args); + self.parsed = false; // guard to make it easy to do certain stuff only once + self.parentNodes = []; + return self; + } + + connectedCallback() { + // collect the parentNodes + let el = this; + while (el.parentNode) { + el = el.parentNode; + this.parentNodes.push(el); + } + // check if the parser has already passed the end tag of the component + // in which case this element, or one of its parents, should have a nextSibling + // if not (no whitespace at all between tags and no nextElementSiblings either) + // resort to DOMContentLoaded or load having triggered + if ([this, ...this.parentNodes].some((el) => el.nextSibling) || document.readyState !== "loading") { + if (this.childrenAvailableCallback) + this.childrenAvailableCallback(); + this.parsed = true; + } else { + this.mutationObserver = new MutationObserver(() => { + if ([this, ...this.parentNodes].some((el) => el.nextSibling) || document.readyState !== "loading") { + if (this.childrenAvailableCallback) + this.childrenAvailableCallback(); + this.parsed = true; + this.mutationObserver.disconnect(); + } + }); + + this.mutationObserver.observe(this, { + childList: true, + }); + } + } +} + +function isDarkMode() { + return (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches); +} + +customElements.define( + "mark-down", + class extends HTMLBaseElement { + constructor() { + super(); + setTimeout(() => { + let converted = marked.parse(this.textContent); + this.innerHTML = converted + .replace(/<(\/?)ul>/g, "<$1cds-unordered-list>") + .replace(/<(\/?)li>/g, "<$1cds-list-item>") + .replace(/[ \r\n]*/g, "") + .replace(/<\/code>[ \r\n]*<\/pre>/g, ""); + }, 0) + } + // childrenAvailableCallback() { + // let converted = marked.parse(this.innerHTML); + // this.innerHTML = converted + // .replace(/<(\/?)ul>/g, "<$1bx-unordered-list>") + // .replace(/<(\/?)li>/g, "<$1bx-list-item>") + // .replace(/[ \r\n]*/g, "") + // .replace(/<\/code>[ \r\n]*<\/pre>/g, ""); + // } + } +); + +customElements.define( + "code-snippet", + class extends HTMLBaseElement { + childrenAvailableCallback() { + let oldCode = this.innerHTML; + this.innerHTML = ""; + // const shadowRoot = this.attachShadow({mode: 'open'}); + const shadowRoot = this; + let snip = document.createElement("cds-code-snippet"); + snip.setAttribute("type", "multi"); + snip.innerHTML = oldCode.replace(/ ruleInfo.msgArgs[matchedNum]); + document.querySelector("#ruleMessage").innerHTML = ruleMessage.replace(/&/g, "&").replace(//g, ">") + } + setTimeout(() => { + if (ruleInfo.snippet) { + let snip = ruleInfo.snippet; + snip = snip.replace(/( [a-zA-Z-]+="[^"]*")/g, "\n $1"); + let snipElem = document.createElement("code-snippet"); + for (let line of snip.split("\n")) { + snipElem.appendChild(document.createTextNode(line+"\n")); + } + let locSnippet = document.querySelector("#locSnippet"); + locSnippet.innerHTML = `

Element location

`; + locSnippet.appendChild(snipElem); + } + }, 0); + if (ruleInfo.value) { + let value = ruleInfo.value; + const val = valueMap[value[0]][value[1]]; + let icon = ""; + if (val === "Violation") icon = ``; + if (val === "Needs review") icon = ``; + if (val === "Recommendation") icon = ``; + let level = document.querySelector("#locLevel"); + let parent = level.parentElement; + level = parent.removeChild(level); + parent.insertBefore(level, parent.firstElementChild); + document.querySelector("#locLevel").innerHTML = `
${val}
`; + } + if (RULE_ID) { + document.querySelector("#ruleInfo").innerHTML = `

Rule ID: ${RULE_ID}${ruleInfo.reasonId ? `
Reason ID: ${ruleInfo.reasonId}

` : ""}`; + } + } +} + +if ("onhashchange" in window) {// does the browser support the hashchange event? + window.onhashchange = function () { + let ruleInfo = JSON.parse(decodeURIComponent(window.location.hash.substring(1))); + updateWithRuleInfo(ruleInfo); + } +} + +window.addEventListener("DOMContentLoaded", (evt) => { + let groupMsg = typeof RULE_MESSAGES !== "undefined" && (RULE_MESSAGES["en-US"].group || RULE_MESSAGES["en-US"][0]) || ""; + groupMsg = groupMsg.replace(/&/g, "&").replace(//g, ">"); + document.querySelector("#groupLabel").innerHTML = groupMsg; + let ruleInfo; + if (window.location.search && window.location.search.length > 0) { + const searchParams = new URLSearchParams(window.location.search); + ruleInfo = JSON.parse(decodeURIComponent(searchParams.get("issue"))); + } else if (window.location.hash && window.location.hash.length > 0) { + ruleInfo = JSON.parse(decodeURIComponent(window.location.hash.substring(1))); + } + updateWithRuleInfo(ruleInfo); + + if (isDarkMode()) { + document.body.setAttribute("class", "dds-theme-zone-g90"); + } else { + document.body.setAttribute("class", "dds-theme-zone-g10"); + } + +}) + diff --git a/rule-server/src/static/archives/2026.09.02/doc/common/rules.css b/rule-server/src/static/archives/2026.09.02/doc/common/rules.css new file mode 100644 index 000000000..d74ec347e --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/common/rules.css @@ -0,0 +1,29 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +@import url('https://unpkg.com/carbon-components@10.58.15/css/carbon-components.min.css'); + +html, body, .toolHelp .bx--row:nth-child(2) { + height: 100%; +} + +body { + font-family: 'IBM Plex Sans', sans-serif; + padding: 1rem; +} + +h2 { + margin-top: 1rem; + font-size: 16px; + line-height: 24px; + font-weight: 600; +} diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html new file mode 100644 index 000000000..26752ccd5 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html @@ -0,0 +1,90 @@ + + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html new file mode 100644 index 000000000..6268a62d3 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html @@ -0,0 +1,95 @@ + + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html new file mode 100644 index 000000000..c0ce87a3f --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html @@ -0,0 +1,107 @@ + + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/a_target_warning.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/a_target_warning.html new file mode 100644 index 000000000..401cc783e --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/a_target_warning.html @@ -0,0 +1,91 @@ + + + + a_target_warning - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/a_text_purpose.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/a_text_purpose.html new file mode 100644 index 000000000..91669b4be --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/a_text_purpose.html @@ -0,0 +1,108 @@ + + + + a_text_purpose - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/applet_alt_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/applet_alt_exists.html new file mode 100644 index 000000000..c3d9286cb --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/applet_alt_exists.html @@ -0,0 +1,103 @@ + + + + applet_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/application_content_accessible.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/application_content_accessible.html new file mode 100644 index 000000000..a9677444a --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/application_content_accessible.html @@ -0,0 +1,97 @@ + + + + application_content_accessible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/area_alt_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/area_alt_exists.html new file mode 100644 index 000000000..37ae2cbbf --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/area_alt_exists.html @@ -0,0 +1,101 @@ + + + + area_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_accessiblename_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_accessiblename_exists.html new file mode 100644 index 000000000..91335faae --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_accessiblename_exists.html @@ -0,0 +1,112 @@ + + + + aria_accessiblename_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_activedescendant_tabindex_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_activedescendant_tabindex_valid.html new file mode 100644 index 000000000..2bee6008d --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_activedescendant_tabindex_valid.html @@ -0,0 +1,107 @@ + + + + aria_activedescendant_tabindex_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_activedescendant_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_activedescendant_valid.html new file mode 100644 index 000000000..532651e4f --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_activedescendant_valid.html @@ -0,0 +1,103 @@ + + + + aria_activedescendant_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_application_label_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_application_label_unique.html new file mode 100644 index 000000000..67d10ec6d --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_application_label_unique.html @@ -0,0 +1,103 @@ + + + + aria_application_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_application_labelled.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_application_labelled.html new file mode 100644 index 000000000..171f230f3 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_application_labelled.html @@ -0,0 +1,100 @@ + + + + aria_application_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_article_label_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_article_label_unique.html new file mode 100644 index 000000000..bf8a3d43d --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_article_label_unique.html @@ -0,0 +1,104 @@ + + + + aria_article_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_allowed.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_allowed.html new file mode 100644 index 000000000..79912adaf --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_allowed.html @@ -0,0 +1,97 @@ + + + + aria_attribute_allowed - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_conflict.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_conflict.html new file mode 100644 index 000000000..092e293ab --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_conflict.html @@ -0,0 +1,109 @@ + + + + aria_attribute_conflict - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_deprecated.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_deprecated.html new file mode 100644 index 000000000..5887d4224 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_deprecated.html @@ -0,0 +1,103 @@ + + + + aria_attribute_deprecated - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_exists.html new file mode 100644 index 000000000..f2b4e6257 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_exists.html @@ -0,0 +1,93 @@ + + + + aria_attribute_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_redundant.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_redundant.html new file mode 100644 index 000000000..226b11a32 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_redundant.html @@ -0,0 +1,98 @@ + + + + aria_attribute_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_required.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_required.html new file mode 100644 index 000000000..377b82900 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_required.html @@ -0,0 +1,106 @@ + + + + aria_attribute_required - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_valid.html new file mode 100644 index 000000000..7cd3f832f --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_valid.html @@ -0,0 +1,102 @@ + + + + aria_attribute_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + + +
+
+
+ + \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_value_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_value_valid.html new file mode 100644 index 000000000..8fd74f9af --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_attribute_value_valid.html @@ -0,0 +1,94 @@ + + + + aria_attribute_value_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_banner_label_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_banner_label_unique.html new file mode 100644 index 000000000..3a484f85d --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_banner_label_unique.html @@ -0,0 +1,104 @@ + + + + aria_banner_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_banner_single.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_banner_single.html new file mode 100644 index 000000000..bb68f82c8 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_banner_single.html @@ -0,0 +1,98 @@ + + + + aria_banner_single - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_child_tabbable.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_child_tabbable.html new file mode 100644 index 000000000..2a0c5e3e4 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_child_tabbable.html @@ -0,0 +1,98 @@ + + + + aria_child_tabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_child_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_child_valid.html new file mode 100644 index 000000000..48b81fffa --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_child_valid.html @@ -0,0 +1,121 @@ + + + + aria_child_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_complementary_label_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_complementary_label_unique.html new file mode 100644 index 000000000..87070a0bb --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_complementary_label_unique.html @@ -0,0 +1,103 @@ + + + + aria_complementary_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_complementary_label_visible.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_complementary_label_visible.html new file mode 100644 index 000000000..73bd67c37 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_complementary_label_visible.html @@ -0,0 +1,100 @@ + + + + aria_complementary_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_complementary_labelled.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_complementary_labelled.html new file mode 100644 index 000000000..cd1390031 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_complementary_labelled.html @@ -0,0 +1,100 @@ + + + + aria_complementary_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_content_in_landmark.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_content_in_landmark.html new file mode 100644 index 000000000..0374df352 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_content_in_landmark.html @@ -0,0 +1,91 @@ + + + + aria_content_in_landmark - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_contentinfo_label_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_contentinfo_label_unique.html new file mode 100644 index 000000000..5341e0311 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_contentinfo_label_unique.html @@ -0,0 +1,104 @@ + + + + aria_contentinfo_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_contentinfo_misuse.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_contentinfo_misuse.html new file mode 100644 index 000000000..ba6718bf6 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_contentinfo_misuse.html @@ -0,0 +1,105 @@ + + + + aria_contentinfo_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_contentinfo_single.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_contentinfo_single.html new file mode 100644 index 000000000..6aeb1034a --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_contentinfo_single.html @@ -0,0 +1,100 @@ + + + + aria_contentinfo_single - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_descendant_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_descendant_valid.html new file mode 100644 index 000000000..097af8984 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_descendant_valid.html @@ -0,0 +1,101 @@ + + + + aria_descendant_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_document_label_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_document_label_unique.html new file mode 100644 index 000000000..0722eb544 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_document_label_unique.html @@ -0,0 +1,91 @@ + + + + aria_document_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_eventhandler_role_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_eventhandler_role_valid.html new file mode 100644 index 000000000..7ee73775f --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_eventhandler_role_valid.html @@ -0,0 +1,92 @@ + + + + aria_eventhandler_role_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_form_label_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_form_label_unique.html new file mode 100644 index 000000000..f607ba24c --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_form_label_unique.html @@ -0,0 +1,112 @@ + + + + aria_form_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_graphic_labelled.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_graphic_labelled.html new file mode 100644 index 000000000..b7351e445 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_graphic_labelled.html @@ -0,0 +1,99 @@ + + + + aria_graphic_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_hidden_nontabbable.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_hidden_nontabbable.html new file mode 100644 index 000000000..400c4fb13 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_hidden_nontabbable.html @@ -0,0 +1,113 @@ + + + + aria_hidden_nontabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_id_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_id_unique.html new file mode 100644 index 000000000..b297b7d37 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_id_unique.html @@ -0,0 +1,98 @@ + + + + aria_id_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_img_labelled.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_img_labelled.html new file mode 100644 index 000000000..fa71286d5 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_img_labelled.html @@ -0,0 +1,100 @@ + + + + aria_img_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_keyboard_handler_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_keyboard_handler_exists.html new file mode 100644 index 000000000..e3a218788 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_keyboard_handler_exists.html @@ -0,0 +1,103 @@ + + + + aria_keyboard_handler_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_landmark_name_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_landmark_name_unique.html new file mode 100644 index 000000000..653a54a1a --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_landmark_name_unique.html @@ -0,0 +1,110 @@ + + + + aria_landmark_name_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_main_label_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_main_label_unique.html new file mode 100644 index 000000000..2bb38d716 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_main_label_unique.html @@ -0,0 +1,111 @@ + + + + aria_main_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_main_label_visible.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_main_label_visible.html new file mode 100644 index 000000000..53a3d8383 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_main_label_visible.html @@ -0,0 +1,102 @@ + + + + aria_main_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_navigation_label_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_navigation_label_unique.html new file mode 100644 index 000000000..237c3a36d --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_navigation_label_unique.html @@ -0,0 +1,106 @@ + + + + aria_navigation_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_parent_required.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_parent_required.html new file mode 100644 index 000000000..dc9f9721b --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_parent_required.html @@ -0,0 +1,98 @@ + + + + aria_parent_required - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_region_label_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_region_label_unique.html new file mode 100644 index 000000000..37b85a946 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_region_label_unique.html @@ -0,0 +1,102 @@ + + + + aria_region_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_region_labelled.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_region_labelled.html new file mode 100644 index 000000000..c30526a1d --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_region_labelled.html @@ -0,0 +1,102 @@ + + + + aria_region_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_role_allowed.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_role_allowed.html new file mode 100644 index 000000000..0509df7a1 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_role_allowed.html @@ -0,0 +1,105 @@ + + + + aria_role_allowed - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_role_redundant.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_role_redundant.html new file mode 100644 index 000000000..b17cb4d39 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_role_redundant.html @@ -0,0 +1,107 @@ + + + + aria_role_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_role_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_role_valid.html new file mode 100644 index 000000000..31ad6442a --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_role_valid.html @@ -0,0 +1,90 @@ + + + + aria_role_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_search_label_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_search_label_unique.html new file mode 100644 index 000000000..02979c267 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_search_label_unique.html @@ -0,0 +1,100 @@ + + + + aria_search_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_toolbar_label_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_toolbar_label_unique.html new file mode 100644 index 000000000..af0b1f253 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_toolbar_label_unique.html @@ -0,0 +1,102 @@ + + + + aria_toolbar_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_widget_labelled.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_widget_labelled.html new file mode 100644 index 000000000..7a051f8b6 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/aria_widget_labelled.html @@ -0,0 +1,102 @@ + + + + aria_widget_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/asciiart_alt_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/asciiart_alt_exists.html new file mode 100644 index 000000000..c7f4f07db --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/asciiart_alt_exists.html @@ -0,0 +1,91 @@ + + + + asciiart_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/blink_css_review.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/blink_css_review.html new file mode 100644 index 000000000..2cc08e8e1 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/blink_css_review.html @@ -0,0 +1,94 @@ + + + + blink_css_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/blink_elem_deprecated.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/blink_elem_deprecated.html new file mode 100644 index 000000000..cdcdc906b --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/blink_elem_deprecated.html @@ -0,0 +1,94 @@ + + + + blink_elem_deprecated - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/blockquote_cite_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/blockquote_cite_exists.html new file mode 100644 index 000000000..a583f938a --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/blockquote_cite_exists.html @@ -0,0 +1,91 @@ + + + + blockquote_cite_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/canvas_content_described.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/canvas_content_described.html new file mode 100644 index 000000000..df4b31924 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/canvas_content_described.html @@ -0,0 +1,115 @@ + + + + canvas_content_described - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/caption_track_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/caption_track_exists.html new file mode 100644 index 000000000..108a60628 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/caption_track_exists.html @@ -0,0 +1,100 @@ + + + + caption_track_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_active_descendant.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_active_descendant.html new file mode 100644 index 000000000..2d5d32179 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_active_descendant.html @@ -0,0 +1,109 @@ + + + + combobox_active_descendant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_autocomplete_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_autocomplete_valid.html new file mode 100644 index 000000000..23e35fa1e --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_autocomplete_valid.html @@ -0,0 +1,136 @@ + + + + combobox_autocomplete_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_design_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_design_valid.html new file mode 100644 index 000000000..e8dd1934a --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_design_valid.html @@ -0,0 +1,93 @@ + + + + combobox_design_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_focusable_elements.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_focusable_elements.html new file mode 100644 index 000000000..bc52cb3c0 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_focusable_elements.html @@ -0,0 +1,92 @@ + + + + combobox_focusable_elements - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_haspopup_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_haspopup_valid.html new file mode 100644 index 000000000..dc7ade53a --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_haspopup_valid.html @@ -0,0 +1,107 @@ + + + + combobox_haspopup_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_popup_reference.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_popup_reference.html new file mode 100644 index 000000000..6e177bda2 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/combobox_popup_reference.html @@ -0,0 +1,109 @@ + + + + combobox_popup_reference - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/dir_attribute_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/dir_attribute_valid.html new file mode 100644 index 000000000..0d0c62e22 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/dir_attribute_valid.html @@ -0,0 +1,89 @@ + + + + dir_attribute_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/download_keyboard_controllable.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/download_keyboard_controllable.html new file mode 100644 index 000000000..ab67dc93d --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/download_keyboard_controllable.html @@ -0,0 +1,92 @@ + + + + download_keyboard_controllable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/draggable_alternative_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/draggable_alternative_exists.html new file mode 100644 index 000000000..86df2dd70 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/draggable_alternative_exists.html @@ -0,0 +1,105 @@ + + + + draggable_alternative_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/element_accesskey_labelled.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_accesskey_labelled.html new file mode 100644 index 000000000..f73590225 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_accesskey_labelled.html @@ -0,0 +1,97 @@ + + + + element_accesskey_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/element_accesskey_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_accesskey_unique.html new file mode 100644 index 000000000..a47bd9c16 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_accesskey_unique.html @@ -0,0 +1,100 @@ + + + + element_accesskey_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/element_attribute_deprecated.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_attribute_deprecated.html new file mode 100644 index 000000000..7c456299c --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_attribute_deprecated.html @@ -0,0 +1,103 @@ + + + + element_attribute_deprecated - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/element_id_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_id_unique.html new file mode 100644 index 000000000..419e18bf9 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_id_unique.html @@ -0,0 +1,102 @@ + + + + element_id_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/element_lang_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_lang_valid.html new file mode 100644 index 000000000..a58981480 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_lang_valid.html @@ -0,0 +1,108 @@ + + + + element_lang_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/element_mouseevent_keyboard.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_mouseevent_keyboard.html new file mode 100644 index 000000000..35f557732 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_mouseevent_keyboard.html @@ -0,0 +1,102 @@ + + + + element_mouseevent_keyboard - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/element_orientation_unlocked.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_orientation_unlocked.html new file mode 100644 index 000000000..e31347201 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_orientation_unlocked.html @@ -0,0 +1,112 @@ + + + + element_orientation_unlocked - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/element_scrollable_tabbable.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_scrollable_tabbable.html new file mode 100644 index 000000000..6cadc4110 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_scrollable_tabbable.html @@ -0,0 +1,115 @@ + + + + element_scrollable_tabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/element_tabbable_role_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_tabbable_role_valid.html new file mode 100644 index 000000000..13c9394b3 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_tabbable_role_valid.html @@ -0,0 +1,136 @@ + + + + element_tabbable_role_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/element_tabbable_unobscured.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_tabbable_unobscured.html new file mode 100644 index 000000000..06dd1fee0 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_tabbable_unobscured.html @@ -0,0 +1,103 @@ + + + + element_tabbable_unobscured - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/element_tabbable_visible.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_tabbable_visible.html new file mode 100644 index 000000000..260f1eee1 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/element_tabbable_visible.html @@ -0,0 +1,124 @@ + + + + element_tabbable_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/embed_alt_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/embed_alt_exists.html new file mode 100644 index 000000000..64eb4a692 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/embed_alt_exists.html @@ -0,0 +1,95 @@ + + + + embed_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/emoticons_alt_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/emoticons_alt_exists.html new file mode 100644 index 000000000..648457296 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/emoticons_alt_exists.html @@ -0,0 +1,91 @@ + + + + emoticons_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/error_message_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/error_message_exists.html new file mode 100644 index 000000000..157fb4474 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/error_message_exists.html @@ -0,0 +1,105 @@ + + + + error_message_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/fieldset_label_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/fieldset_label_valid.html new file mode 100644 index 000000000..5ea22a1e3 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/fieldset_label_valid.html @@ -0,0 +1,106 @@ + + + + fieldset_label_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/fieldset_legend_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/fieldset_legend_valid.html new file mode 100644 index 000000000..ca83ceae1 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/fieldset_legend_valid.html @@ -0,0 +1,101 @@ + + + + fieldset_legend_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/figure_label_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/figure_label_exists.html new file mode 100644 index 000000000..1322013a4 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/figure_label_exists.html @@ -0,0 +1,104 @@ + + + + figure_label_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/form_font_color.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/form_font_color.html new file mode 100644 index 000000000..071711881 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/form_font_color.html @@ -0,0 +1,90 @@ + + + + form_font_color - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/form_interaction_review.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/form_interaction_review.html new file mode 100644 index 000000000..551294685 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/form_interaction_review.html @@ -0,0 +1,92 @@ + + + + form_interaction_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/form_label_unique.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/form_label_unique.html new file mode 100644 index 000000000..ad8738f1c --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/form_label_unique.html @@ -0,0 +1,90 @@ + + + + form_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/form_submit_button_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/form_submit_button_exists.html new file mode 100644 index 000000000..7f44da6ff --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/form_submit_button_exists.html @@ -0,0 +1,92 @@ + + + + form_submit_button_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/form_submit_review.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/form_submit_review.html new file mode 100644 index 000000000..f5d87ee31 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/form_submit_review.html @@ -0,0 +1,93 @@ + + + + form_submit_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/frame_src_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/frame_src_valid.html new file mode 100644 index 000000000..73c1f1883 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/frame_src_valid.html @@ -0,0 +1,95 @@ + + + + frame_src_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/frame_title_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/frame_title_exists.html new file mode 100644 index 000000000..fe0bb7a13 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/frame_title_exists.html @@ -0,0 +1,99 @@ + + + + frame_title_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/heading_content_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/heading_content_exists.html new file mode 100644 index 000000000..411805214 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/heading_content_exists.html @@ -0,0 +1,89 @@ + + + + heading_content_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/heading_markup_misuse.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/heading_markup_misuse.html new file mode 100644 index 000000000..6a17c06a1 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/heading_markup_misuse.html @@ -0,0 +1,92 @@ + + + + heading_markup_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/html_lang_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/html_lang_exists.html new file mode 100644 index 000000000..0f7c9a4e0 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/html_lang_exists.html @@ -0,0 +1,92 @@ + + + + html_lang_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/html_lang_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/html_lang_valid.html new file mode 100644 index 000000000..3a7da2fb6 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/html_lang_valid.html @@ -0,0 +1,111 @@ + + + + html_lang_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/html_skipnav_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/html_skipnav_exists.html new file mode 100644 index 000000000..c39face20 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/html_skipnav_exists.html @@ -0,0 +1,91 @@ + + + + html_skipnav_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/iframe_interactive_tabbable.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/iframe_interactive_tabbable.html new file mode 100644 index 000000000..d38a34621 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/iframe_interactive_tabbable.html @@ -0,0 +1,105 @@ + + + + iframe_interactive_tabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/imagebutton_alt_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/imagebutton_alt_exists.html new file mode 100644 index 000000000..5b560098e --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/imagebutton_alt_exists.html @@ -0,0 +1,90 @@ + + + + imagebutton_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/imagemap_alt_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/imagemap_alt_exists.html new file mode 100644 index 000000000..4e9123086 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/imagemap_alt_exists.html @@ -0,0 +1,101 @@ + + + + imagemap_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_background.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_background.html new file mode 100644 index 000000000..79f373086 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_background.html @@ -0,0 +1,90 @@ + + + + img_alt_background - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_decorative.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_decorative.html new file mode 100644 index 000000000..3ce9d4ead --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_decorative.html @@ -0,0 +1,93 @@ + + + + img_alt_decorative - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_misuse.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_misuse.html new file mode 100644 index 000000000..e66601164 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_misuse.html @@ -0,0 +1,91 @@ + + + + img_alt_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_null.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_null.html new file mode 100644 index 000000000..6fd478c3b --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_null.html @@ -0,0 +1,94 @@ + + + + img_alt_null - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_redundant.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_redundant.html new file mode 100644 index 000000000..ce20e884e --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_redundant.html @@ -0,0 +1,94 @@ + + + + img_alt_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_valid.html new file mode 100644 index 000000000..e8a17581d --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_alt_valid.html @@ -0,0 +1,99 @@ + + + + img_alt_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/img_ismap_misuse.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_ismap_misuse.html new file mode 100644 index 000000000..4e10850a2 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_ismap_misuse.html @@ -0,0 +1,91 @@ + + + + img_ismap_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/img_longdesc_misuse.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_longdesc_misuse.html new file mode 100644 index 000000000..67798f054 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/img_longdesc_misuse.html @@ -0,0 +1,98 @@ + + + + img_longdesc_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/input_autocomplete_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_autocomplete_valid.html new file mode 100644 index 000000000..fc7a23d5a --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_autocomplete_valid.html @@ -0,0 +1,121 @@ + + + + input_autocomplete_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/input_checkboxes_grouped.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_checkboxes_grouped.html new file mode 100644 index 000000000..0380a2aa0 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_checkboxes_grouped.html @@ -0,0 +1,90 @@ + + + + input_checkboxes_grouped - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/input_fields_grouped.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_fields_grouped.html new file mode 100644 index 000000000..8acfd687e --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_fields_grouped.html @@ -0,0 +1,104 @@ + + + + input_fields_grouped - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/input_haspopup_conflict.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_haspopup_conflict.html new file mode 100644 index 000000000..5b71da3aa --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_haspopup_conflict.html @@ -0,0 +1,120 @@ + + + + input_haspopup_conflict - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/input_label_after.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_label_after.html new file mode 100644 index 000000000..a9cae3354 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_label_after.html @@ -0,0 +1,98 @@ + + + + input_label_after - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/input_label_before.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_label_before.html new file mode 100644 index 000000000..296dddd18 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_label_before.html @@ -0,0 +1,99 @@ + + + + input_label_before - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/input_label_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_label_exists.html new file mode 100644 index 000000000..4b214ff47 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_label_exists.html @@ -0,0 +1,94 @@ + + + + input_label_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/input_label_visible.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_label_visible.html new file mode 100644 index 000000000..add9d07ac --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_label_visible.html @@ -0,0 +1,128 @@ + + + + input_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/input_onchange_review.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_onchange_review.html new file mode 100644 index 000000000..f4f544104 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_onchange_review.html @@ -0,0 +1,103 @@ + + + + input_onchange_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/input_placeholder_label_visible.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_placeholder_label_visible.html new file mode 100644 index 000000000..ad52cc5f2 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/input_placeholder_label_visible.html @@ -0,0 +1,107 @@ + + + + input_placeholder_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/label_content_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/label_content_exists.html new file mode 100644 index 000000000..128523c7e --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/label_content_exists.html @@ -0,0 +1,90 @@ + + + + label_content_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/label_name_visible.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/label_name_visible.html new file mode 100644 index 000000000..265d1ebe3 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/label_name_visible.html @@ -0,0 +1,97 @@ + + + + label_name_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/label_ref_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/label_ref_valid.html new file mode 100644 index 000000000..b3b72276c --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/label_ref_valid.html @@ -0,0 +1,97 @@ + + + + label_ref_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/list_children_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/list_children_valid.html new file mode 100644 index 000000000..27f0732c8 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/list_children_valid.html @@ -0,0 +1,111 @@ + + + + list_children_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/list_markup_review.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/list_markup_review.html new file mode 100644 index 000000000..55ba2a2b7 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/list_markup_review.html @@ -0,0 +1,91 @@ + + + + list_markup_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/list_structure_proper.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/list_structure_proper.html new file mode 100644 index 000000000..3904f03b4 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/list_structure_proper.html @@ -0,0 +1,89 @@ + + + + list_structure_proper - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/marquee_elem_avoid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/marquee_elem_avoid.html new file mode 100644 index 000000000..b1b7173bd --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/marquee_elem_avoid.html @@ -0,0 +1,94 @@ + + + + marquee_elem_avoid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/media_alt_brief.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_alt_brief.html new file mode 100644 index 000000000..eff8ac5a0 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_alt_brief.html @@ -0,0 +1,111 @@ + + + + media_alt_brief - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/media_alt_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_alt_exists.html new file mode 100644 index 000000000..b132cba78 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_alt_exists.html @@ -0,0 +1,95 @@ + + + + media_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/media_audio_transcribed.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_audio_transcribed.html new file mode 100644 index 000000000..b17a87a74 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_audio_transcribed.html @@ -0,0 +1,97 @@ + + + + media_audio_transcribed - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/media_autostart_controllable.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_autostart_controllable.html new file mode 100644 index 000000000..3286a581a --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_autostart_controllable.html @@ -0,0 +1,93 @@ + + + + media_autostart_controllable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/media_keyboard_controllable.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_keyboard_controllable.html new file mode 100644 index 000000000..fed317f4a --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_keyboard_controllable.html @@ -0,0 +1,111 @@ + + + + media_keyboard_controllable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/media_live_captioned.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_live_captioned.html new file mode 100644 index 000000000..62c0a2411 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_live_captioned.html @@ -0,0 +1,91 @@ + + + + media_live_captioned - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/media_track_available.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_track_available.html new file mode 100644 index 000000000..d2986ba11 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/media_track_available.html @@ -0,0 +1,96 @@ + + + + media_track_available - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/meta_redirect_optional.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/meta_redirect_optional.html new file mode 100644 index 000000000..480bffc3b --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/meta_redirect_optional.html @@ -0,0 +1,94 @@ + + + + meta_redirect_optional - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/meta_refresh_delay.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/meta_refresh_delay.html new file mode 100644 index 000000000..be777ca26 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/meta_refresh_delay.html @@ -0,0 +1,95 @@ + + + + meta_refresh_delay - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/meta_viewport_zoomable.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/meta_viewport_zoomable.html new file mode 100644 index 000000000..1841c2ce8 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/meta_viewport_zoomable.html @@ -0,0 +1,98 @@ + + + + meta_viewport_zoomable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/noembed_content_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/noembed_content_exists.html new file mode 100644 index 000000000..dbec45fac --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/noembed_content_exists.html @@ -0,0 +1,100 @@ + + + + noembed_content_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/object_text_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/object_text_exists.html new file mode 100644 index 000000000..99d9a4eab --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/object_text_exists.html @@ -0,0 +1,101 @@ + + + + object_text_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/page_title_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/page_title_exists.html new file mode 100644 index 000000000..e8e7a05db --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/page_title_exists.html @@ -0,0 +1,103 @@ + + + + page_title_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/page_title_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/page_title_valid.html new file mode 100644 index 000000000..c558a524d --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/page_title_valid.html @@ -0,0 +1,105 @@ + + + + page_title_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/script_focus_blur_review.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/script_focus_blur_review.html new file mode 100644 index 000000000..5bf2a1b50 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/script_focus_blur_review.html @@ -0,0 +1,96 @@ + + + + script_focus_blur_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/script_onclick_avoid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/script_onclick_avoid.html new file mode 100644 index 000000000..adc8057f8 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/script_onclick_avoid.html @@ -0,0 +1,92 @@ + + + + script_onclick_avoid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/script_onclick_misuse.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/script_onclick_misuse.html new file mode 100644 index 000000000..1054a86dc --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/script_onclick_misuse.html @@ -0,0 +1,92 @@ + + + + script_onclick_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/script_select_review.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/script_select_review.html new file mode 100644 index 000000000..d5a32f1cf --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/script_select_review.html @@ -0,0 +1,97 @@ + + + + script_select_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/select_options_grouped.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/select_options_grouped.html new file mode 100644 index 000000000..055daa7fe --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/select_options_grouped.html @@ -0,0 +1,90 @@ + + + + select_options_grouped - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/skip_main_described.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/skip_main_described.html new file mode 100644 index 000000000..9e1fd3d48 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/skip_main_described.html @@ -0,0 +1,100 @@ + + + + skip_main_described - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/skip_main_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/skip_main_exists.html new file mode 100644 index 000000000..489966282 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/skip_main_exists.html @@ -0,0 +1,103 @@ + + + + skip_main_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/style_background_decorative.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_background_decorative.html new file mode 100644 index 000000000..d10e6c9e2 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_background_decorative.html @@ -0,0 +1,93 @@ + + + + style_background_decorative - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/style_before_after_review.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_before_after_review.html new file mode 100644 index 000000000..d8b93d13f --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_before_after_review.html @@ -0,0 +1,95 @@ + + + + style_before_after_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/style_color_misuse.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_color_misuse.html new file mode 100644 index 000000000..0db3f77df --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_color_misuse.html @@ -0,0 +1,89 @@ + + + + style_color_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/style_focus_visible.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_focus_visible.html new file mode 100644 index 000000000..c3524f860 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_focus_visible.html @@ -0,0 +1,97 @@ + + + + style_focus_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/style_highcontrast_visible.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_highcontrast_visible.html new file mode 100644 index 000000000..f50b54b71 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_highcontrast_visible.html @@ -0,0 +1,100 @@ + + + + style_highcontrast_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/style_hover_persistent.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_hover_persistent.html new file mode 100644 index 000000000..9b7cb2b4e --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_hover_persistent.html @@ -0,0 +1,118 @@ + + + + style_hover_persistent - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/style_viewport_resizable.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_viewport_resizable.html new file mode 100644 index 000000000..72117898a --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/style_viewport_resizable.html @@ -0,0 +1,93 @@ + + + + style_viewport_resizable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/svg_graphics_labelled.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/svg_graphics_labelled.html new file mode 100644 index 000000000..7afea1f95 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/svg_graphics_labelled.html @@ -0,0 +1,127 @@ + + + + svg_graphics_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/table_aria_descendants.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_aria_descendants.html new file mode 100644 index 000000000..cb8751c31 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_aria_descendants.html @@ -0,0 +1,110 @@ + + + + table_aria_descendants - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/table_caption_empty.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_caption_empty.html new file mode 100644 index 000000000..713b2cf85 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_caption_empty.html @@ -0,0 +1,101 @@ + + + + table_caption_empty - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/table_caption_nested.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_caption_nested.html new file mode 100644 index 000000000..70478360b --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_caption_nested.html @@ -0,0 +1,98 @@ + + + + table_caption_nested - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/table_headers_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_headers_exists.html new file mode 100644 index 000000000..d9c4e39d5 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_headers_exists.html @@ -0,0 +1,93 @@ + + + + table_headers_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/table_headers_ref_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_headers_ref_valid.html new file mode 100644 index 000000000..e0b6c59ef --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_headers_ref_valid.html @@ -0,0 +1,91 @@ + + + + table_headers_ref_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/table_headers_related.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_headers_related.html new file mode 100644 index 000000000..012da9f9f --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_headers_related.html @@ -0,0 +1,91 @@ + + + + table_headers_related - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/table_layout_linearized.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_layout_linearized.html new file mode 100644 index 000000000..e3d73e95b --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_layout_linearized.html @@ -0,0 +1,92 @@ + + + + table_layout_linearized - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/table_scope_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_scope_valid.html new file mode 100644 index 000000000..8d857bb37 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_scope_valid.html @@ -0,0 +1,93 @@ + + + + table_scope_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/table_structure_misuse.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_structure_misuse.html new file mode 100644 index 000000000..9e8ed1a47 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_structure_misuse.html @@ -0,0 +1,91 @@ + + + + table_structure_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/table_summary_redundant.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_summary_redundant.html new file mode 100644 index 000000000..996fd2293 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/table_summary_redundant.html @@ -0,0 +1,101 @@ + + + + table_summary_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/target_spacing_sufficient.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/target_spacing_sufficient.html new file mode 100644 index 000000000..4bc998691 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/target_spacing_sufficient.html @@ -0,0 +1,108 @@ + + + + target_spacing_sufficient - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/text_block_heading.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/text_block_heading.html new file mode 100644 index 000000000..0cbce0583 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/text_block_heading.html @@ -0,0 +1,92 @@ + + + + text_block_heading - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/text_contrast_sufficient.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/text_contrast_sufficient.html new file mode 100644 index 000000000..d28530a22 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/text_contrast_sufficient.html @@ -0,0 +1,92 @@ + + + + text_contrast_sufficient - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/text_quoted_correctly.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/text_quoted_correctly.html new file mode 100644 index 000000000..2e998e14f --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/text_quoted_correctly.html @@ -0,0 +1,106 @@ + + + + text_quoted_correctly - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/text_sensory_misuse.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/text_sensory_misuse.html new file mode 100644 index 000000000..5ad0f3cd1 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/text_sensory_misuse.html @@ -0,0 +1,96 @@ + + + + text_sensory_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/text_spacing_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/text_spacing_valid.html new file mode 100644 index 000000000..8cb7ed469 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/text_spacing_valid.html @@ -0,0 +1,103 @@ + + + + text_spacing_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/text_whitespace_valid.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/text_whitespace_valid.html new file mode 100644 index 000000000..a3ffc456d --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/text_whitespace_valid.html @@ -0,0 +1,93 @@ + + + + text_whitespace_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/widget_tabbable_exists.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/widget_tabbable_exists.html new file mode 100644 index 000000000..6008a6134 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/widget_tabbable_exists.html @@ -0,0 +1,98 @@ + + + + widget_tabbable_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/en-US/widget_tabbable_single.html b/rule-server/src/static/archives/2026.09.02/doc/en-US/widget_tabbable_single.html new file mode 100644 index 000000000..52987aa4c --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/en-US/widget_tabbable_single.html @@ -0,0 +1,96 @@ + + + + widget_tabbable_single - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.09.02/doc/rules.csv b/rule-server/src/static/archives/2026.09.02/doc/rules.csv new file mode 100644 index 000000000..4f189025e --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/rules.csv @@ -0,0 +1,434 @@ +Rule ID, Reason Code, Rule message, Reason message, Violation Level, Toolkit Level, WCAG Requirements, ACT mapping +"applet_alt_exists","Pass_0"," elements must provide an 'alt' attribute and an alternative description","Rule Passed","Pass","1","1.1.1","" +"applet_alt_exists","Fail_1"," elements must provide an 'alt' attribute and an alternative description","An element does not have an 'alt' attribute that provides a short text alternative","Violation","1","1.1.1","" +"applet_alt_exists","Fail_2"," elements must provide an 'alt' attribute and an alternative description","The 'alt' attribute value for an element duplicates the 'code' attribute","Violation","1","1.1.1","" +"applet_alt_exists","Fail_3"," elements must provide an 'alt' attribute and an alternative description","An element provides alternative text, but does not provide inner content","Violation","1","1.1.1","" +"img_alt_redundant","Pass_0","The text alternative for an image within a link should not repeat the link text or adjacent link text","Rule Passed","Pass","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_1","The text alternative for an image within a link should not repeat the link text or adjacent link text","Link text is repeated in an image 'alt' value within the same link","Violation","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_2","The text alternative for an image within a link should not repeat the link text or adjacent link text","Link text of previous link is repeated in image 'alt' value of a link","Violation","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_3","The text alternative for an image within a link should not repeat the link text or adjacent link text","Image 'alt' value within a link is repeated in link text of the link after","Violation","2","1.1.1,2.4.4","" +"img_alt_valid","pass","Images must have accessible names unless they are decorative or redundant","The image has an accessible name or is correctly marked as decorative or redundant","Pass","1","1.1.1","23a2a8:pass" +"img_alt_valid","fail_blank_alt","Images must have accessible names unless they are decorative or redundant","Image 'alt' attribute value consists only of blank space(s)","Violation","1","1.1.1","23a2a8:fail" +"img_alt_valid","fail_no_alt","Images must have accessible names unless they are decorative or redundant","The image has neither an accessible name nor is marked as decorative or redundant","Violation","1","1.1.1","23a2a8:fail" +"img_alt_valid","fail_blank_title","Images must have accessible names unless they are decorative or redundant","The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)","Violation","1","1.1.1","23a2a8:fail" +"imagebutton_alt_exists","Pass_0","The element of type ""image"" should have a text alternative","Image button provides alternative text using the 'alt' attribute","Pass","1","1.1.1","59796f:pass" +"imagebutton_alt_exists","Pass_1","The element of type ""image"" should have a text alternative","Image button provides alternative text using an ARIA label","Pass","1","1.1.1","59796f:pass" +"imagebutton_alt_exists","Pass_2","The element of type ""image"" should have a text alternative","Image button provides alternative text using the 'title' attribute","Pass","1","1.1.1","59796f:pass" +"imagebutton_alt_exists","Fail","The element of type ""image"" should have a text alternative","The element of type ""image"" has no text alternative","Violation","1","1.1.1","59796f:fail" +"area_alt_exists","Pass_0"," elements in an image map must have a text alternative","Rule Passed","Pass","1","1.1.1","" +"area_alt_exists","Fail_1"," elements in an image map must have a text alternative"," element in an image map has no text alternative","Violation","1","1.1.1","" +"imagemap_alt_exists","Pass_0","An image map and each element in an image map must have text alternative(s)","Rule Passed","Pass","1","1.1.1","" +"imagemap_alt_exists","Fail_1","An image map and each element in an image map must have text alternative(s)","Image map or child has no text alternative","Violation","1","1.1.1","" +"img_alt_decorative","Pass_0","Image designated as decorative must have 'alt=""""","Rule Passed","Pass","1","1.1.1","" +"img_alt_decorative","Fail_1","Image designated as decorative must have 'alt=""""","Image designated as decorative has non-null 'alt' attribute","Violation","1","1.1.1","" +"object_text_exists","pass"," element must have a text alternative for the content rendered by the object"," element has a text alternative","Pass","1","1.1.1","8fc3b6:pass" +"object_text_exists","fail_no_text_alternative"," element must have a text alternative for the content rendered by the object","An element does not have a text alternative","Violation","1","1.1.1","8fc3b6:fail" +"svg_graphics_labelled","pass","A non-decorative SVG element must have an accessible name","The SVG element has an accessible name","Pass","1","1.1.1","7d6734:pass" +"svg_graphics_labelled","fail_acc_name","A non-decorative SVG element must have an accessible name","The SVG element has no accessible name","Violation","1","1.1.1","7d6734:fail" +"img_alt_null","fail_decorative","When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used","The image 'alt' attribute is empty, but the 'title' attribute is not empty","Violation | Violation","1 | 1","1.1.1 | ARIA","" +"application_content_accessible","Pass_0","Non-decorative static text and image content within an element with ""application"" role must be accessible","Rule Passed","Pass","1","1.1.1,2.1.1","" +"application_content_accessible","Potential_1","Non-decorative static text and image content within an element with ""application"" role must be accessible","Verify that the non-decorative static text and image content within an element with ""application"" role are accessible","Violation Potential","1","1.1.1,2.1.1","" +"img_alt_misuse","Pass_0","'alt' attribute value must be a good inline replacement for the image","Rule Passed","Pass","1","1.1.1","" +"img_alt_misuse","Potential_1","'alt' attribute value must be a good inline replacement for the image","Verify that the file name serves as a good inline replacement for the image","Violation Potential","1","1.1.1","" +"img_ismap_misuse","Pass_0","Server-side image map hot-spots must have duplicate text links","Rule Passed","Pass","2","1.1.1","" +"img_ismap_misuse","Potential_1","Server-side image map hot-spots must have duplicate text links","Server-side image map hot-spots do not have duplicate text links","Violation Potential","2","1.1.1","" +"img_longdesc_misuse","Pass_0"," The 'longdesc' attribute must reference HTML content","Rule Passed","Pass","1","1.1.1","" +"img_longdesc_misuse","Potential_1"," The 'longdesc' attribute must reference HTML content","Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)","Violation Potential","1","1.1.1","" +"media_alt_exists","Pass_0","Audio or video on the page must have a short text alternative that describes the media content","Rule Passed","Pass","2","1.1.1","" +"media_alt_exists","Potential_1","Audio or video on the page must have a short text alternative that describes the media content","Filename used as label for embedded audio or video","Violation Potential","2","1.1.1","" +"style_background_decorative","Pass_0","Images included by using CSS alone must not convey important information","Rule Passed","Pass","1","1.1.1","" +"style_background_decorative","Potential_1","Images included by using CSS alone must not convey important information","Verify the CSS background image does not convey important information","Violation Potential","1","1.1.1","" +"style_highcontrast_visible","Pass_0","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Rule Passed","Pass | Pass","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"style_highcontrast_visible","Manual_1","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content","Violation Manual | Rec Manual","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"figure_label_exists","Pass_0","A
element must have an associated label","Rule Passed","Pass","3","1.1.1","" +"figure_label_exists","Fail_1","A
element must have an associated label","The
element does not have an associated label","Rec","3","1.1.1","" +"embed_alt_exists","Pass_0","Provide alternative content for elements","Rule Passed","Pass","4","1.1.1","" +"embed_alt_exists","Potential_1","Provide alternative content for elements","Verify that the element has alternative content","Rec Potential","4","1.1.1","" +"media_alt_brief","Pass_0","Alternative text in 'alt' attribute should be brief (<150 characters)","Rule Passed","Pass","2","1.1.1","" +"media_alt_brief","Potential_1","Alternative text in 'alt' attribute should be brief (<150 characters)","Text alternative is more than 150 characters","Rec Potential","2","1.1.1","" +"noembed_content_exists","Pass_0"," elements should contain descriptive text","Rule Passed","Pass","4","1.1.1","" +"noembed_content_exists","Potential_1","<noembed> elements should contain descriptive text","Add descriptive text to the <noembed> element","Rec Potential","4","1.1.1","" +"canvas_content_described","Pass_0","The <canvas> element may not be accessible","Rule Passed","Pass","3","1.1.1,2.1.1,4.1.2","" +"canvas_content_described","Manual_1","The <canvas> element may not be accessible","Verify accessibility of the <canvas> element","Rec Manual","3","1.1.1,2.1.1,4.1.2","" +"img_alt_background","Pass_0","Background images that convey important information must have a text alternative that describes the image","Rule Passed","Pass","2","1.1.1","" +"img_alt_background","Manual_1","Background images that convey important information must have a text alternative that describes the image","Verify important background image information has a text alternative in system high contrast mode","Rec Manual","2","1.1.1","" +"media_audio_transcribed","Manual_1","Audio information should also be available in text form","Provide transcripts for audio files","Rec Manual","3","1.2.1","" +"caption_track_exists","Pass_0","A <video> element must have a text alternative for any meaningful audio content","Rule Passed","Pass","1","1.2.2","" +"caption_track_exists","Potential_1","A <video> element must have a text alternative for any meaningful audio content","Verify that captions are available for any meaningful audio or provide a caption track for the <video> element","Violation Potential","1","1.2.2","" +"media_track_available","Manual_1","Pre-recorded media should have an audio track that describes visual information","Verify availability of a user-selectable audio track with description of visual content","Rec Manual","3","1.2.3,1.2.5","" +"media_live_captioned","Manual_1","Live media (streaming video with audio) should have captions for audio content","Verify captions are provided for live media (streaming video with audio)","Rec Manual","1","1.2.4","" +"media_track_available","Manual_1","Pre-recorded media should have an audio track that describes visual information","Verify availability of a user-selectable audio track with description of visual content","Rec Manual","3","1.2.3,1.2.5","" +"input_checkboxes_grouped","pass_lonenogroup","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} grouping not required for a control of this type","Pass","2","1.3.1","" +"input_checkboxes_grouped","pass_grouped","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input is grouped with other related controls with the same name","Pass","2","1.3.1","" +"input_checkboxes_grouped","pass_radiononame","Related sets of radio buttons or checkboxes should be programmatically grouped","Radio input is not grouped, but passes because it has no name to group with other radio inputs","Pass","2","1.3.1","" +"input_checkboxes_grouped","fail_controlnamemismatch","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input found that has the same name, ""{2}"" as a {1} input","Violation","2","1.3.1","" +"input_checkboxes_grouped","fail_notgroupedothergrouped","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input is not in the group with another {0} with the name ""{1}""","Violation","2","1.3.1","" +"input_checkboxes_grouped","fail_notgroupedothernotgrouped","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input and others with the name ""{1}"" are not grouped together","Violation","2","1.3.1","" +"input_checkboxes_grouped","fail_notsamegroup","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input is in a different group than another {0} with the name ""{1}""","Violation","2","1.3.1","" +"input_checkboxes_grouped","potential_lonecheckbox","Related sets of radio buttons or checkboxes should be programmatically grouped","Verify that this ungrouped checkbox input is not related to other checkboxes","Violation Potential","2","1.3.1","" +"input_checkboxes_grouped","potential_unnamedcheckbox","Related sets of radio buttons or checkboxes should be programmatically grouped","Verify that this un-named, ungrouped checkbox input is not related to other checkboxes","Violation Potential","2","1.3.1","" +"table_headers_ref_valid","Pass_0","The 'headers' attribute should refer to a valid cell in the same table","Rule Passed","Pass","2","1.3.1","a25f45:pass" +"table_headers_ref_valid","Fail_1","The 'headers' attribute should refer to a valid cell in the same table","The 'headers' attribute value ""{0}"" does not reference a valid 'id' in this document","Violation","2","1.3.1","a25f45:fail" +"table_headers_ref_valid","Fail_2","The 'headers' attribute should refer to a valid cell in the same table","The 'headers' attribute value ""{0}"" refers to itself","Violation","2","1.3.1","a25f45:fail" +"table_headers_ref_valid","Fail_3","The 'headers' attribute should refer to a valid cell in the same table","The 'headers' attribute value ""{0}"" does not refer to a cell in the same table","Violation","2","1.3.1","a25f45:fail" +"table_headers_ref_valid","Fail_4","The 'headers' attribute should refer to a valid cell in the same table","The 'headers' attribute value ""{0}"" does not refer to a cell indicated with <th> or a role of ""columnheader"" or ""rowheader""","Violation","2","1.3.1","a25f45:fail" +"fieldset_label_valid","Pass_1","Groups with nested inputs must have unique accessible name","Group/Fieldset ""{0}"" with an input has a unique name","Pass","3","1.3.1,3.3.2","" +"fieldset_label_valid","Fail_1","Groups with nested inputs must have unique accessible name","Group/Fieldset does not have an accessible name","Violation","3","1.3.1,3.3.2","" +"fieldset_label_valid","Fail_2","Groups with nested inputs must have unique accessible name","Group/Fieldset ""{0}"" has a duplicate name to another group","Violation","3","1.3.1,3.3.2","" +"table_scope_valid","Pass_0","Value for 'scope' attribute must be ""row"", ""col"", ""rowgroup"", or ""colgroup""","Rule Passed","Pass","2","1.3.1","" +"table_scope_valid","Fail_1","Value for 'scope' attribute must be ""row"", ""col"", ""rowgroup"", or ""colgroup""","Value provided is invalid for the 'scope' attribute","Violation","2","1.3.1","" +"table_scope_valid","Fail_2","Value for 'scope' attribute must be ""row"", ""col"", ""rowgroup"", or ""colgroup""","The 'scope' attribute should only be used on a <th> element","Violation","2","1.3.1","" +"aria_banner_label_unique","pass","Each element with ""banner"" role must have a unique label that describes its purpose","The element with ""banner"" role has a unique label that describes its purpose","Pass","3","1.3.1","" +"aria_banner_label_unique","fail_label_not_unique","Each element with ""banner"" role must have a unique label that describes its purpose","Multiple elements with ""banner"" role do not have unique labels","Violation","3","1.3.1","" +"aria_banner_single","Pass_0","A page, document, or application should only have one element with ""banner"" role","Rule Passed","Pass","3","1.3.1","" +"aria_banner_single","Fail_1","A page, document, or application should only have one element with ""banner"" role","Multiple elements with ""banner"" role found on the page","Violation","3","1.3.1","" +"aria_complementary_label_unique","pass","Each element with ""complementary"" role must have a unique label that describes its purpose","The element with ""complementary"" role has a unique label that describes its purpose","Pass","3","1.3.1","" +"aria_complementary_label_unique","fail_label_not_unique","Each element with ""complementary"" role must have a unique label that describes its purpose","Multiple elements with ""complementary"" role do not have unique labels","Violation","3","1.3.1","" +"aria_complementary_labelled","Pass_0","Each element with ""complementary"" role must have a label that describes its purpose","Rule Passed","Pass","3","1.3.1","" +"aria_complementary_labelled","Fail_1","Each element with ""complementary"" role must have a label that describes its purpose","Element with ""complementary"" role does not have a label","Violation","3","1.3.1","" +"aria_content_in_landmark","Pass_0","All content must reside within an element with a landmark role","Rule Passed","Pass | Pass","3 | 3","1.3.1 | 1.3.1","" +"aria_content_in_landmark","Fail_1","All content must reside within an element with a landmark role","Content is not within a landmark element","Violation | Rec","3 | 3","1.3.1 | 1.3.1","" +"aria_contentinfo_label_unique","pass","Each element with ""contentinfo"" role must have a unique label that describes its purpose","The element with ""contentinfo"" role has a unique label that describes its purpose","Pass","3","1.3.1","" +"aria_contentinfo_label_unique","fail_label_not_unique","Each element with ""contentinfo"" role must have a unique label that describes its purpose","Multiple elements with ""contentinfo"" role do not have unique labels","Violation","3","1.3.1","" +"aria_contentinfo_single","Pass_0","A page, document, or application should only have one element with ""contentinfo"" role","Rule Passed","Pass","3","1.3.1","" +"aria_contentinfo_single","Fail_1","A page, document, or application should only have one element with ""contentinfo"" role","Multiple elements with ""contentinfo"" role found on the page","Violation","3","1.3.1","" +"aria_form_label_unique","pass","Each element with ""form"" role must have a unique label that describes its purpose","The element with ""form"" role has a unique label that describes its purpose","Pass","3","1.3.1","" +"aria_form_label_unique","fail_label_not_unique","Each element with ""form"" role must have a unique label that describes its purpose","Multiple elements with ""form"" role do not have unique labels","Violation","3","1.3.1","" +"aria_hidden_nontabbable","Pass_0","A hidden element should not contain any tabbable elements","Rule Passed","Pass","2","1.3.1,4.1.2","6cfa84:pass" +"aria_hidden_nontabbable","Fail_1","A hidden element should not contain any tabbable elements","Element ""{0}"" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'","Violation","2","1.3.1,4.1.2","6cfa84:fail" +"aria_landmark_name_unique","pass","Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region","Multiple elements with ""{0}"" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'","Pass | Pass","3 | 3","1.3.1 | 1.3.1","" +"aria_landmark_name_unique","fail_label_not_unique","Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region","Multiple elements with ""{0}"" landmarks within the same parent region are not distinguished from one another because they have the same ""{1}"" label","Violation | Rec","3 | 3","1.3.1 | 1.3.1","" +"aria_main_label_unique","Pass_0","Each element with ""main"" role must have unique label that describes its purposes","Rule Passed","Pass","3","1.3.1","" +"aria_main_label_unique","Fail_1","Each element with ""main"" role must have unique label that describes its purposes","Multiple elements with ""main"" role do not have unique labels","Violation","3","1.3.1","" +"aria_navigation_label_unique","pass","Each element with ""navigation"" role must have a unique label that describes its purpose","The element with ""navigation"" role has a unique label that describes its purpose","Pass","3","1.3.1","" +"aria_navigation_label_unique","fail_label_not_unique","Each element with ""navigation"" role must have a unique label that describes its purpose","Multiple elements with ""navigation"" role do not have unique labels","Violation","3","1.3.1","" +"aria_parent_required","Pass_0","Each element with an implicit or explicit role must be contained within a valid element","Rule Passed","Pass","1","1.3.1","ff89c9:pass" +"aria_parent_required","Fail_1","Each element with an implicit or explicit role must be contained within a valid element","Element with ""{0}"" role is not contained in or owned by an element with one of the following roles: ""{1}""","Violation","1","1.3.1","ff89c9:fail" +"aria_region_label_unique","pass","Each element with ""region"" role must have a unique label that describes its purpose","The element with ""region"" role has a unique label that describes its purpose","Pass","3","1.3.1","" +"aria_region_label_unique","fail_label_not_unique","Each element with ""region"" role must have a unique label that describes its purpose","Multiple elements with ""region"" role do not have unique labels","Violation","3","1.3.1","" +"aria_region_labelled","Pass_0","Each element with ""region"" role must have a label that describes its purpose","Rule Passed","Pass","3","1.3.1","" +"aria_region_labelled","Fail_1","Each element with ""region"" role must have a label that describes its purpose","Element with ""region"" role does not have a label","Violation","3","1.3.1","" +"form_label_unique","Pass_0","Form controls should have exactly one label","Rule Passed","Pass","1","1.3.1","" +"form_label_unique","Fail_1","Form controls should have exactly one label","Form control has more than one label","Violation","1","1.3.1","" +"label_ref_valid","pass","The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element","The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element","Pass","1","1.3.1","" +"label_ref_valid","fail_invalid","The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element","The value ""{0}"" of the 'for' attribute is not the 'id' of a valid element","Violation","1","1.3.1","" +"table_caption_empty","Pass_0","A <caption> element for a <table> element must contain descriptive text","Rule Passed","Pass","1","1.3.1","" +"table_caption_empty","Fail_1","A <caption> element for a <table> element must contain descriptive text","The <table> element has an empty <caption> element","Violation","1","1.3.1","" +"table_caption_nested","Pass_0","The <caption> element must be nested inside the associated <table> element","Rule Passed","Pass","3","1.3.1","" +"table_caption_nested","Fail_1","The <caption> element must be nested inside the associated <table> element","<caption> element is not nested inside a <table> element","Violation","3","1.3.1","" +"table_headers_exists","Pass_0","Data table must identify headers","Rule Passed","Pass","1","1.3.1","" +"table_headers_exists","Fail_1","Data table must identify headers","Table has no headers identified","Violation","1","1.3.1","" +"table_headers_related","Pass_0","For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes","Rule Passed","Pass","2","1.3.1","" +"table_headers_related","Fail_1","For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes","Complex table does not have headers for each cell properly defined with 'header' or 'scope'","Violation","2","1.3.1","" +"table_structure_misuse","Pass_0","Table elements with 'role=""presentation"" or 'role=""none"" should not have structural elements or attributes","Rule Passed","Pass","2","1.3.1","" +"table_structure_misuse","Fail_1","Table elements with 'role=""presentation"" or 'role=""none"" should not have structural elements or attributes","The <{0}> element with ""presentation"" role or ""none"" role has structural element(s) and/or attribute(s) '{1}'","Violation","2","1.3.1","" +"table_summary_redundant","Pass_0","The table summary must not duplicate the caption","Rule Passed","Pass","3","1.3.1","" +"table_summary_redundant","Fail_1","The table summary must not duplicate the caption","The table summary duplicates the caption","Violation","3","1.3.1","" +"blockquote_cite_exists","Pass_0","Use <blockquote> only for quotations, not indentation","Rule Passed","Pass","3","1.3.1","" +"blockquote_cite_exists","Potential_1","Use <blockquote> only for quotations, not indentation","Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only","Violation Potential","3","1.3.1","" +"heading_markup_misuse","Pass_0","Heading elements must not be used for presentation","Rule Passed","Pass","2","1.3.1","" +"heading_markup_misuse","Potential_1","Heading elements must not be used for presentation","Verify that the heading element is a genuine heading","Violation Potential","2","1.3.1","" +"text_quoted_correctly","Pass_0","Quotations should be marked with <q> or <blockquote> elements","Rule Passed","Pass","3","1.3.1","" +"text_quoted_correctly","Potential_1","Quotations should be marked with <q> or <blockquote> elements","If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}","Violation Potential","3","1.3.1","" +"list_markup_review","potential_list","Proper HTML elements should be used to create a list","Verify this is a list and if so, modify to use proper HTML elements for the list","Violation Potential","3","1.3.1","" +"text_block_heading","potential_heading","Heading text should use a heading element or role","Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role","Violation Potential","1","1.3.1","" +"fieldset_legend_valid","Pass_0"," <fieldset> elements should have a single, non-empty <legend> as a label","Rule Passed","Pass","1","1.3.1","" +"fieldset_legend_valid","Fail_1"," <fieldset> elements should have a single, non-empty <legend> as a label","<fieldset> element does not have a <legend>","Rec","1","1.3.1","" +"fieldset_legend_valid","Fail_2"," <fieldset> elements should have a single, non-empty <legend> as a label","<fieldset> element has more than one <legend>","Rec","1","1.3.1","" +"fieldset_legend_valid","Fail_3"," <fieldset> elements should have a single, non-empty <legend> as a label","<fieldset> element <legend> is empty","Rec","1","1.3.1","" +"aria_child_valid","Pass","An element with an ARIA role must own a required child","An element with an ARIA role owns a required child","Pass","1","1.3.1","bc4a75:pass" +"aria_child_valid","Fail_no_child","An element with an ARIA role must own a required child","The element with role ""{0}"" does not own any child element with any of the following role(s): ""{1}""","Rec","1","1.3.1","bc4a75:fail" +"aria_child_valid","Fail_invalid_child","An element with an ARIA role must own a required child","The element with role ""{0}"" owns the child element with the role ""{1}"" that is not one of the allowed role(s): ""{2}""","Rec","1","1.3.1","bc4a75:fail" +"aria_complementary_label_visible","Pass_0","Each element with ""complementary"" role should have a visible label that describes its purpose","Rule Passed","Pass","3","1.3.1","" +"aria_complementary_label_visible","Fail_1","Each element with ""complementary"" role should have a visible label that describes its purpose","Element with ""complementary"" role does not have a visible label","Rec","3","1.3.1","" +"aria_contentinfo_misuse","Pass_0","Each element with ""contentinfo"" role is only permitted with an element with ""main"" role","Rule Passed","Pass","3","1.3.1","" +"aria_contentinfo_misuse","Fail_1","Each element with ""contentinfo"" role is only permitted with an element with ""main"" role","Element with ""contentinfo"" role is present without an element with ""main"" role","Rec","3","1.3.1","" +"aria_main_label_visible","Pass_0","Each element with ""main"" role should have a unique visible label that describes its purpose","Rule Passed","Pass","3","1.3.1","" +"aria_main_label_visible","Fail_1","Each element with ""main"" role should have a unique visible label that describes its purpose","Multiple elements with ""main"" role do not have unique visible labels","Rec","3","1.3.1","" +"input_fields_grouped","Pass_0","Groups of logically related input elements should be contained within a <fieldset> element","Rule Passed","Pass","2","1.3.1","" +"input_fields_grouped","Potential_1","Groups of logically related input elements should be contained within a <fieldset> element","Use the <fieldset> element to group logically related input elements","Rec Potential","2","1.3.1","" +"list_structure_proper","Pass_0","List elements should only be used for lists of related items","Rule Passed","Pass","3","1.3.1","" +"list_structure_proper","Potential_1","List elements should only be used for lists of related items","List element is missing or improperly structured","Rec Potential","3","1.3.1","" +"select_options_grouped","Pass_0","Groups of related options within a selection list should be grouped with <optgroup>","Rule Passed","Pass","3","1.3.1","" +"select_options_grouped","Potential_1","Groups of related options within a selection list should be grouped with <optgroup>","Group of related options may need <optgroup>","Rec Potential","3","1.3.1","" +"table_layout_linearized","Pass_0","Avoid using tables to format text documents in columns unless the table can be linearized","Rule Passed","Pass","4","1.3.1","" +"table_layout_linearized","Potential_1","Avoid using tables to format text documents in columns unless the table can be linearized","Verify table is not being used to format text content in columns unless the table can be linearized","Rec Potential","4","1.3.1","" +"dir_attribute_valid","Pass_0","'dir' attribute value must be ""ltr"", ""rtl"", or ""auto""","Rule Passed","Pass","3","1.3.2","" +"dir_attribute_valid","Fail_1","'dir' attribute value must be ""ltr"", ""rtl"", or ""auto""","Invalid value used for the 'dir' attribute","Violation","3","1.3.2","" +"text_whitespace_valid","pass","Space characters should not be used to control spacing within a word","Rule Passed","Pass","3","1.3.2","" +"text_whitespace_valid","potential_text","Space characters should not be used to control spacing within a word","Space characters should not be used to create space between the letters of a word","Violation Potential","3","1.3.2","" +"style_highcontrast_visible","Pass_0","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Rule Passed","Pass | Pass","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"style_highcontrast_visible","Manual_1","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content","Violation Manual | Rec Manual","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"text_sensory_misuse","potential_position","Instructions should be meaningful without relying solely on shape, size, or location words","Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position","Violation Potential","2","1.3.3","" +"text_sensory_misuse","potential_other","Instructions should be meaningful without relying solely on shape, size, or location words","Confirm the user instruction is still understandable without the word(s) '{0}'","Violation Potential","2","1.3.3","" +"element_orientation_unlocked","pass","Elements should not be restricted to either landscape or portrait orientation using CSS transform property","The element is not restricted to either landscape or portrait orientation using CSS transform property","Pass","2","1.3.4","b33eff:pass" +"element_orientation_unlocked","fail_locked","Elements should not be restricted to either landscape or portrait orientation using CSS transform property","The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property","Violation","2","1.3.4","b33eff:fail" +"input_autocomplete_valid","pass","The 'autocomplete' attribute's token(s) must be appropriate for the input form field","The 'autocomplete' attribute's token(s) is appropriate for the input form field","Pass","3","1.3.5","73f2c2:pass" +"input_autocomplete_valid","fail_inappropriate","The 'autocomplete' attribute's token(s) must be appropriate for the input form field","The 'autocomplete' attribute's token(s) are not appropriate for the input form field","Violation","3","1.3.5","73f2c2:fail" +"input_autocomplete_valid","fail_invalid","The 'autocomplete' attribute's token(s) must be appropriate for the input form field","The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type","Violation","3","1.3.5","73f2c2:pass" +"input_autocomplete_valid","fail_incorrect","The 'autocomplete' attribute's token(s) must be appropriate for the input form field","The 'autocomplete' attribute has an incorrect value","Violation","3","1.3.5","73f2c2:fail" +"form_font_color","Pass_0","Combine color and descriptive markup to indicate required form fields","Rule Passed","Pass","2","1.4.1","" +"form_font_color","Potential_1","Combine color and descriptive markup to indicate required form fields","Check color is not used as the only visual means to convey which fields are required","Violation Potential","2","1.4.1","" +"style_color_misuse","Pass_0","Combine color and descriptive markup to convey information","Rule Passed","Pass","2","1.4.1","" +"style_color_misuse","Potential_1","Combine color and descriptive markup to convey information","Verify color is not used as the only visual means of conveying information","Violation Potential","2","1.4.1","" +"media_autostart_controllable","Pass_0","Mechanism must be available to pause or stop and control the volume of the audio that plays automatically","Rule Passed","Pass","2","1.4.2","" +"media_autostart_controllable","Potential_1","Mechanism must be available to pause or stop and control the volume of the audio that plays automatically","Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically","Violation Potential","2","1.4.2","" +"text_contrast_sufficient","pass","The contrast ratio of text with its background must meet WCAG AA requirements","The contrast ratio of text with its background meets WCAG AA requirements","Pass","1","1.4.3","afw4f7:pass" +"text_contrast_sufficient","fail_contrast","The contrast ratio of text with its background must meet WCAG AA requirements","Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}","Violation","1","1.4.3","afw4f7:fail" +"text_contrast_sufficient","potential_same_color","The contrast ratio of text with its background must meet WCAG AA requirements","The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast","Violation Potential","1","1.4.3","afw4f7:cantTell" +"text_contrast_sufficient","potential_graphic_background","The contrast ratio of text with its background must meet WCAG AA requirements","Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}","Violation Potential","1","1.4.3","afw4f7:cantTell" +"text_contrast_sufficient","potential_text_shadow","The contrast ratio of text with its background must meet WCAG AA requirements","Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}","Violation Potential","1","1.4.3","afw4f7:cantTell" +"style_viewport_resizable","Pass_0","Text must scale up to 200% without loss of content or functionality","Rule Passed","Pass","3","1.4.4,1.4.10","" +"style_viewport_resizable","Potential_1","Text must scale up to 200% without loss of content or functionality","Verify that text sized using viewport units can be resized up to 200%","Violation Potential","3","1.4.4,1.4.10","" +"meta_viewport_zoomable","pass","The 'meta[name=viewport]' should not prevent the browser zooming the content","The 'meta[name=viewport]' does not prevent the browser zooming the content","Pass","3","1.4.4","b4f0c3:pass" +"meta_viewport_zoomable","potential_zoomable","The 'meta[name=viewport]' should not prevent the browser zooming the content","Confirm the 'meta[name=viewport]' with ""{0}"" can be zoomed by user","Rec Potential","3","1.4.4","b4f0c3:fail" +"style_viewport_resizable","Pass_0","Text must scale up to 200% without loss of content or functionality","Rule Passed","Pass","3","1.4.4,1.4.10","" +"style_viewport_resizable","Potential_1","Text must scale up to 200% without loss of content or functionality","Verify that text sized using viewport units can be resized up to 200%","Violation Potential","3","1.4.4,1.4.10","" +"style_highcontrast_visible","Pass_0","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Rule Passed","Pass | Pass","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"style_highcontrast_visible","Manual_1","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content","Violation Manual | Rec Manual","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"text_spacing_valid","pass","CSS !important should not be used in inline style to control letter or word spacing or line height","CSS !important is not used in inline style to control letter or word spacing or line height","Pass","3","1.4.12","9e45ec:pass | 24afc2:pass | 78fd32:pass" +"text_spacing_valid","fail_letter_spacing_style","CSS !important should not be used in inline style to control letter or word spacing or line height","CSS !important should not be used in inline ‘letter-spacing’ style","Violation","3","1.4.12","9e45ec:fail | 24afc2:fail | 78fd32:fail" +"text_spacing_valid","fail_word_spacing_style","CSS !important should not be used in inline style to control letter or word spacing or line height","CSS !important should not be used in inline ‘word-spacing’ style","Violation","3","1.4.12","9e45ec:fail | 24afc2:fail | 78fd32:fail" +"text_spacing_valid","fail_line_height_style","CSS !important should not be used in inline style to control letter or word spacing or line height","CSS !important should not be used in inline ‘line-height’ style","Violation","3","1.4.12","9e45ec:fail | 24afc2:fail | 78fd32:fail" +"style_hover_persistent","Pass_0","The pointer should be able to move over content displayed on hover","the hover: pseudo-class is not used to display content","Pass","2","1.4.13","" +"style_hover_persistent","Pass_2","The pointer should be able to move over content displayed on hover","content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element","Pass","2","1.4.13","" +"style_hover_persistent","Potential_1","The pointer should be able to move over content displayed on hover","Confirm the pointer can be positioned over the displayed element, not just the trigger","Violation Potential","2","1.4.13","" +"style_hover_persistent","Potential_2","The pointer should be able to move over content displayed on hover","Confirm the pointer can be positioned over all the information displayed on hover","Violation Potential","2","1.4.13","" +"style_hover_persistent","Potential_3","The pointer should be able to move over content displayed on hover","Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger","Violation Potential","2","1.4.13","" +"aria_activedescendant_tabindex_valid","pass","Element using 'aria-activedescendant' property should be tabbable","Rule Passed","Pass","1","2.1.1","" +"aria_activedescendant_tabindex_valid","Fail_1","Element using 'aria-activedescendant' property should be tabbable","The <{0}> element using 'aria-activedescendant' set to ""{1}"" is not tabbable","Violation","1","2.1.1","" +"aria_child_tabbable","pass","UI component must have at least one tabbable descendant for keyboard access","Rule Passed","Pass","1","2.1.1","" +"aria_child_tabbable","fail_missing_child","UI component must have at least one tabbable descendant for keyboard access","None of the descendent elements with ""{1}"" role is tabbable","Violation","1","2.1.1","" +"iframe_interactive_tabbable","pass","Iframe with interactive content should not be excluded from tab order using tabindex","The iframe with interactive content is not excluded from the tab order using tabindex","Pass","1","2.1.1","akn7bn:pass" +"iframe_interactive_tabbable","fail_invalid","Iframe with interactive content should not be excluded from tab order using tabindex","The <iframe> with interactive content is excluded from tab order using tabindex","Violation","1","2.1.1","akn7bn:fail" +"application_content_accessible","Pass_0","Non-decorative static text and image content within an element with ""application"" role must be accessible","Rule Passed","Pass","1","1.1.1,2.1.1","" +"application_content_accessible","Potential_1","Non-decorative static text and image content within an element with ""application"" role must be accessible","Verify that the non-decorative static text and image content within an element with ""application"" role are accessible","Violation Potential","1","1.1.1,2.1.1","" +"aria_keyboard_handler_exists","pass","Interactive WAI_ARIA UI components must provide keyboard access","Rule Passed","Pass","1","2.1.1","" +"aria_keyboard_handler_exists","potential_no_keyboard_access","Interactive WAI_ARIA UI components must provide keyboard access","Verify the <{0}> element with ""{1}"" role has keyboard access","Violation Potential","1","2.1.1","" +"script_focus_blur_review","Pass_0","Scripting must not remove focus from content that normally receives focus","Rule Passed","Pass","1","2.1.1,2.4.7,3.2.1","" +"script_focus_blur_review","Potential_1","Scripting must not remove focus from content that normally receives focus","Verify script does not remove focus from content that normally receives focus","Violation Potential","1","2.1.1,2.4.7,3.2.1","" +"script_onclick_misuse","Pass_0","Scripts should not be used to emulate links","Rule Passed","Pass","1","2.1.1","" +"script_onclick_misuse","Potential_1","Scripts should not be used to emulate links","Possible use of a script to emulate a link","Violation Potential","1","2.1.1","" +"widget_tabbable_exists","pass","Component must have at least one tabbable element","Rule Passed","Pass","1","2.1.1","" +"widget_tabbable_exists","fail_no_tabbable","Component must have at least one tabbable element","Component with ""{0}"" role does not have a tabbable element","Violation Potential","1","2.1.1","" +"widget_tabbable_single","pass","Components with a widget role must have no more than one tabbable element","Components with a widget role should have no more than one tabbable element","Pass","1","2.1.1,2.4.3","" +"widget_tabbable_single","potential_multiple_tabbable","Components with a widget role must have no more than one tabbable element","Component with ""{0}"" role has more than one tabbable element","Violation Potential","1","2.1.1,2.4.3","" +"media_keyboard_controllable","Pass_0","Media using <audio> and/or <video> elements must have keyboard accessible controls","Rule Passed","Pass","2","2.1.1","" +"media_keyboard_controllable","Manual_1","Media using <audio> and/or <video> elements must have keyboard accessible controls","Verify media using <audio> and/or <video> elements have keyboard accessible controls","Violation Manual","2","2.1.1","" +"script_onclick_avoid","Pass_0","Scripts should not be used to emulate links","Rule Passed","Pass","4","2.1.1","" +"script_onclick_avoid","Potential_1","Scripts should not be used to emulate links","Verify that 'onclick' events are not used in script to emulate a link","Rec Potential","4","2.1.1","" +"canvas_content_described","Pass_0","The <canvas> element may not be accessible","Rule Passed","Pass","3","1.1.1,2.1.1,4.1.2","" +"canvas_content_described","Manual_1","The <canvas> element may not be accessible","Verify accessibility of the <canvas> element","Rec Manual","3","1.1.1,2.1.1,4.1.2","" +"element_mouseevent_keyboard","Pass_0","All interactive content with mouse event handlers must have equivalent keyboard access","Rule Passed","Pass","1","2.1.1","" +"element_mouseevent_keyboard","Manual_1","All interactive content with mouse event handlers must have equivalent keyboard access","Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)","Rec Manual","1","2.1.1","" +"download_keyboard_controllable","Manual_1","File download mechanisms should be keyboard-operable and preserve page focus location","Verify that the file download mechanism does not cause a keyboard trap","Rec Manual","1","2.1.2","" +"meta_refresh_delay","pass","Pages should not refresh automatically","Pages do not refresh automatically","Pass","3","2.2.1","bc659a:pass" +"meta_refresh_delay","potential_refresh","Pages should not refresh automatically","Verify page is not being caused to refresh automatically","Violation Potential","3","2.2.1","bc659a:cantTell" +"blink_elem_deprecated","Fail_1","Content that blinks persistently must not be used","Content found that blinks persistently","Violation","2","2.2.2","" +"marquee_elem_avoid","Fail_1","The <marquee> element is obsolete and should not be used","Scrolling content found that uses the obsolete <marquee> element","Violation","3","2.2.2","" +"blink_css_review","Pass_0","Do not use the ""blink"" value of the 'text-decoration' property for longer than five seconds","Rule Passed","Pass","2","2.2.2","" +"blink_css_review","Potential_1","Do not use the ""blink"" value of the 'text-decoration' property for longer than five seconds","Check the ""blink"" value of the CSS 'text-decoration' property is not used for more than than five seconds","Violation Potential","2","2.2.2","" +"aria_application_label_unique","pass","Each element with ""application"" role must have a unique label that describes its purpose","The element with ""application"" role has a unique label that describes its purpose","Pass","3","2.4.1","" +"aria_application_label_unique","fail_label_not_unique","Each element with ""application"" role must have a unique label that describes its purpose","Multiple elements with ""application"" role do not have unique labels","Violation","3","2.4.1","" +"aria_application_labelled","pass","Each element with ""application"" role must have a label that describes its purpose","The element with ""application"" role has a label that describes its purpose","Pass","3","2.4.1","" +"aria_application_labelled","fail_no_label","Each element with ""application"" role must have a label that describes its purpose","Element with ""application"" role does not have a label","Violation","3","2.4.1","" +"aria_article_label_unique","pass","Each element with ""article"" role must have a unique label that describes its purpose","The element with ""article"" role has a unique label that describes its purpose","Pass","3","2.4.1","" +"aria_article_label_unique","fail_label_not_unique","Each element with ""article"" role must have a unique label that describes its purpose","Multiple elements with ""article"" role do not have unique labels","Violation","3","2.4.1","" +"aria_document_label_unique","pass","Each element with ""document"" role must have a unique label that describes its purpose","The element with ""document"" role has a unique label that describes its purpose","Pass","3","2.4.1","" +"aria_document_label_unique","fail_label_not_unique","Each element with ""document"" role must have a unique label that describes its purpose","Multiple elements with ""document"" roles do not have unique labels","Violation","3","2.4.1","" +"aria_toolbar_label_unique","Pass_0","Each element with ""toolbar"" role must have a unique label that describes its purpose","Rule Passed","Pass","1","2.4.1","" +"aria_toolbar_label_unique","Fail_1","Each element with ""toolbar"" role must have a unique label that describes its purpose","Multiple elements with ""toolbar"" roles do not have unique labels","Violation","1","2.4.1","" +"skip_main_exists","Pass_0","Pages must provide a way to skip directly to the main content","Rule Passed","Pass","3","2.4.1","" +"skip_main_exists","Fail_1","Pages must provide a way to skip directly to the main content","The page does not provide a way to quickly navigate to the main content (ARIA ""main"" landmark or a skip link)","Violation","3","2.4.1","" +"frame_src_valid","Pass_0","A <frame> containing non-HTML content must be made accessible","Rule Passed","Pass","3","2.4.1","" +"frame_src_valid","Potential_1","A <frame> containing non-HTML content must be made accessible","Verify <frame> content is accessible","Violation Potential","3","2.4.1","" +"html_skipnav_exists","Pass_0","Provide a way to bypass blocks of content that are repeated on multiple Web pages","Rule Passed","Pass","3","2.4.1","" +"html_skipnav_exists","Potential_1","Provide a way to bypass blocks of content that are repeated on multiple Web pages","Verify there is a way to bypass blocks of content that are repeated on multiple Web pages","Violation Potential","3","2.4.1","" +"skip_main_described","Pass_0","The description of a hyperlink used to skip content must communicate where it links to","Rule Passed","Pass","3","2.4.1","" +"skip_main_described","Potential_1","The description of a hyperlink used to skip content must communicate where it links to","Verify that if this hyperlink skips content, the description communicates where it links to","Violation Potential","3","2.4.1","" +"page_title_exists","Pass_0","The page should have a title that correctly identifies the subject of the page","Rule Passed","Pass","1","2.4.2","2779a5:pass" +"page_title_exists","Fail_1","The page should have a title that correctly identifies the subject of the page","Missing <head> element so there can be no <title> element present","Violation","1","2.4.2","2779a5:pass" +"page_title_exists","Fail_2","The page should have a title that correctly identifies the subject of the page","Missing <title> element in <head> element","Violation","1","2.4.2","2779a5:fail" +"page_title_exists","Fail_3","The page should have a title that correctly identifies the subject of the page","The <title> element is empty (no innerHTML)","Violation","1","2.4.2","2779a5:fail" +"page_title_valid","Pass_0","Page <title> should be a descriptive title, rather than a filename","Rule Passed","Pass","1","2.4.2","" +"page_title_valid","Potential_2","Page <title> should be a descriptive title, rather than a filename","Verify that using the filename as the page <title> value is descriptive","Violation Potential","1","2.4.2","" +"widget_tabbable_single","pass","Components with a widget role must have no more than one tabbable element","Components with a widget role should have no more than one tabbable element","Pass","1","2.1.1,2.4.3","" +"widget_tabbable_single","potential_multiple_tabbable","Components with a widget role must have no more than one tabbable element","Component with ""{0}"" role has more than one tabbable element","Violation Potential","1","2.1.1,2.4.3","" +"img_alt_redundant","Pass_0","The text alternative for an image within a link should not repeat the link text or adjacent link text","Rule Passed","Pass","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_1","The text alternative for an image within a link should not repeat the link text or adjacent link text","Link text is repeated in an image 'alt' value within the same link","Violation","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_2","The text alternative for an image within a link should not repeat the link text or adjacent link text","Link text of previous link is repeated in image 'alt' value of a link","Violation","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_3","The text alternative for an image within a link should not repeat the link text or adjacent link text","Image 'alt' value within a link is repeated in link text of the link after","Violation","2","1.1.1,2.4.4","" +"a_text_purpose","pass","Hyperlinks must have an accessible name for their purpose","Hyperlink has a description of its purpose","Pass","2","2.4.4,4.1.2","c487ae:pass" +"a_text_purpose","fail_acc_name","Hyperlinks must have an accessible name for their purpose","Hyperlink has no link text, label or image with a text alternative","Violation","2","2.4.4,4.1.2","c487ae:fail" +"heading_content_exists","Pass_0","Heading elements must provide descriptive text","Heading element has descriptive text","Pass","1","2.4.6","" +"heading_content_exists","Fail_1","Heading elements must provide descriptive text","Heading element has no descriptive content","Rec","1","2.4.6","" +"element_tabbable_visible","pass","A tabbable element should be visible on the screen when it has keyboard focus","The tabbable element is visible on the screen","Pass","1","2.4.7","" +"element_tabbable_visible","potential_visible","A tabbable element should be visible on the screen when it has keyboard focus","Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus","Violation Potential","1","2.4.7","" +"script_focus_blur_review","Pass_0","Scripting must not remove focus from content that normally receives focus","Rule Passed","Pass","1","2.1.1,2.4.7,3.2.1","" +"script_focus_blur_review","Potential_1","Scripting must not remove focus from content that normally receives focus","Verify script does not remove focus from content that normally receives focus","Violation Potential","1","2.1.1,2.4.7,3.2.1","" +"style_focus_visible","potential_focus_not_visible","The keyboard focus indicator should be visible when default border or outline is modified by CSS","Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'","Violation Potential","1","2.4.7","" +"style_focus_visible","pass_focus_visible","The keyboard focus indicator should be visible when default border or outline is modified by CSS","The keyboard focus indicator is visible or is not changed from the browser default","Pass","1","2.4.7","" +"element_tabbable_unobscured","pass","When an element receives focus, it is not entirely covered by other content","The element is not entirely covered by other content","Pass","3","2.4.11","" +"element_tabbable_unobscured","potential_obscured","When an element receives focus, it is not entirely covered by other content","Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus","Violation Potential","3","2.4.11","" +"label_name_visible","Pass_0","Accessible name must match or contain the visible label text","Accessible name matches or contains the visible label text","Pass","2","2.5.3","2ee8b8:pass" +"label_name_visible","Fail_1","Accessible name must match or contain the visible label text","Accessible name does not match or contain the visible label text","Violation","2","2.5.3","2ee8b8:fail" +"input_label_visible","pass","An input element must have an associated visible label","The input element has an associated visible label","Pass","1","2.5.3,3.3.2","" +"input_label_visible","potential_placeholder_only","An input element must have an associated visible label","The ‘placeholder’ is the only visible label","Violation Potential","1","2.5.3,3.3.2","" +"input_label_visible","potential_no_label","An input element must have an associated visible label","The input element does not have an associated visible label","Violation Potential","1","2.5.3,3.3.2","" +"draggable_alternative_exists","pass_undraggable","A draggable element must have a ""single pointer"" alternative","The element ""{0}"" is not draggable","Pass","3","2.5.7","" +"draggable_alternative_exists","potential_alternative","A draggable element must have a ""single pointer"" alternative","Ensure the draggable element ""{0}"" has a ""single pointer"" alternative","Violation Potential","3","2.5.7","" +"target_spacing_sufficient","pass_spacing","The target must be sufficiently sized or spaced from other targets","The target's spacing from other targets is sufficient","Pass | Pass","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","pass_sized","The target must be sufficiently sized or spaced from other targets","The target’s size is more than 24 CSS pixels","Pass | Pass","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","pass_inline","The target must be sufficiently sized or spaced from other targets","The target is in a sentence or its size is otherwise constrained by the line-height of non-target text","Pass | Pass","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","pass_default","The target must be sufficiently sized or spaced from other targets","The target's size is determined by the user agent and is not modified by the author","Pass | Pass","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","violation_spacing","The target must be sufficiently sized or spaced from other targets","Undersized target ""{0}"" does not have sufficient spacing of 12 CSS pixels from another target ""{1}""","Violation | Rec","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","potential_overlap","The target must be sufficiently sized or spaced from other targets","Ensure the overlapped target ""{0}"" meets a minimum target size or has sufficient spacing from the overlapping target ""{1}""","Violation Potential | Rec Potential","3 | 3","2.5.8 | 2.5.8","" +"html_lang_exists","Pass_0","Page must identify the default language of the document with a 'lang' attribute","Page language detected as ""{0}""","Pass","1","3.1.1","b5c3f8:pass | 5b7ae0:pass" +"html_lang_exists","Fail_1","Page must identify the default language of the document with a 'lang' attribute","Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes","Violation","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:inapplicable" +"html_lang_exists","Fail_2","Page must identify the default language of the document with a 'lang' attribute","Page detected as XHTML, but does not have an 'xml:lang' attribute","Violation","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:inapplicable" +"html_lang_exists","Fail_3","Page must identify the default language of the document with a 'lang' attribute","Page detected as HTML, but does not have a 'lang' attribute","Violation","1","3.1.1","b5c3f8:fail | 5b7ae0:inapplicable" +"html_lang_exists","Fail_4","Page must identify the default language of the document with a 'lang' attribute","Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: ""{0}"", ""{1}""","Violation","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:fail" +"html_lang_exists","Fail_5","Page must identify the default language of the document with a 'lang' attribute","Page detected with 'lang' and 'xml:lang' attributes that do not match: ""{0}"", ""{1}""","Violation","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:pass" +"html_lang_exists","Potential_5","Page must identify the default language of the document with a 'lang' attribute","Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type","Violation Potential","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:inapplicable" +"html_lang_exists","Potential_6","Page must identify the default language of the document with a 'lang' attribute","Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type","Violation Potential","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:inapplicable" +"html_lang_valid","Pass_0","The default human language of the page must be valid and specified in accordance with BCP 47","Lang has a valid primary lang and conforms to BCP 47","Pass","1","3.1.1","b5c3f8:pass | bf051a:pass" +"html_lang_valid","Fail_1","The default human language of the page must be valid and specified in accordance with BCP 47","Specified 'lang' attribute does not include a valid primary language","Violation","1","3.1.1","b5c3f8:fail | bf051a:fail" +"html_lang_valid","Fail_2","The default human language of the page must be valid and specified in accordance with BCP 47","Specified 'lang' attribute does not conform to BCP 47","Violation","1","3.1.1","b5c3f8:inapplicable | bf051a:pass" +"html_lang_valid","Fail_3","The default human language of the page must be valid and specified in accordance with BCP 47","Specified 'xml:lang' attribute does not include a valid primary language","Violation","1","3.1.1","b5c3f8:inapplicable | bf051a:fail" +"html_lang_valid","Fail_4","The default human language of the page must be valid and specified in accordance with BCP 47","Specified 'xml:lang' attribute does not conform to BCP 47","Violation","1","3.1.1","b5c3f8:inapplicable | bf051a:inapplicable" +"element_lang_valid","Pass_0","The change in language of specific content must be valid and specified in accordance with BCP 47","Lang has a valid primary lang and conforms to BCP 47","Pass","3","3.1.2","de46e4:pass" +"element_lang_valid","Fail_1","The change in language of specific content must be valid and specified in accordance with BCP 47","Specified 'lang' attribute does not include a valid primary language","Violation","3","3.1.2","de46e4:fail" +"element_lang_valid","Fail_2","The change in language of specific content must be valid and specified in accordance with BCP 47","Specified 'lang' attribute does not conform to BCP 47","Violation","3","3.1.2","de46e4:pass" +"element_lang_valid","Fail_3","The change in language of specific content must be valid and specified in accordance with BCP 47","Specified 'xml:lang' attribute does not include a valid primary language","Violation","3","3.1.2","de46e4:inapplicable" +"element_lang_valid","Fail_4","The change in language of specific content must be valid and specified in accordance with BCP 47","Specified 'xml:lang' attribute does not conform to BCP 47","Violation","3","3.1.2","de46e4:inapplicable" +"script_focus_blur_review","Pass_0","Scripting must not remove focus from content that normally receives focus","Rule Passed","Pass","1","2.1.1,2.4.7,3.2.1","" +"script_focus_blur_review","Potential_1","Scripting must not remove focus from content that normally receives focus","Verify script does not remove focus from content that normally receives focus","Violation Potential","1","2.1.1,2.4.7,3.2.1","" +"script_select_review","Pass_0","No changes of context should occur when a selection value receives focus","Rule Passed","Pass","3","3.2.1","" +"script_select_review","Potential_1","No changes of context should occur when a selection value receives focus","Verify that no change of context or action occurs when selection options in this component receive focus","Violation Potential","3","3.2.1","" +"form_interaction_review","Pass_0","User should be informed in advance when interacting with content causes a change of context","Rule Passed","Pass","3","3.2.2","" +"form_interaction_review","Potential_1","User should be informed in advance when interacting with content causes a change of context","Verify that interacting with content will not open pop-up windows or change the active window without informing the user","Violation Potential","3","3.2.2","" +"form_submit_button_exists","Pass_0","A <form> element should have a submit button or an image button","Rule Passed","Pass","3","3.2.2","" +"form_submit_button_exists","Potential_1","A <form> element should have a submit button or an image button","Verify the <form> element has a submit button or an image button","Violation Potential","3","3.2.2","" +"input_onchange_review","potential_warning","Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs","Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs","Violation Potential","3","3.2.2","" +"a_target_warning","pass","Users should be warned in advance if their input action will open a new window","The user is warned in advance that the input action opens a new window","Pass","3","3.2.2","" +"a_target_warning","potential_warn","Users should be warned in advance if their input action will open a new window","Inform the user when their input action will open a new window","Rec Potential","3","3.2.2","" +"error_message_exists","Pass_0","A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed","Rule Passed","Pass","1","3.3.1","" +"error_message_exists","Fail_1","A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed","Custom error message has invalid reference 'id' value","Violation","1","3.3.1","" +"error_message_exists","Fail_2","A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed","Custom error message is not visible","Violation","1","3.3.1","" +"fieldset_label_valid","Pass_1","Groups with nested inputs must have unique accessible name","Group/Fieldset ""{0}"" with an input has a unique name","Pass","3","1.3.1,3.3.2","" +"fieldset_label_valid","Fail_1","Groups with nested inputs must have unique accessible name","Group/Fieldset does not have an accessible name","Violation","3","1.3.1,3.3.2","" +"fieldset_label_valid","Fail_2","Groups with nested inputs must have unique accessible name","Group/Fieldset ""{0}"" has a duplicate name to another group","Violation","3","1.3.1,3.3.2","" +"input_label_after","Pass_0","Checkboxes and radio buttons must have a label after the input control","Rule Passed","Pass","1","3.3.2","" +"input_label_after","Fail_1","Checkboxes and radio buttons must have a label after the input control","Checkbox or radio button is nested in label, so label is not after the input control","Violation","1","3.3.2","" +"input_label_after","Fail_2","Checkboxes and radio buttons must have a label after the input control","Label text is located before its associated checkbox or radio button element","Violation","1","3.3.2","" +"input_label_before","Pass_0","Text inputs and <select> elements must have a label before the input control","Rule Passed","Pass","1","3.3.2","" +"input_label_before","Fail_1","Text inputs and <select> elements must have a label before the input control","Text input is nested in label such that input precedes the label text","Violation","1","3.3.2","" +"input_label_before","Fail_2","Text inputs and <select> elements must have a label before the input control","Label text is located after its associated text input or <select> element","Violation","1","3.3.2","" +"input_label_visible","pass","An input element must have an associated visible label","The input element has an associated visible label","Pass","1","2.5.3,3.3.2","" +"input_label_visible","potential_placeholder_only","An input element must have an associated visible label","The ‘placeholder’ is the only visible label","Violation Potential","1","2.5.3,3.3.2","" +"input_label_visible","potential_no_label","An input element must have an associated visible label","The input element does not have an associated visible label","Violation Potential","1","2.5.3,3.3.2","" +"element_accesskey_labelled","Pass_0","An element with an assigned 'accesskey' attribute must have an associated label","Rule Passed","Pass","1","3.3.2","" +"element_accesskey_labelled","Potential_1","An element with an assigned 'accesskey' attribute must have an associated label","The element with an assigned 'accesskey' attribute does not have an associated label","Rec Potential","1","3.3.2","" +"combobox_popup_reference","Pass_1.0_expanded","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass","1","4.1.2","4e8ab6:fail" +"combobox_popup_reference","Pass_1.0_collapsed","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox popup in its collapsed state does not reference any visible popup as required","Pass","1","4.1.2","4e8ab6:fail" +"combobox_popup_reference","Pass_1.2_expanded","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass","1","4.1.2","4e8ab6:pass" +"combobox_popup_reference","Pass_1.2_collapsed","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox popup in its collapsed state does not reference any visible popup as required","Pass","1","4.1.2","4e8ab6:pass" +"combobox_popup_reference","Fail_1.0_missing_owns","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The 'aria-owns' attribute of the expanded combobox is missing","Violation","1","4.1.2","4e8ab6:inapplicable" +"combobox_popup_reference","Fail_1.2_missing_controls","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The 'aria-controls' attribute of the expanded combobox is missing","Violation","1","4.1.2","4e8ab6:fail" +"combobox_popup_reference","Fail_1.0_popup_reference_missing","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The 'aria-owns' attribute ""{0}"" of the expanded combobox does not reference a valid popup 'id' value","Violation","1","4.1.2","4e8ab6:inapplicable" +"combobox_popup_reference","Fail_1.2_popup_reference_missing","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The 'aria-controls' attribute ""{0}"" of the expanded combobox does not reference a valid popup 'id' value","Violation","1","4.1.2","4e8ab6:fail" +"combobox_popup_reference","Fail_combobox_expanded_hidden","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible","Violation","1","4.1.2","4e8ab6:inapplicable" +"combobox_popup_reference","Fail_combobox_collapsed_visible","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox 'aria-expanded' attribute is false, but the combobox popup is visible","Violation","1","4.1.2","4e8ab6:inapplicable" +"combobox_active_descendant","Pass","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","'aria-activedescendant' is used appropriately for this combobox","Pass","1","4.1.2","" +"combobox_active_descendant","Fail_missing","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","The element referenced by 'aria-activedescendant' ""{0}"" does not exist","Violation","1","4.1.2","" +"combobox_active_descendant","Fail_not_in_popup","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","The element referenced by 'aria-activedescendant' ""{0}"" does not exist within the popup referenced by 'id' ""{1}""","Pass","1","4.1.2","" +"combobox_active_descendant","Fail_active_role_invalid","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","The 'aria-activedescendant' ""{0}"" references an element with the roles ""{1}"", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'","Violation","1","4.1.2","" +"combobox_active_descendant","Fail_active_not_selected","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","The 'aria-activedescendant' ""{0}"" references an element that does not have 'aria-selected' set to true","Violation","1","4.1.2","" +"aria_activedescendant_valid","Pass_0","The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element","Rule Passed","Pass","1","4.1.2","" +"aria_activedescendant_valid","Fail_1","The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element","The 'aria-activedescendant' property is empty","Violation","1","4.1.2","" +"aria_activedescendant_valid","Fail_2","The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element","The 'aria-activedescendant' property references a hidden node","Violation","1","4.1.2","" +"aria_activedescendant_valid","Fail_3","The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element","Element is not a combobox, and the referenced active-descendant element is not a valid descendant","Violation","1","4.1.2","" +"input_haspopup_conflict","potential_type_misuse","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The <input> element with type ""{0}"" and 'list' attribute uses an explicit 'aria-haspopup' attribute","Violation Potential","1","4.1.2","" +"input_haspopup_conflict","potential_misuse","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute","Violation Potential","1","4.1.2","" +"input_haspopup_conflict","potential_list_notexist","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The list attribute for the <input> element is invalid","Violation Potential","1","4.1.2","" +"input_haspopup_conflict","fail_invalid_list_type","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The list attribute for the <input> element with the type ""{0}"" is invalid","Violation","1","4.1.2","" +"input_haspopup_conflict","fail_invalid_list_elem","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The list attribute for the <input> element does not reference a datalist element","Violation","1","4.1.2","" +"aria_role_valid","Pass_0","ARIA roles must be valid for the element to which they are assigned","Rule Passed","Pass","1","4.1.2","" +"aria_role_valid","Fail_1","ARIA roles must be valid for the element to which they are assigned","The ARIA role '{0}' is not valid for the element <{1}>","Violation","1","4.1.2","" +"aria_role_valid","Fail_2","ARIA roles must be valid for the element to which they are assigned","The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable","Violation","1","4.1.2","" +"combobox_autocomplete_valid","Pass","A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '""inline""' is not supported","The combobox does not use 'aria-autocomplete' value '""inline""' nor does it have 'aria-autocomplete' defined within the popup","Pass","1","4.1.2","" +"combobox_autocomplete_valid","Fail_1","A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '""inline""' is not supported","The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by ""{0}""","Violation","1","4.1.2","" +"combobox_autocomplete_valid","Fail_inline","A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '""inline""' is not supported","The combobox does not support an 'aria-autocomplete' attribute value set to '""inline""' ","Violation","1","4.1.2","" +"combobox_focusable_elements","Pass","Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup","DOM focus is allowed only on the combobox element as required","Pass","1","4.1.2","" +"combobox_focusable_elements","Fail_not_tabbable","Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup","The combobox element does not allow DOM focus as required","Violation","1","4.1.2","" +"combobox_focusable_elements","Fail_tabbable_child","Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup","The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed","Violation","1","4.1.2","" +"combobox_haspopup_valid","Pass","The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)","The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value","Pass","1","4.1.2","" +"combobox_haspopup_valid","Fail_popup_role_invalid","The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)","The 'role' value ""{0}"" of the popup element ""{1}"" should be one of ""listbox"", ""grid"", ""tree"" or ""dialog""","Violation","1","4.1.2","" +"combobox_haspopup_valid","Fail_combobox_popup_role_mismatch","The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)","The value of the combobox 'aria-haspopup' attribute ""{0}"" does not match the 'role' value of the popup element ""{1}""","Violation","1","4.1.2","" +"element_tabbable_role_valid","pass","A tabbable element must have a valid widget role","The tabbable element has a widget role","Pass | Pass","1 | 1","4.1.2 | 4.1.2","" +"element_tabbable_role_valid","fail_invalid_role","A tabbable element must have a valid widget role","The tabbable element's role '{0}' is not a widget role","Violation | Rec","1 | 1","4.1.2 | 4.1.2","" +"element_tabbable_role_valid","fail_no_valid_role","A tabbable element must have a valid widget role","The tabbable element does not have a valid widget role","Violation | Rec","1 | 1","4.1.2 | 4.1.2","" +"input_label_exists","Pass_0","Each form control must have an associated label","Rule Passed","Pass","1","4.1.2","97a4e1:pass | e086e5:pass" +"input_label_exists","Fail_1","Each form control must have an associated label","Form control element <{0}> has no associated label","Violation","1","4.1.2","97a4e1:fail | e086e5:fail" +"input_label_exists","Fail_2","Each form control must have an associated label","Form control with ""{0}"" role has no associated label","Violation","1","4.1.2","97a4e1:fail | e086e5:fail" +"aria_descendant_valid","pass","Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements","The element contains valid descendants","Pass | Pass","1 | 1","4.1.2 | 4.1.2","307n5z:pass" +"aria_descendant_valid","potential_child_implicit_role","Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements","The element with role ""{0}"" contains descendants with implicit roles ""{1}"" which are ignored by browsers","Violation Potential | Rec Potential","1 | 1","4.1.2 | 4.1.2","307n5z:cantTell" +"aria_descendant_valid","fail_child_explicit_role","Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements","The element with role ""{0}"" contains descendants with roles ""{1}"" which are ignored by browsers","Violation | Rec","1 | 1","4.1.2 | 4.1.2","307n5z:fail" +"aria_role_allowed","Pass_0","Elements must have a valid 'role' per ARIA specification","Rule Passed","Pass","1","4.1.2","674b10:pass" +"aria_role_allowed","Fail_2","Elements must have a valid 'role' per ARIA specification","The role '{0}' defined on the element is not valid per ARIA specification","Violation","1","4.1.2","674b10:fail" +"aria_role_allowed","Potential_1","Elements must have a valid 'role' per ARIA specification","Some of the roles, '{0}', defined on the element are not valid per ARIA specification","Violation Potential","1","4.1.2","674b10:cantTell" +"label_content_exists","Pass_Regular","A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component","<label> element has accessible name with inner content","Pass","1","4.1.2","" +"label_content_exists","Pass_AriaLabel","A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component","<label> element has accessible name via 'aria-label'","Pass","1","4.1.2","" +"label_content_exists","Pass_LabelledBy","A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component","<label> element has accessible name via 'aria-labelledby'","Pass","1","4.1.2","" +"label_content_exists","Fail_1","A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component","The <label> element does not have descriptive text that identifies the expected input","Violation","1","4.1.2","" +"combobox_design_valid","Pass_1.0","The combobox design pattern must be valid for ARIA 1.2","The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Pass","1","4.1.2","" +"combobox_design_valid","Fail_1.1","The combobox design pattern must be valid for ARIA 1.2","The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Violation","1","4.1.2","" +"combobox_design_valid","Pass_1.2","The combobox design pattern must be valid for ARIA 1.2","The combobox design pattern is detected as ARIA 1.2","Pass","1","4.1.2","" +"a_text_purpose","pass","Hyperlinks must have an accessible name for their purpose","Hyperlink has a description of its purpose","Pass","2","2.4.4,4.1.2","c487ae:pass" +"a_text_purpose","fail_acc_name","Hyperlinks must have an accessible name for their purpose","Hyperlink has no link text, label or image with a text alternative","Violation","2","2.4.4,4.1.2","c487ae:fail" +"aria_attribute_allowed","Pass_0","ARIA attributes must be valid for the element's role","Rule Passed","Pass","1","4.1.2","5f99a7:pass" +"aria_attribute_allowed","Fail_1","ARIA attributes must be valid for the element's role","The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property","Violation","1","4.1.2","5f99a7:fail" +"aria_attribute_exists","pass","When specifying a required ARIA attribute, the value must not be empty","Rule Passed","Pass","1","4.1.2","6a7281:pass" +"aria_attribute_exists","fail_empty_attribute","When specifying a required ARIA attribute, the value must not be empty","The element attribute(s): '{0}' value is empty","Violation","1","4.1.2","6a7281:fail" +"aria_attribute_required","pass","The required attributes for the element with a role must be defined","The required attributes for the element with the role are defined","Pass","1","4.1.2","4e8ab6:pass" +"aria_attribute_required","fail_missing","The required attributes for the element with a role must be defined","Element with '{0}' role does not have the required ARIA attribute(s): '{1}'","Violation","1","4.1.2","4e8ab6:fail" +"aria_attribute_value_valid","Pass_0","ARIA property values must be valid","Rule Passed","Pass","1","4.1.2","6a7281:pass" +"aria_attribute_value_valid","Fail_1","ARIA property values must be valid","The value ""{0}"" specified for attribute '{1}' on element <{2}> is not valid","Violation","1","4.1.2","6a7281:fail" +"aria_eventhandler_role_valid","Pass_0","Elements with event handlers must have a valid ARIA role","Rule Passed","Pass","1","4.1.2","" +"aria_eventhandler_role_valid","Fail_1","Elements with event handlers must have a valid ARIA role","The <{0}> element with '{1}' does not have a valid ARIA role specified","Violation","1","4.1.2","" +"aria_hidden_nontabbable","Pass_0","A hidden element should not contain any tabbable elements","Rule Passed","Pass","2","1.3.1,4.1.2","6cfa84:pass" +"aria_hidden_nontabbable","Fail_1","A hidden element should not contain any tabbable elements","Element ""{0}"" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'","Violation","2","1.3.1,4.1.2","6cfa84:fail" +"aria_id_unique","Pass_0","The ARIA property must reference a non-empty unique id of an existing element that is visible","Rule Passed","Pass","1","4.1.2","59796f:pass | 6a7281:pass" +"aria_id_unique","Fail_1","The ARIA property must reference a non-empty unique id of an existing element that is visible","The 'id' ""{0}"" specified for the ARIA property '{1}' value is not valid","Violation","1","4.1.2","59796f:fail | 6a7281:fail" +"aria_widget_labelled","Pass_0","Interactive component must have a programmatically associated name","Rule Passed","Pass","1","4.1.2","m6b1q3:pass" +"aria_widget_labelled","Fail_1","Interactive component must have a programmatically associated name","Interactive component with ARIA role '{0}' does not have a programmatically associated name","Violation","1","4.1.2","m6b1q3:fail" +"frame_title_exists","Pass_0","Inline frames must have a unique, non-empty 'title' attribute","Rule Passed","Pass","3","4.1.2","cae760:pass" +"frame_title_exists","Fail_1","Inline frames must have a unique, non-empty 'title' attribute","Inline frame does not have a 'title' attribute","Violation","3","4.1.2","cae760:fail" +"list_children_valid","Pass_0","List component with ""group"" role must limit children to <listitem> elements","Rule Passed","Pass","1","4.1.2","" +"list_children_valid","Fail_1","List component with ""group"" role must limit children to <listitem> elements","List component with ""group"" role has children that are not <listitem> elements","Violation","1","4.1.2","" +"aria_attribute_conflict","fail_conflict","An ARIA attribute must not conflict with the corresponding HTML attribute","The ARIA attribute ""{0}"" is in conflict with the corresponding HTML attribute ""{1}""","Violation","1","4.1.2","" +"table_aria_descendants","explicit_role","Table structure elements cannot specify an explicit 'role' within table containers","An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification","Violation","1","4.1.2","" +"aria_attribute_redundant","pass","An ARIA attribute should not be redundant with a corresponding HTML attribute","The ARIA attribute is not redundant with a corresponding HTML attribute","Pass","1","4.1.2","" +"aria_attribute_redundant","fail_redundant","An ARIA attribute should not be redundant with a corresponding HTML attribute","The ARIA attribute ""{0}"" is redundant with the HTML attribute ""{1}""","Rec","1","4.1.2","" +"aria_accessiblename_exists","fail_no_accessible_name","Elements with certain roles should have accessible names","Element <{0}> with ""{1}"" role has no accessible name","Rec | Rec","1 | 1","4.1.2 | ARIA","" +"canvas_content_described","Pass_0","The <canvas> element may not be accessible","Rule Passed","Pass","3","1.1.1,2.1.1,4.1.2","" +"canvas_content_described","Manual_1","The <canvas> element may not be accessible","Verify accessibility of the <canvas> element","Rec Manual","3","1.1.1,2.1.1,4.1.2","" +"element_accesskey_unique","Pass_0","'accesskey' attribute values on each element must be unique for the page","Rule Passed","Pass","3","HTML","" +"element_accesskey_unique","Fail_1","'accesskey' attribute values on each element must be unique for the page","'accesskey' attribute value on the element is not unique","Violation","3","HTML","" +"element_id_unique","pass","Element 'id' attribute values must be unique within a document","Rule Passed","Pass","3","HTML","3ea0c8:pass" +"element_id_unique","potential_empty","Element 'id' attribute values must be unique within a document","The <{0}> element has the id ""{1}"" that is empty","Violation Potential","3","HTML","3ea0c8:pass" +"element_id_unique","potential_in_use","Element 'id' attribute values must be unique within a document","The <{0}> element has the id ""{1}"" that is already in use","Violation Potential","3","HTML","3ea0c8:fail" +"element_attribute_deprecated","pass","Avoid use of obsolete features if possible","Rule Passed","Pass","3","HTML","" +"element_attribute_deprecated","fail_elem","Avoid use of obsolete features if possible","The <{0}> element is deprecated in HTML 5","Rec","3","HTML","" +"element_attribute_deprecated","fail_attr","Avoid use of obsolete features if possible","The HTML attribute(s) ""{0}"" is deprecated in HTML 5","Rec","3","HTML","" +"element_attribute_deprecated","fail_elem_attr","Avoid use of obsolete features if possible","The HTML attribute(s) ""{0}"" is deprecated for the <{1}> element in HTML 5","Rec","3","HTML","" +"aria_attribute_valid","Pass","ARIA attributes should be valid for the element and ARIA role to which they are assigned","ARIA attributes are valid for the element and ARIA role","Pass","1","ARIA","5c01ea:pass | 46ca7f:pass" +"aria_attribute_valid","Fail_invalid_role_attr","ARIA attributes should be valid for the element and ARIA role to which they are assigned","The ARIA attributes ""{0}"" are not valid for the element <{1}> with ARIA role ""{2}""","Violation","1","ARIA","5c01ea:fail | 46ca7f:fail" +"aria_attribute_valid","Fail_invalid_implicit_role_attr","ARIA attributes should be valid for the element and ARIA role to which they are assigned","The ARIA attributes ""{0}"" are not valid for the element <{1}> with implicit ARIA role ""{2}""","Violation","1","ARIA","5c01ea:fail | 46ca7f:fail" +"img_alt_null","potential_aria_override","When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used","The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute","Violation Potential | Violation Potential","1 | 1","1.1.1 | ARIA","46ca7f:fail" +"aria_attribute_deprecated","fail_aria_role","No deprecated ARIA role or attribute should be used","The ARIA role ""{0}"" is deprecated in the ARIA specification","Rec","3","ARIA","" +"aria_attribute_deprecated","fail_aria_attr","No deprecated ARIA role or attribute should be used","The ARIA attributes ""{0}"" are deprecated in the ARIA specification","Rec","3","ARIA","" +"aria_attribute_deprecated","fail_role_attr","No deprecated ARIA role or attribute should be used","The ARIA attributes ""{0}"" are deprecated for the role ""{1}"" in the ARIA specification","Rec","3","ARIA","" +"aria_role_redundant","pass","An explicitly-assigned ARIA role should not be redundant with the implicit role of the element","An explicitly-assigned ARIA role is not redundant with the implicit role of the element","Pass","3","ARIA","" +"aria_role_redundant","fail_redundant","An explicitly-assigned ARIA role should not be redundant with the implicit role of the element","The explicitly-assigned ARIA role ""{0}"" is redundant with the implicit role of the element <{1}>","Rec","3","ARIA","" +"aria_accessiblename_exists","fail_no_accessible_name_image","Elements with certain roles should have accessible names","Element <{0}> with ""{1}"" role has no accessible name","Rec | Rec","1 | 1","4.1.2 | ARIA","23a2a8:fail" diff --git a/rule-server/src/static/archives/2026.09.02/doc/rules.html b/rule-server/src/static/archives/2026.09.02/doc/rules.html new file mode 100644 index 000000000..617538b86 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/doc/rules.html @@ -0,0 +1,19973 @@ +<html lang="en-US"> + <head> + <title>Accessibility Checker Rules</title> + <link rel="icon" href="https://ibm.com/able/favicon-32x32.png" type="image/png"> + <link rel="icon" href="https://ibm.com/able/favicon.svg" type="image/svg+xml"> + <link rel="stylesheet" href="./common/rules.css" /> + <script type="module"> + import "https://1.www.s81c.com/common/carbon/web-components/version/v1.35.0/code-snippet.min.js"; + import "https://1.www.s81c.com/common/carbon/web-components/version/v1.35.0/list.min.js"; + import "https://1.www.s81c.com/common/carbon/web-components/version/v1.35.0/content-switcher.min.js"; + </script> + <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> + <script> + function hookEvents() { + let mainSwitcher = document.getElementById("rsSwitcher"); + mainSwitcher.addEventListener("bx-content-switcher-selected", (evt) => { + let oldValue = mainSwitcher.getAttribute("value") || "IBM_Accessibility"; + let newValue = mainSwitcher.value; + document.getElementById(oldValue).style.display="none"; + document.getElementById(newValue).style.display="block"; + }) + } + </script> + <head> + <body onload="hookEvents();"> + <main> + <bx-content-switcher value="IBM_Accessibility" id="rsSwitcher"> + <bx-content-switcher-item value="IBM_Accessibility">IBM Accessibility 7.3</bx-content-switcher-item><bx-content-switcher-item value="IBM_Accessibility_next">IBM Accessibility next</bx-content-switcher-item><bx-content-switcher-item value="WCAG_2_2">WCAG 2.2 (A, AA)</bx-content-switcher-item><bx-content-switcher-item value="WCAG_2_1">WCAG 2.1 (A, AA)</bx-content-switcher-item><bx-content-switcher-item value="WCAG_2_0">WCAG 2.0 (A, AA)</bx-content-switcher-item> + </bx-content-switcher> + <div id="IBM_Accessibility" style="padding: 1rem; display:block"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>svg_graphics_labelled</strong>: A non-decorative SVG element must have an accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/svg_graphics_labelled.html#%7B%22message%22%3A%22The%20SVG%20element%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">The SVG element has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.4 Orientation [AA]</h2> + <div>Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_orientation_unlocked</strong>: Elements should not be restricted to either landscape or portrait orientation using CSS transform property + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_orientation_unlocked.html#%7B%22message%22%3A%22The%20element%20%3C%7B0%7D%3E%20is%20restricted%20to%20either%20landscape%20or%20portrait%20orientation%20using%20CSS%20transform%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_locked%22%7D">The element &lt;{0}&gt; is restricted to either landscape or portrait orientation using CSS transform property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.5 Identify Input Purpose [AA]</h2> + <div>The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_autocomplete_valid</strong>: The 'autocomplete' attribute's token(s) must be appropriate for the input form field + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20the%20input%20form%20field%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_inappropriate%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for the input form field</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20an%20input%20form%20field%20of%20any%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute%20has%20an%20incorrect%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_incorrect%22%7D">The 'autocomplete' attribute has an incorrect value</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>1.4.10 Reflow [AA]</h2> + <div>Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.11 Non-text Contrast [AA]</h2> + <div>The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.12 Text Spacing [AA]</h2> + <div>No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_spacing_valid</strong>: CSS !important should not be used in inline style to control letter or word spacing or line height + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98letter-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_letter_spacing_style%22%7D">CSS !important should not be used in inline ‘letter-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98word-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_word_spacing_style%22%7D">CSS !important should not be used in inline ‘word-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98line-height%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_line_height_style%22%7D">CSS !important should not be used in inline ‘line-height’ style</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.13 Content on Hover or Focus [AA]</h2> + <div>Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_hover_persistent</strong>: The pointer should be able to move over content displayed on hover + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Confirm the pointer can be positioned over the displayed element, not just the trigger</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20all%20the%20information%20displayed%20on%20hover%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Confirm the pointer can be positioned over all the information displayed on hover</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20margin%20style%20attribute%20has%20not%20prevented%20the%20pointer%20from%20hovering%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_3%22%7D">Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.4 Character Key Shortcuts [A]</h2> + <div>If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.</div> + +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_refresh%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_label%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.11 Focus Not Obscured (Minimum) [AA]</h2> + <div>When an element receives focus, it is not entirely covered by other content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_unobscured</strong>: When an element receives focus, it is not entirely covered by other content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_unobscured.html#%7B%22message%22%3A%22Confirm%20that%20when%20the%20element%20receives%20focus%2C%20it%20is%20not%20covered%20or%2C%20if%20covered%20by%20user%20action%2C%20can%20be%20uncovered%20without%20moving%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_obscured%22%7D">Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.1 Pointer Gestures [A]</h2> + <div>All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.</div> + +</div><div> + <h2>2.5.2 Pointer Cancellation [A]</h2> + <div>For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.</div> + +</div><div> + <h2>2.5.3 Label in Name [A]</h2> + <div>For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>label_name_visible</strong>: Accessible name must match or contain the visible label text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_name_visible.html#%7B%22message%22%3A%22Accessible%20name%20does%20not%20match%20or%20contain%20the%20visible%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Accessible name does not match or contain the visible label text</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.4 Motion Actuation [A]</h2> + <div>Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.</div> + +</div><div> + <h2>2.5.7 Dragging Movement [AA]</h2> + <div>All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>draggable_alternative_exists</strong>: A draggable element must have a "single pointer" alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/draggable_alternative_exists.html#%7B%22message%22%3A%22Ensure%20the%20draggable%20element%20%5C%22%7B0%7D%5C%22%20has%20a%20%5C%22single%20pointer%5C%22%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_alternative%22%7D">Ensure the draggable element "{0}" has a "single pointer" alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.8 Minimum Target Size [AA]</h2> + <div>The size of the target for pointer inputs is at least 24 by 24 CSS pixels.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>target_spacing_sufficient</strong>: The target must be sufficiently sized or spaced from other targets + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Undersized%20target%20%5C%22%7B0%7D%5C%22%20does%20not%20have%20sufficient%20spacing%20of%2012%20CSS%20pixels%20from%20another%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22violation_spacing%22%7D">Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Ensure%20the%20overlapped%20target%20%5C%22%7B0%7D%5C%22%20meets%20a%20minimum%20target%20size%20or%20has%20sufficient%20spacing%20from%20the%20overlapping%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_overlap%22%7D">Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.2.6 Consistent Help [AA]</h2> + <div>Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>3.3.7 Redundant Entry [AA]</h2> + <div>Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.</div> + +</div><div> + <h2>3.3.8 Accessible Authentication (Minimum) [AA]</h2> + <div>Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>4.1.3 Status Messages [AA]</h2> + <div>In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.</div> + +</div><div> + <h2>HTML specification [NA]</h2> + <div>The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_accesskey_unique</strong>: 'accesskey' attribute values on each element must be unique for the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_unique.html#%7B%22message%22%3A%22'accesskey'%20attribute%20value%20on%20the%20element%20is%20not%20unique%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">'accesskey' attribute value on the element is not unique</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_id_unique</strong>: Element 'id' attribute values must be unique within a document + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_id_unique.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20has%20the%20id%20%5C%22%7B1%7D%5C%22%20that%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_empty%22%7D">The &lt;{0}&gt; element has the id "{1}" that is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_id_unique.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20has%20the%20id%20%5C%22%7B1%7D%5C%22%20that%20is%20already%20in%20use%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_in_use%22%7D">The &lt;{0}&gt; element has the id "{1}" that is already in use</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_attribute_deprecated</strong>: Avoid use of obsolete features if possible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20is%20deprecated%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_elem%22%7D">The &lt;{0}&gt; element is deprecated in HTML 5</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20HTML%20attribute(s)%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_attr%22%7D">The HTML attribute(s) "{0}" is deprecated in HTML 5</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20HTML%20attribute(s)%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20for%20the%20%3C%7B1%7D%3E%20element%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_elem_attr%22%7D">The HTML attribute(s) "{0}" is deprecated for the &lt;{1}&gt; element in HTML 5</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>ARIA specification [NA]</h2> + <div>The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_attribute_valid</strong>: ARIA attributes should be valid for the element and ARIA role to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_valid.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20with%20ARIA%20role%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_role_attr%22%7D">The ARIA attributes "{0}" are not valid for the element &lt;{1}&gt; with ARIA role "{2}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_valid.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20with%20implicit%20ARIA%20role%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_implicit_role_attr%22%7D">The ARIA attributes "{0}" are not valid for the element &lt;{1}&gt; with implicit ARIA role "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'aria'%20label%20is%20not%20empty%20and%20overrides%20the%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_aria_override%22%7D">The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_deprecated</strong>: No deprecated ARIA role or attribute should be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20role%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_aria_role%22%7D">The ARIA role "{0}" is deprecated in the ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20deprecated%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_aria_attr%22%7D">The ARIA attributes "{0}" are deprecated in the ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20deprecated%20for%20the%20role%20%5C%22%7B1%7D%5C%22%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_role_attr%22%7D">The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name_image%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_redundant</strong>: An explicitly-assigned ARIA role should not be redundant with the implicit role of the element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_redundant.html#%7B%22message%22%3A%22The%20explicitly-assigned%20ARIA%20role%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20implicit%20role%20of%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element &lt;{1}&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div> + </div><div id="IBM_Accessibility_next" style="padding: 1rem; display:none"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.4 Orientation [AA]</h2> + <div>Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_orientation_unlocked</strong>: Elements should not be restricted to either landscape or portrait orientation using CSS transform property + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_orientation_unlocked.html#%7B%22message%22%3A%22The%20element%20%3C%7B0%7D%3E%20is%20restricted%20to%20either%20landscape%20or%20portrait%20orientation%20using%20CSS%20transform%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_locked%22%7D">The element &lt;{0}&gt; is restricted to either landscape or portrait orientation using CSS transform property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.5 Identify Input Purpose [AA]</h2> + <div>The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_autocomplete_valid</strong>: The 'autocomplete' attribute's token(s) must be appropriate for the input form field + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20the%20input%20form%20field%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_inappropriate%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for the input form field</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20an%20input%20form%20field%20of%20any%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute%20has%20an%20incorrect%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_incorrect%22%7D">The 'autocomplete' attribute has an incorrect value</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>1.4.10 Reflow [AA]</h2> + <div>Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.11 Non-text Contrast [AA]</h2> + <div>The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.12 Text Spacing [AA]</h2> + <div>No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_spacing_valid</strong>: CSS !important should not be used in inline style to control letter or word spacing or line height + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98letter-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_letter_spacing_style%22%7D">CSS !important should not be used in inline ‘letter-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98word-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_word_spacing_style%22%7D">CSS !important should not be used in inline ‘word-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98line-height%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_line_height_style%22%7D">CSS !important should not be used in inline ‘line-height’ style</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.13 Content on Hover or Focus [AA]</h2> + <div>Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_hover_persistent</strong>: The pointer should be able to move over content displayed on hover + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Confirm the pointer can be positioned over the displayed element, not just the trigger</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20all%20the%20information%20displayed%20on%20hover%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Confirm the pointer can be positioned over all the information displayed on hover</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20margin%20style%20attribute%20has%20not%20prevented%20the%20pointer%20from%20hovering%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_3%22%7D">Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.4 Character Key Shortcuts [A]</h2> + <div>If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.</div> + +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_refresh%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_label%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.11 Focus Not Obscured (Minimum) [AA]</h2> + <div>When an element receives focus, it is not entirely covered by other content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_unobscured</strong>: When an element receives focus, it is not entirely covered by other content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_unobscured.html#%7B%22message%22%3A%22Confirm%20that%20when%20the%20element%20receives%20focus%2C%20it%20is%20not%20covered%20or%2C%20if%20covered%20by%20user%20action%2C%20can%20be%20uncovered%20without%20moving%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_obscured%22%7D">Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.1 Pointer Gestures [A]</h2> + <div>All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.</div> + +</div><div> + <h2>2.5.2 Pointer Cancellation [A]</h2> + <div>For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.</div> + +</div><div> + <h2>2.5.3 Label in Name [A]</h2> + <div>For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>label_name_visible</strong>: Accessible name must match or contain the visible label text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_name_visible.html#%7B%22message%22%3A%22Accessible%20name%20does%20not%20match%20or%20contain%20the%20visible%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Accessible name does not match or contain the visible label text</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.4 Motion Actuation [A]</h2> + <div>Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.</div> + +</div><div> + <h2>2.5.7 Dragging Movement [AA]</h2> + <div>All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>draggable_alternative_exists</strong>: A draggable element must have a "single pointer" alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/draggable_alternative_exists.html#%7B%22message%22%3A%22Ensure%20the%20draggable%20element%20%5C%22%7B0%7D%5C%22%20has%20a%20%5C%22single%20pointer%5C%22%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_alternative%22%7D">Ensure the draggable element "{0}" has a "single pointer" alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.8 Minimum Target Size [AA]</h2> + <div>The size of the target for pointer inputs is at least 24 by 24 CSS pixels.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>target_spacing_sufficient</strong>: The target must be sufficiently sized or spaced from other targets + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Undersized%20target%20%5C%22%7B0%7D%5C%22%20does%20not%20have%20sufficient%20spacing%20of%2012%20CSS%20pixels%20from%20another%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22violation_spacing%22%7D">Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Ensure%20the%20overlapped%20target%20%5C%22%7B0%7D%5C%22%20meets%20a%20minimum%20target%20size%20or%20has%20sufficient%20spacing%20from%20the%20overlapping%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_overlap%22%7D">Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.2.6 Consistent Help [AA]</h2> + <div>Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>3.3.7 Redundant Entry [AA]</h2> + <div>Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.</div> + +</div><div> + <h2>3.3.8 Accessible Authentication (Minimum) [AA]</h2> + <div>Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>4.1.3 Status Messages [AA]</h2> + <div>In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.</div> + +</div><div> + <h2>HTML specification [NA]</h2> + <div>The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_accesskey_unique</strong>: 'accesskey' attribute values on each element must be unique for the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_unique.html#%7B%22message%22%3A%22'accesskey'%20attribute%20value%20on%20the%20element%20is%20not%20unique%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">'accesskey' attribute value on the element is not unique</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_id_unique</strong>: Element 'id' attribute values must be unique within a document + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_id_unique.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20has%20the%20id%20%5C%22%7B1%7D%5C%22%20that%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_empty%22%7D">The &lt;{0}&gt; element has the id "{1}" that is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_id_unique.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20has%20the%20id%20%5C%22%7B1%7D%5C%22%20that%20is%20already%20in%20use%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_in_use%22%7D">The &lt;{0}&gt; element has the id "{1}" that is already in use</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_attribute_deprecated</strong>: Avoid use of obsolete features if possible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20is%20deprecated%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_elem%22%7D">The &lt;{0}&gt; element is deprecated in HTML 5</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20HTML%20attribute(s)%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_attr%22%7D">The HTML attribute(s) "{0}" is deprecated in HTML 5</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20HTML%20attribute(s)%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20for%20the%20%3C%7B1%7D%3E%20element%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_elem_attr%22%7D">The HTML attribute(s) "{0}" is deprecated for the &lt;{1}&gt; element in HTML 5</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>ARIA specification [NA]</h2> + <div>The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_attribute_valid</strong>: ARIA attributes should be valid for the element and ARIA role to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_valid.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20with%20ARIA%20role%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_role_attr%22%7D">The ARIA attributes "{0}" are not valid for the element &lt;{1}&gt; with ARIA role "{2}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_valid.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20with%20implicit%20ARIA%20role%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_implicit_role_attr%22%7D">The ARIA attributes "{0}" are not valid for the element &lt;{1}&gt; with implicit ARIA role "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'aria'%20label%20is%20not%20empty%20and%20overrides%20the%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_aria_override%22%7D">The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_deprecated</strong>: No deprecated ARIA role or attribute should be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20role%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_aria_role%22%7D">The ARIA role "{0}" is deprecated in the ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20deprecated%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_aria_attr%22%7D">The ARIA attributes "{0}" are deprecated in the ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20deprecated%20for%20the%20role%20%5C%22%7B1%7D%5C%22%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_role_attr%22%7D">The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name_image%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_redundant</strong>: An explicitly-assigned ARIA role should not be redundant with the implicit role of the element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_redundant.html#%7B%22message%22%3A%22The%20explicitly-assigned%20ARIA%20role%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20implicit%20role%20of%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element &lt;{1}&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div> + </div><div id="WCAG_2_2" style="padding: 1rem; display:none"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>svg_graphics_labelled</strong>: A non-decorative SVG element must have an accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/svg_graphics_labelled.html#%7B%22message%22%3A%22The%20SVG%20element%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">The SVG element has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.4 Orientation [AA]</h2> + <div>Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_orientation_unlocked</strong>: Elements should not be restricted to either landscape or portrait orientation using CSS transform property + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_orientation_unlocked.html#%7B%22message%22%3A%22The%20element%20%3C%7B0%7D%3E%20is%20restricted%20to%20either%20landscape%20or%20portrait%20orientation%20using%20CSS%20transform%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_locked%22%7D">The element &lt;{0}&gt; is restricted to either landscape or portrait orientation using CSS transform property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.5 Identify Input Purpose [AA]</h2> + <div>The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_autocomplete_valid</strong>: The 'autocomplete' attribute's token(s) must be appropriate for the input form field + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20the%20input%20form%20field%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_inappropriate%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for the input form field</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20an%20input%20form%20field%20of%20any%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute%20has%20an%20incorrect%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_incorrect%22%7D">The 'autocomplete' attribute has an incorrect value</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>1.4.10 Reflow [AA]</h2> + <div>Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.11 Non-text Contrast [AA]</h2> + <div>The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.12 Text Spacing [AA]</h2> + <div>No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_spacing_valid</strong>: CSS !important should not be used in inline style to control letter or word spacing or line height + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98letter-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_letter_spacing_style%22%7D">CSS !important should not be used in inline ‘letter-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98word-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_word_spacing_style%22%7D">CSS !important should not be used in inline ‘word-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98line-height%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_line_height_style%22%7D">CSS !important should not be used in inline ‘line-height’ style</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.13 Content on Hover or Focus [AA]</h2> + <div>Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_hover_persistent</strong>: The pointer should be able to move over content displayed on hover + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Confirm the pointer can be positioned over the displayed element, not just the trigger</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20all%20the%20information%20displayed%20on%20hover%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Confirm the pointer can be positioned over all the information displayed on hover</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20margin%20style%20attribute%20has%20not%20prevented%20the%20pointer%20from%20hovering%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_3%22%7D">Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.4 Character Key Shortcuts [A]</h2> + <div>If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.</div> + +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_refresh%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_label%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.11 Focus Not Obscured (Minimum) [AA]</h2> + <div>When an element receives focus, it is not entirely covered by other content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_unobscured</strong>: When an element receives focus, it is not entirely covered by other content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_unobscured.html#%7B%22message%22%3A%22Confirm%20that%20when%20the%20element%20receives%20focus%2C%20it%20is%20not%20covered%20or%2C%20if%20covered%20by%20user%20action%2C%20can%20be%20uncovered%20without%20moving%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_obscured%22%7D">Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.1 Pointer Gestures [A]</h2> + <div>All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.</div> + +</div><div> + <h2>2.5.2 Pointer Cancellation [A]</h2> + <div>For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.</div> + +</div><div> + <h2>2.5.3 Label in Name [A]</h2> + <div>For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>label_name_visible</strong>: Accessible name must match or contain the visible label text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_name_visible.html#%7B%22message%22%3A%22Accessible%20name%20does%20not%20match%20or%20contain%20the%20visible%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Accessible name does not match or contain the visible label text</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.4 Motion Actuation [A]</h2> + <div>Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.</div> + +</div><div> + <h2>2.5.7 Dragging Movement [AA]</h2> + <div>All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>draggable_alternative_exists</strong>: A draggable element must have a "single pointer" alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/draggable_alternative_exists.html#%7B%22message%22%3A%22Ensure%20the%20draggable%20element%20%5C%22%7B0%7D%5C%22%20has%20a%20%5C%22single%20pointer%5C%22%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_alternative%22%7D">Ensure the draggable element "{0}" has a "single pointer" alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.8 Minimum Target Size [AA]</h2> + <div>The size of the target for pointer inputs is at least 24 by 24 CSS pixels.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>target_spacing_sufficient</strong>: The target must be sufficiently sized or spaced from other targets + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Undersized%20target%20%5C%22%7B0%7D%5C%22%20does%20not%20have%20sufficient%20spacing%20of%2012%20CSS%20pixels%20from%20another%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22violation_spacing%22%7D">Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Ensure%20the%20overlapped%20target%20%5C%22%7B0%7D%5C%22%20meets%20a%20minimum%20target%20size%20or%20has%20sufficient%20spacing%20from%20the%20overlapping%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_overlap%22%7D">Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.2.6 Consistent Help [AA]</h2> + <div>Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>3.3.7 Redundant Entry [AA]</h2> + <div>Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.</div> + +</div><div> + <h2>3.3.8 Accessible Authentication (Minimum) [AA]</h2> + <div>Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>4.1.3 Status Messages [AA]</h2> + <div>In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.</div> + +</div> + </div><div id="WCAG_2_1" style="padding: 1rem; display:none"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>svg_graphics_labelled</strong>: A non-decorative SVG element must have an accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/svg_graphics_labelled.html#%7B%22message%22%3A%22The%20SVG%20element%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">The SVG element has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.4 Orientation [AA]</h2> + <div>Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_orientation_unlocked</strong>: Elements should not be restricted to either landscape or portrait orientation using CSS transform property + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_orientation_unlocked.html#%7B%22message%22%3A%22The%20element%20%3C%7B0%7D%3E%20is%20restricted%20to%20either%20landscape%20or%20portrait%20orientation%20using%20CSS%20transform%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_locked%22%7D">The element &lt;{0}&gt; is restricted to either landscape or portrait orientation using CSS transform property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.5 Identify Input Purpose [AA]</h2> + <div>The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_autocomplete_valid</strong>: The 'autocomplete' attribute's token(s) must be appropriate for the input form field + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20the%20input%20form%20field%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_inappropriate%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for the input form field</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20an%20input%20form%20field%20of%20any%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute%20has%20an%20incorrect%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_incorrect%22%7D">The 'autocomplete' attribute has an incorrect value</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>1.4.10 Reflow [AA]</h2> + <div>Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.11 Non-text Contrast [AA]</h2> + <div>The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.12 Text Spacing [AA]</h2> + <div>No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_spacing_valid</strong>: CSS !important should not be used in inline style to control letter or word spacing or line height + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98letter-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_letter_spacing_style%22%7D">CSS !important should not be used in inline ‘letter-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98word-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_word_spacing_style%22%7D">CSS !important should not be used in inline ‘word-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98line-height%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_line_height_style%22%7D">CSS !important should not be used in inline ‘line-height’ style</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.13 Content on Hover or Focus [AA]</h2> + <div>Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_hover_persistent</strong>: The pointer should be able to move over content displayed on hover + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Confirm the pointer can be positioned over the displayed element, not just the trigger</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20all%20the%20information%20displayed%20on%20hover%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Confirm the pointer can be positioned over all the information displayed on hover</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20margin%20style%20attribute%20has%20not%20prevented%20the%20pointer%20from%20hovering%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_3%22%7D">Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.4 Character Key Shortcuts [A]</h2> + <div>If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.</div> + +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_refresh%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_label%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.1 Pointer Gestures [A]</h2> + <div>All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.</div> + +</div><div> + <h2>2.5.2 Pointer Cancellation [A]</h2> + <div>For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.</div> + +</div><div> + <h2>2.5.3 Label in Name [A]</h2> + <div>For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>label_name_visible</strong>: Accessible name must match or contain the visible label text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_name_visible.html#%7B%22message%22%3A%22Accessible%20name%20does%20not%20match%20or%20contain%20the%20visible%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Accessible name does not match or contain the visible label text</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.4 Motion Actuation [A]</h2> + <div>Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.</div> + +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>4.1.3 Status Messages [AA]</h2> + <div>In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.</div> + +</div> + </div><div id="WCAG_2_0" style="padding: 1rem; display:none"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>svg_graphics_labelled</strong>: A non-decorative SVG element must have an accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/svg_graphics_labelled.html#%7B%22message%22%3A%22The%20SVG%20element%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">The SVG element has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_refresh%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_label%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div> + </div> + </main> + </body> +</html> \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.09.02/js/ace-debug.js b/rule-server/src/static/archives/2026.09.02/js/ace-debug.js new file mode 100644 index 000000000..1e89ffce2 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/js/ace-debug.js @@ -0,0 +1,38614 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * 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. + */ +var ace; +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/v2/aria/ARIADefinitions.ts" +/*!****************************************!*\ + !*** ./src/v2/aria/ARIADefinitions.ts ***! + \****************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIADefinitions = void 0; +var ARIADefinitions = /** @class */ (function () { + function ARIADefinitions() { + } + ARIADefinitions.nameFromContent = function (role) { + return (role in ARIADefinitions.designPatterns) + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"); + }; + /* + * array of WAI-ARIA global states and properties + * @see https://www.w3.org/TR/wai-aria-1.2/#global_states + */ + ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby", + "aria-details", "aria-flowto", "aria-hidden", "aria-keyshortcuts", + "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription" + // the following are deprecated in ARIA 1.2, will indicate deprecation in individual role + , + 'aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid' + ]; + //properties contains id(s) that refer to other element(s) + ARIADefinitions.referenceProperties = ["aria-owns", "aria-controls", "aria-describedby", "aria-labelledby", "aria-flowto", "aria-activedescendant"]; + // deprecated roles + ARIADefinitions.globalDeprecatedRoles = [ + 'directory', 'doc-biblioentry', 'doc-endnote' + ]; + // the following are deprecated in ARIA 1.1 for all the roles + ARIADefinitions.globalDeprecatedProperties = [ + 'aria-grabbed', 'aria-dropeffect' + ]; + /* + * XSD data types for all WAI-ARIA properties + * along with valid values when the data type is NMTOKEN + * WAI-ARIA properties data types explaned: + * type: Used to identify the type of values allowed for the WAI-ARIA property + * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken + * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID + * true: refers to WAI-ARIA property supports hidden ID references + * false: refers to WAI-ARIA property does not support hidden ID references + * Default value will be set to false, if not specified. + */ + ARIADefinitions.propertyDataTypes = { + "aria-activedescendant": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-atomic": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-autocomplete": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty + }, + "aria-busy": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-checked": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-colcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-controls": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-current": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value + }, + "aria-describedby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-details": { + type: "http://www.w3.org/2001/XMLSchema#idrefs" + }, + "aria-disabled": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-dropeffect": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["copy", "move", "link", "execute", "popup", "none"] + }, + "aria-errormessage": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-expanded": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-flowto": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: false + }, + "aria-grabbed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-haspopup": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"] + }, + "aria-hidden": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-invalid": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value + }, + "aria-keyshortcuts": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-label": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-labelledby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-level": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-live": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["off", "polite", "assertive"] + }, + "aria-modal": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiline": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiselectable": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-orientation": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["horizontal", "vertical", "undefined"] + }, + "aria-owns": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-placeholder": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-posinset": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-pressed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-readonly": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-relevant": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["additions", "removals", "text", "all"] + }, + "aria-required": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-roledescription": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-rowcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-selected": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-setsize": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-sort": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["ascending", "descending", "other", "none"] + }, + "aria-valuemax": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuemin": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuenow": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuetext": { + type: "http://www.w3.org/2001/XMLSchema#string" + } + }; + /* + * design patterns for concrete WAI-ARIA roles + * legitimate keys for each role include: + * + * - container: appropriate container(s) for that role + * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above) + * - reqProps: required states or properties for this role + * - reqChildren: required children for this role + * - htmlEquiv: HTML equivalent for this role + * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization) + * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.) + * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.) + * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s) + */ + ARIADefinitions.designPatterns = { + "alert": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "alertdialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "application": { + container: null, + props: ["aria-activedescendant", "aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "article": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "banner": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "blockquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "button": { + container: null, + props: ["aria-expanded", "aria-pressed"], + reqProps: null, + reqChildren: null, + htmlEquiv: "button | input[@type='button']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "caption": { + container: ["figure", "grid", "table", "treegrid"], + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "cell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "checkbox": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='checkbox']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "code": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "columnheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='col']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "combobox": { + container: null, + props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-readonly", "aria-required"], + reqProps: ["aria-expanded"], + reqChildren: [], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "complementary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "comment": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "contentinfo": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "definition": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "deletion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "dialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "directory": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecated: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "doc-abstract": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-acknowledgments": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-afterword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-appendix": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-backlink": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-biblioentry": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-bibliography": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-biblioref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-chapter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-colophon": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-conclusion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-cover": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true + }, + "doc-credit": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-credits": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-dedication": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnote": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnotes": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-epigraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-epilogue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-errata": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-example": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-footnote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-foreword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-index": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-introduction": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-noteref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-notice": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagebreak": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "doc-pagelist": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagefooter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-pageheader": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-part": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-preface": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-prologue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pullquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-qna": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-subtitle": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"] + }, + "doc-tip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-toc": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "emphasis": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "feed": { + container: null, + props: null, + reqProps: null, + reqChildren: ["article"], + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "figure": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "form": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "form", + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "generic": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "div | span", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby", "aria-roledescription"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "graphics-document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"] + }, + "graphics-object": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: false, + nameFrom: ["author"] + }, + "graphics-symbol": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "grid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-readonly", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: "table", + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "gridcell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "widget", + nameFrom: ["author", "contents"] + }, + "group": { + container: null, + props: ["aria-activedescendant"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "heading": { + container: null, + props: null, + reqProps: ["aria-level"], + reqChildren: null, + htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "img": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "image": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "insertion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "link": { + container: null, + props: ["aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "list": { + container: null, + props: null, + reqProps: null, + reqChildren: ["listitem"], + htmlEquiv: "ol | ul", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "listbox": { + container: null, + props: ["aria-activedescendant", "aria-expanded", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["group", "option"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "listitem": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "log": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "main": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "mark": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "mark", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "marquee": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "math": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: false, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menu": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menubar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menuitem": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemcheckbox": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemradio": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "meter": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "navigation": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "none": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "note": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "option": { + container: ["group", "listbox"], + props: ["aria-selected", "aria-checked", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "option", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "paragraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "presentation": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "progressbar": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radio": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='radio']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radiogroup": { + container: null, + props: ["aria-activedescendant", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["radio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "region": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "row": { + container: ["grid", "rowgroup", "table", "treegrid"], + props: ["aria-activedescendant", "aria-colindex", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: ["cell", "columnheader", "gridcell", "rowheader"], + htmlEquiv: "tr", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowgroup": { + container: ["grid", "table", "treegrid"], + props: [], + reqProps: null, + reqChildren: ["row"], + htmlEquiv: "tbody | tfoot | thead", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='row']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "scrollbar": { + container: null, + props: ["aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-controls", "aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "search": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "searchbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='search']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "separator": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "slider": { + container: null, + props: ["aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "spinbutton": { + container: null, + props: ["aria-activedescendant", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "status": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "strong": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "subscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "suggestion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "superscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "switch": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "tab": { + container: ["tablist"], + props: ["aria-expanded", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "table": { + container: null, + props: ["aria-colcount", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup", "caption"], + htmlEquiv: "table", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tablist": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation"], + reqProps: null, + reqChildren: ["tab"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tabpanel": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "term": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "dfn", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "textbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='text']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "time": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "timer": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "toolbar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tooltip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tree": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation", "aria-required"], + reqProps: null, + reqChildren: ["group", "treeitem"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treegrid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treeitem": { + container: ["group", "tree"], + props: ["aria-checked", "aria-expanded", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + }; // end designPatterns + // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements + // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary + // https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled + /** note: + * if a <fieldset> is disabled, the descendant form controls are all disabled except <legend> + * If an <optgroup> is disabled, the select is still interactive (unless otherwise disabled), but none of the items in the option group are selectable. + * When an element has the disabled attribute applied, the :disabled pseudo-class also applies to it. + */ + ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element + ARIADefinitions.elementsAllowedRequired = ["select", "textarea"]; // remove 'input' and add to the individual element, becuase required is not supported on input@type="range", "color", "hidden" or any button types + ARIADefinitions.elementsAllowedReadOnly = ["textarea"]; // remove 'input' and add to the individual element, because readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types + /* https://www.w3.org/TR/html-aria/#docconformance + * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value + * documentConformanceRequirementSpecialTags contains those tags that require special considerations + */ + ARIADefinitions.documentConformanceRequirement = { + "abbr": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "address": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "article": { + implicitRole: ["article"], + validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"], + globalAriaAttributesValid: true + }, + "aside": { + implicitRole: ["complementary"], + validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-glossary", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"], + globalAriaAttributesValid: true + }, + "audio": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "b": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "base": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "bdi": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "bdo": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "blockquote": { + implicitRole: ["blockquote"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "body": { + implicitRole: ["generic"], + validRoles: null, + otherDisallowedAriaAttributes: ['aria-hidden'], + globalAriaAttributesValid: true + }, + "br": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "canvas": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "caption": { + implicitRole: ['caption'], + validRoles: null, + globalAriaAttributesValid: true, + allowAttributesFromImplicitRole: false + }, + "cite": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "code": { + implicitRole: ["code"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "col": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "colgroup": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "data": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "datalist": { + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "dd": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "del": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "details": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "dfn": { + implicitRole: ["term"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "dialog": { + implicitRole: ["dialog"], + validRoles: ["alertdialog"], + globalAriaAttributesValid: true + }, + "dl": { + implicitRole: null, + validRoles: ["group", "list", "none", "presentation"], + globalAriaAttributesValid: true + }, + "dt": { + implicitRole: ["term"], + validRoles: ["listitem"], + globalAriaAttributesValid: true + }, + "em": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "embed": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "fieldset": { + implicitRole: ["group"], + validRoles: ["none", "presentation", "radiogroup"], + globalAriaAttributesValid: true + }, + "figcaption": { + implicitRole: null, + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "form": { + implicitRole: ["form"], + validRoles: ["none", "presentation", "search"], + globalAriaAttributesValid: true + }, + "head": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "hgroup": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "h1": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h2": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h3": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h4": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h5": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h6": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "hr": { + implicitRole: ["separator"], + validRoles: ["doc-pagebreak", "none", "presentation"], + globalAriaAttributesValid: true + }, + "html": { + implicitRole: ["document"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "i": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "iframe": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "ins": { + implicitRole: ["insertion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "kbd": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "label": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "legend": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "link": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "main": { + implicitRole: ["main"], + validRoles: null, + globalAriaAttributesValid: true + }, + "map": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "mark": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "math": { + implicitRole: ["math"], + validRoles: null, + globalAriaAttributesValid: true + }, + "menu": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "meta": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "meter": { + implicitRole: ["meter"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ['aria-valuemax', 'aria-valuemin'], + allowAttributesFromImplicitRole: false + }, + "nav": { + implicitRole: ["navigation"], + validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist", "none", "presentation"], + globalAriaAttributesValid: true + }, + "noscript": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "object": { + implicitRole: null, + validRoles: ["application", "document", "img"], + globalAriaAttributesValid: true + }, + "ol": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "optgroup": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "option": { + implicitRole: ["option"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-selected"] + }, + "output": { + implicitRole: ["status"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "p": { + implicitRole: ["paragraph"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "param": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "picture": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "pre": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "progress": { + implicitRole: ["progressbar"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax"] + }, + "q": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rp": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rt": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "ruby": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "s": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-label", "aria-labelledby"] + }, + "samp": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "script": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "search": { + implicitRole: ['search'], + validRoles: ['search', 'form', 'group', 'none', 'presentation', 'region'], + globalAriaAttributesValid: true + }, + "slot": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "small": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "source": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "span": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "strong": { + implicitRole: ["strong"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "style": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "sub": { + implicitRole: ["subscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "sup": { + implicitRole: ["superscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "svg": { + implicitRole: ["graphics-document"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "table": { + implicitRole: ["table"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "template": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "textarea": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "tfoot": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "thead": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "time": { + implicitRole: ["time"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "title": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "track": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "u": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "ul": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "var": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "video": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "wbr": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + } + }; // end documentConformanceRequirement + ARIADefinitions.documentConformanceRequirementSpecialTags = { + "a": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-disabled=true"] + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "area": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["button", "link"], + globalAriaAttributesValid: true + } + }, + // TODO + // "autonomous custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."], + // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "div": { + "child-dl": { + implicitRole: ["generic"], + validRoles: ["presentation", "none"], + globalAriaAttributesValid: true + }, + "no-child-dl": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "figure": { + "child-figcaption": { + implicitRole: ["figure"], + validRoles: ['doc-example'], + globalAriaAttributesValid: true + }, + "no-child-figcaption": { + implicitRole: ["figure"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "footer": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["contentinfo"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + // TODO + // "form-associated custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise 'generic'."], + // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "header": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["banner"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + "img": { + "img-with-accname": { + implicitRole: ["img"], + //roleCondition: "when accessible name presents", + validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "meter", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "img-without-accname-empty-alt": { + implicitRole: ["presentation", "none"], + //roleCondition: "when no accessible name presents and alt=''", + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + }, + "img-without-accname-no-alt": { + implicitRole: ["img"], + //roleCondition: "when neither accessible name no alt presents", + validRoles: ["presentation", "none"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + } + }, + "input": { + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "checkbox-with-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is present", + validRoles: ["menuitemcheckbox", "option", "switch", "button"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "checkbox-without-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is not present", + validRoles: ["menuitemcheckbox", "option", "switch"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "color": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "date": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "datetime-local": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=email and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "file": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + }, + "hidden": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "image": { + implicitRole: ["button"], + validRoles: ["checkbox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "month": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "number": { + implicitRole: ["spinbutton"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + }, + "password": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "radio": { + implicitRole: ["radio"], + validRoles: ["menuitemradio"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "range": { + implicitRole: ["slider"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax", "aria-valuemin"] + }, + "reset": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "search-no-list": { + implicitRole: ["searchbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "search-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "submit": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "tel-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "tel-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "text-no-list": { + implicitRole: ["textbox"], + validRoles: ["combobox", "searchbox", "spinbutton"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "text-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + // otherDisallowedAriaAttributes: ["aria-haspopup"] // covered in a different rule + }, + "time": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "url-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "url-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "week": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "default-with-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "default-no-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + } + }, + "li": { + "child-of-list-role": { + implicitRole: ['listitem'], + validRoles: null, + globalAriaAttributesValid: true + }, + "no-child-of-list-role": { + implicitRole: ['generic'], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "section": { + "with-name": { + implicitRole: ["region"], + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + }, + "without-name": { + implicitRole: null, + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + } + }, + "select": { + "no-multiple-attr-size-gt1": { + //roleCondition: " with a multiple attribute or a size attribute having value greater than 1" + implicitRole: ["combobox"], + validRoles: ["menu"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + }, + "multiple-attr-size-gt1": { + //roleCondition: " with no multiple attribute and no size attribute having value greater than 1" + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + } + }, + "summary": { + "first-summary-of-detail": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-disabled", "aria-haspopup"] + }, + "no-first-summary-of-detail": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tbody": { + "des-table": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "td": { + "des-table": { + implicitRole: ["cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "th": { + "des-table-row-scope": { + implicitRole: ["rowheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-table-column-scope": { + implicitRole: ["columnheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-row-scope": { + implicitRole: ["rowheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-column-scope": { + implicitRole: ["columnheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tr": { + "des-table": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "default": { + implicitRole: null, + //roleCondition: "", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }; // end of documentConformanceRequirementSpecialTags + // map aria attribute to the corresponding native attribute, apply to any element applicable + // note this mapping is for the related attributes in the same element without checking the parent tree. + // refer to https://w3c.github.io/html-aria/ + ARIADefinitions.relatedAriaHtmlAttributes = { + "aria-checked": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }] + }, + "aria-disabled": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }] + }, + "aria-hidden": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }, + { + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["until-found"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }] + }, + "aria-placeholder": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["placeholder"], + htmlAttributeValues: null + }] + }, + "aria-valuemax": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["max"], + htmlAttributeValues: null + }] + //overlap case covered in the role definition: Authors SHOULD NOT use aria-valuemax on any element which allows the max attribute. Use the max attribute instead. + }, + "aria-valuemin": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["min"], + htmlAttributeValues: null + }] + ////overlap case covered in the role definition:Authors SHOULD NOT use aria-valuemin on any element which allows the min attribute. Use the min attribute instead. + }, + "aria-readonly": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "false", "false"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "true", "true"] + }] + }, + "aria-required": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }] + }, + "aria-colspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["colspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["colspan"], + htmlAttributeValues: null + }] + }, + "aria-rowspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: null + }] + }, + /** "aria-autocomplete": { + conflict: [{ + // conflict occurs if both exists, aria value is only for custom widget, rather than native + ariaAttributeValue: null, + htmlAttributeNames: ["autocomplete"], + htmlAttributeValues: null + }] + } */ + }; + ARIADefinitions.containers = []; + return ARIADefinitions; +}()); +exports.ARIADefinitions = ARIADefinitions; +; +var containerArray = []; +for (var roleDesign in ARIADefinitions.designPatterns) { + var containers = ARIADefinitions.designPatterns[roleDesign].container; + if (containers !== null) { + for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) { + var container = containers_1[_i]; + if (containerArray.indexOf(container) == -1) { + containerArray.push(container); + } + } + } +} +ARIADefinitions.containers = containerArray; + + +/***/ }, + +/***/ "./src/v2/aria/ARIAMapper.ts" +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAMapper.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAMapper = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ./ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../../v4/util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../v4/util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAWalker_1 = __webpack_require__(/*! ./ARIAWalker */ "./src/v2/aria/ARIAWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../../v4/util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var ARIAMapper = /** @class */ (function (_super) { + __extends(ARIAMapper, _super); + function ARIAMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + ARIAMapper.prototype.childrenCanHaveRole = function (node, role) { + // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = node as Element; + // if (elem.getAttribute("aria-hidden") === "true") { + // return false; + // } + // } + return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren); + }; + ARIAMapper.prototype.getRole = function (node) { + var role = ARIAMapper.nodeToRole(node); + return role; + }; + ARIAMapper.prototype.getNamespace = function () { + return "aria"; + }; + ARIAMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "ARIAMapper::getAttributes", undefined); + if (typeof cacheVal !== "undefined") + return cacheVal; + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + var name_1 = attrInfo.name.toLowerCase(); + if (name_1.startsWith("aria-")) { + retVal[name_1.substring(5)] = attrInfo.nodeValue; + } + } + // Optimize: Cache nodeName.toLowerCase() to avoid repeated calls + var nodeName = node.nodeName.toLowerCase(); + // Apply global attributes first + ARIAMapper.applyAttrRole(elem, "global", retVal); + // Apply element-specific attributes + ARIAMapper.applyAttrRole(elem, nodeName, retVal); + CacheUtil_1.CacheUtil.setCache(node, "ARIAMapper::getAttributes", retVal); + } + else if (node.nodeType === 3 /* Node.TEXT_NODE */) { + var calculators = ARIAMapper.textAttrValueCalculators; + for (var attr in calculators) { + var val = calculators[attr](node); + if (typeof val !== "undefined" && val !== null) { + retVal[attr] = val; + } + } + } + return retVal; + }; + // Optimize: Move applyAttrRole outside getAttributes to avoid function recreation + ARIAMapper.applyAttrRole = function (elem, nodeName, retVal) { + var calculators = ARIAMapper.elemAttrValueCalculators; + if (!(nodeName in calculators)) + return; + for (var attr in calculators[nodeName]) { + if (!(attr in retVal)) { + var value = calculators[nodeName][attr]; + if (typeof value !== "undefined" && value !== null) { + if (typeof value !== "string") { + value = value(elem); + } + retVal[attr] = value; + } + } + } + }; + ARIAMapper.getAriaOwnedBy = function (elem) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + if (!CacheUtil_1.CacheUtil.getCache(doc, "ARIAMapper::precalcOwned", false)) { + var owners = doc.querySelectorAll("[aria-owns]"); + for (var iOwner = 0; iOwner < owners.length; ++iOwner) { + var owner = owners[iOwner]; + var ownIds = owner.getAttribute("aria-owns").split(/ +/g); + var _loop_1 = function (iId) { + var owned = doc.getElementById(ownIds[iId]); + //ignore if the aria-owns point to the element itself + //if (owned && !DOMUtil.sameNode(owner, owned)) { + // CacheUtil.setCache(owned, "aria-owned", owner); + //} + /** + * circular hierarchy check: + * (1) the owned element is neither the same element with the owner nor any ascendant of the owner + * (2) any child with aria-owns cannot point to the owner or any ascendant of the owner + */ + if (owned && !DOMUtil_1.DOMUtil.sameNode(owner, owned)) { + // check if the owned with aria-owns that points to another element + var ownedNodes = []; + var sub_owners = owned.querySelectorAll("[aria-owns]"); + for (var i = 0; i < sub_owners.length; ++i) { + var sub_owner = sub_owners[i]; + var sub_ownIds = sub_owner.getAttribute("aria-owns").split(/ +/g); + for (var j = 0; j < sub_ownIds.length; ++j) { + var ownedNode = doc.getElementById(sub_ownIds[j]); + if (ownedNode) + ownedNodes.push(ownedNode); + } + } + if (ownedNodes.length === 0) { + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + return "continue"; + } + // check if any aria-owns points to the element itself or any of it's parent + var parent_1 = owner; + var circular = false; + while (parent_1 !== null) { + var found = ownedNodes.some(function (item) { return DOMUtil_1.DOMUtil.sameNode(parent_1, item); }); + if (!found) + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + else { + circular = true; + break; + } + } + if (!circular) + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + } + }; + for (var iId = 0; iId < ownIds.length; ++iId) { + _loop_1(iId); + } + } + CacheUtil_1.CacheUtil.setCache(doc, "ARIAMapper::precalcOwned", true); + } + return CacheUtil_1.CacheUtil.getCache(elem, "aria-owned", null); + }; + ARIAMapper.prototype.getNodeHierarchy = function (node) { + if (!node) + return []; + if (node.nodeType !== 1) { + var parentHierarchy = this.getNodeHierarchy(DOMWalker_1.DOMWalker.parentElement(node)); + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + var nodeHierarchy = []; + // Set hierarchy + for (var _i = 0, parentHierarchy_1 = parentHierarchy; _i < parentHierarchy_1.length; _i++) { + var item = parentHierarchy_1[_i]; + nodeHierarchy.push(item); + } + nodeHierarchy.push({ + attributes: {}, + bounds: this.getBounds(node), + namespace: this.getNamespace(), + node: node, + role: this.getRole(node) || null, + rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || null), + roleCount: {}, + childrenCanHaveRole: parentInfo.childrenCanHaveRole + }); + return nodeHierarchy; + } + else { + var elem = node; + var nodeHierarchy = CacheUtil_1.CacheUtil.getCache(elem, "ARIAMapper::getNodeHierarchy", null); + if (!nodeHierarchy) { + // This element hasn't been processed yet - but ::reset processes them all in the right order + // Get details about the correct parent first + var parent_2 = ARIAMapper.getAriaOwnedBy(elem); + if (!parent_2) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + while (parent_2 && parent_2.nodeType !== 1) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + var parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + while (parentInfo.role === null) { + parent_2 = ARIAMapper.getAriaOwnedBy(parent_2) || DOMWalker_1.DOMWalker.parentElement(parent_2); + parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + parentInfo = parentHierarchy[parentHierarchy.length - 1]; + } + // Set initial node info + var nodeInfo = { + attributes: elem.nodeType === 1 ? this.getAttributes(elem) : {}, + bounds: this.getBounds(elem), + namespace: this.getNamespace(), + node: elem, + role: this.getRole(elem) || null, + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + // Adjust role if we're within a presentational container + var presentationalContainer = !parentInfo.childrenCanHaveRole; + if (presentationalContainer) { + nodeInfo.role = null; + } + else { + nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole + && this.childrenCanHaveRole(elem, nodeInfo.role); + } + // Set the paths + if (nodeInfo.role !== null) { + parentInfo.roleCount[nodeInfo.role] = (parentInfo.roleCount[nodeInfo.role] || 0) + 1; + nodeInfo.rolePath = parentInfo.rolePath + "/" + nodeInfo.role + "[" + parentInfo.roleCount[nodeInfo.role] + "]"; + } + else { + nodeInfo.rolePath = parentInfo.rolePath; + } + // Set hierarchy + nodeHierarchy = []; + for (var _a = 0, parentHierarchy_2 = parentHierarchy; _a < parentHierarchy_2.length; _a++) { + var item = parentHierarchy_2[_a]; + nodeHierarchy.push(item); + } + nodeHierarchy.push(nodeInfo); + CacheUtil_1.CacheUtil.setCache(elem, "ARIAMapper::getNodeHierarchy", nodeHierarchy); + } + return nodeHierarchy; + } + }; + ARIAMapper.prototype.reset = function (node) { + ARIAMapper.nameComputationId = 0; + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + // Get to the topmost node + var goodNode = node; + var next; + while (next = DOMWalker_1.DOMWalker.parentNode(goodNode)) { + goodNode = next; + } + ; + // Walk the tree and set the hierarchies in the right order + var ariaWalker = new ARIAWalker_1.ARIAWalker(goodNode, false, goodNode); + do { + if (ariaWalker.node.nodeType === 1) { + this.getNodeHierarchy(ariaWalker.node); + } + } while (ariaWalker.nextNode()); + }; + ARIAMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + for (var idx = 0; idx < this.hierarchyResults.length; ++idx) { + if (this.hierarchyResults[idx].role && this.hierarchyResults[idx].role[0] === "/") { + this.hierarchyResults[idx].role = (this.hierarchyResults[idx].role ? this.hierarchyResults[idx].role.substring(1) : null); + } + } + return this.hierarchyResults; + }; + ARIAMapper.prototype.pushHierarchy = function (node) { + // If we're not an element, no special handling + var nodeHierarchy = []; + // Determine our node info + nodeHierarchy = this.getNodeHierarchy(node); + var nodeInfo = nodeHierarchy[nodeHierarchy.length - 1]; + this.hierarchyRole.push(nodeInfo.role); + if (nodeInfo.role !== null) { + this.hierarchyPath.push(nodeInfo); + } + this.hierarchyResults = nodeHierarchy; + }; + ARIAMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + if (retVal.length > 0) { + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + var parent_3 = DOMWalker_1.DOMWalker.parentElement(node); + this.hierarchyResults = parent_3 ? CacheUtil_1.CacheUtil.getCache(parent_3, "ARIAMapper::getNodeInfo", []) : []; + } + return retVal; + }; + /**public static computeName(cur: Node) : string { + ++ARIAMapper.nameComputationId; + return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false); + } + + public static computeNameHelp(walkId: number, cur: Node, labelledbyTraverse: boolean, walkTraverse: boolean) : string { + // 2g. None of the other content applies to text nodes, so just do this first + if (cur.nodeType === 3 ) return cur.nodeValue; + if (cur.nodeType === 11) return ""; + if (cur.nodeType !== 1 ) { + if (walkTraverse || labelledbyTraverse) return ""; + throw new Error ("Can only compute name on Element and Text " + cur.nodeType); + } + + const elem = cur as Element; + // We've been here before - prevent recursion + if (CacheUtil.getCache(elem, "data-namewalk", null) === ""+walkId) return ""; + CacheUtil.setCache(elem, "data-namewalk", ""+walkId); + // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element + + // 2a. Only show hidden content if it's referenced by a labelledby + if (!labelledbyTraverse && !VisUtil.isNodeVisible(cur)) { + return ""; + } + + // 2b. collect valid id references + if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) { + let labelledby = elem.getAttribute("aria-labelledby").split(" "); + let validElems = []; + for (const ref of labelledby) { + const refElem = FragmentUtil.getById(cur, ref); + if (refElem && !DOMUtil.sameNode(elem, refElem)) { + validElems.push(refElem); + } + } + if (validElems.length > 0) { + let accumulated = ""; + for (const elem of validElems) { + accumulated += " " + this.computeNameHelp(walkId, elem, true, false); + } + return accumulated.trim(); + } + } + + // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases + if (["section", "form"].includes(cur.nodeName.toLowerCase())) { + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse) { + return elem.getAttribute("aria-label").trim(); + } + } + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + return ""; + } + + // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label + const role = ARIAMapper.nodeToRole(cur); + let isEmbeddedControl = [ + "textbox", "button", "combobox", "listbox", + "progressbar", "scrollbar", "slider", "spinbutton" + ].includes(role); + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) { + return elem.getAttribute("aria-label").trim(); + } + } + + // 2d. + if (role !== "presentation" && role !== "none") { + if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) { + return DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim(); + } + + if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) { + let label = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id")+"']"); + if (label) { + if (label.hasAttribute("aria-label") || (label.hasAttribute("aria-labelledby") && !CommonUtil.isIdReferToSelf(cur, label.getAttribute("aria-labelledby")))) { + return this.computeNameHelp(walkId, label, false, false); + } else { + return label.textContent; + } + } + } + if (cur.nodeName.toLowerCase() === "fieldset") { + if( (<Element>cur).querySelector("legend")){ + let legend = (<Element>cur).querySelector("legend"); + return legend.innerText; + }else{ + return this.computeNameHelp(walkId, cur, false, false); + } + + } + + } + + // 2e. + if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) { + // If the embedded control has role textbox, return its value. + if (role === "textbox") { + if (elem.nodeName.toLowerCase() === "input") { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + } else { + walkTraverse = false; + } + } + + // If the embedded control has role button, return the text alternative of the button. + if (role === "button") { + if (elem.nodeName.toLowerCase() === "input") { + let type = elem.getAttribute("type").toLowerCase(); + if (["button", "submit", "reset"].includes(type)) { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + if (type === "submit") return "Submit"; + if (type === "reset") return "Reset"; + } + } else { + walkTraverse = false; + } + } + + // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option. + if (role === "combobox") { + if (elem.hasAttribute("aria-activedescendant")) { + let selected = FragmentUtil.getById(elem, "aria-activedescendant"); + if (selected && !DOMUtil.sameNode(elem, selected)) { + return ARIAMapper.computeNameHelp(walkId, selected, false, false); + } + } + } + + // If the embedded control has role range (e.g., a spinbutton or slider): + if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) { + // If the aria-valuetext property is present, return its value, + if (elem.hasAttribute("aria-valuetext")) return elem.getAttribute("aria-valuetext"); + // Otherwise, if the aria-valuenow property is present, return its value, + if (elem.hasAttribute("aria-valuenow")) return elem.getAttribute("aria-valuenow"); + // TODO: Otherwise, use the value as specified by a host language attribute. + } + } + + // 2f. 2h. + if (walkTraverse || ARIADefinitions.nameFromContent(role) || labelledbyTraverse) { + // 2fi. Set the accumulated text to the empty string. + let accumulated = ""; + // 2fii. Check for CSS generated textual content associated with the current node and + // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2] + // can provide textual content for elements that have a content model. + // For :before pseudo elements, User agents MUST prepend CSS textual content, without + // a space, to the textual content of the current node. + // For :after pseudo elements, User agents MUST append CSS textual content, without a + // space, to the textual content of the current node. + let before = null; + before = elem.ownerDocument.defaultView.getComputedStyle(elem,"before").content; + + if (before && before !== "none") { + before = before.replace(/^"/,"").replace(/"$/,""); + accumulated += before; + } + // 2fiii. For each child node of the current node: + // Set the current node to the child node. + // Compute the text alternative of the current node beginning with step 2. Set the result + // to that text alternative. + // Append the result to the accumulated text. + if (elem.nodeName.toUpperCase() === "SLOT") { + //if no assignedNode, check its own text + if (!(elem as HTMLSlotElement).assignedNodes() || (elem as HTMLSlotElement).assignedNodes().length === 0) { + let innerText = CommonUtil.getInnerText(elem); + if (innerText && innerText !== null && innerText.trim().length > 0) + accumulated += " " + innerText; + } else { + // check text from all assigned nodes + for (const slotChild of (elem as HTMLSlotElement).assignedNodes()) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + } + } + } else { + let walkChild = elem.firstChild; + while (walkChild) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + walkChild = walkChild.nextSibling; + } + } + + let after = null; + try { + after = elem.ownerDocument.defaultView.getComputedStyle(elem,"after").content; + } catch (e) {} + + if (after && after !== "none") { + after = after.replace(/^"/,"").replace(/"$/,""); + accumulated += after; + } + // 2fiv. Return the accumulated text. + accumulated = accumulated.replace(/\s+/g," ").trim(); + if (accumulated.trim().length > 0) { + return accumulated; + } + } + + // 2i. Otherwise, if the current node has a Tooltip attribute, return its value. + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + if (elem.tagName.toLowerCase() === "svg") { + let title = elem.querySelector("title"); + if (title) { + return title.textContent || title.innerText; + } + } + + return ""; + } + */ + /* if (role in ARIADefinitions.designPatterns + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) + { + name = elem.textContent; + } + if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) { + name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent; + } + if (elem.hasAttribute("aria-label")) { + name = elem.getAttribute("aria-label"); + } + if (elem.hasAttribute("aria-labelledby")) { + name = ""; + const ids = elem.getAttribute("aria-labelledby").split(" "); + for (const id of ids) { + name += FragmentUtil.getById(elem, id).textContent + " "; + } + name = name.trim(); + } + return name; + }*/ + ARIAMapper.nodeToRole = function (node) { + if (node.nodeType === 3 /* Node.TEXT_NODE */) { + return "text"; + } + else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + var elem = node; + if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + // TO DO: use AriaUtil.getResolvedRole(elem) to replace the code following, which uses only the valid roles for the element based on the aria fallback rule + //const role = AriaUtil.getResolvedRole(elem); + //return role === "presentation" || role === "none" ? null : role; + if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) { + var roleStr = elem.getAttribute("role").trim(); + var roles_2 = roleStr.split(" "); + for (var _i = 0, roles_1 = roles_2; _i < roles_1.length; _i++) { + var role_1 = roles_1[_i]; + if (role_1 === "presentation" || role_1 === "none") { + // If element is focusable, then presentation roles are to be ignored + if (!CommonUtil_1.CommonUtil.isFocusable(elem)) { + return null; + } + } + else if (role_1 in ARIADefinitions_1.ARIADefinitions.designPatterns) { + return role_1; + } + } + } + //return this.elemToImplicitRole(elem); + var roles = AriaUtil_1.AriaUtil.getImplicitRole(elem); + //console.log("node=" + node.nodeName +", role= " + (roles ? roles[0] : null) +", resolved=" + AriaUtil.getResolvedRole(elem)); + var role = !roles || roles.length === 0 ? null : roles[0]; + return role === "presentation" || role === "none" ? null : role; + //return AriaUtil.getResolvedRole(elem); + }; + //////////////////////////////////////////////////////////////////////////// + // Helper functions + //// + // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis + ARIAMapper.elemAttrValueCalculators = { + "global": { + "name": function (elem) { var _a; return (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem)) === null || _a === void 0 ? void 0 : _a.name; } //ARIAMapper.computeName + }, + "datalist": { + // set to "true" if the datalist's selection model allows multiple option elements to be + // selected at a time, and "false" otherwise + "multiselectable": function (elem) { + var id = elem.getAttribute("id"); + if (id && id.length > 0) { + var input = elem.ownerDocument.querySelector("input[list='" + id + "']"); + return "" + (elem.getAttribute("multiple") + && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == "")); + } + return null; + } + }, + "h1": { + "level": "1" + }, + "h2": { + "level": "2" + }, + "h3": { + "level": "3" + }, + "h4": { + "level": "4" + }, + "h5": { + "level": "5" + }, + "h6": { + "level": "6" + }, + "input": { + // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute + // is true, or "true" if the element's checkedness is true, or "false" otherwise + // - type="radio" state set to "true" if the element's checkedness is true, or "false" + // otherwise. + "checked": function (elem) { + var type = elem.getAttribute("type"); + if (type === "checkbox" || type === "radio") { + return "" + elem.checked; + } + return null; + } + // - type="radio" and not in menu reflecting number of type=radio input elements + // within the radio button group + , + "setsize": function (elem) { return null; // removed by dead control flow + } + // - type="radio" and not in menu value reflecting the elements position + // within the radio button group." + , + "posinset": function (elem) { return null; // removed by dead control flow + } + // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a + // suggestions source element) combobox role, with the aria-owns property set to the same + // value as the list attribute + , + "owns": function (elem) { return null; // removed by dead control flow + } + }, + "keygen": { + "multiselectable": "false" + }, + "li": { + // Number of li elements within the ol, ul, menu + "setsize": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var otherlis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::otherlis", function () { return parent.querySelectorAll("ol li, ul li, menu li"); }); + return "" + (lis.length - otherlis.length); + } + // Position of li element within the ol, ul, menu + , + "posinset": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var num = 0; + for (var idx = 0; idx < lis.length; ++idx) { + var li = lis[idx]; + if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) { + return "" + num; + } + ++num; + } + return null; + } + }, + "menuitem": { + // type = checkbox or radio, set to "true" if the checked attribute + // is present, and "false" otherwise + "checked": function (elem) { return "" + !!(elem.getAttribute("checked") + && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); } + }, + "option": { + // set to "true" if the element's selectedness is true, or "false" otherwise. + "selected": function (elem) { return "" + !!(elem.getAttribute("selected") + && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); } + }, + "progress": { + "valuemax": function (elem) { return elem.getAttribute("max") || "1"; }, + "valuemin": function (elem) { return "0"; }, + "valuenow": function (elem) { return elem.getAttribute("value"); } + } + }; + ARIAMapper.textAttrValueCalculators = { + "name": function (node) { return node.nodeValue; } + }; + ARIAMapper.nameComputationId = 0; + return ARIAMapper; +}(CommonMapper_1.CommonMapper)); +exports.ARIAMapper = ARIAMapper; + + +/***/ }, + +/***/ "./src/v2/aria/ARIAWalker.ts" +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAWalker.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAWalker = void 0; +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ./ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +/** + * Walks in an ARIA order + * + * See also ../dom/DOMWalker + */ +var ARIAWalker = /** @class */ (function () { + function ARIAWalker(element, bEnd, root) { + this.root = root || element; + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + // if (this.node.nodeType === 9) { + // this.node = (this.node as Document).documentElement + // } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + } + ARIAWalker.prototype.atRoot = function () { + if (this.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + ARIAWalker.prototype.nextNode = function () { + var skipOwned = false; + do { + skipOwned = false; + // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = true; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + ARIAWalker.prototype.prevNode = function () { + var skipOwned = false; + do { + skipOwned = false; + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + return ARIAWalker; +}()); +exports.ARIAWalker = ARIAWalker; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/ancestor.ts" +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/ancestor.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AncestorUtil = void 0; +var AncestorUtil = /** @class */ (function () { + function AncestorUtil() { + } + AncestorUtil.isPresentationFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 + && elem.nodeName.toLowerCase() === "iframe" + && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) { + return true; + } + } + } + return false; + }; + AncestorUtil.isFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") { + return true; + } + } + } + return false; + }; + return AncestorUtil; +}()); +exports.AncestorUtil = AncestorUtil; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/fragment.ts" +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/fragment.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FragmentUtil = void 0; +var FragmentUtil = /** @class */ (function () { + function FragmentUtil() { + } + FragmentUtil.getOwnerFragment = function (node) { + var n = node; + while (n.parentNode && (n = n.parentNode)) { + if (n.nodeType === 11) { + return n; + } + } + return node.ownerDocument; + }; + FragmentUtil.getById = function (node, id) { + return this.getOwnerFragment(node).getElementById(id); + }; + FragmentUtil.getAncestor = function (hierarchies, elemName) { + var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; }); + return matches.length > 0 && matches[0].node || null; + }; + FragmentUtil.getAncestorWithRole = function (hierarchies, role) { + var matches = hierarchies["aria"].filter(function (info) { return info.role === role; }); + return matches.length > 0 && matches[0].node || null; + }; + return FragmentUtil; +}()); +exports.FragmentUtil = FragmentUtil; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/lang.ts" +/*!***************************************************!*\ + !*** ./src/v2/checker/accessibility/util/lang.ts ***! + \***************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2021- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LangUtil = void 0; +// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry +var validPrimaryLangs = [ + ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"], + ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"], + ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"], + ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"], + ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"], + ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"], + ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"], + ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"], + ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"], + ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"], + ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"], + ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"], + ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"], + ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"], + ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"], + ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"], + ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"], + ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"], + ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"], + ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"], + ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"], + ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"], + ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"], + ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"], + ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"], + ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"] +]; +var LangUtil = /** @class */ (function () { + function LangUtil() { + } + /* Determine if given string is a valid BCP 47 string */ + LangUtil.isBcp47 = function (langStr) { + return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr); + }; + LangUtil.validPrimaryLang = function (langStr) { + var primary = langStr.toLowerCase(); + if (primary.includes("-")) { + primary = primary.split("-")[0]; + } + if (!primary.match(/[a-z]{2,3}/)) + return false; + // qaa..qtz + if (primary.length === 3 + && primary.charAt(0) === "q" + && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116 + && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) { + } + return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary); + }; + LangUtil.matchPrimaryLang = function (lang1, lang2) { + var primary1 = lang1; + if (primary1.includes("-")) { + primary1 = primary1.split("-")[0]; + } + var primary2 = lang2; + if (primary2.includes("-")) { + primary2 = primary2.split("-")[0]; + } + return primary1.toLowerCase() === primary2.toLowerCase(); + }; + return LangUtil; +}()); +exports.LangUtil = LangUtil; + + +/***/ }, + +/***/ "./src/v2/common/CommonMapper.ts" +/*!***************************************!*\ + !*** ./src/v2/common/CommonMapper.ts ***! + \***************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonMapper = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonMapper = /** @class */ (function () { + function CommonMapper() { + this.hierarchyRole = null; + this.hierarchyPath = null; + this.hierarchyResults = null; + } + CommonMapper.prototype.getBounds = function (node) { + return null; + }; + CommonMapper.prototype.reset = function (node) { + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + var ancestors = []; + var parent = DOMWalker_1.DOMWalker.parentNode(node); + while (parent && parent.nodeType != 9 /* Node.DOCUMENT_NODE */) { + ancestors.push(parent); + parent = DOMWalker_1.DOMWalker.parentNode(parent); + } + ancestors = ancestors.reverse(); + for (var _i = 0, ancestors_1 = ancestors; _i < ancestors_1.length; _i++) { + var ancestor = ancestors_1[_i]; + var siblings = []; + var sibling = ancestor.previousSibling; + while (sibling) { + siblings.push(sibling); + sibling = sibling.previousSibling; + } + siblings = siblings.reverse(); + for (var _a = 0, siblings_1 = siblings; _a < siblings_1.length; _a++) { + var sibling_1 = siblings_1[_a]; + this.pushHierarchy(sibling_1); + this.popHierarchy(); + } + this.pushHierarchy(ancestor); + } + }; + CommonMapper.prototype.pushHierarchy = function (node) { + var role = this.getRole(node) || null; + this.hierarchyRole.push(role); + if (role !== null) { + var parentPathInfo = this.hierarchyPath[this.hierarchyPath.length - 1]; + parentPathInfo.roleCount[role] = (parentPathInfo.roleCount[role] || 0) + 1; + this.hierarchyPath.push({ + "rolePath": parentPathInfo.rolePath + "/" + role + "[" + parentPathInfo.roleCount[role] + "]", + "roleCount": {} + }); + } + var attr = {}; + if (node.nodeType === 1) { + attr = this.getAttributes(node); + } + this.hierarchyResults.push({ + node: node, + namespace: this.getNamespace(), + role: role, + attributes: attr, + rolePath: this.hierarchyPath[this.hierarchyPath.length - 1].rolePath, + bounds: this.getBounds(node) + }); + }; + CommonMapper.prototype.popHierarchy = function () { + var role = this.hierarchyRole.pop(); + if (role !== null) { + this.hierarchyPath.pop(); + } + this.hierarchyResults.pop(); + }; + CommonMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + return this.hierarchyResults; + }; + CommonMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + this.popHierarchy(); + return retVal; + }; + return CommonMapper; +}()); +exports.CommonMapper = CommonMapper; + + +/***/ }, + +/***/ "./src/v2/common/Context.ts" +/*!**********************************!*\ + !*** ./src/v2/common/Context.ts ***! + \**********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = exports.PartInfo = exports.AttrInfo = void 0; +// Context that will cause this rule to execute. +// Context syntax: +// Triggers: +// aria:role - Triggers on element with ARIA role role +// aria:role[attribute] - Triggers on elements with the equivalent logical +// aria- attribute (e.g., button[disabled] will trigger on +// <button disabled> or <div role="button" aria-disabled="true">) +// role[attribute=value] - Similar to above, with case-sensitive match +// to value +// role[attribute~value] - Similar to above, with case-insensitive match +// dom:element - Triggers on an element with the specified name +// dom:element[attribute] - Triggers on a dom element with the specified attribute +// dom:*[attribute] - Triggers on all elements with the specified attribute +// Combining triggers: +// trigger1 trigger2 - Triggers on elements with trigger2 within an +// element with trigger1 +// !trigger1 trigger2 - Triggers on elements with trigger2 not within +// element with trigger1 +// trigger1>trigger2 - Triggers on elements with trigger2 with an +// an immediate parent with trigger1 +// trigger1+trigger2 - Triggers on elements with trigger2 with an +// immediate previous sibling with trigger1 +// trigger1~trigger2 - Triggers on elements with trigger2 with an +// some earlier sibling with trigger1 +// context,context - Triggers on elements with either context +var AttrInfo = /** @class */ (function () { + function AttrInfo(inclusive, attr, eq, value) { + this.inclusive = inclusive; + this.attr = attr; + this.eq = eq; + this.value = value; + if (!inclusive + && ((typeof eq) !== "undefined" && eq.length > 0)) { + throw new Error("Cannot have !attr" + eq + " context"); + } + if (inclusive && (typeof eq) !== "undefined" && eq.length > 0 && ((typeof value) === "undefined" || value.length === 0)) { + throw new Error("Cannot have equivalence check without a value"); + } + } + AttrInfo.prototype.matches = function (context) { + var ruleAttrPart = this; + var elemAttrs = context.attributes; + if (!(ruleAttrPart.attr in elemAttrs)) { + return !ruleAttrPart.inclusive; + } + else if (!ruleAttrPart.inclusive) { + return false; + } + else if (!ruleAttrPart.eq) { + // inclusive match and I have that attribute and no equivalence defined + return true; + } + else { + // inclusive match and I have that attribute and equivalence defined + var attrValue = elemAttrs[ruleAttrPart.attr]; + if (ruleAttrPart.eq === "=") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!=") { + return ruleAttrPart.value !== attrValue; + } + else if (ruleAttrPart.eq === "~") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!~") { + return ruleAttrPart.value !== attrValue; + } + else { + throw new Error("Context equivalence operator not supported"); + } + } + }; + return AttrInfo; +}()); +exports.AttrInfo = AttrInfo; +var PartInfo = /** @class */ (function () { + function PartInfo(inclusive, namespace, role, attrs, connector) { + this.inclusive = inclusive; + this.namespace = namespace; + this.role = role; + this.attrs = attrs; + this.connector = connector; + if (role === "*" && !inclusive) { + throw new Error("!* context not supported"); + } + } + PartInfo.prototype.matches = function (contextHier, hierLevel) { + var rulePart = this; + var ruleRoleMatch = (rulePart.namespace in contextHier) && contextHier[rulePart.namespace][hierLevel] + && (contextHier[rulePart.namespace][hierLevel].role === rulePart.role + || contextHier[rulePart.namespace][hierLevel].role !== "none" && rulePart.role === "*"); + if (ruleRoleMatch + && rulePart.role === "*" + && rulePart.namespace === "dom" + && (contextHier[rulePart.namespace][hierLevel].role === "#text" + || contextHier[rulePart.namespace][hierLevel].role === "/#text")) { + ruleRoleMatch = false; + } + if (rulePart.inclusive && !ruleRoleMatch) + return false; + if (!rulePart.inclusive && !ruleRoleMatch) + return true; + // Match the attributes + var ruleAttrs = rulePart.attrs; + var elemContext = contextHier[rulePart.namespace][hierLevel]; + var match = true; + for (var _i = 0, ruleAttrs_1 = ruleAttrs; _i < ruleAttrs_1.length; _i++) { + var ruleAttrPart = ruleAttrs_1[_i]; + match = match && ruleAttrPart.matches(elemContext); + } + if (!rulePart.inclusive) + match = !match; + return match; + }; + return PartInfo; +}()); +exports.PartInfo = PartInfo; +var Context = /** @class */ (function () { + function Context(context) { + this.contextInfo = []; + var contextHierMatches = context.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g); + var results = []; + for (var _i = 0, contextHierMatches_1 = contextHierMatches; _i < contextHierMatches_1.length; _i++) { + var part = contextHierMatches_1[_i]; + var parts = part.match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/); + var attrInfo = []; + for (var _a = 0, _b = parts[3].match(/\[([^\]]+)\]/g) || []; _a < _b.length; _a++) { + var attrPart = _b[_a]; + var attrParts = attrPart.match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/); + attrInfo.push(new AttrInfo(attrParts[1] !== "!", attrParts[2].toLowerCase(), attrParts[3], attrParts[4])); + } + parts[2] = parts[2].toLowerCase(); + var nsParts = parts[2].split(":"); + var incl = parts[1] !== "!"; + var ns = nsParts.shift(); + var role = nsParts.join(":"); + var partInfo = new PartInfo(incl, ns, role, attrInfo, parts[parts.length - 1]); + results.push(partInfo); + } + this.contextInfo = results; + } + Context.cleanContext = function (context) { + context = context.toLowerCase().trim(); + context = context.replace(/ +!/g, " !"); + context = context.replace(/ +([>+~,])/g, "$1"); + context = context.replace(/([>+~,]) +/g, "$1"); + context = context.replace(/ +/g, " "); + return context.trim(); + }; + Context.parse = function (context) { + var contexts = Context.splitMultiple(Context.cleanContext(context)); + var retVal = []; + for (var i = 0; i < contexts.length; ++i) { + var ctx = new Context(contexts[i]); + retVal.push(ctx); + } + return retVal; + }; + /** + * Handles initial processing of splitting on comma - context,context + * @param context + */ + Context.splitMultiple = function (context) { + var contexts = []; + if (context) { + if (context.indexOf(",") === -1) { + contexts.push(context); + } + else { + for (var _i = 0, _a = context.split(","); _i < _a.length; _i++) { + var c = _a[_i]; + contexts.push(c); + } + } + } + return contexts; + }; + return Context; +}()); +exports.Context = Context; + + +/***/ }, + +/***/ "./src/v2/common/Engine.ts" +/*!*********************************!*\ + !*** ./src/v2/common/Engine.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Engine = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var Context_1 = __webpack_require__(/*! ./Context */ "./src/v2/common/Context.ts"); +var Config_1 = __webpack_require__(/*! ../config/Config */ "./src/v2/config/Config.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../../v4/api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var WrappedRule = /** @class */ (function () { + function WrappedRule(rule, parsedInfo) { + this.rule = rule; + this.parsedInfo = parsedInfo; + this.ns = this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length - 1].namespace; + Config_1.Config.DEBUG && console.log("Added Rule:", rule.id, JSON.stringify(this.parsedInfo)); + } + /** + * This function is responsible converting the node into a snippet which can be added to report. + * + * Note: This function will take the node and extract the node name and the attributes and build the snippet based on this. + * + * TODO: Future, maybe we can extract more then just single line, add more info or even add closing tags etc... + * + * @param {HTMLElement} node - The html element to convert into element snippet with node name and attributes only. + * + * @return {String} nodeSnippet - return the element snippet of the element that was provided which only contains, + * nodename and attributes. i.e. <table id=\"layout_table1\" role=\"presentation\"> + * + * @memberOf this + */ + WrappedRule.convertNodeToSnippet = function (node) { + // Variable Decleration + var nodeSnippet = ''; + // Extract the node name and add it to the node snippet + nodeSnippet += '<' + node.nodeName.toLowerCase(); + // Extract all the node attributes as an array + var nodeAttributes = node.attributes; + // In the case there are attributes on this node + if (nodeAttributes !== null && typeof nodeAttributes !== 'undefined') { + // Loop over all theses attributes and add the name and value to the nodeSnippet which will be returned + for (var i = nodeAttributes.length - 1; i >= 0; i--) { + if (nodeAttributes[i].name === "data-namewalk") + continue; + // Add the attribute name and value. + nodeSnippet += ' ' + nodeAttributes[i].name + '="' + nodeAttributes[i].value + '"'; + } + } + // Close the node + nodeSnippet += '>'; + // Return the node snippet + return nodeSnippet; + }; + /** + * This function is responsible for finding the source location for a node, which can be added to a report. + * Supports debug directives in the following forms: + * 1. An attribute on the element itself: + * ibm-a11y-debug="file.ts:10:5" + * 2. A comment node preceding the element (as a sibling or ancestor sibling): + * <!-- ibm-a11y-debug: file.ts:10:5 --> + * 3. A wrapper element (e.g. div) whose first non-whitespace child is such a comment node. + * 4. An ancestor element that carries the ibm-a11y-debug attribute. + * + * Traversal: checks the node itself for an inline attribute, then scans previous siblings at + * each ancestor level upward (also checking each ancestor element's own inline attribute), + * stopping if a blank or 'end' marker is found. + * + * @param {Node} node - The DOM node to find source info for + * @return {string | null} - The source location string, or null if not found + * + * @memberOf this + */ + WrappedRule.convertNodeToSource = function (node, enabled) { + if (enabled === void 0) { enabled = false; } + //console.log("Source Map enabled:", enabled); + if (!enabled || !node) + return null; + var DEBUG_DIRECTIVE = "ibm-a11y-debug"; + /** + * Parses a source string into a DirectiveResult. + * The source is the final resolved value — after any ':' separator has already been stripped. + * A blank value or the exact word 'end' (case-insensitive) is a stop marker. + */ + var parseSource = function (source) { + if (!source || source.toLowerCase() === 'end') { + return { found: true, stop: true }; + } + return { found: true, stop: false, source: source }; + }; + /** + * Extracts the debug-directive comment value from a node. + * Handles: + * - A comment node directly + * - A wrapper element (e.g. <div>) whose first non-whitespace child is a comment node + * + * Returns { found: true, stop: true } if the directive is blank or exactly 'end', + * returns { found: true, stop: false, source } if a valid source is found, + * or returns { found: false } if no directive is present on this node. + */ + var extractDirective = function (elem) { + if (!elem) + return { found: false }; + var commentValue = null; + if (elem.nodeType === Node.COMMENT_NODE) { + // Direct comment node + commentValue = elem.nodeValue; + } + else if (elem.nodeType === Node.ELEMENT_NODE) { + // Element wrapper (e.g. <div><!-- ibm-a11y-debug: ... --></div>) + // Find the first non-whitespace child node + var child = elem.firstChild; + while (child) { + if (child.nodeType === Node.TEXT_NODE) { + // Skip pure whitespace text nodes + if (child.nodeValue && child.nodeValue.trim().length > 0) { + // Non-whitespace text before a comment — not a directive wrapper + break; + } + } + else if (child.nodeType === Node.COMMENT_NODE) { + commentValue = child.nodeValue; + break; + } + else { + // Any other node type before a comment — not a directive wrapper + break; + } + child = child.nextSibling; + } + } + if (commentValue !== null) { + var trimmed = commentValue.trim(); + // Match exactly "ibm-a11y-debug" followed by end-of-string, whitespace, or ':' + // This prevents "ibm-a11y-debug-extra" from being treated as a directive. + if (trimmed === DEBUG_DIRECTIVE || + trimmed.startsWith(DEBUG_DIRECTIVE + ':') || + trimmed.startsWith(DEBUG_DIRECTIVE + ' ') || + trimmed.startsWith(DEBUG_DIRECTIVE + '\t')) { + // Strip the directive name and optional leading whitespace + var afterDirective = trimmed.substring(DEBUG_DIRECTIVE.length).trimStart(); + // Strip a single leading ':' separator if present + // (e.g. "ibm-a11y-debug: file.ts:10:5" → afterDirective = ": file.ts:10:5") + var source = afterDirective.startsWith(':') + ? afterDirective.substring(1).trim() + : afterDirective.trim(); + return parseSource(source); + } + } + return { found: false }; + }; + /** + * Returns the ibm-a11y-debug attribute value from an element node as a DirectiveResult, + * or { found: false } if absent. Recognises the 'end' stop marker just like comment directives. + * The attribute value is the source directly (no ':' prefix), e.g. ibm-a11y-debug="file.ts:10:5". + */ + var getInlineAttr = function (n) { + if (n.nodeType !== Node.ELEMENT_NODE) + return { found: false }; + var val = n.getAttribute(DEBUG_DIRECTIVE); + if (val === null) + return { found: false }; + // Attribute value is the source directly — no ':' separator to strip + return parseSource(val.trim()); + }; + /** + * Traverses left (previous siblings) then upward (parent) to find source info. + * Does NOT check the starting element itself — only its preceding siblings and ancestors. + * This avoids misidentifying a content node as its own source directive. + * + * At each ancestor level the function also checks the ancestor element's own inline + * ibm-a11y-debug attribute, so that a parent element can annotate all its descendants. + * + * Sibling scanning stops at the first node that is recognised as a directive (found or stop). + * Non-directive nodes (real content elements, text nodes) are skipped so that a directive + * placed further back in the sibling list is still found even if content nodes intervene. + * However, traversal does NOT cross element boundaries when scanning siblings — only + * comment nodes and dedicated wrapper elements (whose sole first child is a comment) are + * treated as transparent. + * + * Shadow DOM traversal: uses DOMWalker.parentNode() to cross shadow boundaries correctly, + * including slotted content and nested Shadow DOM (shadow-in-shadow). When the parent + * chain reaches a ShadowRoot, DOMWalker.parentNode() automatically resolves it to the + * shadow host element in the outer DOM. A plain DocumentFragment with no host returns + * null from DOMWalker.parentNode(), stopping traversal. + * + * Sibling traversal uses DOMWalker.previousSiblingNotOwnedBySlot() to skip nodes that + * are assigned to slots (and therefore logically belong to a different part of the tree). + * + * Uses an iterative approach (rather than recursion) to safely handle deeply nested + * DOM structures without risk of stack overflow. + * + * @param elem - The node whose context we are searching + * @returns The source location string, or null if not found + */ + var findSource = function (elem) { + var current = elem; + while (current) { + // Scan previous siblings for a debug directive comment or wrapper element. + // Use previousSiblingNotOwnedBySlot to skip nodes assigned to slots, which + // logically belong to a different part of the composed tree. + // Only comment nodes and dedicated wrapper elements are considered directives; + // all other node types are skipped (they do not block further scanning). + var prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(current); + while (prev) { + var result = extractDirective(prev); + if (result.found) { + if (result.stop) + return null; + return result.source; + } + prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(prev); + } + // No directive found among siblings — move up to parent. + // Use DOMWalker.parentNode() instead of node.parentNode directly so that: + // 1. Shadow DOM boundaries are crossed automatically (ShadowRoot → host element), + // supporting both regular and nested Shadow DOM (shadow-in-shadow). + // 2. Slotted nodes are re-parented to their slot owner rather than their + // light-DOM parent, matching the composed (rendered) tree structure. + // 3. Nodes with an ownerElement (e.g. iframe document roots) are re-parented + // to their owner element. + var parent_1 = DOMWalker_1.DOMWalker.parentNode(current); + if (!parent_1 || parent_1.nodeType === Node.DOCUMENT_NODE) { + // Reached the top of the tree (or a plain DocumentFragment with no host) + // without finding a directive. + return null; + } + // Check the parent element's own inline attribute before continuing upward. + // This allows a containing element to annotate all its descendants. + // An 'end' inline attribute on the parent stops traversal entirely. + var parentAttrResult = getInlineAttr(parent_1); + if (parentAttrResult.found) { + if (parentAttrResult.stop) + return null; + return parentAttrResult.source; + } + current = parent_1; + } + return null; + }; + // First, check for an inline attribute directive on the element itself. + // An 'end' attribute on the element itself stops traversal (returns null). + var selfAttrResult = getInlineAttr(node); + if (selfAttrResult.found) { + if (selfAttrResult.stop) + return null; + return selfAttrResult.source; + } + // Then traverse the DOM to find a preceding comment directive or ancestor attribute + return findSource(node); + }; + WrappedRule.prototype.run = function (engine, context, options, contextHierarchies) { + var startTime = new Date().getTime(); + var results; + try { + results = this.rule.run(context, options, contextHierarchies); + } + catch (e) { + var err = e; + console.error("RULE EXCEPTION:", this.rule.id, context.dom.rolePath, err.stack); + throw e; + } + var endTime = new Date().getTime(); + if (!results) + results = []; + if (!(results instanceof Array)) { + results = [results]; + } + var retVal = []; + for (var _i = 0, results_1 = results; _i < results_1.length; _i++) { + var result = results_1[_i]; + var message = engine.getMessage(this.rule.id, result.reasonId, result.messageArgs); + var path = {}; + for (var ns in context) { + path[ns] = context[ns].rolePath; + } + var ruleId = this.rule.id.replace(/^(.*)\$\$\d+$/, "$1"); + retVal.push({ + ruleId: ruleId, + value: result.value, + node: context["dom"].node, + path: path, + ruleTime: endTime - startTime, + reasonId: result.reasonId, + message: message, + messageArgs: result.messageArgs, + apiArgs: result.apiArgs, + bounds: context["dom"].bounds, + snippet: WrappedRule.convertNodeToSnippet(context["dom"].node), + source: WrappedRule.convertNodeToSource(context["dom"].node, engine.isSourceMapEnabled()) + }); + } + return retVal; + }; + return WrappedRule; +}()); +var Engine = /** @class */ (function () { + function Engine() { + this.mappers = {}; + this.ruleMap = {}; + this.wrappedRuleMap = {}; + this.nlsMap = {}; + this.helpMap = {}; + this.sourceMapEnabled = false; + this.inclRules = {}; + this.exclRules = {}; + // Need a DOM Mapper as a minimum + this.addMapper(new DOMMapper_1.DOMMapper()); + } + Engine.getLanguages = function () { + var env = typeof process !== "undefined" && typeof process.nodeType === "undefined" && process.env; + // If all else fails, default to US English + var nodeLang = "en-US"; + if (env) { + nodeLang = env.LANG || env.LANGUAGE || env.LC_ALL || env.LC_MESSAGES; + if (nodeLang && nodeLang.length > 0) { + nodeLang = nodeLang.split(".")[0].replace(/_/g, "-"); + } + else { + nodeLang = "en-US"; + } + } + return typeof navigator !== "undefined" && navigator.languages || [nodeLang]; + }; + Engine.prototype.run = function (root, options) { + if (root === null) { + return Promise.reject("null document"); + } + if (root.nodeType === 9 /* Node.DOCUMENT_NODE */) { + root = root.documentElement; + } + root.ownerDocument && (root.ownerDocument.PT_CHECK_HIDDEN_CONTENT = false); + var numNodesVisited = CacheUtil_1.CacheUtil.clearCaches(root); + var walker = new DOMWalker_1.DOMWalker(root, false, root, true); + var retVal = { + results: [], + numExecuted: 0, + ruleTime: 0, + totalTime: 0 + }; + var start = new Date().getTime(); + // Reset the role mappers + for (var namespace in this.mappers) { + this.mappers[namespace].reset(root); + } + // Initialize the context detector + var currentNodeCount = 0; + var lastReportedPercent = -1; + do { + currentNodeCount++; + // Report progress at each percentage milestone + var currentPercent = Math.floor((currentNodeCount / numNodesVisited) * 100); + if (currentPercent > lastReportedPercent) { + if (numNodesVisited > 10000) { + // if (currentPercent > 6) break; + console.log("Progress: ".concat(currentPercent, "% (").concat(currentNodeCount, "/").concat(numNodesVisited, " nodes)")); + // const ruleTimes = retVal.results.reduce((prev, cur) => { + // prev[cur.ruleId] = (prev[cur.ruleId] || 0)+cur.ruleTime; + // return prev; + // }, {}); + // for (const ruleId in ruleTimes) { + // if (ruleTimes[ruleId] > 10000) { + // console.log(`${ruleId}: ${ruleTimes[ruleId]}`); + // } + // } + // console.groupEnd(); + } + lastReportedPercent = currentPercent; + } + // Get the context information from the rule mappers + var contextHierarchies = {}; + for (var namespace in this.mappers) { + if (!walker.bEndTag) { + contextHierarchies[namespace] = this.mappers[namespace].openScope(walker.node); + // if (namespace === "dom" && walker.node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = walker.node as Element; + // let id; + // if (elem.hasAttribute("id") && (id = elem.getAttribute("id").trim()).length > 0) { + // if (root.ownerDocument.getElementById(id) === elem) { + // contextHierarchies["dom"][contextHierarchies["dom"].length-1].rolePath = "//*[@id='"+id+"']"; + // } + // } + // } + } + else { + contextHierarchies[namespace] = this.mappers[namespace].closeScope(walker.node); + } + } + if (walker.node.nodeType !== 11 + && (VisUtil_1.VisUtil.isNodeVisible(walker.node) + // || walker.node.nodeName.toLowerCase() === "head" + || walker.node.nodeName.toLowerCase() === "meta" + || walker.node.nodeName.toLowerCase() === "style" + || walker.node.nodeName.toLowerCase() === "datalist" + || walker.node.nodeName.toLowerCase() === "param" + || !DOMUtil_1.DOMUtil.getAncestor(walker.node, ["body"]))) { + var context = {}; + for (var ns in contextHierarchies) { + var nsHier = contextHierarchies[ns]; + var lastHier = nsHier[nsHier.length - 1]; + context[ns] = lastHier; + } + var matchingRules = this.getMatchingRules(contextHierarchies); + var depMatch = {}; + for (var _i = 0, matchingRules_1 = matchingRules; _i < matchingRules_1.length; _i++) { + var matchingRule = matchingRules_1[_i]; + var fulfillsDependencies = true; + for (var _a = 0, _b = matchingRule.rule.dependencies || []; _a < _b.length; _a++) { + var dep = _b[_a]; + if (!depMatch[dep]) + fulfillsDependencies = false; + } + if (fulfillsDependencies) { + var results = []; + var start_1 = new Date().getTime(); + try { + results = matchingRule.run(this, context, options, contextHierarchies); + } + catch (err) { + // Wrapper shows error in console. Skip this rule as N/A + // We don't want to kill the engine + } + // If out of scope, it fulfills the dependency + if (results.length === 0) { + depMatch[matchingRule.rule.id] = true; + } + for (var _c = 0, results_2 = results; _c < results_2.length; _c++) { + var result = results_2[_c]; + retVal.results.push(result); + retVal.ruleTime += result.ruleTime; + retVal.numExecuted++; + if (result.value[1] === IRule_1.eRuleConfidence.PASS) { + depMatch[result.ruleId] = true; + } + } + } + } + } + } while (walker.nextNode()); + CacheUtil_1.CacheUtil.clearCaches(root); + retVal.totalTime = new Date().getTime() - start; + return Promise.resolve(retVal); + }; + Engine.prototype.enableRules = function (ruleIds) { + for (var ruleId in this.ruleMap) { + this.ruleMap[ruleId].enabled = false; + } + for (var _i = 0, _a = ruleIds || []; _i < _a.length; _i++) { + var ruleId = _a[_i]; + if (!(ruleId in this.ruleMap)) { + console.warn("WARNING: Rule Id", ruleId, "could not be enabled."); + } + else { + this.ruleMap[ruleId].enabled = true; + } + } + }; + Engine.prototype.getRule = function (ruleId) { + return this.ruleMap[ruleId]; + }; + Engine.prototype.getRulesIds = function () { + var retVal = []; + for (var ruleId in this.ruleMap) { + retVal.push(ruleId); + } + return retVal; + }; + Engine.prototype.addRules = function (rules) { + for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) { + var rule = rules_1[_i]; + this.addRule(rule, true); + } + this._sortRules(); + }; + Engine.prototype.addRule = function (rule, skipSort) { + var ctxs = Context_1.Context.parse(rule.context); + var idx = 0; + var ruleId = rule.id; + if (ruleId in this.ruleMap) { + console.log("WARNING: Rule", ruleId, "already added to engine. Ignoring..."); + return; + } + this.ruleMap[ruleId] = rule; + for (var _i = 0, ctxs_1 = ctxs; _i < ctxs_1.length; _i++) { + var ctx = ctxs_1[_i]; + var wrapId = ruleId; + if (idx >= 1) { + wrapId = ruleId + "$$" + idx; + } + ++idx; + var wrappedRule = new WrappedRule(rule, ctx); + this.wrappedRuleMap[wrapId] = wrappedRule; + var parts = wrappedRule.parsedInfo.contextInfo; + var lastPart = parts[parts.length - 1]; + var triggerRole = lastPart.namespace + ":" + lastPart.role; + if (lastPart.inclusive) { + this.inclRules[triggerRole] = this.inclRules[triggerRole] || []; + this.inclRules[triggerRole].push(wrappedRule); + } + else { + this.exclRules[triggerRole] = this.exclRules[triggerRole] || []; + this.exclRules[triggerRole].push(wrappedRule); + } + } + if (!skipSort) { + this._sortRules(); + } + }; + Engine.prototype.enableSourceMap = function (enable) { + this.sourceMapEnabled = enable; + }; + Engine.prototype.isSourceMapEnabled = function () { + return this.sourceMapEnabled; + }; + Engine.prototype._sortRules = function () { + for (var role in this.inclRules) { + this.inclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + for (var role in this.exclRules) { + this.exclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + }; + Engine.prototype.addNlsMap = function (map) { + for (var key in map) { + this.nlsMap[key] = map[key]; + } + }; + Engine.prototype.addHelpMap = function (map) { + for (var key in map) { + this.helpMap[key] = map[key]; + } + }; + Engine.prototype.getMessage = function (ruleId, ruleIdx, msgArgs) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.nlsMap)) + return ruleId; + var messageTemplate = this.nlsMap[ruleId][ruleIdx || 0]; + if (!messageTemplate) + return ruleId + "_" + ruleIdx; + return messageTemplate.replace(/\{(\d+)\}/g, function (matchedStr, matchedNum, matchedIndex) { return msgArgs[matchedNum]; }); + }; + Engine.prototype.getHelp = function (ruleId, reasonId, archiveId) { + if (!archiveId) { + // Set to the latest + archiveId = "latest"; + } + return "".concat(Config_1.Config.helpRoot, "/").concat(archiveId, "/doc").concat(this.getHelpRel(ruleId, reasonId)); + }; + Engine.prototype.getHelpRel = function (ruleId, ruleIdx) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.helpMap)) + return ruleId; + ruleIdx = ruleIdx || 0; + var helpStr = null; + if (ruleIdx in this.helpMap[ruleId]) { + helpStr = this.helpMap[ruleId][ruleIdx || 0]; + } + else { + helpStr = this.helpMap[ruleId][0]; + } + if (!helpStr) + return ruleId + "_" + ruleIdx; + return helpStr; + }; + Engine.prototype.addMapper = function (mapper) { + this.mappers[mapper.getNamespace()] = mapper; + }; + Engine.match = function (rule, contextHier) { + var ruleParts = rule.parsedInfo.contextInfo; + var partIdx = ruleParts.length - 1; + var curNS = ruleParts[partIdx].namespace; + var curHier = contextHier[curNS][contextHier[curNS].length - 1]; + var contextNode = curHier.node; + // If the end of the rule part doesn't match the end of the hierarchy, we don't have a match + if (!ruleParts[partIdx].matches(contextHier, contextHier[curNS].length - 1)) { + return false; + } + // If there was only one part, we have a match + if (ruleParts.length === 1) { + return true; + } + // Need to deal with parent parts. To walk the hierarchy, these need to be + // all in the same namespace. Confirm that is true. + curNS = ruleParts[0].namespace; + curHier = contextHier[curNS][contextHier[curNS].length - 1]; + --partIdx; + if (ruleParts.slice(0, ruleParts.length - 1).some(function (part) { return part.namespace !== curNS; })) { + console.error("[ERROR] Rule ".concat(rule.rule.id, " has inconsitent parent namespaces")); + return false; + } + // If the target node matches the end of the hierarchy, move up past it, otherwise, start at the end + var hierIdx = contextHier[curNS].length - (curHier.node.isSameNode(contextNode) ? 2 : 1); + while (hierIdx >= 0 && partIdx >= 0) { + var part = ruleParts[partIdx]; + var matchesPart = ruleParts[partIdx].matches(contextHier, hierIdx); + if (part.connector === ">") { + if (!matchesPart) { + // Direct parent check and doesn't match + return false; + } + else { + // Direct parent check and does match + --partIdx; + --hierIdx; + } + } + else if (part.connector === " ") { + if (part.inclusive) { + // inclusive ancestor match + if (matchesPart) { + --partIdx; + } + // If doesn't match, just move up the role hierarchy + --hierIdx; + } + else if (!matchesPart) { + // exclusive ancestor match and current matches + return false; + } + else { + // exclusive ancestor match and current doesn't match - check for other ancestors + var parentMatch = false; + for (var searchIdx = hierIdx - 1; !parentMatch && searchIdx >= 0; --searchIdx) { + parentMatch = !ruleParts[partIdx].matches(contextHier, searchIdx); + } + if (parentMatch) + return false; + else + --partIdx; + } + } + else { + throw new Error("Context connector " + part.connector + " is not supported"); + } + } + return partIdx === -1; + }; + Engine.prototype.getMatchingRules = function (ctxHier) { + var matches = []; + function addMatches(rules) { + for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) { + var rule = rules_2[_i]; + if (rule.rule.enabled && Engine.match(rule, ctxHier)) { + matches.push(rule); + } + } + } + for (var ns in ctxHier) { + var role = ns + ":" + (ctxHier[ns].length > 0 ? ctxHier[ns][ctxHier[ns].length - 1].role : "none"); + if (role in this.inclRules) { + addMatches(this.inclRules[role]); + } + for (var xRole in this.exclRules) { + if (xRole !== role) { + addMatches(this.exclRules[xRole]); + } + } + if (role !== ns + ":none") { + if (role.startsWith(ns + ":/")) { + if (ns + ":/*" in this.inclRules) { + addMatches(this.inclRules[ns + ":/*"]); + } + } + else { + if (ns + ":*" in this.inclRules) { + addMatches(this.inclRules[ns + ":*"]); + } + } + } + } + return this.sortDeps(matches); + }; + /** + * Sorts the rules in order to execute dependencies in the correct order + * @param inRules List of wrapped rules to sort + * @returns Sorted list of wrapped rules + */ + Engine.prototype.sortDeps = function (inRules) { + var depRules = []; + for (var _i = 0, inRules_1 = inRules; _i < inRules_1.length; _i++) { + var rule = inRules_1[_i]; + depRules.push(rule); + } + var retVal = []; + var idToRule = {}; + // Iterate through the rules. If that rule's dependencies can be met by rules already in the list, add it to the list + // Repeat until no changes are made to the satisfied list + // If a rule cannot be satisfied, it will never execute, so it can be dropped. + var change = false; + do { + change = false; + for (var idx = 0; idx < depRules.length; ++idx) { + var depRule = depRules[idx]; + if (depRule.rule.id in idToRule) + continue; + var allMatch = true; + if (depRule.rule.dependencies && depRule.rule.dependencies.length > 0) { + for (var _a = 0, _b = depRule.rule.dependencies; _a < _b.length; _a++) { + var depId = _b[_a]; + if (!(depId in idToRule)) { + allMatch = false; + } + } + } + // if (depRule.rule.prereqs && depRule.rule.prereqs.length > 0) { + // for (const depId of depRule.rule.prereqs) { + // if (!(depId in idToRule)) { + // allMatch = false; + // } + // } + // } + if (allMatch) { + change = true; + retVal.push(depRule); + idToRule[depRule.rule.id] = true; + depRules.splice(idx--, 1); + } + } + } while (change); + return retVal; + }; + return Engine; +}()); +exports.Engine = Engine; + + +/***/ }, + +/***/ "./src/v2/config/Config.ts" +/*!*********************************!*\ + !*** ./src/v2/config/Config.ts ***! + \*********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Config = void 0; +var Config = /** @class */ (function () { + function Config() { + } + Config.DEBUG = false; + Config.helpRoot = "https://able.ibm.com/rules/archives"; + return Config; +}()); +exports.Config = Config; + + +/***/ }, + +/***/ "./src/v2/dom/DOMMapper.ts" +/*!*********************************!*\ + !*** ./src/v2/dom/DOMMapper.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMMapper = void 0; +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMMapper = /** @class */ (function (_super) { + __extends(DOMMapper, _super); + function DOMMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + DOMMapper.prototype.getRole = function (node) { + return node.nodeName.toLowerCase(); + }; + DOMMapper.prototype.getNamespace = function () { + return "dom"; + }; + DOMMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + retVal[attrInfo.name.toLowerCase()] = attrInfo.nodeValue; + } + } + return retVal; + }; + /** + * get scaled bounds for screenshot etc. adjusted for devicePixelRatio and scroll + * @param node + * @returns + */ + DOMMapper.prototype.getBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_Bounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var adjustment = 1; + if (node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.devicePixelRatio) { + adjustment = node.ownerDocument.defaultView.devicePixelRatio; + } + var bounds = node.getBoundingClientRect(); + // Do a check whether bounds has value as we use different tool (htmlUnit, browser) to call this function + if (bounds) { + var scrollX_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil((bounds.left + scrollX_1) * adjustment), + "top": Math.ceil((bounds.top + scrollY_1) * adjustment), + "height": Math.ceil(bounds.height * adjustment), + "width": Math.ceil(bounds.width * adjustment) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_Bounds", ret); + return ret; + } + return null; + }; + /** + * get real CSS bounds in css pixels, adjusted for scroll only + * @param node + * @returns + */ + DOMMapper.prototype.getUnadjustedBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_UnadjustedBounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var bounds = node.getBoundingClientRect(); + // adjusted for scroll if any + if (bounds) { + var scrollX_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil(bounds.left + scrollX_2), + "top": Math.ceil(bounds.top + scrollY_2), + "height": Math.ceil(bounds.height), + "width": Math.ceil(bounds.width) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_UnadjustedBounds", ret); + return ret; + } + return null; + }; + return DOMMapper; +}(CommonMapper_1.CommonMapper)); +exports.DOMMapper = DOMMapper; + + +/***/ }, + +/***/ "./src/v2/dom/DOMUtil.ts" +/*!*******************************!*\ + !*** ./src/v2/dom/DOMUtil.ts ***! + \*******************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ./DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +/** + * Utility class providing helper methods for DOM manipulation and traversal operations. + * Used throughout the accessibility checker engine to navigate and analyze DOM structures. + */ +var DOMUtil = /** @class */ (function () { + function DOMUtil() { + } + /** + * Checks if a given node has an ancestor element with a node name matching any of the provided names. + * Traverses up the DOM tree from the given node until a match is found or the root is reached. + * + * @param node - The starting DOM node to check + * @param names - Array of node names (tag names) to search for in uppercase (e.g., ['TABLE', 'DIV']) + * @returns true if an ancestor with a matching name is found, false otherwise + */ + DOMUtil.hasParent = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName)) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return !!p; + }; + /** + * Retrieves the first ancestor element that matches any of the provided node names (case-insensitive). + * Similar to hasParent but returns the actual element reference and performs case-insensitive comparison. + * + * @param node - The starting DOM node + * @param names - Array of lowercase node names to search for (e.g., ['table', 'div']) + * @returns The matching ancestor element, or null if none found + */ + DOMUtil.getAncestor = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName.toLowerCase())) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return p; + }; + /** + * Determines if two nodes are the same node, with fallback strategies for different browser environments. + * Uses multiple comparison methods for cross-browser compatibility: + * 1. Strict equality (===) + * 2. isSameNode() method if available + * 3. compareDocumentPosition() (returns 0 if same node) + * 4. Returns true as last resort if no comparison method is available + * + * @param a - First node to compare + * @param b - Second node to compare + * @returns true if nodes are the same, false otherwise + */ + DOMUtil.sameNode = function (a, b) { + if (a === b) { + return true; + } + else if (a.isSameNode) { + return a.isSameNode(b); + } + else if (a.compareDocumentPosition) { + return a.compareDocumentPosition(b) === 0; + } + else { + // Not supported in this environment - try our best + return true; + } + }; + /** + * Normalizes whitespace in a string by replacing all whitespace characters + * (spaces, tabs, carriage returns, newlines) with single spaces and collapsing + * multiple consecutive spaces into one. + * + * @param s - The input string to clean + * @returns The cleaned string with normalized whitespace + * @example "Hello\n\t World" → "Hello World" + */ + DOMUtil.cleanWhitespace = function (s) { + var retVal = s.replace(/[ \t\r\n]/g, " ").replace(/ +/g, " "); + return retVal; + }; + /** + * Collapses multiple consecutive spaces into a single space. + * Unlike cleanWhitespace, only handles spaces, not other whitespace characters like tabs or newlines. + * + * @param s - The input string to clean + * @returns The string with collapsed spaces + */ + DOMUtil.cleanSpace = function (s) { + var retVal = s.replace(/ +/g, " "); + return retVal; + }; + /** + * Determines if two elements (typically table cells) belong to the same table element. + * Finds the table ancestor for each element and compares them using sameNode(). + * + * @param element1 - First element to check + * @param element2 - Second element to check + * @returns true if both elements share the same table ancestor, false otherwise + */ + DOMUtil.isInSameTable = function (element1, element2) { + if (element1 && element2) { + var parentName = ['table']; + var parent1 = DOMUtil.getAncestor(element1, parentName); + var parent2 = DOMUtil.getAncestor(element2, parentName); + if (parent1 !== null && parent2 != null && DOMUtil.sameNode(parent1, parent2)) + return true; + } + return false; + }; + /** + * Traverses up the DOM tree to find the shadow root (document fragment) that contains the given node. + * Important for handling Web Components and Shadow DOM structures in accessibility checking. + * + * @param node - The starting node + * @returns The shadow root node (nodeType 11 = DOCUMENT_FRAGMENT_NODE), or null if none found + */ + DOMUtil.shadowRootNode = function (node) { + var nd = node; + while (nd != null && nd.nodeType !== 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + nd = nd.parentNode; + return nd; + }; + /** + * Creates a deep copy of an object while preserving Node references (doesn't clone Node objects). + * Useful when copying data structures that contain DOM node references, as you typically want + * to preserve those references rather than attempting to clone the nodes themselves. + * + * Behavior: + * - Primitive values: Deep copied via JSON serialization + * - Functions: Returned as-is (reference) + * - Node objects: Returned as-is (reference, not cloned) + * - Arrays/Objects: Recursively copied with the same rules + * + * @param rhs - The object to copy (right-hand side) + * @returns A copy of the object with Node references preserved + */ + DOMUtil.objectCopyWithNodeRefs = function (rhs) { + if (!rhs) + return rhs; + if (typeof rhs !== "object") { + if (typeof rhs === "function") { + return rhs; + } + else { + return JSON.parse(JSON.stringify(rhs)); + } + } + else if (rhs instanceof Node || !!rhs.nodeType) { + return rhs; + } + else { + var retVal = void 0; + if (rhs.constructor.name === "Array") { + retVal = []; + for (var _i = 0, rhs_1 = rhs; _i < rhs_1.length; _i++) { + var item = rhs_1[_i]; + retVal.push(this.objectCopyWithNodeRefs(item)); + } + } + else { + retVal = {}; + for (var key in rhs) { + retVal[key] = this.objectCopyWithNodeRefs(rhs[key]); + } + } + return retVal; + } + }; + /** + * Finds the first ancestor element that has a specific attribute with a specific value. + * Traverses up the DOM tree from the given element until a matching ancestor is found. + * + * @param element - The starting element + * @param attrName - The attribute name to search for + * @param attrValue - The expected attribute value + * @returns The matching ancestor element, or null if none found + * @example Finding an ancestor with aria-hidden="true" or data-testid="container" + */ + DOMUtil.getAncestorWithAttribute = function (element, attrName, attrValue) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (walkNode.nodeType === 1 /* Node.ELEMENT_NODE */ && walkNode.getAttribute(attrName) === attrValue) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + return DOMUtil; +}()); +exports.DOMUtil = DOMUtil; + + +/***/ }, + +/***/ "./src/v2/dom/DOMWalker.ts" +/*!*********************************!*\ + !*** ./src/v2/dom/DOMWalker.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMWalker = void 0; +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * Walks in a DOM order + * + * Assumption that nodes of shadow DOMs call assignSlots on the shadow root before + * doing other processing in that tree. If you walk into a shadow root, the DOMWalker + * will do it automatically. + * + * See also ../aria/ARIAWalker + */ +var DOMWalker = /** @class */ (function () { + function DOMWalker(element, bEnd, root, considerHidden, DEBUG) { + this.DEBUGIDX = 0; + this.indent = 0; + this.DEBUG = !!DEBUG; + this.root = root || ((element && element.ownerDocument) ? element.ownerDocument.documentElement : element); + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + if (this.node.nodeType === 9) { + this.node = this.node.documentElement; + } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + this.considerHidden = considerHidden || false; + } + DOMWalker.prototype.elem = function () { + return this.node.nodeType === 1 && this.node || null; + }; + DOMWalker.parentNode = function (node) { + if (node === null) + return null; + var p = node.parentNode; + if (node.slotOwner) { + p = node.slotOwner; + } + else if (node.ownerElement) { + p = node.ownerElement; + } + else if (p && p.nodeType === 11) { + if (p.host) { + p = p.host; + } + else { + p = null; + } + } + return p; + }; + DOMWalker.parentElement = function (node) { + var elem = node; + do { + elem = DOMWalker.parentNode(elem); + } while (elem && elem.nodeType !== 1); + return elem; + }; + DOMWalker.assignSlots = function (root) { + var slots = root.querySelectorAll("slot"); + for (var iSlot = 0; iSlot < slots.length; ++iSlot) { + var processSlot = slots[iSlot]; + var assignedNodes = processSlot.assignedNodes(); + for (var iAssigned = 0; iAssigned < assignedNodes.length; ++iAssigned) { + assignedNodes[iAssigned].slotOwner = processSlot; + assignedNodes[iAssigned].slotIndex = iAssigned; + } + } + }; + DOMWalker.firstChildNotOwnedBySlot = function (node) { + var retVal = node.firstChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.lastChildNotOwnedBySlot = function (node) { + var retVal = node.lastChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.nextSiblingNotOwnedBySlot = function (node) { + var retVal = node.nextSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.previousSiblingNotOwnedBySlot = function (node) { + var retVal = node.previousSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.prototype.atRoot = function () { + if (this.node.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + DOMWalker.prototype.nextNode = function () { + var _this = this; + var indent = function () { + var s = ""; + for (var idx = 0; idx < _this.indent; ++idx) { + s += " "; + } + return s; + }; + var DBG = false; //this.DEBUGIDX >= 7 && this.DEBUGIDX <= 10; + var startName = this.node.nodeName; + if (!this.node) { + this.bEndTag = false; + return false; + } + do { + //console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + DBG && console.log("!!!Into Frame"); + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + DBG && console.log("!!!Into shadow root"); + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + DBG && console.log("!!!Into slot"); + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker.firstChildNotOwnedBySlot(this.node)) { + DBG && console.log("!!!First child"); + this.node = DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + DBG && console.log("!!!Flip to end tag"); + this.bEndTag = true; + } + } + else { + DBG && console.log("!!!1"); + if (this.atRoot()) { + DBG && console.log("!!!Done at root"); + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + DBG && console.log("!!!Next slot child"); + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + DBG && console.log("!!!Back up to slot owner"); + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + DBG && console.log("!!!Up to frame owner"); + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + DBG && console.log("!!!Next sibling"); + this.node = DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + } + else if (this.node.parentNode) { + DBG && console.log("!!!Parent"); + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + DBG && console.log("!!!Done with walk"); + return false; + } + } + if (DBG && ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"))) { + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++, " SKIPPED")); + } + } while ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + if (this.bEndTag) + this.indent -= 2; + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++)); + this.DEBUG && this.node.slotOwner && console.log(indent() + "slotOwner: ".concat(this.node.slotOwner.nodeName)); + this.DEBUG && this.node.slotIndex && console.log(indent() + "slotIndex: ".concat(this.node.slotIndex)); + this.DEBUG && this.node.ownerElement && console.log(indent() + "ownerElement: ".concat(this.node.ownerElement.nodeName)); + if (!this.bEndTag) + this.indent += 2; + return true; + }; + DOMWalker.prototype.prevNode = function () { + do { + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && elementNode.assignedNodes().length > 0) { + // Enter slot with assigned nodes - go to last assigned node + var slotElement = elementNode; + this.node = slotElement.assignedNodes()[slotElement.assignedNodes().length - 1]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var prevSlotIndex = this.node.slotIndex - 1; + if (prevSlotIndex >= 0) { + this.node = slotOwner.assignedNodes()[prevSlotIndex]; + this.bEndTag = true; + } + else { + this.node = slotOwner; + this.bEndTag = false; + } + } + else if (DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + } + else if (this.node.parentNode) { + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + return true; + }; + return DOMWalker; +}()); +exports.DOMWalker = DOMWalker; + + +/***/ }, + +/***/ "./src/v4/api/IGuideline.ts" +/*!**********************************!*\ + !*** ./src/v4/api/IGuideline.ts ***! + \**********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eGuidelineType = exports.eGuidelineCategory = exports.eToolkitLevel = void 0; +var eToolkitLevel; +(function (eToolkitLevel) { + eToolkitLevel["LEVEL_ONE"] = "1"; + eToolkitLevel["LEVEL_TWO"] = "2"; + eToolkitLevel["LEVEL_THREE"] = "3"; + eToolkitLevel["LEVEL_FOUR"] = "4"; +})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {})); +var eGuidelineCategory; +(function (eGuidelineCategory) { + eGuidelineCategory["ACCESSIBILITY"] = "Accessibility"; + eGuidelineCategory["DESIGN"] = "Design"; + eGuidelineCategory["OTHER"] = "Other"; +})(eGuidelineCategory = exports.eGuidelineCategory || (exports.eGuidelineCategory = {})); +var eGuidelineType; +(function (eGuidelineType) { + eGuidelineType["DEFAULT"] = "default"; + eGuidelineType["EXTENSION"] = "extension"; +})(eGuidelineType = exports.eGuidelineType || (exports.eGuidelineType = {})); + + +/***/ }, + +/***/ "./src/v4/api/IRule.ts" +/*!*****************************!*\ + !*** ./src/v4/api/IRule.ts ***! + \*****************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulePolicy = exports.eRuleConfidence = void 0; +var eRuleConfidence; +(function (eRuleConfidence) { + eRuleConfidence["PASS"] = "PASS"; + eRuleConfidence["FAIL"] = "FAIL"; + eRuleConfidence["POTENTIAL"] = "POTENTIAL"; + eRuleConfidence["MANUAL"] = "MANUAL"; +})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {})); +var eRulePolicy; +(function (eRulePolicy) { + eRulePolicy["VIOLATION"] = "VIOLATION"; + eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION"; + eRulePolicy["INFORMATION"] = "INFORMATION"; +})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {})); +function RulePass(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePass = RulePass; +function RuleRender(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: 0, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleRender = RuleRender; +function RuleFail(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleFail = RuleFail; +function RulePotential(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePotential = RulePotential; +function RuleManual(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleManual = RuleManual; +/** + * @deprecated See ./IGuideline + */ +var IGuideline_1 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eToolkitLevel", ({ enumerable: true, get: function () { return IGuideline_1.eToolkitLevel; } })); +/** + * @deprecated See ./IGuideline:eGuidelineCategory + */ +var IGuideline_2 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRuleCategory", ({ enumerable: true, get: function () { return IGuideline_2.eGuidelineCategory; } })); +/** + * @deprecated See ./IGuideline:eGuidelineType + */ +var IGuideline_3 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRulesetType", ({ enumerable: true, get: function () { return IGuideline_3.eGuidelineType; } })); + + +/***/ }, + +/***/ "./src/v4/checker/Checker.ts" +/*!***********************************!*\ + !*** ./src/v4/checker/Checker.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Checker = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var Engine_1 = __webpack_require__(/*! ../../v2/common/Engine */ "./src/v2/common/Engine.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var rulesets_1 = __webpack_require__(/*! ../rulesets */ "./src/v4/rulesets.ts"); +var checkRulesV4 = __importStar(__webpack_require__(/*! ../rules */ "./src/v4/rules/index.ts")); +var IGuideline_1 = __webpack_require__(/*! ../api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var checkRules = []; +var checkNls = {}; +var checkHelp = {}; +function _initialize() { + var langs = JSON.parse(JSON.stringify(Engine_1.Engine.getLanguages())); + // Default lang to en-US if nothing else specified is found + langs.push("en-US"); + // Process V4 rules into the V2 format + for (var rulename in checkRulesV4) { + // Convert rule + var v4Rule = checkRulesV4[rulename]; + checkRules.push(v4Rule); + // Go backwards because the first lang is the preferred, so + // earlier languages will override later languages + for (var idx = langs.length - 1; idx >= 0; --idx) { + var langId = langs[idx]; + if (langId in v4Rule.messages) { + checkNls[v4Rule.id] = v4Rule.messages[langId]; + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + if (langId in v4Rule.help) { + checkHelp[v4Rule.id] = {}; + for (var reasonId in v4Rule.help[langId]) { + checkHelp[v4Rule.id][reasonId] = "/".concat(langId, "/").concat(v4Rule.help[langId][reasonId]); + } + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + } + // Convert RS + for (var _i = 0, _a = v4Rule.rulesets; _i < _a.length; _i++) { + var rsSection = _a[_i]; + for (var _b = 0, _c = rulesets_1.a11yRulesets; _b < _c.length; _b++) { + var rs = _c[_b]; + var checkRsIds = typeof rsSection.id === "string" ? [rsSection.id] : rsSection.id; + if (checkRsIds.includes(rs.id)) { + for (var _d = 0, _e = rs.checkpoints; _d < _e.length; _d++) { + var cp = _e[_d]; + var checkCPIds = typeof rsSection.num === "string" ? [rsSection.num] : rsSection.num; + if (checkCPIds.includes(cp.num)) { + cp.rules = cp.rules || []; + cp.rules.push({ + id: v4Rule.id, + reasonCodes: rsSection.reasonCodes, + level: rsSection.level, + toolkitLevel: rsSection.toolkitLevel + }); + } + } + } + } + } + } +} +_initialize(); +var Checker = /** @class */ (function () { + function Checker() { + this.guidelines = []; + /** + * @deprecated Use getGuidelines(). + */ + this.rulesets = this.guidelines; + /** + * @deprecated Use getGuidelineIds(). + */ + this.rulesetIds = []; + this.rulesetRules = {}; + this.ruleLevels = {}; + this.ruleReasonLevels = {}; + this.ruleCategory = {}; + var engine = this.engine = new Engine_1.Engine(); + engine.addMapper(new ARIAMapper_1.ARIAMapper()); + engine.addRules(checkRules); + engine.addNlsMap(checkNls); + engine.addHelpMap(checkHelp); + for (var _i = 0, a11yRulesets_1 = rulesets_1.a11yRulesets; _i < a11yRulesets_1.length; _i++) { + var rs = a11yRulesets_1[_i]; + this.addRuleset(rs); + } + } + /** + * Adds a guideline to the engine. If the id already exists, the previous guideline will be replaced. + * @param guideline + */ + Checker.prototype.addGuideline = function (guideline) { + if (guideline.id in this.rulesetRules) { + this.removeGuideline(guideline.id); + } + this.guidelines.push(guideline); + this.rulesetIds.push(guideline.id); + var ruleIds = []; + for (var _i = 0, _a = guideline.checkpoints; _i < _a.length; _i++) { + var cp = _a[_i]; + cp.rules = cp.rules || []; + for (var _b = 0, _c = cp.rules; _b < _c.length; _b++) { + var rule = _c[_b]; + if (rule.enabled !== false) { + ruleIds.push(rule.id); + //this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {}; + //this.ruleLevels[rule.id][guideline.id] = rule.level; + this.ruleReasonLevels[rule.id] = this.ruleReasonLevels[rule.id] || {}; + this.ruleReasonLevels[rule.id][guideline.id] = this.ruleReasonLevels[rule.id][guideline.id] || {}; + var code = rule.reasonCodes ? rule.reasonCodes.join('--') : "None"; + this.ruleReasonLevels[rule.id][guideline.id][code] = rule.level; + this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {}; + this.ruleCategory[rule.id][guideline.id] = guideline.category; + } + } + } + this.rulesetRules[guideline.id] = ruleIds; + }; + /** + * Enable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.enableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled === false) { + updated = true; + delete rule.enabled; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Disable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.disableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled !== false) { + updated = true; + rule.enabled = false; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Remove a guideline from the engine + * + * Generally, there isn't a good reason to do this. Users should just not select the guideline as an option in check + * @param guidelineId + */ + Checker.prototype.removeGuideline = function (guidelineId) { + if (guidelineId in this.rulesetRules) { + delete this.rulesetRules[guidelineId]; + this.rulesets = this.guidelines = this.guidelines.filter(function (guideline) { return guideline.id !== guidelineId; }); + this.rulesetIds = this.getGuidelineIds(); + } + }; + /** + * Get the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelines = function () { + return JSON.parse(JSON.stringify(this.guidelines)); + }; + /** + * Get the ids of the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelineIds = function () { + return this.guidelines.map(function (guideline) { return guideline.id; }); + }; + /** + * + * @deprecated See addGuideline + */ + Checker.prototype.addRuleset = function (rs) { + this.addGuideline(rs); + }; + Checker.prototype.enableSourceMap = function (enable) { + this.engine.enableSourceMap(enable); + }; + Checker.prototype.isSourceMapEnabled = function () { + return this.engine.isSourceMapEnabled(); + }; + /** + * Perform a check of the specified node/document + * @param node DOMNode or Document on which to run the check + * @param guidelineIds Guideline ids to check with to specify which rules to run + * @returns + */ + Checker.prototype.check = function (node, guidelineIds) { + // Determine which rules to run + var ruleIds = []; + // Fix the input + if (!guidelineIds) { + ruleIds = this.engine.getRulesIds(); + } + else { + if (typeof guidelineIds === "string") { + guidelineIds = [guidelineIds]; + } + for (var _i = 0, guidelineIds_1 = guidelineIds; _i < guidelineIds_1.length; _i++) { + var rsId = guidelineIds_1[_i]; + if (rsId in this.rulesetRules) { + ruleIds = ruleIds.concat(this.rulesetRules[rsId]); + } + } + } + this.engine.enableRules(ruleIds); + // Add the report levels + var myThis = this; + return this.engine.run(node) + .then(function (report) { + report.nls = {}; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (result.ruleId in checkNls) { + report.nls[result.ruleId] = report.nls[result.ruleId] || { + 0: checkNls[result.ruleId][0] + }; + if (result.reasonId in checkNls[result.ruleId]) { + report.nls[result.ruleId][result.reasonId] = checkNls[result.ruleId][result.reasonId]; + } + } + //result.value[0] = myThis.getLevel(guidelineIds as string[], result.ruleId); + var code = result.reasonId ? result.reasonId : "None"; + result.value[0] = myThis.getReasonLevel(guidelineIds, result.ruleId, code); + result.category = myThis.getCategory(guidelineIds, result.ruleId); + delete result.path.css; + } + return report; + }); + }; + Checker.prototype.getLevel = function (rsIds, ruleId) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleLevels)) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) { + var rsId = rsIds_1[_i]; + if (rsId in rsInfo) { + if (rsInfo[rsId] === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (rsInfo[rsId] === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getReasonLevel = function (rsIds, ruleId, reasonCode) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleReasonLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleReasonLevels)) { + throw new Error("Rule triggered for which we have no rule level information " + ruleId); + } + var _loop_1 = function (rsId) { + if (rsId in rsInfo) { + var reCode_1 = new RegExp("(^|--)".concat(reasonCode, "($|--)")); + Object.keys(rsInfo[rsId]).forEach(function (code) { + var level = null; + if (code === 'None') + level = rsInfo[rsId]["None"]; + else if (reCode_1.test(code)) + level = rsInfo[rsId][code]; + if (level !== null) { + if (level === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (level === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }); + if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }; + for (var _i = 0, rsIds_2 = rsIds; _i < rsIds_2.length; _i++) { + var rsId = rsIds_2[_i]; + _loop_1(rsId); + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getCategory = function (rsIds, ruleId) { + var rsInfo = this.ruleCategory[ruleId]; + var retVal = ""; + if (!(ruleId in this.ruleCategory)) { + return IGuideline_1.eGuidelineCategory.OTHER; + } + if (!rsIds) { + rsIds = this.getGuidelineIds(); + } + for (var _i = 0, rsIds_3 = rsIds; _i < rsIds_3.length; _i++) { + var rsId = rsIds_3[_i]; + if (rsId in rsInfo) { + return rsInfo[rsId]; + } + } + return IGuideline_1.eGuidelineCategory.OTHER; + }; + return Checker; +}()); +exports.Checker = Checker; + + +/***/ }, + +/***/ "./src/v4/rules/a_target_warning.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/a_target_warning.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_target_warning = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.a_target_warning = { + id: "a_target_warning", + context: "dom:a[target],dom:area[target],dom:base[target]", + refactor: { + "WCAG20_A_TargetAndText": { + "Pass_0": "pass", + "Potential_1": "potential_warn" + } + }, + help: { + "en-US": { + "group": "a_target_warning.html", + "pass": "a_target_warning.html", + "potential_warn": "a_target_warning.html" + } + }, + messages: { + "en-US": { + "group": "Users should be warned in advance if their input action will open a new window", + "pass": "The user is warned in advance that the input action opens a new window", + "potential_warn": "Inform the user when their input action will open a new window" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.2.2", + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // skip the rule if it's AT hidden and not tabbable + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var params = { + paramWinText: { + value: ["new window", "new tab"], + type: "array" + } + }; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr == "_parent" || tStr == "_self" || tStr == "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + // Check aria-describedby for warning text + if (ruleContext.hasAttribute("aria-describedby")) { + var describedbyIds = ruleContext.getAttribute("aria-describedby").trim().split(/\s+/); + for (var _i = 0, describedbyIds_1 = describedbyIds; _i < describedbyIds_1.length; _i++) { + var id = describedbyIds_1[_i]; + var referencedElem = fragment_1.FragmentUtil.getById(ruleContext, id); + if (referencedElem) { + var describedText = CommonUtil_1.CommonUtil.getInnerText(referencedElem); + if (describedText && describedText.trim().length > 0) { + textStr += " " + describedText; + } + } + } + } + for (var i = 0; !passed && i < params.paramWinText.value.length; ++i) + if (textStr.indexOf(params.paramWinText.value[i]) != -1) + passed = true; + } + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_warn"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/a_text_purpose.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/a_text_purpose.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_text_purpose = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.a_text_purpose = { + id: "a_text_purpose", + // doc-biblioref is a link + context: "aria:link,aria:doc-biblioref", + refactor: { + "WCAG20_A_HasText": { + "Pass_0": "pass", + "Fail_1": "fail_acc_name" + } + }, + help: { + "en-US": { + "group": "a_text_purpose.html", + "pass": "a_text_purpose.html", + "fail_acc_name": "a_text_purpose.html" + } + }, + messages: { + "en-US": { + "group": "Hyperlinks must have an accessible name for their purpose", + "pass": "Hyperlink has a description of its purpose", + "fail_acc_name": "Hyperlink has no link text, label or image with a text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["2.4.4", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: "c487ae", + run: function (context, options) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Rule only passes if an element has inner content, + // in the case that there is only hidden content under the the element it is a violation + var accName_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = (accName_pair && accName_pair.name && accName_pair.name.trim().length > 0) + /**ARIAMapper.computeName(ruleContext).trim().length > 0*/ + || CommonUtil_1.CommonUtil.nonTabableChildCheck(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_acc_name"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/applet_alt_exists.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/applet_alt_exists.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.applet_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.applet_alt_exists = { + id: "applet_alt_exists", + context: "dom:applet", + refactor: { + "WCAG20_Applet_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "applet_alt_exists.html", + "Pass_0": "applet_alt_exists.html", + "Fail_1": "applet_alt_exists.html", + "Fail_2": "applet_alt_exists.html", + "Fail_3": "applet_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<applet> elements must provide an 'alt' attribute and an alternative description", + "Pass_0": "Rule Passed", + "Fail_1": "An <applet> element does not have an 'alt' attribute that provides a short text alternative", + "Fail_2": "The 'alt' attribute value for an <applet> element duplicates the 'code' attribute", + "Fail_3": "An <applet> element provides alternative text, but does not provide inner content" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + var alt = ruleContext.getAttribute("alt").trim(); + if (ruleContext.hasAttribute("code") && alt == ruleContext.getAttribute("code").trim()) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/application_content_accessible.ts" +/*!********************************************************!*\ + !*** ./src/v4/rules/application_content_accessible.ts ***! + \********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.application_content_accessible = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.application_content_accessible = { + id: "application_content_accessible", + context: "aria:application", + refactor: { + "HAAC_Application_Role_Text": { + 0: "HAAC_Application_Role_Text.html", + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + 0: "application_content_accessible.html", + "Pass_0": "application_content_accessible.html", + "Potential_1": "application_content_accessible.html" + } + }, + messages: { + "en-US": { + "group": "Non-decorative static text and image content within an element with \"application\" role must be accessible", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the non-decorative static text and image content within an element with \"application\" role are accessible" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.1.1", "2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var children = ruleContext.childNodes; + for (var i = 0; passed && i < children.length; i++) { + if (children[i].nodeType === 1) { + if (VisUtil_1.VisUtil.isNodeVisible(children[i])) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "document") || AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "article"); + } + } + else if (children[i].nodeType === 3) { + passed = children[i].nodeValue.trim().length === 0; + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/area_alt_exists.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/area_alt_exists.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.area_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.area_alt_exists = { + id: "area_alt_exists", + context: "dom:area", + refactor: { + "WCAG20_Area_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "area_alt_exists.html", + "Pass_0": "area_alt_exists.html", + "Fail_1": "area_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<area> elements in an image map must have a text alternative", + "Pass_0": "Rule Passed", + "Fail_1": "<area> element in an image map has no text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_accessiblename_exists.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_accessiblename_exists.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_accessiblename_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +exports.aria_accessiblename_exists = { + id: "aria_accessiblename_exists", + context: "aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example", + help: { + "en-US": { + "pass": "aria_accessiblename_exists.html", + "fail_no_accessible_name": "aria_accessiblename_exists.html", + "fail_no_accessible_name_image": "aria_accessiblename_exists.html", + "group": "aria_accessiblename_exists.html" + } + }, + messages: { + "en-US": { + "pass": "An accessible name is provided for the element", + "fail_no_accessible_name": "Element <{0}> with \"{1}\" role has no accessible name", + "fail_no_accessible_name_image": "Element <{0}> with \"{1}\" role has no accessible name", + "group": "Elements with certain roles should have accessible names" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name_image"] + }], + act: [{ "23a2a8": { "fail_no_accessible_name_image": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg element is handled in svg_graphics_labbelled rule and image rules + if (nodeName === 'svg' || nodeName === 'img') + return; + // when table element with a caption as first child + if (nodeName === 'table' + && ruleContext.firstElementChild && ruleContext.firstElementChild.nodeName.toLowerCase() === 'caption' + && ruleContext.firstElementChild.textContent && ruleContext.firstElementChild.textContent.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (invalidRoles && invalidRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role || !ARIADefinitions_1.ARIADefinitions.designPatterns[role] || !ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameRequired) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!name_pair || !name_pair.name || name_pair.name.trim().length === 0) { + if (role === 'img' || role === 'image') + return (0, IRule_1.RuleFail)("fail_no_accessible_name_image", [ruleContext.nodeName.toLowerCase(), role]); + return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), role]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts" +/*!**************************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_tabindex_valid.ts ***! + \**************************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_tabindex_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_activedescendant_tabindex_valid = { + id: "aria_activedescendant_tabindex_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "Rpt_Aria_InvalidTabindexForActivedescendant": { + "pass": "pass", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "pass": "aria_activedescendant_tabindex_valid.html", + "Fail_1": "aria_activedescendant_tabindex_valid.html", + "group": "aria_activedescendant_tabindex_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "Fail_1": "The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable", + "group": "Element using 'aria-activedescendant' property should be tabbable" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Rule not supported on mobile + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + // Handle the case where the element is hidden by a disabled HTML5 attribute or aria-disabled: + // 1. In the case that this element has a disabled attribute and the element supports it, we mark this rule as passed. + // 2. In the case that this element has an aria-disabled attribute then, we mark this rule as passed. + // For both of the cases above we do not need to perform any further checks, as the element is disabled in some form or another. + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + //ignore if the attribute 'aria-activedescendant' is blank + if (ruleContext.getAttribute("aria-activedescendant").trim().length === 0) + return; + // If the tabindex attribute is provided then verify that it is 0 or -1 + passed = CommonUtil_1.CommonUtil.isTabbable(ruleContext); + // pass if one of the children is tabbable. in this case, the tab will stop on the first tabbable element + if (!passed) + passed = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext) > 0; + // Build array for node token + var retToken1 = new Array(); + retToken1.push(nodeName); + // Build array for id referenced by aria-activedescendant + var retToken2 = new Array(); + retToken2.push(ruleContext.getAttribute("aria-activedescendant").split(" ").join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_activedescendant_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_activedescendant_valid = { + id: "aria_activedescendant_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "HAAC_ActiveDescendantCheck": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + // "Fail_4": "Fail_4" + } + }, + help: { + "en-US": { + "Pass_0": "aria_activedescendant_valid.html", + "Fail_1": "aria_activedescendant_valid.html", + "Fail_2": "aria_activedescendant_valid.html", + "Fail_3": "aria_activedescendant_valid.html", + // "Fail_4": "aria_activedescendant_valid.html", + "group": "aria_activedescendant_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'aria-activedescendant' property is empty", + "Fail_2": "The 'aria-activedescendant' property references a hidden node", + "Fail_3": "Element is not a combobox, and the referenced active-descendant element is not a valid descendant", + // "Fail_4": "Element is a combobox, and the referenced active-descendant element is not controlled by this component", + "group": "The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // combobox active descendants handled by 'combobox_active_descendant' + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")) { + return null; + } + var descendant_id = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-activedescendant"); + // POF1: The attribute is empty + if (!descendant_id || descendant_id.trim() === "") { + return (0, IRule_1.RuleFail)("Fail_1"); + } + var descendant = fragment_1.FragmentUtil.getById(ruleContext, descendant_id.trim()); + if (!descendant || DOMUtil_1.DOMUtil.sameNode(descendant_id, ruleContext)) { + // The referenced element doesn't exist. We let 1077 to trigger the error + return null; + } + if (!VisUtil_1.VisUtil.isNodeVisible(descendant)) { + // POF2: aria-activedescendant references a hidden node + return (0, IRule_1.RuleFail)("Fail_2"); + } + // 1. The value of aria-activedescendant refers to an element that is either a descendant of + // the element with DOM focus + if (ruleContext.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var pofId = 2; + // or is a logical descendant as indicated by the aria-owns attribute. + if (ruleContext.hasAttribute("aria-owns")) { + var owned_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-owns").trim()).split(" "); + for (var i = 0; i < owned_ids.length; i++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owned_ids[i]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + // 2. The element with DOM focus is a textbox with aria-controls referring to an element that + // supports aria-activedescendant, and the value of aria-activedescendant specified for the + // textbox refers to either a descendant of the element controlled by the textbox or is a logical + // descendant of that controlled element as indicated by the aria-owns attribute. + // + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") && ruleContext.hasAttribute("aria-controls")) { + pofId = 3; + var controlled_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-controls").trim()).split(" "); + for (var i = 0; i < controlled_ids.length; i++) { + var controlled_ele = fragment_1.FragmentUtil.getById(ruleContext, controlled_ids[i]); + if (controlled_ele && !DOMUtil_1.DOMUtil.sameNode(controlled_ele, ruleContext) && controlled_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + if (controlled_ele.hasAttribute("aria-owns")) { + var owns_ids = CommonUtil_1.CommonUtil.normalizeSpacing(controlled_ele.getAttribute("aria-owns").trim()).split(" "); + for (var j = 0; j < owns_ids.length; j++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owns_ids[j]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + } + } + // POF3: I'm not a combobox, and the referenced active-descendant is not a descendant and not owned by the element + // that referenced it. + if (pofId == 3) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_application_label_unique.ts" +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_application_label_unique.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_application_label_unique = { + id: "aria_application_label_unique", + context: "aria:application", + refactor: { + "Rpt_Aria_MultipleApplicationLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_application_label_unique.html", + "fail_label_not_unique": "aria_application_label_unique.html", + "group": "aria_application_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"application\" role do not have unique labels", + "group": "Each element with \"application\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "application"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_application_labelled.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_application_labelled.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_application_labelled = { + id: "aria_application_labelled", + context: "aria:application", + refactor: { + "Rpt_Aria_ApplicationLandmarkLabel": { + "Pass_0": "pass", + "Fail_1": "fail_no_label" + } + }, + help: { + "en-US": { + "pass": "aria_application_labelled.html", + "fail_no_label": "aria_application_labelled.html", + "group": "aria_application_labelled.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a label that describes its purpose", + "fail_no_label": "Element with \"application\" role does not have a label", + "group": "Each element with \"application\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!pair) { + return (0, IRule_1.RuleFail)("fail_no_label"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_article_label_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_article_label_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_article_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_article_label_unique = { + id: "aria_article_label_unique", + context: "aria:article", + refactor: { + "Rpt_Aria_MultipleArticleRoles_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_article_label_unique.html", + "fail_label_not_unique": "aria_article_label_unique.html", + "group": "aria_article_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"article\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"article\" role do not have unique labels", + "group": "Each element with \"article\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "article"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_allowed.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_attribute_allowed.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_allowed = { + id: "aria_attribute_allowed", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidProperty": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_allowed.html", + "Pass_0": "aria_attribute_allowed.html", + "Fail_1": "aria_attribute_allowed.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes must be valid for the element's role", + "Pass_0": "Rule Passed", + "Fail_1": "The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "5f99a7", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var contextAttributes = ruleContext.attributes; + // This gets all elements with attributes so we still have some + // Out of Scope since not all attributes are aria + if (contextAttributes) { + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var failedProperties = ""; + var testedProperties = 0; + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + testedProperties++; + // Now we just have aria attributes which can + // pass or fail based on whether there property is valid + var dataTypes = propertyDataTypes[attrName]; + if (!dataTypes) { // if property is not in valid property list + // create failedProperties comma sep list + if (failedProperties.length == 0) { + failedProperties = attrName; + } + else { + failedProperties = failedProperties + ", " + attrName; + } + } + } + } + if (testedProperties == 0) { + return null; + } + else if (failedProperties.length != 0) { + return (0, IRule_1.RuleFail)("Fail_1", [failedProperties, ruleContext.nodeName.toLowerCase()]); + } + else { + //return RulePass(1); + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + // JCH - passing is based on all attributes not just aria attributes + // leading to OVER COUNTING so moved pass up + //return RulePass(1); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_conflict.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_conflict.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_attribute_conflict = { + id: "aria_attribute_conflict", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + // "pass": "aria_attribute_conflict.html", + "fail_conflict": "aria_attribute_conflict.html", + "group": "aria_attribute_conflict.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA attribute is not conflict with the corresponding HTML attribute", + "fail_conflict": "The ARIA attribute \"{0}\" is in conflict with the corresponding HTML attribute \"{1}\"", + "group": "An ARIA attribute must not conflict with the corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + var ret = []; + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (!ariaAttributes || ariaAttributes.length === 0) + return null; + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + for (var i = 0; i < conflictAttributes.length; i++) { + ret.push((0, IRule_1.RuleFail)("fail_conflict", [conflictAttributes[i]['ariaAttr'], conflictAttributes[i]['htmlAttr']])); + if (ariaAttributes.includes(conflictAttributes[i]['ariaAttr'])) + CommonUtil_1.CommonUtil.reduceArrayItemList([conflictAttributes[i]['ariaAttr']], ariaAttributes); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_deprecated.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_attribute_deprecated.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_deprecated = { + id: "aria_attribute_deprecated", + context: "dom:*", + help: { + "en-US": { + // "pass": "aria_attribute_deprecated.html", + "fail_aria_role": "aria_attribute_deprecated.html", + "fail_aria_attr": "aria_attribute_deprecated.html", + "fail_role_attr": "aria_attribute_deprecated.html", + "group": "aria_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA roles and attribute are used per specification", + "fail_aria_role": "The ARIA role \"{0}\" is deprecated in the ARIA specification", + "fail_aria_attr": "The ARIA attributes \"{0}\" are deprecated in the ARIA specification", + "fail_role_attr": "The ARIA attributes \"{0}\" are deprecated for the role \"{1}\" in the ARIA specification", + "group": "No deprecated ARIA role or attribute should be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var ret = []; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) { + for (var i = 0; i < deprecatedRoles.length; i++) + ret.push((0, IRule_1.RuleFail)('fail_aria_role', [deprecatedRoles[i]])); + } + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) { + for (var i = 0; i < deprecatedAttributes.length; i++) { + // "role":"any", "attribute":ariaAttrs[i]} + if (deprecatedAttributes[i].role === 'any') + ret.push((0, IRule_1.RuleFail)('fail_aria_attr', [deprecatedAttributes[i].attribute])); + else + ret.push((0, IRule_1.RuleFail)('fail_role_attr', [deprecatedAttributes[i].attribute, deprecatedAttributes[i].role])); + } + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_exists.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_attribute_exists.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_attribute_exists = { + id: "aria_attribute_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_EmptyPropertyValue": { + "pass": "pass", + "fail_empty_attribute": "fail_empty_attribute" + } + }, + help: { + "en-US": { + "pass": "aria_attribute_exists.html", + "fail_empty_attribute": "aria_attribute_exists.html", + "group": "aria_attribute_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_empty_attribute": "The element attribute(s): '{0}' value is empty", + "group": "When specifying a required ARIA attribute, the value must not be empty" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return; + var attrNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedProperties = 0; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + if (designPatterns[role] && AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext) != null) { + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + for (var i = 0, length_1 = requiredRoleProps.length; i < length_1; i++) { + var attribute = requiredRoleProps[i]; + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(requiredRoleProps[i])); + if (nodeValue.length == 0) + attrNameArr.push(requiredRoleProps[i]); + } + else if (requiredRoleProps[i] == "aria-labelledby") { + if ((role == "radiogroup") && (hasAttribute(ruleContext, "aria-label"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-label")); + if (nodeValue.length == 0) + attrNameArr.push("aria-label"); + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((role == "progressbar") && (hasAttribute(ruleContext, "aria-valuetext"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-valuetext")); + if (nodeValue.length == 0) + attrNameArr.push("aria-valuetext"); + } + } + } + } + if (designPatterns[role]) { + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var permittedRoles = []; + permittedRoles.push(role); + var allowedAttributes = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, permittedRoles, tagProperty); + for (var i = 0, length_2 = allowedAttributes.length; i < length_2; i++) { + var attribute = allowedAttributes[i]; + if (attribute == "aria-checked" || attribute == "aria-selected" || + attribute == "aria-expanded" || attribute == "aria-orientation" || + attribute == "aria-level") { + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(attribute)); + if (nodeValue.length == 0 && !attrNameArr.includes(attribute)) { + attrNameArr.push(attribute); + } + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(attrNameArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedProperties == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_empty_attribute", retMsg); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_redundant.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_attribute_redundant.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_redundant = { + id: "aria_attribute_redundant", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + "pass": "aria_attribute_redundant.html", + "fail_redundant": "aria_attribute_redundant.html", + "group": "aria_attribute_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "The ARIA attribute is not redundant with a corresponding HTML attribute", + "fail_redundant": "The ARIA attribute \"{0}\" is redundant with the HTML attribute \"{1}\"", + "group": "An ARIA attribute should not be redundant with a corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + // if conflict already reported, ignore reporting overlap + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + if (conflictAttributes && conflictAttributes.length > 0) + return null; + var domAttributes = ruleContext.attributes; + var ariaAttrs = []; + var htmlAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = ruleContext.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push({ name: attrName, value: attrValue }); + else + htmlAttrs.push({ name: attrName, value: attrValue }); + } + } + var ret = []; + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil_1.AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'overlapping'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Pass') { //pass + ret.push((0, IRule_1.RulePass)("pass")); + } + else if (item['result'] === 'Failed') { //failed + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaAttrs[i]['name'], item['attr']])); + } + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_required.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_required.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_required = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_attribute_required = { + id: "aria_attribute_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredProperties": { + "Pass_0": "pass", + "Fail_1": "fail_missing" + } + }, + help: { + "en-US": { + "group": "aria_attribute_required.html", + "pass": "aria_attribute_required.html", + "fail_missing": "aria_attribute_required.html" + } + }, + messages: { + "en-US": { + "group": "The required attributes for the element with a role must be defined", + "pass": "The required attributes for the element with the role are defined", + "fail_missing": "Element with '{0}' role does not have the required ARIA attribute(s): '{1}'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "4e8ab6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var attrNameArr = new Array(); + var roleNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let implicitRole = ARIAMapper.elemToImplicitRole(ruleContext); + //let implicitRole = AriaUtil.getImplicitRole(ruleContext); + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedRoles = 0; + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + if (designPatterns[role] && requiredRoleProps !== null) { + var allowedRoleProps = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, role, tagProperty); + var roleMissingReqProp = false; + for (var i = 0, propertiesLength = requiredRoleProps.length; i < propertiesLength; i++) { + if (!allowedRoleProps.includes(requiredRoleProps[i])) + continue; + if (!hasAttribute(ruleContext, requiredRoleProps[i])) { + // If an aria-labelledby isn't present, an aria-label will meet the requirement. + if (requiredRoleProps[i] == "aria-labelledby") { + if ((!hasAttribute(ruleContext, "aria-label")) || (role != "radiogroup")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((!hasAttribute(ruleContext, "aria-valuetext")) || (role != "progressbar")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-controls" && role == "combobox") { + // Skip this check since aria-controls in the textbox of a combobox is already handled in rule HAAC_Combobox_Must_have_Text_Input + } + else { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + } + if (roleMissingReqProp == true) { + roleNameArr.push(role); + } + } + var passed = roleNameArr.length == 0 || attrNameArr.length == 0; // only aria attributes so NO OUT OF SCOPE + if (!passed) { + var retToken = new Array(); + retToken.push(roleNameArr.join(", ")); + retToken.push(attrNameArr.join(", ")); + return (0, IRule_1.RuleFail)("fail_missing", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_value_valid.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_attribute_value_valid.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_value_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +exports.aria_attribute_value_valid = { + id: "aria_attribute_value_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "Rpt_Aria_ValidPropertyValue": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_value_valid.html", + "Pass_0": "aria_attribute_value_valid.html", + "Fail_1": "aria_attribute_value_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA property values must be valid", + "Pass_0": "Rule Passed", + "Fail_1": "The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "6a7281", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var valueArr = new Array(); + var attrNameArr = new Array(); + var dataTypeArr = new Array(); + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var contextAttributes = ruleContext.attributes; + var testedPropertyValues = 0; + if (contextAttributes) { + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = propertyDataTypes[attrName]; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue); + testedPropertyValues++; + if (dataTypes && dataTypes.values) { + if (dataTypes.values.indexOf(nodeValue) == -1) { + if (dataTypes.values.indexOf('undefined') != -1 && nodeValue.length == 0) { + //translate 'undefined' to mean '' + } + else { + // aria-relevant is represented as a space delimited list of the following values: + // additions, removals, text; or a single catch-all value all. + if (dataTypes.type === "http://www.w3.org/2001/XMLSchema#nmtokens") { + var attrValues = contextAttributes[i].nodeValue.trim().split(" "); + // if the value all is specified, it cannot have any other value + if (attrValues.length > 1 && attrValues.includes("all")) { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + else { + var hash = {}; + for (var j = 0; j < attrValues.length; j++) { + // if the individual value is not in the list of allowed values + if (attrValues[j] != "" && !dataTypes.values.includes(attrValues[j])) { + if (!hash.hasOwnProperty(attrName)) { + hash[attrName] = true; + attrNameArr.push(attrName); + } + valueArr.push(attrValues[j]); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else if (dataTypes && dataTypes.type && dataTypes.type === "http://www.w3.org/2001/XMLSchema#int") { + var iVal = parseInt(nodeValue); + if (isNaN(iVal) || ("" + iVal !== nodeValue)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && dataTypes.type == "http://www.w3.org/2001/XMLSchema#decimal") { + var fVal = parseFloat(nodeValue); + if (isNaN(fVal)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#boolean")) { + var tmpV = nodeValue.trim().toLowerCase(); + if (tmpV !== "true" && tmpV !== "false") { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#string")) { + } + else { + testedPropertyValues--; + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(valueArr.join(", ")); + retMsg.push(attrNameArr.join(", ")); + retMsg.push(ruleContext.nodeName.toLowerCase()); + // retMsg.push (dataTypeArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedPropertyValues == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", retMsg); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_banner_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_banner_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_banner_label_unique = { + id: "aria_banner_label_unique", + context: "aria:banner", + refactor: { + "Rpt_Aria_MultipleBannerLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_banner_label_unique.html", + "fail_label_not_unique": "aria_banner_label_unique.html", + "group": "aria_banner_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"banner\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"banner\" role do not have unique labels", + "group": "Each element with \"banner\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "banner", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_banner_single.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/aria_banner_single.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_banner_single = { + id: "aria_banner_single", + context: "dom:*[role], dom:header", + refactor: { + "Rpt_Aria_OneBannerInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_banner_single.html", + "Fail_1": "aria_banner_single.html", + "group": "aria_banner_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"banner\" role found on the page", + "group": "A page, document, or application should only have one element with \"banner\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "banner")) { + return null; + } + var passed = AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "banner", true, true) === null; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_child_tabbable.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_child_tabbable.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_tabbable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_tabbable = { + id: "aria_child_tabbable", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingFocusableChild": { + "pass": "pass", + "fail_missing_child": "fail_missing_child" + } + }, + help: { + "en-US": { + "pass": "aria_child_tabbable.html", + "fail_missing_child": "aria_child_tabbable.html", + "group": "aria_child_tabbable.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_missing_child": "None of the descendent elements with \"{1}\" role is tabbable", + "group": "UI component must have at least one tabbable descendant for keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) || AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + // An ARIA list is not interactive + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, { "list": true, "row": true, "rowgroup": true, "table": true, "grid": true })) { + return null; + } + // Not a valid message for mobile because all elements are focusable in iOS when VoiceOver is enabled. + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + //ignore datalist element check since it will be part of a input element or hidden by default + if (ruleContext.nodeName.toLowerCase() === 'datalist') + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + var passed = true; + var doc = ruleContext.ownerDocument; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + var nodeName = ""; + var inScope = false; + if (ARIADefinitions_1.ARIADefinitions.containers.includes(role)) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (disabled != 'true' && !hasAttribute(ruleContext, 'aria-activedescendant') && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqChildren; + if (reqChildren) { + inScope = true; + passed = false; + var xp = "descendant::*["; + for (var i = 0; i < reqChildren.length; i++) { + xp += "@role='" + reqChildren[i] + "' or "; + } + xp = xp.substring(0, xp.length - 4) + ']'; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + r = xpathResult.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + // Required child is not focusable via tabindex. See if there is a grandchild that is focusable by default or by tabindex. + if (!passed) { + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + roleNameArr = r.getAttribute("role").trim().split(" "); + nodeName = r.nodeName.toLowerCase(); + } + r = xpathResult.iterateNext(); + } + } + } + } + // Variable Decleration + var retToken1 = new Array(); + var retToken2 = new Array(); + // In the case the arrays/strings are empty, that means that there is no violation so we can reset it back to passed, the reason for this + // is that we are setting passed=false while we perform a loop which causes violation to trigger even if there is no issues. Instead of + // updating the whole rule to switch from using passed in that way simply do the check at this point. + if (nodeName.length > 0 && roleNameArr.length > 0) { + retToken1.push(nodeName); + retToken2.push(roleNameArr.join(", ")); + } + else { + passed = true; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', passed == true ? [] : [retToken1, retToken2]); + if (!inScope) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_missing_child", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_child_valid.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/aria_child_valid.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_valid = { + id: "aria_child_valid", + //context: "dom:*[role]", + //dependencies: ["Rpt_Aria_ValidRole"], + context: "dom:*", + dependencies: ["aria_role_valid", "aria_descendant_valid"], + help: { + "en-US": { + "group": "aria_child_valid.html", + "Pass": "aria_child_valid.html", + "Fail_no_child": "aria_child_valid.html", + "Fail_invalid_child": "aria_child_valid.html" + } + }, + messages: { + "en-US": { + "group": "An element with an ARIA role must own a required child", + "Pass": "An element with an ARIA role owns a required child", + "Fail_no_child": "The element with role \"{0}\" does not own any child element with any of the following role(s): \"{1}\"", + "Fail_invalid_child": "The element with role \"{0}\" owns the child element with the role \"{1}\" that is not one of the allowed role(s): \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Verify mapping + act: ["bc4a75"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // ignore if the element contains none or presentation role + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + // For combobox, we have g1193 ... g1199 to check the values etc. + // We don't want to trigger 1152 again. So, we bypass it here. + if (roles.includes("combobox")) + return null; + var requiredChildRoles = AriaUtil_1.AriaUtil.getRequiredChildRoles(ruleContext, true); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (requiredChildRoles.includes('group')) { + var index = requiredChildRoles.indexOf('group'); + if (index > -1) + requiredChildRoles.splice(index, 1); + } + /** + * ignore if a role doesn't require a child with any specific role + * the reverse might be not true - parent will be checked in Rpt_Aria_RequiredParent_Native_Host_Sematics rule + */ + if (requiredChildRoles.length == 0) + return null; + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (!directATChildren || directATChildren.length == 0) { + // the element with at least one required role dosen't contain any accessible child + /** + * When a widget is missing required owned elements due to script execution or loading, + * authors MUST mark a containing element with 'aria-busy' equal to true. + */ + var busy = ruleContext.getAttribute("aria-busy"); + if (!busy || busy !== 'true') { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(requiredChildRoles.join(", ")); + return (0, IRule_1.RuleFail)("Fail_no_child", retToken); + } + // it's 'busy' loading, ignore it + return null; + } + var violateElemRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + // if explicit role doesn't exist, get the implicit one + if (!childRoles || childRoles.length == 0) + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + if (childRoles && childRoles.length > 0) { + /** + * when multiple roles are specified as required owned elements for a role, at least one instance of one required owned element is expected. + * the specification does not require an instance of each of the listed owned roles. + * therefore, the requirement is met if it has any one of the required roles. + */ + var found_1 = childRoles.some(function (r) { return requiredChildRoles.includes(r); }); + if (!found_1) + violateElemRoles.push(childRoles.join(", ")); + } + else { + // ignore the element since it's not semantic, shouldn't happen + } + } + if (violateElemRoles.length > 0) { + var retValues = []; + for (var i = 0; i < violateElemRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(violateElemRoles[i]); + retToken.push(requiredChildRoles.join(", ")); + retValues.push((0, IRule_1.RuleFail)("Fail_invalid_child", retToken)); + } + return retValues; + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_label_unique.ts" +/*!*********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_unique.ts ***! + \*********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_label_unique = { + id: "aria_complementary_label_unique", + context: "aria:complementary", + refactor: { + "Rpt_Aria_MultipleComplementaryLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_complementary_label_unique.html", + "fail_label_not_unique": "aria_complementary_label_unique.html", + "group": "aria_complementary_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"complementary\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"complementary\" role do not have unique labels", + "group": "Each element with \"complementary\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "complementary"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_label_visible.ts" +/*!**********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_visible.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_label_visible = { + id: "aria_complementary_label_visible", + context: "dom:*[role], dom:aside", + dependencies: ["aria_complementary_labelled"], + refactor: { + "Rpt_Aria_ComplementaryLandmarkLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_label_visible.html", + "Fail_1": "aria_complementary_label_visible.html", + "group": "aria_complementary_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a visible label", + "group": "Each element with \"complementary\" role should have a visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "complementary")) { + return null; + } + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby"); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_labelled.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_complementary_labelled.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_labelled = { + id: "aria_complementary_labelled", + context: "aria:complementary", + refactor: { + "Rpt_Aria_ComplementaryRequiredLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_labelled.html", + "Fail_1": "aria_complementary_labelled.html", + "group": "aria_complementary_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a label", + "group": "Each element with \"complementary\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_content_in_landmark.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_content_in_landmark.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_content_in_landmark = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.aria_content_in_landmark = { + id: "aria_content_in_landmark", + context: "dom:*", + refactor: { + "Rpt_Aria_OrphanedContent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_content_in_landmark.html", + "Fail_1": "aria_content_in_landmark.html", + "group": "aria_content_in_landmark.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Content is not within a landmark element", + "group": "All content must reside within an element with a landmark role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var params = CacheUtil_1.CacheUtil.getCache(context.dom.node.ownerDocument, "aria_content_in_landmark", null); + if (!params) { + params = { + landmarks: { + value: ["banner", "complementary", "contentinfo", "form", "main", "navigation", "region", "search"], + type: "array" + }, + possibleOrphanedWidgets: { + value: ["button", "combobox", "checkbox", "grid", "heading", "link", "list", + "listbox", "menu", "menubar", "progressbar", "radio", "tablist", "textbox", "toolbar", "tree", + "treegrid" + ], + type: "array" + }, + possibleOrphanedElements: { + value: ["p", "table", "input", "textarea", "select", "button", "a", "ol", "ul", "dl", "h1", "h2", "h3", "h4", "h5", + "h6", "embed", "object", "area" + ], + type: "array" + }, + noLandmarkedRoles: { + // These roles don't require landmarks + value: ["alert", "alertdialog", "dialog", "tooltip"], + type: "array" + }, + mapLandmarks: {}, + mapPossibleOrphanedWidgets: {}, + mapPossibleOrphanedElements: {}, + mapNoLandmarkedRoles: {} + }; + // Convert arrays to maps + params.mapLandmarks = {}; + for (var i = 0; i < params.landmarks.value.length; ++i) { + params.mapLandmarks[params.landmarks.value[i]] = true; + } + params.mapPossibleOrphanedWidgets = {}; + for (var i = 0; i < params.possibleOrphanedWidgets.value.length; ++i) { + params.mapPossibleOrphanedWidgets[params.possibleOrphanedWidgets.value[i]] = true; + } + params.mapPossibleOrphanedElements = {}; + for (var i = 0; i < params.possibleOrphanedElements.value.length; ++i) { + params.mapPossibleOrphanedElements[params.possibleOrphanedElements.value[i]] = true; + } + params.mapNoLandmarkedRoles = {}; + for (var i = 0; i < params.noLandmarkedRoles.value.length; ++i) { + params.mapNoLandmarkedRoles[params.noLandmarkedRoles.value[i]] = true; + } + CacheUtil_1.CacheUtil.setCache(context.dom.node.ownerDocument, "aria_content_in_landmark", params); + } + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || // avoid diagnosing g1157 for non-visible nodes + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var elemsWithoutContent = ["area", "input", "embed", "button", "textarea", "select"]; + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext) && //only trigger the rule on elements that have content + elemsWithoutContent.indexOf(nodeName) === -1) { // a few elems wihout content should not be skipped + return (0, IRule_1.RulePass)("Pass_0"); + } + // Short circuit for layout tables + if (nodeName == "table" && TableUtil_1.TableUtil.isLayoutTable(ruleContext)) { + return null; + } + // Check if it is a possible orphan + var passed = true; + var isPossibleOrphanedWidget = AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapPossibleOrphanedWidgets, true); + //exclude <link rel="stylesheet" href="xyz.css"> in the <head> and <body>(#608) + //having link in the head could cause lot of violaions + if (nodeName === 'link') { + isPossibleOrphanedWidget = false; + } + var isPossibleOrphanedElement = nodeName in params.mapPossibleOrphanedElements; + if (isPossibleOrphanedWidget || isPossibleOrphanedElement) { + // See if ancestor has landmark roles or implicit land mark roles + var parentRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + passed = parentRoles.filter(function (role) { return role in params.mapLandmarks; }).length > 0; + if (!passed) { + // Don't fail elements when a parent or sibling has failed - causes too many messages. + var walkElement = DOMWalker_1.DOMWalker.parentElement(ruleContext); + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = DOMWalker_1.DOMWalker.parentElement(walkElement); + } + walkElement = ruleContext.nextElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.nextElementSibling; + } + walkElement = ruleContext.previousElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.previousElementSibling; + } + if (!passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent", true); + // Don't trigger rule if element is a stand-alone widget + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", false) || + AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapNoLandmarkedRoles, true) || + AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, params.mapNoLandmarkedRoles, true); + if (passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", true); + return null; + } + } + else { + return null; + } + } + } + else { + return null; + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_label_unique.ts" +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_label_unique.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_label_unique = { + id: "aria_contentinfo_label_unique", + context: "aria:contentinfo", + refactor: { + "Rpt_Aria_MultipleContentinfoLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_contentinfo_label_unique.html", + "fail_label_not_unique": "aria_contentinfo_label_unique.html", + "group": "aria_contentinfo_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"contentinfo\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"contentinfo\" role do not have unique labels", + "group": "Each element with \"contentinfo\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "contentinfo", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_misuse.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_misuse.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_misuse = { + id: "aria_contentinfo_misuse", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_ContentinfoWithNoMain_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_misuse.html", + "Fail_1": "aria_contentinfo_misuse.html", + "group": "aria_contentinfo_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"contentinfo\" role is present without an element with \"main\" role", + "group": "Each element with \"contentinfo\" role is only permitted with an element with \"main\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //consider implicit role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + // Consider the Check Hidden Content setting that is set by the rules + var passed = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true).length > 0; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_single.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_single.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_single = { + id: "aria_contentinfo_single", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_single.html", + "Fail_1": "aria_contentinfo_single.html", + "group": "aria_contentinfo_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"contentinfo\" role found on the page", + "group": "A page, document, or application should only have one element with \"contentinfo\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //find out if <footer> element has siblings as <footer> has implicit contentinfo role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + var passed = !AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "contentinfo", true, true); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_descendant_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_descendant_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_descendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_descendant_valid = { + id: "aria_descendant_valid", + context: "dom:*", + dependencies: ["aria_role_valid"], + help: { + "en-US": { + "group": "aria_descendant_valid.html", + "pass": "aria_descendant_valid.html", + "potential_child_implicit_role": "aria_descendant_valid.html", + "recommendation_no_impact_role": "aria_descendant_valid.html", + "fail_child_explicit_role": "aria_descendant_valid.html" + } + }, + messages: { + "en-US": { + "group": "Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements", + "pass": "The element contains valid descendants", + "potential_child_implicit_role": "The element with role \"{0}\" contains descendants with implicit roles \"{1}\" which are ignored by browsers", + "recommendation_no_impact_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers", + "fail_child_explicit_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["pass", "potential_child_implicit_role", "fail_child_explicit_role"] + }, { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["recommendation_no_impact_role"] + }], + // TODO: ACT: Verify mapping + act: ["307n5z"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element doesn't require presentational children only + if (!AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // let tagName = ruleContext.tagName.toLowerCase(); + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (directATChildren && directATChildren.length > 0) { + // the element with at least one non-presentational children + var explicitRoles = new Array(); + var implicitRoles = new Array(); + var noImpactRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + // ignore <img> and <svg> + var tag = directATChildren[j].nodeName.toLowerCase(); + if (tag === 'img' || tag === 'svg') + continue; + // get explicit role if exists + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + if (childRoles && childRoles.length > 0) { + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + explicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + else { + // get implicit role if exists + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + if (childRoles && childRoles.length > 0) + implicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + } + if (explicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < explicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(explicitRoles[i]); + retValues.push((0, IRule_1.RuleFail)("fail_child_explicit_role", retToken)); + } + return retValues; + } + if (implicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < implicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(implicitRoles[i]); + retValues.push((0, IRule_1.RulePotential)("potential_child_implicit_role", retToken)); + } + return retValues; + } + if (noImpactRoles.length > 0) { + var retValues = []; + for (var i = 0; i < noImpactRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(noImpactRoles[i]); + retValues.push((0, IRule_1.RulePotential)("recommendation_no_impact_role", retToken)); + } + return retValues; + } + } + else + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_document_label_unique.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_document_label_unique.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_document_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_document_label_unique = { + id: "aria_document_label_unique", + context: "aria:document", + refactor: { + "Rpt_Aria_MultipleDocumentRoles": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_document_label_unique.html", + "fail_label_not_unique": "aria_document_label_unique.html", + "group": "aria_document_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"document\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"document\" roles do not have unique labels", + "group": "Each element with \"document\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "document", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_eventhandler_role_valid.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_eventhandler_role_valid.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_eventhandler_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_eventhandler_role_valid = { + id: "aria_eventhandler_role_valid", + context: "dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]", + refactor: { + "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_eventhandler_role_valid.html", + "Fail_1": "aria_eventhandler_role_valid.html", + "group": "aria_eventhandler_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with '{1}' does not have a valid ARIA role specified", + "group": "Elements with event handlers must have a valid ARIA role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + //this rule is passed if a element has attribut role + //also, passed of element has any implicit roles. + if (AriaUtil_1.AriaUtil.hasAnyRole(ruleContext, true)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //pass if this element is received focus by default + if (CommonUtil_1.CommonUtil.isfocusableByDefault(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //validate if this element has any of the given event handler's + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var eventArr = new Array(); + // From WCAG20_Script_UseW3CDomFunctions + //let events = ["onblur", "onfocus", "onchange", "onclick", "oncontextmenu", "ondblclick", "onkeydown", + // "onkeypress", "onkeyup", "onload", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + // "onmouseover", "onmousewheel", "onreset", "onpaste", "onresize", "onscroll", + // "onselect", "onsubmit", "onactivate", "ondeactivate", "onmouseenter", "onmouseleave"]; + var events = ["onblur", "onfocus", "onchange", "onclick", "ondblclick", "onkeydown", + "onkeypress", "onkeyup", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + "onmouseover", "onresize" + ]; + for (var i = 0; i < events.length; ++i) { + if (ruleContext.hasAttribute(events[i])) + eventArr.push(events[i]); + } + var retToken2 = new Array(); + retToken2.push(eventArr.join(", ")); + //return new ValidationResult(false, [ruleContext], '', '', [retToken1, retToken2]); + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_form_label_unique.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_form_label_unique.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_form_label_unique = { + id: "aria_form_label_unique", + context: "aria:form", + refactor: { + "Rpt_Aria_MultipleFormLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_form_label_unique.html", + "fail_label_not_unique": "aria_form_label_unique.html", + "group": "aria_form_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"form\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"form\" role do not have unique labels", + "group": "Each element with \"form\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "form", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_graphic_labelled.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_graphic_labelled.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_graphic_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_graphic_labelled = { + id: "aria_graphic_labelled", + context: "aria:graphics-document,aria:graphics-symbol", + refactor: { + "HAAC_Aria_SvgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_graphic_labelled.html", + "Pass_0": "aria_graphic_labelled.html", + "Fail_1": "aria_graphic_labelled.html", + "Fail_2": "aria_graphic_labelled.html", + "Fail_3": "aria_graphic_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with a graphics role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" graphics role has no label", + "Fail_2": "Element with \"{0}\" graphics role has no label or an empty label", + "Fail_3": "Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: [{ + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role") || !ruleContext.getAttribute("role").includes("graphics-")) + return null; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.getAttribute("role")]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_hidden_nontabbable.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_hidden_nontabbable.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_hidden_nontabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_hidden_nontabbable = { + id: "aria_hidden_nontabbable", + context: "dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*", + refactor: { + "aria_hidden_focus_misuse": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_hidden_nontabbable.html", + "Pass_0": "aria_hidden_nontabbable.html", + "Fail_1": "aria_hidden_nontabbable.html" + } + }, + messages: { + "en-US": { + "group": "A hidden element should not contain any tabbable elements", + "Pass_0": "Rule Passed", + "Fail_1": "Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.3.1", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Handle testcase with focus jumping away + act: "6cfa84", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_id_unique.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/aria_id_unique.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_id_unique = { + id: "aria_id_unique", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidIdRef": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_id_unique.html", + "Fail_1": "aria_id_unique.html", + "group": "aria_id_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid", + "group": "The ARIA property must reference a non-empty unique id of an existing element that is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: 6a7281 - Need a separate reason code when the property is not required. ACT says it's okay to be + // invalid when not required. I think we should still fail, but flag it as a different reason so that we can have a subset + // aligns with ACT. + act: ["59796f", "6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pass = true; + var attrNameArr = new Array(); + var nonExistantIDs = new Array(); + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var contextAttributes = ruleContext.attributes; + var idTokens = new Array(); + var testedReferences = 0; + if (contextAttributes) { + for (var i = 0, attrLength = contextAttributes.length; i < attrLength; i++) { + pass = true; + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes[attrName]; + if (dataTypes && dataTypes.type) { + var supportsOneIDRef = (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idref") ? true : false; + //If the data type supports one or more id refs do error checking + if (supportsOneIDRef || (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idrefs")) { + testedReferences++; + var nodeValueLength = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue).length; + var idArray = contextAttributes[i].nodeValue.split(" "); + // Check for an empty ID Ref + if (nodeValueLength < 1) { + pass = false; + idTokens.push("\"" + contextAttributes[i].nodeValue + "\""); + } + // check to see if too many IDRefs + else if (supportsOneIDRef) { + //If has too many IDRefs it is an error + if (nodeValueLength >= 1) { + if (idArray.length > 1) { + pass = false; + // Need to capture all the IDRefs for idTokens + for (var z = 0, length_1 = idArray.length; z < length_1; ++z) { + if (idArray[z] != "") { + idTokens.push(idArray[z]); + } + } + } + } + } + // check to see if id refs are invalid + if (pass && nodeValueLength >= 1) { + for (var j = 0, length_2 = idArray.length; j < length_2; ++j) { + if (idArray[j].length > 0) { // it is an empty string if spaces are one after the other + // Get the element by Id + var elementById = ownerDocument.getElementById(idArray[j]); + // Pass if the element exists + pass = elementById != null; + // If the element exists and this is an aria attribute that doesn't support hidden ID reference + // then perform a isNodeVisible check, in the case the node is not visible then we return + // false and true otherwise. + if (pass && !dataTypes.hiddenIDRefSupported) { + pass = VisUtil_1.VisUtil.isNodeVisible(elementById); + } + if (!pass) { + if (idArray[j] != "") { + idTokens.push(idArray[j]); + } + } + // Only one of the id references need to be valid to mark the rule as passed. + // Therefore if we find a single visible element then stop checking and mark as + // passed. + else { + break; + } + } + } + } + } + } + if (!pass) + attrNameArr.push(attrName); + } + } + } + var passed = attrNameArr.length == 0; + var retToken1 = new Array(); + var retToken2 = new Array(); + var retToken3 = new Array(); + if (!passed) { + retToken2.push(attrNameArr.join(", ")); + retToken3.push(ruleContext.nodeName.toLowerCase()); + if (idTokens.length > 0) { + retToken1.push(idTokens.join(", ")); + } + } + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : [retToken1, retToken2, retToken3]); + if (testedReferences == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString(), retToken3.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_img_labelled.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_img_labelled.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_img_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_img_labelled = { + id: "aria_img_labelled", + context: "aria:img, aria:image", + refactor: { + "HAAC_Aria_ImgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_img_labelled.html", + "Pass_0": "aria_img_labelled.html", + "Fail_1": "aria_img_labelled.html", + "Fail_2": "aria_img_labelled.html", + "Fail_3": "aria_img_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with \"img\" role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"img\" role has no label", + "Fail_2": "Element with \"img\" role has no label or an empty label", + "Fail_3": "Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: ["23a2a8", { + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role")) { + // If no role, this is implicit, and covered by WCAG20_Img_HasAlt + return null; + } + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg and img elements are handled in svg_graphics_labbelled and img_alt_valid rules + if (nodeName === 'svg' || nodeName === 'img') + return; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + /* JCH - Points of failure + * 0. Missing alt attr with value + * 1. Missing aria-label or aria-labelledby + * 2. Missing title attr with value + */ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_keyboard_handler_exists.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_keyboard_handler_exists.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_keyboard_handler_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_keyboard_handler_exists = { + id: "aria_keyboard_handler_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingKeyboardHandler": { + "pass": "pass", + "potential_no_keyboard_access": "potential_no_keyboard_access" + } + }, + help: { + "en-US": { + "pass": "aria_keyboard_handler_exists.html", + "potential_no_keyboard_access": "aria_keyboard_handler_exists.html", + "group": "aria_keyboard_handler_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_no_keyboard_access": "Verify the <{0}> element with \"{1}\" role has keyboard access", + "group": "Interactive WAI_ARIA UI components must provide keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var passed = true; + var savedPassed = passed; + var doc = ruleContext.ownerDocument; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/); + //only consider user specified role(s), rather than native containers + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + var nodeName = ruleContext.nodeName.toLowerCase(); + //if an explicit role is specified, the 'aria_role_redundant' rule should be triggered and addressed first, + // and the current rule should be ignored + if (nodeName === 'datalist' && roles && roles.includes("listbox")) + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + for (var j = 0; j < roles.length; ++j) { + var pattern = designPatterns[roles[j]]; + if (roleContainers.indexOf(roles[j]) >= 0) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (!disabled) { + // See if there is a keyboard event handler on the parent element. + passed = (ruleContext.hasAttribute("onkeydown") || ruleContext.hasAttribute("onkeypress") || ruleContext.hasAttribute("onkeyup")); + // No keyboard event handler found on parent. See if keyboard event handlers are on required child elements. + if (!passed) { + if (!hasAttribute(ruleContext, 'aria-activedescendant')) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren; + if (reqChildren) { /* SMF TODO menubar does not have any reqChildren */ + for (var i = 0, requiredChildrenLength = reqChildren.length; i < requiredChildrenLength; i++) { + var xp = "*[contains(@role,'" + reqChildren[i] + "')]"; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r) { + passed = (r.hasAttribute("onkeydown") || r.hasAttribute("onkeypress")); + if (!passed) { + // Child did not have a key handler. See if any of the grandchildren do. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + // All the required children (or any descendants of the required children) must have keypress/keydown + // If not, it is a failure, no need to keep checking any more. + break; + } + r = xpathResult.iterateNext(); + } + } + } + else { + // The current element failed the keydown/keypress, and it does not have required children, such as menubar. + // Let's check its descendants. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + } + else { + // Attribute 'aria-activedescendant' is specified. + passed = true; + } + } + } + } + if (!passed) { + roleNameArr.push(roles[j]); + } + if (!passed && savedPassed) { + savedPassed = passed; + } + } + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var retToken2 = new Array(); + retToken2.push(roleNameArr.join(", ")); + // Determine if this is referenced by a combobox. If so, leave it to the combobox rules to check + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + return savedPassed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_no_keyboard_access", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_landmark_name_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_landmark_name_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_landmark_name_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_landmark_name_unique = { + id: "aria_landmark_name_unique", + context: "aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form", + refactor: { + "landmark_name_unique": { + "Pass_0": "pass", + "Fail_0": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_landmark_name_unique.html", + "fail_label_not_unique": "aria_landmark_name_unique.html", + "group": "aria_landmark_name_unique.html" + } + }, + messages: { + "en-US": { + "pass": "Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'", + "fail_label_not_unique": "Multiple elements with \"{0}\" landmarks within the same parent region are not distinguished from one another because they have the same \"{1}\" label", + "group": "Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // TODO do I need to fiter out bad contentinfo nodes: The footer element is not a contentinfo landmark when it is a descendant of the following HTML5 sectioning elements: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Checking if this landmark is inside a dialog element. If it is we are going to skip checking it. + /**var copyOfRuleContext = ruleContext; + var parnetNodesOfRuleContext = []; + while (copyOfRuleContext) { + parnetNodesOfRuleContext.unshift(copyOfRuleContext); + copyOfRuleContext = copyOfRuleContext.parentElement; + } + parnetNodesOfRuleContext.forEach(elem => { + if (elem !== null) { + if (elem.tagName == "DIALOG" || elem.getAttribute('role') == "dialog") { + return null // Skipping checking landmarks that happen to be inside dialog elements + } + } + }) + */ + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "dialog", true) !== null) + return null; + // Begining formCache work + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_landmark_name_unique", null); + if (!formCache) { + // console.log("---------ENTERING FORM CACHE") + formCache = { + navigationNodes: [], + navigationNodesComputedLabels: [], + navigationNodesParents: [], + navigationNodesMatchFound: [] + }; + var navigationNodesTemp = ownerDocument.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'); + var navigationNodes = Array.from(navigationNodesTemp); + var navigationNodesParents = []; + var navigationNodesMatchFound = []; + // This block of code filters out any nav elements that are under a dialog. As those are not ones we want to test against as we consider dialogs are separate locations from the rest of the main page. + var navigationNodesWithoutDialogs = []; + for (var i = 0; i < navigationNodes.length; i++) { + /**let a = navigationNodes[i]; + + let dialogNodeFoundFlag = false; + while (a) { + a = a.parentElement; + if (a !== null) { + if (a.tagName == "DIALOG" || a.getAttribute('role') == "dialog") { + dialogNodeFoundFlag = true; + } + } + } + if (!dialogNodeFoundFlag) { + navigationNodesWithoutDialogs.push(navigationNodes[i]) + }*/ + // ignore node that is AT hidden or in a dialog + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(navigationNodes[i]) || CommonUtil_1.CommonUtil.getAncestor(navigationNodes[i], ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(navigationNodes[i], "dialog", true) !== null) + continue; + navigationNodesWithoutDialogs.push(navigationNodes[i]); + } + navigationNodes = navigationNodesWithoutDialogs; + for (var i = 0; i < navigationNodes.length; i++) { + // Loop over all the landmark nodes + var els = []; + var a = navigationNodes[i].parentElement; + while (a) { + els.push(a); + a = a.parentElement; + } + for (var j = 0; j < els.length; j++) { + // Loop over all the parents of the landmark nodes + // Find nearest landmark parent based on the tagName or the role attribute + var tagNameTrigger = [ + "ASIDE", + "FOOTER", + "FORM", + "HEADER", + "MAIN", + "NAV", + "SECTION", + ].includes(els[j].tagName); + var roleNameTrigger = false; + if (els[j].hasAttribute("role")) { + roleNameTrigger = [ + "complementary", + "contentinfo", + "form", + "banner", + "main", + "navigation", + "region", + "search", + ].includes(els[j].getAttribute("role")); // TODO we are not covering the case where a elemenent with multiple roles. e.g., role = "form banner". This is a improvment we might want to add in the future. + } + if (tagNameTrigger || roleNameTrigger) { + // Nearest parent-landmark found + navigationNodesParents.push(els[j]); + break; + } + if (j === els.length - 1) { + // This node is at the head of the file so it does not have a parent + navigationNodesParents.push(null); + break; + } + } + } + var navigationNodesComputedLabels = []; + for (var i = 0; i < navigationNodes.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(navigationNodes[i]); + // Loop over all the landmark nodes + navigationNodesComputedLabels.push( + /**ARIAMapper.computeName(navigationNodes[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + for (var i = 0; i < navigationNodesParents.length; i++) { + // Loop over all the parents of the landmark nodes to find duplicates + var matchFound = false; + var pass_0_flag = false; + for (var j = 0; j < navigationNodesParents.length; j++) { + if (j === i) { + // We do not want to compare against ourselfs + continue; + } + // This if statement focus on the case where the parent landmark is null + if (navigationNodesParents[i] === null && + navigationNodesParents[j] === null) { + // We are looking at two root nodes, so we should compare them. + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else if (navigationNodesParents[i] === null || + navigationNodesParents[j] === null) { + // We are looking at a single root node + continue; + } + // This if statement focus on the case where the parent landmark is NOT null + if (DOMUtil_1.DOMUtil.sameNode(navigationNodesParents[i], navigationNodesParents[j])) { + // We have the same parent-landmark AND + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else { + // Different parents // Not applicable + } + } + if (!matchFound) { + if (pass_0_flag) { + navigationNodesMatchFound.push("pass"); + } + else { + navigationNodesMatchFound.push("null"); // This is not the keyword null on purpose. It is a spaceholder in the array so indexes match up. + } + } + } + formCache.navigationNodesComputedLabels = + navigationNodesComputedLabels; + formCache.navigationNodes = navigationNodes; + formCache.navigationNodesParents = navigationNodesParents; + formCache.navigationNodesMatchFound = navigationNodesMatchFound; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_landmark_name_unique", formCache); + // TODO Add validation that all 3 arrays are the same length + // console.log("-------------End formCache") + } // End formCache + var indexToCheck = -1; + for (var i = 0; i < formCache.navigationNodes.length; i++) { + if (ruleContext.isSameNode(formCache.navigationNodes[i])) { + indexToCheck = i; + } + } + if (indexToCheck === -1) { + return null; + } + if (formCache.navigationNodesMatchFound[indexToCheck] === "pass") { + return (0, IRule_1.RulePass)("pass", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + ]); + } + else if (formCache.navigationNodesMatchFound[indexToCheck] === "fail_label_not_unique") { + return (0, IRule_1.RuleFail)("fail_label_not_unique", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + formCache.navigationNodesComputedLabels[indexToCheck], + ]); + } + else { + return null; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_main_label_unique.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_main_label_unique.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_main_label_unique = { + id: "aria_main_label_unique", + context: "aria:main", + refactor: { + "Rpt_Aria_MultipleMainsRequireLabel_Implicit_2": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_unique.html", + "Fail_1": "aria_main_label_unique.html", + "group": "aria_main_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique labels", + "group": "Each element with \"main\" role must have unique label that describes its purposes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var contextLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var parentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "document", true); + var mains = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + var result = null; + for (var i = 0; i < mains.length; ++i) { + if (mains[i] === ruleContext) + continue; + result = (0, IRule_1.RulePass)("Pass_0"); + var thisParentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(mains[i], "document", true); + if (thisParentDocRole === parentDocRole) { + if (AriaUtil_1.AriaUtil.getAriaLabel(mains[i]) === contextLabel) { + result = (0, IRule_1.RuleFail)("Fail_1"); + break; + } + } + } + return result; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_main_label_visible.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_main_label_visible.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_main_label_visible = { + id: "aria_main_label_visible", + context: "dom:body", + refactor: { + "Rpt_Aria_MultipleMainsVisibleLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_visible.html", + "Fail_1": "aria_main_label_visible.html", + "group": "aria_main_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique visible labels", + "group": "Each element with \"main\" role should have a unique visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Consider the Check Hidden Content setting that is set by the rules + //call getElementsByRoleHidden with considerImplicit flag as true + //so that the method returs <main> elements + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var passed = AriaUtil_1.AriaUtil.hasUniqueAriaLabelledby(landmarks); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_navigation_label_unique.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_navigation_label_unique.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_navigation_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_navigation_label_unique = { + id: "aria_navigation_label_unique", + context: "aria:navigation", + refactor: { + "Rpt_Aria_MultipleNavigationLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_navigation_label_unique.html", + "fail_label_not_unique": "aria_navigation_label_unique.html", + "group": "aria_navigation_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"navigation\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"navigation\" role do not have unique labels", + "group": "Each element with \"navigation\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "navigation", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_parent_required.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_parent_required.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_parent_required = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_parent_required = { + id: "aria_parent_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredParent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_parent_required.html", + "Pass_0": "aria_parent_required.html", + "Fail_1": "aria_parent_required.html" + } + }, + messages: { + "en-US": { + "group": "Each element with an implicit or explicit role must be contained within a valid element", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" role is not contained in or owned by an element with one of the following roles: \"{1}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Check Fail 3 + act: "ff89c9", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext)) + return; + var passed = true; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var roleNameArr = new Array(); + var containerRoles = new Array(); + var testedContainer = 0; + var ancestorRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + var parentRole = ancestorRoles[ancestorRoles.length - 2]; + var count = 2; + while (parentRole === 'none') { + count++; + parentRole = ancestorRoles[ancestorRoles.length - count]; + } + /**for (let j = 0, length = roles.length; j < length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[roles[j]].container; + for (let i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) break; + } + if (passed == false) { + roleNameArr.push(roles[j]); + } + } + } + */ + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (designPatterns[role] && designPatterns[role].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[role].container; + for (var i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) + break; + } + if (passed == false) { + roleNameArr.push(role); + } + } + var retToken1 = new Array(); + retToken1.push(roleNameArr.join(", ")); + var retToken2 = new Array(); + retToken2.push(containerRoles.join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (testedContainer == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_region_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_region_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_region_label_unique = { + id: "aria_region_label_unique", + context: "aria:region", + refactor: { + "Rpt_Aria_MultipleRegionsUniqueLabel_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_region_label_unique.html", + "fail_label_not_unique": "aria_region_label_unique.html", + "group": "aria_region_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"region\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"region\" role do not have unique labels", + "group": "Each element with \"region\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "region"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_region_labelled.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_region_labelled.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_region_labelled = { + id: "aria_region_labelled", + context: "aria:region", + refactor: { + "Rpt_Aria_RegionLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + // "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_region_labelled.html", + "Fail_1": "aria_region_labelled.html", + // "Fail_2": "aria_region_labelled.html", + "group": "aria_region_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"region\" role does not have a label", + // "Fail_2": "Element with \"region\" role is not labeled with 'aria-label' or 'aria-labelledby'", + "group": "Each element with \"region\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_role_allowed.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_role_allowed.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_role_allowed = { + id: "aria_role_allowed", + context: "dom:*[role]", + refactor: { + "Rpt_Aria_ValidRole": { + "Pass_0": "Pass_0", + "Fail_2": "Fail_2", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "aria_role_allowed.html", + "Pass_0": "aria_role_allowed.html", + "Fail_2": "aria_role_allowed.html", + "Potential_1": "aria_role_allowed.html" + } + }, + messages: { + "en-US": { + "group": "Elements must have a valid 'role' per ARIA specification", + "Pass_0": "Rule Passed", + "Fail_2": "The role '{0}' defined on the element is not valid per ARIA specification", + "Potential_1": "Some of the roles, '{0}', defined on the element are not valid per ARIA specification" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Recheck + act: "674b10", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var roleStr = ruleContext.getAttribute("role").trim().toLowerCase(); + if (roleStr.length === 0) { + return null; + } + if (ruleContext.hasAttribute("aria-hidden") && ruleContext.getAttribute("aria-hidden").toLowerCase() === "true") { + return null; + } + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (!invalidRoles || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + else { + var roles = roleStr.split(/\s+/); + if (invalidRoles.length === roles.length) { + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(",")]); + } + else if (invalidRoles.length > 0) { + return (0, IRule_1.RulePotential)("Potential_1", [invalidRoles.join(",")]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_role_redundant.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_role_redundant.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_role_redundant = { + id: "aria_role_redundant", + context: "dom:*[role]", + help: { + "en-US": { + "pass": "aria_role_redundant.html", + "fail_redundant": "aria_role_redundant.html", + "group": "aria_role_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "An explicitly-assigned ARIA role is not redundant with the implicit role of the element", + "fail_redundant": "The explicitly-assigned ARIA role \"{0}\" is redundant with the implicit role of the element <{1}>", + "group": "An explicitly-assigned ARIA role should not be redundant with the implicit role of the element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var elemName = ruleContext.tagName.toLowerCase(); + var ariaRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + if (!ariaRoles || ariaRoles.length === 0) + return; + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + var role_defined = AriaUtil_1.AriaUtil.areRolesDefined(ariaRoles); + if (!role_defined) + return null; + // dependency check: if it's already failed in the parent relation, then skip this check + // comment out to report the redundant role for table element: tr, td & th + /**if (["td", "th", "tr"].includes(elemName)) { + let parentRole = TableUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + }*/ + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + if (!implicitRoles || implicitRoles.length === 0) + return (0, IRule_1.RulePass)("pass"); + var ret = []; + for (var i = 0; i < ariaRoles.length; i++) { + if (!implicitRoles.includes(ariaRoles[i])) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaRoles[i], elemName])); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_search_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_search_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_search_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_search_label_unique = { + id: "aria_search_label_unique", + context: "aria:search", + refactor: { + "Rpt_Aria_MultipleSearchLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_search_label_unique.html", + "fail_label_not_unique": "aria_search_label_unique.html", + "group": "aria_search_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"search\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"search\" role do not have unique labels", + "group": "Each element with \"search\" role must have a unique label that describes its purpose" + } + }, + /** + * deprecated the rule on 01/27/2025 + * rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + rulesets: [{ + "id": [], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "search", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_semantics.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/aria_semantics.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_valid = exports.aria_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_role_valid = { + id: "aria_role_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "aria_semantics_role": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_role_valid.html", + "Fail_1": "aria_role_valid.html", + "Fail_2": "aria_role_valid.html", + "group": "aria_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The ARIA role '{0}' is not valid for the element <{1}>", + "Fail_2": "The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable", + "group": "ARIA roles must be valid for the element to which they are assigned" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var tagName = ruleContext.tagName.toLowerCase(); + // only chek element (1) and fragment nodes (11) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + //skip the rule + // the invalid role case: handled by aria_role_allowed. Ignore to avoid duplicated report + var undefinedRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (undefinedRoles && undefinedRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + // dependency check: if it's already failed, then skip + if (["td", "th", "tr"].includes(tagName)) { + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + } + var domRoles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles.includes('generic')) + return (0, IRule_1.RuleFail)("Fail_1", ["generic", tagName]); + var invalidRoles = AriaUtil_1.AriaUtil.getInvalidRoles(ruleContext); + if (invalidRoles === null || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + if (invalidRoles.includes("presentation") || invalidRoles.includes("none") && CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(", "), tagName]); + if (invalidRoles.length > 0) + return (0, IRule_1.RuleFail)("Fail_1", [invalidRoles.join(", "), tagName]); + if (domRoles.length > 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + return null; + } +}; +// This rule is in the same file because there is a dependency that aria_role_valid runs first, +// and the info is passed by cache, but there isn't a dependency in the Fail_2 scenario, so regular +// dependency cannot be used +exports.aria_attribute_valid = { + id: "aria_attribute_valid", + context: "dom:*", + // The the ARIA role is completely invalid, skip this check + dependencies: ["aria_attribute_deprecated", "aria_role_valid"], + refactor: { + "aria_attribute_allowed": { + "Pass": "Pass", + "Fail_invalid_role_attr": "Fail_invalid_role_attr", + "Fail_invalid_implicit_role_attr": "Fail_invalid_implicit_role_attr" + } + }, + help: { + "en-US": { + "group": "aria_attribute_valid.html", + "Pass": "aria_attribute_valid.html", + "Fail_invalid_role_attr": "aria_attribute_valid.html", + "Fail_invalid_implicit_role_attr": "aria_attribute_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes should be valid for the element and ARIA role to which they are assigned", + "Pass": "ARIA attributes are valid for the element and ARIA role", + "Fail_invalid_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with ARIA role \"{2}\"", + "Fail_invalid_implicit_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with implicit ARIA role \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["5c01ea", { "46ca7f": { "Pass": "pass", "Fail_invalid_role_attr": "fail", "Fail_invalid_implicit_role_attr": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // only chek element (1) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + // ignore if no aria attribute + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (ariaAttributes === null || ariaAttributes.length === 0) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + var explicit = true; + if (roles && roles.length > 0) { + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + if (!AriaUtil_1.AriaUtil.areRolesDefined(roles)) + return null; + } + else { + //no explicit role defined + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + explicit = false; + } + var tagName = ruleContext.tagName.toLowerCase(); + var failedAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (!failedAttributes || failedAttributes.length === 0) + return (0, IRule_1.RulePass)("Pass", [ariaAttributes.join(", "), tagName, roles.join(", ")]); + if (roles.length > 0) { + if (explicit) + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + else + return (0, IRule_1.RuleFail)("Fail_invalid_implicit_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + } + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, "none"]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_toolbar_label_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_toolbar_label_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_toolbar_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_toolbar_label_unique = { + id: "aria_toolbar_label_unique", + context: "aria:toolbar", + refactor: { + "Rpt_Aria_MultipleToolbarUniqueLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_toolbar_label_unique.html", + "Fail_1": "aria_toolbar_label_unique.html", + "group": "aria_toolbar_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"toolbar\" roles do not have unique labels", + "group": "Each element with \"toolbar\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "toolbar", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_widget_labelled.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_widget_labelled.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_widget_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_widget_labelled = { + id: "aria_widget_labelled", + context: "dom:*", + refactor: { + "Rpt_Aria_WidgetLabels_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_widget_labelled.html", + "Pass_0": "aria_widget_labelled.html", + "Fail_1": "aria_widget_labelled.html" + } + }, + messages: { + "en-US": { + "group": "Interactive component must have a programmatically associated name", + "Pass_0": "Rule Passed", + "Fail_1": "Interactive component with ARIA role '{0}' does not have a programmatically associated name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "m6b1q3", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + /* removed the role check role= presentation and role=none since these 2 roles are not in the list of widget type roles */ + if ((ruleContext.hasAttribute("type") && + ruleContext.getAttribute("type") === "hidden") || + (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || + AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox")))) { + // we need to diagnose that a combobox input textbox has a label(github issue #1104) + return null; + } + var elemRole = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var tagName = ruleContext.nodeName.toLowerCase(); + // Handled by input_label_exists + var skipRoles = [ + "button", + "checkbox", + "combobox", + "listbox", + "menuitemcheckbox", + "menuitemradio", + "radio", + "searchbox", + "slider", + "spinbutton", + "switch", + "textbox", + "progressbar", + "link", + ]; + if (skipRoles.includes(elemRole)) + return null; + if (tagName === "output" || + (tagName === "input" && + ruleContext.getAttribute("type") === "file")) { + } + if (!ruleContext.hasAttribute("role")) { + // Form/input elements are checked by G41, we skip them from this rule. Github issue 449 + var skipElements = [ + "input", + "textarea", + "select", + "button", + "datalist", + "optgroup", + "option", + "keygen", + "output", + "progress", + "meter", + ]; + if (skipElements.indexOf(ruleContext.nodeName.toLowerCase()) != + -1) { + return null; + } + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var passed = true; + var prohibited = false; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //get attribute roles as well as implicit roles. + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + var numWidgetsTested = 0; + var interactiveRoleTypes = ["widget", "liveRegion", "window"]; + for (var i = 0, length_1 = roles.length; passed && i < length_1; ++i) { + var pattern = designPatterns[roles[i]]; + if (pattern && + pattern.nameRequired && + pattern.roleType && + interactiveRoleTypes.includes(pattern.roleType)) { + ++numWidgetsTested; + // All widgets may have an author supplied accessible name. + // Title is legal, but don't advertise its use in documentation. + // Encourage use of aria-label, aria-labelledby or html label element. + passed = + AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title") || + CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!passed && + pattern.nameFrom && + pattern.nameFrom.indexOf("contents") >= 0) { + // See if widget's accessible name is supplied by element's inner text + // nameFrom: ["author", "contents"] + passed = CommonUtil_1.CommonUtil.hasInnerContentOrAlt(ruleContext); + } + if (!passed) { + // check if it has implicit label, like <label><input ....>abc </label> + passed = CommonUtil_1.CommonUtil.hasImplicitLabel(ruleContext); + } + if (!passed && + ruleContext.tagName.toLowerCase() === "img" && + !ruleContext.hasAttribute("role") && + ruleContext.hasAttribute("alt")) { + passed = + DOMUtil_1.DOMUtil.cleanWhitespace(ruleContext.getAttribute("alt")).trim().length > 0; + } + if (pattern.nameFrom.indexOf("prohibited") >= 0) { + prohibited = true; + } + } + } + if (numWidgetsTested === 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [elemRole]); + } + else { + //TODO + // if (prohibited) { + // return RuleFail("Fail_2"); + // } else { + return (0, IRule_1.RulePass)("Pass_0"); + // } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/asciiart_alt_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/asciiart_alt_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.asciiart_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.asciiart_alt_exists = { + id: "asciiart_alt_exists", + context: "dom:pre, dom:listing, dom:xmp, dom:plaintext", + refactor: { + "RPT_Pre_ASCIIArt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "asciiart_alt_exists.html", + "Potential_1": "asciiart_alt_exists.html", + "group": "asciiart_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that ASCII art has a text alternative", + "group": "ASCII art must have a text alternative" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Fix for IDWB writers. Don't trigger if content is in a code element. The code element is searched for + // in various places because of the weird way various browsers render <code><pre></pre></code. Firefox, + // HtmlUnit and Chrome all render differently. Firefox: <code></code><pre></pre> HtmlUnit: </code><pre><code></code></pre> + // See unit test CodeElementAbovePreElement.html. Don't know how RPT renders, so cover all the bases. + if (ruleContext.nodeName.toLowerCase() == "pre") { + if ((ruleContext.previousSibling && ruleContext.previousSibling.nodeName.toLowerCase() == "code") || + ruleContext.getElementsByTagName("code").length > 0 || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, "code")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + var passed = true; + var txtValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + var nonAlphaNumericNorSpaceCount = 0; + var alphNumSameCharacterCount = 0; + var lastCharacter = ""; + // Iterate through the text content + for (var idx = 0; passed && (idx < txtValue.length); ++idx) { + var chStr = txtValue.substr(idx, 1); + // Check if it is alphanumeric or punctuation + if (/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(chStr)) { + // Detect same character sequence + if (lastCharacter == chStr) { + alphNumSameCharacterCount = alphNumSameCharacterCount + 1; + ; + } + else { + alphNumSameCharacterCount = 0; + } + } + else if (/\s/.test(chStr)) { + alphNumSameCharacterCount = 0; + } + else { + nonAlphaNumericNorSpaceCount = nonAlphaNumericNorSpaceCount + 1; + alphNumSameCharacterCount = 0; + } + lastCharacter = chStr; + // Make the decision + if (nonAlphaNumericNorSpaceCount >= 5 || alphNumSameCharacterCount >= 4) { + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blink_css_review.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/blink_css_review.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_css_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blink_css_review = { + id: "blink_css_review", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Blink_CSSTrigger1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "blink_css_review.html", + "Pass_0": "blink_css_review.html", + "Potential_1": "blink_css_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds", + "Pass_0": "Rule Passed", + "Potential_1": "Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var textValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute('style')) { + textValue = ruleContext.getAttribute('style'); + } + var passed = textValue.toLowerCase().indexOf("text-decoration:blink") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blink_elem_deprecated.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/blink_elem_deprecated.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_elem_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.blink_elem_deprecated = { + id: "blink_elem_deprecated", + context: "dom:blink", + refactor: { + "WCAG20_Blink_AlwaysTrigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "blink_elem_deprecated.html", + "Fail_1": "blink_elem_deprecated.html" + } + }, + messages: { + "en-US": { + "group": "Content that blinks persistently must not be used", + "Fail_1": "Content found that blinks persistently" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + // const ruleContext = context["dom"].node as Element; + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blockquote_cite_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/blockquote_cite_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blockquote_cite_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blockquote_cite_exists = { + id: "blockquote_cite_exists", + context: "dom:blockquote", + refactor: { + "RPT_Blockquote_HasCite": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "blockquote_cite_exists.html", + "Potential_1": "blockquote_cite_exists.html", + "group": "blockquote_cite_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only", + "group": "Use <blockquote> only for quotations, not indentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "cite"); + if (!passed) { + var citeElems = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "cite"); + passed = citeElems != null && citeElems.length > 0; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/canvas_content_described.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/canvas_content_described.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.canvas_content_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.canvas_content_described = { + id: "canvas_content_described", + context: "dom:canvas", + refactor: { + "HAAC_Canvas": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "canvas_content_described.html", + "Manual_1": "canvas_content_described.html", + "group": "canvas_content_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify accessibility of the <canvas> element", + "group": "The <canvas> element may not be accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.1.1", "4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = ruleContext.innerHTML.trim().length > 0; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/caption_track_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/caption_track_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.caption_track_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.caption_track_exists = { + id: "caption_track_exists", + context: "dom:video", + refactor: { + "HAAC_Video_HasNoTrack": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "caption_track_exists.html", + "Potential_1": "caption_track_exists.html", + "group": "caption_track_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that captions are available for any meaningful audio or provide a caption track for the <video> element", + "group": "A <video> element must have a text alternative for any meaningful audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + // ignore decorative video if user uses aria-hidden + if (ruleContext.getAttribute("aria-hidden") === "true") { + return null; + } + var tracks = ruleContext.getElementsByTagName("track"); + for (var i = 0; i < tracks.length; ++i) { + passed = passed || tracks[i].getAttribute("kind") === 'captions'; + } + // checks for addition of dynamic tracks + if (ruleContext.textTracks && ruleContext.textTracks.length > 0) { + for (var i = 0; i < ruleContext.textTracks.length; i++) { + passed = passed || ruleContext.textTracks[i].kind === 'captions'; + } + } + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_active_descendant.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/combobox_active_descendant.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_active_descendant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_active_descendant = { + id: "combobox_active_descendant", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_active_descendant.html", + "Fail_missing": "combobox_active_descendant.html", + "Fail_not_in_popup": "combobox_active_descendant.html", + "Fail_active_role_invalid": "combobox_active_descendant.html", + "Fail_active_not_selected": "combobox_active_descendant.html", + "group": "combobox_active_descendant.html" + } + }, + messages: { + "en-US": { + "Pass": "'aria-activedescendant' is used appropriately for this combobox", + "Fail_missing": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist", + "Fail_not_in_popup": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"", + "Fail_active_role_invalid": "The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'", + "Fail_active_not_selected": "The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true", + "group": "'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // This rule only applies if the activedescendant is specified + var activeId = ruleContext.getAttribute("aria-activedescendant"); + if (!activeId || activeId.trim().length === 0) { + return null; + } + var activeElem = fragment_1.FragmentUtil.getById(ruleContext, activeId); + if (!activeElem) { + return (0, IRule_1.RuleFail)("Fail_missing", [activeId]); + } + var found = false; + // examine the children + if (popupElement) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (!found && nw.nextNode() && nw.node != popupElement && nw.node != popupElement.nextSibling) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + found = nw.elem().getAttribute("id") === activeId; + } + } + } + var retVal = []; + if (!found) { + retVal.push((0, IRule_1.RulePass)("Fail_not_in_popup", [activeId, popupId])); + } + var activeRoles = AriaUtil_1.AriaUtil.getRoles(activeElem, true); + var validRoles = ["option", "gridcell", "row", "treeitem"].filter(function (validRole) { return activeRoles.includes(validRole); }); + if (validRoles.length === 0) { + retVal.push((0, IRule_1.RuleFail)("Fail_active_role_invalid", [activeId, activeRoles.join(",")])); + } + if (activeElem.getAttribute("aria-selected") !== "true") { + retVal.push((0, IRule_1.RuleFail)("Fail_active_not_selected", [activeId])); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_autocomplete_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_autocomplete_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_autocomplete_valid = { + id: "combobox_autocomplete_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_autocomplete": { + "Pass": "Pass", + "Fail_1": "Fail_1", + "Fail_inline": "Fail_inline" + } + }, + help: { + "en-US": { + "Pass": "combobox_autocomplete_valid.html", + "Fail_1": "combobox_autocomplete_valid.html", + "Fail_inline": "combobox_autocomplete_valid.html", + "group": "combobox_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup", + "Fail_1": "The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"", + "Fail_inline": "The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ", + "group": "A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupId = cachedElem.popupId, popupElement = cachedElem.popupElement; + var retVal = []; + if (ruleContext.getAttribute("aria-autocomplete") === "inline") { + retVal.push((0, IRule_1.RuleFail)("Fail_inline")); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-autocomplete" + passed = !popupElement.hasAttribute("aria-autocomplete"); + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !nw.elem().hasAttribute("aria-autocomplete"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_1", [popupId])); + } + if (retVal.length > 0) { + return retVal; + } + else { + return (0, IRule_1.RulePass)("Pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_design_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/combobox_design_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_design_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +function patternDetect(elem) { + // check 'explicit' role combobox and that it is not <select>. + if (elem.tagName.toLowerCase() === "select" && elem.getAttribute("role") !== "combobox") { + return "implicit"; + } + else if (elem.nodeName.toLowerCase() === "input" + && (!elem.hasAttribute("type") || elem.getAttribute("type") === "text") + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.0 pattern, which the ARIA 1.2 spec says to continue to allow + return "1.0"; + } + else if (elem.nodeName.toLowerCase() !== "input" + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.1 pattern, which the ARIA 1.2 spec says is now invalid + return "1.1"; + } + // Assume they're trying to do the latest, 1.2 pattern + return "1.2"; +} +exports.combobox_design_valid = { + id: "combobox_design_valid", + context: "aria:combobox", + refactor: { + "combobox_version": { + "Pass_1.0": "Pass_1.0", + "Fail_1.1": "Fail_1.1", + "Pass_1.2": "Pass_1.2" + } + }, + help: { + "en-US": { + "Pass_1.0": "combobox_design_valid.html", + "Fail_1.1": "combobox_design_valid.html", + "Pass_1.2": "combobox_design_valid.html", + "group": "combobox_design_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1.0": "The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2", + "Fail_1.1": "The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2", + "Pass_1.2": "The combobox design pattern is detected as ARIA 1.2", + "group": "The combobox design pattern must be valid for ARIA 1.2" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var pattern = patternDetect(ruleContext); + // We don't assess native select elements here + if (pattern === "implicit") { + return null; + } + var tagName = ruleContext.tagName.toLowerCase(); + var expanded = (AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-expanded") || "").trim().toLowerCase() === "true"; + var editable = tagName === "input" && (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() === "text"); + var key = context["dom"].rolePath; + if (key) { + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + cache[key] = { + "inputElement": editable ? ruleContext : null, + "pattern": pattern, + "expanded": expanded + }; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "combobox", cache); + } + else { + // No xpath? + return null; + } + if (pattern === "1.0") { + return (0, IRule_1.RulePass)("Pass_1.0"); + } + else if (pattern === "1.1") { + return (0, IRule_1.RuleFail)("Fail_1.1"); + } + else if (pattern === "1.2") { + return (0, IRule_1.RulePass)("Pass_1.2"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_focusable_elements.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_focusable_elements.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_focusable_elements = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_focusable_elements = { + id: "combobox_focusable_elements", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_focusable_elements.html", + "Fail_not_tabbable": "combobox_focusable_elements.html", + "Fail_tabbable_child": "combobox_focusable_elements.html", + "group": "combobox_focusable_elements.html" + } + }, + messages: { + "en-US": { + "Pass": "DOM focus is allowed only on the combobox element as required", + "Fail_not_tabbable": "The combobox element does not allow DOM focus as required", + "Fail_tabbable_child": "The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed", + "group": "Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, expanded = cachedElem.expanded; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + var popupRole = AriaUtil_1.AriaUtil.getRoles(popupElement, true)[0]; + var retVal = []; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + retVal.push((0, IRule_1.RuleFail)("Fail_not_tabbable")); + } + // Only makes sense to check the popup when expanded + // this does not apply to dialogs, return pass since the main element was focusable above + if (expanded === false || popupRole === "dialog") { + return (0, IRule_1.RulePass)("Pass"); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-activedescendant" + passed = !CommonUtil_1.CommonUtil.isTabbable(popupElement) && !AriaUtil_1.AriaUtil.getAriaAttribute(popupElement, "aria-activedescendant"); + ; + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !CommonUtil_1.CommonUtil.isTabbable(nw.node) && + !AriaUtil_1.AriaUtil.getAriaAttribute(nw.node, "aria-activedescendant"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_tabbable_child")); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_haspopup_valid.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/combobox_haspopup_valid.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_haspopup_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.combobox_haspopup_valid = { + id: "combobox_haspopup_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_haspopup": { + "Pass": "Pass", + "Fail_popup_role_invalid": "Fail_popup_role_invalid", + "Fail_combobox_popup_role_mismatch": "Fail_combobox_popup_role_mismatch" + } + }, + help: { + "en-US": { + "Pass": "combobox_haspopup_valid.html", + "Fail_popup_role_invalid": "combobox_haspopup_valid.html", + "Fail_combobox_popup_role_mismatch": "combobox_haspopup_valid.html", + "group": "combobox_haspopup_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value", + "Fail_popup_role_invalid": "The 'role' value \"{0}\" of the popup element \"{1}\" should be one of \"listbox\", \"grid\", \"tree\" or \"dialog\"", + "Fail_combobox_popup_role_mismatch": "The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"", + "group": "The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // Check that popup role is listbox, grid, tree, or dialog and that it matches the combobox + var popupRoles = AriaUtil_1.AriaUtil.getRoles(popupElement, true); + var validRoles = ["listbox", "grid", "tree", "dialog"].filter(function (validRole) { return popupRoles.includes(validRole); }); + if (validRoles.length === 0) { + return (0, IRule_1.RuleFail)("Fail_popup_role_invalid", [popupRoles.join(","), popupId]); + } + else { + var popupRole = validRoles[0]; + var haspopupVal = ruleContext.getAttribute("aria-haspopup") || "listbox"; + // Popup role must match aria-haspopup unless popupRole is listbox, then aria-haspopup should not be defined + if (haspopupVal !== popupRole) { + if (popupRole !== "listbox" || ruleContext.hasAttribute("aria-haspopup")) { + return (0, IRule_1.RuleFail)("Fail_combobox_popup_role_mismatch", [haspopupVal, popupRole]); + } + } + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_popup_reference.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/combobox_popup_reference.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_popup_reference = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_popup_reference = { + id: "combobox_popup_reference", + context: "aria:combobox", + dependencies: ["combobox_design_valid"], + help: { + "en-US": { + "group": "combobox_popup_reference.html", + "Pass_1.0_expanded": "combobox_popup_reference.html", + "Pass_1.0_collapsed": "combobox_popup_reference.html", + "Pass_1.2_expanded": "combobox_popup_reference.html", + "Pass_1.2_collapsed": "combobox_popup_reference.html", + "Fail_1.0_missing_owns": "combobox_popup_reference.html", + "Fail_1.2_missing_controls": "combobox_popup_reference.html", + "Fail_1.0_popup_reference_missing": "combobox_popup_reference.html", + "Fail_1.2_popup_reference_missing": "combobox_popup_reference.html", + "Fail_combobox_expanded_hidden": "combobox_popup_reference.html", + "Fail_combobox_collapsed_visible": "combobox_popup_reference.html" + } + }, + messages: { + "en-US": { + "group": "The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value", + "Pass_1.0_expanded": "The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible", + "Pass_1.0_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Pass_1.2_expanded": "The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible", + "Pass_1.2_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Fail_1.0_missing_owns": "The 'aria-owns' attribute of the expanded combobox is missing", + "Fail_1.2_missing_controls": "The 'aria-controls' attribute of the expanded combobox is missing", + "Fail_1.0_popup_reference_missing": "The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_1.2_popup_reference_missing": "The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_combobox_expanded_hidden": "The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible", + "Fail_combobox_collapsed_visible": "The combobox 'aria-expanded' attribute is false, but the combobox popup is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "4e8ab6": { + "Pass_1.0_expanded": "fail", + "Pass_1.0_collapsed": "fail", + "Pass_1.2_expanded": "pass", + "Pass_1.2_collapsed": "pass", + "Fail_1.0_missing_owns": "inapplicable", + "Fail_1.2_missing_controls": "fail", + "Fail_1.0_popup_reference_missing": "inapplicable", + "Fail_1.2_popup_reference_missing": "fail", + "Fail_combobox_expanded_hidden": "inapplicable", + "Fail_combobox_collapsed_visible": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var pattern = cachedElem.pattern, expanded = cachedElem.expanded; + var popupId; + var popupElement; + if (pattern === "1.0") { + if (!ruleContext.hasAttribute("aria-owns")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_missing_owns"); + } + popupId = ruleContext.getAttribute("aria-owns"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_popup_reference_missing", [popupId]); + } + } + else if (pattern === "1.2") { + if (!ruleContext.hasAttribute("aria-controls")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_missing_controls"); + } + popupId = ruleContext.getAttribute("aria-controls"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_popup_reference_missing", [popupId]); + } + } + else { + return null; + } + // We have an element, stick it in the cache and then check its role + cachedElem.popupId = popupId; + cachedElem.popupElement = popupElement; + if (expanded && !VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_expanded_hidden"); + } + else if (!expanded && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_collapsed_visible"); + } + if (pattern === "1.0") { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.0_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.0_collapsed"); + } + } + else { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.2_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.2_collapsed"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/debug_paths.ts" +/*!*************************************!*\ + !*** ./src/v4/rules/debug_paths.ts ***! + \*************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.debug_paths = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.debug_paths = { + id: "debug_paths", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["DEBUG"], + num: "1", + level: IRule_1.eRulePolicy.INFORMATION, + toolkitLevel: IRule_1.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + ruleContext.setAttribute("domPath", context["dom"].rolePath); + ruleContext.setAttribute("ariaPath", context["aria"].rolePath); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/detector_tabbable.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/detector_tabbable.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.detector_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.detector_tabbable = { + id: "detector_tabbable", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["EXTENSIONS"], + num: "1", + level: IRule_2.eRulePolicy.INFORMATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return null; + } + var hierContext = contextHierarchies.aria[contextHierarchies.aria.length - 1]; + return (0, IRule_1.RulePass)("Pass_0", [], [{ + name: hierContext.attributes.name, + role: hierContext.role, + tabindex: parseInt(ruleContext.getAttribute("tabindex") || "0") + }]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/dir_attribute_valid.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/dir_attribute_valid.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.dir_attribute_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.dir_attribute_valid = { + id: "dir_attribute_valid", + context: "dom:*[dir]", + refactor: { + "Valerie_Elem_DirValid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "dir_attribute_valid.html", + "Fail_1": "dir_attribute_valid.html", + "group": "dir_attribute_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Invalid value used for the 'dir' attribute", + "group": "'dir' attribute value must be \"ltr\", \"rtl\", or \"auto\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var dirStr = ruleContext.getAttribute("dir").toLowerCase(); + var passed = dirStr == "ltr" || dirStr == "rtl" || dirStr == "auto"; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/download_keyboard_controllable.ts" +/*!********************************************************!*\ + !*** ./src/v4/rules/download_keyboard_controllable.ts ***! + \********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.download_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.download_keyboard_controllable = { + id: "download_keyboard_controllable", + context: "dom:a[href],dom:area[href]", + refactor: { + "HAAC_Media_DocumentTrigger2": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "download_keyboard_controllable.html", + "group": "download_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify that the file download mechanism does not cause a keyboard trap", + "group": "File download mechanisms should be keyboard-operable and preserve page focus location" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var href = ruleContext.getAttribute("href"); + var ext = CommonUtil_1.CommonUtil.getFileExt(href); + var passed = ![".docx", ".doc", ".pdf", ".odt"].includes(ext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/draggable_alternative_exists.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/draggable_alternative_exists.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.draggable_alternative_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.draggable_alternative_exists = { + id: "draggable_alternative_exists", + context: "dom:*[draggable]", + dependencies: [], + help: { + "en-US": { + "group": "draggable_alternative_exists.html", + // "pass_alternative": "draggable_alternative_exists.html", + "pass_undraggable": "draggable_alternative_exists.html", + "potential_alternative": "draggable_alternative_exists.html" + } + }, + messages: { + "en-US": { + "group": "A draggable element must have a \"single pointer\" alternative", + // "pass_alternative": "The draggable element \"{0}\" has a \"single pointer\" alternative", + "pass_undraggable": "The element \"{0}\" is not draggable", + "potential_alternative": "Ensure the draggable element \"{0}\" has a \"single pointer\" alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + //ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + if (ruleContext.getAttribute("draggable") === 'true') + return (0, IRule_1.RulePotential)("potential_alternative", [nodeName]); + else if (ruleContext.getAttribute("draggable") === 'false') + return (0, IRule_1.RulePass)("pass_undraggable", [nodeName]); + else + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_accesskey_labelled.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/element_accesskey_labelled.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.element_accesskey_labelled = { + id: "element_accesskey_labelled", + context: "dom:*[accesskey]", + refactor: { + "HAAC_Accesskey_NeedLabel": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_labelled.html", + "Potential_1": "element_accesskey_labelled.html", + "group": "element_accesskey_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "The element with an assigned 'accesskey' attribute does not have an associated label", + "group": "An element with an assigned 'accesskey' attribute must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip if the element is tabbable, it's covered by other rules + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + //skip the native element, mostly text elements + if (!roles || roles.length === 0) + return; + var patterns = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]]; + if (!patterns || !patterns.nameFrom) + return; + // ignore if accessble name is required (checked in other rules) or prohibited (text element) + if (patterns.nameRequired || !patterns.nameFrom || patterns.nameFrom.includes("prohibited")) + return; + //special case: legend, as a child of a fieldset, delegate the accesskey command to the field of the fieldset which is covered by other rules + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'fieldset') + return; + // check if accessible name exists + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair && pair.name && pair.name.trim().length > 0) + //if (ARIAMapper.computeName(ruleContext).trim().length > 0) + return (0, IRule_1.RulePass)("Pass_0"); + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_accesskey_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/element_accesskey_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.element_accesskey_unique = { + id: "element_accesskey_unique", + context: "dom:*[accesskey]", + refactor: { + "WCAG20_Elem_UniqueAccessKey": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_unique.html", + "Fail_1": "element_accesskey_unique.html", + "group": "element_accesskey_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "'accesskey' attribute value on the element is not unique", + "group": "'accesskey' attribute values on each element must be unique for the page" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var map = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "element_accesskey_unique", {}); + var key = ruleContext.getAttribute("accesskey"); + var passed = !(key in map); + map[key] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_attribute_deprecated.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/element_attribute_deprecated.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DEPRECATED_ELEMENTS = [ + /** original */ + "applet", "basefont", "center", "dir", "font", "isindex", "listing", + "plaintext", "spacer", "s", "strike", "u", "xmp", + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "acronym", "frame", "frameset", "noframes", "noembed", "big", "blink", "marquee", "tt", +]; +var DEPRECATED_HTML_GLOBAL_ATTRIBUTES = [ + /** original */ + "align", "link", "archive", "background", "bgcolor", "clear", "code", "color", + "compact", "face", "hspace", "language", "link", "noshade", "nowrap", "object", + "prompt", "start", "text", "version", "vlink", "vspace" +]; +var DEPRECATED_ELEMENT_ATTRIBUTES = { + /** original */ + "td": ["height", "width", "abbr", "axis", "char", "charoff", "height", "nowrap", "valign", "width", "align", "bgcolor"], + "th": ["height", "width", "abbr", "axis", "charoff", "height", "bgcolor", "align", "nowrap", "char", "valign", "width"], + "li": ["type", "value", "type"], + "ul": ["type", "compact"], + "pre": ["width"], + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "meta": ["http-equiv"], + "a": ["charset", "coords", "shape", "rev", "scheme"], + "link": ["rev", "charset", "target"], + "img": ["name", "longdesc", "align", "hspace", "vspace", "border"], + "area": ["nohref"], + "head": ["profile"], + "html": ["version"], + "iframe": ["longdesc", "align", "frameborder", "marginheight", "marginwidth", "scrolling"], + "object": ["archive", "code", "codebase", "codetype", "declare", "standby", "align", "hspace", "vspace", "border"], + "param": ["type", "valuetype"], + "script": ["language"], + "body": ["alink", "background", "bgcolor", "link", "text", "vlink"], + "br": ["clear"], + "caption": ["align"], + "col": ["align", "char", "charoff", "valign", "width"], + "div": ["align"], + "dl": ["compact"], + "hr": ["align", "noshade", "size", "width", "align"], + "h2": ["align"], + "h3": ["align"], + "h4": ["align"], + "h5": ["align"], + "h6": ["align"], + "input": ["align", "usemap"], + "legend": ["align"], + "menu": ["compact"], + "ol": ["compact", "type", "type"], + "p": ["align"], + "table": ["bgcolor", "cellpadding", "cellspacing", "frame", "rules", "width", "align"], + "tbody": ["align", "char", "valign", "charoff"], + "tfoot": ["align", "charoff", "char", "valign"], + "thead": ["char", "charoff", "valign", "align"], + "tr": ["align", "bgcolor", "char", "charoff", "valign"] +}; +function arrayToContextStr(obj, type) { + var str = ""; + for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) { + var prop = obj_1[_i]; + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENTS') + str += 'dom:' + prop; + else if (type === 'HTML_ATTRIBUTES') + str += 'dom:*[' + prop + "]"; + } + return str; +} +function objToContextStr(obj, type) { + var str = ""; + for (var prop in obj) { + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENT_ATTRIBUTES') { + for (var _i = 0, _a = obj[prop]; _i < _a.length; _i++) { + var item = _a[_i]; + if (str !== '' && !str.endsWith(", ")) + str += ", "; + str += 'dom:' + prop + '[' + item + ']'; + } + } + } + return str; +} +exports.element_attribute_deprecated = { + id: "element_attribute_deprecated", + context: "dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]", + help: { + "en-US": { + "pass": "element_attribute_deprecated.html", + "fail_elem": "element_attribute_deprecated.html", + "fail_attr": "element_attribute_deprecated.html", + "fail_elem_attr": "element_attribute_deprecated.html", + "group": "element_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_elem": "The <{0}> element is deprecated in HTML 5", + "fail_attr": "The HTML attribute(s) \"{0}\" is deprecated in HTML 5", + "fail_elem_attr": "The HTML attribute(s) \"{0}\" is deprecated for the <{1}> element in HTML 5", + "group": "Avoid use of obsolete features if possible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // HTMLUnit auto adds a tbody[align=left] to tables if tbody is missing! + if (ruleContext.nodeName.toLowerCase() === "tbody" && ruleContext.hasAttribute("align")) { + return (0, IRule_1.RulePass)("pass"); + } + if (ruleContext.nodeName.includes("-")) { + // This is a webcomponent element, HTML doesn't define what's deprecated + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + var ret = []; + // check if it's a deprecated element + if (DEPRECATED_ELEMENTS.includes(nodeName)) { + return (0, IRule_1.RuleFail)("fail_elem", [nodeName]); + } + // check if it's a deprecated HTML global attribute + var attrs = ruleContext.getAttributeNames(); + var violations = ''; + for (var _i = 0, attrs_1 = attrs; _i < attrs_1.length; _i++) { + var attr = attrs_1[_i]; + if (DEPRECATED_HTML_GLOBAL_ATTRIBUTES.includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_attr", [violations]); + } + // check if it's a deprecated HTML element & attribute + violations = ''; + if (nodeName in DEPRECATED_ELEMENT_ATTRIBUTES) { + for (var _a = 0, attrs_2 = attrs; _a < attrs_2.length; _a++) { + var attr = attrs_2[_a]; + if (DEPRECATED_ELEMENT_ATTRIBUTES[nodeName] && DEPRECATED_ELEMENT_ATTRIBUTES[nodeName].includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_elem_attr", [violations, nodeName]); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_id_unique.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/element_id_unique.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.element_id_unique = { + id: "element_id_unique", + context: "dom:*[id]", + refactor: { + "RPT_Elem_UniqueId": { + "Pass_0": "pass", + "Fail_1": "potential_empty", + "Fail_2": "potential_in_use" + } + }, + help: { + "en-US": { + "group": "element_id_unique.html", + "pass": "element_id_unique.html", + "potential_empty": "element_id_unique.html", + "potential_in_use": "element_id_unique.html" + } + }, + messages: { + "en-US": { + "group": "Element 'id' attribute values must be unique within a document", + "pass": "Rule Passed", + "potential_empty": "The <{0}> element has the id \"{1}\" that is empty", + "potential_in_use": "The <{0}> element has the id \"{1}\" that is already in use" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "3ea0c8": { + "pass": "pass", + "potential_empty": "pass", + "potential_in_use": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("id"); + // In the case that id is empty we should trigger a violation right away with out checking + // for uniqueness. + if (id === "") { + //return new ValidationResult(false, [ruleContext], '', '', [ruleContext.nodeName.toLowerCase(), id]); + return (0, IRule_1.RulePotential)("potential_empty", [ruleContext.nodeName.toLowerCase(), id]); + } + var element = fragment_1.FragmentUtil.getById(ruleContext, id); + var passed = element === ruleContext; + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [ruleContext.nodeName.toLowerCase(), id]); + if (!passed) { + return (0, IRule_1.RulePotential)("potential_in_use", [ruleContext.nodeName.toLowerCase(), id]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_lang_valid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/element_lang_valid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_lang_valid = exports.html_lang_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var validateLang = function (context) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (ruleContext.hasAttribute("lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 1; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 2; + } + } + } + if (ruleContext.hasAttribute("xml:lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("xml:lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("xml:lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 3; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 4; + } + } + } + return 0; +}; +exports.html_lang_valid = { + id: "html_lang_valid", + context: "dom:html[lang], dom:html[xml:lang]", + help: { + "en-US": { + "Pass_0": "html_lang_valid.html", + "Fail_1": "html_lang_valid.html", + "Fail_2": "html_lang_valid.html", + "Fail_3": "html_lang_valid.html", + "Fail_4": "html_lang_valid.html", + "group": "html_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The default human language of the page must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + }, + "bf051a": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "fail", + "Fail_4": "inapplicable" + }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + // "de46e4": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // } + }], + run: function (context, options, contextHierarchies) { + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + return retArr[reasonCode]; + } +}; +exports.element_lang_valid = { + id: "element_lang_valid", + context: "dom:*[lang], dom:*[xml:lang]", + help: { + "en-US": { + "Pass_0": "element_lang_valid.html", + "Fail_1": "element_lang_valid.html", + "Fail_2": "element_lang_valid.html", + "Fail_3": "element_lang_valid.html", + "Fail_4": "element_lang_valid.html", + "group": "element_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The change in language of specific content must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + // "b5c3f8": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "inapplicable", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // }, + // "bf051a": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "fail", + // "Fail_4": "inapplicable" + // }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + "de46e4": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // If it's the HTML node, that's handled by html_lang_valid + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "html") + return null; + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + var retVal = retArr[reasonCode]; + if (retVal.value[1] !== IRule_1.eRuleConfidence.PASS) { + // Ensure that there's actually content of this element - skip subtrees that have other lang attributes + var hasContent = false; + if (ruleContext.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(ruleContext, false, ruleContext, true); + while (!hasContent && nw.nextNode()) { + // Skip hidden + if (nw.node.nodeType === 1) { + var element = nw.node; + if (!VisUtil_1.VisUtil.isNodeVisible(element) || element.hasAttribute("lang")) { + nw.bEndTag = true; + } + else { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(element); + hasContent = hasContent + || element.nodeName.toLowerCase() === "img" && (pair && pair.name && pair.name.trim().length > 0) /**ARIAMapper.computeName(element).trim().length > 0*/; + } + } + else { + hasContent = hasContent + || nw.node.nodeType === 3 && nw.node.nodeValue.trim().length > 0; + } + } + } + if (!hasContent) + return null; + } + return retVal; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_mouseevent_keyboard.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_mouseevent_keyboard.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_mouseevent_keyboard = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.element_mouseevent_keyboard = { + id: "element_mouseevent_keyboard", + context: "dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]", + refactor: { + "RPT_Elem_EventMouseAndKey": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_mouseevent_keyboard.html", + "Manual_1": "element_mouseevent_keyboard.html", + "group": "element_mouseevent_keyboard.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)", + "group": "All interactive content with mouse event handlers must have equivalent keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = ruleContext.hasAttribute("href") || + (!ruleContext.hasAttribute("ondblclick") && + !ruleContext.hasAttribute("onmousemove") && + (!ruleContext.hasAttribute("onmousedown") || ruleContext.hasAttribute("onkeydown")) && + (!ruleContext.hasAttribute("onmouseup") || ruleContext.hasAttribute("onkeyup")) && + (!ruleContext.hasAttribute("onmouseover") || ruleContext.hasAttribute("onfocus")) && + (!ruleContext.hasAttribute("onmouseout") || ruleContext.hasAttribute("onblur")) && + (!ruleContext.hasAttribute("onclick") || ruleContext.hasAttribute("onkeypress") || + nodeName == "a" || nodeName == "button")); + var failedMouseEvents = new Array(); + if (!passed) { + //store and display event name and node name in the tokens + if (ruleContext.hasAttribute("ondblclick")) { + failedMouseEvents.push("ondblclick"); + } + if (ruleContext.hasAttribute("onmousemove")) { + failedMouseEvents.push("onmousemove"); + } + if (ruleContext.hasAttribute("onmousedown") && !ruleContext.hasAttribute("onkeydown")) { + failedMouseEvents.push("onmousedown"); + } + if (ruleContext.hasAttribute("onmouseup") && !ruleContext.hasAttribute("onkeyup")) { + failedMouseEvents.push("onmouseup"); + } + if (ruleContext.hasAttribute("onmouseover") && !ruleContext.hasAttribute("onfocus")) { + failedMouseEvents.push("onmouseover"); + } + if (ruleContext.hasAttribute("onmouseout") && !ruleContext.hasAttribute("onblur")) { + failedMouseEvents.push("onmouseout"); + } + if (ruleContext.hasAttribute("onclick") && !ruleContext.hasAttribute("onkeypress")) { + if (!(nodeName == "a" || nodeName == "button")) + failedMouseEvents.push("onclick"); + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1", [nodeName, failedMouseEvents.join(", ")]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_orientation_unlocked.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/element_orientation_unlocked.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_orientation_unlocked = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.element_orientation_unlocked = { + id: "element_orientation_unlocked", + context: "dom:*", + help: { + "en-US": { + "pass": "element_orientation_unlocked.html", + "fail_locked": "element_orientation_unlocked.html", + "group": "element_orientation_unlocked.html" + } + }, + messages: { + "en-US": { + "pass": "The element is not restricted to either landscape or portrait orientation using CSS transform property", + "fail_locked": "The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property", + "group": "Elements should not be restricted to either landscape or portrait orientation using CSS transform property" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ['b33eff'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip invisible element + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "meta", "title"])) + return null; + // Skip elements that have no meaningful visible content (no text, no img with alt). + // Orientation lock on a purely decorative or empty element is not a WCAG violation + // because there is no content whose orientation matters to the user. + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // cache the orientation result for all the elements in the page + var doc = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var orientationTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", null); + if (!orientationTransforms) { + orientationTransforms = CSSUtil_1.CSSUtil.getMediaOrientationTransform(doc); + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", orientationTransforms); + } + // find if the element matches orientation selector(s) + var media_transforms = []; + Object.keys(orientationTransforms).forEach(function (key) { + Object.keys(orientationTransforms[key]).forEach(function (tag) { + if (Object.keys(orientationTransforms[key][tag]).length > 0 && CSSUtil_1.CSSUtil.selectorMatchesElem(ruleContext, tag)) { + if (orientationTransforms[key][tag].transform) + media_transforms.push(orientationTransforms[key][tag].transform); + else + media_transforms.push(orientationTransforms[key][tag]); + } + }); + }); + // no match, the element is not in media orientation transform + if (media_transforms.length === 0) + return null; + var ret = []; + var _loop_1 = function (i) { + var media_transform = media_transforms[i]; + if (typeof media_transform === 'object') + for (var key in media_transform) + media_transform = key + "(" + media_transform[key] + ")"; + var containsRotation = false; + ['rotate', 'rotate3d', 'rotateZ', 'matrix', 'matrix3d'].forEach(function (rotation) { + if (media_transform.includes(rotation)) + containsRotation = true; + }); + // no rotation transform, skip + if (!containsRotation) + return "continue"; + var degree = CSSUtil_1.CSSUtil.getRotationDegree(media_transform); + // no or 360n degree rotation + if (degree === 0) { + ret.push((0, IRule_1.RulePass)("pass")); + return "continue"; + } + /** + * calculate the original page rotation transformation, example + * html { transform: rotate(2.5deg); } + */ + var definedStyle = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["transform"]); + /** + * compensate the media orientation with the page orientation + */ + if (definedStyle['transform']) { + var page_degree = CSSUtil_1.CSSUtil.getRotationDegree(definedStyle['transform']); + // rotate is additive + degree += page_degree; + } + // 180° rotation is a vertical flip — it does not swap portrait and landscape, + // so it does not lock orientation in the WCAG 1.3.4 sense. + // 360° (full turn) is also not a lock (already normalised to 0 above). + // Allow 1° floating-point tolerance around both 0° and 180°. + var normalised = degree % 180; + if (normalised <= 1 || normalised >= 179) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_locked", [nodeName])); + }; + for (var i = 0; i < media_transforms.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_scrollable_tabbable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_scrollable_tabbable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_scrollable_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.element_scrollable_tabbable = { + id: "element_scrollable_tabbable", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_scrollable_tabbable.html", + "pass_tabbable": "element_scrollable_tabbable.html", + "pass_interactive": "element_scrollable_tabbable.html", + "fail_scrollable": "element_scrollable_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Scrollable elements should be tabbable or contain tabbable content", + "pass_tabbable": "The scrollable element is tabbable", + "pass_interactive": "The scrollable element has tabbable content", + "fail_scrollable": "The scrollable element <{0}> with non-interactive content is not tabbable" + } + }, + /** + * deprecated on 6/10/2025 due to Browser support for auto-focus of a scrollable element + * rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: eRulePolicy.VIOLATION, + toolkitLevel: eToolkitLevel.LEVEL_ONE + }],*/ + rulesets: [], + act: ["0ssw9k"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["iframe", "svg", "script", "meta", "style"])) + return null; + //skip if no visible content + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + // ignore if the element's navigation is controlled or owned by another element + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is not scrollable or content withouting needing a scroll + if (!VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // pass if element is tabbable + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RulePass)("pass_tabbable"); + // check if element content is tabbable + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RulePass)("pass_interactive"); + // ignore in Firefox if no tabindex at all (not tested in embedded or any simulator) + if (!ruleContext.hasAttribute("tabindex") && navigator.userAgent.indexOf("Firefox") > -1) + return null; + return (0, IRule_1.RuleFail)("fail_scrollable", [ruleContext.nodeName.toLowerCase()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_role_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_role_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.element_tabbable_role_valid = { + id: "element_tabbable_role_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "element_tabbable_role_valid.html", + "fail_invalid_role": "element_tabbable_role_valid.html", + "fail_no_valid_role": "element_tabbable_role_valid.html", + "group": "element_tabbable_role_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The tabbable element has a widget role", + "fail_invalid_role": "The tabbable element's role '{0}' is not a widget role", + "fail_no_valid_role": "The tabbable element does not have a valid widget role", + "group": "A tabbable element must have a valid widget role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // if the element is tabbable by default with or without tabindex, let the other rules (such as widget_tabbable_single) to handle it + if (nodeName in CommonUtil_1.CommonUtil.tabTagMap) { + var value = CommonUtil_1.CommonUtil.tabTagMap[nodeName]; + if (typeof (value) === "function") { + value = value(ruleContext); + } + if (value) + return null; + } + // handle the case: no tabindex or tabindex < 0 + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) < 0) + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is scrollable + if (VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // elements whose roles allow no descendants that are interactive or with a tabindex >= 0 + // this case should be handled in widget_tabbable_single and aria_child_tabbable + var roles_no_interactive_child = ["button", "checkbox", "img", "link", "menuitem", "menuitemcheckbox", "menuitemradio", + "option", "radio", "switch", "tab"]; + var parent = DOMWalker_1.DOMWalker.parentNode(ruleContext); + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent); + // ignore if the parent role is in roles_no_interactive_child + if (roles_no_interactive_child.includes(parent_role)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return (0, IRule_1.RuleFail)("fail_no_valid_role"); + // ignore 'application' role that contains one or more focusable elements that do not follow a standard interaction pattern supported by a widget role:https://www.w3.org/TR/2023/PR-WAI-ARIA-1.2-20230328/#application + if (role === "application") + return null; + // handle the case: tabindex >= 0 to examine whether a widget role is setup or not + // pass if one of the roles is a widget type + // Row is weird. It's structure, but can also be widget + // Focusable separators are widgets + if (role === "row" || role === "separator" || ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return (0, IRule_1.RulePass)("pass"); + } + return (0, IRule_1.RuleFail)("fail_invalid_role", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_unobscured.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_unobscured.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_unobscured = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +exports.element_tabbable_unobscured = { + id: "element_tabbable_unobscured", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_unobscured.html", + "pass": "element_tabbable_unobscured.html", + "potential_obscured": "element_tabbable_unobscured.html" + } + }, + messages: { + "en-US": { + "group": "When an element receives focus, it is not entirely covered by other content", + "pass": "The element is not entirely covered by other content", + "potential_obscured": "Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.4.11"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Early exit: check visibility and tabbability first + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // Early exit: ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return null; + var win = doc.defaultView; + if (!win) + return null; + // Reuse single DOMMapper instance + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + // Early exit: bounds not available or element has no dimensions + if (!bounds || bounds.height === 0 || bounds.width === 0) + return null; + var cStyle = win.getComputedStyle(ruleContext); + if (!cStyle) + return null; + // Parse z-index once and cache + var zindex = parseInt(cStyle.zIndex === 'auto' || !cStyle.zIndex ? '0' : cStyle.zIndex); + // More specific selector to reduce iteration + var elems = doc.querySelectorAll('body *:not(script):not(style):not(meta):not(link)'); + if (!elems || elems.length === 0) + return null; + var before = true; + var boundsRight = bounds.left + bounds.width; + var boundsBottom = bounds.top + bounds.height; + // Check for obscuring elements + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + /** + * The nodes returned from querySelectorAll are in document order. + * If two elements overlap and z-index are not defined, then the node + * rendered earlier will be overlaid by the node rendered later. + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + // The next node in elems will be after the target node (ruleContext) + before = false; + continue; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // Skip if element contains ruleContext or is not visible + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || !VisUtil_1.VisUtil.isNodeVisible(elem)) + continue; + var bnds = mapper.getUnadjustedBounds(elem); + // Skip if no bounds or zero dimensions + if (!bnds || bnds.height === 0 || bnds.width === 0) + continue; + // Quick bounds check: does elem completely cover ruleContext? + if (bnds.top > bounds.top || bnds.left > bounds.left) + continue; + var bndsRight = bnds.left + bnds.width; + var bndsBottom = bnds.top + bnds.height; + if (bndsRight < boundsRight || bndsBottom < boundsBottom) + continue; + // Check z-index to determine if elem obscures ruleContext + var zStyle = win.getComputedStyle(elem); + if (!zStyle) + continue; + var elemZindex = parseInt(zStyle.zIndex === 'auto' || !zStyle.zIndex || isNaN(Number(zStyle.zIndex)) ? '0' : zStyle.zIndex); + // If before ruleContext in DOM order, elem must have higher z-index to obscure + // If after ruleContext in DOM order, elem can obscure with equal or higher z-index + if ((before && elemZindex > zindex) || (!before && elemZindex >= zindex)) { + // Check if element has opaque background + var hasOpaqueBackground = false; + if (zStyle.background && zStyle.background !== 'none') { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.background); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + if (!hasOpaqueBackground && zStyle.backgroundColor) { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.backgroundColor); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + // If element has no content and no opaque background, skip it + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(elem) && !hasOpaqueBackground) { + continue; + } + return (0, IRule_1.RulePotential)("potential_obscured", []); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_visible.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/element_tabbable_visible.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.element_tabbable_visible = { + id: "element_tabbable_visible", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_visible.html", + "pass": "element_tabbable_visible.html", + "potential_visible": "element_tabbable_visible.html" + } + }, + messages: { + "en-US": { + "group": "A tabbable element should be visible on the screen when it has keyboard focus", + "pass": "The tabbable element is visible on the screen", + "potential_visible": "Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.4.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // Get all needed styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, ["position", "clip"], ["", ":focus"]); + var defined_styles = allStyles[""]; + var onfocus_styles = allStyles[":focus"]; + if (bounds['height'] === 0 || bounds['width'] === 0) + return (0, IRule_1.RulePotential)("potential_visible", []); + if (defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)' + && !onfocus_styles['clip']) { + /** + * note that A user can select a checkbox and radio button by selecting the button or the label text. + * When a checkbox or radio button is clipped to 0 size, it is still available to a keyboard or a screen reader. + * The rule should be passed if the label text exists and the button on-focus style is defined by the user, + * which likely incurs the changes of the label style. + */ + if (nodeName === 'input' && (ruleContext.getAttribute('type') === 'checkbox' || ruleContext.getAttribute('type') === 'radio')) { + var label = CommonUtil_1.CommonUtil.getLabelForElement(ruleContext); + if (label && !CommonUtil_1.CommonUtil.isInnerTextEmpty(label)) { + // Get additional pseudo-class styles (reuse onfocus_styles from line 60) + var pseudoStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, [":focus-visible", ":focus-within", ":checked", ":focus"]); + var focus_visible_styles = pseudoStyles[":focus-visible"]; + var focus_within_styles = pseudoStyles[":focus-within"]; + var checked_styles = pseudoStyles[":checked"]; + var onfocus_styles_1 = pseudoStyles[":focus"]; + if (onfocus_styles_1 || focus_visible_styles || focus_within_styles || checked_styles) + return (0, IRule_1.RulePass)("pass"); + } + } + return (0, IRule_1.RulePotential)("potential_visible", []); + } + if (bounds['top'] >= 0 && bounds['left'] >= 0) + return (0, IRule_1.RulePass)("pass"); + var default_styles = getComputedStyle(ruleContext); + var top = bounds['top']; + var left = bounds['left']; + if (Object.keys(onfocus_styles).length === 0) { + // no onfocus position change, but could be changed from js + return (0, IRule_1.RulePotential)("potential_visible", []); + } + else { + // with onfocus position change + var positions = ['absolute', 'fixed']; + if (typeof onfocus_styles['top'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + top = onfocus_styles['top'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + top = Number.MIN_VALUE; + } + } + if (typeof onfocus_styles['left'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + left = onfocus_styles['left'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + left = Number.MIN_VALUE; + } + } + } + if (top >= 0 && left >= 0) + return (0, IRule_1.RulePass)("pass"); + else + return (0, IRule_1.RulePotential)("potential_visible", []); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/embed_alt_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/embed_alt_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.embed_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.embed_alt_exists = { + id: "embed_alt_exists", + context: "dom:embed", + refactor: { + "RPT_Embed_HasAlt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "embed_alt_exists.html", + "Potential_1": "embed_alt_exists.html", + "group": "embed_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the <embed> element has alternative content", + "group": "Provide alternative content for <embed> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt"); + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/emoticons_alt_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/emoticons_alt_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.emoticons_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.emoticons_alt_exists = { + id: "emoticons_alt_exists", + context: "dom:*", + refactor: { + "WCAG20_Text_Emoticons": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "emoticons_alt_exists.html", + "Potential_1": "emoticons_alt_exists.html", + "group": "emoticons_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that emoticons have a text alternative", + "group": "Emoticons must have a short text alternative that describes their purpose" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_TWO + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + emoticons: { + value: [":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":D", "C:", + ":-D", ":D", "8D", "XD", "=D", "=3", "<=3", "<=8", "--!--", ":-(", ":(", ":c", ":<", ":[", + "D:", "D8", "D;", "D=", "DX", "v.v", ":-9", ";-)", ";)", "*)", ";]", ";D", ":-P", ":P", + ":-p", ":p", "=p", ":-Þ", ":Þ", ":-b", ":b", ":-O", ":O", "O_O", "o_o", "8O", "OwO", "O-O", + "0_o", "O_o", "O3O", "o0o ;o_o;", "o...o", "0w0", ":-/", ":/", ":\\", "=/", "=\\", ":S", ":|", + "d:-)", "qB-)", ":)~", ":-)>....", ":-X", ":X", ":-#", ":#", "O:-)", "0:3", "O:)", ":'(", ";*(", + "T_T", "TT_TT", "T.T", ":-*", ":*", "^o)", ">:)", ">;)", ">:-)", "B)", "B-)", "8)", "8-)", + "^>.>^", "^<.<^", "^>_>^", "^<_<^", "D:<", ">:(", "D-:<", ">:-(", ":-@[1]", ";(", "`_´", "D<", + "<3", "<333", "=^_^=", "=>.>=", "=<_<=", "=>.<=", "\\,,/", "\\m/", "\\m/\\>.</\\m/", "\\o/", "\\o o/", + "o/\\o", ":&", ":u" + ], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + var emoticons = validateParams.emoticons.value; + var passed = true; + var testText = ""; + var walkNode = ruleContext.firstChild; + while (walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + testText += " " + walkNode.nodeValue; + } + walkNode = walkNode.nextSibling; + } + if (testText.trim().length > 0) { + for (var j = 0; passed && j < emoticons.length; ++j) { + var emotIdx = testText.indexOf(emoticons[j]); + var eLngth = emoticons[j].length; + while (passed && emotIdx != -1) { + // Passes if: the emoticon is not preceded by whitespace, + // or the emoticon is not followed by whitespace unless it's punctuation, + // or it's in a pre, code, or script + passed = + (emotIdx > 0 && !/\s/.test(testText.substring(emotIdx - 1, emotIdx))) || + (emotIdx < testText.length - eLngth && !/\s/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)) && + !/[.,!'"?]/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1))); + // Allow usage of (: stuff :) since this is a comment in some languages + passed = passed || ((emoticons[j] == ":)" || emoticons[j] == "(:") && /\(\:.*\:\)/.test(testText)); + passed = passed || ((emoticons[j] == ";)" || emoticons[j] == "(;") && /\(\;.*\;\)/.test(testText)); + emotIdx = testText.indexOf(emoticons[j], emotIdx + 1); + } + } + } + if (!passed) { + // Don't trigger if we're not in the body or if we're in a script, pre, code + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "body"]); + passed = checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body"; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/error_message_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/error_message_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.error_message_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.error_message_exists = { + id: "error_message_exists", + context: "dom:*[aria-invalid=true]", + refactor: { + "HAAC_Aria_ErrorMessage": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "error_message_exists.html", + "Fail_1": "error_message_exists.html", + "Fail_2": "error_message_exists.html", + "group": "error_message_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Custom error message has invalid reference 'id' value", + "Fail_2": "Custom error message is not visible", + "group": "A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aria_errMsgId = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-errormessage"); + // If aria-errormessage is not provided, then OUT_OF_SCOPE + if (!aria_errMsgId) { + return null; + } + var msg_ele = fragment_1.FragmentUtil.getById(ruleContext, aria_errMsgId); + // POF0: Invalid id reference + if (!msg_ele) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + // POF1: Referenced element is not visible + if (!VisUtil_1.VisUtil.isNodeVisible(msg_ele)) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/fieldset_label_valid.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/fieldset_label_valid.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_label_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.fieldset_label_valid = { + id: "fieldset_label_valid", + context: "aria:group", + refactor: { + "group_withInputs_hasName": { + "Pass_1": "Pass_1", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_1": "fieldset_label_valid.html", + "Fail_1": "fieldset_label_valid.html", + "Fail_2": "fieldset_label_valid.html", + "group": "fieldset_label_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1": "Group/Fieldset \"{0}\" with an input has a unique name", + "Fail_1": "Group/Fieldset does not have an accessible name", + "Fail_2": "Group/Fieldset \"{0}\" has a duplicate name to another group", + "group": "Groups with nested inputs must have unique accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "landmark_group_input", null); + if (!formCache) { + formCache = { + groupsWithInputs: [], + groupsWithInputsComputedLabels: [], + }; + var allGroupsTemp = ownerDocument.querySelectorAll('fieldset,[role="group"]'); + var allGroups = Array.from(allGroupsTemp); + var groupsWithInputs = []; + for (var i = 0; i < allGroups.length; i++) { + // Loop over all the group nodes + if (allGroups[i].querySelector("input")) { + groupsWithInputs.push(allGroups[i]); + } + } + var groupsWithInputsComputedLabels = []; + for (var i = 0; i < groupsWithInputs.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(groupsWithInputs[i]); + // Loop over all the landmark nodes + groupsWithInputsComputedLabels.push( + /**ARIAMapper.computeName(groupsWithInputs[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + formCache.groupsWithInputs = groupsWithInputs; + formCache.groupsWithInputsComputedLabels = + groupsWithInputsComputedLabels; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "landmark_group_input", formCache); + } + // formCache.groupsWithInputs.forEach(element => { + // console.log("formCache.groupsWithInputs: " +element.id) + // }); + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels) + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels.length) + var ruleContextFoundIngroupsWithInputsFlag = false; + var computedName = ""; + if (!formCache.groupsWithInputs) { + // We do not have any groups with inputs. Therefore we should skip this rule trigger. + return null; + } + for (var i = 0; i < formCache.groupsWithInputs.length; i++) { + if (ruleContext.isSameNode(formCache.groupsWithInputs[i])) { + // We have found our ruleContext in the cache + ruleContextFoundIngroupsWithInputsFlag = true; + if (formCache.groupsWithInputsComputedLabels[i] === "" || + formCache.groupsWithInputsComputedLabels[i] === null) { + // console.log("Fail_1") + return (0, IRule_1.RuleFail)("Fail_1"); + } + var foundSameNameFlag = false; + for (var j = 0; j < formCache.groupsWithInputsComputedLabels.length; j++) { + if (i == j) { + continue; + } // We do not want to compare against ourselfs + if (formCache.groupsWithInputsComputedLabels[i] === + formCache.groupsWithInputsComputedLabels[j]) { + foundSameNameFlag = true; + } + } + if (foundSameNameFlag) { + // console.log("Fail_2") + return (0, IRule_1.RuleFail)("Fail_2", [ + formCache.groupsWithInputsComputedLabels[i], + ]); + } + computedName = formCache.groupsWithInputsComputedLabels[i]; + } + } + if (!ruleContextFoundIngroupsWithInputsFlag) { + // console.log("null return") + return null; + } + // console.log("Pass_1") + return (0, IRule_1.RulePass)("Pass_1", [computedName]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/fieldset_legend_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/fieldset_legend_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_legend_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.fieldset_legend_valid = { + id: "fieldset_legend_valid", + context: "dom:fieldset", + refactor: { + "WCAG20_Fieldset_HasLegend": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "fieldset_legend_valid.html", + "Fail_1": "fieldset_legend_valid.html", + "Fail_2": "fieldset_legend_valid.html", + "Fail_3": "fieldset_legend_valid.html", + "group": "fieldset_legend_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<fieldset> element does not have a <legend>", + "Fail_2": "<fieldset> element has more than one <legend>", + "Fail_3": "<fieldset> element <legend> is empty", + "group": " <fieldset> elements should have a single, non-empty <legend> as a label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // In the case a legend is hidden, we should still trigger a violations for this + var legends = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "legend", true, false); + if (legends.length === 0) { + // Fieldset has NO Legend + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (legends.length > 1) { + // Fieldset has more than one legend + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (CommonUtil_1.CommonUtil.getInnerText(legends[0]).trim().length === 0) { + // Fieldset has legend but legend is empty + return (0, IRule_1.RuleFail)("Fail_3"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/figure_label_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/figure_label_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.figure_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.figure_label_exists = { + id: "figure_label_exists", + context: "dom:figure", + refactor: { + "HAAC_Figure_label": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "figure_label_exists.html", + "Fail_1": "figure_label_exists.html", + "group": "figure_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <figure> element does not have an associated label", + "group": "A <figure> element must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + //let passed = AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", []); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_font_color.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/form_font_color.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_font_color = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_font_color = { + id: "form_font_color", + context: "dom:form", + refactor: { + "RPT_Font_ColorInForm": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_font_color.html", + "Potential_1": "form_font_color.html", + "group": "form_font_color.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Check color is not used as the only visual means to convey which fields are required", + "group": "Combine color and descriptive markup to indicate required form fields" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var fonts = ruleContext.getElementsByTagName("font"); + if (fonts != null) { + for (var i = 0; i < fonts.length; ++i) { + passed = !fonts[i].hasAttribute("color"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_interaction_review.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/form_interaction_review.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_interaction_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.form_interaction_review = { + id: "form_interaction_review", + context: "dom:form[target]", + refactor: { + "WCAG20_Form_TargetAndText": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_interaction_review.html", + "Potential_1": "form_interaction_review.html", + "group": "form_interaction_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that interacting with content will not open pop-up windows or change the active window without informing the user", + "group": "User should be informed in advance when interacting with content causes a change of context" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramWinText: { + value: ["new window"], + type: "array" + } + }; + var ruleContext = context["dom"].node; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr === "_parent" || tStr === "_self" || tStr === "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + for (var i = 0; !passed && i < validateParams.paramWinText.value.length; ++i) + if (textStr.indexOf(validateParams.paramWinText.value[i]) != -1) + passed = true; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_label_unique.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/form_label_unique.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.form_label_unique = { + id: "form_label_unique", + context: "dom:label[for]", + refactor: { + "RPT_Label_UniqueFor": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_label_unique.html", + "Fail_1": "form_label_unique.html", + "group": "form_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control has more than one label", + "group": "Form controls should have exactly one label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + var labelIds = CacheUtil_1.CacheUtil.getCache(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "RPT_Label_Single", {}); + var id = ruleContext.getAttribute("for"); + var passed = !(id in labelIds); + labelIds[id] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_submit_button_exists.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/form_submit_button_exists.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_button_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.form_submit_button_exists = { + id: "form_submit_button_exists", + context: "dom:form", + refactor: { + "WCAG20_Form_HasSubmit": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_button_exists.html", + "Potential_1": "form_submit_button_exists.html", + "group": "form_submit_button_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the <form> element has a submit button or an image button", + "group": "A <form> element should have a submit button or an image button" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + if (ruleContext.firstChild) { + // submit buttons are usually at the bottom - walk backwards + var nw = new DOMWalker_1.DOMWalker(ruleContext, true); + while (!passed && nw.prevNode() && nw.node != ruleContext) { + if (!nw.bEndTag) { + var nodeName = nw.node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = nw.elem().getAttribute("type"); + if (type) { + type = type.toLowerCase(); + } + passed = type === "submit" || type === "image"; + } + else if (nodeName === "button") { + passed = nw.elem().hasAttribute("type") && nw.elem().getAttribute("type").toLowerCase() === "submit"; + } + else if (nw.node.nodeType === 1) { + passed = AriaUtil_1.AriaUtil.hasRole(nw.node, "button"); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_submit_review.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/form_submit_review.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_submit_review = { + id: "form_submit_review", + context: "dom:select[onchange], dom:input[onchange]", + refactor: { + "RPT_Form_ChangeEmpty": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_review.html", + "Potential_1": "form_submit_review.html", + "group": "form_submit_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Confirm the form does not submit automatically without warning", + "group": "A form should not be submitted automatically without warning the user" + } + }, + /** + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + //deprecate the rule on Jun 10, 2024 + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onchange").trim().length === 0; + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/frame_src_valid.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/frame_src_valid.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_src_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.frame_src_valid = { + id: "frame_src_valid", + context: "dom:frame, dom:iframe", + refactor: { + "Valerie_Frame_SrcHtml": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "frame_src_valid.html", + "Potential_1": "frame_src_valid.html", + "group": "frame_src_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify <frame> content is accessible", + "group": "A <frame> containing non-HTML content must be made accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "src") && + CommonUtil_1.CommonUtil.isHtmlExt(CommonUtil_1.CommonUtil.getFileExt(ruleContext.getAttribute("src"))); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/frame_title_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/frame_title_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.frame_title_exists = { + id: "frame_title_exists", + context: "dom:frame, dom:iframe", + refactor: { + "WCAG20_Frame_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "frame_title_exists.html", + "Pass_0": "frame_title_exists.html", + "Fail_1": "frame_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "Inline frames must have a unique, non-empty 'title' attribute", + "Pass_0": "Rule Passed", + "Fail_1": "Inline frame does not have a 'title' attribute", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: "cae760", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) { + //if (CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/heading_content_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/heading_content_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_content_exists = { + id: "heading_content_exists", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + refactor: { + "RPT_Header_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_content_exists.html", + "Fail_1": "heading_content_exists.html", + "group": "heading_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Heading element has descriptive text", + "Fail_1": "Heading element has no descriptive content", + "group": "Heading elements must provide descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.6"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/heading_markup_misuse.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/heading_markup_misuse.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_markup_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_markup_misuse = { + id: "heading_markup_misuse", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + dependencies: ["heading_content_exists"], + refactor: { + "RPT_Headers_FewWords": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_markup_misuse.html", + "Potential_1": "heading_markup_misuse.html", + "group": "heading_markup_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the heading element is a genuine heading", + "group": "Heading elements must not be used for presentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + headingLengthThresh: { + value: 20, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + var headingLengthThresh = validateParams.headingLengthThresh.value; + var passed = CommonUtil_1.CommonUtil.wordCount(CommonUtil_1.CommonUtil.getInnerText(ruleContext)) <= headingLengthThresh; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/html_lang_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/html_lang_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_lang_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +exports.html_lang_exists = { + id: "html_lang_exists", + context: "dom:html", + refactor: { + "WCAG20_Html_HasLang": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3", + "Fail_4": "Fail_4", + "Fail_5": "Fail_5", + "Potential_5": "Potential_5", + "Potential_6": "Potential_6" + } + }, + help: { + "en-US": { + "group": "html_lang_exists.html", + "Pass_0": "html_lang_exists.html", + "Fail_1": "html_lang_exists.html", + "Fail_2": "html_lang_exists.html", + "Fail_3": "html_lang_exists.html", + "Fail_4": "html_lang_exists.html", + "Fail_5": "html_lang_exists.html", + "Potential_5": "html_lang_exists.html", + "Potential_6": "html_lang_exists.html" + } + }, + messages: { + "en-US": { + "group": "Page must identify the default language of the document with a 'lang' attribute", + "Pass_0": "Page language detected as \"{0}\"", + "Fail_1": "Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes", + "Fail_2": "Page detected as XHTML, but does not have an 'xml:lang' attribute", + "Fail_3": "Page detected as HTML, but does not have a 'lang' attribute", + "Fail_4": "Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"", + "Fail_5": "Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"", + "Potential_5": "Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type", + "Potential_6": "Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "fail", + "Fail_4": "inapplicable", + "Fail_5": "inapplicable", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + }, + "5b7ae0": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "fail", + "Fail_5": "pass", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + var doctypeString = ruleContext.ownerDocument.doctype ? ruleContext.ownerDocument.doctype.publicId : ""; + if (!doctypeString) + doctypeString = ""; + var lang = ruleContext.getAttribute("lang"); + var langXML = ruleContext.getAttribute("xml:lang"); + if (doctypeString.includes('XHTML') && !doctypeString.includes("1.0")) { + if (!langXML) { + // XHTML != 1.0 (must have xml:lang + return (0, IRule_1.RuleFail)("Fail_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [langXML]); + } + } + else if (doctypeString.includes('XHTML') && doctypeString.includes("1.0")) { + // Handle XHTML 1.0 + // If neither is provided, it's a failure + if (!lang && !langXML) { + // XHTML and no lang + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (lang && langXML) { + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else if (lang) { + // XHTML and only lang (okay if only delivered via text/html) + return (0, IRule_1.RulePotential)("Potential_5"); + } + else { + // XHTML and only xml:lang (okay if only delivered via xml mime type) + return (0, IRule_1.RulePotential)("Potential_6"); + } + } + else { + if (!lang) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else if (lang && langXML) { + // HTML5 polyglot documents + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else { + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/html_skipnav_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/html_skipnav_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_skipnav_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.html_skipnav_exists = { + id: "html_skipnav_exists", + context: "dom:html", + refactor: { + "RPT_Html_SkipNav": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "html_skipnav_exists.html", + "Pass_0": "html_skipnav_exists.html", + "Potential_1": "html_skipnav_exists.html" + } + }, + messages: { + "en-US": { + "group": "Provide a way to bypass blocks of content that are repeated on multiple Web pages", + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a way to bypass blocks of content that are repeated on multiple Web pages" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var frames = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "frame"); + var headers = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "h1"); + if ((frames != null && frames.length > 0) || (headers != null && headers.length > 0)) { + // If frames or headings are used, pass + passed = true; + } + else { + // Look for skip anchors + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + var targets = {}; + for (var idx = 0; !passed && idx < anchors.length; ++idx) { + if (anchors[idx].hasAttribute("href")) { + var href = anchors[idx].href; + if (typeof href !== typeof "") { + if (href.baseVal) { + href = href.baseVal; + } + else { + href = ""; + } + } + var tmpLocation = void 0; + if (typeof (ruleContext.ownerDocument.locationFromDAP) != "undefined" && ruleContext.ownerDocument.locationFromDAP != null) { // DAP sets it + tmpLocation = ruleContext.ownerDocument.locationFromDAP; + } + else { // server scan has the location object + tmpLocation = ruleContext.ownerDocument.location; + } + var docHref = ""; + if (tmpLocation) { + docHref = tmpLocation.href; + } + // Fix weird bugs with how various parsers report on file: url's: + if (href.startsWith("file:///")) + href = "file:/" + href.substring("file:///".length); + if (docHref.startsWith("file:///")) + docHref = "file:/" + docHref.substring("file:///".length); + if (href.charAt(0) == "#" || href.startsWith(docHref + "#")) { + var target = CommonUtil_1.CommonUtil.getFileAnchor(href); + if (fragment_1.FragmentUtil.getById(ruleContext, target) != null) + passed = true; + else + targets[target] = true; + } + } + else if (anchors[idx].hasAttribute("name")) { + // Assume forward jumping targets + var name_1 = anchors[idx].getAttribute("name"); + if (name_1.indexOf("#") != -1) + name_1 = CommonUtil_1.CommonUtil.getFileAnchor(name_1); + passed = name_1 in targets; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/iframe_interactive_tabbable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/iframe_interactive_tabbable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.iframe_interactive_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.iframe_interactive_tabbable = { + id: "iframe_interactive_tabbable", + context: "dom:iframe", + dependencies: [], + help: { + "en-US": { + "group": "iframe_interactive_tabbable.html", + "pass": "iframe_interactive_tabbable.html", + "fail_invalid": "iframe_interactive_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Iframe with interactive content should not be excluded from tab order using tabindex", + "pass": "The iframe with interactive content is not excluded from the tab order using tabindex", + "fail_invalid": "The <iframe> with interactive content is excluded from tab order using tabindex" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["akn7bn"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // ignore if iframe is too small to be visible on screen + if (Math.max(bounds['height'], bounds['width']) < 30 || Math.min(bounds['height'], bounds['width']) < 15) + return null; + // pass iframe element does not have a tabindex attribute value that is a negative number + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) >= 0) + return (0, IRule_1.RulePass)("pass"); + // check iframe content + var iframElem = ruleContext; + if (!iframElem || !iframElem.contentDocument || !iframElem.contentDocument.documentElement) + return null; + // If the iframe is blocked by an open modal dialog it is effectively inert — inapplicable + var doc = ruleContext.ownerDocument; + if (doc) { + var dialogs = Array.from(doc.querySelectorAll("dialog")); + var blockedByModal = dialogs.some(function (d) { return d.matches(":modal") && !d.contains(ruleContext); }); + if (blockedByModal) + return null; + } + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RuleFail)("fail_invalid"); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/imagebutton_alt_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/imagebutton_alt_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagebutton_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.imagebutton_alt_exists = { + id: "imagebutton_alt_exists", + context: "dom:input", + refactor: { + "WCAG20_Input_ExplicitLabelImage": { + "Pass_0": "Pass_0", + "Pass_1": "Pass_1", + "Pass_2": "Pass_2", + "Fail": "Fail" + } + }, + help: { + "en-US": { + "Pass_0": "imagebutton_alt_exists.html", + "Pass_1": "imagebutton_alt_exists.html", + "Pass_2": "imagebutton_alt_exists.html", + "Fail": "imagebutton_alt_exists.html", + "group": "imagebutton_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Image button provides alternative text using the 'alt' attribute", + "Pass_1": "Image button provides alternative text using an ARIA label", + "Pass_2": "Image button provides alternative text using the 'title' attribute", + "Fail": "The <input> element of type \"image\" has no text alternative", + "group": "The <input> element of type \"image\" should have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "59796f", + run: function (context, options, contextHierarchies) { + // See https://www.w3.org/WAI/WCAG22/Techniques/failures/F65 + var ruleContext = context["dom"].node; + if (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() != "image") { + return null; + } + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_1"); + } + else if (ruleContext.hasAttribute("title") && ruleContext.getAttribute("title").length > 0) { + return (0, IRule_1.RulePass)("Pass_2"); + } + return (0, IRule_1.RuleFail)("Fail"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/imagemap_alt_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/imagemap_alt_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagemap_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.imagemap_alt_exists = { + id: "imagemap_alt_exists", + context: "dom:img[usemap], dom:img[ismap]", + refactor: { + "HAAC_Img_UsemapAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "imagemap_alt_exists.html", + "Fail_1": "imagemap_alt_exists.html", + "group": "imagemap_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image map or child <area> has no text alternative", + "group": "An image map and each <area> element in an image map must have text alternative(s)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt") || + (!ruleContext.hasAttribute("ismap") && !CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "usemap")); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_background.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_background.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_background = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_background = { + id: "img_alt_background", + context: "dom:*", + refactor: { + "HAAC_BackgroundImg_HasTextOrTitle": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_background.html", + "Manual_1": "img_alt_background.html", + "group": "img_alt_background.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify important background image information has a text alternative in system high contrast mode", + "group": "Background images that convey important information must have a text alternative that describes the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var doc = ruleContext.ownerDocument; + var style = doc.defaultView.getComputedStyle(ruleContext); + if (style == null) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var backgroundImgs = style.backgroundImage; + var passed = true; + if (backgroundImgs != null && backgroundImgs != "" && backgroundImgs != 'none' && backgroundImgs != 'inherit') { + if (ruleContext.innerHTML != null && ruleContext.innerHTML.trim().length != 0) { + passed = false; + } + else { + var title = ruleContext.getAttribute('title'); + if (title != null && title.length != 0) + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_decorative.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_decorative.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_decorative = { + id: "img_alt_decorative", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_PresentationImgHasNonNullAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_decorative.html", + "Fail_1": "img_alt_decorative.html", + "group": "img_alt_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image designated as decorative has non-null 'alt' attribute", + "group": "Image designated as decorative must have 'alt=\"\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, "presentation") || AriaUtil_1.AriaUtil.hasRole(ruleContext, "none")) { + passed = ruleContext.getAttribute("alt").length == 0; + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_misuse.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/img_alt_misuse.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_misuse = { + id: "img_alt_misuse", + context: "dom:img, dom:area, dom:input", + refactor: { + "RPT_Img_AltCommonMisuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_misuse.html", + "Potential_1": "img_alt_misuse.html", + "group": "img_alt_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file name serves as a good inline replacement for the image", + "group": "'alt' attribute value must be a good inline replacement for the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + badText: { + value: ["short description"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + // Alt text check are elsewhere (See 41, 240, 455) + if (ruleContext.hasAttribute("alt")) { + var altText = ruleContext.getAttribute("alt").trim(); + if (altText.length > 0) { + var badText = validateParams.badText.value; + for (var i = 0; passed && i < badText.length; ++i) { + passed = altText.indexOf(badText[i]) == -1; + } + if (passed) { + var src = ruleContext.getAttribute((nodeName == "area") ? "href" : "src"); + // Allow it to pass if there's no src - can't determine these. + if (src != null) { + // Fail if the alt matches the src exactly + // Also fail if the alt has a . in it and either the src is in the alt or the alt is in the src + passed = src.trim() != altText && + (altText.indexOf(".") == -1 || (altText.indexOf(src) == -1 && src.indexOf(altText) == -1)); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_null.ts" +/*!**************************************!*\ + !*** ./src/v4/rules/img_alt_null.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_null = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_null = { + id: "img_alt_null", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_TitleEmptyWhenAltNull": { + "Pass_0": "pass", + "Fail_1": "fail_decorative" + } + }, + help: { + "en-US": { + "pass": "img_alt_null.html", + "fail_decorative": "img_alt_null.html", + "potential_aria_override": "img_alt_null.html", + "group": "img_alt_null.html" + } + }, + messages: { + "en-US": { + "pass": "Neither 'aria' nor 'title' attributes are used for the decorative image", + "fail_decorative": "The image 'alt' attribute is empty, but the 'title' attribute is not empty", + "potential_aria_override": "The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute", + "group": "When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_decorative"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["potential_aria_override"] + } + ], + act: [{ "46ca7f": { "potential_aria_override": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (ruleContext.getAttribute("alt").trim().length > 0) { + return null; + } + // We have a title, but alt is empty + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0) { + return (0, IRule_1.RulePotential)("potential_aria_override"); + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RuleFail)("fail_decorative"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_redundant.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/img_alt_redundant.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_redundant = { + id: "img_alt_redundant", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_LinkTextNotRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_redundant.html", + "Fail_1": "img_alt_redundant.html", + "Fail_2": "img_alt_redundant.html", + "Fail_3": "img_alt_redundant.html", + "group": "img_alt_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Link text is repeated in an image 'alt' value within the same link", + "Fail_2": "Link text of previous link is repeated in image 'alt' value of a link", + "Fail_3": "Image 'alt' value within a link is repeated in link text of the link after", + "group": "The text alternative for an image within a link should not repeat the link text or adjacent link text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.4.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aNode = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "a"); + //If not in an anchor, Out of Scope + if (aNode == null) + return null; + var altText = ruleContext.getAttribute("alt").trim().toLowerCase(); + if (altText.length == 0) { + // If alt text is empty, there's no text to be redundant - let a_text_purpose + // trigger in that case. + // So Out of Scope for this rule + return null; + } + var innerText = aNode.innerText; + var linkText = ""; + if (innerText != null) { + linkText = innerText.trim().toLowerCase(); + } + if (linkText.length > 0) { + if (altText == linkText) { + // Text in link + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + var passed = true; + //alt is non-zero, but no link text - ensure adjacent link text isn't redundant + var walk = new DOMWalker_1.DOMWalker(aNode); + while (passed && walk.prevNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName === "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + // Text before image link + passed = (node.innerText || node.textContent || "").trim().toLowerCase() != altText; + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + walk = new DOMWalker_1.DOMWalker(aNode, true); + while (passed && walk.nextNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName == "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + passed = node.innerText.trim().toLowerCase() != altText; + } + } + if (!passed) { + // Text after image link + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_valid.ts" +/*!***************************************!*\ + !*** ./src/v4/rules/img_alt_valid.ts ***! + \***************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.img_alt_valid = { + id: "img_alt_valid", + context: "dom:img", + refactor: { + "WCAG20_Img_HasAlt": { + "pass": "pass", + "fail_blank_alt": "fail_blank_alt", + "fail_no_alt": "fail_no_alt", + "fail_blank_title": "fail_blank_title" + } + }, + help: { + "en-US": { + "pass": "img_alt_valid.html", + "fail_blank_alt": "img_alt_valid.html", + "fail_no_alt": "img_alt_valid.html", + "fail_blank_title": "img_alt_valid.html", + "group": "img_alt_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The image has an accessible name or is correctly marked as decorative or redundant", + "fail_blank_alt": "Image 'alt' attribute value consists only of blank space(s)", + "fail_no_alt": "The image has neither an accessible name nor is marked as decorative or redundant", + "fail_blank_title": "The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)", + "group": "Images must have accessible names unless they are decorative or redundant" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "23a2a8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If not visible to the screen reader, or can be ignored + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).trim().length !== 0) { + // the img has non-empty aria label + return (0, IRule_1.RulePass)("pass"); + } + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + // check title attribute + if (alt === null) { + // the img has no alt or attribute, examine the title attribute + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (title === null || title.length === 0) { + // no title or title is empty, examine alt further + if (alt === null) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext, false); + if (role === 'presentation' || role === 'none') + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_no_alt"); + } + if (alt.length === 0) + return (0, IRule_1.RulePass)("pass"); + } + else { + if (title.trim().length === 0) { + // title contains blank space only (title=" ") + return (0, IRule_1.RuleFail)("fail_blank_title"); + } + // title contains some text (title="some text") + return (0, IRule_1.RulePass)("pass"); + } + } + else { + if (alt.length === 0 || alt.trim().length > 0) { + // the img has empty alt (alt="") or non-empty alt (alt="some text") + return (0, IRule_1.RulePass)("pass"); + } + else { + // alt contains blank space only (alt=" ") + return (0, IRule_1.RuleFail)("fail_blank_alt"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_ismap_misuse.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/img_ismap_misuse.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_ismap_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_ismap_misuse = { + id: "img_ismap_misuse", + context: "dom:img[ismap]", + refactor: { + "RPT_Img_UsemapValid": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_ismap_misuse.html", + "Potential_1": "img_ismap_misuse.html", + "group": "img_ismap_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Server-side image map hot-spots do not have duplicate text links", + "group": "Server-side image map hot-spots must have duplicate text links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = false; + if (ruleContext.hasAttribute("usemap")) { + var usemap = ruleContext.getAttribute("usemap"); + usemap = usemap.trim().toLowerCase(); + var idx = usemap.indexOf("#"); + if (idx != -1) + usemap = usemap.substr(idx + 1); + if (usemap.length > 0) { + var maps = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "map"); + for (var i = 0; !passed && i < maps.length; ++i) { + passed = maps[i].hasAttribute("name") && + maps[i].getAttribute("name").toLowerCase() == usemap; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_longdesc_misuse.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/img_longdesc_misuse.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_longdesc_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_longdesc_misuse = { + id: "img_longdesc_misuse", + context: "dom:img[longdesc]", + refactor: { + "RPT_Img_LongDescription2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_longdesc_misuse.html", + "Potential_1": "img_longdesc_misuse.html", + "group": "img_longdesc_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)", + "group": " The 'longdesc' attribute must reference HTML content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var longdesc = ruleContext.getAttribute("longdesc"); + // if (longdesc is bad URL) passed = false; + var ext = CommonUtil_1.CommonUtil.getFileExt(longdesc); + var passed = ext.length != 0 && CommonUtil_1.CommonUtil.isHtmlExt(ext) + || longdesc.startsWith("#") + || longdesc.startsWith("http://") + || longdesc.startsWith("https://") + || longdesc.startsWith("data:"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/index.ts" +/*!*******************************!*\ + !*** ./src/v4/rules/index.ts ***! + \*******************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +// This file is automatically generated by "npm run prebuild". Do not edit +__exportStar(__webpack_require__(/*! ./a_target_warning */ "./src/v4/rules/a_target_warning.ts"), exports); +__exportStar(__webpack_require__(/*! ./a_text_purpose */ "./src/v4/rules/a_text_purpose.ts"), exports); +__exportStar(__webpack_require__(/*! ./applet_alt_exists */ "./src/v4/rules/applet_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./application_content_accessible */ "./src/v4/rules/application_content_accessible.ts"), exports); +__exportStar(__webpack_require__(/*! ./area_alt_exists */ "./src/v4/rules/area_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_accessiblename_exists */ "./src/v4/rules/aria_accessiblename_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_tabindex_valid */ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_valid */ "./src/v4/rules/aria_activedescendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_label_unique */ "./src/v4/rules/aria_application_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_labelled */ "./src/v4/rules/aria_application_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_article_label_unique */ "./src/v4/rules/aria_article_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_allowed */ "./src/v4/rules/aria_attribute_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_conflict */ "./src/v4/rules/aria_attribute_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_deprecated */ "./src/v4/rules/aria_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_exists */ "./src/v4/rules/aria_attribute_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_redundant */ "./src/v4/rules/aria_attribute_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_required */ "./src/v4/rules/aria_attribute_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_value_valid */ "./src/v4/rules/aria_attribute_value_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_label_unique */ "./src/v4/rules/aria_banner_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_single */ "./src/v4/rules/aria_banner_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_tabbable */ "./src/v4/rules/aria_child_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_valid */ "./src/v4/rules/aria_child_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_unique */ "./src/v4/rules/aria_complementary_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_visible */ "./src/v4/rules/aria_complementary_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_labelled */ "./src/v4/rules/aria_complementary_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_content_in_landmark */ "./src/v4/rules/aria_content_in_landmark.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_label_unique */ "./src/v4/rules/aria_contentinfo_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_misuse */ "./src/v4/rules/aria_contentinfo_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_single */ "./src/v4/rules/aria_contentinfo_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_descendant_valid */ "./src/v4/rules/aria_descendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_document_label_unique */ "./src/v4/rules/aria_document_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_eventhandler_role_valid */ "./src/v4/rules/aria_eventhandler_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_form_label_unique */ "./src/v4/rules/aria_form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_graphic_labelled */ "./src/v4/rules/aria_graphic_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_hidden_nontabbable */ "./src/v4/rules/aria_hidden_nontabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_id_unique */ "./src/v4/rules/aria_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_img_labelled */ "./src/v4/rules/aria_img_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_keyboard_handler_exists */ "./src/v4/rules/aria_keyboard_handler_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_landmark_name_unique */ "./src/v4/rules/aria_landmark_name_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_unique */ "./src/v4/rules/aria_main_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_visible */ "./src/v4/rules/aria_main_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_navigation_label_unique */ "./src/v4/rules/aria_navigation_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_parent_required */ "./src/v4/rules/aria_parent_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_label_unique */ "./src/v4/rules/aria_region_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_labelled */ "./src/v4/rules/aria_region_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_allowed */ "./src/v4/rules/aria_role_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_redundant */ "./src/v4/rules/aria_role_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_search_label_unique */ "./src/v4/rules/aria_search_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_semantics */ "./src/v4/rules/aria_semantics.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_toolbar_label_unique */ "./src/v4/rules/aria_toolbar_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_widget_labelled */ "./src/v4/rules/aria_widget_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./asciiart_alt_exists */ "./src/v4/rules/asciiart_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_css_review */ "./src/v4/rules/blink_css_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_elem_deprecated */ "./src/v4/rules/blink_elem_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./blockquote_cite_exists */ "./src/v4/rules/blockquote_cite_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./canvas_content_described */ "./src/v4/rules/canvas_content_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./caption_track_exists */ "./src/v4/rules/caption_track_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_active_descendant */ "./src/v4/rules/combobox_active_descendant.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_autocomplete_valid */ "./src/v4/rules/combobox_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_design_valid */ "./src/v4/rules/combobox_design_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_focusable_elements */ "./src/v4/rules/combobox_focusable_elements.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_haspopup_valid */ "./src/v4/rules/combobox_haspopup_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_popup_reference */ "./src/v4/rules/combobox_popup_reference.ts"), exports); +__exportStar(__webpack_require__(/*! ./debug_paths */ "./src/v4/rules/debug_paths.ts"), exports); +__exportStar(__webpack_require__(/*! ./detector_tabbable */ "./src/v4/rules/detector_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./dir_attribute_valid */ "./src/v4/rules/dir_attribute_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./download_keyboard_controllable */ "./src/v4/rules/download_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./draggable_alternative_exists */ "./src/v4/rules/draggable_alternative_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_labelled */ "./src/v4/rules/element_accesskey_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_unique */ "./src/v4/rules/element_accesskey_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_attribute_deprecated */ "./src/v4/rules/element_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_id_unique */ "./src/v4/rules/element_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_lang_valid */ "./src/v4/rules/element_lang_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_mouseevent_keyboard */ "./src/v4/rules/element_mouseevent_keyboard.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_orientation_unlocked */ "./src/v4/rules/element_orientation_unlocked.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_scrollable_tabbable */ "./src/v4/rules/element_scrollable_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_role_valid */ "./src/v4/rules/element_tabbable_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_unobscured */ "./src/v4/rules/element_tabbable_unobscured.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_visible */ "./src/v4/rules/element_tabbable_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./embed_alt_exists */ "./src/v4/rules/embed_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./emoticons_alt_exists */ "./src/v4/rules/emoticons_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./error_message_exists */ "./src/v4/rules/error_message_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_label_valid */ "./src/v4/rules/fieldset_label_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_legend_valid */ "./src/v4/rules/fieldset_legend_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./figure_label_exists */ "./src/v4/rules/figure_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_font_color */ "./src/v4/rules/form_font_color.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_interaction_review */ "./src/v4/rules/form_interaction_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_label_unique */ "./src/v4/rules/form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_button_exists */ "./src/v4/rules/form_submit_button_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_review */ "./src/v4/rules/form_submit_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_src_valid */ "./src/v4/rules/frame_src_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_title_exists */ "./src/v4/rules/frame_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_content_exists */ "./src/v4/rules/heading_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_markup_misuse */ "./src/v4/rules/heading_markup_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_lang_exists */ "./src/v4/rules/html_lang_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_skipnav_exists */ "./src/v4/rules/html_skipnav_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./iframe_interactive_tabbable */ "./src/v4/rules/iframe_interactive_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagebutton_alt_exists */ "./src/v4/rules/imagebutton_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagemap_alt_exists */ "./src/v4/rules/imagemap_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_background */ "./src/v4/rules/img_alt_background.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_decorative */ "./src/v4/rules/img_alt_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_misuse */ "./src/v4/rules/img_alt_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_null */ "./src/v4/rules/img_alt_null.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_redundant */ "./src/v4/rules/img_alt_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_valid */ "./src/v4/rules/img_alt_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_ismap_misuse */ "./src/v4/rules/img_ismap_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_longdesc_misuse */ "./src/v4/rules/img_longdesc_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_autocomplete_valid */ "./src/v4/rules/input_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_checkboxes_grouped */ "./src/v4/rules/input_checkboxes_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_fields_grouped */ "./src/v4/rules/input_fields_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_haspopup_conflict */ "./src/v4/rules/input_haspopup_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_after */ "./src/v4/rules/input_label_after.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_before */ "./src/v4/rules/input_label_before.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_exists */ "./src/v4/rules/input_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_visible */ "./src/v4/rules/input_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_onchange_review */ "./src/v4/rules/input_onchange_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_placeholder_label_visible */ "./src/v4/rules/input_placeholder_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_content_exists */ "./src/v4/rules/label_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_name_visible */ "./src/v4/rules/label_name_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_ref_valid */ "./src/v4/rules/label_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_children_valid */ "./src/v4/rules/list_children_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_markup_review */ "./src/v4/rules/list_markup_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_structure_proper */ "./src/v4/rules/list_structure_proper.ts"), exports); +__exportStar(__webpack_require__(/*! ./marquee_elem_avoid */ "./src/v4/rules/marquee_elem_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_brief */ "./src/v4/rules/media_alt_brief.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_exists */ "./src/v4/rules/media_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_audio_transcribed */ "./src/v4/rules/media_audio_transcribed.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_autostart_controllable */ "./src/v4/rules/media_autostart_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_keyboard_controllable */ "./src/v4/rules/media_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_live_captioned */ "./src/v4/rules/media_live_captioned.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_track_available */ "./src/v4/rules/media_track_available.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_redirect_optional */ "./src/v4/rules/meta_redirect_optional.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_refresh_delay */ "./src/v4/rules/meta_refresh_delay.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_viewport_zoomable */ "./src/v4/rules/meta_viewport_zoomable.ts"), exports); +__exportStar(__webpack_require__(/*! ./noembed_content_exists */ "./src/v4/rules/noembed_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./object_text_exists */ "./src/v4/rules/object_text_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_exists */ "./src/v4/rules/page_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_valid */ "./src/v4/rules/page_title_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_focus_blur_review */ "./src/v4/rules/script_focus_blur_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_avoid */ "./src/v4/rules/script_onclick_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_misuse */ "./src/v4/rules/script_onclick_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_select_review */ "./src/v4/rules/script_select_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./select_options_grouped */ "./src/v4/rules/select_options_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_described */ "./src/v4/rules/skip_main_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_exists */ "./src/v4/rules/skip_main_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_background_decorative */ "./src/v4/rules/style_background_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_before_after_review */ "./src/v4/rules/style_before_after_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_color_misuse */ "./src/v4/rules/style_color_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_focus_visible */ "./src/v4/rules/style_focus_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_highcontrast_visible */ "./src/v4/rules/style_highcontrast_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_hover_persistent */ "./src/v4/rules/style_hover_persistent.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_viewport_resizable */ "./src/v4/rules/style_viewport_resizable.ts"), exports); +__exportStar(__webpack_require__(/*! ./svg_graphics_labelled */ "./src/v4/rules/svg_graphics_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_aria_descendants */ "./src/v4/rules/table_aria_descendants.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_empty */ "./src/v4/rules/table_caption_empty.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_nested */ "./src/v4/rules/table_caption_nested.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_exists */ "./src/v4/rules/table_headers_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_ref_valid */ "./src/v4/rules/table_headers_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_related */ "./src/v4/rules/table_headers_related.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_layout_linearized */ "./src/v4/rules/table_layout_linearized.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_scope_valid */ "./src/v4/rules/table_scope_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_structure_misuse */ "./src/v4/rules/table_structure_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_summary_redundant */ "./src/v4/rules/table_summary_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./target_spacing_sufficient */ "./src/v4/rules/target_spacing_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_block_heading */ "./src/v4/rules/text_block_heading.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_contrast_sufficient */ "./src/v4/rules/text_contrast_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_quoted_correctly */ "./src/v4/rules/text_quoted_correctly.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_sensory_misuse */ "./src/v4/rules/text_sensory_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_spacing_valid */ "./src/v4/rules/text_spacing_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_whitespace_valid */ "./src/v4/rules/text_whitespace_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_exists */ "./src/v4/rules/widget_tabbable_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_single */ "./src/v4/rules/widget_tabbable_single.ts"), exports); + + +/***/ }, + +/***/ "./src/v4/rules/input_autocomplete_valid.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/input_autocomplete_valid.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_autocomplete_valid = { + id: "input_autocomplete_valid", + context: "dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]", + refactor: { + "WCAG21_Input_Autocomplete": { + "Pass_0": "pass", + "Fail_1": "fail_inappropriate", + "Fail_2": "fail_invalid", + "Fail_attribute_incorrect": "fail_incorrect" + } + }, + help: { + "en-US": { + "group": "input_autocomplete_valid.html", + "pass": "input_autocomplete_valid.html", + "fail_inappropriate": "input_autocomplete_valid.html", + "fail_invalid": "input_autocomplete_valid.html", + "fail_incorrect": "input_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "group": "The 'autocomplete' attribute's token(s) must be appropriate for the input form field", + "pass": "The 'autocomplete' attribute's token(s) is appropriate for the input form field", + "fail_inappropriate": "The 'autocomplete' attribute's token(s) are not appropriate for the input form field", + "fail_invalid": "The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type", + "fail_incorrect": "The 'autocomplete' attribute has an incorrect value" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "73f2c2": { + "pass": "pass", + "fail_inappropriate": "fail", + "fail_invalid": "pass", + "fail_incorrect": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var autocompleteAttr = ruleContext.getAttribute("autocomplete").trim().toLowerCase(); + var tokens = autocompleteAttr.split(/\s+/); + if (tokens.length === 0 || autocompleteAttr.length === 0) { + return null; + } + var cache = { + "tokensOnOff": ["on", "off"], + "tokenOptionalSection": "section-", + "tokensOptionalPurpose": ["shipping", "billing"], + "tokensMandatoryGroup1_password": ["new-password", "current-password", "one-time-code"], + "tokensMandatoryGroup1_multiline": ["street-address"], + "tokensMandatoryGroup1_month": ["cc-exp"], + "tokensMandatoryGroup1_numeric": ["cc-exp-month", + "cc-exp-year", + "transaction-amount", + "bday-day", + "bday-month", + "bday-year"], + "tokensMandatoryGroup1_date": ["bday"], + "tokensMandatoryGroup1_url": ["url", "photo"], + "tokensMandatoryGroup1_text": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "organization-title", + "organization", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-csc", + "cc-type", + "transaction-currency", + "language", + "sex"], + "tokensMandatoryGroup1_all": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "new-password", + "current-password", + "organization-title", + "organization", + "street-address", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-exp", + "cc-exp-month", + "cc-exp-year", + "cc-csc", + "cc-type", + "transaction-currency", + "transaction-amount", + "language", + "bday", + "bday-day", + "bday-month", + "bday-year", + "sex", + "url", + "photo"], + "tokensOptionalGroup2": ["home", + "work", + "mobile", + "fax", + "pager"], + "tokensMandatoryGroup2_tel": ["tel"], + "tokensMandatoryGroup2_email": ["email"], + "tokensMandatoryGroup2_url": ["impp"], + "tokensMandatoryGroup2_text": ["tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension"], + "tokensMandatoryGroup2_all": ["tel", + "tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension", + "email", + "impp"], + "tokensOptionGroup1_webauthn": ["webauthn"] + }; + var valid_values = []; + for (var key in cache) + valid_values = valid_values.concat(cache[key]); + var foundMandatoryToken = false; + var foundRecognizedToken = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!tokens.every(function (r) { return valid_values.includes(r) || r.startsWith(cache['tokenOptionalSection']); })) + return (0, IRule_1.RuleFail)("fail_incorrect"); + var type = ruleContext.hasAttribute("type") ? ruleContext.getAttribute("type").trim().toLowerCase() : "text"; + var tokensMandatoryGroup1 = []; + var tokensMandatoryGroup2 = []; + var tokensOptionalGroup = []; + if (nodeName === "textarea" || nodeName === "select") { + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + if (nodeName === "textarea") + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + } + else if (nodeName === "input") { + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + // handle the various 'input' types + switch (type) { + // Disable check for input type=hidden for now based on scrum discussion + /* + case "hidden": + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + */ + case "text": + case "search": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_text.concat(cache.tokensMandatoryGroup1_password, cache.tokensMandatoryGroup1_url, cache.tokensMandatoryGroup1_numeric, cache.tokensMandatoryGroup1_month, cache.tokensMandatoryGroup1_date); + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + case "password": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_password; + break; + case "url": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_url; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_url; + break; + case "email": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_email; + break; + case "tel": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_tel; + break; + case "number": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_numeric; + break; + case "month": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_month; + break; + case "date": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_date; + break; + default: + // unsupported type for this rule. + return null; + } + } + else { + // should never get here. + return null; + } + // Disable check for input type=hidden for now based on scrum discussion + var autofillMantle = /* (nodeName==="input" && type==="hidden") ? "anchor" : */ "expectation"; + if (autofillMantle === "expectation") { + // check on|off for expectation mantle. + if (tokens.includes("on") || tokens.includes("off")) { + // on|off should be the only token + if (tokens.length === 1) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_invalid"); + } + } + } + // check detail autofill tokens + var currIndex = 0; + var currRecognizedIndex = 0; + // check optional 'section-*' tokens + if (tokens[currIndex].startsWith(cache.tokenOptionalSection) && + tokens[currIndex].length > 8) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check optional 'shipping|billing' tokens + if (tokens.length > currIndex && + cache.tokensOptionalPurpose.includes(tokens[currIndex])) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currIndex) { + // check mandatory group 1 + if (tokensMandatoryGroup1.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currIndex])) { + currIndex++; + } + // check mandatory group 2 + if (tokensMandatoryGroup2.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + } + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currRecognizedIndex) { + // check mandatory group 1 + if (cache.tokensMandatoryGroup1_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currRecognizedIndex])) { + currRecognizedIndex++; + } + // check mandatory group 2 + if (cache.tokensMandatoryGroup2_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + } + } + if (tokens.length > currIndex + currRecognizedIndex) { + // check optional tokens webauthn + if (tokensOptionalGroup.includes(tokens[currIndex + currRecognizedIndex])) { + currIndex++; + } + } + if ((tokens.length > currIndex && tokensOptionalGroup.includes(tokens[currIndex])) + || (tokens.length > currRecognizedIndex && tokensOptionalGroup.includes(tokens[currRecognizedIndex]))) { + currIndex++; + currRecognizedIndex++; + } + // Only pass if we have seen either of the mandatory groups and all tokens have been consumed + if (foundMandatoryToken && tokens.length === currIndex) { + return (0, IRule_1.RulePass)("pass"); + } + else if (foundRecognizedToken && tokens.length === currRecognizedIndex) { + return (0, IRule_1.RuleFail)("fail_incorrect"); + } + else { + return (0, IRule_1.RuleFail)("fail_inappropriate"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_checkboxes_grouped.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/input_checkboxes_grouped.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_checkboxes_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.input_checkboxes_grouped = { + id: "input_checkboxes_grouped", + context: "dom:input[type=radio], dom:input[type=checkbox]", + refactor: { + "WCAG20_Input_RadioChkInFieldSet": { + "Pass_LoneNogroup": "pass_lonenogroup", + "Pass_Grouped": "pass_grouped", + "Pass_RadioNoName": "pass_radioNoName", + "Fail_ControlNameMismatch": "fail_controlnamemismatch", + "Fail_NotGroupedOtherGrouped": "fail_notgroupedothergrouped", + "Fail_NotGroupedOtherNotGrouped": "fail_notgroupedothernotgrouped", + "Fail_NotSameGroup": "fail_notsamegroup", + "Potential_LoneCheckbox": "potential_lonecheckbox", + "Potential_UnnamedCheckbox": "potential_unnamedcheckbox" + } + }, + help: { + "en-US": { + "group": "input_checkboxes_grouped.html", + "pass_lonenogroup": "input_checkboxes_grouped.html", + "pass_grouped": "input_checkboxes_grouped.html", + "pass_radiononame": "input_checkboxes_grouped.html", + "fail_controlnamemismatch": "input_checkboxes_grouped.html", + "fail_notgroupedothergrouped": "input_checkboxes_grouped.html", + "fail_notgroupedothernotgrouped": "input_checkboxes_grouped.html", + "fail_notsamegroup": "input_checkboxes_grouped.html", + "potential_lonecheckbox": "input_checkboxes_grouped.html", + "potential_unnamedcheckbox": "input_checkboxes_grouped.html" + } + }, + messages: { + "en-US": { + "group": "Related sets of radio buttons or checkboxes should be programmatically grouped", + "pass_lonenogroup": "{0} grouping not required for a control of this type", + "pass_grouped": "{0} input is grouped with other related controls with the same name", + "pass_radiononame": "Radio input is not grouped, but passes because it has no name to group with other radio inputs", + "fail_controlnamemismatch": "{0} input found that has the same name, \"{2}\" as a {1} input", + "fail_notgroupedothergrouped": "{0} input is not in the group with another {0} with the name \"{1}\"", + "fail_notgroupedothernotgrouped": "{0} input and others with the name \"{1}\" are not grouped together", + "fail_notsamegroup": "{0} input is in a different group than another {0} with the name \"{1}\"", + "potential_lonecheckbox": "Verify that this ungrouped checkbox input is not related to other checkboxes", + "potential_unnamedcheckbox": "Verify that this un-named, ungrouped checkbox input is not related to other checkboxes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var getGroup = function (e) { + var retVal = CommonUtil_1.CommonUtil.getAncestor(e, "fieldset") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "radiogroup") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "group") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "grid") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "table"); + if (!retVal) { + retVal = CommonUtil_1.CommonUtil.getAncestor(e, "table"); + if (retVal && !TableUtil_1.TableUtil.isDataTable(retVal)) { + retVal = null; + } + } + return retVal; + }; + // Only radio buttons and checkboxes are in scope + var ctxType = ruleContext.getAttribute("type").toLowerCase(); + // Determine which form we're in (if any) to determine our scope + var ctxForm = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement; + // Get data about all of the visible checkboxes and radios in the scope of this form + // and cache it for all of the other inputs in this scope + var formCache = CacheUtil_1.CacheUtil.getCache(ctxForm, "input_checkboxes_grouped", null); + if (!formCache) { + formCache = { + checkboxByName: {}, + radiosByName: {}, + nameToGroup: {}, + numCheckboxes: 0, + numRadios: 0 + }; + // Get all of the checkboxes in the form or body (but not nested in something else and not hidden) + // And get a mapping of these checkboxes to + var cWalker = new DOMWalker_1.DOMWalker(ctxForm, false, ctxForm, true); + var checkboxQ = []; + var radiosQ = []; + while (cWalker.nextNode()) { + if (!cWalker.bEndTag + && cWalker.node.nodeType === 1 + && cWalker.node.nodeName.toLowerCase() === "input" + && VisUtil_1.VisUtil.isNodeVisible(cWalker.node)) { + var type = cWalker.node.getAttribute("type"); + if (type === "checkbox") { + checkboxQ.push(cWalker.node); + } + else if (type === "radio") { + radiosQ.push(cWalker.node); + } + } + } + // let checkboxQ = ctxForm.querySelectorAll("input[type=checkbox]"); + for (var idx = 0; idx < checkboxQ.length; ++idx) { + var cb = checkboxQ[idx]; + if ((AriaUtil_1.AriaUtil.getAncestorWithRole(cb, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement) === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(cb)) { + var name_1 = cb.getAttribute("name") || ""; + (formCache.checkboxByName[name_1] = formCache.checkboxByName[name_1] || []).push(cb); + formCache.nameToGroup[name_1] = formCache.nameToGroup[name_1] || getGroup(cb); + ++formCache.numCheckboxes; + } + } + // Get all of the radios in the form or body (but not nested in something else and not hidden) + // let radiosQ = ctxForm.querySelectorAll("input[type=radio]"); + for (var idx = 0; idx < radiosQ.length; ++idx) { + var r = radiosQ[idx]; + var radCtx = (AriaUtil_1.AriaUtil.getAncestorWithRole(r, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement); + if (radCtx === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + var name_2 = r.getAttribute("name") || ""; + (formCache.radiosByName[name_2] = formCache.radiosByName[name_2] || []).push(r); + formCache.nameToGroup[name_2] = formCache.nameToGroup[name_2] || getGroup(r); + ++formCache.numRadios; + } + } + CacheUtil_1.CacheUtil.setCache(ctxForm, "input_checkboxes_grouped", formCache); + } + ///////////// Calculated everything, now check the various cases + var ctxName = ruleContext.getAttribute("name"); + var ctxGroup = getGroup(ruleContext); + ctxType = ctxType === "radio" ? "Radio" : "Checkbox"; + if (!ctxName || ctxName === "") { + // First process cases where the control is not named + if (ctxType === "Radio") { + // Radios without names don't act like groups, so don't enforce grouping + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_radiononame", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // Must be an unnamed checkbox + if (ctxGroup === null) { + if ((formCache.checkboxByName[""] || []).length > 1) { + return (0, IRule_1.RulePotential)("potential_unnamedcheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + else { + // Considering a named checkbox + var numRadiosWithName = (formCache.radiosByName[ctxName] || []).length; + var numCheckboxesWithName = (formCache.checkboxByName[ctxName] || []).length; + // Capitalize the input type for messages + if (numRadiosWithName > 0 && numCheckboxesWithName > 0) { + // We have a naming mismatch between different controls + return (0, IRule_1.RuleFail)("fail_controlnamemismatch", [ctxType, ctxType === "checkbox" ? "radio" : "checkbox", ctxName]); + } + else if (ctxType === "Radio" && (formCache.numRadios === 1 || numRadiosWithName === 1) + || ctxType === "Checkbox" && formCache.numCheckboxes === 1) { + // This is a lone control (either only control of this type on the page, or a radio button without any others by that name) + // We pass this control in all cases + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else if (ctxType === "Checkbox" && formCache.numCheckboxes > 1 && numCheckboxesWithName === 1) { + // We have only one checkbox with this name, but there are other checkboxes in the form. + // If we're not grouped, ask them to examine it + if (ctxGroup === null) { + return (0, IRule_1.RulePotential)("potential_lonecheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // We share a name with another similar control. Are we grouped together? + if (ctxGroup === null) { + if (formCache.nameToGroup[ctxName] !== null) { + // We're not grouped, but some control with the same name is in a group + return (0, IRule_1.RuleFail)("fail_notgroupedothergrouped", [ctxType, ctxName]); + } + else { + // None of us are grouped + return (0, IRule_1.RuleFail)("fail_notgroupedothernotgrouped", [ctxType, ctxName]); + } + } + else if (formCache.nameToGroup[ctxName] !== ctxGroup) { + // We're not in the main group with the others + return (0, IRule_1.RuleFail)("fail_notsamegroup", [ctxType, ctxName]); + } + else { + // We're all grouped up! + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_fields_grouped.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/input_fields_grouped.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_fields_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_fields_grouped = { + id: "input_fields_grouped", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_InFieldSet": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "input_fields_grouped.html", + "Potential_1": "input_fields_grouped.html", + "group": "input_fields_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Use the <fieldset> element to group logically related input elements", + "group": "Groups of logically related input elements should be contained within a <fieldset> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger for other input types or if we're in a fieldset + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") + return (0, IRule_1.RulePass)("Pass_0"); + } + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "fieldset") != null) + return (0, IRule_1.RulePass)("Pass_0"); + // No fieldset - see if this input is all by itself - no need to group single inputs + var parent = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["form", "body"]); + var checkTypes = ["input", "textarea", "select"]; + var passed = true; + for (var i = 0; passed && i < checkTypes.length; ++i) { + var controls = parent.getElementsByTagName(checkTypes[i]); + for (var j = 0; passed && j < controls.length; ++j) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(controls[j])) { + continue; + } + // Note that textareas and selects will be called type='text' + var type = controls[j].hasAttribute("type") ? controls[j].getAttribute("type").toLowerCase() : "text"; + // Only fail if this is another control in the form and its type is another text-like input + passed = controls[j] == ruleContext || (type != "text" && type != "password" && type != "file"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_haspopup_conflict.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/input_haspopup_conflict.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_haspopup_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_haspopup_conflict = { + id: "input_haspopup_conflict", + context: "dom:input[list][aria-haspopup]", + refactor: { + "input_haspopup_invalid": { + // "Pass": "pass", + "Potential_1": "potential_type_misuse", + "Potential_2": "potential_misuse" + } + }, + help: { + "en-US": { + "group": "input_haspopup_conflict.html", + // "pass": "input_haspopup_conflict.html", + "potential_type_misuse": "input_haspopup_conflict.html", + "potential_misuse": "input_haspopup_conflict.html", + "potential_list_notexist": "input_haspopup_conflict.html", + "fail_invalid_list_type": "input_haspopup_conflict.html", + "fail_invalid_list_elem": "input_haspopup_conflict.html" + } + }, + messages: { + "en-US": { + "group": "<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute", + // "pass": "The <input> element with a 'list' attribute does not use an explicit 'aria-haspopup' attribute", + "potential_type_misuse": "The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_misuse": "The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_list_notexist": "The list attribute for the <input> element is invalid", + "fail_invalid_list_type": "The list attribute for the <input> element with the type \"{0}\" is invalid", + "fail_invalid_list_elem": "The list attribute for the <input> element does not reference a datalist element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + // let "aria_role_valid" to handle invalid role. Only allowed role is combobox which is implicit. + if (roles && roles.length > 0 && !roles.includes('combobox')) + return null; + //triggering input types: text, search, tel, url, email, or missing or invalid + var yesTypes = ["text", "search", "tel", "url", "email", "date", "month", "week", "time", "datetime-local", "number", "range", "color"]; + var noTypes = ["file", "password", "checkbox", "radio", "submit", "reset", "image", "hidden", "button"]; + var attrValue = ruleContext.getAttribute("type"); + //missing input type for list but with aria_has_popup + if (!attrValue || attrValue.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_misuse"); + attrValue = attrValue.trim().toLowerCase(); + //invalid input types for list but with aria_has_popup + if (!yesTypes.includes(attrValue) && !noTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_misuse"); + // the list attribute is used for wrong input type + if (attrValue && noTypes.includes(attrValue)) + return (0, IRule_1.RuleFail)("fail_invalid_list_type"); + var list = ruleContext.getAttribute("list"); + // the list attribute is blank + if (!list || list.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_list_notexist"); + var listElem = ruleContext.ownerDocument.getElementById(list); + // the list element doesn't exist + if (!listElem) + return (0, IRule_1.RuleFail)("potential_list_notexist"); + // the list element is not a datalist element + if (listElem.nodeName.toLowerCase() !== 'datalist') + return (0, IRule_1.RuleFail)("fail_invalid_list_elem"); + // valid input types for list but with aria_has_popup + if (yesTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_type_misuse", [attrValue]); + // shouldn't get here + return; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_after.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/input_label_after.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_after = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_after = { + id: "input_label_after", + context: "dom:input", + refactor: { + "WCAG20_Input_LabelAfter": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_after.html", + "Fail_1": "input_label_after.html", + "Fail_2": "input_label_after.html", + "group": "input_label_after.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Checkbox or radio button is nested in label, so label is not after the input control", + "Fail_2": "Label text is located before its associated checkbox or radio button element", + "group": "Checkboxes and radio buttons must have a label after the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var type = ""; + if (ruleContext.hasAttribute("type")) + type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "checkbox" && type != "radio") { + return null; + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem === null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + var passed; + if (value === -2) { + // input nested in label + passed = false; + var walkNode = new DOMWalker_1.DOMWalker(labelElem); + walkNode.node = ruleContext; + while (!passed && walkNode.nextNode()) { + passed = ((walkNode.node.nodeName.toLowerCase() === "#text" && walkNode.node.nodeValue.trim().length > 0) + || (walkNode.node.nodeName.toLowerCase() === "span" && walkNode.node.textContent.trim().length > 0)); + } + if (!passed) { + // Input nested in label and text before input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != 1) { + // label is before input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_before.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_before.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_before = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_before = { + id: "input_label_before", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_LabelBefore": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_before.html", + "Fail_1": "input_label_before.html", + "Fail_2": "input_label_before.html", + "group": "input_label_before.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Text input is nested in label such that input precedes the label text", + "Fail_2": "Label text is located after its associated text input or <select> element", + "group": "Text inputs and <select> elements must have a label before the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") { + return null; + } + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem == null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + if (value === -2) { + // ignore if no label or the content for the label is only from the nested input control + var text = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (text && text.trim().length > 0 && CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim() === text.trim()) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + // input nested in label + var passed = false; + var walkNode = ruleContext.previousSibling; + while (!passed && walkNode !== null) { + passed = ((walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0) + || (walkNode.nodeName.toLowerCase() == "span" && walkNode.textContent.trim().length > 0)); + walkNode = walkNode.previousSibling; + } + if (!passed) { + // Input nested in label and text after input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != -1) { + // label is after input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + // Haven't returned yet, then I pass + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_exists = { + id: "input_label_exists", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]", + //dependencies: ["aria_role_redundant", "aria_role_valid"], + refactor: { + "WCAG20_Input_ExplicitLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_exists.html", + "Fail_1": "input_label_exists.html", + "Fail_2": "input_label_exists.html", + "group": "input_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control element <{0}> has no associated label", + "Fail_2": "Form control with \"{0}\" role has no associated label", + "group": "Each form control must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: https://github.com/IBMa/equal-access/issues/756 + act: ["97a4e1", "e086e5"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) { + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Determine the input type + var passed = true; + var type = "text"; + if (nodeName == "input" && ruleContext.hasAttribute("type")) { + type = ruleContext.getAttribute("type").toLowerCase(); + } + else if (nodeName === "button" || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "button")) { + type = "buttonelem"; + } + if (nodeName == "input" && type == "") { + type = "text"; + } + if (type === "image") { + // Handled by input_label_existsImage + return null; + } + /** + let POF = -1; + let textTypes = CommonUtil.input_text_types; + let buttonTypes = CommonUtil.form_button_types; + + let buttonTypesWithDefaults = ["reset", "submit"]; // 'submit' and 'reset' have visible defaults. + if (textTypes.indexOf(type) !== -1) { // If type is in the list + // Get only the non-hidden labels for elements, in the case that a label is hidden then it is a violation + // Note: label[for] does not work for ARIA defined inputs + let labelElem = ruleContext.hasAttribute("role") ? null : CommonUtil.getLabelForElementHidden(ruleContext, true); + let hasLabelElemContent = false; + if (labelElem) { + if (CommonUtil.hasInnerContentHidden(labelElem)) { + hasLabelElemContent = true; + } else if ((labelElem.getAttribute("aria-label") || "").trim().length > 0) { + hasLabelElemContent = true; + } else if (labelElem.hasAttribute("aria-labelledby")) { + let labelledByElem = FragmentUtil.getById(labelElem, labelElem.getAttribute('aria-labelledby')); + if (labelledByElem && !DOMUtil.sameNode(labelledByElem, labelElem) && CommonUtil.hasInnerContent(labelledByElem)) { + hasLabelElemContent = true; + } + } + } + passed = (!!labelElem && hasLabelElemContent) || + (!labelElem && CommonUtil.attributeNonEmpty(ruleContext, "title") || CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) || + AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.hasImplicitLabel(ruleContext); + if (!passed) POF = 2 + textTypes.indexOf(type); + + } else if (buttonTypes.indexOf(type) !== -1) { // If type is a button + if (buttonTypesWithDefaults.indexOf(type) !== -1 && !ruleContext.hasAttribute("value")) { + // 'submit' and 'reset' have visible defaults so pass if there is no 'value' attribute + passed = true; + } else { + passed = CommonUtil.attributeNonEmpty(ruleContext, "value") || AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.indexOf(type); + } + } else if (type == "buttonelem") { + // If I am an image and I have alt text - accessibility-web-engine#269 + let bAlt = false; + if (ruleContext.nodeName.toLowerCase() === "img" && ruleContext.hasAttribute("alt")) { + let alt = ruleContext.getAttribute("alt"); + if (alt.trim().length === 0) { + bAlt = false; + } else { + bAlt = true; + } + }; + passed = CommonUtil.hasInnerContentHidden(ruleContext) || AriaUtil.hasAriaLabel(ruleContext) || bAlt || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 1; + } + + //check if a native button is labelled + if (!passed && nodeName == "button") { + if (CommonUtil.hasImplicitLabel(ruleContext)) + passed = true; + else { + let label = CommonUtil.getLabelForElement(ruleContext); + if (label && CommonUtil.hasInnerContentHidden(label)) + passed = true; + } + } + + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + if (!passed && (buttonTypes.indexOf(type) !== -1)) { + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class") == "dijitOffScreen" && DOMWalker.parentElement(ruleContext).hasAttribute("widgetid")) { + // Special handling for dijit buttons + let labelId = DOMWalker.parentElement(ruleContext).getAttribute("widgetid") + "_label"; + let label = FragmentUtil.getById(ruleContext, labelId); + if (label != null) { + passed = CommonUtil.hasInnerContentHidden(label); + // This means I failed above also + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 4 + buttonTypes.indexOf(type); + } + } + } + + if (!passed && nodeName == "optgroup") { + passed = CommonUtil.attributeNonEmpty(ruleContext, "label"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 2; + } + if (!passed && nodeName == "option") { + // Is a non-empty value attribute also enough for an option element? + passed = CommonUtil.attributeNonEmpty(ruleContext, "label") || ruleContext.innerHTML.trim().length > 0; + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 3; + } + + if (!passed) + passed = AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) { + // check aria role to figure out if the accessible name can be from content + const roles = AriaUtil.getRoles(ruleContext, true); + //when multiple roles specified, only the first valid role (guaranteed by dependencies) is applied, and the others just as fallbacks + if (ARIADefinitions.designPatterns[roles[0]] && ARIADefinitions.designPatterns[roles[0]].nameFrom && ARIADefinitions.designPatterns[roles[0]].nameFrom.includes("contents")) + passed = CommonUtil.hasInnerContentHidden(ruleContext); + } + */ + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + passed = pair && pair.name && pair.name.trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (ruleContext.hasAttribute("role") && ruleContext.getAttribute("role").trim().length > 0) { + return (0, IRule_1.RuleFail)("Fail_2", ruleContext.getAttribute("role").split(" ")); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_visible.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/input_label_visible.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_visible = { + id: "input_label_visible", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox", + dependencies: ["input_label_exists"], + refactor: { + "WCAG20_Input_VisibleLabel": { + "Pass_0": "pass", + "Potential_1": "potential_no_label", + "potential_placeholder_only": "potential_placeholder_only" + } + }, + help: { + "en-US": { + "pass": "input_label_visible.html", + "potential_placeholder_only": "input_label_visible.html", + "potential_no_label": "input_label_visible.html", + "group": "input_label_visible.html" + } + }, + messages: { + "en-US": { + "pass": "The input element has an associated visible label", + "potential_placeholder_only": "The ‘placeholder’ is the only visible label", + "potential_no_label": "The input element does not have an associated visible label", + "group": "An input element must have an associated visible label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.5.3", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // if a control is in a table cell, the col headers can act as visible label, which is checked in table heading rule + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table")) + return null; + // custom widget submission is not in scope for this success criteria (IBMa/equal-access#204) if it is not associated with data entry + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role && role === "button" && nodeName !== 'input' && nodeName !== 'button') { + // likely a custom widget, skip if not associated with data entry + if (!CommonUtil_1.CommonUtil.getAncestor(ruleContext, "form")) + return null; + } + // when in a combobox, only look at the input textbox. + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox") || + nodeName === "input" || (nodeName === "select" && AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")))) { + return null; + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + // check visible label for input or button + if (nodeName === 'input' || nodeName === 'button') { + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'internal' || pair.nameFrom === 'alt')) + return (0, IRule_1.RulePass)("pass"); + } + // check if an alternative tooltip exists that can be made visible through mouseover + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'text' || pair.nameFrom === 'title')) + return (0, IRule_1.RulePass)("pass"); + // check if any visible text from the control. + // note that (1) the text doesn’t need to be associated with the control to form a relationship + // (2) the text doesn't need to follow accessible name requirement (e.g. nameFrom) + var text = CommonUtil_1.CommonUtil.getOnScreenInnerText(ruleContext); + if (text && text.length !== 0) + return (0, IRule_1.RulePass)("pass"); + // check if any descendant with an alternative tooltip that can be made visible through mouseover + // only consider img and svg, and other text content of the descendant is covered in the isInnerText above + var descendants = AriaUtil_1.AriaUtil.getAllDescendantsWithRoles(ruleContext, ["img", "graphics-document", "graphics-object", "graphics-symbol"], false, true); + if (descendants && descendants.length > 0) { + for (var d = 0; d < descendants.length; d++) { + if (CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "title") || CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "alt")) + return (0, IRule_1.RulePass)("pass"); + } + } + // check if there is a visible label pointed to by the aria-labelledby attribute. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby")) { + var theLabel = ruleContext.getAttribute("aria-labelledby"); + var labelValues = theLabel.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById && !DOMUtil_1.DOMUtil.sameNode(elementById, ruleContext) && VisUtil_1.VisUtil.isNodeVisible(elementById) && CommonUtil_1.CommonUtil.hasInnerContentHidden(elementById)) { + return (0, IRule_1.RulePass)("pass"); + } + } + } + if ((nodeName === "optgroup" || nodeName == "option") && (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'content'))) + return (0, IRule_1.RulePass)("pass"); + // Determine if this is referenced by a combobox. If so, the label belongs to the combobox + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + // check if a placeholder exists even though a placeholder text is not sufficient as a visible text + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) + return (0, IRule_1.RulePotential)("potential_placeholder_only"); + return (0, IRule_1.RulePotential)("potential_no_label"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_onchange_review.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/input_onchange_review.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_onchange_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_onchange_review = { + id: "input_onchange_review", + context: "dom:input[onchange], dom:textarea[onchange], dom:select[onchange]", + refactor: { + "WCAG20_Input_HasOnchange": { + // "Pass_0": "pass", + "Potential_1": "potential_warning" + } + }, + help: { + "en-US": { + // "pass": "input_onchange_review.html", + "potential_warning": "input_onchange_review.html", + "group": "input_onchange_review.html" + } + }, + messages: { + "en-US": { + "group": "Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs", + // "pass": "The user is advised of the automatic form submission, new window opening, or focus change", + "potential_warning": "Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type === "hidden" || type === "submit" || type === "image" || type === "button" || type === "reset") + return null; + } + return (0, IRule_1.RulePotential)("potential_warning"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_placeholder_label_visible.ts" +/*!*********************************************************!*\ + !*** ./src/v4/rules/input_placeholder_label_visible.ts ***! + \*********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_placeholder_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_placeholder_label_visible = { + id: "input_placeholder_label_visible", + context: "dom:input[placeholder], dom:textarea[placeholder]", + refactor: { + "HAAC_Input_Placeholder": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_placeholder_label_visible.html", + "Potential_1": "input_placeholder_label_visible.html", + "Potential_2": "input_placeholder_label_visible.html", + "group": "input_placeholder_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "HTML5 placeholder is the only visible label", + "Potential_2": "Additional visible label referenced by 'aria-labelledby' is not valid", + "group": "HTML5 'placeholder' attribute must not be used as a visible label replacement" + } + }, + /** + * merge the rule into input_label_visible + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type == "hidden" || type == "button") { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("hidden")) { + var hidden = ruleContext.getAttribute("hidden"); + if (hidden == "" || hidden.toLowerCase() == "hidden") { // when hidden is empty in the element, "" is returned, same as it has a value of "". + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("aria-label")) { + return (0, IRule_1.RulePotential)("Potential_1"); + } + if (ruleContext.hasAttribute("aria-labelledby") && ruleContext.hasAttribute("id")) { + var id = ruleContext.getAttribute("id").trim(); + var refIds = ruleContext.getAttribute("aria-labelledby").trim().split(/\s+/); // separated by one or more white spaces + if (!refIds.includes(id)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_content_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/label_content_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.label_content_exists = { + id: "label_content_exists", + context: "dom:label", + refactor: { + "Valerie_Label_HasContent": { + "Pass_Regular": "Pass_Regular", + "Pass_AriaLabel": "Pass_AriaLabel", + "Pass_LabelledBy": "Pass_LabelledBy", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_Regular": "label_content_exists.html", + "Pass_AriaLabel": "label_content_exists.html", + "Pass_LabelledBy": "label_content_exists.html", + "Fail_1": "label_content_exists.html", + "group": "label_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_Regular": "<label> element has accessible name with inner content", + "Pass_AriaLabel": "<label> element has accessible name via 'aria-label'", + "Pass_LabelledBy": "<label> element has accessible name via 'aria-labelledby'", + "Fail_1": "The <label> element does not have descriptive text that identifies the expected input", + "group": "A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_Regular"); + } + else if ((ruleContext.getAttribute("aria-label") || "").trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_AriaLabel"); + } + else if (ruleContext.hasAttribute("aria-labelledby")) { + var labelElem = fragment_1.FragmentUtil.getById(ruleContext, ruleContext.getAttribute('aria-labelledby')); + if (labelElem && !DOMUtil_1.DOMUtil.sameNode(labelElem, ruleContext) && CommonUtil_1.CommonUtil.hasInnerContent(labelElem)) { + return (0, IRule_1.RulePass)("Pass_LabelledBy"); + } + } + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_name_visible.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/label_name_visible.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_name_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.label_name_visible = { + id: "label_name_visible", + context: "aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter", + refactor: { + "WCAG21_Label_Accessible": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "label_name_visible.html", + "Fail_1": "label_name_visible.html", + "group": "label_name_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Accessible name matches or contains the visible label text", + "Fail_1": "Accessible name does not match or contain the visible label text", + "group": "Accessible name must match or contain the visible label text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["2.5.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Review https://github.com/act-rules/act-rules.github.io/issues/1618 + // https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA24 + act: "2ee8b8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // pass if the visible text uses Material Icon font + if (CSSUtil_1.CSSUtil.isMaterialIconFont(ruleContext)) + return (0, IRule_1.RulePass)("Pass_0"); + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + var isInputButton = false; + //let buttonTypes = ["button", "reset", "submit"]; //"image" + var inputType = null; + if (nodeName === "input" && ruleContext.hasAttribute("type")) { + inputType = ruleContext.getAttribute("type").toLowerCase(); + if (CommonUtil_1.CommonUtil.form_button_types.indexOf(inputType) !== -1) { + isInputButton = true; + } + } + var theLabelBy = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-labelledby"); + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy) && !isInputButton) { + // skip the checks if it has an aria-labelledby since it takes precedence. + } + else { + var theLabel = null; + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy)) { + var labelValues = theLabelBy.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById) { + theLabel = CommonUtil_1.CommonUtil.getInnerText(elementById); + break; + } + } + } + else { + theLabel = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-label"); + } + if (!theLabel) { + return null; + } + var text = null; + if (isInputButton) { + /* Note: Disable the alt check in images until we get confirmation + if (inputType==="image" && ruleContext.hasAttribute("alt")){ + // use 'alt' attribute as visible text + text = ruleContext.getAttribute("alt"); + }else + */ + if (ruleContext.hasAttribute("value")) { + // use 'value' attribute as visible text + text = ruleContext.getAttribute("value"); + } + else { + // use default value + if (inputType === "submit" /*||inputType==="image"*/) { + text = "submit"; + } + else if (inputType === "reset") { + text = "reset"; + } + } + } + if (!text) { + // look for a <label> element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!labelElem) { + var parentNode = DOMWalker_1.DOMWalker.parentNode(ruleContext); + if (parentNode.nodeName.toLowerCase() === "label" /*&& RPTUtil.isFirstFormElement(parentNode, ruleContext)*/) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + labelElem = CommonUtil_1.CommonUtil.removeAllFormElementsFromLabel(parentClone); + } + } + var element = labelElem ? labelElem : ruleContext; + var elementsToSkipContentCheck = ["meter", "output", "progress", "select", "textarea"]; + if (!labelElem && elementsToSkipContentCheck.indexOf(nodeName) !== -1) { + text = ""; // skip content check for some elements + } + else { + // get the visible text only + text = CommonUtil_1.CommonUtil.getOnScreenInnerText(element); + } + /* Note: Disable this alt check in images for now until we get confirmation + // Look for the alt attribute of an image which is considered visible text. + let hasImgAlt = false; + if (element.firstChild != null) { + let nw = RPTUtil.new NodeWalker(element); + while (!hasImgAlt && nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + hasImgAlt = (nw.node.nodeName.toLowerCase() == "img" && RPTUtil.attributeNonEmpty(nw.node, "alt")); + if (hasImgAlt) { + text = text ? text + nw.node.getAttribute("alt") : nw.node.getAttribute("alt"); + } + } + } + */ + } + var nonalphanumeric = /[^a-zA-Z0-9]/g; + text = text.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedText = CommonUtil_1.CommonUtil.normalizeSpacing(text).toLowerCase(); // Leading and trailing whitespace and difference in case sensitivity should be ignored. + theLabel = theLabel.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(theLabel).toLowerCase(); + if (normalizedText.length > 1) { // skip non-text content. e.g., <button aria-label="close">X</button> + var location_1 = normalizedLabel.indexOf(normalizedText); + // Avoid matching partial words.e.g., text "name" should not match 'surname' or 'names' + if (location_1 >= 0 && normalizedLabel.length > normalizedText.length) { + var letters = /^[0-9a-zA-Z]+$/; + if ((location_1 + normalizedText.length) < normalizedLabel.length) { + // check ending + var theChar = normalizedLabel.charAt(location_1 + normalizedText.length); + if (theChar.match(letters)) { + passed = false; + } + } + if (passed && location_1 > 0) { + // check beginning + var theChar = normalizedLabel.charAt(location_1 - 1); + if (theChar.match(letters)) { + passed = false; + } + } + } + if (location_1 === -1) { // check that visible text content of the target is contained within its accessible name. + passed = false; + } + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_ref_valid.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/label_ref_valid.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.label_ref_valid = { + id: "label_ref_valid", + context: "dom:label[for]", + refactor: { + "WCAG20_Label_RefValid": { + "Pass_0": "pass", + "Fail_1": "fail_invalid" + } + }, + help: { + "en-US": { + "pass": "label_ref_valid.html", + "fail_invalid": "label_ref_valid.html", + "group": "label_ref_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element", + "fail_invalid": "The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element", + "group": "The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("for"); + var passed = false; + var target = fragment_1.FragmentUtil.getById(ruleContext, id); + if (target) { + // ignore if both label and control are invisible + if (!VisUtil_1.VisUtil.isNodeVisible(target) && !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + passed = true; + // handles null and undefined + if (!target.hasAttribute("role")) { + // Fail if we're pointing at something that is labelled by another mechanism + var nodeName = target.nodeName.toLowerCase(); + passed = nodeName == "input" || nodeName == "select" || nodeName == "textarea" + || nodeName == "button" || nodeName == "datalist" + || nodeName == "optgroup" || nodeName == "option" + || nodeName == "keygen" || nodeName == "output" + || nodeName == "progress" || nodeName == "meter" + || nodeName == "fieldset" || nodeName == "legend"; + if (target.nodeName.toLowerCase() == "input" && target.hasAttribute("type")) { + var type = target.getAttribute("type").toLowerCase(); + passed = type == "text" || type == "password" || type == "file" || + type == "checkbox" || type == "radio" || + type == "hidden" || type == "search" || type == "tel" || type == "url" || type == "email" || //HTML 5 + type == "date" || type == "number" || type == "range" || type == "image" || //HTML 5 + type == "time" || type == "color" || // HTML 5 + type == "datetime-local" || type == "month" || type == "week"; //HTML5.1 + } + } + // Add one more check to make sure the target element is NOT hidden, in the case the target is hidden + // flag a violation regardless of what the Check Hidden Content setting is. + if (passed && !VisUtil_1.VisUtil.isNodeVisible(target)) { + passed = false; + } + } + var retToken = []; + if (!passed) { + retToken.push(id); + } + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken]); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_invalid", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_children_valid.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/list_children_valid.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_children_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.list_children_valid = { + id: "list_children_valid", + context: "aria:group", + refactor: { + "HAAC_List_Group_ListItem": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_children_valid.html", + "Fail_1": "list_children_valid.html", + "group": "list_children_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "List component with \"group\" role has children that are not <listitem> elements", + "group": "List component with \"group\" role must limit children to <listitem> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parent = DOMWalker_1.DOMWalker.parentElement(ruleContext); + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(parent, "list")) { + return null; + } + var passed = true; + var children = ruleContext.children; + for (var i = 0; passed && i < children.length; i++) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "listitem"); + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_markup_review.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/list_markup_review.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_markup_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +// Matches unordered list item prefixes: •, ◦, ▪, ▸, ►, ✓, ✗, ✦, –, —, *, -, o +var UNORDERED_BULLET_PATTERN = /^[ \t]*[•◦▪▸►✓✗✦\-–—*o][ \t]+\S/; +// Matches ordered list item prefixes: 1. 1) (1) a. a) (a) A. A) i. ii. iii. etc. +var ORDERED_ITEM_PATTERN = /^[ \t]*(?:\(?\d+[.)]\)?|\(?[a-zA-Z][.)]\)?|\(?(?:i{1,3}|iv|vi{0,3}|ix|xi{0,3}|xiv|xv)[.)]\)?)[ \t]+\S/i; +var LIST_ITEM_PATTERN = new RegExp(UNORDERED_BULLET_PATTERN.source + "|" + ORDERED_ITEM_PATTERN.source, "i"); +// Block-level elements that act as boundaries between independent content groups +var BLOCK_ELEMENTS = new Set([ + "blockquote", "center", "dir", "div", "form", + "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "br", "menu", "p", "pre", "table", + "section", "article", "aside", "nav", "header", "footer", + "figure", "figcaption", "details", "summary", "dialog", + "script", "style", "label", + "ul", "ol", "dl", "li", "dt", "dd" +]); +// Inline elements whose text content is treated as part of the surrounding text run +var INLINE_ELEMENTS = new Set([ + "a", "abbr", "acronym", "b", "bdo", "big", "br", "button", "cite", + "code", "dfn", "em", "i", "img", "input", "kbd", "label", "map", + "object", "output", "q", "samp", "select", "small", "span", + "strong", "sub", "sup", "textarea", "time", "tt", "u", "var" +]); +// Returns the combined text of a node and its inline descendants, normalised to single spaces +function getShallowText(node) { + var text = ""; + node.childNodes.forEach(function (child) { + var _a; + if (child.nodeType === Node.TEXT_NODE) { + text += (_a = child.nodeValue) !== null && _a !== void 0 ? _a : ""; + } + else if (child.nodeType === Node.ELEMENT_NODE) { + var tag = child.nodeName.toLowerCase(); + if (INLINE_ELEMENTS.has(tag)) { + text += getShallowText(child); + } + } + }); + return text.replace(/\s+/g, " "); +} +// Returns trimmed non-empty lines from a node, splitting on newlines and <br> boundaries +function getLinesFromNode(node) { + var lines = []; + function walk(n) { + var _a; + if (n.nodeType === Node.TEXT_NODE) { + ((_a = n.nodeValue) !== null && _a !== void 0 ? _a : "").split(/\r?\n/).forEach(function (p) { + var trimmed = p.trim(); + if (trimmed.length > 0) + lines.push(trimmed); + }); + } + else if (n.nodeType === Node.ELEMENT_NODE) { + var elem = n; + var tag = elem.nodeName.toLowerCase(); + if (tag === "br") { + lines.push("\x00"); + return; + } + if (BLOCK_ELEMENTS.has(tag)) + return; + // Skip elements with list-related or widget roles + var role = elem.getAttribute("role"); + if (role) { + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(elem, ["widget"]); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "rowheader"], roles); + if (roles.length > 0) + return; + } + n.childNodes.forEach(walk); + } + } + walk(node); + return lines.filter(function (l) { return l !== "\x00"; }); +} +// Returns the maximum number of consecutive list-item-like lines found among +// the direct children of parent, treating <br> and whitespace-only text as separators +function maxConsecutiveListItems(parent) { + var maxRun = 0; + var currentRun = 0; + var currentLineText = ""; // accumulate text across inline siblings until <br> + parent.childNodes.forEach(function (child) { + var _a; + var tag = child.nodeName.toLowerCase(); + if (tag === "br") { + // test the accumulated line + var trimmed_1 = currentLineText.trim(); + if (trimmed_1.length > 0) { + if (LIST_ITEM_PATTERN.test(trimmed_1)) { + maxRun = Math.max(maxRun, ++currentRun); + } + else { + currentRun = 0; + } + } + currentLineText = ""; + return; + } + if (child.nodeType === Node.TEXT_NODE) { + var raw = (_a = child.nodeValue) !== null && _a !== void 0 ? _a : ""; + if (raw.trim().length === 0) + return; + // if there are embedded newlines, flush on each + var segs = raw.split(/\r?\n/); + segs.forEach(function (seg, i) { + if (i > 0) { + var trimmed_2 = currentLineText.trim(); + if (trimmed_2.length > 0) { + if (LIST_ITEM_PATTERN.test(trimmed_2)) { + maxRun = Math.max(maxRun, ++currentRun); + } + else { + currentRun = 0; + } + } + currentLineText = ""; + } + currentLineText += seg; + }); + return; + } + if (child.nodeType === Node.ELEMENT_NODE) { + var elem = child; + if (BLOCK_ELEMENTS.has(tag)) { + // flush current line before block boundary + var trimmed_3 = currentLineText.trim(); + if (trimmed_3.length > 0 && LIST_ITEM_PATTERN.test(trimmed_3)) { + maxRun = Math.max(maxRun, ++currentRun); + } + currentLineText = ""; + currentRun = 0; + return; + } + if (INLINE_ELEMENTS.has(tag)) { + currentLineText += getShallowText(elem); + } + else { + currentRun = 0; + currentLineText = ""; + } + } + }); + // flush any remaining line at end of container + var trimmed = currentLineText.trim(); + if (trimmed.length > 0 && LIST_ITEM_PATTERN.test(trimmed)) { + maxRun = Math.max(maxRun, ++currentRun); + } + return maxRun; +} +// Returns true if 2+ consecutive <br>-separated lines within element match the list-item pattern +function hasBrSeparatedListLines(element) { + var run = 0; + for (var _i = 0, _a = getLinesFromNode(element); _i < _a.length; _i++) { + var line = _a[_i]; + if (LIST_ITEM_PATTERN.test(line)) { + if (++run >= 2) + return true; + } + else { + run = 0; + } + } + return false; +} +exports.list_markup_review = { + id: "list_markup_review", + context: "dom:*", + refactor: { + "RPT_List_UseMarkup": { + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "potential_list": "list_markup_review.html", + "group": "list_markup_review.html" + } + }, + messages: { + "en-US": { + "potential_list": "Verify this is a list and if so, modify to use proper HTML elements for the list", + "group": "Proper HTML elements should be used to create a list" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "style", "label"]) !== null) + return null; + // Only check block-level and table-cell elements first — + // td/th must be checked before the ancestor role check since + // table/row/cell ARIA roles would otherwise cause an early exit + if (nodeName === "td" || nodeName === "th") { + if (maxConsecutiveListItems(ruleContext) >= 2) + return (0, IRule_1.RulePotential)("potential_list"); + if (hasBrSeparatedListLines(ruleContext)) + return (0, IRule_1.RulePotential)("potential_list"); + return null; + } + // Skip elements that already have semantic list, widget, or structural roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget"]); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "rowheader"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + // Only check block-level elements to avoid duplicate reports + if (!BLOCK_ELEMENTS.has(nodeName) && nodeName !== "body" && nodeName !== "li") + return null; + if (["ul", "ol", "dl", "menu"].includes(nodeName)) + return null; + if (maxConsecutiveListItems(ruleContext) >= 2) + return (0, IRule_1.RulePotential)("potential_list"); + if (hasBrSeparatedListLines(ruleContext)) + return (0, IRule_1.RulePotential)("potential_list"); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_structure_proper.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/list_structure_proper.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_structure_proper = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.list_structure_proper = { + id: "list_structure_proper", + context: "dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt", + refactor: { + "RPT_List_Misuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_structure_proper.html", + "Potential_1": "list_structure_proper.html", + "group": "list_structure_proper.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "List element is missing or improperly structured", + "group": "List elements should only be used for lists of related items" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Get all the childrens of the ruleContext + var children = ruleContext.children; + if (nodeName == "dl") { + var first = ""; + var last = ""; + var walkChildren = ruleContext.firstChild; + passed = true; + var presentationalFound = false; + // If there are no childrens set as passed, since dl elements can have + // zero or more of: one or more dt elements, followed by one or more dd elements + if (!ruleContext.children || ruleContext.children.length == 0) { + passed = true; + } + else { + while (passed && walkChildren != null) { + if (walkChildren.nodeType == 1) { + var nodeName_1 = walkChildren.nodeName.toLowerCase(); + // While walking through the elements under dl, if we find a + // presentational element we move to the next element as presentational + // elements are allowed under list elements as they are only for + // formatting text nodes. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Only set to pass if we find dd or dt element, in the case of + // an element that is not supported we will catch it here. i.e. img + // element + passed = nodeName_1 == "dd" || nodeName_1 == "dt"; + // Set the first and last node depending on which is found first and last + if (first == "") + first = nodeName_1; + last = nodeName_1; + } + walkChildren = walkChildren.nextSibling; + } + // In the case that we have found dt and dd elements under dl we pass right away. + // In the case that there is no dt or dd element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && first == "dt" && last == "dd") || (passed && presentationalFound); + } + } + else if (nodeName == "li") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["ul", "ol", "dir", "menu"]) != null; + } + else if (nodeName == "dd" || nodeName == "dt") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "dl") != null; + } + else { + var walkChildren = ruleContext.firstChild; + // Zero or more li elements are permitted inside of <ol>, <ul> or <menu> elements now as per the html5 spec. This handles the case + // when there are zero elements under the <ol>, <ul> or <menu>. + if ((nodeName == "ul" || nodeName == "ol" || nodeName == "menu") && (!ruleContext.children || ruleContext.children.length == 0)) { + passed = true; + } + else { + var liFound = false; + var presentationalFound = false; + passed = true; + while (passed && walkChildren != null) { + // While walking through the list elements, if we find a + // presentational element we skip checking as presentational + // elements are allowed under list elements as they are only for + // formatting text. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Pass if the node type is anything but 1, or in the case that it is a li element. For any other node + // it will be caught here that element is not allowed under list node. + // Furthermore in the case that there is a template element with the parent being ul/ol don't flag a violation + passed = walkChildren.nodeType != 1 || walkChildren.nodeName.toLowerCase() == "li" || (walkChildren.nodeName.toLowerCase() == "template" && (nodeName == "ul" || nodeName == "ol")); + // Set li found to true if the current element (nodeType=1) is an li element + liFound = liFound || (walkChildren.nodeType == 1 && walkChildren.nodeName.toLowerCase() == "li"); + walkChildren = walkChildren.nextSibling; + } + // In the case that it has passed and also li element is found under list node, we pass right away. + // In the case that there is no li element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && liFound) || (passed && presentationalFound); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/marquee_elem_avoid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/marquee_elem_avoid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.marquee_elem_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.marquee_elem_avoid = { + id: "marquee_elem_avoid", + context: "dom:marquee", + refactor: { + "RPT_Marquee_Trigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Fail_1": "marquee_elem_avoid.html", + "group": "marquee_elem_avoid.html" + } + }, + messages: { + "en-US": { + "Fail_1": "Scrolling content found that uses the obsolete <marquee> element", + "group": "The <marquee> element is obsolete and should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_alt_brief.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/media_alt_brief.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_brief = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_brief = { + id: "media_alt_brief", + context: "dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]", + refactor: { + "RPT_Media_AltBrief": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_brief.html", + "Potential_1": "media_alt_brief.html", + "group": "media_alt_brief.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Text alternative is more than 150 characters", + "group": "Alternative text in 'alt' attribute should be brief (<150 characters)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + maxAlt: { + value: 150, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var altLength = ruleContext.getAttribute("alt").trim().length; + var passed = altLength <= validateParams.maxAlt.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_alt_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/media_alt_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_exists = { + id: "media_alt_exists", + context: "dom:area[alt], dom:embed[alt]", + refactor: { + "RPT_Media_AudioVideoAltFilename": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_exists.html", + "Potential_1": "media_alt_exists.html", + "group": "media_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Filename used as label for embedded audio or video", + "group": "Audio or video on the page must have a short text alternative that describes the media content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var uri = ""; + if (ruleContext.nodeName.toLowerCase() == "area") { + uri = ruleContext.getAttribute("href"); + } + else { + uri = ruleContext.getAttribute("src"); + } + if (uri == null) + uri = ""; + var ext = CommonUtil_1.CommonUtil.getFileExt(uri); + var isAudVid = ext.length != 0 && (CommonUtil_1.CommonUtil.isAudioExt(ext) || CommonUtil_1.CommonUtil.isVideoExt(ext)); + var altText = ruleContext.getAttribute("alt"); + var passed = !isAudVid || (altText.length > 0 && altText.indexOf(ext) == -1); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_audio_transcribed.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/media_audio_transcribed.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_audio_transcribed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_audio_transcribed = { + id: "media_audio_transcribed", + context: "dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object", + refactor: { + "RPT_Media_AudioTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_audio_transcribed.html", + "group": "media_audio_transcribed.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Provide transcripts for audio files", + "group": "Audio information should also be available in text form" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed; + var thisNode = ruleContext.nodeName.toLowerCase(); + if (thisNode == "bgsound") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isAudioObjEmbedLink(ruleContext); + } + if (passed) + return null; // Out of Scope + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_autostart_controllable.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/media_autostart_controllable.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_autostart_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.media_autostart_controllable = { + id: "media_autostart_controllable", + context: "dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound", + refactor: { + "RPT_Embed_AutoStart": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_autostart_controllable.html", + "Potential_1": "media_autostart_controllable.html", + "group": "media_autostart_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically", + "group": "Mechanism must be available to pause or stop and control the volume of the audio that plays automatically" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed; + if (nodeName == "bgsound") { + passed = false; + } + else if (nodeName == "param") { + var content = ""; + if (ruleContext.hasAttribute("value")) + content = ruleContext.getAttribute("value").toLowerCase(); + passed = content.indexOf("0;") == 0 || + !(content.indexOf("true") != -1 || content.indexOf("1") != -1); + } + else if (nodeName == "embed") { + passed = true; + if (ruleContext.hasAttribute("flashvars")) { + var str = ruleContext.getAttribute("flashvars"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + if (passed && ruleContext.hasAttribute("src")) { + var str = ruleContext.getAttribute("src"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + } + if (passed && ruleContext.hasAttribute("autostart")) { + var val = ruleContext.getAttribute("autostart").toLowerCase(); + passed = val != 'true' && val != '1'; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_keyboard_controllable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/media_keyboard_controllable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_keyboard_controllable = { + id: "media_keyboard_controllable", + context: "dom:audio, dom:video", + refactor: { + "HAAC_Audio_Video_Trigger": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_keyboard_controllable.html", + "Manual_1": "media_keyboard_controllable.html", + "group": "media_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify media using <audio> and/or <video> elements have keyboard accessible controls", + "group": "Media using <audio> and/or <video> elements must have keyboard accessible controls" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName == "audio" || nodeName === "video") { + passed = false; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_live_captioned.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/media_live_captioned.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_live_captioned = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.media_live_captioned = { + id: "media_live_captioned", + context: "dom:embed, dom:object", + refactor: { + "RPT_Media_VideoObjectTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_live_captioned.html", + "group": "media_live_captioned.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify captions are provided for live media (streaming video with audio)", + "group": "Live media (streaming video with audio) should have captions for audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_track_available.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/media_track_available.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_track_available = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_track_available = { + id: "media_track_available", + context: "dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object", + refactor: { + "RPT_Media_VideoReferenceTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_track_available.html", + "group": "media_track_available.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify availability of a user-selectable audio track with description of visual content", + "group": "Pre-recorded media should have an audio track that describes visual information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.3", "1.2.5"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName == "applet") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_redirect_optional.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/meta_redirect_optional.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_redirect_optional = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.meta_redirect_optional = { + id: "meta_redirect_optional", + context: "dom:meta[http-equiv][content]", + refactor: { + "WCAG20_Meta_RedirectZero": { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "fail_longrefresh" + } + }, + help: { + "en-US": { + "group": "meta_redirect_optional.html", + "pass": "meta_redirect_optional.html", + "fail": "meta_redirect_optional.html", + "fail_longrefresh": "meta_redirect_optional.html" + } + }, + messages: { + "en-US": { + "group": "Page should not automatically refresh without warning or option to turn it off or adjust the time limit", + "pass": "Rule Passed", + "fail": "Check page does not automatically refresh without warning or options", + "fail_longrefresh": "Check page does not automatically refresh without warning or options" + } + }, + /** + * deprecate WCAG AAA + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.4", "3.2.5"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }], + */ + rulesets: [{ + "id": [], + "num": ["2.2.4", "3.2.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + // Removed ACT bisz58 AAA + /**act: [{ + "bc659a" : { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "pass" + } + }],*/ + act: ["bisz58"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') { + return null; + } + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed or failed: only the first one tridders if multiple + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_redirect_optional_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_redirect_optional_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + else if (time < 72001) + return (0, IRule_1.RuleFail)("fail"); + return (0, IRule_1.RuleFail)("fail_longrefresh"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_refresh_delay.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/meta_refresh_delay.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_refresh_delay = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.meta_refresh_delay = { + id: "meta_refresh_delay", + context: "dom:meta[http-equiv][content]", + refactor: { + "RPT_Meta_Refresh": { + "Pass_0": "pass", + "Potential_1": "potential_refresh" + } + }, + help: { + "en-US": { + "group": "meta_refresh_delay.html", + "pass": "meta_refresh_delay.html", + "potential_refresh": "meta_refresh_delay.html" + } + }, + messages: { + "en-US": { + "group": "Pages should not refresh automatically", + "pass": "Pages do not refresh automatically", + "potential_refresh": "Verify page is not being caused to refresh automatically", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + //act: [ "bisz58", "bc659a" ], + act: ["bc659a"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed: the first one takes priority + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_refresh_delay_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_refresh_delay_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_refresh"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_viewport_zoomable.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/meta_viewport_zoomable.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_viewport_zoomable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.meta_viewport_zoomable = { + id: "meta_viewport_zoomable", + context: "dom:meta[name][content]", + refactor: { + "meta_viewport_zoom": { + "Pass_0": "pass", + "Potential_1": "potential_zoomable" + } + }, + help: { + "en-US": { + "group": "meta_viewport_zoomable.html", + "pass": "meta_viewport_zoomable.html", + "potential_zoomable": "meta_viewport_zoomable.html" + } + }, + messages: { + "en-US": { + "group": "The 'meta[name=viewport]' should not prevent the browser zooming the content", + "pass": "The 'meta[name=viewport]' does not prevent the browser zooming the content", + "potential_zoomable": "Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "b4f0c3": { + "pass": "pass", + "potential_zoomable": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("name").toLowerCase() !== 'viewport') + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + // neither maximum-scale nor user-scalable (default yes) + if (!content || content.trim() === '' || (!content.includes('maximum-scale') && !content.includes('user-scalable'))) + return null; + var user_msg = null; + var max_msg = null; + var props = content.split(","); + var user_scale_value = 'yes'; + var maximum_scale_value = '2.0'; + for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { + var prop = props_1[_i]; + var pieces = prop.trim().split('='); + if (pieces.length < 2) + continue; + if (prop.includes('user-scalable')) { + user_msg = prop; + user_scale_value = pieces[1].trim(); + if (user_scale_value.startsWith("'") || user_scale_value.startsWith('"')) { + user_scale_value = user_scale_value.substring(1, user_scale_value.length - 1); + } + } + else if (prop.includes('maximum-scale')) { + max_msg = prop; + maximum_scale_value = pieces[1].trim(); + if (maximum_scale_value.startsWith("'") || maximum_scale_value.startsWith('"')) { + maximum_scale_value = maximum_scale_value.substring(1, maximum_scale_value.length - 1).trim(); + } + } + } + var value = Number(user_scale_value); + if (!isNaN(value)) { + if (value >= 1 || value <= -1) + user_scale_value = 'yes'; + } + var maximum_scale = 2.0; + value = Number(maximum_scale_value); + if (!isNaN(value)) { + if (value < 0) + maximum_scale = 2.0; + else + maximum_scale = value; + } + else { + if (maximum_scale_value === 'yes') + maximum_scale = 1.0; + else + maximum_scale = 0.1; + } + // user-scalable is not set to 'yes', ignore maximum_scale + if (user_scale_value !== 'yes') { + return (0, IRule_1.RulePotential)("potential_zoomable", [user_msg]); + } + // user-scalable is 'yes', but maximum_scale is too small + if (maximum_scale < 2.0) { + return (0, IRule_1.RulePotential)("potential_zoomable", [max_msg]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/noembed_content_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/noembed_content_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.noembed_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.noembed_content_exists = { + id: "noembed_content_exists", + context: "dom:noembed", + refactor: { + "Valerie_Noembed_HasContent": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "noembed_content_exists.html", + "Potential_1": "noembed_content_exists.html", + "group": "noembed_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Add descriptive text to the <noembed> element", + "group": "<noembed> elements should contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/object_text_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/object_text_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.object_text_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.object_text_exists = { + id: "object_text_exists", + context: "dom:object", + refactor: { + "WCAG20_Object_HasText": { + "pass": "pass", + "fail_no_text_alternative": "fail_no_text_alternative" + } + }, + help: { + "en-US": { + "group": "object_text_exists.html", + "pass": "object_text_exists.html", + "fail_no_text_alternative": "object_text_exists.html" + } + }, + messages: { + "en-US": { + "group": "<object> element must have a text alternative for the content rendered by the object", + "pass": "<object> element has a text alternative", + "fail_no_text_alternative": "An <object> element does not have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "8fc3b6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Detect if this object is of type text, by checking the object type in the case it is text then do not trigger this rule + if (ruleContext.hasAttribute("type") && (ruleContext.getAttribute("type")).indexOf("text") !== -1) { + return null; + } + // ignore if an explicit role is specified: including 'presentation', 'none', 'application', 'document' or 'img' + // this case will be covered in other rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + // Per ACT, ignore embedded HTML files + var data = ruleContext.getAttribute("data"); + var ext = data && typeof data === typeof "" ? data.substring(data.lastIndexOf(".")) : ""; + if (ext === ".html" || ext === ".htm") { + return null; + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //let passed = ARIAMapper.computeName(ruleContext).trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_no_text_alternative"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/page_title_exists.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/page_title_exists.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +exports.page_title_exists = { + id: "page_title_exists", + context: "dom:html", + refactor: { + "WCAG20_Doc_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "page_title_exists.html", + "Pass_0": "page_title_exists.html", + "Fail_1": "page_title_exists.html", + "Fail_2": "page_title_exists.html", + "Fail_3": "page_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "The page should have a title that correctly identifies the subject of the page", + "Pass_0": "Rule Passed", + "Fail_1": "Missing <head> element so there can be no <title> element present", + "Fail_2": "Missing <title> element in <head> element", + "Fail_3": "The <title> element is empty (no innerHTML)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "2779a5": { + "Pass_0": "pass", + "Fail_1": "pass", + "Fail_2": "fail", + "Fail_3": "fail" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // First, find the head element + var findHead = ruleContext.firstChild; + var findTitle = null; + while (findHead != null) { + if (findHead.nodeName.toLowerCase() == "head") + break; + findHead = findHead.nextSibling; + } + var possibleTitles = ruleContext.querySelectorAll("title"); + for (var idx = 0; idx < possibleTitles.length; ++idx) { + if (!CommonUtil_1.CommonUtil.getAncestor(possibleTitles[idx], ["svg"])) { + findTitle = possibleTitles[idx]; + break; + } + } + if (findHead === null) { + if (!findTitle) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + if (findTitle === null) { // don't have title second PoF + return (0, IRule_1.RuleFail)("Fail_2"); + } + // if we get here we have <head> and <title> + if (findTitle != null && CommonUtil_1.CommonUtil.getInnerText(findTitle).trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { // <title> has no innerHTML third PoF + return (0, IRule_1.RuleFail)("Fail_3"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/page_title_valid.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/page_title_valid.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.page_title_valid = { + id: "page_title_valid", + context: "dom:head dom:title", + refactor: { + "RPT_Title_Valid": { + "Pass_0": "Pass_0", + // "Fail_1": "Fail_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "page_title_valid.html", + // "Fail_1": "page_title_valid.html", + "Potential_2": "page_title_valid.html", + "group": "page_title_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + // "Fail_1": "Page <title> is empty", + "Potential_2": "Verify that using the filename as the page <title> value is descriptive", + "group": "Page <title> should be a descriptive title, rather than a filename" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var titleStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim(); + // allow .com, .net and .org + var titleStrLowercase = titleStr.toLowerCase(); + if (titleStrLowercase.includes(".com") || titleStrLowercase.includes(".net") || titleStrLowercase.includes(".org")) { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + if (titleStr.length === 0) { + // This is covered by page_title_exists + return null; //RuleFail("Fail_1"); + } + else { + var passed = !/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(titleStr); + if (!passed) { + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_focus_blur_review.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/script_focus_blur_review.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_focus_blur_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_focus_blur_review = { + id: "script_focus_blur_review", + context: "dom:*[onfocus]", + refactor: { + "WCAG20_Script_FocusBlurs": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_focus_blur_review.html", + "Potential_1": "script_focus_blur_review.html", + "group": "script_focus_blur_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify script does not remove focus from content that normally receives focus", + "group": "Scripting must not remove focus from content that normally receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.7", "3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onfocus").indexOf(".blur(") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_onclick_avoid.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/script_onclick_avoid.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_avoid = { + id: "script_onclick_avoid", + context: "dom:*[onclick]", + dependencies: ["script_onclick_misuse"], + refactor: { + "RPT_Script_OnclickHTML2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_avoid.html", + "Potential_1": "script_onclick_avoid.html", + "group": "script_onclick_avoid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that 'onclick' events are not used in script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + // If there's an aria-role specified, don't trigger this. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role")) + return (0, IRule_1.RulePass)("Pass_0"); + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = nodeName == "a" || nodeName == "area" || nodeName == "input"; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_onclick_misuse.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/script_onclick_misuse.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_misuse = { + id: "script_onclick_misuse", + context: "dom:*[onclick]", + refactor: { + "RPT_Script_OnclickHTML1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_misuse.html", + "Potential_1": "script_onclick_misuse.html", + "group": "script_onclick_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Possible use of a script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + failSubstring: { + value: [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml", + "location.href"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // If there's an aria-role specified, don't trigger this. + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role"); + // If this is an a or area, don't trigger if there's an href. + var nodeName = ruleContext.nodeName.toLowerCase(); + passed = passed || ((nodeName == "a" || nodeName == "area") && CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href")); + // If the guards failed, check to see if they're looking at links + if (!passed) { + var failSubstring = validateParams.failSubstring.value; + ; + var onclick_1 = ruleContext.getAttribute("onclick").toLowerCase(); + passed = true; + for (var i = 0; passed && i < failSubstring.length; ++i) { + passed = onclick_1.indexOf(failSubstring[i]) == -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_select_review.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/script_select_review.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_select_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_select_review = { + id: "script_select_review", + context: "dom:select", + refactor: { + "WCAG20_Select_NoChangeAction": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_select_review.html", + "Potential_1": "script_select_review.html", + "group": "script_select_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that no change of context or action occurs when selection options in this component receive focus", + "group": "No changes of context should occur when a selection value receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !ruleContext.hasAttribute("onchange") && !ruleContext.hasAttribute("onfocus"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/select_options_grouped.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/select_options_grouped.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.select_options_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.select_options_grouped = { + id: "select_options_grouped", + context: "dom:select", + refactor: { + "WCAG20_Select_HasOptGroup": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "select_options_grouped.html", + "Potential_1": "select_options_grouped.html", + "group": "select_options_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Group of related options may need <optgroup>", + "group": "Groups of related options within a selection list should be grouped with <optgroup>" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramNumOptions: { + value: 10, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + // Handle the cases where optgroup is hidden, which should trigger a violations + // but in the case that Check hidden option is set then should not trigger a violation. + var passed = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "optgroup", false, true).length > 0 || + CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "option", false, true).length <= + validateParams.paramNumOptions.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/skip_main_described.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/skip_main_described.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_described = { + id: "skip_main_described", + context: "dom:body", + dependencies: ["skip_main_exists"], + refactor: { + "WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_described.html", + "Potential_1": "skip_main_described.html", + "group": "skip_main_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that if this hyperlink skips content, the description communicates where it links to", + "group": "The description of a hyperlink used to skip content must communicate where it links to" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramSkipText: { + value: ["skip", "jump"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var links = doc.links; + // Skip link should be the first one on the page with an href attribute (i.e., links[0]) + // also if the first link is hidden then we should also trigger a violation. + if (links && links.length > 0 && VisUtil_1.VisUtil.isNodeVisible(links[0])) { + var testText = CommonUtil_1.CommonUtil.getInnerText(doc.links[0]).toLowerCase(); + for (var i = 0; !passed && i < validateParams.paramSkipText.value.length; ++i) { + passed = testText.indexOf(validateParams.paramSkipText.value[i]) != -1; + } + } + else + passed = false; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/skip_main_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/skip_main_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_exists = { + id: "skip_main_exists", + context: "dom:body", + refactor: { + "WCAG20_Body_FirstASkips_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_exists.html", + "Fail_1": "skip_main_exists.html", + "group": "skip_main_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The page does not provide a way to quickly navigate to the main content (ARIA \"main\" landmark or a skip link)", + "group": "Pages must provide a way to skip directly to the main content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + // Skip anchor should be the first one on the page with an href attribute + var testAnchor = null; + for (var i = 0; i < anchors.length; ++i) { + if (anchors[i].hasAttribute("href") && VisUtil_1.VisUtil.isNodeVisible(anchors[i])) { + testAnchor = anchors[i]; + break; + } + } + // Pull out the target id + var targetId = null; + if (testAnchor != null) { + var hrefStr = testAnchor.getAttribute("href"); + var idx = hrefStr.indexOf("#"); + if (idx != -1) { + targetId = hrefStr.substring(idx + 1); + } + } + // Determine if there is an element id or named anchor on the page with this + // target id. + if (targetId != null) { + passed = doc.getElementById(targetId) != null; + for (var i = 0; !passed && i < anchors.length; ++i) { + if (!anchors[i].hasAttribute("href") && + anchors[i].hasAttribute("name") && + anchors[i].getAttribute("name") == targetId) { + passed = true; + } + } + } + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_background_decorative.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/style_background_decorative.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_background_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_background_decorative = { + id: "style_background_decorative", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Style_BackgroundImage": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_background_decorative.html", + "Potential_1": "style_background_decorative.html", + "group": "style_background_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the CSS background image does not convey important information", + "group": "Images included by using CSS alone must not convey important information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet") { + // External stylesheet - trigger + passed = CommonUtil_1.CommonUtil.triggerOnce(ruleContext, "style_background_decorative", false); + } + if (passed && nodeName === "style" || ruleContext.hasAttribute("style")) { + var styleText = void 0; + if (nodeName === "style") + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + else + styleText = ruleContext.getAttribute("style"); + var bgMatches = styleText.match(/background:[^;]*/g); + if (bgMatches !== null) { + for (var i = 0; passed && i < bgMatches.length; ++i) + passed = bgMatches[i].indexOf("url(") === -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_before_after_review.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/style_before_after_review.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_before_after_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +/** + * Description: Trigger if :before and :after are used in CSS (Internal and External) with content + * Origin: WCAG 2.0 F87 + */ +exports.style_before_after_review = { + id: "style_before_after_review", + context: "dom:style, dom:link", + refactor: { + "WCAG20_Style_BeforeAfter": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_before_after_review.html", + "Pass_0": "style_before_after_review.html", + "Potential_1": "style_before_after_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content", + "Pass_0": "Rule Passed", + "Potential_1": "Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content" + } + }, + rulesets: [{ + // Turn off the rule due to the obsolete requirement + //id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + id: [], + num: "1.3.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + //check Internal styles + if (ruleContext.nodeName.toLowerCase() === "style") { + var css = CSSUtil_1.CSSUtil.getCSSStyle(ruleContext); + for (var i = 0; passed && i < css.length; ++i) { + // Guard against bad CSS + if (css[i].selector) { + passed = (css[i].selector.indexOf(":before") === -1 && css[i].selector.indexOf(":after") === -1) || + !("content" in css[i].values) || css[i].values["content"].trim().length === 0 || css[i].values["content"].trim() === "\"\"" + || css[i].values["content"].trim() === "\'\'" || css[i].values["content"].trim() === "none" || css[i].values["content"].trim() === "attr(x)" + || css[i].values["content"].trim() === "attr(y)"; + } + } + // check special rules in the stylesheets + if (passed) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + // check @media rules + // + // The check 'if (styleRule instanceof CSSMediaRule)' doesn't work when run in Karma(but works in DAP) + // so let's access the type directly as a workaround + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var styleMediaRule = styleRule; + var mediaRules = styleMediaRule.cssRules; + if (mediaRules) { + for (var rIndex = 0; passed && rIndex < mediaRules.length; rIndex++) { + var mRule = mediaRules[rIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + // check import rules + else if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var rules = styleImportRule.styleSheet.cssRules ? + styleImportRule.styleSheet.cssRules : + styleImportRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + // check @media rules + if (importedRule.type && importedRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = importedRule.cssRules; + if (mediaRules) { + for (var mIndex = 0; mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (importedRule.selectorText !== null && importedRule.selectorText !== undefined) { + var rule = importedRule.selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = importedRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + } + //check external styles + if (ruleContext.nodeName.toLowerCase() === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check @media rules + if (ruleFromLink.type && ruleFromLink.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = ruleFromLink.cssRules; + if (mediaRules) { + for (var mIndex = 0; passed && mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var ruleSelTxt = mRule.selectorText.toLowerCase(); + if (ruleSelTxt.indexOf(":before") !== -1 || ruleSelTxt.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (rules[rIndex].selectorText !== null && rules[rIndex].selectorText !== undefined) { + var rule = rules[rIndex].selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = rules[rIndex].style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_color_misuse.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/style_color_misuse.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_color_misuse = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_color_misuse = { + id: "style_color_misuse", + context: "dom:style, dom:*[style], dom:font[color], dom:link", + refactor: { + "RPT_Style_ColorSemantics1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_color_misuse.html", + "Pass_0": "style_color_misuse.html", + "Potential_1": "style_color_misuse.html" + } + }, + messages: { + "en-US": { + "group": "Combine color and descriptive markup to convey information", + "Pass_0": "Rule Passed", + "Potential_1": "Verify color is not used as the only visual means of conveying information" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var importRules = styleImportRule.styleSheet.cssRules ? styleImportRule.styleSheet.cssRules : styleImportRule.styleSheet.rules; + for (var rIndex = 0; rIndex < importRules.length; rIndex++) { + var iRule = importRules[rIndex]; + styleText += iRule.cssText; + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + else if (ruleContext.hasAttribute("style")) { + styleText = ruleContext.getAttribute("style").toLowerCase(); + } + else if (nodeName === "link" && //check external styles + ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && + ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var rIndex = 0; rIndex < rules.length; rIndex++) { + styleText += rules[rIndex].cssText; + } + } + catch (e) { + // Silence css access issues + } + } + } + } + var passed = true; + // Defect 1022: Find uses of 'color' and '*background*' only + var isBgUsed = styleText.match(/\bbackground\b/i); + var theColorStyleToCheck = styleText.replace(/-color/g, ""); + var isColorUsed = theColorStyleToCheck.match(/\bcolor\b/i); + if (ruleContext.hasAttribute("color") || isColorUsed || isBgUsed) { + var goodTagNames = { + "em": "", "strong": "", "cite": "", "dfn": "", + "code": "", "samp": "", "kbd": "", "var": "", "abbr": "", "acronym": "" + }; + // Color used � are there semantics involved? + passed = nodeName in goodTagNames || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, goodTagNames) !== null; + if (!passed && ruleContext.hasChildNodes()) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (!passed && nw.nextNode() && nw.node !== ruleContext) { + passed = nw.node.nodeName.toLowerCase() in goodTagNames; + } + } + } + // Trigger only once + if (!passed) { + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_color_misuse", false); + passed = triggered; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_color_misuse", true); + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_focus_visible.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/style_focus_visible.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_focus_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +exports.style_focus_visible = { + id: "style_focus_visible", + context: "dom:*", + refactor: { + "RPT_Style_HinderFocus1": { + "Potential_1": "potential_focus_not_visible" + } + }, + help: { + "en-US": { + "group": "style_focus_visible.html", + "potential_focus_not_visible": "style_focus_visible.html", + "pass_focus_visible": "style_focus_visible.html" + } + }, + messages: { + "en-US": { + "group": "The keyboard focus indicator should be visible when default border or outline is modified by CSS", + "potential_focus_not_visible": "Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'", + "pass_focus_visible": "The keyboard focus indicator is visible or is not changed from the browser default" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.7", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + skipNodes: { + value: ["table"], + type: "[string]" + }, + checkParams: { + value: ["border", "border-width", "border-style", + "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", + "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", + "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", + "outline", "outline-width", "outline-color", "outline-style"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext) || validateParams.skipNodes.value.includes(ruleContext.nodeName.toLowerCase())) { + return null; + } + // Get all styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, ["", ":focus", ":focus-visible", ":focus-within"]); + var normalStyles = allStyles[""]; // consider both user-defined and browser default + var focusStyles = []; + focusStyles.push(allStyles[":focus"]); + focusStyles.push(allStyles[":focus-visible"]); + focusStyles.push(allStyles[":focus-within"]); + // if focus style is defined + var styleObj = focusStyles[0]; + if (Object.keys(styleObj).length > 0) { + //pass if outline is not defined at all, browser will override + if (((!normalStyles["outline-width"] && !normalStyles["outline-style"]) + || (normalStyles["outline-width"] === '0px' || normalStyles["outline-style"] === 'none')) + && (!styleObj["outline-style"] || styleObj["outline-style"] !== 'none')) + return (0, IRule_1.RulePass)("pass_focus_visible"); + var noneStyle = false; + var numOtherStyle = 0; + for (var focusStyle in styleObj) { + if (validateParams.checkParams.value.includes(focusStyle)) { + /** + * failure case: + * 1. focus outline or border style is none and no other style (color or width) defined + * 2. focus outline or border style is same with the normal + * 3. size in focus is same or smaller than default + * 4. color contrast in focus is better + */ + var focusStyleValue = styleObj[focusStyle]; + var normalStyleValue = normalStyles[focusStyle]; + if (focusStyle.includes("style")) { + if (focusStyleValue === "none") + noneStyle = true; + else + noneStyle = false; + if (normalStyleValue && focusStyleValue !== "none" && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("width")) { + numOtherStyle++; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thin') + focusStyleValue = '1px'; + else if (focusStyleValue === 'medium') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thick') + focusStyleValue = '3px'; + if (normalStyleValue) { + if (normalStyleValue === 'initial') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thin') + normalStyleValue = '1px'; + else if (normalStyleValue === 'medium') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thick') + normalStyleValue = '3px'; + } + focusStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(focusStyleValue, ruleContext); + normalStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(normalStyleValue, ruleContext); + if (focusStyleValue == 0 || focusStyleValue <= normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("color")) { + numOtherStyle++; + // get the element bg color + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(ruleContext); + if (colorCombo === null) + continue; + var bg = colorCombo.bg; + if (!bg) + continue; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = 'black'; + if (normalStyleValue && normalStyleValue === 'initial') + normalStyleValue = 'black'; + // get the border/outline color as fg colors + focusStyleValue = ColorUtil_1.ColorUtil.Color(focusStyleValue); + normalStyleValue = ColorUtil_1.ColorUtil.Color(normalStyleValue); + if (focusStyleValue === null || normalStyleValue === null) + continue; + //get the border/outline color contrast ratios + var focusRatio = focusStyleValue.contrastRatio(bg); + var normalRatio = normalStyleValue.contrastRatio(bg); + if (focusRatio < 3.0 || focusRatio <= normalRatio) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + //other + numOtherStyle++; + if (normalStyleValue != null && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + // warn if a border/outline focus style is 'none' and noe other (color and/or width) is defined + if (noneStyle && numOtherStyle === 0) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + // no focus style defined + // warn if normal style is defined and is not "none" + for (var normalStyle in normalStyles) { + if (validateParams.checkParams.value.includes(normalStyle)) { + var normalStyleValue = normalStyles[normalStyle]; + // ignore if border or outline style is "none" + if (normalStyleValue !== 'none') + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + return (0, IRule_1.RulePass)("pass_focus_visible"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_highcontrast_visible.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/style_highcontrast_visible.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_highcontrast_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_highcontrast_visible = { + id: "style_highcontrast_visible", + context: "dom:style, dom:link, dom:*[style]", + refactor: { + "RPT_Style_Trigger2": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_highcontrast_visible.html", + "Manual_1": "style_highcontrast_visible.html", + "group": "style_highcontrast_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content", + "group": "Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "link" && + (!ruleContext.hasAttribute("rel") || ruleContext.getAttribute("rel").toLowerCase() !== "stylesheet")) + return (0, IRule_1.RulePass)("Pass_0"); + if (nodeName !== "style" && nodeName !== "link" && + ruleContext.hasAttribute("style") && ruleContext.getAttribute("style").trim().length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_highcontrast_visible", false); + var passed = triggered; + // Packages.java.lang.System.out.println(triggered); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_highcontrast_visible", true); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_hover_persistent.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/style_hover_persistent.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_hover_persistent = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_hover_persistent = { + id: "style_hover_persistent", + context: "dom:style, dom:*[style], dom:*", + help: { + "en-US": { + "Pass_0": "style_hover_persistent.html", + // "Pass_1": "style_hover_persistent.html", + "Pass_2": "style_hover_persistent.html", + "Potential_1": "style_hover_persistent.html", + "Potential_2": "style_hover_persistent.html", + "Potential_3": "style_hover_persistent.html", + "group": "style_hover_persistent.html" + } + }, + messages: { + "en-US": { + "Pass_0": "the hover: pseudo-class is not used to display content", + // "Pass_1": "content displayed via the :hover pseudo-class is a direct child of the trigger element", + "Pass_2": "content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element", + "Potential_1": "Confirm the pointer can be positioned over the displayed element, not just the trigger", + "Potential_2": "Confirm the pointer can be positioned over all the information displayed on hover", + "Potential_3": "Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger", + "group": "The pointer should be able to move over content displayed on hover" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["1.4.13"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var pass0 = false; + var pass1 = false; + var pass2 = false; // never happen + var potential1 = false; + var potential2 = false; + var potential3 = false; + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + // console.log("RULE RUN ******************"); + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + // console.log("ruleContext.ownerDocument.styleSheets.length = "+ruleContext.ownerDocument.styleSheets.length); + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; ++sIndex) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules.length = "+styleRules.length); + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + // console.log("**********"); + // console.log("********** FOR LOOP styleRuleIndex = "+styleRuleIndex); + var foundHover = false; + var hoverElement = ""; + var plusCombinator = false; + var tildeCombinator = false; + var afterCombinatorElement = ""; + var afterCombinatorElementDisplay = false; + var afterCombinatorElementDisplayValue = false; + var afterCombinatorElementHover = false; + var supportingElement = false; + var supportingHover = false; + var supportingHoverElementDisplayProperty = false; + var supportingHoverElementDisplayValue = false; + var adjacentPlusSibling = false; + var adjacentTildeMultipleSibling = false; + var styleRule = styleRules[styleRuleIndex]; + var ruleText = styleRules[styleRuleIndex].cssText; + // console.log("styleRules["+styleRuleIndex+"] = "+ruleText); + // 1. Check for :hover + if (ruleText.match(/:hover/g)) { + foundHover = true; + // console.log("1. found :hover = "+ foundHover); + // 2. Get hover element + hoverElement = ruleText.split(":")[0]; + // console.log("2. found element that goes with :hover = "+hoverElement); + } + else { + // console.log("1. No hover on css element so skip this rule"); + continue; // if no :hover skip this rule + } + // 3a. Check for css combinator + + // 4a. if so do we have an after combinator element + var plusTempStr = ruleText.substring(ruleText.indexOf("+") + 1); + plusTempStr = plusTempStr.trim(); + if (ruleText.match(/:hover \+/g) || ruleText.match(/:hover\+/g)) { + plusCombinator = true; + // console.log("3a. Found plusCombinator = "+ plusCombinator); + afterCombinatorElement = plusTempStr.split(" ")[0]; + // console.log("4a. Found plus afterCombinatorElement = "+afterCombinatorElement); + } + // 3b. Check for css combinator + + // 4b. if so do we have an after combinator element + if (ruleText.match(/:hover \~/g) || ruleText.match(/:hover\~/g)) { + // console.log("match = "+ruleText.match(":hover \~")); + tildeCombinator = true; + // console.log("3b. Found tildeCombinator = "+ tildeCombinator); + var plusTempStr_1 = ruleText.substring(ruleText.indexOf("~") + 1); + plusTempStr_1 = plusTempStr_1.trim(); + afterCombinatorElement = plusTempStr_1.split(" ")[0]; + // console.log("4b. Found tilde afterCombinatorElement = "+afterCombinatorElement); + } + if (!plusCombinator && !tildeCombinator) { + // NO plusCombinator or tildeCombinator so skip this rule + // console.log("NO plusCombinator or tildeCombinator so PASS"); + // console.log("**** REPORT PASS 0 HERE"); + return (0, IRule_1.RulePass)("Pass_0"); // JCH: should we have a N/A pass + } + // So now we have a css element with hover - element:hover so we have problems + // to check + // 5. Check if the after combinator element has display: property + // 6. Check if display property is not none + if (afterCombinatorElement) { + // get index of display: + // console.log("plusTempStr = "+plusTempStr); + var index = plusTempStr.indexOf("display:"); + if (index) { + afterCombinatorElementDisplay = true; + // console.log("5. Found afterCombinatorElementDisplay = "+afterCombinatorElementDisplay); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + afterCombinatorElementDisplayValue = true; + // console.log("6. Found afterCombinatorElementDisplayValue not none = "+afterCombinatorElementDisplayValue); + } + else { + // console.log("afterCombinatorElementDisplayValue === none"); + // console.log("**** PUT POTENTIAL 0 HERE"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElementDisplay so skip this rule"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElement so skip this rule"); + continue; + } + if (afterCombinatorElementDisplayValue) + if (sheet && sheet.ownerNode === ruleContext) { + // console.log("**** At this point we have verified that we have a css element with a hover of the format span:hover + div { display: block; } with all the proper properties and values"); + // NOTE: At this point we have verified that we have a css element with a hover + // of the format span:hover + div { display: block; } + // with all the proper properties and values + try { + var styleRules2 = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules2.length = "+styleRules2.length); + for (var styleRuleIndex2 = 0; styleRuleIndex2 < styleRules2.length; styleRuleIndex2++) { + // Check rule for afterCominatorElement:hover + // If find afterCombinatorElement:hover see if rule has property display: value where + // value != none + // console.log("**********"); + // console.log("********** 2nd FOR styleRuleIndex2 = "+styleRuleIndex2); + var ruleText2 = styleRules[styleRuleIndex2].cssText; + // console.log("ruleText2 = ", ruleText2); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // Check all supporting elements for margin property + // If find margin STOP and REPORT ERROR + var regExString = afterCombinatorElement + " {"; + var trimRuleText2 = ruleText2.trim(); + var regIndex = trimRuleText2.indexOf(regExString); + var afterCombinatorElementProperties = trimRuleText2.slice(regIndex).trim(); + //if (!afterCombinatorElementProperties.match(/margin/g)) { + if (!trimRuleText2.match(/margin/g)) { + // console.log("No margin problem so continue on..."); + // do we have a supporting element css definitions + var supportingHoverElement = ruleText2.split(":")[0]; + supportingHoverElement = supportingHoverElement.split(" ")[0]; + // console.log("supportingHoverElement = "+supportingHoverElement); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // NEED TO CHECK FOR afterCominatorElement:hover in ONE STEP + if (supportingHoverElement === afterCombinatorElement && ruleText2.match(/:hover/g)) { + // console.log("7. Found supporting hover element same as afterCombinatorElement") + // 7. Found supporting hover element same as afterCombinatorElement + supportingElement = true; + // does supporting element have hover + // console.log("8. Supporting element has hover also = "+ foundHover); + // 8. Supporting element has hover also + supportingHover = true; + var index = ruleText2.indexOf("display:"); + // console.log("index = "+index); + if (index) { + // 9. Found supportingHoverElementDisplayProperty + supportingHoverElementDisplayProperty = true; + // console.log("9. Found supportingHoverElementDisplayProperty = "+supportingHoverElementDisplayProperty); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + // 10. Found supportingHoverElementDisplayValue not none + supportingHoverElementDisplayValue = true; + // console.log("10. Found supportingHoverElementDisplayValue not none = "+supportingHoverElementDisplayValue); + // Get list of hover elements and next sibling for + + // For + there must be at least one ADJACENT sibling + if (hoverElement !== "" && plusCombinator) { + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // console.log("hoverElementList[0].tagName = "+hoverElementList[0].tagName); + // Get adjacent sibling + // console.log("Adjacent sibling = "+hoverElementList[0].nextElementSibling.tagName); + // console.log("afterCombinatorElement.toUpperCase() = "+afterCombinatorElement.toUpperCase()); + if (afterCombinatorElement.toUpperCase() === hoverElementList[0].nextElementSibling.tagName) { + // console.log("11a. Hover with plus has adjacent sibling.") + // 11a. Hover with plus has adjacent sibling. + adjacentPlusSibling = true; + // At this point we have verified a supporting afterCombinatorElement css rule that contains hover and display property that is not equal to none and has a hover element in the body with an adjacent sibling + // console.log("**** REPORT PASS 1 HERE"); + pass0 = true; + continue; + } + } + else if (plusCombinator) { + // console.log("11a. Main hover with + combinator has no adjacent sibling"); + if (!potential1) { + // console.log("**** PUT POTENTIAL 1 HERE"); + potential1 = true; + break; + } + continue; + } + // Get list of hover elements and determine if there are 2 or more adjacent siblings for ~ + // For ~ there must be at least one ADJACENT sibling + if (hoverElement !== "" && tildeCombinator) { + // console.log("hoverElement.toUpperCase() = "+hoverElement.toUpperCase()); + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // Check for two or more adjacent siblings + var siblings = []; + var sibling = hoverElementList[0].nextElementSibling; + do { + // console.log("sibling.tagName = "+sibling.tagName); + if (sibling.tagName === afterCombinatorElement.toUpperCase()) { + siblings.push(sibling); + } + else { + break; + } + } while ((sibling = sibling.nextElementSibling)); + var siblingCount = siblings.length; + // console.log("siblingCount = "+siblingCount); + // JCH TODO: what if sibling count 0 + if (siblingCount === 1) { + // console.log("11b. Hover with tilde and one adjacent sibling"); + adjacentTildeMultipleSibling = true; + // console.log("**** REPORT PASS 2 HERE"); + return (0, IRule_1.RulePass)("Pass_2"); + } + else if (siblingCount > 1) { + // console.log("Main hover with ~ combinator has two or more siblings"); + if (!potential2) { + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + } + } + else if (plusCombinator) { + // supportingHoverElementDisplayValue + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a display property + } + else if (plusCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO tilde supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a supportingElement:hover + } + else if (plusCombinator) { + // if we make it to the last rule and supportingElement is still false => potential1 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO plus supportingElement:hover"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingElement is still false => potential2 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO tilde supportingElement:hover"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + continue; + } + } + } + else { + // console.log("There is a margin in the supporting element"); + if (!potential3) { + // console.log("**** PUT POTENTIAL 3 HERE"); + potential3 = true; + return (0, IRule_1.RulePotential)("Potential_3"); + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + // console.log("----------------------"); + // console.log("pass0 = "+pass0); + // console.log("pass1 = "+pass1); + // console.log("pass2 = "+pass2); + // console.log("potential1 = "+potential1); + // console.log("potential2 = "+potential2); + // console.log("potential3 = "+potential3); + if (pass0) + return (0, IRule_1.RulePass)("Pass_0"); + // if (pass1) return RulePass("Pass_2"); // Doesn't trigger + // if (pass2) return RulePass("Pass_3"); // Doesn't trigger + if (potential1) + return (0, IRule_1.RulePotential)("Potential_1"); + if (potential2) + return (0, IRule_1.RulePotential)("Potential_2"); + if (potential3) + return (0, IRule_1.RulePotential)("Potential_3"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_viewport_resizable.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/style_viewport_resizable.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_viewport_resizable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +/** + * Description: Trigger when viewport units are used for font size. + * Origin: Various + */ +exports.style_viewport_resizable = { + id: "style_viewport_resizable", + context: "dom:link, dom:style, dom:*[style]", + refactor: { + "WCAG21_Style_Viewport": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_viewport_resizable.html", + "Pass_0": "style_viewport_resizable.html", + "Potential_1": "style_viewport_resizable.html" + } + }, + messages: { + "en-US": { + "group": "Text must scale up to 200% without loss of content or functionality", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that text sized using viewport units can be resized up to 200%" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.4.4", "1.4.10"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var thePattern = /\d+(vw|vh|vmin|vmax)/gi; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "style") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var rule = styleRules[styleRuleIndex]; + if (rule.type && rule.type === 1 /* CSSRule.STYLE_RULE */) { + var styleRule = rule; + if (styleRule.style['fontSize']) { + var fontSize = styleRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + // check import rules + else if (rule.type && rule.type === 3 /* CSSRule.IMPORT_RULE */ && rule.styleSheet) { + var importRule = rule; + var rules = importRule.styleSheet.cssRules ? importRule.styleSheet.cssRules : importRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + if (importedRule.type && importedRule.type === 1 /* CSSRule.STYLE_RULE */) { + if (importedRule.style['fontSize']) { + var fontSize = importedRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else if (nodeName === "link") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check rules + if (ruleFromLink.type && ruleFromLink.type === 1 /* CSSRule.STYLE_RULE */) { + if (ruleFromLink.style['fontSize']) { + var fontSize = ruleFromLink.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else { + var styleValue = ruleContext.getAttribute('style'); + if (styleValue) { + var stylePattern = /font-size:\s*\d+(vw|vh|vmin|vmax)/gi; + var found = styleValue.match(stylePattern); + if (found) { + passed = false; + } + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/svg_graphics_labelled.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/svg_graphics_labelled.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.svg_graphics_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.svg_graphics_labelled = { + id: "svg_graphics_labelled", + context: "dom:svg", + help: { + "en-US": { + "group": "svg_graphics_labelled.html", + "pass": "svg_graphics_labelled.html", + "fail_acc_name": "svg_graphics_labelled.html" + } + }, + messages: { + "en-US": { + "group": "A non-decorative SVG element must have an accessible name", + "pass": "The SVG element has an accessible name", + "fail_acc_name": "The SVG element has no accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "7d6734": { + "pass": "pass", + "fail_acc_name": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_acc_name"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_aria_descendants.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/table_aria_descendants.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_aria_descendants = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_aria_descendants = { + id: "table_aria_descendants", + context: "aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]", + help: { + "en-US": { + "group": "table_aria_descendants.html", + "explicit_role": "table_aria_descendants.html" + } + }, + messages: { + "en-US": { + "group": "Table structure elements cannot specify an explicit 'role' within table containers", + "explicit_role": "An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + // cache the result + if (parentRole === null || parentRole.length === 0) + return; + // ignore the redundancy cases: reported in the aria_role_redundant rule + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + var explicitRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + ; + if (implicitRoles && implicitRoles.length > 0 && explicitRoles && explicitRoles.length > 0 + && explicitRoles.some(function (item) { return implicitRoles.includes(item); })) + return; + return (0, IRule_1.RuleFail)("explicit_role", [context["dom"].node.nodeName.toLowerCase(), parentRole[0].role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_caption_empty.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/table_caption_empty.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_empty = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_empty = { + id: "table_caption_empty", + context: "dom:caption", + refactor: { + "Valerie_Caption_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_empty.html", + "Fail_1": "table_caption_empty.html", + "group": "table_caption_empty.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <table> element has an empty <caption> element", + "group": "A <caption> element for a <table> element must contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_caption_nested.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/table_caption_nested.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_nested = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_nested = { + id: "table_caption_nested", + context: "dom:caption", + refactor: { + "Valerie_Caption_InTable": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_nested.html", + "Fail_1": "table_caption_nested.html", + "group": "table_caption_nested.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<caption> element is not nested inside a <table> element", + "group": "The <caption> element must be nested inside the associated <table> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table") != null; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/table_headers_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_exists = { + id: "table_headers_exists", + context: "dom:table", + refactor: { + "RPT_Table_DataHeadingsAria": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_exists.html", + "Fail_1": "table_headers_exists.html", + "group": "table_headers_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Table has no headers identified", + "group": "Data table must identify headers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If this is a layout table or there are no rows, the rule does not apply. + var rows = ruleContext.rows; + if (!TableUtil_1.TableUtil.isDataTable(ruleContext) || rows === null || rows.length === 0) + return null; + var passed = TableUtil_1.TableUtil.tableHeaderExists(ruleContext); + if (passed === null) + return; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_ref_valid.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_headers_ref_valid.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +exports.table_headers_ref_valid = { + id: "table_headers_ref_valid", + context: "dom:td[headers], dom:th[headers]", + help: { + "en-US": { + "Pass_0": "table_headers_ref_valid.html", + "Fail_1": "table_headers_ref_valid.html", + "Fail_2": "table_headers_ref_valid.html", + "Fail_3": "table_headers_ref_valid.html", + "Fail_4": "table_headers_ref_valid.html", + "group": "table_headers_ref_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document", + "Fail_2": "The 'headers' attribute value \"{0}\" refers to itself", + "Fail_3": "The 'headers' attribute value \"{0}\" does not refer to a cell in the same table", + "Fail_4": "The 'headers' attribute value \"{0}\" does not refer to a cell indicated with <th> or a role of \"columnheader\" or \"rowheader\"", + "group": "The 'headers' attribute should refer to a valid cell in the same table" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ["a25f45"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + var parentRole = ARIAMapper_1.ARIAMapper.nodeToRole(parentTable); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !VisUtil_1.VisUtil.isNodeVisible(parentTable) || !["table", "grid"].includes(parentRole)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var doc = ruleContext.ownerDocument; + var value = ruleContext.getAttribute("headers"); + if (!value) + return null; + var ids = value.split(" "); + var invalidHeaderValues = []; + var sameNodeHeaderValues = []; + var sameTableHeaderValues = []; + var invalidElemHeaderValues = []; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + if (id.trim() === '') + continue; + var elem = doc.getElementById(id); + if (!elem) + invalidHeaderValues.push(id); + else if (DOMUtil_1.DOMUtil.sameNode(elem, ruleContext)) + sameNodeHeaderValues.push(id); + else if (!DOMUtil_1.DOMUtil.isInSameTable(elem, ruleContext)) + sameTableHeaderValues.push(id); + else { + var elemName = elem.nodeName.toLowerCase(); + if (elemName !== 'th') { + var roles = AriaUtil_1.AriaUtil.getRoles(elem, true); + if (!roles.includes('columnheader') && !roles.includes('rowheader')) + invalidElemHeaderValues.push(id); + } + } + } + var results = []; + if (invalidHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_1", [invalidHeaderValues.toString()])); + if (sameNodeHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_2", [sameNodeHeaderValues.toString()])); + if (sameTableHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_3", [sameTableHeaderValues.toString()])); + if (invalidElemHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_4", [invalidElemHeaderValues.toString()])); + if (results.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return results; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_related.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/table_headers_related.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_related = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_related = { + id: "table_headers_related", + context: "dom:td, dom:th", + refactor: { + "Valerie_Table_DataCellRelationships": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_related.html", + "Fail_1": "table_headers_related.html", + "group": "table_headers_related.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Complex table does not have headers for each cell properly defined with 'header' or 'scope'", + "group": "For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !TableUtil_1.TableUtil.isComplexDataTable(parentTable)) + return null; + // If this table hasn't been preprocessed, process it. + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null) === null) { + // Build a grid that's actually usable (rowspan and colspan elements are duplicated) + // This builds a real 2d table array. + var grid = []; + for (var i = 0; i < parentTable.rows.length; ++i) { + var row = parentTable.rows[i]; + if (!grid[i]) + grid[i] = []; + for (var j = 0; j < row.cells.length; ++j) { + var cell = row.cells[j]; + CacheUtil_1.CacheUtil.setCache(cell, "table_headers_related", i + ":" + j); + var width = parseInt(cell.getAttribute("colspan")); + if (!width) + width = 1; + var height = parseInt(cell.getAttribute("rowspan")); + if (!height) + height = 1; + var gX = 0; + while (grid[i][gX]) + gX += 1; + for (var k = 0; k < height; ++k) { + if (!grid[i + k]) + grid[i + k] = []; + for (var l = 0; l < width; ++l) { + grid[i + k][gX + l] = cell; + } + } + } + } + // Iterate through the table grid and record headers that point to cells and + // cells that are pointed to by headers + var doc = ruleContext.ownerDocument; + var lookup = {}; + var scopedCols = {}; + for (var i = 0; i < grid.length; ++i) { + var rowScoped = false; + for (var j = 0; j < grid[i].length; ++j) { + var gridCell = grid[i][j]; + var gridNodeName = gridCell.nodeName.toLowerCase(); + if (gridNodeName == "th") { + if (gridCell.getAttribute("scope") == "row") { + rowScoped = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "rowgroup") { + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "col") { + scopedCols[j] = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + // Headers can refer to other headers + if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + else if (gridNodeName == "td") { + if (rowScoped || scopedCols[j]) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + } + } + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related", lookup); + } + var rcInfo = CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null); + var tInfo = CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related", null); + var passed = rcInfo && tInfo && rcInfo in tInfo; + if (!passed && rcInfo === "0:0" && + CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim().length == 0) { + // We don't test if it's the upper-left cell and it's empty + return null; + } + // If the table has no th's, it may just be that this was supposed to be a layout + // table, which introduces a lot of noise. In that case, only trigger this error + // once per table. + if (!passed && parentTable.getElementsByTagName("th").length == 0) { + if (CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related_TrigOnce", false) === true) { + passed = true; + } + else { + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related_TrigOnce", true); + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_layout_linearized.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_layout_linearized.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_layout_linearized = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_layout_linearized = { + id: "table_layout_linearized", + context: "dom:table", + refactor: { + "RPT_Table_LayoutTrigger": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_layout_linearized.html", + "Potential_1": "table_layout_linearized.html", + "group": "table_layout_linearized.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify table is not being used to format text content in columns unless the table can be linearized", + "group": "Avoid using tables to format text documents in columns unless the table can be linearized" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = !TableUtil_1.TableUtil.isLayoutTable(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_scope_valid.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/table_scope_valid.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_scope_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.table_scope_valid = { + id: "table_scope_valid", + context: "dom:td[scope], dom:th[scope]", + refactor: { + "WCAG20_Table_Scope_Valid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "table_scope_valid.html", + "Fail_1": "table_scope_valid.html", + "Fail_2": "table_scope_valid.html", + "group": "table_scope_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Value provided is invalid for the 'scope' attribute", + "Fail_2": "The 'scope' attribute should only be used on a <th> element", + "group": "Value for 'scope' attribute must be \"row\", \"col\", \"rowgroup\", or \"colgroup\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === 'td') + return (0, IRule_1.RuleFail)("Fail_2"); + //only continue for 'th' + var scopeVal = ruleContext.getAttribute("scope").trim().toLowerCase(); + var passed = /^(row|col|rowgroup|colgroup)$/.test(scopeVal); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_structure_misuse.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/table_structure_misuse.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_structure_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_structure_misuse = { + id: "table_structure_misuse", + context: "dom:table", + refactor: { + "WCAG20_Table_Structure": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_structure_misuse.html", + "Fail_1": "table_structure_misuse.html", + "group": "table_structure_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with \"presentation\" role or \"none\" role has structural element(s) and/or attribute(s) '{1}'", + "group": "Table elements with 'role=\"presentation\" or 'role=\"none\" should not have structural elements or attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - OUT OF SCOPE hidden in context + if (TableUtil_1.TableUtil.isDataTable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.isNodeInGrid(ruleContext)) + return null; + var errorNodes = []; + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "summary")) + errorNodes.push(ruleContext); + var captionElems = ruleContext.getElementsByTagName("caption"); + for (var i = 0; i < captionElems.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(captionElems[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(captionElems[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(captionElems[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var thNodes = ruleContext.getElementsByTagName("th"); + for (var i = 0; i < thNodes.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(thNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(thNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(thNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var tdNodes = ruleContext.getElementsByTagName("td"); + for (var i = 0; i < tdNodes.length; ++i) { + if ((tdNodes[i].hasAttribute("scope") || tdNodes[i].hasAttribute("headers")) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(tdNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(tdNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + // Get the node name for the rule context element in this case it will always be table + var currentElementToken = ruleContext.nodeName.toLowerCase(); + // Construct a new array which will contan only the element tag for the violation elements + var structuralElementTokens = new Array(); + // Construct a seen hash that will keep trask of all the elements that were already added to the token array, to make sure + // we do not duplicate any of the elements. Duplicate element tags in the token message looks bad and confusing. + var seen = {}; + // Loop through all the violating structural elements and extract the element tag to be used as a token + for (var i = 0; i < errorNodes.length; i++) { + // Get the node name (tag name) for the violating structural element + var nodeName = errorNodes[i].nodeName.toLowerCase(); + // Only need to add the violating element once + if (!seen.hasOwnProperty(nodeName)) { + // Since we are adding the token as elements and attributes we need to handle + // the summary attribute on the ruleContext (table). We only add summary once, same as + // for elements to avoid duplication in the message. (Summary should not duplicate, but just in case) + if (nodeName == "table" && !seen.hasOwnProperty["summary"]) { + // Mark this as a new attribute + seen["summary"] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push("summary"); + } + else { + // Mark this as a new element + seen[nodeName] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push(nodeName); + } + } + } + // We need to take the array of structural elements and join them with a comma and a space to make grammatical correct in + // the message. + var structuralElementTokensStr = structuralElementTokens.join(", "); + //return new ValidationResult(errorNodes.length == 0, errorNodes, '', '', [currentElementToken, structuralElementTokens]); + if (errorNodes.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [currentElementToken, structuralElementTokensStr]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_summary_redundant.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_summary_redundant.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_summary_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.table_summary_redundant = { + id: "table_summary_redundant", + context: "dom:table", + refactor: { + "WCAG20_Table_CapSummRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_summary_redundant.html", + "Fail_1": "table_summary_redundant.html", + "group": "table_summary_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The table summary duplicates the caption", + "group": "The table summary must not duplicate the caption" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pofId; + var passed = true; + var sumStr; + if (ruleContext.hasAttribute("summary")) { + pofId = 0; + sumStr = ruleContext.getAttribute("summary").trim().toLowerCase(); + } + else if (ruleContext.hasAttribute("aria-describedby")) { + pofId = 1; + var summaryNodeIds = ruleContext.getAttribute("aria-describedby").split(" "); + var summaryNodeConcat = ""; + for (var i = 0; i < summaryNodeIds.length; i++) { + var summaryNodeId = summaryNodeIds[i]; + if (summaryNodeId) { + var summaryNode = fragment_1.FragmentUtil.getById(ruleContext, summaryNodeId); + if (summaryNode && !DOMUtil_1.DOMUtil.sameNode(summaryNode, ruleContext)) { + summaryNodeConcat += " " + CommonUtil_1.CommonUtil.getInnerText(summaryNode).trim().toLowerCase(); + } + } + } + sumStr = summaryNodeConcat; + } + if (!sumStr) { + return null; + } + else { + var capElems = ruleContext.getElementsByTagName("caption"); + if (capElems.length === 0) { + return null; + } + else if (sumStr.length > 0) { + var capStr = CommonUtil_1.CommonUtil.getInnerText(capElems[0]).trim().toLowerCase(); + if (!sumStr.includes(capStr)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/target_spacing_sufficient.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/target_spacing_sufficient.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.target_spacing_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.target_spacing_sufficient = { + id: "target_spacing_sufficient", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "target_spacing_sufficient.html", + "pass_spacing": "target_spacing_sufficient.html", + "pass_sized": "target_spacing_sufficient.html", + "pass_inline": "target_spacing_sufficient.html", + "pass_default": "target_spacing_sufficient.html", + "violation_spacing": "target_spacing_sufficient.html", + "recommendation_inline": "target_spacing_sufficient.html", + "potential_overlap": "target_spacing_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The target must be sufficiently sized or spaced from other targets", + "pass_spacing": "The target's spacing from other targets is sufficient", + "pass_sized": "The target’s size is more than 24 CSS pixels", + "pass_inline": "The target is in a sentence or its size is otherwise constrained by the line-height of non-target text", + "pass_default": "The target's size is determined by the user agent and is not modified by the author", + "violation_spacing": "Undersized target \"{0}\" does not have sufficient spacing of 12 CSS pixels from another target \"{1}\"", + "recommendation_inline": "Confirm the inline target \"{0}\" is sufficiently spaced from another inline target \"{1}\"", + "potential_overlap": "Ensure the overlapped target \"{0}\" meets a minimum target size or has sufficient spacing from the overlapping target \"{1}\"" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["pass_spacing", "pass_sized", "pass_inline", "pass_default", "violation_spacing", "potential_overlap"] + }, + { + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["recommendation_inline"] + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); //context["dom"].bounds; + if (!bounds) + return null; + // ignore hidden, non-target + if (!CommonUtil_1.CommonUtil.isTarget(ruleContext)) + return null; + if (bounds.height >= 24 && bounds.width >= 24) + return (0, IRule_1.RulePass)("pass_sized"); + // check inline element: without text in the same line + var status = CSSUtil_1.CSSUtil.getInlineStatus(ruleContext); + if (status === null) + return null; + if (status.inline) { + if (status.text) { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_inline"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + else { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_default"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + } + else { + // ignore browser default + if (CSSUtil_1.CSSUtil.isTargetBrowserDefault(ruleContext)) + return (0, IRule_1.RulePass)("pass_default"); + } + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var cStyle = getComputedStyle(ruleContext); + if (cStyle === null) + return null; + var zindex = cStyle.zIndex; + if (!zindex || isNaN(Number(zindex))) + zindex = "0"; + // Get the list of target elements + var targetElems = CacheUtil_1.CacheUtil.getCache(doc.documentElement, "target_spacing_sufficient::targets", undefined); + if (typeof targetElems === "undefined") { + targetElems = []; + //select all elements except itself and descendants + var elems = doc.querySelectorAll('body *:not(script):not(style)'); + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + if (CommonUtil_1.CommonUtil.isTarget(elem)) { + targetElems.push(elem); + } + } + CacheUtil_1.CacheUtil.setCache(doc.documentElement, "target_spacing_sufficient::targets", targetElems); + } + if (!targetElems || targetElems.length === 0) + return; + var before = true; + var minX = 24; + var minY = 24; + var adjacentX = null; + var adjacentY = null; + var checked = []; //contains a list of elements that have been checked so their descendants don't need to be checked again + var _loop_1 = function (i) { + var elem = targetElems[i]; + /** + * the nodes returned from querySelectorAll is in document order + * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later + * filter out the elements that’re descendant or ancestors of the target element, nor descendant of the target element's siblings + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + //the next node in elems will be after the target node (ruleContext). + before = false; + return "continue"; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // ignore ascendants of the element, or itself or its ascendant already checked + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || checked.some(function (item) { return item.contains(elem); })) + return "continue"; + var bnds = mapper.getUnadjustedBounds(elem); + if (!bnds) + return "continue"; + var zStyle = getComputedStyle(elem); + var z_index = '0'; + if (zStyle) { + z_index = zStyle.zIndex; + if (!z_index || isNaN(Number(z_index))) + z_index = "0"; + } + // case 2: the element overlaps the target entirely + // note when a link is inline with other target, if the link text wraps in another line in a given viewport, + // the bounds of the link may cover and the entire two lines, causing the other tagets to be overlapped, see two links in the test case: element_inline.html + if (bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height + && bnds.left + bnds.width >= bounds.left + bounds.width) { + // if the target on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: null }; + } + else + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 3: if the target overlaps the element entirely + if (bounds.top <= bnds.top && bounds.left <= bnds.left && bounds.top + bounds.height >= bnds.top + bnds.height + && bounds.left + bounds.width >= bnds.left + bnds.width) { + // if the element on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else // the target on top + return { value: (0, IRule_1.RuleFail)("violation_spacing", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 4: the element overlaps partially with the target + if ((((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top + bounds.height <= bnds.top && bounds.top + bounds.height >= bnds.top + bnds.height)) + && ((bounds.left > bnds.left && bounds.left < bnds.left + bnds.width) || (bnds.left > bounds.left && bnds.left < bounds.left + bounds.width))) + || (((bounds.top > bnds.top && bounds.top < bnds.top + bnds.height) || (bnds.top > bounds.top && bnds.top < bounds.top + bounds.height)) + && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left + bounds.width >= bnds.left && bounds.left + bounds.width <= bnds.left + bnds.width)))) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else { // no overlap with the elem, though may overlap withe other elements + var disX = 24; + var disY = 24; + // the element is in the horizontally same row with the target + if (bounds.width < 24 && ((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top <= bnds.top && bounds.top + bounds.height > bnds.top))) + disX = Math.min(Math.abs(bounds.left - bnds.left), Math.abs(bounds.left - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - bnds.left)); + // the element is in the vertically same column with the target + if (bounds.height < 24 && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left <= bnds.left && bounds.left + bounds.width > bnds.left))) + disY = Math.min(Math.abs(bounds.top - bnds.top), Math.abs(bounds.top - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - bnds.top)); + if (disX < minX) { + minX = disX; + adjacentX = elem; + } + if (disY < minY) { + minY = disY; + adjacentY = elem; + } + } + checked.push(elem); + }; + for (var i = 0; i < targetElems.length; i++) { + var state_1 = _loop_1(i); + if (typeof state_1 === "object") + return state_1.value; + } + // case 5: no overlap + insufficient target size. check spacing + if (Math.round(bounds.width / 2) + minX < 12 || Math.round(bounds.height / 2) + minY < 12) { + if (Math.round(bounds.width / 2) + minX < Math.round(bounds.height / 2) + minY) + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentX.nodeName.toLowerCase()]); + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentY.nodeName.toLowerCase()]); + } + else + return (0, IRule_1.RulePass)("pass_spacing"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_block_heading.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/text_block_heading.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_block_heading = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_block_heading = { + id: "text_block_heading", + context: "dom:p, dom:div, dom:br", + refactor: { + "RPT_Block_ShouldBeHeading": { + // "Pass_0": "pass", + "Potential_1": "potential_heading" + } + }, + help: { + "en-US": { + // "pass": "text_block_heading.html", + "potential_heading": "text_block_heading.html", + "group": "text_block_heading.html" + } + }, + messages: { + "en-US": { + // "pass": "Heading text uses a heading element or role", + "potential_heading": "Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role", + "group": "Heading text should use a heading element or role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script"]) !== null) + return null; + var validateParams = { + numWords: { + value: 10, + type: "integer" + } + }; + var bodyFont = 0; + var body = ruleContext.ownerDocument.getElementsByTagName("body"); + if (body != null) { + var bodyStyle = getComputedStyle(body[0]); + if (bodyStyle) + bodyFont = CSSUtil_1.CSSUtil.getPixelsFromStyle(bodyStyle['font-size'], body); + } + var numWords = validateParams.numWords.value; + var wordsSeen = 0; + var wordStr = []; + var emphasizedText = false; + var nw = new DOMWalker_1.DOMWalker(ruleContext); + nw.nextNode(); + var passed = false; + while (!passed && + nw.nextNode() && + nw.node !== ruleContext && + nw.node !== DOMWalker_1.DOMWalker.parentNode(ruleContext) && + !["br", "div", "p"].includes(nw.node.nodeName.toLowerCase())) // Don't report twice + { + if (nw.node === ruleContext || CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) + continue; + var nwName = nw.node.nodeName.toLowerCase(); + if (nw.node.nodeType === 3) { + // for text child + if (nw.node.nodeValue.trim().length > 0 && nw.node.parentElement) { + // check it's style if the target element contains text, e.g., <p> fake heading</p> + var style = getComputedStyle(nw.node.parentElement); + if (style && (style['font-weight'] === 'bold' || style['font-weight'] >= 700 + || (style['font-size'] && style['font-size'].includes("large")) + || (style['font-size'] && bodyFont !== 0 && CSSUtil_1.CSSUtil.getPixelsFromStyle(style['font-size'], nw.node.parentElement) > bodyFont))) { + var nextStr = nw.node.nodeValue.trim(); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // the node contain regular text + passed = true; + } + } + } + else if (nw.node.nodeType === 1) { + // for element child + if (nwName === "b" || nwName === "strong" || nwName === "u" || nwName === "font") { + // if the target element contains emphasis child, e.g., <p><strong>fake heading</strong></p> + var nextStr = CommonUtil_1.CommonUtil.getInnerText(nw.node); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // ignore the element which has a role except 'generic', 'paragraph' or 'strong' + // ignore applet element that is deprecated anyway + var role = AriaUtil_1.AriaUtil.getResolvedRole(nw.node); + passed = (role !== null && role !== 'generic' && role !== 'paragraph' && role !== 'strong') || nwName === "applet"; + } + } + } + if (wordsSeen == 0) + passed = true; + //ignore if the string ends with “:” “,” “-” “;” or “.” + if (!passed) + passed = /[:,;\-\.]$/.test(wordStr.join(" ").trim()); + if (passed) { + return null; + } + else { + return (0, IRule_1.RulePotential)("potential_heading", [wordStr.join(" ")]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_contrast_sufficient.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/text_contrast_sufficient.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_contrast_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +exports.text_contrast_sufficient = { + id: "text_contrast_sufficient", + context: "dom:*", + refactor: { + "IBMA_Color_Contrast_WCAG2AA": { + "Pass_0": "pass", + "Fail_1": "fail_contrast", + "Potential_1": "potential_same_color" + }, + "IBMA_Color_Contrast_WCAG2AA_PV": { + "pass_0": "pass", + "potential_1": "potential_graphic_background" + } + }, + help: { + "en-US": { + "group": "text_contrast_sufficient.html", + "pass": "text_contrast_sufficient.html", + "fail_contrast": "text_contrast_sufficient.html", + "potential_same_color": "text_contrast_sufficient.html", + "potential_graphic_background": "text_contrast_sufficient.html", + "potential_text_shadow": "text_contrast_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The contrast ratio of text with its background must meet WCAG AA requirements", + "pass": "The contrast ratio of text with its background meets WCAG AA requirements", + "fail_contrast": "Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_same_color": "The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast", + "potential_graphic_background": "Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_text_shadow": "Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.3", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ['afw4f7'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + // avoid diagnosing elements that are not visible + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return null; + } + //TODO ? should only consider native disabled, ignore aria-disabled + //skip disabled element + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["svg", "script", "meta", "style"])) + return null; + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + // Ensure that this element has children with actual text. + var childStr = CommonUtil_1.CommonUtil.getNodeText(ruleContext); + if (!CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) || (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) && CommonUtil_1.CommonUtil.getNodeText(ruleContext.shadowRoot) === '')) { + if (childStr.trim().length == 0) + return null; + // ignore if the text does not convey anything in human language + /** + * (1) ignore non-alphanumeric or special characters in ASCI: ^(a-zA-Z\d\s) + * (2) ignore non-printable unicode characters: \u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF + * see https://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters + * (3) for now not consider unicode special characters that are different in different languages + */ + //let regex = /[^(a-zA-Z\d\s)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + var regex = /[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + childStr = childStr.trim().replace(regex, ''); + if (childStr.trim().length === 0) + return null; + } + var elem = ruleContext; + // the child elements (rather than shadow root) of a shadow host is either re-assigned to the shadow slot if the slot exists + // or not displayed, so shouldn't be checked from the light DOM, rather it should be checked as reassginged slot element(s) in the shadow DOM. + if (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext)) { + // if it's direct text of a shadow host + if (ruleContext.shadowRoot) { + for (var node = ruleContext.firstChild; node; node = node.nextSibling) { + if (node.nodeType == 3) { + //if multiple texts exist, only need to check one + elem = node.assignedSlot; + break; + } + } + } + if (elem === null) + return; + } + var style = win.getComputedStyle(elem); + // JCH clip INFO: + // The clip property lets you specify a rectangle to clip an absolutely positioned element. + // The rectangle specified as four coordinates, all from the top-left corner of the element to be clipped. + // Property values: + // none This is default. No clipping is done + // auto No clipping will be done + // shape The only valid value is: rect (top, right, bottom, left) + // e.g., clip: rect(10px, 20px, 30px, 40px); + // Note: the four values are in the same order as margin/padding + // The rect values are positive pixel values, e.g., 10px, etc. + // margin-box Uses the margin box as the reference box + // border-box Uses the border box as the reference box + // padding-box Uses the padding box as the reference box + // content-box + // fill-box + // stroke-box + // NOTE: the CSS clip property is deprecated + // Also: clip only works if the element is absolutely positioned and can only do rectangles + // check if element visible + var visible = true; + if (style.width !== "0" && + style.height !== "0" && + style.opacity !== "0" && + style.display !== 'none' && + style.visibility !== 'hidden' && + style.overflow !== 'hidden' && + // left and right work with all absolute units + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.left.replace(/[^0-9.+-]/, '')) > 0)) && + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.top.replace(/[^0-9.+-]/, '')) > 0))) { + visible = true; + // console.log("element IS visible"); + // console.log("CHECK COLOR CONTRAST unless to small"); + } + else { + visible = false; + // console.log("element NOT visible"); + } + if (visible === false) { + // console.log("DO NOT CHECK COLOR CONTRAST"); + return null; + } + var clipHeight = -1; + if (style.clip !== "auto") { + var clipString = style.clip.toString(); + if (clipString.includes("rect")) { + var reBrackets = /\((.*)\)/g; + var listOfText = []; + var found = reBrackets.exec(clipString); + var foundArr = found[1].split(', '); + for (var i = 0; i < foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + listOfText.push(foundArr[i]); + } + ; + } + // console.log("listOfText = ",listOfText); + clipHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + clipHeight = Math.abs(clipHeight); + } + // JCH clip-path INFO: + // Excellent article on clip-path: https://ishadeed.com/article/clip-path/ + // clip-path is a totally different animal with many, many different variations + // The goal was for it to not be as limited as clip + // The syntax is more complicated (as it does more) and it is different from clip, + // e.g., the above clip rectangle would be clip-path: inset(10px 20px 30px 40px); + // Note: there are no commas + // Also, it can take single values to make all sides the same, or 2 values (vert/hori). + // or 3 values (top/hori/bottom) + // And percentages can works as well as px + // + // Although there are five different shapes: inset (term used for rectangle), circle, + // ellipse, polygon, path - we will only concern ourselves with inset + // There are 7 box values: margin-box, border-box, padding-box, content-box, fill-box, stroke-box, view-box + // Box and shape values may be combined: clip-path: padding-box circle(50px at 0 100px); + // NOTE: the box values are NOT intuitive, see: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/From_box_values#margin-box + // + // So the key question is what amount of effort do we want to invest into clip-path + // + // JCH don't do clip-path now + var clipPathHeight = -1; + // if (style.clipPath !== "auto") { + // console.log("style.clipPath = ",style.clipPath); + // console.log("style.clipPath.toString = ",style.clipPath.toString()); + // let clipString = style.clipPath.toString(); + // if (clipString.includes("inset")) { + // var reBrackets = /\((.*)\)/g; + // var listOfText = []; + // var found = reBrackets.exec(clipString); + // var foundArr = found[1].split(' '); + // for (let i=0; i<foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + // listOfText.push(foundArr[i]); + // }; + // } + // console.log("listOfText = ",listOfText); + // clipPathHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + // clipPathHeight = Math.abs(clipHeight); + // } + // console.log("clipPathHeight = ", clipPathHeight); + // if (style.position === "absolute" && style.clip === "rect(0px, 0px, 0px, 0px)" && style.overflow !== "visible") { + // JCH arbitrarily use less that 7px for clipHeight + if (style.position === "absolute" && clipHeight < 7 && clipHeight !== -1) { + // console.log("DO NOT CHECK COLOR CONTRAST because too small"); + // Corner case where item is hidden (accessibility hiding technique) + return null; + } + // First determine the color contrast ratio + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(elem); + if (colorCombo === null) { + //some exception occurred, or not able to get color combo for some reason + console.log("unable to get color combo for element: " + elem.nodeName); + return; + } + var fg = colorCombo.fg; + var bg = colorCombo.bg; + var ratio = fg.contrastRatio(bg); + var weight = CSSUtil_1.CSSUtil.getWeightNumber(style.fontWeight); + var size = CSSUtil_1.CSSUtil.getFontInPixels(style.fontSize, elem); + var isLargeScale = size >= 24 || size >= 18.6 && weight >= 700; + if (CSSUtil_1.CSSUtil.containsCKJ(childStr)) { + // https://github.com/act-rules/act-rules.github.io/pull/2121/files + // for CJK, 22 pt or 18 pt with font-weight >= 700, 1pt = 1.333 px + isLargeScale = size >= 29.3 || size >= 24 && weight >= 700; + } + var passed = ratio >= 4.5 || (ratio >= 3 && isLargeScale); + var hasBackground = colorCombo.hasBGImage || colorCombo.hasGradient; + var textShadow = colorCombo.textShadow; + var isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(elem); + if (!isDisabled) { + var control = CommonUtil_1.CommonUtil.getControlOfLabel(elem); + if (control) { + isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(control); + } + } + if (!isDisabled && nodeName === 'label' && CommonUtil_1.CommonUtil.isDisabledByFirstChildFormElement(elem)) { + isDisabled = true; + } + if (!isDisabled && ruleContext.hasAttribute("id") && CommonUtil_1.CommonUtil.isDisabledByReferringElement(elem)) { + isDisabled = true; + } + /**setCache(ruleContext, "EXT_Color_Contrast_WCAG2AA", { + "ratio": ratio, + "isLargeScale": isLargeScale, + "weight": weight, + "size": size, + "hasBackground": hasBackground, + "isDisabled": isDisabled + });*/ + // If element or parent is disabled, this rule does not apply (but may be 3:1 in future) + if (!passed && isDisabled) { + passed = true; + } + if (!passed) { + if (hasBackground) { + // fire potential since a text on an image or gradient may be still viewable, depending on the text location on the gradient or image + return (0, IRule_1.RulePotential)("potential_graphic_background", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else if (textShadow) { + // fire potential since a text with shadow may be still viewable, depending on the shadow efffects + return (0, IRule_1.RulePotential)("potential_text_shadow", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else { + if (fg.toHex() === bg.toHex()) { + return (0, IRule_1.RulePotential)("potential_same_color", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + else { + return (0, IRule_1.RuleFail)("fail_contrast", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } + } + else { + return (0, IRule_1.RulePass)("pass", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_quoted_correctly.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/text_quoted_correctly.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_quoted_correctly = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_quoted_correctly = { + id: "text_quoted_correctly", + context: "dom:*", + help: { + "en-US": { + "Pass_0": "text_quoted_correctly.html", + "Potential_1": "text_quoted_correctly.html", + "group": "text_quoted_correctly.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}", + "group": "Quotations should be marked with <q> or <blockquote> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // ignore the check if the node is hidden + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if the element is not in the body + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + var validateParams = { + minWords: { + value: 3, + type: "integer" + } + }; + var minWords = validateParams.minWords.value; + var passed = true; + var walkNode = ruleContext.firstChild; + var violatedtext = null; + // ignore the check for the text of the following elements + var ignored = ["blockquote", "q", "script", "style", "pre", "code", "ruby", "samp"]; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName === "#text") { + var txtVal = walkNode.nodeValue; + // Do the regex tests first - should be fast + // Remove apostrophe's + txtVal = txtVal.replace(/(\S)'(\S)/g, "$1$2"); + var dblQuotes = txtVal.match(/("[^"]+")/g); + var snglQuotes = txtVal.match(/('[^']+')/g); + // Walk the parents - only continue testing if we found a quote, but + // we're not already marked up + // Also skip if we're in a script - there's lots of quotes used in scripts + if ((dblQuotes !== null || snglQuotes !== null) && + CommonUtil_1.CommonUtil.getAncestor(walkNode, ignored) === null) { + if (dblQuotes != null) { + for (var i = 0; passed && i < dblQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(dblQuotes[i]) < minWords; + } + if (snglQuotes != null) { + for (var i = 0; passed && i < snglQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(snglQuotes[i]) < minWords; + } + // Remove any linefeed inside the quote + // violatedtext = txtVal.replace(new RegExp("\\r?\\n|\\r","g"),""); + if (dblQuotes === null) { + violatedtext = snglQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else if (snglQuotes === null) { + violatedtext = dblQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else { + violatedtext = dblQuotes.concat(snglQuotes).join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + } + } + walkNode = walkNode.nextSibling; + } + //if the violatedtext is longer than 69 chars, only keep the first 32, the " ... ", and the last 32 chars + if (!passed && violatedtext.length && violatedtext.length > 69) { + violatedtext = violatedtext.substring(0, 32) + " ... " + violatedtext.substring(violatedtext.length - 32); + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_sensory_misuse.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/text_sensory_misuse.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_sensory_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_sensory_misuse = { + id: "text_sensory_misuse", + context: "dom:body, dom:body dom:*", + refactor: { + "RPT_Text_SensoryReference": { + // "Pass_0": "pass", + "Potential_1": "potential_position, potential_other" + } + }, + help: { + "en-US": { + // "pass": "text_sensory_misuse.html", + "potential_position": "text_sensory_misuse.html", + "potential_other": "text_sensory_misuse.html", + "group": "text_sensory_misuse.html" + } + }, + messages: { + "en-US": { + // "pass": "Instructions are meaningful without relying solely on shape, size, or location words", + "potential_position": "Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position", + "potential_other": "Confirm the user instruction is still understandable without the word(s) '{0}'", + "group": "Instructions should be meaningful without relying solely on shape, size, or location words" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, link, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "a", 'label']) !== null) + return null; + // ignore text on landmark roles, but not on their children (e.g., section, main) + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role) { + var lmRoles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["landmark"]); + if (lmRoles && lmRoles.includes(role)) + return null; + } + // ignore all widgets and headings, and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget", "heading"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "cell", "code", "columnheader", "definition", "figure", "list", "listitem", "math", "meter", "row", "rowgroup", "rowheader", "term"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var violatedPositionText = ""; + var violatedOtherText = ""; + var walkNode = ruleContext.firstChild; + var txtVal = ""; + while (walkNode) { + // for each element it only checks that single elements text nodes and nothing else. + // all inner elements will be covered on their own. + // whitespace characters (space, newline, tab) between elements are considered a node too. + if (walkNode.nodeName === "#text") { + var txt = walkNode.nodeValue.trim(); + if (txt.length > 0) + txtVal += (txtVal.length > 0 ? ", " + txt : txt); + } + walkNode = walkNode.nextSibling; + } + if (txtVal.length > 0) { + // first to remove each exempt word with a single space in the text + var exemptRegex = getRegex(ruleContext.ownerDocument, "exemptText"); + txtVal = txtVal.replace(exemptRegex, " "); + violatedPositionText = getViolatedText(ruleContext.ownerDocument, "positionText", txtVal); + violatedOtherText = getViolatedText(ruleContext.ownerDocument, "otherText", txtVal); + } + var ret = []; + if (violatedPositionText) + ret.push((0, IRule_1.RulePotential)("potential_position", [violatedPositionText])); + if (violatedOtherText) + ret.push((0, IRule_1.RulePotential)("potential_other", [violatedOtherText])); + return ret.length == 0 ? null : ret; + } +}; +var validateParams = { + positionText: { + value: ["top-left", "top-right", "bottom-right", "bottom-left", + "top-to-bottom", "left-to-right", "bottom-to-top", "right-to-left", + "right", "left", "above", "below", "top", "bottom", + "upper", "lower", "corner", "beside" + ], + type: "[string]" + }, + otherText: { + value: ["round", "square", "shape", "rectangle", "triangle", + "size", "large", "small", "medium", "big", "huge", "tiny", "extra", + "larger", "smaller", "bigger", "little", "largest", "smallest", "biggest" + ], + type: "[string]" + }, + exemptText: { + value: ["right-click", "left-click", "right-clicking", "right-clicks", + "left-clicking", "left-clicks", "square root", "right now", "off the top" //append as needed + ], + type: "[string]" + } +}; +function getRegex(doc, type) { + if (!validateParams[type]) + return ""; + var sensoryRegex = CacheUtil_1.CacheUtil.getCache(doc, type + "_sensory_misuse", null); + if (sensoryRegex == null) { + var sensoryText = validateParams[type].value; + var regexStr = "(\s\s+|" + sensoryText[0]; + for (var j = 1; j < sensoryText.length; ++j) { + var words = sensoryText[j].trim().split(" "); + regexStr += "|" + words[0]; + if (words.length > 1) { + for (var c = 1; c < words.length; ++c) + regexStr += " +" + words[c]; + } + } + //regexStr += ")\\W"; + regexStr += ")"; + sensoryRegex = new RegExp(regexStr, "gi"); + CacheUtil_1.CacheUtil.setCache(doc, type + "_sensory_misuse", sensoryRegex); + } + return sensoryRegex; +} +function getViolatedText(doc, type, txtVal) { + if (!txtVal) + return ""; + var sensoryTextArr = validateParams[type].value; + var hash = {}, result = []; + // split the string into words + var counts = txtVal.split(/\s+/).reduce(function (map, word) { + var wordWoTrailingPunc = word.replace(/[.?!:;()'",`\]]+$/, ""); + var lcWordWoPunc = word.toLowerCase().replace(/[.?!:;()'",`\]]/g, ""); + for (var counter = 0; counter < sensoryTextArr.length; counter++) { + var a = lcWordWoPunc.indexOf(sensoryTextArr[counter]); + var sensoryWordLen = sensoryTextArr[counter].length; + var charFollowSensoryText = lcWordWoPunc.charAt(sensoryWordLen + a); + // If the word does not contains substring of sensoryTextArr[counter] + // proceed to the next loop iteration for next sensoryText. + if (a < 0) { + continue; + } + //check the following and proceeding punctuations + //let isPuncfollowing = ((charFollowSensoryText == '\-') || + var isPuncfollowing = ((charFollowSensoryText == '\.') || + (charFollowSensoryText == '\?') || (charFollowSensoryText == '\!') || + (charFollowSensoryText == '\:') || (charFollowSensoryText == '\;') || + (charFollowSensoryText == '\(') || (charFollowSensoryText == '\)') || + (charFollowSensoryText == '\'') || (charFollowSensoryText == '\"') || + (charFollowSensoryText == '\,') || (charFollowSensoryText == '.\`') || + (charFollowSensoryText == '\\') || (charFollowSensoryText == '\]')); + var isPuncPreceding = false; + if (a > 0) { + var charPrecedeSensoryText = lcWordWoPunc.charAt(a - 1); + isPuncPreceding = ((charPrecedeSensoryText == '\-') || + (charPrecedeSensoryText == '\.') || + (charPrecedeSensoryText == '\?') || (charPrecedeSensoryText == '\!') || + (charPrecedeSensoryText == '\:') || (charPrecedeSensoryText == '\;') || + (charPrecedeSensoryText == '\(') || (charPrecedeSensoryText == '\)') || + (charPrecedeSensoryText == '\'') || (charPrecedeSensoryText == '\"') || + (charPrecedeSensoryText == '\,') || (charPrecedeSensoryText == '.\`') || + (charPrecedeSensoryText == '\\') || (charPrecedeSensoryText == '\]')); + } + if (((lcWordWoPunc.length == sensoryWordLen) || (isPuncfollowing == true) || (isPuncPreceding == true))) { + if (!hash.hasOwnProperty(wordWoTrailingPunc)) { + hash[wordWoTrailingPunc] = true; + result.push(wordWoTrailingPunc); + } + counter = sensoryTextArr.length; + } + } + map[wordWoTrailingPunc] = (map[wordWoTrailingPunc] || 0) + 1; + return map; + }, Object.create(null)); + return result.join(", "); +} + + +/***/ }, + +/***/ "./src/v4/rules/text_spacing_valid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/text_spacing_valid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_spacing_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +// Module-level constants +var STYLE_VALUE_REGEX = /(-?[\d.]+)([a-z%]*)/; +var MIN_WORD_SPACING_RATIO = 0.16; +var MIN_LETTER_SPACING_RATIO = 0.12; +var MIN_LINE_HEIGHT_RATIO = 1.5; +var IMPORTANT_SUFFIX = "!important"; +var IMPORTANT_SUFFIX_LENGTH = IMPORTANT_SUFFIX.length + 1; // +1 for the space before !important +/** + * Resolves inherited or unset style values by traversing up the DOM tree + * @param element - The element to resolve the style for + * @param property - The CSS property name + * @param currentValue - The current style value + * @returns The resolved style value + */ +function resolveInheritedStyle(element, property, currentValue) { + var _a; + if (currentValue.startsWith('inherit') || currentValue.startsWith('unset')) { + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(element.parentElement, (_a = {}, _a[property] = ["*"], _a), ['inherit', 'unset']); + if (ancestor !== null) { + return CSSUtil_1.CSSUtil.getDefinedStyles(ancestor, [property])[property]; + } + else if (currentValue.startsWith('unset')) { + return "initial"; + } + } + return currentValue; +} +/** + * Removes the !important suffix from a style value + * @param styleValue - The style value potentially containing !important + * @returns The style value without !important + */ +function removeImportantSuffix(styleValue) { + return styleValue.substring(0, styleValue.length - IMPORTANT_SUFFIX_LENGTH); +} +/** + * Checks if a spacing property violates accessibility requirements + * @param element - The HTML element being checked + * @param property - The CSS property name (word-spacing, letter-spacing, line-height) + * @param styleValue - The current style value + * @param fontSize - The computed font size in pixels + * @param minRatio - The minimum ratio threshold + * @param allowUnitless - Whether unitless values are allowed (for line-height) + * @returns RuleResult indicating pass or fail + */ +function checkSpacingProperty(element, property, styleValue, fontSize, minRatio, allowUnitless) { + if (allowUnitless === void 0) { allowUnitless = false; } + // Check if !important is used + if (element.style.getPropertyPriority(property) !== 'important') { + return true; + } + // Remove !important suffix + var cleanValue = removeImportantSuffix(styleValue); + // Check for initial or normal values (computed space is 0) + if (cleanValue === 'initial' || cleanValue === 'normal') { + return false; + } + // Parse the numeric value + var numericValue = parseFloat(cleanValue); + if (isNaN(numericValue)) { + return true; + } + // Match value and unit + var parsedValue = cleanValue.trim().match(STYLE_VALUE_REGEX); + if (!parsedValue) { + return true; + } + var value = parsedValue[1], unit = parsedValue[2]; + // Handle unitless values (only for line-height) + if (unit === '') { + if (allowUnitless) { + return parseFloat(value) < minRatio ? false : true; + } + // For other properties, zero value without unit is ignored + if (parseFloat(value) === 0) { + return null; + } + } + // Skip if no unit and non-zero (error case, inapplicable) + if (unit === '' && parseFloat(value) !== 0) { + return null; + } + // Convert to pixels and check ratio + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(unit, value, element); + if (pixels !== null && pixels / fontSize < minRatio) { + return false; + } + return true; +} +exports.text_spacing_valid = { + id: "text_spacing_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_spacing_valid.html", + "group": "text_spacing_valid.html", + "fail_letter_spacing_style": "text_spacing_valid.html", + "fail_word_spacing_style": "text_spacing_valid.html", + "fail_line_height_style": "text_spacing_valid.html" + } + }, + messages: { + "en-US": { + "pass": "CSS !important is not used in inline style to control letter or word spacing or line height", + "group": "CSS !important should not be used in inline style to control letter or word spacing or line height", + "fail_letter_spacing_style": "CSS !important should not be used in inline ‘letter-spacing’ style", + "fail_word_spacing_style": "CSS !important should not be used in inline ‘word-spacing’ style", + "fail_line_height_style": "CSS !important should not be used in inline ‘line-height’ style" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.12"], + "level": IRule_1.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_1.eToolkitLevel.LEVEL_THREE + }], + act: ['9e45ec', '24afc2', '78fd32'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Ensure that this element has children with actual text + var childStr = ""; + var childNodes = ruleContext.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType === 3) { // Text node + childStr += childNodes[i].nodeValue; + } + } + if (childStr.trim().length === 0) { + return null; + } + // Skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Skip the check if the element is off screen + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + if (!bounds || bounds['top'] < 0 || bounds['left'] < 0) { + return null; + } + // Skip non-HTML elements (e.g., SVG) + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + // Font size always resolved to 'px' + var computedStyle = getComputedStyle(ruleContext); + var fontSize = parseFloat(computedStyle.getPropertyValue('font-size')); + // Early exit optimization: Check if computed styles already pass + // If all three properties have passing values, we can skip the expensive getDefinedStyles call + var computedWordSpacing = computedStyle.getPropertyValue('word-spacing'); + var computedLetterSpacing = computedStyle.getPropertyValue('letter-spacing'); + var computedLineHeight = computedStyle.getPropertyValue('line-height'); + // Check if computed values pass the requirements + var wordSpacingPasses = true; + var letterSpacingPasses = true; + var lineHeightPasses = true; + // Check word-spacing (ignore 0px which represents default/normal) + if (computedWordSpacing) { + var wordValue = parseFloat(computedWordSpacing); + if (!isNaN(wordValue)) { + var wordPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', wordValue.toString(), ruleContext); + if (wordPixels !== null && wordPixels / fontSize < MIN_WORD_SPACING_RATIO) { + wordSpacingPasses = false; + } + } + } + // Check letter-spacing (ignore 0px which represents default/normal) + if (computedLetterSpacing) { + var letterValue = parseFloat(computedLetterSpacing); + if (!isNaN(letterValue)) { + var letterPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', letterValue.toString(), ruleContext); + if (letterPixels !== null && letterPixels / fontSize < MIN_LETTER_SPACING_RATIO) { + letterSpacingPasses = false; + } + } + } + // Check line-height + if (computedLineHeight) { + var lineValue = parseFloat(computedLineHeight); + if (!isNaN(lineValue)) { + // Line height can be unitless or in pixels + var match = computedLineHeight.match(STYLE_VALUE_REGEX); + if (match) { + var value = match[1], unit = match[2]; + if (unit === '' || unit === 'px') { + var ratio = unit === '' ? parseFloat(value) : parseFloat(value) / fontSize; + if (ratio < MIN_LINE_HEIGHT_RATIO) { + lineHeightPasses = false; + } + } + } + } + } + // If all computed values pass, we can skip the expensive getDefinedStyles check + if (wordSpacingPasses && letterSpacingPasses && lineHeightPasses) { + return null; + } + // Get defined styles to check for !important declarations + var styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["word-spacing", "letter-spacing", "line-height"]); + if (Object.keys(styles).length === 0) { + return null; + } + var results = []; + // Check word-spacing + var wordStyle = styles['word-spacing']; + if (wordStyle) { + wordStyle = resolveInheritedStyle(ruleContext, 'word-spacing', wordStyle); + var result = checkSpacingProperty(ruleContext, 'word-spacing', wordStyle, fontSize, MIN_WORD_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_word_spacing_style')); + } + // Check letter-spacing + var letterStyle = styles['letter-spacing']; + if (letterStyle) { + letterStyle = resolveInheritedStyle(ruleContext, 'letter-spacing', letterStyle); + var result = checkSpacingProperty(ruleContext, 'letter-spacing', letterStyle, fontSize, MIN_LETTER_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_letter_spacing_style')); + } + // Check line-height (only if no scrollable ancestor) + var lineStyle = styles['line-height']; + var overflowStyles = { + "overflow": ['auto', 'scroll'], + "overflow-x": ['auto', 'scroll'], + "overflow-y": ['auto', 'scroll'] + }; + if (lineStyle && CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext, overflowStyles) === null) { + lineStyle = resolveInheritedStyle(ruleContext, 'line-height', lineStyle); + var result = checkSpacingProperty(ruleContext, 'line-height', lineStyle, fontSize, MIN_LINE_HEIGHT_RATIO, true // Allow unitless values for line-height + ); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_line_height_style')); + } + return results.length > 0 ? results : null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_whitespace_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/text_whitespace_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_whitespace_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.text_whitespace_valid = { + id: "text_whitespace_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_whitespace_valid.html", + "potential_text": "text_whitespace_valid.html", + "group": "text_whitespace_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_text": "Space characters should not be used to create space between the letters of a word", + "group": "Space characters should not be used to control spacing within a word" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger if we're not in the body or if we're in a script + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body", "script", "code"]); + if (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body") + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + passed = !(/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(txtVal)); + } + walkNode = walkNode.nextSibling; + } + if (passed) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_text"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/widget_tabbable_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_exists = { + id: "widget_tabbable_exists", + context: "aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton", + refactor: { + "IBMA_Focus_Tabbable": { + "pass": "pass", + "fail_no_tabbable": "fail_no_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_exists.html", + "fail_no_tabbable": "widget_tabbable_exists.html", + "group": "widget_tabbable_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_no_tabbable": "Component with \"{0}\" role does not have a tabbable element", + "group": "Component must have at least one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role_1 = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role_1, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + // skip the count if the element requires presentational children only + if (count < 1 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 1 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + var passed = count >= 1; + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_no_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/widget_tabbable_single.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_single.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_single = { + id: "widget_tabbable_single", + context: "aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab", + refactor: { + "IBMA_Focus_MultiTab": { + "pass": "pass", + "potential_multiple_tabbable": "potential_multiple_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_single.html", + "potential_multiple_tabbable": "widget_tabbable_single.html", + "group": "widget_tabbable_single.html" + } + }, + messages: { + "en-US": { + "pass": "Components with a widget role should have no more than one tabbable element", + "potential_multiple_tabbable": "Component with \"{0}\" role has more than one tabbable element", + "group": "Components with a widget role must have no more than one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + //skip the count if the element requires presentational children only + var name = []; + if (count < 2 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 2 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + // Radio inputs with the same name natively are only one tab stop + /**if (nw.node.nodeName.toLowerCase() === 'input' && (nw.node as Element).getAttribute("type") === 'radio') { + let curName = (nw.node as Element).getAttribute("name"); + if (name.includes(curName)) + continue; + else + name.push(curName); + }*/ + ++count; + } + } + } + var passed = count < 2; + if (!passed) + CacheUtil_1.CacheUtil.setCache(ruleContext, "widget_tabbable_single", "potential_multiple_tabbable"); + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_multiple_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rulesets.ts" +/*!****************************!*\ + !*** ./src/v4/rulesets.ts ***! + \****************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a11yRulesets = void 0; +// This file comes from https://raw.githubusercontent.com/act-rules/act-tools/main/src/data/sc-urls.json +var SCURLs = __importStar(__webpack_require__(/*! ./sc-urls.json */ "./src/v4/sc-urls.json")); +var IGuideline_1 = __webpack_require__(/*! ./api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var SCs = []; +for (var key in SCURLs) { + SCs.push(SCURLs[key]); +} +var summaries = { + "1.1.1": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.", + "1.2.1": "For prerecorded audio-only or video-only media, an alternative provides equivalent information.", + "1.2.2": "Captions are provided for all prerecorded audio content in synchronized media.", + "1.2.3": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.", + "1.2.4": "Captions are provided for all live audio content in synchronized media.", + "1.2.5": "Audio description is provided for all prerecorded video content in synchronized media.", + "1.3.1": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.", + "1.3.2": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.", + "1.3.3": "Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.", + "1.3.4": "Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.", + "1.3.5": "The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.", + "1.4.1": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.", + "1.4.2": "If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.", + "1.4.3": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.", + "1.4.4": "Text can be resized without assistive technology up to 200 percent without loss of content or functionality.", + "1.4.5": "If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.", + "1.4.10": "Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.", + "1.4.11": "The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.", + "1.4.12": "No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.", + "1.4.13": "Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.", + "2.1.1": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.", + "2.1.2": "If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.", + "2.1.4": "If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.", + "2.2.1": "For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.", + "2.2.2": "For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.", + "2.3.1": "Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.", + "2.4.1": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.", + "2.4.2": "Web pages, non-web documents, and software have titles that describe topic or purpose.", + "2.4.3": "If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.", + "2.4.4": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.", + "2.4.5": "More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.", + "2.4.6": "Headings and labels describe topic or purpose.", + "2.4.7": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.", + "2.4.11": "When an element receives focus, it is not entirely covered by other content.", + "2.5.1": "All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.", + "2.5.2": "For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.", + "2.5.3": "For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.", + "2.5.4": "Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.", + "2.5.8": "The size of the target for pointer inputs is at least 24 by 24 CSS pixels.", + "2.5.7": "All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.", + "3.1.1": "The default human language of Web pages, non-Web documents, or software can be programmatically determined.", + "3.1.2": "The human language of each passage or phrase in the content can be programmatically determined.", + "3.2.1": "When any component receives focus, it does not initiate a change of context.", + "3.2.2": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.", + "3.2.3": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.", + "3.2.4": "Components that have the same functionality within a set of Web pages are identified consistently.", + "3.2.6": "Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.", + "3.3.1": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.", + "3.3.2": "Labels or instructions are provided when content requires user input.", + "3.3.3": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.", + "3.3.4": "For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.", + "3.3.7": "Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.", + "3.3.8": "Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.", + "4.1.1": "(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.", + "4.1.2": "For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.", + "4.1.3": "In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.", + "HTML": "The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.", + "ARIA": "The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.", +}; +exports.a11yRulesets = [ + // { + // id: "DEBUG", + // name: "DEBUG Rules", + // category: eRuleCategory.ACCESSIBILITY, + // description: "Rules for debugging", + // checkpoints: [{ + // num: "1", + // name: "Debug CP 1", + // wcagLevel: "A", + // summary: "Rules for Debug" + // }] + // }, + { + id: "EXTENSIONS", + name: "Extension Rules", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for enabling the browser extensions", + type: IGuideline_1.eGuidelineType.EXTENSION, + checkpoints: [{ + num: "1", + name: "Extension CP 1", + wcagLevel: "A", + summary: "Rules for Extension" + }] + }, + { + id: "IBM_Accessibility", + name: "IBM Accessibility 7.3", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "IBM_Accessibility_next", + name: "IBM Accessibility next", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_2", + name: "WCAG 2.2 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_1", + name: "WCAG 2.1 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_0", + name: "WCAG 2.0 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.", + // This ruleset has all 2.0 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + } +]; + + +/***/ }, + +/***/ "./src/v4/simulator/SRController.ts" +/*!******************************************!*\ + !*** ./src/v4/simulator/SRController.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRController = void 0; +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var SRRenderer_1 = __webpack_require__(/*! ./SRRenderer */ "./src/v4/simulator/SRRenderer.ts"); +var SRNavigator_1 = __webpack_require__(/*! ./SRNavigator */ "./src/v4/simulator/SRNavigator.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var SRUtil_1 = __webpack_require__(/*! ./SRUtil */ "./src/v4/simulator/SRUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +/** + * SRController class for managing screen reader simulation + * Maintains a point of regard and provides navigation functions + */ +var SRController = /** @class */ (function () { + /** + * Creates a new SRController + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRController(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + this.rootElement = rootElement; + this.liveListeners = []; + this.ctrlDoc = rootElement.ownerDocument; + this.setPointOfRegard(rootElement); + this.setupMutationTracking(); + console.info("[WARNING] The SRController is a new feature that is not yet \"stable\". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback."); + } + SRController.getController = function (ctrlDoc) { + if (ctrlDoc === void 0) { ctrlDoc = document; } + if (!this.singleton) { + this.singleton = new SRController(ctrlDoc.body); + } + return this.singleton; + }; + SRController.prototype.disconnect = function () { + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + }; + SRController.prototype.findAllShadowRoots = function (root) { + if (root === void 0) { root = document; } + var shadowRoots = []; + // Get all elements in the current root + var walker = this.ctrlDoc.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null); + var node; + while (node = walker.nextNode()) { + var element = node; + // Check if this element has an open shadow root + if (element.shadowRoot) { + shadowRoots.push(element.shadowRoot); + // Recursively search inside this shadow root + var nestedShadowRoots = this.findAllShadowRoots(element.shadowRoot); + shadowRoots.push.apply(shadowRoots, nestedShadowRoots); + } + } + return shadowRoots; + }; + /** + * Set up mutation tracking + * + * In the event that the point of regard is removed from the DOM, we need to get up to the nearest parent that's not being removed + */ + SRController.prototype.setupMutationTracking = function () { + var _this = this; + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + var myThis = this; + var observer = new MutationObserver(function (mutations) { + var porNode = myThis.pointOfRegard.getNode(); + var _loop_1 = function (removalMutation) { + removalMutation.removedNodes.forEach(function (removedNode) { + if (removedNode.isSameNode(porNode) || removedNode.contains(porNode)) { + console.info("Adjusting PoR due to DOM mutation removing PoR"); //, removalMutation.target, removedNode, porNode) + porNode = removalMutation.target; + } + }); + }; + for (var _i = 0, _a = mutations.filter(function (mutation) { var _a; return ((_a = mutation.removedNodes) === null || _a === void 0 ? void 0 : _a.length) > 0; }); _i < _a.length; _i++) { + var removalMutation = _a[_i]; + _loop_1(removalMutation); + } + ; + _this.setPointOfRegard(porNode); + var _loop_2 = function (mutation) { + if (mutation.addedNodes) { + mutation.addedNodes.forEach(function (addedNode) { + // Add observation of new shadow roots + var allRoots = _this.findAllShadowRoots(addedNode); + for (var _i = 0, allRoots_2 = allRoots; _i < allRoots_2.length; _i++) { + var root = allRoots_2[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }); + } + var node = mutation.target; + var elem = node.nodeType === 1 ? node : node.parentElement; + if (elem + && !elem.closest("[aria-busy=\"true\"]") + && elem.getAttribute("aria-busy") !== "true") { + // Identify the live region container + var liveRegionElem = + // The element itself is a live region container + ((["polite", "assertive"].includes(elem.getAttribute("aria-live")) + || elem.nodeName.toUpperCase() === "OUTPUT" + || ["status", "log", "progressbar", "alert", "timer"].includes(elem.getAttribute("role"))) && elem) + // Or get the nearest ancestor + || elem.closest("[aria-live=\"polite\"],[aria-live=\"assertive\"],output,[role=\"status\"],[role=\"log\"],[role=\"progressbar\"],[role=\"alert\"],[role=\"timer\"]"); + var isMutationRelevant = false; + var relevance_1 = ["additions", "text"]; + if (liveRegionElem) { + // Determine what kinds of changes are 'relevant' + var relevantElem = elem.closest("[aria-relevant]"); + if (relevantElem) { + relevance_1 = relevantElem.getAttribute("aria-relevant").split(/ +/g); + } + if (liveRegionElem.getAttribute("role") === "log") { + relevance_1 = ["additions"]; + } + if (liveRegionElem.hasAttribute("aria-relevant")) { + relevance_1 = liveRegionElem.getAttribute("aria-relevant").split(/ +/g); + } + if (relevance_1.includes("all")) { + relevance_1 = ["additions", "removals", "text"]; + } + isMutationRelevant = (mutation.target.nodeType === 3 && relevance_1.includes("text")) + || (mutation.addedNodes.length > 0 && relevance_1.includes("additions")) + || (mutation.removedNodes.length > 0 && relevance_1.includes("removals")); + } + if (liveRegionElem && isMutationRelevant) { + var isAtomic_1 = liveRegionElem.getAttribute("aria-atomic") === "true" || ["alert", "status", "timer", "marquee"].includes(liveRegionElem.getAttribute("role")); + // Read the whole region if atomic + if (!isAtomic_1 && mutation.type === "characterData" && mutation.target.nodeType === 3 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(mutation.target.parentElement)) { + for (var _c = 0, _d = _this.liveListeners; _c < _d.length; _c++) { + var liveListener = _d[_c]; + liveListener(mutation.target.nodeValue); + } + } + else { + var liveTarget_1 = isAtomic_1 ? liveRegionElem : mutation.target; + if (liveTarget_1.liveAnnounce) { + clearTimeout(liveTarget_1.liveAnnounce); + } + liveTarget_1.liveAnnounce = setTimeout(function () { + var results = []; + var isRemoval = (relevance_1.includes("removals") && mutation.removedNodes.length > 0); + if (isAtomic_1 || isRemoval) { + var liveCursor = new SRCursor_1.SRCursor(liveTarget_1, false); + var liveCursorEnd = new SRCursor_1.SRCursor(liveTarget_1, true); + liveCursorEnd.next(function () { return true; }); + results.push((isRemoval ? "[removed] " : "") + SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + } + else if (relevance_1.includes("additions") && mutation.addedNodes.length > 0) { + mutation.addedNodes.forEach(function (addedNode) { + // Just render the additions + var liveCursor = new SRCursor_1.SRCursor(addedNode, false); + var liveCursorEnd = new SRCursor_1.SRCursor(addedNode, true); + liveCursorEnd.next(function () { return true; }); + results.push(SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + }); + } + for (var _i = 0, _a = _this.liveListeners; _i < _a.length; _i++) { + var liveListener = _a[_i]; + liveListener(results.join("\n")); + } + }, 100); + } + } + } + }; + for (var _b = 0, mutations_1 = mutations; _b < mutations_1.length; _b++) { + var mutation = mutations_1[_b]; + _loop_2(mutation); + } + }); + // Need to observe all of the shadow roots + var allRoots = this.findAllShadowRoots(this.ctrlDoc.documentElement); + allRoots.push(this.ctrlDoc.documentElement); + for (var _i = 0, allRoots_1 = allRoots; _i < allRoots_1.length; _i++) { + var root = allRoots_1[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }; + SRController.prototype.addLiveListener = function (listener) { + this.liveListeners.push(listener); + }; + SRController.prototype.removeLiveListener = function (removeListener) { + this.liveListeners = this.liveListeners.filter(function (listener) { return listener !== removeListener; }); + }; + /** + * Get the current point of regard + * @returns The current SRCursor representing the point of regard + */ + SRController.prototype.getPointOfRegard = function () { + return this.pointOfRegard; + }; + /** + * Set the point of regard to a specific DOM node + * @param node The node to set as the point of regard + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.setPointOfRegard = function (node) { + var _a; + var DEBUG = false; + DEBUG && console.group("setPointOfRegard"); + try { + this.pointOfRegard = new SRCursor_1.SRCursor(node); + // Update container state + var containerChanges = SRController.diffContainers("focus", this.pointOfRegard); + var role = this.pointOfRegard.getRole(); + var name_1 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + return { + success: true, + renderingResult: SRRenderer_1.SRRenderer.renderCurrent("focus", this.pointOfRegard, containerChanges), + role: role, + name: name_1 + }; + } + catch (error) { + return { + success: false, + renderingResult: { + start: this.pointOfRegard.clone(), + end: this.pointOfRegard.clone(), + message: "Failed to set point of regard: ".concat(error.message) + } + }; + } + finally { + DEBUG && console.groupEnd(); + } + }; + /** + * Jump to the next element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpNext = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + var DEBUG = false; + DEBUG && console.group("jumpNext"); + try { + var bContinue = true; + var nextJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && nextJump) { + var lastJump = nextJump.clone(); + nextJump = SRNavigator_1.SRNavigator.jumpNext(mode, nextJump); + if (nextJump) { + var containerChanges = SRController.diffContainers(mode, nextJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(nextJump.getRole(), !nextJump.isEndTag(), nextJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, nextJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!nextJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No next ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = nextJump; + var role = this.pointOfRegard.getRole(); + var name_2 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // Check for container changes + DEBUG && console.log("New POR:", this.pointOfRegard.getNode(), renderingResult); + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_2 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + finally { + console.groupEnd(); + } + }; + /** + * Jump to the previous element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpPrevious = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + try { + var bContinue = true; + var prevJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && prevJump) { + var lastJump = prevJump.clone(); + prevJump = SRNavigator_1.SRNavigator.jumpPrevious(mode, prevJump); + if (prevJump) { + var containerChanges = SRController.diffContainers(mode, prevJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(prevJump.getRole(), !prevJump.isEndTag(), prevJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, prevJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!prevJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No previous ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = prevJump; + var role = this.pointOfRegard.getRole(); + var name_3 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // // Check for container changes + // const containerChanges = SRController.diffContainers(mode, this.pointOfRegard, oldPointOfRegard); + // let s = SRRenderer.renderEnter(mode, this.pointOfRegard); + // if (containerChanges.entering[containerChanges.entering.length-1] !== s) { + // containerChanges.entering.push(s); + // } + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_3 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + }; + /** + * Determine the different in containers between the two nodes + * @param newWalker The new node we're navigating to + * @param oldWalker The previous node we were at + * @returns Array of container change messages + */ + /** + * Walk up from a node in an iframe subdocument to find the host <iframe> element + * in the nearest ancestor document. Returns null if the node is not in a subdocument. + */ + SRController.hostIframe = function (node) { + var doc = node.ownerDocument; + if (!doc || doc === document) + return null; + // contentWindow.frameElement is the <iframe> in the parent document + try { + return DOMUtil_1.DOMUtil.getAncestor(node, ["iframe"]); + } + catch (_a) { + return null; + } + }; + SRController.diffContainers = function (mode, newWalker, oldWalker) { + var _a, _b; + var DEBUG = false; + DEBUG && console.log("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"); + DEBUG && console.log("A)", oldWalker === null || oldWalker === void 0 ? void 0 : oldWalker.getNode().nodeName, newWalker.getNode().nodeName); + var leaving = []; + var entering = []; + try { + var newDoc = (_a = newWalker === null || newWalker === void 0 ? void 0 : newWalker.getNode().ownerDocument) !== null && _a !== void 0 ? _a : document; + var oldDoc = (_b = oldWalker === null || oldWalker === void 0 ? void 0 : oldWalker.getNode().ownerDocument) !== null && _b !== void 0 ? _b : document; + // ── Cross-document iframe boundary ────────────────────────────────── + // When the navigation crosses into or out of an <iframe> subdocument + // the normal commonParent walk cannot span document boundaries. + // We detect this and manually inject the container-enter/exit for the + // <iframe> element itself. + if (newDoc !== oldDoc) { + var newIframe = SRController.hostIframe(newWalker.getNode()); + var oldIframe = SRController.hostIframe(oldWalker === null || oldWalker === void 0 ? void 0 : oldWalker.getNode()); + if (newIframe && !oldIframe) { + // Entering an iframe subdocument — emit the frame container-enter. + var iframeCursor = new SRCursor_1.SRCursor(newIframe, false); + var enter = SRRenderer_1.SRRenderer.renderEnter(mode, iframeCursor, oldWalker); + if (enter && enter.trim()) + entering.push(enter.trim()); + } + else if (!newIframe && oldIframe) { + // Leaving an iframe subdocument — emit the frame container-exit. + var iframeCursor = new SRCursor_1.SRCursor(oldIframe, true); + var leave = SRRenderer_1.SRRenderer.renderLeave(mode, iframeCursor, oldWalker); + if (leave && leave.trim()) + leaving.push(leave.trim()); + } + else if (newIframe && oldIframe && newIframe !== oldIframe) { + // Moving between two different iframes — exit old, enter new. + var oldCursor = new SRCursor_1.SRCursor(oldIframe, true); + var leave = SRRenderer_1.SRRenderer.renderLeave(mode, oldCursor, oldWalker); + if (leave && leave.trim()) + leaving.push(leave.trim()); + var newCursor = new SRCursor_1.SRCursor(newIframe, false); + var enter = SRRenderer_1.SRRenderer.renderEnter(mode, newCursor, oldWalker); + if (enter && enter.trim()) + entering.push(enter.trim()); + } + // After injecting iframe boundary announcements, also run the normal + // within-document diffContainers for each side independently so that + // landmarks inside the iframe are announced correctly. + return { leaving: leaving, entering: entering }; + } + // ── Same-document path (original logic) ───────────────────────────── + var docRoot = newWalker ? + (newWalker.getNode().ownerDocument.body || newWalker.getNode().ownerDocument.documentElement) : + oldWalker ? + (oldWalker.getNode().ownerDocument.body || oldWalker.getNode().ownerDocument.documentElement) : + document.body || document.documentElement; + var walkNew = newWalker ? newWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + var walkOld = oldWalker ? oldWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + if (!walkNew.getNode().isSameNode(walkOld.getNode())) { + var commonParent = SRController.commonParent(walkNew, walkOld); + if (commonParent) { + DEBUG && console.log("B)", commonParent.getNode().nodeName); + while (commonParent.contains(walkNew)) { + DEBUG && console.log("Entering:", walkNew.getNode().nodeName); + entering.push(SRRenderer_1.SRRenderer.renderEnter(mode, walkNew, walkOld)); + walkNew.parent(); + } + entering.reverse(); + entering = entering.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + ; + while (commonParent.contains(walkOld)) { + DEBUG && console.log("Leaving:", walkOld.getNode().nodeName); + leaving.push(SRRenderer_1.SRRenderer.renderLeave(mode, walkOld, walkOld)); + walkOld.parent(); + } + leaving = leaving.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + } + } + } + catch (err) { + console.error(err); + } + DEBUG && console.log(leaving, entering); + return { + leaving: leaving, + entering: entering + }; + }; + SRController.commonParent = function (walkerOne, walkerTwo) { + if (walkerOne.contains(walkerTwo)) { + return walkerOne.clone(); + } + else if (walkerTwo.contains(walkerOne)) { + return walkerTwo.clone(); + } + else { + var commonParent = walkerOne.clone(); + while (!commonParent.contains(walkerTwo) && commonParent.parent()) + ; + if (!commonParent.contains(walkerOne) || !commonParent.contains(walkerTwo)) { + return null; + } + return commonParent; + } + }; + SRController.renderAll = function (mode) { + var ctrl = SRController.getController(); + var dialogs = ctrl.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg.message); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + results.push(nextVal.renderingResult.message); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderAllDetail = function (doc, mode) { + var ctrl = SRController.getController(doc); + ctrl.setPointOfRegard(doc.body); + var dialogs = doc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + // mode === "item" && console.log(nextVal); + results.push(nextVal.renderingResult); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderStructure = function (doc) { + var _a, _b; + var modes = ["region", "heading", "item", "tab_focus", "image"]; + var details = modes.map(function (modeLabel) { return SRController.renderAllDetail(doc, modeLabel); }); + var retVal = []; + var _loop_3 = function () { + var next = (_a = details[0][0]) === null || _a === void 0 ? void 0 : _a.start; + modes.forEach(function (mode, idx) { + if (details[idx].length > 0) { + if (!next || SRCursor_1.SRCursor.compare(details[idx][0].start, next) < 0) { + next = details[idx][0].start; + } + } + }); + var nextItem = {}; + var hasValue = false; + modes.forEach(function (mode, idx) { + nextItem[mode] = ""; + if (details[idx].length > 0 && SRCursor_1.SRCursor.compare(details[idx][0].start, next) === 0) { + nextItem[mode] = details[idx].shift().message; + hasValue = nextItem[mode] !== ""; + } + }); + if (hasValue) { + var elem = next.getElement(); + var selector = elem && SRUtil_1.SRUtil.getUniqueSelector(elem); + // Use the element's own document for querySelector so that elements + // inside iframe subdocuments resolve correctly. + var elemDoc = (_b = elem === null || elem === void 0 ? void 0 : elem.ownerDocument) !== null && _b !== void 0 ? _b : doc; + if (selector && elemDoc.querySelector(selector)) { + nextItem.selector = selector; + } + retVal.push(nextItem); + } + }; + while (details.some(function (detail) { return detail.length > 0; })) { + _loop_3(); + } + return retVal; + }; + return SRController; +}()); +exports.SRController = SRController; + + +/***/ }, + +/***/ "./src/v4/simulator/SRCursor.ts" +/*!**************************************!*\ + !*** ./src/v4/simulator/SRCursor.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRCursor = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var SRUtil_1 = __webpack_require__(/*! ./SRUtil */ "./src/v4/simulator/SRUtil.ts"); +/** + * SRCursor (Screen Reader Cursor) class + * + * This class provides a cursor-like interface for navigating the DOM in a way that + * simulates how screen readers process and navigate content. It tracks: + * - The current node position + * - Whether it's at a start or end tag + * - The ARIA role of the current node + * - The accessible name of the current node + */ +var SRCursor = /** @class */ (function () { + /** + * Creates a new SRCursor positioned at the specified element + * @param element - The DOM node to position the cursor at + * @param bEnd - Whether to position at the end tag (true) or start tag (false) + */ + function SRCursor(element, bEnd) { + // Use DOMWalker with considerHidden=false to process all content (including hidden elements) + // This is important for screen reader simulation which needs to see all content + this.walker = new DOMWalker_1.DOMWalker(element, bEnd, undefined, false); + if (element) { + this.refreshName(); + } + } + /** + * Creates a copy of this cursor at the same position + * @returns A new SRCursor instance with the same position and properties + */ + SRCursor.prototype.clone = function () { + var retVal = new SRCursor(this.walker.node, this.walker.bEndTag); + retVal.role = this.role; + retVal.name = this.name; + retVal.preLineIndex = this.preLineIndex; + return retVal; + }; + /** + * Updates the role and accessible name properties based on the current node + * This is called whenever the cursor position changes + * @private + */ + SRCursor.prototype.refreshName = function () { + if (this.walker.node.nodeType === 1) { + // Element node + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + // Text node + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + // Other node types + this.role = undefined; + this.name = undefined; + } + }; + /** + * Moves the cursor to the next node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.next = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + // const DEBUG = false; + var foundNext = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("next function"); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && !this.walker.bEndTag) { + this.walker.bEndTag = true; + } + else if (!this.walker.nextNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundNext = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundNext); + DEBUG && console.log("foundNext:", foundNext, this.isEndTag() ? "/" : "", this.getNode()); + DEBUG && console.groupEnd(); + if (foundNext) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundNext; + }; + /** + * Moves the cursor to the previous node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.previous = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + var foundPrevious = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("previous function"); + DEBUG && console.log(this.isEndTag(), this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log(skipCurrent, skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && this.walker.bEndTag) { + DEBUG && console.log("Skipping node"); + this.walker.bEndTag = false; + } + else if (!this.walker.prevNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag(), this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log(skipCurrent, skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && !this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundPrevious = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundPrevious); + DEBUG && console.log(this.isEndTag(), this.getNode()); + DEBUG && console.groupEnd(); + if (foundPrevious) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundPrevious; + }; + /** + * Moves the cursor to the parent node of the current node + * @param endTag - Whether to position at the end tag (true) or start tag (false) + * @returns true if successfully moved to parent, false if no parent exists + */ + SRCursor.prototype.parent = function (endTag) { + if (!this.walker.node.parentNode) + return false; + this.walker.node = this.walker.node.parentNode; + this.walker.bEndTag = endTag === true; + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + this.role = undefined; + this.name = undefined; + } + return true; + }; + /** + * Moves the cursor up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.getCurrentOrParentByRole = function (roles, elems) { + var _this = this; + var uppElems = elems ? elems.map(function (elem) { return elem.toUpperCase(); }) : []; + var matches = function (walker) { + var elem = walker.getElement(); + return roles.includes(_this.getRole()) + || (elem && !elem.hasAttribute("role") && uppElems.includes(elem.nodeName.toUpperCase())); + }; + while (!matches(this) && this.parent()) + ; + return matches(this); + }; + /** + * Creates a new cursor and moves it up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns A new cursor at the matching node, or null if no match found + */ + SRCursor.prototype.getCurrentOrParentByRoleClone = function (roles, elems) { + var retVal = this.clone(); + if (retVal.getCurrentOrParentByRole(roles, elems)) { + return retVal; + } + return null; + }; + SRCursor.prototype.getCurrentOrParentTabbableClone = function () { + var retVal = this.clone(); + while (retVal) { + var elem = retVal.getElement(); + if (retVal.isStartTag() && elem && CommonUtil_1.CommonUtil.isTabbable(elem)) { + return retVal; + } + if (!retVal.parent(false)) { + break; + } + } + return null; + }; + /** + * Gets the ARIA role of the current node + * @returns The ARIA role as a string, or undefined if not available + */ + SRCursor.prototype.getRole = function () { + return this.role; + }; + /** + * Gets the accessible name info for the current node + * @returns The AccessibleNameResult object, or undefined if not available + */ + SRCursor.prototype.getNameInfo = function () { + return this.name; + }; + /** + * Get the accessible name of the current node + */ + SRCursor.prototype.getName = function () { + // Handle one-off quirks in the name calculation + var nameInfo = this.getNameInfo(); + if (nameInfo && nameInfo.name) { + return nameInfo.name; + } + var elem = this.getElement(); + if (elem) { + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + return labelElem.innerText || labelElem.textContent; + } + } + }; + /** + * Sets whether the cursor is at an end tag or start tag + * @param val - True for end tag, false for start tag + */ + SRCursor.prototype.setEndTag = function (val) { + this.walker.bEndTag = val; + }; + /** + * Gets the DOM node at the current cursor position + * @returns The current DOM node + */ + SRCursor.prototype.getNode = function () { + return this.walker.node; + }; + /** + * Gets the current node as an HTMLElement if it is an element node + * @returns The current node as HTMLElement, or undefined if not an element + */ + SRCursor.prototype.getElement = function () { + if (!this.walker.node) + return undefined; + if (this.walker.node.nodeType !== 1) + return undefined; + return this.walker.node; + }; + SRCursor.prototype.getParentElement = function () { + if (!this.walker.node) + return null; + var retVal = this.clone(); + retVal.walker.node = DOMWalker_1.DOMWalker.parentElement(retVal.walker.node); + return retVal; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isEndTag = function () { + return this.walker.bEndTag; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isStartTag = function () { + return !this.walker.bEndTag; + }; + /** + * Compares the document position of two cursors + * @param one - First cursor to compare + * @param two - Second cursor to compare + * @returns 0 if equal, -1 if one is before two, 1 if one is after two + */ + SRCursor.compare = function (one, two) { + var _a, _b; + var nodeOne = (_a = one === null || one === void 0 ? void 0 : one.walker) === null || _a === void 0 ? void 0 : _a.node; + var nodeTwo = (_b = two === null || two === void 0 ? void 0 : two.walker) === null || _b === void 0 ? void 0 : _b.node; + if (!nodeOne && !nodeTwo) + return 0; + if (!nodeOne) + return 1; + if (!nodeTwo) + return -1; + // When both cursors are at the same <pre> element and at least one has a + // preLineIndex, use line index ordering so virtual per-line stops are sequenced + // correctly. preLineIndex=undefined means the block-enter stop, which comes + // before all numbered lines (undefined < 0 < 1 < 2 …). + if (nodeOne === nodeTwo && !one.walker.bEndTag && !two.walker.bEndTag) { + var lineOneUndefined = one.preLineIndex === undefined; + var lineTwoUndefined = two.preLineIndex === undefined; + if (!lineOneUndefined || !lineTwoUndefined) { + // At least one cursor has a line index + if (lineOneUndefined) + return -1; // undefined (block-enter) sorts before all lines + if (lineTwoUndefined) + return 1; // two is block-enter; one (a numbered line) is after + if (one.preLineIndex !== two.preLineIndex) { + return one.preLineIndex < two.preLineIndex ? -1 : 1; + } + } + } + var docPosition = nodeOne.compareDocumentPosition(nodeTwo); + // Handle disconnected nodes (different documents or shadow DOMs) + if (docPosition & 0x1) { + // Nodes are disconnected - they're in different trees (iframe or shadow DOM) + // Build ancestor chains using DOMWalker.parentNode (handles shadow DOM & iframes) + var ancestorsOne = [nodeOne]; + var ancestorsTwo = [nodeTwo]; + var current = nodeOne; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsOne.push(current); + } + current = nodeTwo; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsTwo.push(current); + } + // Reverse so root is first + ancestorsOne.reverse(); + ancestorsTwo.reverse(); + // Find where the paths diverge + var commonDepth = 0; + while (commonDepth < ancestorsOne.length && + commonDepth < ancestorsTwo.length && + ancestorsOne[commonDepth] === ancestorsTwo[commonDepth]) { + commonDepth++; + } + // If one path is a prefix of the other, handle containment + if (commonDepth === ancestorsOne.length) { + // nodeOne is an ancestor of nodeTwo + return one.walker.bEndTag ? 1 : -1; + } + if (commonDepth === ancestorsTwo.length) { + // nodeTwo is an ancestor of nodeOne + return two.walker.bEndTag ? -1 : 1; + } + // Compare the nodes where paths diverge + if (commonDepth > 0) { + var childOne = ancestorsOne[commonDepth]; + var childTwo = ancestorsTwo[commonDepth]; + var childPosition = childOne.compareDocumentPosition(childTwo); + if (childPosition & 0x2) + return 1; // childTwo precedes childOne + if (childPosition & 0x4) + return -1; // childOne precedes childTwo + } + // No common ancestor found - shouldn't happen in a well-formed document + return 0; + } + if (docPosition & 0x8) { + // one is contained within two + // if two is an end tag, one is before, otherwise, one is after + return two.walker.bEndTag ? -1 : 1; + } + else if (docPosition & 0x10) { + // two is contained within one + // if one is an end tag, one is after, otherwise, one is before + return one.walker.bEndTag ? 1 : -1; + } + else if (docPosition & 0x2) { + // two precedes one in the document + return 1; + } + else if (docPosition & 0x4) { + // one precedes two in the document + return -1; + } + return 0; + }; + /** + * Checks if this cursor's node contains another cursor's node + * @param other - The other cursor to check + * @returns true if this cursor contains (is a parent/ancestor of) the other cursor's node + */ + SRCursor.prototype.contains = function (other) { + return this.getNode().contains(other.getNode()) + && !this.isSameNode(other); + }; + /** + * Checks if this cursor points to the same node as another cursor + * @param other - The other cursor to compare with + * @returns true if both cursors point to the same node + */ + SRCursor.prototype.isSameNode = function (other) { + if (!other) + return false; + return this.getNode().isSameNode(other.getNode()); + }; + /** + * Checks if the current node has a non-empty accessible name + * @returns true if the node has a non-empty accessible name + */ + SRCursor.prototype.hasNonEmptyName = function () { + var _a; + return (((_a = this.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || "").trim().length > 0; + }; + return SRCursor; +}()); +exports.SRCursor = SRCursor; + + +/***/ }, + +/***/ "./src/v4/simulator/SRNavigator.ts" +/*!*****************************************!*\ + !*** ./src/v4/simulator/SRNavigator.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRNavigator = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var SRNavigator; +(function (SRNavigator) { + /** + * Determine if a node is a block-level element based on its display property + * @param node The DOM node to check + * @returns true if the node is a block-level element, false otherwise + */ + function isBlockElement(node) { + var _a; + if (node.nodeType !== 1) + return false; + if (["br", "iframe"].includes(node.nodeName.toLowerCase())) + return true; + var elem = node; + var mywin = elem.ownerDocument.defaultView; + var disp = (_a = mywin.getComputedStyle(elem)) === null || _a === void 0 ? void 0 : _a.display; + if (disp && disp.startsWith("table")) + return true; + if (disp === "block" && elem.style.display !== "block") { + // Is this block because it's a flex elem? + if (elem.parentElement && mywin.getComputedStyle(elem.parentElement).display === "flex") { + return false; + } + } + if (AriaUtil_1.AriaUtil.getResolvedRole(elem, true) === "link") { + var temp = new DOMWalker_1.DOMWalker(node, false, undefined, false); + temp.prevNode(); + if (!isBlockElement(temp.node)) { + return true; + } + } + return ["block", "flex", "grid", "list-item"].includes(disp); + } + /** + * Collect all logical lines from a <pre> element by walking its entire subtree + * (via DOMWalker, shadow-DOM safe) and concatenating text node content, splitting + * on newlines. Only inline-context nodes are included — any descendant block + * element would be unusual inside <pre> and is ignored. + * + * Returns the trimmed, non-empty lines. + */ + function getPreLines(preElem) { + var _a; + // Concatenate all text inside the <pre>, preserving inline structure + var fullText = (_a = preElem.textContent) !== null && _a !== void 0 ? _a : ""; + var rawLines = fullText.split("\n"); + // Trim leading and trailing blank lines + var start = 0; + while (start < rawLines.length && rawLines[start].trim() === "") + start++; + var end = rawLines.length - 1; + while (end >= start && rawLines[end].trim() === "") + end--; + return rawLines.slice(start, end + 1); + } + SRNavigator.getPreLines = getPreLines; + /** + * Returns true if node is a <pre> element (the item-level cursor position for + * preformatted lines uses the <pre> element itself with preLineIndex set). + */ + function isPreElement(node) { + return node.nodeType === 1 && node.nodeName.toUpperCase() === "PRE"; + } + function getExplicitTabindex(node) { + if (!node || node.nodeType !== 1) + return null; + var elem = node; + if (!elem.hasAttribute("tabindex")) + return null; + var tabindexValue = parseInt(elem.getAttribute("tabindex"), 10); + return Number.isNaN(tabindexValue) ? null : tabindexValue; + } + function isPositiveTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return explicitTabindex !== null && explicitTabindex > 0 && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function isDefaultOrZeroTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return (explicitTabindex === null || explicitTabindex === 0) && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function getTabFocusStartFunc(includePositiveTabindex) { + if (includePositiveTabindex === void 0) { includePositiveTabindex = true; } + return function (_role, bStartTag, node) { + if (!(node && node.nodeType === 1 && bStartTag && CommonUtil_1.CommonUtil.isTabbable(node))) + return false; + return includePositiveTabindex || isDefaultOrZeroTabFocus(node); + }; + } + /** + * Collect all tabbable elements in tab order (positive tabindex first, then document order) + * @param matchFunc Function to match tabbable elements + * @param rootNode Optional root node to start collection from (defaults to document body) + * @returns Array of cursors pointing to tabbable elements in tab order + */ + function collectTabFocusCursors(matchFunc, rootNode) { + var root = ((rootNode === null || rootNode === void 0 ? void 0 : rootNode.ownerDocument) || document).body || rootNode; + if (!root) + return []; + var walker = new SRCursor_1.SRCursor(root, false); + var skipFunc = getSkipFunc("tab_focus"); + var positiveResults = []; + var normalResults = []; + var addCursor = function (cursor) { + if (!matchFunc(cursor.getRole(), !cursor.isEndTag(), cursor.getNode())) + return; + if (isPositiveTabFocus(cursor.getNode())) { + positiveResults.push(cursor.clone()); + } + else if (isDefaultOrZeroTabFocus(cursor.getNode())) { + normalResults.push(cursor.clone()); + } + }; + addCursor(walker); + while (walker.next(function () { return true; }, skipFunc)) { + addCursor(walker); + } + positiveResults.sort(function (a, b) { + var aElem = a.getElement(); + var bElem = b.getElement(); + var aTabindex = getExplicitTabindex(aElem) || 0; + var bTabindex = getExplicitTabindex(bElem) || 0; + if (aTabindex !== bTabindex) + return bTabindex - aTabindex; + return SRCursor_1.SRCursor.compare(a, b); + }); + return positiveResults.concat(normalResults); + } + /** + * Find the index of a cursor in an array of tab focus cursors + * @param cursors Array of cursors to search + * @param walker The cursor to find + * @returns The index of the cursor, or -1 if not found + */ + function findTabFocusIndex(cursors, walker) { + return cursors.findIndex(function (cursor) { return SRCursor_1.SRCursor.compare(cursor, walker) === 0; }); + } + /** + * Get the match function for identifying start positions in a given navigation mode + * @param mode The navigation mode (e.g., "link", "heading", "button", etc.) + * @returns A function that matches elements appropriate for the navigation mode + */ + function getStartFunc(mode) { + switch (mode) { + case "link": + return function (role, bStartTag) { return (bStartTag && role === "link"); }; + case "tab_focus": + return getTabFocusStartFunc(false); + case "heading": + return function (role, bStartTag) { return (bStartTag && role === "heading"); }; + case "h1": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "1"); }; + case "h2": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "2"); }; + case "h3": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "3"); }; + case "h4": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "4"); }; + case "h5": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "5"); }; + case "h6": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "6"); }; + case "image": + return function (role, bStartTag) { return (bStartTag && ["img", "graphics-document"].includes(role)); }; + case "radio": + return function (role, bStartTag) { return (bStartTag && role === "radio"); }; + case "button": + return function (role, bStartTag) { return (bStartTag && role === "button"); }; + case "checkbox": + return function (role, bStartTag) { return (bStartTag && role === "checkbox"); }; + case "combo": + return function (role, bStartTag) { return (bStartTag && role === "combobox"); }; + case "list": + return function (role, bStartTag) { return (bStartTag && role === "list"); }; + case "listitem": + return function (role, bStartTag) { return (bStartTag && role === "listitem"); }; + case "article": + return function (role, bStartTag) { return (bStartTag && role === "article"); }; + case "table": + return function (role, bStartTag) { return (bStartTag && role === "table"); }; + case "paragraph": + return function (_role, bStartTag, node) { return (bStartTag && node.nodeName.toUpperCase() === "P"); }; + case "dom": + return function () { return true; }; + case "item": + return function (cursor, bStartTag, node) { + if (!bStartTag) + return false; + // <iframe> content is inlined by the IFRAME SR_RULE into the + // parent block's rendering — the iframe itself is not an item stop. + if (node.nodeType === 1 && node.nodeName.toUpperCase() === "IFRAME") + return false; + // A <pre> element with preLineIndex set is a virtual per-line item. + // The initial encounter (preLineIndex undefined) is also a match so + // jumpNext can set preLineIndex=0 on it. + if (isPreElement(node)) + return true; + if (isBlockElement(node)) + return true; + var temp = new DOMWalker_1.DOMWalker(node, !bStartTag); + if (temp.prevNode() && temp.bEndTag) { + return isBlockElement(temp.node); + } + return false; + }; + case "region": + return function (role, bStartTag, node) { + var _a, _b; + if (!bStartTag) + return false; + if (["main", "navigation", "form", "banner", "search", "contentinfo"].includes(role)) + return true; + if (role !== "region" || (node === null || node === void 0 ? void 0 : node.nodeType) !== 1) + return false; + return !!((_b = (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(node)) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.trim()); + }; + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getStartFunc = getStartFunc; + /** + * Check if an element is within a Shadow DOM + * @param element The element to check + * @returns true if the element is in a Shadow DOM, false otherwise + */ + var isInShadowDOM = function (element) { + var root = element.getRootNode(); + return root instanceof ShadowRoot; + }; + /** + * Determine skip behavior for item navigation mode + * Handles complex visibility rules including hidden content in headings/links + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_ITEM_BEHAVIOR = function (cursor) { + var DEBUG = false; + DEBUG && console.group("SKIP_ITEM_BEHAVIOR"); + var retVal = null; + try { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + var cursorStart = cursor.clone(); + cursorStart.setEndTag(false); + DEBUG && console.log(nodeType); + // Skip CDATA and comments completely + if ([4, 8].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: true }; + // Only process elements and text + if (![1, 3].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: false }; + // For text elements, Consider with relation to their parent element + if (nodeType === 3) { + elem = cursor.getNode().parentElement; + if (!elem) + return retVal = VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + } + // if (!elem) console.log(cursor.getNode()); + // We have an element + // Make sure we're within the body element (or shadow DOM, or an iframe subdocument) + if (!elem.closest("body") && !isInShadowDOM(elem)) + return retVal = { skipCurrent: true, skipChildren: false }; + // Make sure we're not in a script or style + if (elem.closest("script,style")) + return retVal = { skipCurrent: true, skipChildren: true }; + // For text nodes, we need to check visibility in context of parent heading/link + // So we'll handle text node visibility checks below with the element visibility checks + // Skip things hidden from the AT, UNLESS we're inside a heading or link + // (headings and links should include their full accessible name, including hidden parts) + // BUT only if the heading/link uses nameFrom="content" (not aria-label/aria-labelledby) + var parentHeadingOrLink = cursorStart.getCurrentOrParentByRoleClone(["heading", "link"]); + // Special case: if current element itself is a heading or link AND we're NOT inside another heading/link, + // apply normal skip rules + var currentRole = AriaUtil_1.AriaUtil.getResolvedRole(elem); + var isCurrentHeadingOrLink = currentRole === "heading" || currentRole === "link"; + if (!parentHeadingOrLink) { + // Not inside any heading/link - apply normal skip rules + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + else { + // Check if the parent heading/link uses aria-label or aria-labelledby + var parentElem = parentHeadingOrLink.getElement(); + var nameInfo = parentHeadingOrLink.getNameInfo(); + // If nameFrom is NOT "content" or "text", skip all content (it's using aria-label/aria-labelledby) + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Parent uses aria-label/aria-labelledby - skip all content including nested headings/links + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + } + else if (isCurrentHeadingOrLink) { + // Current element is a heading/link inside another heading/link with content-based name + // Don't skip it - let it through so its content can be read + // (The logic at line 183 will handle whether to skip its children) + } + else { + // nameFrom is "content", so include hidden content but skip hidden images/graphics + var role_1 = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if ((role_1 === "img" || role_1 === "graphics-document") && VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + // Don't skip other hidden content - it should be included in the accessible name + } + } + if (elem.nodeName.toUpperCase() === "BODY") + return retVal = { skipCurrent: false, skipChildren: false }; + // Skip labels that are associated with controls - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL") { + if (elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + else { + var nestedControl = elem.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']"); + if (nestedControl && nestedControl.getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + // A <label> with no `for` and no nested control, used purely as an aria-labelledby + // target by another element, should be suppressed — it will be read as part of the + // widget's accessible name announcement. + var id = elem.getAttribute("id"); + if (id && document.querySelector("[aria-labelledby~=\"".concat(id, "\"]"))) { + return retVal = { skipCurrent: true, skipChildren: false }; + } + } + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursorStart.getRole(); + // A div/span combobox (role="combobox" on a non-input, non-select element) announces + // its value directly from text content or the controlled listbox, so skip its children + // to avoid double-announcing the inner text. + if (role === "combobox" + && elem.nodeName.toUpperCase() !== "SELECT" + && elem.nodeName.toUpperCase() !== "INPUT" + && !cursor.isEndTag()) { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // Skip children of headings/links that don't use content-based names + // UNLESS we're inside another heading/link that DOES use content-based names + if (["link", "heading"].includes(role) && (!cursorStart.getName() || (!["content", "text"].includes(cursorStart.getNameInfo().nameFrom)))) { + // Check if we're inside a parent heading/link with content-based name + if (parentHeadingOrLink && parentHeadingOrLink.getNameInfo() && ["content", "text"].includes(parentHeadingOrLink.getNameInfo().nameFrom)) { + // Don't skip children - we're nested inside a content-based heading/link + } + else { + return retVal = { skipCurrent: false, skipChildren: true }; + } + } + if (elem.nodeName.toUpperCase() === "LEGEND") { + var parent_1 = DOMWalker_1.DOMWalker.parentElement(cursor.getNode()); + while (parent_1) { + if (parent_1.nodeName.toUpperCase() === 'FIELDSET') { + // Legend is within a fieldset, suppress output + return retVal = { skipCurrent: false, skipChildren: true }; + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // <summary> is a self-announcing disclosure button — its children + // are folded into the ["label", button, collapsed] announcement, + // so skip traversal into them. + if (!cursor.isEndTag() && elem.nodeName.toUpperCase() === "SUMMARY") { + var detailsParent = elem.parentElement; + if (detailsParent && detailsParent.nodeName.toUpperCase() === "DETAILS") { + return retVal = { skipCurrent: false, skipChildren: true }; + } + } + // Skip non-summary children of a closed <details> element. + // Browsers hide those children via UA stylesheet (display:none), so + // they must not appear as reading stops when the widget is collapsed. + // Exempt the <details> element itself and <summary> (always visible). + if (!cursor.isEndTag() + && elem.nodeName.toUpperCase() !== "DETAILS" + && !elem.closest("summary")) { + var detailsAncestor = elem.closest("details"); + if (detailsAncestor && !detailsAncestor.hasAttribute("open")) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + } + if (elem.closest(".ibma-sr-overlay")) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + // Skip popup elements (listbox, tree, grid, dialog) that are owned by a combobox + // via aria-controls. In a real SR these are only reachable via aria-activedescendant, + // not by DOM traversal, so they should not appear as reading stops. + if (nodeType === 1 && !cursor.isEndTag()) { + var id = elem.getAttribute("id"); + if (id) { + var owner = document.querySelector("[aria-controls~=\"".concat(id, "\"]")); + if (owner && AriaUtil_1.AriaUtil.getResolvedRole(owner) === "combobox") { + return retVal = { skipCurrent: true, skipChildren: true }; + } + } + } + return retVal = null; + } + finally { + DEBUG && console.log("SKIP_ITEM retVal:", retVal); + DEBUG && console.groupEnd(); + } + }; + /** + * Determine skip behavior for nested navigation modes (link, heading, image, etc.) + * Simpler than SKIP_ITEM_BEHAVIOR as it doesn't need complex heading/link content rules + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_NESTED_BEHAVIOR = function (cursor) { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + // Only visit elements and text nodes + if (nodeType !== 1 && nodeType !== 3) + return { skipCurrent: true, skipChildren: false }; + if (nodeType === 3) + return VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + // We have an element + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return { skipCurrent: true, skipChildren: true }; + // Skip the inner document of an <iframe> — screen readers render the + // accessible name as the tab_focus label; the subdocument body should + // not contribute additional reading stops during renderRange traversal. + if (elem.nodeName.toUpperCase() === "IFRAME" && !cursor.isEndTag()) { + return { skipCurrent: false, skipChildren: true }; + } + // Skip label fors - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL" + && elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return { skipCurrent: true, skipChildren: false }; + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursor.getRole(); + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return { skipCurrent: false, skipChildren: true }; + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return { skipCurrent: true, skipChildren: true }; + } + if (elem.closest(".ibma-sr-overlay")) { + return { skipCurrent: true, skipChildren: true }; + } + return null; + }; + /** + * Get the skip function for a given navigation mode + * @param mode The navigation mode + * @returns A function that determines which nodes to skip during navigation + */ + function getSkipFunc(mode) { + switch (mode) { + case "region": + case "item": + return SKIP_ITEM_BEHAVIOR; + case "link": + case "tab_focus": + case "heading": + case "h1": + case "h2": + case "h3": + case "h4": + case "h5": + case "h6": + case "image": + return SKIP_NESTED_BEHAVIOR; + case "radio": + case "button": + case "checkbox": + case "combo": + case "list": + case "listitem": + case "article": + case "table": + case "paragraph": + case "dom": + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getSkipFunc = getSkipFunc; + /** + * Jump to the current position or the previous matching element if current doesn't match + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the current or previous matching position + */ + function jumpCurrent(mode, walker) { + var matchFunc = mode === "tab_focus" ? getTabFocusStartFunc(true) : getStartFunc(mode); + if (matchFunc(walker.getRole(), !walker.isEndTag(), walker.getNode())) { + return walker.clone(); + } + else { + return jumpPrevious(mode, walker); + } + } + SRNavigator.jumpCurrent = jumpCurrent; + /** + * Jump to the end of the current element and return all intermediate item positions + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns Array of cursors representing positions from current to end + */ + function jumpCurrentEnd(mode, walker) { + if (mode === "item") { + // For any <pre> item (block-enter stop or per-line stop), the render range + // must end at the next virtual line cursor (same <pre> node, next index) so + // that renderRange never walks into <pre>'s children. + if (isPreElement(walker.getNode()) && !walker.isEndTag()) { + var lines = getPreLines(walker.getNode()); + var nextIdx = walker.preLineIndex === undefined ? 0 : walker.preLineIndex + 1; + // Use nextIdx as the end sentinel — even if it equals lines.length (past + // the last line), compare() will still correctly stop renderRange before + // any child node because children are contained within <pre>. + var endCursor = walker.clone(); + endCursor.preLineIndex = nextIdx; + return [endCursor]; + } + var itemEnd = jumpNext(mode, walker); + return itemEnd ? [itemEnd] : []; + } + else { + var nameInfo = walker.getNameInfo(); + var retVal = walker.clone(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Name is just from the item itself + retVal.next(function () { return true; }); + } + else { + // Name is from the content + retVal.setEndTag(true); + retVal.next(function () { return true; }); + } + var endCursors = []; + var itemEnd = jumpNext("item", walker); + while (itemEnd && SRCursor_1.SRCursor.compare(itemEnd, retVal) < 0) { + endCursors.push(itemEnd); + itemEnd = jumpNext("item", itemEnd); + } + endCursors.push(retVal); + return mode === "tab_focus" && walker.getRole() === "link" ? [endCursors[endCursors.length - 1]] : endCursors; + } + } + SRNavigator.jumpCurrentEnd = jumpCurrentEnd; + /** + * Jump to the next matching element in the given navigation mode + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the next matching position, or null if none found + */ + function jumpNext(mode, walker) { + var DEBUG = false; + DEBUG && console.group("SRNavigator::jumpNext", walker.isEndTag() ? "/" : "", walker.getNode()); + try { + if (mode === "tab_focus") { + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + // console.log(tabFocusCursors.map(c => c.getNode())); + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex >= 0) { + if (currentIndex + 1 < tabFocusCursors.length) { + return tabFocusCursors[currentIndex + 1].clone(); + } + return null; + } + return tabFocusCursors[0].clone(); + } + } + if (mode === "item" && isPreElement(walker.getNode()) && !walker.isEndTag()) { + var lines = getPreLines(walker.getNode()); + if (walker.preLineIndex === undefined) { + // At the block-enter stop — jump to the first line item + if (lines.length > 0) { + var retVal_1 = walker.clone(); + retVal_1.preLineIndex = 0; + return retVal_1; + } + // Empty <pre> — fall through to DOM traversal past </pre> + } + else { + // At a line item — advance to the next line or past </pre> + var currentLineIdx = walker.preLineIndex; + if (currentLineIdx + 1 < lines.length) { + var retVal_2 = walker.clone(); + retVal_2.preLineIndex = currentLineIdx + 1; + return retVal_2; + } + // All lines exhausted — move past </pre> to the next DOM item. + // Always land on the block-enter stop (preLineIndex=undefined) so the + // caller gets a chance to render the container-enter announcement before + // advancing to the first line. + var retVal_3 = walker.clone(); + retVal_3.setEndTag(true); + var matchFunc_1 = getStartFunc(mode); + var skipFunc_1 = getSkipFunc(mode); + if (retVal_3.next(matchFunc_1, skipFunc_1)) { + if (isPreElement(retVal_3.getNode()) && !retVal_3.isEndTag()) { + retVal_3.preLineIndex = undefined; // block-enter stop + } + return retVal_3; + } + return null; + } + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.next(matchFunc, skipFunc)) { + // Landing on <pre> via DOM traversal always starts at the block-enter stop + // (preLineIndex=undefined). The per-line items are returned on subsequent + // calls via the isPreElement early-return above. + if (mode === "item" && isPreElement(retVal.getNode()) && !retVal.isEndTag()) { + retVal.preLineIndex = undefined; + } + DEBUG && console.log("SRNavigator::jumpNext result", retVal); + return retVal; + } + else { + return null; + } + } + finally { + console.groupEnd(); + } + } + SRNavigator.jumpNext = jumpNext; + /** + * Navigates to the previous element in screen reader navigation based on the specified mode. + * + * For tab_focus mode, this function attempts to move to the previous tabbable element by: + * 1. First trying to move backward using the mode's match and skip functions + * 2. If that fails, collecting all tab focus cursors and finding the previous one in the tab order + * + * @param mode - The navigation mode (e.g., "tab_focus") that determines how to navigate + * @param walker - The current cursor position in the screen reader navigation + * @returns A new cursor positioned at the previous element, or null if no previous element exists + */ + function jumpPrevious(mode, walker) { + if (mode === "tab_focus") { + var retVal_4 = walker.clone(); + var matchFunc_2 = getStartFunc(mode); + var skipFunc_2 = getSkipFunc(mode); + if (retVal_4.previous(matchFunc_2, skipFunc_2)) { + return retVal_4; + } + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex > 0) { + return tabFocusCursors[currentIndex - 1].clone(); + } + } + return null; + } + if (mode === "item" && isPreElement(walker.getNode()) && !walker.isEndTag()) { + if (walker.preLineIndex === undefined) { + // At the block-enter stop — go to the previous DOM item (before <pre>) + // fall through to normal previous() traversal below + } + else if (walker.preLineIndex === 0) { + // At the first line — step back to the block-enter stop + var retVal_5 = walker.clone(); + retVal_5.preLineIndex = undefined; + return retVal_5; + } + else { + // Step back one line + var retVal_6 = walker.clone(); + retVal_6.preLineIndex = walker.preLineIndex - 1; + return retVal_6; + } + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.previous(matchFunc, skipFunc)) { + // If we just landed on a <pre> element, position at its last line + if (mode === "item" && isPreElement(retVal.getNode()) && !retVal.isEndTag()) { + var lines = getPreLines(retVal.getNode()); + retVal.preLineIndex = lines.length > 0 ? lines.length - 1 : undefined; + } + return retVal; + } + else { + return null; + } + } + SRNavigator.jumpPrevious = jumpPrevious; +})(SRNavigator = exports.SRNavigator || (exports.SRNavigator = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRRenderer.ts" +/*!****************************************!*\ + !*** ./src/v4/simulator/SRRenderer.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRenderer = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var SRNavigator_1 = __webpack_require__(/*! ./SRNavigator */ "./src/v4/simulator/SRNavigator.ts"); +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var render_rules_1 = __webpack_require__(/*! ./render_rules */ "./src/v4/simulator/render_rules/index.ts"); +var common_1 = __webpack_require__(/*! ./render_rules/common */ "./src/v4/simulator/render_rules/common.ts"); +/** + * SRRenderer namespace provides functionality for simulating how screen readers + * announce content to users. It contains rules for rendering different types of + * elements and ARIA roles in various navigation modes. + * + * The renderer uses a rule-based system to determine what text should be announced + * when navigating to, within, or away from elements based on their roles and properties. + */ +var SRRenderer; +(function (SRRenderer) { + /** + * Generates the announcement text when entering an element + * + * This function looks up the appropriate rule based on the element's role or tag name + * and applies it to generate the announcement text. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for entering the element, or null if no rule applies + */ + function renderEnter(mode, walker, oldWalker) { + var DEBUG = false; + for (var _i = 0, CONTAINER_ENTER_RULES_1 = render_rules_1.CONTAINER_ENTER_RULES; _i < CONTAINER_ENTER_RULES_1.length; _i++) { + var rule = CONTAINER_ENTER_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + DEBUG && console.log(mode, walker, rule, s); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderEnter = renderEnter; + /** + * Generates the announcement text when leaving an element + * + * Similar to renderEnter, but applies rules for leaving elements instead. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for leaving the element, or null if no rule applies + */ + function renderLeave(mode, walker, oldWalker) { + for (var _i = 0, CONTAINER_EXIT_RULES_1 = render_rules_1.CONTAINER_EXIT_RULES; _i < CONTAINER_EXIT_RULES_1.length; _i++) { + var rule = CONTAINER_EXIT_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderLeave = renderLeave; + /** + * Renders the current element and any container changes + * + * This function combines announcements for: + * - Containers being left + * - Containers being entered + * - The current element itself + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param containerChanges - Information about containers being entered or left + * @returns Combined announcement text + */ + function renderCurrent(mode, walker, containerChanges) { + var DEBUG = false; //mode === "tab_focus" && document.getElementById("fixture")?.getAttribute("class") === "tomtest"; + var startOfRender = SRNavigator_1.SRNavigator.jumpCurrent(mode, walker); + if (!startOfRender) + return null; + var endOfRenders = SRNavigator_1.SRNavigator.jumpCurrentEnd(mode, startOfRender); + if (!endOfRenders || endOfRenders.length === 0) { + endOfRenders = [null]; + } + DEBUG && console.log("AAAA", startOfRender.isStartTag(), startOfRender.getNode()); + DEBUG && console.log("BBBB", endOfRenders.map(function (val) { return val && val.isStartTag(); }), endOfRenders.map(function (val) { return val && val.getNode(); })); + var endOfRender = endOfRenders[endOfRenders.length - 1]; + var renderStr = ""; + for (var _i = 0, endOfRenders_1 = endOfRenders; _i < endOfRenders_1.length; _i++) { + var candidateEnd = endOfRenders_1[_i]; + var candidateRenderStr = SRRenderer.renderRange(mode, startOfRender, candidateEnd); + if (candidateRenderStr.trim().length > 0) { + endOfRender = candidateEnd; + renderStr = candidateRenderStr; + break; + } + } + if (renderStr === "") { + renderStr = SRRenderer.renderRange(mode, startOfRender, endOfRender); + } + DEBUG && console.log("CCCC", renderStr); + return { + start: startOfRender, + end: endOfRender, + message: (containerChanges.leaving || []).concat(containerChanges.entering || []).concat([renderStr]).join(" ").replace(/\s+/g, " ") + }; + } + SRRenderer.renderCurrent = renderCurrent; + /** + * Renders a range of elements between two cursors + * + * This function traverses the DOM from startOfRender to endOfRender, + * applying rendering rules to each element and combining the results. + * + * @param mode - The current navigation mode + * @param startOfRender - Cursor at the start of the range + * @param endOfRender - Cursor at the end of the range + * @returns Combined announcement text for the entire range + */ + function renderRange(mode, startOfRender, endOfRender) { + var _a; + var iterWalker = startOfRender.clone(); + var elemStrs = []; + var bContinue = true; + var currentLink = null; + while (bContinue) { + var elem = iterWalker.getElement(); + var node = iterWalker.getNode(); + var nodeType = node.nodeType; + var renderStrs = []; + var linkParent = AriaUtil_1.AriaUtil.getAncestorWithRole(node, "link", true); + if (linkParent && !["content", "text"].includes((_a = new SRCursor_1.SRCursor(linkParent).getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + // We don't consider links that announce themselves + linkParent = null; + } + for (var _i = 0, SR_RULES_1 = render_rules_1.SR_RULES; _i < SR_RULES_1.length; _i++) { + var rule = SR_RULES_1[_i]; + var s = rule.test(mode, iterWalker); + if (typeof s !== "undefined" && s !== null && s.trim().length > 0) { + if (nodeType === 1 && !iterWalker.isEndTag() && elem.getAttribute("aria-haspopup") === "menu") { + s = "[subMenu] " + s; + } + // Handle links + if (mode === "tab_focus") { + // We're in link mode + if (currentLink && (!linkParent || (linkParent && currentLink !== linkParent))) { + // We've added a string within a link (currentLink), but now we've left the link or moved to a new link + s = "".concat(s, " ").concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false))); + } + } + else { + if (linkParent && (!currentLink || (currentLink !== linkParent))) { + // We're in a link, and we haven't announced this link, or we've moved to a new link + s = "".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(linkParent, false)), " ").concat(s); + } + } + if (s !== "") { + currentLink = linkParent; + elemStrs.push(s); + } + break; + } + } + elemStrs.push(renderStrs.filter(function (s) { return s.trim().length > 0; }).join(" ")); + bContinue = iterWalker.next(function () { return true; }, SRNavigator_1.SRNavigator.getSkipFunc(mode)) && SRCursor_1.SRCursor.compare(iterWalker, endOfRender) < 0; + } + if (mode === "tab_focus" && currentLink) { + elemStrs.push("".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false)))); + } + var retVal = elemStrs.filter(function (s) { return s.trim().length > 0; }).join(" "); + retVal = retVal.replace(/, \u0001([^\u0002]+)\u0002/g, function (match, describedByText) { + var quotedText = "\"".concat(describedByText, "\""); + var unmarkedRetVal = retVal.replace(match, ""); + return unmarkedRetVal.includes(quotedText) || unmarkedRetVal.includes(describedByText) ? "" : ", ".concat(quotedText); + }); + retVal = retVal.replace(/[\u0001\u0002]/g, ""); + return retVal; + } + SRRenderer.renderRange = renderRange; +})(SRRenderer = exports.SRRenderer || (exports.SRRenderer = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRRendererRule.ts" +/*!********************************************!*\ + !*** ./src/v4/simulator/SRRendererRule.ts ***! + \********************************************/ +(__unused_webpack_module, exports) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRendererRule = void 0; +var SRRendererRule = /** @class */ (function () { + function SRRendererRule(ruleDefinition) { + this.ruleDefinition = ruleDefinition; + } + SRRendererRule.prototype.test = function (mode, cursor, oldCursor) { + if (this.ruleDefinition.modes.includes(mode) + && (this.ruleDefinition.roles.includes(cursor.getRole()) + || this.ruleDefinition.elems.includes(cursor.getNode().nodeName.toUpperCase()))) { + for (var _i = 0, _a = this.ruleDefinition.tests; _i < _a.length; _i++) { + var test_1 = _a[_i]; + var s = test_1(cursor, oldCursor, mode); + if (typeof s === "string") + return s; + } + } + return null; + }; + return SRRendererRule; +}()); +exports.SRRendererRule = SRRendererRule; + + +/***/ }, + +/***/ "./src/v4/simulator/SRTableUtil.ts" +/*!*****************************************!*\ + !*** ./src/v4/simulator/SRTableUtil.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRTableUtil = void 0; +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +/** + * TableUtil namespace provides utility functions for handling HTML tables in the accessibility simulator. + * These functions help determine cell positions, relationships, and extract header information + * to simulate how screen readers would announce table navigation. + */ +var SRTableUtil; +(function (SRTableUtil) { + /** + * Determines if the cursor is pointing to a cell element (TD or TH) + * or has a cell-related ARIA role + * @param cursor - The SRCursor to check + * @returns true if the cursor is on a cell, false otherwise + */ + function isCursorCellRole(cursor) { + if (!cursor.getElement()) + return false; + if (["cell", "rowheader", "columnheader"].includes(cursor.getRole())) { + return true; + } + return !cursor.getElement().hasAttribute("role") && ["TH", "TD"].includes(cursor.getElement().nodeName.toUpperCase()); + } + SRTableUtil.isCursorCellRole = isCursorCellRole; + /** + * Gets a cursor pointing to the current cell or the parent cell if the cursor + * is inside a cell's content + * @param cursor - The SRCursor to check + * @returns A new SRCursor pointing to the cell or null if not in a cell + */ + function getCurrentOrParentCellCursor(cursor) { + return cursor.getCurrentOrParentByRoleClone(["cell", "rowheader", "columnheader"], ["TD", "TH"]); + } + SRTableUtil.getCurrentOrParentCellCursor = getCurrentOrParentCellCursor; + /** + * Get the colspan of a cell at a given location + * @param cursor The cursor to get the colspan from + * @returns The colspan of the cell at the cursor's location or 0 if not in a column + */ + function getColSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var colSpan = cursor.getElement().getAttribute("colspan"); + if (colSpan) { + return parseInt(colSpan); + } + return 1; + } + SRTableUtil.getColSpan = getColSpan; + /** + * Get the rowspan of a cell at a given location + * @param cursor The cursor to get the rowspan from + * @returns The rowspan of the cell at the cursor's location or 0 if not in a column + */ + function getRowSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var rowSpan = cursor.getElement().getAttribute("rowspan"); + if (rowSpan) { + return parseInt(rowSpan); + } + return 1; + } + SRTableUtil.getRowSpan = getRowSpan; + /** + * Builds a complete model of a table's structure, accounting for rowspan and colspan + * + * This function traverses the entire table and creates a data structure that represents + * the logical grid of cells, properly handling cells that span multiple rows or columns. + * The resulting model makes it easier to determine cell relationships and positions. + * + * @param inTableCursor - A cursor within the table + * @returns A TableModel representing the complete table structure, or null if not in a table + */ + function getTableModel(inTableCursor) { + // Get a cursor pointing to the table element + var tableCursor = inTableCursor.getCurrentOrParentByRoleClone(["table"]); + if (!tableCursor) + return null; + var walkTableCursor = tableCursor.clone(); + var retVal = []; // The complete table model we're building + var curRow = []; // The current row being processed + var prevRow; // The previous row (needed for rowspan handling) + // Walk through the table's DOM structure + while (walkTableCursor.next(function () { return true; }) && !walkTableCursor.getNode().isSameNode(tableCursor.getNode())) { + if (walkTableCursor.isEndTag() && walkTableCursor.getRole() === "row") { + // Reached the end of the row, push what we have and reset + retVal.push(curRow); + prevRow = curRow; + curRow = []; + // Handle cells with rowspan from previous rows that affect this row + // This ensures cells spanning multiple rows are properly represented in the model + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + // Process each cell in the row + if (!walkTableCursor.isEndTag() && isCursorCellRole(walkTableCursor)) { + var colspan = getColSpan(walkTableCursor); + // Create a cell model with position and spanning information + var cellInfo = { + rowIndexStart: retVal.length, + colIndexStart: curRow.length, + rowspan: getRowSpan(walkTableCursor), + colspan: colspan, + cellCursor: walkTableCursor.clone() + }; + // For cells with colspan, add the same cell info to multiple columns + for (var idx = 0; idx < colspan; ++idx) { + curRow.push(cellInfo); + } + // Continue handling cells with rowspan from previous rows + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + } + return retVal; + } + SRTableUtil.getTableModel = getTableModel; + /** + * Gets the cell model for a specific cell in the table + * + * This function finds the CellModel object that represents a specific cell, + * which contains information about its position and spanning. + * + * @param inCellCursor - A cursor pointing to a cell or its contents + * @param tableModel - Optional pre-built table model (will be created if not provided) + * @returns The CellModel for the specified cell, or null if not found + */ + function getCellModel(inCellCursor, tableModel) { + var cellCursor = getCurrentOrParentCellCursor(inCellCursor); + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + } + // Search through the table model to find the matching cell + for (var rowIndex = 0; rowIndex < tableModel.length; ++rowIndex) { + for (var colIndex = 0; colIndex < tableModel[rowIndex].length; ++colIndex) { + if (tableModel[rowIndex][colIndex].cellCursor.isSameNode(cellCursor)) { + return tableModel[rowIndex][colIndex]; + } + } + } + return null; + } + SRTableUtil.getCellModel = getCellModel; + /** + * Checks if a cell spans a specific column + * + * @param cellModel - The cell model to check + * @param colIdx - The column index to check + * @returns True if the cell contains the specified column + */ + function cellModelContainsColumn(cellModel, colIdx) { + return colIdx >= cellModel.colIndexStart && colIdx < cellModel.colIndexStart + cellModel.colspan; + } + SRTableUtil.cellModelContainsColumn = cellModelContainsColumn; + /** + * Checks if a cell spans a specific row + * + * @param cellModel - The cell model to check + * @param rowIdx - The row index to check + * @returns True if the cell contains the specified row + */ + function cellModelContainsRow(cellModel, rowIdx) { + return rowIdx >= cellModel.rowIndexStart && rowIdx < cellModel.rowIndexStart + cellModel.rowspan; + } + SRTableUtil.cellModelContainsRow = cellModelContainsRow; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeaders(cursor) { + return ""; + } + SRTableUtil.getRowHeaders = getRowHeaders; + /** + * Gets the column headers associated with a cell + * First checks for explicit headers attribute, then looks for column headers in the same column + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getColumnHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var colDatas = []; + for (var colIdx = cellModel.colIndexStart; colIdx < cellModel.colIndexStart + cellModel.colspan; ++colIdx) { + colDatas.push({ + potentialColHeaders: [], + existsDataCell: false, + colIdx: colIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same column (ignore column headers) + .filter(function (cursor) { return colDatas.some(function (colData) { return cellModelContainsColumn(SRTableUtil.getCellModel(cursor, tableModel), colData.colIdx); }); }); + } + else { + // Get all cells in this column + // Note - if everything in this column is empty or a header cell, this is probably not a heading + for (var rowIdx = 0; rowIdx < tableModel.length; ++rowIdx) { + var _loop_1 = function (colData) { + var colIdx = colData.colIdx; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "columnheader") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "col" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + } + else { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + } + }; + for (var _i = 0, colDatas_1 = colDatas; _i < colDatas_1.length; _i++) { + var colData = colDatas_1[_i]; + _loop_1(colData); + } + } + for (var _a = 0, colDatas_2 = colDatas; _a < colDatas_2.length; _a++) { + var colData = colDatas_2[_a]; + if (!colData.existsDataCell) { + colData.potentialColHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return colDatas.some(function (colData) { return colData.potentialColHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getColumnHeadersForCursor = getColumnHeadersForCursor; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var rowDatas = []; + for (var rowIdx = cellModel.rowIndexStart; rowIdx < cellModel.rowIndexStart + cellModel.rowspan; ++rowIdx) { + rowDatas.push({ + potentialRowHeaders: [], + existsDataCell: false, + rowIdx: rowIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same row (ignore column headers) + .filter(function (cursor) { return rowDatas.some(function (rowData) { return cellModelContainsRow(SRTableUtil.getCellModel(cursor, tableModel), rowData.rowIdx); }); }); + } + else { + // Get all cells in the rows + // Note - if everything in the row is empty or a header cell, this is probably not a heading + var longestRow = rowDatas.reduce(function (prev, cur) { return Math.max(prev, tableModel[cur.rowIdx].length); }, 0); + for (var colIdx = 0; colIdx < longestRow; ++colIdx) { + var _loop_2 = function (rowData) { + var rowIdx = rowData.rowIdx; + if (colIdx >= tableModel[rowIdx].length) + return "continue"; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "rowheader") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "row" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + } + else { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + } + }; + for (var _i = 0, rowDatas_1 = rowDatas; _i < rowDatas_1.length; _i++) { + var rowData = rowDatas_1[_i]; + _loop_2(rowData); + } + } + for (var _a = 0, rowDatas_2 = rowDatas; _a < rowDatas_2.length; _a++) { + var rowData = rowDatas_2[_a]; + if (!rowData.existsDataCell) { + rowData.potentialRowHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return rowDatas.some(function (rowData) { return rowData.potentialRowHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getRowHeadersForCursor = getRowHeadersForCursor; + /** + * Determines if a cell is a data cell (not a header cell) + * + * A data cell is one with either: + * - An explicit ARIA role of "cell" + * - A TD element without an overriding role attribute + * + * @param checkCursor - The cursor to check + * @returns True if the cursor points to a data cell + */ + function isDataCell(checkCursor) { + var checkCursorElem = checkCursor.getElement(); + if (!checkCursorElem) + return false; + return checkCursor.getRole() === "cell" || (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TD"); + } + SRTableUtil.isDataCell = isDataCell; +})(SRTableUtil = exports.SRTableUtil || (exports.SRTableUtil = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRUtil.ts" +/*!************************************!*\ + !*** ./src/v4/simulator/SRUtil.ts ***! + \************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRUtil = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var SRUtil; +(function (SRUtil) { + function isModalDialogElement(node) { + if (node.nodeType !== 1) + return false; + var elem = node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem, true); + return role === "dialog" && elem.getAttribute("aria-modal") === "true" && VisUtil_1.VisUtil.isNodeVisible(node); + } + SRUtil.isModalDialogElement = isModalDialogElement; + /** + * Generates a unique CSS selector for a specific HTML element + * The selector is built using a combination of: + * 1. Element tag name + * 2. ID (if available) + * 3. Classes (if available) + * 4. Attributes (if needed) + * 5. nth-child selectors for position in parent + * + * @param element The HTML element to generate a selector for + * @param optimized If true, creates a shorter but possibly less robust selector + * @return A CSS selector string that uniquely identifies the element + */ + function getUniqueSelector(element, optimized) { + if (optimized === void 0) { optimized = false; } + // If the element has an ID, that's the most direct way to select it + if (element.id) { + return "#".concat(CSS.escape(element.id)); + } + // If we're at the root or document element, return the tag name + if (element.isSameNode(document.documentElement) || element.isSameNode(document.body)) { + return element.tagName.toLowerCase(); + } + // Start building the selector with the tag name + var selector = element.tagName.toLowerCase(); + // Add classes if available and we're not optimizing for brevity + if (element.classList.length && !optimized) { + // Take up to 3 classes to avoid overly specific selectors + var classes = Array.from(element.classList).slice(0, 3); + selector += classes.map(function (cls) { return ".".concat(CSS.escape(cls)); }).join(''); + } + // Add distinguishing attributes if needed and not optimizing + if (!optimized) { + // Consider adding role, aria-label, or other distinctive attributes + if (element.hasAttribute('role')) { + selector += "[role=\"".concat(CSS.escape(element.getAttribute('role') || ''), "\"]"); + } + if (element.hasAttribute('aria-label')) { + var label = element.getAttribute('aria-label') || ''; + if (label.length <= 20) { // Avoid overly long selectors + selector += "[aria-label=\"".concat(CSS.escape(label), "\"]"); + } + } + // For inputs, add type attribute + if (element.tagName.toLowerCase() === 'input' && element.hasAttribute('type')) { + selector += "[type=\"".concat(CSS.escape(element.getAttribute('type') || ''), "\"]"); + } + } + // If we have a parent node, determine position among siblings + if (element.parentElement) { + // Find all siblings with the same tag + var siblings = Array.from(element.parentElement.children) + .filter(function (child) { return child.tagName === element.tagName; }); + // If there's more than one sibling with the same tag, add nth-child + if (siblings.length > 1) { + var index = siblings.indexOf(element) + 1; + selector += ":nth-of-type(".concat(index, ")"); + } + // If we're not at the root, recursively build the parent selector + // but use optimized selectors for ancestors to keep the overall selector manageable + return "".concat(getUniqueSelector(element.parentElement, true), " > ").concat(selector); + } + return selector; + } + SRUtil.getUniqueSelector = getUniqueSelector; +})(SRUtil = exports.SRUtil || (exports.SRUtil = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRViewer.ts" +/*!**************************************!*\ + !*** ./src/v4/simulator/SRViewer.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRViewer = exports.SROverlay = void 0; +var SRController_1 = __webpack_require__(/*! ./SRController */ "./src/v4/simulator/SRController.ts"); +/** + * SROverlay class for creating a UI widget to control screen reader simulation + * Provides buttons for navigation and displays results + */ +var SROverlay = /** @class */ (function () { + /** + * Creates a new SROverlay + * @param controller The SRController instance to use for navigation + */ + function SROverlay(srViewer) { + this.srViewer = srViewer; + /** Navigation modes available in the UI */ + this.navigationModes = [ + { mode: "item", label: "Item" }, + { mode: "tab_focus", label: "Tabbable" }, + { mode: "heading", label: "Heading" }, + { mode: "region", label: "Region" } + ]; + this.createOverlay(); + } + SROverlay.prototype.createDOMElement = function (elemName, attrs, styles) { + var retVal = this.srViewer.viewerDoc.createElement(elemName); + if (attrs) { + for (var key in attrs) { + retVal[key] = attrs[key]; + } + } + if (styles) { + for (var key in styles) { + retVal.style[key] = styles[key]; + } + } + return retVal; + }; + /** + * Creates the overlay UI elements and adds them to the DOM + */ + SROverlay.prototype.createOverlay = function () { + var _this = this; + // Create main container + this.container = this.createDOMElement("div", { + className: "ibma-sr-overlay" + }, { + position: 'fixed', + bottom: '0', + left: '0', + width: '100%', + backgroundColor: 'rgba(0, 0, 0, 0.8)', + color: 'white', + padding: '10px', + zIndex: '10000', + display: 'flex', + flexDirection: 'column', + gap: '10px' + }); + // Create controls container + var controlsContainer = this.createDOMElement("div", {}, { + display: "flex", flexWrap: "wrap", gap: "10px" + }); + // Create navigation mode groups + this.navigationModes.forEach(function (navMode) { + var modeGroup = _this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + modeGroup.appendChild(_this.createDOMElement('span', { + textContent: navMode.label + ":" + }, {})); + // Previous button + var prevButton = _this.createDOMElement('button', { + textContent: '◀ Prev' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + prevButton.addEventListener('click', function () { return _this.srViewer.navigatePrevious(navMode.mode); }); + modeGroup.appendChild(prevButton); + // Next button + var nextButton = _this.createDOMElement('button', { + textContent: 'Next ▶' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + nextButton.addEventListener('click', function () { return _this.srViewer.navigateNext(navMode.mode); }); + modeGroup.appendChild(nextButton); + controlsContainer.appendChild(modeGroup); + }); + var otherButtonGroup = this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + // Show all button + var showAllButton = this.createDOMElement('button', { + textContent: 'Show all' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + showAllButton.addEventListener('click', function () { return _this.srViewer.showAll(true); }); + otherButtonGroup.appendChild(showAllButton); + // Toggle Speech Button + var toggleSpeech = this.createDOMElement('button', { + textContent: 'Toggle speech' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + toggleSpeech.addEventListener('click', function () { return _this.srViewer.toggleSpeech(); }); + otherButtonGroup.appendChild(toggleSpeech); + controlsContainer.appendChild(otherButtonGroup); + // Create results display + this.resultsDisplay = this.createDOMElement('div', { + textContent: 'Screen reader simulation results will appear here.' + }, { + padding: '10px', + backgroundColor: 'rgba(255, 255, 255, 0.1)', + borderRadius: '3px', + minHeight: '100px', + maxHeight: '50vh', + fontFamily: 'monospace', + overflow: 'auto' + }); + // Add elements to container + this.container.appendChild(controlsContainer); + this.container.appendChild(this.resultsDisplay); + // Add to document + this.srViewer.viewerDoc.body.appendChild(this.container); + }; + /** + * Display the navigation result in the overlay + * @param result The navigation result + * @param mode The navigation mode used + * @param direction The navigation direction ('next', 'previous', or 'focus') + */ + SROverlay.prototype.displayResult = function (result, mode, direction) { + var _a, _b, _c, _d; + var displayText = ''; + if (result.success) { + // console.log("???", result); + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + else { + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + (_b = (_a = result.renderingResult.end) === null || _a === void 0 ? void 0 : _a.getElement()) === null || _b === void 0 ? void 0 : _b.scrollIntoView(); + (_d = (_c = result.renderingResult.start) === null || _c === void 0 ? void 0 : _c.getElement()) === null || _d === void 0 ? void 0 : _d.scrollIntoView(); + window.scrollBy(0, -200); + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.textContent = displayText; + var inspectButton = this.createDOMElement("button", { + innerText: "Debug" + }, {}); + inspectButton.addEventListener("click", function () { + var _a, _b; + console.log((_a = result.renderingResult.start) === null || _a === void 0 ? void 0 : _a.getNode(), (_b = result.renderingResult.end) === null || _b === void 0 ? void 0 : _b.getNode()); + }); + this.resultsDisplay.appendChild(inspectButton); + }; + SROverlay.prototype.displayAll = function (result) { + var _this = this; + var table = this.createDOMElement("table", {}, {}); + var headerRow = this.createDOMElement("tr", {}, {}); + var headingLabels = ["Region", "Heading", "Item", "Tabbable"]; + var headingFields = ["region", "heading", "item", "tab_focus"]; + for (var _i = 0, headingLabels_1 = headingLabels; _i < headingLabels_1.length; _i++) { + var headingLabel = headingLabels_1[_i]; + headerRow.appendChild(this.createDOMElement("th", { + scope: "col", + innerText: headingLabel + }, { + textAlign: "left", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + table.appendChild(headerRow); + } + var _loop_1 = function (line) { + var dataRow = this_1.createDOMElement("tr", {}, {}); + headingFields.forEach(function (field) { + dataRow.appendChild(_this.createDOMElement("td", { + innerText: line[field] + }, { + verticalAlign: "top", + border: "solid white 1px", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + }); + table.appendChild(dataRow); + }; + var this_1 = this; + for (var _a = 0, result_1 = result; _a < result_1.length; _a++) { + var line = result_1[_a]; + _loop_1(line); + } + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.appendChild(table); + }; + /** + * Remove the overlay from the DOM + */ + SROverlay.prototype.destroy = function () { + if (this.container && this.container.parentNode) { + this.container.parentNode.removeChild(this.container); + } + }; + return SROverlay; +}()); +exports.SROverlay = SROverlay; +/** + * SRViewer class for managing screen reader simulation with UI controls + */ +var SRViewer = /** @class */ (function () { + /** + * Creates a new SRViewer + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRViewer(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + /** Flag to track if speech is active */ + this.isStreaming = false; + /** Flag to set if showing all */ + this.isShowingAll = false; + /** Flag to set if it should be speaking */ + this.speechEnabled = false; + this.viewerDoc = rootElement.ownerDocument; + // Create controller for the document body + this.controller = SRController_1.SRController.getController(this.viewerDoc); + // Create overlay UI + this.overlay = new SROverlay(this); + // Set up keyboard handlers + this.setupKeyboardHandlers(); + // Set up focus tracking + this.setupFocusTracking(); + // Set up mutation tracking + this.setupMutationTracking(); + } + SRViewer.prototype.showAll = function (bEnableAllMode) { + if (bEnableAllMode) { + this.isShowingAll = true; + } + var result = SRController_1.SRController.renderStructure(this.viewerDoc); + this.overlay.displayAll(result); + }; + SRViewer.prototype.toggleSpeech = function () { + this.speechEnabled = !this.speechEnabled; + }; + /** + * Navigate to the next element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigateNext = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpNext(mode); + this.overlay.displayResult(result, mode, 'next'); + this.speakResult(result); + }; + /** + * Navigate to the previous element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigatePrevious = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpPrevious(mode); + this.overlay.displayResult(result, mode, 'previous'); + this.speakResult(result); + }; + /** + * Set up keyboard event handlers for screen reader navigation + */ + SRViewer.prototype.setupKeyboardHandlers = function () { + var _this = this; + this.keyboardHandler = function (e) { + // Don't capture keyboard events when focus is in form controls + var target = e.target; + if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') { + return; + } + // Handle keyboard shortcuts + if (e.ctrlKey) { + // Ctrl key stops speech + _this.stopSpeech(); + return; + } + if (e.altKey || e.metaKey) + return; + // console.log(e.key); + switch (e.key) { + case 'ArrowUp': + e.preventDefault(); + _this.navigatePrevious('item'); + break; + case ' ': + _this.isStreaming = true; + case 'ArrowDown': + e.preventDefault(); + _this.navigateNext('item'); + break; + case 'Enter': + e.preventDefault(); + _this.activateCurrentElement(); + _this.controller.setPointOfRegard(_this.viewerDoc.activeElement); + break; + case 'H': + case 'h': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('heading'); + } + else { + e.preventDefault(); + _this.navigateNext('heading'); + } + break; + case 'R': + case 'r': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('region'); + } + else { + e.preventDefault(); + _this.navigateNext('region'); + } + break; + case 'Tab': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('tab_focus'); + } + else { + e.preventDefault(); + _this.navigateNext('tab_focus'); + } + break; + } + }; + // Add the event listener + this.viewerDoc.addEventListener('keydown', this.keyboardHandler); + }; + SRViewer.prototype.speakResult = function (result) { + var _this = this; + if (!this.speechEnabled) + return; + var utterance = new SpeechSynthesisUtterance(result.renderingResult.message); + utterance.rate = 1.5; + var myThis = this; + utterance.addEventListener("end", function (event) { + if (myThis.isStreaming) { + _this.navigateNext('item'); + } + }); + speechSynthesis.cancel(); + speechSynthesis.speak(utterance); + }; + /** + * Stop speech output + */ + SRViewer.prototype.stopSpeech = function () { + this.isStreaming = false; + // Cancel any active speech synthesis + speechSynthesis.cancel(); + }; + /** + * Set up mutation tracking + */ + SRViewer.prototype.setupMutationTracking = function () { + var _this = this; + var observer = new MutationObserver(function (mutations) { + // console.log(this.isShowingAll, mutations.length); + if (_this.isShowingAll) { + var outsideOverlay = mutations.filter(function (mutation) { return mutation.target.nodeType === 1 + && !mutation.target.closest(".ibma-sr-overlay"); }); + if (outsideOverlay.length > 0) { + // console.log("Mutations",outsideOverlay); + observer.disconnect(); + var myThis_1 = _this; + myThis_1.showAll(); + setTimeout(function () { + myThis_1.showAll(); + observer.observe(_this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }, 1000); + } + } + }); + observer.observe(this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }; + /** + * Set up focus tracking to update the point of regard when focus changes + */ + SRViewer.prototype.setupFocusTracking = function () { + var _this = this; + this.focusHandler = function (e) { + // Skip if the focus is on the overlay itself + if (e.target instanceof HTMLElement) { + var target = e.target; + if (_this.overlay && target.closest('.ibma-sr-overlay')) { + return; + } + console.group("focusHandler"); + // Update the point of regard to the newly focused element + var result = _this.controller.setPointOfRegard(target); + // Announce the focus change + if (result.success) { + _this.overlay.displayResult(result, 'focus', 'focus'); + _this.speakResult(result); + } + console.groupEnd(); + } + }; + // Add the focus event listener to the document + this.viewerDoc.addEventListener('focusin', this.focusHandler); + }; + /** + * Activate (click) the element at the current point of regard + */ + SRViewer.prototype.activateCurrentElement = function () { + var currentElement = this.controller.getPointOfRegard().getElement(); + if (currentElement) { + // Announce that we're activating the element + var result = { + success: true, + renderingResult: { + message: "Activating: ".concat(currentElement.textContent || currentElement.nodeName), + start: this.controller.getPointOfRegard(), + end: this.controller.getPointOfRegard() + } + }; + this.overlay.displayResult(result, 'focus', 'focus'); + this.speakResult(result); + // Focus the element first + if (currentElement.focus) { + currentElement.focus(); + } + // Simulate a click on the element + currentElement.click(); + } + }; + /** + * Get the controller instance + * @returns The SRController instance + */ + SRViewer.prototype.getController = function () { + return this.controller; + }; + /** + * Destroy the viewer and clean up resources + */ + SRViewer.prototype.destroy = function () { + // Remove event listeners + this.viewerDoc.removeEventListener('keydown', this.keyboardHandler); + this.viewerDoc.removeEventListener('focusin', this.focusHandler); + // Stop any active speech + this.stopSpeech(); + // Destroy overlay + this.overlay.destroy(); + }; + return SRViewer; +}()); +exports.SRViewer = SRViewer; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/common.ts" +/*!*************************************************!*\ + !*** ./src/v4/simulator/render_rules/common.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = exports.getLinkAnnouncement = exports.getRoleDescription = exports.quoteName = exports.quoteNamePadBefore = exports.quoteNamePadAfter = void 0; +var SRCursor_1 = __webpack_require__(/*! ../SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * Provide the name, surrounded by the quoteCharBefore and quoteCharAfter and followed by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add after, if the name exists + * @param quoteCharBefore The string to use as the leading quote, if the name exists + * @param quoteCharBefore The string to use as the trailing quote, if the name exists + * @returns + */ +function quoteNamePadAfter(cursor, padding, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteName(cursor)).concat(padding || ", ") + : ""; +} +exports.quoteNamePadAfter = quoteNamePadAfter; +/** + * Provide the name, surrounded by quotes and preceded by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add before, if the name exists (defaults to ", ") + * @returns The quoted name with leading padding, or empty string if no name exists + */ +function quoteNamePadBefore(cursor, padding) { + return cursor.getName() + ? "".concat(padding || ", ").concat(quoteName(cursor)) + : ""; +} +exports.quoteNamePadBefore = quoteNamePadBefore; +/** + * Provide the name surrounded by quote characters + * @param cursor The cursor for which to fetch the name + * @param quoteCharBefore The string to use as the leading quote (defaults to ") + * @param quoteCharAfter The string to use as the trailing quote (defaults to ") + * @returns The quoted name, or empty string if no name exists + */ +function quoteName(cursor, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteCharBefore || '"').concat(cursor.getName()).concat(quoteCharAfter || '"') + : ""; +} +exports.quoteName = quoteName; +/** + * Get the role description for an element, using aria-roledescription if present + * Falls back to the provided default role name if aria-roledescription is not specified or empty + * @param cursor The cursor positioned at the element + * @param defaultRole The default role name to use if aria-roledescription is not present + * @returns The role description (either custom or default) + */ +function getRoleDescription(cursor, defaultRole) { + var elem = cursor.getElement(); + if (!elem) + return defaultRole; + var roleDescription = elem.getAttribute("aria-roledescription"); + if (roleDescription && roleDescription.trim().length > 0) { + return roleDescription.trim(); + } + return defaultRole; +} +exports.getRoleDescription = getRoleDescription; +/** + * Generate the screen reader announcement for a link element + * Distinguishes between same-page links (anchors) and regular links + * @param cursor The cursor positioned at the link element + * @param mode The navigation mode (affects announcement order) + * @returns The formatted link announcement string + */ +function getLinkAnnouncement(cursor, mode) { + var href = (cursor.getNode().href) || ""; + var announceStr = ""; + if (href.startsWith(document.location.href) && href.charAt(document.location.href.length) === "#") { + announceStr = "same page link"; + } + else { + announceStr = "link"; + } + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + if (mode === "tab_focus") { + return "[".concat(quoteNamePadAfter(cursor)).concat(announceStr, "]"); + } + else { + return "[".concat(announceStr).concat(quoteNamePadBefore(cursor), "]"); + } + } + return "[".concat(announceStr, "]"); +} +exports.getLinkAnnouncement = getLinkAnnouncement; +/** + * Get the description text from aria-describedby references + * Resolves all IDs in aria-describedby and concatenates their text content + * @param elem The element with aria-describedby attribute + * @param mode The navigation mode (returns empty string in "item" mode) + * @returns The formatted description text with leading comma and quotes, or empty string + */ +function getDescribedByAnnouncements(elem, mode) { + var describedBy = elem.getAttribute("aria-describedby"); + if (!describedBy) + return ""; + var descriptionElems = describedBy + .split(/\s+/) + .map(function (id) { return document.getElementById(id); }) + .filter(function (descElem) { return !!descElem; }); + var descriptionText = descriptionElems + .map(function (descElem) { var _a; return (_a = descElem.textContent) === null || _a === void 0 ? void 0 : _a.trim(); }) + .filter(function (text) { return !!text; }) + .join(" "); + if (!descriptionText || descriptionText.length === 0) + return ""; + if (mode === "item") + return ", \u0001".concat(descriptionText, "\u0002"); + return ", \"".concat(descriptionText, "\""); +} +/** + * Get state announcements for disabled, readonly, required, and invalid attributes + * @param elem The element to check for state attributes + * @returns A string with state announcements (e.g., ", disabled", ", read only", ", required", ", invalid") + */ +function getStateAnnouncements(elem) { + var states = ""; + // Check for disabled state (both attribute and aria-disabled) + if (elem.hasAttribute("disabled") || elem.getAttribute("aria-disabled") === "true") { + states += ", disabled"; + } + // Check for readonly state (both attribute and aria-readonly) + if (elem.hasAttribute("readonly") || elem.getAttribute("aria-readonly") === "true") { + states += ", read only"; + } + // Check for required state (both attribute and aria-required) + if (elem.hasAttribute("required") || elem.getAttribute("aria-required") === "true") { + states += ", required"; + // A required <select> whose selected value is "" is implicitly invalid — + // JAWS and NVDA announce "invalid entry" in this case. + if (elem.nodeName.toUpperCase() === "SELECT" && elem.validity.valueMissing) { + states += ", invalid entry"; + } + } + // Check for invalid state (aria-invalid) + if (elem.getAttribute("aria-invalid") === "true") { + states += ", invalid"; + } + return states; +} +/** + * Check if a listitem contains interactive/widget elements + * Screen readers typically don't read the accessible name of a listitem when it contains interactive elements + * Uses DOMWalker to properly traverse shadow DOM and other complex structures + */ +function listitemContainsInteractiveElement(cursor) { + var elem = cursor.getElement(); + if (!elem) + return false; + // Use DOMWalker to traverse the entire subtree including shadow DOM + var walker = new DOMWalker_1.DOMWalker(elem, false, elem, false); + // Walk through all descendants + while (walker.nextNode()) { + // Only check element nodes at start tags + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(walker.node); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return true; + } + } + } + return false; +} +/** + * Check if an iframe's content can be accessed (not cross-origin) + * Attempts to access the iframe's document to determine if it's accessible + * @param iframe The iframe element to check + * @returns true if the iframe content is accessible, false if cross-origin or blocked + */ +function canAccessFrame(iframe) { + try { + // This throws a DOMException for cross-origin frames + var doc = iframe.contentDocument || iframe.contentWindow.document; + return doc !== null; + } + catch (e) { + return false; + // if (e instanceof DOMException && e.name === 'SecurityError') { + // return false; // Cross-origin, access blocked + // } + // throw e; // Re-throw unexpected errors + } +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Button role + new SRRendererRule_1.SRRendererRule({ + roles: ["button"], + elems: [], + modes: ["item", "button", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "true") { + return "[toggle ".concat(roleDesc, ", pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "false") { + return "[toggle ".concat(roleDesc, ", not pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (cursor.isEndTag()) + return undefined; + var expandStr = ""; + var elem = cursor.getElement(); + var roleDesc = getRoleDescription(cursor, "button"); + if (["menu", "true"].includes(elem.getAttribute("aria-haspopup"))) { + expandStr += ", menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + expandStr += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(expandStr).concat(getDescribedByAnnouncements(elem, mode), "]"); + }, + function (cursor) { if (cursor.isEndTag()) + return ""; } + ] + }), + // Checkbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["checkbox"], + elems: [], + modes: ["item", "checkbox", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "checkbox"); + var stateStr = ""; + if (elem.getAttribute("aria-checked") === "mixed") { + stateStr = "half checked"; + } + else { + var bChecked = false; + if (elem.hasAttribute("aria-checked")) { + bChecked = elem.getAttribute("aria-checked") === "true"; + } + else { + bChecked = elem.checked; + } + stateStr = bChecked ? "checked" : "not checked"; + } + stateStr += getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Cell, Columnheader, and Rowheader roles + new SRRendererRule_1.SRRendererRule({ + roles: ["cell", "columnheader", "rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var _a; + if (!cursor.isStartTag()) + return null; + // Get the cell element + var cellElem = cursor.getElement(); + if (!cellElem) + return null; + // Check if the cell has any visible content by checking: + // 1. Text content (trimmed) + // 2. Child elements with roles (buttons, links, etc.) + // 3. Images with alt text + var textContent = ((_a = cellElem.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || ""; + // Check for child elements with interactive roles or content + var walker = new DOMWalker_1.DOMWalker(cellElem, false, cellElem, false); + var hasContent = textContent.length > 0; + if (!hasContent) { + // Check for elements that would have content (buttons, links, images, etc.) + while (walker.nextNode()) { + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var elem = walker.node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // Check for interactive elements or elements with accessible names + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + hasContent = true; + break; + } + // Check for images with alt text + if (elem.nodeName.toUpperCase() === "IMG" && elem.hasAttribute("alt")) { + hasContent = true; + break; + } + } + } + } + // If the cell is empty, return "[blank]" + if (!hasContent) { + return "[blank]"; + } + // Otherwise, return null to let default rendering continue + return null; + } + ] + }), + // Combobox role + new SRRendererRule_1.SRRendererRule({ + roles: ["combobox"], + elems: [], + modes: ["item", "combo", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "combo box"); + var elem = cursor.getElement(); + var state = ""; + if (cursor.getNode().nodeName.toUpperCase() === "SELECT") { + state = ", collapsed"; + var selectElem = cursor.getElement(); + var valueElem = selectElem.selectedIndex >= 0 ? selectElem.options[selectElem.selectedIndex] : null; + var valueStr = ""; + if (valueElem) { + var temp = new SRCursor_1.SRCursor(valueElem, false); + valueStr = quoteNamePadBefore(temp, ", "); + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + else if (cursor.getNode().nodeName.toUpperCase() === "INPUT") { + if (elem.hasAttribute("aria-expanded")) { + state = ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state, ", has auto complete, editable, opens list]"); + } + else { + if (elem.hasAttribute("aria-expanded")) { + state = ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + if (elem.hasAttribute("aria-autocomplete")) { + state += ", has auto complete"; + } + } + state += getStateAnnouncements(elem); + // Determine the current value to announce: + // 1. If expanded and aria-controls points to a listbox, use the aria-selected option text + // 2. Otherwise use the combobox element's own text content + var valueStr = ""; + var controlsId = elem.getAttribute("aria-controls"); + var popup = controlsId ? document.getElementById(controlsId) : null; + if (popup) { + var selectedOption = popup.querySelector("[role='option'][aria-selected='true']"); + if (selectedOption) { + valueStr = ", \"".concat((selectedOption.textContent || "").trim(), "\""); + } + } + if (!valueStr) { + var textContent = (elem.textContent || "").trim(); + if (textContent) { + valueStr = ", \"".concat(textContent, "\""); + } + } + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + } + ] + }), + // Listbox role - covers <select size> / <select multiple> + new SRRendererRule_1.SRRendererRule({ + roles: ["listbox"], + elems: [], + modes: ["item", "combo", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "list box"); + var elem = cursor.getElement(); + var state = ""; + if (cursor.getNode().nodeName.toUpperCase() === "SELECT") { + var selectElem = cursor.getElement(); + var selectedOptions = Array.from(selectElem.options).filter(function (o) { return o.selected; }); + var valueStr_1 = selectedOptions + .map(function (o) { return quoteNamePadBefore(new SRCursor_1.SRCursor(o, false), ", "); }) + .join(""); + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr_1, "]"); + } + // ARIA listbox (non-select) + state += getStateAnnouncements(elem); + var textContent = (elem.textContent || "").trim(); + var valueStr = textContent ? ", \"".concat(textContent, "\"") : ""; + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + ] + }), + // Default role (fallback) + new SRRendererRule_1.SRRendererRule({ + roles: ["default"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + return cursor.isStartTag() ? + "!!<".concat(cursor.getRole(), ">").concat((((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) + ""), "!!") : + "!!</".concat(cursor.getRole(), ">!!"); + } + ] + }), + // Deletion role + new SRRendererRule_1.SRRendererRule({ + roles: ["deletion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[deleted]" || ""); } + ] + }), + // Dialog role + new SRRendererRule_1.SRRendererRule({ + roles: ["dialog"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + return cursor.isEndTag() ? "[End of dialog]" : "[Start of dialog".concat(quoteNamePadBefore(cursor)); + } + ] + }), + // Contenteditable (editable region) - elements with contenteditable="true" (or "") + // Must come before the generic/document rule so it takes precedence. + // Screen readers (JAWS/NVDA) announce these as an editable section when entering + // and "out of section" when leaving. + // We use a broad element list (covering the most common host elements) plus + // "generic" and "paragraph" roles so both bare <div> and labelled variants are caught. + // The test function always checks the attribute and bails out when: + // - the attribute is absent or "false" + // - an explicit ARIA role overrides the semantics (e.g. role="textbox") + new SRRendererRule_1.SRRendererRule({ + roles: ["generic", "paragraph"], + elems: ["DIV", "SPAN", "P", "SECTION", "ARTICLE", "HEADER", "FOOTER", "MAIN", "ASIDE", "NAV", "LI", "TD", "TH", "PRE", "BLOCKQUOTE", "FIGURE", "FIGCAPTION", "DETAILS", "SUMMARY"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + var elem = cursor.getElement(); + if (!elem) + return null; + var ce = elem.getAttribute("contenteditable"); + if (ce !== "true" && ce !== "") + return null; + // Defer to the explicit-role rule when an author provides a concrete ARIA role + // (e.g. role="textbox") — those roles carry richer semantics and their own rules. + if (elem.hasAttribute("role")) + return null; + // <p> retains its "paragraph" semantics even when editable. + var isParagraph = cursor.getRole() === "paragraph" || elem.nodeName.toUpperCase() === "P"; + if (cursor.isEndTag()) { + return mode === "item" ? (isParagraph ? "[out of paragraph]" : "[out of section]") : ""; + } + // aria-readonly is not a supported state on contenteditable elements — + // screen readers (JAWS/NVDA) ignore it entirely, so we exclude it here. + // Only disabled is meaningful (it overrides the editable semantics). + var stateAnnouncements = ""; + if (elem.hasAttribute("disabled") || elem.getAttribute("aria-disabled") === "true") { + stateAnnouncements = ", disabled"; + } + var containerWord = isParagraph ? "paragraph" : "section"; + // In tab_focus mode, only append textContent when the accessible name + // is extrinsic (aria-label / aria-labelledby, i.e. nameFrom ≠ "content"/"text"). + // When nameFrom IS "content", jumpCurrentEnd already walks children so + // appending again would duplicate the text. + var nameInfo = cursor.getNameInfo(); + var nameFromContent = !nameInfo || ["content", "text"].includes(nameInfo.nameFrom); + var textContent = (mode === "tab_focus" && !nameFromContent) ? (_a = elem.textContent) === null || _a === void 0 ? void 0 : _a.trim() : ""; + var contentSuffix = textContent ? " ".concat(textContent) : ""; + return "[".concat(quoteNamePadAfter(cursor)).concat(containerWord, ", editable").concat(stateAnnouncements, "]").concat(contentSuffix); + } + ] + }), + // Document role + new SRRendererRule_1.SRRendererRule({ + roles: ["document", "generic"], + elems: [], + modes: ["item"], + tests: [ + function () { return ""; } + ] + }), + // Graphics document role + new SRRendererRule_1.SRRendererRule({ + roles: ["graphics-document"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isStartTag() && !((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + return null; + }, + function (cursor) { var _a; return (cursor.isStartTag() && (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) === "")) ? "" : null; }, + function (cursor) { var _a; return (cursor.isStartTag() && ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && "[graphic".concat(quoteNamePadBefore(cursor), "]")) || null; }, + function (cursor) { return (cursor.isEndTag()) ? "" : null; } + ] + }), + // Heading role + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && cursor.isStartTag()) + return ""; + if (mode === "item" && cursor.isEndTag()) + return ""; + var level; + var node = cursor.getElement(); + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + return "[heading level ".concat(level).concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[heading level ".concat(level, "]"); + } + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["heading", "h1", "h2", "h3", "h4", "h5", "h6"], + tests: [ + function (cursor) { + if (cursor.isStartTag()) { + var node = cursor.getNode(); + var level = void 0; + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + return "[".concat(quoteNamePadAfter(cursor), "heading level ").concat(level, "]"); + } + return ""; + } + ] + }), + // Image role + new SRRendererRule_1.SRRendererRule({ + roles: ["img"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b, _c; + if (cursor.isEndTag()) { + return ""; + } + else { + if (!((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + // (these were only included because of the SKIP_ITEM_BEHAVIOR change) + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + else if (((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) === "") { + return ""; + } + else { + return "[graphic".concat(quoteNamePadBefore(cursor), "]"); + } + } + } + ] + }), + // Insertion role + new SRRendererRule_1.SRRendererRule({ + roles: ["insertion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[inserted]" || ""); } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["link"], + elems: [], + modes: ["item", "region", "link", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && !["content", "text"].includes((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + return getLinkAnnouncement(cursor, mode); + } + return null; + } + ] + }), + // Listitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["listitem"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + var isOrdered; + var parentListElem; + var walkParents = DOMWalker_1.DOMWalker.parentNode(cursor.getNode()); + while (typeof isOrdered === "undefined" && walkParents) { + if (walkParents.nodeType === 1) { + var elem = walkParents; + if (elem.hasAttribute("role")) { + if (elem.getAttribute("role") === "list") { + isOrdered = false; + parentListElem = elem; + } + } + else if (elem.nodeName.toUpperCase() === "UL") { + isOrdered = false; + parentListElem = elem; + } + else if (elem.nodeName.toUpperCase() === "OL") { + isOrdered = true; + parentListElem = elem; + } + } + walkParents = DOMWalker_1.DOMWalker.parentNode(walkParents); + } + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var retStr = ""; + if (!isOrdered) { + var elem = cursor.getElement(); + if ((elem.nodeName.toUpperCase() === "LI" && window.getComputedStyle(elem).listStyleType === "none") + || elem.nodeName.toUpperCase() !== "LI") { + retStr = cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + retStr = cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + else { + // For ordered lists, count sibling listitems and account for start attribute + var count = 1; // Start at 1 by default + // Get the start attribute if it exists on the <ol> element + if (parentListElem && parentListElem.nodeName.toUpperCase() === 'OL' && + parentListElem.hasAttribute('start')) { + var startValue = parseInt(parentListElem.getAttribute('start') || '1', 10); + count = isNaN(startValue) ? 1 : startValue; + } + // Count previous sibling listitems at the same level using DOMWalker + var currentElem = cursor.getElement(); + var sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(currentElem); + while (sibling) { + // Only count direct siblings that are listitems (element nodes only) + if (sibling.nodeType === 1) { + var siblingElem = sibling; + if (siblingElem.getAttribute('role') === 'listitem' || + siblingElem.nodeName.toUpperCase() === 'LI') { + count++; + } + } + sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(sibling); + } + retStr = cursor.isStartTag() ? "".concat(count, ". ").concat(nameToUse) : ""; + } + return retStr; + } + ] + }), + // Math role + new SRRendererRule_1.SRRendererRule({ + roles: ["math"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isEndTag() ? "[math content]" : ""; } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["menuitem"], + elems: [], + modes: ["item", "tab_focus", "region"], + tests: [ + function (cursor) { + var retVal = ""; + if (cursor.isStartTag()) { + // let isSubMenuContainer = false; + // for (let checkChildren=cursor.getNode().firstChild; !isSubMenuContainer && checkChildren !== null; checkChildren = checkChildren.nextSibling) { + // isSubMenuContainer = checkChildren.nodeName.toUpperCase() === "UL"; + // } + // if (isSubMenuContainer) return "[????menu]"; + var expandStr = ""; + var elem = cursor.getElement(); + if (elem.getAttribute("aria-haspopup") === "true") { + expandStr += ", sub-menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + retVal = "[menu".concat(expandStr); + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + retVal += quoteNamePadBefore(cursor); + } + retVal += "]"; + } + return retVal; + } + ] + }), + // Meter role + new SRRendererRule_1.SRRendererRule({ + roles: ["meter"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Progressbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["progressbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Radio role + new SRRendererRule_1.SRRendererRule({ + roles: ["radio"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var roleDesc = getRoleDescription(cursor, "radio button"); + var bChecked = false; + if (cursor.getElement().hasAttribute("aria-checked")) { + bChecked = cursor.getElement().getAttribute("aria-checked") === "true"; + } + else { + bChecked = cursor.getNode().checked; + } + var stateStr = getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(bChecked ? "checked" : "not checked").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Searchbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["searchbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[".concat(quoteNamePadAfter(cursor), "edit]") : ""; } + ] + }), + // Separator role + new SRRendererRule_1.SRRendererRule({ + roles: ["separator"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[separator]" || ""); } + ] + }), + // Slider role + new SRRendererRule_1.SRRendererRule({ + roles: ["slider"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "slider"); + var elem = cursor.getElement(); + // Check for aria-valuenow first, then fall back to native value property + var value = elem.hasAttribute("aria-valuenow") + ? elem.getAttribute("aria-valuenow") + : cursor.getNode().value; + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", ").concat(value).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Spinbutton role + new SRRendererRule_1.SRRendererRule({ + roles: ["spinbutton"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "spinbutton"); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", editable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Tab role + new SRRendererRule_1.SRRendererRule({ + roles: ["tab"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "tab"); + return "[".concat(roleDesc).concat(cursor.getNode().getAttribute("aria-selected") === "true" ? ", selected" : "").concat(quoteNamePadBefore(cursor), "]"); + } + ] + }), + // Tablist role + new SRRendererRule_1.SRRendererRule({ + roles: ["tablist"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[group start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[group end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Tabpanel role + new SRRendererRule_1.SRRendererRule({ + roles: ["tabpanel"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[Tab panel start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[Tab panel end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Text role + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["item", "link", "tab_focus", "region"], + tests: [ + function (cursor) { + var _a, _b, _c, _d; + if (cursor.isEndTag() || !((_a = cursor.getParentElement()) === null || _a === void 0 ? void 0 : _a.getElement())) + return null; + var elem = (_b = cursor.getParentElement()) === null || _b === void 0 ? void 0 : _b.getElement(); + if (elem.ownerDocument.defaultView.getComputedStyle(elem).textDecorationLine === "line-through") { + return "[strikethrough] ".concat((((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) + ""), " [end strikethrough]"); + } + return "".concat((((_d = cursor.getNameInfo()) === null || _d === void 0 ? void 0 : _d.name) + "")); + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["heading"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Textbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["textbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + var elem = cursor.getElement(); + if (cursor.isEndTag()) { + return mode === "item" && elem.nodeName.toUpperCase() === "TEXTAREA" ? "[out of edit]" : ""; + } + if (!cursor.isStartTag()) { + return ""; + } + var attributes = ""; + if (elem.hasAttribute("placeholder") && elem.getAttribute("placeholder").trim().length > 0) { + attributes += ", placeholder: ".concat(elem.getAttribute("placeholder")); + } + attributes += getStateAnnouncements(elem); + var isMultiline = elem.nodeName.toUpperCase() === "TEXTAREA" || elem.getAttribute("aria-multiline") === "true"; + var describedBy = getDescribedByAnnouncements(elem, mode); + if (isMultiline) { + var textContent = mode === "tab_focus" ? (_a = elem.textContent) === null || _a === void 0 ? void 0 : _a.trim() : ""; + var contentSuffix = textContent ? " ".concat(textContent) : ""; + return "[".concat(quoteNamePadAfter(cursor), "edit, multiline").concat(attributes).concat(describedBy, "]").concat(contentSuffix); + } + return "[".concat(quoteNamePadAfter(cursor), "edit").concat(attributes).concat(describedBy, "]"); + } + ] + }), + // Treeitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["treeitem"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var elem = cursor.getElement(); + // Build the announcement string without the name (let content render separately) + var announcement = "[treeview item"; + // Add selected state if present + if (elem.getAttribute("aria-selected") === "true") { + announcement += ", selected"; + } + // Add expanded/collapsed state if present + if (elem.hasAttribute("aria-expanded")) { + announcement += elem.getAttribute("aria-expanded") === "true" ? ", expanded" : ", collapsed"; + } + // Add level if explicitly set or calculate from nesting + var level = elem.getAttribute("aria-level"); + if (level) { + announcement += ", level ".concat(level); + } + else { + // Calculate level by counting parent treeitems or groups using DOMWalker for shadow DOM support + var calculatedLevel = 1; + var parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + while (parent_1) { + var parentRole = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + if (parentRole === "group" || parentRole === "tree") { + // Check if this group is inside a treeitem + var groupParent = DOMWalker_1.DOMWalker.parentElement(parent_1); + while (groupParent) { + var groupParentRole = AriaUtil_1.AriaUtil.getResolvedRole(groupParent); + if (groupParentRole === "treeitem") { + calculatedLevel++; + break; + } + else if (groupParentRole === "tree") { + break; + } + groupParent = DOMWalker_1.DOMWalker.parentElement(groupParent); + } + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + if (calculatedLevel > 1) { + announcement += ", level ".concat(calculatedLevel); + } + } + // Add position information (aria-posinset/aria-setsize or calculate) + var position = elem.getAttribute("aria-posinset"); + var setSize = elem.getAttribute("aria-setsize"); + if (!position || !setSize) { + // Calculate position by counting siblings with same role using DOMWalker for shadow DOM support + var pos = 0; + var total = 0; + var parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + if (parent_2) { + // Iterate through children to count treeitems + var child = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(parent_2); + while (child) { + if (child.nodeType === 1) { // Element node + var childElem = child; + if (AriaUtil_1.AriaUtil.getResolvedRole(childElem) === "treeitem") { + total++; + if (childElem === elem) { + pos = total; + } + } + } + child = child.nextSibling; + } + } + position = pos.toString(); + setSize = total.toString(); + } + announcement += ", ".concat(position, " of ").concat(setSize, "] "); + return announcement; + } + ] + }), + // HTML Element rules + // Preformatted text line rendering: when cursor is at a <pre> element with + // preLineIndex set, render only that line of the pre's text content. + // This rule fires inside renderRange for per-line item stops. + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["PRE"], + modes: ["item"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isEndTag()) + return ""; + if (cursor.preLineIndex === undefined) + return null; // let container_enter handle it + var fullText = (_a = cursor.getNode().textContent) !== null && _a !== void 0 ? _a : ""; + var rawLines = fullText.split("\n"); + var start = 0; + while (start < rawLines.length && rawLines[start].trim() === "") + start++; + var end = rawLines.length - 1; + while (end >= start && rawLines[end].trim() === "") + end--; + var lines = rawLines.slice(start, end + 1); + return (_b = lines[cursor.preLineIndex]) !== null && _b !== void 0 ? _b : ""; + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BODY"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + // Suppress [Start/End of document] for iframe subdocument bodies. + // When the inner body is entered from an <iframe>, diffContainers emits + // the ["name", frame] container-enter announcement instead. Suppressing + // the document title announcements here avoids double-announcements. + var body = cursor.getNode(); + if (body.ownerDocument !== document) + return ""; + var titleStr = cursor.getNode().ownerDocument.title; + return cursor.isEndTag() ? "[End of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]") : "[Start of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]"); + } + ] + }), + // Inline frame (<iframe>) — tab_focus mode: announces the frame as a tab stop. + // A titled iframe announces its accessible name; an untitled one announces just "frame". + // (The item-mode announcement is handled by diffContainers emitting the container_enter + // IFRAME rule when crossing into the subdocument — no separate SR_RULE needed for item mode.) + // When role="none" or role="presentation" is set, screen readers treat the frame as a + // generic grouping — announce "grouping" instead of "frame". + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return null; + var role = cursor.getElement().getAttribute("role"); + var isPresentation = role === "none" || role === "presentation"; + // An untitled presentational iframe produces no meaningful tab stop label — + // suppress it entirely so it does not appear in the tab_focus column. + if (isPresentation && !cursor.getName()) + return null; + var label = isPresentation ? "grouping" : "frame"; + return "[".concat(quoteNamePadAfter(cursor)).concat(label, "]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BR"], + modes: ["item"], + tests: [ + function (cursor) { + try { + var walk = cursor.clone(); + // Walk until we hit the beginning of the page, find another BR, or find something with a name + while (walk.previous(function () { return true; }) && walk.getNode().nodeName.toUpperCase() !== "BR" && walk.getNameInfo() && walk.getNameInfo().name.trim().length === 0) + ; + return walk.getNode().nodeName.toUpperCase() === "BR" ? "[blank]" : null; + } + catch (err) { + console.error(err); + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["INPUT"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { var _a; return (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "password" && "[".concat(quoteNamePadAfter(cursor), "edit, protected").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]")) || null; }, + function (cursor, _oldCursor, mode) { + var _a, _b; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "file") { + var value = ((_b = cursor.getElement()) === null || _b === void 0 ? void 0 : _b.value) || ""; + value = value === "" ? "No file chosen" : value.substring("C:\\fakepath\\".length); + return "[".concat(quoteNamePadAfter(cursor), "button").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(quoteNamePadAfter(cursor)).concat(value, "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "color") { + var val = cursor.getElement().value; + var r = (Number("0x".concat(val.substring(1, 3))) * 100.0 / Number("0xff")).toFixed(0); + var g = (Number("0x".concat(val.substring(3, 5))) * 100.0 / Number("0xff")).toFixed(0); + var b = (Number("0x".concat(val.substring(5))) * 100.0 / Number("0xff")).toFixed(0); + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(r, "% red ").concat(g, "% green ").concat(b, "% blue]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "month") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] [spin button, ").concat(y, "] [menu button] [subMenu] Show month picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "date") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + var day = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [menu button] [subMenu] Show date picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "datetime-local") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var y = "0"; + var m = "0"; + var day = "0"; + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + if (date.getHours() === 0 || date.getHours() === 12) { + hour = "12"; + } + else if (date.getHours() < 12) { + hour = "" + date.getHours(); + } + else { + hour = "" + (date.getHours() - 12); + } + min = "" + date.getMinutes(); + ampm = date.getHours() >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show local date and time picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "time") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = val.split(":"); + var hours = parseInt(date[0]); + if (hours === 0 || hours === 12) { + hour = "12"; + } + else if (hours < 12) { + hour = "" + hours; + } + else { + hour = "" + (hours - 12); + } + min = date[1]; + ampm = hours >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "grouping clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), " [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show time picker [out of grouping]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "week") { + var val = cursor.getElement().value; // 2025-W38 + var year = "0"; + var week = "0"; + if (val.trim().length > 0) { + var date = val.split(/-W/); + year = date[0]; + week = date[1]; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(week, "], [spin button, ").concat(year, "] [menu button] [subMenu] Show week picker"); + } + return null; + }, + function (cursor) { var _a; return ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "hidden" ? "" : null; }, + function (cursor) { return (cursor.isStartTag() && "!![".concat(quoteNamePadAfter(cursor), "input!!]").concat(cursor.getElement().outerHTML)) || null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["LI"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var elem = cursor.getElement(); + if (window.getComputedStyle(elem).listStyleType === "none") { + return cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + return cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + ] + }), + // MathML elements + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MFRAC"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[fraction]" : "[end fraction]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MROW"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Only announce over on the end tag + if (cursor.isStartTag()) + return undefined; + var fraction = cursor.getCurrentOrParentByRoleClone([], ["mfrac"]); + if (fraction && ((_a = fraction.getElement().querySelectorAll("mrow")[0]) === null || _a === void 0 ? void 0 : _a.isSameNode(cursor.getNode()))) { + return "[over]"; + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSQRT"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[square root]" : "[end root]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSUP"], + modes: ["item"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isEndTag()) + return undefined; + var mi = ((_a = cursor.getElement().querySelector("mi")) === null || _a === void 0 ? void 0 : _a.innerHTML) || ""; + var mn = ((_b = cursor.getElement().querySelector("mn")) === null || _b === void 0 ? void 0 : _b.innerHTML) || ""; + if (mn === "2") + return "".concat(mi, " [squared]"); + if (mn === "3") + return "".concat(mi, " [cubed]"); + return "".concat(mi, " [to the ").concat(mn, "]"); + } + ] + }), + // Summary element — the disclosure button for a <details> widget. + // <summary> has implicitRole: null in ARIADefinitions so no role-based + // button rule fires. We add an explicit element rule that announces it as + // a button with the collapsed / expanded state from the parent <details>. + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["SUMMARY"], + modes: ["item", "button", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a, _b; + if (cursor.isEndTag()) + return ""; + var summaryElem = cursor.getElement(); + if (!summaryElem) + return null; + // Only the first <summary> that is a direct child of <details> + // acts as the disclosure button. + var detailsParent = summaryElem.parentElement; + if (!detailsParent || detailsParent.nodeName.toUpperCase() !== "DETAILS") + return null; + var firstSummary = Array.from(detailsParent.children).find(function (c) { return c.nodeName.toUpperCase() === "SUMMARY"; }); + if (!firstSummary || !firstSummary.isSameNode(summaryElem)) + return null; + var stateStr = detailsParent.hasAttribute("open") ? "expanded" : "collapsed"; + // <summary> has implicitRole: null so AccNameUtil may not compute a name; + // read aria-label first, then fall back to visible text content. + var ariaLabel = (_a = summaryElem.getAttribute("aria-label")) === null || _a === void 0 ? void 0 : _a.trim(); + var textContent = ((_b = summaryElem.textContent) === null || _b === void 0 ? void 0 : _b.trim()) || ""; + var label = ariaLabel || textContent; + var labelStr = label ? "\"".concat(label, "\", ") : ""; + // Description: prefer explicit aria-describedby; when aria-label is the + // name source, the subtree text becomes the description (accname-1.2 §4.3). + var descStr = getDescribedByAnnouncements(summaryElem, mode); + if (!descStr && ariaLabel && textContent) { + descStr = mode === "item" ? ", \u0001".concat(textContent, "\u0002") : ", \"".concat(textContent, "\""); + } + return "[".concat(labelStr, "button, ").concat(stateStr).concat(descStr, "]"); + } + ] + }), + // Multiple roles rules - placed at the bottom + // Default mode rules - Container elements (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "code", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "list", "main", + "mark", "navigation", "region", "row", "rowheader", "search", "table", "toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Default mode rules - Elements that screen readers typically ignore (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["paragraph", "rowgroup", "status", "strong", "subscript", "superscript", + "term", "time", "none", "presentation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/container_enter.ts" +/*!**********************************************************!*\ + !*** ./src/v4/simulator/render_rules/container_enter.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var SRTableUtil_1 = __webpack_require__(/*! ../SRTableUtil */ "./src/v4/simulator/SRTableUtil.ts"); +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +/** + * Generates the announcement text when entering a table cell + */ +function renderEnterTableCell(newCursor, oldCursor) { + var _a; + // We seem to be at the newline text node after the cell + if (oldCursor && ((_a = oldCursor.getNode()) === null || _a === void 0 ? void 0 : _a.nodeName) === "#text") { + oldCursor = oldCursor.clone(); + oldCursor.previous(function () { return true; }); + } + var newTableModel = SRTableUtil_1.SRTableUtil.getTableModel(newCursor); + var oldCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(oldCursor, newTableModel); + var newCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(newCursor, newTableModel); + if (!newCellInfo) + return ""; + var retVal = []; + // Announce row information if we've moved to a different row or the rowspan has changed + if (!oldCellInfo || oldCellInfo.rowIndexStart !== newCellInfo.rowIndexStart || oldCellInfo.rowspan !== newCellInfo.rowspan) { + // If a change in row or a change in rowSpan + var rowHeaders = SRTableUtil_1.SRTableUtil.getRowHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = rowHeaders && rowHeaders.trim().length > 0 ? "\"".concat(rowHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "row ").concat((newCellInfo.rowIndexStart + 1)).concat(newCellInfo.rowspan > 1 ? " through " + (newCellInfo.rowIndexStart + newCellInfo.rowspan) : "", "]")); + } + // Announce column information if we've moved to a different column or the colspan has changed + if (!oldCellInfo || oldCellInfo.colIndexStart !== newCellInfo.colIndexStart || oldCellInfo.colspan !== newCellInfo.colspan) { + // If a change in column or a change in colspan + var columnHeaders = SRTableUtil_1.SRTableUtil.getColumnHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = columnHeaders && columnHeaders.trim().length > 0 ? "\"".concat(columnHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "column ").concat((newCellInfo.colIndexStart + 1)).concat(newCellInfo.colspan > 1 ? " through " + (newCellInfo.colIndexStart + newCellInfo.colspan) : "", "]")); + } + return retVal.join(" "); +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item", "article", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + // Cell role + new SRRendererRule_1.SRRendererRule({ + roles: ["cell"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Columnheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["columnheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "complementary region]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "content info region]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[section]"; + } + else { + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "form region]"); + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item", "region"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + var elem = cursor.getElement(); + var hasSummary = Array.from(elem.children).some(function (c) { return c.nodeName.toUpperCase() === "SUMMARY"; }); + if (hasSummary) { + // The <summary> child speaks as the disclosure button; suppress + // the container-enter announcement entirely. + return ""; + } + // No explicit <summary>: in a real browser the UA injects a default + // "Details" summary. jsdom does not, so we announce the widget here + // as a fallback using the same default label a real browser would use. + return "[\"Details\", button, ".concat(elem.hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // -- tab_focus + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["tab_focus"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + var elem = cursor.getElement(); + var hasSummary = Array.from(elem.children).some(function (c) { return c.nodeName.toUpperCase() === "SUMMARY"; }); + if (hasSummary) { + // <summary> is the tab stop, not <details> itself. + return null; + } + // No <summary>: <details> itself is focusable (UA default behaviour). + return "[\"Details\", button, ".concat(elem.hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + return ""; + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var _a; + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // Count items, excluding those in other lists or within presentational containers + var numItems = 0; + for (var i = 0; i < descendantListItems.snapshotLength; i++) { + var item = descendantListItems.snapshotItem(i); + // Walk up ancestors to check for both nested lists and presentational containers + var isInOtherList = false; + var hasPresentationalAncestor = false; + var ancestor = item.parentElement; + while (ancestor && ancestor !== node) { + // Check if ancestor is another list + var ancestorRole = AriaUtil_1.AriaUtil.getResolvedRole(ancestor); + if (ancestorRole === "list" || + ancestor.nodeName.toUpperCase() === "UL" || + ancestor.nodeName.toUpperCase() === "OL") { + isInOtherList = true; + break; + } + // Check if ancestor has presentational children + if (ancestorRole && ((_a = ARIADefinitions_1.ARIADefinitions.designPatterns[ancestorRole]) === null || _a === void 0 ? void 0 : _a.presentationalChildren)) { + hasPresentationalAncestor = true; + break; + } + ancestor = ancestor.parentElement; + } + if (!isInOtherList && !hasPresentationalAncestor) { + numItems++; + } + } + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "list of ").concat(numItems, " items]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "main region]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers = document.evaluate(".//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers2 = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']/*[@role='menu']|.//*[@role='menu']//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + console.log("MENUBAR", cursor.isEndTag() ? "/" : "", cursor.getNode()); + console.log(descendantListItems, descendantListItemsInOtherLists); //, descendantContainers, descendantContainers2) + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; //-descendantContainers.snapshotLength+descendantContainers2.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "menubar with ").concat(numItems, " items]"); + } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Radio group role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.getNameInfo() === null) + return null; + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Row role + new SRRendererRule_1.SRRendererRule({ + roles: ["row"], + elems: [], + modes: ["item", "table"], + tests: [ + function () { return ""; } + ] + }), + // Rowheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var tableWalker = cursor.clone(); + // Get to the start of the table + while (tableWalker.getRole() !== "table" && tableWalker.previous(function () { return true; })) + ; + // Set an end to the table + var tableNode = tableWalker.getNode(); + var rows = 0; + var cols = 0; + // Sanity check that the table has content + if (tableWalker.getNode().firstChild) { + var firstRowComplete = false; + while (tableWalker.next(function () { return true; }) && !tableWalker.getNode().isSameNode(tableNode)) { + var role = tableWalker.getRole(); + if (tableWalker.isStartTag()) { + if (role === "row") { + ++rows; + } + else { + if (!firstRowComplete && ["cell", "rowheader", "columnheader"].includes(role)) { + var elem = tableWalker.getNode(); + cols += parseInt(elem.getAttribute("colspan") || "1"); + } + } + } + else if (role === "row") { + firstRowComplete = true; + } + } + } + return "[table with ".concat(rows, " ").concat(rows === 1 ? "row" : "rows", " and ").concat(cols, " ").concat(cols === 1 ? "column" : "columns").concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "toolbar]"); + } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//dt", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "definition list of ").concat(numItems, " terms]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[highlighted]"; } + ] + }), + // Inline frame (<iframe>) + // Only fires in item mode (where it produces the container-enter label on the parent + // block stop). In tab_focus mode the iframe element itself is the stop and the + // IFRAME SR_RULE in common.ts supplies the label directly — no container-enter needed. + // When role="none" or role="presentation" is set, screen readers treat the frame + // as a generic grouping — announce "grouping" instead of "frame". + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["item"], + tests: [ + function (cursor) { + var role = cursor.getElement().getAttribute("role"); + var isPresentation = role === "none" || role === "presentation"; + // An untitled presentational iframe has no meaningful grouping label to + // announce — suppress the container-enter entirely. + if (isPresentation && !cursor.getName()) + return null; + var label = isPresentation ? "grouping" : "frame"; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(label, "]"); + } + ] + }), + // Preformatted text (<pre>) + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["PRE"], + modes: ["item"], + tests: [ + function (cursor) { return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "preformatted text]"); } + ] + }), + // Multiple roles rules - placed at the bottom + // Heading mode rules - ignore container elements in heading mode (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "region", + "row", "rowheader", "search", "toolbar", "list", "main", "navigation", "table"], + elems: [], + modes: ["heading"], + tests: [ + function () { return ""; } + ] + }) +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/containter_exit.ts" +/*!**********************************************************!*\ + !*** ./src/v4/simulator/render_rules/containter_exit.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "complementary region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "content info region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[out of figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[out of section]"; + } + else { + return "[out of form]"; + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // <details> uses the group role but has its own disclosure widget semantics; + // SRs do not announce "out of grouping" when leaving a details element. + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + return ""; + } + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + return "[out of grouping]"; + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "out of list]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "main region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (_cursor) { return "[out of menubar]"; } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // radiogroup role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (_cursor) { return "[out of grouping]"; } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of table]"; } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of toolbar]"; } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["ABBR"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.getElement().hasAttribute("title") ? + "[".concat(cursor.getElement().getAttribute("title"), "]") : null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of definition list]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of highlighted]"; } + ] + }), + // Inline frame (<iframe>) + // When role="none" or role="presentation" is set, screen readers treat the frame + // as a generic grouping — announce "out of grouping" instead of "out of frame". + // Exception: an untitled presentational iframe produces no container-enter label, so + // the matching container-exit must also be suppressed to avoid a stray "[out of grouping]". + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["item"], + tests: [ + function (cursor) { + var role = cursor.getElement().getAttribute("role"); + var isPresentation = role === "none" || role === "presentation"; + if (isPresentation && !cursor.getName()) + return null; + return isPresentation ? "[out of grouping]" : "[out of frame]"; + } + ] + }), + // Preformatted text (<pre>) + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["PRE"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of preformatted text]"; } + ] + }), + // Multiple roles rules - placed at the bottom + // Region mode rules - ignore container elements in region and heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["group", "article", "banner", "blockquote", "caption", "complementary", + "contentinfo", "figure", "form", "list", "region", "main", "navigation", + "search", "table", "toolbar"], + elems: [], + modes: ["region", "heading"], + tests: [ + function () { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/index.ts" +/*!************************************************!*\ + !*** ./src/v4/simulator/render_rules/index.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CONTAINER_EXIT_RULES = exports.CONTAINER_ENTER_RULES = exports.SR_RULES = void 0; +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +var container_enter_1 = __webpack_require__(/*! ./container_enter */ "./src/v4/simulator/render_rules/container_enter.ts"); +var containter_exit_1 = __webpack_require__(/*! ./containter_exit */ "./src/v4/simulator/render_rules/containter_exit.ts"); +exports.SR_RULES = common_1.RULES; +exports.CONTAINER_ENTER_RULES = container_enter_1.RULES; +exports.CONTAINER_EXIT_RULES = containter_exit_1.RULES; + + +/***/ }, + +/***/ "./src/v4/util/AccNameUtil.ts" +/*!************************************!*\ + !*** ./src/v4/util/AccNameUtil.ts ***! + \************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AccNameUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil = /** @class */ (function () { + function AccNameUtil() { + } + /** + * Computes the accessible name for an SVG element according to W3C specification + * Following the Accessible Name and Description Computation 1.1 algorithm + * https://www.w3.org/TR/accname-1.1/ + * + * @param elem The SVG element + * @returns The accessible name result or null if no accessible name is found + */ + AccNameUtil.computeAccessibleNameForSVGElementW3C = function (elem) { + if (!elem || elem.nodeName.toLowerCase() !== 'svg') + return null; + // Step 1: Check for aria-labelledby (already handled by main computeAccessibleName function) + // Step 2: Check for aria-label (already handled by main computeAccessibleName function) + // Step 3: Check for title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_1 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_1 += title.trim(); + } + }); + if (text_1 && text_1.trim() !== '') + return { "name": text_1.trim(), "nameFrom": "svgTitle" }; + } + // Step 4: Check for text content in SVG text elements + var textContent = ""; + var textElements = elem.querySelectorAll("text, textPath, tspan"); + if (textElements && textElements.length > 0) { + textElements.forEach(function (textElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(textElement) && !VisUtil_1.VisUtil.isNodePresentational(textElement)) { + var content = textElement.textContent; + if (content && content.trim() !== '') + textContent += " " + content.trim(); + } + }); + if (textContent.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(textContent.trim()), "nameFrom": "svgText" }; + } + // Step 5: Check for xlink:title attribute on links within SVG + var links = elem.querySelectorAll("a"); + for (var i = 0; i < links.length; i++) { + var link = links[i]; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(link) && !VisUtil_1.VisUtil.isNodePresentational(link)) { + var xlinkTitle = link.getAttribute("xlink:title"); + if (xlinkTitle && xlinkTitle.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(xlinkTitle), "nameFrom": "svglinkTitle" }; + } + } + // Step 6: Check for aria-describedby or aria-description + var description = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (description && description.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(description), "nameFrom": "aria-description" }; + // Step 7: Check for desc element + var descElements = elem.querySelectorAll(":scope > desc"); + if (descElements && descElements.length > 0) { + var descText_1 = ""; + descElements.forEach(function (descElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(descElement) && !VisUtil_1.VisUtil.isNodePresentational(descElement)) { + var desc = descElement.textContent; + if (desc && desc.trim() !== '') + descText_1 += " " + desc.trim(); + } + }); + if (descText_1.trim() !== '') + return { "name": descText_1.trim(), "nameFrom": "svgDesc" }; + } + // Step 8: Check for title attribute + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title"); + if (title && title.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(title), "nameFrom": "title" }; + } + // No accessible name found + return null; + }; + // calculate accessible name for a given node + AccNameUtil.computeAccessibleName = function (elem) { + if (!elem) + return null; + var nodeName = elem.nodeName.toLowerCase(); + var name_pair = CacheUtil_1.CacheUtil.getCache(elem, "ELEMENT_ACCESSBLE_NAME", undefined); + if (name_pair !== undefined) + return name_pair; + // 1. name from author, or elements without a role but with aria-labelledby or aria-label + // get aria label even for the role where the name is prohibited or is 'presentation' or 'none' + var accName = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (accName && accName.trim() !== "") { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }); + return { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }; + } + // 2. accessible name mapping for native html elements + name_pair = AccNameUtil.computeAccessibleNameForNativeElement(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + // 3. name from native or aria attribute + /**name_pair = AccNameUtil.computeAccessibleNameFromAttribute(elem); + if (name_pair) { + CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + }*/ + // 4. name from content for custom elements with a role + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) { + name_pair = AccNameUtil.computeAccessibleNameFromContent(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + } + // 5. name from the global attribute "title" + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title").trim(); + if (title && title.trim().length > 0) { + title = CommonUtil_1.CommonUtil.truncateText(title); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": title, "nameFrom": "title" }); + return { "name": title, "nameFrom": "title" }; + } + } + // 6. name from the attribute "placeholder" + if (nodeName === 'textarea' || (nodeName === 'input' && (!elem.hasAttribute("type") || CommonUtil_1.CommonUtil.input_type_with_placeholder.includes(elem.getAttribute("type"))))) { + var placeholder = elem.getAttribute("placeholder"); + if (placeholder && placeholder.trim().length > 0) { + placeholder = CommonUtil_1.CommonUtil.truncateText(placeholder); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": placeholder, "nameFrom": "placeholder" }); + return { "name": placeholder, "nameFrom": "placeholder" }; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", null); + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForNativeElement = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + // labellable fields + if (CommonUtil_1.CommonUtil.form_labelable_elements.includes(nodeName)) { + // Get only the non-hidden labels for element + var label = CommonUtil_1.CommonUtil.getFormFieldLabel(elem); + if (label && label.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // input types: button, reset, submit, image + if (nodeName === "input" && elem.hasAttribute("type")) { + if (CommonUtil_1.CommonUtil.form_button_types.includes(elem.getAttribute("type"))) { + // input types: button, reset, submit + // Get the "value" attribute for the element + var value = CommonUtil_1.CommonUtil.getElementAttribute(elem, "value"); + if (value && value.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(value), "nameFrom": "value" }; + // input 'submit' and 'reset' have visible defaults so pass if there is no explicit 'value' attribute + var type = elem.getAttribute("type"); + if (type === 'submit' || type === 'reset') + return { "name": type, "nameFrom": "internal" }; + } + else if (elem.getAttribute("type") === 'image') { + // input type = 'image' + // note that though HTML 5 spec indicates "The element's [value] attribute must be omitted", Chrome uses the value. + // Get the accessible name for the alt attribute + var alt = CommonUtil_1.CommonUtil.getElementAttribute(elem, "alt"); + if (alt && alt.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + ; + // the visible default text for type "image" is "Submit" same with the type "submit" + //return {"name":elem.getAttribute("type"), "nameFrom": "internal"}; + } + } + // button + // note button may have a value attribute, but it's not a visible text + if (nodeName === "button") { + // first use the button text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + // for image button: get the first image if exists + var image = elem.querySelector('img'); + if (image && !VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + // for a button with a svg image + var svg = elem.querySelector('svg'); + if (svg && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svg) && !VisUtil_1.VisUtil.isNodePresentational(svg)) { + var pair = AccNameUtil.computeAccessibleName(svg); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + } + // fieldset + if (nodeName === "fieldset") { + // if the fieldset element's first child is a legend element, then use the subtree of the legend + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'legend') { + // legend can be mixed text + var text = first.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + } + // output + if (nodeName === "output") { + // if the associated label element exists, use concatenated accessible name(s) from labelled elements. + if (elem.hasAttribute("for")) { + var labelIDs = elem.getAttribute("for").trim().split(" "); + if (labelIDs && labelIDs.length > 0) { + var label = ""; + for (var j = 0; j < labelIDs.length; j++) { + var labelNode = elem.ownerDocument.getElementById(labelIDs[j]); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elem) && !VisUtil_1.VisUtil.isNodeHiddenFromAT(labelNode) && !VisUtil_1.VisUtil.isNodePresentational(labelNode)) { + var pair = AccNameUtil.computeAccessibleName(labelNode); + if (pair && pair.name && pair.name.trim().length > 0) + label += " " + CommonUtil_1.CommonUtil.normalizeSpacing(pair.name); + } + } + if (label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + } + } + // summary + if (nodeName === "summary") { + // use summary element subtree + var text = elem.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + // details + if (nodeName === "details") { + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'summary') { + // get accessible name from summary + var pair = AccNameUtil.computeAccessibleName(first); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(pair.name.trim()), "nameFrom": "summary" }; + } + // If no summary element as a direct child of the details element, + // the user agent should provide one with a subtree containing a localized string of the word "details". + return { "name": "details", "nameFrom": "internal" }; + } + // figure + if (nodeName === "figure") { + // if the figure element has a figcaption as a child + var caption = CommonUtil_1.CommonUtil.getChildByTagHidden(elem, "figcaption", true, false); + if (caption && caption.length > 0) { + // figcaption can be mixed text + var text = caption[0].innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "figcaption" }; + } + } + // img elements: use attribute "alt" + if (nodeName === "img") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // area elements: use attribute "alt" + if (nodeName === "area") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + if (alt && alt.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // table element + if (nodeName === "table") { + // if the figure element has a caption as the first child + var captionElem = elem.firstElementChild; + if (captionElem && captionElem.nodeName.toLowerCase() === 'caption') { + // caption can be mixed text + var caption = captionElem.innerText; + if (caption && caption.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(caption), "nameFrom": "caption" }; + } + } + // a element + if (nodeName === "a") { + // first use the link text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + //for image link: get the image or svg if exists + var images = elem.querySelectorAll(":scope > img, :scope > svg"); + if (images && images.length > 0) { + var text_2 = ""; + images.forEach(function (image) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + text_2 += " " + pair.name.trim(); + } + }); + if (text_2.trim() !== '') + return { "name": text_2.trim(), "nameFrom": "alt" }; + } + } + // optgroup + // label participate in accessible name calculation: https://www.w3.org/TR/html-aam-1.0/#att-label + // The label attribute must be specified. Its value gives the name of the group + // the value is disabled in the interface + if (nodeName === "optgroup" || nodeName === "option" || nodeName === "track") { + var label = elem.getAttribute("label"); + if (label && label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // svg + if (nodeName === "svg") { + var pair = AccNameUtil.computeAccessibleNameForSVGElementW3C(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForSVGElement = function (elem) { + // 1. a direct child or descendant title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_3 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_3 += title.trim(); + } + }); + if (text_3 && text_3.trim() !== '') + return { "name": text_3.trim(), "nameFrom": "svgTitle" }; + } + // 2. xlink:title attribute on a link + var linkTitle = elem.querySelector("a"); + if (linkTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(linkTitle) && !VisUtil_1.VisUtil.isNodePresentational(linkTitle)) { + var link = linkTitle.getAttribute("xlink:title"); + if (link && link.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(link), "nameFrom": "svglinkTitle" }; + } + /** 3. for text container elements, the text content. + * note the SVG text content elements are: ‘text’, ‘textPath’ and ‘tspan’. + * svg element can be nested. One of the purposes is to to group SVG shapes together as a collection for responsive design. + * + * select text content excluded the text from the nested svg elements and their children + */ + var text = ""; + elem.querySelectorAll(":scope > *").forEach(function (element) { + if (element.nodeName.toLowerCase() !== 'svg' && !VisUtil_1.VisUtil.isNodeHiddenFromAT(element) && !VisUtil_1.VisUtil.isNodePresentational(element)) { + var value = CommonUtil_1.CommonUtil.getInnerText(element); + if (value && value.trim().length > 0) + text += value; + } + }); + if (text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "svgText" }; + // 4. from aria-describedby or aria-description + var descby = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (descby && descby.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(descby), "nameFrom": "aria-description" }; + // 5. a direct child or descendant desc element + var descElems = elem.querySelectorAll(":scope > desc"); + if (descElems && descElems.length > 0) { + var text_4 = ""; + descElems.forEach(function (descElem) { + if (descElem && !VisUtil_1.VisUtil.isNodeHiddenFromAT(descElem) && !VisUtil_1.VisUtil.isNodePresentational(descElem)) { + var desc = descElem.textContent; + if (desc && desc.trim() !== '') + text_4 += desc.trim(); + } + }); + if (text_4 && text_4.trim() !== '') + return { "name": text_4.trim(), "nameFrom": "svgDesc" }; + } + }; + // calculate accessible name for custom elements marked with aria + AccNameUtil.computeAccessibleNameFromContent = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + /** for acc name from content, the content from CSS pseudo-elements + * :before and :after pseudo elements [CSS2] can provide textual content for elements that have a content model. + * For :before or :after pseudo elements, user agents must prepend CSS textual content, without a space, + * to the textual content of the current node. + */ + var pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "before"); + if (pair !== null && pair.name && pair.name.trim().length > 0) + return pair; + pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "after"); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + // shadow host + if (elem.shadowRoot) { + pair = AccNameUtil.computeAccessibleNameForShadowHost(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "shadow" }; + ; + } + // slot element + if (nodeName === "slot") { + pair = AccNameUtil.computeAccessibleNameForSlotElement(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "slot" }; + } + // otherwise: get the value from the element + pair = AccNameUtil.computeAccessibleNameFromChildren(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "content" }; + // no accessible name exists + return null; + }; + // calculate accessible name from CSS generated content + AccNameUtil.computeAccessibleNameForCSSPseudoElement = function (elem, type) { + var contentElem = elem.ownerDocument.defaultView.getComputedStyle(elem, type); + if (contentElem) { + var content = contentElem.content; + if (content && content !== "none" && content !== "no" && content !== "normal") { + content = content.replace(/^"/, "").replace(/"$/, ""); + if (content.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(content), "nameFrom": "css-" + type }; + } + } + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForShadowHost = function (elem) { + var text = ""; + var shadowRoot = elem.shadowRoot; + if (shadowRoot) { + var children = shadowRoot.querySelectorAll('*'); + // check text from all the children elements + children.forEach(function (child) { + var pair = AccNameUtil.computeAccessibleName(child); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + }); + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "shadow-host" }; + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForSlotElement = function (elem) { + //if no assignedNode, check its own text + var text = ""; + if (!elem.assignedNodes() || elem.assignedNodes().length === 0) { + var pair = AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + } + else { + // check text from all assigned nodes + for (var _i = 0, _a = elem.assignedNodes(); _i < _a.length; _i++) { + var slotChild = _a[_i]; + var pair = AccNameUtil.computeAccessibleName(slotChild); + if (pair && pair.name && pair.name.length > 0) + text += " " + pair.name.trim(); + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content-slot" }; + return null; + }; + // calculate accessible name from children content + AccNameUtil.computeAccessibleNameFromChildren = function (elem) { + var text = ""; + //let walkChild = elem.firstChild; + var nw = new DOMWalker_1.DOMWalker(elem); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + //while (walkChild) { + var walkChild = nw.node; + if (walkChild.nodeType === 3) { + // for the text node, get the parentnode to check visibility + var parent_1 = walkChild.parentElement; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(parent_1) && !VisUtil_1.VisUtil.isNodePresentational(parent_1) && walkChild.nodeValue && walkChild.nodeValue.trim().length > 0) { + text += " " + walkChild.nodeValue.trim(); + } + } + else if (walkChild.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(walkChild) && !VisUtil_1.VisUtil.isNodePresentational(walkChild)) { + var pair = AccNameUtil.computeAccessibleName(walkChild); + if (pair && pair.name && pair.name.length > 0) { + text += " " + pair.name.trim(); + nw.bEndTag = true; + } + // Skip children if this element only has presentational children + else if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(nw.node)) { + nw.bEndTag = true; + } + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content" }; + return null; + }; + // if accessible name can be ignored for image or svg + AccNameUtil.isAccessibleNameIgnorable = function (elem) { + if (!elem) + return false; + var nodeName = elem.nodeName.toLowerCase(); + if (nodeName !== 'img' && nodeName !== 'svg') + return false; + var parent = elem.parentElement; + if (parent) { + // if the parent is a widget and has an aria label, then image/svg label is not necessary + if ((AriaUtil_1.AriaUtil.isWidget(parent) || AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(parent)) && AriaUtil_1.AriaUtil.hasAriaLabel(parent)) + return true; + } + return false; + }; + return AccNameUtil; +}()); +exports.AccNameUtil = AccNameUtil; + + +/***/ }, + +/***/ "./src/v4/util/AriaUtil.ts" +/*!*********************************!*\ + !*** ./src/v4/util/AriaUtil.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AriaUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ./AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AriaUtil = /** @class */ (function () { + function AriaUtil() { + } + AriaUtil.isDefinedAriaAttributeAtIndex = function (ele, index) { + var attrName = ele.attributes[index].name; + return AriaUtil.isDefinedAriaAttribute(ele, attrName); + }; + /** + * this method returns user-defined aria attribute name from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributes = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push(attrName); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributes = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push(attrName); + } + } + return htmlAttributes; + }; + /** + * this method returns user-defined aria attribute name-value pair from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributeNameValuePairs = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push({ name: attrName, value: attrValue }); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name-value pair from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributeNameValuePairs = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push({ name: attrName, value: attrValue }); + } + } + return htmlAttributes; + }; + /** + * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true" + */ + AriaUtil.getAriaAttribute = function (ele, attributeName) { + // If the attribute is defined, it takes precedence + var retVal = ele.getAttribute(attributeName); + if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check + return retVal; + } + // Then determine implicit values from other attributes + if (!retVal) { + var tag = ele.nodeName.toLowerCase(); + if (attributeName in AriaUtil.ariaAttributeImplicitMappings) { + if (tag in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName][tag]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + else if ("*" in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName]["*"]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + } + // Check role-based defaults + if (!retVal) { + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele); + if (role in AriaUtil.ariaAttributeRoleDefaults && attributeName in AriaUtil.ariaAttributeRoleDefaults[role]) { + retVal = AriaUtil.ariaAttributeRoleDefaults[role][attributeName]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + // Still not defined? Check global defaults + if (!retVal && attributeName in AriaUtil.ariaAttributeGlobalDefaults) { + retVal = AriaUtil.ariaAttributeGlobalDefaults[attributeName]; + } + return retVal; + }; + AriaUtil.isDefinedAriaAttribute = function (ele, attrName) { + var isDefinedAriaAttribute = false; + if (attrName.substring(0, 5) === 'aria-') { + // User agents SHOULD treat state and property attributes with a value of "" the same as they treat an absent attribute. + isDefinedAriaAttribute = ele.hasAttribute && ele.hasAttribute(attrName) && ele.getAttribute(attrName).length > 0; + } + return isDefinedAriaAttribute; + }; + /** + * WAI-ARIA’s role attribute may have a list of values, but only the first valid and supported WAI-ARIA role is used + * https://www.w3.org/TR/wai-aria-implementation/#mapping_role_table + * This function is responsible for retrieving the resoled role for an element. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return string - resolved role for the element: + * explicit role: resoled from the list of values + * implicit role: if not explicitely specified, or none of the specified role values is allowed for the element + * null: if none of the specified role values is allowed for the element, neither implicit role exists + * + * @memberOf AriaUtil + */ + AriaUtil.getResolvedRole = function (elem, considerImplicitRoles) { + if (considerImplicitRoles === void 0) { considerImplicitRoles = true; } + if (!elem) + return null; + var role = CacheUtil_1.CacheUtil.getCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", null); + if (role === null) { + var roles = AriaUtil.getUserDefinedRoles(elem); + var tagProperty = AriaUtil.getElementAriaProperty(elem); + var allowedRoles = AriaUtil.getAllowedAriaRoles(elem, tagProperty); + var containsGeneric = false; + if (roles && roles.length > 0 && allowedRoles && allowedRoles.length > 0) { + for (var i = 0; i < roles.length; i++) { + if (allowedRoles.includes("any") || allowedRoles.includes(roles[i])) { + if (allowedRoles.includes("any") && roles[i] === 'generic') { + containsGeneric = true; + continue; + } + role = roles[i]; + if (role === "presentation" || role === "none") { + // If element is focusable, then presentation roles are to be ignored + if (CommonUtil_1.CommonUtil.isFocusable(elem)) { + //reset rule to null + role = null; + continue; + } + } + break; + } + } + if (containsGeneric) + role = 'generic'; + } + if (role === null && considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(elem); + role = implicitRole && implicitRole.length > 0 ? implicitRole[0] : undefined; + } + CacheUtil_1.CacheUtil.setCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", role); + } + return role !== undefined ? role : null; + }; + /** + * This function is responsible for retrieving user defined element's roles from dom. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} roles - list of user defined roles in the element role attribute. + * + * @memberOf AriaUtil + */ + AriaUtil.getUserDefinedRoles = function (ele) { + return AriaUtil.getRoles(ele, false); + }; + /** + * This function is responsible for retrieving element's roles. + * This function also finds implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} roles - list of attribute roles and implicit roles. + * + * @memberOf AriaUtil + */ + AriaUtil.getRoles = function (ele, considerImplicitRoles) { + var roles = []; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + var attrRoles = CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("role").trim()).split(" "); + for (var i = 0; i < attrRoles.length; ++i) { + roles.push(attrRoles[i]); + } + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + //add implicit roles to the attributes roles. + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, roles); + } + } + return roles; + }; + /** + * Returns the implicit role of the elemement + * @parm {HTMLElement} ele - element for which to find role. + * + * @return the implicit role or [] if doesn't exist + * + * @memberOf AriaUtil + */ + AriaUtil.getImplicitRole = function (ele) { + if (!ele || ele.nodeType !== 1) + return null; + var implicitRoles = CacheUtil_1.CacheUtil.getCache(ele, "AriaUtil_ImplicitRole", null); + if (!implicitRoles) { + var tagProperty = AriaUtil.getElementAriaProperty(ele); + // check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole) { + if (tagProperty.implicitRole.includes("generic")) { + // the 'generic' role is only allowed if a valid aria attribute exists. + var domAriaAttributes_1 = AriaUtil.getUserDefinedAriaAttributes(ele); + if (domAriaAttributes_1.length === 0) { + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + var roleAttributes = []; + var pattern = ARIADefinitions_1.ARIADefinitions.designPatterns['generic']; + if (pattern.reqProps && pattern.reqProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(pattern.reqProps, roleAttributes); + if (tagProperty.globalAriaAttributesValid) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(ARIADefinitions_1.ARIADefinitions.globalProperties, roleAttributes); + if (pattern.deprecatedProps && pattern.deprecatedProps.length > 0) + CommonUtil_1.CommonUtil.reduceArrayItemList(pattern.deprecatedProps, roleAttributes); + // remove 'generic' role if roleAttributes doesn't contain any of domAriaAttributes + if (roleAttributes.length > 0 && !roleAttributes.some(function (attr) { return domAriaAttributes_1.includes(attr); })) { + var implicit = CommonUtil_1.CommonUtil.reduceArrayItemList(['generic'], tagProperty.implicitRole); + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", implicit); + return implicit; + } + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", tagProperty.implicitRole); + return tagProperty.implicitRole; + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + return implicitRoles; + }; + /** + * Returns the required properties of the role + * @parm {string} role - the role + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} properties - list of properties that are required by the role + * + * @memberOf AriaUtil + */ + AriaUtil.getRoleRequiredProperties = function (role, ele) { + if (role === null) { + return null; + } + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + var requiredAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqProps; + // handle special case of separator + if (role.toLowerCase() === "separator" && ele && CommonUtil_1.CommonUtil.isFocusable(ele)) { + requiredAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []); + } + return requiredAttributes; + } + else { + return null; + } + }; + /** + * This function is responsible for finding if a element has given role. + * This function aslo finds if element has given roles as implicit role. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - true or false based on if th element has the specified role. + * + * @memberOf AriaUtil + * + * Consider to use hasRoleInSemantics() instead. + */ + AriaUtil.hasRole = function (ele, role, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] === role; + } + } + } + //if none of the the attribute roles matched with given role + //check if implicit roles matches. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + var wRoles = []; + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, wRoles); + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] === role; + } + } + } + } + return retVal; + }; + /** + * Checks if the element has the role, including the implied role if role is not explicitly specified. + * + * This function is replacing the hasRole function + * + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * + * @return {List} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasRoleInSemantics = function (ele, role) { + var retVal = false; + var roleSpecified = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] === role; + } + } + } + if (roleSpecified) { + return retVal; + } + //check if implicit roles matches. + //Note: element can have multiple implicit roles + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) { + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] === role; + } + } + } + return retVal; + }; + /** + * This function is responsible for finding if a element has given role. + * This function also checks if element has given roles as implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {bool} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasAnyRole = function (ele, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + retVal = true; + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) + retVal = true; + } + return retVal; + }; + AriaUtil.isPresentationalElement = function (node) { + // Elements extracted from https://developer.mozilla.org/en/docs/Web/HTML/Element#Inline_text_semantics, + // http://dev.w3.org/html5/html-author/#text-level-semantics and https://wiki.whatwg.org/wiki/Presentational_elements_and_attributes + var presentationalElements = ["abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn", + "em", "i", "kbd", "mark", "q", "rp", "rt", "rtc", "ruby", "s", + "samp", "small", "span", "strong", "sub", "sup", "time", "u", + "var", "wbr", "a", "progress", "meter", "basefont", "big", "center", + "strike", "tt", "font", "blink", "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "blockquote", "p" + ]; + return CommonUtil_1.CommonUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements); + }; + /** + * return the ancestor of the given element and role. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (considerImplicitRoles) { + if (AriaUtil.hasRoleInSemantics(walkNode, roleName)) { + break; + } + } + else { + if (AriaUtil.hasRole(walkNode, roleName, false)) { + break; + } + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + /** + * return the ancestor of the given element and roles. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roles - the role names to search for + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRoles = function (element, roleNames) { + if (!element || !roleNames || !roleNames.length || roleNames.length === 0) + return null; + var walkNode = element; + while (walkNode !== null) { + var role = AriaUtil.getResolvedRole(walkNode); + if (role !== null && + (roleNames.includes(role) || + (roleNames.includes("*") && !["presentation", "none"].includes(role)))) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getRolesWithTypes = function (element, types) { + if (!element || !types || !types.length || types.length === 0) + return null; + var roles = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "roles_with_given_types", null); + if (!roles || roles.length === 0) { + roles = []; + Object.entries(ARIADefinitions_1.ARIADefinitions.designPatterns).forEach(function (_a) { + var key = _a[0], value = _a[1]; + if (types.includes(value.roleType)) + roles.push(key); + }); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "roles_with_given_types", roles); + } + return roles; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.isWidget = function (element) { + if (!element) + return false; + var widget = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "is_element_widget", null); + if (widget === null) { + var ret = false; + var role = AriaUtil.getResolvedRole(element); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') + ret = true; + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "is_element_widget", ret); + return ret; + } + return widget; + }; + /** + * return if the element is owned or controlled by another element. + * If an ancestor of an element is owned or controlled by another element, then the element is also considered as owned or controlled. + * an element can be owned or controlled by another element through aria-owns or aria-controls + * when the DOM hierarchy cannot be used to represent the relationship. + * aria-owns attribute is used to define contextual relationship with a owning parent + * aria-controls attribute is used to associate an element with the controlling element. + * example elements with roles: combobox, scrollbar, tab, button, listbox, menu, menubar, radiogroup, tree, treegrid + * + * when an element is owned or controlled by another element, its navigation may be controlled by the parent + * through aria-activedescendants attribute or roving tabindex + * + * Note navigation with native combobox (input with a datalist) is in native focus navigation, not considered here + * + * @parm {element} element - The element to inspect + * @return {boolean} + * + * @memberOf AriaUtil + */ + AriaUtil.isNavigationOwnedOrControlled = function (element) { + if (!element) + return false; + var ownerElems = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", null); + if (ownerElems !== null && ownerElems.length > 0) { + if (CommonUtil_1.CommonUtil.getAncestor(element, ownerElems)) + return true; + } + var role = AriaUtil.getResolvedRole(element); + if (!role) + return false; + var id = element.getAttribute("id"); + if (!id || id.trim().length === 0) + return false; + var elem = element.ownerDocument.querySelector("*[aria-controls~='".concat(id, "'], *[aria-owns~='").concat(id, "']")); + if (!elem) + return false; + var containers = ['combobox', 'scrollbar', 'button', 'tab', 'listbox', 'menu', 'menubar', 'radiogroup', 'tree', 'treegrid']; + if (containers.includes(role)) { + if (ownerElems === null) + ownerElems = []; + ownerElems.push(element); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", ownerElems); + return true; + } + return false; + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function by default will not consider Check Hidden Setting at all. + * + * Note: This is a wrapper function to: AriaUtil.getSiblingWithRoleHidden + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRole = function (element, role) { + return AriaUtil.getSiblingWithRoleHidden(element, role, false); + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function also considers implicit roles for the elements. + * + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicit - true or false based on if Implicit roles should be considered. + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRoleHidden = function (element, role, considerHiddenSetting, considerImplicitRole) { + // Variable Declaration + var walkNode = null; + var hasRole = false; + // Only perform the check if element and role are both provided + if (element && role) { + // Fetch the next sibling element + walkNode = element.nextSibling; + // Keep looping over the next siblings to find element which matches + // the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.nextSibling; + continue; + } + // Check if this node has the role that we need to check exists + if (considerImplicitRole) { + hasRole = AriaUtil.hasRoleInSemantics(walkNode, role); + } + else { + hasRole = AriaUtil.hasRole(walkNode, role, false); + } + // Move on to the next node + walkNode = walkNode.nextSibling; + } + // If we still have not found a node that matches the role, start a reverse look up + if (!walkNode) { + // Fetch the previous Sibling of this element + walkNode = element.previousSibling; + // Keep looping over all the previous siblings to search for an element which + // matches the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.previousSibling; + continue; + } + // Check if this node has the role that we need to check exists + hasRole = AriaUtil.hasRole(walkNode, role, considerImplicitRole); + // Move on to the next node + walkNode = walkNode.previousSibling; + } + } + } + return walkNode; + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getDescendantWithRoleHidden + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRole = function (element, roleName) { + return AriaUtil.getDescendantWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendant = null; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (considerImplicitRoles ? AriaUtil.hasRoleInSemantics(nw.node, roleName) : AriaUtil.hasRole(nw.node, roleName, false)) { + descendant = nw.node; + break; + } + } + return descendant; + }; + /** + * This function is responsible for getting All descendant elements with the specified roles, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string[]} roleNames - The roles to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - all descendant elements that match the roles specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoles = function (element, roleNames, considerHiddenSetting, considerImplicitRoles) { + if (!roleNames || roleNames.length === 0) + return; + // Variable Decleration + var descendants = []; + roleNames.forEach(function (roleName) { + var kids = AriaUtil.getAllDescendantsWithRoleHidden(element, roleName, considerHiddenSetting, considerImplicitRoles); + if (kids && kids.length > 0) + descendants = descendants.concat(kids); + }); + return descendants; + }; + /** + * This function is responsible for getting All descendant elements with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - The descendant elements that match the role specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendants = []; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + if (nw.bEndTag) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (AriaUtil.hasRole(nw.node, roleName, considerImplicitRoles)) { + descendants.push(nw.node); + } + } + return descendants; + }; + /** + * This function is responsible for getting All direct children in AT tree with a role (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree that has a role + * + * @memberOf AriaUtil + */ + AriaUtil.getDirectATChildren = function (element) { + var requiredChildRoles = AriaUtil.getRequiredChildRoles(element, true); + var direct = []; + AriaUtil.retrieveDirectATChildren(element, requiredChildRoles, direct); + return direct; + }; + /** + * This function is responsible for recursively any child path till either no child or a child with a role is found (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree + * + * @memberOf AriaUtil + */ + AriaUtil.retrieveDirectATChildren = function (element, requiredChildRoles, direct) { + var children = []; + if (element.children !== null && element.children.length > 0) { + for (var i = 0; i < element.children.length; i++) { + children.push(element.children[i]); + } + } + // if the element contains "aria-own" attribute, then the aria-owned children need to be included too + var owned = element.getAttribute("aria-owns"); + if (owned) { + var doc = element.ownerDocument; + if (doc) { + var ownedIds = owned.split(" "); + for (var i = 0; i < ownedIds.length; i++) { + var ownedElem = doc.getElementById(ownedIds[i]); + if (ownedElem) { + children.push(ownedElem); + } + } + } + } + if (children.length > 0) { + for (var i = 0; i < children.length; i++) { + //ignore hidden and invisible child + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(children[i]) || !VisUtil_1.VisUtil.isNodeVisible(children[i])) + continue; + var roles = AriaUtil.getRoles(children[i], false); + if (roles === null || roles.length === 0) { + roles = AriaUtil.getImplicitRole(children[i]); + } + if (roles && roles !== null && roles.length > 0) { + //remove 'none' and 'presentation' + roles = roles.filter(function (role) { + return role !== "none" && role !== "presentation"; + }); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (roles.includes("group") && requiredChildRoles && requiredChildRoles.includes('group')) { + roles = roles.filter(function (role) { + return role !== 'group'; + }); + } + } + if (roles && roles !== null && roles.length > 0) { + direct.push(children[i]); + } + else { + // recursive until get a return value, + AriaUtil.retrieveDirectATChildren(children[i], requiredChildRoles, direct); + } + } + return null; + } + else + return null; + }; + /** + * this function returns null or required child roles for a given element with one more roles, + * return null if the role is 'none' or 'presentation' + * @param element + * @param includeImplicit include implicit roles if no role is explicitly provided + * @returns + */ + AriaUtil.getRequiredChildRoles = function (element, includeImplicit) { + var roles = AriaUtil.getRoles(element, false); + // if explicit role doesn't exist, get the implicit one + if ((!roles || roles.length === 0) && includeImplicit) { + roles = AriaUtil.getImplicitRole(element); + } + /** + * ignore if the element doesn't have any explicit or implicit role + */ + if (!roles || roles.length === 0) { + return null; + } + /** + * ignore if the element contains none or presentation role + */ + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var requiredChildRoles = new Array(); + for (var j = 0; j < roles.length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].reqChildren !== null) { + requiredChildRoles = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(designPatterns[roles[j]].reqChildren, requiredChildRoles); + } + } + return requiredChildRoles; + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getAriaOwnsWithRoleHidden + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRole = function (element, roleName) { + return AriaUtil.getAriaOwnsWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. This function aslo finds elements with implicit roles. + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var referencedElement = null; + var referencedElemHasRole = false; + // In the case aria-owns is not on the element just break out of this function with null + if (CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-owns")) { + // Get the reference ID + var referenceID = element.getAttribute("aria-owns"); + // Get the element for the reference ID + referencedElement = fragment_1.FragmentUtil.getById(element, referenceID); + //ignore if the aria-owns point to the element itself + if (DOMUtil_1.DOMUtil.sameNode(element, referencedElement)) + return null; + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if (considerHiddenSetting && referencedElement != null && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(referencedElement)) { + referencedElemHasRole = null; + } + else { + referencedElemHasRole = AriaUtil.hasRole(referencedElement, roleName, considerImplicitRoles); + } + } + return referencedElemHasRole ? referencedElement : null; + }; + // Return true if the element has an ARIA label + AriaUtil.hasAriaLabel = function (element) { + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + return CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-label") || CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-labelledby"); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelID = elements[i].getAttribute("aria-labelledby"); + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = ""; + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + label = AriaUtil.getTextContentExcludingScripts(labelNode); + } + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + } + else { + // Has no label at all + hasDuplicateLabels = true; + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return !hasDuplicateLabels; + }; + /** + * Get text content from an element, excluding script and style elements + * This is a simplified version that doesn't go through full accessible name computation + * to avoid circular dependencies when called from getAriaLabel + * + * Note: When an element is referenced by aria-labelledby, its content is included + * even if the element is hidden (per ARIA spec) + */ + AriaUtil.getTextContentExcludingScripts = function (elem) { + if (!elem) + return ""; + var text = ""; + var nw = new DOMWalker_1.DOMWalker(elem); + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + var node = nw.node; + var nodeName = node.nodeName ? node.nodeName.toLowerCase() : ""; + // Skip script and style elements + if (nodeName === 'script' || nodeName === 'style') { + nw.bEndTag = true; // Skip children + continue; + } + if (node.nodeType === 3) { // Text node + // Include text even from hidden elements when referenced by aria-labelledby + if (node.nodeValue && node.nodeValue.trim().length > 0) { + text += " " + node.nodeValue.trim(); + } + } + else if (node.nodeType === 1) { // Element node + // Handle images - get alt text + if (nodeName === 'img' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children of img + } + // Handle input with type="image" - get alt text + else if (nodeName === 'input' && node.getAttribute('type') === 'image' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children + } + } + } + return text.trim(); + }; + AriaUtil.getAriaLabel = function (ele) { + if (ele.hasAttribute) { + if (ele.hasAttribute("aria-labelledby")) { + var labelIDs = ele.getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_1 = labelIDs.length; j < length_1; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + // Use our helper to get text content without circular dependency + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label); + } + } + return normalizedLabel.trim(); + } + else if (ele.hasAttribute("aria-label")) { + return CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("aria-label")).trim(); + } + } + return ""; + }; + AriaUtil.getAriaDescription = function (ele) { + if (!ele) + return ""; + var normalizedLabel = ""; + var desc = ele.getAttribute("aria-labelledby"); + if (desc && desc.trim().length > 0) { + var labelIDs = desc.trim().split(" "); + for (var j = 0, length_2 = labelIDs.length; j < length_2; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + if (label && label.trim().length > 0) + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + if (normalizedLabel.trim().length > 0) + return normalizedLabel.trim(); + } + desc = ele.getAttribute("aria-description"); + if (desc && desc.trim().length > 0) + return desc.trim().toLowerCase(); + return ""; + }; + AriaUtil.findAriaLabelDupes = function (elements) { + var dupeMap = {}; + elements.forEach(function (ele) { + dupeMap[AriaUtil.getAriaLabel(ele)] = (dupeMap[AriaUtil.getAriaLabel(ele)] || 0) + 1; + }); + return dupeMap; + }; + /** + * return accessible names for all AT visible landmark elements + * @param doc + * @returns + */ + AriaUtil.getLandmarkAccNames = function (doc) { + var nameMap = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_Landmark_AccNames", null); + if (nameMap && nameMap.length !== 0) + return nameMap; + nameMap = []; + var landmarkElems = doc.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]'); + if (landmarkElems.length === 0) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + } + landmarkElems.forEach(function (elem) { + // ignore node that is AT hidden or in a dialog that is considered as a separate location from the rest of the main page + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) && CommonUtil_1.CommonUtil.getAncestor(elem, ["DIALOG"]) === null && AriaUtil.getAncestorWithRole(elem, "dialog", true) === null) { + var name_1 = ""; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + name_1 = pair.name.trim(); + // check neested landmark to calculate the accessible name + var ancestors = __spreadArray([], landmarkElems, true).filter(function (e) { return e.contains(elem) && e !== elem; }); + if (ancestors.length > 1) { + ancestors.forEach(function (ancestor) { + var ancestor_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ancestor); + if (ancestor_pair && ancestor_pair.name && ancestor_pair.name.trim().length > 0) + name_1 = ancestor_pair.name.trim() + " " + name_1; + }); + } + var role = AriaUtil.getResolvedRole(elem); + nameMap.push({ "elem": elem, "role": role, "name": name_1 }); + } + }); + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + }; + /** + * check if the given element with the landmark rolw is unique + * @param element + * @param role: a specific landmark role, or "any" for all landmark role + * @param considerNoneLabel: if consider the landmarks without a label + * @returns + */ + AriaUtil.isLandmarkNameUnique = function (element, role, considerNoneLabel) { + if (considerNoneLabel === void 0) { considerNoneLabel = false; } + var nameMap = AriaUtil.getLandmarkAccNames(element.ownerDocument); + var exist = null; + if (role === 'any') + exist = nameMap.find(function (entry) { return entry.elem === element; }); + else + exist = nameMap.find(function (entry) { return entry.elem === element && entry.role === role; }); + if (!exist) + return null; + var name = exist.name; + if (!considerNoneLabel && name === '') + return null; + for (var i = 0; i < nameMap.length; i++) { + if (nameMap[i].elem === element) + continue; + if (name === nameMap[i].name) { + if (role === 'any') + return true; + else if (nameMap[i].role === role) + return true; + } + } + return false; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasUniqueAriaLabels = function (elements) { + return AriaUtil.hasUniqueAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasDuplicateAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + var duplicateLabelNameArray = new Array(); + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + if (!(ariaLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[ariaLabel] = new Array(); + } + duplicateLabelNameArray[ariaLabel].push(elements[i].nodeName.toLowerCase()); + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelIDs = elements[i].getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_3 = labelIDs.length; j < length_3; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + if (!(normalizedLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[normalizedLabel] = new Array(); + } + duplicateLabelNameArray[normalizedLabel].push(elements[i].nodeName.toLowerCase()); + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return duplicateLabelNameArray; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasDuplicateAriaLabels = function (elements) { + return AriaUtil.hasDuplicateAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique aria-labelledby attributes + AriaUtil.hasUniqueAriaLabelledby = function (elements) { + var hasDuplicateLabels = false; + var labelRefs = {}; + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute && elements[i].hasAttribute("aria-labelledby") && !CommonUtil_1.CommonUtil.isIdReferToSelf(elements[i], elements[i].getAttribute("aria-labelledby"))) { + var labelRef = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby")); + hasDuplicateLabels = labelRef in labelRefs; + labelRefs[labelRef] = true; + } + else { + hasDuplicateLabels = true; + } + } + return !hasDuplicateLabels; + }; + /** + * this function is responsible for resolving ARIA requirements for an HTML element per ARIA in HTML + * @param ruleContext the HTML element to be examined + * @returns + */ + AriaUtil.getElementAriaProperty = function (ruleContext) { + var tagProperty = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_ElementAriaProperty", null); + if (!tagProperty) { + var tagName = null; + var name_2 = null; + if (ruleContext.tagName) { + tagName = ruleContext.tagName.toLowerCase(); + } + else if (ruleContext.nodeName) { + tagName = ruleContext.nodeName.toLowerCase(); + } + // check if the tagProperty exists in the documentConformanceRequirement hash. + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirement[tagName]; + // The tag needs to check some special attributes + if (tagProperty === null || tagProperty === undefined) { + var specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags[tagName]; + switch (tagName) { // special cases + case "a": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "area": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "figure": { + var fcs = CommonUtil_1.CommonUtil.getChildByTag(ruleContext, "figcaption"); + fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"]; + break; + } + case "footer": + case "header": + if (AriaUtil.getAncestorWithRole(ruleContext, "article", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "complementary", true) !== null + || AriaUtil.getAncestorWithRole(ruleContext, "navigation", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "region", true) !== null + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["article", "aside", "main", "nav", "section"]) !== null) + tagProperty = specialTagProperties["des-section-article-aside-main-nav"]; + else + tagProperty = specialTagProperties["other"]; + break; + case "img": + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (AriaUtil.getAriaLabel(ruleContext).trim().length !== 0 || (alt !== null && alt.length > 0) || (title !== null && title.length > 0)) { + // If the img has non-empty alt (alt="some text" or alt=" ") or an accessible name is provided + tagProperty = specialTagProperties["img-with-accname"]; + } + else { + if (alt !== null) { + // If the img has an empty alt (alt="") + tagProperty = specialTagProperties["img-without-accname-empty-alt"]; + } + else { + // If the img lacks an alt attribute + tagProperty = specialTagProperties["img-without-accname-no-alt"]; + } + } + break; + case "input": + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "type")) { + var type = ruleContext.getAttribute("type").trim().toLowerCase(); + tagProperty = specialTagProperties[type]; + if (tagProperty === null || tagProperty === undefined) { + switch (type) { + case "checkbox": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"]; + break; + case "email": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"]; + break; + case "search": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"]; + break; + case "tel": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"]; + break; + case "text": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + break; + case "url": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"]; + break; + default: + // default + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["default-with-list"] : tagProperty = specialTagProperties["default-no-list"]; + break; + } + } + } + else { + // default type is the same as type=text + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + } + break; + case "li": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["li"]; + if (ruleContext.parentElement && AriaUtil.hasRoleInSemantics(ruleContext.parentElement, "list")) + tagProperty = specialTagProperties["child-of-list-role"]; + else + tagProperty = specialTagProperties["no-child-of-list-role"]; + break; + case "section": + //name = ARIAMapper.computeName(ruleContext); + //if (name && name.trim().length > 0) { + var label = AriaUtil.getAriaLabel(ruleContext); + if ((label && label.trim().length > 0) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + tagProperty = specialTagProperties["with-name"]; + } + else { + tagProperty = specialTagProperties["without-name"]; + } + break; + case "select": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"]; + if (ruleContext.hasAttribute("multiple") || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "size") && ruleContext.getAttribute("size") > 1) + tagProperty = specialTagProperties["multiple-attr-size-gt1"]; + else + tagProperty = specialTagProperties["no-multiple-attr-size-gt1"]; + break; + case "summary": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["summary"]; + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], ruleContext.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], ruleContext)) + tagProperty = specialTagProperties["first-summary-of-detail"]; + else + tagProperty = specialTagProperties["no-first-summary-of-detail"]; + break; + case "tbody": + case "td": + case "tr": + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + tagProperty = specialTagProperties["des-table"]; + } + else { + AriaUtil.getAncestorWithRole(ruleContext, "grid", true) || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"]; + } + break; + case "th": + var scope = CommonUtil_1.CommonUtil.getScopeForTh(ruleContext); + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-table-column-scope"]; + else + tagProperty = specialTagProperties["des-table-row-scope"]; + } + else if (AriaUtil.getAncestorWithRole(ruleContext, "grid", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-grid-treegrid-column-scope"]; + else + tagProperty = specialTagProperties["des-grid-treegrid-row-scope"]; + } + else + tagProperty = specialTagProperties["des-other"]; + break; + case "div": + var prt = ruleContext.parentElement; + prt !== null && prt.nodeName.toLowerCase() === 'dl' ? tagProperty = specialTagProperties["child-dl"] : tagProperty = specialTagProperties["no-child-dl"]; + break; + default: + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["default"]; + } //switch + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_ElementAriaProperty", tagProperty); + return tagProperty || null; + }; + AriaUtil.getAllowedAriaRoles = function (ruleContext, properties) { + var allowedRoles = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaRoles", null); + if (!allowedRoles) { + allowedRoles = []; + var tagProperty = null; + if (properties !== null && properties !== undefined) { + tagProperty = properties; + } + else { + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + } + if (tagProperty !== null && tagProperty !== undefined) { + if (tagProperty.implicitRole !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles); + } + if (tagProperty.validRoles !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + var implicitRoles = AriaUtil.getImplicitRole(ruleContext); + if (implicitRoles && implicitRoles.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaRoles", allowedRoles); + } + return allowedRoles; + }; + AriaUtil.getAllowedAriaAttributes = function (ruleContext, roles, properties) { + var allowedAttributes = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaAttributes", null); + if (!allowedAttributes) { + allowedAttributes = []; + var permittedRoles = __spreadArray([], roles, true); + var tagName = ruleContext.tagName.toLowerCase(); + var prohibitedAttributes = []; + // Element with a disabled attribute https://www.w3.org/TR/html5/disabled-elements.html + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(tagName) > -1) { + // Use the aria-disabled attribute on any element that is allowed the disabled attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-disabled", allowedAttributes); + } + // Element with a required attribute http://www.the-art-of-web.com/html/html5-form-validation/ + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedRequired.indexOf(tagName) > -1) { + // Use the aria-required attribute on any element that is allowed the required attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-required", allowedAttributes); + } + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedReadOnly.indexOf(tagName) > -1) { + // Use the aria-readonly attribute on any element that is allowed the readonly attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes); + } + var tagProperty = null; + if (properties != null && properties !== undefined) + tagProperty = properties; + else + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + if (tagProperty !== null && tagProperty !== undefined) { + // add the implicit role allowed attributes to the allowed role list if there is no specified role + // ignore if the element doesn't allow the attributes from the implicit roles + if (tagProperty.implicitRole !== null && + (permittedRoles === null || permittedRoles === undefined || permittedRoles.length === 0) + && tagProperty.allowAttributesFromImplicitRole === undefined) { + for (var i = 0; i < tagProperty.implicitRole.length; i++) { + var roleProperty = ARIADefinitions_1.ARIADefinitions.designPatterns[tagProperty.implicitRole[i]]; + if (roleProperty !== null && roleProperty !== undefined) { + var properties_1 = roleProperty.props; + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + properties_1 = AriaUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + var prohibitedProps = roleProperty.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case of separator + if (tagProperty.implicitRole[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuenow", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + } + // Adding the global properties to the valid attribute list + if (tagProperty.globalAriaAttributesValid) { + var properties_2 = ARIADefinitions_1.ARIADefinitions.globalProperties; // global properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_2, allowedAttributes); + } + } + // adding the other role to the allowed roles for the attributes + if (tagProperty && tagProperty.otherRolesForAttributes && tagProperty.otherRolesForAttributes.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.otherRolesForAttributes, permittedRoles); + // adding the specified role properties to the allowed attribute list + for (var i = 0; permittedRoles !== null && i < permittedRoles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[permittedRoles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + // ignore the properties if the element doesn't allow attributes from the implicit role + if (!tagProperty || tagProperty.implicitRole === null || !tagProperty.implicitRole.includes(permittedRoles[i]) || (tagProperty.implicitRole.includes(permittedRoles[i]) && tagProperty.allowAttributesFromImplicitRole === undefined)) { + var properties_3 = roleProperties.props; // allowed properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + properties_3 = AriaUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + } + var prohibitedProps = roleProperties.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case for separator + if (permittedRoles[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + // ignore aria-level, aria-setsize or aria-posinset if "row" is not in treegrid + if (permittedRoles.includes("row") && AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) == null) { + var index = -1; + if ((index = allowedAttributes.indexOf("aria-level")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-setsize")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-posinset")) > -1) + allowedAttributes.splice(index, 1); + } + // add the other allowed attributes for the element + if (tagProperty && tagProperty.otherAllowedAriaAttributes && tagProperty.otherAllowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var allowed = []; + for (var p = 0; p < tagProperty.otherAllowedAriaAttributes.length; p++) { + var attr = tagProperty.otherAllowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + allowed.push(pair[0]); + } + else + allowed.push(attr); + } + if (allowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(allowed, allowedAttributes); + } + // add the other prohibitted attributes for the element + if (tagProperty && tagProperty.otherDisallowedAriaAttributes && tagProperty.otherDisallowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var disallowed = []; + for (var p = 0; p < tagProperty.otherDisallowedAriaAttributes.length; p++) { + var attr = tagProperty.otherDisallowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + disallowed.push(pair[0]); + } + else + disallowed.push(attr); + } + if (disallowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(disallowed, prohibitedAttributes); + } + //exclude the prohibitedAttributes from the allowedAttributes + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(prohibitedAttributes, allowedAttributes); + //exclude aria attribute for elements without implicit role and with 'Naming Prohibited' + if ((!roles || roles.length === 0) && tagProperty.implicitRole === null && tagProperty.prohibitedAriaAttributesWhenNoImplicitRole) + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(tagProperty.prohibitedAriaAttributesWhenNoImplicitRole, allowedAttributes); + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaAttributes", allowedAttributes); + } + return allowedAttributes; + }; + /** + * + * @param ariaAttr + * @param htmlAttrs + * @type: conflict or overlapping + * @returns htmlAttrName, 'Pass' or null + * htmlAttrName that conflicts with the ariaAttr, + * 'Pass' with no conflict with the ariaAttr, + * or null where ariaAttr won't cause conflict + */ + AriaUtil.getConflictOrOverlappingHtmlAttribute = function (ariaAttr, htmlAttrs, type) { + var exist = ARIADefinitions_1.ARIADefinitions.relatedAriaHtmlAttributes[ariaAttr['name']]; + if (exist) { + if (!ariaAttr || ariaAttr.length == 0 || !htmlAttrs || htmlAttrs.length == 0) + return []; + var examinedHtmlAtrNames = []; + var concernTypes = null; + if (type === 'conflict') { + if (!exist.conflict || Object.keys(exist.conflict).length === 0) + return null; + concernTypes = exist.conflict; + } + else if (type === 'overlapping') { + if (!exist.overlapping || Object.keys(exist.overlapping).length === 0) + return null; + concernTypes = exist.overlapping; + } + else + return null; + var applicable = false; + var fail_1 = false; + for (var k = 0; k < concernTypes.length; k++) { + var concernAriaValue = concernTypes[k].ariaAttributeValue; + var concernHtmlNames = concernTypes[k].htmlAttributeNames; + var concernHtmlValues = concernTypes[k].htmlAttributeValues; + for (var i = 0; i < htmlAttrs.length; i++) { + var index = concernHtmlNames.indexOf(htmlAttrs[i]['name']); + if (index !== -1) { + applicable = true; + var htmlValuesInConcern = (concernHtmlValues === null || concernHtmlValues[index] === null) ? null : concernHtmlValues[index].split(","); + if (concernAriaValue === null) { + if (htmlValuesInConcern === null) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (htmlValuesInConcern === null) { + if (concernAriaValue === ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (concernAriaValue === 'VALUE' && htmlValuesInConcern.includes('VALUE') && htmlValuesInConcern[0] !== ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (concernAriaValue === ariaAttr['value'] && htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + } + } + if (applicable && !fail_1) + examinedHtmlAtrNames.push({ result: 'Pass', 'attr': '' }); + return examinedHtmlAtrNames; + } + else + return null; + }; + AriaUtil.containsPresentationalChildrenOnly = function (elem) { + var roles = AriaUtil.getRoles(elem, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil.getImplicitRole(elem); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return false; + for (var i = 0; roles !== null && i < roles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + var presentional = roleProperties.presentationalChildren; + if (presentional === true) + return true; + } + } + return false; + }; + AriaUtil.shouldBePresentationalChild = function (element) { + var walkNode = DOMWalker_1.DOMWalker.parentElement(element); + while (walkNode) { + if (AriaUtil.containsPresentationalChildrenOnly(walkNode)) + return true; + //aria-own case: if the element is referred by an aria-won + walkNode = ARIAMapper_1.ARIAMapper.getAriaOwnedBy(walkNode) || DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA +*/ + AriaUtil.areRolesDefined = function (roles) { + if (!roles || roles.length === 0) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) { + var role = roles_1[_i]; + if (!(role.toLowerCase() in designPatterns)) + return false; + } + return true; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA + */ + AriaUtil.getInvalidRoles = function (ruleContext) { + var domRoles = AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles && domRoles.includes('generic')) + return ["generic"]; + // Failing roles + var failRoleTokens = []; + // Passing roles + var passRoleTokens = []; + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + var allowedRoles = AriaUtil.getAllowedAriaRoles(ruleContext, tagProperty); + if (!allowedRoles || allowedRoles.length === 0) + return domRoles; + var invalidRoles = []; + if (allowedRoles.includes('any')) + return []; + for (var i = 0; i < domRoles.length; i++) + if (!allowedRoles.includes(domRoles[i]) && !invalidRoles.includes(domRoles[i])) + invalidRoles.push(domRoles[i]); + return invalidRoles; + }; + /* + * check if any explicit role specified for the element is not defined in ARIA + * return: list of specified roles not defined in ARIA + */ + AriaUtil.getRolesUndefinedByAria = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var undefinedRoles = []; + if (roles && roles.length > 0) { + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var i = 0; i < roles.length; i++) { + if (!(roles[i] in designPatterns)) { + undefinedRoles.push(roles[i]); + } + } + } + return undefinedRoles; + }; + /* + * this method first checks explicit roles, if no explicit role, it will check the implicit role + * return: null if any explicit role is invalid, + * a list of invalid attributes + * empty list if all attributes are valid, or no aria attributes are specified + */ + AriaUtil.getInvalidAriaAttributes = function (ruleContext) { + var roles = AriaUtil.getUserDefinedRoles(ruleContext); + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + // for mutiple roles, skip if any role is invalid + var defined = AriaUtil.areRolesDefined(roles); + if (defined !== null && !defined) + return null; + var attrs = []; + if (!roles || roles.length == 0) + roles = AriaUtil.getImplicitRole(ruleContext); + var aria_attrs = AriaUtil.getUserDefinedAriaAttributes(ruleContext); + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + // Attributes allowed on this node + var allowedAttributes = AriaUtil.getAllowedAriaAttributes(ruleContext, roles, tagProperty); + if (aria_attrs) { + for (var i = 0; i < aria_attrs.length; i++) { + var attrName = aria_attrs[i].trim().toLowerCase(); + if (!allowedAttributes.includes(attrName) && !attrs.includes(attrName)) + attrs.push(attrName); + } + } + return attrs; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + AriaUtil.getConflictAriaAndHtmlAttributes = function (elem) { + var ariaAttrs = AriaUtil.getUserDefinedAriaAttributeNameValuePairs(elem); + var htmlAttrs = AriaUtil.getUserDefinedHtmlAttributeNameValuePairs(elem); + var ret = []; + if (ariaAttrs && ariaAttrs.length > 0 && htmlAttrs && htmlAttrs.length > 0) { + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'conflict'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Failed') //failed + ret.push({ 'ariaAttr': ariaAttrs[i]['name'], 'htmlAttr': item['attr'] }); + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + } + return ret; + }; + /* + * get deprecated Aria roles + * return: a list of deprecated Aria roles + */ + AriaUtil.getDeprecatedAriaRoles = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var ret = []; + if (roles && roles.length > 0) { + var globalDeprecatedRoles = ARIADefinitions_1.ARIADefinitions.globalDeprecatedRoles; + for (var i = 0; i < roles.length; i++) { + if (globalDeprecatedRoles.includes(roles[i])) + ret.push(roles[i]); + } + } + return ret; + }; + /* + * get deprecated Aria role-attributes + * return: a list of deprecated Aria role-attributes paris + * for global the role is marked as 'any' + */ + AriaUtil.getDeprecatedAriaAttributes = function (element) { + if (!element) + return null; + var domAttributes = element.attributes; + var ariaAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push(attrName); + } + } + if (ariaAttrs.length === 0) + return []; + var ret = []; + var globalDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.globalDeprecatedProperties; + for (var i = 0; i < ariaAttrs.length; i++) { + if (globalDeprecatedAttributes.includes(ariaAttrs[i])) + ret.push({ "role": "any", "attribute": ariaAttrs[i] }); + } + var roles = AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) { + for (var i = 0; i < roles.length; i++) { + var roleWithDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleWithDeprecatedAttributes) { + var deprecatedAttriNames = roleWithDeprecatedAttributes['deprecatedProps']; + if (deprecatedAttriNames && deprecatedAttriNames.length > 0) { + for (var j = 0; j < ariaAttrs.length; j++) { + if (deprecatedAttriNames.includes(ariaAttrs[j])) + ret.push({ "role": roles[i], "attribute": ariaAttrs[j] }); + } + } + } + } + } + return ret; + }; + AriaUtil.isNodeInGrid = function (node) { + return AriaUtil.getAncestorWithRole(node, "grid") != null; + }; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + AriaUtil.navLinkKeywords = ['start', 'next', 'prev', 'previous', 'contents', 'index']; + // This list contains a list of rule ids for the rules that have to check for hidden content regardless of the Check Hidden + // Content Setting. This means that when the engine is actually determine which elements to mass to the rules, it will always + // pass theses rules no matter what the Check Hidden Content Setting is. + AriaUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId']; + // https://www.w3.org/TR/wai-aria-1.1/#introstates + AriaUtil.ariaAttributeRoleDefaults = { + "alert": { + "aria-live": "assertive", + "aria-atomic": "true" + }, + "combobox": { + "aria-haspopup": "listbox" + }, + "listbox": { + "aria-orientation": "vertical" + }, + "log": { + "aria-live": "polite" + }, + "menu": { + "aria-orientation": "vertical" + }, + "menubar": { + "aria-orientation": "horizontal" + }, + "meter": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "option": { + "aria-selected": "false" + }, + "progressbar": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "scrollbar": { + "aria-orientation": "vertical", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "separator": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "slider": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "spinbutton": { + // Not sure how to encode min/max (or now in 1.2 - "has no value") + //"aria-valuenow": "0" TODO: at risk: maybe delete after ARIA 1.2 reaches proposed rec + // Probably just delete spinbutton from this list completely and let user agents handle "defaults" + }, + "status": { + "aria-live": "polite", + "aria-atomic": "true" + }, + "tab": { + "aria-selected": "false" + }, + "tablist": { + "aria-orientation": "horizontal" + }, + "toolbar": { + "aria-orientation": "horizontal" + }, + "tree": { + "aria-orientation": "vertical" + } + }; + // https://www.w3.org/TR/wai-aria-1.1/#aria-atomic + AriaUtil.ariaAttributeGlobalDefaults = { + "aria-atomic": "false", + "aria-autocomplete": "none", + "aria-busy": "false", + "aria-checked": undefined, + "aria-current": "false", + "aria-disabled": "false", + "aria-dropeffect": "none", + "aria-expanded": undefined, + "aria-grabbed": undefined, + "aria-haspopup": "false", + "aria-hidden": undefined, + "aria-invalid": "false", + "aria-live": "off", + "aria-modal": "false", + "aria-multiline": "false", + "aria-multiselectable": "false", + "aria-orientation": undefined, + "aria-pressed": undefined, + "aria-readonly": "false", + //"aria-relevant": "additions text", TODO: are multiple values supported? + "aria-required": "false", + "aria-selected": undefined, + "aria-sort": "none" + }; + // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings + AriaUtil.ariaAttributeImplicitMappings = { + "aria-autocomplete": { + "form": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "input": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "select": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "textarea": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + } + }, + "aria-checked": { + "input": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "menuitem": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "*": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + }, + }, + "aria-disabled": { + "button": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "fieldset": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "input": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "optgroup": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "option": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "select": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "textarea": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + } + }, + "aria-expanded": { + "details": function (e) { + return e.getAttribute("open"); + }, + "dialog": function (e) { + return e.getAttribute("open"); + } + }, + "aria-multiselectable": { + "select": function (e) { + if (e.hasAttribute("multiple")) + return "true"; + return; + } + }, + "aria-placeholder": { + "input": function (e) { + return e.getAttribute("placeholder"); + }, + "textarea": function (e) { + return e.getAttribute("placeholder"); + } + }, + "aria-required": { + "input": function (e) { + return e.getAttribute("required"); + }, + "select": function (e) { + return e.getAttribute("required"); + }, + "textarea": function (e) { + return e.getAttribute("required"); + } + } + }; + return AriaUtil; +}()); +exports.AriaUtil = AriaUtil; + + +/***/ }, + +/***/ "./src/v4/util/CSSUtil.ts" +/*!********************************!*\ + !*** ./src/v4/util/CSSUtil.ts ***! + \********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CSSUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil = /** @class */ (function () { + function CSSUtil() { + } + CSSUtil.selectorMatchesElem = function (element, selector) { + // Early return for empty selector (before try-catch for performance) + if (!selector || selector.length === 0 || selector.trim() === "") + return false; + try { + // Modern standard method + if (typeof element.matches === "function") { + return element.matches(selector); + } + // Vendor-prefixed fallbacks (older browsers) + if (typeof element.webkitMatchesSelector === "function") { + return element.webkitMatchesSelector(selector); + } + if (typeof element.msMatchesSelector === "function") { + return element.msMatchesSelector(selector); + } + // Legacy method (deprecated but kept for compatibility) + if (typeof element.matchesSelector === "function") { + return element.matchesSelector(selector); + } + // Fallback: use querySelectorAll and check if element is in results + var doc = element.ownerDocument || element.document; + if (!doc) + return false; + var matches = doc.querySelectorAll(selector); + // Use Array.from for better performance with modern engines + return Array.from(matches).includes(element); + } + catch (err) { + // Bad selector? Doesn't match then... + return false; + } + }; + /** + * Returns the style computed for this element + * @param elem + */ + CSSUtil.getComputedStyle = function (elem, pseudoElt) { + if (!elem) + return null; + var doc = elem.ownerDocument; + var win = doc.defaultView; + return win.getComputedStyle(elem, pseudoElt); + }; + /** + * Parse and cache all stylesheet rules at the document level + * Returns an array of parsed rule objects with selector and style information + */ + CSSUtil.getParsedStylesheetRules = function (ownerDoc) { + // Check if we already have cached parsed rules for this document + var cachedRules = CacheUtil_1.CacheUtil.getCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", null); + if (cachedRules) { + return cachedRules; + } + var parsedRules = []; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < ownerDoc.styleSheets.length; ++ssIndex) { + var sheet = ownerDoc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var rule = sheet.cssRules[rIndex]; + var fullRuleSelector = rule.selectorText; + if (fullRuleSelector) { + var pseudoMatch = fullRuleSelector.match(/^(.*)(:[a-zA-Z-]*)$/); + var hasPseudoClass = !!pseudoMatch; + var selMain = hasPseudoClass ? pseudoMatch[1] : fullRuleSelector; + var selPseudo = hasPseudoClass ? pseudoMatch[2] : ""; + parsedRules.push({ + fullRuleSelector: fullRuleSelector, + hasPseudoClass: hasPseudoClass, + selMain: selMain, + selPseudo: selPseudo, + style: rule.style + }); + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the parsed rules at the document level + CacheUtil_1.CacheUtil.setCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", parsedRules); + return parsedRules; + }; + /** + * Private helper method to fill style maps from a CSSStyleDeclaration + * Handles CSS property priorities and the "all" shorthand property + */ + CSSUtil.fillStyle = function (maps, style) { + for (var sIndex = 0; sIndex < style.length; ++sIndex) { + if (style[sIndex] === "all" && style[style[sIndex]]) { + for (var _i = 0, maps_1 = maps; _i < maps_1.length; _i++) { + var map = maps_1[_i]; + for (var key in map) { + delete map[key]; + } + } + break; + } + else { + var key = style[sIndex]; + for (var _a = 0, maps_2 = maps; _a < maps_2.length; _a++) { + var map = maps_2[_a]; + var priority = style.getPropertyPriority(key); + if (key in map && map[key].endsWith("!important")) { + if (priority === "important" && + !map[key].startsWith("inherit") && + !map[key].startsWith("unset")) + map[key] = style[key] + " !important"; + else + continue; + } + else + map[key] = + style[key] + + (priority === "important" ? " !important" : ""); + } + } + } + }; + /** + * Private helper method that consolidates the logic for getting defined styles + * Used by both getDefinedStyles and getDefinedStylesMultiple + */ + CSSUtil.getDefinedStylesInternal = function (elem, props, pseudoClasses) { + var results = {}; + var definedStylesMap = {}; + var definedStylePseudoMap = {}; + // Initialize result objects for all pseudo-classes + for (var _i = 0, pseudoClasses_1 = pseudoClasses; _i < pseudoClasses_1.length; _i++) { + var pseudoClass = pseudoClasses_1[_i]; + definedStylesMap[pseudoClass] = {}; + definedStylePseudoMap[pseudoClass] = {}; + } + // Get pre-parsed stylesheet rules from cache + var parsedRules = CSSUtil.getParsedStylesheetRules(elem.ownerDocument); + // Check once if we need to handle :focus pseudo-class + var hasFocusPseudo = pseudoClasses.includes(":focus"); + var _loop_1 = function (parsedRule) { + if (props !== null && !props.some(function (prop) { return !!parsedRule.style[prop]; })) { + return "continue"; + } + var selPseudo = parsedRule.selPseudo; + var hasPseudoClass = parsedRule.hasPseudoClass; + // Handle :focus-within replacement once per rule if needed + var selMain = parsedRule.selMain; + if (hasFocusPseudo && selPseudo === ":focus") { + // If this element has focus, remove focus-within from parents + selMain = selMain.replace(/([ >][^+~ >]+):focus-within/g, "$1"); + } + // Cache selector matching result (only once per rule, not per pseudo-class) + var selectorMatches = CSSUtil.selectorMatchesElem(elem, selMain); + // Only process if selector matches + if (selectorMatches) { + // Process for each pseudo-class + for (var _c = 0, pseudoClasses_3 = pseudoClasses; _c < pseudoClasses_3.length; _c++) { + var pseudoClass = pseudoClasses_3[_c]; + // Cache map references to avoid repeated lookups + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Get styles of non-pseudo selectors + if (!hasPseudoClass) { + CSSUtil.fillStyle([styleMap, pseudoMap], parsedRule.style); + } + // Get styles for matching pseudo-class + if (selPseudo === pseudoClass) { + CSSUtil.fillStyle([pseudoMap], parsedRule.style); + } + } + } + }; + // Process each cached rule + for (var _a = 0, parsedRules_1 = parsedRules; _a < parsedRules_1.length; _a++) { + var parsedRule = parsedRules_1[_a]; + _loop_1(parsedRule); + } + // Handle element styles and build results in one pass + for (var _b = 0, pseudoClasses_2 = pseudoClasses; _b < pseudoClasses_2.length; _b++) { + var pseudoClass = pseudoClasses_2[_b]; + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Add element's inline styles + CSSUtil.fillStyle([styleMap, pseudoMap], elem.style); + // Build results + if (pseudoClass === "") { + results[pseudoClass] = styleMap; + } + else { + // For pseudo-classes, return only styles that differ from default + var diffStyles = {}; + var keys = Object.keys(pseudoMap); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (pseudoMap[key] !== styleMap[key]) { + diffStyles[key] = pseudoMap[key]; + } + } + results[pseudoClass] = diffStyles; + } + } + return results; + }; + /** + * Returns the style defined for this element for multiple pseudo-classes in a single pass + * + * This is more efficient than calling getDefinedStyles multiple times as it only + * iterates through stylesheets once. + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string[]} pseudoClasses - Array of pseudo-classes to retrieve. Use "" for default (no pseudo-class). + * @returns {Object} Object mapping each pseudo-class to its defined styles + */ + CSSUtil.getDefinedStylesMultiple = function (elem, props, pseudoClasses) { + if (!elem) + return null; + var results = {}; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + // Check cache first - see if we have all requested pseudo-classes cached + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + var missingPseudoClasses = []; + if (cachedStyles) { + // Check which pseudo-classes are already cached + for (var _i = 0, pseudoClasses_4 = pseudoClasses; _i < pseudoClasses_4.length; _i++) { + var pseudoClass = pseudoClasses_4[_i]; + if (cachedStyles[pseudoClass] !== undefined) { + results[pseudoClass] = cachedStyles[pseudoClass]; + } + else { + missingPseudoClasses.push(pseudoClass); + } + } + // If all are cached, return immediately + if (missingPseudoClasses.length === 0) { + return results; + } + } + else { + cachedStyles = {}; + missingPseudoClasses = pseudoClasses; + } + // Only process missing pseudo-classes using the internal helper + if (missingPseudoClasses.length > 0) { + var newResults = CSSUtil.getDefinedStylesInternal(elem, props, missingPseudoClasses); + // Merge new results with cached results + for (var _a = 0, missingPseudoClasses_1 = missingPseudoClasses; _a < missingPseudoClasses_1.length; _a++) { + var pseudoClass = missingPseudoClasses_1[_a]; + results[pseudoClass] = newResults[pseudoClass]; + cachedStyles[pseudoClass] = newResults[pseudoClass]; + } + // Update cache with all styles (existing + new) + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + } + return results; + }; + /** + * Returns the style defined for this element + * + * This differs from the computed style in that the computed style will return + * styles defined by the user agent. This will only return styles defined by the + * application + * if rotation transform is used, the computed style returns the resolved matrix + * while the defined style return the transform function(s) + * for example, for 'transform: rotate(2.5deg);', the computed style returns 'matrix(-0.0436194, 0.999048, -0.999048, -0.0436194, 0, 0)' + * and the defined style returns 'rotate(2.5deg)' + * + * change the type of the parameter pseudoClass from PseudoClass to string to include both pseudo classes (e.g., :focus, :checked) + * and pseudo elements (e.g., ::before, ::after). + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string} [pseudoClass] If specified, will return values that are different + * than when the pseudoClass does not match. + */ + CSSUtil.getDefinedStyles = function (elem, props, pseudoClass) { + if (!elem) + return null; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + var pseudoKey = pseudoClass || ""; + // Check cache first - use shared cache structure with getDefinedStylesMultiple + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + if (!cachedStyles) { + cachedStyles = {}; + } + if (cachedStyles[pseudoKey] !== undefined) { + return cachedStyles[pseudoKey]; + } + // Use the internal helper method with a single pseudo-class + var results = CSSUtil.getDefinedStylesInternal(elem, props, [pseudoKey]); + var result = results[pseudoKey]; + // Cache the result + cachedStyles[pseudoKey] = result; + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + return result; + }; + /** + * Returns the media query defined for the document + * Get media orientation transforms from stylesheets with caching + * Returns transform/rotate properties for elements within media queries + * + * @param {Document} doc + */ + CSSUtil.getMediaOrientationTransform = function (doc) { + // Check if we already have cached media orientation transforms for this document + var cachedTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MediaOrientationTransforms", null); + if (cachedTransforms) { + return cachedTransforms; + } + var orientationTransforms = {}; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < doc.styleSheets.length; ++ssIndex) { + var sheet = doc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var sheetRule = sheet.cssRules[rIndex]; + if (4 /* CSSRule.MEDIA_RULE */ === sheetRule.MEDIA_RULE) { + var rule = sheetRule; + if (rule && rule.media) { + var mediaList = rule.media; + for (var i = 0; i < mediaList.length; i++) { + if (!mediaList.item(i)) + continue; + var mediaKey = mediaList.item(i).toLocaleLowerCase(); + var elem_transforms = orientationTransforms[mediaKey]; + if (!elem_transforms) + elem_transforms = {}; + var styleRules = rule.cssRules; + for (var j = 0; j < styleRules.length; ++j) { + if (1 /* CSSRule.STYLE_RULE */ === styleRules[j].STYLE_RULE) { + var styleRule = styleRules[j]; + var selector = styleRule.selectorText; + if (selector) { + var transforms = {}; + var styles = styleRule.style; + for (var s = 0; s < styles.length; ++s) { + var key = styles[s]; + var keyLower = key.toLocaleLowerCase(); + if (keyLower === "transform") { + if (key === "all" && styles[key]) { + transforms = {}; + break; + } + else { + transforms[key] = styles[key]; + } + } + else if (keyLower === "rotate") { + transforms[key] = styles[key]; + } + } + if (Object.keys(transforms).length > 0) { + elem_transforms[selector] = transforms; + } + } + } + } + if (Object.keys(elem_transforms).length > 0) { + orientationTransforms[mediaKey] = elem_transforms; + } + } + } + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the media orientation transforms at the document level + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MediaOrientationTransforms", orientationTransforms); + return orientationTransforms; + }; + /** + * convert given rotation transform functions to the degree transformed. + * If multiple functions are given, then the functions are applied linearly in the order. + * rotation_transform function example: rotate(45deg), rotate(2turn), rotate(2rad), rotate3d(1, 1, 1, 45deg), + * rotate(2rad) rotate3d(1, 1, 1, 45deg) + * @param rotation_transform + */ + CSSUtil.getRotationDegree = function (rotation_transform) { + var degree = 0; + try { + if (!rotation_transform) + return degree; + // normalize the rotation_transform + rotation_transform = rotation_transform.replaceAll(", ", ","); + var transform_functions = rotation_transform.split(" "); + for (var i = 0; i < transform_functions.length; i++) { + var transform_function = transform_functions[i].trim(); + if (transform_function === "") + continue; + if (transform_function.startsWith("rotate3d")) { + // example: rotate3d(1, 1, 1, 45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = void 0; + if (matrix) + values = matrix.split(","); + if (values && values.length === 4) { + var rotation = values[3]; + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + } + else if (transform_function.startsWith("rotate") || + transform_function.startsWith("rotateZ")) { + // example: rotate(45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var rotation = transform_function.substring(left + 1, right); + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + else if (transform_function.startsWith("matrix3d")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[4], values[5]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + else if (transform_function.startsWith("matrix")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[1], values[0]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + } + while (degree >= 360) + degree -= 360; + } + catch (err) { + console.log("Cannot retrieve rotation degree: " + err); + throw err; + } + return degree; + }; + /** + * Convert CSS style string values to pixels. + * + * @param value style value in string, such as 3rem, 230px etc. + * @param target element. + * @return value in pixels + */ + CSSUtil.getPixelsFromStyle = function (value, elem) { + if (!value) + return 0; + var regex = /(-?[\d.]+)([a-z%]*)/; + var parsed = value.trim().match(regex); + if (parsed === null) + return 0; + if (parsed[2] === "" || parsed[1] === 0) + //no zero value without unit which is considered as error, so implicable + return 0; + var pixels = CSSUtil.convertValue2Pixels(parsed[2], parsed[1], elem); + return pixels === null ? pixels : parseFloat(pixels); + }; + /** + * Convert absolute CSS numerical values to pixels. + * + * @param unitValue in string + * @param target element. + * @return value in pixels + */ + CSSUtil.convertValue2Pixels = function (unit, unitValue, elem) { + if (unitValue === 0) + return 0; + if (!unit) + unit = "px"; + var supportedUnits = { + // absolute unit + px: function (value) { return value; }, + cm: function (value) { return value * 37.8; }, + mm: function (value) { return value * 3.78; }, + q: function (value) { return value * 0.95; }, + in: function (value) { return value * 96; }, + pc: function (value) { return value * 16; }, + pt: function (value) { return value * 1.33; }, + // relative unit + rem: function (value) { + return value * + parseFloat(getComputedStyle(elem.ownerDocument.documentElement).getPropertyValue("font-size")); + }, + em: function (value) { + return value * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + vw: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerWidth; + }, + vh: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerHeight; + }, + "%": function (value) { + return (value / 100) * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + }; + if (unit in supportedUnits) + return supportedUnits[unit](unitValue); + return null; + }; + /* + * Returns if the font for visible text of the element is defined by material icons + * + * @param {HTMLElement} elem + */ + CSSUtil.isMaterialIconFont = function (elem) { + // TODO: check the existence material icons using fetch in node 18+ + // for now (node 16) just dertermine if the stylesheet for the 'Material Icons' exists statically. note that the loading of the font stylesheet occurs at run time. + //list of known material icons and stylesheet link + var known_icons = { + "Material Icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + var known_css_classes = { + "material-icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + // material icon font can be defined either by font-family: 'Material Icons' or by class="material-icons" + var styles = CSSUtil.getDefinedStyles(elem, ["font-family"]); + var fontFamily = styles["font-family"]; + var found = false; + // font-family specifies a prioritized list of one or more font family names + if (fontFamily && + fontFamily.split(",")[0].replace(/['"]+/g, "").trim() in known_icons) + found = true; + if (!found) { + var list = elem.classList; + for (var css_class in known_css_classes) { + if (list.contains(css_class)) { + found = true; + break; + } + } + } + if (!found) + return false; + var passed = false; + // check if the stylesheet for the 'Material Icons' exists statically + var sheets = elem.ownerDocument.styleSheets; + for (var s = 0; s < sheets.length; s++) { + if (sheets && + sheets.length > 0 && + Object.values(known_icons).indexOf(sheets[s].href) > -1) { + passed = true; + break; + } + } + return passed; + }; + CSSUtil.getWeightNumber = function (styleVal) { + var map = { + light: 100, + bold: 700, + }; + var retVal = parseInt(styleVal); + if (retVal) + return retVal; + if (styleVal in map) + return map[styleVal]; + return 400; + }; + CSSUtil.getFontInPixels = function (styleVal, elem) { + var map = { + "xx-small": 16, + "x-small": 10, + small: 13, + medium: 16, + large: 18, + "x-large": 24, + "xx-large": 32, + }; + var value = parseFloat(styleVal); + if (!value) { + return map[styleVal]; + } + var units = styleVal.substring(("" + value).length); + /** + if (units === "" || units === "px") return value; + if (units === "em") return value * 16; + if (units === "%") return value / 100 * 16; + if (units === "pt") return value * 4 / 3; + return Math.round(value); + */ + return CSSUtil.convertValue2Pixels(units, value, elem); + }; + CSSUtil.getCSSStyle = function (element) { + var styleText = ""; + if (element === null) + return []; + if (element.IBM_CSS_THB) + return element.IBM_CSS_THB; + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === "style") { + styleText = element.innerText; + if (styleText === undefined || styleText.trim() === "") + styleText = element.textContent; + } + else if (element.hasAttribute("style")) { + styleText = element.getAttribute("style"); + } + else + return []; + if (styleText === null || styleText.trim().length === 0) + return []; + //remove comment blocks + var re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g; + var subst = " "; + styleText = styleText.replace(re, subst); + // Find all "key : val;" pairs with various whitespace inbetween + var rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g; + // Find all "selector { csskeyvals } with various whitespace inbetween + var rSelectors = /\s*([^{]*){([^}]*)}/g; + if (styleText.indexOf("{") === -1) { + var keyVals = {}; + var m = void 0; + while ((m = rKeyVals.exec(styleText)) != null) { + keyVals[m[1]] = m[2].trim().toLowerCase(); + } + var retVal = [ + { + selector: null, + values: keyVals, + }, + ]; + element.IBM_CSS_THB = retVal; + return retVal; + } + else { + var retVal = []; + var m = void 0; + var m2 = void 0; + while ((m = rSelectors.exec(styleText)) != null) { + var keyVals = {}; + var selKey = m[1]; + var selVal = m[2]; + while ((m2 = rKeyVals.exec(selVal)) != null) { + keyVals[m2[1]] = m2[2].trim().toLowerCase(); + } + retVal.push({ + selector: selKey, + values: keyVals, + }); + } + element.IBM_CSS_THB = retVal; + return retVal; + } + }; + /** + * an "inline" CSS display property tells the element to fit itself on the same line. An 'inline' element's width and height are ignored. + * some element has default inline property, such as <span>, <a> + * most formatting elements inherent inline property, such as <em>, <strong>, <i>, <small> + * other inline elements: <abbr> <acronym> <b> <bdo> <big> <br> <cite> <code> <dfn> <em> <i> <input> <kbd> <label> + * <map> <object> <output> <q> <samp> <script> <select> <small> <span> <strong> <sub> <sup> <textarea> <time> <tt> <var> + * an "inline-block" element still place element in the same line without breaking the line, but the element's width and height are applied. + * inline-block elements: img, button, select, meter, progress, marguee, also in Chrome: textarea, input + * A block-level element always starts on a new line, and the browsers automatically add some space (a margin) before and after the element. + * block-level elements: <address> <article> <aside> <blockquote> <canvas> <dd> <div> <dl> <dt> <fieldset> <figcaption> <figure> <footer> <form> + * <h1>-<h6> <header> <hr> <li> <main> <nav> <noscript> <ol> <p> <pre> <section> <table> <tfoot> <ul> <video> + * + * return: if it's inline element and { inline: true | false, text: true | false, violation: null | {node} } + */ + CSSUtil.getInlineStatus = function (element) { + if (!element) + return null; + var elem_styl = getComputedStyle(element); + if (!elem_styl) + return null; + var status = { inline: false, text: false, violation: null }; + var udisplay = elem_styl.getPropertyValue("display"); + // inline element only + if (udisplay !== "inline") + return status; + status.inline = true; + var parent = element.parentElement; + if (!parent) + return status; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(element); + var style = getComputedStyle(parent); + var display = style.getPropertyValue("display"); + // an inline element is inside a block. note <body> is a block element too + if (display !== "block" && display !== "inline-block") { + //parent is inline element + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(parent)) + status.text = true; + return status; + } + /** + * @returns "yes"": inline with text, "no": inline without text, + * "violation": not spacing enough to neiboring inline target + * "block": block element, + */ + function isInlineWithText(node, before) { + // note browsers insert Text nodes to represent whitespaces. + if (node.nodeType === Node.TEXT_NODE) { + if (node.nodeValue && node.nodeValue.trim().length > 0) + return "yes"; + else + return "no"; + } + else if (node.nodeType === Node.ELEMENT_NODE) { + // special case: <br> is styled 'inline' by default, but change the line + if (node.nodeName.toLowerCase() === "br") + return "block"; + var cStyle = getComputedStyle(node); + var cDisplay = cStyle.getPropertyValue("display"); + if (cDisplay === "inline") { + if (CommonUtil_1.CommonUtil.isTarget(node)) { + if (bounds.width < 24) { + // check if the horizontal spacing is sufficient + var bnds = mapper.getUnadjustedBounds(node); + if ((before && (Math.round(bounds.width / 2) + bounds.left - bnds.left < 24)) + || (!before && (Math.round(bounds.width / 2) + bounds.left - (bnds.left + bnds.width) < 24))) { + status.violation = node.nodeName.toLowerCase(); + return "violation"; + } + else + return "no"; + } + } + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(node)) + return "yes"; + return "no"; + } + else + return "block"; + } + else + return "block"; + } + // an inline element is inside a block. note <body> is a block element too + // one or more inline elements with text in the same line: <target>, text<target>, <target>text, <inline>+text<target>, <target><inline>+text, text<target><inline>+ + var walkNode = element.nextSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, true); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.nextSibling; + } + walkNode = element.previousSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, false); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.previousSibling; + } + return status; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * a target is a browser default if it's a native widget (no user defined role) without user style + */ + CSSUtil.isTargetBrowserDefault = function (element) { + if (!element) + return false; + // user defined widget + var roles = AriaUtil_1.AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) + return false; + // no user style to space control size, including use of font + var styles = CSSUtil.getDefinedStyles(element, [ + "line-height", "height", "width", "min-height", "min-width", + "font-size", "margin-top", "margin-bottom", "margin-left", "margin-right" + ]); + if (styles["line-height"] || + styles["height"] || + styles["width"] || + styles["min-height"] || + styles["min-width"] || + styles["font-size"] || + styles["margin-top"] || + styles["margin-bottom"] || + styles["margin-left"] || + styles["margin-right"]) + return false; + return true; + }; + /* + * string contains CJK (chinese, japaneses, or korea) + * return: boolean + */ + CSSUtil.containsCKJ = function (text) { + if (!text) + return false; + // https://en.wikipedia.org/wiki/CJK_Unified_Ideographs https://ayaka.shn.hk/hanregex/ + var regex = /(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g; + var replaced = text.trim().replace(regex, ""); + if (replaced.length === text.trim().length) + return false; + return true; + }; + /** + * Return the ancestor with the given style properties. + * Searches up the DOM tree to find an ancestor that has ALL specified style properties + * with values matching the criteria. + * + * @param {element} elem - The element to start the node walk on to find parent node + * @param {Object} styleProps - The style properties and values of the parent to search for. + * such as {"overflow":['auto', 'scroll'], "overflow-x":['auto', 'scroll']} + * or {"overflow":['*'], "overflow-x":['*']}, The '*' for any value to check the existence of the style prop. + * @param {Array} excludedValues - style values that should be ignored. + * @return {Element|null} - An ancestor element that has all the specified style properties, or null if none found + * @memberOf CSSUtil + */ + CSSUtil.getAncestorWithStyles = function (elem, styleProps, excludedValues) { + if (excludedValues === void 0) { excludedValues = []; } + // Create a cache key that includes the style properties being searched for + var cacheKey = "AriaUtil_AncestorWithStyles_" + JSON.stringify(styleProps) + "_" + JSON.stringify(excludedValues); + // Check if we already have a cached result for this specific query + var cachedResult = CacheUtil_1.CacheUtil.getCache(elem, cacheKey, null); + if (cachedResult !== null) { + return cachedResult === "NOT_FOUND" ? null : cachedResult; + } + // Start with the element itself (not just parent) to maintain backward compatibility + var walkNode = elem; + while (walkNode !== null) { + // Skip if not an HTMLElement (e.g., SVGElement) + // Use nodeType check instead of instanceof to work across different document contexts + if (walkNode.nodeType !== 1 || walkNode.namespaceURI === "http://www.w3.org/2000/svg") { + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + continue; + } + var styles = CSSUtil.getDefinedStyles(walkNode, Object.keys(styleProps)); + // Check if ANY specified style property matches the criteria (OR logic) + for (var styleProp in styleProps) { + var value = styles[styleProp]; + if (!value) { + // Property not defined on this element, try next property + continue; + } + // Remove !important suffix for comparison + value = value.split(" ")[0]; + // Check if value should be excluded + if (excludedValues.includes(value)) { + continue; + } + // Check if value matches the criteria + var acceptedValues = styleProps[styleProp]; + if (acceptedValues.includes('*')) { + // Any value is acceptable (just checking existence) + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + else if (acceptedValues.includes(value)) { + // Value matches one of the accepted values + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + } + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + // No matching element or ancestor found - cache this result to avoid re-searching + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, "NOT_FOUND"); + return null; + }; + /** + * return an array [value, Unit] from a value-unit combo string + * @param valueUnitCombo, such as 20px, 2rem + * @returns + */ + CSSUtil.getValueUnitPair = function (valueUnitCombo) { + if (!valueUnitCombo) + return null; + if (Number.isInteger(valueUnitCombo)) + return ["px", valueUnitCombo]; + var value = parseInt(valueUnitCombo); + if (isNaN(value)) + return null; + valueUnitCombo = valueUnitCombo.trim().toLowerCase(); + var match = valueUnitCombo.trim().match(/([a-z]+)$/); + var unit = 'px'; + if (match) + unit = match[1]; + return [unit, value]; + }; + return CSSUtil; +}()); +exports.CSSUtil = CSSUtil; + + +/***/ }, + +/***/ "./src/v4/util/CacheUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/CacheUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CacheUtil = void 0; +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil = /** @class */ (function () { + function CacheUtil() { + } + /* Return a pointer to the given global variable + * with its initial value as given */ + CacheUtil.getCache = function (cacheSpot, keyName, initValue) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined) { + cacheObj.aceCache[keyName] = initValue; + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.setCache = function (cacheSpot, globalName, value) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + cacheObj.aceCache[globalName] = value; + return value; + }; + CacheUtil.getSetCache = function (cacheSpot, keyName, initFunc) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined || typeof cacheObj.aceCache[keyName] === "undefined") { + cacheObj.aceCache[keyName] = initFunc(); + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.clearCaches = function (cacheRoot) { + var _a; + var numNodesVisited = 0; + delete cacheRoot.ownerDocument.aceCache; + var nw = new DOMWalker_1.DOMWalker(cacheRoot, false, cacheRoot, true); + do { + ++numNodesVisited; + delete nw.node.aceCache; + nw.node.ownerDocument && delete nw.node.ownerDocument.aceCache; + } while (nw.nextNode()); + if (cacheRoot !== ((_a = cacheRoot.ownerDocument) === null || _a === void 0 ? void 0 : _a.documentElement)) { + // Start the walker at the documentElement of cacheRoot's immediate document. + // ownerDocument is guaranteed non-null here because the if-guard above + // checks cacheRoot.ownerDocument?.documentElement. + var nwDoc = new DOMWalker_1.DOMWalker(cacheRoot.ownerDocument.documentElement, false, undefined, true); + // cacheRoot may be inside a shadow root or an iframe, which are themselves + // nested inside ancestor documents. Walk up from cacheRoot across any + // frame/shadow boundaries (DOMWalker.parentElement handles ownerElement + // links set by the walker) to find the outermost ancestor element, then + // reposition the walker there so the second pass covers every containing + // document as well. + { + var tempElem = nwDoc.node; + var parentElem = void 0; + while (parentElem = DOMWalker_1.DOMWalker.parentElement(tempElem)) { + tempElem = parentElem; + } + nwDoc.node = tempElem; + } + do { + // On the start-tag visit of cacheRoot, skip its entire subtree — + // it was already cleared and counted in the first pass above. + // Setting bEndTag=true makes the next nextNode() call emit cacheRoot's + // end-tag and then advance to its next sibling without descending into + // its children. + if (!nwDoc.bEndTag && DOMUtil_1.DOMUtil.sameNode(cacheRoot, nwDoc.node)) { + nwDoc.bEndTag = true; + continue; + } + delete nwDoc.node.aceCache; + nwDoc.node.ownerDocument && delete nwDoc.node.ownerDocument.aceCache; + } while (nwDoc.nextNode()); + } + return numNodesVisited; + }; + return CacheUtil; +}()); +exports.CacheUtil = CacheUtil; + + +/***/ }, + +/***/ "./src/v4/util/ClipPathUtil.ts" +/*!*************************************!*\ + !*** ./src/v4/util/ClipPathUtil.ts ***! + \*************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ClipPathUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ./CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ClipPathUtil = /** @class */ (function () { + function ClipPathUtil() { + } + /** + * This function is responsible for checking if the node that is visually hidden by css clip-path: + * + * Note 1: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note 2: nodes with CSS properties clip-path, the content is not considered hidden to an AT. Text hidden with these methods + * can still be reedable by screen readers. + * Note 3: if a link, form control, or other focusable element is given this style, the element would be focusable but not visible, + * keyboard users might be confused. + * + * @parm {Node} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + ClipPathUtil.isNodeVisuallyHiddenByClipPath = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", undefined); + if (hidden !== undefined) + return hidden; + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + var path = style['clip-path']; + if (!path || path.trim() === 'none' || path.trim() === '') { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + path = path.trim().replace(/\s+/g, ' ').toLowerCase(); + var index = path.indexOf("inset("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + // When one value is specified, it applies the same inset to all four sides + if (numbers.length === 1) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[0], numbers[0], numbers[0]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When two values are specified, the first value applies to the top and bottom, the second to the left and right. + if (numbers.length === 2) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[0], numbers[1]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When three values are specified, the first applies to the top, the second to the right and left, the third to the bottom. + if (numbers.length === 3) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[1], numbers[2]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When four values are specified, the values apply to the top, right, bottom, and left in that order (clockwise). + if (numbers.length === 4) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[2], numbers[3]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + } + index = path.indexOf("rect("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + /** + * The first (top) and third (bottom) values are distances from the top edge of the containing block, + * and the second (right) and fourth (left) values are distances from the left edge of the containing block. + * The second (right) and third (bottom) values are clamped by the fourth (left) and first (top) values, respectively, + * + * If auto is used for the first (top) or fourth (left) value, the value of auto is 0, + * and if used for the second (right) or third (bottom) value, the value of auto is 100%. + */ + if (numbers[0] === 'auto') + numbers[0] = '0px'; + if (numbers[3] === 'auto') + numbers[3] = '0px'; + if (numbers[1] === 'auto') + numbers[1] = '100%'; + if (numbers[2] === 'auto') + numbers[2] = '100%'; + // to prevent the bottom edge from crossing over the top edge and right edge from crossing over the left edge. + // for example, rect(10px 0 0 20px) is clamped to rect(10px 20px 10px 20px) + numbers[2] = Math.max(numbers[0], numbers[2]); + numbers[1] = Math.max(numbers[1], numbers[3]); + var top_1 = parseInt(numbers[0]); + if (isNaN(top_1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + top_1 = top_1 * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + top_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (top_1 >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var left = parseInt(numbers[3]); + if (isNaN(left)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + left = left * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + left = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (left >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var right = parseInt(numbers[1]); + if (isNaN(right)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + right = right * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + right = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + var bottom = parseInt(numbers[2]); + if (isNaN(bottom)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + bottom = bottom * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + bottom = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if ((bottom - top_1) <= ClipPathUtil.THRESHOLD || (right - left) <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("xywh("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + var x = parseInt(numbers[0]); + if (isNaN(x)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + x = x * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + x = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (x >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var y = parseInt(numbers[1]); + if (isNaN(y)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + y = y * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(y); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + scrollY = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (y >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var w = parseInt(numbers[2]); + if (isNaN(w)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + w = w * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(w); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + w = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (w <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + var h = parseInt(numbers[3]); + if (isNaN(h)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + h = h * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(h); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + h = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (h <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("circle("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + var radius = parseInt(numbers[0]); + if (isNaN(radius)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) { + var short = width > height ? height : width; + radius = radius * short / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("ellipse("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + // ellipse(closest-side farthest-side at 30% 40%); + if (numbers.length > 3 && numbers[0] === 'closest-side' && numbers[1] === 'farthest-side' && numbers[2] === 'at') { + var radius = parseInt(numbers[3]); + if (numbers.length === 4) { + if (numbers[3].endsWith("%")) { + var value = width > height ? height : width; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + else if (numbers.length === 5) { + for (var i = 3; i < numbers.length; i++) { + var radius_1 = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 3) ? width : height; + radius_1 = radius_1 * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius_1 <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + // ellipse(40% 50% at left); + var at_index = path.indexOf("at"); + str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (at_index !== -1) + str = path.substring(path.indexOf("(") + 1, at_index); + numbers = str.trim().split(" "); + if (numbers.length !== 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + for (var i = 0; i < numbers.length; i++) { + var radius = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 0) ? width : height; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("polygon("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(","); + // polygon(nonzero|evenodd, 0% 0%, 50% 50%, 0% 100%) + if (numbers[0] === 'nonzero' || numbers[0] === 'evenodd') + numbers.shift(); + var y = 0; + var x = 0; + var changed_x = false; + var changed_y = false; + for (var i = 0; i < numbers.length; i++) { + var coordinates = numbers[i].trim().split(" "); + if (coordinates.length != 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var coordinate_xy = [0, 0]; + for (var i_1 = 0; i_1 < 2; i_1++) { + var value = parseInt(coordinates[i_1]); + if (isNaN(value)) + return false; + if (coordinates[i_1].endsWith("%")) + coordinate_xy[i_1] = (i_1 === 0) ? value * width / 100 : value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(coordinates[i_1]); + if (!pair) + return false; + coordinate_xy[i_1] = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + } + if (i === 0) { + x = coordinate_xy[0]; + y = coordinate_xy[1]; + } + if (Math.abs(coordinate_xy[0] - x) >= ClipPathUtil.THRESHOLD) + changed_x = true; + if (Math.abs(coordinate_xy[1] - y) >= ClipPathUtil.THRESHOLD) + changed_y = true; + } + if (changed_x && changed_y) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + }; + ClipPathUtil.isClippedByInset = function (elem, top, right, bottom, left) { + if (right === void 0) { right = '0px'; } + if (bottom === void 0) { bottom = '0px'; } + if (left === void 0) { left = '0px'; } + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + // top + var top_value = parseInt(top); + if (isNaN(top_value)) + return false; + if (top.endsWith("%")) + top_value = top_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) + return false; + top_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (top_value > height) + return false; + // right + var right_value = parseInt(right); + if (isNaN(right_value)) + return false; + if (right.endsWith("%")) + right_value = right_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) + return false; + right_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (right_value > width) + return false; + // bottom + var bottom_value = parseInt(bottom); + if (isNaN(bottom_value)) + return false; + if (bottom.endsWith("%")) + bottom_value = bottom_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) + return false; + bottom_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (bottom_value > height) + return false; + // left + var left_value = parseInt(left); + if (isNaN(left_value)) + return false; + if (left.endsWith("%")) + left_value = left_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) + return false; + left_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (left_value > width) + return false; + if (height - (top_value + bottom_value) <= ClipPathUtil.THRESHOLD || width - (right_value + left_value) <= ClipPathUtil.THRESHOLD) + return true; + return false; + }; + ClipPathUtil.THRESHOLD = 5; // 5px + return ClipPathUtil; +}()); +exports.ClipPathUtil = ClipPathUtil; + + +/***/ }, + +/***/ "./src/v4/util/ColorUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/ColorUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ColorObj = exports.ColorUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var ColorUtil = /** @class */ (function () { + function ColorUtil() { + } + // Rewrite the color object to account for alpha + ColorUtil.Color = function (cssStyleColor) { + if (!cssStyleColor) + return null; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor === "transparent") + return new ColorObj(255, 255, 255, 0); + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3]); + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3], m[4]); + } + } + else if (cssStyleColor.charAt(0) != "#") { + return null; + } + else { + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + var thisRed = parseInt(cssStyleColor.substring(1, 3), 16); + var thisGreen = parseInt(cssStyleColor.substring(3, 5), 16); + var thisBlue = parseInt(cssStyleColor.substring(5, 7), 16); + return new ColorObj(thisRed, thisGreen, thisBlue); + } + // return null; // Unreachable + }; + ; + ColorUtil.ColorCombo = function (ruleContext) { + try { + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + var ancestors = []; + var walkNode = ruleContext; + while (walkNode) { + if (walkNode.nodeType === 1) + ancestors.push(walkNode); + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + var retVal = { + "hasGradient": false, + "hasBGImage": false, + "textShadow": false, + "fg": null, + "bg": null + }; + // start + var cStyle = win.getComputedStyle(ruleContext); + var compStyleColor = cStyle.color; + if (!compStyleColor) + compStyleColor = "black"; + var fg = ColorUtil.Color(compStyleColor); + var reColor = /transparent|rgba?\([^)]+\)/gi; + var guessGradColor = function (gradList, bgColor, fgColor) { + try { + // If there's only one color, return that + if (typeof gradList.length === "undefined") + return gradList; + var overallWorst = null; + var overallWorstRatio = null; + for (var iGrad = 1; iGrad < gradList.length; ++iGrad) { + var worstColor = gradList[iGrad - 1]; + var worstRatio = fgColor.contrastRatio(gradList[iGrad - 1]); + var step = .1; + var idx = 0; + while (step > .0001) { + while (idx + step <= 1 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx + step; + } + while (idx - step >= 0 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx - step; + } + step = step / 10; + } + if (overallWorstRatio === null || overallWorstRatio > worstRatio) { + overallWorstRatio = worstRatio; + overallWorst = worstColor; + } + } + return overallWorst; // return the darkest color + } + catch (e) { + console.log(e); + } + return bgColor; + }; + var priorStackBG = ColorUtil.Color("white"); + var thisStackOpacity = null; + var thisStackAlpha = null; + var thisStackBG = null; + // Ancestors processed from the topmost parent toward the child + while (ancestors.length > 0) { + var procNext = ancestors.pop(); + //var procNext = ancestors.splice(0, 1)[0]; + // cStyle is the computed style of this layer + var cStyle = win.getComputedStyle(procNext); + if (cStyle === null) + continue; + // thisBgColor is the color of this layer or null if the layer is transparent + var thisBgColor = null; + if (cStyle.backgroundColor && cStyle.backgroundColor != "transparent" && cStyle.backgroundColor != "rgba(0, 0, 0, 0)") { + thisBgColor = ColorUtil.Color(cStyle.backgroundColor); + } + // If there is a gradient involved, set thisBgColor to the worst color combination available against the foreground + if (cStyle.backgroundImage && cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + var gradColors = cStyle.backgroundImage.match(reColor); + if (gradColors) { + var gradColorComp = []; + for (var i = 0; i < gradColors.length; ++i) { + if (!gradColors[i].length) { + gradColors.splice(i--, 1); + } + else { + var colorComp = ColorUtil.Color(gradColors[i]); + if (colorComp.alpha !== undefined && colorComp.alpha < 1) { + // mix the grdient bg color wit parent bg if alpha < 1 + var compStackBg = thisStackBG || priorStackBG; + colorComp = colorComp.getOverlayColor(compStackBg); + } + gradColorComp.push(colorComp); + } + } + thisBgColor = guessGradColor(gradColorComp, thisStackBG || priorStackBG, fg); + } + } + // Handle non-solid opacity + if (thisStackOpacity === null || (cStyle.opacity && cStyle.opacity.length > 0 && parseFloat(cStyle.opacity) < 1)) { + // New stack, reset + if (thisStackBG != null) { + // Overlay + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + thisStackOpacity = 1.0; + thisStackAlpha = null; + thisStackBG = null; + if (cStyle.opacity && cStyle.opacity.length > 0) { + thisStackOpacity = parseFloat(cStyle.opacity); + } + if (thisBgColor != null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0) { + retVal.hasBGImage = false; + retVal.hasGradient = false; + } + } + } + // Handle solid color backgrounds and gradient color backgrounds + else if (thisBgColor != null) { + // If this stack already has a background color, blend it + if (thisStackBG === null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + } + else { + thisStackBG = thisBgColor.getOverlayColor(thisStackBG); + //thisStackAlpha = thisBgColor.alpha || 1.0; + thisStackAlpha = thisStackBG.alpha || 1.0; + } + // #526: If thisBgColor had an alpha value, it may not expose through thisStackBG in the above code + // We can't wipe out the gradient info if this layer was transparent + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0 && (thisStackBG.alpha || 1.0) === 1.0 && (thisBgColor.alpha || 1.0) === 0) // removed by dead control flow +{} + } + if (cStyle.backgroundImage && cStyle.backgroundImage != "none") { + if (cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + retVal.hasGradient = true; + } + else { + retVal.hasBGImage = true; + } + } + } + if (thisStackBG != null) { + fg = fg.getOverlayColor(thisStackBG); + delete fg.alpha; + } + fg.alpha = (fg.alpha || 1) * thisStackOpacity; + fg = fg.getOverlayColor(priorStackBG); + if (thisStackBG != null) { + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + retVal.fg = fg; + retVal.bg = priorStackBG; + if (cStyle.textShadow && cStyle.textShadow !== 'none') + retVal.textShadow = true; + return retVal; + } + catch (err) { + // something happened, then... + return null; + } + }; + ; + ColorUtil.CSSColorLookup = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", + "buttontext": "rgba(0, 0, 0, 0.847)", + "buttonface": "#ffffff", + "graytext": "rgba(0, 0, 0, 0.247)" + }; + return ColorUtil; +}()); +exports.ColorUtil = ColorUtil; +var ColorObj = /** @class */ (function () { + function ColorObj(red, green, blue, alpha) { + function fixComponent(comp) { + if (typeof (comp) != typeof ("")) + return comp; + var compStr = comp; + compStr = compStr.trim(); + if (compStr[compStr.length - 1] != "%") + return parseInt(compStr); + return Math.round(parseFloat(compStr.substring(0, compStr.length - 1)) * 2.55); + } + this.red = fixComponent(red); + this.green = fixComponent(green); + this.blue = fixComponent(blue); + if (typeof (alpha) != "undefined") { + this.alpha = (typeof (alpha) === typeof ("")) ? parseFloat(alpha) : alpha; + } + } + ColorObj.prototype.toHexHelp = function (value) { + var retVal = Math.round(value).toString(16); + if (retVal.length === 1) + return "0" + retVal; + return retVal; + }; + ; + ColorObj.prototype.toHex = function () { + return "#" + this.toHexHelp(this.red) + this.toHexHelp(this.green) + this.toHexHelp(this.blue); + }; + ; + ColorObj.prototype.contrastRatio = function (bgColor) { + var fgColor = this; + if (typeof (this.alpha) != "undefined") + fgColor = this.getOverlayColor(bgColor); + var lum1 = fgColor.relativeLuminance(); + if (!bgColor.relativeLuminance) { + var s = ""; + for (var key in bgColor) { + s += key + "\n"; + } + alert(bgColor); + alert(s); + } + var lum2 = bgColor.relativeLuminance(); + var ratio = (lum1 > lum2) ? (lum1 + .05) / (lum2 + .05) : (lum2 + .05) / (lum1 + .05); + return ratio; + }; + ; + ColorObj.prototype.relativeLuminance = function () { + var R = this.red / 255.0; + var G = this.green / 255.0; + var B = this.blue / 255.0; + R = R <= .04045 ? R / 12.92 : Math.pow((R + .055) / 1.055, 2.4); + G = G <= .04045 ? G / 12.92 : Math.pow((G + .055) / 1.055, 2.4); + B = B <= .04045 ? B / 12.92 : Math.pow((B + .055) / 1.055, 2.4); + return 0.2126 * R + 0.7152 * G + 0.0722 * B; + }; + ; + ColorObj.prototype.mix = function (color2, percThis) { + if (typeof (this.alpha) === "undefined" && typeof (color2.alpha) === "undefined") { + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue); + } + else { + var alphaThis = this.alpha ? this.alpha : 1; + var alphaOther = color2.alpha ? color2.alpha : 1; + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue, percThis * alphaThis + (1 - percThis) * alphaOther); + } + }; + ; + ColorObj.prototype.getOverlayColor = function (bgColor) { + if (typeof (this.alpha) === "undefined" || this.alpha >= 1) { + // No mixing required - it's opaque + return this; + } + if (this.alpha < 0) { + // Haac.Error.logError("Invalid alpha value"); + return null; + } + if (typeof (bgColor.alpha) != "undefined" && bgColor.alpha < 1) { + // Haac.Error.logError("Cannot mix with a background alpha"); + return null; + } + var retVal = this.mix(bgColor, this.alpha); + delete retVal.alpha; + return retVal; + }; + ColorObj.fromCSSColor = function (cssStyleColor) { + var thisRed = -1; + var thisGreen = -1; + var thisBlue = -1; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else { + if (cssStyleColor.charAt(0) != "#") { + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + else + return null; + } + var fromHex = function (val) { + var lookup = { + "a": 10, + "b": 11, + "c": 12, + "d": 13, + "e": 14, + "f": 15 + }; + var retVal = 0; + for (var i = 0; i < val.length; ++i) { + retVal = retVal * 16 + + parseInt(val.charAt(i) in lookup ? lookup[val.charAt(i)] : val.charAt(i)); + } + return retVal; + }; + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + thisRed = fromHex(cssStyleColor.substring(1, 3)); + thisGreen = fromHex(cssStyleColor.substring(3, 5)); + thisBlue = fromHex(cssStyleColor.substring(5, 7)); + } + return new ColorObj(thisRed, thisGreen, thisBlue); + }; + return ColorObj; +}()); +exports.ColorObj = ColorObj; + + +/***/ }, + +/***/ "./src/v4/util/CommonUtil.ts" +/*!***********************************!*\ + !*** ./src/v4/util/CommonUtil.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ./AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil = /** @class */ (function () { + function CommonUtil() { + } + CommonUtil.wordCount = function (str) { + str = str.trim(); + if (str.length === 0) + return 0; + return str.split(/\s+/g).length; + }; + /** + * Note that this only detects if the element itself is in the tab order. + * However, this element may delegate focus to another element via aria-activedescendant. + * Also, focus varies by browser... sticking to things that are focusable on Chrome and Firefox. + */ + CommonUtil.isTabbable = function (element) { + // Using https://allyjs.io/data-tables/focusable.html + // Handle the explicit cases first + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + if (element.hasAttribute("inert") || DOMUtil_1.DOMUtil.getAncestorWithAttribute(element, "inert", "")) + return false; + if (element.hasAttribute("tabindex")) { + return parseInt(element.getAttribute("tabindex")) >= 0; + } + // Explicit cases handled - now the implicit + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + var ce = element.getAttribute("contenteditable"); + if (ce === "true" || ce === "") + return true; + return false; + } + }; + /** + * Test if the ele node is focusable + */ + CommonUtil.isFocusable = function (ele) { + if (ele === "undefined" || ele === null) { + return false; + } + return CommonUtil.isTabbable(ele); + }; + /** + * Note that this only detects if the element itself is interactive, but not onclick event. + */ + CommonUtil.isClickable = function (element) { + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + // native focusable element + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + //custom widget + if (AriaUtil_1.AriaUtil.isWidget(element) && element.hasAttribute("tabindex")) { + return true; + } + } + return false; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + CommonUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + CommonUtil.tabIndexLEZero = function (elem) { + if (CommonUtil.hasAttribute(elem, "tabindex")) { + if (elem.getAttribute("tabindex").match(/^-?\d+$/)) { + var tabindexValue = parseInt(elem.getAttribute("tabindex")); + return tabindexValue === 0 || tabindexValue === -1; + } + } + return false; + }; + /** + * get number of tabbable children + * @param element + */ + CommonUtil.getTabbableChildren = function (element) { + var count = 0; + // If node has children, look for tab stops in the children + if (element.firstChild || element.nodeName.toUpperCase() === "IFRAME") { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode() && nw.node != element) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + return count; + }; + CommonUtil.normalizeSpacing = function (s) { + if (!s) + return ''; + return s.trim().replace(/\s+/g, ' '); + }; + ; + //TODO: function does not handle equivalents for roles: row, link, header, button + // But it may not have to. Bug reports have been about radio buttons and checkboxes. + CommonUtil.isHtmlEquiv = function (node, htmlEquiv) { + var retVal = false; + if (node) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = node.getAttribute("type").toLowerCase(); + if (type) { + if (htmlEquiv.indexOf("checkbox") != -1) { + retVal = type === "checkbox"; + } + else if (htmlEquiv.indexOf("radio") != -1) { + retVal = type === "radio"; + } + } + } + } + return retVal; + }; + CommonUtil.nonExistantIDs = function (node, targetids) { + var returnnotfoundids = ''; + if (CommonUtil.normalizeSpacing(targetids).length < 1) + return returnnotfoundids; + var targetArray = targetids.split(" "); + var doc = node.ownerDocument; + for (var i = 0; i < targetArray.length; i++) { + var xp = "//*[@id='" + targetArray[i] + "']"; + var xpathResult = doc.evaluate(xp, node, doc.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + if (!r) + returnnotfoundids += targetArray[i] + ', '; + } + if (CommonUtil.normalizeSpacing(returnnotfoundids).length >= 2) + returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2); + else + returnnotfoundids = ''; + return returnnotfoundids; + }; + CommonUtil.getDocElementsByTag = function (elem, tagName) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + tagName = tagName.toLowerCase(); + var cache = CacheUtil_1.CacheUtil.getCache(doc, "RPT_DOCELEMSBYTAG", {}); + if (!(tagName in cache)) { + cache[tagName] = doc.querySelectorAll(tagName); + CacheUtil_1.CacheUtil.setCache(doc, "RPT_DOCELEMSBYTAG", cache); + } + return cache[tagName]; + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * Note: This is a wrapper function to: AriaUtil.getChildByTagHidden + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTag = function (parentElem, tagName) { + return CommonUtil.getChildByTagHidden(parentElem, tagName, false, false); + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTagHidden = function (parentElem, tagName, ignoreHidden, considerHiddenSetting) { + // Variable Decleration + var retVal = []; + var child = parentElem.firstChild; + // Loop over all the child elements of the parent to build a list of all the elements that + // match the tagName provided + while (child != null) { + // Only include the children into the return array if they match with tagname. + if (child.nodeName.toLowerCase() === tagName) { + // In the case that ignorehidden was set to true, then perform a isNodeVisible check + // and in the case the node is not visilble we more to theses then move to the next node. + // Perform a couple of checks to determine if hidden elements should be ignored or not. + // 1. When ignoreHidden is set to true upfront, then perform a isNodeVisible + // 2. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2.1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if ((ignoreHidden || (considerHiddenSetting && !CommonUtil.shouldCheckHiddenContent(child))) && !VisUtil_1.VisUtil.isNodeVisible(child)) { + // Move on to the next element + child = child.nextSibling; + continue; + } + // Push the element + retVal.push(child); + } + // Move to the next sibling element + child = child.nextSibling; + } + return retVal; + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function by defauly will not consider Check Hidden Setting at all. + * This function by defauly will not consider implicit roles. + * Note: This is a wrapper function to: AriaUtil.getElementsByRoleHidden + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRole = function (doc, roles) { + return CommonUtil.getElementsByRoleHidden(doc, roles, false, false); + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function aslo finds elements with implicit roles. + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRoleHidden = function (doc, roles, considerHiddenSetting, considerImplicitRoles) { + // In the case that the role to element assoication is already made, and available in the global hasAttribute + // we can just use that one instead of building a new one. + var roleToElems = null; + if (considerImplicitRoles) { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", null); + } + else { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", null); + } + // Build the new role to element, this is where we loop through all the elements and extract all the + // elements bsaed on roles. + if (roleToElems === null) { + // Re-initialize the roleToElems hash + roleToElems = {}; + // Get the body of the doc + var root = doc.body; + // Keep looping until we are at the very parent node of the entire page, so that we can loop through + // all the nodes. + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + // Build a nodewalter based of the root node, this node walter will be use loop over all the nodes + // and build the roles to Element coralation + var nw = new DOMWalker_1.DOMWalker(root); + // Loop over the entire doc/list of nodes to build the role to element map + // Note: This will build an roleToElems hash which is in the following format. + // roleToElems = { + // document: [{div},{abbr},{var}], + // main: [{div}], + // navigation: [{div}] + // } + while (nw.nextNode()) { + if (!nw.elem()) + continue; + // Only check the elements which have the role attribute assiciated to them + if (!nw.bEndTag) { + var wRoles = []; + //check if the node has role attributes + if (nw.elem() && nw.elem().hasAttribute("role")) { + // Extract all the roles that are assigned to this element, can have multiple roles on one + // element split by space, so we need to extract all of them into an array. + wRoles = nw.elem().getAttribute("role").split(" "); + } + if (nw.elem() && wRoles.length === 0 && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil_1.AriaUtil.getImplicitRole(nw.node); + if (implicitRole !== null && implicitRole.length > 0) + wRoles = implicitRole; + } + if (wRoles.length === 0) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Loop through all the roles and assigned this node to all thes roles + for (var i = 0; i < wRoles.length; ++i) { + // In the case that the role key is not already in the roleToElems hash, construct the + // add the key and assign empty array. + if (!(wRoles[i] in roleToElems)) { + roleToElems[wRoles[i]] = []; + } + // Add the node to the array for the role + roleToElems[wRoles[i]].push(nw.node); + } + } + } + // Set the roleToElems hash map as a global variable + if (considerImplicitRoles) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems); + } + else { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", roleToElems); + } + } + // Initilize the return value + var retVal = []; + // Handle the cases where the provided role is a string and not an array, + // for this case we take the string and put it into an array + if (typeof (roles) === "string") { + var role = roles; + roles = []; + roles.push(role); + } + // Loop through the roles that were provided and find the list of elements for this roles + // and add them to the return value. + if (roles.length) { + // loop over all the roles + for (var i = 0; i < roles.length; ++i) { + // Extract the role from the array + var nextRole = roles[i]; + // Fetch the list of all the elements for this role + var copyRoles = roleToElems[nextRole]; + // If there are elements to copy to another array, then perform the copy + if (copyRoles) { + // Loop over all the elements which are to be copied + for (var j = 0; j < copyRoles.length; ++j) { + // Add this element to the return val + retVal.push(copyRoles[j]); + } + } + } + } + return retVal; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * + */ + CommonUtil.isTarget = function (element) { + if (!element || element.nodeType !== 1 + || ["html", "body"].includes(element.nodeName.toLowerCase()) + || CommonUtil.getAncestor(element, ["svg", "pre", "code", "script", "meta", 'head']) !== null + || !VisUtil_1.VisUtil.isNodeVisible(element) || VisUtil_1.VisUtil.isNodeVisuallyHidden(element) + || CommonUtil.isNodeDisabled(element) || VisUtil_1.VisUtil.isElementOffscreen(element)) + return false; + if (CommonUtil.isClickable(element)) + return true; + var role = AriaUtil_1.AriaUtil.getResolvedRole(element); + if (!role) + return false; + var target_roles = ["listitem", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "treeitem"]; + if (target_roles.includes(role)) { + // find the proper parent elements + var parent_1 = element.parentElement; + if (parent_1) { + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + // datalist, fieldset, optgroup, etc. may be just used for grouping purpose, so go up to the parent + if (parent_role === 'group') + parent_1 = parent_1.parentElement; + } + if (parent_1 && CommonUtil.isTarget(parent_1)) + return true; + } + return false; + }; + CommonUtil.getFileExt = function (url) { + var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/); + if (m != null && m.length >= 2) { + return "." + m[1]; + } + return ""; + }; + CommonUtil.getFileAnchor = function (url) { + var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/); + if (m != null && m.length >= 2) { + return m[1]; + } + return ""; + }; + CommonUtil.checkObjEmbed = function (node, extTest, mimeTest) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName != "object" && nodeName != "embed" && + nodeName != "a" && nodeName != "area") + return false; + var retVal = false; + // Check mime type + if (!retVal && node.hasAttribute("type")) { + var mime = node.getAttribute("type").toLowerCase(); + retVal = mimeTest(mime); + } + if (!retVal && node.hasAttribute("codetype")) { + var mime = node.getAttribute("codetype"); + retVal = mimeTest(mime); + } + // Check the filename + if (!retVal) { + var filename = ""; + if (nodeName === "embed") { + filename = node.getAttribute("src"); + } + else if (nodeName === "a" || nodeName === "area") { + filename = node.getAttribute("href"); + } + else if (node.hasAttribute("data")) { + filename = node.getAttribute("data"); + } + if (filename === null) + filename = ""; + var ext = CommonUtil.getFileExt(filename); + retVal = extTest(ext); + } + // Check for filenames in the params + if (!retVal && nodeName === "object") { + // In the case that Check Hidden Option is set then comply with that setting + var params = CommonUtil.getChildByTagHidden(node, "param", false, true); + for (var i = 0; !retVal && params != null && i < params.length; ++i) { + retVal = params[i].hasAttribute("value") && + extTest(CommonUtil.getFileExt(params[i].getAttribute("value"))); + } + } + return retVal; + }; + CommonUtil.isAudioObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isAudioExt, function (mime) { + return mime.startsWith("audio"); + }); + }; + CommonUtil.isAudioExt = function (ext) { + var audio_extensions = [".aif", ".aifc", ".aiff", ".air", ".asf", ".au", ".cda", + ".dsm", ".dss", ".dwd", ".iff", ".kar", ".m1a", ".med", + ".mp2", ".mp3", ".mpa", ".pcm", ".ra", ".ram", ".rm", + ".sam", ".sf", ".sf2", ".smp", ".snd", ".svx", ".ul", + ".voc", ".wav", ".wma", ".wve" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), audio_extensions); + }; + CommonUtil.isVideoObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isVideoExt, function (mime) { + return mime.startsWith("video") || + mime.startsWith("application/x-shockwave-flash"); + }); + }; + CommonUtil.isVideoExt = function (ext) { + var video_extensions = [".asf", ".avi", ".divx", ".dv", ".m1v", ".m2p", ".m2v", ".moov", + ".mov", ".mp4", ".mpeg", ".mpg", ".mpv", ".ogm", ".omf", ".qt", + ".rm", ".rv", ".smi", ".smil", ".swf", ".vob", ".wmv", ".rmvb", + ".mvb" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), video_extensions); + }; + CommonUtil.isImageObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isImgExt, function (mime) { + return mime.startsWith("image"); + }); + }; + CommonUtil.isImgExt = function (ext) { + return CommonUtil.valInArray(ext.toLowerCase(), CommonUtil.image_extensions); + }; + CommonUtil.isHtmlExt = function (ext) { + var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), html_extensions); + }; + CommonUtil.hasTriggered = function (doc, id) { + return CacheUtil_1.CacheUtil.getCache(doc, id, false); + }; + CommonUtil.triggerOnce = function (doc, id, passed) { + if (passed) + return true; + var triggered = CacheUtil_1.CacheUtil.getCache(doc, id, false); + CacheUtil_1.CacheUtil.setCache(doc, id, true); + return triggered; + }; + /* determine if the given value exists in the given array */ + CommonUtil.valInArray = function (value, arr) { + for (var idx in arr) { + if (arr[idx] === value) + return true; + } + return false; + }; + /** + * return the ancestor of the given element + * @param tagNames string, array, or dictionary containing the tags to search for + */ + CommonUtil.getAncestor = function (element, tagNames) { + var walkNode = element; + while (walkNode !== null) { + var thisTag = walkNode.nodeName.toLowerCase(); + if (typeof (tagNames) === "string") { + if (thisTag === tagNames.toLowerCase()) { + break; + } + } + else if (tagNames.length) { + for (var idx in tagNames) { + if (tagNames[idx] === thisTag) + return walkNode; + } + } + else if (thisTag in tagNames) { + break; + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + // return true if element1 and element2 are siblings + CommonUtil.isSibling = function (element1, element2) { + if (element1 && element2) { + var node = null; + if (DOMWalker_1.DOMWalker.parentNode(element1) && DOMWalker_1.DOMWalker.parentNode(element1).firstChild) { + node = DOMWalker_1.DOMWalker.parentNode(element1).firstChild; + } + while (node) { + if (node === element2) + return true; + node = node.nextSibling; + } + } + return false; + }; + CommonUtil.isDescendant = function (parent, child) { + var node = DOMWalker_1.DOMWalker.parentNode(child); + while (node != null) { + if (node === parent) { + return true; + } + node = DOMWalker_1.DOMWalker.parentNode(node); + } + return false; + }; + //check if the first form control child is disabled + CommonUtil.isDisabledByFirstChildFormElement = function (element) { + var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + if (formElements.includes(nw.node.nodeName.toLowerCase())) { + if (CommonUtil.isNodeDisabled(nw.node)) + return true; + return false; + } + } + } + return false; + }; + CommonUtil.isDisabledByReferringElement = function (element) { + var id = element.getAttribute("id"); + var doc = element.ownerDocument; + var root = doc.body; + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + var nw = new DOMWalker_1.DOMWalker(root); + while (nw.nextNode()) { + // check the element whose 'aria-describedby' equals to the id + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var AriaDescribedbyIDArray = (nw.elem().getAttribute("aria-describedby") || "").split(" "); + if (AriaDescribedbyIDArray.includes(id) && CommonUtil.isNodeDisabled(nw.node)) { + return true; + } + } + } + }; + /** get element containing label for the given element + * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead + */ + CommonUtil.getInputLabel = function (element) { + return CommonUtil.getLabelForElement(element); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * Note: This is a wrapper function to: AriaUtil.getLabelForElementHidden + * + * @parm {element} element - The element for which to get the label element for. + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElement = function (element) { + return CommonUtil.getLabelForElementHidden(element, false); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * This function will return null if the containing lable element is hidden, when the ignoreHidden option + * is set to true. + * + * @parm {element} element - The element for which to get the label element for. + * @parm {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElementHidden = function (element, ignoreHidden) { + // Check if the global AriaUtil_LABELS hash is available, as this will contain the label nodes based on + // for attribute. + //if (!getCache(element.ownerDocument,"AriaUtil_LABELS", null)) { + var root = element.getRootNode(); + if (!CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", null)) { + // Variable Decleration + var idToLabel = {}; + // Get all the label elements in the entire doc + var labelNodes = CommonUtil.getDocElementsByTag(element, "label"); + // Loop over all the label nodes, in the case the label node has a for attribute, + // extract that attribute and add this node to the hash if it is visible. + for (var i = 0; i < labelNodes.length; ++i) { + if (labelNodes[i].hasAttribute("for")) { + // If ignore hidden is specified and the node is not visible we do not add it to the + // labelNodes hash. + if (ignoreHidden && !VisUtil_1.VisUtil.isNodeVisible(labelNodes[i])) { + continue; + } + idToLabel[labelNodes[i].getAttribute("for")] = labelNodes[i]; + } + } + // Add the built hash to the ownerDocument (document), to be used later to fast retrival + //setCache(element.ownerDocument, "AriaUtil_LABELS", idToLabel); + CacheUtil_1.CacheUtil.setCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", idToLabel); + } + // If this element has an id attribute, get the corosponding label element + if (element.hasAttribute("id")) { + // Fetch the id attribute + var ctrlId = element.getAttribute("id"); + // Return the corosponding label element. + // Note: in the case that the the id is not found in the hash that means, it does not exists or is hidden + if (ctrlId.trim().length > 0) { + //return getCache(element.getRootNode().ownerDocument,"AriaUtil_LABELS",{})[ctrlId]; + return CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", {})[ctrlId]; + } + } + return null; + }; + /* Return specified element attribute if present else return null */ + CommonUtil.getElementAttribute = function (element, attr) { + //return (element && element.hasAttribute && element.hasAttribute(attr)) ? element.getAttribute(attr) : null; + if (!attr || !element || !element.hasAttribute || !element.hasAttribute(attr)) + return null; + var atrValue = element.getAttribute(attr); + if (!ARIADefinitions_1.ARIADefinitions.referenceProperties.includes(attr)) + return atrValue; + //attr is a reference to other elements(s) + var values = atrValue.split(/ +/g); + //ignore if none of the referred element(s) exist or all point to the element itself + var exist = false; + for (var id = 0; values < values.length; ++id) { + var referred = document.getElementById(values[id]); + if (referred && !DOMUtil_1.DOMUtil.sameNode(referred, element)) { + exist = true; + break; + } + } + return exist ? atrValue : null; + }; + // Return true if element has valid implicit label + CommonUtil.hasImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + return CommonUtil.hasInnerContentHidden(parentClone); + } + else { + return false; + } + }; + // Return the implicit label of the given form field + CommonUtil.getImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + var label = CommonUtil.getInnerText(parentClone); + return label && label.trim() !== '' ? label.trim() : null; + } + else + return null; + }; + /** + * This function is responsible for getting the label for a form field element. + * + * + * @parm {element} element - The element from which to get the label. + * + * @return {string} text - return the label text or null + * + * @memberOf AriaUtil + */ + CommonUtil.getFormFieldLabel = function (elem) { + // get the label from the attribute "for" of the label element + // Get only the non-hidden labels for element + var value = ""; + var label = null; + var labelElem = CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + // value directly from element text + label = labelElem.innerText; // ignore hidden text + } + else { + /** if it's not label with for attribute, then find implicit label + * cases for explict label: + * <label for='my'></label><input id='my'/> + * <label for='my'><input id='my'/></label> + * cases for implicit label: + * <label><input /></label> + */ + labelElem = CommonUtil.getAncestor(elem, "label"); + if (labelElem && labelElem.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(labelElem, elem)) { + var parentClone = labelElem.cloneNode(true); + // exclude all the text from the first form element since they might also + // have inner content that is part of innerText + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + label = CommonUtil.getInnerText(parentClone); + } + else + return null; + } + if (label && label.trim() !== "") + value += label.trim(); + // value from child element attribute + label = CommonUtil.getLabelTextFromAttribute(labelElem, true); + if (label && label.trim() !== "") + value += label.trim(); + // wired case: get aria label from label element itself just in case (though name prohibited from aria in html) + label = AriaUtil_1.AriaUtil.getAriaLabel(labelElem); + if (label && label.trim() !== "") + value += label.trim(); + return value.trim(); + }; + /** + * calculate label from embedded control: https://w3c.github.io/accname/ + * @param {element} labelElem label element + * @param {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * @returns label text or '' + * + * note the assumption is the labelElem refers either to a labelled element by 'for' attribute + * or its first form field is labbelled element + */ + CommonUtil.getLabelTextFromAttribute = function (labelElem, ignoreHidden) { + // label either points to a labelable element by its for attribute or the first element child + // get the labelled elment if it's an implicit label + var labeledElem = null; + for (var i = 0; i < labelElem.children.length; i++) { + var child = labelElem.children.item(i); + if (CommonUtil.form_labelable_elements.includes(child.nodeName.toLowerCase())) { + labeledElem = child; + break; + } + } + var nw = new DOMWalker_1.DOMWalker(labelElem); + var text = ''; + while (nw.nextNode() && nw.node !== labelElem) { + // only check element children + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var elem = nw.elem(); + // ignore if it's hidden, or labelled element, or first form element if not labeled by for attribute + if ((ignoreHidden && (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) || VisUtil_1.VisUtil.isNodePresentational(elem))) + || (labeledElem && labeledElem.contains(elem))) + continue; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // textbox etc. return its text value + if (role === "textbox") { + var name_1 = elem.getAttribute("value"); + if (name_1 && name_1.trim().length > 0) + text += ' ' + name_1.trim(); + } + else if (role === "combobox" || role === "listbox") { + // for combobox or listbox roles, return the text alternative of the chosen option. + var selectedId = elem.getAttribute("aria-activedescendant") || elem.getAttribute("aria-selected") || elem.getAttribute("aria-checked"); + if (selectedId) { + var selectedOption = elem.ownerDocument.getElementById(selectedId); + if (selectedOption && !DOMUtil_1.DOMUtil.sameNode(elem, selectedOption)) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(selectedOption); + if (pair && pair.name) + text += ' ' + pair.name.trim(); + } + } + } + else if (["progressbar", "scrollbar", "slider", "spinbutton", "meter"].includes(role)) { + // for range role type, including "progressbar", "scrollbar", "slider", "spinbutton" roles + // If the aria-valuetext property is present, return its value + var value_1 = elem.getAttribute("aria-valuetext"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // Otherwise, if the aria-valuenow property is present, return its value, + value_1 = elem.getAttribute("aria-valuenow"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // finally use native value attribute + value_1 = elem.getAttribute("value"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + } + // get aria label from the element + var value = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (value && value.trim() !== "") + text += ' ' + value.trim(); + } + } + return text.trim(); + }; + CommonUtil.isFirstFormElement = function (parentNode, element) { + //let formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (parentNode.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(parentNode); + while (nw.nextNode()) { + if (CommonUtil.form_labelable_elements.indexOf(nw.node.nodeName.toLowerCase()) !== -1) { + return nw.node === element; + } + } + } + return false; + }; + // check if the element is a shadow host or descendant of a shadow host, but not a descedant of the shadow root of the host (to be assigned to shadow slot or ignored) + CommonUtil.isShadowHostElement = function (element) { + if (CommonUtil.isShadowElement(element)) + return false; + var walkNode = element; + while (walkNode) { + if (walkNode.shadowRoot) + return true; + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + //check if an element is in a shadow tree + CommonUtil.isShadowElement = function (element) { + var root = element.getRootNode(); + if (root.toString() === "[object ShadowRoot]") + return true; + return false; + }; + CommonUtil.removeAllFormElementsFromLabel = function (element) { + var formElements = ["input", "textarea", "select", "button", "datalist", "optgroup", "option", "keygen", "output", "progress", "meter"]; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; i++) { + if (formElements.indexOf(childNodes[i].nodeName.toLowerCase()) > -1) { + element.removeChild(childNodes[i]); + } + } + return element; + }; + /** + * @param element + * @param idStr + * @returns true if any one (if multiple Ids) id points to itself + */ + CommonUtil.isIdReferToSelf = function (element, idStr) { + if (!idStr || idStr.trim() === '') + return false; + var ids = idStr.trim().split(" "); + for (var j = 0, length_1 = ids.length; j < length_1; ++j) { + var referredNode = fragment_1.FragmentUtil.getById(element, ids[j]); + if (referredNode && DOMUtil_1.DOMUtil.sameNode(referredNode, element)) + return true; + } + return false; + }; + /* Determine the node depth of the given element */ + CommonUtil.nodeDepth = function (element) { + var depth = 0; + var walkNode = element; + while (walkNode !== null) { + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + depth = depth + 1; + } + return depth; + }; + /* compare node order of the 2 given nodes */ + /* returns + * 0 if the nodes are equal + * 1 if node b is before node a + * -1 if node a is before node b + * 2 if node a is nested in node b + * -2 if node b is nested in node a + * null if either node is null or their parent nodes are not equal + */ + CommonUtil.compareNodeOrder = function (nodeA, nodeB) { + if (nodeA === nodeB) + return 0; + var aDepth = CommonUtil.nodeDepth(nodeA); + var bDepth = CommonUtil.nodeDepth(nodeB); + if (bDepth > aDepth) { + for (var i = 0; i < bDepth - aDepth; ++i) + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + if (nodeA === nodeB) // Node B nested in Node A + return -2; + } + else if (aDepth > bDepth) { + for (var i = 0; i < aDepth - bDepth; ++i) + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + if (nodeA === nodeB) // Node A nested in Node B + return 2; + } + while (nodeA != null && nodeB != null && DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) { + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + } + if (nodeA === null || nodeB === null || DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) + return null; + while (nodeB != null && nodeB != nodeA) + nodeB = nodeB.previousSibling; + if (nodeB === null) // nodeB before nodeA + return 1; + else + return -1; + }; + /** + * Determine if the given attribute of the given element is not empty + * @memberOf AriaUtil + */ + CommonUtil.attributeNonEmpty = function (element, attrStr) { + return element.hasAttribute(attrStr) && element.getAttribute(attrStr).trim().length > 0; + }; + /* Return a pointer to the given frame, null if not found */ + CommonUtil.getFrameByName = function (ruleContext, frameName) { + var window = ruleContext.ownerDocument.defaultView; + var frameList = [window]; + var idx = 0; + while (idx < frameList.length) { + try { + if (frameList[idx].name === frameName) + return frameList[idx]; + for (var i = 0; i < frameList[idx].frames.length; ++i) { + try { + // Ensure it's a real frame and avoid recursion + if (frameList[idx].frames[i] && !frameList.includes(frameList[idx].frames[i])) { + frameList.push(frameList[idx].frames[i]); + } + } + catch (e) { } + } + } + catch (e) { } + ++idx; + } + return null; + }; + CommonUtil.defaultNSResolver = function (prefix) { + var uri; + switch (prefix) { + case 'html': + uri = 'http://www.w3.org/1999/xhtml'; + case 'x2': + uri = 'http://www.w3.org/TR/xhtml2'; + case 'x': + uri = 'http://www.w3.org/1999/xhtml'; + case 'xhtml': + uri = 'http://www.w3.org/1999/xhtml'; + default: + uri = null; + } + return uri; + }; + //checking if only the inner text is empty or not + CommonUtil.isInnerTextOnlyEmpty = function (element) { + // Get the innerText of the element + var text = element.innerText; + if ((text === undefined || text === null || text.trim().length === 0) && element.nodeName.toLowerCase() !== 'slot' && element.textContent !== undefined) { + //ignore slot because its text will be filled by the corresponding content in the light DOM + // innerText is sometimes 'undefined' in headless mode, or null if the element is invisible or not erxpanded + // so we try textContent as a workaround + text = element.textContent; + } + var retVal = !(text !== null && text.trim().length > 0); + if (element.nodeType === 1 && element.nodeName.toLowerCase() === "slot") { + //TODO: need to conside its own content, a slot may have its own content or assigned content + for (var _i = 0, _a = element.assignedNodes(); _i < _a.length; _i++) { + var slotElem = _a[_i]; + retVal = retVal && CommonUtil.isInnerTextEmpty(slotElem); + } + } + // Trim the inner text and verify that it is not empty. + return retVal; + }; + /* Return the inner text of the given element */ + CommonUtil.getInnerText = function (element) { + var retVal = element.innerText; + if (retVal === undefined || retVal === null || retVal.trim() === "") + retVal = element.textContent; + return retVal; + }; + /** + * return onscreen innerText only. + * This function should return the same result as innerText if no offscreen content exists + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {null | string} null if element has empty inner text, text otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.getOnScreenInnerText = function (element) { + if (!element) + return null; + if (element.nodeType === 3) + return element.nodeValue(); + var text = ""; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== element && nw.node !== element.parentNode) { + if (nw.bEndTag) + continue; + if (nw.node.nodeType === 1 && (VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nw.node.nodeName.toLowerCase()) || !VisUtil_1.VisUtil.isNodeVisible(nw.node) || VisUtil_1.VisUtil.isElementOffscreen(nw.node))) { + /** special case for svg <title> element: + * text in a <title> element is not rendered as part of the graphic, but browsers usually display it as a tooltip + * note some svg elements, such as title, desc, have a bounds {"left":0,"top":0,"height":0,"width":0} + */ + if (nw.node.nodeName.toLowerCase() === 'title' && CommonUtil.getAncestor(nw.node, "svg")) + continue; + if (nw.node.nextSibling) { + if (nw.node.nextSibling.nodeType === 3 && nw.node.nextSibling.nodeValue && nw.node.nextSibling.nodeValue.trim() !== '') + text += ' ' + nw.node.nextSibling.nodeValue.trim(); + nw.node = nw.node.nextSibling; + continue; + } + else + break; + } + if (nw.node.nodeType === 3 && nw.node.nodeValue && nw.node.nodeValue.trim() !== '') { + text += ' ' + nw.node.nodeValue.trim(); + } + } + return text.trim(); + }; + /** Return the text content of the given node + * this is different than innerText or textContent that return text content of a node and its descendants + */ + CommonUtil.getNodeText = function (element) { + if (!element) + return ""; + var text = ""; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType == 3) { + text += childNodes[i].nodeValue; + } + } + return text; + }; + /** + * This function is responsible for checking if elements inner text is empty or not. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isInnerTextEmpty = function (element) { + // Get the innerText of the element + var text = CommonUtil.getInnerText(element); + // Trim the inner text and verify that it is not empty. + return !(text != null && text.trim().length > 0); + }; + CommonUtil.hasInnerContent = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text !== null && text.trim().length > 0); + if (element.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode()) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + } + } + return hasContent; + }; + /** + * This function is responsible for determine if an element has inner content. + * This function also considers cases where inner text is hidden, which now will + * be classified as does not have hidden content. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.hasInnerContentHidden = function (element) { + return CommonUtil.hasInnerContentHiddenHyperLink(element, false); + }; + CommonUtil.svgHasName = function (element) { + return CommonUtil.attributeNonEmpty(element, "aria-label") + || CommonUtil.attributeNonEmpty(element, "aria-labelledby") + || !!element.querySelector(":scope > title"); + }; + CommonUtil.hasInnerContentHiddenHyperLink = function (element, hyperlink_flag) { + if (!element) + return false; + // Variable Decleration + var childElement = element.firstElementChild; + var hasContent = false; + // In the case that the childElement is not null then we need to check each of the elements + // to make sure that the elements are not all hidden. + if (childElement != null) { + // Get the nodewalter of the element node, so that we can loop over it and verify + // that the elements under the element are not completly hidden. + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the nodes until there are no more nodes or we have determine that there is content under + // this parent element. + while (!hasContent && nw.nextNode() && nw.node != element) { + // Get the next node + var node = nw.node; + // In the case an img element is present with alt then we can mark this as pass + // otherwise keep checking all the other elements. Make sure that this image element is not hidden. + hasContent = (node.nodeName.toLowerCase() === "img" + && (CommonUtil.attributeNonEmpty(node, "alt") || CommonUtil.attributeNonEmpty(node, "title")) + && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) || (node.nodeName.toLowerCase() === "svg" + && CommonUtil.svgHasName(node)); + // Now we check if this node is of type element, visible + if (!hasContent && node.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextOnlyEmpty(node); + if (!hasContent && hyperlink_flag === true) { + hasContent = CommonUtil.attributeNonEmpty(node, "aria-label") || CommonUtil.attributeNonEmpty(node, "aria-labelledby"); + var doc = node.ownerDocument; + if (doc) { + var win = doc.defaultView; + if (win) { + var cStyle = win.getComputedStyle(node); + if (!hasContent && cStyle != null) { + // console.log(cStyle.backgroundImage); + // console.log(cStyle.content) + hasContent = ((cStyle.backgroundImage && cStyle.backgroundImage.indexOf) || cStyle.content) && CommonUtil.attributeNonEmpty(node, "alt"); + } + } + } + } + } + // Check for cases where there is text node after an element under the parent + // In the case we detect nodetype as text node and the patent of the text node is + // the same element we are checking has Inner content for then get the inner content of this + // text node. + if (node.nodeType === 3 && DOMWalker_1.DOMWalker.parentElement(node) === element) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(node); + } + } + } + // In the case there are no child elements then we can simply perform the check for only innertext + // the img with alt case will be covered in the above if, as img is considers as an element. + else { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(element); + } + return hasContent; + }; + CommonUtil.hasInnerContentOrAlt = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text != null && text.trim().length > 0) || CommonUtil.attributeNonEmpty(element, "alt"); + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode() && nw.node != element) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + if (!hasContent + && (AriaUtil_1.AriaUtil.hasRole(nw.node, "button", true) || AriaUtil_1.AriaUtil.hasRole(nw.node, "textbox")) + && (AriaUtil_1.AriaUtil.hasAriaLabel(nw.node) || CommonUtil.attributeNonEmpty(nw.node, "title") || CommonUtil.getLabelForElementHidden(nw.elem(), true))) { + hasContent = true; + } + } + } + return hasContent; + }; + CommonUtil.concatUniqueArrayItem = function (item, arr) { + arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false; + return arr; + }; + CommonUtil.concatUniqueArrayItemList = function (itemList, arr) { + for (var i = 0; itemList !== null && i < itemList.length; i++) { + arr = CommonUtil.concatUniqueArrayItem(itemList[i], arr); + } + return arr; + }; + /** + * remove array items from a given array + * @param itemList items to be removed from arr + * @param arr the array + * @returns + */ + CommonUtil.reduceArrayItemList = function (itemList, arr) { + if (arr && arr.length > 0 && itemList && itemList.length > 0) { + var result = arr.filter(function (value) { + return !itemList.includes(value); + }); + return result; + } + return arr; + }; + CommonUtil.getScopeForTh = function (element) { + /** https://www.w3.org/TR/html5/tabular-data.html#header-and-data-cell-semantics + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a column header if any of the following conditions are true: + * * The cell's scope attribute is in the column state, or + * * The cell's scope attribute is in the auto state, and there are no data cells in any of + * the cells covering slots with y-coordinates y .. y+height-1. + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a row header if any of the following conditions are true: + * * The cell's scope attribute is in the row state, or + * * The cell's scope attribute is in the auto state, the cell is not a column header, and there are + * no data cells in any of the cells covering slots with x-coordinates x .. x+width-1. + */ + // Note: auto is default scope + // Easiest answer is if scope is specified + if (element.hasAttribute("scope")) { + var scope = element.getAttribute("scope").toLowerCase(); + if (scope === "row" || scope === 'rowgroup') + return "row"; + if (scope === "col" || scope === 'colgroup') + return "column"; + } + // scope is auto, default (without a scope) or invalid value. + // if all the sibling elements are th, then return "columnheader" + var siblings = __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName.toLowerCase() != "th"; }); + if (siblings === null || siblings.length === 0) + return "column"; + else + return "row"; + }; + CommonUtil.getControlOfLabel = function (node) { + // Handle the easy case of label -> for + var labelAncestor = CommonUtil.getAncestor(node, "label"); + if (labelAncestor && labelAncestor.hasAttribute("for")) { + return fragment_1.FragmentUtil.getById(node, labelAncestor.getAttribute("for")); + } + // Create a dictionary containing ids of parent nodes + var idDict = {}; + var parentWalk = node; + while (parentWalk) { + if (parentWalk.nodeType === 1 /* Node.ELEMENT_NODE */) { + var ancestor = parentWalk; + if (ancestor.hasAttribute("id")) { + idDict[ancestor.getAttribute("id")] = true; + } + } + parentWalk = DOMWalker_1.DOMWalker.parentNode(parentWalk); + } + // Early return if no ancestor IDs found + if (Object.keys(idDict).length === 0) { + return null; + } + // Cache aria-labelledby attribute if node is an element + var nodeAriaLabelledBy = node.nodeType === 1 ? node.getAttribute("aria-labelledby") : null; + // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids + var inputsUsingLabelledBy = CacheUtil_1.CacheUtil.getSetCache(node.ownerDocument, "CommonUtil::getControlOfLabel", function () { return node.ownerDocument.querySelectorAll("*[aria-labelledby]"); }); + for (var idx = 0; idx < inputsUsingLabelledBy.length; ++idx) { + var inputUsingLabelledBy = inputsUsingLabelledBy[idx]; + var ariaLabelledBy = inputUsingLabelledBy.getAttribute("aria-labelledby"); + var sp = ariaLabelledBy.split(" "); + for (var _i = 0, sp_1 = sp; _i < sp_1.length; _i++) { + var id = sp_1[_i]; + if (id in idDict && !CommonUtil.isIdReferToSelf(node, nodeAriaLabelledBy)) { + return inputUsingLabelledBy; + } + } + } + // Find the cases where we're within an aria labelledby + return null; + }; + /** + * This function is responsible for checking if the node that is provied is + * disabled or not. Following is how the check is performed: + * 1. Check if the current node is disabled with the following options: + * attribute --> disabled + * Also needs to be "button", "input", "select", "textarea", "optgroup", "option", + * "menuitem", "fieldset" nodes (in array elementsAllowedDisabled) + * attribute --> aria-disabled="true" + * 2. Check if any of the current nodes parents are disabled with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are disabled then this + * function will return true (node is disabled). + * + * @parm {HTMLElement} node - The node which should be checked if it is disabled or not. + * @return {bool} true if the node is disabled, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isNodeDisabled = function (node) { + // Set PT_NODE_DISABLED to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is disabled. We have to set it to false so that we know + // the node has already been checked. Only set it to false if the setting is undefined or null + // as if it is defined we do not wnat to reset it. As if it is true then we should make use of it + // to speed up the check. + var PT_NODE_DISABLED = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_DISABLED", undefined); + if (typeof PT_NODE_DISABLED !== "undefined") + return PT_NODE_DISABLED; + PT_NODE_DISABLED = false; + // Check the nodeType of this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // disabled is directly related to the parent node. + if (node.nodeType === 3) { + node = DOMWalker_1.DOMWalker.parentNode(node); + } + // Variable Declaration + var nodeName = node.nodeName.toLowerCase(); + // Get the disabled element property, disabled and aria-disabled attribute and check that it is true + var disabledAttribute = node.hasAttribute("disabled"); + var disabledPropertyCustom = PT_NODE_DISABLED; + var ariaDisabledAttribute = node.hasAttribute('aria-disabled') && node.getAttribute("aria-disabled") === 'true'; + // If this node has disabled attribute and the node allows disabled attribute, then return true. + // Disabled attribute is only allowed on "button", "input", "select", "textarea", "optgroup", "option", "menuitem", "fieldset" + // In the case aria-disabled is set to true, then also return true + if (disabledPropertyCustom || (disabledAttribute && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(nodeName) > -1) || ariaDisabledAttribute) { + PT_NODE_DISABLED = true; + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // disabled attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is disabled or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // Check upwards recursively, and save the results in an variable + var nodeDisabled = CommonUtil.isNodeDisabled(parentElement); + // If the node is found to be disabled then add the custom PT_NODE_DISABLED to true. + // so that we can use this next time, to quickly determine if node is disabled or not. + // This is extra percaution, the isNodeDisabled function already sets this. + if (nodeDisabled) { + PT_NODE_DISABLED = true; + } + // Check upwards recursively + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return nodeDisabled; + } + // Return false (node is not disabled) + return false; + }; + /** + * This function is responsible for determine if hidden content should be checked + * in rules. + * + * @parm {element} node - A node so that the document can be accessed to check for the + * option. Can be document element or a simple node element. + * @return {bool} true if hidden content should be checked, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldCheckHiddenContent = function (node) { + return false; + }; + /** + * This function is responsible for determining if node should be skipped from checking or not, based + * on the Check Hidden Content settings and if the node is visible or not. + * + * @parm {element} node - Node to check if it is visible or not based on the Check Hidden Content + * setting. + * + * @return {bool} true if node should be skipped, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldNodeBeSkippedHidden = function (node) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we + // return true to identify that the node should not be scanned/added to any hash/array. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (!CommonUtil.shouldCheckHiddenContent(node) && !VisUtil_1.VisUtil.isNodeVisible(node)) { + return true; + } + return false; + }; + CommonUtil.isfocusableByDefault = function (node) { + var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area']; + if (node.nodeName.toLowerCase() === "a" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (node.nodeName.toLowerCase() === "area" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (focusableElements.indexOf(node.nodeName.toLowerCase()) !== -1) + return true; + return false; + }; + /** + * This function check if a non-tabable node has valid tabable content. + * If it is tabable (the tabindex is not speicified or is not -1), returns false; + * If it is non-tabable, but a child is tabable and does not have element content, returns false; + * Otherwise, returns true. + */ + CommonUtil.nonTabableChildCheck = function (element) { + if (!element.hasAttribute("tabindex") || + (parseInt(element.getAttribute("tabindex")) != -1)) { + return false; + } + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + var child = nw.elem(); + if (child === null) { // Text node. usually is a cartridge return. + continue; + } + if (child.hasAttribute("tabindex") && + (parseInt(child.getAttribute("tabindex")) != -1) && + !CommonUtil.hasInnerContent(child)) { + return false; + } + } + return true; + }; + CommonUtil.hasAttribute = function (element, attributeName) { + var hasAttribute = false; + if (element.hasAttribute) { + hasAttribute = element.hasAttribute(attributeName); + } + else if (element.attributes && element.attributes.getNamedItem) { + var attr = element.attributes.getNamedItem(attributeName); + hasAttribute = attr && attr.specified; + } + return hasAttribute; + }; + // truncate the given text to a given number of characters + // return truncated text to 150 chars, same with the media_alt_brief rule + CommonUtil.truncateText = function (text, len) { + if (len === void 0) { len = 150; } + if (!text) + return text; + text = text.trim(); + if (text.length > len) + return text.substring(0, len - 1) + "..."; + return text; + }; + CommonUtil.input_type_with_placeholder = ["text", "search", "tel", "url", "email", "password", "number"]; + CommonUtil.input_text_types = [ + "text", "file", "password", + "checkbox", "radio", + "search", "tel", "url", "email", + "date", "number", "range", + "time", "color" + ]; + CommonUtil.input_time_types = [ + "date", "month", "week", "time", "datetime-local" + ]; + CommonUtil.input_other_types = [ + "range", "color", "checkbox", "radio", "file", "image" + ]; + CommonUtil.form_button_types = [ + "button", "reset", "submit" + ]; + CommonUtil.form_labelable_elements = ["input", "textarea", "select", "keygen", "progress", "meter", "output", "button"]; + CommonUtil.tabTagMap = { + "button": function (element) { + return !element.hasAttribute("disabled"); + }, + "iframe": true, + "input": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + if (element.getAttribute("type") === "radio") { + var name_2 = element.getAttribute("name"); + if (!name_2 || name_2.trim().length === 0) + return true; //single radio, no group + var doc = element.ownerDocument; + var group = doc.querySelectorAll("input[type='radio'][name='" + name_2.trim() + "']"); + if (group.length === 0 || group.length === 1) + return true; //single radio with the name, no others in group + var checked = null; + for (var i = 0; i < group.length; i++) { + if (group[i].checked) + checked = group[i]; + } + //only last one applies if multiple radios with 'checked' attributes + if (checked !== null) { + if (DOMUtil_1.DOMUtil.sameNode(checked, element)) + return true; + return false; + } + else { + // if nothing checked yet, return true if it's the first element + if (DOMUtil_1.DOMUtil.sameNode(group[0], element)) + return true; + return false; + } + } + else + return true; + }, + "select": function (element) { + return !element.hasAttribute("disabled"); + }, + "textarea": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + return true; + }, + /**"div": function (element) { + return element.hasAttribute("contenteditable"); + },*/ + "a": function (element) { + // xlink:href?? see svg + return element.hasAttribute("href"); + }, + "area": function (element) { + return element.hasAttribute("href"); + }, + "audio": function (element) { + return element.hasAttribute("controls"); + }, + "video": function (element) { + return element.hasAttribute("controls"); + }, + "summary": function (element) { + // first summary child of a details element is automatically focusable + return element.parentElement && element.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], element.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], element); + }, + "details": function (element) { + //details element without a direct summary child is automatically focusable + return element.children && __spreadArray([], element.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; }).length === 0; + } + }; + CommonUtil.image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"]; + return CommonUtil; +}()); +exports.CommonUtil = CommonUtil; + + +/***/ }, + +/***/ "./src/v4/util/TableUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/TableUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableUtil = void 0; +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var TableUtil = /** @class */ (function () { + function TableUtil() { + } + TableUtil.isDataTable = function (tableNode) { + return !(AriaUtil_1.AriaUtil.hasRole(tableNode, "none") || AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation")); + }; + /* + * A complex data table is a data table with any of the following characteristics: + * + * a thead element that contains two or more tr elements + * a table with more than one thead element + * a table with two or more tr elements that contain only th elements + * a th or td element with a rowspan or colspan attribute + * a tr element that contains at least one td element and two or more th elements + * a table with headers not located in the first row or first column + * a td element with a headers attribute value that contains more than two IDREFs + */ + TableUtil.isComplexDataTable = function (table) { + if ("AriaUtil_isComplexDataTable" in table) { + return !!table.AriaUtil_isComplexDataTable; + } + var isComplexTable = false; + if (table && TableUtil.isDataTable(table)) { + var thNodes = null, tdNodes = null; + var trNodes = table.getElementsByTagName("tr"); + var trNodeCount = trNodes.length; + var tdNodeCount = 0, thNodeCount = 0, trNodesHavingOnlyThNodes = 0; + for (var i = 0; !isComplexTable && i < trNodeCount; ++i) { + thNodes = trNodes[i].getElementsByTagName("th"); + tdNodes = trNodes[i].getElementsByTagName("td"); + thNodeCount = thNodes.length; + tdNodeCount = tdNodes.length; + if (tdNodeCount !== 0) { + // a tr element that contains at least one td element and two or more th elements; + isComplexTable = thNodeCount > 1; + // a th element with a rowspan or colspan attribute + for (var j = 0; !isComplexTable && j < thNodeCount; ++j) { + isComplexTable = ((thNodes[j].hasAttribute("rowspan") || + thNodes[j].hasAttribute("colspan")) && + CommonUtil_1.CommonUtil.getAncestor(thNodes[j], "table") === table); + } + // a td element with a rowspan or colspan attribute + // a td element with a headers attribute value that contains more than two IDREFs + for (var k = 0; !isComplexTable && k < tdNodeCount; ++k) { + isComplexTable = ((tdNodes[k].hasAttribute("rowspan") || + tdNodes[k].hasAttribute("colspan") || + (tdNodes[k].hasAttribute("headers") && CommonUtil_1.CommonUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[k], "table") === table); + } + } + else { + // two or more tr elements that contain only th elements + if (thNodeCount > 0) { + ++trNodesHavingOnlyThNodes; + } + isComplexTable = trNodesHavingOnlyThNodes === 2; + } + } + if (!isComplexTable) { + var theadNodes = table.getElementsByTagName("thead"); + var theadNodesLength = theadNodes.length; + if (theadNodesLength > 0) { + // table has more than one thead element + isComplexTable = theadNodesLength > 1; + // a thead element that contains two or more tr elements + if (!isComplexTable) { + isComplexTable = theadNodes[0].getElementsByTagName("tr").length > 1; + } + } + } + if (!isComplexTable && trNodeCount !== 0) { + // a table with headers not located in the first row or first column + isComplexTable = thNodeCount > 0 && !TableUtil.tableHeaderExists(table); + } + } + table.AriaUtil_isComplexDataTable = isComplexTable; + return isComplexTable; + }; + // Return true if a table cell is hidden or contain no data: <td></td> + TableUtil.isTableCellEmpty = function (cell) { + if (!cell || !VisUtil_1.VisUtil.isNodeVisible(cell) || cell.innerHTML.replace(/&nbsp;/g, ' ').trim().length === 0) + return true; + return false; + }; + // Return true if a table row is hidden or contain no data: <tr /> or <tr><td></td><td></td></tr> + TableUtil.isTableRowEmpty = function (row) { + if (!row || !row.cells || row.cells.length === 0 || !VisUtil_1.VisUtil.isNodeVisible(row)) + return true; + var passed = true; //empty + for (var c = 0; passed && c < row.cells.length; c++) { + var cell = row.cells[c]; + passed = TableUtil.isTableCellEmpty(cell); + } + return passed; + }; + // Return true if a table's header is in the first row or column + TableUtil.tableHeaderExists = function (ruleContext) { + var rows = ruleContext.rows; + if (!rows || rows.length === 0) + return null; + // note that table.rows return all all the rows in the table, + // including the rows contained within <thead>, <tfoot>, and <tbody> elements. + //case 1: headers are in the very first row with data in tbody or thead, but not in tfoot + //get the first row with data, ignoring the rows with no data + var passed = true; + var firstRow = rows[0]; + for (var r = 0; passed && r < rows.length; r++) { + firstRow = rows[r]; + // ignore the rows from tfoot + if (firstRow.parentNode && firstRow.parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + passed = TableUtil.isTableRowEmpty(firstRow); + } + //table contain no data: <table><tr><td></td><td></td></tr></table> + if (passed) + return null; + // Check if the cells with data in the first data row are all TH's + passed = true; + for (var r = 0; passed && r < firstRow.cells.length; r++) { + var cell = firstRow.cells[r]; + passed = TableUtil.isTableCellEmpty(cell) || cell.nodeName.toLowerCase() === 'th'; + } + if (passed) + return true; + // Case 2: headers are in the first column with data + // Assume that the first column has all TH's or a TD without data in the first column. + passed = true; + for (var i = 0; passed && i < rows.length; ++i) { + // ignore the rows from tfoot + if (rows[i].parentNode && rows[i].parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + // If no cells in this row, or no data at all, that's okay too. + passed = !rows[i].cells || + rows[i].cells.length === 0 || + rows[i].cells[0].innerHTML.trim().length === 0 || + rows[i].cells[0].nodeName.toLowerCase() != "td"; + } + if (passed) + return true; + //case 3: all td data cells have headers attributes that point to the id of a th element in the same table. + // https://html.spec.whatwg.org/multipage/tables.html#attributes-common-to-td-and-th-elements + passed = true; + var thIds = []; + var tdHeaders = []; + for (var r = 0; passed && r < rows.length; r++) { + var row = rows[r]; + // Check if the cells with data in the last data row are all TH's + for (var c = 0; c < row.cells.length; c++) { + var cell = row.cells[c]; + if (TableUtil.isTableCellEmpty(cell)) + continue; + if (cell.nodeName.toLowerCase() === 'td') { + if (!cell.getAttribute('headers') || cell.getAttribute('headers').trim().length === 0) + passed = false; + else + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(cell.getAttribute('headers').trim().split(" "), tdHeaders); + } + else if (cell.nodeName.toLowerCase() === 'th' && cell.getAttribute('id') && cell.getAttribute('id').trim().length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItem(cell.getAttribute('id').trim(), thIds); + } + } + if (passed) { // all td elements have headers, to exam if the headers point to a th id + if (thIds.length > 0 && tdHeaders.every(function (header) { return thIds.includes(header); })) + return true; + } + return false; + }; + TableUtil.isLayoutTable = function (tableNode) { + return AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation") || AriaUtil_1.AriaUtil.hasRole(tableNode, "none"); + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + TableUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + return TableUtil; +}()); +exports.TableUtil = TableUtil; + + +/***/ }, + +/***/ "./src/v4/util/VisUtil.ts" +/*!********************************!*\ + !*** ./src/v4/util/VisUtil.ts ***! + \********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VisUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ./CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ClipPathUtil_1 = __webpack_require__(/*! ./ClipPathUtil */ "./src/v4/util/ClipPathUtil.ts"); +var VisUtil = /** @class */ (function () { + function VisUtil() { + } + /** + * This function is responsible for checking if the node that is provied is + * visible or not. Following is how the check is performed: + * 1. Check if the current node is hidden with the following options: + * CSS --> dislay: none + * CSS --> visibility: hidden + * attribute --> hidden + * 2. Check if the any of the current nodes parents are hidden with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are hidden then this + * function will return false (node is not visible). + * + * Note: nodes with CSS properties opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * Note: nodes hidden off screen or behind another object: they are not considered hidden. + * They are exposed in the accessibility tree and they can even name on-screen objects. + * + * @parm {element} node The node which should be checked if it is visible or not. + * @return {bool} false if the node is NOT visible, true otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisible = function (nodeIn) { + // Check the nodeType if this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // visibility is directly related to the parent node. + if (nodeIn.nodeType === 3) { + nodeIn = DOMWalker_1.DOMWalker.parentNode(nodeIn); + } + var node = nodeIn; + // We should only allow nodeType element, and TextNode all other nodesTypes + // we can return the visibility as visible. + // Following nodes will be returned as visable by default, since we can not + // actually change their visibility. + // Node.PROCESSING_INSTRUCTION_NODE --> 7 + // Node.COMMENT_NODE --> 8 + // 9 /* Node.DOCUMENT_NODE */ --> 9 + // Node.DOCUMENT_TYPE_NODE --> 10 + // Node.DOCUMENT_FRAGMENT_NODE --> 11 + if (node.nodeType !== 1) { + return true; + } + // Make sure that the ownerDocument is present before moving forward + // in detecting if the node is visible or not. In the case that ownerDocument + // does not exist then we simply return node is visible by default. + if (!node.ownerDocument) { + return true; + } + // Variable Declaration + var compStyle; + var nodeName = node.nodeName.toLowerCase(); + // In the case this node is a script, link or style node, right away return node is visible + // because scripts, links and style nodes can not be hidden by HTML attribute or CSS or are hidden by default. But we want to scan + // the elements everytime as they render content still which is still visible to users. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // datalist --> In the rendering, the datalist element represents nothing and it, along with its children, should be hidden. + if (VisUtil.hiddenByDefaultElements != null && VisUtil.hiddenByDefaultElements != undefined && VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) { + //return true; + return false; + } + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined); + if (cacheVal !== undefined) { + return cacheVal; + } + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + cacheVal = CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + // Check if this node is visible, we check couple of CSS properties and hidden attribute. + // area, param and audio elements we do not check if they are hidden as it does not apply to them. + // Check the unhideableElements array which is part of the rules, to check if this element is allowed to be hidden or not + // in the case that the element is part of the unhideableElements array then we do not run the hidden check on this element, + // and go stright to the parent node. + // Array check elements like: + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // In the case that unhideableElements array is not defined then we just scan all elements and do no filtering at all. + if (VisUtil.unhideableElements === null || VisUtil.unhideableElements === undefined || VisUtil.unhideableElements.indexOf(nodeName) === -1) { + // Check if defaultView exists for this node, if it does then use this to run the getComputedStyle + // function to get the CSS style for the node. + if (node.ownerDocument.defaultView) { + // Run the getComputedStyle on this node to fetch the CSS compuation of the node + compStyle = node.ownerDocument.defaultView.getComputedStyle(node, null); + } + // In the case that defaultView does not exists return true to identify that this + // node is visible, because were not able to detect if it was not. + else { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // Get the hidden element property and hidden attribute + var hiddenAttribute = node.getAttribute("hidden"); + var hiddenPropertyCustom = cacheVal; + // To get the hidden property we need to perform a special check as in some cases the hidden property will not be + // a boolean, for theses cases we set it to false as we are not able to determine the true hidden condition. + // The reason for this is because form elements are able to perform an override, so when we have id="hidden" for an element + // which is under the form element then, node.hidden gives the element/list of elements which have id="hidden". Refer to + // mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1267356 + var hiddenProperty = typeof node.hidden === "boolean" ? node.hidden : false; + // If compStyle object is empty, node does't have hidden property, node does't have hidden attribute and does't have custom PT + // hidden property then we can just return true (node visible) at this point. + if (!compStyle && + !hiddenProperty && // this covers false, null, or undefined + (hiddenAttribute === null || hiddenAttribute === undefined) && + !hiddenPropertyCustom // This covers false, null or undefined + ) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // In the case that the compStyle is defined we check the following: + // CSS style display set to none + // CSS style visibility set to hidden + // Note: For this property since it is inherited, need to skip the check on parents as + // the parent can have hidden but the child can be visible. So we only check this property + // on child elements/elements that are passed to this function the first time. + // node hidden property set (node.hidden) + // node attribute hidden set (to any value) + // node custom hidden property ser (node.PT_NODE_HIDDEN) + // If any of the above conditions are true then we return false as this element is not visible + if ((compStyle !== null && ((compStyle.getPropertyValue('display') === 'none' || + (!CacheUtil_1.CacheUtil.getCache(node, "Visibility_Check_Parent", null) && compStyle.getPropertyValue('visibility') === 'hidden'))) || + (compStyle.getPropertyValue('display') !== 'block' && (hiddenProperty || hiddenAttribute != null || hiddenPropertyCustom)))) { + // Set a custom expandos property on the the node to identify that it is hidden, so that we can uses + // use this in the rules to determine if the node is hidden or not, if we need to. + // Use expandos property instead of a hash map which stores the elements, adding/checking expandos + // properties is a lot faster performance whise. For Hash map we need to store based on xpath, and to calculate + // xpath it is more performance impact. + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check content-visibility: if the content-visibility is hidden, then, return false as the element is not visible + if (VisUtil.isContentHidden(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check hidden by clip-path + // TODO: need to check if hidden content contains focusable elements, similarly to offscreen content + if (ClipPathUtil_1.ClipPathUtil.isNodeVisuallyHiddenByClipPath(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is visible or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // When we have a parent element going through the isNodeVisible function we have to mark it as such + // so that in the function we can skip checking visibility: hidden for parent elements since visibility: hidden + // is inherited, which allows a child to have a different setting then the child. This property only needs to be checked + // once for the first element that is passed down and that is all. Ignore it for all the parents that we iterate over. + CacheUtil_1.CacheUtil.setCache(parentElement, "Visibility_Check_Parent", true); + // Check upwards recursively, and save the results in an variable + var nodeVisible = VisUtil.isNodeVisible(parentElement); + // If the node is found to not be visible then add the custom PT_NODE_HIDDEN to true. + // so that we can use this in the rules. + // if (!nodeVisible) { + // CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + // } + // Check upwards recursively + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", nodeVisible); + } + // Return true (node is visible) + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + }; + /** + * This function is responsible for checking if the node that is visually hidden by clipping or opaq: + * 1. Check if the current node is visually hidden: + * CSS --> clip: rect(0px, 0px, 0px, 0px) + * CSS --> opacity: 0 + * + * Note: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note: nodes with CSS properties clip: rect(0px, 0px, 0px, 0px) or opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden to an AT. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * @parm {element} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisuallyHidden = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN", undefined); + if (hidden === undefined) { + // defined styles only give the styles that changed + var comp_styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if ((comp_styles['position'] === 'absolute' && comp_styles['clip'] && comp_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)') + || (comp_styles['opacity'] && parseFloat(comp_styles['opacity']) < 0.1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", true); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentElement(elem); + if (!parentElement) + return false; + // Check upwards recursively + var hid = VisUtil.isNodeVisuallyHidden(parentElement); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", hid); + return hid; + } + return hidden; + }; + /** + * return true if the node or its ancestor is hidden by CSS content-visibility:hidden + * At this time, CSS content-visibility is partially supported by Chrome & Edge, but not supported by Firefox + * The implementation TEMPORARILY follows the Chrome test results: + * if content-visibility:hidden + * if the element is block-level (default or specified by the user), then the element and its children are normally hidden; + * if the element is inline (default or specified by the user), then the element and its children are normally NOT hidden; + * + * @param node + */ + VisUtil.isContentHidden = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_ContentHidden", undefined); + if (vis !== undefined) + return vis; + var style = getComputedStyle(node); + if (!style) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var content_visibility = style.getPropertyValue("content-visibility"); + if (content_visibility !== 'hidden') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var display = style.getPropertyValue("display"); + // inline element only + if (display === 'inline') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", true); + return true; + }; + /** + * return true if the node is offscreen by CSS position + * @param node + */ + VisUtil.isElementOffscreen = function (node) { + if (!node) + return true; + if (node.nodeType !== 1) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_Offscreen", undefined); + if (vis !== undefined) + return vis; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(node); + if (!bounds) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + if (bounds['height'] === 0 || bounds['width'] === 0 || (bounds['top'] + bounds['height']) <= 0 || (bounds['left'] + bounds['width']) <= 0) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodeHiddenFromAT = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HiddenFromAT", undefined); + if (vis !== undefined) + return vis; + if (!VisUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + var ancestor = DOMUtil_1.DOMUtil.getAncestorWithAttribute(node, "aria-hidden", "true"); + if (ancestor) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodePresentational = function (node) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(node); + if (role && (role === 'none' || role === 'presentation')) + return true; + return false; + }; + /** + * return true if the element is scrollable + * @param node + */ + VisUtil.isElementScrollable = function (elem) { + if (!elem) + return false; + var styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if (!styles) + return false; + var x_scroll = styles.getPropertyValue('overflow-x'); + var y_scroll = styles.getPropertyValue('overflow-y'); + //console.log("before node="+ elem.nodeName +", id="+elem.getAttribute("id") +", x_scroll="+x_scroll + ", y_scroll="+y_scroll); + // If overflow-y is hidden, scroll, or auto, and the overflow-x property is visible (default), the value will be implicitly computed as auto. + if (x_scroll === 'visible' && (y_scroll === 'hidden' || y_scroll === 'scroll' || y_scroll === 'auto')) + x_scroll = 'auto'; + // If overflow-x is hidden, scroll, or auto and the overflow-y property is visible (default), the value will be implicitly computed as auto. + if (y_scroll === 'visible' && (x_scroll === 'hidden' || x_scroll === 'scroll' || x_scroll === 'auto')) + y_scroll = 'auto'; + // setting overflow to clip in one direction when it isn't set to visible or clip in the other direction results in the clip value behaving as hidden. + if (x_scroll === 'clip' && y_scroll !== 'visible' && y_scroll !== 'clip') + x_scroll = 'hidden'; + if (y_scroll === 'clip' && x_scroll !== 'visible' && x_scroll !== 'clip') + y_scroll = 'hidden'; + // not scrollable: no scroll bars + if ((x_scroll === 'visible' || x_scroll === 'hidden' || x_scroll === 'clip') + && (y_scroll === 'visible' || y_scroll === 'hidden' || y_scroll === 'clip')) + return false; + // false if the overall scrollable element (clientWidth + scrollbarWidth and clientHeight + scrollbarHeight) is too small to be visible on screen + if (Math.max(elem.offsetWidth, elem.offsetHeight) < 30 || Math.min(elem.offsetWidth, elem.offsetHeight) < 15) + return false; + // false if content is smaller than the scrollable container: both x and y scroll distances < element's horizontal/vertical padding + var padding_x = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingLeft, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingRight, elem); + var padding_y = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingTop, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingBottom, elem); + if (elem.scrollWidth - elem.clientWidth < 1 + padding_x + && elem.scrollHeight - elem.clientHeight < 1 + padding_y) + return false; + return true; + }; + // This list contains a list of element tags which can not be hidden, when hidden is + // added to theses elements it does not do anything at all. + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // Note: All element tags that are added here should be added as lowercase, as we are using indexOf to do the check. + VisUtil.unhideableElements = ['area', 'param', 'audio']; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + // on theses elements we need to make then visible by default so that the rules can trigger regardless of the + // Check Hidden Content option in the tools. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // head --> head elements have display: none by default, but it will still behave correct + // title --> title elements have display: none by default, but it will still display the title. remove title from the list because a title can be a child of a svg element too + // meta --> meta elements have display: none by default, but it will still perform the action that meta is suppose to + // base --> base elements have display: none by default, but it will still perform the action that meta is suppose to + // noscript --> noscript elements have display: none by default, but it will still perform the action that meta is suppose to + // template --> template elements have display: none by default, because they are just a mechanism for holding client-side content + // that is not to be rendered when a page is loaded. https://developer.mozilla.org/en/docs/Web/HTML/Element/template + // datalist --> datalist elements have display: none by default, + VisUtil.hiddenByDefaultElements = ['script', 'link', 'style', 'head', 'meta', 'base', 'noscript', 'template', 'datalist']; + return VisUtil; +}()); +exports.VisUtil = VisUtil; + + +/***/ }, + +/***/ "./src/v4/sc-urls.json" +/*!*****************************!*\ + !*** ./src/v4/sc-urls.json ***! + \*****************************/ +(module) { + +module.exports = /*#__PURE__*/JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}'); + +/***/ } + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ const __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ const cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ const module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ if (!(moduleId in __webpack_modules__)) { +/******/ delete __webpack_module_cache__[moduleId]; +/******/ const e = new Error("Cannot find module '" + moduleId + "'"); +/******/ e.code = 'MODULE_NOT_FOUND'; +/******/ throw e; +/******/ } +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +let __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +let exports = __webpack_exports__; +/*!**********************!*\ + !*** ./src/index.ts ***! + \**********************/ + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkDemo = exports.SRViewer = exports.SRCursor = exports.SRController = exports.DOMWalker = exports.Config = exports.ARIAMapper = exports.Checker = exports.Context = void 0; +var Context_1 = __webpack_require__(/*! ./v2/common/Context */ "./src/v2/common/Context.ts"); +Object.defineProperty(exports, "Context", ({ enumerable: true, get: function () { return Context_1.Context; } })); +// import { Simulator } from "./v2/simulator" +var Checker_1 = __webpack_require__(/*! ./v4/checker/Checker */ "./src/v4/checker/Checker.ts"); +Object.defineProperty(exports, "Checker", ({ enumerable: true, get: function () { return Checker_1.Checker; } })); +var ARIAMapper_1 = __webpack_require__(/*! ./v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +Object.defineProperty(exports, "ARIAMapper", ({ enumerable: true, get: function () { return ARIAMapper_1.ARIAMapper; } })); +var Config_1 = __webpack_require__(/*! ./v2/config/Config */ "./src/v2/config/Config.ts"); +Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return Config_1.Config; } })); +var DOMWalker_1 = __webpack_require__(/*! ./v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +Object.defineProperty(exports, "DOMWalker", ({ enumerable: true, get: function () { return DOMWalker_1.DOMWalker; } })); +var SRController_1 = __webpack_require__(/*! ./v4/simulator/SRController */ "./src/v4/simulator/SRController.ts"); +Object.defineProperty(exports, "SRController", ({ enumerable: true, get: function () { return SRController_1.SRController; } })); +var SRCursor_1 = __webpack_require__(/*! ./v4/simulator/SRCursor */ "./src/v4/simulator/SRCursor.ts"); +Object.defineProperty(exports, "SRCursor", ({ enumerable: true, get: function () { return SRCursor_1.SRCursor; } })); +var SRViewer_1 = __webpack_require__(/*! ./v4/simulator/SRViewer */ "./src/v4/simulator/SRViewer.ts"); +Object.defineProperty(exports, "SRViewer", ({ enumerable: true, get: function () { return SRViewer_1.SRViewer; } })); +function checkDemo(timeout) { + if (!timeout) + timeout = 0; + var checker = new Checker_1.Checker(); + setTimeout(function () { + checker.check(document.documentElement, ["IBM_Accessibility", "IBM_Design"]) + .then(function (report) { + console.log(report); + var vals = { + "FAIL": 0, + "POTENTIAL": 1, + "MANUAL": 2, + "PASS": 3 + }; + for (var idx = 0; idx < report.results.length; ++idx) { + if (report.results[idx].value[1] === "PASS") { + report.results.splice(idx--, 1); + } + } + report.results.sort(function (a, b) { + if (a.category != b.category) { + return a.category.localeCompare(b.category); + } + if (a.path["aria"] === b.path["aria"]) { + return vals[a.value[1]] - vals[b.value[1]]; + } + return a.path["aria"].localeCompare(b.path["aria"]); + }); + var lastPath = null; + var category = null; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (category !== result.category) { + if (category !== null) { + console.groupEnd(); + console.groupEnd(); + lastPath = null; + } + category = result.category; + console.group(result.category); + } + if (result.path["aria"] != lastPath) { + if (lastPath !== null) { + console.groupEnd(); + } + lastPath = result.path["aria"]; + if (lastPath === "") { + console.group("page"); + } + else { + console.group(lastPath); + } + } + console.log(result.value, result.message); + } + console.groupEnd(); + console.groupEnd(); + }); + }, timeout); +} +exports.checkDemo = checkDemo; + +})(); + +ace = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNlLWRlYnVnLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7OztBQWtCL0U7SUFBQTtJQWl5RkEsQ0FBQztJQWh5RlUsK0JBQWUsR0FBdEIsVUFBdUIsSUFBWTtRQUMvQixPQUFPLENBQUMsSUFBSSxJQUFJLGVBQWUsQ0FBQyxjQUFjLENBQUM7ZUFDeEMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRO2VBQzdDLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZ0NBQWdCLEdBQWMsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCO1FBQ2pILGNBQWMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLG1CQUFtQjtRQUNqRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsc0JBQXNCO1FBQ2xHLHlGQUF5Rjs7UUFDdkYsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjO0tBQzFFLENBQUM7SUFFRiwwREFBMEQ7SUFDbkQsbUNBQW1CLEdBQWMsQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBRXRKLG1CQUFtQjtJQUNaLHFDQUFxQixHQUFjO1FBQ3RDLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxhQUFhO0tBQ2hELENBQUM7SUFFRiw2REFBNkQ7SUFDdEQsMENBQTBCLEdBQWM7UUFDM0MsY0FBYyxFQUFFLGlCQUFpQjtLQUNwQyxDQUFDO0lBRUY7Ozs7Ozs7Ozs7T0FVRztJQUNJLGlDQUFpQixHQU1wQjtRQUNBLHVCQUF1QixFQUFFO1lBQ3JCLElBQUksRUFBRSx3Q0FBd0M7WUFDOUMsb0JBQW9CLEVBQUUsSUFBSTtTQUM3QjtRQUNELGFBQWEsRUFBRTtZQUNYLElBQUksRUFBRSwwQ0FBMEM7U0FDbkQ7UUFDRCxtQkFBbUIsRUFBRTtZQUNqQixJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxxQ0FBcUM7U0FDaEc7UUFDRCxXQUFXLEVBQUU7WUFDVCxJQUFJLEVBQUUsMENBQTBDO1NBQ25EO1FBQ0QsY0FBYyxFQUFFO1lBQ1osSUFBSSxFQUFFLDBDQUEwQztZQUNoRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUM7U0FDbEQ7UUFDRCxlQUFlLEVBQUU7WUFDYixJQUFJLEVBQUUsc0NBQXNDO1NBQy9DO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsSUFBSSxFQUFFLHNDQUFzQztTQUMvQztRQUNELGNBQWMsRUFBRTtZQUNaLElBQUksRUFBRSxzQ0FBc0M7U0FDL0M7UUFDRCxlQUFlLEVBQUU7WUFDYixJQUFJLEVBQUUseUNBQXlDO1lBQy9DLG9CQUFvQixFQUFFLElBQUk7U0FDN0I7UUFDRCxjQUFjLEVBQUU7WUFDWixJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQywrQkFBK0I7U0FDckg7UUFDRCxrQkFBa0IsRUFBRTtZQUNoQixJQUFJLEVBQUUseUNBQXlDO1lBQy9DLG9CQUFvQixFQUFFLElBQUk7U0FDN0I7UUFDRCxjQUFjLEVBQUU7WUFDWixJQUFJLEVBQUUseUNBQXlDO1NBQ2xEO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsSUFBSSxFQUFFLDBDQUEwQztTQUNuRDtRQUNELGlCQUFpQixFQUFFO1lBQ2YsSUFBSSxFQUFFLDJDQUEyQztZQUNqRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQztTQUMvRDtRQUNELG1CQUFtQixFQUFFO1lBQ2pCLElBQUksRUFBRSx3Q0FBd0M7WUFDOUMsb0JBQW9CLEVBQUUsSUFBSTtTQUM3QjtRQUNELGVBQWUsRUFBRTtZQUNiLElBQUksRUFBRSwwQ0FBMEM7WUFDaEQsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUM7U0FDekM7UUFDRCxhQUFhLEVBQUU7WUFDWCxJQUFJLEVBQUUseUNBQXlDO1lBQy9DLG9CQUFvQixFQUFFLEtBQUs7U0FDOUI7UUFDRCxjQUFjLEVBQUU7WUFDWixJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDO1NBQ3pDO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsSUFBSSxFQUFFLDBDQUEwQztZQUNoRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUM7U0FDekU7UUFDRCxhQUFhLEVBQUU7WUFDWCxJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDO1NBQ3pDO1FBQ0QsY0FBYyxFQUFFO1lBQ1osSUFBSSxFQUFFLDBDQUEwQztZQUNoRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsK0JBQStCO1NBQ2hHO1FBQ0QsbUJBQW1CLEVBQUU7WUFDakIsSUFBSSxFQUFFLHlDQUF5QztTQUNsRDtRQUNELFlBQVksRUFBRTtZQUNWLElBQUksRUFBRSx5Q0FBeUM7U0FDbEQ7UUFDRCxpQkFBaUIsRUFBRTtZQUNmLElBQUksRUFBRSx5Q0FBeUM7WUFDL0Msb0JBQW9CLEVBQUUsSUFBSTtTQUM3QjtRQUNELFlBQVksRUFBRTtZQUNWLElBQUksRUFBRSxzQ0FBc0M7U0FDL0M7UUFDRCxXQUFXLEVBQUU7WUFDVCxJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDO1NBQ3pDO1FBQ0QsWUFBWSxFQUFFO1lBQ1YsSUFBSSxFQUFFLDBDQUEwQztTQUNuRDtRQUNELGdCQUFnQixFQUFFO1lBQ2QsSUFBSSxFQUFFLDBDQUEwQztTQUNuRDtRQUNELHNCQUFzQixFQUFFO1lBQ3BCLElBQUksRUFBRSwwQ0FBMEM7U0FDbkQ7UUFDRCxrQkFBa0IsRUFBRTtZQUNoQixJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDO1NBQ2xEO1FBQ0QsV0FBVyxFQUFFO1lBQ1QsSUFBSSxFQUFFLHlDQUF5QztZQUMvQyxvQkFBb0IsRUFBRSxJQUFJO1NBQzdCO1FBQ0Qsa0JBQWtCLEVBQUU7WUFDaEIsSUFBSSxFQUFFLHlDQUF5QztTQUNsRDtRQUNELGVBQWUsRUFBRTtZQUNiLElBQUksRUFBRSxzQ0FBc0M7U0FDL0M7UUFDRCxjQUFjLEVBQUU7WUFDWixJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQztTQUNsRDtRQUNELGVBQWUsRUFBRTtZQUNiLElBQUksRUFBRSwwQ0FBMEM7U0FDbkQ7UUFDRCxlQUFlLEVBQUU7WUFDYixJQUFJLEVBQUUsMkNBQTJDO1lBQ2pELE1BQU0sRUFBRSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQztTQUNuRDtRQUNELGVBQWUsRUFBRTtZQUNiLElBQUksRUFBRSwwQ0FBMEM7U0FDbkQ7UUFDRCxzQkFBc0IsRUFBRTtZQUNwQixJQUFJLEVBQUUseUNBQXlDO1NBQ2xEO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsSUFBSSxFQUFFLHNDQUFzQztTQUMvQztRQUNELGVBQWUsRUFBRTtZQUNiLElBQUksRUFBRSxzQ0FBc0M7U0FDL0M7UUFDRCxjQUFjLEVBQUU7WUFDWixJQUFJLEVBQUUsc0NBQXNDO1NBQy9DO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsSUFBSSxFQUFFLDBDQUEwQztZQUNoRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQztTQUN6QztRQUNELGNBQWMsRUFBRTtZQUNaLElBQUksRUFBRSxzQ0FBc0M7U0FDL0M7UUFDRCxXQUFXLEVBQUU7WUFDVCxJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQztTQUN2RDtRQUNELGVBQWUsRUFBRTtZQUNiLElBQUksRUFBRSwwQ0FBMEM7U0FDbkQ7UUFDRCxlQUFlLEVBQUU7WUFDYixJQUFJLEVBQUUsMENBQTBDO1NBQ25EO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsSUFBSSxFQUFFLDBDQUEwQztTQUNuRDtRQUNELGdCQUFnQixFQUFFO1lBQ2QsSUFBSSxFQUFFLHlDQUF5QztTQUNsRDtLQUNKO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNJLDhCQUFjLEdBZWpCO1FBQ0EsT0FBTyxFQUFFO1lBQ0wsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsWUFBWTtZQUN0QixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxhQUFhLEVBQUU7WUFDWCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQztZQUNyQixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxlQUFlLENBQUM7WUFDakQsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUVELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGNBQWMsQ0FBQztZQUN4QyxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsUUFBUSxFQUFFO1lBQ04sU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxZQUFZLEVBQUU7WUFDVixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFFBQVEsRUFBRTtZQUNOLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGNBQWMsQ0FBQztZQUN4QyxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxnQ0FBZ0M7WUFDM0MsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGNBQWMsQ0FBQztTQUN6RDtRQUVELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQztZQUNsRCxLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDeEIsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsTUFBTSxFQUFFO1lBQ0osU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2xCLEtBQUssRUFBRSxDQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztZQUN6RSxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDMUQsUUFBUSxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQzFCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSx5QkFBeUI7WUFDcEMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLGVBQWUsQ0FBQztTQUNyQztRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELGNBQWMsRUFBRTtZQUNaLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNsQixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLFdBQVcsQ0FBQztZQUMxSixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxrQkFBa0I7WUFDN0IsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztTQUNuQztRQUVELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLHVCQUF1QixFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDeEcsUUFBUSxFQUFFLENBQUMsZUFBZSxDQUFDO1lBQzNCLFdBQVcsRUFBRSxFQUFFO1lBQ2YsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsUUFBUTtZQUNsQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFFRCxlQUFlLEVBQUU7WUFDYixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELGFBQWEsRUFBRTtZQUNYLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsWUFBWSxFQUFFO1lBQ1YsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDeEIsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsVUFBVSxFQUFFO1lBQ1IsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDeEIsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsUUFBUSxFQUFFO1lBQ04sU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDckIsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUNELFdBQVcsRUFBRTtZQUNULFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBQ0QsY0FBYyxFQUFFO1lBQ1osU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxxQkFBcUIsRUFBRTtZQUNuQixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGVBQWUsRUFBRTtZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsY0FBYyxFQUFFO1lBQ1osU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxjQUFjLEVBQUU7WUFDWixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO1lBQzFELFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLFVBQVU7WUFDckIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztTQUNuQztRQUNELGlCQUFpQixFQUFFO1lBQ2YsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1lBQ3RELFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxrQkFBa0IsRUFBRTtZQUNoQixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGVBQWUsRUFBRTtZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDMUQsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsVUFBVTtZQUNyQixRQUFRLEVBQUUsUUFBUTtZQUNsQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1NBQ25DO1FBQ0QsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxjQUFjLEVBQUU7WUFDWixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGdCQUFnQixFQUFFO1lBQ2QsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxXQUFXLEVBQUU7WUFDVCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsS0FBSztZQUNoQixRQUFRLEVBQUUsV0FBVztZQUNyQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsc0JBQXNCLEVBQUUsSUFBSTtTQUMvQjtRQUNELFlBQVksRUFBRTtZQUNWLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxnQkFBZ0IsRUFBRTtZQUNkLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1lBQ3RELFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxjQUFjLEVBQUU7WUFDWixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGNBQWMsRUFBRTtZQUNaLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsY0FBYyxFQUFFO1lBQ1osU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxZQUFZLEVBQUU7WUFDVixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGFBQWEsRUFBRTtZQUNYLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsY0FBYyxFQUFFO1lBQ1osU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxjQUFjLEVBQUU7WUFDWixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGNBQWMsRUFBRTtZQUNaLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsY0FBYyxFQUFFO1lBQ1osU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQztZQUMxRCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxVQUFVO1lBQ3JCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7U0FDbkM7UUFDRCxXQUFXLEVBQUU7WUFDVCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGtCQUFrQixFQUFFO1lBQ2hCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQztZQUMxRCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxVQUFVO1lBQ3JCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7U0FDbkM7UUFDRCxZQUFZLEVBQUU7WUFDVixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGVBQWUsRUFBRTtZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsa0JBQWtCLENBQUM7WUFDM0IsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsc0JBQXNCLEVBQUUsSUFBSTtTQUMvQjtRQUNELGNBQWMsRUFBRTtZQUNaLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsZ0JBQWdCLEVBQUU7WUFDZCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUN4QixlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7U0FDckQ7UUFDRCxnQkFBZ0IsRUFBRTtZQUNkLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztTQUNyRDtRQUNELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxjQUFjLEVBQUU7WUFDWixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGVBQWUsRUFBRTtZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsU0FBUyxFQUFFO1lBQ1AsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxjQUFjLEVBQUU7WUFDWixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7U0FDbkM7UUFDRCxTQUFTLEVBQUU7WUFDUCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsVUFBVSxFQUFFO1lBQ1IsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxVQUFVLEVBQUU7WUFDUixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUN4QixlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7WUFDbEQsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxNQUFNLEVBQUU7WUFDSixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDeEIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxRQUFRLEVBQUU7WUFDTixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUN4QixlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUM7WUFDMUUsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxtQkFBbUIsRUFBRTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUVELGlCQUFpQixFQUFFO1lBQ2YsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFFRCxpQkFBaUIsRUFBRTtZQUNmLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLHNCQUFzQixFQUFFLElBQUk7U0FDL0I7UUFFRCxNQUFNLEVBQUU7WUFDSixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO1lBQzNHLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQztZQUNoQyxTQUFTLEVBQUUsT0FBTztZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMxRTtRQUVELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNsQixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsZUFBZSxDQUFDO1lBQ3BOLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1NBQ25DO1FBRUQsT0FBTyxFQUFFO1lBQ0wsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztZQUNoQyxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDMUU7UUFFRCxTQUFTLEVBQUU7WUFDUCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSw2QkFBNkI7WUFDeEMsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELEtBQUssRUFBRTtZQUNILFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsT0FBTyxFQUFFO1lBQ0wsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLHNCQUFzQixFQUFFLElBQUk7WUFDNUIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxXQUFXLEVBQUU7WUFDVCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUN4QixlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7WUFDbEQsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxNQUFNLEVBQUU7WUFDSixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUN4QixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxVQUFVO1lBQ3JCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO1NBQ3pEO1FBRUQsTUFBTSxFQUFFO1lBQ0osU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQ3pCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsdUJBQXVCLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDL0gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO1lBQ2hDLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsQ0FBQztTQUNyQztRQUVELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztZQUN0RCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsS0FBSyxFQUFFO1lBQ0gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsWUFBWTtZQUN0QixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxNQUFNLEVBQUU7WUFDSixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUN4QixlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7WUFDbEQsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxTQUFTLEVBQUU7WUFDUCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLHNCQUFzQixFQUFFLEtBQUs7WUFDN0IsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxNQUFNLEVBQUU7WUFDSixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLGtCQUFrQixDQUFDO1lBQ3BELFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLENBQUM7WUFDdkUsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsUUFBUTtZQUNsQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMxRTtRQUVELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsdUJBQXVCLEVBQUUsa0JBQWtCLENBQUM7WUFDcEQsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsQ0FBQztZQUN2RSxTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzFFO1FBRUQsVUFBVSxFQUFFO1lBQ1IsU0FBUyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUM7WUFDdkMsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7WUFDekQsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO1NBQ3pEO1FBRUQsa0JBQWtCLEVBQUU7WUFDaEIsU0FBUyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUM7WUFDdkMsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7WUFDekQsUUFBUSxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQzFCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGNBQWMsQ0FBQztTQUN6RDtRQUVELGVBQWUsRUFBRTtZQUNiLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDO1lBQ3ZDLEtBQUssRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1lBQ3pELFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQztZQUMxQixXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsc0JBQXNCLEVBQUUsSUFBSTtZQUM1QixlQUFlLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxjQUFjLENBQUM7U0FDekQ7UUFFRCxPQUFPLEVBQUU7WUFDTCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUM7WUFDM0QsUUFBUSxFQUFFLENBQUMsZUFBZSxDQUFDO1lBQzNCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLHNCQUFzQixFQUFFLElBQUk7WUFDNUIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxZQUFZLEVBQUU7WUFDVixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLEVBQUU7WUFDVCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsUUFBUSxFQUFFO1lBQ04sU0FBUyxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQztZQUMvQixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7WUFDekUsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsUUFBUTtZQUNuQixRQUFRLEVBQUUsUUFBUTtZQUNsQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1lBQ2hDLHNCQUFzQixFQUFFLElBQUk7WUFDNUIsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMxRTtRQUVELFdBQVcsRUFBRTtZQUNULFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELGNBQWMsRUFBRTtZQUNaLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLEVBQUU7WUFDVCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELGFBQWEsRUFBRTtZQUNYLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUM7WUFDNUUsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsT0FBTyxFQUFFO1lBQ0wsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDO1lBQ3hDLFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQztZQUMxQixXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsc0JBQXNCO1lBQ2pDLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsc0JBQXNCLEVBQUUsSUFBSTtZQUM1QixlQUFlLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzFFO1FBRUQsWUFBWSxFQUFFO1lBQ1YsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO1lBQ3RGLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ3RCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsQ0FBQztTQUNyQztRQUVELFFBQVEsRUFBRTtZQUNOLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsS0FBSyxFQUFFO1lBQ0gsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDO1lBQ3BELEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztZQUNuSixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQztZQUM5RCxTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMxRTtRQUVELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDO1lBQ3hDLEtBQUssRUFBRSxFQUFFO1lBQ1QsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDcEIsU0FBUyxFQUFFLHVCQUF1QjtZQUNsQyxRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxXQUFXLEVBQUU7WUFDVCxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbEIsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxXQUFXLENBQUM7WUFDMUosUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsa0JBQWtCO1lBQzdCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7U0FDbkM7UUFFRCxXQUFXLEVBQUU7WUFDVCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUM7WUFDL0UsUUFBUSxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztZQUM1QyxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDMUU7UUFFRCxRQUFRLEVBQUU7WUFDTixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFdBQVcsRUFBRTtZQUNULFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQztZQUM3SCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSx1QkFBdUI7WUFDbEMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBRUQsV0FBVyxFQUFFO1lBQ1QsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztZQUMzQixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLHNCQUFzQixFQUFFLElBQUk7WUFDNUIsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMxRTtRQUVELFFBQVEsRUFBRTtZQUNOLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUM7WUFDaEcsUUFBUSxFQUFFLENBQUMsZUFBZSxDQUFDO1lBQzNCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLHNCQUFzQixFQUFFLElBQUk7U0FDL0I7UUFFRCxZQUFZLEVBQUU7WUFDVixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUM7WUFDdkksUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLENBQUM7U0FDckM7UUFFRCxRQUFRLEVBQUU7WUFDTixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFFBQVEsRUFBRTtZQUNOLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFdBQVcsRUFBRTtZQUNULFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFlBQVksRUFBRTtZQUNWLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELGFBQWEsRUFBRTtZQUNYLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFFBQVEsRUFBRTtZQUNOLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDMUQsUUFBUSxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQzFCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLGVBQWUsQ0FBQztTQUNyQztRQUVELEtBQUssRUFBRTtZQUNILFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN0QixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7WUFDMUUsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsc0JBQXNCLEVBQUUsSUFBSTtZQUM1QixlQUFlLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxjQUFjLENBQUM7U0FDekQ7UUFFRCxPQUFPLEVBQUU7WUFDTCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDekMsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQztZQUMzQyxTQUFTLEVBQUUsT0FBTztZQUNsQixRQUFRLEVBQUUsV0FBVztZQUNyQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxTQUFTLEVBQUU7WUFDUCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixDQUFDO1lBQzVFLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3BCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDMUU7UUFFRCxVQUFVLEVBQUU7WUFDUixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUN4QixlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7WUFDbEQsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxTQUFTLEVBQUU7WUFDUCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDN0gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUscUJBQXFCO1lBQ2hDLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE9BQU8sRUFBRTtZQUNMLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFlBQVk7WUFDdEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsU0FBUyxFQUFFO1lBQ1AsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxrQkFBa0IsQ0FBQztZQUNwRCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDMUU7UUFFRCxTQUFTLEVBQUU7WUFDUCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxNQUFNLEVBQUU7WUFDSixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsQ0FBQztZQUM3RixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7WUFDbEMsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsUUFBUTtZQUNsQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxDQUFDO1NBQ3JDO1FBRUQsVUFBVSxFQUFFO1lBQ1IsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDaEosUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDO1lBQ2hDLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsQ0FBQztTQUNyQztRQUVELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7WUFDNUIsS0FBSyxFQUFFLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7WUFDeEcsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO1NBQ3pEO0tBQ0osRUFBQyxxQkFBcUI7SUFFdkIsNEZBQTRGO0lBQzVGLDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDeEU7Ozs7T0FJRztJQUNJLHVDQUF1QixHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxzQ0FBc0M7SUFDN0ksdUNBQXVCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxtSkFBbUo7SUFDck0sdUNBQXVCLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLCtLQUErSztJQUc5Tjs7O1VBR007SUFDQyw4Q0FBOEIsR0FFakM7UUFDQSxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQiwwQ0FBMEMsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztTQUNoRjtRQUNELFNBQVMsRUFBRTtZQUNQLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN2QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFNBQVMsRUFBRTtZQUNQLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUM7WUFDekYseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE9BQU8sRUFBRTtZQUNMLFlBQVksRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUMvQixVQUFVLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO1lBQ3JLLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDM0IseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELEdBQUcsRUFBRTtZQUNELFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7U0FDbkM7UUFDRCxLQUFLLEVBQUU7WUFDSCxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxLQUFLLEVBQUU7WUFDSCxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxZQUFZLEVBQUU7WUFDVixZQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDNUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLElBQUk7WUFDaEIsNkJBQTZCLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDOUMseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUM7WUFDcEMseUJBQXlCLEVBQUUsS0FBSztZQUNoQywwQkFBMEIsRUFBRSxDQUFDLGFBQWEsQ0FBQztTQUM5QztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUN4QixVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUM7WUFDL0sseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsU0FBUyxFQUFFO1lBQ1AsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsK0JBQStCLEVBQUUsS0FBSztTQUN6QztRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLDBDQUEwQyxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1NBQ2hGO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3RCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsS0FBSyxFQUFFO1lBQ0gsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztTQUNuQztRQUNELFVBQVUsRUFBRTtZQUNSLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7U0FDbkM7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxVQUFVLEVBQUU7WUFDUixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztZQUNoQywrQkFBK0IsRUFBRSxLQUFLO1NBQ3pDO1FBQ0QsSUFBSSxFQUFFO1lBQ0YsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztZQUMxQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFNBQVMsRUFBRTtZQUNQLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN2QixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsS0FBSyxFQUFFO1lBQ0gsWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3RCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsUUFBUSxFQUFFO1lBQ04sWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3hCLFVBQVUsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUMzQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0YsSUFBSSxFQUFFO1lBQ0QsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO1lBQ3JELHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxJQUFJLEVBQUU7WUFDRixZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDdEIsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQ3hCLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxJQUFJLEVBQUU7WUFDRixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE9BQU8sRUFBRTtZQUNMLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUM7WUFDdEUseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFVBQVUsRUFBRTtZQUNSLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN2QixVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLFlBQVksQ0FBQztZQUNsRCx5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsWUFBWSxFQUFFO1lBQ1YsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUM7WUFDN0MseUJBQXlCLEVBQUUsSUFBSTtZQUMvQiwwQ0FBMEMsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztTQUNoRjtRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQztZQUM5Qyx5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztTQUNuQztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN2QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUMzQixVQUFVLEVBQUUsQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQztZQUNyRCx5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQzFCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7WUFDaEMsK0JBQStCLEVBQUUsS0FBSztTQUN6QztRQUNELEdBQUcsRUFBRTtZQUNELFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUM7WUFDdEUseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUMzQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLDBDQUEwQyxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1NBQ2hGO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQiwwQ0FBMEMsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztTQUNoRjtRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsMENBQTBDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7U0FDaEY7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3RCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxLQUFLLEVBQUU7WUFDSCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsMENBQTBDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7U0FDaEY7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDdEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUM7WUFDdkgseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7U0FDbkM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDdkIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQiw2QkFBNkIsRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDakUsK0JBQStCLEVBQUUsS0FBSztTQUN6QztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQztZQUM1QixVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO1lBQzFHLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxVQUFVLEVBQUU7WUFDUixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsUUFBUSxFQUFFO1lBQ04sWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUM7WUFDOUMseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUM7WUFDdkgseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFVBQVUsRUFBRTtZQUNSLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN2QixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsUUFBUSxFQUFFO1lBQ04sWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3hCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsNkJBQTZCLEVBQUUsQ0FBQyxlQUFlLENBQUM7U0FDbkQ7UUFDRCxRQUFRLEVBQUU7WUFDTixZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDeEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxHQUFHLEVBQUU7WUFDRCxZQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDM0IsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsU0FBUyxFQUFFO1lBQ1AsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztZQUNoQywwQkFBMEIsRUFBRSxDQUFDLGFBQWEsQ0FBQztTQUM5QztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFVBQVUsRUFBRTtZQUNSLFlBQVksRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUM3QixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLDZCQUE2QixFQUFFLENBQUMsZUFBZSxDQUFDO1NBQ25EO1FBQ0QsR0FBRyxFQUFFO1lBQ0QsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsSUFBSSxFQUFFO1lBQ0YsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxJQUFJLEVBQUU7WUFDRixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQiwwQ0FBMEMsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztTQUNoRjtRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsR0FBRyxFQUFFO1lBQ0QsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQzFCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLDZCQUE2QixFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1NBQ25FO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsUUFBUSxFQUFFO1lBQ04sWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztTQUNuQztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUN4QixVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQztZQUN6RSx5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztTQUNuQztRQUNELE9BQU8sRUFBRTtZQUNMLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7U0FDbkM7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxRQUFRLEVBQUU7WUFDTixZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDeEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsS0FBSyxFQUFFO1lBQ0gsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDO1lBQzNCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsS0FBSyxFQUFFO1lBQ0gsWUFBWSxFQUFFLENBQUMsYUFBYSxDQUFDO1lBQzdCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsS0FBSyxFQUFFO1lBQ0gsWUFBWSxFQUFFLENBQUMsbUJBQW1CLENBQUM7WUFDbkMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDdkIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxVQUFVLEVBQUU7WUFDUixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsVUFBVSxFQUFFO1lBQ1IsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7WUFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7WUFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDdEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztTQUNuQztRQUNELEdBQUcsRUFBRTtZQUNELFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUM7WUFDdkgseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLDBDQUEwQyxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1NBQ2hGO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsYUFBYSxDQUFDO1lBQzNCLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxLQUFLLEVBQUU7WUFDSCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDO1lBQ3BDLHlCQUF5QixFQUFFLEtBQUs7WUFDaEMsMEJBQTBCLEVBQUUsQ0FBQyxhQUFhLENBQUM7U0FDOUM7S0FDSixFQUFDLHFDQUFxQztJQUVoQyx5REFBeUMsR0FJNUM7UUFDQSxHQUFHLEVBQUU7WUFDRCxXQUFXLEVBQUU7Z0JBQ1QsWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDO2dCQUN0Qiw2REFBNkQ7Z0JBQzdELFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQztnQkFDbk0seUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsNkJBQTZCLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQzthQUN4RDtZQUNELGNBQWMsRUFBRTtnQkFDWixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLHVEQUF1RDtnQkFDdkQsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDRCxNQUFNLEVBQUU7WUFDSixXQUFXLEVBQUU7Z0JBQ1QsWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDO2dCQUN0Qiw2REFBNkQ7Z0JBQzdELFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsY0FBYyxFQUFFO2dCQUNaLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDekIsdURBQXVEO2dCQUN2RCxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO2dCQUM5Qix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDVCxPQUFPO1FBQ1Asd0NBQXdDO1FBQ3hDLG9IQUFvSDtRQUNwSCxtR0FBbUc7UUFDbkcsNkNBQTZDO1FBQzdDLFlBQVk7UUFDSixLQUFLLEVBQUU7WUFDSCxVQUFVLEVBQUU7Z0JBQ1IsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO2dCQUNwQyx5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsYUFBYSxFQUFFO2dCQUNYLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDekIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDRCxRQUFRLEVBQUU7WUFDTixrQkFBa0IsRUFBRTtnQkFDaEIsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUN4QixVQUFVLEVBQUUsQ0FBQyxhQUFhLENBQUM7Z0JBQzNCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxxQkFBcUIsRUFBRTtnQkFDbkIsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUN4QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ25CLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7U0FDSjtRQUNELFFBQVEsRUFBRTtZQUNOLG9DQUFvQyxFQUFFO2dCQUNsQyxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLHVGQUF1RjtnQkFDdkYsVUFBVSxFQUFFLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO2dCQUM3RCx5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsT0FBTyxFQUFFO2dCQUNMLFlBQVksRUFBRSxDQUFDLGFBQWEsQ0FBQztnQkFDN0IsNkZBQTZGO2dCQUM3RixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUM7Z0JBQzdELHlCQUF5QixFQUFFLElBQUk7YUFDbEM7U0FDSjtRQUNULE9BQU87UUFDUCw2Q0FBNkM7UUFDN0Msd0dBQXdHO1FBQ3hHLGlRQUFpUTtRQUNqUSw2Q0FBNkM7UUFDN0MsWUFBWTtRQUVKLFFBQVEsRUFBRTtZQUNOLG9DQUFvQyxFQUFFO2dCQUNsQyxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLHVGQUF1RjtnQkFDdkYsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUM7Z0JBQzdDLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxPQUFPLEVBQUU7Z0JBQ0wsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUN4Qiw2RkFBNkY7Z0JBQzdGLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO2dCQUM3Qyx5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBRUo7UUFDRCxLQUFLLEVBQUU7WUFDSCxrQkFBa0IsRUFBRTtnQkFDaEIsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNyQixpREFBaUQ7Z0JBQ2pELFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQztnQkFDcE4seUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELCtCQUErQixFQUFFO2dCQUM3QixZQUFZLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO2dCQUN0QywrREFBK0Q7Z0JBQy9ELFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxLQUFLO2dCQUNoQywwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixDQUFDO2FBQ25EO1lBQ0QsNEJBQTRCLEVBQUU7Z0JBQzFCLFlBQVksRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDckIsZ0VBQWdFO2dCQUNoRSxVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO2dCQUNwQyx5QkFBeUIsRUFBRSxLQUFLO2dCQUNoQywwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixDQUFDO2FBQ25EO1NBQ0o7UUFDRCxPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUU7Z0JBQ04sWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUN4QixVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQztnQkFDbksseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELDRCQUE0QixFQUFFO2dCQUMxQixZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLDZFQUE2RTtnQkFDN0UsVUFBVSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7Z0JBQzlELHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDBCQUEwQixFQUFFLENBQUMsZUFBZSxDQUFDO2dCQUM3Qyw2QkFBNkIsRUFBRSxDQUFDLGNBQWMsQ0FBQzthQUNsRDtZQUNELCtCQUErQixFQUFFO2dCQUM3QixZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLGlGQUFpRjtnQkFDakYsVUFBVSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQztnQkFDcEQseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQzdDLDZCQUE2QixFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ2xEO1lBQ0QsT0FBTyxFQUFFO2dCQUNMLFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELE1BQU0sRUFBRTtnQkFDSixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDBCQUEwQixFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztnQkFDOUQsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxnQkFBZ0IsRUFBRTtnQkFDZCxZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDBCQUEwQixFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztnQkFDOUQsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxlQUFlLEVBQUU7Z0JBQ2IsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN6QixxRUFBcUU7Z0JBQ3JFLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7Z0JBQ2xGLHVCQUF1QixFQUFFLENBQUMsU0FBUyxDQUFDO2FBQ3ZDO1lBQ0QsaUJBQWlCLEVBQUU7Z0JBQ2YsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELE1BQU0sRUFBRTtnQkFDSixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDBCQUEwQixFQUFFLENBQUMsZUFBZSxDQUFDO2FBQ2hEO1lBQ0QsUUFBUSxFQUFFO2dCQUNOLFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsS0FBSzthQUNuQztZQUNELE9BQU8sRUFBRTtnQkFDTCxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hCLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUM7Z0JBQ3ZKLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxPQUFPLEVBQUU7Z0JBQ0wsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDN0MsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxRQUFRLEVBQUU7Z0JBQ04sWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDO2dCQUM1QixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2FBQ3JGO1lBQ0QsVUFBVSxFQUFFO2dCQUNSLFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2dCQUNsRix1QkFBdUIsRUFBRSxDQUFDLFNBQVMsQ0FBQzthQUN2QztZQUNELE9BQU8sRUFBRTtnQkFDTCxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUM7Z0JBQ3ZCLFVBQVUsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDN0IseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQzdDLDZCQUE2QixFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ2xEO1lBQ0QsT0FBTyxFQUFFO2dCQUNMLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDeEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDZCQUE2QixFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQzthQUNwRTtZQUNELE9BQU8sRUFBRTtnQkFDTCxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hCLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDO2dCQUNuSyx5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsZ0JBQWdCLEVBQUU7Z0JBQ2QsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDO2dCQUMzQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2FBQ3JGO1lBQ0Qsa0JBQWtCLEVBQUU7Z0JBQ2hCLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxRQUFRLEVBQUU7Z0JBQ04sWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUN4QixVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQztnQkFDbksseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELGFBQWEsRUFBRTtnQkFDWCxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7YUFDckY7WUFDRCxlQUFlLEVBQUU7Z0JBQ2IsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELGNBQWMsRUFBRTtnQkFDWixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDO2dCQUNuRCx5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7YUFDckY7WUFDRCxnQkFBZ0IsRUFBRTtnQkFDZCxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQixtRkFBbUY7YUFDdEY7WUFDRCxNQUFNLEVBQUU7Z0JBQ0osWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDN0MsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxhQUFhLEVBQUU7Z0JBQ1gsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN6QixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2FBQ3JGO1lBQ0QsZUFBZSxFQUFFO2dCQUNiLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxNQUFNLEVBQUU7Z0JBQ0osWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDN0MsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxtQkFBbUIsRUFBRTtnQkFDakIsOERBQThEO2dCQUM5RCxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsaUJBQWlCLEVBQUU7Z0JBQ2YsOERBQThEO2dCQUM5RCxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDRCxJQUFJLEVBQUU7WUFDRixvQkFBb0IsRUFBRTtnQkFDbEIsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELHVCQUF1QixFQUFFO2dCQUNyQixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbkIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztTQUNKO1FBQ0QsU0FBUyxFQUFFO1lBQ1AsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDeEIsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO2dCQUN0cUIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELGNBQWMsRUFBRTtnQkFDWixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO2dCQUN0cUIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztTQUNKO1FBQ0QsUUFBUSxFQUFFO1lBQ04sMkJBQTJCLEVBQUU7Z0JBQ3pCLDZGQUE2RjtnQkFDN0YsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3BCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDZCQUE2QixFQUFFLENBQUMsc0JBQXNCLENBQUM7YUFDMUQ7WUFDRCx3QkFBd0IsRUFBRTtnQkFDdEIsZ0dBQWdHO2dCQUNoRyxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiw2QkFBNkIsRUFBRSxDQUFDLHNCQUFzQixDQUFDO2FBQzFEO1NBQ0o7UUFDRCxTQUFTLEVBQUU7WUFDUCx5QkFBeUIsRUFBRTtnQkFDdkIsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUM7YUFDakU7WUFDRCw0QkFBNEIsRUFBRTtnQkFDMUIsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbkIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztTQUNKO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsVUFBVSxFQUFFO2dCQUNSLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsY0FBYyxFQUFFO2dCQUNaLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ25CLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7U0FDSjtRQUNELElBQUksRUFBRTtZQUNGLFdBQVcsRUFBRTtnQkFDVCxZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsVUFBVSxFQUFFO2dCQUNSLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxjQUFjLEVBQUU7Z0JBQ1osWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELFdBQVcsRUFBRTtnQkFDVCxZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDRCxJQUFJLEVBQUU7WUFDRixxQkFBcUIsRUFBRTtnQkFDbkIsWUFBWSxFQUFFLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQztnQkFDbkMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCx3QkFBd0IsRUFBRTtnQkFDdEIsWUFBWSxFQUFFLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQztnQkFDdEMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCw2QkFBNkIsRUFBRTtnQkFDM0IsWUFBWSxFQUFFLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQztnQkFDdkMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxnQ0FBZ0MsRUFBRTtnQkFDOUIsWUFBWSxFQUFFLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQztnQkFDMUMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxXQUFXLEVBQUU7Z0JBQ1QsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbkIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztTQUNKO1FBQ0QsSUFBSSxFQUFFO1lBQ0YsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDckIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxVQUFVLEVBQUU7Z0JBQ1IsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNyQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELGNBQWMsRUFBRTtnQkFDWixZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3JCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ25CLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7U0FDSjtRQUVELFNBQVMsRUFBRTtZQUNQLFlBQVksRUFBRSxJQUFJO1lBQ2xCLG9CQUFvQjtZQUNwQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztLQUNKLEVBQUMsbURBQW1EO0lBRXJELDRGQUE0RjtJQUM1Rix3R0FBd0c7SUFDeEcsNENBQTRDO0lBQ3JDLHlDQUF5QixHQWEzQjtRQUNELGNBQWMsRUFBRTtZQUNaLFFBQVEsRUFBRSxDQUFDO29CQUNQLGtCQUFrQixFQUFFLE9BQU87b0JBQzNCLGtCQUFrQixFQUFFLENBQUMsU0FBUyxDQUFDO29CQUMvQixtQkFBbUIsRUFBRSxJQUFJO2lCQUM1QixDQUFDO1lBQ0YsV0FBVyxFQUFFLENBQUM7b0JBQ1Ysa0JBQWtCLEVBQUUsTUFBTTtvQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxTQUFTLENBQUM7b0JBQy9CLG1CQUFtQixFQUFFLElBQUk7aUJBQzVCLENBQUM7U0FDTDtRQUNELGVBQWUsRUFBRTtZQUNiLFFBQVEsRUFBRSxDQUFDO29CQUNQLGtCQUFrQixFQUFFLE9BQU87b0JBQzNCLGtCQUFrQixFQUFFLENBQUMsVUFBVSxDQUFDO29CQUNoQyxtQkFBbUIsRUFBRSxJQUFJO2lCQUM1QixDQUFDO1lBQ0YsV0FBVyxFQUFFLENBQUM7b0JBQ1Ysa0JBQWtCLEVBQUUsTUFBTTtvQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLENBQUM7b0JBQ2hDLG1CQUFtQixFQUFFLElBQUk7aUJBQzVCLENBQUM7U0FDTDtRQUNELGFBQWEsRUFBRTtZQUNYLFFBQVEsRUFBRSxDQUFDO29CQUNQLGtCQUFrQixFQUFFLE9BQU87b0JBQzNCLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO29CQUM5QixtQkFBbUIsRUFBRSxDQUFDLGFBQWEsQ0FBQztpQkFDdkM7Z0JBQ0Q7b0JBQ0ksa0JBQWtCLEVBQUUsTUFBTTtvQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQzlCLG1CQUFtQixFQUFFLENBQUMsYUFBYSxDQUFDO2lCQUN2QyxDQUFDO1lBQ0YsV0FBVyxFQUFFLENBQUM7b0JBQ1Ysa0JBQWtCLEVBQUUsTUFBTTtvQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQzlCLG1CQUFtQixFQUFFLENBQUMsYUFBYSxDQUFDO2lCQUN2QyxDQUFDO1NBQ0w7UUFDRCxrQkFBa0IsRUFBRTtZQUNoQixRQUFRLEVBQUUsQ0FBQztvQkFDUCxrQkFBa0IsRUFBRSxJQUFJO29CQUN4QixrQkFBa0IsRUFBRSxDQUFDLGFBQWEsQ0FBQztvQkFDbkMsbUJBQW1CLEVBQUUsSUFBSTtpQkFDNUIsQ0FBQztTQUNMO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsUUFBUSxFQUFFLENBQUM7b0JBQ1Asa0JBQWtCLEVBQUUsSUFBSTtvQkFDeEIsa0JBQWtCLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQzNCLG1CQUFtQixFQUFFLElBQUk7aUJBQzVCLENBQUM7WUFDRixrS0FBa0s7U0FDcks7UUFDRCxlQUFlLEVBQUU7WUFDYixRQUFRLEVBQUUsQ0FBQztvQkFDUCxrQkFBa0IsRUFBRSxJQUFJO29CQUN4QixrQkFBa0IsRUFBRSxDQUFDLEtBQUssQ0FBQztvQkFDM0IsbUJBQW1CLEVBQUUsSUFBSTtpQkFDNUIsQ0FBQztZQUNGLGtLQUFrSztTQUNySztRQUNELGVBQWUsRUFBRTtZQUNiLFFBQVEsRUFBRSxDQUFDO29CQUNQLGtCQUFrQixFQUFFLE9BQU87b0JBQzNCLGtCQUFrQixFQUFFLENBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDO29CQUN4RSxtQkFBbUIsRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO2lCQUNoRCxDQUFDO1lBQ0YsV0FBVyxFQUFFLENBQUM7b0JBQ1Ysa0JBQWtCLEVBQUUsTUFBTTtvQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUM7b0JBQ3hFLG1CQUFtQixFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7aUJBQzlDLENBQUM7U0FDTDtRQUNELGVBQWUsRUFBRTtZQUNiLFFBQVEsRUFBRSxDQUFDO29CQUNQLGtCQUFrQixFQUFFLE9BQU87b0JBQzNCLGtCQUFrQixFQUFFLENBQUMsVUFBVSxDQUFDO29CQUNoQyxtQkFBbUIsRUFBRSxJQUFJO2lCQUM1QixDQUFDO1lBQ0YsV0FBVyxFQUFFLENBQUM7b0JBQ1Ysa0JBQWtCLEVBQUUsTUFBTTtvQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLENBQUM7b0JBQ2hDLG1CQUFtQixFQUFFLElBQUk7aUJBQzVCLENBQUM7U0FDTDtRQUNELGNBQWMsRUFBRTtZQUNaLFFBQVEsRUFBRSxDQUFDO29CQUNQLCtDQUErQztvQkFDL0Msa0JBQWtCLEVBQUUsT0FBTztvQkFDM0Isa0JBQWtCLEVBQUUsQ0FBQyxTQUFTLENBQUM7b0JBQy9CLG1CQUFtQixFQUFFLENBQUMsT0FBTyxDQUFDO2lCQUNqQyxDQUFDO1lBQ0YsV0FBVyxFQUFFLENBQUM7b0JBQ1YsZ0NBQWdDO29CQUNoQyxrQkFBa0IsRUFBRSxJQUFJO29CQUN4QixrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQztvQkFDL0IsbUJBQW1CLEVBQUUsSUFBSTtpQkFDNUIsQ0FBQztTQUNMO1FBQ0QsY0FBYyxFQUFFO1lBQ1osUUFBUSxFQUFFLENBQUM7b0JBQ1AsK0NBQStDO29CQUMvQyxrQkFBa0IsRUFBRSxPQUFPO29CQUMzQixrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQztvQkFDL0IsbUJBQW1CLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ2pDLENBQUM7WUFDRixXQUFXLEVBQUUsQ0FBQztvQkFDVixpQ0FBaUM7b0JBQ2pDLGtCQUFrQixFQUFFLElBQUk7b0JBQ3hCLGtCQUFrQixFQUFFLENBQUMsU0FBUyxDQUFDO29CQUMvQixtQkFBbUIsRUFBRSxJQUFJO2lCQUM1QixDQUFDO1NBQ0w7UUFDRDs7Ozs7OztZQU9JO0tBQ1A7SUFFTSwwQkFBVSxHQUFHLEVBQUU7SUFDMUIsc0JBQUM7Q0FBQTtBQWp5RlksMENBQWU7QUFpeUYzQixDQUFDO0FBRUYsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBRXhCLEtBQUssSUFBTSxVQUFVLElBQUksZUFBZSxDQUFDLGNBQWMsRUFBRTtJQUNyRCxJQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RSxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7UUFDckIsS0FBd0IsVUFBVSxFQUFWLHlCQUFVLEVBQVYsd0JBQVUsRUFBVixJQUFVLEVBQUU7WUFBL0IsSUFBTSxTQUFTO1lBQ2hCLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDekMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNsQztTQUNKO0tBQ0o7Q0FDSjtBQUNELGVBQWUsQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDOzs7Ozs7Ozs7Ozs7QUMvMEY1Qzs7Ozs7Ozs7Ozs7Ozs7K0VBYytFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFL0UseUdBQW9EO0FBQ3BELDBHQUFzRDtBQUN0RCxxRkFBeUM7QUFDekMsc0dBQXNEO0FBQ3RELGdHQUFrRDtBQUNsRCxzSUFBc0U7QUFFdEUsMEZBQTBDO0FBQzFDLG1HQUFvRDtBQUNwRCwyRkFBNkM7QUFDN0MseUdBQXdEO0FBS3hEO0lBQWdDLDhCQUFZO0lBQTVDOztJQTZyQkEsQ0FBQztJQTVyQkcsd0NBQW1CLEdBQW5CLFVBQW9CLElBQVUsRUFBRSxJQUFZO1FBQ3hDLHFEQUFxRDtRQUNyRCxvQ0FBb0M7UUFDcEMseURBQXlEO1FBQ3pELHdCQUF3QjtRQUN4QixRQUFRO1FBQ1IsSUFBSTtRQUNKLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxpQ0FBZSxDQUFDLGNBQWMsSUFBSSxpQ0FBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3BILENBQUM7SUFDRCw0QkFBTyxHQUFQLFVBQVEsSUFBVTtRQUNkLElBQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELGlDQUFZLEdBQVo7UUFDSSxPQUFPLE1BQU07SUFDakIsQ0FBQztJQUNELGtDQUFhLEdBQWIsVUFBYyxJQUFVO1FBQ3BCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHVCQUF1QixFQUFFO1lBQzdDLElBQU0sUUFBUSxHQUFHLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQW1CLEVBQUUsMkJBQTJCLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDakcsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXO2dCQUFFLE9BQU8sUUFBUSxDQUFDO1lBQ3JELElBQU0sSUFBSSxHQUFHLElBQWUsQ0FBQztZQUM3QixLQUFLLElBQUksR0FBRyxHQUFDLENBQUMsRUFBRSxHQUFHLEdBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUU7Z0JBQy9DLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RDLElBQU0sTUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksTUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDMUIsTUFBTSxDQUFDLE1BQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO2lCQUNsRDthQUNKO1lBRUQsaUVBQWlFO1lBQ2pFLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFN0MsZ0NBQWdDO1lBQ2hDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqRCxvQ0FBb0M7WUFDcEMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQW1CLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDaEY7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLG9CQUFvQixFQUFFO1lBQ2pELElBQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQztZQUN4RCxLQUFLLElBQU0sSUFBSSxJQUFJLFdBQVcsRUFBRTtnQkFDNUIsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFdBQVcsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO29CQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO2lCQUN0QjthQUNKO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsa0ZBQWtGO0lBQ25FLHdCQUFhLEdBQTVCLFVBQTZCLElBQWEsRUFBRSxRQUFnQixFQUFFLE1BQWdDO1FBQzFGLElBQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQztRQUN4RCxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDO1lBQUUsT0FBTztRQUV2QyxLQUFLLElBQU0sSUFBSSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLEVBQUU7Z0JBQ25CLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtvQkFDaEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7d0JBQzNCLEtBQUssR0FBSSxLQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNyQztvQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO2lCQUN4QjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRU0seUJBQWMsR0FBckIsVUFBc0IsSUFBaUI7UUFDbkMsSUFBTSxHQUFHLEdBQUcsdUJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzdELElBQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNuRCxLQUFLLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRTtnQkFDbkQsSUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM3QixJQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzt3Q0FDbkQsR0FBRztvQkFDUixJQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUM5QyxxREFBcUQ7b0JBQ3JELGlEQUFpRDtvQkFDakQscURBQXFEO29CQUNyRCxHQUFHO29CQUNIOzs7O3VCQUlHO29CQUNILElBQUksS0FBSyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFO3dCQUMxQyxtRUFBbUU7d0JBQ25FLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQzt3QkFDcEIsSUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUN6RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTs0QkFDeEMsSUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNoQyxJQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDcEUsS0FBSyxJQUFJLENBQUMsR0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0NBQ3RDLElBQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ3BELElBQUksU0FBUztvQ0FDVCxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDOzZCQUNsQzt5QkFDSjt3QkFDRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFOzRCQUN6QixxQkFBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDOzt5QkFFbEQ7d0JBQ0QsNEVBQTRFO3dCQUM1RSxJQUFJLFFBQU0sR0FBYSxLQUFLLENBQUM7d0JBQzdCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQzt3QkFDckIsT0FBTyxRQUFNLEtBQUssSUFBSSxFQUFFOzRCQUNwQixJQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQUksSUFBSSx3QkFBTyxDQUFDLFFBQVEsQ0FBQyxRQUFNLEVBQUUsSUFBSSxDQUFDLEVBQTlCLENBQThCLENBQUMsQ0FBQzs0QkFDdEUsSUFBSSxDQUFDLEtBQUs7Z0NBQ04sUUFBTSxHQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLFFBQU0sQ0FBQyxDQUFDO2lDQUN4QztnQ0FDRCxRQUFRLEdBQUcsSUFBSSxDQUFDO2dDQUNoQixNQUFNOzZCQUNUO3lCQUNKO3dCQUNELElBQUksQ0FBQyxRQUFROzRCQUNULHFCQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQ3REOztnQkExQ0wsS0FBSyxJQUFJLEdBQUcsR0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHOzRCQUFqQyxHQUFHO2lCQTJDWDthQUNKO1lBQ0QscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzdEO1FBQ0QsT0FBTyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTyxxQ0FBZ0IsR0FBeEIsVUFBeUIsSUFBVTtRQUMvQixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7WUFDckIsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDM0UsSUFBSSxVQUFVLEdBQUcsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEYsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osU0FBUyxFQUFFLEVBQUU7Z0JBQ2IsbUJBQW1CLEVBQUUsSUFBSTthQUM1QixDQUFDO1lBQ0YsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLGdCQUFnQjtZQUNoQixLQUFtQixVQUFlLEVBQWYsbUNBQWUsRUFBZiw2QkFBZSxFQUFmLElBQWUsRUFBRTtnQkFBL0IsSUFBTSxJQUFJO2dCQUNYLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDNUI7WUFDRCxhQUFhLENBQUMsSUFBSSxDQUFDO2dCQUNmLFVBQVUsRUFBRSxFQUFFO2dCQUNkLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDNUIsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQzlCLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUk7Z0JBQ2hDLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUSxHQUFDLEdBQUcsR0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO2dCQUM5RCxTQUFTLEVBQUUsRUFBRTtnQkFDYixtQkFBbUIsRUFBRSxVQUFVLENBQUMsbUJBQW1CO2FBQ3RELENBQUMsQ0FBQztZQUNILE9BQU8sYUFBYSxDQUFDO1NBQ3hCO2FBQU07WUFDSCxJQUFJLElBQUksR0FBRyxJQUFtQixDQUFDO1lBQy9CLElBQUksYUFBYSxHQU9aLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSw4QkFBOEIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNoQiw2RkFBNkY7Z0JBRTdGLDZDQUE2QztnQkFDN0MsSUFBSSxRQUFNLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFFBQU0sRUFBRTtvQkFDVCxRQUFNLEdBQUcscUJBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFnQixDQUFDO2lCQUN6RDtnQkFDRCxPQUFPLFFBQU0sSUFBSSxRQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtvQkFDcEMsUUFBTSxHQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBZ0IsQ0FBQztpQkFDekQ7Z0JBQ0QsSUFBSSxlQUFlLEdBQUcsUUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsSUFBSSxVQUFVLEdBQUcsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdEYsSUFBSSxFQUFFLEVBQUU7b0JBQ1IsUUFBUSxFQUFFLEVBQUU7b0JBQ1osU0FBUyxFQUFFLEVBQUU7b0JBQ2IsbUJBQW1CLEVBQUUsSUFBSTtpQkFDNUIsQ0FBQztnQkFDRixPQUFPLFVBQVUsQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO29CQUM3QixRQUFNLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxRQUFNLENBQUMsSUFBSSxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxRQUFNLENBQWdCLENBQUM7b0JBQzdGLGVBQWUsR0FBRyxRQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUM5RCxVQUFVLEdBQUcsZUFBZSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzFEO2dCQUVELHdCQUF3QjtnQkFDeEIsSUFBSSxRQUFRLEdBYVI7b0JBQ0EsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUMsRUFBRTtvQkFDOUQsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDOUIsSUFBSSxFQUFFLElBQUk7b0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSTtvQkFDaEMsUUFBUSxFQUFFLEVBQUU7b0JBQ1osU0FBUyxFQUFFLEVBQUU7b0JBQ2IsbUJBQW1CLEVBQUUsSUFBSTtpQkFDNUI7Z0JBRUQseURBQXlEO2dCQUN6RCxJQUFJLHVCQUF1QixHQUFHLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDO2dCQUM5RCxJQUFJLHVCQUF1QixFQUFFO29CQUN6QixRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztpQkFDeEI7cUJBQU07b0JBQ0gsUUFBUSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxtQkFBbUI7MkJBQ3RELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN4RDtnQkFFRCxnQkFBZ0I7Z0JBQ2hCLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7b0JBQ3hCLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNyRixRQUFRLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEdBQUMsR0FBRyxHQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUMsR0FBRyxHQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFDLEdBQUcsQ0FBQztpQkFDekc7cUJBQU07b0JBQ0gsUUFBUSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO2lCQUMzQztnQkFFRCxnQkFBZ0I7Z0JBQ2hCLGFBQWEsR0FBRyxFQUFFO2dCQUNsQixLQUFtQixVQUFlLEVBQWYsbUNBQWUsRUFBZiw2QkFBZSxFQUFmLElBQWUsRUFBRTtvQkFBL0IsSUFBTSxJQUFJO29CQUNYLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzVCO2dCQUNELGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdCLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSw4QkFBOEIsRUFBRSxhQUFhLENBQUMsQ0FBQzthQUMzRTtZQUNELE9BQU8sYUFBYSxDQUFDO1NBQ3hCO0lBQ0wsQ0FBQztJQUVELDBCQUFLLEdBQUwsVUFBTSxJQUFVO1FBQ1osVUFBVSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQztnQkFDbEIsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osU0FBUyxFQUFFLEVBQUU7YUFDaEIsQ0FBQyxDQUFDO1FBQ0gsMEJBQTBCO1FBQzFCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLElBQUksQ0FBQztRQUNULE9BQU8sSUFBSSxHQUFHLHFCQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDbkI7UUFBQSxDQUFDO1FBQ0YsMkRBQTJEO1FBQzNELElBQUksVUFBVSxHQUFHLElBQUksdUJBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzNELEdBQUc7WUFDQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxQztTQUNKLFFBQVEsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFO0lBQ3BDLENBQUM7SUFFRCw4QkFBUyxHQUFULFVBQVUsSUFBVTtRQUNoQixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEI7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztRQUN4QixLQUFLLElBQUksR0FBRyxHQUFDLENBQUMsRUFBRSxHQUFHLEdBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRTtZQUNyRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7Z0JBQy9FLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0g7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxrQ0FBYSxHQUFiLFVBQWMsSUFBVTtRQUNwQiwrQ0FBK0M7UUFDL0MsSUFBSSxhQUFhLEdBQUcsRUFBRTtRQUN0QiwwQkFBMEI7UUFDMUIsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtZQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNyQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7SUFDMUMsQ0FBQztJQUVELCtCQUFVLEdBQVYsVUFBVyxJQUFVO1FBQ2pCLElBQUksTUFBTSxHQUFrQixFQUFFLENBQUM7UUFDL0IsS0FBa0IsVUFBcUIsRUFBckIsU0FBSSxDQUFDLGdCQUFnQixFQUFyQixjQUFxQixFQUFyQixJQUFxQixFQUFFO1lBQXBDLElBQU0sR0FBRztZQUNWLHlCQUF5QjtZQUN6QixtQkFBbUI7WUFDbkIsZ0RBQWdEO1lBQ2hELGtDQUFrQztZQUNsQyx1QkFBdUI7WUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQjtRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQy9ELElBQUksUUFBTSxHQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFNLENBQUMsQ0FBQyxDQUFDLHFCQUFTLENBQUMsUUFBUSxDQUFDLFFBQXFCLEVBQUUseUJBQXlCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNsSDtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFvSEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BME5FO0lBQ047Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQXFCTztJQUVXLHFCQUFVLEdBQXhCLFVBQXlCLElBQVc7UUFDaEMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxvQkFBb0IsRUFBRTtZQUMxQyxPQUFPLE1BQU0sQ0FBQztTQUNqQjthQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCLEVBQUU7WUFDcEQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELElBQU0sSUFBSSxHQUFHLElBQWUsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHVCQUF1QixFQUFFO1lBQ3RELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCwySkFBMko7UUFDM0osOENBQThDO1FBQzlDLGtFQUFrRTtRQUVsRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzFFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0MsSUFBSSxPQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixLQUFtQixVQUFLLEVBQUwsaUJBQUssRUFBTCxtQkFBSyxFQUFMLElBQUssRUFBRTtnQkFBckIsSUFBTSxNQUFJO2dCQUNYLElBQUksTUFBSSxLQUFLLGNBQWMsSUFBSSxNQUFJLEtBQUssTUFBTSxFQUFFO29CQUM1QyxxRUFBcUU7b0JBQ3JFLElBQUksQ0FBQyx1QkFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDL0IsT0FBTyxJQUFJLENBQUM7cUJBQ2Y7aUJBQ0o7cUJBQU0sSUFBSSxNQUFJLElBQUksaUNBQWUsQ0FBQyxjQUFjLEVBQUU7b0JBQy9DLE9BQU8sTUFBSSxDQUFDO2lCQUNmO2FBQ0o7U0FDSjtRQUNELHVDQUF1QztRQUN2QyxJQUFNLEtBQUssR0FBRyxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QywrSEFBK0g7UUFDL0gsSUFBTSxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELE9BQU8sSUFBSSxLQUFLLGNBQWMsSUFBSSxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNoRSx3Q0FBd0M7SUFFNUMsQ0FBQztJQXhZRCw0RUFBNEU7SUFDNUUsbUJBQW1CO0lBQ25CLElBQUk7SUFFSix5RUFBeUU7SUFDM0QsbUNBQXdCLEdBQStEO1FBQ2pHLFFBQVEsRUFBRTtZQUNOLE1BQU0sRUFBRSxjQUFJLFlBQUksc0NBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsMENBQUUsSUFBSSxJQUFFLHdCQUF3QjtTQUMxRjtRQUNDLFVBQVUsRUFBRTtZQUNWLHdGQUF3RjtZQUN4Riw0Q0FBNEM7WUFDNUMsaUJBQWlCLEVBQUUsY0FBSTtnQkFDbkIsSUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3JCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGNBQWMsR0FBQyxFQUFFLEdBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3JFLE9BQU8sRUFBRSxHQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7MkJBQ2pDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDdkY7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztTQUNKO1FBQ0MsSUFBSSxFQUFFO1lBQ0osT0FBTyxFQUFFLEdBQUc7U0FDZjtRQUNDLElBQUksRUFBRTtZQUNKLE9BQU8sRUFBRSxHQUFHO1NBQ2Y7UUFDQyxJQUFJLEVBQUU7WUFDSixPQUFPLEVBQUUsR0FBRztTQUNmO1FBQ0MsSUFBSSxFQUFFO1lBQ0osT0FBTyxFQUFFLEdBQUc7U0FDZjtRQUNDLElBQUksRUFBRTtZQUNKLE9BQU8sRUFBRSxHQUFHO1NBQ2Y7UUFDQyxJQUFJLEVBQUU7WUFDSixPQUFPLEVBQUUsR0FBRztTQUNmO1FBQ0MsT0FBTyxFQUFFO1lBQ1Asc0ZBQXNGO1lBQ3RGLGdGQUFnRjtZQUNoRixzRkFBc0Y7WUFDdEYsYUFBYTtZQUNiLFNBQVMsRUFBRSxjQUFJO2dCQUNYLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksSUFBSSxLQUFLLFVBQVUsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFO29CQUN6QyxPQUFPLEVBQUUsR0FBRSxJQUF5QixDQUFDLE9BQU8sQ0FBQztpQkFDaEQ7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztZQUNELGlGQUFpRjtZQUNqRixnQ0FBZ0M7O1lBQzlCLFNBQVMsRUFBRSxjQUFJLElBQU0sT0FBTyxJQUFJLENBQUMsQ0FBQztBQUFtQyxDQUFDLENBQUM7WUFDekUseUVBQXlFO1lBQ3pFLGtDQUFrQzs7WUFDaEMsVUFBVSxFQUFFLGNBQUksSUFBTSxPQUFPLElBQUksQ0FBQyxDQUFDO0FBQW1DLENBQUMsQ0FBQztZQUMxRSxzRkFBc0Y7WUFDdEYseUZBQXlGO1lBQ3pGLDhCQUE4Qjs7WUFDNUIsTUFBTSxFQUFFLGNBQUksSUFBTSxPQUFPLElBQUksQ0FBQyxDQUFDO0FBQW1DLENBQUMsQ0FBQztTQUN6RTtRQUNDLFFBQVEsRUFBRTtZQUNSLGlCQUFpQixFQUFFLE9BQU87U0FDN0I7UUFDQyxJQUFJLEVBQUU7WUFDSixnREFBZ0Q7WUFDaEQsU0FBUyxFQUFFLGNBQUk7Z0JBQ1gsSUFBTSxNQUFNLEdBQUcsaUJBQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsTUFBTTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDekIsSUFBTSxHQUFHLEdBQUcscUJBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLCtCQUErQixFQUFFLGNBQU0sYUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUE3QixDQUE2QixDQUFDLENBQUM7Z0JBQ2hILElBQU0sUUFBUSxHQUFHLHFCQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxvQ0FBb0MsRUFBRSxjQUFNLGFBQU0sQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFoRCxDQUFnRCxDQUFDLENBQUM7Z0JBQzdJLE9BQU8sRUFBRSxHQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELGlEQUFpRDs7WUFDL0MsVUFBVSxFQUFFLGNBQUk7Z0JBQ2QsSUFBTSxNQUFNLEdBQUcsaUJBQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLE1BQU07b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ3pCLElBQU0sR0FBRyxHQUFHLHFCQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSwrQkFBK0IsRUFBRSxjQUFNLGFBQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBN0IsQ0FBNkIsQ0FBQyxDQUFDO2dCQUNoSCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ1osS0FBSyxJQUFJLEdBQUcsR0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUU7b0JBQ25DLElBQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDcEIsSUFBSSxpQkFBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsaUJBQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQ3pFLE9BQU8sRUFBRSxHQUFDLEdBQUcsQ0FBQztxQkFDakI7b0JBQ0QsRUFBRSxHQUFHLENBQUM7aUJBQ1Q7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztTQUNKO1FBQ0MsVUFBVSxFQUFFO1lBQ1Ysb0VBQW9FO1lBQ3BFLG9DQUFvQztZQUNwQyxTQUFTLEVBQUUsY0FBSSxJQUFJLFNBQUUsR0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQzttQkFDOUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxDQUFDLEVBRC9ELENBQytEO1NBQ3JGO1FBQ0MsUUFBUSxFQUFFO1lBQ1IsNkVBQTZFO1lBQzdFLFVBQVUsRUFBRSxjQUFJLElBQUksU0FBRSxHQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO21CQUNoRCxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUUsRUFBRSxDQUFDLENBQUMsRUFEaEUsQ0FDZ0U7U0FDdkY7UUFDQyxVQUFVLEVBQUU7WUFDVixVQUFVLEVBQUUsY0FBSSxJQUFJLFdBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxFQUEvQixDQUErQjtZQUNqRCxVQUFVLEVBQUUsY0FBSSxJQUFJLFVBQUcsRUFBSCxDQUFHO1lBQ3ZCLFVBQVUsRUFBRSxjQUFJLElBQUksV0FBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBMUIsQ0FBMEI7U0FDbkQ7S0FFSjtJQUNhLG1DQUF3QixHQUFnQztRQUNsRSxNQUFNLEVBQUUsY0FBSSxJQUFJLFdBQUksQ0FBQyxTQUFTLEVBQWQsQ0FBYztLQUNqQztJQUVjLDRCQUFpQixHQUFHLENBQUMsQ0FBQztJQXdSekMsaUJBQUM7Q0FBQSxDQTdyQitCLDJCQUFZLEdBNnJCM0M7QUE3ckJZLGdDQUFVOzs7Ozs7Ozs7Ozs7QUMvQnZCOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7OztBQUUvRSxzSUFBc0U7QUFDdEUsMEZBQTBDO0FBQzFDLDZGQUFnRDtBQUNoRCwyRkFBNkM7QUFFN0M7Ozs7R0FJRztBQUNIO0lBS0ksb0JBQVksT0FBYyxFQUFFLElBQWUsRUFBRSxJQUFZO1FBQ3JELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLE9BQU8sQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsSUFBSSxHQUFJLElBQUksQ0FBQyxJQUFpQixDQUFDLGVBQWU7U0FDdEQ7UUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztRQUNwQixrQ0FBa0M7UUFDbEMsMERBQTBEO1FBQzFELElBQUk7UUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELDJCQUFNLEdBQU47UUFDSSxJQUFLLElBQVksQ0FBQyxZQUFZO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDekIsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDMUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0Q7YUFBTTtZQUNILG1EQUFtRDtZQUNuRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQztTQUN4QztJQUNMLENBQUM7SUFFRCw2QkFBUSxHQUFSO1FBQ0ksSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLEdBQUc7WUFDQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLGtJQUFrSTtZQUNsSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDZixJQUFJLFVBQVUsR0FBSSxJQUFJLENBQUMsSUFBMEIsQ0FBQztnQkFDbEQsSUFBSSxXQUFXLEdBQUksSUFBSSxDQUFDLElBQW9CLENBQUM7Z0JBQzdDLElBQUksV0FBVyxHQUFJLElBQUksQ0FBQyxJQUF3QjtnQkFDaEQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCO3VCQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRO3VCQUM3QyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7dUJBQ2pDLFVBQVUsQ0FBQyxlQUFlO3VCQUMxQixVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFDakQ7b0JBQ0ksSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDN0IsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQztvQkFDdEQsSUFBSSxDQUFDLElBQVksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO2lCQUNsRDtxQkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUI7dUJBQ3BELGlCQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQzt1QkFDbEMsV0FBVyxDQUFDLFVBQVU7dUJBQ3RCLFdBQVcsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUN4QztvQkFDSSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztvQkFDL0MscUJBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQWtCLENBQUMsQ0FBQztpQkFDbEQ7cUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDO3VCQUM1QixXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU07dUJBQzdDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM3QztvQkFDSSxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUM7cUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLENBQUMsaUNBQWlDLENBQUM7dUJBQ3JILHFCQUFTLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNsRCxJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFTLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM3RDtxQkFBTTtvQkFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztpQkFDdkI7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDZixPQUFPLEtBQUssQ0FBQztpQkFDaEI7cUJBQU0sSUFBSyxJQUFJLENBQUMsSUFBWSxDQUFDLFNBQVMsRUFBRTtvQkFDckMsSUFBSSxTQUFTLEdBQUksSUFBSSxDQUFDLElBQVksQ0FBQyxTQUFTLENBQUM7b0JBQzdDLElBQUksYUFBYSxHQUFJLElBQUksQ0FBQyxJQUFZLENBQUMsU0FBUyxHQUFDLENBQUMsQ0FBQztvQkFDbkQsdUNBQXVDO29CQUN2Qyx1Q0FBdUM7b0JBQ3ZDLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLEVBQUU7d0JBQ2xELElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUNyRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztxQkFDeEI7eUJBQU07d0JBQ0gsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7d0JBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO3FCQUN2QjtpQkFDSjtxQkFBTSxJQUFLLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxFQUFFO29CQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFJLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxDQUFDO29CQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztpQkFDdkI7cUJBQU0sSUFBSSxxQkFBUyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDdkQsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBUyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDM0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQ3JCLFNBQVMsR0FBRyxJQUFJLENBQUM7aUJBQ3BCO3FCQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQzdCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQTBCLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFO3dCQUN4RyxJQUFJLE1BQU0sR0FBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQTBCLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDMUYsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsSUFBb0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQzVFLElBQUksQ0FBQyxJQUFJLEdBQUcsdUJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUMvRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzt5QkFDeEI7NkJBQU07NEJBQ0gsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBRSxJQUFJLENBQUMsSUFBb0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs0QkFDeEUsSUFBSSxHQUFHLEtBQUssTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0NBQzNCLFdBQVc7Z0NBQ1gsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQ0FDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7NkJBQ3ZCO2lDQUFNO2dDQUNILFlBQVk7Z0NBQ1osSUFBSSxDQUFDLElBQUksR0FBRyx1QkFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNuRixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzs2QkFDeEI7eUJBQ0o7cUJBQ0o7b0JBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQ3ZCO3FCQUFNO29CQUNILE9BQU8sS0FBSyxDQUFDO2lCQUNoQjthQUNKO1NBQ0osUUFDRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLG9CQUFvQixDQUFDO2VBQzdILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFLLElBQUksQ0FBQyxJQUFnQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxLQUFLLENBQUM7ZUFDdkYsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBbUIsQ0FBQyxDQUFDLEVBQ3JHO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELDZCQUFRLEdBQVI7UUFDSSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdEIsR0FBRztZQUNDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNkLElBQUksVUFBVSxHQUFJLElBQUksQ0FBQyxJQUEwQixDQUFDO2dCQUNsRCxJQUFJLFdBQVcsR0FBSSxJQUFJLENBQUMsSUFBb0IsQ0FBQztnQkFDN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCO3VCQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRO3VCQUM3QyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7dUJBQ2pDLFVBQVUsQ0FBQyxlQUFlO3VCQUMxQixVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFDakQ7b0JBQ0ksSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDN0IsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQztvQkFDdEQsSUFBSSxDQUFDLElBQVksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO2lCQUNsRDtxQkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUI7dUJBQ3BELGlCQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQzt1QkFDbEMsV0FBVyxDQUFDLFVBQVU7dUJBQ3RCLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUN2QztvQkFDSSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztvQkFDL0MscUJBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQWtCLENBQUMsQ0FBQztpQkFDbEQ7cUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLENBQUM7dUJBQ25GLHFCQUFTLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNqRCxJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFTLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM1RDtxQkFBTTtvQkFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztpQkFDeEI7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDZixPQUFPLEtBQUssQ0FBQztpQkFDaEI7cUJBQU0sSUFBSSxxQkFBUyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDM0QsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBUyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDL0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQ3ZCO3FCQUFNLElBQUssSUFBSSxDQUFDLElBQVksQ0FBQyxZQUFZLEVBQUU7b0JBQ3hDLElBQUksQ0FBQyxJQUFJLEdBQUksSUFBSSxDQUFDLElBQVksQ0FBQyxZQUFZLENBQUM7b0JBQzVDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO29CQUNyQixTQUFTLEdBQUcsSUFBSSxDQUFDO2lCQUNwQjtxQkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUM3QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxVQUEwQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBRTt3QkFDeEcsSUFBSSxNQUFNLEdBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUEwQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzFGLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLElBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUM1RSxJQUFJLENBQUMsSUFBSSxHQUFHLHVCQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDL0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7eUJBQ3hCOzZCQUFNOzRCQUNILElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUUsSUFBSSxDQUFDLElBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7NEJBQ3hFLElBQUksR0FBRyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dDQUMzQixXQUFXO2dDQUNYLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Z0NBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDOzZCQUN2QjtpQ0FBTTtnQ0FDSCxZQUFZO2dDQUNaLElBQUksQ0FBQyxJQUFJLEdBQUcsdUJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDbkYsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7NkJBQ3hCO3lCQUNKO3FCQUNKO29CQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2lCQUN4QjtxQkFBTTtvQkFDSCxPQUFPLEtBQUssQ0FBQztpQkFDaEI7YUFDSjtTQUNKLFFBQ0csQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDO2VBQzVFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFLLElBQUksQ0FBQyxJQUFnQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxLQUFLLENBQUM7ZUFDdkYsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBbUIsQ0FBQyxDQUFDLEVBQ3JHO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNMLGlCQUFDO0FBQUQsQ0FBQztBQXJNWSxnQ0FBVTs7Ozs7Ozs7Ozs7O0FDMUJ2Qjs7Ozs7Ozs7Ozs7Ozs7K0VBYytFOzs7QUFJL0U7SUFBQTtJQTZCQSxDQUFDO0lBNUJpQixnQ0FBbUIsR0FBakMsVUFBa0MsZ0JBQXNDO1FBQ3BFLElBQUksZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFO1lBQzFDLDZDQUE2QztZQUM3QyxLQUFLLElBQUksR0FBRyxHQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUU7Z0JBQ3pELElBQU0sSUFBSSxHQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFvQixDQUFDO2dCQUM3RCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQzt1QkFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRO3VCQUN4QyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssY0FBYyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssTUFBTSxDQUFDLEVBQ3BHO29CQUNJLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2FBQ0o7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFYSxvQkFBTyxHQUFyQixVQUFzQixnQkFBc0M7UUFDeEQsSUFBSSxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUU7WUFDMUMsNkNBQTZDO1lBQzdDLEtBQUssSUFBSSxHQUFHLEdBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtnQkFDekQsSUFBTSxJQUFJLEdBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQW9CLENBQUM7Z0JBQzdELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRLEVBQUU7b0JBQ2pFLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2FBQ0o7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDTCxtQkFBQztBQUFELENBQUM7QUE3Qlksb0NBQVk7Ozs7Ozs7Ozs7OztBQ2xCekI7Ozs7Ozs7Ozs7Ozs7OytFQWMrRTs7O0FBSS9FO0lBQUE7SUF3QkEsQ0FBQztJQXZCaUIsNkJBQWdCLEdBQTlCLFVBQStCLElBQVU7UUFDckMsSUFBSSxDQUFDLEdBQVUsSUFBSSxDQUFDO1FBQ3BCLE9BQU0sQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUM7WUFDckMsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLEVBQUUsRUFBRTtnQkFDbkIsT0FBTyxDQUFxQixDQUFDO2FBQ2hDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUVhLG9CQUFPLEdBQXJCLFVBQXNCLElBQVUsRUFBRSxFQUFVO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRWEsd0JBQVcsR0FBekIsVUFBMEIsV0FBaUMsRUFBRSxRQUFnQjtRQUN6RSxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQUksSUFBSSxXQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBdEIsQ0FBc0IsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7SUFDekQsQ0FBQztJQUVhLGdDQUFtQixHQUFqQyxVQUFrQyxXQUFpQyxFQUFFLElBQVk7UUFDN0UsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFJLElBQUksV0FBSSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQWxCLENBQWtCLENBQUMsQ0FBQztRQUNyRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO0lBQ3pELENBQUM7SUFDTCxtQkFBQztBQUFELENBQUM7QUF4Qlksb0NBQVk7Ozs7Ozs7Ozs7OztBQ2xCekI7Ozs7Ozs7Ozs7Ozs7OytFQWMrRTs7O0FBRS9FLDBGQUEwRjtBQUMxRixJQUFNLGlCQUFpQixHQUFHO0lBQzFCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzdtRyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFILENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM3aUUsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM1ekQsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDenhCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDM2pCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeGtFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ25xQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2xsQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzNUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDempFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN2MUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzK0YsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9pQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9uRSxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDblcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzOUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDN3BHLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4cUcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4eUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbmpCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2gzQyxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbjVELENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzE4QyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0NBQzdtQyxDQUFDO0FBR0Y7SUFBQTtJQXFDQSxDQUFDO0lBbkNHLHdEQUF3RDtJQUMxQyxnQkFBTyxHQUFyQixVQUFzQixPQUFlO1FBQ2pD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SSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7bUJBQ2xLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7bUJBQzNJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7dUJBQ3JJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0NBRXRLLHlCQUFhLEVBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2FBRXpGO2lCQUFNLEVBQUUsb0VBQW9FO2dCQUN6RSxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNkLDhEQUE4RDtnQkFDOUQsSUFBSSxNQUFNLENBQUMsS0FBSyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDNUosSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFFOU4sbUVBQW1FO2dCQUNuRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuSyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUV6TixJQUFJLElBQUksR0FBRyxJQUFJLEVBQUU7b0JBQ2IsSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDWixTQUFTLEdBQUcsSUFBSSxDQUFDO2lCQUNwQjtnQkFDRCxJQUFJLElBQUksR0FBRyxJQUFJLEVBQUU7b0JBQ2IsSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDWixTQUFTLEdBQUcsSUFBSSxDQUFDO2lCQUNwQjthQUNKO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7UUFyRnZCLEtBQUssSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtrQ0FBaEMsQ0FBQzs7O1NBc0ZUO1FBRUQsbUVBQW1FO1FBQ25FLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUU7WUFDbkYsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJO2dCQUN0RSxPQUFPLG9CQUFRLEVBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkYsT0FBTyxvQkFBUSxFQUFDLG1CQUFtQixFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3RGOztZQUNHLE9BQU8sb0JBQVEsRUFBQyxjQUFjLENBQUMsQ0FBQztJQUN4QyxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQzNPTDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQWtHO0FBQ2xHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELGlHQUFtRDtBQUNuRCx1RkFBMEM7QUFDMUMsdUZBQTBDO0FBRTdCLDBCQUFrQixHQUFTO0lBQ3BDLEVBQUUsRUFBRSxvQkFBb0I7SUFDeEIsT0FBTyxFQUFFLHdCQUF3QjtJQUNqQyxRQUFRLEVBQUU7UUFDTiwyQkFBMkIsRUFBRTtZQUN6QixvQkFBb0I7WUFDcEIsYUFBYSxFQUFFLG1CQUFtQjtTQUFDO0tBQzFDO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wscUNBQXFDO1lBQ3JDLG1CQUFtQixFQUFFLHlCQUF5QjtZQUM5QyxPQUFPLEVBQUUseUJBQXlCO1NBQ3JDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCx5REFBeUQ7WUFDekQsbUJBQW1CLEVBQUUsaUdBQWlHO1lBQ3RILE9BQU8sRUFBRSxtREFBbUQ7U0FDL0Q7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQW1CLENBQUM7UUFDdkQscURBQXFEO1FBQ3JELElBQUksdUJBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7WUFDN0UsT0FBTyxJQUFJLENBQUM7UUFFaEIsaUVBQWlFO1FBQ2pFLElBQUksdUJBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksdUJBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxJQUFJO1lBQ2xILE9BQU8sSUFBSSxDQUFDO1FBRWhCLElBQU0sY0FBYyxHQUFHO1lBQ25CLFFBQVEsRUFBRTtnQkFDTixLQUFLLEVBQUUsRUFBRTtnQkFDVCxJQUFJLEVBQUUsU0FBUzthQUNsQjtTQUNKO1FBRUQsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksSUFBSSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEUsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ2QsSUFBSSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUMsSUFBSSxTQUFTO2dCQUFFLFFBQVEsR0FBRyxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN0RjtRQUNELElBQUksUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzdDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFDM0IsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksRUFBRSxHQUFHLElBQUkscUJBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUFBLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsRCxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsT0FBTyxDQUFDLE1BQU07WUFDVixFQUFFLENBQUMsUUFBUSxFQUFFO1lBQ2IsRUFBRSxDQUFDLElBQUksS0FBSyxXQUFXO1lBQ3ZCLEVBQUUsQ0FBQyxJQUFJLEtBQUsscUJBQVMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO1lBQzdDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLHFCQUFxQjtTQUN2RjtZQUNJLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksdUJBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDO2dCQUN4RSxTQUFTO1lBRWIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hCLGlCQUFpQjtnQkFDakIsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO29CQUM5RCxvRkFBb0Y7b0JBQ3BGLElBQUksS0FBSyxHQUFHLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3BELElBQUksS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRzsyQkFDcEUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQzsyQkFDN0QsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFJLFFBQVEsQ0FBQyxDQUFDLEVBQUU7d0JBQ2hJLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUV2QyxJQUFJLEVBQUUsR0FBRyx1QkFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDdkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFOzRCQUNSLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQ3RCLGNBQWMsR0FBRyxJQUFJLENBQUM7NEJBQ3RCLFNBQVMsSUFBSSxFQUFFLENBQUM7eUJBQ25CO3dCQUNELE1BQU0sR0FBRyxTQUFTLEdBQUcsUUFBUSxDQUFDO3dCQUM5Qix5Q0FBeUM7d0JBQ3pDLEVBQUUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO3FCQUNyQjt5QkFBTTt3QkFDSCxnQ0FBZ0M7d0JBQ2hDLE1BQU0sR0FBRyxJQUFJLENBQUM7cUJBQ2pCO2lCQUNKO2FBQ0o7aUJBQU0sSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7Z0JBQy9CLG9CQUFvQjtnQkFDcEIsSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFO29CQUM5RSw2RkFBNkY7b0JBQzdGLElBQUksT0FBTyxHQUFHLHVCQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFL0MsSUFBSSxFQUFFLEdBQUcsdUJBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3ZDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRTt3QkFDUixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUN0QixjQUFjLEdBQUcsSUFBSSxDQUFDO3dCQUN0QixTQUFTLElBQUksRUFBRSxDQUFDO3FCQUNuQjtvQkFDRCxNQUFNLEdBQUcsU0FBUyxHQUFHLFFBQVEsQ0FBQztvQkFDOUIseUNBQXlDO29CQUN6QyxFQUFFLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztpQkFDckI7cUJBQU07b0JBQ0gsZ0ZBQWdGO29CQUNoRixrREFBa0Q7b0JBQ2xELElBQUksSUFBSSxHQUFHLG1CQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxJQUFtQixDQUFDLENBQUM7b0JBQzVELE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDO2lCQUN0SDthQUNKO1NBQ0o7UUFDRCxJQUFJLFNBQVMsSUFBSSxDQUFDO1lBQUUsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQywyREFBMkQ7UUFDM0QsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFbEUsSUFBSSxNQUFNLEVBQUU7WUFDUixPQUFPLElBQUksQ0FBQztTQUNmO2FBQU07WUFDSCxPQUFPLHlCQUFhLEVBQUMsbUJBQW1CLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsRTtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDbEpEOzs7Ozs7Ozs7OzsrRUFXK0U7OztBQUcvRSxnR0FBZ0Q7QUFDaEQsdUZBQTBDO0FBQzFDLDZGQUE4QztBQUM5QywrRUFBc0g7QUFDdEgsK0VBQTBEO0FBRTFELHVGQUEwQztBQUU3QixnQ0FBd0IsR0FBUztJQUMxQyxFQUFFLEVBQUUsMEJBQTBCO0lBQzlCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFFBQVEsRUFBRTtRQUNOLDZCQUE2QixFQUFFO1lBQzNCLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLGFBQWEsRUFBRSxzQkFBc0I7U0FDeEM7UUFDRCxnQ0FBZ0MsRUFBRTtZQUM5QixRQUFRLEVBQUUsTUFBTTtZQUNoQixhQUFhLEVBQUUsOEJBQThCO1NBQ2hEO0tBQ0o7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsK0JBQStCO1lBQ3hDLE1BQU0sRUFBRSwrQkFBK0I7WUFDdkMsZUFBZSxFQUFFLCtCQUErQjtZQUNoRCxzQkFBc0IsRUFBRSwrQkFBK0I7WUFDdkQsOEJBQThCLEVBQUUsK0JBQStCO1lBQy9ELHVCQUF1QixFQUFFLCtCQUErQjtTQUMzRDtLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLCtFQUErRTtZQUN4RixNQUFNLEVBQUUsMkVBQTJFO1lBQ25GLGVBQWUsRUFBRSxpSUFBaUk7WUFDbEosc0JBQXNCLEVBQUUsNElBQTRJO1lBQ3BLLDhCQUE4QixFQUFFLHFMQUFxTDtZQUNyTix1QkFBdUIsRUFBRSxtSUFBbUk7U0FDL0o7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsRUFBRSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDdkYsR0FBRyxFQUFFLE9BQU87WUFDWixLQUFLLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzVCLFlBQVksRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDeEMsQ0FBQztJQUNGLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUNmLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBbUIsQ0FBQztRQUN2RCxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xELGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsaUJBQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO1lBQ25DLENBQUMsaUJBQU8sQ0FBQyx1QkFBdUIsSUFBSSxJQUFJO2dCQUNwQyxpQkFBTyxDQUFDLHVCQUF1QixJQUFJLFNBQVM7Z0JBQzVDLGlCQUFPLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDN0QsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELG1FQUFtRTtRQUNuRSx1QkFBdUI7UUFDdkIsSUFBSSx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUM7UUFFaEIsZUFBZTtRQUNmLElBQUksdUJBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdkUsT0FBTyxJQUFJLENBQUM7UUFFaEIsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUNwQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ04sT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUM7UUFDMUIsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNOLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCwwREFBMEQ7UUFDMUQsSUFBSSxRQUFRLEdBQUcsdUJBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLHVCQUFVLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyx1QkFBVSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLHVCQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUN4SixJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQztnQkFDM0IsT0FBTyxJQUFJLENBQUM7WUFFaEIsZ0VBQWdFO1lBQ2hFOzs7OztjQUtFO1lBQ0YsNEhBQTRIO1lBQzVILElBQUksS0FBSyxHQUFHLDJJQUEySSxDQUFDO1lBQ3hKLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM5QyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDNUIsT0FBTyxJQUFJLENBQUM7U0FDbkI7UUFFRCxJQUFJLElBQUksR0FBRyxXQUFXLENBQUM7UUFDdkIsNkhBQTZIO1FBQzdILDhJQUE4STtRQUM5SSxJQUFJLHVCQUFVLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDN0MsdUNBQXVDO1lBQ3ZDLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRTtnQkFDeEIsS0FBSyxJQUFJLElBQUksR0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDL0QsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFFLENBQUMsRUFBRTt3QkFDbEIsa0RBQWtEO3dCQUNsRCxJQUFJLEdBQUksSUFBYSxDQUFDLFlBQVksQ0FBQzt3QkFDbkMsTUFBTTtxQkFDVDtpQkFDSjthQUNKO1lBQ0QsSUFBSSxJQUFJLEtBQUssSUFBSTtnQkFBRSxPQUFPO1NBQzdCO1FBRUQsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZDLGlCQUFpQjtRQUNqQixpR0FBaUc7UUFDakcsK0dBQStHO1FBQy9HLHdCQUF3QjtRQUN4Qiw0REFBNEQ7UUFDNUQsZ0RBQWdEO1FBQ2hELGdGQUFnRjtRQUNoRixpRUFBaUU7UUFDakUscUZBQXFGO1FBQ3JGLG1GQUFtRjtRQUNuRixnRUFBZ0U7UUFDaEUsZ0VBQWdFO1FBQ2hFLGlFQUFpRTtRQUNqRSx1QkFBdUI7UUFDdkIsb0JBQW9CO1FBQ3BCLHNCQUFzQjtRQUN0QixpREFBaUQ7UUFDakQsZ0dBQWdHO1FBQ2hHLDJCQUEyQjtRQUMzQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEdBQUc7WUFDbkIsS0FBSyxDQUFDLE1BQU0sS0FBSyxHQUFHO1lBQ3BCLEtBQUssQ0FBQyxPQUFPLEtBQUssR0FBRztZQUNyQixLQUFLLENBQUMsT0FBTyxLQUFLLE1BQU07WUFDeEIsS0FBSyxDQUFDLFVBQVUsS0FBSyxRQUFRO1lBQzdCLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUTtZQUMzQiw4Q0FBOEM7WUFDOUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxVQUFVLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDaEgsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNmLHFDQUFxQztZQUNyQyx1REFBdUQ7U0FDMUQ7YUFBTTtZQUNILE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDaEIsc0NBQXNDO1NBQ3pDO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxFQUFFO1lBQ25CLDhDQUE4QztZQUM5QyxPQUFPLElBQUksQ0FBQztTQUNmO1FBR0QsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUN2QixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDN0IsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDO2dCQUM3QixJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3hDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN0QyxpREFBaUQ7b0JBQ2pELFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2hDO2dCQUFBLENBQUM7YUFDTDtZQUNELDJDQUEyQztZQUMzQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckcsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDckM7UUFFRCxzQkFBc0I7UUFDdEIsK0VBQStFO1FBQy9FLG9GQUFvRjtRQUNwRix3REFBd0Q7UUFDeEQsdUZBQXVGO1FBQ3ZGLHNGQUFzRjtRQUN0RixpQ0FBaUM7UUFDakMsNEZBQTRGO1FBQzVGLHFDQUFxQztRQUNyQywrQ0FBK0M7UUFDL0MsUUFBUTtRQUNSLDBGQUEwRjtRQUMxRiw4RUFBOEU7UUFDOUUsZ0hBQWdIO1FBQ2hILDZGQUE2RjtRQUM3RiwySUFBMkk7UUFDM0ksUUFBUTtRQUNSLHdGQUF3RjtRQUN4RixHQUFHO1FBRUgsOEJBQThCO1FBQzlCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLG1DQUFtQztRQUNuQyx1REFBdUQ7UUFDdkQsMkVBQTJFO1FBQzNFLGtEQUFrRDtRQUNsRCwwQ0FBMEM7UUFDMUMsd0NBQXdDO1FBQ3hDLDZCQUE2QjtRQUM3QixpREFBaUQ7UUFDakQsNENBQTRDO1FBQzVDLGdEQUFnRDtRQUNoRCx5REFBeUQ7UUFDekQsd0NBQXdDO1FBQ3hDLFdBQVc7UUFDWCxRQUFRO1FBQ1IsK0NBQStDO1FBQy9DLDRHQUE0RztRQUM1Ryx5Q0FBeUM7UUFDekMsSUFBSTtRQUNKLG9EQUFvRDtRQUVwRCxvSEFBb0g7UUFDcEgsbURBQW1EO1FBQ25ELElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxVQUFVLElBQUksVUFBVSxHQUFHLENBQUMsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDdEUsZ0VBQWdFO1lBQ2hFLG9FQUFvRTtZQUNwRSxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsMkNBQTJDO1FBQzNDLElBQUksVUFBVSxHQUFHLHFCQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtZQUNyQix5RUFBeUU7WUFDekUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkUsT0FBTztTQUNWO1FBQ0QsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN2QixJQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakMsSUFBSSxNQUFNLEdBQUcsaUJBQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksSUFBSSxHQUFHLGlCQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekQsSUFBSSxZQUFZLEdBQUcsSUFBSSxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUM7UUFFL0QsSUFBSSxpQkFBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMvQixtRUFBbUU7WUFDbkUsa0VBQWtFO1lBQ2xFLFlBQVksR0FBRyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQztTQUM5RDtRQUNELElBQUksTUFBTSxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDO1FBQzFELElBQUksYUFBYSxHQUFHLFVBQVUsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUNwRSxJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1FBQ3ZDLElBQUksVUFBVSxHQUFHLHVCQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDYixJQUFJLE9BQU8sR0FBRyx1QkFBVSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pELElBQUksT0FBTyxFQUFFO2dCQUNULFVBQVUsR0FBRyx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNuRDtTQUNKO1FBRUQsSUFBSSxDQUFDLFVBQVUsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLHVCQUFVLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDM0YsVUFBVSxHQUFHLElBQUksQ0FBQztTQUNyQjtRQUVELElBQUksQ0FBQyxVQUFVLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSx1QkFBVSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hHLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDckI7UUFFRDs7Ozs7OzthQU9LO1FBRUwsd0ZBQXdGO1FBQ3hGLElBQUksQ0FBQyxNQUFNLElBQUksVUFBVSxFQUFFO1lBQ3ZCLE1BQU0sR0FBRyxJQUFJLENBQUM7U0FDakI7UUFDRCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsSUFBSSxhQUFhLEVBQUU7Z0JBQ2YscUlBQXFJO2dCQUNySSxPQUFPLHlCQUFhLEVBQUMsOEJBQThCLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUFBO0FBQUM7YUFDM0Y7aUJBQU0sSUFBSSxVQUFVLEVBQUU7Z0JBQ25CLGtHQUFrRztnQkFDbEcsT0FBTyx5QkFBYSxFQUFDLHVCQUF1QixFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFBQTtBQUFDO2FBQ3BGO2lCQUFNO2dCQUNILElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDM0IsT0FBTyx5QkFBYSxFQUFDLHNCQUFzQixFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztpQkFDeko7cUJBQU07b0JBQ0gsT0FBTyxvQkFBUSxFQUFDLGVBQWUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7aUJBQzdJO2FBQ0o7U0FDSjthQUFNO1lBQ0gsT0FBTyxvQkFBUSxFQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDcEk7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3hURDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQTRHO0FBQzVHLCtFQUEwRDtBQUMxRCxnR0FBZ0Q7QUFDaEQsdUZBQTBDO0FBRTdCLDZCQUFxQixHQUFTO0lBQ3ZDLEVBQUUsRUFBRSx1QkFBdUI7SUFDM0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLDRCQUE0QjtZQUN0QyxhQUFhLEVBQUUsNEJBQTRCO1lBQzNDLE9BQU8sRUFBRSw0QkFBNEI7U0FDeEM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLGFBQWEsRUFBRSxxRkFBcUY7WUFDcEcsT0FBTyxFQUFFLCtEQUErRDtTQUMzRTtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELHlDQUF5QztRQUN6QyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO1lBQUcsT0FBTyxJQUFJLENBQUM7UUFDdEQsa0RBQWtEO1FBQ2xELElBQUksdUJBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFeEUsSUFBTSxjQUFjLEdBQUc7WUFDbkIsUUFBUSxFQUFFO2dCQUNOLEtBQUssRUFBRSxDQUFDO2dCQUNSLElBQUksRUFBRSxTQUFTO2FBQ2xCO1NBQ0o7UUFDRCxJQUFJLFFBQVEsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUU3QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFVBQWtCLENBQUM7UUFDOUMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLDBEQUEwRDtRQUMxRCxJQUFNLE9BQU8sR0FBRyxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0RixPQUFPLE1BQU0sSUFBSSxRQUFRLEVBQUU7WUFDdkIsMkdBQTJHO1lBQzNHLHNIQUFzSDtZQUN0SCwyR0FBMkc7WUFDM0csMEZBQTBGO1lBQzFGLDRIQUE0SDtZQUM1SCxNQUFNO1lBQ04sSUFBSSxRQUFRLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRTtnQkFDL0IsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztnQkFDaEMsNENBQTRDO2dCQUU1QyxzQkFBc0I7Z0JBQ3RCLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDNUMsb0VBQW9FO2dCQUNwRSw4QkFBOEI7Z0JBQzlCLDBFQUEwRTtnQkFDMUUsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLElBQUksQ0FBQztvQkFDM0MsdUJBQVUsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtvQkFDcEQsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO3dCQUNuQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDOzRCQUMvQyxNQUFNLEdBQUcsdUJBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO3FCQUM5RDtvQkFDRCxJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7d0JBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7NEJBQ2hELE1BQU0sR0FBRyx1QkFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7cUJBQy9EO29CQUVELHVDQUF1QztvQkFDdkMsbUVBQW1FO29CQUNuRSxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7d0JBQ3BCLFlBQVksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7cUJBQ3BGO3lCQUNJLElBQUksVUFBVSxLQUFLLElBQUksRUFBRTt3QkFDMUIsWUFBWSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztxQkFDbkY7eUJBQ0k7d0JBQ0QsWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7cUJBQ3RHO2lCQUNKO2FBQ0o7WUFDRCxRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztTQUNuQztRQUVELDBHQUEwRztRQUMxRyxJQUFJLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUU7WUFDNUQsWUFBWSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDN0c7UUFFRCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQWEsRUFBQyxhQUFhLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDbEhEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBa0c7QUFDbEcsK0VBQTBEO0FBQzFELDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFDaEQsNkZBQThDO0FBQzlDLHVGQUEwQztBQUU3QiwyQkFBbUIsR0FBUztJQUNyQyxFQUFFLEVBQUUscUJBQXFCO0lBQ3pCLE9BQU8sRUFBRSwwQkFBMEI7SUFDbkMsUUFBUSxFQUFFO1FBQ04sMkJBQTJCLEVBQUU7WUFDekIsb0JBQW9CO1lBQ3BCLGFBQWEsRUFBRSxxQ0FBcUM7U0FBQztLQUM1RDtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLHNDQUFzQztZQUN0QyxvQkFBb0IsRUFBRSwwQkFBMEI7WUFDaEQsaUJBQWlCLEVBQUUsMEJBQTBCO1lBQzdDLE9BQU8sRUFBRSwwQkFBMEI7U0FDdEM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLGtHQUFrRztZQUNsRyxvQkFBb0IsRUFBRSw2R0FBNkc7WUFDbkksaUJBQWlCLEVBQUUsZ0ZBQWdGO1lBQ25HLE9BQU8sRUFBRSw0RkFBNEY7U0FDeEc7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCwyQ0FBMkM7UUFDM0MsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVsRCxxREFBcUQ7UUFDckQsSUFBSSxDQUFDLGlCQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLHVCQUFVLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLGlCQUFPLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNuSSxPQUFPLElBQUksQ0FBQztRQUVoQixpRUFBaUU7UUFDakUsSUFBSSx1QkFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLElBQUk7WUFDdEQsT0FBTyxJQUFJLENBQUM7UUFFaEIsc0RBQXNEO1FBQ3RELElBQUksdUJBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUk7WUFDdEUsT0FBTyxJQUFJLENBQUM7UUFFaEIsaUZBQWlGO1FBQ2pGLElBQU0sSUFBSSxHQUFHLG1CQUFRLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELElBQUksSUFBSSxFQUFFO1lBQ04sSUFBSSxPQUFPLEdBQUcsbUJBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNqQyxPQUFPLElBQUksQ0FBQztTQUNuQjtRQUVELG1GQUFtRjtRQUNuRixJQUFJLEtBQUssR0FBRyxtQkFBUSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzNFLDJCQUEyQjtRQUMzQix1QkFBVSxDQUFDLHlCQUF5QixDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlMLElBQUksbUJBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEtBQUssSUFBSTtZQUMxRCxPQUFPLElBQUksQ0FBQztRQUVoQixJQUFJLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsVUFBa0IsQ0FBQztRQUM5QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsT0FBTyxRQUFRLEVBQUU7WUFDYixxRkFBcUY7WUFDckYsb0RBQW9EO1lBQ3BELDBGQUEwRjtZQUMxRixJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO2dCQUMvQixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNwQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDZCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDeEQ7WUFDRCxRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztTQUNuQztRQUVELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbEIsbUVBQW1FO1lBQ3BFLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUUxQyxvQkFBb0IsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDMUYsaUJBQWlCLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZGO1FBRUQsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxvQkFBb0I7WUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLHlCQUFhLEVBQUMsb0JBQW9CLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRyxJQUFJLGlCQUFpQjtZQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMseUJBQWEsRUFBQyxpQkFBaUIsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLE9BQU8sR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ3hDLENBQUM7Q0FDSjtBQUVELElBQU0sY0FBYyxHQUFHO0lBQ25CLFlBQVksRUFBRTtRQUNWLEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLGFBQWE7WUFDMUQsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZUFBZTtZQUNsRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVE7WUFDbEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUTtTQUN2QztRQUNELElBQUksRUFBRSxVQUFVO0tBQ25CO0lBQ0QsU0FBUyxFQUFFO1FBQ1AsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVU7WUFDdkQsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU87WUFDbEUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUztTQUM1RTtRQUNELElBQUksRUFBRSxVQUFVO0tBQ25CO0lBQ0QsVUFBVSxFQUFFO1FBQ1IsS0FBSyxFQUFFLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxjQUFjO1lBQ2xFLGVBQWUsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUcsa0JBQWtCO1NBQ2hHO1FBQ0QsSUFBSSxFQUFFLFVBQVU7S0FDbkI7Q0FDSjtBQUVELFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJO0lBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDckMsSUFBSSxZQUFZLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksR0FBRyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzRSxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDdEIsSUFBSSxXQUFXLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUM3QyxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3pDLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0MsUUFBUSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO29CQUNqQyxRQUFRLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQztTQUNKO1FBQ0QscUJBQXFCO1FBQ3JCLFFBQVEsSUFBSSxHQUFHLENBQUM7UUFDaEIsWUFBWSxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxHQUFFLGlCQUFpQixFQUFFLFlBQVksQ0FBQyxDQUFDO0tBQ2xFO0lBQ0QsT0FBTyxZQUFZLENBQUM7QUFDeEIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTTtJQUN0QyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3ZCLElBQUksY0FBYyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLO0lBQy9DLElBQUksSUFBSSxHQUFHLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBRTNCLDhCQUE4QjtJQUM5QixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRSxJQUFJO1FBQ3ZELElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXRFLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQzlELElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFFdEQsSUFBSSxjQUFjLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNwRCxJQUFJLHFCQUFxQixHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXBFLHFFQUFxRTtZQUNyRSwyREFBMkQ7WUFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUFFLFNBQVM7YUFBRTtZQUV4QixpREFBaUQ7WUFDakQsMkRBQTJEO1lBQzNELElBQUksZUFBZSxHQUFHLENBQ2xCLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDO2dCQUMvQixDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDO2dCQUNsRSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDO2dCQUNsRSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDO2dCQUNsRSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDO2dCQUNsRSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksS0FBSyxDQUFDO2dCQUNuRSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUV4RSxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNQLElBQUksc0JBQXNCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELGVBQWUsR0FBRyxDQUFDLENBQUMsc0JBQXNCLElBQUksSUFBSSxDQUFDO29CQUMvQyxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQztvQkFDaEMsQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQztvQkFDcEUsQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQztvQkFDcEUsQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQztvQkFDcEUsQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQztvQkFDcEUsQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLEtBQUssQ0FBQztvQkFDckUsQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7YUFFN0U7WUFFRCxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUU7Z0JBQ3JHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7b0JBQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2lCQUNuQztnQkFDRCxPQUFPLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQzthQUNuQztTQUNKO1FBQ0QsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QixDQUFDOzs7Ozs7Ozs7Ozs7QUMxTkQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUFtSTtBQUNuSSxnR0FBZ0Q7QUFDaEQsdUZBQTBDO0FBQzFDLHVGQUEwQztBQUMxQyxpR0FBbUQ7QUFFbkQseUJBQXlCO0FBQ3pCLElBQU0saUJBQWlCLEdBQUcscUJBQXFCLENBQUM7QUFDaEQsSUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFDcEMsSUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUM7QUFDdEMsSUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFDbEMsSUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7QUFDdEMsSUFBTSx1QkFBdUIsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMscUNBQXFDO0FBRWxHOzs7Ozs7R0FNRztBQUNILFNBQVMscUJBQXFCLENBQUMsT0FBb0IsRUFBRSxRQUFnQixFQUFFLFlBQW9COztJQUN2RixJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN4RSxJQUFNLFFBQVEsR0FBRyxpQkFBTyxDQUFDLHFCQUFxQixDQUMxQyxPQUFPLENBQUMsYUFBYSxZQUNwQixHQUFDLFFBQVEsSUFBRyxDQUFDLEdBQUcsQ0FBQyxPQUNsQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FDdkIsQ0FBQztRQUNGLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtZQUNuQixPQUFPLGlCQUFPLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNuRTthQUFNLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6QyxPQUFPLFNBQVMsQ0FBQztTQUNwQjtLQUNKO0lBQ0QsT0FBTyxZQUFZLENBQUM7QUFDeEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLFVBQWtCO0lBQzdDLE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLG9CQUFvQixDQUN6QixPQUFvQixFQUNwQixRQUFnQixFQUNoQixVQUFrQixFQUNsQixRQUFnQixFQUNoQixRQUFnQixFQUNoQixhQUE4QjtJQUE5QixxREFBOEI7SUFFOUIsOEJBQThCO0lBQzlCLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxXQUFXLEVBQUU7UUFDN0QsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUVELDJCQUEyQjtJQUMzQixJQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVyRCwyREFBMkQ7SUFDM0QsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxRQUFRLEVBQUU7UUFDckQsT0FBTyxLQUFLLENBQUM7S0FDaEI7SUFFRCwwQkFBMEI7SUFDMUIsSUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ3JCLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFFRCx1QkFBdUI7SUFDdkIsSUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9ELElBQUksQ0FBQyxXQUFXLEVBQUU7UUFDZCxPQUFPLElBQUksQ0FBQztLQUNmO0lBRVEsU0FBSyxHQUFVLFdBQVcsR0FBckIsRUFBRSxJQUFJLEdBQUksV0FBVyxHQUFmLENBQWdCO0lBRXBDLGdEQUFnRDtJQUNoRCxJQUFJLElBQUksS0FBSyxFQUFFLEVBQUU7UUFDYixJQUFJLGFBQWEsRUFBRTtZQUNmLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDdEQ7UUFDRCwyREFBMkQ7UUFDM0QsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7S0FDSjtJQUVELDBEQUEwRDtJQUMxRCxJQUFJLElBQUksS0FBSyxFQUFFLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN4QyxPQUFPLElBQUksQ0FBQztLQUNmO0lBRUQsb0NBQW9DO0lBQ3BDLElBQU0sTUFBTSxHQUFHLGlCQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxHQUFHLFFBQVEsR0FBRyxRQUFRLEVBQUU7UUFDakQsT0FBTyxLQUFLLENBQUM7S0FDaEI7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRVksMEJBQWtCLEdBQVM7SUFDcEMsRUFBRSxFQUFFLG9CQUFvQjtJQUN4QixPQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUseUJBQXlCO1lBQ2pDLE9BQU8sRUFBRSx5QkFBeUI7WUFDbEMsMkJBQTJCLEVBQUUseUJBQXlCO1lBQ3RELHlCQUF5QixFQUFFLHlCQUF5QjtZQUNwRCx3QkFBd0IsRUFBRSx5QkFBeUI7U0FDdEQ7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLE1BQU0sRUFBRSw2RkFBNkY7WUFDckcsT0FBTyxFQUFFLG9HQUFvRztZQUM3RywyQkFBMkIsRUFBRSxvRUFBb0U7WUFDakcseUJBQXlCLEVBQUUsa0VBQWtFO1lBQzdGLHdCQUF3QixFQUFFLGlFQUFpRTtTQUM5RjtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDTixJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDakIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzdDLENBQUM7SUFDRixHQUFHLEVBQUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNsQyxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQW1CLENBQUM7UUFFdkQseURBQXlEO1FBQ3pELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO1FBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3hDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUUsRUFBRSxZQUFZO2dCQUM1QyxRQUFRLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzthQUN2QztTQUNKO1FBQ0QsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM5QixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsc0RBQXNEO1FBQ3RELElBQUksaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsSUFBSSx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNuRixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsOENBQThDO1FBQzlDLElBQU0sTUFBTSxHQUFjLElBQUkscUJBQVMsRUFBRSxDQUFDO1FBQzFDLElBQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNwRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQscUNBQXFDO1FBQ3JDLElBQUksdUJBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxvQ0FBb0M7UUFDcEMsSUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEQsSUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRXpFLGlFQUFpRTtRQUNqRSwrRkFBK0Y7UUFDL0YsSUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDM0UsSUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMvRSxJQUFNLGtCQUFrQixHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV6RSxpREFBaUQ7UUFDakQsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDL0IsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFFNUIsa0VBQWtFO1FBQ2xFLElBQUksbUJBQW1CLEVBQUU7WUFDckIsSUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDbkIsSUFBTSxVQUFVLEdBQUcsaUJBQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUN4RixJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxHQUFHLFFBQVEsR0FBRyxzQkFBc0IsRUFBRTtvQkFDdkUsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2lCQUM3QjthQUNKO1NBQ0o7UUFFRCxvRUFBb0U7UUFDcEUsSUFBSSxxQkFBcUIsRUFBRTtZQUN2QixJQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUNyQixJQUFNLFlBQVksR0FBRyxpQkFBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQzVGLElBQUksWUFBWSxLQUFLLElBQUksSUFBSSxZQUFZLEdBQUcsUUFBUSxHQUFHLHdCQUF3QixFQUFFO29CQUM3RSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7aUJBQy9CO2FBQ0o7U0FDSjtRQUVELG9CQUFvQjtRQUNwQixJQUFJLGtCQUFrQixFQUFFO1lBQ3BCLElBQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ25CLDJDQUEyQztnQkFDM0MsSUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQzFELElBQUksS0FBSyxFQUFFO29CQUNFLFNBQUssR0FBVSxLQUFLLEdBQWYsRUFBRSxJQUFJLEdBQUksS0FBSyxHQUFULENBQVU7b0JBQzlCLElBQUksSUFBSSxLQUFLLEVBQUUsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO3dCQUM5QixJQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUM7d0JBQzdFLElBQUksS0FBSyxHQUFHLHFCQUFxQixFQUFFOzRCQUMvQixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7eUJBQzVCO3FCQUNKO2lCQUNKO2FBQ0o7U0FDSjtRQUVELGdGQUFnRjtRQUNoRixJQUFJLGlCQUFpQixJQUFJLG1CQUFtQixJQUFJLGdCQUFnQixFQUFFO1lBQzlELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCwwREFBMEQ7UUFDMUQsSUFBTSxNQUFNLEdBQUcsaUJBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUN4RyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBTSxPQUFPLEdBQWlCLEVBQUUsQ0FBQztRQUVqQyxxQkFBcUI7UUFDckIsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksU0FBUyxFQUFFO1lBQ1gsU0FBUyxHQUFHLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDMUUsSUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQy9CLFdBQVcsRUFDWCxjQUFjLEVBQ2QsU0FBUyxFQUNULFFBQVEsRUFDUixzQkFBc0IsQ0FDekIsQ0FBQztZQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBUSxFQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQztTQUNqRjtRQUVELHVCQUF1QjtRQUN2QixJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMzQyxJQUFJLFdBQVcsRUFBRTtZQUNiLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDaEYsSUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQy9CLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLFFBQVEsRUFDUix3QkFBd0IsQ0FDM0IsQ0FBQztZQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBUSxFQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQztTQUNuRjtRQUVELHFEQUFxRDtRQUNyRCxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEMsSUFBTSxjQUFjLEdBQUc7WUFDbkIsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztZQUM5QixZQUFZLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO1lBQ2hDLFlBQVksRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7U0FDbkMsQ0FBQztRQUNGLElBQUksU0FBUyxJQUFJLGlCQUFPLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNsRixTQUFTLEdBQUcscUJBQXFCLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN6RSxJQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FDL0IsV0FBVyxFQUNYLGFBQWEsRUFDYixTQUFTLEVBQ1QsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixJQUFJLENBQUMsd0NBQXdDO2FBQ2hELENBQUM7WUFDRixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsb0JBQVEsRUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQVEsRUFBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7U0FDaEY7UUFFRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvQyxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ25URDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQTRHO0FBQzVHLCtFQUEwRDtBQUMxRCxnR0FBZ0Q7QUFFbkMsNkJBQXFCLEdBQVM7SUFDdkMsRUFBRSxFQUFFLHVCQUF1QjtJQUMzQixPQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsNEJBQTRCO1lBQ3BDLGdCQUFnQixFQUFFLDRCQUE0QjtZQUM5QyxPQUFPLEVBQUUsNEJBQTRCO1NBQ3hDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsYUFBYTtZQUNyQixnQkFBZ0IsRUFBRSxtRkFBbUY7WUFDckcsT0FBTyxFQUFFLHNFQUFzRTtTQUNsRjtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBRW5ELGlFQUFpRTtRQUNqRSxJQUFJLGFBQWEsR0FBRyx1QkFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDcEYsSUFBSSxhQUFhLElBQUksSUFBSSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksTUFBTTtZQUN2RSxPQUFPLElBQUksQ0FBQztRQUVoQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFVBQWtCLENBQUM7UUFDOUMsT0FBTyxNQUFNLElBQUksUUFBUSxFQUFFO1lBQ3ZCLDJHQUEyRztZQUMzRyxzSEFBc0g7WUFDdEgsMkdBQTJHO1lBQzNHLDBGQUEwRjtZQUMxRiw0SEFBNEg7WUFDNUgsTUFBTTtZQUNOLElBQUksUUFBUSxDQUFDLFFBQVEsSUFBSSxPQUFPLEVBQUU7Z0JBQzlCLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7Z0JBQ2hDLE1BQU0sR0FBRyxDQUFDLENBQUMsd0NBQXdDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7YUFDckU7WUFDRCxRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztTQUNuQztRQUVELElBQUksTUFBTTtZQUFFLE9BQU8sb0JBQVEsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxPQUFPLHlCQUFhLEVBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUUzQyxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3JFRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQTRHO0FBQzVHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELHNHQUFzRDtBQUN0RCxpR0FBbUQ7QUFDbkQsdUZBQTBDO0FBRTdCLDhCQUFzQixHQUFTO0lBQ3hDLEVBQUUsRUFBRSx3QkFBd0I7SUFDNUIsT0FBTyxFQUFFLDZQQUE2UDtJQUN0USxRQUFRLEVBQUU7UUFDTixxQkFBcUIsRUFBRTtZQUNuQixNQUFNLEVBQUUsTUFBTTtZQUNkLGtCQUFrQixFQUFFLGtCQUFrQjtTQUFDO0tBQzlDO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsTUFBTSxFQUFFLDZCQUE2QjtZQUNyQyxrQkFBa0IsRUFBRSw2QkFBNkI7WUFDakQsT0FBTyxFQUFFLDZCQUE2QjtTQUN6QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsTUFBTSxFQUFFLGFBQWE7WUFDckIsa0JBQWtCLEVBQUUsOERBQThEO1lBQ2xGLE9BQU8sRUFBRSxtREFBbUQ7U0FDL0Q7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQW1CLENBQUM7UUFFdkQscURBQXFEO1FBQ3JELElBQUksaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsSUFBSSx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDakYsT0FBTztRQUVYLDhFQUE4RTtRQUM5RSxJQUFJLG1CQUFRLENBQUMsMkJBQTJCLENBQUMsV0FBVyxDQUFDO1lBQ2pELE9BQU87UUFFWCxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xELDZGQUE2RjtRQUM3RixJQUFJLFFBQVEsS0FBSyxVQUFVO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1FBRWhCLHNHQUFzRztRQUN0RyxJQUFJLGNBQWMsR0FBRyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckgsS0FBbUIsVUFBYyxFQUFkLGlDQUFjLEVBQWQsNEJBQWMsRUFBZCxJQUFjLEVBQUU7WUFBOUIsSUFBTSxNQUFJO1lBQ1gsSUFBSSxtQkFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxNQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSTtnQkFDN0QsMkRBQTJEO2dCQUMzRCxPQUFPLElBQUksQ0FBQztTQUNuQjtRQUNELElBQUksSUFBSSxHQUFHLHVCQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksdUJBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDcEMsRUFBRSxLQUFLLENBQUM7U0FDWDtRQUNELDJEQUEyRDtRQUMzRCxzRUFBc0U7UUFDdEUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQVEsQ0FBQyxrQ0FBa0MsQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsVUFBVSxFQUFFO1lBQ2xHLElBQUksRUFBRSxHQUFHLElBQUkscUJBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwQyxPQUFPLEtBQUssR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksV0FBVyxFQUFFO2dCQUN6RCxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksdUJBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN4RSxFQUFFLEtBQUssQ0FBQztpQkFDWDthQUNKO1NBQ0o7UUFDRCxJQUFJLE1BQU0sR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBYSxFQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQzNGRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQTRHO0FBQzVHLCtFQUEwRDtBQUMxRCxpR0FBbUQ7QUFDbkQsMEZBQTRDO0FBQzVDLGdHQUFnRDtBQUNoRCxzR0FBc0Q7QUFFdEQsNkZBQThDO0FBQzlDLHVGQUEwQztBQUU3Qiw4QkFBc0IsR0FBUztJQUN4QyxFQUFFLEVBQUUsd0JBQXdCO0lBQzVCLE9BQU8sRUFBRSxxUUFBcVE7SUFDOVEsUUFBUSxFQUFFO1FBQ04scUJBQXFCLEVBQUU7WUFDbkIsTUFBTSxFQUFFLE1BQU07WUFDZCw2QkFBNkIsRUFBRSw2QkFBNkI7U0FDL0Q7S0FDSjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLE1BQU0sRUFBRSw2QkFBNkI7WUFDckMsNkJBQTZCLEVBQUUsNkJBQTZCO1lBQzVELE9BQU8sRUFBRSw2QkFBNkI7U0FDekM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLE1BQU0sRUFBRSw2RUFBNkU7WUFDckYsNkJBQTZCLEVBQUUsZ0VBQWdFO1lBQy9GLE9BQU8sRUFBRSwyRUFBMkU7U0FDdkY7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUN6QixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDMUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFtQixDQUFDO1FBRXZELHFEQUFxRDtRQUNyRCxJQUFJLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLElBQUksdUJBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQ2pGLE9BQU87UUFFWCw4RUFBOEU7UUFDOUUsSUFBSSxtQkFBUSxDQUFDLDJCQUEyQixDQUFDLFdBQVcsQ0FBQztZQUNqRCxPQUFPO1FBRVgsSUFBSSxJQUFJLEdBQUcsdUJBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNwQyxFQUFFLEtBQUssQ0FBQztTQUNYO1FBQ0QsMkRBQTJEO1FBQzNELHFFQUFxRTtRQUNyRSxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBUSxDQUFDLGtDQUFrQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxVQUFVLEVBQUU7WUFDbEcsSUFBSSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BDLE9BQU8sS0FBSyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUU7Z0JBQ3pELElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3hFLGlFQUFpRTtvQkFDakU7Ozs7Ozt1QkFNRztvQkFDSCxFQUFFLEtBQUssQ0FBQztpQkFDWDthQUNKO1NBQ0o7UUFDRCxJQUFJLE1BQU0sR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNO1lBQ1AscUJBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLHdCQUF3QixFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFDN0YsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLG9CQUFRLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUFhLEVBQUMsNkJBQTZCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDN0ZEOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRS9FLHdHQUF3RztBQUN4Ryw4RkFBd0M7QUFDeEMsNkZBQWlGO0FBQ2pGLElBQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNmLEtBQUssSUFBTSxHQUFHLElBQUksTUFBTSxFQUFFO0lBQ3RCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDekI7QUFFRCxJQUFNLFNBQVMsR0FBRztJQUNkLE9BQU8sRUFBRSwrR0FBK0c7SUFDeEgsT0FBTyxFQUFFLGlHQUFpRztJQUMxRyxPQUFPLEVBQUUsZ0ZBQWdGO0lBQ3pGLE9BQU8sRUFBRSwrSEFBK0g7SUFDeEksT0FBTyxFQUFFLHlFQUF5RTtJQUNsRixPQUFPLEVBQUUsd0ZBQXdGO0lBQ2pHLE9BQU8sRUFBRSxzSUFBc0k7SUFDL0ksT0FBTyxFQUFFLHFJQUFxSTtJQUM5SSxPQUFPLEVBQUUsd0xBQXdMO0lBQ2pNLE9BQU8sRUFBRSxrSEFBa0g7SUFDM0gsT0FBTyxFQUFFLHFKQUFxSjtJQUM5SixPQUFPLEVBQUUsc0pBQXNKO0lBQy9KLE9BQU8sRUFBRSwrTkFBK047SUFDeE8sT0FBTyxFQUFFLG1JQUFtSTtJQUM1SSxPQUFPLEVBQUUsOEdBQThHO0lBQ3ZILE9BQU8sRUFBRSwrSUFBK0k7SUFDeEosUUFBUSxFQUFFLHFIQUFxSDtJQUMvSCxRQUFRLEVBQUUsNk1BQTZNO0lBQ3ZOLFFBQVEsRUFBRSwwSEFBMEg7SUFDcEksUUFBUSxFQUFFLHNKQUFzSjtJQUNoSyxPQUFPLEVBQUUseUlBQXlJO0lBQ2xKLE9BQU8sRUFBRSxpVEFBaVQ7SUFDMVQsT0FBTyxFQUFFLDhLQUE4SztJQUN2TCxPQUFPLEVBQUUscUdBQXFHO0lBQzlHLE9BQU8sRUFBRSwwSEFBMEg7SUFDbkksT0FBTyxFQUFFLGtLQUFrSztJQUMzSyxPQUFPLEVBQUUsK0ZBQStGO0lBQ3hHLE9BQU8sRUFBRSx3RkFBd0Y7SUFDakcsT0FBTyxFQUFFLDJMQUEyTDtJQUNwTSxPQUFPLEVBQUUsdUpBQXVKO0lBQ2hLLE9BQU8sRUFBRSxxSkFBcUo7SUFDOUosT0FBTyxFQUFFLGdEQUFnRDtJQUN6RCxPQUFPLEVBQUUsNkdBQTZHO0lBQ3RILFFBQVEsRUFBRSw4RUFBOEU7SUFDeEYsT0FBTyxFQUFFLGlKQUFpSjtJQUMxSixPQUFPLEVBQUUscUtBQXFLO0lBQzlLLE9BQU8sRUFBRSxrSkFBa0o7SUFDM0osT0FBTyxFQUFFLHlJQUF5STtJQUNsSixPQUFPLEVBQUUsNEVBQTRFO0lBQ3JGLE9BQU8sRUFBRSxxSEFBcUg7SUFDOUgsT0FBTyxFQUFFLDZHQUE2RztJQUN0SCxPQUFPLEVBQUUsaUdBQWlHO0lBQzFHLE9BQU8sRUFBRSw4RUFBOEU7SUFDdkYsT0FBTyxFQUFFLG9MQUFvTDtJQUM3TCxPQUFPLEVBQUUsbU1BQW1NO0lBQzVNLE9BQU8sRUFBRSxvR0FBb0c7SUFDN0csT0FBTyxFQUFFLHdMQUF3TDtJQUNqTSxPQUFPLEVBQUUsc0lBQXNJO0lBQy9JLE9BQU8sRUFBRSx1RUFBdUU7SUFDaEYsT0FBTyxFQUFFLHlNQUF5TTtJQUNsTixPQUFPLEVBQUUsMlBBQTJQO0lBQ3BRLE9BQU8sRUFBRSwwSEFBMEg7SUFDbkksT0FBTyxFQUFFLG1IQUFtSDtJQUM1SCxPQUFPLEVBQUUsNFJBQTRSO0lBQ3JTLE9BQU8sRUFBRSxzWEFBc1g7SUFDL1gsT0FBTyxFQUFFLDZOQUE2TjtJQUN0TyxNQUFNLEVBQUUscU9BQXFPO0lBQzdPLE1BQU0sRUFBRSxxT0FBcU87Q0FDaFA7QUFFWSxvQkFBWSxHQUFnQjtJQUNyQyxJQUFJO0lBQ0osbUJBQW1CO0lBQ25CLDJCQUEyQjtJQUMzQiw2Q0FBNkM7SUFDN0MsMENBQTBDO0lBQzFDLHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIsOEJBQThCO0lBQzlCLDBCQUEwQjtJQUMxQixxQ0FBcUM7SUFDckMsU0FBUztJQUNULEtBQUs7SUFDTDtRQUNJLEVBQUUsRUFBRSxZQUFZO1FBQ2hCLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsUUFBUSxFQUFFLCtCQUFrQixDQUFDLGFBQWE7UUFDMUMsV0FBVyxFQUFFLDJDQUEyQztRQUN4RCxJQUFJLEVBQUUsMkJBQWMsQ0FBQyxTQUFTO1FBQzlCLFdBQVcsRUFBRSxDQUFDO2dCQUNWLEdBQUcsRUFBRSxHQUFHO2dCQUNSLElBQUksRUFBRSxnQkFBZ0I7Z0JBQ3RCLFNBQVMsRUFBRSxHQUFHO2dCQUNkLE9BQU8sRUFBRSxxQkFBcUI7YUFDakMsQ0FBQztLQUNMO0lBQ0Q7UUFDSSxFQUFFLEVBQUUsbUJBQW1CO1FBQ3ZCLElBQUksRUFBRSx1QkFBdUI7UUFDN0IsUUFBUSxFQUFFLCtCQUFrQixDQUFDLGFBQWE7UUFDMUMsV0FBVyxFQUFFLHNGQUFzRjtRQUNuRyxnRUFBZ0U7UUFDaEUsV0FBVyxFQUFFLEdBQUc7YUFDWCxNQUFNLENBQUMsWUFBRSxJQUFJLFFBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLEVBQWpLLENBQWlLLENBQUM7YUFDL0ssR0FBRyxDQUFDLFlBQUUsSUFBSSxRQUFDO1lBQ1IsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHO1lBQ1gsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJO1lBQ2IsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNO1lBQ2YsU0FBUyxFQUFFLEVBQUUsQ0FBQyxLQUFLO1lBQ25CLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztTQUM3QixDQUFDLEVBTlMsQ0FNVCxDQUFDO0tBQ1Y7SUFDRDtRQUNJLEVBQUUsRUFBRSx3QkFBd0I7UUFDNUIsSUFBSSxFQUFFLHdCQUF3QjtRQUM5QixRQUFRLEVBQUUsK0JBQWtCLENBQUMsYUFBYTtRQUMxQyxXQUFXLEVBQUUsc0ZBQXNGO1FBQ25HLGdFQUFnRTtRQUNoRSxXQUFXLEVBQUUsR0FBRzthQUNYLE1BQU0sQ0FBQyxZQUFFLElBQUksUUFBQyxFQUFFLENBQUMsS0FBSyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDLFFBQVEsS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDLFFBQVEsS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsRUFBakssQ0FBaUssQ0FBQzthQUMvSyxHQUFHLENBQUMsWUFBRSxJQUFJLFFBQUM7WUFDUixHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUc7WUFDWCxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUk7WUFDYixJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU07WUFDZixTQUFTLEVBQUUsRUFBRSxDQUFDLEtBQUs7WUFDbkIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1NBQzdCLENBQUMsRUFOUyxDQU1ULENBQUM7S0FDVjtJQUNEO1FBQ0ksRUFBRSxFQUFFLFVBQVU7UUFDZCxJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLFFBQVEsRUFBRSwrQkFBa0IsQ0FBQyxhQUFhO1FBQzFDLFdBQVcsRUFBRSxpSkFBaUo7UUFDOUosZ0VBQWdFO1FBQ2hFLFdBQVcsRUFBRSxHQUFHO2FBQ1gsTUFBTSxDQUFDLFlBQUUsSUFBSSxRQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUMsUUFBUSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxFQUFwSCxDQUFvSCxDQUFDO2FBQ2xJLEdBQUcsQ0FBQyxZQUFFLElBQUksUUFBQztZQUNSLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRztZQUNYLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSTtZQUNiLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTTtZQUNmLFNBQVMsRUFBRSxFQUFFLENBQUMsS0FBSztZQUNuQixPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7U0FDN0IsQ0FBQyxFQU5TLENBTVQsQ0FBQztLQUNWO0lBQ0Q7UUFDSSxFQUFFLEVBQUUsVUFBVTtRQUNkLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsUUFBUSxFQUFFLCtCQUFrQixDQUFDLGFBQWE7UUFDMUMsV0FBVyxFQUFFLHlGQUF5RjtRQUN0RyxnRUFBZ0U7UUFDaEUsV0FBVyxFQUFFLEdBQUc7YUFDWCxNQUFNLENBQUMsWUFBRSxJQUFJLFFBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLEVBQTNGLENBQTJGLENBQUM7YUFDekcsR0FBRyxDQUFDLFlBQUUsSUFBSSxRQUFDO1lBQ1IsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHO1lBQ1gsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJO1lBQ2IsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNO1lBQ2YsU0FBUyxFQUFFLEVBQUUsQ0FBQyxLQUFLO1lBQ25CLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztTQUM3QixDQUFDLEVBTlMsQ0FNVCxDQUFDO0tBQ1Y7SUFDRDtRQUNJLEVBQUUsRUFBRSxVQUFVO1FBQ2QsSUFBSSxFQUFFLGtCQUFrQjtRQUN4QixRQUFRLEVBQUUsK0JBQWtCLENBQUMsYUFBYTtRQUMxQyxXQUFXLEVBQUUsaUdBQWlHO1FBQzlHLHdEQUF3RDtRQUN4RCxXQUFXLEVBQUUsR0FBRzthQUNYLE1BQU0sQ0FBQyxZQUFFLElBQUksUUFBQyxFQUFFLENBQUMsS0FBSyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxLQUFLLENBQUMsRUFBbEUsQ0FBa0UsQ0FBQzthQUNoRixHQUFHLENBQUMsWUFBRSxJQUFJLFFBQUM7WUFDUixHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUc7WUFDWCxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUk7WUFDYixJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU07WUFDZixTQUFTLEVBQUUsRUFBRSxDQUFDLEtBQUs7WUFDbkIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1NBQzdCLENBQUMsRUFOUyxDQU1ULENBQUM7S0FDVjtDQUNKOzs7Ozs7Ozs7Ozs7OztBQzlMRCx5RkFBc0M7QUFDdEMsK0ZBQTBDO0FBRTFDLGtHQUE0QztBQUM1Qyw2RkFBOEM7QUFDOUMsbUZBQWtDO0FBQ2xDLHVGQUEwQztBQUMxQywyRkFBK0M7QUFFL0M7OztHQUdHO0FBQ0g7SUFlSTs7O09BR0c7SUFDSCxzQkFBNEIsV0FBaUM7UUFBakMsNENBQW9CLFFBQVEsQ0FBQyxJQUFJO1FBQWpDLGdCQUFXLEdBQVgsV0FBVyxDQUFzQjtRQVByRCxrQkFBYSxHQUE2QyxFQUFFLENBQUM7UUFRakUsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLGtUQUU2SCxDQUFDLENBQUM7SUFDaEosQ0FBQztJQXhCYSwwQkFBYSxHQUEzQixVQUE0QixPQUFnQztRQUFoQyw0Q0FBZ0M7UUFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkQ7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUF5QixDQUFDO0lBQzFDLENBQUM7SUFxQk0saUNBQVUsR0FBakI7UUFDSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDdEM7SUFDTCxDQUFDO0lBRU8seUNBQWtCLEdBQTFCLFVBQTJCLElBQW1EO1FBQW5ELHNDQUFtRDtRQUMxRSxJQUFNLFdBQVcsR0FBVyxFQUFFLENBQUM7UUFFL0IsdUNBQXVDO1FBQ3ZDLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQ3hDLElBQUksRUFDSixVQUFVLENBQUMsWUFBWSxFQUN2QixJQUFJLENBQ1AsQ0FBQztRQUVGLElBQUksSUFBaUIsQ0FBQztRQUN0QixPQUFPLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDN0IsSUFBTSxPQUFPLEdBQUcsSUFBZSxDQUFDO1lBRWhDLGdEQUFnRDtZQUNoRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUVyQyw2Q0FBNkM7Z0JBQzdDLElBQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDdEUsV0FBVyxDQUFDLElBQUksT0FBaEIsV0FBVyxFQUFTLGlCQUFpQixFQUFFO2FBQzFDO1NBQ0o7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLDRDQUFxQixHQUE3QjtRQUFBLGlCQTBIQztRQXpIRyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDdEM7UUFDRCxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBTSxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFDLFNBQVM7WUFDNUMsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQ0FDbEMsZUFBZTtnQkFDdEIsZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBQyxXQUFXO29CQUM3QyxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTt3QkFDbEUsT0FBTyxDQUFDLElBQUksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDLGtEQUFpRDt3QkFDaEgsT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7cUJBQ3BDO2dCQUNMLENBQUMsQ0FBQzs7WUFOTixLQUE4QixVQUErRCxFQUEvRCxjQUFTLENBQUMsTUFBTSxDQUFDLGtCQUFRLFlBQUksc0JBQVEsQ0FBQyxZQUFZLDBDQUFFLE1BQU0sSUFBRyxDQUFDLElBQUMsRUFBL0QsY0FBK0QsRUFBL0QsSUFBK0Q7Z0JBQXhGLElBQU0sZUFBZTt3QkFBZixlQUFlO2FBT3pCO1lBQUEsQ0FBQztZQUNGLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQ0FFcEIsUUFBUTtnQkFDZixJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUU7b0JBQ3JCLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLG1CQUFTO3dCQUNqQyxzQ0FBc0M7d0JBQ3RDLElBQUksUUFBUSxHQUFHLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDbEQsS0FBbUIsVUFBUSxFQUFSLHFCQUFRLEVBQVIsc0JBQVEsRUFBUixJQUFRLEVBQUU7NEJBQXhCLElBQU0sSUFBSTs0QkFDWCxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtnQ0FDbkIsU0FBUyxFQUFFLElBQUk7Z0NBQ2YsT0FBTyxFQUFFLElBQUk7Z0NBQ2IsYUFBYSxFQUFFLElBQUk7NkJBQ3RCLENBQUMsQ0FBQzt5QkFDTjtvQkFDTCxDQUFDLENBQUMsQ0FBQztpQkFDTjtnQkFFRCxJQUFNLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUM3QixJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDNUUsSUFBSSxJQUFJO3VCQUNELENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBb0IsQ0FBQzt1QkFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxNQUFNLEVBQzlDO29CQUNFLHFDQUFxQztvQkFDckMsSUFBTSxjQUFjO29CQUNoQixnREFBZ0Q7b0JBQ2hELENBQUMsQ0FDRyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQzsyQkFDekQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFROzJCQUN4QyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUNoRyxJQUFJLElBQUksQ0FBQzt3QkFDViw4QkFBOEI7MkJBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsbUpBQXFJLENBQUMsQ0FBQztvQkFFM0osSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7b0JBQy9CLElBQUksV0FBUyxHQUFHLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUN0QyxJQUFJLGNBQWMsRUFBRTt3QkFDaEIsaURBQWlEO3dCQUNqRCxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7d0JBQ3JELElBQUksWUFBWSxFQUFFOzRCQUNkLFdBQVMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDdkU7d0JBRUQsSUFBSSxjQUFjLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssRUFBRTs0QkFDL0MsV0FBUyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7eUJBQzdCO3dCQUNELElBQUksY0FBYyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsRUFBRTs0QkFDOUMsV0FBUyxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUN6RTt3QkFDRCxJQUFJLFdBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7NEJBQzNCLFdBQVMsR0FBRyxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7eUJBQ2pEO3dCQUNELGtCQUFrQixHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLFdBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7K0JBQzVFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFdBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7K0JBQ25FLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFdBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztxQkFDL0U7b0JBR0QsSUFBSSxjQUFjLElBQUksa0JBQWtCLEVBQUU7d0JBQ3RDLElBQU0sVUFBUSxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzt3QkFDaEssa0NBQWtDO3dCQUNsQyxJQUFJLENBQUMsVUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssZUFBZSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRTs0QkFDaEosS0FBMkIsVUFBa0IsRUFBbEIsVUFBSSxDQUFDLGFBQWEsRUFBbEIsY0FBa0IsRUFBbEIsSUFBa0IsRUFBRTtnQ0FBMUMsSUFBTSxZQUFZO2dDQUNuQixZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQzs2QkFDM0M7eUJBQ0o7NkJBQU07NEJBQ0gsSUFBSSxZQUFVLEdBQUcsVUFBUSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7NEJBQzdELElBQUssWUFBa0IsQ0FBQyxZQUFZLEVBQUU7Z0NBQ2xDLFlBQVksQ0FBRSxZQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDOzZCQUNsRDs0QkFDQSxZQUFrQixDQUFDLFlBQVksR0FBRyxVQUFVLENBQUM7Z0NBQzFDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztnQ0FDakIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxXQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dDQUNyRixJQUFJLFVBQVEsSUFBSSxTQUFTLEVBQUU7b0NBQ3ZCLElBQUksVUFBVSxHQUFHLElBQUksbUJBQVEsQ0FBQyxZQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7b0NBQ2pELElBQUksYUFBYSxHQUFHLElBQUksbUJBQVEsQ0FBQyxZQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7b0NBQ25ELGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBTSxXQUFJLEVBQUosQ0FBSSxDQUFDLENBQUM7b0NBQy9CLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUMsYUFBWSxFQUFDLEdBQUUsQ0FBQyxHQUFDLHVCQUFVLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztpQ0FDdkc7cUNBQU0sSUFBSSxXQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQ0FDMUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsbUJBQVM7d0NBQ2pDLDRCQUE0Qjt3Q0FDNUIsSUFBSSxVQUFVLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQzt3Q0FDaEQsSUFBSSxhQUFhLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQzt3Q0FDbEQsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFNLFdBQUksRUFBSixDQUFJLENBQUMsQ0FBQzt3Q0FDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyx1QkFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7b0NBQzVFLENBQUMsQ0FBQyxDQUFDO2lDQUNOO2dDQUNELEtBQTJCLFVBQWtCLEVBQWxCLFVBQUksQ0FBQyxhQUFhLEVBQWxCLGNBQWtCLEVBQWxCLElBQWtCLEVBQUU7b0NBQTFDLElBQU0sWUFBWTtvQ0FDbkIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztpQ0FDcEM7NEJBQ0wsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3lCQUNYO3FCQUNKO2lCQUNKOztZQTNGTCxLQUF1QixVQUFTLEVBQVQsdUJBQVMsRUFBVCx1QkFBUyxFQUFULElBQVM7Z0JBQTNCLElBQU0sUUFBUTt3QkFBUixRQUFRO2FBNEZsQjtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsMENBQTBDO1FBQzFDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM1QyxLQUFtQixVQUFRLEVBQVIscUJBQVEsRUFBUixzQkFBUSxFQUFSLElBQVEsRUFBRTtZQUF4QixJQUFNLElBQUk7WUFDWCxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtnQkFDbkIsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsYUFBYSxFQUFFLElBQUk7YUFDdEIsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRU0sc0NBQWUsR0FBdEIsVUFBdUIsUUFBMkM7UUFDOUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVNLHlDQUFrQixHQUF6QixVQUEwQixjQUFpRDtRQUN2RSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGtCQUFRLElBQUksZUFBUSxLQUFLLGNBQWMsRUFBM0IsQ0FBMkIsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRDs7O09BR0c7SUFDSSx1Q0FBZ0IsR0FBdkI7UUFDSSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx1Q0FBZ0IsR0FBdkIsVUFBd0IsSUFBVTs7UUFDOUIsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLEtBQUssSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDM0MsSUFBSTtZQUNBLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxtQkFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXhDLHlCQUF5QjtZQUN6QixJQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUVsRixJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzFDLElBQU0sTUFBSSxHQUFHLFVBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLDBDQUFFLElBQUksQ0FBQztZQUVwRCxPQUFPO2dCQUNILE9BQU8sRUFBRSxJQUFJO2dCQUNiLGVBQWUsRUFBRSx1QkFBVSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQztnQkFDeEYsSUFBSTtnQkFDSixJQUFJO2FBQ1AsQ0FBQztTQUNMO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDWixPQUFPO2dCQUNILE9BQU8sRUFBRSxLQUFLO2dCQUNkLGVBQWUsRUFBRTtvQkFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUU7b0JBQ2pDLEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRTtvQkFDL0IsT0FBTyxFQUFFLHlDQUFrQyxLQUFLLENBQUMsT0FBTyxDQUFFO2lCQUM3RDthQUNKLENBQUM7U0FDTDtnQkFBUztZQUNOLEtBQUssSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDL0I7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLCtCQUFRLEdBQWYsVUFBZ0IsSUFBb0I7O1FBQ2hDLHFCQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDcEQsSUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BELElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNwQixLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuQyxJQUFJO1lBQ0EsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUMsSUFBSSxlQUFlLFVBQUM7WUFDcEIsT0FBTyxTQUFTLElBQUksUUFBUSxFQUFFO2dCQUMxQixJQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xDLFFBQVEsR0FBRyx5QkFBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2hELElBQUksUUFBUSxFQUFFO29CQUNWLElBQUksZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUM3RSxJQUFJLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQyx5QkFBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUU7d0JBQ2xILGdCQUFnQixHQUFHOzRCQUNmLFFBQVEsRUFBRSxFQUFFOzRCQUNaLE9BQU8sRUFBRSxFQUFFO3lCQUNkO3FCQUNKO29CQUNELGVBQWUsR0FBRyx1QkFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQzdFLHlGQUF5RjtvQkFDekYsU0FBUyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN6RjthQUNKO1lBQ0QsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDWCx1Q0FBdUM7Z0JBQ3ZDLElBQUksQ0FBQyxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ3RDLElBQUksYUFBYSxHQUFHLHVCQUFVLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUM7Z0JBQ25HLE9BQU87b0JBQ0gsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsZUFBZSxFQUFFO3dCQUNiLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7d0JBQy9CLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7d0JBQzdCLE9BQU8sRUFBRSxrQkFBVyxJQUFJLGVBQUssY0FBYSxhQUFiLGFBQWEsdUJBQWIsYUFBYSxDQUFFLE9BQU8sS0FBSSxFQUFFLENBQUU7cUJBQzlEO2lCQUNKLENBQUM7YUFDTDtpQkFBTTtnQkFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztnQkFDOUIsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDMUMsSUFBTSxNQUFJLEdBQUcsVUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsMENBQUUsSUFBSSxDQUFDO2dCQUVwRCw4QkFBOEI7Z0JBQzlCLEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUNoRixPQUFPO29CQUNILE9BQU8sRUFBRSxJQUFJO29CQUNiLGVBQWU7b0JBQ2YsSUFBSTtvQkFDSixJQUFJO2lCQUNQLENBQUM7YUFDTDtTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JCLHVDQUF1QztZQUN2QyxJQUFJLENBQUMsYUFBYSxHQUFHLGdCQUFnQixDQUFDO1lBQ3RDLE9BQU87Z0JBQ0gsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsZUFBZSxFQUFFO29CQUNiLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7b0JBQy9CLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7b0JBQzdCLE9BQU8sRUFBRSw0QkFBcUIsS0FBSyxDQUFDLE9BQU8sQ0FBRTtpQkFDaEQ7YUFDSixDQUFDO1NBQ0w7Z0JBQVM7WUFDTixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDdEI7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG1DQUFZLEdBQW5CLFVBQW9CLElBQW9COztRQUNwQyxxQkFBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BELElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVwRCxJQUFJO1lBQ0EsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUMsSUFBSSxlQUFlLFVBQUM7WUFDcEIsT0FBTyxTQUFTLElBQUksUUFBUSxFQUFFO2dCQUMxQixJQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xDLFFBQVEsR0FBRyx5QkFBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3BELElBQUksUUFBUSxFQUFFO29CQUNWLElBQUksZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUM3RSxJQUFJLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQyx5QkFBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUU7d0JBQ2xILGdCQUFnQixHQUFHOzRCQUNmLFFBQVEsRUFBRSxFQUFFOzRCQUNaLE9BQU8sRUFBRSxFQUFFO3lCQUNkO3FCQUNKO29CQUNELGVBQWUsR0FBRyx1QkFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQzdFLHlGQUF5RjtvQkFDekYsU0FBUyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN6RjthQUNKO1lBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDWCx1Q0FBdUM7Z0JBQ3ZDLElBQUksQ0FBQyxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ3RDLElBQUksYUFBYSxHQUFHLHVCQUFVLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUM7Z0JBQ25HLE9BQU87b0JBQ0gsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsZUFBZSxFQUFFO3dCQUNiLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7d0JBQy9CLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7d0JBQzdCLE9BQU8sRUFBRSxzQkFBZSxJQUFJLGVBQUssY0FBYSxhQUFiLGFBQWEsdUJBQWIsYUFBYSxDQUFFLE9BQU8sS0FBSSxFQUFFLENBQUU7cUJBQ2xFO2lCQUNKLENBQUM7YUFDTDtpQkFBTTtnQkFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztnQkFDOUIsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDMUMsSUFBTSxNQUFJLEdBQUcsVUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsMENBQUUsSUFBSSxDQUFDO2dCQUVwRCxpQ0FBaUM7Z0JBQ2pDLG9HQUFvRztnQkFDcEcsNERBQTREO2dCQUM1RCw2RUFBNkU7Z0JBQzdFLHlDQUF5QztnQkFDekMsSUFBSTtnQkFDSixPQUFPO29CQUNILE9BQU8sRUFBRSxJQUFJO29CQUNiLGVBQWU7b0JBQ2YsSUFBSTtvQkFDSixJQUFJO2lCQUNQLENBQUM7YUFDTDtTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JCLHVDQUF1QztZQUN2QyxJQUFJLENBQUMsYUFBYSxHQUFHLGdCQUFnQixDQUFDO1lBQ3RDLE9BQU87Z0JBQ0gsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsZUFBZSxFQUFFO29CQUNiLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7b0JBQy9CLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7b0JBQzdCLE9BQU8sRUFBRSw0QkFBcUIsS0FBSyxDQUFDLE9BQU8sQ0FBRTtpQkFDaEQ7YUFDSixDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSDs7O09BR0c7SUFDWSx1QkFBVSxHQUF6QixVQUEwQixJQUFVO1FBQ2hDLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzFDLG9FQUFvRTtRQUNwRSxJQUFJO1lBQ0EsT0FBTyxpQkFBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBNkIsQ0FBQztTQUM1RTtRQUFDLFdBQU07WUFDSixPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQUVhLDJCQUFjLEdBQTVCLFVBQTZCLElBQThCLEVBQUUsU0FBbUIsRUFBRSxTQUFvQjs7UUFDbEcsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDMUQsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxPQUFPLEdBQUcsUUFBUSxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4RixJQUFJLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFDM0IsSUFBSSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzVCLElBQUk7WUFDQSxJQUFNLE1BQU0sR0FBRyxlQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsT0FBTyxHQUFHLGFBQWEsbUNBQUksUUFBUSxDQUFDO1lBQzlELElBQU0sTUFBTSxHQUFHLGVBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxPQUFPLEdBQUcsYUFBYSxtQ0FBSSxRQUFRLENBQUM7WUFFOUQsdUVBQXVFO1lBQ3ZFLHFFQUFxRTtZQUNyRSxnRUFBZ0U7WUFDaEUsc0VBQXNFO1lBQ3RFLDJCQUEyQjtZQUMzQixJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUU7Z0JBQ25CLElBQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQy9ELElBQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBRWhFLElBQUksU0FBUyxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUN6QixtRUFBbUU7b0JBQ25FLElBQU0sWUFBWSxHQUFHLElBQUksbUJBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3BELElBQU0sS0FBSyxHQUFHLHVCQUFVLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQ3BFLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7d0JBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDMUQ7cUJBQU0sSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLEVBQUU7b0JBQ2hDLGlFQUFpRTtvQkFDakUsSUFBTSxZQUFZLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDbkQsSUFBTSxLQUFLLEdBQUcsdUJBQVUsQ0FBQyxXQUFXLENBQUMsSUFBc0IsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQ3RGLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7d0JBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDekQ7cUJBQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7b0JBQzFELDhEQUE4RDtvQkFDOUQsSUFBTSxTQUFTLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDaEQsSUFBTSxLQUFLLEdBQUcsdUJBQVUsQ0FBQyxXQUFXLENBQUMsSUFBc0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQ25GLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7d0JBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDdEQsSUFBTSxTQUFTLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDakQsSUFBTSxLQUFLLEdBQUcsdUJBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDakUsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRTt3QkFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUMxRDtnQkFDRCxxRUFBcUU7Z0JBQ3JFLHFFQUFxRTtnQkFDckUsdURBQXVEO2dCQUN2RCxPQUFPLEVBQUUsT0FBTyxXQUFFLFFBQVEsWUFBRSxDQUFDO2FBQ2hDO1lBRUQsdUVBQXVFO1lBQ3ZFLElBQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDO2dCQUN2QixDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztnQkFDL0YsU0FBUyxDQUFDLENBQUM7b0JBQ1AsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7b0JBQy9GLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQztZQUVsRCxJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLG1CQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN0RSxJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLG1CQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtnQkFDbEQsSUFBSSxZQUFZLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQy9ELElBQUksWUFBWSxFQUFFO29CQUNkLEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzVELE9BQU8sWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTt3QkFDbkMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDOUQsUUFBUSxDQUFDLElBQUksQ0FBQyx1QkFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQzlELE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztxQkFDcEI7b0JBQ0QsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNuQixRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFDLElBQUksUUFBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUF4QixDQUF3QixDQUFDLENBQUMsR0FBRyxDQUFDLFdBQUMsSUFBSSxRQUFDLENBQUMsSUFBSSxFQUFFLEVBQVIsQ0FBUSxDQUFDLENBQUM7b0JBQUEsQ0FBQztvQkFFOUUsT0FBTyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUNuQyxLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUM3RCxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUFVLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQzt3QkFDN0QsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO3FCQUNwQjtvQkFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFDLElBQUksUUFBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUF4QixDQUF3QixDQUFDLENBQUMsR0FBRyxDQUFDLFdBQUMsSUFBSSxRQUFDLENBQUMsSUFBSSxFQUFFLEVBQVIsQ0FBUSxDQUFDLENBQUM7aUJBQzlFO2FBQ0o7U0FDSjtRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN0QjtRQUNELEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUV4QyxPQUFPO1lBQ0gsT0FBTztZQUNQLFFBQVE7U0FDWCxDQUFDO0lBQ04sQ0FBQztJQUVjLHlCQUFZLEdBQTNCLFVBQTRCLFNBQW1CLEVBQUUsU0FBbUI7UUFDaEUsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQzVCO2FBQU0sSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3RDLE9BQU8sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQzVCO2FBQU07WUFDSCxJQUFJLFlBQVksR0FBYSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0MsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRTtnQkFBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDeEUsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELE9BQU8sWUFBWSxDQUFDO1NBQ3ZCO0lBQ0wsQ0FBQztJQUVhLHNCQUFTLEdBQXZCLFVBQXdCLElBQW9CO1FBQ3hDLElBQUksSUFBSSxHQUFHLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN4QyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQU07WUFDbEIsSUFBSSxlQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNqQztRQUNMLENBQUMsQ0FBQztRQUNGLElBQUksT0FBTyxHQUFhLEVBQUUsQ0FBQztRQUMzQixrREFBa0Q7UUFDbEQsSUFBSSxVQUFVLEdBQUcsdUJBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQztRQUN0RyxJQUFJLFVBQVUsRUFBRTtZQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLE9BQU8sU0FBUyxFQUFFO1lBQ2QsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNqRDtpQkFBTTtnQkFDSCxTQUFTLEdBQUcsS0FBSyxDQUFDO2FBQ3JCO1NBQ0o7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRWEsNEJBQWUsR0FBN0IsVUFBOEIsR0FBaUIsRUFBRSxJQUFvQjtRQUNqRSxJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQU07WUFDbEIsSUFBSSxlQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNqQztRQUNMLENBQUMsQ0FBQztRQUNGLElBQUksT0FBTyxHQUFtQixFQUFFLENBQUM7UUFDakMsa0RBQWtEO1FBQ2xELElBQUksVUFBVSxHQUFHLHVCQUFVLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxFQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUM7UUFDdEcsSUFBSSxVQUFVLEVBQUU7WUFDWixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzVCO1FBRUQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLE9BQU8sU0FBUyxFQUFFO1lBQ2QsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pCLDJDQUEyQztnQkFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDekM7aUJBQU07Z0JBQ0gsU0FBUyxHQUFHLEtBQUssQ0FBQzthQUNyQjtTQUNKO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVhLDRCQUFlLEdBQTdCLFVBQThCLEdBQWlCOztRQUMzQyxJQUFNLEtBQUssR0FBcUIsQ0FBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFFLENBQUM7UUFDdEYsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxtQkFBUyxJQUFJLG1CQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsRUFBNUMsQ0FBNEMsQ0FBQyxDQUFDO1FBQ25GLElBQUksTUFBTSxHQUFxQyxFQUFFLENBQUM7O1lBRTlDLElBQUksSUFBSSxHQUFHLGFBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMENBQUUsS0FBSyxDQUFDO1lBQ2hDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQyxJQUFJLEVBQUUsR0FBRztnQkFDcEIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDekIsSUFBSSxDQUFDLElBQUksSUFBSSxtQkFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDNUQsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7cUJBQ2hDO2lCQUNKO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLFFBQVEsR0FBOEIsRUFBRSxDQUFDO1lBQzdDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztZQUNyQixLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUMsSUFBSSxFQUFFLEdBQUc7Z0JBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksbUJBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ2hGLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO29CQUM5QyxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDcEM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksUUFBUSxFQUFFO2dCQUNWLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDL0IsSUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLGVBQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDeEQsb0VBQW9FO2dCQUNwRSxnREFBZ0Q7Z0JBQ2hELElBQU0sT0FBTyxHQUFHLFVBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxhQUFhLG1DQUFJLEdBQUcsQ0FBQztnQkFDM0MsSUFBSSxRQUFRLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDN0MsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7aUJBQ2hDO2dCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDekI7O1FBOUJMLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBTSxJQUFJLGFBQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFqQixDQUFpQixDQUFDOztTQStCL0M7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ0wsbUJBQUM7QUFBRCxDQUFDO0FBN2xCWSxvQ0FBWTs7Ozs7Ozs7Ozs7Ozs7QUNkekIsaUdBQW1EO0FBQ25ELG1HQUF3RTtBQUN4RSwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELG1GQUFrQztBQWFsQzs7Ozs7Ozs7O0dBU0c7QUFDSDtJQWNJOzs7O09BSUc7SUFDSCxrQkFBWSxPQUFjLEVBQUUsSUFBZTtRQUN2Qyw2RkFBNkY7UUFDN0YsZ0ZBQWdGO1FBQ2hGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxxQkFBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdELElBQUksT0FBTyxFQUFFO1lBQ1QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3RCO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILHdCQUFLLEdBQUw7UUFDSSxJQUFJLE1BQU0sR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN4QixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDeEIsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3hDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssOEJBQVcsR0FBbkI7UUFDSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7WUFDakMsZUFBZTtZQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsbUJBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVFLElBQUksQ0FBQyxJQUFJLEdBQUcseUJBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQW1CLENBQUMsQ0FBQztTQUNsRjthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtZQUN4QyxZQUFZO1lBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7WUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1NBQ3hFO2FBQU07WUFDSCxtQkFBbUI7WUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7U0FDekI7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHVCQUFJLEdBQVgsVUFBWSxZQUErQixFQUFFLFFBQTJCOztRQUNwRSxJQUFNLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFcEIsdUJBQXVCO1FBQ3ZCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztRQUV0Qix5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLEtBQUssSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3hDLEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBQyxJQUFHLEVBQUMsR0FBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELFNBQWdDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQXpHLFdBQVcsbUJBQUUsWUFBWSxrQkFBZ0YsQ0FBQztRQUNoSCxLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVqRixHQUFHO1lBQ0MsNENBQTRDO1lBQzVDLElBQUksWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQzthQUM5QjtpQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDaEMsTUFBTTthQUNUO1lBRUQsd0NBQXdDO1lBQ3hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUMsSUFBRyxFQUFDLEdBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM3RCxDQUFDLEtBQWdDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQXpHLFdBQVcsbUJBQUUsWUFBWSxtQkFBaUYsQ0FBQztZQUM5RyxLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUVqRixpQ0FBaUM7WUFDakMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUMvRTtpQkFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO2FBQ3RCO1lBQ0QsSUFBSSxlQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNoRSxNQUFNO2FBQ1Q7WUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNkLDBDQUEwQztnQkFDMUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMvRTtTQUNKLFFBQVEsQ0FBQyxTQUFTLEVBQUU7UUFDckIsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUMsSUFBRyxFQUFDLEdBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN0RixLQUFLLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTVCLElBQUksU0FBUyxFQUFFO1lBQ1gsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3RCO2FBQU07WUFDSCx5Q0FBeUM7WUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7U0FDekI7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLDJCQUFRLEdBQWYsVUFBZ0IsWUFBK0IsRUFBRSxRQUEyQjs7UUFDeEUsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztRQUUxQix5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLEtBQUssSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDNUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELFNBQWdDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQXpHLFdBQVcsbUJBQUUsWUFBWSxrQkFBZ0YsQ0FBQztRQUNoSCxLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDaEQsR0FBRztZQUNDLDRDQUE0QztZQUM1QyxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtnQkFDckMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7YUFDL0I7aUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2hDLE1BQU07YUFDVDtZQUVELHdDQUF3QztZQUN4QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELENBQUMsS0FBZ0MsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsRUFBekcsV0FBVyxtQkFBRSxZQUFZLG1CQUFpRixDQUFDO1lBQzlHLEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUVoRCxpQ0FBaUM7WUFDakMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUMvRTtpQkFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO2FBQ3RCO1lBQ0QsSUFBSSxlQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2pFLE1BQU07YUFDVDtZQUNELElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2QsMENBQTBDO2dCQUMxQyxhQUFhLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25GO1NBQ0osUUFBUSxDQUFDLGFBQWEsRUFBRTtRQUN6QixLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdEQsS0FBSyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QixJQUFJLGFBQWEsRUFBRTtZQUNmLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN0QjthQUFNO1lBQ0gseUNBQXlDO1lBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1NBQ3pCO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx5QkFBTSxHQUFiLFVBQWMsTUFBZ0I7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxLQUFLLElBQUksQ0FBQztRQUN0QyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUUsSUFBSSxDQUFDLElBQUksR0FBRyx5QkFBVyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBbUIsQ0FBQyxDQUFDO1NBQ2xGO2FBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUN4RTthQUFNO1lBQ0gsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7U0FDekI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSwyQ0FBd0IsR0FBL0IsVUFBZ0MsS0FBZSxFQUFFLEtBQWdCO1FBQWpFLGlCQVNDO1FBUkcsSUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGNBQUksSUFBSSxXQUFJLENBQUMsV0FBVyxFQUFFLEVBQWxCLENBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BFLElBQU0sT0FBTyxHQUFHLFVBQUMsTUFBZ0I7WUFDN0IsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7bUJBQ2xDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlGLENBQUM7UUFDRCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFBQyxDQUFDO1FBQ3hDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGdEQUE2QixHQUFwQyxVQUFxQyxLQUFlLEVBQUUsS0FBZ0I7UUFDbEUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLElBQUksTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtZQUMvQyxPQUFPLE1BQU0sQ0FBQztTQUNqQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxrREFBK0IsR0FBdEM7UUFDSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLEVBQUU7WUFDWCxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDakMsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxJQUFJLHVCQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM1RCxPQUFPLE1BQU0sQ0FBQzthQUNqQjtZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN2QixNQUFNO2FBQ1Q7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSSwwQkFBTyxHQUFkO1FBQ0ksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7O09BR0c7SUFDSSw4QkFBVyxHQUFsQjtRQUNJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSSwwQkFBTyxHQUFkO1FBQ0ksZ0RBQWdEO1FBQ2hELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQzNCLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztTQUN4QjtRQUNELElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQixJQUFJLElBQUksRUFBRTtZQUNOLElBQU0sU0FBUyxHQUFHLHVCQUFVLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xFLElBQUksU0FBUyxFQUFFO2dCQUNYLE9BQU8sU0FBUyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDO2FBQ3ZEO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksNEJBQVMsR0FBaEIsVUFBaUIsR0FBWTtRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDBCQUFPLEdBQWQ7UUFDSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSSw2QkFBVSxHQUFqQjtRQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN4QyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQW1CLENBQUM7SUFDM0MsQ0FBQztJQUVNLG1DQUFnQixHQUF2QjtRQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNuQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcscUJBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRSxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksMkJBQVEsR0FBZjtRQUNJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDZCQUFVLEdBQWpCO1FBQ0ksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNXLGdCQUFPLEdBQXJCLFVBQXNCLEdBQW9CLEVBQUUsR0FBb0I7O1FBQzVELElBQU0sT0FBTyxHQUFHLFNBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxNQUFNLDBDQUFFLElBQUksQ0FBQztRQUNsQyxJQUFNLE9BQU8sR0FBRyxTQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsTUFBTSwwQ0FBRSxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUV4Qix5RUFBeUU7UUFDekUsZ0ZBQWdGO1FBQ2hGLDZFQUE2RTtRQUM3RSx1REFBdUQ7UUFDdkQsSUFBSSxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNuRSxJQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDO1lBQ3hELElBQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUM7WUFDeEQsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3hDLHVDQUF1QztnQkFDdkMsSUFBSSxnQkFBZ0I7b0JBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFFLGlEQUFpRDtnQkFDbkYsSUFBSSxnQkFBZ0I7b0JBQUUsT0FBTyxDQUFDLENBQUMsQ0FBRyxxREFBcUQ7Z0JBQ3ZGLElBQUksR0FBRyxDQUFDLFlBQVksS0FBSyxHQUFHLENBQUMsWUFBWSxFQUFFO29CQUN2QyxPQUFPLEdBQUcsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdkQ7YUFDSjtTQUNKO1FBRUQsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTNELGlFQUFpRTtRQUNqRSxJQUFJLFdBQVcsR0FBRyxHQUFHLEVBQUU7WUFDbkIsNkVBQTZFO1lBQzdFLGtGQUFrRjtZQUNsRixJQUFJLFlBQVksR0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JDLElBQUksWUFBWSxHQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFckMsSUFBSSxPQUFPLEdBQWdCLE9BQU8sQ0FBQztZQUNuQyxPQUFPLE9BQU8sR0FBRyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDNUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM5QjtZQUVELE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDbEIsT0FBTyxPQUFPLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQzVDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDOUI7WUFFRCwyQkFBMkI7WUFDM0IsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUV2QiwrQkFBK0I7WUFDL0IsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sV0FBVyxHQUFHLFlBQVksQ0FBQyxNQUFNO2dCQUNqQyxXQUFXLEdBQUcsWUFBWSxDQUFDLE1BQU07Z0JBQ2pDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQzVELFdBQVcsRUFBRSxDQUFDO2FBQ2pCO1lBRUQsMkRBQTJEO1lBQzNELElBQUksV0FBVyxLQUFLLFlBQVksQ0FBQyxNQUFNLEVBQUU7Z0JBQ3JDLG9DQUFvQztnQkFDcEMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0QztZQUNELElBQUksV0FBVyxLQUFLLFlBQVksQ0FBQyxNQUFNLEVBQUU7Z0JBQ3JDLG9DQUFvQztnQkFDcEMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0QztZQUVELHdDQUF3QztZQUN4QyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7Z0JBQ2pCLElBQUksUUFBUSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDekMsSUFBSSxRQUFRLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUV6QyxJQUFJLGFBQWEsR0FBRyxRQUFRLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9ELElBQUksYUFBYSxHQUFHLEdBQUc7b0JBQUUsT0FBTyxDQUFDLENBQUMsQ0FBRSw2QkFBNkI7Z0JBQ2pFLElBQUksYUFBYSxHQUFHLEdBQUc7b0JBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLDZCQUE2QjthQUNwRTtZQUVELHdFQUF3RTtZQUN4RSxPQUFPLENBQUMsQ0FBQztTQUNaO1FBRUQsSUFBSSxXQUFXLEdBQUcsR0FBRyxFQUFFO1lBQ25CLDhCQUE4QjtZQUM5QiwrREFBK0Q7WUFDL0QsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QzthQUFNLElBQUksV0FBVyxHQUFHLElBQUksRUFBRTtZQUMzQiw4QkFBOEI7WUFDOUIsK0RBQStEO1lBQy9ELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEM7YUFBTSxJQUFJLFdBQVcsR0FBRyxHQUFHLEVBQUU7WUFDMUIsbUNBQW1DO1lBQ25DLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7YUFBTSxJQUFJLFdBQVcsR0FBRyxHQUFHLEVBQUU7WUFDMUIsbUNBQW1DO1lBQ25DLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDYjtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSwyQkFBUSxHQUFmLFVBQWdCLEtBQWU7UUFDM0IsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztlQUN4QyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSw2QkFBVSxHQUFqQixVQUFrQixLQUFlO1FBQzdCLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7O09BR0c7SUFDSSxrQ0FBZSxHQUF0Qjs7UUFDSSxPQUFPLENBQUMsV0FBSSxDQUFDLFdBQVcsRUFBRSwwQ0FBRSxJQUFJLEtBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUwsZUFBQztBQUFELENBQUM7QUExY1ksNEJBQVE7Ozs7Ozs7Ozs7Ozs7O0FDM0JyQixpR0FBbUQ7QUFDbkQsbUdBQWtEO0FBRWxELHlGQUEyRTtBQUMzRSxnR0FBZ0Q7QUFDaEQsdUZBQTBDO0FBQzFDLDBGQUE0QztBQUU1QyxJQUFpQixXQUFXLENBdXZCM0I7QUF2dkJELFdBQWlCLFdBQVc7SUFDeEI7Ozs7T0FJRztJQUNILFNBQVMsY0FBYyxDQUFDLElBQVU7O1FBQzlCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3hFLElBQU0sSUFBSSxHQUFHLElBQW1CLENBQUM7UUFDakMsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7UUFDN0MsSUFBTSxJQUFJLEdBQUcsV0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQywwQ0FBRSxPQUFPLENBQUM7UUFDbkQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNsRCxJQUFJLElBQUksS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFO1lBQ3BELDBDQUEwQztZQUMxQyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFO2dCQUNyRixPQUFPLEtBQUssQ0FBQzthQUNoQjtTQUNKO1FBQ0QsSUFBSSxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssTUFBTSxFQUFFO1lBQ2pELElBQUksSUFBSSxHQUFHLElBQUkscUJBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtRQUNELE9BQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxTQUFnQixXQUFXLENBQUMsT0FBb0I7O1FBQzVDLHFFQUFxRTtRQUNyRSxJQUFJLFFBQVEsR0FBRyxhQUFPLENBQUMsV0FBVyxtQ0FBSSxFQUFFLENBQUM7UUFDekMsSUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0Qyx3Q0FBd0M7UUFDeEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsT0FBTyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtZQUFFLEtBQUssRUFBRSxDQUFDO1FBQ3pFLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sR0FBRyxJQUFJLEtBQUssSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtZQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzFELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFWZSx1QkFBVyxjQVUxQjtJQUVEOzs7T0FHRztJQUNILFNBQVMsWUFBWSxDQUFDLElBQVU7UUFDNUIsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSyxJQUFvQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUM7SUFDekYsQ0FBQztJQUVELFNBQVMsbUJBQW1CLENBQUMsSUFBVTtRQUNuQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzlDLElBQU0sSUFBSSxHQUFHLElBQW1CLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEQsSUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUM5RCxDQUFDO0lBRUQsU0FBUyxrQkFBa0IsQ0FBQyxJQUFVO1FBQ2xDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDL0MsSUFBTSxJQUFJLEdBQUcsSUFBbUIsQ0FBQztRQUNqQyxJQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELE9BQU8sZ0JBQWdCLEtBQUssSUFBSSxJQUFJLGdCQUFnQixHQUFHLENBQUMsSUFBSSx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsU0FBUyx1QkFBdUIsQ0FBQyxJQUFVO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDL0MsSUFBTSxJQUFJLEdBQUcsSUFBbUIsQ0FBQztRQUNqQyxJQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLElBQUksZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLElBQUksdUJBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELFNBQVMsb0JBQW9CLENBQUMsdUJBQXVDO1FBQXZDLHdFQUF1QztRQUNqRSxPQUFPLFVBQUMsS0FBYSxFQUFFLFNBQWtCLEVBQUUsSUFBVTtZQUNqRCxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksU0FBUyxJQUFJLHVCQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzdGLE9BQU8sdUJBQXVCLElBQUksdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxTQUE0QixFQUFFLFFBQWU7UUFDekUsSUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsYUFBYSxLQUFJLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxRQUFRLENBQUM7UUFDcEUsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNyQixJQUFJLE1BQU0sR0FBRyxJQUFJLG1CQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxJQUFJLGVBQWUsR0FBZSxFQUFFLENBQUM7UUFDckMsSUFBSSxhQUFhLEdBQWUsRUFBRSxDQUFDO1FBRW5DLElBQU0sU0FBUyxHQUFHLFVBQUMsTUFBZ0I7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUFFLE9BQU87WUFDL0UsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtnQkFDdEMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUN4QztpQkFBTSxJQUFJLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO2dCQUNsRCxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ3RDO1FBQ0wsQ0FBQyxDQUFDO1FBRUYsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFNLFdBQUksRUFBSixDQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDdEMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JCO1FBRUQsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3RCLElBQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM3QixJQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0IsSUFBTSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xELElBQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxJQUFJLFNBQVMsS0FBSyxTQUFTO2dCQUFFLE9BQU8sU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUMxRCxPQUFPLG1CQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLGlCQUFpQixDQUFDLE9BQW1CLEVBQUUsTUFBZ0I7UUFDNUQsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFNLElBQUksMEJBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBdEMsQ0FBc0MsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBZ0IsWUFBWSxDQUFDLElBQW9CO1FBQzdDLFFBQVEsSUFBSSxFQUFFO1lBQ1YsS0FBSyxNQUFNO2dCQUNQLE9BQU8sVUFBQyxJQUFZLEVBQUUsU0FBa0IsSUFBSyxRQUFDLFNBQVMsSUFBSSxJQUFJLEtBQUssTUFBTSxDQUFDLEVBQTlCLENBQThCLENBQUM7WUFDaEYsS0FBSyxXQUFXO2dCQUNaLE9BQU8sb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsS0FBSyxTQUFTO2dCQUNWLE9BQU8sVUFBQyxJQUFZLEVBQUUsU0FBa0IsSUFBSyxRQUFDLFNBQVMsSUFBSSxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQWpDLENBQWlDLENBQUM7WUFDbkYsS0FBSyxJQUFJO2dCQUNMLE9BQU8sVUFBQyxJQUFZLEVBQUUsU0FBa0IsRUFBRSxJQUFVLElBQUssUUFBQyxTQUFTLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSyxJQUFvQixDQUFDLFNBQVMsS0FBSyxHQUFHLENBQUMsRUFBNUUsQ0FBNEUsQ0FBQztZQUMxSSxLQUFLLElBQUk7Z0JBQ0wsT0FBTyxVQUFDLElBQVksRUFBRSxTQUFrQixFQUFFLElBQVUsSUFBSyxRQUFDLFNBQVMsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFLLElBQW9CLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxFQUE1RSxDQUE0RSxDQUFDO1lBQzFJLEtBQUssSUFBSTtnQkFDTCxPQUFPLFVBQUMsSUFBWSxFQUFFLFNBQWtCLEVBQUUsSUFBVSxJQUFLLFFBQUMsU0FBUyxJQUFJLElBQUksS0FBSyxTQUFTLElBQUssSUFBb0IsQ0FBQyxTQUFTLEtBQUssR0FBRyxDQUFDLEVBQTVFLENBQTRFLENBQUM7WUFDMUksS0FBSyxJQUFJO2dCQUNMLE9BQU8sVUFBQyxJQUFZLEVBQUUsU0FBa0IsRUFBRSxJQUFVLElBQUssUUFBQyxTQUFTLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSyxJQUFvQixDQUFDLFNBQVMsS0FBSyxHQUFHLENBQUMsRUFBNUUsQ0FBNEUsQ0FBQztZQUMxSSxLQUFLLElBQUk7Z0JBQ0wsT0FBTyxVQUFDLElBQVksRUFBRSxTQUFrQixFQUFFLElBQVUsSUFBSyxRQUFDLFNBQVMsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFLLElBQW9CLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxFQUE1RSxDQUE0RSxDQUFDO1lBQzFJLEtBQUssSUFBSTtnQkFDTCxPQUFPLFVBQUMsSUFBWSxFQUFFLFNBQWtCLEVBQUUsSUFBVSxJQUFLLFFBQUMsU0FBUyxJQUFJLElBQUksS0FBSyxTQUFTLElBQUssSUFBb0IsQ0FBQyxTQUFTLEtBQUssR0FBRyxDQUFDLEVBQTVFLENBQTRFLENBQUM7WUFDMUksS0FBSyxPQUFPO2dCQUNSLE9BQU8sVUFBQyxJQUFZLEVBQUUsU0FBa0IsSUFBSyxRQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUExRCxDQUEwRCxDQUFDO1lBQzVHLEtBQUssT0FBTztnQkFDUixPQUFPLFVBQUMsSUFBWSxFQUFFLFNBQWtCLElBQUssUUFBQyxTQUFTLElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQyxFQUEvQixDQUErQixDQUFDO1lBQ2pGLEtBQUssUUFBUTtnQkFDVCxPQUFPLFVBQUMsSUFBWSxFQUFFLFNBQWtCLElBQUssUUFBQyxTQUFTLElBQUksSUFBSSxLQUFLLFFBQVEsQ0FBQyxFQUFoQyxDQUFnQyxDQUFDO1lBQ2xGLEtBQUssVUFBVTtnQkFDWCxPQUFPLFVBQUMsSUFBWSxFQUFFLFNBQWtCLElBQUssUUFBQyxTQUFTLElBQUksSUFBSSxLQUFLLFVBQVUsQ0FBQyxFQUFsQyxDQUFrQyxDQUFDO1lBQ3BGLEtBQUssT0FBTztnQkFDUixPQUFPLFVBQUMsSUFBWSxFQUFFLFNBQWtCLElBQUssUUFBQyxTQUFTLElBQUksSUFBSSxLQUFLLFVBQVUsQ0FBQyxFQUFsQyxDQUFrQyxDQUFDO1lBQ3BGLEtBQUssTUFBTTtnQkFDUCxPQUFPLFVBQUMsSUFBWSxFQUFFLFNBQWtCLElBQUssUUFBQyxTQUFTLElBQUksSUFBSSxLQUFLLE1BQU0sQ0FBQyxFQUE5QixDQUE4QixDQUFDO1lBQ2hGLEtBQUssVUFBVTtnQkFDWCxPQUFPLFVBQUMsSUFBWSxFQUFFLFNBQWtCLElBQUssUUFBQyxTQUFTLElBQUksSUFBSSxLQUFLLFVBQVUsQ0FBQyxFQUFsQyxDQUFrQyxDQUFDO1lBQ3BGLEtBQUssU0FBUztnQkFDVixPQUFPLFVBQUMsSUFBWSxFQUFFLFNBQWtCLElBQUssUUFBQyxTQUFTLElBQUksSUFBSSxLQUFLLFNBQVMsQ0FBQyxFQUFqQyxDQUFpQyxDQUFDO1lBQ25GLEtBQUssT0FBTztnQkFDUixPQUFPLFVBQUMsSUFBWSxFQUFFLFNBQWtCLElBQUssUUFBQyxTQUFTLElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQyxFQUEvQixDQUErQixDQUFDO1lBQ2pGLEtBQUssV0FBVztnQkFDWixPQUFPLFVBQUMsS0FBYSxFQUFFLFNBQWtCLEVBQUUsSUFBVSxJQUFLLFFBQUMsU0FBUyxJQUFLLElBQW9CLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFuRSxDQUFtRSxDQUFDO1lBQ2xJLEtBQUssS0FBSztnQkFDTixPQUFPLGNBQU0sV0FBSSxFQUFKLENBQUksQ0FBQztZQUN0QixLQUFLLE1BQU07Z0JBQ1AsT0FBTyxVQUFDLE1BQXNCLEVBQUUsU0FBa0IsRUFBRSxJQUFVO29CQUMxRCxJQUFJLENBQUMsU0FBUzt3QkFBRSxPQUFPLEtBQUssQ0FBQztvQkFDN0IsNkRBQTZEO29CQUM3RCxvRUFBb0U7b0JBQ3BFLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUssSUFBb0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUTt3QkFBRSxPQUFPLEtBQUssQ0FBQztvQkFDbkcsb0VBQW9FO29CQUNwRSxvRUFBb0U7b0JBQ3BFLHlDQUF5QztvQkFDekMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDO3dCQUFFLE9BQU8sSUFBSSxDQUFDO29CQUNwQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUM7d0JBQUUsT0FBTyxJQUFJLENBQUM7b0JBQ3RDLElBQU0sSUFBSSxHQUFHLElBQUkscUJBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTt3QkFDakMsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNwQztvQkFDRCxPQUFPLEtBQUssQ0FBQztnQkFDakIsQ0FBQztZQUNMLEtBQUssUUFBUTtnQkFDVCxPQUFPLFVBQUMsSUFBWSxFQUFFLFNBQWtCLEVBQUUsSUFBVTs7b0JBQ2hELElBQUksQ0FBQyxTQUFTO3dCQUFFLE9BQU8sS0FBSyxDQUFDO29CQUM3QixJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO3dCQUFFLE9BQU8sSUFBSSxDQUFDO29CQUNsRyxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksS0FBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFFBQVEsTUFBSyxDQUFDO3dCQUFFLE9BQU8sS0FBSyxDQUFDO29CQUM1RCxPQUFPLENBQUMsQ0FBQyxzQ0FBVyxDQUFDLHFCQUFxQixDQUFDLElBQW1CLENBQUMsMENBQUUsSUFBSSwwQ0FBRSxJQUFJLEVBQUUsRUFBQztnQkFDbEYsQ0FBQyxDQUFDO1lBQ04sS0FBSyxhQUFhLENBQUM7WUFDbkIsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssT0FBTyxDQUFDO1lBQ2IsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxZQUFZLENBQUM7WUFDbEIsS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxXQUFXO2dCQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUMxQztJQUNMLENBQUM7SUE3RWUsd0JBQVksZUE2RTNCO0lBQ0Q7Ozs7T0FJRztJQUNILElBQU0sYUFBYSxHQUFHLFVBQUMsT0FBb0I7UUFDdkMsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25DLE9BQU8sSUFBSSxZQUFZLFVBQVUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFNLGtCQUFrQixHQUFHLFVBQUMsTUFBZ0I7UUFDeEMsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLEtBQUssSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDN0MsSUFBSSxNQUFNLEdBQTBELElBQUksQ0FBQztRQUN6RSxJQUFJO1lBQ0EsSUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUMzQyxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDL0IsSUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25DLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFN0IsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0IscUNBQXFDO1lBQ3JDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztnQkFBRSxPQUFPLE1BQU0sR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ3pGLGlDQUFpQztZQUNqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztnQkFBRSxPQUFPLE1BQU0sR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBRTFGLG9FQUFvRTtZQUNwRSxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUU7Z0JBQ2hCLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPLE1BQU0sR0FBRyxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDbkg7WUFDRCw0Q0FBNEM7WUFFNUMscUJBQXFCO1lBRXJCLG9GQUFvRjtZQUNwRixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQUUsT0FBTyxNQUFNLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUU5RywyQ0FBMkM7WUFDM0MsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztnQkFBRSxPQUFPLE1BQU0sR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1lBRTVGLGdGQUFnRjtZQUNoRix1RkFBdUY7WUFFdkYsd0VBQXdFO1lBQ3hFLHlGQUF5RjtZQUN6Rix3RkFBd0Y7WUFDeEYsSUFBTSxtQkFBbUIsR0FBRyxXQUFXLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUUzRiwwR0FBMEc7WUFDMUcsMEJBQTBCO1lBQzFCLElBQU0sV0FBVyxHQUFHLG1CQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25ELElBQU0sc0JBQXNCLEdBQUcsV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLEtBQUssTUFBTSxDQUFDO1lBRW5GLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDdEIsd0RBQXdEO2dCQUN4RCxJQUFJLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO29CQUFFLE9BQU8sTUFBTSxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMxRyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO29CQUFFLE9BQU8sTUFBTSxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO2FBQ3pHO2lCQUFNO2dCQUNILHNFQUFzRTtnQkFDdEUsSUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BELElBQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUVuRCxtR0FBbUc7Z0JBQ25HLElBQUksUUFBUSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDOUQsNEZBQTRGO29CQUM1RixJQUFJLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO3dCQUFFLE9BQU8sTUFBTSxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7b0JBQ2hHLElBQUksQ0FBQyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7d0JBQUUsT0FBTyxNQUFNLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztpQkFDL0Y7cUJBQU0sSUFBSSxzQkFBc0IsRUFBRTtvQkFDL0Isd0ZBQXdGO29CQUN4Riw0REFBNEQ7b0JBQzVELG1FQUFtRTtpQkFDdEU7cUJBQU07b0JBQ0gsbUZBQW1GO29CQUNuRixJQUFNLE1BQUksR0FBRyxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLE1BQUksS0FBSyxLQUFLLElBQUksTUFBSSxLQUFLLG1CQUFtQixDQUFDLElBQUksaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDdEYsT0FBTyxNQUFNLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztxQkFDN0Q7b0JBQ0QsaUZBQWlGO2lCQUNwRjthQUNKO1lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU07Z0JBQUUsT0FBTyxNQUFNLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUV4RywwRkFBMEY7WUFDMUYsc0ZBQXNGO1lBQ3RGLHFCQUFxQjtZQUNyQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxFQUFFO2dCQUN6QyxJQUNJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO3VCQUNyQixRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7dUJBQ2pELFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxRQUFRLEVBQ3hGO29CQUNFLE9BQU8sTUFBTSxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUM7aUJBQzlEO3FCQUFNO29CQUNILElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMseVBBQXlQLENBQUMsQ0FBQztvQkFDcFMsSUFBSSxhQUFhLElBQUssYUFBNkIsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssUUFBUSxFQUFFO3dCQUNuRixPQUFPLE1BQU0sR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDO3FCQUM5RDtvQkFDRCxtRkFBbUY7b0JBQ25GLG1GQUFtRjtvQkFDbkYseUNBQXlDO29CQUN6QyxJQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxJQUFJLEVBQUUsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLDhCQUFzQixFQUFFLFFBQUksQ0FBQyxFQUFFO3dCQUM1RCxPQUFPLE1BQU0sR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDO3FCQUM5RDtpQkFDSjthQUNKO1lBRUQsMkVBQTJFO1lBQzNFLHFGQUFxRjtZQUNyRixzRUFBc0U7WUFDdEU7Z0JBQ0ksSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQXVCLENBQUM7Z0JBQ2xFLElBQU0sY0FBYyxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoRSxJQUNJLFFBQVE7dUJBQ0wsY0FBYzt1QkFDZCxRQUFRLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQzt1QkFDdkMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssUUFBUTt1QkFDekUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlEQUFpRCxDQUFDLEVBQ3JFO29CQUNFLE9BQU8sTUFBTSxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO2lCQUN2RTthQUNKO1lBRUQsSUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRW5DLHFGQUFxRjtZQUNyRix1RkFBdUY7WUFDdkYsNkNBQTZDO1lBQzdDLElBQUksSUFBSSxLQUFLLFVBQVU7bUJBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUTttQkFDeEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPO21CQUN2QyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFDdkI7Z0JBQ0UsT0FBTyxNQUFNLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUM5RDtZQUVELDBFQUEwRTtZQUMxRSxJQUFJLG1CQUFRLENBQUMsa0NBQWtDLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25ELE9BQU8sTUFBTSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7YUFDOUQ7WUFDRCxxRUFBcUU7WUFDckUsNkVBQTZFO1lBQzdFLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN2SSxzRUFBc0U7Z0JBQ3RFLElBQUksbUJBQW1CLElBQUksbUJBQW1CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUN0SSx5RUFBeUU7aUJBQzVFO3FCQUFNO29CQUNILE9BQU8sTUFBTSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQzlEO2FBQ0o7WUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxFQUFFO2dCQUMxQyxJQUFJLFFBQU0sR0FBRyxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDdkQsT0FBTyxRQUFNLEVBQUU7b0JBQ1gsSUFBSSxRQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFVBQVUsRUFBRTt3QkFDOUMsK0NBQStDO3dCQUMvQyxPQUFPLE1BQU0sR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO3FCQUM5RDtvQkFDRCxRQUFNLEdBQUcscUJBQVMsQ0FBQyxhQUFhLENBQUMsUUFBTSxDQUFDLENBQUM7aUJBQzVDO2FBQ0o7WUFDRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sRUFBRTtnQkFDaEQsT0FBTyxNQUFNLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUM5RDtZQUVELGtFQUFrRTtZQUNsRSxpRUFBaUU7WUFDakUsK0JBQStCO1lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLEVBQUU7Z0JBQ2pFLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQ3pDLElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUyxFQUFFO29CQUNyRSxPQUFPLE1BQU0sR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUM5RDthQUNKO1lBRUQsMkRBQTJEO1lBQzNELG9FQUFvRTtZQUNwRSxzRUFBc0U7WUFDdEUsc0VBQXNFO1lBQ3RFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO21CQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUzttQkFDekMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUM3QjtnQkFDRSxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLGVBQWUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQzFELE9BQU8sTUFBTSxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQzdEO2FBQ0o7WUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFBRTtnQkFDbEMsT0FBTyxNQUFNLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUM3RDtZQUVELGlGQUFpRjtZQUNqRixzRkFBc0Y7WUFDdEYsb0VBQW9FO1lBQ3BFLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDdEMsSUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxFQUFFLEVBQUU7b0JBQ0osSUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyw0QkFBb0IsRUFBRSxRQUFJLENBQXVCLENBQUM7b0JBQ3ZGLElBQUksS0FBSyxJQUFJLG1CQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLFVBQVUsRUFBRTt3QkFDekQsT0FBTyxNQUFNLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztxQkFDN0Q7aUJBQ0o7YUFDSjtZQUVELE9BQU8sTUFBTSxHQUFHLElBQUksQ0FBQztTQUN4QjtnQkFBUztZQUNOLEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2xELEtBQUssSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDL0I7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFNLG9CQUFvQixHQUFHLFVBQUMsTUFBZ0I7UUFDMUMsSUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUMzQyxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDakMscUNBQXFDO1FBQ3JDLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUN4RixJQUFJLFFBQVEsS0FBSyxDQUFDO1lBQUUsT0FBTyxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEgscUJBQXFCO1FBQ3JCLElBQUksaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDdkYscUVBQXFFO1FBQ3JFLHNFQUFzRTtRQUN0RSx3RUFBd0U7UUFDeEUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDckQ7UUFDRCw0REFBNEQ7UUFDNUQsc0ZBQXNGO1FBQ3RGLHFCQUFxQjtRQUNyQixJQUNJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTztlQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztlQUN4QixRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7ZUFDakQsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFFBQVEsRUFDeEY7WUFDRSxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDckQ7UUFFRCwyRUFBMkU7UUFDM0UscUZBQXFGO1FBQ3JGLHNFQUFzRTtRQUN0RTtZQUNJLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUF1QixDQUFDO1lBQ2xFLElBQU0sY0FBYyxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hFLElBQ0ksUUFBUTttQkFDTCxjQUFjO21CQUNkLFFBQVEsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDO21CQUN2QyxRQUFRLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxRQUFRO21CQUN6RSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsaURBQWlELENBQUMsRUFDckU7Z0JBQ0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQzthQUM5RDtTQUNKO1FBRUQsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRTlCLDBFQUEwRTtRQUMxRSxJQUFJLG1CQUFRLENBQUMsa0NBQWtDLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLEVBQUU7WUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3BEO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7WUFDbEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3BEO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFnQixXQUFXLENBQUMsSUFBb0I7UUFDNUMsUUFBUSxJQUFJLEVBQUU7WUFDVixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssTUFBTTtnQkFDUCxPQUFPLGtCQUFrQixDQUFDO1lBQzlCLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLElBQUksQ0FBQztZQUNWLEtBQUssSUFBSSxDQUFDO1lBQ1YsS0FBSyxJQUFJLENBQUM7WUFDVixLQUFLLElBQUksQ0FBQztZQUNWLEtBQUssSUFBSSxDQUFDO1lBQ1YsS0FBSyxJQUFJLENBQUM7WUFDVixLQUFLLE9BQU87Z0JBQ1IsT0FBTyxvQkFBb0IsQ0FBQztZQUNoQyxLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLFdBQVcsQ0FBQztZQUNqQixLQUFLLEtBQUssQ0FBQztZQUNYLEtBQUssYUFBYSxDQUFDO1lBQ25CLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssWUFBWSxDQUFDO1lBQ2xCLEtBQUssV0FBVyxDQUFDO1lBQ2pCLEtBQUssV0FBVyxDQUFDO1lBQ2pCLEtBQUssV0FBVztnQkFDWixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDMUM7SUFDTCxDQUFDO0lBckNlLHVCQUFXLGNBcUMxQjtJQUdEOzs7OztPQUtHO0lBQ0gsU0FBZ0IsV0FBVyxDQUFDLElBQW9CLEVBQUUsTUFBZ0I7UUFDOUQsSUFBTSxTQUFTLEdBQUcsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RixJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUU7WUFDbkUsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDekI7YUFBTTtZQUNILE9BQU8sWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNyQztJQUNMLENBQUM7SUFQZSx1QkFBVyxjQU8xQjtJQUNEOzs7OztPQUtHO0lBQ0gsU0FBZ0IsY0FBYyxDQUFDLElBQW9CLEVBQUUsTUFBZ0I7UUFDakUsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ2pCLDJFQUEyRTtZQUMzRSw0RUFBNEU7WUFDNUUsc0RBQXNEO1lBQ3RELElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUN0RCxJQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBaUIsQ0FBQyxDQUFDO2dCQUMzRCxJQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztnQkFDaEYseUVBQXlFO2dCQUN6RSx5RUFBeUU7Z0JBQ3pFLDhEQUE4RDtnQkFDOUQsSUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNqQyxTQUFTLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQztnQkFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3RCO1lBQ0QsSUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN2QyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ25DO2FBQU07WUFDSCxJQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEMsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVCLElBQUksUUFBUSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDOUQsb0NBQW9DO2dCQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQU0sV0FBSSxFQUFKLENBQUksQ0FBQyxDQUFDO2FBQzNCO2lCQUFNO2dCQUNILDJCQUEyQjtnQkFDM0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFNLFdBQUksRUFBSixDQUFJLENBQUMsQ0FBQzthQUMzQjtZQUVELElBQU0sVUFBVSxHQUFlLEVBQUUsQ0FBQztZQUNsQyxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sT0FBTyxJQUFJLG1CQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3JELFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pCLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ3ZDO1lBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QixPQUFPLElBQUksS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7U0FDakg7SUFDTCxDQUFDO0lBdENlLDBCQUFjLGlCQXNDN0I7SUFFRDs7Ozs7T0FLRztJQUNILFNBQWdCLFFBQVEsQ0FBQyxJQUFvQixFQUFFLE1BQWdCO1FBQzNELElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNwQixLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUMsSUFBRyxFQUFDLEdBQUUsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM1RixJQUFJO1lBQ0EsSUFBSSxJQUFJLEtBQUssV0FBVyxFQUFFO2dCQUN0QixJQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyRCxJQUFNLGVBQWUsR0FBRyxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDcEYsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDNUIsc0RBQXNEO29CQUN0RCxJQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQywrQkFBK0IsRUFBRSxDQUFDO29CQUM3RSxJQUFNLHFCQUFxQixHQUFHLDJCQUEyQixJQUFJLGlCQUFpQixDQUFDLGVBQWUsRUFBRSwyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDakwsSUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUMsZUFBZSxFQUFFLHFCQUFxQixDQUFDLENBQUM7b0JBQy9FLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRTt3QkFDbkIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUU7NEJBQzNDLE9BQU8sZUFBZSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt5QkFDcEQ7d0JBQ0QsT0FBTyxJQUFJLENBQUM7cUJBQ2Y7b0JBQ0QsT0FBTyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQ3JDO2FBQ0o7WUFFRCxJQUFJLElBQUksS0FBSyxNQUFNLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUN6RSxJQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBaUIsQ0FBQyxDQUFDO2dCQUUzRCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFO29CQUNuQyx3REFBd0Q7b0JBQ3hELElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ2xCLElBQUksUUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDNUIsUUFBTSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7d0JBQ3hCLE9BQU8sUUFBTSxDQUFDO3FCQUNqQjtvQkFDRCwwREFBMEQ7aUJBQzdEO3FCQUFNO29CQUNILDJEQUEyRDtvQkFDM0QsSUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztvQkFDM0MsSUFBSSxjQUFjLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUU7d0JBQ25DLElBQUksUUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDNUIsUUFBTSxDQUFDLFlBQVksR0FBRyxjQUFjLEdBQUcsQ0FBQyxDQUFDO3dCQUN6QyxPQUFPLFFBQU0sQ0FBQztxQkFDakI7b0JBQ0QsK0RBQStEO29CQUMvRCxzRUFBc0U7b0JBQ3RFLHlFQUF5RTtvQkFDekUsK0JBQStCO29CQUMvQixJQUFJLFFBQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQzVCLFFBQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3ZCLElBQU0sV0FBUyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckMsSUFBTSxVQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuQyxJQUFJLFFBQU0sQ0FBQyxJQUFJLENBQUMsV0FBUyxFQUFFLFVBQVEsQ0FBQyxFQUFFO3dCQUNsQyxJQUFJLFlBQVksQ0FBQyxRQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRTs0QkFDdEQsUUFBTSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxtQkFBbUI7eUJBQ3ZEO3dCQUNELE9BQU8sUUFBTSxDQUFDO3FCQUNqQjtvQkFDRCxPQUFPLElBQUksQ0FBQztpQkFDZjthQUNKO1lBRUQsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVCLElBQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxJQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDbEMsMkVBQTJFO2dCQUMzRSwyRUFBMkU7Z0JBQzNFLGlEQUFpRDtnQkFDakQsSUFBSSxJQUFJLEtBQUssTUFBTSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRTtvQkFDekUsTUFBTSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7aUJBQ25DO2dCQUNELEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM3RCxPQUFPLE1BQU0sQ0FBQzthQUNqQjtpQkFBTTtnQkFDSCxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7Z0JBQVM7WUFDTixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDdEI7SUFDTCxDQUFDO0lBN0VlLG9CQUFRLFdBNkV2QjtJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxTQUFnQixZQUFZLENBQUMsSUFBb0IsRUFBRSxNQUFnQjtRQUMvRCxJQUFJLElBQUksS0FBSyxXQUFXLEVBQUU7WUFDdEIsSUFBSSxRQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVCLElBQU0sV0FBUyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxJQUFNLFVBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsSUFBSSxRQUFNLENBQUMsUUFBUSxDQUFDLFdBQVMsRUFBRSxVQUFRLENBQUMsRUFBRTtnQkFDdEMsT0FBTyxRQUFNLENBQUM7YUFDakI7WUFFRCxJQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JELElBQU0sZUFBZSxHQUFHLHNCQUFzQixDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLElBQU0sMkJBQTJCLEdBQUcsTUFBTSxDQUFDLCtCQUErQixFQUFFLENBQUM7Z0JBQzdFLElBQU0scUJBQXFCLEdBQUcsMkJBQTJCLElBQUksaUJBQWlCLENBQUMsZUFBZSxFQUFFLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNqTCxJQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUscUJBQXFCLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFO29CQUNsQixPQUFPLGVBQWUsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQ3BEO2FBQ0o7WUFDRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxJQUFJLEtBQUssTUFBTSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUN6RSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFO2dCQUNuQyx1RUFBdUU7Z0JBQ3ZFLG9EQUFvRDthQUN2RDtpQkFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEtBQUssQ0FBQyxFQUFFO2dCQUNsQyx3REFBd0Q7Z0JBQ3hELElBQUksUUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDNUIsUUFBTSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7Z0JBQ2hDLE9BQU8sUUFBTSxDQUFDO2FBQ2pCO2lCQUFNO2dCQUNILHFCQUFxQjtnQkFDckIsSUFBSSxRQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM1QixRQUFNLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QyxPQUFPLFFBQU0sQ0FBQzthQUNqQjtTQUNKO1FBRUQsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLElBQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUN0QyxrRUFBa0U7WUFDbEUsSUFBSSxJQUFJLEtBQUssTUFBTSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDekUsSUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQWlCLENBQUMsQ0FBQztnQkFDM0QsTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzthQUN6RTtZQUNELE9BQU8sTUFBTSxDQUFDO1NBQ2pCO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQXBEZSx3QkFBWSxlQW9EM0I7QUFFTCxDQUFDLEVBdnZCZ0IsV0FBVyxHQUFYLG1CQUFXLEtBQVgsbUJBQVcsUUF1dkIzQjs7Ozs7Ozs7Ozs7Ozs7QUMvdkJELDBGQUE0QztBQUM1QyxrR0FBNEM7QUFFNUMseUZBQXNDO0FBQ3RDLDJHQUF1RjtBQUN2Riw2R0FBNEQ7QUFFNUQ7Ozs7Ozs7R0FPRztBQUNILElBQWlCLFVBQVUsQ0ErSjFCO0FBL0pELFdBQWlCLFVBQVU7SUFDdkI7Ozs7Ozs7Ozs7T0FVRztJQUNILFNBQWdCLFdBQVcsQ0FBQyxJQUE4QixFQUFFLE1BQWdCLEVBQUUsU0FBb0I7UUFDOUYsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLEtBQW1CLFVBQXFCLEVBQXJCLDhEQUFxQixFQUFyQixtQ0FBcUIsRUFBckIsSUFBcUIsRUFBRTtZQUFyQyxJQUFNLElBQUk7WUFDWCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0MsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxPQUFPLENBQUMsS0FBSyxXQUFXLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDeEMsT0FBTyxDQUFDLENBQUM7YUFDWjtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQVZlLHNCQUFXLGNBVTFCO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsU0FBZ0IsV0FBVyxDQUFDLElBQW9CLEVBQUUsTUFBZ0IsRUFBRSxTQUFvQjtRQUNwRixLQUFtQixVQUFvQixFQUFwQiw0REFBb0IsRUFBcEIsa0NBQW9CLEVBQXBCLElBQW9CLEVBQUU7WUFBcEMsSUFBTSxJQUFJO1lBQ1gsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLElBQUksT0FBTyxDQUFDLEtBQUssV0FBVyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3hDLE9BQU8sQ0FBQyxDQUFDO2FBQ1o7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFSZSxzQkFBVyxjQVExQjtJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILFNBQWdCLGFBQWEsQ0FBQyxJQUFvQixFQUFFLE1BQWdCLEVBQUUsZ0JBQWtDO1FBQ3BHLElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxtR0FBa0c7UUFDdEgsSUFBSSxhQUFhLEdBQUcseUJBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFaEMsSUFBSSxZQUFZLEdBQUcseUJBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDNUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7UUFDRCxLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLFVBQVUsRUFBRSxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLGFBQUcsSUFBSSxVQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRSxFQUF2QixDQUF1QixDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxhQUFHLElBQUksVUFBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBcEIsQ0FBb0IsQ0FBQyxDQUFDLENBQUM7UUFFOUgsSUFBSSxXQUFXLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLEtBQXlCLFVBQVksRUFBWiw2QkFBWSxFQUFaLDBCQUFZLEVBQVosSUFBWSxFQUFFO1lBQWxDLElBQUksWUFBWTtZQUNqQixJQUFJLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNuRixJQUFJLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3RDLFdBQVcsR0FBRyxZQUFZLENBQUM7Z0JBQzNCLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztnQkFDL0IsTUFBTTthQUNUO1NBQ0o7UUFDRCxJQUFJLFNBQVMsS0FBSyxFQUFFLEVBQUU7WUFDbEIsU0FBUyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztTQUN4RTtRQUNELEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN4QyxPQUFPO1lBQ0gsS0FBSyxFQUFFLGFBQWE7WUFDcEIsR0FBRyxFQUFFLFdBQVc7WUFDaEIsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7U0FDdkk7SUFDTCxDQUFDO0lBL0JlLHdCQUFhLGdCQStCNUI7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsU0FBZ0IsV0FBVyxDQUFDLElBQW9CLEVBQUUsYUFBdUIsRUFBRSxXQUFxQjs7UUFDNUYsSUFBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZDLElBQUksUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM1QixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxXQUFXLEdBQVMsSUFBSSxDQUFDO1FBQzdCLE9BQU8sU0FBUyxFQUFFO1lBQ2QsSUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JDLElBQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQy9CLElBQUksVUFBVSxHQUFhLEVBQUUsQ0FBQztZQUM5QixJQUFJLFVBQVUsR0FBRyxtQkFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEUsSUFBSSxVQUFVLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBSSxtQkFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsRUFBRSwwQ0FBRSxRQUFRLENBQUMsRUFBRTtnQkFDL0YsbURBQW1EO2dCQUNuRCxVQUFVLEdBQUcsSUFBSSxDQUFDO2FBQ3JCO1lBQ0QsS0FBbUIsVUFBUSxFQUFSLG9DQUFRLEVBQVIsc0JBQVEsRUFBUixJQUFRLEVBQUU7Z0JBQXhCLElBQU0sSUFBSTtnQkFDWCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxPQUFPLENBQUMsS0FBSyxXQUFXLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDL0QsSUFBSSxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEtBQUssTUFBTSxFQUFFO3dCQUMzRixDQUFDLEdBQUcsWUFBWSxHQUFDLENBQUMsQ0FBQztxQkFDdEI7b0JBQ0QsZUFBZTtvQkFDZixJQUFJLElBQUksS0FBSyxXQUFXLEVBQUU7d0JBQ3RCLHFCQUFxQjt3QkFDckIsSUFBSSxXQUFXLElBQUksQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsSUFBSSxXQUFXLEtBQUssVUFBVSxDQUFDLENBQUMsRUFBRTs0QkFDNUUsdUdBQXVHOzRCQUN2RyxDQUFDLEdBQUcsVUFBRyxDQUFDLGNBQUksZ0NBQW1CLEVBQUMsSUFBSSxtQkFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUM7eUJBQ3ZFO3FCQUNKO3lCQUFNO3dCQUNILElBQUksVUFBVSxJQUFJLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLEtBQUssVUFBVSxDQUFDLENBQUMsRUFBRTs0QkFDOUQsb0ZBQW9GOzRCQUNwRixDQUFDLEdBQUcsVUFBRyxnQ0FBbUIsRUFBQyxJQUFJLG1CQUFRLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLGNBQUksQ0FBQyxDQUFFLENBQUM7eUJBQ3RFO3FCQUVKO29CQUNELElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDVixXQUFXLEdBQUcsVUFBVSxDQUFDO3dCQUN6QixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNwQjtvQkFDRCxNQUFNO2lCQUNUO2FBQ0o7WUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBQyxJQUFJLFFBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFuQixDQUFtQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BFLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQU0sV0FBSSxFQUFKLENBQUksRUFBRSx5QkFBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLG1CQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDM0g7UUFDRCxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksV0FBVyxFQUFFO1lBQ3JDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBRyxnQ0FBbUIsRUFBQyxJQUFJLG1CQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDO1NBQzdFO1FBQ0QsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFDLElBQUksUUFBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQW5CLENBQW1CLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLEVBQUUsVUFBQyxLQUFLLEVBQUUsZUFBZTtZQUMxRSxJQUFNLFVBQVUsR0FBRyxZQUFJLGVBQWUsT0FBRyxDQUFDO1lBQzFDLElBQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQUssVUFBVSxDQUFFLENBQUM7UUFDcEgsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvQyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBeERlLHNCQUFXLGNBd0QxQjtBQUVMLENBQUMsRUEvSmdCLFVBQVUsR0FBVixrQkFBVSxLQUFWLGtCQUFVLFFBK0oxQjs7Ozs7Ozs7Ozs7Ozs7QUMzS0Q7SUFDSSx3QkFBb0IsY0FLbkI7UUFMbUIsbUJBQWMsR0FBZCxjQUFjLENBS2pDO0lBRUQsQ0FBQztJQUVNLDZCQUFJLEdBQVgsVUFBWSxJQUFvQixFQUFFLE1BQWdCLEVBQUUsU0FBb0I7UUFDcEUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2VBQ3JDLENBQ0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQzttQkFDakQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FDakYsRUFDSDtZQUNFLEtBQW1CLFVBQXlCLEVBQXpCLFNBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUF6QixjQUF5QixFQUF6QixJQUF5QixFQUFFO2dCQUF6QyxJQUFNLE1BQUk7Z0JBQ1gsSUFBSSxDQUFDLEdBQUcsTUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3RDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUTtvQkFBRSxPQUFPLENBQUMsQ0FBQzthQUN2QztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNMLHFCQUFDO0FBQUQsQ0FBQztBQXhCWSx3Q0FBYzs7Ozs7Ozs7Ozs7Ozs7QUNIM0IseUZBQXNDO0FBRXRDOzs7O0dBSUc7QUFDSCxJQUFpQixXQUFXLENBNFkzQjtBQTVZRCxXQUFpQixXQUFXO0lBcUJ4Qjs7Ozs7T0FLRztJQUNILFNBQWdCLGdCQUFnQixDQUFDLE1BQWdCO1FBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQ2xFLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzFILENBQUM7SUFOZSw0QkFBZ0IsbUJBTS9CO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFnQiw0QkFBNEIsQ0FBQyxNQUFnQjtRQUN6RCxPQUFPLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRmUsd0NBQTRCLCtCQUUzQztJQUVEOzs7O09BSUc7SUFDSCxTQUFnQixVQUFVLENBQUMsTUFBZ0I7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsSUFBSSxPQUFPLEVBQUU7WUFDVCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM1QjtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQVBlLHNCQUFVLGFBT3pCO0lBRUQ7Ozs7T0FJRztJQUNILFNBQWdCLFVBQVUsQ0FBQyxNQUFnQjtRQUN2QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEMsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRCxJQUFJLE9BQU8sRUFBRTtZQUNULE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0lBUGUsc0JBQVUsYUFPekI7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxTQUFnQixhQUFhLENBQUMsYUFBdUI7UUFDakQsNkNBQTZDO1FBQzdDLElBQUksV0FBVyxHQUFHLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM5QixJQUFJLGVBQWUsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFMUMsSUFBSSxNQUFNLEdBQWUsRUFBRSxDQUFDLENBQUUsMENBQTBDO1FBQ3hFLElBQUksTUFBTSxHQUFhLEVBQUUsQ0FBQyxDQUFJLGtDQUFrQztRQUNoRSxJQUFJLE9BQWlCLENBQUMsQ0FBUSxpREFBaUQ7UUFFL0UseUNBQXlDO1FBQ3pDLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFNLFdBQUksRUFBSixDQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUU7WUFDckcsSUFBSSxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRSxLQUFLLEtBQUssRUFBRTtnQkFDbkUsMERBQTBEO2dCQUMxRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQixPQUFPLEdBQUcsTUFBTSxDQUFDO2dCQUNqQixNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUVaLG9FQUFvRTtnQkFDcEUsa0ZBQWtGO2dCQUNsRixPQUFPLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNO29CQUMxQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUNsRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztpQkFDdkM7YUFDSjtZQUVELCtCQUErQjtZQUMvQixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFJLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxFQUFFO2dCQUNsRSxJQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzVDLDZEQUE2RDtnQkFDN0QsSUFBTSxRQUFRLEdBQWM7b0JBQ3hCLGFBQWEsRUFBRSxNQUFNLENBQUMsTUFBTTtvQkFDNUIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxNQUFNO29CQUM1QixPQUFPLEVBQUUsVUFBVSxDQUFDLGVBQWUsQ0FBQztvQkFDcEMsT0FBTztvQkFDUCxVQUFVLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRTtpQkFDdEMsQ0FBQztnQkFFRixxRUFBcUU7Z0JBQ3JFLEtBQUssSUFBSSxHQUFHLEdBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUU7b0JBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3pCO2dCQUVELDBEQUEwRDtnQkFDMUQsT0FBTyxPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTTtvQkFDMUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDbEcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7aUJBQ3ZDO2FBQ0o7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFuRGUseUJBQWEsZ0JBbUQ1QjtJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILFNBQWdCLFlBQVksQ0FBQyxZQUFzQixFQUFFLFVBQXVCO1FBQ3hFLElBQUksVUFBVSxHQUFHLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDYixVQUFVLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzVDO1FBQ0QsMkRBQTJEO1FBQzNELEtBQUssSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFO1lBQzdELEtBQUssSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFO2dCQUN2RSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFO29CQUNsRSxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDekM7YUFDSjtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQWRlLHdCQUFZLGVBYzNCO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsU0FBb0IsRUFBRSxNQUFjO1FBQ3hFLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQyxhQUFhLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxhQUFhLEdBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUNuRyxDQUFDO0lBRmUsbUNBQXVCLDBCQUV0QztJQUVEOzs7Ozs7T0FNRztJQUNILFNBQWdCLG9CQUFvQixDQUFDLFNBQW9CLEVBQUUsTUFBYztRQUNyRSxPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUMsYUFBYSxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsYUFBYSxHQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDbkcsQ0FBQztJQUZlLGdDQUFvQix1QkFFbkM7SUFFRDs7Ozs7T0FLRztJQUNILFNBQWdCLGFBQWEsQ0FBQyxNQUFnQjtRQUMxQyxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFGZSx5QkFBYSxnQkFFNUI7SUFFRDs7Ozs7T0FLRztJQUNILFNBQWdCLHlCQUF5QixDQUFDLFlBQXNCLEVBQUUsVUFBdUI7UUFDckYsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNiLFVBQVUsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLFVBQVU7Z0JBQUUsT0FBTyxFQUFFLENBQUM7U0FDOUI7UUFDRCxJQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFMUIsSUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTNCLElBQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRXpCLElBQU0sUUFBUSxHQUlULEVBQUUsQ0FBQztRQUNSLEtBQUssSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLGFBQWEsRUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDLGFBQWEsR0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFO1lBQ3JHLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsbUJBQW1CLEVBQUUsRUFBRTtnQkFDdkIsY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLE1BQU07YUFDVCxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksZ0JBQWdCLEdBQWUsRUFBRSxDQUFDO1FBQ3RDLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNsQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztnQkFDL0Msc0NBQXNDO2lCQUNyQyxLQUFLLENBQUMsR0FBRyxDQUFDO2dCQUNYLDJCQUEyQjtpQkFDMUIsR0FBRyxDQUFDLFlBQUUsSUFBSSxlQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUEzQixDQUEyQixDQUFDO2dCQUN2QywwQkFBMEI7aUJBQ3pCLE1BQU0sQ0FBQyxjQUFJLElBQUksUUFBQyxDQUFDLElBQUksRUFBTixDQUFNLENBQUM7Z0JBQ3ZCLDJEQUEyRDtpQkFDMUQsR0FBRyxDQUFDLGNBQUksSUFBSSxXQUFJLG1CQUFRLENBQUMsSUFBSSxDQUFDLEVBQWxCLENBQWtCLENBQUM7Z0JBQ2hDLHdFQUF3RTtpQkFDdkUsTUFBTSxDQUFDLGdCQUFNLElBQUksZUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBTyxJQUFJLDhCQUF1QixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBckYsQ0FBcUYsQ0FBQyxFQUEvRyxDQUErRyxDQUFDO1NBQ3pJO2FBQU07WUFDSCwrQkFBK0I7WUFDL0IsZ0dBQWdHO1lBQ2hHLEtBQUssSUFBSSxNQUFNLEdBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFO3dDQUMxQyxPQUFPO29CQUNkLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7b0JBQzlCLElBQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDN0MsSUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQztvQkFDekMsSUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNqRCw2SUFBNkk7b0JBQzdJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBQyxJQUFJLGtCQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUF6QixDQUF5QixDQUFDLEVBQUU7d0JBQzNILE9BQU8sQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxPQUFPLENBQUMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O3FCQUU3SjtvQkFFRCxJQUFNLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQzlCLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsRUFBRTt3QkFDMUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN6QixPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUN2Qzt5QkFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksRUFBRTt3QkFDakcsSUFBSSxlQUFlLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxlQUFlLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLE1BQU0sRUFBRTs0QkFDckcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUN6QixPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUN2Qzs2QkFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLEVBQUU7NEJBQ2hGLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDekIsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDdkM7cUJBQ0o7eUJBQU07d0JBQ0gsT0FBTyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDN0o7O2dCQXpCTCxLQUFzQixVQUFRLEVBQVIscUJBQVEsRUFBUixzQkFBUSxFQUFSLElBQVE7b0JBQXpCLElBQU0sT0FBTzs0QkFBUCxPQUFPO2lCQTBCakI7YUFDSjtZQUNELEtBQXNCLFVBQVEsRUFBUixxQkFBUSxFQUFSLHNCQUFRLEVBQVIsSUFBUSxFQUFFO2dCQUEzQixJQUFNLE9BQU87Z0JBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUU7b0JBQ3pCLE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7aUJBQ3BDO2FBQ0o7WUFDRCxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsYUFBRyxJQUFJLGVBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQU8sSUFBSSxjQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGFBQUcsSUFBSSxVQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFuQixDQUFtQixDQUFDLEVBQTVELENBQTRELENBQUMsRUFBdEYsQ0FBc0YsQ0FBQztTQUM1STtRQUNELE9BQU8sZ0JBQWdCO1lBQ25CLDJDQUEyQzthQUMxQyxHQUFHLENBQUMsZ0JBQU0sWUFBSSxvQkFBTSxDQUFDLFdBQVcsRUFBRSwwQ0FBRSxJQUFJLEtBQUksRUFBRSxJQUFDO2FBQy9DLEdBQUcsQ0FBQyxXQUFDLElBQUksUUFBQyxDQUFDLElBQUksRUFBRSxFQUFSLENBQVEsQ0FBQzthQUNsQixNQUFNLENBQUMsV0FBQyxJQUFJLFFBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFaLENBQVksQ0FBQzthQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQXBGZSxxQ0FBeUIsNEJBb0Z4QztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsWUFBc0IsRUFBRSxVQUF1QjtRQUNsRixJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2IsVUFBVSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsVUFBVTtnQkFBRSxPQUFPLEVBQUUsQ0FBQztTQUM5QjtRQUNELElBQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUUxQixJQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFM0IsSUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFekIsSUFBTSxRQUFRLEdBSVQsRUFBRSxDQUFDO1FBQ1IsS0FBSyxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsYUFBYSxFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUMsYUFBYSxHQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUU7WUFDckcsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDVixtQkFBbUIsRUFBRSxFQUFFO2dCQUN2QixjQUFjLEVBQUUsS0FBSztnQkFDckIsTUFBTTthQUNULENBQUMsQ0FBQztTQUNOO1FBRUQsSUFBSSxnQkFBZ0IsR0FBZSxFQUFFLENBQUM7UUFDdEMsSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2xDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO2dCQUMvQyxzQ0FBc0M7aUJBQ3JDLEtBQUssQ0FBQyxHQUFHLENBQUM7Z0JBQ1gsMkJBQTJCO2lCQUMxQixHQUFHLENBQUMsWUFBRSxJQUFJLGVBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQTNCLENBQTJCLENBQUM7Z0JBQ3ZDLDBCQUEwQjtpQkFDekIsTUFBTSxDQUFDLGNBQUksSUFBSSxRQUFDLENBQUMsSUFBSSxFQUFOLENBQU0sQ0FBQztnQkFDdkIsMkRBQTJEO2lCQUMxRCxHQUFHLENBQUMsY0FBSSxJQUFJLFdBQUksbUJBQVEsQ0FBQyxJQUFJLENBQUMsRUFBbEIsQ0FBa0IsQ0FBQztnQkFDaEMscUVBQXFFO2lCQUNwRSxNQUFNLENBQUMsZ0JBQU0sSUFBSSxlQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFPLElBQUksMkJBQW9CLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFsRixDQUFrRixDQUFDLEVBQTVHLENBQTRHLENBQUM7U0FDdEk7YUFBTTtZQUNILDRCQUE0QjtZQUM1Qiw0RkFBNEY7WUFDNUYsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFDLElBQUksRUFBRSxHQUFHLElBQUssV0FBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBN0MsQ0FBNkMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRyxLQUFLLElBQUksTUFBTSxHQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFO3dDQUNuQyxPQUFPO29CQUNkLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7b0JBQzlCLElBQUksTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNOzBDQUFXO29CQUNsRCxJQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzdDLElBQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUM7b0JBQ3pDLElBQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDakQsNklBQTZJO29CQUM3SSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQUMsSUFBSSxrQkFBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBekIsQ0FBeUIsQ0FBQyxFQUFFO3dCQUMzSCxPQUFPLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLElBQUksT0FBTyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztxQkFFN0o7b0JBRUQsSUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUM5QixJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxXQUFXLEVBQUU7d0JBQ3ZDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDekIsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdkM7eUJBQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLEVBQUU7d0JBQ2pHLElBQUksZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxNQUFNLEVBQUU7NEJBQ3JHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDekIsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDdkM7NkJBQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRSxFQUFFOzRCQUNoRixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3pCLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ3ZDO3FCQUNKO3lCQUFNO3dCQUNILE9BQU8sQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxPQUFPLENBQUMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQzdKOztnQkExQkwsS0FBc0IsVUFBUSxFQUFSLHFCQUFRLEVBQVIsc0JBQVEsRUFBUixJQUFRO29CQUF6QixJQUFNLE9BQU87NEJBQVAsT0FBTztpQkEyQmpCO2FBQ0o7WUFDRCxLQUFzQixVQUFRLEVBQVIscUJBQVEsRUFBUixzQkFBUSxFQUFSLElBQVEsRUFBRTtnQkFBM0IsSUFBTSxPQUFPO2dCQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFO29CQUN6QixPQUFPLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO2lCQUNwQzthQUNKO1lBQ0QsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLGFBQUcsSUFBSSxlQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFPLElBQUksY0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxhQUFHLElBQUksVUFBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBbkIsQ0FBbUIsQ0FBQyxFQUE1RCxDQUE0RCxDQUFDLEVBQXRGLENBQXNGLENBQUM7U0FDNUk7UUFDRCxPQUFPLGdCQUFnQjtZQUNuQiwyQ0FBMkM7YUFDMUMsR0FBRyxDQUFDLGdCQUFNLFlBQUksb0JBQU0sQ0FBQyxXQUFXLEVBQUUsMENBQUUsSUFBSSxLQUFJLEVBQUUsSUFBQzthQUMvQyxHQUFHLENBQUMsV0FBQyxJQUFJLFFBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBUixDQUFRLENBQUM7YUFDbEIsTUFBTSxDQUFDLFdBQUMsSUFBSSxRQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBWixDQUFZLENBQUM7YUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUF2RmUsa0NBQXNCLHlCQXVGckM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxTQUFnQixVQUFVLENBQUMsV0FBcUI7UUFDNUMsSUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxlQUFlO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDbkMsT0FBTyxXQUFXLENBQUMsT0FBTyxFQUFFLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDMUksQ0FBQztJQUplLHNCQUFVLGFBSXpCO0FBQ0wsQ0FBQyxFQTVZZ0IsV0FBVyxHQUFYLG1CQUFXLEtBQVgsbUJBQVcsUUE0WTNCOzs7Ozs7Ozs7Ozs7OztBQ25aRCwwRkFBNEM7QUFDNUMsdUZBQTBDO0FBRTFDLElBQWlCLE1BQU0sQ0FpRnRCO0FBakZELFdBQWlCLE1BQU07SUFDbkIsU0FBZ0Isb0JBQW9CLENBQUMsSUFBVTtRQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3RDLElBQU0sSUFBSSxHQUFHLElBQW1CLENBQUM7UUFDakMsSUFBTSxJQUFJLEdBQUcsbUJBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xELE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxLQUFLLE1BQU0sSUFBSSxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDekcsQ0FBQztJQUxlLDJCQUFvQix1QkFLbkM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxPQUFvQixFQUFFLFNBQTBCO1FBQTFCLDZDQUEwQjtRQUM5RSxvRUFBb0U7UUFDcEUsSUFBSSxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQ1osT0FBTyxXQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQUM7U0FDdkM7UUFFRCxnRUFBZ0U7UUFDaEUsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuRixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDeEM7UUFFRCxnREFBZ0Q7UUFDaEQsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUU3QyxnRUFBZ0U7UUFDaEUsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN4QywwREFBMEQ7WUFDMUQsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRCxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFHLElBQUksa0JBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBRSxFQUFyQixDQUFxQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDWixvRUFBb0U7WUFDcEUsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUM5QixRQUFRLElBQUksa0JBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFJLENBQUM7YUFDNUU7WUFFRCxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ3BDLElBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN2RCxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLEVBQUUsOEJBQThCO29CQUNwRCxRQUFRLElBQUksd0JBQWdCLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQUksQ0FBQztpQkFDckQ7YUFDSjtZQUVELGlDQUFpQztZQUNqQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzNFLFFBQVEsSUFBSSxrQkFBVSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLFFBQUksQ0FBQzthQUM1RTtTQUNKO1FBRUQsOERBQThEO1FBQzlELElBQUksT0FBTyxDQUFDLGFBQWEsRUFBRTtZQUN2QixzQ0FBc0M7WUFDdEMsSUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztpQkFDdEQsTUFBTSxDQUFDLGVBQUssSUFBSSxZQUFLLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxPQUFPLEVBQWpDLENBQWlDLENBQUMsQ0FBQztZQUV4RCxvRUFBb0U7WUFDcEUsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDckIsSUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVDLFFBQVEsSUFBSSx1QkFBZ0IsS0FBSyxNQUFHLENBQUM7YUFDeEM7WUFFRCxrRUFBa0U7WUFDbEUsb0ZBQW9GO1lBQ3BGLE9BQU8sVUFBRyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBTSxRQUFRLENBQUUsQ0FBQztTQUM1RTtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUEzRGUsd0JBQWlCLG9CQTJEaEM7QUFDTCxDQUFDLEVBakZnQixNQUFNLEdBQU4sY0FBTSxLQUFOLGNBQU0sUUFpRnRCOzs7Ozs7Ozs7Ozs7OztBQ3BGRCxxR0FBOEM7QUFHOUM7OztHQUdHO0FBQ0g7SUFhSTs7O09BR0c7SUFDSCxtQkFBb0IsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQVp0QywyQ0FBMkM7UUFDbkMsb0JBQWUsR0FBOEM7WUFDakUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7WUFDL0IsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7WUFDeEMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDckMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7U0FDdEMsQ0FBQztRQU9FLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBR08sb0NBQWdCLEdBQXhCLFVBQXlCLFFBQWdCLEVBQUUsS0FBZ0MsRUFBRSxNQUFvQztRQUM3RyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsSUFBSSxLQUFLLEVBQUU7WUFDUCxLQUFLLElBQU0sR0FBRyxJQUFJLEtBQUssRUFBRTtnQkFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUM1QjtTQUNKO1FBQ0QsSUFBSSxNQUFNLEVBQUU7WUFDUixLQUFLLElBQU0sR0FBRyxJQUFJLE1BQU0sRUFBRTtnQkFDdEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDbkM7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7T0FFRztJQUNLLGlDQUFhLEdBQXJCO1FBQUEsaUJBd0hDO1FBdkhHLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7WUFDMUMsU0FBUyxFQUFFLGlCQUFpQjtTQUMvQixFQUFFO1lBQ0MsUUFBUSxFQUFFLE9BQU87WUFDakIsTUFBTSxFQUFFLEdBQUc7WUFDWCxJQUFJLEVBQUUsR0FBRztZQUNULEtBQUssRUFBRSxNQUFNO1lBQ2IsZUFBZSxFQUFFLG9CQUFvQjtZQUNyQyxLQUFLLEVBQUUsT0FBTztZQUNkLE9BQU8sRUFBRSxNQUFNO1lBQ2YsTUFBTSxFQUFFLE9BQU87WUFDZixPQUFPLEVBQUUsTUFBTTtZQUNmLGFBQWEsRUFBRSxRQUFRO1lBQ3ZCLEdBQUcsRUFBRSxNQUFNO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsNEJBQTRCO1FBQzVCLElBQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNO1NBQUMsQ0FBQyxDQUFDO1FBRXJELGdDQUFnQztRQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxpQkFBTztZQUNoQyxJQUFNLFNBQVMsR0FBRyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtnQkFDL0MsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsVUFBVSxFQUFFLFFBQVE7Z0JBQ3BCLEdBQUcsRUFBRSxLQUFLO2dCQUNWLE1BQU0sRUFBRSxRQUFRO2FBQ25CLENBQUMsQ0FBQztZQUVILFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtnQkFDaEQsV0FBVyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEdBQUcsR0FBRzthQUNuQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFUixrQkFBa0I7WUFDbEIsSUFBTSxVQUFVLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRTtnQkFDL0MsV0FBVyxFQUFFLFFBQVE7YUFDeEIsRUFBRTtnQkFDQyxPQUFPLEVBQUUsVUFBVTtnQkFDbkIsZUFBZSxFQUFFLE1BQU07Z0JBQ3ZCLEtBQUssRUFBRSxPQUFPO2dCQUNkLE1BQU0sRUFBRSxNQUFNO2dCQUNkLFlBQVksRUFBRSxLQUFLO2dCQUNuQixNQUFNLEVBQUUsU0FBUzthQUNwQixDQUFDLENBQUM7WUFDSCxVQUFVLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLGNBQU0sWUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQTVDLENBQTRDLENBQUMsQ0FBQztZQUN6RixTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRWxDLGNBQWM7WUFDZCxJQUFNLFVBQVUsR0FBRyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFO2dCQUMvQyxXQUFXLEVBQUUsUUFBUTthQUN4QixFQUFFO2dCQUNDLE9BQU8sRUFBRSxVQUFVO2dCQUNuQixlQUFlLEVBQUUsTUFBTTtnQkFDdkIsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLE1BQU0sRUFBRSxTQUFTO2FBQ3BCLENBQUMsQ0FBQztZQUNILFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsY0FBTSxZQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQXhDLENBQXdDLENBQUMsQ0FBQztZQUNyRixTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRWxDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDcEQsT0FBTyxFQUFFLE1BQU07WUFDZixVQUFVLEVBQUUsUUFBUTtZQUNwQixHQUFHLEVBQUUsS0FBSztZQUNWLE1BQU0sRUFBRSxRQUFRO1NBQ25CLENBQUM7UUFDRixrQkFBa0I7UUFDbEIsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRTtZQUNsRCxXQUFXLEVBQUUsVUFBVTtTQUMxQixFQUFFO1lBQ0MsT0FBTyxFQUFFLFVBQVU7WUFDbkIsZUFBZSxFQUFFLE1BQU07WUFDdkIsS0FBSyxFQUFFLE9BQU87WUFDZCxNQUFNLEVBQUUsTUFBTTtZQUNkLFlBQVksRUFBRSxLQUFLO1lBQ25CLE1BQU0sRUFBRSxTQUFTO1NBQ3BCLENBQUMsQ0FBQztRQUNILGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsY0FBTSxZQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBM0IsQ0FBMkIsQ0FBQyxDQUFDO1FBQzNFLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU1Qyx1QkFBdUI7UUFDdkIsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRTtZQUNqRCxXQUFXLEVBQUUsZUFBZTtTQUMvQixFQUFFO1lBQ0MsT0FBTyxFQUFFLFVBQVU7WUFDbkIsZUFBZSxFQUFFLE1BQU07WUFDdkIsS0FBSyxFQUFFLE9BQU87WUFDZCxNQUFNLEVBQUUsTUFBTTtZQUNkLFlBQVksRUFBRSxLQUFLO1lBQ25CLE1BQU0sRUFBRSxTQUFTO1NBQ3BCLENBQUMsQ0FBQztRQUNILFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsY0FBTSxZQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxFQUE1QixDQUE0QixDQUFDLENBQUM7UUFDM0UsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzNDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBR2hELHlCQUF5QjtRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7WUFDL0MsV0FBVyxFQUFFLG9EQUFvRDtTQUNwRSxFQUFFO1lBQ0MsT0FBTyxFQUFFLE1BQU07WUFDZixlQUFlLEVBQUUsMEJBQTBCO1lBQzNDLFlBQVksRUFBRSxLQUFLO1lBQ25CLFNBQVMsRUFBRSxPQUFPO1lBQ2xCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFVBQVUsRUFBRSxXQUFXO1lBQ3ZCLFFBQVEsRUFBRSxNQUFNO1NBQ25CLENBQUMsQ0FBQztRQUVILDRCQUE0QjtRQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVoRCxrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksaUNBQWEsR0FBcEIsVUFBcUIsTUFBd0IsRUFBRSxJQUFvQixFQUFFLFNBQXdDOztRQUN6RyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFFckIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2hCLDhCQUE4QjtZQUM5QixXQUFXLEdBQUcsVUFBRyxTQUFTLENBQUMsV0FBVyxFQUFFLGNBQUksSUFBSSxlQUFLLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFFLENBQUM7U0FDekY7YUFBTTtZQUNILFdBQVcsR0FBRyxVQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsY0FBSSxJQUFJLGVBQUssTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUUsQ0FBQztTQUN6RjtRQUNELGtCQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsMENBQUUsVUFBVSxFQUFFLDBDQUFFLGNBQWMsRUFBRSxDQUFDO1FBQzNELGtCQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssMENBQUUsVUFBVSxFQUFFLDBDQUFFLGNBQWMsRUFBRSxDQUFDO1FBQzdELE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUM5QyxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFO1lBQ2hELFNBQVMsRUFBRSxPQUFPO1NBQ3JCLEVBQUUsRUFDRixDQUFDLENBQUM7UUFDSCxhQUFhLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFOztZQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQU0sQ0FBQyxlQUFlLENBQUMsS0FBSywwQ0FBRSxPQUFPLEVBQUUsRUFBRSxZQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsMENBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNoRyxDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7SUFDbEQsQ0FBQztJQUVNLDhCQUFVLEdBQWpCLFVBQWtCLE1BQXdDO1FBQTFELGlCQW1DQztRQWxDRyxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRCxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0RCxJQUFNLGFBQWEsR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLElBQU0sYUFBYSxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDakUsS0FBMkIsVUFBYSxFQUFiLCtCQUFhLEVBQWIsMkJBQWEsRUFBYixJQUFhLEVBQUU7WUFBckMsSUFBTSxZQUFZO1lBQ25CLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRTtnQkFDOUMsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osU0FBUyxFQUFFLFlBQVk7YUFDMUIsRUFBRTtnQkFDQyxTQUFTLEVBQUUsTUFBTTtnQkFDakIsT0FBTyxFQUFFLFFBQVE7Z0JBQ2pCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLEtBQUssRUFBRSxPQUFPO2FBQ2pCLENBQUMsQ0FBQyxDQUFDO1lBQ0osS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNoQztnQ0FFVSxJQUFJO1lBQ1gsSUFBTSxPQUFPLEdBQUcsT0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELGFBQWEsQ0FBQyxPQUFPLENBQUMsVUFBQyxLQUFLO2dCQUN4QixPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7b0JBQzVDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDO2lCQUN6QixFQUFFO29CQUNDLGFBQWEsRUFBRSxLQUFLO29CQUNwQixNQUFNLEVBQUUsaUJBQWlCO29CQUN6QixPQUFPLEVBQUUsUUFBUTtvQkFDakIsTUFBTSxFQUFFLE1BQU07b0JBQ2QsS0FBSyxFQUFFLE9BQU87aUJBQ2pCLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxDQUFDO1lBQ0YsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7O1FBYi9CLEtBQW1CLFVBQU0sRUFBTixpQkFBTSxFQUFOLG9CQUFNLEVBQU4sSUFBTTtZQUFwQixJQUFNLElBQUk7b0JBQUosSUFBSTtTQWNkO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNJLDJCQUFPLEdBQWQ7UUFDSSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUU7WUFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN6RDtJQUNMLENBQUM7SUFDTCxnQkFBQztBQUFELENBQUM7QUE5T1ksOEJBQVM7QUFnUHRCOztHQUVHO0FBQ0g7SUFpQkk7OztPQUdHO0lBQ0gsa0JBQVksV0FBaUM7UUFBakMsNENBQW9CLFFBQVEsQ0FBQyxJQUFJO1FBaEI3Qyx3Q0FBd0M7UUFDaEMsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDckMsaUNBQWlDO1FBQ3pCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQ3RDLDJDQUEyQztRQUNuQyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQVluQyxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFDM0MsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsMkJBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTdELG9CQUFvQjtRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5DLDJCQUEyQjtRQUMzQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUU3Qix3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFMUIsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFTSwwQkFBTyxHQUFkLFVBQWUsY0FBd0I7UUFDbkMsSUFBSSxjQUFjLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFDRCxJQUFNLE1BQU0sR0FBRywyQkFBWSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVNLCtCQUFZLEdBQW5CO1FBQ0ksSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7T0FHRztJQUNJLCtCQUFZLEdBQW5CLFVBQW9CLElBQW9CO1FBQ3BDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksbUNBQWdCLEdBQXZCLFVBQXdCLElBQW9CO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSyx3Q0FBcUIsR0FBN0I7UUFBQSxpQkFrRUM7UUFqRUcsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFDLENBQWdCO1lBQ3BDLCtEQUErRDtZQUMvRCxJQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBcUIsQ0FBQztZQUN2QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssVUFBVSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFO2dCQUM1RixPQUFPO2FBQ1Y7WUFFRCw0QkFBNEI7WUFDNUIsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFO2dCQUNYLHdCQUF3QjtnQkFDeEIsS0FBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNsQixPQUFPO2FBQ1Y7WUFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE9BQU87Z0JBQUUsT0FBTztZQUNsQyxzQkFBc0I7WUFDdEIsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFO2dCQUNYLEtBQUssU0FBUztvQkFDVixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ25CLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDOUIsTUFBTTtnQkFDVixLQUFLLEdBQUc7b0JBQ0osS0FBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7Z0JBQzVCLEtBQUssV0FBVztvQkFDWixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ25CLEtBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzFCLE1BQU07Z0JBQ1YsS0FBSyxPQUFPO29CQUNSLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDbkIsS0FBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7b0JBQzlCLEtBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDL0QsTUFBTTtnQkFDVixLQUFLLEdBQUcsQ0FBQztnQkFDVCxLQUFLLEdBQUc7b0JBQ0osSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO3dCQUNaLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDbkIsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO3FCQUNwQzt5QkFBTTt3QkFDSCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7d0JBQ25CLEtBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQ2hDO29CQUNELE1BQU07Z0JBQ1YsS0FBSyxHQUFHLENBQUM7Z0JBQ1QsS0FBSyxHQUFHO29CQUNKLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTt3QkFDWixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7d0JBQ25CLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDbkM7eUJBQU07d0JBQ0gsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUNuQixLQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUMvQjtvQkFDRCxNQUFNO2dCQUNWLEtBQUssS0FBSztvQkFDTixJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUU7d0JBQ1osQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUNuQixLQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQ3RDO3lCQUFNO3dCQUNILENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDbkIsS0FBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztxQkFDbEM7b0JBQ0QsTUFBTTthQUNiO1FBQ0wsQ0FBQyxDQUFDO1FBRUYseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU8sOEJBQVcsR0FBbkIsVUFBb0IsTUFBTTtRQUExQixpQkFZQztRQVhHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU87UUFDaEMsSUFBTSxTQUFTLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9FLFNBQVMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ3JCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQixTQUFTLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFVBQUMsS0FBSztZQUNwQyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7Z0JBQ3BCLEtBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDN0I7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixlQUFlLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNLLDZCQUFVLEdBQWxCO1FBQ0ksSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIscUNBQXFDO1FBQ3JDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSyx3Q0FBcUIsR0FBN0I7UUFBQSxpQkE0QkM7UUEzQkcsSUFBTSxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFDLFNBQVM7WUFDNUMsb0RBQW9EO1lBQ3BELElBQUksS0FBSSxDQUFDLFlBQVksRUFBRTtnQkFDbkIsSUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxrQkFBUSxJQUFJLGVBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLENBQUM7dUJBQzNFLENBQUUsUUFBUSxDQUFDLE1BQXNCLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEVBRGhCLENBQ2dCLENBQUM7Z0JBQ3JFLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzNCLDJDQUEyQztvQkFDM0MsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN0QixJQUFJLFFBQU0sR0FBRyxLQUFJLENBQUM7b0JBQ2xCLFFBQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDakIsVUFBVSxDQUFDO3dCQUNQLFFBQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDakIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRTs0QkFDN0MsVUFBVSxFQUFFLElBQUk7NEJBQ2hCLFNBQVMsRUFBRSxJQUFJOzRCQUNmLE9BQU8sRUFBRSxJQUFJO3lCQUNoQixDQUFDLENBQUM7b0JBRVAsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNaO2FBQ0o7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUU7WUFDN0MsVUFBVSxFQUFFLElBQUk7WUFDaEIsU0FBUyxFQUFFLElBQUk7WUFDZixPQUFPLEVBQUUsSUFBSTtTQUNoQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxxQ0FBa0IsR0FBMUI7UUFBQSxpQkF1QkM7UUF0QkcsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFDLENBQWE7WUFDOUIsNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxDQUFDLE1BQU0sWUFBWSxXQUFXLEVBQUU7Z0JBQ2pDLElBQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFxQixDQUFDO2dCQUN2QyxJQUFJLEtBQUksQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO29CQUNwRCxPQUFPO2lCQUNWO2dCQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQzlCLDBEQUEwRDtnQkFDMUQsSUFBTSxNQUFNLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFeEQsNEJBQTRCO2dCQUM1QixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7b0JBQ2hCLEtBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ3JELEtBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQzVCO2dCQUNELE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUN0QjtRQUNMLENBQUMsQ0FBQztRQUVGLCtDQUErQztRQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0sseUNBQXNCLEdBQTlCO1FBQ0ksSUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXZFLElBQUksY0FBYyxFQUFFO1lBQ2hCLDZDQUE2QztZQUM3QyxJQUFNLE1BQU0sR0FBRztnQkFDWCxPQUFPLEVBQUUsSUFBSTtnQkFDYixlQUFlLEVBQUU7b0JBQ2IsT0FBTyxFQUFFLHNCQUFlLGNBQWMsQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBRTtvQkFDL0UsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ3pDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFO2lCQUMxQzthQUNKLENBQUM7WUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFekIsMEJBQTBCO1lBQzFCLElBQUksY0FBYyxDQUFDLEtBQUssRUFBRTtnQkFDdEIsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQzFCO1lBRUQsa0NBQWtDO1lBQ2xDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUMxQjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxnQ0FBYSxHQUFwQjtRQUNJLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSSwwQkFBTyxHQUFkO1FBQ0kseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFakUseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0wsZUFBQztBQUFELENBQUM7QUF2UlksNEJBQVE7Ozs7Ozs7Ozs7Ozs7O0FDMVByQiwwRkFBdUM7QUFDdkMsNEdBQW1EO0FBQ25ELDZGQUErQztBQUMvQyx3SEFBbUU7QUFDbkUsb0dBQXNEO0FBQ3RELDBGQUE2QztBQUc3Qzs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsTUFBZ0IsRUFBRSxPQUFnQixFQUFFLGVBQXdCLEVBQUUsY0FBdUI7SUFDbkgsT0FBTyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ25CLENBQUMsQ0FBQyxVQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBRyxPQUFPLElBQUksSUFBSSxDQUFFO1FBQzFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDYixDQUFDO0FBSkQsOENBSUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLE1BQWdCLEVBQUUsT0FBZ0I7SUFDakUsT0FBTyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ25CLENBQUMsQ0FBQyxVQUFHLE9BQU8sSUFBSSxJQUFJLFNBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFFO1FBQzFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDYixDQUFDO0FBSkQsZ0RBSUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixTQUFTLENBQUMsTUFBZ0IsRUFBRSxlQUF3QixFQUFFLGNBQXVCO0lBQ3pGLE9BQU8sTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNuQixDQUFDLENBQUMsVUFBRyxlQUFlLElBQUksR0FBRyxTQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBRyxjQUFjLElBQUksR0FBRyxDQUFFO1FBQ3hFLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDYixDQUFDO0FBSkQsOEJBSUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxNQUFnQixFQUFFLFdBQW1CO0lBQ3BFLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNqQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sV0FBVyxDQUFDO0lBRTlCLElBQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNsRSxJQUFJLGVBQWUsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN0RCxPQUFPLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNqQztJQUVELE9BQU8sV0FBVyxDQUFDO0FBQ3ZCLENBQUM7QUFWRCxnREFVQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLE1BQWdCLEVBQUUsSUFBcUI7SUFDdkUsSUFBSSxJQUFJLEdBQVcsQ0FBRSxNQUFNLENBQUMsT0FBTyxFQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFELElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNyQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsRUFBRTtRQUMvRixXQUFXLEdBQUcsZ0JBQWdCLENBQUM7S0FDbEM7U0FBTTtRQUNILFdBQVcsR0FBRyxNQUFNLENBQUM7S0FDeEI7SUFDRCxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEMsSUFBSSxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQzlELElBQUksSUFBSSxLQUFLLFdBQVcsRUFBRTtZQUN0QixPQUFPLFdBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLFNBQUcsV0FBVyxNQUFHLENBQUM7U0FDekQ7YUFBTTtZQUNILE9BQU8sV0FBSSxXQUFXLFNBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLE1BQUcsQ0FBQztTQUMxRDtLQUNKO0lBQ0QsT0FBTyxXQUFJLFdBQVcsTUFBRyxDQUFDO0FBQzlCLENBQUM7QUFqQkQsa0RBaUJDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUywyQkFBMkIsQ0FBQyxJQUFpQixFQUFFLElBQWE7SUFDakUsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzFELElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDNUIsSUFBTSxnQkFBZ0IsR0FBRyxXQUFXO1NBQy9CLEtBQUssQ0FBQyxLQUFLLENBQUM7U0FDWixHQUFHLENBQUMsWUFBRSxJQUFJLGVBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQTNCLENBQTJCLENBQUM7U0FDdEMsTUFBTSxDQUFDLGtCQUFRLElBQUksUUFBQyxDQUFDLFFBQVEsRUFBVixDQUFVLENBQWtCLENBQUM7SUFFckQsSUFBTSxlQUFlLEdBQUcsZ0JBQWdCO1NBQ25DLEdBQUcsQ0FBQyxrQkFBUSxZQUFJLHFCQUFRLENBQUMsV0FBVywwQ0FBRSxJQUFJLEVBQUUsSUFBQztTQUM3QyxNQUFNLENBQUMsY0FBSSxJQUFJLFFBQUMsQ0FBQyxJQUFJLEVBQU4sQ0FBTSxDQUFDO1NBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVmLElBQUksQ0FBQyxlQUFlLElBQUksZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDaEUsSUFBSSxJQUFJLEtBQUssTUFBTTtRQUFFLE9BQU8sa0JBQVcsZUFBZSxXQUFRLENBQUM7SUFDL0QsT0FBTyxjQUFNLGVBQWUsT0FBRyxDQUFDO0FBQ3BDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxJQUFpQjtJQUM1QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFaEIsOERBQThEO0lBQzlELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxLQUFLLE1BQU0sRUFBRTtRQUNoRixNQUFNLElBQUksWUFBWSxDQUFDO0tBQzFCO0lBRUQsOERBQThEO0lBQzlELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxLQUFLLE1BQU0sRUFBRTtRQUNoRixNQUFNLElBQUksYUFBYSxDQUFDO0tBQzNCO0lBRUQsOERBQThEO0lBQzlELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxLQUFLLE1BQU0sRUFBRTtRQUNoRixNQUFNLElBQUksWUFBWSxDQUFDO1FBQ3ZCLHlFQUF5RTtRQUN6RSx1REFBdUQ7UUFDdkQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsSUFBSyxJQUEwQixDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUU7WUFDL0YsTUFBTSxJQUFJLGlCQUFpQixDQUFDO1NBQy9CO0tBQ0o7SUFFRCx5Q0FBeUM7SUFDekMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxLQUFLLE1BQU0sRUFBRTtRQUM5QyxNQUFNLElBQUksV0FBVyxDQUFDO0tBQ3pCO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGtDQUFrQyxDQUFDLE1BQWdCO0lBQ3hELElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNqQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXhCLG9FQUFvRTtJQUNwRSxJQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFdkQsK0JBQStCO0lBQy9CLE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ3RCLHlDQUF5QztRQUN6QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDL0MsSUFBTSxJQUFJLEdBQUcsbUJBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQW1CLENBQUMsQ0FBQztZQUNsRSxJQUFJLElBQUksSUFBSSxpQ0FBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxpQ0FBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFO2dCQUM1RyxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7S0FDSjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQU07SUFDMUIsSUFBSTtRQUNBLHFEQUFxRDtRQUNyRCxJQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsZUFBZSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1FBQ3BFLE9BQU8sR0FBRyxLQUFLLElBQUksQ0FBQztLQUN2QjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1IsT0FBTyxLQUFLLENBQUM7UUFDYixpRUFBaUU7UUFDakUsb0RBQW9EO1FBQ3BELElBQUk7UUFDSix5Q0FBeUM7S0FDNUM7QUFDTCxDQUFDO0FBRVksYUFBSyxHQUFxQjtJQUNuQyw0Q0FBNEM7SUFFNUMsY0FBYztJQUNkLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUNqQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDO1FBQ3RDLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsRUFBRSxVQUFxQixFQUFFLElBQWE7Z0JBQ25ELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUN0QyxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFpQixDQUFDO2dCQUM3QyxJQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3RELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsS0FBSyxNQUFNLEVBQUU7b0JBQzlDLE9BQU8sa0JBQVcsUUFBUSxzQkFBWSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsU0FBRywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQUcsQ0FBQztpQkFDakg7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztZQUNELFVBQUMsTUFBZ0IsRUFBRSxVQUFxQixFQUFFLElBQWE7Z0JBQ25ELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUN0QyxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFpQixDQUFDO2dCQUM3QyxJQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3RELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsS0FBSyxPQUFPLEVBQUU7b0JBQy9DLE9BQU8sa0JBQVcsUUFBUSwwQkFBZ0Isa0JBQWtCLENBQUMsTUFBTSxDQUFDLFNBQUcsMkJBQTJCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFHLENBQUM7aUJBQ3JIO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFDRCxVQUFDLE1BQWdCLEVBQUUsVUFBcUIsRUFBRSxJQUFhO2dCQUNuRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7b0JBQUUsT0FBTyxTQUFTLENBQUM7Z0JBQ3hDLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztnQkFDbkIsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNqQyxJQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRTtvQkFDL0QsU0FBUyxJQUFJLFFBQVEsQ0FBQztpQkFDekI7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxFQUFFO29CQUNwQyxTQUFTLElBQUksWUFBSyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUUsQ0FBQztpQkFDaEc7Z0JBQ0QsU0FBUyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QyxPQUFPLFdBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLFNBQUcsUUFBUSxTQUFHLFNBQVMsU0FBRywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQUcsQ0FBQztZQUM3RyxDQUFDO1lBQ0QsVUFBQyxNQUFnQixJQUFPLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7S0FDSixDQUFDO0lBRUYsZ0JBQWdCO0lBQ2hCLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNuQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDO1FBQ3hDLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsRUFBRSxVQUFxQixFQUFFLElBQWE7Z0JBQ25ELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUNyQixJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFzQixDQUFDO29CQUNsRCxJQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQ3hELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztvQkFDbEIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxLQUFLLE9BQU8sRUFBRTt3QkFDL0MsUUFBUSxHQUFHLGNBQWMsQ0FBQztxQkFDN0I7eUJBQU07d0JBQ0gsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO3dCQUNyQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUU7NEJBQ25DLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxLQUFLLE1BQU0sQ0FBQzt5QkFDM0Q7NkJBQU07NEJBQ0gsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7eUJBQzNCO3dCQUNELFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO3FCQUNuRDtvQkFDRCxRQUFRLElBQUkscUJBQXFCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7b0JBQ3ZELE9BQU8sV0FBSSxRQUFRLGVBQUssUUFBUSxTQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxTQUFHLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBRztpQkFDNUg7cUJBQU07b0JBQ0gsT0FBTyxFQUFFLENBQUM7aUJBQ2I7WUFDTCxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsMENBQTBDO0lBQzFDLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDO1FBQzVDLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUN4QixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCOztnQkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFFdEMsdUJBQXVCO2dCQUN2QixJQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxRQUFRO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUUzQix5REFBeUQ7Z0JBQ3pELDRCQUE0QjtnQkFDNUIsc0RBQXNEO2dCQUN0RCwwQkFBMEI7Z0JBRTFCLElBQU0sV0FBVyxHQUFHLGVBQVEsQ0FBQyxXQUFXLDBDQUFFLElBQUksRUFBRSxLQUFJLEVBQUUsQ0FBQztnQkFFdkQsNkRBQTZEO2dCQUM3RCxJQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQy9ELElBQUksVUFBVSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUV4QyxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNiLDRFQUE0RTtvQkFDNUUsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUU7d0JBQ3RCLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTs0QkFDL0MsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQW1CLENBQUM7NEJBQ3hDLElBQU0sSUFBSSxHQUFHLG1CQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUU1QyxtRUFBbUU7NEJBQ25FLElBQUksSUFBSSxJQUFJLGlDQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO2dDQUM5QyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dDQUNsQixNQUFNOzZCQUNUOzRCQUVELGlDQUFpQzs0QkFDakMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dDQUNuRSxVQUFVLEdBQUcsSUFBSSxDQUFDO2dDQUNsQixNQUFNOzZCQUNUO3lCQUNKO3FCQUNKO2lCQUNKO2dCQUVELHlDQUF5QztnQkFDekMsSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDYixPQUFPLFNBQVMsQ0FBQztpQkFDcEI7Z0JBRUQsMkRBQTJEO2dCQUMzRCxPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsZ0JBQWdCO0lBQ2hCLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNuQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDO1FBQ3JDLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7Z0JBQ2IsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUNqQyxJQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ3pELElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNmLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRLEVBQUU7b0JBQ3RELEtBQUssR0FBRyxhQUFhLENBQUM7b0JBRXRCLElBQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQXVCLENBQUM7b0JBQzVELElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO29CQUNwRyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7b0JBQ2xCLElBQUksU0FBUyxFQUFFO3dCQUNYLElBQUksSUFBSSxHQUFHLElBQUksbUJBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBQzFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7cUJBQzdDO29CQUNELEtBQUssSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckMsT0FBTyxXQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFHLFFBQVEsU0FBRyxLQUFLLFNBQUcsUUFBUSxNQUFHLENBQUM7aUJBQ3pFO3FCQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLEVBQUU7b0JBQzVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsRUFBRTt3QkFDcEMsS0FBSyxHQUFHLFlBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFFLENBQUM7cUJBQzNGO29CQUNELEtBQUssSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckMsT0FBTyxXQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFHLFFBQVEsU0FBRyxLQUFLLCtDQUE0QyxDQUFDO2lCQUN2RztxQkFBTTtvQkFDSCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEVBQUU7d0JBQ3BDLEtBQUssR0FBRyxZQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBRSxDQUFDO3dCQUN4RixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsRUFBRTs0QkFDeEMsS0FBSyxJQUFJLHFCQUFxQixDQUFDO3lCQUNsQztxQkFDSjtvQkFDRCxLQUFLLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBRXJDLDJDQUEyQztvQkFDM0MsMEZBQTBGO29CQUMxRiwyREFBMkQ7b0JBQzNELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztvQkFDbEIsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDdEQsSUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ3RFLElBQUksS0FBSyxFQUFFO3dCQUNQLElBQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsdUNBQXVDLENBQXVCLENBQUM7d0JBQzFHLElBQUksY0FBYyxFQUFFOzRCQUNoQixRQUFRLEdBQUcsY0FBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQUcsQ0FBQzt5QkFDakU7cUJBQ0o7b0JBQ0QsSUFBSSxDQUFDLFFBQVEsRUFBRTt3QkFDWCxJQUFNLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ3BELElBQUksV0FBVyxFQUFFOzRCQUNiLFFBQVEsR0FBRyxjQUFNLFdBQVcsT0FBRyxDQUFDO3lCQUNuQztxQkFDSjtvQkFFRCxPQUFPLFdBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLFNBQUcsUUFBUSxTQUFHLEtBQUssU0FBRyxRQUFRLE1BQUcsQ0FBQztpQkFDekU7WUFDTCxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsMERBQTBEO0lBQzFELElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUNsQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDO1FBQ3JDLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7Z0JBQ2IsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUNqQyxJQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ3hELElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUVmLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRLEVBQUU7b0JBQ3RELElBQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQXVCLENBQUM7b0JBQzVELElBQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFDLElBQUksUUFBQyxDQUFDLFFBQVEsRUFBVixDQUFVLENBQUMsQ0FBQztvQkFDL0UsSUFBTSxVQUFRLEdBQUcsZUFBZTt5QkFDM0IsR0FBRyxDQUFDLFdBQUMsSUFBSSx5QkFBa0IsQ0FBQyxJQUFJLG1CQUFRLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFoRCxDQUFnRCxDQUFDO3lCQUMxRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2QsS0FBSyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNyQyxPQUFPLFdBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLFNBQUcsUUFBUSxTQUFHLEtBQUssU0FBRyxVQUFRLE1BQUcsQ0FBQztpQkFDekU7Z0JBQ0QsNEJBQTRCO2dCQUM1QixLQUFLLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JDLElBQU0sV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDcEQsSUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFNLFdBQVcsT0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pELE9BQU8sV0FBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBRyxRQUFRLFNBQUcsS0FBSyxTQUFHLFFBQVEsTUFBRyxDQUFDO1lBQzFFLENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRiwwQkFBMEI7SUFDMUIsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQ2xCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQjs7Z0JBQUssYUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7b0JBQ3ZDLGFBQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxjQUFJLENBQUMsYUFBTSxDQUFDLFdBQVcsRUFBRSwwQ0FBRSxJQUFJLElBQUcsRUFBRSxDQUFDLE9BQUksQ0FBQyxDQUFDO29CQUNqRSxjQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBSzthQUFBO1NBQ25DO0tBQ0osQ0FBQztJQUVGLGdCQUFnQjtJQUNoQixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDbkIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCLElBQUssUUFBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksV0FBVyxJQUFJLEVBQUUsQ0FBQyxFQUExQyxDQUEwQztTQUNuRTtLQUNKLENBQUM7SUFFRixjQUFjO0lBQ2QsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ2pCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQjtnQkFDYixPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLDBCQUFtQixrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBRSxDQUFDO1lBQ25HLENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixtRkFBbUY7SUFDbkYscUVBQXFFO0lBQ3JFLGlGQUFpRjtJQUNqRixxQ0FBcUM7SUFDckMsNEVBQTRFO0lBQzVFLHVGQUF1RjtJQUN2RixvRUFBb0U7SUFDcEUseUNBQXlDO0lBQ3pDLDBFQUEwRTtJQUMxRSxJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDO1FBQy9CLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUNsTCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO1FBQzVCLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsRUFBRSxVQUFxQixFQUFFLElBQWE7O2dCQUNuRCxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxJQUFJO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUN2QixJQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ2hELElBQUksRUFBRSxLQUFLLE1BQU0sSUFBSSxFQUFFLEtBQUssRUFBRTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDNUMsK0VBQStFO2dCQUMvRSxrRkFBa0Y7Z0JBQ2xGLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQzNDLDREQUE0RDtnQkFDNUQsSUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQztnQkFDNUYsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUU7b0JBQ25CLE9BQU8sSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQzNGO2dCQUNELHVFQUF1RTtnQkFDdkUsd0VBQXdFO2dCQUN4RSxxRUFBcUU7Z0JBQ3JFLElBQUksa0JBQWtCLEdBQUcsRUFBRSxDQUFDO2dCQUM1QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsS0FBSyxNQUFNLEVBQUU7b0JBQ2hGLGtCQUFrQixHQUFHLFlBQVksQ0FBQztpQkFDckM7Z0JBQ0QsSUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDNUQsc0VBQXNFO2dCQUN0RSxpRkFBaUY7Z0JBQ2pGLHVFQUF1RTtnQkFDdkUsNENBQTRDO2dCQUM1QyxJQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RDLElBQU0sZUFBZSxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3JGLElBQU0sV0FBVyxHQUFHLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFJLENBQUMsV0FBVywwQ0FBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMvRixJQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQUksV0FBVyxDQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsT0FBTyxXQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFHLGFBQWEsdUJBQWEsa0JBQWtCLGNBQUksYUFBYSxDQUFFLENBQUM7WUFDM0csQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGdCQUFnQjtJQUNoQixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDO1FBQzlCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsY0FBTSxTQUFFLEVBQUYsQ0FBRTtTQUNYO0tBQ0osQ0FBQztJQUVGLHlCQUF5QjtJQUN6QixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztRQUM1QixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7UUFDeEIsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQjs7Z0JBQ2IsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFNLENBQUMsV0FBVyxFQUFFLDBDQUFFLElBQUksS0FBSSxhQUFNLENBQUMsV0FBVyxFQUFFLDBDQUFFLElBQUksTUFBSyxFQUFFLEVBQUU7b0JBQ3pGLDZFQUE2RTtvQkFDN0UsSUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDdEYsSUFBSSxtQkFBbUIsSUFBSSxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFO3dCQUN4RSxPQUFPLEVBQUUsQ0FBQztxQkFDYjtvQkFDRCxPQUFPLHFCQUFxQixDQUFDO2lCQUNoQztnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1lBQ0QsVUFBQyxNQUFnQixZQUFLLFFBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBTSxDQUFDLFdBQVcsRUFBRSwwQ0FBRSxJQUFJLE1BQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQzlGLFVBQUMsTUFBZ0IsWUFBSyxRQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsS0FBSSxZQUFNLENBQUMsV0FBVyxFQUFFLDBDQUFFLElBQUksS0FBSSxrQkFBVyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsTUFBRyxDQUFDLElBQUksSUFBSTtZQUM3SCxVQUFDLE1BQWdCLElBQUssUUFBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQS9CLENBQStCO1NBQ3hEO0tBQ0osQ0FBQztJQUVGLGVBQWU7SUFDZixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDbEIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO1FBQzVCLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsRUFBRSxVQUFvQixFQUFFLElBQW9CO2dCQUN6RCxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtvQkFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDM0QsSUFBSSxJQUFJLEtBQUssTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7b0JBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQ3BELElBQUksS0FBYSxDQUFDO2dCQUNsQixJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDaEIsZ0NBQWdDO29CQUNoQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztpQkFDMUI7cUJBQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQVMsRUFBRTtvQkFDaEQsa0RBQWtEO29CQUNsRCxLQUFLLEdBQUcsR0FBRyxDQUFDO2lCQUNmO3FCQUFNO29CQUNILCtEQUErRDtvQkFDL0QsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN0QztnQkFFRCxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ3BHLE9BQU8sRUFBRSxDQUFDO2lCQUNiO2dCQUVELElBQUksUUFBUSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDOUQsT0FBTyx5QkFBa0IsS0FBSyxTQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxNQUFHLENBQUM7aUJBQ2xFO3FCQUFNO29CQUNILE9BQU8seUJBQWtCLEtBQUssTUFBRyxDQUFDO2lCQUNyQztZQUNMLENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixxQkFBcUI7SUFDckIsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQ2xCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1FBQ3RELEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7Z0JBQ2IsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ3JCLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQWlCLENBQUM7b0JBQzdDLElBQUksS0FBSyxTQUFRLENBQUM7b0JBRWxCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTt3QkFDaEIsZ0NBQWdDO3dCQUNoQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztxQkFDMUI7eUJBQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQVMsRUFBRTt3QkFDaEQsa0RBQWtEO3dCQUNsRCxLQUFLLEdBQUcsR0FBRyxDQUFDO3FCQUNmO3lCQUFNO3dCQUNILCtEQUErRDt3QkFDL0QsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUN0QztvQkFFRCxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ3BHLE9BQU8sRUFBRSxDQUFDO3FCQUNiO29CQUVELE9BQU8sV0FBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsMkJBQWlCLEtBQUssTUFBRyxDQUFDO2lCQUNqRTtnQkFDRCxPQUFPLEVBQUUsQ0FBQztZQUNkLENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixhQUFhO0lBQ2IsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ2QsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO1FBQ3hCLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7O2dCQUNiLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUNuQixPQUFPLEVBQUUsQ0FBQztpQkFDYjtxQkFBTTtvQkFDSCxJQUFJLENBQUMsYUFBTSxDQUFDLFdBQVcsRUFBRSwwQ0FBRSxJQUFJLEtBQUksYUFBTSxDQUFDLFdBQVcsRUFBRSwwQ0FBRSxJQUFJLE1BQUssRUFBRSxFQUFFO3dCQUNsRSw2RUFBNkU7d0JBQzdFLHNFQUFzRTt3QkFDdEUsSUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQzt3QkFDdEYsSUFBSSxtQkFBbUIsSUFBSSxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFOzRCQUN4RSxPQUFPLEVBQUUsQ0FBQzt5QkFDYjt3QkFDRCxPQUFPLHFCQUFxQjtxQkFDL0I7eUJBQU0sSUFBSSxhQUFNLENBQUMsV0FBVyxFQUFFLDBDQUFFLElBQUksTUFBSyxFQUFFLEVBQUU7d0JBQzFDLE9BQU8sRUFBRSxDQUFDO3FCQUNiO3lCQUFNO3dCQUNILE9BQU8sa0JBQVcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLE1BQUc7cUJBQ2xEO2lCQUNKO1lBQ0wsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGlCQUFpQjtJQUNqQixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUM7UUFDcEIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCLElBQUssUUFBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksWUFBWSxJQUFJLEVBQUUsQ0FBQyxFQUEzQyxDQUEyQztTQUNwRTtLQUNKLENBQUM7SUFFRixZQUFZO0lBQ1osSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUM7UUFDOUMsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQixFQUFFLFVBQW9CLEVBQUUsSUFBb0I7O2dCQUN6RCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFNLENBQUMsV0FBVyxFQUFFLDBDQUFFLFFBQVEsQ0FBQyxFQUFFO29CQUN0RixPQUFPLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDNUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGdCQUFnQjtJQUNoQixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDbkIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCOztnQkFDYixJQUFJLFNBQThCLENBQUM7Z0JBQ25DLElBQUksY0FBdUMsQ0FBQztnQkFDNUMsSUFBSSxXQUFXLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3pELE9BQU8sT0FBTyxTQUFTLEtBQUssV0FBVyxJQUFJLFdBQVcsRUFBRTtvQkFDcEQsSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTt3QkFDNUIsSUFBTSxJQUFJLEdBQUcsV0FBMEIsQ0FBQzt3QkFDeEMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUMzQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssTUFBTSxFQUFFO2dDQUN0QyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dDQUNsQixjQUFjLEdBQUcsSUFBSSxDQUFDOzZCQUN6Qjt5QkFDSjs2QkFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxFQUFFOzRCQUM3QyxTQUFTLEdBQUcsS0FBSyxDQUFDOzRCQUNsQixjQUFjLEdBQUcsSUFBSSxDQUFDO3lCQUN6Qjs2QkFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxFQUFFOzRCQUM3QyxTQUFTLEdBQUcsSUFBSSxDQUFDOzRCQUNqQixjQUFjLEdBQUcsSUFBSSxDQUFDO3lCQUN6QjtxQkFDSjtvQkFDRCxXQUFXLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ25EO2dCQUVELGtEQUFrRDtnQkFDbEQsc0ZBQXNGO2dCQUN0RixJQUFNLHFCQUFxQixHQUFHLGtDQUFrQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN6RSxJQUFNLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQU0sQ0FBQyxXQUFXLEVBQUUsMENBQUUsSUFBSSxLQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUVsRixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxTQUFTLEVBQUU7b0JBQ1osSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsS0FBSyxNQUFNLENBQUM7MkJBQzdGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxFQUMzQzt3QkFDSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFHLFNBQVMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7cUJBQ3REO3lCQUFNO3dCQUNILE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFZLFNBQVMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7cUJBQy9EO2lCQUNKO3FCQUFNO29CQUNILDZFQUE2RTtvQkFDN0UsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsd0JBQXdCO29CQUV2QywyREFBMkQ7b0JBQzNELElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSTt3QkFDaEUsY0FBYyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTt3QkFDdEMsSUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUM3RSxLQUFLLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztxQkFDOUM7b0JBRUQscUVBQXFFO29CQUNyRSxJQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ3hDLElBQUksT0FBTyxHQUFHLHFCQUFTLENBQUMsNkJBQTZCLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ25FLE9BQU8sT0FBTyxFQUFFO3dCQUNaLHFFQUFxRTt3QkFDckUsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTs0QkFDeEIsSUFBTSxXQUFXLEdBQUcsT0FBc0IsQ0FBQzs0QkFDM0MsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFVBQVU7Z0NBQy9DLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxFQUFFO2dDQUM3QyxLQUFLLEVBQUUsQ0FBQzs2QkFDWDt5QkFDSjt3QkFDRCxPQUFPLEdBQUcscUJBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDOUQ7b0JBRUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBRyxLQUFLLGVBQUssU0FBUyxDQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDaEU7Z0JBQ0QsT0FBTyxNQUFNLENBQUM7WUFDbEIsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLFlBQVk7SUFDWixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsSUFBSyxhQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQXpDLENBQXlDO1NBQ2xFO0tBQ0osQ0FBQztJQUVGLFlBQVk7SUFDWixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDbkIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQztRQUN0QyxLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCO2dCQUNiLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ3JCLGtDQUFrQztvQkFDbEMsa0pBQWtKO29CQUNsSiwwRUFBMEU7b0JBQzFFLElBQUk7b0JBQ0osK0NBQStDO29CQUMvQyxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7b0JBQ25CLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDakMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxLQUFLLE1BQU0sRUFBRTt3QkFDL0MsU0FBUyxJQUFJLFlBQVksQ0FBQztxQkFDN0I7b0JBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxFQUFFO3dCQUNwQyxTQUFTLElBQUksWUFBSyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUUsQ0FBQztxQkFDaEc7b0JBRUQsTUFBTSxHQUFHLGVBQVEsU0FBUyxDQUFFLENBQUM7b0JBQzdCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDcEMsSUFBSSxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO3dCQUM5RCxNQUFNLElBQUksa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQ3hDO29CQUNELE1BQU0sSUFBSSxHQUFHLENBQUM7aUJBQ2pCO2dCQUNELE9BQU8sTUFBTSxDQUFDO1lBQ2xCLENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixhQUFhO0lBQ2IsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ2hCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztRQUM1QixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCLElBQUssYUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyx5QkFBa0IsQ0FBRSxNQUFNLENBQUMsT0FBTyxFQUF1QixDQUFDLEtBQUssQ0FBQyxNQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBOUYsQ0FBOEY7U0FDdkg7S0FDSixDQUFDO0lBRUYsbUJBQW1CO0lBQ25CLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUN0QixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsSUFBSyxhQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLHlCQUFrQixDQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQXVCLENBQUMsS0FBSyxDQUFDLE1BQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUE5RixDQUE4RjtTQUN2SDtLQUNKLENBQUM7SUFFRixhQUFhO0lBQ2IsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ2hCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztRQUM1QixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCLEVBQUUsVUFBcUIsRUFBRSxJQUFhO2dCQUNuRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRTtvQkFDckIsSUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO29CQUM1RCxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7b0JBQ3JCLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRTt3QkFDbEQsUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEtBQUssTUFBTSxDQUFDO3FCQUMxRTt5QkFBTTt3QkFDSCxRQUFRLEdBQUksTUFBTSxDQUFDLE9BQU8sRUFBVSxDQUFDLE9BQU8sQ0FBQztxQkFDaEQ7b0JBQ0QsSUFBSSxRQUFRLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7b0JBQzFELE9BQU8sV0FBSSxRQUFRLGVBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsU0FBRyxRQUFRLFNBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFNBQUcsMkJBQTJCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFHO2lCQUNuSztxQkFBTTtvQkFDSCxPQUFPLEVBQUUsQ0FBQztpQkFDYjtZQUNMLENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixpQkFBaUI7SUFDakIsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDO1FBQ3BCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztRQUM1QixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCLElBQUssYUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxVQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBL0QsQ0FBK0Q7U0FDeEY7S0FDSixDQUFDO0lBRUYsaUJBQWlCO0lBQ2pCLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUNwQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsSUFBSyxRQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxhQUFhLElBQUksRUFBRSxDQUFDLEVBQTVDLENBQTRDO1NBQ3JFO0tBQ0osQ0FBQztJQUVGLGNBQWM7SUFDZCxJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDakIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO1FBQzVCLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsRUFBRSxVQUFxQixFQUFFLElBQWE7Z0JBQ25ELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUNwQyxJQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3RELElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDakMseUVBQXlFO2dCQUN6RSxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQztvQkFDNUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDO29CQUNwQyxDQUFDLENBQUUsTUFBTSxDQUFDLE9BQU8sRUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDdEMsT0FBTyxXQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFHLFFBQVEsZUFBSyxLQUFLLFNBQUcsMkJBQTJCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFHLENBQUM7WUFDMUgsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGtCQUFrQjtJQUNsQixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDckIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO1FBQzVCLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsRUFBRSxVQUFxQixFQUFFLElBQWE7Z0JBQ25ELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUNwQyxJQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQzFELE9BQU8sV0FBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBRyxRQUFRLHVCQUFhLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBRyxDQUFDO1lBQzFILENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixXQUFXO0lBQ1gsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ2QsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO1FBQzVCLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7Z0JBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7b0JBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQ3BDLElBQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbkQsT0FBTyxXQUFJLFFBQVEsU0FBSSxNQUFNLENBQUMsT0FBTyxFQUFrQixDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxNQUFHLENBQUM7WUFDekosQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGVBQWU7SUFDZixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDbEIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCO2dCQUNiLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUk7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQy9DLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUNyQixPQUFPLHNCQUFlLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxNQUFHLENBQUM7aUJBQ3ZEO3FCQUFNO29CQUNILE9BQU8sb0JBQWEsa0JBQWtCLENBQUMsTUFBTSxDQUFDLE1BQUcsQ0FBQztpQkFDckQ7WUFDTCxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsZ0JBQWdCO0lBQ2hCLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNuQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7Z0JBQ2IsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDL0MsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ3JCLE9BQU8sMEJBQW1CLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxNQUFHLENBQUM7aUJBQzNEO3FCQUFNO29CQUNILE9BQU8sd0JBQWlCLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxNQUFHLENBQUM7aUJBQ3pEO1lBQ0wsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLFlBQVk7SUFDWixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQztRQUM5QyxLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCOztnQkFDYixJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQU0sQ0FBQyxnQkFBZ0IsRUFBRSwwQ0FBRSxVQUFVLEVBQUU7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQy9FLElBQU0sSUFBSSxHQUFHLFlBQU0sQ0FBQyxnQkFBZ0IsRUFBRSwwQ0FBRSxVQUFVLEVBQUUsQ0FBQztnQkFDckQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxrQkFBa0IsS0FBSyxjQUFjLEVBQUU7b0JBQzdGLE9BQU8sMEJBQW1CLENBQUMsYUFBTSxDQUFDLFdBQVcsRUFBRSwwQ0FBRSxJQUFJLElBQUcsRUFBRSxDQUFDLHlCQUFzQixDQUFDO2lCQUNyRjtnQkFDRCxPQUFPLFVBQUcsQ0FBQyxhQUFNLENBQUMsV0FBVyxFQUFFLDBDQUFFLElBQUksSUFBRyxFQUFFLENBQUMsQ0FBRSxDQUFDO1lBQ2xELENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixxQkFBcUI7SUFDckIsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDbEIsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQixJQUFLLFNBQUUsRUFBRixDQUFFO1NBQzNCO0tBQ0osQ0FBQztJQUVGLGVBQWU7SUFDWCxJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDbEIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO1FBQzVCLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsRUFBRSxVQUFxQixFQUFFLElBQWE7O2dCQUNuRCxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUNuQixPQUFPLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUMvRjtnQkFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUN0QixPQUFPLEVBQUUsQ0FBQztpQkFDYjtnQkFFRCxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3hGLFVBQVUsSUFBSSx5QkFBa0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBRSxDQUFDO2lCQUN0RTtnQkFDRCxVQUFVLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRTFDLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxNQUFNLENBQUM7Z0JBQ2pILElBQU0sV0FBVyxHQUFHLDJCQUEyQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFFNUQsSUFBSSxXQUFXLEVBQUU7b0JBQ2IsSUFBTSxXQUFXLEdBQUcsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBSSxDQUFDLFdBQVcsMENBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDekUsSUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFJLFdBQVcsQ0FBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzNELE9BQU8sV0FBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsNEJBQWtCLFVBQVUsU0FBRyxXQUFXLGNBQUksYUFBYSxDQUFFLENBQUM7aUJBQ3JHO2dCQUVELE9BQU8sV0FBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsaUJBQU8sVUFBVSxTQUFHLFdBQVcsTUFBRyxDQUFDO1lBQzNFLENBQUM7U0FDSjtLQUNKLENBQUM7SUFFTixnQkFBZ0I7SUFDaEIsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQ25CLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztRQUM1QixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCO2dCQUNiLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtvQkFBRSxPQUFPLEVBQUUsQ0FBQztnQkFFakMsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUVqQyxpRkFBaUY7Z0JBQ2pGLElBQUksWUFBWSxHQUFHLGdCQUFnQixDQUFDO2dCQUVwQyxnQ0FBZ0M7Z0JBQ2hDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsS0FBSyxNQUFNLEVBQUU7b0JBQy9DLFlBQVksSUFBSSxZQUFZLENBQUM7aUJBQ2hDO2dCQUVELDBDQUEwQztnQkFDMUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxFQUFFO29CQUNwQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO2lCQUNoRztnQkFFRCx3REFBd0Q7Z0JBQ3hELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzVDLElBQUksS0FBSyxFQUFFO29CQUNQLFlBQVksSUFBSSxrQkFBVyxLQUFLLENBQUUsQ0FBQztpQkFDdEM7cUJBQU07b0JBQ0gsZ0dBQWdHO29CQUNoRyxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7b0JBQ3hCLElBQUksUUFBTSxHQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMzQyxPQUFPLFFBQU0sRUFBRTt3QkFDWCxJQUFNLFVBQVUsR0FBRyxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxRQUFNLENBQUMsQ0FBQzt3QkFDcEQsSUFBSSxVQUFVLEtBQUssT0FBTyxJQUFJLFVBQVUsS0FBSyxNQUFNLEVBQUU7NEJBQ2pELDJDQUEyQzs0QkFDM0MsSUFBSSxXQUFXLEdBQUcscUJBQVMsQ0FBQyxhQUFhLENBQUMsUUFBTSxDQUFDLENBQUM7NEJBQ2xELE9BQU8sV0FBVyxFQUFFO2dDQUNoQixJQUFNLGVBQWUsR0FBRyxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQ0FDOUQsSUFBSSxlQUFlLEtBQUssVUFBVSxFQUFFO29DQUNoQyxlQUFlLEVBQUUsQ0FBQztvQ0FDbEIsTUFBTTtpQ0FDVDtxQ0FBTSxJQUFJLGVBQWUsS0FBSyxNQUFNLEVBQUU7b0NBQ25DLE1BQU07aUNBQ1Q7Z0NBQ0QsV0FBVyxHQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDOzZCQUN0RDt5QkFDSjt3QkFDRCxRQUFNLEdBQUcscUJBQVMsQ0FBQyxhQUFhLENBQUMsUUFBTSxDQUFDLENBQUM7cUJBQzVDO29CQUNELElBQUksZUFBZSxHQUFHLENBQUMsRUFBRTt3QkFDckIsWUFBWSxJQUFJLGtCQUFXLGVBQWUsQ0FBRSxDQUFDO3FCQUNoRDtpQkFDSjtnQkFFRCxxRUFBcUU7Z0JBQ3JFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ2xELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBRWhELElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ3ZCLGdHQUFnRztvQkFDaEcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO29CQUNaLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztvQkFDZCxJQUFNLFFBQU0sR0FBRyxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxRQUFNLEVBQUU7d0JBQ1IsOENBQThDO3dCQUM5QyxJQUFJLEtBQUssR0FBRyxxQkFBUyxDQUFDLHdCQUF3QixDQUFDLFFBQU0sQ0FBQyxDQUFDO3dCQUN2RCxPQUFPLEtBQUssRUFBRTs0QkFDVixJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLEVBQUUsZUFBZTtnQ0FDdkMsSUFBTSxTQUFTLEdBQUcsS0FBb0IsQ0FBQztnQ0FDdkMsSUFBSSxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FBSyxVQUFVLEVBQUU7b0NBQ3BELEtBQUssRUFBRSxDQUFDO29DQUNSLElBQUksU0FBUyxLQUFLLElBQUksRUFBRTt3Q0FDcEIsR0FBRyxHQUFHLEtBQUssQ0FBQztxQ0FDZjtpQ0FDSjs2QkFDSjs0QkFDRCxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQzt5QkFDN0I7cUJBQ0o7b0JBQ0QsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDMUIsT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDOUI7Z0JBRUQsWUFBWSxJQUFJLFlBQUssUUFBUSxpQkFBTyxPQUFPLE9BQUksQ0FBQztnQkFFaEQsT0FBTyxZQUFZLENBQUM7WUFDeEIsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLHFCQUFxQjtJQUVyQiwyRUFBMkU7SUFDM0UscUVBQXFFO0lBQ3JFLDhEQUE4RDtJQUM5RCxJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQztRQUNkLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7O2dCQUNiLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtvQkFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLLFNBQVM7b0JBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxnQ0FBZ0M7Z0JBQ3BGLElBQU0sUUFBUSxHQUFHLE1BQUMsTUFBTSxDQUFDLE9BQU8sRUFBa0IsQ0FBQyxXQUFXLG1DQUFJLEVBQUUsQ0FBQztnQkFDckUsSUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLE9BQU8sS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7b0JBQUUsS0FBSyxFQUFFLENBQUM7Z0JBQ3pFLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QixPQUFPLEdBQUcsSUFBSSxLQUFLLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7b0JBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQzFELElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsT0FBTyxXQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxtQ0FBSSxFQUFFLENBQUM7WUFDNUMsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztRQUM1QixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCO2dCQUNiLGtFQUFrRTtnQkFDbEUsd0VBQXdFO2dCQUN4RSx3RUFBd0U7Z0JBQ3hFLHFFQUFxRTtnQkFDckUsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBaUIsQ0FBQztnQkFDN0MsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFFBQVE7b0JBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQy9DLElBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO2dCQUN0RCxPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsMEJBQW1CLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQUcsQ0FBQyxDQUFDLENBQUMsNEJBQXFCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQUc7WUFDaE0sQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLCtFQUErRTtJQUMvRSx5RkFBeUY7SUFDekYsd0ZBQXdGO0lBQ3hGLDhGQUE4RjtJQUM5RixzRkFBc0Y7SUFDdEYsNkRBQTZEO0lBQzdELElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ2pCLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUNwQixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCO2dCQUNiLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDbkMsSUFBTSxJQUFJLEdBQUksTUFBTSxDQUFDLFVBQVUsRUFBa0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZFLElBQU0sY0FBYyxHQUFHLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLGNBQWMsQ0FBQztnQkFDbEUsNEVBQTRFO2dCQUM1RSxzRUFBc0U7Z0JBQ3RFLElBQUksY0FBYyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDckQsSUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDcEQsT0FBTyxXQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFHLEtBQUssTUFBRyxDQUFDO1lBQ3BELENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQztRQUNiLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7Z0JBQ2IsSUFBSTtvQkFDQSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQzFCLDhGQUE4RjtvQkFDOUYsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQU0sV0FBSSxFQUFKLENBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDO3dCQUFDLENBQUM7b0JBQ3pKLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2lCQUM1RTtnQkFBQyxPQUFPLEdBQUcsRUFBRTtvQkFDVixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN0QjtZQUNMLENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQztRQUNiLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsSUFBSyxTQUFFLEVBQUYsQ0FBRTtTQUMzQjtLQUNKLENBQUM7SUFFRixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztRQUNoQixLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO1FBQzVCLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsRUFBRSxVQUFxQixFQUFFLElBQWEsWUFBSyxRQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxhQUFNLENBQUMsVUFBVSxFQUFFLDBDQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBSyxVQUFVLElBQUksV0FBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsNEJBQWtCLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBRyxDQUFDLElBQUksSUFBSTtZQUNqUSxVQUFDLE1BQWdCLEVBQUUsVUFBcUIsRUFBRSxJQUFhOztnQkFDbkQsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksYUFBTSxDQUFDLFVBQVUsRUFBRSwwQ0FBRSxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQUssTUFBTSxFQUFFO29CQUM3RSxJQUFJLEtBQUssR0FBRyxPQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQXVCLDBDQUFFLEtBQUssS0FBSSxFQUFFLENBQUM7b0JBQ25FLEtBQUssR0FBRyxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDbkYsT0FBTyxXQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxtQkFBUywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLGdCQUFNLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFHLEtBQUssTUFBRyxDQUFDO2lCQUNqSjtnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1lBQ0QsVUFBQyxNQUFnQixFQUFFLFVBQXFCLEVBQUUsSUFBYTs7Z0JBQ25ELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLGFBQU0sQ0FBQyxVQUFVLEVBQUUsMENBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFLLE9BQU8sRUFBRTtvQkFDOUUsSUFBTSxHQUFHLEdBQUksTUFBTSxDQUFDLFVBQVUsRUFBdUIsQ0FBQyxLQUFLLENBQUM7b0JBQzVELElBQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQUssR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25GLElBQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQUssR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25GLElBQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQUssR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEYsT0FBTyxXQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxzQkFBWSwyQkFBMkIsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLGdCQUFNLENBQUMsbUJBQVMsQ0FBQyxxQkFBVyxDQUFDLFlBQVMsQ0FBQztpQkFDaEo7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztZQUNELFVBQUMsTUFBZ0IsRUFBRSxVQUFxQixFQUFFLElBQWE7O2dCQUNuRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxhQUFNLENBQUMsVUFBVSxFQUFFLDBDQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBSyxPQUFPLEVBQUU7b0JBQzlFLElBQU0sR0FBRyxHQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQXVCLENBQUMsS0FBSyxDQUFDO29CQUM1RCxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO29CQUNaLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ3ZCLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN6QixDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDNUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztxQkFDbEM7b0JBQ0QsT0FBTyxXQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxzQkFBWSwyQkFBMkIsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLDZCQUFtQixDQUFDLDZCQUFtQixDQUFDLGdEQUE2QyxDQUFDO2lCQUMvTDtnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1lBQ0QsVUFBQyxNQUFnQixFQUFFLFVBQXFCLEVBQUUsSUFBYTs7Z0JBQ25ELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLGFBQU0sQ0FBQyxVQUFVLEVBQUUsMENBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFLLE1BQU0sRUFBRTtvQkFDN0UsSUFBTSxHQUFHLEdBQUksTUFBTSxDQUFDLFVBQVUsRUFBdUIsQ0FBQyxLQUFLLENBQUM7b0JBQzVELElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztvQkFDWixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7b0JBQ1osSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDO29CQUNkLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ3ZCLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN6QixDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDNUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDL0IsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO3FCQUMvQjtvQkFDRCxPQUFPLFdBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLHNCQUFZLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsNkJBQW1CLENBQUMsK0JBQXFCLEdBQUcsK0JBQXFCLENBQUMsK0NBQTRDLENBQUM7aUJBQ3hOO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFDRCxVQUFDLE1BQWdCLEVBQUUsVUFBcUIsRUFBRSxJQUFhOztnQkFDbkQsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksYUFBTSxDQUFDLFVBQVUsRUFBRSwwQ0FBRSxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQUssZ0JBQWdCLEVBQUU7b0JBQ3ZGLElBQU0sR0FBRyxHQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQXVCLENBQUMsS0FBSyxDQUFDLENBQUMsbUJBQW1CO29CQUNoRixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7b0JBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO29CQUNaLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztvQkFDZCxJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7b0JBQ2YsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDO29CQUNkLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztvQkFDZixJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUN2QixJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDekIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQzVCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQy9CLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzt3QkFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUU7NEJBQ2pELElBQUksR0FBRyxJQUFJLENBQUM7eUJBQ2Y7NkJBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFOzRCQUM3QixJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt5QkFDL0I7NkJBQU07NEJBQ0gsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQzt5QkFDdEM7d0JBQ0QsR0FBRyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7d0JBQzdCLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztxQkFDOUM7b0JBQ0QsT0FBTyxXQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxzQkFBWSwyQkFBMkIsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLDZCQUFtQixDQUFDLCtCQUFxQixHQUFHLCtCQUFxQixDQUFDLDZCQUFtQixJQUFJLCtCQUFxQixHQUFHLDZCQUFtQixJQUFJLCtEQUE0RCxDQUFDO2lCQUM5UztnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1lBQ0QsVUFBQyxNQUFnQixFQUFFLFVBQXFCLEVBQUUsSUFBYTs7Z0JBQ25ELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLGFBQU0sQ0FBQyxVQUFVLEVBQUUsMENBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFLLE1BQU0sRUFBRTtvQkFDN0UsSUFBTSxHQUFHLEdBQUksTUFBTSxDQUFDLFVBQVUsRUFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxtQkFBbUI7b0JBQ2hGLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztvQkFDZixJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7b0JBQ2QsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO29CQUNmLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ3ZCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQzFCLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDOUIsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUU7NEJBQzdCLElBQUksR0FBRyxJQUFJLENBQUM7eUJBQ2Y7NkJBQU0sSUFBSSxLQUFLLEdBQUcsRUFBRSxFQUFFOzRCQUNuQixJQUFJLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQzt5QkFDckI7NkJBQU07NEJBQ0gsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQzt5QkFDNUI7d0JBQ0QsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZCxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7cUJBQ3BDO29CQUNELE9BQU8sV0FBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsK0JBQXFCLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsNEJBQWtCLElBQUksK0JBQXFCLEdBQUcsNkJBQW1CLElBQUksaUVBQThELENBQUM7aUJBQ3RQO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFDRCxVQUFDLE1BQWdCLEVBQUUsVUFBcUIsRUFBRSxJQUFhOztnQkFDbkQsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksYUFBTSxDQUFDLFVBQVUsRUFBRSwwQ0FBRSxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQUssTUFBTSxFQUFFO29CQUM3RSxJQUFNLEdBQUcsR0FBSSxNQUFNLENBQUMsVUFBVSxFQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVc7b0JBQ3hFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztvQkFDZixJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7b0JBQ2YsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDdkIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDM0IsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZixJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNsQjtvQkFDRCxPQUFPLFdBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLHNCQUFZLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsNkJBQW1CLElBQUksOEJBQW9CLElBQUksK0NBQTRDLENBQUM7aUJBQ3JNO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFDRCxVQUFDLE1BQWdCLFlBQUssb0JBQU0sQ0FBQyxVQUFVLEVBQUUsMENBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3hGLFVBQUMsTUFBZ0IsSUFBSyxRQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxhQUFNLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxxQkFBVyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFFLENBQUMsSUFBSSxJQUFJLEVBQTFHLENBQTBHO1NBQ25JO0tBQ0osQ0FBQztJQUVGLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ2IsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQjs7Z0JBQ2Isa0RBQWtEO2dCQUNsRCxzRkFBc0Y7Z0JBQ3RGLElBQU0scUJBQXFCLEdBQUcsa0NBQWtDLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3pFLElBQU0sU0FBUyxHQUFHLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBTSxDQUFDLFdBQVcsRUFBRSwwQ0FBRSxJQUFJLEtBQUksRUFBRSxDQUFDLENBQUM7Z0JBRWxGLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxLQUFLLE1BQU0sRUFBRTtvQkFDeEQsT0FBTyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQUcsU0FBUyxDQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDcEQ7cUJBQU07b0JBQ0gsT0FBTyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFZLFNBQVMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQzdEO1lBQ0wsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGtCQUFrQjtJQUNsQixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztRQUNoQixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCLElBQUssYUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFyRCxDQUFxRDtTQUM5RTtLQUNKLENBQUM7SUFFRixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7O2dCQUNiLG9DQUFvQztnQkFDcEMsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFO29CQUFFLE9BQU8sU0FBUyxDQUFDO2dCQUMxQyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxRQUFRLEtBQUksY0FBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUU7b0JBQzdGLE9BQU8sUUFBUSxDQUFDO2lCQUNuQjtZQUNMLENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztRQUNoQixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCLElBQUssYUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBcEQsQ0FBb0Q7U0FDN0U7S0FDSixDQUFDO0lBRUYsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCOztnQkFDYixJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7b0JBQUUsT0FBTyxTQUFTLENBQUM7Z0JBQ3hDLElBQU0sRUFBRSxHQUFHLGFBQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLDBDQUFFLFNBQVMsS0FBSSxFQUFFLENBQUM7Z0JBQ3BFLElBQU0sRUFBRSxHQUFHLGFBQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLDBDQUFFLFNBQVMsS0FBSSxFQUFFLENBQUM7Z0JBQ3BFLElBQUksRUFBRSxLQUFLLEdBQUc7b0JBQUUsT0FBTyxVQUFHLEVBQUUsZUFBWSxDQUFDO2dCQUN6QyxJQUFJLEVBQUUsS0FBSyxHQUFHO29CQUFFLE9BQU8sVUFBRyxFQUFFLGFBQVUsQ0FBQztnQkFDdkMsT0FBTyxVQUFHLEVBQUUsc0JBQVksRUFBRSxNQUFHLENBQUM7WUFDbEMsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGtFQUFrRTtJQUNsRSx1RUFBdUU7SUFDdkUsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSxJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUNsQixLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQztRQUN0QyxLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCLEVBQUUsVUFBcUIsRUFBRSxJQUFhOztnQkFDbkQsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUNqQyxJQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxXQUFXO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUM5QiwrREFBK0Q7Z0JBQy9ELGlDQUFpQztnQkFDakMsSUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVM7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ3RGLElBQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDeEQsV0FBQyxJQUFJLFFBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUyxFQUF0QyxDQUFzQyxDQUM5QyxDQUFDO2dCQUNGLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDeEUsSUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7Z0JBQy9FLDBFQUEwRTtnQkFDMUUsaUVBQWlFO2dCQUNqRSxJQUFNLFNBQVMsR0FBRyxpQkFBVyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsMENBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ2pFLElBQU0sV0FBVyxHQUFHLGtCQUFXLENBQUMsV0FBVywwQ0FBRSxJQUFJLEVBQUUsS0FBSSxFQUFFLENBQUM7Z0JBQzFELElBQU0sS0FBSyxHQUFHLFNBQVMsSUFBSSxXQUFXLENBQUM7Z0JBQ3ZDLElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsWUFBSSxLQUFLLFNBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3Qyx3RUFBd0U7Z0JBQ3hFLDRFQUE0RTtnQkFDNUUsSUFBSSxPQUFPLEdBQUcsMkJBQTJCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsT0FBTyxJQUFJLFNBQVMsSUFBSSxXQUFXLEVBQUU7b0JBQ3RDLE9BQU8sR0FBRyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBVyxXQUFXLFdBQVEsQ0FBQyxDQUFDLENBQUMsY0FBTSxXQUFXLE9BQUcsQ0FBQztpQkFDckY7Z0JBQ0QsT0FBTyxXQUFJLFFBQVEscUJBQVcsUUFBUSxTQUFHLE9BQU8sTUFBRyxDQUFDO1lBQ3hELENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRiw4Q0FBOEM7SUFFOUMsMkRBQTJEO0lBQzNELElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWM7WUFDaEYsZUFBZSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTTtZQUN6RSxNQUFNLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDO1FBQ3JGLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQixJQUFLLFNBQUUsRUFBRixDQUFFO1NBQzNCO0tBQ0osQ0FBQztJQUVGLHNGQUFzRjtJQUN0RixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGFBQWE7WUFDM0UsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO1FBQzNDLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQixJQUFLLFNBQUUsRUFBRixDQUFFO1NBQzNCO0tBQ0osQ0FBQztDQUNMOzs7Ozs7Ozs7Ozs7OztBQzU1Q0QsNEdBQW1EO0FBRW5ELG1HQUE2QztBQUM3QyxnR0FBcUY7QUFDckYsNkZBQStDO0FBQy9DLHdIQUFtRTtBQUNuRSxtR0FBbUQ7QUFFbkQ7O0dBRUc7QUFDSCxTQUFTLG9CQUFvQixDQUFDLFNBQW1CLEVBQUUsU0FBbUI7O0lBQ2xFLHdEQUF3RDtJQUN4RCxJQUFJLFNBQVMsSUFBSSxnQkFBUyxDQUFDLE9BQU8sRUFBRSwwQ0FBRSxRQUFRLE1BQUssT0FBTyxFQUFFO1FBQ3hELFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFNLFdBQUksRUFBSixDQUFJLENBQUM7S0FDakM7SUFDRCxJQUFNLGFBQWEsR0FBRyx5QkFBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxJQUFNLFdBQVcsR0FBRyx5QkFBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdkUsSUFBTSxXQUFXLEdBQUcseUJBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZFLElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDNUIsSUFBSSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBRTFCLHdGQUF3RjtJQUN4RixJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxhQUFhLEtBQUssV0FBVyxDQUFDLGFBQWEsSUFBSSxXQUFXLENBQUMsT0FBTyxLQUFLLFdBQVcsQ0FBQyxPQUFPLEVBQUU7UUFDeEgsNENBQTRDO1FBQzVDLElBQUksVUFBVSxHQUFHLHlCQUFXLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzlFLElBQUksYUFBYSxHQUFHLFVBQVUsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBSSxVQUFVLFNBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFGLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBSSxhQUFhLGlCQUFPLENBQUMsV0FBVyxDQUFDLGFBQWEsR0FBQyxDQUFDLENBQUMsU0FBRyxXQUFXLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsV0FBVyxDQUFDLGFBQWEsR0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBRyxDQUFDLENBQUM7S0FDeEs7SUFFRCw4RkFBOEY7SUFDOUYsSUFBSSxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsYUFBYSxLQUFLLFdBQVcsQ0FBQyxhQUFhLElBQUksV0FBVyxDQUFDLE9BQU8sS0FBSyxXQUFXLENBQUMsT0FBTyxFQUFFO1FBQ3hILCtDQUErQztRQUMvQyxJQUFJLGFBQWEsR0FBRyx5QkFBVyxDQUFDLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNwRixJQUFJLGFBQWEsR0FBRyxhQUFhLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQUksYUFBYSxTQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQUksYUFBYSxvQkFBVSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUMsQ0FBQyxDQUFDLFNBQUcsV0FBVyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQUcsQ0FBQyxDQUFDO0tBQzNLO0lBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFVSxhQUFLLEdBQXFCO0lBQ2pDLDRDQUE0QztJQUU1QyxlQUFlO0lBQ2YsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQ2xCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUM7UUFDdkMsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQixFQUFFLFVBQXFCLEVBQUUsSUFBYTtnQkFDbkQsSUFBSSxJQUFJLEtBQUssV0FBVyxJQUFJLENBQUMsdUJBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUNsRixJQUFNLFFBQVEsR0FBRywrQkFBa0IsRUFBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZELE9BQU8sV0FBSSw4QkFBaUIsRUFBQyxNQUFNLENBQUMsU0FBRyxRQUFRLE1BQUcsQ0FBQztZQUN2RCxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsY0FBYztJQUNkLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUNqQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDO1FBQ3RDLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsRUFBRSxVQUFxQixFQUFFLElBQWE7Z0JBQ25ELElBQUksSUFBSSxLQUFLLFdBQVcsSUFBSSxDQUFDLHVCQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDbEYsSUFBTSxRQUFRLEdBQUcsK0JBQWtCLEVBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUM3RCxPQUFPLFdBQUksOEJBQWlCLEVBQUMsTUFBTSxDQUFDLFNBQUcsUUFBUSxNQUFHLENBQUM7WUFDdkQsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGtCQUFrQjtJQUNsQixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDckIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO1FBQ3pCLEtBQUssRUFBRTtZQUNILFVBQUMsT0FBaUIsSUFBSyxxQkFBYyxFQUFkLENBQWM7U0FDeEM7S0FDSixDQUFDO0lBRUYsZUFBZTtJQUNmLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUNsQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7UUFDekIsS0FBSyxFQUFFO1lBQ0gsVUFBQyxPQUFpQixJQUFLLGtCQUFXLEVBQVgsQ0FBVztTQUNyQztLQUNKLENBQUM7SUFFRixZQUFZO0lBQ1osSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO1FBQ3hCLEtBQUssRUFBRTtZQUNILG9CQUFvQjtTQUN2QjtLQUNKLENBQUM7SUFFRixvQkFBb0I7SUFDcEIsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsY0FBYyxDQUFDO1FBQ3ZCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUN4QixLQUFLLEVBQUU7WUFDSCxvQkFBb0I7U0FDdkI7S0FDSixDQUFDO0lBRUYscUJBQXFCO0lBQ3JCLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLGVBQWUsQ0FBQztRQUN4QixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDO1FBQ3RDLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsRUFBRSxVQUFxQixFQUFFLElBQWE7Z0JBQ25ELElBQUksSUFBSSxLQUFLLFdBQVcsSUFBSSxDQUFDLHVCQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDbEYsT0FBTyxXQUFJLDhCQUFpQixFQUFDLE1BQU0sQ0FBQywwQkFBdUIsQ0FBQztZQUNoRSxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsbUJBQW1CO0lBQ25CLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUN0QixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDO1FBQ3RDLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsRUFBRSxVQUFxQixFQUFFLElBQWE7Z0JBQ25ELElBQUksSUFBSSxLQUFLLFdBQVcsSUFBSSxDQUFDLHVCQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDbEYsT0FBTyxXQUFJLDhCQUFpQixFQUFDLE1BQU0sQ0FBQyx5QkFBc0IsQ0FBQztZQUMvRCxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsY0FBYztJQUNkLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUNqQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7UUFDekIsS0FBSyxFQUFFO1lBQ0gsVUFBQyxPQUFpQixJQUFLLGlCQUFVLEVBQVYsQ0FBVTtTQUNwQztLQUNKLENBQUM7SUFFRixZQUFZO0lBQ1osSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQztRQUN4QyxLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCO2dCQUNiLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDL0IsT0FBTyxXQUFXLENBQUM7aUJBQ3RCO3FCQUFNO29CQUNILE9BQU8sV0FBSSw4QkFBaUIsRUFBQyxNQUFNLENBQUMsaUJBQWM7aUJBQ3JEO1lBQ0wsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGFBQWE7SUFDYixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDaEIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO1FBQ3pCLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7O2dCQUNiLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLEVBQUU7b0JBQ3ZELElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDakMsSUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUM3QyxXQUFDLElBQUksUUFBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLEVBQXRDLENBQXNDLENBQzlDLENBQUM7b0JBQ0YsSUFBSSxVQUFVLEVBQUU7d0JBQ1osZ0VBQWdFO3dCQUNoRSw2Q0FBNkM7d0JBQzdDLE9BQU8sRUFBRSxDQUFDO3FCQUNiO29CQUNELG9FQUFvRTtvQkFDcEUscUVBQXFFO29CQUNyRSx1RUFBdUU7b0JBQ3ZFLE9BQU8sZ0NBQXVCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxNQUFHLENBQUM7aUJBQ3pGO2dCQUNELElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUk7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQy9DLElBQUksYUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQywwQ0FBRSxPQUFPLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxNQUFLLFFBQVEsRUFBRTtvQkFDL0csT0FBTyxFQUFFLENBQUM7aUJBQ2I7Z0JBQ0QsT0FBTyxtQkFBWSwrQkFBa0IsRUFBQyxNQUFNLENBQUMsTUFBRyxDQUFDO1lBQ3JELENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixlQUFlO0lBQ2YsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ2hCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDO1FBQ3BCLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7O2dCQUNiLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLEVBQUU7b0JBQ3ZELElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDakMsSUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUM3QyxXQUFDLElBQUksUUFBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLEVBQXRDLENBQXNDLENBQzlDLENBQUM7b0JBQ0YsSUFBSSxVQUFVLEVBQUU7d0JBQ1osbURBQW1EO3dCQUNuRCxPQUFPLElBQUksQ0FBQztxQkFDZjtvQkFDRCxzRUFBc0U7b0JBQ3RFLE9BQU8sZ0NBQXVCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxNQUFHLENBQUM7aUJBQ3pGO2dCQUNELElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUk7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQy9DLElBQUksYUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQywwQ0FBRSxPQUFPLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxNQUFLLFFBQVEsRUFBRTtvQkFDL0csT0FBTyxFQUFFLENBQUM7aUJBQ2I7Z0JBQ0QsT0FBTyxFQUFFLENBQUM7WUFDZCxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsWUFBWTtJQUNaLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztRQUN2QixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCOztnQkFDYixJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFpQixDQUFDO2dCQUM3QyxJQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBRTFJLGtGQUFrRjtnQkFDbEYsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN6RCxJQUFNLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFnQixDQUFDO29CQUVoRSxpRkFBaUY7b0JBQ2pGLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztvQkFDMUIsSUFBSSx5QkFBeUIsR0FBRyxLQUFLLENBQUM7b0JBQ3RDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7b0JBRWxDLE9BQU8sUUFBUSxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7d0JBQ2xDLG9DQUFvQzt3QkFDcEMsSUFBTSxZQUFZLEdBQUcsbUJBQVEsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3hELElBQUksWUFBWSxLQUFLLE1BQU07NEJBQ3ZCLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSTs0QkFDeEMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLEVBQUU7NEJBQzFDLGFBQWEsR0FBRyxJQUFJLENBQUM7NEJBQ3JCLE1BQU07eUJBQ1Q7d0JBRUQsZ0RBQWdEO3dCQUNoRCxJQUFJLFlBQVksS0FBSSx1Q0FBZSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsMENBQUUsc0JBQXNCLEdBQUU7NEJBQ3RGLHlCQUF5QixHQUFHLElBQUksQ0FBQzs0QkFDakMsTUFBTTt5QkFDVDt3QkFFRCxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztxQkFDckM7b0JBRUQsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLHlCQUF5QixFQUFFO3dCQUM5QyxRQUFRLEVBQUUsQ0FBQztxQkFDZDtpQkFDSjtnQkFFRCxJQUFJLFFBQVEsS0FBSyxDQUFDO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUNoQyxPQUFPLFdBQUksOEJBQWlCLEVBQUMsTUFBTSxDQUFDLHFCQUFXLFFBQVEsWUFBUyxDQUFDO1lBQ3JFLENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixZQUFZO0lBQ1osSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQztRQUN0QyxLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCLEVBQUUsVUFBcUIsRUFBRSxJQUFhO2dCQUNuRCxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ2xGLE9BQU8sV0FBSSw4QkFBaUIsRUFBQyxNQUFNLENBQUMsaUJBQWMsQ0FBQztZQUN2RCxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsZUFBZTtJQUNmLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUNsQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7UUFDdkIsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQjtnQkFDYixJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFpQixDQUFDO2dCQUM3QyxJQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2xJLElBQU0sK0JBQStCLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FDckQsb0ZBQW9GLEVBQ3BGLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM5RCxzSkFBc0o7Z0JBQ3RKLG1PQUFtTztnQkFDbk8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFDLElBQUcsRUFBQyxHQUFFLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ25FLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsK0JBQStCLENBQUMsQ0FBQyxpREFBZ0Q7Z0JBQ2xILElBQUksUUFBUSxHQUFHLG1CQUFtQixDQUFDLGNBQWMsR0FBQywrQkFBK0IsQ0FBQyxjQUFjLENBQUMsNkVBQTRFO2dCQUM3SyxJQUFJLFFBQVEsS0FBSyxDQUFDO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUNoQyxPQUFPLFdBQUksOEJBQWlCLEVBQUMsTUFBTSxDQUFDLDBCQUFnQixRQUFRLFlBQVMsQ0FBQztZQUMxRSxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsa0JBQWtCO0lBQ2xCLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQztRQUNyQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDO1FBQ3RDLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsRUFBRSxVQUFxQixFQUFFLElBQWE7Z0JBQ25ELElBQUksSUFBSSxLQUFLLFdBQVcsSUFBSSxDQUFDLHVCQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDbEYsSUFBTSxRQUFRLEdBQUcsK0JBQWtCLEVBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7Z0JBQ2pFLE9BQU8sV0FBSSw4QkFBaUIsRUFBQyxNQUFNLENBQUMsU0FBRyxRQUFRLE1BQUcsQ0FBQztZQUN2RCxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsbUJBQW1CO0lBQ25CLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQztRQUNyQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDO1FBQ3RDLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7Z0JBQ2IsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFFL0MsT0FBTyxtQkFBWSwrQkFBa0IsRUFBQyxNQUFNLENBQUMsTUFBRyxDQUFDO1lBQ3JELENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixjQUFjO0lBQ2QsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ2pCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUM7UUFDdEMsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQixFQUFFLFVBQXFCLEVBQUUsSUFBYTtnQkFDbkQsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDL0MsSUFBSSxJQUFJLEtBQUssV0FBVyxJQUFJLENBQUMsdUJBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUNsRixJQUFNLFFBQVEsR0FBRywrQkFBa0IsRUFBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3RELE9BQU8sV0FBSSw4QkFBaUIsRUFBQyxNQUFNLENBQUMsU0FBRyxRQUFRLE1BQUcsQ0FBQztZQUN2RCxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsV0FBVztJQUNYLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQztRQUNkLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUN4QixLQUFLLEVBQUU7WUFDSCxjQUFNLFNBQUUsRUFBRixDQUFFO1NBQ1g7S0FDSixDQUFDO0lBRUYsaUJBQWlCO0lBQ2pCLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUNwQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7UUFDeEIsS0FBSyxFQUFFO1lBQ0gsb0JBQW9CO1NBQ3ZCO0tBQ0osQ0FBQztJQUVGLGNBQWM7SUFDZCxJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDakIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQztRQUN0QyxLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCLEVBQUUsVUFBcUIsRUFBRSxJQUFhO2dCQUNuRCxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ2xGLElBQU0sUUFBUSxHQUFHLCtCQUFrQixFQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDN0QsT0FBTyxXQUFJLDhCQUFpQixFQUFDLE1BQU0sQ0FBQyxTQUFHLFFBQVEsTUFBRyxDQUFDO1lBQ3ZELENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixhQUFhO0lBQ2IsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ2hCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUN4QixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCO2dCQUNiLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDakMsZ0NBQWdDO2dCQUNoQyxPQUFPLFdBQVcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxPQUFPLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxjQUFNLFdBQUksRUFBSixDQUFJLENBQUM7b0JBQUMsQ0FBQztnQkFDOUUsMEJBQTBCO2dCQUMxQixJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3RDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztnQkFDYixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ2IsMENBQTBDO2dCQUMxQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUU7b0JBQ2xDLElBQUksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO29CQUM3QixPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBTSxXQUFJLEVBQUosQ0FBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFO3dCQUNqRixJQUFNLElBQUksR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ25DLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRSxFQUFFOzRCQUMxQixJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7Z0NBQ2hCLEVBQUUsSUFBSSxDQUFDOzZCQUNWO2lDQUFNO2dDQUNILElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO29DQUMzRSxJQUFNLElBQUksR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFpQixDQUFDO29DQUNsRCxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7aUNBQ3pEOzZCQUNKO3lCQUNKOzZCQUFNLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTs0QkFDdkIsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO3lCQUMzQjtxQkFDSjtpQkFDSjtnQkFFRCxPQUFPLHNCQUFlLElBQUksY0FBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sa0JBQVEsSUFBSSxjQUFJLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxTQUFHLCtCQUFrQixFQUFDLE1BQU0sQ0FBQyxNQUFHLENBQUM7WUFDL0ksQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGVBQWU7SUFDZixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDbEIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQztRQUN0QyxLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCLEVBQUUsVUFBcUIsRUFBRSxJQUFhO2dCQUNuRCxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ2xGLE9BQU8sV0FBSSw4QkFBaUIsRUFBQyxNQUFNLENBQUMsYUFBVSxDQUFDO1lBQ25ELENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixxQkFBcUI7SUFDckIsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDYixLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO1FBQ3ZCLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7Z0JBQ2IsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBaUIsQ0FBQztnQkFDN0MsSUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakgsSUFBSSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsY0FBYyxDQUFDO2dCQUNsRCxPQUFPLFdBQUksOEJBQWlCLEVBQUMsTUFBTSxDQUFDLGdDQUFzQixRQUFRLFlBQVMsQ0FBQztZQUNoRixDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDckIsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsVUFBQyxPQUFpQixJQUFLLGtCQUFXLEVBQVgsQ0FBVztTQUNyQztLQUNKLENBQUM7SUFFRixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsT0FBaUIsSUFBSyxzQkFBZSxFQUFmLENBQWU7U0FDekM7S0FDSixDQUFDO0lBRUYsMEJBQTBCO0lBQzFCLHFGQUFxRjtJQUNyRiwrRUFBK0U7SUFDL0UsdUZBQXVGO0lBQ3ZGLGlGQUFpRjtJQUNqRixrRUFBa0U7SUFDbEUsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDakIsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQjtnQkFDYixJQUFNLElBQUksR0FBSSxNQUFNLENBQUMsVUFBVSxFQUFrQixDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdkUsSUFBTSxjQUFjLEdBQUcsSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssY0FBYyxDQUFDO2dCQUNsRSx3RUFBd0U7Z0JBQ3hFLG9EQUFvRDtnQkFDcEQsSUFBSSxjQUFjLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUNyRCxJQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUNwRCxPQUFPLFdBQUksOEJBQWlCLEVBQUMsTUFBTSxDQUFDLFNBQUcsS0FBSyxNQUFHLENBQUM7WUFDcEQsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLDRCQUE0QjtJQUM1QixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQztRQUNkLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0IsSUFBSyxrQkFBSSw4QkFBaUIsRUFBQyxNQUFNLENBQUMsdUJBQW9CLEVBQWpELENBQWlEO1NBQzFFO0tBQ0osQ0FBQztJQUVGLDhDQUE4QztJQUU5QyxrRkFBa0Y7SUFDbEYsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxjQUFjO1lBQ3BFLGVBQWUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUTtZQUNuRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDO1FBQ3ZGLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQ2xCLEtBQUssRUFBRTtZQUNILGNBQU0sU0FBRSxFQUFGLENBQUU7U0FDWDtLQUNKLENBQUM7Q0FDTCxDQUFDOzs7Ozs7Ozs7Ozs7OztBQ3RnQkYsNEdBQW1EO0FBRW5ELGdHQUFpRTtBQUV0RCxhQUFLLEdBQXFCO0lBQ2pDLDRDQUE0QztJQUU1QyxlQUFlO0lBQ2YsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQ2xCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQjtnQkFDYixJQUFNLFFBQVEsR0FBRywrQkFBa0IsRUFBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZELE9BQU8sa0JBQVcsUUFBUSxNQUFHLENBQUM7WUFDbEMsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGNBQWM7SUFDZCxJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDakIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCO2dCQUNiLElBQU0sUUFBUSxHQUFHLCtCQUFrQixFQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDN0QsT0FBTyxrQkFBVyxRQUFRLE1BQUcsQ0FBQztZQUNsQyxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsa0JBQWtCO0lBQ2xCLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQztRQUNyQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsT0FBaUIsSUFBSyw0QkFBcUIsRUFBckIsQ0FBcUI7U0FDL0M7S0FDSixDQUFDO0lBRUYsZUFBZTtJQUNmLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUNsQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsT0FBaUIsSUFBSyx5QkFBa0IsRUFBbEIsQ0FBa0I7U0FDNUM7S0FDSixDQUFDO0lBRUYscUJBQXFCO0lBQ3JCLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLGVBQWUsQ0FBQztRQUN4QixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7Z0JBQ2IsSUFBTSxRQUFRLEdBQUcsK0JBQWtCLEVBQUMsTUFBTSxFQUFFLHNCQUFzQixDQUFDLENBQUM7Z0JBQ3BFLE9BQU8sa0JBQVcsUUFBUSxNQUFHLENBQUM7WUFDbEMsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLG1CQUFtQjtJQUNuQixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDdEIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCO2dCQUNiLElBQU0sUUFBUSxHQUFHLCtCQUFrQixFQUFDLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNuRSxPQUFPLGtCQUFXLFFBQVEsTUFBRyxDQUFDO1lBQ2xDLENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixjQUFjO0lBQ2QsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ2pCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztRQUN6QixLQUFLLEVBQUU7WUFDSCxVQUFDLE9BQWlCLElBQUssd0JBQWlCLEVBQWpCLENBQWlCO1NBQzNDO0tBQ0osQ0FBQztJQUVGLFlBQVk7SUFDWixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDO1FBQ3hDLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7Z0JBQ2IsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUMvQixPQUFPLGtCQUFrQixDQUFDO2lCQUM3QjtxQkFBTTtvQkFDSCxPQUFPLGVBQWU7aUJBQ3pCO1lBQ0wsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGFBQWE7SUFDYixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDaEIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCOztnQkFDYiw2RUFBNkU7Z0JBQzdFLHdFQUF3RTtnQkFDeEUsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVMsRUFBRTtvQkFDdkQsT0FBTyxFQUFFLENBQUM7aUJBQ2I7Z0JBQ0QsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDL0MsSUFBSSxhQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLDBDQUFFLE9BQU8sR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLE1BQUssUUFBUSxFQUFFO29CQUMvRyxPQUFPLEVBQUUsQ0FBQztpQkFDYjtnQkFDRCxPQUFPLG1CQUFtQixDQUFDO1lBQy9CLENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixZQUFZO0lBQ1osSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCO2dCQUNiLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQWlCLENBQUM7Z0JBQzdDLElBQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQ0FBZ0MsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDMUksSUFBTSwrQkFBK0IsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUNyRCwwSUFBMEksRUFDMUksSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzlELElBQUksUUFBUSxHQUFHLG1CQUFtQixDQUFDLGNBQWMsR0FBQywrQkFBK0IsQ0FBQyxjQUFjLENBQUM7Z0JBQ2pHLElBQUksUUFBUSxLQUFLLENBQUM7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ2hDLE9BQU8sV0FBSSw4QkFBaUIsRUFBQyxNQUFNLENBQUMsaUJBQWMsQ0FBQztZQUN2RCxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsWUFBWTtJQUNaLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsVUFBQyxNQUFnQjtnQkFDYixJQUFNLFFBQVEsR0FBRywrQkFBa0IsRUFBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQzNELE9BQU8sa0JBQVcsUUFBUSxNQUFHLENBQUM7WUFDbEMsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGVBQWU7SUFDZixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDbEIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO1FBQ3ZCLEtBQUssRUFBRTtZQUNILFVBQUMsT0FBaUIsSUFBSyx5QkFBa0IsRUFBbEIsQ0FBa0I7U0FDNUM7S0FDSixDQUFDO0lBRUYsa0JBQWtCO0lBQ2xCLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQztRQUNyQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7Z0JBQ2IsSUFBTSxRQUFRLEdBQUcsK0JBQWtCLEVBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7Z0JBQ2pFLE9BQU8sa0JBQVcsUUFBUSxNQUFHLENBQUM7WUFDbEMsQ0FBQztTQUNKO0tBQ0osQ0FBQztJQUVGLGtCQUFrQjtJQUNsQixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDckIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQztRQUN0QyxLQUFLLEVBQUU7WUFDSCxVQUFDLE9BQWlCLElBQUssMEJBQW1CLEVBQW5CLENBQW1CO1NBQzdDO0tBQ0osQ0FBQztJQUVGLGNBQWM7SUFDZCxJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDakIsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCO2dCQUNiLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUk7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQy9DLElBQU0sUUFBUSxHQUFHLCtCQUFrQixFQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDdEQsT0FBTyxrQkFBVyxRQUFRLE1BQUcsQ0FBQztZQUNsQyxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsY0FBYztJQUNkLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUNqQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsTUFBZ0I7Z0JBQ2IsSUFBTSxRQUFRLEdBQUcsK0JBQWtCLEVBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUM3RCxPQUFPLGtCQUFXLFFBQVEsTUFBRyxDQUFDO1lBQ2xDLENBQUM7U0FDSjtLQUNKLENBQUM7SUFFRixhQUFhO0lBQ2IsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ2hCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsVUFBQyxPQUFpQixJQUFLLHVCQUFnQixFQUFoQixDQUFnQjtTQUMxQztLQUNKLENBQUM7SUFFRixlQUFlO0lBQ2YsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQ2xCLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsVUFBQyxPQUFpQixJQUFLLHlCQUFrQixFQUFsQixDQUFrQjtTQUM1QztLQUNKLENBQUM7SUFFRixxQkFBcUI7SUFDckIsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCLElBQUssYUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxXQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQURyQyxDQUNxQztTQUM5RDtLQUNKLENBQUM7SUFFRixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQztRQUNiLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsT0FBaUIsSUFBSyxpQ0FBMEIsRUFBMUIsQ0FBMEI7U0FDcEQ7S0FDSixDQUFDO0lBRUYsSUFBSSwrQkFBYyxDQUFDO1FBQ2YsS0FBSyxFQUFFLEVBQUU7UUFDVCxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDckIsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsVUFBQyxPQUFpQixJQUFLLHlCQUFrQixFQUFsQixDQUFrQjtTQUM1QztLQUNKLENBQUM7SUFFRixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNmLEtBQUssRUFBRTtZQUNILFVBQUMsT0FBaUIsSUFBSyw2QkFBc0IsRUFBdEIsQ0FBc0I7U0FDaEQ7S0FDSixDQUFDO0lBRUYsMEJBQTBCO0lBQzFCLGlGQUFpRjtJQUNqRixnRkFBZ0Y7SUFDaEYscUZBQXFGO0lBQ3JGLDRGQUE0RjtJQUM1RixJQUFJLCtCQUFjLENBQUM7UUFDZixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUNqQixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZixLQUFLLEVBQUU7WUFDSCxVQUFDLE1BQWdCO2dCQUNiLElBQU0sSUFBSSxHQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQWtCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN2RSxJQUFNLGNBQWMsR0FBRyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxjQUFjLENBQUM7Z0JBQ2xFLElBQUksY0FBYyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDckQsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNuRSxDQUFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsNEJBQTRCO0lBQzVCLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ2QsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2YsS0FBSyxFQUFFO1lBQ0gsVUFBQyxPQUFpQixJQUFLLG1DQUE0QixFQUE1QixDQUE0QjtTQUN0RDtLQUNKLENBQUM7SUFFRiw4Q0FBOEM7SUFFOUMsMkVBQTJFO0lBQzNFLElBQUksK0JBQWMsQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsZUFBZTtZQUN0RSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUFZO1lBQ3ZFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDO1FBQ3JDLEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQztRQUM1QixLQUFLLEVBQUU7WUFDSCxjQUFNLFNBQUUsRUFBRixDQUFFO1NBQ1g7S0FDSixDQUFDO0NBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUM5VEYsZ0dBQTRDO0FBQzVDLDJIQUFpRTtBQUNqRSwySEFBZ0U7QUFDckQsZ0JBQVEsR0FBRyxjQUFPLENBQUM7QUFDbkIsNkJBQXFCLEdBQUcsdUJBQW1CLENBQUM7QUFDNUMsNEJBQW9CLEdBQUcsdUJBQWtCLENBQUM7Ozs7Ozs7Ozs7OztBQ0xyRDs7Ozs7Ozs7Ozs7Ozs7K0VBYytFOzs7QUFFL0UscUhBQWdFO0FBQ2hFLDBGQUEwQztBQUMxQyxvRkFBc0M7QUFDdEMsaUZBQW9DO0FBQ3BDLHVGQUF3QztBQUN4QyxpR0FBbUQ7QUFDbkQsMkZBQStDO0FBZ0IvQztJQUFBO0lBa2pCQSxDQUFDO0lBampCRzs7Ozs7OztPQU9HO0lBQ1csaURBQXFDLEdBQW5ELFVBQW9ELElBQWE7UUFDN0QsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVoRSw2RkFBNkY7UUFDN0Ysd0ZBQXdGO1FBRXhGLGtDQUFrQztRQUNsQyxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMxRCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuQyxJQUFJLE1BQUksR0FBRyxFQUFFLENBQUM7WUFDZCxTQUFTLENBQUMsT0FBTyxDQUFDLGtCQUFRO2dCQUN0QixJQUFJLFFBQVEsSUFBSSxDQUFDLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBTyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUM5RixJQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO29CQUNuQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTt3QkFDNUIsTUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDNUI7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksTUFBSSxJQUFJLE1BQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO2dCQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUM7U0FDOUQ7UUFFRCxzREFBc0Q7UUFDdEQsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3BFLElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pDLFlBQVksQ0FBQyxPQUFPLENBQUMscUJBQVc7Z0JBQzVCLElBQUksQ0FBQyxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDeEYsSUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQztvQkFDeEMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7d0JBQ2hDLFdBQVcsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUMzQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtnQkFDekIsT0FBTyxFQUFFLE1BQU0sRUFBRSx1QkFBVSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUM7U0FDN0Y7UUFFRCw4REFBOEQ7UUFDOUQsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25DLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFPLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzFFLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3BELElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO29CQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLHVCQUFVLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsQ0FBQzthQUMxRjtTQUNKO1FBRUQseURBQXlEO1FBQ3pELElBQUksV0FBVyxHQUFHLG1CQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSx1QkFBVSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztRQUU1RixpQ0FBaUM7UUFDakMsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzVELElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pDLElBQUksVUFBUSxHQUFHLEVBQUUsQ0FBQztZQUNsQixZQUFZLENBQUMsT0FBTyxDQUFDLHFCQUFXO2dCQUM1QixJQUFJLENBQUMsaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFPLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQ3hGLElBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7b0JBQ3JDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO3dCQUMxQixVQUFRLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDckM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksVUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7Z0JBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUNqRTtRQUVELG9DQUFvQztRQUNwQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDNUIsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtnQkFDNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSx1QkFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7U0FDOUU7UUFFRCwyQkFBMkI7UUFDM0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELDZDQUE2QztJQUMvQixpQ0FBcUIsR0FBbkMsVUFBb0MsSUFBYTtRQUM3QyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZCLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFN0MsSUFBSSxTQUFTLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlFLElBQUksU0FBUyxLQUFLLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUU5QywwRkFBMEY7UUFDMUYsaUdBQWlHO1FBQ2pHLElBQUksT0FBTyxHQUFHLG1CQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDbEMscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFFLEVBQUMsTUFBTSxFQUFDLHVCQUFVLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDO1lBQ3ZILE9BQU8sRUFBQyxNQUFNLEVBQUMsdUJBQVUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBQyxDQUFDO1NBQzdFO1FBRUQsc0RBQXNEO1FBQ3RELFNBQVMsR0FBRyxXQUFXLENBQUMscUNBQXFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEUsSUFBSSxTQUFTLEVBQUU7WUFDWCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDOUQsT0FBTyxTQUFTLENBQUM7U0FDcEI7UUFFRCx3Q0FBd0M7UUFDeEM7Ozs7V0FJRztRQUVILHVEQUF1RDtRQUN2RCxJQUFNLElBQUksR0FBRyxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLGlDQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLGlDQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDNUcsU0FBUyxHQUFHLFdBQVcsQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRCxJQUFJLFNBQVMsRUFBRTtnQkFDWCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQzlELE9BQU8sU0FBUyxDQUFDO2FBQ3BCO1NBQ0o7UUFFRCw0Q0FBNEM7UUFDNUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzVCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2xDLEtBQUssR0FBRyx1QkFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkMscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFFLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztnQkFDeEYsT0FBTyxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBQyxDQUFDO2FBQzlDO1NBQ0o7UUFFRCwyQ0FBMkM7UUFDM0MsSUFBSSxRQUFRLEtBQUssVUFBVSxJQUFJLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSx1QkFBVSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2pLLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbkQsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzlDLFdBQVcsR0FBRyx1QkFBVSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkQscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFFLEVBQUMsTUFBTSxFQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFDLENBQUMsQ0FBQztnQkFDcEcsT0FBTyxFQUFDLE1BQU0sRUFBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBQyxDQUFDO2FBQzFEO1NBQ0o7UUFFRCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELGdEQUFnRDtJQUNsQyxpREFBcUMsR0FBbkQsVUFBb0QsSUFBYTtRQUM3RCxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTdDLG9CQUFvQjtRQUNwQixJQUFJLHVCQUFVLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3ZELDZDQUE2QztZQUM3QyxJQUFNLEtBQUssR0FBRyx1QkFBVSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pELElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO2dCQUM1QixPQUFPLEVBQUMsTUFBTSxFQUFDLHVCQUFVLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUMsQ0FBQztTQUMzRTtRQUVELDRDQUE0QztRQUM1QyxJQUFJLFFBQVEsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuRCxJQUFJLHVCQUFVLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtnQkFDbEUscUNBQXFDO2dCQUNyQyw0Q0FBNEM7Z0JBQzVDLElBQU0sS0FBSyxHQUFHLHVCQUFVLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtvQkFDNUIsT0FBTyxFQUFDLE1BQU0sRUFBQyx1QkFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLENBQUM7Z0JBRXhFLHFHQUFxRztnQkFDckcsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxPQUFPO29CQUNyQyxPQUFPLEVBQUMsTUFBTSxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFDLENBQUM7YUFFcEQ7aUJBQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU8sRUFBRTtnQkFDOUMsdUJBQXVCO2dCQUN2QixtSEFBbUg7Z0JBQ25ILGdEQUFnRDtnQkFDaEQsSUFBTSxHQUFHLEdBQUcsdUJBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3hELElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO29CQUN4QixPQUFPLEVBQUMsTUFBTSxFQUFDLHVCQUFVLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUMsQ0FBQztnQkFBQSxDQUFDO2dCQUVyRSxvRkFBb0Y7Z0JBQ3BGLG9FQUFvRTthQUN2RTtTQUNKO1FBRUQsU0FBUztRQUNULHNFQUFzRTtRQUN0RSxJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDdkIsNEJBQTRCO1lBQzVCLElBQU0sSUFBSSxHQUFJLElBQW9CLENBQUMsU0FBUyxDQUFDO1lBQzdDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO2dCQUMxQixPQUFPLEVBQUMsTUFBTSxFQUFDLHVCQUFVLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUMsQ0FBQztZQUV0RSxrREFBa0Q7WUFDbEQsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxJQUFJLEtBQUssSUFBSSxDQUFDLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBTyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNyRixJQUFJLElBQUksR0FBRyxXQUFXLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDaEQsT0FBTyxJQUFJLENBQUM7YUFDbkI7WUFFRCxnQ0FBZ0M7WUFDaEMsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QyxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBTyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMvRSxJQUFJLElBQUksR0FBRyxXQUFXLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDaEQsT0FBTyxJQUFJLENBQUM7YUFDbkI7U0FDSjtRQUVELFdBQVc7UUFDWCxJQUFJLFFBQVEsS0FBSyxVQUFVLEVBQUU7WUFDekIsZ0dBQWdHO1lBQ2hHLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsRUFBRTtnQkFDcEQsMkJBQTJCO2dCQUMzQixJQUFNLElBQUksR0FBSSxLQUFxQixDQUFDLFNBQVMsQ0FBQztnQkFDOUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUM5QixPQUFPLEVBQUMsTUFBTSxFQUFDLHVCQUFVLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsQ0FBQzthQUMzRTtTQUNKO1FBRUQsU0FBUztRQUNULElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUN2QixzR0FBc0c7WUFDdEcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMxQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ2pDLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDdEMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQy9ELElBQUksU0FBUyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFPLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEVBQUU7NEJBQ3ZJLElBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQzs0QkFDMUQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dDQUNoRCxLQUFLLElBQUksR0FBRyxHQUFHLHVCQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUM3RDtxQkFDSjtvQkFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDdkIsT0FBTyxFQUFDLE1BQU0sRUFBQyx1QkFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLENBQUM7aUJBQzNFO2FBQ0o7U0FDSjtRQUVELFVBQVU7UUFDVixJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEIsOEJBQThCO1lBQzlCLElBQU0sSUFBSSxHQUFJLElBQW9CLENBQUMsU0FBUyxDQUFDO1lBQzdDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDOUIsT0FBTyxFQUFDLE1BQU0sRUFBQyx1QkFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLENBQUM7U0FDM0U7UUFFRCxVQUFVO1FBQ1YsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ3hCLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVMsRUFBRTtnQkFDckQsbUNBQW1DO2dCQUNuQyxJQUFNLElBQUksR0FBRyxXQUFXLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDaEQsT0FBTyxFQUFDLE1BQU0sRUFBQyx1QkFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQyxDQUFDO2FBQ3hGO1lBQ0QsbUVBQW1FO1lBQ25FLHdHQUF3RztZQUN4RyxPQUFPLEVBQUMsTUFBTSxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFDLENBQUM7U0FDckQ7UUFFRCxTQUFTO1FBQ1QsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQ3ZCLG9EQUFvRDtZQUNwRCxJQUFJLE9BQU8sR0FBRyx1QkFBVSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlFLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQiwrQkFBK0I7Z0JBQy9CLElBQU0sSUFBSSxHQUFJLE9BQU8sQ0FBQyxDQUFDLENBQWlCLENBQUMsU0FBUyxDQUFDO2dCQUNuRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQzlCLE9BQU8sRUFBQyxNQUFNLEVBQUMsdUJBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBQyxDQUFDO2FBQy9FO1NBQ0o7UUFFRCxvQ0FBb0M7UUFDcEMsSUFBSSxRQUFRLEtBQUssS0FBSyxFQUFFO1lBQ3BCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDMUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyx1QkFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFDLENBQUM7YUFDbkU7U0FDSjtRQUVELHFDQUFxQztRQUNyQyxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUU7WUFDckIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMxQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQzVCLE9BQU8sRUFBQyxNQUFNLEVBQUMsdUJBQVUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFDO2FBQ3ZFO1NBQ0o7UUFFRCxnQkFBZ0I7UUFDaEIsSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFO1lBQ3RCLHlEQUF5RDtZQUN6RCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDekMsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLEVBQUU7Z0JBQ2pFLDRCQUE0QjtnQkFDNUIsSUFBTSxPQUFPLEdBQUksV0FBMkIsQ0FBQyxTQUFTLENBQUM7Z0JBQ3ZELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDcEMsT0FBTyxFQUFDLE1BQU0sRUFBQyx1QkFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFDLENBQUM7YUFDL0U7U0FDSjtRQUVELFlBQVk7UUFDWixJQUFJLFFBQVEsS0FBSyxHQUFHLEVBQUU7WUFDbEIsMEJBQTBCO1lBQzFCLElBQU0sSUFBSSxHQUFJLElBQW9CLENBQUMsU0FBUyxDQUFDO1lBQzdDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO2dCQUMxQixPQUFPLEVBQUMsTUFBTSxFQUFDLHVCQUFVLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUMsQ0FBQztZQUV0RSxnREFBZ0Q7WUFDaEQsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDRCQUE0QixDQUFDLENBQUM7WUFDbkUsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzdCLElBQUksTUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDZCxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQUs7b0JBQ2hCLElBQUksQ0FBQyxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDNUUsSUFBSSxJQUFJLEdBQUcsV0FBVyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNwRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7NEJBQ2hELE1BQUksSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztxQkFDdEM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxNQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtvQkFDbEIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFDO2FBQ3REO1NBQ0o7UUFFRCxXQUFXO1FBQ1gsa0dBQWtHO1FBQ2xHLCtFQUErRTtRQUMvRSx5Q0FBeUM7UUFDekMsSUFBSSxRQUFRLEtBQUssVUFBVSxJQUFJLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRTtZQUMxRSxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDaEMsT0FBTyxFQUFDLE1BQU0sRUFBQyx1QkFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLENBQUM7U0FDM0U7UUFFRCxNQUFNO1FBQ04sSUFBSSxRQUFRLEtBQUssS0FBSyxFQUFFO1lBQ3BCLElBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxxQ0FBcUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ2hELE9BQU8sSUFBSSxDQUFDO1NBQ25CO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELGdEQUFnRDtJQUNsQyw4Q0FBa0MsR0FBaEQsVUFBaUQsSUFBYTtRQUMxRCxpREFBaUQ7UUFDakQsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDMUQsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkMsSUFBSSxNQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2QsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQkFBUTtnQkFDdEIsSUFBSSxRQUFRLElBQUksQ0FBQyxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDOUYsSUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztvQkFDbkMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7d0JBQzVCLE1BQUksSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQzVCO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLE1BQUksSUFBSSxNQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtnQkFDOUIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBQyxDQUFDO1NBQ3ZEO1FBRUQscUNBQXFDO1FBQ3JDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsSUFBSSxTQUFTLElBQUksQ0FBQyxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNqRyxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2pELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO2dCQUMxQixPQUFPLEVBQUMsTUFBTSxFQUFDLHVCQUFVLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUMsQ0FBQztTQUNqRjtRQUVEOzs7OztXQUtHO1FBQ0gsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFDLE9BQU87WUFDaEQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssSUFBSSxDQUFDLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBTyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUM1SCxJQUFNLEtBQUssR0FBRyx1QkFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUNoQyxJQUFJLElBQUksS0FBSyxDQUFDO2FBQ3JCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQ2xCLE9BQU8sRUFBQyxNQUFNLEVBQUMsdUJBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQyxDQUFDO1FBRXpFLGdEQUFnRDtRQUNoRCxJQUFJLE1BQU0sR0FBRyxtQkFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNsQyxPQUFPLEVBQUMsTUFBTSxFQUFDLHVCQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBQyxDQUFDO1FBRXBGLCtDQUErQztRQUMvQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkQsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkMsSUFBSSxNQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2QsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQkFBUTtnQkFDdEIsSUFBSSxRQUFRLElBQUksQ0FBQyxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDOUYsSUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztvQkFDbEMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7d0JBQzFCLE1BQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQzNCO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLE1BQUksSUFBSSxNQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtnQkFDMUIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQyxDQUFDO1NBQzFEO0lBQ0wsQ0FBQztJQUVELGlFQUFpRTtJQUNuRCw0Q0FBZ0MsR0FBOUMsVUFBK0MsSUFBYTtRQUN4RCxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdDLElBQU0sSUFBSSxHQUFHLG1CQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDOzs7O1dBSUc7UUFDSCxJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsd0NBQXdDLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2hGLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDekQsT0FBTyxJQUFJLENBQUM7UUFFaEIsSUFBSSxHQUFHLFdBQVcsQ0FBQyx3Q0FBd0MsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0UsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ2hELE9BQU8sSUFBSSxDQUFDO1FBRWhCLGVBQWU7UUFDZixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsSUFBSSxHQUFHLFdBQVcsQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1RCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ2hELE9BQU8sRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLENBQUM7WUFBQSxDQUFDO1NBQ3pEO1FBRUQsZUFBZTtRQUNmLElBQUksUUFBUSxLQUFLLE1BQU0sRUFBRTtZQUNyQixJQUFJLEdBQUcsV0FBVyxDQUFDLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDaEQsT0FBTyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUMsQ0FBQztTQUN0RDtRQUVELDRDQUE0QztRQUM1QyxJQUFJLEdBQUcsV0FBVyxDQUFDLGlDQUFpQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNoRCxPQUFPLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQyxDQUFDO1FBRXRELDRCQUE0QjtRQUM1QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsdURBQXVEO0lBQ3pDLG9EQUF3QyxHQUF0RCxVQUF1RCxJQUFhLEVBQUUsSUFBVztRQUM3RSxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0UsSUFBSSxXQUFXLEVBQUU7WUFDYixJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1lBQ2xDLElBQUksT0FBTyxJQUFJLE9BQU8sS0FBSyxNQUFNLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssUUFBUSxFQUFFO2dCQUMzRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ3pCLE9BQU8sRUFBQyxNQUFNLEVBQUUsdUJBQVUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sR0FBQyxJQUFJLEVBQUMsQ0FBQzthQUNsRjtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELDZDQUE2QztJQUMvQiw4Q0FBa0MsR0FBaEQsVUFBaUQsSUFBYTtRQUMxRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ25DLElBQUksVUFBVSxFQUFFO1lBQ1osSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hELDRDQUE0QztZQUM1QyxRQUFRLENBQUMsT0FBTyxDQUFDLGVBQUs7Z0JBQ2xCLElBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUNoRCxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkMsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3RCLE9BQU8sRUFBQyxNQUFNLEVBQUUsdUJBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBQyxDQUFDO1FBRTlFLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCw2Q0FBNkM7SUFDL0IsK0NBQW1DLEdBQWpELFVBQWtELElBQWE7UUFDM0QseUNBQXlDO1FBQ3pDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBRSxJQUF3QixDQUFDLGFBQWEsRUFBRSxJQUFLLElBQXdCLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN0RyxJQUFNLElBQUksR0FBRyxXQUFXLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUNoRCxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDdEM7YUFBTTtZQUNILHFDQUFxQztZQUNyQyxLQUF3QixVQUF5QyxFQUF6QyxLQUFDLElBQXdCLENBQUMsYUFBYSxFQUFFLEVBQXpDLGNBQXlDLEVBQXpDLElBQXlDLEVBQUU7Z0JBQTlELElBQU0sU0FBUztnQkFDaEIsSUFBSSxJQUFJLEdBQUcsV0FBVyxDQUFDLHFCQUFxQixDQUFDLFNBQW9CLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUN6QyxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDdEM7U0FDSjtRQUNELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3RCLE9BQU8sRUFBQyxNQUFNLEVBQUUsdUJBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBQyxDQUFDO1FBRS9FLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxrREFBa0Q7SUFDcEMsNkNBQWlDLEdBQS9DLFVBQWdELElBQWE7UUFDekQsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWQsa0NBQWtDO1FBQ2xDLElBQUksRUFBRSxHQUFHLElBQUkscUJBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3Qiw2REFBNkQ7UUFDN0QsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3JFLElBQUksRUFBRSxDQUFDLE9BQU87Z0JBQUUsU0FBUztZQUM3QixzQkFBc0I7WUFDbEIsSUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztZQUMxQixJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFO2dCQUMxQiw0REFBNEQ7Z0JBQzVELElBQU0sUUFBTSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFFBQU0sQ0FBQyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxvQkFBb0IsQ0FBQyxRQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDOUksSUFBSSxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUM1QzthQUVKO2lCQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFNBQXdCLENBQUMsSUFBSSxDQUFDLGlCQUFPLENBQUMsb0JBQW9CLENBQUMsU0FBd0IsQ0FBQyxFQUFFO2dCQUNySixJQUFNLElBQUksR0FBRyxXQUFXLENBQUMscUJBQXFCLENBQUMsU0FBb0IsQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDM0MsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUMvQixFQUFFLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztpQkFDckI7Z0JBQ0QsaUVBQWlFO3FCQUM1RCxJQUFJLG1CQUFRLENBQUMsa0NBQWtDLENBQUMsRUFBRSxDQUFDLElBQW1CLENBQUMsRUFBRTtvQkFDMUUsRUFBRSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQ3JCO2FBQ0o7U0FDSjtRQUNELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3RCLE9BQU8sRUFBQyxNQUFNLEVBQUUsdUJBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQyxDQUFDO1FBRTFFLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxxREFBcUQ7SUFDdkMscUNBQXlCLEdBQXZDLFVBQXdDLElBQWE7UUFDakQsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUV4QixJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdDLElBQUksUUFBUSxLQUFLLEtBQUssSUFBSSxRQUFRLEtBQUssS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTNELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDaEMsSUFBSSxNQUFNLEVBQUU7WUFDUix5RkFBeUY7WUFDekYsSUFBSSxDQUFDLG1CQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLG1CQUFRLENBQUMsa0NBQWtDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxtQkFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7Z0JBQ25ILE9BQU8sSUFBSSxDQUFDO1NBQ25CO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNMLGtCQUFDO0FBQUQsQ0FBQztBQWxqQlksa0NBQVc7Ozs7Ozs7Ozs7OztBQ3RDeEI7Ozs7Ozs7Ozs7Ozs7OytFQWMrRTs7Ozs7Ozs7Ozs7O0FBRS9FLHVGQUF3QztBQUN4QyxxSEFBaUc7QUFDakcsc0dBQXNEO0FBQ3RELGlHQUFtRDtBQUNuRCxpRkFBb0M7QUFDcEMsMEZBQTBDO0FBQzFDLDZGQUE0QztBQUM1Qyw0SUFBNEU7QUFDNUUsMkZBQStDO0FBRS9DO0lBQUE7SUEwcEVBLENBQUM7SUFocEVpQixzQ0FBNkIsR0FBM0MsVUFBNEMsR0FBRyxFQUFFLEtBQUs7UUFDbEQsSUFBSSxRQUFRLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUMsT0FBTyxRQUFRLENBQUMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUEwTEQ7Ozs7T0FJRztJQUNXLHFDQUE0QixHQUExQyxVQUEyQyxJQUFJO1FBQzNDLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3BDLElBQUksYUFBYSxFQUFFO1lBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzNDLElBQUksUUFBUSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzFELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztnQkFDbEQsSUFBSSxNQUFNO29CQUNOLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDckM7U0FDSjtRQUNELE9BQU8sY0FBYyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ1cscUNBQTRCLEdBQTFDLFVBQTJDLElBQUk7UUFDM0MsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDcEMsSUFBSSxhQUFhLEVBQUU7WUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDM0MsSUFBSSxRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDMUQsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsTUFBTTtvQkFDUCxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3JDO1NBQ0o7UUFDRCxPQUFPLGNBQWMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNXLGtEQUF5QyxHQUF2RCxVQUF3RCxJQUFJO1FBQ3hELElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3BDLElBQUksYUFBYSxFQUFFO1lBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzNDLElBQUksUUFBUSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzFELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVDLElBQUksU0FBUyxLQUFLLEVBQUU7b0JBQUUsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDdkMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO2dCQUNsRCxJQUFJLE1BQU07b0JBQ04sY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7YUFDakU7U0FDSjtRQUNELE9BQU8sY0FBYyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ1csa0RBQXlDLEdBQXZELFVBQXdELElBQUk7UUFDeEQsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDcEMsSUFBSSxhQUFhLEVBQUU7WUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDM0MsSUFBSSxRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDMUQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxTQUFTLEtBQUssRUFBRTtvQkFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUN2QyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxNQUFNO29CQUNQLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO2FBQ2pFO1NBQ0o7UUFDRCxPQUFPLGNBQWMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDVyx5QkFBZ0IsR0FBOUIsVUFBK0IsR0FBRyxFQUFFLGFBQWE7UUFDN0MsbURBQW1EO1FBQ25ELElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFN0MsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxxRUFBcUU7WUFDaEksT0FBTyxNQUFNLENBQUM7U0FDakI7UUFDRCx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckMsSUFBSSxhQUFhLElBQUksUUFBUSxDQUFDLDZCQUE2QixFQUFFO2dCQUN6RCxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsNkJBQTZCLENBQUMsYUFBYSxDQUFDLEVBQUU7b0JBQzlELE1BQU0sR0FBRyxRQUFRLENBQUMsNkJBQTZCLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3BFLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsRUFBRTt3QkFDaEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDeEI7aUJBQ0o7cUJBQU0sSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxFQUFFO29CQUNyRSxNQUFNLEdBQUcsUUFBUSxDQUFDLDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNwRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxVQUFVLEVBQUU7d0JBQ2hDLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ3hCO2lCQUNKO2FBQ0o7U0FDSjtRQUVELDRCQUE0QjtRQUM1QixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsSUFBSSxJQUFJLEdBQUcsdUJBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEMsSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDLHlCQUF5QixJQUFJLGFBQWEsSUFBSSxRQUFRLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3pHLE1BQU0sR0FBRyxRQUFRLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2pFLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsRUFBRTtvQkFDaEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDeEI7YUFDSjtTQUNKO1FBRUQsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyxNQUFNLElBQUksYUFBYSxJQUFJLFFBQVEsQ0FBQywyQkFBMkIsRUFBRTtZQUNsRSxNQUFNLEdBQUcsUUFBUSxDQUFDLDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVhLCtCQUFzQixHQUFwQyxVQUFxQyxHQUFHLEVBQUUsUUFBUTtRQUM5QyxJQUFJLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLE9BQU8sRUFBRTtZQUN0Qyx3SEFBd0g7WUFDeEgsc0JBQXNCLEdBQUcsR0FBRyxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUNwSDtRQUNELE9BQU8sc0JBQXNCLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNXLHdCQUFlLEdBQTdCLFVBQThCLElBQWEsRUFBRSxxQkFBcUM7UUFBckMsb0VBQXFDO1FBQzlFLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsSUFBSSxJQUFJLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLCtCQUErQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNFLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUNmLElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNuRSxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDNUIsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN0RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDbkMsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQ2pFLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxFQUFFOzRCQUN4RCxlQUFlLEdBQUcsSUFBSSxDQUFDOzRCQUN2QixTQUFTO3lCQUNaO3dCQUVELElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2hCLElBQUksSUFBSSxLQUFLLGNBQWMsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFOzRCQUM1QyxxRUFBcUU7NEJBQ3JFLElBQUksdUJBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0NBQzlCLG9CQUFvQjtnQ0FDcEIsSUFBSSxHQUFHLElBQUksQ0FBQztnQ0FDWixTQUFTOzZCQUNaO3lCQUNKO3dCQUNELE1BQU07cUJBQ1Q7aUJBQ0o7Z0JBQ0QsSUFBSSxlQUFlO29CQUFFLElBQUksR0FBRyxTQUFTLENBQUM7YUFDekM7WUFFRCxJQUFJLElBQUksS0FBSyxJQUFJLElBQUkscUJBQXFCLEVBQUU7Z0JBQ3hDLElBQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BELElBQUksR0FBRyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2FBQ2hGO1lBQ0QscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLCtCQUErQixFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsT0FBTyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNXLDRCQUFtQixHQUFqQyxVQUFrQyxHQUFZO1FBQzFDLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNXLGlCQUFRLEdBQXRCLFVBQXVCLEdBQVksRUFBRSxxQkFBOEI7UUFDL0QsSUFBSSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyRCxJQUFJLFNBQVMsR0FBRyx1QkFBVSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBQ3ZDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDNUI7U0FDSjtRQUVELGdDQUFnQztRQUNoQyxnREFBZ0Q7UUFDaEQsSUFBSSxxQkFBcUIsRUFBRTtZQUN2QixJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELElBQUksWUFBWSxLQUFLLElBQUksSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDbEQsNkNBQTZDO2dCQUM3Qyx1QkFBVSxDQUFDLHlCQUF5QixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQzthQUM3RDtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDVyx3QkFBZSxHQUE3QixVQUE4QixHQUFHO1FBQzdCLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDNUMsSUFBSSxhQUFhLEdBQWEscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLHVCQUF1QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEIsSUFBSSxXQUFXLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELDBEQUEwRDtZQUMxRCxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsWUFBWSxFQUFFO2dCQUN6QyxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUM5Qyx1RUFBdUU7b0JBQ3ZFLElBQUksbUJBQWlCLEdBQUcsUUFBUSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNuRSxJQUFJLG1CQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7d0JBQ2hDLHFCQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDckQsT0FBTyxFQUFFLENBQUM7cUJBQ2I7b0JBQ0QsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO29CQUN4QixJQUFJLE9BQU8sR0FBRyxpQ0FBZSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDeEQsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQy9DLHVCQUFVLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztvQkFFM0UsSUFBSSxXQUFXLENBQUMseUJBQXlCO3dCQUNyQyx1QkFBVSxDQUFDLHlCQUF5QixDQUFDLGlDQUFlLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBRTNGLElBQUksT0FBTyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDO3dCQUM3RCx1QkFBVSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBRTVFLG9GQUFvRjtvQkFDcEYsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBSSxJQUFJLDBCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBaEMsQ0FBZ0MsQ0FBQyxFQUFFO3dCQUM3RixJQUFJLFFBQVEsR0FBRyx1QkFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO3dCQUNyRixxQkFBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLENBQUM7d0JBQzNELE9BQU8sUUFBUSxDQUFDO3FCQUNuQjtpQkFDSjtnQkFDRCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLEVBQUUsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMzRSxPQUFPLFdBQVcsQ0FBQyxZQUFZLENBQUM7YUFDbkM7WUFDRCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckQsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUNELE9BQU8sYUFBYSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNXLGtDQUF5QixHQUF2QyxVQUF3QyxJQUFJLEVBQUUsR0FBRztRQUM3QyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDZixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxpQ0FBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0QyxJQUFJLGtCQUFrQixHQUFHLGlDQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUN2RSxtQ0FBbUM7WUFDbkMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssV0FBVyxJQUFJLEdBQUcsSUFBSSx1QkFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDMUUsa0JBQWtCLEdBQUcsdUJBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLGtCQUFrQixJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQzFHO1lBQ0QsT0FBTyxrQkFBa0IsQ0FBQztTQUM3QjthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDVyxnQkFBTyxHQUFyQixVQUFzQixHQUFHLEVBQUUsSUFBSSxFQUFFLHFCQUFzQjtRQUNuRCxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3JELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDOUIsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO29CQUM5QyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztpQkFDN0I7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7b0JBQzlDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDO2lCQUM5QjthQUNKO1NBQ0o7UUFDRCw0REFBNEQ7UUFDNUQsa0NBQWtDO1FBQ2xDLGdEQUFnRDtRQUNoRCxJQUFJLENBQUMsTUFBTSxJQUFJLHFCQUFxQixFQUFFO1lBQ2xDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQix5REFBeUQ7WUFDekQsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRCxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2xELHVCQUFVLENBQUMseUJBQXlCLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMzRCxzRkFBc0Y7Z0JBQ3RGLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtvQkFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7d0JBQy9DLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO3FCQUM5QjtpQkFDSjtxQkFBTTtvQkFDSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTt3QkFDL0MsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUM7cUJBQy9CO2lCQUNKO2FBQ0o7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNXLDJCQUFrQixHQUFoQyxVQUFpQyxHQUFHLEVBQUUsSUFBSTtRQUN0QyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQzlCLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtvQkFDOUMsYUFBYSxHQUFHLElBQUksQ0FBQztvQkFDckIsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7aUJBQzdCO2FBQ0o7aUJBQU07Z0JBQ0gsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO29CQUM5QyxhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUNyQixNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQztpQkFDOUI7YUFDSjtTQUNKO1FBRUQsSUFBSSxhQUFhLEVBQUU7WUFDZixPQUFPLE1BQU0sQ0FBQztTQUNqQjtRQUVELGtDQUFrQztRQUNsQyxnREFBZ0Q7UUFDaEQseURBQXlEO1FBQ3pELElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzFDLHNGQUFzRjtZQUN0RixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO29CQUNqRCxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztpQkFDaEM7YUFDSjtpQkFBTTtnQkFDSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtvQkFDakQsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUM7aUJBQ2pDO2FBQ0o7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDVyxtQkFBVSxHQUF4QixVQUF5QixHQUFHLEVBQUUscUJBQXFCO1FBQy9DLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDckQsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNqQjtRQUVELGdDQUFnQztRQUNoQyxnREFBZ0Q7UUFDaEQsSUFBSSxDQUFDLE1BQU0sSUFBSSxxQkFBcUIsRUFBRTtZQUNsQyx5REFBeUQ7WUFDekQsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUN4QyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVhLGdDQUF1QixHQUFyQyxVQUFzQyxJQUFJO1FBQ3RDLHdHQUF3RztRQUN4RyxvSUFBb0k7UUFDcEksSUFBSSxzQkFBc0IsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSztZQUN4RixJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHO1lBQzdELE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHO1lBQzVELEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRO1lBQ25FLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7WUFDbkUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHO1NBQzFCLENBQUM7UUFDRixPQUFPLHVCQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNXLDRCQUFtQixHQUFqQyxVQUFrQyxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFzQjtRQUN2RSxJQUFJLFFBQVEsR0FBRyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxPQUFPLFFBQVEsS0FBSyxJQUFJLEVBQUU7WUFDdEIsSUFBSSxxQkFBcUIsRUFBRTtnQkFDdkIsSUFBSSxRQUFRLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFO29CQUNqRCxNQUFNO2lCQUNUO2FBQ0o7aUJBQU07Z0JBQ0gsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQzdDLE1BQU07aUJBQ1Q7YUFDSjtZQUNELFFBQVEsR0FBRyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM3QztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ1csNkJBQW9CLEdBQWxDLFVBQW1DLE9BQU8sRUFBRSxTQUFTO1FBQ2pELElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZGLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN2QixPQUFPLFFBQVEsS0FBSyxJQUFJLEVBQUU7WUFDdEIsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QyxJQUNJLElBQUksS0FBSyxJQUFJO2dCQUNiLENBQ0ksU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ3hCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN4RTtnQkFFTCxPQUFPLFFBQVEsQ0FBQztZQUNoQixRQUFRLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0M7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ1csMEJBQWlCLEdBQS9CLFVBQWdDLE9BQU8sRUFBRSxLQUFlO1FBQ3BELElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTNFLElBQUksS0FBSyxHQUFHLHFCQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM5QixLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQ0FBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFDLEVBQVk7b0JBQVgsR0FBRyxVQUFFLEtBQUs7Z0JBQy9ELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO29CQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxDQUFDO1lBQ0gscUJBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSx3QkFBd0IsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM5RTtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDVyxpQkFBUSxHQUF0QixVQUF1QixPQUFPO1FBQzFCLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFM0IsSUFBTSxNQUFNLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRixJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDakIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO1lBQ2hCLElBQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0MsSUFBSSxJQUFJLElBQUksaUNBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksaUNBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVE7Z0JBQzFHLEdBQUcsR0FBRyxJQUFJLENBQUM7WUFFZixxQkFBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BFLE9BQU8sR0FBRyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNXLHNDQUE2QixHQUEzQyxVQUE0QyxPQUFpQjtRQUN6RCxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTNCLElBQUksVUFBVSxHQUFjLHFCQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsc0NBQXNDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEgsSUFBSSxVQUFVLEtBQUssSUFBSSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzlDLElBQUksdUJBQVUsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQztnQkFDM0MsT0FBTyxJQUFJLENBQUM7U0FDbkI7UUFDRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFeEIsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRWhELElBQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLDRCQUFxQixFQUFFLCtCQUFxQixFQUFFLE9BQUksQ0FBQyxDQUFDO1FBQ3JHLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFeEIsSUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM5SCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDM0IsSUFBSSxVQUFVLEtBQUssSUFBSTtnQkFDbkIsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUVwQixVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pCLHFCQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsc0NBQXNDLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDOUYsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNXLDJCQUFrQixHQUFoQyxVQUFpQyxPQUFPLEVBQUUsSUFBSTtRQUMxQyxPQUFPLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQkc7SUFDVyxpQ0FBd0IsR0FBdEMsVUFBdUMsT0FBTyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxvQkFBcUI7UUFFOUYsdUJBQXVCO1FBQ3ZCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFcEIsK0RBQStEO1FBQy9ELElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtZQUNqQixpQ0FBaUM7WUFDakMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFFL0Isb0VBQW9FO1lBQ3BFLHFCQUFxQjtZQUNyQixPQUFPLFFBQVEsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBRWxDLGtIQUFrSDtnQkFDbEgsVUFBVTtnQkFDViwrRkFBK0Y7Z0JBQy9GLDZDQUE2QztnQkFDN0MsbUhBQW1IO2dCQUNuSCxtSEFBbUg7Z0JBQ25ILG1GQUFtRjtnQkFDbkYsRUFBRTtnQkFDRixzSEFBc0g7Z0JBQ3RILDRCQUE0QjtnQkFDNUIsSUFBSSxxQkFBcUIsSUFBSSx1QkFBVSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUN6RSwyQkFBMkI7b0JBQzNCLFFBQVEsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO29CQUVoQyxTQUFTO2lCQUNaO2dCQUVELCtEQUErRDtnQkFDL0QsSUFBSSxvQkFBb0IsRUFBRTtvQkFDdEIsT0FBTyxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ3pEO3FCQUFNO29CQUNILE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3JEO2dCQUVELDJCQUEyQjtnQkFDM0IsUUFBUSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7YUFDbkM7WUFFRCxtRkFBbUY7WUFDbkYsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDWCw2Q0FBNkM7Z0JBQzdDLFFBQVEsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDO2dCQUVuQyw2RUFBNkU7Z0JBQzdFLDZCQUE2QjtnQkFDN0IsT0FBTyxRQUFRLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUVsQyxrSEFBa0g7b0JBQ2xILFVBQVU7b0JBQ1YsK0ZBQStGO29CQUMvRiw2Q0FBNkM7b0JBQzdDLG1IQUFtSDtvQkFDbkgsbUhBQW1IO29CQUNuSCxtRkFBbUY7b0JBQ25GLEVBQUU7b0JBQ0Ysc0hBQXNIO29CQUN0SCw0QkFBNEI7b0JBQzVCLElBQUkscUJBQXFCLElBQUksdUJBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDekUsMkJBQTJCO3dCQUMzQixRQUFRLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQzt3QkFFcEMsU0FBUztxQkFDWjtvQkFFRCwrREFBK0Q7b0JBQy9ELE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztvQkFFakUsMkJBQTJCO29CQUMzQixRQUFRLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztpQkFDdkM7YUFDSjtTQUNKO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ1csOEJBQXFCLEdBQW5DLFVBQW9DLE9BQU8sRUFBRSxRQUFRO1FBQ2pELE9BQU8sUUFBUSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNXLG9DQUEyQixHQUF6QyxVQUEwQyxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLHFCQUFzQjtRQUN0Ryx1QkFBdUI7UUFDdkIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksRUFBRSxHQUFHLElBQUkscUJBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoQyxnR0FBZ0c7UUFDaEcsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFO1lBRTFFLGtIQUFrSDtZQUNsSCxVQUFVO1lBQ1YsK0ZBQStGO1lBQy9GLDZDQUE2QztZQUM3QyxtSEFBbUg7WUFDbkgsbUhBQW1IO1lBQ25ILG1GQUFtRjtZQUNuRixFQUFFO1lBQ0Ysc0hBQXNIO1lBQ3RILDRCQUE0QjtZQUM1QixJQUFJLHFCQUFxQixJQUFJLHVCQUFVLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN4RSxTQUFTO2FBQ1o7WUFFRCwwSEFBMEg7WUFDMUgsU0FBUztZQUNULDBIQUEwSDtZQUMxSCxTQUFTO1lBQ1QsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ3JILFVBQVUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO2dCQUNyQixNQUFNO2FBQ1Q7U0FDSjtRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDVyxtQ0FBMEIsR0FBeEMsVUFBeUMsT0FBTyxFQUFFLFNBQW1CLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCO1FBQy9HLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUNqRCx1QkFBdUI7UUFDdkIsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRXJCLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0JBQVE7WUFDdEIsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLCtCQUErQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUNySCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ3ZCLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNXLHdDQUErQixHQUE3QyxVQUE4QyxPQUFPLEVBQUUsUUFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUI7UUFDakgsdUJBQXVCO1FBQ3ZCLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEMsZ0dBQWdHO1FBQ2hHLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRTtZQUMxRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osU0FBUzthQUNaO1lBQ0Qsa0hBQWtIO1lBQ2xILFVBQVU7WUFDViwrRkFBK0Y7WUFDL0YsNkNBQTZDO1lBQzdDLG1IQUFtSDtZQUNuSCxtSEFBbUg7WUFDbkgsbUZBQW1GO1lBQ25GLEVBQUU7WUFDRixzSEFBc0g7WUFDdEgsNEJBQTRCO1lBQzVCLElBQUkscUJBQXFCLElBQUksdUJBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3hFLFNBQVM7YUFDWjtZQUVELDBIQUEwSDtZQUMxSCxTQUFTO1lBQ1QsMEhBQTBIO1lBQzFILFNBQVM7WUFDVCxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUscUJBQXFCLENBQUMsRUFBRTtnQkFDNUQsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0I7U0FDSjtRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ1csNEJBQW1CLEdBQWpDLFVBQWtDLE9BQU87UUFDckMsSUFBSSxrQkFBa0IsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLElBQUksTUFBTSxHQUF1QixFQUFFLENBQUM7UUFDcEMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2RSxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNXLGlDQUF3QixHQUF0QyxVQUF1QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBMEI7UUFDMUYsSUFBSSxRQUFRLEdBQWtCLEVBQUUsQ0FBQztRQUNqQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3RDO1NBQ0o7UUFDRCxxR0FBcUc7UUFDckcsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxJQUFJLEtBQUssRUFBRTtZQUNQLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7WUFDaEMsSUFBSSxHQUFHLEVBQUU7Z0JBQ0wsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3RDLElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hELElBQUksU0FBUyxFQUFFO3dCQUNYLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQzVCO2lCQUNKO2FBQ0o7U0FDSjtRQUNELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3RDLG1DQUFtQztnQkFDbkMsSUFBSSxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUFFLFNBQVM7Z0JBQzdGLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ3RDLEtBQUssR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNqRDtnQkFFRCxJQUFJLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUM3QyxrQ0FBa0M7b0JBQ2xDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSTt3QkFDL0IsT0FBTyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxjQUFjLENBQUM7b0JBQ3RELENBQUMsQ0FBQztvQkFFRixzRkFBc0Y7b0JBQ3RGLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7d0JBQ3ZGLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSTs0QkFDL0IsT0FBTyxJQUFJLEtBQUssT0FBTyxDQUFDO3dCQUM1QixDQUFDLENBQUM7cUJBQ0w7aUJBQ0o7Z0JBQ0QsSUFBSSxLQUFLLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDN0MsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUI7cUJBQU07b0JBQ0gsdUNBQXVDO29CQUN2QyxRQUFRLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO2lCQUM5RTthQUNKO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDZjs7WUFDRyxPQUFPLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ1csOEJBQXFCLEdBQW5DLFVBQW9DLE9BQU8sRUFBRSxlQUF3QjtRQUNqRSxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5Qyx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksZUFBZSxFQUFFO1lBQ25ELEtBQUssR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdDO1FBRUQ7O1VBRUU7UUFDRixJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRDs7VUFFRTtRQUNGLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDakQsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFDLElBQUksd0JBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUE3QixDQUE2QixDQUFDLENBQUM7UUFDN0QsSUFBSSxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFdkIsSUFBSSxjQUFjLEdBQUcsaUNBQWUsQ0FBQyxjQUFjLENBQUM7UUFDcEQsSUFBSSxrQkFBa0IsR0FBYSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ25DLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO2dCQUMzRSxrQkFBa0IsR0FBRyx1QkFBVSxDQUFDLHlCQUF5QixDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzthQUN2SDtTQUNKO1FBQ0QsT0FBTyxrQkFBa0IsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDVyw0QkFBbUIsR0FBakMsVUFBa0MsT0FBTyxFQUFFLFFBQVE7UUFDL0MsT0FBTyxRQUFRLENBQUMseUJBQXlCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ1csa0NBQXlCLEdBQXZDLFVBQXdDLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUscUJBQXNCO1FBQ3BHLHVCQUF1QjtRQUN2QixJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUVsQyx3RkFBd0Y7UUFDeEYsSUFBSSx1QkFBVSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBRTtZQUVwRCx1QkFBdUI7WUFDdkIsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVwRCx1Q0FBdUM7WUFDdkMsaUJBQWlCLEdBQUcsdUJBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQy9ELHFEQUFxRDtZQUNyRCxJQUFJLGlCQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQztnQkFDNUMsT0FBTyxJQUFJLENBQUM7WUFFaEIsa0hBQWtIO1lBQ2xILFVBQVU7WUFDViwrRkFBK0Y7WUFDL0YsNkNBQTZDO1lBQzdDLG1IQUFtSDtZQUNuSCxtSEFBbUg7WUFDbkgsbUZBQW1GO1lBQ25GLElBQUkscUJBQXFCLElBQUksaUJBQWlCLElBQUksSUFBSSxJQUFJLHVCQUFVLENBQUMseUJBQXlCLENBQUMsaUJBQWlCLENBQUMsRUFBRTtnQkFDL0cscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2FBQ2hDO2lCQUFNO2dCQUNILHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixDQUFDLENBQUM7YUFDaEc7U0FDSjtRQUNELE9BQU8scUJBQXFCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUQsQ0FBQztJQUVELCtDQUErQztJQUNqQyxxQkFBWSxHQUExQixVQUEyQixPQUFPO1FBRTlCLHFGQUFxRjtRQUNyRixPQUFPLHVCQUFVLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxJQUFJLHVCQUFVLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDM0gsQ0FBQztJQUVELGtGQUFrRjtJQUNwRSxtQ0FBMEIsR0FBeEMsVUFBeUMsUUFBUSxFQUFFLFFBQVE7UUFDdkQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN4QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO1FBQ3BDLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRTVCLElBQUksUUFBUSxFQUFFO1lBQ1YsZ0JBQWdCLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLGlDQUFpQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3ZGO1FBQ0QsSUFBSSxnQkFBZ0IsS0FBSyxJQUFJLEVBQUU7WUFDM0IsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1NBQ3pCO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUU3RCxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUU7Z0JBRTFCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsRUFBRTtvQkFFeEMsSUFBSSxTQUFTLEdBQUcsdUJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ2xHLGtCQUFrQixHQUFHLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQztvQkFDbkQsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO2lCQUV0QztxQkFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsRUFBRTtvQkFFcEQsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUMxRCxJQUFJLFNBQVMsR0FBRyx1QkFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQzNELElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDZixJQUFJLFNBQVMsSUFBSSxDQUFDLGlCQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTt3QkFDeEQsS0FBSyxHQUFHLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsQ0FBQztxQkFDOUQ7b0JBQ0QsSUFBSSxlQUFlLEdBQUcsdUJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDdkUsa0JBQWtCLEdBQUcsZUFBZSxJQUFJLGdCQUFnQixDQUFDO29CQUN6RCxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7aUJBRTVDO3FCQUFNO29CQUNILHNCQUFzQjtvQkFDdEIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO2lCQUM3QjthQUNKO1NBQ0o7UUFDRCxJQUFJLFFBQVEsRUFBRTtZQUNWLHFCQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxpQ0FBaUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ2hGO1FBQ0QsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ1ksdUNBQThCLEdBQTdDLFVBQThDLElBQWE7UUFDdkQsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVyQixJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0IsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3JFLElBQUksRUFBRSxDQUFDLE9BQU87Z0JBQUUsU0FBUztZQUV6QixJQUFNLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3JCLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVsRSxpQ0FBaUM7WUFDakMsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUU7Z0JBQy9DLEVBQUUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsZ0JBQWdCO2dCQUNuQyxTQUFTO2FBQ1o7WUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLEVBQUUsWUFBWTtnQkFDbkMsNEVBQTRFO2dCQUM1RSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNwRCxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ3ZDO2FBQ0o7aUJBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxFQUFFLGVBQWU7Z0JBQzdDLCtCQUErQjtnQkFDL0IsSUFBSSxRQUFRLEtBQUssS0FBSyxJQUFLLElBQWdCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUM3RCxJQUFJLElBQUksR0FBRyxHQUFJLElBQWdCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUMzRCxFQUFFLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLHVCQUF1QjtpQkFDN0M7Z0JBQ0QsZ0RBQWdEO3FCQUMzQyxJQUFJLFFBQVEsS0FBSyxPQUFPLElBQUssSUFBZ0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssT0FBTyxJQUFLLElBQWdCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUMxSCxJQUFJLElBQUksR0FBRyxHQUFJLElBQWdCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUMzRCxFQUFFLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLGdCQUFnQjtpQkFDdEM7YUFDSjtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVhLHFCQUFZLEdBQTFCLFVBQTJCLEdBQUc7UUFDMUIsSUFBSSxHQUFHLENBQUMsWUFBWSxFQUFFO1lBQ2xCLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dCQUNyQyxJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxRQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7b0JBQ3ZELElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxTQUFTLEdBQUcsdUJBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNuRCxJQUFJLFNBQVMsSUFBSSxDQUFDLGlCQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRTt3QkFDaEQsaUVBQWlFO3dCQUNqRSxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsOEJBQThCLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQy9ELGVBQWUsSUFBSSx1QkFBVSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUN6RDtpQkFDSjtnQkFDRCxPQUFPLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNqQztpQkFBTSxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ3ZDLE9BQU8sdUJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDN0U7U0FDSjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVhLDJCQUFrQixHQUFoQyxVQUFpQyxHQUFHO1FBQ2hDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDcEIsSUFBSSxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvQyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNoQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxRQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBQ3ZELElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxTQUFTLEdBQUcsdUJBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLFNBQVMsSUFBSSxDQUFDLGlCQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRTtvQkFDaEQsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUMvRCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQ2hDLGVBQWUsSUFBSSx1QkFBVSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUMzRTthQUNKO1lBQ0QsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ2pDLE9BQU8sZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3JDO1FBRUQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM1QyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFckMsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRWEsMkJBQWtCLEdBQWhDLFVBQWlDLFFBQVE7UUFDckMsSUFBSSxPQUFPLEdBQUcsRUFBRTtRQUNoQixRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRztZQUMxQixPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekYsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDVyw0QkFBbUIsR0FBakMsVUFBa0MsR0FBRztRQUNqQyxJQUFJLE9BQU8sR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsNEJBQTRCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUUsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQy9CLE9BQU8sT0FBTyxDQUFDO1FBRW5CLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLGFBQWEsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQ3BDLCtQQUErUCxDQUNsUSxDQUFDO1FBRUYsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM1QixxQkFBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsNEJBQTRCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0QsT0FBTyxPQUFPLENBQUM7U0FDbEI7UUFFRCxhQUFhLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBYTtZQUN6Qyx3SEFBd0g7WUFDeEgsSUFBSSxDQUFDLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksdUJBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUN2SixJQUFJLE1BQUksR0FBRyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxJQUFJLEdBQUcseUJBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUNoRCxNQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFFNUIsMERBQTBEO2dCQUMxRCxJQUFNLFNBQVMsR0FBRyxrQkFBSSxhQUFhLFFBQUUsTUFBTSxDQUFDLFVBQUMsQ0FBQyxJQUFLLFFBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBOUIsQ0FBOEIsQ0FBQyxDQUFDO2dCQUNuRixJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN0QixTQUFTLENBQUMsT0FBTyxDQUFDLFVBQUMsUUFBUTt3QkFDdkIsSUFBTSxhQUFhLEdBQUcseUJBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDbEUsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLElBQUksSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDOzRCQUMzRSxNQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBSSxDQUFDO29CQUN0RCxDQUFDLENBQUMsQ0FBQztpQkFDTjtnQkFFRCxJQUFNLElBQUksR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFHLElBQUksRUFBRSxNQUFNLEVBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFJLEVBQUMsQ0FBQyxDQUFDO2FBQzlEO1FBQ0wsQ0FBQyxDQUFDO1FBQ0YscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLDRCQUE0QixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDVyw2QkFBb0IsR0FBbEMsVUFBbUMsT0FBTyxFQUFFLElBQUksRUFBRSxpQkFBa0M7UUFBbEMsNkRBQWtDO1FBQ2hGLElBQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksSUFBSSxLQUFLLEtBQUs7WUFDZCxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFLLElBQUksWUFBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQXRCLENBQXNCLENBQUMsQ0FBQzs7WUFFdEQsS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBSyxJQUFJLFlBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUE3QyxDQUE2QyxDQUFDLENBQUM7UUFFakYsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV4QixJQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLEtBQUssRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRW5ELEtBQUssSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25DLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPO2dCQUFFLFNBQVM7WUFDMUMsSUFBSSxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDMUIsSUFBSSxJQUFJLEtBQUssS0FBSztvQkFDZCxPQUFPLElBQUksQ0FBQztxQkFDWCxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSTtvQkFDN0IsT0FBTyxJQUFJLENBQUM7YUFDbkI7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCwyRkFBMkY7SUFDN0UsNEJBQW1CLEdBQWpDLFVBQWtDLFFBQVE7UUFDdEMsT0FBTyxRQUFRLENBQUMsMEJBQTBCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxrRkFBa0Y7SUFDcEUsc0NBQTZCLEdBQTNDLFVBQTRDLFFBQVEsRUFBRSxRQUFRO1FBQzFELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUVwQyxJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLGdCQUFnQixHQUErQixJQUFJLENBQUM7UUFDeEQsSUFBSSx1QkFBdUIsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBRTFDLElBQUksUUFBUSxFQUFFO1lBQ1YsZ0JBQWdCLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLGlDQUFpQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3ZGO1FBQ0QsSUFBSSxnQkFBZ0IsS0FBSyxJQUFJLEVBQUU7WUFDM0IsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1NBQ3pCO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFFdEMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFO2dCQUUxQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUU7b0JBRXhDLElBQUksU0FBUyxHQUFHLHVCQUFVLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNsRyxrQkFBa0IsR0FBRyxTQUFTLElBQUksZ0JBQWdCLENBQUM7b0JBQ25ELGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDbkMsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLHVCQUF1QixDQUFDLEVBQUU7d0JBQ3pDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7cUJBQ3BEO29CQUNELHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7aUJBRS9FO3FCQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO29CQUVwRCxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM3RSxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7b0JBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxRQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7d0JBQ3ZELElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDMUIsSUFBSSxTQUFTLEdBQUcsdUJBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dCQUMzRCxJQUFJLFNBQVMsSUFBSSxDQUFDLGlCQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDeEQsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxDQUFDOzRCQUMvRCxlQUFlLElBQUksdUJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQzt5QkFDdkU7cUJBQ0o7b0JBQ0Qsa0JBQWtCLEdBQUcsZUFBZSxJQUFJLGdCQUFnQixDQUFDO29CQUN6RCxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxDQUFDLGVBQWUsSUFBSSx1QkFBdUIsQ0FBQyxFQUFFO3dCQUMvQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO3FCQUMxRDtvQkFDRCx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2lCQUNyRjthQUNKO1NBQ0o7UUFDRCxJQUFJLFFBQVEsRUFBRTtZQUNWLHFCQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxpQ0FBaUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ2hGO1FBQ0QsT0FBTyx1QkFBdUIsQ0FBQztJQUNuQyxDQUFDO0lBRUQsMkZBQTJGO0lBQzdFLCtCQUFzQixHQUFwQyxVQUFxQyxRQUFRO1FBQ3pDLE9BQU8sUUFBUSxDQUFDLDZCQUE2QixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsaUdBQWlHO0lBQ25GLGdDQUF1QixHQUFyQyxVQUFzQyxRQUFRO1FBRTFDLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVuQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGtCQUFrQixJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBRTdELElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyx1QkFBVSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2xLLElBQUksUUFBUSxHQUFHLHVCQUFVLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hGLGtCQUFrQixHQUFHLFFBQVEsSUFBSSxTQUFTLENBQUM7Z0JBQzNDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDOUI7aUJBQU07Z0JBQ0gsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO2FBQzdCO1NBQ0o7UUFDRCxPQUFPLENBQUMsa0JBQWtCLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDVywrQkFBc0IsR0FBcEMsVUFBcUMsV0FBVztRQUM1QyxJQUFJLFdBQVcsR0FBb0MscUJBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLDhCQUE4QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pILElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDZCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDbkIsSUFBSSxNQUFJLEdBQUcsSUFBSSxDQUFDO1lBRWhCLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtnQkFDckIsT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDL0M7aUJBQU0sSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFO2dCQUM3QixPQUFPLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNoRDtZQUVELDhFQUE4RTtZQUM5RSxXQUFXLEdBQUcsaUNBQWUsQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV0RSxpREFBaUQ7WUFDakQsSUFBSSxXQUFXLEtBQUssSUFBSSxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQ25ELElBQUksb0JBQW9CLEdBQUcsaUNBQWUsQ0FBQyx5Q0FBeUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDOUYsUUFBUSxPQUFPLEVBQUUsRUFBRSxnQkFBZ0I7b0JBQy9CLEtBQUssR0FBRzt3QkFDSixXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQzt3QkFDeEksTUFBTTtvQkFDVixLQUFLLE1BQU07d0JBQ1AsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUM7d0JBQ3hJLE1BQU07b0JBQ1YsS0FBSyxRQUFRLENBQUMsQ0FBQzt3QkFDWCxJQUFJLEdBQUcsR0FBRyx1QkFBVSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7d0JBQzlELEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsQ0FBQzt3QkFDcEosTUFBTTtxQkFDVDtvQkFDRCxLQUFLLFFBQVEsQ0FBQztvQkFDZCxLQUFLLFFBQVE7d0JBQ1QsSUFBSSxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSTsrQkFDN0ksUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUk7K0JBQzVJLHVCQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxLQUFLLElBQUk7NEJBQy9GLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDOzs0QkFFekUsV0FBVyxHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNoRCxNQUFNO29CQUNWLEtBQUssS0FBSzt3QkFDTixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7d0JBQ25GLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzt3QkFDekYsSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUU7NEJBQ3BJLCtGQUErRjs0QkFDL0YsV0FBVyxHQUFHLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLENBQUM7eUJBQzFEOzZCQUFNOzRCQUNILElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtnQ0FDZCx3Q0FBd0M7Z0NBQ3hDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDOzZCQUN2RTtpQ0FBTTtnQ0FDSCxxQ0FBcUM7Z0NBQ3JDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDOzZCQUNwRTt5QkFDSjt3QkFDRCxNQUFNO29CQUNWLEtBQUssT0FBTzt3QkFDUixJQUFJLHVCQUFVLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxFQUFFOzRCQUNuRCxJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDOzRCQUNqRSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ3pDLElBQUksV0FBVyxLQUFLLElBQUksSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO2dDQUNuRCxRQUFRLElBQUksRUFBRTtvQ0FDVixLQUFLLFVBQVU7d0NBQ1gsdUJBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsK0JBQStCLENBQUMsQ0FBQzt3Q0FDbk0sTUFBTTtvQ0FDVixLQUFLLE9BQU87d0NBQ1IsdUJBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUM7d0NBQ2hLLE1BQU07b0NBQ1YsS0FBSyxRQUFRO3dDQUNULHVCQUFVLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUM7d0NBQ2xLLE1BQU07b0NBQ1YsS0FBSyxLQUFLO3dDQUNOLHVCQUFVLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQzt3Q0FDNUosTUFBTTtvQ0FDVixLQUFLLE1BQU07d0NBQ1AsdUJBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUM7d0NBQzlKLE1BQU07b0NBQ1YsS0FBSyxLQUFLO3dDQUNOLHVCQUFVLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQzt3Q0FDNUosTUFBTTtvQ0FDVjt3Q0FDSSxVQUFVO3dDQUNWLHVCQUFVLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLENBQUM7d0NBQ3BLLE1BQU07aUNBQ2I7NkJBQ0o7eUJBQ0o7NkJBQU07NEJBQ0gsd0NBQXdDOzRCQUN4Qyx1QkFBVSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQzt5QkFDaks7d0JBQ0QsTUFBTTtvQkFDVixLQUFLLElBQUk7d0JBQ0wsb0JBQW9CLEdBQUcsaUNBQWUsQ0FBQyx5Q0FBeUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDdkYsSUFBSSxXQUFXLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQzs0QkFDM0YsV0FBVyxHQUFHLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLENBQUM7OzRCQUV6RCxXQUFXLEdBQUcsb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsQ0FBQzt3QkFDaEUsTUFBTTtvQkFDVixLQUFLLFNBQVM7d0JBQ1YsNkNBQTZDO3dCQUM3Qyx1Q0FBdUM7d0JBQ3ZDLElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQ2pELElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSx1QkFBVSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsRUFBRTs0QkFDMUYsV0FBVyxHQUFHLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO3lCQUNuRDs2QkFBTTs0QkFDSCxXQUFXLEdBQUcsb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUM7eUJBQ3REO3dCQUNELE1BQU07b0JBQ1YsS0FBSyxRQUFRO3dCQUNULG9CQUFvQixHQUFHLGlDQUFlLENBQUMseUNBQXlDLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQzNGLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7NEJBQ3BDLHVCQUFVLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQzs0QkFDekYsV0FBVyxHQUFHLG9CQUFvQixDQUFDLHdCQUF3QixDQUFDLENBQUM7OzRCQUU3RCxXQUFXLEdBQUcsb0JBQW9CLENBQUMsMkJBQTJCLENBQUMsQ0FBQzt3QkFDcEUsTUFBTTtvQkFDVixLQUFLLFNBQVM7d0JBQ1Ysb0JBQW9CLEdBQUcsaUNBQWUsQ0FBQyx5Q0FBeUMsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDNUYsSUFBSSxXQUFXLENBQUMsYUFBYSxJQUFJLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVM7K0JBQ3hGLGlCQUFPLENBQUMsUUFBUSxDQUFDLGtCQUFJLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxRQUFFLE1BQU0sQ0FBQyxjQUFJLElBQUksV0FBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLEVBQXpDLENBQXlDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUM7NEJBQ3RJLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDOzs0QkFFOUQsV0FBVyxHQUFHLG9CQUFvQixDQUFDLDRCQUE0QixDQUFDLENBQUM7d0JBQ3JFLE1BQU07b0JBQ1YsS0FBSyxPQUFPLENBQUM7b0JBQ2IsS0FBSyxJQUFJLENBQUM7b0JBQ1YsS0FBSyxJQUFJO3dCQUNMLElBQUksUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFOzRCQUNuRSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7eUJBQ25EOzZCQUFNOzRCQUNILFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQzt5QkFDN047d0JBQ0QsTUFBTTtvQkFDVixLQUFLLElBQUk7d0JBQ0wsSUFBTSxLQUFLLEdBQUcsdUJBQVUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQ3BELElBQUksUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFOzRCQUNuRSxJQUFJLEtBQUssS0FBSyxRQUFRO2dDQUFFLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDOztnQ0FDaEYsV0FBVyxHQUFHLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLENBQUM7eUJBQ2xFOzZCQUFNLElBQUksUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksRUFBQzs0QkFDaEosSUFBSSxLQUFLLEtBQUssUUFBUTtnQ0FBRSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsZ0NBQWdDLENBQUMsQ0FBQzs7Z0NBQ3hGLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO3lCQUMxRTs7NEJBQ0csV0FBVyxHQUFHLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUVwRCxNQUFNO29CQUNWLEtBQUssS0FBSzt3QkFDTixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDO3dCQUNwQyxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDekosTUFBTTtvQkFDVjt3QkFDSSxXQUFXLEdBQUcsaUNBQWUsQ0FBQyx5Q0FBeUMsQ0FBQyxTQUFTLENBQW9DLENBQUM7aUJBQzdILENBQUMsUUFBUTthQUNiO1NBQ0o7UUFDRCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsOEJBQThCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDN0UsT0FBTyxXQUFXLElBQUksSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFYSw0QkFBbUIsR0FBakMsVUFBa0MsV0FBVyxFQUFFLFVBQTJDO1FBQ3RGLElBQUksWUFBWSxHQUFhLHFCQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSwyQkFBMkIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2YsWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUNsQixJQUFJLFdBQVcsR0FBb0MsSUFBSSxDQUFDO1lBQ3hELElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO2dCQUNqRCxXQUFXLEdBQUcsVUFBVSxDQUFDO2FBQzVCO2lCQUFNO2dCQUNILFdBQVcsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDOUQ7WUFFRCxJQUFJLFdBQVcsS0FBSyxJQUFJLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtnQkFDbkQsSUFBSSxXQUFXLENBQUMsWUFBWSxLQUFLLElBQUksRUFBRTtvQkFDbkMsdUJBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO2lCQUNoRjtnQkFDRCxJQUFJLFdBQVcsQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFO29CQUNqQyx1QkFBVSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7aUJBQzlFO2dCQUNELElBQUksYUFBYSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzFELElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUMzQyx1QkFBVSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7aUJBQzlFO2FBQ0o7WUFDRCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsMkJBQTJCLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDOUU7UUFDRCxPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBRWEsaUNBQXdCLEdBQXRDLFVBQXVDLFdBQVcsRUFBRSxLQUFLLEVBQUUsVUFBVTtRQUNqRSxJQUFJLGlCQUFpQixHQUFhLHFCQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxnQ0FBZ0MsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDcEIsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLElBQUksY0FBYyxxQkFBTyxLQUFLLE9BQUMsQ0FBQztZQUNoQyxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRWhELElBQUksb0JBQW9CLEdBQUcsRUFBRSxDQUFDO1lBQzlCLHdGQUF3RjtZQUN4RixJQUFJLGlDQUFlLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUMvRCxrR0FBa0c7Z0JBQ2xHLGlCQUFpQixHQUFHLHVCQUFVLENBQUMscUJBQXFCLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLENBQUM7YUFDNUY7WUFDRCw4RkFBOEY7WUFDOUYsSUFBSSxpQ0FBZSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDL0Qsa0dBQWtHO2dCQUNsRyxpQkFBaUIsR0FBRyx1QkFBVSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQzVGO1lBRUQsSUFBSSxpQ0FBZSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDL0Qsa0dBQWtHO2dCQUNsRyxpQkFBaUIsR0FBRyx1QkFBVSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQzVGO1lBRUQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxVQUFVLEtBQUssU0FBUztnQkFDOUMsV0FBVyxHQUFHLFVBQVUsQ0FBQzs7Z0JBRXpCLFdBQVcsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFL0QsSUFBSSxXQUFXLEtBQUssSUFBSSxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQ25ELGtHQUFrRztnQkFDbEcsNkVBQTZFO2dCQUM3RSxJQUFJLFdBQVcsQ0FBQyxZQUFZLEtBQUssSUFBSTtvQkFDakMsQ0FBQyxjQUFjLEtBQUssSUFBSSxJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7dUJBQ3JGLFdBQVcsQ0FBQywrQkFBK0IsS0FBSyxTQUFTLEVBQUU7b0JBQzlELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDdEQsSUFBSSxZQUFZLEdBQUcsaUNBQWUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUMvRSxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTs0QkFDckQsSUFBSSxZQUFVLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQzs0QkFDcEMsdUJBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxZQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQzs0QkFDcEUsWUFBVSxHQUFHLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDOzRCQUMxRix1QkFBVSxDQUFDLHlCQUF5QixDQUFDLFlBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDOzRCQUNwRSxJQUFJLGVBQWUsR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDOzRCQUNuRCxJQUFJLGVBQWUsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUM7Z0NBQzdDLHVCQUFVLENBQUMseUJBQXlCLENBQUMsZUFBZSxFQUFFLG9CQUFvQixDQUFDLENBQUM7NEJBRWhGLDRCQUE0Qjs0QkFDNUIsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsSUFBSSx1QkFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQ0FDcEYsdUJBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7NkJBQ25KO3lCQUNKO3FCQUNKO2lCQUNKO2dCQUNELDJEQUEyRDtnQkFDM0QsSUFBSSxXQUFXLENBQUMseUJBQXlCLEVBQUU7b0JBQ3ZDLElBQUksWUFBVSxHQUFHLGlDQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxvQkFBb0I7b0JBQ3ZFLHVCQUFVLENBQUMseUJBQXlCLENBQUMsWUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7aUJBQ3ZFO2FBQ0o7WUFDRCxnRUFBZ0U7WUFDaEUsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLHVCQUF1QixJQUFJLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDcEcsdUJBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLENBQUMsdUJBQXVCLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDOUYscUVBQXFFO1lBQ3JFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLGNBQWMsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZFLElBQUksY0FBYyxHQUFHLGlDQUFlLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLGNBQWMsS0FBSyxJQUFJLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtvQkFDekQsdUZBQXVGO29CQUN2RixJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsK0JBQStCLEtBQUssU0FBUyxDQUFDLEVBQUU7d0JBQ25PLElBQUksWUFBVSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxxQkFBcUI7d0JBQzVELHVCQUFVLENBQUMseUJBQXlCLENBQUMsWUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7d0JBQ3BFLFlBQVUsR0FBRyxRQUFRLENBQUMseUJBQXlCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO3dCQUN2Ryx1QkFBVSxDQUFDLHlCQUF5QixDQUFDLFlBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO3FCQUN2RTtvQkFDRCxJQUFJLGVBQWUsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDO29CQUNyRCxJQUFJLGVBQWUsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQzdDLHVCQUFVLENBQUMseUJBQXlCLENBQUMsZUFBZSxFQUFFLG9CQUFvQixDQUFDLENBQUM7b0JBQ2hGLDZCQUE2QjtvQkFDN0IsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVyxJQUFJLHVCQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUFFO3dCQUMxRSx1QkFBVSxDQUFDLHlCQUF5QixDQUFDLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO3FCQUNsSTtpQkFDSjthQUNKO1lBRUQsK0VBQStFO1lBQy9FLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZHLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN0RCxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUV2QyxJQUFJLENBQUMsS0FBSyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDeEQsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFdkMsSUFBSSxDQUFDLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3pELGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFFMUM7WUFFRCxtREFBbUQ7WUFDbkQsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLDBCQUEwQixJQUFJLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUM1Ryx1Q0FBdUM7Z0JBQ3ZDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3BFLElBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdkQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUNwQixJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUM3QixJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQzs0QkFDN0MsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDN0I7O3dCQUNHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzFCO2dCQUNELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUNsQix1QkFBVSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3hFO1lBQ0QsdURBQXVEO1lBQ3ZELElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyw2QkFBNkIsSUFBSSxXQUFXLENBQUMsNkJBQTZCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDbEgsdUNBQXVDO2dCQUN2QyxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsNkJBQTZCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN2RSxJQUFNLElBQUksR0FBRyxXQUFXLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDcEIsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDN0IsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7NEJBQzdDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ2hDOzt3QkFDRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM3QjtnQkFDRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDckIsdUJBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLENBQUMsQ0FBQzthQUM5RTtZQUNELDZEQUE2RDtZQUM3RCxpQkFBaUIsR0FBRyx1QkFBVSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFFNUYsd0ZBQXdGO1lBQ3hGLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLFdBQVcsQ0FBQywwQ0FBMEM7Z0JBQzdILGlCQUFpQixHQUFHLHVCQUFVLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLDBDQUEwQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFFbEkscUJBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLGdDQUFnQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7U0FDeEY7UUFDRCxPQUFPLGlCQUFpQixDQUFDO0lBQzdCLENBQUM7SUFDRDs7Ozs7Ozs7O09BU0c7SUFDVyw4Q0FBcUMsR0FBbkQsVUFBb0QsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJO1FBQ3pFLElBQUksS0FBSyxHQUFHLGlDQUFlLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUV4RixJQUFJLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztZQUM5QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFO2dCQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDN0UsWUFBWSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7YUFDakM7aUJBQU0sSUFBSSxJQUFJLEtBQUssYUFBYSxFQUFFO2dCQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDbkYsWUFBWSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7YUFDcEM7O2dCQUNHLE9BQU8sSUFBSSxDQUFDO1lBRWhCLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLE1BQUksR0FBRyxLQUFLLENBQUM7WUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzFDLElBQUksZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO2dCQUMxRCxJQUFJLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztnQkFDMUQsSUFBSSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7Z0JBRTVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN2QyxJQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQzNELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUNkLFVBQVUsR0FBRyxJQUFJLENBQUM7d0JBQ2xCLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUV6SSxJQUFJLGdCQUFnQixLQUFLLElBQUksRUFBRTs0QkFDM0IsSUFBSSxtQkFBbUIsS0FBSyxJQUFJLEVBQUU7Z0NBQzlCLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBQzlFLE1BQUksR0FBRyxJQUFJLENBQUM7NkJBQ2Y7aUNBQU0sSUFBSSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUU7Z0NBQzVELG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBQzlFLE1BQUksR0FBRyxJQUFJLENBQUM7NkJBQ2Y7eUJBQ0o7NkJBQU0sSUFBSSxtQkFBbUIsS0FBSyxJQUFJLEVBQUU7NEJBQ3JDLElBQUksZ0JBQWdCLEtBQUssUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dDQUN4QyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dDQUM5RSxNQUFJLEdBQUcsSUFBSSxDQUFDOzZCQUNmO3lCQUNKOzZCQUFNLElBQUksZ0JBQWdCLEtBQUssT0FBTyxJQUFJLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7NEJBQzlILG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7NEJBQzlFLE1BQUksR0FBRyxJQUFJLENBQUM7eUJBQ2Y7NkJBQU0sSUFBSSxnQkFBZ0IsS0FBSyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksbUJBQW1CLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFOzRCQUN0RyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUM5RSxNQUFJLEdBQUcsSUFBSSxDQUFDO3lCQUNmO3FCQUNKO2lCQUNKO2FBQ0o7WUFFRCxJQUFJLFVBQVUsSUFBSSxDQUFDLE1BQUk7Z0JBQ25CLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFOUQsT0FBTyxvQkFBb0IsQ0FBQztTQUMvQjs7WUFDRyxPQUFPLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRWEsMkNBQWtDLEdBQWhELFVBQWlELElBQWlCO1FBQzlELElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUM1QixLQUFLLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQyxvRkFBb0Y7UUFDcEYsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDNUIsT0FBTyxLQUFLLENBQUM7UUFFakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyRCxJQUFJLGNBQWMsR0FBRyxpQ0FBZSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxJQUFJLGNBQWMsS0FBSyxJQUFJLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtnQkFDekQsSUFBSSxZQUFZLEdBQUcsY0FBYyxDQUFDLHNCQUFzQixDQUFDO2dCQUN6RCxJQUFJLFlBQVksS0FBSyxJQUFJO29CQUNyQixPQUFPLElBQUksQ0FBQzthQUNuQjtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVhLG9DQUEyQixHQUF6QyxVQUEwQyxPQUFvQjtRQUMxRCxJQUFJLFFBQVEsR0FBWSxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6RCxPQUFPLFFBQVEsRUFBRTtZQUNiLElBQUksUUFBUSxDQUFDLGtDQUFrQyxDQUFDLFFBQXVCLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFFdEYsMERBQTBEO1lBQzFELFFBQVEsR0FBRyx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxRQUF1QixDQUFDLElBQUkscUJBQVMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdEc7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7O0VBS0Y7SUFDZ0Isd0JBQWUsR0FBN0IsVUFBOEIsS0FBZTtRQUN6QyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTlDLElBQUksY0FBYyxHQUFHLGlDQUFlLENBQUMsY0FBYyxDQUFDO1FBQ3BELEtBQW1CLFVBQUssRUFBTCxlQUFLLEVBQUwsbUJBQUssRUFBTCxJQUFLO1lBQW5CLElBQU0sSUFBSTtZQUNYLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxjQUFjLENBQUM7Z0JBQ3ZDLE9BQU8sS0FBSyxDQUFDO1NBQUE7UUFFckIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7OztNQUtFO0lBQ1ksd0JBQWUsR0FBN0IsVUFBOEIsV0FBb0I7UUFDOUMsSUFBSSxRQUFRLEdBQWEsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5FLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDO1FBRWhCLGlDQUFpQztRQUNqQyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUN4QyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdkIsZ0JBQWdCO1FBQ2hCLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN4QixnQkFBZ0I7UUFDaEIsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBRXhCLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvRCxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzFDLE9BQU8sUUFBUSxDQUFDO1FBRXBCLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUV0QixJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzVCLE9BQU8sRUFBRSxDQUFDO1FBRWQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFFLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkMsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7TUFHRTtJQUNZLGdDQUF1QixHQUFyQyxVQUFzQyxPQUFnQjtRQUNsRCxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTFCLElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixJQUFJLGNBQWMsR0FBRyxpQ0FBZSxDQUFDLGNBQWMsQ0FBQztZQUNwRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxFQUFFO29CQUMvQixjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNqQzthQUNKO1NBQ0o7UUFDRCxPQUFPLGNBQWMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDVyxpQ0FBd0IsR0FBdEMsVUFBdUMsV0FBb0I7UUFDdkQsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXRELDBGQUEwRjtRQUMxRixpREFBaUQ7UUFDakQsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPO1lBQzVCLE9BQU8sSUFBSSxDQUFDO1FBRWhCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQzNCLEtBQUssR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWxELElBQUksVUFBVSxHQUFhLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU5RSxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0Qsa0NBQWtDO1FBQ2xDLElBQUksaUJBQWlCLEdBQUcsUUFBUSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFM0YsSUFBSSxVQUFVLEVBQUU7WUFDWixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEMsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7b0JBQ2xFLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDNUI7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7O01BR0U7SUFDWSx5Q0FBZ0MsR0FBOUMsVUFBK0MsSUFBYTtRQUV4RCxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMseUNBQXlDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekUsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLHlDQUF5QyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpFLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQ0FDL0QsQ0FBQztnQkFDTixJQUFNLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxxQ0FBcUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNqSCxJQUFJLG9CQUFvQixLQUFLLElBQUk7c0NBQVc7Z0JBQzVDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxjQUFJO29CQUM3QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxRQUFRLEVBQUUsUUFBUTt3QkFDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2pGLENBQUMsQ0FBQyxDQUFDOztZQU5QLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTt3QkFBaEMsQ0FBQzthQU9UO1NBQ0o7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7O01BR0U7SUFDWSwrQkFBc0IsR0FBcEMsVUFBcUMsT0FBZ0I7UUFDakQsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLElBQUksQ0FBQztRQUUxQixJQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixJQUFNLHFCQUFxQixHQUFHLGlDQUFlLENBQUMscUJBQXFCLENBQUM7WUFDcEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ25DLElBQUkscUJBQXFCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDeEMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxQjtTQUNKO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7TUFJRTtJQUNZLG9DQUEyQixHQUF6QyxVQUEwQyxPQUFnQjtRQUN0RCxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTFCLElBQUksYUFBYSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDdkMsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksYUFBYSxFQUFFO1lBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzNDLElBQUksUUFBUSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3JDLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssT0FBTztvQkFDcEMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNoQztTQUNKO1FBQ0QsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUV0QyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFNLDBCQUEwQixHQUFHLGlDQUFlLENBQUMsMEJBQTBCLENBQUM7UUFDOUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkMsSUFBSSwwQkFBMEIsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM5RDtRQUNELElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNuQyxJQUFNLDRCQUE0QixHQUFHLGlDQUFlLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5RSxJQUFJLDRCQUE0QixFQUFFO29CQUM5QixJQUFNLG9CQUFvQixHQUFHLDRCQUE0QixDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBQzdFLElBQUksb0JBQW9CLElBQUksb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDekQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7NEJBQ3ZDLElBQUksb0JBQW9CLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDM0MsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7eUJBQ2pFO3FCQUNKO2lCQUNKO2FBQ0o7U0FDSjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVhLHFCQUFZLEdBQTFCLFVBQTJCLElBQUk7UUFDM0IsT0FBTyxRQUFRLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM5RCxDQUFDO0lBdnBFRCxpSEFBaUg7SUFDbkcsd0JBQWUsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDO0lBRTFGLDJIQUEySDtJQUMzSCw2SEFBNkg7SUFDN0gsd0VBQXdFO0lBQzFELG1DQUEwQixHQUFHLENBQUMsbUJBQW1CLENBQUM7SUFPaEUsa0RBQWtEO0lBQ3BDLGtDQUF5QixHQUFHO1FBQ3RDLE9BQU8sRUFBRTtZQUNMLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLGFBQWEsRUFBRSxNQUFNO1NBQ3hCO1FBQ0QsVUFBVSxFQUFFO1lBQ1IsZUFBZSxFQUFFLFNBQVM7U0FDN0I7UUFDRCxTQUFTLEVBQUU7WUFDUCxrQkFBa0IsRUFBRSxVQUFVO1NBQ2pDO1FBQ0QsS0FBSyxFQUFFO1lBQ0gsV0FBVyxFQUFFLFFBQVE7U0FDeEI7UUFDRCxNQUFNLEVBQUU7WUFDSixrQkFBa0IsRUFBRSxVQUFVO1NBQ2pDO1FBQ0QsU0FBUyxFQUFFO1lBQ1Asa0JBQWtCLEVBQUUsWUFBWTtTQUNuQztRQUNELE9BQU8sRUFBRTtZQUNMLGVBQWUsRUFBRSxHQUFHO1lBQ3BCLGVBQWUsRUFBRSxLQUFLO1NBQ3pCO1FBQ0QsUUFBUSxFQUFFO1lBQ04sZUFBZSxFQUFFLE9BQU87U0FDM0I7UUFDRCxhQUFhLEVBQUU7WUFDWCxlQUFlLEVBQUUsR0FBRztZQUNwQixlQUFlLEVBQUUsS0FBSztTQUN6QjtRQUNELFdBQVcsRUFBRTtZQUNULGtCQUFrQixFQUFFLFVBQVU7WUFDOUIsZUFBZSxFQUFFLEdBQUc7WUFDcEIsZUFBZSxFQUFFLEtBQUs7U0FDekI7UUFDRCxXQUFXLEVBQUU7WUFDVCxrQkFBa0IsRUFBRSxZQUFZO1lBQ2hDLGVBQWUsRUFBRSxHQUFHO1lBQ3BCLGVBQWUsRUFBRSxLQUFLO1NBQ3pCO1FBQ0QsUUFBUSxFQUFFO1lBQ04sa0JBQWtCLEVBQUUsWUFBWTtZQUNoQyxlQUFlLEVBQUUsR0FBRztZQUNwQixlQUFlLEVBQUUsS0FBSztTQUN6QjtRQUNELFlBQVksRUFBRTtRQUNWLGtFQUFrRTtRQUNsRSxzRkFBc0Y7UUFDdEYsa0dBQWtHO1NBQ3JHO1FBQ0QsUUFBUSxFQUFFO1lBQ04sV0FBVyxFQUFFLFFBQVE7WUFDckIsYUFBYSxFQUFFLE1BQU07U0FDeEI7UUFDRCxLQUFLLEVBQUU7WUFDSCxlQUFlLEVBQUUsT0FBTztTQUMzQjtRQUNELFNBQVMsRUFBRTtZQUNQLGtCQUFrQixFQUFFLFlBQVk7U0FDbkM7UUFDRCxTQUFTLEVBQUU7WUFDUCxrQkFBa0IsRUFBRSxZQUFZO1NBQ25DO1FBQ0QsTUFBTSxFQUFFO1lBQ0osa0JBQWtCLEVBQUUsVUFBVTtTQUNqQztLQUNKO0lBRUQsa0RBQWtEO0lBQ3BDLG9DQUEyQixHQUFHO1FBQ3hDLGFBQWEsRUFBRSxPQUFPO1FBQ3RCLG1CQUFtQixFQUFFLE1BQU07UUFDM0IsV0FBVyxFQUFFLE9BQU87UUFDcEIsY0FBYyxFQUFFLFNBQVM7UUFDekIsY0FBYyxFQUFFLE9BQU87UUFDdkIsZUFBZSxFQUFFLE9BQU87UUFDeEIsaUJBQWlCLEVBQUUsTUFBTTtRQUN6QixlQUFlLEVBQUUsU0FBUztRQUMxQixjQUFjLEVBQUUsU0FBUztRQUN6QixlQUFlLEVBQUUsT0FBTztRQUN4QixhQUFhLEVBQUUsU0FBUztRQUN4QixjQUFjLEVBQUUsT0FBTztRQUN2QixXQUFXLEVBQUUsS0FBSztRQUNsQixZQUFZLEVBQUUsT0FBTztRQUNyQixnQkFBZ0IsRUFBRSxPQUFPO1FBQ3pCLHNCQUFzQixFQUFFLE9BQU87UUFDL0Isa0JBQWtCLEVBQUUsU0FBUztRQUM3QixjQUFjLEVBQUUsU0FBUztRQUN6QixlQUFlLEVBQUUsT0FBTztRQUN4Qix5RUFBeUU7UUFDekUsZUFBZSxFQUFFLE9BQU87UUFDeEIsZUFBZSxFQUFFLFNBQVM7UUFDMUIsV0FBVyxFQUFFLE1BQU07S0FDdEI7SUFFRCxpRkFBaUY7SUFDbkUsc0NBQTZCLEdBQUc7UUFDMUMsbUJBQW1CLEVBQUU7WUFDakIsTUFBTSxFQUFFLFVBQVUsQ0FBQztnQkFDZixPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUN0RSxDQUFDO1lBQ0QsT0FBTyxFQUFFLFVBQVUsQ0FBQztnQkFDaEIsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDdEUsQ0FBQztZQUNELFFBQVEsRUFBRSxVQUFVLENBQUM7Z0JBQ2pCLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3RFLENBQUM7WUFDRCxVQUFVLEVBQUUsVUFBVSxDQUFDO2dCQUNuQixPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUN0RSxDQUFDO1NBQ0o7UUFDRCxjQUFjLEVBQUU7WUFDWixPQUFPLEVBQUUsVUFBVSxDQUFDO2dCQUNoQixJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDO29CQUFFLE9BQU8sT0FBTyxDQUFDO2dCQUNwRCxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFDRCxVQUFVLEVBQUUsVUFBVSxDQUFDO2dCQUNuQixJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDO29CQUFFLE9BQU8sT0FBTyxDQUFDO2dCQUNwRCxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFDRCxHQUFHLEVBQUUsVUFBVSxDQUFDO2dCQUNaLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUM7b0JBQUUsT0FBTyxPQUFPLENBQUM7WUFDeEQsQ0FBQztTQUNKO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsUUFBUSxFQUFFLFVBQVUsQ0FBQztnQkFDakIsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU87WUFDeEQsQ0FBQztZQUNELFVBQVUsRUFBRSxVQUFVLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPO1lBQ3hELENBQUM7WUFDRCxPQUFPLEVBQUUsVUFBVSxDQUFDO2dCQUNoQixPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTztZQUN4RCxDQUFDO1lBQ0QsVUFBVSxFQUFFLFVBQVUsQ0FBQztnQkFDbkIsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU87WUFDeEQsQ0FBQztZQUNELFFBQVEsRUFBRSxVQUFVLENBQUM7Z0JBQ2pCLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPO1lBQ3hELENBQUM7WUFDRCxRQUFRLEVBQUUsVUFBVSxDQUFDO2dCQUNqQixPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTztZQUN4RCxDQUFDO1lBQ0QsVUFBVSxFQUFFLFVBQVUsQ0FBQztnQkFDbkIsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU87WUFDeEQsQ0FBQztTQUNKO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsU0FBUyxFQUFFLFVBQVUsQ0FBQztnQkFDbEIsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUNqQyxDQUFDO1lBQ0QsUUFBUSxFQUFFLFVBQVUsQ0FBQztnQkFDakIsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUNqQyxDQUFDO1NBQ0o7UUFDRCxzQkFBc0IsRUFBRTtZQUNwQixRQUFRLEVBQUUsVUFBVSxDQUFDO2dCQUNqQixJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO29CQUFFLE9BQU8sTUFBTSxDQUFDO2dCQUM5QyxPQUFPO1lBQ1gsQ0FBQztTQUNKO1FBQ0Qsa0JBQWtCLEVBQUU7WUFDaEIsT0FBTyxFQUFFLFVBQVUsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsVUFBVSxFQUFFLFVBQVUsQ0FBQztnQkFDbkIsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztZQUN4QyxDQUFDO1NBQ0o7UUFDRCxlQUFlLEVBQUU7WUFDYixPQUFPLEVBQUUsVUFBVSxDQUFDO2dCQUNoQixPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1lBQ3JDLENBQUM7WUFDRCxRQUFRLEVBQUUsVUFBVSxDQUFDO2dCQUNqQixPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1lBQ3JDLENBQUM7WUFDRCxVQUFVLEVBQUUsVUFBVSxDQUFDO2dCQUNuQixPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1lBQ3JDLENBQUM7U0FDSjtLQUNKO0lBcTlETCxlQUFDO0NBQUE7QUExcEVZLDRCQUFROzs7Ozs7Ozs7Ozs7QUMxQnJCOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7OztBQUUvRSx1RkFBd0M7QUFDeEMsMEZBQTBDO0FBQzFDLG9GQUFzQztBQUN0QyxpR0FBbUQ7QUFDbkQsaUdBQW1EO0FBVW5EO0lBQUE7SUEraENBLENBQUM7SUE5aENpQiwyQkFBbUIsR0FBakMsVUFBa0MsT0FBZ0IsRUFBRSxRQUFnQjtRQUNoRSxxRUFBcUU7UUFDckUsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRS9FLElBQUk7WUFDQSx5QkFBeUI7WUFDekIsSUFBSSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUFFO2dCQUN2QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDcEM7WUFFRCw2Q0FBNkM7WUFDN0MsSUFBSSxPQUFRLE9BQWUsQ0FBQyxxQkFBcUIsS0FBSyxVQUFVLEVBQUU7Z0JBQzlELE9BQVEsT0FBZSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzNEO1lBRUQsSUFBSSxPQUFRLE9BQWUsQ0FBQyxpQkFBaUIsS0FBSyxVQUFVLEVBQUU7Z0JBQzFELE9BQVEsT0FBZSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3ZEO1lBRUQsd0RBQXdEO1lBQ3hELElBQUksT0FBUSxPQUFlLENBQUMsZUFBZSxLQUFLLFVBQVUsRUFBRTtnQkFDeEQsT0FBUSxPQUFlLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3JEO1lBRUQsb0VBQW9FO1lBQ3BFLElBQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUssT0FBZSxDQUFDLFFBQVEsQ0FBQztZQUMvRCxJQUFJLENBQUMsR0FBRztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUV2QixJQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0MsNERBQTREO1lBQzVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDaEQ7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNWLHNDQUFzQztZQUN0QyxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDVyx3QkFBZ0IsR0FBOUIsVUFBK0IsSUFBaUIsRUFBRSxTQUF1QjtRQUNyRSxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZCLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDL0IsSUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUM1QixPQUFPLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7T0FHRztJQUNZLGdDQUF3QixHQUF2QyxVQUF3QyxRQUFrQjtRQU90RCxpRUFBaUU7UUFDakUsSUFBTSxXQUFXLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLCtCQUErQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hGLElBQUksV0FBVyxFQUFFO1lBQ2IsT0FBTyxXQUFXLENBQUM7U0FDdEI7UUFFRCxJQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFFdkIsbURBQW1EO1FBQ25ELEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRTtZQUNwRSxJQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBa0IsQ0FBQztZQUM3RCxJQUFJO2dCQUNBLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7b0JBQ3pCLEtBQUssSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRTt3QkFDM0QsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQWlCLENBQUM7d0JBQ3BELElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzt3QkFDM0MsSUFBSSxnQkFBZ0IsRUFBRTs0QkFDbEIsSUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7NEJBQ2xFLElBQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUM7NEJBQ3JDLElBQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQzs0QkFDbkUsSUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0QkFFdkQsV0FBVyxDQUFDLElBQUksQ0FBQztnQ0FDYixnQkFBZ0I7Z0NBQ2hCLGNBQWM7Z0NBQ2QsT0FBTztnQ0FDUCxTQUFTO2dDQUNULEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSzs2QkFDcEIsQ0FBQyxDQUFDO3lCQUNOO3FCQUNKO2lCQUNKO2FBQ0o7WUFBQyxPQUFPLEdBQUcsRUFBRTtnQkFDVixJQUNJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDL0MsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQzVDO29CQUNFLE1BQU0sR0FBRyxDQUFDO2lCQUNiO2FBQ0o7U0FDSjtRQUVELCtDQUErQztRQUMvQyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsK0JBQStCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0UsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7T0FHRztJQUNZLGlCQUFTLEdBQXhCLFVBQXlCLElBQVcsRUFBRSxLQUEwQjtRQUM1RCxLQUFLLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRTtZQUNsRCxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO2dCQUNqRCxLQUFrQixVQUFJLEVBQUosYUFBSSxFQUFKLGtCQUFJLEVBQUosSUFBSSxFQUFFO29CQUFuQixJQUFNLEdBQUc7b0JBQ1YsS0FBSyxJQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUU7d0JBQ25CLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNuQjtpQkFDSjtnQkFDRCxNQUFNO2FBQ1Q7aUJBQU07Z0JBQ0gsSUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQixLQUFrQixVQUFJLEVBQUosYUFBSSxFQUFKLGtCQUFJLEVBQUosSUFBSSxFQUFFO29CQUFuQixJQUFNLEdBQUc7b0JBQ1YsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM5QyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTt3QkFDL0MsSUFDSSxRQUFRLEtBQUssV0FBVzs0QkFDeEIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQzs0QkFDL0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQzs0QkFFN0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUM7OzRCQUNyQyxTQUFTO3FCQUNqQjs7d0JBQ0csR0FBRyxDQUFDLEdBQUcsQ0FBQzs0QkFDSixLQUFLLENBQUMsR0FBRyxDQUFDO2dDQUNWLENBQUMsUUFBUSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDM0Q7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNZLGdDQUF3QixHQUF2QyxVQUNJLElBQWlCLEVBQ2pCLEtBQXNCLEVBQ3RCLGFBQXVCO1FBRXZCLElBQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUVqQyxtREFBbUQ7UUFDbkQsS0FBMEIsVUFBYSxFQUFiLCtCQUFhLEVBQWIsMkJBQWEsRUFBYixJQUFhLEVBQUU7WUFBcEMsSUFBTSxXQUFXO1lBQ2xCLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNuQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDM0M7UUFFRCw2Q0FBNkM7UUFDN0MsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV6RSxzREFBc0Q7UUFDdEQsSUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQ0FHN0MsVUFBVTtZQUNqQixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQUksSUFBSSxRQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBeEIsQ0FBd0IsQ0FBQyxFQUFFOzthQUVwRTtZQUNELElBQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDdkMsSUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQztZQUVqRCwyREFBMkQ7WUFDM0QsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUNqQyxJQUFJLGNBQWMsSUFBSSxTQUFTLEtBQUssUUFBUSxFQUFFO2dCQUMxQyw4REFBOEQ7Z0JBQzlELE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUNyQiw4QkFBOEIsRUFDOUIsSUFBSSxDQUNQLENBQUM7YUFDTDtZQUVELDRFQUE0RTtZQUM1RSxJQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRW5FLG1DQUFtQztZQUNuQyxJQUFJLGVBQWUsRUFBRTtnQkFDakIsZ0NBQWdDO2dCQUNoQyxLQUEwQixVQUFhLEVBQWIsK0JBQWEsRUFBYiwyQkFBYSxFQUFiLElBQWEsRUFBRTtvQkFBcEMsSUFBTSxXQUFXO29CQUNsQixpREFBaUQ7b0JBQ2pELElBQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUMvQyxJQUFNLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFFckQscUNBQXFDO29CQUNyQyxJQUFJLENBQUMsY0FBYyxFQUFFO3dCQUNqQixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDOUQ7b0JBRUQsdUNBQXVDO29CQUN2QyxJQUFJLFNBQVMsS0FBSyxXQUFXLEVBQUU7d0JBQzNCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ3BEO2lCQUNKO2FBQ0o7O1FBdkNMLDJCQUEyQjtRQUMzQixLQUF5QixVQUFXLEVBQVgsMkJBQVcsRUFBWCx5QkFBVyxFQUFYLElBQVc7WUFBL0IsSUFBTSxVQUFVO29CQUFWLFVBQVU7U0F1Q3BCO1FBRUQsc0RBQXNEO1FBQ3RELEtBQTBCLFVBQWEsRUFBYiwrQkFBYSxFQUFiLDJCQUFhLEVBQWIsSUFBYSxFQUFFO1lBQXBDLElBQU0sV0FBVztZQUNsQixJQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQyxJQUFNLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVyRCw4QkFBOEI7WUFDOUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFckQsZ0JBQWdCO1lBQ2hCLElBQUksV0FBVyxLQUFLLEVBQUUsRUFBRTtnQkFDcEIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFFBQVEsQ0FBQzthQUNuQztpQkFBTTtnQkFDSCxrRUFBa0U7Z0JBQ2xFLElBQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDdEIsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2xDLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDcEIsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUNsQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNwQztpQkFDSjtnQkFDRCxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDO2FBQ3JDO1NBQ0o7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBR0Q7Ozs7Ozs7Ozs7T0FVRztJQUNXLGdDQUF3QixHQUF0QyxVQUF1QyxJQUFpQixFQUFFLEtBQXNCLEVBQUUsYUFBdUI7UUFDckcsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV2QixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFFakIsOENBQThDO1FBQzlDLDhFQUE4RTtRQUM5RSxJQUFNLFFBQVEsR0FBRyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFekUseUVBQXlFO1FBQ3pFLElBQUksZUFBZSxHQUFHLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSx1QkFBdUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ2xCLGVBQWUsR0FBRyxFQUFFLENBQUM7U0FDeEI7UUFFRCx1REFBdUQ7UUFDdkQsSUFBSSxZQUFZLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLElBQUksb0JBQW9CLEdBQUcsRUFBRSxDQUFDO1FBRTlCLElBQUksWUFBWSxFQUFFO1lBQ2QsZ0RBQWdEO1lBQ2hELEtBQTBCLFVBQWEsRUFBYiwrQkFBYSxFQUFiLDJCQUFhLEVBQWIsSUFBYSxFQUFFO2dCQUFwQyxJQUFNLFdBQVc7Z0JBQ2xCLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxLQUFLLFNBQVMsRUFBRTtvQkFDekMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDcEQ7cUJBQU07b0JBQ0gsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUMxQzthQUNKO1lBRUQsd0NBQXdDO1lBQ3hDLElBQUksb0JBQW9CLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDbkMsT0FBTyxPQUFPLENBQUM7YUFDbEI7U0FDSjthQUFNO1lBQ0gsWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUNsQixvQkFBb0IsR0FBRyxhQUFhLENBQUM7U0FDeEM7UUFFRCxnRUFBZ0U7UUFDaEUsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLElBQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7WUFFdkYsd0NBQXdDO1lBQ3hDLEtBQTBCLFVBQW9CLEVBQXBCLDZDQUFvQixFQUFwQixrQ0FBb0IsRUFBcEIsSUFBb0IsRUFBRTtnQkFBM0MsSUFBTSxXQUFXO2dCQUNsQixPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMvQyxZQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3ZEO1lBRUQsZ0RBQWdEO1lBQ2hELGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxZQUFZLENBQUM7WUFDekMscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFLGVBQWUsQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrQkc7SUFDVyx3QkFBZ0IsR0FBOUIsVUFBK0IsSUFBaUIsRUFBRSxLQUFlLEVBQUUsV0FBb0I7UUFDbkYsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV2Qiw4Q0FBOEM7UUFDOUMsOEVBQThFO1FBQzlFLElBQU0sUUFBUSxHQUFHLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6RSxJQUFNLFNBQVMsR0FBRyxXQUFXLElBQUksRUFBRSxDQUFDO1FBRXBDLCtFQUErRTtRQUMvRSxJQUFJLGVBQWUsR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNsQixlQUFlLEdBQUcsRUFBRSxDQUFDO1NBQ3hCO1FBRUQsdURBQXVEO1FBQ3ZELElBQUksWUFBWSxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2YsWUFBWSxHQUFHLEVBQUUsQ0FBQztTQUNyQjtRQUVELElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN2QyxPQUFPLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNsQztRQUVELDREQUE0RDtRQUM1RCxJQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWxDLG1CQUFtQjtRQUNuQixZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ2pDLGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxZQUFZLENBQUM7UUFDekMscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRW5FLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDVyxvQ0FBNEIsR0FBMUMsVUFBMkMsR0FBYTtRQUNwRCxpRkFBaUY7UUFDakYsSUFBTSxnQkFBZ0IsR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsb0NBQW9DLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0YsSUFBSSxnQkFBZ0IsRUFBRTtZQUNsQixPQUFPLGdCQUFnQixDQUFDO1NBQzNCO1FBRUQsSUFBSSxxQkFBcUIsR0FBRyxFQUFFO1FBRTlCLG1EQUFtRDtRQUNuRCxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUU7WUFDL0QsSUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQWtCLENBQUM7WUFDeEQsSUFBSTtnQkFDQSxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO29CQUN6QixLQUFLLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUU7d0JBQzNELElBQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3pDLElBQUksQ0FBQyxDQUFDLHdCQUF3QixLQUFLLFNBQVMsQ0FBQyxVQUFVLEVBQUU7NEJBQ3JELElBQU0sSUFBSSxHQUFHLFNBQXlCLENBQUM7NEJBQ3ZDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0NBQ3BCLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0NBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29DQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7d0NBQUUsU0FBUztvQ0FDakMsSUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29DQUN2RCxJQUFJLGVBQWUsR0FBRyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQ0FDdEQsSUFBSSxDQUFDLGVBQWU7d0NBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQztvQ0FDM0MsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQ0FDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7d0NBQ3hDLElBQUksQ0FBQyxDQUFDLHdCQUF3QixLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUU7NENBQ3pELElBQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQWlCLENBQUM7NENBQ2hELElBQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUM7NENBQ3hDLElBQUksUUFBUSxFQUFFO2dEQUNWLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztnREFDcEIsSUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztnREFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7b0RBQ3BDLElBQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztvREFDdEIsSUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0RBQ3pDLElBQUksUUFBUSxLQUFLLFdBQVcsRUFBRTt3REFDMUIsSUFBSSxHQUFHLEtBQUssS0FBSyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTs0REFDOUIsVUFBVSxHQUFHLEVBQUUsQ0FBQzs0REFDaEIsTUFBTTt5REFDVDs2REFBTTs0REFDSCxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3lEQUNqQztxREFDSjt5REFBTSxJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUU7d0RBQzlCLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7cURBQ2pDO2lEQUNKO2dEQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29EQUNwQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsVUFBVSxDQUFDO2lEQUMxQzs2Q0FDSjt5Q0FDSjtxQ0FDSjtvQ0FDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3Q0FDekMscUJBQXFCLENBQUMsUUFBUSxDQUFDLEdBQUcsZUFBZSxDQUFDO3FDQUNyRDtpQ0FDSjs2QkFDSjt5QkFDSjtxQkFDSjtpQkFDSjthQUNKO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1YsSUFDSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7b0JBQy9DLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUM1QztvQkFDRSxNQUFNLEdBQUcsQ0FBQztpQkFDYjthQUNKO1NBQ0o7UUFFRCwrREFBK0Q7UUFDL0QscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLG9DQUFvQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDckYsT0FBTyxxQkFBcUIsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ1cseUJBQWlCLEdBQS9CLFVBQWdDLGtCQUFrQjtRQUM5QyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJO1lBQ0EsSUFBSSxDQUFDLGtCQUFrQjtnQkFBRSxPQUFPLE1BQU0sQ0FBQztZQUN2QyxtQ0FBbUM7WUFDbkMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5RCxJQUFNLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNqRCxJQUFNLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN6RCxJQUFJLGtCQUFrQixLQUFLLEVBQUU7b0JBQUUsU0FBUztnQkFDeEMsSUFBSSxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQzNDLHFDQUFxQztvQkFDckMsSUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM3QyxJQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzlDLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDN0IsSUFBSSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUNyQyxJQUFJLEdBQUcsQ0FBQyxFQUNSLEtBQUssQ0FDUixDQUFDO3dCQUNGLElBQUksTUFBTSxVQUFDO3dCQUNYLElBQUksTUFBTTs0QkFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDdkMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7NEJBQy9CLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDekIsSUFBSSxDQUFDLFFBQVE7Z0NBQUUsU0FBUzs0QkFDeEIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0QkFDM0IsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dDQUMzQixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUN4QixDQUFDLEVBQ0QsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQ3RCLENBQUM7Z0NBQ0YsR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7b0NBQUUsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7NkJBQ3ZDO2lDQUFNLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQ0FDakMsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FDeEIsQ0FBQyxFQUNELFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUN0QixDQUFDO2dDQUNGLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7Z0NBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO29DQUFFLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDOzZCQUNuRDtpQ0FBTSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0NBQ2pDLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQ3hCLENBQUMsRUFDRCxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDdEIsQ0FBQztnQ0FDRixHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dDQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztvQ0FBRSxNQUFNLElBQUksR0FBRyxDQUFDOzZCQUNsQzt5QkFDSjtxQkFDSjtpQkFDSjtxQkFBTSxJQUNILGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7b0JBQ3ZDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFDMUM7b0JBQ0UsMEJBQTBCO29CQUMxQixJQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzdDLElBQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUM3QixJQUFJLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQ3ZDLElBQUksR0FBRyxDQUFDLEVBQ1IsS0FBSyxDQUNSLENBQUM7d0JBQ0YsSUFBSSxDQUFDLFFBQVE7NEJBQUUsU0FBUzt3QkFDeEIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDM0IsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUMzQixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUN4QixDQUFDLEVBQ0QsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQ3RCLENBQUM7NEJBQ0YsR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7Z0NBQUUsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7eUJBQ3ZDOzZCQUFNLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTs0QkFDakMsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FDeEIsQ0FBQyxFQUNELFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUN0QixDQUFDOzRCQUNGLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO2dDQUFFLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO3lCQUNuRDs2QkFBTSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7NEJBQ2pDLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQ3hCLENBQUMsRUFDRCxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDdEIsQ0FBQzs0QkFDRixHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQ0FBRSxNQUFNLElBQUksR0FBRyxDQUFDO3lCQUNsQztxQkFDSjtpQkFDSjtxQkFBTSxJQUFJLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDbEQsbUNBQW1DO29CQUNuQyxJQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzdDLElBQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUM3QixJQUFJLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQ3JDLElBQUksR0FBRyxDQUFDLEVBQ1IsS0FBSyxDQUNSLENBQUM7d0JBQ0YsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO3dCQUNsQixJQUFJLE1BQU07NEJBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3ZDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTs0QkFDakIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ2pELE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDeEMsQ0FBQzt5QkFDTDtxQkFDSjtpQkFDSjtxQkFBTSxJQUFJLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDaEQsbUNBQW1DO29CQUNuQyxJQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzdDLElBQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUM3QixJQUFJLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQ3JDLElBQUksR0FBRyxDQUFDLEVBQ1IsS0FBSyxDQUNSLENBQUM7d0JBQ0YsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO3dCQUNsQixJQUFJLE1BQU07NEJBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3ZDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTs0QkFDakIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ2pELE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDeEMsQ0FBQzt5QkFDTDtxQkFDSjtpQkFDSjthQUNKO1lBRUQsT0FBTyxNQUFNLElBQUksR0FBRztnQkFBRSxNQUFNLElBQUksR0FBRyxDQUFDO1NBQ3ZDO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sR0FBRyxDQUFDO1NBQ2I7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ1csMEJBQWtCLEdBQWhDLFVBQWlDLEtBQUssRUFBRSxJQUFJO1FBQ3hDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDckIsSUFBTSxLQUFLLEdBQUcscUJBQXFCLENBQUM7UUFDcEMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxJQUFJLE1BQU0sS0FBSyxJQUFJO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUIsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ25DLHdFQUF3RTtZQUN4RSxPQUFPLENBQUMsQ0FBQztRQUViLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNXLDJCQUFtQixHQUFqQyxVQUFrQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUk7UUFDbkQsSUFBSSxTQUFTLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJO1lBQUUsSUFBSSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFNLGNBQWMsR0FBRztZQUNuQixnQkFBZ0I7WUFDaEIsRUFBRSxFQUFFLFVBQUMsS0FBSyxJQUFLLFlBQUssRUFBTCxDQUFLO1lBQ3BCLEVBQUUsRUFBRSxVQUFDLEtBQUssSUFBSyxZQUFLLEdBQUcsSUFBSSxFQUFaLENBQVk7WUFDM0IsRUFBRSxFQUFFLFVBQUMsS0FBSyxJQUFLLFlBQUssR0FBRyxJQUFJLEVBQVosQ0FBWTtZQUMzQixDQUFDLEVBQUUsVUFBQyxLQUFLLElBQUssWUFBSyxHQUFHLElBQUksRUFBWixDQUFZO1lBQzFCLEVBQUUsRUFBRSxVQUFDLEtBQUssSUFBSyxZQUFLLEdBQUcsRUFBRSxFQUFWLENBQVU7WUFDekIsRUFBRSxFQUFFLFVBQUMsS0FBSyxJQUFLLFlBQUssR0FBRyxFQUFFLEVBQVYsQ0FBVTtZQUN6QixFQUFFLEVBQUUsVUFBQyxLQUFLLElBQUssWUFBSyxHQUFHLElBQUksRUFBWixDQUFZO1lBRTNCLGdCQUFnQjtZQUNoQixHQUFHLEVBQUUsVUFBQyxLQUFLO2dCQUNQLFlBQUs7b0JBQ0wsVUFBVSxDQUNOLGdCQUFnQixDQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUNyQyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUNsQztZQUxELENBS0M7WUFDTCxFQUFFLEVBQUUsVUFBQyxLQUFLO2dCQUNOLFlBQUs7b0JBQ0wsVUFBVSxDQUNOLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUN2RDtZQUhELENBR0M7WUFDTCxFQUFFLEVBQUUsVUFBQyxLQUFLO2dCQUNOLFFBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFVBQVU7WUFBekQsQ0FBeUQ7WUFDN0QsRUFBRSxFQUFFLFVBQUMsS0FBSztnQkFDTixRQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxXQUFXO1lBQTFELENBQTBEO1lBQzlELEdBQUcsRUFBRSxVQUFDLEtBQUs7Z0JBQ1AsUUFBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO29CQUNiLFVBQVUsQ0FDTixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FDdkQ7WUFIRCxDQUdDO1NBQ1IsQ0FBQztRQUVGLElBQUksSUFBSSxJQUFJLGNBQWM7WUFBRSxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVuRSxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNXLDBCQUFrQixHQUFoQyxVQUFpQyxJQUFpQjtRQUM5QyxtRUFBbUU7UUFDbkUsbUtBQW1LO1FBQ25LLGtEQUFrRDtRQUNsRCxJQUFNLFdBQVcsR0FBRztZQUNoQixnQkFBZ0IsRUFDWix5REFBeUQ7U0FDaEUsQ0FBQztRQUNGLElBQU0saUJBQWlCLEdBQUc7WUFDdEIsZ0JBQWdCLEVBQ1oseURBQXlEO1NBQ2hFLENBQUM7UUFFRix5R0FBeUc7UUFDekcsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXZDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNsQiw0RUFBNEU7UUFDNUUsSUFDSSxVQUFVO1lBQ1YsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLFdBQVc7WUFFcEUsS0FBSyxHQUFHLElBQUksQ0FBQztRQUVqQixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1IsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUMxQixLQUFLLElBQUksU0FBUyxJQUFJLGlCQUFpQixFQUFFO2dCQUNyQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQzFCLEtBQUssR0FBRyxJQUFJLENBQUM7b0JBQ2IsTUFBTTtpQkFDVDthQUNKO1NBQ0o7UUFDRCxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXpCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixxRUFBcUU7UUFDckUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7UUFDNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEMsSUFDSSxNQUFNO2dCQUNOLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUN6RDtnQkFDRSxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNkLE1BQU07YUFDVDtTQUNKO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVhLHVCQUFlLEdBQTdCLFVBQThCLFFBQVE7UUFDbEMsSUFBSSxHQUFHLEdBQUc7WUFDTixLQUFLLEVBQUUsR0FBRztZQUNWLElBQUksRUFBRSxHQUFHO1NBQ1osQ0FBQztRQUNGLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQyxJQUFJLE1BQU07WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMxQixJQUFJLFFBQVEsSUFBSSxHQUFHO1lBQUUsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRWEsdUJBQWUsR0FBN0IsVUFBOEIsUUFBUSxFQUFFLElBQUk7UUFDeEMsSUFBSSxHQUFHLEdBQUc7WUFDTixVQUFVLEVBQUUsRUFBRTtZQUNkLFNBQVMsRUFBRSxFQUFFO1lBQ2IsS0FBSyxFQUFFLEVBQUU7WUFDVCxNQUFNLEVBQUUsRUFBRTtZQUNWLEtBQUssRUFBRSxFQUFFO1lBQ1QsU0FBUyxFQUFFLEVBQUU7WUFDYixVQUFVLEVBQUUsRUFBRTtTQUNqQixDQUFDO1FBQ0YsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN4QjtRQUNELElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQ7Ozs7OztNQU1GO1FBQ0UsT0FBTyxPQUFPLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRWEsbUJBQVcsR0FBekIsVUFBMEIsT0FBTztRQUM3QixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxPQUFPLEtBQUssSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLElBQUksT0FBTyxDQUFDLFdBQVc7WUFBRSxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDcEQsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QyxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUU7WUFDdEIsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDOUIsSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO2dCQUNsRCxTQUFTLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztTQUN2QzthQUFNLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN0QyxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3Qzs7WUFBTSxPQUFPLEVBQUUsQ0FBQztRQUNqQixJQUFJLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDbkUsdUJBQXVCO1FBQ3ZCLElBQUksRUFBRSxHQUFHLHlEQUF5RCxDQUFDO1FBQ25FLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNoQixTQUFTLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekMsZ0VBQWdFO1FBQ2hFLElBQUksUUFBUSxHQUFHLHVDQUF1QyxDQUFDO1FBQ3ZELHNFQUFzRTtRQUN0RSxJQUFJLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQztRQUN4QyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDL0IsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxVQUFDO1lBQ04sT0FBTyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUMzQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQzdDO1lBQ0QsSUFBSSxNQUFNLEdBQUc7Z0JBQ1Q7b0JBQ0ksUUFBUSxFQUFFLElBQUk7b0JBQ2QsTUFBTSxFQUFFLE9BQU87aUJBQ2xCO2FBQ0osQ0FBQztZQUNGLE9BQU8sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1lBQzdCLE9BQU8sTUFBTSxDQUFDO1NBQ2pCO2FBQU07WUFDSCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFVBQUM7WUFDTixJQUFJLEVBQUUsVUFBQztZQUNQLE9BQU8sQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtnQkFDN0MsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNqQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFbEIsT0FBTyxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO29CQUN6QyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUMvQztnQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO29CQUNSLFFBQVEsRUFBRSxNQUFNO29CQUNoQixNQUFNLEVBQUUsT0FBTztpQkFDbEIsQ0FBQyxDQUFDO2FBQ047WUFDRCxPQUFPLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztZQUM3QixPQUFPLE1BQU0sQ0FBQztTQUNqQjtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ1csdUJBQWUsR0FBN0IsVUFBOEIsT0FBTztRQUNqQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTFCLElBQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFNUIsSUFBSSxNQUFNLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzdELElBQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RCxzQkFBc0I7UUFDdEIsSUFBSSxRQUFRLEtBQUssUUFBUTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBRXpDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUUzQixJQUFNLE1BQU0sR0FBYyxJQUFJLHFCQUFTLEVBQUUsQ0FBQztRQUMxQyxJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsSUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELDBFQUEwRTtRQUMxRSxJQUFJLE9BQU8sS0FBSyxPQUFPLElBQUksT0FBTyxLQUFLLGNBQWMsRUFBRTtZQUNuRCwwQkFBMEI7WUFDMUIsSUFBSSxDQUFDLHVCQUFVLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDO2dCQUN4QyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUN2QixPQUFPLE1BQU0sQ0FBQztTQUNqQjtRQUVEOzs7O1dBSUc7UUFDSCxTQUFTLGdCQUFnQixDQUFDLElBQVUsRUFBRSxNQUFlO1lBQ2pELDREQUE0RDtZQUM1RCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ2xELE9BQU8sS0FBSyxDQUFDOztvQkFFYixPQUFPLElBQUksQ0FBQzthQUNuQjtpQkFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDNUMsd0VBQXdFO2dCQUN4RSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSTtvQkFDcEMsT0FBTyxPQUFPLENBQUM7Z0JBRW5CLElBQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLElBQWUsQ0FBQyxDQUFDO2dCQUNqRCxJQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3BELElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRTtvQkFDdkIsSUFBSSx1QkFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDM0IsSUFBSSxNQUFNLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFBRTs0QkFDbkIsZ0RBQWdEOzRCQUNoRCxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQzlDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO21DQUN0RSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFO2dDQUM5RixNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7Z0NBQy9DLE9BQU8sV0FBVyxDQUFDOzZCQUN0Qjs7Z0NBQ0csT0FBTyxJQUFJLENBQUM7eUJBQ25CO3FCQUNKO29CQUNELElBQUksQ0FBQyx1QkFBVSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQzt3QkFDdEMsT0FBTyxLQUFLLENBQUM7b0JBQ2pCLE9BQU8sSUFBSSxDQUFDO2lCQUNmOztvQkFDRyxPQUFPLE9BQU8sQ0FBQzthQUN0Qjs7Z0JBQ0UsT0FBTyxPQUFPLENBQUM7UUFDdEIsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSxvS0FBb0s7UUFDcEssSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUNuQyxPQUFPLFFBQVEsRUFBRTtZQUNiLElBQUksVUFBVSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsRCxJQUFJLFVBQVUsS0FBSyxLQUFLLEVBQUU7Z0JBQ3RCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixNQUFNO2FBQ1Q7WUFDRCxJQUFJLFVBQVUsS0FBSyxPQUFPLEVBQUU7Z0JBQ3hCLE1BQU07YUFDVDtZQUNELFFBQVEsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1NBQ25DO1FBRUQsUUFBUSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDbkMsT0FBTyxRQUFRLEVBQUU7WUFDYixJQUFJLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkQsSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFO2dCQUN0QixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDbkIsTUFBTTthQUNUO1lBQ0QsSUFBSSxVQUFVLEtBQUssT0FBTyxFQUFFO2dCQUN4QixNQUFNO2FBQ1Q7WUFDRCxRQUFRLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztTQUN2QztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7O09BR0c7SUFDVyw4QkFBc0IsR0FBcEMsVUFBcUMsT0FBTztRQUN4QyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTNCLHNCQUFzQjtRQUN0QixJQUFNLEtBQUssR0FBRyxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFNUMsNkRBQTZEO1FBQzdELElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7WUFDN0MsYUFBYSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUMsWUFBWSxFQUFFLFdBQVc7WUFDMUQsV0FBVyxFQUFDLFlBQVksRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLGNBQWM7U0FDMUUsQ0FBQyxDQUFDO1FBQ0gsSUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDaEIsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUNmLE1BQU0sQ0FBQyxZQUFZLENBQUM7WUFDcEIsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUNuQixNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ25CLE1BQU0sQ0FBQyxZQUFZLENBQUM7WUFDcEIsTUFBTSxDQUFDLGVBQWUsQ0FBQztZQUN2QixNQUFNLENBQUMsYUFBYSxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxjQUFjLENBQUM7WUFFdEIsT0FBTyxLQUFLLENBQUM7UUFFakIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7T0FHRztJQUNXLG1CQUFXLEdBQXpCLFVBQTBCLElBQVk7UUFDbEMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUV4Qix1RkFBdUY7UUFDdkYsSUFBSSxLQUFLLEdBQUcsb0NBQW9DLENBQUM7UUFFakQsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFekQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNXLDZCQUFxQixHQUFuQyxVQUFvQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGNBQW1CO1FBQW5CLG9EQUFtQjtRQUNyRSwyRUFBMkU7UUFDM0UsSUFBTSxRQUFRLEdBQUcsOEJBQThCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVwSCxtRUFBbUU7UUFDbkUsSUFBTSxZQUFZLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5RCxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUU7WUFDdkIsT0FBTyxZQUFZLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztTQUM3RDtRQUVELHFGQUFxRjtRQUNyRixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDcEIsT0FBTyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQ3RCLGdEQUFnRDtZQUNoRCxzRkFBc0Y7WUFDdEYsSUFBSSxRQUFRLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLDRCQUE0QixFQUFFO2dCQUNuRixRQUFRLEdBQUcscUJBQVMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdDLFNBQVM7YUFDWjtZQUVELElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBRTNFLHdFQUF3RTtZQUN4RSxLQUFLLElBQU0sU0FBUyxJQUFJLFVBQVUsRUFBRTtnQkFDaEMsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUU5QixJQUFJLENBQUMsS0FBSyxFQUFFO29CQUNSLDBEQUEwRDtvQkFDMUQsU0FBUztpQkFDWjtnQkFFRCwwQ0FBMEM7Z0JBQzFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUU1QixvQ0FBb0M7Z0JBQ3BDLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDaEMsU0FBUztpQkFDWjtnQkFFRCxzQ0FBc0M7Z0JBQ3RDLElBQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUM5QixvREFBb0Q7b0JBQ3BELHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQzdDLE9BQU8sUUFBUSxDQUFDO2lCQUNuQjtxQkFBTSxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3ZDLDJDQUEyQztvQkFDM0MscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDN0MsT0FBTyxRQUFRLENBQUM7aUJBQ25CO2FBQ0o7WUFFRCxRQUFRLEdBQUcscUJBQVMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDaEQ7UUFFRCxrRkFBa0Y7UUFDbEYscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNoRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNXLHdCQUFnQixHQUE5QixVQUErQixjQUFjO1FBQ3pDLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFakMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFcEUsSUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTlCLGNBQWMsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckQsSUFBSSxLQUFLLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxLQUFLO1lBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzQixPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFTCxjQUFDO0FBQUQsQ0FBQztBQS9oQ1ksMEJBQU87Ozs7Ozs7Ozs7OztBQzlCcEI7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLDJGQUErQztBQUMvQyxpR0FBbUQ7QUFTbkQ7SUFBQTtJQWtGQSxDQUFDO0lBakZHOzZDQUN5QztJQUMzQixrQkFBUSxHQUF0QixVQUF1QixTQUFnRCxFQUFFLE9BQU8sRUFBRSxTQUFTO1FBQ3ZGLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDakMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx3QkFBd0IsSUFBSSxTQUFTLENBQUMsUUFBUSxLQUFLLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUEwQixDQUFDLENBQUMsQ0FBQyxTQUF5QixDQUFDO1FBQzNMLElBQUksUUFBUSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDakMsUUFBUSxDQUFDLFFBQVEsR0FBRyxFQUFFO1NBQ3pCO1FBQ0QsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUMxQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQztTQUMxQztRQUNELE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDckMsQ0FBQztJQUVhLGtCQUFRLEdBQXRCLFVBQXVCLFNBQTZELEVBQUUsVUFBVSxFQUFFLEtBQUs7UUFDbkcsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUNqQyxJQUFJLFFBQVEsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHdCQUF3QixJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQTBCLENBQUMsQ0FBQyxDQUFDLFNBQXlCLENBQUM7UUFDM0wsSUFBSSxRQUFRLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxRQUFRLENBQUMsUUFBUSxHQUFHLEVBQUU7U0FDekI7UUFDRCxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRWEscUJBQVcsR0FBekIsVUFBMEIsU0FBZ0QsRUFBRSxPQUFPLEVBQUUsUUFBbUI7UUFDcEcsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUNqQyxJQUFJLFFBQVEsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHdCQUF3QixJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQTBCLENBQUMsQ0FBQyxDQUFDLFNBQXlCLENBQUM7UUFDM0wsSUFBSSxRQUFRLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxRQUFRLENBQUMsUUFBUSxHQUFHLEVBQUU7U0FDekI7UUFDRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssU0FBUyxJQUFJLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxXQUFXLEVBQUU7WUFDL0YsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQztTQUMzQztRQUNELE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDckMsQ0FBQztJQUVhLHFCQUFXLEdBQXpCLFVBQTBCLFNBQWU7O1FBQ3JDLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztRQUN4QixPQUFRLFNBQVMsQ0FBQyxhQUErQixDQUFDLFFBQVEsQ0FBQztRQUMzRCxJQUFJLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUQsR0FBRztZQUNDLEVBQUUsZUFBZSxDQUFDO1lBQ2xCLE9BQVEsRUFBRSxDQUFDLElBQXFCLENBQUMsUUFBUSxDQUFDO1lBQzFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLE9BQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUErQixDQUFDLFFBQVEsQ0FBQztTQUNyRixRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUN4QixJQUFJLFNBQVMsTUFBSyxlQUFTLENBQUMsYUFBYSwwQ0FBRSxlQUFlLEdBQUU7WUFDeEQsNkVBQTZFO1lBQzdFLHVFQUF1RTtZQUN2RSxtREFBbUQ7WUFDbkQsSUFBSSxLQUFLLEdBQUcsSUFBSSxxQkFBUyxDQUFDLFNBQVMsQ0FBQyxhQUFjLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUYsMkVBQTJFO1lBQzNFLHNFQUFzRTtZQUN0RSx3RUFBd0U7WUFDeEUsd0VBQXdFO1lBQ3hFLHlFQUF5RTtZQUN6RSxvQkFBb0I7WUFDcEI7Z0JBQ0ksSUFBSSxRQUFRLEdBQVksS0FBSyxDQUFDLElBQWUsQ0FBQztnQkFDOUMsSUFBSSxVQUFVLFNBQWdCLENBQUM7Z0JBQy9CLE9BQU8sVUFBVSxHQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUNuRCxRQUFRLEdBQUcsVUFBVSxDQUFDO2lCQUN6QjtnQkFDRCxLQUFLLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQzthQUN6QjtZQUNELEdBQUc7Z0JBQ0MsaUVBQWlFO2dCQUNqRSw4REFBOEQ7Z0JBQzlELHVFQUF1RTtnQkFDdkUsdUVBQXVFO2dCQUN2RSxnQkFBZ0I7Z0JBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLGlCQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzNELEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNyQixTQUFTO2lCQUNaO2dCQUNELE9BQVEsS0FBSyxDQUFDLElBQVksQ0FBQyxRQUFRLENBQUM7Z0JBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLE9BQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFxQixDQUFDLFFBQVEsQ0FBQzthQUNqRixRQUFRLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRTtTQUM5QjtRQUVELE9BQU8sZUFBZSxDQUFDO0lBQzNCLENBQUM7SUFDTCxnQkFBQztBQUFELENBQUM7QUFsRlksOEJBQVM7Ozs7Ozs7Ozs7OztBQ3ZCdEI7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLHVGQUF3QztBQUN4QyxpRkFBb0M7QUFFcEM7SUFBQTtJQXNoQkEsQ0FBQztJQW5oQkc7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ1csMkNBQThCLEdBQTVDLFVBQTZDLElBQVU7UUFDbkQsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUvQyxJQUFJLElBQUksR0FBRyxJQUFtQixDQUFDO1FBRS9CLElBQU0sTUFBTSxHQUFHLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2RixJQUFJLE1BQU0sS0FBSyxTQUFTO1lBQ3BCLE9BQU8sTUFBTSxDQUFDO1FBRWxCLElBQU0sS0FBSyxHQUFHLGlCQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsSUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLGNBQWM7UUFDcEQsSUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWM7UUFFckQsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFHO1lBQ3hELHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRSxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV0RCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2QsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRSxJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUM7Z0JBQ2xCLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRTNELElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEMsMkVBQTJFO1lBQzNFLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUc7Z0JBQ3ZCLElBQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hHLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDbEUsT0FBTyxHQUFHLENBQUM7YUFDZDtZQUVELGtIQUFrSDtZQUNsSCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN0QixJQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ2xFLE9BQU8sR0FBRyxDQUFDO2FBQ2Q7WUFFRCw0SEFBNEg7WUFDNUgsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDdEIsSUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEcscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNsRSxPQUFPLEdBQUcsQ0FBQzthQUNkO1lBRUQsa0hBQWtIO1lBQ2xILElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3RCLElBQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hHLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDbEUsT0FBTyxHQUFHLENBQUM7YUFDZDtTQUVKO1FBRUQsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQztnQkFDbEIsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFFM0QsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVwQzs7Ozs7OztjQU9FO1lBQ0YsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUcsTUFBTTtnQkFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzVDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFHLE1BQU07Z0JBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUM1QyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBRyxNQUFNO2dCQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDN0MsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUcsTUFBTTtnQkFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBRTdDLCtHQUErRztZQUMvRywyRUFBMkU7WUFDM0UsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFN0MsSUFBSSxLQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksS0FBSyxDQUFDLEtBQUcsQ0FBQyxFQUFFO2dCQUNaLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxLQUFLLENBQUM7YUFDaEI7WUFFRCxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUN4QixLQUFHLEdBQUcsS0FBRyxHQUFHLE1BQU0sR0FBQyxHQUFHLENBQUM7aUJBQ3RCO2dCQUNELElBQUksSUFBSSxHQUFHLGlCQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBRyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ1AscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwRSxPQUFPLEtBQUssQ0FBQztpQkFDaEI7Z0JBQ0QsS0FBRyxHQUFHLGlCQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM3RDtZQUNELElBQUksS0FBRyxJQUFJLE1BQU0sRUFBRTtnQkFDZixxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3BFLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBRUQsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNiLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxLQUFLLENBQUM7YUFDaEI7WUFFRCxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUN4QixJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBQyxHQUFHLENBQUM7aUJBQ3ZCO2dCQUNELElBQUksSUFBSSxHQUFHLGlCQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ1AscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwRSxPQUFPLEtBQUssQ0FBQztpQkFDaEI7Z0JBQ0QsSUFBSSxHQUFHLGlCQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM5RDtZQUNELElBQUksSUFBSSxJQUFJLEtBQUssRUFBRTtnQkFDZixxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3BFLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBRUQsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNkLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxLQUFLLENBQUM7YUFDaEI7WUFFRCxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUN4QixLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBQyxHQUFHLENBQUM7aUJBQ3pCO2dCQUNELElBQUksSUFBSSxHQUFHLGlCQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ1AscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwRSxPQUFPLEtBQUssQ0FBQztpQkFDaEI7Z0JBQ0QsS0FBSyxHQUFHLGlCQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUMvRDtZQUVELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDZixxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3BFLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBRUQsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztnQkFDeEIsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUMsR0FBRyxDQUFDO2lCQUM1QjtnQkFDRCxJQUFJLElBQUksR0FBRyxpQkFBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNQLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDcEUsT0FBTyxLQUFLLENBQUM7aUJBQ2hCO2dCQUNELE1BQU0sR0FBRyxpQkFBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDaEU7WUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxTQUFTLElBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDLFNBQVMsRUFBRTtnQkFDdkYscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNuRSxPQUFPLElBQUksQ0FBQzthQUNmO1lBRUQscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BFLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQztnQkFDbEIsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFFM0QsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVwQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ1YscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwRSxPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUVELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hCLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFDLEdBQUcsQ0FBQztpQkFDakI7Z0JBQ0QsSUFBSSxJQUFJLEdBQUcsaUJBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDUCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3BFLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjtnQkFDRCxDQUFDLEdBQUcsaUJBQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzNEO1lBQ0QsSUFBSSxDQUFDLElBQUksS0FBSyxFQUFFO2dCQUNaLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxLQUFLLENBQUM7YUFDaEI7WUFFRCxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ1YscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwRSxPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUVELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hCLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFDLEdBQUcsQ0FBQztpQkFDbEI7Z0JBQ0QsSUFBSSxJQUFJLEdBQUcsaUJBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDUCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3BFLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjtnQkFDRCxPQUFPLEdBQUcsaUJBQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2pFO1lBQ0QsSUFBSSxDQUFDLElBQUksTUFBTSxFQUFFO2dCQUNiLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxLQUFLLENBQUM7YUFDaEI7WUFFRCxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ1YscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwRSxPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUVELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hCLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFDLEdBQUcsQ0FBQztpQkFDakI7Z0JBQ0QsSUFBSSxJQUFJLEdBQUcsaUJBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDUCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3BFLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjtnQkFDRCxDQUFDLEdBQUcsaUJBQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzNEO1lBQ0QsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDLFNBQVMsRUFBRTtnQkFDN0IscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNuRSxPQUFPLElBQUksQ0FBQzthQUNmO1lBRUQsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNWLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxLQUFLLENBQUM7YUFDaEI7WUFFRCxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUN4QixDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBQyxHQUFHLENBQUM7aUJBQ2xCO2dCQUNELElBQUksSUFBSSxHQUFHLGlCQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ1AscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwRSxPQUFPLEtBQUssQ0FBQztpQkFDaEI7Z0JBQ0QsQ0FBQyxHQUFHLGlCQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUMzRDtZQUVELElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQyxTQUFTLEVBQUU7Z0JBQzdCLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbkUsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRSxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakUsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVwQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ2YscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwRSxPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUVELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDMUIsSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzVDLE1BQU0sR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFDLEdBQUcsQ0FBQzthQUMvQjtpQkFBTTtnQkFDSCxJQUFNLElBQUksR0FBRyxpQkFBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNQLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDcEUsT0FBTyxLQUFLLENBQUM7aUJBQ2hCO2dCQUNELE1BQU0sR0FBRyxpQkFBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDaEU7WUFFRCxJQUFJLE1BQU0sSUFBSSxZQUFZLENBQUMsU0FBUyxFQUFFO2dCQUNsQyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25FLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFFRCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEUsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNkLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFcEMsa0RBQWtEO1lBQ2xELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLGNBQWMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssZUFBZSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQzlHLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDdEIsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUMxQixJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQzt3QkFDNUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUMsR0FBRyxDQUFDO3FCQUMvQjt5QkFBTTt3QkFDSCxJQUFNLElBQUksR0FBRyxpQkFBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUM5QyxJQUFJLENBQUMsSUFBSSxFQUFFOzRCQUNQLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQzs0QkFDcEUsT0FBTyxLQUFLLENBQUM7eUJBQ2hCO3dCQUNELE1BQU0sR0FBRyxpQkFBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7cUJBQ2hFO29CQUNELElBQUksTUFBTSxJQUFJLFlBQVksQ0FBQyxTQUFTLEVBQUU7d0JBQ2xDLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDbkUsT0FBTyxJQUFJLENBQUM7cUJBQ2Y7b0JBQ0QscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwRSxPQUFPLEtBQUssQ0FBQztpQkFFaEI7cUJBQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDN0IsS0FBSyxJQUFJLENBQUMsR0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ25DLElBQUksUUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDbEMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFOzRCQUMxQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7NEJBQ3ZDLFFBQU0sR0FBRyxRQUFNLEdBQUcsS0FBSyxHQUFDLEdBQUcsQ0FBQzt5QkFDL0I7NkJBQU07NEJBQ0gsSUFBTSxJQUFJLEdBQUcsaUJBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFNLENBQUMsQ0FBQzs0QkFDOUMsSUFBSSxDQUFDLElBQUksRUFBRTtnQ0FDUCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0NBQ3BFLE9BQU8sS0FBSyxDQUFDOzZCQUNoQjs0QkFDRCxRQUFNLEdBQUcsaUJBQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO3lCQUNoRTt3QkFDRCxJQUFJLFFBQU0sSUFBSSxZQUFZLENBQUMsU0FBUyxFQUFFOzRCQUNsQyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsSUFBSSxDQUFDLENBQUM7NEJBQ25FLE9BQU8sSUFBSSxDQUFDO3lCQUNmO3dCQUVELHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDcEUsT0FBTyxLQUFLLENBQUM7cUJBQ2hCO2lCQUNKO2dCQUVELHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxLQUFLLENBQUM7YUFDaEI7WUFFRCw0QkFBNEI7WUFDNUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDN0QsSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDO2dCQUNmLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRXhELE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3RCLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxLQUFLLENBQUM7YUFDaEI7WUFFRCxLQUFLLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzFCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztvQkFDdkMsTUFBTSxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUMsR0FBRyxDQUFDO2lCQUMvQjtxQkFBTTtvQkFDSCxJQUFNLElBQUksR0FBRyxpQkFBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM5QyxJQUFJLENBQUMsSUFBSSxFQUFFO3dCQUNQLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDcEUsT0FBTyxLQUFLLENBQUM7cUJBQ2hCO29CQUNELE1BQU0sR0FBRyxpQkFBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ2hFO2dCQUNELElBQUksTUFBTSxJQUFJLFlBQVksQ0FBQyxTQUFTLEVBQUU7b0JBQ2xDLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDbkUsT0FBTyxJQUFJLENBQUM7aUJBQ2Y7Z0JBRUQscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwRSxPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUVELHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRSxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakUsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVwQyxvREFBb0Q7WUFDcEQsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTO2dCQUNwRCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN0QixLQUFLLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkMsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRztvQkFDMUIscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwRSxPQUFPLEtBQUssQ0FBQztpQkFDaEI7Z0JBRUQsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLEtBQUssSUFBSSxHQUFDLEdBQUUsQ0FBQyxFQUFFLEdBQUMsR0FBRyxDQUFDLEVBQUUsR0FBQyxFQUFFLEVBQUU7b0JBQ3ZCLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO3dCQUFFLE9BQU8sS0FBSyxDQUFDO29CQUUvQixJQUFJLFdBQVcsQ0FBQyxHQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO3dCQUM1QixhQUFhLENBQUMsR0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFDLEdBQUcsQ0FBQzt5QkFDckU7d0JBQ0QsSUFBTSxJQUFJLEdBQUcsaUJBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsR0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDdEQsSUFBSSxDQUFDLElBQUk7NEJBQUUsT0FBTyxLQUFLLENBQUM7d0JBQ3hCLGFBQWEsQ0FBQyxHQUFDLENBQUMsR0FBRyxpQkFBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7cUJBQzFFO2lCQUNKO2dCQUNELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDVCxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNyQixDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4QjtnQkFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxTQUFTO29CQUN4RCxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxTQUFTO29CQUN4RCxTQUFTLEdBQUcsSUFBSSxDQUFDO2FBQ3hCO1lBQ0QsSUFBSSxTQUFTLElBQUksU0FBUyxFQUFFO2dCQUN4QixxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3BFLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25FLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEUsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVjLDZCQUFnQixHQUEvQixVQUFnQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQWEsRUFBRSxNQUFjLEVBQUUsSUFBWTtRQUEzQyxxQ0FBYTtRQUFFLHVDQUFjO1FBQUUsbUNBQVk7UUFDbEYsSUFBTSxLQUFLLEdBQUcsaUJBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUUsY0FBYztRQUNwRCxJQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYztRQUVyRCxNQUFNO1FBQ04sSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRW5DLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDakIsU0FBUyxHQUFHLFNBQVMsR0FBRyxNQUFNLEdBQUMsR0FBRyxDQUFDO2FBQ2xDO1lBQ0QsSUFBTSxJQUFJLEdBQUcsaUJBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4QixTQUFTLEdBQUcsaUJBQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ25FO1FBRUQsZ0NBQWdDO1FBQ2hDLElBQUksU0FBUyxHQUFHLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVyQyxRQUFRO1FBQ1IsSUFBSSxXQUFXLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXJDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDbkIsV0FBVyxHQUFHLFdBQVcsR0FBRyxLQUFLLEdBQUMsR0FBRyxDQUFDO2FBQ3JDO1lBQ0QsSUFBTSxJQUFJLEdBQUcsaUJBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4QixXQUFXLEdBQUcsaUJBQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3JFO1FBQ0QsZ0NBQWdDO1FBQ2hDLElBQUksV0FBVyxHQUFHLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUV0QyxTQUFTO1FBQ1QsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXRDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDcEIsWUFBWSxHQUFHLFlBQVksR0FBRyxNQUFNLEdBQUMsR0FBRyxDQUFDO2FBQ3hDO1lBQ0QsSUFBTSxJQUFJLEdBQUcsaUJBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4QixZQUFZLEdBQUcsaUJBQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3RFO1FBQ0QsZ0NBQWdDO1FBQ2hDLElBQUksWUFBWSxHQUFHLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUV4QyxPQUFPO1FBQ1AsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXBDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDbEIsVUFBVSxHQUFHLFVBQVUsR0FBRyxLQUFLLEdBQUMsR0FBRyxDQUFDO2FBQ25DO1lBQ0QsSUFBTSxJQUFJLEdBQUcsaUJBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4QixVQUFVLEdBQUcsaUJBQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3BFO1FBQ0QsZ0NBQWdDO1FBQ2hDLElBQUksVUFBVSxHQUFHLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVyQyxJQUFJLE1BQU0sR0FBRyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsU0FBUyxJQUFLLEtBQUssR0FBRyxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsSUFBSSxZQUFZLENBQUMsU0FBUztZQUM5SCxPQUFPLElBQUksQ0FBQztRQUVoQixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBbmhCYyxzQkFBUyxHQUFZLENBQUMsQ0FBQyxDQUFFLE1BQU07SUFvaEJsRCxtQkFBQztDQUFBO0FBdGhCWSxvQ0FBWTs7Ozs7Ozs7Ozs7O0FDaEJ6Qjs7Ozs7Ozs7Ozs7Ozs7K0VBYytFOzs7QUFFL0UsaUdBQW1EO0FBRW5EO0lBQUE7SUFvWEEsQ0FBQztJQS9ORyxnREFBZ0Q7SUFDbEMsZUFBSyxHQUFuQixVQUFvQixhQUFhO1FBQzdCLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM1QyxJQUFJLGFBQWEsS0FBSyxhQUFhO1lBQUUsT0FBTyxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRSxJQUFJLGFBQWEsSUFBSSxTQUFTLENBQUMsY0FBYztZQUN6QyxhQUFhLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RCxJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbEMsSUFBSSxRQUFRLEdBQUcsa0RBQWtELENBQUM7WUFDbEUsSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsS0FBSyxJQUFJO2dCQUFFLE9BQU8sSUFBSSxDQUFDO2lCQUN2QjtnQkFDRCxPQUFPLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDekM7U0FDSjthQUFNLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMxQyxJQUFJLFFBQVEsR0FBRyw4REFBOEQsQ0FBQztZQUM5RSxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxLQUFLLElBQUk7Z0JBQUUsT0FBTyxJQUFJLENBQUM7aUJBQ3ZCO2dCQUNELE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDL0M7U0FDSjthQUFNLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUU7WUFDdkMsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNO1lBQ0gsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDNUIsNEZBQTRGO2dCQUM1RixpREFBaUQ7Z0JBQ2pELGFBQWEsR0FBRyxHQUFHLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUNuRCxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQ2pDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3pDO1lBQ0QsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFELElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1RCxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0QsT0FBTyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsaUNBQWlDO0lBQ3JDLENBQUM7SUFBQSxDQUFDO0lBRVMsb0JBQVUsR0FBeEIsVUFBeUIsV0FBeUI7UUFDL0MsSUFBSTtZQUNBLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7WUFDcEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDTixPQUFPLElBQUksQ0FBQzthQUNmO1lBQ0QsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUMxQixJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNOLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFFRCxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDbkIsSUFBSSxRQUFRLEdBQWEsV0FBVyxDQUFDO1lBQ3JDLE9BQU8sUUFBUSxFQUFFO2dCQUNiLElBQUksUUFBUSxDQUFDLFFBQVEsS0FBSyxDQUFDO29CQUN2QixTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM3QixRQUFRLEdBQUcscUJBQVMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDaEQ7WUFFRCxJQUFJLE1BQU0sR0FBRztnQkFDVCxhQUFhLEVBQUUsS0FBSztnQkFDcEIsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLFlBQVksRUFBRSxLQUFLO2dCQUNuQixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsSUFBSTthQUNiLENBQUM7WUFFRixRQUFRO1lBQ1IsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9DLElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDbEMsSUFBSSxDQUFDLGNBQWM7Z0JBQ2YsY0FBYyxHQUFHLE9BQU8sQ0FBQztZQUM3QixJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksT0FBTyxHQUFHLDhCQUE4QixDQUFDO1lBQzdDLElBQUksY0FBYyxHQUFHLFVBQVUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPO2dCQUNyRCxJQUFJO29CQUNBLHlDQUF5QztvQkFDekMsSUFBSSxPQUFPLFFBQVEsQ0FBQyxNQUFNLEtBQUssV0FBVzt3QkFDdEMsT0FBTyxRQUFRLENBQUM7b0JBRXBCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQztvQkFDeEIsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7b0JBQzdCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFO3dCQUNsRCxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUNyQyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDNUQsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO3dCQUNkLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQzt3QkFDWixPQUFPLElBQUksR0FBRyxLQUFLLEVBQUU7NEJBQ2pCLE9BQU8sR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRTtnQ0FDekksVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dDQUMzRixVQUFVLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQ0FDL0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7NkJBQ3BCOzRCQUNELE9BQU8sR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRTtnQ0FDekksVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dDQUMzRixVQUFVLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQ0FDL0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7NkJBQ3BCOzRCQUNELElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO3lCQUNwQjt3QkFDRCxJQUFJLGlCQUFpQixLQUFLLElBQUksSUFBSSxpQkFBaUIsR0FBRyxVQUFVLEVBQUU7NEJBQzlELGlCQUFpQixHQUFHLFVBQVUsQ0FBQzs0QkFDL0IsWUFBWSxHQUFHLFVBQVUsQ0FBQzt5QkFDN0I7cUJBQ0o7b0JBQ0QsT0FBTyxZQUFZLENBQUMsQ0FBQywyQkFBMkI7aUJBQ25EO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2xCO2dCQUNELE9BQU8sT0FBTyxDQUFDO1lBQ25CLENBQUMsQ0FBQztZQUVGLElBQUksWUFBWSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUMsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDNUIsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQztZQUN2QiwrREFBK0Q7WUFDL0QsT0FBTyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDekIsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUMvQiwyQ0FBMkM7Z0JBQzNDLDZDQUE2QztnQkFDN0MsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLE1BQU0sS0FBSyxJQUFJO29CQUFFLFNBQVM7Z0JBRTlCLDZFQUE2RTtnQkFDN0UsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLE1BQU0sQ0FBQyxlQUFlLElBQUksTUFBTSxDQUFDLGVBQWUsSUFBSSxhQUFhLElBQUksTUFBTSxDQUFDLGVBQWUsSUFBSSxrQkFBa0IsRUFBRTtvQkFDbkgsV0FBVyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2lCQUN6RDtnQkFDRCxtSEFBbUg7Z0JBQ25ILElBQUksTUFBTSxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtvQkFDOUcsSUFBSSxVQUFVLEdBQWMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ2xFLElBQUksVUFBVSxFQUFFO3dCQUNaLElBQUksYUFBYSxHQUFnQixFQUFFLENBQUM7d0JBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFOzRCQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtnQ0FDdkIsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzs2QkFDN0I7aUNBQU07Z0NBQ0gsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDL0MsSUFBSSxTQUFTLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRTtvQ0FDdEQsc0RBQXNEO29DQUN0RCxJQUFJLFdBQVcsR0FBRyxXQUFXLElBQUksWUFBWSxDQUFDO29DQUM5QyxTQUFTLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQ0FDdEQ7Z0NBQ0QsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzs2QkFDakM7eUJBQ0o7d0JBQ0QsV0FBVyxHQUFHLGNBQWMsQ0FBQyxhQUFhLEVBQUUsV0FBVyxJQUFJLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztxQkFDaEY7aUJBQ0o7Z0JBRUQsMkJBQTJCO2dCQUMzQixJQUFJLGdCQUFnQixLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQzlHLG1CQUFtQjtvQkFDbkIsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO3dCQUNyQixVQUFVO3dCQUNWLFdBQVcsQ0FBQyxLQUFLLEdBQUcsZ0JBQWdCLEdBQUcsY0FBYyxDQUFDO3dCQUN0RCxZQUFZLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztxQkFDNUQ7b0JBQ0QsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO29CQUN2QixjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUN0QixXQUFXLEdBQUcsSUFBSSxDQUFDO29CQUNuQixJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUM3QyxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUNqRDtvQkFDRCxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7d0JBQ3JCLFdBQVcsR0FBRyxXQUFXLENBQUM7d0JBQzFCLGNBQWMsR0FBRyxXQUFXLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQzt3QkFDMUMsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDO3dCQUN6QixJQUFJLGdCQUFnQixLQUFLLEdBQUcsSUFBSSxjQUFjLEtBQUssR0FBRyxFQUFFOzRCQUNwRCxNQUFNLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQzs0QkFDMUIsTUFBTSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7eUJBQzlCO3FCQUNKO2lCQUNKO2dCQUNELGdFQUFnRTtxQkFDM0QsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO29CQUMxQix5REFBeUQ7b0JBQ3pELElBQUksV0FBVyxLQUFLLElBQUksRUFBRTt3QkFDdEIsV0FBVyxHQUFHLFdBQVcsQ0FBQzt3QkFDMUIsY0FBYyxHQUFHLFdBQVcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDO3dCQUMxQyxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUM7cUJBQzVCO3lCQUFNO3dCQUNILFdBQVcsR0FBRyxXQUFXLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUN2RCw0Q0FBNEM7d0JBQzVDLGNBQWMsR0FBRyxXQUFXLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQztxQkFDN0M7b0JBQ0QsbUdBQW1HO29CQUNuRyxvRUFBb0U7b0JBQ3BFLElBQUksZ0JBQWdCLEtBQUssR0FBRyxJQUFJLGNBQWMsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFHakk7aUJBQ0o7Z0JBQ0QsSUFBSSxNQUFNLENBQUMsZUFBZSxJQUFJLE1BQU0sQ0FBQyxlQUFlLElBQUksTUFBTSxFQUFFO29CQUM1RCxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO3dCQUNwRixNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztxQkFDN0I7eUJBQU07d0JBQ0gsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7cUJBQzVCO2lCQUNKO2FBQ0o7WUFDRCxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7Z0JBQ3JCLEVBQUUsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUM7YUFDbkI7WUFDRCxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztZQUM5QyxFQUFFLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN0QyxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7Z0JBQ3JCLFdBQVcsQ0FBQyxLQUFLLEdBQUcsZ0JBQWdCLEdBQUcsY0FBYyxDQUFDO2dCQUN0RCxZQUFZLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUM1RDtZQUNELE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUM7WUFFekIsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssTUFBTTtnQkFDakQsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFFN0IsT0FBTyxNQUFNLENBQUM7U0FDakI7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNWLDhCQUE4QjtZQUM5QixPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0osQ0FBQztJQUFBLENBQUM7SUFqWGUsd0JBQWMsR0FBRztRQUMzQixXQUFXLEVBQUUsU0FBUztRQUN0QixjQUFjLEVBQUUsU0FBUztRQUN6QixNQUFNLEVBQUUsU0FBUztRQUNqQixZQUFZLEVBQUUsU0FBUztRQUN2QixPQUFPLEVBQUUsU0FBUztRQUNsQixPQUFPLEVBQUUsU0FBUztRQUNsQixRQUFRLEVBQUUsU0FBUztRQUNuQixPQUFPLEVBQUUsU0FBUztRQUNsQixnQkFBZ0IsRUFBRSxTQUFTO1FBQzNCLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFlBQVksRUFBRSxTQUFTO1FBQ3ZCLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLFlBQVksRUFBRSxTQUFTO1FBQ3ZCLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLGdCQUFnQixFQUFFLFNBQVM7UUFDM0IsVUFBVSxFQUFFLFNBQVM7UUFDckIsU0FBUyxFQUFFLFNBQVM7UUFDcEIsTUFBTSxFQUFFLFNBQVM7UUFDakIsVUFBVSxFQUFFLFNBQVM7UUFDckIsVUFBVSxFQUFFLFNBQVM7UUFDckIsZUFBZSxFQUFFLFNBQVM7UUFDMUIsVUFBVSxFQUFFLFNBQVM7UUFDckIsV0FBVyxFQUFFLFNBQVM7UUFDdEIsV0FBVyxFQUFFLFNBQVM7UUFDdEIsYUFBYSxFQUFFLFNBQVM7UUFDeEIsZ0JBQWdCLEVBQUUsU0FBUztRQUMzQixZQUFZLEVBQUUsU0FBUztRQUN2QixZQUFZLEVBQUUsU0FBUztRQUN2QixTQUFTLEVBQUUsU0FBUztRQUNwQixZQUFZLEVBQUUsU0FBUztRQUN2QixjQUFjLEVBQUUsU0FBUztRQUN6QixlQUFlLEVBQUUsU0FBUztRQUMxQixlQUFlLEVBQUUsU0FBUztRQUMxQixlQUFlLEVBQUUsU0FBUztRQUMxQixZQUFZLEVBQUUsU0FBUztRQUN2QixVQUFVLEVBQUUsU0FBUztRQUNyQixhQUFhLEVBQUUsU0FBUztRQUN4QixTQUFTLEVBQUUsU0FBUztRQUNwQixZQUFZLEVBQUUsU0FBUztRQUN2QixXQUFXLEVBQUUsU0FBUztRQUN0QixhQUFhLEVBQUUsU0FBUztRQUN4QixhQUFhLEVBQUUsU0FBUztRQUN4QixTQUFTLEVBQUUsU0FBUztRQUNwQixXQUFXLEVBQUUsU0FBUztRQUN0QixZQUFZLEVBQUUsU0FBUztRQUN2QixNQUFNLEVBQUUsU0FBUztRQUNqQixXQUFXLEVBQUUsU0FBUztRQUN0QixNQUFNLEVBQUUsU0FBUztRQUNqQixPQUFPLEVBQUUsU0FBUztRQUNsQixhQUFhLEVBQUUsU0FBUztRQUN4QixVQUFVLEVBQUUsU0FBUztRQUNyQixTQUFTLEVBQUUsU0FBUztRQUNwQixXQUFXLEVBQUUsU0FBUztRQUN0QixRQUFRLEVBQUUsU0FBUztRQUNuQixPQUFPLEVBQUUsU0FBUztRQUNsQixPQUFPLEVBQUUsU0FBUztRQUNsQixVQUFVLEVBQUUsU0FBUztRQUNyQixlQUFlLEVBQUUsU0FBUztRQUMxQixXQUFXLEVBQUUsU0FBUztRQUN0QixjQUFjLEVBQUUsU0FBUztRQUN6QixXQUFXLEVBQUUsU0FBUztRQUN0QixZQUFZLEVBQUUsU0FBUztRQUN2QixXQUFXLEVBQUUsU0FBUztRQUN0QixzQkFBc0IsRUFBRSxTQUFTO1FBQ2pDLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLFlBQVksRUFBRSxTQUFTO1FBQ3ZCLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLGFBQWEsRUFBRSxTQUFTO1FBQ3hCLGVBQWUsRUFBRSxTQUFTO1FBQzFCLGNBQWMsRUFBRSxTQUFTO1FBQ3pCLGdCQUFnQixFQUFFLFNBQVM7UUFDM0IsZ0JBQWdCLEVBQUUsU0FBUztRQUMzQixhQUFhLEVBQUUsU0FBUztRQUN4QixNQUFNLEVBQUUsU0FBUztRQUNqQixXQUFXLEVBQUUsU0FBUztRQUN0QixPQUFPLEVBQUUsU0FBUztRQUNsQixTQUFTLEVBQUUsU0FBUztRQUNwQixRQUFRLEVBQUUsU0FBUztRQUNuQixrQkFBa0IsRUFBRSxTQUFTO1FBQzdCLFlBQVksRUFBRSxTQUFTO1FBQ3ZCLGNBQWMsRUFBRSxTQUFTO1FBQ3pCLGNBQWMsRUFBRSxTQUFTO1FBQ3pCLGdCQUFnQixFQUFFLFNBQVM7UUFDM0IsaUJBQWlCLEVBQUUsU0FBUztRQUM1QixtQkFBbUIsRUFBRSxTQUFTO1FBQzlCLGlCQUFpQixFQUFFLFNBQVM7UUFDNUIsaUJBQWlCLEVBQUUsU0FBUztRQUM1QixjQUFjLEVBQUUsU0FBUztRQUN6QixXQUFXLEVBQUUsU0FBUztRQUN0QixXQUFXLEVBQUUsU0FBUztRQUN0QixVQUFVLEVBQUUsU0FBUztRQUNyQixhQUFhLEVBQUUsU0FBUztRQUN4QixNQUFNLEVBQUUsU0FBUztRQUNqQixTQUFTLEVBQUUsU0FBUztRQUNwQixPQUFPLEVBQUUsU0FBUztRQUNsQixXQUFXLEVBQUUsU0FBUztRQUN0QixRQUFRLEVBQUUsU0FBUztRQUNuQixXQUFXLEVBQUUsU0FBUztRQUN0QixRQUFRLEVBQUUsU0FBUztRQUNuQixlQUFlLEVBQUUsU0FBUztRQUMxQixXQUFXLEVBQUUsU0FBUztRQUN0QixlQUFlLEVBQUUsU0FBUztRQUMxQixlQUFlLEVBQUUsU0FBUztRQUMxQixZQUFZLEVBQUUsU0FBUztRQUN2QixXQUFXLEVBQUUsU0FBUztRQUN0QixNQUFNLEVBQUUsU0FBUztRQUNqQixNQUFNLEVBQUUsU0FBUztRQUNqQixNQUFNLEVBQUUsU0FBUztRQUNqQixZQUFZLEVBQUUsU0FBUztRQUN2QixRQUFRLEVBQUUsU0FBUztRQUNuQixLQUFLLEVBQUUsU0FBUztRQUNoQixXQUFXLEVBQUUsU0FBUztRQUN0QixXQUFXLEVBQUUsU0FBUztRQUN0QixhQUFhLEVBQUUsU0FBUztRQUN4QixRQUFRLEVBQUUsU0FBUztRQUNuQixZQUFZLEVBQUUsU0FBUztRQUN2QixVQUFVLEVBQUUsU0FBUztRQUNyQixVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUUsU0FBUztRQUNuQixRQUFRLEVBQUUsU0FBUztRQUNuQixTQUFTLEVBQUUsU0FBUztRQUNwQixXQUFXLEVBQUUsU0FBUztRQUN0QixXQUFXLEVBQUUsU0FBUztRQUN0QixNQUFNLEVBQUUsU0FBUztRQUNqQixhQUFhLEVBQUUsU0FBUztRQUN4QixXQUFXLEVBQUUsU0FBUztRQUN0QixLQUFLLEVBQUUsU0FBUztRQUNoQixNQUFNLEVBQUUsU0FBUztRQUNqQixTQUFTLEVBQUUsU0FBUztRQUNwQixRQUFRLEVBQUUsU0FBUztRQUNuQixXQUFXLEVBQUUsU0FBUztRQUN0QixRQUFRLEVBQUUsU0FBUztRQUNuQixPQUFPLEVBQUUsU0FBUztRQUNsQixPQUFPLEVBQUUsU0FBUztRQUNsQixZQUFZLEVBQUUsU0FBUztRQUN2QixRQUFRLEVBQUUsU0FBUztRQUNuQixhQUFhLEVBQUUsU0FBUztRQUN4QixZQUFZLEVBQUUsc0JBQXNCO1FBQ3BDLFlBQVksRUFBRSxTQUFTO1FBQ3ZCLFVBQVUsRUFBRSxzQkFBc0I7S0FDckM7SUFrT0wsZ0JBQUM7Q0FBQTtBQXBYWSw4QkFBUztBQXNYdEI7SUFNSSxrQkFBWSxHQUFxQixFQUFFLEtBQXVCLEVBQUUsSUFBc0IsRUFBRSxLQUF3QjtRQUN4RyxTQUFTLFlBQVksQ0FBQyxJQUFzQjtZQUN4QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUFFLE9BQU8sSUFBYyxDQUFDO1lBQ3hELElBQUksT0FBTyxHQUFHLElBQWMsQ0FBQztZQUM3QixPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRztnQkFBRSxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxFQUFFO1lBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBZSxDQUFDO1NBQ2pHO0lBQ0wsQ0FBQztJQUVELDRCQUFTLEdBQVQsVUFBVSxLQUFjO1FBQ3BCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ25CLE9BQU8sR0FBRyxHQUFHLE1BQU0sQ0FBQztRQUN4QixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQUEsQ0FBQztJQUVGLHdCQUFLLEdBQUw7UUFDSSxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBQUEsQ0FBQztJQUVGLGdDQUFhLEdBQWIsVUFBYyxPQUFrQjtRQUM1QixJQUFJLE9BQU8sR0FBYSxJQUFJLENBQUM7UUFFN0IsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVc7WUFDbEMsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFNUMsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtZQUM1QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWCxLQUFLLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRTtnQkFDckIsQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7YUFDbkI7WUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDZixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDWjtRQUNELElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDdEYsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUFBLENBQUM7SUFFRixvQ0FBaUIsR0FBakI7UUFDSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUMxQixDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEUsQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRSxPQUFPLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFBQSxDQUFDO0lBRUYsc0JBQUcsR0FBSCxVQUFJLE1BQWlCLEVBQUUsUUFBaUI7UUFDcEMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLFdBQVcsRUFBRTtZQUM5RSxPQUFPLElBQUksUUFBUSxDQUNmLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQ2pELFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQ3JELFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQ3RELENBQUM7U0FDTDthQUFNO1lBQ0gsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRCxPQUFPLElBQUksUUFBUSxDQUNmLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQ2pELFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQ3JELFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQ25ELFFBQVEsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsVUFBVSxDQUNyRCxDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBQUEsQ0FBQztJQUVGLGtDQUFlLEdBQWYsVUFBZ0IsT0FBa0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRTtZQUN4RCxtQ0FBbUM7WUFDbkMsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDaEIsK0NBQStDO1lBQy9DLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQzVELDhEQUE4RDtZQUM5RCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNwQixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRWEscUJBQVksR0FBMUIsVUFBMkIsYUFBYTtRQUNwQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVsQixhQUFhLEdBQUcsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVDLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNsQyxJQUFJLFFBQVEsR0FBRyxrREFBa0QsQ0FBQztZQUNsRSxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxLQUFLLElBQUk7Z0JBQUUsT0FBTyxJQUFJLENBQUM7aUJBQ3ZCO2dCQUNELE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakIsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQjtTQUNKO2FBQU0sSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFDLElBQUksUUFBUSxHQUFHLDhEQUE4RCxDQUFDO1lBQzlFLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLEtBQUssSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQztpQkFDdkI7Z0JBQ0QsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDZixTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25CO1NBQ0o7YUFBTTtZQUNILElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUU7Z0JBQ2hDLElBQUksYUFBYSxJQUFJLFNBQVMsQ0FBQyxjQUFjO29CQUN6QyxhQUFhLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQzs7b0JBQ3ZELE9BQU8sSUFBSSxDQUFDO2FBQ3BCO1lBQ0QsSUFBSSxPQUFPLEdBQUcsVUFBVSxHQUFHO2dCQUN2QixJQUFJLE1BQU0sR0FBRztvQkFDVCxHQUFHLEVBQUUsRUFBRTtvQkFDUCxHQUFHLEVBQUUsRUFBRTtvQkFDUCxHQUFHLEVBQUUsRUFBRTtvQkFDUCxHQUFHLEVBQUUsRUFBRTtvQkFDUCxHQUFHLEVBQUUsRUFBRTtvQkFDUCxHQUFHLEVBQUUsRUFBRTtpQkFDVixDQUFDO2dCQUNGLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtvQkFDakMsTUFBTSxHQUFHLE1BQU0sR0FBRyxFQUFFO3dCQUNoQixRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDakY7Z0JBQ0QsT0FBTyxNQUFNLENBQUM7WUFDbEIsQ0FBQztZQUNELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQzVCLDRGQUE0RjtnQkFDNUYsaURBQWlEO2dCQUNqRCxhQUFhLEdBQUcsR0FBRyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDbkQsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUNqQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6QztZQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRCxTQUFTLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkQsUUFBUSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsT0FBTyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDTCxlQUFDO0FBQUQsQ0FBQztBQS9KWSw0QkFBUTs7Ozs7Ozs7Ozs7O0FDeFlyQjs7Ozs7Ozs7Ozs7OEVBVzhFOzs7Ozs7Ozs7Ozs7QUFFOUUscUhBQWdFO0FBQ2hFLHVGQUF3QztBQUV4QyxvRkFBc0M7QUFDdEMsNkZBQTRDO0FBQzVDLGlGQUFvQztBQUNwQywyRkFBK0M7QUFDL0MsaUdBQW1EO0FBQ25ELDRJQUE0RTtBQUU1RTtJQUFBO0lBNG9EQSxDQUFDO0lBbmpEaUIsb0JBQVMsR0FBdkIsVUFBd0IsR0FBRztRQUN2QixHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0IsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNXLHFCQUFVLEdBQXhCLFVBQXlCLE9BQU87UUFDNUIscURBQXFEO1FBQ3JELGtDQUFrQztRQUNsQyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDbEQsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLGlCQUFPLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMxRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDbEMsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMxRDtRQUNELDRDQUE0QztRQUM1QyxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlDLElBQUksUUFBUSxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUU7WUFDbEMsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxVQUFVLEVBQUU7Z0JBQ2hDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDNUI7WUFDRCxPQUFPLE1BQU0sQ0FBQztTQUNqQjthQUFNO1lBQ0gsSUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ25ELElBQUksRUFBRSxLQUFLLE1BQU0sSUFBSSxFQUFFLEtBQUssRUFBRTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUM1QyxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNXLHNCQUFXLEdBQXpCLFVBQTBCLEdBQUc7UUFDekIsSUFBSSxHQUFHLEtBQUssV0FBVyxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDckMsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ1csc0JBQVcsR0FBekIsVUFBMEIsT0FBTztRQUM3QixJQUFJLENBQUMsaUJBQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFbEQsMkJBQTJCO1FBQzNCLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUMsSUFBSSxRQUFRLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRTtZQUNsQyxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsRUFBRTtnQkFDaEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM1QjtZQUNELE9BQU8sTUFBTSxDQUFDO1NBQ2pCO2FBQU07WUFDSCxlQUFlO1lBQ2YsSUFBSSxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNoRSxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7OztNQUdFO0lBQ1ksNEJBQWlCLEdBQS9CLFVBQWdDLGtCQUF5QztRQUNyRSxJQUFJLENBQUMsa0JBQWtCO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFckMsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBSSxJQUFJLFFBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFqRCxDQUFpRCxDQUFDLENBQUM7SUFDeEcsQ0FBQztJQUVhLHlCQUFjLEdBQTVCLFVBQTZCLElBQUk7UUFDN0IsSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRTtZQUMzQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUNoRCxJQUFJLGFBQWEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxPQUFPLGFBQWEsS0FBSyxDQUFDLElBQUksYUFBYSxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ3REO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7OztPQUdHO0lBQ1csOEJBQW1CLEdBQWpDLFVBQWtDLE9BQU87UUFDckMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsMkRBQTJEO1FBQzNELElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsRUFBRTtZQUNuRSxJQUFJLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxPQUFPLEVBQUU7Z0JBQ3hDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDeEUsRUFBRSxLQUFLLENBQUM7aUJBQ1g7YUFDSjtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVhLDJCQUFnQixHQUE5QixVQUErQixDQUFDO1FBQzVCLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQUEsQ0FBQztJQUVGLGlGQUFpRjtJQUNqRixvRkFBb0Y7SUFDdEUsc0JBQVcsR0FBekIsVUFBMEIsSUFBSSxFQUFFLFNBQVM7UUFDckMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksSUFBSSxFQUFFO1lBQ04sSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMzQyxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUU7Z0JBQ3RCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25ELElBQUksSUFBSSxFQUFFO29CQUNOLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTt3QkFDckMsTUFBTSxHQUFHLElBQUksS0FBSyxVQUFVLENBQUM7cUJBQ2hDO3lCQUFNLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTt3QkFDekMsTUFBTSxHQUFHLElBQUksS0FBSyxPQUFPLENBQUM7cUJBQzdCO2lCQUNKO2FBQ0o7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFYSx5QkFBYyxHQUE1QixVQUE2QixJQUFJLEVBQUUsU0FBUztRQUN4QyxJQUFJLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU8saUJBQWlCLENBQUM7UUFFaEYsSUFBSSxXQUFXLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLElBQUksRUFBRSxHQUFHLFdBQVcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzdDLElBQUksV0FBVyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BHLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsQ0FBQztnQkFBRSxpQkFBaUIsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ3REO1FBQ0QsSUFBSSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUMxRCxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzs7WUFFakYsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLE9BQU8saUJBQWlCLENBQUM7SUFDN0IsQ0FBQztJQUVhLDhCQUFtQixHQUFqQyxVQUFrQyxJQUFJLEVBQUUsT0FBTztRQUMzQyxJQUFJLEdBQUcsR0FBRyx1QkFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBUSxDQUFDO1FBQ3JELE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsSUFBSSxLQUFLLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNyQixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLHFCQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN2RDtRQUNELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNXLHdCQUFhLEdBQTNCLFVBQTRCLFVBQVUsRUFBRSxPQUFPO1FBQzNDLE9BQU8sVUFBVSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ1csOEJBQW1CLEdBQWpDLFVBQWtDLFVBQVUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLHFCQUFxQjtRQUN0Rix1QkFBdUI7UUFDdkIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFFbEMsMEZBQTBGO1FBQzFGLDZCQUE2QjtRQUM3QixPQUFPLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFFbEIsOEVBQThFO1lBQzlFLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLEVBQUU7Z0JBRTFDLG9GQUFvRjtnQkFDcEYseUZBQXlGO2dCQUN6Rix1RkFBdUY7Z0JBQ3ZGLDZFQUE2RTtnQkFDN0UsK0ZBQStGO2dCQUMvRiw2Q0FBNkM7Z0JBQzdDLHFIQUFxSDtnQkFDckgscUhBQXFIO2dCQUNySCxxRkFBcUY7Z0JBQ3JGLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDM0gsOEJBQThCO29CQUM5QixLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztvQkFFMUIsU0FBUztpQkFDWjtnQkFFRCxtQkFBbUI7Z0JBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEI7WUFFRCxtQ0FBbUM7WUFDbkMsS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7U0FDN0I7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztXQVlPO0lBQ08sNEJBQWlCLEdBQS9CLFVBQWdDLEdBQUcsRUFBRSxLQUFLO1FBQ3RDLE9BQU8sVUFBVSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNXLGtDQUF1QixHQUFyQyxVQUFzQyxHQUFHLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLHFCQUFzQjtRQUUzRiw2R0FBNkc7UUFDN0csMERBQTBEO1FBQzFELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLHFCQUFxQixFQUFFO1lBQ3ZCLFdBQVcsR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsc0NBQXNDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDdkY7YUFBTTtZQUNILFdBQVcsR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDOUU7UUFHRCxvR0FBb0c7UUFDcEcsMkJBQTJCO1FBQzNCLElBQUksV0FBVyxLQUFLLElBQUksRUFBRTtZQUN0QixxQ0FBcUM7WUFDckMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUVqQiwwQkFBMEI7WUFDMUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUVwQixvR0FBb0c7WUFDcEcsaUJBQWlCO1lBQ2pCLE9BQU8scUJBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUN4QyxxQkFBcUI7Z0JBQ3JCLElBQUksR0FBRyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNyQztZQUNELGtHQUFrRztZQUNsRyw0Q0FBNEM7WUFDNUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLDBFQUEwRTtZQUMxRSw4RUFBOEU7WUFDOUUsa0JBQWtCO1lBQ2xCLHFDQUFxQztZQUNyQyxvQkFBb0I7WUFDcEIseUJBQXlCO1lBQ3pCLElBQUk7WUFDSixPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUU7b0JBQUUsU0FBUztnQkFDekIsMkVBQTJFO2dCQUMzRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRTtvQkFFYixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7b0JBQ2hCLHVDQUF1QztvQkFDdkMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDN0MsMEZBQTBGO3dCQUMxRiwyRUFBMkU7d0JBQzNFLE1BQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDdEQ7b0JBRUQsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUkscUJBQXFCLEVBQUU7d0JBQzNELHlEQUF5RDt3QkFDekQsSUFBSSxZQUFZLEdBQUcsbUJBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNyRCxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDOzRCQUNoRCxNQUFNLEdBQUcsWUFBWSxDQUFDO3FCQUM3QjtvQkFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO3dCQUNyQixTQUFTO3FCQUNaO29CQUVELGtIQUFrSDtvQkFDbEgsVUFBVTtvQkFDViwrRkFBK0Y7b0JBQy9GLDZDQUE2QztvQkFDN0MsbUhBQW1IO29CQUNuSCxtSEFBbUg7b0JBQ25ILG1GQUFtRjtvQkFDbkYsRUFBRTtvQkFDRixzSEFBc0g7b0JBQ3RILDRCQUE0QjtvQkFDNUIsSUFBSSxxQkFBcUIsSUFBSSxVQUFVLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUN4RSxTQUFTO3FCQUNaO29CQUVELHNFQUFzRTtvQkFDdEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7d0JBQ3BDLHNGQUFzRjt3QkFDdEYsc0NBQXNDO3dCQUN0QyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLEVBQUU7NEJBQzdCLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7eUJBQy9CO3dCQUVELHlDQUF5Qzt3QkFDekMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3hDO2lCQUNKO2FBQ0o7WUFFRCxvREFBb0Q7WUFDcEQsSUFBSSxxQkFBcUIsRUFBRTtnQkFDdkIscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLHNDQUFzQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQ2hGO2lCQUFNO2dCQUNILHFCQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSw2QkFBNkIsRUFBRSxXQUFXLENBQUMsQ0FBQzthQUN2RTtTQUVKO1FBRUQsNkJBQTZCO1FBQzdCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVoQix5RUFBeUU7UUFDekUsNERBQTREO1FBQzVELElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUM3QixJQUFJLElBQUksR0FBRyxLQUFLLENBQUM7WUFDakIsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNYLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEI7UUFFRCx5RkFBeUY7UUFDekYsb0NBQW9DO1FBQ3BDLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNkLDBCQUEwQjtZQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDbkMsa0NBQWtDO2dCQUNsQyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLG1EQUFtRDtnQkFDbkQsSUFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUV0Qyx3RUFBd0U7Z0JBQ3hFLElBQUksU0FBUyxFQUFFO29CQUNYLG9EQUFvRDtvQkFDcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7d0JBQ3ZDLHFDQUFxQzt3QkFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDN0I7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7V0FHTztJQUNPLG1CQUFRLEdBQXRCLFVBQXVCLE9BQU87UUFDMUIsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLENBQUM7ZUFDL0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7ZUFDekQsVUFBVSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssSUFBSTtlQUMxRixDQUFDLGlCQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLGlCQUFPLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDO2VBQ3hFLFVBQVUsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7WUFDNUUsT0FBTyxLQUFLLENBQUM7UUFFakIsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztZQUMvQixPQUFPLElBQUksQ0FBQztRQUVoQixJQUFNLElBQUksR0FBRyxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXhCLElBQU0sWUFBWSxHQUFHLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDNUgsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzdCLGtDQUFrQztZQUNsQyxJQUFJLFFBQU0sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQ25DLElBQUksUUFBTSxFQUFFO2dCQUNSLElBQU0sV0FBVyxHQUFHLG1CQUFRLENBQUMsZUFBZSxDQUFDLFFBQU0sQ0FBQyxDQUFDO2dCQUNyRCxtR0FBbUc7Z0JBQ25HLElBQUksV0FBVyxLQUFLLE9BQU87b0JBQ3ZCLFFBQU0sR0FBRyxRQUFNLENBQUMsYUFBYSxDQUFDO2FBQ3JDO1lBRUQsSUFBSSxRQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFNLENBQUM7Z0JBQ3JDLE9BQU8sSUFBSSxDQUFDO1NBQ25CO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVhLHFCQUFVLEdBQXhCLFVBQXlCLEdBQUc7UUFDeEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUM1QixPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckI7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFDYSx3QkFBYSxHQUEzQixVQUE0QixHQUFHO1FBQzNCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDNUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDZjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUNhLHdCQUFhLEdBQTNCLFVBQTRCLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUTtRQUMvQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTNDLElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUksT0FBTztZQUMzQyxRQUFRLElBQUksR0FBRyxJQUFJLFFBQVEsSUFBSSxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEQsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGtCQUFrQjtRQUNsQixJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuRCxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzFDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQjtRQUVELHFCQUFxQjtRQUNyQixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRTtnQkFDdEIsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdkM7aUJBQU0sSUFBSSxRQUFRLEtBQUssR0FBRyxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUU7Z0JBQ2hELFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3hDO2lCQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDbEMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDeEM7WUFDRCxJQUFJLFFBQVEsS0FBSyxJQUFJO2dCQUFFLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDckMsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3pCO1FBRUQsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUNsQyw0RUFBNEU7WUFDNUUsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBQ2pFLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztvQkFDcEMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkU7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFDYSw4QkFBbUIsR0FBakMsVUFBa0MsSUFBSTtRQUNsQyxPQUFPLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxJQUFJO1lBQ3ZFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ2EscUJBQVUsR0FBeEIsVUFBeUIsR0FBRztRQUN4QixJQUFJLGdCQUFnQixHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTTtZQUMzRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNO1lBQ3RELE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUs7WUFDcEQsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSztZQUNwRCxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNO1NBQ2pDLENBQUM7UUFDRixPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNhLDhCQUFtQixHQUFqQyxVQUFrQyxJQUFJO1FBQ2xDLE9BQU8sVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLElBQUk7WUFDdkUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNhLHFCQUFVLEdBQXhCLFVBQXlCLEdBQUc7UUFDeEIsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPO1lBQ25GLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLO1lBQzlELEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPO1lBQzlELE1BQU07U0FDVCxDQUFDO1FBQ0YsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDYSw4QkFBbUIsR0FBakMsVUFBa0MsSUFBSTtRQUNsQyxPQUFPLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxJQUFJO1lBQ3JFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFJYSxtQkFBUSxHQUF0QixVQUF1QixHQUFHO1FBQ3RCLE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDakYsQ0FBQztJQUNhLG9CQUFTLEdBQXZCLFVBQXdCLEdBQUc7UUFDdkIsSUFBSSxlQUFlLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTztZQUNyRixRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRO1NBQzlELENBQUM7UUFDRixPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFYSx1QkFBWSxHQUExQixVQUEyQixHQUFHLEVBQUUsRUFBRTtRQUM5QixPQUFPLHFCQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNhLHNCQUFXLEdBQXpCLFVBQTBCLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTTtRQUNyQyxJQUFJLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QixJQUFJLFNBQVMsR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELHFCQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEMsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVELDREQUE0RDtJQUM5QyxxQkFBVSxHQUF4QixVQUF5QixLQUFLLEVBQUUsR0FBRztRQUMvQixLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtZQUNqQixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1NBQ3ZDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNXLHNCQUFXLEdBQXpCLFVBQTBCLE9BQU8sRUFBRSxRQUFRO1FBQ3ZDLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN2QixPQUFPLFFBQVEsS0FBSyxJQUFJLEVBQUU7WUFDdEIsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM5QyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxRQUFRLEVBQUU7Z0JBQ2hDLElBQUksT0FBTyxLQUFLLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtvQkFDcEMsTUFBTTtpQkFDVDthQUNKO2lCQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRTtnQkFDeEIsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLEVBQUU7b0JBQ3RCLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLE9BQU87d0JBQ3pCLE9BQU8sUUFBUSxDQUFDO2lCQUN2QjthQUNKO2lCQUFNLElBQUksT0FBTyxJQUFJLFFBQVEsRUFBRTtnQkFDNUIsTUFBTTthQUNUO1lBQ0QsUUFBUSxHQUFHLHFCQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVELG9EQUFvRDtJQUN0QyxvQkFBUyxHQUF2QixVQUF3QixRQUFRLEVBQUUsUUFBUTtRQUN0QyxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUU7WUFDdEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLElBQUkscUJBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUkscUJBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxFQUFFO2dCQUM3RSxJQUFJLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDO2FBQ3BEO1lBRUQsT0FBTyxJQUFJLEVBQUU7Z0JBQ1QsSUFBSSxJQUFJLEtBQUssUUFBUTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDbkMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDM0I7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFYSx1QkFBWSxHQUExQixVQUEyQixNQUFNLEVBQUUsS0FBSztRQUNwQyxJQUFJLElBQUksR0FBRyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxPQUFPLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDakIsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO2dCQUNqQixPQUFPLElBQUksQ0FBQzthQUNmO1lBQ0QsSUFBSSxHQUFHLHFCQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELG1EQUFtRDtJQUNyQyw0Q0FBaUMsR0FBL0MsVUFBZ0QsT0FBTztRQUNuRCxJQUFJLFlBQVksR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVGLElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFDNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNsQixJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRTtvQkFDdkQsSUFBSSxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7d0JBQ2xDLE9BQU8sSUFBSSxDQUFDO29CQUNoQixPQUFPLEtBQUssQ0FBQztpQkFDaEI7YUFDSjtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVhLHVDQUE0QixHQUExQyxVQUEyQyxPQUFPO1FBQzlDLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUNoQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ3BCLE9BQU8scUJBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3hDLHFCQUFxQjtZQUNyQixJQUFJLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDbEIsOERBQThEO1lBQzlELElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNoRCxJQUFJLHNCQUFzQixHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0YsSUFBSSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzNFLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2FBQ0o7U0FFSjtJQUNMLENBQUM7SUFFRDs7V0FFTztJQUNPLHdCQUFhLEdBQTNCLFVBQTRCLE9BQU87UUFDL0IsT0FBTyxVQUFVLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDVyw2QkFBa0IsR0FBaEMsVUFBaUMsT0FBTztRQUNwQyxPQUFPLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDVyxtQ0FBd0IsR0FBdEMsVUFBdUMsT0FBZ0IsRUFBRSxZQUFZO1FBQ2pFLHVHQUF1RztRQUN2RyxpQkFBaUI7UUFDakIsaUVBQWlFO1FBQ2pFLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMscUJBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBYSxJQUFJLENBQUMsQ0FBQyxDQUFXLElBQUksRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUMxRyx1QkFBdUI7WUFDdkIsSUFBSSxTQUFTLEdBQUcsRUFBRTtZQUVsQiwrQ0FBK0M7WUFDL0MsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNsRSxpRkFBaUY7WUFDakYseUVBQXlFO1lBQ3pFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUV4QyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ25DLG9GQUFvRjtvQkFDcEYsbUJBQW1CO29CQUNuQixJQUFJLFlBQVksSUFBSSxDQUFDLGlCQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUN2RCxTQUFTO3FCQUNaO29CQUVELFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRTthQUNKO1lBRUQsd0ZBQXdGO1lBQ3hGLGdFQUFnRTtZQUNoRSxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFhLElBQUksQ0FBQyxDQUFDLENBQVcsSUFBSSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQ2hIO1FBRUQsMEVBQTBFO1FBQzFFLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1Qix5QkFBeUI7WUFDekIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4Qyx5Q0FBeUM7WUFDekMseUdBQXlHO1lBQ3pHLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLG9GQUFvRjtnQkFDcEYsT0FBTyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFhLElBQUksQ0FBQyxDQUFDLENBQVcsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3hIO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsb0VBQW9FO0lBQ3RELDhCQUFtQixHQUFqQyxVQUFrQyxPQUFPLEVBQUUsSUFBSTtRQUMzQyw2R0FBNkc7UUFDN0csSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNGLElBQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1FBQzNDLElBQUksQ0FBQyxpQ0FBZSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDbkQsT0FBTyxRQUFRLENBQUM7UUFFcEIsMENBQTBDO1FBQzFDLElBQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsb0ZBQW9GO1FBQ3BGLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNsQixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUMzQyxJQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksUUFBUSxJQUFJLENBQUMsaUJBQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFO2dCQUNsRCxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUNiLE1BQU07YUFDVDtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFRCxrREFBa0Q7SUFDcEMsMkJBQWdCLEdBQTlCLFVBQStCLE9BQU87UUFDbEMsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUQsZ0VBQWdFO1FBQ2hFLCtEQUErRDtRQUMvRCxnSkFBZ0o7UUFDaEosd0RBQXdEO1FBQ3hELDRFQUE0RTtRQUM1RSx3SUFBd0k7UUFFeEksSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLElBQUksVUFBVSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUNsSCxJQUFJLFdBQVcsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdDLG9GQUFvRjtZQUNwRixXQUFXLEdBQUcsVUFBVSxDQUFDLDhCQUE4QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sVUFBVSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3hEO2FBQU07WUFDSCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFRCxvREFBb0Q7SUFDdEMsMkJBQWdCLEdBQTlCLFVBQStCLE9BQU87UUFDbEMsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUQsZ0VBQWdFO1FBQ2hFLCtEQUErRDtRQUMvRCxnSkFBZ0o7UUFDaEosd0RBQXdEO1FBQ3hELDRFQUE0RTtRQUM1RSx3SUFBd0k7UUFFeEksSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLElBQUksVUFBVSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUNsSCxJQUFJLFdBQVcsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdDLG9GQUFvRjtZQUNwRixXQUFXLEdBQUcsVUFBVSxDQUFDLDhCQUE4QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JFLElBQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbkQsT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDN0Q7O1lBQ0csT0FBTyxJQUFJLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNXLDRCQUFpQixHQUEvQixVQUFnQyxJQUFJO1FBQ2hDLDhEQUE4RDtRQUM5RCw2Q0FBNkM7UUFDN0MsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxTQUFTLEVBQUU7WUFDWCxtQ0FBbUM7WUFDbkMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxxQkFBcUI7U0FDckQ7YUFBTTtZQUNIOzs7Ozs7ZUFNRztZQUNILFNBQVMsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNsRCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sSUFBSSxVQUFVLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUM1RyxJQUFJLFdBQVcsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QywwRUFBMEU7Z0JBQzFFLCtDQUErQztnQkFDL0MsV0FBVyxHQUFHLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDckUsS0FBSyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDaEQ7O2dCQUNHLE9BQU8sSUFBSSxDQUFDO1NBQ25CO1FBRUQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFDNUIsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUxQixxQ0FBcUM7UUFDckMsS0FBSyxHQUFHLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFDNUIsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUxQiwrR0FBK0c7UUFDL0csS0FBSyxHQUFHLG1CQUFRLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQzVCLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFMUIsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNXLG9DQUF5QixHQUF2QyxVQUF3QyxTQUFrQixFQUFFLFlBQXFCO1FBQzdFLDZGQUE2RjtRQUM3RixvREFBb0Q7UUFDcEQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QyxJQUFNLEtBQUssR0FBWSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFJLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFO2dCQUMzRSxXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUNwQixNQUFNO2FBQ1Q7U0FDSjtRQUVELElBQUksRUFBRSxHQUFHLElBQUkscUJBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUMzQyw4QkFBOEI7WUFDOUIsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2hELElBQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsb0dBQW9HO2dCQUNwRyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxpQkFBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7dUJBQ3ZGLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlDLFNBQVM7Z0JBRWIsSUFBTSxJQUFJLEdBQUcsbUJBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVDLHFDQUFxQztnQkFDckMsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO29CQUNwQixJQUFNLE1BQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN4QyxJQUFJLE1BQUksSUFBSSxNQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQzlCLElBQUksSUFBSSxHQUFHLEdBQUcsTUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUVqQztxQkFBTSxJQUFJLElBQUksS0FBSyxVQUFVLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtvQkFDbEQsbUZBQW1GO29CQUNuRixJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUN6SSxJQUFJLFVBQVUsRUFBRTt3QkFDWixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDbkUsSUFBSSxjQUFjLElBQUksQ0FBQyxpQkFBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLEVBQUU7NEJBQzNELElBQU0sSUFBSSxHQUFHLHlCQUFXLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUM7NEJBQy9ELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJO2dDQUNqQixJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7eUJBQ3RDO3FCQUNKO2lCQUNKO3FCQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNyRiwwRkFBMEY7b0JBQzFGLDhEQUE4RDtvQkFDOUQsSUFBSSxPQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUNoRCxJQUFJLE9BQUssSUFBSSxPQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQ2hDLElBQUksSUFBSSxHQUFHLEdBQUcsT0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUUvQix5RUFBeUU7b0JBQ3pFLE9BQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUMzQyxJQUFJLE9BQUssSUFBSSxPQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQ2hDLElBQUksSUFBSSxHQUFHLEdBQUcsT0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUUvQixxQ0FBcUM7b0JBQ3JDLE9BQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNuQyxJQUFJLE9BQUssSUFBSSxPQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQ2hDLElBQUksSUFBSSxHQUFHLEdBQUcsT0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNsQztnQkFFRCxrQ0FBa0M7Z0JBQ2xDLElBQU0sS0FBSyxHQUFHLG1CQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtvQkFDNUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDbEM7U0FFSjtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFYSw2QkFBa0IsR0FBaEMsVUFBaUMsVUFBVSxFQUFFLE9BQU87UUFDaEQsNEdBQTRHO1FBQzVHLElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFDL0IsSUFBSSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25DLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNsQixJQUFJLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDbkYsT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQztpQkFDOUI7YUFDSjtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELHdLQUF3SztJQUMxSiw4QkFBbUIsR0FBakMsVUFBa0MsT0FBZ0I7UUFDOUMsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztZQUNuQyxPQUFPLEtBQUssQ0FBQztRQUNqQixJQUFJLFFBQVEsR0FBWSxPQUFPLENBQUM7UUFDaEMsT0FBTyxRQUFRLEVBQUU7WUFDYixJQUFJLFFBQVEsQ0FBQyxVQUFVO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ3JDLFFBQVEsR0FBRyxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNoRDtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCx5Q0FBeUM7SUFDM0IsMEJBQWUsR0FBN0IsVUFBOEIsT0FBZ0I7UUFDMUMsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLHFCQUFxQjtZQUN6QyxPQUFPLElBQUksQ0FBQztRQUNoQixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRWEseUNBQThCLEdBQTVDLFVBQTZDLE9BQU87UUFDaEQsSUFBSSxZQUFZLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEksSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNqRSxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3RDO1NBQ0o7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7V0FJTztJQUNPLDBCQUFlLEdBQTdCLFVBQThCLE9BQU8sRUFBRSxLQUFhO1FBQ2hELElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoRCxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxRQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDbEQsSUFBSSxZQUFZLEdBQUcsdUJBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pELElBQUksWUFBWSxJQUFJLGlCQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7U0FDNUU7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsbURBQW1EO0lBQ3JDLG9CQUFTLEdBQXZCLFVBQXdCLE9BQU87UUFDM0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLE9BQU8sUUFBUSxLQUFLLElBQUksRUFBRTtZQUN0QixRQUFRLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUMsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7U0FDckI7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsNkNBQTZDO0lBQzdDOzs7Ozs7O09BT0c7SUFDVywyQkFBZ0IsR0FBOUIsVUFBK0IsS0FBSyxFQUFFLEtBQUs7UUFDdkMsSUFBSSxLQUFLLEtBQUssS0FBSztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTlCLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxJQUFJLE1BQU0sR0FBRyxNQUFNLEVBQUU7WUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUNwQyxLQUFLLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFLDBCQUEwQjtnQkFDM0MsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNqQjthQUFNLElBQUksTUFBTSxHQUFHLE1BQU0sRUFBRTtZQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUM7Z0JBQ3BDLEtBQUssR0FBRyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxJQUFJLEtBQUssS0FBSyxLQUFLLEVBQUUsMEJBQTBCO2dCQUMzQyxPQUFPLENBQUMsQ0FBQztTQUNoQjtRQUNELE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLHFCQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLHFCQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pHLEtBQUssR0FBRyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxLQUFLLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNoSCxPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEtBQUs7WUFDbEMsS0FBSyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7UUFDbEMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLHFCQUFxQjtZQUNyQyxPQUFPLENBQUMsQ0FBQzs7WUFDUixPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDVyw0QkFBaUIsR0FBL0IsVUFBZ0MsT0FBTyxFQUFFLE9BQU87UUFDNUMsT0FBTyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsNERBQTREO0lBQzlDLHlCQUFjLEdBQTVCLFVBQTZCLFdBQVcsRUFBRSxTQUFTO1FBQy9DLElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO1FBQ25ELElBQUksU0FBUyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osT0FBTyxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUMzQixJQUFJO2dCQUNBLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTO29CQUFFLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM3RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7b0JBQ25ELElBQUk7d0JBQ0EsK0NBQStDO3dCQUMvQyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDM0UsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzVDO3FCQUNKO29CQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUc7aUJBQ2xCO2FBQ0o7WUFBQyxPQUFPLENBQUMsRUFBRSxHQUFHO1lBQ2YsRUFBRSxHQUFHLENBQUM7U0FDVDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFYSw0QkFBaUIsR0FBL0IsVUFBZ0MsTUFBTTtRQUNsQyxJQUFJLEdBQUcsQ0FBQztRQUNSLFFBQVEsTUFBTSxFQUFFO1lBQ1osS0FBSyxNQUFNO2dCQUNQLEdBQUcsR0FBRyw4QkFBOEIsQ0FBQztZQUN6QyxLQUFLLElBQUk7Z0JBQ0wsR0FBRyxHQUFHLDZCQUE2QixDQUFDO1lBQ3hDLEtBQUssR0FBRztnQkFDSixHQUFHLEdBQUcsOEJBQThCLENBQUM7WUFDekMsS0FBSyxPQUFPO2dCQUNSLEdBQUcsR0FBRyw4QkFBOEIsQ0FBQztZQUN6QztnQkFDSSxHQUFHLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQsaURBQWlEO0lBQ25DLCtCQUFvQixHQUFsQyxVQUFtQyxPQUFPO1FBQ3RDLG1DQUFtQztRQUNuQyxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBRTdCLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNySiw0RkFBNEY7WUFDNUYsNkdBQTZHO1lBQzdHLHdDQUF3QztZQUN4QyxJQUFJLEdBQUcsT0FBTyxDQUFDLFdBQVc7U0FDN0I7UUFFRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLEVBQUU7WUFDckUsNEZBQTRGO1lBQzVGLEtBQXVCLFVBQXVCLEVBQXZCLFlBQU8sQ0FBQyxhQUFhLEVBQUUsRUFBdkIsY0FBdUIsRUFBdkIsSUFBdUIsRUFBRTtnQkFBM0MsSUFBTSxRQUFRO2dCQUNmLE1BQU0sR0FBRyxNQUFNLElBQUksVUFBVSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzVEO1NBQ0o7UUFFRCx1REFBdUQ7UUFDdkQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELGdEQUFnRDtJQUNsQyx1QkFBWSxHQUExQixVQUEyQixPQUFPO1FBQzlCLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDL0IsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFDL0QsTUFBTSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDakMsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ1csK0JBQW9CLEdBQWxDLFVBQW1DLE9BQU87UUFDdEMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLElBQUksQ0FBQztRQUMxQixJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssQ0FBQztZQUFFLE9BQU8sT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXZELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksRUFBRSxHQUFHLElBQUkscUJBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoQyw2REFBNkQ7UUFDN0QsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQzNFLElBQUksRUFBRSxDQUFDLE9BQU87Z0JBQUUsU0FBUztZQUN6QixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFPLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBbUIsQ0FBQyxDQUFDLEVBQUU7Z0JBQy9MOzs7a0JBR0U7Z0JBQ0YsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQztvQkFDcEYsU0FBUztnQkFFYixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUNyQixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO3dCQUNsSCxJQUFJLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDdkQsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztvQkFDOUIsU0FBUztpQkFDWjs7b0JBQ0csTUFBTTthQUNiO1lBQ0QsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNoRixJQUFJLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzFDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O01BRUU7SUFDWSxzQkFBVyxHQUF6QixVQUEwQixPQUFPO1FBQzdCLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN4QyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFO2dCQUM3QixJQUFJLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzthQUNuQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDVywyQkFBZ0IsR0FBOUIsVUFBK0IsT0FBTztRQUNsQyxtQ0FBbUM7UUFDbkMsSUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU1Qyx1REFBdUQ7UUFDdkQsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFYSwwQkFBZSxHQUE3QixVQUE4QixPQUFPO1FBQ2pDLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFM0QsSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRTtZQUM3QixJQUFJLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEMsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2pDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUs7b0JBQ2xELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDckQ7U0FDSjtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDVyxnQ0FBcUIsR0FBbkMsVUFBb0MsT0FBTztRQUN2QyxPQUFPLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVhLHFCQUFVLEdBQXhCLFVBQXlCLE9BQW1CO1FBQ3hDLE9BQU8sVUFBVSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7ZUFDbkQsVUFBVSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQztlQUN4RCxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFYSx5Q0FBOEIsR0FBNUMsVUFBNkMsT0FBTyxFQUFFLGNBQWM7UUFDaEUsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMzQix1QkFBdUI7UUFDdkIsSUFBSSxZQUFZLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1FBQzdDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztRQUV2QiwyRkFBMkY7UUFDM0YscURBQXFEO1FBQ3JELElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtZQUN0QixpRkFBaUY7WUFDakYsZ0VBQWdFO1lBQ2hFLElBQUksRUFBRSxHQUFHLElBQUkscUJBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoQyx5R0FBeUc7WUFDekcsdUJBQXVCO1lBQ3ZCLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksT0FBTyxFQUFFO2dCQUN2RCxvQkFBb0I7Z0JBQ3BCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7Z0JBRW5CLCtFQUErRTtnQkFDL0UsbUdBQW1HO2dCQUNuRyxVQUFVLEdBQUcsQ0FDVCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUs7dUJBQ2xDLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO3VCQUMxRixDQUFDLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBbUIsQ0FBQyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFtQixDQUFDLENBQzVHLElBQUksQ0FDRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUs7dUJBQ2xDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBVyxDQUFDLENBQ3hDLENBQUM7Z0JBRU4sd0RBQXdEO2dCQUN4RCxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFtQixDQUFDLElBQUksQ0FBQyxpQkFBTyxDQUFDLG9CQUFvQixDQUFDLElBQW1CLENBQUMsRUFBRTtvQkFDOUksd0RBQXdEO29CQUN4RCxVQUFVLEdBQUcsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3BELElBQUksQ0FBQyxVQUFVLElBQUksY0FBYyxLQUFLLElBQUksRUFBRTt3QkFDeEMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUksVUFBVSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO3dCQUN2SCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO3dCQUM3QixJQUFJLEdBQUcsRUFBRTs0QkFDTCxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDOzRCQUMxQixJQUFJLEdBQUcsRUFBRTtnQ0FDTCxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsSUFBVyxDQUFDLENBQUM7Z0NBQy9DLElBQUksQ0FBQyxVQUFVLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtvQ0FDL0IsNkVBQTZFO29DQUM3RSxvRUFBb0U7b0NBQ3BFLFVBQVUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lDQUM1STs2QkFDSjt5QkFDSjtxQkFFSjtpQkFDSjtnQkFFRCw2RUFBNkU7Z0JBQzdFLGlGQUFpRjtnQkFDakYsNEZBQTRGO2dCQUM1RixhQUFhO2dCQUNiLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUkscUJBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssT0FBTyxFQUFFO29CQUNsRSx3REFBd0Q7b0JBQ3hELFVBQVUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDbkQ7YUFDSjtTQUNKO1FBQ0Qsa0dBQWtHO1FBQ2xHLDRGQUE0RjthQUN2RjtZQUNELHdEQUF3RDtZQUN4RCxVQUFVLEdBQUcsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdEQ7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRWEsK0JBQW9CLEdBQWxDLFVBQW1DLE9BQU87UUFDdEMsSUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxJQUFJLFVBQVUsR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTFHLElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFDNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksT0FBTyxFQUFFO2dCQUN2RCxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLO29CQUNsRCxVQUFVLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsVUFBVTt1QkFDUixDQUFDLG1CQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLG1CQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7dUJBQ25GLENBQUMsbUJBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTtvQkFDL0ksVUFBVSxHQUFHLElBQUksQ0FBQztpQkFDckI7YUFFSjtTQUNKO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVhLGdDQUFxQixHQUFuQyxVQUFvQyxJQUFZLEVBQUUsR0FBYTtRQUMzRCxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNuRSxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFYSxvQ0FBeUIsR0FBdkMsVUFBd0MsUUFBa0IsRUFBRSxHQUFhO1FBQ3JFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0QsR0FBRyxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDNUQ7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNXLDhCQUFtQixHQUFqQyxVQUFrQyxRQUFrQixFQUFFLEdBQWE7UUFDL0QsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzFELElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBQyxLQUFLO2dCQUMxQixPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sTUFBTSxDQUFDO1NBQ2pCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRWEsd0JBQWEsR0FBM0IsVUFBNEIsT0FBTztRQUMvQjs7Ozs7Ozs7Ozs7V0FXRztRQUNILDhCQUE4QjtRQUU5QiwwQ0FBMEM7UUFDMUMsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQy9CLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEQsSUFBSSxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssS0FBSyxVQUFVO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzFELElBQUksS0FBSyxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssVUFBVTtnQkFBRSxPQUFPLFFBQVEsQ0FBQztTQUNoRTtRQUVELDZEQUE2RDtRQUM3RCxrRUFBa0U7UUFDbEUsSUFBSSxRQUFRLEdBQUcsa0JBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLFFBQUUsTUFBTSxDQUFDLGNBQUksSUFBSSxXQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBekQsQ0FBeUQsQ0FBQyxDQUFDO1FBQzdILElBQUksUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDMUMsT0FBTyxRQUFRLENBQUM7O1lBQ2YsT0FBTyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVhLDRCQUFpQixHQUEvQixVQUFnQyxJQUFVO1FBQ3RDLHVDQUF1QztRQUN2QyxJQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1RCxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BELE9BQU8sdUJBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUN4RTtRQUVELHFEQUFxRDtRQUNyRCxJQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLE9BQU8sVUFBVSxFQUFFO1lBQ2YsSUFBSSxVQUFVLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUIsRUFBRTtnQkFDbkQsSUFBTSxRQUFRLEdBQUcsVUFBcUIsQ0FBQztnQkFDdkMsSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUM3QixNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztpQkFDOUM7YUFDSjtZQUNELFVBQVUsR0FBRyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNqRDtRQUVELHdDQUF3QztRQUN4QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsd0RBQXdEO1FBQ3hELElBQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFFLElBQWdCLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUUxRyw0R0FBNEc7UUFDNUcsSUFBTSxxQkFBcUIsR0FBRyxxQkFBUyxDQUFDLFdBQVcsQ0FDL0MsSUFBSSxDQUFDLGFBQWEsRUFDbEIsK0JBQStCLEVBQy9CLGNBQU8sV0FBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxFQUF6RCxDQUF5RCxDQUNuRSxDQUFDO1FBRUYsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRTtZQUN6RCxJQUFNLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hELElBQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzVFLElBQU0sRUFBRSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckMsS0FBaUIsVUFBRSxFQUFGLFNBQUUsRUFBRixnQkFBRSxFQUFGLElBQUUsRUFBRTtnQkFBaEIsSUFBTSxFQUFFO2dCQUNULElBQUksRUFBRSxJQUFJLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLEVBQUU7b0JBQ3ZFLE9BQU8sb0JBQW9CLENBQUM7aUJBQy9CO2FBQ0o7U0FDSjtRQUVELHVEQUF1RDtRQUN2RCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNXLHlCQUFjLEdBQTVCLFVBQTZCLElBQUk7UUFFN0IsZ0dBQWdHO1FBQ2hHLDRGQUE0RjtRQUM1Riw4RkFBOEY7UUFDOUYsaUdBQWlHO1FBQ2pHLHlCQUF5QjtRQUN6QixJQUFJLGdCQUFnQixHQUFHLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMvRSxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssV0FBVztZQUFFLE9BQU8sZ0JBQWdCLENBQUM7UUFDckUsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRXpCLG9FQUFvRTtRQUNwRSxrRUFBa0U7UUFDbEUsbURBQW1EO1FBQ25ELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7WUFDckIsSUFBSSxHQUFHLHFCQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JDO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFM0Msb0dBQW9HO1FBQ3BHLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0RCxJQUFJLHNCQUFzQixHQUFHLGdCQUFnQixDQUFDO1FBQzlDLElBQUkscUJBQXFCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxLQUFLLE1BQU0sQ0FBQztRQUVoSCxnR0FBZ0c7UUFDaEcsOEhBQThIO1FBQzlILGtFQUFrRTtRQUNsRSxJQUFJLHNCQUFzQixJQUFJLENBQUMsaUJBQWlCLElBQUksaUNBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxxQkFBcUIsRUFBRTtZQUMxSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDeEIscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDL0QsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELHVHQUF1RztRQUN2Ryx5RkFBeUY7UUFDekYsV0FBVztRQUNYLElBQUksYUFBYSxHQUFHLHFCQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRS9DLDBHQUEwRztRQUMxRyw0R0FBNEc7UUFDNUcsNEdBQTRHO1FBQzVHLGNBQWM7UUFDZCxJQUFJLGFBQWEsSUFBSSxJQUFJLElBQUksYUFBYSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7WUFDdkQsaUVBQWlFO1lBQ2pFLElBQUksWUFBWSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFNUQsb0ZBQW9GO1lBQ3BGLHNGQUFzRjtZQUN0RiwyRUFBMkU7WUFDM0UsSUFBSSxZQUFZLEVBQUU7Z0JBQ2QsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2FBQzNCO1lBRUQsNEJBQTRCO1lBQzVCLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sWUFBWSxDQUFDO1NBQ3ZCO1FBRUQsc0NBQXNDO1FBQ3RDLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDVyxtQ0FBd0IsR0FBdEMsVUFBdUMsSUFBSTtRQUN2QyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNXLG9DQUF5QixHQUF2QyxVQUF3QyxJQUFJO1FBQ3hDLGtIQUFrSDtRQUNsSCxVQUFVO1FBQ1YsbUhBQW1IO1FBQ25ILDRHQUE0RztRQUM1RywyRkFBMkY7UUFDM0YsRUFBRTtRQUNGLHNIQUFzSDtRQUN0SCw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVFLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRWEsK0JBQW9CLEdBQWxDLFVBQW1DLElBQUk7UUFDbkMsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDcEYsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM5RixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2pHLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMvRSxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDVywrQkFBb0IsR0FBbEMsVUFBbUMsT0FBZ0I7UUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1lBQ2pDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3BELE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsSUFBSSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2xCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QixJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsRUFBRSw0Q0FBNEM7Z0JBQzlELFNBQVM7YUFDWjtZQUNELElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7Z0JBQzlCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDaEQsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNwQyxPQUFPLEtBQUssQ0FBQzthQUNoQjtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVhLHVCQUFZLEdBQTFCLFVBQTJCLE9BQU8sRUFBRSxhQUFhO1FBQzdDLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDdEIsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDdEQ7YUFBTSxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUU7WUFDOUQsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDMUQsWUFBWSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ3pDO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCx5RUFBeUU7SUFDM0QsdUJBQVksR0FBMUIsVUFBMkIsSUFBWSxFQUFFLEdBQVM7UUFBVCwrQkFBUztRQUM5QyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZCLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUc7WUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUMsQ0FBQyxDQUFDLEdBQUUsS0FBSyxDQUFDO1FBQzNDLE9BQU8sSUFBSSxDQUFDO0lBRWhCLENBQUM7SUF4b0RhLHNDQUEyQixHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUYsMkJBQWdCLEdBQUc7UUFDN0IsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVO1FBQzFCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU87UUFDL0IsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPO1FBQ3pCLE1BQU0sRUFBRSxPQUFPO0tBQ2xCLENBQUM7SUFDWSwyQkFBZ0IsR0FBRztRQUM3QixNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsZ0JBQWdCO0tBQ3BELENBQUM7SUFDWSw0QkFBaUIsR0FBRztRQUM5QixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87S0FDekQsQ0FBQztJQUNZLDRCQUFpQixHQUFHO1FBQzlCLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtLQUM5QixDQUFDO0lBRVksa0NBQXVCLEdBQUcsQ0FBQyxPQUFPLEVBQUcsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFOUcsb0JBQVMsR0FBRztRQUN0QixRQUFRLEVBQUUsVUFBVSxPQUFPO1lBQ3ZCLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxRQUFRLEVBQUUsSUFBSTtRQUNkLE9BQU8sRUFBRSxVQUFVLE9BQU87WUFDdEIsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssUUFBUTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUNoRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssT0FBTyxFQUFFO2dCQUMxQyxJQUFNLE1BQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsTUFBSSxJQUFJLE1BQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLHdCQUF3QjtnQkFDNUUsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztnQkFDaEMsSUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDLDRCQUE0QixHQUFHLE1BQUksQ0FBQyxJQUFJLEVBQUUsR0FBRSxJQUFJLENBQUMsQ0FBQztnQkFDckYsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQUUsT0FBTyxJQUFJLENBQUMsQ0FBRSxnREFBZ0Q7Z0JBRTVHLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ25DLElBQUssS0FBSyxDQUFDLENBQUMsQ0FBc0IsQ0FBQyxPQUFPO3dCQUN0QyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMxQjtnQkFDRCxvRUFBb0U7Z0JBQ3BFLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtvQkFDbEIsSUFBSSxpQkFBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDO3dCQUNsQyxPQUFPLElBQUksQ0FBQztvQkFDaEIsT0FBTyxLQUFLLENBQUM7aUJBQ2hCO3FCQUFNO29CQUNILGdFQUFnRTtvQkFDaEUsSUFBSSxpQkFBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO3dCQUNuQyxPQUFPLElBQUksQ0FBQztvQkFDaEIsT0FBTyxLQUFLLENBQUM7aUJBQ2hCO2FBQ0o7O2dCQUNHLE9BQU8sSUFBSSxDQUFDO1FBQ3BCLENBQUM7UUFDRCxRQUFRLEVBQUUsVUFBVSxPQUFPO1lBQ3ZCLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxVQUFVLEVBQUUsVUFBVSxPQUFPO1lBQ3pCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDaEcsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUNEOztZQUVJO1FBQ0osR0FBRyxFQUFFLFVBQVUsT0FBTztZQUNsQix1QkFBdUI7WUFDdkIsT0FBTyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxNQUFNLEVBQUUsVUFBVSxPQUFPO1lBQ3JCLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsT0FBTyxFQUFFLFVBQVUsT0FBTztZQUN0QixPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELE9BQU8sRUFBRSxVQUFVLE9BQU87WUFDdEIsT0FBTyxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxTQUFTLEVBQUUsVUFBVSxPQUFPO1lBQ3hCLHVFQUF1RTtZQUN2RSxPQUFPLE9BQU8sQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUzttQkFDbkYsaUJBQU8sQ0FBQyxRQUFRLENBQUMsa0JBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLFFBQUUsTUFBTSxDQUFDLGNBQUksSUFBSSxXQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVMsRUFBekMsQ0FBeUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZJLENBQUM7UUFDRCxTQUFTLEVBQUUsVUFBVSxPQUFPO1lBQ3hCLDJFQUEyRTtZQUMzRSxPQUFPLE9BQU8sQ0FBQyxRQUFRLElBQUksa0JBQUksT0FBTyxDQUFDLFFBQVEsUUFBRSxNQUFNLENBQUMsY0FBSSxJQUFJLFdBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUyxFQUF6QyxDQUF5QyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUM1SCxDQUFDO0tBQ0o7SUEyZ0JhLDJCQUFnQixHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQTBpQ3ZGLGlCQUFDO0NBQUE7QUE1b0RZLGdDQUFVOzs7Ozs7Ozs7Ozs7QUN2QnZCOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7OztBQUUvRSxpRkFBb0M7QUFDcEMsb0ZBQXNDO0FBQ3RDLDBGQUEwQztBQUcxQztJQUFBO0lBd05BLENBQUM7SUF0TmlCLHFCQUFXLEdBQXpCLFVBQTBCLFNBQVM7UUFDL0IsT0FBTyxDQUFDLENBQUMsbUJBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLG1CQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ1csNEJBQWtCLEdBQWhDLFVBQWlDLEtBQUs7UUFFbEMsSUFBSSw2QkFBNkIsSUFBSSxLQUFLLEVBQUU7WUFDeEMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDO1NBQzlDO1FBRUQsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBRTNCLElBQUksS0FBSyxJQUFJLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFFdkMsSUFBSSxPQUFPLEdBQUcsSUFBSSxFQUNkLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDbkIsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDakMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUNmLFdBQVcsR0FBRyxDQUFDLEVBQ2Ysd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO1lBRWpDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsY0FBYyxJQUFJLENBQUMsR0FBRyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBRXJELE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hELE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hELFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUM3QixXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFFN0IsSUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFO29CQUVuQixrRkFBa0Y7b0JBQ2xGLGNBQWMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO29CQUVqQyxtREFBbUQ7b0JBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsY0FBYyxJQUFJLENBQUMsR0FBRyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUU7d0JBQ3JELGNBQWMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7NEJBQ2pELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQ25DLHVCQUFVLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQztxQkFDOUQ7b0JBRUQsbURBQW1EO29CQUNuRCxpRkFBaUY7b0JBQ2pGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsY0FBYyxJQUFJLENBQUMsR0FBRyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUU7d0JBQ3JELGNBQWMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7NEJBQ2pELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDOzRCQUNsQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksdUJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDOUgsdUJBQVUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO3FCQUM5RDtpQkFFSjtxQkFBTTtvQkFFSCx3REFBd0Q7b0JBQ3hELElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTt3QkFDakIsRUFBRSx3QkFBd0IsQ0FBQztxQkFDOUI7b0JBQ0QsY0FBYyxHQUFHLHdCQUF3QixLQUFLLENBQUMsQ0FBQztpQkFDbkQ7YUFDSjtZQUVELElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBRWpCLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDckQsSUFBSSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO2dCQUV6QyxJQUFJLGdCQUFnQixHQUFHLENBQUMsRUFBRTtvQkFFdEIsd0NBQXdDO29CQUN4QyxjQUFjLEdBQUcsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO29CQUV0Qyx3REFBd0Q7b0JBQ3hELElBQUksQ0FBQyxjQUFjLEVBQUU7d0JBQ2pCLGNBQWMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztxQkFDeEU7aUJBQ0o7YUFDSjtZQUNELElBQUksQ0FBQyxjQUFjLElBQUksV0FBVyxLQUFLLENBQUMsRUFBRTtnQkFDdEMsb0VBQW9FO2dCQUNwRSxjQUFjLEdBQUcsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMzRTtTQUNKO1FBQ0QsS0FBSyxDQUFDLDJCQUEyQixHQUFHLGNBQWMsQ0FBQztRQUVuRCxPQUFPLGNBQWMsQ0FBQztJQUMxQixDQUFDO0lBRUQsc0VBQXNFO0lBQ3hELDBCQUFnQixHQUE5QixVQUErQixJQUFJO1FBQy9CLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDbEcsT0FBTyxJQUFJLENBQUM7UUFFaEIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELGtHQUFrRztJQUNwRix5QkFBZSxHQUE3QixVQUE4QixHQUFHO1FBQzdCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQztZQUMzRSxPQUFPLElBQUksQ0FBQztRQUVoQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPO1FBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixNQUFNLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELGdFQUFnRTtJQUNsRCwyQkFBaUIsR0FBL0IsVUFBZ0MsV0FBVztRQUV2QyxJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1FBRWhCLDhEQUE4RDtRQUM5RCwrRUFBK0U7UUFFL0UsNEZBQTRGO1FBQzVGLDZEQUE2RDtRQUM3RCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLDZCQUE2QjtZQUM3QixJQUFJLFFBQVEsQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTztnQkFBRSxTQUFTO1lBRTVGLE1BQU0sR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQscUVBQXFFO1FBQ3JFLElBQUksTUFBTTtZQUNOLE9BQU8sSUFBSSxDQUFDO1FBRWhCLGtFQUFrRTtRQUNsRSxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2QsS0FBSyxJQUFJLENBQUMsR0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sR0FBRyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUM7U0FDckY7UUFFRCxJQUFJLE1BQU07WUFDTixPQUFPLElBQUksQ0FBQztRQUVoQixvREFBb0Q7UUFDcEQsc0ZBQXNGO1FBQ3RGLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDNUMsNkJBQTZCO1lBQzdCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPO2dCQUFFLFNBQVM7WUFFMUYsK0RBQStEO1lBQy9ELE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO2dCQUNuQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUMxQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDOUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDO1NBQ3ZEO1FBRUQsSUFBSSxNQUFNO1lBQ04sT0FBTyxJQUFJLENBQUM7UUFFaEIsNEdBQTRHO1FBQzVHLDZGQUE2RjtRQUM3RixNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2QsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsaUVBQWlFO1lBQ2pFLEtBQUssSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDckMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO29CQUFFLFNBQVM7Z0JBQy9DLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUM7d0JBQ2pGLE1BQU0sR0FBRyxLQUFLLENBQUM7O3dCQUVmLHVCQUFVLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7aUJBQ3ZHO3FCQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUMvRyx1QkFBVSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDbkY7U0FDSjtRQUVELElBQUksTUFBTSxFQUFFLEVBQUUsd0VBQXdFO1lBQ2xGLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxnQkFBTSxJQUFJLFlBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQXRCLENBQXNCLENBQUM7Z0JBQ3JFLE9BQU8sSUFBSSxDQUFDO1NBQ25CO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVhLHVCQUFhLEdBQTNCLFVBQTRCLFNBQVM7UUFDakMsT0FBTyxtQkFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLElBQUksbUJBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFTDs7O01BR0U7SUFDWSwyQkFBaUIsR0FBL0IsVUFBZ0Msa0JBQXlDO1FBQ3JFLElBQUksQ0FBQyxrQkFBa0I7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVyQyxPQUFPLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFJLElBQUksUUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQWpELENBQWlELENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBQ0QsZ0JBQUM7QUFBRCxDQUFDO0FBeE5ZLDhCQUFTOzs7Ozs7Ozs7Ozs7QUNyQnRCOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSx1RkFBd0M7QUFDeEMsMkZBQStDO0FBQy9DLGlHQUFtRDtBQUNuRCxpR0FBbUQ7QUFDbkQsb0ZBQXNDO0FBQ3RDLGlGQUFvQztBQUNwQyxnR0FBOEM7QUFFOUM7SUFBQTtJQStaQSxDQUFDO0lBallHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F3Qkc7SUFDWSxxQkFBYSxHQUEzQixVQUE0QixNQUFZO1FBRXJDLG9FQUFvRTtRQUNwRSxrRUFBa0U7UUFDbEUscURBQXFEO1FBQ3JELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7WUFDdkIsTUFBTSxHQUFHLHFCQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxJQUFJLEdBQUcsTUFBaUIsQ0FBQztRQUU3QiwyRUFBMkU7UUFDM0UsMkNBQTJDO1FBQzNDLDJFQUEyRTtRQUMzRSxvQ0FBb0M7UUFDcEMsMENBQTBDO1FBQzFDLDBDQUEwQztRQUMxQyxrREFBa0Q7UUFDbEQsMkNBQTJDO1FBQzNDLDJDQUEyQztRQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxvRUFBb0U7UUFDcEUsNkVBQTZFO1FBQzdFLG1FQUFtRTtRQUNuRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksU0FBUyxDQUFDO1FBQ2QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUUzQywyRkFBMkY7UUFDM0Ysa0lBQWtJO1FBQ2xJLHVGQUF1RjtRQUN2Riw0REFBNEQ7UUFDNUQscUhBQXFIO1FBQ3JILHdEQUF3RDtRQUN4RCx1SEFBdUg7UUFDdkgsd0RBQXdEO1FBQ3hELDRIQUE0SDtRQUM1SCxJQUFJLE9BQU8sQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLHVCQUF1QixJQUFJLFNBQVMsSUFBSSxPQUFPLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ25KLGNBQWM7WUFDZCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELElBQUksUUFBUSxHQUFHLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyRSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEIsT0FBTyxRQUFRLENBQUM7U0FDbkI7UUFDRCw4RkFBOEY7UUFDOUYsMEZBQTBGO1FBQzFGLHNDQUFzQztRQUN0QyxRQUFRLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTdELHlGQUF5RjtRQUN6RixrR0FBa0c7UUFDbEcseUhBQXlIO1FBQ3pILDRIQUE0SDtRQUM1SCxxQ0FBcUM7UUFDckMsNkJBQTZCO1FBQzdCLGlHQUFpRztRQUNqRyx5REFBeUQ7UUFDekQsNEZBQTRGO1FBQzVGLHlEQUF5RDtRQUN6RCxnR0FBZ0c7UUFDaEcsMENBQTBDO1FBQzFDLHNIQUFzSDtRQUN0SCxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLGtCQUFrQixLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3hJLGtHQUFrRztZQUNsRyw4Q0FBOEM7WUFDOUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRTtnQkFDaEMsZ0ZBQWdGO2dCQUNoRixTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzNFO1lBQ0QsaUZBQWlGO1lBQ2pGLGtFQUFrRTtpQkFDN0Q7Z0JBQ0QsT0FBTyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDM0Q7WUFFRCx1REFBdUQ7WUFDdkQsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRCxJQUFJLG9CQUFvQixHQUFHLFFBQVEsQ0FBQztZQUNwQyxpSEFBaUg7WUFDakgsNEdBQTRHO1lBQzVHLDJIQUEySDtZQUMzSCx3SEFBd0g7WUFDeEgsb0VBQW9FO1lBQ3BFLElBQUksY0FBYyxHQUFHLE9BQVEsSUFBWSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFFLElBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUM5Riw4SEFBOEg7WUFDOUgsNkVBQTZFO1lBQzdFLElBQUksQ0FBQyxTQUFTO2dCQUNWLENBQUMsY0FBYyxJQUFJLHdDQUF3QztnQkFDM0QsQ0FBQyxlQUFlLEtBQUssSUFBSSxJQUFJLGVBQWUsS0FBSyxTQUFTLENBQUM7Z0JBQzNELENBQUMsb0JBQW9CLENBQUMsdUNBQXVDO2NBQy9EO2dCQUNFLE9BQU8scUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzNEO1lBRUQsb0VBQW9FO1lBQ3BFLGlDQUFpQztZQUNqQyxzQ0FBc0M7WUFDdEMseUZBQXlGO1lBQ3pGLG1HQUFtRztZQUNuRyx1RkFBdUY7WUFDdkYsMENBQTBDO1lBQzFDLDRDQUE0QztZQUM1Qyx5REFBeUQ7WUFDekQsOEZBQThGO1lBQzlGLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEtBQUssTUFBTTtnQkFDekUsQ0FBQyxDQUFDLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSx5QkFBeUIsRUFBRSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDdkgsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEtBQUssT0FBTyxJQUFLLENBQUMsY0FBYyxJQUFJLGVBQWUsSUFBSSxJQUFJLElBQUksb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzlILG9HQUFvRztnQkFDcEcsa0ZBQWtGO2dCQUNsRixrR0FBa0c7Z0JBQ2xHLCtHQUErRztnQkFDL0csdUNBQXVDO2dCQUN2QyxPQUFPLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUM1RDtZQUVELGtIQUFrSDtZQUNsSCxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQy9CLE9BQU8scUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzVEO1lBRUQsNEJBQTRCO1lBQzVCLG9HQUFvRztZQUNwRyxJQUFJLDJCQUFZLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25ELE9BQU8scUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzVEO1NBQ0o7UUFFRCx1R0FBdUc7UUFDdkcsNEdBQTRHO1FBQzVHLFdBQVc7UUFDWCxJQUFJLGFBQWEsR0FBRyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQywwR0FBMEc7UUFDMUcsNEdBQTRHO1FBQzVHLDJHQUEyRztRQUMzRyxjQUFjO1FBQ2QsSUFBSSxhQUFhLElBQUksSUFBSSxJQUFJLGFBQWEsQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFO1lBQ3ZELG9HQUFvRztZQUNwRywrR0FBK0c7WUFDL0csd0hBQXdIO1lBQ3hILHNIQUFzSDtZQUN0SCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxhQUF3QixFQUFFLHlCQUF5QixFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTlFLGlFQUFpRTtZQUNqRSxJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRXZELHFGQUFxRjtZQUNyRix3Q0FBd0M7WUFDeEMsc0JBQXNCO1lBQ3RCLHdEQUF3RDtZQUN4RCxJQUFJO1lBRUosNEJBQTRCO1lBQzVCLE9BQU8scUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsZ0NBQWdDO1FBQ2hDLE9BQU8scUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQkc7SUFDVyw0QkFBb0IsR0FBbEMsVUFBbUMsSUFBVTtRQUN6QyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRS9DLElBQUksSUFBSSxHQUFHLElBQW1CLENBQUM7UUFDL0IsOEZBQThGO1FBQzlGLDBGQUEwRjtRQUMxRixzQ0FBc0M7UUFDdEMsSUFBTSxNQUFNLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHlCQUF5QixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlFLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN0QixtREFBbUQ7WUFDbkQsSUFBTSxXQUFXLEdBQUcsaUJBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFHLFVBQVUsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUssV0FBVyxDQUFDLE1BQU0sQ0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUcsdUJBQXVCLENBQUM7bUJBQ3hJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRztnQkFDMUUscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHlCQUF5QixFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxPQUFPLElBQUksQ0FBQzthQUNmO1lBRUQsdUdBQXVHO1lBQ3ZHLDRHQUE0RztZQUM1RyxXQUFXO1lBQ1gsSUFBSSxhQUFhLEdBQUcscUJBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLGFBQWE7Z0JBQ2QsT0FBTyxLQUFLLENBQUM7WUFFakIsNEJBQTRCO1lBQzVCLElBQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4RCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUseUJBQXlCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekQsT0FBTyxHQUFHLENBQUM7U0FDZDtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDVyx1QkFBZSxHQUE3QixVQUE4QixJQUFhO1FBQ3ZDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFeEIsSUFBTSxHQUFHLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksR0FBRyxLQUFLLFNBQVM7WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUVsQyxJQUFNLEtBQUssR0FBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1IscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3pELE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsSUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN4RSxJQUFJLGtCQUFrQixLQUFLLFFBQVEsRUFBRTtZQUNqQyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekQsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsc0JBQXNCO1FBQ3RCLElBQUksT0FBTyxLQUFLLFFBQVEsRUFBRTtZQUN0QixxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekQsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7T0FHRztJQUNXLDBCQUFrQixHQUFoQyxVQUFpQyxJQUFpQjtRQUM5QyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFdEMsSUFBTSxHQUFHLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFHLG1CQUFtQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksR0FBRyxLQUFLLFNBQVM7WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUVsQyxJQUFNLE1BQU0sR0FBZSxJQUFJLHFCQUFTLEVBQUUsQ0FBQztRQUMzQyxJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuSSxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7OztPQUdHO0lBQ1csMEJBQWtCLEdBQWhDLFVBQWlDLElBQWE7UUFDMUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN4QixJQUFNLEdBQUcsR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEUsSUFBSSxHQUFHLEtBQUssU0FBUztZQUFFLE9BQU8sR0FBRyxDQUFDO1FBRWxDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssTUFBTSxFQUFFO1lBQzdFLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN2RCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsSUFBSSxRQUFRLEdBQUcsaUJBQU8sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzdFLElBQUksUUFBUSxFQUFFO1lBQ1YscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3ZELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNXLDRCQUFvQixHQUFsQyxVQUFtQyxJQUFhO1FBQzVDLElBQU0sSUFBSSxHQUFHLG1CQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssY0FBYyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdEUsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNXLDJCQUFtQixHQUFqQyxVQUFrQyxJQUFpQjtRQUMvQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXhCLElBQU0sTUFBTSxHQUFHLGlCQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUxQixJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckQsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JELCtIQUErSDtRQUUvSCw2SUFBNkk7UUFDN0ksSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxNQUFNLENBQUM7WUFDakcsUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUV0Qiw0SUFBNEk7UUFDNUksSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxNQUFNLENBQUM7WUFDakcsUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUV0Qix1SkFBdUo7UUFDdkosSUFBSSxRQUFRLEtBQUssTUFBTSxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLE1BQU07WUFDcEUsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN4QixJQUFJLFFBQVEsS0FBSyxNQUFNLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssTUFBTTtZQUNwRSxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBRXhCLGlDQUFpQztRQUNqQyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxNQUFNLENBQUM7ZUFDckUsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLE1BQU0sQ0FBQztZQUMzRSxPQUFPLEtBQUssQ0FBQztRQUVqQixpSkFBaUo7UUFDakosSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7WUFDekcsT0FBTyxLQUFLLENBQUM7UUFFaEIsbUlBQW1JO1FBQ25JLElBQU0sU0FBUyxHQUFHLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0gsSUFBTSxTQUFTLEdBQUcsaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvSCxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEdBQUcsU0FBUztlQUNqRCxJQUFJLENBQUMsWUFBWSxHQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFFLFNBQVM7WUFDeEQsT0FBTyxLQUFLLENBQUM7UUFFakIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQTdaRCxvRkFBb0Y7SUFDcEYsMkRBQTJEO0lBQzNELGlHQUFpRztJQUNqRyx5REFBeUQ7SUFDekQsNEZBQTRGO0lBQzVGLHlEQUF5RDtJQUN6RCxnR0FBZ0c7SUFDaEcsMENBQTBDO0lBQzFDLG9IQUFvSDtJQUN0RywwQkFBa0IsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFOUQsaUhBQWlIO0lBQ2pILDZHQUE2RztJQUM3Ryw0Q0FBNEM7SUFDNUMsNERBQTREO0lBQzVELHFIQUFxSDtJQUNySCx3REFBd0Q7SUFDeEQsdUhBQXVIO0lBQ3ZILHdEQUF3RDtJQUN4RCwwRkFBMEY7SUFDMUYsK0tBQStLO0lBQy9LLHNIQUFzSDtJQUN0SCxzSEFBc0g7SUFDdEgsOEhBQThIO0lBQzlILG1JQUFtSTtJQUNuSSxrSUFBa0k7SUFDbEksaUVBQWlFO0lBQ25ELCtCQUF1QixHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7SUFtWW5JLGNBQUM7Q0FBQTtBQS9aWSwwQkFBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7VUNyQnBCO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7Ozs7Ozs7O0FDNUJBOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7OztBQUUvRSw2RkFBNkM7QUFBcEMsMEdBQU87QUFDaEIsNkNBQTZDO0FBQzdDLCtGQUE4QztBQUNyQyx5RkFEQSxpQkFBTyxRQUNBO0FBQ2hCLGtHQUFrRDtBQUF6QyxtSEFBVTtBQUNuQiwwRkFBNEM7QUFBbkMsdUdBQU07QUFDZiw2RkFBK0M7QUFBdEMsZ0hBQVM7QUFDbEIsa0hBQTJEO0FBQWxELHlIQUFZO0FBQ3JCLHNHQUFtRDtBQUExQyw2R0FBUTtBQUNqQixzR0FBbUQ7QUFBMUMsNkdBQVE7QUFFakIsU0FBZ0IsU0FBUyxDQUFDLE9BQWdCO0lBQ3RDLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLE9BQU8sR0FBRyxJQUFJLGlCQUFPLEVBQUUsQ0FBQztJQUM1QixVQUFVLENBQUM7UUFDUCxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxZQUFZLENBQUMsQ0FBQzthQUMzRSxJQUFJLENBQUMsVUFBUyxNQUFNO1lBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEIsSUFBTSxJQUFJLEdBQUc7Z0JBQ1QsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsV0FBVyxFQUFFLENBQUM7Z0JBQ2QsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLENBQUM7YUFDWjtZQUNELEtBQUssSUFBSSxHQUFHLEdBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRTtnQkFDOUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUU7b0JBQ3pDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNsQzthQUNKO1lBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBQyxDQUFDLEVBQUMsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUU7b0JBQzFCLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUMvQztnQkFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDbkMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzVDO2dCQUNELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3hELENBQUMsQ0FBQztZQUNGLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDcEIsS0FBcUIsVUFBYyxFQUFkLFdBQU0sQ0FBQyxPQUFPLEVBQWQsY0FBYyxFQUFkLElBQWMsRUFBRTtnQkFBaEMsSUFBTSxNQUFNO2dCQUNiLElBQUksUUFBUSxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUU7b0JBQzlCLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTt3QkFDbkIsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNuQixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ25CLFFBQVEsR0FBRyxJQUFJLENBQUM7cUJBQ25CO29CQUNELFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO29CQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7aUJBQ2pDO2dCQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLEVBQUU7b0JBQ2pDLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTt3QkFDbkIsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO3FCQUN0QjtvQkFDRCxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxRQUFRLEtBQUssRUFBRSxFQUFFO3dCQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUN6Qjt5QkFBTTt3QkFDSCxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUMzQjtpQkFDSjtnQkFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzdDO1lBQ0QsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoQixDQUFDO0FBeERELDhCQXdEQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFEZWZpbml0aW9ucy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvYXJpYS9BUklBTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFXYWxrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29tbW9uL0NvbW1vbk1hcHBlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29tbW9uL0NvbnRleHQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NvbW1vbi9FbmdpbmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NvbmZpZy9Db25maWcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9ET01NYXBwZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9ET01VdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9kb20vRE9NV2Fsa2VyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9hcGkvSUd1aWRlbGluZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvYXBpL0lSdWxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9jaGVja2VyL0NoZWNrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FfdGFyZ2V0X3dhcm5pbmcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FfdGV4dF9wdXJwb3NlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcHBsZXRfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmVhX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2FsbG93ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2NvbmZsaWN0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYmFubmVyX3NpbmdsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jaGlsZF90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jaGlsZF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50X2luX2xhbmRtYXJrLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50aW5mb19taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29udGVudGluZm9fc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Rlc2NlbmRhbnRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2dyYXBoaWNfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfaGlkZGVuX25vbnRhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2lkX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9pbWdfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbWFpbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbWFpbl9sYWJlbF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3BhcmVudF9yZXF1aXJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JlZ2lvbl9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yb2xlX2FsbG93ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcm9sZV9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9zZW1hbnRpY3MudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfd2lkZ2V0X2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hc2NpaWFydF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ibGlua19jc3NfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ibGlua19lbGVtX2RlcHJlY2F0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Jsb2NrcXVvdGVfY2l0ZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NhbnZhc19jb250ZW50X2Rlc2NyaWJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY2FwdGlvbl90cmFja19leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2Rlc2lnbl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9oYXNwb3B1cF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kZWJ1Z19wYXRocy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZGV0ZWN0b3JfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Rpcl9hdHRyaWJ1dGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Rvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9pZF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfbGFuZ192YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3RhYmJhYmxlX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VtYmVkX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Vtb3RpY29uc19hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lcnJvcl9tZXNzYWdlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZmllbGRzZXRfbGFiZWxfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZpZWxkc2V0X2xlZ2VuZF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZmlndXJlX2xhYmVsX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9mb250X2NvbG9yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX2ludGVyYWN0aW9uX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fc3VibWl0X2J1dHRvbl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fc3VibWl0X3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZnJhbWVfc3JjX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mcmFtZV90aXRsZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2hlYWRpbmdfY29udGVudF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2hlYWRpbmdfbWFya3VwX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaHRtbF9sYW5nX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaHRtbF9za2lwbmF2X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWFnZW1hcF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X2JhY2tncm91bmQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfZGVjb3JhdGl2ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfbnVsbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19pc21hcF9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19sb25nZGVzY19taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2luZGV4LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9hdXRvY29tcGxldGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfZmllbGRzX2dyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2hhc3BvcHVwX2NvbmZsaWN0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF9hZnRlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfYmVmb3JlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X29uY2hhbmdlX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGFiZWxfY29udGVudF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xhYmVsX25hbWVfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGFiZWxfcmVmX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9saXN0X2NoaWxkcmVuX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9saXN0X21hcmt1cF9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xpc3Rfc3RydWN0dXJlX3Byb3Blci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWFycXVlZV9lbGVtX2F2b2lkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hbHRfYnJpZWYudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2xpdmVfY2FwdGlvbmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV90cmFja19hdmFpbGFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21ldGFfcmVkaXJlY3Rfb3B0aW9uYWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21ldGFfcmVmcmVzaF9kZWxheS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWV0YV92aWV3cG9ydF96b29tYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbm9lbWJlZF9jb250ZW50X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvb2JqZWN0X3RleHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9wYWdlX3RpdGxlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvcGFnZV90aXRsZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfb25jbGlja19hdm9pZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X29uY2xpY2tfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfc2VsZWN0X3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2VsZWN0X29wdGlvbnNfZ3JvdXBlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2tpcF9tYWluX2Rlc2NyaWJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2tpcF9tYWluX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9jb2xvcl9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2ZvY3VzX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9ob3Zlcl9wZXJzaXN0ZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV92aWV3cG9ydF9yZXNpemFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N2Z19ncmFwaGljc19sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfYXJpYV9kZXNjZW5kYW50cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfY2FwdGlvbl9lbXB0eS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfY2FwdGlvbl9uZXN0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2hlYWRlcnNfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9oZWFkZXJzX3JlZl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfaGVhZGVyc19yZWxhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9sYXlvdXRfbGluZWFyaXplZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc2NvcGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX3N0cnVjdHVyZV9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX3N1bW1hcnlfcmVkdW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X2Jsb2NrX2hlYWRpbmcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfY29udHJhc3Rfc3VmZmljaWVudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9xdW90ZWRfY29ycmVjdGx5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3NlbnNvcnlfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3NwYWNpbmdfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfd2hpdGVzcGFjZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvd2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvd2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXNldHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUkNvbnRyb2xsZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUkN1cnNvci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSTmF2aWdhdG9yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvU1JSZW5kZXJlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSUmVuZGVyZXJSdWxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvU1JUYWJsZVV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUlV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUlZpZXdlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL3JlbmRlcl9ydWxlcy9jb21tb24udHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9yZW5kZXJfcnVsZXMvY29udGFpbmVyX2VudGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvcmVuZGVyX3J1bGVzL2NvbnRhaW50ZXJfZXhpdC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL3JlbmRlcl9ydWxlcy9pbmRleC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9BY2NOYW1lVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9BcmlhVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9DU1NVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NhY2hlVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9DbGlwUGF0aFV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvQ29sb3JVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NvbW1vblV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvVGFibGVVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL1Zpc1V0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2FjZS8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qZ2xvYmFsIE9wZW5BamF4Ki9cbi8vIGFsbCByZWZlcmVuY2VzIHRvIFdBSS1BUklBIHNwZWNpZmljYXRpb24gaXMgdGhlIFdBSS1BUklBIDEuMlxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMi9cblxuZXhwb3J0IHR5cGUgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCA9IHtcbiAgICBpbXBsaWNpdFJvbGU6IHN0cmluZ1tdLFxuICAgIHZhbGlkUm9sZXM6IHN0cmluZ1tdLFxuICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGJvb2xlYW4sXG4gICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM/OiBzdHJpbmdbXSwgXG4gICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM/OiBzdHJpbmdbXSxcbiAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlcz86IHN0cmluZ1tdLCAvL3JvbGVzLCBvdGhlciB0aGFuIGltcGxpY2l0IGFuZCB2YWxpZCByb2xlcywgd2hvc2UgYXR0cmlidXRlcyBhcmUgYWxzbyBhbGxvd2VkXG4gICAgLy8gYSBmZXcgZWxlbWVudHMgKHN1Y2ggYXMgZGF0YWxpc3QsIGh0bWwsIGNhcHRpb24pIHRoYXQgaGF2ZSBhbiBpbXBsaWNpdCByb2xlIGJ1dCBkaXNhbGxvdyBzb21lIG9yIGFsbCBhdHRyaWJ1dGVzIGFsbG93ZWQgZm9yIHRoZSByb2xlLlxuICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU/OiBib29sZWFuLFxuICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZT86IHN0cmluZ1tdICAvL3NvbWUgZWxlbWVudHMgKHZhcixhYmJyIGV0Yy4pIGhhdmUgbm8gaW1wbGljaXQgcm9sZSBidXQgbmFtaW5nIHByb2hpYml0ZWQgICBcbn1cblxuZXhwb3J0IGNsYXNzIEFSSUFEZWZpbml0aW9ucyB7XG4gICAgc3RhdGljIG5hbWVGcm9tQ29udGVudChyb2xlOiBzdHJpbmcpIDogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAocm9sZSBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpIFxuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tIFxuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tLmluY2x1ZGVzKFwiY29udGVudHNcIik7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBhcnJheSBvZiBXQUktQVJJQSBnbG9iYWwgc3RhdGVzIGFuZCBwcm9wZXJ0aWVzXG4gICAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4yLyNnbG9iYWxfc3RhdGVzXG4gICAgICovXG4gICAgc3RhdGljIGdsb2JhbFByb3BlcnRpZXMgOiBzdHJpbmdbXSA9IFtcImFyaWEtYXRvbWljXCIsIFwiYXJpYS1idXN5XCIsIFwiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtY3VycmVudFwiLCBcImFyaWEtZGVzY3JpYmVkYnlcIiwgXG4gICAgICAgIFwiYXJpYS1kZXRhaWxzXCIsIFwiYXJpYS1mbG93dG9cIiwgXCJhcmlhLWhpZGRlblwiLCBcImFyaWEta2V5c2hvcnRjdXRzXCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiLCBcImFyaWEtbGl2ZVwiLCBcImFyaWEtb3duc1wiLCBcImFyaWEtcmVsZXZhbnRcIiwgXCJhcmlhLXJvbGVkZXNjcmlwdGlvblwiXG4gICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgYXJlIGRlcHJlY2F0ZWQgaW4gQVJJQSAxLjIsIHdpbGwgaW5kaWNhdGUgZGVwcmVjYXRpb24gaW4gaW5kaXZpZHVhbCByb2xlXG4gICAgICAgICwgJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXG4gICAgXTtcblxuICAgIC8vcHJvcGVydGllcyBjb250YWlucyBpZChzKSB0aGF0IHJlZmVyIHRvIG90aGVyIGVsZW1lbnQocylcbiAgICBzdGF0aWMgcmVmZXJlbmNlUHJvcGVydGllcyA6IHN0cmluZ1tdID0gW1wiYXJpYS1vd25zXCIsIFwiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtZGVzY3JpYmVkYnlcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIiwgXCJhcmlhLWZsb3d0b1wiLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXTtcblxuICAgIC8vIGRlcHJlY2F0ZWQgcm9sZXNcbiAgICBzdGF0aWMgZ2xvYmFsRGVwcmVjYXRlZFJvbGVzIDogc3RyaW5nW10gPSBbXG4gICAgICAgICdkaXJlY3RvcnknLCAnZG9jLWJpYmxpb2VudHJ5JywgJ2RvYy1lbmRub3RlJ1xuICAgIF07XG5cbiAgICAvLyB0aGUgZm9sbG93aW5nIGFyZSBkZXByZWNhdGVkIGluIEFSSUEgMS4xIGZvciBhbGwgdGhlIHJvbGVzXG4gICAgc3RhdGljIGdsb2JhbERlcHJlY2F0ZWRQcm9wZXJ0aWVzIDogc3RyaW5nW10gPSBbXG4gICAgICAgICdhcmlhLWdyYWJiZWQnLCAnYXJpYS1kcm9wZWZmZWN0J1xuICAgIF07XG4gICAgXG4gICAgLypcbiAgICAgKiBYU0QgZGF0YSB0eXBlcyBmb3IgYWxsIFdBSS1BUklBIHByb3BlcnRpZXNcbiAgICAgKiBhbG9uZyB3aXRoIHZhbGlkIHZhbHVlcyB3aGVuIHRoZSBkYXRhIHR5cGUgaXMgTk1UT0tFTlxuICAgICAqIFdBSS1BUklBIHByb3BlcnRpZXMgZGF0YSB0eXBlcyBleHBsYW5lZDpcbiAgICAgKiAgdHlwZTogVXNlZCB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiB2YWx1ZXMgYWxsb3dlZCBmb3IgdGhlIFdBSS1BUklBIHByb3BlcnR5XG4gICAgICogIHZhbHVlczogVXNlZCB0byBpZGVudGlmeSBzcGVjaWZpYyB2YWx1ZXMgb2YgYW4gV0FJLUFSSUEgcHJvcGVydHkgd2hlbiB0eXBlIGlzIG5tdG9rZW5cbiAgICAgKiAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IFVzZWQgdG8gaWRlbnRpZnkgaWYgdGhlIFdBSS1BUklBIHByb3BlcnR5IHN1cHBvcnRzIHJlZmVyZW5jaW5nIGhpZGRlbiBJRFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlOiByZWZlcnMgdG8gV0FJLUFSSUEgcHJvcGVydHkgc3VwcG9ydHMgaGlkZGVuIElEIHJlZmVyZW5jZXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U6IHJlZmVycyB0byBXQUktQVJJQSBwcm9wZXJ0eSBkb2VzIG5vdCBzdXBwb3J0IGhpZGRlbiBJRCByZWZlcmVuY2VzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlIHdpbGwgYmUgc2V0IHRvIGZhbHNlLCBpZiBub3Qgc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIHN0YXRpYyBwcm9wZXJ0eURhdGFUeXBlcyA6IHsgXG4gICAgICAgIFtwcm9wOiBzdHJpbmddIDogeyBcbiAgICAgICAgICAgIHR5cGU6IHN0cmluZywgXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZD86IGJvb2xlYW4sXG4gICAgICAgICAgICB2YWx1ZXM/OiBzdHJpbmdbXSBcbiAgICAgICAgfVxuICAgIH0gPSB7XG4gICAgICAgIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1hdG9taWNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWF1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiaW5saW5lXCIsIFwibGlzdFwiLCBcImJvdGhcIiwgXCJub25lXCIsIFwidW5kZWZpbmVkXCJdIC8vYWRkIHVuZGVmaW5lZCB0byBoYW5kbGUgdmFsdWUgZW1wdHlcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWJ1c3lcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcIm1peGVkXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jb2xjb3VudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jb2xpbmRleFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jb2xzcGFuXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbnRyb2xzXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY3VycmVudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wicGFnZVwiLCBcInN0ZXBcIiwgXCJsb2NhdGlvblwiLCBcImRhdGVcIiwgXCJ0aW1lXCIsIFwidHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdIC8vYWRkIHVuZGVmaW5lZCBmb3IgZW1wdHkgdmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGV0YWlsc1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kaXNhYmxlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZHJvcGVmZmVjdFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5zXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImNvcHlcIiwgXCJtb3ZlXCIsIFwibGlua1wiLCBcImV4ZWN1dGVcIiwgXCJwb3B1cFwiLCBcIm5vbmVcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWVycm9ybWVzc2FnZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZmxvd3RvXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWdyYWJiZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcIm1lbnVcIiwgXCJsaXN0Ym94XCIsIFwidHJlZVwiLCBcImdyaWRcIiwgXCJkaWFsb2dcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1pbnZhbGlkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJzcGVsbGluZ1wiLCBcImdyYW1tYXJcIiwgXCJ1bmRlZmluZWRcIl0gLy9hZGQgdW5kZWZpbmVkIGZvciBlbXB0eSB2YWx1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEta2V5c2hvcnRjdXRzXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxhYmVsbGVkYnlcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1sZXZlbFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1saXZlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJvZmZcIiwgXCJwb2xpdGVcIiwgXCJhc3NlcnRpdmVcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW1vZGFsXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tdWx0aWxpbmVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImhvcml6b250YWxcIiwgXCJ2ZXJ0aWNhbFwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtb3duc1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXBvc2luc2V0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXByZXNzZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcIm1peGVkXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZWFkb25seVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVsZXZhbnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2Vuc1wiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJhZGRpdGlvbnNcIiwgXCJyZW1vdmFsc1wiLCBcInRleHRcIiwgXCJhbGxcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb2xlZGVzY3JpcHRpb25cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93Y291bnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93aW5kZXhcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93c3BhblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1zZXRzaXplXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXNvcnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImFzY2VuZGluZ1wiLCBcImRlc2NlbmRpbmdcIiwgXCJvdGhlclwiLCBcIm5vbmVcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWVub3dcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVldGV4dFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGRlc2lnbiBwYXR0ZXJucyBmb3IgY29uY3JldGUgV0FJLUFSSUEgcm9sZXNcbiAgICAgKiBsZWdpdGltYXRlIGtleXMgZm9yIGVhY2ggcm9sZSBpbmNsdWRlOlxuICAgICAqXG4gICAgICogLSBjb250YWluZXI6IGFwcHJvcHJpYXRlIGNvbnRhaW5lcihzKSBmb3IgdGhhdCByb2xlXG4gICAgICogLSBwcm9wczogc3RhdGVzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvbGUgKGluIGFkZGl0aW9uIHRvIHRoZSBnbG9iYWwgc3RhdGVzIGFuZCBwcm9wZXJ0aWVzIGxpc3RlZCBhYm92ZSlcbiAgICAgKiAtIHJlcVByb3BzOiByZXF1aXJlZCBzdGF0ZXMgb3IgcHJvcGVydGllcyBmb3IgdGhpcyByb2xlXG4gICAgICogLSByZXFDaGlsZHJlbjogcmVxdWlyZWQgY2hpbGRyZW4gZm9yIHRoaXMgcm9sZVxuICAgICAqIC0gaHRtbEVxdWl2OiBIVE1MIGVxdWl2YWxlbnQgZm9yIHRoaXMgcm9sZVxuICAgICAqIC0gcm9sZVR5cGU6IG9uZSBvZiB3aWRnZXQsIHN0cnVjdHVyZSwgbGFuZG1hcmssIGxpdmVSZWdpb24sIHdpbmRvdyAoYXMgc2VlbiBpbiBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4yLyNyb2xlc19jYXRlZ29yaXphdGlvbilcbiAgICAgKiAtIG5hbWVSZXF1aXJlZDogZGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGFjY2Vzc2libGUgbmFtZSBpcyByZXF1aXJlZCBmb3IgYSB3aWRnZXQgKHNlZSBBUklBIHNwZWMuKVxuICAgICAqIC0gbmFtZUZyb206IGRldGVybWluZXMgaG93IGFuIGFjY2Vzc2libGUgbmFtZSBpcyBzdXBwbGllZCAoYXV0aG9yIG9yIGNvbnRlbnQgLSBzZWUgQVJJQSBzcGVjLilcbiAgICAgKiAtIGRlcHJlY2F0ZWQ6IGlmIHByZXNlbnQsIGluZGljYXRlcyB0aGF0IHRoZSByb2xlIGlzIGRlcHJlY2F0ZWQsIGFuZCBwcm92aWRlcyBhIGxpc3Qgb2YgYWx0ZXJuYXRpdmUgcm9sZShzKVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNpZ25QYXR0ZXJucyA6IHtcbiAgICAgICAgW3JvbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogc3RyaW5nW10sXG4gICAgICAgICAgICBwcm9wczogc3RyaW5nW10sXG4gICAgICAgICAgICByZXFQcm9wczogc3RyaW5nW10sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogc3RyaW5nW10sXG4gICAgICAgICAgICBodG1sRXF1aXY6IHN0cmluZyxcbiAgICAgICAgICAgIHJvbGVUeXBlPzogc3RyaW5nLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIG5hbWVGcm9tPzogc3RyaW5nW10sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuPzogYm9vbGVhbixcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ/OiBib29sZWFuLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzPzogc3RyaW5nW11cbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wcz86IHN0cmluZ1tdXG4gICAgICAgIH1cbiAgICB9ID0ge1xuICAgICAgICBcImFsZXJ0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImFsZXJ0ZGlhbG9nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW1vZGFsXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpbmRvd1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYXBwbGljYXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtZXhwYW5kZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIGNhbiBiZSBcIndpZGdldFwiXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYXJ0aWNsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYmFubmVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJsb2NrcXVvdGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJ1dHRvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcHJlc3NlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYnV0dG9uIHwgaW5wdXRbQHR5cGU9J2J1dHRvbiddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZmlndXJlXCIsIFwiZ3JpZFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNlbGxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjaGVja2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSdjaGVja2JveCddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29kZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbHVtbmhlYWRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInJvd1wiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGluZGV4XCIsIFwiYXJpYS1jb2xzcGFuXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiLCBcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLXNvcnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRoW0BzY29wZT0nY29sJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29tYm9ib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29udHJvbHNcIiwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIl0sIC8vIGFyaWEtY29udHJvbHMgaXNuJ3QgYWN0dWFsbHkgcmVxdWlyZWQgd2hlbiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29tcGxlbWVudGFyeVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb21tZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb250ZW50aW5mb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkZWZpbml0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZGVsZXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkaWFsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbW9kYWxcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2luZG93XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGlyZWN0b3J5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddICBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiZG9jLWFic3RyYWN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1hY2tub3dsZWRnbWVudHNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWFmdGVyd29yZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYXBwZW5kaXhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJhY2tsaW5rXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9lbnRyeVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYmlibGlvZ3JhcGh5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9yZWZcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNoYXB0ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNvbG9waG9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNvbmNsdXNpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNvdmVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbWdcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNyZWRpdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY3JlZGl0c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZGVkaWNhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZW5kbm90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVuZG5vdGVzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVwaWdyYXBoXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lcGlsb2d1ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZXJyYXRhXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1leGFtcGxlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1mb290bm90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZm9yZXdvcmRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWdsb3NzYXJ5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1nbG9zc3JlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtaW5kZXhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWludHJvZHVjdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2Mtbm90ZXJlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2Mtbm90aWNlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWJyZWFrXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCJdLCAvLyBhcmlhLWRpc2FibGVkLCBhcmlhLXZhbHVlbWF4LCBhcmlhLXZhbHVlbWluLCBhcmlhLXZhbHVldGV4dCBhcmUgdmFsaWQgaWYgZm9jdXNhYmxlLiBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIGNvZGUuXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCwgLy8gYXJpYS12YWx1ZW5vdyBpcyByZXF1aXJlZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIHdpZGdldCBpZiBmb2N1c2FibGVcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWxpc3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXBhZ2Vmb290ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlaGVhZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFydFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHJlZmFjZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHJvbG9ndWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXB1bGxxdW90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXFuYVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2Mtc3VidGl0bGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXRpcFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXRvY1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2N1bWVudFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImVtcGhhc2lzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZmVlZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImFydGljbGVcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZmlndXJlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmb3JtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJmb3JtXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ2VuZXJpY1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiZGl2IHwgc3BhblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiLCBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImdyYXBoaWNzLWRvY3VtZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZ3JhcGhpY3Mtb2JqZWN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImdyYXBoaWNzLXN5bWJvbFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJncmlkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWNvbGNvdW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCJdLCAvLyByb3dncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGFibGVcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImdyaWRjZWxsXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1lcnJvcm1lc3NhZ2VcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiLCBcImFyaWEtaW52YWxpZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiLCBcImFyaWEtc2VsZWN0ZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ3JvdXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImhlYWRpbmdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1sZXZlbFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImgxIHwgaDIgfCBoMyB8IGg0IHwgaDUgfCBoNlwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaW1nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbWdcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImltZ1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJpbnNlcnRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaW5rXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaXN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wibGlzdGl0ZW1cIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwib2wgfCB1bFwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpc3Rib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwib3B0aW9uXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibGlzdGl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJsaXN0XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbGV2ZWxcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJsaVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxvZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1haW5cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWFya1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibWFya1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtYXJxdWVlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1hdGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogZmFsc2UsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWJhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLCBcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1lbnVpdGVtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JvdXBcIiwgXCJtZW51XCIsIFwibWVudWJhclwiXSwgLy8gZ3JvdXAgb25seSBjb3VudHMgYXMgYSB2YWxpZCBjb250YWluZXIgaWYgaXQgaXMgY29udGFpbmVkIGluIGEgbWVudSBvciBtZW51YmFyXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcIm1lbnVpdGVtY2hlY2tib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1lbnVpdGVtcmFkaW9cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1ldGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibmF2aWdhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJub25lXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm5vdGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiXSwgLy8gZ3JvdXAgb25seSBjb3VudHMgYXMgYSB2YWxpZCBjb250YWluZXIgaWYgaXQgaXMgY29udGFpbmVkIGluIGEgbGlzdGJveFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLWNoZWNrZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsIC8vIFwiYXJpYS1zZWxlY3RlZFwiIGhhcyBhIGRlZmF1bHRcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcIm9wdGlvblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwYXJhZ3JhcGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwcmVzZW50YXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicHJvZ3Jlc3NiYXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmFkaW9cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jaGVja2VkXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW5wdXRbQHR5cGU9J3JhZGlvJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmFkaW9ncm91cFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicmFkaW9cIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJlZ2lvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyb3dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncmlkXCIsIFwicm93Z3JvdXBcIiwgXCJ0YWJsZVwiLCBcInRyZWVncmlkXCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImNlbGxcIiwgXCJjb2x1bW5oZWFkZXJcIiwgXCJncmlkY2VsbFwiLCBcInJvd2hlYWRlclwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0clwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJvd2dyb3VwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JpZFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogW10sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGJvZHkgfCB0Zm9vdCB8IHRoZWFkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicm93aGVhZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1yb3dzcGFuXCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc29ydFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGhbQHNjb3BlPSdyb3cnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcblxuICAgICAgICBcInNjcm9sbGJhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZWFyY2hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2VhcmNoYm94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtbXVsdGlsaW5lXCIsIFwiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0nc2VhcmNoJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2VwYXJhdG9yXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCJdLCAvLyBhcmlhLWRpc2FibGVkLCBhcmlhLXZhbHVlbWF4LCBhcmlhLXZhbHVlbWluLCBhcmlhLXZhbHVldGV4dCBhcmUgdmFsaWQgaWYgZm9jdXNhYmxlLiBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIGNvZGUuXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCwgLy8gYXJpYS12YWx1ZW5vdyBpcyByZXF1aXJlZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIHdpZGdldCBpZiBmb2N1c2FibGVcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzbGlkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLXZhbHVlbm93XCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzcGluYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdGF0dXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdHJvbmdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdWJzY3JpcHRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdWdnZXN0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic3VwZXJzY3JpcHRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzd2l0Y2hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJ0YWJsaXN0XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xjb3VudFwiLCBcImFyaWEtcm93Y291bnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIiwgXCJyb3dncm91cFwiLCBcImNhcHRpb25cIl0sIC8vIHJvd2dyb3VwIGFuZCBjYXB0aW9uIGFyZSBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGFibGVcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGFibGlzdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1widGFiXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLCBcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYnBhbmVsXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0ZXJtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJkZm5cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGV4dGJveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1hdXRvY29tcGxldGVcIiwgXCJhcmlhLW11bHRpbGluZVwiLCBcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW5wdXRbQHR5cGU9J3RleHQnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0aW1lXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGltZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0b29sYmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidG9vbHRpcFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIC8vIEFSSUEgMS4yIGhhcyB0aGlzIGFzIG5hbWVSZXF1aXJlZDogdHJ1ZSwgYnV0IEFSSUEgMS4zIHJlbW92ZWQgaXQgYmVjYXVzZSBpdCBtYWtlcyBubyBzZW5zZSB0byByZXF1aXJlIGEgbmFtZSBvbiBhIHRvb2x0aXAuXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidHJlZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwidHJlZWl0ZW1cIl0sIC8vIGdyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1jb2xjb3VudFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCJdLCAvLyByb3dncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidHJlZWl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jaGVja2VkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtbGV2ZWxcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICB9IC8vIGVuZCBkZXNpZ25QYXR0ZXJuc1xuXG4gICAgLy8gY29waWVkIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLW90aGVyLmh0bWwjZGlzYWJsZWQtZWxlbWVudHNcbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbnB1dC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9BdHRyaWJ1dGVzL2Rpc2FibGVkXG4gICAgLyoqIG5vdGU6XG4gICAgICAqIGlmIGEgPGZpZWxkc2V0PiBpcyBkaXNhYmxlZCwgdGhlIGRlc2NlbmRhbnQgZm9ybSBjb250cm9scyBhcmUgYWxsIGRpc2FibGVkIGV4Y2VwdCA8bGVnZW5kPlxuICAgICAgKiBJZiBhbiA8b3B0Z3JvdXA+IGlzIGRpc2FibGVkLCB0aGUgc2VsZWN0IGlzIHN0aWxsIGludGVyYWN0aXZlICh1bmxlc3Mgb3RoZXJ3aXNlIGRpc2FibGVkKSwgYnV0IG5vbmUgb2YgdGhlIGl0ZW1zIGluIHRoZSBvcHRpb24gZ3JvdXAgYXJlIHNlbGVjdGFibGUuXG4gICAgICAqIFdoZW4gYW4gZWxlbWVudCBoYXMgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBhcHBsaWVkLCB0aGUgOmRpc2FibGVkIHBzZXVkby1jbGFzcyBhbHNvIGFwcGxpZXMgdG8gaXQuIFxuICAgICAqL1xuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWREaXNhYmxlZCA9IFtcImJ1dHRvblwiLCBcImlucHV0XCIsIFwic2VsZWN0XCIsIFwidGV4dGFyZWFcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImZpZWxkc2V0XCJdOyAvLyBhbHNvIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudFxuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWRSZXF1aXJlZCA9IFtcInNlbGVjdFwiLCBcInRleHRhcmVhXCJdOyAvLyByZW1vdmUgJ2lucHV0JyBhbmQgYWRkIHRvIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnQsIGJlY3Vhc2UgcmVxdWlyZWQgaXMgbm90IHN1cHBvcnRlZCBvbiBpbnB1dEB0eXBlPVwicmFuZ2VcIiwgXCJjb2xvclwiLCBcImhpZGRlblwiIG9yIGFueSBidXR0b24gdHlwZXNcbiAgICBzdGF0aWMgZWxlbWVudHNBbGxvd2VkUmVhZE9ubHkgPSBbXCJ0ZXh0YXJlYVwiXTsgLy8gcmVtb3ZlICdpbnB1dCcgYW5kIGFkZCB0byB0aGUgaW5kaXZpZHVhbCBlbGVtZW50LCBiZWNhdXNlIHJlYWRvbmx5IGlzIG5vdCBzdXBwb3J0ZWQgb24gaW5wdXRAdHlwZT1cImNoZWNrYm94XCIsIFwicmFkaW9cIiwgXCJyYW5nZVwiLCBcImNvbG9yXCIsIFwiZmlsZVwiLCBoaWRkZW5cIiBvciBhbnkgYnV0dG9uIHR5cGVzXG5cblxuICAgIC8qIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFyaWEvI2RvY2NvbmZvcm1hbmNlXG4gICAgICAgICogZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50IGNvbnRhaW5zIHByb3BlcnRpZXMgb2YgdGhlIHRhZ3MgcmVsYXRlZCB0byByb2xlIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgYXR0cmlidXRlIHZhbHVlXG4gICAgICAgICogZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3MgY29udGFpbnMgdGhvc2UgdGFncyB0aGF0IHJlcXVpcmUgc3BlY2lhbCBjb25zaWRlcmF0aW9uc1xuICAgICAgICAqL1xuICAgIHN0YXRpYyBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQ6IHtcbiAgICAgICAgW3JvbGU6IHN0cmluZ106IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICB9ID0ge1xuICAgICAgICBcImFiYnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFkZHJlc3NcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcnRpY2xlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJmZWVkXCIsIFwibWFpblwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXNpZGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21wbGVtZW50YXJ5XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWRlZGljYXRpb25cIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb290bm90ZVwiLCBcImRvYy1nbG9zc2FyeVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtdGlwXCIsIFwiZmVlZFwiLCBcIm5vbmVcIiwgXCJub3RlXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmVnaW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImF1ZGlvXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJhc2VcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmRpXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJiZG9cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJsb2NrcXVvdGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJibG9ja3F1b3RlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJvZHlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbJ2FyaWEtaGlkZGVuJ10sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLFwic2VwYXJhdG9yXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2FudmFzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydjYXB0aW9uJ10sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2l0ZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29kZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvZGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImNvbGdyb3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRhdGFsaXN0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdGJveFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkZWxldGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZXRhaWxzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRmblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRlcm1cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGlhbG9nXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZGlhbG9nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYWxlcnRkaWFsb2dcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgXCJkbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3RcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImR0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGVybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImxpc3RpdGVtXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImVtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJlbWJlZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWVsZHNldFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlnY2FwdGlvblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZm9ybVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImZvcm1cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImhlYWRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGdyb3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoMlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImgzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoNVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImg2XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaHJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzZXBhcmF0b3JcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtcGFnZWJyZWFrXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJodG1sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZG9jdW1lbnRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImlmcmFtZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJpbnNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbnNlcnRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwia2JkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJsYWJlbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxlZ2VuZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxpbmtcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWFpblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm1haW5cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm1hcFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXJrXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXRoXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibWF0aFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWVudVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm1ldGFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWV0ZXJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJtZXRlclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFsnYXJpYS12YWx1ZW1heCcsICdhcmlhLXZhbHVlbWluJ10sXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5hdlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm5hdmlnYXRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtaW5kZXhcIiwgXCJkb2MtcGFnZWxpc3RcIiwgXCJkb2MtdG9jXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJ0YWJsaXN0XCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJub3NjcmlwdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJvYmplY3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIiwgXCJkb2N1bWVudFwiLCBcImltZ1wiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJvbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9wdGdyb3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm9wdGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtc2VsZWN0ZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJvdXRwdXRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdGF0dXNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInBhcmFncmFwaFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJwYXJhbVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJwaWN0dXJlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlblwiXSBcbiAgICAgICAgfSxcbiAgICAgICAgXCJwcmVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInByb2dyZXNzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicHJvZ3Jlc3NiYXJcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXZhbHVlbWF4XCJdIFxuICAgICAgICB9LFxuICAgICAgICBcInFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInJwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJydFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwicnVieVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImRlbGV0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwic2FtcFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2NyaXB0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnc2VhcmNoJ10sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbJ3NlYXJjaCcsICdmb3JtJywgJ2dyb3VwJywgJ25vbmUnLCAncHJlc2VudGF0aW9uJywgJ3JlZ2lvbiddLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNsb3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic21hbGxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNvdXJjZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGFuXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdHJvbmdcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdHJvbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3R5bGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3ViXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3Vic2NyaXB0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN1cFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN1cGVyc2NyaXB0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN2Z1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyYXBoaWNzLWRvY3VtZW50XCJdLCAvLyBhcyBkZWZpbmVkIGJ5IFNWRyBBQU1cbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJsZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRhYmxlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRlbXBsYXRlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInRleHRhcmVhXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGZvb3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0aGVhZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRpbWVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0aW1lXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRpdGxlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInRyYWNrXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInVsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidmFyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ2aWRlb1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3YnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdXG4gICAgICAgIH1cbiAgICB9IC8vIGVuZCBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcblxuICAgIHN0YXRpYyBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnczoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXToge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXSA6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICAgICAgfSB8IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICB9ID0ge1xuICAgICAgICBcImFcIjoge1xuICAgICAgICAgICAgXCJ3aXRoLWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlua1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm9uLWVtcHR5IGhyZWYgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImRvYy1iYWNrbGlua1wiLCBcImRvYy1iaWJsaW9yZWZcIiwgXCJkb2MtZ2xvc3NyZWZcIiwgXCJkb2Mtbm90ZXJlZlwiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtZGlzYWJsZWQ9dHJ1ZVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2l0aG91dC1ocmVmXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGhyZWYgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmVhXCI6IHtcbiAgICAgICAgICAgIFwid2l0aC1ocmVmXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpbmtcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vbi1lbXB0eSBocmVmIGF0dHJpYnV0ZSBpcyBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gaHJlZiBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJsaW5rXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbi8vIFRPRE9cbi8vICAgICAgICBcImF1dG9ub21vdXMgY3VzdG9tIGVsZW1lbnRcIjoge1xuLy8gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIlJvbGUgZXhwb3NlZCBmcm9tIGF1dGhvciBkZWZpbmVkIEVsZW1lbnRJbnRlcm5hbHMuIE90aGVyd2lzZSBubyBjb3JyZXNwb25kaW5nIHJvbGUuXCJdLFxuLy8gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJJZiByb2xlIGRlZmluZWQgYnkgRWxlbWVudEludGVybmFsc1wiLCBcImFueSByb2xlXCIsIFwibm8gcm9sZSBPdGhlcndpc2VcIl0sXG4vLyAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbi8vICAgICAgICB9LFxuICAgICAgICBcImRpdlwiOiB7XG4gICAgICAgICAgICBcImNoaWxkLWRsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wicHJlc2VudGF0aW9uXCIsIFwibm9uZVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuby1jaGlsZC1kbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlndXJlXCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtZmlnY2FwdGlvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJmaWd1cmVcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogWydkb2MtZXhhbXBsZSddLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLWZpZ2NhcHRpb25cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZmlndXJlXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZm9vdGVyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXNlY3Rpb24tYXJ0aWNsZS1hc2lkZS1tYWluLW5hdlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWZvb3Rub3RlXCIsIFwiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbnRlbnRpbmZvXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBub3QgYSBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWZvb3Rub3RlXCIsIFwiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbi8vIFRPRE9cbi8vICAgICAgICBcImZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudFwiOiB7XG4vLyAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiUm9sZSBleHBvc2VkIGZyb20gYXV0aG9yIGRlZmluZWQgRWxlbWVudEludGVybmFscy4gT3RoZXJ3aXNlICdnZW5lcmljJy5cIl0sXG4vLyAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIklmIHJvbGUgZGVmaW5lZCBieSBFbGVtZW50SW50ZXJuYWxzXCIsIFwiZm9ybS1yZWxhdGVkIHJvbGVzOiBidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JvdXBcIiwgXCJsaXN0Ym94XCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJyYWRpb1wiLCBcInJhZGlvZ3JvdXBcIiwgXCJzZWFyY2hib3hcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCIsIFwic3dpdGNoXCIsIFwidGV4dGJveFwiLCBcIm5vIHJvbGUgT3RoZXJ3aXNlXCJdLFxuLy8gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4vLyAgICAgICAgfSxcblxuICAgICAgICBcImhlYWRlclwiOiB7XG4gICAgICAgICAgICBcImRlcy1zZWN0aW9uLWFydGljbGUtYXNpZGUtbWFpbi1uYXZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gZGVzY2VuZGFudCBvZiBhbiBhcnRpY2xlLCBhc2lkZSwgbWFpbiwgbmF2IG9yIHNlY3Rpb24gZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJiYW5uZXJcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vdCBhIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG4gICAgICAgIFwiaW1nXCI6IHtcbiAgICAgICAgICAgIFwiaW1nLXdpdGgtYWNjbmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbWdcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIndoZW4gYWNjZXNzaWJsZSBuYW1lIHByZXNlbnRzXCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYnV0dG9uXCIsIFwiY2hlY2tib3hcIiwgXCJkb2MtY292ZXJcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm1ldGVyXCIsIFwib3B0aW9uXCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJyYWRpb1wiLCBcInNjcm9sbGJhclwiLCBcInNlcGFyYXRvclwiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImltZy13aXRob3V0LWFjY25hbWUtZW1wdHktYWx0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInByZXNlbnRhdGlvblwiLCBcIm5vbmVcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIndoZW4gbm8gYWNjZXNzaWJsZSBuYW1lIHByZXNlbnRzIGFuZCBhbHQ9JydcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLCBcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW49dHJ1ZVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW1nLXdpdGhvdXQtYWNjbmFtZS1uby1hbHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaW1nXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCJ3aGVuIG5laXRoZXIgYWNjZXNzaWJsZSBuYW1lIG5vIGFsdCBwcmVzZW50c1wiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcInByZXNlbnRhdGlvblwiLCBcIm5vbmVcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsIFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlbj10cnVlXCJdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaW5wdXRcIjoge1xuICAgICAgICAgICAgXCJidXR0b25cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjaGVja2JveC13aXRoLWFyaWEtcHJlc3NlZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjaGVja2JveFwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggdHlwZT1jaGVja2JveCBhbmQgYXJpYS1wcmVzc2VkIGF0dHJpYnV0ZSBpcyBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudWl0ZW1jaGVja2JveFwiLCBcIm9wdGlvblwiLCBcInN3aXRjaFwiLCBcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNoZWNrYm94LXdpdGhvdXQtYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCB0eXBlPWNoZWNrYm94IGFuZCBhcmlhLXByZXNzZWQgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudWl0ZW1jaGVja2JveFwiLCBcIm9wdGlvblwiLCBcInN3aXRjaFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNvbG9yXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkYXRlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbWFpbC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIHR5cGU9ZW1haWwgYW5kIG5vIGxpc3QgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW1haWwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImhpZGRlblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1vbnRoXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJudW1iZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3BpbmJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInBhc3N3b3JkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInJhZGlvXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJhZGlvXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm1lbnVpdGVtcmFkaW9cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1jaGVja2VkXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJyYW5nZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzbGlkZXJcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVzZXRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWFyY2gtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzZWFyY2hib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlYXJjaC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzdWJtaXRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZWwtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZWwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY29tYm9ib3hcIiwgXCJzZWFyY2hib3hcIiwgXCJzcGluYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGFzcG9wdXBcIl0gIC8vIGNvdmVyZWQgaW4gYSBkaWZmZXJlbnQgcnVsZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidXJsLW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidXJsLXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndlZWtcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlZmF1bHQtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB3aXRoIGEgbWlzc2luZyBvciBpbnZhbGlkIHR5cGUsIHdpdGggYSBsaXN0IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZWZhdWx0LW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSwgd2l0aCBhIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImxpXCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtb2YtbGlzdC1yb2xlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnbGlzdGl0ZW0nXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLW9mLWxpc3Qtcm9sZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbJ2dlbmVyaWMnXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY3Rpb25cIjoge1xuICAgICAgICAgICAgXCJ3aXRoLW5hbWVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicmVnaW9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFsZXJ0XCIsIFwiYWxlcnRkaWFsb2dcIiwgXCJhcHBsaWNhdGlvblwiLCBcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImRpYWxvZ1wiLCBcImRvYy1hYnN0cmFjdFwiLCBcImRvYy1hY2tub3dsZWRnbWVudHNcIiwgXCJkb2MtYWZ0ZXJ3b3JkXCIsIFwiZG9jLWFwcGVuZGl4XCIsIFwiZG9jLWJpYmxpb2dyYXBoeVwiLCBcImRvYy1jaGFwdGVyXCIsIFwiZG9jLWNvbG9waG9uXCIsIFwiZG9jLWNvbmNsdXNpb25cIiwgXCJkb2MtY3JlZGl0XCIsIFwiZG9jLWNyZWRpdHNcIiwgXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1lbmRub3Rlc1wiLCBcImRvYy1lcGlncmFwaFwiLCBcImRvYy1lcGlsb2d1ZVwiLCBcImRvYy1lcnJhdGFcIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb3Jld29yZFwiLCBcImRvYy1nbG9zc2FyeVwiLCBcImRvYy1pbmRleFwiLCBcImRvYy1pbnRyb2R1Y3Rpb25cIiwgXCJkb2Mtbm90aWNlXCIsIFwiZG9jLXBhZ2VsaXN0XCIsIFwiZG9jLXBhcnRcIiwgXCJkb2MtcHJlZmFjZVwiLCBcImRvYy1wcm9sb2d1ZVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtcW5hXCIsIFwiZG9jLXRvY1wiLCBcImRvY3VtZW50XCIsIFwiZmVlZFwiLCBcImdyb3VwXCIsIFwibG9nXCIsIFwibWFpblwiLCBcIm1hcnF1ZWVcIiwgXCJuYXZpZ2F0aW9uXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIiwgXCJzdGF0dXNcIiwgXCJ0YWJwYW5lbFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LW5hbWVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbGVydFwiLCBcImFsZXJ0ZGlhbG9nXCIsIFwiYXBwbGljYXRpb25cIiwgXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIiwgXCJkaWFsb2dcIiwgXCJkb2MtYWJzdHJhY3RcIiwgXCJkb2MtYWNrbm93bGVkZ21lbnRzXCIsIFwiZG9jLWFmdGVyd29yZFwiLCBcImRvYy1hcHBlbmRpeFwiLCBcImRvYy1iaWJsaW9ncmFwaHlcIiwgXCJkb2MtY2hhcHRlclwiLCBcImRvYy1jb2xvcGhvblwiLCBcImRvYy1jb25jbHVzaW9uXCIsIFwiZG9jLWNyZWRpdFwiLCBcImRvYy1jcmVkaXRzXCIsIFwiZG9jLWRlZGljYXRpb25cIiwgXCJkb2MtZW5kbm90ZXNcIiwgXCJkb2MtZXBpZ3JhcGhcIiwgXCJkb2MtZXBpbG9ndWVcIiwgXCJkb2MtZXJyYXRhXCIsIFwiZG9jLWV4YW1wbGVcIiwgXCJkb2MtZm9yZXdvcmRcIiwgXCJkb2MtZ2xvc3NhcnlcIiwgXCJkb2MtaW5kZXhcIiwgXCJkb2MtaW50cm9kdWN0aW9uXCIsIFwiZG9jLW5vdGljZVwiLCBcImRvYy1wYWdlbGlzdFwiLCBcImRvYy1wYXJ0XCIsIFwiZG9jLXByZWZhY2VcIiwgXCJkb2MtcHJvbG9ndWVcIiwgXCJkb2MtcHVsbHF1b3RlXCIsIFwiZG9jLXFuYVwiLCBcImRvYy10b2NcIiwgXCJkb2N1bWVudFwiLCBcImZlZWRcIiwgXCJncm91cFwiLCBcImxvZ1wiLCBcIm1haW5cIiwgXCJtYXJxdWVlXCIsIFwibmF2aWdhdGlvblwiLCBcIm5vbmVcIiwgXCJub3RlXCIsIFwicHJlc2VudGF0aW9uXCIsIFwic2VhcmNoXCIsIFwic3RhdHVzXCIsIFwidGFicGFuZWxcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlbGVjdFwiOiB7XG4gICAgICAgICAgICBcIm5vLW11bHRpcGxlLWF0dHItc2l6ZS1ndDFcIjoge1xuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCBhIG11bHRpcGxlIGF0dHJpYnV0ZSBvciBhIHNpemUgYXR0cmlidXRlIGhhdmluZyB2YWx1ZSBncmVhdGVyIHRoYW4gMVwiXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJtdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCI6IHtcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggbm8gbXVsdGlwbGUgYXR0cmlidXRlIGFuZCBubyBzaXplIGF0dHJpYnV0ZSBoYXZpbmcgdmFsdWUgZ3JlYXRlciB0aGFuIDFcIlxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCJdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3VtbWFyeVwiOiB7XG4gICAgICAgICAgICBcImZpcnN0LXN1bW1hcnktb2YtZGV0YWlsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRib2R5XCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRkXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGhcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGUtcm93LXNjb3BlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2hlYWRlclwiLCBcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtdGFibGUtY29sdW1uLXNjb3BlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbHVtbmhlYWRlclwiLCBcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93aGVhZGVyXCIsIFwiZ3JpZGNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZC10cmVlZ3JpZC1jb2x1bW4tc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29sdW1uaGVhZGVyXCIsIFwiZ3JpZGNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJkZWZhdWx0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCJcIixcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfVxuICAgIH0gLy8gZW5kIG9mIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzXG5cbiAgICAvLyBtYXAgYXJpYSBhdHRyaWJ1dGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbmF0aXZlIGF0dHJpYnV0ZSwgYXBwbHkgdG8gYW55IGVsZW1lbnQgYXBwbGljYWJsZVxuICAgIC8vIG5vdGUgdGhpcyBtYXBwaW5nIGlzIGZvciB0aGUgcmVsYXRlZCBhdHRyaWJ1dGVzIGluIHRoZSBzYW1lIGVsZW1lbnQgd2l0aG91dCBjaGVja2luZyB0aGUgcGFyZW50IHRyZWUuXG4gICAgLy8gcmVmZXIgdG8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2h0bWwtYXJpYS9cbiAgICBzdGF0aWMgcmVsYXRlZEFyaWFIdG1sQXR0cmlidXRlczoge1xuICAgICAgICBbYXJpYUF0dHI6IHN0cmluZ10gOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IHN0cmluZ1tdIHwgbnVsbFxuICAgICAgICAgICAgfVtdLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc/OiB7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IHN0cmluZ1tdIHwgbnVsbFxuICAgICAgICAgICAgfVtdXG4gICAgICAgIH0gXG4gICAgfSA9ICB7XG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY2hlY2tlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY2hlY2tlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiZGlzYWJsZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImRpc2FibGVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJoaWRkZW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW1wiaGlkZGVuLG51bGxcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImhpZGRlblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJ1bnRpbC1mb3VuZFwiXVxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImhpZGRlblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJoaWRkZW4sbnVsbFwiXVxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJwbGFjZWhvbGRlclwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcIm1heFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICAgICAgLy9vdmVybGFwIGNhc2UgY292ZXJlZCBpbiB0aGUgcm9sZSBkZWZpbml0aW9uOiBBdXRob3JzIFNIT1VMRCBOT1QgdXNlIGFyaWEtdmFsdWVtYXggb24gYW55IGVsZW1lbnQgd2hpY2ggYWxsb3dzIHRoZSBtYXggYXR0cmlidXRlLiBVc2UgdGhlIG1heCBhdHRyaWJ1dGUgaW5zdGVhZC4gXG4gICAgICAgIH0sICAgIFxuICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wibWluXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAvLy8vb3ZlcmxhcCBjYXNlIGNvdmVyZWQgaW4gdGhlIHJvbGUgZGVmaW5pdGlvbjpBdXRob3JzIFNIT1VMRCBOT1QgdXNlIGFyaWEtdmFsdWVtaW4gb24gYW55IGVsZW1lbnQgd2hpY2ggYWxsb3dzIHRoZSBtaW4gYXR0cmlidXRlLiBVc2UgdGhlIG1pbiBhdHRyaWJ1dGUgaW5zdGVhZC5cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS1yZWFkb25seVwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlYWRvbmx5XCIsIFwiY29udGVudGVkaXRhYmxlXCIsIFwiaXNjb250ZW50ZWRpdGFibGVcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW251bGwsIFwiZmFsc2VcIiwgXCJmYWxzZVwiXVxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlYWRvbmx5XCIsIFwiY29udGVudGVkaXRhYmxlXCIsIFwiaXNjb250ZW50ZWRpdGFibGVcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW251bGwsIFwidHJ1ZVwiLCBcInRydWVcIl1cbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZXF1aXJlZFwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIFwiYXJpYS1jb2xzcGFuXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIHZhbHVlcyBhcmUgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcIlZBTFVFXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjb2xzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcIlZBTFVFXCJdXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICAvLyBvdmVybGFwIG9jY3VycyBpZiBib3RoIGV4aXN0c1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImNvbHNwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd3NwYW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgLy8gY29uZmxpY3Qgb2NjdXJzIGlmIGJvdGggdmFsdWVzIGFyZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiVkFMVUVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJvd3NwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW1wiVkFMVUVcIl1cbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgXG4gICAgICAgICAgICAgICAgLy8gb3ZlcmxhcCBvY2N1cnMgaWYgYm90aCBleGlzdHMgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicm93c3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LFxuICAgICAgICAvKiogXCJhcmlhLWF1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICAvLyBjb25mbGljdCBvY2N1cnMgaWYgYm90aCBleGlzdHMsIGFyaWEgdmFsdWUgaXMgb25seSBmb3IgY3VzdG9tIHdpZGdldCwgcmF0aGVyIHRoYW4gbmF0aXZlXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiYXV0b2NvbXBsZXRlXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0gKi8gXG4gICAgfVxuXG4gICAgc3RhdGljIGNvbnRhaW5lcnMgPSBbXVxufTtcblxubGV0IGNvbnRhaW5lckFycmF5ID0gW107XG5cbmZvciAoY29uc3Qgcm9sZURlc2lnbiBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpIHtcbiAgICBjb25zdCBjb250YWluZXJzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVEZXNpZ25dLmNvbnRhaW5lcjtcbiAgICBpZiAoY29udGFpbmVycyAhPT0gbnVsbCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBjb250YWluZXJzKSB7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyQXJyYXkuaW5kZXhPZihjb250YWluZXIpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyQXJyYXkucHVzaChjb250YWluZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuQVJJQURlZmluaXRpb25zLmNvbnRhaW5lcnMgPSBjb250YWluZXJBcnJheTtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4vQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBDb21tb25NYXBwZXIgfSBmcm9tIFwiLi4vY29tbW9uL0NvbW1vbk1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgSU1hcFJlc3VsdCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgQVJJQVdhbGtlciB9IGZyb20gXCIuL0FSSUFXYWxrZXJcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQWNjTmFtZVV0aWxcIjtcblxudHlwZSBFbGVtQ2FsYyA9IChlbGVtOiBFbGVtZW50KSA9PiBzdHJpbmc7XG50eXBlIE5vZGVDYWxjID0gKG5vZGU6IE5vZGUpID0+IHN0cmluZztcblxuZXhwb3J0IGNsYXNzIEFSSUFNYXBwZXIgZXh0ZW5kcyBDb21tb25NYXBwZXIge1xuICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGUobm9kZTogTm9kZSwgcm9sZTogc3RyaW5nKSA6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAvLyAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gIShyb2xlIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucyAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucHJlc2VudGF0aW9uYWxDaGlsZHJlbik7XG4gICAgfVxuICAgIGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5vZGUpO1xuICAgICAgICByZXR1cm4gcm9sZTtcbiAgICB9XG4gICAgZ2V0TmFtZXNwYWNlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcImFyaWFcIlxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9IHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHt9O1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVWYWwgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSBhcyBIVE1MRWxlbWVudCwgXCJBUklBTWFwcGVyOjpnZXRBdHRyaWJ1dGVzXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhY2hlVmFsICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gY2FjaGVWYWw7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxlbGVtLmF0dHJpYnV0ZXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJJbmZvID0gZWxlbS5hdHRyaWJ1dGVzW2lkeF07XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGF0dHJJbmZvLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiYXJpYS1cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW25hbWUuc3Vic3RyaW5nKDUpXSA9IGF0dHJJbmZvLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9wdGltaXplOiBDYWNoZSBub2RlTmFtZS50b0xvd2VyQ2FzZSgpIHRvIGF2b2lkIHJlcGVhdGVkIGNhbGxzXG4gICAgICAgICAgICBjb25zdCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQXBwbHkgZ2xvYmFsIGF0dHJpYnV0ZXMgZmlyc3RcbiAgICAgICAgICAgIEFSSUFNYXBwZXIuYXBwbHlBdHRyUm9sZShlbGVtLCBcImdsb2JhbFwiLCByZXRWYWwpO1xuICAgICAgICAgICAgLy8gQXBwbHkgZWxlbWVudC1zcGVjaWZpYyBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBBUklBTWFwcGVyLmFwcGx5QXR0clJvbGUoZWxlbSwgbm9kZU5hbWUsIHJldFZhbCk7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSBhcyBIVE1MRWxlbWVudCwgXCJBUklBTWFwcGVyOjpnZXRBdHRyaWJ1dGVzXCIsIHJldFZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgY2FsY3VsYXRvcnMgPSBBUklBTWFwcGVyLnRleHRBdHRyVmFsdWVDYWxjdWxhdG9ycztcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBjYWxjdWxhdG9ycykge1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBjYWxjdWxhdG9yc1thdHRyXShub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW2F0dHJdID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8vIE9wdGltaXplOiBNb3ZlIGFwcGx5QXR0clJvbGUgb3V0c2lkZSBnZXRBdHRyaWJ1dGVzIHRvIGF2b2lkIGZ1bmN0aW9uIHJlY3JlYXRpb25cbiAgICBwcml2YXRlIHN0YXRpYyBhcHBseUF0dHJSb2xlKGVsZW06IEVsZW1lbnQsIG5vZGVOYW1lOiBzdHJpbmcsIHJldFZhbDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0b3JzID0gQVJJQU1hcHBlci5lbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnM7XG4gICAgICAgIGlmICghKG5vZGVOYW1lIGluIGNhbGN1bGF0b3JzKSkgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCBhdHRyIGluIGNhbGN1bGF0b3JzW25vZGVOYW1lXSkge1xuICAgICAgICAgICAgaWYgKCEoYXR0ciBpbiByZXRWYWwpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gY2FsY3VsYXRvcnNbbm9kZU5hbWVdW2F0dHJdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgYXMgRWxlbUNhbGMpKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbFthdHRyXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRBcmlhT3duZWRCeShlbGVtOiBIVE1MRWxlbWVudCkgOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChlbGVtKTtcbiAgICAgICAgaWYgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIkFSSUFNYXBwZXI6OnByZWNhbGNPd25lZFwiLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG93bmVycyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFwiW2FyaWEtb3duc11cIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpT3duZXIgPSAwOyBpT3duZXIgPCBvd25lcnMubGVuZ3RoOyArK2lPd25lcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG93bmVyID0gb3duZXJzW2lPd25lcl07XG4gICAgICAgICAgICAgICAgY29uc3Qgb3duSWRzID0gb3duZXIuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpSWQ9MDsgaUlkIDwgb3duSWRzLmxlbmd0aDsgKytpSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZWQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lJZF0pO1xuICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZSBpZiB0aGUgYXJpYS1vd25zIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICAgICAgICAgICAgICAvL2lmIChvd25lZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShvd25lciwgb3duZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgIENhY2hlVXRpbC5zZXRDYWNoZShvd25lZCwgXCJhcmlhLW93bmVkXCIsIG93bmVyKTtcbiAgICAgICAgICAgICAgICAgICAgLy99XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiAgY2lyY3VsYXIgaGllcmFyY2h5IGNoZWNrOlxuICAgICAgICAgICAgICAgICAgICAgKiAgKDEpIHRoZSBvd25lZCBlbGVtZW50IGlzIG5laXRoZXIgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHRoZSBvd25lciBub3IgYW55IGFzY2VuZGFudCBvZiB0aGUgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICogICgyKSBhbnkgY2hpbGQgd2l0aCBhcmlhLW93bnMgY2Fubm90IHBvaW50IHRvIHRoZSBvd25lciBvciBhbnkgYXNjZW5kYW50IG9mIHRoZSBvd25lclxuICAgICAgICAgICAgICAgICAgICAgKi8gXG4gICAgICAgICAgICAgICAgICAgIGlmIChvd25lZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShvd25lciwgb3duZWQpKSB7ICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgb3duZWQgd2l0aCBhcmlhLW93bnMgdGhhdCBwb2ludHMgdG8gYW5vdGhlciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWROb2RlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViX293bmVycyA9IG93bmVkLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbYXJpYS1vd25zXVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViX293bmVycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Yl9vd25lciA9IHN1Yl9vd25lcnNbaV07IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Yl9vd25JZHMgPSBzdWJfb3duZXIuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqPTA7IGogPCBzdWJfb3duSWRzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG93bmVkTm9kZSA9IGRvYy5nZXRFbGVtZW50QnlJZChzdWJfb3duSWRzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkTm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkTm9kZXMucHVzaChvd25lZE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUob3duZWQsIFwiYXJpYS1vd25lZFwiLCBvd25lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYW55IGFyaWEtb3ducyBwb2ludHMgdG8gdGhlIGVsZW1lbnQgaXRzZWxmIG9yIGFueSBvZiBpdCdzIHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudCA6IEVsZW1lbnQgPSBvd25lcjsgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaXJjdWxhciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gb3duZWROb2Rlcy5zb21lKGl0ZW0gPT4gRE9NVXRpbC5zYW1lTm9kZShwYXJlbnQsIGl0ZW0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VsYXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNpcmN1bGFyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShvd25lZCwgXCJhcmlhLW93bmVkXCIsIG93bmVyKTsgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFSSUFNYXBwZXI6OnByZWNhbGNPd25lZFwiLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiYXJpYS1vd25lZFwiLCBudWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5vZGVIaWVyYXJjaHkobm9kZTogTm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBbXTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRIaWVyYXJjaHkgPSB0aGlzLmdldE5vZGVIaWVyYXJjaHkoRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkpO1xuICAgICAgICAgICAgbGV0IHBhcmVudEluZm8gPSBwYXJlbnRIaWVyYXJjaHkubGVuZ3RoID4gMCA/IHBhcmVudEhpZXJhcmNoeVtwYXJlbnRIaWVyYXJjaHkubGVuZ3RoLTFdIDoge1xuICAgICAgICAgICAgICAgIHJvbGU6IFwiXCIsXG4gICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbkNhbkhhdmVSb2xlOiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IG5vZGVIaWVyYXJjaHkgPSBbXTtcbiAgICAgICAgICAgIC8vIFNldCBoaWVyYXJjaHlcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRIaWVyYXJjaHkpIHtcbiAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2goe1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgICAgICAgIGJvdW5kczogdGhpcy5nZXRCb3VuZHMobm9kZSksXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB0aGlzLmdldE5hbWVzcGFjZSgpLFxuICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgICAgcm9sZTogdGhpcy5nZXRSb2xlKG5vZGUpIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgcm9sZVBhdGg6IHBhcmVudEluZm8ucm9sZVBhdGgrXCIvXCIrKHRoaXMuZ2V0Um9sZShub2RlKSB8fCBudWxsKSxcbiAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHt9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHBhcmVudEluZm8uY2hpbGRyZW5DYW5IYXZlUm9sZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZUhpZXJhcmNoeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGxldCBub2RlSGllcmFyY2h5IDogQXJyYXk8e1xuICAgICAgICAgICAgICAgIHJvbGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogbnVtYmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IGJvb2xlYW5cbiAgICAgICAgICAgIH0+ID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUhpZXJhcmNoeVwiLCBudWxsKTtcbiAgICAgICAgICAgIGlmICghbm9kZUhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgZWxlbWVudCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0IC0gYnV0IDo6cmVzZXQgcHJvY2Vzc2VzIHRoZW0gYWxsIGluIHRoZSByaWdodCBvcmRlclxuXG4gICAgICAgICAgICAgICAgLy8gR2V0IGRldGFpbHMgYWJvdXQgdGhlIGNvcnJlY3QgcGFyZW50IGZpcnN0XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMSkgeyBcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRIaWVyYXJjaHkgPSBwYXJlbnQgPyB0aGlzLmdldE5vZGVIaWVyYXJjaHkocGFyZW50KSA6IFtdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJbmZvID0gcGFyZW50SGllcmFyY2h5Lmxlbmd0aCA+IDAgPyBwYXJlbnRIaWVyYXJjaHlbcGFyZW50SGllcmFyY2h5Lmxlbmd0aC0xXSA6IHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnRJbmZvLnJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeShwYXJlbnQpIHx8IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHBhcmVudCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEhpZXJhcmNoeSA9IHBhcmVudCA/IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShwYXJlbnQpIDogW107XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZm8gPSBwYXJlbnRIaWVyYXJjaHlbcGFyZW50SGllcmFyY2h5Lmxlbmd0aC0xXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCBub2RlIGluZm9cbiAgICAgICAgICAgICAgICBsZXQgbm9kZUluZm8gOiB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBib3VuZHM6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICByb2xlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGU6IHN0cmluZ106IG51bWJlclxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IGJvb2xlYW5cbiAgICAgICAgICAgICAgICB9ID0ge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBlbGVtLm5vZGVUeXBlID09PSAxID8gdGhpcy5nZXRBdHRyaWJ1dGVzKGVsZW0pOiB7fSwgICBcbiAgICAgICAgICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhlbGVtKSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB0aGlzLmdldE5hbWVzcGFjZSgpLFxuICAgICAgICAgICAgICAgICAgICBub2RlOiBlbGVtLFxuICAgICAgICAgICAgICAgICAgICByb2xlOiB0aGlzLmdldFJvbGUoZWxlbSkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGp1c3Qgcm9sZSBpZiB3ZSdyZSB3aXRoaW4gYSBwcmVzZW50YXRpb25hbCBjb250YWluZXJcbiAgICAgICAgICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxDb250YWluZXIgPSAhcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlO1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25hbENvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5yb2xlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlID0gcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlIFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5jaGlsZHJlbkNhbkhhdmVSb2xlKGVsZW0sIG5vZGVJbmZvLnJvbGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcGF0aHNcbiAgICAgICAgICAgICAgICBpZiAobm9kZUluZm8ucm9sZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmZvLnJvbGVDb3VudFtub2RlSW5mby5yb2xlXSA9IChwYXJlbnRJbmZvLnJvbGVDb3VudFtub2RlSW5mby5yb2xlXSB8fCAwKSArIDE7IFxuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5yb2xlUGF0aCA9IHBhcmVudEluZm8ucm9sZVBhdGgrXCIvXCIrbm9kZUluZm8ucm9sZStcIltcIitwYXJlbnRJbmZvLnJvbGVDb3VudFtub2RlSW5mby5yb2xlXStcIl1cIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5yb2xlUGF0aCA9IHBhcmVudEluZm8ucm9sZVBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTZXQgaGllcmFyY2h5XG4gICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeSA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudEhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaChub2RlSW5mbyk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUhpZXJhcmNoeVwiLCBub2RlSGllcmFyY2h5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlSGllcmFyY2h5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXQobm9kZTogTm9kZSkge1xuICAgICAgICBBUklBTWFwcGVyLm5hbWVDb21wdXRhdGlvbklkID0gMDtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IFtdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGggPSBbe1xuICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICByb2xlQ291bnQ6IHt9XG4gICAgICAgIH1dO1xuICAgICAgICAvLyBHZXQgdG8gdGhlIHRvcG1vc3Qgbm9kZVxuICAgICAgICBsZXQgZ29vZE5vZGUgPSBub2RlO1xuICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgd2hpbGUgKG5leHQgPSBET01XYWxrZXIucGFyZW50Tm9kZShnb29kTm9kZSkpIHtcbiAgICAgICAgICAgIGdvb2ROb2RlID0gbmV4dDtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gV2FsayB0aGUgdHJlZSBhbmQgc2V0IHRoZSBoaWVyYXJjaGllcyBpbiB0aGUgcmlnaHQgb3JkZXJcbiAgICAgICAgbGV0IGFyaWFXYWxrZXIgPSBuZXcgQVJJQVdhbGtlcihnb29kTm9kZSwgZmFsc2UsIGdvb2ROb2RlKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGFyaWFXYWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShhcmlhV2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChhcmlhV2Fsa2VyLm5leHROb2RlKCkpO1xuICAgIH1cblxuICAgIG9wZW5TY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5Um9sZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkobm9kZSlcbiAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDx0aGlzLmhpZXJhcmNoeVJlc3VsdHMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUgJiYgdGhpcy5oaWVyYXJjaHlSZXN1bHRzW2lkeF0ucm9sZVswXSA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlID0gKHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUgPyB0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlLnN1YnN0cmluZygxKSA6IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmhpZXJhcmNoeVJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVzaEhpZXJhcmNoeShub2RlOiBOb2RlKSB7XG4gICAgICAgIC8vIElmIHdlJ3JlIG5vdCBhbiBlbGVtZW50LCBubyBzcGVjaWFsIGhhbmRsaW5nXG4gICAgICAgIGxldCBub2RlSGllcmFyY2h5ID0gW11cbiAgICAgICAgLy8gRGV0ZXJtaW5lIG91ciBub2RlIGluZm9cbiAgICAgICAgbm9kZUhpZXJhcmNoeSA9IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShub2RlKTtcbiAgICAgICAgbGV0IG5vZGVJbmZvID0gbm9kZUhpZXJhcmNoeVtub2RlSGllcmFyY2h5Lmxlbmd0aC0xXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlLnB1c2gobm9kZUluZm8ucm9sZSk7XG4gICAgICAgIGlmIChub2RlSW5mby5yb2xlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGgucHVzaChub2RlSW5mbyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMgPSBub2RlSGllcmFyY2h5O1xuICAgIH1cblxuICAgIGNsb3NlU2NvcGUobm9kZTogTm9kZSk6IElNYXBSZXN1bHRbXSB7XG4gICAgICAgIGxldCByZXRWYWwgOiBJTWFwUmVzdWx0W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgdGhpcy5oaWVyYXJjaHlSZXN1bHRzKSB7XG4gICAgICAgICAgICAvLyBjb25zdCB0ZW1wID0gcmVzLm5vZGU7XG4gICAgICAgICAgICAvLyByZXMubm9kZSA9IG51bGw7XG4gICAgICAgICAgICAvLyBsZXQgY2xvbmVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgICAgIC8vIGNsb25lZC5ub2RlID0gcmVzLm5vZGUgPSB0ZW1wOyBcbiAgICAgICAgICAgIC8vIHJldFZhbC5wdXNoKGNsb25lZCk7XG4gICAgICAgICAgICByZXRWYWwucHVzaChyZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZSA9IFwiL1wiK3JldFZhbFtyZXRWYWwubGVuZ3RoLTFdLnJvbGVcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChub2RlKTtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IHBhcmVudCA/IENhY2hlVXRpbC5nZXRDYWNoZShwYXJlbnQgYXMgSFRNTEVsZW1lbnQsIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUluZm9cIiwgW10pIDogW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uc1xuICAgIC8vLy9cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFhbS0xLjAvI21hcHBpbmctaHRtbC10by1hY2Nlc3NpYmlsaXR5LWFwaXNcbiAgICBwdWJsaWMgc3RhdGljIGVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yczogeyBbbm9kZU5hbWU6c3RyaW5nXTogeyBbYXR0cjpzdHJpbmddOiBzdHJpbmcgfCBFbGVtQ2FsYyB9fSA9IHtcbiAgICAgICAgXCJnbG9iYWxcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IGVsZW0gPT4gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGVsZW0pPy5uYW1lICAvL0FSSUFNYXBwZXIuY29tcHV0ZU5hbWVcbiAgICAgICAgfVxuICAgICAgICAsIFwiZGF0YWxpc3RcIjoge1xuICAgICAgICAgICAgLy8gc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBkYXRhbGlzdCdzIHNlbGVjdGlvbiBtb2RlbCBhbGxvd3MgbXVsdGlwbGUgb3B0aW9uIGVsZW1lbnRzIHRvIGJlXG4gICAgICAgICAgICAvLyBzZWxlY3RlZCBhdCBhIHRpbWUsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICBcIm11bHRpc2VsZWN0YWJsZVwiOiBlbGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgICAgICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0ID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFtsaXN0PSdcIitpZCtcIiddXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisoZWxlbS5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpPT1cIlwiKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcImgxXCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCIxXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDJcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjJcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoM1wiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiM1wiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImg0XCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCI0XCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDVcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjVcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoNlwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiNlwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImlucHV0XCI6IHtcbiAgICAgICAgICAgIC8vIC0gdHlwZT1cImNoZWNrYm94XCIgc3RhdGUgc2V0IHRvIFwibWl4ZWRcIiBpZiB0aGUgZWxlbWVudCdzIGluZGV0ZXJtaW5hdGUgSURMIGF0dHJpYnV0ZVxuICAgICAgICAgICAgLy8gaXMgdHJ1ZSwgb3IgXCJ0cnVlXCIgaWYgdGhlIGVsZW1lbnQncyBjaGVja2VkbmVzcyBpcyB0cnVlLCBvciBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIHN0YXRlIHNldCB0byBcInRydWVcIiBpZiB0aGUgZWxlbWVudCdzIGNoZWNrZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIlxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLlxuICAgICAgICAgICAgXCJjaGVja2VkXCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiY2hlY2tib3hcIiB8fCB0eXBlID09PSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrKGVsZW0gYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIGFuZCBub3QgaW4gbWVudSByZWZsZWN0aW5nIG51bWJlciBvZiB0eXBlPXJhZGlvIGlucHV0IGVsZW1lbnRzIFxuICAgICAgICAgICAgLy8gd2l0aGluIHRoZSByYWRpbyBidXR0b24gZ3JvdXBcbiAgICAgICAgICAgICwgXCJzZXRzaXplXCI6IGVsZW0gPT4geyByZXR1cm4gbnVsbDsgdGhyb3cgbmV3IEVycm9yKFwiTk9UIElNUExFTUVOVEVEXCIpOyB9XG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIGFuZCBub3QgaW4gbWVudSB2YWx1ZSByZWZsZWN0aW5nIHRoZSBlbGVtZW50cyBwb3NpdGlvbiBcbiAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgcmFkaW8gYnV0dG9uIGdyb3VwLlwiXG4gICAgICAgICAgICAsIFwicG9zaW5zZXRcIjogZWxlbSA9PiB7IHJldHVybiBudWxsOyB0aHJvdyBuZXcgRXJyb3IoXCJOT1QgSU1QTEVNRU5URURcIik7IH1cbiAgICAgICAgICAgIC8vIGlucHV0ICh0eXBlIGF0dHJpYnV0ZSBpbiB0aGUgVGV4dCwgU2VhcmNoLCBUZWxlcGhvbmUsIFVSTCwgb3IgRS1tYWlsIHN0YXRlcyB3aXRoIGEgXG4gICAgICAgICAgICAvLyBzdWdnZXN0aW9ucyBzb3VyY2UgZWxlbWVudCkgY29tYm9ib3ggcm9sZSwgd2l0aCB0aGUgYXJpYS1vd25zIHByb3BlcnR5IHNldCB0byB0aGUgc2FtZVxuICAgICAgICAgICAgLy8gdmFsdWUgYXMgdGhlIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAsIFwib3duc1wiOiBlbGVtID0+IHsgcmV0dXJuIG51bGw7IHRocm93IG5ldyBFcnJvcihcIk5PVCBJTVBMRU1FTlRFRFwiKTsgfVxuICAgICAgICB9XG4gICAgICAgICwgXCJrZXlnZW5cIjoge1xuICAgICAgICAgICAgXCJtdWx0aXNlbGVjdGFibGVcIjogXCJmYWxzZVwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImxpXCI6IHtcbiAgICAgICAgICAgIC8vIE51bWJlciBvZiBsaSBlbGVtZW50cyB3aXRoaW4gdGhlIG9sLCB1bCwgbWVudVxuICAgICAgICAgICAgXCJzZXRzaXplXCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbSwgW1wib2xcIiwgXCJ1bFwiLCBcIm1lbnVcIl0pO1xuICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXMgPSBDYWNoZVV0aWwuZ2V0U2V0Q2FjaGUocGFyZW50LCBcImVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yczo6bGlzXCIsICgpID0+IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwibGlcIikpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVybGlzID0gQ2FjaGVVdGlsLmdldFNldENhY2hlKHBhcmVudCwgXCJlbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnM6Om90aGVybGlzXCIsICgpID0+IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwib2wgbGksIHVsIGxpLCBtZW51IGxpXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisobGlzLmxlbmd0aC1vdGhlcmxpcy5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUG9zaXRpb24gb2YgbGkgZWxlbWVudCB3aXRoaW4gdGhlIG9sLCB1bCwgbWVudVxuICAgICAgICAgICAgLCBcInBvc2luc2V0XCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbSwgW1wib2xcIiwgXCJ1bFwiLCBcIm1lbnVcIl0pXG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpcyA9IENhY2hlVXRpbC5nZXRTZXRDYWNoZShwYXJlbnQsIFwiZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzOjpsaXNcIiwgKCkgPT4gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaVwiKSk7XG4gICAgICAgICAgICAgICAgbGV0IG51bSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxsaXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaSA9IGxpc1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShwYXJlbnQsIERPTVV0aWwuZ2V0QW5jZXN0b3IobGksIFtcIm9sXCIsIFwidWxcIiwgXCJtZW51XCJdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiK251bTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICArK251bTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcIm1lbnVpdGVtXCI6IHtcbiAgICAgICAgICAgIC8vIHR5cGUgPSBjaGVja2JveCBvciByYWRpbywgc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSBcbiAgICAgICAgICAgIC8vIGlzIHByZXNlbnQsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICBcImNoZWNrZWRcIjogZWxlbSA9PiBcIlwiKyEhKGVsZW0uZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSBcbiAgICAgICAgICAgICAgICAmJiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIik9PVwiXCIpKVxuICAgICAgICB9XG4gICAgICAgICwgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgLy8gc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBlbGVtZW50J3Mgc2VsZWN0ZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIiBvdGhlcndpc2UuXG4gICAgICAgICAgICBcInNlbGVjdGVkXCI6IGVsZW0gPT4gXCJcIishIShlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpIFxuICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpPT1cIlwiKSlcbiAgICAgICAgfVxuICAgICAgICAsIFwicHJvZ3Jlc3NcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZW1heFwiOiBlbGVtID0+IGVsZW0uZ2V0QXR0cmlidXRlKFwibWF4XCIpIHx8IFwiMVwiXG4gICAgICAgICAgICAsIFwidmFsdWVtaW5cIjogZWxlbSA9PiBcIjBcIlxuICAgICAgICAgICAgLCBcInZhbHVlbm93XCI6IGVsZW0gPT4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHRleHRBdHRyVmFsdWVDYWxjdWxhdG9yczogeyBbYXR0cjpzdHJpbmddOiBOb2RlQ2FsYyB9ID0ge1xuICAgICAgICBcIm5hbWVcIjogbm9kZSA9PiBub2RlLm5vZGVWYWx1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG5hbWVDb21wdXRhdGlvbklkID0gMDtcbiAgICAvKipwdWJsaWMgc3RhdGljIGNvbXB1dGVOYW1lKGN1cjogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICArK0FSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQ7XG4gICAgICAgIHJldHVybiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscChBUklBTWFwcGVyLm5hbWVDb21wdXRhdGlvbklkLCBjdXIsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlTmFtZUhlbHAod2Fsa0lkOiBudW1iZXIsIGN1cjogTm9kZSwgbGFiZWxsZWRieVRyYXZlcnNlOiBib29sZWFuLCB3YWxrVHJhdmVyc2U6IGJvb2xlYW4pIDogc3RyaW5nIHtcbiAgICAgICAgLy8gMmcuIE5vbmUgb2YgdGhlIG90aGVyIGNvbnRlbnQgYXBwbGllcyB0byB0ZXh0IG5vZGVzLCBzbyBqdXN0IGRvIHRoaXMgZmlyc3RcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSA9PT0gMyApIHJldHVybiBjdXIubm9kZVZhbHVlO1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09PSAxMSkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgIT09IDEgKSB7XG4gICAgICAgICAgICBpZiAod2Fsa1RyYXZlcnNlIHx8IGxhYmVsbGVkYnlUcmF2ZXJzZSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IgKFwiQ2FuIG9ubHkgY29tcHV0ZSBuYW1lIG9uIEVsZW1lbnQgYW5kIFRleHQgXCIgKyBjdXIubm9kZVR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxlbSA9IGN1ciBhcyBFbGVtZW50O1xuICAgICAgICAvLyBXZSd2ZSBiZWVuIGhlcmUgYmVmb3JlIC0gcHJldmVudCByZWN1cnNpb25cbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcImRhdGEtbmFtZXdhbGtcIiwgbnVsbCkgPT09IFwiXCIrd2Fsa0lkKSByZXR1cm4gXCJcIjtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiZGF0YS1uYW1ld2Fsa1wiLCBcIlwiK3dhbGtJZCk7XG4gICAgICAgIC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNpbnB1dC10eXBlLXRleHQtaW5wdXQtdHlwZS1wYXNzd29yZC1pbnB1dC10eXBlLXNlYXJjaC1pbnB1dC10eXBlLXRlbC1pbnB1dC10eXBlLXVybC1hbmQtdGV4dGFyZWEtZWxlbWVudFxuXG4gICAgICAgIC8vIDJhLiBPbmx5IHNob3cgaGlkZGVuIGNvbnRlbnQgaWYgaXQncyByZWZlcmVuY2VkIGJ5IGEgbGFiZWxsZWRieVxuICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGN1cikpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmIuIGNvbGxlY3QgdmFsaWQgaWQgcmVmZXJlbmNlc1xuICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbGV0IGxhYmVsbGVkYnkgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBsZXQgdmFsaWRFbGVtcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWYgb2YgbGFiZWxsZWRieSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChjdXIsIHJlZik7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkVsZW0gJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgcmVmRWxlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRFbGVtcy5wdXNoKHJlZkVsZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWxpZEVsZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgYWNjdW11bGF0ZWQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbSBvZiB2YWxpZEVsZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IFwiIFwiICsgdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBlbGVtLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZC50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5jZSBub2RlVG9Sb2xlIGNhbGxzIGJhY2sgaGVyZSBmb3IgZm9ybSBhbmQgc2VjdGlvbiwgd2UgbmVlZCBzcGVjaWFsIGNhc2luZyBoZXJlIHRvIGhhbmRsZSB0aG9zZSB0d28gY2FzZXNcbiAgICAgICAgaWYgKFtcInNlY3Rpb25cIiwgXCJmb3JtXCJdLmluY2x1ZGVzKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBJJ20gbm90IGFuIGVtYmVkZGVkIGNvbnRyb2wgb3IgSSdtIG5vdCByZWN1cnNpbmcsIHJldHVybiB0aGUgYXJpYS1sYWJlbFxuICAgICAgICAgICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICF3YWxrVHJhdmVyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmMuIElmIGxhYmVsIG9yIHdhbGssIGFuZCB0aGlzIGlzIGEgY29udHJvbCwgc2tpcCB0byB0aGUgdmFsdWUsIG90aGVyd2lzZSBwcm92aWRlIHRoZSBsYWJlbFxuICAgICAgICBjb25zdCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKGN1cik7XG4gICAgICAgIGxldCBpc0VtYmVkZGVkQ29udHJvbCA9IFtcbiAgICAgICAgICAgIFwidGV4dGJveFwiLCBcImJ1dHRvblwiLCBcImNvbWJvYm94XCIsIFwibGlzdGJveFwiLCBcbiAgICAgICAgICAgIFwicHJvZ3Jlc3NiYXJcIiwgXCJzY3JvbGxiYXJcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCJcbiAgICAgICAgXS5pbmNsdWRlcyhyb2xlKTtcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIElmIEknbSBub3QgYW4gZW1iZWRkZWQgY29udHJvbCBvciBJJ20gbm90IHJlY3Vyc2luZywgcmV0dXJuIHRoZSBhcmlhLWxhYmVsXG4gICAgICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiAhd2Fsa1RyYXZlcnNlIHx8ICFpc0VtYmVkZGVkQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmQuIFxuICAgICAgICBpZiAocm9sZSAhPT0gXCJwcmVzZW50YXRpb25cIiAmJiByb2xlICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgaWYgKChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiB8fCBjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhcmVhXCIpICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERPTVV0aWwuY2xlYW5XaGl0ZXNwYWNlKGVsZW0uZ2V0QXR0cmlidXRlKFwiYWx0XCIpKS50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiaWRcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJsYWJlbFtmb3I9J1wiK2VsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikrXCInXVwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgfHwgKGxhYmVsLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYoY3VyLCBsYWJlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgbGFiZWwsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWwudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZmllbGRzZXRcIikge1xuICAgICAgICAgICAgICAgIGlmKCAoPEVsZW1lbnQ+Y3VyKS5xdWVyeVNlbGVjdG9yKFwibGVnZW5kXCIpKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZ2VuZCA9ICg8RWxlbWVudD5jdXIpLnF1ZXJ5U2VsZWN0b3IoXCJsZWdlbmRcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWdlbmQuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBjdXIsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyAyZS5cbiAgICAgICAgaWYgKCh3YWxrVHJhdmVyc2UgfHwgbGFiZWxsZWRieVRyYXZlcnNlKSAmJiBpc0VtYmVkZGVkQ29udHJvbCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGVtYmVkZGVkIGNvbnRyb2wgaGFzIHJvbGUgdGV4dGJveCwgcmV0dXJuIGl0cyB2YWx1ZS5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcInRleHRib3hcIikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa1RyYXZlcnNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSBidXR0b24sIHJldHVybiB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgYnV0dG9uLlxuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFtcImJ1dHRvblwiLCBcInN1Ym1pdFwiLCBcInJlc2V0XCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJzdWJtaXRcIikgcmV0dXJuIFwiU3VibWl0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJyZXNldFwiKSByZXR1cm4gXCJSZXNldFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa1RyYXZlcnNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUT0RPOiBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSBjb21ib2JveCBvciBsaXN0Ym94LCByZXR1cm4gdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGNob3NlbiBvcHRpb24uXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW0sIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQgJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgc2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVJJQU1hcHBlci5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBzZWxlY3RlZCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIGVtYmVkZGVkIGNvbnRyb2wgaGFzIHJvbGUgcmFuZ2UgKGUuZy4sIGEgc3BpbmJ1dHRvbiBvciBzbGlkZXIpOlxuICAgICAgICAgICAgaWYgKFtcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiXS5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcmlhLXZhbHVldGV4dCBwcm9wZXJ0eSBpcyBwcmVzZW50LCByZXR1cm4gaXRzIHZhbHVlLFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtdmFsdWV0ZXh0XCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKTtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBhcmlhLXZhbHVlbm93IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBPdGhlcndpc2UsIHVzZSB0aGUgdmFsdWUgYXMgc3BlY2lmaWVkIGJ5IGEgaG9zdCBsYW5ndWFnZSBhdHRyaWJ1dGUuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyZi4gMmguXG4gICAgICAgIGlmICh3YWxrVHJhdmVyc2UgfHwgQVJJQURlZmluaXRpb25zLm5hbWVGcm9tQ29udGVudChyb2xlKSB8fCBsYWJlbGxlZGJ5VHJhdmVyc2UpIHtcbiAgICAgICAgICAgIC8vIDJmaS4gU2V0IHRoZSBhY2N1bXVsYXRlZCB0ZXh0IHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgICAgICAgICBsZXQgYWNjdW11bGF0ZWQgPSBcIlwiO1xuICAgICAgICAgICAgLy8gMmZpaS4gQ2hlY2sgZm9yIENTUyBnZW5lcmF0ZWQgdGV4dHVhbCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBub2RlIGFuZCBcbiAgICAgICAgICAgIC8vIGluY2x1ZGUgaXQgaW4gdGhlIGFjY3VtdWxhdGVkIHRleHQuIFRoZSBDU1MgOmJlZm9yZSBhbmQgOmFmdGVyIHBzZXVkbyBlbGVtZW50cyBbQ1NTMl0gXG4gICAgICAgICAgICAvLyBjYW4gcHJvdmlkZSB0ZXh0dWFsIGNvbnRlbnQgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIGNvbnRlbnQgbW9kZWwuXG4gICAgICAgICAgICAvLyAgIEZvciA6YmVmb3JlIHBzZXVkbyBlbGVtZW50cywgVXNlciBhZ2VudHMgTVVTVCBwcmVwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgXG4gICAgICAgICAgICAvLyAgICAgYSBzcGFjZSwgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgICAgLy8gICBGb3IgOmFmdGVyIHBzZXVkbyBlbGVtZW50cywgVXNlciBhZ2VudHMgTVVTVCBhcHBlbmQgQ1NTIHRleHR1YWwgY29udGVudCwgd2l0aG91dCBhIFxuICAgICAgICAgICAgLy8gICAgIHNwYWNlLCB0byB0aGUgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gbnVsbDtcbiAgICAgICAgICAgIGJlZm9yZSA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sXCJiZWZvcmVcIikuY29udGVudDtcblxuICAgICAgICAgICAgaWYgKGJlZm9yZSAmJiBiZWZvcmUgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlID0gYmVmb3JlLnJlcGxhY2UoL15cIi8sXCJcIikucmVwbGFjZSgvXCIkLyxcIlwiKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBiZWZvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAyZmlpaS4gRm9yIGVhY2ggY2hpbGQgbm9kZSBvZiB0aGUgY3VycmVudCBub2RlOlxuICAgICAgICAgICAgLy8gICBTZXQgdGhlIGN1cnJlbnQgbm9kZSB0byB0aGUgY2hpbGQgbm9kZS5cbiAgICAgICAgICAgIC8vICAgQ29tcHV0ZSB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgY3VycmVudCBub2RlIGJlZ2lubmluZyB3aXRoIHN0ZXAgMi4gU2V0IHRoZSByZXN1bHQgXG4gICAgICAgICAgICAvLyAgICAgdG8gdGhhdCB0ZXh0IGFsdGVybmF0aXZlLlxuICAgICAgICAgICAgLy8gICBBcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUgYWNjdW11bGF0ZWQgdGV4dC5cbiAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0xPVFwiKSB7XG4gICAgICAgICAgICAgICAgLy9pZiBubyBhc3NpZ25lZE5vZGUsIGNoZWNrIGl0cyBvd24gdGV4dCBcbiAgICAgICAgICAgICAgICBpZiAoIShlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpIHx8IChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5uZXJUZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lclRleHQgJiYgaW5uZXJUZXh0ICE9PSBudWxsICYmIGlubmVyVGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9ICBcIiBcIiArIGlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGV4dCBmcm9tIGFsbCBhc3NpZ25lZCBub2Rlc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNsb3RDaGlsZCBvZiAoZWxlbSBhcyBIVE1MU2xvdEVsZW1lbnQpLmFzc2lnbmVkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRDaGlsZENvbnRlbnQgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIHNsb3RDaGlsZCwgbGFiZWxsZWRieVRyYXZlcnNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IFwiIFwiICsgbmV4dENoaWxkQ29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHdhbGtDaGlsZCA9IGVsZW0uZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB3aGlsZSAod2Fsa0NoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0Q2hpbGRDb250ZW50ID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCB3YWxrQ2hpbGQsIGxhYmVsbGVkYnlUcmF2ZXJzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IFwiIFwiICsgbmV4dENoaWxkQ29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkID0gd2Fsa0NoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGFmdGVyID0gbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLFwiYWZ0ZXJcIikuY29udGVudDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgICAgICAgIGlmIChhZnRlciAmJiBhZnRlciAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBhZnRlciA9IGFmdGVyLnJlcGxhY2UoL15cIi8sXCJcIikucmVwbGFjZSgvXCIkLyxcIlwiKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBhZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDJmaXYuIFJldHVybiB0aGUgYWNjdW11bGF0ZWQgdGV4dC5cbiAgICAgICAgICAgIGFjY3VtdWxhdGVkID0gYWNjdW11bGF0ZWQucmVwbGFjZSgvXFxzKy9nLFwiIFwiKS50cmltKCk7XG4gICAgICAgICAgICBpZiAoYWNjdW11bGF0ZWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyaS4gT3RoZXJ3aXNlLCBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBhIFRvb2x0aXAgYXR0cmlidXRlLCByZXR1cm4gaXRzIHZhbHVlLlxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aXRsZS50ZXh0Q29udGVudCB8fCB0aXRsZS5pbm5lclRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgKi9cbi8qICAgICAgICBpZiAocm9sZSBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbSBcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKSBcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSA9IGVsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiaWRcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbmFtZSA9IGVsZW0ub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibGFiZWxbZm9yPSdcIitlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpLnRyaW0oKStcIiddXCIpLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgIG5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICBuYW1lID0gXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICAgICAgbmFtZSArPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtLCBpZCkudGV4dENvbnRlbnQgKyBcIiBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9Ki9cblxuICAgIHB1YmxpYyBzdGF0aWMgbm9kZVRvUm9sZShub2RlIDogTm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIFwidGV4dFwiO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghZWxlbSB8fCBlbGVtLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPIERPOiB1c2UgQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pIHRvIHJlcGxhY2UgdGhlIGNvZGUgZm9sbG93aW5nLCB3aGljaCB1c2VzIG9ubHkgdGhlIHZhbGlkIHJvbGVzIGZvciB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgYXJpYSBmYWxsYmFjayBydWxlXG4gICAgICAgIC8vY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgLy9yZXR1cm4gcm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCByb2xlID09PSBcIm5vbmVcIiA/IG51bGwgOiByb2xlO1xuICAgICAgICBcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCByb2xlU3RyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGxldCByb2xlcyA9IHJvbGVTdHIuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgcm9sZSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZWxlbWVudCBpcyBmb2N1c2FibGUsIHRoZW4gcHJlc2VudGF0aW9uIHJvbGVzIGFyZSB0byBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5pc0ZvY3VzYWJsZShlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb2xlO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gdGhpcy5lbGVtVG9JbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZW0pO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwibm9kZT1cIiArIG5vZGUubm9kZU5hbWUgK1wiLCByb2xlPSBcIiArIChyb2xlcyA/IHJvbGVzWzBdIDogbnVsbCkgK1wiLCByZXNvbHZlZD1cIiArIEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKSk7XG4gICAgICAgIGNvbnN0IHJvbGUgPSAhcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PTAgPyBudWxsIDogcm9sZXNbMF07XG4gICAgICAgIHJldHVybiByb2xlID09PSBcInByZXNlbnRhdGlvblwiIHx8IHJvbGUgPT09IFwibm9uZVwiID8gbnVsbCA6IHJvbGU7XG4gICAgICAgIC8vcmV0dXJuIEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgXG4gICAgfVxufSBcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4vQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG5cbi8qKlxuICogV2Fsa3MgaW4gYW4gQVJJQSBvcmRlclxuICogXG4gKiBTZWUgYWxzbyAuLi9kb20vRE9NV2Fsa2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBBUklBV2Fsa2VyIHtcbiAgICByb290IDogTm9kZTtcbiAgICBub2RlIDogTm9kZTtcbiAgICBiRW5kVGFnOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudCA6IE5vZGUsIGJFbmQ/IDogYm9vbGVhbiwgcm9vdD8gOiBOb2RlKSB7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3QgfHwgZWxlbWVudDtcbiAgICAgICAgaWYgKHRoaXMucm9vdC5ub2RlVHlwZSA9PT0gOSkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gKHRoaXMucm9vdCBhcyBEb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudDtcbiAgICAgICAgLy8gaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gOSkge1xuICAgICAgICAvLyAgICAgdGhpcy5ub2RlID0gKHRoaXMubm9kZSBhcyBEb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5iRW5kVGFnID0gKGJFbmQgPT0gdW5kZWZpbmVkID8gZmFsc2UgOiBiRW5kID09IHRydWUpO1xuICAgIH1cblxuICAgIGF0Um9vdCgpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICgodGhpcyBhcyBhbnkpLm93bmVyRWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yb290ID09PSB0aGlzLm5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5pc1NhbWVOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmlzU2FtZU5vZGUodGhpcy5ub2RlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5ub2RlKSA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCAtIHRyeSBvdXIgYmVzdFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wYXJlbnROb2RlID09PSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmV4dE5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgc2tpcE93bmVkID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5ub2RlLm5vZGVOYW1lLCB0aGlzLmJFbmRUYWc/XCJFTkRcIjpcIlNUQVJUXCIsIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIGFueSkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBzbG90RWxlbWVudCA9ICh0aGlzLm5vZGUgYXMgSFRNTFNsb3RFbGVtZW50KVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290LmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50Tm9kZS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBET01XYWxrZXIuYXNzaWduU2xvdHModGhpcy5ub2RlIGFzIFNoYWRvd1Jvb3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICAgICAmJiBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKClbMF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICovKSBcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5maXJzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2xvdE93bmVyID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTbG90SW5kZXggPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4KzE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRTbG90SW5kZXggPCBzbG90T3duZXIuYXNzaWduZWROb2RlcygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKVtuZXh0U2xvdEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLm5leHRTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIubmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgc2tpcE93bmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG93bklkcyA9ICh0aGlzLm5vZGUucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgfHwgISh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpLmhhc0F0dHJpYnV0ZShcImlkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQodGhpcy5ub2RlKS5nZXRFbGVtZW50QnlJZChvd25JZHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gb3duSWRzLmluZGV4T2YoKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT09IG93bklkcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlOyAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyYWIgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudCh0aGlzLm5vZGUpLmdldEVsZW1lbnRCeUlkKG93bklkc1tpZHgrMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICAgICAgfHwgKHNraXBPd25lZCAmJiB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgISFBUklBTWFwcGVyLmdldEFyaWFPd25lZEJ5KHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByZXZOb2RlKCkgOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBza2lwT3duZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3RcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdC5sYXN0Q2hpbGQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgRE9NV2Fsa2VyLmFzc2lnblNsb3RzKHRoaXMubm9kZSBhcyBTaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSkgXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBza2lwT3duZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duSWRzID0gKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSB8fCAhKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudCh0aGlzLm5vZGUpLmdldEVsZW1lbnRCeUlkKG93bklkc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBvd25JZHMuaW5kZXhPZigodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gb3duSWRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7ICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JhYiBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lkeCsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEpXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICAgICB8fCAoc2tpcE93bmVkICYmIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhIUFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vLi4vLi4vYXBpL0lFbmdpbmVcIjtcblxuZXhwb3J0IGNsYXNzIEFuY2VzdG9yVXRpbCB7XG4gICAgcHVibGljIHN0YXRpYyBpc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaHk6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY29udGV4dEhpZXJhcmNoeSAmJiBjb250ZXh0SGllcmFyY2h5LmRvbSkge1xuICAgICAgICAgICAgLy8gU2tpcCBjdXJyZW50IG5vZGUgYmVjYXVzZSB3ZSB3YW50IGFuY2VzdHJ5XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9Y29udGV4dEhpZXJhcmNoeS5kb20ubGVuZ3RoLTI7IGlkeCA+PSAwOyAtLWlkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSAoY29udGV4dEhpZXJhcmNoeS5kb21baWR4XS5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlVHlwZSA9PT0gMSBcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlmcmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSA9PT0gXCJ0cnVlXCIpKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0ZyYW1lKGNvbnRleHRIaWVyYXJjaHk6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY29udGV4dEhpZXJhcmNoeSAmJiBjb250ZXh0SGllcmFyY2h5LmRvbSkge1xuICAgICAgICAgICAgLy8gU2tpcCBjdXJyZW50IG5vZGUgYmVjYXVzZSB3ZSB3YW50IGFuY2VzdHJ5XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9Y29udGV4dEhpZXJhcmNoeS5kb20ubGVuZ3RoLTI7IGlkeCA+PSAwOyAtLWlkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSAoY29udGV4dEhpZXJhcmNoeS5kb21baWR4XS5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaWZyYW1lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi8uLi8uLi9hcGkvSUVuZ2luZVwiO1xuXG5leHBvcnQgY2xhc3MgRnJhZ21lbnRVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIGdldE93bmVyRnJhZ21lbnQobm9kZTogTm9kZSkgOiBEb2N1bWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICAgICAgICBsZXQgbiA6IE5vZGUgPSBub2RlO1xuICAgICAgICB3aGlsZShuLnBhcmVudE5vZGUgJiYgKG4gPSBuLnBhcmVudE5vZGUpKXtcbiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlID09PSAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEJ5SWQobm9kZTogTm9kZSwgaWQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPd25lckZyYWdtZW50KG5vZGUpLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yKGhpZXJhcmNoaWVzOiBSdWxlQ29udGV4dEhpZXJhcmNoeSwgZWxlbU5hbWU6IHN0cmluZykge1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IGhpZXJhcmNoaWVzW1wiZG9tXCJdLmZpbHRlcihpbmZvID0+IGluZm8ucm9sZSA9PT0gZWxlbU5hbWUpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlcy5sZW5ndGggPiAwICYmIG1hdGNoZXNbMF0ubm9kZSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QW5jZXN0b3JXaXRoUm9sZShoaWVyYXJjaGllczogUnVsZUNvbnRleHRIaWVyYXJjaHksIHJvbGU6IHN0cmluZykge1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IGhpZXJhcmNoaWVzW1wiYXJpYVwiXS5maWx0ZXIoaW5mbyA9PiBpbmZvLnJvbGUgPT09IHJvbGUpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlcy5sZW5ndGggPiAwICYmIG1hdGNoZXNbMF0ubm9kZSB8fCBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjEtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIEZyb20gaHR0cHM6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbGFuZ3VhZ2Utc3VidGFnLXJlZ2lzdHJ5L2xhbmd1YWdlLXN1YnRhZy1yZWdpc3RyeVxuY29uc3QgdmFsaWRQcmltYXJ5TGFuZ3MgPSBbIC8vIFwicWFhLi5xdHpcIixcblsgXCJhYVwiLFwiYWJcIixcImFlXCIsXCJhZlwiLFwiYWtcIixcImFtXCIsXCJhblwiLFwiYXJcIixcImFzXCIsXCJhdlwiLFwiYXlcIixcImF6XCIsXCJhYWFcIixcImFhYlwiLFwiYWFjXCIsXCJhYWRcIixcImFhZVwiLFwiYWFmXCIsXCJhYWdcIixcImFhaFwiLFwiYWFpXCIsXCJhYWtcIixcImFhbFwiLFwiYWFtXCIsXCJhYW5cIixcImFhb1wiLFwiYWFwXCIsXCJhYXFcIixcImFhc1wiLFwiYWF0XCIsXCJhYXVcIixcImFhdlwiLFwiYWF3XCIsXCJhYXhcIixcImFhelwiLFwiYWJhXCIsXCJhYmJcIixcImFiY1wiLFwiYWJkXCIsXCJhYmVcIixcImFiZlwiLFwiYWJnXCIsXCJhYmhcIixcImFiaVwiLFwiYWJqXCIsXCJhYmxcIixcImFibVwiLFwiYWJuXCIsXCJhYm9cIixcImFicFwiLFwiYWJxXCIsXCJhYnJcIixcImFic1wiLFwiYWJ0XCIsXCJhYnVcIixcImFidlwiLFwiYWJ3XCIsXCJhYnhcIixcImFieVwiLFwiYWJ6XCIsXCJhY2FcIixcImFjYlwiLFwiYWNkXCIsXCJhY2VcIixcImFjZlwiLFwiYWNoXCIsXCJhY2lcIixcImFja1wiLFwiYWNsXCIsXCJhY21cIixcImFjblwiLFwiYWNwXCIsXCJhY3FcIixcImFjclwiLFwiYWNzXCIsXCJhY3RcIixcImFjdVwiLFwiYWN2XCIsXCJhY3dcIixcImFjeFwiLFwiYWN5XCIsXCJhY3pcIixcImFkYVwiLFwiYWRiXCIsXCJhZGRcIixcImFkZVwiLFwiYWRmXCIsXCJhZGdcIixcImFkaFwiLFwiYWRpXCIsXCJhZGpcIixcImFkbFwiLFwiYWRuXCIsXCJhZG9cIixcImFkcFwiLFwiYWRxXCIsXCJhZHJcIixcImFkc1wiLFwiYWR0XCIsXCJhZHVcIixcImFkd1wiLFwiYWR4XCIsXCJhZHlcIixcImFkelwiLFwiYWVhXCIsXCJhZWJcIixcImFlY1wiLFwiYWVkXCIsXCJhZWVcIixcImFla1wiLFwiYWVsXCIsXCJhZW1cIixcImFlblwiLFwiYWVxXCIsXCJhZXJcIixcImFlc1wiLFwiYWV1XCIsXCJhZXdcIixcImFleVwiLFwiYWV6XCIsXCJhZmFcIixcImFmYlwiLFwiYWZkXCIsXCJhZmVcIixcImFmZ1wiLFwiYWZoXCIsXCJhZmlcIixcImFma1wiLFwiYWZuXCIsXCJhZm9cIixcImFmcFwiLFwiYWZzXCIsXCJhZnRcIixcImFmdVwiLFwiYWZ6XCIsXCJhZ2FcIixcImFnYlwiLFwiYWdjXCIsXCJhZ2RcIixcImFnZVwiLFwiYWdmXCIsXCJhZ2dcIixcImFnaFwiLFwiYWdpXCIsXCJhZ2pcIixcImFna1wiLFwiYWdsXCIsXCJhZ21cIixcImFnblwiLFwiYWdvXCIsXCJhZ3BcIixcImFncVwiLFwiYWdyXCIsXCJhZ3NcIixcImFndFwiLFwiYWd1XCIsXCJhZ3ZcIixcImFnd1wiLFwiYWd4XCIsXCJhZ3lcIixcImFnelwiLFwiYWhhXCIsXCJhaGJcIixcImFoZ1wiLFwiYWhoXCIsXCJhaGlcIixcImFoa1wiLFwiYWhsXCIsXCJhaG1cIixcImFoblwiLFwiYWhvXCIsXCJhaHBcIixcImFoclwiLFwiYWhzXCIsXCJhaHRcIixcImFpYVwiLFwiYWliXCIsXCJhaWNcIixcImFpZFwiLFwiYWllXCIsXCJhaWZcIixcImFpZ1wiLFwiYWloXCIsXCJhaWlcIixcImFpalwiLFwiYWlrXCIsXCJhaWxcIixcImFpbVwiLFwiYWluXCIsXCJhaW9cIixcImFpcFwiLFwiYWlxXCIsXCJhaXJcIixcImFpc1wiLFwiYWl0XCIsXCJhaXdcIixcImFpeFwiLFwiYWl5XCIsXCJhamFcIixcImFqZ1wiLFwiYWppXCIsXCJham5cIixcImFqcFwiLFwiYWp0XCIsXCJhanVcIixcImFqd1wiLFwiYWp6XCIsXCJha2JcIixcImFrY1wiLFwiYWtkXCIsXCJha2VcIixcImFrZlwiLFwiYWtnXCIsXCJha2hcIixcImFraVwiLFwiYWtqXCIsXCJha2tcIixcImFrbFwiLFwiYWttXCIsXCJha29cIixcImFrcFwiLFwiYWtxXCIsXCJha3JcIixcImFrc1wiLFwiYWt0XCIsXCJha3VcIixcImFrdlwiLFwiYWt3XCIsXCJha3hcIixcImFreVwiLFwiYWt6XCIsXCJhbGFcIixcImFsY1wiLFwiYWxkXCIsXCJhbGVcIixcImFsZlwiLFwiYWxnXCIsXCJhbGhcIixcImFsaVwiLFwiYWxqXCIsXCJhbGtcIixcImFsbFwiLFwiYWxtXCIsXCJhbG5cIixcImFsb1wiLFwiYWxwXCIsXCJhbHFcIixcImFsclwiLFwiYWxzXCIsXCJhbHRcIixcImFsdVwiLFwiYWx2XCIsXCJhbHdcIixcImFseFwiLFwiYWx5XCIsXCJhbHpcIixcImFtYVwiLFwiYW1iXCIsXCJhbWNcIixcImFtZVwiLFwiYW1mXCIsXCJhbWdcIixcImFtaVwiLFwiYW1qXCIsXCJhbWtcIixcImFtbFwiLFwiYW1tXCIsXCJhbW5cIixcImFtb1wiLFwiYW1wXCIsXCJhbXFcIixcImFtclwiLFwiYW1zXCIsXCJhbXRcIixcImFtdVwiLFwiYW12XCIsXCJhbXdcIixcImFteFwiLFwiYW15XCIsXCJhbXpcIixcImFuYVwiLFwiYW5iXCIsXCJhbmNcIixcImFuZFwiLFwiYW5lXCIsXCJhbmZcIixcImFuZ1wiLFwiYW5oXCIsXCJhbmlcIixcImFualwiLFwiYW5rXCIsXCJhbmxcIixcImFubVwiLFwiYW5uXCIsXCJhbm9cIixcImFucFwiLFwiYW5xXCIsXCJhbnJcIixcImFuc1wiLFwiYW50XCIsXCJhbnVcIixcImFudlwiLFwiYW53XCIsXCJhbnhcIixcImFueVwiLFwiYW56XCIsXCJhb2FcIixcImFvYlwiLFwiYW9jXCIsXCJhb2RcIixcImFvZVwiLFwiYW9mXCIsXCJhb2dcIixcImFvaFwiLFwiYW9pXCIsXCJhb2pcIixcImFva1wiLFwiYW9sXCIsXCJhb21cIixcImFvblwiLFwiYW9yXCIsXCJhb3NcIixcImFvdFwiLFwiYW91XCIsXCJhb3hcIixcImFvelwiLFwiYXBhXCIsXCJhcGJcIixcImFwY1wiLFwiYXBkXCIsXCJhcGVcIixcImFwZlwiLFwiYXBnXCIsXCJhcGhcIixcImFwaVwiLFwiYXBqXCIsXCJhcGtcIixcImFwbFwiLFwiYXBtXCIsXCJhcG5cIixcImFwb1wiLFwiYXBwXCIsXCJhcHFcIixcImFwclwiLFwiYXBzXCIsXCJhcHRcIixcImFwdVwiLFwiYXB2XCIsXCJhcHdcIixcImFweFwiLFwiYXB5XCIsXCJhcHpcIixcImFxYVwiLFwiYXFjXCIsXCJhcWRcIixcImFxZ1wiLFwiYXFrXCIsXCJhcWxcIixcImFxbVwiLFwiYXFuXCIsXCJhcXBcIixcImFxclwiLFwiYXF0XCIsXCJhcXpcIixcImFyYlwiLFwiYXJjXCIsXCJhcmRcIixcImFyZVwiLFwiYXJoXCIsXCJhcmlcIixcImFyalwiLFwiYXJrXCIsXCJhcmxcIixcImFyblwiLFwiYXJvXCIsXCJhcnBcIixcImFycVwiLFwiYXJyXCIsXCJhcnNcIixcImFydFwiLFwiYXJ1XCIsXCJhcnZcIixcImFyd1wiLFwiYXJ4XCIsXCJhcnlcIixcImFyelwiLFwiYXNhXCIsXCJhc2JcIixcImFzY1wiLFwiYXNkXCIsXCJhc2VcIixcImFzZlwiLFwiYXNnXCIsXCJhc2hcIixcImFzaVwiLFwiYXNqXCIsXCJhc2tcIixcImFzbFwiLFwiYXNuXCIsXCJhc29cIixcImFzcFwiLFwiYXNxXCIsXCJhc3JcIixcImFzc1wiLFwiYXN0XCIsXCJhc3VcIixcImFzdlwiLFwiYXN3XCIsXCJhc3hcIixcImFzeVwiLFwiYXN6XCIsXCJhdGFcIixcImF0YlwiLFwiYXRjXCIsXCJhdGRcIixcImF0ZVwiLFwiYXRnXCIsXCJhdGhcIixcImF0aVwiLFwiYXRqXCIsXCJhdGtcIixcImF0bFwiLFwiYXRtXCIsXCJhdG5cIixcImF0b1wiLFwiYXRwXCIsXCJhdHFcIixcImF0clwiLFwiYXRzXCIsXCJhdHRcIixcImF0dVwiLFwiYXR2XCIsXCJhdHdcIixcImF0eFwiLFwiYXR5XCIsXCJhdHpcIixcImF1YVwiLFwiYXViXCIsXCJhdWNcIixcImF1ZFwiLFwiYXVlXCIsXCJhdWZcIixcImF1Z1wiLFwiYXVoXCIsXCJhdWlcIixcImF1alwiLFwiYXVrXCIsXCJhdWxcIixcImF1bVwiLFwiYXVuXCIsXCJhdW9cIixcImF1cFwiLFwiYXVxXCIsXCJhdXJcIixcImF1c1wiLFwiYXV0XCIsXCJhdXVcIixcImF1d1wiLFwiYXV4XCIsXCJhdXlcIixcImF1elwiLFwiYXZiXCIsXCJhdmRcIixcImF2aVwiLFwiYXZrXCIsXCJhdmxcIixcImF2bVwiLFwiYXZuXCIsXCJhdm9cIixcImF2c1wiLFwiYXZ0XCIsXCJhdnVcIixcImF2dlwiLFwiYXdhXCIsXCJhd2JcIixcImF3Y1wiLFwiYXdkXCIsXCJhd2VcIixcImF3Z1wiLFwiYXdoXCIsXCJhd2lcIixcImF3a1wiLFwiYXdtXCIsXCJhd25cIixcImF3b1wiLFwiYXdyXCIsXCJhd3NcIixcImF3dFwiLFwiYXd1XCIsXCJhd3ZcIixcImF3d1wiLFwiYXd4XCIsXCJhd3lcIixcImF4YlwiLFwiYXhlXCIsXCJheGdcIixcImF4a1wiLFwiYXhsXCIsXCJheG1cIixcImF4eFwiLFwiYXlhXCIsXCJheWJcIixcImF5Y1wiLFwiYXlkXCIsXCJheWVcIixcImF5Z1wiLFwiYXloXCIsXCJheWlcIixcImF5a1wiLFwiYXlsXCIsXCJheW5cIixcImF5b1wiLFwiYXlwXCIsXCJheXFcIixcImF5clwiLFwiYXlzXCIsXCJheXRcIixcImF5dVwiLFwiYXl4XCIsXCJheXlcIixcImF5elwiLFwiYXphXCIsXCJhemJcIixcImF6Y1wiLFwiYXpkXCIsXCJhemdcIixcImF6alwiLFwiYXptXCIsXCJhem5cIixcImF6b1wiLFwiYXp0XCIsXCJhenpcIl1cbixbIFwiYmFcIixcImJlXCIsXCJiZ1wiLFwiYmhcIixcImJpXCIsXCJibVwiLFwiYm5cIixcImJvXCIsXCJiclwiLFwiYnNcIixcImJhYVwiLFwiYmFiXCIsXCJiYWNcIixcImJhZFwiLFwiYmFlXCIsXCJiYWZcIixcImJhZ1wiLFwiYmFoXCIsXCJiYWlcIixcImJhalwiLFwiYmFsXCIsXCJiYW5cIixcImJhb1wiLFwiYmFwXCIsXCJiYXJcIixcImJhc1wiLFwiYmF0XCIsXCJiYXVcIixcImJhdlwiLFwiYmF3XCIsXCJiYXhcIixcImJheVwiLFwiYmF6XCIsXCJiYmFcIixcImJiYlwiLFwiYmJjXCIsXCJiYmRcIixcImJiZVwiLFwiYmJmXCIsXCJiYmdcIixcImJiaFwiLFwiYmJpXCIsXCJiYmpcIixcImJia1wiLFwiYmJsXCIsXCJiYm1cIixcImJiblwiLFwiYmJvXCIsXCJiYnBcIixcImJicVwiLFwiYmJyXCIsXCJiYnNcIixcImJidFwiLFwiYmJ1XCIsXCJiYnZcIixcImJid1wiLFwiYmJ4XCIsXCJiYnlcIixcImJielwiLFwiYmNhXCIsXCJiY2JcIixcImJjY1wiLFwiYmNkXCIsXCJiY2VcIixcImJjZlwiLFwiYmNnXCIsXCJiY2hcIixcImJjaVwiLFwiYmNqXCIsXCJiY2tcIixcImJjbFwiLFwiYmNtXCIsXCJiY25cIixcImJjb1wiLFwiYmNwXCIsXCJiY3FcIixcImJjclwiLFwiYmNzXCIsXCJiY3RcIixcImJjdVwiLFwiYmN2XCIsXCJiY3dcIixcImJjeVwiLFwiYmN6XCIsXCJiZGFcIixcImJkYlwiLFwiYmRjXCIsXCJiZGRcIixcImJkZVwiLFwiYmRmXCIsXCJiZGdcIixcImJkaFwiLFwiYmRpXCIsXCJiZGpcIixcImJka1wiLFwiYmRsXCIsXCJiZG1cIixcImJkblwiLFwiYmRvXCIsXCJiZHBcIixcImJkcVwiLFwiYmRyXCIsXCJiZHNcIixcImJkdFwiLFwiYmR1XCIsXCJiZHZcIixcImJkd1wiLFwiYmR4XCIsXCJiZHlcIixcImJkelwiLFwiYmVhXCIsXCJiZWJcIixcImJlY1wiLFwiYmVkXCIsXCJiZWVcIixcImJlZlwiLFwiYmVnXCIsXCJiZWhcIixcImJlaVwiLFwiYmVqXCIsXCJiZWtcIixcImJlbVwiLFwiYmVvXCIsXCJiZXBcIixcImJlcVwiLFwiYmVyXCIsXCJiZXNcIixcImJldFwiLFwiYmV1XCIsXCJiZXZcIixcImJld1wiLFwiYmV4XCIsXCJiZXlcIixcImJlelwiLFwiYmZhXCIsXCJiZmJcIixcImJmY1wiLFwiYmZkXCIsXCJiZmVcIixcImJmZlwiLFwiYmZnXCIsXCJiZmhcIixcImJmaVwiLFwiYmZqXCIsXCJiZmtcIixcImJmbFwiLFwiYmZtXCIsXCJiZm5cIixcImJmb1wiLFwiYmZwXCIsXCJiZnFcIixcImJmclwiLFwiYmZzXCIsXCJiZnRcIixcImJmdVwiLFwiYmZ3XCIsXCJiZnhcIixcImJmeVwiLFwiYmZ6XCIsXCJiZ2FcIixcImJnYlwiLFwiYmdjXCIsXCJiZ2RcIixcImJnZVwiLFwiYmdmXCIsXCJiZ2dcIixcImJnaVwiLFwiYmdqXCIsXCJiZ2tcIixcImJnbFwiLFwiYmdtXCIsXCJiZ25cIixcImJnb1wiLFwiYmdwXCIsXCJiZ3FcIixcImJnclwiLFwiYmdzXCIsXCJiZ3RcIixcImJndVwiLFwiYmd2XCIsXCJiZ3dcIixcImJneFwiLFwiYmd5XCIsXCJiZ3pcIixcImJoYVwiLFwiYmhiXCIsXCJiaGNcIixcImJoZFwiLFwiYmhlXCIsXCJiaGZcIixcImJoZ1wiLFwiYmhoXCIsXCJiaGlcIixcImJoalwiLFwiYmhrXCIsXCJiaGxcIixcImJobVwiLFwiYmhuXCIsXCJiaG9cIixcImJocFwiLFwiYmhxXCIsXCJiaHJcIixcImJoc1wiLFwiYmh0XCIsXCJiaHVcIixcImJodlwiLFwiYmh3XCIsXCJiaHhcIixcImJoeVwiLFwiYmh6XCIsXCJiaWFcIixcImJpYlwiLFwiYmljXCIsXCJiaWRcIixcImJpZVwiLFwiYmlmXCIsXCJiaWdcIixcImJpalwiLFwiYmlrXCIsXCJiaWxcIixcImJpbVwiLFwiYmluXCIsXCJiaW9cIixcImJpcFwiLFwiYmlxXCIsXCJiaXJcIixcImJpdFwiLFwiYml1XCIsXCJiaXZcIixcImJpd1wiLFwiYml4XCIsXCJiaXlcIixcImJpelwiLFwiYmphXCIsXCJiamJcIixcImJqY1wiLFwiYmpkXCIsXCJiamVcIixcImJqZlwiLFwiYmpnXCIsXCJiamhcIixcImJqaVwiLFwiYmpqXCIsXCJiamtcIixcImJqbFwiLFwiYmptXCIsXCJiam5cIixcImJqb1wiLFwiYmpwXCIsXCJianFcIixcImJqclwiLFwiYmpzXCIsXCJianRcIixcImJqdVwiLFwiYmp2XCIsXCJiandcIixcImJqeFwiLFwiYmp5XCIsXCJianpcIixcImJrYVwiLFwiYmtiXCIsXCJia2NcIixcImJrZFwiLFwiYmtmXCIsXCJia2dcIixcImJraFwiLFwiYmtpXCIsXCJia2pcIixcImJra1wiLFwiYmtsXCIsXCJia21cIixcImJrblwiLFwiYmtvXCIsXCJia3BcIixcImJrcVwiLFwiYmtyXCIsXCJia3NcIixcImJrdFwiLFwiYmt1XCIsXCJia3ZcIixcImJrd1wiLFwiYmt4XCIsXCJia3lcIixcImJrelwiLFwiYmxhXCIsXCJibGJcIixcImJsY1wiLFwiYmxkXCIsXCJibGVcIixcImJsZlwiLFwiYmxnXCIsXCJibGhcIixcImJsaVwiLFwiYmxqXCIsXCJibGtcIixcImJsbFwiLFwiYmxtXCIsXCJibG5cIixcImJsb1wiLFwiYmxwXCIsXCJibHFcIixcImJsclwiLFwiYmxzXCIsXCJibHRcIixcImJsdlwiLFwiYmx3XCIsXCJibHhcIixcImJseVwiLFwiYmx6XCIsXCJibWFcIixcImJtYlwiLFwiYm1jXCIsXCJibWRcIixcImJtZVwiLFwiYm1mXCIsXCJibWdcIixcImJtaFwiLFwiYm1pXCIsXCJibWpcIixcImJta1wiLFwiYm1sXCIsXCJibW1cIixcImJtblwiLFwiYm1vXCIsXCJibXBcIixcImJtcVwiLFwiYm1yXCIsXCJibXNcIixcImJtdFwiLFwiYm11XCIsXCJibXZcIixcImJtd1wiLFwiYm14XCIsXCJibXlcIixcImJtelwiLFwiYm5hXCIsXCJibmJcIixcImJuY1wiLFwiYm5kXCIsXCJibmVcIixcImJuZlwiLFwiYm5nXCIsXCJibmlcIixcImJualwiLFwiYm5rXCIsXCJibmxcIixcImJubVwiLFwiYm5uXCIsXCJibm9cIixcImJucFwiLFwiYm5xXCIsXCJibnJcIixcImJuc1wiLFwiYm50XCIsXCJibnVcIixcImJudlwiLFwiYm53XCIsXCJibnhcIixcImJueVwiLFwiYm56XCIsXCJib2FcIixcImJvYlwiLFwiYm9lXCIsXCJib2ZcIixcImJvZ1wiLFwiYm9oXCIsXCJib2lcIixcImJvalwiLFwiYm9rXCIsXCJib2xcIixcImJvbVwiLFwiYm9uXCIsXCJib29cIixcImJvcFwiLFwiYm9xXCIsXCJib3JcIixcImJvdFwiLFwiYm91XCIsXCJib3ZcIixcImJvd1wiLFwiYm94XCIsXCJib3lcIixcImJvelwiLFwiYnBhXCIsXCJicGJcIixcImJwZFwiLFwiYnBlXCIsXCJicGdcIixcImJwaFwiLFwiYnBpXCIsXCJicGpcIixcImJwa1wiLFwiYnBsXCIsXCJicG1cIixcImJwblwiLFwiYnBvXCIsXCJicHBcIixcImJwcVwiLFwiYnByXCIsXCJicHNcIixcImJwdFwiLFwiYnB1XCIsXCJicHZcIixcImJwd1wiLFwiYnB4XCIsXCJicHlcIixcImJwelwiLFwiYnFhXCIsXCJicWJcIixcImJxY1wiLFwiYnFkXCIsXCJicWZcIixcImJxZ1wiLFwiYnFoXCIsXCJicWlcIixcImJxalwiLFwiYnFrXCIsXCJicWxcIixcImJxbVwiLFwiYnFuXCIsXCJicW9cIixcImJxcFwiLFwiYnFxXCIsXCJicXJcIixcImJxc1wiLFwiYnF0XCIsXCJicXVcIixcImJxdlwiLFwiYnF3XCIsXCJicXhcIixcImJxeVwiLFwiYnF6XCIsXCJicmFcIixcImJyYlwiLFwiYnJjXCIsXCJicmRcIixcImJyZlwiLFwiYnJnXCIsXCJicmhcIixcImJyaVwiLFwiYnJqXCIsXCJicmtcIixcImJybFwiLFwiYnJtXCIsXCJicm5cIixcImJyb1wiLFwiYnJwXCIsXCJicnFcIixcImJyclwiLFwiYnJzXCIsXCJicnRcIixcImJydVwiLFwiYnJ2XCIsXCJicndcIixcImJyeFwiLFwiYnJ5XCIsXCJicnpcIixcImJzYVwiLFwiYnNiXCIsXCJic2NcIixcImJzZVwiLFwiYnNmXCIsXCJic2dcIixcImJzaFwiLFwiYnNpXCIsXCJic2pcIixcImJza1wiLFwiYnNsXCIsXCJic21cIixcImJzblwiLFwiYnNvXCIsXCJic3BcIixcImJzcVwiLFwiYnNyXCIsXCJic3NcIixcImJzdFwiLFwiYnN1XCIsXCJic3ZcIixcImJzd1wiLFwiYnN4XCIsXCJic3lcIixcImJ0YVwiLFwiYnRiXCIsXCJidGNcIixcImJ0ZFwiLFwiYnRlXCIsXCJidGZcIixcImJ0Z1wiLFwiYnRoXCIsXCJidGlcIixcImJ0alwiLFwiYnRrXCIsXCJidGxcIixcImJ0bVwiLFwiYnRuXCIsXCJidG9cIixcImJ0cFwiLFwiYnRxXCIsXCJidHJcIixcImJ0c1wiLFwiYnR0XCIsXCJidHVcIixcImJ0dlwiLFwiYnR3XCIsXCJidHhcIixcImJ0eVwiLFwiYnR6XCIsXCJidWFcIixcImJ1YlwiLFwiYnVjXCIsXCJidWRcIixcImJ1ZVwiLFwiYnVmXCIsXCJidWdcIixcImJ1aFwiLFwiYnVpXCIsXCJidWpcIixcImJ1a1wiLFwiYnVtXCIsXCJidW5cIixcImJ1b1wiLFwiYnVwXCIsXCJidXFcIixcImJ1c1wiLFwiYnV0XCIsXCJidXVcIixcImJ1dlwiLFwiYnV3XCIsXCJidXhcIixcImJ1eVwiLFwiYnV6XCIsXCJidmFcIixcImJ2YlwiLFwiYnZjXCIsXCJidmRcIixcImJ2ZVwiLFwiYnZmXCIsXCJidmdcIixcImJ2aFwiLFwiYnZpXCIsXCJidmpcIixcImJ2a1wiLFwiYnZsXCIsXCJidm1cIixcImJ2blwiLFwiYnZvXCIsXCJidnBcIixcImJ2cVwiLFwiYnZyXCIsXCJidnRcIixcImJ2dVwiLFwiYnZ2XCIsXCJidndcIixcImJ2eFwiLFwiYnZ5XCIsXCJidnpcIixcImJ3YVwiLFwiYndiXCIsXCJid2NcIixcImJ3ZFwiLFwiYndlXCIsXCJid2ZcIixcImJ3Z1wiLFwiYndoXCIsXCJid2lcIixcImJ3alwiLFwiYndrXCIsXCJid2xcIixcImJ3bVwiLFwiYnduXCIsXCJid29cIixcImJ3cFwiLFwiYndxXCIsXCJid3JcIixcImJ3c1wiLFwiYnd0XCIsXCJid3VcIixcImJ3d1wiLFwiYnd4XCIsXCJid3lcIixcImJ3elwiLFwiYnhhXCIsXCJieGJcIixcImJ4Y1wiLFwiYnhkXCIsXCJieGVcIixcImJ4ZlwiLFwiYnhnXCIsXCJieGhcIixcImJ4aVwiLFwiYnhqXCIsXCJieGtcIixcImJ4bFwiLFwiYnhtXCIsXCJieG5cIixcImJ4b1wiLFwiYnhwXCIsXCJieHFcIixcImJ4clwiLFwiYnhzXCIsXCJieHVcIixcImJ4dlwiLFwiYnh3XCIsXCJieHhcIixcImJ4elwiLFwiYnlhXCIsXCJieWJcIixcImJ5Y1wiLFwiYnlkXCIsXCJieWVcIixcImJ5ZlwiLFwiYnlnXCIsXCJieWhcIixcImJ5aVwiLFwiYnlqXCIsXCJieWtcIixcImJ5bFwiLFwiYnltXCIsXCJieW5cIixcImJ5b1wiLFwiYnlwXCIsXCJieXFcIixcImJ5clwiLFwiYnlzXCIsXCJieXRcIixcImJ5dlwiLFwiYnl3XCIsXCJieXhcIixcImJ5eVwiLFwiYnl6XCIsXCJiemFcIixcImJ6YlwiLFwiYnpjXCIsXCJiemRcIixcImJ6ZVwiLFwiYnpmXCIsXCJiemdcIixcImJ6aFwiLFwiYnppXCIsXCJiempcIixcImJ6a1wiLFwiYnpsXCIsXCJiem1cIixcImJ6blwiLFwiYnpvXCIsXCJienBcIixcImJ6cVwiLFwiYnpyXCIsXCJienNcIixcImJ6dFwiLFwiYnp1XCIsXCJienZcIixcImJ6d1wiLFwiYnp4XCIsXCJienlcIixcImJ6elwiXVxuLFsgXCJjYVwiLFwiY2VcIixcImNoXCIsXCJjb1wiLFwiY3JcIixcImNzXCIsXCJjdVwiLFwiY3ZcIixcImN5XCIsXCJjYWFcIixcImNhYlwiLFwiY2FjXCIsXCJjYWRcIixcImNhZVwiLFwiY2FmXCIsXCJjYWdcIixcImNhaFwiLFwiY2FpXCIsXCJjYWpcIixcImNha1wiLFwiY2FsXCIsXCJjYW1cIixcImNhblwiLFwiY2FvXCIsXCJjYXBcIixcImNhcVwiLFwiY2FyXCIsXCJjYXNcIixcImNhdVwiLFwiY2F2XCIsXCJjYXdcIixcImNheFwiLFwiY2F5XCIsXCJjYXpcIixcImNiYVwiLFwiY2JiXCIsXCJjYmNcIixcImNiZFwiLFwiY2JlXCIsXCJjYmdcIixcImNiaFwiLFwiY2JpXCIsXCJjYmpcIixcImNia1wiLFwiY2JsXCIsXCJjYm5cIixcImNib1wiLFwiY2JxXCIsXCJjYnJcIixcImNic1wiLFwiY2J0XCIsXCJjYnVcIixcImNidlwiLFwiY2J3XCIsXCJjYnlcIixcImNjYVwiLFwiY2NjXCIsXCJjY2RcIixcImNjZVwiLFwiY2NnXCIsXCJjY2hcIixcImNjalwiLFwiY2NsXCIsXCJjY21cIixcImNjblwiLFwiY2NvXCIsXCJjY3BcIixcImNjcVwiLFwiY2NyXCIsXCJjY3NcIixcImNkYVwiLFwiY2RjXCIsXCJjZGRcIixcImNkZVwiLFwiY2RmXCIsXCJjZGdcIixcImNkaFwiLFwiY2RpXCIsXCJjZGpcIixcImNkbVwiLFwiY2RuXCIsXCJjZG9cIixcImNkclwiLFwiY2RzXCIsXCJjZHlcIixcImNkelwiLFwiY2VhXCIsXCJjZWJcIixcImNlZ1wiLFwiY2VrXCIsXCJjZWxcIixcImNlblwiLFwiY2V0XCIsXCJjZXlcIixcImNmYVwiLFwiY2ZkXCIsXCJjZmdcIixcImNmbVwiLFwiY2dhXCIsXCJjZ2NcIixcImNnZ1wiLFwiY2drXCIsXCJjaGJcIixcImNoY1wiLFwiY2hkXCIsXCJjaGZcIixcImNoZ1wiLFwiY2hoXCIsXCJjaGpcIixcImNoa1wiLFwiY2hsXCIsXCJjaG1cIixcImNoblwiLFwiY2hvXCIsXCJjaHBcIixcImNocVwiLFwiY2hyXCIsXCJjaHRcIixcImNod1wiLFwiY2h4XCIsXCJjaHlcIixcImNoelwiLFwiY2lhXCIsXCJjaWJcIixcImNpY1wiLFwiY2lkXCIsXCJjaWVcIixcImNpaFwiLFwiY2lrXCIsXCJjaW1cIixcImNpblwiLFwiY2lwXCIsXCJjaXJcIixcImNpd1wiLFwiY2l5XCIsXCJjamFcIixcImNqZVwiLFwiY2poXCIsXCJjamlcIixcImNqa1wiLFwiY2ptXCIsXCJjam5cIixcImNqb1wiLFwiY2pwXCIsXCJjanJcIixcImNqc1wiLFwiY2p2XCIsXCJjanlcIixcImNrYVwiLFwiY2tiXCIsXCJja2hcIixcImNrbFwiLFwiY2ttXCIsXCJja25cIixcImNrb1wiLFwiY2txXCIsXCJja3JcIixcImNrc1wiLFwiY2t0XCIsXCJja3VcIixcImNrdlwiLFwiY2t4XCIsXCJja3lcIixcImNrelwiLFwiY2xhXCIsXCJjbGNcIixcImNsZFwiLFwiY2xlXCIsXCJjbGhcIixcImNsaVwiLFwiY2xqXCIsXCJjbGtcIixcImNsbFwiLFwiY2xtXCIsXCJjbG9cIixcImNsdFwiLFwiY2x1XCIsXCJjbHdcIixcImNseVwiLFwiY21hXCIsXCJjbWNcIixcImNtZVwiLFwiY21nXCIsXCJjbWlcIixcImNta1wiLFwiY21sXCIsXCJjbW1cIixcImNtblwiLFwiY21vXCIsXCJjbXJcIixcImNtc1wiLFwiY210XCIsXCJjbmFcIixcImNuYlwiLFwiY25jXCIsXCJjbmdcIixcImNuaFwiLFwiY25pXCIsXCJjbmtcIixcImNubFwiLFwiY25vXCIsXCJjbnBcIixcImNuclwiLFwiY25zXCIsXCJjbnRcIixcImNudVwiLFwiY253XCIsXCJjbnhcIixcImNvYVwiLFwiY29iXCIsXCJjb2NcIixcImNvZFwiLFwiY29lXCIsXCJjb2ZcIixcImNvZ1wiLFwiY29oXCIsXCJjb2pcIixcImNva1wiLFwiY29sXCIsXCJjb21cIixcImNvblwiLFwiY29vXCIsXCJjb3BcIixcImNvcVwiLFwiY290XCIsXCJjb3VcIixcImNvdlwiLFwiY293XCIsXCJjb3hcIixcImNveVwiLFwiY296XCIsXCJjcGFcIixcImNwYlwiLFwiY3BjXCIsXCJjcGVcIixcImNwZlwiLFwiY3BnXCIsXCJjcGlcIixcImNwblwiLFwiY3BvXCIsXCJjcHBcIixcImNwc1wiLFwiY3B1XCIsXCJjcHhcIixcImNweVwiLFwiY3FkXCIsXCJjcXVcIixcImNyYVwiLFwiY3JiXCIsXCJjcmNcIixcImNyZFwiLFwiY3JmXCIsXCJjcmdcIixcImNyaFwiLFwiY3JpXCIsXCJjcmpcIixcImNya1wiLFwiY3JsXCIsXCJjcm1cIixcImNyblwiLFwiY3JvXCIsXCJjcnBcIixcImNycVwiLFwiY3JyXCIsXCJjcnNcIixcImNydFwiLFwiY3J2XCIsXCJjcndcIixcImNyeFwiLFwiY3J5XCIsXCJjcnpcIixcImNzYVwiLFwiY3NiXCIsXCJjc2NcIixcImNzZFwiLFwiY3NlXCIsXCJjc2ZcIixcImNzZ1wiLFwiY3NoXCIsXCJjc2lcIixcImNzalwiLFwiY3NrXCIsXCJjc2xcIixcImNzbVwiLFwiY3NuXCIsXCJjc29cIixcImNzcFwiLFwiY3NxXCIsXCJjc3JcIixcImNzc1wiLFwiY3N0XCIsXCJjc3VcIixcImNzdlwiLFwiY3N3XCIsXCJjc3hcIixcImNzeVwiLFwiY3N6XCIsXCJjdGFcIixcImN0Y1wiLFwiY3RkXCIsXCJjdGVcIixcImN0Z1wiLFwiY3RoXCIsXCJjdGxcIixcImN0bVwiLFwiY3RuXCIsXCJjdG9cIixcImN0cFwiLFwiY3RzXCIsXCJjdHRcIixcImN0dVwiLFwiY3R5XCIsXCJjdHpcIixcImN1YVwiLFwiY3ViXCIsXCJjdWNcIixcImN1Z1wiLFwiY3VoXCIsXCJjdWlcIixcImN1alwiLFwiY3VrXCIsXCJjdWxcIixcImN1bVwiLFwiY3VvXCIsXCJjdXBcIixcImN1cVwiLFwiY3VyXCIsXCJjdXNcIixcImN1dFwiLFwiY3V1XCIsXCJjdXZcIixcImN1d1wiLFwiY3V4XCIsXCJjdXlcIixcImN2Z1wiLFwiY3ZuXCIsXCJjd2FcIixcImN3YlwiLFwiY3dkXCIsXCJjd2VcIixcImN3Z1wiLFwiY3d0XCIsXCJjeWFcIixcImN5YlwiLFwiY3lvXCIsXCJjemhcIixcImN6a1wiLFwiY3puXCIsXCJjem9cIixcImN6dFwiXVxuLFsgXCJkYVwiLFwiZGVcIixcImR2XCIsXCJkelwiLFwiZGFhXCIsXCJkYWNcIixcImRhZFwiLFwiZGFlXCIsXCJkYWZcIixcImRhZ1wiLFwiZGFoXCIsXCJkYWlcIixcImRhalwiLFwiZGFrXCIsXCJkYWxcIixcImRhbVwiLFwiZGFvXCIsXCJkYXBcIixcImRhcVwiLFwiZGFyXCIsXCJkYXNcIixcImRhdVwiLFwiZGF2XCIsXCJkYXdcIixcImRheFwiLFwiZGF5XCIsXCJkYXpcIixcImRiYVwiLFwiZGJiXCIsXCJkYmRcIixcImRiZVwiLFwiZGJmXCIsXCJkYmdcIixcImRiaVwiLFwiZGJqXCIsXCJkYmxcIixcImRibVwiLFwiZGJuXCIsXCJkYm9cIixcImRicFwiLFwiZGJxXCIsXCJkYnJcIixcImRidFwiLFwiZGJ1XCIsXCJkYnZcIixcImRid1wiLFwiZGJ5XCIsXCJkY2NcIixcImRjclwiLFwiZGRhXCIsXCJkZGRcIixcImRkZVwiLFwiZGRnXCIsXCJkZGlcIixcImRkalwiLFwiZGRuXCIsXCJkZG9cIixcImRkclwiLFwiZGRzXCIsXCJkZHdcIixcImRlY1wiLFwiZGVkXCIsXCJkZWVcIixcImRlZlwiLFwiZGVnXCIsXCJkZWhcIixcImRlaVwiLFwiZGVrXCIsXCJkZWxcIixcImRlbVwiLFwiZGVuXCIsXCJkZXBcIixcImRlcVwiLFwiZGVyXCIsXCJkZXNcIixcImRldlwiLFwiZGV6XCIsXCJkZ2FcIixcImRnYlwiLFwiZGdjXCIsXCJkZ2RcIixcImRnZVwiLFwiZGdnXCIsXCJkZ2hcIixcImRnaVwiLFwiZGdrXCIsXCJkZ2xcIixcImRnblwiLFwiZGdvXCIsXCJkZ3JcIixcImRnc1wiLFwiZGd0XCIsXCJkZ3VcIixcImRnd1wiLFwiZGd4XCIsXCJkZ3pcIixcImRoYVwiLFwiZGhkXCIsXCJkaGdcIixcImRoaVwiLFwiZGhsXCIsXCJkaG1cIixcImRoblwiLFwiZGhvXCIsXCJkaHJcIixcImRoc1wiLFwiZGh1XCIsXCJkaHZcIixcImRod1wiLFwiZGh4XCIsXCJkaWFcIixcImRpYlwiLFwiZGljXCIsXCJkaWRcIixcImRpZlwiLFwiZGlnXCIsXCJkaWhcIixcImRpaVwiLFwiZGlqXCIsXCJkaWtcIixcImRpbFwiLFwiZGltXCIsXCJkaW5cIixcImRpb1wiLFwiZGlwXCIsXCJkaXFcIixcImRpclwiLFwiZGlzXCIsXCJkaXRcIixcImRpdVwiLFwiZGl3XCIsXCJkaXhcIixcImRpeVwiLFwiZGl6XCIsXCJkamFcIixcImRqYlwiLFwiZGpjXCIsXCJkamRcIixcImRqZVwiLFwiZGpmXCIsXCJkamlcIixcImRqalwiLFwiZGprXCIsXCJkamxcIixcImRqbVwiLFwiZGpuXCIsXCJkam9cIixcImRqclwiLFwiZGp1XCIsXCJkandcIixcImRrYVwiLFwiZGtnXCIsXCJka2tcIixcImRrbFwiLFwiZGtyXCIsXCJka3NcIixcImRreFwiLFwiZGxnXCIsXCJkbGtcIixcImRsbVwiLFwiZGxuXCIsXCJkbWFcIixcImRtYlwiLFwiZG1jXCIsXCJkbWRcIixcImRtZVwiLFwiZG1mXCIsXCJkbWdcIixcImRta1wiLFwiZG1sXCIsXCJkbW1cIixcImRtblwiLFwiZG1vXCIsXCJkbXJcIixcImRtc1wiLFwiZG11XCIsXCJkbXZcIixcImRtd1wiLFwiZG14XCIsXCJkbXlcIixcImRuYVwiLFwiZG5kXCIsXCJkbmVcIixcImRuZ1wiLFwiZG5pXCIsXCJkbmpcIixcImRua1wiLFwiZG5uXCIsXCJkbm9cIixcImRuclwiLFwiZG50XCIsXCJkbnVcIixcImRudlwiLFwiZG53XCIsXCJkbnlcIixcImRvYVwiLFwiZG9iXCIsXCJkb2NcIixcImRvZVwiLFwiZG9mXCIsXCJkb2hcIixcImRvaVwiLFwiZG9rXCIsXCJkb2xcIixcImRvblwiLFwiZG9vXCIsXCJkb3BcIixcImRvcVwiLFwiZG9yXCIsXCJkb3NcIixcImRvdFwiLFwiZG92XCIsXCJkb3dcIixcImRveFwiLFwiZG95XCIsXCJkb3pcIixcImRwcFwiLFwiZHJhXCIsXCJkcmJcIixcImRyY1wiLFwiZHJkXCIsXCJkcmVcIixcImRyZ1wiLFwiZHJoXCIsXCJkcmlcIixcImRybFwiLFwiZHJuXCIsXCJkcm9cIixcImRycVwiLFwiZHJyXCIsXCJkcnNcIixcImRydFwiLFwiZHJ1XCIsXCJkcndcIixcImRyeVwiLFwiZHNiXCIsXCJkc2VcIixcImRzaFwiLFwiZHNpXCIsXCJkc2xcIixcImRzblwiLFwiZHNvXCIsXCJkc3FcIixcImR0YVwiLFwiZHRiXCIsXCJkdGRcIixcImR0aFwiLFwiZHRpXCIsXCJkdGtcIixcImR0bVwiLFwiZHRuXCIsXCJkdG9cIixcImR0cFwiLFwiZHRyXCIsXCJkdHNcIixcImR0dFwiLFwiZHR1XCIsXCJkdHlcIixcImR1YVwiLFwiZHViXCIsXCJkdWNcIixcImR1ZFwiLFwiZHVlXCIsXCJkdWZcIixcImR1Z1wiLFwiZHVoXCIsXCJkdWlcIixcImR1alwiLFwiZHVrXCIsXCJkdWxcIixcImR1bVwiLFwiZHVuXCIsXCJkdW9cIixcImR1cFwiLFwiZHVxXCIsXCJkdXJcIixcImR1c1wiLFwiZHV1XCIsXCJkdXZcIixcImR1d1wiLFwiZHV4XCIsXCJkdXlcIixcImR1elwiLFwiZHZhXCIsXCJkd2FcIixcImR3a1wiLFwiZHdsXCIsXCJkd3JcIixcImR3c1wiLFwiZHd1XCIsXCJkd3dcIixcImR3eVwiLFwiZHd6XCIsXCJkeWFcIixcImR5YlwiLFwiZHlkXCIsXCJkeWdcIixcImR5aVwiLFwiZHltXCIsXCJkeW5cIixcImR5b1wiLFwiZHl1XCIsXCJkeXlcIixcImR6YVwiLFwiZHpkXCIsXCJkemVcIixcImR6Z1wiLFwiZHpsXCIsXCJkem5cIl1cbixbIFwiZWVcIixcImVsXCIsXCJlblwiLFwiZW9cIixcImVzXCIsXCJldFwiLFwiZXVcIixcImVhYVwiLFwiZWJjXCIsXCJlYmdcIixcImVia1wiLFwiZWJvXCIsXCJlYnJcIixcImVidVwiLFwiZWNyXCIsXCJlY3NcIixcImVjeVwiLFwiZWVlXCIsXCJlZmFcIixcImVmZVwiLFwiZWZpXCIsXCJlZ2FcIixcImVnbFwiLFwiZWdvXCIsXCJlZ3hcIixcImVneVwiLFwiZWhzXCIsXCJlaHVcIixcImVpcFwiLFwiZWl0XCIsXCJlaXZcIixcImVqYVwiLFwiZWthXCIsXCJla2NcIixcImVrZVwiLFwiZWtnXCIsXCJla2lcIixcImVra1wiLFwiZWtsXCIsXCJla21cIixcImVrb1wiLFwiZWtwXCIsXCJla3JcIixcImVreVwiLFwiZWxlXCIsXCJlbGhcIixcImVsaVwiLFwiZWxrXCIsXCJlbG1cIixcImVsb1wiLFwiZWxwXCIsXCJlbHVcIixcImVseFwiLFwiZW1hXCIsXCJlbWJcIixcImVtZVwiLFwiZW1nXCIsXCJlbWlcIixcImVta1wiLFwiZW1tXCIsXCJlbW5cIixcImVtb1wiLFwiZW1wXCIsXCJlbXFcIixcImVtc1wiLFwiZW11XCIsXCJlbXdcIixcImVteFwiLFwiZW15XCIsXCJlbXpcIixcImVuYVwiLFwiZW5iXCIsXCJlbmNcIixcImVuZFwiLFwiZW5mXCIsXCJlbmhcIixcImVubFwiLFwiZW5tXCIsXCJlbm5cIixcImVub1wiLFwiZW5xXCIsXCJlbnJcIixcImVudVwiLFwiZW52XCIsXCJlbndcIixcImVueFwiLFwiZW90XCIsXCJlcGlcIixcImVyYVwiLFwiZXJnXCIsXCJlcmhcIixcImVyaVwiLFwiZXJrXCIsXCJlcm9cIixcImVyclwiLFwiZXJzXCIsXCJlcnRcIixcImVyd1wiLFwiZXNlXCIsXCJlc2dcIixcImVzaFwiLFwiZXNpXCIsXCJlc2tcIixcImVzbFwiLFwiZXNtXCIsXCJlc25cIixcImVzb1wiLFwiZXNxXCIsXCJlc3NcIixcImVzdVwiLFwiZXN4XCIsXCJlc3lcIixcImV0YlwiLFwiZXRjXCIsXCJldGhcIixcImV0blwiLFwiZXRvXCIsXCJldHJcIixcImV0c1wiLFwiZXR0XCIsXCJldHVcIixcImV0eFwiLFwiZXR6XCIsXCJldXFcIixcImV2ZVwiLFwiZXZoXCIsXCJldm5cIixcImV3b1wiLFwiZXh0XCIsXCJleWFcIixcImV5b1wiLFwiZXphXCIsXCJlemVcIl1cbixbIFwiZmFcIixcImZmXCIsXCJmaVwiLFwiZmpcIixcImZvXCIsXCJmclwiLFwiZnlcIixcImZhYVwiLFwiZmFiXCIsXCJmYWRcIixcImZhZlwiLFwiZmFnXCIsXCJmYWhcIixcImZhaVwiLFwiZmFqXCIsXCJmYWtcIixcImZhbFwiLFwiZmFtXCIsXCJmYW5cIixcImZhcFwiLFwiZmFyXCIsXCJmYXRcIixcImZhdVwiLFwiZmF4XCIsXCJmYXlcIixcImZhelwiLFwiZmJsXCIsXCJmY3NcIixcImZlclwiLFwiZmZpXCIsXCJmZm1cIixcImZnclwiLFwiZmlhXCIsXCJmaWVcIixcImZpZlwiLFwiZmlsXCIsXCJmaXBcIixcImZpclwiLFwiZml0XCIsXCJmaXVcIixcImZpd1wiLFwiZmtrXCIsXCJma3ZcIixcImZsYVwiLFwiZmxoXCIsXCJmbGlcIixcImZsbFwiLFwiZmxuXCIsXCJmbHJcIixcImZseVwiLFwiZm1wXCIsXCJmbXVcIixcImZuYlwiLFwiZm5nXCIsXCJmbmlcIixcImZvZFwiLFwiZm9pXCIsXCJmb21cIixcImZvblwiLFwiZm9yXCIsXCJmb3NcIixcImZveFwiLFwiZnBlXCIsXCJmcXNcIixcImZyY1wiLFwiZnJkXCIsXCJmcmtcIixcImZybVwiLFwiZnJvXCIsXCJmcnBcIixcImZycVwiLFwiZnJyXCIsXCJmcnNcIixcImZydFwiLFwiZnNlXCIsXCJmc2xcIixcImZzc1wiLFwiZnViXCIsXCJmdWNcIixcImZ1ZFwiLFwiZnVlXCIsXCJmdWZcIixcImZ1aFwiLFwiZnVpXCIsXCJmdWpcIixcImZ1bVwiLFwiZnVuXCIsXCJmdXFcIixcImZ1clwiLFwiZnV0XCIsXCJmdXVcIixcImZ1dlwiLFwiZnV5XCIsXCJmdnJcIixcImZ3YVwiLFwiZndlXCJdXG4sWyBcImdhXCIsXCJnZFwiLFwiZ2xcIixcImduXCIsXCJndVwiLFwiZ3ZcIixcImdhYVwiLFwiZ2FiXCIsXCJnYWNcIixcImdhZFwiLFwiZ2FlXCIsXCJnYWZcIixcImdhZ1wiLFwiZ2FoXCIsXCJnYWlcIixcImdhalwiLFwiZ2FrXCIsXCJnYWxcIixcImdhbVwiLFwiZ2FuXCIsXCJnYW9cIixcImdhcFwiLFwiZ2FxXCIsXCJnYXJcIixcImdhc1wiLFwiZ2F0XCIsXCJnYXVcIixcImdhdlwiLFwiZ2F3XCIsXCJnYXhcIixcImdheVwiLFwiZ2F6XCIsXCJnYmFcIixcImdiYlwiLFwiZ2JjXCIsXCJnYmRcIixcImdiZVwiLFwiZ2JmXCIsXCJnYmdcIixcImdiaFwiLFwiZ2JpXCIsXCJnYmpcIixcImdia1wiLFwiZ2JsXCIsXCJnYm1cIixcImdiblwiLFwiZ2JvXCIsXCJnYnBcIixcImdicVwiLFwiZ2JyXCIsXCJnYnNcIixcImdidVwiLFwiZ2J2XCIsXCJnYndcIixcImdieFwiLFwiZ2J5XCIsXCJnYnpcIixcImdjY1wiLFwiZ2NkXCIsXCJnY2VcIixcImdjZlwiLFwiZ2NsXCIsXCJnY25cIixcImdjclwiLFwiZ2N0XCIsXCJnZGFcIixcImdkYlwiLFwiZ2RjXCIsXCJnZGRcIixcImdkZVwiLFwiZ2RmXCIsXCJnZGdcIixcImdkaFwiLFwiZ2RpXCIsXCJnZGpcIixcImdka1wiLFwiZ2RsXCIsXCJnZG1cIixcImdkblwiLFwiZ2RvXCIsXCJnZHFcIixcImdkclwiLFwiZ2RzXCIsXCJnZHRcIixcImdkdVwiLFwiZ2R4XCIsXCJnZWFcIixcImdlYlwiLFwiZ2VjXCIsXCJnZWRcIixcImdlZlwiLFwiZ2VnXCIsXCJnZWhcIixcImdlaVwiLFwiZ2VqXCIsXCJnZWtcIixcImdlbFwiLFwiZ2VtXCIsXCJnZXFcIixcImdlc1wiLFwiZ2V2XCIsXCJnZXdcIixcImdleFwiLFwiZ2V5XCIsXCJnZXpcIixcImdma1wiLFwiZ2Z0XCIsXCJnZnhcIixcImdnYVwiLFwiZ2diXCIsXCJnZ2RcIixcImdnZVwiLFwiZ2dnXCIsXCJnZ2tcIixcImdnbFwiLFwiZ2duXCIsXCJnZ29cIixcImdnclwiLFwiZ2d0XCIsXCJnZ3VcIixcImdnd1wiLFwiZ2hhXCIsXCJnaGNcIixcImdoZVwiLFwiZ2hoXCIsXCJnaGtcIixcImdobFwiLFwiZ2huXCIsXCJnaG9cIixcImdoclwiLFwiZ2hzXCIsXCJnaHRcIixcImdpYVwiLFwiZ2liXCIsXCJnaWNcIixcImdpZFwiLFwiZ2llXCIsXCJnaWdcIixcImdpaFwiLFwiZ2lpXCIsXCJnaWxcIixcImdpbVwiLFwiZ2luXCIsXCJnaW9cIixcImdpcFwiLFwiZ2lxXCIsXCJnaXJcIixcImdpc1wiLFwiZ2l0XCIsXCJnaXVcIixcImdpd1wiLFwiZ2l4XCIsXCJnaXlcIixcImdpelwiLFwiZ2ppXCIsXCJnamtcIixcImdqbVwiLFwiZ2puXCIsXCJnanJcIixcImdqdVwiLFwiZ2thXCIsXCJna2RcIixcImdrZVwiLFwiZ2tuXCIsXCJna29cIixcImdrcFwiLFwiZ2t1XCIsXCJnbGJcIixcImdsY1wiLFwiZ2xkXCIsXCJnbGhcIixcImdsaVwiLFwiZ2xqXCIsXCJnbGtcIixcImdsbFwiLFwiZ2xvXCIsXCJnbHJcIixcImdsdVwiLFwiZ2x3XCIsXCJnbHlcIixcImdtYVwiLFwiZ21iXCIsXCJnbWRcIixcImdtZVwiLFwiZ21nXCIsXCJnbWhcIixcImdtbFwiLFwiZ21tXCIsXCJnbW5cIixcImdtcVwiLFwiZ21yXCIsXCJnbXVcIixcImdtdlwiLFwiZ213XCIsXCJnbXhcIixcImdteVwiLFwiZ216XCIsXCJnbmFcIixcImduYlwiLFwiZ25jXCIsXCJnbmRcIixcImduZVwiLFwiZ25nXCIsXCJnbmhcIixcImduaVwiLFwiZ25qXCIsXCJnbmtcIixcImdubFwiLFwiZ25tXCIsXCJnbm5cIixcImdub1wiLFwiZ25xXCIsXCJnbnJcIixcImdudFwiLFwiZ251XCIsXCJnbndcIixcImduelwiLFwiZ29hXCIsXCJnb2JcIixcImdvY1wiLFwiZ29kXCIsXCJnb2VcIixcImdvZlwiLFwiZ29nXCIsXCJnb2hcIixcImdvaVwiLFwiZ29qXCIsXCJnb2tcIixcImdvbFwiLFwiZ29tXCIsXCJnb25cIixcImdvb1wiLFwiZ29wXCIsXCJnb3FcIixcImdvclwiLFwiZ29zXCIsXCJnb3RcIixcImdvdVwiLFwiZ293XCIsXCJnb3hcIixcImdveVwiLFwiZ296XCIsXCJncGFcIixcImdwZVwiLFwiZ3BuXCIsXCJncWFcIixcImdxaVwiLFwiZ3FuXCIsXCJncXJcIixcImdxdVwiLFwiZ3JhXCIsXCJncmJcIixcImdyY1wiLFwiZ3JkXCIsXCJncmdcIixcImdyaFwiLFwiZ3JpXCIsXCJncmpcIixcImdya1wiLFwiZ3JtXCIsXCJncm9cIixcImdycVwiLFwiZ3JyXCIsXCJncnNcIixcImdydFwiLFwiZ3J1XCIsXCJncnZcIixcImdyd1wiLFwiZ3J4XCIsXCJncnlcIixcImdyelwiLFwiZ3NlXCIsXCJnc2dcIixcImdzbFwiLFwiZ3NtXCIsXCJnc25cIixcImdzb1wiLFwiZ3NwXCIsXCJnc3NcIixcImdzd1wiLFwiZ3RhXCIsXCJndGlcIixcImd0dVwiLFwiZ3VhXCIsXCJndWJcIixcImd1Y1wiLFwiZ3VkXCIsXCJndWVcIixcImd1ZlwiLFwiZ3VnXCIsXCJndWhcIixcImd1aVwiLFwiZ3VrXCIsXCJndWxcIixcImd1bVwiLFwiZ3VuXCIsXCJndW9cIixcImd1cFwiLFwiZ3VxXCIsXCJndXJcIixcImd1c1wiLFwiZ3V0XCIsXCJndXVcIixcImd1dlwiLFwiZ3V3XCIsXCJndXhcIixcImd1elwiLFwiZ3ZhXCIsXCJndmNcIixcImd2ZVwiLFwiZ3ZmXCIsXCJndmpcIixcImd2bFwiLFwiZ3ZtXCIsXCJndm5cIixcImd2b1wiLFwiZ3ZwXCIsXCJndnJcIixcImd2c1wiLFwiZ3Z5XCIsXCJnd2FcIixcImd3YlwiLFwiZ3djXCIsXCJnd2RcIixcImd3ZVwiLFwiZ3dmXCIsXCJnd2dcIixcImd3aVwiLFwiZ3dqXCIsXCJnd21cIixcImd3blwiLFwiZ3dyXCIsXCJnd3RcIixcImd3dVwiLFwiZ3d3XCIsXCJnd3hcIixcImd4eFwiLFwiZ3lhXCIsXCJneWJcIixcImd5ZFwiLFwiZ3llXCIsXCJneWZcIixcImd5Z1wiLFwiZ3lpXCIsXCJneWxcIixcImd5bVwiLFwiZ3luXCIsXCJneW9cIixcImd5clwiLFwiZ3l5XCIsXCJneXpcIixcImd6YVwiLFwiZ3ppXCIsXCJnem5cIl1cbixbIFwiaGFcIixcImhlXCIsXCJoaVwiLFwiaG9cIixcImhyXCIsXCJodFwiLFwiaHVcIixcImh5XCIsXCJoelwiLFwiaGFhXCIsXCJoYWJcIixcImhhY1wiLFwiaGFkXCIsXCJoYWVcIixcImhhZlwiLFwiaGFnXCIsXCJoYWhcIixcImhhaVwiLFwiaGFqXCIsXCJoYWtcIixcImhhbFwiLFwiaGFtXCIsXCJoYW5cIixcImhhb1wiLFwiaGFwXCIsXCJoYXFcIixcImhhclwiLFwiaGFzXCIsXCJoYXZcIixcImhhd1wiLFwiaGF4XCIsXCJoYXlcIixcImhhelwiLFwiaGJhXCIsXCJoYmJcIixcImhiblwiLFwiaGJvXCIsXCJoYnVcIixcImhjYVwiLFwiaGNoXCIsXCJoZG5cIixcImhkc1wiLFwiaGR5XCIsXCJoZWFcIixcImhlZFwiLFwiaGVnXCIsXCJoZWhcIixcImhlaVwiLFwiaGVtXCIsXCJoZ21cIixcImhnd1wiLFwiaGhpXCIsXCJoaHJcIixcImhoeVwiLFwiaGlhXCIsXCJoaWJcIixcImhpZFwiLFwiaGlmXCIsXCJoaWdcIixcImhpaFwiLFwiaGlpXCIsXCJoaWpcIixcImhpa1wiLFwiaGlsXCIsXCJoaW1cIixcImhpb1wiLFwiaGlyXCIsXCJoaXRcIixcImhpd1wiLFwiaGl4XCIsXCJoamlcIixcImhrYVwiLFwiaGtlXCIsXCJoa2hcIixcImhra1wiLFwiaGtuXCIsXCJoa3NcIixcImhsYVwiLFwiaGxiXCIsXCJobGRcIixcImhsZVwiLFwiaGx0XCIsXCJobHVcIixcImhtYVwiLFwiaG1iXCIsXCJobWNcIixcImhtZFwiLFwiaG1lXCIsXCJobWZcIixcImhtZ1wiLFwiaG1oXCIsXCJobWlcIixcImhtalwiLFwiaG1rXCIsXCJobWxcIixcImhtbVwiLFwiaG1uXCIsXCJobXBcIixcImhtcVwiLFwiaG1yXCIsXCJobXNcIixcImhtdFwiLFwiaG11XCIsXCJobXZcIixcImhtd1wiLFwiaG14XCIsXCJobXlcIixcImhtelwiLFwiaG5hXCIsXCJobmRcIixcImhuZVwiLFwiaG5nXCIsXCJobmhcIixcImhuaVwiLFwiaG5qXCIsXCJobm5cIixcImhub1wiLFwiaG5zXCIsXCJobnVcIixcImhvYVwiLFwiaG9iXCIsXCJob2NcIixcImhvZFwiLFwiaG9lXCIsXCJob2hcIixcImhvaVwiLFwiaG9qXCIsXCJob2tcIixcImhvbFwiLFwiaG9tXCIsXCJob29cIixcImhvcFwiLFwiaG9yXCIsXCJob3NcIixcImhvdFwiLFwiaG92XCIsXCJob3dcIixcImhveVwiLFwiaG96XCIsXCJocG9cIixcImhwc1wiLFwiaHJhXCIsXCJocmNcIixcImhyZVwiLFwiaHJrXCIsXCJocm1cIixcImhyb1wiLFwiaHJwXCIsXCJocnJcIixcImhydFwiLFwiaHJ1XCIsXCJocndcIixcImhyeFwiLFwiaHJ6XCIsXCJoc2JcIixcImhzaFwiLFwiaHNsXCIsXCJoc25cIixcImhzc1wiLFwiaHRpXCIsXCJodG9cIixcImh0c1wiLFwiaHR1XCIsXCJodHhcIixcImh1YlwiLFwiaHVjXCIsXCJodWRcIixcImh1ZVwiLFwiaHVmXCIsXCJodWdcIixcImh1aFwiLFwiaHVpXCIsXCJodWpcIixcImh1a1wiLFwiaHVsXCIsXCJodW1cIixcImh1b1wiLFwiaHVwXCIsXCJodXFcIixcImh1clwiLFwiaHVzXCIsXCJodXRcIixcImh1dVwiLFwiaHV2XCIsXCJodXdcIixcImh1eFwiLFwiaHV5XCIsXCJodXpcIixcImh2Y1wiLFwiaHZlXCIsXCJodmtcIixcImh2blwiLFwiaHZ2XCIsXCJod2FcIixcImh3Y1wiLFwiaHdvXCIsXCJoeWFcIixcImh5d1wiLFwiaHl4XCJdXG4sWyBcImlhXCIsXCJpZFwiLFwiaWVcIixcImlnXCIsXCJpaVwiLFwiaWtcIixcImluXCIsXCJpb1wiLFwiaXNcIixcIml0XCIsXCJpdVwiLFwiaXdcIixcImlhaVwiLFwiaWFuXCIsXCJpYXBcIixcImlhclwiLFwiaWJhXCIsXCJpYmJcIixcImliZFwiLFwiaWJlXCIsXCJpYmdcIixcImliaFwiLFwiaWJpXCIsXCJpYmxcIixcImlibVwiLFwiaWJuXCIsXCJpYnJcIixcImlidVwiLFwiaWJ5XCIsXCJpY2FcIixcImljaFwiLFwiaWNsXCIsXCJpY3JcIixcImlkYVwiLFwiaWRiXCIsXCJpZGNcIixcImlkZFwiLFwiaWRlXCIsXCJpZGlcIixcImlkclwiLFwiaWRzXCIsXCJpZHRcIixcImlkdVwiLFwiaWZhXCIsXCJpZmJcIixcImlmZVwiLFwiaWZmXCIsXCJpZmtcIixcImlmbVwiLFwiaWZ1XCIsXCJpZnlcIixcImlnYlwiLFwiaWdlXCIsXCJpZ2dcIixcImlnbFwiLFwiaWdtXCIsXCJpZ25cIixcImlnb1wiLFwiaWdzXCIsXCJpZ3dcIixcImloYlwiLFwiaWhpXCIsXCJpaHBcIixcImlod1wiLFwiaWluXCIsXCJpaXJcIixcImlqY1wiLFwiaWplXCIsXCJpampcIixcImlqblwiLFwiaWpvXCIsXCJpanNcIixcImlrZVwiLFwiaWtpXCIsXCJpa2tcIixcImlrbFwiLFwiaWtvXCIsXCJpa3BcIixcImlrclwiLFwiaWtzXCIsXCJpa3RcIixcImlrdlwiLFwiaWt3XCIsXCJpa3hcIixcImlrelwiLFwiaWxhXCIsXCJpbGJcIixcImlsZ1wiLFwiaWxpXCIsXCJpbGtcIixcImlsbFwiLFwiaWxtXCIsXCJpbG9cIixcImlscFwiLFwiaWxzXCIsXCJpbHVcIixcImlsdlwiLFwiaWx3XCIsXCJpbWFcIixcImltZVwiLFwiaW1pXCIsXCJpbWxcIixcImltblwiLFwiaW1vXCIsXCJpbXJcIixcImltc1wiLFwiaW15XCIsXCJpbmJcIixcImluY1wiLFwiaW5lXCIsXCJpbmdcIixcImluaFwiLFwiaW5qXCIsXCJpbmxcIixcImlubVwiLFwiaW5uXCIsXCJpbm9cIixcImlucFwiLFwiaW5zXCIsXCJpbnRcIixcImluelwiLFwiaW9yXCIsXCJpb3VcIixcImlvd1wiLFwiaXBpXCIsXCJpcG9cIixcImlxdVwiLFwiaXF3XCIsXCJpcmFcIixcImlyZVwiLFwiaXJoXCIsXCJpcmlcIixcImlya1wiLFwiaXJuXCIsXCJpcm9cIixcImlyclwiLFwiaXJ1XCIsXCJpcnhcIixcImlyeVwiLFwiaXNhXCIsXCJpc2NcIixcImlzZFwiLFwiaXNlXCIsXCJpc2dcIixcImlzaFwiLFwiaXNpXCIsXCJpc2tcIixcImlzbVwiLFwiaXNuXCIsXCJpc29cIixcImlzclwiLFwiaXN0XCIsXCJpc3VcIixcIml0YlwiLFwiaXRjXCIsXCJpdGRcIixcIml0ZVwiLFwiaXRpXCIsXCJpdGtcIixcIml0bFwiLFwiaXRtXCIsXCJpdG9cIixcIml0clwiLFwiaXRzXCIsXCJpdHRcIixcIml0dlwiLFwiaXR3XCIsXCJpdHhcIixcIml0eVwiLFwiaXR6XCIsXCJpdW1cIixcIml2YlwiLFwiaXZ2XCIsXCJpd2tcIixcIml3bVwiLFwiaXdvXCIsXCJpd3NcIixcIml4Y1wiLFwiaXhsXCIsXCJpeWFcIixcIml5b1wiLFwiaXl4XCIsXCJpemhcIixcIml6aVwiLFwiaXpyXCIsXCJpenpcIl1cbixbIFwiamFcIixcImppXCIsXCJqdlwiLFwiandcIixcImphYVwiLFwiamFiXCIsXCJqYWNcIixcImphZFwiLFwiamFlXCIsXCJqYWZcIixcImphaFwiLFwiamFqXCIsXCJqYWtcIixcImphbFwiLFwiamFtXCIsXCJqYW5cIixcImphb1wiLFwiamFxXCIsXCJqYXJcIixcImphc1wiLFwiamF0XCIsXCJqYXVcIixcImpheFwiLFwiamF5XCIsXCJqYXpcIixcImpiZVwiLFwiamJpXCIsXCJqYmpcIixcImpia1wiLFwiamJtXCIsXCJqYm5cIixcImpib1wiLFwiamJyXCIsXCJqYnRcIixcImpidVwiLFwiamJ3XCIsXCJqY3NcIixcImpjdFwiLFwiamRhXCIsXCJqZGdcIixcImpkdFwiLFwiamViXCIsXCJqZWVcIixcImplZ1wiLFwiamVoXCIsXCJqZWlcIixcImpla1wiLFwiamVsXCIsXCJqZW5cIixcImplclwiLFwiamV0XCIsXCJqZXVcIixcImpnYlwiLFwiamdlXCIsXCJqZ2tcIixcImpnb1wiLFwiamhpXCIsXCJqaHNcIixcImppYVwiLFwiamliXCIsXCJqaWNcIixcImppZFwiLFwiamllXCIsXCJqaWdcIixcImppaFwiLFwiamlpXCIsXCJqaWxcIixcImppbVwiLFwiamlvXCIsXCJqaXFcIixcImppdFwiLFwiaml1XCIsXCJqaXZcIixcImppeVwiLFwiamplXCIsXCJqanJcIixcImprYVwiLFwiamttXCIsXCJqa29cIixcImprcFwiLFwiamtyXCIsXCJqa3NcIixcImprdVwiLFwiamxlXCIsXCJqbHNcIixcImptYVwiLFwiam1iXCIsXCJqbWNcIixcImptZFwiLFwiam1pXCIsXCJqbWxcIixcImptblwiLFwiam1yXCIsXCJqbXNcIixcImptd1wiLFwiam14XCIsXCJqbmFcIixcImpuZFwiLFwiam5nXCIsXCJqbmlcIixcImpualwiLFwiam5sXCIsXCJqbnNcIixcImpvYlwiLFwiam9kXCIsXCJqb2dcIixcImpvclwiLFwiam9zXCIsXCJqb3dcIixcImpwYVwiLFwianByXCIsXCJqcHhcIixcImpxclwiLFwianJhXCIsXCJqcmJcIixcImpyclwiLFwianJ0XCIsXCJqcnVcIixcImpzbFwiLFwianVhXCIsXCJqdWJcIixcImp1Y1wiLFwianVkXCIsXCJqdWhcIixcImp1aVwiLFwianVrXCIsXCJqdWxcIixcImp1bVwiLFwianVuXCIsXCJqdW9cIixcImp1cFwiLFwianVyXCIsXCJqdXNcIixcImp1dFwiLFwianV1XCIsXCJqdXdcIixcImp1eVwiLFwianZkXCIsXCJqdm5cIixcImp3aVwiLFwianlhXCIsXCJqeWVcIixcImp5eVwiXVxuLFsgXCJrYVwiLFwia2dcIixcImtpXCIsXCJralwiLFwia2tcIixcImtsXCIsXCJrbVwiLFwia25cIixcImtvXCIsXCJrclwiLFwia3NcIixcImt1XCIsXCJrdlwiLFwia3dcIixcImt5XCIsXCJrYWFcIixcImthYlwiLFwia2FjXCIsXCJrYWRcIixcImthZVwiLFwia2FmXCIsXCJrYWdcIixcImthaFwiLFwia2FpXCIsXCJrYWpcIixcImtha1wiLFwia2FtXCIsXCJrYW9cIixcImthcFwiLFwia2FxXCIsXCJrYXJcIixcImthdlwiLFwia2F3XCIsXCJrYXhcIixcImtheVwiLFwia2JhXCIsXCJrYmJcIixcImtiY1wiLFwia2JkXCIsXCJrYmVcIixcImtiZlwiLFwia2JnXCIsXCJrYmhcIixcImtiaVwiLFwia2JqXCIsXCJrYmtcIixcImtibFwiLFwia2JtXCIsXCJrYm5cIixcImtib1wiLFwia2JwXCIsXCJrYnFcIixcImticlwiLFwia2JzXCIsXCJrYnRcIixcImtidVwiLFwia2J2XCIsXCJrYndcIixcImtieFwiLFwia2J5XCIsXCJrYnpcIixcImtjYVwiLFwia2NiXCIsXCJrY2NcIixcImtjZFwiLFwia2NlXCIsXCJrY2ZcIixcImtjZ1wiLFwia2NoXCIsXCJrY2lcIixcImtjalwiLFwia2NrXCIsXCJrY2xcIixcImtjbVwiLFwia2NuXCIsXCJrY29cIixcImtjcFwiLFwia2NxXCIsXCJrY3JcIixcImtjc1wiLFwia2N0XCIsXCJrY3VcIixcImtjdlwiLFwia2N3XCIsXCJrY3hcIixcImtjeVwiLFwia2N6XCIsXCJrZGFcIixcImtkY1wiLFwia2RkXCIsXCJrZGVcIixcImtkZlwiLFwia2RnXCIsXCJrZGhcIixcImtkaVwiLFwia2RqXCIsXCJrZGtcIixcImtkbFwiLFwia2RtXCIsXCJrZG5cIixcImtkb1wiLFwia2RwXCIsXCJrZHFcIixcImtkclwiLFwia2R0XCIsXCJrZHVcIixcImtkdlwiLFwia2R3XCIsXCJrZHhcIixcImtkeVwiLFwia2R6XCIsXCJrZWFcIixcImtlYlwiLFwia2VjXCIsXCJrZWRcIixcImtlZVwiLFwia2VmXCIsXCJrZWdcIixcImtlaFwiLFwia2VpXCIsXCJrZWpcIixcImtla1wiLFwia2VsXCIsXCJrZW1cIixcImtlblwiLFwia2VvXCIsXCJrZXBcIixcImtlcVwiLFwia2VyXCIsXCJrZXNcIixcImtldFwiLFwia2V1XCIsXCJrZXZcIixcImtld1wiLFwia2V4XCIsXCJrZXlcIixcImtlelwiLFwia2ZhXCIsXCJrZmJcIixcImtmY1wiLFwia2ZkXCIsXCJrZmVcIixcImtmZlwiLFwia2ZnXCIsXCJrZmhcIixcImtmaVwiLFwia2ZqXCIsXCJrZmtcIixcImtmbFwiLFwia2ZtXCIsXCJrZm5cIixcImtmb1wiLFwia2ZwXCIsXCJrZnFcIixcImtmclwiLFwia2ZzXCIsXCJrZnRcIixcImtmdVwiLFwia2Z2XCIsXCJrZndcIixcImtmeFwiLFwia2Z5XCIsXCJrZnpcIixcImtnYVwiLFwia2diXCIsXCJrZ2NcIixcImtnZFwiLFwia2dlXCIsXCJrZ2ZcIixcImtnZ1wiLFwia2doXCIsXCJrZ2lcIixcImtnalwiLFwia2drXCIsXCJrZ2xcIixcImtnbVwiLFwia2duXCIsXCJrZ29cIixcImtncFwiLFwia2dxXCIsXCJrZ3JcIixcImtnc1wiLFwia2d0XCIsXCJrZ3VcIixcImtndlwiLFwia2d3XCIsXCJrZ3hcIixcImtneVwiLFwia2hhXCIsXCJseWdcIixcImtoYlwiLFwia2hjXCIsXCJraGRcIixcImtoZVwiLFwia2hmXCIsXCJraGdcIixcImtoaFwiLFwia2hpXCIsXCJraGpcIixcImtoa1wiLFwia2hsXCIsXCJraG5cIixcImtob1wiLFwia2hwXCIsXCJraHFcIixcImtoclwiLFwia2hzXCIsXCJraHRcIixcImtodVwiLFwia2h2XCIsXCJraHdcIixcImtoeFwiLFwia2h5XCIsXCJraHpcIixcImtpYVwiLFwia2liXCIsXCJraWNcIixcImtpZFwiLFwia2llXCIsXCJraWZcIixcImtpZ1wiLFwia2loXCIsXCJraWlcIixcImtpalwiLFwia2lsXCIsXCJraW1cIixcImtpb1wiLFwia2lwXCIsXCJraXFcIixcImtpc1wiLFwia2l0XCIsXCJraXVcIixcImtpdlwiLFwia2l3XCIsXCJraXhcIixcImtpeVwiLFwia2l6XCIsXCJramFcIixcImtqYlwiLFwia2pjXCIsXCJramRcIixcImtqZVwiLFwia2pmXCIsXCJramdcIixcImtqaFwiLFwia2ppXCIsXCJrampcIixcImtqa1wiLFwia2psXCIsXCJram1cIixcImtqblwiLFwia2pvXCIsXCJranBcIixcImtqcVwiLFwia2pyXCIsXCJranNcIixcImtqdFwiLFwia2p1XCIsXCJranZcIixcImtqeFwiLFwia2p5XCIsXCJranpcIixcImtrYVwiLFwia2tiXCIsXCJra2NcIixcImtrZFwiLFwia2tlXCIsXCJra2ZcIixcImtrZ1wiLFwia2toXCIsXCJra2lcIixcImtralwiLFwia2trXCIsXCJra2xcIixcImtrbVwiLFwia2tuXCIsXCJra29cIixcImtrcFwiLFwia2txXCIsXCJra3JcIixcImtrc1wiLFwia2t0XCIsXCJra3VcIixcImtrdlwiLFwia2t3XCIsXCJra3hcIixcImtreVwiLFwia2t6XCIsXCJrbGFcIixcImtsYlwiLFwia2xjXCIsXCJrbGRcIixcImtsZVwiLFwia2xmXCIsXCJrbGdcIixcImtsaFwiLFwia2xpXCIsXCJrbGpcIixcImtsa1wiLFwia2xsXCIsXCJrbG1cIixcImtsblwiLFwia2xvXCIsXCJrbHBcIixcImtscVwiLFwia2xyXCIsXCJrbHNcIixcImtsdFwiLFwia2x1XCIsXCJrbHZcIixcImtsd1wiLFwia2x4XCIsXCJrbHlcIixcImtselwiLFwia21hXCIsXCJrbWJcIixcImttY1wiLFwia21kXCIsXCJrbWVcIixcImttZlwiLFwia21nXCIsXCJrbWhcIixcImttaVwiLFwia21qXCIsXCJrbWtcIixcImttbFwiLFwia21tXCIsXCJrbW5cIixcImttb1wiLFwia21wXCIsXCJrbXFcIixcImttclwiLFwia21zXCIsXCJrbXRcIixcImttdVwiLFwia212XCIsXCJrbXdcIixcImtteFwiLFwia215XCIsXCJrbXpcIixcImtuYVwiLFwia25iXCIsXCJrbmNcIixcImtuZFwiLFwia25lXCIsXCJrbmZcIixcImtuZ1wiLFwia25pXCIsXCJrbmpcIixcImtua1wiLFwia25sXCIsXCJrbm1cIixcImtublwiLFwia25vXCIsXCJrbnBcIixcImtucVwiLFwia25yXCIsXCJrbnNcIixcImtudFwiLFwia251XCIsXCJrbnZcIixcImtud1wiLFwia254XCIsXCJrbnlcIixcImtuelwiLFwia29hXCIsXCJrb2NcIixcImtvZFwiLFwia29lXCIsXCJrb2ZcIixcImtvZ1wiLFwia29oXCIsXCJrb2lcIixcImtvalwiLFwia29rXCIsXCJrb2xcIixcImtvb1wiLFwia29wXCIsXCJrb3FcIixcImtvc1wiLFwia290XCIsXCJrb3VcIixcImtvdlwiLFwia293XCIsXCJrb3hcIixcImtveVwiLFwia296XCIsXCJrcGFcIixcImtwYlwiLFwia3BjXCIsXCJrcGRcIixcImtwZVwiLFwia3BmXCIsXCJrcGdcIixcImtwaFwiLFwia3BpXCIsXCJrcGpcIixcImtwa1wiLFwia3BsXCIsXCJrcG1cIixcImtwblwiLFwia3BvXCIsXCJrcHBcIixcImtwcVwiLFwia3ByXCIsXCJrcHNcIixcImtwdFwiLFwia3B1XCIsXCJrcHZcIixcImtwd1wiLFwia3B4XCIsXCJrcHlcIixcImtwelwiLFwia3FhXCIsXCJrcWJcIixcImtxY1wiLFwia3FkXCIsXCJrcWVcIixcImtxZlwiLFwia3FnXCIsXCJrcWhcIixcImtxaVwiLFwia3FqXCIsXCJrcWtcIixcImtxbFwiLFwia3FtXCIsXCJrcW5cIixcImtxb1wiLFwia3FwXCIsXCJrcXFcIixcImtxclwiLFwia3FzXCIsXCJrcXRcIixcImtxdVwiLFwia3F2XCIsXCJrcXdcIixcImtxeFwiLFwia3F5XCIsXCJrcXpcIixcImtyYVwiLFwia3JiXCIsXCJrcmNcIixcImtyZFwiLFwia3JlXCIsXCJrcmZcIixcImtyaFwiLFwia3JpXCIsXCJrcmpcIixcImtya1wiLFwia3JsXCIsXCJrcm1cIixcImtyblwiLFwia3JvXCIsXCJrcnBcIixcImtyclwiLFwia3JzXCIsXCJrcnRcIixcImtydVwiLFwia3J2XCIsXCJrcndcIixcImtyeFwiLFwia3J5XCIsXCJrcnpcIixcImtzYVwiLFwia3NiXCIsXCJrc2NcIixcImtzZFwiLFwia3NlXCIsXCJrc2ZcIixcImtzZ1wiLFwia3NoXCIsXCJrc2lcIixcImtzalwiLFwia3NrXCIsXCJrc2xcIixcImtzbVwiLFwia3NuXCIsXCJrc29cIixcImtzcFwiLFwia3NxXCIsXCJrc3JcIixcImtzc1wiLFwia3N0XCIsXCJrc3VcIixcImtzdlwiLFwia3N3XCIsXCJrc3hcIixcImtzeVwiLFwia3N6XCIsXCJrdGFcIixcImt0YlwiLFwia3RjXCIsXCJrdGRcIixcImt0ZVwiLFwia3RmXCIsXCJrdGdcIixcImt0aFwiLFwia3RpXCIsXCJrdGpcIixcImt0a1wiLFwia3RsXCIsXCJrdG1cIixcImt0blwiLFwia3RvXCIsXCJrdHBcIixcImt0cVwiLFwia3RyXCIsXCJrdHNcIixcImt0dFwiLFwia3R1XCIsXCJrdHZcIixcImt0d1wiLFwia3R4XCIsXCJrdHlcIixcImt0elwiLFwia3ViXCIsXCJrdWNcIixcImt1ZFwiLFwia3VlXCIsXCJrdWZcIixcImt1Z1wiLFwia3VoXCIsXCJrdWlcIixcImt1alwiLFwia3VrXCIsXCJrdWxcIixcImt1bVwiLFwia3VuXCIsXCJrdW9cIixcImt1cFwiLFwia3VxXCIsXCJrdXNcIixcImt1dFwiLFwia3V1XCIsXCJrdXZcIixcImt1d1wiLFwia3V4XCIsXCJrdXlcIixcImt1elwiLFwia3ZhXCIsXCJrdmJcIixcImt2Y1wiLFwia3ZkXCIsXCJrdmVcIixcImt2ZlwiLFwia3ZnXCIsXCJrdmhcIixcImt2aVwiLFwia3ZqXCIsXCJrdmtcIixcImt2bFwiLFwia3ZtXCIsXCJrdm5cIixcImt2b1wiLFwia3ZwXCIsXCJrdnFcIixcImt2clwiLFwia3ZzXCIsXCJrdnRcIixcImt2dVwiLFwia3Z2XCIsXCJrdndcIixcImt2eFwiLFwia3Z5XCIsXCJrdnpcIixcImt3YVwiLFwia3diXCIsXCJrd2NcIixcImt3ZFwiLFwia3dlXCIsXCJrd2ZcIixcImt3Z1wiLFwia3doXCIsXCJrd2lcIixcImt3alwiLFwia3drXCIsXCJrd2xcIixcImt3bVwiLFwia3duXCIsXCJrd29cIixcImt3cFwiLFwia3dxXCIsXCJrd3JcIixcImt3c1wiLFwia3d0XCIsXCJrd3VcIixcImt3dlwiLFwia3d3XCIsXCJrd3hcIixcImt3eVwiLFwia3d6XCIsXCJreGFcIixcImt4YlwiLFwia3hjXCIsXCJreGRcIixcImt4ZVwiLFwia3hmXCIsXCJreGhcIixcImt4aVwiLFwia3hqXCIsXCJreGtcIixcImt4bFwiLFwia3htXCIsXCJreG5cIixcImt4b1wiLFwia3hwXCIsXCJreHFcIixcImt4clwiLFwia3hzXCIsXCJreHRcIixcImt4dVwiLFwia3h2XCIsXCJreHdcIixcImt4eFwiLFwia3h5XCIsXCJreHpcIixcImt5YVwiLFwia3liXCIsXCJreWNcIixcImt5ZFwiLFwia3llXCIsXCJreWZcIixcImt5Z1wiLFwia3loXCIsXCJreWlcIixcImt5alwiLFwia3lrXCIsXCJreWxcIixcImt5bVwiLFwia3luXCIsXCJreW9cIixcImt5cFwiLFwia3lxXCIsXCJreXJcIixcImt5c1wiLFwia3l0XCIsXCJreXVcIixcImt5dlwiLFwia3l3XCIsXCJreXhcIixcImt5eVwiLFwia3l6XCIsXCJremFcIixcImt6YlwiLFwia3pjXCIsXCJremRcIixcImt6ZVwiLFwia3pmXCIsXCJremdcIixcImt6aFwiLFwia3ppXCIsXCJrempcIixcImt6a1wiLFwia3psXCIsXCJrem1cIixcImt6blwiLFwia3pvXCIsXCJrenBcIixcImt6cVwiLFwia3pyXCIsXCJrenNcIixcImt6dFwiLFwia3p1XCIsXCJrenZcIixcImt6d1wiLFwia3p4XCIsXCJrenlcIixcImt6elwiXVxuLFsgXCJsYVwiLFwibGJcIixcImxnXCIsXCJsaVwiLFwibG5cIixcImxvXCIsXCJsdFwiLFwibHVcIixcImx2XCIsXCJsYWFcIixcImxhYlwiLFwibGFjXCIsXCJsYWRcIixcImxhZVwiLFwibGFmXCIsXCJsYWdcIixcImxhaFwiLFwibGFpXCIsXCJsYWpcIixcImxha1wiLFwibGFsXCIsXCJsYW1cIixcImxhblwiLFwibGFwXCIsXCJsYXFcIixcImxhclwiLFwibGFzXCIsXCJsYXVcIixcImxhd1wiLFwibGF4XCIsXCJsYXlcIixcImxhelwiLFwibGJhXCIsXCJsYmJcIixcImxiY1wiLFwibGJlXCIsXCJsYmZcIixcImxiZ1wiLFwibGJpXCIsXCJsYmpcIixcImxia1wiLFwibGJsXCIsXCJsYm1cIixcImxiblwiLFwibGJvXCIsXCJsYnFcIixcImxiclwiLFwibGJzXCIsXCJsYnRcIixcImxidVwiLFwibGJ2XCIsXCJsYndcIixcImxieFwiLFwibGJ5XCIsXCJsYnpcIixcImxjY1wiLFwibGNkXCIsXCJsY2VcIixcImxjZlwiLFwibGNoXCIsXCJsY2xcIixcImxjbVwiLFwibGNwXCIsXCJsY3FcIixcImxjc1wiLFwibGRhXCIsXCJsZGJcIixcImxkZFwiLFwibGRnXCIsXCJsZGhcIixcImxkaVwiLFwibGRqXCIsXCJsZGtcIixcImxkbFwiLFwibGRtXCIsXCJsZG5cIixcImxkb1wiLFwibGRwXCIsXCJsZHFcIixcImxlYVwiLFwibGViXCIsXCJsZWNcIixcImxlZFwiLFwibGVlXCIsXCJsZWZcIixcImxlZ1wiLFwibGVoXCIsXCJsZWlcIixcImxlalwiLFwibGVrXCIsXCJsZWxcIixcImxlbVwiLFwibGVuXCIsXCJsZW9cIixcImxlcFwiLFwibGVxXCIsXCJsZXJcIixcImxlc1wiLFwibGV0XCIsXCJsZXVcIixcImxldlwiLFwibGV3XCIsXCJsZXhcIixcImxleVwiLFwibGV6XCIsXCJsZmFcIixcImxmblwiLFwibGdhXCIsXCJsZ2JcIixcImxnZ1wiLFwibGdoXCIsXCJsZ2lcIixcImxna1wiLFwibGdsXCIsXCJsZ21cIixcImxnblwiLFwibGdxXCIsXCJsZ3JcIixcImxndFwiLFwibGd1XCIsXCJsZ3pcIixcImxoYVwiLFwibGhoXCIsXCJsaGlcIixcImxobFwiLFwibGhtXCIsXCJsaG5cIixcImxocFwiLFwibGhzXCIsXCJsaHRcIixcImxodVwiLFwibGlhXCIsXCJsaWJcIixcImxpY1wiLFwibGlkXCIsXCJsaWVcIixcImxpZlwiLFwibGlnXCIsXCJsaWhcIixcImxpaVwiLFwibGlqXCIsXCJsaWtcIixcImxpbFwiLFwibGlvXCIsXCJsaXBcIixcImxpcVwiLFwibGlyXCIsXCJsaXNcIixcImxpdVwiLFwibGl2XCIsXCJsaXdcIixcImxpeFwiLFwibGl5XCIsXCJsaXpcIixcImxqYVwiLFwibGplXCIsXCJsamlcIixcImxqbFwiLFwibGpwXCIsXCJsandcIixcImxqeFwiLFwibGthXCIsXCJsa2JcIixcImxrY1wiLFwibGtkXCIsXCJsa2VcIixcImxraFwiLFwibGtpXCIsXCJsa2pcIixcImxrbFwiLFwibGttXCIsXCJsa25cIixcImxrb1wiLFwibGtyXCIsXCJsa3NcIixcImxrdFwiLFwibGt1XCIsXCJsa3lcIixcImxsYVwiLFwibGxiXCIsXCJsbGNcIixcImxsZFwiLFwibGxlXCIsXCJsbGZcIixcImxsZ1wiLFwibGxoXCIsXCJsbGlcIixcImxsalwiLFwibGxrXCIsXCJsbGxcIixcImxsbVwiLFwibGxuXCIsXCJsbG9cIixcImxscFwiLFwibGxxXCIsXCJsbHNcIixcImxsdVwiLFwibGx4XCIsXCJsbWFcIixcImxtYlwiLFwibG1jXCIsXCJsbWRcIixcImxtZVwiLFwibG1mXCIsXCJsbWdcIixcImxtaFwiLFwibG1pXCIsXCJsbWpcIixcImxta1wiLFwibG1sXCIsXCJsbW1cIixcImxtblwiLFwibG1vXCIsXCJsbXBcIixcImxtcVwiLFwibG1yXCIsXCJsbXVcIixcImxtdlwiLFwibG13XCIsXCJsbXhcIixcImxteVwiLFwibG16XCIsXCJsbmFcIixcImxuYlwiLFwibG5kXCIsXCJsbmdcIixcImxuaFwiLFwibG5pXCIsXCJsbmpcIixcImxubFwiLFwibG5tXCIsXCJsbm5cIixcImxub1wiLFwibG5zXCIsXCJsbnVcIixcImxud1wiLFwibG56XCIsXCJsb2FcIixcImxvYlwiLFwibG9jXCIsXCJsb2VcIixcImxvZlwiLFwibG9nXCIsXCJsb2hcIixcImxvaVwiLFwibG9qXCIsXCJsb2tcIixcImxvbFwiLFwibG9tXCIsXCJsb25cIixcImxvb1wiLFwibG9wXCIsXCJsb3FcIixcImxvclwiLFwibG9zXCIsXCJsb3RcIixcImxvdVwiLFwibG92XCIsXCJsb3dcIixcImxveFwiLFwibG95XCIsXCJsb3pcIixcImxwYVwiLFwibHBlXCIsXCJscG5cIixcImxwb1wiLFwibHB4XCIsXCJscmFcIixcImxyY1wiLFwibHJlXCIsXCJscmdcIixcImxyaVwiLFwibHJrXCIsXCJscmxcIixcImxybVwiLFwibHJuXCIsXCJscm9cIixcImxyclwiLFwibHJ0XCIsXCJscnZcIixcImxyelwiLFwibHNhXCIsXCJsc2JcIixcImxzZFwiLFwibHNlXCIsXCJsc2dcIixcImxzaFwiLFwibHNpXCIsXCJsc2xcIixcImxzbVwiLFwibHNuXCIsXCJsc29cIixcImxzcFwiLFwibHNyXCIsXCJsc3NcIixcImxzdFwiLFwibHN2XCIsXCJsc3lcIixcImx0Y1wiLFwibHRnXCIsXCJsdGhcIixcImx0aVwiLFwibHRuXCIsXCJsdG9cIixcImx0c1wiLFwibHR1XCIsXCJsdWFcIixcImx1Y1wiLFwibHVkXCIsXCJsdWVcIixcImx1ZlwiLFwibHVpXCIsXCJsdWpcIixcImx1a1wiLFwibHVsXCIsXCJsdW1cIixcImx1blwiLFwibHVvXCIsXCJsdXBcIixcImx1cVwiLFwibHVyXCIsXCJsdXNcIixcImx1dFwiLFwibHV1XCIsXCJsdXZcIixcImx1d1wiLFwibHV5XCIsXCJsdXpcIixcImx2YVwiLFwibHZpXCIsXCJsdmtcIixcImx2c1wiLFwibHZ1XCIsXCJsd2FcIixcImx3ZVwiLFwibHdnXCIsXCJsd2hcIixcImx3bFwiLFwibHdtXCIsXCJsd29cIixcImx3c1wiLFwibHd0XCIsXCJsd3VcIixcImx3d1wiLFwibHhtXCIsXCJseWFcIixcImx5Z1wiLFwibHluXCIsXCJsemhcIixcImx6bFwiLFwibHpuXCIsXCJsenpcIl1cbixbIFwibWdcIixcIm1oXCIsXCJtaVwiLFwibWtcIixcIm1sXCIsXCJtblwiLFwibW9cIixcIm1yXCIsXCJtc1wiLFwibXRcIixcIm15XCIsXCJtYWFcIixcIm1hYlwiLFwibWFkXCIsXCJtYWVcIixcIm1hZlwiLFwibWFnXCIsXCJtYWlcIixcIm1halwiLFwibWFrXCIsXCJtYW1cIixcIm1hblwiLFwibWFwXCIsXCJtYXFcIixcIm1hc1wiLFwibWF0XCIsXCJtYXVcIixcIm1hdlwiLFwibWF3XCIsXCJtYXhcIixcIm1helwiLFwibWJhXCIsXCJtYmJcIixcIm1iY1wiLFwibWJkXCIsXCJtYmVcIixcIm1iZlwiLFwibWJoXCIsXCJtYmlcIixcIm1ialwiLFwibWJrXCIsXCJtYmxcIixcIm1ibVwiLFwibWJuXCIsXCJtYm9cIixcIm1icFwiLFwibWJxXCIsXCJtYnJcIixcIm1ic1wiLFwibWJ0XCIsXCJtYnVcIixcIm1idlwiLFwibWJ3XCIsXCJtYnhcIixcIm1ieVwiLFwibWJ6XCIsXCJtY2FcIixcIm1jYlwiLFwibWNjXCIsXCJtY2RcIixcIm1jZVwiLFwibWNmXCIsXCJtY2dcIixcIm1jaFwiLFwibWNpXCIsXCJtY2pcIixcIm1ja1wiLFwibWNsXCIsXCJtY21cIixcIm1jblwiLFwibWNvXCIsXCJtY3BcIixcIm1jcVwiLFwibWNyXCIsXCJtY3NcIixcIm1jdFwiLFwibWN1XCIsXCJtY3ZcIixcIm1jd1wiLFwibWN4XCIsXCJtY3lcIixcIm1jelwiLFwibWRhXCIsXCJtZGJcIixcIm1kY1wiLFwibWRkXCIsXCJtZGVcIixcIm1kZlwiLFwibWRnXCIsXCJtZGhcIixcIm1kaVwiLFwibWRqXCIsXCJtZGtcIixcIm1kbFwiLFwibWRtXCIsXCJtZG5cIixcIm1kcFwiLFwibWRxXCIsXCJtZHJcIixcIm1kc1wiLFwibWR0XCIsXCJtZHVcIixcIm1kdlwiLFwibWR3XCIsXCJtZHhcIixcIm1keVwiLFwibWR6XCIsXCJtZWFcIixcIm1lYlwiLFwibWVjXCIsXCJtZWRcIixcIm1lZVwiLFwibWVmXCIsXCJtZWdcIixcIm1laFwiLFwibWVpXCIsXCJtZWpcIixcIm1la1wiLFwibWVsXCIsXCJtZW1cIixcIm1lblwiLFwibWVvXCIsXCJtZXBcIixcIm1lcVwiLFwibWVyXCIsXCJtZXNcIixcIm1ldFwiLFwibWV1XCIsXCJtZXZcIixcIm1ld1wiLFwibWV5XCIsXCJtZXpcIixcIm1mYVwiLFwibWZiXCIsXCJtZmNcIixcIm1mZFwiLFwibWZlXCIsXCJtZmZcIixcIm1mZ1wiLFwibWZoXCIsXCJtZmlcIixcIm1malwiLFwibWZrXCIsXCJtZmxcIixcIm1mbVwiLFwibWZuXCIsXCJtZm9cIixcIm1mcFwiLFwibWZxXCIsXCJtZnJcIixcIm1mc1wiLFwibWZ0XCIsXCJtZnVcIixcIm1mdlwiLFwibWZ3XCIsXCJtZnhcIixcIm1meVwiLFwibWZ6XCIsXCJtZ2FcIixcIm1nYlwiLFwibWdjXCIsXCJtZ2RcIixcIm1nZVwiLFwibWdmXCIsXCJtZ2dcIixcIm1naFwiLFwibWdpXCIsXCJtZ2pcIixcIm1na1wiLFwibWdsXCIsXCJtZ21cIixcIm1nblwiLFwibWdvXCIsXCJtZ3BcIixcIm1ncVwiLFwibWdyXCIsXCJtZ3NcIixcIm1ndFwiLFwibWd1XCIsXCJtZ3ZcIixcIm1nd1wiLFwibWd4XCIsXCJtZ3lcIixcIm1nelwiLFwibWhhXCIsXCJtaGJcIixcIm1oY1wiLFwibWhkXCIsXCJtaGVcIixcIm1oZlwiLFwibWhnXCIsXCJtaGhcIixcIm1oaVwiLFwibWhqXCIsXCJtaGtcIixcIm1obFwiLFwibWhtXCIsXCJtaG5cIixcIm1ob1wiLFwibWhwXCIsXCJtaHFcIixcIm1oclwiLFwibWhzXCIsXCJtaHRcIixcIm1odVwiLFwibWh3XCIsXCJtaHhcIixcIm1oeVwiLFwibWh6XCIsXCJtaWFcIixcIm1pYlwiLFwibWljXCIsXCJtaWRcIixcIm1pZVwiLFwibWlmXCIsXCJtaWdcIixcIm1paFwiLFwibWlpXCIsXCJtaWpcIixcIm1pa1wiLFwibWlsXCIsXCJtaW1cIixcIm1pblwiLFwibWlvXCIsXCJtaXBcIixcIm1pcVwiLFwibWlyXCIsXCJtaXNcIixcIm1pdFwiLFwibWl1XCIsXCJtaXdcIixcIm1peFwiLFwibWl5XCIsXCJtaXpcIixcIm1qYVwiLFwibWpiXCIsXCJtamNcIixcIm1qZFwiLFwibWplXCIsXCJtamdcIixcIm1qaFwiLFwibWppXCIsXCJtampcIixcIm1qa1wiLFwibWpsXCIsXCJtam1cIixcIm1qblwiLFwibWpvXCIsXCJtanBcIixcIm1qcVwiLFwibWpyXCIsXCJtanNcIixcIm1qdFwiLFwibWp1XCIsXCJtanZcIixcIm1qd1wiLFwibWp4XCIsXCJtanlcIixcIm1qelwiLFwibWthXCIsXCJta2JcIixcIm1rY1wiLFwibWtlXCIsXCJta2ZcIixcIm1rZ1wiLFwibWtoXCIsXCJta2lcIixcIm1ralwiLFwibWtrXCIsXCJta2xcIixcIm1rbVwiLFwibWtuXCIsXCJta29cIixcIm1rcFwiLFwibWtxXCIsXCJta3JcIixcIm1rc1wiLFwibWt0XCIsXCJta3VcIixcIm1rdlwiLFwibWt3XCIsXCJta3hcIixcIm1reVwiLFwibWt6XCIsXCJtbGFcIixcIm1sYlwiLFwibWxjXCIsXCJtbGRcIixcIm1sZVwiLFwibWxmXCIsXCJtbGhcIixcIm1saVwiLFwibWxqXCIsXCJtbGtcIixcIm1sbFwiLFwibWxtXCIsXCJtbG5cIixcIm1sb1wiLFwibWxwXCIsXCJtbHFcIixcIm1sclwiLFwibWxzXCIsXCJtbHVcIixcIm1sdlwiLFwibWx3XCIsXCJtbHhcIixcIm1selwiLFwibW1hXCIsXCJtbWJcIixcIm1tY1wiLFwibW1kXCIsXCJtbWVcIixcIm1tZlwiLFwibW1nXCIsXCJtbWhcIixcIm1taVwiLFwibW1qXCIsXCJtbWtcIixcIm1tbFwiLFwibW1tXCIsXCJtbW5cIixcIm1tb1wiLFwibW1wXCIsXCJtbXFcIixcIm1tclwiLFwibW10XCIsXCJtbXVcIixcIm1tdlwiLFwibW13XCIsXCJtbXhcIixcIm1teVwiLFwibW16XCIsXCJtbmFcIixcIm1uYlwiLFwibW5jXCIsXCJtbmRcIixcIm1uZVwiLFwibW5mXCIsXCJtbmdcIixcIm1uaFwiLFwibW5pXCIsXCJtbmpcIixcIm1ua1wiLFwibW5sXCIsXCJtbm1cIixcIm1ublwiLFwibW5vXCIsXCJtbnBcIixcIm1ucVwiLFwibW5yXCIsXCJtbnNcIixcIm1udFwiLFwibW51XCIsXCJtbnZcIixcIm1ud1wiLFwibW54XCIsXCJtbnlcIixcIm1uelwiLFwibW9hXCIsXCJtb2NcIixcIm1vZFwiLFwibW9lXCIsXCJtb2ZcIixcIm1vZ1wiLFwibW9oXCIsXCJtb2lcIixcIm1valwiLFwibW9rXCIsXCJtb21cIixcIm1vb1wiLFwibW9wXCIsXCJtb3FcIixcIm1vclwiLFwibW9zXCIsXCJtb3RcIixcIm1vdVwiLFwibW92XCIsXCJtb3dcIixcIm1veFwiLFwibW95XCIsXCJtb3pcIixcIm1wYVwiLFwibXBiXCIsXCJtcGNcIixcIm1wZFwiLFwibXBlXCIsXCJtcGdcIixcIm1waFwiLFwibXBpXCIsXCJtcGpcIixcIm1wa1wiLFwibXBsXCIsXCJtcG1cIixcIm1wblwiLFwibXBvXCIsXCJtcHBcIixcIm1wcVwiLFwibXByXCIsXCJtcHNcIixcIm1wdFwiLFwibXB1XCIsXCJtcHZcIixcIm1wd1wiLFwibXB4XCIsXCJtcHlcIixcIm1welwiLFwibXFhXCIsXCJtcWJcIixcIm1xY1wiLFwibXFlXCIsXCJtcWZcIixcIm1xZ1wiLFwibXFoXCIsXCJtcWlcIixcIm1xalwiLFwibXFrXCIsXCJtcWxcIixcIm1xbVwiLFwibXFuXCIsXCJtcW9cIixcIm1xcFwiLFwibXFxXCIsXCJtcXJcIixcIm1xc1wiLFwibXF0XCIsXCJtcXVcIixcIm1xdlwiLFwibXF3XCIsXCJtcXhcIixcIm1xeVwiLFwibXF6XCIsXCJtcmFcIixcIm1yYlwiLFwibXJjXCIsXCJtcmRcIixcIm1yZVwiLFwibXJmXCIsXCJtcmdcIixcIm1yaFwiLFwibXJqXCIsXCJtcmtcIixcIm1ybFwiLFwibXJtXCIsXCJtcm5cIixcIm1yb1wiLFwibXJwXCIsXCJtcnFcIixcIm1yclwiLFwibXJzXCIsXCJtcnRcIixcIm1ydVwiLFwibXJ2XCIsXCJtcndcIixcIm1yeFwiLFwibXJ5XCIsXCJtcnpcIixcIm1zYlwiLFwibXNjXCIsXCJtc2RcIixcIm1zZVwiLFwibXNmXCIsXCJtc2dcIixcIm1zaFwiLFwibXNpXCIsXCJtc2pcIixcIm1za1wiLFwibXNsXCIsXCJtc21cIixcIm1zblwiLFwibXNvXCIsXCJtc3BcIixcIm1zcVwiLFwibXNyXCIsXCJtc3NcIixcIm1zdFwiLFwibXN1XCIsXCJtc3ZcIixcIm1zd1wiLFwibXN4XCIsXCJtc3lcIixcIm1zelwiLFwibXRhXCIsXCJtdGJcIixcIm10Y1wiLFwibXRkXCIsXCJtdGVcIixcIm10ZlwiLFwibXRnXCIsXCJtdGhcIixcIm10aVwiLFwibXRqXCIsXCJtdGtcIixcIm10bFwiLFwibXRtXCIsXCJtdG5cIixcIm10b1wiLFwibXRwXCIsXCJtdHFcIixcIm10clwiLFwibXRzXCIsXCJtdHRcIixcIm10dVwiLFwibXR2XCIsXCJtdHdcIixcIm10eFwiLFwibXR5XCIsXCJtdWFcIixcIm11YlwiLFwibXVjXCIsXCJtdWRcIixcIm11ZVwiLFwibXVnXCIsXCJtdWhcIixcIm11aVwiLFwibXVqXCIsXCJtdWtcIixcIm11bFwiLFwibXVtXCIsXCJtdW5cIixcIm11b1wiLFwibXVwXCIsXCJtdXFcIixcIm11clwiLFwibXVzXCIsXCJtdXRcIixcIm11dVwiLFwibXV2XCIsXCJtdXhcIixcIm11eVwiLFwibXV6XCIsXCJtdmFcIixcIm12YlwiLFwibXZkXCIsXCJtdmVcIixcIm12ZlwiLFwibXZnXCIsXCJtdmhcIixcIm12aVwiLFwibXZrXCIsXCJtdmxcIixcIm12bVwiLFwibXZuXCIsXCJtdm9cIixcIm12cFwiLFwibXZxXCIsXCJtdnJcIixcIm12c1wiLFwibXZ0XCIsXCJtdnVcIixcIm12dlwiLFwibXZ3XCIsXCJtdnhcIixcIm12eVwiLFwibXZ6XCIsXCJtd2FcIixcIm13YlwiLFwibXdjXCIsXCJtd2RcIixcIm13ZVwiLFwibXdmXCIsXCJtd2dcIixcIm13aFwiLFwibXdpXCIsXCJtd2pcIixcIm13a1wiLFwibXdsXCIsXCJtd21cIixcIm13blwiLFwibXdvXCIsXCJtd3BcIixcIm13cVwiLFwibXdyXCIsXCJtd3NcIixcIm13dFwiLFwibXd1XCIsXCJtd3ZcIixcIm13d1wiLFwibXd4XCIsXCJtd3lcIixcIm13elwiLFwibXhhXCIsXCJteGJcIixcIm14Y1wiLFwibXhkXCIsXCJteGVcIixcIm14ZlwiLFwibXhnXCIsXCJteGhcIixcIm14aVwiLFwibXhqXCIsXCJteGtcIixcIm14bFwiLFwibXhtXCIsXCJteG5cIixcIm14b1wiLFwibXhwXCIsXCJteHFcIixcIm14clwiLFwibXhzXCIsXCJteHRcIixcIm14dVwiLFwibXh2XCIsXCJteHdcIixcIm14eFwiLFwibXh5XCIsXCJteHpcIixcIm15YlwiLFwibXljXCIsXCJteWRcIixcIm15ZVwiLFwibXlmXCIsXCJteWdcIixcIm15aFwiLFwibXlpXCIsXCJteWpcIixcIm15a1wiLFwibXlsXCIsXCJteW1cIixcIm15blwiLFwibXlvXCIsXCJteXBcIixcIm15cVwiLFwibXlyXCIsXCJteXNcIixcIm15dFwiLFwibXl1XCIsXCJteXZcIixcIm15d1wiLFwibXl4XCIsXCJteXlcIixcIm15elwiLFwibXphXCIsXCJtemJcIixcIm16Y1wiLFwibXpkXCIsXCJtemVcIixcIm16Z1wiLFwibXpoXCIsXCJtemlcIixcIm16alwiLFwibXprXCIsXCJtemxcIixcIm16bVwiLFwibXpuXCIsXCJtem9cIixcIm16cFwiLFwibXpxXCIsXCJtenJcIixcIm16c1wiLFwibXp0XCIsXCJtenVcIixcIm16dlwiLFwibXp3XCIsXCJtenhcIixcIm16eVwiLFwibXp6XCJdXG4sWyBcIm5hXCIsXCJuYlwiLFwibmRcIixcIm5lXCIsXCJuZ1wiLFwibmxcIixcIm5uXCIsXCJub1wiLFwibnJcIixcIm52XCIsXCJueVwiLFwibmFhXCIsXCJuYWJcIixcIm5hY1wiLFwibmFkXCIsXCJuYWVcIixcIm5hZlwiLFwibmFnXCIsXCJuYWhcIixcIm5haVwiLFwibmFqXCIsXCJuYWtcIixcIm5hbFwiLFwibmFtXCIsXCJuYW5cIixcIm5hb1wiLFwibmFwXCIsXCJuYXFcIixcIm5hclwiLFwibmFzXCIsXCJuYXRcIixcIm5hd1wiLFwibmF4XCIsXCJuYXlcIixcIm5helwiLFwibmJhXCIsXCJuYmJcIixcIm5iY1wiLFwibmJkXCIsXCJuYmVcIixcIm5iZlwiLFwibmJnXCIsXCJuYmhcIixcIm5iaVwiLFwibmJqXCIsXCJuYmtcIixcIm5ibVwiLFwibmJuXCIsXCJuYm9cIixcIm5icFwiLFwibmJxXCIsXCJuYnJcIixcIm5ic1wiLFwibmJ0XCIsXCJuYnVcIixcIm5idlwiLFwibmJ3XCIsXCJuYnhcIixcIm5ieVwiLFwibmNhXCIsXCJuY2JcIixcIm5jY1wiLFwibmNkXCIsXCJuY2VcIixcIm5jZlwiLFwibmNnXCIsXCJuY2hcIixcIm5jaVwiLFwibmNqXCIsXCJuY2tcIixcIm5jbFwiLFwibmNtXCIsXCJuY25cIixcIm5jb1wiLFwibmNwXCIsXCJuY3FcIixcIm5jclwiLFwibmNzXCIsXCJuY3RcIixcIm5jdVwiLFwibmN4XCIsXCJuY3pcIixcIm5kYVwiLFwibmRiXCIsXCJuZGNcIixcIm5kZFwiLFwibmRmXCIsXCJuZGdcIixcIm5kaFwiLFwibmRpXCIsXCJuZGpcIixcIm5ka1wiLFwibmRsXCIsXCJuZG1cIixcIm5kblwiLFwibmRwXCIsXCJuZHFcIixcIm5kclwiLFwibmRzXCIsXCJuZHRcIixcIm5kdVwiLFwibmR2XCIsXCJuZHdcIixcIm5keFwiLFwibmR5XCIsXCJuZHpcIixcIm5lYVwiLFwibmViXCIsXCJuZWNcIixcIm5lZFwiLFwibmVlXCIsXCJuZWZcIixcIm5lZ1wiLFwibmVoXCIsXCJuZWlcIixcIm5lalwiLFwibmVrXCIsXCJuZW1cIixcIm5lblwiLFwibmVvXCIsXCJuZXFcIixcIm5lclwiLFwibmVzXCIsXCJuZXRcIixcIm5ldVwiLFwibmV2XCIsXCJuZXdcIixcIm5leFwiLFwibmV5XCIsXCJuZXpcIixcIm5mYVwiLFwibmZkXCIsXCJuZmxcIixcIm5mclwiLFwibmZ1XCIsXCJuZ2FcIixcIm5nYlwiLFwibmdjXCIsXCJuZ2RcIixcIm5nZVwiLFwibmdmXCIsXCJuZ2dcIixcIm5naFwiLFwibmdpXCIsXCJuZ2pcIixcIm5na1wiLFwibmdsXCIsXCJuZ21cIixcIm5nblwiLFwibmdvXCIsXCJuZ3BcIixcIm5ncVwiLFwibmdyXCIsXCJuZ3NcIixcIm5ndFwiLFwibmd1XCIsXCJuZ3ZcIixcIm5nd1wiLFwibmd4XCIsXCJuZ3lcIixcIm5nelwiLFwibmhhXCIsXCJuaGJcIixcIm5oY1wiLFwibmhkXCIsXCJuaGVcIixcIm5oZlwiLFwibmhnXCIsXCJuaGhcIixcIm5oaVwiLFwibmhrXCIsXCJuaG1cIixcIm5oblwiLFwibmhvXCIsXCJuaHBcIixcIm5ocVwiLFwibmhyXCIsXCJuaHRcIixcIm5odVwiLFwibmh2XCIsXCJuaHdcIixcIm5oeFwiLFwibmh5XCIsXCJuaHpcIixcIm5pYVwiLFwibmliXCIsXCJuaWNcIixcIm5pZFwiLFwibmllXCIsXCJuaWZcIixcIm5pZ1wiLFwibmloXCIsXCJuaWlcIixcIm5palwiLFwibmlrXCIsXCJuaWxcIixcIm5pbVwiLFwibmluXCIsXCJuaW9cIixcIm5pcVwiLFwibmlyXCIsXCJuaXNcIixcIm5pdFwiLFwibml1XCIsXCJuaXZcIixcIm5pd1wiLFwibml4XCIsXCJuaXlcIixcIm5pelwiLFwibmphXCIsXCJuamJcIixcIm5qZFwiLFwibmpoXCIsXCJuamlcIixcIm5qalwiLFwibmpsXCIsXCJuam1cIixcIm5qblwiLFwibmpvXCIsXCJuanJcIixcIm5qc1wiLFwibmp0XCIsXCJuanVcIixcIm5qeFwiLFwibmp5XCIsXCJuanpcIixcIm5rYVwiLFwibmtiXCIsXCJua2NcIixcIm5rZFwiLFwibmtlXCIsXCJua2ZcIixcIm5rZ1wiLFwibmtoXCIsXCJua2lcIixcIm5ralwiLFwibmtrXCIsXCJua21cIixcIm5rblwiLFwibmtvXCIsXCJua3BcIixcIm5rcVwiLFwibmtyXCIsXCJua3NcIixcIm5rdFwiLFwibmt1XCIsXCJua3ZcIixcIm5rd1wiLFwibmt4XCIsXCJua3pcIixcIm5sYVwiLFwibmxjXCIsXCJubGVcIixcIm5sZ1wiLFwibmxpXCIsXCJubGpcIixcIm5sa1wiLFwibmxsXCIsXCJubG1cIixcIm5sblwiLFwibmxvXCIsXCJubHFcIixcIm5sclwiLFwibmx1XCIsXCJubHZcIixcIm5sd1wiLFwibmx4XCIsXCJubHlcIixcIm5selwiLFwibm1hXCIsXCJubWJcIixcIm5tY1wiLFwibm1kXCIsXCJubWVcIixcIm5tZlwiLFwibm1nXCIsXCJubWhcIixcIm5taVwiLFwibm1qXCIsXCJubWtcIixcIm5tbFwiLFwibm1tXCIsXCJubW5cIixcIm5tb1wiLFwibm1wXCIsXCJubXFcIixcIm5tclwiLFwibm1zXCIsXCJubXRcIixcIm5tdVwiLFwibm12XCIsXCJubXdcIixcIm5teFwiLFwibm15XCIsXCJubXpcIixcIm5uYVwiLFwibm5iXCIsXCJubmNcIixcIm5uZFwiLFwibm5lXCIsXCJubmZcIixcIm5uZ1wiLFwibm5oXCIsXCJubmlcIixcIm5ualwiLFwibm5rXCIsXCJubmxcIixcIm5ubVwiLFwibm5uXCIsXCJubnBcIixcIm5ucVwiLFwibm5yXCIsXCJubnNcIixcIm5udFwiLFwibm51XCIsXCJubnZcIixcIm5ud1wiLFwibm54XCIsXCJubnlcIixcIm5uelwiLFwibm9hXCIsXCJub2NcIixcIm5vZFwiLFwibm9lXCIsXCJub2ZcIixcIm5vZ1wiLFwibm9oXCIsXCJub2lcIixcIm5valwiLFwibm9rXCIsXCJub2xcIixcIm5vbVwiLFwibm9uXCIsXCJub29cIixcIm5vcFwiLFwibm9xXCIsXCJub3NcIixcIm5vdFwiLFwibm91XCIsXCJub3ZcIixcIm5vd1wiLFwibm95XCIsXCJub3pcIixcIm5wYVwiLFwibnBiXCIsXCJucGdcIixcIm5waFwiLFwibnBpXCIsXCJucGxcIixcIm5wblwiLFwibnBvXCIsXCJucHNcIixcIm5wdVwiLFwibnB4XCIsXCJucHlcIixcIm5xZ1wiLFwibnFrXCIsXCJucWxcIixcIm5xbVwiLFwibnFuXCIsXCJucW9cIixcIm5xcVwiLFwibnF0XCIsXCJucXlcIixcIm5yYVwiLFwibnJiXCIsXCJucmNcIixcIm5yZVwiLFwibnJmXCIsXCJucmdcIixcIm5yaVwiLFwibnJrXCIsXCJucmxcIixcIm5ybVwiLFwibnJuXCIsXCJucnBcIixcIm5yclwiLFwibnJ0XCIsXCJucnVcIixcIm5yeFwiLFwibnJ6XCIsXCJuc2FcIixcIm5zYlwiLFwibnNjXCIsXCJuc2RcIixcIm5zZVwiLFwibnNmXCIsXCJuc2dcIixcIm5zaFwiLFwibnNpXCIsXCJuc2tcIixcIm5zbFwiLFwibnNtXCIsXCJuc25cIixcIm5zb1wiLFwibnNwXCIsXCJuc3FcIixcIm5zclwiLFwibnNzXCIsXCJuc3RcIixcIm5zdVwiLFwibnN2XCIsXCJuc3dcIixcIm5zeFwiLFwibnN5XCIsXCJuc3pcIixcIm50ZFwiLFwibnRlXCIsXCJudGdcIixcIm50aVwiLFwibnRqXCIsXCJudGtcIixcIm50bVwiLFwibnRvXCIsXCJudHBcIixcIm50clwiLFwibnRzXCIsXCJudHVcIixcIm50d1wiLFwibnR4XCIsXCJudHlcIixcIm50elwiLFwibnVhXCIsXCJudWJcIixcIm51Y1wiLFwibnVkXCIsXCJudWVcIixcIm51ZlwiLFwibnVnXCIsXCJudWhcIixcIm51aVwiLFwibnVqXCIsXCJudWtcIixcIm51bFwiLFwibnVtXCIsXCJudW5cIixcIm51b1wiLFwibnVwXCIsXCJudXFcIixcIm51clwiLFwibnVzXCIsXCJudXRcIixcIm51dVwiLFwibnV2XCIsXCJudXdcIixcIm51eFwiLFwibnV5XCIsXCJudXpcIixcIm52aFwiLFwibnZtXCIsXCJudm9cIixcIm53YVwiLFwibndiXCIsXCJud2NcIixcIm53ZVwiLFwibndnXCIsXCJud2lcIixcIm53bVwiLFwibndvXCIsXCJud3JcIixcIm53eFwiLFwibnd5XCIsXCJueGFcIixcIm54ZFwiLFwibnhlXCIsXCJueGdcIixcIm54aVwiLFwibnhrXCIsXCJueGxcIixcIm54bVwiLFwibnhuXCIsXCJueG9cIixcIm54cVwiLFwibnhyXCIsXCJueHVcIixcIm54eFwiLFwibnliXCIsXCJueWNcIixcIm55ZFwiLFwibnllXCIsXCJueWZcIixcIm55Z1wiLFwibnloXCIsXCJueWlcIixcIm55alwiLFwibnlrXCIsXCJueWxcIixcIm55bVwiLFwibnluXCIsXCJueW9cIixcIm55cFwiLFwibnlxXCIsXCJueXJcIixcIm55c1wiLFwibnl0XCIsXCJueXVcIixcIm55dlwiLFwibnl3XCIsXCJueXhcIixcIm55eVwiLFwibnphXCIsXCJuemJcIixcIm56ZFwiLFwibnppXCIsXCJuemtcIixcIm56bVwiLFwibnpzXCIsXCJuenVcIixcIm56eVwiLFwibnp6XCJdXG4sWyBcIm9jXCIsXCJvalwiLFwib21cIixcIm9yXCIsXCJvc1wiLFwib2FhXCIsXCJvYWNcIixcIm9hclwiLFwib2F2XCIsXCJvYmlcIixcIm9ia1wiLFwib2JsXCIsXCJvYm1cIixcIm9ib1wiLFwib2JyXCIsXCJvYnRcIixcIm9idVwiLFwib2NhXCIsXCJvY2hcIixcIm9jbVwiLFwib2NvXCIsXCJvY3VcIixcIm9kYVwiLFwib2RrXCIsXCJvZHRcIixcIm9kdVwiLFwib2ZvXCIsXCJvZnNcIixcIm9mdVwiLFwib2diXCIsXCJvZ2NcIixcIm9nZVwiLFwib2dnXCIsXCJvZ29cIixcIm9ndVwiLFwib2h0XCIsXCJvaHVcIixcIm9pYVwiLFwib2luXCIsXCJvamJcIixcIm9qY1wiLFwib2pnXCIsXCJvanBcIixcIm9qc1wiLFwib2p2XCIsXCJvandcIixcIm9rYVwiLFwib2tiXCIsXCJva2NcIixcIm9rZFwiLFwib2tlXCIsXCJva2dcIixcIm9raFwiLFwib2tpXCIsXCJva2pcIixcIm9ra1wiLFwib2tsXCIsXCJva21cIixcIm9rblwiLFwib2tvXCIsXCJva3JcIixcIm9rc1wiLFwib2t1XCIsXCJva3ZcIixcIm9reFwiLFwib2t6XCIsXCJvbGFcIixcIm9sZFwiLFwib2xlXCIsXCJvbGtcIixcIm9sbVwiLFwib2xvXCIsXCJvbHJcIixcIm9sdFwiLFwib2x1XCIsXCJvbWFcIixcIm9tYlwiLFwib21jXCIsXCJvbWVcIixcIm9tZ1wiLFwib21pXCIsXCJvbWtcIixcIm9tbFwiLFwib21uXCIsXCJvbW9cIixcIm9tcFwiLFwib21xXCIsXCJvbXJcIixcIm9tdFwiLFwib211XCIsXCJvbXZcIixcIm9td1wiLFwib214XCIsXCJvbXlcIixcIm9uYVwiLFwib25iXCIsXCJvbmVcIixcIm9uZ1wiLFwib25pXCIsXCJvbmpcIixcIm9ua1wiLFwib25uXCIsXCJvbm9cIixcIm9ucFwiLFwib25yXCIsXCJvbnNcIixcIm9udFwiLFwib251XCIsXCJvbndcIixcIm9ueFwiLFwib29kXCIsXCJvb2dcIixcIm9vblwiLFwib29yXCIsXCJvb3NcIixcIm9wYVwiLFwib3BrXCIsXCJvcG1cIixcIm9wb1wiLFwib3B0XCIsXCJvcHlcIixcIm9yYVwiLFwib3JjXCIsXCJvcmVcIixcIm9yZ1wiLFwib3JoXCIsXCJvcm5cIixcIm9yb1wiLFwib3JyXCIsXCJvcnNcIixcIm9ydFwiLFwib3J1XCIsXCJvcnZcIixcIm9yd1wiLFwib3J4XCIsXCJvcnlcIixcIm9yelwiLFwib3NhXCIsXCJvc2NcIixcIm9zaVwiLFwib3NuXCIsXCJvc29cIixcIm9zcFwiLFwib3N0XCIsXCJvc3VcIixcIm9zeFwiLFwib3RhXCIsXCJvdGJcIixcIm90ZFwiLFwib3RlXCIsXCJvdGlcIixcIm90a1wiLFwib3RsXCIsXCJvdG1cIixcIm90blwiLFwib3RvXCIsXCJvdHFcIixcIm90clwiLFwib3RzXCIsXCJvdHRcIixcIm90dVwiLFwib3R3XCIsXCJvdHhcIixcIm90eVwiLFwib3R6XCIsXCJvdWFcIixcIm91YlwiLFwib3VlXCIsXCJvdWlcIixcIm91bVwiLFwib3VuXCIsXCJvdmRcIixcIm93aVwiLFwib3dsXCIsXCJveWJcIixcIm95ZFwiLFwib3ltXCIsXCJveXlcIixcIm96bVwiXVxuLFsgXCJwYVwiLFwicGlcIixcInBsXCIsXCJwc1wiLFwicHRcIixcInBhYVwiLFwicGFiXCIsXCJwYWNcIixcInBhZFwiLFwicGFlXCIsXCJwYWZcIixcInBhZ1wiLFwicGFoXCIsXCJwYWlcIixcInBha1wiLFwicGFsXCIsXCJwYW1cIixcInBhb1wiLFwicGFwXCIsXCJwYXFcIixcInBhclwiLFwicGFzXCIsXCJwYXRcIixcInBhdVwiLFwicGF2XCIsXCJwYXdcIixcInBheFwiLFwicGF5XCIsXCJwYXpcIixcInBiYlwiLFwicGJjXCIsXCJwYmVcIixcInBiZlwiLFwicGJnXCIsXCJwYmhcIixcInBiaVwiLFwicGJsXCIsXCJwYm1cIixcInBiblwiLFwicGJvXCIsXCJwYnBcIixcInBiclwiLFwicGJzXCIsXCJwYnRcIixcInBidVwiLFwicGJ2XCIsXCJwYnlcIixcInBielwiLFwicGNhXCIsXCJwY2JcIixcInBjY1wiLFwicGNkXCIsXCJwY2VcIixcInBjZlwiLFwicGNnXCIsXCJwY2hcIixcInBjaVwiLFwicGNqXCIsXCJwY2tcIixcInBjbFwiLFwicGNtXCIsXCJwY25cIixcInBjcFwiLFwicGNyXCIsXCJwY3dcIixcInBkYVwiLFwicGRjXCIsXCJwZGlcIixcInBkblwiLFwicGRvXCIsXCJwZHRcIixcInBkdVwiLFwicGVhXCIsXCJwZWJcIixcInBlZFwiLFwicGVlXCIsXCJwZWZcIixcInBlZ1wiLFwicGVoXCIsXCJwZWlcIixcInBlalwiLFwicGVrXCIsXCJwZWxcIixcInBlbVwiLFwicGVvXCIsXCJwZXBcIixcInBlcVwiLFwicGVzXCIsXCJwZXZcIixcInBleFwiLFwicGV5XCIsXCJwZXpcIixcInBmYVwiLFwicGZlXCIsXCJwZmxcIixcInBnYVwiLFwicGdkXCIsXCJwZ2dcIixcInBnaVwiLFwicGdrXCIsXCJwZ2xcIixcInBnblwiLFwicGdzXCIsXCJwZ3VcIixcInBneVwiLFwicGd6XCIsXCJwaGFcIixcInBoZFwiLFwicGhnXCIsXCJwaGhcIixcInBoaVwiLFwicGhrXCIsXCJwaGxcIixcInBobVwiLFwicGhuXCIsXCJwaG9cIixcInBocVwiLFwicGhyXCIsXCJwaHRcIixcInBodVwiLFwicGh2XCIsXCJwaHdcIixcInBpYVwiLFwicGliXCIsXCJwaWNcIixcInBpZFwiLFwicGllXCIsXCJwaWZcIixcInBpZ1wiLFwicGloXCIsXCJwaWlcIixcInBpalwiLFwicGlsXCIsXCJwaW1cIixcInBpblwiLFwicGlvXCIsXCJwaXBcIixcInBpclwiLFwicGlzXCIsXCJwaXRcIixcInBpdVwiLFwicGl2XCIsXCJwaXdcIixcInBpeFwiLFwicGl5XCIsXCJwaXpcIixcInBqdFwiLFwicGthXCIsXCJwa2JcIixcInBrY1wiLFwicGtnXCIsXCJwa2hcIixcInBrblwiLFwicGtvXCIsXCJwa3BcIixcInBrclwiLFwicGtzXCIsXCJwa3RcIixcInBrdVwiLFwicGxhXCIsXCJwbGJcIixcInBsY1wiLFwicGxkXCIsXCJwbGVcIixcInBsZlwiLFwicGxnXCIsXCJwbGhcIixcInBsalwiLFwicGxrXCIsXCJwbGxcIixcInBsblwiLFwicGxvXCIsXCJwbHBcIixcInBscVwiLFwicGxyXCIsXCJwbHNcIixcInBsdFwiLFwicGx1XCIsXCJwbHZcIixcInBsd1wiLFwicGx5XCIsXCJwbHpcIixcInBtYVwiLFwicG1iXCIsXCJwbWNcIixcInBtZFwiLFwicG1lXCIsXCJwbWZcIixcInBtaFwiLFwicG1pXCIsXCJwbWpcIixcInBta1wiLFwicG1sXCIsXCJwbW1cIixcInBtblwiLFwicG1vXCIsXCJwbXFcIixcInBtclwiLFwicG1zXCIsXCJwbXRcIixcInBtdVwiLFwicG13XCIsXCJwbXhcIixcInBteVwiLFwicG16XCIsXCJwbmFcIixcInBuYlwiLFwicG5jXCIsXCJwbmRcIixcInBuZVwiLFwicG5nXCIsXCJwbmhcIixcInBuaVwiLFwicG5qXCIsXCJwbmtcIixcInBubFwiLFwicG5tXCIsXCJwbm5cIixcInBub1wiLFwicG5wXCIsXCJwbnFcIixcInBuclwiLFwicG5zXCIsXCJwbnRcIixcInBudVwiLFwicG52XCIsXCJwbndcIixcInBueFwiLFwicG55XCIsXCJwbnpcIixcInBvY1wiLFwicG9kXCIsXCJwb2VcIixcInBvZlwiLFwicG9nXCIsXCJwb2hcIixcInBvaVwiLFwicG9rXCIsXCJwb21cIixcInBvblwiLFwicG9vXCIsXCJwb3BcIixcInBvcVwiLFwicG9zXCIsXCJwb3RcIixcInBvdlwiLFwicG93XCIsXCJwb3hcIixcInBveVwiLFwicG96XCIsXCJwcGFcIixcInBwZVwiLFwicHBpXCIsXCJwcGtcIixcInBwbFwiLFwicHBtXCIsXCJwcG5cIixcInBwb1wiLFwicHBwXCIsXCJwcHFcIixcInBwclwiLFwicHBzXCIsXCJwcHRcIixcInBwdVwiLFwicHFhXCIsXCJwcWVcIixcInBxbVwiLFwicHF3XCIsXCJwcmFcIixcInByYlwiLFwicHJjXCIsXCJwcmRcIixcInByZVwiLFwicHJmXCIsXCJwcmdcIixcInByaFwiLFwicHJpXCIsXCJwcmtcIixcInBybFwiLFwicHJtXCIsXCJwcm5cIixcInByb1wiLFwicHJwXCIsXCJwcnFcIixcInByclwiLFwicHJzXCIsXCJwcnRcIixcInBydVwiLFwicHJ3XCIsXCJwcnhcIixcInByeVwiLFwicHJ6XCIsXCJwc2FcIixcInBzY1wiLFwicHNkXCIsXCJwc2VcIixcInBzZ1wiLFwicHNoXCIsXCJwc2lcIixcInBzbFwiLFwicHNtXCIsXCJwc25cIixcInBzb1wiLFwicHNwXCIsXCJwc3FcIixcInBzclwiLFwicHNzXCIsXCJwc3RcIixcInBzdVwiLFwicHN3XCIsXCJwc3lcIixcInB0YVwiLFwicHRoXCIsXCJwdGlcIixcInB0blwiLFwicHRvXCIsXCJwdHBcIixcInB0cVwiLFwicHRyXCIsXCJwdHRcIixcInB0dVwiLFwicHR2XCIsXCJwdHdcIixcInB0eVwiLFwicHVhXCIsXCJwdWJcIixcInB1Y1wiLFwicHVkXCIsXCJwdWVcIixcInB1ZlwiLFwicHVnXCIsXCJwdWlcIixcInB1alwiLFwicHVrXCIsXCJwdW1cIixcInB1b1wiLFwicHVwXCIsXCJwdXFcIixcInB1clwiLFwicHV0XCIsXCJwdXVcIixcInB1d1wiLFwicHV4XCIsXCJwdXlcIixcInB1elwiLFwicHdhXCIsXCJwd2JcIixcInB3Z1wiLFwicHdpXCIsXCJwd21cIixcInB3blwiLFwicHdvXCIsXCJwd3JcIixcInB3d1wiLFwicHhtXCIsXCJweWVcIixcInB5bVwiLFwicHluXCIsXCJweXNcIixcInB5dVwiLFwicHl4XCIsXCJweXlcIixcInB6blwiXVxuLFsgXCJxdVwiLFwicXVhXCIsXCJxdWJcIixcInF1Y1wiLFwicXVkXCIsXCJxdWZcIixcInF1Z1wiLFwicXVoXCIsXCJxdWlcIixcInF1a1wiLFwicXVsXCIsXCJxdW1cIixcInF1blwiLFwicXVwXCIsXCJxdXFcIixcInF1clwiLFwicXVzXCIsXCJxdXZcIixcInF1d1wiLFwicXV4XCIsXCJxdXlcIixcInF1elwiLFwicXZhXCIsXCJxdmNcIixcInF2ZVwiLFwicXZoXCIsXCJxdmlcIixcInF2alwiLFwicXZsXCIsXCJxdm1cIixcInF2blwiLFwicXZvXCIsXCJxdnBcIixcInF2c1wiLFwicXZ3XCIsXCJxdnlcIixcInF2elwiLFwicXdhXCIsXCJxd2NcIixcInF3ZVwiLFwicXdoXCIsXCJxd21cIixcInF3c1wiLFwicXd0XCIsXCJxeGFcIixcInF4Y1wiLFwicXhoXCIsXCJxeGxcIixcInF4blwiLFwicXhvXCIsXCJxeHBcIixcInF4cVwiLFwicXhyXCIsXCJxeHNcIixcInF4dFwiLFwicXh1XCIsXCJxeHdcIixcInF5YVwiLFwicXlwXCJdXG4sWyBcInJtXCIsXCJyblwiLFwicm9cIixcInJ1XCIsXCJyd1wiLFwicmFhXCIsXCJyYWJcIixcInJhY1wiLFwicmFkXCIsXCJyYWZcIixcInJhZ1wiLFwicmFoXCIsXCJyYWlcIixcInJhalwiLFwicmFrXCIsXCJyYWxcIixcInJhbVwiLFwicmFuXCIsXCJyYW9cIixcInJhcFwiLFwicmFxXCIsXCJyYXJcIixcInJhc1wiLFwicmF0XCIsXCJyYXVcIixcInJhdlwiLFwicmF3XCIsXCJyYXhcIixcInJheVwiLFwicmF6XCIsXCJyYmJcIixcInJia1wiLFwicmJsXCIsXCJyYnBcIixcInJjZlwiLFwicmRiXCIsXCJyZWFcIixcInJlYlwiLFwicmVlXCIsXCJyZWdcIixcInJlaVwiLFwicmVqXCIsXCJyZWxcIixcInJlbVwiLFwicmVuXCIsXCJyZXJcIixcInJlc1wiLFwicmV0XCIsXCJyZXlcIixcInJnYVwiLFwicmdlXCIsXCJyZ2tcIixcInJnblwiLFwicmdyXCIsXCJyZ3NcIixcInJndVwiLFwicmhnXCIsXCJyaHBcIixcInJpYVwiLFwicmllXCIsXCJyaWZcIixcInJpbFwiLFwicmltXCIsXCJyaW5cIixcInJpclwiLFwicml0XCIsXCJyaXVcIixcInJqZ1wiLFwicmppXCIsXCJyanNcIixcInJrYVwiLFwicmtiXCIsXCJya2hcIixcInJraVwiLFwicmttXCIsXCJya3RcIixcInJrd1wiLFwicm1hXCIsXCJybWJcIixcInJtY1wiLFwicm1kXCIsXCJybWVcIixcInJtZlwiLFwicm1nXCIsXCJybWhcIixcInJtaVwiLFwicm1rXCIsXCJybWxcIixcInJtbVwiLFwicm1uXCIsXCJybW9cIixcInJtcFwiLFwicm1xXCIsXCJybXJcIixcInJtc1wiLFwicm10XCIsXCJybXVcIixcInJtdlwiLFwicm13XCIsXCJybXhcIixcInJteVwiLFwicm16XCIsXCJybmFcIixcInJuZFwiLFwicm5nXCIsXCJybmxcIixcInJublwiLFwicm5wXCIsXCJybnJcIixcInJud1wiLFwicm9hXCIsXCJyb2JcIixcInJvY1wiLFwicm9kXCIsXCJyb2VcIixcInJvZlwiLFwicm9nXCIsXCJyb2xcIixcInJvbVwiLFwicm9vXCIsXCJyb3BcIixcInJvclwiLFwicm91XCIsXCJyb3dcIixcInJwblwiLFwicnB0XCIsXCJycmlcIixcInJyb1wiLFwicnJ0XCIsXCJyc2JcIixcInJzaVwiLFwicnNsXCIsXCJyc21cIixcInJ0Y1wiLFwicnRoXCIsXCJydG1cIixcInJ0c1wiLFwicnR3XCIsXCJydWJcIixcInJ1Y1wiLFwicnVlXCIsXCJydWZcIixcInJ1Z1wiLFwicnVoXCIsXCJydWlcIixcInJ1a1wiLFwicnVvXCIsXCJydXBcIixcInJ1cVwiLFwicnV0XCIsXCJydXVcIixcInJ1eVwiLFwicnV6XCIsXCJyd2FcIixcInJ3a1wiLFwicndsXCIsXCJyd21cIixcInJ3b1wiLFwicndyXCIsXCJyeGRcIixcInJ4d1wiLFwicnluXCIsXCJyeXNcIixcInJ5dVwiLFwicnpoXCJdXG4sWyBcInNhXCIsXCJzY1wiLFwic2RcIixcInNlXCIsXCJzZ1wiLFwic2hcIixcInNpXCIsXCJza1wiLFwic2xcIixcInNtXCIsXCJzblwiLFwic29cIixcInNxXCIsXCJzclwiLFwic3NcIixcInN0XCIsXCJzdVwiLFwic3ZcIixcInN3XCIsXCJzYWFcIixcInNhYlwiLFwic2FjXCIsXCJzYWRcIixcInNhZVwiLFwic2FmXCIsXCJzYWhcIixcInNhaVwiLFwic2FqXCIsXCJzYWtcIixcInNhbFwiLFwic2FtXCIsXCJzYW9cIixcInNhcFwiLFwic2FxXCIsXCJzYXJcIixcInNhc1wiLFwic2F0XCIsXCJzYXVcIixcInNhdlwiLFwic2F3XCIsXCJzYXhcIixcInNheVwiLFwic2F6XCIsXCJzYmFcIixcInNiYlwiLFwic2JjXCIsXCJzYmRcIixcInNiZVwiLFwic2JmXCIsXCJzYmdcIixcInNiaFwiLFwic2JpXCIsXCJzYmpcIixcInNia1wiLFwic2JsXCIsXCJzYm1cIixcInNiblwiLFwic2JvXCIsXCJzYnBcIixcInNicVwiLFwic2JyXCIsXCJzYnNcIixcInNidFwiLFwic2J1XCIsXCJzYnZcIixcInNid1wiLFwic2J4XCIsXCJzYnlcIixcInNielwiLFwic2NhXCIsXCJzY2JcIixcInNjZVwiLFwic2NmXCIsXCJzY2dcIixcInNjaFwiLFwic2NpXCIsXCJzY2tcIixcInNjbFwiLFwic2NuXCIsXCJzY29cIixcInNjcFwiLFwic2NxXCIsXCJzY3NcIixcInNjdFwiLFwic2N1XCIsXCJzY3ZcIixcInNjd1wiLFwic2N4XCIsXCJzZGFcIixcInNkYlwiLFwic2RjXCIsXCJzZGVcIixcInNkZlwiLFwic2RnXCIsXCJzZGhcIixcInNkalwiLFwic2RrXCIsXCJzZGxcIixcInNkbVwiLFwic2RuXCIsXCJzZG9cIixcInNkcFwiLFwic2RxXCIsXCJzZHJcIixcInNkc1wiLFwic2R0XCIsXCJzZHVcIixcInNkdlwiLFwic2R4XCIsXCJzZHpcIixcInNlYVwiLFwic2ViXCIsXCJzZWNcIixcInNlZFwiLFwic2VlXCIsXCJzZWZcIixcInNlZ1wiLFwic2VoXCIsXCJzZWlcIixcInNlalwiLFwic2VrXCIsXCJzZWxcIixcInNlbVwiLFwic2VuXCIsXCJzZW9cIixcInNlcFwiLFwic2VxXCIsXCJzZXJcIixcInNlc1wiLFwic2V0XCIsXCJzZXVcIixcInNldlwiLFwic2V3XCIsXCJzZXlcIixcInNlelwiLFwic2ZiXCIsXCJzZmVcIixcInNmbVwiLFwic2ZzXCIsXCJzZndcIixcInNnYVwiLFwic2diXCIsXCJzZ2NcIixcInNnZFwiLFwic2dlXCIsXCJzZ2dcIixcInNnaFwiLFwic2dpXCIsXCJzZ2pcIixcInNna1wiLFwic2dsXCIsXCJzZ21cIixcInNnblwiLFwic2dvXCIsXCJzZ3BcIixcInNnclwiLFwic2dzXCIsXCJzZ3RcIixcInNndVwiLFwic2d3XCIsXCJzZ3hcIixcInNneVwiLFwic2d6XCIsXCJzaGFcIixcInNoYlwiLFwic2hjXCIsXCJzaGRcIixcInNoZVwiLFwic2hnXCIsXCJzaGhcIixcInNoaVwiLFwic2hqXCIsXCJzaGtcIixcInNobFwiLFwic2htXCIsXCJzaG5cIixcInNob1wiLFwic2hwXCIsXCJzaHFcIixcInNoclwiLFwic2hzXCIsXCJzaHRcIixcInNodVwiLFwic2h2XCIsXCJzaHdcIixcInNoeFwiLFwic2h5XCIsXCJzaHpcIixcInNpYVwiLFwic2liXCIsXCJzaWRcIixcInNpZVwiLFwic2lmXCIsXCJzaWdcIixcInNpaFwiLFwic2lpXCIsXCJzaWpcIixcInNpa1wiLFwic2lsXCIsXCJzaW1cIixcInNpb1wiLFwic2lwXCIsXCJzaXFcIixcInNpclwiLFwic2lzXCIsXCJzaXRcIixcInNpdVwiLFwic2l2XCIsXCJzaXdcIixcInNpeFwiLFwic2l5XCIsXCJzaXpcIixcInNqYVwiLFwic2piXCIsXCJzamRcIixcInNqZVwiLFwic2pnXCIsXCJzamtcIixcInNqbFwiLFwic2ptXCIsXCJzam5cIixcInNqb1wiLFwic2pwXCIsXCJzanJcIixcInNqc1wiLFwic2p0XCIsXCJzanVcIixcInNqd1wiLFwic2thXCIsXCJza2JcIixcInNrY1wiLFwic2tkXCIsXCJza2VcIixcInNrZlwiLFwic2tnXCIsXCJza2hcIixcInNraVwiLFwic2tqXCIsXCJza2tcIixcInNrbVwiLFwic2tuXCIsXCJza29cIixcInNrcFwiLFwic2txXCIsXCJza3JcIixcInNrc1wiLFwic2t0XCIsXCJza3VcIixcInNrdlwiLFwic2t3XCIsXCJza3hcIixcInNreVwiLFwic2t6XCIsXCJzbGFcIixcInNsY1wiLFwic2xkXCIsXCJzbGVcIixcInNsZlwiLFwic2xnXCIsXCJzbGhcIixcInNsaVwiLFwic2xqXCIsXCJzbGxcIixcInNsbVwiLFwic2xuXCIsXCJzbHBcIixcInNscVwiLFwic2xyXCIsXCJzbHNcIixcInNsdFwiLFwic2x1XCIsXCJzbHdcIixcInNseFwiLFwic2x5XCIsXCJzbHpcIixcInNtYVwiLFwic21iXCIsXCJzbWNcIixcInNtZFwiLFwic21mXCIsXCJzbWdcIixcInNtaFwiLFwic21pXCIsXCJzbWpcIixcInNta1wiLFwic21sXCIsXCJzbW1cIixcInNtblwiLFwic21wXCIsXCJzbXFcIixcInNtclwiLFwic21zXCIsXCJzbXRcIixcInNtdVwiLFwic212XCIsXCJzbXdcIixcInNteFwiLFwic215XCIsXCJzbXpcIixcInNuYlwiLFwic25jXCIsXCJzbmVcIixcInNuZlwiLFwic25nXCIsXCJzbmhcIixcInNuaVwiLFwic25qXCIsXCJzbmtcIixcInNubFwiLFwic25tXCIsXCJzbm5cIixcInNub1wiLFwic25wXCIsXCJzbnFcIixcInNuclwiLFwic25zXCIsXCJzbnVcIixcInNudlwiLFwic253XCIsXCJzbnhcIixcInNueVwiLFwic256XCIsXCJzb2FcIixcInNvYlwiLFwic29jXCIsXCJzb2RcIixcInNvZVwiLFwic29nXCIsXCJzb2hcIixcInNvaVwiLFwic29qXCIsXCJzb2tcIixcInNvbFwiLFwic29uXCIsXCJzb29cIixcInNvcFwiLFwic29xXCIsXCJzb3JcIixcInNvc1wiLFwic291XCIsXCJzb3ZcIixcInNvd1wiLFwic294XCIsXCJzb3lcIixcInNvelwiLFwic3BiXCIsXCJzcGNcIixcInNwZFwiLFwic3BlXCIsXCJzcGdcIixcInNwaVwiLFwic3BrXCIsXCJzcGxcIixcInNwbVwiLFwic3BuXCIsXCJzcG9cIixcInNwcFwiLFwic3BxXCIsXCJzcHJcIixcInNwc1wiLFwic3B0XCIsXCJzcHVcIixcInNwdlwiLFwic3B4XCIsXCJzcHlcIixcInNxYVwiLFwic3FoXCIsXCJzcWpcIixcInNxa1wiLFwic3FtXCIsXCJzcW5cIixcInNxb1wiLFwic3FxXCIsXCJzcXJcIixcInNxc1wiLFwic3F0XCIsXCJzcXVcIixcInNxeFwiLFwic3JhXCIsXCJzcmJcIixcInNyY1wiLFwic3JlXCIsXCJzcmZcIixcInNyZ1wiLFwic3JoXCIsXCJzcmlcIixcInNya1wiLFwic3JsXCIsXCJzcm1cIixcInNyblwiLFwic3JvXCIsXCJzcnFcIixcInNyclwiLFwic3JzXCIsXCJzcnRcIixcInNydVwiLFwic3J2XCIsXCJzcndcIixcInNyeFwiLFwic3J5XCIsXCJzcnpcIixcInNzYVwiLFwic3NiXCIsXCJzc2NcIixcInNzZFwiLFwic3NlXCIsXCJzc2ZcIixcInNzZ1wiLFwic3NoXCIsXCJzc2lcIixcInNzalwiLFwic3NrXCIsXCJzc2xcIixcInNzbVwiLFwic3NuXCIsXCJzc29cIixcInNzcFwiLFwic3NxXCIsXCJzc3JcIixcInNzc1wiLFwic3N0XCIsXCJzc3VcIixcInNzdlwiLFwic3N4XCIsXCJzc3lcIixcInNzelwiLFwic3RhXCIsXCJzdGJcIixcInN0ZFwiLFwic3RlXCIsXCJzdGZcIixcInN0Z1wiLFwic3RoXCIsXCJzdGlcIixcInN0alwiLFwic3RrXCIsXCJzdGxcIixcInN0bVwiLFwic3RuXCIsXCJzdG9cIixcInN0cFwiLFwic3RxXCIsXCJzdHJcIixcInN0c1wiLFwic3R0XCIsXCJzdHVcIixcInN0dlwiLFwic3R3XCIsXCJzdHlcIixcInN1YVwiLFwic3ViXCIsXCJzdWNcIixcInN1ZVwiLFwic3VnXCIsXCJzdWlcIixcInN1alwiLFwic3VrXCIsXCJzdWxcIixcInN1bVwiLFwic3VvXCIsXCJzdXFcIixcInN1clwiLFwic3VzXCIsXCJzdXRcIixcInN1dlwiLFwic3V3XCIsXCJzdXhcIixcInN1eVwiLFwic3V6XCIsXCJzdmFcIixcInN2YlwiLFwic3ZjXCIsXCJzdmVcIixcInN2a1wiLFwic3ZtXCIsXCJzdnJcIixcInN2c1wiLFwic3Z4XCIsXCJzd2JcIixcInN3Y1wiLFwic3dmXCIsXCJzd2dcIixcInN3aFwiLFwic3dpXCIsXCJzd2pcIixcInN3a1wiLFwic3dsXCIsXCJzd21cIixcInN3blwiLFwic3dvXCIsXCJzd3BcIixcInN3cVwiLFwic3dyXCIsXCJzd3NcIixcInN3dFwiLFwic3d1XCIsXCJzd3ZcIixcInN3d1wiLFwic3d4XCIsXCJzd3lcIixcInN4YlwiLFwic3hjXCIsXCJzeGVcIixcInN4Z1wiLFwic3hrXCIsXCJzeGxcIixcInN4bVwiLFwic3huXCIsXCJzeG9cIixcInN4clwiLFwic3hzXCIsXCJzeHVcIixcInN4d1wiLFwic3lhXCIsXCJzeWJcIixcInN5Y1wiLFwic3lkXCIsXCJzeWlcIixcInN5a1wiLFwic3lsXCIsXCJzeW1cIixcInN5blwiLFwic3lvXCIsXCJzeXJcIixcInN5c1wiLFwic3l3XCIsXCJzeXhcIixcInN5eVwiLFwic3phXCIsXCJzemJcIixcInN6Y1wiLFwic3pkXCIsXCJzemVcIixcInN6Z1wiLFwic3psXCIsXCJzem5cIixcInN6cFwiLFwic3pzXCIsXCJzenZcIixcInN6d1wiLFwic3p5XCJdXG4sWyBcInRhXCIsXCJ0ZVwiLFwidGdcIixcInRoXCIsXCJ0aVwiLFwidGtcIixcInRsXCIsXCJ0blwiLFwidG9cIixcInRyXCIsXCJ0c1wiLFwidHRcIixcInR3XCIsXCJ0eVwiLFwidGFhXCIsXCJ0YWJcIixcInRhY1wiLFwidGFkXCIsXCJ0YWVcIixcInRhZlwiLFwidGFnXCIsXCJ0YWlcIixcInRhalwiLFwidGFrXCIsXCJ0YWxcIixcInRhblwiLFwidGFvXCIsXCJ0YXBcIixcInRhcVwiLFwidGFyXCIsXCJ0YXNcIixcInRhdVwiLFwidGF2XCIsXCJ0YXdcIixcInRheFwiLFwidGF5XCIsXCJ0YXpcIixcInRiYVwiLFwidGJiXCIsXCJ0YmNcIixcInRiZFwiLFwidGJlXCIsXCJ0YmZcIixcInRiZ1wiLFwidGJoXCIsXCJ0YmlcIixcInRialwiLFwidGJrXCIsXCJ0YmxcIixcInRibVwiLFwidGJuXCIsXCJ0Ym9cIixcInRicFwiLFwidGJxXCIsXCJ0YnJcIixcInRic1wiLFwidGJ0XCIsXCJ0YnVcIixcInRidlwiLFwidGJ3XCIsXCJ0YnhcIixcInRieVwiLFwidGJ6XCIsXCJ0Y2FcIixcInRjYlwiLFwidGNjXCIsXCJ0Y2RcIixcInRjZVwiLFwidGNmXCIsXCJ0Y2dcIixcInRjaFwiLFwidGNpXCIsXCJ0Y2tcIixcInRjbFwiLFwidGNtXCIsXCJ0Y25cIixcInRjb1wiLFwidGNwXCIsXCJ0Y3FcIixcInRjc1wiLFwidGN0XCIsXCJ0Y3VcIixcInRjd1wiLFwidGN4XCIsXCJ0Y3lcIixcInRjelwiLFwidGRhXCIsXCJ0ZGJcIixcInRkY1wiLFwidGRkXCIsXCJ0ZGVcIixcInRkZlwiLFwidGRnXCIsXCJ0ZGhcIixcInRkaVwiLFwidGRqXCIsXCJ0ZGtcIixcInRkbFwiLFwidGRtXCIsXCJ0ZG5cIixcInRkb1wiLFwidGRxXCIsXCJ0ZHJcIixcInRkc1wiLFwidGR0XCIsXCJ0ZHVcIixcInRkdlwiLFwidGR4XCIsXCJ0ZHlcIixcInRlYVwiLFwidGViXCIsXCJ0ZWNcIixcInRlZFwiLFwidGVlXCIsXCJ0ZWZcIixcInRlZ1wiLFwidGVoXCIsXCJ0ZWlcIixcInRla1wiLFwidGVtXCIsXCJ0ZW5cIixcInRlb1wiLFwidGVwXCIsXCJ0ZXFcIixcInRlclwiLFwidGVzXCIsXCJ0ZXRcIixcInRldVwiLFwidGV2XCIsXCJ0ZXdcIixcInRleFwiLFwidGV5XCIsXCJ0ZXpcIixcInRmaVwiLFwidGZuXCIsXCJ0Zm9cIixcInRmclwiLFwidGZ0XCIsXCJ0Z2FcIixcInRnYlwiLFwidGdjXCIsXCJ0Z2RcIixcInRnZVwiLFwidGdmXCIsXCJ0Z2dcIixcInRnaFwiLFwidGdpXCIsXCJ0Z2pcIixcInRnblwiLFwidGdvXCIsXCJ0Z3BcIixcInRncVwiLFwidGdyXCIsXCJ0Z3NcIixcInRndFwiLFwidGd1XCIsXCJ0Z3ZcIixcInRnd1wiLFwidGd4XCIsXCJ0Z3lcIixcInRnelwiLFwidGhjXCIsXCJ0aGRcIixcInRoZVwiLFwidGhmXCIsXCJ0aGhcIixcInRoaVwiLFwidGhrXCIsXCJ0aGxcIixcInRobVwiLFwidGhuXCIsXCJ0aHBcIixcInRocVwiLFwidGhyXCIsXCJ0aHNcIixcInRodFwiLFwidGh1XCIsXCJ0aHZcIixcInRod1wiLFwidGh4XCIsXCJ0aHlcIixcInRoelwiLFwidGlhXCIsXCJ0aWNcIixcInRpZFwiLFwidGllXCIsXCJ0aWZcIixcInRpZ1wiLFwidGloXCIsXCJ0aWlcIixcInRpalwiLFwidGlrXCIsXCJ0aWxcIixcInRpbVwiLFwidGluXCIsXCJ0aW9cIixcInRpcFwiLFwidGlxXCIsXCJ0aXNcIixcInRpdFwiLFwidGl1XCIsXCJ0aXZcIixcInRpd1wiLFwidGl4XCIsXCJ0aXlcIixcInRpelwiLFwidGphXCIsXCJ0amdcIixcInRqaVwiLFwidGpqXCIsXCJ0amxcIixcInRqbVwiLFwidGpuXCIsXCJ0am9cIixcInRqcFwiLFwidGpzXCIsXCJ0anVcIixcInRqd1wiLFwidGthXCIsXCJ0a2JcIixcInRrZFwiLFwidGtlXCIsXCJ0a2ZcIixcInRrZ1wiLFwidGtrXCIsXCJ0a2xcIixcInRrbVwiLFwidGtuXCIsXCJ0a3BcIixcInRrcVwiLFwidGtyXCIsXCJ0a3NcIixcInRrdFwiLFwidGt1XCIsXCJ0a3ZcIixcInRrd1wiLFwidGt4XCIsXCJ0a3pcIixcInRsYVwiLFwidGxiXCIsXCJ0bGNcIixcInRsZFwiLFwidGxmXCIsXCJ0bGdcIixcInRsaFwiLFwidGxpXCIsXCJ0bGpcIixcInRsa1wiLFwidGxsXCIsXCJ0bG1cIixcInRsblwiLFwidGxvXCIsXCJ0bHBcIixcInRscVwiLFwidGxyXCIsXCJ0bHNcIixcInRsdFwiLFwidGx1XCIsXCJ0bHZcIixcInRsd1wiLFwidGx4XCIsXCJ0bHlcIixcInRtYVwiLFwidG1iXCIsXCJ0bWNcIixcInRtZFwiLFwidG1lXCIsXCJ0bWZcIixcInRtZ1wiLFwidG1oXCIsXCJ0bWlcIixcInRtalwiLFwidG1rXCIsXCJ0bWxcIixcInRtbVwiLFwidG1uXCIsXCJ0bW9cIixcInRtcFwiLFwidG1xXCIsXCJ0bXJcIixcInRtc1wiLFwidG10XCIsXCJ0bXVcIixcInRtdlwiLFwidG13XCIsXCJ0bXlcIixcInRtelwiLFwidG5hXCIsXCJ0bmJcIixcInRuY1wiLFwidG5kXCIsXCJ0bmVcIixcInRuZlwiLFwidG5nXCIsXCJ0bmhcIixcInRuaVwiLFwidG5rXCIsXCJ0bmxcIixcInRubVwiLFwidG5uXCIsXCJ0bm9cIixcInRucFwiLFwidG5xXCIsXCJ0bnJcIixcInRuc1wiLFwidG50XCIsXCJ0bnVcIixcInRudlwiLFwidG53XCIsXCJ0bnhcIixcInRueVwiLFwidG56XCIsXCJ0b2JcIixcInRvY1wiLFwidG9kXCIsXCJ0b2VcIixcInRvZlwiLFwidG9nXCIsXCJ0b2hcIixcInRvaVwiLFwidG9qXCIsXCJ0b2xcIixcInRvbVwiLFwidG9vXCIsXCJ0b3BcIixcInRvcVwiLFwidG9yXCIsXCJ0b3NcIixcInRvdVwiLFwidG92XCIsXCJ0b3dcIixcInRveFwiLFwidG95XCIsXCJ0b3pcIixcInRwYVwiLFwidHBjXCIsXCJ0cGVcIixcInRwZlwiLFwidHBnXCIsXCJ0cGlcIixcInRwalwiLFwidHBrXCIsXCJ0cGxcIixcInRwbVwiLFwidHBuXCIsXCJ0cG9cIixcInRwcFwiLFwidHBxXCIsXCJ0cHJcIixcInRwdFwiLFwidHB1XCIsXCJ0cHZcIixcInRwd1wiLFwidHB4XCIsXCJ0cHlcIixcInRwelwiLFwidHFiXCIsXCJ0cWxcIixcInRxbVwiLFwidHFuXCIsXCJ0cW9cIixcInRxcFwiLFwidHFxXCIsXCJ0cXJcIixcInRxdFwiLFwidHF1XCIsXCJ0cXdcIixcInRyYVwiLFwidHJiXCIsXCJ0cmNcIixcInRyZFwiLFwidHJlXCIsXCJ0cmZcIixcInRyZ1wiLFwidHJoXCIsXCJ0cmlcIixcInRyalwiLFwidHJrXCIsXCJ0cmxcIixcInRybVwiLFwidHJuXCIsXCJ0cm9cIixcInRycFwiLFwidHJxXCIsXCJ0cnJcIixcInRyc1wiLFwidHJ0XCIsXCJ0cnVcIixcInRydlwiLFwidHJ3XCIsXCJ0cnhcIixcInRyeVwiLFwidHJ6XCIsXCJ0c2FcIixcInRzYlwiLFwidHNjXCIsXCJ0c2RcIixcInRzZVwiLFwidHNmXCIsXCJ0c2dcIixcInRzaFwiLFwidHNpXCIsXCJ0c2pcIixcInRza1wiLFwidHNsXCIsXCJ0c21cIixcInRzcFwiLFwidHNxXCIsXCJ0c3JcIixcInRzc1wiLFwidHN0XCIsXCJ0c3VcIixcInRzdlwiLFwidHN3XCIsXCJ0c3hcIixcInRzeVwiLFwidHN6XCIsXCJ0dGFcIixcInR0YlwiLFwidHRjXCIsXCJ0dGRcIixcInR0ZVwiLFwidHRmXCIsXCJ0dGdcIixcInR0aFwiLFwidHRpXCIsXCJ0dGpcIixcInR0a1wiLFwidHRsXCIsXCJ0dG1cIixcInR0blwiLFwidHRvXCIsXCJ0dHBcIixcInR0cVwiLFwidHRyXCIsXCJ0dHNcIixcInR0dFwiLFwidHR1XCIsXCJ0dHZcIixcInR0d1wiLFwidHR5XCIsXCJ0dHpcIixcInR1YVwiLFwidHViXCIsXCJ0dWNcIixcInR1ZFwiLFwidHVlXCIsXCJ0dWZcIixcInR1Z1wiLFwidHVoXCIsXCJ0dWlcIixcInR1alwiLFwidHVsXCIsXCJ0dW1cIixcInR1blwiLFwidHVvXCIsXCJ0dXBcIixcInR1cVwiLFwidHVzXCIsXCJ0dXRcIixcInR1dVwiLFwidHV2XCIsXCJ0dXdcIixcInR1eFwiLFwidHV5XCIsXCJ0dXpcIixcInR2YVwiLFwidHZkXCIsXCJ0dmVcIixcInR2a1wiLFwidHZsXCIsXCJ0dm1cIixcInR2blwiLFwidHZvXCIsXCJ0dnNcIixcInR2dFwiLFwidHZ1XCIsXCJ0dndcIixcInR2eFwiLFwidHZ5XCIsXCJ0d2FcIixcInR3YlwiLFwidHdjXCIsXCJ0d2RcIixcInR3ZVwiLFwidHdmXCIsXCJ0d2dcIixcInR3aFwiLFwidHdsXCIsXCJ0d21cIixcInR3blwiLFwidHdvXCIsXCJ0d3BcIixcInR3cVwiLFwidHdyXCIsXCJ0d3RcIixcInR3dVwiLFwidHd3XCIsXCJ0d3hcIixcInR3eVwiLFwidHhhXCIsXCJ0eGJcIixcInR4Y1wiLFwidHhlXCIsXCJ0eGdcIixcInR4aFwiLFwidHhpXCIsXCJ0eGpcIixcInR4bVwiLFwidHhuXCIsXCJ0eG9cIixcInR4cVwiLFwidHhyXCIsXCJ0eHNcIixcInR4dFwiLFwidHh1XCIsXCJ0eHhcIixcInR4eVwiLFwidHlhXCIsXCJ0eWVcIixcInR5aFwiLFwidHlpXCIsXCJ0eWpcIixcInR5bFwiLFwidHluXCIsXCJ0eXBcIixcInR5clwiLFwidHlzXCIsXCJ0eXRcIixcInR5dVwiLFwidHl2XCIsXCJ0eXhcIixcInR5eVwiLFwidHl6XCIsXCJ0emFcIixcInR6aFwiLFwidHpqXCIsXCJ0emxcIixcInR6bVwiLFwidHpuXCIsXCJ0em9cIixcInR6eFwiXVxuLFsgXCJ1Z1wiLFwidWtcIixcInVyXCIsXCJ1elwiLFwidWFtXCIsXCJ1YW5cIixcInVhclwiLFwidWJhXCIsXCJ1YmlcIixcInVibFwiLFwidWJyXCIsXCJ1YnVcIixcInVieVwiLFwidWRhXCIsXCJ1ZGVcIixcInVkZ1wiLFwidWRpXCIsXCJ1ZGpcIixcInVkbFwiLFwidWRtXCIsXCJ1ZHVcIixcInVlc1wiLFwidWZpXCIsXCJ1Z2FcIixcInVnYlwiLFwidWdlXCIsXCJ1Z25cIixcInVnb1wiLFwidWd5XCIsXCJ1aGFcIixcInVoblwiLFwidWlzXCIsXCJ1aXZcIixcInVqaVwiLFwidWthXCIsXCJ1a2dcIixcInVraFwiLFwidWtpXCIsXCJ1a2tcIixcInVrbFwiLFwidWtwXCIsXCJ1a3FcIixcInVrc1wiLFwidWt1XCIsXCJ1a3ZcIixcInVrd1wiLFwidWt5XCIsXCJ1bGFcIixcInVsYlwiLFwidWxjXCIsXCJ1bGVcIixcInVsZlwiLFwidWxpXCIsXCJ1bGtcIixcInVsbFwiLFwidWxtXCIsXCJ1bG5cIixcInVsdVwiLFwidWx3XCIsXCJ1bWFcIixcInVtYlwiLFwidW1jXCIsXCJ1bWRcIixcInVtZ1wiLFwidW1pXCIsXCJ1bW1cIixcInVtblwiLFwidW1vXCIsXCJ1bXBcIixcInVtclwiLFwidW1zXCIsXCJ1bXVcIixcInVuYVwiLFwidW5kXCIsXCJ1bmVcIixcInVuZ1wiLFwidW5pXCIsXCJ1bmtcIixcInVubVwiLFwidW5uXCIsXCJ1bnBcIixcInVuclwiLFwidW51XCIsXCJ1bnhcIixcInVuelwiLFwidW9rXCIsXCJ1cGlcIixcInVwdlwiLFwidXJhXCIsXCJ1cmJcIixcInVyY1wiLFwidXJlXCIsXCJ1cmZcIixcInVyZ1wiLFwidXJoXCIsXCJ1cmlcIixcInVyalwiLFwidXJrXCIsXCJ1cmxcIixcInVybVwiLFwidXJuXCIsXCJ1cm9cIixcInVycFwiLFwidXJyXCIsXCJ1cnRcIixcInVydVwiLFwidXJ2XCIsXCJ1cndcIixcInVyeFwiLFwidXJ5XCIsXCJ1cnpcIixcInVzYVwiLFwidXNoXCIsXCJ1c2lcIixcInVza1wiLFwidXNwXCIsXCJ1c3NcIixcInVzdVwiLFwidXRhXCIsXCJ1dGVcIixcInV0aFwiLFwidXRwXCIsXCJ1dHJcIixcInV0dVwiLFwidXVtXCIsXCJ1dW5cIixcInV1clwiLFwidXV1XCIsXCJ1dmVcIixcInV2aFwiLFwidXZsXCIsXCJ1d2FcIixcInV5YVwiLFwidXpuXCIsXCJ1enNcIl1cbixbIFwidmVcIixcInZpXCIsXCJ2b1wiLFwidmFhXCIsXCJ2YWVcIixcInZhZlwiLFwidmFnXCIsXCJ2YWhcIixcInZhaVwiLFwidmFqXCIsXCJ2YWxcIixcInZhbVwiLFwidmFuXCIsXCJ2YW9cIixcInZhcFwiLFwidmFyXCIsXCJ2YXNcIixcInZhdVwiLFwidmF2XCIsXCJ2YXlcIixcInZiYlwiLFwidmJrXCIsXCJ2ZWNcIixcInZlZFwiLFwidmVsXCIsXCJ2ZW1cIixcInZlb1wiLFwidmVwXCIsXCJ2ZXJcIixcInZnclwiLFwidmd0XCIsXCJ2aWNcIixcInZpZFwiLFwidmlmXCIsXCJ2aWdcIixcInZpbFwiLFwidmluXCIsXCJ2aXNcIixcInZpdFwiLFwidml2XCIsXCJ2a2FcIixcInZraVwiLFwidmtqXCIsXCJ2a2tcIixcInZrbFwiLFwidmttXCIsXCJ2a25cIixcInZrb1wiLFwidmtwXCIsXCJ2a3RcIixcInZrdVwiLFwidmt6XCIsXCJ2bHBcIixcInZsc1wiLFwidm1hXCIsXCJ2bWJcIixcInZtY1wiLFwidm1kXCIsXCJ2bWVcIixcInZtZlwiLFwidm1nXCIsXCJ2bWhcIixcInZtaVwiLFwidm1qXCIsXCJ2bWtcIixcInZtbFwiLFwidm1tXCIsXCJ2bXBcIixcInZtcVwiLFwidm1yXCIsXCJ2bXNcIixcInZtdVwiLFwidm12XCIsXCJ2bXdcIixcInZteFwiLFwidm15XCIsXCJ2bXpcIixcInZua1wiLFwidm5tXCIsXCJ2bnBcIixcInZvclwiLFwidm90XCIsXCJ2cmFcIixcInZyb1wiLFwidnJzXCIsXCJ2cnRcIixcInZzaVwiLFwidnNsXCIsXCJ2c3ZcIixcInZ0b1wiLFwidnVtXCIsXCJ2dW5cIixcInZ1dFwiLFwidndhXCJdXG4sWyBcIndhXCIsXCJ3b1wiLFwid2FhXCIsXCJ3YWJcIixcIndhY1wiLFwid2FkXCIsXCJ3YWVcIixcIndhZlwiLFwid2FnXCIsXCJ3YWhcIixcIndhaVwiLFwid2FqXCIsXCJ3YWtcIixcIndhbFwiLFwid2FtXCIsXCJ3YW5cIixcIndhb1wiLFwid2FwXCIsXCJ3YXFcIixcIndhclwiLFwid2FzXCIsXCJ3YXRcIixcIndhdVwiLFwid2F2XCIsXCJ3YXdcIixcIndheFwiLFwid2F5XCIsXCJ3YXpcIixcIndiYVwiLFwid2JiXCIsXCJ3YmVcIixcIndiZlwiLFwid2JoXCIsXCJ3YmlcIixcIndialwiLFwid2JrXCIsXCJ3YmxcIixcIndibVwiLFwid2JwXCIsXCJ3YnFcIixcIndiclwiLFwid2JzXCIsXCJ3YnRcIixcIndidlwiLFwid2J3XCIsXCJ3Y2FcIixcIndjaVwiLFwid2RkXCIsXCJ3ZGdcIixcIndkalwiLFwid2RrXCIsXCJ3ZHVcIixcIndkeVwiLFwid2VhXCIsXCJ3ZWNcIixcIndlZFwiLFwid2VnXCIsXCJ3ZWhcIixcIndlaVwiLFwid2VtXCIsXCJ3ZW5cIixcIndlb1wiLFwid2VwXCIsXCJ3ZXJcIixcIndlc1wiLFwid2V0XCIsXCJ3ZXVcIixcIndld1wiLFwid2ZnXCIsXCJ3Z2FcIixcIndnYlwiLFwid2dnXCIsXCJ3Z2lcIixcIndnb1wiLFwid2d1XCIsXCJ3Z3dcIixcIndneVwiLFwid2hhXCIsXCJ3aGdcIixcIndoa1wiLFwid2h1XCIsXCJ3aWJcIixcIndpY1wiLFwid2llXCIsXCJ3aWZcIixcIndpZ1wiLFwid2loXCIsXCJ3aWlcIixcIndpalwiLFwid2lrXCIsXCJ3aWxcIixcIndpbVwiLFwid2luXCIsXCJ3aXJcIixcIndpdFwiLFwid2l1XCIsXCJ3aXZcIixcIndpd1wiLFwid2l5XCIsXCJ3amFcIixcIndqaVwiLFwid2thXCIsXCJ3a2JcIixcIndrZFwiLFwid2tsXCIsXCJ3a3JcIixcIndrdVwiLFwid2t3XCIsXCJ3a3lcIixcIndsYVwiLFwid2xjXCIsXCJ3bGVcIixcIndsZ1wiLFwid2xoXCIsXCJ3bGlcIixcIndsa1wiLFwid2xsXCIsXCJ3bG1cIixcIndsb1wiLFwid2xyXCIsXCJ3bHNcIixcIndsdVwiLFwid2x2XCIsXCJ3bHdcIixcIndseFwiLFwid2x5XCIsXCJ3bWFcIixcIndtYlwiLFwid21jXCIsXCJ3bWRcIixcIndtZVwiLFwid21nXCIsXCJ3bWhcIixcIndtaVwiLFwid21tXCIsXCJ3bW5cIixcIndtb1wiLFwid21zXCIsXCJ3bXRcIixcIndtd1wiLFwid214XCIsXCJ3bmJcIixcInduY1wiLFwid25kXCIsXCJ3bmVcIixcInduZ1wiLFwid25pXCIsXCJ3bmtcIixcIndubVwiLFwid25uXCIsXCJ3bm9cIixcInducFwiLFwid251XCIsXCJ3bndcIixcIndueVwiLFwid29hXCIsXCJ3b2JcIixcIndvY1wiLFwid29kXCIsXCJ3b2VcIixcIndvZlwiLFwid29nXCIsXCJ3b2lcIixcIndva1wiLFwid29tXCIsXCJ3b25cIixcIndvb1wiLFwid29yXCIsXCJ3b3NcIixcIndvd1wiLFwid295XCIsXCJ3cGNcIixcIndyYVwiLFwid3JiXCIsXCJ3cmRcIixcIndyZ1wiLFwid3JoXCIsXCJ3cmlcIixcIndya1wiLFwid3JsXCIsXCJ3cm1cIixcIndyblwiLFwid3JvXCIsXCJ3cnBcIixcIndyclwiLFwid3JzXCIsXCJ3cnVcIixcIndydlwiLFwid3J3XCIsXCJ3cnhcIixcIndyeVwiLFwid3J6XCIsXCJ3c2FcIixcIndzZ1wiLFwid3NpXCIsXCJ3c2tcIixcIndzclwiLFwid3NzXCIsXCJ3c3VcIixcIndzdlwiLFwid3RmXCIsXCJ3dGhcIixcInd0aVwiLFwid3RrXCIsXCJ3dG1cIixcInd0d1wiLFwid3VhXCIsXCJ3dWJcIixcInd1ZFwiLFwid3VoXCIsXCJ3dWxcIixcInd1bVwiLFwid3VuXCIsXCJ3dXJcIixcInd1dFwiLFwid3V1XCIsXCJ3dXZcIixcInd1eFwiLFwid3V5XCIsXCJ3d2FcIixcInd3YlwiLFwid3dvXCIsXCJ3d3JcIixcInd3d1wiLFwid3hhXCIsXCJ3eHdcIixcInd5YVwiLFwid3liXCIsXCJ3eWlcIixcInd5bVwiLFwid3lyXCIsXCJ3eXlcIl1cbixbIFwieGhcIixcInhhYVwiLFwieGFiXCIsXCJ4YWNcIixcInhhZFwiLFwieGFlXCIsXCJ4YWdcIixcInhhaVwiLFwieGFqXCIsXCJ4YWtcIixcInhhbFwiLFwieGFtXCIsXCJ4YW5cIixcInhhb1wiLFwieGFwXCIsXCJ4YXFcIixcInhhclwiLFwieGFzXCIsXCJ4YXRcIixcInhhdVwiLFwieGF2XCIsXCJ4YXdcIixcInhheVwiLFwieGJhXCIsXCJ4YmJcIixcInhiY1wiLFwieGJkXCIsXCJ4YmVcIixcInhiZ1wiLFwieGJpXCIsXCJ4YmpcIixcInhibVwiLFwieGJuXCIsXCJ4Ym9cIixcInhicFwiLFwieGJyXCIsXCJ4YndcIixcInhieFwiLFwieGJ5XCIsXCJ4Y2JcIixcInhjY1wiLFwieGNlXCIsXCJ4Y2dcIixcInhjaFwiLFwieGNsXCIsXCJ4Y21cIixcInhjblwiLFwieGNvXCIsXCJ4Y3JcIixcInhjdFwiLFwieGN1XCIsXCJ4Y3ZcIixcInhjd1wiLFwieGN5XCIsXCJ4ZGFcIixcInhkY1wiLFwieGRrXCIsXCJ4ZG1cIixcInhkb1wiLFwieGR5XCIsXCJ4ZWJcIixcInhlZFwiLFwieGVnXCIsXCJ4ZWxcIixcInhlbVwiLFwieGVwXCIsXCJ4ZXJcIixcInhlc1wiLFwieGV0XCIsXCJ4ZXVcIixcInhmYVwiLFwieGdhXCIsXCJ4Z2JcIixcInhnZFwiLFwieGdmXCIsXCJ4Z2dcIixcInhnaVwiLFwieGdsXCIsXCJ4Z21cIixcInhnblwiLFwieGdyXCIsXCJ4Z3VcIixcInhnd1wiLFwieGhhXCIsXCJ4aGNcIixcInhoZFwiLFwieGhlXCIsXCJ4aHJcIixcInhodFwiLFwieGh1XCIsXCJ4aHZcIixcInhpYVwiLFwieGliXCIsXCJ4aWlcIixcInhpbFwiLFwieGluXCIsXCJ4aXBcIixcInhpclwiLFwieGlzXCIsXCJ4aXZcIixcInhpeVwiLFwieGpiXCIsXCJ4anRcIixcInhrYVwiLFwieGtiXCIsXCJ4a2NcIixcInhrZFwiLFwieGtlXCIsXCJ4a2ZcIixcInhrZ1wiLFwieGtoXCIsXCJ4a2lcIixcInhralwiLFwieGtrXCIsXCJ4a2xcIixcInhrblwiLFwieGtvXCIsXCJ4a3BcIixcInhrcVwiLFwieGtyXCIsXCJ4a3NcIixcInhrdFwiLFwieGt1XCIsXCJ4a3ZcIixcInhrd1wiLFwieGt4XCIsXCJ4a3lcIixcInhrelwiLFwieGxhXCIsXCJ4bGJcIixcInhsY1wiLFwieGxkXCIsXCJ4bGVcIixcInhsZ1wiLFwieGxpXCIsXCJ4bG5cIixcInhsb1wiLFwieGxwXCIsXCJ4bHNcIixcInhsdVwiLFwieGx5XCIsXCJ4bWFcIixcInhtYlwiLFwieG1jXCIsXCJ4bWRcIixcInhtZVwiLFwieG1mXCIsXCJ4bWdcIixcInhtaFwiLFwieG1qXCIsXCJ4bWtcIixcInhtbFwiLFwieG1tXCIsXCJ4bW5cIixcInhtb1wiLFwieG1wXCIsXCJ4bXFcIixcInhtclwiLFwieG1zXCIsXCJ4bXRcIixcInhtdVwiLFwieG12XCIsXCJ4bXdcIixcInhteFwiLFwieG15XCIsXCJ4bXpcIixcInhuYVwiLFwieG5iXCIsXCJ4bmRcIixcInhuZ1wiLFwieG5oXCIsXCJ4bmlcIixcInhualwiLFwieG5rXCIsXCJ4bm1cIixcInhublwiLFwieG5vXCIsXCJ4bnFcIixcInhuclwiLFwieG5zXCIsXCJ4bnRcIixcInhudVwiLFwieG55XCIsXCJ4bnpcIixcInhvY1wiLFwieG9kXCIsXCJ4b2dcIixcInhvaVwiLFwieG9rXCIsXCJ4b21cIixcInhvblwiLFwieG9vXCIsXCJ4b3BcIixcInhvclwiLFwieG93XCIsXCJ4cGFcIixcInhwYlwiLFwieHBjXCIsXCJ4cGRcIixcInhwZVwiLFwieHBmXCIsXCJ4cGdcIixcInhwaFwiLFwieHBpXCIsXCJ4cGpcIixcInhwa1wiLFwieHBsXCIsXCJ4cG1cIixcInhwblwiLFwieHBvXCIsXCJ4cHBcIixcInhwcVwiLFwieHByXCIsXCJ4cHNcIixcInhwdFwiLFwieHB1XCIsXCJ4cHZcIixcInhwd1wiLFwieHB4XCIsXCJ4cHlcIixcInhwelwiLFwieHFhXCIsXCJ4cXRcIixcInhyYVwiLFwieHJiXCIsXCJ4cmRcIixcInhyZVwiLFwieHJnXCIsXCJ4cmlcIixcInhybVwiLFwieHJuXCIsXCJ4cnFcIixcInhyclwiLFwieHJ0XCIsXCJ4cnVcIixcInhyd1wiLFwieHNhXCIsXCJ4c2JcIixcInhzY1wiLFwieHNkXCIsXCJ4c2VcIixcInhzaFwiLFwieHNpXCIsXCJ4c2pcIixcInhzbFwiLFwieHNtXCIsXCJ4c25cIixcInhzb1wiLFwieHNwXCIsXCJ4c3FcIixcInhzclwiLFwieHNzXCIsXCJ4c3VcIixcInhzdlwiLFwieHN5XCIsXCJ4dGFcIixcInh0YlwiLFwieHRjXCIsXCJ4dGRcIixcInh0ZVwiLFwieHRnXCIsXCJ4dGhcIixcInh0aVwiLFwieHRqXCIsXCJ4dGxcIixcInh0bVwiLFwieHRuXCIsXCJ4dG9cIixcInh0cFwiLFwieHRxXCIsXCJ4dHJcIixcInh0c1wiLFwieHR0XCIsXCJ4dHVcIixcInh0dlwiLFwieHR3XCIsXCJ4dHlcIixcInh0elwiLFwieHVhXCIsXCJ4dWJcIixcInh1ZFwiLFwieHVnXCIsXCJ4dWpcIixcInh1bFwiLFwieHVtXCIsXCJ4dW5cIixcInh1b1wiLFwieHVwXCIsXCJ4dXJcIixcInh1dFwiLFwieHV1XCIsXCJ4dmVcIixcInh2aVwiLFwieHZuXCIsXCJ4dm9cIixcInh2c1wiLFwieHdhXCIsXCJ4d2NcIixcInh3ZFwiLFwieHdlXCIsXCJ4d2dcIixcInh3alwiLFwieHdrXCIsXCJ4d2xcIixcInh3b1wiLFwieHdyXCIsXCJ4d3RcIixcInh3d1wiLFwieHhiXCIsXCJ4eGtcIixcInh4bVwiLFwieHhyXCIsXCJ4eHRcIixcInh5YVwiLFwieHliXCIsXCJ4eWpcIixcInh5a1wiLFwieHlsXCIsXCJ4eXRcIixcInh5eVwiLFwieHpoXCIsXCJ4em1cIixcInh6cFwiXVxuLFsgXCJ5aVwiLFwieW9cIixcInlhYVwiLFwieWFiXCIsXCJ5YWNcIixcInlhZFwiLFwieWFlXCIsXCJ5YWZcIixcInlhZ1wiLFwieWFoXCIsXCJ5YWlcIixcInlhalwiLFwieWFrXCIsXCJ5YWxcIixcInlhbVwiLFwieWFuXCIsXCJ5YW9cIixcInlhcFwiLFwieWFxXCIsXCJ5YXJcIixcInlhc1wiLFwieWF0XCIsXCJ5YXVcIixcInlhdlwiLFwieWF3XCIsXCJ5YXhcIixcInlheVwiLFwieWF6XCIsXCJ5YmFcIixcInliYlwiLFwieWJkXCIsXCJ5YmVcIixcInliaFwiLFwieWJpXCIsXCJ5YmpcIixcInlia1wiLFwieWJsXCIsXCJ5Ym1cIixcInliblwiLFwieWJvXCIsXCJ5YnhcIixcInlieVwiLFwieWNoXCIsXCJ5Y2xcIixcInljblwiLFwieWNwXCIsXCJ5ZGFcIixcInlkZFwiLFwieWRlXCIsXCJ5ZGdcIixcInlka1wiLFwieWRzXCIsXCJ5ZWFcIixcInllY1wiLFwieWVlXCIsXCJ5ZWlcIixcInllalwiLFwieWVsXCIsXCJ5ZW5cIixcInllclwiLFwieWVzXCIsXCJ5ZXRcIixcInlldVwiLFwieWV2XCIsXCJ5ZXlcIixcInlnYVwiLFwieWdpXCIsXCJ5Z2xcIixcInlnbVwiLFwieWdwXCIsXCJ5Z3JcIixcInlnc1wiLFwieWd1XCIsXCJ5Z3dcIixcInloYVwiLFwieWhkXCIsXCJ5aGxcIixcInloc1wiLFwieWlhXCIsXCJ5aWZcIixcInlpZ1wiLFwieWloXCIsXCJ5aWlcIixcInlpalwiLFwieWlrXCIsXCJ5aWxcIixcInlpbVwiLFwieWluXCIsXCJ5aXBcIixcInlpcVwiLFwieWlyXCIsXCJ5aXNcIixcInlpdFwiLFwieWl1XCIsXCJ5aXZcIixcInlpeFwiLFwieWl5XCIsXCJ5aXpcIixcInlrYVwiLFwieWtnXCIsXCJ5a2lcIixcInlra1wiLFwieWtsXCIsXCJ5a21cIixcInlrblwiLFwieWtvXCIsXCJ5a3JcIixcInlrdFwiLFwieWt1XCIsXCJ5a3lcIixcInlsYVwiLFwieWxiXCIsXCJ5bGVcIixcInlsZ1wiLFwieWxpXCIsXCJ5bGxcIixcInlsbVwiLFwieWxuXCIsXCJ5bG9cIixcInlsclwiLFwieWx1XCIsXCJ5bHlcIixcInltYVwiLFwieW1iXCIsXCJ5bWNcIixcInltZFwiLFwieW1lXCIsXCJ5bWdcIixcInltaFwiLFwieW1pXCIsXCJ5bWtcIixcInltbFwiLFwieW1tXCIsXCJ5bW5cIixcInltb1wiLFwieW1wXCIsXCJ5bXFcIixcInltclwiLFwieW1zXCIsXCJ5bXRcIixcInlteFwiLFwieW16XCIsXCJ5bmFcIixcInluZFwiLFwieW5lXCIsXCJ5bmdcIixcInluaFwiLFwieW5rXCIsXCJ5bmxcIixcInlublwiLFwieW5vXCIsXCJ5bnFcIixcInluc1wiLFwieW51XCIsXCJ5b2JcIixcInlvZ1wiLFwieW9pXCIsXCJ5b2tcIixcInlvbFwiLFwieW9tXCIsXCJ5b25cIixcInlvc1wiLFwieW90XCIsXCJ5b3hcIixcInlveVwiLFwieXBhXCIsXCJ5cGJcIixcInlwZ1wiLFwieXBoXCIsXCJ5cGtcIixcInlwbVwiLFwieXBuXCIsXCJ5cG9cIixcInlwcFwiLFwieXB6XCIsXCJ5cmFcIixcInlyYlwiLFwieXJlXCIsXCJ5cmlcIixcInlya1wiLFwieXJsXCIsXCJ5cm1cIixcInlyblwiLFwieXJvXCIsXCJ5cnNcIixcInlyd1wiLFwieXJ5XCIsXCJ5c2NcIixcInlzZFwiLFwieXNnXCIsXCJ5c2xcIixcInlzbVwiLFwieXNuXCIsXCJ5c29cIixcInlzcFwiLFwieXNyXCIsXCJ5c3NcIixcInlzeVwiLFwieXRhXCIsXCJ5dGxcIixcInl0cFwiLFwieXR3XCIsXCJ5dHlcIixcInl1YVwiLFwieXViXCIsXCJ5dWNcIixcInl1ZFwiLFwieXVlXCIsXCJ5dWZcIixcInl1Z1wiLFwieXVpXCIsXCJ5dWpcIixcInl1a1wiLFwieXVsXCIsXCJ5dW1cIixcInl1blwiLFwieXVwXCIsXCJ5dXFcIixcInl1clwiLFwieXV0XCIsXCJ5dXVcIixcInl1d1wiLFwieXV4XCIsXCJ5dXlcIixcInl1elwiLFwieXZhXCIsXCJ5dnRcIixcInl3YVwiLFwieXdnXCIsXCJ5d2xcIixcInl3blwiLFwieXdxXCIsXCJ5d3JcIixcInl3dFwiLFwieXd1XCIsXCJ5d3dcIixcInl4YVwiLFwieXhnXCIsXCJ5eGxcIixcInl4bVwiLFwieXh1XCIsXCJ5eHlcIixcInl5clwiLFwieXl1XCIsXCJ5eXpcIixcInl6Z1wiLFwieXprXCJdXG4sWyBcInphXCIsXCJ6aFwiLFwienVcIixcInphYVwiLFwiemFiXCIsXCJ6YWNcIixcInphZFwiLFwiemFlXCIsXCJ6YWZcIixcInphZ1wiLFwiemFoXCIsXCJ6YWlcIixcInphalwiLFwiemFrXCIsXCJ6YWxcIixcInphbVwiLFwiemFvXCIsXCJ6YXBcIixcInphcVwiLFwiemFyXCIsXCJ6YXNcIixcInphdFwiLFwiemF1XCIsXCJ6YXZcIixcInphd1wiLFwiemF4XCIsXCJ6YXlcIixcInphelwiLFwiemJhXCIsXCJ6YmNcIixcInpiZVwiLFwiemJsXCIsXCJ6YnRcIixcInpidVwiLFwiemJ3XCIsXCJ6Y2FcIixcInpjaFwiLFwiemRqXCIsXCJ6ZWFcIixcInplZ1wiLFwiemVoXCIsXCJ6ZW5cIixcInpnYVwiLFwiemdiXCIsXCJ6Z2hcIixcInpnbVwiLFwiemduXCIsXCJ6Z3JcIixcInpoYlwiLFwiemhkXCIsXCJ6aGlcIixcInpoblwiLFwiemh3XCIsXCJ6aHhcIixcInppYVwiLFwiemliXCIsXCJ6aWtcIixcInppbFwiLFwiemltXCIsXCJ6aW5cIixcInppclwiLFwieml3XCIsXCJ6aXpcIixcInprYVwiLFwiemtiXCIsXCJ6a2RcIixcInprZ1wiLFwiemtoXCIsXCJ6a2tcIixcInprblwiLFwiemtvXCIsXCJ6a3BcIixcInprclwiLFwiemt0XCIsXCJ6a3VcIixcInprdlwiLFwiemt6XCIsXCJ6bGFcIixcInpsZVwiLFwiemxqXCIsXCJ6bG1cIixcInpsblwiLFwiemxxXCIsXCJ6bHNcIixcInpsd1wiLFwiem1hXCIsXCJ6bWJcIixcInptY1wiLFwiem1kXCIsXCJ6bWVcIixcInptZlwiLFwiem1nXCIsXCJ6bWhcIixcInptaVwiLFwiem1qXCIsXCJ6bWtcIixcInptbFwiLFwiem1tXCIsXCJ6bW5cIixcInptb1wiLFwiem1wXCIsXCJ6bXFcIixcInptclwiLFwiem1zXCIsXCJ6bXRcIixcInptdVwiLFwiem12XCIsXCJ6bXdcIixcInpteFwiLFwiem15XCIsXCJ6bXpcIixcInpuYVwiLFwiem5kXCIsXCJ6bmVcIixcInpuZ1wiLFwiem5rXCIsXCJ6bnNcIixcInpvY1wiLFwiem9oXCIsXCJ6b21cIixcInpvb1wiLFwiem9xXCIsXCJ6b3JcIixcInpvc1wiLFwienBhXCIsXCJ6cGJcIixcInpwY1wiLFwienBkXCIsXCJ6cGVcIixcInpwZlwiLFwienBnXCIsXCJ6cGhcIixcInpwaVwiLFwienBqXCIsXCJ6cGtcIixcInpwbFwiLFwienBtXCIsXCJ6cG5cIixcInpwb1wiLFwienBwXCIsXCJ6cHFcIixcInpwclwiLFwienBzXCIsXCJ6cHRcIixcInpwdVwiLFwienB2XCIsXCJ6cHdcIixcInpweFwiLFwienB5XCIsXCJ6cHpcIixcInpxZVwiLFwienJhXCIsXCJ6cmdcIixcInpyblwiLFwienJvXCIsXCJ6cnBcIixcInpyc1wiLFwienNhXCIsXCJ6c2tcIixcInpzbFwiLFwienNtXCIsXCJ6c3JcIixcInpzdVwiLFwienRlXCIsXCJ6dGdcIixcInp0bFwiLFwienRtXCIsXCJ6dG5cIixcInp0cFwiLFwienRxXCIsXCJ6dHNcIixcInp0dFwiLFwienR1XCIsXCJ6dHhcIixcInp0eVwiLFwienVhXCIsXCJ6dWhcIixcInp1bVwiLFwienVuXCIsXCJ6dXlcIixcInp3YVwiLFwienh4XCIsXCJ6eWJcIixcInp5Z1wiLFwienlqXCIsXCJ6eW5cIixcInp5cFwiLFwienphXCIsXCJ6empcIl1cbl07XG5cblxuZXhwb3J0IGNsYXNzIExhbmdVdGlsIHtcblxuICAgIC8qIERldGVybWluZSBpZiBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBCQ1AgNDcgc3RyaW5nICovXG4gICAgcHVibGljIHN0YXRpYyBpc0JjcDQ3KGxhbmdTdHI6IHN0cmluZykgOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIC9eKChbYS16QS1aXXsyLDN9KC1bYS16QS1aXSgtW2EtekEtWl17M30pezAsMn0pP3xbYS16QS1aXXs0fXxbYS16QS1aXXs1LDh9KSgtW2EtekEtWl17NH0pPygtKFthLXpBLVpdezJ9fFswLTldezN9KSk/KC0oWzAtOWEtekEtWl17NSw4fXxbMC05XVthLXpBLVpdezN9KSkqKC1bMC05YS13eS16QS1XWS1aXSgtW2EtekEtWjAtOV17Miw4fSkrKSooLXgoLVthLXpBLVowLTldezEsOH0pKyk/fHgoLVthLXpBLVowLTldezEsOH0pK3woZW4tR0Itb2VkfGktYW1pfGktYm5ufGktZGVmYXVsdHxpLWVub2NoaWFufGktaGFrfGkta2xpbmdvbnxpLWx1eHxpLW1pbmdvfGktbmF2YWpvfGktcHdufGktdGFvfGktdGF5fGktdHN1fHNnbi1CRS1GUnxzZ24tQkUtTkx8c2duLUNILURFfGFydC1sb2piYW58Y2VsLWdhdWxpc2h8bm8tYm9rfG5vLW55bnx6aC1ndW95dXx6aC1oYWtrYXx6aC1taW58emgtbWluLW5hbnx6aC14aWFuZykpJC8udGVzdChsYW5nU3RyKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHByaW1hcnkgPSBsYW5nU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChwcmltYXJ5LmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgcHJpbWFyeSA9IHByaW1hcnkuc3BsaXQoXCItXCIpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwcmltYXJ5Lm1hdGNoKC9bYS16XXsyLDN9LykpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBxYWEuLnF0elxuICAgICAgICBpZiAocHJpbWFyeS5sZW5ndGggPT09IDMgXG4gICAgICAgICAgICAmJiBwcmltYXJ5LmNoYXJBdCgwKSA9PT0gXCJxXCJcbiAgICAgICAgICAgICYmIHByaW1hcnkuY2hhckNvZGVBdCgxKSA+PSA5NyAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMSkgPD0gMTE2XG4gICAgICAgICAgICAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMikgPj0gOTcgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDIpIDw9IDEyMikge1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZFByaW1hcnlMYW5nc1twcmltYXJ5LmNoYXJDb2RlQXQoMCktOTddLmluY2x1ZGVzKHByaW1hcnkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbWF0Y2hQcmltYXJ5TGFuZyhsYW5nMTogc3RyaW5nLCBsYW5nMjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBwcmltYXJ5MSA9IGxhbmcxO1xuICAgICAgICBpZiAocHJpbWFyeTEuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICBwcmltYXJ5MSA9IHByaW1hcnkxLnNwbGl0KFwiLVwiKVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcmltYXJ5MiA9IGxhbmcyO1xuICAgICAgICBpZiAocHJpbWFyeTIuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICBwcmltYXJ5MiA9IHByaW1hcnkyLnNwbGl0KFwiLVwiKVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmltYXJ5MS50b0xvd2VyQ2FzZSgpID09PSBwcmltYXJ5Mi50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IElNYXBwZXIsIElNYXBSZXN1bHQsIEJvdW5kcyB9IGZyb20gXCIuLi9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbW1vbk1hcHBlciBpbXBsZW1lbnRzIElNYXBwZXIge1xuICAgIGFic3RyYWN0IGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmc7XG4gICAgYWJzdHJhY3QgZ2V0TmFtZXNwYWNlKCkgOiBzdHJpbmc7XG4gICAgYWJzdHJhY3QgZ2V0QXR0cmlidXRlcyhub2RlOiBOb2RlKSA6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfTtcblxuICAgIHByb3RlY3RlZCBoaWVyYXJjaHlSb2xlIDogc3RyaW5nW10gPSBudWxsO1xuICAgIHByb3RlY3RlZCBoaWVyYXJjaHlQYXRoOiBBcnJheTx7XG4gICAgICAgIHJvbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgW3JvbGU6IHN0cmluZ106IG51bWJlclxuICAgICAgICB9XG4gICAgfT4gPSBudWxsO1xuICAgIHByb3RlY3RlZCBoaWVyYXJjaHlSZXN1bHRzOiBJTWFwUmVzdWx0W10gPSBudWxsO1xuXG4gICAgZ2V0Qm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmVzZXQobm9kZTogTm9kZSkge1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUgPSBbXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aCA9IFt7XG4gICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgIHJvbGVDb3VudDoge31cbiAgICAgICAgfV07XG5cbiAgICAgICAgbGV0IGFuY2VzdG9ycyA6IE5vZGVbXSA9IFtdO1xuICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9IDkgLyogTm9kZS5ET0NVTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICBhbmNlc3RvcnMucHVzaChwYXJlbnQpO1xuICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMucmV2ZXJzZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGFuY2VzdG9ycykge1xuICAgICAgICAgICAgbGV0IHNpYmxpbmdzID0gW107XG4gICAgICAgICAgICBsZXQgc2libGluZyA9IGFuY2VzdG9yLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIHdoaWxlIChzaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaWJsaW5ncyA9IHNpYmxpbmdzLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2libGluZyBvZiBzaWJsaW5ncykge1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcEhpZXJhcmNoeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wdXNoSGllcmFyY2h5KGFuY2VzdG9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBwdXNoSGllcmFyY2h5KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgbGV0IHJvbGUgOiBzdHJpbmcgPSB0aGlzLmdldFJvbGUobm9kZSkgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlLnB1c2gocm9sZSk7XG4gICAgICAgIGlmIChyb2xlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50UGF0aEluZm8gPSB0aGlzLmhpZXJhcmNoeVBhdGhbdGhpcy5oaWVyYXJjaHlQYXRoLmxlbmd0aC0xXTtcbiAgICAgICAgICAgIHBhcmVudFBhdGhJbmZvLnJvbGVDb3VudFtyb2xlXSA9IChwYXJlbnRQYXRoSW5mby5yb2xlQ291bnRbcm9sZV0gfHwgMCkgKyAxOyBcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wdXNoKHtcbiAgICAgICAgICAgICAgICBcInJvbGVQYXRoXCI6IHBhcmVudFBhdGhJbmZvLnJvbGVQYXRoK1wiL1wiK3JvbGUrXCJbXCIrcGFyZW50UGF0aEluZm8ucm9sZUNvdW50W3JvbGVdK1wiXVwiLFxuICAgICAgICAgICAgICAgIFwicm9sZUNvdW50XCI6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhdHRyID0ge31cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZXMobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZTogdGhpcy5nZXROYW1lc3BhY2UoKSxcbiAgICAgICAgICAgIHJvbGU6IHJvbGUsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyLFxuICAgICAgICAgICAgcm9sZVBhdGg6IHRoaXMuaGllcmFyY2h5UGF0aFt0aGlzLmhpZXJhcmNoeVBhdGgubGVuZ3RoLTFdLnJvbGVQYXRoLFxuICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhub2RlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBwb3BIaWVyYXJjaHkoKSB7XG4gICAgICAgIGxldCByb2xlID0gdGhpcy5oaWVyYXJjaHlSb2xlLnBvcCgpO1xuICAgICAgICBpZiAocm9sZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cy5wb3AoKTtcbiAgICB9XG5cbiAgICBvcGVuU2NvcGUobm9kZTogTm9kZSk6IElNYXBSZXN1bHRbXSB7XG4gICAgICAgIGlmICh0aGlzLmhpZXJhcmNoeVJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wdXNoSGllcmFyY2h5KG5vZGUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGllcmFyY2h5UmVzdWx0cztcbiAgICB9XG5cbiAgICBjbG9zZVNjb3BlKG5vZGU6IE5vZGUpOiBJTWFwUmVzdWx0W10ge1xuICAgICAgICBsZXQgcmV0VmFsIDogSU1hcFJlc3VsdFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHRoaXMuaGllcmFyY2h5UmVzdWx0cykge1xuICAgICAgICAgICAgLy8gY29uc3QgdGVtcCA9IHJlcy5ub2RlO1xuICAgICAgICAgICAgLy8gcmVzLm5vZGUgPSBudWxsO1xuICAgICAgICAgICAgLy8gbGV0IGNsb25lZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzKSk7XG4gICAgICAgICAgICAvLyBjbG9uZWQubm9kZSA9IHJlcy5ub2RlID0gdGVtcDsgXG4gICAgICAgICAgICAvLyByZXRWYWwucHVzaChjbG9uZWQpO1xuICAgICAgICAgICAgcmV0VmFsLnB1c2gocmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlID0gXCIvXCIrcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZVxuICAgICAgICB0aGlzLnBvcEhpZXJhcmNoeSgpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgSU1hcFJlc3VsdCB9IGZyb20gXCIuLi9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lFbmdpbmVcIjtcblxuLy8gQ29udGV4dCB0aGF0IHdpbGwgY2F1c2UgdGhpcyBydWxlIHRvIGV4ZWN1dGUuIFxuLy8gQ29udGV4dCBzeW50YXg6XG4vLyAgIFRyaWdnZXJzOlxuLy8gICAgIGFyaWE6cm9sZSAtIFRyaWdnZXJzIG9uIGVsZW1lbnQgd2l0aCBBUklBIHJvbGUgcm9sZVxuLy8gICAgIGFyaWE6cm9sZVthdHRyaWJ1dGVdIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0aGUgZXF1aXZhbGVudCBsb2dpY2FsIFxuLy8gICAgICAgYXJpYS0gYXR0cmlidXRlIChlLmcuLCBidXR0b25bZGlzYWJsZWRdIHdpbGwgdHJpZ2dlciBvbiBcbi8vICAgICAgIDxidXR0b24gZGlzYWJsZWQ+IG9yIDxkaXYgcm9sZT1cImJ1dHRvblwiIGFyaWEtZGlzYWJsZWQ9XCJ0cnVlXCI+KVxuLy8gICAgIHJvbGVbYXR0cmlidXRlPXZhbHVlXSAtIFNpbWlsYXIgdG8gYWJvdmUsIHdpdGggY2FzZS1zZW5zaXRpdmUgbWF0Y2hcbi8vICAgICAgIHRvIHZhbHVlXG4vLyAgICAgcm9sZVthdHRyaWJ1dGV+dmFsdWVdIC0gU2ltaWxhciB0byBhYm92ZSwgd2l0aCBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoXG4vLyAgICAgZG9tOmVsZW1lbnQgLSBUcmlnZ2VycyBvbiBhbiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lXG4vLyAgICAgZG9tOmVsZW1lbnRbYXR0cmlidXRlXSAtIFRyaWdnZXJzIG9uIGEgZG9tIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuLy8gICAgIGRvbToqW2F0dHJpYnV0ZV0gLSBUcmlnZ2VycyBvbiBhbGwgZWxlbWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuLy8gICBDb21iaW5pbmcgdHJpZ2dlcnM6XG4vLyAgICAgdHJpZ2dlcjEgdHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGhpbiBhbiBcbi8vICAgICAgIGVsZW1lbnQgd2l0aCB0cmlnZ2VyMVxuLy8gICAgICF0cmlnZ2VyMSB0cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgbm90IHdpdGhpblxuLy8gICAgICAgZWxlbWVudCB3aXRoIHRyaWdnZXIxXG4vLyAgICAgdHJpZ2dlcjE+dHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGggYW5cbi8vICAgICAgIGFuIGltbWVkaWF0ZSBwYXJlbnQgd2l0aCB0cmlnZ2VyMVxuLy8gICAgIHRyaWdnZXIxK3RyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiB3aXRoIGFuXG4vLyAgICAgICBpbW1lZGlhdGUgcHJldmlvdXMgc2libGluZyB3aXRoIHRyaWdnZXIxXG4vLyAgICAgdHJpZ2dlcjF+dHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGggYW5cbi8vICAgICAgIHNvbWUgZWFybGllciBzaWJsaW5nIHdpdGggdHJpZ2dlcjFcbi8vICAgICBjb250ZXh0LGNvbnRleHQgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIGVpdGhlciBjb250ZXh0XG5leHBvcnQgY2xhc3MgQXR0ckluZm8ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaW5jbHVzaXZlOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgYXR0cjogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgZXE/OiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyB2YWx1ZT86IHN0cmluZ1xuICAgICkge1xuICAgICAgICBpZiAoIWluY2x1c2l2ZSBcbiAgICAgICAgICAgICAgICAmJiAoKHR5cGVvZiBlcSkgIT09IFwidW5kZWZpbmVkXCIgJiYgZXEubGVuZ3RoID4gMCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBoYXZlICFhdHRyXCIrZXErXCIgY29udGV4dFwiKTsgICAgXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1c2l2ZSAmJiAodHlwZW9mIGVxKSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlcS5sZW5ndGggPiAwICYmICgodHlwZW9mIHZhbHVlKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB2YWx1ZS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaGF2ZSBlcXVpdmFsZW5jZSBjaGVjayB3aXRob3V0IGEgdmFsdWVcIik7ICAgIFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG1hdGNoZXMoY29udGV4dDogSU1hcFJlc3VsdCkge1xuICAgICAgICBjb25zdCBydWxlQXR0clBhcnQgPSB0aGlzOyBcbiAgICAgICAgY29uc3QgZWxlbUF0dHJzID0gY29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoIShydWxlQXR0clBhcnQuYXR0ciBpbiBlbGVtQXR0cnMpKSB7XG4gICAgICAgICAgICByZXR1cm4gIXJ1bGVBdHRyUGFydC5pbmNsdXNpdmVcbiAgICAgICAgfSBlbHNlIGlmICghcnVsZUF0dHJQYXJ0LmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKCFydWxlQXR0clBhcnQuZXEpIHtcbiAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBtYXRjaCBhbmQgSSBoYXZlIHRoYXQgYXR0cmlidXRlIGFuZCBubyBlcXVpdmFsZW5jZSBkZWZpbmVkXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBtYXRjaCBhbmQgSSBoYXZlIHRoYXQgYXR0cmlidXRlIGFuZCBlcXVpdmFsZW5jZSBkZWZpbmVkXG4gICAgICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSBlbGVtQXR0cnNbcnVsZUF0dHJQYXJ0LmF0dHJdO1xuICAgICAgICAgICAgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZUF0dHJQYXJ0LnZhbHVlID09PSBhdHRyVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCIhPVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSAhPT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiflwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSA9PT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiIX5cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlQXR0clBhcnQudmFsdWUgIT09IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBlcXVpdmFsZW5jZSBvcGVyYXRvciBub3Qgc3VwcG9ydGVkXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYXJ0SW5mbyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpbmNsdXNpdmU6IGJvb2xlYW4sIFxuICAgICAgICBwdWJsaWMgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByb2xlOiBzdHJpbmcsIFxuICAgICAgICBwdWJsaWMgYXR0cnM6IEF0dHJJbmZvW10sIFxuICAgICAgICBwdWJsaWMgY29ubmVjdG9yOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcIipcIiAmJiAhaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiISogY29udGV4dCBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hlcyggXG4gICAgICAgIGNvbnRleHRIaWVyOiBSdWxlQ29udGV4dEhpZXJhcmNoeSxcbiAgICAgICAgaGllckxldmVsOiBudW1iZXIpIDogYm9vbGVhbiBcbiAgICB7XG4gICAgICAgIGNvbnN0IHJ1bGVQYXJ0ID0gdGhpcztcbiAgICAgICAgbGV0IHJ1bGVSb2xlTWF0Y2ggPSAocnVsZVBhcnQubmFtZXNwYWNlIGluIGNvbnRleHRIaWVyKSAmJiBjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF1cbiAgICAgICAgICAgICYmIChjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF0ucm9sZSA9PT0gcnVsZVBhcnQucm9sZVxuICAgICAgICAgICAgICAgIHx8IGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlICE9PSBcIm5vbmVcIiAmJiBydWxlUGFydC5yb2xlID09PSBcIipcIik7XG4gICAgICAgIGlmIChydWxlUm9sZU1hdGNoIFxuICAgICAgICAgICAgJiYgcnVsZVBhcnQucm9sZSA9PT0gXCIqXCIgXG4gICAgICAgICAgICAmJiBydWxlUGFydC5uYW1lc3BhY2UgPT09IFwiZG9tXCIgXG4gICAgICAgICAgICAmJiAoY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdLnJvbGUgPT09IFwiI3RleHRcIlxuICAgICAgICAgICAgICAgIHx8IGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlID09PSBcIi8jdGV4dFwiKSkge1xuICAgICAgICAgICAgcnVsZVJvbGVNYXRjaCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlUGFydC5pbmNsdXNpdmUgJiYgIXJ1bGVSb2xlTWF0Y2gpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFydWxlUGFydC5pbmNsdXNpdmUgJiYgIXJ1bGVSb2xlTWF0Y2gpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIE1hdGNoIHRoZSBhdHRyaWJ1dGVzXG4gICAgICAgIGNvbnN0IHJ1bGVBdHRycyA9IHJ1bGVQYXJ0LmF0dHJzO1xuICAgICAgICBjb25zdCBlbGVtQ29udGV4dCA9IGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXTtcbiAgICAgICAgbGV0IG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlQXR0clBhcnQgb2YgcnVsZUF0dHJzKSB7XG4gICAgICAgICAgICBtYXRjaCA9IG1hdGNoICYmIHJ1bGVBdHRyUGFydC5tYXRjaGVzKGVsZW1Db250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bGVQYXJ0LmluY2x1c2l2ZSkgbWF0Y2ggPSAhbWF0Y2g7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIENvbnRleHQge1xuICAgIGNvbnRleHRJbmZvIDogUGFydEluZm9bXSA9IFtdXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGNvbnRleHRIaWVyTWF0Y2hlcyA6IHN0cmluZ1tdID0gY29udGV4dC5tYXRjaCgvIT9bL2EtekEtWjowLTkqXFwtX10rKFxcW1teXFxdXStcXF0pKlsgPit+XT8vZyk7XG4gICAgICAgIGxldCByZXN1bHRzIDogUGFydEluZm9bXSA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBjb250ZXh0SGllck1hdGNoZXMpIHtcbiAgICAgICAgICAgIGxldCBwYXJ0cyA9IHBhcnQubWF0Y2goLyghPykoWy9hLXpBLVo6MC05KlxcLV9dKykoKFxcW1teXFxdXStcXF0pKikoWyA+K35dPykvKTtcbiAgICAgICAgICAgIGxldCBhdHRySW5mbyA6IEF0dHJJbmZvW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0clBhcnQgb2YgcGFydHNbM10ubWF0Y2goL1xcWyhbXlxcXV0rKVxcXS9nKSB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyUGFydHMgPSBhdHRyUGFydC5tYXRjaCgvXFxbKCE/KShbYS16OkEtWipcXC1fXSspKCE/Wz1+XSk/KFteXFxdXSspP1xcXS8pO1xuICAgICAgICAgICAgICAgIGF0dHJJbmZvLnB1c2gobmV3IEF0dHJJbmZvKFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbMV0gIT09IFwiIVwiLFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbMl0udG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzNdLFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbNF1cbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnRzWzJdID0gcGFydHNbMl0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IG5zUGFydHMgPSBwYXJ0c1syXS5zcGxpdChcIjpcIik7XG4gICAgICAgICAgICBsZXQgaW5jbCA9IHBhcnRzWzFdICE9PSBcIiFcIjtcbiAgICAgICAgICAgIGNvbnN0IG5zID0gbnNQYXJ0cy5zaGlmdCgpO1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBuc1BhcnRzLmpvaW4oXCI6XCIpO1xuICAgICAgICAgICAgbGV0IHBhcnRJbmZvID0gbmV3IFBhcnRJbmZvKGluY2wsIG5zLCByb2xlLCBhdHRySW5mbywgcGFydHNbcGFydHMubGVuZ3RoLTFdKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChwYXJ0SW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250ZXh0SW5mbyA9IHJlc3VsdHM7XG4gICAgfVxuXG4gICAgc3RhdGljIGNsZWFuQ29udGV4dChjb250ZXh0OiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyArIS9nLCBcIiAhXCIpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8gKyhbPit+LF0pL2csIFwiJDFcIik7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyhbPit+LF0pICsvZywgXCIkMVwiKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvICsvZywgXCIgXCIpO1xuICAgICAgICByZXR1cm4gY29udGV4dC50cmltKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGNvbnRleHQ6IHN0cmluZykge1xuICAgICAgICBsZXQgY29udGV4dHMgPSBDb250ZXh0LnNwbGl0TXVsdGlwbGUoQ29udGV4dC5jbGVhbkNvbnRleHQoY29udGV4dCkpO1xuXG4gICAgICAgIGxldCByZXRWYWwgOiBDb250ZXh0W10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgY3R4ID0gbmV3IENvbnRleHQoY29udGV4dHNbaV0pO1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goY3R4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaW5pdGlhbCBwcm9jZXNzaW5nIG9mIHNwbGl0dGluZyBvbiBjb21tYSAtIGNvbnRleHQsY29udGV4dFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFxuICAgICAqL1xuICAgIHN0YXRpYyBzcGxpdE11bHRpcGxlKGNvbnRleHQ6IHN0cmluZykgOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBjb250ZXh0cyA9IFtdO1xuICAgICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuaW5kZXhPZihcIixcIikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbnRleHQuc3BsaXQoXCIsXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0cztcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gXCIuLi9jb25maWcvQ29uZmlnXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBJc3N1ZSwgUnVsZSwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlUmVzdWx0LCBlUnVsZUNvbmZpZGVuY2UgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBIZWxwTWFwLCBJRW5naW5lLCBObHNNYXAgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lFbmdpbmVcIjtcbmltcG9ydCB7IElNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lNYXBwZXJcIjtcbmltcG9ydCB7IFJlcG9ydCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSVJlcG9ydFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL1Zpc1V0aWxcIjtcblxuY2xhc3MgV3JhcHBlZFJ1bGUge1xuICAgIG5zOiBzdHJpbmc7XG4gICAgaWR4PzogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IgKHB1YmxpYyBydWxlOiBSdWxlLCBwdWJsaWMgcGFyc2VkSW5mbyA6IENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5ucyA9IHRoaXMucGFyc2VkSW5mby5jb250ZXh0SW5mb1t0aGlzLnBhcnNlZEluZm8uY29udGV4dEluZm8ubGVuZ3RoLTFdLm5hbWVzcGFjZTtcbiAgICAgICAgQ29uZmlnLkRFQlVHICYmIGNvbnNvbGUubG9nKFwiQWRkZWQgUnVsZTpcIiwgcnVsZS5pZCwgSlNPTi5zdHJpbmdpZnkodGhpcy5wYXJzZWRJbmZvKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBjb252ZXJ0aW5nIHRoZSBub2RlIGludG8gYSBzbmlwcGV0IHdoaWNoIGNhbiBiZSBhZGRlZCB0byByZXBvcnQuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgbm9kZSBhbmQgZXh0cmFjdCB0aGUgbm9kZSBuYW1lIGFuZCB0aGUgYXR0cmlidXRlcyBhbmQgYnVpbGQgdGhlIHNuaXBwZXQgYmFzZWQgb24gdGhpcy5cbiAgICAgKlxuICAgICAqIFRPRE86IEZ1dHVyZSwgbWF5YmUgd2UgY2FuIGV4dHJhY3QgbW9yZSB0aGVuIGp1c3Qgc2luZ2xlIGxpbmUsIGFkZCBtb3JlIGluZm8gb3IgZXZlbiBhZGQgY2xvc2luZyB0YWdzIGV0Yy4uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBodG1sIGVsZW1lbnQgdG8gY29udmVydCBpbnRvIGVsZW1lbnQgc25pcHBldCB3aXRoIG5vZGUgbmFtZSBhbmQgYXR0cmlidXRlcyBvbmx5LlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBub2RlU25pcHBldCAtIHJldHVybiB0aGUgZWxlbWVudCBzbmlwcGV0IG9mIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkIHdoaWNoIG9ubHkgY29udGFpbnMsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVuYW1lIGFuZCBhdHRyaWJ1dGVzLiBpLmUuIDx0YWJsZSBpZD1cXFwibGF5b3V0X3RhYmxlMVxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiB0aGlzXG4gICAgICovXG4gICAgc3RhdGljIGNvbnZlcnROb2RlVG9TbmlwcGV0KG5vZGUgOiBFbGVtZW50KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIHZhciBub2RlU25pcHBldCA9ICcnO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGUgbmFtZSBhbmQgYWRkIGl0IHRvIHRoZSBub2RlIHNuaXBwZXRcbiAgICAgICAgbm9kZVNuaXBwZXQgKz0gJzwnICsgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgYWxsIHRoZSBub2RlIGF0dHJpYnV0ZXMgYXMgYW4gYXJyYXlcbiAgICAgICAgdmFyIG5vZGVBdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBhdHRyaWJ1dGVzIG9uIHRoaXMgbm9kZVxuICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXMgIT09IG51bGwgJiYgdHlwZW9mIG5vZGVBdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJykge1xuXG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZXNlcyBhdHRyaWJ1dGVzIGFuZCBhZGQgdGhlIG5hbWUgYW5kIHZhbHVlIHRvIHRoZSBub2RlU25pcHBldCB3aGljaCB3aWxsIGJlIHJldHVybmVkXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbm9kZUF0dHJpYnV0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXNbaV0ubmFtZSA9PT0gXCJkYXRhLW5hbWV3YWxrXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIHZhbHVlLlxuICAgICAgICAgICAgICAgIG5vZGVTbmlwcGV0ICs9ICcgJyArIG5vZGVBdHRyaWJ1dGVzW2ldLm5hbWUgKyAnPVwiJyArIG5vZGVBdHRyaWJ1dGVzW2ldLnZhbHVlICsgJ1wiJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsb3NlIHRoZSBub2RlXG4gICAgICAgIG5vZGVTbmlwcGV0ICs9ICc+JztcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIG5vZGUgc25pcHBldFxuICAgICAgICByZXR1cm4gbm9kZVNuaXBwZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyB0aGUgc291cmNlIGxvY2F0aW9uIGZvciBhIG5vZGUsIHdoaWNoIGNhbiBiZSBhZGRlZCB0byBhIHJlcG9ydC5cbiAgICAgKiBTdXBwb3J0cyBkZWJ1ZyBkaXJlY3RpdmVzIGluIHRoZSBmb2xsb3dpbmcgZm9ybXM6XG4gICAgICogICAxLiBBbiBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgaXRzZWxmOlxuICAgICAqICAgICAgICBpYm0tYTExeS1kZWJ1Zz1cImZpbGUudHM6MTA6NVwiXG4gICAgICogICAyLiBBIGNvbW1lbnQgbm9kZSBwcmVjZWRpbmcgdGhlIGVsZW1lbnQgKGFzIGEgc2libGluZyBvciBhbmNlc3RvciBzaWJsaW5nKTpcbiAgICAgKiAgICAgICAgPCEtLSBpYm0tYTExeS1kZWJ1ZzogZmlsZS50czoxMDo1IC0tPlxuICAgICAqICAgMy4gQSB3cmFwcGVyIGVsZW1lbnQgKGUuZy4gZGl2KSB3aG9zZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGlsZCBpcyBzdWNoIGEgY29tbWVudCBub2RlLlxuICAgICAqICAgNC4gQW4gYW5jZXN0b3IgZWxlbWVudCB0aGF0IGNhcnJpZXMgdGhlIGlibS1hMTF5LWRlYnVnIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIFRyYXZlcnNhbDogY2hlY2tzIHRoZSBub2RlIGl0c2VsZiBmb3IgYW4gaW5saW5lIGF0dHJpYnV0ZSwgdGhlbiBzY2FucyBwcmV2aW91cyBzaWJsaW5ncyBhdFxuICAgICAqIGVhY2ggYW5jZXN0b3IgbGV2ZWwgdXB3YXJkIChhbHNvIGNoZWNraW5nIGVhY2ggYW5jZXN0b3IgZWxlbWVudCdzIG93biBpbmxpbmUgYXR0cmlidXRlKSxcbiAgICAgKiBzdG9wcGluZyBpZiBhIGJsYW5rIG9yICdlbmQnIG1hcmtlciBpcyBmb3VuZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBET00gbm9kZSB0byBmaW5kIHNvdXJjZSBpbmZvIGZvclxuICAgICAqIEByZXR1cm4ge3N0cmluZyB8IG51bGx9IC0gVGhlIHNvdXJjZSBsb2NhdGlvbiBzdHJpbmcsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgdGhpc1xuICAgICAqL1xuICAgIHN0YXRpYyBjb252ZXJ0Tm9kZVRvU291cmNlKG5vZGU6IE5vZGUsIGVuYWJsZWQ6IGJvb2xlYW49ZmFsc2UpOiBzdHJpbmcge1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiU291cmNlIE1hcCBlbmFibGVkOlwiLCBlbmFibGVkKTtcbiAgICAgICAgaWYgKCFlbmFibGVkIHx8ICFub2RlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IERFQlVHX0RJUkVDVElWRSA9IFwiaWJtLWExMXktZGVidWdcIjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVHlwZWQgcmVzdWx0IGZyb20gZXh0cmFjdERpcmVjdGl2ZSB0byBhdm9pZCBzZW50aW5lbCBzdHJpbmcgY29sbGlzaW9ucy5cbiAgICAgICAgICogICB7IGZvdW5kOiBmYWxzZSB9ICAgICAgICAgICAg4oCUIG5vIGRpcmVjdGl2ZSBvbiB0aGlzIG5vZGVcbiAgICAgICAgICogICB7IGZvdW5kOiB0cnVlLCBzdG9wOiB0cnVlIH0g4oCUIGRpcmVjdGl2ZSBpcyBhIHNjb3BlLWVuZCBtYXJrZXIgKGJsYW5rIG9yICdlbmQnKVxuICAgICAgICAgKiAgIHsgZm91bmQ6IHRydWUsIHN0b3A6IGZhbHNlLCBzb3VyY2U6IHN0cmluZyB9IOKAlCB2YWxpZCBzb3VyY2UgbG9jYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHR5cGUgRGlyZWN0aXZlUmVzdWx0ID1cbiAgICAgICAgICAgIHwgeyBmb3VuZDogZmFsc2UgfVxuICAgICAgICAgICAgfCB7IGZvdW5kOiB0cnVlOyBzdG9wOiB0cnVlIH1cbiAgICAgICAgICAgIHwgeyBmb3VuZDogdHJ1ZTsgc3RvcDogZmFsc2U7IHNvdXJjZTogc3RyaW5nIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhcnNlcyBhIHNvdXJjZSBzdHJpbmcgaW50byBhIERpcmVjdGl2ZVJlc3VsdC5cbiAgICAgICAgICogVGhlIHNvdXJjZSBpcyB0aGUgZmluYWwgcmVzb2x2ZWQgdmFsdWUg4oCUIGFmdGVyIGFueSAnOicgc2VwYXJhdG9yIGhhcyBhbHJlYWR5IGJlZW4gc3RyaXBwZWQuXG4gICAgICAgICAqIEEgYmxhbmsgdmFsdWUgb3IgdGhlIGV4YWN0IHdvcmQgJ2VuZCcgKGNhc2UtaW5zZW5zaXRpdmUpIGlzIGEgc3RvcCBtYXJrZXIuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBwYXJzZVNvdXJjZSA9IGZ1bmN0aW9uIChzb3VyY2U6IHN0cmluZyk6IERpcmVjdGl2ZVJlc3VsdCB7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UudG9Mb3dlckNhc2UoKSA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBmb3VuZDogdHJ1ZSwgc3RvcDogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZm91bmQ6IHRydWUsIHN0b3A6IGZhbHNlLCBzb3VyY2UgfTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRXh0cmFjdHMgdGhlIGRlYnVnLWRpcmVjdGl2ZSBjb21tZW50IHZhbHVlIGZyb20gYSBub2RlLlxuICAgICAgICAgKiBIYW5kbGVzOlxuICAgICAgICAgKiAgIC0gQSBjb21tZW50IG5vZGUgZGlyZWN0bHlcbiAgICAgICAgICogICAtIEEgd3JhcHBlciBlbGVtZW50IChlLmcuIDxkaXY+KSB3aG9zZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGlsZCBpcyBhIGNvbW1lbnQgbm9kZVxuICAgICAgICAgKlxuICAgICAgICAgKiBSZXR1cm5zIHsgZm91bmQ6IHRydWUsIHN0b3A6IHRydWUgfSBpZiB0aGUgZGlyZWN0aXZlIGlzIGJsYW5rIG9yIGV4YWN0bHkgJ2VuZCcsXG4gICAgICAgICAqIHJldHVybnMgeyBmb3VuZDogdHJ1ZSwgc3RvcDogZmFsc2UsIHNvdXJjZSB9IGlmIGEgdmFsaWQgc291cmNlIGlzIGZvdW5kLFxuICAgICAgICAgKiBvciByZXR1cm5zIHsgZm91bmQ6IGZhbHNlIH0gaWYgbm8gZGlyZWN0aXZlIGlzIHByZXNlbnQgb24gdGhpcyBub2RlLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZXh0cmFjdERpcmVjdGl2ZSA9IGZ1bmN0aW9uIChlbGVtOiBOb2RlIHwgbnVsbCk6IERpcmVjdGl2ZVJlc3VsdCB7XG4gICAgICAgICAgICBpZiAoIWVsZW0pIHJldHVybiB7IGZvdW5kOiBmYWxzZSB9O1xuXG4gICAgICAgICAgICBsZXQgY29tbWVudFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgLy8gRGlyZWN0IGNvbW1lbnQgbm9kZVxuICAgICAgICAgICAgICAgIGNvbW1lbnRWYWx1ZSA9IGVsZW0ubm9kZVZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgd3JhcHBlciAoZS5nLiA8ZGl2PjwhLS0gaWJtLWExMXktZGVidWc6IC4uLiAtLT48L2Rpdj4pXG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hpbGQgbm9kZVxuICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IGVsZW0uZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBwdXJlIHdoaXRlc3BhY2UgdGV4dCBub2Rlc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVWYWx1ZSAmJiBjaGlsZC5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb24td2hpdGVzcGFjZSB0ZXh0IGJlZm9yZSBhIGNvbW1lbnQg4oCUIG5vdCBhIGRpcmVjdGl2ZSB3cmFwcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50VmFsdWUgPSBjaGlsZC5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFueSBvdGhlciBub2RlIHR5cGUgYmVmb3JlIGEgY29tbWVudCDigJQgbm90IGEgZGlyZWN0aXZlIHdyYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29tbWVudFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IGNvbW1lbnRWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgLy8gTWF0Y2ggZXhhY3RseSBcImlibS1hMTF5LWRlYnVnXCIgZm9sbG93ZWQgYnkgZW5kLW9mLXN0cmluZywgd2hpdGVzcGFjZSwgb3IgJzonXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBcImlibS1hMTF5LWRlYnVnLWV4dHJhXCIgZnJvbSBiZWluZyB0cmVhdGVkIGFzIGEgZGlyZWN0aXZlLlxuICAgICAgICAgICAgICAgIGlmICh0cmltbWVkID09PSBERUJVR19ESVJFQ1RJVkUgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5zdGFydHNXaXRoKERFQlVHX0RJUkVDVElWRSArICc6JykgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5zdGFydHNXaXRoKERFQlVHX0RJUkVDVElWRSArICcgJykgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5zdGFydHNXaXRoKERFQlVHX0RJUkVDVElWRSArICdcXHQnKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdHJpcCB0aGUgZGlyZWN0aXZlIG5hbWUgYW5kIG9wdGlvbmFsIGxlYWRpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZnRlckRpcmVjdGl2ZSA9IHRyaW1tZWQuc3Vic3RyaW5nKERFQlVHX0RJUkVDVElWRS5sZW5ndGgpLnRyaW1TdGFydCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTdHJpcCBhIHNpbmdsZSBsZWFkaW5nICc6JyBzZXBhcmF0b3IgaWYgcHJlc2VudFxuICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBcImlibS1hMTF5LWRlYnVnOiBmaWxlLnRzOjEwOjVcIiDihpIgYWZ0ZXJEaXJlY3RpdmUgPSBcIjogZmlsZS50czoxMDo1XCIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGFmdGVyRGlyZWN0aXZlLnN0YXJ0c1dpdGgoJzonKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhZnRlckRpcmVjdGl2ZS5zdWJzdHJpbmcoMSkudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFmdGVyRGlyZWN0aXZlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlU291cmNlKHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geyBmb3VuZDogZmFsc2UgfTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgaWJtLWExMXktZGVidWcgYXR0cmlidXRlIHZhbHVlIGZyb20gYW4gZWxlbWVudCBub2RlIGFzIGEgRGlyZWN0aXZlUmVzdWx0LFxuICAgICAgICAgKiBvciB7IGZvdW5kOiBmYWxzZSB9IGlmIGFic2VudC4gUmVjb2duaXNlcyB0aGUgJ2VuZCcgc3RvcCBtYXJrZXIganVzdCBsaWtlIGNvbW1lbnQgZGlyZWN0aXZlcy5cbiAgICAgICAgICogVGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyB0aGUgc291cmNlIGRpcmVjdGx5IChubyAnOicgcHJlZml4KSwgZS5nLiBpYm0tYTExeS1kZWJ1Zz1cImZpbGUudHM6MTA6NVwiLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZ2V0SW5saW5lQXR0ciA9IGZ1bmN0aW9uIChuOiBOb2RlKTogRGlyZWN0aXZlUmVzdWx0IHtcbiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgcmV0dXJuIHsgZm91bmQ6IGZhbHNlIH07XG4gICAgICAgICAgICBjb25zdCB2YWwgPSAobiBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoREVCVUdfRElSRUNUSVZFKTtcbiAgICAgICAgICAgIGlmICh2YWwgPT09IG51bGwpIHJldHVybiB7IGZvdW5kOiBmYWxzZSB9O1xuICAgICAgICAgICAgLy8gQXR0cmlidXRlIHZhbHVlIGlzIHRoZSBzb3VyY2UgZGlyZWN0bHkg4oCUIG5vICc6JyBzZXBhcmF0b3IgdG8gc3RyaXBcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVNvdXJjZSh2YWwudHJpbSgpKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVHJhdmVyc2VzIGxlZnQgKHByZXZpb3VzIHNpYmxpbmdzKSB0aGVuIHVwd2FyZCAocGFyZW50KSB0byBmaW5kIHNvdXJjZSBpbmZvLlxuICAgICAgICAgKiBEb2VzIE5PVCBjaGVjayB0aGUgc3RhcnRpbmcgZWxlbWVudCBpdHNlbGYg4oCUIG9ubHkgaXRzIHByZWNlZGluZyBzaWJsaW5ncyBhbmQgYW5jZXN0b3JzLlxuICAgICAgICAgKiBUaGlzIGF2b2lkcyBtaXNpZGVudGlmeWluZyBhIGNvbnRlbnQgbm9kZSBhcyBpdHMgb3duIHNvdXJjZSBkaXJlY3RpdmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEF0IGVhY2ggYW5jZXN0b3IgbGV2ZWwgdGhlIGZ1bmN0aW9uIGFsc28gY2hlY2tzIHRoZSBhbmNlc3RvciBlbGVtZW50J3Mgb3duIGlubGluZVxuICAgICAgICAgKiBpYm0tYTExeS1kZWJ1ZyBhdHRyaWJ1dGUsIHNvIHRoYXQgYSBwYXJlbnQgZWxlbWVudCBjYW4gYW5ub3RhdGUgYWxsIGl0cyBkZXNjZW5kYW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogU2libGluZyBzY2FubmluZyBzdG9wcyBhdCB0aGUgZmlyc3Qgbm9kZSB0aGF0IGlzIHJlY29nbmlzZWQgYXMgYSBkaXJlY3RpdmUgKGZvdW5kIG9yIHN0b3ApLlxuICAgICAgICAgKiBOb24tZGlyZWN0aXZlIG5vZGVzIChyZWFsIGNvbnRlbnQgZWxlbWVudHMsIHRleHQgbm9kZXMpIGFyZSBza2lwcGVkIHNvIHRoYXQgYSBkaXJlY3RpdmVcbiAgICAgICAgICogcGxhY2VkIGZ1cnRoZXIgYmFjayBpbiB0aGUgc2libGluZyBsaXN0IGlzIHN0aWxsIGZvdW5kIGV2ZW4gaWYgY29udGVudCBub2RlcyBpbnRlcnZlbmUuXG4gICAgICAgICAqIEhvd2V2ZXIsIHRyYXZlcnNhbCBkb2VzIE5PVCBjcm9zcyBlbGVtZW50IGJvdW5kYXJpZXMgd2hlbiBzY2FubmluZyBzaWJsaW5ncyDigJQgb25seVxuICAgICAgICAgKiBjb21tZW50IG5vZGVzIGFuZCBkZWRpY2F0ZWQgd3JhcHBlciBlbGVtZW50cyAod2hvc2Ugc29sZSBmaXJzdCBjaGlsZCBpcyBhIGNvbW1lbnQpIGFyZVxuICAgICAgICAgKiB0cmVhdGVkIGFzIHRyYW5zcGFyZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBTaGFkb3cgRE9NIHRyYXZlcnNhbDogdXNlcyBET01XYWxrZXIucGFyZW50Tm9kZSgpIHRvIGNyb3NzIHNoYWRvdyBib3VuZGFyaWVzIGNvcnJlY3RseSxcbiAgICAgICAgICogaW5jbHVkaW5nIHNsb3R0ZWQgY29udGVudCBhbmQgbmVzdGVkIFNoYWRvdyBET00gKHNoYWRvdy1pbi1zaGFkb3cpLiBXaGVuIHRoZSBwYXJlbnRcbiAgICAgICAgICogY2hhaW4gcmVhY2hlcyBhIFNoYWRvd1Jvb3QsIERPTVdhbGtlci5wYXJlbnROb2RlKCkgYXV0b21hdGljYWxseSByZXNvbHZlcyBpdCB0byB0aGVcbiAgICAgICAgICogc2hhZG93IGhvc3QgZWxlbWVudCBpbiB0aGUgb3V0ZXIgRE9NLiBBIHBsYWluIERvY3VtZW50RnJhZ21lbnQgd2l0aCBubyBob3N0IHJldHVybnNcbiAgICAgICAgICogbnVsbCBmcm9tIERPTVdhbGtlci5wYXJlbnROb2RlKCksIHN0b3BwaW5nIHRyYXZlcnNhbC5cbiAgICAgICAgICpcbiAgICAgICAgICogU2libGluZyB0cmF2ZXJzYWwgdXNlcyBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QoKSB0byBza2lwIG5vZGVzIHRoYXRcbiAgICAgICAgICogYXJlIGFzc2lnbmVkIHRvIHNsb3RzIChhbmQgdGhlcmVmb3JlIGxvZ2ljYWxseSBiZWxvbmcgdG8gYSBkaWZmZXJlbnQgcGFydCBvZiB0aGUgdHJlZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFVzZXMgYW4gaXRlcmF0aXZlIGFwcHJvYWNoIChyYXRoZXIgdGhhbiByZWN1cnNpb24pIHRvIHNhZmVseSBoYW5kbGUgZGVlcGx5IG5lc3RlZFxuICAgICAgICAgKiBET00gc3RydWN0dXJlcyB3aXRob3V0IHJpc2sgb2Ygc3RhY2sgb3ZlcmZsb3cuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbGVtIC0gVGhlIG5vZGUgd2hvc2UgY29udGV4dCB3ZSBhcmUgc2VhcmNoaW5nXG4gICAgICAgICAqIEByZXR1cm5zIFRoZSBzb3VyY2UgbG9jYXRpb24gc3RyaW5nLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZmluZFNvdXJjZSA9IGZ1bmN0aW9uIChlbGVtOiBOb2RlIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBlbGVtO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBTY2FuIHByZXZpb3VzIHNpYmxpbmdzIGZvciBhIGRlYnVnIGRpcmVjdGl2ZSBjb21tZW50IG9yIHdyYXBwZXIgZWxlbWVudC5cbiAgICAgICAgICAgICAgICAvLyBVc2UgcHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QgdG8gc2tpcCBub2RlcyBhc3NpZ25lZCB0byBzbG90cywgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyBsb2dpY2FsbHkgYmVsb25nIHRvIGEgZGlmZmVyZW50IHBhcnQgb2YgdGhlIGNvbXBvc2VkIHRyZWUuXG4gICAgICAgICAgICAgICAgLy8gT25seSBjb21tZW50IG5vZGVzIGFuZCBkZWRpY2F0ZWQgd3JhcHBlciBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCBkaXJlY3RpdmVzO1xuICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciBub2RlIHR5cGVzIGFyZSBza2lwcGVkICh0aGV5IGRvIG5vdCBibG9jayBmdXJ0aGVyIHNjYW5uaW5nKS5cbiAgICAgICAgICAgICAgICBsZXQgcHJldiA9IERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJldikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBleHRyYWN0RGlyZWN0aXZlKHByZXYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0b3ApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgYXMgeyBmb3VuZDogdHJ1ZTsgc3RvcDogZmFsc2U7IHNvdXJjZTogc3RyaW5nIH0pLnNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHByZXYpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5vIGRpcmVjdGl2ZSBmb3VuZCBhbW9uZyBzaWJsaW5ncyDigJQgbW92ZSB1cCB0byBwYXJlbnQuXG4gICAgICAgICAgICAgICAgLy8gVXNlIERPTVdhbGtlci5wYXJlbnROb2RlKCkgaW5zdGVhZCBvZiBub2RlLnBhcmVudE5vZGUgZGlyZWN0bHkgc28gdGhhdDpcbiAgICAgICAgICAgICAgICAvLyAgIDEuIFNoYWRvdyBET00gYm91bmRhcmllcyBhcmUgY3Jvc3NlZCBhdXRvbWF0aWNhbGx5IChTaGFkb3dSb290IOKGkiBob3N0IGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgIC8vICAgICAgc3VwcG9ydGluZyBib3RoIHJlZ3VsYXIgYW5kIG5lc3RlZCBTaGFkb3cgRE9NIChzaGFkb3ctaW4tc2hhZG93KS5cbiAgICAgICAgICAgICAgICAvLyAgIDIuIFNsb3R0ZWQgbm9kZXMgYXJlIHJlLXBhcmVudGVkIHRvIHRoZWlyIHNsb3Qgb3duZXIgcmF0aGVyIHRoYW4gdGhlaXJcbiAgICAgICAgICAgICAgICAvLyAgICAgIGxpZ2h0LURPTSBwYXJlbnQsIG1hdGNoaW5nIHRoZSBjb21wb3NlZCAocmVuZGVyZWQpIHRyZWUgc3RydWN0dXJlLlxuICAgICAgICAgICAgICAgIC8vICAgMy4gTm9kZXMgd2l0aCBhbiBvd25lckVsZW1lbnQgKGUuZy4gaWZyYW1lIGRvY3VtZW50IHJvb3RzKSBhcmUgcmUtcGFyZW50ZWRcbiAgICAgICAgICAgICAgICAvLyAgICAgIHRvIHRoZWlyIG93bmVyIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoY3VycmVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZWFjaGVkIHRoZSB0b3Agb2YgdGhlIHRyZWUgKG9yIGEgcGxhaW4gRG9jdW1lbnRGcmFnbWVudCB3aXRoIG5vIGhvc3QpXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZmluZGluZyBhIGRpcmVjdGl2ZS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHBhcmVudCBlbGVtZW50J3Mgb3duIGlubGluZSBhdHRyaWJ1dGUgYmVmb3JlIGNvbnRpbnVpbmcgdXB3YXJkLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIGEgY29udGFpbmluZyBlbGVtZW50IHRvIGFubm90YXRlIGFsbCBpdHMgZGVzY2VuZGFudHMuXG4gICAgICAgICAgICAgICAgLy8gQW4gJ2VuZCcgaW5saW5lIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHN0b3BzIHRyYXZlcnNhbCBlbnRpcmVseS5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRBdHRyUmVzdWx0ID0gZ2V0SW5saW5lQXR0cihwYXJlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRBdHRyUmVzdWx0LmZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRBdHRyUmVzdWx0LnN0b3ApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHBhcmVudEF0dHJSZXN1bHQgYXMgeyBmb3VuZDogdHJ1ZTsgc3RvcDogZmFsc2U7IHNvdXJjZTogc3RyaW5nIH0pLnNvdXJjZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRmlyc3QsIGNoZWNrIGZvciBhbiBpbmxpbmUgYXR0cmlidXRlIGRpcmVjdGl2ZSBvbiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gICAgICAgIC8vIEFuICdlbmQnIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCBpdHNlbGYgc3RvcHMgdHJhdmVyc2FsIChyZXR1cm5zIG51bGwpLlxuICAgICAgICBjb25zdCBzZWxmQXR0clJlc3VsdCA9IGdldElubGluZUF0dHIobm9kZSk7XG4gICAgICAgIGlmIChzZWxmQXR0clJlc3VsdC5mb3VuZCkge1xuICAgICAgICAgICAgaWYgKHNlbGZBdHRyUmVzdWx0LnN0b3ApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIChzZWxmQXR0clJlc3VsdCBhcyB7IGZvdW5kOiB0cnVlOyBzdG9wOiBmYWxzZTsgc291cmNlOiBzdHJpbmcgfSkuc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlbiB0cmF2ZXJzZSB0aGUgRE9NIHRvIGZpbmQgYSBwcmVjZWRpbmcgY29tbWVudCBkaXJlY3RpdmUgb3IgYW5jZXN0b3IgYXR0cmlidXRlXG4gICAgICAgIHJldHVybiBmaW5kU291cmNlKG5vZGUpO1xuICAgIH1cblxuICAgIHJ1bihlbmdpbmU6IEVuZ2luZSwgY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogSXNzdWVbXSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBsZXQgcmVzdWx0czogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdHMgPSB0aGlzLnJ1bGUucnVuKGNvbnRleHQsIG9wdGlvbnMsIGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycjogRXJyb3IgPSBlO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlJVTEUgRVhDRVBUSU9OOlwiLHRoaXMucnVsZS5pZCwgY29udGV4dC5kb20ucm9sZVBhdGgsIGVyci5zdGFjayk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgaWYgKCFyZXN1bHRzKSByZXN1bHRzID0gW107XG5cbiAgICAgICAgaWYgKCEocmVzdWx0cyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IFtyZXN1bHRzXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VmFsIDogSXNzdWVbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZW5naW5lLmdldE1lc3NhZ2UodGhpcy5ydWxlLmlkLCByZXN1bHQucmVhc29uSWQsIHJlc3VsdC5tZXNzYWdlQXJncyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5zIGluIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBwYXRoW25zXSA9IGNvbnRleHRbbnNdLnJvbGVQYXRoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBydWxlSWQgPSB0aGlzLnJ1bGUuaWQucmVwbGFjZSgvXiguKilcXCRcXCRcXGQrJC8sIFwiJDFcIik7XG5cbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICBydWxlSWQ6IHJ1bGVJZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIG5vZGU6IGNvbnRleHRbXCJkb21cIl0ubm9kZSxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgICAgIHJ1bGVUaW1lOiBlbmRUaW1lLXN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICByZWFzb25JZDogcmVzdWx0LnJlYXNvbklkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUFyZ3M6IHJlc3VsdC5tZXNzYWdlQXJncyxcbiAgICAgICAgICAgICAgICBhcGlBcmdzOiByZXN1bHQuYXBpQXJncyxcbiAgICAgICAgICAgICAgICBib3VuZHM6IGNvbnRleHRbXCJkb21cIl0uYm91bmRzLFxuICAgICAgICAgICAgICAgIHNuaXBwZXQ6IFdyYXBwZWRSdWxlLmNvbnZlcnROb2RlVG9TbmlwcGV0KGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50KSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IFdyYXBwZWRSdWxlLmNvbnZlcnROb2RlVG9Tb3VyY2UoY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQsIGVuZ2luZS5pc1NvdXJjZU1hcEVuYWJsZWQoKSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmdpbmUgaW1wbGVtZW50cyBJRW5naW5lIHtcbiAgICBwdWJsaWMgc3RhdGljIGdldExhbmd1YWdlcygpIHtcbiAgICAgICAgY29uc3QgZW52ID0gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIChwcm9jZXNzIGFzIGFueSkubm9kZVR5cGUgPT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY7XG4gICAgICAgIC8vIElmIGFsbCBlbHNlIGZhaWxzLCBkZWZhdWx0IHRvIFVTIEVuZ2xpc2hcbiAgICAgICAgbGV0IG5vZGVMYW5nID0gXCJlbi1VU1wiO1xuICAgICAgICBpZiAoZW52KSB7XG4gICAgICAgICAgICBub2RlTGFuZyA9IGVudi5MQU5HIHx8IGVudi5MQU5HVUFHRSB8fCBlbnYuTENfQUxMIHx8IGVudi5MQ19NRVNTQUdFUztcbiAgICAgICAgICAgIGlmIChub2RlTGFuZyAmJiBub2RlTGFuZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZUxhbmcgPSBub2RlTGFuZy5zcGxpdChcIi5cIilbMF0ucmVwbGFjZSgvXy9nLFwiLVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZUxhbmcgPSBcImVuLVVTXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcyB8fCBbbm9kZUxhbmddO1xuICAgIH1cbiAgICBtYXBwZXJzIDogeyBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcHBlciB9ID0ge307XG4gICAgcnVsZU1hcCA6IHsgW2lkOiBzdHJpbmddOiBSdWxlIH0gPSB7fTtcbiAgICB3cmFwcGVkUnVsZU1hcCA6IHsgW2lkOiBzdHJpbmddOiBXcmFwcGVkUnVsZSB9ID0ge307XG4gICAgbmxzTWFwIDogTmxzTWFwID0ge31cbiAgICBoZWxwTWFwIDogSGVscE1hcCA9IHt9XG4gICAgc291cmNlTWFwRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBpbmNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgcHJpdmF0ZSBleGNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIE5lZWQgYSBET00gTWFwcGVyIGFzIGEgbWluaW11bVxuICAgICAgICB0aGlzLmFkZE1hcHBlcihuZXcgRE9NTWFwcGVyKCkpO1xuICAgIH1cblxuICAgIHJ1bihyb290OiBEb2N1bWVudCB8IE5vZGUsIG9wdGlvbnM/OiB7fSk6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJudWxsIGRvY3VtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb290Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcm9vdCA9IChyb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5vd25lckRvY3VtZW50ICYmICgocm9vdC5vd25lckRvY3VtZW50IGFzIGFueSkuUFRfQ0hFQ0tfSElEREVOX0NPTlRFTlQgPSBmYWxzZSk7XG4gICAgICAgIGNvbnN0IG51bU5vZGVzVmlzaXRlZCA9IENhY2hlVXRpbC5jbGVhckNhY2hlcyhyb290KTtcbiAgICAgICAgY29uc3Qgd2Fsa2VyID0gbmV3IERPTVdhbGtlcihyb290LCBmYWxzZSwgcm9vdCwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHJldFZhbCA6IFJlcG9ydCA9IHtcbiAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgbnVtRXhlY3V0ZWQ6IDAsXG4gICAgICAgICAgICBydWxlVGltZTogMCxcbiAgICAgICAgICAgIHRvdGFsVGltZTogMFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7ICAgICAgICBcbiAgICAgICAgLy8gUmVzZXQgdGhlIHJvbGUgbWFwcGVyc1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWVzcGFjZSBpbiB0aGlzLm1hcHBlcnMpIHtcbiAgICAgICAgICAgIHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLnJlc2V0KHJvb3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29udGV4dCBkZXRlY3RvclxuICAgICAgICBsZXQgY3VycmVudE5vZGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBsYXN0UmVwb3J0ZWRQZXJjZW50ID0gLTE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlQ291bnQrKztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gUmVwb3J0IHByb2dyZXNzIGF0IGVhY2ggcGVyY2VudGFnZSBtaWxlc3RvbmVcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQZXJjZW50ID0gTWF0aC5mbG9vcigoY3VycmVudE5vZGVDb3VudCAvIG51bU5vZGVzVmlzaXRlZCkgKiAxMDApO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQZXJjZW50ID4gbGFzdFJlcG9ydGVkUGVyY2VudCkge1xuICAgICAgICAgICAgICAgIGlmIChudW1Ob2Rlc1Zpc2l0ZWQgPiAxMDAwMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoY3VycmVudFBlcmNlbnQgPiA2KSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFByb2dyZXNzOiAke2N1cnJlbnRQZXJjZW50fSUgKCR7Y3VycmVudE5vZGVDb3VudH0vJHtudW1Ob2Rlc1Zpc2l0ZWR9IG5vZGVzKWApO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBydWxlVGltZXMgPSByZXRWYWwucmVzdWx0cy5yZWR1Y2UoKHByZXYsIGN1cikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgcHJldltjdXIucnVsZUlkXSA9IChwcmV2W2N1ci5ydWxlSWRdIHx8IDApK2N1ci5ydWxlVGltZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgICAgICAgICAvLyB9LCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciAoY29uc3QgcnVsZUlkIGluIHJ1bGVUaW1lcykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWYgKHJ1bGVUaW1lc1tydWxlSWRdID4gMTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhgJHtydWxlSWR9OiAke3J1bGVUaW1lc1tydWxlSWRdfWApO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFzdFJlcG9ydGVkUGVyY2VudCA9IGN1cnJlbnRQZXJjZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IHRoZSBjb250ZXh0IGluZm9ybWF0aW9uIGZyb20gdGhlIHJ1bGUgbWFwcGVyc1xuICAgICAgICAgICAgY29uc3QgY29udGV4dEhpZXJhcmNoaWVzIDogUnVsZUNvbnRleHRIaWVyYXJjaHkgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIGluIHRoaXMubWFwcGVycykge1xuICAgICAgICAgICAgICAgIGlmICghd2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dEhpZXJhcmNoaWVzW25hbWVzcGFjZV0gPSB0aGlzLm1hcHBlcnNbbmFtZXNwYWNlXS5vcGVuU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmFtZXNwYWNlID09PSBcImRvbVwiICYmIHdhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBlbGVtID0gd2Fsa2VyLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIChpZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHJvb3Qub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkgPT09IGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGV4dEhpZXJhcmNoaWVzW1wiZG9tXCJdW2NvbnRleHRIaWVyYXJjaGllc1tcImRvbVwiXS5sZW5ndGgtMV0ucm9sZVBhdGggPSBcIi8vKltAaWQ9J1wiK2lkK1wiJ11cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0SGllcmFyY2hpZXNbbmFtZXNwYWNlXSA9IHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLmNsb3NlU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHdhbGtlci5ub2RlLm5vZGVUeXBlICE9PSAxMSBcbiAgICAgICAgICAgICAgICAmJiAoVmlzVXRpbC5pc05vZGVWaXNpYmxlKHdhbGtlci5ub2RlKVxuICAgICAgICAgICAgICAgICAgICAvLyB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImhlYWRcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcIm1ldGFcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgd2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicGFyYW1cIlxuICAgICAgICAgICAgICAgICAgICB8fCAhRE9NVXRpbC5nZXRBbmNlc3Rvcih3YWxrZXIubm9kZSwgW1wiYm9keVwiXSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGV4dCA6IFJ1bGVDb250ZXh0ID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBucyBpbiBjb250ZXh0SGllcmFyY2hpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnNIaWVyID0gY29udGV4dEhpZXJhcmNoaWVzW25zXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdEhpZXIgPSBuc0hpZXJbbnNIaWVyLmxlbmd0aC0xXTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFtuc10gPSBsYXN0SGllcjsgXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoaW5nUnVsZXMgPSB0aGlzLmdldE1hdGNoaW5nUnVsZXMoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwTWF0Y2ggPSB7fVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2hpbmdSdWxlIG9mIG1hdGNoaW5nUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZ1bGZpbGxzRGVwZW5kZW5jaWVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgbWF0Y2hpbmdSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcE1hdGNoW2RlcF0pIGZ1bGZpbGxzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGZpbGxzRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA6IElzc3VlW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbWF0Y2hpbmdSdWxlLnJ1bih0aGlzLCBjb250ZXh0LCBvcHRpb25zLCBjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcHBlciBzaG93cyBlcnJvciBpbiBjb25zb2xlLiBTa2lwIHRoaXMgcnVsZSBhcyBOL0FcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGtpbGwgdGhlIGVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb3V0IG9mIHNjb3BlLCBpdCBmdWxmaWxscyB0aGUgZGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwTWF0Y2hbbWF0Y2hpbmdSdWxlLnJ1bGUuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnJ1bGVUaW1lICs9IHJlc3VsdC5ydWxlVGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwubnVtRXhlY3V0ZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnZhbHVlWzFdID09PSBlUnVsZUNvbmZpZGVuY2UuUEFTUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBNYXRjaFtyZXN1bHQucnVsZUlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSk7XG4gICAgICAgIENhY2hlVXRpbC5jbGVhckNhY2hlcyhyb290KTtcbiAgICAgICAgcmV0VmFsLnRvdGFsVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLXN0YXJ0O1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldFZhbCk7XG4gICAgfVxuXG4gICAgZW5hYmxlUnVsZXMocnVsZUlkczogc3RyaW5nW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bGVNYXBbcnVsZUlkXS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBydWxlSWQgb2YgcnVsZUlkcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZU1hcCkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJXQVJOSU5HOiBSdWxlIElkXCIscnVsZUlkLFwiY291bGQgbm90IGJlIGVuYWJsZWQuXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bGVNYXBbcnVsZUlkXS5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFJ1bGUocnVsZUlkOiBzdHJpbmcpOiBSdWxlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVsZU1hcFtydWxlSWRdO1xuICAgIH1cblxuICAgIGdldFJ1bGVzSWRzKCkgOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChydWxlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgYWRkUnVsZXMocnVsZXM6IFJ1bGVbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUnVsZShydWxlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb3J0UnVsZXMoKTtcbiAgICB9XG5cbiAgICBhZGRSdWxlKHJ1bGU6IFJ1bGUsIHNraXBTb3J0PzogYm9vbGVhbikge1xuICAgICAgICBsZXQgY3R4cyA6Q29udGV4dFtdID0gQ29udGV4dC5wYXJzZShydWxlLmNvbnRleHQpO1xuICAgICAgICBsZXQgaWR4ID0gMDtcbiAgICAgICAgY29uc3QgcnVsZUlkID0gcnVsZS5pZDtcbiAgICAgICAgaWYgKHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiV0FSTklORzogUnVsZVwiLHJ1bGVJZCxcImFscmVhZHkgYWRkZWQgdG8gZW5naW5lLiBJZ25vcmluZy4uLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJ1bGVNYXBbcnVsZUlkXSA9IHJ1bGU7XG4gICAgICAgIGZvciAoY29uc3QgY3R4IG9mIGN0eHMpIHtcbiAgICAgICAgICAgIGxldCB3cmFwSWQgPSBydWxlSWQ7XG4gICAgICAgICAgICBpZiAoaWR4ID49IDEpIHtcbiAgICAgICAgICAgICAgICB3cmFwSWQgPSBydWxlSWQrXCIkJFwiK2lkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICsraWR4O1xuICAgICAgICAgICAgbGV0IHdyYXBwZWRSdWxlID0gbmV3IFdyYXBwZWRSdWxlKHJ1bGUsY3R4KTtcbiAgICAgICAgICAgIHRoaXMud3JhcHBlZFJ1bGVNYXBbd3JhcElkXSA9IHdyYXBwZWRSdWxlO1xuICAgICAgICAgICAgbGV0IHBhcnRzID0gd3JhcHBlZFJ1bGUucGFyc2VkSW5mby5jb250ZXh0SW5mbztcbiAgICAgICAgICAgIGxldCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTtcbiAgICAgICAgICAgIGxldCB0cmlnZ2VyUm9sZSA9IGxhc3RQYXJ0Lm5hbWVzcGFjZStcIjpcIitsYXN0UGFydC5yb2xlO1xuICAgICAgICAgICAgaWYgKGxhc3RQYXJ0LmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXSA9IHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXSB8fCBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmluY2xSdWxlc1t0cmlnZ2VyUm9sZV0ucHVzaCh3cmFwcGVkUnVsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXSA9IHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXSB8fCBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmV4Y2xSdWxlc1t0cmlnZ2VyUm9sZV0ucHVzaCh3cmFwcGVkUnVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFza2lwU29ydCkge1xuICAgICAgICAgICAgdGhpcy5fc29ydFJ1bGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlbmFibGVTb3VyY2VNYXAoZW5hYmxlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc291cmNlTWFwRW5hYmxlZCA9IGVuYWJsZTtcbiAgICB9XG5cbiAgICBpc1NvdXJjZU1hcEVuYWJsZWQoKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VNYXBFbmFibGVkO1xuICAgIH1cbiAgICBcbiAgICBfc29ydFJ1bGVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJvbGUgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3JvbGVdLnNvcnQoKHJ1bGVBOiBXcmFwcGVkUnVsZSwgcnVsZUI6IFdyYXBwZWRSdWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQSA9IHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQiA9IHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgLy8gSWYgQiBkZXBlbmRzIG9uIEEsIHNvcnQgQSBiZWZvcmUgQlxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBCICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVBLnJ1bGUuaWQpKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgLy8gSWYgQSBkZXBlbmRzIG9uIEIsIHNvcnQgQiBiZWZvcmUgQVxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBBICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVCLnJ1bGUuaWQpKSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJvbGUgaW4gdGhpcy5leGNsUnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3JvbGVdLnNvcnQoKHJ1bGVBOiBXcmFwcGVkUnVsZSwgcnVsZUI6IFdyYXBwZWRSdWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQSA9IHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQiA9IHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgLy8gSWYgQiBkZXBlbmRzIG9uIEEsIHNvcnQgQSBiZWZvcmUgQlxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBCICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVBLnJ1bGUuaWQpKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgLy8gSWYgQSBkZXBlbmRzIG9uIEIsIHNvcnQgQiBiZWZvcmUgQVxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBBICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVCLnJ1bGUuaWQpKSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZE5sc01hcChtYXA6IE5sc01hcCkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtYXApIHtcbiAgICAgICAgICAgIHRoaXMubmxzTWFwW2tleV0gPSBtYXBba2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEhlbHBNYXAobWFwOiBIZWxwTWFwKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgdGhpcy5oZWxwTWFwW2tleV0gPSBtYXBba2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE1lc3NhZ2UocnVsZUlkOiBzdHJpbmcsIHJ1bGVJZHg6IG51bWJlciB8IHN0cmluZywgbXNnQXJncz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHNwbGl0dGVyID0gcnVsZUlkLmluZGV4T2YoXCIkJFwiKTtcbiAgICAgICAgaWYgKHNwbGl0dGVyID49IDApIHtcbiAgICAgICAgICAgIHJ1bGVJZCA9IHJ1bGVJZC5zdWJzdHJpbmcoMCxzcGxpdHRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMubmxzTWFwKSkgcmV0dXJuIHJ1bGVJZDtcbiAgICAgICAgbGV0IG1lc3NhZ2VUZW1wbGF0ZSA9IHRoaXMubmxzTWFwW3J1bGVJZF1bcnVsZUlkeCB8fCAwXTtcbiAgICAgICAgaWYgKCFtZXNzYWdlVGVtcGxhdGUpIHJldHVybiBydWxlSWQrXCJfXCIrcnVsZUlkeDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKC9cXHsoXFxkKylcXH0vZyxcbiAgICAgICAgICAgIChtYXRjaGVkU3RyLCBtYXRjaGVkTnVtLCBtYXRjaGVkSW5kZXgpID0+IG1zZ0FyZ3NbbWF0Y2hlZE51bV1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRIZWxwKHJ1bGVJZDogc3RyaW5nLCByZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBhcmNoaXZlSWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIWFyY2hpdmVJZCkge1xuICAgICAgICAgICAgLy8gU2V0IHRvIHRoZSBsYXRlc3RcbiAgICAgICAgICAgIGFyY2hpdmVJZCA9IFwibGF0ZXN0XCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke0NvbmZpZy5oZWxwUm9vdH0vJHthcmNoaXZlSWR9L2RvYyR7dGhpcy5nZXRIZWxwUmVsKHJ1bGVJZCwgcmVhc29uSWQpfWA7XG4gICAgfVxuXG4gICAgZ2V0SGVscFJlbChydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHNwbGl0dGVyID0gcnVsZUlkLmluZGV4T2YoXCIkJFwiKTtcbiAgICAgICAgaWYgKHNwbGl0dGVyID49IDApIHtcbiAgICAgICAgICAgIHJ1bGVJZCA9IHJ1bGVJZC5zdWJzdHJpbmcoMCxzcGxpdHRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMuaGVscE1hcCkpIHJldHVybiBydWxlSWQ7XG4gICAgICAgIHJ1bGVJZHggPSBydWxlSWR4IHx8IDA7XG4gICAgICAgIGxldCBoZWxwU3RyID0gbnVsbDtcbiAgICAgICAgaWYgKHJ1bGVJZHggaW4gdGhpcy5oZWxwTWFwW3J1bGVJZF0pIHtcbiAgICAgICAgICAgIGhlbHBTdHIgPSB0aGlzLmhlbHBNYXBbcnVsZUlkXVtydWxlSWR4IHx8IDBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVscFN0ciA9IHRoaXMuaGVscE1hcFtydWxlSWRdWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoZWxwU3RyKSByZXR1cm4gcnVsZUlkK1wiX1wiK3J1bGVJZHg7XG4gICAgICAgIHJldHVybiBoZWxwU3RyO1xuICAgIH1cblxuICAgIGFkZE1hcHBlcihtYXBwZXI6IElNYXBwZXIpIHtcbiAgICAgICAgdGhpcy5tYXBwZXJzW21hcHBlci5nZXROYW1lc3BhY2UoKV0gPSBtYXBwZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbWF0Y2gocnVsZTogV3JhcHBlZFJ1bGUsXG4gICAgICAgIGNvbnRleHRIaWVyOiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBib29sZWFuXG4gICAge1xuICAgICAgICBsZXQgcnVsZVBhcnRzID0gcnVsZS5wYXJzZWRJbmZvLmNvbnRleHRJbmZvO1xuICAgICAgICBsZXQgcGFydElkeCA9IHJ1bGVQYXJ0cy5sZW5ndGgtMTtcbiAgICAgICAgbGV0IGN1ck5TID0gcnVsZVBhcnRzW3BhcnRJZHhdLm5hbWVzcGFjZTtcbiAgICAgICAgbGV0IGN1ckhpZXIgPSBjb250ZXh0SGllcltjdXJOU11bY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aC0xXTtcbiAgICAgICAgY29uc3QgY29udGV4dE5vZGUgPSBjdXJIaWVyLm5vZGU7XG5cbiAgICAgICAgLy8gSWYgdGhlIGVuZCBvZiB0aGUgcnVsZSBwYXJ0IGRvZXNuJ3QgbWF0Y2ggdGhlIGVuZCBvZiB0aGUgaGllcmFyY2h5LCB3ZSBkb24ndCBoYXZlIGEgbWF0Y2hcbiAgICAgICAgaWYgKCFydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZXJlIHdhcyBvbmx5IG9uZSBwYXJ0LCB3ZSBoYXZlIGEgbWF0Y2hcbiAgICAgICAgaWYgKHJ1bGVQYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5lZWQgdG8gZGVhbCB3aXRoIHBhcmVudCBwYXJ0cy4gVG8gd2FsayB0aGUgaGllcmFyY2h5LCB0aGVzZSBuZWVkIHRvIGJlXG4gICAgICAgIC8vIGFsbCBpbiB0aGUgc2FtZSBuYW1lc3BhY2UuIENvbmZpcm0gdGhhdCBpcyB0cnVlLlxuICAgICAgICBjdXJOUyA9IHJ1bGVQYXJ0c1swXS5uYW1lc3BhY2U7XG4gICAgICAgIGN1ckhpZXIgPSBjb250ZXh0SGllcltjdXJOU11bY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aC0xXTtcbiAgICAgICAgLS1wYXJ0SWR4O1xuICAgICAgICBpZiAocnVsZVBhcnRzLnNsaWNlKDAsIHJ1bGVQYXJ0cy5sZW5ndGgtMSkuc29tZShwYXJ0ID0+IHBhcnQubmFtZXNwYWNlICE9PSBjdXJOUykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtFUlJPUl0gUnVsZSAke3J1bGUucnVsZS5pZH0gaGFzIGluY29uc2l0ZW50IHBhcmVudCBuYW1lc3BhY2VzYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBub2RlIG1hdGNoZXMgdGhlIGVuZCBvZiB0aGUgaGllcmFyY2h5LCBtb3ZlIHVwIHBhc3QgaXQsIG90aGVyd2lzZSwgc3RhcnQgYXQgdGhlIGVuZFxuICAgICAgICBsZXQgaGllcklkeCA9IGNvbnRleHRIaWVyW2N1ck5TXS5sZW5ndGggLSAoY3VySGllci5ub2RlLmlzU2FtZU5vZGUoY29udGV4dE5vZGUpID8gMiA6IDEpO1xuICAgICAgICB3aGlsZSAoaGllcklkeCA+PSAwICYmIHBhcnRJZHggPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFydCA9IHJ1bGVQYXJ0c1twYXJ0SWR4XTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXNQYXJ0ID0gcnVsZVBhcnRzW3BhcnRJZHhdLm1hdGNoZXMoY29udGV4dEhpZXIsIGhpZXJJZHgpO1xuICAgICAgICAgICAgaWYgKHBhcnQuY29ubmVjdG9yID09PSBcIj5cIikge1xuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0IHBhcmVudCBjaGVjayBhbmQgZG9lc24ndCBtYXRjaFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0IHBhcmVudCBjaGVjayBhbmQgZG9lcyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgICAgICAgICAgICAgIC0taGllcklkeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQuY29ubmVjdG9yID09PSBcIiBcIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdXNpdmUgYW5jZXN0b3IgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXNQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZG9lc24ndCBtYXRjaCwganVzdCBtb3ZlIHVwIHRoZSByb2xlIGhpZXJhcmNoeVxuICAgICAgICAgICAgICAgICAgICAtLWhpZXJJZHg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVzaXZlIGFuY2VzdG9yIG1hdGNoIGFuZCBjdXJyZW50IG1hdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4Y2x1c2l2ZSBhbmNlc3RvciBtYXRjaCBhbmQgY3VycmVudCBkb2Vzbid0IG1hdGNoIC0gY2hlY2sgZm9yIG90aGVyIGFuY2VzdG9yc1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50TWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc2VhcmNoSWR4ID0gaGllcklkeC0xOyAhcGFyZW50TWF0Y2ggJiYgc2VhcmNoSWR4ID49IDA7IC0tc2VhcmNoSWR4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNYXRjaCA9ICFydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgc2VhcmNoSWR4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50TWF0Y2gpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSAtLXBhcnRJZHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IGNvbm5lY3RvciBcIitwYXJ0LmNvbm5lY3RvcitcIiBpcyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0SWR4ID09PSAtMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1hdGNoaW5nUnVsZXMoY3R4SGllciA6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IFdyYXBwZWRSdWxlW10ge1xuICAgICAgICBsZXQgbWF0Y2hlcyA6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gYWRkTWF0Y2hlcyhydWxlczogV3JhcHBlZFJ1bGVbXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUucnVsZS5lbmFibGVkICYmIEVuZ2luZS5tYXRjaChydWxlLCBjdHhIaWVyKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2gocnVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbnMgaW4gY3R4SGllcikge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBucytcIjpcIisoY3R4SGllcltuc10ubGVuZ3RoID4gMCA/IGN0eEhpZXJbbnNdW2N0eEhpZXJbbnNdLmxlbmd0aC0xXS5yb2xlIDogXCJub25lXCIpO1xuICAgICAgICAgICAgaWYgKHJvbGUgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuaW5jbFJ1bGVzW3JvbGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgeFJvbGUgaW4gdGhpcy5leGNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoeFJvbGUgIT09IHJvbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkTWF0Y2hlcyh0aGlzLmV4Y2xSdWxlc1t4Um9sZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyb2xlICE9PSBucytcIjpub25lXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZS5zdGFydHNXaXRoKG5zK1wiOi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5zK1wiOi8qXCIgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbbnMrXCI6LypcIl0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnMrXCI6KlwiIGluIHRoaXMuaW5jbFJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuaW5jbFJ1bGVzW25zK1wiOipcIl0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERlcHMobWF0Y2hlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU29ydHMgdGhlIHJ1bGVzIGluIG9yZGVyIHRvIGV4ZWN1dGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb3JyZWN0IG9yZGVyXG4gICAgICogQHBhcmFtIGluUnVsZXMgTGlzdCBvZiB3cmFwcGVkIHJ1bGVzIHRvIHNvcnRcbiAgICAgKiBAcmV0dXJucyBTb3J0ZWQgbGlzdCBvZiB3cmFwcGVkIHJ1bGVzXG4gICAgICovXG4gICAgc29ydERlcHMoaW5SdWxlczogV3JhcHBlZFJ1bGVbXSkge1xuICAgICAgICBsZXQgZGVwUnVsZXM6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGluUnVsZXMpIHtcbiAgICAgICAgICAgIGRlcFJ1bGVzLnB1c2gocnVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCByZXRWYWwgOiBXcmFwcGVkUnVsZVtdID0gW107XG4gICAgICAgIGxldCBpZFRvUnVsZSA9IHt9O1xuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHJ1bGVzLiBJZiB0aGF0IHJ1bGUncyBkZXBlbmRlbmNpZXMgY2FuIGJlIG1ldCBieSBydWxlcyBhbHJlYWR5IGluIHRoZSBsaXN0LCBhZGQgaXQgdG8gdGhlIGxpc3RcbiAgICAgICAgLy8gUmVwZWF0IHVudGlsIG5vIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlIHNhdGlzZmllZCBsaXN0XG4gICAgICAgIC8vIElmIGEgcnVsZSBjYW5ub3QgYmUgc2F0aXNmaWVkLCBpdCB3aWxsIG5ldmVyIGV4ZWN1dGUsIHNvIGl0IGNhbiBiZSBkcm9wcGVkLlxuICAgICAgICBsZXQgY2hhbmdlID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxkZXBSdWxlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwUnVsZSA9IGRlcFJ1bGVzW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKGRlcFJ1bGUucnVsZS5pZCBpbiBpZFRvUnVsZSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGFsbE1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwUnVsZS5ydWxlLmRlcGVuZGVuY2llcyAmJiBkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShkZXBJZCBpbiBpZFRvUnVsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIChkZXBSdWxlLnJ1bGUucHJlcmVxcyAmJiBkZXBSdWxlLnJ1bGUucHJlcmVxcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGZvciAoY29uc3QgZGVwSWQgb2YgZGVwUnVsZS5ydWxlLnByZXJlcXMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGlmICghKGRlcElkIGluIGlkVG9SdWxlKSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgaWYgKGFsbE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGRlcFJ1bGUpO1xuICAgICAgICAgICAgICAgICAgICBpZFRvUnVsZVtkZXBSdWxlLnJ1bGUuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVwUnVsZXMuc3BsaWNlKGlkeC0tLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGNoYW5nZSk7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZXhwb3J0IGNsYXNzIENvbmZpZyB7XG4gICAgc3RhdGljIERFQlVHID0gZmFsc2U7XG4gICAgc3RhdGljIGhlbHBSb290ID0gXCJodHRwczovL2FibGUuaWJtLmNvbS9ydWxlcy9hcmNoaXZlc1wiO1xufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uTWFwcGVyIH0gZnJvbSBcIi4uL2NvbW1vbi9Db21tb25NYXBwZXJcIjtcbmltcG9ydCB7IEJvdW5kcyB9IGZyb20gXCIuLi9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBET01NYXBwZXIgZXh0ZW5kcyBDb21tb25NYXBwZXIge1xuICAgIGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBnZXROYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiZG9tXCJcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlcyhub2RlOiBOb2RlKSA6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB7fTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGVsZW0uYXR0cmlidXRlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ckluZm8gPSBlbGVtLmF0dHJpYnV0ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICByZXRWYWxbYXR0ckluZm8ubmFtZS50b0xvd2VyQ2FzZSgpXSA9IGF0dHJJbmZvLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdldCBzY2FsZWQgYm91bmRzIGZvciBzY3JlZW5zaG90IGV0Yy4gYWRqdXN0ZWQgZm9yIGRldmljZVBpeGVsUmF0aW8gYW5kIHNjcm9sbFxuICAgICAqIEBwYXJhbSBub2RlIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGdldEJvdW5kcyhub2RlOiBOb2RlKSA6IEJvdW5kcyB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxIC8qTm9kZS5FTEVNRU5UX05PREUqLykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgY2FjaGVkQm91bmRzID0gQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUgYXMgRWxlbWVudCwgXCJET01NYXBwZXJfQm91bmRzXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0eXBlb2YgY2FjaGVkQm91bmRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQm91bmRzO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgYWRqdXN0bWVudCA9IDE7XG4gICAgICAgIGlmIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5kZXZpY2VQaXhlbFJhdGlvKSB7XG4gICAgICAgICAgICBhZGp1c3RtZW50ID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJvdW5kcyA9IChub2RlIGFzIEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIC8vIERvIGEgY2hlY2sgd2hldGhlciBib3VuZHMgaGFzIHZhbHVlIGFzIHdlIHVzZSBkaWZmZXJlbnQgdG9vbCAoaHRtbFVuaXQsIGJyb3dzZXIpIHRvIGNhbGwgdGhpcyBmdW5jdGlvblxuICAgICAgICBpZiAoYm91bmRzKSB7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsWCA9IG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuc2Nyb2xsWCB8fCAwO1xuICAgICAgICAgICAgbGV0IHNjcm9sbFkgPSBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LnNjcm9sbFkgfHwgMDtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IHtcbiAgICAgICAgICAgICAgICBcImxlZnRcIjogTWF0aC5jZWlsKChib3VuZHMubGVmdCArIHNjcm9sbFgpICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgXCJ0b3BcIjogTWF0aC5jZWlsKChib3VuZHMudG9wICsgc2Nyb2xsWSkgKiBhZGp1c3RtZW50KSxcbiAgICAgICAgICAgICAgICBcImhlaWdodFwiOiBNYXRoLmNlaWwoYm91bmRzLmhlaWdodCAqIGFkanVzdG1lbnQpLFxuICAgICAgICAgICAgICAgIFwid2lkdGhcIjogTWF0aC5jZWlsKGJvdW5kcy53aWR0aCAqIGFkanVzdG1lbnQpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUgYXMgRWxlbWVudCwgXCJET01NYXBwZXJfQm91bmRzXCIsIHJldCk7XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdldCByZWFsIENTUyBib3VuZHMgaW4gY3NzIHBpeGVscywgYWRqdXN0ZWQgZm9yIHNjcm9sbCBvbmx5XG4gICAgICogQHBhcmFtIG5vZGUgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2V0VW5hZGp1c3RlZEJvdW5kcyhub2RlOiBOb2RlKSA6IEJvdW5kcyB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxIC8qTm9kZS5FTEVNRU5UX05PREUqLykgcmV0dXJuIG51bGw7XG5cblxuICAgICAgICBjb25zdCBjYWNoZWRCb3VuZHMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSBhcyBFbGVtZW50LCBcIkRPTU1hcHBlcl9VbmFkanVzdGVkQm91bmRzXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0eXBlb2YgY2FjaGVkQm91bmRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQm91bmRzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm91bmRzID0gKG5vZGUgYXMgRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIC8vIGFkanVzdGVkIGZvciBzY3JvbGwgaWYgYW55XG4gICAgICAgIGlmIChib3VuZHMpIHtcbiAgICAgICAgICAgIGxldCBzY3JvbGxYID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxYIHx8IDA7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsWSA9IG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuc2Nyb2xsWSB8fCAwO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgIFwibGVmdFwiOiBNYXRoLmNlaWwoYm91bmRzLmxlZnQgKyBzY3JvbGxYKSxcbiAgICAgICAgICAgICAgICBcInRvcFwiOiBNYXRoLmNlaWwoYm91bmRzLnRvcCArIHNjcm9sbFkpLFxuICAgICAgICAgICAgICAgIFwiaGVpZ2h0XCI6IE1hdGguY2VpbChib3VuZHMuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICBcIndpZHRoXCI6IE1hdGguY2VpbChib3VuZHMud2lkdGgpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUgYXMgRWxlbWVudCwgXCJET01NYXBwZXJfVW5hZGp1c3RlZEJvdW5kc1wiLCByZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuL0RPTVdhbGtlclwiO1xuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgcHJvdmlkaW5nIGhlbHBlciBtZXRob2RzIGZvciBET00gbWFuaXB1bGF0aW9uIGFuZCB0cmF2ZXJzYWwgb3BlcmF0aW9ucy5cbiAqIFVzZWQgdGhyb3VnaG91dCB0aGUgYWNjZXNzaWJpbGl0eSBjaGVja2VyIGVuZ2luZSB0byBuYXZpZ2F0ZSBhbmQgYW5hbHl6ZSBET00gc3RydWN0dXJlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIERPTVV0aWwge1xuICAgIFxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGdpdmVuIG5vZGUgaGFzIGFuIGFuY2VzdG9yIGVsZW1lbnQgd2l0aCBhIG5vZGUgbmFtZSBtYXRjaGluZyBhbnkgb2YgdGhlIHByb3ZpZGVkIG5hbWVzLlxuICAgICAqIFRyYXZlcnNlcyB1cCB0aGUgRE9NIHRyZWUgZnJvbSB0aGUgZ2l2ZW4gbm9kZSB1bnRpbCBhIG1hdGNoIGlzIGZvdW5kIG9yIHRoZSByb290IGlzIHJlYWNoZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSAtIFRoZSBzdGFydGluZyBET00gbm9kZSB0byBjaGVja1xuICAgICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIG5vZGUgbmFtZXMgKHRhZyBuYW1lcykgdG8gc2VhcmNoIGZvciBpbiB1cHBlcmNhc2UgKGUuZy4sIFsnVEFCTEUnLCAnRElWJ10pXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhbiBhbmNlc3RvciB3aXRoIGEgbWF0Y2hpbmcgbmFtZSBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgc3RhdGljIGhhc1BhcmVudChub2RlOiBOb2RlLCBuYW1lczpzdHJpbmdbXSkge1xuICAgICAgICBsZXQgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICB3aGlsZSAocCAmJiAhbmFtZXMuaW5jbHVkZXMocC5ub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIHAgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgZmlyc3QgYW5jZXN0b3IgZWxlbWVudCB0aGF0IG1hdGNoZXMgYW55IG9mIHRoZSBwcm92aWRlZCBub2RlIG5hbWVzIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAgICAgKiBTaW1pbGFyIHRvIGhhc1BhcmVudCBidXQgcmV0dXJucyB0aGUgYWN0dWFsIGVsZW1lbnQgcmVmZXJlbmNlIGFuZCBwZXJmb3JtcyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSAtIFRoZSBzdGFydGluZyBET00gbm9kZVxuICAgICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIGxvd2VyY2FzZSBub2RlIG5hbWVzIHRvIHNlYXJjaCBmb3IgKGUuZy4sIFsndGFibGUnLCAnZGl2J10pXG4gICAgICogQHJldHVybnMgVGhlIG1hdGNoaW5nIGFuY2VzdG9yIGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZSBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRBbmNlc3Rvcihub2RlOiBOb2RlLCBuYW1lczpzdHJpbmdbXSkge1xuICAgICAgICBsZXQgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICB3aGlsZSAocCAmJiAhbmFtZXMuaW5jbHVkZXMocC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdHdvIG5vZGVzIGFyZSB0aGUgc2FtZSBub2RlLCB3aXRoIGZhbGxiYWNrIHN0cmF0ZWdpZXMgZm9yIGRpZmZlcmVudCBicm93c2VyIGVudmlyb25tZW50cy5cbiAgICAgKiBVc2VzIG11bHRpcGxlIGNvbXBhcmlzb24gbWV0aG9kcyBmb3IgY3Jvc3MtYnJvd3NlciBjb21wYXRpYmlsaXR5OlxuICAgICAqIDEuIFN0cmljdCBlcXVhbGl0eSAoPT09KVxuICAgICAqIDIuIGlzU2FtZU5vZGUoKSBtZXRob2QgaWYgYXZhaWxhYmxlXG4gICAgICogMy4gY29tcGFyZURvY3VtZW50UG9zaXRpb24oKSAocmV0dXJucyAwIGlmIHNhbWUgbm9kZSlcbiAgICAgKiA0LiBSZXR1cm5zIHRydWUgYXMgbGFzdCByZXNvcnQgaWYgbm8gY29tcGFyaXNvbiBtZXRob2QgaXMgYXZhaWxhYmxlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYSAtIEZpcnN0IG5vZGUgdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSBiIC0gU2Vjb25kIG5vZGUgdG8gY29tcGFyZVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgbm9kZXMgYXJlIHRoZSBzYW1lLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgc2FtZU5vZGUoYTogTm9kZSwgYjogTm9kZSkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGEuaXNTYW1lTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGEuaXNTYW1lTm9kZShiKTtcbiAgICAgICAgfSBlbHNlIGlmIChhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCAtIHRyeSBvdXIgYmVzdFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIHdoaXRlc3BhY2UgaW4gYSBzdHJpbmcgYnkgcmVwbGFjaW5nIGFsbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcbiAgICAgKiAoc3BhY2VzLCB0YWJzLCBjYXJyaWFnZSByZXR1cm5zLCBuZXdsaW5lcykgd2l0aCBzaW5nbGUgc3BhY2VzIGFuZCBjb2xsYXBzaW5nXG4gICAgICogbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIGludG8gb25lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHMgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGNsZWFuXG4gICAgICogQHJldHVybnMgVGhlIGNsZWFuZWQgc3RyaW5nIHdpdGggbm9ybWFsaXplZCB3aGl0ZXNwYWNlXG4gICAgICogQGV4YW1wbGUgXCJIZWxsb1xcblxcdCAgV29ybGRcIiDihpIgXCJIZWxsbyBXb3JsZFwiXG4gICAgICovXG4gICAgc3RhdGljIGNsZWFuV2hpdGVzcGFjZShzOiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHMucmVwbGFjZSgvWyBcXHRcXHJcXG5dL2csIFwiIFwiKS5yZXBsYWNlKC8gKy9nLFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZXMgbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIGludG8gYSBzaW5nbGUgc3BhY2UuXG4gICAgICogVW5saWtlIGNsZWFuV2hpdGVzcGFjZSwgb25seSBoYW5kbGVzIHNwYWNlcywgbm90IG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBsaWtlIHRhYnMgb3IgbmV3bGluZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcyAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gY2xlYW5cbiAgICAgKiBAcmV0dXJucyBUaGUgc3RyaW5nIHdpdGggY29sbGFwc2VkIHNwYWNlc1xuICAgICAqL1xuICAgIHN0YXRpYyBjbGVhblNwYWNlKHM6IHN0cmluZykgOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsID0gcy5yZXBsYWNlKC8gKy9nLFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHR3byBlbGVtZW50cyAodHlwaWNhbGx5IHRhYmxlIGNlbGxzKSBiZWxvbmcgdG8gdGhlIHNhbWUgdGFibGUgZWxlbWVudC5cbiAgICAgKiBGaW5kcyB0aGUgdGFibGUgYW5jZXN0b3IgZm9yIGVhY2ggZWxlbWVudCBhbmQgY29tcGFyZXMgdGhlbSB1c2luZyBzYW1lTm9kZSgpLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQxIC0gRmlyc3QgZWxlbWVudCB0byBjaGVja1xuICAgICAqIEBwYXJhbSBlbGVtZW50MiAtIFNlY29uZCBlbGVtZW50IHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBib3RoIGVsZW1lbnRzIHNoYXJlIHRoZSBzYW1lIHRhYmxlIGFuY2VzdG9yLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNJblNhbWVUYWJsZShlbGVtZW50MSwgZWxlbWVudDIpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQxICYmIGVsZW1lbnQyKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnROYW1lID0gWyd0YWJsZSddO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50MT0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtZW50MSwgcGFyZW50TmFtZSk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQyPSBET01VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQyLCBwYXJlbnROYW1lKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQxICE9PSBudWxsICYmIHBhcmVudDIgIT0gbnVsbCAmJiBET01VdGlsLnNhbWVOb2RlKHBhcmVudDEsIHBhcmVudDIpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogVHJhdmVyc2VzIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIHRoZSBzaGFkb3cgcm9vdCAoZG9jdW1lbnQgZnJhZ21lbnQpIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIG5vZGUuXG4gICAgICogSW1wb3J0YW50IGZvciBoYW5kbGluZyBXZWIgQ29tcG9uZW50cyBhbmQgU2hhZG93IERPTSBzdHJ1Y3R1cmVzIGluIGFjY2Vzc2liaWxpdHkgY2hlY2tpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSAtIFRoZSBzdGFydGluZyBub2RlXG4gICAgICogQHJldHVybnMgVGhlIHNoYWRvdyByb290IG5vZGUgKG5vZGVUeXBlIDExID0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSksIG9yIG51bGwgaWYgbm9uZSBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBzaGFkb3dSb290Tm9kZShub2RlOiBOb2RlKSA6IE5vZGUgfCBudWxsIHtcbiAgICAgICAgbGV0IG5kID0gbm9kZTtcbiAgICAgICAgd2hpbGUgKG5kICE9IG51bGwgJiYgbmQubm9kZVR5cGUgIT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLylcbiAgICAgICAgICAgIG5kID0gbmQucGFyZW50Tm9kZTtcbiAgICAgICAgcmV0dXJuIG5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgYW4gb2JqZWN0IHdoaWxlIHByZXNlcnZpbmcgTm9kZSByZWZlcmVuY2VzIChkb2Vzbid0IGNsb25lIE5vZGUgb2JqZWN0cykuXG4gICAgICogVXNlZnVsIHdoZW4gY29weWluZyBkYXRhIHN0cnVjdHVyZXMgdGhhdCBjb250YWluIERPTSBub2RlIHJlZmVyZW5jZXMsIGFzIHlvdSB0eXBpY2FsbHkgd2FudFxuICAgICAqIHRvIHByZXNlcnZlIHRob3NlIHJlZmVyZW5jZXMgcmF0aGVyIHRoYW4gYXR0ZW1wdGluZyB0byBjbG9uZSB0aGUgbm9kZXMgdGhlbXNlbHZlcy5cbiAgICAgKlxuICAgICAqIEJlaGF2aW9yOlxuICAgICAqIC0gUHJpbWl0aXZlIHZhbHVlczogRGVlcCBjb3BpZWQgdmlhIEpTT04gc2VyaWFsaXphdGlvblxuICAgICAqIC0gRnVuY3Rpb25zOiBSZXR1cm5lZCBhcy1pcyAocmVmZXJlbmNlKVxuICAgICAqIC0gTm9kZSBvYmplY3RzOiBSZXR1cm5lZCBhcy1pcyAocmVmZXJlbmNlLCBub3QgY2xvbmVkKVxuICAgICAqIC0gQXJyYXlzL09iamVjdHM6IFJlY3Vyc2l2ZWx5IGNvcGllZCB3aXRoIHRoZSBzYW1lIHJ1bGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmhzIC0gVGhlIG9iamVjdCB0byBjb3B5IChyaWdodC1oYW5kIHNpZGUpXG4gICAgICogQHJldHVybnMgQSBjb3B5IG9mIHRoZSBvYmplY3Qgd2l0aCBOb2RlIHJlZmVyZW5jZXMgcHJlc2VydmVkXG4gICAgICovXG4gICAgc3RhdGljIG9iamVjdENvcHlXaXRoTm9kZVJlZnMocmhzOiBhbnkpIHtcbiAgICAgICAgaWYgKCFyaHMpIHJldHVybiByaHM7XG4gICAgICAgIGlmICh0eXBlb2YgcmhzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJocyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJocztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmhzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmhzIGluc3RhbmNlb2YgTm9kZSB8fCAhIXJocy5ub2RlVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJocztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXRWYWw7XG4gICAgICAgICAgICBpZiAocmhzLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiQXJyYXlcIikge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByaHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnB1c2godGhpcy5vYmplY3RDb3B5V2l0aE5vZGVSZWZzKGl0ZW0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJocykge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxba2V5XSA9IHRoaXMub2JqZWN0Q29weVdpdGhOb2RlUmVmcyhyaHNba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBmaXJzdCBhbmNlc3RvciBlbGVtZW50IHRoYXQgaGFzIGEgc3BlY2lmaWMgYXR0cmlidXRlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZS5cbiAgICAgKiBUcmF2ZXJzZXMgdXAgdGhlIERPTSB0cmVlIGZyb20gdGhlIGdpdmVuIGVsZW1lbnQgdW50aWwgYSBtYXRjaGluZyBhbmNlc3RvciBpcyBmb3VuZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIHN0YXJ0aW5nIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gYXR0ck5hbWUgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gc2VhcmNoIGZvclxuICAgICAqIEBwYXJhbSBhdHRyVmFsdWUgLSBUaGUgZXhwZWN0ZWQgYXR0cmlidXRlIHZhbHVlXG4gICAgICogQHJldHVybnMgVGhlIG1hdGNoaW5nIGFuY2VzdG9yIGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZSBmb3VuZFxuICAgICAqIEBleGFtcGxlIEZpbmRpbmcgYW4gYW5jZXN0b3Igd2l0aCBhcmlhLWhpZGRlbj1cInRydWVcIiBvciBkYXRhLXRlc3RpZD1cImNvbnRhaW5lclwiXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcldpdGhBdHRyaWJ1dGUoZWxlbWVudCwgYXR0ck5hbWUsIGF0dHJWYWx1ZSkge1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgKDxFbGVtZW50PndhbGtOb2RlKS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpID09PSBhdHRyVmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL1Zpc1V0aWxcIjtcbi8qKlxuICogV2Fsa3MgaW4gYSBET00gb3JkZXJcbiAqIFxuICogQXNzdW1wdGlvbiB0aGF0IG5vZGVzIG9mIHNoYWRvdyBET01zIGNhbGwgYXNzaWduU2xvdHMgb24gdGhlIHNoYWRvdyByb290IGJlZm9yZSBcbiAqIGRvaW5nIG90aGVyIHByb2Nlc3NpbmcgaW4gdGhhdCB0cmVlLiBJZiB5b3Ugd2FsayBpbnRvIGEgc2hhZG93IHJvb3QsIHRoZSBET01XYWxrZXJcbiAqIHdpbGwgZG8gaXQgYXV0b21hdGljYWxseS5cbiAqIFxuICogU2VlIGFsc28gLi4vYXJpYS9BUklBV2Fsa2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBET01XYWxrZXIge1xuICAgIHJvb3QgOiBOb2RlO1xuICAgIG5vZGUgOiBOb2RlO1xuICAgIGJFbmRUYWc6IGJvb2xlYW47XG4gICAgY29uc2lkZXJIaWRkZW46IGJvb2xlYW47XG4gICAgREVCVUc6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50IDogTm9kZSwgYkVuZD8gOiBib29sZWFuLCByb290PyA6IE5vZGUsIGNvbnNpZGVySGlkZGVuPyA6IGJvb2xlYW4sIERFQlVHPzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLkRFQlVHID0gISFERUJVRztcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdCB8fCAoKGVsZW1lbnQgJiYgZWxlbWVudC5vd25lckRvY3VtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6IGVsZW1lbnQpO1xuICAgICAgICBpZiAodGhpcy5yb290Lm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSAodGhpcy5yb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJFbmQgPT0gdHJ1ZSk7XG4gICAgICAgIHRoaXMuY29uc2lkZXJIaWRkZW4gPSBjb25zaWRlckhpZGRlbiB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBlbGVtKCkgOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmIHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCB8fCBudWxsO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgcGFyZW50Tm9kZShub2RlOiBOb2RlKSA6IE5vZGUgfCBudWxsIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcCA6IE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGlmICgobm9kZSBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgcCA9IChub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICB9IGVsc2UgaWYgKChub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICBwID0gKG5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAocCAmJiBwLm5vZGVUeXBlID09PSAxMSkge1xuICAgICAgICAgICAgaWYgKChwIGFzIFNoYWRvd1Jvb3QpLmhvc3QpIHtcbiAgICAgICAgICAgICAgICBwID0gKHAgYXMgU2hhZG93Um9vdCkuaG9zdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcmVudEVsZW1lbnQobm9kZTogTm9kZSkgOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGxldCBlbGVtIDogRWxlbWVudCA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgZG8geyBcbiAgICAgICAgICAgIGVsZW0gPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtKSBhcyBFbGVtZW50O1xuICAgICAgICB9IHdoaWxlIChlbGVtICYmIGVsZW0ubm9kZVR5cGUgIT09IDEpO1xuICAgICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXNzaWduU2xvdHMocm9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBsZXQgc2xvdHMgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuICAgICAgICBmb3IgKGxldCBpU2xvdD0wOyBpU2xvdDxzbG90cy5sZW5ndGg7ICsraVNsb3QpIHtcbiAgICAgICAgICAgIGxldCBwcm9jZXNzU2xvdCA9IHNsb3RzW2lTbG90XTtcbiAgICAgICAgICAgIGxldCBhc3NpZ25lZE5vZGVzID0gcHJvY2Vzc1Nsb3QuYXNzaWduZWROb2RlcygpO1xuICAgICAgICAgICAgZm9yIChsZXQgaUFzc2lnbmVkPTA7IGlBc3NpZ25lZDxhc3NpZ25lZE5vZGVzLmxlbmd0aDsgKytpQXNzaWduZWQpIHtcbiAgICAgICAgICAgICAgICAoYXNzaWduZWROb2Rlc1tpQXNzaWduZWRdIGFzIGFueSkuc2xvdE93bmVyID0gcHJvY2Vzc1Nsb3Q7XG4gICAgICAgICAgICAgICAgKGFzc2lnbmVkTm9kZXNbaUFzc2lnbmVkXSBhcyBhbnkpLnNsb3RJbmRleCA9IGlBc3NpZ25lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmaXJzdENoaWxkTm90T3duZWRCeVNsb3Qobm9kZTogTm9kZSkge1xuICAgICAgICBsZXQgcmV0VmFsID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHN0YXRpYyBsYXN0Q2hpbGROb3RPd25lZEJ5U2xvdChub2RlOiBOb2RlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBub2RlLmxhc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKHJldFZhbCAmJiAocmV0VmFsIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICByZXRWYWwgPSByZXRWYWwucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgc3RhdGljIG5leHRTaWJsaW5nTm90T3duZWRCeVNsb3Qobm9kZTpOb2RlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHN0YXRpYyBwcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdChub2RlOk5vZGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBhdFJvb3QoKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yb290ID09PSB0aGlzLm5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5pc1NhbWVOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmlzU2FtZU5vZGUodGhpcy5ub2RlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5ub2RlKSA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCAtIHRyeSBvdXIgYmVzdFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wYXJlbnROb2RlID09PSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgREVCVUdJRFggPSAwO1xuICAgIGluZGVudCA9IDA7XG4gICAgbmV4dE5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpbmRlbnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcyA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PHRoaXMuaW5kZW50OyArK2lkeCkge1xuICAgICAgICAgICAgICAgIHMgKz0gXCIgXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgREJHID0gZmFsc2U7Ly90aGlzLkRFQlVHSURYID49IDcgJiYgdGhpcy5ERUJVR0lEWCA8PSAxMDtcbiAgICAgICAgbGV0IHN0YXJ0TmFtZSA9IHRoaXMubm9kZS5ub2RlTmFtZTtcbiAgICAgICAgaWYgKCF0aGlzLm5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codGhpcy5ub2RlLm5vZGVOYW1lLCB0aGlzLmJFbmRUYWc/XCJFTkRcIjpcIlNUQVJUXCIsIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIGFueSkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBzbG90RWxlbWVudCA9ICh0aGlzLm5vZGUgYXMgSFRNTFNsb3RFbGVtZW50KVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmICh0aGlzLmNvbnNpZGVySGlkZGVuID8gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhSW50byBGcmFtZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5jb25zaWRlckhpZGRlbiA/IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSkgOiB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUludG8gc2hhZG93IHJvb3RcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVdhbGtlci5hc3NpZ25TbG90cyh0aGlzLm5vZGUgYXMgU2hhZG93Um9vdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzbG90XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFJbnRvIHNsb3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5maXJzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFGaXJzdCBjaGlsZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUZsaXAgdG8gZW5kIHRhZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhITFcIik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhRG9uZSBhdCByb290XCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFNsb3RJbmRleCA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXgrMTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFNsb3RJbmRleCA8IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFOZXh0IHNsb3QgY2hpbGRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXIuYXNzaWduZWROb2RlcygpW25leHRTbG90SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFCYWNrIHVwIHRvIHNsb3Qgb3duZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIVVwIHRvIGZyYW1lIG93bmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLm5leHRTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFOZXh0IHNpYmxpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5uZXh0U2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhUGFyZW50XCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFEb25lIHdpdGggd2Fsa1wiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChEQkcgJiYgKFxuICAgICAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgKVxuICAgICAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLkRFQlVHICYmIGNvbnNvbGUubG9nKGluZGVudCgpK2A8JHt0aGlzLmJFbmRUYWc/XCIvXCI6XCJcIn0ke3RoaXMubm9kZS5ub2RlTmFtZX0+IChmcm9tICR7c3RhcnROYW1lfSkgJHt0aGlzLkRFQlVHSURYKyt9IFNLSVBQRURgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAzIClcbiAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuYkVuZFRhZykgdGhpcy5pbmRlbnQgLT0gMjtcbiAgICAgICAgdGhpcy5ERUJVRyAmJiBjb25zb2xlLmxvZyhpbmRlbnQoKStgPCR7dGhpcy5iRW5kVGFnP1wiL1wiOlwiXCJ9JHt0aGlzLm5vZGUubm9kZU5hbWV9PiAoZnJvbSAke3N0YXJ0TmFtZX0pICR7dGhpcy5ERUJVR0lEWCsrfWApO1xuICAgICAgICB0aGlzLkRFQlVHICYmICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIgJiYgY29uc29sZS5sb2coaW5kZW50KCkrYHNsb3RPd25lcjogJHsodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyLm5vZGVOYW1lfWApO1xuICAgICAgICB0aGlzLkRFQlVHICYmICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXggJiYgY29uc29sZS5sb2coaW5kZW50KCkrYHNsb3RJbmRleDogJHsodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4fWApO1xuICAgICAgICB0aGlzLkRFQlVHICYmICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgJiYgY29uc29sZS5sb2coaW5kZW50KCkrYG93bmVyRWxlbWVudDogJHsodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50Lm5vZGVOYW1lfWApO1xuICAgICAgICBpZiAoIXRoaXMuYkVuZFRhZykgdGhpcy5pbmRlbnQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJldk5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlmcmFtZU5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxJRnJhbWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5jb25zaWRlckhpZGRlbiA/IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKSA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi9cbiAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMuY29uc2lkZXJIaWRkZW4gPyBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudE5vZGUpIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290Lmxhc3RDaGlsZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVdhbGtlci5hc3NpZ25TbG90cyh0aGlzLm5vZGUgYXMgU2hhZG93Um9vdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzbG90XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgKGVsZW1lbnROb2RlIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbnRlciBzbG90IHdpdGggYXNzaWduZWQgbm9kZXMgLSBnbyB0byBsYXN0IGFzc2lnbmVkIG5vZGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RFbGVtZW50ID0gZWxlbWVudE5vZGUgYXMgSFRNTFNsb3RFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKClbc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExKVxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIubGFzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIubGFzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0Um9vdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmV2U2xvdEluZGV4ID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2U2xvdEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKClbcHJldlNsb3RJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBlUnVsZVBvbGljeSB9IGZyb20gXCIuL0lSdWxlXCJcblxuZXhwb3J0IGVudW0gZVRvb2xraXRMZXZlbCB7XG4gICAgTEVWRUxfT05FID0gXCIxXCIsXG4gICAgTEVWRUxfVFdPID0gXCIyXCIsXG4gICAgTEVWRUxfVEhSRUUgPSBcIjNcIixcbiAgICBMRVZFTF9GT1VSID0gXCI0XCJcbn1cblxuZXhwb3J0IGVudW0gZUd1aWRlbGluZUNhdGVnb3J5IHtcbiAgICBBQ0NFU1NJQklMSVRZID0gXCJBY2Nlc3NpYmlsaXR5XCIsXG4gICAgREVTSUdOID0gXCJEZXNpZ25cIixcbiAgICBPVEhFUiA9IFwiT3RoZXJcIlxufVxuXG5leHBvcnQgZW51bSBlR3VpZGVsaW5lVHlwZSB7XG4gICAgREVGQVVMVCA9IFwiZGVmYXVsdFwiLFxuICAgIEVYVEVOU0lPTiA9IFwiZXh0ZW5zaW9uXCJcbn1cblxuZXhwb3J0IHR5cGUgQ2hlY2twb2ludCA9IHtcbiAgICBudW06IHN0cmluZyxcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FjdC1ydWxlcy9hY3QtdG9vbHMvYmxvYi9tYWluL3NyYy9kYXRhL3NjLXVybHMuanNvblxuICAgIHNjSWQ/OiBzdHJpbmcsXG4gICAgLy8gSkNIOiBhZGQgbmFtZSBvZiBjaGVja3BvaW50IGFuZCBzdW1tYXJ5IGRlc2NyaXB0aW9uXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHdjYWdMZXZlbDogc3RyaW5nLFxuICAgIHN1bW1hcnk6IHN0cmluZyxcbiAgICBydWxlcz86IEFycmF5PHsgXG4gICAgICAgIGlkOiBzdHJpbmcsIFxuICAgICAgICAvLyAob3B0aW9uYWwpIFJlYXNvbiBjb2RlcyB0aGF0IHRoaXMgcnVsZXNldCBtYXBwaW5nIGFwcGxpZXMgdG8sIFxuICAgICAgICAvLyBvciBhbGwgaWYgbm90IHNwZWNpZmllZFxuICAgICAgICByZWFzb25Db2Rlcz86IHN0cmluZ1tdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3ksIFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwsXG4gICAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgfT5cbn1cblxuZXhwb3J0IHR5cGUgR3VpZGVsaW5lID0ge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnksXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICB0eXBlPzogZUd1aWRlbGluZVR5cGUsXG4gICAgY2hlY2twb2ludHM6IEFycmF5PENoZWNrcG9pbnQ+XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGVHdWlkZWxpbmVDYXRlZ29yeSwgZUd1aWRlbGluZVR5cGUgfSBmcm9tIFwiLi9JR3VpZGVsaW5lXCI7XG5pbXBvcnQgeyBJTWFwUmVzdWx0IH0gZnJvbSBcIi4vSU1hcHBlclwiO1xuaW1wb3J0IHsgTmxzTWFwIGFzIE5sc01hcE5ldywgSGVscE1hcCBhcyBIZWxwTWFwTmV3LCBJRW5naW5lIGFzIElFbmdpbmVOZXcgfSBmcm9tIFwiLi9JRW5naW5lXCI7XG5pbXBvcnQgeyBSZXBvcnQgYXMgUmVwb3J0TmV3IH0gZnJvbSBcIi4vSVJlcG9ydFwiO1xuaW1wb3J0IHsgZVRvb2xraXRMZXZlbCBhcyBlVG9vbGtpdExldmVsTmV3IH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiXG5pbXBvcnQgeyBCb3VuZHMgfSBmcm9tIFwiLi9JQm91bmRzXCI7XG5cbmV4cG9ydCBlbnVtIGVSdWxlQ29uZmlkZW5jZSB7XG4gICAgUEFTUyA9IFwiUEFTU1wiLFxuICAgIEZBSUwgPSBcIkZBSUxcIixcbiAgICBQT1RFTlRJQUwgPSBcIlBPVEVOVElBTFwiLFxuICAgIE1BTlVBTCA9IFwiTUFOVUFMXCJcbn1cblxuZXhwb3J0IGVudW0gZVJ1bGVQb2xpY3kge1xuICAgIFZJT0xBVElPTiA9IFwiVklPTEFUSU9OXCIsXG4gICAgUkVDT01NRU5EQVRJT04gPSBcIlJFQ09NTUVOREFUSU9OXCIsXG4gICAgSU5GT1JNQVRJT04gPSBcIklORk9STUFUSU9OXCJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVQYXNzKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBBU1NdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVSZW5kZXIocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUEFTU10sXG4gICAgICAgIHJlYXNvbklkOiAwLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gUnVsZUZhaWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuRkFJTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVBvdGVudGlhbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QT1RFTlRJQUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVNYW51YWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuTUFOVUFMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVSZXN1bHQgPSB7XG4gICAgdmFsdWU6IFtlUnVsZVBvbGljeSwgZVJ1bGVDb25maWRlbmNlXSxcbiAgICByZWFzb25JZD86IG51bWJlciB8IHN0cmluZyxcbiAgICBtZXNzYWdlQXJncz86IHN0cmluZ1tdLFxuICAgIGFwaUFyZ3M/OiBhbnlbXVxufVxuXG5leHBvcnQgdHlwZSBJc3N1ZSA9IFJ1bGVSZXN1bHQgJiB7XG4gICAgcnVsZUlkOiBzdHJpbmcsXG5cbiAgICBub2RlOiBOb2RlLFxuICAgIC8vIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGNhdGVnb3J5PzogZUd1aWRlbGluZUNhdGVnb3J5LFxuICAgIHBhdGg6IHsgW25zOiBzdHJpbmddIDogc3RyaW5nIH0sXG5cbiAgICBydWxlVGltZTogbnVtYmVyLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBib3VuZHM/OiBCb3VuZHMsXG4gICAgc25pcHBldDogc3RyaW5nLFxuICAgIHNvdXJjZT86IHN0cmluZyxcbiAgICBsZXZlbD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBSdWxlQ29udGV4dEhpZXJhcmNoeSA9IHsgW25hbWVzcGFjZTogc3RyaW5nXSA6IElNYXBSZXN1bHRbXSB9O1xuXG5leHBvcnQgdHlwZSBSdWxlQ29udGV4dCA9IHtcbiAgICBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcFJlc3VsdFxufVxuXG5leHBvcnQgdHlwZSBSdWxlID0ge1xuICAgIC8vIFVuaXF1ZSBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhpcyBydWxlIChzaG91bGQgYmUgaHVtYW4gdW5kZXJzdGFuZGFibGUpXG4gICAgLy8gTkxTIGNvZGVzIGFuZCBoZWxwIHNvdXJjZXMgd2lsbCBiZSBiYXNlZCBvZmYgb2YgdGhpcyBpZFxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBydWxlc2V0czogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nIHwgc3RyaW5nW11cbiAgICAgICAgbnVtOiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3ksXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbE5ldyxcbiAgICAgICAgLy8gKG9wdGlvbmFsKSBSZWFzb24gY29kZXMgdGhhdCB0aGlzIHJ1bGVzZXQgbWFwcGluZyBhcHBsaWVzIHRvLCBcbiAgICAgICAgLy8gb3IgYWxsIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgcmVhc29uQ29kZXM/OiBzdHJpbmdbXVxuICAgIH0+XG5cbiAgICByZWZhY3Rvcj86IHtcbiAgICAgICAgW29sZFJ1bGVJZDogc3RyaW5nXToge1xuICAgICAgICAgICAgW29sZFJlYXNvbkNvZGU6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFtsb2NhbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaGVscDoge1xuICAgICAgICBbbG9jYWxlOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBcbiAgICAgKiBIb3cgdGhpcyBydWxlIG1hcHMgdG8gQUNUIHJ1bGVzLCBpZiBhbnkgKGh0dHBzOi8vYWN0LXJ1bGVzLmdpdGh1Yi5pby9ydWxlcy8pXG4gICAgICogXG4gICAgICogc3RyaW5nOiBGb3IgYSBzaW5nbGUgcnVsZSBtYXBwaW5nIHRoYXQgbWF0Y2hlcyBleGFjdGx5IHRvIHRoZSBydWxlIChQYXNzIC0+IHBhc3MsIFBvdGVudGlhbCAtPiBjYW50VGVsbCwgRmFpbCAtPiBmYWlsLCB1bmxpc3RlZCA9PiBpbmFwcGxpY2FibGUpXG4gICAgICogQXJyYXk8PjogQ3VzdG9tIG1hcHBpbmcgb2YgcnVsZSB0byBBQ1QgcmVzdWx0c1xuICAgICAqL1xuICAgIGFjdD86IHN0cmluZyB8IHN0cmluZ1tdIHwgQXJyYXk8c3RyaW5nIHwge1xuICAgICAgICBbYWN0UnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IFwicGFzc1wiIHwgXCJmYWlsXCIgfCBcImNhbnRUZWxsXCIgfCBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9PlxuXG4gICAgLy8gU2VlIHNyYy92Mi9jb21tb24vQ29udGV4dC50cyBmb3IgdmFsaWQgY29udGV4dHNcbiAgICBjb250ZXh0OiBzdHJpbmc7XG5cbiAgICAvLyBBcnJheSBvZiBydWxlcyB0aGF0IG11c3QgcGFzcyB0byBhbGxvdyB0aGlzIHZhbGlkYXRlIHRvIHJ1biAtIHRoZXkgbXVzdCBoYXZlIHRoZSBzYW1lIGNvbnRleHQgcHJvcGVydHlcbiAgICBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXVxuXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpID0+IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gfCBudWxsXG5cbiAgICBlbmFibGVkPzogYm9vbGVhblxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVEZXRhaWxzID0gSXNzdWU7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2VlIElFbmdpbmVcbiAqL1xuZXhwb3J0IHR5cGUgUmVwb3J0ID0gUmVwb3J0TmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSBJRW5naW5lXG4gKi9cbmV4cG9ydCB0eXBlIE5sc01hcCA9IE5sc01hcE5ldztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgSUVuZ2luZVxuICovXG5leHBvcnQgdHlwZSBIZWxwTWFwID0gSGVscE1hcE5ldztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JRW5naW5lXG4gKi9cbmV4cG9ydCB0eXBlIElFbmdpbmUgPSBJRW5naW5lTmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lHdWlkZWxpbmVcbiAqL1xuZXhwb3J0IHsgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JR3VpZGVsaW5lOmVHdWlkZWxpbmVDYXRlZ29yeVxuICovXG5leHBvcnQgeyBlR3VpZGVsaW5lQ2F0ZWdvcnkgYXMgZVJ1bGVDYXRlZ29yeSB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JR3VpZGVsaW5lOmVHdWlkZWxpbmVUeXBlXG4gKi9cbmV4cG9ydCB7IGVHdWlkZWxpbmVUeXBlIGFzIGVSdWxlc2V0VHlwZSB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSBhcyBSdWxlVjQsIGVSdWxlUG9saWN5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uLy4uL3YyL2NvbW1vbi9FbmdpbmVcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBhMTF5UnVsZXNldHMgfSBmcm9tIFwiLi4vcnVsZXNldHNcIjtcbmltcG9ydCAqIGFzIGNoZWNrUnVsZXNWNCBmcm9tIFwiLi4vcnVsZXNcIjtcbmltcG9ydCB7IEd1aWRlbGluZSwgZUd1aWRlbGluZUNhdGVnb3J5IH0gZnJvbSBcIi4uL2FwaS9JR3VpZGVsaW5lXCI7XG5pbXBvcnQgeyBJRW5naW5lIH0gZnJvbSBcIi4uL2FwaS9JRW5naW5lXCI7XG5pbXBvcnQgeyBSZXBvcnQgfSBmcm9tIFwiLi4vYXBpL0lSZXBvcnRcIjtcbmltcG9ydCB7IElDaGVja2VyIH0gZnJvbSBcIi4uL2FwaS9JQ2hlY2tlclwiO1xuXG5sZXQgY2hlY2tSdWxlcyA9IFtdO1xubGV0IGNoZWNrTmxzID0ge307XG5sZXQgY2hlY2tIZWxwID0ge307XG5cbmZ1bmN0aW9uIF9pbml0aWFsaXplKCkge1xuICAgIGNvbnN0IGxhbmdzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShFbmdpbmUuZ2V0TGFuZ3VhZ2VzKCkpKTtcbiAgICAvLyBEZWZhdWx0IGxhbmcgdG8gZW4tVVMgaWYgbm90aGluZyBlbHNlIHNwZWNpZmllZCBpcyBmb3VuZFxuICAgIGxhbmdzLnB1c2goXCJlbi1VU1wiKTtcbiAgICAvLyBQcm9jZXNzIFY0IHJ1bGVzIGludG8gdGhlIFYyIGZvcm1hdFxuICAgIGZvciAobGV0IHJ1bGVuYW1lIGluIGNoZWNrUnVsZXNWNCkge1xuICAgICAgICAvLyBDb252ZXJ0IHJ1bGVcbiAgICAgICAgbGV0IHY0UnVsZTogUnVsZVY0ID0gY2hlY2tSdWxlc1Y0W3J1bGVuYW1lXTtcbiAgICAgICAgY2hlY2tSdWxlcy5wdXNoKHY0UnVsZSk7XG4gICAgICAgIC8vIEdvIGJhY2t3YXJkcyBiZWNhdXNlIHRoZSBmaXJzdCBsYW5nIGlzIHRoZSBwcmVmZXJyZWQsIHNvXG4gICAgICAgIC8vIGVhcmxpZXIgbGFuZ3VhZ2VzIHdpbGwgb3ZlcnJpZGUgbGF0ZXIgbGFuZ3VhZ2VzXG4gICAgICAgIGZvciAobGV0IGlkeD1sYW5ncy5sZW5ndGgtMTsgaWR4ID49MDsgLS1pZHgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhbmdJZCA9IGxhbmdzW2lkeF07XG4gICAgICAgICAgICBpZiAobGFuZ0lkIGluIHY0UnVsZS5tZXNzYWdlcykge1xuICAgICAgICAgICAgICAgIGNoZWNrTmxzW3Y0UnVsZS5pZF0gPSB2NFJ1bGUubWVzc2FnZXNbbGFuZ0lkXTtcbiAgICAgICAgICAgICAgICBjaGVja05sc1t2NFJ1bGUuaWRdWzBdID0gY2hlY2tObHNbdjRSdWxlLmlkXS5ncm91cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsYW5nSWQgaW4gdjRSdWxlLmhlbHApIHtcbiAgICAgICAgICAgICAgICBjaGVja0hlbHBbdjRSdWxlLmlkXSA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVhc29uSWQgaW4gdjRSdWxlLmhlbHBbbGFuZ0lkXSkge1xuICAgICAgICAgICAgICAgICAgICBjaGVja0hlbHBbdjRSdWxlLmlkXVtyZWFzb25JZF0gPSBgLyR7bGFuZ0lkfS8ke3Y0UnVsZS5oZWxwW2xhbmdJZF1bcmVhc29uSWRdfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoZWNrTmxzW3Y0UnVsZS5pZF1bMF0gPSBjaGVja05sc1t2NFJ1bGUuaWRdLmdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENvbnZlcnQgUlNcbiAgICAgICAgZm9yIChjb25zdCByc1NlY3Rpb24gb2YgdjRSdWxlLnJ1bGVzZXRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzIG9mIGExMXlSdWxlc2V0cyBhcyBHdWlkZWxpbmVbXSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGVja1JzSWRzIDogc3RyaW5nW10gPSB0eXBlb2YgcnNTZWN0aW9uLmlkID09PSBcInN0cmluZ1wiID8gW3JzU2VjdGlvbi5pZF0gOiByc1NlY3Rpb24uaWQ7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrUnNJZHMuaW5jbHVkZXMocnMuaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgcnMuY2hlY2twb2ludHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGVja0NQSWRzIDogc3RyaW5nW10gPSB0eXBlb2YgcnNTZWN0aW9uLm51bSA9PT0gXCJzdHJpbmdcIiA/IFtyc1NlY3Rpb24ubnVtXSA6IHJzU2VjdGlvbi5udW07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDUElkcy5pbmNsdWRlcyhjcC5udW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AucnVsZXMgPSBjcC5ydWxlcyB8fCBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLnJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdjRSdWxlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb25Db2RlczogcnNTZWN0aW9uLnJlYXNvbkNvZGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogcnNTZWN0aW9uLmxldmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sa2l0TGV2ZWw6IHJzU2VjdGlvbi50b29sa2l0TGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuX2luaXRpYWxpemUoKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi4vYXBpL0lHdWlkZWxpbmVcbiAqL1xuZXhwb3J0IHR5cGUgUnVsZXNldCA9IEd1aWRlbGluZTtcblxuZXhwb3J0IGNsYXNzIENoZWNrZXIgaW1wbGVtZW50cyBJQ2hlY2tlciB7XG4gICAgcHJpdmF0ZSBndWlkZWxpbmVzOiBHdWlkZWxpbmVbXSA9IFtdO1xuXG4gICAgZW5naW5lOiBJRW5naW5lO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBnZXRHdWlkZWxpbmVzKCkuXG4gICAgICovXG4gICAgcnVsZXNldHM6IEd1aWRlbGluZVtdID0gdGhpcy5ndWlkZWxpbmVzO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBnZXRHdWlkZWxpbmVJZHMoKS5cbiAgICAgKi9cbiAgICBydWxlc2V0SWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHJ1bGVzZXRSdWxlczogeyBbcnNJZDogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgIHJ1bGVMZXZlbHMgOiB7IFtydWxlSWQ6IHN0cmluZ106IHsgW3JzSWQ6IHN0cmluZ10gOiBlUnVsZVBvbGljeSB9fSA9IHt9O1xuICAgIHJ1bGVSZWFzb25MZXZlbHMgOiB7IFtydWxlSWQ6IHN0cmluZ106IHsgW3JzSWQ6IHN0cmluZ10gOiB7W3JlYXNvbkNvZGVzOiBzdHJpbmddIDogZVJ1bGVQb2xpY3kgfX19ID0ge307XG4gICAgcnVsZUNhdGVnb3J5IDogeyBbcnVsZUlkOiBzdHJpbmddOiB7IFtyc0lkOiBzdHJpbmddIDogZUd1aWRlbGluZUNhdGVnb3J5IH19ID0ge307XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGxldCBlbmdpbmUgPSB0aGlzLmVuZ2luZSA9IG5ldyBFbmdpbmUoKTtcblxuICAgICAgICBlbmdpbmUuYWRkTWFwcGVyKG5ldyBBUklBTWFwcGVyKCkpO1xuXG4gICAgICAgIGVuZ2luZS5hZGRSdWxlcyhjaGVja1J1bGVzKTtcbiAgICAgICAgZW5naW5lLmFkZE5sc01hcChjaGVja05scyk7XG4gICAgICAgIGVuZ2luZS5hZGRIZWxwTWFwKGNoZWNrSGVscCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBycyBvZiBhMTF5UnVsZXNldHMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUnVsZXNldChycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZ3VpZGVsaW5lIHRvIHRoZSBlbmdpbmUuIElmIHRoZSBpZCBhbHJlYWR5IGV4aXN0cywgdGhlIHByZXZpb3VzIGd1aWRlbGluZSB3aWxsIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBndWlkZWxpbmUgXG4gICAgICovXG4gICAgYWRkR3VpZGVsaW5lKGd1aWRlbGluZTogR3VpZGVsaW5lKSB7XG4gICAgICAgIGlmIChndWlkZWxpbmUuaWQgaW4gdGhpcy5ydWxlc2V0UnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlR3VpZGVsaW5lKGd1aWRlbGluZS5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ndWlkZWxpbmVzLnB1c2goZ3VpZGVsaW5lKTtcbiAgICAgICAgdGhpcy5ydWxlc2V0SWRzLnB1c2goZ3VpZGVsaW5lLmlkKTtcbiAgICAgICAgY29uc3QgcnVsZUlkcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNwIG9mIGd1aWRlbGluZS5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgY3AucnVsZXMgPSBjcC5ydWxlcyB8fCBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBjcC5ydWxlcykge1xuICAgICAgICAgICAgICAgIGlmIChydWxlLmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGVJZHMucHVzaChydWxlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF0gPSB0aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5ydWxlTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF0gPSBydWxlLmxldmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVSZWFzb25MZXZlbHNbcnVsZS5pZF0gPSB0aGlzLnJ1bGVSZWFzb25MZXZlbHNbcnVsZS5pZF0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXVtndWlkZWxpbmUuaWRdID0gdGhpcy5ydWxlUmVhc29uTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBydWxlLnJlYXNvbkNvZGVzID8gcnVsZS5yZWFzb25Db2Rlcy5qb2luKCctLScpIDogXCJOb25lXCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXVtndWlkZWxpbmUuaWRdW2NvZGVdID0gcnVsZS5sZXZlbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZS5pZF0gPSB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZS5pZF1bZ3VpZGVsaW5lLmlkXSA9IGd1aWRlbGluZS5jYXRlZ29yeTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ydWxlc2V0UnVsZXNbZ3VpZGVsaW5lLmlkXSA9IHJ1bGVJZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGEgcnVsZSBmb3IgYWxsIGd1aWRlbGluZXNcbiAgICAgKiBAcGFyYW0gcnVsZUlkIFxuICAgICAqL1xuICAgIGVuYWJsZVJ1bGUocnVsZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgZm9yIChjb25zdCBndWlkZWxpbmUgb2YgdGhpcy5nZXRHdWlkZWxpbmVzKCkpIHtcbiAgICAgICAgICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNwIG9mIGd1aWRlbGluZS5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBjcC5ydWxlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5lbmFibGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcnVsZS5lbmFibGVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEd1aWRlbGluZShndWlkZWxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBhIHJ1bGUgZm9yIGFsbCBndWlkZWxpbmVzXG4gICAgICogQHBhcmFtIHJ1bGVJZCBcbiAgICAgKi9cbiAgICBkaXNhYmxlUnVsZShydWxlSWQ6IHN0cmluZykge1xuICAgICAgICBmb3IgKGNvbnN0IGd1aWRlbGluZSBvZiB0aGlzLmdldEd1aWRlbGluZXMoKSkge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgZ3VpZGVsaW5lLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNwLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEd1aWRlbGluZShndWlkZWxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZ3VpZGVsaW5lIGZyb20gdGhlIGVuZ2luZVxuICAgICAqIFxuICAgICAqIEdlbmVyYWxseSwgdGhlcmUgaXNuJ3QgYSBnb29kIHJlYXNvbiB0byBkbyB0aGlzLiBVc2VycyBzaG91bGQganVzdCBub3Qgc2VsZWN0IHRoZSBndWlkZWxpbmUgYXMgYW4gb3B0aW9uIGluIGNoZWNrXG4gICAgICogQHBhcmFtIGd1aWRlbGluZUlkXG4gICAgICovXG4gICAgcHJpdmF0ZSByZW1vdmVHdWlkZWxpbmUoZ3VpZGVsaW5lSWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoZ3VpZGVsaW5lSWQgaW4gdGhpcy5ydWxlc2V0UnVsZXMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJ1bGVzZXRSdWxlc1tndWlkZWxpbmVJZF07XG4gICAgICAgICAgICB0aGlzLnJ1bGVzZXRzID0gdGhpcy5ndWlkZWxpbmVzID0gdGhpcy5ndWlkZWxpbmVzLmZpbHRlcihndWlkZWxpbmUgPT4gZ3VpZGVsaW5lLmlkICE9PSBndWlkZWxpbmVJZCk7XG4gICAgICAgICAgICB0aGlzLnJ1bGVzZXRJZHMgPSB0aGlzLmdldEd1aWRlbGluZUlkcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBndWlkZWxpbmVzIGF2YWlsYWJsZSBpbiB0aGUgZW5naW5lXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2V0R3VpZGVsaW5lcygpIDogR3VpZGVsaW5lW10ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmd1aWRlbGluZXMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGlkcyBvZiB0aGUgZ3VpZGVsaW5lcyBhdmFpbGFibGUgaW4gdGhlIGVuZ2luZVxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGdldEd1aWRlbGluZUlkcygpIDogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlkZWxpbmVzLm1hcChndWlkZWxpbmUgPT4gZ3VpZGVsaW5lLmlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAZGVwcmVjYXRlZCBTZWUgYWRkR3VpZGVsaW5lXG4gICAgICovXG4gICAgYWRkUnVsZXNldChyczogUnVsZXNldCkge1xuICAgICAgICB0aGlzLmFkZEd1aWRlbGluZShycyk7XG4gICAgfVxuXG4gICAgZW5hYmxlU291cmNlTWFwKGVuYWJsZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmVuZ2luZS5lbmFibGVTb3VyY2VNYXAoZW5hYmxlKTtcbiAgICB9XG5cbiAgICBpc1NvdXJjZU1hcEVuYWJsZWQoKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUuaXNTb3VyY2VNYXBFbmFibGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybSBhIGNoZWNrIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS9kb2N1bWVudFxuICAgICAqIEBwYXJhbSBub2RlIERPTU5vZGUgb3IgRG9jdW1lbnQgb24gd2hpY2ggdG8gcnVuIHRoZSBjaGVja1xuICAgICAqIEBwYXJhbSBndWlkZWxpbmVJZHMgR3VpZGVsaW5lIGlkcyB0byBjaGVjayB3aXRoIHRvIHNwZWNpZnkgd2hpY2ggcnVsZXMgdG8gcnVuXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgY2hlY2sobm9kZTogTm9kZSB8IERvY3VtZW50LCBndWlkZWxpbmVJZHM/OiBzdHJpbmcgfCBzdHJpbmdbXSkgOiBQcm9taXNlPFJlcG9ydD4ge1xuICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggcnVsZXMgdG8gcnVuXG4gICAgICAgIGxldCBydWxlSWRzIDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAvLyBGaXggdGhlIGlucHV0XG4gICAgICAgIGlmICghZ3VpZGVsaW5lSWRzKSB7XG4gICAgICAgICAgICBydWxlSWRzID0gdGhpcy5lbmdpbmUuZ2V0UnVsZXNJZHMoKTtcbiAgICAgICAgfSBlbHNle1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBndWlkZWxpbmVJZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBndWlkZWxpbmVJZHMgPSBbZ3VpZGVsaW5lSWRzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCByc0lkIG9mIGd1aWRlbGluZUlkcykge1xuICAgICAgICAgICAgICAgIGlmIChyc0lkIGluIHRoaXMucnVsZXNldFJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGVJZHMgPSBydWxlSWRzLmNvbmNhdCh0aGlzLnJ1bGVzZXRSdWxlc1tyc0lkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9ICAgIFxuICAgICAgICB0aGlzLmVuZ2luZS5lbmFibGVSdWxlcyhydWxlSWRzKTtcbiAgICAgICAgLy8gQWRkIHRoZSByZXBvcnQgbGV2ZWxzXG4gICAgICAgIGxldCBteVRoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUucnVuKG5vZGUpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVwb3J0KSB7XG4gICAgICAgICAgICAgICAgcmVwb3J0Lm5scyA9IHt9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXBvcnQucmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJ1bGVJZCBpbiBjaGVja05scykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0Lm5sc1tyZXN1bHQucnVsZUlkXSA9IHJlcG9ydC5ubHNbcmVzdWx0LnJ1bGVJZF0gfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IGNoZWNrTmxzW3Jlc3VsdC5ydWxlSWRdWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlYXNvbklkIGluIGNoZWNrTmxzW3Jlc3VsdC5ydWxlSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0Lm5sc1tyZXN1bHQucnVsZUlkXVtyZXN1bHQucmVhc29uSWRdID0gY2hlY2tObHNbcmVzdWx0LnJ1bGVJZF1bcmVzdWx0LnJlYXNvbklkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvL3Jlc3VsdC52YWx1ZVswXSA9IG15VGhpcy5nZXRMZXZlbChndWlkZWxpbmVJZHMgYXMgc3RyaW5nW10sIHJlc3VsdC5ydWxlSWQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29kZSA9IHJlc3VsdC5yZWFzb25JZD8gcmVzdWx0LnJlYXNvbklkIGFzIHN0cmluZyA6IFwiTm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudmFsdWVbMF0gPSBteVRoaXMuZ2V0UmVhc29uTGV2ZWwoZ3VpZGVsaW5lSWRzIGFzIHN0cmluZ1tdLCByZXN1bHQucnVsZUlkLCBjb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNhdGVnb3J5ID0gbXlUaGlzLmdldENhdGVnb3J5KGd1aWRlbGluZUlkcyBhcyBzdHJpbmdbXSwgcmVzdWx0LnJ1bGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQucGF0aC5jc3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXBvcnQ7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgIHByaXZhdGUgZ2V0TGV2ZWwocnNJZHM6IHN0cmluZ1tdLCBydWxlSWQ6IHN0cmluZykgOiBlUnVsZVBvbGljeSB7XG4gICAgICAgIGlmICghcnNJZHMpIHJldHVybiBlUnVsZVBvbGljeS5JTkZPUk1BVElPTjtcbiAgICAgICAgbGV0IHJzSW5mbyA9IHRoaXMucnVsZUxldmVsc1tydWxlSWRdO1xuICAgICAgICBsZXQgcmV0VmFsID0gbnVsbDtcbiAgICAgICAgaWYgKHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlTGV2ZWxzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bGUgdHJpZ2dlcmVkIGZvciB3aGljaCB3ZSBoYXZlIG5vIHJ1bGUgbGV2ZWwgaW5mb3JtYXRpb246IFwiK3J1bGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgcnNJZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnNJZCBpbiByc0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzSW5mb1tyc0lkXSA9PT0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5WSU9MQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnNJbmZvW3JzSWRdID09PSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiAmJiByZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVsZSB0cmlnZ2VyZWQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gcnVsZSBsZXZlbCBpbmZvcm1hdGlvbjogXCIrcnVsZUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVhc29uTGV2ZWwocnNJZHM6IHN0cmluZ1tdLCBydWxlSWQ6IHN0cmluZywgcmVhc29uQ29kZT86IHN0cmluZykgOiBlUnVsZVBvbGljeSB7XG4gICAgICAgIGlmICghcnNJZHMpIHJldHVybiBlUnVsZVBvbGljeS5JTkZPUk1BVElPTjsgXG4gICAgICAgIGxldCByc0luZm8gPSB0aGlzLnJ1bGVSZWFzb25MZXZlbHNbcnVsZUlkXTtcbiAgICAgICAgbGV0IHJldFZhbCA9IG51bGw7XG4gICAgICAgIGlmIChyc0lkcykge1xuICAgICAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZVJlYXNvbkxldmVscykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uIFwiK3J1bGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgcnNJZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnNJZCBpbiByc0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVDb2RlID0gbmV3IFJlZ0V4cChgKF58LS0pJHtyZWFzb25Db2RlfSgkfC0tKWApO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyc0luZm9bcnNJZF0pLmZvckVhY2goY29kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGV2ZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09ICdOb25lJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IHJzSW5mb1tyc0lkXVtcIk5vbmVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZUNvZGUudGVzdChjb2RlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IHJzSW5mb1tyc0lkXVtjb2RlXTsgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PT0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LlZJT0xBVElPTjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsID09PSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiAmJiByZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT047IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LklORk9STUFUSU9OO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LklORk9STUFUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBcbiAgICAgICAgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVsZSB0cmlnZ2VyZWQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gcnVsZSBsZXZlbCBpbmZvcm1hdGlvbjogXCIrcnVsZUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2F0ZWdvcnkocnNJZHM6IHN0cmluZ1tdLCBydWxlSWQ/OiBzdHJpbmcpIDogZUd1aWRlbGluZUNhdGVnb3J5IHtcbiAgICAgICAgbGV0IHJzSW5mbyA9IHRoaXMucnVsZUNhdGVnb3J5W3J1bGVJZF07XG4gICAgICAgIGxldCByZXRWYWwgPSBcIlwiO1xuXG4gICAgICAgIGlmICghKHJ1bGVJZCBpbiB0aGlzLnJ1bGVDYXRlZ29yeSkpIHtcbiAgICAgICAgICAgIHJldHVybiBlR3VpZGVsaW5lQ2F0ZWdvcnkuT1RIRVI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyc0lkcykge1xuICAgICAgICAgICAgcnNJZHMgPSB0aGlzLmdldEd1aWRlbGluZUlkcygpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcnNJZCBvZiByc0lkcykge1xuICAgICAgICAgICAgaWYgKHJzSWQgaW4gcnNJbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJzSW5mb1tyc0lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZUd1aWRlbGluZUNhdGVnb3J5Lk9USEVSO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhX3RhcmdldF93YXJuaW5nOiBSdWxlID0ge1xuICAgIGlkOiBcImFfdGFyZ2V0X3dhcm5pbmdcIixcbiAgICBjb250ZXh0OiBcImRvbTphW3RhcmdldF0sZG9tOmFyZWFbdGFyZ2V0XSxkb206YmFzZVt0YXJnZXRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQV9UYXJnZXRBbmRUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF93YXJuXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFfdGFyZ2V0X3dhcm5pbmcuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYGFfdGFyZ2V0X3dhcm5pbmcuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF93YXJuXCI6IGBhX3RhcmdldF93YXJuaW5nLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZXJzIHNob3VsZCBiZSB3YXJuZWQgaW4gYWR2YW5jZSBpZiB0aGVpciBpbnB1dCBhY3Rpb24gd2lsbCBvcGVuIGEgbmV3IHdpbmRvd1wiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHVzZXIgaXMgd2FybmVkIGluIGFkdmFuY2UgdGhhdCB0aGUgaW5wdXQgYWN0aW9uIG9wZW5zIGEgbmV3IHdpbmRvd1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfd2FyblwiOiBcIkluZm9ybSB0aGUgdXNlciB3aGVuIHRoZWlyIGlucHV0IGFjdGlvbiB3aWxsIG9wZW4gYSBuZXcgd2luZG93XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMy4yLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBza2lwIHRoZSBydWxlIGlmIGl0J3MgQVQgaGlkZGVuIGFuZCBub3QgdGFiYmFibGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtV2luVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJuZXcgd2luZG93XCIsIFwibmV3IHRhYlwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0U3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdFN0ciA9PSBcIl9wYXJlbnRcIiB8fCB0U3RyID09IFwiX3NlbGZcIiB8fCB0U3RyID09IFwiX3RvcFwiIHx8IENvbW1vblV0aWwuZ2V0RnJhbWVCeU5hbWUocnVsZUNvbnRleHQsdFN0cikgIT0gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vIE5hbWUgaXMgbm90IHBhcnQgb2YgdGhpcyBmcmFtZXNldCDigJMgbXVzdCBoYXZlIHBvdGVudGlhbCB0byBjcmVhdGUgbmV3IHdpbmRvdz9cbiAgICAgICAgICAgIC8vIFNlZSBpZiBhIG5ldyB3aW5kb3cgaXMgbWVudGlvbmVkXG4gICAgICAgICAgICBsZXQgdGV4dFN0ciA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICB0ZXh0U3RyICs9IFwiIFwiICsgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENoZWNrIGFyaWEtZGVzY3JpYmVkYnkgZm9yIHdhcm5pbmcgdGV4dFxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVzY3JpYmVkYnlJZHMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGlkIG9mIGRlc2NyaWJlZGJ5SWRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWZlcmVuY2VkRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBpZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlc2NyaWJlZFRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChyZWZlcmVuY2VkRWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpYmVkVGV4dCAmJiBkZXNjcmliZWRUZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0ciArPSBcIiBcIiArIGRlc2NyaWJlZFRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCBwYXJhbXMucGFyYW1XaW5UZXh0LnZhbHVlLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGlmICh0ZXh0U3RyLmluZGV4T2YocGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZVtpXSkgIT0gLTEpIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfd2FyblwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcyB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhX3RleHRfcHVycG9zZTogUnVsZSA9IHtcbiAgICBpZDogXCJhX3RleHRfcHVycG9zZVwiLFxuICAgIC8vIGRvYy1iaWJsaW9yZWYgaXMgYSBsaW5rXG4gICAgY29udGV4dDogXCJhcmlhOmxpbmssYXJpYTpkb2MtYmlibGlvcmVmXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQV9IYXNUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2FjY19uYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgLFxuICAgICAgICAgICAgXCJwYXNzXCI6IGBhX3RleHRfcHVycG9zZS5odG1sYCxcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBgYV90ZXh0X3B1cnBvc2UuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSHlwZXJsaW5rcyBtdXN0IGhhdmUgYW4gYWNjZXNzaWJsZSBuYW1lIGZvciB0aGVpciBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJIeXBlcmxpbmsgaGFzIGEgZGVzY3JpcHRpb24gb2YgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBcIkh5cGVybGluayBoYXMgbm8gbGluayB0ZXh0LCBsYWJlbCBvciBpbWFnZSB3aXRoIGEgdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjQuNFwiLCBcIjQuMS4yXCJdLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogXCJjNDg3YWVcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFJ1bGUgb25seSBwYXNzZXMgaWYgYW4gZWxlbWVudCBoYXMgaW5uZXIgY29udGVudCxcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBvbmx5IGhpZGRlbiBjb250ZW50IHVuZGVyIHRoZSB0aGUgZWxlbWVudCBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgICBjb25zdCBhY2NOYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIChhY2NOYW1lX3BhaXIgJiYgYWNjTmFtZV9wYWlyLm5hbWUgJiYgYWNjTmFtZV9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgLyoqQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDAqL1xuICAgICAgICAgICAgfHwgQ29tbW9uVXRpbC5ub25UYWJhYmxlQ2hpbGRDaGVjayhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2FjY19uYW1lXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhcHBsZXRfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcHBsZXRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFwcGxldFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0FwcGxldF9IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGFwcGxldD4gZWxlbWVudHMgbXVzdCBwcm92aWRlIGFuICdhbHQnIGF0dHJpYnV0ZSBhbmQgYW4gYWx0ZXJuYXRpdmUgZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQW4gPGFwcGxldD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuICdhbHQnIGF0dHJpYnV0ZSB0aGF0IHByb3ZpZGVzIGEgc2hvcnQgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2FsdCcgYXR0cmlidXRlIHZhbHVlIGZvciBhbiA8YXBwbGV0PiBlbGVtZW50IGR1cGxpY2F0ZXMgdGhlICdjb2RlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiQW4gPGFwcGxldD4gZWxlbWVudCBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0LCBidXQgZG9lcyBub3QgcHJvdmlkZSBpbm5lciBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMS4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNvZGVcIikgJiYgYWx0ID09IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvZGVcIikudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FwcGxpY2F0aW9uX1JvbGVfVGV4dFwiOiB7XG4gICAgICAgICAgICAwOiBgSEFBQ19BcHBsaWNhdGlvbl9Sb2xlX1RleHQuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIDA6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIk5vbi1kZWNvcmF0aXZlIHN0YXRpYyB0ZXh0IGFuZCBpbWFnZSBjb250ZW50IHdpdGhpbiBhbiBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIG11c3QgYmUgYWNjZXNzaWJsZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBub24tZGVjb3JhdGl2ZSBzdGF0aWMgdGV4dCBhbmQgaW1hZ2UgY29udGVudCB3aXRoaW4gYW4gZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBhcmUgYWNjZXNzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIxLjEuMVwiLCBcIjIuMS4xXCJdLCAvL21hdGNoIGxpc3RpbmcgaW4gaGVscFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcnVsZUNvbnRleHQuY2hpbGROb2RlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZVZpc2libGUoY2hpbGRyZW5baV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhjaGlsZHJlbltpXSwgXCJkb2N1bWVudFwiKSB8fCBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwiYXJ0aWNsZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gY2hpbGRyZW5baV0ubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFyZWFfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmVhX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTphcmVhXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQXJlYV9IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyZWFfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmVhX2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJlYV9hbHRfZXhpc3RzLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxhcmVhPiBlbGVtZW50cyBpbiBhbiBpbWFnZSBtYXAgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCI8YXJlYT4gZWxlbWVudCBpbiBhbiBpbWFnZSBtYXAgaGFzIG5vIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMS4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbn1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb2x1bW5oZWFkZXIsIGFyaWE6aGVhZGluZywgYXJpYTpyb3doZWFkZXIsIGFyaWE6Z3JhcGhpY3MtZG9jdW1lbnQsYXJpYTpncmFwaGljcy1zeW1ib2wsIGFyaWE6aW1nLGFyaWE6aW1hZ2UsIGRvYy1iYWNrbGluaywgZG9jLWJpYmxpb2VudHJ5LCBkb2MtYmlibGlvcmVmLCBkb2MtZ2xvc3NyZWYsIGRvYy1ub3RlcmVmLCBkb2MtcGFnZWJyZWFrLCBkb2MtZXhhbXBsZVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lXCI6IFwiYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZV9pbWFnZVwiOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJBbiBhY2Nlc3NpYmxlIG5hbWUgaXMgcHJvdmlkZWQgZm9yIHRoZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lXCI6IFwiRWxlbWVudCA8ezB9PiB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaGFzIG5vIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZV9pbWFnZVwiOiBcIkVsZW1lbnQgPHswfT4gd2l0aCBcXFwiezF9XFxcIiByb2xlIGhhcyBubyBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyB3aXRoIGNlcnRhaW4gcm9sZXMgc2hvdWxkIGhhdmUgYWNjZXNzaWJsZSBuYW1lc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIl1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVfaW1hZ2VcIl1cbiAgICB9XSxcbiAgICBhY3Q6IFt7XCIyM2EyYThcIjogeyBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCI6IFwiZmFpbFwifX1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgLy8gc3ZnIGVsZW1lbnQgaXMgaGFuZGxlZCBpbiBzdmdfZ3JhcGhpY3NfbGFiYmVsbGVkIHJ1bGUgYW5kIGltYWdlIHJ1bGVzXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3N2ZycgfHwgbm9kZU5hbWUgPT09ICdpbWcnKSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvLyB3aGVuIHRhYmxlIGVsZW1lbnQgd2l0aCBhIGNhcHRpb24gYXMgZmlyc3QgY2hpbGRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAndGFibGUnIFxuICAgICAgICAgICAgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2NhcHRpb24nXG4gICAgICAgICAgICAmJiBydWxlQ29udGV4dC5maXJzdEVsZW1lbnRDaGlsZC50ZXh0Q29udGVudCAmJiBydWxlQ29udGV4dC5maXJzdEVsZW1lbnRDaGlsZC50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgY29uc3QgaW52YWxpZFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZFJvbGVzICYmIGludmFsaWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZFJvbGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkUm9sZXMgJiYgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldERlcHJlY2F0ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlidXRlcyAmJiBkZXByZWNhdGVkQXR0cmlidXRlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcm9sZSB8fCAhQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdIHx8ICFBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZVJlcXVpcmVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIW5hbWVfcGFpciB8fCAhbmFtZV9wYWlyLm5hbWUgfHwgbmFtZV9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHJvbGUgPT09ICdpbWcnIHx8IHJvbGUgPT09ICdpbWFnZScpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVfaW1hZ2VcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHJvbGVdKTsgXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcm9sZV0pO1xuICAgICAgICB9ICAgIFxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtYWN0aXZlZGVzY2VuZGFudF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0ludmFsaWRUYWJpbmRleEZvckFjdGl2ZWRlc2NlbmRhbnRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHswfT4gZWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBzZXQgdG8gXFxcInsxfVxcXCIgaXMgbm90IHRhYmJhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBzaG91bGQgYmUgdGFiYmFibGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBSdWxlIG5vdCBzdXBwb3J0ZWQgb24gbW9iaWxlXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKS5zdWJzdHJpbmcoMCwgMykgPT0gXCJtYmxcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIGJ5IGEgZGlzYWJsZWQgSFRNTDUgYXR0cmlidXRlIG9yIGFyaWEtZGlzYWJsZWQ6XG4gICAgICAgIC8vICAxLiBJbiB0aGUgY2FzZSB0aGF0IHRoaXMgZWxlbWVudCBoYXMgYSBkaXNhYmxlZCBhdHRyaWJ1dGUgYW5kIHRoZSBlbGVtZW50IHN1cHBvcnRzIGl0LCB3ZSBtYXJrIHRoaXMgcnVsZSBhcyBwYXNzZWQuXG4gICAgICAgIC8vICAyLiBJbiB0aGUgY2FzZSB0aGF0IHRoaXMgZWxlbWVudCBoYXMgYW4gYXJpYS1kaXNhYmxlZCBhdHRyaWJ1dGUgdGhlbiwgd2UgbWFyayB0aGlzIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAvLyBGb3IgYm90aCBvZiB0aGUgY2FzZXMgYWJvdmUgd2UgZG8gbm90IG5lZWQgdG8gcGVyZm9ybSBhbnkgZnVydGhlciBjaGVja3MsIGFzIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIGluIHNvbWUgZm9ybSBvciBhbm90aGVyLlxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGF0dHJpYnV0ZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyBibGFua1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gSWYgdGhlIHRhYmluZGV4IGF0dHJpYnV0ZSBpcyBwcm92aWRlZCB0aGVuIHZlcmlmeSB0aGF0IGl0IGlzIDAgb3IgLTFcbiAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgY2hpbGRyZW4gaXMgdGFiYmFibGUuIGluIHRoaXMgY2FzZSwgdGhlIHRhYiB3aWxsIHN0b3Agb24gdGhlIGZpcnN0IHRhYmJhYmxlIGVsZW1lbnRcbiAgICAgICAgaWYgKCFwYXNzZWQpIFxuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5nZXRUYWJiYWJsZUNoaWxkcmVuKHJ1bGVDb250ZXh0KSA+IDA7XG5cbiAgICAgICAgLy8gQnVpbGQgYXJyYXkgZm9yIG5vZGUgdG9rZW5cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjEucHVzaChub2RlTmFtZSk7XG5cbiAgICAgICAgLy8gQnVpbGQgYXJyYXkgZm9yIGlkIHJlZmVyZW5jZWQgYnkgYXJpYS1hY3RpdmVkZXNjZW5kYW50XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2gocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpLnNwbGl0KFwiIFwiKS5qb2luKFwiLCBcIikpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLWFjdGl2ZWRlc2NlbmRhbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FjdGl2ZURlc2NlbmRhbnRDaGVja1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgICAgICAvLyBcIkZhaWxfNFwiOiBcIkZhaWxfNFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfNFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIHByb3BlcnR5IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSByZWZlcmVuY2VzIGEgaGlkZGVuIG5vZGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRWxlbWVudCBpcyBub3QgYSBjb21ib2JveCwgYW5kIHRoZSByZWZlcmVuY2VkIGFjdGl2ZS1kZXNjZW5kYW50IGVsZW1lbnQgaXMgbm90IGEgdmFsaWQgZGVzY2VuZGFudFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzRcIjogXCJFbGVtZW50IGlzIGEgY29tYm9ib3gsIGFuZCB0aGUgcmVmZXJlbmNlZCBhY3RpdmUtZGVzY2VuZGFudCBlbGVtZW50IGlzIG5vdCBjb250cm9sbGVkIGJ5IHRoaXMgY29tcG9uZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIHByb3BlcnR5IG11c3QgcmVmZXJlbmNlIHRoZSAnaWQnIG9mIGEgbm9uLWVtcHR5LCBub24taGlkZGVuIGFjdGl2ZSBjaGlsZCBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gY29tYm9ib3ggYWN0aXZlIGRlc2NlbmRhbnRzIGhhbmRsZWQgYnkgJ2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50J1xuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZXNjZW5kYW50X2lkID0gQXJpYVV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgIC8vIFBPRjE6IFRoZSBhdHRyaWJ1dGUgaXMgZW1wdHlcbiAgICAgICAgaWYgKCFkZXNjZW5kYW50X2lkIHx8IGRlc2NlbmRhbnRfaWQudHJpbSgpID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVzY2VuZGFudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBkZXNjZW5kYW50X2lkLnRyaW0oKSk7XG4gICAgICAgIGlmICghZGVzY2VuZGFudCB8fCBET01VdGlsLnNhbWVOb2RlKGRlc2NlbmRhbnRfaWQsIHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgLy8gVGhlIHJlZmVyZW5jZWQgZWxlbWVudCBkb2Vzbid0IGV4aXN0LiBXZSBsZXQgMTA3NyB0byB0cmlnZ2VyIHRoZSBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgLy8gUE9GMjogYXJpYS1hY3RpdmVkZXNjZW5kYW50IHJlZmVyZW5jZXMgYSBoaWRkZW4gbm9kZVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMS4gVGhlIHZhbHVlIG9mIGFyaWEtYWN0aXZlZGVzY2VuZGFudCByZWZlcnMgdG8gYW4gZWxlbWVudCB0aGF0IGlzIGVpdGhlciBhIGRlc2NlbmRhbnQgb2YgXG4gICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggRE9NIGZvY3VzXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvZklkID0gMjtcblxuICAgICAgICAvLyBvciBpcyBhIGxvZ2ljYWwgZGVzY2VuZGFudCBhcyBpbmRpY2F0ZWQgYnkgdGhlIGFyaWEtb3ducyBhdHRyaWJ1dGUuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgIGxldCBvd25lZF9pZHMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnRyaW0oKSkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvd25lZF9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb3duZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIG93bmVkX2lkc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKG93bmVkX2VsZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShvd25lZF9lbGUsIHJ1bGVDb250ZXh0KSAmJiBvd25lZF9lbGUuY29udGFpbnMoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIFRoZSBlbGVtZW50IHdpdGggRE9NIGZvY3VzIGlzIGEgdGV4dGJveCB3aXRoIGFyaWEtY29udHJvbHMgcmVmZXJyaW5nIHRvIGFuIGVsZW1lbnQgdGhhdCBcbiAgICAgICAgLy8gIHN1cHBvcnRzIGFyaWEtYWN0aXZlZGVzY2VuZGFudCwgYW5kIHRoZSB2YWx1ZSBvZiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgc3BlY2lmaWVkIGZvciB0aGUgXG4gICAgICAgIC8vICB0ZXh0Ym94IHJlZmVycyB0byBlaXRoZXIgYSBkZXNjZW5kYW50IG9mIHRoZSBlbGVtZW50IGNvbnRyb2xsZWQgYnkgdGhlIHRleHRib3ggb3IgaXMgYSBsb2dpY2FsIFxuICAgICAgICAvLyAgZGVzY2VuZGFudCBvZiB0aGF0IGNvbnRyb2xsZWQgZWxlbWVudCBhcyBpbmRpY2F0ZWQgYnkgdGhlIGFyaWEtb3ducyBhdHRyaWJ1dGUuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDM7XG4gICAgICAgICAgICBsZXQgY29udHJvbGxlZF9pZHMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbGxlZF9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udHJvbGxlZF9lbGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgY29udHJvbGxlZF9pZHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVkX2VsZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShjb250cm9sbGVkX2VsZSwgcnVsZUNvbnRleHQpICYmIGNvbnRyb2xsZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZWRfZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duc19pZHMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udHJvbGxlZF9lbGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnRyaW0oKSkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG93bnNfaWRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIG93bnNfaWRzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZWRfZWxlLCBydWxlQ29udGV4dCkgJiYgb3duZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMzogSSdtIG5vdCBhIGNvbWJvYm94LCBhbmQgdGhlIHJlZmVyZW5jZWQgYWN0aXZlLWRlc2NlbmRhbnQgaXMgbm90IGEgZGVzY2VuZGFudCBhbmQgbm90IG93bmVkIGJ5IHRoZSBlbGVtZW50IFxuICAgICAgICAvLyB0aGF0IHJlZmVyZW5jZWQgaXQuXG4gICAgICAgIGlmIChwb2ZJZCA9PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUFwcGxpY2F0aW9uTGFuZG1hcmtzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwiYXBwbGljYXRpb25cIik7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXBwbGljYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0FwcGxpY2F0aW9uTGFuZG1hcmtMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9ub19sYWJlbFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2xhYmVsXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBoYXMgYSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2xhYmVsXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2xhYmVsXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXJ0aWNsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVBcnRpY2xlUm9sZXNfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImFydGljbGVcXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImFydGljbGVcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJhcnRpY2xlXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJhcnRpY2xlXCIpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9WYWxpZFByb3BlcnR5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyaWFfYXR0cmlidXRlX2FsbG93ZWQuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIGF0dHJpYnV0ZXMgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQncyByb2xlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBhdHRyaWJ1dGUocykgJ3swfScgcmVmZXJlbmNlZCBieSB0aGUgZWxlbWVudCA8ezF9PiBpcyBub3QgYSB2YWxpZCBBUklBIHN0YXRlIG9yIHByb3BlcnR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNWY5OWE3XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgXG4gICAgICAgIC8vIFRoaXMgZ2V0cyBhbGwgZWxlbWVudHMgd2l0aCBhdHRyaWJ1dGVzIHNvIHdlIHN0aWxsIGhhdmUgc29tZVxuICAgICAgICAvLyBPdXQgb2YgU2NvcGUgc2luY2Ugbm90IGFsbCBhdHRyaWJ1dGVzIGFyZSBhcmlhIFxuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgbGV0IHByb3BlcnR5RGF0YVR5cGVzID0gQVJJQURlZmluaXRpb25zLnByb3BlcnR5RGF0YVR5cGVzO1xuICAgICAgICAgICAgbGV0IGZhaWxlZFByb3BlcnRpZXMgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IHRlc3RlZFByb3BlcnRpZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGNvbnRleHRBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgLy8gTm93IHdlIGp1c3QgaGF2ZSBhcmlhIGF0dHJpYnV0ZXMgd2hpY2ggY2FuXG4gICAgICAgICAgICAgICAgICAgIC8vIHBhc3Mgb3IgZmFpbCBiYXNlZCBvbiB3aGV0aGVyIHRoZXJlIHByb3BlcnR5IGlzIHZhbGlkXG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVHlwZXMgPSBwcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YVR5cGVzKSB7IC8vIGlmIHByb3BlcnR5IGlzIG5vdCBpbiB2YWxpZCBwcm9wZXJ0eSBsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZmFpbGVkUHJvcGVydGllcyBjb21tYSBzZXAgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxlZFByb3BlcnRpZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRQcm9wZXJ0aWVzID0gYXR0ck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZFByb3BlcnRpZXMgPSBmYWlsZWRQcm9wZXJ0aWVzICsgXCIsIFwiICsgYXR0ck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGVzdGVkUHJvcGVydGllcyA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZhaWxlZFByb3BlcnRpZXMubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2ZhaWxlZFByb3BlcnRpZXMsIHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSkNIIC0gcGFzc2luZyBpcyBiYXNlZCBvbiBhbGwgYXR0cmlidXRlcyBub3QganVzdCBhcmlhIGF0dHJpYnV0ZXNcbiAgICAgICAgLy8gICAgICAgbGVhZGluZyB0byBPVkVSIENPVU5USU5HIHNvIG1vdmVkIHBhc3MgdXBcbiAgICAgICAgLy9yZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgfVxufVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3Q6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3RcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtcmVxdWlyZWRdLCBkb206KlthcmlhLWF1dG9jb21wbGV0ZV0sIGRvbToqW2FyaWEtcmVhZG9ubHldLCBkb206KlthcmlhLWRpc2FibGVkXSwgZG9tOipbYXJpYS1wbGFjZWhvbGRlcl1cIiBcbiAgICAgICAgICAgICsgXCIsIGRvbToqW2FyaWEtY2hlY2tlZF0sIGRvbToqW2FyaWEtaGlkZGVuXSwgZG9tOipbYXJpYS12YWx1ZW1heF0sIGRvbToqW2FyaWEtdmFsdWVtaW5dLCBkb206KlthcmlhLWNvbHNwYW5dXCJcbiAgICAgICAgICAgICsgXCIsIGRvbToqW2FyaWEtcm93c3Bhbl1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2NvbmZsaWN0XCI6IFwiYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBpcyBub3QgY29uZmxpY3Qgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBIVE1MIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2NvbmZsaWN0XCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIGlzIGluIGNvbmZsaWN0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBBUklBIGF0dHJpYnV0ZSBtdXN0IG5vdCBjb25mbGljdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy8gZGVwZW5kZW5jeSBjaGVjazogaWYgdGhlIEFSSUEgYXR0cmlidXRlIGlzIGNvbXBsZXRlbHkgaW52YWxpZCwgc2tpcCB0aGlzIGNoZWNrXG4gICAgICAgIGxldCBpbnZhbGlkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldEludmFsaWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChpbnZhbGlkQXR0cmlidXRlcyAmJiBpbnZhbGlkQXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGxldCBhcmlhQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWFyaWFBdHRyaWJ1dGVzIHx8IGFyaWFBdHRyaWJ1dGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGNvbmZsaWN0QXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25mbGljdEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9jb25mbGljdFwiLCBbY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydhcmlhQXR0ciddLCBjb25mbGljdEF0dHJpYnV0ZXNbaV1bJ2h0bWxBdHRyJ11dKSk7XG4gICAgICAgICAgICBpZiAoYXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydhcmlhQXR0ciddKSlcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoW2NvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXV0sIGFyaWFBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuXG4gICAgICAgIHJldHVybiBudWxsOyAgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfcm9sZVwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JvbGVfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiVGhlIEFSSUEgcm9sZXMgYW5kIGF0dHJpYnV0ZSBhcmUgdXNlZCBwZXIgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfcm9sZVwiOiBcIlRoZSBBUklBIHJvbGUgXFxcInswfVxcXCIgaXMgZGVwcmVjYXRlZCBpbiB0aGUgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcImZhaWxfYXJpYV9hdHRyXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlcyBcXFwiezB9XFxcIiBhcmUgZGVwcmVjYXRlZCBpbiB0aGUgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcImZhaWxfcm9sZV9hdHRyXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlcyBcXFwiezB9XFxcIiBhcmUgZGVwcmVjYXRlZCBmb3IgdGhlIHJvbGUgXFxcInsxfVxcXCIgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk5vIGRlcHJlY2F0ZWQgQVJJQSByb2xlIG9yIGF0dHJpYnV0ZSBzaG91bGQgYmUgdXNlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkUm9sZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYVJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRSb2xlcyAmJiBkZXByZWNhdGVkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXByZWNhdGVkUm9sZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoJ2ZhaWxfYXJpYV9yb2xlJywgW2RlcHJlY2F0ZWRSb2xlc1tpXV0pKTsgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXByZWNhdGVkQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIFwicm9sZVwiOlwiYW55XCIsIFwiYXR0cmlidXRlXCI6YXJpYUF0dHJzW2ldfVxuICAgICAgICAgICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5yb2xlID09PSAnYW55JylcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoJ2ZhaWxfYXJpYV9hdHRyJywgW2RlcHJlY2F0ZWRBdHRyaWJ1dGVzW2ldLmF0dHJpYnV0ZV0pKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX3JvbGVfYXR0cicsIFtkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5hdHRyaWJ1dGUsIGRlcHJlY2F0ZWRBdHRyaWJ1dGVzW2ldLnJvbGVdKSk7XG4gICAgICAgICAgICB9ICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfRW1wdHlQcm9wZXJ0eVZhbHVlXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIjogXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfZW1wdHlfYXR0cmlidXRlXCI6IFwiVGhlIGVsZW1lbnQgYXR0cmlidXRlKHMpOiAnezB9JyB2YWx1ZSBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIldoZW4gc3BlY2lmeWluZyBhIHJlcXVpcmVkIEFSSUEgYXR0cmlidXRlLCB0aGUgdmFsdWUgbXVzdCBub3QgYmUgZW1wdHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtcIjZhNzI4MVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IENvbW1vblV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBsZXQgdGVzdGVkUHJvcGVydGllcyA9IDA7XG5cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXJvbGUpIHJldHVybjtcbiAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFyaWFVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZSwgcnVsZUNvbnRleHQpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCByZXF1aXJlZFJvbGVQcm9wcyA9IEFyaWFVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJlcXVpcmVkUm9sZVByb3BzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9IHJlcXVpcmVkUm9sZVByb3BzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShyZXF1aXJlZFJvbGVQcm9wc1tpXSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlLmxlbmd0aCA9PSAwKSBhdHRyTmFtZUFyci5wdXNoKHJlcXVpcmVkUm9sZVByb3BzW2ldKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS1sYWJlbGxlZGJ5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChyb2xlID09IFwicmFkaW9ncm91cFwiKSAmJiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkgYXR0ck5hbWVBcnIucHVzaChcImFyaWEtbGFiZWxcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS12YWx1ZW5vd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocm9sZSA9PSBcInByb2dyZXNzYmFyXCIpICYmIChoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS12YWx1ZXRleHRcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtdmFsdWV0ZXh0XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDApIGF0dHJOYW1lQXJyLnB1c2goXCJhcmlhLXZhbHVldGV4dFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVdKSB7XG4gICAgICAgICAgICBsZXQgdGFnUHJvcGVydHkgPSBBcmlhVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGxldCBwZXJtaXR0ZWRSb2xlcyA9IFtdO1xuICAgICAgICAgICAgcGVybWl0dGVkUm9sZXMucHVzaChyb2xlKTtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcGVybWl0dGVkUm9sZXMsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBhbGxvd2VkQXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBhbGxvd2VkQXR0cmlidXRlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlID09IFwiYXJpYS1jaGVja2VkXCIgfHwgYXR0cmlidXRlID09IFwiYXJpYS1zZWxlY3RlZFwiIHx8XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9PSBcImFyaWEtZXhwYW5kZWRcIiB8fCBhdHRyaWJ1dGUgPT0gXCJhcmlhLW9yaWVudGF0aW9uXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlID09IFwiYXJpYS1sZXZlbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWUgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCAmJiAhYXR0ck5hbWVBcnIuaW5jbHVkZXMoYXR0cmlidXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRNc2cgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwO1xuICAgICAgICByZXRNc2cucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcmV0TXNnKTtcbiAgICAgICAgaWYgKHRlc3RlZFByb3BlcnRpZXMgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIiwgcmV0TXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLXJlcXVpcmVkXSwgZG9tOipbYXJpYS1hdXRvY29tcGxldGVdLCBkb206KlthcmlhLXJlYWRvbmx5XSwgZG9tOipbYXJpYS1kaXNhYmxlZF0sIGRvbToqW2FyaWEtcGxhY2Vob2xkZXJdXCIgXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLWNoZWNrZWRdLCBkb206KlthcmlhLWhpZGRlbl0sIGRvbToqW2FyaWEtdmFsdWVtYXhdLCBkb206KlthcmlhLXZhbHVlbWluXSwgZG9tOipbYXJpYS1jb2xzcGFuXVwiXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLXJvd3NwYW5dXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlIGlzIG5vdCByZWR1bmRhbnQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGUgXFxcInswfVxcXCIgaXMgcmVkdW5kYW50IHdpdGggdGhlIEhUTUwgYXR0cmlidXRlIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gQVJJQSBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSByZWR1bmRhbnQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIHRoZSBBUklBIGF0dHJpYnV0ZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgICAgICBsZXQgaW52YWxpZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZEF0dHJpYnV0ZXMgJiYgaW52YWxpZEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlmIGNvbmZsaWN0IGFscmVhZHkgcmVwb3J0ZWQsIGlnbm9yZSByZXBvcnRpbmcgb3ZlcmxhcFxuICAgICAgICBsZXQgY29uZmxpY3RBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0Q29uZmxpY3RBcmlhQW5kSHRtbEF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY29uZmxpY3RBdHRyaWJ1dGVzICYmIGNvbmZsaWN0QXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgYXJpYUF0dHJzID0gW107XG4gICAgICAgIGxldCBodG1sQXR0cnMgPSBbXTtcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsgXG4gICAgICAgICAgICAgICAgbGV0IGF0dHJWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gJycpIGF0dHJWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykgXG4gICAgICAgICAgICAgICAgICAgIGFyaWFBdHRycy5wdXNoKHtuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZX0pO1xuICAgICAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRycy5wdXNoKHtuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gQXJpYVV0aWwuZ2V0Q29uZmxpY3RPck92ZXJsYXBwaW5nSHRtbEF0dHJpYnV0ZShhcmlhQXR0cnNbaV0sIGh0bWxBdHRycywgJ292ZXJsYXBwaW5nJyk7XG4gICAgICAgICAgICBpZiAoZXhhbWluZWRIdG1sQXRyTmFtZXMgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdQYXNzJykgeyAvL3Bhc3NcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW1bJ3Jlc3VsdCddID09PSAnRmFpbGVkJykgeyAvL2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfcmVkdW5kYW50XCIsIFthcmlhQXR0cnNbaV1bJ25hbWUnXSwgaXRlbVsnYXR0ciddXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pOyAgICBcbiAgICAgICAgfSAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1JlcXVpcmVkUHJvcGVydGllc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9taXNzaW5nXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkLmh0bWxgLFxuICAgICAgICAgICAgXCJwYXNzXCI6IGBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC5odG1sYCxcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nXCI6IGBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgcmVxdWlyZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnQgd2l0aCBhIHJvbGUgbXVzdCBiZSBkZWZpbmVkXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgcmVxdWlyZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnQgd2l0aCB0aGUgcm9sZSBhcmUgZGVmaW5lZFwiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdcIjogXCJFbGVtZW50IHdpdGggJ3swfScgcm9sZSBkb2VzIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBBUklBIGF0dHJpYnV0ZShzKTogJ3sxfSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCI0LjEuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI0ZThhYjZcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgYXR0ck5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgLy9sZXQgaW1wbGljaXRSb2xlID0gQVJJQU1hcHBlci5lbGVtVG9JbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICAvL2xldCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgaGFzQXR0cmlidXRlID0gQ29tbW9uVXRpbC5oYXNBdHRyaWJ1dGU7XG4gICAgICAgIGxldCB0ZXN0ZWRSb2xlcyA9IDA7XG5cbiAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFyb2xlKSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcmVxdWlyZWRSb2xlUHJvcHMgPSBBcmlhVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGUsIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVdICYmIHJlcXVpcmVkUm9sZVByb3BzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgYWxsb3dlZFJvbGVQcm9wcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcm9sZSwgdGFnUHJvcGVydHkpO1xuICAgICAgICAgICAgbGV0IHJvbGVNaXNzaW5nUmVxUHJvcCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHByb3BlcnRpZXNMZW5ndGggPSByZXF1aXJlZFJvbGVQcm9wcy5sZW5ndGg7IGkgPCBwcm9wZXJ0aWVzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFsbG93ZWRSb2xlUHJvcHMuaW5jbHVkZXMocmVxdWlyZWRSb2xlUHJvcHNbaV0pKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgcmVxdWlyZWRSb2xlUHJvcHNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIGFyaWEtbGFiZWxsZWRieSBpc24ndCBwcmVzZW50LCBhbiBhcmlhLWxhYmVsIHdpbGwgbWVldCB0aGUgcmVxdWlyZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtbGFiZWxsZWRieVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbFwiKSkgfHwgKHJvbGUgIT0gXCJyYWRpb2dyb3VwXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU1pc3NpbmdSZXFQcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtdmFsdWVub3dcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtdmFsdWV0ZXh0XCIpKSB8fCAocm9sZSAhPSBcInByb2dyZXNzYmFyXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU1pc3NpbmdSZXFQcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtY29udHJvbHNcIiAmJiByb2xlID09IFwiY29tYm9ib3hcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIGNoZWNrIHNpbmNlIGFyaWEtY29udHJvbHMgaW4gdGhlIHRleHRib3ggb2YgYSBjb21ib2JveCBpcyBhbHJlYWR5IGhhbmRsZWQgaW4gcnVsZSBIQUFDX0NvbWJvYm94X011c3RfaGF2ZV9UZXh0X0lucHV0XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKHJlcXVpcmVkUm9sZVByb3BzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm9sZU1pc3NpbmdSZXFQcm9wID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByb2xlTmFtZUFyci5wdXNoKHJvbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gcm9sZU5hbWVBcnIubGVuZ3RoID09IDAgfHwgYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7IC8vIG9ubHkgYXJpYSBhdHRyaWJ1dGVzIHNvIE5PIE9VVCBPRiBTQ09QRVxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICByZXRUb2tlbi5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX21pc3NpbmdcIiwgcmV0VG9rZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRQcm9wZXJ0eVZhbHVlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIHByb3BlcnR5IHZhbHVlcyBtdXN0IGJlIHZhbGlkXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSB2YWx1ZSBcXFwiezB9XFxcIiBzcGVjaWZpZWQgZm9yIGF0dHJpYnV0ZSAnezF9JyBvbiBlbGVtZW50IDx7Mn0+IGlzIG5vdCB2YWxpZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI2YTcyODFcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdmFsdWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkYXRhVHlwZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcHJvcGVydHlEYXRhVHlwZXMgPSBBUklBRGVmaW5pdGlvbnMucHJvcGVydHlEYXRhVHlwZXM7XG4gICAgICAgIGxldCBjb250ZXh0QXR0cmlidXRlcyA9IHJ1bGVDb250ZXh0LmF0dHJpYnV0ZXM7XG4gICAgICAgIGxldCB0ZXN0ZWRQcm9wZXJ0eVZhbHVlcyA9IDA7XG5cbiAgICAgICAgaWYgKGNvbnRleHRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gY29udGV4dEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlcyA9IHByb3BlcnR5RGF0YVR5cGVzW2F0dHJOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0eVZhbHVlcysrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMudmFsdWVzLmluZGV4T2Yobm9kZVZhbHVlKSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMudmFsdWVzLmluZGV4T2YoJ3VuZGVmaW5lZCcpICE9IC0xICYmIG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RyYW5zbGF0ZSAndW5kZWZpbmVkJyB0byBtZWFuICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJpYS1yZWxldmFudCBpcyByZXByZXNlbnRlZCBhcyBhIHNwYWNlIGRlbGltaXRlZCBsaXN0IG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkaXRpb25zLCByZW1vdmFscywgdGV4dDsgb3IgYSBzaW5nbGUgY2F0Y2gtYWxsIHZhbHVlIGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcy50eXBlID09PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5zXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWVzID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgYWxsIGlzIHNwZWNpZmllZCwgaXQgY2Fubm90IGhhdmUgYW55IG90aGVyIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0clZhbHVlcy5sZW5ndGggPiAxICYmIGF0dHJWYWx1ZXMuaW5jbHVkZXMoXCJhbGxcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZS5zcGxpdChcIiBcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc2ggPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJWYWx1ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGluZGl2aWR1YWwgdmFsdWUgaXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWVzW2pdICE9IFwiXCIgJiYgIWRhdGFUeXBlcy52YWx1ZXMuaW5jbHVkZXMoYXR0clZhbHVlc1tqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzaC5oYXNPd25Qcm9wZXJ0eShhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoW2F0dHJOYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKGF0dHJWYWx1ZXNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGVBcnIucHVzaChkYXRhVHlwZXMudmFsdWVzLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGVBcnIucHVzaChkYXRhVHlwZXMudmFsdWVzLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiBkYXRhVHlwZXMudHlwZSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlWYWwgPSBwYXJzZUludChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGlWYWwpIHx8IChcIlwiICsgaVZhbCAhPT0gbm9kZVZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2gobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmVmFsID0gcGFyc2VGbG9hdChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGZWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiAoZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG1wViA9IG5vZGVWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXBWICE9PSBcInRydWVcIiAmJiB0bXBWICE9PSBcImZhbHNlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlICYmIChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydHlWYWx1ZXMtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0TXNnID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhdHRyTmFtZUFyci5sZW5ndGggPT0gMDtcbiAgICAgICAgcmV0TXNnLnB1c2godmFsdWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgcmV0TXNnLnB1c2goYXR0ck5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgcmV0TXNnLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIC8vIHJldE1zZy5wdXNoIChkYXRhVHlwZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcmV0TXNnKTtcbiAgICAgICAgaWYgKHRlc3RlZFByb3BlcnR5VmFsdWVzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCByZXRNc2cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YmFubmVyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUJhbm5lckxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImJhbm5lclwiLCB0cnVlKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYmFubmVyX3NpbmdsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Jhbm5lcl9zaW5nbGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206aGVhZGVyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9PbmVCYW5uZXJJblNpYmxpbmdTZXRfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYmFubmVyX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImJhbm5lclxcXCIgcm9sZSBmb3VuZCBvbiB0aGUgcGFnZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgcGFnZSwgZG9jdW1lbnQsIG9yIGFwcGxpY2F0aW9uIHNob3VsZCBvbmx5IGhhdmUgb25lIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICghQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImJhbm5lclwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIEFyaWFVdGlsLmdldFNpYmxpbmdXaXRoUm9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICBcImJhbm5lclwiLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKSA9PT0gbnVsbDtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2NoaWxkX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY2hpbGRfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX01pc3NpbmdGb2N1c2FibGVDaGlsZFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ19jaGlsZFwiOiBcImZhaWxfbWlzc2luZ19jaGlsZFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfY2hpbGRfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJhcmlhX2NoaWxkX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NoaWxkX3RhYmJhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ19jaGlsZFwiOiBcIk5vbmUgb2YgdGhlIGRlc2NlbmRlbnQgZWxlbWVudHMgd2l0aCBcXFwiezF9XFxcIiByb2xlIGlzIHRhYmJhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVUkgY29tcG9uZW50IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdGFiYmFibGUgZGVzY2VuZGFudCBmb3Iga2V5Ym9hcmQgYWNjZXNzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCByZXF1aXJlcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmIChBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSB8fCBBcmlhVXRpbC5zaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIEFuIEFSSUEgbGlzdCBpcyBub3QgaW50ZXJhY3RpdmVcbiAgICAgICAgaWYgKEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHsgXCJsaXN0XCI6IHRydWUsIFwicm93XCI6IHRydWUsIFwicm93Z3JvdXBcIjogdHJ1ZSwgXCJ0YWJsZVwiOiB0cnVlLCBcImdyaWRcIjogdHJ1ZSB9KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3QgYSB2YWxpZCBtZXNzYWdlIGZvciBtb2JpbGUgYmVjYXVzZSBhbGwgZWxlbWVudHMgYXJlIGZvY3VzYWJsZSBpbiBpT1Mgd2hlbiBWb2ljZU92ZXIgaXMgZW5hYmxlZC5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNsYXNzXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNsYXNzXCIpLnN1YnN0cmluZygwLCAzKSA9PSBcIm1ibFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2RhdGFsaXN0JylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgZWxlbWVudCdzIG5hdmlnYXRpb24gaXMgY29udHJvbGxlZCBieSBhbm90aGVyIGVsZW1lbnQsIHN1Y2ggYXMgY29tYm9ib3hcbiAgICAgICAgaWYgKEFyaWFVdGlsLmlzTmF2aWdhdGlvbk93bmVkT3JDb250cm9sbGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgXG5cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IFwiXCI7XG4gICAgICAgIGxldCBpblNjb3BlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5jb250YWluZXJzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICBsZXQgZGlzYWJsZWQgPSBoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWRpc2FibGVkJykgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpIDogJyc7XG4gICAgICAgICAgICBpZiAoZGlzYWJsZWQgIT0gJ3RydWUnICYmICFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnKSAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIGxldCByZXFDaGlsZHJlbiA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yZXFDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICBpZiAocmVxQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgaW5TY29wZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeHAgPSBcImRlc2NlbmRhbnQ6OipbXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhwICs9IFwiQHJvbGU9J1wiICsgcmVxQ2hpbGRyZW5baV0gKyBcIicgb3IgXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeHAgPSB4cC5zdWJzdHJpbmcoMCwgeHAubGVuZ3RoIC0gNCkgKyAnXSc7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdCA9IGRvYy5ldmFsdWF0ZSh4cCwgcnVsZUNvbnRleHQsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcjogRWxlbWVudCA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIgJiYgIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgMS4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmlzVGFiYmFibGUocik7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVpcmVkIGNoaWxkIGlzIG5vdCBmb2N1c2FibGUgdmlhIHRhYmluZGV4LiBTZWUgaWYgdGhlcmUgaXMgYSBncmFuZGNoaWxkIHRoYXQgaXMgZm9jdXNhYmxlIGJ5IGRlZmF1bHQgb3IgYnkgdGFiaW5kZXguXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cDIgPSBcImRlc2NlbmRhbnQ6OipcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgciwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIgPSByLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGUgYXJyYXlzL3N0cmluZ3MgYXJlIGVtcHR5LCB0aGF0IG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gdmlvbGF0aW9uIHNvIHdlIGNhbiByZXNldCBpdCBiYWNrIHRvIHBhc3NlZCwgdGhlIHJlYXNvbiBmb3IgdGhpc1xuICAgICAgICAvLyBpcyB0aGF0IHdlIGFyZSBzZXR0aW5nIHBhc3NlZD1mYWxzZSB3aGlsZSB3ZSBwZXJmb3JtIGEgbG9vcCB3aGljaCBjYXVzZXMgdmlvbGF0aW9uIHRvIHRyaWdnZXIgZXZlbiBpZiB0aGVyZSBpcyBubyBpc3N1ZXMuIEluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXBkYXRpbmcgdGhlIHdob2xlIHJ1bGUgdG8gc3dpdGNoIGZyb20gdXNpbmcgcGFzc2VkIGluIHRoYXQgd2F5IHNpbXBseSBkbyB0aGUgY2hlY2sgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgaWYgKG5vZGVOYW1lLmxlbmd0aCA+IDAgJiYgcm9sZU5hbWVBcnIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0VG9rZW4xLnB1c2gobm9kZU5hbWUpO1xuICAgICAgICAgICAgcmV0VG9rZW4yLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgaWYgKCFpblNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX21pc3NpbmdfY2hpbGRcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jaGlsZF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NoaWxkX3ZhbGlkXCIsXG4gICAgLy9jb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgLy9kZXBlbmRlbmNpZXM6IFtcIlJwdF9BcmlhX1ZhbGlkUm9sZVwiXSxcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfdmFsaWRcIiwgXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vX2NoaWxkXCI6IFwiYXJpYV9jaGlsZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9jaGlsZFwiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhbiBBUklBIHJvbGUgbXVzdCBvd24gYSByZXF1aXJlZCBjaGlsZFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiQW4gZWxlbWVudCB3aXRoIGFuIEFSSUEgcm9sZSBvd25zIGEgcmVxdWlyZWQgY2hpbGRcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub19jaGlsZFwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBkb2VzIG5vdCBvd24gYW55IGNoaWxkIGVsZW1lbnQgd2l0aCBhbnkgb2YgdGhlIGZvbGxvd2luZyByb2xlKHMpOiBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfY2hpbGRcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgb3ducyB0aGUgY2hpbGQgZWxlbWVudCB3aXRoIHRoZSByb2xlIFxcXCJ7MX1cXFwiIHRoYXQgaXMgbm90IG9uZSBvZiB0aGUgYWxsb3dlZCByb2xlKHMpOiBcXFwiezJ9XFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBWZXJpZnkgbWFwcGluZ1xuICAgIGFjdDogW1wiYmM0YTc1XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJvbGVzID0gIEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGV4cGxpY2l0IG9yIGltcGxpY2l0IHJvbGUsIHNob3VsZG4ndCBoYXBwZW5cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgbm9uZSBvciBwcmVzZW50YXRpb24gcm9sZVxuICAgICAgICBsZXQgcHJlc2VudGF0aW9uUm9sZXMgPSBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdO1xuICAgICAgICBjb25zdCBmb3VuZCA9IHJvbGVzLnNvbWUocj0+IHByZXNlbnRhdGlvblJvbGVzLmluY2x1ZGVzKHIpKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyAgRm9yIGNvbWJvYm94LCB3ZSBoYXZlIGcxMTkzIC4uLiBnMTE5OSB0byBjaGVjayB0aGUgdmFsdWVzIGV0Yy5cbiAgICAgICAgLy8gIFdlIGRvbid0IHdhbnQgdG8gdHJpZ2dlciAxMTUyIGFnYWluLiBTbywgd2UgYnlwYXNzIGl0IGhlcmUuXG4gICAgICAgIGlmIChyb2xlcy5pbmNsdWRlcyhcImNvbWJvYm94XCIpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcmVxdWlyZWRDaGlsZFJvbGVzID0gQXJpYVV0aWwuZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgLy8gYSAnZ3JvdXAnIHJvbGUgaXMgYWxsb3dlZCBidXQgbm90IHJlcXVpcmVkIGZvciBzb21lIGVsZW1lbnRzIHNvIHJlbW92ZSBpdCBpZiBleGlzdHNcbiAgICAgICAgaWYgKHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmNsdWRlcygnZ3JvdXAnKSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gcmVxdWlyZWRDaGlsZFJvbGVzLmluZGV4T2YoJ2dyb3VwJyk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICByZXF1aXJlZENoaWxkUm9sZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLyoqICBcbiAgICAgICAgICogaWdub3JlIGlmIGEgcm9sZSBkb2Vzbid0IHJlcXVpcmUgYSBjaGlsZCB3aXRoIGFueSBzcGVjaWZpYyByb2xlXG4gICAgICAgICAqIHRoZSByZXZlcnNlIG1pZ2h0IGJlIG5vdCB0cnVlIC0gcGFyZW50IHdpbGwgYmUgY2hlY2tlZCBpbiBScHRfQXJpYV9SZXF1aXJlZFBhcmVudF9OYXRpdmVfSG9zdF9TZW1hdGljcyBydWxlXG4gICAgICAgICovXG4gICAgICAgICBpZiAocmVxdWlyZWRDaGlsZFJvbGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgY2hpbGRyZW4gZnJvbSBhY2Nlc3NpYmlsaXR5IHRyZWUsIFxuICAgICAgICAvLyBpbmNsdWRpbmcgb25lcyB3aXRoIGFyaWEtb3ducyAgICBcbiAgICAgICAgbGV0IGRpcmVjdEFUQ2hpbGRyZW4gPSBBcmlhVXRpbC5nZXREaXJlY3RBVENoaWxkcmVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZGlyZWN0QVRDaGlsZHJlbiB8fCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyB0aGUgZWxlbWVudCB3aXRoIGF0IGxlYXN0IG9uZSByZXF1aXJlZCByb2xlIGRvc2VuJ3QgY29udGFpbiBhbnkgYWNjZXNzaWJsZSBjaGlsZFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBXaGVuIGEgd2lkZ2V0IGlzIG1pc3NpbmcgcmVxdWlyZWQgb3duZWQgZWxlbWVudHMgZHVlIHRvIHNjcmlwdCBleGVjdXRpb24gb3IgbG9hZGluZywgXG4gICAgICAgICAgICAgKiBhdXRob3JzIE1VU1QgbWFyayBhIGNvbnRhaW5pbmcgZWxlbWVudCB3aXRoICdhcmlhLWJ1c3knIGVxdWFsIHRvIHRydWUuIFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgbGV0IGJ1c3kgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWJ1c3lcIik7XG4gICAgICAgICAgICAgaWYgKCFidXN5IHx8IGJ1c3kgIT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJlcXVpcmVkQ2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX25vX2NoaWxkXCIsIHJldFRva2VuKTtcbiAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgIC8vIGl0J3MgJ2J1c3knIGxvYWRpbmcsIGlnbm9yZSBpdCBcbiAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHZpb2xhdGVFbGVtUm9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhkaXJlY3RBVENoaWxkcmVuW2pdLCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgICAgICBpZiAoIWNoaWxkUm9sZXMgfHwgY2hpbGRSb2xlcy5sZW5ndGggPT0gMCkgXG4gICAgICAgICAgICAgICAgY2hpbGRSb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZGlyZWN0QVRDaGlsZHJlbltqXSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChjaGlsZFJvbGVzICYmIGNoaWxkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIHdoZW4gbXVsdGlwbGUgcm9sZXMgYXJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBvd25lZCBlbGVtZW50cyBmb3IgYSByb2xlLCBhdCBsZWFzdCBvbmUgaW5zdGFuY2Ugb2Ygb25lIHJlcXVpcmVkIG93bmVkIGVsZW1lbnQgaXMgZXhwZWN0ZWQuIFxuICAgICAgICAgICAgICAgICAqIHRoZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW4gaW5zdGFuY2Ugb2YgZWFjaCBvZiB0aGUgbGlzdGVkIG93bmVkIHJvbGVzLlxuICAgICAgICAgICAgICAgICAqIHRoZXJlZm9yZSwgdGhlIHJlcXVpcmVtZW50IGlzIG1ldCBpZiBpdCBoYXMgYW55IG9uZSBvZiB0aGUgcmVxdWlyZWQgcm9sZXMuXG4gICAgICAgICAgICAgICAgICovICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gY2hpbGRSb2xlcy5zb21lKHI9PiByZXF1aXJlZENoaWxkUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICAgICAgICAgIGlmICghZm91bmQpIFxuICAgICAgICAgICAgICAgICAgICB2aW9sYXRlRWxlbVJvbGVzLnB1c2goY2hpbGRSb2xlcy5qb2luKFwiLCBcIikpOyBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBlbGVtZW50IHNpbmNlIGl0J3Mgbm90IHNlbWFudGljLCBzaG91bGRuJ3QgaGFwcGVuIFxuICAgICAgICAgICAgfSAgICAgXG4gICAgICAgIH0gXG4gICAgICAgIFxuICAgICAgICBpZiAodmlvbGF0ZUVsZW1Sb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB2aW9sYXRlRWxlbVJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2godmlvbGF0ZUVsZW1Sb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyZXF1aXJlZENoaWxkUm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9jaGlsZFwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbXBsZW1lbnRhcnlcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQ29tcGxlbWVudGFyeUxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIik7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV0sIGRvbTphc2lkZVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfQ29tcGxlbWVudGFyeUxhbmRtYXJrTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIHNob3VsZCBoYXZlIGEgdmlzaWJsZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICghQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoXG4gICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCJcbiAgICAgICAgKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9Db21wbGVtZW50YXJ5UmVxdWlyZWRMYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIG11c3QgaGF2ZSBhIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChwYWlyKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFRhYmxlVXRpbCB9IGZyb20gXCIuLi91dGlsL1RhYmxlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb250ZW50X2luX2xhbmRtYXJrOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29udGVudCBpcyBub3Qgd2l0aGluIGEgbGFuZG1hcmsgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFsbCBjb250ZW50IG11c3QgcmVzaWRlIHdpdGhpbiBhbiBlbGVtZW50IHdpdGggYSBsYW5kbWFyayByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBsZXQgcGFyYW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGNvbnRleHQuZG9tLm5vZGUub3duZXJEb2N1bWVudCwgXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmtcIiwgbnVsbCk7XG4gICAgICAgIGlmICghcGFyYW1zKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgbGFuZG1hcmtzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIiwgXCJmb3JtXCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJyZWdpb25cIiwgXCJzZWFyY2hcIl0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcG9zc2libGVPcnBoYW5lZFdpZGdldHM6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtcImJ1dHRvblwiLCBcImNvbWJvYm94XCIsIFwiY2hlY2tib3hcIiwgXCJncmlkXCIsIFwiaGVhZGluZ1wiLCBcImxpbmtcIiwgXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcInByb2dyZXNzYmFyXCIsIFwicmFkaW9cIiwgXCJ0YWJsaXN0XCIsIFwidGV4dGJveFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInRyZWVncmlkXCJcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwb3NzaWJsZU9ycGhhbmVkRWxlbWVudHM6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtcInBcIiwgXCJ0YWJsZVwiLCBcImlucHV0XCIsIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJidXR0b25cIiwgXCJhXCIsIFwib2xcIiwgXCJ1bFwiLCBcImRsXCIsIFwiaDFcIiwgXCJoMlwiLCBcImgzXCIsIFwiaDRcIiwgXCJoNVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJoNlwiLCBcImVtYmVkXCIsIFwib2JqZWN0XCIsIFwiYXJlYVwiXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbm9MYW5kbWFya2VkUm9sZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2Ugcm9sZXMgZG9uJ3QgcmVxdWlyZSBsYW5kbWFya3NcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtcImFsZXJ0XCIsIFwiYWxlcnRkaWFsb2dcIiwgXCJkaWFsb2dcIiwgXCJ0b29sdGlwXCJdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1hcExhbmRtYXJrczoge30sXG4gICAgICAgICAgICAgICAgbWFwUG9zc2libGVPcnBoYW5lZFdpZGdldHM6IHt9LFxuICAgICAgICAgICAgICAgIG1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50czoge30sXG4gICAgICAgICAgICAgICAgbWFwTm9MYW5kbWFya2VkUm9sZXM6IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb252ZXJ0IGFycmF5cyB0byBtYXBzXG4gICAgICAgICAgICBwYXJhbXMubWFwTGFuZG1hcmtzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5sYW5kbWFya3MudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwTGFuZG1hcmtzW3BhcmFtcy5sYW5kbWFya3MudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzID0ge31cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLnBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzW3BhcmFtcy5wb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzID0ge31cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLnBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkRWxlbWVudHNbcGFyYW1zLnBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXJhbXMubWFwTm9MYW5kbWFya2VkUm9sZXMgPSB7fVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubm9MYW5kbWFya2VkUm9sZXMudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwTm9MYW5kbWFya2VkUm9sZXNbcGFyYW1zLm5vTGFuZG1hcmtlZFJvbGVzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShjb250ZXh0LmRvbS5ub2RlLm93bmVyRG9jdW1lbnQsIFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrXCIsIHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8ICAvLyBhdm9pZCBkaWFnbm9zaW5nIGcxMTU3IGZvciBub24tdmlzaWJsZSBub2Rlc1xuICAgICAgICAgICAgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsZW1zV2l0aG91dENvbnRlbnQgPSBbXCJhcmVhXCIsIFwiaW5wdXRcIiwgXCJlbWJlZFwiLCBcImJ1dHRvblwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCJdO1xuICAgICAgICBpZiAoIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSAmJiAvL29ubHkgdHJpZ2dlciB0aGUgcnVsZSBvbiBlbGVtZW50cyB0aGF0IGhhdmUgY29udGVudFxuICAgICAgICAgICAgZWxlbXNXaXRob3V0Q29udGVudC5pbmRleE9mKG5vZGVOYW1lKSA9PT0gLTEpIHsgLy8gYSBmZXcgZWxlbXMgd2lob3V0IGNvbnRlbnQgc2hvdWxkIG5vdCBiZSBza2lwcGVkXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaG9ydCBjaXJjdWl0IGZvciBsYXlvdXQgdGFibGVzXG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcInRhYmxlXCIgJiYgVGFibGVVdGlsLmlzTGF5b3V0VGFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGEgcG9zc2libGUgb3JwaGFuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgaXNQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0ID0gQXJpYVV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzLCB0cnVlKTtcbiAgICAgICAgLy9leGNsdWRlIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwieHl6LmNzc1wiPiBpbiB0aGUgPGhlYWQ+IGFuZCA8Ym9keT4oIzYwOClcbiAgICAgICAgLy9oYXZpbmcgbGluayBpbiB0aGUgaGVhZCBjb3VsZCBjYXVzZSBsb3Qgb2YgdmlvbGFpb25zICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnbGluaycpIHtcbiAgICAgICAgICAgIGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzUG9zc2libGVPcnBoYW5lZEVsZW1lbnQgPSBub2RlTmFtZSBpbiBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzO1xuICAgICAgICBpZiAoaXNQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0IHx8IGlzUG9zc2libGVPcnBoYW5lZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIFNlZSBpZiBhbmNlc3RvciBoYXMgbGFuZG1hcmsgcm9sZXMgb3IgaW1wbGljaXQgbGFuZCBtYXJrIHJvbGVzXG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZXMgPSBjb250ZXh0SGllcmFyY2hpZXNbXCJhcmlhXCJdLm1hcChpbmZvID0+IGluZm8ucm9sZSk7XG4gICAgICAgICAgICBwYXNzZWQgPSBwYXJlbnRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlIGluIHBhcmFtcy5tYXBMYW5kbWFya3MpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgZmFpbCBlbGVtZW50cyB3aGVuIGEgcGFyZW50IG9yIHNpYmxpbmcgaGFzIGZhaWxlZCAtIGNhdXNlcyB0b28gbWFueSBtZXNzYWdlcy5cbiAgICAgICAgICAgICAgICBsZXQgd2Fsa0VsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgd2Fsa0VsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUod2Fsa0VsZW1lbnQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gcnVsZUNvbnRleHQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gd2Fsa0VsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3YWxrRWxlbWVudCA9IHJ1bGVDb250ZXh0LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgd2Fsa0VsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUod2Fsa0VsZW1lbnQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSB3YWxrRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHRyaWdnZXIgcnVsZSBpZiBlbGVtZW50IGlzIGEgc3RhbmQtYWxvbmUgd2lkZ2V0XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRfTm9UcmlnZ2VyXCIsIGZhbHNlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzLCB0cnVlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50X05vVHJpZ2dlclwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbnRlbnRpbmZvXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUNvbnRlbnRpbmZvTGFuZG1hcmtzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwiY29udGVudGluZm9cIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudGluZm9fbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudGluZm9fbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmZvb3RlciwgZG9tOmFkZHJlc3NcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0NvbnRlbnRpbmZvV2l0aE5vTWFpbl9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudGluZm9fbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgaXMgcHJlc2VudCB3aXRob3V0IGFuIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBpcyBvbmx5IHBlcm1pdHRlZCB3aXRoIGFuIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vY29uc2lkZXIgaW1wbGljaXQgcm9sZVxuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb250ZW50aW5mb1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb250ZW50aW5mb19zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206Zm9vdGVyLCBkb206YWRkcmVzc1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVDb250ZW50aW5mb0luU2libGluZ1NldF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgZm91bmQgb24gdGhlIHBhZ2VcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHBhZ2UsIGRvY3VtZW50LCBvciBhcHBsaWNhdGlvbiBzaG91bGQgb25seSBoYXZlIG9uZSBlbGVtZW50IHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vZmluZCBvdXQgaWYgPGZvb3Rlcj4gZWxlbWVudCBoYXMgc2libGluZ3MgYXMgPGZvb3Rlcj4gaGFzIGltcGxpY2l0IGNvbnRlbnRpbmZvIHJvbGVcbiAgICAgICAgaWYgKCFBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiY29udGVudGluZm9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9ICFBcmlhVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgIFwiY29udGVudGluZm9cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZGVzY2VuZGFudF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2NoaWxkX2ltcGxpY2l0X3JvbGVcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJyZWNvbW1lbmRhdGlvbl9ub19pbXBhY3Rfcm9sZVwiOiBcImFyaWFfZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiOiBcImFyaWFfZGVzY2VuZGFudF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQnJvd3NlcnMgaWdub3JlIHRoZSBleHBsaWNpdCBhbmQgaW1wbGljaXQgQVJJQSByb2xlcyBvZiB0aGUgZGVzY2VuZGFudHMgb2YgY2VydGFpbiBlbGVtZW50c1wiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgY29udGFpbnMgdmFsaWQgZGVzY2VuZGFudHNcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2NoaWxkX2ltcGxpY2l0X3JvbGVcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgY29udGFpbnMgZGVzY2VuZGFudHMgd2l0aCBpbXBsaWNpdCByb2xlcyBcXFwiezF9XFxcIiB3aGljaCBhcmUgaWdub3JlZCBieSBicm93c2Vyc1wiLFxuICAgICAgICAgICAgXCJyZWNvbW1lbmRhdGlvbl9ub19pbXBhY3Rfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCIsXG4gICAgICAgICAgICBcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wicGFzc1wiLCBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCIsIFwiZmFpbF9jaGlsZF9leHBsaWNpdF9yb2xlXCJdXG4gICAgfSx7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJyZWNvbW1lbmRhdGlvbl9ub19pbXBhY3Rfcm9sZVwiXVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogVmVyaWZ5IG1hcHBpbmdcbiAgICBhY3Q6IFtcIjMwN241elwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgcmVxdWlyZSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmICghQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJvbGVzID0gIEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGV4cGxpY2l0IG9yIGltcGxpY2l0IHJvbGUsIHNob3VsZG4ndCBoYXBwZW5cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNoaWxkcmVuIGZyb20gYWNjZXNzaWJpbGl0eSB0cmVlLCBcbiAgICAgICAgLy8gaW5jbHVkaW5nIG9uZXMgd2l0aCBhcmlhLW93bnMgICAgXG4gICAgICAgIGxldCBkaXJlY3RBVENoaWxkcmVuID0gQXJpYVV0aWwuZ2V0RGlyZWN0QVRDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkaXJlY3RBVENoaWxkcmVuICYmIGRpcmVjdEFUQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXByZXNlbnRhdGlvbmFsIGNoaWxkcmVuXG4gICAgICAgICAgICBsZXQgZXhwbGljaXRSb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgIGxldCBub0ltcGFjdFJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqPTA7IGogPCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIDxpbWc+IGFuZCA8c3ZnPlxuICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IGRpcmVjdEFUQ2hpbGRyZW5bal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAodGFnID09PSAnaW1nJyB8fCB0YWcgPT09ICdzdmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBnZXQgZXhwbGljaXQgcm9sZSBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGRpcmVjdEFUQ2hpbGRyZW5bal0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdGUgY2FzZSBmb3Igcm9sZT1cImNvZGVcIlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcy5pbmNsdWRlcyhcImNvZGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vSW1wYWN0Um9sZXMucHVzaChjaGlsZFJvbGVzLmZpbHRlcihyb2xlID0+IHJvbGUgPT09IFwiY29kZVwiKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0Um9sZXMucHVzaChjaGlsZFJvbGVzLmZpbHRlcihyb2xlID0+IHJvbGUgIT09IFwiY29kZVwiKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbXBsaWNpdCByb2xlIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICBjaGlsZFJvbGVzID0gIEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShkaXJlY3RBVENoaWxkcmVuW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdGUgY2FzZSBmb3Igcm9sZT1cImNvZGVcIlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcy5pbmNsdWRlcyhcImNvZGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vSW1wYWN0Um9sZXMucHVzaChjaGlsZFJvbGVzLmZpbHRlcihyb2xlID0+IHJvbGUgPT09IFwiY29kZVwiKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZFJvbGVzICYmIGNoaWxkUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZXMucHVzaChjaGlsZFJvbGVzLmZpbHRlcihyb2xlID0+IHJvbGUgIT09IFwiY29kZVwiKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGV4cGxpY2l0Um9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBleHBsaWNpdFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2goZXhwbGljaXRSb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbHVlcy5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9jaGlsZF9leHBsaWNpdF9yb2xlXCIsIHJldFRva2VuKSk7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGltcGxpY2l0Um9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChpbXBsaWNpdFJvbGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsdWVzLnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCIsIHJldFRva2VuKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub0ltcGFjdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9JbXBhY3RSb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKG5vSW1wYWN0Um9sZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25fbm9faW1wYWN0X3JvbGVcIiwgcmV0VG9rZW4pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyAgICAgICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6ZG9jdW1lbnRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlRG9jdW1lbnRSb2xlc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiZG9jdW1lbnRcXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImRvY3VtZW50XFxcIiByb2xlcyBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImRvY3VtZW50XFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJkb2N1bWVudFwiLCB0cnVlKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7IFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25jbGlja10sZG9tOipbb25ibHVyXSwgZG9tOipbb25kYmxjbGlja10sIGRvbToqW29uZm9jdXNdLCBkb206KltvbmtleWRvd25dLGRvbToqW29ua2V5cHJlc3NdLCBkb206KltvbmtleXVwXSwgZG9tOipbb25tb3VzZWRvd25dLCBkb206Kltvbm1vdXNldXBdLCBkb206Kltvbm1vdXNlbW92ZV0sIGRvbToqW29ubW91c2VvdXRdLCBkb206Kltvbm1vdXNlb3Zlcl0sIGRvbToqW29ucmVzaXplXSwgZG9tOipbb25jaGFuZ2VdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9FdmVudEhhbmRsZXJNaXNzaW5nUm9sZV9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgd2l0aCAnezF9JyBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgQVJJQSByb2xlIHNwZWNpZmllZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIHdpdGggZXZlbnQgaGFuZGxlcnMgbXVzdCBoYXZlIGEgdmFsaWQgQVJJQSByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIHRoaXMgZm9yIFNWRyBlbGVtZW50IGZvciBub3cgdW50aWwgYSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUgKGJ5IFJpY2gpXG4gICAgICAgIC8vIHRvIHN1cHBvcnQgU1ZHIGF0IGEgcG9pbnQgd2hlbiB0aGUgU1ZHIGExMXkgc3BlYyBpcyByZWFkeS5cbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwic3ZnXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdGhpcyBydWxlIGlzIHBhc3NlZCBpZiBhIGVsZW1lbnQgaGFzIGF0dHJpYnV0IHJvbGUgXG4gICAgICAgIC8vYWxzbywgcGFzc2VkIG9mIGVsZW1lbnQgaGFzIGFueSBpbXBsaWNpdCByb2xlcy4gXG4gICAgICAgIGlmIChBcmlhVXRpbC5oYXNBbnlSb2xlKHJ1bGVDb250ZXh0LCB0cnVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9wYXNzIGlmIHRoaXMgZWxlbWVudCBpcyByZWNlaXZlZCBmb2N1cyBieSBkZWZhdWx0XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzZm9jdXNhYmxlQnlEZWZhdWx0KHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy92YWxpZGF0ZSBpZiB0aGlzIGVsZW1lbnQgaGFzIGFueSBvZiB0aGUgZ2l2ZW4gZXZlbnQgaGFuZGxlcidzXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGxldCBldmVudEFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICAvLyBGcm9tIFdDQUcyMF9TY3JpcHRfVXNlVzNDRG9tRnVuY3Rpb25zXG4gICAgICAgIC8vbGV0IGV2ZW50cyA9IFtcIm9uYmx1clwiLCBcIm9uZm9jdXNcIiwgXCJvbmNoYW5nZVwiLCBcIm9uY2xpY2tcIiwgXCJvbmNvbnRleHRtZW51XCIsIFwib25kYmxjbGlja1wiLCBcIm9ua2V5ZG93blwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbmtleXByZXNzXCIsIFwib25rZXl1cFwiLCBcIm9ubG9hZFwiLCBcIm9ubW91c2Vkb3duXCIsIFwib25tb3VzZXVwXCIsIFwib25tb3VzZW1vdmVcIiwgXCJvbm1vdXNlb3V0XCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICBcIm9ubW91c2VvdmVyXCIsIFwib25tb3VzZXdoZWVsXCIsIFwib25yZXNldFwiLCBcIm9ucGFzdGVcIiwgXCJvbnJlc2l6ZVwiLCBcIm9uc2Nyb2xsXCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICBcIm9uc2VsZWN0XCIsIFwib25zdWJtaXRcIiwgXCJvbmFjdGl2YXRlXCIsIFwib25kZWFjdGl2YXRlXCIsIFwib25tb3VzZWVudGVyXCIsIFwib25tb3VzZWxlYXZlXCJdO1xuICAgICAgICBsZXQgZXZlbnRzID0gW1wib25ibHVyXCIsIFwib25mb2N1c1wiLCBcIm9uY2hhbmdlXCIsIFwib25jbGlja1wiLCBcIm9uZGJsY2xpY2tcIiwgXCJvbmtleWRvd25cIixcbiAgICAgICAgICAgIFwib25rZXlwcmVzc1wiLCBcIm9ua2V5dXBcIiwgXCJvbm1vdXNlZG93blwiLCBcIm9ubW91c2V1cFwiLCBcIm9ubW91c2Vtb3ZlXCIsIFwib25tb3VzZW91dFwiLFxuICAgICAgICAgICAgXCJvbm1vdXNlb3ZlclwiLCBcIm9ucmVzaXplXCJcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoZXZlbnRzW2ldKSlcbiAgICAgICAgICAgICAgICBldmVudEFyci5wdXNoKGV2ZW50c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChldmVudEFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChmYWxzZSwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlRm9ybUxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiZm9ybVxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiZm9ybVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImZvcm1cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImZvcm1cIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsOyBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZ3JhcGhpY19sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JhcGhpY3MtZG9jdW1lbnQsYXJpYTpncmFwaGljcy1zeW1ib2xcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXJpYV9TdmdBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIGEgZ3JhcGhpY3Mgcm9sZSBtdXN0IGhhdmUgYSBub24tZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIGdyYXBoaWNzIHJvbGUgaGFzIG5vIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiezB9XFxcIiBncmFwaGljcyByb2xlIGhhcyBubyBsYWJlbCBvciBhbiBlbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgZ3JhcGhpY3Mgcm9sZSBtaXNzaW5nIG5vbi1lbXB0eSAnYXJpYS1sYWJlbCcgb3IgJ2FyaWEtbGFiZWxsZWRieSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW10sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjdkNjczNFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSB8fCAhcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS5pbmNsdWRlcyhcImdyYXBoaWNzLVwiKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLyogcmVtb3ZlZCB0aGUgcm9sZSBjaGVjayByb2xlPSBwcmVzZW50YXRpb24gc2luY2UgaWYgYW4gZWxlbWVudCBoYXMgcm9sZT1pbWcsIHRoZW4gdGhlcmUgbmVlZHMgdG8gYmUgYSBjaGVjayBmb3IgYWx0IGF0dHJpYnV0ZSByZWdhcmRsZXNzIG9mIHRoZSBwcmVzZWNuZSBvZiByb2xlPXByZXNlbnRhdGlvblxuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcInByZXNlbnRhdGlvblwiKSB8fCBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICB9Ki9cblxuICAgICAgICAvLyBJZiByb2xlID09PSBpbWcsIHlvdSBtdXN0IHVzZSBhbiBhcmlhIGxhYmVsXG4gICAgICAgIC8vY2hlY2sgYXR0cmlidXRlcyBhcmlhLWxhYmVsIGFuZCBhcmlhLWxhYmVsbGVkYnkgZm9yIG90aGVyIHRhZ3MgKGUuZy4sIDxkaXY+LCA8c3Bhbj4sIGV0YylcbiAgICAgICAgbGV0IHBhc3NlZCA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgICBsZXQgc3ZnVGl0bGUgPSBydWxlQ29udGV4dC5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIik7XG4gICAgICAgICAgICBwYXNzZWQgPSBzdmdUaXRsZSAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudChzdmdUaXRsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy9jaGVjayB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICAvLyBXZSBzaG91bGQgZ3VpZGUgcGVvcGxlIHRvIHVzZSBhbHQgb3IgbGFiZWwgLSB0aGlzIGlzIGp1c3QgYSBzZWNvbmRhcnkgYXBwcm9hY2ggdG8gc2lsZW5jZSB0aGUgcnVsZS5cbiAgICAgICAgICAgIC8vIFNvLCB3ZSBzaG91bGQga2VlcCB0aGUgUE9GIGZyb20gYWJvdmUuXG4gICAgICAgICAgICAvLyBpZiAoIXBhc3NlZCkgUE9GID0gXCJGYWlsXzNcIjtcbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpXSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfaGlkZGVuX25vbnRhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaGlkZGVuX25vbnRhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLWhpZGRlbj10cnVlXSwgZG9tOipbYXJpYS1oaWRkZW49dHJ1ZV0gZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImFyaWFfaGlkZGVuX2ZvY3VzX21pc3VzZVwiOiB7IFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfaGlkZGVuX25vbnRhYmJhYmxlLmh0bWxgLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGhpZGRlbiBlbGVtZW50IHNob3VsZCBub3QgY29udGFpbiBhbnkgdGFiYmFibGUgZWxlbWVudHNcIiwgXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgXFxcInswfVxcXCIgc2hvdWxkIG5vdCBiZSBmb2N1c2FibGUgd2l0aGluIHRoZSBzdWJ0cmVlIG9mIGFuIGVsZW1lbnQgd2l0aCBhbiAnYXJpYS1oaWRkZW4nIGF0dHJpYnV0ZSB3aXRoIHZhbHVlICd0cnVlJ1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIxLjMuMVwiLCBcIjQuMS4yXCJdLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogSGFuZGxlIHRlc3RjYXNlIHdpdGggZm9jdXMganVtcGluZyBhd2F5XG4gICAgYWN0OiBcIjZjZmE4NFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbm9kZU5hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9pZF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9pZF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9WYWxpZElkUmVmXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgJ2lkJyBcXFwiezB9XFxcIiBzcGVjaWZpZWQgZm9yIHRoZSBBUklBIHByb3BlcnR5ICd7MX0nIHZhbHVlIGlzIG5vdCB2YWxpZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBBUklBIHByb3BlcnR5IG11c3QgcmVmZXJlbmNlIGEgbm9uLWVtcHR5IHVuaXF1ZSBpZCBvZiBhbiBleGlzdGluZyBlbGVtZW50IHRoYXQgaXMgdmlzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogNmE3MjgxIC0gTmVlZCBhIHNlcGFyYXRlIHJlYXNvbiBjb2RlIHdoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCByZXF1aXJlZC4gQUNUIHNheXMgaXQncyBva2F5IHRvIGJlXG4gICAgLy8gaW52YWxpZCB3aGVuIG5vdCByZXF1aXJlZC4gSSB0aGluayB3ZSBzaG91bGQgc3RpbGwgZmFpbCwgYnV0IGZsYWcgaXQgYXMgYSBkaWZmZXJlbnQgcmVhc29uIHNvIHRoYXQgd2UgY2FuIGhhdmUgYSBzdWJzZXRcbiAgICAvLyBhbGlnbnMgd2l0aCBBQ1QuXG4gICAgYWN0OiBbXCI1OTc5NmZcIiwgXCI2YTcyODFcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3MgPSB0cnVlO1xuICAgICAgICBsZXQgYXR0ck5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IG5vbkV4aXN0YW50SURzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgY29udGV4dEF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgaWRUb2tlbnMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHRlc3RlZFJlZmVyZW5jZXMgPSAwO1xuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGF0dHJMZW5ndGggPSBjb250ZXh0QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBhdHRyTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlcyA9IEFSSUFEZWZpbml0aW9ucy5wcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0c09uZUlEUmVmID0gKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIikgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBkYXRhIHR5cGUgc3VwcG9ydHMgb25lIG9yIG1vcmUgaWQgcmVmcyBkbyBlcnJvciBjaGVja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRzT25lSURSZWYgfHwgKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUmVmZXJlbmNlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWVMZW5ndGggPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkQXJyYXkgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFuIGVtcHR5IElEIFJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWVMZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChcIlxcXCJcIiArIGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSArIFwiXFxcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRvbyBtYW55IElEUmVmc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1cHBvcnRzT25lSURSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBoYXMgdG9vIG1hbnkgSURSZWZzIGl0IGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWVMZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNhcHR1cmUgYWxsIHRoZSBJRFJlZnMgZm9yIGlkVG9rZW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IDAsIGxlbmd0aCA9IGlkQXJyYXkubGVuZ3RoOyB6IDwgbGVuZ3RoOyArK3opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbel0gIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChpZEFycmF5W3pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgaWQgcmVmcyBhcmUgaW52YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzICYmIG5vZGVWYWx1ZUxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBsZW5ndGggPSBpZEFycmF5Lmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRBcnJheVtqXS5sZW5ndGggPiAwKSB7IC8vIGl0IGlzIGFuIGVtcHR5IHN0cmluZyBpZiBzcGFjZXMgYXJlIG9uZSBhZnRlciB0aGUgb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnQgYnkgSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudEJ5SWQgPSBvd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkQXJyYXlbal0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpZiB0aGUgZWxlbWVudCBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZWxlbWVudEJ5SWQgIT0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGV4aXN0cyBhbmQgdGhpcyBpcyBhbiBhcmlhIGF0dHJpYnV0ZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBoaWRkZW4gSUQgcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBwZXJmb3JtIGEgaXNOb2RlVmlzaWJsZSBjaGVjaywgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2libGUgdGhlbiB3ZSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgJiYgIWRhdGFUeXBlcy5oaWRkZW5JRFJlZlN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnRCeUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbal0gIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChpZEFycmF5W2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IG9uZSBvZiB0aGUgaWQgcmVmZXJlbmNlcyBuZWVkIHRvIGJlIHZhbGlkIHRvIG1hcmsgdGhlIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSBpZiB3ZSBmaW5kIGEgc2luZ2xlIHZpc2libGUgZWxlbWVudCB0aGVuIHN0b3AgY2hlY2tpbmcgYW5kIG1hcmsgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3MpIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFzc2VkID0gYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7XG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcmV0VG9rZW4zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG5cbiAgICAgICAgICAgIHJldFRva2VuMi5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICByZXRUb2tlbjMucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmIChpZFRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4xLnB1c2goaWRUb2tlbnMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgYXR0ck5hbWVBcnIsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yLCByZXRUb2tlbjNdKTtcbiAgICAgICAgaWYgKHRlc3RlZFJlZmVyZW5jZXMgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCksIHJldFRva2VuMy50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2ltZ19sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2ltZ19sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTppbWcsIGFyaWE6aW1hZ2VcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXJpYV9JbWdBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBoYXMgbm8gbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgaGFzIG5vIGxhYmVsIG9yIGFuIGVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIG1pc3Npbmcgbm9uLWVtcHR5ICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtcIjIzYTJhOFwiLCB7XG4gICAgICAgIFwiN2Q2NzM0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIC8vIElmIG5vIHJvbGUsIHRoaXMgaXMgaW1wbGljaXQsIGFuZCBjb3ZlcmVkIGJ5IFdDQUcyMF9JbWdfSGFzQWx0XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIHN2ZyBhbmQgaW1nIGVsZW1lbnRzIGFyZSBoYW5kbGVkIGluIHN2Z19ncmFwaGljc19sYWJiZWxsZWQgYW5kIGltZ19hbHRfdmFsaWQgcnVsZXNcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnc3ZnJyB8fCBub2RlTmFtZSA9PT0gJ2ltZycpIHJldHVybjtcblxuICAgICAgICAvKiByZW1vdmVkIHRoZSByb2xlIGNoZWNrIHJvbGU9IHByZXNlbnRhdGlvbiBzaW5jZSBpZiBhbiBlbGVtZW50IGhhcyByb2xlPWltZywgdGhlbiB0aGVyZSBuZWVkcyB0byBiZSBhIGNoZWNrIGZvciBhbHQgYXR0cmlidXRlIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZXNlY25lIG9mIHJvbGU9cHJlc2VudGF0aW9uXG4gICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwicHJlc2VudGF0aW9uXCIpIHx8IFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJub25lXCIpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgICAgIH0qL1xuXG4gICAgICAgIC8qIEpDSCAtIFBvaW50cyBvZiBmYWlsdXJlXG4gICAgICAgICAqICAgIDAuIE1pc3NpbmcgYWx0IGF0dHIgd2l0aCB2YWx1ZVxuICAgICAgICAgKiAgICAxLiBNaXNzaW5nIGFyaWEtbGFiZWwgb3IgYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAqICAgIDIuIE1pc3NpbmcgdGl0bGUgYXR0ciB3aXRoIHZhbHVlXG4gICAgICAgICAqL1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgcm9sZSA9PT0gaW1nLCB5b3UgbXVzdCB1c2UgYW4gYXJpYSBsYWJlbFxuICAgICAgICAvL2NoZWNrIGF0dHJpYnV0ZXMgYXJpYS1sYWJlbCBhbmQgYXJpYS1sYWJlbGxlZGJ5IGZvciBvdGhlciB0YWdzIChlLmcuLCA8ZGl2PiwgPHNwYW4+LCBldGMpXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIikge1xuICAgICAgICAgICAgbGV0IHN2Z1RpdGxlID0gcnVsZUNvbnRleHQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpO1xuICAgICAgICAgICAgcGFzc2VkID0gc3ZnVGl0bGUgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQoc3ZnVGl0bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vY2hlY2sgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGd1aWRlIHBlb3BsZSB0byB1c2UgYWx0IG9yIGxhYmVsIC0gdGhpcyBpcyBqdXN0IGEgc2Vjb25kYXJ5IGFwcHJvYWNoIHRvIHNpbGVuY2UgdGhlIHJ1bGUuXG4gICAgICAgICAgICAvLyBTbywgd2Ugc2hvdWxkIGtlZXAgdGhlIFBPRiBmcm9tIGFib3ZlLlxuICAgICAgICAgICAgLy8gaWYgKCFwYXNzZWQpIFBPRiA9IFwiRmFpbF8zXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX01pc3NpbmdLZXlib2FyZEhhbmRsZXJcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCI6IFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCI6IFwiYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCI6IFwiVmVyaWZ5IHRoZSA8ezB9PiBlbGVtZW50IHdpdGggXFxcInsxfVxcXCIgcm9sZSBoYXMga2V5Ym9hcmQgYWNjZXNzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW50ZXJhY3RpdmUgV0FJX0FSSUEgVUkgY29tcG9uZW50cyBtdXN0IHByb3ZpZGUga2V5Ym9hcmQgYWNjZXNzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBzYXZlZFBhc3NlZCA9IHBhc3NlZDtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgLy9sZXQgcm9sZXMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIC8vb25seSBjb25zaWRlciB1c2VyIHNwZWNpZmllZCByb2xlKHMpLCByYXRoZXIgdGhhbiBuYXRpdmUgY29udGFpbmVyc1xuICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICBcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy9pZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZCwgdGhlICdhcmlhX3JvbGVfcmVkdW5kYW50JyBydWxlIHNob3VsZCBiZSB0cmlnZ2VyZWQgYW5kIGFkZHJlc3NlZCBmaXJzdCxcbiAgICAgICAgLy8gYW5kIHRoZSBjdXJyZW50IHJ1bGUgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnICYmIHJvbGVzICYmIHJvbGVzLmluY2x1ZGVzKFwibGlzdGJveFwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIC8vIENvbXBvc2l0ZSB1c2VyIGludGVyZmFjZSB3aWRnZXQgcm9sZXMuIFRoZXkgYWN0IGFzIGNvbnRhaW5lcnMgdGhhdCBtYW5hZ2Ugb3RoZXIsIGNvbnRhaW5lZCB3aWRnZXRzLlxuICAgICAgICBsZXQgcm9sZUNvbnRhaW5lcnMgPSBbXCJjb21ib2JveFwiLCBcImdyaWRcIiwgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRyZWVcIiwgXCJ0cmVlZ3JpZFwiXTtcbiAgICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVDb250YWluZXJzKSB7XG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgcm9sZSwgdHJ1ZSkgIT0gbnVsbCkgXG4gICAgICAgICAgICAgICAgLy8gaXQncyBhIGRlc2NlbmRhbnQgb2YgYSBjb21wb3NpdGUgd2lkZ2V0IGFscmVhZHkgZXhhbWluZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IENvbW1vblV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV07XG4gICAgICAgICAgICBpZiAocm9sZUNvbnRhaW5lcnMuaW5kZXhPZihyb2xlc1tqXSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGxldCBkaXNhYmxlZCA9IGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgJ2FyaWEtZGlzYWJsZWQnKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtZGlzYWJsZWRcIikgOiAnJztcbiAgICAgICAgICAgICAgICBpZiAoIWRpc2FibGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEga2V5Ym9hcmQgZXZlbnQgaGFuZGxlciBvbiB0aGUgcGFyZW50IGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXVwXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBObyBrZXlib2FyZCBldmVudCBoYW5kbGVyIGZvdW5kIG9uIHBhcmVudC4gU2VlIGlmIGtleWJvYXJkIGV2ZW50IGhhbmRsZXJzIGFyZSBvbiByZXF1aXJlZCBjaGlsZCBlbGVtZW50cy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVxQ2hpbGRyZW4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXFDaGlsZHJlbikgeyAvKiBTTUYgVE9ETyBtZW51YmFyIGRvZXMgbm90IGhhdmUgYW55IHJlcUNoaWxkcmVuICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCByZXF1aXJlZENoaWxkcmVuTGVuZ3RoID0gcmVxQ2hpbGRyZW4ubGVuZ3RoOyBpIDwgcmVxdWlyZWRDaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAgPSBcIipbY29udGFpbnMoQHJvbGUsJ1wiICsgcmVxQ2hpbGRyZW5baV0gKyBcIicpXVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0ID0gZG9jLmV2YWx1YXRlKHhwLCBydWxlQ29udGV4dCwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoci5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgci5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoaWxkIGRpZCBub3QgaGF2ZSBhIGtleSBoYW5kbGVyLiBTZWUgaWYgYW55IG9mIHRoZSBncmFuZGNoaWxkcmVuIGRvLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdDIgPSBkb2MuZXZhbHVhdGUoeHAyLCByLCBDb21tb25VdGlsLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIyOiBFbGVtZW50ID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHIyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyMi5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgcjIuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoaXMgYW4gYWN0aW9uIGxpbms/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiYVwiICYmIHIyLmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBocmVmID0gcjIuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGlvbiBsaW5rIG11c3Qgc3RhcnQgd2l0aCBcImphdmFzY3JpcHQ6XCIsIG11c3Qgbm90IGNvbnRhaW4gYSBcInZvaWRcIiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIG5hbWUgZm9sbG93aW5nIFwiamF2YXNjcmlwdDpcIiAoaS5lLiwgaHJlZi5sZW5ndGggPiAxMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChocmVmLnN0YXJ0c1dpdGgoXCJqYXZhc2NyaXB0OlwiKSAmJiBocmVmLmluZGV4T2YoXCJ2b2lkXCIpID09IC0xICYmIGhyZWYubGVuZ3RoID4gMTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIHRoZSByZXF1aXJlZCBjaGlsZHJlbiAob3IgYW55IGRlc2NlbmRhbnRzIG9mIHRoZSByZXF1aXJlZCBjaGlsZHJlbikgbXVzdCBoYXZlIGtleXByZXNzL2tleWRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90LCBpdCBpcyBhIGZhaWx1cmUsIG5vIG5lZWQgdG8ga2VlcCBjaGVja2luZyBhbnkgbW9yZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudCBlbGVtZW50IGZhaWxlZCB0aGUga2V5ZG93bi9rZXlwcmVzcywgYW5kIGl0IGRvZXMgbm90IGhhdmUgcmVxdWlyZWQgY2hpbGRyZW4sIHN1Y2ggYXMgbWVudWJhci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0J3MgY2hlY2sgaXRzIGRlc2NlbmRhbnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdDIgPSBkb2MuZXZhbHVhdGUoeHAyLCBydWxlQ29udGV4dCwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShyMikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoaXMgYW4gYWN0aW9uIGxpbms/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJhXCIgJiYgcjIuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHJlZiA9IHIyLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aW9uIGxpbmsgbXVzdCBzdGFydCB3aXRoIFwiamF2YXNjcmlwdDpcIiwgbXVzdCBub3QgY29udGFpbiBhIFwidm9pZFwiIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgYSBmdW5jdGlvbiBuYW1lIGZvbGxvd2luZyBcImphdmFzY3JpcHQ6XCIgKGkuZS4sIGhyZWYubGVuZ3RoID4gMTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChocmVmLnN0YXJ0c1dpdGgoXCJqYXZhc2NyaXB0OlwiKSAmJiBocmVmLmluZGV4T2YoXCJ2b2lkXCIpID09IC0xICYmIGhyZWYubGVuZ3RoID4gMTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0cmlidXRlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIGlzIHNwZWNpZmllZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICByb2xlTmFtZUFyci5wdXNoKHJvbGVzW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkICYmIHNhdmVkUGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgc2F2ZWRQYXNzZWQgPSBwYXNzZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgcmVmZXJlbmNlZCBieSBhIGNvbWJvYm94LiBJZiBzbywgbGVhdmUgaXQgdG8gdGhlIGNvbWJvYm94IHJ1bGVzIHRvIGNoZWNrXG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICBpZiAoaWQgJiYgaWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCpbYXJpYS1jb250cm9scz0nJHtpZH0nXVtyb2xlPSdjb21ib2JveCddYCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2F2ZWRQYXNzZWQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5LCBhcmlhOmJhbm5lciwgYXJpYTpjb250ZW50aW5mbywgYXJpYTptYWluLCBhcmlhOm5hdmlnYXRpb24sIGFyaWE6cmVnaW9uLCBhcmlhOnNlYXJjaCwgYXJpYTpmb3JtXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJsYW5kbWFya19uYW1lX3VuaXF1ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8wXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiezB9XFxcIiBsYW5kbWFya3Mgd2l0aGluIHRoZSBzYW1lIHBhcmVudCByZWdpb24gYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdW5pcXVlICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJ7MH1cXFwiIGxhbmRtYXJrcyB3aXRoaW4gdGhlIHNhbWUgcGFyZW50IHJlZ2lvbiBhcmUgbm90IGRpc3Rpbmd1aXNoZWQgZnJvbSBvbmUgYW5vdGhlciBiZWNhdXNlIHRoZXkgaGF2ZSB0aGUgc2FtZSBcXFwiezF9XFxcIiBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggbGFuZG1hcmsgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJ2FyaWEtbGFiZWxsZWRieScgb3IgJ2FyaWEtbGFiZWwnIG9yIGJlIG5lc3RlZCBpbiBhIGRpZmZlcmVudCBwYXJlbnQgcmVnaW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUT0RPIGRvIEkgbmVlZCB0byBmaXRlciBvdXQgYmFkIGNvbnRlbnRpbmZvIG5vZGVzOiBUaGUgZm9vdGVyIGVsZW1lbnQgaXMgbm90IGEgY29udGVudGluZm8gbGFuZG1hcmsgd2hlbiBpdCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIGZvbGxvd2luZyBIVE1MNSBzZWN0aW9uaW5nIGVsZW1lbnRzOiBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNy9OT1RFLXdhaS1hcmlhLXByYWN0aWNlcy0xLjEtMjAxNzEyMTQvZXhhbXBsZXMvbGFuZG1hcmtzL0hUTUw1Lmh0bWxcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVja2luZyBpZiB0aGlzIGxhbmRtYXJrIGlzIGluc2lkZSBhIGRpYWxvZyBlbGVtZW50LiBJZiBpdCBpcyB3ZSBhcmUgZ29pbmcgdG8gc2tpcCBjaGVja2luZyBpdC4gXG4gICAgICAgIC8qKnZhciBjb3B5T2ZSdWxlQ29udGV4dCA9IHJ1bGVDb250ZXh0O1xuICAgICAgICB2YXIgcGFybmV0Tm9kZXNPZlJ1bGVDb250ZXh0ID0gW107XG4gICAgICAgIHdoaWxlIChjb3B5T2ZSdWxlQ29udGV4dCkge1xuICAgICAgICAgICAgcGFybmV0Tm9kZXNPZlJ1bGVDb250ZXh0LnVuc2hpZnQoY29weU9mUnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgY29weU9mUnVsZUNvbnRleHQgPSBjb3B5T2ZSdWxlQ29udGV4dC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dC5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS50YWdOYW1lID09IFwiRElBTE9HXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PSBcImRpYWxvZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsIC8vIFNraXBwaW5nIGNoZWNraW5nIGxhbmRtYXJrcyB0aGF0IGhhcHBlbiB0byBiZSBpbnNpZGUgZGlhbG9nIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAqL1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiRElBTE9HXCJdKSAhPT0gbnVsbCB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImRpYWxvZ1wiLCB0cnVlKSAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIEJlZ2luaW5nIGZvcm1DYWNoZSB3b3JrXG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZm9ybUNhY2hlIDoge1xuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzOiBhbnlbXSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHM6IGFueVtdLFxuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZDogc3RyaW5nW11cbiAgICAgICAgfSA9IENhY2hlVXRpbC5nZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tRU5URVJJTkcgRk9STSBDQUNIRVwiKVxuICAgICAgICAgICAgZm9ybUNhY2hlID0ge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2RlczogW10sXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQ6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc1RlbXAgPSBvd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICAgICAgJ2FzaWRlLFtyb2xlPVwiY29tcGxlbWVudGFyeVwiXSwgZm9vdGVyLFtyb2xlPVwiY29udGVudGluZm9cIl0sIGhlYWRlcixbcm9sZT1cImJhbm5lclwiXSwgbWFpbixbcm9sZT1cIm1haW5cIl0sIG5hdixbcm9sZT1cIm5hdmlnYXRpb25cIl0sIGZvcm0sW3JvbGU9XCJmb3JtXCJdLCBzZWN0aW9uLFtyb2xlPVwicmVnaW9uXCJdLFtyb2xlPVwic2VhcmNoXCJdJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXMgPSBBcnJheS5mcm9tKG5hdmlnYXRpb25Ob2Rlc1RlbXApO1xuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMgPSBbXTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kIDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAgICAgLy8gVGhpcyBibG9jayBvZiBjb2RlIGZpbHRlcnMgb3V0IGFueSBuYXYgZWxlbWVudHMgdGhhdCBhcmUgdW5kZXIgYSBkaWFsb2cuIEFzIHRob3NlIGFyZSBub3Qgb25lcyB3ZSB3YW50IHRvIHRlc3QgYWdhaW5zdCBhcyB3ZSBjb25zaWRlciBkaWFsb2dzIGFyZSBzZXBhcmF0ZSBsb2NhdGlvbnMgZnJvbSB0aGUgcmVzdCBvZiB0aGUgbWFpbiBwYWdlLlxuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8qKmxldCBhID0gbmF2aWdhdGlvbk5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCBkaWFsb2dOb2RlRm91bmRGbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYSA9IGEucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLnRhZ05hbWUgPT0gXCJESUFMT0dcIiB8fCBhLmdldEF0dHJpYnV0ZSgncm9sZScpID09IFwiZGlhbG9nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2dOb2RlRm91bmRGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWRpYWxvZ05vZGVGb3VuZEZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzV2l0aG91dERpYWxvZ3MucHVzaChuYXZpZ2F0aW9uTm9kZXNbaV0pXG4gICAgICAgICAgICAgICAgfSovXG5cbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgbm9kZSB0aGF0IGlzIEFUIGhpZGRlbiBvciBpbiBhIGRpYWxvZ1xuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChuYXZpZ2F0aW9uTm9kZXNbaV0pIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IobmF2aWdhdGlvbk5vZGVzW2ldLCBbXCJESUFMT0dcIl0pICE9PSBudWxsIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobmF2aWdhdGlvbk5vZGVzW2ldLCBcImRpYWxvZ1wiLCB0cnVlKSAhPT0gbnVsbCkgXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzLnB1c2gobmF2aWdhdGlvbk5vZGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXMgPSBuYXZpZ2F0aW9uTm9kZXNXaXRob3V0RGlhbG9ncztcblxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgbGV0IGVscyA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBhID0gbmF2aWdhdGlvbk5vZGVzW2ldLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGEpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxzLnB1c2goYSk7XG4gICAgICAgICAgICAgICAgICAgIGEgPSBhLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgcGFyZW50cyBvZiB0aGUgbGFuZG1hcmsgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBuZWFyZXN0IGxhbmRtYXJrIHBhcmVudCBiYXNlZCBvbiB0aGUgdGFnTmFtZSBvciB0aGUgcm9sZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ05hbWVUcmlnZ2VyID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJBU0lERVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJGT09URVJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRk9STVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJIRUFERVJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTUFJTlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJOQVZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU0VDVElPTlwiLFxuICAgICAgICAgICAgICAgICAgICBdLmluY2x1ZGVzKGVsc1tqXS50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGVOYW1lVHJpZ2dlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxzW2pdLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lVHJpZ2dlciA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmb3JtXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJiYW5uZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hdmlnYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJlZ2lvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic2VhcmNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBdLmluY2x1ZGVzKGVsc1tqXS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpKTsgLy8gVE9ETyB3ZSBhcmUgbm90IGNvdmVyaW5nIHRoZSBjYXNlIHdoZXJlIGEgZWxlbWVuZW50IHdpdGggbXVsdGlwbGUgcm9sZXMuIGUuZy4sIHJvbGUgPSBcImZvcm0gYmFubmVyXCIuIFRoaXMgaXMgYSBpbXByb3ZtZW50IHdlIG1pZ2h0IHdhbnQgdG8gYWRkIGluIHRoZSBmdXR1cmUuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ05hbWVUcmlnZ2VyIHx8IHJvbGVOYW1lVHJpZ2dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVhcmVzdCBwYXJlbnQtbGFuZG1hcmsgZm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMucHVzaChlbHNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGVscy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG5vZGUgaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGZpbGUgc28gaXQgZG9lcyBub3QgaGF2ZSBhIHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKG5hdmlnYXRpb25Ob2Rlc1tpXSk7XG4gICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbGFuZG1hcmsgbm9kZXNcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAvKipBUklBTWFwcGVyLmNvbXB1dGVOYW1lKG5hdmlnYXRpb25Ob2Rlc1tpXSkqL1xuICAgICAgICAgICAgICAgICAgICBwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDAgPyBwYWlyLm5hbWUudHJpbSgpIDogXCJcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBwYXJlbnRzIG9mIHRoZSBsYW5kbWFyayBub2RlcyB0byBmaW5kIGR1cGxpY2F0ZXNcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBwYXNzXzBfZmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gY29tcGFyZSBhZ2FpbnN0IG91cnNlbGZzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IGZvY3VzIG9uIHRoZSBjYXNlIHdoZXJlIHRoZSBwYXJlbnQgbGFuZG1hcmsgaXMgbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2ldID09PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2pdID09PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGxvb2tpbmcgYXQgdHdvIHJvb3Qgbm9kZXMsIHNvIHdlIHNob3VsZCBjb21wYXJlIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tpXSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgaGF2ZSB0aGUgc2FtZSByb2xlIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaGF2ZSB0aGUgc2FtZSAoY29tcHV0ZWQpIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7IC8vIEZhaWwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgJiYgc2FtZSBub2RlIHJvbGVzIEJVVCBkaWZmZXJlbnQgY29tcHV0ZWQgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCBhIFBhc3NfMC4gQnV0IHdlIG5lZWQgdG8gY2hlY2sgYWxsIG5vZGVzIHRvIHNlZSBpZiBhbm90aGVyIG9uZSBmYWlscy4gU28gc2V0IGEgZmxhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc18wX2ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzIGJ1dCBkaWZmZXJlbnQgbm9kZSByb2xlcyAvLyBOb3QgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tqXSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBsb29raW5nIGF0IGEgc2luZ2xlIHJvb3Qgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlmIHN0YXRlbWVudCBmb2N1cyBvbiB0aGUgY2FzZSB3aGVyZSB0aGUgcGFyZW50IGxhbmRtYXJrIGlzIE5PVCBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWwuc2FtZU5vZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0aGUgc2FtZSBwYXJlbnQtbGFuZG1hcmsgQU5EXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tpXSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgaGF2ZSB0aGUgc2FtZSByb2xlIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaGF2ZSB0aGUgc2FtZSAoY29tcHV0ZWQpIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7IC8vIEZhaWwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgJiYgc2FtZSBub2RlIHJvbGVzIEJVVCBkaWZmZXJlbnQgY29tcHV0ZWQgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCBhIFBhc3NfMC4gQnV0IHdlIG5lZWQgdG8gY2hlY2sgYWxsIG5vZGVzIHRvIHNlZSBpZiBhbm90aGVyIG9uZSBmYWlscy4gU28gc2V0IGEgZmxhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc18wX2ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzIGJ1dCBkaWZmZXJlbnQgbm9kZSByb2xlcyAvLyBOb3QgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlmZmVyZW50IHBhcmVudHMgLy8gTm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NfMF9mbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJwYXNzXCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwibnVsbFwiKTsgLy8gVGhpcyBpcyBub3QgdGhlIGtleXdvcmQgbnVsbCBvbiBwdXJwb3NlLiBJdCBpcyBhIHNwYWNlaG9sZGVyIGluIHRoZSBhcnJheSBzbyBpbmRleGVzIG1hdGNoIHVwLlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzID1cbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscztcbiAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXMgPSBuYXZpZ2F0aW9uTm9kZXM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzUGFyZW50cyA9IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZCA9IG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQ7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBmb3JtQ2FjaGVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gQWRkIHZhbGlkYXRpb24gdGhhdCBhbGwgMyBhcnJheXMgYXJlIHRoZSBzYW1lIGxlbmd0aFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCItLS0tLS0tLS0tLS0tRW5kIGZvcm1DYWNoZVwiKVxuICAgICAgICB9IC8vIEVuZCBmb3JtQ2FjaGVcblxuICAgICAgICBsZXQgaW5kZXhUb0NoZWNrID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmlzU2FtZU5vZGUoZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICBpbmRleFRvQ2hlY2sgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleFRvQ2hlY2sgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmRbaW5kZXhUb0NoZWNrXSA9PT0gXCJwYXNzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIixcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNbaW5kZXhUb0NoZWNrXVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmRbaW5kZXhUb0NoZWNrXSA9PT0gXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzW2luZGV4VG9DaGVja11cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2luZGV4VG9DaGVja10sXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX21haW5fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6bWFpblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVNYWluc1JlcXVpcmVMYWJlbF9JbXBsaWNpdF8yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9tYWluX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJtYWluXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBtdXN0IGhhdmUgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3Nlc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29udGV4dExhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICBsZXQgcGFyZW50RG9jUm9sZSA9IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgIFwiZG9jdW1lbnRcIixcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IG1haW5zID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1haW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAobWFpbnNbaV0gPT09IHJ1bGVDb250ZXh0KSBjb250aW51ZTtcbiAgICAgICAgICAgIHJlc3VsdCA9IFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgbGV0IHRoaXNQYXJlbnREb2NSb2xlID0gQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShcbiAgICAgICAgICAgICAgICBtYWluc1tpXSxcbiAgICAgICAgICAgICAgICBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0aGlzUGFyZW50RG9jUm9sZSA9PT0gcGFyZW50RG9jUm9sZSkge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5nZXRBcmlhTGFiZWwobWFpbnNbaV0pID09PSBjb250ZXh0TGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9tYWluX2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZU1haW5zVmlzaWJsZUxhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX21haW5fbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJtYWluXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSB2aXNpYmxlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJtYWluXFxcIiByb2xlIHNob3VsZCBoYXZlIGEgdW5pcXVlIHZpc2libGUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy9jYWxsIGdldEVsZW1lbnRzQnlSb2xlSGlkZGVuIHdpdGggY29uc2lkZXJJbXBsaWNpdCBmbGFnIGFzIHRydWVcbiAgICAgICAgLy9zbyB0aGF0IHRoZSBtZXRob2QgcmV0dXJzIDxtYWluPiBlbGVtZW50c1xuICAgICAgICBsZXQgbGFuZG1hcmtzID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IEFyaWFVdGlsLmhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGxhbmRtYXJrcyk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6bmF2aWdhdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVOYXZpZ2F0aW9uTGFuZG1hcmtzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJuYXZpZ2F0aW9uXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJuYXZpZ2F0aW9uXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwibmF2aWdhdGlvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwibmF2aWdhdGlvblwiLCB0cnVlKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7IFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9ICAgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX3BhcmVudF9yZXF1aXJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3BhcmVudF9yZXF1aXJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfUmVxdWlyZWRQYXJlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3BhcmVudF9yZXF1aXJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfcGFyZW50X3JlcXVpcmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIGFuIGltcGxpY2l0IG9yIGV4cGxpY2l0IHJvbGUgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGEgdmFsaWQgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBpcyBub3QgY29udGFpbmVkIGluIG9yIG93bmVkIGJ5IGFuIGVsZW1lbnQgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyByb2xlczogXFxcInsxfVxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IENoZWNrIEZhaWwgM1xuICAgIGFjdDogXCJmZjg5YzlcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKEFyaWFVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkgfHwgVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICBsZXQgcm9sZU5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGNvbnRhaW5lclJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCB0ZXN0ZWRDb250YWluZXIgPSAwO1xuXG4gICAgICAgIGxldCBhbmNlc3RvclJvbGVzID0gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5tYXAoaW5mbyA9PiBpbmZvLnJvbGUpO1xuICAgICAgICBsZXQgcGFyZW50Um9sZSA9IGFuY2VzdG9yUm9sZXNbYW5jZXN0b3JSb2xlcy5sZW5ndGggLSAyXTtcbiAgICAgICAgbGV0IGNvdW50ID0gMjtcbiAgICAgICAgd2hpbGUgKHBhcmVudFJvbGUgPT09ICdub25lJykge1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIHBhcmVudFJvbGUgPSBhbmNlc3RvclJvbGVzW2FuY2VzdG9yUm9sZXMubGVuZ3RoIC0gY291bnRdO1xuXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8qKmZvciAobGV0IGogPSAwLCBsZW5ndGggPSByb2xlcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0uY29udGFpbmVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0ZXN0ZWRDb250YWluZXIrKztcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb250YWluZXJSb2xlcyA9IGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5jb250YWluZXI7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNvbnRhaW5lcnNMZW5ndGggPSBjb250YWluZXJSb2xlcy5sZW5ndGg7ICFwYXNzZWQgJiYgaSA8IGNvbnRhaW5lcnNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXJlbnRSb2xlID09PSBjb250YWluZXJSb2xlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXNzZWQgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgICAgICAqL1xuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVdICYmIGRlc2lnblBhdHRlcm5zW3JvbGVdLmNvbnRhaW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgICB0ZXN0ZWRDb250YWluZXIrKztcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29udGFpbmVyUm9sZXMgPSBkZXNpZ25QYXR0ZXJuc1tyb2xlXS5jb250YWluZXI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgY29udGFpbmVyc0xlbmd0aCA9IGNvbnRhaW5lclJvbGVzLmxlbmd0aDsgIXBhc3NlZCAmJiBpIDwgY29udGFpbmVyc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZSA9PT0gY29udGFpbmVyUm9sZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFzc2VkID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChjb250YWluZXJSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMl0pO1xuICAgICAgICBpZiAodGVzdGVkQ29udGFpbmVyID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpyZWdpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlUmVnaW9uc1VuaXF1ZUxhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJyZWdpb25cIik7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsOyBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yZWdpb25fbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6cmVnaW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9SZWdpb25MYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICAgICAgLy8gXCJGYWlsXzJcIjogXCJGYWlsXzJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF8yXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhIGxhYmVsXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMlwiOiBcIkVsZW1lbnQgd2l0aCBcXFwicmVnaW9uXFxcIiByb2xlIGlzIG5vdCBsYWJlbGVkIHdpdGggJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcm9sZV9hbGxvd2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcm9sZV9hbGxvd2VkXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRSb2xlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYXJpYV9yb2xlX2FsbG93ZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudHMgbXVzdCBoYXZlIGEgdmFsaWQgJ3JvbGUnIHBlciBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIHJvbGUgJ3swfScgZGVmaW5lZCBvbiB0aGUgZWxlbWVudCBpcyBub3QgdmFsaWQgcGVyIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlNvbWUgb2YgdGhlIHJvbGVzLCAnezB9JywgZGVmaW5lZCBvbiB0aGUgZWxlbWVudCBhcmUgbm90IHZhbGlkIHBlciBBUklBIHNwZWNpZmljYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCI0LjEuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogUmVjaGVja1xuICAgIGFjdDogXCI2NzRiMTBcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcm9sZVN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChyb2xlU3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpbnZhbGlkUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYShydWxlQ29udGV4dCk7XG5cbiAgICAgICAgaWYgKCFpbnZhbGlkUm9sZXMgfHwgaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcm9sZXMgPSByb2xlU3RyLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0gcm9sZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIixcIildKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIixcIildKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFRhYmxlVXRpbCB9IGZyb20gXCIuLi91dGlsL1RhYmxlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yb2xlX3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkFuIGV4cGxpY2l0bHktYXNzaWduZWQgQVJJQSByb2xlIGlzIG5vdCByZWR1bmRhbnQgd2l0aCB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcIlRoZSBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBcXFwiezB9XFxcIiBpcyByZWR1bmRhbnQgd2l0aCB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVudCA8ezF9PlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGV4cGxpY2l0bHktYXNzaWduZWQgQVJJQSByb2xlIHNob3VsZCBub3QgYmUgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBlbGVtTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBhcmlhUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICBpZiAoIWFyaWFSb2xlcyB8fCBhcmlhUm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIGxldCByb2xlX2RlZmluZWQgPSBBcmlhVXRpbC5hcmVSb2xlc0RlZmluZWQoYXJpYVJvbGVzKTtcbiAgICAgICAgaWYgKCFyb2xlX2RlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiBpdCdzIGFscmVhZHkgZmFpbGVkIGluIHRoZSBwYXJlbnQgcmVsYXRpb24sIHRoZW4gc2tpcCB0aGlzIGNoZWNrXG4gICAgICAgIC8vIGNvbW1lbnQgb3V0IHRvIHJlcG9ydCB0aGUgcmVkdW5kYW50IHJvbGUgZm9yIHRhYmxlIGVsZW1lbnQ6IHRyLCB0ZCAmIHRoXG4gICAgICAgIC8qKmlmIChbXCJ0ZFwiLCBcInRoXCIsIFwidHJcIl0uaW5jbHVkZXMoZWxlbU5hbWUpKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZSA9IFRhYmxlVXRpbC5pc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgaWYgKHBhcmVudFJvbGUgIT09IG51bGwgJiYgcGFyZW50Um9sZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9Ki9cblxuICAgICAgICBsZXQgaW1wbGljaXRSb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghaW1wbGljaXRSb2xlcyB8fCBpbXBsaWNpdFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuXG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhUm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghaW1wbGljaXRSb2xlcy5pbmNsdWRlcyhhcmlhUm9sZXNbaV0pKSAgXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgIGVsc2UgICAgIFxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9yZWR1bmRhbnRcIiwgW2FyaWFSb2xlc1tpXSwgZWxlbU5hbWVdKSk7XG4gICAgICAgIH0gIFxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApICBcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIHJldHVybiBudWxsOyAgICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpzZWFyY2hcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlU2VhcmNoTGFuZG1hcmtzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJzZWFyY2hcXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInNlYXJjaFxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInNlYXJjaFxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBkZXByZWNhdGVkIHRoZSBydWxlIG9uIDAxLzI3LzIwMjVcbiAgICAgKiBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLCovXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW10sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwic2VhcmNoXCIsIHRydWUpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yb2xlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcm9sZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX3NlbWFudGljc19yb2xlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBBUklBIHJvbGUgJ3swfScgaXMgbm90IHZhbGlkIGZvciB0aGUgZWxlbWVudCA8ezF9PlwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgQVJJQSByb2xlICd7MH0nIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT4gYW5kIG1heSBiZSBpZ25vcmVkIGJ5IHRoZSBicm93c2VyIHNpbmNlIHRoZSBlbGVtZW50IGlzIGZvY3VzYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFSSUEgcm9sZXMgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhleSBhcmUgYXNzaWduZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBvbmx5IGNoZWsgZWxlbWVudCAoMSkgYW5kIGZyYWdtZW50IG5vZGVzICgxMSlcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIC8vIHRoZSBpbnZhbGlkIHJvbGUgY2FzZTogaGFuZGxlZCBieSBhcmlhX3JvbGVfYWxsb3dlZC4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIGNvbnN0IHVuZGVmaW5lZFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAodW5kZWZpbmVkUm9sZXMgJiYgdW5kZWZpbmVkUm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRSb2xlcyA9IEFyaWFVdGlsLmdldERlcHJlY2F0ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZFJvbGVzICYmIGRlcHJlY2F0ZWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gZGVwZW5kZW5jeSBjaGVjazogaWYgaXQncyBhbHJlYWR5IGZhaWxlZCwgdGhlbiBza2lwXG4gICAgICAgIGlmIChbXCJ0ZFwiLCBcInRoXCIsIFwidHJcIl0uaW5jbHVkZXModGFnTmFtZSkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRSb2xlID0gQ29tbW9uVXRpbC5pc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgaWYgKHBhcmVudFJvbGUgIT09IG51bGwgJiYgcGFyZW50Um9sZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRvbVJvbGVzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWRvbVJvbGVzIHx8IGRvbVJvbGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gY2hlY2sgdGhlICdnZW5lcmljJyByb2xlIGZpcnN0XG4gICAgICAgIGlmIChkb21Sb2xlcy5pbmNsdWRlcygnZ2VuZXJpYycpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtcImdlbmVyaWNcIiwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgbGV0IGludmFsaWRSb2xlcyA9IEFyaWFVdGlsLmdldEludmFsaWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChpbnZhbGlkUm9sZXMgPT09IG51bGwgfHwgaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFtkb21Sb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcblxuICAgICAgICBpZiAoaW52YWxpZFJvbGVzLmluY2x1ZGVzKFwicHJlc2VudGF0aW9uXCIpIHx8IGludmFsaWRSb2xlcy5pbmNsdWRlcyhcIm5vbmVcIikgJiYgQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZG9tUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbZG9tUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbi8vIFRoaXMgcnVsZSBpcyBpbiB0aGUgc2FtZSBmaWxlIGJlY2F1c2UgdGhlcmUgaXMgYSBkZXBlbmRlbmN5IHRoYXQgYXJpYV9yb2xlX3ZhbGlkIHJ1bnMgZmlyc3QsXG4vLyBhbmQgdGhlIGluZm8gaXMgcGFzc2VkIGJ5IGNhY2hlLCBidXQgdGhlcmUgaXNuJ3QgYSBkZXBlbmRlbmN5IGluIHRoZSBGYWlsXzIgc2NlbmFyaW8sIHNvIHJlZ3VsYXJcbi8vIGRlcGVuZGVuY3kgY2Fubm90IGJlIHVzZWRcbmV4cG9ydCBjb25zdCBhcmlhX2F0dHJpYnV0ZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICAvLyBUaGUgdGhlIEFSSUEgcm9sZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiLCBcImFyaWFfcm9sZV92YWxpZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFSSUEgYXR0cmlidXRlcyBzaG91bGQgYmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50IGFuZCBBUklBIHJvbGUgdG8gd2hpY2ggdGhleSBhcmUgYXNzaWduZWRcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIkFSSUEgYXR0cmlidXRlcyBhcmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50IGFuZCBBUklBIHJvbGVcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT4gd2l0aCBBUklBIHJvbGUgXFxcInsyfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT4gd2l0aCBpbXBsaWNpdCBBUklBIHJvbGUgXFxcInsyfVxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sIC8vcmVtb3ZlZCBtYXBwaW5nIHRvIDQuMS4yIGZyb20gaGVyZSBhbmQgaGVscFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtcIjVjMDFlYVwiLCB7IFwiNDZjYTdmXCI6IHsgXCJQYXNzXCI6IFwicGFzc1wiLCBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIjogXCJmYWlsXCIsIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcImZhaWxcIn19XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBvbmx5IGNoZWsgZWxlbWVudCAoMSlcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gaWdub3JlIGlmIG5vIGFyaWEgYXR0cmlidXRlXG4gICAgICAgIGxldCBhcmlhQXR0cmlidXRlczpzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoYXJpYUF0dHJpYnV0ZXMgPT09IG51bGwgfHwgYXJpYUF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgICAgIGxldCByb2xlczogc3RyaW5nW10gPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBpbnZhbGlkIHJvbGUgY2FzZTogaGFuZGxlZCBieSBScHRfQXJpYV9WYWxpZFJvbGUuIElnbm9yZSB0byBhdm9pZCBkdXBsaWNhdGVkIHJlcG9ydFxuICAgICAgICAgICAgaWYgKCFBcmlhVXRpbC5hcmVSb2xlc0RlZmluZWQocm9sZXMpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9ubyBleHBsaWNpdCByb2xlIGRlZmluZWRcbiAgICAgICAgICAgIHJvbGVzID0gIEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBleHBsaWNpdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGZhaWxlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWZhaWxlZEF0dHJpYnV0ZXMgfHwgZmFpbGVkQXR0cmlidXRlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIsIFthcmlhQXR0cmlidXRlcy5qb2luKFwiLCBcIiksIHRhZ05hbWUsIHJvbGVzLmpvaW4oXCIsIFwiKV0pO1xuXG4gICAgICAgIGlmIChyb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAoZXhwbGljaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiLCBbZmFpbGVkQXR0cmlidXRlcy5qb2luKFwiLCBcIiksIHRhZ05hbWUsIHJvbGVzLmpvaW4oXCIsIFwiKV0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiLCBbZmFpbGVkQXR0cmlidXRlcy5qb2luKFwiLCBcIiksIHRhZ05hbWUsIFwibm9uZVwiXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOnRvb2xiYXJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlVG9vbGJhclVuaXF1ZUxhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJ0b29sYmFyXFxcIiByb2xlcyBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInRvb2xiYXJcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSwgLy91cGRhdGVkIG1hcHBpbmcgdG8gbWF0Y2ggb3RoZXIgbGFuZG1hcmsgcmVnaW9ucyBydWxlc1xuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcInRvb2xiYXJcIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IEFyaWFVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV93aWRnZXRfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9XaWRnZXRMYWJlbHNfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3dpZGdldF9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkludGVyYWN0aXZlIGNvbXBvbmVudCBtdXN0IGhhdmUgYSBwcm9ncmFtbWF0aWNhbGx5IGFzc29jaWF0ZWQgbmFtZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbnRlcmFjdGl2ZSBjb21wb25lbnQgd2l0aCBBUklBIHJvbGUgJ3swfScgZG9lcyBub3QgaGF2ZSBhIHByb2dyYW1tYXRpY2FsbHkgYXNzb2NpYXRlZCBuYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIm02YjFxM1wiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8qIHJlbW92ZWQgdGhlIHJvbGUgY2hlY2sgcm9sZT0gcHJlc2VudGF0aW9uIGFuZCByb2xlPW5vbmUgc2luY2UgdGhlc2UgMiByb2xlcyBhcmUgbm90IGluIHRoZSBsaXN0IG9mIHdpZGdldCB0eXBlIHJvbGVzICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpICYmXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJoaWRkZW5cIikgfHxcbiAgICAgICAgICAgIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpICYmXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInNlYXJjaGJveFwiKVxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBkaWFnbm9zZSB0aGF0IGEgY29tYm9ib3ggaW5wdXQgdGV4dGJveCBoYXMgYSBsYWJlbChnaXRodWIgaXNzdWUgIzExMDQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtUm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBIYW5kbGVkIGJ5IGlucHV0X2xhYmVsX2V4aXN0c1xuICAgICAgICBsZXQgc2tpcFJvbGVzID0gW1xuICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgIFwiY2hlY2tib3hcIixcbiAgICAgICAgICAgIFwiY29tYm9ib3hcIixcbiAgICAgICAgICAgIFwibGlzdGJveFwiLFxuICAgICAgICAgICAgXCJtZW51aXRlbWNoZWNrYm94XCIsXG4gICAgICAgICAgICBcIm1lbnVpdGVtcmFkaW9cIixcbiAgICAgICAgICAgIFwicmFkaW9cIixcbiAgICAgICAgICAgIFwic2VhcmNoYm94XCIsXG4gICAgICAgICAgICBcInNsaWRlclwiLFxuICAgICAgICAgICAgXCJzcGluYnV0dG9uXCIsXG4gICAgICAgICAgICBcInN3aXRjaFwiLFxuICAgICAgICAgICAgXCJ0ZXh0Ym94XCIsXG4gICAgICAgICAgICBcInByb2dyZXNzYmFyXCIsXG4gICAgICAgICAgICBcImxpbmtcIixcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHNraXBSb2xlcy5pbmNsdWRlcyhlbGVtUm9sZSkpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0YWdOYW1lID09PSBcIm91dHB1dFwiIHx8XG4gICAgICAgICAgICAodGFnTmFtZSA9PT0gXCJpbnB1dFwiICYmXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJmaWxlXCIpXG4gICAgICAgICkge1xuICAgICAgICB9XG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgLy8gRm9ybS9pbnB1dCBlbGVtZW50cyBhcmUgY2hlY2tlZCBieSBHNDEsIHdlIHNraXAgdGhlbSBmcm9tIHRoaXMgcnVsZS4gR2l0aHViIGlzc3VlIDQ0OVxuICAgICAgICAgICAgbGV0IHNraXBFbGVtZW50cyA9IFtcbiAgICAgICAgICAgICAgICBcImlucHV0XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiLFxuICAgICAgICAgICAgICAgIFwic2VsZWN0XCIsXG4gICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICBcImRhdGFsaXN0XCIsXG4gICAgICAgICAgICAgICAgXCJvcHRncm91cFwiLFxuICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJrZXlnZW5cIixcbiAgICAgICAgICAgICAgICBcIm91dHB1dFwiLFxuICAgICAgICAgICAgICAgIFwicHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgICBcIm1ldGVyXCIsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNraXBFbGVtZW50cy5pbmRleE9mKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpICE9XG4gICAgICAgICAgICAgICAgLTFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXZvaWQgZGlhZ25vc2luZyB0aGUgcG9wdXAgbGlzdCBvZiBhIGNvbWJvYm94LlxuICAgICAgICBsZXQgcm9sZXNUb0NoZWNrID0gW1wibGlzdGJveFwiLCBcInRyZWVcIiwgXCJncmlkXCIsIFwiZGlhbG9nXCJdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvbGVzVG9DaGVjay5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgcm9sZXNUb0NoZWNrW2pdKSkge1xuICAgICAgICAgICAgICAgIGxldCBjb21ib2JveGVzID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgXCJjb21ib2JveFwiLFxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbWJvYm94ZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ID0gY29tYm9ib3hlc1trXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFfb3ducyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJvYm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhcmlhLW93bnNcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJpYV9vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ducyA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhX293bnMudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duc1tpXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHByb2hpYml0ZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICAvL2dldCBhdHRyaWJ1dGUgcm9sZXMgYXMgd2VsbCBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICBsZXQgbnVtV2lkZ2V0c1Rlc3RlZCA9IDA7XG4gICAgICAgIGxldCBpbnRlcmFjdGl2ZVJvbGVUeXBlcyA9IFtcIndpZGdldFwiLCBcImxpdmVSZWdpb25cIiwgXCJ3aW5kb3dcIl07XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByb2xlcy5sZW5ndGg7IHBhc3NlZCAmJiBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBwYXR0ZXJuID0gZGVzaWduUGF0dGVybnNbcm9sZXNbaV1dO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcGF0dGVybiAmJlxuICAgICAgICAgICAgICAgIHBhdHRlcm4ubmFtZVJlcXVpcmVkICYmXG4gICAgICAgICAgICAgICAgcGF0dGVybi5yb2xlVHlwZSAmJlxuICAgICAgICAgICAgICAgIGludGVyYWN0aXZlUm9sZVR5cGVzLmluY2x1ZGVzKHBhdHRlcm4ucm9sZVR5cGUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICArK251bVdpZGdldHNUZXN0ZWQ7XG5cbiAgICAgICAgICAgICAgICAvLyBBbGwgd2lkZ2V0cyBtYXkgaGF2ZSBhbiBhdXRob3Igc3VwcGxpZWQgYWNjZXNzaWJsZSBuYW1lLlxuICAgICAgICAgICAgICAgIC8vIFRpdGxlIGlzIGxlZ2FsLCBidXQgZG9uJ3QgYWR2ZXJ0aXNlIGl0cyB1c2UgaW4gZG9jdW1lbnRhdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBFbmNvdXJhZ2UgdXNlIG9mIGFyaWEtbGFiZWwsIGFyaWEtbGFiZWxsZWRieSBvciBodG1sIGxhYmVsIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKTtcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXBhc3NlZCAmJlxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLm5hbWVGcm9tICYmXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm4ubmFtZUZyb20uaW5kZXhPZihcImNvbnRlbnRzXCIpID49IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGlmIHdpZGdldCdzIGFjY2Vzc2libGUgbmFtZSBpcyBzdXBwbGllZCBieSBlbGVtZW50J3MgaW5uZXIgdGV4dFxuICAgICAgICAgICAgICAgICAgICAvLyBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRPckFsdChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQgaGFzIGltcGxpY2l0IGxhYmVsLCBsaWtlIDxsYWJlbD48aW5wdXQgLi4uLj5hYmMgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbXBsaWNpdExhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFwYXNzZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgRE9NVXRpbC5jbGVhbldoaXRlc3BhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLm5hbWVGcm9tLmluZGV4T2YoXCJwcm9oaWJpdGVkXCIpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvaGliaXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG51bVdpZGdldHNUZXN0ZWQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbZWxlbVJvbGVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vVE9ET1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYgKHByb2hpYml0ZWQpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFzY2lpYXJ0X2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXNjaWlhcnRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnByZSwgZG9tOmxpc3RpbmcsIGRvbTp4bXAsIGRvbTpwbGFpbnRleHRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9QcmVfQVNDSUlBcnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXNjaWlhcnRfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiYXNjaWlhcnRfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXNjaWlhcnRfYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgQVNDSUkgYXJ0IGhhcyBhIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBU0NJSSBhcnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIERlY2lzaW9uIGluIHBsYW5uaW5nIDkvNy8yMyB0aGF0IHRoaXMgcnVsZSBjYXVzZXMgbW9yZSByZXZpZXdzIHRoYXQgd2Ugc2VlIGFjdHVhbCBwcm9ibGVtcyBpbiBjb250ZW50LCBzbyB0dXJuIHRoZXNlIHJ1bGVzIG9mZlxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgICovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvLyBGaXggZm9yIElEV0Igd3JpdGVycy4gRG9uJ3QgdHJpZ2dlciBpZiBjb250ZW50IGlzIGluIGEgY29kZSBlbGVtZW50LiAgVGhlIGNvZGUgZWxlbWVudCBpcyBzZWFyY2hlZCBmb3JcbiAgICAgICAgLy8gaW4gdmFyaW91cyBwbGFjZXMgYmVjYXVzZSBvZiB0aGUgd2VpcmQgd2F5IHZhcmlvdXMgYnJvd3NlcnMgcmVuZGVyIDxjb2RlPjxwcmU+PC9wcmU+PC9jb2RlLiAgRmlyZWZveCxcbiAgICAgICAgLy8gSHRtbFVuaXQgYW5kIENocm9tZSBhbGwgcmVuZGVyIGRpZmZlcmVudGx5LiAgRmlyZWZveDogPGNvZGU+PC9jb2RlPjxwcmU+PC9wcmU+ICBIdG1sVW5pdDogPC9jb2RlPjxwcmU+PGNvZGU+PC9jb2RlPjwvcHJlPlxuICAgICAgICAvLyBTZWUgdW5pdCB0ZXN0IENvZGVFbGVtZW50QWJvdmVQcmVFbGVtZW50Lmh0bWwuICBEb24ndCBrbm93IGhvdyBSUFQgcmVuZGVycywgc28gY292ZXIgYWxsIHRoZSBiYXNlcy5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJwcmVcIikge1xuICAgICAgICAgICAgaWYgKChydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmcgJiYgcnVsZUNvbnRleHQucHJldmlvdXNTaWJsaW5nLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJjb2RlXCIpIHx8XG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjb2RlXCIpLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImNvZGVcIikpIHtcblxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgdHh0VmFsdWUgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICBsZXQgbGFzdENoYXJhY3RlciA9IFwiXCI7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSB0ZXh0IGNvbnRlbnRcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgcGFzc2VkICYmIChpZHggPCB0eHRWYWx1ZS5sZW5ndGgpOyArK2lkeCkge1xuICAgICAgICAgICAgbGV0IGNoU3RyID0gdHh0VmFsdWUuc3Vic3RyKGlkeCwgMSk7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBhbHBoYW51bWVyaWMgb3IgcHVuY3R1YXRpb25cbiAgICAgICAgICAgIGlmICgvW1xcdyFAIyQlJlxcKigpLiw/XFxbXFxde308Pj1cIjpcXC9cXFxcLV0vLnRlc3QoY2hTdHIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRGV0ZWN0IHNhbWUgY2hhcmFjdGVyIHNlcXVlbmNlXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RDaGFyYWN0ZXIgPT0gY2hTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgKyAxOztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9cXHMvLnRlc3QoY2hTdHIpKSB7XG4gICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgPSBub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ICsgMTtcbiAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RDaGFyYWN0ZXIgPSBjaFN0cjtcblxuICAgICAgICAgICAgLy8gTWFrZSB0aGUgZGVjaXNpb25cbiAgICAgICAgICAgIGlmIChub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ID49IDUgfHwgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA+PSA0KSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBibGlua19jc3NfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImJsaW5rX2Nzc19yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOipbc3R5bGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxpbmtfQ1NTVHJpZ2dlcjFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBibGlua19jc3NfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGJsaW5rX2Nzc19yZXZpZXcuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBibGlua19jc3NfcmV2aWV3Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkRvIG5vdCB1c2UgdGhlIFxcXCJibGlua1xcXCIgdmFsdWUgb2YgdGhlICd0ZXh0LWRlY29yYXRpb24nIHByb3BlcnR5IGZvciBsb25nZXIgdGhhbiBmaXZlIHNlY29uZHNcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJDaGVjayB0aGUgXFxcImJsaW5rXFxcIiB2YWx1ZSBvZiB0aGUgQ1NTICd0ZXh0LWRlY29yYXRpb24nIHByb3BlcnR5IGlzIG5vdCB1c2VkIGZvciBtb3JlIHRoYW4gdGhhbiBmaXZlIHNlY29uZHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjIuMi4yXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdGV4dFZhbHVlID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKCdzdHlsZScpKSB7XG4gICAgICAgICAgICB0ZXh0VmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdGV4dFZhbHVlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcInRleHQtZGVjb3JhdGlvbjpibGlua1wiKSA9PSAtMTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgYmxpbmtfZWxlbV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImJsaW5rX2VsZW1fZGVwcmVjYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQmxpbmtfQWx3YXlzVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBibGlua19lbGVtX2RlcHJlY2F0ZWQuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYmxpbmtfZWxlbV9kZXByZWNhdGVkLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbnRlbnQgdGhhdCBibGlua3MgcGVyc2lzdGVudGx5IG11c3Qgbm90IGJlIHVzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29udGVudCBmb3VuZCB0aGF0IGJsaW5rcyBwZXJzaXN0ZW50bHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjIuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGJsb2NrcXVvdGVfY2l0ZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYmxvY2txdW90ZV9jaXRlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJsb2NrcXVvdGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9CbG9ja3F1b3RlX0hhc0NpdGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYmxvY2txdW90ZV9jaXRlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiYmxvY2txdW90ZV9jaXRlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYmxvY2txdW90ZV9jaXRlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgPGJsb2NrcXVvdGU+IHNob3VsZCBoYXZlIGEgJ2NpdGUnIGF0dHJpYnV0ZSBhbmQgbm90IGJlIHVzZWQgZm9yIGluZGVudGF0aW9uIG9ubHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJVc2UgPGJsb2NrcXVvdGU+IG9ubHkgZm9yIHF1b3RhdGlvbnMsIG5vdCBpbmRlbnRhdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJjaXRlXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IGNpdGVFbGVtcyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJjaXRlXCIpO1xuICAgICAgICAgICAgcGFzc2VkID0gY2l0ZUVsZW1zICE9IG51bGwgJiYgY2l0ZUVsZW1zLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmNhbnZhc1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19DYW52YXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGFjY2Vzc2liaWxpdHkgb2YgdGhlIDxjYW52YXM+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGNhbnZhcz4gZWxlbWVudCBtYXkgbm90IGJlIGFjY2Vzc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCIsIFwiMi4xLjFcIiwgXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuaW5uZXJIVE1MLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgY2FwdGlvbl90cmFja19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY2FwdGlvbl90cmFja19leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTp2aWRlb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19WaWRlb19IYXNOb1RyYWNrXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJjYXB0aW9uX3RyYWNrX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY2FwdGlvbl90cmFja19leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGNhcHRpb25zIGFyZSBhdmFpbGFibGUgZm9yIGFueSBtZWFuaW5nZnVsIGF1ZGlvIG9yIHByb3ZpZGUgYSBjYXB0aW9uIHRyYWNrIGZvciB0aGUgPHZpZGVvPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8dmlkZW8+IGVsZW1lbnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZSBmb3IgYW55IG1lYW5pbmdmdWwgYXVkaW8gY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4yLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTFZpZGVvRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGlnbm9yZSBkZWNvcmF0aXZlIHZpZGVvIGlmIHVzZXIgdXNlcyBhcmlhLWhpZGRlblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cmFja3MgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyYWNrXCIpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgdHJhY2tzW2ldLmdldEF0dHJpYnV0ZShcImtpbmRcIikgPT09ICdjYXB0aW9ucyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2tzIGZvciBhZGRpdGlvbiBvZiBkeW5hbWljIHRyYWNrc1xuICAgICAgICBpZiAocnVsZUNvbnRleHQudGV4dFRyYWNrcyAmJiBydWxlQ29udGV4dC50ZXh0VHJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVsZUNvbnRleHQudGV4dFRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCBydWxlQ29udGV4dC50ZXh0VHJhY2tzW2ldLmtpbmQgPT09ICdjYXB0aW9ucyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX21pc3NpbmdcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm90X2luX3BvcHVwXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2FjdGl2ZV9yb2xlX2ludmFsaWRcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCInYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyB1c2VkIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgY29tYm9ib3hcIixcbiAgICAgICAgICAgIFwiRmFpbF9taXNzaW5nXCI6IFwiVGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiBkb2VzIG5vdCBleGlzdFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF9pbl9wb3B1cFwiOiBcIlRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgXFxcInswfVxcXCIgZG9lcyBub3QgZXhpc3Qgd2l0aGluIHRoZSBwb3B1cCByZWZlcmVuY2VkIGJ5ICdpZCcgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfcm9sZV9pbnZhbGlkXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIHJlZmVyZW5jZXMgYW4gZWxlbWVudCB3aXRoIHRoZSByb2xlcyBcXFwiezF9XFxcIiwgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZSBvZiAnb3B0aW9uJywgJ2dyaWRjZWxsJywgJ3JvdycsIG9yICd0cmVlaXRlbSdcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfbm90X3NlbGVjdGVkXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIHJlZmVyZW5jZXMgYW4gZWxlbWVudCB0aGF0IGRvZXMgbm90IGhhdmUgJ2FyaWEtc2VsZWN0ZWQnIHNldCB0byB0cnVlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgbXVzdCBiZSB1c2VkIHRvIGRlZmluZSBmb2N1cyB3aXRoaW4gdGhlIGNvbWJvYm94IHBvcHVwLCBleGNlcHQgd2hlbiB1c2luZyBhIGRpYWxvZyBwb3B1cFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGNhY2hlZEVsZW0gPSBjYWNoZVtjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoXTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cEVsZW1lbnQsIHBvcHVwSWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBUaGlzIHJ1bGUgb25seSBhcHBsaWVzIGlmIHRoZSBhY3RpdmVkZXNjZW5kYW50IGlzIHNwZWNpZmllZFxuICAgICAgICBsZXQgYWN0aXZlSWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgIGlmICghYWN0aXZlSWQgfHwgYWN0aXZlSWQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWN0aXZlRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBhY3RpdmVJZCk7XG4gICAgICAgIGlmICghYWN0aXZlRWxlbSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9taXNzaW5nXCIsIFthY3RpdmVJZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgLy8gZXhhbWluZSB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKHBvcHVwRWxlbWVudCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKCFmb3VuZCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gcG9wdXBFbGVtZW50ICYmIG53Lm5vZGUgIT0gcG9wdXBFbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcImlkXCIpID09PSBhY3RpdmVJZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gW107XG5cbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZVBhc3MoXCJGYWlsX25vdF9pbl9wb3B1cFwiLCBbYWN0aXZlSWQsIHBvcHVwSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWN0aXZlUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhhY3RpdmVFbGVtLCB0cnVlKTtcbiAgICAgICAgbGV0IHZhbGlkUm9sZXMgPSBbXCJvcHRpb25cIiwgXCJncmlkY2VsbFwiLCBcInJvd1wiLCBcInRyZWVpdGVtXCJdLmZpbHRlcigodmFsaWRSb2xlKSA9PiBhY3RpdmVSb2xlcy5pbmNsdWRlcyh2YWxpZFJvbGUpKTtcbiAgICAgICAgaWYgKHZhbGlkUm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfYWN0aXZlX3JvbGVfaW52YWxpZFwiLCBbYWN0aXZlSWQsIGFjdGl2ZVJvbGVzLmpvaW4oXCIsXCIpXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGl2ZUVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1zZWxlY3RlZFwiKSAhPT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9hY3RpdmVfbm90X3NlbGVjdGVkXCIsIFthY3RpdmVJZF0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJjb21ib2JveF9hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbmxpbmVcIjogXCJGYWlsX2lubGluZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiVGhlIGNvbWJvYm94IGRvZXMgbm90IHVzZSAnYXJpYS1hdXRvY29tcGxldGUnIHZhbHVlICdcXFwiaW5saW5lXFxcIicgbm9yIGRvZXMgaXQgaGF2ZSAnYXJpYS1hdXRvY29tcGxldGUnIGRlZmluZWQgd2l0aGluIHRoZSBwb3B1cFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgY29tYm9ib3ggaGFzIHRoZSAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBpbmNvcnJlY3RseSBzZXQgb24gYW4gZWxlbWVudCB3aXRoaW4gdGhlIHBvcHVwIHJlZmVyZW5jZWQgYnkgXFxcInswfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbmxpbmVcIjogXCJUaGUgY29tYm9ib3ggZG9lcyBub3Qgc3VwcG9ydCBhbiAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgdG8gJ1xcXCJpbmxpbmVcXFwiJyBcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGNvbWJvYm94IHRoYXQgc3VwcG9ydHMgYXV0b2NvbXBsZXRpb24gYmVoYXZpb3IgbXVzdCBoYXZlIHRoZSAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBvbmx5IG9uIGl0cyB0ZXh0IGlucHV0IGVsZW1lbnQgd2l0aCBhIHZhbGlkIHZhbHVlOyBhIHZhbHVlIG9mICdcXFwiaW5saW5lXFxcIicgaXMgbm90IHN1cHBvcnRlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgY2FjaGVkRWxlbSA9IGNhY2hlW2NvbnRleHRbXCJkb21cIl0ucm9sZVBhdGhdO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwSWQsIHBvcHVwRWxlbWVudCB9ID0gY2FjaGVkRWxlbTtcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIikgPT09IFwiaW5saW5lXCIpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9pbmxpbmVcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7IFxuICAgICAgICAvLyBleGFtaW5lIHRoZSBjaGlsZHJlblxuICAgICAgICBpZiAocG9wdXBFbGVtZW50ICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAvLyBpZiBwb3B1cEVsZW1lbnQgaXRzZWxmIGhhcyBcImFyaWEtYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIHBhc3NlZCA9ICFwb3B1cEVsZW1lbnQuaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIik7XG4gICAgICAgICAgICAvLyBpZiBhbnkgY2hpbGQgb2YgcG9wdXBFbGVtZW50IGhhcyBcImFyaWEtYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgcG9wdXBFbGVtZW50LmNoaWxkcmVuICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobncuYkVuZFRhZyAmJiBudy5ub2RlID09PSBwb3B1cEVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3BvcHVwSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZnVuY3Rpb24gcGF0dGVybkRldGVjdChlbGVtOiBFbGVtZW50KTogU3RyaW5nIHtcbiAgICAvLyBjaGVjayAnZXhwbGljaXQnIHJvbGUgY29tYm9ib3ggYW5kIHRoYXQgaXQgaXMgbm90IDxzZWxlY3Q+LiBcbiAgICBpZiAoZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2VsZWN0XCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpICE9PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgcmV0dXJuIFwiaW1wbGljaXRcIjtcbiAgICB9IGVsc2UgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiXG4gICAgICAgICYmICghZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJ0ZXh0XCIpXG4gICAgICAgICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpICYmICFlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikpIHtcbiAgICAgICAgLy8gTG9va3MgbGlrZSB0aGlzIGlzIGFuIEFSSUEgMS4wIHBhdHRlcm4sIHdoaWNoIHRoZSBBUklBIDEuMiBzcGVjIHNheXMgdG8gY29udGludWUgdG8gYWxsb3dcbiAgICAgICAgcmV0dXJuIFwiMS4wXCI7XG4gICAgfSBlbHNlIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiaW5wdXRcIlxuICAgICAgICAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSAmJiAhZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgIC8vIExvb2tzIGxpa2UgdGhpcyBpcyBhbiBBUklBIDEuMSBwYXR0ZXJuLCB3aGljaCB0aGUgQVJJQSAxLjIgc3BlYyBzYXlzIGlzIG5vdyBpbnZhbGlkXG4gICAgICAgIHJldHVybiBcIjEuMVwiO1xuICAgIH1cbiAgICAvLyBBc3N1bWUgdGhleSdyZSB0cnlpbmcgdG8gZG8gdGhlIGxhdGVzdCwgMS4yIHBhdHRlcm5cbiAgICByZXR1cm4gXCIxLjJcIjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2Rlc2lnbl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9kZXNpZ25fdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImNvbWJvYm94X3ZlcnNpb25cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMFwiOiBcIlBhc3NfMS4wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4xXCI6IFwiRmFpbF8xLjFcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJcIjogXCJQYXNzXzEuMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMVwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMFwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBpcyBkZXRlY3RlZCBhcyBBUklBIDEuMCwgd2hpY2ggaXMgYWxsb3dlZCBieSBBUklBIDEuMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMVwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBpcyBkZXRlY3RlZCBhcyBBUklBIDEuMSwgd2hpY2ggaXMgbm90IGFsbG93ZWQgYnkgQVJJQSAxLjJcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gaXMgZGV0ZWN0ZWQgYXMgQVJJQSAxLjJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gbXVzdCBiZSB2YWxpZCBmb3IgQVJJQSAxLjJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF0dGVybiA9IHBhdHRlcm5EZXRlY3QocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIFdlIGRvbid0IGFzc2VzcyBuYXRpdmUgc2VsZWN0IGVsZW1lbnRzIGhlcmVcbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IFwiaW1wbGljaXRcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGV4cGFuZGVkID0gKEFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1leHBhbmRlZFwiKSB8fCBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgIGxldCBlZGl0YWJsZSA9IHRhZ05hbWUgPT09IFwiaW5wdXRcIiAmJiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgfHwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIik7XG5cbiAgICAgICAgbGV0IGtleSA9IGNvbnRleHRbXCJkb21cIl0ucm9sZVBhdGg7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGxldCBjYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY2FjaGVba2V5XSA9IHtcbiAgICAgICAgICAgICAgICBcImlucHV0RWxlbWVudFwiOiBlZGl0YWJsZSA/IHJ1bGVDb250ZXh0IDogbnVsbCxcbiAgICAgICAgICAgICAgICBcInBhdHRlcm5cIjogcGF0dGVybixcbiAgICAgICAgICAgICAgICBcImV4cGFuZGVkXCI6IGV4cGFuZGVkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwgY2FjaGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8geHBhdGg/XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzEuMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMlwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50c1wiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF90YWJiYWJsZVwiOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfdGFiYmFibGVfY2hpbGRcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJET00gZm9jdXMgaXMgYWxsb3dlZCBvbmx5IG9uIHRoZSBjb21ib2JveCBlbGVtZW50IGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm90X3RhYmJhYmxlXCI6IFwiVGhlIGNvbWJvYm94IGVsZW1lbnQgZG9lcyBub3QgYWxsb3cgRE9NIGZvY3VzIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfdGFiYmFibGVfY2hpbGRcIjogXCJUaGUgcG9wdXAgb2YgdGhlIGNvbWJvYm94IGhhcyBET00gZm9jdXMgb3IgaGFzICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIGRlZmluZWQsIHdoaWNoIGlzIG5vdCBhbGxvd2VkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGFiYmFibGUgZm9jdXMgZm9yIHRoZSBjb21ib2JveCBtdXN0IGJlIGFsbG93ZWQgb25seSBvbiB0aGUgdGV4dCBpbnB1dCwgZXhjZXB0IHdoZW4gdXNpbmcgYSBkaWFsb2cgcG9wdXBcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgY2FjaGVkRWxlbSA9IGNhY2hlW2NvbnRleHRbXCJkb21cIl0ucm9sZVBhdGhdO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgZXhwYW5kZWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBwb3B1cFJvbGUgPSBBcmlhVXRpbC5nZXRSb2xlcyhwb3B1cEVsZW1lbnQsIHRydWUpWzBdO1xuXG4gICAgICAgIGxldCByZXRWYWwgPSBbXVxuICAgICAgICBpZiAoIUNvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9ub3RfdGFiYmFibGVcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBtYWtlcyBzZW5zZSB0byBjaGVjayB0aGUgcG9wdXAgd2hlbiBleHBhbmRlZFxuICAgICAgICAvLyB0aGlzIGRvZXMgbm90IGFwcGx5IHRvIGRpYWxvZ3MsIHJldHVybiBwYXNzIHNpbmNlIHRoZSBtYWluIGVsZW1lbnQgd2FzIGZvY3VzYWJsZSBhYm92ZVxuICAgICAgICBpZiAoZXhwYW5kZWQgPT09IGZhbHNlIHx8IHBvcHVwUm9sZSA9PT0gXCJkaWFsb2dcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGV4YW1pbmUgdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChwb3B1cEVsZW1lbnQgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAvLyBpZiBwb3B1cEVsZW1lbnQgaXRzZWxmIGhhcyBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXG4gICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHBvcHVwRWxlbWVudCkgJiYgIUFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocG9wdXBFbGVtZW50LCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTs7XG4gICAgICAgICAgICAvLyBpZiBhbnkgY2hpbGQgb2YgcG9wdXBFbGVtZW50IGhhcyBcImFyaWEtYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgcG9wdXBFbGVtZW50LmNoaWxkcmVuICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhQXJpYVV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShudy5ub2RlLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudy5iRW5kVGFnICYmIG53Lm5vZGUgPT09IHBvcHVwRWxlbWVudC5sYXN0RWxlbWVudENoaWxkKSBicmVhazsgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImNvbWJvYm94X2hhc3BvcHVwXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIjogXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIjogXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiVGhlICdhcmlhLWNvbnRyb2xzJyAoQVJJQSAxLjIpIG9yICdhcmlhLW93bnMnIChBUklBIDEuMCkgYXBwcm9wcmlhdGVseSByZWZlcmVuY2VzIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiOiBcIlRoZSAncm9sZScgdmFsdWUgXFxcInswfVxcXCIgb2YgdGhlIHBvcHVwIGVsZW1lbnQgXFxcInsxfVxcXCIgc2hvdWxkIGJlIG9uZSBvZiBcXFwibGlzdGJveFxcXCIsIFxcXCJncmlkXFxcIiwgXFxcInRyZWVcXFwiIG9yIFxcXCJkaWFsb2dcXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwiOiBcIlRoZSB2YWx1ZSBvZiB0aGUgY29tYm9ib3ggJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCBtYXRjaCB0aGUgJ3JvbGUnIHZhbHVlIG9mIHRoZSBwb3B1cCBlbGVtZW50IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGNvbWJvYm94IGF0dHJpYnV0ZSAnYXJpYS1oYXNwb3B1cCcgdmFsdWUgbXVzdCBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHJvbGUgb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSAnYXJpYS1jb250cm9scycgKEFSSUEgMS4yKSBvciAnYXJpYS1vd25zJyAoQVJJQSAxLjApXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBjb25zdCBjYWNoZWRFbGVtID0gY2FjaGVbY2FjaGVLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgcG9wdXBJZCB9ID0gY2FjaGVkRWxlbTtcbiAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgY29tYm9ib3ggaXMgcHJvYmFibHkgY29sbGFwc2VkLiBBIHJlZmVyZW5jZSBlcnJvciBpc1xuICAgICAgICAvLyBkZXRlY3RlZCBpbiBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcbiAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDaGVjayB0aGF0IHBvcHVwIHJvbGUgaXMgbGlzdGJveCwgZ3JpZCwgdHJlZSwgb3IgZGlhbG9nIGFuZCB0aGF0IGl0IG1hdGNoZXMgdGhlIGNvbWJvYm94XG4gICAgICAgIGxldCBwb3B1cFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocG9wdXBFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgbGV0IHZhbGlkUm9sZXMgPSBbXCJsaXN0Ym94XCIsIFwiZ3JpZFwiLCBcInRyZWVcIiwgXCJkaWFsb2dcIl0uZmlsdGVyKCh2YWxpZFJvbGUpID0+IHBvcHVwUm9sZXMuaW5jbHVkZXModmFsaWRSb2xlKSk7XG4gICAgICAgIGlmICh2YWxpZFJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIiwgW3BvcHVwUm9sZXMuam9pbihcIixcIiksIHBvcHVwSWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBwb3B1cFJvbGUgPSB2YWxpZFJvbGVzWzBdO1xuICAgICAgICAgICAgbGV0IGhhc3BvcHVwVmFsID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSB8fCBcImxpc3Rib3hcIjtcbiAgICAgICAgICAgIC8vIFBvcHVwIHJvbGUgbXVzdCBtYXRjaCBhcmlhLWhhc3BvcHVwIHVubGVzcyBwb3B1cFJvbGUgaXMgbGlzdGJveCwgdGhlbiBhcmlhLWhhc3BvcHVwIHNob3VsZCBub3QgYmUgZGVmaW5lZCAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChoYXNwb3B1cFZhbCAhPT0gcG9wdXBSb2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvcHVwUm9sZSAhPT0gXCJsaXN0Ym94XCIgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIiwgW2hhc3BvcHVwVmFsLCBwb3B1cFJvbGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZTogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X2Rlc2lnbl92YWxpZFwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2V4cGFuZGVkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfY29sbGFwc2VkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfZXhwYW5kZWRcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMl9jb2xsYXBzZWRcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMl9taXNzaW5nX2NvbnRyb2xzXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMl9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfZXhwYW5kZWRfaGlkZGVuXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdhcmlhLWNvbnRyb2xzJyAoZm9yIEFSSUEgMS4yKSBvciB0aGUgJ2FyaWEtb3ducycgKGZvciBBUklBIDEuMCkgYXR0cmlidXRlIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBtdXN0IHJlZmVyZW5jZSBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfZXhwYW5kZWRcIjogXCJUaGUgY29tYm9ib3ggcG9wdXAgcmVmZXJlbmNlZCBieSAnYXJpYS1vd25zJyAoQVJJQSAxLjApIGV4aXN0cyBhbmQgaXMgdmlzaWJsZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMF9jb2xsYXBzZWRcIjogXCJUaGUgY29tYm9ib3ggcG9wdXAgaW4gaXRzIGNvbGxhcHNlZCBzdGF0ZSBkb2VzIG5vdCByZWZlcmVuY2UgYW55IHZpc2libGUgcG9wdXAgYXMgcmVxdWlyZWRcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfZXhwYW5kZWRcIjogXCJUaGUgY29tYm9ib3ggcG9wdXAgcmVmZXJlbmNlZCBieSAnYXJpYS1jb250cm9scycgKEFSSUEgMS4yKSBleGlzdHMgYW5kIGlzIHZpc2libGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfY29sbGFwc2VkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIGluIGl0cyBjb2xsYXBzZWQgc3RhdGUgZG9lcyBub3QgcmVmZXJlbmNlIGFueSB2aXNpYmxlIHBvcHVwIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX21pc3Npbmdfb3duc1wiOiBcIlRoZSAnYXJpYS1vd25zJyBhdHRyaWJ1dGUgb2YgdGhlIGV4cGFuZGVkIGNvbWJvYm94IGlzIG1pc3NpbmdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiOiBcIlRoZSAnYXJpYS1jb250cm9scycgYXR0cmlidXRlIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBpcyBtaXNzaW5nXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiVGhlICdhcmlhLW93bnMnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggZG9lcyBub3QgcmVmZXJlbmNlIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMl9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcIlRoZSAnYXJpYS1jb250cm9scycgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBkb2VzIG5vdCByZWZlcmVuY2UgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfZXhwYW5kZWRfaGlkZGVuXCI6IFwiVGhlIGNvbWJvYm94ICdhcmlhLWV4cGFuZGVkJyBhdHRyaWJ1dGUgaXMgdHJ1ZSwgYnV0IHRoZSBjb21ib2JveCBwb3B1cCBpcyBub3QgdmlzaWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCI6IFwiVGhlIGNvbWJvYm94ICdhcmlhLWV4cGFuZGVkJyBhdHRyaWJ1dGUgaXMgZmFsc2UsIGJ1dCB0aGUgY29tYm9ib3ggcG9wdXAgaXMgdmlzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCI0ZThhYjZcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMF9leHBhbmRlZFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfY29sbGFwc2VkXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMl9leHBhbmRlZFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfY29sbGFwc2VkXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfZXhwYW5kZWRfaGlkZGVuXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBjYWNoZUtleSA9IGNvbnRleHRbXCJkb21cIl0ucm9sZVBhdGg7XG4gICAgICAgIGNvbnN0IGNhY2hlZEVsZW0gPSBjYWNoZVtjYWNoZUtleV07XG4gICAgICAgIGlmICghY2FjaGVkRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgcGF0dGVybiwgZXhwYW5kZWQgfSA9IGNhY2hlZEVsZW07XG5cbiAgICAgICAgbGV0IHBvcHVwSWQ7XG4gICAgICAgIGxldCBwb3B1cEVsZW1lbnQ7XG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9wdXBJZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcbiAgICAgICAgICAgIHBvcHVwRWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBwb3B1cElkKTtcbiAgICAgICAgICAgIGlmICghcG9wdXBFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMF9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiLCBbcG9wdXBJZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT09IFwiMS4yXCIpIHtcbiAgICAgICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcHVwSWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpO1xuICAgICAgICAgICAgcG9wdXBFbGVtZW50ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIHBvcHVwSWQpO1xuICAgICAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4yX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCIsIFtwb3B1cElkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGhhdmUgYW4gZWxlbWVudCwgc3RpY2sgaXQgaW4gdGhlIGNhY2hlIGFuZCB0aGVuIGNoZWNrIGl0cyByb2xlXG4gICAgICAgIGNhY2hlZEVsZW0ucG9wdXBJZCA9IHBvcHVwSWQ7XG4gICAgICAgIGNhY2hlZEVsZW0ucG9wdXBFbGVtZW50ID0gcG9wdXBFbGVtZW50O1xuXG5cbiAgICAgICAgaWYgKGV4cGFuZGVkICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9jb21ib2JveF9leHBhbmRlZF9oaWRkZW5cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoIWV4cGFuZGVkICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IFwiMS4wXCIpIHtcbiAgICAgICAgICAgIGlmIChleHBhbmRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMS4wX2V4cGFuZGVkXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMF9jb2xsYXBzZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMl9leHBhbmRlZFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjJfY29sbGFwc2VkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGRlYnVnX3BhdGhzOiBSdWxlID0ge1xuICAgIGlkOiBcImRlYnVnX3BhdGhzXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiREVCVUdcIl0sXG4gICAgICAgIG51bTogXCIxXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBydWxlQ29udGV4dC5zZXRBdHRyaWJ1dGUoXCJkb21QYXRoXCIsIGNvbnRleHRbXCJkb21cIl0ucm9sZVBhdGgpO1xuICAgICAgICBydWxlQ29udGV4dC5zZXRBdHRyaWJ1dGUoXCJhcmlhUGF0aFwiLCBjb250ZXh0W1wiYXJpYVwiXS5yb2xlUGF0aCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZGV0ZWN0b3JfdGFiYmFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZGV0ZWN0b3JfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJFWFRFTlNJT05TXCJdLFxuICAgICAgICBudW06IFwiMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LklORk9STUFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGllckNvbnRleHQgPSBjb250ZXh0SGllcmFyY2hpZXMuYXJpYVtjb250ZXh0SGllcmFyY2hpZXMuYXJpYS5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFtdLCBbe1xuICAgICAgICAgICAgbmFtZTogaGllckNvbnRleHQuYXR0cmlidXRlcy5uYW1lLFxuICAgICAgICAgICAgcm9sZTogaGllckNvbnRleHQucm9sZSxcbiAgICAgICAgICAgIHRhYmluZGV4OiBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBcIjBcIilcbiAgICAgICAgfV0pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZGlyX2F0dHJpYnV0ZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJkaXJfYXR0cmlidXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KltkaXJdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0VsZW1fRGlyVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJkaXJfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkludmFsaWQgdmFsdWUgdXNlZCBmb3IgdGhlICdkaXInIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidkaXInIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIFxcXCJsdHJcXFwiLCBcXFwicnRsXFxcIiwgb3IgXFxcImF1dG9cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBkaXJTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkaXJcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGRpclN0ciA9PSBcImx0clwiIHx8IGRpclN0ciA9PSBcInJ0bFwiIHx8IGRpclN0ciA9PSBcImF1dG9cIjtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTphW2hyZWZdLGRvbTphcmVhW2hyZWZdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX01lZGlhX0RvY3VtZW50VHJpZ2dlcjJcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgZmlsZSBkb3dubG9hZCBtZWNoYW5pc20gZG9lcyBub3QgY2F1c2UgYSBrZXlib2FyZCB0cmFwXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRmlsZSBkb3dubG9hZCBtZWNoYW5pc21zIHNob3VsZCBiZSBrZXlib2FyZC1vcGVyYWJsZSBhbmQgcHJlc2VydmUgcGFnZSBmb2N1cyBsb2NhdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBocmVmID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dChocmVmKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFbXCIuZG9jeFwiLCBcIi5kb2NcIiwgXCIucGRmXCIsIFwiLm9kdFwiXS5pbmNsdWRlcyhleHQpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlUG90ZW50aWFsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJkcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206KltkcmFnZ2FibGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgLy8gXCJwYXNzX2FsdGVybmF0aXZlXCI6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfdW5kcmFnZ2FibGVcIjogXCJkcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2FsdGVybmF0aXZlXCI6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBkcmFnZ2FibGUgZWxlbWVudCBtdXN0IGhhdmUgYSBcXFwic2luZ2xlIHBvaW50ZXJcXFwiIGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICAvLyBcInBhc3NfYWx0ZXJuYXRpdmVcIjogXCJUaGUgZHJhZ2dhYmxlIGVsZW1lbnQgXFxcInswfVxcXCIgaGFzIGEgXFxcInNpbmdsZSBwb2ludGVyXFxcIiBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJwYXNzX3VuZHJhZ2dhYmxlXCI6IFwiVGhlIGVsZW1lbnQgXFxcInswfVxcXCIgaXMgbm90IGRyYWdnYWJsZVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfYWx0ZXJuYXRpdmVcIjogXCJFbnN1cmUgdGhlIGRyYWdnYWJsZSBlbGVtZW50IFxcXCJ7MH1cXFwiIGhhcyBhIFxcXCJzaW5nbGUgcG9pbnRlclxcXCIgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjUuN1wiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7IFxuICAgICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBjZXJ0YWluIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJwcmVcIiwgXCJjb2RlXCIsIFwic2NyaXB0XCIsIFwibWV0YVwiXSkgIT09IG51bGwgXG4gICAgICAgICAgICB8fCBub2RlTmFtZSA9PT0gXCJib2R5XCIgfHwgbm9kZU5hbWUgPT09IFwiaHRtbFwiIClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImRyYWdnYWJsZVwiKSA9PT0gJ3RydWUnKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2FsdGVybmF0aXZlXCIsIFtub2RlTmFtZV0pO1xuICAgICAgICBlbHNlIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIikgPT09ICdmYWxzZScpIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc191bmRyYWdnYWJsZVwiLCBbbm9kZU5hbWVdKTtcbiAgICAgICAgZWxzZSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthY2Nlc3NrZXldXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FjY2Vzc2tleV9OZWVkTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBhbiBhc3NpZ25lZCAnYWNjZXNza2V5JyBhdHRyaWJ1dGUgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIGFuIGFzc2lnbmVkICdhY2Nlc3NrZXknIGF0dHJpYnV0ZSBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCIzLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvL3NraXAgaWYgdGhlIGVsZW1lbnQgaXMgdGFiYmFibGUsIGl0J3MgY292ZXJlZCBieSBvdGhlciBydWxlc1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIC8vc2tpcCB0aGUgbmF0aXZlIGVsZW1lbnQsIG1vc3RseSB0ZXh0IGVsZW1lbnRzXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgbGV0IHBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXVxuICAgICAgICBpZiAoIXBhdHRlcm5zIHx8ICFwYXR0ZXJucy5uYW1lRnJvbSkgXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gaWdub3JlIGlmIGFjY2Vzc2JsZSBuYW1lIGlzIHJlcXVpcmVkIChjaGVja2VkIGluIG90aGVyIHJ1bGVzKSBvciBwcm9oaWJpdGVkICh0ZXh0IGVsZW1lbnQpICAgIFxuICAgICAgICBpZiAocGF0dGVybnMubmFtZVJlcXVpcmVkIHx8ICFwYXR0ZXJucy5uYW1lRnJvbSB8fCBwYXR0ZXJucy5uYW1lRnJvbS5pbmNsdWRlcyhcInByb2hpYml0ZWRcIikpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NwZWNpYWwgY2FzZTogbGVnZW5kLCBhcyBhIGNoaWxkIG9mIGEgZmllbGRzZXQsIGRlbGVnYXRlIHRoZSBhY2Nlc3NrZXkgY29tbWFuZCB0byB0aGUgZmllbGQgb2YgdGhlIGZpZWxkc2V0IHdoaWNoIGlzIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXMgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50ICYmIHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZpZWxkc2V0JylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBjaGVjayBpZiBhY2Nlc3NpYmxlIG5hbWUgZXhpc3RzXG4gICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAvL2lmIChBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYWNjZXNza2V5XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0VsZW1fVW5pcXVlQWNjZXNzS2V5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCInYWNjZXNza2V5JyBhdHRyaWJ1dGUgdmFsdWUgb24gdGhlIGVsZW1lbnQgaXMgbm90IHVuaXF1ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhY2Nlc3NrZXknIGF0dHJpYnV0ZSB2YWx1ZXMgb24gZWFjaCBlbGVtZW50IG11c3QgYmUgdW5pcXVlIGZvciB0aGUgcGFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiSFRNTFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBtYXAgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWVcIiwge30pO1xuICBcbiAgICAgICAgbGV0IGtleSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFjY2Vzc2tleVwiKTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gIShrZXkgaW4gbWFwKTtcbiAgICAgICAgbWFwW2tleV0gPSB0cnVlO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5jb25zdCBERVBSRUNBVEVEX0VMRU1FTlRTID0gW1xuICAgIC8qKiBvcmlnaW5hbCAqL1xuICAgIFwiYXBwbGV0XCIsIFwiYmFzZWZvbnRcIiwgXCJjZW50ZXJcIiwgXCJkaXJcIiwgXCJmb250XCIsIFwiaXNpbmRleFwiLCBcImxpc3RpbmdcIixcbiAgICBcInBsYWludGV4dFwiLCBcInNwYWNlclwiLCBcInNcIiwgXCJzdHJpa2VcIiwgXCJ1XCIsIFwieG1wXCIsXG4gICAgLyoqIGFkZGVkIGZyb20gaHR0cHM6Ly9kZXYudzMub3JnL2h0bWw1L3BmLXN1bW1hcnkvb2Jzb2xldGUuaHRtbCAqL1xuICAgIFwiYWNyb255bVwiLCBcImZyYW1lXCIsIFwiZnJhbWVzZXRcIiwgXCJub2ZyYW1lc1wiLCBcIm5vZW1iZWRcIiwgXCJiaWdcIiwgXCJibGlua1wiLCBcIm1hcnF1ZWVcIiwgXCJ0dFwiLFxuXG5dXG5cbmNvbnN0IERFUFJFQ0FURURfSFRNTF9HTE9CQUxfQVRUUklCVVRFUyA9IFtcbiAgICAvKiogb3JpZ2luYWwgKi9cbiAgICBcImFsaWduXCIsIFwibGlua1wiLCBcImFyY2hpdmVcIiwgXCJiYWNrZ3JvdW5kXCIsIFwiYmdjb2xvclwiLCBcImNsZWFyXCIsIFwiY29kZVwiLCBcImNvbG9yXCIsXG4gICAgXCJjb21wYWN0XCIsIFwiZmFjZVwiLCBcImhzcGFjZVwiLCBcImxhbmd1YWdlXCIsIFwibGlua1wiLCBcIm5vc2hhZGVcIiwgXCJub3dyYXBcIiwgXCJvYmplY3RcIixcbiAgICBcInByb21wdFwiLCBcInN0YXJ0XCIsIFwidGV4dFwiLCBcInZlcnNpb25cIiwgXCJ2bGlua1wiLCBcInZzcGFjZVwiXG5dXG5cbmNvbnN0IERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTID0ge1xuICAgIC8qKiBvcmlnaW5hbCAqL1xuICAgIFwidGRcIjogW1wiaGVpZ2h0XCIsIFwid2lkdGhcIiwgXCJhYmJyXCIsIFwiYXhpc1wiLCBcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwiaGVpZ2h0XCIsIFwibm93cmFwXCIsIFwidmFsaWduXCIsIFwid2lkdGhcIiwgXCJhbGlnblwiLCBcImJnY29sb3JcIl0sXG4gICAgXCJ0aFwiOiBbXCJoZWlnaHRcIiwgXCJ3aWR0aFwiLCBcImFiYnJcIiwgXCJheGlzXCIsIFwiY2hhcm9mZlwiLCBcImhlaWdodFwiLCBcImJnY29sb3JcIiwgXCJhbGlnblwiLCBcIm5vd3JhcFwiLCBcImNoYXJcIiwgXCJ2YWxpZ25cIiwgXCJ3aWR0aFwiXSxcbiAgICBcImxpXCI6IFtcInR5cGVcIiwgXCJ2YWx1ZVwiLCBcInR5cGVcIl0sXG4gICAgXCJ1bFwiOiBbXCJ0eXBlXCIsIFwiY29tcGFjdFwiXSxcbiAgICBcInByZVwiOiBbXCJ3aWR0aFwiXSxcblxuICAgIC8qKiBhZGRlZCBmcm9tIGh0dHBzOi8vZGV2LnczLm9yZy9odG1sNS9wZi1zdW1tYXJ5L29ic29sZXRlLmh0bWwgKi9cbiAgICBcIm1ldGFcIjogW1wiaHR0cC1lcXVpdlwiXSxcbiAgICBcImFcIjogW1wiY2hhcnNldFwiLCBcImNvb3Jkc1wiLCBcInNoYXBlXCIsIFwicmV2XCIsIFwic2NoZW1lXCJdLFxuICAgIFwibGlua1wiOiBbXCJyZXZcIiwgXCJjaGFyc2V0XCIsIFwidGFyZ2V0XCJdLFxuICAgIFwiaW1nXCI6IFtcIm5hbWVcIiwgXCJsb25nZGVzY1wiLCBcImFsaWduXCIsIFwiaHNwYWNlXCIsIFwidnNwYWNlXCIsIFwiYm9yZGVyXCJdLFxuICAgIFwiYXJlYVwiOiBbXCJub2hyZWZcIl0sXG4gICAgXCJoZWFkXCI6IFtcInByb2ZpbGVcIl0sXG4gICAgXCJodG1sXCI6IFtcInZlcnNpb25cIl0sXG4gICAgXCJpZnJhbWVcIjogW1wibG9uZ2Rlc2NcIiwgXCJhbGlnblwiLCBcImZyYW1lYm9yZGVyXCIsIFwibWFyZ2luaGVpZ2h0XCIsIFwibWFyZ2lud2lkdGhcIiwgXCJzY3JvbGxpbmdcIl0sXG4gICAgXCJvYmplY3RcIjogW1wiYXJjaGl2ZVwiLCBcImNvZGVcIiwgXCJjb2RlYmFzZVwiLCBcImNvZGV0eXBlXCIsIFwiZGVjbGFyZVwiLCBcInN0YW5kYnlcIiwgXCJhbGlnblwiLCBcImhzcGFjZVwiLCBcInZzcGFjZVwiLCBcImJvcmRlclwiXSxcbiAgICBcInBhcmFtXCI6IFtcInR5cGVcIiwgXCJ2YWx1ZXR5cGVcIl0sXG4gICAgXCJzY3JpcHRcIjogW1wibGFuZ3VhZ2VcIl0sXG4gICAgXCJib2R5XCI6IFtcImFsaW5rXCIsIFwiYmFja2dyb3VuZFwiLCBcImJnY29sb3JcIiwgXCJsaW5rXCIsIFwidGV4dFwiLCBcInZsaW5rXCJdLFxuICAgIFwiYnJcIjogW1wiY2xlYXJcIl0sXG4gICAgXCJjYXB0aW9uXCI6IFtcImFsaWduXCJdLFxuICAgIFwiY29sXCI6IFtcImFsaWduXCIsIFwiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJ2YWxpZ25cIiwgXCJ3aWR0aFwiXSxcbiAgICBcImRpdlwiOiBbXCJhbGlnblwiXSxcbiAgICBcImRsXCI6IFtcImNvbXBhY3RcIl0sXG4gICAgXCJoclwiOiBbXCJhbGlnblwiLCBcIm5vc2hhZGVcIiwgXCJzaXplXCIsIFwid2lkdGhcIiwgXCJhbGlnblwiXSxcbiAgICBcImgyXCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDNcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoNFwiOiBbXCJhbGlnblwiXSxcbiAgICBcImg1XCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDZcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJpbnB1dFwiOiBbXCJhbGlnblwiLCBcInVzZW1hcFwiXSxcbiAgICBcImxlZ2VuZFwiOiBbXCJhbGlnblwiXSxcbiAgICBcIm1lbnVcIjogW1wiY29tcGFjdFwiXSxcbiAgICBcIm9sXCI6IFtcImNvbXBhY3RcIiwgXCJ0eXBlXCIsIFwidHlwZVwiXSxcbiAgICBcInBcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJ0YWJsZVwiOiBbXCJiZ2NvbG9yXCIsIFwiY2VsbHBhZGRpbmdcIiwgXCJjZWxsc3BhY2luZ1wiLCBcImZyYW1lXCIsIFwicnVsZXNcIiwgXCJ3aWR0aFwiLCBcImFsaWduXCJdLFxuICAgIFwidGJvZHlcIjogW1wiYWxpZ25cIiwgXCJjaGFyXCIsIFwidmFsaWduXCIsIFwiY2hhcm9mZlwiXSxcbiAgICBcInRmb290XCI6IFtcImFsaWduXCIsIFwiY2hhcm9mZlwiLCBcImNoYXJcIiwgXCJ2YWxpZ25cIl0sXG4gICAgXCJ0aGVhZFwiOiBbXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcInZhbGlnblwiLCBcImFsaWduXCJdLFxuICAgIFwidHJcIjogW1wiYWxpZ25cIiwgXCJiZ2NvbG9yXCIsIFwiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJ2YWxpZ25cIl1cbn1cblxuZnVuY3Rpb24gYXJyYXlUb0NvbnRleHRTdHIob2JqLCB0eXBlKSB7XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIG9iaikge1xuICAgICAgICBpZiAoc3RyICE9PSAnJyAmJiAhc3RyLmVuZHNXaXRoKCcsICcpKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ0hUTUxfRUxFTUVOVFMnKVxuICAgICAgICAgICAgc3RyICs9ICdkb206JyArIHByb3A7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdIVE1MX0FUVFJJQlVURVMnKVxuICAgICAgICAgICAgc3RyICs9ICdkb206KlsnICsgcHJvcCArIFwiXVwiO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBvYmpUb0NvbnRleHRTdHIob2JqLCB0eXBlOiBzdHJpbmcpIHtcbiAgICBsZXQgc3RyID0gXCJcIjtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gb2JqKSB7XG4gICAgICAgIGlmIChzdHIgIT09ICcnICYmICFzdHIuZW5kc1dpdGgoJywgJykpIHN0ciArPSBcIiwgXCI7XG4gICAgICAgIGlmICh0eXBlID09PSAnSFRNTF9FTEVNRU5UX0FUVFJJQlVURVMnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb2JqW3Byb3BdIGFzIFN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0ciAhPT0gJycgJiYgIXN0ci5lbmRzV2l0aChcIiwgXCIpKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICAgICAgICAgIHN0ciArPSAnZG9tOicgKyBwcm9wICsgJ1snICsgaXRlbSArICddJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFwcGxldCwgZG9tOmJhc2Vmb250LCBkb206Y2VudGVyLCBkb206ZGlyLCBkb206Zm9udCwgZG9tOmlzaW5kZXgsIGRvbTpsaXN0aW5nLCBkb206bWVudSwgZG9tOnBsYWludGV4dCwgZG9tOnNwYWNlciwgZG9tOnMsIGRvbTpzdHJpa2UsIGRvbTp1LCBkb206eG1wLCBkb206YWNyb255bSwgZG9tOmZyYW1lLCBkb206ZnJhbWVzZXQsIGRvbTpub2ZyYW1lcywgZG9tOm5vZW1iZWQsIGRvbTpiaWcsIGRvbTpibGluaywgZG9tOm1hcnF1ZWUsIGRvbTp0dE5hTmRvbToqW2FsaWduXSwgZG9tOipbbGlua10sIGRvbToqW2FyY2hpdmVdLCBkb206KltiYWNrZ3JvdW5kXSwgZG9tOipbYmdjb2xvcl0sIGRvbToqW2NsZWFyXSwgZG9tOipbY29kZV0sIGRvbToqW2NvbG9yXSwgZG9tOipbY29tcGFjdF0sIGRvbToqW2ZhY2VdLCBkb206Kltoc3BhY2VdLCBkb206KltsYW5ndWFnZV0sIGRvbToqW2xpbmtdLCBkb206Kltub3NoYWRlXSwgZG9tOipbbm93cmFwXSwgZG9tOipbb2JqZWN0XSwgZG9tOipbcHJvbXB0XSwgZG9tOipbc3RhcnRdLCBkb206Klt0ZXh0XSwgZG9tOipbdmVyc2lvbl0sIGRvbToqW3ZsaW5rXSwgZG9tOipbdnNwYWNlXU5hTmRvbTp0ZFtoZWlnaHRdLCBkb206dGRbd2lkdGhdLCBkb206dGRbYWJicl0sIGRvbTp0ZFtheGlzXSwgZG9tOnRkW2NoYXJdLCBkb206dGRbY2hhcm9mZl0sIGRvbTp0ZFtoZWlnaHRdLCBkb206dGRbbm93cmFwXSwgZG9tOnRkW3ZhbGlnbl0sIGRvbTp0ZFt3aWR0aF0sIGRvbTp0ZFthbGlnbl0sIGRvbTp0ZFtiZ2NvbG9yXSwgZG9tOnRoW2hlaWdodF0sIGRvbTp0aFt3aWR0aF0sIGRvbTp0aFthYmJyXSwgZG9tOnRoW2F4aXNdLCBkb206dGhbY2hhcm9mZl0sIGRvbTp0aFtoZWlnaHRdLCBkb206dGhbYmdjb2xvcl0sIGRvbTp0aFthbGlnbl0sIGRvbTp0aFtub3dyYXBdLCBkb206dGhbY2hhcl0sIGRvbTp0aFt2YWxpZ25dLCBkb206dGhbd2lkdGhdLCBkb206bGlbdHlwZV0sIGRvbTpsaVt2YWx1ZV0sIGRvbTpsaVt0eXBlXSwgZG9tOnVsW3R5cGVdLCBkb206dWxbY29tcGFjdF0sIGRvbTpwcmVbd2lkdGhdLCBkb206bWV0YVtodHRwLWVxdWl2XSwgZG9tOmFbY2hhcnNldF0sIGRvbTphW2Nvb3Jkc10sIGRvbTphW3NoYXBlXSwgZG9tOmFbcmV2XSwgZG9tOmFbc2NoZW1lXSwgZG9tOmxpbmtbcmV2XSwgZG9tOmxpbmtbY2hhcnNldF0sIGRvbTpsaW5rW3RhcmdldF0sIGRvbTppbWdbbmFtZV0sIGRvbTppbWdbbG9uZ2Rlc2NdLCBkb206aW1nW2FsaWduXSwgZG9tOmltZ1toc3BhY2VdLCBkb206aW1nW3ZzcGFjZV0sIGRvbTppbWdbYm9yZGVyXSwgZG9tOmFyZWFbbm9ocmVmXSwgZG9tOmhlYWRbcHJvZmlsZV0sIGRvbTpodG1sW3ZlcnNpb25dLCBkb206aWZyYW1lW2xvbmdkZXNjXSwgZG9tOmlmcmFtZVthbGlnbl0sIGRvbTppZnJhbWVbZnJhbWVib3JkZXJdLCBkb206aWZyYW1lW21hcmdpbmhlaWdodF0sIGRvbTppZnJhbWVbbWFyZ2lud2lkdGhdLCBkb206aWZyYW1lW3Njcm9sbGluZ10sIGRvbTpvYmplY3RbYXJjaGl2ZV0sIGRvbTpvYmplY3RbY29kZV0sIGRvbTpvYmplY3RbY29kZWJhc2VdLCBkb206b2JqZWN0W2NvZGV0eXBlXSwgZG9tOm9iamVjdFtkZWNsYXJlXSwgZG9tOm9iamVjdFtzdGFuZGJ5XSwgZG9tOm9iamVjdFthbGlnbl0sIGRvbTpvYmplY3RbaHNwYWNlXSwgZG9tOm9iamVjdFt2c3BhY2VdLCBkb206b2JqZWN0W2JvcmRlcl0sIGRvbTpwYXJhbVt0eXBlXSwgZG9tOnBhcmFtW3ZhbHVldHlwZV0sIGRvbTpzY3JpcHRbbGFuZ3VhZ2VdLCBkb206Ym9keVthbGlua10sIGRvbTpib2R5W2JhY2tncm91bmRdLCBkb206Ym9keVtiZ2NvbG9yXSwgZG9tOmJvZHlbbGlua10sIGRvbTpib2R5W3RleHRdLCBkb206Ym9keVt2bGlua10sIGRvbTpicltjbGVhcl0sIGRvbTpjYXB0aW9uW2FsaWduXSwgZG9tOmNvbFthbGlnbl0sIGRvbTpjb2xbY2hhcl0sIGRvbTpjb2xbY2hhcm9mZl0sIGRvbTpjb2xbdmFsaWduXSwgZG9tOmNvbFt3aWR0aF0sIGRvbTpkaXZbYWxpZ25dLCBkb206ZGxbY29tcGFjdF0sIGRvbTpoclthbGlnbl0sIGRvbTpocltub3NoYWRlXSwgZG9tOmhyW3NpemVdLCBkb206aHJbd2lkdGhdLCBkb206aHJbYWxpZ25dLCBkb206aDJbYWxpZ25dLCBkb206aDNbYWxpZ25dLCBkb206aDRbYWxpZ25dLCBkb206aDVbYWxpZ25dLCBkb206aDZbYWxpZ25dLCBkb206aW5wdXRbYWxpZ25dLCBkb206aW5wdXRbdXNlbWFwXSwgZG9tOmxlZ2VuZFthbGlnbl0sIGRvbTptZW51W2NvbXBhY3RdLCBkb206b2xbY29tcGFjdF0sIGRvbTpvbFt0eXBlXSwgZG9tOm9sW3R5cGVdLCBkb206cFthbGlnbl0sIGRvbTp0YWJsZVtiZ2NvbG9yXSwgZG9tOnRhYmxlW2NlbGxwYWRkaW5nXSwgZG9tOnRhYmxlW2NlbGxzcGFjaW5nXSwgZG9tOnRhYmxlW2ZyYW1lXSwgZG9tOnRhYmxlW3J1bGVzXSwgZG9tOnRhYmxlW3dpZHRoXSwgZG9tOnRhYmxlW2FsaWduXSwgZG9tOnRib2R5W2FsaWduXSwgZG9tOnRib2R5W2NoYXJdLCBkb206dGJvZHlbdmFsaWduXSwgZG9tOnRib2R5W2NoYXJvZmZdLCBkb206dGZvb3RbYWxpZ25dLCBkb206dGZvb3RbY2hhcm9mZl0sIGRvbTp0Zm9vdFtjaGFyXSwgZG9tOnRmb290W3ZhbGlnbl0sIGRvbTp0aGVhZFtjaGFyXSwgZG9tOnRoZWFkW2NoYXJvZmZdLCBkb206dGhlYWRbdmFsaWduXSwgZG9tOnRoZWFkW2FsaWduXSwgZG9tOnRyW2FsaWduXSwgZG9tOnRyW2JnY29sb3JdLCBkb206dHJbY2hhcl0sIGRvbTp0cltjaGFyb2ZmXSwgZG9tOnRyW3ZhbGlnbl1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbVwiOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2F0dHJcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbGVtX2F0dHJcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IGlzIGRlcHJlY2F0ZWQgaW4gSFRNTCA1XCIsXG4gICAgICAgICAgICBcImZhaWxfYXR0clwiOiBcIlRoZSBIVE1MIGF0dHJpYnV0ZShzKSBcXFwiezB9XFxcIiBpcyBkZXByZWNhdGVkIGluIEhUTUwgNVwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1fYXR0clwiOiBcIlRoZSBIVE1MIGF0dHJpYnV0ZShzKSBcXFwiezB9XFxcIiBpcyBkZXByZWNhdGVkIGZvciB0aGUgPHsxfT4gZWxlbWVudCBpbiBIVE1MIDVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2Ugb2Ygb2Jzb2xldGUgZmVhdHVyZXMgaWYgcG9zc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiSFRNTFwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvLyBIVE1MVW5pdCBhdXRvIGFkZHMgYSB0Ym9keVthbGlnbj1sZWZ0XSB0byB0YWJsZXMgaWYgdGJvZHkgaXMgbWlzc2luZyFcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwidGJvZHlcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbGlnblwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgd2ViY29tcG9uZW50IGVsZW1lbnQsIEhUTUwgZG9lc24ndCBkZWZpbmUgd2hhdCdzIGRlcHJlY2F0ZWRcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhIGRlcHJlY2F0ZWQgZWxlbWVudFxuICAgICAgICBpZiAoREVQUkVDQVRFRF9FTEVNRU5UUy5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZWxlbVwiLCBbbm9kZU5hbWVdKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhIGRlcHJlY2F0ZWQgSFRNTCBnbG9iYWwgYXR0cmlidXRlXG4gICAgICAgIGNvbnN0IGF0dHJzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlTmFtZXMoKTtcbiAgICAgICAgbGV0IHZpb2xhdGlvbnMgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJzKSB7XG4gICAgICAgICAgICBpZiAoREVQUkVDQVRFRF9IVE1MX0dMT0JBTF9BVFRSSUJVVEVTLmluY2x1ZGVzKGF0dHIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT09ICcnKSB2aW9sYXRpb25zICs9ICcsICc7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucyArPSBhdHRyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9hdHRyXCIsIFt2aW9sYXRpb25zXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBpdCdzIGEgZGVwcmVjYXRlZCBIVE1MIGVsZW1lbnQgJiBhdHRyaWJ1dGVcbiAgICAgICAgdmlvbGF0aW9ucyA9ICcnO1xuICAgICAgICBpZiAobm9kZU5hbWUgaW4gREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBhdHRycykge1xuICAgICAgICAgICAgICAgIGlmIChERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFU1tub2RlTmFtZV0gJiYgREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVNbbm9kZU5hbWVdLmluY2x1ZGVzKGF0dHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykgdmlvbGF0aW9ucyArPSAnLCAnO1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zICs9IGF0dHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9lbGVtX2F0dHJcIiwgW3Zpb2xhdGlvbnMsIG5vZGVOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2lkX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2lkX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbaWRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRWxlbV9VbmlxdWVJZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwicG90ZW50aWFsX2VtcHR5XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBvdGVudGlhbF9pbl91c2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2VtcHR5XCI6IFwiZWxlbWVudF9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfaW5fdXNlXCI6IFwiZWxlbWVudF9pZF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnQgJ2lkJyBhdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZW1wdHlcIjogXCJUaGUgPHswfT4gZWxlbWVudCBoYXMgdGhlIGlkIFxcXCJ7MX1cXFwiIHRoYXQgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2luX3VzZVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IGhhcyB0aGUgaWQgXFxcInsxfVxcXCIgdGhhdCBpcyBhbHJlYWR5IGluIHVzZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiSFRNTFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiM2VhMGM4XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2VtcHR5XCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfaW5fdXNlXCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCBpZCBpcyBlbXB0eSB3ZSBzaG91bGQgdHJpZ2dlciBhIHZpb2xhdGlvbiByaWdodCBhd2F5IHdpdGggb3V0IGNoZWNraW5nIFxuICAgICAgICAvLyBmb3IgdW5pcXVlbmVzcy5cbiAgICAgICAgaWYgKGlkID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChmYWxzZSwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2VtcHR5XCIsIFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBpZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgaWQpO1xuICAgICAgICBsZXQgcGFzc2VkID0gZWxlbWVudCA9PT0gcnVsZUNvbnRleHQ7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9pbl91c2VcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgZVJ1bGVDb25maWRlbmNlIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBMYW5nVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sYW5nXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmNvbnN0IHZhbGlkYXRlTGFuZyA9IChjb250ZXh0OiBSdWxlQ29udGV4dCk6IG51bWJlciA9PiB7XG4gICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8gSXQncyBva2F5IHRvIGhhdmUgYSBsYW5nPVwiXCIgaWYgbm90IG9uIGh0bWxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYW5nU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKTtcbiAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5pc0JjcDQ3KGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInhtbDpsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgb2theSB0byBoYXZlIGEgbGFuZz1cIlwiIGlmIG5vdCBvbiBodG1sXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUxhbmdVdGlsLmlzQmNwNDcobGFuZ1N0cikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGNvbnN0IGh0bWxfbGFuZ192YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJodG1sX2xhbmdfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpodG1sW2xhbmddLCBkb206aHRtbFt4bWw6bGFuZ11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImh0bWxfbGFuZ192YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkxhbmcgaGFzIGEgdmFsaWQgcHJpbWFyeSBsYW5nIGFuZCBjb25mb3JtcyB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgaW5jbHVkZSBhIHZhbGlkIHByaW1hcnkgbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiU3BlY2lmaWVkICd4bWw6bGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBjb25mb3JtIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBkZWZhdWx0IGh1bWFuIGxhbmd1YWdlIG9mIHRoZSBwYWdlIG11c3QgYmUgdmFsaWQgYW5kIHNwZWNpZmllZCBpbiBhY2NvcmRhbmNlIHdpdGggQkNQIDQ3XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcImI1YzNmOFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmYwNTFhXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9LFxuICAgICAgICAvLyBUT0RPOiBBQ1Q6IE1pc21hdGNoIGJlY2F1c2UgdGhleSBkb24ndCBjaGVjayB0aGUgaHRtbCBlbGVtZW50IGluIHRoZSBzYW1lIHJ1bGVcbiAgICAgICAgLy8gXCJkZTQ2ZTRcIjoge1xuICAgICAgICAvLyAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8yXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgLy8gfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGxldCByZWFzb25Db2RlID0gdmFsaWRhdGVMYW5nKGNvbnRleHQpO1xuICAgICAgICAvLyBUaGlzIGlzIGRvbmUgaGVyZSBpbnN0ZWFkIG9mIGluIHZhbGlkYXRlTGFuZyBzbyB0aGF0IHRoZSBnZW5IZWxwIGNvZGUgd2lsbCBwaWNrIGl0IHVwXG4gICAgICAgIGxldCByZXRBcnIgPSBbXG4gICAgICAgICAgICBSdWxlUGFzcyhcIlBhc3NfMFwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8xXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzJcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfM1wiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF80XCIpXG4gICAgICAgIF1cbiAgICAgICAgcmV0dXJuIHJldEFycltyZWFzb25Db2RlXTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2xhbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9sYW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KltsYW5nXSwgZG9tOipbeG1sOmxhbmddXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJMYW5nIGhhcyBhIHZhbGlkIHByaW1hcnkgbGFuZyBhbmQgY29uZm9ybXMgdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgY2hhbmdlIGluIGxhbmd1YWdlIG9mIHNwZWNpZmljIGNvbnRlbnQgbXVzdCBiZSB2YWxpZCBhbmQgc3BlY2lmaWVkIGluIGFjY29yZGFuY2Ugd2l0aCBCQ1AgNDdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgLy8gXCJiNWMzZjhcIjoge1xuICAgICAgICAvLyAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8yXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBcImJmMDUxYVwiOiB7XG4gICAgICAgIC8vICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gVE9ETzogQUNUOiBNaXNtYXRjaCBiZWNhdXNlIHRoZXkgZG9uJ3QgY2hlY2sgdGhlIGh0bWwgZWxlbWVudCBpbiB0aGUgc2FtZSBydWxlXG4gICAgICAgIFwiZGU0NmU0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBJZiBpdCdzIHRoZSBIVE1MIG5vZGUsIHRoYXQncyBoYW5kbGVkIGJ5IGh0bWxfbGFuZ192YWxpZFxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaHRtbFwiKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHJlYXNvbkNvZGUgPSB2YWxpZGF0ZUxhbmcoY29udGV4dCk7XG4gICAgICAgIC8vIFRoaXMgaXMgZG9uZSBoZXJlIGluc3RlYWQgb2YgaW4gdmFsaWRhdGVMYW5nIHNvIHRoYXQgdGhlIGdlbkhlbHAgY29kZSB3aWxsIHBpY2sgaXQgdXBcbiAgICAgICAgbGV0IHJldEFyciA9IFtcbiAgICAgICAgICAgIFJ1bGVQYXNzKFwiUGFzc18wXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzFcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfMlwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8zXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzRcIilcbiAgICAgICAgXVxuICAgICAgICBsZXQgcmV0VmFsID0gcmV0QXJyW3JlYXNvbkNvZGVdO1xuICAgICAgICBpZiAocmV0VmFsLnZhbHVlWzFdICE9PSBlUnVsZUNvbmZpZGVuY2UuUEFTUykge1xuICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlcmUncyBhY3R1YWxseSBjb250ZW50IG9mIHRoaXMgZWxlbWVudCAtIHNraXAgc3VidHJlZXMgdGhhdCBoYXZlIG90aGVyIGxhbmcgYXR0cmlidXRlc1xuICAgICAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5maXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihydWxlQ29udGV4dCwgZmFsc2UsIHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBudy5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50KSB8fCBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImxhbmdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gaGFzQ29udGVudCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApLyoqQVJJQU1hcHBlci5jb21wdXRlTmFtZShlbGVtZW50KS50cmltKCkubGVuZ3RoID4gMCovO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IGhhc0NvbnRlbnQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbncubm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25kYmxjbGlja10sIGRvbToqW29ubW91c2Vtb3ZlXSwgZG9tOipbb25tb3VzZWRvd25dLCBkb206Kltvbm1vdXNldXBdLCBkb206Kltvbm1vdXNlb3Zlcl0sIGRvbToqW29ubW91c2VvdXRdLCBkb206KltvbmNsaWNrXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VsZW1fRXZlbnRNb3VzZUFuZEtleVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIHRoZSA8ezB9PiBlbGVtZW50IHdpdGggbW91c2UgZXZlbnQgaGFuZGxlcihzKSAnezF9JyBoYXMgYSBjb3JyZXNwb25kaW5nIGtleWJvYXJkIGhhbmRsZXIocylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgaW50ZXJhY3RpdmUgY29udGVudCB3aXRoIG1vdXNlIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBlcXVpdmFsZW50IGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSB8fFxuICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmRibGNsaWNrXCIpICYmXG4gICAgICAgICAgICAgICAgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlZG93blwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNldXBcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2VvdmVyXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uYmx1clwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uY2xpY2tcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSB8fFxuICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImJ1dHRvblwiKSk7XG5cbiAgICAgICAgbGV0IGZhaWxlZE1vdXNlRXZlbnRzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvL3N0b3JlIGFuZCBkaXNwbGF5IGV2ZW50IG5hbWUgYW5kIG5vZGUgbmFtZSBpbiB0aGUgdG9rZW5zXG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25kYmxjbGlja1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmRibGNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2Vtb3ZlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vkb3duXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZWRvd25cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZXVwXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXVwXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2V1cFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3ZlclwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25mb2N1c1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNlb3ZlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmJsdXJcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZW91dFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEobm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJidXR0b25cIikpXG4gICAgICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiLCBbbm9kZU5hbWUsIGZhaWxlZE1vdXNlRXZlbnRzLmpvaW4oXCIsIFwiKV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENTU1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvY2tlZFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCIsXG4gICAgICAgICAgICBcImZhaWxfbG9ja2VkXCI6IFwiVGhlIGVsZW1lbnQgPHswfT4gaXMgcmVzdHJpY3RlZCB0byBlaXRoZXIgbGFuZHNjYXBlIG9yIHBvcnRyYWl0IG9yaWVudGF0aW9uIHVzaW5nIENTUyB0cmFuc2Zvcm0gcHJvcGVydHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyBzaG91bGQgbm90IGJlIHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuNFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbJ2IzM2VmZiddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCBpbnZpc2libGUgZWxlbWVudFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wic2NyaXB0XCIsIFwibWV0YVwiLCBcInRpdGxlXCJdKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIFNraXAgZWxlbWVudHMgdGhhdCBoYXZlIG5vIG1lYW5pbmdmdWwgdmlzaWJsZSBjb250ZW50IChubyB0ZXh0LCBubyBpbWcgd2l0aCBhbHQpLlxuICAgICAgICAvLyBPcmllbnRhdGlvbiBsb2NrIG9uIGEgcHVyZWx5IGRlY29yYXRpdmUgb3IgZW1wdHkgZWxlbWVudCBpcyBub3QgYSBXQ0FHIHZpb2xhdGlvblxuICAgICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbnRlbnQgd2hvc2Ugb3JpZW50YXRpb24gbWF0dGVycyB0byB0aGUgdXNlci5cbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBjYWNoZSB0aGUgb3JpZW50YXRpb24gcmVzdWx0IGZvciBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCkgYXMgYW55O1xuICAgICAgICBsZXQgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJSUFRVdGlsX01FRElBX09SSUVOVEFUSU9OX1RSQU5TRlJPTVwiLCBudWxsKTtcbiAgICAgICAgaWYgKCFvcmllbnRhdGlvblRyYW5zZm9ybXMpIHtcbiAgICAgICAgICAgIG9yaWVudGF0aW9uVHJhbnNmb3JtcyA9IENTU1V0aWwuZ2V0TWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybShkb2MpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRVdGlsX01FRElBX09SSUVOVEFUSU9OX1RSQU5TRlJPTVwiLCBvcmllbnRhdGlvblRyYW5zZm9ybXMpO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gZmluZCBpZiB0aGUgZWxlbWVudCBtYXRjaGVzIG9yaWVudGF0aW9uIHNlbGVjdG9yKHMpXG4gICAgICAgIGxldCBtZWRpYV90cmFuc2Zvcm1zID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKG9yaWVudGF0aW9uVHJhbnNmb3JtcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV0pLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV1bdGFnXSkubGVuZ3RoID4gMCAmJiBDU1NVdGlsLnNlbGVjdG9yTWF0Y2hlc0VsZW0ocnVsZUNvbnRleHQsIHRhZykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10udHJhbnNmb3JtKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3Jtcy5wdXNoKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10udHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3Jtcy5wdXNoKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10pO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBubyBtYXRjaCwgdGhlIGVsZW1lbnQgaXMgbm90IGluIG1lZGlhIG9yaWVudGF0aW9uIHRyYW5zZm9ybVxuICAgICAgICBpZiAobWVkaWFfdHJhbnNmb3Jtcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtZWRpYV90cmFuc2Zvcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWVkaWFfdHJhbnNmb3JtID0gbWVkaWFfdHJhbnNmb3Jtc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVkaWFfdHJhbnNmb3JtID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICBmb3IodmFyIGtleSBpbiBtZWRpYV90cmFuc2Zvcm0pXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhX3RyYW5zZm9ybSA9IGtleSArXCIoXCIgKyBtZWRpYV90cmFuc2Zvcm1ba2V5XSArXCIpXCI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjb250YWluc1JvdGF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICBbJ3JvdGF0ZScsICdyb3RhdGUzZCcsICdyb3RhdGVaJywgJ21hdHJpeCcsICdtYXRyaXgzZCddLmZvckVhY2gocm90YXRpb24gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtZWRpYV90cmFuc2Zvcm0uaW5jbHVkZXMocm90YXRpb24pKSBjb250YWluc1JvdGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gbm8gcm90YXRpb24gdHJhbnNmb3JtLCBza2lwXG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUm90YXRpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgZGVncmVlID0gQ1NTVXRpbC5nZXRSb3RhdGlvbkRlZ3JlZShtZWRpYV90cmFuc2Zvcm0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBubyBvciAzNjBuIGRlZ3JlZSByb3RhdGlvbiBcbiAgICAgICAgICAgIGlmIChkZWdyZWUgPT09IDApIHsgXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogY2FsY3VsYXRlIHRoZSBvcmlnaW5hbCBwYWdlIHJvdGF0aW9uIHRyYW5zZm9ybWF0aW9uLCBleGFtcGxlXG4gICAgICAgICAgICAgKiAgaHRtbCB7IHRyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7IH1cbiAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBkZWZpbmVkU3R5bGUgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQsIFtcInRyYW5zZm9ybVwiXSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqIGNvbXBlbnNhdGUgdGhlIG1lZGlhIG9yaWVudGF0aW9uIHdpdGggdGhlIHBhZ2Ugb3JpZW50YXRpb25cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKGRlZmluZWRTdHlsZVsndHJhbnNmb3JtJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlX2RlZ3JlZSA9IENTU1V0aWwuZ2V0Um90YXRpb25EZWdyZWUoZGVmaW5lZFN0eWxlWyd0cmFuc2Zvcm0nXSk7XG4gICAgICAgICAgICAgICAgLy8gcm90YXRlIGlzIGFkZGl0aXZlXG4gICAgICAgICAgICAgICAgZGVncmVlICs9IHBhZ2VfZGVncmVlO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gMTgwwrAgcm90YXRpb24gaXMgYSB2ZXJ0aWNhbCBmbGlwIOKAlCBpdCBkb2VzIG5vdCBzd2FwIHBvcnRyYWl0IGFuZCBsYW5kc2NhcGUsXG4gICAgICAgICAgICAvLyBzbyBpdCBkb2VzIG5vdCBsb2NrIG9yaWVudGF0aW9uIGluIHRoZSBXQ0FHIDEuMy40IHNlbnNlLlxuICAgICAgICAgICAgLy8gMzYwwrAgKGZ1bGwgdHVybikgaXMgYWxzbyBub3QgYSBsb2NrIChhbHJlYWR5IG5vcm1hbGlzZWQgdG8gMCBhYm92ZSkuXG4gICAgICAgICAgICAvLyBBbGxvdyAxwrAgZmxvYXRpbmctcG9pbnQgdG9sZXJhbmNlIGFyb3VuZCBib3RoIDDCsCBhbmQgMTgwwrAuXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpc2VkID0gZGVncmVlICUgMTgwO1xuICAgICAgICAgICAgaWYgKG5vcm1hbGlzZWQgPD0gMSB8fCBub3JtYWxpc2VkID49IDE3OSlcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9sb2NrZWRcIiwgW25vZGVOYW1lXSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMCkgIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7IFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc190YWJiYWJsZVwiOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfaW50ZXJhY3RpdmVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcm9sbGFibGUgZWxlbWVudHMgc2hvdWxkIGJlIHRhYmJhYmxlIG9yIGNvbnRhaW4gdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwYXNzX3RhYmJhYmxlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2ludGVyYWN0aXZlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBoYXMgdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJUaGUgc2Nyb2xsYWJsZSBlbGVtZW50IDx7MH0+IHdpdGggbm9uLWludGVyYWN0aXZlIGNvbnRlbnQgaXMgbm90IHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogZGVwcmVjYXRlZCBvbiA2LzEwLzIwMjUgZHVlIHRvIEJyb3dzZXIgc3VwcG9ydCBmb3IgYXV0by1mb2N1cyBvZiBhIHNjcm9sbGFibGUgZWxlbWVudCBcbiAgICAgKiBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLCovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW1wiMHNzdzlrXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImlmcmFtZVwiLCBcInN2Z1wiLCBcInNjcmlwdFwiLCBcIm1ldGFcIiwgXCJzdHlsZVwiXSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgaWYgbm8gdmlzaWJsZSBjb250ZW50XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50J3MgbmF2aWdhdGlvbiBpcyBjb250cm9sbGVkIG9yIG93bmVkIGJ5IGFub3RoZXIgZWxlbWVudFxuICAgICAgICBpZiAoQXJpYVV0aWwuaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHNjcm9sbGFibGUgb3IgY29udGVudCB3aXRob3V0aW5nIG5lZWRpbmcgYSBzY3JvbGxcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzRWxlbWVudFNjcm9sbGFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gcGFzcyBpZiBlbGVtZW50IGlzIHRhYmJhYmxlXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc190YWJiYWJsZVwiKTtcblxuICAgICAgICAvLyBjaGVjayBpZiBlbGVtZW50IGNvbnRlbnQgaXMgdGFiYmFibGVcbiAgICAgICAgY29uc3QgY291bnQgPSBDb21tb25VdGlsLmdldFRhYmJhYmxlQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY291bnQgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19pbnRlcmFjdGl2ZVwiKTtcblxuICAgICAgICAvLyBpZ25vcmUgaW4gRmlyZWZveCBpZiBubyB0YWJpbmRleCBhdCBhbGwgKG5vdCB0ZXN0ZWQgaW4gZW1iZWRkZWQgb3IgYW55IHNpbXVsYXRvcilcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJGaXJlZm94XCIpID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX3Njcm9sbGFibGVcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKTsgICAgXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OlwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX3JvbGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3ZhbGlkX3JvbGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBoYXMgYSB3aWRnZXQgcm9sZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfcm9sZVwiOiBcIlRoZSB0YWJiYWJsZSBlbGVtZW50J3Mgcm9sZSAnezB9JyBpcyBub3QgYSB3aWRnZXQgcm9sZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3ZhbGlkX3JvbGVcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyB0YWJiYWJsZSBieSBkZWZhdWx0IHdpdGggb3Igd2l0aG91dCB0YWJpbmRleCwgbGV0IHRoZSBvdGhlciBydWxlcyAoc3VjaCBhcyB3aWRnZXRfdGFiYmFibGVfc2luZ2xlKSB0byBoYW5kbGUgaXRcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIENvbW1vblV0aWwudGFiVGFnTWFwICkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gQ29tbW9uVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAodmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlOiBubyB0YWJpbmRleCBvciB0YWJpbmRleCA8IDBcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50J3MgbmF2aWdhdGlvbiBpcyBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgc3VjaCBhcyBjb21ib2JveFxuICAgICAgICBpZiAoQXJpYVV0aWwuaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc0VsZW1lbnRTY3JvbGxhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgICBcblxuICAgICAgICAvLyBlbGVtZW50cyB3aG9zZSByb2xlcyBhbGxvdyBubyBkZXNjZW5kYW50cyB0aGF0IGFyZSBpbnRlcmFjdGl2ZSBvciB3aXRoIGEgdGFiaW5kZXggPj0gMCBcbiAgICAgICAgLy8gdGhpcyBjYXNlIHNob3VsZCBiZSBoYW5kbGVkIGluIHdpZGdldF90YWJiYWJsZV9zaW5nbGUgYW5kIGFyaWFfY2hpbGRfdGFiYmFibGVcbiAgICAgICAgY29uc3Qgcm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGQgPVtcImJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiaW1nXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInN3aXRjaFwiLCBcInRhYlwiXTtcblxuICAgICAgICBjb25zdCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYXJlbnRfcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQgYXMgRWxlbWVudCk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIHBhcmVudCByb2xlIGlzIGluIHJvbGVzX25vX2ludGVyYWN0aXZlX2NoaWxkXG4gICAgICAgIGlmIChyb2xlc19ub19pbnRlcmFjdGl2ZV9jaGlsZC5pbmNsdWRlcyhwYXJlbnRfcm9sZSkpXG4gICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXJvbGUpIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub192YWxpZF9yb2xlXCIpOyBcbiAgICAgICAgLy8gaWdub3JlICdhcHBsaWNhdGlvbicgcm9sZSB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIGZvY3VzYWJsZSBlbGVtZW50cyB0aGF0IGRvIG5vdCBmb2xsb3cgYSBzdGFuZGFyZCBpbnRlcmFjdGlvbiBwYXR0ZXJuIHN1cHBvcnRlZCBieSBhIHdpZGdldCByb2xlOmh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIzL1BSLVdBSS1BUklBLTEuMi0yMDIzMDMyOC8jYXBwbGljYXRpb24gXG4gICAgICAgIGlmIChyb2xlID09PSBcImFwcGxpY2F0aW9uXCIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2U6IHRhYmluZGV4ID49IDAgdG8gZXhhbWluZSB3aGV0aGVyIGEgd2lkZ2V0IHJvbGUgaXMgc2V0dXAgb3Igbm90IFxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgcm9sZXMgaXMgYSB3aWRnZXQgdHlwZVxuICAgICAgICAvLyBSb3cgaXMgd2VpcmQuIEl0J3Mgc3RydWN0dXJlLCBidXQgY2FuIGFsc28gYmUgd2lkZ2V0XG4gICAgICAgIC8vIEZvY3VzYWJsZSBzZXBhcmF0b3JzIGFyZSB3aWRnZXRzXG4gICAgICAgIGlmIChyb2xlID09PSBcInJvd1wiIHx8IHJvbGUgPT09IFwic2VwYXJhdG9yXCIgfHwgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLnJvbGVUeXBlID09PSAnd2lkZ2V0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRfcm9sZVwiLCBbcm9sZV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgQ29sb3JVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29sb3JVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX29ic2N1cmVkXCI6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIGFuIGVsZW1lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGlzIG5vdCBlbnRpcmVseSBjb3ZlcmVkIGJ5IG90aGVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IGlzIG5vdCBlbnRpcmVseSBjb3ZlcmVkIGJ5IG90aGVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX29ic2N1cmVkXCI6IFwiQ29uZmlybSB0aGF0IHdoZW4gdGhlIGVsZW1lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGlzIG5vdCBjb3ZlcmVkIG9yLCBpZiBjb3ZlcmVkIGJ5IHVzZXIgYWN0aW9uLCBjYW4gYmUgdW5jb3ZlcmVkIHdpdGhvdXQgbW92aW5nIGZvY3VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMi40LjExXCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vIEVhcmx5IGV4aXQ6IGNoZWNrIHZpc2liaWxpdHkgYW5kIHRhYmJhYmlsaXR5IGZpcnN0XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgIFxuICAgICAgICAvLyBFYXJseSBleGl0OiBpZ25vcmUgY2VydGFpbiBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pICE9PSBudWxsXG4gICAgICAgICAgICB8fCBub2RlTmFtZSA9PT0gXCJib2R5XCIgfHwgbm9kZU5hbWUgPT09IFwiaHRtbFwiKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIGlmICghd2luKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIFJldXNlIHNpbmdsZSBET01NYXBwZXIgaW5zdGFuY2VcbiAgICAgICAgY29uc3QgbWFwcGVyOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVhcmx5IGV4aXQ6IGJvdW5kcyBub3QgYXZhaWxhYmxlIG9yIGVsZW1lbnQgaGFzIG5vIGRpbWVuc2lvbnNcbiAgICAgICAgaWYgKCFib3VuZHMgfHwgYm91bmRzLmhlaWdodCA9PT0gMCB8fCBib3VuZHMud2lkdGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFjU3R5bGUpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gUGFyc2Ugei1pbmRleCBvbmNlIGFuZCBjYWNoZVxuICAgICAgICBjb25zdCB6aW5kZXggPSBwYXJzZUludChjU3R5bGUuekluZGV4ID09PSAnYXV0bycgfHwgIWNTdHlsZS56SW5kZXggPyAnMCcgOiBjU3R5bGUuekluZGV4KTtcbiAgICAgICAgXG4gICAgICAgIC8vIE1vcmUgc3BlY2lmaWMgc2VsZWN0b3IgdG8gcmVkdWNlIGl0ZXJhdGlvblxuICAgICAgICBjb25zdCBlbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdib2R5ICo6bm90KHNjcmlwdCk6bm90KHN0eWxlKTpub3QobWV0YSk6bm90KGxpbmspJyk7XG4gICAgICAgIGlmICghZWxlbXMgfHwgZWxlbXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICBcbiAgICAgICAgbGV0IGJlZm9yZSA9IHRydWU7XG4gICAgICAgIGNvbnN0IGJvdW5kc1JpZ2h0ID0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGg7XG4gICAgICAgIGNvbnN0IGJvdW5kc0JvdHRvbSA9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0O1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG9ic2N1cmluZyBlbGVtZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gZWxlbXNbaV07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBhcmUgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICAgICAgICAgKiBJZiB0d28gZWxlbWVudHMgb3ZlcmxhcCBhbmQgei1pbmRleCBhcmUgbm90IGRlZmluZWQsIHRoZW4gdGhlIG5vZGVcbiAgICAgICAgICAgICAqIHJlbmRlcmVkIGVhcmxpZXIgd2lsbCBiZSBvdmVybGFpZCBieSB0aGUgbm9kZSByZW5kZXJlZCBsYXRlci5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLy8gVXNlIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHRvIGNoZWNrIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcHNcbiAgICAgICAgICAgIC8vIE5vdGU6IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHJldHVybnMgMCB3aGVuIGNvbXBhcmluZyBhIG5vZGUgdG8gaXRzZWxmXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHJ1bGVDb250ZXh0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsZW0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkgKDE2KTogZWxlbSBpcyBjb250YWluZWQgYnkgcnVsZUNvbnRleHRcbiAgICAgICAgICAgIC8vIEFsc28gaGFuZGxlIHNlbGYtY29tcGFyaXNvbiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IDAgfHwgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG5leHQgbm9kZSBpbiBlbGVtcyB3aWxsIGJlIGFmdGVyIHRoZSB0YXJnZXQgbm9kZSAocnVsZUNvbnRleHQpXG4gICAgICAgICAgICAgICAgYmVmb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TICg4KTogZWxlbSBjb250YWlucyBydWxlQ29udGV4dFxuICAgICAgICAgICAgLy8gU2tpcCBpZiBlbGVtZW50IGNvbnRhaW5zIHJ1bGVDb250ZXh0IG9yIGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKGVsZW0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTa2lwIGlmIG5vIGJvdW5kcyBvciB6ZXJvIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIGlmICghYm5kcyB8fCBibmRzLmhlaWdodCA9PT0gMCB8fCBibmRzLndpZHRoID09PSAwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBRdWljayBib3VuZHMgY2hlY2s6IGRvZXMgZWxlbSBjb21wbGV0ZWx5IGNvdmVyIHJ1bGVDb250ZXh0P1xuICAgICAgICAgICAgaWYgKGJuZHMudG9wID4gYm91bmRzLnRvcCB8fCBibmRzLmxlZnQgPiBib3VuZHMubGVmdClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYm5kc1JpZ2h0ID0gYm5kcy5sZWZ0ICsgYm5kcy53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGJuZHNCb3R0b20gPSBibmRzLnRvcCArIGJuZHMuaGVpZ2h0O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoYm5kc1JpZ2h0IDwgYm91bmRzUmlnaHQgfHwgYm5kc0JvdHRvbSA8IGJvdW5kc0JvdHRvbSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2hlY2sgei1pbmRleCB0byBkZXRlcm1pbmUgaWYgZWxlbSBvYnNjdXJlcyBydWxlQ29udGV4dFxuICAgICAgICAgICAgY29uc3QgelN0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBpZiAoIXpTdHlsZSkgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGVsZW1aaW5kZXggPSBwYXJzZUludCh6U3R5bGUuekluZGV4ID09PSAnYXV0bycgfHwgIXpTdHlsZS56SW5kZXggfHwgaXNOYU4oTnVtYmVyKHpTdHlsZS56SW5kZXgpKSA/ICcwJyA6IHpTdHlsZS56SW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBiZWZvcmUgcnVsZUNvbnRleHQgaW4gRE9NIG9yZGVyLCBlbGVtIG11c3QgaGF2ZSBoaWdoZXIgei1pbmRleCB0byBvYnNjdXJlXG4gICAgICAgICAgICAvLyBJZiBhZnRlciBydWxlQ29udGV4dCBpbiBET00gb3JkZXIsIGVsZW0gY2FuIG9ic2N1cmUgd2l0aCBlcXVhbCBvciBoaWdoZXIgei1pbmRleFxuICAgICAgICAgICAgaWYgKChiZWZvcmUgJiYgZWxlbVppbmRleCA+IHppbmRleCkgfHwgKCFiZWZvcmUgJiYgZWxlbVppbmRleCA+PSB6aW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZWxlbWVudCBoYXMgb3BhcXVlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICBsZXQgaGFzT3BhcXVlQmFja2dyb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh6U3R5bGUuYmFja2dyb3VuZCAmJiB6U3R5bGUuYmFja2dyb3VuZCAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnQ29sb3IgPSBDb2xvclV0aWwuQ29sb3IoelN0eWxlLmJhY2tncm91bmQpO1xuICAgICAgICAgICAgICAgICAgICBoYXNPcGFxdWVCYWNrZ3JvdW5kID0gYmdDb2xvciAmJiAoYmdDb2xvci5hbHBoYSA9PT0gdW5kZWZpbmVkIHx8IGJnQ29sb3IuYWxwaGEgPiAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPcGFxdWVCYWNrZ3JvdW5kICYmIHpTdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdDb2xvciA9IENvbG9yVXRpbC5Db2xvcih6U3R5bGUuYmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzT3BhcXVlQmFja2dyb3VuZCA9IGJnQ29sb3IgJiYgKGJnQ29sb3IuYWxwaGEgPT09IHVuZGVmaW5lZCB8fCBiZ0NvbG9yLmFscGhhID4gMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaGFzIG5vIGNvbnRlbnQgYW5kIG5vIG9wYXF1ZSBiYWNrZ3JvdW5kLCBza2lwIGl0XG4gICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtKSAmJiAhaGFzT3BhcXVlQmFja2dyb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb2JzY3VyZWRcIiwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X3RhYmJhYmxlX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3Zpc2libGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgdGFiYmFibGUgZWxlbWVudCBzaG91bGQgYmUgdmlzaWJsZSBvbiB0aGUgc2NyZWVuIHdoZW4gaXQgaGFzIGtleWJvYXJkIGZvY3VzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBpcyB2aXNpYmxlIG9uIHRoZSBzY3JlZW5cIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3Zpc2libGVcIjogXCJDb25maXJtIHRoZSBlbGVtZW50IHNob3VsZCBiZSB0YWJiYWJsZSBhbmQgaWYgc28sIGl0IGJlY29tZXMgdmlzaWJsZSB3aGVuIGl0IGhhcyBrZXlib2FyZCBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuNC43XCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IG1hcHBlciA6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgYWxsIG5lZWRlZCBzdHlsZXMgaW4gYSBzaW5nbGUgcGFzcyB0aHJvdWdoIHN0eWxlc2hlZXRzXG4gICAgICAgIGNvbnN0IGFsbFN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKHJ1bGVDb250ZXh0LCBbXCJwb3NpdGlvblwiLCBcImNsaXBcIl0sIFtcIlwiLCBcIjpmb2N1c1wiXSk7XG4gICAgICAgIGNvbnN0IGRlZmluZWRfc3R5bGVzID0gYWxsU3R5bGVzW1wiXCJdO1xuICAgICAgICBjb25zdCBvbmZvY3VzX3N0eWxlcyA9IGFsbFN0eWxlc1tcIjpmb2N1c1wiXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKGJvdW5kc1snaGVpZ2h0J10gPT09IDAgfHwgYm91bmRzWyd3aWR0aCddID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdmlzaWJsZVwiLCBbXSk7XG5cbiAgICAgICAgaWYgKGRlZmluZWRfc3R5bGVzWydwb3NpdGlvbiddPT09J2Fic29sdXRlJyAmJiBkZWZpbmVkX3N0eWxlc1snY2xpcCddICYmIGRlZmluZWRfc3R5bGVzWydjbGlwJ10ucmVwbGFjZUFsbCgnICcsICcnKT09PSdyZWN0KDBweCwwcHgsMHB4LDBweCknXG4gICAgICAgICAgICAmJiAhb25mb2N1c19zdHlsZXNbJ2NsaXAnXSkge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBub3RlIHRoYXQgQSB1c2VyIGNhbiBzZWxlY3QgYSBjaGVja2JveCBhbmQgcmFkaW8gYnV0dG9uIGJ5IHNlbGVjdGluZyB0aGUgYnV0dG9uIG9yIHRoZSBsYWJlbCB0ZXh0LlxuICAgICAgICAgICAgICogV2hlbiBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbiBpcyBjbGlwcGVkIHRvIDAgc2l6ZSwgaXQgaXMgc3RpbGwgYXZhaWxhYmxlIHRvIGEga2V5Ym9hcmQgb3IgYSBzY3JlZW4gcmVhZGVyLlxuICAgICAgICAgICAgICogVGhlIHJ1bGUgc2hvdWxkIGJlIHBhc3NlZCBpZiB0aGUgbGFiZWwgdGV4dCBleGlzdHMgYW5kIHRoZSBidXR0b24gb24tZm9jdXMgc3R5bGUgaXMgZGVmaW5lZCBieSB0aGUgdXNlcixcbiAgICAgICAgICAgICAqIHdoaWNoIGxpa2VseSBpbmN1cnMgdGhlIGNoYW5nZXMgb2YgdGhlIGxhYmVsIHN0eWxlLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgndHlwZScpPT09J2NoZWNrYm94JyB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKT09PSdyYWRpbycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobGFiZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCBhZGRpdGlvbmFsIHBzZXVkby1jbGFzcyBzdHlsZXMgKHJldXNlIG9uZm9jdXNfc3R5bGVzIGZyb20gbGluZSA2MClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvU3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzTXVsdGlwbGUocnVsZUNvbnRleHQsIG51bGwsIFtcIjpmb2N1cy12aXNpYmxlXCIsIFwiOmZvY3VzLXdpdGhpblwiLCBcIjpjaGVja2VkXCIsIFwiOmZvY3VzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNfdmlzaWJsZV9zdHlsZXMgPSBwc2V1ZG9TdHlsZXNbXCI6Zm9jdXMtdmlzaWJsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNfd2l0aGluX3N0eWxlcyA9IHBzZXVkb1N0eWxlc1tcIjpmb2N1cy13aXRoaW5cIl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRfc3R5bGVzID0gcHNldWRvU3R5bGVzW1wiOmNoZWNrZWRcIl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uZm9jdXNfc3R5bGVzID0gcHNldWRvU3R5bGVzW1wiOmZvY3VzXCJdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbmZvY3VzX3N0eWxlcyB8fCBmb2N1c192aXNpYmxlX3N0eWxlcyB8fCBmb2N1c193aXRoaW5fc3R5bGVzIHx8IGNoZWNrZWRfc3R5bGVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3VuZHNbJ3RvcCddID49IDAgJiYgYm91bmRzWydsZWZ0J10gPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkZWZhdWx0X3N0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgbGV0IHRvcCA9IGJvdW5kc1sndG9wJ107XG4gICAgICAgIGxldCBsZWZ0ID0gYm91bmRzWydsZWZ0J107XG4gICAgICAgXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvbmZvY3VzX3N0eWxlcykubGVuZ3RoID09PSAwICkge1xuICAgICAgICAgICAgLy8gbm8gb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2UsIGJ1dCBjb3VsZCBiZSBjaGFuZ2VkIGZyb20ganNcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gd2l0aCBvbmZvY3VzIHBvc2l0aW9uIGNoYW5nZVxuICAgICAgICAgICAgdmFyIHBvc2l0aW9ucyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ3RvcCddICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbnMuaW5jbHVkZXMob25mb2N1c19zdHlsZXNbJ3Bvc2l0aW9uJ10pIHx8ICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ3Bvc2l0aW9uJ10gPT09ICd1bmRlZmluZWQnICYmIHBvc2l0aW9ucy5pbmNsdWRlcyhkZWZhdWx0X3N0eWxlc1sncG9zaXRpb24nXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IG9uZm9jdXNfc3R5bGVzWyd0b3AnXS5yZXBsYWNlKC9cXEQvZywnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBvc2l0aW9uIGlzIHVuZGVmaW5lZCBhbmQgdGhlIHBhcmVudCdzIHBvc2l0aW9uIGlzICdyZWxhdGl2ZSdcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydsZWZ0J10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9ucy5pbmNsdWRlcyhvbmZvY3VzX3N0eWxlc1sncG9zaXRpb24nXSkgfHwgKHR5cGVvZiBvbmZvY3VzX3N0eWxlc1sncG9zaXRpb24nXSA9PT0gJ3VuZGVmaW5lZCcgJiYgcG9zaXRpb25zLmluY2x1ZGVzKGRlZmF1bHRfc3R5bGVzWydwb3NpdGlvbiddKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG9uZm9jdXNfc3R5bGVzWydsZWZ0J10ucmVwbGFjZSgvXFxEL2csJycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBpcyB1bmRlZmluZWQgYW5kIHRoZSBwYXJlbnQncyBwb3NpdGlvbiBpcyAncmVsYXRpdmUnXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBOdW1iZXIuTUlOX1ZBTFVFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRvcCA+PSAwICYmIGxlZnQgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVtYmVkX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZW1iZWRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmVtYmVkXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRW1iZWRfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSA8ZW1iZWQ+IGVsZW1lbnQgaGFzIGFsdGVybmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm92aWRlIGFsdGVybmF0aXZlIGNvbnRlbnQgZm9yIDxlbWJlZD4gZWxlbWVudHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVtb3RpY29uc19hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImVtb3RpY29uc19hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RleHRfRW1vdGljb25zXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVtb3RpY29uc19hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbW90aWNvbnNfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZW1vdGljb25zX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGVtb3RpY29ucyBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVtb3RpY29ucyBtdXN0IGhhdmUgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZWlyIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBEZWNpc2lvbiBpbiBwbGFubmluZyA5LzcvMjMgdGhhdCB0aGlzIHJ1bGUgY2F1c2VzIG1vcmUgcmV2aWV3cyB0aGF0IHdlIHNlZSBhY3R1YWwgcHJvYmxlbXMgaW4gY29udGVudCwgc28gdHVybiB0aGVzZSBydWxlcyBvZmZcbiAgICBcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgZW1vdGljb25zOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIjotKVwiLCBcIjopXCIsIFwiOm8pXCIsIFwiOl1cIiwgXCI6M1wiLCBcIjpjKVwiLCBcIjo+XCIsIFwiPV1cIiwgXCI4KVwiLCBcIj0pXCIsIFwiOkRcIiwgXCJDOlwiLFxuICAgICAgICAgICAgICAgICAgICBcIjotRFwiLCBcIjpEXCIsIFwiOERcIiwgXCJYRFwiLCBcIj1EXCIsIFwiPTNcIiwgXCI8PTNcIiwgXCI8PThcIiwgXCItLSEtLVwiLCBcIjotKFwiLCBcIjooXCIsIFwiOmNcIiwgXCI6PFwiLCBcIjpbXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiRDpcIiwgXCJEOFwiLCBcIkQ7XCIsIFwiRD1cIiwgXCJEWFwiLCBcInYudlwiLCBcIjotOVwiLCBcIjstKVwiLCBcIjspXCIsIFwiKilcIiwgXCI7XVwiLCBcIjtEXCIsIFwiOi1QXCIsIFwiOlBcIixcbiAgICAgICAgICAgICAgICAgICAgXCI6LXBcIiwgXCI6cFwiLCBcIj1wXCIsIFwiOi3DnlwiLCBcIjrDnlwiLCBcIjotYlwiLCBcIjpiXCIsIFwiOi1PXCIsIFwiOk9cIiwgXCJPX09cIiwgXCJvX29cIiwgXCI4T1wiLCBcIk93T1wiLCBcIk8tT1wiLFxuICAgICAgICAgICAgICAgICAgICBcIjBfb1wiLCBcIk9fb1wiLCBcIk8zT1wiLCBcIm8wb8KgO29fbztcIiwgXCJvLi4ub1wiLCBcIjB3MFwiLCBcIjotL1wiLCBcIjovXCIsIFwiOlxcXFxcIiwgXCI9L1wiLCBcIj1cXFxcXCIsIFwiOlNcIiwgXCI6fFwiLFxuICAgICAgICAgICAgICAgICAgICBcImQ6LSlcIiwgXCJxQi0pXCIsIFwiOil+XCIsIFwiOi0pPi4uLi5cIiwgXCI6LVhcIiwgXCI6WFwiLCBcIjotI1wiLCBcIjojXCIsIFwiTzotKVwiLCBcIjA6M1wiLCBcIk86KVwiLCBcIjonKFwiLCBcIjsqKFwiLFxuICAgICAgICAgICAgICAgICAgICBcIlRfVFwiLCBcIlRUX1RUXCIsIFwiVC5UXCIsIFwiOi0qXCIsIFwiOipcIiwgXCJebylcIiwgXCI+OilcIiwgXCI+OylcIiwgXCI+Oi0pXCIsIFwiQilcIiwgXCJCLSlcIiwgXCI4KVwiLCBcIjgtKVwiLFxuICAgICAgICAgICAgICAgICAgICBcIl4+Lj5eXCIsIFwiXjwuPF5cIiwgXCJePl8+XlwiLCBcIl48XzxeXCIsIFwiRDo8XCIsIFwiPjooXCIsIFwiRC06PFwiLCBcIj46LShcIiwgXCI6LUBbMV1cIiwgXCI7KFwiLCBcImBfwrRcIiwgXCJEPFwiLFxuICAgICAgICAgICAgICAgICAgICBcIjwzXCIsIFwiPDMzM1wiLCBcIj1eX149XCIsIFwiPT4uPj1cIiwgXCI9PF88PVwiLCBcIj0+Ljw9XCIsIFwiXFxcXCwsL1wiLCBcIlxcXFxtL1wiLCBcIlxcXFxtL1xcXFw+LjwvXFxcXG0vXCIsIFwiXFxcXG8vXCIsIFwiXFxcXG8gby9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvL1xcXFxvXCIsIFwiOiZcIiwgXCI6dVwiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZW1vdGljb25zID0gdmFsaWRhdGVQYXJhbXMuZW1vdGljb25zLnZhbHVlO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHRlc3RUZXh0ID0gXCJcIjtcblxuICAgICAgICBsZXQgd2Fsa05vZGU6IE5vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICB0ZXN0VGV4dCArPSBcIiBcIiArIHdhbGtOb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdFRleHQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBwYXNzZWQgJiYgaiA8IGVtb3RpY29ucy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGxldCBlbW90SWR4ID0gdGVzdFRleHQuaW5kZXhPZihlbW90aWNvbnNbal0pO1xuICAgICAgICAgICAgICAgIGxldCBlTG5ndGggPSBlbW90aWNvbnNbal0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgZW1vdElkeCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQYXNzZXMgaWY6IHRoZSBlbW90aWNvbiBpcyBub3QgcHJlY2VkZWQgYnkgd2hpdGVzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIGVtb3RpY29uIGlzIG5vdCBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIHVubGVzcyBpdCdzIHB1bmN0dWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAvLyBvciBpdCdzIGluIGEgcHJlLCBjb2RlLCBvciBzY3JpcHRcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIChlbW90SWR4ID4gMCAmJiAhL1xccy8udGVzdCh0ZXN0VGV4dC5zdWJzdHJpbmcoZW1vdElkeCAtIDEsIGVtb3RJZHgpKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChlbW90SWR4IDwgdGVzdFRleHQubGVuZ3RoIC0gZUxuZ3RoICYmICEvXFxzLy50ZXN0KHRlc3RUZXh0LnN1YnN0cmluZyhlbW90SWR4ICsgZUxuZ3RoLCBlbW90SWR4ICsgZUxuZ3RoICsgMSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIS9bLiwhJ1wiP10vLnRlc3QodGVzdFRleHQuc3Vic3RyaW5nKGVtb3RJZHggKyBlTG5ndGgsIGVtb3RJZHggKyBlTG5ndGggKyAxKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IHVzYWdlIG9mICg6IHN0dWZmIDopIHNpbmNlIHRoaXMgaXMgYSBjb21tZW50IGluIHNvbWUgbGFuZ3VhZ2VzXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKGVtb3RpY29uc1tqXSA9PSBcIjopXCIgfHwgZW1vdGljb25zW2pdID09IFwiKDpcIikgJiYgL1xcKFxcOi4qXFw6XFwpLy50ZXN0KHRlc3RUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKGVtb3RpY29uc1tqXSA9PSBcIjspXCIgfHwgZW1vdGljb25zW2pdID09IFwiKDtcIikgJiYgL1xcKFxcOy4qXFw7XFwpLy50ZXN0KHRlc3RUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIGVtb3RJZHggPSB0ZXN0VGV4dC5pbmRleE9mKGVtb3RpY29uc1tqXSwgZW1vdElkeCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdCwgcHJlLCBjb2RlXG4gICAgICAgICAgICBsZXQgY2hlY2tBbmNlc3RvciA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInByZVwiLCBcImNvZGVcIiwgXCJzY3JpcHRcIiwgXCJib2R5XCJdKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNoZWNrQW5jZXN0b3IgPT0gbnVsbCB8fCBjaGVja0FuY2VzdG9yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gXCJib2R5XCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlcnJvcl9tZXNzYWdlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJlcnJvcl9tZXNzYWdlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1pbnZhbGlkPXRydWVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfRXJyb3JNZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJlcnJvcl9tZXNzYWdlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDdXN0b20gZXJyb3IgbWVzc2FnZSBoYXMgaW52YWxpZCByZWZlcmVuY2UgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJDdXN0b20gZXJyb3IgbWVzc2FnZSBpcyBub3QgdmlzaWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgbXVzdCByZWZlcmVuY2UgYSB2YWxpZCAnaWQnIHZhbHVlIGFuZCB3aGVuIHRyaWdnZXJlZCB0aGUgbWVzc2FnZSBtdXN0IGJlIGFwcHJvcHJpYXRlbHkgZXhwb3NlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGFyaWFfZXJyTXNnSWQgPSBBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXJyb3JtZXNzYWdlXCIpO1xuXG4gICAgICAgIC8vIElmIGFyaWEtZXJyb3JtZXNzYWdlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBPVVRfT0ZfU0NPUEVcbiAgICAgICAgaWYgKCFhcmlhX2Vyck1zZ0lkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtc2dfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGFyaWFfZXJyTXNnSWQpO1xuXG4gICAgICAgIC8vIFBPRjA6IEludmFsaWQgaWQgcmVmZXJlbmNlXG4gICAgICAgIGlmICghbXNnX2VsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMTogUmVmZXJlbmNlZCBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG1zZ19lbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZmllbGRzZXRfbGFiZWxfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JvdXBcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImdyb3VwX3dpdGhJbnB1dHNfaGFzTmFtZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcIlBhc3NfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJmaWVsZHNldF9sYWJlbF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiR3JvdXAvRmllbGRzZXQgXFxcInswfVxcXCIgd2l0aCBhbiBpbnB1dCBoYXMgYSB1bmlxdWUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJHcm91cC9GaWVsZHNldCBkb2VzIG5vdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJHcm91cC9GaWVsZHNldCBcXFwiezB9XFxcIiBoYXMgYSBkdXBsaWNhdGUgbmFtZSB0byBhbm90aGVyIGdyb3VwXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiR3JvdXBzIHdpdGggbmVzdGVkIGlucHV0cyBtdXN0IGhhdmUgdW5pcXVlIGFjY2Vzc2libGUgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiLCBcIjMuMy4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZm9ybUNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibGFuZG1hcmtfZ3JvdXBfaW5wdXRcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICBmb3JtQ2FjaGUgPSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0czogW10sXG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzVGVtcCA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAnZmllbGRzZXQsW3JvbGU9XCJncm91cFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzID0gQXJyYXkuZnJvbShhbGxHcm91cHNUZW1wKTtcbiAgICAgICAgICAgIGxldCBncm91cHNXaXRoSW5wdXRzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGdyb3VwIG5vZGVzXG4gICAgICAgICAgICAgICAgaWYgKGFsbEdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0cy5wdXNoKGFsbEdyb3Vwc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShncm91cHNXaXRoSW5wdXRzW2ldKTtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAvKipBUklBTWFwcGVyLmNvbXB1dGVOYW1lKGdyb3Vwc1dpdGhJbnB1dHNbaV0pKi9cbiAgICAgICAgICAgICAgICAgICAgcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwID8gcGFpci5uYW1lLnRyaW0oKSA6IFwiXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHMgPSBncm91cHNXaXRoSW5wdXRzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzO1xuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJsYW5kbWFya19ncm91cF9pbnB1dFwiLGZvcm1DYWNoZSk7ICAgIFxuICAgICAgICB9XG4gICAgICAgIC8vIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzOiBcIiArZWxlbWVudC5pZClcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsczogXCIgK2Zvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsczogXCIgK2Zvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMubGVuZ3RoKVxuXG4gICAgICAgIGxldCBydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZyA9IGZhbHNlO1xuICAgICAgICBsZXQgY29tcHV0ZWROYW1lID0gXCJcIjtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0cykge1xuICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhdmUgYW55IGdyb3VwcyB3aXRoIGlucHV0cy4gVGhlcmVmb3JlIHdlIHNob3VsZCBza2lwIHRoaXMgcnVsZSB0cmlnZ2VyLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaXNTYW1lTm9kZShmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c1tpXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIG91ciBydWxlQ29udGV4dCBpbiB0aGUgY2FjaGVcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PSBcIlwiIHx8XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IG51bGxcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGYWlsXzFcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZm91bmRTYW1lTmFtZUZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGogPCBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaisrXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9IC8vIFdlIGRvIG5vdCB3YW50IHRvIGNvbXBhcmUgYWdhaW5zdCBvdXJzZWxmc1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU2FtZU5hbWVGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZm91bmRTYW1lTmFtZUZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGYWlsXzJcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0sXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wdXRlZE5hbWUgPSBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcnVsZUNvbnRleHRGb3VuZEluZ3JvdXBzV2l0aElucHV0c0ZsYWcpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibnVsbCByZXR1cm5cIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUGFzc18xXCIpXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMVwiLCBbY29tcHV0ZWROYW1lXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmaWVsZHNldF9sZWdlbmRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206ZmllbGRzZXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9GaWVsZHNldF9IYXNMZWdlbmRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSA8bGVnZW5kPlwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCI8ZmllbGRzZXQ+IGVsZW1lbnQgaGFzIG1vcmUgdGhhbiBvbmUgPGxlZ2VuZD5cIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IDxsZWdlbmQ+IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiIDxmaWVsZHNldD4gZWxlbWVudHMgc2hvdWxkIGhhdmUgYSBzaW5nbGUsIG5vbi1lbXB0eSA8bGVnZW5kPiBhcyBhIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSwgIC8vaHR0cHM6Ly93d3cudzMub3JnL1dBSS9XQ0FHMjIvVGVjaG5pcXVlcy9odG1sL0g3MVxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAvL3NraXAgaWYgdGhlIGZpZWxkc2V0IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYSBsZWdlbmQgaXMgaGlkZGVuLCB3ZSBzaG91bGQgc3RpbGwgdHJpZ2dlciBhIHZpb2xhdGlvbnMgZm9yIHRoaXNcbiAgICAgICAgbGV0IGxlZ2VuZHMgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4ocnVsZUNvbnRleHQsIFwibGVnZW5kXCIsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgaWYgKGxlZ2VuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgTk8gTGVnZW5kXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSBpZiAobGVnZW5kcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgbW9yZSB0aGFuIG9uZSBsZWdlbmRcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChDb21tb25VdGlsLmdldElubmVyVGV4dChsZWdlbmRzWzBdKS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgbGVnZW5kIGJ1dCBsZWdlbmQgaXMgZW1wdHlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmaWd1cmVfbGFiZWxfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImZpZ3VyZV9sYWJlbF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpmaWd1cmVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfRmlndXJlX2xhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZmlndXJlX2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPGZpZ3VyZT4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIDxmaWd1cmU+IGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQuIHRoaXMgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzIHJ1bGVzXG4gICAgICAgIGxldCByb2xlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtcbiAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9sZXQgcGFzc2VkID0gQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcGFzc2VkID0gcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9mb250X2NvbG9yOiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1fZm9udF9jb2xvclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9Gb250X0NvbG9ySW5Gb3JtXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fZm9udF9jb2xvci5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZm9ybV9mb250X2NvbG9yLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2ZvbnRfY29sb3IuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNoZWNrIGNvbG9yIGlzIG5vdCB1c2VkIGFzIHRoZSBvbmx5IHZpc3VhbCBtZWFucyB0byBjb252ZXkgd2hpY2ggZmllbGRzIGFyZSByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbWJpbmUgY29sb3IgYW5kIGRlc2NyaXB0aXZlIG1hcmt1cCB0byBpbmRpY2F0ZSByZXF1aXJlZCBmb3JtIGZpZWxkc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmb250cyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9udFwiKTtcbiAgICAgICAgaWYgKGZvbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhZm9udHNbaV0uaGFzQXR0cmlidXRlKFwiY29sb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1faW50ZXJhY3Rpb25fcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206Zm9ybVt0YXJnZXRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRm9ybV9UYXJnZXRBbmRUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX2ludGVyYWN0aW9uX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGludGVyYWN0aW5nIHdpdGggY29udGVudCB3aWxsIG5vdCBvcGVuIHBvcC11cCB3aW5kb3dzIG9yIGNoYW5nZSB0aGUgYWN0aXZlIHdpbmRvdyB3aXRob3V0IGluZm9ybWluZyB0aGUgdXNlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZXIgc2hvdWxkIGJlIGluZm9ybWVkIGluIGFkdmFuY2Ugd2hlbiBpbnRlcmFjdGluZyB3aXRoIGNvbnRlbnQgY2F1c2VzIGEgY2hhbmdlIG9mIGNvbnRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBwYXJhbVdpblRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wibmV3IHdpbmRvd1wiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdFN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRTdHIgPT09IFwiX3BhcmVudFwiIHx8IHRTdHIgPT09IFwiX3NlbGZcIiB8fCB0U3RyID09PSBcIl90b3BcIiB8fCBDb21tb25VdGlsLmdldEZyYW1lQnlOYW1lKHJ1bGVDb250ZXh0LCB0U3RyKSAhPSBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gTmFtZSBpcyBub3QgcGFydCBvZiB0aGlzIGZyYW1lc2V0IOKAkyBtdXN0IGhhdmUgcG90ZW50aWFsIHRvIGNyZWF0ZSBuZXcgd2luZG93P1xuICAgICAgICAgICAgLy8gU2VlIGlmIGEgbmV3IHdpbmRvdyBpcyBtZW50aW9uZWRcbiAgICAgICAgICAgIGxldCB0ZXh0U3RyID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKVxuICAgICAgICAgICAgICAgIHRleHRTdHIgKz0gXCIgXCIgKyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCB2YWxpZGF0ZVBhcmFtcy5wYXJhbVdpblRleHQudmFsdWUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgaWYgKHRleHRTdHIuaW5kZXhPZih2YWxpZGF0ZVBhcmFtcy5wYXJhbVdpblRleHQudmFsdWVbaV0pICE9IC0xKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbTpsYWJlbFtmb3JdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGFiZWxfVW5pcXVlRm9yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGb3JtIGNvbnRyb2wgaGFzIG1vcmUgdGhhbiBvbmUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGb3JtIGNvbnRyb2xzIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgbGV0IGxhYmVsSWRzID0gQ2FjaGVVdGlsLmdldENhY2hlKEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KSwgXCJSUFRfTGFiZWxfU2luZ2xlXCIsIHt9KVxuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhKGlkIGluIGxhYmVsSWRzKTtcbiAgICAgICAgbGFiZWxJZHNbaWRdID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1fc3VibWl0X2J1dHRvbl9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Gb3JtX0hhc1N1Ym1pdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlIDxmb3JtPiBlbGVtZW50IGhhcyBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Zm9ybT4gZWxlbWVudCBzaG91bGQgaGF2ZSBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIHN1Ym1pdCBidXR0b25zIGFyZSB1c3VhbGx5IGF0IHRoZSBib3R0b20gLSB3YWxrIGJhY2t3YXJkc1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiBudy5wcmV2Tm9kZSgpICYmIG53Lm5vZGUgIT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW53LmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHR5cGUgPT09IFwic3VibWl0XCIgfHwgdHlwZSA9PT0gXCJpbWFnZVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImJ1dHRvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN1Ym1pdFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IEFyaWFVdGlsLmhhc1JvbGUobncubm9kZSwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBmb3JtX3N1Ym1pdF9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0W29uY2hhbmdlXSwgZG9tOmlucHV0W29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0Zvcm1fQ2hhbmdlRW1wdHlcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9zdWJtaXRfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZvcm1fc3VibWl0X3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgZm9ybSBkb2VzIG5vdCBzdWJtaXQgYXV0b21hdGljYWxseSB3aXRob3V0IHdhcm5pbmdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGZvcm0gc2hvdWxkIG5vdCBiZSBzdWJtaXR0ZWQgYXV0b21hdGljYWxseSB3aXRob3V0IHdhcm5pbmcgdGhlIHVzZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSwqL1xuICAgIC8vZGVwcmVjYXRlIHRoZSBydWxlIG9uIEp1biAxMCwgMjAyNFxuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmNoYW5nZVwiKS50cmltKCkubGVuZ3RoID09PSAwO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZnJhbWVfc3JjX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImZyYW1lX3NyY192YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZyYW1lLCBkb206aWZyYW1lXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0ZyYW1lX1NyY0h0bWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZyYW1lX3NyY192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZnJhbWVfc3JjX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmcmFtZV9zcmNfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSA8ZnJhbWU+IGNvbnRlbnQgaXMgYWNjZXNzaWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGZyYW1lPiBjb250YWluaW5nIG5vbi1IVE1MIGNvbnRlbnQgbXVzdCBiZSBtYWRlIGFjY2Vzc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwic3JjXCIpICYmXG4gICAgICAgICAgICBDb21tb25VdGlsLmlzSHRtbEV4dChDb21tb25VdGlsLmdldEZpbGVFeHQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpKSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZyYW1lX3RpdGxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJmcmFtZV90aXRsZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpmcmFtZSwgZG9tOmlmcmFtZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ZyYW1lX0hhc1RpdGxlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbmxpbmUgZnJhbWVzIG11c3QgaGF2ZSBhIHVuaXF1ZSwgbm9uLWVtcHR5ICd0aXRsZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIklubGluZSBmcmFtZSBkb2VzIG5vdCBoYXZlIGEgJ3RpdGxlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgLypDaGFuZ2UgbWFwcGluZyB0byA0LjEuMiBmcm9tIDIuNC4xIHR5cG8/ICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBcImNhZTc2MFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZC4gdGhpcyBjYXNlIHdpbGwgYmUgY292ZXJlZCBpbiB0aGUgYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMgcnVsZXNcbiAgICAgICAgbGV0IHJvbGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICBpZiAocm9sZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAobmFtZV9wYWlyICYmIG5hbWVfcGFpci5uYW1lICYmIG5hbWVfcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGhlYWRpbmdfY29udGVudF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmgxLCBkb206aDIsIGRvbTpoMywgZG9tOmg0LCBkb206aDUsIGRvbTpoNlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0hlYWRlcl9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImhlYWRpbmdfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImhlYWRpbmdfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJIZWFkaW5nIGVsZW1lbnQgaGFzIGRlc2NyaXB0aXZlIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSGVhZGluZyBlbGVtZW50IGhhcyBubyBkZXNjcmlwdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSGVhZGluZyBlbGVtZW50cyBtdXN0IHByb3ZpZGUgZGVzY3JpcHRpdmUgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjZcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID1Db21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBoZWFkaW5nX21hcmt1cF9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aDEsIGRvbTpoMiwgZG9tOmgzLCBkb206aDQsIGRvbTpoNSwgZG9tOmg2XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0hlYWRlcnNfRmV3V29yZHNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJoZWFkaW5nX21hcmt1cF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImhlYWRpbmdfbWFya3VwX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIGhlYWRpbmcgZWxlbWVudCBpcyBhIGdlbnVpbmUgaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkhlYWRpbmcgZWxlbWVudHMgbXVzdCBub3QgYmUgdXNlZCBmb3IgcHJlc2VudGF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGhlYWRpbmdMZW5ndGhUaHJlc2g6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMjAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgaGVhZGluZ0xlbmd0aFRocmVzaCA9IHZhbGlkYXRlUGFyYW1zLmhlYWRpbmdMZW5ndGhUaHJlc2gudmFsdWU7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLndvcmRDb3VudChDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkpIDw9IGhlYWRpbmdMZW5ndGhUaHJlc2g7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBbmNlc3RvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3JcIjtcbmltcG9ydCB7IExhbmdVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xhbmdcIjtcblxuZXhwb3J0IGNvbnN0IGh0bWxfbGFuZ19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9IdG1sX0hhc0xhbmdcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIkZhaWxfNFwiLFxuICAgICAgICAgICAgXCJGYWlsXzVcIjogXCJGYWlsXzVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQb3RlbnRpYWxfNVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBvdGVudGlhbF82XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzZcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSBtdXN0IGlkZW50aWZ5IHRoZSBkZWZhdWx0IGxhbmd1YWdlIG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgJ2xhbmcnIGF0dHJpYnV0ZVwiLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFnZSBsYW5ndWFnZSBkZXRlY3RlZCBhcyBcXFwiezB9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCwgYnV0IGhhcyBuZWl0aGVyICdsYW5nJyBub3IgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwsIGJ1dCBkb2VzIG5vdCBoYXZlIGFuICd4bWw6bGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgSFRNTCwgYnV0IGRvZXMgbm90IGhhdmUgYSAnbGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlBhZ2UgZGV0ZWN0ZWQgd2l0aCAnbGFuZycgYW5kICd4bWw6bGFuZycgYXR0cmlidXRlcyBhbmQgcHJpbWFyeSBsYW5ndWFnZXMgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiUGFnZSBkZXRlY3RlZCB3aXRoICdsYW5nJyBhbmQgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCB3aXRoIG9ubHkgYSAnbGFuZycgYXR0cmlidXRlLiBDb25maXJtIHRoYXQgcGFnZSBpcyBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sIG1pbWUgdHlwZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwgMS4wIHdpdGggb25seSBhbiAneG1sOmxhbmcnIGF0dHJpYnV0ZS4gQ29uZmlybSB0aGF0IHBhZ2UgaXMgb25seSBkZWxpdmVyZWQgdmlhIHhtbCBtaW1lIHR5cGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIzLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF82XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCI1YjdhZTBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUaGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgaW5zaWRlIGEgcHJlc2VudGF0aW9uYWwgZnJhbWVcbiAgICAgICAgaWYgKEFuY2VzdG9yVXRpbC5pc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaGllcykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBkb2N0eXBlU3RyaW5nID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlID8gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlLnB1YmxpY0lkIDogXCJcIjtcbiAgICAgICAgaWYgKCFkb2N0eXBlU3RyaW5nKSBkb2N0eXBlU3RyaW5nID0gXCJcIjtcbiAgICAgICAgbGV0IGxhbmcgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpO1xuICAgICAgICBsZXQgbGFuZ1hNTCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuXG4gICAgICAgIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmICFkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKFwiMS4wXCIpKSB7XG4gICAgICAgICAgICBpZiAoIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCAhPSAxLjAgKG11c3QgaGF2ZSB4bWw6bGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmdYTUxdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmIGRvY3R5cGVTdHJpbmcuaW5jbHVkZXMoXCIxLjBcIikpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBYSFRNTCAxLjBcbiAgICAgICAgICAgIC8vIElmIG5laXRoZXIgaXMgcHJvdmlkZWQsIGl0J3MgYSBmYWlsdXJlXG4gICAgICAgICAgICBpZiAoIWxhbmcgJiYgIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbm8gbGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyAmJiBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhbmcgIT09IGxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmcpIHx8ICFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgRWxlbV9MYW5nX1ZhbGlkIGhhbmRsZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUxhbmdVdGlsLm1hdGNoUHJpbWFyeUxhbmcobGFuZywgbGFuZ1hNTCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZywgYnV0IHRoZXkgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNFwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNVwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIixbbGFuZ10pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gWEhUTUwgYW5kIG9ubHkgbGFuZyAob2theSBpZiBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzVcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBvbmx5IHhtbDpsYW5nIChva2F5IGlmIG9ubHkgZGVsaXZlcmVkIHZpYSB4bWwgbWltZSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWxhbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgJiYgbGFuZ1hNTCkge1xuICAgICAgICAgICAgICAgIC8vIEhUTUw1IHBvbHlnbG90IGRvY3VtZW50c1xuICAgICAgICAgICAgICAgIGlmIChsYW5nICE9PSBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nKSB8fCAhTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nWE1MKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IEVsZW1fTGFuZ19WYWxpZCBoYW5kbGUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5tYXRjaFByaW1hcnlMYW5nKGxhbmcsIGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcsIGJ1dCB0aGV5IGRvbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzRcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzVcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG4gICAgXG5leHBvcnQgY29uc3QgaHRtbF9za2lwbmF2X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJodG1sX3NraXBuYXZfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0h0bWxfU2tpcE5hdlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfc2tpcG5hdl9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgaHRtbF9za2lwbmF2X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGh0bWxfc2tpcG5hdl9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJvdmlkZSBhIHdheSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZXJlIGlzIGEgd2F5IHRvIGJ5cGFzcyBibG9ja3Mgb2YgY29udGVudCB0aGF0IGFyZSByZXBlYXRlZCBvbiBtdWx0aXBsZSBXZWIgcGFnZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjQuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBmcmFtZXMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiZnJhbWVcIik7XG4gICAgICAgIGxldCBoZWFkZXJzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImgxXCIpO1xuXG4gICAgICAgIGlmICgoZnJhbWVzICE9IG51bGwgJiYgZnJhbWVzLmxlbmd0aCA+IDApIHx8IChoZWFkZXJzICE9IG51bGwgJiYgaGVhZGVycy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgLy8gSWYgZnJhbWVzIG9yIGhlYWRpbmdzIGFyZSB1c2VkLCBwYXNzXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTG9vayBmb3Igc2tpcCBhbmNob3JzXG4gICAgICAgICAgICBsZXQgYW5jaG9ycyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJhXCIpO1xuICAgICAgICAgICAgbGV0IHRhcmdldHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7ICFwYXNzZWQgJiYgaWR4IDwgYW5jaG9ycy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcnNbaWR4XS5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBocmVmID0gYW5jaG9yc1tpZHhdLmhyZWY7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaHJlZiAhPT0gdHlwZW9mIFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocmVmLmJhc2VWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gaHJlZi5iYXNlVmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgdG1wTG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKChydWxlQ29udGV4dC5vd25lckRvY3VtZW50IGFzIGFueSkubG9jYXRpb25Gcm9tREFQKSAhPSBcInVuZGVmaW5lZFwiICYmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50IGFzIGFueSkubG9jYXRpb25Gcm9tREFQICE9IG51bGwpIHsgLy8gREFQIHNldHMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcExvY2F0aW9uID0gKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5sb2NhdGlvbkZyb21EQVA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHNlcnZlciBzY2FuIGhhcyB0aGUgbG9jYXRpb24gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB0bXBMb2NhdGlvbiA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQubG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvY0hyZWYgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG1wTG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0hyZWYgPSB0bXBMb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpeCB3ZWlyZCBidWdzIHdpdGggaG93IHZhcmlvdXMgcGFyc2VycyByZXBvcnQgb24gZmlsZTogdXJsJ3M6XG4gICAgICAgICAgICAgICAgICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoXCJmaWxlOi8vL1wiKSkgaHJlZiA9IFwiZmlsZTovXCIgKyBocmVmLnN1YnN0cmluZyhcImZpbGU6Ly8vXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0hyZWYuc3RhcnRzV2l0aChcImZpbGU6Ly8vXCIpKSBkb2NIcmVmID0gXCJmaWxlOi9cIiArIGRvY0hyZWYuc3Vic3RyaW5nKFwiZmlsZTovLy9cIi5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChocmVmLmNoYXJBdCgwKSA9PSBcIiNcIiB8fCBocmVmLnN0YXJ0c1dpdGgoZG9jSHJlZiArIFwiI1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IENvbW1vblV0aWwuZ2V0RmlsZUFuY2hvcihocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgdGFyZ2V0KSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0c1t0YXJnZXRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaG9yc1tpZHhdLmhhc0F0dHJpYnV0ZShcIm5hbWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIGZvcndhcmQganVtcGluZyB0YXJnZXRzXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gYW5jaG9yc1tpZHhdLmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoXCIjXCIpICE9IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IENvbW1vblV0aWwuZ2V0RmlsZUFuY2hvcihuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbmFtZSBpbiB0YXJnZXRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTU1hcHBlclwiO1xuXG5leHBvcnQgY29uc3QgaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlmcmFtZVwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJZnJhbWUgd2l0aCBpbnRlcmFjdGl2ZSBjb250ZW50IHNob3VsZCBub3QgYmUgZXhjbHVkZWQgZnJvbSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBpZnJhbWUgd2l0aCBpbnRlcmFjdGl2ZSBjb250ZW50IGlzIG5vdCBleGNsdWRlZCBmcm9tIHRoZSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiVGhlIDxpZnJhbWU+IHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBpcyBleGNsdWRlZCBmcm9tIHRhYiBvcmRlciB1c2luZyB0YWJpbmRleFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuMS4xXCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCJha243Ym5cIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBjb25zdCBtYXBwZXIgOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgaWZyYW1lIGlzIHRvbyBzbWFsbCB0byBiZSB2aXNpYmxlIG9uIHNjcmVlblxuICAgICAgICBpZiAoTWF0aC5tYXgoYm91bmRzWydoZWlnaHQnXSwgYm91bmRzWyd3aWR0aCddKSA8IDMwIHx8IE1hdGgubWluKGJvdW5kc1snaGVpZ2h0J10sIGJvdW5kc1snd2lkdGgnXSkgPCAxNSkgIFxuICAgICAgICAgICByZXR1cm4gbnVsbDsgXG5cbiAgICAgICAgLy8gcGFzcyBpZnJhbWUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdGFiaW5kZXggYXR0cmlidXRlIHZhbHVlIHRoYXQgaXMgYSBuZWdhdGl2ZSBudW1iZXJcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgLy8gY2hlY2sgaWZyYW1lIGNvbnRlbnRcbiAgICAgICAgY29uc3QgaWZyYW1FbGVtID0gcnVsZUNvbnRleHQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIGlmICghaWZyYW1FbGVtIHx8ICFpZnJhbUVsZW0uY29udGVudERvY3VtZW50IHx8ICFpZnJhbUVsZW0uY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIElmIHRoZSBpZnJhbWUgaXMgYmxvY2tlZCBieSBhbiBvcGVuIG1vZGFsIGRpYWxvZyBpdCBpcyBlZmZlY3RpdmVseSBpbmVydCDigJQgaW5hcHBsaWNhYmxlXG4gICAgICAgIGNvbnN0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ3MgPSBBcnJheS5mcm9tKGRvYy5xdWVyeVNlbGVjdG9yQWxsKFwiZGlhbG9nXCIpKTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrZWRCeU1vZGFsID0gZGlhbG9ncy5zb21lKGQgPT4gZC5tYXRjaGVzKFwiOm1vZGFsXCIpICYmICFkLmNvbnRhaW5zKHJ1bGVDb250ZXh0KSk7XG4gICAgICAgICAgICBpZiAoYmxvY2tlZEJ5TW9kYWwpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnQgPSBDb21tb25VdGlsLmdldFRhYmJhYmxlQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY291bnQgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbnZhbGlkXCIpO1xuXG4gICAgICAgIHJldHVybiBudWxsOyAgICBcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0V4cGxpY2l0TGFiZWxJbWFnZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJQYXNzXzFcIixcbiAgICAgICAgICAgIFwiUGFzc18yXCI6IFwiUGFzc18yXCIsXG4gICAgICAgICAgICBcIkZhaWxcIjogXCJGYWlsXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkltYWdlIGJ1dHRvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0IHVzaW5nIHRoZSAnYWx0JyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiSW1hZ2UgYnV0dG9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHRleHQgdXNpbmcgYW4gQVJJQSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJJbWFnZSBidXR0b24gcHJvdmlkZXMgYWx0ZXJuYXRpdmUgdGV4dCB1c2luZyB0aGUgJ3RpdGxlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiRmFpbFwiOiBcIlRoZSA8aW5wdXQ+IGVsZW1lbnQgb2YgdHlwZSBcXFwiaW1hZ2VcXFwiIGhhcyBubyB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCBvZiB0eXBlIFxcXCJpbWFnZVxcXCIgc2hvdWxkIGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjU5Nzk2ZlwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvV0FJL1dDQUcyMi9UZWNobmlxdWVzL2ZhaWx1cmVzL0Y2NVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgfHwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpICE9IFwiaW1hZ2VcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1hZ2VtYXBfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJpbWFnZW1hcF9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW3VzZW1hcF0sIGRvbTppbWdbaXNtYXBdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0ltZ19Vc2VtYXBBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWFnZW1hcF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkltYWdlIG1hcCBvciBjaGlsZCA8YXJlYT4gaGFzIG5vIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBpbWFnZSBtYXAgYW5kIGVhY2ggPGFyZWE+IGVsZW1lbnQgaW4gYW4gaW1hZ2UgbWFwIG11c3QgaGF2ZSB0ZXh0IGFsdGVybmF0aXZlKHMpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKSB8fFxuICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJpc21hcFwiKSAmJiAhQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ1c2VtYXBcIikpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfYWx0X2JhY2tncm91bmQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9iYWNrZ3JvdW5kXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19CYWNrZ3JvdW5kSW1nX0hhc1RleHRPclRpdGxlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19hbHRfYmFja2dyb3VuZC5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiaW1nX2FsdF9iYWNrZ3JvdW5kLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X2JhY2tncm91bmQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBpbXBvcnRhbnQgYmFja2dyb3VuZCBpbWFnZSBpbmZvcm1hdGlvbiBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlIGluIHN5c3RlbSBoaWdoIGNvbnRyYXN0IG1vZGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJCYWNrZ3JvdW5kIGltYWdlcyB0aGF0IGNvbnZleSBpbXBvcnRhbnQgaW5mb3JtYXRpb24gbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZSB0aGF0IGRlc2NyaWJlcyB0aGUgaW1hZ2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IHN0eWxlID0gZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoc3R5bGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBiYWNrZ3JvdW5kSW1ncyA9IHN0eWxlLmJhY2tncm91bmRJbWFnZTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGJhY2tncm91bmRJbWdzICE9IG51bGwgJiYgYmFja2dyb3VuZEltZ3MgIT0gXCJcIiAmJiBiYWNrZ3JvdW5kSW1ncyAhPSAnbm9uZScgJiYgYmFja2dyb3VuZEltZ3MgIT0gJ2luaGVyaXQnKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaW5uZXJIVE1MICE9IG51bGwgJiYgcnVsZUNvbnRleHQuaW5uZXJIVE1MLnRyaW0oKS5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJyk7XG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoICE9IDApXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2FsdF9kZWNvcmF0aXZlOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfZGVjb3JhdGl2ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW1nX1ByZXNlbnRhdGlvbkltZ0hhc05vbk51bGxBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfZGVjb3JhdGl2ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkltYWdlIGRlc2lnbmF0ZWQgYXMgZGVjb3JhdGl2ZSBoYXMgbm9uLW51bGwgJ2FsdCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW1hZ2UgZGVzaWduYXRlZCBhcyBkZWNvcmF0aXZlIG11c3QgaGF2ZSAnYWx0PVxcXCJcXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJwcmVzZW50YXRpb25cIikgfHwgQXJpYVV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJub25lXCIpKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikubGVuZ3RoID09IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nLCBkb206YXJlYSwgZG9tOmlucHV0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSW1nX0FsdENvbW1vbk1pc3VzZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfYWx0X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaW1nX2FsdF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgZmlsZSBuYW1lIHNlcnZlcyBhcyBhIGdvb2QgaW5saW5lIHJlcGxhY2VtZW50IGZvciB0aGUgaW1hZ2VcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCInYWx0JyBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBhIGdvb2QgaW5saW5lIHJlcGxhY2VtZW50IGZvciB0aGUgaW1hZ2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgYmFkVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJzaG9ydCBkZXNjcmlwdGlvblwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAvLyBBbHQgdGV4dCBjaGVjayBhcmUgZWxzZXdoZXJlIChTZWUgNDEsIDI0MCwgNDU1KVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCk7XG4gICAgICAgICAgICBpZiAoYWx0VGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJhZFRleHQgPSB2YWxpZGF0ZVBhcmFtcy5iYWRUZXh0LnZhbHVlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGJhZFRleHQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gYWx0VGV4dC5pbmRleE9mKGJhZFRleHRbaV0pID09IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzcmMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoKG5vZGVOYW1lID09IFwiYXJlYVwiKSA/IFwiaHJlZlwiIDogXCJzcmNcIik7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IGl0IHRvIHBhc3MgaWYgdGhlcmUncyBubyBzcmMgLSBjYW4ndCBkZXRlcm1pbmUgdGhlc2UuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbCBpZiB0aGUgYWx0IG1hdGNoZXMgdGhlIHNyYyBleGFjdGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIGZhaWwgaWYgdGhlIGFsdCBoYXMgYSAuIGluIGl0IGFuZCBlaXRoZXIgdGhlIHNyYyBpcyBpbiB0aGUgYWx0IG9yIHRoZSBhbHQgaXMgaW4gdGhlIHNyY1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gc3JjLnRyaW0oKSAhPSBhbHRUZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsdFRleHQuaW5kZXhPZihcIi5cIikgPT0gLTEgfHwgKGFsdFRleHQuaW5kZXhPZihzcmMpID09IC0xICYmIHNyYy5pbmRleE9mKGFsdFRleHQpID09IC0xKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2FsdF9udWxsOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfbnVsbFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW1nX1RpdGxlRW1wdHlXaGVuQWx0TnVsbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9kZWNvcmF0aXZlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9kZWNvcmF0aXZlXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2FyaWFfb3ZlcnJpZGVcIjogXCJpbWdfYWx0X251bGwuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfbnVsbC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJOZWl0aGVyICdhcmlhJyBub3IgJ3RpdGxlJyBhdHRyaWJ1dGVzIGFyZSB1c2VkIGZvciB0aGUgZGVjb3JhdGl2ZSBpbWFnZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2RlY29yYXRpdmVcIjogXCJUaGUgaW1hZ2UgJ2FsdCcgYXR0cmlidXRlIGlzIGVtcHR5LCBidXQgdGhlICd0aXRsZScgYXR0cmlidXRlIGlzIG5vdCBlbXB0eVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfYXJpYV9vdmVycmlkZVwiOiBcIlRoZSBpbWFnZSAnYWx0JyBhdHRyaWJ1dGUgaXMgZW1wdHksIGJ1dCB0aGUgJ2FyaWEnIGxhYmVsIGlzIG5vdCBlbXB0eSBhbmQgb3ZlcnJpZGVzIHRoZSAnYWx0JyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIHRoZSBpbnRlbnQgaXMgdG8gbWFyayBhbiBpbWFnZSBhcyBkZWNvcmF0aXZlIHdpdGggYW4gZW1wdHkgJ2FsdCcgYXR0cmlidXRlLCB0aGUgJ2FyaWEnIG9yICd0aXRsZScgYXR0cmlidXRlcyBzaG91bGQgbm90IGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJmYWlsX2RlY29yYXRpdmVcIl1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSxcbiAgICAgICAgcmVhc29uQ29kZXM6IFtcInBvdGVudGlhbF9hcmlhX292ZXJyaWRlXCJdXG4gICAgfVxuICAgIF0sXG4gICAgYWN0OiBbe1wiNDZjYTdmXCI6IHtcInBvdGVudGlhbF9hcmlhX292ZXJyaWRlXCI6IFwiZmFpbFwifX1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgaGF2ZSBhIHRpdGxlLCBidXQgYWx0IGlzIGVtcHR5XG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2FyaWFfb3ZlcnJpZGVcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9kZWNvcmF0aXZlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2FsdF9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9yZWR1bmRhbnRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19MaW5rVGV4dE5vdFJlZHVuZGFudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTGluayB0ZXh0IGlzIHJlcGVhdGVkIGluIGFuIGltYWdlICdhbHQnIHZhbHVlIHdpdGhpbiB0aGUgc2FtZSBsaW5rXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkxpbmsgdGV4dCBvZiBwcmV2aW91cyBsaW5rIGlzIHJlcGVhdGVkIGluIGltYWdlICdhbHQnIHZhbHVlIG9mIGEgbGlua1wiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJJbWFnZSAnYWx0JyB2YWx1ZSB3aXRoaW4gYSBsaW5rIGlzIHJlcGVhdGVkIGluIGxpbmsgdGV4dCBvZiB0aGUgbGluayBhZnRlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSB0ZXh0IGFsdGVybmF0aXZlIGZvciBhbiBpbWFnZSB3aXRoaW4gYSBsaW5rIHNob3VsZCBub3QgcmVwZWF0IHRoZSBsaW5rIHRleHQgb3IgYWRqYWNlbnQgbGluayB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiLCBcIjIuNC40XCJdLCAvL21hdGNoIGhlbHAgcmVmZXJlbmNlc1xuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBhTm9kZSA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiYVwiKTtcbiAgICAgICAgLy9JZiBub3QgaW4gYW4gYW5jaG9yLCBPdXQgb2YgU2NvcGVcbiAgICAgICAgaWYgKGFOb2RlID09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBhbHRUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoYWx0VGV4dC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgLy8gSWYgYWx0IHRleHQgaXMgZW1wdHksIHRoZXJlJ3Mgbm8gdGV4dCB0byBiZSByZWR1bmRhbnQgLSBsZXQgYV90ZXh0X3B1cnBvc2VcbiAgICAgICAgICAgIC8vIHRyaWdnZXIgaW4gdGhhdCBjYXNlLlxuICAgICAgICAgICAgLy8gU28gT3V0IG9mIFNjb3BlIGZvciB0aGlzIHJ1bGVcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbm5lclRleHQgPSBhTm9kZS5pbm5lclRleHQ7XG4gICAgICAgIGxldCBsaW5rVGV4dCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKGlubmVyVGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsaW5rVGV4dCA9IGlubmVyVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlua1RleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGFsdFRleHQgPT0gbGlua1RleHQpIHtcbiAgICAgICAgICAgICAgICAvLyBUZXh0IGluIGxpbmtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vYWx0IGlzIG5vbi16ZXJvLCBidXQgbm8gbGluayB0ZXh0IC0gZW5zdXJlIGFkamFjZW50IGxpbmsgdGV4dCBpc24ndCByZWR1bmRhbnRcbiAgICAgICAgICAgIGxldCB3YWxrID0gbmV3IERPTVdhbGtlcihhTm9kZSk7XG4gICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGsucHJldk5vZGUoKSkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBhbmQgbm9kZU5hbWVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGsubm9kZTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKChub2RlTmFtZSA9PSBcIiN0ZXh0XCIgJiYgbm9kZS5ub2RlVmFsdWUubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKG5vZGVOYW1lID09IFwiaW1nXCIgJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFsdFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENvbXBseSB3aXRoIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBTZXR0aW5nIGlmIHRoZSBhIGVsZW1lbnQgc2hvdWxkIGJlIGNoZWNrZWQgb3Igbm90XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiYVwiICYmICFDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dCBiZWZvcmUgaW1hZ2UgbGlua1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCB8fCBub2RlLnRleHRDb250ZW50IHx8IFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9IGFsdFRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrID0gbmV3IERPTVdhbGtlcihhTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGsubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBhbmQgbm9kZU5hbWVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGsubm9kZTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwiI3RleHRcIiAmJiBub2RlLm5vZGVWYWx1ZS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAobm9kZU5hbWUgPT0gXCJpbWdcIiAmJiBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tcGx5IHdpdGggdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcgaWYgdGhlIGEgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCBvciBub3RcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlTmFtZSA9PSBcImFcIiAmJiAhQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChub2RlIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT0gYWx0VGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIFRleHQgYWZ0ZXIgaW1hZ2UgbGlua1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX2FsdFwiOiBcImZhaWxfYmxhbmtfYWx0XCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiZmFpbF9ub19hbHRcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua190aXRsZVwiOiBcImZhaWxfYmxhbmtfdGl0bGVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua19hbHRcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hbHRcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua190aXRsZVwiOiBcImltZ19hbHRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGltYWdlIGhhcyBhbiBhY2Nlc3NpYmxlIG5hbWUgb3IgaXMgY29ycmVjdGx5IG1hcmtlZCBhcyBkZWNvcmF0aXZlIG9yIHJlZHVuZGFudFwiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX2FsdFwiOiBcIkltYWdlICdhbHQnIGF0dHJpYnV0ZSB2YWx1ZSBjb25zaXN0cyBvbmx5IG9mIGJsYW5rIHNwYWNlKHMpXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiVGhlIGltYWdlIGhhcyBuZWl0aGVyIGFuIGFjY2Vzc2libGUgbmFtZSBub3IgaXMgbWFya2VkIGFzIGRlY29yYXRpdmUgb3IgcmVkdW5kYW50XCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJUaGUgaW1hZ2UgZG9lcyBub3QgaGF2ZSBhbiAnYWx0JyBhdHRyaWJ1dGUgb3IgQVJJQSBsYWJlbCwgYW5kIHRoZSAndGl0bGUnIGF0dHJpYnV0ZSB2YWx1ZSBjb25zaXN0cyBvbmx5IG9mIGJsYW5rIHNwYWNlKHMpXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW1hZ2VzIG11c3QgaGF2ZSBhY2Nlc3NpYmxlIG5hbWVzIHVubGVzcyB0aGV5IGFyZSBkZWNvcmF0aXZlIG9yIHJlZHVuZGFudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCIyM2EyYThcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBJZiBub3QgdmlzaWJsZSB0byB0aGUgc2NyZWVuIHJlYWRlciwgb3IgY2FuIGJlIGlnbm9yZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBBY2NOYW1lVXRpbC5pc0FjY2Vzc2libGVOYW1lSWdub3JhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGltZyBoYXMgbm9uLWVtcHR5IGFyaWEgbGFiZWxcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWx0ID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpIDogbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGNoZWNrIHRpdGxlIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoYWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyB0aGUgaW1nIGhhcyBubyBhbHQgb3IgYXR0cmlidXRlLCBleGFtaW5lIHRoZSB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIikgOiBudWxsO1xuICAgICAgICAgICAgaWYgKHRpdGxlID09PSBudWxsIHx8IHRpdGxlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIG5vIHRpdGxlIG9yIHRpdGxlIGlzIGVtcHR5LCBleGFtaW5lIGFsdCBmdXJ0aGVyXG4gICAgICAgICAgICAgICAgaWYgKGFsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gJ3ByZXNlbnRhdGlvbicgfHwgcm9sZSA9PT0gJ25vbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fYWx0XCIpO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgaWYgKGFsdC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7IFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aXRsZSBjb250YWlucyBibGFuayBzcGFjZSBvbmx5ICh0aXRsZT1cIiAgXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYmxhbmtfdGl0bGVcIik7IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB0aXRsZSBjb250YWlucyBzb21lIHRleHQgKHRpdGxlPVwic29tZSB0ZXh0XCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhbHQubGVuZ3RoID09PSAwIHx8IGFsdC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpbWcgaGFzIGVtcHR5IGFsdCAoYWx0PVwiXCIpIG9yIG5vbi1lbXB0eSBhbHQgKGFsdD1cInNvbWUgdGV4dFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7IFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBhbHQgY29udGFpbnMgYmxhbmsgc3BhY2Ugb25seSAoYWx0PVwiIFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYmxhbmtfYWx0XCIpOyBcbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH0gICAgICAgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfaXNtYXBfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19pc21hcF9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbaXNtYXBdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSW1nX1VzZW1hcFZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19pc21hcF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImltZ19pc21hcF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19pc21hcF9taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlNlcnZlci1zaWRlIGltYWdlIG1hcCBob3Qtc3BvdHMgZG8gbm90IGhhdmUgZHVwbGljYXRlIHRleHQgbGlua3NcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTZXJ2ZXItc2lkZSBpbWFnZSBtYXAgaG90LXNwb3RzIG11c3QgaGF2ZSBkdXBsaWNhdGUgdGV4dCBsaW5rc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ1c2VtYXBcIikpIHtcbiAgICAgICAgICAgIGxldCB1c2VtYXAgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ1c2VtYXBcIik7XG4gICAgICAgICAgICB1c2VtYXAgPSB1c2VtYXAudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBsZXQgaWR4ID0gdXNlbWFwLmluZGV4T2YoXCIjXCIpO1xuICAgICAgICAgICAgaWYgKGlkeCAhPSAtMSlcbiAgICAgICAgICAgICAgICB1c2VtYXAgPSB1c2VtYXAuc3Vic3RyKGlkeCArIDEpO1xuXG4gICAgICAgICAgICBpZiAodXNlbWFwLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFwcyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJtYXBcIik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IG1hcHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbWFwc1tpXS5oYXNBdHRyaWJ1dGUoXCJuYW1lXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBzW2ldLmdldEF0dHJpYnV0ZShcIm5hbWVcIikudG9Mb3dlckNhc2UoKSA9PSB1c2VtYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2xvbmdkZXNjX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2xvbmdkZXNjXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ltZ19Mb25nRGVzY3JpcHRpb24yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBmaWxlIGRlc2lnbmF0ZWQgYnkgdGhlICdsb25nZGVzYycgYXR0cmlidXRlIGNvbnRhaW5zIHZhbGlkIEhUTUwgY29udGVudCAoZmlsZSBleHRlbnNpb24gbm90IHJlY29nbml6ZWQpXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiIFRoZSAnbG9uZ2Rlc2MnIGF0dHJpYnV0ZSBtdXN0IHJlZmVyZW5jZSBIVE1MIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGxvbmdkZXNjID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibG9uZ2Rlc2NcIik7XG4gICAgICAgIC8vIGlmIChsb25nZGVzYyBpcyBiYWQgVVJMKSBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICBsZXQgZXh0ID0gQ29tbW9uVXRpbC5nZXRGaWxlRXh0KGxvbmdkZXNjKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGV4dC5sZW5ndGggIT0gMCAmJiBDb21tb25VdGlsLmlzSHRtbEV4dChleHQpXG4gICAgICAgICAgICB8fCBsb25nZGVzYy5zdGFydHNXaXRoKFwiI1wiKVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcImh0dHA6Ly9cIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcImRhdGE6XCIpO1xuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBcIm5wbSBydW4gcHJlYnVpbGRcIi4gRG8gbm90IGVkaXRcblxuZXhwb3J0ICogZnJvbSBcIi4vYV90YXJnZXRfd2FybmluZ1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hX3RleHRfcHVycG9zZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcHBsZXRfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJlYV9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2FsbG93ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3RcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3JlcXVpcmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Jhbm5lcl9zaW5nbGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jaGlsZF90YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NoaWxkX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29udGVudF9pbl9sYW5kbWFya1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX3NpbmdsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZ3JhcGhpY19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2hpZGRlbl9ub250YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2lkX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2ltZ19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9tYWluX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX21haW5fbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfcGFyZW50X3JlcXVpcmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JlZ2lvbl9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JvbGVfYWxsb3dlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JvbGVfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3NlbWFudGljc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfd2lkZ2V0X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FzY2lpYXJ0X2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxpbmtfY3NzX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9ibGlua19lbGVtX2RlcHJlY2F0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxvY2txdW90ZV9jaXRlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9jYW52YXNfY29udGVudF9kZXNjcmliZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY2FwdGlvbl90cmFja19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2Rlc2lnbl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9jb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfaGFzcG9wdXBfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RlYnVnX3BhdGhzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RldGVjdG9yX3RhYmJhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Rpcl9hdHRyaWJ1dGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9pZF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9sYW5nX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfdGFiYmFibGVfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbWJlZF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Vtb3RpY29uc19hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yX21lc3NhZ2VfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpZWxkc2V0X2xhYmVsX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpZWxkc2V0X2xlZ2VuZF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9maWd1cmVfbGFiZWxfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvcm1fZm9udF9jb2xvclwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2ludGVyYWN0aW9uX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvcm1fc3VibWl0X3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mcmFtZV9zcmNfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZnJhbWVfdGl0bGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2hlYWRpbmdfY29udGVudF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaGVhZGluZ19tYXJrdXBfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2h0bWxfbGFuZ19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaHRtbF9za2lwbmF2X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1hZ2VidXR0b25fYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWFnZW1hcF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfYmFja2dyb3VuZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X2RlY29yYXRpdmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9udWxsXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2lzbWFwX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfbG9uZ2Rlc2NfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2F1dG9jb21wbGV0ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9jaGVja2JveGVzX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfZmllbGRzX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfaGFzcG9wdXBfY29uZmxpY3RcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfYWZ0ZXJcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfYmVmb3JlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X29uY2hhbmdlX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xhYmVsX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xhYmVsX25hbWVfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9yZWZfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9jaGlsZHJlbl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9saXN0X21hcmt1cF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyXCJcbmV4cG9ydCAqIGZyb20gXCIuL21hcnF1ZWVfZWxlbV9hdm9pZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hbHRfYnJpZWZcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hdWRpb190cmFuc2NyaWJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL21lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9saXZlX2NhcHRpb25lZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV90cmFja19hdmFpbGFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV9yZWRpcmVjdF9vcHRpb25hbFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZXRhX3JlZnJlc2hfZGVsYXlcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV92aWV3cG9ydF96b29tYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9ub2VtYmVkX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL29iamVjdF90ZXh0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wYWdlX3RpdGxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wYWdlX3RpdGxlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NjcmlwdF9mb2N1c19ibHVyX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfb25jbGlja19hdm9pZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfb25jbGlja19taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X3NlbGVjdF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2VsZWN0X29wdGlvbnNfZ3JvdXBlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9za2lwX21haW5fZGVzY3JpYmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NraXBfbWFpbl9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfY29sb3JfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2ZvY3VzX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfaG92ZXJfcGVyc2lzdGVudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV92aWV3cG9ydF9yZXNpemFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3ZnX2dyYXBoaWNzX2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2FyaWFfZGVzY2VuZGFudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfY2FwdGlvbl9lbXB0eVwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9jYXB0aW9uX25lc3RlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9oZWFkZXJzX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9oZWFkZXJzX3JlZl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfbGF5b3V0X2xpbmVhcml6ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfc2NvcGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfc3RydWN0dXJlX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9zdW1tYXJ5X3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfYmxvY2tfaGVhZGluZ1wiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9xdW90ZWRfY29ycmVjdGx5XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfc2Vuc29yeV9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9zcGFjaW5nX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfd2hpdGVzcGFjZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi93aWRnZXRfdGFiYmFibGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3dpZGdldF90YWJiYWJsZV9zaW5nbGVcIiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbYXV0b2NvbXBsZXRlXSwgZG9tOnRleHRhcmVhW2F1dG9jb21wbGV0ZV0sIGRvbTpzZWxlY3RbYXV0b2NvbXBsZXRlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX0lucHV0X0F1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9pbmFwcHJvcHJpYXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxfaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJGYWlsX2F0dHJpYnV0ZV9pbmNvcnJlY3RcIjogXCJmYWlsX2luY29ycmVjdFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5hcHByb3ByaWF0ZVwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5jb3JyZWN0XCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgbXVzdCBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGlucHV0IGZvcm0gZmllbGRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUncyB0b2tlbihzKSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGlucHV0IGZvcm0gZmllbGRcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbmFwcHJvcHJpYXRlXCI6IFwiVGhlICdhdXRvY29tcGxldGUnIGF0dHJpYnV0ZSdzIHRva2VuKHMpIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUncyB0b2tlbihzKSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBhbiBpbnB1dCBmb3JtIGZpZWxkIG9mIGFueSB0eXBlXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5jb3JyZWN0XCI6IFwiVGhlICdhdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBoYXMgYW4gaW5jb3JyZWN0IHZhbHVlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuNVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiNzNmMmMyXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbmFwcHJvcHJpYXRlXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5jb3JyZWN0XCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IGF1dG9jb21wbGV0ZUF0dHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgbGV0IHRva2VucyA9IGF1dG9jb21wbGV0ZUF0dHIuc3BsaXQoL1xccysvKTtcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDAgfHwgYXV0b2NvbXBsZXRlQXR0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FjaGUgPSB7XG4gICAgICAgICAgICBcInRva2Vuc09uT2ZmXCI6IFtcIm9uXCIsIFwib2ZmXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbk9wdGlvbmFsU2VjdGlvblwiOiBcInNlY3Rpb24tXCIsXG4gICAgICAgICAgICBcInRva2Vuc09wdGlvbmFsUHVycG9zZVwiOiBbXCJzaGlwcGluZ1wiLCBcImJpbGxpbmdcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9wYXNzd29yZFwiOiBbXCJuZXctcGFzc3dvcmRcIiwgXCJjdXJyZW50LXBhc3N3b3JkXCIsIFwib25lLXRpbWUtY29kZVwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX211bHRpbGluZVwiOiBbXCJzdHJlZXQtYWRkcmVzc1wiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX21vbnRoXCI6IFtcImNjLWV4cFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX251bWVyaWNcIjogW1wiY2MtZXhwLW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHAteWVhclwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tYW1vdW50XCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LWRheVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS15ZWFyXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZVwiOiBbXCJiZGF5XCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfdXJsXCI6IFtcInVybFwiLCBcInBob3RvXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfdGV4dFwiOiBbXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJnaXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJuaWNrbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwidXNlcm5hbWVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvbi10aXRsZVwiLFxuICAgICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUxXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsNFwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJwb3N0YWwtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1mYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1jc2NcIixcbiAgICAgICAgICAgICAgICBcImNjLXR5cGVcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWN1cnJlbmN5XCIsXG4gICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIFwic2V4XCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsXCI6IFtcIm5hbWVcIixcbiAgICAgICAgICAgICAgICBcImhvbm9yaWZpYy1wcmVmaXhcIixcbiAgICAgICAgICAgICAgICBcImdpdmVuLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiZmFtaWx5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImhvbm9yaWZpYy1zdWZmaXhcIixcbiAgICAgICAgICAgICAgICBcIm5pY2tuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJ1c2VybmFtZVwiLFxuICAgICAgICAgICAgICAgIFwibmV3LXBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgXCJjdXJyZW50LXBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb24tdGl0bGVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIFwic3RyZWV0LWFkZHJlc3NcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTFcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTJcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWw0XCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsM1wiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDJcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwxXCIsXG4gICAgICAgICAgICAgICAgXCJjb3VudHJ5XCIsXG4gICAgICAgICAgICAgICAgXCJjb3VudHJ5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcInBvc3RhbC1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1naXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1hZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1udW1iZXJcIixcbiAgICAgICAgICAgICAgICBcImNjLWV4cFwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwLW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHAteWVhclwiLFxuICAgICAgICAgICAgICAgIFwiY2MtY3NjXCIsXG4gICAgICAgICAgICAgICAgXCJjYy10eXBlXCIsXG4gICAgICAgICAgICAgICAgXCJ0cmFuc2FjdGlvbi1jdXJyZW5jeVwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tYW1vdW50XCIsXG4gICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1kYXlcIixcbiAgICAgICAgICAgICAgICBcImJkYXktbW9udGhcIixcbiAgICAgICAgICAgICAgICBcImJkYXkteWVhclwiLFxuICAgICAgICAgICAgICAgIFwic2V4XCIsXG4gICAgICAgICAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgICAgICAgICBcInBob3RvXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNPcHRpb25hbEdyb3VwMlwiOiBbXCJob21lXCIsXG4gICAgICAgICAgICAgICAgXCJ3b3JrXCIsXG4gICAgICAgICAgICAgICAgXCJtb2JpbGVcIixcbiAgICAgICAgICAgICAgICBcImZheFwiLFxuICAgICAgICAgICAgICAgIFwicGFnZXJcIl0sXG5cbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3RlbFwiOiBbXCJ0ZWxcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl9lbWFpbFwiOiBbXCJlbWFpbFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3VybFwiOiBbXCJpbXBwXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDJfdGV4dFwiOiBbXCJ0ZWwtY291bnRyeS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbmF0aW9uYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1hcmVhLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWV4dGVuc2lvblwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbFwiOiBbXCJ0ZWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1jb3VudHJ5LWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1uYXRpb25hbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWFyZWEtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWwtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWwtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtZXh0ZW5zaW9uXCIsXG4gICAgICAgICAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICAgICAgICAgIFwiaW1wcFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zT3B0aW9uR3JvdXAxX3dlYmF1dGhuXCI6IFtcIndlYmF1dGhuXCJdICAgIFxuICAgICAgICB9XG4gICAgICAgIGxldCB2YWxpZF92YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGNhY2hlKVxuICAgICAgICAgICAgdmFsaWRfdmFsdWVzPXZhbGlkX3ZhbHVlcy5jb25jYXQoY2FjaGVba2V5XSk7XG4gICAgICAgIFxuICAgICAgICBsZXQgZm91bmRNYW5kYXRvcnlUb2tlbiA9IGZhbHNlO1xuICAgICAgICBsZXQgZm91bmRSZWNvZ25pemVkVG9rZW4gPSB0cnVlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRva2Vucy5ldmVyeShyID0+IHZhbGlkX3ZhbHVlcy5pbmNsdWRlcyhyKSB8fCByLnN0YXJ0c1dpdGgoY2FjaGVbJ3Rva2VuT3B0aW9uYWxTZWN0aW9uJ10pKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW5jb3JyZWN0XCIpO1xuICAgICAgICBcbiAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKSA6IFwidGV4dFwiO1xuICAgICAgICBcbiAgICAgICAgbGV0IHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IFtdO1xuICAgICAgICBsZXQgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gW107XG4gICAgICAgIGxldCB0b2tlbnNPcHRpb25hbEdyb3VwID0gW107XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgfHwgbm9kZU5hbWUgPT09IFwic2VsZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIGFjY2VwdCBhbGwgdG9rZW5zXG4gICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsO1xuICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbDtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiKVxuICAgICAgICAgICAgICAgIHRva2Vuc09wdGlvbmFsR3JvdXAgPSBjYWNoZS50b2tlbnNPcHRpb25Hcm91cDFfd2ViYXV0aG47XG5cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICB0b2tlbnNPcHRpb25hbEdyb3VwID0gY2FjaGUudG9rZW5zT3B0aW9uR3JvdXAxX3dlYmF1dGhuO1xuICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSB2YXJpb3VzICdpbnB1dCcgdHlwZXNcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuXG4gICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBjaGVjayBmb3IgaW5wdXQgdHlwZT1oaWRkZW4gZm9yIG5vdyBiYXNlZCBvbiBzY3J1bSBkaXNjdXNzaW9uXG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICBjYXNlIFwiaGlkZGVuXCI6XG4gICAgICAgICAgICAgICAgICAgIC8vIGFjY2VwdCBhbGwgdG9rZW5zXG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9hbGw7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJzZWFyY2hcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3RleHQuY29uY2F0KGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9wYXNzd29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV91cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfbnVtZXJpYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9tb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9kYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInBhc3N3b3JkXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9wYXNzd29yZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInVybFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfdXJsO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfdXJsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2VtYWlsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwidGVsXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl90ZWw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX251bWVyaWM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtb250aFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfbW9udGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9kYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCB0eXBlIGZvciB0aGlzIHJ1bGUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgY2hlY2sgZm9yIGlucHV0IHR5cGU9aGlkZGVuIGZvciBub3cgYmFzZWQgb24gc2NydW0gZGlzY3Vzc2lvblxuICAgICAgICBsZXQgYXV0b2ZpbGxNYW50bGUgPSAvKiAobm9kZU5hbWU9PT1cImlucHV0XCIgJiYgdHlwZT09PVwiaGlkZGVuXCIpID8gXCJhbmNob3JcIiA6ICovIFwiZXhwZWN0YXRpb25cIjtcblxuICAgICAgICBpZiAoYXV0b2ZpbGxNYW50bGUgPT09IFwiZXhwZWN0YXRpb25cIikge1xuICAgICAgICAgICAgLy8gY2hlY2sgb258b2ZmIGZvciBleHBlY3RhdGlvbiBtYW50bGUuXG4gICAgICAgICAgICBpZiAodG9rZW5zLmluY2x1ZGVzKFwib25cIikgfHwgdG9rZW5zLmluY2x1ZGVzKFwib2ZmXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gb258b2ZmIHNob3VsZCBiZSB0aGUgb25seSB0b2tlblxuICAgICAgICAgICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbnZhbGlkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGRldGFpbCBhdXRvZmlsbCB0b2tlbnNcbiAgICAgICAgbGV0IGN1cnJJbmRleCA9IDA7XG4gICAgICAgIGxldCBjdXJyUmVjb2duaXplZEluZGV4ID0gMDtcblxuICAgICAgICAvLyBjaGVjayBvcHRpb25hbCAnc2VjdGlvbi0qJyB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vuc1tjdXJySW5kZXhdLnN0YXJ0c1dpdGgoY2FjaGUudG9rZW5PcHRpb25hbFNlY3Rpb24pICYmXG4gICAgICAgICAgICB0b2tlbnNbY3VyckluZGV4XS5sZW5ndGggPiA4KSB7XG4gICAgICAgICAgICBjdXJySW5kZXgrKzsgLy8gY29uc3VtZSB0b2tlblxuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgJ3NoaXBwaW5nfGJpbGxpbmcnIHRva2Vuc1xuICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IGN1cnJJbmRleCAmJlxuICAgICAgICAgICAgY2FjaGUudG9rZW5zT3B0aW9uYWxQdXJwb3NlLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgY3VyckluZGV4Kys7IC8vIGNvbnN1bWUgIHRva2VuXG4gICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBlaXRoZXIgbWFuZGF0b3J5IGdyb3VwIDEgb3IgMiB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXgpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIG1hbmRhdG9yeSBncm91cCAxXG4gICAgICAgICAgICBpZiAodG9rZW5zTWFuZGF0b3J5R3JvdXAxLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGZvdW5kTWFuZGF0b3J5VG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGN1cnJJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBvcHRpb25hbCB0b2tlbnMgZm9yIGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zT3B0aW9uYWxHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMlxuICAgICAgICAgICAgICAgIGlmICh0b2tlbnNNYW5kYXRvcnlHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kTWFuZGF0b3J5VG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBlaXRoZXIgbWFuZGF0b3J5IGdyb3VwIDEgb3IgMiB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJyUmVjb2duaXplZEluZGV4KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMVxuICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9hbGwuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGZvdW5kUmVjb2duaXplZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9wdGlvbmFsIHRva2VucyBmb3IgZ3JvdXAgMlxuICAgICAgICAgICAgICAgIGlmIChjYWNoZS50b2tlbnNPcHRpb25hbEdyb3VwMi5pbmNsdWRlcyh0b2tlbnNbY3VyclJlY29nbml6ZWRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbC5pbmNsdWRlcyh0b2tlbnNbY3VyclJlY29nbml6ZWRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kUmVjb2duaXplZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXggKyBjdXJyUmVjb2duaXplZEluZGV4KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBvcHRpb25hbCB0b2tlbnMgd2ViYXV0aG5cbiAgICAgICAgICAgIGlmICh0b2tlbnNPcHRpb25hbEdyb3VwLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXggKyBjdXJyUmVjb2duaXplZEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXggJiYgdG9rZW5zT3B0aW9uYWxHcm91cC5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpXG4gICAgICAgICAgICB8fCAodG9rZW5zLmxlbmd0aCA+IGN1cnJSZWNvZ25pemVkSW5kZXggJiYgdG9rZW5zT3B0aW9uYWxHcm91cC5pbmNsdWRlcyh0b2tlbnNbY3VyclJlY29nbml6ZWRJbmRleF0pKSkge1xuICAgICAgICAgICAgY3VyckluZGV4Kys7XG4gICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IHBhc3MgaWYgd2UgaGF2ZSBzZWVuIGVpdGhlciBvZiB0aGUgbWFuZGF0b3J5IGdyb3VwcyBhbmQgYWxsIHRva2VucyBoYXZlIGJlZW4gY29uc3VtZWRcbiAgICAgICAgaWYgKGZvdW5kTWFuZGF0b3J5VG9rZW4gJiYgdG9rZW5zLmxlbmd0aCA9PT0gY3VyckluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvdW5kUmVjb2duaXplZFRva2VuICYmIHRva2Vucy5sZW5ndGggPT09IGN1cnJSZWNvZ25pemVkSW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW5jb3JyZWN0XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbmFwcHJvcHJpYXRlXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZDogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFt0eXBlPXJhZGlvXSwgZG9tOmlucHV0W3R5cGU9Y2hlY2tib3hdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfUmFkaW9DaGtJbkZpZWxkU2V0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc19Mb25lTm9ncm91cFwiOiBcInBhc3NfbG9uZW5vZ3JvdXBcIixcbiAgICAgICAgICAgIFwiUGFzc19Hcm91cGVkXCI6IFwicGFzc19ncm91cGVkXCIsXG4gICAgICAgICAgICBcIlBhc3NfUmFkaW9Ob05hbWVcIjogXCJwYXNzX3JhZGlvTm9OYW1lXCIsXG4gICAgICAgICAgICBcIkZhaWxfQ29udHJvbE5hbWVNaXNtYXRjaFwiOiBcImZhaWxfY29udHJvbG5hbWVtaXNtYXRjaFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdEdyb3VwZWRPdGhlckdyb3VwZWRcIjogXCJmYWlsX25vdGdyb3VwZWRvdGhlcmdyb3VwZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJOb3RHcm91cGVkXCI6IFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90U2FtZUdyb3VwXCI6IFwiZmFpbF9ub3RzYW1lZ3JvdXBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX0xvbmVDaGVja2JveFwiOiBcInBvdGVudGlhbF9sb25lY2hlY2tib3hcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX1VubmFtZWRDaGVja2JveFwiOiBcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfbG9uZW5vZ3JvdXBcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX2dyb3VwZWRcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX3JhZGlvbm9uYW1lXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb250cm9sbmFtZW1pc21hdGNoXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3Rncm91cGVkb3RoZXJncm91cGVkXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3RzYW1lZ3JvdXBcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbG9uZWNoZWNrYm94XCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3VubmFtZWRjaGVja2JveFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUmVsYXRlZCBzZXRzIG9mIHJhZGlvIGJ1dHRvbnMgb3IgY2hlY2tib3hlcyBzaG91bGQgYmUgcHJvZ3JhbW1hdGljYWxseSBncm91cGVkXCIsXG4gICAgICAgICAgICBcInBhc3NfbG9uZW5vZ3JvdXBcIjogXCJ7MH0gZ3JvdXBpbmcgbm90IHJlcXVpcmVkIGZvciBhIGNvbnRyb2wgb2YgdGhpcyB0eXBlXCIsXG4gICAgICAgICAgICBcInBhc3NfZ3JvdXBlZFwiOiBcInswfSBpbnB1dCBpcyBncm91cGVkIHdpdGggb3RoZXIgcmVsYXRlZCBjb250cm9scyB3aXRoIHRoZSBzYW1lIG5hbWVcIixcbiAgICAgICAgICAgIFwicGFzc19yYWRpb25vbmFtZVwiOiBcIlJhZGlvIGlucHV0IGlzIG5vdCBncm91cGVkLCBidXQgcGFzc2VzIGJlY2F1c2UgaXQgaGFzIG5vIG5hbWUgdG8gZ3JvdXAgd2l0aCBvdGhlciByYWRpbyBpbnB1dHNcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb250cm9sbmFtZW1pc21hdGNoXCI6IFwiezB9IGlucHV0IGZvdW5kIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUsIFxcXCJ7Mn1cXFwiIGFzIGEgezF9IGlucHV0XCIsXG4gICAgICAgICAgICBcImZhaWxfbm90Z3JvdXBlZG90aGVyZ3JvdXBlZFwiOiBcInswfSBpbnB1dCBpcyBub3QgaW4gdGhlIGdyb3VwIHdpdGggYW5vdGhlciB7MH0gd2l0aCB0aGUgbmFtZSBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJmYWlsX25vdGdyb3VwZWRvdGhlcm5vdGdyb3VwZWRcIjogXCJ7MH0gaW5wdXQgYW5kIG90aGVycyB3aXRoIHRoZSBuYW1lIFxcXCJ7MX1cXFwiIGFyZSBub3QgZ3JvdXBlZCB0b2dldGhlclwiLFxuICAgICAgICAgICAgXCJmYWlsX25vdHNhbWVncm91cFwiOiBcInswfSBpbnB1dCBpcyBpbiBhIGRpZmZlcmVudCBncm91cCB0aGFuIGFub3RoZXIgezB9IHdpdGggdGhlIG5hbWUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xvbmVjaGVja2JveFwiOiBcIlZlcmlmeSB0aGF0IHRoaXMgdW5ncm91cGVkIGNoZWNrYm94IGlucHV0IGlzIG5vdCByZWxhdGVkIHRvIG90aGVyIGNoZWNrYm94ZXNcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3VubmFtZWRjaGVja2JveFwiOiBcIlZlcmlmeSB0aGF0IHRoaXMgdW4tbmFtZWQsIHVuZ3JvdXBlZCBjaGVja2JveCBpbnB1dCBpcyBub3QgcmVsYXRlZCB0byBvdGhlciBjaGVja2JveGVzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGdldEdyb3VwID0gKGU6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGUsIFwiZmllbGRzZXRcIilcbiAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwicmFkaW9ncm91cFwiKVxuICAgICAgICAgICAgICAgIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJncm91cFwiKVxuICAgICAgICAgICAgICAgIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJncmlkXCIpXG4gICAgICAgICAgICAgICAgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShlLCBcInRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKCFyZXRWYWwpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGUsIFwidGFibGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHJldFZhbCAmJiAhVGFibGVVdGlsLmlzRGF0YVRhYmxlKHJldFZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzIGFyZSBpbiBzY29wZVxuICAgICAgICBsZXQgY3R4VHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIERldGVybWluZSB3aGljaCBmb3JtIHdlJ3JlIGluIChpZiBhbnkpIHRvIGRldGVybWluZSBvdXIgc2NvcGVcbiAgICAgICAgbGV0IGN0eEZvcm0gPSBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImZvcm1cIilcbiAgICAgICAgICAgIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiaHRtbFwiKVxuICAgICAgICAgICAgfHwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gR2V0IGRhdGEgYWJvdXQgYWxsIG9mIHRoZSB2aXNpYmxlIGNoZWNrYm94ZXMgYW5kIHJhZGlvcyBpbiB0aGUgc2NvcGUgb2YgdGhpcyBmb3JtXG4gICAgICAgIC8vIGFuZCBjYWNoZSBpdCBmb3IgYWxsIG9mIHRoZSBvdGhlciBpbnB1dHMgaW4gdGhpcyBzY29wZVxuICAgICAgICBsZXQgZm9ybUNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKGN0eEZvcm0sIFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWZvcm1DYWNoZSkge1xuICAgICAgICAgICAgZm9ybUNhY2hlID0ge1xuICAgICAgICAgICAgICAgIGNoZWNrYm94QnlOYW1lOiB7fSxcbiAgICAgICAgICAgICAgICByYWRpb3NCeU5hbWU6IHt9LFxuICAgICAgICAgICAgICAgIG5hbWVUb0dyb3VwOiB7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG51bUNoZWNrYm94ZXM6IDAsXG4gICAgICAgICAgICAgICAgbnVtUmFkaW9zOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSBjaGVja2JveGVzIGluIHRoZSBmb3JtIG9yIGJvZHkgKGJ1dCBub3QgbmVzdGVkIGluIHNvbWV0aGluZyBlbHNlIGFuZCBub3QgaGlkZGVuKVxuICAgICAgICAgICAgLy8gQW5kIGdldCBhIG1hcHBpbmcgb2YgdGhlc2UgY2hlY2tib3hlcyB0b1xuICAgICAgICAgICAgbGV0IGNXYWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGN0eEZvcm0sIGZhbHNlLCBjdHhGb3JtLCB0cnVlKTtcbiAgICAgICAgICAgIGxldCBjaGVja2JveFEgPSBbXTtcbiAgICAgICAgICAgIGxldCByYWRpb3NRID0gW107XG4gICAgICAgICAgICB3aGlsZSAoY1dhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjV2Fsa2VyLmJFbmRUYWdcbiAgICAgICAgICAgICAgICAgICAgJiYgY1dhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxXG4gICAgICAgICAgICAgICAgICAgICYmIGNXYWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGNXYWxrZXIubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSAoY1dhbGtlci5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94US5wdXNoKGNXYWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByYWRpb3NRLnB1c2goY1dhbGtlci5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGxldCBjaGVja2JveFEgPSBjdHhGb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFt0eXBlPWNoZWNrYm94XVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNoZWNrYm94US5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSBjaGVja2JveFFbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoY2IsIFwiZm9ybVwiKVxuICAgICAgICAgICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImh0bWxcIilcbiAgICAgICAgICAgICAgICAgICAgfHwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpID09PSBjdHhGb3JtXG4gICAgICAgICAgICAgICAgICAgICYmICFDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY2IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjYi5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIChmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbbmFtZV0gPSBmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbbmFtZV0gfHwgW10pLnB1c2goY2IpO1xuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmFtZVRvR3JvdXBbbmFtZV0gPSBmb3JtQ2FjaGUubmFtZVRvR3JvdXBbbmFtZV0gfHwgZ2V0R3JvdXAoY2IpO1xuICAgICAgICAgICAgICAgICAgICArK2Zvcm1DYWNoZS5udW1DaGVja2JveGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHJhZGlvcyBpbiB0aGUgZm9ybSBvciBib2R5IChidXQgbm90IG5lc3RlZCBpbiBzb21ldGhpbmcgZWxzZSBhbmQgbm90IGhpZGRlbilcbiAgICAgICAgICAgIC8vIGxldCByYWRpb3NRID0gY3R4Rm9ybS5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbdHlwZT1yYWRpb11cIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCByYWRpb3NRLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gcmFkaW9zUVtpZHhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhZEN0eCA9IChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHIsIFwiZm9ybVwiKVxuICAgICAgICAgICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImh0bWxcIilcbiAgICAgICAgICAgICAgICAgICAgfHwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChyYWRDdHggPT09IGN0eEZvcm1cbiAgICAgICAgICAgICAgICAgICAgJiYgIUNvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gci5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIChmb3JtQ2FjaGUucmFkaW9zQnlOYW1lW25hbWVdID0gZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtuYW1lXSB8fCBbXSkucHVzaChyKTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdID0gZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdIHx8IGdldEdyb3VwKHIpO1xuICAgICAgICAgICAgICAgICAgICArK2Zvcm1DYWNoZS5udW1SYWRpb3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGN0eEZvcm0sIFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsIGZvcm1DYWNoZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLy8vLy8vLy8vLy8vIENhbGN1bGF0ZWQgZXZlcnl0aGluZywgbm93IGNoZWNrIHRoZSB2YXJpb3VzIGNhc2VzXG5cbiAgICAgICAgY29uc3QgY3R4TmFtZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgIGNvbnN0IGN0eEdyb3VwID0gZ2V0R3JvdXAocnVsZUNvbnRleHQpO1xuICAgICAgICBjdHhUeXBlID0gY3R4VHlwZSA9PT0gXCJyYWRpb1wiID8gXCJSYWRpb1wiIDogXCJDaGVja2JveFwiO1xuXG4gICAgICAgIGlmICghY3R4TmFtZSB8fCBjdHhOYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBwcm9jZXNzIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIGlzIG5vdCBuYW1lZFxuICAgICAgICAgICAgaWYgKGN0eFR5cGUgPT09IFwiUmFkaW9cIikge1xuICAgICAgICAgICAgICAgIC8vIFJhZGlvcyB3aXRob3V0IG5hbWVzIGRvbid0IGFjdCBsaWtlIGdyb3Vwcywgc28gZG9uJ3QgZW5mb3JjZSBncm91cGluZ1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX3JhZGlvbm9uYW1lXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19ncm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIGFuIHVubmFtZWQgY2hlY2tib3hcbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbXCJcIl0gfHwgW10pLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3VubmFtZWRjaGVja2JveFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19sb25lbm9ncm91cFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19ncm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ29uc2lkZXJpbmcgYSBuYW1lZCBjaGVja2JveFxuICAgICAgICAgICAgY29uc3QgbnVtUmFkaW9zV2l0aE5hbWUgPSAoZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtjdHhOYW1lXSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID0gKGZvcm1DYWNoZS5jaGVja2JveEJ5TmFtZVtjdHhOYW1lXSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgLy8gQ2FwaXRhbGl6ZSB0aGUgaW5wdXQgdHlwZSBmb3IgbWVzc2FnZXNcbiAgICAgICAgICAgIGlmIChudW1SYWRpb3NXaXRoTmFtZSA+IDAgJiYgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBuYW1pbmcgbWlzbWF0Y2ggYmV0d2VlbiBkaWZmZXJlbnQgY29udHJvbHNcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2NvbnRyb2xuYW1lbWlzbWF0Y2hcIiwgW2N0eFR5cGUsIGN0eFR5cGUgPT09IFwiY2hlY2tib3hcIiA/IFwicmFkaW9cIiA6IFwiY2hlY2tib3hcIiwgY3R4TmFtZV0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHhUeXBlID09PSBcIlJhZGlvXCIgJiYgKGZvcm1DYWNoZS5udW1SYWRpb3MgPT09IDEgfHwgbnVtUmFkaW9zV2l0aE5hbWUgPT09IDEpXG4gICAgICAgICAgICAgICAgfHwgY3R4VHlwZSA9PT0gXCJDaGVja2JveFwiICYmIGZvcm1DYWNoZS5udW1DaGVja2JveGVzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGxvbmUgY29udHJvbCAoZWl0aGVyIG9ubHkgY29udHJvbCBvZiB0aGlzIHR5cGUgb24gdGhlIHBhZ2UsIG9yIGEgcmFkaW8gYnV0dG9uIHdpdGhvdXQgYW55IG90aGVycyBieSB0aGF0IG5hbWUpXG4gICAgICAgICAgICAgICAgLy8gV2UgcGFzcyB0aGlzIGNvbnRyb2wgaW4gYWxsIGNhc2VzXG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfbG9uZW5vZ3JvdXBcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2dyb3VwZWRcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0eFR5cGUgPT09IFwiQ2hlY2tib3hcIiAmJiBmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcyA+IDEgJiYgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBvbmx5IG9uZSBjaGVja2JveCB3aXRoIHRoaXMgbmFtZSwgYnV0IHRoZXJlIGFyZSBvdGhlciBjaGVja2JveGVzIGluIHRoZSBmb3JtLlxuICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBncm91cGVkLCBhc2sgdGhlbSB0byBleGFtaW5lIGl0XG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xvbmVjaGVja2JveFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugc2hhcmUgYSBuYW1lIHdpdGggYW5vdGhlciBzaW1pbGFyIGNvbnRyb2wuIEFyZSB3ZSBncm91cGVkIHRvZ2V0aGVyP1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybUNhY2hlLm5hbWVUb0dyb3VwW2N0eE5hbWVdICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgZ3JvdXBlZCwgYnV0IHNvbWUgY29udHJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgaW4gYSBncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub3Rncm91cGVkb3RoZXJncm91cGVkXCIsIFtjdHhUeXBlLCBjdHhOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb25lIG9mIHVzIGFyZSBncm91cGVkXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vdGdyb3VwZWRvdGhlcm5vdGdyb3VwZWRcIiwgW2N0eFR5cGUsIGN0eE5hbWVdKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtQ2FjaGUubmFtZVRvR3JvdXBbY3R4TmFtZV0gIT09IGN0eEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBpbiB0aGUgbWFpbiBncm91cCB3aXRoIHRoZSBvdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub3RzYW1lZ3JvdXBcIiwgW2N0eFR5cGUsIGN0eE5hbWVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBhbGwgZ3JvdXBlZCB1cCFcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19ncm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfZmllbGRzX2dyb3VwZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfZmllbGRzX2dyb3VwZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dCwgZG9tOnRleHRhcmVhLCBkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfSW5GaWVsZFNldFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9maWVsZHNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaW5wdXRfZmllbGRzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2ZpZWxkc19ncm91cGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJVc2UgdGhlIDxmaWVsZHNldD4gZWxlbWVudCB0byBncm91cCBsb2dpY2FsbHkgcmVsYXRlZCBpbnB1dCBlbGVtZW50c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkdyb3VwcyBvZiBsb2dpY2FsbHkgcmVsYXRlZCBpbnB1dCBlbGVtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIHdpdGhpbiBhIDxmaWVsZHNldD4gZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGZvciBvdGhlciBpbnB1dCB0eXBlcyBvciBpZiB3ZSdyZSBpbiBhIGZpZWxkc2V0XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJmaWxlXCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImZpZWxkc2V0XCIpICE9IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG5cbiAgICAgICAgLy8gTm8gZmllbGRzZXQgLSBzZWUgaWYgdGhpcyBpbnB1dCBpcyBhbGwgYnkgaXRzZWxmIC0gbm8gbmVlZCB0byBncm91cCBzaW5nbGUgaW5wdXRzXG4gICAgICAgIGxldCBwYXJlbnQgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJmb3JtXCIsIFwiYm9keVwiXSk7XG4gICAgICAgIGxldCBjaGVja1R5cGVzID0gW1wiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiXTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY2hlY2tUeXBlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IGNvbnRyb2xzID0gcGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGNoZWNrVHlwZXNbaV0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IHBhc3NlZCAmJiBqIDwgY29udHJvbHMubGVuZ3RoOyArK2opIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY29udHJvbHNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0ZXh0YXJlYXMgYW5kIHNlbGVjdHMgd2lsbCBiZSBjYWxsZWQgdHlwZT0ndGV4dCdcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGNvbnRyb2xzW2pdLmhhc0F0dHJpYnV0ZShcInR5cGVcIikgPyBjb250cm9sc1tqXS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCkgOiBcInRleHRcIjtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGZhaWwgaWYgdGhpcyBpcyBhbm90aGVyIGNvbnRyb2wgaW4gdGhlIGZvcm0gYW5kIGl0cyB0eXBlIGlzIGFub3RoZXIgdGV4dC1saWtlIGlucHV0XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gY29udHJvbHNbal0gPT0gcnVsZUNvbnRleHQgfHwgKHR5cGUgIT0gXCJ0ZXh0XCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIgJiYgdHlwZSAhPSBcImZpbGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9oYXNwb3B1cF9jb25mbGljdDogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0W2xpc3RdW2FyaWEtaGFzcG9wdXBdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJpbnB1dF9oYXNwb3B1cF9pbnZhbGlkXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfdHlwZV9taXN1c2VcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJwb3RlbnRpYWxfbWlzdXNlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCI6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbWlzdXNlXCI6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbGlzdF9ub3RleGlzdFwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX2xpc3RfdHlwZVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX2xpc3RfZWxlbVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCI8aW5wdXQ+IGVsZW1lbnQgd2l0aCBhICdsaXN0JyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCB1c2UgYW4gZXhwbGljaXQgJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCB3aXRoIGEgJ2xpc3QnIGF0dHJpYnV0ZSBkb2VzIG5vdCB1c2UgYW4gZXhwbGljaXQgJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfdHlwZV9taXN1c2VcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IHdpdGggdHlwZSBcXFwiezB9XFxcIiBhbmQgJ2xpc3QnIGF0dHJpYnV0ZSB1c2VzIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX21pc3VzZVwiOiBcIlRoZSA8aW5wdXQ+IGVsZW1lbnQgd2l0aCBhIG1pc3Npbmcgb3IgaW52YWxpZCB0eXBlIGFuZCAnbGlzdCcgYXR0cmlidXRlIHVzZXMgYW4gZXhwbGljaXQgJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbGlzdF9ub3RleGlzdFwiOiBcIlRoZSBsaXN0IGF0dHJpYnV0ZSBmb3IgdGhlIDxpbnB1dD4gZWxlbWVudCBpcyBpbnZhbGlkXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X3R5cGVcIjogXCJUaGUgbGlzdCBhdHRyaWJ1dGUgZm9yIHRoZSA8aW5wdXQ+IGVsZW1lbnQgd2l0aCB0aGUgdHlwZSBcXFwiezB9XFxcIiBpcyBpbnZhbGlkXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X2VsZW1cIjogXCJUaGUgbGlzdCBhdHRyaWJ1dGUgZm9yIHRoZSA8aW5wdXQ+IGVsZW1lbnQgZG9lcyBub3QgcmVmZXJlbmNlIGEgZGF0YWxpc3QgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgaWYgdGhlIGZpZWxkc2V0IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIC8vIGxldCBcImFyaWFfcm9sZV92YWxpZFwiIHRvIGhhbmRsZSBpbnZhbGlkIHJvbGUuIE9ubHkgYWxsb3dlZCByb2xlIGlzIGNvbWJvYm94IHdoaWNoIGlzIGltcGxpY2l0LiBcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDAgJiYgIXJvbGVzLmluY2x1ZGVzKCdjb21ib2JveCcpKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgICAgICAgIFxuXG4gICAgICAgIC8vdHJpZ2dlcmluZyBpbnB1dCB0eXBlczogdGV4dCwgc2VhcmNoLCB0ZWwsIHVybCwgZW1haWwsIG9yIG1pc3Npbmcgb3IgaW52YWxpZCBcbiAgICAgICAgbGV0IHllc1R5cGVzID0gW1widGV4dFwiLCBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsIFwiZGF0ZVwiLCBcIm1vbnRoXCIsIFwid2Vla1wiLCBcInRpbWVcIiwgXCJkYXRldGltZS1sb2NhbFwiLCBcIm51bWJlclwiLCBcInJhbmdlXCIsIFwiY29sb3JcIl07XG4gICAgICAgIGxldCBub1R5cGVzID0gW1wiZmlsZVwiLCBcInBhc3N3b3JkXCIsIFwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLCBcInN1Ym1pdFwiLCBcInJlc2V0XCIsIFwiaW1hZ2VcIiwgXCJoaWRkZW5cIiwgXCJidXR0b25cIl07XG5cbiAgICAgICAgbGV0IGF0dHJWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgIC8vbWlzc2luZyBpbnB1dCB0eXBlIGZvciBsaXN0IGJ1dCB3aXRoIGFyaWFfaGFzX3BvcHVwXG4gICAgICAgIGlmICghYXR0clZhbHVlIHx8IGF0dHJWYWx1ZS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbWlzdXNlXCIpO1xuXG4gICAgICAgIGF0dHJWYWx1ZSA9IGF0dHJWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy9pbnZhbGlkIGlucHV0IHR5cGVzIGZvciBsaXN0IGJ1dCB3aXRoIGFyaWFfaGFzX3BvcHVwXG4gICAgICAgIGlmICgheWVzVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSAmJiAhbm9UeXBlcy5pbmNsdWRlcyhhdHRyVmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbWlzdXNlXCIpO1xuXG4gICAgICAgIC8vIHRoZSBsaXN0IGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB3cm9uZyBpbnB1dCB0eXBlXG4gICAgICAgIGlmIChhdHRyVmFsdWUgJiYgbm9UeXBlcy5pbmNsdWRlcyhhdHRyVmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbnZhbGlkX2xpc3RfdHlwZVwiKTtcblxuICAgICAgICBsZXQgbGlzdCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxpc3RcIik7XG4gICAgICAgIC8vIHRoZSBsaXN0IGF0dHJpYnV0ZSBpcyBibGFua1xuICAgICAgICBpZiAoIWxpc3QgfHwgbGlzdC50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbGlzdF9ub3RleGlzdFwiKTtcblxuICAgICAgICBsZXQgbGlzdEVsZW0gPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxpc3QpO1xuICAgICAgICAvLyB0aGUgbGlzdCBlbGVtZW50IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgaWYgKCFsaXN0RWxlbSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcInBvdGVudGlhbF9saXN0X25vdGV4aXN0XCIpO1xuXG4gICAgICAgIC8vIHRoZSBsaXN0IGVsZW1lbnQgaXMgbm90IGEgZGF0YWxpc3QgZWxlbWVudFxuICAgICAgICBpZiAobGlzdEVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ2RhdGFsaXN0JylcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZF9saXN0X2VsZW1cIik7XG5cbiAgICAgICAgLy8gdmFsaWQgaW5wdXQgdHlwZXMgZm9yIGxpc3QgYnV0IHdpdGggYXJpYV9oYXNfcG9wdXAgICAgXG4gICAgICAgIGlmICh5ZXNUeXBlcy5pbmNsdWRlcyhhdHRyVmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdHlwZV9taXN1c2VcIiwgW2F0dHJWYWx1ZV0pO1xuICAgICAgICBcbiAgICAgICAgLy8gc2hvdWxkbid0IGdldCBoZXJlIFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfbGFiZWxfYWZ0ZXI6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfbGFiZWxfYWZ0ZXJcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0xhYmVsQWZ0ZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9hZnRlci5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImlucHV0X2xhYmVsX2FmdGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9sYWJlbF9hZnRlci5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbiBpcyBuZXN0ZWQgaW4gbGFiZWwsIHNvIGxhYmVsIGlzIG5vdCBhZnRlciB0aGUgaW5wdXQgY29udHJvbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJMYWJlbCB0ZXh0IGlzIGxvY2F0ZWQgYmVmb3JlIGl0cyBhc3NvY2lhdGVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ2hlY2tib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyBtdXN0IGhhdmUgYSBsYWJlbCBhZnRlciB0aGUgaW5wdXQgY29udHJvbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSlcbiAgICAgICAgICAgIHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0eXBlICE9IFwiY2hlY2tib3hcIiAmJiB0eXBlICE9IFwicmFkaW9cIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgb25seSB0aGUgbm9uLWhpZGRlbiBsYWJlbHMgZm9yIGVsZW1lbnRcbiAgICAgICAgbGV0IGxhYmVsRWxlbSA9IENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgaWYgKGxhYmVsRWxlbSA9PT0gbnVsbCB8fCAhQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgLy8gRHVlIHRvIGRlcGVuZGVuY3ksIGxhYmVsIG11c3QgYmUgZG9uZSB2aWEgdGl0bGUgLSB0aGlzIHJ1bGUgZG9lc24ndCBhcHBseVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlID0gQ29tbW9uVXRpbC5jb21wYXJlTm9kZU9yZGVyKGxhYmVsRWxlbSwgcnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAodmFsdWUgPT09IC0yKSB7XG4gICAgICAgICAgICAvLyBpbnB1dCBuZXN0ZWQgaW4gbGFiZWxcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IHdhbGtOb2RlID0gbmV3IERPTVdhbGtlcihsYWJlbEVsZW0pO1xuICAgICAgICAgICAgd2Fsa05vZGUubm9kZSA9IHJ1bGVDb250ZXh0O1xuICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgd2Fsa05vZGUubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgod2Fsa05vZGUubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcIiN0ZXh0XCIgJiYgd2Fsa05vZGUubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHx8ICh3YWxrTm9kZS5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3BhblwiICYmIHdhbGtOb2RlLm5vZGUudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gSW5wdXQgbmVzdGVkIGluIGxhYmVsIGFuZCB0ZXh0IGJlZm9yZSBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gbGFiZWwgaXMgYmVmb3JlIGlucHV0XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfbGFiZWxfYmVmb3JlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX2JlZm9yZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0LCBkb206dGV4dGFyZWEsIGRvbTpzZWxlY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9MYWJlbEJlZm9yZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX2JlZm9yZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRleHQgaW5wdXQgaXMgbmVzdGVkIGluIGxhYmVsIHN1Y2ggdGhhdCBpbnB1dCBwcmVjZWRlcyB0aGUgbGFiZWwgdGV4dFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJMYWJlbCB0ZXh0IGlzIGxvY2F0ZWQgYWZ0ZXIgaXRzIGFzc29jaWF0ZWQgdGV4dCBpbnB1dCBvciA8c2VsZWN0PiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGV4dCBpbnB1dHMgYW5kIDxzZWxlY3Q+IGVsZW1lbnRzIG11c3QgaGF2ZSBhIGxhYmVsIGJlZm9yZSB0aGUgaW5wdXQgY29udHJvbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbnB1dFwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGUgIT0gXCJ0ZXh0XCIgJiYgdHlwZSAhPSBcImZpbGVcIiAmJiB0eXBlICE9IFwicGFzc3dvcmRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IG9ubHkgdGhlIG5vbi1oaWRkZW4gbGFiZWxzIGZvciBlbGVtZW50XG4gICAgICAgIGxldCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAobGFiZWxFbGVtID09IG51bGwgfHwgIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGxhYmVsRWxlbSkpIHtcbiAgICAgICAgICAgIC8vIER1ZSB0byBkZXBlbmRlbmN5LCBsYWJlbCBtdXN0IGJlIGRvbmUgdmlhIHRpdGxlIC0gdGhpcyBydWxlIGRvZXNuJ3QgYXBwbHlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlID0gQ29tbW9uVXRpbC5jb21wYXJlTm9kZU9yZGVyKGxhYmVsRWxlbSwgcnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAodmFsdWUgPT09IC0yKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgaWYgbm8gbGFiZWwgb3IgdGhlIGNvbnRlbnQgZm9yIHRoZSBsYWJlbCBpcyBvbmx5IGZyb20gdGhlIG5lc3RlZCBpbnB1dCBjb250cm9sIFxuICAgICAgICAgICAgbGV0IHRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmIENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCkgPT09IHRleHQudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gRHVlIHRvIGRlcGVuZGVuY3ksIGxhYmVsIG11c3QgYmUgZG9uZSB2aWEgdGl0bGUgLSB0aGlzIHJ1bGUgZG9lc24ndCBhcHBseVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbnB1dCBuZXN0ZWQgaW4gbGFiZWxcbiAgICAgICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCB3YWxrTm9kZSA9IHJ1bGVDb250ZXh0LnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gKCh3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiI3RleHRcIiAmJiB3YWxrTm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHx8ICh3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwic3BhblwiICYmIHdhbGtOb2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIElucHV0IG5lc3RlZCBpbiBsYWJlbCBhbmQgdGV4dCBhZnRlciBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIGxhYmVsIGlzIGFmdGVyIGlucHV0XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhdmVuJ3QgcmV0dXJuZWQgeWV0LCB0aGVuIEkgcGFzc1xuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9sYWJlbF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6Y2hlY2tib3gsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOnJhZGlvLGFyaWE6c2VhcmNoYm94LGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnN3aXRjaCxhcmlhOnRleHRib3gsYXJpYTpwcm9ncmVzc2Jhcixkb206aW5wdXRbdHlwZT1maWxlXSxkb206b3V0cHV0LGRvbTptZXRlcixkb206aW5wdXRbdHlwZT1wYXNzd29yZF1cIixcbiAgICAvL2RlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3JlZHVuZGFudFwiLCBcImFyaWFfcm9sZV92YWxpZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9FeHBsaWNpdExhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfbGFiZWxfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRm9ybSBjb250cm9sIGVsZW1lbnQgPHswfT4gaGFzIG5vIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRm9ybSBjb250cm9sIHdpdGggXFxcInswfVxcXCIgcm9sZSBoYXMgbm8gYXNzb2NpYXRlZCBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZm9ybSBjb250cm9sIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgLyogcmVtb3ZlIDEuMS4xIG1hcHBpbmcsIGtlZXAgNC4xLjIgKi9cbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBodHRwczovL2dpdGh1Yi5jb20vSUJNYS9lcXVhbC1hY2Nlc3MvaXNzdWVzLzc1NlxuICAgIGFjdDogW1wiOTdhNGUxXCIsIFwiZTA4NmU1XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgaW5wdXQgdHlwZVxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImJ1dHRvblwiIHx8IEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJidXR0b25cIikpIHtcbiAgICAgICAgICAgIHR5cGUgPSBcImJ1dHRvbmVsZW1cIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJpbnB1dFwiICYmIHR5cGUgPT0gXCJcIikge1xuICAgICAgICAgICAgdHlwZSA9IFwidGV4dFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZWQgYnkgaW5wdXRfbGFiZWxfZXhpc3RzSW1hZ2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4vKiogXG4gICAgICAgIGxldCBQT0YgPSAtMTtcbiAgICAgICAgbGV0IHRleHRUeXBlcyA9IENvbW1vblV0aWwuaW5wdXRfdGV4dF90eXBlcztcbiAgICAgICAgbGV0IGJ1dHRvblR5cGVzID0gQ29tbW9uVXRpbC5mb3JtX2J1dHRvbl90eXBlczsgIFxuICAgICAgIFxuICAgICAgICBsZXQgYnV0dG9uVHlwZXNXaXRoRGVmYXVsdHMgPSBbXCJyZXNldFwiLCBcInN1Ym1pdFwiXTsgLy8gJ3N1Ym1pdCcgYW5kICdyZXNldCcgaGF2ZSB2aXNpYmxlIGRlZmF1bHRzLlxuICAgICAgICBpZiAodGV4dFR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSB7IC8vIElmIHR5cGUgaXMgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudHMsIGluIHRoZSBjYXNlIHRoYXQgYSBsYWJlbCBpcyBoaWRkZW4gdGhlbiBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgICAgICAgLy8gTm90ZTogbGFiZWxbZm9yXSBkb2VzIG5vdCB3b3JrIGZvciBBUklBIGRlZmluZWQgaW5wdXRzXG4gICAgICAgICAgICBsZXQgbGFiZWxFbGVtID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSA/IG51bGwgOiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICBsZXQgaGFzTGFiZWxFbGVtQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGxhYmVsRWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpIHx8IFwiXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFiZWxFbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxsZWRCeUVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChsYWJlbEVsZW0sIGxhYmVsRWxlbS5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsbGVkQnlFbGVtICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsbGVkQnlFbGVtLCBsYWJlbEVsZW0pICYmIENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KGxhYmVsbGVkQnlFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzTGFiZWxFbGVtQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXNzZWQgPSAoISFsYWJlbEVsZW0gJiYgaGFzTGFiZWxFbGVtQ29udGVudCkgfHxcbiAgICAgICAgICAgICAgICAoIWxhYmVsRWxlbSAmJiBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwicGxhY2Vob2xkZXJcIikpIHx8XG4gICAgICAgICAgICAgICAgQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMCB8fCBDb21tb25VdGlsLmhhc0ltcGxpY2l0TGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMuaW5kZXhPZih0eXBlKTtcbiAgICAgICAgICAgIFxuICAgICAgICB9IGVsc2UgaWYgKGJ1dHRvblR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSB7IC8vIElmIHR5cGUgaXMgYSBidXR0b25cbiAgICAgICAgICAgIGlmIChidXR0b25UeXBlc1dpdGhEZWZhdWx0cy5pbmRleE9mKHR5cGUpICE9PSAtMSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICAvLyAnc3VibWl0JyBhbmQgJ3Jlc2V0JyBoYXZlIHZpc2libGUgZGVmYXVsdHMgc28gcGFzcyBpZiB0aGVyZSBpcyBubyAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidmFsdWVcIikgfHwgQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmluZGV4T2YodHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImJ1dHRvbmVsZW1cIikge1xuICAgICAgICAgICAgLy8gSWYgSSBhbSBhbiBpbWFnZSBhbmQgSSBoYXZlIGFsdCB0ZXh0IC0gYWNjZXNzaWJpbGl0eS13ZWItZW5naW5lIzI2OVxuICAgICAgICAgICAgbGV0IGJBbHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgaWYgKGFsdC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJBbHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBiQWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpIHx8IEFyaWFVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgYkFsdCB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5sZW5ndGggKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBhIG5hdGl2ZSBidXR0b24gaXMgbGFiZWxsZWRcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmhhc0ltcGxpY2l0TGFiZWwocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbCAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbCkpXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7ICAgIFxuICAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBScHRfQXJpYV9WYWxpZElkUmVmIGRldGVybWluZXMgaWYgdGhlIGFyaWEtbGFiZWxsZWRieSBpZCBwb2ludHMgdG8gYSB2YWxpZCBlbGVtZW50XG4gICAgICAgIGlmICghcGFzc2VkICYmIChidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSkpIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSA9PSBcImRpaml0T2ZmU2NyZWVuXCIgJiYgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpLmhhc0F0dHJpYnV0ZShcIndpZGdldGlkXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgZGlqaXQgYnV0dG9uc1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElkID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpLmdldEF0dHJpYnV0ZShcIndpZGdldGlkXCIpICsgXCJfbGFiZWxcIjtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgbGFiZWxJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWwpO1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIEkgZmFpbGVkIGFib3ZlIGFsc29cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgNCArIGJ1dHRvblR5cGVzLmluZGV4T2YodHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJvcHRncm91cFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxhYmVsXCIpO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBub2RlTmFtZSA9PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICAvLyBJcyBhIG5vbi1lbXB0eSB2YWx1ZSBhdHRyaWJ1dGUgYWxzbyBlbm91Z2ggZm9yIGFuIG9wdGlvbiBlbGVtZW50P1xuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsYWJlbFwiKSB8fCBydWxlQ29udGV4dC5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5sZW5ndGggKyAzO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgaWYgKCFwYXNzZWQpXG4gICAgICAgICAgICBwYXNzZWQgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPiAwIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBhcmlhIHJvbGUgdG8gZmlndXJlIG91dCBpZiB0aGUgYWNjZXNzaWJsZSBuYW1lIGNhbiBiZSBmcm9tIGNvbnRlbnQgXG4gICAgICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIC8vd2hlbiBtdWx0aXBsZSByb2xlcyBzcGVjaWZpZWQsIG9ubHkgdGhlIGZpcnN0IHZhbGlkIHJvbGUgKGd1YXJhbnRlZWQgYnkgZGVwZW5kZW5jaWVzKSBpcyBhcHBsaWVkLCBhbmQgdGhlIG90aGVycyBqdXN0IGFzIGZhbGxiYWNrc1xuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV0gJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXS5uYW1lRnJvbSAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbMF1dLm5hbWVGcm9tLmluY2x1ZGVzKFwiY29udGVudHNcIikpXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICB9XG4qL1xuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgcGFzc2VkID0gcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfbGFiZWxfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpjaGVja2JveCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnVpdGVtY2hlY2tib3gsYXJpYTptZW51aXRlbXJhZGlvLGFyaWE6cmFkaW8sYXJpYTpzZWFyY2hib3gsYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6c3dpdGNoLGFyaWE6dGV4dGJveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiaW5wdXRfbGFiZWxfZXhpc3RzXCJdLCBcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9WaXNpYmxlTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX25vX2xhYmVsXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9wbGFjZWhvbGRlcl9vbmx5XCI6IFwicG90ZW50aWFsX3BsYWNlaG9sZGVyX29ubHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaW5wdXRfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9wbGFjZWhvbGRlcl9vbmx5XCI6IFwiaW5wdXRfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ub19sYWJlbFwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGlucHV0IGVsZW1lbnQgaGFzIGFuIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiOiBcIlRoZSDigJhwbGFjZWhvbGRlcuKAmSBpcyB0aGUgb25seSB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ub19sYWJlbFwiOiBcIlRoZSBpbnB1dCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gaW5wdXQgZWxlbWVudCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCB2aXNpYmxlIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjUuM1wiLCBcIjMuMy4yXCJdLCAvL21hcCB0byBib3RoIHJlcXVpcmVtZW50cyBpbiBoZWxwXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlmIGEgY29udHJvbCBpcyBpbiBhIHRhYmxlIGNlbGwsIHRoZSBjb2wgaGVhZGVycyBjYW4gYWN0IGFzIHZpc2libGUgbGFiZWwsIHdoaWNoIGlzIGNoZWNrZWQgaW4gdGFibGUgaGVhZGluZyBydWxlXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gY3VzdG9tIHdpZGdldCBzdWJtaXNzaW9uIGlzIG5vdCBpbiBzY29wZSBmb3IgdGhpcyBzdWNjZXNzIGNyaXRlcmlhIChJQk1hL2VxdWFsLWFjY2VzcyMyMDQpIGlmIGl0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggZGF0YSBlbnRyeVxuICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChyb2xlICYmIHJvbGUgPT09IFwiYnV0dG9uXCIgJiYgbm9kZU5hbWUgIT09ICdpbnB1dCcgJiYgbm9kZU5hbWUgIT09ICdidXR0b24nKSB7ICAgIFxuICAgICAgICAgICAgLy8gbGlrZWx5IGEgY3VzdG9tIHdpZGdldCwgc2tpcCBpZiBub3QgYXNzb2NpYXRlZCB3aXRoIGRhdGEgZW50cnlcbiAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJmb3JtXCIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gaW4gYSBjb21ib2JveCwgb25seSBsb29rIGF0IHRoZSBpbnB1dCB0ZXh0Ym94LlxuICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSAmJlxuICAgICAgICAgICAgIShBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSB8fCBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwic2VhcmNoYm94XCIpIHx8XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCAobm9kZU5hbWUgPT09IFwic2VsZWN0XCIgJiYgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGF2b2lkIGRpYWdub3NpbmcgdGhlIHBvcHVwIGxpc3Qgb2YgYSBjb21ib2JveC5cbiAgICAgICAgbGV0IHJvbGVzVG9DaGVjayA9IFtcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlc1RvQ2hlY2subGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIHJvbGVzVG9DaGVja1tqXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tYm9ib3hlcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4ocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbWJvYm94ZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ID0gY29tYm9ib3hlc1trXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFfb3ducyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudEF0dHJpYnV0ZShjb21ib2JveCwgXCJhcmlhLW93bnNcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmlhX293bnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25zID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGFyaWFfb3ducy50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBvd25zW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWQgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIC8vIGNoZWNrIHZpc2libGUgbGFiZWwgZm9yIGlucHV0IG9yIGJ1dHRvblxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgfHwgbm9kZU5hbWUgPT09ICdidXR0b24nKSB7XG4gICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwICYmIChwYWlyLm5hbWVGcm9tID09PSAnbGFiZWwnIHx8IHBhaXIubmFtZUZyb20gPT09ICdpbnRlcm5hbCcgfHwgcGFpci5uYW1lRnJvbSA9PT0gJ2FsdCcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBhbiBhbHRlcm5hdGl2ZSB0b29sdGlwIGV4aXN0cyB0aGF0IGNhbiBiZSBtYWRlIHZpc2libGUgdGhyb3VnaCBtb3VzZW92ZXJcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCAmJiAocGFpci5uYW1lRnJvbSA9PT0gJ3RleHQnIHx8IHBhaXIubmFtZUZyb20gPT09ICd0aXRsZScpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICAvLyBjaGVjayBpZiBhbnkgdmlzaWJsZSB0ZXh0IGZyb20gdGhlIGNvbnRyb2wuIFxuICAgICAgICAvLyBub3RlIHRoYXQgKDEpIHRoZSB0ZXh0IGRvZXNu4oCZdCBuZWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udHJvbCB0byBmb3JtIGEgcmVsYXRpb25zaGlwXG4gICAgICAgIC8vICAoMikgdGhlIHRleHQgZG9lc24ndCBuZWVkIHRvIGZvbGxvdyBhY2Nlc3NpYmxlIG5hbWUgcmVxdWlyZW1lbnQgKGUuZy4gbmFtZUZyb20pXG4gICAgICAgIGNvbnN0IHRleHQgPSBDb21tb25VdGlsLmdldE9uU2NyZWVuSW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHRleHQgJiYgdGV4dC5sZW5ndGggIT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICBcbiAgICAgICAgLy8gY2hlY2sgaWYgYW55IGRlc2NlbmRhbnQgd2l0aCBhbiBhbHRlcm5hdGl2ZSB0b29sdGlwIHRoYXQgY2FuIGJlIG1hZGUgdmlzaWJsZSB0aHJvdWdoIG1vdXNlb3ZlclxuICAgICAgICAvLyBvbmx5IGNvbnNpZGVyIGltZyBhbmQgc3ZnLCBhbmQgb3RoZXIgdGV4dCBjb250ZW50IG9mIHRoZSBkZXNjZW5kYW50IGlzIGNvdmVyZWQgaW4gdGhlIGlzSW5uZXJUZXh0IGFib3ZlICBcbiAgICAgICAgbGV0IGRlc2NlbmRhbnRzID0gQXJpYVV0aWwuZ2V0QWxsRGVzY2VuZGFudHNXaXRoUm9sZXMocnVsZUNvbnRleHQsIFtcImltZ1wiLCBcImdyYXBoaWNzLWRvY3VtZW50XCIsIFwiZ3JhcGhpY3Mtb2JqZWN0XCIsIFwiZ3JhcGhpY3Mtc3ltYm9sXCJdLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChkZXNjZW5kYW50cyAmJiBkZXNjZW5kYW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkPTA7IGQgPCBkZXNjZW5kYW50cy5sZW5ndGg7IGQrKykge1xuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGRlc2NlbmRhbnRzW2RdLCBcInRpdGxlXCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZGVzY2VuZGFudHNbZF0sIFwiYWx0XCIpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB2aXNpYmxlIGxhYmVsIHBvaW50ZWQgdG8gYnkgdGhlIGFyaWEtbGFiZWxsZWRieSBhdHRyaWJ1dGUuXG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbGV0IHRoZUxhYmVsID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICAgICAgICAgICAgbGV0IGxhYmVsVmFsdWVzID0gdGhlTGFiZWwuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGFiZWxWYWx1ZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudEJ5SWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgbGFiZWxWYWx1ZXNbal0pO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50QnlJZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShlbGVtZW50QnlJZCwgcnVsZUNvbnRleHQpICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50QnlJZCkgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4oZWxlbWVudEJ5SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgobm9kZU5hbWUgPT09IFwib3B0Z3JvdXBcIiB8fCBub2RlTmFtZSA9PSBcIm9wdGlvblwiKSAmJiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwICYmIChwYWlyLm5hbWVGcm9tID09PSAnbGFiZWwnIHx8IHBhaXIubmFtZUZyb20gPT09ICdjb250ZW50JykpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyByZWZlcmVuY2VkIGJ5IGEgY29tYm9ib3guIElmIHNvLCB0aGUgbGFiZWwgYmVsb25ncyB0byB0aGUgY29tYm9ib3hcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGlmIChpZCAmJiBpZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihgKlthcmlhLWNvbnRyb2xzPScke2lkfSddW3JvbGU9J2NvbWJvYm94J11gKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYSBwbGFjZWhvbGRlciBleGlzdHMgZXZlbiB0aG91Z2ggYSBwbGFjZWhvbGRlciB0ZXh0IGlzIG5vdCBzdWZmaWNpZW50IGFzIGEgdmlzaWJsZSB0ZXh0XG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInBsYWNlaG9sZGVyXCIpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiKTtcblxuICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9ub19sYWJlbFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfb25jaGFuZ2VfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X29uY2hhbmdlX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0W29uY2hhbmdlXSwgZG9tOnRleHRhcmVhW29uY2hhbmdlXSwgZG9tOnNlbGVjdFtvbmNoYW5nZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9IYXNPbmNoYW5nZVwiOiB7XG4gICAgICAgICAgICAvLyBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfd2FybmluZ1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImlucHV0X29uY2hhbmdlX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF93YXJuaW5nXCI6IFwiaW5wdXRfb25jaGFuZ2VfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZXJzIG11c3QgYmUgYWR2aXNlZCBpZiwgZHVlIHRvIGEgY2hhbmdlIG9mIGVsZW1lbnQgdmFsdWUsIGEgZm9ybSBhdXRvbWF0aWNhbGx5IHN1Ym1pdHMsIGEgbmV3IHdpbmRvdyBvcGVucywgb3IgYSBjaGFuZ2UgaW4gZm9jdXMgb2NjdXJzXCIsXG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJUaGUgdXNlciBpcyBhZHZpc2VkIG9mIHRoZSBhdXRvbWF0aWMgZm9ybSBzdWJtaXNzaW9uLCBuZXcgd2luZG93IG9wZW5pbmcsIG9yIGZvY3VzIGNoYW5nZVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfd2FybmluZ1wiOiBcIkNvbmZpcm0gdGhhdCB0aGUgdXNlciBpcyBhZHZpc2VkIGlmLCBkdWUgdG8gYSBjaGFuZ2Ugb2YgZWxlbWVudCB2YWx1ZSwgYSBmb3JtIGF1dG9tYXRpY2FsbHkgc3VibWl0cywgYSBuZXcgd2luZG93IG9wZW5zLCBvciBhIGNoYW5nZSBpbiBmb2N1cyBvY2N1cnNcIiAgICBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcImhpZGRlblwiIHx8IHR5cGUgPT09IFwic3VibWl0XCIgfHwgdHlwZSA9PT0gXCJpbWFnZVwiIHx8IHR5cGUgPT09IFwiYnV0dG9uXCIgfHwgdHlwZSA9PT0gXCJyZXNldFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfd2FybmluZ1wiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0W3BsYWNlaG9sZGVyXSwgZG9tOnRleHRhcmVhW3BsYWNlaG9sZGVyXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19JbnB1dF9QbGFjZWhvbGRlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiUG90ZW50aWFsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkhUTUw1IHBsYWNlaG9sZGVyIGlzIHRoZSBvbmx5IHZpc2libGUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJBZGRpdGlvbmFsIHZpc2libGUgbGFiZWwgcmVmZXJlbmNlZCBieSAnYXJpYS1sYWJlbGxlZGJ5JyBpcyBub3QgdmFsaWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIVE1MNSAncGxhY2Vob2xkZXInIGF0dHJpYnV0ZSBtdXN0IG5vdCBiZSB1c2VkIGFzIGEgdmlzaWJsZSBsYWJlbCByZXBsYWNlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIG1lcmdlIHRoZSBydWxlIGludG8gaW5wdXRfbGFiZWxfdmlzaWJsZVxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgICovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJoaWRkZW5cIiB8fCB0eXBlID09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaGlkZGVuXCIpKSB7XG4gICAgICAgICAgICBsZXQgaGlkZGVuID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaGlkZGVuXCIpO1xuICAgICAgICAgICAgaWYgKGhpZGRlbiA9PSBcIlwiIHx8IGhpZGRlbi50b0xvd2VyQ2FzZSgpID09IFwiaGlkZGVuXCIpIHsgLy8gd2hlbiBoaWRkZW4gaXMgZW1wdHkgaW4gdGhlIGVsZW1lbnQsIFwiXCIgaXMgcmV0dXJuZWQsIHNhbWUgYXMgaXQgaGFzIGEgdmFsdWUgb2YgXCJcIi5cbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICAgICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGxldCByZWZJZHMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikudHJpbSgpLnNwbGl0KC9cXHMrLyk7IC8vIHNlcGFyYXRlZCBieSBvbmUgb3IgbW9yZSB3aGl0ZSBzcGFjZXNcbiAgICAgICAgICAgIGlmICghcmVmSWRzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBsYWJlbF9jb250ZW50X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJsYWJlbF9jb250ZW50X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxhYmVsXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0xhYmVsX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzX1JlZ3VsYXJcIjogXCJQYXNzX1JlZ3VsYXJcIixcbiAgICAgICAgICAgIFwiUGFzc19BcmlhTGFiZWxcIjogXCJQYXNzX0FyaWFMYWJlbFwiLFxuICAgICAgICAgICAgXCJQYXNzX0xhYmVsbGVkQnlcIjogXCJQYXNzX0xhYmVsbGVkQnlcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc19SZWd1bGFyXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzX0FyaWFMYWJlbFwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc19MYWJlbGxlZEJ5XCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzX1JlZ3VsYXJcIjogXCI8bGFiZWw+IGVsZW1lbnQgaGFzIGFjY2Vzc2libGUgbmFtZSB3aXRoIGlubmVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiUGFzc19BcmlhTGFiZWxcIjogXCI8bGFiZWw+IGVsZW1lbnQgaGFzIGFjY2Vzc2libGUgbmFtZSB2aWEgJ2FyaWEtbGFiZWwnXCIsXG4gICAgICAgICAgICBcIlBhc3NfTGFiZWxsZWRCeVwiOiBcIjxsYWJlbD4gZWxlbWVudCBoYXMgYWNjZXNzaWJsZSBuYW1lIHZpYSAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPGxhYmVsPiBlbGVtZW50IGRvZXMgbm90IGhhdmUgZGVzY3JpcHRpdmUgdGV4dCB0aGF0IGlkZW50aWZpZXMgdGhlIGV4cGVjdGVkIGlucHV0XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8bGFiZWw+IGVsZW1lbnQgbXVzdCBoYXZlIG5vbi1lbXB0eSBkZXNjcmlwdGl2ZSB0ZXh0IHRoYXQgaWRlbnRpZmllcyB0aGUgcHVycG9zZSBvZiB0aGUgaW50ZXJhY3RpdmUgY29tcG9uZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX1JlZ3VsYXJcIik7XG5cbiAgICAgICAgfSBlbHNlIGlmICgocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fCBcIlwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19BcmlhTGFiZWxcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JykpO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbEVsZW0sIHJ1bGVDb250ZXh0KSAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudChsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19MYWJlbGxlZEJ5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjb25zdCBsYWJlbF9uYW1lX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGFiZWxfbmFtZV92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmNoZWNrYm94LGFyaWE6Z3JpZGNlbGwsYXJpYTpsaW5rLGFyaWE6bWVudWl0ZW0sYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOm9wdGlvbixhcmlhOnJhZGlvLGFyaWE6c3dpdGNoLGFyaWE6dGFiLGFyaWE6dHJlZWl0ZW0sZG9tOmlucHV0LGRvbTp0ZXh0YXJlYSxkb206c2VsZWN0LGRvbTpvdXRwdXQsZG9tOm1ldGVyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjFfTGFiZWxfQWNjZXNzaWJsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImxhYmVsX25hbWVfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImxhYmVsX25hbWVfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGFiZWxfbmFtZV92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiQWNjZXNzaWJsZSBuYW1lIG1hdGNoZXMgb3IgY29udGFpbnMgdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJBY2Nlc3NpYmxlIG5hbWUgZG9lcyBub3QgbWF0Y2ggb3IgY29udGFpbiB0aGUgdmlzaWJsZSBsYWJlbCB0ZXh0XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWNjZXNzaWJsZSBuYW1lIG11c3QgbWF0Y2ggb3IgY29udGFpbiB0aGUgdmlzaWJsZSBsYWJlbCB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi41LjNcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogUmV2aWV3IGh0dHBzOi8vZ2l0aHViLmNvbS9hY3QtcnVsZXMvYWN0LXJ1bGVzLmdpdGh1Yi5pby9pc3N1ZXMvMTYxOFxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9XQUkvV0NBRzIxL1RlY2huaXF1ZXMvYXJpYS9BUklBMjRcbiAgICBhY3Q6IFwiMmVlOGI4XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFzcyBpZiB0aGUgdmlzaWJsZSB0ZXh0IHVzZXMgTWF0ZXJpYWwgSWNvbiBmb250XG4gICAgICAgIGlmIChDU1NVdGlsLmlzTWF0ZXJpYWxJY29uRm9udChydWxlQ29udGV4dCkpIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgbGV0IGlzSW5wdXRCdXR0b24gPSBmYWxzZTtcbiAgICAgICAgLy9sZXQgYnV0dG9uVHlwZXMgPSBbXCJidXR0b25cIiwgXCJyZXNldFwiLCBcInN1Ym1pdFwiXTsgLy9cImltYWdlXCJcbiAgICAgICAgbGV0IGlucHV0VHlwZSA9IG51bGw7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGlucHV0VHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmZvcm1fYnV0dG9uX3R5cGVzLmluZGV4T2YoaW5wdXRUeXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpc0lucHV0QnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aGVMYWJlbEJ5ID0gQXJpYVV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsbGVkYnlcIik7XG4gICAgICAgIGlmICh0aGVMYWJlbEJ5ICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihydWxlQ29udGV4dCwgdGhlTGFiZWxCeSkgJiYgIWlzSW5wdXRCdXR0b24pIHtcbiAgICAgICAgICAgIC8vIHNraXAgdGhlIGNoZWNrcyBpZiBpdCBoYXMgYW4gYXJpYS1sYWJlbGxlZGJ5IHNpbmNlIGl0IHRha2VzIHByZWNlZGVuY2UuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdGhlTGFiZWwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoZUxhYmVsQnkgJiYgIUNvbW1vblV0aWwuaXNJZFJlZmVyVG9TZWxmKHJ1bGVDb250ZXh0LCB0aGVMYWJlbEJ5KSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbFZhbHVlcyA9IHRoZUxhYmVsQnkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxhYmVsVmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50QnlJZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBsYWJlbFZhbHVlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50QnlJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGFiZWwgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChlbGVtZW50QnlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhlTGFiZWwgPSBBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhlTGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHRleHQgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoaXNJbnB1dEJ1dHRvbikge1xuICAgICAgICAgICAgICAgIC8qIE5vdGU6IERpc2FibGUgdGhlIGFsdCBjaGVjayBpbiBpbWFnZXMgdW50aWwgd2UgZ2V0IGNvbmZpcm1hdGlvblxuICAgICAgICAgICAgICAgIGlmIChpbnB1dFR5cGU9PT1cImltYWdlXCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpKXtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlICdhbHQnIGF0dHJpYnV0ZSBhcyB2aXNpYmxlIHRleHRcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICB9ZWxzZSBcbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgJ3ZhbHVlJyBhdHRyaWJ1dGUgYXMgdmlzaWJsZSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRUeXBlID09PSBcInN1Ym1pdFwiLyp8fGlucHV0VHlwZT09PVwiaW1hZ2VcIiovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gXCJzdWJtaXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dFR5cGUgPT09IFwicmVzZXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFwicmVzZXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBhIDxsYWJlbD4gZWxlbWVudFxuICAgICAgICAgICAgICAgIGxldCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibGFiZWxcIiAvKiYmIFJQVFV0aWwuaXNGaXJzdEZvcm1FbGVtZW50KHBhcmVudE5vZGUsIHJ1bGVDb250ZXh0KSovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50Q2xvbmUgPSBwYXJlbnROb2RlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2x1ZGUgYWxsIGZvcm0gZWxlbWVudHMgZnJvbSB0aGUgbGFiZWwgc2luY2UgdGhleSBtaWdodCBhbHNvIGhhdmUgaW5uZXIgY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBsYWJlbEVsZW0gPyBsYWJlbEVsZW0gOiBydWxlQ29udGV4dDtcblxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50c1RvU2tpcENvbnRlbnRDaGVjayA9IFtcIm1ldGVyXCIsIFwib3V0cHV0XCIsIFwicHJvZ3Jlc3NcIiwgXCJzZWxlY3RcIiwgXCJ0ZXh0YXJlYVwiXTtcbiAgICAgICAgICAgICAgICBpZiAoIWxhYmVsRWxlbSAmJiBlbGVtZW50c1RvU2tpcENvbnRlbnRDaGVjay5pbmRleE9mKG5vZGVOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFwiXCI7IC8vIHNraXAgY29udGVudCBjaGVjayBmb3Igc29tZSBlbGVtZW50c1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdmlzaWJsZSB0ZXh0IG9ubHlcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IENvbW1vblV0aWwuZ2V0T25TY3JlZW5Jbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLyogTm90ZTogRGlzYWJsZSB0aGlzIGFsdCBjaGVjayBpbiBpbWFnZXMgZm9yIG5vdyB1bnRpbCB3ZSBnZXQgY29uZmlybWF0aW9uXG4gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlIGFsdCBhdHRyaWJ1dGUgb2YgYW4gaW1hZ2Ugd2hpY2ggaXMgY29uc2lkZXJlZCB2aXNpYmxlIHRleHQuXG4gICAgICAgICAgICAgICAgbGV0IGhhc0ltZ0FsdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbncgPSBSUFRVdGlsLm5ldyBOb2RlV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIWhhc0ltZ0FsdCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCAmJiBudy5ub2RlICE9IGVsZW1lbnQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ltZ0FsdCA9IChudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbWdcIiAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwiYWx0XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNJbWdBbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dCA/IHRleHQgKyBudy5ub2RlLmdldEF0dHJpYnV0ZShcImFsdFwiKSA6IG53Lm5vZGUuZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBub25hbHBoYW51bWVyaWMgPSAvW15hLXpBLVowLTldL2c7XG5cbiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2Uobm9uYWxwaGFudW1lcmljLCBcIiBcIik7IC8vIG9ubHkgY29uc2lkZXIgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIGxldCBub3JtYWxpemVkVGV4dCA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyh0ZXh0KS50b0xvd2VyQ2FzZSgpOyAvLyBMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGFuZCBkaWZmZXJlbmNlIGluIGNhc2Ugc2Vuc2l0aXZpdHkgc2hvdWxkIGJlIGlnbm9yZWQuXG5cbiAgICAgICAgICAgIHRoZUxhYmVsID0gdGhlTGFiZWwucmVwbGFjZShub25hbHBoYW51bWVyaWMsIFwiIFwiKTsgLy8gb25seSBjb25zaWRlciBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWRMYWJlbCA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyh0aGVMYWJlbCkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRUZXh0Lmxlbmd0aCA+IDEpIHsgLy8gc2tpcCBub24tdGV4dCBjb250ZW50LiBlLmcuLCA8YnV0dG9uIGFyaWEtbGFiZWw9XCJjbG9zZVwiPlg8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICBsZXQgbG9jYXRpb24gPSBub3JtYWxpemVkTGFiZWwuaW5kZXhPZihub3JtYWxpemVkVGV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBdm9pZCBtYXRjaGluZyBwYXJ0aWFsIHdvcmRzLmUuZy4sIHRleHQgXCJuYW1lXCIgc2hvdWxkIG5vdCBtYXRjaCAnc3VybmFtZScgb3IgJ25hbWVzJ1xuICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA+PSAwICYmIG5vcm1hbGl6ZWRMYWJlbC5sZW5ndGggPiBub3JtYWxpemVkVGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxldHRlcnMgPSAvXlswLTlhLXpBLVpdKyQvO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGxvY2F0aW9uICsgbm9ybWFsaXplZFRleHQubGVuZ3RoKSA8IG5vcm1hbGl6ZWRMYWJlbC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoZUNoYXIgPSBub3JtYWxpemVkTGFiZWwuY2hhckF0KGxvY2F0aW9uICsgbm9ybWFsaXplZFRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGVDaGFyLm1hdGNoKGxldHRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiBsb2NhdGlvbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGJlZ2lubmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoZUNoYXIgPSBub3JtYWxpemVkTGFiZWwuY2hhckF0KGxvY2F0aW9uIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhlQ2hhci5tYXRjaChsZXR0ZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PT0gLTEpIHsgLy8gY2hlY2sgdGhhdCB2aXNpYmxlIHRleHQgY29udGVudCBvZiB0aGUgdGFyZ2V0IGlzIGNvbnRhaW5lZCB3aXRoaW4gaXRzIGFjY2Vzc2libGUgbmFtZS5cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbGFiZWxfcmVmX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImxhYmVsX3JlZl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxhYmVsW2Zvcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9MYWJlbF9SZWZWYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9pbnZhbGlkXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsYWJlbF9yZWZfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlICdmb3InIGF0dHJpYnV0ZSBmb3IgYSBsYWJlbCByZWZlcmVuY2VhIGEgdW5pcXVlIG5vbi1lbXB0eSAnaWQnIGF0dHJpYnV0ZSBvZiBhIHZhbGlkIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiVGhlIHZhbHVlIFxcXCJ7MH1cXFwiIG9mIHRoZSAnZm9yJyBhdHRyaWJ1dGUgaXMgbm90IHRoZSAnaWQnIG9mIGEgdmFsaWQgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnZm9yJyBhdHRyaWJ1dGUgZm9yIGEgbGFiZWwgc2hvdWxkIHJlZmVyZW5jZSBhIG5vbi1lbXB0eSwgdW5pcXVlICdpZCcgYXR0cmlidXRlIG9mIGEgdmFsaWQgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZm9yXCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCB0YXJnZXQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgaWQpO1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgaWYgYm90aCBsYWJlbCBhbmQgY29udHJvbCBhcmUgaW52aXNpYmxlXG4gICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZSh0YXJnZXQpICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gaGFuZGxlcyBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghdGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBGYWlsIGlmIHdlJ3JlIHBvaW50aW5nIGF0IHNvbWV0aGluZyB0aGF0IGlzIGxhYmVsbGVkIGJ5IGFub3RoZXIgbWVjaGFuaXNtXG4gICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gbm9kZU5hbWUgPT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09IFwic2VsZWN0XCIgfHwgbm9kZU5hbWUgPT0gXCJ0ZXh0YXJlYVwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwiYnV0dG9uXCIgfHwgbm9kZU5hbWUgPT0gXCJkYXRhbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwib3B0Z3JvdXBcIiB8fCBub2RlTmFtZSA9PSBcIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwia2V5Z2VuXCIgfHwgbm9kZU5hbWUgPT0gXCJvdXRwdXRcIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcInByb2dyZXNzXCIgfHwgbm9kZU5hbWUgPT0gXCJtZXRlclwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwiZmllbGRzZXRcIiB8fCBub2RlTmFtZSA9PSBcImxlZ2VuZFwiO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgdGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0eXBlID09IFwidGV4dFwiIHx8IHR5cGUgPT0gXCJwYXNzd29yZFwiIHx8IHR5cGUgPT0gXCJmaWxlXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJjaGVja2JveFwiIHx8IHR5cGUgPT0gXCJyYWRpb1wiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiaGlkZGVuXCIgfHwgdHlwZSA9PSBcInNlYXJjaFwiIHx8IHR5cGUgPT0gXCJ0ZWxcIiB8fCB0eXBlID09IFwidXJsXCIgfHwgdHlwZSA9PSBcImVtYWlsXCIgfHwgIC8vSFRNTCA1XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiZGF0ZVwiIHx8IHR5cGUgPT0gXCJudW1iZXJcIiB8fCB0eXBlID09IFwicmFuZ2VcIiB8fCB0eXBlID09IFwiaW1hZ2VcIiB8fCAvL0hUTUwgNVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcInRpbWVcIiB8fCB0eXBlID09IFwiY29sb3JcIiB8fCAgLy8gSFRNTCA1XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiZGF0ZXRpbWUtbG9jYWxcIiB8fCB0eXBlID09IFwibW9udGhcIiB8fCB0eXBlID09IFwid2Vla1wiOyAvL0hUTUw1LjFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBvbmUgbW9yZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIHRhcmdldCBlbGVtZW50IGlzIE5PVCBoaWRkZW4sIGluIHRoZSBjYXNlIHRoZSB0YXJnZXQgaXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBmbGFnIGEgdmlvbGF0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBpcy5cbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZSh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFRva2VuOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChpZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW5dKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZFwiLCByZXRUb2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjb25zdCBsaXN0X2NoaWxkcmVuX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3RfY2hpbGRyZW5fdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JvdXBcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfTGlzdF9Hcm91cF9MaXN0SXRlbVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImxpc3RfY2hpbGRyZW5fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTGlzdCBjb21wb25lbnQgd2l0aCBcXFwiZ3JvdXBcXFwiIHJvbGUgaGFzIGNoaWxkcmVuIHRoYXQgYXJlIG5vdCA8bGlzdGl0ZW0+IGVsZW1lbnRzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTGlzdCBjb21wb25lbnQgd2l0aCBcXFwiZ3JvdXBcXFwiIHJvbGUgbXVzdCBsaW1pdCBjaGlsZHJlbiB0byA8bGlzdGl0ZW0+IGVsZW1lbnRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhwYXJlbnQsIFwibGlzdFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcnVsZUNvbnRleHQuY2hpbGRyZW47XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwibGlzdGl0ZW1cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuLy8gTWF0Y2hlcyB1bm9yZGVyZWQgbGlzdCBpdGVtIHByZWZpeGVzOiDigKIsIOKXpiwg4paqLCDilrgsIOKWuiwg4pyTLCDinJcsIOKcpiwg4oCTLCDigJQsICosIC0sIG9cbmNvbnN0IFVOT1JERVJFRF9CVUxMRVRfUEFUVEVSTiA9IC9eWyBcXHRdKlvigKLil6bilqrilrjilrrinJPinJfinKZcXC3igJPigJQqb11bIFxcdF0rXFxTLztcblxuLy8gTWF0Y2hlcyBvcmRlcmVkIGxpc3QgaXRlbSBwcmVmaXhlczogMS4gMSkgKDEpIGEuIGEpIChhKSBBLiBBKSBpLiBpaS4gaWlpLiBldGMuXG5jb25zdCBPUkRFUkVEX0lURU1fUEFUVEVSTiA9IC9eWyBcXHRdKig/OlxcKD9cXGQrWy4pXVxcKT98XFwoP1thLXpBLVpdWy4pXVxcKT98XFwoPyg/Oml7MSwzfXxpdnx2aXswLDN9fGl4fHhpezAsM318eGl2fHh2KVsuKV1cXCk/KVsgXFx0XStcXFMvaTtcblxuY29uc3QgTElTVF9JVEVNX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFxuICAgIFVOT1JERVJFRF9CVUxMRVRfUEFUVEVSTi5zb3VyY2UgKyBcInxcIiArIE9SREVSRURfSVRFTV9QQVRURVJOLnNvdXJjZSxcbiAgICBcImlcIlxuKTtcblxuLy8gQmxvY2stbGV2ZWwgZWxlbWVudHMgdGhhdCBhY3QgYXMgYm91bmRhcmllcyBiZXR3ZWVuIGluZGVwZW5kZW50IGNvbnRlbnQgZ3JvdXBzXG5jb25zdCBCTE9DS19FTEVNRU5UUyA9IG5ldyBTZXQoW1xuICAgIFwiYmxvY2txdW90ZVwiLCBcImNlbnRlclwiLCBcImRpclwiLCBcImRpdlwiLCBcImZvcm1cIixcbiAgICBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIiwgXCJoNlwiLFxuICAgIFwiaHJcIiwgXCJiclwiLCBcIm1lbnVcIiwgXCJwXCIsIFwicHJlXCIsIFwidGFibGVcIixcbiAgICBcInNlY3Rpb25cIiwgXCJhcnRpY2xlXCIsIFwiYXNpZGVcIiwgXCJuYXZcIiwgXCJoZWFkZXJcIiwgXCJmb290ZXJcIixcbiAgICBcImZpZ3VyZVwiLCBcImZpZ2NhcHRpb25cIiwgXCJkZXRhaWxzXCIsIFwic3VtbWFyeVwiLCBcImRpYWxvZ1wiLFxuICAgIFwic2NyaXB0XCIsIFwic3R5bGVcIiwgXCJsYWJlbFwiLFxuICAgIFwidWxcIiwgXCJvbFwiLCBcImRsXCIsIFwibGlcIiwgXCJkdFwiLCBcImRkXCJcbl0pO1xuXG4vLyBJbmxpbmUgZWxlbWVudHMgd2hvc2UgdGV4dCBjb250ZW50IGlzIHRyZWF0ZWQgYXMgcGFydCBvZiB0aGUgc3Vycm91bmRpbmcgdGV4dCBydW5cbmNvbnN0IElOTElORV9FTEVNRU5UUyA9IG5ldyBTZXQoW1xuICAgIFwiYVwiLCBcImFiYnJcIiwgXCJhY3JvbnltXCIsIFwiYlwiLCBcImJkb1wiLCBcImJpZ1wiLCBcImJyXCIsIFwiYnV0dG9uXCIsIFwiY2l0ZVwiLFxuICAgIFwiY29kZVwiLCBcImRmblwiLCBcImVtXCIsIFwiaVwiLCBcImltZ1wiLCBcImlucHV0XCIsIFwia2JkXCIsIFwibGFiZWxcIiwgXCJtYXBcIixcbiAgICBcIm9iamVjdFwiLCBcIm91dHB1dFwiLCBcInFcIiwgXCJzYW1wXCIsIFwic2VsZWN0XCIsIFwic21hbGxcIiwgXCJzcGFuXCIsXG4gICAgXCJzdHJvbmdcIiwgXCJzdWJcIiwgXCJzdXBcIiwgXCJ0ZXh0YXJlYVwiLCBcInRpbWVcIiwgXCJ0dFwiLCBcInVcIiwgXCJ2YXJcIlxuXSk7XG5cbi8vIFJldHVybnMgdGhlIGNvbWJpbmVkIHRleHQgb2YgYSBub2RlIGFuZCBpdHMgaW5saW5lIGRlc2NlbmRhbnRzLCBub3JtYWxpc2VkIHRvIHNpbmdsZSBzcGFjZXNcbmZ1bmN0aW9uIGdldFNoYWxsb3dUZXh0KG5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICBub2RlLmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgdGV4dCArPSBjaGlsZC5ub2RlVmFsdWUgPz8gXCJcIjtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IChjaGlsZCBhcyBFbGVtZW50KS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKElOTElORV9FTEVNRU5UUy5oYXModGFnKSkge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gZ2V0U2hhbGxvd1RleHQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFxzKy9nLCBcIiBcIik7XG59XG5cbi8vIFJldHVybnMgdHJpbW1lZCBub24tZW1wdHkgbGluZXMgZnJvbSBhIG5vZGUsIHNwbGl0dGluZyBvbiBuZXdsaW5lcyBhbmQgPGJyPiBib3VuZGFyaWVzXG5mdW5jdGlvbiBnZXRMaW5lc0Zyb21Ob2RlKG5vZGU6IE5vZGUpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmdW5jdGlvbiB3YWxrKG46IE5vZGUpIHtcbiAgICAgICAgaWYgKG4ubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAobi5ub2RlVmFsdWUgPz8gXCJcIikuc3BsaXQoL1xccj9cXG4vKS5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSBwLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodHJpbW1lZC5sZW5ndGggPiAwKSBsaW5lcy5wdXNoKHRyaW1tZWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBuIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodGFnID09PSBcImJyXCIpIHtcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKFwiXFx4MDBcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEJMT0NLX0VMRU1FTlRTLmhhcyh0YWcpKSByZXR1cm47XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFNraXAgZWxlbWVudHMgd2l0aCBsaXN0LXJlbGF0ZWQgb3Igd2lkZ2V0IHJvbGVzXG4gICAgICAgICAgICBjb25zdCByb2xlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzV2l0aFR5cGVzKGVsZW0sIFtcIndpZGdldFwiXSk7XG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFxuICAgICAgICAgICAgICAgICAgICBbXCJjYXB0aW9uXCIsIFwiY29kZVwiLCBcImNvbHVtbmhlYWRlclwiLCBcImZpZ3VyZVwiLCBcImxpc3RcIiwgXCJsaXN0aXRlbVwiLCBcIm1hdGhcIiwgXCJtZXRlclwiLCBcInJvd2hlYWRlclwiXSxcbiAgICAgICAgICAgICAgICAgICAgcm9sZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChyb2xlcy5sZW5ndGggPiAwKSByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIG4uY2hpbGROb2Rlcy5mb3JFYWNoKHdhbGspO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2Fsayhub2RlKTtcbiAgICByZXR1cm4gbGluZXMuZmlsdGVyKGwgPT4gbCAhPT0gXCJcXHgwMFwiKTtcbn1cblxuLy8gUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29uc2VjdXRpdmUgbGlzdC1pdGVtLWxpa2UgbGluZXMgZm91bmQgYW1vbmdcbi8vIHRoZSBkaXJlY3QgY2hpbGRyZW4gb2YgcGFyZW50LCB0cmVhdGluZyA8YnI+IGFuZCB3aGl0ZXNwYWNlLW9ubHkgdGV4dCBhcyBzZXBhcmF0b3JzXG5mdW5jdGlvbiBtYXhDb25zZWN1dGl2ZUxpc3RJdGVtcyhwYXJlbnQ6IEVsZW1lbnQpOiBudW1iZXIge1xuICAgIGxldCBtYXhSdW4gPSAwO1xuICAgIGxldCBjdXJyZW50UnVuID0gMDtcbiAgICBsZXQgY3VycmVudExpbmVUZXh0ID0gXCJcIjsgIC8vIGFjY3VtdWxhdGUgdGV4dCBhY3Jvc3MgaW5saW5lIHNpYmxpbmdzIHVudGlsIDxicj5cblxuICAgIHBhcmVudC5jaGlsZE5vZGVzLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhZyA9IGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKHRhZyA9PT0gXCJiclwiKSB7XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSBhY2N1bXVsYXRlZCBsaW5lXG4gICAgICAgICAgICBjb25zdCB0cmltbWVkID0gY3VycmVudExpbmVUZXh0LnRyaW0oKTtcbiAgICAgICAgICAgIGlmICh0cmltbWVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoTElTVF9JVEVNX1BBVFRFUk4udGVzdCh0cmltbWVkKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXhSdW4gPSBNYXRoLm1heChtYXhSdW4sICsrY3VycmVudFJ1bik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhdyA9IGNoaWxkLm5vZGVWYWx1ZSA/PyBcIlwiO1xuICAgICAgICAgICAgaWYgKHJhdy50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgZW1iZWRkZWQgbmV3bGluZXMsIGZsdXNoIG9uIGVhY2hcbiAgICAgICAgICAgIGNvbnN0IHNlZ3MgPSByYXcuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgICAgICAgIHNlZ3MuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSBjdXJyZW50TGluZVRleHQudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJpbW1lZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTElTVF9JVEVNX1BBVFRFUk4udGVzdCh0cmltbWVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ1biA9IE1hdGgubWF4KG1heFJ1biwgKytjdXJyZW50UnVuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ICs9IHNlZztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IGNoaWxkIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoQkxPQ0tfRUxFTUVOVFMuaGFzKHRhZykpIHtcbiAgICAgICAgICAgICAgICAvLyBmbHVzaCBjdXJyZW50IGxpbmUgYmVmb3JlIGJsb2NrIGJvdW5kYXJ5XG4gICAgICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IGN1cnJlbnRMaW5lVGV4dC50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRyaW1tZWQubGVuZ3RoID4gMCAmJiBMSVNUX0lURU1fUEFUVEVSTi50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heFJ1biA9IE1hdGgubWF4KG1heFJ1biwgKytjdXJyZW50UnVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gMDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSU5MSU5FX0VMRU1FTlRTLmhhcyh0YWcpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ICs9IGdldFNoYWxsb3dUZXh0KGVsZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gMDtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZVRleHQgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBmbHVzaCBhbnkgcmVtYWluaW5nIGxpbmUgYXQgZW5kIG9mIGNvbnRhaW5lclxuICAgIGNvbnN0IHRyaW1tZWQgPSBjdXJyZW50TGluZVRleHQudHJpbSgpO1xuICAgIGlmICh0cmltbWVkLmxlbmd0aCA+IDAgJiYgTElTVF9JVEVNX1BBVFRFUk4udGVzdCh0cmltbWVkKSkge1xuICAgICAgICBtYXhSdW4gPSBNYXRoLm1heChtYXhSdW4sICsrY3VycmVudFJ1bik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1heFJ1bjtcbn1cblxuLy8gUmV0dXJucyB0cnVlIGlmIDIrIGNvbnNlY3V0aXZlIDxicj4tc2VwYXJhdGVkIGxpbmVzIHdpdGhpbiBlbGVtZW50IG1hdGNoIHRoZSBsaXN0LWl0ZW0gcGF0dGVyblxuZnVuY3Rpb24gaGFzQnJTZXBhcmF0ZWRMaXN0TGluZXMoZWxlbWVudDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGxldCBydW4gPSAwO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBnZXRMaW5lc0Zyb21Ob2RlKGVsZW1lbnQpKSB7XG4gICAgICAgIGlmIChMSVNUX0lURU1fUEFUVEVSTi50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICBpZiAoKytydW4gPj0gMikgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW4gPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IGxpc3RfbWFya3VwX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJsaXN0X21hcmt1cF9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGlzdF9Vc2VNYXJrdXBcIjoge1xuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3RcIjogXCJsaXN0X21hcmt1cF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxpc3RfbWFya3VwX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBvdGVudGlhbF9saXN0XCI6IFwiVmVyaWZ5IHRoaXMgaXMgYSBsaXN0IGFuZCBpZiBzbywgbW9kaWZ5IHRvIHVzZSBwcm9wZXIgSFRNTCBlbGVtZW50cyBmb3IgdGhlIGxpc3RcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm9wZXIgSFRNTCBlbGVtZW50cyBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgYSBsaXN0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkgfHwgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmNsdWRlcyhub2RlTmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiXSkgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wic2NyaXB0XCIsIFwic3R5bGVcIiwgXCJsYWJlbFwiXSkgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBPbmx5IGNoZWNrIGJsb2NrLWxldmVsIGFuZCB0YWJsZS1jZWxsIGVsZW1lbnRzIGZpcnN0IOKAlFxuICAgICAgICAvLyB0ZC90aCBtdXN0IGJlIGNoZWNrZWQgYmVmb3JlIHRoZSBhbmNlc3RvciByb2xlIGNoZWNrIHNpbmNlXG4gICAgICAgIC8vIHRhYmxlL3Jvdy9jZWxsIEFSSUEgcm9sZXMgd291bGQgb3RoZXJ3aXNlIGNhdXNlIGFuIGVhcmx5IGV4aXRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInRkXCIgfHwgbm9kZU5hbWUgPT09IFwidGhcIikge1xuICAgICAgICAgICAgaWYgKG1heENvbnNlY3V0aXZlTGlzdEl0ZW1zKHJ1bGVDb250ZXh0KSA+PSAyKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3RcIik7XG4gICAgICAgICAgICBpZiAoaGFzQnJTZXBhcmF0ZWRMaXN0TGluZXMocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3RcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgZWxlbWVudHMgdGhhdCBhbHJlYWR5IGhhdmUgc2VtYW50aWMgbGlzdCwgd2lkZ2V0LCBvciBzdHJ1Y3R1cmFsIHJvbGVzXG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNXaXRoVHlwZXMocnVsZUNvbnRleHQsIFtcIndpZGdldFwiXSk7XG4gICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChcbiAgICAgICAgICAgIFtcImNhcHRpb25cIiwgXCJjb2RlXCIsIFwiY29sdW1uaGVhZGVyXCIsIFwiZmlndXJlXCIsIFwibGlzdFwiLCBcImxpc3RpdGVtXCIsIFwibWF0aFwiLCBcIm1ldGVyXCIsIFwicm93aGVhZGVyXCJdLFxuICAgICAgICAgICAgcm9sZXNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGVzKHJ1bGVDb250ZXh0LCByb2xlcykgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBPbmx5IGNoZWNrIGJsb2NrLWxldmVsIGVsZW1lbnRzIHRvIGF2b2lkIGR1cGxpY2F0ZSByZXBvcnRzXG4gICAgICAgIGlmICghQkxPQ0tfRUxFTUVOVFMuaGFzKG5vZGVOYW1lKSAmJiBub2RlTmFtZSAhPT0gXCJib2R5XCIgJiYgbm9kZU5hbWUgIT09IFwibGlcIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChbXCJ1bFwiLCBcIm9sXCIsIFwiZGxcIiwgXCJtZW51XCJdLmluY2x1ZGVzKG5vZGVOYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChtYXhDb25zZWN1dGl2ZUxpc3RJdGVtcyhydWxlQ29udGV4dCkgPj0gMilcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3RcIik7XG5cbiAgICAgICAgaWYgKGhhc0JyU2VwYXJhdGVkTGlzdExpbmVzKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3RcIik7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyOiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3Rfc3RydWN0dXJlX3Byb3BlclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmRsLCBkb206dWwsIGRvbTpvbCwgZG9tOmRpciwgZG9tOm1lbnUsIGRvbTpsaSwgZG9tOmRkLCBkb206ZHRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MaXN0X01pc3VzZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsaXN0X3N0cnVjdHVyZV9wcm9wZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImxpc3Rfc3RydWN0dXJlX3Byb3Blci5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJMaXN0IGVsZW1lbnQgaXMgbWlzc2luZyBvciBpbXByb3Blcmx5IHN0cnVjdHVyZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJMaXN0IGVsZW1lbnRzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGxpc3RzIG9mIHJlbGF0ZWQgaXRlbXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEdldCBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgcnVsZUNvbnRleHRcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcnVsZUNvbnRleHQuY2hpbGRyZW5cblxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJkbFwiKSB7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IHdhbGtDaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gY2hpbGRyZW5zIHNldCBhcyBwYXNzZWQsIHNpbmNlIGRsIGVsZW1lbnRzIGNhbiBoYXZlXG4gICAgICAgICAgICAvLyB6ZXJvIG9yIG1vcmUgb2Y6IG9uZSBvciBtb3JlIGR0IGVsZW1lbnRzLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkZCBlbGVtZW50c1xuICAgICAgICAgICAgaWYgKCFydWxlQ29udGV4dC5jaGlsZHJlbiB8fCBydWxlQ29udGV4dC5jaGlsZHJlbi5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa0NoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhbGtDaGlsZHJlbi5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSB3YWxrQ2hpbGRyZW4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hpbGUgd2Fsa2luZyB0aHJvdWdoIHRoZSBlbGVtZW50cyB1bmRlciBkbCwgaWYgd2UgZmluZCBhIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudGF0aW9uYWwgZWxlbWVudCB3ZSBtb3ZlIHRvIHRoZSBuZXh0IGVsZW1lbnQgYXMgcHJlc2VudGF0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGFyZSBhbGxvd2VkIHVuZGVyIGxpc3QgZWxlbWVudHMgYXMgdGhleSBhcmUgb25seSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdHRpbmcgdGV4dCBub2Rlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc1ByZXNlbnRhdGlvbmFsRWxlbWVudCh3YWxrQ2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHNldCB0byBwYXNzIGlmIHdlIGZpbmQgZGQgb3IgZHQgZWxlbWVudCwgaW4gdGhlIGNhc2Ugb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGVsZW1lbnQgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIHdlIHdpbGwgY2F0Y2ggaXQgaGVyZS4gaS5lLiBpbWcgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBub2RlTmFtZSA9PSBcImRkXCIgfHwgbm9kZU5hbWUgPT0gXCJkdFwiO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgZGVwZW5kaW5nIG9uIHdoaWNoIGlzIGZvdW5kIGZpcnN0IGFuZCBsYXN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPT0gXCJcIikgZmlyc3QgPSBub2RlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBub2RlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGRyZW4gPSB3YWxrQ2hpbGRyZW4ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgd2UgaGF2ZSBmb3VuZCBkdCBhbmQgZGQgZWxlbWVudHMgdW5kZXIgZGwgd2UgcGFzcyByaWdodCBhd2F5LlxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gZHQgb3IgZGQgZWxlbWVudCwgYnV0IGJ1bmNoIG9mIHByZXNlbnRhdGlvbmFsIGVsZW1lbnRzIHdlIG1hcmsgdGhpcyBhcyBhXG4gICAgICAgICAgICAgICAgLy8gcGFzcy4gSW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBhcmUgb3RoZXIgZWxlbWVudHMsIHN1Y2ggYXMgaW1nIHdlIHdpbGwgc3RpbGwgdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAocGFzc2VkICYmIGZpcnN0ID09IFwiZHRcIiAmJiBsYXN0ID09IFwiZGRcIikgfHwgKHBhc3NlZCAmJiBwcmVzZW50YXRpb25hbEZvdW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcImxpXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInVsXCIsIFwib2xcIiwgXCJkaXJcIiwgXCJtZW51XCJdKSAhPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFwiZGRcIiB8fCBub2RlTmFtZSA9PSBcImR0XCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiZGxcIikgIT0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB3YWxrQ2hpbGRyZW4gPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgICAgICAvLyBaZXJvIG9yIG1vcmUgbGkgZWxlbWVudHMgYXJlIHBlcm1pdHRlZCBpbnNpZGUgb2YgPG9sPiwgPHVsPiBvciA8bWVudT4gZWxlbWVudHMgbm93IGFzIHBlciB0aGUgaHRtbDUgc3BlYy4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlXG4gICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGFyZSB6ZXJvIGVsZW1lbnRzIHVuZGVyIHRoZSA8b2w+LCA8dWw+IG9yIDxtZW51Pi5cbiAgICAgICAgICAgIGlmICgobm9kZU5hbWUgPT0gXCJ1bFwiIHx8IG5vZGVOYW1lID09IFwib2xcIiB8fCBub2RlTmFtZSA9PSBcIm1lbnVcIikgJiYgKCFydWxlQ29udGV4dC5jaGlsZHJlbiB8fCBydWxlQ29udGV4dC5jaGlsZHJlbi5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbGlGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGtDaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoaWxlIHdhbGtpbmcgdGhyb3VnaCB0aGUgbGlzdCBlbGVtZW50cywgaWYgd2UgZmluZCBhIFxuICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZW50YXRpb25hbCBlbGVtZW50IHdlIHNraXAgY2hlY2tpbmcgYXMgcHJlc2VudGF0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgYXJlIGFsbG93ZWQgdW5kZXIgbGlzdCBlbGVtZW50cyBhcyB0aGV5IGFyZSBvbmx5IGZvclxuICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXR0aW5nIHRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc1ByZXNlbnRhdGlvbmFsRWxlbWVudCh3YWxrQ2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25hbEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpZiB0aGUgbm9kZSB0eXBlIGlzIGFueXRoaW5nIGJ1dCAxLCBvciBpbiB0aGUgY2FzZSB0aGF0IGl0IGlzIGEgbGkgZWxlbWVudC4gRm9yIGFueSBvdGhlciBub2RlIFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIGJlIGNhdWdodCBoZXJlIHRoYXQgZWxlbWVudCBpcyBub3QgYWxsb3dlZCB1bmRlciBsaXN0IG5vZGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZ1cnRoZXJtb3JlIGluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBlbGVtZW50IHdpdGggdGhlIHBhcmVudCBiZWluZyB1bC9vbCBkb24ndCBmbGFnIGEgdmlvbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHdhbGtDaGlsZHJlbi5ub2RlVHlwZSAhPSAxIHx8IHdhbGtDaGlsZHJlbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwibGlcIiB8fCAod2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJ0ZW1wbGF0ZVwiICYmIChub2RlTmFtZSA9PSBcInVsXCIgfHwgbm9kZU5hbWUgPT0gXCJvbFwiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGxpIGZvdW5kIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgZWxlbWVudCAobm9kZVR5cGU9MSkgaXMgYW4gbGkgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBsaUZvdW5kID0gbGlGb3VuZCB8fCAod2Fsa0NoaWxkcmVuLm5vZGVUeXBlID09IDEgJiYgd2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJsaVwiKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGl0IGhhcyBwYXNzZWQgYW5kIGFsc28gbGkgZWxlbWVudCBpcyBmb3VuZCB1bmRlciBsaXN0IG5vZGUsIHdlIHBhc3MgcmlnaHQgYXdheS5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIGxpIGVsZW1lbnQsIGJ1dCBidW5jaCBvZiBwcmVzZW50YXRpb25hbCBlbGVtZW50cyB3ZSBtYXJrIHRoaXMgYXMgYVxuICAgICAgICAgICAgICAgIC8vIHBhc3MuIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgYXJlIG90aGVyIGVsZW1lbnRzLCBzdWNoIGFzIGltZyB3ZSB3aWxsIHN0aWxsIHRyaWdnZXIgYSB2aW9sYXRpb24uXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gKHBhc3NlZCAmJiBsaUZvdW5kKSB8fCAocGFzc2VkICYmIHByZXNlbnRhdGlvbmFsRm91bmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IG1hcnF1ZWVfZWxlbV9hdm9pZDogUnVsZSA9IHtcbiAgICBpZDogXCJtYXJxdWVlX2VsZW1fYXZvaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTptYXJxdWVlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWFycXVlZV9UcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwibWFycXVlZV9lbGVtX2F2b2lkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtYXJxdWVlX2VsZW1fYXZvaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJTY3JvbGxpbmcgY29udGVudCBmb3VuZCB0aGF0IHVzZXMgdGhlIG9ic29sZXRlIDxtYXJxdWVlPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxtYXJxdWVlPiBlbGVtZW50IGlzIG9ic29sZXRlIGFuZCBzaG91bGQgbm90IGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9hbHRfYnJpZWY6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYWx0X2JyaWVmXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2FsdF0sIGRvbTphcHBsZXRbYWx0XSwgZG9tOmFyZWFbYWx0XSwgZG9tOmVtYmVkW2FsdF0sIGRvbTppbnB1dFt0eXBlXVthbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfQWx0QnJpZWZcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYWx0X2JyaWVmLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJtZWRpYV9hbHRfYnJpZWYuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2FsdF9icmllZi5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVGV4dCBhbHRlcm5hdGl2ZSBpcyBtb3JlIHRoYW4gMTUwIGNoYXJhY3RlcnNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbHRlcm5hdGl2ZSB0ZXh0IGluICdhbHQnIGF0dHJpYnV0ZSBzaG91bGQgYmUgYnJpZWYgKDwxNTAgY2hhcmFjdGVycylcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBtYXhBbHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTUwLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgYWx0TGVuZ3RoID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKS5sZW5ndGg7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhbHRMZW5ndGggPD0gdmFsaWRhdGVQYXJhbXMubWF4QWx0LnZhbHVlO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1lZGlhX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFyZWFbYWx0XSwgZG9tOmVtYmVkW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9BdWRpb1ZpZGVvQWx0RmlsZW5hbWVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiRmlsZW5hbWUgdXNlZCBhcyBsYWJlbCBmb3IgZW1iZWRkZWQgYXVkaW8gb3IgdmlkZW9cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdWRpbyBvciB2aWRlbyBvbiB0aGUgcGFnZSBtdXN0IGhhdmUgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZSBtZWRpYSBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB1cmkgPSBcIlwiO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImFyZWFcIikge1xuICAgICAgICAgICAgdXJpID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXJpID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB1cmkgPSBcIlwiO1xuICAgICAgICBsZXQgZXh0ID0gQ29tbW9uVXRpbC5nZXRGaWxlRXh0KHVyaSk7XG4gICAgICAgIGxldCBpc0F1ZFZpZCA9IGV4dC5sZW5ndGggIT0gMCAmJiAoQ29tbW9uVXRpbC5pc0F1ZGlvRXh0KGV4dCkgfHwgQ29tbW9uVXRpbC5pc1ZpZGVvRXh0KGV4dCkpO1xuICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFpc0F1ZFZpZCB8fCAoYWx0VGV4dC5sZW5ndGggPiAwICYmIGFsdFRleHQuaW5kZXhPZihleHQpID09IC0xKTtcblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfYXVkaW9fdHJhbnNjcmliZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYXVkaW9fdHJhbnNjcmliZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpiZ3NvdW5kLCBkb206YVtocmVmXSwgZG9tOmFyZWFbaHJlZl0sIGRvbTplbWJlZCwgZG9tOm9iamVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX0F1ZGlvVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfYXVkaW9fdHJhbnNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJQcm92aWRlIHRyYW5zY3JpcHRzIGZvciBhdWRpbyBmaWxlc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkF1ZGlvIGluZm9ybWF0aW9uIHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBpbiB0ZXh0IGZvcm1cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGxldCB0aGlzTm9kZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aGlzTm9kZSA9PSBcImJnc291bmRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc0F1ZGlvT2JqRW1iZWRMaW5rKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDsgLy8gT3V0IG9mIFNjb3BlXG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpwYXJhbVtuYW1lPWF1dG9wbGF5XSwgZG9tOnBhcmFtW25hbWU9YXV0b3N0YXJ0XSwgZG9tOmVtYmVkW2ZsYXNodmFyc10sIGRvbTplbWJlZFtzcmNdLCBkb206KlthdXRvc3RhcnQ9dHJ1ZV0sIGRvbToqW2F1dG9zdGFydD0xXSwgZG9tOmJnc291bmRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9FbWJlZF9BdXRvU3RhcnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZXJlIGlzIGEgbWVjaGFuaXNtIHRvIHBhdXNlIG9yIHN0b3AgYW5kIGNvbnRyb2wgdGhlIHZvbHVtZSBmb3IgdGhlIGF1ZGlvIHRoYXQgcGxheXMgYXV0b21hdGljYWxseVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk1lY2hhbmlzbSBtdXN0IGJlIGF2YWlsYWJsZSB0byBwYXVzZSBvciBzdG9wIGFuZCBjb250cm9sIHRoZSB2b2x1bWUgb2YgdGhlIGF1ZGlvIHRoYXQgcGxheXMgYXV0b21hdGljYWxseVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiYmdzb3VuZFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcInBhcmFtXCIpIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSlcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidmFsdWVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNvbnRlbnQuaW5kZXhPZihcIjA7XCIpID09IDAgfHxcbiAgICAgICAgICAgICAgICAhKGNvbnRlbnQuaW5kZXhPZihcInRydWVcIikgIT0gLTEgfHwgY29udGVudC5pbmRleE9mKFwiMVwiKSAhPSAtMSk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJlbWJlZFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImZsYXNodmFyc1wiKSkge1xuICAgICAgICAgICAgICAgIGxldCBzdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJmbGFzaHZhcnNcIik7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9dHJ1ZVwiKSA9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBzdHIuaW5kZXhPZihcImF1dG9zdGFydD0xXCIpID09IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJzcmNcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PXRydWVcIikgPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9MVwiKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImF1dG9zdGFydFwiKSkge1xuICAgICAgICAgICAgbGV0IHZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImF1dG9zdGFydFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcGFzc2VkID0gdmFsICE9ICd0cnVlJyAmJiB2YWwgIT0gJzEnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206YXVkaW8sIGRvbTp2aWRlb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BdWRpb19WaWRlb19UcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBtZWRpYSB1c2luZyA8YXVkaW8+IGFuZC9vciA8dmlkZW8+IGVsZW1lbnRzIGhhdmUga2V5Ym9hcmQgYWNjZXNzaWJsZSBjb250cm9sc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk1lZGlhIHVzaW5nIDxhdWRpbz4gYW5kL29yIDx2aWRlbz4gZWxlbWVudHMgbXVzdCBoYXZlIGtleWJvYXJkIGFjY2Vzc2libGUgY29udHJvbHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImF1ZGlvXCIgfHwgbm9kZU5hbWUgPT09IFwidmlkZW9cIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfbGl2ZV9jYXB0aW9uZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfbGl2ZV9jYXB0aW9uZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTplbWJlZCwgZG9tOm9iamVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX1ZpZGVvT2JqZWN0VHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfbGl2ZV9jYXB0aW9uZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2xpdmVfY2FwdGlvbmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgY2FwdGlvbnMgYXJlIHByb3ZpZGVkIGZvciBsaXZlIG1lZGlhIChzdHJlYW1pbmcgdmlkZW8gd2l0aCBhdWRpbylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJMaXZlIG1lZGlhIChzdHJlYW1pbmcgdmlkZW8gd2l0aCBhdWRpbykgc2hvdWxkIGhhdmUgY2FwdGlvbnMgZm9yIGF1ZGlvIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFDb21tb25VdGlsLmlzVmlkZW9PYmpFbWJlZExpbmsocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfdHJhY2tfYXZhaWxhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFbaHJlZl0sIGRvbTphcmVhW2hyZWZdLCBkb206YXBwbGV0LCBkb206ZW1iZWQsIGRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9WaWRlb1JlZmVyZW5jZVRyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfdHJhY2tfYXZhaWxhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgYXZhaWxhYmlsaXR5IG9mIGEgdXNlci1zZWxlY3RhYmxlIGF1ZGlvIHRyYWNrIHdpdGggZGVzY3JpcHRpb24gb2YgdmlzdWFsIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcmUtcmVjb3JkZWQgbWVkaWEgc2hvdWxkIGhhdmUgYW4gYXVkaW8gdHJhY2sgdGhhdCBkZXNjcmliZXMgdmlzdWFsIGluZm9ybWF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuM1wiLCBcIjEuMi41XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImFwcGxldFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhc3NlZCA9ICFDb21tb25VdGlsLmlzVmlkZW9PYmpFbWJlZExpbmsocnVsZUNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZXRhX3JlZGlyZWN0X29wdGlvbmFsOiBSdWxlID0ge1xuICAgIGlkOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWxcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW2h0dHAtZXF1aXZdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfTWV0YV9SZWRpcmVjdFplcm9cIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwiZmFpbF9sb25ncmVmcmVzaFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbC5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSBzaG91bGQgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aXRob3V0IHdhcm5pbmcgb3Igb3B0aW9uIHRvIHR1cm4gaXQgb2ZmIG9yIGFkanVzdCB0aGUgdGltZSBsaW1pdFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcIkNoZWNrIHBhZ2UgZG9lcyBub3QgYXV0b21hdGljYWxseSByZWZyZXNoIHdpdGhvdXQgd2FybmluZyBvciBvcHRpb25zXCIsXG4gICAgICAgICAgICBcImZhaWxfbG9uZ3JlZnJlc2hcIjogXCJDaGVjayBwYWdlIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aXRob3V0IHdhcm5pbmcgb3Igb3B0aW9uc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGRlcHJlY2F0ZSBXQ0FHIEFBQVxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4yLjRcIiwgXCIzLjIuNVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjIuNFwiLCBcIjMuMi41XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIC8vIFJlbW92ZWQgQUNUIGJpc3o1OCBBQUFcbiAgICAvKiphY3Q6IFt7IFxuICAgICAgICBcImJjNjU5YVwiIDoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwicGFzc1wiXG4gICAgICAgIH1cbiAgICB9XSwqL1xuICAgIGFjdDogWyBcImJpc3o1OFwiXSwgIC8vIGZhaWwgZXZlbiBpZiBhIHBhZ2UgaXMgcmVkaXJlY3RlZCBhZnRlciBtb3JlIHRoYW4gMjAgaG91cnMgKDcyMDApXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJodHRwLWVxdWl2XCIpLnRvTG93ZXJDYXNlKCkgIT09ICdyZWZyZXNoJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2MpIHJldHVybjtcblxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgcnVsZSBhbHJlYWR5IHBhc3NlZCBvciBmYWlsZWQ6IG9ubHkgdGhlIGZpcnN0IG9uZSB0cmlkZGVycyBpZiBtdWx0aXBsZVxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsX2RvbmVcIiwgZmFsc2UpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuXG4gICAgICAgIGxldCBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIWNvbnRlbnQgfHwgY29udGVudC50cmltKCkubGVuZ3RoID09PTApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgdGltZTpudW1iZXIgPSAtMTtcbiAgICAgICAgaWYgKGNvbnRlbnQubWF0Y2goL15cXGQrJC8pKSBcbiAgICAgICAgICAgIHRpbWUgPSBwYXJzZUludChjb250ZW50KTtcbiAgICAgICAgZWxzZSBpZiAoY29udGVudC5tYXRjaCgvXlxcZCs7LykpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBjb250ZW50LmluZGV4T2YoXCI7XCIpO1xuICAgICAgICAgICAgdGltZSA9IHBhcnNlSW50KGNvbnRlbnQuc3Vic3RyaW5nKDAsIHBvcykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEludmFsaWQgY29udGVudCBmaWVsZFxuICAgICAgICBpZiAodGltZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsX2RvbmVcIiwgdHJ1ZSk7XG4gICAgICAgIGlmICh0aW1lID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgZWxzZSBpZiAodGltZSA8IDcyMDAxKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbFwiKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbG9uZ3JlZnJlc2hcIik7ICAgIFxuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1ldGFfcmVmcmVzaF9kZWxheTogUnVsZSA9IHtcbiAgICBpZDogXCJtZXRhX3JlZnJlc2hfZGVsYXlcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW2h0dHAtZXF1aXZdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWV0YV9SZWZyZXNoXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9yZWZyZXNoXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZXRhX3JlZnJlc2hfZGVsYXkuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwibWV0YV9yZWZyZXNoX2RlbGF5Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3JlZnJlc2hcIjogXCJtZXRhX3JlZnJlc2hfZGVsYXkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2VzIHNob3VsZCBub3QgcmVmcmVzaCBhdXRvbWF0aWNhbGx5XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJQYWdlcyBkbyBub3QgcmVmcmVzaCBhdXRvbWF0aWNhbGx5XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9yZWZyZXNoXCI6IFwiVmVyaWZ5IHBhZ2UgaXMgbm90IGJlaW5nIGNhdXNlZCB0byByZWZyZXNoIGF1dG9tYXRpY2FsbHlcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICAvL2FjdDogWyBcImJpc3o1OFwiLCBcImJjNjU5YVwiIF0sXG4gICAgYWN0OiBbIFwiYmM2NTlhXCIgXSwgIC8vIHBhc3MgaWYgYSBwYWdlIGlzIHJlZGlyZWN0ZWQgYWZ0ZXIgbW9yZSB0aGFuIDIwIGhvdXJzICg3MjAwKVxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJodHRwLWVxdWl2XCIpLnRvTG93ZXJDYXNlKCkgIT09ICdyZWZyZXNoJylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykgcmV0dXJuO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBydWxlIGFscmVhZHkgcGFzc2VkOiB0aGUgZmlyc3Qgb25lIHRha2VzIHByaW9yaXR5XG4gICAgICAgIGlmIChDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIm1ldGFfcmVmcmVzaF9kZWxheV9kb25lXCIsIGZhbHNlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIWNvbnRlbnQgfHwgY29udGVudC50cmltKCkubGVuZ3RoID09PTApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgdGltZTpudW1iZXIgPSAtMTtcbiAgICAgICAgaWYgKGNvbnRlbnQubWF0Y2goL15cXGQrJC8pKSBcbiAgICAgICAgICAgIHRpbWUgPSBwYXJzZUludChjb250ZW50KTtcbiAgICAgICAgZWxzZSBpZiAoY29udGVudC5tYXRjaCgvXlxcZCs7LykpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBjb250ZW50LmluZGV4T2YoXCI7XCIpO1xuICAgICAgICAgICAgdGltZSA9IHBhcnNlSW50KGNvbnRlbnQuc3Vic3RyaW5nKDAsIHBvcykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEludmFsaWQgY29udGVudCBmaWVsZFxuICAgICAgICBpZiAodGltZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJtZXRhX3JlZnJlc2hfZGVsYXlfZG9uZVwiLCB0cnVlKTtcbiAgICAgICAgaWYgKHRpbWUgPT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfcmVmcmVzaFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IG1ldGFfdmlld3BvcnRfem9vbWFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWV0YV92aWV3cG9ydF96b29tYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOm1ldGFbbmFtZV1bY29udGVudF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIm1ldGFfdmlld3BvcnRfem9vbVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfem9vbWFibGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwibWV0YV92aWV3cG9ydF96b29tYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF96b29tYWJsZVwiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgc2hvdWxkIG5vdCBwcmV2ZW50IHRoZSBicm93c2VyIHpvb21pbmcgdGhlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgZG9lcyBub3QgcHJldmVudCB0aGUgYnJvd3NlciB6b29taW5nIHRoZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF96b29tYWJsZVwiOiBcIkNvbmZpcm0gdGhlICdtZXRhW25hbWU9dmlld3BvcnRdJyB3aXRoIFxcXCJ7MH1cXFwiIGNhbiBiZSB6b29tZWQgYnkgdXNlclwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjRcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiYjRmMGMzXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3pvb21hYmxlXCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpLnRvTG93ZXJDYXNlKCkgIT09ICd2aWV3cG9ydCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gbmVpdGhlciBtYXhpbXVtLXNjYWxlIG5vciB1c2VyLXNjYWxhYmxlIChkZWZhdWx0IHllcylcbiAgICAgICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudHJpbSgpID09PSAnJyB8fCAoIWNvbnRlbnQuaW5jbHVkZXMoJ21heGltdW0tc2NhbGUnKSAmJiAhY29udGVudC5pbmNsdWRlcygndXNlci1zY2FsYWJsZScpKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCB1c2VyX21zZyA9IG51bGw7XG4gICAgICAgIGxldCBtYXhfbXNnID0gbnVsbDtcbiAgICAgICAgY29uc3QgcHJvcHMgPSBjb250ZW50LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgbGV0IHVzZXJfc2NhbGVfdmFsdWUgPSAneWVzJztcbiAgICAgICAgbGV0IG1heGltdW1fc2NhbGVfdmFsdWUgPSAnMi4wJztcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCBwaWVjZXMgPSBwcm9wLnRyaW0oKS5zcGxpdCgnPScpO1xuICAgICAgICAgICAgaWYgKHBpZWNlcy5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wLmluY2x1ZGVzKCd1c2VyLXNjYWxhYmxlJykpIHtcbiAgICAgICAgICAgICAgICB1c2VyX21zZyA9IHByb3A7XG4gICAgICAgICAgICAgICAgdXNlcl9zY2FsZV92YWx1ZSA9IHBpZWNlc1sxXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXJfc2NhbGVfdmFsdWUuc3RhcnRzV2l0aChcIidcIikgfHwgdXNlcl9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJfc2NhbGVfdmFsdWUgPSB1c2VyX3NjYWxlX3ZhbHVlLnN1YnN0cmluZygxLCB1c2VyX3NjYWxlX3ZhbHVlLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcC5pbmNsdWRlcygnbWF4aW11bS1zY2FsZScpKSB7XG4gICAgICAgICAgICAgICAgbWF4X21zZyA9IHByb3A7XG4gICAgICAgICAgICAgICAgbWF4aW11bV9zY2FsZV92YWx1ZSA9IHBpZWNlc1sxXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKG1heGltdW1fc2NhbGVfdmFsdWUuc3RhcnRzV2l0aChcIidcIikgfHwgbWF4aW11bV9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heGltdW1fc2NhbGVfdmFsdWUgPSBtYXhpbXVtX3NjYWxlX3ZhbHVlLnN1YnN0cmluZygxLCBtYXhpbXVtX3NjYWxlX3ZhbHVlLmxlbmd0aCAtIDEpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWUgPSBOdW1iZXIodXNlcl9zY2FsZV92YWx1ZSk7XG4gICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPj0gMSB8fCB2YWx1ZSA8PSAtMSkgdXNlcl9zY2FsZV92YWx1ZSA9ICd5ZXMnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1heGltdW1fc2NhbGUgPSAyLjA7XG4gICAgICAgIHZhbHVlID0gTnVtYmVyKG1heGltdW1fc2NhbGVfdmFsdWUpO1xuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkgbWF4aW11bV9zY2FsZSA9IDIuMDtcbiAgICAgICAgICAgIGVsc2UgbWF4aW11bV9zY2FsZSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG1heGltdW1fc2NhbGVfdmFsdWUgPT09ICd5ZXMnKSBtYXhpbXVtX3NjYWxlID0gMS4wO1xuICAgICAgICAgICAgZWxzZSBtYXhpbXVtX3NjYWxlID0gMC4xO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXNlci1zY2FsYWJsZSBpcyBub3Qgc2V0IHRvICd5ZXMnLCBpZ25vcmUgbWF4aW11bV9zY2FsZVxuICAgICAgICBpZiAodXNlcl9zY2FsZV92YWx1ZSAhPT0gJ3llcycpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3pvb21hYmxlXCIsIFt1c2VyX21zZ10pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVzZXItc2NhbGFibGUgaXMgJ3llcycsIGJ1dCBtYXhpbXVtX3NjYWxlIGlzIHRvbyBzbWFsbFxuICAgICAgICBpZiAobWF4aW11bV9zY2FsZSA8IDIuMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfem9vbWFibGVcIiwgW21heF9tc2ddKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBub2VtYmVkX2NvbnRlbnRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpub2VtYmVkXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX05vZW1iZWRfSGFzQ29udGVudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQWRkIGRlc2NyaXB0aXZlIHRleHQgdG8gdGhlIDxub2VtYmVkPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPG5vZW1iZWQ+IGVsZW1lbnRzIHNob3VsZCBjb250YWluIGRlc2NyaXB0aXZlIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBvYmplY3RfdGV4dF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwib2JqZWN0X3RleHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206b2JqZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfT2JqZWN0X0hhc1RleHRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIjogXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm9iamVjdF90ZXh0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJvYmplY3RfdGV4dF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIjogXCJvYmplY3RfdGV4dF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxvYmplY3Q+IGVsZW1lbnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZSBmb3IgdGhlIGNvbnRlbnQgcmVuZGVyZWQgYnkgdGhlIG9iamVjdFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiPG9iamVjdD4gZWxlbWVudCBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiOiBcIkFuIDxvYmplY3Q+IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiOGZjM2I2XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gRGV0ZWN0IGlmIHRoaXMgb2JqZWN0IGlzIG9mIHR5cGUgdGV4dCwgYnkgY2hlY2tpbmcgdGhlIG9iamVjdCB0eXBlIGluIHRoZSBjYXNlIGl0IGlzIHRleHQgdGhlbiBkbyBub3QgdHJpZ2dlciB0aGlzIHJ1bGVcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgJiYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikpLmluZGV4T2YoXCJ0ZXh0XCIpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZDogaW5jbHVkaW5nICdwcmVzZW50YXRpb24nLCAnbm9uZScsICdhcHBsaWNhdGlvbicsICdkb2N1bWVudCcgb3IgJ2ltZydcbiAgICAgICAgLy8gdGhpcyBjYXNlIHdpbGwgYmUgY292ZXJlZCBpbiBvdGhlciBydWxlc1xuICAgICAgICBsZXQgcm9sZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIik7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBlciBBQ1QsIGlnbm9yZSBlbWJlZGRlZCBIVE1MIGZpbGVzXG4gICAgICAgIGxldCBkYXRhID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZGF0YVwiKTtcbiAgICAgICAgbGV0IGV4dCA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09IHR5cGVvZiBcIlwiID8gZGF0YS5zdWJzdHJpbmcoZGF0YS5sYXN0SW5kZXhPZihcIi5cIikpIDogXCJcIjtcbiAgICAgICAgaWYgKGV4dCA9PT0gXCIuaHRtbFwiIHx8IGV4dCA9PT0gXCIuaHRtXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcGFzc2VkID0gcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAvL2xldCBwYXNzZWQgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBbmNlc3RvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3JcIjtcblxuZXhwb3J0IGNvbnN0IHBhZ2VfdGl0bGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcInBhZ2VfdGl0bGVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0RvY19IYXNUaXRsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHBhZ2Ugc2hvdWxkIGhhdmUgYSB0aXRsZSB0aGF0IGNvcnJlY3RseSBpZGVudGlmaWVzIHRoZSBzdWJqZWN0IG9mIHRoZSBwYWdlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk1pc3NpbmcgPGhlYWQ+IGVsZW1lbnQgc28gdGhlcmUgY2FuIGJlIG5vIDx0aXRsZT4gZWxlbWVudCBwcmVzZW50XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIk1pc3NpbmcgPHRpdGxlPiBlbGVtZW50IGluIDxoZWFkPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlRoZSA8dGl0bGU+IGVsZW1lbnQgaXMgZW1wdHkgKG5vIGlubmVySFRNTClcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiMjc3OWE1XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUaGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgaW5zaWRlIGEgcHJlc2VudGF0aW9uYWwgZnJhbWVcbiAgICAgICAgaWYgKEFuY2VzdG9yVXRpbC5pc0ZyYW1lKGNvbnRleHRIaWVyYXJjaGllcykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIE5vZGU7XG4gICAgICAgIC8vIEZpcnN0LCBmaW5kIHRoZSBoZWFkIGVsZW1lbnRcbiAgICAgICAgbGV0IGZpbmRIZWFkID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgZmluZFRpdGxlID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKGZpbmRIZWFkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChmaW5kSGVhZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaGVhZFwiKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZmluZEhlYWQgPSBmaW5kSGVhZC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICBsZXQgcG9zc2libGVUaXRsZXMgPSAocnVsZUNvbnRleHQgYXMgRWxlbWVudCkucXVlcnlTZWxlY3RvckFsbChcInRpdGxlXCIpO1xuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBwb3NzaWJsZVRpdGxlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuZ2V0QW5jZXN0b3IocG9zc2libGVUaXRsZXNbaWR4XSwgW1wic3ZnXCJdKSkge1xuICAgICAgICAgICAgICAgIGZpbmRUaXRsZSA9IHBvc3NpYmxlVGl0bGVzW2lkeF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbmRIZWFkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIWZpbmRUaXRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaW5kVGl0bGUgPT09IG51bGwpIHsgLy8gZG9uJ3QgaGF2ZSB0aXRsZSBzZWNvbmQgUG9GXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB3ZSBnZXQgaGVyZSB3ZSBoYXZlIDxoZWFkPiBhbmQgPHRpdGxlPlxuXG4gICAgICAgIGlmIChmaW5kVGl0bGUgIT0gbnVsbCAmJiBDb21tb25VdGlsLmdldElubmVyVGV4dChmaW5kVGl0bGUpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7IC8vIDx0aXRsZT4gaGFzIG5vIGlubmVySFRNTCB0aGlyZCBQb0ZcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHBhZ2VfdGl0bGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwicGFnZV90aXRsZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmhlYWQgZG9tOnRpdGxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGl0bGVfVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiUG90ZW50aWFsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhZ2VfdGl0bGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzFcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF8xXCI6IFwiUGFnZSA8dGl0bGU+IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiVmVyaWZ5IHRoYXQgdXNpbmcgdGhlIGZpbGVuYW1lIGFzIHRoZSBwYWdlIDx0aXRsZT4gdmFsdWUgaXMgZGVzY3JpcHRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlIDx0aXRsZT4gc2hvdWxkIGJlIGEgZGVzY3JpcHRpdmUgdGl0bGUsIHJhdGhlciB0aGFuIGEgZmlsZW5hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgbGV0IHRpdGxlU3RyID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpLnRyaW0oKTtcblxuICAgICAgICAvLyBhbGxvdyAuY29tLCAubmV0IGFuZCAub3JnXG4gICAgICAgIGxldCB0aXRsZVN0ckxvd2VyY2FzZSA9IHRpdGxlU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aXRsZVN0ckxvd2VyY2FzZS5pbmNsdWRlcyhcIi5jb21cIikgfHwgdGl0bGVTdHJMb3dlcmNhc2UuaW5jbHVkZXMoXCIubmV0XCIpIHx8IHRpdGxlU3RyTG93ZXJjYXNlLmluY2x1ZGVzKFwiLm9yZ1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFt0aXRsZVN0cl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpdGxlU3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBjb3ZlcmVkIGJ5IHBhZ2VfdGl0bGVfZXhpc3RzXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsvL1J1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBhc3NlZCA9ICEvXlxcUypcXC5bYS16QS1aXXsxLDR9KD8hLil8Xmh0dHBzPzpcXC9cXC9cXFMqL2kudGVzdCh0aXRsZVN0cik7XG5cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFt0aXRsZVN0cl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206KltvbmZvY3VzXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1NjcmlwdF9Gb2N1c0JsdXJzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSBzY3JpcHQgZG9lcyBub3QgcmVtb3ZlIGZvY3VzIGZyb20gY29udGVudCB0aGF0IG5vcm1hbGx5IHJlY2VpdmVzIGZvY3VzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2NyaXB0aW5nIG11c3Qgbm90IHJlbW92ZSBmb2N1cyBmcm9tIGNvbnRlbnQgdGhhdCBub3JtYWxseSByZWNlaXZlcyBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIiwgXCIyLjQuN1wiLCBcIjMuMi4xXCJdLCAvL21hdGNoIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gaGVscFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmZvY3VzXCIpLmluZGV4T2YoXCIuYmx1cihcIikgPT0gLTE7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRfb25jbGlja19hdm9pZDogUnVsZSA9IHtcbiAgICBpZDogXCJzY3JpcHRfb25jbGlja19hdm9pZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25jbGlja11cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcInNjcmlwdF9vbmNsaWNrX21pc3VzZVwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TY3JpcHRfT25jbGlja0hUTUwyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9vbmNsaWNrX2F2b2lkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfb25jbGlja19hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X29uY2xpY2tfYXZvaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0ICdvbmNsaWNrJyBldmVudHMgYXJlIG5vdCB1c2VkIGluIHNjcmlwdCB0byBlbXVsYXRlIGEgbGlua1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcmlwdHMgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGVtdWxhdGUgbGlua3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLCAvL2hlbHAgYW5kIG1hdGNoIG1hcHBpbmcgdG8gMi4xLjEgb25seSBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIHRoaXMgZm9yIFNWRyBlbGVtZW50IGZvciBub3cgdW50aWwgYSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUgKGJ5IFJpY2gpXG4gICAgICAgIC8vIHRvIHN1cHBvcnQgU1ZHIGF0IGEgcG9pbnQgd2hlbiB0aGUgU1ZHIGExMXkgc3BlYyBpcyByZWFkeS5cbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwic3ZnXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBhcmlhLXJvbGUgc3BlY2lmaWVkLCBkb24ndCB0cmlnZ2VyIHRoaXMuXG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInJvbGVcIikpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IG5vZGVOYW1lID09IFwiYVwiIHx8IG5vZGVOYW1lID09IFwiYXJlYVwiIHx8IG5vZGVOYW1lID09IFwiaW5wdXRcIjtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHNjcmlwdF9vbmNsaWNrX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJzY3JpcHRfb25jbGlja19taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU2NyaXB0X09uY2xpY2tIVE1MMVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfb25jbGlja19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNjcmlwdF9vbmNsaWNrX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3NzaWJsZSB1c2Ugb2YgYSBzY3JpcHQgdG8gZW11bGF0ZSBhIGxpbmtcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTY3JpcHRzIHNob3VsZCBub3QgYmUgdXNlZCB0byBlbXVsYXRlIGxpbmtzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSwgLy9oZWxwIGFuZCBtYXRjaCBtYXBwaW5nIHRvIDIuMS4xIG9ubHkgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBmYWlsU3Vic3RyaW5nOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIi5hc3BcIiwgXCIuYXNweFwiLCBcIi5jZm1cIiwgXCIuY2ZtbFwiLCBcIi5jZ2lcIiwgXCIuaHRtXCIsIFwiLmh0bWxcIiwgXCIuc2h0bVwiLFxuICAgICAgICAgICAgICAgICAgICBcIi5zaHRtbFwiLCBcIi5waHBcIiwgXCIucGxcIiwgXCIucHlcIiwgXCIuc2h0bVwiLCBcIi5zaHRtbFwiLCBcIi54aHRtbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImxvY2F0aW9uLmhyZWZcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXJpYS1yb2xlIHNwZWNpZmllZCwgZG9uJ3QgdHJpZ2dlciB0aGlzLlxuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJyb2xlXCIpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGEgb3IgYXJlYSwgZG9uJ3QgdHJpZ2dlciBpZiB0aGVyZSdzIGFuIGhyZWYuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKG5vZGVOYW1lID09IFwiYVwiIHx8IG5vZGVOYW1lID09IFwiYXJlYVwiKSAmJiBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImhyZWZcIikpO1xuXG4gICAgICAgIC8vIElmIHRoZSBndWFyZHMgZmFpbGVkLCBjaGVjayB0byBzZWUgaWYgdGhleSdyZSBsb29raW5nIGF0IGxpbmtzXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBsZXQgZmFpbFN1YnN0cmluZyA9IHZhbGlkYXRlUGFyYW1zLmZhaWxTdWJzdHJpbmcudmFsdWU7O1xuICAgICAgICAgICAgbGV0IG9uY2xpY2sgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgZmFpbFN1YnN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IG9uY2xpY2suaW5kZXhPZihmYWlsU3Vic3RyaW5nW2ldKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IHNjcmlwdF9zZWxlY3RfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU2VsZWN0X05vQ2hhbmdlQWN0aW9uXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfc2VsZWN0X3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X3NlbGVjdF9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IG5vIGNoYW5nZSBvZiBjb250ZXh0IG9yIGFjdGlvbiBvY2N1cnMgd2hlbiBzZWxlY3Rpb24gb3B0aW9ucyBpbiB0aGlzIGNvbXBvbmVudCByZWNlaXZlIGZvY3VzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTm8gY2hhbmdlcyBvZiBjb250ZXh0IHNob3VsZCBvY2N1ciB3aGVuIGEgc2VsZWN0aW9uIHZhbHVlIHJlY2VpdmVzIGZvY3VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25jaGFuZ2VcIikgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIik7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzZWxlY3Rfb3B0aW9uc19ncm91cGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInNlbGVjdF9vcHRpb25zX2dyb3VwZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpzZWxlY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9TZWxlY3RfSGFzT3B0R3JvdXBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiR3JvdXAgb2YgcmVsYXRlZCBvcHRpb25zIG1heSBuZWVkIDxvcHRncm91cD5cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJHcm91cHMgb2YgcmVsYXRlZCBvcHRpb25zIHdpdGhpbiBhIHNlbGVjdGlvbiBsaXN0IHNob3VsZCBiZSBncm91cGVkIHdpdGggPG9wdGdyb3VwPlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgcGFyYW1OdW1PcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDEwLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlcyB3aGVyZSBvcHRncm91cCBpcyBoaWRkZW4sIHdoaWNoIHNob3VsZCB0cmlnZ2VyIGEgdmlvbGF0aW9uc1xuICAgICAgICAvLyBidXQgaW4gdGhlIGNhc2UgdGhhdCBDaGVjayBoaWRkZW4gb3B0aW9uIGlzIHNldCB0aGVuIHNob3VsZCBub3QgdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0Q2hpbGRCeVRhZ0hpZGRlbihydWxlQ29udGV4dCwgXCJvcHRncm91cFwiLCBmYWxzZSwgdHJ1ZSkubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHJ1bGVDb250ZXh0LCBcIm9wdGlvblwiLCBmYWxzZSwgdHJ1ZSkubGVuZ3RoIDw9XG4gICAgICAgICAgICB2YWxpZGF0ZVBhcmFtcy5wYXJhbU51bU9wdGlvbnMudmFsdWU7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBza2lwX21haW5fZGVzY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcInNraXBfbWFpbl9kZXNjcmliZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJza2lwX21haW5fZXhpc3RzXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0JvZHlfRmlyc3RBQ29udGFpbnNTa2lwVGV4dF9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgaWYgdGhpcyBoeXBlcmxpbmsgc2tpcHMgY29udGVudCwgdGhlIGRlc2NyaXB0aW9uIGNvbW11bmljYXRlcyB3aGVyZSBpdCBsaW5rcyB0b1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBkZXNjcmlwdGlvbiBvZiBhIGh5cGVybGluayB1c2VkIHRvIHNraXAgY29udGVudCBtdXN0IGNvbW11bmljYXRlIHdoZXJlIGl0IGxpbmtzIHRvXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgcGFyYW1Ta2lwVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJza2lwXCIsIFwianVtcFwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBHZXQgdGhlIGFuY2hvcnMgb24gdGhlIHBhZ2VcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGxhbmRtYXJrcyBmaXJzdFxuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4ocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgW1wiYXBwbGljYXRpb25cIiwgXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIixcbiAgICAgICAgICAgICAgICBcImZvcm1cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcInNlYXJjaFwiXG4gICAgICAgICAgICBdLCB0cnVlLCB0cnVlKS5sZW5ndGggPiAwKTtcbiAgICAgICAgfVxuICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHsgLy8gTm8gbGFuZG1hcmtzLCBjaGVjayBmb3Igc2tpcCBsaW5rc1xuICAgICAgICAgICAgbGV0IGxpbmtzID0gZG9jLmxpbmtzO1xuICAgICAgICAgICAgLy8gU2tpcCBsaW5rIHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lIG9uIHRoZSBwYWdlIHdpdGggYW4gaHJlZiBhdHRyaWJ1dGUgKGkuZS4sIGxpbmtzWzBdKVxuICAgICAgICAgICAgLy8gYWxzbyBpZiB0aGUgZmlyc3QgbGluayBpcyBoaWRkZW4gdGhlbiB3ZSBzaG91bGQgYWxzbyB0cmlnZ2VyIGEgdmlvbGF0aW9uLlxuICAgICAgICAgICAgaWYgKGxpbmtzICYmIGxpbmtzLmxlbmd0aCA+IDAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGxpbmtzWzBdKSkge1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0VGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGRvYy5saW5rc1swXSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgdmFsaWRhdGVQYXJhbXMucGFyYW1Ta2lwVGV4dC52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0ZXN0VGV4dC5pbmRleE9mKHZhbGlkYXRlUGFyYW1zLnBhcmFtU2tpcFRleHQudmFsdWVbaV0pICE9IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQW5jZXN0b3JVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBza2lwX21haW5fZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcInNraXBfbWFpbl9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQm9keV9GaXJzdEFTa2lwc19OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNraXBfbWFpbl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIHBhZ2UgZG9lcyBub3QgcHJvdmlkZSBhIHdheSB0byBxdWlja2x5IG5hdmlnYXRlIHRvIHRoZSBtYWluIGNvbnRlbnQgKEFSSUEgXFxcIm1haW5cXFwiIGxhbmRtYXJrIG9yIGEgc2tpcCBsaW5rKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2VzIG11c3QgcHJvdmlkZSBhIHdheSB0byBza2lwIGRpcmVjdGx5IHRvIHRoZSBtYWluIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGluc2lkZSBhIHByZXNlbnRhdGlvbmFsIGZyYW1lXG4gICAgICAgIGlmIChBbmNlc3RvclV0aWwuaXNQcmVzZW50YXRpb25GcmFtZShjb250ZXh0SGllcmFyY2hpZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBHZXQgdGhlIGFuY2hvcnMgb24gdGhlIHBhZ2VcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGxhbmRtYXJrcyBmaXJzdFxuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4ocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgW1wiYXBwbGljYXRpb25cIiwgXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIixcbiAgICAgICAgICAgICAgICBcImZvcm1cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcInNlYXJjaFwiXG4gICAgICAgICAgICBdLCB0cnVlLCB0cnVlKS5sZW5ndGggPiAwKTtcbiAgICAgICAgfVxuICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHsgLy8gTm8gbGFuZG1hcmtzLCBjaGVjayBmb3Igc2tpcCBsaW5rc1xuICAgICAgICAgICAgbGV0IGFuY2hvcnMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiYVwiKTtcblxuICAgICAgICAgICAgLy8gU2tpcCBhbmNob3Igc2hvdWxkIGJlIHRoZSBmaXJzdCBvbmUgb24gdGhlIHBhZ2Ugd2l0aCBhbiBocmVmIGF0dHJpYnV0ZVxuICAgICAgICAgICAgbGV0IHRlc3RBbmNob3IgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbmNob3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoYW5jaG9yc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdEFuY2hvciA9IGFuY2hvcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHVsbCBvdXQgdGhlIHRhcmdldCBpZFxuICAgICAgICAgICAgbGV0IHRhcmdldElkID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0ZXN0QW5jaG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgaHJlZlN0ciA9IHRlc3RBbmNob3IuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgaWR4ID0gaHJlZlN0ci5pbmRleE9mKFwiI1wiKTtcbiAgICAgICAgICAgICAgICBpZiAoaWR4ICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldElkID0gaHJlZlN0ci5zdWJzdHJpbmcoaWR4ICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGFuIGVsZW1lbnQgaWQgb3IgbmFtZWQgYW5jaG9yIG9uIHRoZSBwYWdlIHdpdGggdGhpc1xuICAgICAgICAgICAgLy8gdGFyZ2V0IGlkLlxuXG4gICAgICAgICAgICBpZiAodGFyZ2V0SWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGRvYy5nZXRFbGVtZW50QnlJZCh0YXJnZXRJZCkgIT0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yc1tpXS5oYXNBdHRyaWJ1dGUoXCJuYW1lXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzW2ldLmdldEF0dHJpYnV0ZShcIm5hbWVcIikgPT0gdGFyZ2V0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmVcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOipbc3R5bGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU3R5bGVfQmFja2dyb3VuZEltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGUgQ1NTIGJhY2tncm91bmQgaW1hZ2UgZG9lcyBub3QgY29udmV5IGltcG9ydGFudCBpbmZvcm1hdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkltYWdlcyBpbmNsdWRlZCBieSB1c2luZyBDU1MgYWxvbmUgbXVzdCBub3QgY29udmV5IGltcG9ydGFudCBpbmZvcm1hdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicmVsXCIpICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZXNoZWV0XCIpIHtcbiAgICAgICAgICAgIC8vIEV4dGVybmFsIHN0eWxlc2hlZXQgLSB0cmlnZ2VyXG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLnRyaWdnZXJPbmNlKHJ1bGVDb250ZXh0LCBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZVwiLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCAmJiBub2RlTmFtZSA9PT0gXCJzdHlsZVwiIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBsZXQgc3R5bGVUZXh0O1xuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpXG4gICAgICAgICAgICAgICAgc3R5bGVUZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHN0eWxlVGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgICAgICAgbGV0IGJnTWF0Y2hlcyA9IHN0eWxlVGV4dC5tYXRjaCgvYmFja2dyb3VuZDpbXjtdKi9nKTtcbiAgICAgICAgICAgIGlmIChiZ01hdGNoZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBiZ01hdGNoZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGJnTWF0Y2hlc1tpXS5pbmRleE9mKFwidXJsKFwiKSA9PT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG4vKipcbiAqIERlc2NyaXB0aW9uOiBUcmlnZ2VyIGlmIDpiZWZvcmUgYW5kIDphZnRlciBhcmUgdXNlZCBpbiBDU1MgKEludGVybmFsIGFuZCBFeHRlcm5hbCkgd2l0aCBjb250ZW50XG4gKiBPcmlnaW46IFdDQUcgMi4wIEY4N1xuICovXG5leHBvcnQgY29uc3Qgc3R5bGVfYmVmb3JlX2FmdGVyX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbTpsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU3R5bGVfQmVmb3JlQWZ0ZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXcuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkRvIG5vdCB1c2UgQ1NTICc6OmJlZm9yZScgYW5kICc6OmFmdGVyJyBwc2V1ZG8tZWxlbWVudHMgdG8gaW5zZXJ0IG5vbi1kZWNvcmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlICc6OmJlZm9yZScgYW5kICc6OmFmdGVyJyBwc2V1ZG8tZWxlbWVudHMgZG8gbm90IGluc2VydCBub24tZGVjb3JhdGl2ZSBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIC8vIFR1cm4gb2ZmIHRoZSBydWxlIGR1ZSB0byB0aGUgb2Jzb2xldGUgcmVxdWlyZW1lbnRcbiAgICAgICAgLy9pZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBpZDogW10sXG4gICAgICAgIG51bTogXCIxLjMuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgLy9jaGVjayBJbnRlcm5hbCBzdHlsZXMgICAgICAgIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICBsZXQgY3NzID0gQ1NTVXRpbC5nZXRDU1NTdHlsZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjc3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGJhZCBDU1NcbiAgICAgICAgICAgICAgICBpZiAoY3NzW2ldLnNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChjc3NbaV0uc2VsZWN0b3IuaW5kZXhPZihcIjpiZWZvcmVcIikgPT09IC0xICYmIGNzc1tpXS5zZWxlY3Rvci5pbmRleE9mKFwiOmFmdGVyXCIpID09PSAtMSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICEoXCJjb250ZW50XCIgaW4gY3NzW2ldLnZhbHVlcykgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpLmxlbmd0aCA9PT0gMCB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwiXFxcIlxcXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcIlxcJ1xcJ1wiIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJub25lXCIgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcImF0dHIoeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcImF0dHIoeSlcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIHNwZWNpYWwgcnVsZXMgaW4gdGhlIHN0eWxlc2hlZXRzXG4gICAgICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHBhc3NlZCAmJiBzdHlsZVJ1bGVJbmRleCA8IHN0eWxlUnVsZXMubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIEBtZWRpYSBydWxlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2hlY2sgJ2lmIChzdHlsZVJ1bGUgaW5zdGFuY2VvZiBDU1NNZWRpYVJ1bGUpJyBkb2Vzbid0IHdvcmsgd2hlbiBydW4gaW4gS2FybWEoYnV0IHdvcmtzIGluIERBUCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBsZXQncyBhY2Nlc3MgdGhlIHR5cGUgZGlyZWN0bHkgYXMgYSB3b3JrYXJvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVJbXBvcnRSdWxlOiBDU1NJbXBvcnRSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZS50eXBlICYmIHN0eWxlUnVsZS50eXBlID09PSA0IC8qIENTU1J1bGUuTUVESUFfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZU1lZGlhUnVsZSA9IHN0eWxlUnVsZSBhcyBDU1NNZWRpYVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhUnVsZXMgPSBzdHlsZU1lZGlhUnVsZS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbVJ1bGUgPSBtZWRpYVJ1bGVzW3JJbmRleF0gYXMgYW55OyAvLyBzZWxlY3RvclRleHQgbm90IHJlY29nbml6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IG1SdWxlLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydCBydWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVSdWxlLnR5cGUgJiYgc3R5bGVSdWxlLnR5cGUgPT09IDMgLyogQ1NTUnVsZS5JTVBPUlRfUlVMRSAqLyAmJiAoc3R5bGVJbXBvcnRSdWxlID0gc3R5bGVSdWxlIGFzIENTU0ltcG9ydFJ1bGUpLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHBhc3NlZCAmJiBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0ZWRSdWxlID0gcnVsZXNbckluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIEBtZWRpYSBydWxlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUudHlwZSAmJiBpbXBvcnRlZFJ1bGUudHlwZSA9PT0gNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVkaWFSdWxlcyA9IChpbXBvcnRlZFJ1bGUgYXMgQ1NTTWVkaWFSdWxlKS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBtSW5kZXggPSAwOyBtSW5kZXggPCBtZWRpYVJ1bGVzLmxlbmd0aDsgbUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtUnVsZSA9IG1lZGlhUnVsZXNbbUluZGV4XSBhcyBhbnk7IC8vIHNlbGVjdG9yVGV4dCBub3QgcmVjb2duaXplZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiBtUnVsZS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gbVJ1bGUuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuaW5kZXhPZihcIjpiZWZvcmVcIikgIT09IC0xIHx8IHJ1bGUuaW5kZXhPZihcIjphZnRlclwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBtUnVsZS5zdHlsZVsnY29udGVudCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKSAhPT0gXCJcXFwiXFxcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiXFwnXFwnXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHgpXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHkpXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChpbXBvcnRlZFJ1bGUgYXMgYW55KS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgKGltcG9ydGVkUnVsZSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSAoaW1wb3J0ZWRSdWxlIGFzIGFueSkuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdXBwb3J0IGJvdGggc2luZ2xlIGNvbG9uICg6KSBhbmQgZG91YmxlIGNvbG9uICg6OikgcHNldWRvICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuaW5kZXhPZihcIjpiZWZvcmVcIikgIT09IC0xIHx8IHJ1bGUuaW5kZXhPZihcIjphZnRlclwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAoaW1wb3J0ZWRSdWxlIGFzIGFueSkuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGV4dGVybmFsIHN0eWxlcyBcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibGlua1wiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicmVsXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVzaGVldFwiICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIikudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xuXG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVGcm9tTGluayA9IHJ1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIEBtZWRpYSBydWxlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVGcm9tTGluay50eXBlICYmIHJ1bGVGcm9tTGluay50eXBlID09PSA0IC8qIENTU1J1bGUuTUVESUFfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhUnVsZXMgPSAocnVsZUZyb21MaW5rIGFzIENTU01lZGlhUnVsZSkuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG1JbmRleCA9IDA7IHBhc3NlZCAmJiBtSW5kZXggPCBtZWRpYVJ1bGVzLmxlbmd0aDsgbUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1SdWxlID0gbWVkaWFSdWxlc1ttSW5kZXhdIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiBtUnVsZS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVTZWxUeHQgPSBtUnVsZS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlU2VsVHh0LmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlU2VsVHh0LmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBtUnVsZS5zdHlsZVsnY29udGVudCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiXFwnXFwnXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHkpXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChydWxlc1tySW5kZXhdIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIChydWxlc1tySW5kZXhdIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gKHJ1bGVzW3JJbmRleF0gYXMgYW55KS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBib3RoIHNpbmdsZSBjb2xvbiAoOikgYW5kIGRvdWJsZSBjb2xvbiAoOjopIHBzZXVkbyAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuaW5kZXhPZihcIjpiZWZvcmVcIikgIT09IC0xIHx8IHJ1bGUuaW5kZXhPZihcIjphZnRlclwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IChydWxlc1tySW5kZXhdIGFzIGFueSkuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2NvbG9yX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9jb2xvcl9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOipbc3R5bGVdLCBkb206Zm9udFtjb2xvcl0sIGRvbTpsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU3R5bGVfQ29sb3JTZW1hbnRpY3MxXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfY29sb3JfbWlzdXNlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX2NvbG9yX21pc3VzZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX2NvbG9yX21pc3VzZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJDb21iaW5lIGNvbG9yIGFuZCBkZXNjcmlwdGl2ZSBtYXJrdXAgdG8gY29udmV5IGluZm9ybWF0aW9uXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IGNvbG9yIGlzIG5vdCB1c2VkIGFzIHRoZSBvbmx5IHZpc3VhbCBtZWFucyBvZiBjb252ZXlpbmcgaW5mb3JtYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjEuNC4xXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgc3R5bGVUZXh0ID0gXCJcIjtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgLy8gY2hlY2sgaW1wb3J0XG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlSW1wb3J0UnVsZTogQ1NTSW1wb3J0UnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlLnR5cGUgJiYgc3R5bGVSdWxlLnR5cGUgPT09IDMgLyogQ1NTUnVsZS5JTVBPUlRfUlVMRSAqLyAmJiAoc3R5bGVJbXBvcnRSdWxlID0gc3R5bGVSdWxlIGFzIENTU0ltcG9ydFJ1bGUpLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydFJ1bGVzID0gc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgPyBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA6IHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBySW5kZXggPCBpbXBvcnRSdWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaVJ1bGUgPSBpbXBvcnRSdWxlc1tySW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVUZXh0ICs9IGlSdWxlLmNzc1RleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJzdHlsZVwiKSkge1xuICAgICAgICAgICAgc3R5bGVUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIgJiYgLy9jaGVjayBleHRlcm5hbCBzdHlsZXNcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicmVsXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVzaGVldFwiICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpLnRyaW0oKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVUZXh0ICs9IHJ1bGVzW3JJbmRleF0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIERlZmVjdCAxMDIyOiBGaW5kIHVzZXMgb2YgJ2NvbG9yJyBhbmQgJypiYWNrZ3JvdW5kKicgb25seVxuICAgICAgICBsZXQgaXNCZ1VzZWQgPSBzdHlsZVRleHQubWF0Y2goL1xcYmJhY2tncm91bmRcXGIvaSk7XG5cbiAgICAgICAgbGV0IHRoZUNvbG9yU3R5bGVUb0NoZWNrID0gc3R5bGVUZXh0LnJlcGxhY2UoLy1jb2xvci9nLCBcIlwiKTtcbiAgICAgICAgbGV0IGlzQ29sb3JVc2VkID0gdGhlQ29sb3JTdHlsZVRvQ2hlY2subWF0Y2goL1xcYmNvbG9yXFxiL2kpO1xuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjb2xvclwiKSB8fCBpc0NvbG9yVXNlZCB8fCBpc0JnVXNlZCkge1xuICAgICAgICAgICAgbGV0IGdvb2RUYWdOYW1lcyA9IHtcbiAgICAgICAgICAgICAgICBcImVtXCI6IFwiXCIsIFwic3Ryb25nXCI6IFwiXCIsIFwiY2l0ZVwiOiBcIlwiLCBcImRmblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwiY29kZVwiOiBcIlwiLCBcInNhbXBcIjogXCJcIiwgXCJrYmRcIjogXCJcIiwgXCJ2YXJcIjogXCJcIiwgXCJhYmJyXCI6IFwiXCIsIFwiYWNyb255bVwiOiBcIlwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb2xvciB1c2VkIO+/vSBhcmUgdGhlcmUgc2VtYW50aWNzIGludm9sdmVkP1xuICAgICAgICAgICAgcGFzc2VkID0gbm9kZU5hbWUgaW4gZ29vZFRhZ05hbWVzIHx8XG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgZ29vZFRhZ05hbWVzKSAhPT0gbnVsbDtcbiAgICAgICAgICAgIGlmICghcGFzc2VkICYmIHJ1bGVDb250ZXh0Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIGluIGdvb2RUYWdOYW1lcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJpZ2dlciBvbmx5IG9uY2VcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCB0cmlnZ2VyZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJzdHlsZV9jb2xvcl9taXN1c2VcIiwgZmFsc2UpO1xuICAgICAgICAgICAgcGFzc2VkID0gdHJpZ2dlcmVkO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwic3R5bGVfY29sb3JfbWlzdXNlXCIsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ29sb3JVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29sb3JVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzdHlsZV9mb2N1c192aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2ZvY3VzX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU3R5bGVfSGluZGVyRm9jdXMxXCI6IHtcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfZm9jdXNfdmlzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCI6IGBzdHlsZV9mb2N1c192aXNpYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJwYXNzX2ZvY3VzX3Zpc2libGVcIjogYHN0eWxlX2ZvY3VzX3Zpc2libGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBzaG91bGQgYmUgdmlzaWJsZSB3aGVuIGRlZmF1bHQgYm9yZGVyIG9yIG91dGxpbmUgaXMgbW9kaWZpZWQgYnkgQ1NTXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiOiBcIkNoZWNrIHRoZSBrZXlib2FyZCBmb2N1cyBpbmRpY2F0b3IgaXMgdmlzaWJsZSB3aGVuIHVzaW5nIENTUyBkZWNsYXJhdGlvbiBmb3IgJ2JvcmRlcicgb3IgJ291dGxpbmUnXCIsXG4gICAgICAgICAgICBcInBhc3NfZm9jdXNfdmlzaWJsZVwiOiBcIlRoZSBrZXlib2FyZCBmb2N1cyBpbmRpY2F0b3IgaXMgdmlzaWJsZSBvciBpcyBub3QgY2hhbmdlZCBmcm9tIHRoZSBicm93c2VyIGRlZmF1bHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjIuNC43XCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHNraXBOb2Rlczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJ0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGVja1BhcmFtczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJib3JkZXJcIiwgXCJib3JkZXItd2lkdGhcIiwgXCJib3JkZXItc3R5bGVcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci10b3Atd2lkdGhcIiwgXCJib3JkZXItcmlnaHQtd2lkdGhcIiwgXCJib3JkZXItYm90dG9tLXdpZHRoXCIsIFwiYm9yZGVyLWxlZnQtd2lkdGhcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci10b3AtY29sb3JcIiwgXCJib3JkZXItcmlnaHQtY29sb3JcIiwgXCJib3JkZXItYm90dG9tLWNvbG9yXCIsIFwiYm9yZGVyLWxlZnQtY29sb3JcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci10b3Atc3R5bGVcIiwgXCJib3JkZXItcmlnaHQtc3R5bGVcIiwgXCJib3JkZXItYm90dG9tLXN0eWxlXCIsIFwiYm9yZGVyLWxlZnQtc3R5bGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwib3V0bGluZVwiLCBcIm91dGxpbmUtd2lkdGhcIiwgXCJvdXRsaW5lLWNvbG9yXCIsIFwib3V0bGluZS1zdHlsZVwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpIHx8IHZhbGlkYXRlUGFyYW1zLnNraXBOb2Rlcy52YWx1ZS5pbmNsdWRlcyhydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2V0IGFsbCBzdHlsZXMgaW4gYSBzaW5nbGUgcGFzcyB0aHJvdWdoIHN0eWxlc2hlZXRzXG4gICAgICAgIGNvbnN0IGFsbFN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKHJ1bGVDb250ZXh0LCBudWxsLCBbXCJcIiwgXCI6Zm9jdXNcIiwgXCI6Zm9jdXMtdmlzaWJsZVwiLCBcIjpmb2N1cy13aXRoaW5cIl0pO1xuICAgICAgICBsZXQgbm9ybWFsU3R5bGVzID0gYWxsU3R5bGVzW1wiXCJdOyAvLyBjb25zaWRlciBib3RoIHVzZXItZGVmaW5lZCBhbmQgYnJvd3NlciBkZWZhdWx0XG4gICAgICAgIGxldCBmb2N1c1N0eWxlcyA9IFtdXG4gICAgICAgIGZvY3VzU3R5bGVzLnB1c2goYWxsU3R5bGVzW1wiOmZvY3VzXCJdKTtcbiAgICAgICAgZm9jdXNTdHlsZXMucHVzaChhbGxTdHlsZXNbXCI6Zm9jdXMtdmlzaWJsZVwiXSk7XG4gICAgICAgIGZvY3VzU3R5bGVzLnB1c2goYWxsU3R5bGVzW1wiOmZvY3VzLXdpdGhpblwiXSk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZiBmb2N1cyBzdHlsZSBpcyBkZWZpbmVkXG4gICAgICAgIGxldCBzdHlsZU9iaiA9IGZvY3VzU3R5bGVzWzBdO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc3R5bGVPYmopLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vcGFzcyBpZiBvdXRsaW5lIGlzIG5vdCBkZWZpbmVkIGF0IGFsbCwgYnJvd3NlciB3aWxsIG92ZXJyaWRlIFxuICAgICAgICAgICAgaWYgKCgoIW5vcm1hbFN0eWxlc1tcIm91dGxpbmUtd2lkdGhcIl0gJiYgIW5vcm1hbFN0eWxlc1tcIm91dGxpbmUtc3R5bGVcIl0pXG4gICAgICAgICAgICAgICAgfHwgKG5vcm1hbFN0eWxlc1tcIm91dGxpbmUtd2lkdGhcIl0gPT09ICcwcHgnIHx8IG5vcm1hbFN0eWxlc1tcIm91dGxpbmUtc3R5bGVcIl0gPT09ICdub25lJykpXG4gICAgICAgICAgICAgICAgJiYgKCFzdHlsZU9ialtcIm91dGxpbmUtc3R5bGVcIl0gfHwgc3R5bGVPYmpbXCJvdXRsaW5lLXN0eWxlXCJdICE9PSAnbm9uZScpKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZm9jdXNfdmlzaWJsZVwiKTsgICAgICAgXG5cbiAgICAgICAgICAgIGxldCBub25lU3R5bGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBudW1PdGhlclN0eWxlID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGZvY3VzU3R5bGUgaW4gc3R5bGVPYmopIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVQYXJhbXMuY2hlY2tQYXJhbXMudmFsdWUuaW5jbHVkZXMoZm9jdXNTdHlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIGZhaWx1cmUgY2FzZTogIFxuICAgICAgICAgICAgICAgICAgICAgKiAgMS4gZm9jdXMgb3V0bGluZSBvciBib3JkZXIgc3R5bGUgaXMgbm9uZSBhbmQgbm8gb3RoZXIgc3R5bGUgKGNvbG9yIG9yIHdpZHRoKSBkZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAqICAyLiBmb2N1cyBvdXRsaW5lIG9yIGJvcmRlciBzdHlsZSBpcyBzYW1lIHdpdGggdGhlIG5vcm1hbFxuICAgICAgICAgICAgICAgICAgICAgKiAgMy4gc2l6ZSBpbiBmb2N1cyBpcyBzYW1lIG9yIHNtYWxsZXIgdGhhbiBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAqICA0LiBjb2xvciBjb250cmFzdCBpbiBmb2N1cyBpcyBiZXR0ZXIgIFxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvY3VzU3R5bGVWYWx1ZSA9IHN0eWxlT2JqW2ZvY3VzU3R5bGVdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsU3R5bGVWYWx1ZSA9IG5vcm1hbFN0eWxlc1tmb2N1c1N0eWxlXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGUuaW5jbHVkZXMoXCJzdHlsZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gXCJub25lXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmVTdHlsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmVTdHlsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsU3R5bGVWYWx1ZSAmJiBmb2N1c1N0eWxlVmFsdWUgIT09IFwibm9uZVwiICYmIGZvY3VzU3R5bGVWYWx1ZSA9PT0gbm9ybWFsU3R5bGVWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9jdXNTdHlsZS5pbmNsdWRlcyhcIndpZHRoXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW1PdGhlclN0eWxlKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJveGltYXRpb24gb2YgdGhlIHdpZHRoIHN0eWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSAnaW5pdGlhbCcpIGZvY3VzU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSAndGhpbicpIGZvY3VzU3R5bGVWYWx1ZSA9ICcxcHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSAnbWVkaXVtJykgZm9jdXNTdHlsZVZhbHVlID0gJzJweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmb2N1c1N0eWxlVmFsdWUgPT09ICd0aGljaycpIGZvY3VzU3R5bGVWYWx1ZSA9ICczcHgnOyAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbFN0eWxlVmFsdWUgPT09ICdpbml0aWFsJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vcm1hbFN0eWxlVmFsdWUgPT09ICd0aGluJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICcxcHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vcm1hbFN0eWxlVmFsdWUgPT09ICdtZWRpdW0nKSBub3JtYWxTdHlsZVZhbHVlID0gJzJweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm9ybWFsU3R5bGVWYWx1ZSA9PT0gJ3RoaWNrJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICczcHgnOyAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c1N0eWxlVmFsdWUgPSBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShmb2N1c1N0eWxlVmFsdWUsIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbFN0eWxlVmFsdWUgPSBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShub3JtYWxTdHlsZVZhbHVlLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNTdHlsZVZhbHVlID09IDAgfHwgZm9jdXNTdHlsZVZhbHVlIDw9IG5vcm1hbFN0eWxlVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvY3VzU3R5bGUuaW5jbHVkZXMoXCJjb2xvclwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3RoZXJTdHlsZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGVsZW1lbnQgYmcgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2xvckNvbWJvID0gQ29sb3JVdGlsLkNvbG9yQ29tYm8ocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yQ29tYm8gPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJnID0gY29sb3JDb21iby5iZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmcpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3Byb3hpbWF0aW9uIG9mIHRoZSB3aWR0aCBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ2luaXRpYWwnKSBmb2N1c1N0eWxlVmFsdWUgPSAnYmxhY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbFN0eWxlVmFsdWUgJiYgbm9ybWFsU3R5bGVWYWx1ZSA9PT0gJ2luaXRpYWwnKSBub3JtYWxTdHlsZVZhbHVlID0gJ2JsYWNrJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYm9yZGVyL291dGxpbmUgY29sb3IgYXMgZmcgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c1N0eWxlVmFsdWUgPSBDb2xvclV0aWwuQ29sb3IoZm9jdXNTdHlsZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbFN0eWxlVmFsdWUgPSBDb2xvclV0aWwuQ29sb3Iobm9ybWFsU3R5bGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSBudWxsIHx8IG5vcm1hbFN0eWxlVmFsdWUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2dldCB0aGUgYm9yZGVyL291dGxpbmUgY29sb3IgY29udHJhc3QgcmF0aW9zXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9jdXNSYXRpbyA9IGZvY3VzU3R5bGVWYWx1ZS5jb250cmFzdFJhdGlvKGJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxSYXRpbyA9IG5vcm1hbFN0eWxlVmFsdWUuY29udHJhc3RSYXRpbyhiZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNSYXRpbyA8IDMuMCB8fCBmb2N1c1JhdGlvIDw9IG5vcm1hbFJhdGlvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9vdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3RoZXJTdHlsZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbFN0eWxlVmFsdWUgIT0gbnVsbCAmJiBmb2N1c1N0eWxlVmFsdWUgPT09IG5vcm1hbFN0eWxlVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB3YXJuIGlmIGEgYm9yZGVyL291dGxpbmUgZm9jdXMgc3R5bGUgaXMgJ25vbmUnIGFuZCBub2Ugb3RoZXIgKGNvbG9yIGFuZC9vciB3aWR0aCkgaXMgZGVmaW5lZCBcbiAgICAgICAgICAgIGlmIChub25lU3R5bGUgJiYgbnVtT3RoZXJTdHlsZSA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vIGZvY3VzIHN0eWxlIGRlZmluZWQgXG4gICAgICAgICAgICAvLyB3YXJuIGlmIG5vcm1hbCBzdHlsZSBpcyBkZWZpbmVkIGFuZCBpcyBub3QgXCJub25lXCJcbiAgICAgICAgICAgIGZvciAobGV0IG5vcm1hbFN0eWxlIGluIG5vcm1hbFN0eWxlcykge1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZVBhcmFtcy5jaGVja1BhcmFtcy52YWx1ZS5pbmNsdWRlcyhub3JtYWxTdHlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vcm1hbFN0eWxlVmFsdWUgPSBub3JtYWxTdHlsZXNbbm9ybWFsU3R5bGVdO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaWYgYm9yZGVyIG9yIG91dGxpbmUgc3R5bGUgaXMgXCJub25lXCIgXG4gICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlICE9PSAnbm9uZScpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiKTtcbiAgICAgICAgICAgICAgICB9ICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSAgIFxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2ZvY3VzX3Zpc2libGVcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOmxpbmssIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX1RyaWdnZXIyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIkNvbmZpcm0gV2luZG93cyBoaWdoIGNvbnRyYXN0IG1vZGUgaXMgc3VwcG9ydGVkIHdoZW4gdXNpbmcgQ1NTIHRvIGluY2x1ZGUsIHBvc2l0aW9uIG9yIGFsdGVyIG5vbi1kZWNvcmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaW5kb3dzIGhpZ2ggY29udHJhc3QgbW9kZSBtdXN0IGJlIHN1cHBvcnRlZCB3aGVuIHVzaW5nIENTUyB0byBpbmNsdWRlLCBwb3NpdGlvbiBvciBhbHRlciBub24tZGVjb3JhdGl2ZSBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiLCBcIjEuMy4yXCIsIFwiMS40LjExXCJdLCAgLy9vdGhlciBcInN0eWxlXCIgcnVsZXMgZm9yIGZvY3VzLCBob3ZlciwgYW5kIGNvbG9yXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlkXCI6IFtcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIiwgXCIxLjMuMlwiLCBcIjEuNC4xMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIgJiZcbiAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicmVsXCIpIHx8IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpICE9PSBcInN0eWxlc2hlZXRcIikpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJzdHlsZVwiICYmIG5vZGVOYW1lICE9PSBcImxpbmtcIiAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3R5bGVcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIikudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgbGV0IHRyaWdnZXJlZCA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsIGZhbHNlKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRyaWdnZXJlZDtcbiAgICAgICAgLy8gICAgICAgIFBhY2thZ2VzLmphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4odHJpZ2dlcmVkKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGVcIiwgdHJ1ZSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3R5bGVfaG92ZXJfcGVyc2lzdGVudDogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXSwgZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwiUGFzc18xXCI6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfM1wiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0aGUgaG92ZXI6IHBzZXVkby1jbGFzcyBpcyBub3QgdXNlZCB0byBkaXNwbGF5IGNvbnRlbnRcIixcbiAgICAgICAgICAgIC8vIFwiUGFzc18xXCI6IFwiY29udGVudCBkaXNwbGF5ZWQgdmlhIHRoZSA6aG92ZXIgcHNldWRvLWNsYXNzIGlzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSB0cmlnZ2VyIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18yXCI6IFwiY29udGVudCBkaXNwbGF5ZWQgdmlhIHRoZSA6aG92ZXIgcHNldWRvLWNsYXNzIGlzIHRoZSBhZGphY2VudCBzaWJsaW5nIG9mIHRoZSB0cmlnZ2VyIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJDb25maXJtIHRoZSBwb2ludGVyIGNhbiBiZSBwb3NpdGlvbmVkIG92ZXIgdGhlIGRpc3BsYXllZCBlbGVtZW50LCBub3QganVzdCB0aGUgdHJpZ2dlclwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIkNvbmZpcm0gdGhlIHBvaW50ZXIgY2FuIGJlIHBvc2l0aW9uZWQgb3ZlciBhbGwgdGhlIGluZm9ybWF0aW9uIGRpc3BsYXllZCBvbiBob3ZlclwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfM1wiOiBcIkNvbmZpcm0gdGhlIG1hcmdpbiBzdHlsZSBhdHRyaWJ1dGUgaGFzIG5vdCBwcmV2ZW50ZWQgdGhlIHBvaW50ZXIgZnJvbSBob3ZlcmluZyBvdmVyIHRoZSBkaXNwbGF5ZWQgZWxlbWVudCwgbm90IGp1c3QgdGhlIHRyaWdnZXJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgcG9pbnRlciBzaG91bGQgYmUgYWJsZSB0byBtb3ZlIG92ZXIgY29udGVudCBkaXNwbGF5ZWQgb24gaG92ZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjQuMTNcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgbGV0IHBhc3MwID0gZmFsc2U7XG4gICAgICAgIGxldCBwYXNzMSA9IGZhbHNlO1xuICAgICAgICBsZXQgcGFzczIgPSBmYWxzZTsgLy8gbmV2ZXIgaGFwcGVuXG4gICAgICAgIGxldCBwb3RlbnRpYWwxID0gZmFsc2U7XG4gICAgICAgIGxldCBwb3RlbnRpYWwyID0gZmFsc2U7XG4gICAgICAgIGxldCBwb3RlbnRpYWwzID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHN0eWxlVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlJVTEUgUlVOICoqKioqKioqKioqKioqKioqKlwiKTtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgLy8gY2hlY2sgaW1wb3J0XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoID0gXCIrcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7ICsrc0luZGV4KSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzLmxlbmd0aCA9IFwiK3N0eWxlUnVsZXMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgc3R5bGVSdWxlSW5kZXggPCBzdHlsZVJ1bGVzLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKioqKioqKlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKiogRk9SIExPT1Agc3R5bGVSdWxlSW5kZXggPSBcIitzdHlsZVJ1bGVJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kSG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG92ZXJFbGVtZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c0NvbWJpbmF0b3IgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGlsZGVDb21iaW5hdG9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheVZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyQ29tYmluYXRvckVsZW1lbnRIb3ZlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0aW5nRWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0aW5nSG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkamFjZW50UGx1c1NpYmxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRqYWNlbnRUaWxkZU11bHRpcGxlU2libGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZVRleHQgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlc1tcIitzdHlsZVJ1bGVJbmRleCtcIl0gPSBcIitydWxlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gQ2hlY2sgZm9yIDpob3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlVGV4dC5tYXRjaCgvOmhvdmVyL2cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSG92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjEuIGZvdW5kIDpob3ZlciA9IFwiKyBmb3VuZEhvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gR2V0IGhvdmVyIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJFbGVtZW50ID0gcnVsZVRleHQuc3BsaXQoXCI6XCIpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjIuIGZvdW5kIGVsZW1lbnQgdGhhdCBnb2VzIHdpdGggOmhvdmVyID0gXCIraG92ZXJFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjEuIE5vIGhvdmVyIG9uIGNzcyBlbGVtZW50IHNvIHNraXAgdGhpcyBydWxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWYgbm8gOmhvdmVyIHNraXAgdGhpcyBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDNhLiBDaGVjayBmb3IgY3NzIGNvbWJpbmF0b3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDRhLiBpZiBzbyBkbyB3ZSBoYXZlIGFuIGFmdGVyIGNvbWJpbmF0b3IgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbHVzVGVtcFN0ciA9IHJ1bGVUZXh0LnN1YnN0cmluZyhydWxlVGV4dC5pbmRleE9mKFwiK1wiKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdXNUZW1wU3RyID0gcGx1c1RlbXBTdHIudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlVGV4dC5tYXRjaCgvOmhvdmVyIFxcKy9nKSB8fCBydWxlVGV4dC5tYXRjaCgvOmhvdmVyXFwrL2cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdXNDb21iaW5hdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIzYS4gRm91bmQgcGx1c0NvbWJpbmF0b3IgPSBcIisgcGx1c0NvbWJpbmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gcGx1c1RlbXBTdHIuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjRhLiBGb3VuZCBwbHVzIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIithZnRlckNvbWJpbmF0b3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzYi4gQ2hlY2sgZm9yIGNzcyBjb21iaW5hdG9yICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0Yi4gaWYgc28gZG8gd2UgaGF2ZSBhbiBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3ZlciBcXH4vZykgfHwgcnVsZVRleHQubWF0Y2goLzpob3Zlclxcfi9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIm1hdGNoID0gXCIrcnVsZVRleHQubWF0Y2goXCI6aG92ZXIgXFx+XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZGVDb21iaW5hdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIzYi4gRm91bmQgdGlsZGVDb21iaW5hdG9yID0gXCIrIHRpbGRlQ29tYmluYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbHVzVGVtcFN0ciA9IHJ1bGVUZXh0LnN1YnN0cmluZyhydWxlVGV4dC5pbmRleE9mKFwiflwiKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzVGVtcFN0ciA9IHBsdXNUZW1wU3RyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IHBsdXNUZW1wU3RyLnNwbGl0KFwiIFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI0Yi4gRm91bmQgdGlsZGUgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGx1c0NvbWJpbmF0b3IgJiYgIXRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOTyBwbHVzQ29tYmluYXRvciBvciB0aWxkZUNvbWJpbmF0b3Igc28gc2tpcCB0aGlzIHJ1bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzQ29tYmluYXRvciBvciB0aWxkZUNvbWJpbmF0b3Igc28gUEFTU1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFJFUE9SVCBQQVNTIDAgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpOyAvLyBKQ0g6IHNob3VsZCB3ZSBoYXZlIGEgTi9BIHBhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTbyBub3cgd2UgaGF2ZSBhIGNzcyBlbGVtZW50IHdpdGggaG92ZXIgLSBlbGVtZW50OmhvdmVyIHNvIHdlIGhhdmUgcHJvYmxlbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjaGVja1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS4gQ2hlY2sgaWYgdGhlIGFmdGVyIGNvbWJpbmF0b3IgZWxlbWVudCBoYXMgZGlzcGxheTogcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2LiBDaGVjayBpZiBkaXNwbGF5IHByb3BlcnR5IGlzIG5vdCBub25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyQ29tYmluYXRvckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGluZGV4IG9mIGRpc3BsYXk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGx1c1RlbXBTdHIgPSBcIitwbHVzVGVtcFN0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHBsdXNUZW1wU3RyLmluZGV4T2YoXCJkaXNwbGF5OlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjUuIEZvdW5kIGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdXNUZW1wU3RyLnNsaWNlKGluZGV4ICsgOCkudHJpbSgpLnNwbGl0KFwiIFwiKVswXSAhPT0gXCJub25lO1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI2LiBGb3VuZCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheVZhbHVlIG5vdCBub25lID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSA9PT0gbm9uZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAwIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGJhZCBjc3Mgc28gaXQgd29uJ3QgaGFwcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5IHNvIHNraXAgdGhpcyBydWxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGJhZCBjc3Mgc28gaXQgd29uJ3QgaGFwcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHZlcmlmaWVkIHRoYXQgd2UgaGF2ZSBhIGNzcyBlbGVtZW50IHdpdGggYSBob3ZlciBvZiB0aGUgZm9ybWF0IHNwYW46aG92ZXIgKyBkaXYgeyBkaXNwbGF5OiBibG9jazsgfSB3aXRoIGFsbCB0aGUgcHJvcGVyIHByb3BlcnRpZXMgYW5kIHZhbHVlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB2ZXJpZmllZCB0aGF0IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGEgaG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIG9mIHRoZSBmb3JtYXQgc3Bhbjpob3ZlciArIGRpdiB7IGRpc3BsYXk6IGJsb2NrOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICB3aXRoIGFsbCB0aGUgcHJvcGVyIHByb3BlcnRpZXMgYW5kIHZhbHVlc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzMiA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZXMyLmxlbmd0aCA9IFwiK3N0eWxlUnVsZXMyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGVSdWxlSW5kZXgyID0gMDsgc3R5bGVSdWxlSW5kZXgyIDwgc3R5bGVSdWxlczIubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleDIrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBydWxlIGZvciBhZnRlckNvbWluYXRvckVsZW1lbnQ6aG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmluZCBhZnRlckNvbWJpbmF0b3JFbGVtZW50OmhvdmVyIHNlZSBpZiBydWxlIGhhcyBwcm9wZXJ0eSBkaXNwbGF5OiB2YWx1ZSB3aGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSAhPSBub25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKioqKioqKlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqKioqKioqIDJuZCBGT1Igc3R5bGVSdWxlSW5kZXgyID0gXCIrc3R5bGVSdWxlSW5kZXgyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVUZXh0MiA9IHN0eWxlUnVsZXNbc3R5bGVSdWxlSW5kZXgyXS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJ1bGVUZXh0MiA9IFwiLCBydWxlVGV4dDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIithZnRlckNvbWJpbmF0b3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWxsIHN1cHBvcnRpbmcgZWxlbWVudHMgZm9yIG1hcmdpbiBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBmaW5kIG1hcmdpbiBTVE9QIGFuZCBSRVBPUlQgRVJST1JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0V4U3RyaW5nID0gYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCArIFwiIHtcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyaW1SdWxlVGV4dDIgPSBydWxlVGV4dDIudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnSW5kZXggPSB0cmltUnVsZVRleHQyLmluZGV4T2YocmVnRXhTdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudFByb3BlcnRpZXMgPSB0cmltUnVsZVRleHQyLnNsaWNlKHJlZ0luZGV4KS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoIWFmdGVyQ29tYmluYXRvckVsZW1lbnRQcm9wZXJ0aWVzLm1hdGNoKC9tYXJnaW4vZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmltUnVsZVRleHQyLm1hdGNoKC9tYXJnaW4vZykpIHsgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5vIG1hcmdpbiBwcm9ibGVtIHNvIGNvbnRpbnVlIG9uLi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gd2UgaGF2ZSBhIHN1cHBvcnRpbmcgZWxlbWVudCBjc3MgZGVmaW5pdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50ID0gcnVsZVRleHQyLnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPSBzdXBwb3J0aW5nSG92ZXJFbGVtZW50LnNwbGl0KFwiIFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VwcG9ydGluZ0hvdmVyRWxlbWVudCA9IFwiK3N1cHBvcnRpbmdIb3ZlckVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5FRUQgVE8gQ0hFQ0sgRk9SIGFmdGVyQ29taW5hdG9yRWxlbWVudDpob3ZlciBpbiBPTkUgU1RFUFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGluZ0hvdmVyRWxlbWVudCA9PT0gYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCAmJiBydWxlVGV4dDIubWF0Y2goLzpob3Zlci9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNy4gRm91bmQgc3VwcG9ydGluZyBob3ZlciBlbGVtZW50IHNhbWUgYXMgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDcuIEZvdW5kIHN1cHBvcnRpbmcgaG92ZXIgZWxlbWVudCBzYW1lIGFzIGFmdGVyQ29tYmluYXRvckVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nRWxlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBzdXBwb3J0aW5nIGVsZW1lbnQgaGF2ZSBob3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiOC4gU3VwcG9ydGluZyBlbGVtZW50IGhhcyBob3ZlciBhbHNvID0gXCIrIGZvdW5kSG92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDguIFN1cHBvcnRpbmcgZWxlbWVudCBoYXMgaG92ZXIgYWxzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gcnVsZVRleHQyLmluZGV4T2YoXCJkaXNwbGF5OlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImluZGV4ID0gXCIraW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA5LiBGb3VuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjkuIEZvdW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPSBcIitzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdXNUZW1wU3RyLnNsaWNlKGluZGV4ICsgOCkudHJpbSgpLnNwbGl0KFwiIFwiKVswXSAhPT0gXCJub25lO1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMC4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjEwLiBGb3VuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlIG5vdCBub25lID0gXCIrc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgbGlzdCBvZiBob3ZlciBlbGVtZW50cyBhbmQgbmV4dCBzaWJsaW5nIGZvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgKyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBBREpBQ0VOVCBzaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG92ZXJFbGVtZW50ICE9PSBcIlwiICYmIHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdmVyRWxlbWVudExpc3QgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudExpc3QubGVuZ3RoID0gXCIraG92ZXJFbGVtZW50TGlzdC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaG92ZXJFbGVtZW50TGlzdFswXS50YWdOYW1lID0gXCIraG92ZXJFbGVtZW50TGlzdFswXS50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgYWRqYWNlbnQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQWRqYWNlbnQgc2libGluZyA9IFwiK2hvdmVyRWxlbWVudExpc3RbMF0ubmV4dEVsZW1lbnRTaWJsaW5nLnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWZ0ZXJDb21iaW5hdG9yRWxlbWVudC50b1VwcGVyQ2FzZSgpID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudC50b1VwcGVyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50LnRvVXBwZXJDYXNlKCkgPT09IGhvdmVyRWxlbWVudExpc3RbMF0ubmV4dEVsZW1lbnRTaWJsaW5nLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMWEuIEhvdmVyIHdpdGggcGx1cyBoYXMgYWRqYWNlbnQgc2libGluZy5cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTFhLiBIb3ZlciB3aXRoIHBsdXMgaGFzIGFkamFjZW50IHNpYmxpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkamFjZW50UGx1c1NpYmxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdmVyaWZpZWQgYSBzdXBwb3J0aW5nIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgY3NzIHJ1bGUgdGhhdCBjb250YWlucyBob3ZlciBhbmQgZGlzcGxheSBwcm9wZXJ0eSB0aGF0IGlzIG5vdCBlcXVhbCB0byBub25lIGFuZCBoYXMgYSBob3ZlciBlbGVtZW50IGluIHRoZSBib2R5IHdpdGggYW4gYWRqYWNlbnQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUkVQT1JUIFBBU1MgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzMCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1c0NvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjExYS4gTWFpbiBob3ZlciB3aXRoICsgY29tYmluYXRvciBoYXMgbm8gYWRqYWNlbnQgc2libGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBvdGVudGlhbDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWwxID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGxpc3Qgb2YgaG92ZXIgZWxlbWVudHMgYW5kIGRldGVybWluZSBpZiB0aGVyZSBhcmUgMiBvciBtb3JlIGFkamFjZW50IHNpYmxpbmdzIGZvciB+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgfiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBBREpBQ0VOVCBzaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG92ZXJFbGVtZW50ICE9PSBcIlwiICYmIHRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaG92ZXJFbGVtZW50LnRvVXBwZXJDYXNlKCkgPSBcIitob3ZlckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdmVyRWxlbWVudExpc3QgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJFbGVtZW50LnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudExpc3QubGVuZ3RoID0gXCIraG92ZXJFbGVtZW50TGlzdC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciB0d28gb3IgbW9yZSBhZGphY2VudCBzaWJsaW5nc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaWJsaW5ncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaWJsaW5nID0gaG92ZXJFbGVtZW50TGlzdFswXS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInNpYmxpbmcudGFnTmFtZSA9IFwiK3NpYmxpbmcudGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nLnRhZ05hbWUgPT09IGFmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoKHNpYmxpbmcgPSBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaWJsaW5nQ291bnQgPSBzaWJsaW5ncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzaWJsaW5nQ291bnQgPSBcIitzaWJsaW5nQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpDSCBUT0RPOiB3aGF0IGlmIHNpYmxpbmcgY291bnQgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nQ291bnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMWIuIEhvdmVyIHdpdGggdGlsZGUgYW5kIG9uZSBhZGphY2VudCBzaWJsaW5nXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFRpbGRlTXVsdGlwbGVTaWJsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFJFUE9SVCBQQVNTIDIgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2libGluZ0NvdW50ID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk1haW4gaG92ZXIgd2l0aCB+IGNvbWJpbmF0b3IgaGFzIHR3byBvciBtb3JlIHNpYmxpbmdzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBvdGVudGlhbDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDIgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1c0NvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlIGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHBsdXMgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RlIGF0IGxlYXN0IG9uZSBvZiB0aGUgcnVsZXMgbXVzdCBoYXZlIGEgZGlzcGxheSBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1c0NvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAxIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgaXMgc3RpbGwgZmFsc2UgPT4gcG90ZW50aWFsMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHRpbGRlIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RlIGF0IGxlYXN0IG9uZSBvZiB0aGUgcnVsZXMgbXVzdCBoYXZlIGEgc3VwcG9ydGluZ0VsZW1lbnQ6aG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1c0NvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdFbGVtZW50IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VwcG9ydGluZ0VsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHBsdXMgc3VwcG9ydGluZ0VsZW1lbnQ6aG92ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0VsZW1lbnQgaXMgc3RpbGwgZmFsc2UgPT4gcG90ZW50aWFsMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlSW5kZXgyID0gXCIrc3R5bGVSdWxlSW5kZXgyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZXMyLmxlbmd0aCA9IFwiK3N0eWxlUnVsZXMyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdXBwb3J0aW5nRWxlbWVudCA9IFwiK3N1cHBvcnRpbmdIb3Zlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXIgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gdGlsZGUgc3VwcG9ydGluZ0VsZW1lbnQ6aG92ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDIgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRoZXJlIGlzIGEgbWFyZ2luIGluIHRoZSBzdXBwb3J0aW5nIGVsZW1lbnRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBvdGVudGlhbDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAzIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsMyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfM1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaWxlbmNlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwYXNzMCA9IFwiK3Bhc3MwKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwYXNzMSA9IFwiK3Bhc3MxKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwYXNzMiA9IFwiK3Bhc3MyKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwb3RlbnRpYWwxID0gXCIrcG90ZW50aWFsMSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicG90ZW50aWFsMiA9IFwiK3BvdGVudGlhbDIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBvdGVudGlhbDMgPSBcIitwb3RlbnRpYWwzKTtcbiAgICAgICAgaWYgKHBhc3MwKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIC8vIGlmIChwYXNzMSkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18yXCIpOyAvLyBEb2Vzbid0IHRyaWdnZXJcbiAgICAgICAgLy8gaWYgKHBhc3MyKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzNcIik7IC8vIERvZXNuJ3QgdHJpZ2dlclxuICAgICAgICBpZiAocG90ZW50aWFsMSkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgaWYgKHBvdGVudGlhbDIpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgIGlmIChwb3RlbnRpYWwzKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8zXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG4vKipcbiAqIERlc2NyaXB0aW9uOiBUcmlnZ2VyIHdoZW4gdmlld3BvcnQgdW5pdHMgYXJlIHVzZWQgZm9yIGZvbnQgc2l6ZS5cbiAqIE9yaWdpbjogVmFyaW91c1xuICovXG5leHBvcnQgY29uc3Qgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxpbmssIGRvbTpzdHlsZSwgZG9tOipbc3R5bGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjFfU3R5bGVfVmlld3BvcnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBzdHlsZV92aWV3cG9ydF9yZXNpemFibGUuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRleHQgbXVzdCBzY2FsZSB1cCB0byAyMDAlIHdpdGhvdXQgbG9zcyBvZiBjb250ZW50IG9yIGZ1bmN0aW9uYWxpdHlcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0ZXh0IHNpemVkIHVzaW5nIHZpZXdwb3J0IHVuaXRzIGNhbiBiZSByZXNpemVkIHVwIHRvIDIwMCVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIxLjQuNFwiLCBcIjEuNC4xMFwiXSwgLy8gbWF0Y2ggaGVscCBmb3IgYm90aCBcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHRoZVBhdHRlcm4gPSAvXFxkKyh2d3x2aHx2bWlufHZtYXgpL2dpO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXRcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgcGFzc2VkICYmIHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUudHlwZSAmJiBydWxlLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gcnVsZSBhcyBDU1NTdHlsZVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gc3R5bGVSdWxlLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbXBvcnQgcnVsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocnVsZS50eXBlICYmIHJ1bGUudHlwZSA9PT0gMyAvKiBDU1NSdWxlLklNUE9SVF9SVUxFICovICYmIChydWxlIGFzIENTU0ltcG9ydFJ1bGUpLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRSdWxlID0gcnVsZSBhcyBDU1NJbXBvcnRSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gaW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzID8gaW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzIDogaW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydGVkUnVsZSA9IHJ1bGVzW3JJbmRleF0gYXMgYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUudHlwZSAmJiBpbXBvcnRlZFJ1bGUudHlwZSA9PT0gMSAvKiBDU1NSdWxlLlNUWUxFX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUuc3R5bGVbJ2ZvbnRTaXplJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9udFNpemUgPSBpbXBvcnRlZFJ1bGUuc3R5bGVbJ2ZvbnRTaXplJ10udHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZvbnRTaXplLm1hdGNoKHRoZVBhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb250U2l6ZS5sZW5ndGggJiYgZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZUZyb21MaW5rID0gcnVsZXNbckluZGV4XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHJ1bGVzIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUZyb21MaW5rLnR5cGUgJiYgcnVsZUZyb21MaW5rLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUZyb21MaW5rLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gcnVsZUZyb21MaW5rLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc3R5bGVWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgICAgIGlmIChzdHlsZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlUGF0dGVybiA9IC9mb250LXNpemU6XFxzKlxcZCsodnd8dmh8dm1pbnx2bWF4KS9naTtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBzdHlsZVZhbHVlLm1hdGNoKHN0eWxlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzdmdfZ3JhcGhpY3NfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3ZnX2dyYXBoaWNzX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206c3ZnXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdmdfZ3JhcGhpY3NfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwic3ZnX2dyYXBoaWNzX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBcInN2Z19ncmFwaGljc19sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBub24tZGVjb3JhdGl2ZSBTVkcgZWxlbWVudCBtdXN0IGhhdmUgYW4gYWNjZXNzaWJsZSBuYW1lXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgU1ZHIGVsZW1lbnQgaGFzIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2FjY19uYW1lXCI6IFwiVGhlIFNWRyBlbGVtZW50IGhhcyBubyBhY2Nlc3NpYmxlIG5hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiN2Q2NzM0XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHJ1bGVDb250ZXh0KSB8fCBBY2NOYW1lVXRpbC5pc0FjY2Vzc2libGVOYW1lSWdub3JhYmxlKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKG5hbWVfcGFpciAmJiBuYW1lX3BhaXIubmFtZSAmJiBuYW1lX3BhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYWNjX25hbWVcIilcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlRmFpbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2FyaWFfZGVzY2VuZGFudHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50c1wiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTp0YWJsZSBkb206dHJbcm9sZV0sIGFyaWE6dGFibGUgZG9tOnRoW3JvbGVdLCBhcmlhOnRhYmxlIGRvbTp0ZFtyb2xlXSwgYXJpYTpncmlkIGRvbTp0cltyb2xlXSwgYXJpYTpncmlkIGRvbTp0aFtyb2xlXSwgYXJpYTpncmlkIGRvbTp0ZFtyb2xlXSwgYXJpYTp0cmVlZ3JpZCBkb206dHJbcm9sZV0sIGFyaWE6dHJlZWdyaWQgZG9tOnRoW3JvbGVdLCBhcmlhOnRyZWVncmlkIGRvbTp0ZFtyb2xlXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50cy5odG1sXCIsXG4gICAgICAgICAgICBcImV4cGxpY2l0X3JvbGVcIjogXCJ0YWJsZV9hcmlhX2Rlc2NlbmRhbnRzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUYWJsZSBzdHJ1Y3R1cmUgZWxlbWVudHMgY2Fubm90IHNwZWNpZnkgYW4gZXhwbGljaXQgJ3JvbGUnIHdpdGhpbiB0YWJsZSBjb250YWluZXJzXCIsXG4gICAgICAgICAgICBcImV4cGxpY2l0X3JvbGVcIjogXCJBbiBleHBsaWNpdCBBUklBICdyb2xlJyBpcyBub3QgdmFsaWQgZm9yIDx7MH0+IGVsZW1lbnQgd2l0aGluIGFuIEFSSUEgcm9sZSAnezF9JyBwZXIgdGhlIEFSSUEgaW4gSFRNTCBzcGVjaWZpY2F0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50OyBcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBDb21tb25VdGlsLmlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgIC8vIGNhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgaWYgKHBhcmVudFJvbGUgPT09IG51bGwgfHwgcGFyZW50Um9sZS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gaWdub3JlIHRoZSByZWR1bmRhbmN5IGNhc2VzOiByZXBvcnRlZCBpbiB0aGUgYXJpYV9yb2xlX3JlZHVuZGFudCBydWxlXG4gICAgICAgIGNvbnN0IGltcGxpY2l0Um9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBjb25zdCBleHBsaWNpdFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTs7XG4gICAgICAgIGlmIChpbXBsaWNpdFJvbGVzICYmIGltcGxpY2l0Um9sZXMubGVuZ3RoID4gMCAmJiBleHBsaWNpdFJvbGVzICYmIGV4cGxpY2l0Um9sZXMubGVuZ3RoID4gMCBcbiAgICAgICAgICAgICYmIGV4cGxpY2l0Um9sZXMuc29tZShpdGVtID0+IGltcGxpY2l0Um9sZXMuaW5jbHVkZXMoaXRlbSkpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImV4cGxpY2l0X3JvbGVcIiwgW2NvbnRleHRbXCJkb21cIl0ubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwYXJlbnRSb2xlWzBdLnJvbGVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfY2FwdGlvbl9lbXB0eTogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9jYXB0aW9uX2VtcHR5XCIsXG4gICAgY29udGV4dDogXCJkb206Y2FwdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9DYXB0aW9uX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9jYXB0aW9uX2VtcHR5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8dGFibGU+IGVsZW1lbnQgaGFzIGFuIGVtcHR5IDxjYXB0aW9uPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Y2FwdGlvbj4gZWxlbWVudCBmb3IgYSA8dGFibGU+IGVsZW1lbnQgbXVzdCBjb250YWluIGRlc2NyaXB0aXZlIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfY2FwdGlvbl9uZXN0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfY2FwdGlvbl9uZXN0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpjYXB0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0NhcHRpb25fSW5UYWJsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfY2FwdGlvbl9uZXN0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiPGNhcHRpb24+IGVsZW1lbnQgaXMgbm90IG5lc3RlZCBpbnNpZGUgYSA8dGFibGU+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGNhcHRpb24+IGVsZW1lbnQgbXVzdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBhc3NvY2lhdGVkIDx0YWJsZT4gZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKSAhPSBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9oZWFkZXJzX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGFibGVfRGF0YUhlYWRpbmdzQXJpYVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfaGVhZGVyc19leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGFibGUgaGFzIG5vIGhlYWRlcnMgaWRlbnRpZmllZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkRhdGEgdGFibGUgbXVzdCBpZGVudGlmeSBoZWFkZXJzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MVGFibGVFbGVtZW50O1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIHRoZXJlIGFyZSBubyByb3dzLCB0aGUgcnVsZSBkb2VzIG5vdCBhcHBseS5cbiAgICAgICAgbGV0IHJvd3MgPSBydWxlQ29udGV4dC5yb3dzO1xuICAgICAgICBpZiAoIVRhYmxlVXRpbC5pc0RhdGFUYWJsZShydWxlQ29udGV4dCkgfHwgcm93cyA9PT0gbnVsbCB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSBUYWJsZVV0aWwudGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9oZWFkZXJzX3JlZl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRkW2hlYWRlcnNdLCBkb206dGhbaGVhZGVyc11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkICdpZCcgaW4gdGhpcyBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiByZWZlcnMgdG8gaXRzZWxmXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyIHRvIGEgY2VsbCBpbiB0aGUgc2FtZSB0YWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlciB0byBhIGNlbGwgaW5kaWNhdGVkIHdpdGggPHRoPiBvciBhIHJvbGUgb2YgXFxcImNvbHVtbmhlYWRlclxcXCIgb3IgXFxcInJvd2hlYWRlclxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSBzaG91bGQgcmVmZXIgdG8gYSB2YWxpZCBjZWxsIGluIHRoZSBzYW1lIHRhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXCJhMjVmNDVcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhcmVudFRhYmxlID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKTtcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50VGFibGUpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIGEgc2ltcGxlIHRhYmxlIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5LlxuICAgICAgICBpZiAocGFyZW50VGFibGUgPT0gbnVsbCB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBhcmVudFRhYmxlKSB8fCAhW1widGFibGVcIiwgXCJncmlkXCJdLmluY2x1ZGVzKHBhcmVudFJvbGUpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCB2YWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIik7XG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgaWRzID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xuICAgICAgICBsZXQgaW52YWxpZEhlYWRlclZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgc2FtZU5vZGVIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IHNhbWVUYWJsZUhlYWRlclZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBpZCA9IGlkc1tpXTtcbiAgICAgICAgICAgIGlmIChpZC50cmltKCkgPT09ICcnKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICAgICAgaWYgKCFlbGVtKVxuICAgICAgICAgICAgICAgIGludmFsaWRIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIGlmIChET01VdGlsLnNhbWVOb2RlKGVsZW0sIHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBzYW1lTm9kZUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCFET01VdGlsLmlzSW5TYW1lVGFibGUoZWxlbSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHNhbWVUYWJsZUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbU5hbWUgIT09ICd0aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhlbGVtLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyb2xlcy5pbmNsdWRlcygnY29sdW1uaGVhZGVyJykgJiYgIXJvbGVzLmluY2x1ZGVzKCdyb3doZWFkZXInKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRFbGVtSGVhZGVyVmFsdWVzLnB1c2goaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgIGlmIChpbnZhbGlkSGVhZGVyVmFsdWVzLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtpbnZhbGlkSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG4gICAgICAgIGlmIChzYW1lTm9kZUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfMlwiLCBbc2FtZU5vZGVIZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcbiAgICAgICAgaWYgKHNhbWVUYWJsZUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfM1wiLCBbc2FtZVRhYmxlSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG4gICAgICAgIGlmIChpbnZhbGlkRWxlbUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfNFwiLCBbaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcblxuICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2hlYWRlcnNfcmVsYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0ZCwgZG9tOnRoXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX1RhYmxlX0RhdGFDZWxsUmVsYXRpb25zaGlwc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfaGVhZGVyc19yZWxhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29tcGxleCB0YWJsZSBkb2VzIG5vdCBoYXZlIGhlYWRlcnMgZm9yIGVhY2ggY2VsbCBwcm9wZXJseSBkZWZpbmVkIHdpdGggJ2hlYWRlcicgb3IgJ3Njb3BlJ1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkZvciBhIGNvbXBsZXggZGF0YSB0YWJsZSwgYWxsIDx0aD4gYW5kIDx0ZD4gZWxlbWVudHMgbXVzdCBiZSByZWxhdGVkIHZpYSAnaGVhZGVyJyBvciAnc2NvcGUnIGF0dHJpYnV0ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXJlbnRUYWJsZSA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwidGFibGVcIik7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBsYXlvdXQgdGFibGUgb3IgYSBzaW1wbGUgdGFibGUgdGhlIHJ1bGUgZG9lcyBub3QgYXBwbHkuXG4gICAgICAgIGlmIChwYXJlbnRUYWJsZSA9PSBudWxsIHx8ICFUYWJsZVV0aWwuaXNDb21wbGV4RGF0YVRhYmxlKHBhcmVudFRhYmxlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIElmIHRoaXMgdGFibGUgaGFzbid0IGJlZW4gcHJlcHJvY2Vzc2VkLCBwcm9jZXNzIGl0LlxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQnVpbGQgYSBncmlkIHRoYXQncyBhY3R1YWxseSB1c2FibGUgKHJvd3NwYW4gYW5kIGNvbHNwYW4gZWxlbWVudHMgYXJlIGR1cGxpY2F0ZWQpXG4gICAgICAgICAgICAvLyBUaGlzIGJ1aWxkcyBhIHJlYWwgMmQgdGFibGUgYXJyYXkuXG4gICAgICAgICAgICBsZXQgZ3JpZCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRUYWJsZS5yb3dzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvdyA9IHBhcmVudFRhYmxlLnJvd3NbaV07XG4gICAgICAgICAgICAgICAgaWYgKCFncmlkW2ldKSBncmlkW2ldID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3cuY2VsbHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbal07XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShjZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBpICsgXCI6XCIgKyBqKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aWR0aCkgd2lkdGggPSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoZWlnaHQpIGhlaWdodCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBnWCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChncmlkW2ldW2dYXSkgZ1ggKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZWlnaHQ7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncmlkW2kgKyBrXSkgZ3JpZFtpICsga10gPSBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCB3aWR0aDsgKytsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFtpICsga11bZ1ggKyBsXSA9IGNlbGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdGFibGUgZ3JpZCBhbmQgcmVjb3JkIGhlYWRlcnMgdGhhdCBwb2ludCB0byBjZWxscyBhbmRcbiAgICAgICAgICAgIC8vIGNlbGxzIHRoYXQgYXJlIHBvaW50ZWQgdG8gYnkgaGVhZGVyc1xuICAgICAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICBsZXQgbG9va3VwID0ge31cbiAgICAgICAgICAgIGxldCBzY29wZWRDb2xzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyaWQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm93U2NvcGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBncmlkW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmlkQ2VsbCA9IGdyaWRbaV1bal07XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmlkTm9kZU5hbWUgPSBncmlkQ2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZE5vZGVOYW1lID09IFwidGhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWRDZWxsLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTY29wZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXhpcyBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBub3QgZW5vdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJheGlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChncmlkQ2VsbC5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PSBcInJvd2dyb3VwXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGF4aXMgYXR0cmlidXRlLCBpdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NvcGUgaXMgbm90IGVub3VnaC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiYXhpc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW0NhY2hlVXRpbC5nZXRDYWNoZShncmlkQ2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwic2NvcGVcIikgPT0gXCJjb2xcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZENvbHNbal0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXhpcyBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBub3QgZW5vdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJheGlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVycyBjYW4gcmVmZXIgdG8gb3RoZXIgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGhlYWRFbGVtLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyaWROb2RlTmFtZSA9PSBcInRkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dTY29wZWQgfHwgc2NvcGVkQ29sc1tqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFtDYWNoZVV0aWwuZ2V0Q2FjaGUoZ3JpZENlbGwsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW0NhY2hlVXRpbC5nZXRDYWNoZShoZWFkRWxlbSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbG9va3VwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByY0luZm8gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgdEluZm8gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcmNJbmZvICYmIHRJbmZvICYmIHJjSW5mbyBpbiB0SW5mbztcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiByY0luZm8gPT09IFwiMDowXCIgJiZcbiAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHRlc3QgaWYgaXQncyB0aGUgdXBwZXItbGVmdCBjZWxsIGFuZCBpdCdzIGVtcHR5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSB0YWJsZSBoYXMgbm8gdGgncywgaXQgbWF5IGp1c3QgYmUgdGhhdCB0aGlzIHdhcyBzdXBwb3NlZCB0byBiZSBhIGxheW91dFxuICAgICAgICAvLyB0YWJsZSwgd2hpY2ggaW50cm9kdWNlcyBhIGxvdCBvZiBub2lzZS4gIEluIHRoYXQgY2FzZSwgb25seSB0cmlnZ2VyIHRoaXMgZXJyb3JcbiAgICAgICAgLy8gb25jZSBwZXIgdGFibGUuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHBhcmVudFRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhcIikubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGlmIChDYWNoZVV0aWwuZ2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkX1RyaWdPbmNlXCIsIGZhbHNlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRfVHJpZ09uY2VcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9sYXlvdXRfbGluZWFyaXplZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGFibGVfTGF5b3V0VHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGFibGVfbGF5b3V0X2xpbmVhcml6ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2xheW91dF9saW5lYXJpemVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGFibGUgaXMgbm90IGJlaW5nIHVzZWQgdG8gZm9ybWF0IHRleHQgY29udGVudCBpbiBjb2x1bW5zIHVubGVzcyB0aGUgdGFibGUgY2FuIGJlIGxpbmVhcml6ZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2luZyB0YWJsZXMgdG8gZm9ybWF0IHRleHQgZG9jdW1lbnRzIGluIGNvbHVtbnMgdW5sZXNzIHRoZSB0YWJsZSBjYW4gYmUgbGluZWFyaXplZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gIVRhYmxlVXRpbC5pc0xheW91dFRhYmxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX3Njb3BlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3Njb3BlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206dGRbc2NvcGVdLCBkb206dGhbc2NvcGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfU2NvcGVfVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfc2NvcGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInRhYmxlX3Njb3BlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlZhbHVlIHByb3ZpZGVkIGlzIGludmFsaWQgZm9yIHRoZSAnc2NvcGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ3Njb3BlJyBhdHRyaWJ1dGUgc2hvdWxkIG9ubHkgYmUgdXNlZCBvbiBhIDx0aD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlZhbHVlIGZvciAnc2NvcGUnIGF0dHJpYnV0ZSBtdXN0IGJlIFxcXCJyb3dcXFwiLCBcXFwiY29sXFxcIiwgXFxcInJvd2dyb3VwXFxcIiwgb3IgXFxcImNvbGdyb3VwXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICd0ZCcpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG5cbiAgICAgICAgLy9vbmx5IGNvbnRpbnVlIGZvciAndGgnXG4gICAgICAgIGxldCBzY29wZVZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gL14ocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkkLy50ZXN0KHNjb3BlVmFsKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RhYmxlX1N0cnVjdHVyZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgd2l0aCBcXFwicHJlc2VudGF0aW9uXFxcIiByb2xlIG9yIFxcXCJub25lXFxcIiByb2xlIGhhcyBzdHJ1Y3R1cmFsIGVsZW1lbnQocykgYW5kL29yIGF0dHJpYnV0ZShzKSAnezF9J1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmxlIGVsZW1lbnRzIHdpdGggJ3JvbGU9XFxcInByZXNlbnRhdGlvblxcXCIgb3IgJ3JvbGU9XFxcIm5vbmVcXFwiIHNob3VsZCBub3QgaGF2ZSBzdHJ1Y3R1cmFsIGVsZW1lbnRzIG9yIGF0dHJpYnV0ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmIChUYWJsZVV0aWwuaXNEYXRhVGFibGUocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmlzTm9kZUluR3JpZChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBlcnJvck5vZGVzID0gW107XG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInN1bW1hcnlcIikpXG4gICAgICAgICAgICBlcnJvck5vZGVzLnB1c2gocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBjYXB0aW9uRWxlbXMgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNhcHRpb25cIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FwdGlvbkVsZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihjYXB0aW9uRWxlbXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY2FwdGlvbkVsZW1zW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGVycm9yTm9kZXNcbiAgICAgICAgICAgICAgICBlcnJvck5vZGVzLnB1c2goY2FwdGlvbkVsZW1zW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aE5vZGVzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0aFwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcih0aE5vZGVzW2ldLCBcInRhYmxlXCIpID09IHJ1bGVDb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHRoTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgZXJyb3JOb2Rlc1xuICAgICAgICAgICAgICAgIGVycm9yTm9kZXMucHVzaCh0aE5vZGVzW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdGROb2RlcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCh0ZE5vZGVzW2ldLmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpIHx8IHRkTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkgJiZcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHRkTm9kZXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4odGROb2Rlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBlcnJvck5vZGVzXG4gICAgICAgICAgICAgICAgZXJyb3JOb2Rlcy5wdXNoKHRkTm9kZXNbaV0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBhY3R1YWxseSBtYWtpbmcgdXNlIG9mIHRoZXNlcyBlcnJvck5vZGVzIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHBhc3NlZCBhbG9uZyB3aXRoXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGlvblJlc3VsdCwgd2UgZG8gbm90IG5lZWQgdG8ga2VlcCBsb29waW5nIG92ZXIgYW5kIGdldHRpbmcgZXZlcnkgc2luZ2xlIHZpb2xhdGluZyBub2RlIHVuZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJ1bGUgY29udGV4dC4gVGhpcyBjYW4gYmUgYSBmdXR1cmUgZW5oYW5jZW5tZW50IHdoZXJlIHdlIGFjdHVhbGx5IG1ha2UgdXNlIG9mIHRoZSBlcnJvciBub2RlcyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCBhbG9uZy4gQWRkaW5nIHRoaXMgYnJlYWsgdG8gc3BlZWQgdXAgcGVyZm9ybWFuY2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICBicmVhazsgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8ga2VlcCBhZGRpbmcgdGhlIGVycm9yIG5vZGVzLCBzdG9wIGFmdGVyIGZpbmRpbmcgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBub2RlIG5hbWUgZm9yIHRoZSBydWxlIGNvbnRleHQgZWxlbWVudCBpbiB0aGlzIGNhc2UgaXQgd2lsbCBhbHdheXMgYmUgdGFibGVcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50VG9rZW4gPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhIG5ldyBhcnJheSB3aGljaCB3aWxsIGNvbnRhbiBvbmx5IHRoZSBlbGVtZW50IHRhZyBmb3IgdGhlIHZpb2xhdGlvbiBlbGVtZW50c1xuICAgICAgICBsZXQgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBzZWVuIGhhc2ggdGhhdCB3aWxsIGtlZXAgdHJhc2sgb2YgYWxsIHRoZSBlbGVtZW50cyB0aGF0IHdlcmUgYWxyZWFkeSBhZGRlZCB0byB0aGUgdG9rZW4gYXJyYXksIHRvIG1ha2Ugc3VyZVxuICAgICAgICAvLyB3ZSBkbyBub3QgZHVwbGljYXRlIGFueSBvZiB0aGUgZWxlbWVudHMuIER1cGxpY2F0ZSBlbGVtZW50IHRhZ3MgaW4gdGhlIHRva2VuIG1lc3NhZ2UgbG9va3MgYmFkIGFuZCBjb25mdXNpbmcuXG4gICAgICAgIGxldCBzZWVuID0ge307XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdmlvbGF0aW5nIHN0cnVjdHVyYWwgZWxlbWVudHMgYW5kIGV4dHJhY3QgdGhlIGVsZW1lbnQgdGFnIHRvIGJlIHVzZWQgYXMgYSB0b2tlblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9yTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBuYW1lICh0YWcgbmFtZSkgZm9yIHRoZSB2aW9sYXRpbmcgc3RydWN0dXJhbCBlbGVtZW50XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBlcnJvck5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBhZGQgdGhlIHZpb2xhdGluZyBlbGVtZW50IG9uY2VcbiAgICAgICAgICAgIGlmICghc2Vlbi5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgYWRkaW5nIHRoZSB0b2tlbiBhcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3ZSBuZWVkIHRvIGhhbmRsZVxuICAgICAgICAgICAgICAgIC8vIHRoZSBzdW1tYXJ5IGF0dHJpYnV0ZSBvbiB0aGUgcnVsZUNvbnRleHQgKHRhYmxlKS4gV2Ugb25seSBhZGQgc3VtbWFyeSBvbmNlLCBzYW1lIGFzXG4gICAgICAgICAgICAgICAgLy8gZm9yIGVsZW1lbnRzIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGluIHRoZSBtZXNzYWdlLiAoU3VtbWFyeSBzaG91bGQgbm90IGR1cGxpY2F0ZSwgYnV0IGp1c3QgaW4gY2FzZSlcbiAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmICFzZWVuLmhhc093blByb3BlcnR5W1wic3VtbWFyeVwiXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIHNlZW5bXCJzdW1tYXJ5XCJdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgbmV3IHZpb2xhdGluZyBlbGVtZW50IGFkZCBpdCB0byB0aGUgc3RydWN0dXJhbCBlbGVtZW50IHRva2VucyBhcnJheVxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsRWxlbWVudFRva2Vucy5wdXNoKFwic3VtbWFyeVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBzZWVuW25vZGVOYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIG5ldyB2aW9sYXRpbmcgZWxlbWVudCBhZGQgaXQgdG8gdGhlIHN0cnVjdHVyYWwgZWxlbWVudCB0b2tlbnMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMucHVzaChub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIHRoZSBhcnJheSBvZiBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZCBqb2luIHRoZW0gd2l0aCBhIGNvbW1hIGFuZCBhIHNwYWNlIHRvIG1ha2UgZ3JhbW1hdGljYWwgY29ycmVjdCBpblxuICAgICAgICAvLyB0aGUgbWVzc2FnZS5cbiAgICAgICAgbGV0IHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyID0gc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KGVycm9yTm9kZXMubGVuZ3RoID09IDAsIGVycm9yTm9kZXMsICcnLCAnJywgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zXSk7XG4gICAgICAgIGlmIChlcnJvck5vZGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyXSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfQ2FwU3VtbVJlZHVuZGFudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfc3VtbWFyeV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIHRhYmxlIHN1bW1hcnkgZHVwbGljYXRlcyB0aGUgY2FwdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSB0YWJsZSBzdW1tYXJ5IG11c3Qgbm90IGR1cGxpY2F0ZSB0aGUgY2FwdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcG9mSWQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgc3VtU3RyO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3VtbWFyeVwiKSkge1xuICAgICAgICAgICAgcG9mSWQgPSAwO1xuICAgICAgICAgICAgc3VtU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3VtbWFyeVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDE7XG4gICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGVJZHMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGxldCBzdW1tYXJ5Tm9kZUNvbmNhdCA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1bW1hcnlOb2RlSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1bW1hcnlOb2RlSWQgPSBzdW1tYXJ5Tm9kZUlkc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoc3VtbWFyeU5vZGVJZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgc3VtbWFyeU5vZGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdW1tYXJ5Tm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShzdW1tYXJ5Tm9kZSxydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlOb2RlQ29uY2F0ICs9IFwiIFwiICsgQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoc3VtbWFyeU5vZGUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3VtU3RyID0gc3VtbWFyeU5vZGVDb25jYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdW1TdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNhcEVsZW1zID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjYXB0aW9uXCIpO1xuICAgICAgICAgICAgaWYgKGNhcEVsZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdW1TdHIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjYXBTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChjYXBFbGVtc1swXSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFzdW1TdHIuaW5jbHVkZXMoY2FwU3RyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZUZhaWwsIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG4gICAgXG4gICAgZXhwb3J0IGNvbnN0IHRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnQ6IFJ1bGUgPSB7XG4gICAgICAgIGlkOiBcInRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnRcIixcbiAgICAgICAgY29udGV4dDogXCJkb206KlwiLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgICAgICBoZWxwOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgICAgICBcImdyb3VwXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX3NwYWNpbmdcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc2l6ZWRcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3NfaW5saW5lXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX2RlZmF1bHRcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInZpb2xhdGlvbl9zcGFjaW5nXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJyZWNvbW1lbmRhdGlvbl9pbmxpbmVcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBvdGVudGlhbF9vdmVybGFwXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgdGFyZ2V0IG11c3QgYmUgc3VmZmljaWVudGx5IHNpemVkIG9yIHNwYWNlZCBmcm9tIG90aGVyIHRhcmdldHNcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc3BhY2luZ1wiOiBcIlRoZSB0YXJnZXQncyBzcGFjaW5nIGZyb20gb3RoZXIgdGFyZ2V0cyBpcyBzdWZmaWNpZW50XCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX3NpemVkXCI6IFwiVGhlIHRhcmdldOKAmXMgc2l6ZSBpcyBtb3JlIHRoYW4gMjQgQ1NTIHBpeGVsc1wiLFxuICAgICAgICAgICAgICAgIFwicGFzc19pbmxpbmVcIjogXCJUaGUgdGFyZ2V0IGlzIGluIGEgc2VudGVuY2Ugb3IgaXRzIHNpemUgaXMgb3RoZXJ3aXNlIGNvbnN0cmFpbmVkIGJ5IHRoZSBsaW5lLWhlaWdodCBvZiBub24tdGFyZ2V0IHRleHRcIixcbiAgICAgICAgICAgICAgICBcInBhc3NfZGVmYXVsdFwiOiBcIlRoZSB0YXJnZXQncyBzaXplIGlzIGRldGVybWluZWQgYnkgdGhlIHVzZXIgYWdlbnQgYW5kIGlzIG5vdCBtb2RpZmllZCBieSB0aGUgYXV0aG9yXCIsXG4gICAgICAgICAgICAgICAgXCJ2aW9sYXRpb25fc3BhY2luZ1wiOiBcIlVuZGVyc2l6ZWQgdGFyZ2V0IFxcXCJ7MH1cXFwiIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBzcGFjaW5nIG9mIDEyIENTUyBwaXhlbHMgZnJvbSBhbm90aGVyIHRhcmdldCBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgICAgIFwicmVjb21tZW5kYXRpb25faW5saW5lXCI6IFwiQ29uZmlybSB0aGUgaW5saW5lIHRhcmdldCBcXFwiezB9XFxcIiBpcyBzdWZmaWNpZW50bHkgc3BhY2VkIGZyb20gYW5vdGhlciBpbmxpbmUgdGFyZ2V0IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3ZlcmxhcFwiOiBcIkVuc3VyZSB0aGUgb3ZlcmxhcHBlZCB0YXJnZXQgXFxcInswfVxcXCIgbWVldHMgYSBtaW5pbXVtIHRhcmdldCBzaXplIG9yIGhhcyBzdWZmaWNpZW50IHNwYWNpbmcgZnJvbSB0aGUgb3ZlcmxhcHBpbmcgdGFyZ2V0IFxcXCJ7MX1cXFwiXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcnVsZXNldHM6IFt7XG4gICAgICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgICAgbnVtOiBbXCIyLjUuOFwiXSxcbiAgICAgICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUsXG4gICAgICAgICAgICByZWFzb25Db2RlczogW1wicGFzc19zcGFjaW5nXCIsXCJwYXNzX3NpemVkXCIsIFwicGFzc19pbmxpbmVcIixcInBhc3NfZGVmYXVsdFwiLCBcInZpb2xhdGlvbl9zcGFjaW5nXCIsIFwicG90ZW50aWFsX292ZXJsYXBcIl1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgICAgIG51bTogW1wiMi41LjhcIl0sXG4gICAgICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUsXG4gICAgICAgICAgICByZWFzb25Db2RlczogW1wicmVjb21tZW5kYXRpb25faW5saW5lXCJdXG4gICAgICAgIH1dLFxuICAgICAgICBhY3Q6IFtdLFxuICAgICAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBtYXBwZXIgOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhydWxlQ29udGV4dCk7IC8vY29udGV4dFtcImRvbVwiXS5ib3VuZHM7ICAgIFxuICAgICAgICAgICAgaWYgKCFib3VuZHMpIFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBpZ25vcmUgaGlkZGVuLCBub24tdGFyZ2V0XG4gICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuaXNUYXJnZXQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBpZiAoYm91bmRzLmhlaWdodCA+PSAyNCAmJiBib3VuZHMud2lkdGggPj0gMjQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19zaXplZFwiKTsgXG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlubGluZSBlbGVtZW50OiB3aXRob3V0IHRleHQgaW4gdGhlIHNhbWUgbGluZVxuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gQ1NTVXRpbC5nZXRJbmxpbmVTdGF0dXMocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAoc3RhdHVzLmlubGluZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnZpb2xhdGlvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfaW5saW5lXCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IGlubGluZSBlbGVtZW50IGlzIHRvbyBjbG9zZSBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25faW5saW5lXCIsIFtub2RlTmFtZSwgc3RhdHVzLnZpb2xhdGlvbl0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmlvbGF0aW9uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19kZWZhdWx0XCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IGlubGluZSBlbGVtZW50IGlzIHRvbyBjbG9zZSBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25faW5saW5lXCIsIFtub2RlTmFtZSwgc3RhdHVzLnZpb2xhdGlvbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGJyb3dzZXIgZGVmYXVsdFxuICAgICAgICAgICAgICAgIGlmIChDU1NVdGlsLmlzVGFyZ2V0QnJvd3NlckRlZmF1bHQocnVsZUNvbnRleHQpKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19kZWZhdWx0XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChjU3R5bGUgPT09IG51bGwpIFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgemluZGV4ID0gY1N0eWxlLnpJbmRleDsgICBcbiAgICAgICAgICAgIGlmICghemluZGV4IHx8IGlzTmFOKE51bWJlcih6aW5kZXgpKSlcbiAgICAgICAgICAgICAgICB6aW5kZXggPSBcIjBcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHRhcmdldCBlbGVtZW50c1xuICAgICAgICAgICAgbGV0IHRhcmdldEVsZW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYy5kb2N1bWVudEVsZW1lbnQsIFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudDo6dGFyZ2V0c1wiLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRFbGVtcyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHRhcmdldEVsZW1zID0gW107XG4gICAgICAgICAgICAgICAgLy9zZWxlY3QgYWxsIGVsZW1lbnRzIGV4Y2VwdCBpdHNlbGYgYW5kIGRlc2NlbmRhbnRzXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1zID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgKjpub3Qoc2NyaXB0KTpub3Qoc3R5bGUpJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZWxlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1zW2ldIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc1RhcmdldChlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RWxlbXMucHVzaChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLmRvY3VtZW50RWxlbWVudCwgXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Ojp0YXJnZXRzXCIsIHRhcmdldEVsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0YXJnZXRFbGVtcyB8fCB0YXJnZXRFbGVtcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBtaW5YID0gMjQ7XG4gICAgICAgICAgICBsZXQgbWluWSA9IDI0O1xuICAgICAgICAgICAgbGV0IGFkamFjZW50WCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgYWRqYWNlbnRZID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBjaGVja2VkID0gW107IC8vY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgc28gdGhlaXIgZGVzY2VuZGFudHMgZG9uJ3QgbmVlZCB0byBiZSBjaGVja2VkIGFnYWluXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0YXJnZXRFbGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB0YXJnZXRFbGVtc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiAgdGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBpcyBpbiBkb2N1bWVudCBvcmRlclxuICAgICAgICAgICAgICAgICAqICBpZiB0d28gZWxlbWVudHMgb3ZlcmxhcCBhbmQgei1pbmRleCBhcmUgbm90IGRlZmluZWQsIHRoZW4gdGhlIG5vZGUgcmVuZGVyZWQgZWFybGllciB3aWxsIGJlIG92ZXJsYWlkIGJ5IHRoZSBub2RlIHJlbmRlcmVkIGxhdGVyXG4gICAgICAgICAgICAgICAgICogIGZpbHRlciBvdXQgdGhlIGVsZW1lbnRzIHRoYXTigJlyZSBkZXNjZW5kYW50IG9yIGFuY2VzdG9ycyBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQsIG5vciBkZXNjZW5kYW50IG9mIHRoZSB0YXJnZXQgZWxlbWVudCdzIHNpYmxpbmdzXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgLy8gVXNlIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHRvIGNoZWNrIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcHNcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiByZXR1cm5zIDAgd2hlbiBjb21wYXJpbmcgYSBub2RlIHRvIGl0c2VsZlxuICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcnVsZUNvbnRleHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZICgxNik6IGVsZW0gaXMgY29udGFpbmVkIGJ5IHJ1bGVDb250ZXh0XG4gICAgICAgICAgICAgICAgLy8gQWxzbyBoYW5kbGUgc2VsZi1jb21wYXJpc29uIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IDAgfHwgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgbm9kZSBpbiBlbGVtcyB3aWxsIGJlIGFmdGVyIHRoZSB0YXJnZXQgbm9kZSAocnVsZUNvbnRleHQpLlxuICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TICg4KTogZWxlbSBjb250YWlucyBydWxlQ29udGV4dFxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhc2NlbmRhbnRzIG9mIHRoZSBlbGVtZW50LCBvciBpdHNlbGYgb3IgaXRzIGFzY2VuZGFudCBhbHJlYWR5IGNoZWNrZWRcbiAgICAgICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykgfHwgY2hlY2tlZC5zb21lKGl0ZW0gPT4gaXRlbS5jb250YWlucyhlbGVtKSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKGVsZW0pO1xuICAgICAgICAgICAgICAgIGlmICghYm5kcykgY29udGludWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IHpTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbSk7IFxuICAgICAgICAgICAgICAgIGxldCB6X2luZGV4ID0gJzAnO1xuICAgICAgICAgICAgICAgIGlmICh6U3R5bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgel9pbmRleCA9IHpTdHlsZS56SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmICghel9pbmRleCB8fCBpc05hTihOdW1iZXIoel9pbmRleCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgel9pbmRleCA9IFwiMFwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNhc2UgMjogdGhlIGVsZW1lbnQgb3ZlcmxhcHMgdGhlIHRhcmdldCBlbnRpcmVseVxuICAgICAgICAgICAgICAgIC8vIG5vdGUgd2hlbiBhIGxpbmsgaXMgaW5saW5lIHdpdGggb3RoZXIgdGFyZ2V0LCBpZiB0aGUgbGluayB0ZXh0IHdyYXBzIGluIGFub3RoZXIgbGluZSBpbiBhIGdpdmVuIHZpZXdwb3J0LCAgXG4gICAgICAgICAgICAgICAgLy8gdGhlIGJvdW5kcyBvZiB0aGUgbGluayBtYXkgY292ZXIgYW5kIHRoZSBlbnRpcmUgdHdvIGxpbmVzLCBjYXVzaW5nIHRoZSBvdGhlciB0YWdldHMgdG8gYmUgb3ZlcmxhcHBlZCwgc2VlIHR3byBsaW5rcyBpbiB0aGUgdGVzdCBjYXNlOiBlbGVtZW50X2lubGluZS5odG1sIFxuICAgICAgICAgICAgICAgIGlmIChibmRzLnRvcCA8PSBib3VuZHMudG9wICYmIGJuZHMubGVmdCA8PSBib3VuZHMubGVmdCAmJiBibmRzLnRvcCArIGJuZHMuaGVpZ2h0ID49IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IFxuICAgICAgICAgICAgICAgICAgICAmJiBibmRzLmxlZnQgKyBibmRzLndpZHRoID49IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YXJnZXQgb24gdG9wICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID8gcGFyc2VJbnQoemluZGV4KSA8IHBhcnNlSW50KHpfaW5kZXgpOiBwYXJzZUludCh6aW5kZXgpIDw9IHBhcnNlSW50KHpfaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFyZ2V0IGlzIGVudGlyZWx5IGNvdmVyZWQ6IHRhYmJhYmxlIHRhcmdldCBoYW5kbGVkIGJ5IGVsZW1lbnRfdGFiYmFibGVfdW5vYnNjdXJlZCBhbmQgdGFiaW5kZXg9LTEgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb3ZlcmxhcFwiLCBbbm9kZU5hbWUsIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY2FzZSAzOiBpZiB0aGUgdGFyZ2V0IG92ZXJsYXBzIHRoZSBlbGVtZW50IGVudGlyZWx5XG4gICAgICAgICAgICAgICAgaWYgKGJvdW5kcy50b3AgPD0gYm5kcy50b3AgJiYgYm91bmRzLmxlZnQgPD0gYm5kcy5sZWZ0ICYmIGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0ID49IGJuZHMudG9wICsgYm5kcy5oZWlnaHQgXG4gICAgICAgICAgICAgICAgICAgICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoID49IGJuZHMubGVmdCArIGJuZHMud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgb24gdG9wICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID8gcGFyc2VJbnQoemluZGV4KSA8IHBhcnNlSW50KHpfaW5kZXgpOiBwYXJzZUludCh6aW5kZXgpIDw9IHBhcnNlSW50KHpfaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdmVybGFwXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgLy8gdGhlIHRhcmdldCBvbiB0b3BcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcInZpb2xhdGlvbl9zcGFjaW5nXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7ICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY2FzZSA0OiB0aGUgZWxlbWVudCBvdmVybGFwcyBwYXJ0aWFsbHkgd2l0aCB0aGUgdGFyZ2V0XG4gICAgICAgICAgICAgICAgaWYgKCgoKGJvdW5kcy50b3AgPj0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCA8PSBibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSB8fCAoYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPD0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPj0gYm5kcy50b3AgK2JuZHMuaGVpZ2h0KSlcbiAgICAgICAgICAgICAgICAgICAgICYmICgoYm91bmRzLmxlZnQgPiBibmRzLmxlZnQgJiYgYm91bmRzLmxlZnQgPCBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm5kcy5sZWZ0ID4gYm91bmRzLmxlZnQgJiYgYm5kcy5sZWZ0IDwgYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGgpKSkgXG4gICAgICAgICAgICAgICAgICAgICB8fCAoKChib3VuZHMudG9wID4gYm5kcy50b3AgJiYgYm91bmRzLnRvcCA8IGJuZHMudG9wICsgYm5kcy5oZWlnaHQpIHx8IChibmRzLnRvcCA+IGJvdW5kcy50b3AgJiYgYm5kcy50b3AgPCBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCkpXG4gICAgICAgICAgICAgICAgICAgICAmJiAoKGJvdW5kcy5sZWZ0ID49IGJuZHMubGVmdCAmJiBib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggPj0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIDw9IGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG1vcmUgY2hlY2sgdG8gdHVybiB0byB2aW9sYXRpb24gIFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb3ZlcmxhcFwiLCBbbm9kZU5hbWUsIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pOyBcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG5vIG92ZXJsYXAgd2l0aCB0aGUgZWxlbSwgdGhvdWdoIG1heSBvdmVybGFwIHdpdGhlIG90aGVyIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXNYID0gMjQ7IFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlzWSA9IDI0OyAgIFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWxlbWVudCBpcyBpbiB0aGUgaG9yaXpvbnRhbGx5IHNhbWUgcm93IHdpdGggdGhlIHRhcmdldFxuICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoIDwgMjQgJiYgKChib3VuZHMudG9wID49IGJuZHMudG9wICYmIGJvdW5kcy50b3AgPD0gYm5kcy50b3AgKyBibmRzLmhlaWdodCkgfHwgKGJvdW5kcy50b3AgPD0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPiBibmRzLnRvcCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzWCA9IE1hdGgubWluKCBNYXRoLmFicyhib3VuZHMubGVmdCAtIGJuZHMubGVmdCksIE1hdGguYWJzKGJvdW5kcy5sZWZ0IC0gKGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSwgIE1hdGguYWJzKGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC0gKGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSwgTWF0aC5hYnMoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLSBibmRzLmxlZnQpKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IGlzIGluIHRoZSB2ZXJ0aWNhbGx5IHNhbWUgY29sdW1uIHdpdGggdGhlIHRhcmdldCAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvdW5kcy5oZWlnaHQgPCAyNCAmJiAoKGJvdW5kcy5sZWZ0ID49IGJuZHMubGVmdCAmJiBib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm91bmRzLmxlZnQgPD0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoID4gYm5kcy5sZWZ0KSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNZID0gTWF0aC5taW4oTWF0aC5hYnMoYm91bmRzLnRvcCAtIGJuZHMudG9wKSwgTWF0aC5hYnMoYm91bmRzLnRvcCAtIChibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSksICBNYXRoLmFicyhib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAtIChibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSksIE1hdGguYWJzKGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC0gYm5kcy50b3ApKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXNYIDwgbWluWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluWCA9IGRpc1g7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFggPSBlbGVtO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoZGlzWSA8IG1pblkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pblkgPSBkaXNZOyAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnRZID0gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja2VkLnB1c2goZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGNhc2UgNTogbm8gb3ZlcmxhcCArIGluc3VmZmljaWVudCB0YXJnZXQgc2l6ZS4gY2hlY2sgc3BhY2luZyAgICBcbiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aC8yKSArIG1pblggPCAxMiB8fCBNYXRoLnJvdW5kKGJvdW5kcy5oZWlnaHQvMikgKyBtaW5ZIDwgMTIpIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5yb3VuZChib3VuZHMud2lkdGgvMikgKyBtaW5YIDwgTWF0aC5yb3VuZChib3VuZHMuaGVpZ2h0LzIpICsgbWluWSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwidmlvbGF0aW9uX3NwYWNpbmdcIiwgW25vZGVOYW1lLCBhZGphY2VudFgubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pOyBcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJ2aW9sYXRpb25fc3BhY2luZ1wiLCBbbm9kZU5hbWUsIGFkamFjZW50WS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19zcGFjaW5nXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X2Jsb2NrX2hlYWRpbmc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9ibG9ja19oZWFkaW5nXCIsXG4gICAgY29udGV4dDogXCJkb206cCwgZG9tOmRpdiwgZG9tOmJyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxvY2tfU2hvdWxkQmVIZWFkaW5nXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9oZWFkaW5nXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwidGV4dF9ibG9ja19oZWFkaW5nLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2hlYWRpbmdcIjogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfYmxvY2tfaGVhZGluZy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJIZWFkaW5nIHRleHQgdXNlcyBhIGhlYWRpbmcgZWxlbWVudCBvciByb2xlXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9oZWFkaW5nXCI6IFwiQ29uZmlybSB0aGlzIHRleHQgJ3swfScgaXMgdXNlZCBhcyBhIGhlYWRpbmcgYW5kIGlmIHNvLCBtb2RpZnkgdG8gdXNlIGEgaGVhZGluZyBlbGVtZW50IG9yIHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIZWFkaW5nIHRleHQgc2hvdWxkIHVzZSBhIGhlYWRpbmcgZWxlbWVudCBvciByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInNjcmlwdFwiXSkgIT09IG51bGwpIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBudW1Xb3Jkczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAxMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgYm9keUZvbnQgPSAwO1xuICAgICAgICBsZXQgYm9keSA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpO1xuICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgYm9keVN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShib2R5WzBdKTtcbiAgICAgICAgICAgIGlmIChib2R5U3R5bGUpIGJvZHlGb250ID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoYm9keVN0eWxlWydmb250LXNpemUnXSwgYm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG51bVdvcmRzID0gdmFsaWRhdGVQYXJhbXMubnVtV29yZHMudmFsdWU7XG4gICAgICAgIGxldCB3b3Jkc1NlZW4gPSAwO1xuICAgICAgICBsZXQgd29yZFN0cjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGVtcGhhc2l6ZWRUZXh0ID0gZmFsc2U7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQpO253Lm5leHROb2RlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiZcbiAgICAgICAgICAgIG53Lm5leHROb2RlKCkgJiYgXG4gICAgICAgICAgICBudy5ub2RlICE9PSBydWxlQ29udGV4dCAmJlxuICAgICAgICAgICAgbncubm9kZSAhPT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocnVsZUNvbnRleHQpICYmXG4gICAgICAgICAgICAhW1wiYnJcIiwgXCJkaXZcIiwgXCJwXCJdLmluY2x1ZGVzKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIC8vIERvbid0IHJlcG9ydCB0d2ljZVxuICAgICAgICB7ICAgXG4gICAgICAgICAgICBpZiAobncubm9kZSA9PT0gcnVsZUNvbnRleHQgfHwgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgbndOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDMpIHsgXG4gICAgICAgICAgICAgICAgLy8gZm9yIHRleHQgY2hpbGRcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDAgJiYgbncubm9kZS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGl0J3Mgc3R5bGUgaWYgdGhlIHRhcmdldCBlbGVtZW50IGNvbnRhaW5zIHRleHQsIGUuZy4sIDxwPiBmYWtlIGhlYWRpbmc8L3A+IFxuICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG53Lm5vZGUucGFyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSAmJiAoc3R5bGVbJ2ZvbnQtd2VpZ2h0J10gPT09ICdib2xkJyB8fCBzdHlsZVsnZm9udC13ZWlnaHQnXSA+PSA3MDBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAoc3R5bGVbJ2ZvbnQtc2l6ZSddICYmIHN0eWxlWydmb250LXNpemUnXS5pbmNsdWRlcyhcImxhcmdlXCIpKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdHlsZVsnZm9udC1zaXplJ10gJiYgYm9keUZvbnQgIT09IDAgJiYgQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVbJ2ZvbnQtc2l6ZSddLG53Lm5vZGUucGFyZW50RWxlbWVudCkgID4gYm9keUZvbnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdjID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRTdHIucHVzaChuZXh0U3RyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZHNTZWVuICs9IHdjO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgbm9kZSBiZWNhdXNlIGl0J3MgZW1waGFzaXplZFxuICAgICAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm9kZSBjb250YWluIHJlZ3VsYXIgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBlbGVtZW50IGNoaWxkXG4gICAgICAgICAgICAgICAgaWYgKG53TmFtZSA9PT0gXCJiXCIgfHwgbndOYW1lID09PSBcInN0cm9uZ1wiIHx8IG53TmFtZSA9PT0gXCJ1XCIgfHwgbndOYW1lID09PSBcImZvbnRcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgY29udGFpbnMgZW1waGFzaXMgY2hpbGQsIGUuZy4sIDxwPjxzdHJvbmc+ZmFrZSBoZWFkaW5nPC9zdHJvbmc+PC9wPiBcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChudy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAod2MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JkU3RyLnB1c2gobmV4dFN0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3Jkc1NlZW4gKz0gd2M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBub2RlIGJlY2F1c2UgaXQncyBlbXBoYXNpemVkXG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZWxlbWVudCB3aGljaCBoYXMgYSByb2xlIGV4Y2VwdCAnZ2VuZXJpYycsICdwYXJhZ3JhcGgnIG9yICdzdHJvbmcnXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhcHBsZXQgZWxlbWVudCB0aGF0IGlzIGRlcHJlY2F0ZWQgYW55d2F5XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAocm9sZSAhPT0gbnVsbCAmJiByb2xlICE9PSAnZ2VuZXJpYycgJiYgcm9sZSAhPT0gJ3BhcmFncmFwaCcgJiYgcm9sZSAhPT0gJ3N0cm9uZycpIHx8IG53TmFtZSA9PT0gXCJhcHBsZXRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdvcmRzU2VlbiA9PSAwKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAvL2lnbm9yZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCDigJw64oCdICDigJws4oCdICDigJwt4oCdICDigJw74oCdIG9yIOKAnC7igJ0gXG4gICAgICAgIGlmICghcGFzc2VkKSBwYXNzZWQgPSAvWzosO1xcLVxcLl0kLy50ZXN0KHdvcmRTdHIuam9pbihcIiBcIikudHJpbSgpKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfaGVhZGluZ1wiLCBbd29yZFN0ci5qb2luKFwiIFwiKV0pO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENvbG9yVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbG9yVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50OiBSdWxlID0ge1xuICAgIGlkOiBcInRleHRfY29udHJhc3Rfc3VmZmljaWVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfQ29sb3JfQ29udHJhc3RfV0NBRzJBQVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9jb250cmFzdFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJJQk1BX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFfUFZcIjoge1xuICAgICAgICAgICAgXCJwYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX2dyYXBoaWNfYmFja2dyb3VuZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYHRleHRfY29udHJhc3Rfc3VmZmljaWVudC5odG1sYCxcbiAgICAgICAgICAgIFwiZmFpbF9jb250cmFzdFwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfc2FtZV9jb2xvclwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZ3JhcGhpY19iYWNrZ3JvdW5kXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0X3NoYWRvd1wiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb250cmFzdCByYXRpbyBvZiB0ZXh0IHdpdGggaXRzIGJhY2tncm91bmQgbXVzdCBtZWV0IFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgY29udHJhc3QgcmF0aW8gb2YgdGV4dCB3aXRoIGl0cyBiYWNrZ3JvdW5kIG1lZXRzIFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJhc3RcIjogXCJUZXh0IGNvbnRyYXN0IG9mIHswfSB3aXRoIGl0cyBiYWNrZ3JvdW5kIGlzIGxlc3MgdGhhbiB0aGUgV0NBRyBBQSBtaW5pbXVtIHJlcXVpcmVtZW50cyBmb3IgdGV4dCBvZiBzaXplIHsxfXB4IGFuZCB3ZWlnaHQgb2YgezJ9XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCI6IFwiVGhlIGZvcmVncm91bmQgdGV4dCBhbmQgaXRzIGJhY2tncm91bmQgY29sb3IgYXJlIGJvdGggZGV0ZWN0ZWQgYXMgezN9LiBWZXJpZnkgdGhlIHRleHQgbWVldHMgdGhlIFdDQUcgQUEgcmVxdWlyZW1lbnRzIGZvciBtaW5pbXVtIGNvbnRyYXN0XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IGFnYWluc3QgdGhlIGxpZ2h0ZXN0IGFuZCB0aGUgZGFya2VzdCBjb2xvcnMgb2YgdGhlIGJhY2tncm91bmQgbWVldHMgdGhlIFdDQUcgQUEgbWluaW11bSByZXF1aXJlbWVudHMgZm9yIHRleHQgb2Ygc2l6ZSB7MX1weCBhbmQgd2VpZ2h0IG9mIHsyfVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfdGV4dF9zaGFkb3dcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IHdpdGggc2hhZG93IG1lZXRzIHRoZSBXQ0FHIEFBIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0ZXh0IG9mIHNpemUgezF9cHggYW5kIHdlaWdodCBvZiB7Mn1cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjEuNC4zXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbJ2FmdzRmNyddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBhdm9pZCBkaWFnbm9zaW5nIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vVE9ETyA/IHNob3VsZCBvbmx5IGNvbnNpZGVyIG5hdGl2ZSBkaXNhYmxlZCwgaWdub3JlIGFyaWEtZGlzYWJsZWRcbiAgICAgICAgLy9za2lwIGRpc2FibGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9za2lwIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzdmdcIiwgXCJzY3JpcHRcIiwgXCJtZXRhXCIsIFwic3R5bGVcIl0pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBsZXQgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgICAgICBpZiAoIXdpbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHQuXG4gICAgICAgIGxldCBjaGlsZFN0ciA9IENvbW1vblV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpIHx8IChDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpICYmIENvbW1vblV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQuc2hhZG93Um9vdCkgPT09ICcnKSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT0gMCApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgdGV4dCBkb2VzIG5vdCBjb252ZXkgYW55dGhpbmcgaW4gaHVtYW4gbGFuZ3VhZ2VcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqICgxKSBpZ25vcmUgbm9uLWFscGhhbnVtZXJpYyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gQVNDSTogXihhLXpBLVpcXGRcXHMpXG4gICAgICAgICAgICAgKiAoMikgaWdub3JlIG5vbi1wcmludGFibGUgdW5pY29kZSBjaGFyYWN0ZXJzOiBcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRlxuICAgICAgICAgICAgICogIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzcwMTE3L3doYXQtaXMtdGhlLXJhbmdlLW9mLXVuaWNvZGUtcHJpbnRhYmxlLWNoYXJhY3RlcnNcbiAgICAgICAgICAgICAqICgzKSBmb3Igbm93IG5vdCBjb25zaWRlciB1bmljb2RlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IGFyZSBkaWZmZXJlbnQgaW4gZGlmZmVyZW50IGxhbmd1YWdlc1xuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC8vbGV0IHJlZ2V4ID0gL1teKGEtekEtWlxcZFxccylcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRl0rL2c7XG4gICAgICAgICAgICBsZXQgcmVnZXggPSAvW14oYS16QS1aXFxkXFxzKVxcXihcXHU0ZTAwLVxcdTlmZmZcXHUzNDAwLVxcdTRkYmYpXFx1MDAwMC1cXHUwMDA4XFx1MDAwQi1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXFx1MjA1Ri1cXHUyMDZGXFx1MzAwMFxcdUZFRkZdKy9nO1xuICAgICAgICAgICAgY2hpbGRTdHIgPSBjaGlsZFN0ci50cmltKCkucmVwbGFjZShyZWdleCwgJycpO1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbSA9IHJ1bGVDb250ZXh0O1xuICAgICAgICAvLyB0aGUgY2hpbGQgZWxlbWVudHMgKHJhdGhlciB0aGFuIHNoYWRvdyByb290KSBvZiBhIHNoYWRvdyBob3N0IGlzIGVpdGhlciByZS1hc3NpZ25lZCB0byB0aGUgc2hhZG93IHNsb3QgaWYgdGhlIHNsb3QgZXhpc3RzIFxuICAgICAgICAvLyBvciBub3QgZGlzcGxheWVkLCBzbyBzaG91bGRuJ3QgYmUgY2hlY2tlZCBmcm9tIHRoZSBsaWdodCBET00sIHJhdGhlciBpdCBzaG91bGQgYmUgY2hlY2tlZCBhcyByZWFzc2dpbmdlZCBzbG90IGVsZW1lbnQocykgaW4gdGhlIHNoYWRvdyBET00uXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAvLyBpZiBpdCdzIGRpcmVjdCB0ZXh0IG9mIGEgc2hhZG93IGhvc3RcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbm9kZT1ydWxlQ29udGV4dC5maXJzdENoaWxkOyBub2RlOyBub2RlPW5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGU9PTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgbXVsdGlwbGUgdGV4dHMgZXhpc3QsIG9ubHkgbmVlZCB0byBjaGVjayBvbmUgXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtID0gKG5vZGUgYXMgVGV4dCkuYXNzaWduZWRTbG90O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH0gICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgc3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEpDSCBjbGlwIElORk86XG4gICAgICAgIC8vICAgICAgVGhlIGNsaXAgcHJvcGVydHkgbGV0cyB5b3Ugc3BlY2lmeSBhIHJlY3RhbmdsZSB0byBjbGlwIGFuIGFic29sdXRlbHkgcG9zaXRpb25lZCBlbGVtZW50LiBcbiAgICAgICAgLy8gICAgICBUaGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBhcyBmb3VyIGNvb3JkaW5hdGVzLCBhbGwgZnJvbSB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNsaXBwZWQuXG4gICAgICAgIC8vICAgICAgUHJvcGVydHkgdmFsdWVzOlxuICAgICAgICAvLyAgICAgICAgICBub25lICAgICAgICBUaGlzIGlzIGRlZmF1bHQuIE5vIGNsaXBwaW5nIGlzIGRvbmVcbiAgICAgICAgLy8gICAgICAgICAgYXV0byAgICAgICAgTm8gY2xpcHBpbmcgd2lsbCBiZSBkb25lXG4gICAgICAgIC8vICAgICAgICAgIHNoYXBlICAgICAgIFRoZSBvbmx5IHZhbGlkIHZhbHVlIGlzOiByZWN0ICh0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQpXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGUuZy4sIGNsaXA6IHJlY3QoMTBweCwgMjBweCwgMzBweCwgNDBweCk7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IHRoZSBmb3VyIHZhbHVlcyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgbWFyZ2luL3BhZGRpbmdcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIHJlY3QgdmFsdWVzIGFyZSBwb3NpdGl2ZSBwaXhlbCB2YWx1ZXMsIGUuZy4sIDEwcHgsIGV0Yy5cbiAgICAgICAgLy8gICAgICAgICAgbWFyZ2luLWJveCAgVXNlcyB0aGUgbWFyZ2luIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBib3JkZXItYm94ICBVc2VzIHRoZSBib3JkZXIgYm94IGFzIHRoZSByZWZlcmVuY2UgYm94XG4gICAgICAgIC8vICAgICAgICAgIHBhZGRpbmctYm94IFVzZXMgdGhlIHBhZGRpbmcgYm94IGFzIHRoZSByZWZlcmVuY2UgYm94XG4gICAgICAgIC8vICAgICAgICAgIGNvbnRlbnQtYm94XG4gICAgICAgIC8vICAgICAgICAgIGZpbGwtYm94XG4gICAgICAgIC8vICAgICAgICAgIHN0cm9rZS1ib3hcbiAgICAgICAgLy8gICAgICBOT1RFOiB0aGUgQ1NTIGNsaXAgcHJvcGVydHkgaXMgZGVwcmVjYXRlZFxuICAgICAgICAvLyAgICAgIEFsc286IGNsaXAgb25seSB3b3JrcyBpZiB0aGUgZWxlbWVudCBpcyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYW5kIGNhbiBvbmx5IGRvIHJlY3RhbmdsZXNcbiAgICAgICAgLy8gY2hlY2sgaWYgZWxlbWVudCB2aXNpYmxlXG4gICAgICAgIGxldCB2aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKHN0eWxlLndpZHRoICE9PSBcIjBcIiAmJlxuICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ICE9PSBcIjBcIiAmJlxuICAgICAgICAgICAgc3R5bGUub3BhY2l0eSAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJlxuICAgICAgICAgICAgc3R5bGUudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicgJiZcbiAgICAgICAgICAgIHN0eWxlLm92ZXJmbG93ICE9PSAnaGlkZGVuJyAmJlxuICAgICAgICAgICAgLy8gbGVmdCBhbmQgcmlnaHQgd29yayB3aXRoIGFsbCBhYnNvbHV0ZSB1bml0c1xuICAgICAgICAgICAgKHN0eWxlLmxlZnQgPT09IFwiYXV0b1wiIHx8IChzdHlsZS5wb3NpdGlvbiA9PT0gJ2Fic29sdXRlJyAmJiBwYXJzZUludChzdHlsZS5sZWZ0LnJlcGxhY2UoL1teMC05ListXS8sICcnKSkgPiAwKSkgJiZcbiAgICAgICAgICAgIChzdHlsZS5sZWZ0ID09PSBcImF1dG9cIiB8fCAoc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZScgJiYgcGFyc2VJbnQoc3R5bGUudG9wLnJlcGxhY2UoL1teMC05ListXS8sICcnKSkgPiAwKSkpIHtcbiAgICAgICAgICAgIHZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJlbGVtZW50IElTIHZpc2libGVcIik7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkNIRUNLIENPTE9SIENPTlRSQVNUIHVubGVzcyB0byBzbWFsbFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZWxlbWVudCBOT1QgdmlzaWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRE8gTk9UIENIRUNLIENPTE9SIENPTlRSQVNUXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBjbGlwSGVpZ2h0ID0gLTE7XG4gICAgICAgIGlmIChzdHlsZS5jbGlwICE9PSBcImF1dG9cIikge1xuICAgICAgICAgICAgbGV0IGNsaXBTdHJpbmcgPSBzdHlsZS5jbGlwLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoY2xpcFN0cmluZy5pbmNsdWRlcyhcInJlY3RcIikpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVCcmFja2V0cyA9IC9cXCgoLiopXFwpL2c7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RPZlRleHQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSByZUJyYWNrZXRzLmV4ZWMoY2xpcFN0cmluZyk7XG4gICAgICAgICAgICAgICAgdmFyIGZvdW5kQXJyID0gZm91bmRbMV0uc3BsaXQoJywgJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3VuZEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImZvdW5kQXJyW1wiLGksXCJdID0gXCIsZm91bmRBcnJbaV0pO1xuICAgICAgICAgICAgICAgICAgICBsaXN0T2ZUZXh0LnB1c2goZm91bmRBcnJbaV0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImxpc3RPZlRleHQgPSBcIixsaXN0T2ZUZXh0KTtcbiAgICAgICAgICAgIGNsaXBIZWlnaHQgPSBwYXJzZUludChsaXN0T2ZUZXh0WzBdLnJlcGxhY2UoL3B4L2csICcnKSkgLSBwYXJzZUludChsaXN0T2ZUZXh0WzJdLnJlcGxhY2UoL3B4L2csICcnKSk7XG4gICAgICAgICAgICBjbGlwSGVpZ2h0ID0gTWF0aC5hYnMoY2xpcEhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBKQ0ggY2xpcC1wYXRoIElORk86XG4gICAgICAgIC8vICAgICAgRXhjZWxsZW50IGFydGljbGUgb24gY2xpcC1wYXRoOiBodHRwczovL2lzaGFkZWVkLmNvbS9hcnRpY2xlL2NsaXAtcGF0aC9cbiAgICAgICAgLy8gICAgICBjbGlwLXBhdGggaXMgYSB0b3RhbGx5IGRpZmZlcmVudCBhbmltYWwgd2l0aCBtYW55LCBtYW55IGRpZmZlcmVudCB2YXJpYXRpb25zXG4gICAgICAgIC8vICAgICAgVGhlIGdvYWwgd2FzIGZvciBpdCB0byBub3QgYmUgYXMgbGltaXRlZCBhcyBjbGlwXG4gICAgICAgIC8vICAgICAgVGhlIHN5bnRheCBpcyBtb3JlIGNvbXBsaWNhdGVkIChhcyBpdCBkb2VzIG1vcmUpIGFuZCBpdCBpcyBkaWZmZXJlbnQgZnJvbSBjbGlwLFxuICAgICAgICAvLyAgICAgIGUuZy4sIHRoZSBhYm92ZSBjbGlwIHJlY3RhbmdsZSB3b3VsZCBiZSBjbGlwLXBhdGg6IGluc2V0KDEwcHggMjBweCAzMHB4IDQwcHgpO1xuICAgICAgICAvLyAgICAgIE5vdGU6IHRoZXJlIGFyZSBubyBjb21tYXNcbiAgICAgICAgLy8gICAgICBBbHNvLCBpdCBjYW4gdGFrZSBzaW5nbGUgdmFsdWVzIHRvIG1ha2UgYWxsIHNpZGVzIHRoZSBzYW1lLCBvciAyIHZhbHVlcyAodmVydC9ob3JpKS5cbiAgICAgICAgLy8gICAgICBvciAzIHZhbHVlcyAodG9wL2hvcmkvYm90dG9tKVxuICAgICAgICAvLyAgICAgIEFuZCBwZXJjZW50YWdlcyBjYW4gd29ya3MgYXMgd2VsbCBhcyBweFxuICAgICAgICAvLyAgICAgIFxuICAgICAgICAvLyAgICAgIEFsdGhvdWdoIHRoZXJlIGFyZSBmaXZlIGRpZmZlcmVudCBzaGFwZXM6IGluc2V0ICh0ZXJtIHVzZWQgZm9yIHJlY3RhbmdsZSksIGNpcmNsZSxcbiAgICAgICAgLy8gICAgICAgICAgZWxsaXBzZSwgcG9seWdvbiwgcGF0aCAtIHdlIHdpbGwgb25seSBjb25jZXJuIG91cnNlbHZlcyB3aXRoIGluc2V0XG4gICAgICAgIC8vICAgICAgVGhlcmUgYXJlIDcgYm94IHZhbHVlczogbWFyZ2luLWJveCwgYm9yZGVyLWJveCwgcGFkZGluZy1ib3gsIGNvbnRlbnQtYm94LCBmaWxsLWJveCwgc3Ryb2tlLWJveCwgdmlldy1ib3hcbiAgICAgICAgLy8gICAgICBCb3ggYW5kIHNoYXBlIHZhbHVlcyBtYXkgYmUgY29tYmluZWQ6IGNsaXAtcGF0aDogcGFkZGluZy1ib3ggY2lyY2xlKDUwcHggYXQgMCAxMDBweCk7XG4gICAgICAgIC8vICAgICAgTk9URTogdGhlIGJveCB2YWx1ZXMgYXJlIE5PVCBpbnR1aXRpdmUsIHNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TaGFwZXMvRnJvbV9ib3hfdmFsdWVzI21hcmdpbi1ib3hcbiAgICAgICAgLy8gICAgICBcbiAgICAgICAgLy8gICAgICBTbyB0aGUga2V5IHF1ZXN0aW9uIGlzIHdoYXQgYW1vdW50IG9mIGVmZm9ydCBkbyB3ZSB3YW50IHRvIGludmVzdCBpbnRvIGNsaXAtcGF0aFxuICAgICAgICAvLyBcblxuICAgICAgICAvLyBKQ0ggZG9uJ3QgZG8gY2xpcC1wYXRoIG5vdyBcbiAgICAgICAgbGV0IGNsaXBQYXRoSGVpZ2h0ID0gLTE7XG4gICAgICAgIC8vIGlmIChzdHlsZS5jbGlwUGF0aCAhPT0gXCJhdXRvXCIpIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwic3R5bGUuY2xpcFBhdGggPSBcIixzdHlsZS5jbGlwUGF0aCk7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcInN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nID0gXCIsc3R5bGUuY2xpcFBhdGgudG9TdHJpbmcoKSk7XG4gICAgICAgIC8vICAgICBsZXQgY2xpcFN0cmluZyA9IHN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nKCk7XG4gICAgICAgIC8vICAgICBpZiAoY2xpcFN0cmluZy5pbmNsdWRlcyhcImluc2V0XCIpKSB7XG4gICAgICAgIC8vICAgICAgICAgdmFyIHJlQnJhY2tldHMgPSAvXFwoKC4qKVxcKS9nO1xuICAgICAgICAvLyAgICAgICB2YXIgbGlzdE9mVGV4dCA9IFtdO1xuICAgICAgICAvLyAgICAgICB2YXIgZm91bmQgPSByZUJyYWNrZXRzLmV4ZWMoY2xpcFN0cmluZyk7XG4gICAgICAgIC8vICAgICAgIHZhciBmb3VuZEFyciA9IGZvdW5kWzFdLnNwbGl0KCcgJyk7XG4gICAgICAgIC8vICAgICAgIGZvciAobGV0IGk9MDsgaTxmb3VuZEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFwiZm91bmRBcnJbXCIsaSxcIl0gPSBcIixmb3VuZEFycltpXSk7XG4gICAgICAgIC8vICAgICAgICAgbGlzdE9mVGV4dC5wdXNoKGZvdW5kQXJyW2ldKTtcbiAgICAgICAgLy8gICAgICAgfTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwibGlzdE9mVGV4dCA9IFwiLGxpc3RPZlRleHQpO1xuICAgICAgICAvLyBjbGlwUGF0aEhlaWdodCA9IHBhcnNlSW50KGxpc3RPZlRleHRbMF0ucmVwbGFjZSgvcHgvZywgJycpKSAtIHBhcnNlSW50KGxpc3RPZlRleHRbMl0ucmVwbGFjZSgvcHgvZywgJycpKTtcbiAgICAgICAgLy8gY2xpcFBhdGhIZWlnaHQgPSBNYXRoLmFicyhjbGlwSGVpZ2h0KTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNsaXBQYXRoSGVpZ2h0ID0gXCIsIGNsaXBQYXRoSGVpZ2h0KTtcblxuICAgICAgICAvLyBpZiAoc3R5bGUucG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiAmJiBzdHlsZS5jbGlwID09PSBcInJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KVwiICYmIHN0eWxlLm92ZXJmbG93ICE9PSBcInZpc2libGVcIikge1xuICAgICAgICAvLyBKQ0ggYXJiaXRyYXJpbHkgdXNlIGxlc3MgdGhhdCA3cHggZm9yIGNsaXBIZWlnaHRcbiAgICAgICAgaWYgKHN0eWxlLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIgJiYgY2xpcEhlaWdodCA8IDcgJiYgY2xpcEhlaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRE8gTk9UIENIRUNLIENPTE9SIENPTlRSQVNUIGJlY2F1c2UgdG9vIHNtYWxsXCIpO1xuICAgICAgICAgICAgLy8gQ29ybmVyIGNhc2Ugd2hlcmUgaXRlbSBpcyBoaWRkZW4gKGFjY2Vzc2liaWxpdHkgaGlkaW5nIHRlY2huaXF1ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBGaXJzdCBkZXRlcm1pbmUgdGhlIGNvbG9yIGNvbnRyYXN0IHJhdGlvXG4gICAgICAgIGxldCBjb2xvckNvbWJvID0gQ29sb3JVdGlsLkNvbG9yQ29tYm8oZWxlbSk7XG4gICAgICAgIGlmIChjb2xvckNvbWJvID09PSBudWxsKSB7XG4gICAgICAgICAgICAvL3NvbWUgZXhjZXB0aW9uIG9jY3VycmVkLCBvciBub3QgYWJsZSB0byBnZXQgY29sb3IgY29tYm8gZm9yIHNvbWUgcmVhc29uXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInVuYWJsZSB0byBnZXQgY29sb3IgY29tYm8gZm9yIGVsZW1lbnQ6IFwiICsgZWxlbS5ub2RlTmFtZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZnID0gY29sb3JDb21iby5mZztcbiAgICAgICAgbGV0IGJnID0gY29sb3JDb21iby5iZztcbiAgICAgICAgbGV0IHJhdGlvID0gZmcuY29udHJhc3RSYXRpbyhiZyk7XG4gICAgICAgIGxldCB3ZWlnaHQgPSBDU1NVdGlsLmdldFdlaWdodE51bWJlcihzdHlsZS5mb250V2VpZ2h0KTtcbiAgICAgICAgbGV0IHNpemUgPSBDU1NVdGlsLmdldEZvbnRJblBpeGVscyhzdHlsZS5mb250U2l6ZSwgZWxlbSk7XG4gICAgICAgIGxldCBpc0xhcmdlU2NhbGUgPSBzaXplID49IDI0IHx8IHNpemUgPj0gMTguNiAmJiB3ZWlnaHQgPj0gNzAwO1xuICAgICAgICBcbiAgICAgICAgaWYgKENTU1V0aWwuY29udGFpbnNDS0ooY2hpbGRTdHIpKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC1ydWxlcy5naXRodWIuaW8vcHVsbC8yMTIxL2ZpbGVzXG4gICAgICAgICAgICAvLyBmb3IgQ0pLLCAyMiBwdCBvciAxOCBwdCB3aXRoIGZvbnQtd2VpZ2h0ID49IDcwMCwgMXB0ID0gMS4zMzMgcHhcbiAgICAgICAgICAgIGlzTGFyZ2VTY2FsZSA9IHNpemUgPj0gMjkuMyB8fCBzaXplID49IDI0ICYmIHdlaWdodCA+PSA3MDA7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSByYXRpbyA+PSA0LjUgfHwgKHJhdGlvID49IDMgJiYgaXNMYXJnZVNjYWxlKTtcbiAgICAgICAgbGV0IGhhc0JhY2tncm91bmQgPSBjb2xvckNvbWJvLmhhc0JHSW1hZ2UgfHwgY29sb3JDb21iby5oYXNHcmFkaWVudDtcbiAgICAgICAgbGV0IHRleHRTaGFkb3cgPSBjb2xvckNvbWJvLnRleHRTaGFkb3c7XG4gICAgICAgIGxldCBpc0Rpc2FibGVkID0gQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChlbGVtKTtcbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBsZXQgY29udHJvbCA9IENvbW1vblV0aWwuZ2V0Q29udHJvbE9mTGFiZWwoZWxlbSk7XG4gICAgICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQgPSBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKGNvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoIWlzRGlzYWJsZWQgJiYgbm9kZU5hbWUgPT09ICdsYWJlbCcgJiYgQ29tbW9uVXRpbC5pc0Rpc2FibGVkQnlGaXJzdENoaWxkRm9ybUVsZW1lbnQoZWxlbSkpIHtcbiAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIENvbW1vblV0aWwuaXNEaXNhYmxlZEJ5UmVmZXJyaW5nRWxlbWVudChlbGVtKSkge1xuICAgICAgICAgICAgaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKipzZXRDYWNoZShydWxlQ29udGV4dCwgXCJFWFRfQ29sb3JfQ29udHJhc3RfV0NBRzJBQVwiLCB7XG4gICAgICAgICAgICBcInJhdGlvXCI6IHJhdGlvLFxuICAgICAgICAgICAgXCJpc0xhcmdlU2NhbGVcIjogaXNMYXJnZVNjYWxlLFxuICAgICAgICAgICAgXCJ3ZWlnaHRcIjogd2VpZ2h0LFxuICAgICAgICAgICAgXCJzaXplXCI6IHNpemUsXG4gICAgICAgICAgICBcImhhc0JhY2tncm91bmRcIjogaGFzQmFja2dyb3VuZCxcbiAgICAgICAgICAgIFwiaXNEaXNhYmxlZFwiOiBpc0Rpc2FibGVkXG4gICAgICAgIH0pOyovXG4gICAgICAgIFxuICAgICAgICAvLyBJZiBlbGVtZW50IG9yIHBhcmVudCBpcyBkaXNhYmxlZCwgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IChidXQgbWF5IGJlIDM6MSBpbiBmdXR1cmUpXG4gICAgICAgIGlmICghcGFzc2VkICYmIGlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGlmIChoYXNCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBwb3RlbnRpYWwgc2luY2UgYSB0ZXh0IG9uIGFuIGltYWdlIG9yIGdyYWRpZW50IG1heSBiZSBzdGlsbCB2aWV3YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSB0ZXh0IGxvY2F0aW9uIG9uIHRoZSBncmFkaWVudCBvciBpbWFnZVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2dyYXBoaWNfYmFja2dyb3VuZFwiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0XSk7O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBwb3RlbnRpYWwgc2luY2UgYSB0ZXh0IHdpdGggc2hhZG93IG1heSBiZSBzdGlsbCB2aWV3YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSBzaGFkb3cgZWZmZmVjdHNcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF90ZXh0X3NoYWRvd1wiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0XSk7O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZmcudG9IZXgoKSA9PT0gYmcudG9IZXgoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9zYW1lX2NvbG9yXCIsIFtyYXRpby50b0ZpeGVkKDIpLCBzaXplLCB3ZWlnaHQsIGZnLnRvSGV4KCksIGJnLnRvSGV4KCksIGNvbG9yQ29tYm8uaGFzQkdJbWFnZSwgY29sb3JDb21iby5oYXNHcmFkaWVudF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfY29udHJhc3RcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3F1b3RlZF9jb3JyZWN0bHk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5XCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRleHRfcXVvdGVkX2NvcnJlY3RseS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3F1b3RlZF9jb3JyZWN0bHkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIklmIHRoZSBmb2xsb3dpbmcgdGV4dCBpcyBhIHF1b3RhdGlvbiwgbWFyayBpdCBhcyBhIDxxPiBvciA8YmxvY2txdW90ZT4gZWxlbWVudDogezB9XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUXVvdGF0aW9ucyBzaG91bGQgYmUgbWFya2VkIHdpdGggPHE+IG9yIDxibG9ja3F1b3RlPiBlbGVtZW50c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBpZ25vcmUgdGhlIGNoZWNrIGlmIHRoZSBub2RlIGlzIGhpZGRlblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIGJvZHlcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIG1pbldvcmRzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDMsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluV29yZHMgPSB2YWxpZGF0ZVBhcmFtcy5taW5Xb3Jkcy52YWx1ZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0ID0gbnVsbDtcbiAgICAgICAgLy8gaWdub3JlIHRoZSBjaGVjayBmb3IgdGhlIHRleHQgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50c1xuICAgICAgICBjb25zdCBpZ25vcmVkID0gW1wiYmxvY2txdW90ZVwiLCBcInFcIiwgXCJzY3JpcHRcIiwgXCJzdHlsZVwiLCBcInByZVwiLCBcImNvZGVcIiwgXCJydWJ5XCIsIFwic2FtcFwiXTtcbiAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gQ29tcGx5IHRvIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHdpbGwgYmUgZG9uZSBieSBkZWZhdWx0IGFzIHRoaXMgcnVsZSB0cmlnZ2VycyBvbiBlYWNoIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIGFuZCBmb3IgZWFjaCBlbGVtZW50IGl0IG9ubHkgY2hlY2tzIHRoYXQgc2luZ2xlIGVsZW1lbnRzIHRleHQgbm9kZXMgYW5kIG5vdGhpbmcgZWxzZS4gU28gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmVcbiAgICAgICAgICAgIC8vIGNvdmVyZWQgb24gdGhlaXIgb3duLiBDdXJyZW50bHkgZm9yIHRoaXMgcnVsZSBieSBkZWZhdWx0IENoZWNrIEhpZGRlbiBDb250ZW50IHdpbGwgd29yaywgYXMgd2UgYXJlIGRvaW5nXG4gICAgICAgICAgICAvLyBhIG5vZGUgd2FsayBvbmx5IG9uIHNpYmxpbmdzIHNvIGl0IHdvdWxkIG5vdCBnZXQgdGV4dCBub2RlcyBmcm9tIG90aGVyIHNpYmxpbmdzIGF0IGFsbC5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIGluIHRoZSBmdXR1cmUgc29tZXRoaW5nIGNobmdlcywganVzdCBuZWVkIHRvIGFkZCAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSB0byB0aGUgYmVsb3dcbiAgICAgICAgICAgIC8vIGlmLlxuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIC8vIERvIHRoZSByZWdleCB0ZXN0cyBmaXJzdCAtIHNob3VsZCBiZSBmYXN0XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYXBvc3Ryb3BoZSdzXG4gICAgICAgICAgICAgICAgdHh0VmFsID0gdHh0VmFsLnJlcGxhY2UoLyhcXFMpJyhcXFMpL2csIFwiJDEkMlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgZGJsUXVvdGVzID0gdHh0VmFsLm1hdGNoKC8oXCJbXlwiXStcIikvZyk7XG4gICAgICAgICAgICAgICAgbGV0IHNuZ2xRdW90ZXMgPSB0eHRWYWwubWF0Y2goLygnW14nXSsnKS9nKTtcbiAgICAgICAgICAgICAgICAvLyBXYWxrIHRoZSBwYXJlbnRzIC0gb25seSBjb250aW51ZSB0ZXN0aW5nIGlmIHdlIGZvdW5kIGEgcXVvdGUsIGJ1dFxuICAgICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBhbHJlYWR5IG1hcmtlZCB1cFxuICAgICAgICAgICAgICAgIC8vIEFsc28gc2tpcCBpZiB3ZSdyZSBpbiBhIHNjcmlwdCAtIHRoZXJlJ3MgbG90cyBvZiBxdW90ZXMgdXNlZCBpbiBzY3JpcHRzXG4gICAgICAgICAgICAgICAgaWYgKChkYmxRdW90ZXMgIT09IG51bGwgfHwgc25nbFF1b3RlcyAhPT0gbnVsbCkgJiZcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcih3YWxrTm9kZSwgaWdub3JlZCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRibFF1b3RlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBkYmxRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC53b3JkQ291bnQoZGJsUXVvdGVzW2ldKSA8IG1pbldvcmRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzbmdsUXVvdGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHNuZ2xRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC53b3JkQ291bnQoc25nbFF1b3Rlc1tpXSkgPCBtaW5Xb3JkcztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgbGluZWZlZWQgaW5zaWRlIHRoZSBxdW90ZVxuICAgICAgICAgICAgICAgICAgICAvLyB2aW9sYXRlZHRleHQgPSB0eHRWYWwucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIixcImdcIiksXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYmxRdW90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHNuZ2xRdW90ZXMuam9pbihcIiwgXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFxyP1xcXFxufFxcXFxyXCIsIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc25nbFF1b3RlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmpvaW4oXCIsIFwiKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcXFxccj9cXFxcbnxcXFxcclwiLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmNvbmNhdChzbmdsUXVvdGVzKS5qb2luKFwiLCBcIikucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIiwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSB2aW9sYXRlZHRleHQgaXMgbG9uZ2VyIHRoYW4gNjkgY2hhcnMsIG9ubHkga2VlcCB0aGUgZmlyc3QgMzIsIHRoZSBcIiAuLi4gXCIsIGFuZCB0aGUgbGFzdCAzMiBjaGFycyBcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgdmlvbGF0ZWR0ZXh0Lmxlbmd0aCAmJiB2aW9sYXRlZHRleHQubGVuZ3RoID4gNjkpIHtcbiAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHZpb2xhdGVkdGV4dC5zdWJzdHJpbmcoMCwgMzIpICsgXCIgLi4uIFwiICsgdmlvbGF0ZWR0ZXh0LnN1YnN0cmluZyh2aW9sYXRlZHRleHQubGVuZ3RoIC0gMzIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFt2aW9sYXRlZHRleHRdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfc2Vuc29yeV9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9zZW5zb3J5X21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJvZHksIGRvbTpib2R5IGRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGV4dF9TZW5zb3J5UmVmZXJlbmNlXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9wb3NpdGlvbiwgcG90ZW50aWFsX290aGVyXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9wb3NpdGlvblwiOiBcInRleHRfc2Vuc29yeV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3RoZXJcIjogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIkluc3RydWN0aW9ucyBhcmUgbWVhbmluZ2Z1bCB3aXRob3V0IHJlbHlpbmcgc29sZWx5IG9uIHNoYXBlLCBzaXplLCBvciBsb2NhdGlvbiB3b3Jkc1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcG9zaXRpb25cIjogXCJDb25maXJtIHRoZSB3b3JkKHMpICd7MH0nIG9mIHRoZSB1c2VyIGluc3RydWN0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBsb2dpY2FsIHJhdGhlciB0aGFuIHZpc3VhbCBwb3NpdGlvblwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3RoZXJcIjogXCJDb25maXJtIHRoZSB1c2VyIGluc3RydWN0aW9uIGlzIHN0aWxsIHVuZGVyc3RhbmRhYmxlIHdpdGhvdXQgdGhlIHdvcmQocykgJ3swfSdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbnN0cnVjdGlvbnMgc2hvdWxkIGJlIG1lYW5pbmdmdWwgd2l0aG91dCByZWx5aW5nIHNvbGVseSBvbiBzaGFwZSwgc2l6ZSwgb3IgbG9jYXRpb24gd29yZHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGVOYW1lIG9mIHRoZSBjb250ZXh0IG5vZGVcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluY2x1ZGVzKG5vZGVOYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIHNjcmlwdCwgbGluaywgbGFiZWwgYW5kIHRoZWlyIGNoaWxkIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzY3JpcHRcIiwgXCJhXCIsICdsYWJlbCddKSAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIFxuICAgICAgICAvLyBpZ25vcmUgdGV4dCBvbiBsYW5kbWFyayByb2xlcywgYnV0IG5vdCBvbiB0aGVpciBjaGlsZHJlbiAoZS5nLiwgc2VjdGlvbiwgbWFpbilcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICBsZXQgbG1Sb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzV2l0aFR5cGVzKHJ1bGVDb250ZXh0LCBbXCJsYW5kbWFya1wiXSk7XG4gICAgICAgICAgICBpZiAobG1Sb2xlcyAmJiBsbVJvbGVzLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9ICAgIFxuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGFsbCB3aWRnZXRzIGFuZCBoZWFkaW5ncywgYW5kIHRoZWlyIGNoaWxkcmVuLCBhbmQgY2VydGFpbiBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNXaXRoVHlwZXMocnVsZUNvbnRleHQsIFtcIndpZGdldFwiLCBcImhlYWRpbmdcIl0pO1xuICAgICAgICAvLyBhZGQgc29tZSBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFtcImNhcHRpb25cIiwgXCJjZWxsXCIsIFwiY29kZVwiLCBcImNvbHVtbmhlYWRlclwiLCBcImRlZmluaXRpb25cIiwgXCJmaWd1cmVcIiwgXCJsaXN0XCIsIFwibGlzdGl0ZW1cIiwgXCJtYXRoXCIsIFwibWV0ZXJcIiwgXCJyb3dcIiwgXCJyb3dncm91cFwiLCBcInJvd2hlYWRlclwiLCBcInRlcm1cIl0sIHJvbGVzKTtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGVzKHJ1bGVDb250ZXh0LCByb2xlcykgIT09IG51bGwpIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHZpb2xhdGVkUG9zaXRpb25UZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IHZpb2xhdGVkT3RoZXJUZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdHh0VmFsID0gXCJcIjsgXG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFxuICAgICAgICAgICAgLy8gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmUgY292ZXJlZCBvbiB0aGVpciBvd24uIFxuICAgICAgICAgICAgLy8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChzcGFjZSwgbmV3bGluZSwgdGFiKSBiZXR3ZWVuIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIGEgbm9kZSB0b28uXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT09IFwiI3RleHRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eHQgPSB3YWxrTm9kZS5ub2RlVmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmICh0eHQubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgdHh0VmFsICs9ICh0eHRWYWwubGVuZ3RoID4gMCA/IFwiLCBcIiArIHR4dCA6IHR4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAodHh0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAvLyBmaXJzdCB0byByZW1vdmUgZWFjaCBleGVtcHQgd29yZCB3aXRoIGEgc2luZ2xlIHNwYWNlIGluIHRoZSB0ZXh0XG4gICAgICAgICAgICBsZXQgZXhlbXB0UmVnZXggPSBnZXRSZWdleChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImV4ZW1wdFRleHRcIik7XG4gICAgICAgICAgICB0eHRWYWwgPSB0eHRWYWwucmVwbGFjZShleGVtcHRSZWdleCwgXCIgXCIpO1xuXG4gICAgICAgICAgICB2aW9sYXRlZFBvc2l0aW9uVGV4dCA9IGdldFZpb2xhdGVkVGV4dChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInBvc2l0aW9uVGV4dFwiLCB0eHRWYWwpO1xuICAgICAgICAgICAgdmlvbGF0ZWRPdGhlclRleHQgPSBnZXRWaW9sYXRlZFRleHQocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJvdGhlclRleHRcIiwgdHh0VmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXQgPSBbXTsgXG4gICAgICAgIGlmICh2aW9sYXRlZFBvc2l0aW9uVGV4dCkgcmV0LnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9wb3NpdGlvblwiLCBbdmlvbGF0ZWRQb3NpdGlvblRleHRdKSk7XG4gICAgICAgIGlmICh2aW9sYXRlZE90aGVyVGV4dCkgcmV0LnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdGhlclwiLCBbdmlvbGF0ZWRPdGhlclRleHRdKSk7XG4gICAgICAgIHJldHVybiByZXQubGVuZ3RoID09IDAgPyBudWxsIDogcmV0O1xuICAgIH1cbn1cblxuY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgcG9zaXRpb25UZXh0OiB7XG4gICAgICAgIHZhbHVlOiBbXCJ0b3AtbGVmdFwiLCBcInRvcC1yaWdodFwiLCBcImJvdHRvbS1yaWdodFwiLCBcImJvdHRvbS1sZWZ0XCIsXG4gICAgICAgICAgICBcInRvcC10by1ib3R0b21cIiwgXCJsZWZ0LXRvLXJpZ2h0XCIsIFwiYm90dG9tLXRvLXRvcFwiLCBcInJpZ2h0LXRvLWxlZnRcIixcbiAgICAgICAgICAgIFwicmlnaHRcIiwgXCJsZWZ0XCIsIFwiYWJvdmVcIiwgXCJiZWxvd1wiLCBcInRvcFwiLCBcImJvdHRvbVwiLFxuICAgICAgICAgICAgXCJ1cHBlclwiLCBcImxvd2VyXCIsIFwiY29ybmVyXCIsIFwiYmVzaWRlXCJcbiAgICAgICAgXSxcbiAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgfSxcbiAgICBvdGhlclRleHQ6IHtcbiAgICAgICAgdmFsdWU6IFtcInJvdW5kXCIsIFwic3F1YXJlXCIsIFwic2hhcGVcIiwgXCJyZWN0YW5nbGVcIiwgXCJ0cmlhbmdsZVwiLFxuICAgICAgICAgICAgXCJzaXplXCIsIFwibGFyZ2VcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImJpZ1wiLCBcImh1Z2VcIiwgXCJ0aW55XCIsIFwiZXh0cmFcIixcbiAgICAgICAgICAgIFwibGFyZ2VyXCIsIFwic21hbGxlclwiLCBcImJpZ2dlclwiLCBcImxpdHRsZVwiLCBcImxhcmdlc3RcIiwgXCJzbWFsbGVzdFwiLCBcImJpZ2dlc3RcIlxuICAgICAgICBdLFxuICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICB9LFxuICAgIGV4ZW1wdFRleHQ6IHtcbiAgICAgICAgdmFsdWU6IFtcInJpZ2h0LWNsaWNrXCIsIFwibGVmdC1jbGlja1wiLCBcInJpZ2h0LWNsaWNraW5nXCIsIFwicmlnaHQtY2xpY2tzXCIsIFxuICAgICAgICAgICBcImxlZnQtY2xpY2tpbmdcIiwgXCJsZWZ0LWNsaWNrc1wiLCBcInNxdWFyZSByb290XCIsIFwicmlnaHQgbm93XCIsIFwib2ZmIHRoZSB0b3BcIiAgIC8vYXBwZW5kIGFzIG5lZWRlZFxuICAgICAgICBdLFxuICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICB9ICAgIFxufVxuXG5mdW5jdGlvbiBnZXRSZWdleChkb2MsIHR5cGUpIHtcbiAgICBpZiAoIXZhbGlkYXRlUGFyYW1zW3R5cGVdKSByZXR1cm4gXCJcIjtcbiAgICBsZXQgc2Vuc29yeVJlZ2V4ID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgdHlwZSArIFwiX3NlbnNvcnlfbWlzdXNlXCIsIG51bGwpO1xuICAgIGlmIChzZW5zb3J5UmVnZXggPT0gbnVsbCkge1xuICAgICAgICBsZXQgc2Vuc29yeVRleHQgPSB2YWxpZGF0ZVBhcmFtc1t0eXBlXS52YWx1ZTtcbiAgICAgICAgbGV0IHJlZ2V4U3RyID0gXCIoXFxzXFxzK3xcIiArIHNlbnNvcnlUZXh0WzBdO1xuICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHNlbnNvcnlUZXh0Lmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBsZXQgd29yZHMgPSBzZW5zb3J5VGV4dFtqXS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgcmVnZXhTdHIgKz0gXCJ8XCIgKyB3b3Jkc1swXTtcbiAgICAgICAgICAgIGlmICh3b3Jkcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDE7IGMgPCB3b3Jkcy5sZW5ndGg7ICsrYylcbiAgICAgICAgICAgICAgICAgICAgcmVnZXhTdHIgKz0gXCIgK1wiICsgd29yZHNbY107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZWdleFN0ciArPSBcIilcXFxcV1wiO1xuICAgICAgICByZWdleFN0ciArPSBcIilcIjtcbiAgICAgICAgc2Vuc29yeVJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFN0ciwgXCJnaVwiKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgdHlwZSArXCJfc2Vuc29yeV9taXN1c2VcIiwgc2Vuc29yeVJlZ2V4KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbnNvcnlSZWdleDtcbn1cblxuZnVuY3Rpb24gZ2V0VmlvbGF0ZWRUZXh0KGRvYywgdHlwZSwgdHh0VmFsKSB7XG4gICAgaWYgKCF0eHRWYWwpIHJldHVybiBcIlwiO1xuICAgIGxldCBzZW5zb3J5VGV4dEFyciA9IHZhbGlkYXRlUGFyYW1zW3R5cGVdLnZhbHVlXG4gICAgbGV0IGhhc2ggPSB7fSwgcmVzdWx0ID0gW107XG4gICAgXG4gICAgLy8gc3BsaXQgdGhlIHN0cmluZyBpbnRvIHdvcmRzXG4gICAgbGV0IGNvdW50cyA9IHR4dFZhbC5zcGxpdCgvXFxzKy8pLnJlZHVjZShmdW5jdGlvbiAobWFwLCB3b3JkKSB7XG4gICAgICAgIGxldCB3b3JkV29UcmFpbGluZ1B1bmMgPSB3b3JkLnJlcGxhY2UoL1suPyE6OygpJ1wiLGBcXF1dKyQvLCBcIlwiKTtcbiAgICAgICAgbGV0IGxjV29yZFdvUHVuYyA9IHdvcmQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLj8hOjsoKSdcIixgXFxdXS9nLCBcIlwiKTtcblxuICAgICAgICBmb3IgKGxldCBjb3VudGVyID0gMDsgY291bnRlciA8IHNlbnNvcnlUZXh0QXJyLmxlbmd0aDsgY291bnRlcisrKSB7XG4gICAgICAgICAgICBsZXQgYSA9IGxjV29yZFdvUHVuYy5pbmRleE9mKHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHNlbnNvcnlXb3JkTGVuID0gc2Vuc29yeVRleHRBcnJbY291bnRlcl0ubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9IGxjV29yZFdvUHVuYy5jaGFyQXQoc2Vuc29yeVdvcmRMZW4gKyBhKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHdvcmQgZG9lcyBub3QgY29udGFpbnMgc3Vic3RyaW5nIG9mIHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdXG4gICAgICAgICAgICAvLyBwcm9jZWVkIHRvIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIGZvciBuZXh0IHNlbnNvcnlUZXh0LlxuICAgICAgICAgICAgaWYgKGEgPCAwKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgICAgIC8vY2hlY2sgdGhlIGZvbGxvd2luZyBhbmQgcHJvY2VlZGluZyBwdW5jdHVhdGlvbnNcbiAgICAgICAgICAgIC8vbGV0IGlzUHVuY2ZvbGxvd2luZyA9ICgoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXC0nKSB8fFxuICAgICAgICAgICAgbGV0IGlzUHVuY2ZvbGxvd2luZyA9IChcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXC4nKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcPycpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcIScpIHx8XG4gICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw7JykgfHxcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCknKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcJycpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXCInKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJy5cXGAnKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXF0nKSk7XG5cbiAgICAgICAgICAgIGxldCBpc1B1bmNQcmVjZWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChhID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID0gbGNXb3JkV29QdW5jLmNoYXJBdChhIC0gMSk7XG4gICAgICAgICAgICAgICAgaXNQdW5jUHJlY2VkaW5nID0gKChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXC0nKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwuJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcPycpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCEnKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcOycpIHx8XG4gICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwpJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcJycpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXFwiJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICcuXFxgJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFxdJykpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoKGxjV29yZFdvUHVuYy5sZW5ndGggPT0gc2Vuc29yeVdvcmRMZW4pIHx8IChpc1B1bmNmb2xsb3dpbmcgPT0gdHJ1ZSkgfHwgKGlzUHVuY1ByZWNlZGluZyA9PSB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc2guaGFzT3duUHJvcGVydHkod29yZFdvVHJhaWxpbmdQdW5jKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNoW3dvcmRXb1RyYWlsaW5nUHVuY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh3b3JkV29UcmFpbGluZ1B1bmMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyID0gc2Vuc29yeVRleHRBcnIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdID0gKG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdIHx8IDApICsgMTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCIsIFwiKTtcbn0gIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsLCBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5cbi8vIE1vZHVsZS1sZXZlbCBjb25zdGFudHNcbmNvbnN0IFNUWUxFX1ZBTFVFX1JFR0VYID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbmNvbnN0IE1JTl9XT1JEX1NQQUNJTkdfUkFUSU8gPSAwLjE2O1xuY29uc3QgTUlOX0xFVFRFUl9TUEFDSU5HX1JBVElPID0gMC4xMjtcbmNvbnN0IE1JTl9MSU5FX0hFSUdIVF9SQVRJTyA9IDEuNTtcbmNvbnN0IElNUE9SVEFOVF9TVUZGSVggPSBcIiFpbXBvcnRhbnRcIjtcbmNvbnN0IElNUE9SVEFOVF9TVUZGSVhfTEVOR1RIID0gSU1QT1JUQU5UX1NVRkZJWC5sZW5ndGggKyAxOyAvLyArMSBmb3IgdGhlIHNwYWNlIGJlZm9yZSAhaW1wb3J0YW50XG5cbi8qKlxuICogUmVzb2x2ZXMgaW5oZXJpdGVkIG9yIHVuc2V0IHN0eWxlIHZhbHVlcyBieSB0cmF2ZXJzaW5nIHVwIHRoZSBET00gdHJlZVxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byByZXNvbHZlIHRoZSBzdHlsZSBmb3JcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBDU1MgcHJvcGVydHkgbmFtZVxuICogQHBhcmFtIGN1cnJlbnRWYWx1ZSAtIFRoZSBjdXJyZW50IHN0eWxlIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgc3R5bGUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUluaGVyaXRlZFN0eWxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwcm9wZXJ0eTogc3RyaW5nLCBjdXJyZW50VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCdpbmhlcml0JykgfHwgY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3IgPSBDU1NVdGlsLmdldEFuY2VzdG9yV2l0aFN0eWxlcyhcbiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudCxcbiAgICAgICAgICAgIHtbcHJvcGVydHldOiBbXCIqXCJdfSxcbiAgICAgICAgICAgIFsnaW5oZXJpdCcsICd1bnNldCddXG4gICAgICAgICk7XG4gICAgICAgIGlmIChhbmNlc3RvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhhbmNlc3RvciwgW3Byb3BlcnR5XSlbcHJvcGVydHldO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCd1bnNldCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJpbml0aWFsXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSAhaW1wb3J0YW50IHN1ZmZpeCBmcm9tIGEgc3R5bGUgdmFsdWVcbiAqIEBwYXJhbSBzdHlsZVZhbHVlIC0gVGhlIHN0eWxlIHZhbHVlIHBvdGVudGlhbGx5IGNvbnRhaW5pbmcgIWltcG9ydGFudFxuICogQHJldHVybnMgVGhlIHN0eWxlIHZhbHVlIHdpdGhvdXQgIWltcG9ydGFudFxuICovXG5mdW5jdGlvbiByZW1vdmVJbXBvcnRhbnRTdWZmaXgoc3R5bGVWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3R5bGVWYWx1ZS5zdWJzdHJpbmcoMCwgc3R5bGVWYWx1ZS5sZW5ndGggLSBJTVBPUlRBTlRfU1VGRklYX0xFTkdUSCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3BhY2luZyBwcm9wZXJ0eSB2aW9sYXRlcyBhY2Nlc3NpYmlsaXR5IHJlcXVpcmVtZW50c1xuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgSFRNTCBlbGVtZW50IGJlaW5nIGNoZWNrZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBDU1MgcHJvcGVydHkgbmFtZSAod29yZC1zcGFjaW5nLCBsZXR0ZXItc3BhY2luZywgbGluZS1oZWlnaHQpXG4gKiBAcGFyYW0gc3R5bGVWYWx1ZSAtIFRoZSBjdXJyZW50IHN0eWxlIHZhbHVlXG4gKiBAcGFyYW0gZm9udFNpemUgLSBUaGUgY29tcHV0ZWQgZm9udCBzaXplIGluIHBpeGVsc1xuICogQHBhcmFtIG1pblJhdGlvIC0gVGhlIG1pbmltdW0gcmF0aW8gdGhyZXNob2xkXG4gKiBAcGFyYW0gYWxsb3dVbml0bGVzcyAtIFdoZXRoZXIgdW5pdGxlc3MgdmFsdWVzIGFyZSBhbGxvd2VkIChmb3IgbGluZS1oZWlnaHQpXG4gKiBAcmV0dXJucyBSdWxlUmVzdWx0IGluZGljYXRpbmcgcGFzcyBvciBmYWlsXG4gKi9cbmZ1bmN0aW9uIGNoZWNrU3BhY2luZ1Byb3BlcnR5KFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgc3R5bGVWYWx1ZTogc3RyaW5nLFxuICAgIGZvbnRTaXplOiBudW1iZXIsXG4gICAgbWluUmF0aW86IG51bWJlcixcbiAgICBhbGxvd1VuaXRsZXNzOiBib29sZWFuID0gZmFsc2Vcbik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmICFpbXBvcnRhbnQgaXMgdXNlZFxuICAgIGlmIChlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkocHJvcGVydHkpICE9PSAnaW1wb3J0YW50Jykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgIWltcG9ydGFudCBzdWZmaXhcbiAgICBjb25zdCBjbGVhblZhbHVlID0gcmVtb3ZlSW1wb3J0YW50U3VmZml4KHN0eWxlVmFsdWUpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGluaXRpYWwgb3Igbm9ybWFsIHZhbHVlcyAoY29tcHV0ZWQgc3BhY2UgaXMgMClcbiAgICBpZiAoY2xlYW5WYWx1ZSA9PT0gJ2luaXRpYWwnIHx8IGNsZWFuVmFsdWUgPT09ICdub3JtYWwnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB0aGUgbnVtZXJpYyB2YWx1ZVxuICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQoY2xlYW5WYWx1ZSk7XG4gICAgaWYgKGlzTmFOKG51bWVyaWNWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gTWF0Y2ggdmFsdWUgYW5kIHVuaXRcbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IGNsZWFuVmFsdWUudHJpbSgpLm1hdGNoKFNUWUxFX1ZBTFVFX1JFR0VYKTtcbiAgICBpZiAoIXBhcnNlZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHZhbHVlLCB1bml0XSA9IHBhcnNlZFZhbHVlO1xuXG4gICAgLy8gSGFuZGxlIHVuaXRsZXNzIHZhbHVlcyAob25seSBmb3IgbGluZS1oZWlnaHQpXG4gICAgaWYgKHVuaXQgPT09ICcnKSB7XG4gICAgICAgIGlmIChhbGxvd1VuaXRsZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSkgPCBtaW5SYXRpbyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3Igb3RoZXIgcHJvcGVydGllcywgemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgaXMgaWdub3JlZFxuICAgICAgICBpZiAocGFyc2VGbG9hdCh2YWx1ZSkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpZiBubyB1bml0IGFuZCBub24temVybyAoZXJyb3IgY2FzZSwgaW5hcHBsaWNhYmxlKVxuICAgIGlmICh1bml0ID09PSAnJyAmJiBwYXJzZUZsb2F0KHZhbHVlKSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHRvIHBpeGVscyBhbmQgY2hlY2sgcmF0aW9cbiAgICBjb25zdCBwaXhlbHMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHModW5pdCwgdmFsdWUsIGVsZW1lbnQpO1xuICAgIGlmIChwaXhlbHMgIT09IG51bGwgJiYgcGl4ZWxzIC8gZm9udFNpemUgPCBtaW5SYXRpbykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3NwYWNpbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9zcGFjaW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3dvcmRfc3BhY2luZ19zdHlsZVwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGluZV9oZWlnaHRfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiQ1NTICFpbXBvcnRhbnQgaXMgbm90IHVzZWQgaW4gaW5saW5lIHN0eWxlIHRvIGNvbnRyb2wgbGV0dGVyIG9yIHdvcmQgc3BhY2luZyBvciBsaW5lIGhlaWdodFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUgc3R5bGUgdG8gY29udHJvbCBsZXR0ZXIgb3Igd29yZCBzcGFjaW5nIG9yIGxpbmUgaGVpZ2h0XCIsXG4gICAgICAgICAgICBcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIjogXCJDU1MgIWltcG9ydGFudCBzaG91bGQgbm90IGJlIHVzZWQgaW4gaW5saW5lIOKAmGxldHRlci1zcGFjaW5n4oCZIHN0eWxlXCIsXG4gICAgICAgICAgICBcImZhaWxfd29yZF9zcGFjaW5nX3N0eWxlXCI6IFwiQ1NTICFpbXBvcnRhbnQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGlubGluZSDigJh3b3JkLXNwYWNpbmfigJkgc3R5bGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9saW5lX2hlaWdodF9zdHlsZVwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUg4oCYbGluZS1oZWlnaHTigJkgc3R5bGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgXCJudW1cIjogW1wiMS40LjEyXCJdLFxuICAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OlsnOWU0NWVjJywgJzI0YWZjMicsICc3OGZkMzInXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHRcbiAgICAgICAgbGV0IGNoaWxkU3RyID0gXCJcIjtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IHJ1bGVDb250ZXh0LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT09IDMpIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICAgICAgY2hpbGRTdHIgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgb2ZmIHNjcmVlblxuICAgICAgICBjb25zdCBtYXBwZXI6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWJvdW5kcyB8fCBib3VuZHNbJ3RvcCddIDwgMCB8fCBib3VuZHNbJ2xlZnQnXSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBub24tSFRNTCBlbGVtZW50cyAoZS5nLiwgU1ZHKVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJzdmdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9udCBzaXplIGFsd2F5cyByZXNvbHZlZCB0byAncHgnXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJykpO1xuXG4gICAgICAgIC8vIEVhcmx5IGV4aXQgb3B0aW1pemF0aW9uOiBDaGVjayBpZiBjb21wdXRlZCBzdHlsZXMgYWxyZWFkeSBwYXNzXG4gICAgICAgIC8vIElmIGFsbCB0aHJlZSBwcm9wZXJ0aWVzIGhhdmUgcGFzc2luZyB2YWx1ZXMsIHdlIGNhbiBza2lwIHRoZSBleHBlbnNpdmUgZ2V0RGVmaW5lZFN0eWxlcyBjYWxsXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkV29yZFNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3dvcmQtc3BhY2luZycpO1xuICAgICAgICBjb25zdCBjb21wdXRlZExldHRlclNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2xldHRlci1zcGFjaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkTGluZUhlaWdodCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnbGluZS1oZWlnaHQnKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBjb21wdXRlZCB2YWx1ZXMgcGFzcyB0aGUgcmVxdWlyZW1lbnRzXG4gICAgICAgIGxldCB3b3JkU3BhY2luZ1Bhc3NlcyA9IHRydWU7XG4gICAgICAgIGxldCBsZXR0ZXJTcGFjaW5nUGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGxpbmVIZWlnaHRQYXNzZXMgPSB0cnVlO1xuXG4gICAgICAgIC8vIENoZWNrIHdvcmQtc3BhY2luZyAoaWdub3JlIDBweCB3aGljaCByZXByZXNlbnRzIGRlZmF1bHQvbm9ybWFsKVxuICAgICAgICBpZiAoY29tcHV0ZWRXb3JkU3BhY2luZykge1xuICAgICAgICAgICAgY29uc3Qgd29yZFZhbHVlID0gcGFyc2VGbG9hdChjb21wdXRlZFdvcmRTcGFjaW5nKTtcbiAgICAgICAgICAgIGlmICghaXNOYU4od29yZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdvcmRQaXhlbHMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMoJ3B4Jywgd29yZFZhbHVlLnRvU3RyaW5nKCksIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAod29yZFBpeGVscyAhPT0gbnVsbCAmJiB3b3JkUGl4ZWxzIC8gZm9udFNpemUgPCBNSU5fV09SRF9TUEFDSU5HX1JBVElPKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRTcGFjaW5nUGFzc2VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGV0dGVyLXNwYWNpbmcgKGlnbm9yZSAwcHggd2hpY2ggcmVwcmVzZW50cyBkZWZhdWx0L25vcm1hbClcbiAgICAgICAgaWYgKGNvbXB1dGVkTGV0dGVyU3BhY2luZykge1xuICAgICAgICAgICAgY29uc3QgbGV0dGVyVmFsdWUgPSBwYXJzZUZsb2F0KGNvbXB1dGVkTGV0dGVyU3BhY2luZyk7XG4gICAgICAgICAgICBpZiAoIWlzTmFOKGxldHRlclZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxldHRlclBpeGVscyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscygncHgnLCBsZXR0ZXJWYWx1ZS50b1N0cmluZygpLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxldHRlclBpeGVscyAhPT0gbnVsbCAmJiBsZXR0ZXJQaXhlbHMgLyBmb250U2l6ZSA8IE1JTl9MRVRURVJfU1BBQ0lOR19SQVRJTykge1xuICAgICAgICAgICAgICAgICAgICBsZXR0ZXJTcGFjaW5nUGFzc2VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGluZS1oZWlnaHRcbiAgICAgICAgaWYgKGNvbXB1dGVkTGluZUhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgbGluZVZhbHVlID0gcGFyc2VGbG9hdChjb21wdXRlZExpbmVIZWlnaHQpO1xuICAgICAgICAgICAgaWYgKCFpc05hTihsaW5lVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gTGluZSBoZWlnaHQgY2FuIGJlIHVuaXRsZXNzIG9yIGluIHBpeGVsc1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY29tcHV0ZWRMaW5lSGVpZ2h0Lm1hdGNoKFNUWUxFX1ZBTFVFX1JFR0VYKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgWywgdmFsdWUsIHVuaXRdID0gbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bml0ID09PSAnJyB8fCB1bml0ID09PSAncHgnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXRpbyA9IHVuaXQgPT09ICcnID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiBwYXJzZUZsb2F0KHZhbHVlKSAvIGZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGlvIDwgTUlOX0xJTkVfSEVJR0hUX1JBVElPKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodFBhc3NlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgYWxsIGNvbXB1dGVkIHZhbHVlcyBwYXNzLCB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGdldERlZmluZWRTdHlsZXMgY2hlY2tcbiAgICAgICAgaWYgKHdvcmRTcGFjaW5nUGFzc2VzICYmIGxldHRlclNwYWNpbmdQYXNzZXMgJiYgbGluZUhlaWdodFBhc3Nlcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgZGVmaW5lZCBzdHlsZXMgdG8gY2hlY2sgZm9yICFpbXBvcnRhbnQgZGVjbGFyYXRpb25zXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgW1wid29yZC1zcGFjaW5nXCIsIFwibGV0dGVyLXNwYWNpbmdcIiwgXCJsaW5lLWhlaWdodFwiXSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzdHlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHRzOiBSdWxlUmVzdWx0W10gPSBbXTtcblxuICAgICAgICAvLyBDaGVjayB3b3JkLXNwYWNpbmdcbiAgICAgICAgbGV0IHdvcmRTdHlsZSA9IHN0eWxlc1snd29yZC1zcGFjaW5nJ107XG4gICAgICAgIGlmICh3b3JkU3R5bGUpIHtcbiAgICAgICAgICAgIHdvcmRTdHlsZSA9IHJlc29sdmVJbmhlcml0ZWRTdHlsZShydWxlQ29udGV4dCwgJ3dvcmQtc3BhY2luZycsIHdvcmRTdHlsZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGVja1NwYWNpbmdQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICAnd29yZC1zcGFjaW5nJyxcbiAgICAgICAgICAgICAgICB3b3JkU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX1dPUkRfU1BBQ0lOR19SQVRJT1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlRmFpbCgnZmFpbF93b3JkX3NwYWNpbmdfc3R5bGUnKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBsZXR0ZXItc3BhY2luZ1xuICAgICAgICBsZXQgbGV0dGVyU3R5bGUgPSBzdHlsZXNbJ2xldHRlci1zcGFjaW5nJ107XG4gICAgICAgIGlmIChsZXR0ZXJTdHlsZSkge1xuICAgICAgICAgICAgbGV0dGVyU3R5bGUgPSByZXNvbHZlSW5oZXJpdGVkU3R5bGUocnVsZUNvbnRleHQsICdsZXR0ZXItc3BhY2luZycsIGxldHRlclN0eWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrU3BhY2luZ1Byb3BlcnR5KFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LFxuICAgICAgICAgICAgICAgICdsZXR0ZXItc3BhY2luZycsXG4gICAgICAgICAgICAgICAgbGV0dGVyU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX0xFVFRFUl9TUEFDSU5HX1JBVElPXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVGYWlsKCdmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGluZS1oZWlnaHQgKG9ubHkgaWYgbm8gc2Nyb2xsYWJsZSBhbmNlc3RvcilcbiAgICAgICAgbGV0IGxpbmVTdHlsZSA9IHN0eWxlc1snbGluZS1oZWlnaHQnXTtcbiAgICAgICAgY29uc3Qgb3ZlcmZsb3dTdHlsZXMgPSB7XG4gICAgICAgICAgICBcIm92ZXJmbG93XCI6IFsnYXV0bycsICdzY3JvbGwnXSxcbiAgICAgICAgICAgIFwib3ZlcmZsb3cteFwiOiBbJ2F1dG8nLCAnc2Nyb2xsJ10sXG4gICAgICAgICAgICBcIm92ZXJmbG93LXlcIjogWydhdXRvJywgJ3Njcm9sbCddXG4gICAgICAgIH07XG4gICAgICAgIGlmIChsaW5lU3R5bGUgJiYgQ1NTVXRpbC5nZXRBbmNlc3RvcldpdGhTdHlsZXMocnVsZUNvbnRleHQsIG92ZXJmbG93U3R5bGVzKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGluZVN0eWxlID0gcmVzb2x2ZUluaGVyaXRlZFN0eWxlKHJ1bGVDb250ZXh0LCAnbGluZS1oZWlnaHQnLCBsaW5lU3R5bGUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hlY2tTcGFjaW5nUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgJ2xpbmUtaGVpZ2h0JyxcbiAgICAgICAgICAgICAgICBsaW5lU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX0xJTkVfSEVJR0hUX1JBVElPLFxuICAgICAgICAgICAgICAgIHRydWUgLy8gQWxsb3cgdW5pdGxlc3MgdmFsdWVzIGZvciBsaW5lLWhlaWdodFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlRmFpbCgnZmFpbF9saW5lX2hlaWdodF9zdHlsZScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA+IDAgPyByZXN1bHRzIDogbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfd2hpdGVzcGFjZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInRleHRfd2hpdGVzcGFjZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0XCI6IFwidGV4dF93aGl0ZXNwYWNlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3RleHRcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjcmVhdGUgc3BhY2UgYmV0d2VlbiB0aGUgbGV0dGVycyBvZiBhIHdvcmRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjb250cm9sIHNwYWNpbmcgd2l0aGluIGEgd29yZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0XG4gICAgICAgIGxldCBjaGVja0FuY2VzdG9yID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiLCBcInNjcmlwdFwiLCBcImNvZGVcIl0pO1xuICAgICAgICBpZiAoY2hlY2tBbmNlc3RvciA9PSBudWxsIHx8IGNoZWNrQW5jZXN0b3Iubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcImJvZHlcIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICEoLyhefFxccylbYS16QS1aXSBbYS16QS1aXSBbYS16QS1aXSgkfFxccykvLnRlc3QodHh0VmFsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdGV4dFwiKTtcblxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgd2lkZ2V0X3RhYmJhYmxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmxpbmssYXJpYTpzcGluYnV0dG9uLGFyaWE6dGFibGlzdCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnUsYXJpYTpyYWRpb2dyb3VwLGFyaWE6dHJlZSxhcmlhOm1lbnViYXIsIGFyaWE6Z3JpZCwgYXJpYTp0cmVlZ3JpZCwgYXJpYTpjaGVja2JveCxhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b24sYXJpYTp0ZXh0Ym94LGFyaWE6c2Nyb2xsYmFyLGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSUJNQV9Gb2N1c19UYWJiYWJsZVwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJmYWlsX25vX3RhYmJhYmxlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJDb21wb25lbnQgd2l0aCBcXFwiezB9XFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSB0YWJiYWJsZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tcG9uZW50IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdGFiYmFibGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGEgcHJlc2VudGF0aW9uYWwgY2hpbGQgb2YgYW4gZWxlbWVudFxuICAgICAgICBpZiAoQXJpYVV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAvLyBDb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0IHJvbGVzLiBUaGV5IGFjdCBhcyBjb250YWluZXJzIHRoYXQgbWFuYWdlIG90aGVyLCBjb250YWluZWQgd2lkZ2V0cy5cbiAgICAgICAgbGV0IHJvbGVDb250YWluZXJzID0gW1wiY29tYm9ib3hcIiwgXCJncmlkXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0cmVlXCIsIFwidHJlZWdyaWRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlQ29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHJvbGUsIHRydWUpICE9IG51bGwpIFxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBkZXNjZW5kYW50IG9mIGEgY29tcG9zaXRlIHdpZGdldCBhbHJlYWR5IGV4YW1pbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm9kZSBoYXMgY2hpbGRyZW4sIGxvb2sgZm9yIHRhYiBzdG9wcyBpbiB0aGUgY2hpbGRyZW5cbiAgICAgICAgLy8gc2tpcCB0aGUgY291bnQgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoY291bnQgPCAxICYmICFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDEgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50ID49IDE7XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlUG90ZW50aWFsKFwiZmFpbF9ub190YWJiYWJsZVwiLCBbcm9sZV0pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHdpZGdldF90YWJiYWJsZV9zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpsaW5rLGFyaWE6bWVudWl0ZW0sYXJpYTpzcGluYnV0dG9uLGFyaWE6dGFibGlzdCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnUsYXJpYTpyYWRpb2dyb3VwLGFyaWE6dHJlZSxhcmlhOmNoZWNrYm94LGFyaWE6b3B0aW9uLGFyaWE6cmFkaW8sYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6dGV4dGJveCxhcmlhOmNvbHVtbmhlYWRlcixhcmlhOnJvd2hlYWRlcixhcmlhOnNsaWRlcixhcmlhOnRhYlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSUJNQV9Gb2N1c19NdWx0aVRhYlwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiOiBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ3aWRnZXRfdGFiYmFibGVfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJDb21wb25lbnRzIHdpdGggYSB3aWRnZXQgcm9sZSBzaG91bGQgaGF2ZSBubyBtb3JlIHRoYW4gb25lIHRhYmJhYmxlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwiQ29tcG9uZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBoYXMgbW9yZSB0aGFuIG9uZSB0YWJiYWJsZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tcG9uZW50cyB3aXRoIGEgd2lkZ2V0IHJvbGUgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiBvbmUgdGFiYmFibGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIiwgXCIyLjQuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKEFyaWFVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICArK2NvdW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIC8vc2tpcCB0aGUgY291bnQgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBsZXQgbmFtZSA9IFtdO1xuICAgICAgICBpZiAoY291bnQgPCAyICYmICFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDIgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmFkaW8gaW5wdXRzIHdpdGggdGhlIHNhbWUgbmFtZSBuYXRpdmVseSBhcmUgb25seSBvbmUgdGFiIHN0b3BcbiAgICAgICAgICAgICAgICAgICAgLyoqaWYgKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAobncubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSAncmFkaW8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VyTmFtZSA9IChudy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5pbmNsdWRlcyhjdXJOYW1lKSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5wdXNoKGN1ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9Ki9cbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50IDwgMjtcbiAgICAgICAgaWYgKCFwYXNzZWQpXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLCBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiKTtcbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbXVsdGlwbGVfdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIFRoaXMgZmlsZSBjb21lcyBmcm9tIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hY3QtcnVsZXMvYWN0LXRvb2xzL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG5pbXBvcnQgKiBhcyBTQ1VSTHMgZnJvbSBcIi4vc2MtdXJscy5qc29uXCJcbmltcG9ydCB7IEd1aWRlbGluZSwgZUd1aWRlbGluZUNhdGVnb3J5LCBlR3VpZGVsaW5lVHlwZSB9IGZyb20gXCIuL2FwaS9JR3VpZGVsaW5lXCI7XG5jb25zdCBTQ3MgPSBbXTtcbmZvciAoY29uc3Qga2V5IGluIFNDVVJMcykge1xuICAgIFNDcy5wdXNoKFNDVVJMc1trZXldKTtcbn1cblxuY29uc3Qgc3VtbWFyaWVzID0ge1xuICAgIFwiMS4xLjFcIjogXCJBbGwgbm9uLXRleHQgY29udGVudCB0aGF0IGlzIHByZXNlbnRlZCB0byB0aGUgdXNlciBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgc2VydmVzIHRoZSBlcXVpdmFsZW50IHB1cnBvc2UuXCIsXG4gICAgXCIxLjIuMVwiOiBcIkZvciBwcmVyZWNvcmRlZCBhdWRpby1vbmx5IG9yIHZpZGVvLW9ubHkgbWVkaWEsIGFuIGFsdGVybmF0aXZlIHByb3ZpZGVzIGVxdWl2YWxlbnQgaW5mb3JtYXRpb24uXCIsXG4gICAgXCIxLjIuMlwiOiBcIkNhcHRpb25zIGFyZSBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjNcIjogXCJBbiBhbHRlcm5hdGl2ZSBmb3IgdGltZS1iYXNlZCBtZWRpYSBvciBhdWRpbyBkZXNjcmlwdGlvbiBvZiB0aGUgcHJlcmVjb3JkZWQgdmlkZW8gY29udGVudCBpcyBwcm92aWRlZCBmb3Igc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjRcIjogXCJDYXB0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBsaXZlIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjVcIjogXCJBdWRpbyBkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIHZpZGVvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4zLjFcIjogXCJJbmZvcm1hdGlvbiwgc3RydWN0dXJlLCBhbmQgcmVsYXRpb25zaGlwcyBjb252ZXllZCB0aHJvdWdoIHByZXNlbnRhdGlvbiBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIG9yIGFyZSBhdmFpbGFibGUgaW4gdGV4dC5cIixcbiAgICBcIjEuMy4yXCI6IFwiV2hlbiB0aGUgc2VxdWVuY2UgaW4gd2hpY2ggY29udGVudCBpcyBwcmVzZW50ZWQgYWZmZWN0cyBpdHMgbWVhbmluZywgYSBjb3JyZWN0IHJlYWRpbmcgc2VxdWVuY2UgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZC5cIixcbiAgICBcIjEuMy4zXCI6IFwiSW5zdHJ1Y3Rpb25zIHByb3ZpZGVkIGZvciB1bmRlcnN0YW5kaW5nIGFuZCBvcGVyYXRpbmcgY29udGVudCBkbyBub3QgcmVseSBzb2xlbHkgb24gc2Vuc29yeSBjaGFyYWN0ZXJpc3RpY3Mgb2YgY29tcG9uZW50cyBzdWNoIGFzIHNoYXBlLCBzaXplLCB2aXN1YWwgbG9jYXRpb24sIG9yaWVudGF0aW9uLCBvciBzb3VuZC5cIixcbiAgICBcIjEuMy40XCI6IFwiQ29udGVudCBkb2VzIG5vdCByZXN0cmljdCBpdHMgdmlldyBhbmQgb3BlcmF0aW9uIHRvIGEgc2luZ2xlIGRpc3BsYXkgb3JpZW50YXRpb24sIHN1Y2ggYXMgcG9ydHJhaXQgb3IgbGFuZHNjYXBlLlwiLFxuICAgIFwiMS4zLjVcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGlucHV0IGZpZWxkIHRoYXQgY29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZCB3aGVuIHRoZSBmaWVsZCBzZXJ2ZXMgYSBjb21tb24gcHVycG9zZS5cIixcbiAgICBcIjEuNC4xXCI6IFwiQ29sb3IgaXMgbm90IHVzZWQgYXMgdGhlIG9ubHkgdmlzdWFsIG1lYW5zIG9mIGNvbnZleWluZyBpbmZvcm1hdGlvbiwgaW5kaWNhdGluZyBhbiBhY3Rpb24sIHByb21wdGluZyBhIHJlc3BvbnNlLCBvciBkaXN0aW5ndWlzaGluZyBhIHZpc3VhbCBlbGVtZW50LlwiLFxuICAgIFwiMS40LjJcIjogXCJJZiBhbnkgYXVkaW8gcGxheXMgYXV0b21hdGljYWxseSBmb3IgbW9yZSB0aGFuIDMgc2Vjb25kcywgZWl0aGVyIGEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBwYXVzZSBvciBzdG9wIHRoZSBhdWRpbywgb3IgYSBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIHRvIGNvbnRyb2wgYXVkaW8gdm9sdW1lIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgb3ZlcmFsbCBzeXN0ZW0gdm9sdW1lIGxldmVsLlwiLFxuICAgIFwiMS40LjNcIjogXCJUaGUgdmlzdWFsIHByZXNlbnRhdGlvbiBvZiB0ZXh0IGFuZCBpbWFnZXMgb2YgdGV4dCBoYXMgYSBjb250cmFzdCByYXRpbyBvZiBhdCBsZWFzdCA0LjU6MSwgd2l0aCBhIDM6MSByYXRpbyBmb3IgbGFyZ2Utc2NhbGUgdGV4dC5cIixcbiAgICBcIjEuNC40XCI6IFwiVGV4dCBjYW4gYmUgcmVzaXplZCB3aXRob3V0IGFzc2lzdGl2ZSB0ZWNobm9sb2d5IHVwIHRvIDIwMCBwZXJjZW50IHdpdGhvdXQgbG9zcyBvZiBjb250ZW50IG9yIGZ1bmN0aW9uYWxpdHkuXCIsXG4gICAgXCIxLjQuNVwiOiBcIklmIHRoZSB0ZWNobm9sb2dpZXMgYmVpbmcgdXNlZCBjYW4gYWNoaWV2ZSB0aGUgdmlzdWFsIHByZXNlbnRhdGlvbiwgdGV4dCBzaG91bGQgbm90IGJlIHVzZWQgdG8gY29udmV5IGluZm9ybWF0aW9uIHJhdGhlciB0aGFuIGltYWdlcyBvZiB0ZXh0LlwiLFxuICAgIFwiMS40LjEwXCI6IFwiQ29udGVudCBjYW4gcmVmbG93IHdpdGhvdXQgbG9zcyBvZiBpbmZvcm1hdGlvbiBvciBmdW5jdGlvbmFsaXR5LCBhbmQgd2l0aG91dCByZXF1aXJpbmcgc2Nyb2xsaW5nIGluIHR3byBkaW1lbnNpb25zLlwiLFxuICAgIFwiMS40LjExXCI6IFwiVGhlIHBhcnRzIG9mIGdyYXBoaWNhbCBvYmplY3RzIHJlcXVpcmVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRlbnQsIGFuZCB0aGUgdmlzdWFsIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGlkZW50aWZ5IFVJIGNvbXBvbmVudHMgYW5kIHN0YXRlcywgaGF2ZSBhIGNvbnRyYXN0IHJhdGlvIG9mIGF0IGxlYXN0IDM6MSBhZ2FpbnN0IGFkamFjZW50IGNvbG9ycy5cIixcbiAgICBcIjEuNC4xMlwiOiBcIk5vIGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5IG9jY3VycyB3aGVuIHVzZXJzIGNoYW5nZSBsZXR0ZXIsIHdvcmQgYW5kIHBhcmFncmFwaCBzcGFjaW5nLCBhcyB3ZWxsIGFzIGxpbmUgaGVpZ2h0LlwiLFxuICAgIFwiMS40LjEzXCI6IFwiV2hlcmUgaG92ZXIgb3IgZm9jdXMgYWN0aW9ucyBjYXVzZSBhZGRpdGlvbmFsIGNvbnRlbnQgdG8gYmVjb21lIHZpc2libGUgYW5kIGhpZGRlbiwgdGhlIGFkZGl0aW9uYWwgY29udGVudCBpcyBkaXNtaXNzYWJsZSwgaG92ZXJhYmxlIGFuZCBwZXJzaXN0ZW50LlwiLFxuICAgIFwiMi4xLjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgY29udGVudCBpcyBvcGVyYWJsZSB0aHJvdWdoIGEga2V5Ym9hcmQgaW50ZXJmYWNlIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpZmljIHRpbWluZ3MgZm9yIGluZGl2aWR1YWwga2V5c3Ryb2tlcy5cIixcbiAgICBcIjIuMS4yXCI6IFwiSWYga2V5Ym9hcmQgZm9jdXMgY2FuIGJlIG1vdmVkIHRvIGEgY29tcG9uZW50IHVzaW5nIGEga2V5Ym9hcmQgaW50ZXJmYWNlLCB0aGVuIGZvY3VzIGNhbiBiZSBtb3ZlZCBhd2F5IGZyb20gdGhhdCBjb21wb25lbnQgdXNpbmcgb25seSBhIGtleWJvYXJkIGludGVyZmFjZSwgYW5kLCBpZiBpdCByZXF1aXJlcyBtb3JlIHRoYW4gdW5tb2RpZmllZCBhcnJvdyBvciB0YWIga2V5cyBvciBvdGhlciBzdGFuZGFyZCBleGl0IG1ldGhvZHMsIHRoZSB1c2VyIGlzIGFkdmlzZWQgb2YgdGhlIG1ldGhvZCBmb3IgbW92aW5nIGZvY3VzIGF3YXkuXCIsXG4gICAgXCIyLjEuNFwiOiBcIklmIGEga2V5Ym9hcmQgc2hvcnRjdXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgb25seSBsZXR0ZXIsIHB1bmN0dWF0aW9uLCBudW1iZXIgb3Igc3ltYm9sIGNoYXJhY3RlcnMsIHRoZW4gdGhlIHNob3J0Y3V0IGNhbiBiZSB0dXJuZWQgb2ZmLCByZW1hcHBlZCBvciBhY3RpdmF0ZWQgb25seSBvbiBmb2N1cy5cIixcbiAgICBcIjIuMi4xXCI6IFwiRm9yIGVhY2ggdGltZSBsaW1pdCB0aGF0IGlzIHNldCBieSB0aGUgY29udGVudCwgdGhlIHVzZXIgY2FuIHR1cm4gb2ZmLCBhZGp1c3QsIG9yIGV4dGVuZCB0aGUgbGltaXQuXCIsXG4gICAgXCIyLjIuMlwiOiBcIkZvciBtb3ZpbmcsIGJsaW5raW5nLCBzY3JvbGxpbmcsIG9yIGF1dG8tdXBkYXRpbmcgaW5mb3JtYXRpb24sIHRoZSB1c2VyIGNhbiBwYXVzZSwgc3RvcCwgaGlkZSBvciBhZGp1c3QgdGhlIGluZm9ybWF0aW9uLlwiLFxuICAgIFwiMi4zLjFcIjogXCJDb250ZW50IGRvZXMgbm90IGNvbnRhaW4gYW55dGhpbmcgdGhhdCBmbGFzaGVzIG1vcmUgdGhhbiB0aHJlZSB0aW1lcyBpbiBhbnkgb25lIHNlY29uZCBwZXJpb2QsIG9yIHRoZSBmbGFzaCBpcyBiZWxvdyB0aGUgZ2VuZXJhbCBmbGFzaCBhbmQgcmVkIGZsYXNoIHRocmVzaG9sZHMuXCIsXG4gICAgXCIyLjQuMVwiOiBcIkEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzLlwiLFxuICAgIFwiMi40LjJcIjogXCJXZWIgcGFnZXMsIG5vbi13ZWIgZG9jdW1lbnRzLCBhbmQgc29mdHdhcmUgaGF2ZSB0aXRsZXMgdGhhdCBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjNcIjogXCJJZiBjb250ZW50IGNhbiBiZSBuYXZpZ2F0ZWQgc2VxdWVudGlhbGx5IGFuZCB0aGUgbmF2aWdhdGlvbiBzZXF1ZW5jZXMgYWZmZWN0IG1lYW5pbmcgb3Igb3BlcmF0aW9uLCBmb2N1c2FibGUgY29tcG9uZW50cyByZWNlaXZlIGZvY3VzIGluIGFuIG9yZGVyIHRoYXQgcHJlc2VydmVzIG1lYW5pbmcgYW5kIG9wZXJhYmlsaXR5LlwiLFxuICAgIFwiMi40LjRcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGxpbmsgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgbGluayB0ZXh0IGFsb25lIG9yIGZyb20gdGhlIGxpbmsgdGV4dCB0b2dldGhlciB3aXRoIGl0cyBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgbGluayBjb250ZW50LlwiLFxuICAgIFwiMi40LjVcIjogXCJNb3JlIHRoYW4gb25lIHdheSBpcyBhdmFpbGFibGUgdG8gbG9jYXRlIGEgV2ViIHBhZ2Ugd2l0aGluIGEgc2V0IG9mIFdlYiBwYWdlcywgZXhjZXB0IHdoZXJlIHRoZSBXZWIgUGFnZSBpcyB0aGUgcmVzdWx0IG9mLCBvciBhIHN0ZXAgaW4sIGEgcHJvY2Vzcy5cIixcbiAgICBcIjIuNC42XCI6IFwiSGVhZGluZ3MgYW5kIGxhYmVscyBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjdcIjogXCJBbnkga2V5Ym9hcmQgb3BlcmFibGUgdXNlciBpbnRlcmZhY2UgaGFzIGEgbW9kZSBvZiBvcGVyYXRpb24gd2hlcmUgdGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBpcyB2aXNpYmxlLlwiLFxuICAgIFwiMi40LjExXCI6IFwiV2hlbiBhbiBlbGVtZW50IHJlY2VpdmVzIGZvY3VzLCBpdCBpcyBub3QgZW50aXJlbHkgY292ZXJlZCBieSBvdGhlciBjb250ZW50LlwiLFxuICAgIFwiMi41LjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSB0aGF0IHVzZXMgbXVsdGlwb2ludCBvciBwYXRoLWJhc2VkIGdlc3R1cmVzIGZvciBvcGVyYXRpb24gY2FuIGJlIG9wZXJhdGVkIHdpdGggYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGEgcGF0aC1iYXNlZCBnZXN0dXJlLlwiLFxuICAgIFwiMi41LjJcIjogXCJGb3IgZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBvcGVyYXRlZCB1c2luZyBhIHNpbmdsZSBwb2ludGVyLCBjb21wbGV0aW9uIG9mIHRoZSBmdW5jdGlvbiBpcyBvbiB0aGUgdXAtZXZlbnQgd2l0aCBhbiBhYmlsaXR5IHRvIGFib3J0LCB1bmRvIG9yIHJldmVyc2UgdGhlIG91dGNvbWUuXCIsXG4gICAgXCIyLjUuM1wiOiBcIkZvciB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzIHdpdGggbGFiZWxzIHRoYXQgaW5jbHVkZSB0ZXh0IG9yIGltYWdlcyBvZiB0ZXh0LCB0aGUgYWNjZXNzaWJsZSBuYW1lIGNvbnRhaW5zIHRoZSB0ZXh0IHRoYXQgaXMgcHJlc2VudGVkIHZpc3VhbGx5LlwiLFxuICAgIFwiMi41LjRcIjogXCJGdW5jdGlvbmFsaXR5IHRoYXQgY2FuIGJlIG9wZXJhdGVkIGJ5IG1vdGlvbiBjYW4gYWxzbyBiZSBvcGVyYXRlZCBieSB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzLCBhbmQgdGhlIG1vdGlvbiB0cmlnZ2VyIGNhbiBiZSBkaXNhYmxlZC5cIixcbiAgICBcIjIuNS44XCI6IFwiVGhlIHNpemUgb2YgdGhlIHRhcmdldCBmb3IgcG9pbnRlciBpbnB1dHMgaXMgYXQgbGVhc3QgMjQgYnkgMjQgQ1NTIHBpeGVscy5cIixcbiAgICBcIjIuNS43XCI6IFwiQWxsIGZ1bmN0aW9uYWxpdHkgdGhhdCB1c2VzIGEgZHJhZ2dpbmcgbW92ZW1lbnQgZm9yIG9wZXJhdGlvbiBjYW4gYmUgYWNoaWV2ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGRyYWdnaW5nLlwiLFxuICAgIFwiMy4xLjFcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiBXZWIgcGFnZXMsIG5vbi1XZWIgZG9jdW1lbnRzLCBvciBzb2Z0d2FyZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4xLjJcIjogXCJUaGUgaHVtYW4gbGFuZ3VhZ2Ugb2YgZWFjaCBwYXNzYWdlIG9yIHBocmFzZSBpbiB0aGUgY29udGVudCBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4yLjFcIjogXCJXaGVuIGFueSBjb21wb25lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGRvZXMgbm90IGluaXRpYXRlIGEgY2hhbmdlIG9mIGNvbnRleHQuXCIsXG4gICAgXCIzLjIuMlwiOiBcIkNoYW5naW5nIHRoZSBzZXR0aW5nIG9mIGFueSB1c2VyIGludGVyZmFjZSBjb21wb25lbnQgZG9lcyBub3QgYXV0b21hdGljYWxseSBjYXVzZSBhIGNoYW5nZSBvZiBjb250ZXh0IHVubGVzcyB0aGUgdXNlciBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBiZWhhdmlvciBiZWZvcmUgdXNpbmcgdGhlIGNvbXBvbmVudC5cIixcbiAgICBcIjMuMi4zXCI6IFwiTmF2aWdhdGlvbmFsIG1lY2hhbmlzbXMgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzIHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgb2NjdXIgaW4gdGhlIHNhbWUgcmVsYXRpdmUgb3JkZXIgZWFjaCB0aW1lIHRoZXkgYXJlIHJlcGVhdGVkLCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4yLjRcIjogXCJDb21wb25lbnRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgYXJlIGlkZW50aWZpZWQgY29uc2lzdGVudGx5LlwiLFxuICAgIFwiMy4yLjZcIjogXCJNYWtlIGl0IGVhc2llciB0byBmaW5kIGhlbHAgYW5kIHN1cHBvcnQuIElmIGEgV2ViIHBhZ2UgY29udGFpbnMgaGVscCBtZWNoYW5pc21zIHRoZXkgb2NjdXIgaW4gdGhlIHNhbWUgb3JkZXIgcmVsYXRpdmUgdG8gb3RoZXIgcGFnZSBjb250ZW50LCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4zLjFcIjogXCJJZiBhbiBpbnB1dCBlcnJvciBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLCB0aGUgaXRlbSB0aGF0IGlzIGluIGVycm9yIGlzIGlkZW50aWZpZWQgYW5kIHRoZSBlcnJvciBpcyBkZXNjcmliZWQgdG8gdGhlIHVzZXIgaW4gdGV4dC5cIixcbiAgICBcIjMuMy4yXCI6IFwiTGFiZWxzIG9yIGluc3RydWN0aW9ucyBhcmUgcHJvdmlkZWQgd2hlbiBjb250ZW50IHJlcXVpcmVzIHVzZXIgaW5wdXQuXCIsXG4gICAgXCIzLjMuM1wiOiBcIklmIGFuIGlucHV0IGVycm9yIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYW5kIHN1Z2dlc3Rpb25zIGZvciBjb3JyZWN0aW9uIGFyZSBrbm93biwgdGhlbiB0aGUgc3VnZ2VzdGlvbnMgYXJlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLCB1bmxlc3MgaXQgd291bGQgamVvcGFyZGl6ZSB0aGUgc2VjdXJpdHkgb3IgcHVycG9zZSBvZiB0aGUgY29udGVudC5cIixcbiAgICBcIjMuMy40XCI6IFwiRm9yIGNvbnRlbnQgdGhhdCBjYXVzZSBsZWdhbCBjb21taXRtZW50cyBvciBmaW5hbmNpYWwgdHJhbnNhY3Rpb25zIGZvciB0aGUgdXNlciB0byBvY2N1ciwgdGhhdCBtb2RpZnkgb3IgZGVsZXRlIHVzZXItY29udHJvbGxhYmxlIGRhdGEgaW4gZGF0YSBzdG9yYWdlIHN5c3RlbXMsIG9yIHRoYXQgc3VibWl0IHVzZXIgdGVzdCByZXNwb25zZXMsIHRoZSB1c2VyIGNhbiByZXZlcnNlLCBjb3JyZWN0LCBvciBjb25maXJtIHRoZSBhY3Rpb24uXCIsXG4gICAgXCIzLjMuN1wiOiBcIk1ha2UgaXQgZWFzaWVyIGZvciB1c2VycyB0byBjb21wbGV0ZSBtdWx0aS1zdGVwIHByb2Nlc3Nlcy4gRG9uJ3QgYXNrIGZvciB0aGUgc2FtZSBpbmZvcm1hdGlvbiB0d2ljZSBpbiB0aGUgc2FtZSBzZXNzaW9uLlwiLFxuICAgIFwiMy4zLjhcIjogXCJNYWtlIGxvZ2lucyBwb3NzaWJsZSB3aXRoIGxlc3MgbWVudGFsIGVmZm9ydC4gRG9uJ3QgbWFrZSBwZW9wbGUgc29sdmUsIHJlY2FsbCwgb3IgdHJhbnNjcmliZSBzb21ldGhpbmcgdG8gbG9nIGluLlwiLFxuICAgIFwiNC4xLjFcIjogXCIoT2Jzb2xldGUgYW5kIHJlbW92ZWQpIFRoaXMgcmVxdWlyZW1lbnQgd2FzIG9yaWdpbmFsbHkgYWRvcHRlZCB0byBhZGRyZXNzIHByb2JsZW1zIHRoYXQgYXNzaXN0aXZlIHRlY2hub2xvZ3kgKEFUKSBoYWQgZGlyZWN0bHkgcGFyc2luZyBIVE1MLiBBVCBubyBsb25nZXIgaGFzIGFueSBuZWVkIHRvIGRpcmVjdGx5IHBhcnNlIEhUTUwuIENvbnNlcXVlbnRseSwgdGhlc2UgcHJvYmxlbXMgZWl0aGVyIG5vIGxvbmdlciBleGlzdCBvciBhcmUgYWRkcmVzc2VkIGJ5IG90aGVyIHJlcXVpcmVtZW50cy5cIiwgXG4gICAgXCI0LjEuMlwiOiBcIkZvciBhbGwgdXNlciBpbnRlcmZhY2UgY29tcG9uZW50cyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGZvcm0gZWxlbWVudHMsIGxpbmtzIGFuZCBjb21wb25lbnRzIGdlbmVyYXRlZCBieSBzY3JpcHRzKSwgdGhlIG5hbWUgYW5kIHJvbGUgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZDsgc3RhdGVzLCBwcm9wZXJ0aWVzLCBhbmQgdmFsdWVzIHRoYXQgY2FuIGJlIHNldCBieSB0aGUgdXNlciBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBzZXQ7IGFuZCBub3RpZmljYXRpb24gb2YgY2hhbmdlcyB0byB0aGVzZSBpdGVtcyBpcyBhdmFpbGFibGUgdG8gdXNlciBhZ2VudHMsIGluY2x1ZGluZyBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLlwiLFxuICAgIFwiNC4xLjNcIjogXCJJbiBjb250ZW50IGltcGxlbWVudGVkIHVzaW5nIG1hcmt1cCBsYW5ndWFnZXMsIHN0YXR1cyBtZXNzYWdlcyBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIHRocm91Z2ggcm9sZSBvciBwcm9wZXJ0aWVzIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgYnkgYXNzaXN0aXZlIHRlY2hub2xvZ2llcyB3aXRob3V0IHJlY2VpdmluZyBmb2N1cy5cIixcbiAgICBcIkhUTUxcIjogXCJUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGlzc3VlcyB0aGF0IGNhdXNlIGFjY2Vzc2liaWxpdHkgaXNzdWVzIG1heSBiZSBjb3ZlcmVkIGJ5IG90aGVyIHJ1bGVzIGFuZCB3aWxsIGJlIHJlcG9ydGVkIHVuZGVyIHRob3NlIGFjY2Vzc2liaWxpdHkgcmVxdWlyZW1lbnRzLiBIb3dldmVyLCBzb21lIG5vbi1jb25mb3JtaW5nIEhUTUwgc3BlY2lmaWNhdGlvbiBpc3N1ZXMgYXJlIHN0aWxsIHJlcG9ydGVkLlwiLFxuICAgIFwiQVJJQVwiOiBcIlRoZSBBUklBIHNwZWNpZmljYXRpb24gaXNzdWVzIHRoYXQgY2F1c2UgYWNjZXNzaWJpbGl0eSBpc3N1ZXMgbWF5IGJlIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXMgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgdW5kZXIgdGhvc2UgYWNjZXNzaWJpbGl0eSByZXF1aXJlbWVudHMuIEhvd2V2ZXIsIHNvbWUgbm9uLWNvbmZvcm1pbmcgQVJJQSBzcGVjaWZpY2F0aW9uIGlzc3VlcyBhcmUgc3RpbGwgcmVwb3J0ZWQuXCIsXG59ICAgICBcblxuZXhwb3J0IGNvbnN0IGExMXlSdWxlc2V0czogR3VpZGVsaW5lW10gPSBbXG4gICAgLy8ge1xuICAgIC8vICAgICBpZDogXCJERUJVR1wiLFxuICAgIC8vICAgICBuYW1lOiBcIkRFQlVHIFJ1bGVzXCIsXG4gICAgLy8gICAgIGNhdGVnb3J5OiBlUnVsZUNhdGVnb3J5LkFDQ0VTU0lCSUxJVFksXG4gICAgLy8gICAgIGRlc2NyaXB0aW9uOiBcIlJ1bGVzIGZvciBkZWJ1Z2dpbmdcIixcbiAgICAvLyAgICAgY2hlY2twb2ludHM6IFt7XG4gICAgLy8gICAgICAgICBudW06IFwiMVwiLFxuICAgIC8vICAgICAgICAgbmFtZTogXCJEZWJ1ZyBDUCAxXCIsXG4gICAgLy8gICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgIC8vICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRGVidWdcIlxuICAgIC8vICAgICB9XVxuICAgIC8vIH0sXG4gICAge1xuICAgICAgICBpZDogXCJFWFRFTlNJT05TXCIsXG4gICAgICAgIG5hbWU6IFwiRXh0ZW5zaW9uIFJ1bGVzXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIGVuYWJsaW5nIHRoZSBicm93c2VyIGV4dGVuc2lvbnNcIixcbiAgICAgICAgdHlwZTogZUd1aWRlbGluZVR5cGUuRVhURU5TSU9OLFxuICAgICAgICBjaGVja3BvaW50czogW3tcbiAgICAgICAgICAgIG51bTogXCIxXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBDUCAxXCIsXG4gICAgICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRXh0ZW5zaW9uXCJcbiAgICAgICAgfV1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiSUJNX0FjY2Vzc2liaWxpdHlcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSA3LjNcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjAsIDIuMSwgMi4yIEEgYW5kIEFBIHBsdXMgYWRkaXRpb25hbCBJQk0gc3VwcGxlbWVudGFsIHJlcXVpcmVtZW50cy5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIiB8fCBzYy5sZXZlbCA9PT0gXCJOQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiTkFcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkOiBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSBuZXh0XCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wLCAyLjEsIDIuMiBBIGFuZCBBQSBwbHVzIGFkZGl0aW9uYWwgSUJNIHN1cHBsZW1lbnRhbCByZXF1aXJlbWVudHMuXCIsXG4gICAgICAgIC8vIFRoaXMgcnVsZXNldCBoYXMgYWxsIDIuMCBhbmQgMi4xIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIgfHwgc2MubGV2ZWwgPT09IFwiTkFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMlwiIHx8IHNjLndjYWdUeXBlID09PSBcIk5BXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMlwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4yIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjIgQSAmIEFBLiBUaGlzIGlzIHRoZSBjdXJyZW50IFczQyByZWNvbW1lbmRhdGlvbiAoc3BlY2lmaWNhdGlvbikuIENvbnRlbnQgdGhhdCBjb25mb3JtcyB0byBXQ0FHIDIuMiBhbHNvIGNvbmZvcm1zIHRvIFdDQUcgMi4xLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgYW5kIDIuMSBjaGVja3BvaW50cyB0aGF0IGFyZSBBIG9yIEFBXG4gICAgICAgIGNoZWNrcG9pbnRzOiBTQ3NcbiAgICAgICAgICAgIC5maWx0ZXIoc2MgPT4gKHNjLmxldmVsID09PSBcIkFcIiB8fCBzYy5sZXZlbCA9PT0gXCJBQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMVwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4xIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjEgQSAmIEFBLiBDb250ZW50IHRoYXQgY29uZm9ybXMgdG8gV0NBRyAyLjEgYWxzbyBjb25mb3JtcyB0byBXQ0FHIDIuMC5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiKSlcbiAgICAgICAgICAgIC5tYXAoc2MgPT4gKHtcbiAgICAgICAgICAgICAgICBudW06IHNjLm51bSxcbiAgICAgICAgICAgICAgICBzY0lkOiBzYy5zY0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHNjLmhhbmRsZSxcbiAgICAgICAgICAgICAgICB3Y2FnTGV2ZWw6IHNjLmxldmVsLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcmllc1tzYy5udW1dXG4gICAgICAgICAgICB9KSlcbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiV0NBR18yXzBcIixcbiAgICAgICAgbmFtZTogXCJXQ0FHIDIuMCAoQSwgQUEpXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wIEEgJiBBQS4gUmVmZXJlbmNlZCBieSBVUyBTZWN0aW9uIDUwOCwgYnV0IG5vdCB0aGUgbGF0ZXN0IFczQyByZWNvbW1lbmRhdGlvbi5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIpICYmIChzYy53Y2FnVHlwZSA9PT0gXCIyLjBcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfVxuXVxuIiwiXG5pbXBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBTUlJlbmRlcmVyIH0gZnJvbSBcIi4vU1JSZW5kZXJlclwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUsIE5hdmlnYXRpb25SZXN1bHQsIFJlbmRlclJlc3VsdCB9IGZyb20gXCIuL1NSVHlwZXNcIjtcbmltcG9ydCB7IFNSTmF2aWdhdG9yIH0gZnJvbSBcIi4vU1JOYXZpZ2F0b3JcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgU1JVdGlsIH0gZnJvbSBcIi4vU1JVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG4vKipcbiAqIFNSQ29udHJvbGxlciBjbGFzcyBmb3IgbWFuYWdpbmcgc2NyZWVuIHJlYWRlciBzaW11bGF0aW9uXG4gKiBNYWludGFpbnMgYSBwb2ludCBvZiByZWdhcmQgYW5kIHByb3ZpZGVzIG5hdmlnYXRpb24gZnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBTUkNvbnRyb2xsZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgc2luZ2xldG9uO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udHJvbGxlcihjdHJsRG9jOiBIVE1MRG9jdW1lbnQgPSBkb2N1bWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuc2luZ2xldG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNpbmdsZXRvbiA9IG5ldyBTUkNvbnRyb2xsZXIoY3RybERvYy5ib2R5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b24gYXMgU1JDb250cm9sbGVyO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY3VycmVudCBwb2ludCBvZiByZWdhcmQgKi9cbiAgICBwcml2YXRlIHBvaW50T2ZSZWdhcmQ6IFNSQ3Vyc29yO1xuICAgIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgICBwcml2YXRlIGxpdmVMaXN0ZW5lcnM6IEFycmF5PChyZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPj4gPSBbXTtcbiAgICBwcml2YXRlIGN0cmxEb2M7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUkNvbnRyb2xsZXJcbiAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCB0byBzdGFydCBmcm9tIChkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5KVxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByb290RWxlbWVudDogTm9kZSA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgdGhpcy5jdHJsRG9jID0gcm9vdEVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgdGhpcy5zZXRQb2ludE9mUmVnYXJkKHJvb3RFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXR1cE11dGF0aW9uVHJhY2tpbmcoKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGBbV0FSTklOR10gVGhlIFNSQ29udHJvbGxlciBpcyBhIG5ldyBmZWF0dXJlIHRoYXQgaXMgbm90IHlldCBcInN0YWJsZVwiLiBXaGF0IHRoaXMgbWVhbnM6XG4qIEFQSSBzdWJqZWN0IHRvIGNoYW5nZSwgZXZlbiBiZXR3ZWVuIG1pbm9yIHZlcnNpb25zIG9mIHRoZSBjaGVja2VyXG4qIFJlc3VsdHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGtub3duIGlzc3VlcywgYnV0IG1ha2luZyB0aGlzIGF2YWlsYWJsZSBmb3IgZWFybHkgZXhwZXJpbWVudGF0aW9uIC8gZmVlZGJhY2suYCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBmaW5kQWxsU2hhZG93Um9vdHMocm9vdDogRG9jdW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgTm9kZSA9IGRvY3VtZW50KTogTm9kZVtdIHtcbiAgICAgICAgY29uc3Qgc2hhZG93Um9vdHM6IE5vZGVbXSA9IFtdO1xuXG4gICAgICAgIC8vIEdldCBhbGwgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgcm9vdFxuICAgICAgICBjb25zdCB3YWxrZXIgPSB0aGlzLmN0cmxEb2MuY3JlYXRlVHJlZVdhbGtlcihcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGw7XG4gICAgICAgIHdoaWxlIChub2RlID0gd2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZWxlbWVudCBoYXMgYW4gb3BlbiBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIHNoYWRvd1Jvb3RzLnB1c2goZWxlbWVudC5zaGFkb3dSb290KTtcblxuICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNlYXJjaCBpbnNpZGUgdGhpcyBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFNoYWRvd1Jvb3RzID0gdGhpcy5maW5kQWxsU2hhZG93Um9vdHMoZWxlbWVudC5zaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICBzaGFkb3dSb290cy5wdXNoKC4uLm5lc3RlZFNoYWRvd1Jvb3RzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFkb3dSb290cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgbXV0YXRpb24gdHJhY2tpbmdcbiAgICAgKiBcbiAgICAgKiBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgcG9pbnQgb2YgcmVnYXJkIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCB3ZSBuZWVkIHRvIGdldCB1cCB0byB0aGUgbmVhcmVzdCBwYXJlbnQgdGhhdCdzIG5vdCBiZWluZyByZW1vdmVkXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cE11dGF0aW9uVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbXlUaGlzID0gdGhpcztcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgcG9yTm9kZSA9IG15VGhpcy5wb2ludE9mUmVnYXJkLmdldE5vZGUoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVtb3ZhbE11dGF0aW9uIG9mIG11dGF0aW9ucy5maWx0ZXIobXV0YXRpb24gPT4gbXV0YXRpb24ucmVtb3ZlZE5vZGVzPy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIHJlbW92YWxNdXRhdGlvbi5yZW1vdmVkTm9kZXMuZm9yRWFjaCgocmVtb3ZlZE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZWROb2RlLmlzU2FtZU5vZGUocG9yTm9kZSkgfHwgcmVtb3ZlZE5vZGUuY29udGFpbnMocG9yTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIkFkanVzdGluZyBQb1IgZHVlIHRvIERPTSBtdXRhdGlvbiByZW1vdmluZyBQb1JcIik7Ly8sIHJlbW92YWxNdXRhdGlvbi50YXJnZXQsIHJlbW92ZWROb2RlLCBwb3JOb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9yTm9kZSA9IHJlbW92YWxNdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZXRQb2ludE9mUmVnYXJkKHBvck5vZGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIG11dGF0aW9uLmFkZGVkTm9kZXMuZm9yRWFjaChhZGRlZE5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG9ic2VydmF0aW9uIG9mIG5ldyBzaGFkb3cgcm9vdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxSb290cyA9IHRoaXMuZmluZEFsbFNoYWRvd1Jvb3RzKGFkZGVkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgYWxsUm9vdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHJvb3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBtdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUubm9kZVR5cGUgPT09IDEgPyBub2RlIGFzIEhUTUxFbGVtZW50IDogbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChlbGVtIFxuICAgICAgICAgICAgICAgICAgICAmJiAhZWxlbS5jbG9zZXN0KGBbYXJpYS1idXN5PVwidHJ1ZVwiXWApXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1idXN5XCIpICE9PSBcInRydWVcIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgbGl2ZSByZWdpb24gY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpdmVSZWdpb25FbGVtID0gXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudCBpdHNlbGYgaXMgYSBsaXZlIHJlZ2lvbiBjb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicG9saXRlXCIsIFwiYXNzZXJ0aXZlXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1saXZlXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiT1VUUFVUXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgW1wic3RhdHVzXCIsIFwibG9nXCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJhbGVydFwiLCBcInRpbWVyXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiYgZWxlbSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPciBnZXQgdGhlIG5lYXJlc3QgYW5jZXN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW0uY2xvc2VzdChgW2FyaWEtbGl2ZT1cInBvbGl0ZVwiXSxbYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCJdLG91dHB1dCxbcm9sZT1cInN0YXR1c1wiXSxbcm9sZT1cImxvZ1wiXSxbcm9sZT1cInByb2dyZXNzYmFyXCJdLFtyb2xlPVwiYWxlcnRcIl0sW3JvbGU9XCJ0aW1lclwiXWApO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBpc011dGF0aW9uUmVsZXZhbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlbGV2YW5jZSA9IFtcImFkZGl0aW9uc1wiLCBcInRleHRcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXZlUmVnaW9uRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoYXQga2luZHMgb2YgY2hhbmdlcyBhcmUgJ3JlbGV2YW50J1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsZXZhbnRFbGVtID0gZWxlbS5jbG9zZXN0KFwiW2FyaWEtcmVsZXZhbnRdXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGV2YW50RWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IHJlbGV2YW50RWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXJlbGV2YW50XCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwibG9nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFuY2UgPSBbXCJhZGRpdGlvbnNcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGl2ZVJlZ2lvbkVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1yZWxldmFudFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcmVsZXZhbnRcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGV2YW5jZS5pbmNsdWRlcyhcImFsbFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IFtcImFkZGl0aW9uc1wiLCBcInJlbW92YWxzXCIsIFwidGV4dFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTXV0YXRpb25SZWxldmFudCA9IChtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDMgJiYgcmVsZXZhbmNlLmluY2x1ZGVzKFwidGV4dFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwICYmIHJlbGV2YW5jZS5pbmNsdWRlcyhcImFkZGl0aW9uc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDAgJiYgcmVsZXZhbmNlLmluY2x1ZGVzKFwicmVtb3ZhbHNcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXZlUmVnaW9uRWxlbSAmJiBpc011dGF0aW9uUmVsZXZhbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQXRvbWljID0gbGl2ZVJlZ2lvbkVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1hdG9taWNcIikgPT09IFwidHJ1ZVwiIHx8IFtcImFsZXJ0XCIsIFwic3RhdHVzXCIsIFwidGltZXJcIiwgXCJtYXJxdWVlXCJdLmluY2x1ZGVzKGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgd2hvbGUgcmVnaW9uIGlmIGF0b21pY1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0F0b21pYyAmJiBtdXRhdGlvbi50eXBlID09PSBcImNoYXJhY3RlckRhdGFcIiAmJiBtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDMgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG11dGF0aW9uLnRhcmdldC5wYXJlbnRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGl2ZUxpc3RlbmVyIG9mIHRoaXMubGl2ZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlTGlzdGVuZXIobXV0YXRpb24udGFyZ2V0Lm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZVRhcmdldCA9IGlzQXRvbWljID8gbGl2ZVJlZ2lvbkVsZW0gOiBtdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsaXZlVGFyZ2V0IGFzIGFueSkubGl2ZUFubm91bmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCgobGl2ZVRhcmdldCBhcyBhbnkpLmxpdmVBbm5vdW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXZlVGFyZ2V0IGFzIGFueSkubGl2ZUFubm91bmNlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc1JlbW92YWwgPSAocmVsZXZhbmNlLmluY2x1ZGVzKFwicmVtb3ZhbHNcIikgJiYgbXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdG9taWMgfHwgaXNSZW1vdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZUN1cnNvciA9IG5ldyBTUkN1cnNvcihsaXZlVGFyZ2V0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZUN1cnNvckVuZCA9IG5ldyBTUkN1cnNvcihsaXZlVGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVDdXJzb3JFbmQubmV4dCgoKSA9PiB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCgoaXNSZW1vdmFsP1wiW3JlbW92ZWRdIFwiOlwiXCIpK1NSUmVuZGVyZXIucmVuZGVyUmFuZ2UoXCJpdGVtXCIsIGxpdmVDdXJzb3IsIGxpdmVDdXJzb3JFbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxldmFuY2UuaW5jbHVkZXMoXCJhZGRpdGlvbnNcIikgJiYgbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goYWRkZWROb2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHJlbmRlciB0aGUgYWRkaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdmVDdXJzb3IgPSBuZXcgU1JDdXJzb3IoYWRkZWROb2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdmVDdXJzb3JFbmQgPSBuZXcgU1JDdXJzb3IoYWRkZWROb2RlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlQ3Vyc29yRW5kLm5leHQoKCkgPT4gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFNSUmVuZGVyZXIucmVuZGVyUmFuZ2UoXCJpdGVtXCIsIGxpdmVDdXJzb3IsIGxpdmVDdXJzb3JFbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGl2ZUxpc3RlbmVyIG9mIHRoaXMubGl2ZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUxpc3RlbmVyKHJlc3VsdHMuam9pbihcIlxcblwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBOZWVkIHRvIG9ic2VydmUgYWxsIG9mIHRoZSBzaGFkb3cgcm9vdHNcbiAgICAgICAgbGV0IGFsbFJvb3RzID0gdGhpcy5maW5kQWxsU2hhZG93Um9vdHModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGFsbFJvb3RzLnB1c2godGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGZvciAoY29uc3Qgcm9vdCBvZiBhbGxSb290cykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShyb290LCB7XG4gICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTGl2ZUxpc3RlbmVyKGxpc3RlbmVyOiAocmVzdWx0OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICAgICAgdGhpcy5saXZlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVMaXZlTGlzdGVuZXIocmVtb3ZlTGlzdGVuZXI6IChyZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgICAgICB0aGlzLmxpdmVMaXN0ZW5lcnMgPSB0aGlzLmxpdmVMaXN0ZW5lcnMuZmlsdGVyKGxpc3RlbmVyID0+IGxpc3RlbmVyICE9PSByZW1vdmVMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHBvaW50IG9mIHJlZ2FyZFxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IFNSQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgcG9pbnQgb2YgcmVnYXJkXG4gICAgICovXG4gICAgcHVibGljIGdldFBvaW50T2ZSZWdhcmQoKTogU1JDdXJzb3Ige1xuICAgICAgICByZXR1cm4gdGhpcy5wb2ludE9mUmVnYXJkO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBvaW50IG9mIHJlZ2FyZCB0byBhIHNwZWNpZmljIERPTSBub2RlXG4gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gc2V0IGFzIHRoZSBwb2ludCBvZiByZWdhcmRcbiAgICAgKiBAcmV0dXJucyBOYXZpZ2F0aW9uUmVzdWx0IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIHNldFBvaW50T2ZSZWdhcmQobm9kZTogTm9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKFwic2V0UG9pbnRPZlJlZ2FyZFwiKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucG9pbnRPZlJlZ2FyZCA9IG5ldyBTUkN1cnNvcihub2RlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVXBkYXRlIGNvbnRhaW5lciBzdGF0ZVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhcImZvY3VzXCIsIHRoaXMucG9pbnRPZlJlZ2FyZCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSB0aGlzLnBvaW50T2ZSZWdhcmQuZ2V0Um9sZSgpO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMucG9pbnRPZlJlZ2FyZC5nZXROYW1lSW5mbygpPy5uYW1lO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiBTUlJlbmRlcmVyLnJlbmRlckN1cnJlbnQoXCJmb2N1c1wiLCB0aGlzLnBvaW50T2ZSZWdhcmQsIGNvbnRhaW5lckNoYW5nZXMpLFxuICAgICAgICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBzZXQgcG9pbnQgb2YgcmVnYXJkOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogSnVtcCB0byB0aGUgbmV4dCBlbGVtZW50IGJ5IHRoZSBzcGVjaWZpZWQgbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdG8gdXNlXG4gICAgICogQHJldHVybnMgTmF2aWdhdGlvblJlc3VsdCBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZVxuICAgICAqL1xuICAgIHB1YmxpYyBqdW1wTmV4dChtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBDYWNoZVV0aWwuY2xlYXJDYWNoZXModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9sZFBvaW50T2ZSZWdhcmQgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cChcImp1bXBOZXh0XCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGJDb250aW51ZSA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmV4dEp1bXAgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgICAgIGxldCByZW5kZXJpbmdSZXN1bHQ7XG4gICAgICAgICAgICB3aGlsZSAoYkNvbnRpbnVlICYmIG5leHRKdW1wKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEp1bXAgPSBuZXh0SnVtcC5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIG5leHRKdW1wID0gU1JOYXZpZ2F0b3IuanVtcE5leHQobW9kZSwgbmV4dEp1bXApO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0SnVtcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCBuZXh0SnVtcCwgbGFzdEp1bXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgIVNSTmF2aWdhdG9yLmdldFN0YXJ0RnVuYyhtb2RlKShuZXh0SnVtcC5nZXRSb2xlKCksICFuZXh0SnVtcC5pc0VuZFRhZygpLCBuZXh0SnVtcC5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBuZXh0SnVtcCwgY29udGFpbmVyQ2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGxhbmRpbmcgcG9pbnQgaXMgZW1wdHksIHVubGVzcyBpdCdzIGNlcnRhaW4gbmF2IG1vZGVzIChlLmcuLCByZWdpb24pXG4gICAgICAgICAgICAgICAgICAgIGJDb250aW51ZSA9IHJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIVtcInJlZ2lvblwiXS5pbmNsdWRlcyhtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHRKdW1wKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcG9pbnQgb2YgcmVnYXJkXG4gICAgICAgICAgICAgICAgdGhpcy5wb2ludE9mUmVnYXJkID0gb2xkUG9pbnRPZlJlZ2FyZDtcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudFJlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBvbGRQb2ludE9mUmVnYXJkLCB7IGxlYXZpbmc6IFtdLCBlbnRlcmluZzogW119KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogb2xkUG9pbnRPZlJlZ2FyZC5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTm8gbmV4dCAke21vZGV9LiAke2N1cnJlbnRSZXN1bHQ/Lm1lc3NhZ2UgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBuZXh0SnVtcDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldE5hbWVJbmZvKCk/Lm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGNvbnRhaW5lciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJOZXcgUE9SOlwiLCB0aGlzLnBvaW50T2ZSZWdhcmQuZ2V0Tm9kZSgpLCByZW5kZXJpbmdSZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgcm9sZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBvaW50IG9mIHJlZ2FyZFxuICAgICAgICAgICAgdGhpcy5wb2ludE9mUmVnYXJkID0gb2xkUG9pbnRPZlJlZ2FyZDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIGVuZDogb2xkUG9pbnRPZlJlZ2FyZC5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTmF2aWdhdGlvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIEp1bXAgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgYnkgdGhlIHNwZWNpZmllZCBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB0byB1c2VcbiAgICAgKiBAcmV0dXJucyBOYXZpZ2F0aW9uUmVzdWx0IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIGp1bXBQcmV2aW91cyhtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBDYWNoZVV0aWwuY2xlYXJDYWNoZXModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9sZFBvaW50T2ZSZWdhcmQgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBwcmV2SnVtcCA9IHRoaXMucG9pbnRPZlJlZ2FyZC5jbG9uZSgpO1xuICAgICAgICAgICAgbGV0IHJlbmRlcmluZ1Jlc3VsdDtcbiAgICAgICAgICAgIHdoaWxlIChiQ29udGludWUgJiYgcHJldkp1bXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0SnVtcCA9IHByZXZKdW1wLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgcHJldkp1bXAgPSBTUk5hdmlnYXRvci5qdW1wUHJldmlvdXMobW9kZSwgcHJldkp1bXApO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2SnVtcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCBwcmV2SnVtcCwgbGFzdEp1bXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgIVNSTmF2aWdhdG9yLmdldFN0YXJ0RnVuYyhtb2RlKShwcmV2SnVtcC5nZXRSb2xlKCksICFwcmV2SnVtcC5pc0VuZFRhZygpLCBwcmV2SnVtcC5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBwcmV2SnVtcCwgY29udGFpbmVyQ2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGxhbmRpbmcgcG9pbnQgaXMgZW1wdHksIHVubGVzcyBpdCdzIGNlcnRhaW4gbmF2IG1vZGVzIChlLmcuLCByZWdpb24pXG4gICAgICAgICAgICAgICAgICAgIGJDb250aW51ZSA9IHJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIVtcInJlZ2lvblwiXS5pbmNsdWRlcyhtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcHJldkp1bXApIHtcbiAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwb2ludCBvZiByZWdhcmRcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBvbGRQb2ludE9mUmVnYXJkO1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UmVzdWx0ID0gU1JSZW5kZXJlci5yZW5kZXJDdXJyZW50KG1vZGUsIG9sZFBvaW50T2ZSZWdhcmQsIHsgbGVhdmluZzogW10sIGVudGVyaW5nOiBbXX0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG9sZFBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBObyBwcmV2aW91cyAke21vZGV9LiAke2N1cnJlbnRSZXN1bHQ/Lm1lc3NhZ2UgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBwcmV2SnVtcDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldE5hbWVJbmZvKCk/Lm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gLy8gQ2hlY2sgZm9yIGNvbnRhaW5lciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCB0aGlzLnBvaW50T2ZSZWdhcmQsIG9sZFBvaW50T2ZSZWdhcmQpO1xuICAgICAgICAgICAgICAgIC8vIGxldCBzID0gU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCB0aGlzLnBvaW50T2ZSZWdhcmQpO1xuICAgICAgICAgICAgICAgIC8vIGlmIChjb250YWluZXJDaGFuZ2VzLmVudGVyaW5nW2NvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcubGVuZ3RoLTFdICE9PSBzKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcucHVzaChzKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcG9pbnQgb2YgcmVnYXJkXG4gICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBvbGRQb2ludE9mUmVnYXJkO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG9sZFBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBOYXZpZ2F0aW9uIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHRoZSBkaWZmZXJlbnQgaW4gY29udGFpbmVycyBiZXR3ZWVuIHRoZSB0d28gbm9kZXNcbiAgICAgKiBAcGFyYW0gbmV3V2Fsa2VyIFRoZSBuZXcgbm9kZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvXG4gICAgICogQHBhcmFtIG9sZFdhbGtlciBUaGUgcHJldmlvdXMgbm9kZSB3ZSB3ZXJlIGF0XG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY29udGFpbmVyIGNoYW5nZSBtZXNzYWdlc1xuICAgICAqL1xuICAgIC8qKlxuICAgICAqIFdhbGsgdXAgZnJvbSBhIG5vZGUgaW4gYW4gaWZyYW1lIHN1YmRvY3VtZW50IHRvIGZpbmQgdGhlIGhvc3QgPGlmcmFtZT4gZWxlbWVudFxuICAgICAqIGluIHRoZSBuZWFyZXN0IGFuY2VzdG9yIGRvY3VtZW50LiAgUmV0dXJucyBudWxsIGlmIHRoZSBub2RlIGlzIG5vdCBpbiBhIHN1YmRvY3VtZW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGhvc3RJZnJhbWUobm9kZTogTm9kZSk6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGRvYyA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2MgfHwgZG9jID09PSBkb2N1bWVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIGNvbnRlbnRXaW5kb3cuZnJhbWVFbGVtZW50IGlzIHRoZSA8aWZyYW1lPiBpbiB0aGUgcGFyZW50IGRvY3VtZW50XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gRE9NVXRpbC5nZXRBbmNlc3Rvcihub2RlLCBbXCJpZnJhbWVcIl0pIGFzIEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGlmZkNvbnRhaW5lcnMobW9kZTogTmF2aWdhdGlvbk1vZGUgfCBcImZvY3VzXCIsIG5ld1dhbGtlcjogU1JDdXJzb3IsIG9sZFdhbGtlcj86IFNSQ3Vyc29yKTogeyBsZWF2aW5nOiBzdHJpbmdbXSwgZW50ZXJpbmc6IHN0cmluZ1tdIH0ge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIi09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LVwiKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJBKVwiLCBvbGRXYWxrZXI/LmdldE5vZGUoKS5ub2RlTmFtZSwgbmV3V2Fsa2VyLmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgIGxldCBsZWF2aW5nOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgZW50ZXJpbmc6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEb2MgPSBuZXdXYWxrZXI/LmdldE5vZGUoKS5vd25lckRvY3VtZW50ID8/IGRvY3VtZW50O1xuICAgICAgICAgICAgY29uc3Qgb2xkRG9jID0gb2xkV2Fsa2VyPy5nZXROb2RlKCkub3duZXJEb2N1bWVudCA/PyBkb2N1bWVudDtcblxuICAgICAgICAgICAgLy8g4pSA4pSAIENyb3NzLWRvY3VtZW50IGlmcmFtZSBib3VuZGFyeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIG5hdmlnYXRpb24gY3Jvc3NlcyBpbnRvIG9yIG91dCBvZiBhbiA8aWZyYW1lPiBzdWJkb2N1bWVudFxuICAgICAgICAgICAgLy8gdGhlIG5vcm1hbCBjb21tb25QYXJlbnQgd2FsayBjYW5ub3Qgc3BhbiBkb2N1bWVudCBib3VuZGFyaWVzLlxuICAgICAgICAgICAgLy8gV2UgZGV0ZWN0IHRoaXMgYW5kIG1hbnVhbGx5IGluamVjdCB0aGUgY29udGFpbmVyLWVudGVyL2V4aXQgZm9yIHRoZVxuICAgICAgICAgICAgLy8gPGlmcmFtZT4gZWxlbWVudCBpdHNlbGYuXG4gICAgICAgICAgICBpZiAobmV3RG9jICE9PSBvbGREb2MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdJZnJhbWUgPSBTUkNvbnRyb2xsZXIuaG9zdElmcmFtZShuZXdXYWxrZXIuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRJZnJhbWUgPSBTUkNvbnRyb2xsZXIuaG9zdElmcmFtZShvbGRXYWxrZXI/LmdldE5vZGUoKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobmV3SWZyYW1lICYmICFvbGRJZnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW50ZXJpbmcgYW4gaWZyYW1lIHN1YmRvY3VtZW50IOKAlCBlbWl0IHRoZSBmcmFtZSBjb250YWluZXItZW50ZXIuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZUN1cnNvciA9IG5ldyBTUkN1cnNvcihuZXdJZnJhbWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50ZXIgPSBTUlJlbmRlcmVyLnJlbmRlckVudGVyKG1vZGUsIGlmcmFtZUN1cnNvciwgb2xkV2Fsa2VyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudGVyICYmIGVudGVyLnRyaW0oKSkgZW50ZXJpbmcucHVzaChlbnRlci50cmltKCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5ld0lmcmFtZSAmJiBvbGRJZnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTGVhdmluZyBhbiBpZnJhbWUgc3ViZG9jdW1lbnQg4oCUIGVtaXQgdGhlIGZyYW1lIGNvbnRhaW5lci1leGl0LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWVDdXJzb3IgPSBuZXcgU1JDdXJzb3Iob2xkSWZyYW1lLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVhdmUgPSBTUlJlbmRlcmVyLnJlbmRlckxlYXZlKG1vZGUgYXMgTmF2aWdhdGlvbk1vZGUsIGlmcmFtZUN1cnNvciwgb2xkV2Fsa2VyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlYXZlICYmIGxlYXZlLnRyaW0oKSkgbGVhdmluZy5wdXNoKGxlYXZlLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdJZnJhbWUgJiYgb2xkSWZyYW1lICYmIG5ld0lmcmFtZSAhPT0gb2xkSWZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmluZyBiZXR3ZWVuIHR3byBkaWZmZXJlbnQgaWZyYW1lcyDigJQgZXhpdCBvbGQsIGVudGVyIG5ldy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkQ3Vyc29yID0gbmV3IFNSQ3Vyc29yKG9sZElmcmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlYXZlID0gU1JSZW5kZXJlci5yZW5kZXJMZWF2ZShtb2RlIGFzIE5hdmlnYXRpb25Nb2RlLCBvbGRDdXJzb3IsIG9sZFdhbGtlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWF2ZSAmJiBsZWF2ZS50cmltKCkpIGxlYXZpbmcucHVzaChsZWF2ZS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDdXJzb3IgPSBuZXcgU1JDdXJzb3IobmV3SWZyYW1lLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudGVyID0gU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCBuZXdDdXJzb3IsIG9sZFdhbGtlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRlciAmJiBlbnRlci50cmltKCkpIGVudGVyaW5nLnB1c2goZW50ZXIudHJpbSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWZ0ZXIgaW5qZWN0aW5nIGlmcmFtZSBib3VuZGFyeSBhbm5vdW5jZW1lbnRzLCBhbHNvIHJ1biB0aGUgbm9ybWFsXG4gICAgICAgICAgICAgICAgLy8gd2l0aGluLWRvY3VtZW50IGRpZmZDb250YWluZXJzIGZvciBlYWNoIHNpZGUgaW5kZXBlbmRlbnRseSBzbyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gbGFuZG1hcmtzIGluc2lkZSB0aGUgaWZyYW1lIGFyZSBhbm5vdW5jZWQgY29ycmVjdGx5LlxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxlYXZpbmcsIGVudGVyaW5nIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIOKUgOKUgCBTYW1lLWRvY3VtZW50IHBhdGggKG9yaWdpbmFsIGxvZ2ljKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgICAgICAgIGNvbnN0IGRvY1Jvb3QgPSBuZXdXYWxrZXIgP1xuICAgICAgICAgICAgICAgIChuZXdXYWxrZXIuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQuYm9keSB8fCBuZXdXYWxrZXIuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA6XG4gICAgICAgICAgICAgICAgb2xkV2Fsa2VyID9cbiAgICAgICAgICAgICAgICAgICAgKG9sZFdhbGtlci5nZXROb2RlKCkub3duZXJEb2N1bWVudC5ib2R5IHx8IG9sZFdhbGtlci5nZXROb2RlKCkub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIDpcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGxldCB3YWxrTmV3ID0gbmV3V2Fsa2VyID8gbmV3V2Fsa2VyLmNsb25lKCkgOiAobmV3IFNSQ3Vyc29yKGRvY1Jvb3QpKTtcbiAgICAgICAgICAgIGxldCB3YWxrT2xkID0gb2xkV2Fsa2VyID8gb2xkV2Fsa2VyLmNsb25lKCkgOiAobmV3IFNSQ3Vyc29yKGRvY1Jvb3QpKTtcbiAgICAgICAgICAgIGlmICghd2Fsa05ldy5nZXROb2RlKCkuaXNTYW1lTm9kZSh3YWxrT2xkLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tbW9uUGFyZW50ID0gU1JDb250cm9sbGVyLmNvbW1vblBhcmVudCh3YWxrTmV3LCB3YWxrT2xkKTtcbiAgICAgICAgICAgICAgICBpZiAoY29tbW9uUGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiQilcIiwgY29tbW9uUGFyZW50LmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa05ldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiRW50ZXJpbmc6XCIsIHdhbGtOZXcuZ2V0Tm9kZSgpLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nLnB1c2goU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCB3YWxrTmV3LCB3YWxrT2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrTmV3LnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVudGVyaW5nLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgZW50ZXJpbmcgPSBlbnRlcmluZy5maWx0ZXIocyA9PiBzICYmIHMudHJpbSgpLmxlbmd0aCA+IDApLm1hcChzID0+IHMudHJpbSgpKTs7XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbW1vblBhcmVudC5jb250YWlucyh3YWxrT2xkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJMZWF2aW5nOlwiLCB3YWxrT2xkLmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nLnB1c2goU1JSZW5kZXJlci5yZW5kZXJMZWF2ZShtb2RlLCB3YWxrT2xkLCB3YWxrT2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrT2xkLnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxlYXZpbmcgPSBsZWF2aW5nLmZpbHRlcihzID0+IHMgJiYgcy50cmltKCkubGVuZ3RoID4gMCkubWFwKHMgPT4gcy50cmltKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2cobGVhdmluZywgZW50ZXJpbmcpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWF2aW5nLFxuICAgICAgICAgICAgZW50ZXJpbmdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb21tb25QYXJlbnQod2Fsa2VyT25lOiBTUkN1cnNvciwgd2Fsa2VyVHdvOiBTUkN1cnNvcik6IFNSQ3Vyc29yIHtcbiAgICAgICAgaWYgKHdhbGtlck9uZS5jb250YWlucyh3YWxrZXJUd28pKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fsa2VyT25lLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSBpZiAod2Fsa2VyVHdvLmNvbnRhaW5zKHdhbGtlck9uZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3YWxrZXJUd28uY2xvbmUoKTsgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29tbW9uUGFyZW50OiBTUkN1cnNvciA9IHdhbGtlck9uZS5jbG9uZSgpO1xuICAgICAgICAgICAgd2hpbGUgKCFjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa2VyVHdvKSAmJiBjb21tb25QYXJlbnQucGFyZW50KCkpO1xuICAgICAgICAgICAgaWYgKCFjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa2VyT25lKSB8fCAhY29tbW9uUGFyZW50LmNvbnRhaW5zKHdhbGtlclR3bykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gY29tbW9uUGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJBbGwobW9kZTogTmF2aWdhdGlvbk1vZGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBjdHJsID0gU1JDb250cm9sbGVyLmdldENvbnRyb2xsZXIoKTtcbiAgICAgICAgbGV0IGRpYWxvZ3MgPSBjdHJsLmN0cmxEb2MuYm9keS5xdWVyeVNlbGVjdG9yQWxsKFwiZGlhbG9nLFtyb2xlPSdkaWFsb2cnXVwiKTtcbiAgICAgICAgZGlhbG9ncy5mb3JFYWNoKGRpYWxvZyA9PiB7XG4gICAgICAgICAgICBpZiAoU1JVdGlsLmlzTW9kYWxEaWFsb2dFbGVtZW50KGRpYWxvZykpIHtcbiAgICAgICAgICAgICAgICBjdHJsLnNldFBvaW50T2ZSZWdhcmQoZGlhbG9nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgbGV0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgaW5pdGlhbCBpdGVtIGZpcnN0IChpZiB0aGVyZSBpcyBvbmUpXG4gICAgICAgIGxldCBzdGFydGVyTXNnID0gU1JSZW5kZXJlci5yZW5kZXJDdXJyZW50KG1vZGUsIGN0cmwuZ2V0UG9pbnRPZlJlZ2FyZCgpLCB7ZW50ZXJpbmc6IFtdLCBsZWF2aW5nOiBbXX0pO1xuICAgICAgICBpZiAoc3RhcnRlck1zZykge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHN0YXJ0ZXJNc2cubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKGJDb250aW51ZSkge1xuICAgICAgICAgICAgbGV0IG5leHRWYWwgPSBjdHJsLmp1bXBOZXh0KG1vZGUpO1xuICAgICAgICAgICAgaWYgKG5leHRWYWwuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChuZXh0VmFsLnJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJBbGxEZXRhaWwoZG9jOiBIVE1MRG9jdW1lbnQsIG1vZGU6IE5hdmlnYXRpb25Nb2RlKTogUmVuZGVyUmVzdWx0W10ge1xuICAgICAgICBsZXQgY3RybCA9IFNSQ29udHJvbGxlci5nZXRDb250cm9sbGVyKGRvYyk7XG4gICAgICAgIGN0cmwuc2V0UG9pbnRPZlJlZ2FyZChkb2MuYm9keSk7XG4gICAgICAgIGxldCBkaWFsb2dzID0gZG9jLmJvZHkucXVlcnlTZWxlY3RvckFsbChcImRpYWxvZyxbcm9sZT0nZGlhbG9nJ11cIik7XG4gICAgICAgIGRpYWxvZ3MuZm9yRWFjaChkaWFsb2cgPT4ge1xuICAgICAgICAgICAgaWYgKFNSVXRpbC5pc01vZGFsRGlhbG9nRWxlbWVudChkaWFsb2cpKSB7XG4gICAgICAgICAgICAgICAgY3RybC5zZXRQb2ludE9mUmVnYXJkKGRpYWxvZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGxldCByZXN1bHRzOiBSZW5kZXJSZXN1bHRbXSA9IFtdO1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGluaXRpYWwgaXRlbSBmaXJzdCAoaWYgdGhlcmUgaXMgb25lKVxuICAgICAgICBsZXQgc3RhcnRlck1zZyA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBjdHJsLmdldFBvaW50T2ZSZWdhcmQoKSwge2VudGVyaW5nOiBbXSwgbGVhdmluZzogW119KTtcbiAgICAgICAgaWYgKHN0YXJ0ZXJNc2cpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChzdGFydGVyTXNnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiQ29udGludWUgPSB0cnVlO1xuICAgICAgICB3aGlsZSAoYkNvbnRpbnVlKSB7XG4gICAgICAgICAgICBsZXQgbmV4dFZhbCA9IGN0cmwuanVtcE5leHQobW9kZSk7XG4gICAgICAgICAgICBpZiAobmV4dFZhbC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgLy8gbW9kZSA9PT0gXCJpdGVtXCIgJiYgY29uc29sZS5sb2cobmV4dFZhbCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKG5leHRWYWwucmVuZGVyaW5nUmVzdWx0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJTdHJ1Y3R1cmUoZG9jOiBIVE1MRG9jdW1lbnQpOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiB7XG4gICAgICAgIGNvbnN0IG1vZGVzOiBOYXZpZ2F0aW9uTW9kZVtdID0gWyBcInJlZ2lvblwiLCBcImhlYWRpbmdcIiwgXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCIsIFwiaW1hZ2VcIiBdO1xuICAgICAgICBsZXQgZGV0YWlscyA9IG1vZGVzLm1hcChtb2RlTGFiZWwgPT4gU1JDb250cm9sbGVyLnJlbmRlckFsbERldGFpbChkb2MsIG1vZGVMYWJlbCkpO1xuICAgICAgICBsZXQgcmV0VmFsOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiA9IFtdO1xuICAgICAgICB3aGlsZSAoZGV0YWlscy5zb21lKGRldGFpbCA9PiBkZXRhaWwubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZGV0YWlsc1swXVswXT8uc3RhcnQ7XG4gICAgICAgICAgICBtb2Rlcy5mb3JFYWNoKChtb2RlLCBpZHgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1tpZHhdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8IFNSQ3Vyc29yLmNvbXBhcmUoZGV0YWlsc1tpZHhdWzBdLnN0YXJ0LCBuZXh0KSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBkZXRhaWxzW2lkeF1bMF0uc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGV0IG5leHRJdGVtOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgICAgICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIG1vZGVzLmZvckVhY2goKG1vZGUsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIG5leHRJdGVtW21vZGVdID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1tpZHhdLmxlbmd0aCA+IDAgJiYgU1JDdXJzb3IuY29tcGFyZShkZXRhaWxzW2lkeF1bMF0uc3RhcnQsIG5leHQpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRJdGVtW21vZGVdID0gZGV0YWlsc1tpZHhdLnNoaWZ0KCkubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgaGFzVmFsdWUgPSBuZXh0SXRlbVttb2RlXSAhPT0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGhhc1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5leHQuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gZWxlbSAmJiBTUlV0aWwuZ2V0VW5pcXVlU2VsZWN0b3IoZWxlbSk7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBlbGVtZW50J3Mgb3duIGRvY3VtZW50IGZvciBxdWVyeVNlbGVjdG9yIHNvIHRoYXQgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAvLyBpbnNpZGUgaWZyYW1lIHN1YmRvY3VtZW50cyByZXNvbHZlIGNvcnJlY3RseS5cbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtRG9jID0gZWxlbT8ub3duZXJEb2N1bWVudCA/PyBkb2M7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yICYmIGVsZW1Eb2MucXVlcnlTZWxlY3RvcihzZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZW0uc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0VmFsLnB1c2gobmV4dEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufSIsImltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBY2Nlc3NpYmxlTmFtZVJlc3VsdCwgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFNSVXRpbCB9IGZyb20gXCIuL1NSVXRpbFwiO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHR5cGUgZm9yIG1hdGNoaW5nIG5vZGVzIGR1cmluZyBjdXJzb3IgbmF2aWdhdGlvblxuICogQHBhcmFtIHJvbGUgLSBUaGUgQVJJQSByb2xlIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAqIEBwYXJhbSBiU3RhcnRUYWcgLSBXaGV0aGVyIHRoaXMgaXMgYSBzdGFydCB0YWcgKHRydWUpIG9yIGVuZCB0YWcgKGZhbHNlKVxuICogQHBhcmFtIG5vZGUgLSBUaGUgRE9NIG5vZGUgYmVpbmcgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNyaXRlcmlhLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IHR5cGUgU1JDdXJzb3JNYXRjaEZ1bmMgPSAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IGJvb2xlYW47XG5cbmV4cG9ydCB0eXBlIFNSQ3Vyc29yU2tpcEZ1bmMgPSAoY3Vyc29yOiBTUkN1cnNvcikgPT4geyBza2lwQ3VycmVudDogYm9vbGVhbiwgc2tpcENoaWxkcmVuOiBib29sZWFufSB8IG51bGw7XG5cbi8qKlxuICogU1JDdXJzb3IgKFNjcmVlbiBSZWFkZXIgQ3Vyc29yKSBjbGFzc1xuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBjdXJzb3ItbGlrZSBpbnRlcmZhY2UgZm9yIG5hdmlnYXRpbmcgdGhlIERPTSBpbiBhIHdheSB0aGF0XG4gKiBzaW11bGF0ZXMgaG93IHNjcmVlbiByZWFkZXJzIHByb2Nlc3MgYW5kIG5hdmlnYXRlIGNvbnRlbnQuIEl0IHRyYWNrczpcbiAqIC0gVGhlIGN1cnJlbnQgbm9kZSBwb3NpdGlvblxuICogLSBXaGV0aGVyIGl0J3MgYXQgYSBzdGFydCBvciBlbmQgdGFnXG4gKiAtIFRoZSBBUklBIHJvbGUgb2YgdGhlIGN1cnJlbnQgbm9kZVxuICogLSBUaGUgYWNjZXNzaWJsZSBuYW1lIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAqL1xuZXhwb3J0IGNsYXNzIFNSQ3Vyc29yIHtcbiAgICAvKiogVGhlIEFSSUEgcm9sZSBvZiB0aGUgY3VycmVudCBub2RlICovXG4gICAgcHJpdmF0ZSByb2xlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb21wdXRlZCBhY2Nlc3NpYmxlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbm9kZSAqL1xuICAgIHByaXZhdGUgbmFtZTogQWNjZXNzaWJsZU5hbWVSZXN1bHQ7XG4gICAgLyoqIFRoZSB1bmRlcmx5aW5nIERPTSB3YWxrZXIgdGhhdCBoYW5kbGVzIG5vZGUgdHJhdmVyc2FsICovXG4gICAgcHJpdmF0ZSB3YWxrZXI6IERPTVdhbGtlcjtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBhdCBhIHRleHQgbm9kZSBpbnNpZGUgYSBwcmVmb3JtYXR0ZWQgc2VnbWVudFxuICAgICAqIChlLmcuIDxwcmU+KSwgdGhpcyBpbmRleCBpZGVudGlmaWVzIHdoaWNoIG5ld2xpbmUtZGVsaW1pdGVkIGxpbmUgaXMgdGhlXG4gICAgICogY3VycmVudCByZWFkaW5nIHBvc2l0aW9uLiAgdW5kZWZpbmVkIG1lYW5zIFwibm90IGluIGEgcHJlZm9ybWF0dGVkIGNvbnRleHRcIi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlTGluZUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUkN1cnNvciBwb3NpdGlvbmVkIGF0IHRoZSBzcGVjaWZpZWQgZWxlbWVudFxuICAgICAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIERPTSBub2RlIHRvIHBvc2l0aW9uIHRoZSBjdXJzb3IgYXRcbiAgICAgKiBAcGFyYW0gYkVuZCAtIFdoZXRoZXIgdG8gcG9zaXRpb24gYXQgdGhlIGVuZCB0YWcgKHRydWUpIG9yIHN0YXJ0IHRhZyAoZmFsc2UpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZWxlbWVudCA6IE5vZGUsIGJFbmQ/IDogYm9vbGVhbikge1xuICAgICAgICAvLyBVc2UgRE9NV2Fsa2VyIHdpdGggY29uc2lkZXJIaWRkZW49ZmFsc2UgdG8gcHJvY2VzcyBhbGwgY29udGVudCAoaW5jbHVkaW5nIGhpZGRlbiBlbGVtZW50cylcbiAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHNjcmVlbiByZWFkZXIgc2ltdWxhdGlvbiB3aGljaCBuZWVkcyB0byBzZWUgYWxsIGNvbnRlbnRcbiAgICAgICAgdGhpcy53YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQsIGJFbmQsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBjdXJzb3IgYXQgdGhlIHNhbWUgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBTUkN1cnNvciBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIHBvc2l0aW9uIGFuZCBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgY2xvbmUoKSA6IFNSQ3Vyc29yIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IG5ldyBTUkN1cnNvcih0aGlzLndhbGtlci5ub2RlLCB0aGlzLndhbGtlci5iRW5kVGFnKTtcbiAgICAgICAgcmV0VmFsLnJvbGUgPSB0aGlzLnJvbGU7XG4gICAgICAgIHJldFZhbC5uYW1lID0gdGhpcy5uYW1lO1xuICAgICAgICByZXRWYWwucHJlTGluZUluZGV4ID0gdGhpcy5wcmVMaW5lSW5kZXg7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgcm9sZSBhbmQgYWNjZXNzaWJsZSBuYW1lIHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbm9kZVxuICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjdXJzb3IgcG9zaXRpb24gY2hhbmdlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWZyZXNoTmFtZSgpIHtcbiAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIEVsZW1lbnQgbm9kZVxuICAgICAgICAgICAgdGhpcy5yb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIC8vIFRleHQgbm9kZVxuICAgICAgICAgICAgdGhpcy5yb2xlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB7IG5hbWU6IHRoaXMud2Fsa2VyLm5vZGUudGV4dENvbnRlbnQsIG5hbWVGcm9tOiBcInRleHRcIiB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXIgbm9kZSB0eXBlc1xuICAgICAgICAgICAgdGhpcy5yb2xlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgY3JpdGVyaWFcbiAgICAgKiBAcGFyYW0gbWF0Y2hpbmdGdW5jIC0gRnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGEgbm9kZSBtYXRjaGVzIHRoZSBzZWFyY2ggY3JpdGVyaWFcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgbm9kZSB3YXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHB1YmxpYyBuZXh0KG1hdGNoaW5nRnVuYzogU1JDdXJzb3JNYXRjaEZ1bmMsIHNraXBGdW5jPzogU1JDdXJzb3JTa2lwRnVuYykgOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTtcblxuICAgICAgICAvLyBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBsZXQgZm91bmROZXh0ID0gZmFsc2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBza2lwIGluZm8gZm9yIHRoZSBjdXJyZW50IHNwb3RcbiAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKGBuZXh0IGZ1bmN0aW9uYCk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHRoaXMuaXNFbmRUYWcoKT9cIi9cIjpcIlwiLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgIGxldCB7IHNraXBDdXJyZW50LCBza2lwQ2hpbGRyZW4gfSA9IChza2lwRnVuYyAmJiBza2lwRnVuYyh0aGlzKSkgfHwgeyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJza2lwQ3VycmVudDpcIiwgc2tpcEN1cnJlbnQsIFwic2tpcENoaWxkcmVuOlwiLCBza2lwQ2hpbGRyZW4pO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIE1vdmUgYXMgYXBwcm9wcmlhdGUgZnJvbSB0aGUgY3VycmVudCBzcG90XG4gICAgICAgICAgICBpZiAoc2tpcENoaWxkcmVuICYmICF0aGlzLndhbGtlci5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53YWxrZXIuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLndhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2tpcCBpbmZvIGZvciB0aGUgbmV3IHNwb3RcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHRoaXMuaXNFbmRUYWcoKT9cIi9cIjpcIlwiLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgICAgICAoeyBza2lwQ3VycmVudCwgc2tpcENoaWxkcmVuIH0gPSAoc2tpcEZ1bmMgJiYgc2tpcEZ1bmModGhpcykpIHx8IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH0pO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJza2lwQ3VycmVudDpcIiwgc2tpcEN1cnJlbnQsIFwic2tpcENoaWxkcmVuOlwiLCBza2lwQ2hpbGRyZW4pO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgcm9sZSBiYXNlZCBvbiBub2RlIHR5cGVcbiAgICAgICAgICAgIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoU1JVdGlsLmlzTW9kYWxEaWFsb2dFbGVtZW50KHRoaXMuZ2V0Tm9kZSgpKSAmJiB0aGlzLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFza2lwQ3VycmVudCkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBtYXRjaGVzIG91ciBjcml0ZXJpYVxuICAgICAgICAgICAgICAgIGZvdW5kTmV4dCA9IG1hdGNoaW5nRnVuYyh0aGlzLnJvbGUsICF0aGlzLndhbGtlci5iRW5kVGFnLCB0aGlzLndhbGtlci5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoIWZvdW5kTmV4dCk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiZm91bmROZXh0OlwiLCBmb3VuZE5leHQsIHRoaXMuaXNFbmRUYWcoKT9cIi9cIjpcIlwiLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUuZ3JvdXBFbmQoKTtcblxuICAgICAgICBpZiAoZm91bmROZXh0KSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hOYW1lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSZXNldCBwcm9wZXJ0aWVzIGlmIG5vIG1hdGNoIHdhcyBmb3VuZFxuICAgICAgICAgICAgdGhpcy5yb2xlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZE5leHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgbm9kZSB0aGF0IG1hdGNoZXMgdGhlIHByb3ZpZGVkIGNyaXRlcmlhXG4gICAgICogQHBhcmFtIG1hdGNoaW5nRnVuYyAtIEZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyBpZiBhIG5vZGUgbWF0Y2hlcyB0aGUgc2VhcmNoIGNyaXRlcmlhXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIG5vZGUgd2FzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmlvdXMobWF0Y2hpbmdGdW5jOiBTUkN1cnNvck1hdGNoRnVuYywgc2tpcEZ1bmM/OiBTUkN1cnNvclNraXBGdW5jKSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBsZXQgZm91bmRQcmV2aW91cyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc2tpcCBpbmZvIGZvciB0aGUgY3VycmVudCBzcG90XG4gICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cChgcHJldmlvdXMgZnVuY3Rpb25gKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2codGhpcy5pc0VuZFRhZygpLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgIGxldCB7IHNraXBDdXJyZW50LCBza2lwQ2hpbGRyZW4gfSA9IChza2lwRnVuYyAmJiBza2lwRnVuYyh0aGlzKSkgfHwgeyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbik7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIE1vdmUgYXMgYXBwcm9wcmlhdGUgZnJvbSB0aGUgY3VycmVudCBzcG90XG4gICAgICAgICAgICBpZiAoc2tpcENoaWxkcmVuICYmIHRoaXMud2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIlNraXBwaW5nIG5vZGVcIilcbiAgICAgICAgICAgICAgICB0aGlzLndhbGtlci5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLndhbGtlci5wcmV2Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2tpcCBpbmZvIGZvciB0aGUgbmV3IHNwb3RcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHRoaXMuaXNFbmRUYWcoKSwgdGhpcy5nZXROb2RlKCkpO1xuICAgICAgICAgICAgKHsgc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbiB9ID0gKHNraXBGdW5jICYmIHNraXBGdW5jKHRoaXMpKSB8fCB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHNraXBDdXJyZW50LCBza2lwQ2hpbGRyZW4pO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgcm9sZSBiYXNlZCBvbiBub2RlIHR5cGVcbiAgICAgICAgICAgIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoU1JVdGlsLmlzTW9kYWxEaWFsb2dFbGVtZW50KHRoaXMuZ2V0Tm9kZSgpKSAmJiAhdGhpcy5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXNraXBDdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIG1hdGNoZXMgb3VyIGNyaXRlcmlhXG4gICAgICAgICAgICAgICAgZm91bmRQcmV2aW91cyA9IG1hdGNoaW5nRnVuYyh0aGlzLnJvbGUsICF0aGlzLndhbGtlci5iRW5kVGFnLCB0aGlzLndhbGtlci5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoIWZvdW5kUHJldmlvdXMpO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyh0aGlzLmlzRW5kVGFnKCksIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICBpZiAoZm91bmRQcmV2aW91cykge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVzZXQgcHJvcGVydGllcyBpZiBubyBtYXRjaCB3YXMgZm91bmRcbiAgICAgICAgICAgIHRoaXMucm9sZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm91bmRQcmV2aW91cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgY3VycmVudCBub2RlXG4gICAgICogQHBhcmFtIGVuZFRhZyAtIFdoZXRoZXIgdG8gcG9zaXRpb24gYXQgdGhlIGVuZCB0YWcgKHRydWUpIG9yIHN0YXJ0IHRhZyAoZmFsc2UpXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgbW92ZWQgdG8gcGFyZW50LCBmYWxzZSBpZiBubyBwYXJlbnQgZXhpc3RzXG4gICAgICovXG4gICAgcHVibGljIHBhcmVudChlbmRUYWc/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy53YWxrZXIubm9kZS5wYXJlbnROb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMud2Fsa2VyLm5vZGUgPSB0aGlzLndhbGtlci5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIHRoaXMud2Fsa2VyLmJFbmRUYWcgPSBlbmRUYWcgPT09IHRydWU7XG4gICAgICAgIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy53YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgdGhpcy5yb2xlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB7IG5hbWU6IHRoaXMud2Fsa2VyLm5vZGUudGV4dENvbnRlbnQsIG5hbWVGcm9tOiBcInRleHRcIiB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb2xlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdXAgdGhlIERPTSB0cmVlIHVudGlsIGZpbmRpbmcgYSBub2RlIHdpdGggYSBtYXRjaGluZyByb2xlIG9yIGVsZW1lbnQgbmFtZVxuICAgICAqIEBwYXJhbSByb2xlcyAtIEFycmF5IG9mIEFSSUEgcm9sZXMgdG8gbWF0Y2hcbiAgICAgKiBAcGFyYW0gZWxlbXMgLSBPcHRpb25hbCBhcnJheSBvZiBlbGVtZW50IG5hbWVzIHRvIG1hdGNoXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIG5vZGUgd2FzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlKHJvbGVzOiBzdHJpbmdbXSwgZWxlbXM/OiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCB1cHBFbGVtcyA9IGVsZW1zID8gZWxlbXMubWFwKGVsZW0gPT4gZWxlbS50b1VwcGVyQ2FzZSgpKSA6IFtdO1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gKHdhbGtlcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB3YWxrZXIuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJvbGVzLmluY2x1ZGVzKHRoaXMuZ2V0Um9sZSgpKVxuICAgICAgICAgICAgfHwgKGVsZW0gJiYgIWVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiB1cHBFbGVtcy5pbmNsdWRlcyhlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoIW1hdGNoZXModGhpcykgJiYgdGhpcy5wYXJlbnQoKSk7XG4gICAgICAgIHJldHVybiBtYXRjaGVzKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY3Vyc29yIGFuZCBtb3ZlcyBpdCB1cCB0aGUgRE9NIHRyZWUgdW50aWwgZmluZGluZyBhIG5vZGUgd2l0aCBhIG1hdGNoaW5nIHJvbGUgb3IgZWxlbWVudCBuYW1lXG4gICAgICogQHBhcmFtIHJvbGVzIC0gQXJyYXkgb2YgQVJJQSByb2xlcyB0byBtYXRjaFxuICAgICAqIEBwYXJhbSBlbGVtcyAtIE9wdGlvbmFsIGFycmF5IG9mIGVsZW1lbnQgbmFtZXMgdG8gbWF0Y2hcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBjdXJzb3IgYXQgdGhlIG1hdGNoaW5nIG5vZGUsIG9yIG51bGwgaWYgbm8gbWF0Y2ggZm91bmRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUocm9sZXM6IHN0cmluZ1tdLCBlbGVtcz86IHN0cmluZ1tdKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIGlmIChyZXRWYWwuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlKHJvbGVzLCBlbGVtcykpIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRPclBhcmVudFRhYmJhYmxlQ2xvbmUoKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHdoaWxlIChyZXRWYWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSByZXRWYWwuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgaWYgKHJldFZhbC5pc1N0YXJ0VGFnKCkgJiYgZWxlbSAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZXRWYWwucGFyZW50KGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIEFSSUEgcm9sZSBvZiB0aGUgY3VycmVudCBub2RlXG4gICAgICogQHJldHVybnMgVGhlIEFSSUEgcm9sZSBhcyBhIHN0cmluZywgb3IgdW5kZWZpbmVkIGlmIG5vdCBhdmFpbGFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Um9sZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5yb2xlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFjY2Vzc2libGUgbmFtZSBpbmZvIGZvciB0aGUgY3VycmVudCBub2RlXG4gICAgICogQHJldHVybnMgVGhlIEFjY2Vzc2libGVOYW1lUmVzdWx0IG9iamVjdCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBhdmFpbGFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmFtZUluZm8oKTogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYWNjZXNzaWJsZSBuYW1lIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICAvLyBIYW5kbGUgb25lLW9mZiBxdWlya3MgaW4gdGhlIG5hbWUgY2FsY3VsYXRpb25cbiAgICAgICAgY29uc3QgbmFtZUluZm8gPSB0aGlzLmdldE5hbWVJbmZvKCk7XG4gICAgICAgIGlmIChuYW1lSW5mbyAmJiBuYW1lSW5mby5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gbmFtZUluZm8ubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtID0gdGhpcy5nZXRFbGVtZW50KCk7XG4gICAgICAgIGlmIChlbGVtKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGVtLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxFbGVtLmlubmVyVGV4dCB8fCBsYWJlbEVsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGN1cnNvciBpcyBhdCBhbiBlbmQgdGFnIG9yIHN0YXJ0IHRhZ1xuICAgICAqIEBwYXJhbSB2YWwgLSBUcnVlIGZvciBlbmQgdGFnLCBmYWxzZSBmb3Igc3RhcnQgdGFnXG4gICAgICovXG4gICAgcHVibGljIHNldEVuZFRhZyh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy53YWxrZXIuYkVuZFRhZyA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBET00gbm9kZSBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBET00gbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53YWxrZXIubm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IG5vZGUgYXMgYW4gSFRNTEVsZW1lbnQgaWYgaXQgaXMgYW4gZWxlbWVudCBub2RlXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgbm9kZSBhcyBIVE1MRWxlbWVudCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBhbiBlbGVtZW50XG4gICAgICovXG4gICAgcHVibGljIGdldEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy53YWxrZXIubm9kZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzLndhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJlbnRFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMud2Fsa2VyLm5vZGUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcmV0VmFsID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXRWYWwud2Fsa2VyLm5vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChyZXRWYWwud2Fsa2VyLm5vZGUpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQgYXQgYW4gZW5kIHRhZ1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYXQgYW4gZW5kIHRhZywgZmFsc2UgaWYgYXQgYSBzdGFydCB0YWdcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFbmRUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhbGtlci5iRW5kVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQgYXQgYW4gZW5kIHRhZ1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYXQgYW4gZW5kIHRhZywgZmFsc2UgaWYgYXQgYSBzdGFydCB0YWdcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdGFydFRhZygpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLndhbGtlci5iRW5kVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBhcmVzIHRoZSBkb2N1bWVudCBwb3NpdGlvbiBvZiB0d28gY3Vyc29yc1xuICAgICAqIEBwYXJhbSBvbmUgLSBGaXJzdCBjdXJzb3IgdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSB0d28gLSBTZWNvbmQgY3Vyc29yIHRvIGNvbXBhcmVcbiAgICAgKiBAcmV0dXJucyAwIGlmIGVxdWFsLCAtMSBpZiBvbmUgaXMgYmVmb3JlIHR3bywgMSBpZiBvbmUgaXMgYWZ0ZXIgdHdvXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjb21wYXJlKG9uZTogU1JDdXJzb3IgfCBudWxsLCB0d286IFNSQ3Vyc29yIHwgbnVsbCkge1xuICAgICAgICBjb25zdCBub2RlT25lID0gb25lPy53YWxrZXI/Lm5vZGU7XG4gICAgICAgIGNvbnN0IG5vZGVUd28gPSB0d28/LndhbGtlcj8ubm9kZTtcbiAgICAgICAgaWYgKCFub2RlT25lICYmICFub2RlVHdvKSByZXR1cm4gMDtcbiAgICAgICAgaWYgKCFub2RlT25lKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKCFub2RlVHdvKSByZXR1cm4gLTE7XG5cbiAgICAgICAgLy8gV2hlbiBib3RoIGN1cnNvcnMgYXJlIGF0IHRoZSBzYW1lIDxwcmU+IGVsZW1lbnQgYW5kIGF0IGxlYXN0IG9uZSBoYXMgYVxuICAgICAgICAvLyBwcmVMaW5lSW5kZXgsIHVzZSBsaW5lIGluZGV4IG9yZGVyaW5nIHNvIHZpcnR1YWwgcGVyLWxpbmUgc3RvcHMgYXJlIHNlcXVlbmNlZFxuICAgICAgICAvLyBjb3JyZWN0bHkuICBwcmVMaW5lSW5kZXg9dW5kZWZpbmVkIG1lYW5zIHRoZSBibG9jay1lbnRlciBzdG9wLCB3aGljaCBjb21lc1xuICAgICAgICAvLyBiZWZvcmUgYWxsIG51bWJlcmVkIGxpbmVzICh1bmRlZmluZWQgPCAwIDwgMSA8IDIg4oCmKS5cbiAgICAgICAgaWYgKG5vZGVPbmUgPT09IG5vZGVUd28gJiYgIW9uZS53YWxrZXIuYkVuZFRhZyAmJiAhdHdvLndhbGtlci5iRW5kVGFnKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lT25lVW5kZWZpbmVkID0gb25lLnByZUxpbmVJbmRleCA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbGluZVR3b1VuZGVmaW5lZCA9IHR3by5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghbGluZU9uZVVuZGVmaW5lZCB8fCAhbGluZVR3b1VuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIEF0IGxlYXN0IG9uZSBjdXJzb3IgaGFzIGEgbGluZSBpbmRleFxuICAgICAgICAgICAgICAgIGlmIChsaW5lT25lVW5kZWZpbmVkKSByZXR1cm4gLTE7ICAvLyB1bmRlZmluZWQgKGJsb2NrLWVudGVyKSBzb3J0cyBiZWZvcmUgYWxsIGxpbmVzXG4gICAgICAgICAgICAgICAgaWYgKGxpbmVUd29VbmRlZmluZWQpIHJldHVybiAxOyAgIC8vIHR3byBpcyBibG9jay1lbnRlcjsgb25lIChhIG51bWJlcmVkIGxpbmUpIGlzIGFmdGVyXG4gICAgICAgICAgICAgICAgaWYgKG9uZS5wcmVMaW5lSW5kZXggIT09IHR3by5wcmVMaW5lSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uZS5wcmVMaW5lSW5kZXggPCB0d28ucHJlTGluZUluZGV4ID8gLTEgOiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IGRvY1Bvc2l0aW9uID0gbm9kZU9uZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlVHdvKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEhhbmRsZSBkaXNjb25uZWN0ZWQgbm9kZXMgKGRpZmZlcmVudCBkb2N1bWVudHMgb3Igc2hhZG93IERPTXMpXG4gICAgICAgIGlmIChkb2NQb3NpdGlvbiAmIDB4MSkge1xuICAgICAgICAgICAgLy8gTm9kZXMgYXJlIGRpc2Nvbm5lY3RlZCAtIHRoZXkncmUgaW4gZGlmZmVyZW50IHRyZWVzIChpZnJhbWUgb3Igc2hhZG93IERPTSlcbiAgICAgICAgICAgIC8vIEJ1aWxkIGFuY2VzdG9yIGNoYWlucyB1c2luZyBET01XYWxrZXIucGFyZW50Tm9kZSAoaGFuZGxlcyBzaGFkb3cgRE9NICYgaWZyYW1lcylcbiAgICAgICAgICAgIGxldCBhbmNlc3RvcnNPbmU6IE5vZGVbXSA9IFtub2RlT25lXTtcbiAgICAgICAgICAgIGxldCBhbmNlc3RvcnNUd286IE5vZGVbXSA9IFtub2RlVHdvXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IGN1cnJlbnQ6IE5vZGUgfCBudWxsID0gbm9kZU9uZTtcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgICBhbmNlc3RvcnNPbmUucHVzaChjdXJyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY3VycmVudCA9IG5vZGVUd287XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgICAgYW5jZXN0b3JzVHdvLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFJldmVyc2Ugc28gcm9vdCBpcyBmaXJzdFxuICAgICAgICAgICAgYW5jZXN0b3JzT25lLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGFuY2VzdG9yc1R3by5yZXZlcnNlKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEZpbmQgd2hlcmUgdGhlIHBhdGhzIGRpdmVyZ2VcbiAgICAgICAgICAgIGxldCBjb21tb25EZXB0aCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoY29tbW9uRGVwdGggPCBhbmNlc3RvcnNPbmUubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgY29tbW9uRGVwdGggPCBhbmNlc3RvcnNUd28ubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgYW5jZXN0b3JzT25lW2NvbW1vbkRlcHRoXSA9PT0gYW5jZXN0b3JzVHdvW2NvbW1vbkRlcHRoXSkge1xuICAgICAgICAgICAgICAgIGNvbW1vbkRlcHRoKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIElmIG9uZSBwYXRoIGlzIGEgcHJlZml4IG9mIHRoZSBvdGhlciwgaGFuZGxlIGNvbnRhaW5tZW50XG4gICAgICAgICAgICBpZiAoY29tbW9uRGVwdGggPT09IGFuY2VzdG9yc09uZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBub2RlT25lIGlzIGFuIGFuY2VzdG9yIG9mIG5vZGVUd29cbiAgICAgICAgICAgICAgICByZXR1cm4gb25lLndhbGtlci5iRW5kVGFnID8gMSA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbW1vbkRlcHRoID09PSBhbmNlc3RvcnNUd28ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gbm9kZVR3byBpcyBhbiBhbmNlc3RvciBvZiBub2RlT25lXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR3by53YWxrZXIuYkVuZFRhZyA/IC0xIDogMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ29tcGFyZSB0aGUgbm9kZXMgd2hlcmUgcGF0aHMgZGl2ZXJnZVxuICAgICAgICAgICAgaWYgKGNvbW1vbkRlcHRoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZE9uZSA9IGFuY2VzdG9yc09uZVtjb21tb25EZXB0aF07XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkVHdvID0gYW5jZXN0b3JzVHdvW2NvbW1vbkRlcHRoXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRQb3NpdGlvbiA9IGNoaWxkT25lLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGNoaWxkVHdvKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRQb3NpdGlvbiAmIDB4MikgcmV0dXJuIDE7ICAvLyBjaGlsZFR3byBwcmVjZWRlcyBjaGlsZE9uZVxuICAgICAgICAgICAgICAgIGlmIChjaGlsZFBvc2l0aW9uICYgMHg0KSByZXR1cm4gLTE7IC8vIGNoaWxkT25lIHByZWNlZGVzIGNoaWxkVHdvXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE5vIGNvbW1vbiBhbmNlc3RvciBmb3VuZCAtIHNob3VsZG4ndCBoYXBwZW4gaW4gYSB3ZWxsLWZvcm1lZCBkb2N1bWVudFxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChkb2NQb3NpdGlvbiAmIDB4OCkge1xuICAgICAgICAgICAgLy8gb25lIGlzIGNvbnRhaW5lZCB3aXRoaW4gdHdvXG4gICAgICAgICAgICAvLyBpZiB0d28gaXMgYW4gZW5kIHRhZywgb25lIGlzIGJlZm9yZSwgb3RoZXJ3aXNlLCBvbmUgaXMgYWZ0ZXJcbiAgICAgICAgICAgIHJldHVybiB0d28ud2Fsa2VyLmJFbmRUYWcgPyAtMSA6IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9jUG9zaXRpb24gJiAweDEwKSB7XG4gICAgICAgICAgICAvLyB0d28gaXMgY29udGFpbmVkIHdpdGhpbiBvbmVcbiAgICAgICAgICAgIC8vIGlmIG9uZSBpcyBhbiBlbmQgdGFnLCBvbmUgaXMgYWZ0ZXIsIG90aGVyd2lzZSwgb25lIGlzIGJlZm9yZVxuICAgICAgICAgICAgcmV0dXJuIG9uZS53YWxrZXIuYkVuZFRhZyA/IDEgOiAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChkb2NQb3NpdGlvbiAmIDB4Mikge1xuICAgICAgICAgICAgLy8gdHdvIHByZWNlZGVzIG9uZSBpbiB0aGUgZG9jdW1lbnRcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9IGVsc2UgaWYgKGRvY1Bvc2l0aW9uICYgMHg0KSB7XG4gICAgICAgICAgICAvLyBvbmUgcHJlY2VkZXMgdHdvIGluIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIGN1cnNvcidzIG5vZGUgY29udGFpbnMgYW5vdGhlciBjdXJzb3IncyBub2RlXG4gICAgICogQHBhcmFtIG90aGVyIC0gVGhlIG90aGVyIGN1cnNvciB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBjdXJzb3IgY29udGFpbnMgKGlzIGEgcGFyZW50L2FuY2VzdG9yIG9mKSB0aGUgb3RoZXIgY3Vyc29yJ3Mgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBjb250YWlucyhvdGhlcjogU1JDdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZSgpLmNvbnRhaW5zKG90aGVyLmdldE5vZGUoKSlcbiAgICAgICAgICAgICYmICF0aGlzLmlzU2FtZU5vZGUob3RoZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIGN1cnNvciBwb2ludHMgdG8gdGhlIHNhbWUgbm9kZSBhcyBhbm90aGVyIGN1cnNvclxuICAgICAqIEBwYXJhbSBvdGhlciAtIFRoZSBvdGhlciBjdXJzb3IgdG8gY29tcGFyZSB3aXRoXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBib3RoIGN1cnNvcnMgcG9pbnQgdG8gdGhlIHNhbWUgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1NhbWVOb2RlKG90aGVyOiBTUkN1cnNvcikge1xuICAgICAgICBpZiAoIW90aGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE5vZGUoKS5pc1NhbWVOb2RlKG90aGVyLmdldE5vZGUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIGEgbm9uLWVtcHR5IGFjY2Vzc2libGUgbmFtZVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaGFzIGEgbm9uLWVtcHR5IGFjY2Vzc2libGUgbmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNOb25FbXB0eU5hbWUoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5nZXROYW1lSW5mbygpPy5uYW1lIHx8IFwiXCIpLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIH1cblxufSIsImltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uTW9kZSB9IGZyb20gXCIuL1NSVHlwZXNcIjtcbmltcG9ydCB7IFNSQ3Vyc29yLCBTUkN1cnNvck1hdGNoRnVuYywgU1JDdXJzb3JTa2lwRnVuYyB9IGZyb20gXCIuL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcblxuZXhwb3J0IG5hbWVzcGFjZSBTUk5hdmlnYXRvciB7XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIGlmIGEgbm9kZSBpcyBhIGJsb2NrLWxldmVsIGVsZW1lbnQgYmFzZWQgb24gaXRzIGRpc3BsYXkgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0gbm9kZSBUaGUgRE9NIG5vZGUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIGlzIGEgYmxvY2stbGV2ZWwgZWxlbWVudCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNCbG9ja0VsZW1lbnQobm9kZTogTm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoW1wiYnJcIiwgXCJpZnJhbWVcIl0uaW5jbHVkZXMobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBteXdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgICAgY29uc3QgZGlzcCA9IG15d2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSk/LmRpc3BsYXk7XG4gICAgICAgIGlmIChkaXNwICYmIGRpc3Auc3RhcnRzV2l0aChcInRhYmxlXCIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGRpc3AgPT09IFwiYmxvY2tcIiAmJiBlbGVtLnN0eWxlLmRpc3BsYXkgIT09IFwiYmxvY2tcIikge1xuICAgICAgICAgICAgLy8gSXMgdGhpcyBibG9jayBiZWNhdXNlIGl0J3MgYSBmbGV4IGVsZW0/XG4gICAgICAgICAgICBpZiAoZWxlbS5wYXJlbnRFbGVtZW50ICYmIG15d2luLmdldENvbXB1dGVkU3R5bGUoZWxlbS5wYXJlbnRFbGVtZW50KS5kaXNwbGF5ID09PSBcImZsZXhcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0sIHRydWUpID09PSBcImxpbmtcIikge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBuZXcgRE9NV2Fsa2VyKG5vZGUsIGZhbHNlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgICAgIHRlbXAucHJldk5vZGUoKTtcbiAgICAgICAgICAgIGlmICghaXNCbG9ja0VsZW1lbnQodGVtcC5ub2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXCJibG9ja1wiLCBcImZsZXhcIiwgXCJncmlkXCIsIFwibGlzdC1pdGVtXCJdLmluY2x1ZGVzKGRpc3ApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3QgYWxsIGxvZ2ljYWwgbGluZXMgZnJvbSBhIDxwcmU+IGVsZW1lbnQgYnkgd2Fsa2luZyBpdHMgZW50aXJlIHN1YnRyZWVcbiAgICAgKiAodmlhIERPTVdhbGtlciwgc2hhZG93LURPTSBzYWZlKSBhbmQgY29uY2F0ZW5hdGluZyB0ZXh0IG5vZGUgY29udGVudCwgc3BsaXR0aW5nXG4gICAgICogb24gbmV3bGluZXMuICBPbmx5IGlubGluZS1jb250ZXh0IG5vZGVzIGFyZSBpbmNsdWRlZCDigJQgYW55IGRlc2NlbmRhbnQgYmxvY2tcbiAgICAgKiBlbGVtZW50IHdvdWxkIGJlIHVudXN1YWwgaW5zaWRlIDxwcmU+IGFuZCBpcyBpZ25vcmVkLlxuICAgICAqXG4gICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCwgbm9uLWVtcHR5IGxpbmVzLlxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmVMaW5lcyhwcmVFbGVtOiBIVE1MRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgLy8gQ29uY2F0ZW5hdGUgYWxsIHRleHQgaW5zaWRlIHRoZSA8cHJlPiwgcHJlc2VydmluZyBpbmxpbmUgc3RydWN0dXJlXG4gICAgICAgIGxldCBmdWxsVGV4dCA9IHByZUVsZW0udGV4dENvbnRlbnQgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgcmF3TGluZXMgPSBmdWxsVGV4dC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgLy8gVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBibGFuayBsaW5lc1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICB3aGlsZSAoc3RhcnQgPCByYXdMaW5lcy5sZW5ndGggJiYgcmF3TGluZXNbc3RhcnRdLnRyaW0oKSA9PT0gXCJcIikgc3RhcnQrKztcbiAgICAgICAgbGV0IGVuZCA9IHJhd0xpbmVzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChlbmQgPj0gc3RhcnQgJiYgcmF3TGluZXNbZW5kXS50cmltKCkgPT09IFwiXCIpIGVuZC0tO1xuICAgICAgICByZXR1cm4gcmF3TGluZXMuc2xpY2Uoc3RhcnQsIGVuZCArIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGEgPHByZT4gZWxlbWVudCAodGhlIGl0ZW0tbGV2ZWwgY3Vyc29yIHBvc2l0aW9uIGZvclxuICAgICAqIHByZWZvcm1hdHRlZCBsaW5lcyB1c2VzIHRoZSA8cHJlPiBlbGVtZW50IGl0c2VsZiB3aXRoIHByZUxpbmVJbmRleCBzZXQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUHJlRWxlbWVudChub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAxICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlBSRVwiO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEV4cGxpY2l0VGFiaW5kZXgobm9kZTogTm9kZSk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB0YWJpbmRleFZhbHVlID0gcGFyc2VJbnQoZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSwgMTApO1xuICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHRhYmluZGV4VmFsdWUpID8gbnVsbCA6IHRhYmluZGV4VmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNQb3NpdGl2ZVRhYkZvY3VzKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGV4cGxpY2l0VGFiaW5kZXggPSBnZXRFeHBsaWNpdFRhYmluZGV4KGVsZW0pO1xuICAgICAgICByZXR1cm4gZXhwbGljaXRUYWJpbmRleCAhPT0gbnVsbCAmJiBleHBsaWNpdFRhYmluZGV4ID4gMCAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlbSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEZWZhdWx0T3JaZXJvVGFiRm9jdXMobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgZXhwbGljaXRUYWJpbmRleCA9IGdldEV4cGxpY2l0VGFiaW5kZXgoZWxlbSk7XG4gICAgICAgIHJldHVybiAoZXhwbGljaXRUYWJpbmRleCA9PT0gbnVsbCB8fCBleHBsaWNpdFRhYmluZGV4ID09PSAwKSAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlbSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VGFiRm9jdXNTdGFydEZ1bmMoaW5jbHVkZVBvc2l0aXZlVGFiaW5kZXg6IGJvb2xlYW4gPSB0cnVlKTogU1JDdXJzb3JNYXRjaEZ1bmMge1xuICAgICAgICByZXR1cm4gKF9yb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCEobm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSAxICYmIGJTdGFydFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobm9kZSkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gaW5jbHVkZVBvc2l0aXZlVGFiaW5kZXggfHwgaXNEZWZhdWx0T3JaZXJvVGFiRm9jdXMobm9kZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sbGVjdCBhbGwgdGFiYmFibGUgZWxlbWVudHMgaW4gdGFiIG9yZGVyIChwb3NpdGl2ZSB0YWJpbmRleCBmaXJzdCwgdGhlbiBkb2N1bWVudCBvcmRlcilcbiAgICAgKiBAcGFyYW0gbWF0Y2hGdW5jIEZ1bmN0aW9uIHRvIG1hdGNoIHRhYmJhYmxlIGVsZW1lbnRzXG4gICAgICogQHBhcmFtIHJvb3ROb2RlIE9wdGlvbmFsIHJvb3Qgbm9kZSB0byBzdGFydCBjb2xsZWN0aW9uIGZyb20gKGRlZmF1bHRzIHRvIGRvY3VtZW50IGJvZHkpXG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY3Vyc29ycyBwb2ludGluZyB0byB0YWJiYWJsZSBlbGVtZW50cyBpbiB0YWIgb3JkZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb2xsZWN0VGFiRm9jdXNDdXJzb3JzKG1hdGNoRnVuYzogU1JDdXJzb3JNYXRjaEZ1bmMsIHJvb3ROb2RlPzogTm9kZSk6IFNSQ3Vyc29yW10ge1xuICAgICAgICBjb25zdCByb290ID0gKHJvb3ROb2RlPy5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50KS5ib2R5IHx8IHJvb3ROb2RlO1xuICAgICAgICBpZiAoIXJvb3QpIHJldHVybiBbXTtcbiAgICAgICAgbGV0IHdhbGtlciA9IG5ldyBTUkN1cnNvcihyb290LCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IHNraXBGdW5jID0gZ2V0U2tpcEZ1bmMoXCJ0YWJfZm9jdXNcIik7XG4gICAgICAgIGxldCBwb3NpdGl2ZVJlc3VsdHM6IFNSQ3Vyc29yW10gPSBbXTtcbiAgICAgICAgbGV0IG5vcm1hbFJlc3VsdHM6IFNSQ3Vyc29yW10gPSBbXTtcblxuICAgICAgICBjb25zdCBhZGRDdXJzb3IgPSAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgaWYgKCFtYXRjaEZ1bmMoY3Vyc29yLmdldFJvbGUoKSwgIWN1cnNvci5pc0VuZFRhZygpLCBjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGlzUG9zaXRpdmVUYWJGb2N1cyhjdXJzb3IuZ2V0Tm9kZSgpKSkge1xuICAgICAgICAgICAgICAgIHBvc2l0aXZlUmVzdWx0cy5wdXNoKGN1cnNvci5jbG9uZSgpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNEZWZhdWx0T3JaZXJvVGFiRm9jdXMoY3Vyc29yLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgICAgICBub3JtYWxSZXN1bHRzLnB1c2goY3Vyc29yLmNsb25lKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGFkZEN1cnNvcih3YWxrZXIpO1xuICAgICAgICB3aGlsZSAod2Fsa2VyLm5leHQoKCkgPT4gdHJ1ZSwgc2tpcEZ1bmMpKSB7XG4gICAgICAgICAgICBhZGRDdXJzb3Iod2Fsa2VyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvc2l0aXZlUmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhRWxlbSA9IGEuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgYkVsZW0gPSBiLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGFUYWJpbmRleCA9IGdldEV4cGxpY2l0VGFiaW5kZXgoYUVsZW0pIHx8IDA7XG4gICAgICAgICAgICBjb25zdCBiVGFiaW5kZXggPSBnZXRFeHBsaWNpdFRhYmluZGV4KGJFbGVtKSB8fCAwO1xuICAgICAgICAgICAgaWYgKGFUYWJpbmRleCAhPT0gYlRhYmluZGV4KSByZXR1cm4gYlRhYmluZGV4IC0gYVRhYmluZGV4O1xuICAgICAgICAgICAgcmV0dXJuIFNSQ3Vyc29yLmNvbXBhcmUoYSwgYik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwb3NpdGl2ZVJlc3VsdHMuY29uY2F0KG5vcm1hbFJlc3VsdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIGluZGV4IG9mIGEgY3Vyc29yIGluIGFuIGFycmF5IG9mIHRhYiBmb2N1cyBjdXJzb3JzXG4gICAgICogQHBhcmFtIGN1cnNvcnMgQXJyYXkgb2YgY3Vyc29ycyB0byBzZWFyY2hcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIFRoZSBjdXJzb3IgdG8gZmluZFxuICAgICAqIEByZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgY3Vyc29yLCBvciAtMSBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kVGFiRm9jdXNJbmRleChjdXJzb3JzOiBTUkN1cnNvcltdLCB3YWxrZXI6IFNSQ3Vyc29yKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGN1cnNvcnMuZmluZEluZGV4KGN1cnNvciA9PiBTUkN1cnNvci5jb21wYXJlKGN1cnNvciwgd2Fsa2VyKSA9PT0gMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtYXRjaCBmdW5jdGlvbiBmb3IgaWRlbnRpZnlpbmcgc3RhcnQgcG9zaXRpb25zIGluIGEgZ2l2ZW4gbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSAoZS5nLiwgXCJsaW5rXCIsIFwiaGVhZGluZ1wiLCBcImJ1dHRvblwiLCBldGMuKVxuICAgICAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBtYXRjaGVzIGVsZW1lbnRzIGFwcHJvcHJpYXRlIGZvciB0aGUgbmF2aWdhdGlvbiBtb2RlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXJ0RnVuYyhtb2RlOiBOYXZpZ2F0aW9uTW9kZSkgOiBTUkN1cnNvck1hdGNoRnVuYyB7XG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgICAgY2FzZSBcImxpbmtcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwibGlua1wiKTtcbiAgICAgICAgICAgIGNhc2UgXCJ0YWJfZm9jdXNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VGFiRm9jdXNTdGFydEZ1bmMoZmFsc2UpO1xuICAgICAgICAgICAgY2FzZSBcImhlYWRpbmdcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoMVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmFyaWFMZXZlbCA9PT0gXCIxXCIpO1xuICAgICAgICAgICAgY2FzZSBcImgyXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImhlYWRpbmdcIiAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuYXJpYUxldmVsID09PSBcIjJcIik7XG4gICAgICAgICAgICBjYXNlIFwiaDNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5hcmlhTGV2ZWwgPT09IFwiM1wiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoNFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmFyaWFMZXZlbCA9PT0gXCI0XCIpO1xuICAgICAgICAgICAgY2FzZSBcImg1XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImhlYWRpbmdcIiAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuYXJpYUxldmVsID09PSBcIjVcIik7XG4gICAgICAgICAgICBjYXNlIFwiaDZcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5hcmlhTGV2ZWwgPT09IFwiNlwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJpbWFnZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgW1wiaW1nXCIsIFwiZ3JhcGhpY3MtZG9jdW1lbnRcIl0uaW5jbHVkZXMocm9sZSkpO1xuICAgICAgICAgICAgY2FzZSBcInJhZGlvXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcInJhZGlvXCIpO1xuICAgICAgICAgICAgY2FzZSBcImJ1dHRvblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJidXR0b25cIik7XG4gICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiY2hlY2tib3hcIik7XG4gICAgICAgICAgICBjYXNlIFwiY29tYm9cIjogICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImNvbWJvYm94XCIpO1xuICAgICAgICAgICAgY2FzZSBcImxpc3RcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwibGlzdFwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0aXRlbVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJsaXN0aXRlbVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJhcnRpY2xlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImFydGljbGVcIik7XG4gICAgICAgICAgICBjYXNlIFwidGFibGVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwidGFibGVcIik7XG4gICAgICAgICAgICBjYXNlIFwicGFyYWdyYXBoXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChfcm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiUFwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJkb21cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gdHJ1ZTtcbiAgICAgICAgICAgIGNhc2UgXCJpdGVtXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChjdXJzb3I6IFNSQ3Vyc29yIHwgYW55LCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiU3RhcnRUYWcpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gPGlmcmFtZT4gY29udGVudCBpcyBpbmxpbmVkIGJ5IHRoZSBJRlJBTUUgU1JfUlVMRSBpbnRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgYmxvY2sncyByZW5kZXJpbmcg4oCUIHRoZSBpZnJhbWUgaXRzZWxmIGlzIG5vdCBhbiBpdGVtIHN0b3AuXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgPHByZT4gZWxlbWVudCB3aXRoIHByZUxpbmVJbmRleCBzZXQgaXMgYSB2aXJ0dWFsIHBlci1saW5lIGl0ZW0uXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbml0aWFsIGVuY291bnRlciAocHJlTGluZUluZGV4IHVuZGVmaW5lZCkgaXMgYWxzbyBhIG1hdGNoIHNvXG4gICAgICAgICAgICAgICAgICAgIC8vIGp1bXBOZXh0IGNhbiBzZXQgcHJlTGluZUluZGV4PTAgb24gaXQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ByZUVsZW1lbnQobm9kZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNCbG9ja0VsZW1lbnQobm9kZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gbmV3IERPTVdhbGtlcihub2RlLCAhYlN0YXJ0VGFnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAucHJldk5vZGUoKSAmJiB0ZW1wLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0Jsb2NrRWxlbWVudCh0ZW1wLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicmVnaW9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJTdGFydFRhZykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoW1wibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJmb3JtXCIsIFwiYmFubmVyXCIsIFwic2VhcmNoXCIsIFwiY29udGVudGluZm9cIl0uaW5jbHVkZXMocm9sZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSAhPT0gXCJyZWdpb25cIiB8fCBub2RlPy5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUobm9kZSBhcyBIVE1MRWxlbWVudCk/Lm5hbWU/LnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FzZSBcImZvcm1jb250cm9sXCI6XG4gICAgICAgICAgICBjYXNlIFwiZWRpdGJveFwiOlxuICAgICAgICAgICAgY2FzZSBcImdyYXBoaWNcIjpcbiAgICAgICAgICAgIGNhc2UgXCJmcmFtZVwiOlxuICAgICAgICAgICAgY2FzZSBcImRpdmlzaW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwidGFiY29udHJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcInNlcGFyYXRvclwiOlxuICAgICAgICAgICAgY2FzZSBcImNsaWNrYWJsZVwiOlxuICAgICAgICAgICAgY2FzZSBcIm1vdXNlb3ZlclwiOlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVF9JTVBMRU1FTlRFRFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGlzIHdpdGhpbiBhIFNoYWRvdyBET01cbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgaW4gYSBTaGFkb3cgRE9NLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBjb25zdCBpc0luU2hhZG93RE9NID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIHJldHVybiByb290IGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgc2tpcCBiZWhhdmlvciBmb3IgaXRlbSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBIYW5kbGVzIGNvbXBsZXggdmlzaWJpbGl0eSBydWxlcyBpbmNsdWRpbmcgaGlkZGVuIGNvbnRlbnQgaW4gaGVhZGluZ3MvbGlua3NcbiAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBPYmplY3QgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHNraXAgY3VycmVudCBub2RlIGFuZC9vciBpdHMgY2hpbGRyZW4sIG9yIG51bGwgZm9yIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgKi9cbiAgICBjb25zdCBTS0lQX0lURU1fQkVIQVZJT1IgPSAoY3Vyc29yOiBTUkN1cnNvcikgOiB7IHNraXBDdXJyZW50OiBib29sZWFuLCBza2lwQ2hpbGRyZW46IGJvb2xlYW59IHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUuZ3JvdXAoXCJTS0lQX0lURU1fQkVIQVZJT1JcIik7XG4gICAgICAgIGxldCByZXRWYWw6IHsgc2tpcEN1cnJlbnQ6IGJvb2xlYW4sIHNraXBDaGlsZHJlbjogYm9vbGVhbn0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVUeXBlID0gY3Vyc29yLmdldE5vZGUoKS5ub2RlVHlwZTtcbiAgICAgICAgICAgIGxldCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclN0YXJ0ID0gY3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICBjdXJzb3JTdGFydC5zZXRFbmRUYWcoZmFsc2UpO1xuXG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhub2RlVHlwZSk7XG4gICAgICAgICAgICAvLyBTa2lwIENEQVRBIGFuZCBjb21tZW50cyBjb21wbGV0ZWx5XG4gICAgICAgICAgICBpZiAoWzQsIDhdLmluY2x1ZGVzKG5vZGVUeXBlKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgLy8gT25seSBwcm9jZXNzIGVsZW1lbnRzIGFuZCB0ZXh0XG4gICAgICAgICAgICBpZiAoIVsxLDNdLmluY2x1ZGVzKG5vZGVUeXBlKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcblxuICAgICAgICAgICAgLy8gRm9yIHRleHQgZWxlbWVudHMsIENvbnNpZGVyIHdpdGggcmVsYXRpb24gdG8gdGhlaXIgcGFyZW50IGVsZW1lbnRcbiAgICAgICAgICAgIGlmIChub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIGVsZW0gPSBjdXJzb3IuZ2V0Tm9kZSgpLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gcmV0VmFsID0gVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkgPyB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH0gOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgKCFlbGVtKSBjb25zb2xlLmxvZyhjdXJzb3IuZ2V0Tm9kZSgpKTtcblxuICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbiBlbGVtZW50XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSB3aXRoaW4gdGhlIGJvZHkgZWxlbWVudCAob3Igc2hhZG93IERPTSwgb3IgYW4gaWZyYW1lIHN1YmRvY3VtZW50KVxuICAgICAgICAgICAgaWYgKCFlbGVtLmNsb3Nlc3QoXCJib2R5XCIpICYmICFpc0luU2hhZG93RE9NKGVsZW0pKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UncmUgbm90IGluIGEgc2NyaXB0IG9yIHN0eWxlXG4gICAgICAgICAgICBpZiAoZWxlbS5jbG9zZXN0KFwic2NyaXB0LHN0eWxlXCIpKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG5cbiAgICAgICAgICAgIC8vIEZvciB0ZXh0IG5vZGVzLCB3ZSBuZWVkIHRvIGNoZWNrIHZpc2liaWxpdHkgaW4gY29udGV4dCBvZiBwYXJlbnQgaGVhZGluZy9saW5rXG4gICAgICAgICAgICAvLyBTbyB3ZSdsbCBoYW5kbGUgdGV4dCBub2RlIHZpc2liaWxpdHkgY2hlY2tzIGJlbG93IHdpdGggdGhlIGVsZW1lbnQgdmlzaWJpbGl0eSBjaGVja3NcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2tpcCB0aGluZ3MgaGlkZGVuIGZyb20gdGhlIEFULCBVTkxFU1Mgd2UncmUgaW5zaWRlIGEgaGVhZGluZyBvciBsaW5rXG4gICAgICAgICAgICAvLyAoaGVhZGluZ3MgYW5kIGxpbmtzIHNob3VsZCBpbmNsdWRlIHRoZWlyIGZ1bGwgYWNjZXNzaWJsZSBuYW1lLCBpbmNsdWRpbmcgaGlkZGVuIHBhcnRzKVxuICAgICAgICAgICAgLy8gQlVUIG9ubHkgaWYgdGhlIGhlYWRpbmcvbGluayB1c2VzIG5hbWVGcm9tPVwiY29udGVudFwiIChub3QgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnkpXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRIZWFkaW5nT3JMaW5rID0gY3Vyc29yU3RhcnQuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiaGVhZGluZ1wiLCBcImxpbmtcIl0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IGlmIGN1cnJlbnQgZWxlbWVudCBpdHNlbGYgaXMgYSBoZWFkaW5nIG9yIGxpbmsgQU5EIHdlJ3JlIE5PVCBpbnNpZGUgYW5vdGhlciBoZWFkaW5nL2xpbmssXG4gICAgICAgICAgICAvLyBhcHBseSBub3JtYWwgc2tpcCBydWxlc1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSk7XG4gICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRIZWFkaW5nT3JMaW5rID0gY3VycmVudFJvbGUgPT09IFwiaGVhZGluZ1wiIHx8IGN1cnJlbnRSb2xlID09PSBcImxpbmtcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFwYXJlbnRIZWFkaW5nT3JMaW5rKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90IGluc2lkZSBhbnkgaGVhZGluZy9saW5rIC0gYXBwbHkgbm9ybWFsIHNraXAgcnVsZXNcbiAgICAgICAgICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkpIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IG5vZGVUeXBlID09PSAxIH07XG4gICAgICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbSkpIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IG5vZGVUeXBlID09PSAxIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJlbnQgaGVhZGluZy9saW5rIHVzZXMgYXJpYS1sYWJlbCBvciBhcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRFbGVtID0gcGFyZW50SGVhZGluZ09yTGluay5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZUluZm8gPSBwYXJlbnRIZWFkaW5nT3JMaW5rLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gSWYgbmFtZUZyb20gaXMgTk9UIFwiY29udGVudFwiIG9yIFwidGV4dFwiLCBza2lwIGFsbCBjb250ZW50IChpdCdzIHVzaW5nIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5KVxuICAgICAgICAgICAgICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBhcmVudCB1c2VzIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5IC0gc2tpcCBhbGwgY29udGVudCBpbmNsdWRpbmcgbmVzdGVkIGhlYWRpbmdzL2xpbmtzXG4gICAgICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDdXJyZW50SGVhZGluZ09yTGluaykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGVsZW1lbnQgaXMgYSBoZWFkaW5nL2xpbmsgaW5zaWRlIGFub3RoZXIgaGVhZGluZy9saW5rIHdpdGggY29udGVudC1iYXNlZCBuYW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgaXQgLSBsZXQgaXQgdGhyb3VnaCBzbyBpdHMgY29udGVudCBjYW4gYmUgcmVhZFxuICAgICAgICAgICAgICAgICAgICAvLyAoVGhlIGxvZ2ljIGF0IGxpbmUgMTgzIHdpbGwgaGFuZGxlIHdoZXRoZXIgdG8gc2tpcCBpdHMgY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZUZyb20gaXMgXCJjb250ZW50XCIsIHNvIGluY2x1ZGUgaGlkZGVuIGNvbnRlbnQgYnV0IHNraXAgaGlkZGVuIGltYWdlcy9ncmFwaGljc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJvbGUgPT09IFwiaW1nXCIgfHwgcm9sZSA9PT0gXCJncmFwaGljcy1kb2N1bWVudFwiKSAmJiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgb3RoZXIgaGlkZGVuIGNvbnRlbnQgLSBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGFjY2Vzc2libGUgbmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiQk9EWVwiKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcblxuICAgICAgICAgICAgLy8gU2tpcCBsYWJlbHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGNvbnRyb2xzIC0gdGhleSdsbCBiZSByZWFkIHdpdGggdGhlIHJlbGF0ZWQgaW5wdXQuXG4gICAgICAgICAgICAvLyBLZWVwIGNoaWxkcmVuIHNvIGludGVyYWN0aXZlIGNvbnRlbnQgKGUuZy4gbGlua3MpIGluc2lkZSB0aGUgbGFiZWwgc3RpbGwgYXBwZWFycyBpblxuICAgICAgICAgICAgLy8gcmVhZGluZy90YWIgb3JkZXIuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkxBQkVMXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVsZW0uaGFzQXR0cmlidXRlKFwiZm9yXCIpXG4gICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpKVxuICAgICAgICAgICAgICAgICAgICAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtLmdldEF0dHJpYnV0ZShcImZvclwiKSkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbnRyb2wgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBbcm9sZT0nY2hlY2tib3gnXSwgW3JvbGU9J2NvbWJvYm94J10sIFtyb2xlPSdsaXN0Ym94J10sIFtyb2xlPSdtZW51aXRlbWNoZWNrYm94J10sIFtyb2xlPSdtZW51aXRlbXJhZGlvJ10sIFtyb2xlPSdyYWRpbyddLCBbcm9sZT0nc2VhcmNoYm94J10sIFtyb2xlPSdzbGlkZXInXSwgW3JvbGU9J3NwaW5idXR0b24nXSwgW3JvbGU9J3N3aXRjaCddLCBbcm9sZT0ndGV4dGJveCddXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGVkQ29udHJvbCAmJiAobmVzdGVkQ29udHJvbCBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBBIDxsYWJlbD4gd2l0aCBubyBgZm9yYCBhbmQgbm8gbmVzdGVkIGNvbnRyb2wsIHVzZWQgcHVyZWx5IGFzIGFuIGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgYnkgYW5vdGhlciBlbGVtZW50LCBzaG91bGQgYmUgc3VwcHJlc3NlZCDigJQgaXQgd2lsbCBiZSByZWFkIGFzIHBhcnQgb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpZGdldCdzIGFjY2Vzc2libGUgbmFtZSBhbm5vdW5jZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFthcmlhLWxhYmVsbGVkYnl+PVwiJHtpZH1cIl1gKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2tpcCBub24taW50ZXJhY3RpdmUgY29udGVudCB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiBhIGZvci1saW5rZWQgbGFiZWwuXG4gICAgICAgICAgICAvLyBTdWNoIGNvbnRlbnQgaXMgYWxyZWFkeSBzdXJmYWNlZCBhcyBwYXJ0IG9mIHRoZSBhc3NvY2lhdGVkIGNvbnRyb2wncyBhbm5vdW5jZW1lbnQuXG4gICAgICAgICAgICAvLyBJbnRlcmFjdGl2ZSBkZXNjZW5kYW50cyAobGlua3MsIGJ1dHRvbnMsIGV0Yy4pIGFyZSBhbGxvd2VkIHRocm91Z2guXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWxGb3IgPSBlbGVtLmNsb3Nlc3QoXCJsYWJlbFtmb3JdXCIpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbEZvclRhcmdldCA9IGxhYmVsRm9yICYmIGxhYmVsRm9yLmdldEF0dHJpYnV0ZShcImZvclwiKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsRm9yXG4gICAgICAgICAgICAgICAgICAgICYmIGxhYmVsRm9yVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsYWJlbEZvclRhcmdldCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAmJiAhZWxlbS5jbG9zZXN0KFwiYVtocmVmXSwgW3JvbGU9J2xpbmsnXSwgYnV0dG9uLCBbcm9sZT0nYnV0dG9uJ11cIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogbm9kZVR5cGUgPT09IDEgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBjdXJzb3JTdGFydC5nZXRSb2xlKCk7XG5cbiAgICAgICAgICAgIC8vIEEgZGl2L3NwYW4gY29tYm9ib3ggKHJvbGU9XCJjb21ib2JveFwiIG9uIGEgbm9uLWlucHV0LCBub24tc2VsZWN0IGVsZW1lbnQpIGFubm91bmNlc1xuICAgICAgICAgICAgLy8gaXRzIHZhbHVlIGRpcmVjdGx5IGZyb20gdGV4dCBjb250ZW50IG9yIHRoZSBjb250cm9sbGVkIGxpc3Rib3gsIHNvIHNraXAgaXRzIGNoaWxkcmVuXG4gICAgICAgICAgICAvLyB0byBhdm9pZCBkb3VibGUtYW5ub3VuY2luZyB0aGUgaW5uZXIgdGV4dC5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcImNvbWJvYm94XCJcbiAgICAgICAgICAgICAgICAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09IFwiU0VMRUNUXCJcbiAgICAgICAgICAgICAgICAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09IFwiSU5QVVRcIlxuICAgICAgICAgICAgICAgICYmICFjdXJzb3IuaXNFbmRUYWcoKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiwgcmVhZCB0aGUgZWxlbWVudCwgc2tpcCB0aGUgY2hpbGRyZW5cbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNraXAgY2hpbGRyZW4gb2YgaGVhZGluZ3MvbGlua3MgdGhhdCBkb24ndCB1c2UgY29udGVudC1iYXNlZCBuYW1lc1xuICAgICAgICAgICAgLy8gVU5MRVNTIHdlJ3JlIGluc2lkZSBhbm90aGVyIGhlYWRpbmcvbGluayB0aGF0IERPRVMgdXNlIGNvbnRlbnQtYmFzZWQgbmFtZXNcbiAgICAgICAgICAgIGlmIChbXCJsaW5rXCIsIFwiaGVhZGluZ1wiXS5pbmNsdWRlcyhyb2xlKSAmJiAoIWN1cnNvclN0YXJ0LmdldE5hbWUoKSB8fCAoIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKGN1cnNvclN0YXJ0LmdldE5hbWVJbmZvKCkubmFtZUZyb20pKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbnNpZGUgYSBwYXJlbnQgaGVhZGluZy9saW5rIHdpdGggY29udGVudC1iYXNlZCBuYW1lXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEhlYWRpbmdPckxpbmsgJiYgcGFyZW50SGVhZGluZ09yTGluay5nZXROYW1lSW5mbygpICYmIFtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKHBhcmVudEhlYWRpbmdPckxpbmsuZ2V0TmFtZUluZm8oKS5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc2tpcCBjaGlsZHJlbiAtIHdlJ3JlIG5lc3RlZCBpbnNpZGUgYSBjb250ZW50LWJhc2VkIGhlYWRpbmcvbGlua1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkxFR0VORFwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGN1cnNvci5nZXROb2RlKCkpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnRklFTERTRVQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZWdlbmQgaXMgd2l0aGluIGEgZmllbGRzZXQsIHN1cHByZXNzIG91dHB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtICYmIGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJNU1VQXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA8c3VtbWFyeT4gaXMgYSBzZWxmLWFubm91bmNpbmcgZGlzY2xvc3VyZSBidXR0b24g4oCUIGl0cyBjaGlsZHJlblxuICAgICAgICAgICAgLy8gYXJlIGZvbGRlZCBpbnRvIHRoZSBbXCJsYWJlbFwiLCBidXR0b24sIGNvbGxhcHNlZF0gYW5ub3VuY2VtZW50LFxuICAgICAgICAgICAgLy8gc28gc2tpcCB0cmF2ZXJzYWwgaW50byB0aGVtLlxuICAgICAgICAgICAgaWYgKCFjdXJzb3IuaXNFbmRUYWcoKSAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU1VNTUFSWVwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGV0YWlsc1BhcmVudCA9IGVsZW0ucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1BhcmVudCAmJiBkZXRhaWxzUGFyZW50Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiREVUQUlMU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTa2lwIG5vbi1zdW1tYXJ5IGNoaWxkcmVuIG9mIGEgY2xvc2VkIDxkZXRhaWxzPiBlbGVtZW50LlxuICAgICAgICAgICAgLy8gQnJvd3NlcnMgaGlkZSB0aG9zZSBjaGlsZHJlbiB2aWEgVUEgc3R5bGVzaGVldCAoZGlzcGxheTpub25lKSwgc29cbiAgICAgICAgICAgIC8vIHRoZXkgbXVzdCBub3QgYXBwZWFyIGFzIHJlYWRpbmcgc3RvcHMgd2hlbiB0aGUgd2lkZ2V0IGlzIGNvbGxhcHNlZC5cbiAgICAgICAgICAgIC8vIEV4ZW1wdCB0aGUgPGRldGFpbHM+IGVsZW1lbnQgaXRzZWxmIGFuZCA8c3VtbWFyeT4gKGFsd2F5cyB2aXNpYmxlKS5cbiAgICAgICAgICAgIGlmICghY3Vyc29yLmlzRW5kVGFnKClcbiAgICAgICAgICAgICAgICAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09IFwiREVUQUlMU1wiXG4gICAgICAgICAgICAgICAgJiYgIWVsZW0uY2xvc2VzdChcInN1bW1hcnlcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHNBbmNlc3RvciA9IGVsZW0uY2xvc2VzdChcImRldGFpbHNcIik7XG4gICAgICAgICAgICAgICAgaWYgKGRldGFpbHNBbmNlc3RvciAmJiAhZGV0YWlsc0FuY2VzdG9yLmhhc0F0dHJpYnV0ZShcIm9wZW5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW0uY2xvc2VzdChcIi5pYm1hLXNyLW92ZXJsYXlcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNraXAgcG9wdXAgZWxlbWVudHMgKGxpc3Rib3gsIHRyZWUsIGdyaWQsIGRpYWxvZykgdGhhdCBhcmUgb3duZWQgYnkgYSBjb21ib2JveFxuICAgICAgICAgICAgLy8gdmlhIGFyaWEtY29udHJvbHMuIEluIGEgcmVhbCBTUiB0aGVzZSBhcmUgb25seSByZWFjaGFibGUgdmlhIGFyaWEtYWN0aXZlZGVzY2VuZGFudCxcbiAgICAgICAgICAgIC8vIG5vdCBieSBET00gdHJhdmVyc2FsLCBzbyB0aGV5IHNob3VsZCBub3QgYXBwZWFyIGFzIHJlYWRpbmcgc3RvcHMuXG4gICAgICAgICAgICBpZiAobm9kZVR5cGUgPT09IDEgJiYgIWN1cnNvci5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFthcmlhLWNvbnRyb2xzfj1cIiR7aWR9XCJdYCkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3duZXIgJiYgQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG93bmVyKSA9PT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSBudWxsO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJTS0lQX0lURU0gcmV0VmFsOlwiLCByZXRWYWwpO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHNraXAgYmVoYXZpb3IgZm9yIG5lc3RlZCBuYXZpZ2F0aW9uIG1vZGVzIChsaW5rLCBoZWFkaW5nLCBpbWFnZSwgZXRjLilcbiAgICAgKiBTaW1wbGVyIHRoYW4gU0tJUF9JVEVNX0JFSEFWSU9SIGFzIGl0IGRvZXNuJ3QgbmVlZCBjb21wbGV4IGhlYWRpbmcvbGluayBjb250ZW50IHJ1bGVzXG4gICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICogQHJldHVybnMgT2JqZWN0IGluZGljYXRpbmcgd2hldGhlciB0byBza2lwIGN1cnJlbnQgbm9kZSBhbmQvb3IgaXRzIGNoaWxkcmVuLCBvciBudWxsIGZvciBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICovXG4gICAgY29uc3QgU0tJUF9ORVNURURfQkVIQVZJT1IgPSAoY3Vyc29yOiBTUkN1cnNvcikgOiB7IHNraXBDdXJyZW50OiBib29sZWFuLCBza2lwQ2hpbGRyZW46IGJvb2xlYW59IHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGVUeXBlID0gY3Vyc29yLmdldE5vZGUoKS5ub2RlVHlwZTtcbiAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgIC8vIE9ubHkgdmlzaXQgZWxlbWVudHMgYW5kIHRleHQgbm9kZXNcbiAgICAgICAgaWYgKG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSAzKSByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICBpZiAobm9kZVR5cGUgPT09IDMpIHJldHVybiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSA/IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfSA6IG51bGw7XG4gICAgICAgIC8vIFdlIGhhdmUgYW4gZWxlbWVudFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkpIHJldHVybiB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgLy8gU2tpcCB0aGUgaW5uZXIgZG9jdW1lbnQgb2YgYW4gPGlmcmFtZT4g4oCUIHNjcmVlbiByZWFkZXJzIHJlbmRlciB0aGVcbiAgICAgICAgLy8gYWNjZXNzaWJsZSBuYW1lIGFzIHRoZSB0YWJfZm9jdXMgbGFiZWw7IHRoZSBzdWJkb2N1bWVudCBib2R5IHNob3VsZFxuICAgICAgICAvLyBub3QgY29udHJpYnV0ZSBhZGRpdGlvbmFsIHJlYWRpbmcgc3RvcHMgZHVyaW5nIHJlbmRlclJhbmdlIHRyYXZlcnNhbC5cbiAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIiAmJiAhY3Vyc29yLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2tpcCBsYWJlbCBmb3JzIC0gdGhleSdsbCBiZSByZWFkIHdpdGggdGhlIHJlbGF0ZWQgaW5wdXQuXG4gICAgICAgIC8vIEtlZXAgY2hpbGRyZW4gc28gaW50ZXJhY3RpdmUgY29udGVudCAoZS5nLiBsaW5rcykgaW5zaWRlIHRoZSBsYWJlbCBzdGlsbCBhcHBlYXJzIGluXG4gICAgICAgIC8vIHJlYWRpbmcvdGFiIG9yZGVyLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiTEFCRUxcIlxuICAgICAgICAgICAgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJmb3JcIilcbiAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpKVxuICAgICAgICAgICAgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbS5nZXRBdHRyaWJ1dGUoXCJmb3JcIikpLmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09IFwiaGlkZGVuXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBub24taW50ZXJhY3RpdmUgY29udGVudCB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiBhIGZvci1saW5rZWQgbGFiZWwuXG4gICAgICAgIC8vIFN1Y2ggY29udGVudCBpcyBhbHJlYWR5IHN1cmZhY2VkIGFzIHBhcnQgb2YgdGhlIGFzc29jaWF0ZWQgY29udHJvbCdzIGFubm91bmNlbWVudC5cbiAgICAgICAgLy8gSW50ZXJhY3RpdmUgZGVzY2VuZGFudHMgKGxpbmtzLCBidXR0b25zLCBldGMuKSBhcmUgYWxsb3dlZCB0aHJvdWdoLlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbEZvciA9IGVsZW0uY2xvc2VzdChcImxhYmVsW2Zvcl1cIikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgY29uc3QgbGFiZWxGb3JUYXJnZXQgPSBsYWJlbEZvciAmJiBsYWJlbEZvci5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbGFiZWxGb3JcbiAgICAgICAgICAgICAgICAmJiBsYWJlbEZvclRhcmdldFxuICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KVxuICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpICE9PSBcImhpZGRlblwiXG4gICAgICAgICAgICAgICAgJiYgIWVsZW0uY2xvc2VzdChcImFbaHJlZl0sIFtyb2xlPSdsaW5rJ10sIGJ1dHRvbiwgW3JvbGU9J2J1dHRvbiddXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBub2RlVHlwZSA9PT0gMSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm9sZSA9IGN1cnNvci5nZXRSb2xlKCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiwgcmVhZCB0aGUgZWxlbWVudCwgc2tpcCB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKEFyaWFVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0gJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIk1TVVBcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmNsb3Nlc3QoXCIuaWJtYS1zci1vdmVybGF5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBza2lwIGZ1bmN0aW9uIGZvciBhIGdpdmVuIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBub2RlcyB0byBza2lwIGR1cmluZyBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFNraXBGdW5jKG1vZGU6IE5hdmlnYXRpb25Nb2RlKSA6IFNSQ3Vyc29yU2tpcEZ1bmMge1xuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJyZWdpb25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJpdGVtXCI6IFxuICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX0lURU1fQkVIQVZJT1I7XG4gICAgICAgICAgICBjYXNlIFwibGlua1wiOiBcbiAgICAgICAgICAgIGNhc2UgXCJ0YWJfZm9jdXNcIjogXG4gICAgICAgICAgICBjYXNlIFwiaGVhZGluZ1wiOlxuICAgICAgICAgICAgY2FzZSBcImgxXCI6XG4gICAgICAgICAgICBjYXNlIFwiaDJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoM1wiOlxuICAgICAgICAgICAgY2FzZSBcImg0XCI6XG4gICAgICAgICAgICBjYXNlIFwiaDVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoNlwiOlxuICAgICAgICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNLSVBfTkVTVEVEX0JFSEFWSU9SO1xuICAgICAgICAgICAgY2FzZSBcInJhZGlvXCI6XG4gICAgICAgICAgICBjYXNlIFwiYnV0dG9uXCI6XG4gICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjb21ib1wiOiAgICAgICBcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0XCI6XG4gICAgICAgICAgICBjYXNlIFwibGlzdGl0ZW1cIjpcbiAgICAgICAgICAgIGNhc2UgXCJhcnRpY2xlXCI6XG4gICAgICAgICAgICBjYXNlIFwidGFibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJwYXJhZ3JhcGhcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkb21cIjpcbiAgICAgICAgICAgIGNhc2UgXCJmb3JtY29udHJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcImVkaXRib3hcIjpcbiAgICAgICAgICAgIGNhc2UgXCJncmFwaGljXCI6XG4gICAgICAgICAgICBjYXNlIFwiZnJhbWVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkaXZpc2lvblwiOlxuICAgICAgICAgICAgY2FzZSBcInRhYmNvbnRyb2xcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzZXBhcmF0b3JcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjbGlja2FibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJtb3VzZW92ZXJcIjpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1RfSU1QTEVNRU5URURcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBcbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9yIHRoZSBwcmV2aW91cyBtYXRjaGluZyBlbGVtZW50IGlmIGN1cnJlbnQgZG9lc24ndCBtYXRjaFxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBIGN1cnNvciBhdCB0aGUgY3VycmVudCBvciBwcmV2aW91cyBtYXRjaGluZyBwb3NpdGlvblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBqdW1wQ3VycmVudChtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgd2Fsa2VyOiBTUkN1cnNvcikgOiBTUkN1cnNvciB7XG4gICAgICAgIGNvbnN0IG1hdGNoRnVuYyA9IG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgPyBnZXRUYWJGb2N1c1N0YXJ0RnVuYyh0cnVlKSA6IGdldFN0YXJ0RnVuYyhtb2RlKTtcbiAgICAgICAgaWYgKG1hdGNoRnVuYyh3YWxrZXIuZ2V0Um9sZSgpLCAhd2Fsa2VyLmlzRW5kVGFnKCksIHdhbGtlci5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ganVtcFByZXZpb3VzKG1vZGUsIHdhbGtlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSnVtcCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgYW5kIHJldHVybiBhbGwgaW50ZXJtZWRpYXRlIGl0ZW0gcG9zaXRpb25zXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSB3YWxrZXIgVGhlIGN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIGN1cnNvcnMgcmVwcmVzZW50aW5nIHBvc2l0aW9ucyBmcm9tIGN1cnJlbnQgdG8gZW5kXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGp1bXBDdXJyZW50RW5kKG1vZGU6IE5hdmlnYXRpb25Nb2RlLCB3YWxrZXI6IFNSQ3Vyc29yKSA6IFNSQ3Vyc29yW10ge1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIpIHtcbiAgICAgICAgICAgIC8vIEZvciBhbnkgPHByZT4gaXRlbSAoYmxvY2stZW50ZXIgc3RvcCBvciBwZXItbGluZSBzdG9wKSwgdGhlIHJlbmRlciByYW5nZVxuICAgICAgICAgICAgLy8gbXVzdCBlbmQgYXQgdGhlIG5leHQgdmlydHVhbCBsaW5lIGN1cnNvciAoc2FtZSA8cHJlPiBub2RlLCBuZXh0IGluZGV4KSBzb1xuICAgICAgICAgICAgLy8gdGhhdCByZW5kZXJSYW5nZSBuZXZlciB3YWxrcyBpbnRvIDxwcmU+J3MgY2hpbGRyZW4uXG4gICAgICAgICAgICBpZiAoaXNQcmVFbGVtZW50KHdhbGtlci5nZXROb2RlKCkpICYmICF3YWxrZXIuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gZ2V0UHJlTGluZXMod2Fsa2VyLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dElkeCA9IHdhbGtlci5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZCA/IDAgOiB3YWxrZXIucHJlTGluZUluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICAvLyBVc2UgbmV4dElkeCBhcyB0aGUgZW5kIHNlbnRpbmVsIOKAlCBldmVuIGlmIGl0IGVxdWFscyBsaW5lcy5sZW5ndGggKHBhc3RcbiAgICAgICAgICAgICAgICAvLyB0aGUgbGFzdCBsaW5lKSwgY29tcGFyZSgpIHdpbGwgc3RpbGwgY29ycmVjdGx5IHN0b3AgcmVuZGVyUmFuZ2UgYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gYW55IGNoaWxkIG5vZGUgYmVjYXVzZSBjaGlsZHJlbiBhcmUgY29udGFpbmVkIHdpdGhpbiA8cHJlPi5cbiAgICAgICAgICAgICAgICBjb25zdCBlbmRDdXJzb3IgPSB3YWxrZXIuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICBlbmRDdXJzb3IucHJlTGluZUluZGV4ID0gbmV4dElkeDtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2VuZEN1cnNvcl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtRW5kID0ganVtcE5leHQobW9kZSwgd2Fsa2VyKTtcbiAgICAgICAgICAgIHJldHVybiBpdGVtRW5kID8gW2l0ZW1FbmRdIDogW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lSW5mbyA9IHdhbGtlci5nZXROYW1lSW5mbygpO1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgaWYgKG5hbWVJbmZvICYmICFbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAvLyBOYW1lIGlzIGp1c3QgZnJvbSB0aGUgaXRlbSBpdHNlbGZcbiAgICAgICAgICAgICAgICByZXRWYWwubmV4dCgoKSA9PiB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTmFtZSBpcyBmcm9tIHRoZSBjb250ZW50XG4gICAgICAgICAgICAgICAgcmV0VmFsLnNldEVuZFRhZyh0cnVlKTtcbiAgICAgICAgICAgICAgICByZXRWYWwubmV4dCgoKSA9PiB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZW5kQ3Vyc29yczogU1JDdXJzb3JbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IGl0ZW1FbmQgPSBqdW1wTmV4dChcIml0ZW1cIiwgd2Fsa2VyKTtcbiAgICAgICAgICAgIHdoaWxlIChpdGVtRW5kICYmIFNSQ3Vyc29yLmNvbXBhcmUoaXRlbUVuZCwgcmV0VmFsKSA8IDApIHtcbiAgICAgICAgICAgICAgICBlbmRDdXJzb3JzLnB1c2goaXRlbUVuZCk7XG4gICAgICAgICAgICAgICAgaXRlbUVuZCA9IGp1bXBOZXh0KFwiaXRlbVwiLCBpdGVtRW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZEN1cnNvcnMucHVzaChyZXRWYWwpO1xuICAgICAgICAgICAgcmV0dXJuIG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgd2Fsa2VyLmdldFJvbGUoKSA9PT0gXCJsaW5rXCIgPyBbZW5kQ3Vyc29yc1tlbmRDdXJzb3JzLmxlbmd0aCAtIDFdXSA6IGVuZEN1cnNvcnM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHRoZSBuZXh0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBIGN1cnNvciBhdCB0aGUgbmV4dCBtYXRjaGluZyBwb3NpdGlvbiwgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGp1bXBOZXh0KG1vZGU6IE5hdmlnYXRpb25Nb2RlLCB3YWxrZXI6IFNSQ3Vyc29yKSA6IFNSQ3Vyc29yIHtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cChcIlNSTmF2aWdhdG9yOjpqdW1wTmV4dFwiLCB3YWxrZXIuaXNFbmRUYWcoKT9cIi9cIjpcIlwiLCB3YWxrZXIuZ2V0Tm9kZSgpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFiRm9jdXNNYXRjaEZ1bmMgPSBnZXRUYWJGb2N1c1N0YXJ0RnVuYyh0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJGb2N1c0N1cnNvcnMgPSBjb2xsZWN0VGFiRm9jdXNDdXJzb3JzKHRhYkZvY3VzTWF0Y2hGdW5jLCB3YWxrZXIuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICAgICBpZiAodGFiRm9jdXNDdXJzb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGFiRm9jdXNDdXJzb3JzLm1hcChjID0+IGMuZ2V0Tm9kZSgpKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciA9IHdhbGtlci5nZXRDdXJyZW50T3JQYXJlbnRUYWJiYWJsZUNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJGb2N1c0N1cnNvciA9IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciAmJiBmaW5kVGFiRm9jdXNJbmRleCh0YWJGb2N1c0N1cnNvcnMsIGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvcikgPj0gMCA/IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciA6IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBmaW5kVGFiRm9jdXNJbmRleCh0YWJGb2N1c0N1cnNvcnMsIGN1cnJlbnRUYWJGb2N1c0N1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCArIDEgPCB0YWJGb2N1c0N1cnNvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYkZvY3VzQ3Vyc29yc1tjdXJyZW50SW5kZXggKyAxXS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYkZvY3VzQ3Vyc29yc1swXS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwiaXRlbVwiICYmIGlzUHJlRWxlbWVudCh3YWxrZXIuZ2V0Tm9kZSgpKSAmJiAhd2Fsa2VyLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGdldFByZUxpbmVzKHdhbGtlci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHdhbGtlci5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGUgYmxvY2stZW50ZXIgc3RvcCDigJQganVtcCB0byB0aGUgZmlyc3QgbGluZSBpdGVtXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV0VmFsID0gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucHJlTGluZUluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRW1wdHkgPHByZT4g4oCUIGZhbGwgdGhyb3VnaCB0byBET00gdHJhdmVyc2FsIHBhc3QgPC9wcmU+XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXQgYSBsaW5lIGl0ZW0g4oCUIGFkdmFuY2UgdG8gdGhlIG5leHQgbGluZSBvciBwYXN0IDwvcHJlPlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGluZUlkeCA9IHdhbGtlci5wcmVMaW5lSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGluZUlkeCArIDEgPCBsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXRWYWwgPSB3YWxrZXIuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5wcmVMaW5lSW5kZXggPSBjdXJyZW50TGluZUlkeCArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbCBsaW5lcyBleGhhdXN0ZWQg4oCUIG1vdmUgcGFzdCA8L3ByZT4gdG8gdGhlIG5leHQgRE9NIGl0ZW0uXG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBsYW5kIG9uIHRoZSBibG9jay1lbnRlciBzdG9wIChwcmVMaW5lSW5kZXg9dW5kZWZpbmVkKSBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVyIGdldHMgYSBjaGFuY2UgdG8gcmVuZGVyIHRoZSBjb250YWluZXItZW50ZXIgYW5ub3VuY2VtZW50IGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNpbmcgdG8gdGhlIGZpcnN0IGxpbmUuXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRWYWwgPSB3YWxrZXIuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnNldEVuZFRhZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hGdW5jID0gZ2V0U3RhcnRGdW5jKG1vZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBza2lwRnVuYyA9IGdldFNraXBGdW5jKG1vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0VmFsLm5leHQobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1ByZUVsZW1lbnQocmV0VmFsLmdldE5vZGUoKSkgJiYgIXJldFZhbC5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnByZUxpbmVJbmRleCA9IHVuZGVmaW5lZDsgLy8gYmxvY2stZW50ZXIgc3RvcFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCByZXRWYWwgPSB3YWxrZXIuY2xvbmUoKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoRnVuYyA9IGdldFN0YXJ0RnVuYyhtb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IHNraXBGdW5jID0gZ2V0U2tpcEZ1bmMobW9kZSk7XG4gICAgICAgICAgICBpZiAocmV0VmFsLm5leHQobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgICAgICAvLyBMYW5kaW5nIG9uIDxwcmU+IHZpYSBET00gdHJhdmVyc2FsIGFsd2F5cyBzdGFydHMgYXQgdGhlIGJsb2NrLWVudGVyIHN0b3BcbiAgICAgICAgICAgICAgICAvLyAocHJlTGluZUluZGV4PXVuZGVmaW5lZCkuICBUaGUgcGVyLWxpbmUgaXRlbXMgYXJlIHJldHVybmVkIG9uIHN1YnNlcXVlbnRcbiAgICAgICAgICAgICAgICAvLyBjYWxscyB2aWEgdGhlIGlzUHJlRWxlbWVudCBlYXJseS1yZXR1cm4gYWJvdmUuXG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwiaXRlbVwiICYmIGlzUHJlRWxlbWVudChyZXRWYWwuZ2V0Tm9kZSgpKSAmJiAhcmV0VmFsLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnByZUxpbmVJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJTUk5hdmlnYXRvcjo6anVtcE5leHQgcmVzdWx0XCIsIHJldFZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gc2NyZWVuIHJlYWRlciBuYXZpZ2F0aW9uIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbW9kZS5cbiAgICAgKlxuICAgICAqIEZvciB0YWJfZm9jdXMgbW9kZSwgdGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBtb3ZlIHRvIHRoZSBwcmV2aW91cyB0YWJiYWJsZSBlbGVtZW50IGJ5OlxuICAgICAqIDEuIEZpcnN0IHRyeWluZyB0byBtb3ZlIGJhY2t3YXJkIHVzaW5nIHRoZSBtb2RlJ3MgbWF0Y2ggYW5kIHNraXAgZnVuY3Rpb25zXG4gICAgICogMi4gSWYgdGhhdCBmYWlscywgY29sbGVjdGluZyBhbGwgdGFiIGZvY3VzIGN1cnNvcnMgYW5kIGZpbmRpbmcgdGhlIHByZXZpb3VzIG9uZSBpbiB0aGUgdGFiIG9yZGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBuYXZpZ2F0aW9uIG1vZGUgKGUuZy4sIFwidGFiX2ZvY3VzXCIpIHRoYXQgZGV0ZXJtaW5lcyBob3cgdG8gbmF2aWdhdGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gVGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBzY3JlZW4gcmVhZGVyIG5hdmlnYXRpb25cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBjdXJzb3IgcG9zaXRpb25lZCBhdCB0aGUgcHJldmlvdXMgZWxlbWVudCwgb3IgbnVsbCBpZiBubyBwcmV2aW91cyBlbGVtZW50IGV4aXN0c1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBqdW1wUHJldmlvdXMobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IpIDogU1JDdXJzb3Ige1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIikge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hGdW5jID0gZ2V0U3RhcnRGdW5jKG1vZGUpO1xuICAgICAgICAgICAgY29uc3Qgc2tpcEZ1bmMgPSBnZXRTa2lwRnVuYyhtb2RlKTtcbiAgICAgICAgICAgIGlmIChyZXRWYWwucHJldmlvdXMobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWJGb2N1c01hdGNoRnVuYyA9IGdldFRhYkZvY3VzU3RhcnRGdW5jKHRydWUpO1xuICAgICAgICAgICAgY29uc3QgdGFiRm9jdXNDdXJzb3JzID0gY29sbGVjdFRhYkZvY3VzQ3Vyc29ycyh0YWJGb2N1c01hdGNoRnVuYywgd2Fsa2VyLmdldE5vZGUoKSk7XG4gICAgICAgICAgICBpZiAodGFiRm9jdXNDdXJzb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VGFiRm9jdXNQYXJlbnRDdXJzb3IgPSB3YWxrZXIuZ2V0Q3VycmVudE9yUGFyZW50VGFiYmFibGVDbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJGb2N1c0N1cnNvciA9IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciAmJiBmaW5kVGFiRm9jdXNJbmRleCh0YWJGb2N1c0N1cnNvcnMsIGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvcikgPj0gMCA/IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciA6IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZpbmRUYWJGb2N1c0luZGV4KHRhYkZvY3VzQ3Vyc29ycywgY3VycmVudFRhYkZvY3VzQ3Vyc29yKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiRm9jdXNDdXJzb3JzW2N1cnJlbnRJbmRleCAtIDFdLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgaXNQcmVFbGVtZW50KHdhbGtlci5nZXROb2RlKCkpICYmICF3YWxrZXIuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgaWYgKHdhbGtlci5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIEF0IHRoZSBibG9jay1lbnRlciBzdG9wIOKAlCBnbyB0byB0aGUgcHJldmlvdXMgRE9NIGl0ZW0gKGJlZm9yZSA8cHJlPilcbiAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gbm9ybWFsIHByZXZpb3VzKCkgdHJhdmVyc2FsIGJlbG93XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdhbGtlci5wcmVMaW5lSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGUgZmlyc3QgbGluZSDigJQgc3RlcCBiYWNrIHRvIHRoZSBibG9jay1lbnRlciBzdG9wXG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIHJldFZhbC5wcmVMaW5lSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU3RlcCBiYWNrIG9uZSBsaW5lXG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIHJldFZhbC5wcmVMaW5lSW5kZXggPSB3YWxrZXIucHJlTGluZUluZGV4IC0gMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICBjb25zdCBtYXRjaEZ1bmMgPSBnZXRTdGFydEZ1bmMobW9kZSk7XG4gICAgICAgIGNvbnN0IHNraXBGdW5jID0gZ2V0U2tpcEZ1bmMobW9kZSk7XG4gICAgICAgIGlmIChyZXRWYWwucHJldmlvdXMobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGp1c3QgbGFuZGVkIG9uIGEgPHByZT4gZWxlbWVudCwgcG9zaXRpb24gYXQgaXRzIGxhc3QgbGluZVxuICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwiaXRlbVwiICYmIGlzUHJlRWxlbWVudChyZXRWYWwuZ2V0Tm9kZSgpKSAmJiAhcmV0VmFsLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGdldFByZUxpbmVzKHJldFZhbC5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJldFZhbC5wcmVMaW5lSW5kZXggPSBsaW5lcy5sZW5ndGggPiAwID8gbGluZXMubGVuZ3RoIC0gMSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIiwiaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgU1JOYXZpZ2F0b3IgfSBmcm9tIFwiLi9TUk5hdmlnYXRvclwiO1xuaW1wb3J0IHsgQ29udGFpbmVyQ2hhbmdlcywgTmF2aWdhdGlvbk1vZGUsIFJlbmRlclJlc3VsdCB9IGZyb20gXCIuL1NSVHlwZXNcIjtcbmltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4vU1JDdXJzb3JcIjtcbmltcG9ydCB7IFNSX1JVTEVTLCBDT05UQUlORVJfRU5URVJfUlVMRVMsIENPTlRBSU5FUl9FWElUX1JVTEVTIH0gZnJvbSBcIi4vcmVuZGVyX3J1bGVzXCI7XG5pbXBvcnQgeyBnZXRMaW5rQW5ub3VuY2VtZW50IH0gZnJvbSBcIi4vcmVuZGVyX3J1bGVzL2NvbW1vblwiO1xuXG4vKipcbiAqIFNSUmVuZGVyZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIHNpbXVsYXRpbmcgaG93IHNjcmVlbiByZWFkZXJzXG4gKiBhbm5vdW5jZSBjb250ZW50IHRvIHVzZXJzLiBJdCBjb250YWlucyBydWxlcyBmb3IgcmVuZGVyaW5nIGRpZmZlcmVudCB0eXBlcyBvZlxuICogZWxlbWVudHMgYW5kIEFSSUEgcm9sZXMgaW4gdmFyaW91cyBuYXZpZ2F0aW9uIG1vZGVzLlxuICpcbiAqIFRoZSByZW5kZXJlciB1c2VzIGEgcnVsZS1iYXNlZCBzeXN0ZW0gdG8gZGV0ZXJtaW5lIHdoYXQgdGV4dCBzaG91bGQgYmUgYW5ub3VuY2VkXG4gKiB3aGVuIG5hdmlnYXRpbmcgdG8sIHdpdGhpbiwgb3IgYXdheSBmcm9tIGVsZW1lbnRzIGJhc2VkIG9uIHRoZWlyIHJvbGVzIGFuZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIFNSUmVuZGVyZXIge1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgYW5ub3VuY2VtZW50IHRleHQgd2hlbiBlbnRlcmluZyBhbiBlbGVtZW50XG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGxvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBydWxlIGJhc2VkIG9uIHRoZSBlbGVtZW50J3Mgcm9sZSBvciB0YWcgbmFtZVxuICAgICAqIGFuZCBhcHBsaWVzIGl0IHRvIGdlbmVyYXRlIHRoZSBhbm5vdW5jZW1lbnQgdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIC0gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIHdhbGtlciAtIEN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBvbGRXYWxrZXIgLSBPcHRpb25hbCBjdXJzb3IgYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uXG4gICAgICogQHJldHVybnMgQW5ub3VuY2VtZW50IHRleHQgZm9yIGVudGVyaW5nIHRoZSBlbGVtZW50LCBvciBudWxsIGlmIG5vIHJ1bGUgYXBwbGllc1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiByZW5kZXJFbnRlcihtb2RlOiBOYXZpZ2F0aW9uTW9kZSB8IFwiZm9jdXNcIiwgd2Fsa2VyOiBTUkN1cnNvciwgb2xkV2Fsa2VyPzogU1JDdXJzb3IpOiBzdHJpbmcgfCBudWxsIHsgICAgICAgIFxuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgQ09OVEFJTkVSX0VOVEVSX1JVTEVTKSB7XG4gICAgICAgICAgICBsZXQgcyA9IHJ1bGUudGVzdChtb2RlLCB3YWxrZXIsIG9sZFdhbGtlcik7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhtb2RlLCB3YWxrZXIsIHJ1bGUsIHMpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzICE9PSBcInVuZGVmaW5lZFwiICYmIHMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIGFubm91bmNlbWVudCB0ZXh0IHdoZW4gbGVhdmluZyBhbiBlbGVtZW50XG4gICAgICpcbiAgICAgKiBTaW1pbGFyIHRvIHJlbmRlckVudGVyLCBidXQgYXBwbGllcyBydWxlcyBmb3IgbGVhdmluZyBlbGVtZW50cyBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgLSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gQ3Vyc29yIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICogQHBhcmFtIG9sZFdhbGtlciAtIE9wdGlvbmFsIGN1cnNvciBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBbm5vdW5jZW1lbnQgdGV4dCBmb3IgbGVhdmluZyB0aGUgZWxlbWVudCwgb3IgbnVsbCBpZiBubyBydWxlIGFwcGxpZXNcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gcmVuZGVyTGVhdmUobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IsIG9sZFdhbGtlcj86IFNSQ3Vyc29yKTogc3RyaW5nIHwgbnVsbCAge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgQ09OVEFJTkVSX0VYSVRfUlVMRVMpIHtcbiAgICAgICAgICAgIGxldCBzID0gcnVsZS50ZXN0KG1vZGUsIHdhbGtlciwgb2xkV2Fsa2VyKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgY3VycmVudCBlbGVtZW50IGFuZCBhbnkgY29udGFpbmVyIGNoYW5nZXNcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY29tYmluZXMgYW5ub3VuY2VtZW50cyBmb3I6XG4gICAgICogLSBDb250YWluZXJzIGJlaW5nIGxlZnRcbiAgICAgKiAtIENvbnRhaW5lcnMgYmVpbmcgZW50ZXJlZFxuICAgICAqIC0gVGhlIGN1cnJlbnQgZWxlbWVudCBpdHNlbGZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIC0gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIHdhbGtlciAtIEN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBjb250YWluZXJDaGFuZ2VzIC0gSW5mb3JtYXRpb24gYWJvdXQgY29udGFpbmVycyBiZWluZyBlbnRlcmVkIG9yIGxlZnRcbiAgICAgKiBAcmV0dXJucyBDb21iaW5lZCBhbm5vdW5jZW1lbnQgdGV4dFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiByZW5kZXJDdXJyZW50KG1vZGU6IE5hdmlnYXRpb25Nb2RlLCB3YWxrZXI6IFNSQ3Vyc29yLCBjb250YWluZXJDaGFuZ2VzOiBDb250YWluZXJDaGFuZ2VzKTogUmVuZGVyUmVzdWx0IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7Ly9tb2RlID09PSBcInRhYl9mb2N1c1wiICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZml4dHVyZVwiKT8uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgPT09IFwidG9tdGVzdFwiO1xuICAgICAgICBsZXQgc3RhcnRPZlJlbmRlciA9IFNSTmF2aWdhdG9yLmp1bXBDdXJyZW50KG1vZGUsIHdhbGtlcik7XG4gICAgICAgIGlmICghc3RhcnRPZlJlbmRlcikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGVuZE9mUmVuZGVycyA9IFNSTmF2aWdhdG9yLmp1bXBDdXJyZW50RW5kKG1vZGUsIHN0YXJ0T2ZSZW5kZXIpO1xuICAgICAgICBpZiAoIWVuZE9mUmVuZGVycyB8fCBlbmRPZlJlbmRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBlbmRPZlJlbmRlcnMgPSBbbnVsbF07XG4gICAgICAgIH1cbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJBQUFBXCIsIHN0YXJ0T2ZSZW5kZXIuaXNTdGFydFRhZygpLCBzdGFydE9mUmVuZGVyLmdldE5vZGUoKSk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiQkJCQlwiLCBlbmRPZlJlbmRlcnMubWFwKHZhbCA9PiB2YWwgJiYgdmFsLmlzU3RhcnRUYWcoKSksIGVuZE9mUmVuZGVycy5tYXAodmFsID0+IHZhbCAmJiB2YWwuZ2V0Tm9kZSgpKSk7XG5cbiAgICAgICAgbGV0IGVuZE9mUmVuZGVyID0gZW5kT2ZSZW5kZXJzW2VuZE9mUmVuZGVycy5sZW5ndGggLSAxXTtcbiAgICAgICAgbGV0IHJlbmRlclN0ciA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGNhbmRpZGF0ZUVuZCBvZiBlbmRPZlJlbmRlcnMpIHtcbiAgICAgICAgICAgIGxldCBjYW5kaWRhdGVSZW5kZXJTdHIgPSBTUlJlbmRlcmVyLnJlbmRlclJhbmdlKG1vZGUsIHN0YXJ0T2ZSZW5kZXIsIGNhbmRpZGF0ZUVuZCk7XG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlUmVuZGVyU3RyLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZW5kT2ZSZW5kZXIgPSBjYW5kaWRhdGVFbmQ7XG4gICAgICAgICAgICAgICAgcmVuZGVyU3RyID0gY2FuZGlkYXRlUmVuZGVyU3RyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZW5kZXJTdHIgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJlbmRlclN0ciA9IFNSUmVuZGVyZXIucmVuZGVyUmFuZ2UobW9kZSwgc3RhcnRPZlJlbmRlciwgZW5kT2ZSZW5kZXIpO1xuICAgICAgICB9XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiQ0NDQ1wiLCByZW5kZXJTdHIpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0T2ZSZW5kZXIsXG4gICAgICAgICAgICBlbmQ6IGVuZE9mUmVuZGVyLFxuICAgICAgICAgICAgbWVzc2FnZTogKGNvbnRhaW5lckNoYW5nZXMubGVhdmluZyB8fCBbXSkuY29uY2F0KGNvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcgfHwgW10pLmNvbmNhdChbcmVuZGVyU3RyXSkuam9pbihcIiBcIikucmVwbGFjZSgvXFxzKy9nLCBcIiBcIilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSByYW5nZSBvZiBlbGVtZW50cyBiZXR3ZWVuIHR3byBjdXJzb3JzXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgRE9NIGZyb20gc3RhcnRPZlJlbmRlciB0byBlbmRPZlJlbmRlcixcbiAgICAgKiBhcHBseWluZyByZW5kZXJpbmcgcnVsZXMgdG8gZWFjaCBlbGVtZW50IGFuZCBjb21iaW5pbmcgdGhlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBzdGFydE9mUmVuZGVyIC0gQ3Vyc29yIGF0IHRoZSBzdGFydCBvZiB0aGUgcmFuZ2VcbiAgICAgKiBAcGFyYW0gZW5kT2ZSZW5kZXIgLSBDdXJzb3IgYXQgdGhlIGVuZCBvZiB0aGUgcmFuZ2VcbiAgICAgKiBAcmV0dXJucyBDb21iaW5lZCBhbm5vdW5jZW1lbnQgdGV4dCBmb3IgdGhlIGVudGlyZSByYW5nZVxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiByZW5kZXJSYW5nZShtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgc3RhcnRPZlJlbmRlcjogU1JDdXJzb3IsIGVuZE9mUmVuZGVyOiBTUkN1cnNvcikgOiBzdHJpbmcge1xuICAgICAgICBsZXQgaXRlcldhbGtlciA9IHN0YXJ0T2ZSZW5kZXIuY2xvbmUoKTtcbiAgICAgICAgbGV0IGVsZW1TdHJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgbGV0IGN1cnJlbnRMaW5rOiBOb2RlID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKGJDb250aW51ZSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IGl0ZXJXYWxrZXIuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGl0ZXJXYWxrZXIuZ2V0Tm9kZSgpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuICAgICAgICAgICAgbGV0IHJlbmRlclN0cnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBsZXQgbGlua1BhcmVudCA9IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobm9kZSwgXCJsaW5rXCIsIHRydWUpO1xuICAgICAgICAgICAgaWYgKGxpbmtQYXJlbnQgJiYgIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKG5ldyBTUkN1cnNvcihsaW5rUGFyZW50KS5nZXROYW1lSW5mbygpPy5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBjb25zaWRlciBsaW5rcyB0aGF0IGFubm91bmNlIHRoZW1zZWx2ZXNcbiAgICAgICAgICAgICAgICBsaW5rUGFyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBTUl9SVUxFUykge1xuICAgICAgICAgICAgICAgIGxldCBzID0gcnVsZS50ZXN0KG1vZGUsIGl0ZXJXYWxrZXIpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzICE9PSBudWxsICYmIHMudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVUeXBlID09PSAxICYmICFpdGVyV2Fsa2VyLmlzRW5kVGFnKCkgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIpID09PSBcIm1lbnVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcyA9IFwiW3N1Yk1lbnVdIFwiK3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGxpbmtzXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBpbiBsaW5rIG1vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGluayAmJiAoIWxpbmtQYXJlbnQgfHwgKGxpbmtQYXJlbnQgJiYgY3VycmVudExpbmsgIT09IGxpbmtQYXJlbnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGFkZGVkIGEgc3RyaW5nIHdpdGhpbiBhIGxpbmsgKGN1cnJlbnRMaW5rKSwgYnV0IG5vdyB3ZSd2ZSBsZWZ0IHRoZSBsaW5rIG9yIG1vdmVkIHRvIGEgbmV3IGxpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gYCR7c30gJHtnZXRMaW5rQW5ub3VuY2VtZW50KG5ldyBTUkN1cnNvcihjdXJyZW50TGluaywgZmFsc2UpKX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmtQYXJlbnQgJiYgKCFjdXJyZW50TGluayB8fCAoY3VycmVudExpbmsgIT09IGxpbmtQYXJlbnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGluIGEgbGluaywgYW5kIHdlIGhhdmVuJ3QgYW5ub3VuY2VkIHRoaXMgbGluaywgb3Igd2UndmUgbW92ZWQgdG8gYSBuZXcgbGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBgJHtnZXRMaW5rQW5ub3VuY2VtZW50KG5ldyBTUkN1cnNvcihsaW5rUGFyZW50LCBmYWxzZSkpfSAke3N9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gXG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocyAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudExpbmsgPSBsaW5rUGFyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVN0cnMucHVzaChzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtU3Rycy5wdXNoKHJlbmRlclN0cnMuZmlsdGVyKHMgPT4gcy50cmltKCkubGVuZ3RoID4gMCkuam9pbihcIiBcIikpXG4gICAgICAgICAgICBiQ29udGludWUgPSBpdGVyV2Fsa2VyLm5leHQoKCkgPT4gdHJ1ZSwgU1JOYXZpZ2F0b3IuZ2V0U2tpcEZ1bmMobW9kZSkpICYmIFNSQ3Vyc29yLmNvbXBhcmUoaXRlcldhbGtlciwgZW5kT2ZSZW5kZXIpIDwgMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiBjdXJyZW50TGluaykge1xuICAgICAgICAgICAgZWxlbVN0cnMucHVzaChgJHtnZXRMaW5rQW5ub3VuY2VtZW50KG5ldyBTUkN1cnNvcihjdXJyZW50TGluaywgZmFsc2UpKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VmFsID0gZWxlbVN0cnMuZmlsdGVyKHMgPT4gcy50cmltKCkubGVuZ3RoID4gMCkuam9pbihcIiBcIik7XG4gICAgICAgIHJldFZhbCA9IHJldFZhbC5yZXBsYWNlKC8sIFxcdTAwMDEoW15cXHUwMDAyXSspXFx1MDAwMi9nLCAobWF0Y2gsIGRlc2NyaWJlZEJ5VGV4dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcXVvdGVkVGV4dCA9IGBcIiR7ZGVzY3JpYmVkQnlUZXh0fVwiYDtcbiAgICAgICAgICAgIGNvbnN0IHVubWFya2VkUmV0VmFsID0gcmV0VmFsLnJlcGxhY2UobWF0Y2gsIFwiXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHVubWFya2VkUmV0VmFsLmluY2x1ZGVzKHF1b3RlZFRleHQpIHx8IHVubWFya2VkUmV0VmFsLmluY2x1ZGVzKGRlc2NyaWJlZEJ5VGV4dCkgPyBcIlwiIDogYCwgJHtxdW90ZWRUZXh0fWA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXRWYWwgPSByZXRWYWwucmVwbGFjZSgvW1xcdTAwMDFcXHUwMDAyXS9nLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbn1cblxuIiwiaW1wb3J0IHsgU1JDdXJzb3IgfSBmcm9tIFwiLi9TUkN1cnNvclwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUgfSBmcm9tIFwiLi9TUlR5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBTUlJlbmRlcmVyUnVsZSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBydWxlRGVmaW5pdGlvbjoge1xuICAgICAgICBtb2RlczogTmF2aWdhdGlvbk1vZGVbXSxcbiAgICAgICAgcm9sZXM6IHN0cmluZ1tdLFxuICAgICAgICBlbGVtczogc3RyaW5nW10sXG4gICAgICAgIHRlc3RzOiBBcnJheTwoY3Vyc29yOiBTUkN1cnNvciwgb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBOYXZpZ2F0aW9uTW9kZSkgPT4gc3RyaW5nIHwgbnVsbD5cbiAgICB9KSB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgdGVzdChtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgY3Vyc29yOiBTUkN1cnNvciwgb2xkQ3Vyc29yPzogU1JDdXJzb3IpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMucnVsZURlZmluaXRpb24ubW9kZXMuaW5jbHVkZXMobW9kZSlcbiAgICAgICAgICAgICYmIChcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bGVEZWZpbml0aW9uLnJvbGVzLmluY2x1ZGVzKGN1cnNvci5nZXRSb2xlKCkpXG4gICAgICAgICAgICAgICAgfHwgdGhpcy5ydWxlRGVmaW5pdGlvbi5lbGVtcy5pbmNsdWRlcyhjdXJzb3IuZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0ZXN0IG9mIHRoaXMucnVsZURlZmluaXRpb24udGVzdHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgcyA9IHRlc3QoY3Vyc29yLCBvbGRDdXJzb3IsIG1vZGUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsImltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4vU1JDdXJzb3JcIjtcblxuLyoqXG4gKiBUYWJsZVV0aWwgbmFtZXNwYWNlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBIVE1MIHRhYmxlcyBpbiB0aGUgYWNjZXNzaWJpbGl0eSBzaW11bGF0b3IuXG4gKiBUaGVzZSBmdW5jdGlvbnMgaGVscCBkZXRlcm1pbmUgY2VsbCBwb3NpdGlvbnMsIHJlbGF0aW9uc2hpcHMsIGFuZCBleHRyYWN0IGhlYWRlciBpbmZvcm1hdGlvblxuICogdG8gc2ltdWxhdGUgaG93IHNjcmVlbiByZWFkZXJzIHdvdWxkIGFubm91bmNlIHRhYmxlIG5hdmlnYXRpb24uXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgU1JUYWJsZVV0aWwge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSB0YWJsZSBjZWxsIHdpdGggaXRzIHBvc2l0aW9uIGFuZCBzcGFubmluZyBpbmZvcm1hdGlvblxuICAgICAqIEBwcm9wZXJ0eSByb3dJbmRleFN0YXJ0IC0gVGhlIHN0YXJ0aW5nIHJvdyBpbmRleCAoMC1iYXNlZClcbiAgICAgKiBAcHJvcGVydHkgY29sSW5kZXhTdGFydCAtIFRoZSBzdGFydGluZyBjb2x1bW4gaW5kZXggKDAtYmFzZWQpXG4gICAgICogQHByb3BlcnR5IHJvd3NwYW4gLSBOdW1iZXIgb2Ygcm93cyB0aGlzIGNlbGwgc3BhbnNcbiAgICAgKiBAcHJvcGVydHkgY29sc3BhbiAtIE51bWJlciBvZiBjb2x1bW5zIHRoaXMgY2VsbCBzcGFuc1xuICAgICAqIEBwcm9wZXJ0eSBjZWxsQ3Vyc29yIC0gU1JDdXJzb3IgcG9pbnRpbmcgdG8gdGhpcyBjZWxsXG4gICAgICovXG4gICAgZXhwb3J0IHR5cGUgQ2VsbE1vZGVsID0geyByb3dJbmRleFN0YXJ0OiBudW1iZXIsIGNvbEluZGV4U3RhcnQ6IG51bWJlciwgcm93c3BhbjogbnVtYmVyLCBjb2xzcGFuOiBudW1iZXIsIGNlbGxDdXJzb3I6IFNSQ3Vyc29yIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgcm93IGluIGEgdGFibGUgYXMgYW4gYXJyYXkgb2YgY2VsbCBtb2RlbHNcbiAgICAgKi9cbiAgICBleHBvcnQgdHlwZSBSb3dNb2RlbCA9IENlbGxNb2RlbFtdO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb21wbGV0ZSB0YWJsZSBhcyBhbiBhcnJheSBvZiByb3dzXG4gICAgICovXG4gICAgZXhwb3J0IHR5cGUgVGFibGVNb2RlbCA9IFJvd01vZGVsW107XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJzb3IgaXMgcG9pbnRpbmcgdG8gYSBjZWxsIGVsZW1lbnQgKFREIG9yIFRIKVxuICAgICAqIG9yIGhhcyBhIGNlbGwtcmVsYXRlZCBBUklBIHJvbGVcbiAgICAgKiBAcGFyYW0gY3Vyc29yIC0gVGhlIFNSQ3Vyc29yIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY3Vyc29yIGlzIG9uIGEgY2VsbCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ3Vyc29yQ2VsbFJvbGUoY3Vyc29yOiBTUkN1cnNvcikge1xuICAgICAgICBpZiAoIWN1cnNvci5nZXRFbGVtZW50KCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKFtcImNlbGxcIiwgXCJyb3doZWFkZXJcIiwgXCJjb2x1bW5oZWFkZXJcIl0uaW5jbHVkZXMoY3Vyc29yLmdldFJvbGUoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhY3Vyc29yLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIFtcIlRIXCIsIFwiVERcIl0uaW5jbHVkZXMoY3Vyc29yLmdldEVsZW1lbnQoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgY3Vyc29yIHBvaW50aW5nIHRvIHRoZSBjdXJyZW50IGNlbGwgb3IgdGhlIHBhcmVudCBjZWxsIGlmIHRoZSBjdXJzb3JcbiAgICAgKiBpcyBpbnNpZGUgYSBjZWxsJ3MgY29udGVudFxuICAgICAqIEBwYXJhbSBjdXJzb3IgLSBUaGUgU1JDdXJzb3IgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBTUkN1cnNvciBwb2ludGluZyB0byB0aGUgY2VsbCBvciBudWxsIGlmIG5vdCBpbiBhIGNlbGxcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudE9yUGFyZW50Q2VsbEN1cnNvcihjdXJzb3I6IFNSQ3Vyc29yKSA6IFNSQ3Vyc29yIHtcbiAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJjZWxsXCIsIFwicm93aGVhZGVyXCIsIFwiY29sdW1uaGVhZGVyXCJdLCBbXCJURFwiLFwiVEhcIl0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY29sc3BhbiBvZiBhIGNlbGwgYXQgYSBnaXZlbiBsb2NhdGlvblxuICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0byBnZXQgdGhlIGNvbHNwYW4gZnJvbVxuICAgICAqIEByZXR1cm5zIFRoZSBjb2xzcGFuIG9mIHRoZSBjZWxsIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbiBvciAwIGlmIG5vdCBpbiBhIGNvbHVtblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDb2xTcGFuKGN1cnNvcjogU1JDdXJzb3IpOiBudW1iZXIge1xuICAgICAgICBpZiAoIWlzQ3Vyc29yQ2VsbFJvbGUoY3Vyc29yKSkgcmV0dXJuIDA7XG4gICAgICAgIGxldCBjb2xTcGFuID0gY3Vyc29yLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpO1xuICAgICAgICBpZiAoY29sU3Bhbikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGNvbFNwYW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcm93c3BhbiBvZiBhIGNlbGwgYXQgYSBnaXZlbiBsb2NhdGlvblxuICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0byBnZXQgdGhlIHJvd3NwYW4gZnJvbVxuICAgICAqIEByZXR1cm5zIFRoZSByb3dzcGFuIG9mIHRoZSBjZWxsIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbiBvciAwIGlmIG5vdCBpbiBhIGNvbHVtblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRSb3dTcGFuKGN1cnNvcjogU1JDdXJzb3IpOiBudW1iZXIge1xuICAgICAgICBpZiAoIWlzQ3Vyc29yQ2VsbFJvbGUoY3Vyc29yKSkgcmV0dXJuIDA7XG4gICAgICAgIGxldCByb3dTcGFuID0gY3Vyc29yLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpO1xuICAgICAgICBpZiAocm93U3Bhbikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHJvd1NwYW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhIGNvbXBsZXRlIG1vZGVsIG9mIGEgdGFibGUncyBzdHJ1Y3R1cmUsIGFjY291bnRpbmcgZm9yIHJvd3NwYW4gYW5kIGNvbHNwYW5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSBlbnRpcmUgdGFibGUgYW5kIGNyZWF0ZXMgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHNcbiAgICAgKiB0aGUgbG9naWNhbCBncmlkIG9mIGNlbGxzLCBwcm9wZXJseSBoYW5kbGluZyBjZWxscyB0aGF0IHNwYW4gbXVsdGlwbGUgcm93cyBvciBjb2x1bW5zLlxuICAgICAqIFRoZSByZXN1bHRpbmcgbW9kZWwgbWFrZXMgaXQgZWFzaWVyIHRvIGRldGVybWluZSBjZWxsIHJlbGF0aW9uc2hpcHMgYW5kIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpblRhYmxlQ3Vyc29yIC0gQSBjdXJzb3Igd2l0aGluIHRoZSB0YWJsZVxuICAgICAqIEByZXR1cm5zIEEgVGFibGVNb2RlbCByZXByZXNlbnRpbmcgdGhlIGNvbXBsZXRlIHRhYmxlIHN0cnVjdHVyZSwgb3IgbnVsbCBpZiBub3QgaW4gYSB0YWJsZVxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZU1vZGVsKGluVGFibGVDdXJzb3I6IFNSQ3Vyc29yKTogVGFibGVNb2RlbCB7XG4gICAgICAgIC8vIEdldCBhIGN1cnNvciBwb2ludGluZyB0byB0aGUgdGFibGUgZWxlbWVudFxuICAgICAgICBsZXQgdGFibGVDdXJzb3IgPSBpblRhYmxlQ3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcInRhYmxlXCJdKTtcbiAgICAgICAgaWYgKCF0YWJsZUN1cnNvcikgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB3YWxrVGFibGVDdXJzb3IgPSB0YWJsZUN1cnNvci5jbG9uZSgpO1xuXG4gICAgICAgIGxldCByZXRWYWw6IFRhYmxlTW9kZWwgPSBbXTsgIC8vIFRoZSBjb21wbGV0ZSB0YWJsZSBtb2RlbCB3ZSdyZSBidWlsZGluZ1xuICAgICAgICBsZXQgY3VyUm93OiBSb3dNb2RlbCA9IFtdOyAgICAvLyBUaGUgY3VycmVudCByb3cgYmVpbmcgcHJvY2Vzc2VkXG4gICAgICAgIGxldCBwcmV2Um93OiBSb3dNb2RlbDsgICAgICAgIC8vIFRoZSBwcmV2aW91cyByb3cgKG5lZWRlZCBmb3Igcm93c3BhbiBoYW5kbGluZylcbiAgICAgICAgXG4gICAgICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgdGFibGUncyBET00gc3RydWN0dXJlXG4gICAgICAgIHdoaWxlICh3YWxrVGFibGVDdXJzb3IubmV4dCgoKSA9PiB0cnVlKSAmJiAhd2Fsa1RhYmxlQ3Vyc29yLmdldE5vZGUoKS5pc1NhbWVOb2RlKHRhYmxlQ3Vyc29yLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgIGlmICh3YWxrVGFibGVDdXJzb3IuaXNFbmRUYWcoKSAmJiB3YWxrVGFibGVDdXJzb3IuZ2V0Um9sZSgpID09PSBcInJvd1wiKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSByb3csIHB1c2ggd2hhdCB3ZSBoYXZlIGFuZCByZXNldFxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGN1clJvdyk7XG4gICAgICAgICAgICAgICAgcHJldlJvdyA9IGN1clJvdztcbiAgICAgICAgICAgICAgICBjdXJSb3cgPSBbXTtcblxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBjZWxscyB3aXRoIHJvd3NwYW4gZnJvbSBwcmV2aW91cyByb3dzIHRoYXQgYWZmZWN0IHRoaXMgcm93XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNlbGxzIHNwYW5uaW5nIG11bHRpcGxlIHJvd3MgYXJlIHByb3Blcmx5IHJlcHJlc2VudGVkIGluIHRoZSBtb2RlbFxuICAgICAgICAgICAgICAgIHdoaWxlIChwcmV2Um93ICYmIGN1clJvdy5sZW5ndGggPCBwcmV2Um93Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICgocHJldlJvd1tjdXJSb3cubGVuZ3RoXS5yb3dJbmRleFN0YXJ0ICsgcHJldlJvd1tjdXJSb3cubGVuZ3RoXS5yb3dzcGFuIC0gMSkgPj0gcmV0VmFsLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyUm93LnB1c2gocHJldlJvd1tjdXJSb3cubGVuZ3RoXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBQcm9jZXNzIGVhY2ggY2VsbCBpbiB0aGUgcm93XG4gICAgICAgICAgICBpZiAoIXdhbGtUYWJsZUN1cnNvci5pc0VuZFRhZygpICYmIGlzQ3Vyc29yQ2VsbFJvbGUod2Fsa1RhYmxlQ3Vyc29yKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHNwYW4gPSBnZXRDb2xTcGFuKHdhbGtUYWJsZUN1cnNvcik7XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY2VsbCBtb2RlbCB3aXRoIHBvc2l0aW9uIGFuZCBzcGFubmluZyBpbmZvcm1hdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxJbmZvOiBDZWxsTW9kZWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4U3RhcnQ6IHJldFZhbC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGNvbEluZGV4U3RhcnQ6IGN1clJvdy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHJvd3NwYW46IGdldFJvd1NwYW4od2Fsa1RhYmxlQ3Vyc29yKSxcbiAgICAgICAgICAgICAgICAgICAgY29sc3BhbixcbiAgICAgICAgICAgICAgICAgICAgY2VsbEN1cnNvcjogd2Fsa1RhYmxlQ3Vyc29yLmNsb25lKClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEZvciBjZWxscyB3aXRoIGNvbHNwYW4sIGFkZCB0aGUgc2FtZSBjZWxsIGluZm8gdG8gbXVsdGlwbGUgY29sdW1uc1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8Y29sc3BhbjsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyUm93LnB1c2goY2VsbEluZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBDb250aW51ZSBoYW5kbGluZyBjZWxscyB3aXRoIHJvd3NwYW4gZnJvbSBwcmV2aW91cyByb3dzXG4gICAgICAgICAgICAgICAgd2hpbGUgKHByZXZSb3cgJiYgY3VyUm93Lmxlbmd0aCA8IHByZXZSb3cubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgICAgKChwcmV2Um93W2N1clJvdy5sZW5ndGhdLnJvd0luZGV4U3RhcnQgKyBwcmV2Um93W2N1clJvdy5sZW5ndGhdLnJvd3NwYW4gLSAxKSA+PSByZXRWYWwubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJSb3cucHVzaChwcmV2Um93W2N1clJvdy5sZW5ndGhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjZWxsIG1vZGVsIGZvciBhIHNwZWNpZmljIGNlbGwgaW4gdGhlIHRhYmxlXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBDZWxsTW9kZWwgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHNwZWNpZmljIGNlbGwsXG4gICAgICogd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgaXRzIHBvc2l0aW9uIGFuZCBzcGFubmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbkNlbGxDdXJzb3IgLSBBIGN1cnNvciBwb2ludGluZyB0byBhIGNlbGwgb3IgaXRzIGNvbnRlbnRzXG4gICAgICogQHBhcmFtIHRhYmxlTW9kZWwgLSBPcHRpb25hbCBwcmUtYnVpbHQgdGFibGUgbW9kZWwgKHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWQpXG4gICAgICogQHJldHVybnMgVGhlIENlbGxNb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBjZWxsLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDZWxsTW9kZWwoaW5DZWxsQ3Vyc29yOiBTUkN1cnNvciwgdGFibGVNb2RlbD86IFRhYmxlTW9kZWwpIDogQ2VsbE1vZGVsIHtcbiAgICAgICAgbGV0IGNlbGxDdXJzb3IgPSBnZXRDdXJyZW50T3JQYXJlbnRDZWxsQ3Vyc29yKGluQ2VsbEN1cnNvcik7XG4gICAgICAgIGlmICghdGFibGVNb2RlbCkge1xuICAgICAgICAgICAgdGFibGVNb2RlbCA9IGdldFRhYmxlTW9kZWwoaW5DZWxsQ3Vyc29yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZWFyY2ggdGhyb3VnaCB0aGUgdGFibGUgbW9kZWwgdG8gZmluZCB0aGUgbWF0Y2hpbmcgY2VsbFxuICAgICAgICBmb3IgKGxldCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgdGFibGVNb2RlbC5sZW5ndGg7ICsrcm93SW5kZXgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCB0YWJsZU1vZGVsW3Jvd0luZGV4XS5sZW5ndGg7ICsrY29sSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFibGVNb2RlbFtyb3dJbmRleF1bY29sSW5kZXhdLmNlbGxDdXJzb3IuaXNTYW1lTm9kZShjZWxsQ3Vyc29yKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGVNb2RlbFtyb3dJbmRleF1bY29sSW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjZWxsIHNwYW5zIGEgc3BlY2lmaWMgY29sdW1uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2VsbE1vZGVsIC0gVGhlIGNlbGwgbW9kZWwgdG8gY2hlY2tcbiAgICAgKiBAcGFyYW0gY29sSWR4IC0gVGhlIGNvbHVtbiBpbmRleCB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNlbGwgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW5cbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gY2VsbE1vZGVsQ29udGFpbnNDb2x1bW4oY2VsbE1vZGVsOiBDZWxsTW9kZWwsIGNvbElkeDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBjb2xJZHggPj0gY2VsbE1vZGVsLmNvbEluZGV4U3RhcnQgJiYgY29sSWR4IDwgY2VsbE1vZGVsLmNvbEluZGV4U3RhcnQrY2VsbE1vZGVsLmNvbHNwYW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgY2VsbCBzcGFucyBhIHNwZWNpZmljIHJvd1xuICAgICAqXG4gICAgICogQHBhcmFtIGNlbGxNb2RlbCAtIFRoZSBjZWxsIG1vZGVsIHRvIGNoZWNrXG4gICAgICogQHBhcmFtIHJvd0lkeCAtIFRoZSByb3cgaW5kZXggdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjZWxsIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcm93XG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNlbGxNb2RlbENvbnRhaW5zUm93KGNlbGxNb2RlbDogQ2VsbE1vZGVsLCByb3dJZHg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gcm93SWR4ID49IGNlbGxNb2RlbC5yb3dJbmRleFN0YXJ0ICYmIHJvd0lkeCA8IGNlbGxNb2RlbC5yb3dJbmRleFN0YXJ0K2NlbGxNb2RlbC5yb3dzcGFuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvdyBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGxcbiAgICAgKiBGaXJzdCBjaGVja3MgZm9yIGV4cGxpY2l0IGhlYWRlcnMgYXR0cmlidXRlLCB0aGVuIGxvb2tzIGZvciByb3cgaGVhZGVycyBpbiB0aGUgc2FtZSByb3dcbiAgICAgKiBAcGFyYW0gY3Vyc29yIC0gVGhlIFNSQ3Vyc29yIHBvaW50aW5nIHRvIGEgY2VsbFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbmNhdGVuYXRlZCBoZWFkZXIgbmFtZXNcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Um93SGVhZGVycyhjdXJzb3I6IFNSQ3Vyc29yKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbHVtbiBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGxcbiAgICAgKiBGaXJzdCBjaGVja3MgZm9yIGV4cGxpY2l0IGhlYWRlcnMgYXR0cmlidXRlLCB0aGVuIGxvb2tzIGZvciBjb2x1bW4gaGVhZGVycyBpbiB0aGUgc2FtZSBjb2x1bW5cbiAgICAgKiBAcGFyYW0gY3Vyc29yIC0gVGhlIFNSQ3Vyc29yIHBvaW50aW5nIHRvIGEgY2VsbFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbmNhdGVuYXRlZCBoZWFkZXIgbmFtZXNcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Q29sdW1uSGVhZGVyc0ZvckN1cnNvcihpbkNlbGxDdXJzb3I6IFNSQ3Vyc29yLCB0YWJsZU1vZGVsPzogVGFibGVNb2RlbCkge1xuICAgICAgICBpZiAoIXRhYmxlTW9kZWwpIHtcbiAgICAgICAgICAgIHRhYmxlTW9kZWwgPSBnZXRUYWJsZU1vZGVsKGluQ2VsbEN1cnNvcik7XG4gICAgICAgICAgICBpZiAoIXRhYmxlTW9kZWwpIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbGxNb2RlbCA9IGdldENlbGxNb2RlbChpbkNlbGxDdXJzb3IsIHRhYmxlTW9kZWwpO1xuICAgICAgICBpZiAoIWNlbGxNb2RlbCkgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgY29uc3QgY2VsbEN1cnNvciA9IGNlbGxNb2RlbC5jZWxsQ3Vyc29yO1xuICAgICAgICBpZiAoIWNlbGxDdXJzb3IpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IGNlbGxFbGVtID0gY2VsbEN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgIGlmICghY2VsbEVsZW0pIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IGNvbERhdGFzOiBBcnJheTx7XG4gICAgICAgICAgICBwb3RlbnRpYWxDb2xIZWFkZXJzOiBTUkN1cnNvcltdLFxuICAgICAgICAgICAgZXhpc3RzRGF0YUNlbGw6IGJvb2xlYW4sXG4gICAgICAgICAgICBjb2xJZHg6IG51bWJlclxuICAgICAgICB9PiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBjb2xJZHggPSBjZWxsTW9kZWwuY29sSW5kZXhTdGFydDsgY29sSWR4IDwgY2VsbE1vZGVsLmNvbEluZGV4U3RhcnQrY2VsbE1vZGVsLmNvbHNwYW47ICsrY29sSWR4KSB7XG4gICAgICAgICAgICBjb2xEYXRhcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwb3RlbnRpYWxDb2xIZWFkZXJzOiBbXSxcbiAgICAgICAgICAgICAgICBleGlzdHNEYXRhQ2VsbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29sSWR4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcG90ZW50aWFsSGVhZGVyczogU1JDdXJzb3JbXSA9IFtdO1xuICAgICAgICBpZiAoY2VsbEVsZW0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycyA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIilcbiAgICAgICAgICAgICAgICAvLyBTcGxpdCB0aGUgaGVhZGVyIGF0dHJpYnV0ZSBpbnRvIGlkc1xuICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIilcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGUgZm9yIGVhY2ggaWRcbiAgICAgICAgICAgICAgICAubWFwKGlkID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlcbiAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIGJhZCBtYXBwaW5nc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiAhIW5vZGUpXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydCB0byBTUkN1cnNvcnMgdG8gdGhhdCB3ZSBjYW4gZ2V0IGFjY2Vzc2libGUgbmFtZXNcbiAgICAgICAgICAgICAgICAubWFwKG5vZGUgPT4gbmV3IFNSQ3Vyc29yKG5vZGUpKVxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBoZWFkZXJzIHRoYXQgYXJlbid0IGluIHRoZSBzYW1lIGNvbHVtbiAoaWdub3JlIGNvbHVtbiBoZWFkZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoY3Vyc29yID0+IGNvbERhdGFzLnNvbWUoY29sRGF0YSA9PiBjZWxsTW9kZWxDb250YWluc0NvbHVtbihTUlRhYmxlVXRpbC5nZXRDZWxsTW9kZWwoY3Vyc29yLCB0YWJsZU1vZGVsKSwgY29sRGF0YS5jb2xJZHgpKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgY2VsbHMgaW4gdGhpcyBjb2x1bW5cbiAgICAgICAgICAgIC8vIE5vdGUgLSBpZiBldmVyeXRoaW5nIGluIHRoaXMgY29sdW1uIGlzIGVtcHR5IG9yIGEgaGVhZGVyIGNlbGwsIHRoaXMgaXMgcHJvYmFibHkgbm90IGEgaGVhZGluZ1xuICAgICAgICAgICAgZm9yIChsZXQgcm93SWR4PTA7IHJvd0lkeCA8IHRhYmxlTW9kZWwubGVuZ3RoOyArK3Jvd0lkeCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29sRGF0YSBvZiBjb2xEYXRhcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xJZHggPSBjb2xEYXRhLmNvbElkeDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tJbmZvID0gdGFibGVNb2RlbFtyb3dJZHhdW2NvbElkeF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrQ3Vyc29yID0gY2hlY2tJbmZvLmNlbGxDdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrQ3Vyc29yRWxlbSA9IGNoZWNrQ3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyByb3cvY29sIGlzbid0IGZvdW5kLCBvciBpcyB0aGUgc2FtZSBjdXJzb3IgYXMgb3VyIG9yaWdpbmFsIGNlbGwgbW9kZWwsIG9yIGFscmVhZHkgaW4gb3VyIGxpc3QsIHNraXAsIGJ1dCBjaGVjayBpZiBpdCdzIGEgZGF0YSBjZWxsXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tJbmZvIHx8ICFjaGVja0N1cnNvciB8fCBjaGVja0N1cnNvci5pc1NhbWVOb2RlKGNlbGxDdXJzb3IpIHx8IHBvdGVudGlhbEhlYWRlcnMuc29tZShjID0+IGNoZWNrQ3Vyc29yLmlzU2FtZU5vZGUoYykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhLmV4aXN0c0RhdGFDZWxsID0gY29sRGF0YS5leGlzdHNEYXRhQ2VsbCB8fCAoaXNEYXRhQ2VsbChjaGVja0N1cnNvcikgJiYgKGNoZWNrQ3Vyc29yLmhhc05vbkVtcHR5TmFtZSgpIHx8IGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBjaGVja0N1cnNvci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDdXJzb3IuZ2V0Um9sZSgpID09PSBcImNvbHVtbmhlYWRlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhLnBvdGVudGlhbENvbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2hlY2tDdXJzb3JFbGVtLmhhc0F0dHJpYnV0ZShcInJvbGVcIikgJiYgY2hlY2tDdXJzb3JFbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVEhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ3Vyc29yRWxlbS5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PT0gXCJjb2xcIiB8fCBjaGVja0N1cnNvckVsZW0uZ2V0QXR0cmlidXRlKFwic2NvcGVcIikgPT09IFwiYXhpc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2hlY2tDdXJzb3JFbGVtLmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpICYmIGNoZWNrQ3Vyc29yLmhhc05vbkVtcHR5TmFtZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YS5leGlzdHNEYXRhQ2VsbCA9IGNvbERhdGEuZXhpc3RzRGF0YUNlbGwgfHwgKGlzRGF0YUNlbGwoY2hlY2tDdXJzb3IpICYmIChjaGVja0N1cnNvci5oYXNOb25FbXB0eU5hbWUoKSB8fCBjb2xEYXRhLnBvdGVudGlhbENvbEhlYWRlcnMubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBjb2xEYXRhIG9mIGNvbERhdGFzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb2xEYXRhLmV4aXN0c0RhdGFDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMgPSBwb3RlbnRpYWxIZWFkZXJzLmZpbHRlcihvbmUgPT4gY29sRGF0YXMuc29tZShjb2xEYXRhID0+IGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5zb21lKHR3byA9PiB0d28uaXNTYW1lTm9kZShvbmUpKSkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvdGVudGlhbEhlYWRlcnNcbiAgICAgICAgICAgIC8vIEFuZCB0aGVuIHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGhlYWRlcnNcbiAgICAgICAgICAgIC5tYXAoY3Vyc29yID0+IGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lIHx8IFwiXCIpXG4gICAgICAgICAgICAubWFwKHMgPT4gcy50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKHMgPT4gcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByb3cgaGVhZGVycyBhc3NvY2lhdGVkIHdpdGggYSBjZWxsXG4gICAgICogRmlyc3QgY2hlY2tzIGZvciBleHBsaWNpdCBoZWFkZXJzIGF0dHJpYnV0ZSwgdGhlbiBsb29rcyBmb3Igcm93IGhlYWRlcnMgaW4gdGhlIHNhbWUgcm93XG4gICAgICogQHBhcmFtIGN1cnNvciAtIFRoZSBTUkN1cnNvciBwb2ludGluZyB0byBhIGNlbGxcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBjb25jYXRlbmF0ZWQgaGVhZGVyIG5hbWVzXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFJvd0hlYWRlcnNGb3JDdXJzb3IoaW5DZWxsQ3Vyc29yOiBTUkN1cnNvciwgdGFibGVNb2RlbD86IFRhYmxlTW9kZWwpIHtcbiAgICAgICAgaWYgKCF0YWJsZU1vZGVsKSB7XG4gICAgICAgICAgICB0YWJsZU1vZGVsID0gZ2V0VGFibGVNb2RlbChpbkNlbGxDdXJzb3IpO1xuICAgICAgICAgICAgaWYgKCF0YWJsZU1vZGVsKSByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjZWxsTW9kZWwgPSBnZXRDZWxsTW9kZWwoaW5DZWxsQ3Vyc29yLCB0YWJsZU1vZGVsKTtcbiAgICAgICAgaWYgKCFjZWxsTW9kZWwpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IGNlbGxDdXJzb3IgPSBjZWxsTW9kZWwuY2VsbEN1cnNvcjtcbiAgICAgICAgaWYgKCFjZWxsQ3Vyc29yKSByZXR1cm4gXCJcIjtcblxuICAgICAgICBjb25zdCBjZWxsRWxlbSA9IGNlbGxDdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICBpZiAoIWNlbGxFbGVtKSByZXR1cm4gXCJcIjtcblxuICAgICAgICBjb25zdCByb3dEYXRhczogQXJyYXk8e1xuICAgICAgICAgICAgcG90ZW50aWFsUm93SGVhZGVyczogU1JDdXJzb3JbXSxcbiAgICAgICAgICAgIGV4aXN0c0RhdGFDZWxsOiBib29sZWFuLFxuICAgICAgICAgICAgcm93SWR4OiBudW1iZXJcbiAgICAgICAgfT4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcm93SWR4ID0gY2VsbE1vZGVsLnJvd0luZGV4U3RhcnQ7IHJvd0lkeCA8IGNlbGxNb2RlbC5yb3dJbmRleFN0YXJ0K2NlbGxNb2RlbC5yb3dzcGFuOyArK3Jvd0lkeCkge1xuICAgICAgICAgICAgcm93RGF0YXMucHVzaCh7XG4gICAgICAgICAgICAgICAgcG90ZW50aWFsUm93SGVhZGVyczogW10sXG4gICAgICAgICAgICAgICAgZXhpc3RzRGF0YUNlbGw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJvd0lkeFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcG90ZW50aWFsSGVhZGVyczogU1JDdXJzb3JbXSA9IFtdO1xuICAgICAgICBpZiAoY2VsbEVsZW0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycyA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIilcbiAgICAgICAgICAgICAgICAvLyBTcGxpdCB0aGUgaGVhZGVyIGF0dHJpYnV0ZSBpbnRvIGlkc1xuICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIilcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGUgZm9yIGVhY2ggaWRcbiAgICAgICAgICAgICAgICAubWFwKGlkID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlcbiAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIGJhZCBtYXBwaW5nc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiAhIW5vZGUpXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydCB0byBTUkN1cnNvcnMgdG8gdGhhdCB3ZSBjYW4gZ2V0IGFjY2Vzc2libGUgbmFtZXNcbiAgICAgICAgICAgICAgICAubWFwKG5vZGUgPT4gbmV3IFNSQ3Vyc29yKG5vZGUpKVxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBoZWFkZXJzIHRoYXQgYXJlbid0IGluIHRoZSBzYW1lIHJvdyAoaWdub3JlIGNvbHVtbiBoZWFkZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoY3Vyc29yID0+IHJvd0RhdGFzLnNvbWUocm93RGF0YSA9PiBjZWxsTW9kZWxDb250YWluc1JvdyhTUlRhYmxlVXRpbC5nZXRDZWxsTW9kZWwoY3Vyc29yLCB0YWJsZU1vZGVsKSwgcm93RGF0YS5yb3dJZHgpKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgY2VsbHMgaW4gdGhlIHJvd3NcbiAgICAgICAgICAgIC8vIE5vdGUgLSBpZiBldmVyeXRoaW5nIGluIHRoZSByb3cgaXMgZW1wdHkgb3IgYSBoZWFkZXIgY2VsbCwgdGhpcyBpcyBwcm9iYWJseSBub3QgYSBoZWFkaW5nXG4gICAgICAgICAgICBsZXQgbG9uZ2VzdFJvdyA9IHJvd0RhdGFzLnJlZHVjZSgocHJldiwgY3VyKSA9PiBNYXRoLm1heChwcmV2LCB0YWJsZU1vZGVsW2N1ci5yb3dJZHhdLmxlbmd0aCksIDApO1xuICAgICAgICAgICAgZm9yIChsZXQgY29sSWR4PTA7IGNvbElkeCA8IGxvbmdlc3RSb3c7ICsrY29sSWR4KSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByb3dEYXRhIG9mIHJvd0RhdGFzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd0lkeCA9IHJvd0RhdGEucm93SWR4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sSWR4ID49IHRhYmxlTW9kZWxbcm93SWR4XS5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZm8gPSB0YWJsZU1vZGVsW3Jvd0lkeF1bY29sSWR4XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJzb3IgPSBjaGVja0luZm8uY2VsbEN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJzb3JFbGVtID0gY2hlY2tDdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHJvdy9jb2wgaXNuJ3QgZm91bmQsIG9yIGlzIHRoZSBzYW1lIGN1cnNvciBhcyBvdXIgb3JpZ2luYWwgY2VsbCBtb2RlbCwgb3IgYWxyZWFkeSBpbiBvdXIgbGlzdCwgc2tpcCwgYnV0IGNoZWNrIGlmIGl0J3MgYSBkYXRhIGNlbGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0luZm8gfHwgIWNoZWNrQ3Vyc29yIHx8IGNoZWNrQ3Vyc29yLmlzU2FtZU5vZGUoY2VsbEN1cnNvcikgfHwgcG90ZW50aWFsSGVhZGVycy5zb21lKGMgPT4gY2hlY2tDdXJzb3IuaXNTYW1lTm9kZShjKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGEuZXhpc3RzRGF0YUNlbGwgPSByb3dEYXRhLmV4aXN0c0RhdGFDZWxsIHx8IChpc0RhdGFDZWxsKGNoZWNrQ3Vyc29yKSAmJiAoY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkgfHwgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGNoZWNrQ3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0N1cnNvci5nZXRSb2xlKCkgPT09IFwicm93aGVhZGVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGEucG90ZW50aWFsUm93SGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja0N1cnNvckVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBjaGVja0N1cnNvckVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJUSFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDdXJzb3JFbGVtLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09PSBcInJvd1wiIHx8IGNoZWNrQ3Vyc29yRWxlbS5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PT0gXCJheGlzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja0N1cnNvckVsZW0uaGFzQXR0cmlidXRlKFwic2NvcGVcIikgJiYgY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhLmV4aXN0c0RhdGFDZWxsID0gcm93RGF0YS5leGlzdHNEYXRhQ2VsbCB8fCAoaXNEYXRhQ2VsbChjaGVja0N1cnNvcikgJiYgKGNoZWNrQ3Vyc29yLmhhc05vbkVtcHR5TmFtZSgpIHx8IHJvd0RhdGEucG90ZW50aWFsUm93SGVhZGVycy5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJvd0RhdGEgb2Ygcm93RGF0YXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJvd0RhdGEuZXhpc3RzRGF0YUNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycyA9IHBvdGVudGlhbEhlYWRlcnMuZmlsdGVyKG9uZSA9PiByb3dEYXRhcy5zb21lKHJvd0RhdGEgPT4gcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLnNvbWUodHdvID0+IHR3by5pc1NhbWVOb2RlKG9uZSkpKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG90ZW50aWFsSGVhZGVyc1xuICAgICAgICAgICAgLy8gQW5kIHRoZW4gcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgaGVhZGVyc1xuICAgICAgICAgICAgLm1hcChjdXJzb3IgPT4gY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgfHwgXCJcIilcbiAgICAgICAgICAgIC5tYXAocyA9PiBzLnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIocyA9PiBzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBjZWxsIGlzIGEgZGF0YSBjZWxsIChub3QgYSBoZWFkZXIgY2VsbClcbiAgICAgKlxuICAgICAqIEEgZGF0YSBjZWxsIGlzIG9uZSB3aXRoIGVpdGhlcjpcbiAgICAgKiAtIEFuIGV4cGxpY2l0IEFSSUEgcm9sZSBvZiBcImNlbGxcIlxuICAgICAqIC0gQSBURCBlbGVtZW50IHdpdGhvdXQgYW4gb3ZlcnJpZGluZyByb2xlIGF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIGNoZWNrQ3Vyc29yIC0gVGhlIGN1cnNvciB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGN1cnNvciBwb2ludHMgdG8gYSBkYXRhIGNlbGxcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gaXNEYXRhQ2VsbChjaGVja0N1cnNvcjogU1JDdXJzb3IpIHtcbiAgICAgICAgY29uc3QgY2hlY2tDdXJzb3JFbGVtID0gY2hlY2tDdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICBpZiAoIWNoZWNrQ3Vyc29yRWxlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gY2hlY2tDdXJzb3IuZ2V0Um9sZSgpID09PSBcImNlbGxcIiB8fCAoIWNoZWNrQ3Vyc29yRWxlbS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIGNoZWNrQ3Vyc29yRWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlREXCIpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgbmFtZXNwYWNlIFNSVXRpbCB7XG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzTW9kYWxEaWFsb2dFbGVtZW50KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiByb2xlID09PSBcImRpYWxvZ1wiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1tb2RhbFwiKSA9PT0gXCJ0cnVlXCIgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIENTUyBzZWxlY3RvciBmb3IgYSBzcGVjaWZpYyBIVE1MIGVsZW1lbnRcbiAgICAgKiBUaGUgc2VsZWN0b3IgaXMgYnVpbHQgdXNpbmcgYSBjb21iaW5hdGlvbiBvZjpcbiAgICAgKiAxLiBFbGVtZW50IHRhZyBuYW1lXG4gICAgICogMi4gSUQgKGlmIGF2YWlsYWJsZSlcbiAgICAgKiAzLiBDbGFzc2VzIChpZiBhdmFpbGFibGUpXG4gICAgICogNC4gQXR0cmlidXRlcyAoaWYgbmVlZGVkKVxuICAgICAqIDUuIG50aC1jaGlsZCBzZWxlY3RvcnMgZm9yIHBvc2l0aW9uIGluIHBhcmVudFxuICAgICAqIFxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gZ2VuZXJhdGUgYSBzZWxlY3RvciBmb3JcbiAgICAgKiBAcGFyYW0gb3B0aW1pemVkIElmIHRydWUsIGNyZWF0ZXMgYSBzaG9ydGVyIGJ1dCBwb3NzaWJseSBsZXNzIHJvYnVzdCBzZWxlY3RvclxuICAgICAqIEByZXR1cm4gQSBDU1Mgc2VsZWN0b3Igc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZWxlbWVudFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRVbmlxdWVTZWxlY3RvcihlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW1pemVkOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYW4gSUQsIHRoYXQncyB0aGUgbW9zdCBkaXJlY3Qgd2F5IHRvIHNlbGVjdCBpdFxuICAgICAgICBpZiAoZWxlbWVudC5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIGAjJHtDU1MuZXNjYXBlKGVsZW1lbnQuaWQpfWA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHdlJ3JlIGF0IHRoZSByb290IG9yIGRvY3VtZW50IGVsZW1lbnQsIHJldHVybiB0aGUgdGFnIG5hbWVcbiAgICAgICAgaWYgKGVsZW1lbnQuaXNTYW1lTm9kZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHx8IGVsZW1lbnQuaXNTYW1lTm9kZShkb2N1bWVudC5ib2R5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBTdGFydCBidWlsZGluZyB0aGUgc2VsZWN0b3Igd2l0aCB0aGUgdGFnIG5hbWVcbiAgICAgICAgbGV0IHNlbGVjdG9yID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBBZGQgY2xhc3NlcyBpZiBhdmFpbGFibGUgYW5kIHdlJ3JlIG5vdCBvcHRpbWl6aW5nIGZvciBicmV2aXR5XG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5sZW5ndGggJiYgIW9wdGltaXplZCkge1xuICAgICAgICAgICAgLy8gVGFrZSB1cCB0byAzIGNsYXNzZXMgdG8gYXZvaWQgb3Zlcmx5IHNwZWNpZmljIHNlbGVjdG9yc1xuICAgICAgICAgICAgY29uc3QgY2xhc3NlcyA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpLnNsaWNlKDAsIDMpO1xuICAgICAgICAgICAgc2VsZWN0b3IgKz0gY2xhc3Nlcy5tYXAoY2xzID0+IGAuJHtDU1MuZXNjYXBlKGNscyl9YCkuam9pbignJyk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEFkZCBkaXN0aW5ndWlzaGluZyBhdHRyaWJ1dGVzIGlmIG5lZWRlZCBhbmQgbm90IG9wdGltaXppbmdcbiAgICAgICAgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIGFkZGluZyByb2xlLCBhcmlhLWxhYmVsLCBvciBvdGhlciBkaXN0aW5jdGl2ZSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3JvbGUnKSkge1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yICs9IGBbcm9sZT1cIiR7Q1NTLmVzY2FwZShlbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpIHx8ICcnKX1cIl1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSB8fCAnJztcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwubGVuZ3RoIDw9IDIwKSB7IC8vIEF2b2lkIG92ZXJseSBsb25nIHNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciArPSBgW2FyaWEtbGFiZWw9XCIke0NTUy5lc2NhcGUobGFiZWwpfVwiXWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGb3IgaW5wdXRzLCBhZGQgdHlwZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndHlwZScpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3IgKz0gYFt0eXBlPVwiJHtDU1MuZXNjYXBlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0eXBlJykgfHwgJycpfVwiXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBwYXJlbnQgbm9kZSwgZGV0ZXJtaW5lIHBvc2l0aW9uIGFtb25nIHNpYmxpbmdzXG4gICAgICAgIGlmIChlbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIEZpbmQgYWxsIHNpYmxpbmdzIHdpdGggdGhlIHNhbWUgdGFnXG4gICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IEFycmF5LmZyb20oZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQudGFnTmFtZSA9PT0gZWxlbWVudC50YWdOYW1lKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIHNpYmxpbmcgd2l0aCB0aGUgc2FtZSB0YWcsIGFkZCBudGgtY2hpbGRcbiAgICAgICAgICAgIGlmIChzaWJsaW5ncy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzaWJsaW5ncy5pbmRleE9mKGVsZW1lbnQpICsgMTtcbiAgICAgICAgICAgICAgICBzZWxlY3RvciArPSBgOm50aC1vZi10eXBlKCR7aW5kZXh9KWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBhdCB0aGUgcm9vdCwgcmVjdXJzaXZlbHkgYnVpbGQgdGhlIHBhcmVudCBzZWxlY3RvclxuICAgICAgICAgICAgLy8gYnV0IHVzZSBvcHRpbWl6ZWQgc2VsZWN0b3JzIGZvciBhbmNlc3RvcnMgdG8ga2VlcCB0aGUgb3ZlcmFsbCBzZWxlY3RvciBtYW5hZ2VhYmxlXG4gICAgICAgICAgICByZXR1cm4gYCR7Z2V0VW5pcXVlU2VsZWN0b3IoZWxlbWVudC5wYXJlbnRFbGVtZW50LCB0cnVlKX0gPiAke3NlbGVjdG9yfWA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICB9XG59IiwiaW1wb3J0IHsgU1JDb250cm9sbGVyIH0gZnJvbSBcIi4vU1JDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uTW9kZSwgTmF2aWdhdGlvblJlc3VsdCB9IGZyb20gXCIuL1NSVHlwZXNcIjtcblxuLyoqXG4gKiBTUk92ZXJsYXkgY2xhc3MgZm9yIGNyZWF0aW5nIGEgVUkgd2lkZ2V0IHRvIGNvbnRyb2wgc2NyZWVuIHJlYWRlciBzaW11bGF0aW9uXG4gKiBQcm92aWRlcyBidXR0b25zIGZvciBuYXZpZ2F0aW9uIGFuZCBkaXNwbGF5cyByZXN1bHRzXG4gKi9cbmV4cG9ydCBjbGFzcyBTUk92ZXJsYXkge1xuICAgIC8qKiBUaGUgY29udGFpbmVyIGVsZW1lbnQgZm9yIHRoZSBvdmVybGF5ICovXG4gICAgcHJpdmF0ZSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIC8qKiBUaGUgcmVzdWx0cyBkaXNwbGF5IGVsZW1lbnQgKi9cbiAgICBwcml2YXRlIHJlc3VsdHNEaXNwbGF5OiBIVE1MRWxlbWVudDtcbiAgICAvKiogTmF2aWdhdGlvbiBtb2RlcyBhdmFpbGFibGUgaW4gdGhlIFVJICovXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uTW9kZXM6IHsgbW9kZTogTmF2aWdhdGlvbk1vZGUsIGxhYmVsOiBzdHJpbmcgfVtdID0gW1xuICAgICAgICB7IG1vZGU6IFwiaXRlbVwiLCBsYWJlbDogXCJJdGVtXCIgfSxcbiAgICAgICAgeyBtb2RlOiBcInRhYl9mb2N1c1wiLCBsYWJlbDogXCJUYWJiYWJsZVwiIH0sXG4gICAgICAgIHsgbW9kZTogXCJoZWFkaW5nXCIsIGxhYmVsOiBcIkhlYWRpbmdcIiB9LFxuICAgICAgICB7IG1vZGU6IFwicmVnaW9uXCIsIGxhYmVsOiBcIlJlZ2lvblwiIH1cbiAgICBdO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUk92ZXJsYXlcbiAgICAgKiBAcGFyYW0gY29udHJvbGxlciBUaGUgU1JDb250cm9sbGVyIGluc3RhbmNlIHRvIHVzZSBmb3IgbmF2aWdhdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3JWaWV3ZXI6IFNSVmlld2VyKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlT3ZlcmxheSgpO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBjcmVhdGVET01FbGVtZW50KGVsZW1OYW1lOiBzdHJpbmcsIGF0dHJzOiB7IFthdHRyOiBzdHJpbmddOiBzdHJpbmd9LCBzdHlsZXM6IFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4pIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHRoaXMuc3JWaWV3ZXIudmlld2VyRG9jLmNyZWF0ZUVsZW1lbnQoZWxlbU5hbWUpO1xuICAgICAgICBpZiAoYXR0cnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsW2tleV0gPSBhdHRyc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdHlsZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHN0eWxlcykge1xuICAgICAgICAgICAgICAgIHJldFZhbC5zdHlsZVtrZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBvdmVybGF5IFVJIGVsZW1lbnRzIGFuZCBhZGRzIHRoZW0gdG8gdGhlIERPTVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgLy8gQ3JlYXRlIG1haW4gY29udGFpbmVyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJpYm1hLXNyLW92ZXJsYXlcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgIGJvdHRvbTogJzAnLFxuICAgICAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC44KScsXG4gICAgICAgICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgIHBhZGRpbmc6ICcxMHB4JyxcbiAgICAgICAgICAgIHpJbmRleDogJzEwMDAwJyxcbiAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICAgICAgZ2FwOiAnMTBweCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNvbnRyb2xzIGNvbnRhaW5lclxuICAgICAgICBjb25zdCBjb250cm9sc0NvbnRhaW5lciA9IHRoaXMuY3JlYXRlRE9NRWxlbWVudChcImRpdlwiLCB7fSwgeyBcbiAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLCBmbGV4V3JhcDogXCJ3cmFwXCIsIGdhcDogXCIxMHB4XCJ9KTtcblxuICAgICAgICAvLyBDcmVhdGUgbmF2aWdhdGlvbiBtb2RlIGdyb3Vwc1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25Nb2Rlcy5mb3JFYWNoKG5hdk1vZGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgbW9kZUdyb3VwID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdkaXYnLCB7fSwge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGdhcDogJzVweCcsXG4gICAgICAgICAgICAgICAgbWFyZ2luOiAnMCAxMHB4J1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG1vZGVHcm91cC5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ3NwYW4nLCB7XG4gICAgICAgICAgICAgICAgdGV4dENvbnRlbnQ6IG5hdk1vZGUubGFiZWwgKyBcIjpcIlxuICAgICAgICAgICAgfSwge30pKTtcblxuICAgICAgICAgICAgLy8gUHJldmlvdXMgYnV0dG9uXG4gICAgICAgICAgICBjb25zdCBwcmV2QnV0dG9uID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdidXR0b24nLCB7XG4gICAgICAgICAgICAgICAgdGV4dENvbnRlbnQ6ICfil4AgUHJldidcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnNXB4IDEwcHgnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyM0NDQnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAnd2hpdGUnLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJldkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc3JWaWV3ZXIubmF2aWdhdGVQcmV2aW91cyhuYXZNb2RlLm1vZGUpKTtcbiAgICAgICAgICAgIG1vZGVHcm91cC5hcHBlbmRDaGlsZChwcmV2QnV0dG9uKTtcblxuICAgICAgICAgICAgLy8gTmV4dCBidXR0b25cbiAgICAgICAgICAgIGNvbnN0IG5leHRCdXR0b24gPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0Q29udGVudDogJ05leHQg4pa2J1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICc1cHggMTBweCcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzQ0NCcsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXh0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zclZpZXdlci5uYXZpZ2F0ZU5leHQobmF2TW9kZS5tb2RlKSk7XG4gICAgICAgICAgICBtb2RlR3JvdXAuYXBwZW5kQ2hpbGQobmV4dEJ1dHRvbik7XG5cbiAgICAgICAgICAgIGNvbnRyb2xzQ29udGFpbmVyLmFwcGVuZENoaWxkKG1vZGVHcm91cCk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgb3RoZXJCdXR0b25Hcm91cCA9IHRoaXMuY3JlYXRlRE9NRWxlbWVudCgnZGl2Jywge30sIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICBnYXA6ICc1cHgnLFxuICAgICAgICAgICAgbWFyZ2luOiAnMCAxMHB4J1xuICAgICAgICB9KVxuICAgICAgICAvLyBTaG93IGFsbCBidXR0b25cbiAgICAgICAgY29uc3Qgc2hvd0FsbEJ1dHRvbiA9IHRoaXMuY3JlYXRlRE9NRWxlbWVudCgnYnV0dG9uJywge1xuICAgICAgICAgICAgdGV4dENvbnRlbnQ6ICdTaG93IGFsbCdcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4JyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyM0NDQnLFxuICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICB9KTtcbiAgICAgICAgc2hvd0FsbEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc3JWaWV3ZXIuc2hvd0FsbCh0cnVlKSk7XG4gICAgICAgIG90aGVyQnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQoc2hvd0FsbEJ1dHRvbik7XG5cbiAgICAgICAgLy8gVG9nZ2xlIFNwZWVjaCBCdXR0b25cbiAgICAgICAgY29uc3QgdG9nZ2xlU3BlZWNoID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdidXR0b24nLCB7XG4gICAgICAgICAgICB0ZXh0Q29udGVudDogJ1RvZ2dsZSBzcGVlY2gnXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHBhZGRpbmc6ICc1cHggMTBweCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjNDQ0JyxcbiAgICAgICAgICAgIGNvbG9yOiAnd2hpdGUnLFxuICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgICAgfSk7XG4gICAgICAgIHRvZ2dsZVNwZWVjaC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc3JWaWV3ZXIudG9nZ2xlU3BlZWNoKCkpO1xuICAgICAgICBvdGhlckJ1dHRvbkdyb3VwLmFwcGVuZENoaWxkKHRvZ2dsZVNwZWVjaCk7XG4gICAgICAgIGNvbnRyb2xzQ29udGFpbmVyLmFwcGVuZENoaWxkKG90aGVyQnV0dG9uR3JvdXApO1xuXG5cbiAgICAgICAgLy8gQ3JlYXRlIHJlc3VsdHMgZGlzcGxheVxuICAgICAgICB0aGlzLnJlc3VsdHNEaXNwbGF5ID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdkaXYnLCB7XG4gICAgICAgICAgICB0ZXh0Q29udGVudDogJ1NjcmVlbiByZWFkZXIgc2ltdWxhdGlvbiByZXN1bHRzIHdpbGwgYXBwZWFyIGhlcmUuJ1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBwYWRkaW5nOiAnMTBweCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSknLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgICAgIG1pbkhlaWdodDogJzEwMHB4JyxcbiAgICAgICAgICAgIG1heEhlaWdodDogJzUwdmgnLFxuICAgICAgICAgICAgZm9udEZhbWlseTogJ21vbm9zcGFjZScsXG4gICAgICAgICAgICBvdmVyZmxvdzogJ2F1dG8nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCBlbGVtZW50cyB0byBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoY29udHJvbHNDb250YWluZXIpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnJlc3VsdHNEaXNwbGF5KTtcblxuICAgICAgICAvLyBBZGQgdG8gZG9jdW1lbnRcbiAgICAgICAgdGhpcy5zclZpZXdlci52aWV3ZXJEb2MuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheSB0aGUgbmF2aWdhdGlvbiByZXN1bHQgaW4gdGhlIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBuYXZpZ2F0aW9uIHJlc3VsdFxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdXNlZFxuICAgICAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIG5hdmlnYXRpb24gZGlyZWN0aW9uICgnbmV4dCcsICdwcmV2aW91cycsIG9yICdmb2N1cycpXG4gICAgICovXG4gICAgcHVibGljIGRpc3BsYXlSZXN1bHQocmVzdWx0OiBOYXZpZ2F0aW9uUmVzdWx0LCBtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgZGlyZWN0aW9uOiAnbmV4dCcgfCAncHJldmlvdXMnIHwgJ2ZvY3VzJyk6IHZvaWQge1xuICAgICAgICBsZXQgZGlzcGxheVRleHQgPSAnJztcbiAgICAgICAgXG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI/Pz9cIiwgcmVzdWx0KTtcbiAgICAgICAgICAgIGRpc3BsYXlUZXh0ID0gYCR7ZGlyZWN0aW9uLnRvVXBwZXJDYXNlKCl9ICR7bW9kZX06ICR7cmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaXNwbGF5VGV4dCA9IGAke2RpcmVjdGlvbi50b1VwcGVyQ2FzZSgpfSAke21vZGV9OiAke3Jlc3VsdC5yZW5kZXJpbmdSZXN1bHQubWVzc2FnZX1gO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5yZW5kZXJpbmdSZXN1bHQuZW5kPy5nZXRFbGVtZW50KCk/LnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgIHJlc3VsdC5yZW5kZXJpbmdSZXN1bHQuc3RhcnQ/LmdldEVsZW1lbnQoKT8uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgd2luZG93LnNjcm9sbEJ5KDAsIC0yMDApO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5yZXN1bHRzRGlzcGxheS5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB0aGlzLnJlc3VsdHNEaXNwbGF5LnRleHRDb250ZW50ID0gZGlzcGxheVRleHQ7XG4gICAgICAgIGxldCBpbnNwZWN0QnV0dG9uID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgIGlubmVyVGV4dDogXCJEZWJ1Z1wiXG4gICAgICAgIH0sIHtcbiAgICAgICAgfSk7XG4gICAgICAgIGluc3BlY3RCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5yZW5kZXJpbmdSZXN1bHQuc3RhcnQ/LmdldE5vZGUoKSwgcmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5lbmQ/LmdldE5vZGUoKSk7XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMucmVzdWx0c0Rpc3BsYXkuYXBwZW5kQ2hpbGQoaW5zcGVjdEJ1dHRvbilcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcGxheUFsbChyZXN1bHQ6IEFycmF5PHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwidGFibGVcIiwge30sIHt9KTtcbiAgICAgICAgY29uc3QgaGVhZGVyUm93ID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwidHJcIiwge30sIHt9KTtcbiAgICAgICAgY29uc3QgaGVhZGluZ0xhYmVscyA9IFtcIlJlZ2lvblwiLCBcIkhlYWRpbmdcIiwgXCJJdGVtXCIsIFwiVGFiYmFibGVcIl07XG4gICAgICAgIGNvbnN0IGhlYWRpbmdGaWVsZHMgPSBbXCJyZWdpb25cIiwgXCJoZWFkaW5nXCIsIFwiaXRlbVwiLCBcInRhYl9mb2N1c1wiXTtcbiAgICAgICAgZm9yIChjb25zdCBoZWFkaW5nTGFiZWwgb2YgaGVhZGluZ0xhYmVscykge1xuICAgICAgICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRE9NRWxlbWVudChcInRoXCIsIHtcbiAgICAgICAgICAgICAgICBzY29wZTogXCJjb2xcIixcbiAgICAgICAgICAgICAgICBpbm5lclRleHQ6IGhlYWRpbmdMYWJlbFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogXCJsZWZ0XCIsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogXCIuMjVyZW1cIixcbiAgICAgICAgICAgICAgICBtYXJnaW46IFwiMHJlbVwiLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBcIndoaXRlXCJcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKGhlYWRlclJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcmVzdWx0KSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhUm93ID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwidHJcIiwge30sIHt9KTtcbiAgICAgICAgICAgIGhlYWRpbmdGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhUm93LmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRE9NRWxlbWVudChcInRkXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJUZXh0OiBsaW5lW2ZpZWxkXVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogXCJ0b3BcIixcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBcInNvbGlkIHdoaXRlIDFweFwiLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIi4yNXJlbVwiLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IFwiMHJlbVwiLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCJ3aGl0ZVwiXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKGRhdGFSb3cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzdWx0c0Rpc3BsYXkuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgdGhpcy5yZXN1bHRzRGlzcGxheS5hcHBlbmRDaGlsZCh0YWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBvdmVybGF5IGZyb20gdGhlIERPTVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250YWluZXIgJiYgdGhpcy5jb250YWluZXIucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogU1JWaWV3ZXIgY2xhc3MgZm9yIG1hbmFnaW5nIHNjcmVlbiByZWFkZXIgc2ltdWxhdGlvbiB3aXRoIFVJIGNvbnRyb2xzXG4gKi9cbmV4cG9ydCBjbGFzcyBTUlZpZXdlciB7XG4gICAgLyoqIFRoZSBjb250cm9sbGVyIGluc3RhbmNlICovXG4gICAgcHJpdmF0ZSBjb250cm9sbGVyOiBTUkNvbnRyb2xsZXI7XG4gICAgLyoqIFRoZSBvdmVybGF5IFVJIGluc3RhbmNlICovXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBTUk92ZXJsYXk7XG4gICAgLyoqIEZsYWcgdG8gdHJhY2sgaWYgc3BlZWNoIGlzIGFjdGl2ZSAqL1xuICAgIHByaXZhdGUgaXNTdHJlYW1pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKiogRmxhZyB0byBzZXQgaWYgc2hvd2luZyBhbGwgKi9cbiAgICBwcml2YXRlIGlzU2hvd2luZ0FsbDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKiBGbGFnIHRvIHNldCBpZiBpdCBzaG91bGQgYmUgc3BlYWtpbmcgKi9cbiAgICBwcml2YXRlIHNwZWVjaEVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKiogS2V5Ym9hcmQgZXZlbnQgaGFuZGxlciAqL1xuICAgIHByaXZhdGUga2V5Ym9hcmRIYW5kbGVyOiAoZTogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZDtcbiAgICAvKiogRm9jdXMgZXZlbnQgaGFuZGxlciAqL1xuICAgIHByaXZhdGUgZm9jdXNIYW5kbGVyOiAoZTogRm9jdXNFdmVudCkgPT4gdm9pZDtcbiAgICB2aWV3ZXJEb2M6IEhUTUxEb2N1bWVudDtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU1JWaWV3ZXJcbiAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCB0byBzdGFydCBmcm9tIChkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5KVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJvb3RFbGVtZW50OiBOb2RlID0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICB0aGlzLnZpZXdlckRvYyA9IHJvb3RFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIC8vIENyZWF0ZSBjb250cm9sbGVyIGZvciB0aGUgZG9jdW1lbnQgYm9keVxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBTUkNvbnRyb2xsZXIuZ2V0Q29udHJvbGxlcih0aGlzLnZpZXdlckRvYyk7XG4gICAgICAgIFxuICAgICAgICAvLyBDcmVhdGUgb3ZlcmxheSBVSVxuICAgICAgICB0aGlzLm92ZXJsYXkgPSBuZXcgU1JPdmVybGF5KHRoaXMpO1xuICAgICAgICBcbiAgICAgICAgLy8gU2V0IHVwIGtleWJvYXJkIGhhbmRsZXJzXG4gICAgICAgIHRoaXMuc2V0dXBLZXlib2FyZEhhbmRsZXJzKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBTZXQgdXAgZm9jdXMgdHJhY2tpbmdcbiAgICAgICAgdGhpcy5zZXR1cEZvY3VzVHJhY2tpbmcoKTtcblxuICAgICAgICAvLyBTZXQgdXAgbXV0YXRpb24gdHJhY2tpbmdcbiAgICAgICAgdGhpcy5zZXR1cE11dGF0aW9uVHJhY2tpbmcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd0FsbChiRW5hYmxlQWxsTW9kZT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGJFbmFibGVBbGxNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmlzU2hvd2luZ0FsbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gU1JDb250cm9sbGVyLnJlbmRlclN0cnVjdHVyZSh0aGlzLnZpZXdlckRvYyk7XG4gICAgICAgIHRoaXMub3ZlcmxheS5kaXNwbGF5QWxsKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZVNwZWVjaCgpIHtcbiAgICAgICAgdGhpcy5zcGVlY2hFbmFibGVkID0gIXRoaXMuc3BlZWNoRW5hYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZSB0byB0aGUgbmV4dCBlbGVtZW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdG8gdXNlXG4gICAgICovXG4gICAgcHVibGljIG5hdmlnYXRlTmV4dChtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzU2hvd2luZ0FsbCA9IGZhbHNlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRyb2xsZXIuanVtcE5leHQobW9kZSk7XG4gICAgICAgIHRoaXMub3ZlcmxheS5kaXNwbGF5UmVzdWx0KHJlc3VsdCwgbW9kZSwgJ25leHQnKTtcbiAgICAgICAgdGhpcy5zcGVha1Jlc3VsdChyZXN1bHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlIHRvIHRoZSBwcmV2aW91cyBlbGVtZW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdG8gdXNlXG4gICAgICovXG4gICAgcHVibGljIG5hdmlnYXRlUHJldmlvdXMobW9kZTogTmF2aWdhdGlvbk1vZGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1Nob3dpbmdBbGwgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250cm9sbGVyLmp1bXBQcmV2aW91cyhtb2RlKTtcbiAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlSZXN1bHQocmVzdWx0LCBtb2RlLCAncHJldmlvdXMnKTtcbiAgICAgICAgdGhpcy5zcGVha1Jlc3VsdChyZXN1bHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB1cCBrZXlib2FyZCBldmVudCBoYW5kbGVycyBmb3Igc2NyZWVuIHJlYWRlciBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cEtleWJvYXJkSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRIYW5kbGVyID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIERvbid0IGNhcHR1cmUga2V5Ym9hcmQgZXZlbnRzIHdoZW4gZm9jdXMgaXMgaW4gZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgdGFyZ2V0LnRhZ05hbWUgPT09ICdURVhUQVJFQScgfHwgdGFyZ2V0LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBIYW5kbGUga2V5Ym9hcmQgc2hvcnRjdXRzXG4gICAgICAgICAgICBpZiAoZS5jdHJsS2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gQ3RybCBrZXkgc3RvcHMgc3BlZWNoXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wU3BlZWNoKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGUuYWx0S2V5IHx8IGUubWV0YUtleSkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZS5rZXkpO1xuICAgICAgICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2aW91cygnaXRlbScpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0cmVhbWluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgnaXRlbScpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUN1cnJlbnRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5zZXRQb2ludE9mUmVnYXJkKHRoaXMudmlld2VyRG9jLmFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdIJzpcbiAgICAgICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2aW91cygnaGVhZGluZycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZU5leHQoJ2hlYWRpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdSJzpcbiAgICAgICAgICAgICAgICBjYXNlICdyJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2aW91cygncmVnaW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgncmVnaW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2aW91cygndGFiX2ZvY3VzJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgndGFiX2ZvY3VzJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBBZGQgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgIHRoaXMudmlld2VyRG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWJvYXJkSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzcGVha1Jlc3VsdChyZXN1bHQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNwZWVjaEVuYWJsZWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgdXR0ZXJhbmNlID0gbmV3IFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZShyZXN1bHQucmVuZGVyaW5nUmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB1dHRlcmFuY2UucmF0ZSA9IDEuNTtcbiAgICAgICAgbGV0IG15VGhpcyA9IHRoaXM7XG4gICAgICAgIHV0dGVyYW5jZS5hZGRFdmVudExpc3RlbmVyKFwiZW5kXCIsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKG15VGhpcy5pc1N0cmVhbWluZykge1xuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCdpdGVtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzcGVlY2hTeW50aGVzaXMuY2FuY2VsKCk7XG4gICAgICAgIHNwZWVjaFN5bnRoZXNpcy5zcGVhayh1dHRlcmFuY2UpO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBTdG9wIHNwZWVjaCBvdXRwdXRcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0b3BTcGVlY2goKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gQ2FuY2VsIGFueSBhY3RpdmUgc3BlZWNoIHN5bnRoZXNpc1xuICAgICAgICBzcGVlY2hTeW50aGVzaXMuY2FuY2VsKCk7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFNldCB1cCBtdXRhdGlvbiB0cmFja2luZ1xuICAgICAqL1xuICAgIHByaXZhdGUgc2V0dXBNdXRhdGlvblRyYWNraW5nKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaXNTaG93aW5nQWxsLCBtdXRhdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2hvd2luZ0FsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHNpZGVPdmVybGF5ID0gbXV0YXRpb25zLmZpbHRlcihtdXRhdGlvbiA9PiBtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDEgXG4gICAgICAgICAgICAgICAgICAgICYmICEobXV0YXRpb24udGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiLmlibWEtc3Itb3ZlcmxheVwiKSlcbiAgICAgICAgICAgICAgICBpZiAob3V0c2lkZU92ZXJsYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk11dGF0aW9uc1wiLG91dHNpZGVPdmVybGF5KTtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbXlUaGlzID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgbXlUaGlzLnNob3dBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBteVRoaXMuc2hvd0FsbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnZpZXdlckRvYy5kb2N1bWVudEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMudmlld2VyRG9jLmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgIHN1YnRyZWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHVwIGZvY3VzIHRyYWNraW5nIHRvIHVwZGF0ZSB0aGUgcG9pbnQgb2YgcmVnYXJkIHdoZW4gZm9jdXMgY2hhbmdlc1xuICAgICAqL1xuICAgIHByaXZhdGUgc2V0dXBGb2N1c1RyYWNraW5nKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvY3VzSGFuZGxlciA9IChlOiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBTa2lwIGlmIHRoZSBmb2N1cyBpcyBvbiB0aGUgb3ZlcmxheSBpdHNlbGZcbiAgICAgICAgICAgIGlmIChlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmxheSAmJiB0YXJnZXQuY2xvc2VzdCgnLmlibWEtc3Itb3ZlcmxheScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChcImZvY3VzSGFuZGxlclwiKTtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHBvaW50IG9mIHJlZ2FyZCB0byB0aGUgbmV3bHkgZm9jdXNlZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250cm9sbGVyLnNldFBvaW50T2ZSZWdhcmQodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBBbm5vdW5jZSB0aGUgZm9jdXMgY2hhbmdlXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheS5kaXNwbGF5UmVzdWx0KHJlc3VsdCwgJ2ZvY3VzJywgJ2ZvY3VzJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlYWtSZXN1bHQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gQWRkIHRoZSBmb2N1cyBldmVudCBsaXN0ZW5lciB0byB0aGUgZG9jdW1lbnRcbiAgICAgICAgdGhpcy52aWV3ZXJEb2MuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMuZm9jdXNIYW5kbGVyKTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogQWN0aXZhdGUgKGNsaWNrKSB0aGUgZWxlbWVudCBhdCB0aGUgY3VycmVudCBwb2ludCBvZiByZWdhcmRcbiAgICAgKi9cbiAgICBwcml2YXRlIGFjdGl2YXRlQ3VycmVudEVsZW1lbnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gdGhpcy5jb250cm9sbGVyLmdldFBvaW50T2ZSZWdhcmQoKS5nZXRFbGVtZW50KCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIEFubm91bmNlIHRoYXQgd2UncmUgYWN0aXZhdGluZyB0aGUgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBBY3RpdmF0aW5nOiAke2N1cnJlbnRFbGVtZW50LnRleHRDb250ZW50IHx8IGN1cnJlbnRFbGVtZW50Lm5vZGVOYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmNvbnRyb2xsZXIuZ2V0UG9pbnRPZlJlZ2FyZCgpLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuY29udHJvbGxlci5nZXRQb2ludE9mUmVnYXJkKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlSZXN1bHQocmVzdWx0LCAnZm9jdXMnLCAnZm9jdXMnKTtcbiAgICAgICAgICAgIHRoaXMuc3BlYWtSZXN1bHQocmVzdWx0KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRm9jdXMgdGhlIGVsZW1lbnQgZmlyc3RcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5mb2N1cykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFNpbXVsYXRlIGEgY2xpY2sgb24gdGhlIGVsZW1lbnRcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyBUaGUgU1JDb250cm9sbGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgcHVibGljIGdldENvbnRyb2xsZXIoKTogU1JDb250cm9sbGVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSB2aWV3ZXIgYW5kIGNsZWFuIHVwIHJlc291cmNlc1xuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHRoaXMudmlld2VyRG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWJvYXJkSGFuZGxlcik7XG4gICAgICAgIHRoaXMudmlld2VyRG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCB0aGlzLmZvY3VzSGFuZGxlcik7XG4gICAgICAgIFxuICAgICAgICAvLyBTdG9wIGFueSBhY3RpdmUgc3BlZWNoXG4gICAgICAgIHRoaXMuc3RvcFNwZWVjaCgpO1xuICAgICAgICBcbiAgICAgICAgLy8gRGVzdHJveSBvdmVybGF5XG4gICAgICAgIHRoaXMub3ZlcmxheS5kZXN0cm95KCk7XG4gICAgfVxufSIsImltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4uL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBTUlJlbmRlcmVyUnVsZSB9IGZyb20gXCIuLi9TUlJlbmRlcmVyUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IE5hdmlnYXRpb25Nb2RlIH0gZnJvbSBcIi4uL1NSVHlwZXNcIjtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBuYW1lLCBzdXJyb3VuZGVkIGJ5IHRoZSBxdW90ZUNoYXJCZWZvcmUgYW5kIHF1b3RlQ2hhckFmdGVyIGFuZCBmb2xsb3dlZCBieSB0aGUgcGFkZGluZyBpZiB0aGUgbmFtZSBleGlzdHNcbiAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBmb3Igd2hpY2ggdG8gZmV0Y2ggdGhlIG5hbWVcbiAqIEBwYXJhbSBwYWRkaW5nIFN0cmluZyB0byBhZGQgYWZ0ZXIsIGlmIHRoZSBuYW1lIGV4aXN0c1xuICogQHBhcmFtIHF1b3RlQ2hhckJlZm9yZSBUaGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgbGVhZGluZyBxdW90ZSwgaWYgdGhlIG5hbWUgZXhpc3RzXG4gKiBAcGFyYW0gcXVvdGVDaGFyQmVmb3JlIFRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSB0cmFpbGluZyBxdW90ZSwgaWYgdGhlIG5hbWUgZXhpc3RzXG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcjogU1JDdXJzb3IsIHBhZGRpbmc/OiBzdHJpbmcsIHF1b3RlQ2hhckJlZm9yZT86IHN0cmluZywgcXVvdGVDaGFyQWZ0ZXI/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3Vyc29yLmdldE5hbWUoKSBcbiAgICAgICAgPyBgJHtxdW90ZU5hbWUoY3Vyc29yKX0ke3BhZGRpbmcgfHwgXCIsIFwifWBcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIFByb3ZpZGUgdGhlIG5hbWUsIHN1cnJvdW5kZWQgYnkgcXVvdGVzIGFuZCBwcmVjZWRlZCBieSB0aGUgcGFkZGluZyBpZiB0aGUgbmFtZSBleGlzdHNcbiAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBmb3Igd2hpY2ggdG8gZmV0Y2ggdGhlIG5hbWVcbiAqIEBwYXJhbSBwYWRkaW5nIFN0cmluZyB0byBhZGQgYmVmb3JlLCBpZiB0aGUgbmFtZSBleGlzdHMgKGRlZmF1bHRzIHRvIFwiLCBcIilcbiAqIEByZXR1cm5zIFRoZSBxdW90ZWQgbmFtZSB3aXRoIGxlYWRpbmcgcGFkZGluZywgb3IgZW1wdHkgc3RyaW5nIGlmIG5vIG5hbWUgZXhpc3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yOiBTUkN1cnNvciwgcGFkZGluZz86IHN0cmluZykge1xuICAgIHJldHVybiBjdXJzb3IuZ2V0TmFtZSgpXG4gICAgICAgID8gYCR7cGFkZGluZyB8fCBcIiwgXCJ9JHtxdW90ZU5hbWUoY3Vyc29yKX1gXG4gICAgICAgIDogXCJcIjtcbn1cblxuLyoqXG4gKiBQcm92aWRlIHRoZSBuYW1lIHN1cnJvdW5kZWQgYnkgcXVvdGUgY2hhcmFjdGVyc1xuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGZvciB3aGljaCB0byBmZXRjaCB0aGUgbmFtZVxuICogQHBhcmFtIHF1b3RlQ2hhckJlZm9yZSBUaGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgbGVhZGluZyBxdW90ZSAoZGVmYXVsdHMgdG8gXCIpXG4gKiBAcGFyYW0gcXVvdGVDaGFyQWZ0ZXIgVGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHRyYWlsaW5nIHF1b3RlIChkZWZhdWx0cyB0byBcIilcbiAqIEByZXR1cm5zIFRoZSBxdW90ZWQgbmFtZSwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vIG5hbWUgZXhpc3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZU5hbWUoY3Vyc29yOiBTUkN1cnNvciwgcXVvdGVDaGFyQmVmb3JlPzogc3RyaW5nLCBxdW90ZUNoYXJBZnRlcj86IHN0cmluZykge1xuICAgIHJldHVybiBjdXJzb3IuZ2V0TmFtZSgpXG4gICAgICAgID8gYCR7cXVvdGVDaGFyQmVmb3JlIHx8ICdcIid9JHtjdXJzb3IuZ2V0TmFtZSgpfSR7cXVvdGVDaGFyQWZ0ZXIgfHwgJ1wiJ31gXG4gICAgICAgIDogXCJcIjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHJvbGUgZGVzY3JpcHRpb24gZm9yIGFuIGVsZW1lbnQsIHVzaW5nIGFyaWEtcm9sZWRlc2NyaXB0aW9uIGlmIHByZXNlbnRcbiAqIEZhbGxzIGJhY2sgdG8gdGhlIHByb3ZpZGVkIGRlZmF1bHQgcm9sZSBuYW1lIGlmIGFyaWEtcm9sZWRlc2NyaXB0aW9uIGlzIG5vdCBzcGVjaWZpZWQgb3IgZW1wdHlcbiAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBwb3NpdGlvbmVkIGF0IHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gZGVmYXVsdFJvbGUgVGhlIGRlZmF1bHQgcm9sZSBuYW1lIHRvIHVzZSBpZiBhcmlhLXJvbGVkZXNjcmlwdGlvbiBpcyBub3QgcHJlc2VudFxuICogQHJldHVybnMgVGhlIHJvbGUgZGVzY3JpcHRpb24gKGVpdGhlciBjdXN0b20gb3IgZGVmYXVsdClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3I6IFNSQ3Vyc29yLCBkZWZhdWx0Um9sZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICBpZiAoIWVsZW0pIHJldHVybiBkZWZhdWx0Um9sZTtcbiAgICBcbiAgICBjb25zdCByb2xlRGVzY3JpcHRpb24gPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCIpO1xuICAgIGlmIChyb2xlRGVzY3JpcHRpb24gJiYgcm9sZURlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByb2xlRGVzY3JpcHRpb24udHJpbSgpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZGVmYXVsdFJvbGU7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIHNjcmVlbiByZWFkZXIgYW5ub3VuY2VtZW50IGZvciBhIGxpbmsgZWxlbWVudFxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHNhbWUtcGFnZSBsaW5rcyAoYW5jaG9ycykgYW5kIHJlZ3VsYXIgbGlua3NcbiAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBwb3NpdGlvbmVkIGF0IHRoZSBsaW5rIGVsZW1lbnRcbiAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgKGFmZmVjdHMgYW5ub3VuY2VtZW50IG9yZGVyKVxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBsaW5rIGFubm91bmNlbWVudCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmtBbm5vdW5jZW1lbnQoY3Vyc29yOiBTUkN1cnNvciwgbW9kZT86IE5hdmlnYXRpb25Nb2RlKTogc3RyaW5nIHtcbiAgICBsZXQgaHJlZjogc3RyaW5nID0gKChjdXJzb3IuZ2V0Tm9kZSgpIGFzIGFueSkuaHJlZikgfHwgXCJcIjtcbiAgICBsZXQgYW5ub3VuY2VTdHIgPSBcIlwiO1xuICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoZG9jdW1lbnQubG9jYXRpb24uaHJlZikgJiYgaHJlZi5jaGFyQXQoZG9jdW1lbnQubG9jYXRpb24uaHJlZi5sZW5ndGgpID09PSBcIiNcIikge1xuICAgICAgICBhbm5vdW5jZVN0ciA9IGBzYW1lIHBhZ2UgbGlua2A7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYW5ub3VuY2VTdHIgPSBgbGlua2A7XG4gICAgfVxuICAgIGxldCBuYW1lSW5mbyA9IGN1cnNvci5nZXROYW1lSW5mbygpO1xuICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHthbm5vdW5jZVN0cn1dYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7YW5ub3VuY2VTdHJ9JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYFske2Fubm91bmNlU3RyfV1gO1xufVxuXG4vKipcbiAqIEdldCB0aGUgZGVzY3JpcHRpb24gdGV4dCBmcm9tIGFyaWEtZGVzY3JpYmVkYnkgcmVmZXJlbmNlc1xuICogUmVzb2x2ZXMgYWxsIElEcyBpbiBhcmlhLWRlc2NyaWJlZGJ5IGFuZCBjb25jYXRlbmF0ZXMgdGhlaXIgdGV4dCBjb250ZW50XG4gKiBAcGFyYW0gZWxlbSBUaGUgZWxlbWVudCB3aXRoIGFyaWEtZGVzY3JpYmVkYnkgYXR0cmlidXRlXG4gKiBAcGFyYW0gbW9kZSBUaGUgbmF2aWdhdGlvbiBtb2RlIChyZXR1cm5zIGVtcHR5IHN0cmluZyBpbiBcIml0ZW1cIiBtb2RlKVxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkZXNjcmlwdGlvbiB0ZXh0IHdpdGggbGVhZGluZyBjb21tYSBhbmQgcXVvdGVzLCBvciBlbXB0eSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGVsZW06IEhUTUxFbGVtZW50LCBtb2RlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZXNjcmliZWRCeSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiKTtcbiAgICBpZiAoIWRlc2NyaWJlZEJ5KSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBkZXNjcmlwdGlvbkVsZW1zID0gZGVzY3JpYmVkQnlcbiAgICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgICAgLm1hcChpZCA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpXG4gICAgICAgIC5maWx0ZXIoZGVzY0VsZW0gPT4gISFkZXNjRWxlbSkgYXMgSFRNTEVsZW1lbnRbXTtcblxuICAgIGNvbnN0IGRlc2NyaXB0aW9uVGV4dCA9IGRlc2NyaXB0aW9uRWxlbXNcbiAgICAgICAgLm1hcChkZXNjRWxlbSA9PiBkZXNjRWxlbS50ZXh0Q29udGVudD8udHJpbSgpKVxuICAgICAgICAuZmlsdGVyKHRleHQgPT4gISF0ZXh0KVxuICAgICAgICAuam9pbihcIiBcIik7XG5cbiAgICBpZiAoIWRlc2NyaXB0aW9uVGV4dCB8fCBkZXNjcmlwdGlvblRleHQubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIpIHJldHVybiBgLCBcXHUwMDAxJHtkZXNjcmlwdGlvblRleHR9XFx1MDAwMmA7XG4gICAgcmV0dXJuIGAsIFwiJHtkZXNjcmlwdGlvblRleHR9XCJgO1xufVxuXG4vKipcbiAqIEdldCBzdGF0ZSBhbm5vdW5jZW1lbnRzIGZvciBkaXNhYmxlZCwgcmVhZG9ubHksIHJlcXVpcmVkLCBhbmQgaW52YWxpZCBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0gZWxlbSBUaGUgZWxlbWVudCB0byBjaGVjayBmb3Igc3RhdGUgYXR0cmlidXRlc1xuICogQHJldHVybnMgQSBzdHJpbmcgd2l0aCBzdGF0ZSBhbm5vdW5jZW1lbnRzIChlLmcuLCBcIiwgZGlzYWJsZWRcIiwgXCIsIHJlYWQgb25seVwiLCBcIiwgcmVxdWlyZWRcIiwgXCIsIGludmFsaWRcIilcbiAqL1xuZnVuY3Rpb24gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGVsZW06IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgICBsZXQgc3RhdGVzID0gXCJcIjtcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgZGlzYWJsZWQgc3RhdGUgKGJvdGggYXR0cmlidXRlIGFuZCBhcmlhLWRpc2FibGVkKVxuICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1kaXNhYmxlZFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgc3RhdGVzICs9IFwiLCBkaXNhYmxlZFwiO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcmVhZG9ubHkgc3RhdGUgKGJvdGggYXR0cmlidXRlIGFuZCBhcmlhLXJlYWRvbmx5KVxuICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInJlYWRvbmx5XCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1yZWFkb25seVwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgc3RhdGVzICs9IFwiLCByZWFkIG9ubHlcIjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHN0YXRlIChib3RoIGF0dHJpYnV0ZSBhbmQgYXJpYS1yZXF1aXJlZClcbiAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcmVxdWlyZWRcIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgIHN0YXRlcyArPSBcIiwgcmVxdWlyZWRcIjtcbiAgICAgICAgLy8gQSByZXF1aXJlZCA8c2VsZWN0PiB3aG9zZSBzZWxlY3RlZCB2YWx1ZSBpcyBcIlwiIGlzIGltcGxpY2l0bHkgaW52YWxpZCDigJRcbiAgICAgICAgLy8gSkFXUyBhbmQgTlZEQSBhbm5vdW5jZSBcImludmFsaWQgZW50cnlcIiBpbiB0aGlzIGNhc2UuXG4gICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0VMRUNUXCIgJiYgKGVsZW0gYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbGlkaXR5LnZhbHVlTWlzc2luZykge1xuICAgICAgICAgICAgc3RhdGVzICs9IFwiLCBpbnZhbGlkIGVudHJ5XCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBzdGF0ZSAoYXJpYS1pbnZhbGlkKVxuICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaW52YWxpZFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgc3RhdGVzICs9IFwiLCBpbnZhbGlkXCI7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzdGF0ZXM7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBsaXN0aXRlbSBjb250YWlucyBpbnRlcmFjdGl2ZS93aWRnZXQgZWxlbWVudHNcbiAqIFNjcmVlbiByZWFkZXJzIHR5cGljYWxseSBkb24ndCByZWFkIHRoZSBhY2Nlc3NpYmxlIG5hbWUgb2YgYSBsaXN0aXRlbSB3aGVuIGl0IGNvbnRhaW5zIGludGVyYWN0aXZlIGVsZW1lbnRzXG4gKiBVc2VzIERPTVdhbGtlciB0byBwcm9wZXJseSB0cmF2ZXJzZSBzaGFkb3cgRE9NIGFuZCBvdGhlciBjb21wbGV4IHN0cnVjdHVyZXNcbiAqL1xuZnVuY3Rpb24gbGlzdGl0ZW1Db250YWluc0ludGVyYWN0aXZlRWxlbWVudChjdXJzb3I6IFNSQ3Vyc29yKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgaWYgKCFlbGVtKSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgLy8gVXNlIERPTVdhbGtlciB0byB0cmF2ZXJzZSB0aGUgZW50aXJlIHN1YnRyZWUgaW5jbHVkaW5nIHNoYWRvdyBET01cbiAgICBjb25zdCB3YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGVsZW0sIGZhbHNlLCBlbGVtLCBmYWxzZSk7XG4gICAgXG4gICAgLy8gV2FsayB0aHJvdWdoIGFsbCBkZXNjZW5kYW50c1xuICAgIHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgICAvLyBPbmx5IGNoZWNrIGVsZW1lbnQgbm9kZXMgYXQgc3RhcnQgdGFnc1xuICAgICAgICBpZiAod2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgIXdhbGtlci5iRW5kVGFnKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHdhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChyb2xlICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucm9sZVR5cGUgPT09ICd3aWRnZXQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFuIGlmcmFtZSdzIGNvbnRlbnQgY2FuIGJlIGFjY2Vzc2VkIChub3QgY3Jvc3Mtb3JpZ2luKVxuICogQXR0ZW1wdHMgdG8gYWNjZXNzIHRoZSBpZnJhbWUncyBkb2N1bWVudCB0byBkZXRlcm1pbmUgaWYgaXQncyBhY2Nlc3NpYmxlXG4gKiBAcGFyYW0gaWZyYW1lIFRoZSBpZnJhbWUgZWxlbWVudCB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaWZyYW1lIGNvbnRlbnQgaXMgYWNjZXNzaWJsZSwgZmFsc2UgaWYgY3Jvc3Mtb3JpZ2luIG9yIGJsb2NrZWRcbiAqL1xuZnVuY3Rpb24gY2FuQWNjZXNzRnJhbWUoaWZyYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB0aHJvd3MgYSBET01FeGNlcHRpb24gZm9yIGNyb3NzLW9yaWdpbiBmcmFtZXNcbiAgICAgICAgY29uc3QgZG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgcmV0dXJuIGRvYyAhPT0gbnVsbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gaWYgKGUgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiYgZS5uYW1lID09PSAnU2VjdXJpdHlFcnJvcicpIHtcbiAgICAgICAgLy8gICAgIHJldHVybiBmYWxzZTsgLy8gQ3Jvc3Mtb3JpZ2luLCBhY2Nlc3MgYmxvY2tlZFxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIHRocm93IGU7IC8vIFJlLXRocm93IHVuZXhwZWN0ZWQgZXJyb3JzXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUlVMRVM6IFNSUmVuZGVyZXJSdWxlW10gPSBbXG4gICAgLy8gU2luZ2xlIHJvbGUgcnVsZXMgLSBhbHBoYWJldGljYWxseSBzb3J0ZWRcbiAgICBcbiAgICAvLyBCdXR0b24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJidXR0b25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJidXR0b25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbdG9nZ2xlICR7cm9sZURlc2N9LCBwcmVzc2VkJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX0ke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhlbGVtLCBtb2RlKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImJ1dHRvblwiKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXByZXNzZWRcIikgPT09IFwiZmFsc2VcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFt0b2dnbGUgJHtyb2xlRGVzY30sIG5vdCBwcmVzc2VkJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX0ke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhlbGVtLCBtb2RlKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBsZXQgZXhwYW5kU3RyID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgIGlmIChbXCJtZW51XCIsIFwidHJ1ZVwiXS5pbmNsdWRlcyhlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZFN0ciArPSBcIiwgbWVudVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZFN0ciArPSBgLCAke2VsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKSA9PT0gXCJ0cnVlXCIgPyBcImV4cGFuZGVkXCIgOiBcImNvbGxhcHNlZFwifWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4cGFuZFN0ciArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9JHtleHBhbmRTdHJ9JHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoZWxlbSwgbW9kZSl9XWA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHsgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gXCJcIjsgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDaGVja2JveCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiY2hlY2tib3hcIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImNoZWNrYm94XCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhdGVTdHIgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikgPT09IFwibWl4ZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTdHIgPSBcImhhbGYgY2hlY2tlZFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJDaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hlY2tlZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1jaGVja2VkXCIpID09PSBcInRydWVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoZWNrZWQgPSBlbGVtLmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0ciA9IGJDaGVja2VkID8gXCJjaGVja2VkXCIgOiBcIm5vdCBjaGVja2VkXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RhdGVTdHIgKz0gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3JvbGVEZXNjfSwgJHtzdGF0ZVN0cn0ke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV1gXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDZWxsLCBDb2x1bW5oZWFkZXIsIGFuZCBSb3doZWFkZXIgcm9sZXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcInJvd2hlYWRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYmxlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgY2VsbCBlbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbEVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGlmICghY2VsbEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjZWxsIGhhcyBhbnkgdmlzaWJsZSBjb250ZW50IGJ5IGNoZWNraW5nOlxuICAgICAgICAgICAgICAgIC8vIDEuIFRleHQgY29udGVudCAodHJpbW1lZClcbiAgICAgICAgICAgICAgICAvLyAyLiBDaGlsZCBlbGVtZW50cyB3aXRoIHJvbGVzIChidXR0b25zLCBsaW5rcywgZXRjLilcbiAgICAgICAgICAgICAgICAvLyAzLiBJbWFnZXMgd2l0aCBhbHQgdGV4dFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gY2VsbEVsZW0udGV4dENvbnRlbnQ/LnRyaW0oKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjaGlsZCBlbGVtZW50cyB3aXRoIGludGVyYWN0aXZlIHJvbGVzIG9yIGNvbnRlbnRcbiAgICAgICAgICAgICAgICBjb25zdCB3YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGNlbGxFbGVtLCBmYWxzZSwgY2VsbEVsZW0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBsZXQgaGFzQ29udGVudCA9IHRleHRDb250ZW50Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBlbGVtZW50cyB0aGF0IHdvdWxkIGhhdmUgY29udGVudCAoYnV0dG9ucywgbGlua3MsIGltYWdlcywgZXRjLilcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgIXdhbGtlci5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IHdhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGludGVyYWN0aXZlIGVsZW1lbnRzIG9yIGVsZW1lbnRzIHdpdGggYWNjZXNzaWJsZSBuYW1lc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb2xlICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBpbWFnZXMgd2l0aCBhbHQgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSU1HXCIgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY2VsbCBpcyBlbXB0eSwgcmV0dXJuIFwiW2JsYW5rXVwiXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIltibGFua11cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gbnVsbCB0byBsZXQgZGVmYXVsdCByZW5kZXJpbmcgY29udGludWVcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29tYm9ib3ggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImNvbWJvXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzRW5kVGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJjb21ibyBib3hcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gXCIsIGNvbGxhcHNlZFwiO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdEVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVFbGVtID0gc2VsZWN0RWxlbS5zZWxlY3RlZEluZGV4ID49IDAgPyBzZWxlY3RFbGVtLm9wdGlvbnNbc2VsZWN0RWxlbS5zZWxlY3RlZEluZGV4XSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZVN0ciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gbmV3IFNSQ3Vyc29yKHZhbHVlRWxlbSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHIgPSBxdW90ZU5hbWVQYWRCZWZvcmUodGVtcCwgXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfSR7c3RhdGV9JHt2YWx1ZVN0cn1dYDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJTlBVVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gYCwgJHtlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikgPT09IFwidHJ1ZVwiID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlICs9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9JHtzdGF0ZX0sIGhhcyBhdXRvIGNvbXBsZXRlLCBlZGl0YWJsZSwgb3BlbnMgbGlzdF1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gYCwgJHtlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikgPT09IFwidHJ1ZVwiID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBgLCBoYXMgYXV0byBjb21wbGV0ZWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgKz0gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGVsZW0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgY3VycmVudCB2YWx1ZSB0byBhbm5vdW5jZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gMS4gSWYgZXhwYW5kZWQgYW5kIGFyaWEtY29udHJvbHMgcG9pbnRzIHRvIGEgbGlzdGJveCwgdXNlIHRoZSBhcmlhLXNlbGVjdGVkIG9wdGlvbiB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC8vIDIuIE90aGVyd2lzZSB1c2UgdGhlIGNvbWJvYm94IGVsZW1lbnQncyBvd24gdGV4dCBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZVN0ciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xzSWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvcHVwID0gY29udHJvbHNJZCA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRyb2xzSWQpIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcHVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHBvcHVwLnF1ZXJ5U2VsZWN0b3IoXCJbcm9sZT0nb3B0aW9uJ11bYXJpYS1zZWxlY3RlZD0ndHJ1ZSddXCIpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyID0gYCwgXCIkeyhzZWxlY3RlZE9wdGlvbi50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCl9XCJgO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWVTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gKGVsZW0udGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHIgPSBgLCBcIiR7dGV4dENvbnRlbnR9XCJgO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9JHtzdGF0ZX0ke3ZhbHVlU3RyfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdGJveCByb2xlIC0gY292ZXJzIDxzZWxlY3Qgc2l6ZT4gLyA8c2VsZWN0IG11bHRpcGxlPlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJsaXN0Ym94XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiY29tYm9cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImxpc3QgYm94XCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGxldCBzdGF0ZSA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdEVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbnMgPSBBcnJheS5mcm9tKHNlbGVjdEVsZW0ub3B0aW9ucykuZmlsdGVyKG8gPT4gby5zZWxlY3RlZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlU3RyID0gc2VsZWN0ZWRPcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKG8gPT4gcXVvdGVOYW1lUGFkQmVmb3JlKG5ldyBTUkN1cnNvcihvLCBmYWxzZSksIFwiLCBcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgKz0gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY30ke3N0YXRlfSR7dmFsdWVTdHJ9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEFSSUEgbGlzdGJveCAobm9uLXNlbGVjdClcbiAgICAgICAgICAgICAgICBzdGF0ZSArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSAoZWxlbS50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVTdHIgPSB0ZXh0Q29udGVudCA/IGAsIFwiJHt0ZXh0Q29udGVudH1cImAgOiBcIlwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfSR7c3RhdGV9JHt2YWx1ZVN0cn1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRGVmYXVsdCByb2xlIChmYWxsYmFjaylcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZGVmYXVsdFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID9cbiAgICAgICAgICAgICAgICBgISE8JHtjdXJzb3IuZ2V0Um9sZSgpfT4keyhjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSArIFwiXCIpfSEhYCA6XG4gICAgICAgICAgICAgICAgYCEhPC8ke2N1cnNvci5nZXRSb2xlKCl9PiEhYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBEZWxldGlvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImRlbGV0aW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IChjdXJzb3IuaXNTdGFydFRhZygpICYmIGBbZGVsZXRlZF1gIHx8IFwiXCIpXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIERpYWxvZyByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImRpYWxvZ1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5pc0VuZFRhZygpID8gYFtFbmQgb2YgZGlhbG9nXWAgOiBgW1N0YXJ0IG9mIGRpYWxvZyR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29udGVudGVkaXRhYmxlIChlZGl0YWJsZSByZWdpb24pIC0gZWxlbWVudHMgd2l0aCBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgKG9yIFwiXCIpXG4gICAgLy8gTXVzdCBjb21lIGJlZm9yZSB0aGUgZ2VuZXJpYy9kb2N1bWVudCBydWxlIHNvIGl0IHRha2VzIHByZWNlZGVuY2UuXG4gICAgLy8gU2NyZWVuIHJlYWRlcnMgKEpBV1MvTlZEQSkgYW5ub3VuY2UgdGhlc2UgYXMgYW4gZWRpdGFibGUgc2VjdGlvbiB3aGVuIGVudGVyaW5nXG4gICAgLy8gYW5kIFwib3V0IG9mIHNlY3Rpb25cIiB3aGVuIGxlYXZpbmcuXG4gICAgLy8gV2UgdXNlIGEgYnJvYWQgZWxlbWVudCBsaXN0IChjb3ZlcmluZyB0aGUgbW9zdCBjb21tb24gaG9zdCBlbGVtZW50cykgcGx1c1xuICAgIC8vIFwiZ2VuZXJpY1wiIGFuZCBcInBhcmFncmFwaFwiIHJvbGVzIHNvIGJvdGggYmFyZSA8ZGl2PiBhbmQgbGFiZWxsZWQgdmFyaWFudHMgYXJlIGNhdWdodC5cbiAgICAvLyBUaGUgdGVzdCBmdW5jdGlvbiBhbHdheXMgY2hlY2tzIHRoZSBhdHRyaWJ1dGUgYW5kIGJhaWxzIG91dCB3aGVuOlxuICAgIC8vICAgLSB0aGUgYXR0cmlidXRlIGlzIGFic2VudCBvciBcImZhbHNlXCJcbiAgICAvLyAgIC0gYW4gZXhwbGljaXQgQVJJQSByb2xlIG92ZXJyaWRlcyB0aGUgc2VtYW50aWNzIChlLmcuIHJvbGU9XCJ0ZXh0Ym94XCIpXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImdlbmVyaWNcIiwgXCJwYXJhZ3JhcGhcIl0sXG4gICAgICAgIGVsZW1zOiBbXCJESVZcIiwgXCJTUEFOXCIsIFwiUFwiLCBcIlNFQ1RJT05cIiwgXCJBUlRJQ0xFXCIsIFwiSEVBREVSXCIsIFwiRk9PVEVSXCIsIFwiTUFJTlwiLCBcIkFTSURFXCIsIFwiTkFWXCIsIFwiTElcIiwgXCJURFwiLCBcIlRIXCIsIFwiUFJFXCIsIFwiQkxPQ0tRVU9URVwiLCBcIkZJR1VSRVwiLCBcIkZJR0NBUFRJT05cIiwgXCJERVRBSUxTXCIsIFwiU1VNTUFSWVwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBjZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjZSAhPT0gXCJ0cnVlXCIgJiYgY2UgIT09IFwiXCIpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIC8vIERlZmVyIHRvIHRoZSBleHBsaWNpdC1yb2xlIHJ1bGUgd2hlbiBhbiBhdXRob3IgcHJvdmlkZXMgYSBjb25jcmV0ZSBBUklBIHJvbGVcbiAgICAgICAgICAgICAgICAvLyAoZS5nLiByb2xlPVwidGV4dGJveFwiKSDigJQgdGhvc2Ugcm9sZXMgY2FycnkgcmljaGVyIHNlbWFudGljcyBhbmQgdGhlaXIgb3duIHJ1bGVzLlxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIC8vIDxwPiByZXRhaW5zIGl0cyBcInBhcmFncmFwaFwiIHNlbWFudGljcyBldmVuIHdoZW4gZWRpdGFibGUuXG4gICAgICAgICAgICAgICAgY29uc3QgaXNQYXJhZ3JhcGggPSBjdXJzb3IuZ2V0Um9sZSgpID09PSBcInBhcmFncmFwaFwiIHx8IGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJQXCI7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlID09PSBcIml0ZW1cIiA/IChpc1BhcmFncmFwaCA/IFwiW291dCBvZiBwYXJhZ3JhcGhdXCIgOiBcIltvdXQgb2Ygc2VjdGlvbl1cIikgOiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBhcmlhLXJlYWRvbmx5IGlzIG5vdCBhIHN1cHBvcnRlZCBzdGF0ZSBvbiBjb250ZW50ZWRpdGFibGUgZWxlbWVudHMg4oCUXG4gICAgICAgICAgICAgICAgLy8gc2NyZWVuIHJlYWRlcnMgKEpBV1MvTlZEQSkgaWdub3JlIGl0IGVudGlyZWx5LCBzbyB3ZSBleGNsdWRlIGl0IGhlcmUuXG4gICAgICAgICAgICAgICAgLy8gT25seSBkaXNhYmxlZCBpcyBtZWFuaW5nZnVsIChpdCBvdmVycmlkZXMgdGhlIGVkaXRhYmxlIHNlbWFudGljcykuXG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlQW5ub3VuY2VtZW50cyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZUFubm91bmNlbWVudHMgPSBcIiwgZGlzYWJsZWRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyV29yZCA9IGlzUGFyYWdyYXBoID8gXCJwYXJhZ3JhcGhcIiA6IFwic2VjdGlvblwiO1xuICAgICAgICAgICAgICAgIC8vIEluIHRhYl9mb2N1cyBtb2RlLCBvbmx5IGFwcGVuZCB0ZXh0Q29udGVudCB3aGVuIHRoZSBhY2Nlc3NpYmxlIG5hbWVcbiAgICAgICAgICAgICAgICAvLyBpcyBleHRyaW5zaWMgKGFyaWEtbGFiZWwgLyBhcmlhLWxhYmVsbGVkYnksIGkuZS4gbmFtZUZyb20g4omgIFwiY29udGVudFwiL1widGV4dFwiKS5cbiAgICAgICAgICAgICAgICAvLyBXaGVuIG5hbWVGcm9tIElTIFwiY29udGVudFwiLCBqdW1wQ3VycmVudEVuZCBhbHJlYWR5IHdhbGtzIGNoaWxkcmVuIHNvXG4gICAgICAgICAgICAgICAgLy8gYXBwZW5kaW5nIGFnYWluIHdvdWxkIGR1cGxpY2F0ZSB0aGUgdGV4dC5cbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lSW5mbyA9IGN1cnNvci5nZXROYW1lSW5mbygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVGcm9tQ29udGVudCA9ICFuYW1lSW5mbyB8fCBbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhbmFtZUZyb21Db250ZW50KSA/IGVsZW0udGV4dENvbnRlbnQ/LnRyaW0oKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFN1ZmZpeCA9IHRleHRDb250ZW50ID8gYCAke3RleHRDb250ZW50fWAgOiBcIlwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke2NvbnRhaW5lcldvcmR9LCBlZGl0YWJsZSR7c3RhdGVBbm5vdW5jZW1lbnRzfV0ke2NvbnRlbnRTdWZmaXh9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRG9jdW1lbnQgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJkb2N1bWVudFwiLCBcImdlbmVyaWNcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoKSA9PiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEdyYXBoaWNzIGRvY3VtZW50IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JhcGhpY3MtZG9jdW1lbnRcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJpbWFnZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgIWN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICYmIGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFubm91bmNlIHVubGFiZWxlZCBncmFwaGljcyB0aGF0IGFyZSBoaWRkZW4gaW5zaWRlIGxpbmtzIG9yIGhlYWRpbmdzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEhlYWRpbmdPckxpbmsgPSBjdXJzb3IuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiaGVhZGluZ1wiLCBcImxpbmtcIl0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SGVhZGluZ09yTGluayAmJiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjdXJzb3IuZ2V0RWxlbWVudCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW1VubGFiZWxlZCBncmFwaGljXVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgKGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lID09PSBcIlwiKSkgPyBcIlwiIDogbnVsbCxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSAmJiBgW2dyYXBoaWMke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gKSB8fCBudWxsLFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IChjdXJzb3IuaXNFbmRUYWcoKSkgPyBcIlwiIDogbnVsbFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBIZWFkaW5nIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yOiBTUkN1cnNvciwgbW9kZTogTmF2aWdhdGlvbk1vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiBjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgY3Vyc29yLmlzRW5kVGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGxldCBsZXZlbDogc3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmFyaWFMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFeHBsaWNpdCBhcmlhLWxldmVsIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IG5vZGUuYXJpYUxldmVsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ2hlYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJvbGU9XCJoZWFkaW5nXCIgd2l0aG91dCBhcmlhLWxldmVsIGRlZmF1bHRzIHRvIDJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAnMic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTmF0aXZlIGhlYWRpbmcgZWxlbWVudCAoaDEtaDYpLCBleHRyYWN0IG51bWJlciBmcm9tIHRhZyBuYW1lXG4gICAgICAgICAgICAgICAgICAgIGxldmVsID0gbm9kZS5ub2RlTmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IG5hbWVJbmZvID0gY3Vyc29yLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICAgICAgaWYgKCghbmFtZUluZm8gfHwgW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSAmJiAhKG5vZGUudGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW2hlYWRpbmcgbGV2ZWwgJHtsZXZlbH0ke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW2hlYWRpbmcgbGV2ZWwgJHtsZXZlbH1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIC0tIGluIGhlYWRpbmcgbW9kZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJoZWFkaW5nXCIsIFwiaDFcIiwgXCJoMlwiLCBcImgzXCIsIFwiaDRcIiwgXCJoNVwiLCBcImg2XCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxldmVsOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5hcmlhTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0IGFyaWEtbGV2ZWwgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IG5vZGUuYXJpYUxldmVsO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdoZWFkaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm9sZT1cImhlYWRpbmdcIiB3aXRob3V0IGFyaWEtbGV2ZWwgZGVmYXVsdHMgdG8gMlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAnMic7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXRpdmUgaGVhZGluZyBlbGVtZW50IChoMS1oNiksIGV4dHJhY3QgbnVtYmVyIGZyb20gdGFnIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gbm9kZS5ub2RlTmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZUluZm8gPSBjdXJzb3IuZ2V0TmFtZUluZm8oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghbmFtZUluZm8gfHwgW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSAmJiAhKG5vZGUudGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWhlYWRpbmcgbGV2ZWwgJHtsZXZlbH1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEltYWdlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiaW1nXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiaW1hZ2VcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICYmIGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhbm5vdW5jZSB1bmxhYmVsZWQgZ3JhcGhpY3MgdGhhdCBhcmUgaGlkZGVuIGluc2lkZSBsaW5rcyBvciBoZWFkaW5nc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZXNlIHdlcmUgb25seSBpbmNsdWRlZCBiZWNhdXNlIG9mIHRoZSBTS0lQX0lURU1fQkVIQVZJT1IgY2hhbmdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SGVhZGluZ09yTGluayA9IGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJoZWFkaW5nXCIsIFwibGlua1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SGVhZGluZ09yTGluayAmJiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjdXJzb3IuZ2V0RWxlbWVudCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW1VubGFiZWxlZCBncmFwaGljXVwiXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbZ3JhcGhpYyR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSW5zZXJ0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiaW5zZXJ0aW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IChjdXJzb3IuaXNTdGFydFRhZygpICYmIGBbaW5zZXJ0ZWRdYCB8fCBcIlwiKVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBMaW5rIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibGlua1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcImxpbmtcIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcjogU1JDdXJzb3IsIG1vZGU6IE5hdmlnYXRpb25Nb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldExpbmtBbm5vdW5jZW1lbnQoY3Vyc29yLCBtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIExpc3RpdGVtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibGlzdGl0ZW1cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc09yZGVyZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudExpc3RFbGVtOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBsZXQgd2Fsa1BhcmVudHMgPSBET01XYWxrZXIucGFyZW50Tm9kZShjdXJzb3IuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAodHlwZW9mIGlzT3JkZXJlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiB3YWxrUGFyZW50cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2Fsa1BhcmVudHMubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB3YWxrUGFyZW50cyBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpID09PSBcImxpc3RcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09yZGVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TGlzdEVsZW0gPSBlbGVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlVMXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09yZGVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRMaXN0RWxlbSA9IGVsZW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJPTFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPcmRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRMaXN0RWxlbSA9IGVsZW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2Fsa1BhcmVudHMgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrUGFyZW50cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGxpc3RpdGVtIGNvbnRhaW5zIGludGVyYWN0aXZlIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgLy8gU2NyZWVuIHJlYWRlcnMgZG9uJ3QgcmVhZCB0aGUgYWNjZXNzaWJsZSBuYW1lIHdoZW4gaW50ZXJhY3RpdmUgZWxlbWVudHMgYXJlIHByZXNlbnRcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNJbnRlcmFjdGl2ZUNvbnRlbnQgPSBsaXN0aXRlbUNvbnRhaW5zSW50ZXJhY3RpdmVFbGVtZW50KGN1cnNvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVRvVXNlID0gaGFzSW50ZXJhY3RpdmVDb250ZW50ID8gXCJcIiA6IChjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSB8fCBcIlwiKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgcmV0U3RyID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoIWlzT3JkZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiTElcIiAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKS5saXN0U3R5bGVUeXBlID09PSBcIm5vbmVcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gXCJMSVwiKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRTdHIgPSBjdXJzb3IuaXNTdGFydFRhZygpID8gYCR7bmFtZVRvVXNlfWAgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0U3RyID0gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGBbYnVsbGV0XSAke25hbWVUb1VzZX1gIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBvcmRlcmVkIGxpc3RzLCBjb3VudCBzaWJsaW5nIGxpc3RpdGVtcyBhbmQgYWNjb3VudCBmb3Igc3RhcnQgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IDE7IC8vIFN0YXJ0IGF0IDEgYnkgZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBzdGFydCBhdHRyaWJ1dGUgaWYgaXQgZXhpc3RzIG9uIHRoZSA8b2w+IGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudExpc3RFbGVtICYmIHBhcmVudExpc3RFbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdPTCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExpc3RFbGVtLmhhc0F0dHJpYnV0ZSgnc3RhcnQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHBhcnNlSW50KHBhcmVudExpc3RFbGVtLmdldEF0dHJpYnV0ZSgnc3RhcnQnKSB8fCAnMScsIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gaXNOYU4oc3RhcnRWYWx1ZSkgPyAxIDogc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgcHJldmlvdXMgc2libGluZyBsaXN0aXRlbXMgYXQgdGhlIHNhbWUgbGV2ZWwgdXNpbmcgRE9NV2Fsa2VyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpYmxpbmcgPSBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QoY3VycmVudEVsZW0pO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb3VudCBkaXJlY3Qgc2libGluZ3MgdGhhdCBhcmUgbGlzdGl0ZW1zIChlbGVtZW50IG5vZGVzIG9ubHkpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZy5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdFbGVtID0gc2libGluZyBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZ0VsZW0uZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdsaXN0aXRlbScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZ0VsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0xJJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmcgPSBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3Qoc2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHJldFN0ciA9IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgJHtjb3VudH0uICR7bmFtZVRvVXNlfWAgOiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0U3RyO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYXRoIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWF0aFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNFbmRUYWcoKSA/IGBbbWF0aCBjb250ZW50XWAgOiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIExpbmsgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJtZW51aXRlbVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGlzU3ViTWVudUNvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgKGxldCBjaGVja0NoaWxkcmVuPWN1cnNvci5nZXROb2RlKCkuZmlyc3RDaGlsZDsgIWlzU3ViTWVudUNvbnRhaW5lciAmJiBjaGVja0NoaWxkcmVuICE9PSBudWxsOyBjaGVja0NoaWxkcmVuID0gY2hlY2tDaGlsZHJlbi5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaXNTdWJNZW51Q29udGFpbmVyID0gY2hlY2tDaGlsZHJlbi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlVMXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGlzU3ViTWVudUNvbnRhaW5lcikgcmV0dXJuIFwiWz8/Pz9tZW51XVwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhwYW5kU3RyID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRTdHIgKz0gXCIsIHN1Yi1tZW51XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kU3RyICs9IGAsICR7ZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpID09PSBcInRydWVcIiA/IFwiZXhwYW5kZWRcIiA6IFwiY29sbGFwc2VkXCJ9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGBbbWVudSR7ZXhwYW5kU3RyfWA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lSW5mbyA9IGN1cnNvci5nZXROYW1lSW5mbygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZUluZm8gJiYgIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKG5hbWVJbmZvLm5hbWVGcm9tKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IHF1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBcIl1cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTWV0ZXIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJtZXRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtwcm9ncmVzcyBiYXIsICR7KChjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKX1dYCA6IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUHJvZ3Jlc3NiYXIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJwcm9ncmVzc2JhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtwcm9ncmVzcyBiYXIsICR7KChjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKX1dYCA6IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUmFkaW8gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJyYWRpb1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwicmFkaW8gYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYkNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFwiYXJpYS1jaGVja2VkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiQ2hlY2tlZCA9IGN1cnNvci5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFwiYXJpYS1jaGVja2VkXCIpID09PSBcInRydWVcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJDaGVja2VkID0gKGN1cnNvci5nZXROb2RlKCkgYXMgYW55KS5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGF0ZVN0ciA9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtyb2xlRGVzY30sICR7YkNoZWNrZWQgPyBcImNoZWNrZWRcIiA6IFwibm90IGNoZWNrZWRcIn0ke3N0YXRlU3RyfSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9JHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XWBcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFNlYXJjaGJveCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInNlYXJjaGJveFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9ZWRpdF1gIDogXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTZXBhcmF0b3Igcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzZXBhcmF0b3JcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgYFtzZXBhcmF0b3JdYCB8fCBcIlwiKVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTbGlkZXIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzbGlkZXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwic2xpZGVyXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBhcmlhLXZhbHVlbm93IGZpcnN0LCB0aGVuIGZhbGwgYmFjayB0byBuYXRpdmUgdmFsdWUgcHJvcGVydHlcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKVxuICAgICAgICAgICAgICAgICAgICA/IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKVxuICAgICAgICAgICAgICAgICAgICA6IChjdXJzb3IuZ2V0Tm9kZSgpIGFzIGFueSkudmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9LCAke3ZhbHVlfSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTcGluYnV0dG9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wic3BpbmJ1dHRvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzcGluYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfSwgZWRpdGFibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVGFiIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widGFiXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJ0YWJcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtyb2xlRGVzY30keyhjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXNlbGVjdGVkXCIpID09PSBcInRydWVcIiA/IFwiLCBzZWxlY3RlZFwiIDogXCJcIn0ke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWJsaXN0IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widGFibGlzdFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtncm91cCBzdGFydCR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbZ3JvdXAgZW5kJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRhYnBhbmVsIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widGFicGFuZWxcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbVGFiIHBhbmVsIHN0YXJ0JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtUYWIgcGFuZWwgZW5kJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRleHQgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0ZXh0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwibGlua1wiLCBcInRhYl9mb2N1c1wiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpIHx8ICFjdXJzb3IuZ2V0UGFyZW50RWxlbWVudCgpPy5nZXRFbGVtZW50KCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0UGFyZW50RWxlbWVudCgpPy5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pLnRleHREZWNvcmF0aW9uTGluZSA9PT0gXCJsaW5lLXRocm91Z2hcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtzdHJpa2V0aHJvdWdoXSAkeyhjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSArIFwiXCIpfSBbZW5kIHN0cmlrZXRocm91Z2hdYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAkeyhjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSArIFwiXCIpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIC0tIGluIGhlYWRpbmcgbW9kZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0ZXh0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVGV4dGJveCByb2xlXG4gICAgICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgICAgICByb2xlczogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlID09PSBcIml0ZW1cIiAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVEVYVEFSRUFcIiA/IFwiW291dCBvZiBlZGl0XVwiIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVzID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyArPSBgLCBwbGFjZWhvbGRlcjogJHtlbGVtLmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzTXVsdGlsaW5lID0gZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlRFWFRBUkVBXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW11bHRpbGluZVwiKSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaWJlZEJ5ID0gZ2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGVsZW0sIG1vZGUpO1xuICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNNdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gbW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiA/IGVsZW0udGV4dENvbnRlbnQ/LnRyaW0oKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50U3VmZml4ID0gdGV4dENvbnRlbnQgPyBgICR7dGV4dENvbnRlbnR9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9ZWRpdCwgbXVsdGlsaW5lJHthdHRyaWJ1dGVzfSR7ZGVzY3JpYmVkQnl9XSR7Y29udGVudFN1ZmZpeH1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1lZGl0JHthdHRyaWJ1dGVzfSR7ZGVzY3JpYmVkQnl9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KSxcblxuICAgIC8vIFRyZWVpdGVtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widHJlZWl0ZW1cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGFubm91bmNlbWVudCBzdHJpbmcgd2l0aG91dCB0aGUgbmFtZSAobGV0IGNvbnRlbnQgcmVuZGVyIHNlcGFyYXRlbHkpXG4gICAgICAgICAgICAgICAgbGV0IGFubm91bmNlbWVudCA9IGBbdHJlZXZpZXcgaXRlbWA7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIHNlbGVjdGVkIHN0YXRlIGlmIHByZXNlbnRcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXNlbGVjdGVkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgICAgICAgICBhbm5vdW5jZW1lbnQgKz0gXCIsIHNlbGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFkZCBleHBhbmRlZC9jb2xsYXBzZWQgc3RhdGUgaWYgcHJlc2VudFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VtZW50ICs9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKSA9PT0gXCJ0cnVlXCIgPyBcIiwgZXhwYW5kZWRcIiA6IFwiLCBjb2xsYXBzZWRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIGxldmVsIGlmIGV4cGxpY2l0bHkgc2V0IG9yIGNhbGN1bGF0ZSBmcm9tIG5lc3RpbmdcbiAgICAgICAgICAgICAgICBsZXQgbGV2ZWwgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGV2ZWxcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGFubm91bmNlbWVudCArPSBgLCBsZXZlbCAke2xldmVsfWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGxldmVsIGJ5IGNvdW50aW5nIHBhcmVudCB0cmVlaXRlbXMgb3IgZ3JvdXBzIHVzaW5nIERPTVdhbGtlciBmb3Igc2hhZG93IERPTSBzdXBwb3J0XG4gICAgICAgICAgICAgICAgICAgIGxldCBjYWxjdWxhdGVkTGV2ZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRSb2xlID09PSBcImdyb3VwXCIgfHwgcGFyZW50Um9sZSA9PT0gXCJ0cmVlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGdyb3VwIGlzIGluc2lkZSBhIHRyZWVpdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwUGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZ3JvdXBQYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBQYXJlbnRSb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGdyb3VwUGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwUGFyZW50Um9sZSA9PT0gXCJ0cmVlaXRlbVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkTGV2ZWwrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyb3VwUGFyZW50Um9sZSA9PT0gXCJ0cmVlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwUGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZ3JvdXBQYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGN1bGF0ZWRMZXZlbCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm91bmNlbWVudCArPSBgLCBsZXZlbCAke2NhbGN1bGF0ZWRMZXZlbH1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFkZCBwb3NpdGlvbiBpbmZvcm1hdGlvbiAoYXJpYS1wb3NpbnNldC9hcmlhLXNldHNpemUgb3IgY2FsY3VsYXRlKVxuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1wb3NpbnNldFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgc2V0U2l6ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1zZXRzaXplXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICghcG9zaXRpb24gfHwgIXNldFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGJ5IGNvdW50aW5nIHNpYmxpbmdzIHdpdGggc2FtZSByb2xlIHVzaW5nIERPTVdhbGtlciBmb3Igc2hhZG93IERPTSBzdXBwb3J0XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGNoaWxkcmVuIHRvIGNvdW50IHRyZWVpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdChwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxKSB7IC8vIEVsZW1lbnQgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEVsZW0gPSBjaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShjaGlsZEVsZW0pID09PSBcInRyZWVpdGVtXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRFbGVtID09PSBlbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gdG90YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvcy50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBzZXRTaXplID0gdG90YWwudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgYW5ub3VuY2VtZW50ICs9IGAsICR7cG9zaXRpb259IG9mICR7c2V0U2l6ZX1dIGA7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFubm91bmNlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSFRNTCBFbGVtZW50IHJ1bGVzXG5cbiAgICAvLyBQcmVmb3JtYXR0ZWQgdGV4dCBsaW5lIHJlbmRlcmluZzogd2hlbiBjdXJzb3IgaXMgYXQgYSA8cHJlPiBlbGVtZW50IHdpdGhcbiAgICAvLyBwcmVMaW5lSW5kZXggc2V0LCByZW5kZXIgb25seSB0aGF0IGxpbmUgb2YgdGhlIHByZSdzIHRleHQgY29udGVudC5cbiAgICAvLyBUaGlzIHJ1bGUgZmlyZXMgaW5zaWRlIHJlbmRlclJhbmdlIGZvciBwZXItbGluZSBpdGVtIHN0b3BzLlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIlBSRVwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7IC8vIGxldCBjb250YWluZXJfZW50ZXIgaGFuZGxlIGl0XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbFRleHQgPSAoY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudCkudGV4dENvbnRlbnQgPz8gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCByYXdMaW5lcyA9IGZ1bGxUZXh0LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHN0YXJ0IDwgcmF3TGluZXMubGVuZ3RoICYmIHJhd0xpbmVzW3N0YXJ0XS50cmltKCkgPT09IFwiXCIpIHN0YXJ0Kys7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IHJhd0xpbmVzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGVuZCA+PSBzdGFydCAmJiByYXdMaW5lc1tlbmRdLnRyaW0oKSA9PT0gXCJcIikgZW5kLS07XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSByYXdMaW5lcy5zbGljZShzdGFydCwgZW5kICsgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVzW2N1cnNvci5wcmVMaW5lSW5kZXhdID8/IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkJPRFlcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTdXBwcmVzcyBbU3RhcnQvRW5kIG9mIGRvY3VtZW50XSBmb3IgaWZyYW1lIHN1YmRvY3VtZW50IGJvZGllcy5cbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBpbm5lciBib2R5IGlzIGVudGVyZWQgZnJvbSBhbiA8aWZyYW1lPiwgZGlmZkNvbnRhaW5lcnMgZW1pdHNcbiAgICAgICAgICAgICAgICAvLyB0aGUgW1wibmFtZVwiLCBmcmFtZV0gY29udGFpbmVyLWVudGVyIGFubm91bmNlbWVudCBpbnN0ZWFkLiBTdXBwcmVzc2luZ1xuICAgICAgICAgICAgICAgIC8vIHRoZSBkb2N1bWVudCB0aXRsZSBhbm5vdW5jZW1lbnRzIGhlcmUgYXZvaWRzIGRvdWJsZS1hbm5vdW5jZW1lbnRzLlxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChib2R5Lm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50KSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVN0ciA9IGN1cnNvci5nZXROb2RlKCkub3duZXJEb2N1bWVudC50aXRsZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmlzRW5kVGFnKCkgPyBgW0VuZCBvZiBkb2N1bWVudCR7dGl0bGVTdHIudHJpbSgpLmxlbmd0aCA+IDAgPyBcIjogXCIgKyB0aXRsZVN0ci50cmltKCkgOiBcIlwifV1gIDogYFtTdGFydCBvZiBkb2N1bWVudCR7dGl0bGVTdHIudHJpbSgpLmxlbmd0aCA+IDAgPyBcIjogXCIgKyB0aXRsZVN0ci50cmltKCkgOiBcIlwifV1gXG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIElubGluZSBmcmFtZSAoPGlmcmFtZT4pIOKAlCB0YWJfZm9jdXMgbW9kZTogYW5ub3VuY2VzIHRoZSBmcmFtZSBhcyBhIHRhYiBzdG9wLlxuICAgIC8vIEEgdGl0bGVkIGlmcmFtZSBhbm5vdW5jZXMgaXRzIGFjY2Vzc2libGUgbmFtZTsgYW4gdW50aXRsZWQgb25lIGFubm91bmNlcyBqdXN0IFwiZnJhbWVcIi5cbiAgICAvLyAoVGhlIGl0ZW0tbW9kZSBhbm5vdW5jZW1lbnQgaXMgaGFuZGxlZCBieSBkaWZmQ29udGFpbmVycyBlbWl0dGluZyB0aGUgY29udGFpbmVyX2VudGVyXG4gICAgLy8gSUZSQU1FIHJ1bGUgd2hlbiBjcm9zc2luZyBpbnRvIHRoZSBzdWJkb2N1bWVudCDigJQgbm8gc2VwYXJhdGUgU1JfUlVMRSBuZWVkZWQgZm9yIGl0ZW0gbW9kZS4pXG4gICAgLy8gV2hlbiByb2xlPVwibm9uZVwiIG9yIHJvbGU9XCJwcmVzZW50YXRpb25cIiBpcyBzZXQsIHNjcmVlbiByZWFkZXJzIHRyZWF0IHRoZSBmcmFtZSBhcyBhXG4gICAgLy8gZ2VuZXJpYyBncm91cGluZyDigJQgYW5ub3VuY2UgXCJncm91cGluZ1wiIGluc3RlYWQgb2YgXCJmcmFtZVwiLlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIklGUkFNRVwiXSxcbiAgICAgICAgbW9kZXM6IFtcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcInJvbGVcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNQcmVzZW50YXRpb24gPSByb2xlID09PSBcIm5vbmVcIiB8fCByb2xlID09PSBcInByZXNlbnRhdGlvblwiO1xuICAgICAgICAgICAgICAgIC8vIEFuIHVudGl0bGVkIHByZXNlbnRhdGlvbmFsIGlmcmFtZSBwcm9kdWNlcyBubyBtZWFuaW5nZnVsIHRhYiBzdG9wIGxhYmVsIOKAlFxuICAgICAgICAgICAgICAgIC8vIHN1cHByZXNzIGl0IGVudGlyZWx5IHNvIGl0IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgdGFiX2ZvY3VzIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50YXRpb24gJiYgIWN1cnNvci5nZXROYW1lKCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gaXNQcmVzZW50YXRpb24gPyBcImdyb3VwaW5nXCIgOiBcImZyYW1lXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7bGFiZWx9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkJSXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdhbGsgPSBjdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2FsayB1bnRpbCB3ZSBoaXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZSwgZmluZCBhbm90aGVyIEJSLCBvciBmaW5kIHNvbWV0aGluZyB3aXRoIGEgbmFtZVxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAod2Fsay5wcmV2aW91cygoKSA9PiB0cnVlKSAmJiB3YWxrLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpICE9PSBcIkJSXCIgJiYgd2Fsay5nZXROYW1lSW5mbygpICYmIHdhbGsuZ2V0TmFtZUluZm8oKS5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2Fsay5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJCUlwiID8gXCJbYmxhbmtdXCIgOiBudWxsO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJETFwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJJTlBVVFwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcInBhc3N3b3JkXCIgJiYgYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9ZWRpdCwgcHJvdGVjdGVkJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XWApIHx8IG51bGwsXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTElucHV0RWxlbWVudCk/LnZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT09IFwiXCIgPyBcIk5vIGZpbGUgY2hvc2VuXCIgOiB2YWx1ZS5zdWJzdHJpbmcoXCJDOlxcXFxmYWtlcGF0aFxcXFxcIi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9YnV0dG9uJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XSBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7dmFsdWV9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImNvbG9yXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSAoTnVtYmVyKGAweCR7dmFsLnN1YnN0cmluZygxLCAzKX1gKSAqIDEwMC4wIC8gTnVtYmVyKFwiMHhmZlwiKSkudG9GaXhlZCgwKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZyA9IChOdW1iZXIoYDB4JHt2YWwuc3Vic3RyaW5nKDMsIDUpfWApICogMTAwLjAgLyBOdW1iZXIoXCIweGZmXCIpKS50b0ZpeGVkKDApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gKE51bWJlcihgMHgke3ZhbC5zdWJzdHJpbmcoNSl9YCkgKiAxMDAuMCAvIE51bWJlcihcIjB4ZmZcIikpLnRvRml4ZWQoMCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFske3J9JSByZWQgJHtnfSUgZ3JlZW4gJHtifSUgYmx1ZV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJtb250aFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gXCJcIiArIGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBcIlwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFtzcGluIGJ1dHRvbiwgJHttfV0gW3NwaW4gYnV0dG9uLCAke3l9XSBbbWVudSBidXR0b25dIFtzdWJNZW51XSBTaG93IG1vbnRoIHBpY2tlcmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImRhdGVcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRheSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gXCJcIiArIGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBcIlwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gXCJcIiArIChkYXRlLmdldERhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNsaWNrYWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV0gW3NwaW4gYnV0dG9uLCAke219XSAvIFtzcGluIGJ1dHRvbiwgJHtkYXl9XSAvIFtzcGluIGJ1dHRvbiwgJHt5fV0gW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyBkYXRlIHBpY2tlcmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImRhdGV0aW1lLWxvY2FsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7IC8vIDIwMjUtMDktMTJUMDQ6MjBcbiAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRheSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaG91ciA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWluID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbXBtID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUodmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBcIlwiICsgZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbSA9IFwiXCIgKyAoZGF0ZS5nZXRNb250aCgpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXkgPSBcIlwiICsgKGRhdGUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRlLmdldEhvdXJzKCkgPT09IDAgfHwgZGF0ZS5nZXRIb3VycygpID09PSAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIjEyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGUuZ2V0SG91cnMoKSA8IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciA9IFwiXCIgKyBkYXRlLmdldEhvdXJzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIlwiICsgKGRhdGUuZ2V0SG91cnMoKSAtIDEyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IFwiXCIgKyBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFtcG0gPSBkYXRlLmdldEhvdXJzKCkgPj0gMTIgPyBcInBtXCIgOiBcImFtXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNsaWNrYWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV0gW3NwaW4gYnV0dG9uLCAke219XSAvIFtzcGluIGJ1dHRvbiwgJHtkYXl9XSAvIFtzcGluIGJ1dHRvbiwgJHt5fV0gW3NwaW4gYnV0dG9uLCAke2hvdXJ9XSA6IFtzcGluIGJ1dHRvbiwgJHttaW59XSBbc3BpbiBidXR0b24sICR7YW1wbX1dICBbbWVudSBidXR0b25dIFtzdWJNZW51XSBTaG93IGxvY2FsIGRhdGUgYW5kIHRpbWUgcGlja2VyYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwidGltZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlOyAvLyAyMDI1LTA5LTEyVDA0OjIwXG4gICAgICAgICAgICAgICAgICAgIGxldCBob3VyID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtaW4gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFtcG0gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSB2YWwuc3BsaXQoXCI6XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdXJzID0gcGFyc2VJbnQoZGF0ZVswXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG91cnMgPT09IDAgfHwgaG91cnMgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciA9IFwiMTJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIlwiICsgaG91cnM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIlwiICsgKGhvdXJzIC0gMTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gZGF0ZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFtcG0gPSBob3VycyA+PSAxMiA/IFwicG1cIiA6IFwiYW1cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Z3JvdXBpbmcgY2xpY2thYmxlJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9IFtzcGluIGJ1dHRvbiwgJHtob3VyfV0gOiBbc3BpbiBidXR0b24sICR7bWlufV0gW3NwaW4gYnV0dG9uLCAke2FtcG19XSBbbWVudSBidXR0b25dIFtzdWJNZW51XSBTaG93IHRpbWUgcGlja2VyIFtvdXQgb2YgZ3JvdXBpbmddYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwid2Vla1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlOyAvLyAyMDI1LVczOFxuICAgICAgICAgICAgICAgICAgICBsZXQgeWVhciA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2VlayA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IHZhbC5zcGxpdCgvLVcvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSBkYXRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2VlayA9IGRhdGVbMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNsaWNrYWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV0gW3NwaW4gYnV0dG9uLCAke3dlZWt9XSwgW3NwaW4gYnV0dG9uLCAke3llYXJ9XSBbbWVudSBidXR0b25dIFtzdWJNZW51XSBTaG93IHdlZWsgcGlja2VyYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIgPyBcIlwiIDogbnVsbCxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBgISFbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWlucHV0ISFdJHtjdXJzb3IuZ2V0RWxlbWVudCgpLm91dGVySFRNTH1gKSB8fCBudWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkxJXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGlzdGl0ZW0gY29udGFpbnMgaW50ZXJhY3RpdmUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAvLyBTY3JlZW4gcmVhZGVycyBkb24ndCByZWFkIHRoZSBhY2Nlc3NpYmxlIG5hbWUgd2hlbiBpbnRlcmFjdGl2ZSBlbGVtZW50cyBhcmUgcHJlc2VudFxuICAgICAgICAgICAgICAgIGNvbnN0IGhhc0ludGVyYWN0aXZlQ29udGVudCA9IGxpc3RpdGVtQ29udGFpbnNJbnRlcmFjdGl2ZUVsZW1lbnQoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lVG9Vc2UgPSBoYXNJbnRlcmFjdGl2ZUNvbnRlbnQgPyBcIlwiIDogKGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lIHx8IFwiXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKS5saXN0U3R5bGVUeXBlID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGAke25hbWVUb1VzZX1gIDogXCJcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGBbYnVsbGV0XSAke25hbWVUb1VzZX1gIDogXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE1hdGhNTCBlbGVtZW50c1xuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIk1GUkFDXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtmcmFjdGlvbl1gIDogYFtlbmQgZnJhY3Rpb25dYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNUk9XXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBhbm5vdW5jZSBvdmVyIG9uIHRoZSBlbmQgdGFnXG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbGV0IGZyYWN0aW9uID0gY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtdLCBbXCJtZnJhY1wiXSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyYWN0aW9uICYmIGZyYWN0aW9uLmdldEVsZW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwibXJvd1wiKVswXT8uaXNTYW1lTm9kZShjdXJzb3IuZ2V0Tm9kZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJbb3Zlcl1cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIk1TUVJUXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtzcXVhcmUgcm9vdF1gIDogYFtlbmQgcm9vdF1gXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIk1TVVBcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzRW5kVGFnKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgbWkgPSBjdXJzb3IuZ2V0RWxlbWVudCgpLnF1ZXJ5U2VsZWN0b3IoXCJtaVwiKT8uaW5uZXJIVE1MIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgbW4gPSBjdXJzb3IuZ2V0RWxlbWVudCgpLnF1ZXJ5U2VsZWN0b3IoXCJtblwiKT8uaW5uZXJIVE1MIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKG1uID09PSBcIjJcIikgcmV0dXJuIGAke21pfSBbc3F1YXJlZF1gO1xuICAgICAgICAgICAgICAgIGlmIChtbiA9PT0gXCIzXCIpIHJldHVybiBgJHttaX0gW2N1YmVkXWA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke21pfSBbdG8gdGhlICR7bW59XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFN1bW1hcnkgZWxlbWVudCDigJQgdGhlIGRpc2Nsb3N1cmUgYnV0dG9uIGZvciBhIDxkZXRhaWxzPiB3aWRnZXQuXG4gICAgLy8gPHN1bW1hcnk+IGhhcyBpbXBsaWNpdFJvbGU6IG51bGwgaW4gQVJJQURlZmluaXRpb25zIHNvIG5vIHJvbGUtYmFzZWRcbiAgICAvLyBidXR0b24gcnVsZSBmaXJlcy4gIFdlIGFkZCBhbiBleHBsaWNpdCBlbGVtZW50IHJ1bGUgdGhhdCBhbm5vdW5jZXMgaXQgYXNcbiAgICAvLyBhIGJ1dHRvbiB3aXRoIHRoZSBjb2xsYXBzZWQgLyBleHBhbmRlZCBzdGF0ZSBmcm9tIHRoZSBwYXJlbnQgPGRldGFpbHM+LlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIlNVTU1BUllcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiYnV0dG9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGlmICghc3VtbWFyeUVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IDxzdW1tYXJ5PiB0aGF0IGlzIGEgZGlyZWN0IGNoaWxkIG9mIDxkZXRhaWxzPlxuICAgICAgICAgICAgICAgIC8vIGFjdHMgYXMgdGhlIGRpc2Nsb3N1cmUgYnV0dG9uLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHNQYXJlbnQgPSBzdW1tYXJ5RWxlbS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghZGV0YWlsc1BhcmVudCB8fCBkZXRhaWxzUGFyZW50Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09IFwiREVUQUlMU1wiKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFN1bW1hcnkgPSBBcnJheS5mcm9tKGRldGFpbHNQYXJlbnQuY2hpbGRyZW4pLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIGMgPT4gYy5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNVTU1BUllcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCFmaXJzdFN1bW1hcnkgfHwgIWZpcnN0U3VtbWFyeS5pc1NhbWVOb2RlKHN1bW1hcnlFbGVtKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGVTdHIgPSBkZXRhaWxzUGFyZW50Lmhhc0F0dHJpYnV0ZShcIm9wZW5cIikgPyBcImV4cGFuZGVkXCIgOiBcImNvbGxhcHNlZFwiO1xuICAgICAgICAgICAgICAgIC8vIDxzdW1tYXJ5PiBoYXMgaW1wbGljaXRSb2xlOiBudWxsIHNvIEFjY05hbWVVdGlsIG1heSBub3QgY29tcHV0ZSBhIG5hbWU7XG4gICAgICAgICAgICAgICAgLy8gcmVhZCBhcmlhLWxhYmVsIGZpcnN0LCB0aGVuIGZhbGwgYmFjayB0byB2aXNpYmxlIHRleHQgY29udGVudC5cbiAgICAgICAgICAgICAgICBjb25zdCBhcmlhTGFiZWwgPSBzdW1tYXJ5RWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpPy50cmltKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBzdW1tYXJ5RWxlbS50ZXh0Q29udGVudD8udHJpbSgpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBhcmlhTGFiZWwgfHwgdGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWxTdHIgPSBsYWJlbCA/IGBcIiR7bGFiZWx9XCIsIGAgOiBcIlwiO1xuICAgICAgICAgICAgICAgIC8vIERlc2NyaXB0aW9uOiBwcmVmZXIgZXhwbGljaXQgYXJpYS1kZXNjcmliZWRieTsgd2hlbiBhcmlhLWxhYmVsIGlzIHRoZVxuICAgICAgICAgICAgICAgIC8vIG5hbWUgc291cmNlLCB0aGUgc3VidHJlZSB0ZXh0IGJlY29tZXMgdGhlIGRlc2NyaXB0aW9uIChhY2NuYW1lLTEuMiDCpzQuMykuXG4gICAgICAgICAgICAgICAgbGV0IGRlc2NTdHIgPSBnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoc3VtbWFyeUVsZW0sIG1vZGUpO1xuICAgICAgICAgICAgICAgIGlmICghZGVzY1N0ciAmJiBhcmlhTGFiZWwgJiYgdGV4dENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY1N0ciA9IG1vZGUgPT09IFwiaXRlbVwiID8gYCwgXFx1MDAwMSR7dGV4dENvbnRlbnR9XFx1MDAwMmAgOiBgLCBcIiR7dGV4dENvbnRlbnR9XCJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYFske2xhYmVsU3RyfWJ1dHRvbiwgJHtzdGF0ZVN0cn0ke2Rlc2NTdHJ9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE11bHRpcGxlIHJvbGVzIHJ1bGVzIC0gcGxhY2VkIGF0IHRoZSBib3R0b21cbiAgICBcbiAgICAvLyBEZWZhdWx0IG1vZGUgcnVsZXMgLSBDb250YWluZXIgZWxlbWVudHMgKG11bHRpcGxlIHJvbGVzKVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJhcnRpY2xlXCIsIFwiYmFubmVyXCIsIFwiYmxvY2txdW90ZVwiLCBcImNhcHRpb25cIiwgXCJjZWxsXCIsIFwiY29kZVwiLCBcImNvbHVtbmhlYWRlclwiLFxuICAgICAgICAgICAgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIiwgXCJmaWd1cmVcIiwgXCJmb3JtXCIsIFwiZ3JvdXBcIiwgXCJsaXN0XCIsIFwibWFpblwiLFxuICAgICAgICAgICAgXCJtYXJrXCIsIFwibmF2aWdhdGlvblwiLCBcInJlZ2lvblwiLCBcInJvd1wiLCBcInJvd2hlYWRlclwiLCBcInNlYXJjaFwiLCBcInRhYmxlXCIsIFwidG9vbGJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIERlZmF1bHQgbW9kZSBydWxlcyAtIEVsZW1lbnRzIHRoYXQgc2NyZWVuIHJlYWRlcnMgdHlwaWNhbGx5IGlnbm9yZSAobXVsdGlwbGUgcm9sZXMpXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInBhcmFncmFwaFwiLCBcInJvd2dyb3VwXCIsIFwic3RhdHVzXCIsIFwic3Ryb25nXCIsIFwic3Vic2NyaXB0XCIsIFwic3VwZXJzY3JpcHRcIixcbiAgICAgICAgICAgIFwidGVybVwiLCBcInRpbWVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXVxuIiwiaW1wb3J0IHsgU1JSZW5kZXJlclJ1bGUgfSBmcm9tIFwiLi4vU1JSZW5kZXJlclJ1bGVcIjtcbmltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4uL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBTUlRhYmxlVXRpbCB9IGZyb20gXCIuLi9TUlRhYmxlVXRpbFwiO1xuaW1wb3J0IHsgcXVvdGVOYW1lUGFkQWZ0ZXIsIHF1b3RlTmFtZVBhZEJlZm9yZSwgZ2V0Um9sZURlc2NyaXB0aW9uIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi8uLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBhbm5vdW5jZW1lbnQgdGV4dCB3aGVuIGVudGVyaW5nIGEgdGFibGUgY2VsbFxuICovXG5mdW5jdGlvbiByZW5kZXJFbnRlclRhYmxlQ2VsbChuZXdDdXJzb3I6IFNSQ3Vyc29yLCBvbGRDdXJzb3I6IFNSQ3Vyc29yKSB7XG4gICAgLy8gV2Ugc2VlbSB0byBiZSBhdCB0aGUgbmV3bGluZSB0ZXh0IG5vZGUgYWZ0ZXIgdGhlIGNlbGxcbiAgICBpZiAob2xkQ3Vyc29yICYmIG9sZEN1cnNvci5nZXROb2RlKCk/Lm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgb2xkQ3Vyc29yID0gb2xkQ3Vyc29yLmNsb25lKCk7XG4gICAgICAgIG9sZEN1cnNvci5wcmV2aW91cygoKSA9PiB0cnVlKVxuICAgIH1cbiAgICBjb25zdCBuZXdUYWJsZU1vZGVsID0gU1JUYWJsZVV0aWwuZ2V0VGFibGVNb2RlbChuZXdDdXJzb3IpO1xuICAgIGNvbnN0IG9sZENlbGxJbmZvID0gU1JUYWJsZVV0aWwuZ2V0Q2VsbE1vZGVsKG9sZEN1cnNvciwgbmV3VGFibGVNb2RlbCk7XG4gICAgY29uc3QgbmV3Q2VsbEluZm8gPSBTUlRhYmxlVXRpbC5nZXRDZWxsTW9kZWwobmV3Q3Vyc29yLCBuZXdUYWJsZU1vZGVsKTtcbiAgICBpZiAoIW5ld0NlbGxJbmZvKSByZXR1cm4gXCJcIjtcbiAgICBsZXQgcmV0VmFsOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQW5ub3VuY2Ugcm93IGluZm9ybWF0aW9uIGlmIHdlJ3ZlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHJvdyBvciB0aGUgcm93c3BhbiBoYXMgY2hhbmdlZFxuICAgIGlmICghb2xkQ2VsbEluZm8gfHwgb2xkQ2VsbEluZm8ucm93SW5kZXhTdGFydCAhPT0gbmV3Q2VsbEluZm8ucm93SW5kZXhTdGFydCB8fCBvbGRDZWxsSW5mby5yb3dzcGFuICE9PSBuZXdDZWxsSW5mby5yb3dzcGFuKSB7XG4gICAgICAgIC8vIElmIGEgY2hhbmdlIGluIHJvdyBvciBhIGNoYW5nZSBpbiByb3dTcGFuXG4gICAgICAgIGxldCByb3dIZWFkZXJzID0gU1JUYWJsZVV0aWwuZ2V0Um93SGVhZGVyc0ZvckN1cnNvcihuZXdDdXJzb3IsIG5ld1RhYmxlTW9kZWwpO1xuICAgICAgICBsZXQgaGVhZGVySW5mb1N0ciA9IHJvd0hlYWRlcnMgJiYgcm93SGVhZGVycy50cmltKCkubGVuZ3RoID4gMCA/IGBcIiR7cm93SGVhZGVyc31cIiwgYCA6IFwiXCI7XG4gICAgICAgIHJldFZhbC5wdXNoKGBbJHtoZWFkZXJJbmZvU3RyfXJvdyAkeyhuZXdDZWxsSW5mby5yb3dJbmRleFN0YXJ0KzEpfSR7bmV3Q2VsbEluZm8ucm93c3BhbiA+IDEgPyBcIiB0aHJvdWdoIFwiICsgKG5ld0NlbGxJbmZvLnJvd0luZGV4U3RhcnQrbmV3Q2VsbEluZm8ucm93c3BhbikgOiBcIlwifV1gKTtcbiAgICB9XG5cbiAgICAvLyBBbm5vdW5jZSBjb2x1bW4gaW5mb3JtYXRpb24gaWYgd2UndmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgY29sdW1uIG9yIHRoZSBjb2xzcGFuIGhhcyBjaGFuZ2VkXG4gICAgaWYgKCFvbGRDZWxsSW5mbyB8fCBvbGRDZWxsSW5mby5jb2xJbmRleFN0YXJ0ICE9PSBuZXdDZWxsSW5mby5jb2xJbmRleFN0YXJ0IHx8IG9sZENlbGxJbmZvLmNvbHNwYW4gIT09IG5ld0NlbGxJbmZvLmNvbHNwYW4pIHtcbiAgICAgICAgLy8gSWYgYSBjaGFuZ2UgaW4gY29sdW1uIG9yIGEgY2hhbmdlIGluIGNvbHNwYW5cbiAgICAgICAgbGV0IGNvbHVtbkhlYWRlcnMgPSBTUlRhYmxlVXRpbC5nZXRDb2x1bW5IZWFkZXJzRm9yQ3Vyc29yKG5ld0N1cnNvciwgbmV3VGFibGVNb2RlbCk7XG4gICAgICAgIGxldCBoZWFkZXJJbmZvU3RyID0gY29sdW1uSGVhZGVycyAmJiBjb2x1bW5IZWFkZXJzLnRyaW0oKS5sZW5ndGggPiAwID8gYFwiJHtjb2x1bW5IZWFkZXJzfVwiLCBgIDogXCJcIjtcbiAgICAgICAgcmV0VmFsLnB1c2goYFske2hlYWRlckluZm9TdHJ9Y29sdW1uICR7KG5ld0NlbGxJbmZvLmNvbEluZGV4U3RhcnQrMSl9JHtuZXdDZWxsSW5mby5jb2xzcGFuID4gMSA/IFwiIHRocm91Z2ggXCIgKyAobmV3Q2VsbEluZm8uY29sSW5kZXhTdGFydCtuZXdDZWxsSW5mby5jb2xzcGFuKSA6IFwiXCJ9XWApO1xuICAgIH1cblxuICAgIHJldHVybiByZXRWYWwuam9pbihcIiBcIik7XG59XG5cbmV4cG9ydCBsZXQgUlVMRVM6IFNSUmVuZGVyZXJSdWxlW10gPSBbXG4gICAgLy8gU2luZ2xlIHJvbGUgcnVsZXMgLSBhbHBoYWJldGljYWxseSBzb3J0ZWRcblxuICAgIC8vIEFydGljbGUgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJhcnRpY2xlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiYXJ0aWNsZVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYXJ0aWNsZVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQmFubmVyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYmFubmVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJiYW5uZXIgcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBCbG9ja3F1b3RlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYmxvY2txdW90ZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbYmxvY2txdW90ZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDYXB0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2FwdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbY2FwdGlvbl1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDZWxsIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2VsbFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYmxlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgcmVuZGVyRW50ZXJUYWJsZUNlbGxcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29sdW1uaGVhZGVyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY29sdW1uaGVhZGVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICByZW5kZXJFbnRlclRhYmxlQ2VsbFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDb21wbGVtZW50YXJ5IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY29tcGxlbWVudGFyeVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Y29tcGxlbWVudGFyeSByZWdpb25dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29udGVudGluZm8gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjb250ZW50aW5mb1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Y29udGVudCBpbmZvIHJlZ2lvbl1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBGaWd1cmUgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJmaWd1cmVcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2ZpZ3VyZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBGb3JtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZm9ybVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcImZvcm1jb250cm9sXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW3NlY3Rpb25dXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWZvcm0gcmVnaW9uXWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEdyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiREVUQUlMU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNTdW1tYXJ5ID0gQXJyYXkuZnJvbShlbGVtLmNoaWxkcmVuKS5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgYyA9PiBjLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU1VNTUFSWVwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNTdW1tYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgPHN1bW1hcnk+IGNoaWxkIHNwZWFrcyBhcyB0aGUgZGlzY2xvc3VyZSBidXR0b247IHN1cHByZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29udGFpbmVyLWVudGVyIGFubm91bmNlbWVudCBlbnRpcmVseS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vIGV4cGxpY2l0IDxzdW1tYXJ5PjogaW4gYSByZWFsIGJyb3dzZXIgdGhlIFVBIGluamVjdHMgYSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIC8vIFwiRGV0YWlsc1wiIHN1bW1hcnkuICBqc2RvbSBkb2VzIG5vdCwgc28gd2UgYW5ub3VuY2UgdGhlIHdpZGdldCBoZXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgZmFsbGJhY2sgdXNpbmcgdGhlIHNhbWUgZGVmYXVsdCBsYWJlbCBhIHJlYWwgYnJvd3NlciB3b3VsZCB1c2UuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW1wiRGV0YWlsc1wiLCBidXR0b24sICR7ZWxlbS5oYXNBdHRyaWJ1dGUoXCJvcGVuXCIpID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcImNvbWJvYm94XCJdLCBbXCJzZWxlY3RcIl0pPy5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJTRUxFQ1RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbZ3JvdXBpbmcke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyAtLSB0YWJfZm9jdXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJERVRBSUxTXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc1N1bW1hcnkgPSBBcnJheS5mcm9tKGVsZW0uY2hpbGRyZW4pLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjID0+IGMubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJTVU1NQVJZXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1N1bW1hcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxzdW1tYXJ5PiBpcyB0aGUgdGFiIHN0b3AsIG5vdCA8ZGV0YWlscz4gaXRzZWxmLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gTm8gPHN1bW1hcnk+OiA8ZGV0YWlscz4gaXRzZWxmIGlzIGZvY3VzYWJsZSAoVUEgZGVmYXVsdCBiZWhhdmlvdXIpLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtcIkRldGFpbHNcIiwgYnV0dG9uLCAke2VsZW0uaGFzQXR0cmlidXRlKFwib3BlblwiKSA/IFwiZXhwYW5kZWRcIiA6IFwiY29sbGFwc2VkXCJ9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJjb21ib2JveFwiXSwgW1wic2VsZWN0XCJdKT8uZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0VMRUNUXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImxpc3RcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJsaXN0XCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjZW5kYW50TGlzdEl0ZW1zID0gZG9jdW1lbnQuZXZhbHVhdGUoXCIuLy9saSB8IC4vLypbQHJvbGU9J2xpc3RpdGVtJ11cIiwgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENvdW50IGl0ZW1zLCBleGNsdWRpbmcgdGhvc2UgaW4gb3RoZXIgbGlzdHMgb3Igd2l0aGluIHByZXNlbnRhdGlvbmFsIGNvbnRhaW5lcnNcbiAgICAgICAgICAgICAgICBsZXQgbnVtSXRlbXMgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzY2VuZGFudExpc3RJdGVtcy5zbmFwc2hvdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkZXNjZW5kYW50TGlzdEl0ZW1zLnNuYXBzaG90SXRlbShpKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIFdhbGsgdXAgYW5jZXN0b3JzIHRvIGNoZWNrIGZvciBib3RoIG5lc3RlZCBsaXN0cyBhbmQgcHJlc2VudGF0aW9uYWwgY29udGFpbmVyc1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNJbk90aGVyTGlzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGFzUHJlc2VudGF0aW9uYWxBbmNlc3RvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYW5jZXN0b3IgPSBpdGVtLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYW5jZXN0b3IgJiYgYW5jZXN0b3IgIT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGFuY2VzdG9yIGlzIGFub3RoZXIgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JSb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvclJvbGUgPT09IFwibGlzdFwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3Iubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJVTFwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3Iubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJPTFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbk90aGVyTGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGFuY2VzdG9yIGhhcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yUm9sZSAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbYW5jZXN0b3JSb2xlXT8ucHJlc2VudGF0aW9uYWxDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1ByZXNlbnRhdGlvbmFsQW5jZXN0b3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNJbk90aGVyTGlzdCAmJiAhaGFzUHJlc2VudGF0aW9uYWxBbmNlc3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtSXRlbXMrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAobnVtSXRlbXMgPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1saXN0IG9mICR7bnVtSXRlbXN9IGl0ZW1zXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE1haW4gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJtYWluXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1tYWluIHJlZ2lvbl1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBtZW51YmFyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWVudWJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImxpc3RcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vLypbQHJvbGU9J21lbnVpdGVtJ11cIiwgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXNJbk90aGVyTGlzdHMgPSBkb2N1bWVudC5ldmFsdWF0ZShcbiAgICAgICAgICAgICAgICAgICAgXCIuLy8qW0Byb2xlPSdtZW51YmFyJ10vLypbQHJvbGU9J21lbnVpdGVtJ118Li8vKltAcm9sZT0nbWVudSddLy8qW0Byb2xlPSdtZW51aXRlbSddXCIsXG4gICAgICAgICAgICAgICAgICAgIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBkZXNjZW5kYW50Q29udGFpbmVycyA9IGRvY3VtZW50LmV2YWx1YXRlKFwiLi8vKltAcm9sZT0nbWVudWl0ZW0nXS8qW0Byb2xlPSdtZW51J11cIiwgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGRlc2NlbmRhbnRDb250YWluZXJzMiA9IGRvY3VtZW50LmV2YWx1YXRlKFwiLi8vKltAcm9sZT0nbWVudWJhciddLy8qW0Byb2xlPSdtZW51aXRlbSddLypbQHJvbGU9J21lbnUnXXwuLy8qW0Byb2xlPSdtZW51J10vLypbQHJvbGU9J21lbnVpdGVtJ10vKltAcm9sZT0nbWVudSddXCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk1FTlVCQVJcIiwgY3Vyc29yLmlzRW5kVGFnKCk/XCIvXCI6XCJcIiwgY3Vyc29yLmdldE5vZGUoKSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGVzY2VuZGFudExpc3RJdGVtcywgZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cyk7Ly8sIGRlc2NlbmRhbnRDb250YWluZXJzLCBkZXNjZW5kYW50Q29udGFpbmVyczIpXG4gICAgICAgICAgICAgICAgbGV0IG51bUl0ZW1zID0gZGVzY2VuZGFudExpc3RJdGVtcy5zbmFwc2hvdExlbmd0aC1kZXNjZW5kYW50TGlzdEl0ZW1zSW5PdGhlckxpc3RzLnNuYXBzaG90TGVuZ3RoOy8vLWRlc2NlbmRhbnRDb250YWluZXJzLnNuYXBzaG90TGVuZ3RoK2Rlc2NlbmRhbnRDb250YWluZXJzMi5zbmFwc2hvdExlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobnVtSXRlbXMgPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1tZW51YmFyIHdpdGggJHtudW1JdGVtc30gaXRlbXNdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTmF2aWdhdGlvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcIm5hdmlnYXRpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm5hdmlnYXRpb24gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBSYWRpbyBncm91cCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJhZGlvZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbZ3JvdXBpbmcke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBSZWdpb24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJyZWdpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwicmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBSb3cgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJyb3dcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUm93aGVhZGVyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicm93aGVhZGVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICByZW5kZXJFbnRlclRhYmxlQ2VsbFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTZWFyY2ggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzZWFyY2hcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcInNlYXJjaCByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRhYmxlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widGFibGVcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRhYmxlV2Fsa2VyID0gY3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgdGFibGVcbiAgICAgICAgICAgICAgICB3aGlsZSAodGFibGVXYWxrZXIuZ2V0Um9sZSgpICE9PSBcInRhYmxlXCIgJiYgdGFibGVXYWxrZXIucHJldmlvdXMoKCkgPT4gdHJ1ZSkpO1xuICAgICAgICAgICAgICAgIC8vIFNldCBhbiBlbmQgdG8gdGhlIHRhYmxlXG4gICAgICAgICAgICAgICAgbGV0IHRhYmxlTm9kZSA9IHRhYmxlV2Fsa2VyLmdldE5vZGUoKTtcbiAgICAgICAgICAgICAgICBsZXQgcm93cyA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGNvbHMgPSAwO1xuICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjayB0aGF0IHRoZSB0YWJsZSBoYXMgY29udGVudFxuICAgICAgICAgICAgICAgIGlmICh0YWJsZVdhbGtlci5nZXROb2RlKCkuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RSb3dDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGFibGVXYWxrZXIubmV4dCgoKSA9PiB0cnVlKSAmJiAhdGFibGVXYWxrZXIuZ2V0Tm9kZSgpLmlzU2FtZU5vZGUodGFibGVOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZSA9IHRhYmxlV2Fsa2VyLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZVdhbGtlci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJyb3dcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3Jvd3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdFJvd0NvbXBsZXRlICYmIFtcImNlbGxcIiwgXCJyb3doZWFkZXJcIiwgXCJjb2x1bW5oZWFkZXJcIl0uaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB0YWJsZVdhbGtlci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzICs9IHBhcnNlSW50KGVsZW0uZ2V0QXR0cmlidXRlKFwiY29sc3BhblwiKSB8fCBcIjFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvbGUgPT09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJvd0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gYFt0YWJsZSB3aXRoICR7cm93c30gJHtyb3dzID09PSAxID8gXCJyb3dcIiA6IFwicm93c1wifSBhbmQgJHtjb2xzfSAke2NvbHMgPT09IDEgPyBcImNvbHVtblwiIDogXCJjb2x1bW5zXCJ9JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVG9vbGJhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRvb2xiYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfXRvb2xiYXJdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSFRNTCBFbGVtZW50IHJ1bGVzXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRExcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwibGlzdFwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudExpc3RJdGVtcyA9IGRvY3VtZW50LmV2YWx1YXRlKFwiLi8vZHRcIiwgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIGxldCBudW1JdGVtcyA9IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWRlZmluaXRpb24gbGlzdCBvZiAke251bUl0ZW1zfSB0ZXJtc11gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJGSUdDQVBUSU9OXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbY2FwdGlvbl1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNQVJLXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbaGlnaGxpZ2h0ZWRdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSW5saW5lIGZyYW1lICg8aWZyYW1lPilcbiAgICAvLyBPbmx5IGZpcmVzIGluIGl0ZW0gbW9kZSAod2hlcmUgaXQgcHJvZHVjZXMgdGhlIGNvbnRhaW5lci1lbnRlciBsYWJlbCBvbiB0aGUgcGFyZW50XG4gICAgLy8gYmxvY2sgc3RvcCkuIEluIHRhYl9mb2N1cyBtb2RlIHRoZSBpZnJhbWUgZWxlbWVudCBpdHNlbGYgaXMgdGhlIHN0b3AgYW5kIHRoZVxuICAgIC8vIElGUkFNRSBTUl9SVUxFIGluIGNvbW1vbi50cyBzdXBwbGllcyB0aGUgbGFiZWwgZGlyZWN0bHkg4oCUIG5vIGNvbnRhaW5lci1lbnRlciBuZWVkZWQuXG4gICAgLy8gV2hlbiByb2xlPVwibm9uZVwiIG9yIHJvbGU9XCJwcmVzZW50YXRpb25cIiBpcyBzZXQsIHNjcmVlbiByZWFkZXJzIHRyZWF0IHRoZSBmcmFtZVxuICAgIC8vIGFzIGEgZ2VuZXJpYyBncm91cGluZyDigJQgYW5ub3VuY2UgXCJncm91cGluZ1wiIGluc3RlYWQgb2YgXCJmcmFtZVwiLlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIklGUkFNRVwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1ByZXNlbnRhdGlvbiA9IHJvbGUgPT09IFwibm9uZVwiIHx8IHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgLy8gQW4gdW50aXRsZWQgcHJlc2VudGF0aW9uYWwgaWZyYW1lIGhhcyBubyBtZWFuaW5nZnVsIGdyb3VwaW5nIGxhYmVsIHRvXG4gICAgICAgICAgICAgICAgLy8gYW5ub3VuY2Ug4oCUIHN1cHByZXNzIHRoZSBjb250YWluZXItZW50ZXIgZW50aXJlbHkuXG4gICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudGF0aW9uICYmICFjdXJzb3IuZ2V0TmFtZSgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGlzUHJlc2VudGF0aW9uID8gXCJncm91cGluZ1wiIDogXCJmcmFtZVwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke2xhYmVsfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBQcmVmb3JtYXR0ZWQgdGV4dCAoPHByZT4pXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiUFJFXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1wcmVmb3JtYXR0ZWQgdGV4dF1gXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE11bHRpcGxlIHJvbGVzIHJ1bGVzIC0gcGxhY2VkIGF0IHRoZSBib3R0b21cblxuICAgIC8vIEhlYWRpbmcgbW9kZSBydWxlcyAtIGlnbm9yZSBjb250YWluZXIgZWxlbWVudHMgaW4gaGVhZGluZyBtb2RlIChtdWx0aXBsZSByb2xlcylcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcbiAgICAgICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImZpZ3VyZVwiLCBcImZvcm1cIiwgXCJncm91cFwiLCBcInJlZ2lvblwiLCBcbiAgICAgICAgICAgICAgICBcInJvd1wiLCBcInJvd2hlYWRlclwiLCBcInNlYXJjaFwiLCBcInRvb2xiYXJcIiwgXCJsaXN0XCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pXG5dO1xuIiwiaW1wb3J0IHsgU1JSZW5kZXJlclJ1bGUgfSBmcm9tIFwiLi4vU1JSZW5kZXJlclJ1bGVcIjtcbmltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4uL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBxdW90ZU5hbWVQYWRBZnRlciwgZ2V0Um9sZURlc2NyaXB0aW9uIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5cbmV4cG9ydCBsZXQgUlVMRVM6IFNSUmVuZGVyZXJSdWxlW10gPSBbXG4gICAgLy8gU2luZ2xlIHJvbGUgcnVsZXMgLSBhbHBoYWJldGljYWxseSBzb3J0ZWRcbiAgICBcbiAgICAvLyBBcnRpY2xlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImFydGljbGVcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJhbm5lciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJhbm5lclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImJhbm5lciByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJsb2NrcXVvdGUgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJibG9ja3F1b3RlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltvdXQgb2YgYmxvY2txdW90ZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDYXB0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2FwdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGNhcHRpb25dXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29tcGxlbWVudGFyeSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJjb21wbGVtZW50YXJ5IHJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFtvdXQgb2YgJHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29udGVudGluZm8gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjb250ZW50aW5mb1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImNvbnRlbnQgaW5mbyByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEZpZ3VyZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImZpZ3VyZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGZpZ3VyZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBGb3JtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZm9ybVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcImZvcm1jb250cm9sXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW291dCBvZiBzZWN0aW9uXVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiBmb3JtXWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEdyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIDxkZXRhaWxzPiB1c2VzIHRoZSBncm91cCByb2xlIGJ1dCBoYXMgaXRzIG93biBkaXNjbG9zdXJlIHdpZGdldCBzZW1hbnRpY3M7XG4gICAgICAgICAgICAgICAgLy8gU1JzIGRvIG5vdCBhbm5vdW5jZSBcIm91dCBvZiBncm91cGluZ1wiIHdoZW4gbGVhdmluZyBhIGRldGFpbHMgZWxlbWVudC5cbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkRFVEFJTFNcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcImNvbWJvYm94XCJdLCBbXCJzZWxlY3RcIl0pPy5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJTRUxFQ1RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiW291dCBvZiBncm91cGluZ11cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImxpc3RcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vL2xpIHwgLi8vKltAcm9sZT0nbGlzdGl0ZW0nXVwiLCBub2RlLCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cyA9IGRvY3VtZW50LmV2YWx1YXRlKFxuICAgICAgICAgICAgICAgICAgICBcIi4vL3VsLy9saXwuLy91bC8vKltAcm9sZT0nbGlzdGl0ZW0nXXwuLy9vbC8vbGl8Li8vb2wvLypbQHJvbGU9J2xpc3RpdGVtJ118Li8vKltAcm9sZT0nbGlzdCddLy9saXwuLy8qW0Byb2xlPSdsaXN0J10vLypbQHJvbGU9J2xpc3RpdGVtJ11cIixcbiAgICAgICAgICAgICAgICAgICAgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIGxldCBudW1JdGVtcyA9IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGgtZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cy5zbmFwc2hvdExlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobnVtSXRlbXMgPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1vdXQgb2YgbGlzdF1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYWluIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWFpblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm1haW4gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBtZW51YmFyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWVudWJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImxpc3RcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIG1lbnViYXJdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBOYXZpZ2F0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibmF2aWdhdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm5hdmlnYXRpb24gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyByYWRpb2dyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicmFkaW9ncm91cFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGdyb3VwaW5nXVwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFJlZ2lvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJlZ2lvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwicmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTZWFyY2ggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzZWFyY2hcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzZWFyY2ggcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWJsZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRhYmxlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltvdXQgb2YgdGFibGVdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVG9vbGJhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRvb2xiYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIHRvb2xiYXJdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBIVE1MIEVsZW1lbnQgcnVsZXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJBQkJSXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpID8gXG4gICAgICAgICAgICAgICAgYFske2N1cnNvci5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFwidGl0bGVcIil9XWAgOiBudWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkRMXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgZGVmaW5pdGlvbiBsaXN0XWBcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRklHQ0FQVElPTlwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIGNhcHRpb25dYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNQVJLXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgaGlnaGxpZ2h0ZWRdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBJbmxpbmUgZnJhbWUgKDxpZnJhbWU+KVxuICAgIC8vIFdoZW4gcm9sZT1cIm5vbmVcIiBvciByb2xlPVwicHJlc2VudGF0aW9uXCIgaXMgc2V0LCBzY3JlZW4gcmVhZGVycyB0cmVhdCB0aGUgZnJhbWVcbiAgICAvLyBhcyBhIGdlbmVyaWMgZ3JvdXBpbmcg4oCUIGFubm91bmNlIFwib3V0IG9mIGdyb3VwaW5nXCIgaW5zdGVhZCBvZiBcIm91dCBvZiBmcmFtZVwiLlxuICAgIC8vIEV4Y2VwdGlvbjogYW4gdW50aXRsZWQgcHJlc2VudGF0aW9uYWwgaWZyYW1lIHByb2R1Y2VzIG5vIGNvbnRhaW5lci1lbnRlciBsYWJlbCwgc29cbiAgICAvLyB0aGUgbWF0Y2hpbmcgY29udGFpbmVyLWV4aXQgbXVzdCBhbHNvIGJlIHN1cHByZXNzZWQgdG8gYXZvaWQgYSBzdHJheSBcIltvdXQgb2YgZ3JvdXBpbmddXCIuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiSUZSQU1FXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZSA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUHJlc2VudGF0aW9uID0gcm9sZSA9PT0gXCJub25lXCIgfHwgcm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIjtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50YXRpb24gJiYgIWN1cnNvci5nZXROYW1lKCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1ByZXNlbnRhdGlvbiA/IGBbb3V0IG9mIGdyb3VwaW5nXWAgOiBgW291dCBvZiBmcmFtZV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBQcmVmb3JtYXR0ZWQgdGV4dCAoPHByZT4pXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiUFJFXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgcHJlZm9ybWF0dGVkIHRleHRdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNdWx0aXBsZSByb2xlcyBydWxlcyAtIHBsYWNlZCBhdCB0aGUgYm90dG9tXG4gICAgXG4gICAgLy8gUmVnaW9uIG1vZGUgcnVsZXMgLSBpZ25vcmUgY29udGFpbmVyIGVsZW1lbnRzIGluIHJlZ2lvbiBhbmQgaGVhZGluZyBtb2RlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImdyb3VwXCIsIFwiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcbiAgICAgICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsIFwiZmlndXJlXCIsIFwiZm9ybVwiLCBcImxpc3RcIiwgXCJyZWdpb25cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcbiAgICAgICAgICAgICAgICBcInNlYXJjaFwiLCBcInRhYmxlXCIsIFwidG9vbGJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wicmVnaW9uXCIsIFwiaGVhZGluZ1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXTtcbiIsImltcG9ydCB7IFJVTEVTIGFzIFNSUnVsZXMgfSBmcm9tIFwiLi9jb21tb25cIjtcbmltcG9ydCB7IFJVTEVTIGFzIENvbnRhaW5lckVudGVyUnVsZXMgfSBmcm9tIFwiLi9jb250YWluZXJfZW50ZXJcIjtcbmltcG9ydCB7IFJVTEVTIGFzIENvbnRhaW5lckV4aXRSdWxlcyB9IGZyb20gXCIuL2NvbnRhaW50ZXJfZXhpdFwiO1xuZXhwb3J0IGxldCBTUl9SVUxFUyA9IFNSUnVsZXM7XG5leHBvcnQgbGV0IENPTlRBSU5FUl9FTlRFUl9SVUxFUyA9IENvbnRhaW5lckVudGVyUnVsZXM7XG5leHBvcnQgbGV0IENPTlRBSU5FUl9FWElUX1JVTEVTID0gQ29udGFpbmVyRXhpdFJ1bGVzO1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG50eXBlIEVsZW1DYWxjID0gKGVsZW06IEVsZW1lbnQpID0+IHN0cmluZztcbnR5cGUgTm9kZUNhbGMgPSAobm9kZTogTm9kZSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBBY2Nlc3NpYmxlTmFtZVJlc3VsdCA9IHtcbiAgICBuYW1lOiBzdHJpbmcsIFxuICAgIG5hbWVGcm9tOiBcImFyaWFMYWJlbFwiIHwgXCJ0aXRsZVwiIHwgXCJwbGFjZWhvbGRlclwiIHwgXCJsYWJlbFwiIFxuICAgICAgICB8IFwidmFsdWVcIiB8IFwiaW50ZXJuYWxcIiB8IFwiYWx0XCIgfCBcInRleHRcIiB8IFwibGVnZW5kXCIgXG4gICAgICAgIHwgXCJzdW1tYXJ5XCIgfCBcImZpZ2NhcHRpb25cIiB8IFwiY2FwdGlvblwiXG4gICAgICAgIHwgXCJzaGFkb3dcIiB8IFwic2xvdFwiIHwgXCJzaGFkb3ctaG9zdFwiIHwgXCJjb250ZW50LXNsb3RcIlxuICAgICAgICB8IFwiY29udGVudFwiXG4gICAgICAgIHwgXCJzdmdsaW5rVGl0bGVcIiB8IFwic3ZnVGl0bGVcIiB8IFwic3ZnVGV4dFwiIHwgXCJzdmdEZXNjXCJcbiAgICAgICAgfCBcImFyaWEtZGVzY3JpcHRpb25cIlxuICAgICAgICB8IHN0cmluZyAvLyBjc3MtKlxufVxuZXhwb3J0IGNsYXNzIEFjY05hbWVVdGlsIHtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgYWNjZXNzaWJsZSBuYW1lIGZvciBhbiBTVkcgZWxlbWVudCBhY2NvcmRpbmcgdG8gVzNDIHNwZWNpZmljYXRpb25cbiAgICAgKiBGb2xsb3dpbmcgdGhlIEFjY2Vzc2libGUgTmFtZSBhbmQgRGVzY3JpcHRpb24gQ29tcHV0YXRpb24gMS4xIGFsZ29yaXRobVxuICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9hY2NuYW1lLTEuMS9cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZWxlbSBUaGUgU1ZHIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyBUaGUgYWNjZXNzaWJsZSBuYW1lIHJlc3VsdCBvciBudWxsIGlmIG5vIGFjY2Vzc2libGUgbmFtZSBpcyBmb3VuZFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU1ZHRWxlbWVudFczQyhlbGVtOiBFbGVtZW50KTogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3N2ZycpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogQ2hlY2sgZm9yIGFyaWEtbGFiZWxsZWRieSAoYWxyZWFkeSBoYW5kbGVkIGJ5IG1haW4gY29tcHV0ZUFjY2Vzc2libGVOYW1lIGZ1bmN0aW9uKVxuICAgICAgICAvLyBTdGVwIDI6IENoZWNrIGZvciBhcmlhLWxhYmVsIChhbHJlYWR5IGhhbmRsZWQgYnkgbWFpbiBjb21wdXRlQWNjZXNzaWJsZU5hbWUgZnVuY3Rpb24pXG5cbiAgICAgICAgLy8gU3RlcCAzOiBDaGVjayBmb3IgdGl0bGUgZWxlbWVudFxuICAgICAgICBjb25zdCBzdmdUaXRsZXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiB0aXRsZVwiKTtcbiAgICAgICAgaWYgKHN2Z1RpdGxlcyAmJiBzdmdUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgc3ZnVGl0bGVzLmZvckVhY2goc3ZnVGl0bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdmdUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnVGl0bGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHN2Z1RpdGxlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHN2Z1RpdGxlLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gdGl0bGUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IFwibmFtZVwiOiB0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z1RpdGxlXCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNDogQ2hlY2sgZm9yIHRleHQgY29udGVudCBpbiBTVkcgdGV4dCBlbGVtZW50c1xuICAgICAgICBsZXQgdGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICBjb25zdCB0ZXh0RWxlbWVudHMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0ZXh0LCB0ZXh0UGF0aCwgdHNwYW5cIik7XG4gICAgICAgIGlmICh0ZXh0RWxlbWVudHMgJiYgdGV4dEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRleHRFbGVtZW50cy5mb3JFYWNoKHRleHRFbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHRleHRFbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbCh0ZXh0RWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRleHRFbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudCArPSBcIiBcIiArIGNvbnRlbnQudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHRDb250ZW50LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHRDb250ZW50LnRyaW0oKSksIFwibmFtZUZyb21cIjogXCJzdmdUZXh0XCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNTogQ2hlY2sgZm9yIHhsaW5rOnRpdGxlIGF0dHJpYnV0ZSBvbiBsaW5rcyB3aXRoaW4gU1ZHXG4gICAgICAgIGNvbnN0IGxpbmtzID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGxpbmtzW2ldO1xuICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChsaW5rKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChsaW5rKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhsaW5rVGl0bGUgPSBsaW5rLmdldEF0dHJpYnV0ZShcInhsaW5rOnRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIGlmICh4bGlua1RpdGxlICYmIHhsaW5rVGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHhsaW5rVGl0bGUpLCBcIm5hbWVGcm9tXCI6IFwic3ZnbGlua1RpdGxlXCIgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNjogQ2hlY2sgZm9yIGFyaWEtZGVzY3JpYmVkYnkgb3IgYXJpYS1kZXNjcmlwdGlvblxuICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSBBcmlhVXRpbC5nZXRBcmlhRGVzY3JpcHRpb24oZWxlbSk7XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGRlc2NyaXB0aW9uKSwgXCJuYW1lRnJvbVwiOiBcImFyaWEtZGVzY3JpcHRpb25cIiB9O1xuXG4gICAgICAgIC8vIFN0ZXAgNzogQ2hlY2sgZm9yIGRlc2MgZWxlbWVudFxuICAgICAgICBjb25zdCBkZXNjRWxlbWVudHMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiBkZXNjXCIpO1xuICAgICAgICBpZiAoZGVzY0VsZW1lbnRzICYmIGRlc2NFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgZGVzY1RleHQgPSBcIlwiO1xuICAgICAgICAgICAgZGVzY0VsZW1lbnRzLmZvckVhY2goZGVzY0VsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZGVzY0VsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGRlc2NFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY0VsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2MudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NUZXh0ICs9IFwiIFwiICsgZGVzYy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZGVzY1RleHQudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICByZXR1cm4geyBcIm5hbWVcIjogZGVzY1RleHQudHJpbSgpLCBcIm5hbWVGcm9tXCI6IFwic3ZnRGVzY1wiIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDg6IENoZWNrIGZvciB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmICh0aXRsZSAmJiB0aXRsZS50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IFwibmFtZVwiOiBDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0aXRsZSksIFwibmFtZUZyb21cIjogXCJ0aXRsZVwiIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBhY2Nlc3NpYmxlIG5hbWUgZm91bmRcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgYSBnaXZlbiBub2RlXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgbmFtZV9wYWlyID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAobmFtZV9wYWlyICE9PSB1bmRlZmluZWQpIHJldHVybiBuYW1lX3BhaXI7XG5cbiAgICAgICAgLy8gMS4gbmFtZSBmcm9tIGF1dGhvciwgb3IgZWxlbWVudHMgd2l0aG91dCBhIHJvbGUgYnV0IHdpdGggYXJpYS1sYWJlbGxlZGJ5IG9yIGFyaWEtbGFiZWwgXG4gICAgICAgIC8vICAgZ2V0IGFyaWEgbGFiZWwgZXZlbiBmb3IgdGhlIHJvbGUgd2hlcmUgdGhlIG5hbWUgaXMgcHJvaGliaXRlZCBvciBpcyAncHJlc2VudGF0aW9uJyBvciAnbm9uZSdcbiAgICAgICAgbGV0IGFjY05hbWUgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlbSk7XG4gICAgICAgIGlmIChhY2NOYW1lICYmIGFjY05hbWUudHJpbSgpICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhY2NOYW1lKSwgXCJuYW1lRnJvbVwiOiBcImFyaWFMYWJlbFwifSk7XG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGFjY05hbWUpLCBcIm5hbWVGcm9tXCI6IFwiYXJpYUxhYmVsXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gYWNjZXNzaWJsZSBuYW1lIG1hcHBpbmcgZm9yIG5hdGl2ZSBodG1sIGVsZW1lbnRzXG4gICAgICAgIG5hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvck5hdGl2ZUVsZW1lbnQoZWxlbSk7XG4gICAgICAgIGlmIChuYW1lX3BhaXIpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIkVMRU1FTlRfQUNDRVNTQkxFX05BTUVcIiwgbmFtZV9wYWlyKTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lX3BhaXI7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIDMuIG5hbWUgZnJvbSBuYXRpdmUgb3IgYXJpYSBhdHRyaWJ1dGVcbiAgICAgICAgLyoqbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRnJvbUF0dHJpYnV0ZShlbGVtKTtcbiAgICAgICAgaWYgKG5hbWVfcGFpcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCBuYW1lX3BhaXIpO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWVfcGFpcjtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLy8gNC4gbmFtZSBmcm9tIGNvbnRlbnQgZm9yIGN1c3RvbSBlbGVtZW50cyB3aXRoIGEgcm9sZVxuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICBpZiAoQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKSB7XG4gICAgICAgICAgICBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ29udGVudChlbGVtKTtcbiAgICAgICAgICAgIGlmIChuYW1lX3BhaXIpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIG5hbWVfcGFpcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVfcGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIG5hbWUgZnJvbSB0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBcInRpdGxlXCJcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidGl0bGVcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHRpdGxlICYmIHRpdGxlLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGl0bGUgPSBDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0aXRsZSk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCB7XCJuYW1lXCI6dGl0bGUsIFwibmFtZUZyb21cIjogXCJ0aXRsZVwifSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0aXRsZSwgXCJuYW1lRnJvbVwiOiBcInRpdGxlXCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyA2LiBuYW1lIGZyb20gdGhlIGF0dHJpYnV0ZSBcInBsYWNlaG9sZGVyXCJcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBDb21tb25VdGlsLmlucHV0X3R5cGVfd2l0aF9wbGFjZWhvbGRlci5pbmNsdWRlcyhlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikpKSkpIHtcbiAgICAgICAgICAgIGxldCBwbGFjZWhvbGRlciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIik7XG4gICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIgJiYgcGxhY2Vob2xkZXIudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlciA9IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHtcIm5hbWVcIjpwbGFjZWhvbGRlciwgXCJuYW1lRnJvbVwiOiBcInBsYWNlaG9sZGVyXCJ9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnBsYWNlaG9sZGVyLCBcIm5hbWVGcm9tXCI6IFwicGxhY2Vob2xkZXJcIn07XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgbmF0aXZlIGVsZW1lbnRzXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JOYXRpdmVFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBsYWJlbGxhYmxlIGZpZWxkc1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldEZvcm1GaWVsZExhYmVsKGVsZW0pO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlucHV0IHR5cGVzOiBidXR0b24sIHJlc2V0LCBzdWJtaXQsIGltYWdlXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSkgeyBcbiAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmZvcm1fYnV0dG9uX3R5cGVzLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB0eXBlczogYnV0dG9uLCByZXNldCwgc3VibWl0XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGZvciB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodmFsdWUpLCBcIm5hbWVGcm9tXCI6IFwidmFsdWVcIn07XG5cbiAgICAgICAgICAgICAgICAvLyBpbnB1dCAnc3VibWl0JyBhbmQgJ3Jlc2V0JyBoYXZlIHZpc2libGUgZGVmYXVsdHMgc28gcGFzcyBpZiB0aGVyZSBpcyBubyBleHBsaWNpdCAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6dHlwZSwgXCJuYW1lRnJvbVwiOiBcImludGVybmFsXCJ9O1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHR5cGUgPSAnaW1hZ2UnXG4gICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHRob3VnaCBIVE1MIDUgc3BlYyBpbmRpY2F0ZXMgXCJUaGUgZWxlbWVudCdzIFt2YWx1ZV0gYXR0cmlidXRlIG11c3QgYmUgb21pdHRlZFwiLCBDaHJvbWUgdXNlcyB0aGUgdmFsdWUuXG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBhY2Nlc3NpYmxlIG5hbWUgZm9yIHRoZSBhbHQgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgY29uc3QgYWx0ID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChhbHQgJiYgYWx0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoYWx0KSwgXCJuYW1lRnJvbVwiOiBcImFsdFwifTs7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGUgdmlzaWJsZSBkZWZhdWx0IHRleHQgZm9yIHR5cGUgXCJpbWFnZVwiIGlzIFwiU3VibWl0XCIgc2FtZSB3aXRoIHRoZSB0eXBlIFwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAvL3JldHVybiB7XCJuYW1lXCI6ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLCBcIm5hbWVGcm9tXCI6IFwiaW50ZXJuYWxcIn07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBidXR0b25cbiAgICAgICAgLy8gbm90ZSBidXR0b24gbWF5IGhhdmUgYSB2YWx1ZSBhdHRyaWJ1dGUsIGJ1dCBpdCdzIG5vdCBhIHZpc2libGUgdGV4dFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IHVzZSB0aGUgYnV0dG9uIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJ0ZXh0XCJ9O1xuXG4gICAgICAgICAgICAvLyBmb3IgaW1hZ2UgYnV0dG9uOiBnZXQgdGhlIGZpcnN0IGltYWdlIGlmIGV4aXN0c1xuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuICAgICAgICAgICAgaWYgKGltYWdlICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChpbWFnZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwoaW1hZ2UpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoaW1hZ2UpOyBcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGZvciBhIGJ1dHRvbiB3aXRoIGEgc3ZnIGltYWdlXG4gICAgICAgICAgICBjb25zdCBzdmcgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xuICAgICAgICAgICAgaWYgKHN2ZyAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChzdmcpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoc3ZnKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaWVsZHNldFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZmllbGRzZXRcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkc2V0IGVsZW1lbnQncyBmaXJzdCBjaGlsZCBpcyBhIGxlZ2VuZCBlbGVtZW50LCB0aGVuIHVzZSB0aGUgc3VidHJlZSBvZiB0aGUgbGVnZW5kXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoZmlyc3QgJiYgZmlyc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2xlZ2VuZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBsZWdlbmQgY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGZpcnN0IGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJsZWdlbmRcIn07IFxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBvdXRwdXRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcIm91dHB1dFwiKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgYXNzb2NpYXRlZCBsYWJlbCBlbGVtZW50IGV4aXN0cywgdXNlIGNvbmNhdGVuYXRlZCBhY2Nlc3NpYmxlIG5hbWUocykgZnJvbSBsYWJlbGxlZCBlbGVtZW50cy5cbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImZvclwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsSURzICYmIGxhYmVsSURzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsYWJlbElEcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IGVsZW0ub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChsYWJlbElEc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlbSkgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGxhYmVsTm9kZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwobGFiZWxOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgKz0gXCIgXCIgKyBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocGFpci5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGxhYmVsKSwgXCJuYW1lRnJvbVwiOiBcImxhYmVsXCJ9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdW1tYXJ5XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdW1tYXJ5XCIpIHtcbiAgICAgICAgICAgIC8vIHVzZSBzdW1tYXJ5IGVsZW1lbnQgc3VidHJlZVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChlbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwibGVnZW5kXCJ9OyAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGV0YWlsc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZGV0YWlsc1wiKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoZmlyc3QgJiYgZmlyc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKSB7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IGFjY2Vzc2libGUgbmFtZSBmcm9tIHN1bW1hcnlcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGZpcnN0KTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChwYWlyLm5hbWUudHJpbSgpKSwgXCJuYW1lRnJvbVwiOiBcInN1bW1hcnlcIn07IFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gc3VtbWFyeSBlbGVtZW50IGFzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBkZXRhaWxzIGVsZW1lbnQsIFxuICAgICAgICAgICAgLy8gdGhlIHVzZXIgYWdlbnQgc2hvdWxkIHByb3ZpZGUgb25lIHdpdGggYSBzdWJ0cmVlIGNvbnRhaW5pbmcgYSBsb2NhbGl6ZWQgc3RyaW5nIG9mIHRoZSB3b3JkIFwiZGV0YWlsc1wiLlxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpcImRldGFpbHNcIiwgXCJuYW1lRnJvbVwiOiBcImludGVybmFsXCJ9OyAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlndXJlXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJmaWd1cmVcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZ3VyZSBlbGVtZW50IGhhcyBhIGZpZ2NhcHRpb24gYXMgYSBjaGlsZFxuICAgICAgICAgICAgbGV0IGNhcHRpb24gPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4oZWxlbSwgXCJmaWdjYXB0aW9uXCIsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChjYXB0aW9uICYmIGNhcHRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGZpZ2NhcHRpb24gY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNhcHRpb25bMF0gYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcImZpZ2NhcHRpb25cIn07ICBcbiAgICAgICAgICAgIH0gICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW1nIGVsZW1lbnRzOiB1c2UgYXR0cmlidXRlIFwiYWx0XCJcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImltZ1wiKSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWx0ID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhbHQpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXJlYSBlbGVtZW50czogdXNlIGF0dHJpYnV0ZSBcImFsdFwiXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJhcmVhXCIpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBhbHQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoYWx0ICYmIGFsdC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhbHQpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGFibGUgZWxlbWVudFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwidGFibGVcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZ3VyZSBlbGVtZW50IGhhcyBhIGNhcHRpb24gYXMgdGhlIGZpcnN0IGNoaWxkXG4gICAgICAgICAgICBsZXQgY2FwdGlvbkVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGNhcHRpb25FbGVtICYmIGNhcHRpb25FbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjYXB0aW9uJykge1xuICAgICAgICAgICAgICAgIC8vIGNhcHRpb24gY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCBjYXB0aW9uID0gKGNhcHRpb25FbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKGNhcHRpb24gJiYgY2FwdGlvbi50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoY2FwdGlvbiksIFwibmFtZUZyb21cIjogXCJjYXB0aW9uXCJ9OyBcbiAgICAgICAgICAgIH0gICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGEgZWxlbWVudFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYVwiKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCB1c2UgdGhlIGxpbmsgdGV4dFxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChlbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcInRleHRcIn07XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAvL2ZvciBpbWFnZSBsaW5rOiBnZXQgdGhlIGltYWdlIG9yIHN2ZyBpZiBleGlzdHNcbiAgICAgICAgICAgIGNvbnN0IGltYWdlcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+IGltZywgOnNjb3BlID4gc3ZnXCIpO1xuICAgICAgICAgICAgaWYgKGltYWdlcyAmJiBpbWFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpbWFnZXMuZm9yRWFjaChpbWFnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoaW1hZ2UpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGltYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoaW1hZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBcIiBcIiArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnRleHQudHJpbSgpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3B0Z3JvdXBcbiAgICAgICAgLy8gbGFiZWwgcGFydGljaXBhdGUgaW4gYWNjZXNzaWJsZSBuYW1lIGNhbGN1bGF0aW9uOiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNhdHQtbGFiZWxcbiAgICAgICAgLy8gVGhlIGxhYmVsIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZC4gSXRzIHZhbHVlIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBncm91cFxuICAgICAgICAvLyB0aGUgdmFsdWUgaXMgZGlzYWJsZWQgaW4gdGhlIGludGVyZmFjZVxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwib3B0Z3JvdXBcIiB8fCBub2RlTmFtZSA9PT0gXCJvcHRpb25cIiB8fCBub2RlTmFtZSA9PT0gXCJ0cmFja1wiKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwibGFiZWxcIik7XG4gICAgICAgICAgICBpZiAobGFiZWwgJiYgbGFiZWwudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN2Z1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTVkdFbGVtZW50VzNDKGVsZW0pO1xuICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgbmF0aXZlIGVsZW1lbnRzXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTVkdFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgLy8gMS4gYSBkaXJlY3QgY2hpbGQgb3IgZGVzY2VuZGFudCB0aXRsZSBlbGVtZW50IFxuICAgICAgICBjb25zdCBzdmdUaXRsZXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiB0aXRsZVwiKTtcbiAgICAgICAgaWYgKHN2Z1RpdGxlcyAmJiBzdmdUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgc3ZnVGl0bGVzLmZvckVhY2goc3ZnVGl0bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdmdUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnVGl0bGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHN2Z1RpdGxlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHN2Z1RpdGxlLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gdGl0bGUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z1RpdGxlXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4geGxpbms6dGl0bGUgYXR0cmlidXRlIG9uIGEgbGlua1xuICAgICAgICBsZXQgbGlua1RpdGxlID0gZWxlbS5xdWVyeVNlbGVjdG9yKFwiYVwiKTtcbiAgICAgICAgaWYgKGxpbmtUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQobGlua1RpdGxlKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChsaW5rVGl0bGUpKSB7XG4gICAgICAgICAgICBsZXQgbGluayA9IGxpbmtUaXRsZS5nZXRBdHRyaWJ1dGUoXCJ4bGluazp0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmIChsaW5rICYmIGxpbmsudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGxpbmspLCBcIm5hbWVGcm9tXCI6IFwic3ZnbGlua1RpdGxlXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqIDMuIGZvciB0ZXh0IGNvbnRhaW5lciBlbGVtZW50cywgdGhlIHRleHQgY29udGVudC4gXG4gICAgICAgICAqIG5vdGUgdGhlIFNWRyB0ZXh0IGNvbnRlbnQgZWxlbWVudHMgYXJlOiDigJh0ZXh04oCZLCDigJh0ZXh0UGF0aOKAmSBhbmQg4oCYdHNwYW7igJkuXG4gICAgICAgICAqICBzdmcgZWxlbWVudCBjYW4gYmUgbmVzdGVkLiBPbmUgb2YgdGhlIHB1cnBvc2VzIGlzIHRvIHRvIGdyb3VwIFNWRyBzaGFwZXMgdG9nZXRoZXIgYXMgYSBjb2xsZWN0aW9uIGZvciByZXNwb25zaXZlIGRlc2lnbi5cbiAgICAgICAgICogXG4gICAgICAgICAqIHNlbGVjdCB0ZXh0IGNvbnRlbnQgZXhjbHVkZWQgdGhlIHRleHQgZnJvbSB0aGUgbmVzdGVkIHN2ZyBlbGVtZW50cyBhbmQgdGhlaXIgY2hpbGRyZW4gXG4gICAgICAgICAqLyBcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiAqXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdzdmcnICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IHZhbHVlO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwic3ZnVGV4dFwifTsgXG5cbiAgICAgICAgLy8gNC4gZnJvbSBhcmlhLWRlc2NyaWJlZGJ5IG9yIGFyaWEtZGVzY3JpcHRpb24gXG4gICAgICAgIGxldCBkZXNjYnkgPSBBcmlhVXRpbC5nZXRBcmlhRGVzY3JpcHRpb24oZWxlbSk7XG4gICAgICAgIGlmIChkZXNjYnkgJiYgZGVzY2J5LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChkZXNjYnkpLCBcIm5hbWVGcm9tXCI6IFwiYXJpYS1kZXNjcmlwdGlvblwifTtcblxuICAgICAgICAvLyA1LiBhIGRpcmVjdCBjaGlsZCBvciBkZXNjZW5kYW50IGRlc2MgZWxlbWVudFxuICAgICAgICBsZXQgZGVzY0VsZW1zID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlID4gZGVzY1wiKTtcbiAgICAgICAgaWYgKGRlc2NFbGVtcyAmJiBkZXNjRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgZGVzY0VsZW1zLmZvckVhY2goZGVzY0VsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZXNjRWxlbSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZGVzY0VsZW0pICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGRlc2NFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY0VsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2MudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gZGVzYy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z0Rlc2NcIn07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBjdXN0b20gZWxlbWVudHMgbWFya2VkIHdpdGggYXJpYVxuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRnJvbUNvbnRlbnQoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgLyoqIGZvciBhY2MgbmFtZSBmcm9tIGNvbnRlbnQsIHRoZSBjb250ZW50IGZyb20gQ1NTIHBzZXVkby1lbGVtZW50cyBcbiAgICAgICAgICogIDpiZWZvcmUgYW5kIDphZnRlciBwc2V1ZG8gZWxlbWVudHMgW0NTUzJdIGNhbiBwcm92aWRlIHRleHR1YWwgY29udGVudCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgY29udGVudCBtb2RlbC5cbiAgICAgICAgICogRm9yIDpiZWZvcmUgb3IgOmFmdGVyIHBzZXVkbyBlbGVtZW50cywgdXNlciBhZ2VudHMgbXVzdCBwcmVwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgYSBzcGFjZSwgXG4gICAgICAgICAqICAgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JDU1NQc2V1ZG9FbGVtZW50KGVsZW0sIFwiYmVmb3JlXCIpO1xuICAgICAgICBpZiAocGFpciAhPT0gbnVsbCAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG5cbiAgICAgICAgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvckNTU1BzZXVkb0VsZW1lbnQoZWxlbSwgXCJhZnRlclwiKTtcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBwYWlyO1xuXG4gICAgICAgIC8vICBzaGFkb3cgaG9zdFxuICAgICAgICBpZiAoZWxlbS5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU2hhZG93SG9zdChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwic2hhZG93XCJ9OztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gc2xvdCBlbGVtZW50XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzbG90XCIpIHtcbiAgICAgICAgICAgIHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTbG90RWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwic2xvdFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG90aGVyd2lzZTogZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBlbGVtZW50XG4gICAgICAgIHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ2hpbGRyZW4oZWxlbSk7XG4gICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOiBwYWlyLm5hbWUsIFwibmFtZUZyb21cIjogXCJjb250ZW50XCJ9O1xuXG4gICAgICAgIC8vIG5vIGFjY2Vzc2libGUgbmFtZSBleGlzdHNcbiAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZnJvbSBDU1MgZ2VuZXJhdGVkIGNvbnRlbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvckNTU1BzZXVkb0VsZW1lbnQoZWxlbTogRWxlbWVudCwgdHlwZTpzdHJpbmcpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29udGVudEVsZW0gPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLHR5cGUpO1xuICAgICAgICBpZiAoY29udGVudEVsZW0pIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gY29udGVudEVsZW0uY29udGVudDtcbiAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQgIT09IFwibm9uZVwiICYmIGNvbnRlbnQgIT09IFwibm9cIiAmJiBjb250ZW50ICE9PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOiBDb21tb25VdGlsLnRydW5jYXRlVGV4dChjb250ZW50KSwgXCJuYW1lRnJvbVwiOiBcImNzcy1cIit0eXBlfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBTTE9UIGVsZW1lbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvclNoYWRvd0hvc3QoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBlbGVtLnNoYWRvd1Jvb3Q7XG4gICAgICAgIGlmIChzaGFkb3dSb290KSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKTsgICBcbiAgICAgICAgICAgIC8vIGNoZWNrIHRleHQgZnJvbSBhbGwgdGhlIGNoaWxkcmVuIGVsZW1lbnRzXG4gICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogQ29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJzaGFkb3ctaG9zdFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBTTE9UIGVsZW1lbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvclNsb3RFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgLy9pZiBubyBhc3NpZ25lZE5vZGUsIGNoZWNrIGl0cyBvd24gdGV4dCBcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICBpZiAoIShlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpIHx8IChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgdGV4dCArPSBcIiBcIiArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgIH0gZWxzZSB7ICAgIFxuICAgICAgICAgICAgLy8gY2hlY2sgdGV4dCBmcm9tIGFsbCBhc3NpZ25lZCBub2Rlc1xuICAgICAgICAgICAgZm9yIChjb25zdCBzbG90Q2hpbGQgb2YgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShzbG90Q2hpbGQgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudC1zbG90XCJ9O1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZnJvbSBjaGlsZHJlbiBjb250ZW50XG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ2hpbGRyZW4oZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG5cbiAgICAgICAgLy9sZXQgd2Fsa0NoaWxkID0gZWxlbS5maXJzdENoaWxkO1xuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW0pO1xuICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBjaGlsZHJlbnMgb2YgdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSB0ZXh0XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGVsZW0gJiYgbncubm9kZSAhPT0gZWxlbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykgY29udGludWU7XG4gICAgICAgIC8vd2hpbGUgKHdhbGtDaGlsZCkgeyBcbiAgICAgICAgICAgIGNvbnN0IHdhbGtDaGlsZCA9IG53Lm5vZGU7IFxuICAgICAgICAgICAgaWYgKHdhbGtDaGlsZC5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgdGV4dCBub2RlLCBnZXQgdGhlIHBhcmVudG5vZGUgdG8gY2hlY2sgdmlzaWJpbGl0eVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHdhbGtDaGlsZC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocGFyZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChwYXJlbnQpICYmIHdhbGtDaGlsZC5ub2RlVmFsdWUgJiYgd2Fsa0NoaWxkLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgd2Fsa0NoaWxkLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdhbGtDaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQod2Fsa0NoaWxkIGFzIEhUTUxFbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbCh3YWxrQ2hpbGQgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZSh3YWxrQ2hpbGQgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyBwYWlyLm5hbWUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2tpcCBjaGlsZHJlbiBpZiB0aGlzIGVsZW1lbnQgb25seSBoYXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBpZiBhY2Nlc3NpYmxlIG5hbWUgY2FuIGJlIGlnbm9yZWQgZm9yIGltYWdlIG9yIHN2Z1xuICAgIHB1YmxpYyBzdGF0aWMgaXNBY2Nlc3NpYmxlTmFtZUlnbm9yYWJsZShlbGVtOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lICE9PSAnaW1nJyAmJiBub2RlTmFtZSAhPT0gJ3N2ZycpIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXJlbnQgPSBlbGVtLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgaXMgYSB3aWRnZXQgYW5kIGhhcyBhbiBhcmlhIGxhYmVsLCB0aGVuIGltYWdlL3N2ZyBsYWJlbCBpcyBub3QgbmVjZXNzYXJ5XG4gICAgICAgICAgICBpZiAoKEFyaWFVdGlsLmlzV2lkZ2V0KHBhcmVudCkgfHwgQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShwYXJlbnQpKSAmJiBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0gXG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zLCBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50IH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4vQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBBcmlhVXRpbCB7XG5cbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRhZ3Mgd2hpY2ggaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIHNpbmNlIHdlIGhhdmUgcnVsZXMgdHJpZ2dlcmluZ1xuICAgIHB1YmxpYyBzdGF0aWMgbmF2TGlua0tleXdvcmRzID0gWydzdGFydCcsICduZXh0JywgJ3ByZXYnLCAncHJldmlvdXMnLCAnY29udGVudHMnLCAnaW5kZXgnXVxuXG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBydWxlIGlkcyBmb3IgdGhlIHJ1bGVzIHRoYXQgaGF2ZSB0byBjaGVjayBmb3IgaGlkZGVuIGNvbnRlbnQgcmVnYXJkbGVzcyBvZiB0aGUgQ2hlY2sgSGlkZGVuXG4gICAgLy8gQ29udGVudCBTZXR0aW5nLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUgZW5naW5lIGlzIGFjdHVhbGx5IGRldGVybWluZSB3aGljaCBlbGVtZW50cyB0byBtYXNzIHRvIHRoZSBydWxlcywgaXQgd2lsbCBhbHdheXNcbiAgICAvLyBwYXNzIHRoZXNlcyBydWxlcyBubyBtYXR0ZXIgd2hhdCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZyBpcy5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVzVGhhdEhhdmVUb0NoZWNrSGlkZGVuID0gWydSUFRfRWxlbV9VbmlxdWVJZCddXG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGVBdEluZGV4KGVsZSwgaW5kZXgpIHtcbiAgICAgICAgbGV0IGF0dHJOYW1lID0gZWxlLmF0dHJpYnV0ZXNbaW5kZXhdLm5hbWU7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2ludHJvc3RhdGVzXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzID0ge1xuICAgICAgICBcImFsZXJ0XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwiYXNzZXJ0aXZlXCIsXG4gICAgICAgICAgICBcImFyaWEtYXRvbWljXCI6IFwidHJ1ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29tYm9ib3hcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibGlzdGJveFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGlzdGJveFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibG9nXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwicG9saXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51YmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1ldGVyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBcIjEwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBcImZhbHNlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwcm9ncmVzc2JhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNjcm9sbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXBhcmF0b3JcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzbGlkZXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGluYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIGhvdyB0byBlbmNvZGUgbWluL21heCAob3Igbm93IGluIDEuMiAtIFwiaGFzIG5vIHZhbHVlXCIpXG4gICAgICAgICAgICAvL1wiYXJpYS12YWx1ZW5vd1wiOiBcIjBcIiBUT0RPOiBhdCByaXNrOiBtYXliZSBkZWxldGUgYWZ0ZXIgQVJJQSAxLjIgcmVhY2hlcyBwcm9wb3NlZCByZWNcbiAgICAgICAgICAgIC8vIFByb2JhYmx5IGp1c3QgZGVsZXRlIHNwaW5idXR0b24gZnJvbSB0aGlzIGxpc3QgY29tcGxldGVseSBhbmQgbGV0IHVzZXIgYWdlbnRzIGhhbmRsZSBcImRlZmF1bHRzXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdGF0dXNcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIixcbiAgICAgICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJ0cnVlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IFwiZmFsc2VcIlxuICAgICAgICB9LFxuICAgICAgICBcInRhYmxpc3RcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidG9vbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0cmVlXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2FyaWEtYXRvbWljXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlR2xvYmFsRGVmYXVsdHMgPSB7XG4gICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IFwibm9uZVwiLFxuICAgICAgICBcImFyaWEtYnVzeVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWN1cnJlbnRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZHJvcGVmZmVjdFwiOiBcIm5vbmVcIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWdyYWJiZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWludmFsaWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiBcIm9mZlwiLFxuICAgICAgICBcImFyaWEtbW9kYWxcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1wcmVzc2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IFwiZmFsc2VcIixcbiAgICAgICAgLy9cImFyaWEtcmVsZXZhbnRcIjogXCJhZGRpdGlvbnMgdGV4dFwiLCBUT0RPOiBhcmUgbXVsdGlwbGUgdmFsdWVzIHN1cHBvcnRlZD9cbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXNvcnRcIjogXCJub25lXCJcbiAgICB9XG5cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNodG1sLWF0dHJpYnV0ZS1zdGF0ZS1hbmQtcHJvcGVydHktbWFwcGluZ3NcbiAgICBwdWJsaWMgc3RhdGljIGFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzID0ge1xuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIFwiZm9ybVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1lbnVpdGVtXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIipcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJpbmRldGVybWluYXRlXCIpKSByZXR1cm4gXCJtaXhlZFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmllbGRzZXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm9wdGdyb3VwXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3B0aW9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiB7XG4gICAgICAgICAgICBcImRldGFpbHNcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkaWFsb2dcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjoge1xuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSkgcmV0dXJuIFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgYXJpYSBhdHRyaWJ1dGUgbmFtZSBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZW0pIHtcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZXMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUgZnJvbSBkb21cbiAgICAgKiBAcGFyYW0gZWxlICBlbGVtZW50XG4gICAgICogQHJldHVybnMgdXNlciBkZWZpbmVkIGh0bWwgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRIdG1sQXR0cmlidXRlcyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgaXNBcmlhID0gYXR0ck5hbWUuc3Vic3RyaW5nKDAsIDUpID09PSAnYXJpYS0nO1xuICAgICAgICAgICAgICAgIGlmICghaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlcy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgYXJpYSBhdHRyaWJ1dGUgbmFtZS12YWx1ZSBwYWlyIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBhcmlhIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pIHtcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gJycpIGF0dHJWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGlzQXJpYSA9IGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJztcbiAgICAgICAgICAgICAgICBpZiAoaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlcy5wdXNoKHsgbmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgaHRtbCBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEh0bWxBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FyaWEpXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzLnB1c2goeyBuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBpbXBsaWNpdCBhcmlhIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZSwgYW4gaW5wdXQgd2l0aCBjaGVja2VkIGlzIGVxdWl2YWxlbnQgdG8gYXJpYS1jaGVja2VkPVwidHJ1ZVwiXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhQXR0cmlidXRlKGVsZSwgYXR0cmlidXRlTmFtZSkge1xuICAgICAgICAvLyBJZiB0aGUgYXR0cmlidXRlIGlzIGRlZmluZWQsIGl0IHRha2VzIHByZWNlZGVuY2VcbiAgICAgICAgbGV0IHJldFZhbCA9IGVsZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgICAgaWYgKGVsZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgJiYgcmV0VmFsLnRyaW0oKSA9PT0gXCJcIikgeyAvL1wiXCIgaXMgdHJlYXRlZCBhcyBmYWxzZSwgc28gd2UgbmVlZCByZXR1cm4gaXQgYmVmb3JlIHRoZSBiZWxvdyBjaGVja1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGVuIGRldGVybWluZSBpbXBsaWNpdCB2YWx1ZXMgZnJvbSBvdGhlciBhdHRyaWJ1dGVzXG4gICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICBsZXQgdGFnID0gZWxlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5ncykge1xuICAgICAgICAgICAgICAgIGlmICh0YWcgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV1bdGFnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocmV0VmFsKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCIqXCIgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV1bXCIqXCJdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgcm9sZS1iYXNlZCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChyb2xlIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVSb2xlRGVmYXVsdHMgJiYgYXR0cmlidXRlTmFtZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZVJvbGVEZWZhdWx0c1tyb2xlXVthdHRyaWJ1dGVOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RpbGwgbm90IGRlZmluZWQ/IENoZWNrIGdsb2JhbCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBhdHRyaWJ1dGVOYW1lIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVHbG9iYWxEZWZhdWx0cykge1xuICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUdsb2JhbERlZmF1bHRzW2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpIHtcbiAgICAgICAgbGV0IGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykge1xuICAgICAgICAgICAgLy8gVXNlciBhZ2VudHMgU0hPVUxEIHRyZWF0IHN0YXRlIGFuZCBwcm9wZXJ0eSBhdHRyaWJ1dGVzIHdpdGggYSB2YWx1ZSBvZiBcIlwiIHRoZSBzYW1lIGFzIHRoZXkgdHJlYXQgYW4gYWJzZW50IGF0dHJpYnV0ZS5cbiAgICAgICAgICAgIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpICYmIGVsZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV0FJLUFSSUHigJlzIHJvbGUgYXR0cmlidXRlIG1heSBoYXZlIGEgbGlzdCBvZiB2YWx1ZXMsIGJ1dCBvbmx5IHRoZSBmaXJzdCB2YWxpZCBhbmQgc3VwcG9ydGVkIFdBSS1BUklBIHJvbGUgaXMgdXNlZFxuICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS1pbXBsZW1lbnRhdGlvbi8jbWFwcGluZ19yb2xlX3RhYmxlXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZyB0aGUgcmVzb2xlZCByb2xlIGZvciBhbiBlbGVtZW50LlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiBzdHJpbmcgLSByZXNvbHZlZCByb2xlIGZvciB0aGUgZWxlbWVudDpcbiAgICAgKiAgICAgICBleHBsaWNpdCByb2xlOiByZXNvbGVkIGZyb20gdGhlIGxpc3Qgb2YgdmFsdWVzXG4gICAgICogICAgICAgaW1wbGljaXQgcm9sZTogaWYgbm90IGV4cGxpY2l0ZWx5IHNwZWNpZmllZCwgb3Igbm9uZSBvZiB0aGUgc3BlY2lmaWVkIHJvbGUgdmFsdWVzIGlzIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50XG4gICAgICogICAgICAgbnVsbDogaWYgbm9uZSBvZiB0aGUgc3BlY2lmaWVkIHJvbGUgdmFsdWVzIGlzIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50LCBuZWl0aGVyIGltcGxpY2l0IHJvbGUgZXhpc3RzXG4gICAgICogICAgICAgXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZXNvbHZlZFJvbGUoZWxlbTogRWxlbWVudCwgY29uc2lkZXJJbXBsaWNpdFJvbGVzOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByb2xlID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiUlBUVVRJTF9FTEVNRU5UX1JFU09MVkVEX1JPTEVcIiwgbnVsbCk7XG4gICAgICAgIGlmIChyb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMoZWxlbSk7IFxuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShlbGVtKTtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkUm9sZXMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYVJvbGVzKGVsZW0sIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgIGxldCBjb250YWluc0dlbmVyaWMgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwICYmIGFsbG93ZWRSb2xlcyAmJiBhbGxvd2VkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRSb2xlcy5pbmNsdWRlcyhcImFueVwiKSB8fCBhbGxvd2VkUm9sZXMuaW5jbHVkZXMocm9sZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFJvbGVzLmluY2x1ZGVzKFwiYW55XCIpICYmIHJvbGVzW2ldID09PSAnZ2VuZXJpYycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc0dlbmVyaWMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlID0gcm9sZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCByb2xlID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaXMgZm9jdXNhYmxlLCB0aGVuIHByZXNlbnRhdGlvbiByb2xlcyBhcmUgdG8gYmUgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzZXQgcnVsZSB0byBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNHZW5lcmljKSByb2xlID0gJ2dlbmVyaWMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gbnVsbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgcm9sZSA9IGltcGxpY2l0Um9sZSAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCA/IGltcGxpY2l0Um9sZVswXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlJQVFVUSUxfRUxFTUVOVF9SRVNPTFZFRF9ST0xFXCIsIHJvbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb2xlICE9PSB1bmRlZmluZWQgPyByb2xlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXRyaWV2aW5nIHVzZXIgZGVmaW5lZCBlbGVtZW50J3Mgcm9sZXMgZnJvbSBkb20uXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByb2xlcyAtIGxpc3Qgb2YgdXNlciBkZWZpbmVkIHJvbGVzIGluIHRoZSBlbGVtZW50IHJvbGUgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZFJvbGVzKGVsZTogRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldFJvbGVzKGVsZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgZWxlbWVudCdzIHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBmaW5kcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcm9sZXMgLSBsaXN0IG9mIGF0dHJpYnV0ZSByb2xlcyBhbmQgaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJvbGVzKGVsZTogRWxlbWVudCwgY29uc2lkZXJJbXBsaWNpdFJvbGVzOiBib29sZWFuKTogc3RyaW5nW10ge1xuICAgICAgICBsZXQgcm9sZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChlbGUgJiYgZWxlLmhhc0F0dHJpYnV0ZSAmJiBlbGUuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJSb2xlcyA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcm9sZXMucHVzaChhdHRyUm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdFJvbGUgIT09IG51bGwgJiYgaW1wbGljaXRSb2xlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvL2FkZCBpbXBsaWNpdCByb2xlcyB0byB0aGUgYXR0cmlidXRlcyByb2xlcy5cbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoaW1wbGljaXRSb2xlLCByb2xlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbWVudFxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGUgaW1wbGljaXQgcm9sZSBvciBbXSBpZiBkb2Vzbid0IGV4aXN0XG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEltcGxpY2l0Um9sZShlbGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICghZWxlIHx8IGVsZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBpbXBsaWNpdFJvbGVzOiBzdHJpbmdbXSA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkoZWxlKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmluY2x1ZGVzKFwiZ2VuZXJpY1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgJ2dlbmVyaWMnIHJvbGUgaXMgb25seSBhbGxvd2VkIGlmIGEgdmFsaWQgYXJpYSBhdHRyaWJ1dGUgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9tQXJpYUF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21BcmlhQXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbJ2dlbmVyaWMnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4ucmVxUHJvcHMgJiYgcGF0dGVybi5yZXFQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHBhdHRlcm4ucmVxUHJvcHMsIHJvbGVBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZClcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChBUklBRGVmaW5pdGlvbnMuZ2xvYmFsUHJvcGVydGllcywgcm9sZUF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcyAmJiBwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHBhdHRlcm4uZGVwcmVjYXRlZFByb3BzLCByb2xlQXR0cmlidXRlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlICdnZW5lcmljJyByb2xlIGlmIHJvbGVBdHRyaWJ1dGVzIGRvZXNuJ3QgY29udGFpbiBhbnkgb2YgZG9tQXJpYUF0dHJpYnV0ZXMgXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlQXR0cmlidXRlcy5sZW5ndGggPiAwICYmICFyb2xlQXR0cmlidXRlcy5zb21lKGF0dHIgPT4gZG9tQXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoYXR0cikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXQgPSBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoWydnZW5lcmljJ10sIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlLCBcIkFyaWFVdGlsX0ltcGxpY2l0Um9sZVwiLCBpbXBsaWNpdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1wbGljaXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZSwgXCJBcmlhVXRpbF9JbXBsaWNpdFJvbGVcIiwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZSwgXCJBcmlhVXRpbF9JbXBsaWNpdFJvbGVcIiwgW10pO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbXBsaWNpdFJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgb2YgdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlIC0gdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHByb3BlcnRpZXMgLSBsaXN0IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlLCBlbGUpIHtcbiAgICAgICAgaWYgKHJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSkge1xuICAgICAgICAgICAgbGV0IHJlcXVpcmVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yZXFQcm9wcztcbiAgICAgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2Ygc2VwYXJhdG9yXG4gICAgICAgICAgICBpZiAocm9sZS50b0xvd2VyQ2FzZSgpID09PSBcInNlcGFyYXRvclwiICYmIGVsZSAmJiBDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZSkpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiYXJpYS12YWx1ZW5vd1wiXSwgcmVxdWlyZWRBdHRyaWJ1dGVzIHx8IFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlZEF0dHJpYnV0ZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgaWYgYSBlbGVtZW50IGhhcyBnaXZlbiByb2xlLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlLlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byBmaW5kIGlmIGVsZW1lbnQgaGFzIHRoZXNlIHJvbGVzLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIHRoIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqXG4gICAgICogQ29uc2lkZXIgdG8gdXNlIGhhc1JvbGVJblNlbWFudGljcygpIGluc3RlYWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNSb2xlKGVsZSwgcm9sZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykgeyAgLy9Db25zaWRlciB0byB1c2UgaGFzUm9sZUluU2VtYW50aWNzKCkgaW5zdGVhZC5cbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vaWYgbm9uZSBvZiB0aGUgdGhlIGF0dHJpYnV0ZSByb2xlcyBtYXRjaGVkIHdpdGggZ2l2ZW4gcm9sZVxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIG1hdGNoZXMuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB3Um9sZXMgPSBbXTtcbiAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZSA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpbXBsaWNpdFJvbGUsIHdSb2xlcyk7XG4gICAgICAgICAgICAgICAgLy9pZiByb2xlIGlzIGFycmF5IGxvb3AgdGhydSBhbmQgc2VlIGlmIGFueSAgb2YgdGhlIGltcGxpY2l0IHJvbGUgcHJlc2VudCBpbiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCB3Um9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHdSb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gd1JvbGVzW2ldID09PSByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgcm9sZSwgaW5jbHVkaW5nIHRoZSBpbXBsaWVkIHJvbGUgaWYgcm9sZSBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlcGxhY2luZyB0aGUgaGFzUm9sZSBmdW5jdGlvblxuICAgICAqXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICogQHBhcm0ge2xpc3Qgb3Igc3RyaW5nfSByb2xlcyAtIExpc3Qgb3Igc2luZ2xlIHJvbGUgZm9yIHdoaWNoIHRvIGZpbmQgaWYgZWxlbWVudCBoYXMgdGhlc2Ugcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc1JvbGVJblNlbWFudGljcyhlbGUsIHJvbGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBsZXQgcm9sZVNwZWNpZmllZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gaW4gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVTcGVjaWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSA9PT0gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm9sZVNwZWNpZmllZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgaW1wbGljaXQgcm9sZXMgbWF0Y2hlcy5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICBsZXQgaW1wUm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgaWYgKGltcFJvbGVzICE9PSBudWxsICYmIGltcFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vaWYgcm9sZSBpcyBhcnJheSBsb29wIHRocnUgYW5kIHNlZSBpZiBhbnkgIG9mIHRoZSBpbXBsaWNpdCByb2xlIHByZXNlbnQgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IGltcFJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGltcFJvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgaW1wUm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gaW1wUm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBpZiBhIGVsZW1lbnQgaGFzIGdpdmVuIHJvbGUuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIHNwZWNpZmllZCByb2xlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNBbnlSb2xlKGVsZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZSAmJiBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICByZXRWYWwgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmICghcmV0VmFsICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgaW1wUm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBSb2xlcyAhPT0gbnVsbCAmJiBpbXBSb2xlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldFZhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc2VudGF0aW9uYWxFbGVtZW50KG5vZGUpIHtcbiAgICAgICAgLy8gRWxlbWVudHMgZXh0cmFjdGVkIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50I0lubGluZV90ZXh0X3NlbWFudGljcyxcbiAgICAgICAgLy8gaHR0cDovL2Rldi53My5vcmcvaHRtbDUvaHRtbC1hdXRob3IvI3RleHQtbGV2ZWwtc2VtYW50aWNzIGFuZCBodHRwczovL3dpa2kud2hhdHdnLm9yZy93aWtpL1ByZXNlbnRhdGlvbmFsX2VsZW1lbnRzX2FuZF9hdHRyaWJ1dGVzXG4gICAgICAgIGxldCBwcmVzZW50YXRpb25hbEVsZW1lbnRzID0gW1wiYWJiclwiLCBcImJcIiwgXCJiZGlcIiwgXCJiZG9cIiwgXCJiclwiLCBcImNpdGVcIiwgXCJjb2RlXCIsIFwiZGF0YVwiLCBcImRmblwiLFxuICAgICAgICAgICAgXCJlbVwiLCBcImlcIiwgXCJrYmRcIiwgXCJtYXJrXCIsIFwicVwiLCBcInJwXCIsIFwicnRcIiwgXCJydGNcIiwgXCJydWJ5XCIsIFwic1wiLFxuICAgICAgICAgICAgXCJzYW1wXCIsIFwic21hbGxcIiwgXCJzcGFuXCIsIFwic3Ryb25nXCIsIFwic3ViXCIsIFwic3VwXCIsIFwidGltZVwiLCBcInVcIixcbiAgICAgICAgICAgIFwidmFyXCIsIFwid2JyXCIsIFwiYVwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJiYXNlZm9udFwiLCBcImJpZ1wiLCBcImNlbnRlclwiLFxuICAgICAgICAgICAgXCJzdHJpa2VcIiwgXCJ0dFwiLCBcImZvbnRcIiwgXCJibGlua1wiLCBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIiwgXCJoNlwiLFxuICAgICAgICAgICAgXCJoclwiLCBcImJsb2NrcXVvdGVcIiwgXCJwXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHByZXNlbnRhdGlvbmFsRWxlbWVudHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGVsZW1lbnQgYW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSBUaGUgcm9sZSB0byBzZWFyY2ggZm9yIG9uIGFuIGVsZW1lbnQgdW5kZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGUoZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlTmFtZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50IGFuZCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge2FycmF5fSByb2xlcyAtIHRoZSByb2xlIG5hbWVzIHRvIHNlYXJjaCBmb3JcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGVzKGVsZW1lbnQsIHJvbGVOYW1lcykge1xuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgIXJvbGVOYW1lcyB8fCAhcm9sZU5hbWVzLmxlbmd0aCB8fCByb2xlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZSh3YWxrTm9kZSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcm9sZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVzLmluY2x1ZGVzKHJvbGUpIHx8XG4gICAgICAgICAgICAgICAgICAgIChyb2xlTmFtZXMuaW5jbHVkZXMoXCIqXCIpICYmICFbXCJwcmVzZW50YXRpb25cIiwgXCJub25lXCJdLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcm9sZXMgd2l0aCBnaXZlbiByb2xlIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHthcnJheX0gcm9sZVR5cGxlcyAtIHJvbGUgdHlwZXMsIHN1Y2ggYXMgJ3dpZGdldCcsICdzdHJ1Y3R1cmUnIGV0Yy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2FycmF5fSByb2xlcyAtIEEgcGFyZW50IG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXNXaXRoVHlwZXMoZWxlbWVudCwgdHlwZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhdHlwZXMgfHwgIXR5cGVzLmxlbmd0aCB8fCB0eXBlcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByb2xlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwicm9sZXNfd2l0aF9naXZlbl90eXBlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlcy5pbmNsdWRlcyh2YWx1ZS5yb2xlVHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIHJvbGVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJyb2xlc193aXRoX2dpdmVuX3R5cGVzXCIsIHJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSByb2xlcyB3aXRoIGdpdmVuIHJvbGUgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge2FycmF5fSByb2xlVHlwbGVzIC0gcm9sZSB0eXBlcywgc3VjaCBhcyAnd2lkZ2V0JywgJ3N0cnVjdHVyZScgZXRjLlxuICAgICAqXG4gICAgICogQHJldHVybiB7YXJyYXl9IHJvbGVzIC0gQSBwYXJlbnQgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1dpZGdldChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHdpZGdldCA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiaXNfZWxlbWVudF93aWRnZXRcIiwgbnVsbCk7XG4gICAgICAgIGlmICh3aWRnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7IFxuICAgICAgICAgICAgaWYgKHJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yb2xlVHlwZSA9PT0gJ3dpZGdldCcpXG4gICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJpc19lbGVtZW50X3dpZGdldFwiLCByZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2lkZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBpZiB0aGUgZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudC4gXG4gICAgICogSWYgYW4gYW5jZXN0b3Igb2YgYW4gZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgdGhlbiB0aGUgZWxlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYXMgb3duZWQgb3IgY29udHJvbGxlZC5cbiAgICAgKiBhbiBlbGVtZW50IGNhbiBiZSBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCB0aHJvdWdoIGFyaWEtb3ducyBvciBhcmlhLWNvbnRyb2xzXG4gICAgICogICB3aGVuIHRoZSBET00gaGllcmFyY2h5IGNhbm5vdCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcmVsYXRpb25zaGlwLlxuICAgICAqIGFyaWEtb3ducyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgY29udGV4dHVhbCByZWxhdGlvbnNoaXAgd2l0aCBhIG93bmluZyBwYXJlbnQgXG4gICAgICogYXJpYS1jb250cm9scyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYW4gZWxlbWVudCB3aXRoIHRoZSBjb250cm9sbGluZyBlbGVtZW50LlxuICAgICAqICBleGFtcGxlIGVsZW1lbnRzIHdpdGggcm9sZXM6IGNvbWJvYm94LCBzY3JvbGxiYXIsIHRhYiwgYnV0dG9uLCBsaXN0Ym94LCBtZW51LCBtZW51YmFyLCByYWRpb2dyb3VwLCB0cmVlLCB0cmVlZ3JpZFxuICAgICAqIFxuICAgICAqIHdoZW4gYW4gZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgaXRzIG5hdmlnYXRpb24gbWF5IGJlIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmVudCBcbiAgICAgKiAgdGhyb3VnaCBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRzIGF0dHJpYnV0ZSBvciByb3ZpbmcgdGFiaW5kZXhcbiAgICAgKiBcbiAgICAgKiBOb3RlIG5hdmlnYXRpb24gd2l0aCBuYXRpdmUgY29tYm9ib3ggKGlucHV0IHdpdGggYSBkYXRhbGlzdCkgaXMgaW4gbmF0aXZlIGZvY3VzIG5hdmlnYXRpb24sIG5vdCBjb25zaWRlcmVkIGhlcmUgICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGluc3BlY3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQoZWxlbWVudCA6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBsZXQgb3duZXJFbGVtczogRWxlbWVudFtdID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJBcmlhVXRpbF9OYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWRcIiwgbnVsbCk7XG4gICAgICAgIGlmIChvd25lckVsZW1zICE9PSBudWxsICYmIG93bmVyRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgb3duZXJFbGVtcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7XG4gICAgICAgIGlmICghcm9sZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKCFpZCB8fCBpZC50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHN+PScke2lkfSddLCAqW2FyaWEtb3duc349JyR7aWR9J11gKTtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY29udGFpbmVycyA9IFsnY29tYm9ib3gnLCAnc2Nyb2xsYmFyJywgJ2J1dHRvbicsICd0YWInLCAnbGlzdGJveCcsICdtZW51JywgJ21lbnViYXInLCAncmFkaW9ncm91cCcsICd0cmVlJywgJ3RyZWVncmlkJ107XG4gICAgICAgIGlmIChjb250YWluZXJzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICBpZiAob3duZXJFbGVtcyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBvd25lckVsZW1zID0gW107XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIG93bmVyRWxlbXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiQXJpYVV0aWxfTmF2aWdhdGlvbk93bmVkT3JDb250cm9sbGVkXCIsIG93bmVyRWxlbXMpOyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gICAgXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIG5vZGUgd2hpY2ggbWF0Y2hlcyB0aGUgcm9sZSBhbmQgaXMgYSBzaWJsaW5nIG9mIHRoZVxuICAgICAqIHByb3ZpZGVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGJ5IGRlZmF1bHQgd2lsbCBub3QgY29uc2lkZXIgQ2hlY2sgSGlkZGVuIFNldHRpbmcgYXQgYWxsLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldFNpYmxpbmdXaXRoUm9sZUhpZGRlblxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgc2libGluZyBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHNpYmxpbmcgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaWJsaW5nV2l0aFJvbGUoZWxlbWVudCwgcm9sZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbm9kZSB3aGljaCBtYXRjaGVzIHRoZSByb2xlIGFuZCBpcyBhIHNpYmxpbmcgb2YgdGhlXG4gICAgICogcHJvdmlkZWQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMgaW1wbGljaXQgcm9sZXMgZm9yIHRoZSBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgc2libGluZyBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0IC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBJbXBsaWNpdCByb2xlcyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IHdhbGtOb2RlIC0gQSBzaWJsaW5nIG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGU/KSB7XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGFyYXRpb25cbiAgICAgICAgbGV0IHdhbGtOb2RlID0gbnVsbDtcbiAgICAgICAgbGV0IGhhc1JvbGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGlmIGVsZW1lbnQgYW5kIHJvbGUgYXJlIGJvdGggcHJvdmlkZWRcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgcm9sZSkge1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIG5leHQgc2libGluZyBlbGVtZW50XG4gICAgICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyBvdmVyIHRoZSBuZXh0IHNpYmxpbmdzIHRvIGZpbmQgZWxlbWVudCB3aGljaCBtYXRjaGVzXG4gICAgICAgICAgICAvLyB0aGUgcHJvdmlkZWQgcm9sZS5cbiAgICAgICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCAmJiAhaGFzUm9sZSkge1xuXG4gICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIGhhcyB0aGUgcm9sZSB0aGF0IHdlIG5lZWQgdG8gY2hlY2sgZXhpc3RzXG4gICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBub3QgZm91bmQgYSBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgcm9sZSwgc3RhcnQgYSByZXZlcnNlIGxvb2sgdXBcbiAgICAgICAgICAgIGlmICghd2Fsa05vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBGZXRjaCB0aGUgcHJldmlvdXMgU2libGluZyBvZiB0aGlzIGVsZW1lbnRcbiAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgLy8gS2VlcCBsb29waW5nIG92ZXIgYWxsIHRoZSBwcmV2aW91cyBzaWJsaW5ncyB0byBzZWFyY2ggZm9yIGFuIGVsZW1lbnQgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyBtYXRjaGVzIHRoZSBwcm92aWRlZCByb2xlLlxuICAgICAgICAgICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCAmJiAhaGFzUm9sZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLnByZXZpb3VzU2libGluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSByb2xlIHRoYXQgd2UgbmVlZCB0byBjaGVjayBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaGFzUm9sZSA9IEFyaWFVdGlsLmhhc1JvbGUod2Fsa05vZGUsIHJvbGUsIGNvbnNpZGVySW1wbGljaXRSb2xlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYSBkZXNjZW5kYW50IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXREZXNjZW5kYW50V2l0aFJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gcGFyZW50IGVsZW1lbnQgZm9yIHdoaWNoIHdlIHdpbGwgYmUgY2hlY2tpbmcgZGVzY2VuZGFudHMgZm9yXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgZGVzY2VuZGFudCdzIGVsZW1lbnRzXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSByb2xlIHNwZWNpZmllZCAob25seSBvbmUpXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0RGVzY2VuZGFudFdpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGVOYW1lLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhIGRlc2NlbmRhbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9sZSwgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGRlc2NlbmRhbnQncyBlbGVtZW50c1xuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSByb2xlIHNwZWNpZmllZCAob25seSBvbmUpXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50ID0gbnVsbDtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHByb3ZpZGVkIGFuZCBjaGVjayBpZiB0aGUgcm9sZW5hbWUgcHJvdmlkZWQgZXhpc3RzXG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCAmJiBudy5ub2RlICE9IGVsZW1lbnQubmV4dFNpYmxpbmcpIHtcblxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMgPyBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mobncubm9kZSwgcm9sZU5hbWUpIDogQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCByb2xlTmFtZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudCA9IG53Lm5vZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzY2VuZGFudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCByb2xlcywgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmdbXX0gcm9sZU5hbWVzIC0gVGhlIHJvbGVzIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50J3MgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZVtdfSAtIGFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHJvbGVzIHNwZWNpZmllZFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxEZXNjZW5kYW50c1dpdGhSb2xlcyhlbGVtZW50LCByb2xlTmFtZXM6IHN0cmluZ1tdLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICBpZiAoIXJvbGVOYW1lcyB8fCByb2xlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IFtdO1xuXG4gICAgICAgIHJvbGVOYW1lcy5mb3JFYWNoKHJvbGVOYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBraWRzID0gQXJpYVV0aWwuZ2V0QWxsRGVzY2VuZGFudHNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpO1xuICAgICAgICAgICAgaWYgKGtpZHMgJiYga2lkcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzID0gZGVzY2VuZGFudHMuY29uY2F0KGtpZHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgQWxsIGRlc2NlbmRhbnQgZWxlbWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBkZXNjZW5kYW50cyBmb3JcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlTmFtZSAtIFRoZSByb2xlIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50J3MgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZVtdfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHJvbGUgc3BlY2lmaWVkXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbERlc2NlbmRhbnRzV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWU6IHN0cmluZywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IGRlc2NlbmRhbnRzID0gW107XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgZWxlbWVudCBwcm92aWRlZCBhbmQgY2hlY2sgaWYgdGhlIHJvbGVuYW1lIHByb3ZpZGVkIGV4aXN0c1xuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKG53Lm5vZGUsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChudy5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkaXJlY3QgY2hpbGRyZW4gaW4gQVQgdHJlZSB3aXRoIGEgcm9sZSAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlIHRoYXQgaGFzIGEgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREaXJlY3RBVENoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlcyA9IEFyaWFVdGlsLmdldFJlcXVpcmVkQ2hpbGRSb2xlcyhlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgbGV0IGRpcmVjdDogQXJyYXk8SFRNTEVsZW1lbnQ+ID0gW107XG4gICAgICAgIEFyaWFVdGlsLnJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdCk7XG4gICAgICAgIHJldHVybiBkaXJlY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVjdXJzaXZlbHkgYW55IGNoaWxkIHBhdGggdGlsbCBlaXRoZXIgbm8gY2hpbGQgb3IgYSBjaGlsZCB3aXRoIGEgcm9sZSBpcyBmb3VuZCAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdDogQXJyYXk8SFRNTEVsZW1lbnQ+KSB7XG4gICAgICAgIGxldCBjaGlsZHJlbjogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbiAhPT0gbnVsbCAmJiBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goZWxlbWVudC5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgXCJhcmlhLW93blwiIGF0dHJpYnV0ZSwgdGhlbiB0aGUgYXJpYS1vd25lZCBjaGlsZHJlbiBuZWVkIHRvIGJlIGluY2x1ZGVkIHRvb1xuICAgICAgICBsZXQgb3duZWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcbiAgICAgICAgaWYgKG93bmVkKSB7XG4gICAgICAgICAgICBsZXQgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgIGxldCBvd25lZElkcyA9IG93bmVkLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bmVkSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lZEVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQob3duZWRJZHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3duZWRFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG93bmVkRWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvL2lnbm9yZSBoaWRkZW4gYW5kIGludmlzaWJsZSBjaGlsZFxuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjaGlsZHJlbltpXSkgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGNoaWxkcmVuW2ldLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzID09PSBudWxsIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy9yZW1vdmUgJ25vbmUnIGFuZCAncHJlc2VudGF0aW9uJ1xuICAgICAgICAgICAgICAgICAgICByb2xlcyA9IHJvbGVzLmZpbHRlcihmdW5jdGlvbiAocm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGUgIT09IFwibm9uZVwiICYmIHJvbGUgIT09IFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSAnZ3JvdXAnIHJvbGUgaXMgYWxsb3dlZCBidXQgbm90IHJlcXVpcmVkIGZvciBzb21lIGVsZW1lbnRzIHNvIHJlbW92ZSBpdCBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVzLmluY2x1ZGVzKFwiZ3JvdXBcIikgJiYgcmVxdWlyZWRDaGlsZFJvbGVzICYmIHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmNsdWRlcygnZ3JvdXAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSByb2xlcy5maWx0ZXIoZnVuY3Rpb24gKHJvbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9sZSAhPT0gJ2dyb3VwJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0LnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZSB1bnRpbCBnZXQgYSByZXR1cm4gdmFsdWUsIFxuICAgICAgICAgICAgICAgICAgICBBcmlhVXRpbC5yZXRyaWV2ZURpcmVjdEFUQ2hpbGRyZW4oY2hpbGRyZW5baV0sIHJlcXVpcmVkQ2hpbGRSb2xlcywgZGlyZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBvciByZXF1aXJlZCBjaGlsZCByb2xlcyBmb3IgYSBnaXZlbiBlbGVtZW50IHdpdGggb25lIG1vcmUgcm9sZXMsXG4gICAgICogcmV0dXJuIG51bGwgaWYgdGhlIHJvbGUgaXMgJ25vbmUnIG9yICdwcmVzZW50YXRpb24nXG4gICAgICogQHBhcmFtIGVsZW1lbnQgXG4gICAgICogQHBhcmFtIGluY2x1ZGVJbXBsaWNpdCBpbmNsdWRlIGltcGxpY2l0IHJvbGVzIGlmIG5vIHJvbGUgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKGVsZW1lbnQsIGluY2x1ZGVJbXBsaWNpdDogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICgoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgJiYgaW5jbHVkZUltcGxpY2l0KSB7XG4gICAgICAgICAgICByb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGV4cGxpY2l0IG9yIGltcGxpY2l0IHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqICBcbiAgICAgICAgICogaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHIgPT4gcHJlc2VudGF0aW9uUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlczogc3RyaW5nW10gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0ucmVxQ2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZENoaWxkUm9sZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuLCByZXF1aXJlZENoaWxkUm9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1aXJlZENoaWxkUm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhbiBlbGVtZW50IHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgdGhlXG4gICAgICogcm9sZSB0aGF0IHdhcyBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXRBcmlhT3duc1dpdGhSb2xlSGlkZGVuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2sgZm9yIGFyaWEtb3duc1xuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGFyaWEtb3ducyBlbGVtZW50XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSBhcmlhLW93bnMgYW5kIGhhcyByb2xlIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXJpYU93bnNXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0QXJpYU93bnNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYW4gZWxlbWVudCByZWZlcmVuY2VkIGJ5IGFyaWEtb3ducyBhbmQgaGFzIHRoZVxuICAgICAqIHJvbGUgdGhhdCB3YXMgc3BlY2lmaWVkLiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgZWxlbWVudHMgd2l0aCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVjayBmb3IgYXJpYS1vd25zXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgYXJpYS1vd25zIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgcm9sZSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFyaWFPd25zV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykge1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgcmVmZXJlbmNlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgICBsZXQgcmVmZXJlbmNlZEVsZW1IYXNSb2xlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYXJpYS1vd25zIGlzIG5vdCBvbiB0aGUgZWxlbWVudCBqdXN0IGJyZWFrIG91dCBvZiB0aGlzIGZ1bmN0aW9uIHdpdGggbnVsbFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtb3duc1wiKSkge1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHJlZmVyZW5jZSBJRFxuICAgICAgICAgICAgbGV0IHJlZmVyZW5jZUlEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIik7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgZWxlbWVudCBmb3IgdGhlIHJlZmVyZW5jZSBJRFxuICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtZW50LCByZWZlcmVuY2VJRCk7XG4gICAgICAgICAgICAvL2lnbm9yZSBpZiB0aGUgYXJpYS1vd25zIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICAgICAgaWYgKERPTVV0aWwuc2FtZU5vZGUoZWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIHJlZmVyZW5jZWRFbGVtZW50ICE9IG51bGwgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHJlZmVyZW5jZWRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IEFyaWFVdGlsLmhhc1JvbGUocmVmZXJlbmNlZEVsZW1lbnQsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZlcmVuY2VkRWxlbUhhc1JvbGUgPyByZWZlcmVuY2VkRWxlbWVudCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIEFSSUEgbGFiZWxcbiAgICBwdWJsaWMgc3RhdGljIGhhc0FyaWFMYWJlbChlbGVtZW50KSB7XG5cbiAgICAgICAgLy8gUnB0X0FyaWFfVmFsaWRJZFJlZiBkZXRlcm1pbmVzIGlmIHRoZSBhcmlhLWxhYmVsbGVkYnkgaWQgcG9pbnRzIHRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhbiBhcnJheSBvZiBlbGVtZW50cywgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdW5pcXVlIEFSSUEgbGFiZWxzXG4gICAgcHVibGljIHN0YXRpYyBoYXNVbmlxdWVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgaXNHbG9iYWwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZG9jID0gZWxlbWVudHNbMF0ub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgdW5pcXVlQXJpYUxhYmVscyA9IG51bGw7XG5cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9IQVNfVU5JUVVFX0FSSUFfTEFCRUxTXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlxdWVBcmlhTGFiZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgIWhhc0R1cGxpY2F0ZUxhYmVscyAmJiBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXJpYUxhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGFyaWFMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW2FyaWFMYWJlbF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbE5vZGUsIGVsZW1lbnRzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSBub3JtYWxpemVkTGFiZWwgaW4gdW5pcXVlQXJpYUxhYmVscztcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVsc1tub3JtYWxpemVkTGFiZWxdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhcyBubyBsYWJlbCBhdCBhbGxcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0hBU19VTklRVUVfQVJJQV9MQUJFTFNcIiwgdW5pcXVlQXJpYUxhYmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFoYXNEdXBsaWNhdGVMYWJlbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRleHQgY29udGVudCBmcm9tIGFuIGVsZW1lbnQsIGV4Y2x1ZGluZyBzY3JpcHQgYW5kIHN0eWxlIGVsZW1lbnRzXG4gICAgICogVGhpcyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiB0aGF0IGRvZXNuJ3QgZ28gdGhyb3VnaCBmdWxsIGFjY2Vzc2libGUgbmFtZSBjb21wdXRhdGlvblxuICAgICAqIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB3aGVuIGNhbGxlZCBmcm9tIGdldEFyaWFMYWJlbFxuICAgICAqXG4gICAgICogTm90ZTogV2hlbiBhbiBlbGVtZW50IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1sYWJlbGxlZGJ5LCBpdHMgY29udGVudCBpcyBpbmNsdWRlZFxuICAgICAqIGV2ZW4gaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIChwZXIgQVJJQSBzcGVjKVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldFRleHRDb250ZW50RXhjbHVkaW5nU2NyaXB0cyhlbGVtOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gXCJcIjtcbiAgICAgICAgXG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGVsZW0gJiYgbncubm9kZSAhPT0gZWxlbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBudy5ub2RlO1xuICAgICAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogXCJcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2tpcCBzY3JpcHQgYW5kIHN0eWxlIGVsZW1lbnRzXG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdzY3JpcHQnIHx8IG5vZGVOYW1lID09PSAnc3R5bGUnKSB7XG4gICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7IC8vIFNraXAgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICAgICAgLy8gSW5jbHVkZSB0ZXh0IGV2ZW4gZnJvbSBoaWRkZW4gZWxlbWVudHMgd2hlbiByZWZlcmVuY2VkIGJ5IGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVWYWx1ZSAmJiBub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgbm9kZS5ub2RlVmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkgeyAvLyBFbGVtZW50IG5vZGVcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgaW1hZ2VzIC0gZ2V0IGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnaW1nJyAmJiAobm9kZSBhcyBFbGVtZW50KS5oYXNBdHRyaWJ1dGUoJ2FsdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyAobm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoJ2FsdCcpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7IC8vIFNraXAgY2hpbGRyZW4gb2YgaW1nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBpbnB1dCB3aXRoIHR5cGU9XCJpbWFnZVwiIC0gZ2V0IGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdpbWFnZScgJiYgKG5vZGUgYXMgRWxlbWVudCkuaGFzQXR0cmlidXRlKCdhbHQnKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdhbHQnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlOyAvLyBTa2lwIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdGV4dC50cmltKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhTGFiZWwoZWxlKSB7XG4gICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gbGFiZWxJRHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZSwgbGFiZWxJRCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbE5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxOb2RlLCBlbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugb3VyIGhlbHBlciB0byBnZXQgdGV4dCBjb250ZW50IHdpdGhvdXQgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gQXJpYVV0aWwuZ2V0VGV4dENvbnRlbnRFeGNsdWRpbmdTY3JpcHRzKGxhYmVsTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZExhYmVsLnRyaW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhRGVzY3JpcHRpb24oZWxlKSB7XG4gICAgICAgIGlmICghZWxlKSByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IG5vcm1hbGl6ZWRMYWJlbCA9IFwiXCI7XG4gICAgICAgIGxldCBkZXNjID0gZWxlLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGxhYmVsSURzID0gZGVzYy50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGxhYmVsSURzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZExhYmVsICs9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhsYWJlbCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZExhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVkTGFiZWwudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzYyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaXB0aW9uXCIpO1xuICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIGRlc2MudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbmRBcmlhTGFiZWxEdXBlcyhlbGVtZW50cykge1xuICAgICAgICBsZXQgZHVwZU1hcCA9IHt9XG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgZHVwZU1hcFtBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlKV0gPSAoZHVwZU1hcFtBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlKV0gfHwgMCkgKyAxO1xuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZHVwZU1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gYWNjZXNzaWJsZSBuYW1lcyBmb3IgYWxsIEFUIHZpc2libGUgbGFuZG1hcmsgZWxlbWVudHMgXG4gICAgICogQHBhcmFtIGRvYyBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhbmRtYXJrQWNjTmFtZXMoZG9jKSB7XG4gICAgICAgIGxldCBuYW1lTWFwID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9MYW5kbWFya19BY2NOYW1lc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKG5hbWVNYXAgJiYgbmFtZU1hcC5sZW5ndGggIT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIG5hbWVNYXA7XG5cbiAgICAgICAgbmFtZU1hcCA9IFtdO1xuICAgICAgICBsZXQgbGFuZG1hcmtFbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgJ2FzaWRlLFtyb2xlPVwiY29tcGxlbWVudGFyeVwiXSwgZm9vdGVyLFtyb2xlPVwiY29udGVudGluZm9cIl0sIGhlYWRlcixbcm9sZT1cImJhbm5lclwiXSwgbWFpbixbcm9sZT1cIm1haW5cIl0sIG5hdixbcm9sZT1cIm5hdmlnYXRpb25cIl0sIGZvcm0sW3JvbGU9XCJmb3JtXCJdLCBzZWN0aW9uLFtyb2xlPVwicmVnaW9uXCJdLCBhcnRpY2xlLFtyb2xlPVwiYXJ0aWNsZVwiXSwgW3JvbGU9XCJzZWFyY2hcIl0sW3JvbGU9XCJhcHBsaWNhdGlvblwiXSxbcm9sZT1cImRvY3VtZW50XCJdJ1xuICAgICAgICApO1xuXG4gICAgICAgIGlmIChsYW5kbWFya0VsZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJBcmlhVXRpbF9MYW5kbWFya19BY2NOYW1lc1wiLCBuYW1lTWFwKTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lTWFwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFuZG1hcmtFbGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtOiBFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgbm9kZSB0aGF0IGlzIEFUIGhpZGRlbiBvciBpbiBhIGRpYWxvZyB0aGF0IGlzIGNvbnNpZGVyZWQgYXMgYSBzZXBhcmF0ZSBsb2NhdGlvbiBmcm9tIHRoZSByZXN0IG9mIHRoZSBtYWluIHBhZ2VcbiAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkgJiYgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJESUFMT0dcIl0pID09PSBudWxsICYmIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZWxlbSwgXCJkaWFsb2dcIiwgdHJ1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhaXIubmFtZS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBuZWVzdGVkIGxhbmRtYXJrIHRvIGNhbGN1bGF0ZSB0aGUgYWNjZXNzaWJsZSBuYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JzID0gWy4uLmxhbmRtYXJrRWxlbXNdLmZpbHRlcigoZSkgPT4gZS5jb250YWlucyhlbGVtKSAmJiBlICE9PSBlbGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JzLmZvckVhY2goKGFuY2VzdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3Rvcl9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvcl9wYWlyICYmIGFuY2VzdG9yX3BhaXIubmFtZSAmJiBhbmNlc3Rvcl9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGFuY2VzdG9yX3BhaXIubmFtZS50cmltKCkgKyBcIiBcIiArIG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgIG5hbWVNYXAucHVzaCh7XCJlbGVtXCIgOiBlbGVtLCBcInJvbGVcIiA6IHJvbGUsIFwibmFtZVwiOiBuYW1lfSk7ICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0xhbmRtYXJrX0FjY05hbWVzXCIsIG5hbWVNYXApO1xuICAgICAgICByZXR1cm4gbmFtZU1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjaGVjayBpZiB0aGUgZ2l2ZW4gZWxlbWVudCB3aXRoIHRoZSBsYW5kbWFyayByb2x3IGlzIHVuaXF1ZVxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqIEBwYXJhbSByb2xlOiBhIHNwZWNpZmljIGxhbmRtYXJrIHJvbGUsIG9yIFwiYW55XCIgZm9yIGFsbCBsYW5kbWFyayByb2xlICBcbiAgICAgKiBAcGFyYW0gY29uc2lkZXJOb25lTGFiZWw6IGlmIGNvbnNpZGVyIHRoZSBsYW5kbWFya3Mgd2l0aG91dCBhIGxhYmVsXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0xhbmRtYXJrTmFtZVVuaXF1ZShlbGVtZW50LCByb2xlLCBjb25zaWRlck5vbmVMYWJlbDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IG5hbWVNYXAgPSBBcmlhVXRpbC5nZXRMYW5kbWFya0FjY05hbWVzKGVsZW1lbnQub3duZXJEb2N1bWVudCk7XG4gICAgICAgIGxldCBleGlzdCA9IG51bGw7XG4gICAgICAgIGlmIChyb2xlID09PSAnYW55JylcbiAgICAgICAgICAgIGV4aXN0ID0gbmFtZU1hcC5maW5kKGVudHJ5ID0+IGVudHJ5LmVsZW0gPT09IGVsZW1lbnQpOyAgICAgIFxuICAgICAgICBlbHNlICAgIFxuICAgICAgICAgICAgZXhpc3QgPSBuYW1lTWFwLmZpbmQoZW50cnkgPT4gZW50cnkuZWxlbSA9PT0gZWxlbWVudCAmJiBlbnRyeS5yb2xlID09PSByb2xlKTtcblxuICAgICAgICBpZiAoIWV4aXN0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBuYW1lID0gZXhpc3QubmFtZTtcbiAgICAgICAgaWYgKCFjb25zaWRlck5vbmVMYWJlbCAmJiBuYW1lID09PSAnJykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbmFtZU1hcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5hbWVNYXBbaV0uZWxlbSA9PT0gZWxlbWVudCkgY29udGludWU7ICAgICBcbiAgICAgICAgICAgIGlmIChuYW1lID09PSBuYW1lTWFwW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gJ2FueScpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVNYXBbaV0ucm9sZSA9PT0gcm9sZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IFxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgQVJJQSBsYWJlbHMgZ2xvYmFsbHlcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbHMoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmhhc1VuaXF1ZUFyaWFMYWJlbHNMb2NhbGx5KGVsZW1lbnRzLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhbiBhcnJheSBvZiBlbGVtZW50cywgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdW5pcXVlIEFSSUEgbGFiZWxzXG4gICAgcHVibGljIHN0YXRpYyBoYXNEdXBsaWNhdGVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgaXNHbG9iYWwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZG9jID0gZWxlbWVudHNbMF0ub3duZXJEb2N1bWVudDtcblxuICAgICAgICBsZXQgaGFzRHVwbGljYXRlTGFiZWxzID0gZmFsc2U7XG4gICAgICAgIGxldCB1bmlxdWVBcmlhTGFiZWxzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IG51bGw7XG4gICAgICAgIGxldCBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheSA9IG5ldyBBcnJheSgpO1xuXG4gICAgICAgIGlmIChpc0dsb2JhbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pcXVlQXJpYUxhYmVscyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhTGFiZWwgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gYXJpYUxhYmVsIGluIHVuaXF1ZUFyaWFMYWJlbHM7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHNbYXJpYUxhYmVsXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGFyaWFMYWJlbCBpbiBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5W2FyaWFMYWJlbF0gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVthcmlhTGFiZWxdLnB1c2goZWxlbWVudHNbaV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGxhYmVsSURzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGxhYmVsSURzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbE5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxOb2RlLCBlbGVtZW50c1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IG5vcm1hbGl6ZWRMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW25vcm1hbGl6ZWRMYWJlbF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShub3JtYWxpemVkTGFiZWwgaW4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVtub3JtYWxpemVkTGFiZWxdID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbbm9ybWFsaXplZExhYmVsXS5wdXNoKGVsZW1lbnRzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCB1bmlxdWVBcmlhTGFiZWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXk7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVscyBnbG9iYWxseVxuICAgIHB1YmxpYyBzdGF0aWMgaGFzRHVwbGljYXRlQXJpYUxhYmVscyhlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuaGFzRHVwbGljYXRlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZXNcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGVsZW1lbnRzKSB7XG5cbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgbGFiZWxSZWZzID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFoYXNEdXBsaWNhdGVMYWJlbHMgJiYgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihlbGVtZW50c1tpXSwgZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbFJlZiA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpO1xuICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGxhYmVsUmVmIGluIGxhYmVsUmVmcztcbiAgICAgICAgICAgICAgICBsYWJlbFJlZnNbbGFiZWxSZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWhhc0R1cGxpY2F0ZUxhYmVscztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXNvbHZpbmcgQVJJQSByZXF1aXJlbWVudHMgZm9yIGFuIEhUTUwgZWxlbWVudCBwZXIgQVJJQSBpbiBIVE1MXG4gICAgICogQHBhcmFtIHJ1bGVDb250ZXh0IHRoZSBIVE1MIGVsZW1lbnQgdG8gYmUgZXhhbWluZWRcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRhZ1Byb3BlcnR5OiBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50ID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0VsZW1lbnRBcmlhUHJvcGVydHlcIiwgbnVsbCk7XG4gICAgICAgIGlmICghdGFnUHJvcGVydHkpIHtcbiAgICAgICAgICAgIGxldCB0YWdOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBuYW1lID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdGFnUHJvcGVydHkgZXhpc3RzIGluIHRoZSBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgaGFzaC5cbiAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFt0YWdOYW1lXTtcblxuICAgICAgICAgICAgLy8gVGhlIHRhZyBuZWVkcyB0byBjaGVjayBzb21lIHNwZWNpYWwgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ID09PSBudWxsIHx8IHRhZ1Byb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbdGFnTmFtZV07XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7IC8vIHNwZWNpYWwgY2FzZXNcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1ocmVmXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIndpdGhvdXQtaHJlZlwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJlYVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ3aXRoLWhyZWZcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1ocmVmXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZjcyA9IENvbW1vblV0aWwuZ2V0Q2hpbGRCeVRhZyhydWxlQ29udGV4dCwgXCJmaWdjYXB0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmNzICE9PSBudWxsICYmIGZjcy5sZW5ndGggPiAwID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImNoaWxkLWZpZ2NhcHRpb25cIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tY2hpbGQtZmlnY2FwdGlvblwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmb290ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImhlYWRlclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiYXJ0aWNsZVwiLCB0cnVlKSAhPT0gbnVsbCB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcIm5hdmlnYXRpb25cIiwgdHJ1ZSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJyZWdpb25cIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJhcnRpY2xlXCIsIFwiYXNpZGVcIiwgXCJtYWluXCIsIFwibmF2XCIsIFwic2VjdGlvblwiXSkgIT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1zZWN0aW9uLWFydGljbGUtYXNpZGUtbWFpbi1uYXZcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoICE9PSAwIHx8IChhbHQgIT09IG51bGwgJiYgYWx0Lmxlbmd0aCA+IDApIHx8ICh0aXRsZSAhPT0gbnVsbCAmJiB0aXRsZS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWcgaGFzIG5vbi1lbXB0eSBhbHQgKGFsdD1cInNvbWUgdGV4dFwiIG9yIGFsdD1cIiAgXCIpIG9yIGFuIGFjY2Vzc2libGUgbmFtZSBpcyBwcm92aWRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aC1hY2NuYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWcgaGFzIGFuIGVtcHR5IGFsdCAoYWx0PVwiXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGhvdXQtYWNjbmFtZS1lbXB0eS1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGltZyBsYWNrcyBhbiBhbHQgYXR0cmlidXRlIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGhvdXQtYWNjbmFtZS1uby1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidHlwZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW3R5cGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSA9PT0gbnVsbCB8fCB0YWdQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLXByZXNzZWRcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hlY2tib3gtd2l0aC1hcmlhLXByZXNzZWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hlY2tib3gtd2l0aG91dC1hcmlhLXByZXNzZWRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZW1haWwtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImVtYWlsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VhcmNoXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInNlYXJjaC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wic2VhcmNoLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGVsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRlbC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGVsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInVybC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widXJsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVmYXVsdC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVmYXVsdC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHR5cGUgaXMgdGhlIHNhbWUgYXMgdHlwZT10ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxUYWdQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wibGlcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCwgXCJsaXN0XCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGlsZC1vZi1saXN0LXJvbGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLW9mLWxpc3Qtcm9sZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VjdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uYW1lID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGFiZWwgJiYgbGFiZWwudHJpbSgpLmxlbmd0aCA+IDApIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxUYWdQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wic2VsZWN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm11bHRpcGxlXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJzaXplXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNpemVcIikgPiAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJtdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJuby1tdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzdW1tYXJ5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVGFnUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcInN1bW1hcnlcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkZXRhaWxzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIERPTVV0aWwuc2FtZU5vZGUoWy4uLnJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtID0+IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKVswXSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJmaXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRib2R5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidHJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIsIHRydWUpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy10YWJsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJncmlkXCIsIHRydWUpIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLWdyaWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBDb21tb25VdGlsLmdldFNjb3BlRm9yVGgocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidGFibGVcIiwgdHJ1ZSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUgPT09ICdjb2x1bW4nKSB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLXRhYmxlLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtdGFibGUtcm93LXNjb3BlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImdyaWRcIiwgdHJ1ZSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJ0cmVlZ3JpZFwiLCB0cnVlKSAhPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlID09PSAnY29sdW1uJykgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRpdlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBydCA9IHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcnQgIT09IG51bGwgJiYgcHJ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkbCcgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hpbGQtZGxcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tY2hpbGQtZGxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wiZGVmYXVsdFwiXSBhcyBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50O1xuICAgICAgICAgICAgICAgIH0gLy9zd2l0Y2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiQXJpYVV0aWxfRWxlbWVudEFyaWFQcm9wZXJ0eVwiLCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgIHJldHVybiB0YWdQcm9wZXJ0eSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFSb2xlcyhydWxlQ29udGV4dCwgcHJvcGVydGllczogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCkge1xuICAgICAgICBsZXQgYWxsb3dlZFJvbGVzOiBzdHJpbmdbXSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJBcmlhVXRpbF9BbGxvd2VkQXJpYVJvbGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWFsbG93ZWRSb2xlcykge1xuICAgICAgICAgICAgYWxsb3dlZFJvbGVzID0gW107XG4gICAgICAgICAgICBsZXQgdGFnUHJvcGVydHk6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBwcm9wZXJ0aWVzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSwgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlcyAmJiBpbXBsaWNpdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0FsbG93ZWRBcmlhUm9sZXNcIiwgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZFJvbGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0LCByb2xlcywgcHJvcGVydGllcykge1xuICAgICAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0FsbG93ZWRBcmlhQXR0cmlidXRlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCBwZXJtaXR0ZWRSb2xlcyA9IFsuLi5yb2xlc107XG4gICAgICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgbGV0IHByb2hpYml0ZWRBdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICAvLyBFbGVtZW50IHdpdGggYSBkaXNhYmxlZCBhdHRyaWJ1dGUgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9kaXNhYmxlZC1lbGVtZW50cy5odG1sXG4gICAgICAgICAgICBpZiAoQVJJQURlZmluaXRpb25zLmVsZW1lbnRzQWxsb3dlZERpc2FibGVkLmluZGV4T2YodGFnTmFtZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgYXJpYS1kaXNhYmxlZCBhdHRyaWJ1dGUgb24gYW55IGVsZW1lbnQgdGhhdCBpcyBhbGxvd2VkIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgaW4gSFRNTDUuXG4gICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbShcImFyaWEtZGlzYWJsZWRcIiwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRWxlbWVudCB3aXRoIGEgcmVxdWlyZWQgYXR0cmlidXRlIGh0dHA6Ly93d3cudGhlLWFydC1vZi13ZWIuY29tL2h0bWwvaHRtbDUtZm9ybS12YWxpZGF0aW9uL1xuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWRSZXF1aXJlZC5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtcmVxdWlyZWQgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLXJlcXVpcmVkXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWRSZWFkT25seS5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtcmVhZG9ubHkgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgcmVhZG9ubHkgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLXJlYWRvbmx5XCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gcHJvcGVydGllcztcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgaW1wbGljaXQgcm9sZSBhbGxvd2VkIGF0dHJpYnV0ZXMgdG8gdGhlIGFsbG93ZWQgcm9sZSBsaXN0IGlmIHRoZXJlIGlzIG5vIHNwZWNpZmllZCByb2xlXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgYWxsb3cgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIChwZXJtaXR0ZWRSb2xlcyA9PT0gbnVsbCB8fCBwZXJtaXR0ZWRSb2xlcyA9PT0gdW5kZWZpbmVkIHx8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZVByb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3RhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnR5ICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydHkucHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gQXJpYVV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGVbaV0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9oaWJpdGVkUHJvcHMgPSByb2xlUHJvcGVydHkucHJvaGliaXRlZFByb3BzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkUHJvcHMgJiYgcHJvaGliaXRlZFByb3BzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9oaWJpdGVkUHJvcHMsIHByb2hpYml0ZWRBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBvZiBzZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlW2ldID09PSBcInNlcGFyYXRvclwiICYmIENvbW1vblV0aWwuaXNGb2N1c2FibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBnbG9iYWwgcHJvcGVydGllcyB0byB0aGUgdmFsaWQgYXR0cmlidXRlIGxpc3RcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxQcm9wZXJ0aWVzOyAvLyBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZGluZyB0aGUgb3RoZXIgcm9sZSB0byB0aGUgYWxsb3dlZCByb2xlcyBmb3IgdGhlIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdCh0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcywgcGVybWl0dGVkUm9sZXMpO1xuICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBzcGVjaWZpZWQgcm9sZSBwcm9wZXJ0aWVzIHRvIHRoZSBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGVybWl0dGVkUm9sZXMgIT09IG51bGwgJiYgaSA8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3Blcm1pdHRlZFJvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHByb3BlcnRpZXMgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBhbGxvdyBhdHRyaWJ1dGVzIGZyb20gdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdQcm9wZXJ0eSB8fCB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgfHwgIXRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgfHwgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydGllcy5wcm9wczsgLy8gYWxsb3dlZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IEFyaWFVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocGVybWl0dGVkUm9sZXNbaV0sIHJ1bGVDb250ZXh0KTsgLy8gcmVxdWlyZWQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvaGliaXRlZFByb3BzID0gcm9sZVByb3BlcnRpZXMucHJvaGliaXRlZFByb3BzO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvaGliaXRlZFByb3BzICYmIHByb2hpYml0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb2hpYml0ZWRQcm9wcywgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICBpZiAocGVybWl0dGVkUm9sZXNbaV0gPT09IFwic2VwYXJhdG9yXCIgJiYgQ29tbW9uVXRpbC5pc0ZvY3VzYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZ25vcmUgYXJpYS1sZXZlbCwgYXJpYS1zZXRzaXplIG9yIGFyaWEtcG9zaW5zZXQgaWYgXCJyb3dcIiBpcyBub3QgaW4gdHJlZWdyaWRcbiAgICAgICAgICAgIGlmIChwZXJtaXR0ZWRSb2xlcy5pbmNsdWRlcyhcInJvd1wiKSAmJiBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRyZWVncmlkXCIsIHRydWUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtbGV2ZWxcIikpID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtc2V0c2l6ZVwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPSBhbGxvd2VkQXR0cmlidXRlcy5pbmRleE9mKFwiYXJpYS1wb3NpbnNldFwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIGFsbG93ZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgYXR0cmlidXRlLXZhbHVlIHBhaXIgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHRhZ1Byb3BlcnR5Lm90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHIgPSB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlc1twXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gYXR0ci5zcGxpdChcIj1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKHBhaXJbMF0pID09PSBwYWlyWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQucHVzaChwYWlyWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkLnB1c2goYXR0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChhbGxvd2VkLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIHByb2hpYml0dGVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGF0dHJpYnV0ZS12YWx1ZSBwYWlyIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgIGxldCBkaXNhbGxvd2VkID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCB0YWdQcm9wZXJ0eS5vdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IGF0dHIuc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShwYWlyWzBdKSA9PT0gcGFpclsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvd2VkLnB1c2gocGFpclswXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWxsb3dlZC5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlzYWxsb3dlZC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGlzYWxsb3dlZCwgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9leGNsdWRlIHRoZSBwcm9oaWJpdGVkQXR0cmlidXRlcyBmcm9tIHRoZSBhbGxvd2VkQXR0cmlidXRlc1xuICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QocHJvaGliaXRlZEF0dHJpYnV0ZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgLy9leGNsdWRlIGFyaWEgYXR0cmlidXRlIGZvciBlbGVtZW50cyB3aXRob3V0IGltcGxpY2l0IHJvbGUgYW5kIHdpdGggJ05hbWluZyBQcm9oaWJpdGVkJ1xuICAgICAgICAgICAgaWYgKCghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSAmJiB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgJiYgdGFnUHJvcGVydHkucHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlKVxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiQXJpYVV0aWxfQWxsb3dlZEFyaWFBdHRyaWJ1dGVzXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZEF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhcmlhQXR0ciBcbiAgICAgKiBAcGFyYW0gaHRtbEF0dHJzIFxuICAgICAqIEB0eXBlOiBjb25mbGljdCBvciBvdmVybGFwcGluZ1xuICAgICAqIEByZXR1cm5zIGh0bWxBdHRyTmFtZSwgJ1Bhc3MnIG9yIG51bGxcbiAgICAgKiAgICAgICAgIGh0bWxBdHRyTmFtZSB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICAnUGFzcycgd2l0aCBubyBjb25mbGljdCB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICBvciBudWxsIHdoZXJlIGFyaWFBdHRyIHdvbid0IGNhdXNlIGNvbmZsaWN0XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb25mbGljdE9yT3ZlcmxhcHBpbmdIdG1sQXR0cmlidXRlKGFyaWFBdHRyLCBodG1sQXR0cnMsIHR5cGUpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICBsZXQgZXhpc3QgPSBBUklBRGVmaW5pdGlvbnMucmVsYXRlZEFyaWFIdG1sQXR0cmlidXRlc1thcmlhQXR0clsnbmFtZSddXTtcbiAgICAgICAgaWYgKGV4aXN0KSB7XG4gICAgICAgICAgICBpZiAoIWFyaWFBdHRyIHx8IGFyaWFBdHRyLmxlbmd0aCA9PSAwIHx8ICFodG1sQXR0cnMgfHwgaHRtbEF0dHJzLmxlbmd0aCA9PSAwKSByZXR1cm4gW107XG5cbiAgICAgICAgICAgIGxldCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IFtdO1xuICAgICAgICAgICAgbGV0IGNvbmNlcm5UeXBlcyA9IG51bGw7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2NvbmZsaWN0Jykge1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3QuY29uZmxpY3QgfHwgT2JqZWN0LmtleXMoZXhpc3QuY29uZmxpY3QpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uY2VyblR5cGVzID0gZXhpc3QuY29uZmxpY3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvdmVybGFwcGluZycpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0Lm92ZXJsYXBwaW5nIHx8IE9iamVjdC5rZXlzKGV4aXN0Lm92ZXJsYXBwaW5nKS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbmNlcm5UeXBlcyA9IGV4aXN0Lm92ZXJsYXBwaW5nO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGxldCBhcHBsaWNhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgZmFpbCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb25jZXJuVHlwZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VybkFyaWFWYWx1ZSA9IGNvbmNlcm5UeXBlc1trXS5hcmlhQXR0cmlidXRlVmFsdWU7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcm5IdG1sTmFtZXMgPSBjb25jZXJuVHlwZXNba10uaHRtbEF0dHJpYnV0ZU5hbWVzO1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXJuSHRtbFZhbHVlcyA9IGNvbmNlcm5UeXBlc1trXS5odG1sQXR0cmlidXRlVmFsdWVzO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBodG1sQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gY29uY2Vybkh0bWxOYW1lcy5pbmRleE9mKGh0bWxBdHRyc1tpXVsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbFZhbHVlc0luQ29uY2VybiA9IChjb25jZXJuSHRtbFZhbHVlcyA9PT0gbnVsbCB8fCBjb25jZXJuSHRtbFZhbHVlc1tpbmRleF0gPT09IG51bGwpID8gbnVsbCA6IGNvbmNlcm5IdG1sVmFsdWVzW2luZGV4XS5zcGxpdChcIixcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25jZXJuQXJpYVZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxWYWx1ZXNJbkNvbmNlcm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaHRtbFZhbHVlc0luQ29uY2Vybi5pbmNsdWRlcyhodG1sQXR0cnNbaV1bJ3ZhbHVlJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGh0bWxWYWx1ZXNJbkNvbmNlcm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uY2VybkFyaWFWYWx1ZSA9PT0gYXJpYUF0dHJbJ3ZhbHVlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uY2VybkFyaWFWYWx1ZSA9PT0gJ1ZBTFVFJyAmJiBodG1sVmFsdWVzSW5Db25jZXJuLmluY2x1ZGVzKCdWQUxVRScpICYmIGh0bWxWYWx1ZXNJbkNvbmNlcm5bMF0gIT09IGFyaWFBdHRyWyd2YWx1ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmNlcm5BcmlhVmFsdWUgPT09IGFyaWFBdHRyWyd2YWx1ZSddICYmIGh0bWxWYWx1ZXNJbkNvbmNlcm4uaW5jbHVkZXMoaHRtbEF0dHJzW2ldWyd2YWx1ZSddKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYXBwbGljYWJsZSAmJiAhZmFpbClcbiAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5wdXNoKHsgcmVzdWx0OiAnUGFzcycsICdhdHRyJzogJycgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBleGFtaW5lZEh0bWxBdHJOYW1lcztcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbSwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG5cbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyByb2xlcyAhPT0gbnVsbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByb2xlUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV07XG4gICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50aW9uYWwgPSByb2xlUHJvcGVydGllcy5wcmVzZW50YXRpb25hbENoaWxkcmVuO1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50aW9uYWwgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgd2Fsa05vZGU6IEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlKSB7XG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seSh3YWxrTm9kZSBhcyBIVE1MRWxlbWVudCkpIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAvL2FyaWEtb3duIGNhc2U6IGlmIHRoZSBlbGVtZW50IGlzIHJlZmVycmVkIGJ5IGFuIGFyaWEtd29uXG4gICAgICAgICAgICB3YWxrTm9kZSA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkod2Fsa05vZGUgYXMgSFRNTEVsZW1lbnQpIHx8IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyogXG4gKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIGEgdmFsaWQgQVJJQSByb2xlXG4gKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAqICAgICAgICAgdHJ1ZSBpZiB0aGUgcm9sZShzKSBhcmUgZGVmaW5lZCBpbiBBUklBXG4gKiAgICAgICAgIGZhbHNlIGlmIGFueSByb2xlIGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiovXG4gICAgcHVibGljIHN0YXRpYyBhcmVSb2xlc0RlZmluZWQocm9sZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcylcbiAgICAgICAgICAgIGlmICghKHJvbGUudG9Mb3dlckNhc2UoKSBpbiBkZXNpZ25QYXR0ZXJucykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFxuICAgICAqIGNoZWNrIGlmIGFueSBleHBsaWNpdCByb2xlIHNwZWNpZmllZCBmb3IgdGhlIGVsZW1lbnQgaXMgYSB2YWxpZCBBUklBIHJvbGVcbiAgICAgKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIHJvbGUocykgYXJlIGRlZmluZWQgaW4gQVJJQVxuICAgICAqICAgICAgICAgZmFsc2UgaWYgYW55IHJvbGUgaXMgbm90IGRlZmluZWQgaW4gQVJJQVxuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnZhbGlkUm9sZXMocnVsZUNvbnRleHQ6IEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRvbVJvbGVzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGlmICghZG9tUm9sZXMgfHwgZG9tUm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gY2hlY2sgdGhlICdnZW5lcmljJyByb2xlIGZpcnN0XG4gICAgICAgIGlmIChkb21Sb2xlcyAmJiBkb21Sb2xlcy5pbmNsdWRlcygnZ2VuZXJpYycpKVxuICAgICAgICAgICAgcmV0dXJuIFtcImdlbmVyaWNcIl07XG5cbiAgICAgICAgLy8gRmFpbGluZyByb2xlc1xuICAgICAgICBsZXQgZmFpbFJvbGVUb2tlbnMgPSBbXTtcbiAgICAgICAgLy8gUGFzc2luZyByb2xlc1xuICAgICAgICBsZXQgcGFzc1JvbGVUb2tlbnMgPSBbXTtcblxuICAgICAgICBsZXQgdGFnUHJvcGVydHkgPSBBcmlhVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGFsbG93ZWRSb2xlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgaWYgKCFhbGxvd2VkUm9sZXMgfHwgYWxsb3dlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBkb21Sb2xlcztcblxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gW107XG5cbiAgICAgICAgaWYgKGFsbG93ZWRSb2xlcy5pbmNsdWRlcygnYW55JykpXG4gICAgICAgICAgICByZXR1cm4gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21Sb2xlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghYWxsb3dlZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSAmJiAhaW52YWxpZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICBpbnZhbGlkUm9sZXMucHVzaChkb21Sb2xlc1tpXSk7XG5cbiAgICAgICAgcmV0dXJuIGludmFsaWRSb2xlcztcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAgICAgKiByZXR1cm46IGxpc3Qgb2Ygc3BlY2lmaWVkIHJvbGVzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICBsZXQgdW5kZWZpbmVkUm9sZXMgPSBbXTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIShyb2xlc1tpXSBpbiBkZXNpZ25QYXR0ZXJucykpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkUm9sZXMucHVzaChyb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRSb2xlcztcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBmaXJzdCBjaGVja3MgZXhwbGljaXQgcm9sZXMsIGlmIG5vIGV4cGxpY2l0IHJvbGUsIGl0IHdpbGwgY2hlY2sgdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgKiByZXR1cm46IG51bGwgaWYgYW55IGV4cGxpY2l0IHJvbGUgaXMgaW52YWxpZCwgXG4gICAgICogICAgICAgICBhIGxpc3Qgb2YgaW52YWxpZCBhdHRyaWJ1dGVzXG4gICAgICogICAgICAgICBlbXB0eSBsaXN0IGlmIGFsbCBhdHRyaWJ1dGVzIGFyZSB2YWxpZCwgb3Igbm8gYXJpYSBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEludmFsaWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dDogRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIC8vIGZvciBtdXRpcGxlIHJvbGVzLCBza2lwIGlmIGFueSByb2xlIGlzIGludmFsaWRcbiAgICAgICAgbGV0IGRlZmluZWQgPSBBcmlhVXRpbC5hcmVSb2xlc0RlZmluZWQocm9sZXMpO1xuICAgICAgICBpZiAoZGVmaW5lZCAhPT0gbnVsbCAmJiAhZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBhdHRycyA9IFtdO1xuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBhcmlhX2F0dHJzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBBdHRyaWJ1dGVzIGFsbG93ZWQgb24gdGhpcyBub2RlXG4gICAgICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcm9sZXMsIHRhZ1Byb3BlcnR5KTtcblxuICAgICAgICBpZiAoYXJpYV9hdHRycykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhX2F0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gYXJpYV9hdHRyc1tpXS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFsbG93ZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHJOYW1lKSAmJiAhYXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKVxuICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXR0cnM7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKGVsZW06IEVsZW1lbnQpIHtcblxuICAgICAgICBsZXQgYXJpYUF0dHJzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlTmFtZVZhbHVlUGFpcnMoZWxlbSk7XG4gICAgICAgIGxldCBodG1sQXR0cnMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEh0bWxBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGlmIChhcmlhQXR0cnMgJiYgYXJpYUF0dHJzLmxlbmd0aCA+IDAgJiYgaHRtbEF0dHJzICYmIGh0bWxBdHRycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gQXJpYVV0aWwuZ2V0Q29uZmxpY3RPck92ZXJsYXBwaW5nSHRtbEF0dHJpYnV0ZShhcmlhQXR0cnNbaV0sIGh0bWxBdHRycywgJ2NvbmZsaWN0Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGV4YW1pbmVkSHRtbEF0ck5hbWVzID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdGYWlsZWQnKSAvL2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyAnYXJpYUF0dHInOiBhcmlhQXR0cnNbaV1bJ25hbWUnXSwgJ2h0bWxBdHRyJzogaXRlbVsnYXR0ciddIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXByZWNhdGVkQXJpYVJvbGVzKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZ2xvYmFsRGVwcmVjYXRlZFJvbGVzID0gQVJJQURlZmluaXRpb25zLmdsb2JhbERlcHJlY2F0ZWRSb2xlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsRGVwcmVjYXRlZFJvbGVzLmluY2x1ZGVzKHJvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2gocm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlLWF0dHJpYnV0ZXNcbiAgICAgKiByZXR1cm46IGEgbGlzdCBvZiBkZXByZWNhdGVkIEFyaWEgcm9sZS1hdHRyaWJ1dGVzIHBhcmlzXG4gICAgICogICAgICAgICBmb3IgZ2xvYmFsIHRoZSByb2xlIGlzIG1hcmtlZCBhcyAnYW55J1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbWVudC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgYXJpYUF0dHJzID0gW107XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJylcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJzLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcmlhQXR0cnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBjb25zdCBnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxEZXByZWNhdGVkUHJvcGVydGllcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcy5pbmNsdWRlcyhhcmlhQXR0cnNbaV0pKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKHsgXCJyb2xlXCI6IFwiYW55XCIsIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tpXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVdpdGhEZXByZWNhdGVkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlOYW1lcyA9IHJvbGVXaXRoRGVwcmVjYXRlZEF0dHJpYnV0ZXNbJ2RlcHJlY2F0ZWRQcm9wcyddO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMgJiYgZGVwcmVjYXRlZEF0dHJpTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhcmlhQXR0cnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMuaW5jbHVkZXMoYXJpYUF0dHJzW2pdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyBcInJvbGVcIjogcm9sZXNbaV0sIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tqXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlSW5HcmlkKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobm9kZSwgXCJncmlkXCIpICE9IG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4vQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRE9NTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01NYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBCb3VuZHMgfSBmcm9tIFwiLi4vYXBpL0lCb3VuZHNcIjtcblxudHlwZSBQc2V1ZG9DbGFzcyA9XG4gICAgfCBcIjpob3ZlclwiXG4gICAgfCBcIjphY3RpdmVcIlxuICAgIHwgXCI6Zm9jdXNcIlxuICAgIHwgXCI6Zm9jdXMtdmlzaWJsZVwiXG4gICAgfCBcIjpmb2N1cy13aXRoaW5cIjtcblxuZXhwb3J0IGNsYXNzIENTU1V0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgc2VsZWN0b3JNYXRjaGVzRWxlbShlbGVtZW50OiBFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIEVhcmx5IHJldHVybiBmb3IgZW1wdHkgc2VsZWN0b3IgKGJlZm9yZSB0cnktY2F0Y2ggZm9yIHBlcmZvcm1hbmNlKVxuICAgICAgICBpZiAoIXNlbGVjdG9yIHx8IHNlbGVjdG9yLmxlbmd0aCA9PT0gMCB8fCBzZWxlY3Rvci50cmltKCkgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTW9kZXJuIHN0YW5kYXJkIG1ldGhvZFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm1hdGNoZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBWZW5kb3ItcHJlZml4ZWQgZmFsbGJhY2tzIChvbGRlciBicm93c2VycylcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiAoZWxlbWVudCBhcyBhbnkpLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS5tc01hdGNoZXNTZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkubXNNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBMZWdhY3kgbWV0aG9kIChkZXByZWNhdGVkIGJ1dCBrZXB0IGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZWxlbWVudCBhcyBhbnkpLm1hdGNoZXNTZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHVzZSBxdWVyeVNlbGVjdG9yQWxsIGFuZCBjaGVjayBpZiBlbGVtZW50IGlzIGluIHJlc3VsdHNcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fCAoZWxlbWVudCBhcyBhbnkpLmRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKCFkb2MpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIC8vIFVzZSBBcnJheS5mcm9tIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aCBtb2Rlcm4gZW5naW5lc1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obWF0Y2hlcykuaW5jbHVkZXMoZWxlbWVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gQmFkIHNlbGVjdG9yPyBEb2Vzbid0IG1hdGNoIHRoZW4uLi5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0eWxlIGNvbXB1dGVkIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gZWxlbVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtOiBIVE1MRWxlbWVudCwgcHNldWRvRWx0PzogUHNldWRvQ2xhc3MpIHtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuICAgICAgICBjb25zdCB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIHJldHVybiB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBwc2V1ZG9FbHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIGFuZCBjYWNoZSBhbGwgc3R5bGVzaGVldCBydWxlcyBhdCB0aGUgZG9jdW1lbnQgbGV2ZWxcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBhcnNlZCBydWxlIG9iamVjdHMgd2l0aCBzZWxlY3RvciBhbmQgc3R5bGUgaW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRQYXJzZWRTdHlsZXNoZWV0UnVsZXMob3duZXJEb2M6IERvY3VtZW50KTogQXJyYXk8e1xuICAgICAgICBmdWxsUnVsZVNlbGVjdG9yOiBzdHJpbmc7XG4gICAgICAgIGhhc1BzZXVkb0NsYXNzOiBib29sZWFuO1xuICAgICAgICBzZWxNYWluOiBzdHJpbmc7XG4gICAgICAgIHNlbFBzZXVkbzogc3RyaW5nO1xuICAgICAgICBzdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbjtcbiAgICB9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBjYWNoZWQgcGFyc2VkIHJ1bGVzIGZvciB0aGlzIGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGNhY2hlZFJ1bGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKG93bmVyRG9jLCBcIlJQVFV0aWxfUGFyc2VkU3R5bGVzaGVldFJ1bGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoY2FjaGVkUnVsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRSdWxlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZFJ1bGVzID0gW107XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgc3R5bGVzaGVldHMgYW5kIHJ1bGVzXG4gICAgICAgIGZvciAobGV0IHNzSW5kZXggPSAwOyBzc0luZGV4IDwgb3duZXJEb2Muc3R5bGVTaGVldHMubGVuZ3RoOyArK3NzSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gb3duZXJEb2Muc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSBzaGVldC5jc3NSdWxlc1tySW5kZXhdIGFzIENTU1N0eWxlUnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxSdWxlU2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsUnVsZVNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvTWF0Y2ggPSBmdWxsUnVsZVNlbGVjdG9yLm1hdGNoKC9eKC4qKSg6W2EtekEtWi1dKikkLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzUHNldWRvQ2xhc3MgPSAhIXBzZXVkb01hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbE1haW4gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzFdIDogZnVsbFJ1bGVTZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxQc2V1ZG8gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzJdIDogXCJcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUnVsZVNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQc2V1ZG9DbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsTWFpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsUHNldWRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogcnVsZS5zdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJDYW5ub3QgYWNjZXNzIHJ1bGVzXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICFlcnIudG9TdHJpbmcoKS5pbmNsdWRlcyhcIlNlY3VyaXR5RXJyb3I6XCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB0aGUgcGFyc2VkIHJ1bGVzIGF0IHRoZSBkb2N1bWVudCBsZXZlbFxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUob3duZXJEb2MsIFwiUlBUVXRpbF9QYXJzZWRTdHlsZXNoZWV0UnVsZXNcIiwgcGFyc2VkUnVsZXMpO1xuICAgICAgICByZXR1cm4gcGFyc2VkUnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJpdmF0ZSBoZWxwZXIgbWV0aG9kIHRvIGZpbGwgc3R5bGUgbWFwcyBmcm9tIGEgQ1NTU3R5bGVEZWNsYXJhdGlvblxuICAgICAqIEhhbmRsZXMgQ1NTIHByb3BlcnR5IHByaW9yaXRpZXMgYW5kIHRoZSBcImFsbFwiIHNob3J0aGFuZCBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGZpbGxTdHlsZShtYXBzOiBhbnlbXSwgc3R5bGU6IENTU1N0eWxlRGVjbGFyYXRpb24pOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgc3R5bGUubGVuZ3RoOyArK3NJbmRleCkge1xuICAgICAgICAgICAgaWYgKHN0eWxlW3NJbmRleF0gPT09IFwiYWxsXCIgJiYgc3R5bGVbc3R5bGVbc0luZGV4XV0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hcCBvZiBtYXBzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1hcFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBzdHlsZVtzSW5kZXhdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByaW9yaXR5ID0gc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eShrZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1hcCAmJiBtYXBba2V5XS5lbmRzV2l0aChcIiFpbXBvcnRhbnRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9PT0gXCJpbXBvcnRhbnRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBba2V5XS5zdGFydHNXaXRoKFwiaW5oZXJpdFwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBba2V5XS5zdGFydHNXaXRoKFwidW5zZXRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHN0eWxlW2tleV0gKyBcIiAhaW1wb3J0YW50XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVtrZXldICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJpb3JpdHkgPT09IFwiaW1wb3J0YW50XCIgPyBcIiAhaW1wb3J0YW50XCIgOiBcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcml2YXRlIGhlbHBlciBtZXRob2QgdGhhdCBjb25zb2xpZGF0ZXMgdGhlIGxvZ2ljIGZvciBnZXR0aW5nIGRlZmluZWQgc3R5bGVzXG4gICAgICogVXNlZCBieSBib3RoIGdldERlZmluZWRTdHlsZXMgYW5kIGdldERlZmluZWRTdHlsZXNNdWx0aXBsZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldERlZmluZWRTdHlsZXNJbnRlcm5hbChcbiAgICAgICAgZWxlbTogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByb3BzOiBzdHJpbmdbXSB8IG51bGwsXG4gICAgICAgIHBzZXVkb0NsYXNzZXM6IHN0cmluZ1tdXG4gICAgKTogeyBbcHNldWRvQ2xhc3M6IHN0cmluZ106IGFueSB9IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHt9O1xuICAgICAgICBjb25zdCBkZWZpbmVkU3R5bGVzTWFwID0ge307XG4gICAgICAgIGNvbnN0IGRlZmluZWRTdHlsZVBzZXVkb01hcCA9IHt9O1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgcmVzdWx0IG9iamVjdHMgZm9yIGFsbCBwc2V1ZG8tY2xhc3Nlc1xuICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgIGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdID0ge307XG4gICAgICAgICAgICBkZWZpbmVkU3R5bGVQc2V1ZG9NYXBbcHNldWRvQ2xhc3NdID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcHJlLXBhcnNlZCBzdHlsZXNoZWV0IHJ1bGVzIGZyb20gY2FjaGVcbiAgICAgICAgY29uc3QgcGFyc2VkUnVsZXMgPSBDU1NVdGlsLmdldFBhcnNlZFN0eWxlc2hlZXRSdWxlcyhlbGVtLm93bmVyRG9jdW1lbnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgb25jZSBpZiB3ZSBuZWVkIHRvIGhhbmRsZSA6Zm9jdXMgcHNldWRvLWNsYXNzXG4gICAgICAgIGNvbnN0IGhhc0ZvY3VzUHNldWRvID0gcHNldWRvQ2xhc3Nlcy5pbmNsdWRlcyhcIjpmb2N1c1wiKTtcblxuICAgICAgICAvLyBQcm9jZXNzIGVhY2ggY2FjaGVkIHJ1bGVcbiAgICAgICAgZm9yIChjb25zdCBwYXJzZWRSdWxlIG9mIHBhcnNlZFJ1bGVzKSB7XG4gICAgICAgICAgICBpZiAocHJvcHMgIT09IG51bGwgJiYgIXByb3BzLnNvbWUocHJvcCA9PiAhIXBhcnNlZFJ1bGUuc3R5bGVbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxQc2V1ZG8gPSBwYXJzZWRSdWxlLnNlbFBzZXVkbztcbiAgICAgICAgICAgIGNvbnN0IGhhc1BzZXVkb0NsYXNzID0gcGFyc2VkUnVsZS5oYXNQc2V1ZG9DbGFzcztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSGFuZGxlIDpmb2N1cy13aXRoaW4gcmVwbGFjZW1lbnQgb25jZSBwZXIgcnVsZSBpZiBuZWVkZWRcbiAgICAgICAgICAgIGxldCBzZWxNYWluID0gcGFyc2VkUnVsZS5zZWxNYWluO1xuICAgICAgICAgICAgaWYgKGhhc0ZvY3VzUHNldWRvICYmIHNlbFBzZXVkbyA9PT0gXCI6Zm9jdXNcIikge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBoYXMgZm9jdXMsIHJlbW92ZSBmb2N1cy13aXRoaW4gZnJvbSBwYXJlbnRzXG4gICAgICAgICAgICAgICAgc2VsTWFpbiA9IHNlbE1haW4ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgLyhbID5dW14rfiA+XSspOmZvY3VzLXdpdGhpbi9nLFxuICAgICAgICAgICAgICAgICAgICBcIiQxXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDYWNoZSBzZWxlY3RvciBtYXRjaGluZyByZXN1bHQgKG9ubHkgb25jZSBwZXIgcnVsZSwgbm90IHBlciBwc2V1ZG8tY2xhc3MpXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rvck1hdGNoZXMgPSBDU1NVdGlsLnNlbGVjdG9yTWF0Y2hlc0VsZW0oZWxlbSwgc2VsTWFpbik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VzcyBpZiBzZWxlY3RvciBtYXRjaGVzXG4gICAgICAgICAgICBpZiAoc2VsZWN0b3JNYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBmb3IgZWFjaCBwc2V1ZG8tY2xhc3NcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgbWFwIHJlZmVyZW5jZXMgdG8gYXZvaWQgcmVwZWF0ZWQgbG9va3Vwc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZU1hcCA9IGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwc2V1ZG9NYXAgPSBkZWZpbmVkU3R5bGVQc2V1ZG9NYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBvZiBub24tcHNldWRvIHNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1BzZXVkb0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbc3R5bGVNYXAsIHBzZXVkb01hcF0sIHBhcnNlZFJ1bGUuc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBmb3IgbWF0Y2hpbmcgcHNldWRvLWNsYXNzXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxQc2V1ZG8gPT09IHBzZXVkb0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbcHNldWRvTWFwXSwgcGFyc2VkUnVsZS5zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgZWxlbWVudCBzdHlsZXMgYW5kIGJ1aWxkIHJlc3VsdHMgaW4gb25lIHBhc3NcbiAgICAgICAgZm9yIChjb25zdCBwc2V1ZG9DbGFzcyBvZiBwc2V1ZG9DbGFzc2VzKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZU1hcCA9IGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgY29uc3QgcHNldWRvTWFwID0gZGVmaW5lZFN0eWxlUHNldWRvTWFwW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQWRkIGVsZW1lbnQncyBpbmxpbmUgc3R5bGVzXG4gICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbc3R5bGVNYXAsIHBzZXVkb01hcF0sIGVsZW0uc3R5bGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBCdWlsZCByZXN1bHRzXG4gICAgICAgICAgICBpZiAocHNldWRvQ2xhc3MgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3BzZXVkb0NsYXNzXSA9IHN0eWxlTWFwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgcHNldWRvLWNsYXNzZXMsIHJldHVybiBvbmx5IHN0eWxlcyB0aGF0IGRpZmZlciBmcm9tIGRlZmF1bHRcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmU3R5bGVzID0ge307XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHBzZXVkb01hcCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwc2V1ZG9NYXBba2V5XSAhPT0gc3R5bGVNYXBba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlN0eWxlc1trZXldID0gcHNldWRvTWFwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0c1twc2V1ZG9DbGFzc10gPSBkaWZmU3R5bGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnQgZm9yIG11bHRpcGxlIHBzZXVkby1jbGFzc2VzIGluIGEgc2luZ2xlIHBhc3NcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIGdldERlZmluZWRTdHlsZXMgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seVxuICAgICAqIGl0ZXJhdGVzIHRocm91Z2ggc3R5bGVzaGVldHMgb25jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgKGFsbG93cyB1cyB0byBza2lwIGVsZW0gbWF0Y2hpbmcgdW5uZWNlc3NhcmlseSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwc2V1ZG9DbGFzc2VzIC0gQXJyYXkgb2YgcHNldWRvLWNsYXNzZXMgdG8gcmV0cmlldmUuIFVzZSBcIlwiIGZvciBkZWZhdWx0IChubyBwc2V1ZG8tY2xhc3MpLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCBtYXBwaW5nIGVhY2ggcHNldWRvLWNsYXNzIHRvIGl0cyBkZWZpbmVkIHN0eWxlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKGVsZW06IEhUTUxFbGVtZW50LCBwcm9wczogc3RyaW5nW10gfCBudWxsLCBwc2V1ZG9DbGFzc2VzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByZXN1bHRzID0ge307XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNhY2hlIGtleSB0aGF0IGluY2x1ZGVzIHByb3BzIGZpbHRlclxuICAgICAgICAvLyBVc2UgXCJhbGxcIiBmb3IgbnVsbCBwcm9wcywgb3Igc29ydGVkIGNvbW1hLXNlcGFyYXRlZCBsaXN0IGZvciBzcGVjaWZpYyBwcm9wc1xuICAgICAgICBjb25zdCBwcm9wc0tleSA9IHByb3BzID09PSBudWxsID8gXCJhbGxcIiA6IHByb3BzLnNsaWNlKCkuc29ydCgpLmpvaW4oXCIsXCIpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QgLSBzZWUgaWYgd2UgaGF2ZSBhbGwgcmVxdWVzdGVkIHBzZXVkby1jbGFzc2VzIGNhY2hlZFxuICAgICAgICBsZXQgYWxsQ2FjaGVkU3R5bGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWFsbENhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgYWxsQ2FjaGVkU3R5bGVzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGNhY2hlIGJ1Y2tldCBmb3IgdGhpcyBwcm9wcyBmaWx0ZXJcbiAgICAgICAgbGV0IGNhY2hlZFN0eWxlcyA9IGFsbENhY2hlZFN0eWxlc1twcm9wc0tleV07XG4gICAgICAgIGxldCBtaXNzaW5nUHNldWRvQ2xhc3NlcyA9IFtdO1xuICAgICAgICBcbiAgICAgICAgaWYgKGNhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgd2hpY2ggcHNldWRvLWNsYXNzZXMgYXJlIGFscmVhZHkgY2FjaGVkXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkU3R5bGVzW3BzZXVkb0NsYXNzXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbcHNldWRvQ2xhc3NdID0gY2FjaGVkU3R5bGVzW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtaXNzaW5nUHNldWRvQ2xhc3Nlcy5wdXNoKHBzZXVkb0NsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIElmIGFsbCBhcmUgY2FjaGVkLCByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIGlmIChtaXNzaW5nUHNldWRvQ2xhc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFN0eWxlcyA9IHt9O1xuICAgICAgICAgICAgbWlzc2luZ1BzZXVkb0NsYXNzZXMgPSBwc2V1ZG9DbGFzc2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBwcm9jZXNzIG1pc3NpbmcgcHNldWRvLWNsYXNzZXMgdXNpbmcgdGhlIGludGVybmFsIGhlbHBlclxuICAgICAgICBpZiAobWlzc2luZ1BzZXVkb0NsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV3UmVzdWx0cyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc0ludGVybmFsKGVsZW0sIHByb3BzLCBtaXNzaW5nUHNldWRvQ2xhc3Nlcyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE1lcmdlIG5ldyByZXN1bHRzIHdpdGggY2FjaGVkIHJlc3VsdHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHNldWRvQ2xhc3Mgb2YgbWlzc2luZ1BzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3BzZXVkb0NsYXNzXSA9IG5ld1Jlc3VsdHNbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgIGNhY2hlZFN0eWxlc1twc2V1ZG9DbGFzc10gPSBuZXdSZXN1bHRzW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGNhY2hlIHdpdGggYWxsIHN0eWxlcyAoZXhpc3RpbmcgKyBuZXcpXG4gICAgICAgICAgICBhbGxDYWNoZWRTdHlsZXNbcHJvcHNLZXldID0gY2FjaGVkU3R5bGVzO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIGFsbENhY2hlZFN0eWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBjb21wdXRlZCBzdHlsZSBpbiB0aGF0IHRoZSBjb21wdXRlZCBzdHlsZSB3aWxsIHJldHVyblxuICAgICAqIHN0eWxlcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIGFnZW50LiBUaGlzIHdpbGwgb25seSByZXR1cm4gc3R5bGVzIGRlZmluZWQgYnkgdGhlXG4gICAgICogYXBwbGljYXRpb25cbiAgICAgKiBpZiByb3RhdGlvbiB0cmFuc2Zvcm0gaXMgdXNlZCwgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgdGhlIHJlc29sdmVkIG1hdHJpeFxuICAgICAqICB3aGlsZSB0aGUgZGVmaW5lZCBzdHlsZSByZXR1cm4gdGhlIHRyYW5zZm9ybSBmdW5jdGlvbihzKVxuICAgICAqIGZvciBleGFtcGxlLCBmb3IgJ3RyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7JywgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgJ21hdHJpeCgtMC4wNDM2MTk0LCAwLjk5OTA0OCwgLTAuOTk5MDQ4LCAtMC4wNDM2MTk0LCAwLCAwKSdcbiAgICAgKiAgYW5kIHRoZSBkZWZpbmVkIHN0eWxlIHJldHVybnMgJ3JvdGF0ZSgyLjVkZWcpJ1xuICAgICAqXG4gICAgICogY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgcHNldWRvQ2xhc3MgZnJvbSBQc2V1ZG9DbGFzcyB0byBzdHJpbmcgdG8gaW5jbHVkZSBib3RoIHBzZXVkbyBjbGFzc2VzIChlLmcuLCA6Zm9jdXMsIDpjaGVja2VkKVxuICAgICAqIGFuZCBwc2V1ZG8gZWxlbWVudHMgKGUuZy4sIDo6YmVmb3JlLCA6OmFmdGVyKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgKGFsbG93cyB1cyB0byBza2lwIGVsZW0gbWF0Y2hpbmcgdW5uZWNlc3NhcmlseSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3BzZXVkb0NsYXNzXSBJZiBzcGVjaWZpZWQsIHdpbGwgcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSBkaWZmZXJlbnRcbiAgICAgKiB0aGFuIHdoZW4gdGhlIHBzZXVkb0NsYXNzIGRvZXMgbm90IG1hdGNoLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVmaW5lZFN0eWxlcyhlbGVtOiBIVE1MRWxlbWVudCwgcHJvcHM6IHN0cmluZ1tdLCBwc2V1ZG9DbGFzcz86IHN0cmluZykge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIENyZWF0ZSBjYWNoZSBrZXkgdGhhdCBpbmNsdWRlcyBwcm9wcyBmaWx0ZXJcbiAgICAgICAgLy8gVXNlIFwiYWxsXCIgZm9yIG51bGwgcHJvcHMsIG9yIHNvcnRlZCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBmb3Igc3BlY2lmaWMgcHJvcHNcbiAgICAgICAgY29uc3QgcHJvcHNLZXkgPSBwcm9wcyA9PT0gbnVsbCA/IFwiYWxsXCIgOiBwcm9wcy5zbGljZSgpLnNvcnQoKS5qb2luKFwiLFwiKTtcbiAgICAgICAgY29uc3QgcHNldWRvS2V5ID0gcHNldWRvQ2xhc3MgfHwgXCJcIjtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0IC0gdXNlIHNoYXJlZCBjYWNoZSBzdHJ1Y3R1cmUgd2l0aCBnZXREZWZpbmVkU3R5bGVzTXVsdGlwbGVcbiAgICAgICAgbGV0IGFsbENhY2hlZFN0eWxlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFhbGxDYWNoZWRTdHlsZXMpIHtcbiAgICAgICAgICAgIGFsbENhY2hlZFN0eWxlcyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBjYWNoZSBidWNrZXQgZm9yIHRoaXMgcHJvcHMgZmlsdGVyXG4gICAgICAgIGxldCBjYWNoZWRTdHlsZXMgPSBhbGxDYWNoZWRTdHlsZXNbcHJvcHNLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgY2FjaGVkU3R5bGVzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChjYWNoZWRTdHlsZXNbcHNldWRvS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU3R5bGVzW3BzZXVkb0tleV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIGludGVybmFsIGhlbHBlciBtZXRob2Qgd2l0aCBhIHNpbmdsZSBwc2V1ZG8tY2xhc3NcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc0ludGVybmFsKGVsZW0sIHByb3BzLCBbcHNldWRvS2V5XSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbcHNldWRvS2V5XTtcbiAgICAgICAgXG4gICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgY2FjaGVkU3R5bGVzW3BzZXVkb0tleV0gPSByZXN1bHQ7XG4gICAgICAgIGFsbENhY2hlZFN0eWxlc1twcm9wc0tleV0gPSBjYWNoZWRTdHlsZXM7XG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCBhbGxDYWNoZWRTdHlsZXMpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtZWRpYSBxdWVyeSBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnRcbiAgICAgKiBHZXQgbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtcyBmcm9tIHN0eWxlc2hlZXRzIHdpdGggY2FjaGluZ1xuICAgICAqIFJldHVybnMgdHJhbnNmb3JtL3JvdGF0ZSBwcm9wZXJ0aWVzIGZvciBlbGVtZW50cyB3aXRoaW4gbWVkaWEgcXVlcmllc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtEb2N1bWVudH0gZG9jXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRNZWRpYU9yaWVudGF0aW9uVHJhbnNmb3JtKGRvYzogRG9jdW1lbnQpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGNhY2hlZCBtZWRpYSBvcmllbnRhdGlvbiB0cmFuc2Zvcm1zIGZvciB0aGlzIGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGNhY2hlZFRyYW5zZm9ybXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybXNcIiwgbnVsbCk7XG4gICAgICAgIGlmIChjYWNoZWRUcmFuc2Zvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVHJhbnNmb3JtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcmllbnRhdGlvblRyYW5zZm9ybXMgPSB7fVxuXG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHN0eWxlc2hlZXRzIGFuZCBydWxlc1xuICAgICAgICBmb3IgKGxldCBzc0luZGV4ID0gMDsgc3NJbmRleCA8IGRvYy5zdHlsZVNoZWV0cy5sZW5ndGg7ICsrc3NJbmRleCkge1xuICAgICAgICAgICAgY29uc3Qgc2hlZXQgPSBkb2Muc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoZWV0UnVsZSA9IHNoZWV0LmNzc1J1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8gPT09IHNoZWV0UnVsZS5NRURJQV9SVUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVsZSA9IHNoZWV0UnVsZSBhcyBDU1NNZWRpYVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUgJiYgcnVsZS5tZWRpYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUxpc3QgPSBydWxlLm1lZGlhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lZGlhTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZWRpYUxpc3QuaXRlbShpKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUtleSA9IG1lZGlhTGlzdC5pdGVtKGkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbV90cmFuc2Zvcm1zID0gb3JpZW50YXRpb25UcmFuc2Zvcm1zW21lZGlhS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxlbV90cmFuc2Zvcm1zKSBlbGVtX3RyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gcnVsZS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3R5bGVSdWxlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLyA9PT0gc3R5bGVSdWxlc1tqXS5TVFlMRV9SVUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbal0gYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHN0eWxlUnVsZS5zZWxlY3RvclRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHN0eWxlUnVsZS5zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgc3R5bGVzLmxlbmd0aDsgKytzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gc3R5bGVzW3NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleUxvd2VyID0ga2V5LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleUxvd2VyID09PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYWxsXCIgJiYgc3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3Jtc1trZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleUxvd2VyID09PSBcInJvdGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXNba2V5XSA9IHN0eWxlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0cmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90cmFuc2Zvcm1zW3NlbGVjdG9yXSA9IHRyYW5zZm9ybXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZWxlbV90cmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb25UcmFuc2Zvcm1zW21lZGlhS2V5XSA9IGVsZW1fdHJhbnNmb3JtcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiQ2Fubm90IGFjY2VzcyBydWxlc1wiKSAmJlxuICAgICAgICAgICAgICAgICAgICAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJTZWN1cml0eUVycm9yOlwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDYWNoZSB0aGUgbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtcyBhdCB0aGUgZG9jdW1lbnQgbGV2ZWxcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRVdGlsX01lZGlhT3JpZW50YXRpb25UcmFuc2Zvcm1zXCIsIG9yaWVudGF0aW9uVHJhbnNmb3Jtcyk7XG4gICAgICAgIHJldHVybiBvcmllbnRhdGlvblRyYW5zZm9ybXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29udmVydCBnaXZlbiByb3RhdGlvbiB0cmFuc2Zvcm0gZnVuY3Rpb25zIHRvIHRoZSBkZWdyZWUgdHJhbnNmb3JtZWQuXG4gICAgICogSWYgbXVsdGlwbGUgZnVuY3Rpb25zIGFyZSBnaXZlbiwgdGhlbiB0aGUgZnVuY3Rpb25zIGFyZSBhcHBsaWVkIGxpbmVhcmx5IGluIHRoZSBvcmRlci5cbiAgICAgKiAgIHJvdGF0aW9uX3RyYW5zZm9ybSBmdW5jdGlvbiBleGFtcGxlOiAgcm90YXRlKDQ1ZGVnKSwgcm90YXRlKDJ0dXJuKSwgcm90YXRlKDJyYWQpLCByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZyksXG4gICAgICogICAgICAgIHJvdGF0ZSgycmFkKSByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZylcbiAgICAgKiBAcGFyYW0gcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSb3RhdGlvbkRlZ3JlZShyb3RhdGlvbl90cmFuc2Zvcm0pIHtcbiAgICAgICAgbGV0IGRlZ3JlZSA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXJvdGF0aW9uX3RyYW5zZm9ybSkgcmV0dXJuIGRlZ3JlZTtcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0aGUgcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICAgICAgICByb3RhdGlvbl90cmFuc2Zvcm0gPSByb3RhdGlvbl90cmFuc2Zvcm0ucmVwbGFjZUFsbChcIiwgXCIsIFwiLFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybV9mdW5jdGlvbnMgPSByb3RhdGlvbl90cmFuc2Zvcm0uc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2Zvcm1fZnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtX2Z1bmN0aW9uID0gdHJhbnNmb3JtX2Z1bmN0aW9uc1tpXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbiA9PT0gXCJcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwicm90YXRlM2RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZTogcm90YXRlM2QoMSwgMSwgMSwgNDVkZWcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIoXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdHJpeCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3RhdGlvbiA9IHZhbHVlc1szXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdGF0aW9uKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJ0dXJuXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gNFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gbnVtICogMzYwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJyYWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSAobnVtICogMTgwKSAvIE1hdGguUEk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSArPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGVcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGVaXCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGU6IHJvdGF0ZSg0NWRlZyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm90YXRpb24gPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyb3RhdGlvbikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInR1cm5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSA0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSBudW0gKiAzNjA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uLmVuZHNXaXRoKFwicmFkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gKG51bSAqIDE4MCkgLyBNYXRoLlBJO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSArPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4M2RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSB0aHJlZSBFdWxlciBhbmdsZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ICE9PSAtMSAmJiByaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXRyaXggPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4KSB2YWx1ZXMgPSBtYXRyaXguc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpfYW5nbGUgPSBNYXRoLmF0YW4yKHZhbHVlc1s0XSwgdmFsdWVzWzVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyZWUgKz0gTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgoel9hbmdsZSAqIDE4MCkgLyBNYXRoLlBJKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgdGhyZWUgRXVsZXIgYW5nbGVzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0cml4ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6X2FuZ2xlID0gTWF0aC5hdGFuMih2YWx1ZXNbMV0sIHZhbHVlc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlICs9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHpfYW5nbGUgKiAxODApIC8gTWF0aC5QSSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAoZGVncmVlID49IDM2MCkgZGVncmVlIC09IDM2MDtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhbm5vdCByZXRyaWV2ZSByb3RhdGlvbiBkZWdyZWU6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVncmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgQ1NTIHN0eWxlIHN0cmluZyB2YWx1ZXMgdG8gcGl4ZWxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHN0eWxlIHZhbHVlIGluIHN0cmluZywgc3VjaCBhcyAzcmVtLCAyMzBweCBldGMuXG4gICAgICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRQaXhlbHNGcm9tU3R5bGUodmFsdWUsIGVsZW0pIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbiAgICAgICAgbGV0IHBhcnNlZCA9IHZhbHVlLnRyaW0oKS5tYXRjaChyZWdleCk7XG4gICAgICAgIGlmIChwYXJzZWQgPT09IG51bGwpIHJldHVybiAwO1xuICAgICAgICBpZiAocGFyc2VkWzJdID09PSBcIlwiIHx8IHBhcnNlZFsxXSA9PT0gMClcbiAgICAgICAgICAgIC8vbm8gemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBlcnJvciwgc28gaW1wbGljYWJsZVxuICAgICAgICAgICAgcmV0dXJuIDA7XG5cbiAgICAgICAgY29uc3QgcGl4ZWxzID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhcnNlZFsyXSwgcGFyc2VkWzFdLCBlbGVtKTtcbiAgICAgICAgcmV0dXJuIHBpeGVscyA9PT0gbnVsbCA/IHBpeGVscyA6IHBhcnNlRmxvYXQocGl4ZWxzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGFic29sdXRlIENTUyBudW1lcmljYWwgdmFsdWVzIHRvIHBpeGVscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1bml0VmFsdWUgaW4gc3RyaW5nXG4gICAgICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXQsIHVuaXRWYWx1ZSwgZWxlbSkge1xuICAgICAgICBpZiAodW5pdFZhbHVlID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgaWYgKCF1bml0KSB1bml0ID0gXCJweFwiO1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRVbml0cyA9IHtcbiAgICAgICAgICAgIC8vIGFic29sdXRlIHVuaXRcbiAgICAgICAgICAgIHB4OiAodmFsdWUpID0+IHZhbHVlLFxuICAgICAgICAgICAgY206ICh2YWx1ZSkgPT4gdmFsdWUgKiAzNy44LFxuICAgICAgICAgICAgbW06ICh2YWx1ZSkgPT4gdmFsdWUgKiAzLjc4LFxuICAgICAgICAgICAgcTogKHZhbHVlKSA9PiB2YWx1ZSAqIDAuOTUsXG4gICAgICAgICAgICBpbjogKHZhbHVlKSA9PiB2YWx1ZSAqIDk2LFxuICAgICAgICAgICAgcGM6ICh2YWx1ZSkgPT4gdmFsdWUgKiAxNixcbiAgICAgICAgICAgIHB0OiAodmFsdWUpID0+IHZhbHVlICogMS4zMyxcblxuICAgICAgICAgICAgLy8gcmVsYXRpdmUgdW5pdFxuICAgICAgICAgICAgcmVtOiAodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgdmFsdWUgKlxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBlbTogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgIHZhbHVlICpcbiAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoXCJmb250LXNpemVcIilcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgdnc6ICh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAodmFsdWUgLyAxMDApICogZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmlubmVyV2lkdGgsXG4gICAgICAgICAgICB2aDogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICh2YWx1ZSAvIDEwMCkgKiBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuaW5uZXJIZWlnaHQsXG4gICAgICAgICAgICBcIiVcIjogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICh2YWx1ZSAvIDEwMCkgKlxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBpZiAodW5pdCBpbiBzdXBwb3J0ZWRVbml0cykgcmV0dXJuIHN1cHBvcnRlZFVuaXRzW3VuaXRdKHVuaXRWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qXG4gICAgICogUmV0dXJucyBpZiB0aGUgZm9udCBmb3IgdmlzaWJsZSB0ZXh0IG9mIHRoZSBlbGVtZW50IGlzIGRlZmluZWQgYnkgbWF0ZXJpYWwgaWNvbnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTWF0ZXJpYWxJY29uRm9udChlbGVtOiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGUgZXhpc3RlbmNlIG1hdGVyaWFsIGljb25zIHVzaW5nIGZldGNoIGluIG5vZGUgMTgrXG4gICAgICAgIC8vIGZvciBub3cgKG5vZGUgMTYpIGp1c3QgZGVydGVybWluZSBpZiB0aGUgc3R5bGVzaGVldCBmb3IgdGhlICdNYXRlcmlhbCBJY29ucycgZXhpc3RzIHN0YXRpY2FsbHkuIG5vdGUgdGhhdCB0aGUgbG9hZGluZyBvZiB0aGUgZm9udCBzdHlsZXNoZWV0IG9jY3VycyBhdCBydW4gdGltZS5cbiAgICAgICAgLy9saXN0IG9mIGtub3duIG1hdGVyaWFsIGljb25zIGFuZCBzdHlsZXNoZWV0IGxpbmtcbiAgICAgICAgY29uc3Qga25vd25faWNvbnMgPSB7XG4gICAgICAgICAgICBcIk1hdGVyaWFsIEljb25zXCI6XG4gICAgICAgICAgICAgICAgXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2ljb24/ZmFtaWx5PU1hdGVyaWFsK0ljb25zXCIsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGtub3duX2Nzc19jbGFzc2VzID0ge1xuICAgICAgICAgICAgXCJtYXRlcmlhbC1pY29uc1wiOlxuICAgICAgICAgICAgICAgIFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG1hdGVyaWFsIGljb24gZm9udCBjYW4gYmUgZGVmaW5lZCBlaXRoZXIgYnkgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucycgb3IgYnkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiXG4gICAgICAgIGxldCBzdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMoZWxlbSwgW1wiZm9udC1mYW1pbHlcIl0pO1xuICAgICAgICBsZXQgZm9udEZhbWlseSA9IHN0eWxlc1tcImZvbnQtZmFtaWx5XCJdO1xuXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAvLyBmb250LWZhbWlseSBzcGVjaWZpZXMgYSBwcmlvcml0aXplZCBsaXN0IG9mIG9uZSBvciBtb3JlIGZvbnQgZmFtaWx5IG5hbWVzXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGZvbnRGYW1pbHkgJiZcbiAgICAgICAgICAgIGZvbnRGYW1pbHkuc3BsaXQoXCIsXCIpWzBdLnJlcGxhY2UoL1snXCJdKy9nLCBcIlwiKS50cmltKCkgaW4ga25vd25faWNvbnNcbiAgICAgICAgKVxuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gZWxlbS5jbGFzc0xpc3Q7XG4gICAgICAgICAgICBmb3IgKGxldCBjc3NfY2xhc3MgaW4ga25vd25fY3NzX2NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdC5jb250YWlucyhjc3NfY2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZm91bmQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzdHlsZXNoZWV0IGZvciB0aGUgJ01hdGVyaWFsIEljb25zJyBleGlzdHMgc3RhdGljYWxseVxuICAgICAgICBsZXQgc2hlZXRzID0gZWxlbS5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzO1xuICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IHNoZWV0cy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNoZWV0cyAmJlxuICAgICAgICAgICAgICAgIHNoZWV0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhrbm93bl9pY29ucykuaW5kZXhPZihzaGVldHNbc10uaHJlZikgPiAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0V2VpZ2h0TnVtYmVyKHN0eWxlVmFsKSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBsaWdodDogMTAwLFxuICAgICAgICAgICAgYm9sZDogNzAwLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmV0VmFsID0gcGFyc2VJbnQoc3R5bGVWYWwpO1xuICAgICAgICBpZiAocmV0VmFsKSByZXR1cm4gcmV0VmFsO1xuICAgICAgICBpZiAoc3R5bGVWYWwgaW4gbWFwKSByZXR1cm4gbWFwW3N0eWxlVmFsXTtcbiAgICAgICAgcmV0dXJuIDQwMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEZvbnRJblBpeGVscyhzdHlsZVZhbCwgZWxlbSkge1xuICAgICAgICBsZXQgbWFwID0ge1xuICAgICAgICAgICAgXCJ4eC1zbWFsbFwiOiAxNixcbiAgICAgICAgICAgIFwieC1zbWFsbFwiOiAxMCxcbiAgICAgICAgICAgIHNtYWxsOiAxMyxcbiAgICAgICAgICAgIG1lZGl1bTogMTYsXG4gICAgICAgICAgICBsYXJnZTogMTgsXG4gICAgICAgICAgICBcIngtbGFyZ2VcIjogMjQsXG4gICAgICAgICAgICBcInh4LWxhcmdlXCI6IDMyLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZUZsb2F0KHN0eWxlVmFsKTtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcFtzdHlsZVZhbF07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVuaXRzID0gc3R5bGVWYWwuc3Vic3RyaW5nKChcIlwiICsgdmFsdWUpLmxlbmd0aCk7XG4gICAgICAgIC8qKlxuICAgICAgICBpZiAodW5pdHMgPT09IFwiXCIgfHwgdW5pdHMgPT09IFwicHhcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikgcmV0dXJuIHZhbHVlICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCIlXCIpIHJldHVybiB2YWx1ZSAvIDEwMCAqIDE2O1xuICAgICAgICBpZiAodW5pdHMgPT09IFwicHRcIikgcmV0dXJuIHZhbHVlICogNCAvIDM7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAqL1xuICAgICAgICByZXR1cm4gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXRzLCB2YWx1ZSwgZWxlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDU1NTdHlsZShlbGVtZW50KSB7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoZWxlbWVudC5JQk1fQ1NTX1RIQikgcmV0dXJuIGVsZW1lbnQuSUJNX0NTU19USEI7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHN0eWxlVGV4dCA9PT0gdW5kZWZpbmVkIHx8IHN0eWxlVGV4dC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgICB9IGVsc2UgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoc3R5bGVUZXh0ID09PSBudWxsIHx8IHN0eWxlVGV4dC50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICAgIC8vcmVtb3ZlIGNvbW1lbnQgYmxvY2tzXG4gICAgICAgIGxldCByZSA9IC8oXFwvXFwqKyg/Oig/Oig/OlteXFwqXSkrKXwoPzpbXFwqXSsoPyFcXC8pKSlbKl0rXFwvKXxcXC9cXC8uKi9nO1xuICAgICAgICBsZXQgc3Vic3QgPSBcIiBcIjtcbiAgICAgICAgc3R5bGVUZXh0ID0gc3R5bGVUZXh0LnJlcGxhY2UocmUsIHN1YnN0KTtcbiAgICAgICAgLy8gRmluZCBhbGwgXCJrZXkgOiB2YWw7XCIgcGFpcnMgd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgICAgIGxldCByS2V5VmFscyA9IC9cXHMqKFteOlxcc10rKVxccyo6XFxzKihbXjskfV0rKVxccyooO3wkKS9nO1xuICAgICAgICAvLyBGaW5kIGFsbCBcInNlbGVjdG9yIHsgY3Nza2V5dmFscyB9IHdpdGggdmFyaW91cyB3aGl0ZXNwYWNlIGluYmV0d2VlblxuICAgICAgICBsZXQgclNlbGVjdG9ycyA9IC9cXHMqKFtee10qKXsoW159XSopfS9nO1xuICAgICAgICBpZiAoc3R5bGVUZXh0LmluZGV4T2YoXCJ7XCIpID09PSAtMSkge1xuICAgICAgICAgICAgbGV0IGtleVZhbHMgPSB7fTtcbiAgICAgICAgICAgIGxldCBtO1xuICAgICAgICAgICAgd2hpbGUgKChtID0gcktleVZhbHMuZXhlYyhzdHlsZVRleHQpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAga2V5VmFsc1ttWzFdXSA9IG1bMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczoga2V5VmFscyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGVsZW1lbnQuSUJNX0NTU19USEIgPSByZXRWYWw7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICBsZXQgbTI7XG4gICAgICAgICAgICB3aGlsZSAoKG0gPSByU2VsZWN0b3JzLmV4ZWMoc3R5bGVUZXh0KSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBrZXlWYWxzID0ge307XG4gICAgICAgICAgICAgICAgbGV0IHNlbEtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgbGV0IHNlbFZhbCA9IG1bMl07XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoKG0yID0gcktleVZhbHMuZXhlYyhzZWxWYWwpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHNbbTJbMV1dID0gbTJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbEtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBrZXlWYWxzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudC5JQk1fQ1NTX1RIQiA9IHJldFZhbDtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBhbiBcImlubGluZVwiIENTUyBkaXNwbGF5IHByb3BlcnR5IHRlbGxzIHRoZSBlbGVtZW50IHRvIGZpdCBpdHNlbGYgb24gdGhlIHNhbWUgbGluZS4gQW4gJ2lubGluZScgZWxlbWVudCdzIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGlnbm9yZWQuXG4gICAgICogc29tZSBlbGVtZW50IGhhcyBkZWZhdWx0IGlubGluZSBwcm9wZXJ0eSwgc3VjaCBhcyA8c3Bhbj4sIDxhPlxuICAgICAqIG1vc3QgZm9ybWF0dGluZyBlbGVtZW50cyBpbmhlcmVudCBpbmxpbmUgcHJvcGVydHksIHN1Y2ggYXMgPGVtPiwgPHN0cm9uZz4sIDxpPiwgPHNtYWxsPlxuICAgICAqIG90aGVyIGlubGluZSBlbGVtZW50czogPGFiYnI+IDxhY3JvbnltPiA8Yj4gPGJkbz4gPGJpZz4gPGJyPiA8Y2l0ZT4gPGNvZGU+IDxkZm4+IDxlbT4gPGk+IDxpbnB1dD4gPGtiZD4gPGxhYmVsPlxuICAgICAqIDxtYXA+IDxvYmplY3Q+IDxvdXRwdXQ+IDxxPiA8c2FtcD4gPHNjcmlwdD4gPHNlbGVjdD4gPHNtYWxsPiA8c3Bhbj4gPHN0cm9uZz4gPHN1Yj4gPHN1cD4gPHRleHRhcmVhPiA8dGltZT4gPHR0PiA8dmFyPlxuICAgICAqIGFuIFwiaW5saW5lLWJsb2NrXCIgZWxlbWVudCBzdGlsbCBwbGFjZSBlbGVtZW50IGluIHRoZSBzYW1lIGxpbmUgd2l0aG91dCBicmVha2luZyB0aGUgbGluZSwgYnV0IHRoZSBlbGVtZW50J3Mgd2lkdGggYW5kIGhlaWdodCBhcmUgYXBwbGllZC5cbiAgICAgKiBpbmxpbmUtYmxvY2sgZWxlbWVudHM6IGltZywgYnV0dG9uLCBzZWxlY3QsIG1ldGVyLCBwcm9ncmVzcywgbWFyZ3VlZSwgYWxzbyBpbiBDaHJvbWU6IHRleHRhcmVhLCBpbnB1dFxuICAgICAqIEEgYmxvY2stbGV2ZWwgZWxlbWVudCBhbHdheXMgc3RhcnRzIG9uIGEgbmV3IGxpbmUsIGFuZCB0aGUgYnJvd3NlcnMgYXV0b21hdGljYWxseSBhZGQgc29tZSBzcGFjZSAoYSBtYXJnaW4pIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGVsZW1lbnQuXG4gICAgICogYmxvY2stbGV2ZWwgZWxlbWVudHM6IDxhZGRyZXNzPiA8YXJ0aWNsZT4gPGFzaWRlPiA8YmxvY2txdW90ZT4gPGNhbnZhcz4gPGRkPiA8ZGl2PiA8ZGw+IDxkdD4gPGZpZWxkc2V0PiA8ZmlnY2FwdGlvbj4gPGZpZ3VyZT4gPGZvb3Rlcj4gPGZvcm0+XG4gICAgICogPGgxPi08aDY+IDxoZWFkZXI+IDxocj4gPGxpPiA8bWFpbj4gPG5hdj4gPG5vc2NyaXB0PiA8b2w+IDxwPiA8cHJlPiA8c2VjdGlvbj4gPHRhYmxlPiA8dGZvb3Q+IDx1bD4gPHZpZGVvPlxuICAgICAqXG4gICAgICogcmV0dXJuOiBpZiBpdCdzIGlubGluZSBlbGVtZW50IGFuZCB7IGlubGluZTogdHJ1ZSB8IGZhbHNlLCB0ZXh0OiB0cnVlIHwgZmFsc2UsIHZpb2xhdGlvbjogbnVsbCB8IHtub2RlfSB9XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbmxpbmVTdGF0dXMoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGVsZW1fc3R5bCA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgICAgIGlmICghZWxlbV9zdHlsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgc3RhdHVzID0geyBpbmxpbmU6IGZhbHNlLCB0ZXh0OiBmYWxzZSwgdmlvbGF0aW9uOiBudWxsIH07XG4gICAgICAgIGNvbnN0IHVkaXNwbGF5ID0gZWxlbV9zdHlsLmdldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5XCIpO1xuICAgICAgICAvLyBpbmxpbmUgZWxlbWVudCBvbmx5XG4gICAgICAgIGlmICh1ZGlzcGxheSAhPT0gXCJpbmxpbmVcIikgcmV0dXJuIHN0YXR1cztcblxuICAgICAgICBzdGF0dXMuaW5saW5lID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIHN0YXR1cztcblxuICAgICAgICBjb25zdCBtYXBwZXI6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpO1xuICAgICAgICBjb25zdCBkaXNwbGF5ID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7XG4gICAgICAgIC8vIGFuIGlubGluZSBlbGVtZW50IGlzIGluc2lkZSBhIGJsb2NrLiBub3RlIDxib2R5PiBpcyBhIGJsb2NrIGVsZW1lbnQgdG9vXG4gICAgICAgIGlmIChkaXNwbGF5ICE9PSBcImJsb2NrXCIgJiYgZGlzcGxheSAhPT0gXCJpbmxpbmUtYmxvY2tcIikge1xuICAgICAgICAgICAgLy9wYXJlbnQgaXMgaW5saW5lIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybnMgXCJ5ZXNcIlwiOiBpbmxpbmUgd2l0aCB0ZXh0LCBcIm5vXCI6IGlubGluZSB3aXRob3V0IHRleHQsIFxuICAgICAgICAgKiAgICAgICAgICBcInZpb2xhdGlvblwiOiBub3Qgc3BhY2luZyBlbm91Z2ggdG8gbmVpYm9yaW5nIGlubGluZSB0YXJnZXRcbiAgICAgICAgICogICAgICAgICAgXCJibG9ja1wiOiBibG9jayBlbGVtZW50LCAgXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBpc0lubGluZVdpdGhUZXh0KG5vZGU6IE5vZGUsIGJlZm9yZTogYm9vbGVhbikgOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgICAgIC8vIG5vdGUgYnJvd3NlcnMgaW5zZXJ0IFRleHQgbm9kZXMgdG8gcmVwcmVzZW50IHdoaXRlc3BhY2VzLlxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVZhbHVlICYmIG5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ5ZXNcIjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5vXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiA8YnI+IGlzIHN0eWxlZCAnaW5saW5lJyBieSBkZWZhdWx0LCBidXQgY2hhbmdlIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJiclwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBjU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY0Rpc3BsYXkgPSBjU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7XG4gICAgICAgICAgICAgICAgaWYgKGNEaXNwbGF5ID09PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFyZ2V0KG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoIDwgMjQpIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGhvcml6b250YWwgc3BhY2luZyBpcyBzdWZmaWNpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYmVmb3JlICYmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCAvIDIpICsgYm91bmRzLmxlZnQgLSBibmRzLmxlZnQgPCAyNCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghYmVmb3JlICYmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCAvIDIpICsgYm91bmRzLmxlZnQgLSAoYm5kcy5sZWZ0ICsgYm5kcy53aWR0aCkgPCAyNCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy52aW9sYXRpb24gPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcInZpb2xhdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJub1wiOyAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzSW5uZXJUZXh0T25seUVtcHR5KG5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwieWVzXCI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5vXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbiBpbmxpbmUgZWxlbWVudCBpcyBpbnNpZGUgYSBibG9jay4gbm90ZSA8Ym9keT4gaXMgYSBibG9jayBlbGVtZW50IHRvb1xuICAgICAgICAvLyBvbmUgb3IgbW9yZSBpbmxpbmUgZWxlbWVudHMgd2l0aCB0ZXh0IGluIHRoZSBzYW1lIGxpbmU6IDx0YXJnZXQ+LCB0ZXh0PHRhcmdldD4sIDx0YXJnZXQ+dGV4dCwgPGlubGluZT4rdGV4dDx0YXJnZXQ+LCA8dGFyZ2V0PjxpbmxpbmU+K3RleHQsIHRleHQ8dGFyZ2V0PjxpbmxpbmU+K1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBlbGVtZW50Lm5leHRTaWJsaW5nO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGxldCBpbmxpbmVUZXh0ID0gaXNJbmxpbmVXaXRoVGV4dCh3YWxrTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaW5saW5lVGV4dCA9PT0gXCJ5ZXNcIikge1xuICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0ID09PSBcImJsb2NrXCIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGxldCBpbmxpbmVUZXh0ID0gaXNJbmxpbmVXaXRoVGV4dCh3YWxrTm9kZSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGlubGluZVRleHQgPT09IFwieWVzXCIpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMudGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5saW5lVGV4dCA9PT0gXCJibG9ja1wiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGEgdGFyZ2V0IGlzIGVuIGVsZW1lbnQgdGhhdCBhY2NlcHQgYSBwb2ludGVyIGFjdGlvbiAoY2xpY2sgb3IgdG91Y2gpXG4gICAgICogYSB0YXJnZXQgaXMgYSBicm93c2VyIGRlZmF1bHQgaWYgaXQncyBhIG5hdGl2ZSB3aWRnZXQgKG5vIHVzZXIgZGVmaW5lZCByb2xlKSB3aXRob3V0IHVzZXIgc3R5bGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFyZ2V0QnJvd3NlckRlZmF1bHQoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyB1c2VyIGRlZmluZWQgd2lkZ2V0XG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIG5vIHVzZXIgc3R5bGUgdG8gc3BhY2UgY29udHJvbCBzaXplLCBpbmNsdWRpbmcgdXNlIG9mIGZvbnRcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzKGVsZW1lbnQsIFtcbiAgICAgICAgICAgIFwibGluZS1oZWlnaHRcIiwgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiLFwibWluLWhlaWdodFwiLCBcIm1pbi13aWR0aFwiLFxuICAgICAgICAgICAgXCJmb250LXNpemVcIixcIm1hcmdpbi10b3BcIixcIm1hcmdpbi1ib3R0b21cIiwgXCJtYXJnaW4tbGVmdFwiLCBcIm1hcmdpbi1yaWdodFwiXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdHlsZXNbXCJsaW5lLWhlaWdodFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wiaGVpZ2h0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJ3aWR0aFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWluLWhlaWdodFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWluLXdpZHRoXCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJmb250LXNpemVcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi10b3BcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi1ib3R0b21cIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi1sZWZ0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJtYXJnaW4tcmlnaHRcIl1cbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogc3RyaW5nIGNvbnRhaW5zIENKSyAoY2hpbmVzZSwgamFwYW5lc2VzLCBvciBrb3JlYSlcbiAgICAgKiByZXR1cm46IGJvb2xlYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zQ0tKKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRleHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DSktfVW5pZmllZF9JZGVvZ3JhcGhzICBodHRwczovL2F5YWthLnNobi5oay9oYW5yZWdleC9cbiAgICAgICAgbGV0IHJlZ2V4ID0gLyg/OltcXHU0ZTAwLVxcdTlmZmZcXHUzNDAwLVxcdTRkYmZdKSsvZztcblxuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHRleHQudHJpbSgpLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuICAgICAgICBpZiAocmVwbGFjZWQubGVuZ3RoID09PSB0ZXh0LnRyaW0oKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGFuY2VzdG9yIHdpdGggdGhlIGdpdmVuIHN0eWxlIHByb3BlcnRpZXMuXG4gICAgICogU2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgYW4gYW5jZXN0b3IgdGhhdCBoYXMgQUxMIHNwZWNpZmllZCBzdHlsZSBwcm9wZXJ0aWVzXG4gICAgICogd2l0aCB2YWx1ZXMgbWF0Y2hpbmcgdGhlIGNyaXRlcmlhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtlbGVtZW50fSBlbGVtIC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0eWxlUHJvcHMgLSBUaGUgc3R5bGUgcHJvcGVydGllcyBhbmQgdmFsdWVzIG9mIHRoZSBwYXJlbnQgdG8gc2VhcmNoIGZvci5cbiAgICAgKiAgICAgICAgIHN1Y2ggYXMge1wib3ZlcmZsb3dcIjpbJ2F1dG8nLCAnc2Nyb2xsJ10sIFwib3ZlcmZsb3cteFwiOlsnYXV0bycsICdzY3JvbGwnXX1cbiAgICAgKiAgICAgICAgICBvciB7XCJvdmVyZmxvd1wiOlsnKiddLCBcIm92ZXJmbG93LXhcIjpbJyonXX0sIFRoZSAnKicgZm9yIGFueSB2YWx1ZSB0byBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIHRoZSBzdHlsZSBwcm9wLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGV4Y2x1ZGVkVmFsdWVzIC0gc3R5bGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQuXG4gICAgICogQHJldHVybiB7RWxlbWVudHxudWxsfSAtIEFuIGFuY2VzdG9yIGVsZW1lbnQgdGhhdCBoYXMgYWxsIHRoZSBzcGVjaWZpZWQgc3R5bGUgcHJvcGVydGllcywgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICogQG1lbWJlck9mIENTU1V0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFN0eWxlcyhlbGVtLCBzdHlsZVByb3BzLCBleGNsdWRlZFZhbHVlcyA9IFtdKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNhY2hlIGtleSB0aGF0IGluY2x1ZGVzIHRoZSBzdHlsZSBwcm9wZXJ0aWVzIGJlaW5nIHNlYXJjaGVkIGZvclxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IFwiQXJpYVV0aWxfQW5jZXN0b3JXaXRoU3R5bGVzX1wiICsgSlNPTi5zdHJpbmdpZnkoc3R5bGVQcm9wcykgKyBcIl9cIiArIEpTT04uc3RyaW5naWZ5KGV4Y2x1ZGVkVmFsdWVzKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGNhY2hlZCByZXN1bHQgZm9yIHRoaXMgc3BlY2lmaWMgcXVlcnlcbiAgICAgICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIGNhY2hlS2V5LCBudWxsKTtcbiAgICAgICAgaWYgKGNhY2hlZFJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdCA9PT0gXCJOT1RfRk9VTkRcIiA/IG51bGwgOiBjYWNoZWRSZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFydCB3aXRoIHRoZSBlbGVtZW50IGl0c2VsZiAobm90IGp1c3QgcGFyZW50KSB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IGVsZW07XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gU2tpcCBpZiBub3QgYW4gSFRNTEVsZW1lbnQgKGUuZy4sIFNWR0VsZW1lbnQpXG4gICAgICAgICAgICAvLyBVc2Ugbm9kZVR5cGUgY2hlY2sgaW5zdGVhZCBvZiBpbnN0YW5jZW9mIHRvIHdvcmsgYWNyb3NzIGRpZmZlcmVudCBkb2N1bWVudCBjb250ZXh0c1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVUeXBlICE9PSAxIHx8IHdhbGtOb2RlLm5hbWVzcGFjZVVSSSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiKSB7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyh3YWxrTm9kZSwgT2JqZWN0LmtleXMoc3R5bGVQcm9wcykpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBBTlkgc3BlY2lmaWVkIHN0eWxlIHByb3BlcnR5IG1hdGNoZXMgdGhlIGNyaXRlcmlhIChPUiBsb2dpYylcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGVQcm9wIGluIHN0eWxlUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBzdHlsZXNbc3R5bGVQcm9wXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByb3BlcnR5IG5vdCBkZWZpbmVkIG9uIHRoaXMgZWxlbWVudCwgdHJ5IG5leHQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSAhaW1wb3J0YW50IHN1ZmZpeCBmb3IgY29tcGFyaXNvblxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZhbHVlIHNob3VsZCBiZSBleGNsdWRlZFxuICAgICAgICAgICAgICAgIGlmIChleGNsdWRlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZhbHVlIG1hdGNoZXMgdGhlIGNyaXRlcmlhXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRWYWx1ZXMgPSBzdHlsZVByb3BzW3N0eWxlUHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkVmFsdWVzLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQW55IHZhbHVlIGlzIGFjY2VwdGFibGUgKGp1c3QgY2hlY2tpbmcgZXhpc3RlbmNlKVxuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgY2FjaGVLZXksIHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0ZWRWYWx1ZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFZhbHVlIG1hdGNoZXMgb25lIG9mIHRoZSBhY2NlcHRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIGNhY2hlS2V5LCB3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBObyBtYXRjaGluZyBlbGVtZW50IG9yIGFuY2VzdG9yIGZvdW5kIC0gY2FjaGUgdGhpcyByZXN1bHQgdG8gYXZvaWQgcmUtc2VhcmNoaW5nXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBjYWNoZUtleSwgXCJOT1RfRk9VTkRcIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBhbiBhcnJheSBbdmFsdWUsIFVuaXRdIGZyb20gYSB2YWx1ZS11bml0IGNvbWJvIHN0cmluZ1xuICAgICAqIEBwYXJhbSB2YWx1ZVVuaXRDb21ibywgc3VjaCBhcyAyMHB4LCAycmVtIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VmFsdWVVbml0UGFpcih2YWx1ZVVuaXRDb21ibykge1xuICAgICAgICBpZiAoIXZhbHVlVW5pdENvbWJvKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZVVuaXRDb21ibykpIHJldHVybiBbXCJweFwiLCB2YWx1ZVVuaXRDb21ib107XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUludCh2YWx1ZVVuaXRDb21ibyk7XG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHZhbHVlVW5pdENvbWJvID0gdmFsdWVVbml0Q29tYm8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBtYXRjaCA9IHZhbHVlVW5pdENvbWJvLnRyaW0oKS5tYXRjaCgvKFthLXpdKykkLyk7XG4gICAgICAgIGxldCB1bml0ID0gJ3B4JztcbiAgICAgICAgaWYgKG1hdGNoKSB1bml0ID0gbWF0Y2hbMV07XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gW3VuaXQsIHZhbHVlXTtcbiAgICB9XG5cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlRG9jdW1lbnQgZXh0ZW5kcyBEb2N1bWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cblxuZXhwb3J0IGNsYXNzIENhY2hlVXRpbCB7XG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZ2xvYmFsIHZhcmlhYmxlXG4gICAgICAgICAqIHdpdGggaXRzIGluaXRpYWwgdmFsdWUgYXMgZ2l2ZW4gKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENhY2hlKGNhY2hlU3BvdDogRWxlbWVudCB8IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwga2V5TmFtZSwgaW5pdFZhbHVlKSB7XG4gICAgICAgIGlmICghY2FjaGVTcG90KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY2FjaGVPYmogPSAoY2FjaGVTcG90Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLyB8fCBjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLykgPyBjYWNoZVNwb3QgYXMgQ2FjaGVEb2N1bWVudCA6IGNhY2hlU3BvdCBhcyBDYWNoZUVsZW1lbnQ7XG4gICAgICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjYWNoZU9iai5hY2VDYWNoZSA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID0gaW5pdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Q2FjaGUoY2FjaGVTcG90OiBEb2N1bWVudCB8IEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgU2hhZG93Um9vdCwgZ2xvYmFsTmFtZSwgdmFsdWUpOiBhbnkge1xuICAgICAgICBpZiAoIWNhY2hlU3BvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgICAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2dsb2JhbE5hbWVdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFNldENhY2hlKGNhY2hlU3BvdDogRWxlbWVudCB8IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwga2V5TmFtZSwgaW5pdEZ1bmM6ICgpID0+IGFueSkge1xuICAgICAgICBpZiAoIWNhY2hlU3BvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgICAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGVba2V5TmFtZV0gPSBpbml0RnVuYygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJDYWNoZXMoY2FjaGVSb290OiBOb2RlKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IG51bU5vZGVzVmlzaXRlZCA9IDA7XG4gICAgICAgIGRlbGV0ZSAoY2FjaGVSb290Lm93bmVyRG9jdW1lbnQgYXMgQ2FjaGVEb2N1bWVudCkuYWNlQ2FjaGU7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoY2FjaGVSb290LCBmYWxzZSwgY2FjaGVSb290LCB0cnVlKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgKytudW1Ob2Rlc1Zpc2l0ZWQ7XG4gICAgICAgICAgICBkZWxldGUgKG53Lm5vZGUgYXMgQ2FjaGVFbGVtZW50KS5hY2VDYWNoZTtcbiAgICAgICAgICAgIG53Lm5vZGUub3duZXJEb2N1bWVudCAmJiBkZWxldGUgKG53Lm5vZGUub3duZXJEb2N1bWVudCBhcyBDYWNoZURvY3VtZW50KS5hY2VDYWNoZTtcbiAgICAgICAgfSB3aGlsZSAobncubmV4dE5vZGUoKSk7XG4gICAgICAgIGlmIChjYWNoZVJvb3QgIT09IGNhY2hlUm9vdC5vd25lckRvY3VtZW50Py5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSB3YWxrZXIgYXQgdGhlIGRvY3VtZW50RWxlbWVudCBvZiBjYWNoZVJvb3QncyBpbW1lZGlhdGUgZG9jdW1lbnQuXG4gICAgICAgICAgICAvLyBvd25lckRvY3VtZW50IGlzIGd1YXJhbnRlZWQgbm9uLW51bGwgaGVyZSBiZWNhdXNlIHRoZSBpZi1ndWFyZCBhYm92ZVxuICAgICAgICAgICAgLy8gY2hlY2tzIGNhY2hlUm9vdC5vd25lckRvY3VtZW50Py5kb2N1bWVudEVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgbndEb2MgPSBuZXcgRE9NV2Fsa2VyKGNhY2hlUm9vdC5vd25lckRvY3VtZW50IS5kb2N1bWVudEVsZW1lbnQsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICAgICAgLy8gY2FjaGVSb290IG1heSBiZSBpbnNpZGUgYSBzaGFkb3cgcm9vdCBvciBhbiBpZnJhbWUsIHdoaWNoIGFyZSB0aGVtc2VsdmVzXG4gICAgICAgICAgICAvLyBuZXN0ZWQgaW5zaWRlIGFuY2VzdG9yIGRvY3VtZW50cy4gV2FsayB1cCBmcm9tIGNhY2hlUm9vdCBhY3Jvc3MgYW55XG4gICAgICAgICAgICAvLyBmcmFtZS9zaGFkb3cgYm91bmRhcmllcyAoRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQgaGFuZGxlcyBvd25lckVsZW1lbnRcbiAgICAgICAgICAgIC8vIGxpbmtzIHNldCBieSB0aGUgd2Fsa2VyKSB0byBmaW5kIHRoZSBvdXRlcm1vc3QgYW5jZXN0b3IgZWxlbWVudCwgdGhlblxuICAgICAgICAgICAgLy8gcmVwb3NpdGlvbiB0aGUgd2Fsa2VyIHRoZXJlIHNvIHRoZSBzZWNvbmQgcGFzcyBjb3ZlcnMgZXZlcnkgY29udGFpbmluZ1xuICAgICAgICAgICAgLy8gZG9jdW1lbnQgYXMgd2VsbC5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVtcEVsZW06IEVsZW1lbnQgPSBud0RvYy5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEVsZW06IEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnRFbGVtID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQodGVtcEVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBFbGVtID0gcGFyZW50RWxlbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbndEb2Mubm9kZSA9IHRlbXBFbGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIC8vIE9uIHRoZSBzdGFydC10YWcgdmlzaXQgb2YgY2FjaGVSb290LCBza2lwIGl0cyBlbnRpcmUgc3VidHJlZSDigJRcbiAgICAgICAgICAgICAgICAvLyBpdCB3YXMgYWxyZWFkeSBjbGVhcmVkIGFuZCBjb3VudGVkIGluIHRoZSBmaXJzdCBwYXNzIGFib3ZlLlxuICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgYkVuZFRhZz10cnVlIG1ha2VzIHRoZSBuZXh0IG5leHROb2RlKCkgY2FsbCBlbWl0IGNhY2hlUm9vdCdzXG4gICAgICAgICAgICAgICAgLy8gZW5kLXRhZyBhbmQgdGhlbiBhZHZhbmNlIHRvIGl0cyBuZXh0IHNpYmxpbmcgd2l0aG91dCBkZXNjZW5kaW5nIGludG9cbiAgICAgICAgICAgICAgICAvLyBpdHMgY2hpbGRyZW4uXG4gICAgICAgICAgICAgICAgaWYgKCFud0RvYy5iRW5kVGFnICYmIERPTVV0aWwuc2FtZU5vZGUoY2FjaGVSb290LCBud0RvYy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBud0RvYy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSAobndEb2Mubm9kZSBhcyBhbnkpLmFjZUNhY2hlO1xuICAgICAgICAgICAgICAgIG53RG9jLm5vZGUub3duZXJEb2N1bWVudCAmJiBkZWxldGUgKG53RG9jLm5vZGUub3duZXJEb2N1bWVudCBhcyBhbnkpLmFjZUNhY2hlO1xuICAgICAgICAgICAgfSB3aGlsZSAobndEb2MubmV4dE5vZGUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVtTm9kZXNWaXNpdGVkO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4vQ1NTVXRpbFwiO1xuXG5leHBvcnQgY2xhc3MgQ2xpcFBhdGhVdGlsIHtcbiAgICBcbiAgICBwcml2YXRlIHN0YXRpYyBUSFJFU0hPTEQgOiBudW1iZXIgPSA1OyAgLy8gNXB4XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgdGhlIG5vZGUgdGhhdCBpcyB2aXN1YWxseSBoaWRkZW4gYnkgY3NzIGNsaXAtcGF0aDpcbiAgICAgKlxuICAgICAqIE5vdGUgMTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgdmlzdWFsbHkgaGlkZGVuIHRoZW4gdGhpc1xuICAgICAqICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRydWUgKG5vZGUgaXMgbm90IHZpc3VhbGx5IGhpZGRlbikuXG4gICAgICpcbiAgICAgKiBOb3RlIDI6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgY2xpcC1wYXRoLCB0aGUgY29udGVudCBpcyBub3QgY29uc2lkZXJlZCBoaWRkZW4gdG8gYW4gQVQuIFRleHQgaGlkZGVuIHdpdGggdGhlc2UgbWV0aG9kcyBcbiAgICAgKiAgICAgIGNhbiBzdGlsbCBiZSByZWVkYWJsZSBieSBzY3JlZW4gcmVhZGVycy4gXG4gICAgICogTm90ZSAzOiBpZiBhIGxpbmssIGZvcm0gY29udHJvbCwgb3Igb3RoZXIgZm9jdXNhYmxlIGVsZW1lbnQgaXMgZ2l2ZW4gdGhpcyBzdHlsZSwgdGhlIGVsZW1lbnQgd291bGQgYmUgZm9jdXNhYmxlIGJ1dCBub3QgdmlzaWJsZSwgXG4gICAgICogICAgICBrZXlib2FyZCB1c2VycyBtaWdodCBiZSBjb25mdXNlZC4gICAgXG4gICAgICogXG4gICAgICogQHBhcm0ge05vZGV9IG5vZGUgVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaWYgaXQgaXMgdmlzdWFsbHkgaGlkZGVuIG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIHRoZSBub2RlIGlzIHZpc3VhbGx5IGhpZGRlbiwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgVmlzVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlVmlzdWFsbHlIaWRkZW5CeUNsaXBQYXRoKG5vZGU6IE5vZGUpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBsZXQgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBoaWRkZW4gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoaGlkZGVuICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gaGlkZGVuO1xuICAgICAgICAgICAgXG4gICAgICAgIGNvbnN0IHN0eWxlID0gQ1NTVXRpbC5nZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KHN0eWxlLndpZHRoKTsgIC8vYWx3YXlzIGluIHB4XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHBhcnNlSW50KHN0eWxlLmhlaWdodCk7IC8vYWx3YXlzIGluIHB4XG5cbiAgICAgICAgbGV0IHBhdGggPSBzdHlsZVsnY2xpcC1wYXRoJ107IFxuICAgICAgICBpZiAoIXBhdGggfHwgcGF0aC50cmltKCkgPT09ICdub25lJyB8fCBwYXRoLnRyaW0oKSA9PT0gJycpICB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHBhdGggPSBwYXRoLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcgJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBpbmRleCA9IHBhdGguaW5kZXhPZihcImluc2V0KFwiKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgeyBcbiAgICAgICAgICAgIGxldCByb3VuZF9pbmRleCA9IHBhdGguaW5kZXhPZihcInJvdW5kXCIpO1xuICAgICAgICAgICAgbGV0IHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBpZiAocm91bmRfaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcm91bmRfaW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgLy8gV2hlbiBvbmUgdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCBhcHBsaWVzIHRoZSBzYW1lIGluc2V0IHRvIGFsbCBmb3VyIHNpZGVzXG4gICAgICAgICAgICBpZiAobnVtYmVycy5sZW5ndGggPT09IDEpICB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gQ2xpcFBhdGhVdGlsLmlzQ2xpcHBlZEJ5SW5zZXQoZWxlbSwgbnVtYmVyc1swXSwgbnVtYmVyc1swXSwgbnVtYmVyc1swXSwgbnVtYmVyc1swXSk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgcmV0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXaGVuIHR3byB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIGZpcnN0IHZhbHVlIGFwcGxpZXMgdG8gdGhlIHRvcCBhbmQgYm90dG9tLCB0aGUgc2Vjb25kIHRvIHRoZSBsZWZ0IGFuZCByaWdodC5cbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA9PT0gMikgeyBcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBDbGlwUGF0aFV0aWwuaXNDbGlwcGVkQnlJbnNldChlbGVtLCBudW1iZXJzWzBdLCBudW1iZXJzWzFdLCBudW1iZXJzWzBdLCBudW1iZXJzWzFdKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdoZW4gdGhyZWUgdmFsdWVzIGFyZSBzcGVjaWZpZWQsIHRoZSBmaXJzdCBhcHBsaWVzIHRvIHRoZSB0b3AsIHRoZSBzZWNvbmQgdG8gdGhlIHJpZ2h0IGFuZCBsZWZ0LCB0aGUgdGhpcmQgdG8gdGhlIGJvdHRvbS5cbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IENsaXBQYXRoVXRpbC5pc0NsaXBwZWRCeUluc2V0KGVsZW0sIG51bWJlcnNbMF0sIG51bWJlcnNbMV0sIG51bWJlcnNbMV0sIG51bWJlcnNbMl0pOyBcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7IFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXaGVuIGZvdXIgdmFsdWVzIGFyZSBzcGVjaWZpZWQsIHRoZSB2YWx1ZXMgYXBwbHkgdG8gdGhlIHRvcCwgcmlnaHQsIGJvdHRvbSwgYW5kIGxlZnQgaW4gdGhhdCBvcmRlciAoY2xvY2t3aXNlKS5cbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IENsaXBQYXRoVXRpbC5pc0NsaXBwZWRCeUluc2V0KGVsZW0sIG51bWJlcnNbMF0sIG51bWJlcnNbMV0sIG51bWJlcnNbMl0sIG51bWJlcnNbM10pOyBcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9ICAgICBcblxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpbmRleCA9IHBhdGguaW5kZXhPZihcInJlY3QoXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgcm91bmRfaW5kZXggPSBwYXRoLmluZGV4T2YoXCJyb3VuZFwiKTtcbiAgICAgICAgICAgIGxldCBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgaWYgKHJvdW5kX2luZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHJvdW5kX2luZGV4KTtcblxuICAgICAgICAgICAgbGV0IG51bWJlcnMgPSBzdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgZmlyc3QgKHRvcCkgYW5kIHRoaXJkIChib3R0b20pIHZhbHVlcyBhcmUgZGlzdGFuY2VzIGZyb20gdGhlIHRvcCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrLCBcbiAgICAgICAgICAgICAqIGFuZCB0aGUgc2Vjb25kIChyaWdodCkgYW5kIGZvdXJ0aCAobGVmdCkgdmFsdWVzIGFyZSBkaXN0YW5jZXMgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrLiBcbiAgICAgICAgICAgICAqIFRoZSBzZWNvbmQgKHJpZ2h0KSBhbmQgdGhpcmQgKGJvdHRvbSkgdmFsdWVzIGFyZSBjbGFtcGVkIGJ5IHRoZSBmb3VydGggKGxlZnQpIGFuZCBmaXJzdCAodG9wKSB2YWx1ZXMsIHJlc3BlY3RpdmVseSwgXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogSWYgYXV0byBpcyB1c2VkIGZvciB0aGUgZmlyc3QgKHRvcCkgb3IgZm91cnRoIChsZWZ0KSB2YWx1ZSwgdGhlIHZhbHVlIG9mIGF1dG8gaXMgMCwgXG4gICAgICAgICAgICAgKiBhbmQgaWYgdXNlZCBmb3IgdGhlIHNlY29uZCAocmlnaHQpIG9yIHRoaXJkIChib3R0b20pIHZhbHVlLCB0aGUgdmFsdWUgb2YgYXV0byBpcyAxMDAlLlxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdPT09J2F1dG8nKSBudW1iZXJzWzBdID0gJzBweCc7XG4gICAgICAgICAgICBpZiAobnVtYmVyc1szXT09PSdhdXRvJykgbnVtYmVyc1szXSA9ICcwcHgnO1xuICAgICAgICAgICAgaWYgKG51bWJlcnNbMV09PT0nYXV0bycpIG51bWJlcnNbMV0gPSAnMTAwJSc7XG4gICAgICAgICAgICBpZiAobnVtYmVyc1syXT09PSdhdXRvJykgbnVtYmVyc1syXSA9ICcxMDAlJztcblxuICAgICAgICAgICAgLy8gdG8gcHJldmVudCB0aGUgYm90dG9tIGVkZ2UgZnJvbSBjcm9zc2luZyBvdmVyIHRoZSB0b3AgZWRnZSBhbmQgcmlnaHQgZWRnZSBmcm9tIGNyb3NzaW5nIG92ZXIgdGhlIGxlZnQgZWRnZS4gXG4gICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgcmVjdCgxMHB4IDAgMCAyMHB4KSBpcyBjbGFtcGVkIHRvIHJlY3QoMTBweCAyMHB4IDEwcHggMjBweClcbiAgICAgICAgICAgIG51bWJlcnNbMl0gPSBNYXRoLm1heChudW1iZXJzWzBdLCBudW1iZXJzWzJdKTtcbiAgICAgICAgICAgIG51bWJlcnNbMV0gPSBNYXRoLm1heChudW1iZXJzWzFdLCBudW1iZXJzWzNdKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgdG9wID0gcGFyc2VJbnQobnVtYmVyc1swXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4odG9wKSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICB0b3AgPSB0b3AgKiBoZWlnaHQvMTAwO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIodG9wKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRvcCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAodG9wID49IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gcGFyc2VJbnQobnVtYmVyc1szXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4obGVmdCkpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobnVtYmVyc1szXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQgKiB3aWR0aC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihsZWZ0KTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxlZnQgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGVmdCA+PSB3aWR0aCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCByaWdodCA9IHBhcnNlSW50KG51bWJlcnNbMV0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHJpZ2h0KSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzFdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0ICogd2lkdGgvMTAwO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmlnaHQpO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmlnaHQgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBib3R0b20gPSBwYXJzZUludChudW1iZXJzWzJdKTtcbiAgICAgICAgICAgIGlmIChpc05hTihib3R0b20pKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMl0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIGJvdHRvbSA9IGJvdHRvbSAqIGhlaWdodC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihib3R0b20pO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm90dG9tID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoKGJvdHRvbSAtIHRvcCkgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCAgfHwgKHJpZ2h0IC0gbGVmdCkgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4T2YoXCJ4eXdoKFwiKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGV0IHJvdW5kX2luZGV4ID0gcGF0aC5pbmRleE9mKFwicm91bmRcIik7XG4gICAgICAgICAgICBsZXQgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCBwYXRoLmluZGV4T2YoXCIpXCIpKTtcbiAgICAgICAgICAgIGlmIChyb3VuZF9pbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCByb3VuZF9pbmRleCk7XG5cbiAgICAgICAgICAgIGxldCBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG5cbiAgICAgICAgICAgIGxldCB4ID0gcGFyc2VJbnQobnVtYmVyc1swXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4oeCkpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtYmVyc1swXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgeCA9IHggKiB3aWR0aC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih0b3ApO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh4ID49IHdpZHRoKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHkgPSBwYXJzZUludChudW1iZXJzWzFdKTtcbiAgICAgICAgICAgIGlmIChpc05hTih5KSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzFdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICB5ID0geSAqIGhlaWdodC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih5KTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNjcm9sbFkgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeSA+PSBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdyA9IHBhcnNlSW50KG51bWJlcnNbMl0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHcpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMl0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIHcgPSB3ICogd2lkdGgvMTAwO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIodyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3ID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHcgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgaCA9IHBhcnNlSW50KG51bWJlcnNbM10pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKGgpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbM10uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIGggPSBoICogaGVpZ2h0LzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGgpO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGggPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKFwiY2lyY2xlKFwiKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGV0IHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBsZXQgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgcmFkaXVzID0gcGFyc2VJbnQobnVtYmVyc1swXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4ocmFkaXVzKSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBzaG9ydCA9IHdpZHRoID4gaGVpZ2h0ID8gaGVpZ2h0IDogd2lkdGg7XG4gICAgICAgICAgICAgICAgcmFkaXVzID0gcmFkaXVzICogc2hvcnQvMTAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHJhZGl1cyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByYWRpdXMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyYWRpdXMgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICBcbiAgICAgICAgfSAgICBcbiAgICAgICAgXG4gICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKFwiZWxsaXBzZShcIik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgbGV0IG51bWJlcnMgPSBzdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcblxuICAgICAgICAgICAgLy8gZWxsaXBzZShjbG9zZXN0LXNpZGUgZmFydGhlc3Qtc2lkZSBhdCAzMCUgNDAlKTtcbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA+IDMgJiYgbnVtYmVyc1swXSA9PT0gJ2Nsb3Nlc3Qtc2lkZScgJiYgbnVtYmVyc1sxXSA9PT0gJ2ZhcnRoZXN0LXNpZGUnICYmIG51bWJlcnNbMl0gPT09ICdhdCcpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmFkaXVzID0gcGFyc2VJbnQobnVtYmVyc1szXSk7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXJzWzNdLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gd2lkdGggPiBoZWlnaHQgPyBoZWlnaHQgOiB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IHJhZGl1cyAqIHZhbHVlLzEwMDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmFkaXVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByYWRpdXMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGl1cyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlcnMubGVuZ3RoID09PSA1KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MzsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByYWRpdXMgPSBwYXJzZUludChudW1iZXJzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXJzW2ldLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IChpID09PSAzKSA/IHdpZHRoIDogaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IHJhZGl1cyAqIHZhbHVlLzEwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihyYWRpdXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGl1cyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfSAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZWxsaXBzZSg0MCUgNTAlIGF0IGxlZnQpO1xuICAgICAgICAgICAgbGV0IGF0X2luZGV4ID0gcGF0aC5pbmRleE9mKFwiYXRcIik7XG4gICAgICAgICAgICBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgaWYgKGF0X2luZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIGF0X2luZGV4KTtcblxuICAgICAgICAgICAgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByYWRpdXMgPSBwYXJzZUludChudW1iZXJzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyc1tpXS5lbmRzV2l0aChcIiVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gKGkgPT09IDApID8gd2lkdGggOiBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IHJhZGl1cyAqIHZhbHVlLzEwMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHJhZGl1cyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJhZGl1cyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcbiAgICAgICAgICAgXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCA9IHBhdGguaW5kZXhPZihcInBvbHlnb24oXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCBwYXRoLmluZGV4T2YoXCIpXCIpKTtcbiAgICAgICAgICAgIGxldCBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIHBvbHlnb24obm9uemVyb3xldmVub2RkLCAwJSAwJSwgNTAlIDUwJSwgMCUgMTAwJSlcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdID09PSAnbm9uemVybycgfHwgbnVtYmVyc1swXSA9PT0gJ2V2ZW5vZGQnKVxuICAgICAgICAgICAgICAgIG51bWJlcnMuc2hpZnQoKTtcblxuICAgICAgICAgICAgbGV0IHkgPSAwO1xuICAgICAgICAgICAgbGV0IHggPSAwO1xuICAgICAgICAgICAgbGV0IGNoYW5nZWRfeCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGNoYW5nZWRfeSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjb29yZGluYXRlcyA9IG51bWJlcnNbaV0udHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXMubGVuZ3RoICE9IDIgKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBjb29yZGluYXRlX3h5ID0gWzAsIDBdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPTA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gcGFyc2VJbnQoY29vcmRpbmF0ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzW2ldLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVfeHlbaV0gPSAoaSA9PT0gMCkgPyB2YWx1ZSAqIHdpZHRoLzEwMCA6IHZhbHVlICogaGVpZ2h0LzEwMDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGNvb3JkaW5hdGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFpcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZV94eVtpXSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB4ID0gY29vcmRpbmF0ZV94eVswXTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IGNvb3JkaW5hdGVfeHlbMV07XG4gICAgICAgICAgICAgICAgfSBcblxuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhjb29yZGluYXRlX3h5WzBdIC0geCkgPj0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkgXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRfeCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGNvb3JkaW5hdGVfeHlbMV0gLSB5KSA+PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSBcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZF95ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGFuZ2VkX3ggJiYgY2hhbmdlZF95KSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gIFxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAgICAgIFxuXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzQ2xpcHBlZEJ5SW5zZXQoZWxlbSwgdG9wLCByaWdodCA9ICcwcHgnLCBib3R0b20gPSAnMHB4JywgbGVmdCA9ICcwcHgnKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gQ1NTVXRpbC5nZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KHN0eWxlLndpZHRoKTsgIC8vYWx3YXlzIGluIHB4XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHBhcnNlSW50KHN0eWxlLmhlaWdodCk7IC8vYWx3YXlzIGluIHB4XG4gICAgICAgIFxuICAgICAgICAvLyB0b3BcbiAgICAgICAgbGV0IHRvcF92YWx1ZSA9IHBhcnNlSW50KHRvcCk7XG4gICAgICAgIGlmIChpc05hTih0b3BfdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRvcC5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICB0b3BfdmFsdWUgPSB0b3BfdmFsdWUgKiBoZWlnaHQvMTAwO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIodG9wKTtcbiAgICAgICAgICAgIGlmICghcGFpcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdG9wX3ZhbHVlID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pbnNldCBvdXRzaWRlIG9mIHRoZSBjb250YWluZXJcbiAgICAgICAgaWYgKHRvcF92YWx1ZSA+IGhlaWdodCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIHJpZ2h0XG4gICAgICAgIGxldCByaWdodF92YWx1ZSA9IHBhcnNlSW50KHJpZ2h0KTtcbiAgICAgICAgaWYgKGlzTmFOKHJpZ2h0X3ZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmIChyaWdodC5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICByaWdodF92YWx1ZSA9IHJpZ2h0X3ZhbHVlICogd2lkdGgvMTAwO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmlnaHQpO1xuICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByaWdodF92YWx1ZSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvL2luc2V0IG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICBpZiAocmlnaHRfdmFsdWUgPiB3aWR0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIGJvdHRvbVxuICAgICAgICBsZXQgYm90dG9tX3ZhbHVlID0gcGFyc2VJbnQoYm90dG9tKTtcbiAgICAgICAgaWYgKGlzTmFOKGJvdHRvbV92YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoYm90dG9tLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgIGJvdHRvbV92YWx1ZSA9IGJvdHRvbV92YWx1ZSAqIGhlaWdodC8xMDA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihib3R0b20pO1xuICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBib3R0b21fdmFsdWUgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9pbnNldCBvdXRzaWRlIG9mIHRoZSBjb250YWluZXJcbiAgICAgICAgaWYgKGJvdHRvbV92YWx1ZSA+IGhlaWdodCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIGxlZnRcbiAgICAgICAgbGV0IGxlZnRfdmFsdWUgPSBwYXJzZUludChsZWZ0KTtcbiAgICAgICAgaWYgKGlzTmFOKGxlZnRfdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKGxlZnQuZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgbGVmdF92YWx1ZSA9IGxlZnRfdmFsdWUgKiB3aWR0aC8xMDA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihsZWZ0KTtcbiAgICAgICAgICAgIGlmICghcGFpcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGVmdF92YWx1ZSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvL2luc2V0IG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICBpZiAobGVmdF92YWx1ZSA+IHdpZHRoKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKGhlaWdodCAtICh0b3BfdmFsdWUgKyBib3R0b21fdmFsdWUpIDw9IENsaXBQYXRoVXRpbC5USFJFU0hPTEQgIHx8IHdpZHRoIC0gKHJpZ2h0X3ZhbHVlICsgbGVmdF92YWx1ZSkgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY2xhc3MgQ29sb3JVdGlsIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgQ1NTQ29sb3JMb29rdXAgPSB7XG4gICAgICAgIFwiYWxpY2VibHVlXCI6IFwiI2YwZjhmZlwiLFxuICAgICAgICBcImFudGlxdWV3aGl0ZVwiOiBcIiNmYWViZDdcIixcbiAgICAgICAgXCJhcXVhXCI6IFwiIzAwZmZmZlwiLFxuICAgICAgICBcImFxdWFtYXJpbmVcIjogXCIjN2ZmZmQ0XCIsXG4gICAgICAgIFwiYXp1cmVcIjogXCIjZjBmZmZmXCIsXG4gICAgICAgIFwiYmVpZ2VcIjogXCIjZjVmNWRjXCIsXG4gICAgICAgIFwiYmlzcXVlXCI6IFwiI2ZmZTRjNFwiLFxuICAgICAgICBcImJsYWNrXCI6IFwiIzAwMDAwMFwiLFxuICAgICAgICBcImJsYW5jaGVkYWxtb25kXCI6IFwiI2ZmZWJjZFwiLFxuICAgICAgICBcImJsdWVcIjogXCIjMDAwMGZmXCIsXG4gICAgICAgIFwiYmx1ZXZpb2xldFwiOiBcIiM4YTJiZTJcIixcbiAgICAgICAgXCJicm93blwiOiBcIiNhNTJhMmFcIixcbiAgICAgICAgXCJidXJseXdvb2RcIjogXCIjZGViODg3XCIsXG4gICAgICAgIFwiY2FkZXRibHVlXCI6IFwiIzVmOWVhMFwiLFxuICAgICAgICBcImNoYXJ0cmV1c2VcIjogXCIjN2ZmZjAwXCIsXG4gICAgICAgIFwiY2hvY29sYXRlXCI6IFwiI2QyNjkxZVwiLFxuICAgICAgICBcImNvcmFsXCI6IFwiI2ZmN2Y1MFwiLFxuICAgICAgICBcImNvcm5mbG93ZXJibHVlXCI6IFwiIzY0OTVlZFwiLFxuICAgICAgICBcImNvcm5zaWxrXCI6IFwiI2ZmZjhkY1wiLFxuICAgICAgICBcImNyaW1zb25cIjogXCIjZGMxNDNjXCIsXG4gICAgICAgIFwiY3lhblwiOiBcIiMwMGZmZmZcIixcbiAgICAgICAgXCJkYXJrYmx1ZVwiOiBcIiMwMDAwOGJcIixcbiAgICAgICAgXCJkYXJrY3lhblwiOiBcIiMwMDhiOGJcIixcbiAgICAgICAgXCJkYXJrZ29sZGVucm9kXCI6IFwiI2I4ODYwYlwiLFxuICAgICAgICBcImRhcmtncmF5XCI6IFwiI2E5YTlhOVwiLFxuICAgICAgICBcImRhcmtncmVlblwiOiBcIiMwMDY0MDBcIixcbiAgICAgICAgXCJkYXJra2hha2lcIjogXCIjYmRiNzZiXCIsXG4gICAgICAgIFwiZGFya21hZ2VudGFcIjogXCIjOGIwMDhiXCIsXG4gICAgICAgIFwiZGFya29saXZlZ3JlZW5cIjogXCIjNTU2YjJmXCIsXG4gICAgICAgIFwiZGFya29yYW5nZVwiOiBcIiNmZjhjMDBcIixcbiAgICAgICAgXCJkYXJrb3JjaGlkXCI6IFwiIzk5MzJjY1wiLFxuICAgICAgICBcImRhcmtyZWRcIjogXCIjOGIwMDAwXCIsXG4gICAgICAgIFwiZGFya3NhbG1vblwiOiBcIiNlOTk2N2FcIixcbiAgICAgICAgXCJkYXJrc2VhZ3JlZW5cIjogXCIjOGZiYzhmXCIsXG4gICAgICAgIFwiZGFya3NsYXRlYmx1ZVwiOiBcIiM0ODNkOGJcIixcbiAgICAgICAgXCJkYXJrc2xhdGVncmF5XCI6IFwiIzJmNGY0ZlwiLFxuICAgICAgICBcImRhcmt0dXJxdW9pc2VcIjogXCIjMDBjZWQxXCIsXG4gICAgICAgIFwiZGFya3Zpb2xldFwiOiBcIiM5NDAwZDNcIixcbiAgICAgICAgXCJkZWVwcGlua1wiOiBcIiNmZjE0OTNcIixcbiAgICAgICAgXCJkZWVwc2t5Ymx1ZVwiOiBcIiMwMGJmZmZcIixcbiAgICAgICAgXCJkaW1ncmF5XCI6IFwiIzY5Njk2OVwiLFxuICAgICAgICBcImRvZGdlcmJsdWVcIjogXCIjMWU5MGZmXCIsXG4gICAgICAgIFwiZmlyZWJyaWNrXCI6IFwiI2IyMjIyMlwiLFxuICAgICAgICBcImZsb3JhbHdoaXRlXCI6IFwiI2ZmZmFmMFwiLFxuICAgICAgICBcImZvcmVzdGdyZWVuXCI6IFwiIzIyOGIyMlwiLFxuICAgICAgICBcImZ1Y2hzaWFcIjogXCIjZmYwMGZmXCIsXG4gICAgICAgIFwiZ2FpbnNib3JvXCI6IFwiI2RjZGNkY1wiLFxuICAgICAgICBcImdob3N0d2hpdGVcIjogXCIjZjhmOGZmXCIsXG4gICAgICAgIFwiZ29sZFwiOiBcIiNmZmQ3MDBcIixcbiAgICAgICAgXCJnb2xkZW5yb2RcIjogXCIjZGFhNTIwXCIsXG4gICAgICAgIFwiZ3JheVwiOiBcIiM4MDgwODBcIixcbiAgICAgICAgXCJncmVlblwiOiBcIiMwMDgwMDBcIixcbiAgICAgICAgXCJncmVlbnllbGxvd1wiOiBcIiNhZGZmMmZcIixcbiAgICAgICAgXCJob25leWRld1wiOiBcIiNmMGZmZjBcIixcbiAgICAgICAgXCJob3RwaW5rXCI6IFwiI2ZmNjliNFwiLFxuICAgICAgICBcImluZGlhbnJlZFwiOiBcIiNjZDVjNWNcIixcbiAgICAgICAgXCJpbmRpZ29cIjogXCIjNGIwMDgyXCIsXG4gICAgICAgIFwiaXZvcnlcIjogXCIjZmZmZmYwXCIsXG4gICAgICAgIFwia2hha2lcIjogXCIjZjBlNjhjXCIsXG4gICAgICAgIFwibGF2ZW5kZXJcIjogXCIjZTZlNmZhXCIsXG4gICAgICAgIFwibGF2ZW5kZXJibHVzaFwiOiBcIiNmZmYwZjVcIixcbiAgICAgICAgXCJsYXduZ3JlZW5cIjogXCIjN2NmYzAwXCIsXG4gICAgICAgIFwibGVtb25jaGlmZm9uXCI6IFwiI2ZmZmFjZFwiLFxuICAgICAgICBcImxpZ2h0Ymx1ZVwiOiBcIiNhZGQ4ZTZcIixcbiAgICAgICAgXCJsaWdodGNvcmFsXCI6IFwiI2YwODA4MFwiLFxuICAgICAgICBcImxpZ2h0Y3lhblwiOiBcIiNlMGZmZmZcIixcbiAgICAgICAgXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBcIiNmYWZhZDJcIixcbiAgICAgICAgXCJsaWdodGdyZXlcIjogXCIjZDNkM2QzXCIsXG4gICAgICAgIFwibGlnaHRncmVlblwiOiBcIiM5MGVlOTBcIixcbiAgICAgICAgXCJsaWdodHBpbmtcIjogXCIjZmZiNmMxXCIsXG4gICAgICAgIFwibGlnaHRzYWxtb25cIjogXCIjZmZhMDdhXCIsXG4gICAgICAgIFwibGlnaHRzZWFncmVlblwiOiBcIiMyMGIyYWFcIixcbiAgICAgICAgXCJsaWdodHNreWJsdWVcIjogXCIjODdjZWZhXCIsXG4gICAgICAgIFwibGlnaHRzbGF0ZWdyYXlcIjogXCIjNzc4ODk5XCIsXG4gICAgICAgIFwibGlnaHRzdGVlbGJsdWVcIjogXCIjYjBjNGRlXCIsXG4gICAgICAgIFwibGlnaHR5ZWxsb3dcIjogXCIjZmZmZmUwXCIsXG4gICAgICAgIFwibGltZVwiOiBcIiMwMGZmMDBcIixcbiAgICAgICAgXCJsaW1lZ3JlZW5cIjogXCIjMzJjZDMyXCIsXG4gICAgICAgIFwibGluZW5cIjogXCIjZmFmMGU2XCIsXG4gICAgICAgIFwibWFnZW50YVwiOiBcIiNmZjAwZmZcIixcbiAgICAgICAgXCJtYXJvb25cIjogXCIjODAwMDAwXCIsXG4gICAgICAgIFwibWVkaXVtYXF1YW1hcmluZVwiOiBcIiM2NmNkYWFcIixcbiAgICAgICAgXCJtZWRpdW1ibHVlXCI6IFwiIzAwMDBjZFwiLFxuICAgICAgICBcIm1lZGl1bW9yY2hpZFwiOiBcIiNiYTU1ZDNcIixcbiAgICAgICAgXCJtZWRpdW1wdXJwbGVcIjogXCIjOTM3MGQ4XCIsXG4gICAgICAgIFwibWVkaXVtc2VhZ3JlZW5cIjogXCIjM2NiMzcxXCIsXG4gICAgICAgIFwibWVkaXVtc2xhdGVibHVlXCI6IFwiIzdiNjhlZVwiLFxuICAgICAgICBcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFwiIzAwZmE5YVwiLFxuICAgICAgICBcIm1lZGl1bXR1cnF1b2lzZVwiOiBcIiM0OGQxY2NcIixcbiAgICAgICAgXCJtZWRpdW12aW9sZXRyZWRcIjogXCIjYzcxNTg1XCIsXG4gICAgICAgIFwibWlkbmlnaHRibHVlXCI6IFwiIzE5MTk3MFwiLFxuICAgICAgICBcIm1pbnRjcmVhbVwiOiBcIiNmNWZmZmFcIixcbiAgICAgICAgXCJtaXN0eXJvc2VcIjogXCIjZmZlNGUxXCIsXG4gICAgICAgIFwibW9jY2FzaW5cIjogXCIjZmZlNGI1XCIsXG4gICAgICAgIFwibmF2YWpvd2hpdGVcIjogXCIjZmZkZWFkXCIsXG4gICAgICAgIFwibmF2eVwiOiBcIiMwMDAwODBcIixcbiAgICAgICAgXCJvbGRsYWNlXCI6IFwiI2ZkZjVlNlwiLFxuICAgICAgICBcIm9saXZlXCI6IFwiIzgwODAwMFwiLFxuICAgICAgICBcIm9saXZlZHJhYlwiOiBcIiM2YjhlMjNcIixcbiAgICAgICAgXCJvcmFuZ2VcIjogXCIjZmZhNTAwXCIsXG4gICAgICAgIFwib3JhbmdlcmVkXCI6IFwiI2ZmNDUwMFwiLFxuICAgICAgICBcIm9yY2hpZFwiOiBcIiNkYTcwZDZcIixcbiAgICAgICAgXCJwYWxlZ29sZGVucm9kXCI6IFwiI2VlZThhYVwiLFxuICAgICAgICBcInBhbGVncmVlblwiOiBcIiM5OGZiOThcIixcbiAgICAgICAgXCJwYWxldHVycXVvaXNlXCI6IFwiI2FmZWVlZVwiLFxuICAgICAgICBcInBhbGV2aW9sZXRyZWRcIjogXCIjZDg3MDkzXCIsXG4gICAgICAgIFwicGFwYXlhd2hpcFwiOiBcIiNmZmVmZDVcIixcbiAgICAgICAgXCJwZWFjaHB1ZmZcIjogXCIjZmZkYWI5XCIsXG4gICAgICAgIFwicGVydVwiOiBcIiNjZDg1M2ZcIixcbiAgICAgICAgXCJwaW5rXCI6IFwiI2ZmYzBjYlwiLFxuICAgICAgICBcInBsdW1cIjogXCIjZGRhMGRkXCIsXG4gICAgICAgIFwicG93ZGVyYmx1ZVwiOiBcIiNiMGUwZTZcIixcbiAgICAgICAgXCJwdXJwbGVcIjogXCIjODAwMDgwXCIsXG4gICAgICAgIFwicmVkXCI6IFwiI2ZmMDAwMFwiLFxuICAgICAgICBcInJvc3licm93blwiOiBcIiNiYzhmOGZcIixcbiAgICAgICAgXCJyb3lhbGJsdWVcIjogXCIjNDE2OWUxXCIsXG4gICAgICAgIFwic2FkZGxlYnJvd25cIjogXCIjOGI0NTEzXCIsXG4gICAgICAgIFwic2FsbW9uXCI6IFwiI2ZhODA3MlwiLFxuICAgICAgICBcInNhbmR5YnJvd25cIjogXCIjZjRhNDYwXCIsXG4gICAgICAgIFwic2VhZ3JlZW5cIjogXCIjMmU4YjU3XCIsXG4gICAgICAgIFwic2Vhc2hlbGxcIjogXCIjZmZmNWVlXCIsXG4gICAgICAgIFwic2llbm5hXCI6IFwiI2EwNTIyZFwiLFxuICAgICAgICBcInNpbHZlclwiOiBcIiNjMGMwYzBcIixcbiAgICAgICAgXCJza3libHVlXCI6IFwiIzg3Y2VlYlwiLFxuICAgICAgICBcInNsYXRlYmx1ZVwiOiBcIiM2YTVhY2RcIixcbiAgICAgICAgXCJzbGF0ZWdyYXlcIjogXCIjNzA4MDkwXCIsXG4gICAgICAgIFwic25vd1wiOiBcIiNmZmZhZmFcIixcbiAgICAgICAgXCJzcHJpbmdncmVlblwiOiBcIiMwMGZmN2ZcIixcbiAgICAgICAgXCJzdGVlbGJsdWVcIjogXCIjNDY4MmI0XCIsXG4gICAgICAgIFwidGFuXCI6IFwiI2QyYjQ4Y1wiLFxuICAgICAgICBcInRlYWxcIjogXCIjMDA4MDgwXCIsXG4gICAgICAgIFwidGhpc3RsZVwiOiBcIiNkOGJmZDhcIixcbiAgICAgICAgXCJ0b21hdG9cIjogXCIjZmY2MzQ3XCIsXG4gICAgICAgIFwidHVycXVvaXNlXCI6IFwiIzQwZTBkMFwiLFxuICAgICAgICBcInZpb2xldFwiOiBcIiNlZTgyZWVcIixcbiAgICAgICAgXCJ3aGVhdFwiOiBcIiNmNWRlYjNcIixcbiAgICAgICAgXCJ3aGl0ZVwiOiBcIiNmZmZmZmZcIixcbiAgICAgICAgXCJ3aGl0ZXNtb2tlXCI6IFwiI2Y1ZjVmNVwiLFxuICAgICAgICBcInllbGxvd1wiOiBcIiNmZmZmMDBcIixcbiAgICAgICAgXCJ5ZWxsb3dncmVlblwiOiBcIiM5YWNkMzJcIixcbiAgICAgICAgXCJidXR0b250ZXh0XCI6IFwicmdiYSgwLCAwLCAwLCAwLjg0NylcIixcbiAgICAgICAgXCJidXR0b25mYWNlXCI6IFwiI2ZmZmZmZlwiLFxuICAgICAgICBcImdyYXl0ZXh0XCI6IFwicmdiYSgwLCAwLCAwLCAwLjI0NylcIlxuICAgIH1cblxuXG4gICAgLy8gUmV3cml0ZSB0aGUgY29sb3Igb2JqZWN0IHRvIGFjY291bnQgZm9yIGFscGhhXG4gICAgcHVibGljIHN0YXRpYyBDb2xvcihjc3NTdHlsZUNvbG9yKSB7XG4gICAgICAgIGlmICghY3NzU3R5bGVDb2xvcikgcmV0dXJuIG51bGw7XG4gICAgICAgIGNzc1N0eWxlQ29sb3IgPSBjc3NTdHlsZUNvbG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yID09PSBcInRyYW5zcGFyZW50XCIpIHJldHVybiBuZXcgQ29sb3JPYmooMjU1LCAyNTUsIDI1NSwgMCk7XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yIGluIENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cClcbiAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBDb2xvclV0aWwuQ1NTQ29sb3JMb29rdXBbY3NzU3R5bGVDb2xvcl07XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2IoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYlxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihtWzFdLCBtWzJdLCBtWzNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2JhKFwiKSkge1xuICAgICAgICAgICAgbGV0IHJnYlJlZ2V4ID0gL1xccypyZ2JhXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooLispXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjc3NTdHlsZUNvbG9yLmNoYXJBdCgwKSAhPSBcIiNcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGhyZWUtZGlnaXQgUkdCICgjcmdiKSBpcyBjb252ZXJ0ZWQgdG8gc2l4LWRpZ2l0IGZvcm0gKCNycmdnYmIpIGJ5IHJlcGxpY2F0aW5nIGRpZ2l0c1xuICAgICAgICAgICAgICAgIC8vIChodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWNvbG9yLTMvI3JnYi1jb2xvcilcbiAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gXCIjXCIgKyBjc3NTdHlsZUNvbG9yLmNoYXJBdCgxKS5yZXBlYXQoMikgK1xuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yLmNoYXJBdCgyKS5yZXBlYXQoMikgK1xuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yLmNoYXJBdCgzKS5yZXBlYXQoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdGhpc1JlZCA9IHBhcnNlSW50KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDEsIDMpLCAxNik7XG4gICAgICAgICAgICBsZXQgdGhpc0dyZWVuID0gcGFyc2VJbnQoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMywgNSksIDE2KTtcbiAgICAgICAgICAgIGxldCB0aGlzQmx1ZSA9IHBhcnNlSW50KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDUsIDcpLCAxNik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKHRoaXNSZWQsIHRoaXNHcmVlbiwgdGhpc0JsdWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vICAgIHJldHVybiBudWxsOyAvLyBVbnJlYWNoYWJsZVxuICAgIH07XG5cbiBwdWJsaWMgc3RhdGljIENvbG9yQ29tYm8ocnVsZUNvbnRleHQgOiBIVE1MRWxlbWVudCkge1xuICAgIHRyeSB7IFxuICAgICAgICB2YXIgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIGlmICghd2luKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhbmNlc3RvcnMgPSBbXTtcbiAgICAgICAgbGV0IHdhbGtOb2RlIDogRWxlbWVudCA9IHJ1bGVDb250ZXh0O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlVHlwZSA9PT0gMSkgXG4gICAgICAgICAgICAgICAgYW5jZXN0b3JzLnB1c2god2Fsa05vZGUpO1xuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHZhciByZXRWYWwgPSB7XG4gICAgICAgICAgICBcImhhc0dyYWRpZW50XCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJoYXNCR0ltYWdlXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJ0ZXh0U2hhZG93XCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJmZ1wiOiBudWxsLFxuICAgICAgICAgICAgXCJiZ1wiOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBzdGFydFxuICAgICAgICB2YXIgY1N0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICB2YXIgY29tcFN0eWxlQ29sb3IgPSBjU3R5bGUuY29sb3I7XG4gICAgICAgIGlmICghY29tcFN0eWxlQ29sb3IpXG4gICAgICAgICAgICBjb21wU3R5bGVDb2xvciA9IFwiYmxhY2tcIjtcbiAgICAgICAgdmFyIGZnID0gQ29sb3JVdGlsLkNvbG9yKGNvbXBTdHlsZUNvbG9yKTtcbiAgICAgICAgdmFyIHJlQ29sb3IgPSAvdHJhbnNwYXJlbnR8cmdiYT9cXChbXildK1xcKS9naTtcbiAgICAgICAgdmFyIGd1ZXNzR3JhZENvbG9yID0gZnVuY3Rpb24gKGdyYWRMaXN0LCBiZ0NvbG9yLCBmZ0NvbG9yKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgY29sb3IsIHJldHVybiB0aGF0XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBncmFkTGlzdC5sZW5ndGggPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBncmFkTGlzdDtcblxuICAgICAgICAgICAgICAgIHZhciBvdmVyYWxsV29yc3QgPSBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBvdmVyYWxsV29yc3RSYXRpbyA9IG51bGw7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaUdyYWQgPSAxOyBpR3JhZCA8IGdyYWRMaXN0Lmxlbmd0aDsgKytpR3JhZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29yc3RDb2xvciA9IGdyYWRMaXN0W2lHcmFkIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JzdFJhdGlvID0gZmdDb2xvci5jb250cmFzdFJhdGlvKGdyYWRMaXN0W2lHcmFkIC0gMV0pO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcCA9IC4xO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0ZXAgPiAuMDAwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlkeCArIHN0ZXAgPD0gMSAmJiB3b3JzdFJhdGlvID4gZmdDb2xvci5jb250cmFzdFJhdGlvKGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4ICsgc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0Q29sb3IgPSBncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCArIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdFJhdGlvID0gZmdDb2xvci5jb250cmFzdFJhdGlvKHdvcnN0Q29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IGlkeCArIHN0ZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IC0gc3RlcCA+PSAwICYmIHdvcnN0UmF0aW8gPiBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8oZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggLSBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RDb2xvciA9IGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4IC0gc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0UmF0aW8gPSBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8od29yc3RDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gaWR4IC0gc3RlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAgPSBzdGVwIC8gMTA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJhbGxXb3JzdFJhdGlvID09PSBudWxsIHx8IG92ZXJhbGxXb3JzdFJhdGlvID4gd29yc3RSYXRpbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbFdvcnN0UmF0aW8gPSB3b3JzdFJhdGlvO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbFdvcnN0ID0gd29yc3RDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3ZlcmFsbFdvcnN0OyAvLyByZXR1cm4gdGhlIGRhcmtlc3QgY29sb3JcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBiZ0NvbG9yO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBwcmlvclN0YWNrQkcgPSBDb2xvclV0aWwuQ29sb3IoXCJ3aGl0ZVwiKTtcbiAgICAgICAgdmFyIHRoaXNTdGFja09wYWNpdHkgPSBudWxsO1xuICAgICAgICB2YXIgdGhpc1N0YWNrQWxwaGEgPSBudWxsO1xuICAgICAgICB2YXIgdGhpc1N0YWNrQkcgPSBudWxsO1xuICAgICAgICAvLyBBbmNlc3RvcnMgcHJvY2Vzc2VkIGZyb20gdGhlIHRvcG1vc3QgcGFyZW50IHRvd2FyZCB0aGUgY2hpbGRcbiAgICAgICAgd2hpbGUgKGFuY2VzdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgcHJvY05leHQgPSBhbmNlc3RvcnMucG9wKCk7XG4gICAgICAgICAgICAvL3ZhciBwcm9jTmV4dCA9IGFuY2VzdG9ycy5zcGxpY2UoMCwgMSlbMF07XG4gICAgICAgICAgICAvLyBjU3R5bGUgaXMgdGhlIGNvbXB1dGVkIHN0eWxlIG9mIHRoaXMgbGF5ZXJcbiAgICAgICAgICAgIHZhciBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShwcm9jTmV4dCk7XG4gICAgICAgICAgICBpZiAoY1N0eWxlID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gdGhpc0JnQ29sb3IgaXMgdGhlIGNvbG9yIG9mIHRoaXMgbGF5ZXIgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgaXMgdHJhbnNwYXJlbnRcbiAgICAgICAgICAgIHZhciB0aGlzQmdDb2xvciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRDb2xvciAmJiBjU3R5bGUuYmFja2dyb3VuZENvbG9yICE9IFwidHJhbnNwYXJlbnRcIiAmJiBjU3R5bGUuYmFja2dyb3VuZENvbG9yICE9IFwicmdiYSgwLCAwLCAwLCAwKVwiKSB7XG4gICAgICAgICAgICAgICAgdGhpc0JnQ29sb3IgPSBDb2xvclV0aWwuQ29sb3IoY1N0eWxlLmJhY2tncm91bmRDb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGdyYWRpZW50IGludm9sdmVkLCBzZXQgdGhpc0JnQ29sb3IgdG8gdGhlIHdvcnN0IGNvbG9yIGNvbWJpbmF0aW9uIGF2YWlsYWJsZSBhZ2FpbnN0IHRoZSBmb3JlZ3JvdW5kXG4gICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRJbWFnZSAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YgJiYgY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mKFwiZ3JhZGllbnRcIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICB2YXIgZ3JhZENvbG9ycyA6IHN0cmluZ1tdID0gY1N0eWxlLmJhY2tncm91bmRJbWFnZS5tYXRjaChyZUNvbG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JhZENvbG9ycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JhZENvbG9yQ29tcCA6IENvbG9yT2JqW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFkQ29sb3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdyYWRDb2xvcnNbaV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZENvbG9ycy5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbG9yQ29tcCA9IENvbG9yVXRpbC5Db2xvcihncmFkQ29sb3JzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JDb21wLmFscGhhICE9PSB1bmRlZmluZWQgJiYgY29sb3JDb21wLmFscGhhIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaXggdGhlIGdyZGllbnQgYmcgY29sb3Igd2l0IHBhcmVudCBiZyBpZiBhbHBoYSA8IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBTdGFja0JnID0gdGhpc1N0YWNrQkcgfHwgcHJpb3JTdGFja0JHO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckNvbXAgPSBjb2xvckNvbXAuZ2V0T3ZlcmxheUNvbG9yKGNvbXBTdGFja0JnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZENvbG9yQ29tcC5wdXNoKGNvbG9yQ29tcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpc0JnQ29sb3IgPSBndWVzc0dyYWRDb2xvcihncmFkQ29sb3JDb21wLCB0aGlzU3RhY2tCRyB8fCBwcmlvclN0YWNrQkcsIGZnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEhhbmRsZSBub24tc29saWQgb3BhY2l0eVxuICAgICAgICAgICAgaWYgKHRoaXNTdGFja09wYWNpdHkgPT09IG51bGwgfHwgKGNTdHlsZS5vcGFjaXR5ICYmIGNTdHlsZS5vcGFjaXR5Lmxlbmd0aCA+IDAgJiYgcGFyc2VGbG9hdChjU3R5bGUub3BhY2l0eSkgPCAxKSkge1xuICAgICAgICAgICAgICAgIC8vIE5ldyBzdGFjaywgcmVzZXRcbiAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrQkcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBPdmVybGF5XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHLmFscGhhID0gdGhpc1N0YWNrT3BhY2l0eSAqIHRoaXNTdGFja0FscGhhO1xuICAgICAgICAgICAgICAgICAgICBwcmlvclN0YWNrQkcgPSB0aGlzU3RhY2tCRy5nZXRPdmVybGF5Q29sb3IocHJpb3JTdGFja0JHKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpc1N0YWNrT3BhY2l0eSA9IDEuMDtcbiAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjU3R5bGUub3BhY2l0eSAmJiBjU3R5bGUub3BhY2l0eS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja09wYWNpdHkgPSBwYXJzZUZsb2F0KGNTdHlsZS5vcGFjaXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNCZ0NvbG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSB0aGlzQmdDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSB0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzU3RhY2tCRy5hbHBoYTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNTdGFja09wYWNpdHkgPT09IDEuMCAmJiB0aGlzU3RhY2tBbHBoYSA9PT0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzQkdJbWFnZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0dyYWRpZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIYW5kbGUgc29saWQgY29sb3IgYmFja2dyb3VuZHMgYW5kIGdyYWRpZW50IGNvbG9yIGJhY2tncm91bmRzXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzQmdDb2xvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBzdGFjayBhbHJlYWR5IGhhcyBhIGJhY2tncm91bmQgY29sb3IsIGJsZW5kIGl0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNTdGFja0JHID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHID0gdGhpc0JnQ29sb3I7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gdGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1N0YWNrQkcuYWxwaGE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSB0aGlzQmdDb2xvci5nZXRPdmVybGF5Q29sb3IodGhpc1N0YWNrQkcpO1xuICAgICAgICAgICAgICAgICAgICAvL3RoaXNTdGFja0FscGhhID0gdGhpc0JnQ29sb3IuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gIzUyNjogSWYgdGhpc0JnQ29sb3IgaGFkIGFuIGFscGhhIHZhbHVlLCBpdCBtYXkgbm90IGV4cG9zZSB0aHJvdWdoIHRoaXNTdGFja0JHIGluIHRoZSBhYm92ZSBjb2RlXG4gICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3Qgd2lwZSBvdXQgdGhlIGdyYWRpZW50IGluZm8gaWYgdGhpcyBsYXllciB3YXMgdHJhbnNwYXJlbnRcbiAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrT3BhY2l0eSA9PT0gMS4wICYmIHRoaXNTdGFja0FscGhhID09PSAxLjAgJiYgKHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMCkgPT09IDEuMCAmJiAodGhpc0JnQ29sb3IuYWxwaGEgfHwgMS4wKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzQkdJbWFnZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzR3JhZGllbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRJbWFnZSAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlICE9IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZiAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YoXCJncmFkaWVudFwiKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzR3JhZGllbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNCR0ltYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXNTdGFja0JHICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZnID0gZmcuZ2V0T3ZlcmxheUNvbG9yKHRoaXNTdGFja0JHKTtcbiAgICAgICAgICAgIGRlbGV0ZSBmZy5hbHBoYTtcbiAgICAgICAgfVxuICAgICAgICBmZy5hbHBoYSA9IChmZy5hbHBoYSB8fCAxKSAqIHRoaXNTdGFja09wYWNpdHk7XG4gICAgICAgIGZnID0gZmcuZ2V0T3ZlcmxheUNvbG9yKHByaW9yU3RhY2tCRyk7XG4gICAgICAgIGlmICh0aGlzU3RhY2tCRyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzU3RhY2tCRy5hbHBoYSA9IHRoaXNTdGFja09wYWNpdHkgKiB0aGlzU3RhY2tBbHBoYTtcbiAgICAgICAgICAgIHByaW9yU3RhY2tCRyA9IHRoaXNTdGFja0JHLmdldE92ZXJsYXlDb2xvcihwcmlvclN0YWNrQkcpO1xuICAgICAgICB9XG4gICAgICAgIHJldFZhbC5mZyA9IGZnO1xuICAgICAgICByZXRWYWwuYmcgPSBwcmlvclN0YWNrQkc7XG5cbiAgICAgICAgaWYgKGNTdHlsZS50ZXh0U2hhZG93ICYmIGNTdHlsZS50ZXh0U2hhZG93ICE9PSAnbm9uZScpXG4gICAgICAgICAgICByZXRWYWwudGV4dFNoYWRvdyA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gc29tZXRoaW5nIGhhcHBlbmVkLCB0aGVuLi4uXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiB9O1xufVxuXG5leHBvcnQgY2xhc3MgQ29sb3JPYmoge1xuICAgIHJlZCA6IG51bWJlcjtcbiAgICBncmVlbiA6IG51bWJlcjtcbiAgICBibHVlIDogbnVtYmVyO1xuICAgIGFscGhhIDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocmVkIDogc3RyaW5nIHwgbnVtYmVyLCBncmVlbiA6IHN0cmluZyB8IG51bWJlciwgYmx1ZSA6IHN0cmluZyB8IG51bWJlciwgYWxwaGE/IDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGZ1bmN0aW9uIGZpeENvbXBvbmVudChjb21wIDogc3RyaW5nIHwgbnVtYmVyKSA6IG51bWJlciB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChjb21wKSAhPSB0eXBlb2YgKFwiXCIpKSByZXR1cm4gY29tcCBhcyBudW1iZXI7XG4gICAgICAgICAgICBsZXQgY29tcFN0ciA9IGNvbXAgYXMgc3RyaW5nO1xuICAgICAgICAgICAgY29tcFN0ciA9IGNvbXBTdHIudHJpbSgpO1xuICAgICAgICAgICAgaWYgKGNvbXBTdHJbY29tcFN0ci5sZW5ndGggLSAxXSAhPSBcIiVcIikgcmV0dXJuIHBhcnNlSW50KGNvbXBTdHIpO1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChjb21wU3RyLnN1YnN0cmluZygwLCBjb21wU3RyLmxlbmd0aCAtIDEpKSAqIDIuNTUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVkID0gZml4Q29tcG9uZW50KHJlZCk7XG4gICAgICAgIHRoaXMuZ3JlZW4gPSBmaXhDb21wb25lbnQoZ3JlZW4pO1xuICAgICAgICB0aGlzLmJsdWUgPSBmaXhDb21wb25lbnQoYmx1ZSk7XG4gICAgICAgIGlmICh0eXBlb2YgKGFscGhhKSAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmFscGhhID0gKHR5cGVvZiAoYWxwaGEpID09PSB0eXBlb2YgKFwiXCIpKSA/IHBhcnNlRmxvYXQoYWxwaGEgYXMgc3RyaW5nKSA6IGFscGhhIGFzIG51bWJlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvSGV4SGVscCh2YWx1ZSA6IG51bWJlcikgOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsID0gTWF0aC5yb3VuZCh2YWx1ZSkudG9TdHJpbmcoMTYpO1xuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBcIjBcIiArIHJldFZhbDtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9O1xuXG4gICAgdG9IZXgoKSA6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcIiNcIiArIHRoaXMudG9IZXhIZWxwKHRoaXMucmVkKSArIHRoaXMudG9IZXhIZWxwKHRoaXMuZ3JlZW4pICsgdGhpcy50b0hleEhlbHAodGhpcy5ibHVlKTtcbiAgICB9O1xuXG4gICAgY29udHJhc3RSYXRpbyhiZ0NvbG9yIDogQ29sb3JPYmopIHsgXG4gICAgICAgIGxldCBmZ0NvbG9yOiBDb2xvck9iaiA9IHRoaXM7XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFscGhhKSAhPSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgZmdDb2xvciA9IHRoaXMuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpO1xuICAgICAgICAgICAgIFxuICAgICAgICBsZXQgbHVtMSA9IGZnQ29sb3IucmVsYXRpdmVMdW1pbmFuY2UoKTtcbiAgICAgICAgaWYgKCFiZ0NvbG9yLnJlbGF0aXZlTHVtaW5hbmNlKSB7XG4gICAgICAgICAgICBsZXQgcyA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gYmdDb2xvcikge1xuICAgICAgICAgICAgICAgIHMgKz0ga2V5ICsgXCJcXG5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFsZXJ0KGJnQ29sb3IpO1xuICAgICAgICAgICAgYWxlcnQocyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGx1bTIgPSBiZ0NvbG9yLnJlbGF0aXZlTHVtaW5hbmNlKCk7XG4gICAgICAgIGxldCByYXRpbyA9IChsdW0xID4gbHVtMikgPyAobHVtMSArIC4wNSkgLyAobHVtMiArIC4wNSkgOiAobHVtMiArIC4wNSkgLyAobHVtMSArIC4wNSk7XG4gICAgICAgIHJldHVybiByYXRpbztcbiAgICB9O1xuXG4gICAgcmVsYXRpdmVMdW1pbmFuY2UoKSA6IG51bWJlciB7XG4gICAgICAgIGxldCBSID0gdGhpcy5yZWQgLyAyNTUuMDtcbiAgICAgICAgbGV0IEcgPSB0aGlzLmdyZWVuIC8gMjU1LjA7XG4gICAgICAgIGxldCBCID0gdGhpcy5ibHVlIC8gMjU1LjA7XG4gICAgICAgIFIgPSBSIDw9IC4wNDA0NSA/IFIgLyAxMi45MiA6IE1hdGgucG93KChSICsgLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICAgICAgRyA9IEcgPD0gLjA0MDQ1ID8gRyAvIDEyLjkyIDogTWF0aC5wb3coKEcgKyAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgICAgICBCID0gQiA8PSAuMDQwNDUgPyBCIC8gMTIuOTIgOiBNYXRoLnBvdygoQiArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICAgIHJldHVybiAwLjIxMjYgKiBSICsgMC43MTUyICogRyArIDAuMDcyMiAqIEI7XG4gICAgfTtcblxuICAgIG1peChjb2xvcjIgOiBDb2xvck9iaiwgcGVyY1RoaXMgOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hbHBoYSkgPT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIChjb2xvcjIuYWxwaGEpID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5yZWQgKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5yZWQsXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLmdyZWVuICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuZ3JlZW4sXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLmJsdWUgKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ibHVlXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFscGhhVGhpcyA9IHRoaXMuYWxwaGEgPyB0aGlzLmFscGhhIDogMTtcbiAgICAgICAgICAgIGxldCBhbHBoYU90aGVyID0gY29sb3IyLmFscGhhID8gY29sb3IyLmFscGhhIDogMTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmooXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLnJlZCArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLnJlZCxcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuZ3JlZW4gKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ncmVlbixcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuYmx1ZSArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmJsdWUsXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiBhbHBoYVRoaXMgKyAoMSAtIHBlcmNUaGlzKSAqIGFscGhhT3RoZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IgOiBDb2xvck9iaikge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFscGhhKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0aGlzLmFscGhhID49IDEpIHtcbiAgICAgICAgICAgIC8vIE5vIG1peGluZyByZXF1aXJlZCAtIGl0J3Mgb3BhcXVlXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hbHBoYSA8IDApIHtcbiAgICAgICAgICAgIC8vXHRcdEhhYWMuRXJyb3IubG9nRXJyb3IoXCJJbnZhbGlkIGFscGhhIHZhbHVlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAoYmdDb2xvci5hbHBoYSkgIT0gXCJ1bmRlZmluZWRcIiAmJiBiZ0NvbG9yLmFscGhhIDwgMSkge1xuICAgICAgICAgICAgLy9cdFx0SGFhYy5FcnJvci5sb2dFcnJvcihcIkNhbm5vdCBtaXggd2l0aCBhIGJhY2tncm91bmQgYWxwaGFcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VmFsID0gdGhpcy5taXgoYmdDb2xvciwgdGhpcy5hbHBoYSk7XG4gICAgICAgIGRlbGV0ZSByZXRWYWwuYWxwaGE7IFxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUNTU0NvbG9yKGNzc1N0eWxlQ29sb3IpIHtcbiAgICAgICAgbGV0IHRoaXNSZWQgPSAtMTtcbiAgICAgICAgbGV0IHRoaXNHcmVlbiA9IC0xO1xuICAgICAgICBsZXQgdGhpc0JsdWUgPSAtMTtcblxuICAgICAgICBjc3NTdHlsZUNvbG9yID0gY3NzU3R5bGVDb2xvci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiKFwiKSkge1xuICAgICAgICAgICAgbGV0IHJnYlJlZ2V4ID0gL1xccypyZ2JcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNSZWQgPSBtWzFdO1xuICAgICAgICAgICAgICAgIHRoaXNHcmVlbiA9IG1bMl07XG4gICAgICAgICAgICAgICAgdGhpc0JsdWUgPSBtWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYmEoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYmFcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKiguKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzUmVkID0gbVsxXTtcbiAgICAgICAgICAgICAgICB0aGlzR3JlZW4gPSBtWzJdO1xuICAgICAgICAgICAgICAgIHRoaXNCbHVlID0gbVszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLmNoYXJBdCgwKSAhPSBcIiNcIikge1xuICAgICAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yIGluIENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cClcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cFtjc3NTdHlsZUNvbG9yXTtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGZyb21IZXggPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxvb2t1cCA9IHtcbiAgICAgICAgICAgICAgICAgICAgXCJhXCI6IDEwLFxuICAgICAgICAgICAgICAgICAgICBcImJcIjogMTEsXG4gICAgICAgICAgICAgICAgICAgIFwiY1wiOiAxMixcbiAgICAgICAgICAgICAgICAgICAgXCJkXCI6IDEzLFxuICAgICAgICAgICAgICAgICAgICBcImVcIjogMTQsXG4gICAgICAgICAgICAgICAgICAgIFwiZlwiOiAxNVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsICogMTYgK1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQodmFsLmNoYXJBdChpKSBpbiBsb29rdXAgPyBsb29rdXBbdmFsLmNoYXJBdChpKV0gOiB2YWwuY2hhckF0KGkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJlZS1kaWdpdCBSR0IgKCNyZ2IpIGlzIGNvbnZlcnRlZCB0byBzaXgtZGlnaXQgZm9ybSAoI3JyZ2diYikgYnkgcmVwbGljYXRpbmcgZGlnaXRzXG4gICAgICAgICAgICAgICAgLy8gKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtY29sb3ItMy8jcmdiLWNvbG9yKVxuICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBcIiNcIiArIGNzc1N0eWxlQ29sb3IuY2hhckF0KDEpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDIpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDMpLnJlcGVhdCgyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXNSZWQgPSBmcm9tSGV4KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDEsIDMpKTtcbiAgICAgICAgICAgIHRoaXNHcmVlbiA9IGZyb21IZXgoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMywgNSkpO1xuICAgICAgICAgICAgdGhpc0JsdWUgPSBmcm9tSGV4KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDUsIDcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKHRoaXNSZWQsIHRoaXNHcmVlbiwgdGhpc0JsdWUpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4vVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuXG5leHBvcnQgY2xhc3MgQ29tbW9uVXRpbCB7XG5cbiAgICBwdWJsaWMgc3RhdGljIGlucHV0X3R5cGVfd2l0aF9wbGFjZWhvbGRlciA9IFtcInRleHRcIiwgXCJzZWFyY2hcIiwgXCJ0ZWxcIiwgXCJ1cmxcIiwgXCJlbWFpbFwiLCBcInBhc3N3b3JkXCIsIFwibnVtYmVyXCJdO1xuICAgIHB1YmxpYyBzdGF0aWMgaW5wdXRfdGV4dF90eXBlcyA9IFtcbiAgICAgICAgXCJ0ZXh0XCIsIFwiZmlsZVwiLCBcInBhc3N3b3JkXCIsXG4gICAgICAgIFwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLFxuICAgICAgICBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsICAvL0hUTUwgNS4gTm90ZTogdHlwZSA9IFwiaGlkZGVuXCIgZG9lc24ndCByZXF1aXJlIHRleHRcbiAgICAgICAgXCJkYXRlXCIsIFwibnVtYmVyXCIsIFwicmFuZ2VcIixcbiAgICAgICAgXCJ0aW1lXCIsIFwiY29sb3JcIlxuICAgIF07XG4gICAgcHVibGljIHN0YXRpYyBpbnB1dF90aW1lX3R5cGVzID0gW1xuICAgICAgICBcImRhdGVcIiwgXCJtb250aFwiLCBcIndlZWtcIiwgXCJ0aW1lXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgIF07XG4gICAgcHVibGljIHN0YXRpYyBpbnB1dF9vdGhlcl90eXBlcyA9IFtcbiAgICAgICAgXCJyYW5nZVwiLCBcImNvbG9yXCIsIFwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLCBcImZpbGVcIiwgXCJpbWFnZVwiXG4gICAgXTtcbiAgICBwdWJsaWMgc3RhdGljIGZvcm1fYnV0dG9uX3R5cGVzID0gW1xuICAgICAgICBcImJ1dHRvblwiLCBcInJlc2V0XCIsIFwic3VibWl0XCJcbiAgICBdO1xuXG4gICAgcHVibGljIHN0YXRpYyBmb3JtX2xhYmVsYWJsZV9lbGVtZW50cyA9IFtcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiLCBcImJ1dHRvblwiXTtcblxuICAgIHB1YmxpYyBzdGF0aWMgdGFiVGFnTWFwID0ge1xuICAgICAgICBcImJ1dHRvblwiOiBmdW5jdGlvbiAoZWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgcmV0dXJuICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcImlmcmFtZVwiOiB0cnVlLFxuICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwicmFkaW9cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7IC8vc2luZ2xlIHJhZGlvLCBubyBncm91cFxuICAgICAgICAgICAgICAgIGxldCBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBkb2MucXVlcnlTZWxlY3RvckFsbChcImlucHV0W3R5cGU9J3JhZGlvJ11bbmFtZT0nXCIgKyBuYW1lLnRyaW0oKSArXCInXVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAwIHx8IGdyb3VwLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRydWU7ICAvL3NpbmdsZSByYWRpbyB3aXRoIHRoZSBuYW1lLCBubyBvdGhlcnMgaW4gZ3JvdXBcblxuICAgICAgICAgICAgICAgIGxldCBjaGVja2VkID0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoZ3JvdXBbaV0gYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQgPSBncm91cFtpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9vbmx5IGxhc3Qgb25lIGFwcGxpZXMgaWYgbXVsdGlwbGUgcmFkaW9zIHdpdGggJ2NoZWNrZWQnIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShjaGVja2VkLCBlbGVtZW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90aGluZyBjaGVja2VkIHlldCwgcmV0dXJuIHRydWUgaWYgaXQncyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShncm91cFswXSwgZWxlbWVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSAgIFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgcmV0dXJuICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcInRleHRhcmVhXCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICAvKipcImRpdlwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpO1xuICAgICAgICB9LCovXG4gICAgICAgIFwiYVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgLy8geGxpbms6aHJlZj8/IHNlZSBzdmdcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJlYVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdWRpb1wiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udHJvbHNcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwidmlkZW9cIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRyb2xzXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcInN1bW1hcnlcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IHN1bW1hcnkgY2hpbGQgb2YgYSBkZXRhaWxzIGVsZW1lbnQgaXMgYXV0b21hdGljYWxseSBmb2N1c2FibGUgXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGVsZW1lbnQucGFyZW50RWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGV0YWlscydcbiAgICAgICAgICAgICAgICAmJiBET01VdGlsLnNhbWVOb2RlKFsuLi5lbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtID0+IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKVswXSwgZWxlbWVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGV0YWlsc1wiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgLy9kZXRhaWxzIGVsZW1lbnQgd2l0aG91dCBhIGRpcmVjdCBzdW1tYXJ5IGNoaWxkIGlzIGF1dG9tYXRpY2FsbHkgZm9jdXNhYmxlXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5jaGlsZHJlbiAmJiBbLi4uZWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKGVsZW0gPT4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc3VtbWFyeScpLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgd29yZENvdW50KHN0cik6IG51bWJlciB7XG4gICAgICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHN0ci5zcGxpdCgvXFxzKy9nKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90ZSB0aGF0IHRoaXMgb25seSBkZXRlY3RzIGlmIHRoZSBlbGVtZW50IGl0c2VsZiBpcyBpbiB0aGUgdGFiIG9yZGVyLlxuICAgICAqIEhvd2V2ZXIsIHRoaXMgZWxlbWVudCBtYXkgZGVsZWdhdGUgZm9jdXMgdG8gYW5vdGhlciBlbGVtZW50IHZpYSBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQuXG4gICAgICogQWxzbywgZm9jdXMgdmFyaWVzIGJ5IGJyb3dzZXIuLi4gc3RpY2tpbmcgdG8gdGhpbmdzIHRoYXQgYXJlIGZvY3VzYWJsZSBvbiBDaHJvbWUgYW5kIEZpcmVmb3guXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1RhYmJhYmxlKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gVXNpbmcgaHR0cHM6Ly9hbGx5anMuaW8vZGF0YS10YWJsZXMvZm9jdXNhYmxlLmh0bWxcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBleHBsaWNpdCBjYXNlcyBmaXJzdFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJpbmVydFwiKSB8fCBET01VdGlsLmdldEFuY2VzdG9yV2l0aEF0dHJpYnV0ZShlbGVtZW50LCBcImluZXJ0XCIsIFwiXCIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPj0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHBsaWNpdCBjYXNlcyBoYW5kbGVkIC0gbm93IHRoZSBpbXBsaWNpdFxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSBpbiBDb21tb25VdGlsLnRhYlRhZ01hcCkge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IENvbW1vblV0aWwudGFiVGFnTWFwW25vZGVOYW1lXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKGNlID09PSBcInRydWVcIiB8fCBjZSA9PT0gXCJcIikgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHRoZSBlbGUgbm9kZSBpcyBmb2N1c2FibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9jdXNhYmxlKGVsZSkge1xuICAgICAgICBpZiAoZWxlID09PSBcInVuZGVmaW5lZFwiIHx8IGVsZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IGRldGVjdHMgaWYgdGhlIGVsZW1lbnQgaXRzZWxmIGlzIGludGVyYWN0aXZlLCBidXQgbm90IG9uY2xpY2sgZXZlbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NsaWNrYWJsZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICAvLyBuYXRpdmUgZm9jdXNhYmxlIGVsZW1lbnRcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgaW4gQ29tbW9uVXRpbC50YWJUYWdNYXApIHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBDb21tb25VdGlsLnRhYlRhZ01hcFtub2RlTmFtZV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICAgIC8vY3VzdG9tIHdpZGdldFxuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmlzV2lkZ2V0KGVsZW1lbnQpICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgICAgIGlmICghY29udGV4dEhpZXJhcmNoaWVzKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5maWx0ZXIoaGllciA9PiBbXCJ0YWJsZVwiLCBcImdyaWRcIiwgXCJ0cmVlZ3JpZFwiXS5pbmNsdWRlcyhoaWVyLnJvbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRhYkluZGV4TEVaZXJvKGVsZW0pIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaGFzQXR0cmlidXRlKGVsZW0sIFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLm1hdGNoKC9eLT9cXGQrJC8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhYmluZGV4VmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFiaW5kZXhWYWx1ZSA9PT0gMCB8fCB0YWJpbmRleFZhbHVlID09PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IG51bWJlciBvZiB0YWJiYWJsZSBjaGlsZHJlblxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VGFiYmFibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgfHwgZWxlbWVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbm9ybWFsaXplU3BhY2luZyhzKSB7XG4gICAgICAgIGlmICghcykgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gcy50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgIH07XG5cbiAgICAvL1RPRE86IGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBlcXVpdmFsZW50cyBmb3Igcm9sZXM6IHJvdywgbGluaywgaGVhZGVyLCBidXR0b25cbiAgICAvLyBCdXQgaXQgbWF5IG5vdCBoYXZlIHRvLiBCdWcgcmVwb3J0cyBoYXZlIGJlZW4gYWJvdXQgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2tib3hlcy5cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEVxdWl2KG5vZGUsIGh0bWxFcXVpdikge1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxFcXVpdi5pbmRleE9mKFwiY2hlY2tib3hcIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHR5cGUgPT09IFwiY2hlY2tib3hcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChodG1sRXF1aXYuaW5kZXhPZihcInJhZGlvXCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB0eXBlID09PSBcInJhZGlvXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vbkV4aXN0YW50SURzKG5vZGUsIHRhcmdldGlkcykge1xuICAgICAgICBsZXQgcmV0dXJubm90Zm91bmRpZHMgPSAnJztcbiAgICAgICAgaWYgKENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyh0YXJnZXRpZHMpLmxlbmd0aCA8IDEpIHJldHVybiByZXR1cm5ub3Rmb3VuZGlkcztcblxuICAgICAgICBsZXQgdGFyZ2V0QXJyYXkgPSB0YXJnZXRpZHMuc3BsaXQoXCIgXCIpO1xuICAgICAgICBsZXQgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeHAgPSBcIi8vKltAaWQ9J1wiICsgdGFyZ2V0QXJyYXlbaV0gKyBcIiddXCI7XG4gICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQgPSBkb2MuZXZhbHVhdGUoeHAsIG5vZGUsIGRvYy5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICBsZXQgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICBpZiAoIXIpIHJldHVybm5vdGZvdW5kaWRzICs9IHRhcmdldEFycmF5W2ldICsgJywgJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJldHVybm5vdGZvdW5kaWRzKS5sZW5ndGggPj0gMilcbiAgICAgICAgICAgIHJldHVybm5vdGZvdW5kaWRzID0gcmV0dXJubm90Zm91bmRpZHMuc3Vic3RyaW5nKDAsIHJldHVybm5vdGZvdW5kaWRzLmxlbmd0aCAtIDIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm5ub3Rmb3VuZGlkcyA9ICcnO1xuICAgICAgICByZXR1cm4gcmV0dXJubm90Zm91bmRpZHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXREb2NFbGVtZW50c0J5VGFnKGVsZW0sIHRhZ05hbWUpIHtcbiAgICAgICAgbGV0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KGVsZW0pIGFzIGFueTtcbiAgICAgICAgdGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCB7fSk7XG4gICAgICAgIGlmICghKHRhZ05hbWUgaW4gY2FjaGUpKSB7XG4gICAgICAgICAgICBjYWNoZVt0YWdOYW1lXSA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCBjYWNoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlW3RhZ05hbWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldCBhIGxpc3Qgb2YgYWxsIHRoZSBjaGlsZCBlbGVtbnRzIHdoaWNoIG1hdGNoIHRoZSB0YWdcbiAgICAgKiBuYW1lIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldENoaWxkQnlUYWdIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBwYXJlbnRFbGVtIC0gVGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge3N0cmluZ30gdGFnTmFtZSAtIFRoZSB0YWcgdG8gc2VhcmNoIGZvciB1bmRlciB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbGVhbn0gaWdub3JlSGlkZGVuIC0gdHJ1ZSBpZiBoaWRkZW4gZWxlbWVudHMgd2l0aCB0aGUgdGFnIHNob3VsZCBpZ25vcmVkIGZyb20gdGhlIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgYWRkZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSB0YWcgdW5kZXIgdGhlIHBhcmVudCB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENoaWxkQnlUYWcocGFyZW50RWxlbSwgdGFnTmFtZSkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGNoaWxkIGVsZW1udHMgd2hpY2ggbWF0Y2ggdGhlIHRhZ1xuICAgICAqIG5hbWUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gcGFyZW50RWxlbSAtIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHRhZ05hbWUgLSBUaGUgdGFnIHRvIHNlYXJjaCBmb3IgdW5kZXIgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggdGhlIHRhZyBzaG91bGQgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgdGFnIHVuZGVyIHRoZSBwYXJlbnQgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGlnbm9yZUhpZGRlbiwgY29uc2lkZXJIaWRkZW5TZXR0aW5nKSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgbGV0IGNoaWxkID0gcGFyZW50RWxlbS5maXJzdENoaWxkO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBwYXJlbnQgdG8gYnVpbGQgYSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgdGhhdFxuICAgICAgICAvLyBtYXRjaCB0aGUgdGFnTmFtZSBwcm92aWRlZFxuICAgICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkge1xuXG4gICAgICAgICAgICAvLyBPbmx5IGluY2x1ZGUgdGhlIGNoaWxkcmVuIGludG8gdGhlIHJldHVybiBhcnJheSBpZiB0aGV5IG1hdGNoIHdpdGggdGFnbmFtZS5cbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGlnbm9yZWhpZGRlbiB3YXMgc2V0IHRvIHRydWUsIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGUgY2hlY2tcbiAgICAgICAgICAgICAgICAvLyBhbmQgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2lsYmxlIHdlIG1vcmUgdG8gdGhlc2VzIHRoZW4gbW92ZSB0byB0aGUgbmV4dCBub2RlLlxuICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gYSBjb3VwbGUgb2YgY2hlY2tzIHRvIGRldGVybWluZSBpZiBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGlnbm9yZWQgb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBXaGVuIGlnbm9yZUhpZGRlbiBpcyBzZXQgdG8gdHJ1ZSB1cGZyb250LCB0aGVuIHBlcmZvcm0gYSBpc05vZGVWaXNpYmxlXG4gICAgICAgICAgICAgICAgLy8gIDIuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAvLyAgMi4xLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgaWYgKChpZ25vcmVIaWRkZW4gfHwgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiAhQ29tbW9uVXRpbC5zaG91bGRDaGVja0hpZGRlbkNvbnRlbnQoY2hpbGQpKSkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUHVzaCB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnRcbiAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBtYXRjaCBnaXZlbiByb2xlcyhzKS5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIENoZWNrIEhpZGRlbiBTZXR0aW5nIGF0IGFsbC5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIGltcGxpY2l0IHJvbGVzLlxuICAgICAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogQXJpYVV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gcmV0dXJuIGVsZW1lbnRzIGJhc2VkIG9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgcm9sZShzKSB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRzQnlSb2xlKGRvYywgcm9sZXMpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbGlzdCBvZiBlbGVtZW50cyB0aGF0IG1hdGNoIGdpdmVuIHJvbGVzKHMpLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byByZXR1cm4gZWxlbWVudHMgYmFzZWQgb24uXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSByb2xlKHMpIHRoYXQgd2VyZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIFxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIHRvIGVsZW1lbnQgYXNzb2ljYXRpb24gaXMgYWxyZWFkeSBtYWRlLCBhbmQgYXZhaWxhYmxlIGluIHRoZSBnbG9iYWwgaGFzQXR0cmlidXRlXG4gICAgICAgIC8vIHdlIGNhbiBqdXN0IHVzZSB0aGF0IG9uZSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgbmV3IG9uZS5cbiAgICAgICAgbGV0IHJvbGVUb0VsZW1zID0gbnVsbDtcbiAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvbGVUb0VsZW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9HRVRFTEVNRU5UU0JZX1JPTEVcIiwgbnVsbCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBuZXcgcm9sZSB0byBlbGVtZW50LCB0aGlzIGlzIHdoZXJlIHdlIGxvb3AgdGhyb3VnaCBhbGwgdGhlIGVsZW1lbnRzIGFuZCBleHRyYWN0IGFsbCB0aGVcbiAgICAgICAgLy8gZWxlbWVudHMgYnNhZWQgb24gcm9sZXMuXG4gICAgICAgIGlmIChyb2xlVG9FbGVtcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0aGUgcm9sZVRvRWxlbXMgaGFzaFxuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSB7fTtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBib2R5IG9mIHRoZSBkb2NcbiAgICAgICAgICAgIGxldCByb290ID0gZG9jLmJvZHk7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyB1bnRpbCB3ZSBhcmUgYXQgdGhlIHZlcnkgcGFyZW50IG5vZGUgb2YgdGhlIGVudGlyZSBwYWdlLCBzbyB0aGF0IHdlIGNhbiBsb29wIHRocm91Z2hcbiAgICAgICAgICAgIC8vIGFsbCB0aGUgbm9kZXMuXG4gICAgICAgICAgICB3aGlsZSAoRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgICAgICByb290ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCdWlsZCBhIG5vZGV3YWx0ZXIgYmFzZWQgb2YgdGhlIHJvb3Qgbm9kZSwgdGhpcyBub2RlIHdhbHRlciB3aWxsIGJlIHVzZSBsb29wIG92ZXIgYWxsIHRoZSBub2Rlc1xuICAgICAgICAgICAgLy8gYW5kIGJ1aWxkIHRoZSByb2xlcyB0byBFbGVtZW50IGNvcmFsYXRpb25cbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocm9vdCk7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgdGhlIGVudGlyZSBkb2MvbGlzdCBvZiBub2RlcyB0byBidWlsZCB0aGUgcm9sZSB0byBlbGVtZW50IG1hcFxuICAgICAgICAgICAgLy8gTm90ZTogVGhpcyB3aWxsIGJ1aWxkIGFuIHJvbGVUb0VsZW1zIGhhc2ggd2hpY2ggaXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQuXG4gICAgICAgICAgICAvLyByb2xlVG9FbGVtcyA9IHtcbiAgICAgICAgICAgIC8vICAgIGRvY3VtZW50OiBbe2Rpdn0se2FiYnJ9LHt2YXJ9XSxcbiAgICAgICAgICAgIC8vICAgIG1haW46IFt7ZGl2fV0sXG4gICAgICAgICAgICAvLyAgICBuYXZpZ2F0aW9uOiBbe2Rpdn1dXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmICghbncuZWxlbSgpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNoZWNrIHRoZSBlbGVtZW50cyB3aGljaCBoYXZlIHRoZSByb2xlIGF0dHJpYnV0ZSBhc3NpY2lhdGVkIHRvIHRoZW1cbiAgICAgICAgICAgICAgICBpZiAoIW53LmJFbmRUYWcpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd1JvbGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlIG5vZGUgaGFzIHJvbGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICBpZiAobncuZWxlbSgpICYmIG53LmVsZW0oKS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGFsbCB0aGUgcm9sZXMgdGhhdCBhcmUgYXNzaWduZWQgdG8gdGhpcyBlbGVtZW50LCBjYW4gaGF2ZSBtdWx0aXBsZSByb2xlcyBvbiBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgc3BsaXQgYnkgc3BhY2UsIHNvIHdlIG5lZWQgdG8gZXh0cmFjdCBhbGwgb2YgdGhlbSBpbnRvIGFuIGFycmF5LlxuICAgICAgICAgICAgICAgICAgICAgICAgd1JvbGVzID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInJvbGVcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG53LmVsZW0oKSAmJiB3Um9sZXMubGVuZ3RoID09PSAwICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXRSb2xlID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKG53Lm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Um9sZXMgPSBpbXBsaWNpdFJvbGU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAod1JvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSByb2xlcyBhbmQgYXNzaWduZWQgdGhpcyBub2RlIHRvIGFsbCB0aGVzIHJvbGVzXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd1JvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIGtleSBpcyBub3QgYWxyZWFkeSBpbiB0aGUgcm9sZVRvRWxlbXMgaGFzaCwgY29uc3RydWN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBrZXkgYW5kIGFzc2lnbiBlbXB0eSBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHdSb2xlc1tpXSBpbiByb2xlVG9FbGVtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlVG9FbGVtc1t3Um9sZXNbaV1dID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgYXJyYXkgZm9yIHRoZSByb2xlXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlVG9FbGVtc1t3Um9sZXNbaV1dLnB1c2gobncubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgcm9sZVRvRWxlbXMgaGFzaCBtYXAgYXMgYSBnbG9iYWwgdmFyaWFibGVcbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCByb2xlVG9FbGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfR0VURUxFTUVOVFNCWV9ST0xFXCIsIHJvbGVUb0VsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlsaXplIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgdGhlIHByb3ZpZGVkIHJvbGUgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSxcbiAgICAgICAgLy8gZm9yIHRoaXMgY2FzZSB3ZSB0YWtlIHRoZSBzdHJpbmcgYW5kIHB1dCBpdCBpbnRvIGFuIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2YgKHJvbGVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSByb2xlcztcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICByb2xlcy5wdXNoKHJvbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSByb2xlcyB0aGF0IHdlcmUgcHJvdmlkZWQgYW5kIGZpbmQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgZm9yIHRoaXMgcm9sZXNcbiAgICAgICAgLy8gYW5kIGFkZCB0aGVtIHRvIHRoZSByZXR1cm4gdmFsdWUuXG4gICAgICAgIGlmIChyb2xlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIHJvbGVzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgcm9sZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGxldCBuZXh0Um9sZSA9IHJvbGVzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEZldGNoIHRoZSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgZm9yIHRoaXMgcm9sZVxuICAgICAgICAgICAgICAgIGxldCBjb3B5Um9sZXMgPSByb2xlVG9FbGVtc1tuZXh0Um9sZV07XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgZWxlbWVudHMgdG8gY29weSB0byBhbm90aGVyIGFycmF5LCB0aGVuIHBlcmZvcm0gdGhlIGNvcHlcbiAgICAgICAgICAgICAgICBpZiAoY29weVJvbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIGFyZSB0byBiZSBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3B5Um9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIGVsZW1lbnQgdG8gdGhlIHJldHVybiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNvcHlSb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBhIHRhcmdldCBpcyBlbiBlbGVtZW50IHRoYXQgYWNjZXB0IGEgcG9pbnRlciBhY3Rpb24gKGNsaWNrIG9yIHRvdWNoKVxuICAgICAgICAgKiBcbiAgICAgICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1RhcmdldChlbGVtZW50KSB7IFxuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5ub2RlVHlwZSAhPT0gMSBcbiAgICAgICAgICAgIHx8IFtcImh0bWxcIiwgXCJib2R5XCJdLmluY2x1ZGVzKGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgW1wic3ZnXCIsIFwicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIiwgJ2hlYWQnXSkgIT09IG51bGwgXG4gICAgICAgICAgICB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpIHx8IFZpc1V0aWwuaXNOb2RlVmlzdWFsbHlIaWRkZW4oZWxlbWVudCkgXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKGVsZW1lbnQpIHx8IFZpc1V0aWwuaXNFbGVtZW50T2Zmc2NyZWVuKGVsZW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNDbGlja2FibGUoZWxlbWVudCkpIFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtZW50KTtcbiAgICAgICAgaWYgKCFyb2xlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0X3JvbGVzID0gW1wibGlzdGl0ZW1cIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzd2l0Y2hcIiwgXCJ0cmVlaXRlbVwiXTtcbiAgICAgICAgaWYgKHRhcmdldF9yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgLy8gZmluZCB0aGUgcHJvcGVyIHBhcmVudCBlbGVtZW50c1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRfcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIC8vIGRhdGFsaXN0LCBmaWVsZHNldCwgb3B0Z3JvdXAsIGV0Yy4gbWF5IGJlIGp1c3QgdXNlZCBmb3IgZ3JvdXBpbmcgcHVycG9zZSwgc28gZ28gdXAgdG8gdGhlIHBhcmVudFxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfcm9sZSA9PT0gJ2dyb3VwJylcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgQ29tbW9uVXRpbC5pc1RhcmdldChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRGaWxlRXh0KHVybCkge1xuICAgICAgICBsZXQgbSA9IHVybC5tYXRjaCgvXFwuKChbXjs/I1xcLl18XiQpKykoWzs/I118JCkvKTtcbiAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIuXCIgKyBtWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbGVBbmNob3IodXJsKSB7XG4gICAgICAgIGxldCBtID0gdXJsLm1hdGNoKC8jKChbXjs/XFwuXXxeJCkrKShbOz9dfCQpLyk7XG4gICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIG1bMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tPYmpFbWJlZChub2RlLCBleHRUZXN0LCBtaW1lVGVzdCkge1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lICE9IFwib2JqZWN0XCIgJiYgbm9kZU5hbWUgIT0gXCJlbWJlZFwiICYmXG4gICAgICAgICAgICBub2RlTmFtZSAhPSBcImFcIiAmJiBub2RlTmFtZSAhPSBcImFyZWFcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIC8vIENoZWNrIG1pbWUgdHlwZVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCBtaW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcImNvZGV0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgbWltZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiY29kZXR5cGVcIik7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSBmaWxlbmFtZVxuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJlbWJlZFwiKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiYVwiIHx8IG5vZGVOYW1lID09PSBcImFyZWFcIikge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmhhc0F0dHJpYnV0ZShcImRhdGFcIikpIHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlbmFtZSA9PT0gbnVsbCkgZmlsZW5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dChmaWxlbmFtZSk7XG4gICAgICAgICAgICByZXRWYWwgPSBleHRUZXN0KGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgZmlsZW5hbWVzIGluIHRoZSBwYXJhbXNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgbm9kZU5hbWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgQ2hlY2sgSGlkZGVuIE9wdGlvbiBpcyBzZXQgdGhlbiBjb21wbHkgd2l0aCB0aGF0IHNldHRpbmdcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4obm9kZSwgXCJwYXJhbVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBwYXJhbXMgIT0gbnVsbCAmJiBpIDwgcGFyYW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcGFyYW1zW2ldLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIGV4dFRlc3QoQ29tbW9uVXRpbC5nZXRGaWxlRXh0KHBhcmFtc1tpXS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNBdWRpb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgQ29tbW9uVXRpbC5pc0F1ZGlvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImF1ZGlvXCIpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzQXVkaW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCBhdWRpb19leHRlbnNpb25zID0gW1wiLmFpZlwiLCBcIi5haWZjXCIsIFwiLmFpZmZcIiwgXCIuYWlyXCIsIFwiLmFzZlwiLCBcIi5hdVwiLCBcIi5jZGFcIixcbiAgICAgICAgICAgIFwiLmRzbVwiLCBcIi5kc3NcIiwgXCIuZHdkXCIsIFwiLmlmZlwiLCBcIi5rYXJcIiwgXCIubTFhXCIsIFwiLm1lZFwiLFxuICAgICAgICAgICAgXCIubXAyXCIsIFwiLm1wM1wiLCBcIi5tcGFcIiwgXCIucGNtXCIsIFwiLnJhXCIsIFwiLnJhbVwiLCBcIi5ybVwiLFxuICAgICAgICAgICAgXCIuc2FtXCIsIFwiLnNmXCIsIFwiLnNmMlwiLCBcIi5zbXBcIiwgXCIuc25kXCIsIFwiLnN2eFwiLCBcIi51bFwiLFxuICAgICAgICAgICAgXCIudm9jXCIsIFwiLndhdlwiLCBcIi53bWFcIiwgXCIud3ZlXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShleHQudG9Mb3dlckNhc2UoKSwgYXVkaW9fZXh0ZW5zaW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNWaWRlb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgQ29tbW9uVXRpbC5pc1ZpZGVvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcInZpZGVvXCIpIHx8XG4gICAgICAgICAgICAgICAgbWltZS5zdGFydHNXaXRoKFwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2hcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzVmlkZW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCB2aWRlb19leHRlbnNpb25zID0gW1wiLmFzZlwiLCBcIi5hdmlcIiwgXCIuZGl2eFwiLCBcIi5kdlwiLCBcIi5tMXZcIiwgXCIubTJwXCIsIFwiLm0ydlwiLCBcIi5tb292XCIsXG4gICAgICAgICAgICBcIi5tb3ZcIiwgXCIubXA0XCIsIFwiLm1wZWdcIiwgXCIubXBnXCIsIFwiLm1wdlwiLCBcIi5vZ21cIiwgXCIub21mXCIsIFwiLnF0XCIsXG4gICAgICAgICAgICBcIi5ybVwiLCBcIi5ydlwiLCBcIi5zbWlcIiwgXCIuc21pbFwiLCBcIi5zd2ZcIiwgXCIudm9iXCIsIFwiLndtdlwiLCBcIi5ybXZiXCIsXG4gICAgICAgICAgICBcIi5tdmJcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCB2aWRlb19leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0ltYWdlT2JqRW1iZWRMaW5rKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuY2hlY2tPYmpFbWJlZChub2RlLCBDb21tb25VdGlsLmlzSW1nRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImltYWdlXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGltYWdlX2V4dGVuc2lvbnMgPSBbXCIuYm1wXCIsIFwiLmdpZlwiLCBcIi5qcGdcIiwgXCIuanBlZ1wiLCBcIi5wY3hcIiwgXCIucG5nXCJdO1xuICAgICAgICBcbiAgICBwdWJsaWMgc3RhdGljIGlzSW1nRXh0KGV4dCkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBDb21tb25VdGlsLmltYWdlX2V4dGVuc2lvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEV4dChleHQpIHtcbiAgICAgICAgbGV0IGh0bWxfZXh0ZW5zaW9ucyA9IFtcIi5hc3BcIiwgXCIuYXNweFwiLCBcIi5jZm1cIiwgXCIuY2ZtbFwiLCBcIi5jZ2lcIiwgXCIuaHRtXCIsIFwiLmh0bWxcIiwgXCIuc2h0bVwiLFxuICAgICAgICAgICAgXCIuc2h0bWxcIiwgXCIucGhwXCIsIFwiLnBsXCIsIFwiLnB5XCIsIFwiLnNodG1cIiwgXCIuc2h0bWxcIiwgXCIueGh0bWxcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBodG1sX2V4dGVuc2lvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzVHJpZ2dlcmVkKGRvYywgaWQpIHtcbiAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIGlkLCBmYWxzZSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgdHJpZ2dlck9uY2UoZG9jLCBpZCwgcGFzc2VkKSB7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgdHJpZ2dlcmVkID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgaWQsIGZhbHNlKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgaWQsIHRydWUpO1xuICAgICAgICByZXR1cm4gdHJpZ2dlcmVkO1xuICAgIH1cblxuICAgIC8qIGRldGVybWluZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgZXhpc3RzIGluIHRoZSBnaXZlbiBhcnJheSAqL1xuICAgIHB1YmxpYyBzdGF0aWMgdmFsSW5BcnJheSh2YWx1ZSwgYXJyKSB7XG4gICAgICAgIGZvciAobGV0IGlkeCBpbiBhcnIpIHtcbiAgICAgICAgICAgIGlmIChhcnJbaWR4XSA9PT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gICAgICogQHBhcmFtIHRhZ05hbWVzIHN0cmluZywgYXJyYXksIG9yIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgdGFncyB0byBzZWFyY2ggZm9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcihlbGVtZW50LCB0YWdOYW1lcykge1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0aGlzVGFnID0gd2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRhZ05hbWVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzVGFnID09PSB0YWdOYW1lcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4IGluIHRhZ05hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdOYW1lc1tpZHhdID09PSB0aGlzVGFnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1RhZyBpbiB0YWdOYW1lcykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH1cblxuICAgIC8vIHJldHVybiB0cnVlIGlmIGVsZW1lbnQxIGFuZCBlbGVtZW50MiBhcmUgc2libGluZ3NcbiAgICBwdWJsaWMgc3RhdGljIGlzU2libGluZyhlbGVtZW50MSwgZWxlbWVudDIpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQxICYmIGVsZW1lbnQyKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudDEpICYmIERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKS5maXJzdENoaWxkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlID09PSBlbGVtZW50MikgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEZXNjZW5kYW50KHBhcmVudCwgY2hpbGQpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShjaGlsZCk7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9jaGVjayBpZiB0aGUgZmlyc3QgZm9ybSBjb250cm9sIGNoaWxkIGlzIGRpc2FibGVkXG4gICAgcHVibGljIHN0YXRpYyBpc0Rpc2FibGVkQnlGaXJzdENoaWxkRm9ybUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgZm9ybUVsZW1lbnRzID0gW1wiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiLCBcImtleWdlblwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJvdXRwdXRcIl07XG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm1FbGVtZW50cy5pbmNsdWRlcyhudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKG53Lm5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEaXNhYmxlZEJ5UmVmZXJyaW5nRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIGxldCBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGxldCBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCByb290ID0gZG9jLmJvZHk7XG4gICAgICAgIHdoaWxlIChET01XYWxrZXIucGFyZW50Tm9kZShyb290KSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlXG4gICAgICAgICAgICByb290ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihyb290KTtcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBlbGVtZW50IHdob3NlICdhcmlhLWRlc2NyaWJlZGJ5JyBlcXVhbHMgdG8gdGhlIGlkXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGxldCBBcmlhRGVzY3JpYmVkYnlJREFycmF5ID0gKG53LmVsZW0oKS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYURlc2NyaWJlZGJ5SURBcnJheS5pbmNsdWRlcyhpZCkgJiYgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBnZXQgZWxlbWVudCBjb250YWluaW5nIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbWlzbGVhZGluZy4gVXNlIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSBpbnN0ZWFkXG4gICAgICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5wdXRMYWJlbChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtlbGVtZW50fSBlbGVtZW50IC0gcmV0dXJuIHRoZSBlbGVtZW50IGZvciB0aGUgbGFiZWwsIG90aGVyd2lzZSBudWxsXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBsYWJlbCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIGNvbnRhaW5pbmcgbGFibGUgZWxlbWVudCBpcyBoaWRkZW4sIHdoZW4gdGhlIGlnbm9yZUhpZGRlbiBvcHRpb25cbiAgICAgKiBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggbGFiZWwgc2hvdWxkIGJlIGlnbm9yZWQgZnJvbSB0aGUgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiB0aGUgaGlkZGVuIGVsZW1lbnRzIHNob3VsZCBiZSBhZGRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7ZWxlbWVudH0gZWxlbWVudCAtIHJldHVybiB0aGUgZWxlbWVudCBmb3IgdGhlIGxhYmVsLCBvdGhlcndpc2UgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4oZWxlbWVudDogRWxlbWVudCwgaWdub3JlSGlkZGVuKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBnbG9iYWwgQXJpYVV0aWxfTEFCRUxTIGhhc2ggaXMgYXZhaWxhYmxlLCBhcyB0aGlzIHdpbGwgY29udGFpbiB0aGUgbGFiZWwgbm9kZXMgYmFzZWQgb25cbiAgICAgICAgLy8gZm9yIGF0dHJpYnV0ZS5cbiAgICAgICAgLy9pZiAoIWdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCxcIkFyaWFVdGlsX0xBQkVMU1wiLCBudWxsKSkge1xuICAgICAgICBsZXQgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICAgICAgaWYgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUoKHJvb3Qubm9kZVR5cGUgPT09IDExKSA/IDxTaGFkb3dSb290PnJvb3QgOiA8RG9jdW1lbnQ+cm9vdCwgXCJBcmlhVXRpbF9MQUJFTFNcIiwgbnVsbCkpIHtcbiAgICAgICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgICAgICBsZXQgaWRUb0xhYmVsID0ge31cblxuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgbGFiZWwgZWxlbWVudHMgaW4gdGhlIGVudGlyZSBkb2NcbiAgICAgICAgICAgIGxldCBsYWJlbE5vZGVzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYWJlbCBub2RlcywgaW4gdGhlIGNhc2UgdGhlIGxhYmVsIG5vZGUgaGFzIGEgZm9yIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgdGhhdCBhdHRyaWJ1dGUgYW5kIGFkZCB0aGlzIG5vZGUgdG8gdGhlIGhhc2ggaWYgaXQgaXMgdmlzaWJsZS5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFiZWxOb2Rlcy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiZm9yXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGlnbm9yZSBoaWRkZW4gaXMgc3BlY2lmaWVkIGFuZCB0aGUgbm9kZSBpcyBub3QgdmlzaWJsZSB3ZSBkbyBub3QgYWRkIGl0IHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBsYWJlbE5vZGVzIGhhc2guXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVIaWRkZW4gJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShsYWJlbE5vZGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZFRvTGFiZWxbbGFiZWxOb2Rlc1tpXS5nZXRBdHRyaWJ1dGUoXCJmb3JcIildID0gbGFiZWxOb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgYnVpbHQgaGFzaCB0byB0aGUgb3duZXJEb2N1bWVudCAoZG9jdW1lbnQpLCB0byBiZSB1c2VkIGxhdGVyIHRvIGZhc3QgcmV0cml2YWxcbiAgICAgICAgICAgIC8vc2V0Q2FjaGUoZWxlbWVudC5vd25lckRvY3VtZW50LCBcIkFyaWFVdGlsX0xBQkVMU1wiLCBpZFRvTGFiZWwpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSkgPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiQXJpYVV0aWxfTEFCRUxTXCIsIGlkVG9MYWJlbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgaGFzIGFuIGlkIGF0dHJpYnV0ZSwgZ2V0IHRoZSBjb3Jvc3BvbmRpbmcgbGFiZWwgZWxlbWVudFxuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIGlkIGF0dHJpYnV0ZVxuICAgICAgICAgICAgbGV0IGN0cmxJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcm9zcG9uZGluZyBsYWJlbCBlbGVtZW50LlxuICAgICAgICAgICAgLy8gTm90ZTogaW4gdGhlIGNhc2UgdGhhdCB0aGUgdGhlIGlkIGlzIG5vdCBmb3VuZCBpbiB0aGUgaGFzaCB0aGF0IG1lYW5zLCBpdCBkb2VzIG5vdCBleGlzdHMgb3IgaXMgaGlkZGVuXG4gICAgICAgICAgICBpZiAoY3RybElkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gZ2V0Q2FjaGUoZWxlbWVudC5nZXRSb290Tm9kZSgpLm93bmVyRG9jdW1lbnQsXCJBcmlhVXRpbF9MQUJFTFNcIix7fSlbY3RybElkXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLmdldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSkgPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiQXJpYVV0aWxfTEFCRUxTXCIsIHt9KVtjdHJsSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiBzcGVjaWZpZWQgZWxlbWVudCBhdHRyaWJ1dGUgaWYgcHJlc2VudCBlbHNlIHJldHVybiBudWxsICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50QXR0cmlidXRlKGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgLy9yZXR1cm4gKGVsZW1lbnQgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cikpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cikgOiBudWxsO1xuICAgICAgICBpZiAoIWF0dHIgfHwgIWVsZW1lbnQgfHwgIWVsZW1lbnQuaGFzQXR0cmlidXRlIHx8ICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGF0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cilcbiAgICAgICAgaWYgKCFBUklBRGVmaW5pdGlvbnMucmVmZXJlbmNlUHJvcGVydGllcy5pbmNsdWRlcyhhdHRyKSlcbiAgICAgICAgICAgIHJldHVybiBhdHJWYWx1ZTtcblxuICAgICAgICAvL2F0dHIgaXMgYSByZWZlcmVuY2UgdG8gb3RoZXIgZWxlbWVudHMocylcbiAgICAgICAgY29uc3QgdmFsdWVzID0gYXRyVmFsdWUuc3BsaXQoLyArL2cpO1xuICAgICAgICAvL2lnbm9yZSBpZiBub25lIG9mIHRoZSByZWZlcnJlZCBlbGVtZW50KHMpIGV4aXN0IG9yIGFsbCBwb2ludCB0byB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICAgICAgbGV0IGV4aXN0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGlkID0gMDsgdmFsdWVzIDwgdmFsdWVzLmxlbmd0aDsgKytpZCkge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJyZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2YWx1ZXNbaWRdKTtcbiAgICAgICAgICAgIGlmIChyZWZlcnJlZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShyZWZlcnJlZCwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4aXN0ID8gYXRyVmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIGVsZW1lbnQgaGFzIHZhbGlkIGltcGxpY2l0IGxhYmVsXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbXBsaWNpdExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgIC8vIFRlc3QgIGEpIGlmIHRoZSBwYXJlbnQgaXMgYSBsYWJlbCB3aGljaCBpcyB0aGUgaW1wbGljaXQgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYikgaWYgdGhlIGZvcm0gZWxlbWVudCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxhYmVsXG4gICAgICAgIC8vICAgICAgIGMpIGlmIHRoZSBmb3JtIGVsZW1lbnQgcmVxdWlyZXMgYW4gaW1wbGljaXQgb3IgZXhwbGljaXQgbGFiZWwgOiBcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXG4gICAgICAgIC8vICAgICAgIGQpIGZvcm0gZWxlbWVudHMgd2hpY2ggbWF5IGhhdmUgYSBsYWJlbDogYnV0dG9uXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCBlbGVtZW50IGFyZTpcbiAgICAgICAgLy8gXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImRhdGFsaXN0XCIoYWRkZWQgbGF0ZXIpLiBUaGVzZSB3ZXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIG1haW4gcnVsZSwgbWlnaHQgbmVlZCB0byByZWZhY3RvciB0aGUgY29kZSBsYXRlclxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICBwYXJlbnRDbG9uZSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgIHJldHVybiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihwYXJlbnRDbG9uZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGltcGxpY2l0IGxhYmVsIG9mIHRoZSBnaXZlbiBmb3JtIGZpZWxkXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbXBsaWNpdExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgIC8vIFRlc3QgIGEpIGlmIHRoZSBwYXJlbnQgaXMgYSBsYWJlbCB3aGljaCBpcyB0aGUgaW1wbGljaXQgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYikgaWYgdGhlIGZvcm0gZWxlbWVudCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxhYmVsXG4gICAgICAgIC8vICAgICAgIGMpIGlmIHRoZSBmb3JtIGVsZW1lbnQgcmVxdWlyZXMgYW4gaW1wbGljaXQgb3IgZXhwbGljaXQgbGFiZWwgOiBcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXG4gICAgICAgIC8vICAgICAgIGQpIGZvcm0gZWxlbWVudHMgd2hpY2ggbWF5IGhhdmUgYSBsYWJlbDogYnV0dG9uXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCBlbGVtZW50IGFyZTpcbiAgICAgICAgLy8gXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImRhdGFsaXN0XCIoYWRkZWQgbGF0ZXIpLiBUaGVzZSB3ZXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIG1haW4gcnVsZSwgbWlnaHQgbmVlZCB0byByZWZhY3RvciB0aGUgY29kZSBsYXRlclxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICBwYXJlbnRDbG9uZSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgcmV0dXJuIGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gJycgPyBsYWJlbC50cmltKCkgOiBudWxsO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgdGhlIGxhYmVsIGZvciBhIGZvcm0gZmllbGQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRleHQgLSByZXR1cm4gdGhlIGxhYmVsIHRleHQgb3IgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRGb3JtRmllbGRMYWJlbChlbGVtKSA6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAvLyBnZXQgdGhlIGxhYmVsIGZyb20gdGhlIGF0dHJpYnV0ZSBcImZvclwiIG9mIHRoZSBsYWJlbCBlbGVtZW50XG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgdmFsdWUgPSBcIlwiO1xuICAgICAgICBsZXQgbGFiZWwgPSBudWxsO1xuICAgICAgICBsZXQgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4oZWxlbSwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgIC8vIHZhbHVlIGRpcmVjdGx5IGZyb20gZWxlbWVudCB0ZXh0XG4gICAgICAgICAgICBsYWJlbCA9IGxhYmVsRWxlbS5pbm5lclRleHQ7IC8vIGlnbm9yZSBoaWRkZW4gdGV4dFxuICAgICAgICB9IGVsc2UgeyAgICBcbiAgICAgICAgICAgIC8qKiBpZiBpdCdzIG5vdCBsYWJlbCB3aXRoIGZvciBhdHRyaWJ1dGUsIHRoZW4gZmluZCBpbXBsaWNpdCBsYWJlbFxuICAgICAgICAgICAgICogY2FzZXMgZm9yIGV4cGxpY3QgbGFiZWw6IFxuICAgICAgICAgICAgICogICA8bGFiZWwgZm9yPSdteSc+PC9sYWJlbD48aW5wdXQgaWQ9J215Jy8+XG4gICAgICAgICAgICAgKiAgIDxsYWJlbCBmb3I9J215Jz48aW5wdXQgaWQ9J215Jy8+PC9sYWJlbD4gICBcbiAgICAgICAgICAgICAqIGNhc2VzIGZvciBpbXBsaWNpdCBsYWJlbDogXG4gICAgICAgICAgICAgKiAgICA8bGFiZWw+PGlucHV0IC8+PC9sYWJlbD5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBcImxhYmVsXCIpO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSAmJiBsYWJlbEVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQobGFiZWxFbGVtLCBlbGVtKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IGxhYmVsRWxlbS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgdGhlIHRleHQgZnJvbSB0aGUgZmlyc3QgZm9ybSBlbGVtZW50IHNpbmNlIHRoZXkgbWlnaHQgYWxzbyBcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGlubmVyIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIGlubmVyVGV4dFxuICAgICAgICAgICAgICAgIHBhcmVudENsb25lID0gQ29tbW9uVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgICAgIGxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG4gICAgICAgIFxuICAgICAgICAvLyB2YWx1ZSBmcm9tIGNoaWxkIGVsZW1lbnQgYXR0cmlidXRlXG4gICAgICAgIGxhYmVsID0gQ29tbW9uVXRpbC5nZXRMYWJlbFRleHRGcm9tQXR0cmlidXRlKGxhYmVsRWxlbSwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG5cbiAgICAgICAgLy8gd2lyZWQgY2FzZTogZ2V0IGFyaWEgbGFiZWwgZnJvbSBsYWJlbCBlbGVtZW50IGl0c2VsZiBqdXN0IGluIGNhc2UgKHRob3VnaCBuYW1lIHByb2hpYml0ZWQgZnJvbSBhcmlhIGluIGh0bWwpXG4gICAgICAgIGxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKGxhYmVsRWxlbSk7XG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjYWxjdWxhdGUgbGFiZWwgZnJvbSBlbWJlZGRlZCBjb250cm9sOiBodHRwczovL3czYy5naXRodWIuaW8vYWNjbmFtZS9cbiAgICAgKiBAcGFyYW0ge2VsZW1lbnR9IGxhYmVsRWxlbSBsYWJlbCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVIaWRkZW4gLSB0cnVlIGlmIGhpZGRlbiBlbGVtZW50cyB3aXRoIGxhYmVsIHNob3VsZCBiZSBpZ25vcmVkIGZyb20gdGhlIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgYWRkZWQgIFxuICAgICAqIEByZXR1cm5zIGxhYmVsIHRleHQgb3IgJydcbiAgICAgKiBcbiAgICAgKiBub3RlIHRoZSBhc3N1bXB0aW9uIGlzIHRoZSBsYWJlbEVsZW0gcmVmZXJzIGVpdGhlciB0byBhIGxhYmVsbGVkIGVsZW1lbnQgYnkgJ2ZvcicgYXR0cmlidXRlIFxuICAgICAqICBvciBpdHMgZmlyc3QgZm9ybSBmaWVsZCBpcyBsYWJiZWxsZWQgZWxlbWVudFxuICAgICAqLyBcbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsVGV4dEZyb21BdHRyaWJ1dGUobGFiZWxFbGVtOiBFbGVtZW50LCBpZ25vcmVIaWRkZW46IGJvb2xlYW4pIDogc3RyaW5nIHtcbiAgICAgICAgLy8gbGFiZWwgZWl0aGVyIHBvaW50cyB0byBhIGxhYmVsYWJsZSBlbGVtZW50IGJ5IGl0cyBmb3IgYXR0cmlidXRlIG9yIHRoZSBmaXJzdCBlbGVtZW50IGNoaWxkXG4gICAgICAgIC8vIGdldCB0aGUgbGFiZWxsZWQgZWxtZW50IGlmIGl0J3MgYW4gaW1wbGljaXQgbGFiZWxcbiAgICAgICAgbGV0IGxhYmVsZWRFbGVtID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGFiZWxFbGVtLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZDogRWxlbWVudCA9IGxhYmVsRWxlbS5jaGlsZHJlbi5pdGVtKGkpO1xuICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuZm9ybV9sYWJlbGFibGVfZWxlbWVudHMuaW5jbHVkZXMoY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbGVkRWxlbSA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGxhYmVsRWxlbSk7XG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgLy8gb25seSBjaGVjayBlbGVtZW50IGNoaWxkcmVuXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBudy5lbGVtKCk7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIGl0J3MgaGlkZGVuLCBvciBsYWJlbGxlZCBlbGVtZW50LCBvciBmaXJzdCBmb3JtIGVsZW1lbnQgaWYgbm90IGxhYmVsZWQgYnkgZm9yIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGlmICgoaWdub3JlSGlkZGVuICYmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSB8fCBWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGVsZW0pKSlcbiAgICAgICAgICAgICAgICAgICAgfHwgKGxhYmVsZWRFbGVtICYmIGxhYmVsZWRFbGVtLmNvbnRhaW5zKGVsZW0pKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgIC8vIHRleHRib3ggZXRjLiByZXR1cm4gaXRzIHRleHQgdmFsdWVcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJ0ZXh0Ym94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIG5hbWUudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb2xlID09PSBcImNvbWJvYm94XCIgfHwgcm9sZSA9PT0gXCJsaXN0Ym94XCIpIHsgXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb21ib2JveCBvciBsaXN0Ym94IHJvbGVzLCByZXR1cm4gdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGNob3NlbiBvcHRpb24uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb24gPSBlbGVtLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZWN0ZWRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgc2VsZWN0ZWRPcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShzZWxlY3RlZE9wdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFtcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiLCBcIm1ldGVyXCJdLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciByYW5nZSByb2xlIHR5cGUsIGluY2x1ZGluZyBcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiIHJvbGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcmlhLXZhbHVldGV4dCBwcm9wZXJ0eSBpcyBwcmVzZW50LCByZXR1cm4gaXRzIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBhcmlhLXZhbHVlbm93IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxseSB1c2UgbmF0aXZlIHZhbHVlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgYXJpYSBsYWJlbCBmcm9tIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSAhPT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dC50cmltKCk7ICAgIFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNGaXJzdEZvcm1FbGVtZW50KHBhcmVudE5vZGUsIGVsZW1lbnQpIHtcbiAgICAgICAgLy9sZXQgZm9ybUVsZW1lbnRzUmVxdWlyaW5nTGFiZWwgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXTtcbiAgICAgICAgaWYgKHBhcmVudE5vZGUuZmlyc3RDaGlsZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHBhcmVudE5vZGUpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmRleE9mKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudy5ub2RlID09PSBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBzaGFkb3cgaG9zdCBvciBkZXNjZW5kYW50IG9mIGEgc2hhZG93IGhvc3QsIGJ1dCBub3QgYSBkZXNjZWRhbnQgb2YgdGhlIHNoYWRvdyByb290IG9mIHRoZSBob3N0ICh0byBiZSBhc3NpZ25lZCB0byBzaGFkb3cgc2xvdCBvciBpZ25vcmVkKSAgXG4gICAgcHVibGljIHN0YXRpYyBpc1NoYWRvd0hvc3RFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgd2Fsa05vZGU6IEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5zaGFkb3dSb290KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvL2NoZWNrIGlmIGFuIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3cgdHJlZVxuICAgIHB1YmxpYyBzdGF0aWMgaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIGlmIChyb290LnRvU3RyaW5nKCkgPT09IFwiW29iamVjdCBTaGFkb3dSb290XVwiKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChlbGVtZW50KSB7XG4gICAgICAgIGxldCBmb3JtRWxlbWVudHMgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiZGF0YWxpc3RcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImtleWdlblwiLCBcIm91dHB1dFwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIl07XG4gICAgICAgIGxldCBjaGlsZE5vZGVzID0gZWxlbWVudC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtRWxlbWVudHMuaW5kZXhPZihjaGlsZE5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudCBcbiAgICAgICAgICogQHBhcmFtIGlkU3RyIFxuICAgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFueSBvbmUgKGlmIG11bHRpcGxlIElkcykgaWQgcG9pbnRzIHRvIGl0c2VsZlxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzSWRSZWZlclRvU2VsZihlbGVtZW50LCBpZFN0cjogU3RyaW5nKSB7XG4gICAgICAgIGlmICghaWRTdHIgfHwgaWRTdHIudHJpbSgpID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgaWRzID0gaWRTdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGlkcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgbGV0IHJlZmVycmVkTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnQsIGlkc1tqXSk7XG4gICAgICAgICAgICBpZiAocmVmZXJyZWROb2RlICYmIERPTVV0aWwuc2FtZU5vZGUocmVmZXJyZWROb2RlLCBlbGVtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIERldGVybWluZSB0aGUgbm9kZSBkZXB0aCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbm9kZURlcHRoKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRlcHRoID0gMDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9XG5cbiAgICAvKiBjb21wYXJlIG5vZGUgb3JkZXIgb2YgdGhlIDIgZ2l2ZW4gbm9kZXMgKi9cbiAgICAvKiByZXR1cm5zXG4gICAgICogICAwIGlmIHRoZSBub2RlcyBhcmUgZXF1YWxcbiAgICAgKiAgIDEgaWYgbm9kZSBiIGlzIGJlZm9yZSBub2RlIGFcbiAgICAgKiAgLTEgaWYgbm9kZSBhIGlzIGJlZm9yZSBub2RlIGJcbiAgICAgKiAgIDIgaWYgbm9kZSBhIGlzIG5lc3RlZCBpbiBub2RlIGJcbiAgICAgKiAgLTIgaWYgbm9kZSBiIGlzIG5lc3RlZCBpbiBub2RlIGFcbiAgICAgKiAgIG51bGwgaWYgZWl0aGVyIG5vZGUgaXMgbnVsbCBvciB0aGVpciBwYXJlbnQgbm9kZXMgYXJlIG5vdCBlcXVhbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZU5vZGVPcmRlcihub2RlQSwgbm9kZUIpIHtcbiAgICAgICAgaWYgKG5vZGVBID09PSBub2RlQikgcmV0dXJuIDA7XG5cbiAgICAgICAgbGV0IGFEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVBKTtcbiAgICAgICAgbGV0IGJEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVCKTtcbiAgICAgICAgaWYgKGJEZXB0aCA+IGFEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiRGVwdGggLSBhRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQiA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVCKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQiBuZXN0ZWQgaW4gTm9kZSBBXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0yO1xuICAgICAgICB9IGVsc2UgaWYgKGFEZXB0aCA+IGJEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwdGggLSBiRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQSBuZXN0ZWQgaW4gTm9kZSBCXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5vZGVBICE9IG51bGwgJiYgbm9kZUIgIT0gbnVsbCAmJiBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSB7XG4gICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIG5vZGVCID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlQSA9PT0gbnVsbCB8fCBub2RlQiA9PT0gbnVsbCB8fCBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGVCICE9IG51bGwgJiYgbm9kZUIgIT0gbm9kZUEpXG4gICAgICAgICAgICBub2RlQiA9IG5vZGVCLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKG5vZGVCID09PSBudWxsKSAvLyBub2RlQiBiZWZvcmUgbm9kZUFcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICBlbHNlIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbm90IGVtcHR5XG4gICAgICogIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgYXR0clN0cikge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0clN0cikgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0clN0cikudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZnJhbWUsIG51bGwgaWYgbm90IGZvdW5kICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRGcmFtZUJ5TmFtZShydWxlQ29udGV4dCwgZnJhbWVOYW1lKSB7XG4gICAgICAgIGxldCB3aW5kb3cgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICBsZXQgZnJhbWVMaXN0ID0gW3dpbmRvd107XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICB3aGlsZSAoaWR4IDwgZnJhbWVMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0ubmFtZSA9PT0gZnJhbWVOYW1lKSByZXR1cm4gZnJhbWVMaXN0W2lkeF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFtZUxpc3RbaWR4XS5mcmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBpdCdzIGEgcmVhbCBmcmFtZSBhbmQgYXZvaWQgcmVjdXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldICYmICFmcmFtZUxpc3QuaW5jbHVkZXMoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGlzdC5wdXNoKGZyYW1lTGlzdFtpZHhdLmZyYW1lc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgKytpZHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWZhdWx0TlNSZXNvbHZlcihwcmVmaXgpIHtcbiAgICAgICAgbGV0IHVyaTtcbiAgICAgICAgc3dpdGNoIChwcmVmaXgpIHtcbiAgICAgICAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3gyJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwyJztcbiAgICAgICAgICAgIGNhc2UgJ3gnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3hodG1sJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHVyaSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVyaTtcbiAgICB9XG5cbiAgICAvL2NoZWNraW5nIGlmIG9ubHkgdGhlIGlubmVyIHRleHQgaXMgZW1wdHkgb3Igbm90XG4gICAgcHVibGljIHN0YXRpYyBpc0lubmVyVGV4dE9ubHlFbXB0eShlbGVtZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW5uZXJUZXh0IG9mIHRoZSBlbGVtZW50XG4gICAgICAgIGxldCB0ZXh0ID0gZWxlbWVudC5pbm5lclRleHQ7XG5cbiAgICAgICAgaWYgKCh0ZXh0ID09PSB1bmRlZmluZWQgfHwgdGV4dCA9PT0gbnVsbCB8fCB0ZXh0LnRyaW0oKS5sZW5ndGggPT09IDApICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3Nsb3QnICYmIGVsZW1lbnQudGV4dENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy9pZ25vcmUgc2xvdCBiZWNhdXNlIGl0cyB0ZXh0IHdpbGwgYmUgZmlsbGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGNvbnRlbnQgaW4gdGhlIGxpZ2h0IERPTSBcbiAgICAgICAgICAgIC8vIGlubmVyVGV4dCBpcyBzb21ldGltZXMgJ3VuZGVmaW5lZCcgaW4gaGVhZGxlc3MgbW9kZSwgb3IgbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBpbnZpc2libGUgb3Igbm90IGVyeHBhbmRlZCBcbiAgICAgICAgICAgIC8vIHNvIHdlIHRyeSB0ZXh0Q29udGVudCBhcyBhIHdvcmthcm91bmRcbiAgICAgICAgICAgIHRleHQgPSBlbGVtZW50LnRleHRDb250ZW50XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gISh0ZXh0ICE9PSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiKSB7XG4gICAgICAgICAgICAvL1RPRE86IG5lZWQgdG8gY29uc2lkZSBpdHMgb3duIGNvbnRlbnQsIGEgc2xvdCBtYXkgaGF2ZSBpdHMgb3duIGNvbnRlbnQgb3IgYXNzaWduZWQgY29udGVudFxuICAgICAgICAgICAgZm9yIChjb25zdCBzbG90RWxlbSBvZiBlbGVtZW50LmFzc2lnbmVkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbCAmJiBDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkoc2xvdEVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpbSB0aGUgaW5uZXIgdGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiB0aGUgaW5uZXIgdGV4dCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5uZXJUZXh0KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICBpZiAocmV0VmFsID09PSB1bmRlZmluZWQgfHwgcmV0VmFsID09PSBudWxsIHx8IHJldFZhbC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICByZXRWYWwgPSBlbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBvbnNjcmVlbiBpbm5lclRleHQgb25seS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGFzIGlubmVyVGV4dCBpZiBubyBvZmZzY3JlZW4gY29udGVudCBleGlzdHNcbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGl0IGhhcyBpbm5lciB0ZXh0IG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtudWxsIHwgc3RyaW5nfSBudWxsIGlmIGVsZW1lbnQgaGFzIGVtcHR5IGlubmVyIHRleHQsIHRleHQgb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldE9uU2NyZWVuSW5uZXJUZXh0KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IDMpIHJldHVybiBlbGVtZW50Lm5vZGVWYWx1ZSgpO1xuXG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHRvIGdldCB0aGUgdGV4dFxuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9PSBlbGVtZW50ICYmIG53Lm5vZGUgIT09IGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKG53LmJFbmRUYWcpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5jbHVkZXMobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpIHx8IFZpc1V0aWwuaXNFbGVtZW50T2Zmc2NyZWVuKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpKSkgeyBcbiAgICAgICAgICAgICAgICAvKiogc3BlY2lhbCBjYXNlIGZvciBzdmcgPHRpdGxlPiBlbGVtZW50OiBcbiAgICAgICAgICAgICAgICAgKiAgICAgdGV4dCBpbiBhIDx0aXRsZT4gZWxlbWVudCBpcyBub3QgcmVuZGVyZWQgYXMgcGFydCBvZiB0aGUgZ3JhcGhpYywgYnV0IGJyb3dzZXJzIHVzdWFsbHkgZGlzcGxheSBpdCBhcyBhIHRvb2x0aXBcbiAgICAgICAgICAgICAgICAgKiAgICAgbm90ZSBzb21lIHN2ZyBlbGVtZW50cywgc3VjaCBhcyB0aXRsZSwgZGVzYywgaGF2ZSBhIGJvdW5kcyB7XCJsZWZ0XCI6MCxcInRvcFwiOjAsXCJoZWlnaHRcIjowLFwid2lkdGhcIjowfVxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RpdGxlJyAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKG53Lm5vZGUsIFwic3ZnXCIpKSBcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5uZXh0U2libGluZy5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZSAmJiBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZS50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIG53Lm5vZGUgPSBudy5ub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5vZGVWYWx1ZSAmJiBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0LnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJuIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGdpdmVuIG5vZGUgXG4gICAgICogIHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gaW5uZXJUZXh0IG9yIHRleHRDb250ZW50IHRoYXQgcmV0dXJuIHRleHQgY29udGVudCBvZiBhIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50c1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXROb2RlVGV4dChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT0gMykge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgZWxlbWVudHMgaW5uZXIgdGV4dCBpcyBlbXB0eSBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpdCBoYXMgaW5uZXIgdGV4dCBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gdHJ1ZSBpZiBlbGVtZW50IGhhcyBlbXB0eSBpbm5lciB0ZXh0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNJbm5lclRleHRFbXB0eShlbGVtZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW5uZXJUZXh0IG9mIHRoZSBlbGVtZW50XG4gICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG5cbiAgICAgICAgLy8gVHJpbSB0aGUgaW5uZXIgdGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gISh0ZXh0ICE9IG51bGwgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgdGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGVsZW1lbnQpO1xuICAgICAgICBsZXQgaGFzQ29udGVudCA9ICh0ZXh0ICE9PSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNDb250ZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluZSBpZiBhbiBlbGVtZW50IGhhcyBpbm5lciBjb250ZW50LlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMgY2FzZXMgd2hlcmUgaW5uZXIgdGV4dCBpcyBoaWRkZW4sIHdoaWNoIG5vdyB3aWxsXG4gICAgICogYmUgY2xhc3NpZmllZCBhcyBkb2VzIG5vdCBoYXZlIGhpZGRlbiBjb250ZW50LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaXQgaGFzIGlubmVyIHRleHQgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgZWxlbWVudCBoYXMgZW1wdHkgaW5uZXIgdGV4dCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbkh5cGVyTGluayhlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzdmdIYXNOYW1lKGVsZW1lbnQ6IFNWR0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsXCIpXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpXG4gICAgICAgICAgICB8fCAhIWVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IHRpdGxlXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzSW5uZXJDb250ZW50SGlkZGVuSHlwZXJMaW5rKGVsZW1lbnQsIGh5cGVybGlua19mbGFnKSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgY2hpbGRFbGVtZW50ID0gZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSBmYWxzZTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGlsZEVsZW1lbnQgaXMgbm90IG51bGwgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGVhY2ggb2YgdGhlIGVsZW1lbnRzXG4gICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgbm90IGFsbCBoaWRkZW4uXG4gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBub2Rld2FsdGVyIG9mIHRoZSBlbGVtZW50IG5vZGUsIHNvIHRoYXQgd2UgY2FuIGxvb3Agb3ZlciBpdCBhbmQgdmVyaWZ5XG4gICAgICAgICAgICAvLyB0aGF0IHRoZSBlbGVtZW50cyB1bmRlciB0aGUgZWxlbWVudCBhcmUgbm90IGNvbXBsZXRseSBoaWRkZW4uXG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbm9kZXMgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgbm9kZXMgb3Igd2UgaGF2ZSBkZXRlcm1pbmUgdGhhdCB0aGVyZSBpcyBjb250ZW50IHVuZGVyXG4gICAgICAgICAgICAvLyB0aGlzIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG53Lm5vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBhbiBpbWcgZWxlbWVudCBpcyBwcmVzZW50IHdpdGggYWx0IHRoZW4gd2UgY2FuIG1hcmsgdGhpcyBhcyBwYXNzXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGtlZXAgY2hlY2tpbmcgYWxsIHRoZSBvdGhlciBlbGVtZW50cy4gTWFrZSBzdXJlIHRoYXQgdGhpcyBpbWFnZSBlbGVtZW50IGlzIG5vdCBoaWRkZW4uXG4gICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiXG4gICAgICAgICAgICAgICAgICAgICYmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIENvbW1vblV0aWwuc3ZnSGFzTmFtZShub2RlIGFzIGFueSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBjaGVjayBpZiB0aGlzIG5vZGUgaXMgb2YgdHlwZSBlbGVtZW50LCB2aXNpYmxlXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBpbm5lclRleHQgb2YgdGhlIGVsZW1lbnQgaXMgZW1wdHkgb3Igbm90XG4gICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIGh5cGVybGlua19mbGFnID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShub2RlIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudCAmJiBjU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjU3R5bGUuYmFja2dyb3VuZEltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY1N0eWxlLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZikgfHwgY1N0eWxlLmNvbnRlbnQpICYmIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBpcyB0ZXh0IG5vZGUgYWZ0ZXIgYW4gZWxlbWVudCB1bmRlciB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugd2UgZGV0ZWN0IG5vZGV0eXBlIGFzIHRleHQgbm9kZSBhbmQgdGhlIHBhdGVudCBvZiB0aGUgdGV4dCBub2RlIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgZWxlbWVudCB3ZSBhcmUgY2hlY2tpbmcgaGFzIElubmVyIGNvbnRlbnQgZm9yIHRoZW4gZ2V0IHRoZSBpbm5lciBjb250ZW50IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgJiYgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9ICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBubyBjaGlsZCBlbGVtZW50cyB0aGVuIHdlIGNhbiBzaW1wbHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIG9ubHkgaW5uZXJ0ZXh0XG4gICAgICAgIC8vIHRoZSBpbWcgd2l0aCBhbHQgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFib3ZlIGlmLCBhcyBpbWcgaXMgY29uc2lkZXJzIGFzIGFuIGVsZW1lbnQuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dEVtcHR5KGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnRPckFsdChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYWx0XCIpO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlICghaGFzQ29udGVudCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAmJiAoQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCBcImJ1dHRvblwiLCB0cnVlKSB8fCBBcmlhVXRpbC5oYXNSb2xlKG53Lm5vZGUsIFwidGV4dGJveFwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgKEFyaWFVdGlsLmhhc0FyaWFMYWJlbChudy5ub2RlKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwidGl0bGVcIikgfHwgQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4obncuZWxlbSgpLCB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbTogc3RyaW5nLCBhcnI6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgICAgICBhcnIuaW5kZXhPZihpdGVtKSA9PT0gLTEgJiYgaXRlbSAhPT0gbnVsbCA/IGFyci5wdXNoKGl0ZW0pIDogZmFsc2U7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KGl0ZW1MaXN0OiBzdHJpbmdbXSwgYXJyOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGl0ZW1MaXN0ICE9PSBudWxsICYmIGkgPCBpdGVtTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJyID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbUxpc3RbaV0sIGFycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYXJyYXkgaXRlbXMgZnJvbSBhIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIGl0ZW1MaXN0IGl0ZW1zIHRvIGJlIHJlbW92ZWQgZnJvbSBhcnJcbiAgICAgKiBAcGFyYW0gYXJyIHRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVkdWNlQXJyYXlJdGVtTGlzdChpdGVtTGlzdDogc3RyaW5nW10sIGFycjogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmIChhcnIgJiYgYXJyLmxlbmd0aCA+IDAgJiYgaXRlbUxpc3QgJiYgaXRlbUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGFyci5maWx0ZXIoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFpdGVtTGlzdC5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFNjb3BlRm9yVGgoZWxlbWVudCkge1xuICAgICAgICAvKiogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3RhYnVsYXItZGF0YS5odG1sI2hlYWRlci1hbmQtZGF0YS1jZWxsLXNlbWFudGljc1xuICAgICAgICAgKiBBIGhlYWRlciBjZWxsIGFuY2hvcmVkIGF0IHRoZSBzbG90IHdpdGggY29vcmRpbmF0ZSAoeCwgeSkgd2l0aCB3aWR0aCB3aWR0aCBhbmQgaGVpZ2h0IGhlaWdodCBpcyBcbiAgICAgICAgICogc2FpZCB0byBiZSBhIGNvbHVtbiBoZWFkZXIgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgY29sdW1uIHN0YXRlLCBvclxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSBhdXRvIHN0YXRlLCBhbmQgdGhlcmUgYXJlIG5vIGRhdGEgY2VsbHMgaW4gYW55IG9mIFxuICAgICAgICAgKiAgIHRoZSBjZWxscyBjb3ZlcmluZyBzbG90cyB3aXRoIHktY29vcmRpbmF0ZXMgeSAuLiB5K2hlaWdodC0xLlxuICAgICAgICAgKiBBIGhlYWRlciBjZWxsIGFuY2hvcmVkIGF0IHRoZSBzbG90IHdpdGggY29vcmRpbmF0ZSAoeCwgeSkgd2l0aCB3aWR0aCB3aWR0aCBhbmQgaGVpZ2h0IGhlaWdodCBpc1xuICAgICAgICAgKiBzYWlkIHRvIGJlIGEgcm93IGhlYWRlciBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVlOlxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSByb3cgc3RhdGUsIG9yXG4gICAgICAgICAqICogVGhlIGNlbGwncyBzY29wZSBhdHRyaWJ1dGUgaXMgaW4gdGhlIGF1dG8gc3RhdGUsIHRoZSBjZWxsIGlzIG5vdCBhIGNvbHVtbiBoZWFkZXIsIGFuZCB0aGVyZSBhcmVcbiAgICAgICAgICogICBubyBkYXRhIGNlbGxzIGluIGFueSBvZiB0aGUgY2VsbHMgY292ZXJpbmcgc2xvdHMgd2l0aCB4LWNvb3JkaW5hdGVzIHggLi4geCt3aWR0aC0xLlxuICAgICAgICAgKi9cbiAgICAgICAgLy8gTm90ZTogYXV0byBpcyBkZWZhdWx0IHNjb3BlXG5cbiAgICAgICAgLy8gRWFzaWVzdCBhbnN3ZXIgaXMgaWYgc2NvcGUgaXMgc3BlY2lmaWVkXG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpKSB7XG4gICAgICAgICAgICBsZXQgc2NvcGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUgPT09IFwicm93XCIgfHwgc2NvcGUgPT09ICdyb3dncm91cCcpIHJldHVybiBcInJvd1wiO1xuICAgICAgICAgICAgaWYgKHNjb3BlID09PSBcImNvbFwiIHx8IHNjb3BlID09PSAnY29sZ3JvdXAnKSByZXR1cm4gXCJjb2x1bW5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNjb3BlIGlzIGF1dG8sIGRlZmF1bHQgKHdpdGhvdXQgYSBzY29wZSkgb3IgaW52YWxpZCB2YWx1ZS5cbiAgICAgICAgLy8gaWYgYWxsIHRoZSBzaWJsaW5nIGVsZW1lbnRzIGFyZSB0aCwgdGhlbiByZXR1cm4gXCJjb2x1bW5oZWFkZXJcIiBcbiAgICAgICAgdmFyIHNpYmxpbmdzID0gWy4uLmVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKG5vZGUgPT4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRoXCIpO1xuICAgICAgICBpZiAoc2libGluZ3MgPT09IG51bGwgfHwgc2libGluZ3MubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFwiY29sdW1uXCI7XG4gICAgICAgIGVsc2UgcmV0dXJuIFwicm93XCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb250cm9sT2ZMYWJlbChub2RlOiBOb2RlKSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgZWFzeSBjYXNlIG9mIGxhYmVsIC0+IGZvclxuICAgICAgICBjb25zdCBsYWJlbEFuY2VzdG9yID0gQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcihub2RlLCBcImxhYmVsXCIpO1xuICAgICAgICBpZiAobGFiZWxBbmNlc3RvciAmJiBsYWJlbEFuY2VzdG9yLmhhc0F0dHJpYnV0ZShcImZvclwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50VXRpbC5nZXRCeUlkKG5vZGUsIGxhYmVsQW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiZm9yXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBpZHMgb2YgcGFyZW50IG5vZGVzXG4gICAgICAgIGNvbnN0IGlkRGljdCA9IHt9O1xuICAgICAgICBsZXQgcGFyZW50V2FsayA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChwYXJlbnRXYWxrKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50V2Fsay5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGFyZW50V2FsayBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZERpY3RbYW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiaWRcIildID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnRXYWxrID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50V2Fsayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgbm8gYW5jZXN0b3IgSURzIGZvdW5kXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhpZERpY3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSBhcmlhLWxhYmVsbGVkYnkgYXR0cmlidXRlIGlmIG5vZGUgaXMgYW4gZWxlbWVudFxuICAgICAgICBjb25zdCBub2RlQXJpYUxhYmVsbGVkQnkgPSBub2RlLm5vZGVUeXBlID09PSAxID8gKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpIDogbnVsbDtcblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY29udHJvbHMgdGhhdCB1c2UgYXJpYS1sYWJlbGxlZGJ5IGFuZCBzZWUgaWYgYW55IG9mIHRoZW0gcmVmZXJlbmNlIG9uZSBvZiBteSBhbmNlc3RvciBpZHNcbiAgICAgICAgY29uc3QgaW5wdXRzVXNpbmdMYWJlbGxlZEJ5ID0gQ2FjaGVVdGlsLmdldFNldENhY2hlKFxuICAgICAgICAgICAgbm9kZS5vd25lckRvY3VtZW50LCBcbiAgICAgICAgICAgIFwiQ29tbW9uVXRpbDo6Z2V0Q29udHJvbE9mTGFiZWxcIiwgXG4gICAgICAgICAgICAoKSA9PiAgbm9kZS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2FyaWEtbGFiZWxsZWRieV1cIilcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBpbnB1dHNVc2luZ0xhYmVsbGVkQnkubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRVc2luZ0xhYmVsbGVkQnkgPSBpbnB1dHNVc2luZ0xhYmVsbGVkQnlbaWR4XTtcbiAgICAgICAgICAgIGNvbnN0IGFyaWFMYWJlbGxlZEJ5ID0gaW5wdXRVc2luZ0xhYmVsbGVkQnkuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICAgICAgICAgICAgY29uc3Qgc3AgPSBhcmlhTGFiZWxsZWRCeS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHNwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlkIGluIGlkRGljdCAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYobm9kZSwgbm9kZUFyaWFMYWJlbGxlZEJ5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRVc2luZ0xhYmVsbGVkQnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCB0aGUgY2FzZXMgd2hlcmUgd2UncmUgd2l0aGluIGFuIGFyaWEgbGFiZWxsZWRieVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiBkaXNhYmxlZCBvciBub3QuIEZvbGxvd2luZyBpcyBob3cgdGhlIGNoZWNrIGlzIHBlcmZvcm1lZDpcbiAgICAgKiAgICAxLiBDaGVjayBpZiB0aGUgY3VycmVudCBub2RlIGlzIGRpc2FibGVkIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIGF0dHJpYnV0ZSAtLT4gZGlzYWJsZWRcbiAgICAgKiAgICAgICAgIEFsc28gbmVlZHMgdG8gYmUgXCJidXR0b25cIiwgXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCIsIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIixcbiAgICAgKiAgICAgICAgIFwibWVudWl0ZW1cIiwgXCJmaWVsZHNldFwiIG5vZGVzIChpbiBhcnJheSBlbGVtZW50c0FsbG93ZWREaXNhYmxlZClcbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGFyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJcbiAgICAgKiAgICAyLiBDaGVjayBpZiBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgZGlzYWJsZWQgd2l0aCB0aGUgc2FtZVxuICAgICAqICAgICAgIG9wdGlvbnMgbGlzdGVkIGluIDEuXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSBkaXNhYmxlZCB0aGVuIHRoaXNcbiAgICAgKiAgICAgICAgICBmdW5jdGlvbiB3aWxsIHJldHVybiB0cnVlIChub2RlIGlzIGRpc2FibGVkKS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIGRpc2FibGVkIG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIHRoZSBub2RlIGlzIGRpc2FibGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlRGlzYWJsZWQobm9kZSkge1xuXG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0RJU0FCTEVEIHRvIGZhbHNlIGZvciBhbGwgdGhlIG5vZGVzLCBiZWZvcmUgdGhlIGNoZWNrIGFuZCB0aGlzIHdpbGwgYmUgY2hhbmdlZCB0b1xuICAgICAgICAvLyB0cnVlIHdoZW4gd2UgZGV0ZWN0IHRoYXQgdGhlIG5vZGUgaXMgZGlzYWJsZWQuIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuIE9ubHkgc2V0IGl0IHRvIGZhbHNlIGlmIHRoZSBzZXR0aW5nIGlzIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICAgIC8vIGFzIGlmIGl0IGlzIGRlZmluZWQgd2UgZG8gbm90IHduYXQgdG8gcmVzZXQgaXQuIEFzIGlmIGl0IGlzIHRydWUgdGhlbiB3ZSBzaG91bGQgbWFrZSB1c2Ugb2YgaXRcbiAgICAgICAgLy8gdG8gc3BlZWQgdXAgdGhlIGNoZWNrLlxuICAgICAgICBsZXQgUFRfTk9ERV9ESVNBQkxFRCA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlLCBcIlBUX05PREVfRElTQUJMRURcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBQVF9OT0RFX0RJU0FCTEVEICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gUFRfTk9ERV9ESVNBQkxFRDtcbiAgICAgICAgUFRfTk9ERV9ESVNBQkxFRCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENoZWNrIHRoZSBub2RlVHlwZSBvZiB0aGlzIG5vZGUsIGlmIHRoaXMgbm9kZSBpcyBhIHRleHQgbm9kZSB0aGVuXG4gICAgICAgIC8vIHdlIGdldCB0aGUgcGFyZW50bm9kZSBhbmQgc2V0IHRoYXQgYXMgdGhlIG5vZGUgYXMgYSB0ZXh0IG5vZGVzLFxuICAgICAgICAvLyBkaXNhYmxlZCBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xhcmF0aW9uXG4gICAgICAgIGxldCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGRpc2FibGVkIGVsZW1lbnQgcHJvcGVydHksIGRpc2FibGVkIGFuZCBhcmlhLWRpc2FibGVkIGF0dHJpYnV0ZSBhbmQgY2hlY2sgdGhhdCBpdCBpcyB0cnVlXG4gICAgICAgIGxldCBkaXNhYmxlZEF0dHJpYnV0ZSA9IG5vZGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIGxldCBkaXNhYmxlZFByb3BlcnR5Q3VzdG9tID0gUFRfTk9ERV9ESVNBQkxFRDtcbiAgICAgICAgbGV0IGFyaWFEaXNhYmxlZEF0dHJpYnV0ZSA9IG5vZGUuaGFzQXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJykgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpID09PSAndHJ1ZSc7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBub2RlIGhhcyBkaXNhYmxlZCBhdHRyaWJ1dGUgYW5kIHRoZSBub2RlIGFsbG93cyBkaXNhYmxlZCBhdHRyaWJ1dGUsIHRoZW4gcmV0dXJuIHRydWUuXG4gICAgICAgIC8vIERpc2FibGVkIGF0dHJpYnV0ZSBpcyBvbmx5IGFsbG93ZWQgb24gXCJidXR0b25cIiwgXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCIsIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIiwgXCJtZW51aXRlbVwiLCBcImZpZWxkc2V0XCJcbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYXJpYS1kaXNhYmxlZCBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiBhbHNvIHJldHVybiB0cnVlXG4gICAgICAgIGlmIChkaXNhYmxlZFByb3BlcnR5Q3VzdG9tIHx8IChkaXNhYmxlZEF0dHJpYnV0ZSAmJiBBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkRGlzYWJsZWQuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkgfHwgYXJpYURpc2FibGVkQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBQVF9OT0RFX0RJU0FCTEVEID0gdHJ1ZTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfRElTQUJMRURcIiwgUFRfTk9ERV9ESVNBQkxFRCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgcGFyZW50Tm9kZSBmb3IgdGhpcyBub2RlLCBiZWN1YXNlIHdlIGhhdmUgdG8gY2hlY2sgYWxsIHBhcmVudHMgdG8gbWFrZSBzdXJlIHRoZXkgZG8gbm90IGhhdmVcbiAgICAgICAgLy8gZGlzYWJsZWQgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcGFyZW50IG5vZGUgZXhpc3RzIGFuZCB0aGUgbm9kZXR5cGUgaXMgZWxlbWVudCAoMSksIHRoZW4gcnVuIHJlY3Vyc2l2ZSBjYWxsIHRvIHBlcmZvcm0gdGhlIGNoZWNrXG4gICAgICAgIC8vIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSB2ZXJ5IHBhcmVudCBub2RlLiBVc2UgcmVjdXJzaXZlIGNhbGwgaGVyZSBpbnN0ZWFkIG9mIGEgd2hpbGUgbG9vcCBzbyB0aGF0IHdlIGRvIG5vdFxuICAgICAgICAvLyBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgbG9naWMgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIGlzIGRpc2FibGVkIG9yIG5vdCBmb3IgYWxsIHRoZSBwYXJlbnRzIHN0YXJ0aW5nIHdpdGhcbiAgICAgICAgLy8gY2hpbGQgbm9kZS5cbiAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgIT0gbnVsbCAmJiBwYXJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5LCBhbmQgc2F2ZSB0aGUgcmVzdWx0cyBpbiBhbiB2YXJpYWJsZVxuICAgICAgICAgICAgbGV0IG5vZGVEaXNhYmxlZCA9IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIGJlIGRpc2FibGVkIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ESVNBQkxFRCB0byB0cnVlLlxuICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgbmV4dCB0aW1lLCB0byBxdWlja2x5IGRldGVybWluZSBpZiBub2RlIGlzIGRpc2FibGVkIG9yIG5vdC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZXh0cmEgcGVyY2F1dGlvbiwgdGhlIGlzTm9kZURpc2FibGVkIGZ1bmN0aW9uIGFscmVhZHkgc2V0cyB0aGlzLlxuICAgICAgICAgICAgaWYgKG5vZGVEaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIFBUX05PREVfRElTQUJMRUQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0RJU0FCTEVEXCIsIFBUX05PREVfRElTQUJMRUQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVEaXNhYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBmYWxzZSAobm9kZSBpcyBub3QgZGlzYWJsZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmUgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIGJlIGNoZWNrZWRcbiAgICAgKiBpbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gQSBub2RlIHNvIHRoYXQgdGhlIGRvY3VtZW50IGNhbiBiZSBhY2Nlc3NlZCB0byBjaGVjayBmb3IgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uIENhbiBiZSBkb2N1bWVudCBlbGVtZW50IG9yIGEgc2ltcGxlIG5vZGUgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBiZSBjaGVja2VkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2hvdWxkQ2hlY2tIaWRkZW5Db250ZW50KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIGlmIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQgZnJvbSBjaGVja2luZyBvciBub3QsIGJhc2VkXG4gICAgICogb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmdzIGFuZCBpZiB0aGUgbm9kZSBpcyB2aXNpYmxlIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gTm9kZSB0byBjaGVjayBpZiBpdCBpcyB2aXNpYmxlIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpIHtcbiAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2VcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlIHRvIGlkZW50aWZ5IHRoYXQgdGhlIG5vZGUgc2hvdWxkIG5vdCBiZSBzY2FubmVkL2FkZGVkIHRvIGFueSBoYXNoL2FycmF5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgaWYgKCFDb21tb25VdGlsLnNob3VsZENoZWNrSGlkZGVuQ29udGVudChub2RlKSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzZm9jdXNhYmxlQnlEZWZhdWx0KG5vZGUpIHtcbiAgICAgICAgdmFyIGZvY3VzYWJsZUVsZW1lbnRzID0gWydpbnB1dCcsICdzZWxlY3QnLCAnYnV0dG9uJywgJ3RleHRhcmVhJywgJ29wdGlvbicsICdhcmVhJ107XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYVwiICYmIENvbW1vblV0aWwuaGFzQXR0cmlidXRlKG5vZGUsICdocmVmJykpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFyZWFcIiAmJiBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZShub2RlLCAnaHJlZicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzLmluZGV4T2Yobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBhIG5vbi10YWJhYmxlIG5vZGUgaGFzIHZhbGlkIHRhYmFibGUgY29udGVudC5cbiAgICAgKiBJZiBpdCBpcyB0YWJhYmxlICh0aGUgdGFiaW5kZXggaXMgbm90IHNwZWljaWZpZWQgb3IgaXMgbm90IC0xKSwgcmV0dXJucyBmYWxzZTtcbiAgICAgKiBJZiBpdCBpcyBub24tdGFiYWJsZSwgYnV0IGEgY2hpbGQgaXMgdGFiYWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBlbGVtZW50IGNvbnRlbnQsIHJldHVybnMgZmFsc2U7XG4gICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHRydWUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBub25UYWJhYmxlQ2hpbGRDaGVjayhlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fFxuICAgICAgICAgICAgKHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpICE9IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBudy5lbGVtKCk7XG4gICAgICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwpIHsgLy8gVGV4dCBub2RlLiB1c3VhbGx5IGlzIGEgY2FydHJpZGdlIHJldHVybi5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGlsZC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAmJlxuICAgICAgICAgICAgICAgIChwYXJzZUludChjaGlsZC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgIT0gLTEpICYmXG4gICAgICAgICAgICAgICAgIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KGNoaWxkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhc0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgIHZhciBoYXNBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBoYXNBdHRyaWJ1dGUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmF0dHJpYnV0ZXMgJiYgZWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSkge1xuICAgICAgICAgICAgdmFyIGF0dHIgPSBlbGVtZW50LmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgaGFzQXR0cmlidXRlID0gYXR0ciAmJiBhdHRyLnNwZWNpZmllZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzQXR0cmlidXRlO1xuICAgIH1cblxuICAgIC8vIHRydW5jYXRlIHRoZSBnaXZlbiB0ZXh0IHRvIGEgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnNcbiAgICAvLyByZXR1cm4gdHJ1bmNhdGVkIHRleHQgdG8gMTUwIGNoYXJzLCBzYW1lIHdpdGggdGhlIG1lZGlhX2FsdF9icmllZiBydWxlXG4gICAgcHVibGljIHN0YXRpYyB0cnVuY2F0ZVRleHQodGV4dDogc3RyaW5nLCBsZW4gPSAxNTApIHtcbiAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDtcbiAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPiBsZW4pXG4gICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgbGVuLTEpICtcIi4uLlwiO1xuICAgICAgICByZXR1cm4gdGV4dDtcblxuICAgIH1cblxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4vQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi9Db21tb25VdGlsXCI7XG5pbXBvcnQge1J1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY2xhc3MgVGFibGVVdGlsIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEYXRhVGFibGUodGFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiAhKEFyaWFVdGlsLmhhc1JvbGUodGFibGVOb2RlLCBcIm5vbmVcIikgfHwgQXJpYVV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwicHJlc2VudGF0aW9uXCIpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgY29tcGxleCBkYXRhIHRhYmxlIGlzIGEgZGF0YSB0YWJsZSB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczpcbiAgICAgKlxuICAgICAqIGEgdGhlYWQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzXG4gICAgICogYSB0YWJsZSB3aXRoIG1vcmUgdGhhbiBvbmUgdGhlYWQgZWxlbWVudFxuICAgICAqIGEgdGFibGUgd2l0aCB0d28gb3IgbW9yZSB0ciBlbGVtZW50cyB0aGF0IGNvbnRhaW4gb25seSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGggb3IgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAqIGEgdHIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB0ZCBlbGVtZW50IGFuZCB0d28gb3IgbW9yZSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGFibGUgd2l0aCBoZWFkZXJzIG5vdCBsb2NhdGVkIGluIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uXG4gICAgICogYSB0ZCBlbGVtZW50IHdpdGggYSBoZWFkZXJzIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGNvbnRhaW5zIG1vcmUgdGhhbiB0d28gSURSRUZzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NvbXBsZXhEYXRhVGFibGUodGFibGUpIHtcblxuICAgICAgICBpZiAoXCJBcmlhVXRpbF9pc0NvbXBsZXhEYXRhVGFibGVcIiBpbiB0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICEhdGFibGUuQXJpYVV0aWxfaXNDb21wbGV4RGF0YVRhYmxlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzQ29tcGxleFRhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRhYmxlICYmIFRhYmxlVXRpbC5pc0RhdGFUYWJsZSh0YWJsZSkpIHtcblxuICAgICAgICAgICAgbGV0IHRoTm9kZXMgPSBudWxsLFxuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHRyTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyXCIpO1xuICAgICAgICAgICAgbGV0IHRyTm9kZUNvdW50ID0gdHJOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdGROb2RlQ291bnQgPSAwLFxuICAgICAgICAgICAgICAgIHRoTm9kZUNvdW50ID0gMCxcbiAgICAgICAgICAgICAgICB0ck5vZGVzSGF2aW5nT25seVRoTm9kZXMgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGkgPCB0ck5vZGVDb3VudDsgKytpKSB7XG5cbiAgICAgICAgICAgICAgICB0aE5vZGVzID0gdHJOb2Rlc1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoXCIpO1xuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSB0ck5vZGVzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgICAgICAgICAgdGhOb2RlQ291bnQgPSB0aE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0ZE5vZGVDb3VudCA9IHRkTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRkTm9kZUNvdW50ICE9PSAwKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0ciBlbGVtZW50IHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRkIGVsZW1lbnQgYW5kIHR3byBvciBtb3JlIHRoIGVsZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9IHRoTm9kZUNvdW50ID4gMTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRoIGVsZW1lbnQgd2l0aCBhIHJvd3NwYW4gb3IgY29sc3BhbiBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBqIDwgdGhOb2RlQ291bnQ7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHRoTm9kZXNbal0sIFwidGFibGVcIikgPT09IHRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRkIGVsZW1lbnQgd2l0aCBhIGhlYWRlcnMgYXR0cmlidXRlIHZhbHVlIHRoYXQgY29udGFpbnMgbW9yZSB0aGFuIHR3byBJRFJFRnNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBrIDwgdGROb2RlQ291bnQ7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZE5vZGVzW2tdLmhhc0F0dHJpYnV0ZShcImhlYWRlcnNcIikgJiYgQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHRkTm9kZXNba10uZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKSkuc3BsaXQoXCIgXCIpLmxlbmd0aCA+IDIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IodGROb2Rlc1trXSwgXCJ0YWJsZVwiKSA9PT0gdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzIHRoYXQgY29udGFpbiBvbmx5IHRoIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aE5vZGVDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzID09PSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHRoZWFkTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoZWFkXCIpO1xuICAgICAgICAgICAgICAgIGxldCB0aGVhZE5vZGVzTGVuZ3RoID0gdGhlYWROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhlYWROb2Rlc0xlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZSBoYXMgbW9yZSB0aGFuIG9uZSB0aGVhZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhlYWROb2Rlc0xlbmd0aCA+IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0aGVhZCBlbGVtZW50IHRoYXQgY29udGFpbnMgdHdvIG9yIG1vcmUgdHIgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aGVhZE5vZGVzWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIikubGVuZ3RoID4gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNDb21wbGV4VGFibGUgJiYgdHJOb2RlQ291bnQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBhIHRhYmxlIHdpdGggaGVhZGVycyBub3QgbG9jYXRlZCBpbiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtblxuICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhOb2RlQ291bnQgPiAwICYmICFUYWJsZVV0aWwudGFibGVIZWFkZXJFeGlzdHModGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRhYmxlLkFyaWFVdGlsX2lzQ29tcGxleERhdGFUYWJsZSA9IGlzQ29tcGxleFRhYmxlO1xuXG4gICAgICAgIHJldHVybiBpc0NvbXBsZXhUYWJsZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIHRhYmxlIGNlbGwgaXMgaGlkZGVuIG9yIGNvbnRhaW4gbm8gZGF0YTogPHRkPjwvdGQ+XG4gICAgcHVibGljIHN0YXRpYyBpc1RhYmxlQ2VsbEVtcHR5KGNlbGwpIHtcbiAgICAgICAgaWYgKCFjZWxsIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUoY2VsbCkgfHwgY2VsbC5pbm5lckhUTUwucmVwbGFjZSgvJm5ic3A7L2csJyAnKS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSByb3cgaXMgaGlkZGVuIG9yIGNvbnRhaW4gbm8gZGF0YTogPHRyIC8+IG9yIDx0cj48dGQ+PC90ZD48dGQ+PC90ZD48L3RyPiBcbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVSb3dFbXB0eShyb3cpIHtcbiAgICAgICAgaWYgKCFyb3cgfHwgIXJvdy5jZWxscyB8fCByb3cuY2VsbHMubGVuZ3RoID09PSAwIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUocm93KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7IC8vZW1wdHlcbiAgICAgICAgZm9yIChsZXQgYz0wOyBwYXNzZWQgJiYgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbY107XG4gICAgICAgICAgICBwYXNzZWQgPSBUYWJsZVV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKTsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBwYXNzZWQ7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSdzIGhlYWRlciBpcyBpbiB0aGUgZmlyc3Qgcm93IG9yIGNvbHVtblxuICAgIHB1YmxpYyBzdGF0aWMgdGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpIHtcblxuICAgICAgICBsZXQgcm93cyA9IHJ1bGVDb250ZXh0LnJvd3M7XG4gICAgICAgIGlmICghcm93cyB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIG5vdGUgdGhhdCB0YWJsZS5yb3dzIHJldHVybiBhbGwgYWxsIHRoZSByb3dzIGluIHRoZSB0YWJsZSwgXG4gICAgICAgIC8vIGluY2x1ZGluZyB0aGUgcm93cyBjb250YWluZWQgd2l0aGluIDx0aGVhZD4sIDx0Zm9vdD4sIGFuZCA8dGJvZHk+IGVsZW1lbnRzLiBcbiAgICAgICAgXG4gICAgICAgIC8vY2FzZSAxOiBoZWFkZXJzIGFyZSBpbiB0aGUgdmVyeSBmaXJzdCByb3cgd2l0aCBkYXRhIGluIHRib2R5IG9yIHRoZWFkLCBidXQgbm90IGluIHRmb290ICAgXG4gICAgICAgIC8vZ2V0IHRoZSBmaXJzdCByb3cgd2l0aCBkYXRhLCBpZ25vcmluZyB0aGUgcm93cyB3aXRoIG5vIGRhdGFcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmaXJzdFJvdyA9IHJvd3NbMF07XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBmaXJzdFJvdyA9IHJvd3Nbcl07XG4gICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHJvd3MgZnJvbSB0Zm9vdFxuICAgICAgICAgICAgaWYgKGZpcnN0Um93LnBhcmVudE5vZGUgJiYgZmlyc3RSb3cucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcGFzc2VkID0gVGFibGVVdGlsLmlzVGFibGVSb3dFbXB0eShmaXJzdFJvdyk7ICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvL3RhYmxlIGNvbnRhaW4gbm8gZGF0YTogIDx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiBcbiAgICAgICAgaWYgKHBhc3NlZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGxzIHdpdGggZGF0YSBpbiB0aGUgZmlyc3QgZGF0YSByb3cgYXJlIGFsbCBUSCdzXG4gICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCBmaXJzdFJvdy5jZWxscy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgbGV0IGNlbGwgPSBmaXJzdFJvdy5jZWxsc1tyXTtcbiAgICAgICAgICAgIHBhc3NlZCA9IFRhYmxlVXRpbC5pc1RhYmxlQ2VsbEVtcHR5KGNlbGwpIHx8IGNlbGwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RoJzsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBDYXNlIDI6IGhlYWRlcnMgYXJlIGluIHRoZSBmaXJzdCBjb2x1bW4gd2l0aCBkYXRhXG4gICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBmaXJzdCBjb2x1bW4gaGFzIGFsbCBUSCdzIG9yIGEgVEQgd2l0aG91dCBkYXRhIGluIHRoZSBmaXJzdCBjb2x1bW4uXG4gICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHJvd3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgcm93cyBmcm9tIHRmb290XG4gICAgICAgICAgICBpZiAocm93c1tpXS5wYXJlbnROb2RlICYmIHJvd3NbaV0ucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gSWYgbm8gY2VsbHMgaW4gdGhpcyByb3csIG9yIG5vIGRhdGEgYXQgYWxsLCB0aGF0J3Mgb2theSB0b28uXG4gICAgICAgICAgICBwYXNzZWQgPSAhcm93c1tpXS5jZWxscyB8fFxuICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgcm93c1tpXS5jZWxsc1swXS5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHNbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRkXCI7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAvL2Nhc2UgMzogYWxsIHRkIGRhdGEgY2VsbHMgaGF2ZSBoZWFkZXJzIGF0dHJpYnV0ZXMgdGhhdCBwb2ludCB0byB0aGUgaWQgb2YgYSB0aCBlbGVtZW50IGluIHRoZSBzYW1lIHRhYmxlLiBcbiAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGFibGVzLmh0bWwjYXR0cmlidXRlcy1jb21tb24tdG8tdGQtYW5kLXRoLWVsZW1lbnRzXG4gICAgICAgIHBhc3NlZCA9IHRydWU7IFxuICAgICAgICBsZXQgdGhJZHMgPSBbXTtcbiAgICAgICAgbGV0IHRkSGVhZGVycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByPTA7IHBhc3NlZCAmJiByIDwgcm93cy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgbGV0IHJvdyA9IHJvd3Nbcl07IFxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGxzIHdpdGggZGF0YSBpbiB0aGUgbGFzdCBkYXRhIHJvdyBhcmUgYWxsIFRIJ3NcbiAgICAgICAgICAgIGZvciAobGV0IGM9MDsgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93LmNlbGxzW2NdO1xuICAgICAgICAgICAgICAgIGlmIChUYWJsZVV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKSkgY29udGludWU7IFxuICAgICAgICAgICAgICAgIGlmIChjZWxsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0ZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsLmdldEF0dHJpYnV0ZSgnaGVhZGVycycpIHx8IGNlbGwuZ2V0QXR0cmlidXRlKCdoZWFkZXJzJykudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoY2VsbC5nZXRBdHRyaWJ1dGUoJ2hlYWRlcnMnKS50cmltKCkuc3BsaXQoXCIgXCIpLCB0ZEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGgnICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oY2VsbC5nZXRBdHRyaWJ1dGUoJ2lkJykudHJpbSgpLCB0aElkcyk7ICAgIFxuICAgICAgICAgICAgfSAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocGFzc2VkKSB7IC8vIGFsbCB0ZCBlbGVtZW50cyBoYXZlIGhlYWRlcnMsIHRvIGV4YW0gaWYgdGhlIGhlYWRlcnMgcG9pbnQgdG8gYSB0aCBpZFxuICAgICAgICAgICAgaWYgKHRoSWRzLmxlbmd0aCA+IDAgJiYgdGRIZWFkZXJzLmV2ZXJ5KGhlYWRlciA9PiB0aElkcy5pbmNsdWRlcyhoZWFkZXIpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTGF5b3V0VGFibGUodGFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5oYXNSb2xlKHRhYmxlTm9kZSwgXCJwcmVzZW50YXRpb25cIikgfHwgQXJpYVV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwibm9uZVwiKTtcbiAgICB9XG5cbi8qIFxuICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICogcmV0dXJuOiBhIGxpc3Qgb2YgQXJpYSBhbmQgSHRtbCBhdHRyaWJ1dGUgcGFpcnMgdGhhdCBhcmUgY29uZmxpY3RcbiovXG5wdWJsaWMgc3RhdGljIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgaWYgKCFjb250ZXh0SGllcmFyY2hpZXMpIHJldHVybiBudWxsO1xuICAgIFxuICAgIHJldHVybiBjb250ZXh0SGllcmFyY2hpZXNbXCJhcmlhXCJdLmZpbHRlcihoaWVyID0+IFtcInRhYmxlXCIsIFwiZ3JpZFwiLCBcInRyZWVncmlkXCJdLmluY2x1ZGVzKGhpZXIucm9sZSkpO1xufVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4vQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ2xpcFBhdGhVdGlsIH0gZnJvbSBcIi4vQ2xpcFBhdGhVdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXNVdGlsIHtcbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnQgdGFncyB3aGljaCBjYW4gbm90IGJlIGhpZGRlbiwgd2hlbiBoaWRkZW4gaXNcbiAgICAvLyBhZGRlZCB0byB0aGVzZXMgZWxlbWVudHMgaXQgZG9lcyBub3QgZG8gYW55dGhpbmcgYXQgYWxsLlxuICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAvLyAgICAgICAgICAgbWFrZSBhbiBjZXJ0aWFuIHBhcnRzIG9mIGFuIG1hcCBpbnRlcmFjdGl2ZS5cbiAgICAvLyAgcGFyYW0gLS0+IGVsZW1lbnQgY2FuIG9ubHkgYmUgcGFydCBvZiBvYmplY3QgZWxtZW50IGFuZCBpdCBjYW5ub3QgYmUgaGlkZGVuIGRpcmVjdGx5LCBpdFxuICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgIC8vICBhdWRpbyAtLT4gSWYgdGhpcyBlbGVtZW50IGlzIGhpZGRlbiBpdCB3aWxsIHN0aWxsIHBsYXkgdGhlIG11c2ljLCBzbyB3ZSBzaG91bGQgc3RpbGwgdHJpZ2dlclxuICAgIC8vICAgICAgICAgICAgdmlvbGF0aW9ucyBmb3IgdGhpcyBlbGVtZW50LlxuICAgIC8vIE5vdGU6IEFsbCBlbGVtZW50IHRhZ3MgdGhhdCBhcmUgYWRkZWQgaGVyZSBzaG91bGQgYmUgYWRkZWQgYXMgbG93ZXJjYXNlLCBhcyB3ZSBhcmUgdXNpbmcgaW5kZXhPZiB0byBkbyB0aGUgY2hlY2suXG4gICAgcHVibGljIHN0YXRpYyB1bmhpZGVhYmxlRWxlbWVudHMgPSBbJ2FyZWEnLCAncGFyYW0nLCAnYXVkaW8nXTtcblxuICAgIC8vIFRoaXMgbGlzdCBjb250YWlucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGFncyB3aGljaCBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgaGF2ZSBydWxlcyB0cmlnZ2VyaW5nXG4gICAgLy8gb24gdGhlc2VzIGVsZW1lbnRzIHdlIG5lZWQgdG8gbWFrZSB0aGVuIHZpc2libGUgYnkgZGVmYXVsdCBzbyB0aGF0IHRoZSBydWxlcyBjYW4gdHJpZ2dlciByZWdhcmRsZXNzIG9mIHRoZVxuICAgIC8vIENoZWNrIEhpZGRlbiBDb250ZW50IG9wdGlvbiBpbiB0aGUgdG9vbHMuXG4gICAgLy8gIHNjcmlwdCAtLT4gc2NyaXB0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0XG4gICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgLy8gICAgICAgICAgICBtYXJrIHRoaXMgZWxlbWVudCBhcyB2aXNpYmxlIGF0IGFsbCB0aW1lcy5cbiAgICAvLyAgc3R5bGUgLS0+IHN0eWxlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgdGhlIGFjdHVhbGx5IENTUyBzY3JpcHQgaXMgc3RpbGwgZXhlY3V0ZWQgc28gd2UgaGF2ZSB0b1xuICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgLy8gIGhlYWQgLS0+IGhlYWQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCBpdCB3aWxsIHN0aWxsIGJlaGF2ZSBjb3JyZWN0XG4gICAgLy8gIHRpdGxlIC0tPiB0aXRsZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgZGlzcGxheSB0aGUgdGl0bGUuIHJlbW92ZSB0aXRsZSBmcm9tIHRoZSBsaXN0IGJlY2F1c2UgYSB0aXRsZSBjYW4gYmUgYSBjaGlsZCBvZiBhIHN2ZyBlbGVtZW50IHRvb1xuICAgIC8vICBtZXRhIC0tPiBtZXRhIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgYmFzZSAtLT4gYmFzZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIG5vc2NyaXB0IC0tPiBub3NjcmlwdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIHRlbXBsYXRlIC0tPiB0ZW1wbGF0ZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYmVjYXVzZSB0aGV5IGFyZSBqdXN0IGEgbWVjaGFuaXNtIGZvciBob2xkaW5nIGNsaWVudC1zaWRlIGNvbnRlbnRcbiAgICAvLyAgICAgICAgICAgICAgIHRoYXQgaXMgbm90IHRvIGJlIHJlbmRlcmVkIHdoZW4gYSBwYWdlIGlzIGxvYWRlZC4gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50L3RlbXBsYXRlXG4gICAgLy8gIGRhdGFsaXN0IC0tPiBkYXRhbGlzdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCxcbiAgICBwdWJsaWMgc3RhdGljIGhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzID0gWydzY3JpcHQnLCAnbGluaycsICdzdHlsZScsICdoZWFkJywgJ21ldGEnLCAnYmFzZScsICdub3NjcmlwdCcsICd0ZW1wbGF0ZScsICdkYXRhbGlzdCddXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiB2aXNpYmxlIG9yIG5vdC4gRm9sbG93aW5nIGlzIGhvdyB0aGUgY2hlY2sgaXMgcGVyZm9ybWVkOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIENTUyAtLT4gZGlzbGF5OiBub25lXG4gICAgICogICAgICAgQ1NTIC0tPiB2aXNpYmlsaXR5OiBoaWRkZW5cbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGhpZGRlblxuICAgICAqICAgIDIuIENoZWNrIGlmIHRoZSBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgaGlkZGVuIHdpdGggdGhlIHNhbWVcbiAgICAgKiAgICAgICBvcHRpb25zIGxpc3RlZCBpbiAxLlxuICAgICAqXG4gICAgICogICAgTm90ZTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgaGlkZGVuIHRoZW4gdGhpc1xuICAgICAqICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIChub2RlIGlzIG5vdCB2aXNpYmxlKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgb3BhY2l0eTowIG9yIGZpbHRlcjpvcGFjaXR5KDAlKSwgb3Igc2ltaWxhciBTVkcgbWVjaGFuaXNtczogXG4gICAgICogICAgICBUaGV5IGFyZSBub3QgY29uc2lkZXJlZCBoaWRkZW4uIFRleHQgaGlkZGVuIHdpdGggdGhlc2UgbWV0aG9kcyBjYW4gc3RpbGwgYmUgc2VsZWN0ZWQgb3IgY29waWVkLCBcbiAgICAgKiAgICAgIGFuZCB1c2VyIGFnZW50cyBzdGlsbCBleHBvc2UgaXQgaW4gdGhlaXIgYWNjZXNzaWJpbGl0eSB0cmVlcy4gIFxuICAgICAqIFxuICAgICAqICAgIE5vdGU6IG5vZGVzIGhpZGRlbiBvZmYgc2NyZWVuIG9yIGJlaGluZCBhbm90aGVyIG9iamVjdDogdGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuLiBcbiAgICAgKiAgICAgIFRoZXkgYXJlIGV4cG9zZWQgaW4gdGhlIGFjY2Vzc2liaWxpdHkgdHJlZSBhbmQgdGhleSBjYW4gZXZlbiBuYW1lIG9uLXNjcmVlbiBvYmplY3RzLlxuICAgICAqIFxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIHZpc2libGUgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IGZhbHNlIGlmIHRoZSBub2RlIGlzIE5PVCB2aXNpYmxlLCB0cnVlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFZpc1V0aWxcbiAgICAgKi9cbiAgICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXNpYmxlKG5vZGVJbjogTm9kZSkgOiBib29sZWFuIHtcblxuICAgICAgICAvLyBDaGVjayB0aGUgbm9kZVR5cGUgaWYgdGhpcyBub2RlLCBpZiB0aGlzIG5vZGUgaXMgYSB0ZXh0IG5vZGUgdGhlblxuICAgICAgICAvLyB3ZSBnZXQgdGhlIHBhcmVudG5vZGUgYW5kIHNldCB0aGF0IGFzIHRoZSBub2RlIGFzIGEgdGV4dCBub2RlcyxcbiAgICAgICAgLy8gdmlzaWJpbGl0eSBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGVJbi5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZUluID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUluKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZSA9IG5vZGVJbiBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGFsbG93IG5vZGVUeXBlIGVsZW1lbnQsIGFuZCBUZXh0Tm9kZSBhbGwgb3RoZXIgbm9kZXNUeXBlc1xuICAgICAgICAvLyB3ZSBjYW4gcmV0dXJuIHRoZSB2aXNpYmlsaXR5IGFzIHZpc2libGUuXG4gICAgICAgIC8vIEZvbGxvd2luZyBub2RlcyB3aWxsIGJlIHJldHVybmVkIGFzIHZpc2FibGUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgY2FuIG5vdFxuICAgICAgICAvLyBhY3R1YWxseSBjaGFuZ2UgdGhlaXIgdmlzaWJpbGl0eS5cbiAgICAgICAgLy8gIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIC0tPiA3XG4gICAgICAgIC8vICBOb2RlLkNPTU1FTlRfTk9ERSAgICAgICAgICAgICAgICAtLT4gOFxuICAgICAgICAvLyAgOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gICAgICAgICAgICAgICAtLT4gOVxuICAgICAgICAvLyAgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgICAgICAgICAgLS0+IDEwXG4gICAgICAgIC8vICBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICAtLT4gMTFcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG93bmVyRG9jdW1lbnQgaXMgcHJlc2VudCBiZWZvcmUgbW92aW5nIGZvcndhcmRcbiAgICAgICAgLy8gaW4gZGV0ZWN0aW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LiBJbiB0aGUgY2FzZSB0aGF0IG93bmVyRG9jdW1lbnRcbiAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgdGhlbiB3ZSBzaW1wbHkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZSBieSBkZWZhdWx0LlxuICAgICAgICBpZiAoIW5vZGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsYXJhdGlvblxuICAgICAgICBsZXQgY29tcFN0eWxlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhpcyBub2RlIGlzIGEgc2NyaXB0LCBsaW5rIG9yIHN0eWxlIG5vZGUsIHJpZ2h0IGF3YXkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZVxuICAgICAgICAvLyBiZWNhdXNlIHNjcmlwdHMsIGxpbmtzIGFuZCBzdHlsZSBub2RlcyBjYW4gbm90IGJlIGhpZGRlbiBieSBIVE1MIGF0dHJpYnV0ZSBvciBDU1Mgb3IgYXJlIGhpZGRlbiBieSBkZWZhdWx0LiBCdXQgd2Ugd2FudCB0byBzY2FuXG4gICAgICAgIC8vIHRoZSBlbGVtZW50cyBldmVyeXRpbWUgYXMgdGhleSByZW5kZXIgY29udGVudCBzdGlsbCB3aGljaCBpcyBzdGlsbCB2aXNpYmxlIHRvIHVzZXJzLlxuICAgICAgICAvLyAgc2NyaXB0IC0tPiBzY3JpcHQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHRcbiAgICAgICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vICBzdHlsZSAtLT4gc3R5bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vIGRhdGFsaXN0IC0tPiBJbiB0aGUgcmVuZGVyaW5nLCB0aGUgZGF0YWxpc3QgZWxlbWVudCByZXByZXNlbnRzIG5vdGhpbmcgYW5kIGl0LCBhbG9uZyB3aXRoIGl0cyBjaGlsZHJlbiwgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgICAgaWYgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluZGV4T2Yobm9kZU5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FjaGVWYWwgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoY2FjaGVWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlVmFsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0hJRERFTiB0byBmYWxzZSBmb3IgYWxsIHRoZSBub2RlcywgYmVmb3JlIHRoZSBjaGVjayBhbmQgdGhpcyB3aWxsIGJlIGNoYW5nZWQgdG9cbiAgICAgICAgLy8gdHJ1ZSB3aGVuIHdlIGRldGVjdCB0aGF0IHRoZSBub2RlIGlzIGhpZGRlbi4gV2UgaGF2ZSB0byBzZXQgaXQgdG8gZmFsc2Ugc28gdGhhdCB3ZSBrbm93XG4gICAgICAgIC8vIHRoZSBydWxlcyBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gICAgICAgIGNhY2hlVmFsID0gQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBpcyB2aXNpYmxlLCB3ZSBjaGVjayBjb3VwbGUgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIGhpZGRlbiBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGFyZWEsIHBhcmFtIGFuZCBhdWRpbyBlbGVtZW50cyB3ZSBkbyBub3QgY2hlY2sgaWYgdGhleSBhcmUgaGlkZGVuIGFzIGl0IGRvZXMgbm90IGFwcGx5IHRvIHRoZW0uXG4gICAgICAgIC8vIENoZWNrIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgd2hpY2ggaXMgcGFydCBvZiB0aGUgcnVsZXMsIHRvIGNoZWNrIGlmIHRoaXMgZWxlbWVudCBpcyBhbGxvd2VkIHRvIGJlIGhpZGRlbiBvciBub3RcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGUgZWxlbWVudCBpcyBwYXJ0IG9mIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgdGhlbiB3ZSBkbyBub3QgcnVuIHRoZSBoaWRkZW4gY2hlY2sgb24gdGhpcyBlbGVtZW50LFxuICAgICAgICAvLyBhbmQgZ28gc3RyaWdodCB0byB0aGUgcGFyZW50IG5vZGUuXG4gICAgICAgIC8vIEFycmF5IGNoZWNrIGVsZW1lbnRzIGxpa2U6XG4gICAgICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gICAgICAgICAgIG1ha2UgYW4gY2VydGlhbiBwYXJ0cyBvZiBhbiBtYXAgaW50ZXJhY3RpdmUuXG4gICAgICAgIC8vICBwYXJhbSAtLT4gZWxlbWVudCBjYW4gb25seSBiZSBwYXJ0IG9mIG9iamVjdCBlbG1lbnQgYW5kIGl0IGNhbm5vdCBiZSBoaWRkZW4gZGlyZWN0bHksIGl0XG4gICAgICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgICAgICAvLyAgYXVkaW8gLS0+IElmIHRoaXMgZWxlbWVudCBpcyBoaWRkZW4gaXQgd2lsbCBzdGlsbCBwbGF5IHRoZSBtdXNpYywgc28gd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXJcbiAgICAgICAgLy8gICAgICAgICAgICB2aW9sYXRpb25zIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdW5oaWRlYWJsZUVsZW1lbnRzIGFycmF5IGlzIG5vdCBkZWZpbmVkIHRoZW4gd2UganVzdCBzY2FuIGFsbCBlbGVtZW50cyBhbmQgZG8gbm8gZmlsdGVyaW5nIGF0IGFsbC5cbiAgICAgICAgaWYgKFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSBudWxsIHx8IFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSB1bmRlZmluZWQgfHwgVmlzVXRpbC51bmhpZGVhYmxlRWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBkZWZhdWx0VmlldyBleGlzdHMgZm9yIHRoaXMgbm9kZSwgaWYgaXQgZG9lcyB0aGVuIHVzZSB0aGlzIHRvIHJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZVxuICAgICAgICAgICAgLy8gZnVuY3Rpb24gdG8gZ2V0IHRoZSBDU1Mgc3R5bGUgZm9yIHRoZSBub2RlLlxuICAgICAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldykge1xuICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZSBvbiB0aGlzIG5vZGUgdG8gZmV0Y2ggdGhlIENTUyBjb21wdWF0aW9uIG9mIHRoZSBub2RlXG4gICAgICAgICAgICAgICAgY29tcFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGRlZmF1bHRWaWV3IGRvZXMgbm90IGV4aXN0cyByZXR1cm4gdHJ1ZSB0byBpZGVudGlmeSB0aGF0IHRoaXNcbiAgICAgICAgICAgIC8vIG5vZGUgaXMgdmlzaWJsZSwgYmVjYXVzZSB3ZXJlIG5vdCBhYmxlIHRvIGRldGVjdCBpZiBpdCB3YXMgbm90LlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGhpZGRlbiBlbGVtZW50IHByb3BlcnR5IGFuZCBoaWRkZW4gYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgaGlkZGVuQXR0cmlidXRlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICAgICAgICBsZXQgaGlkZGVuUHJvcGVydHlDdXN0b20gPSBjYWNoZVZhbDtcbiAgICAgICAgICAgIC8vIFRvIGdldCB0aGUgaGlkZGVuIHByb3BlcnR5IHdlIG5lZWQgdG8gcGVyZm9ybSBhIHNwZWNpYWwgY2hlY2sgYXMgaW4gc29tZSBjYXNlcyB0aGUgaGlkZGVuIHByb3BlcnR5IHdpbGwgbm90IGJlXG4gICAgICAgICAgICAvLyBhIGJvb2xlYW4sIGZvciB0aGVzZXMgY2FzZXMgd2Ugc2V0IGl0IHRvIGZhbHNlIGFzIHdlIGFyZSBub3QgYWJsZSB0byBkZXRlcm1pbmUgdGhlIHRydWUgaGlkZGVuIGNvbmRpdGlvbi5cbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYmVjYXVzZSBmb3JtIGVsZW1lbnRzIGFyZSBhYmxlIHRvIHBlcmZvcm0gYW4gb3ZlcnJpZGUsIHNvIHdoZW4gd2UgaGF2ZSBpZD1cImhpZGRlblwiIGZvciBhbiBlbGVtZW50XG4gICAgICAgICAgICAvLyB3aGljaCBpcyB1bmRlciB0aGUgZm9ybSBlbGVtZW50IHRoZW4sIG5vZGUuaGlkZGVuIGdpdmVzIHRoZSBlbGVtZW50L2xpc3Qgb2YgZWxlbWVudHMgd2hpY2ggaGF2ZSBpZD1cImhpZGRlblwiLiBSZWZlciB0b1xuICAgICAgICAgICAgLy8gbW96aWxsYSBidWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNjczNTZcbiAgICAgICAgICAgIGxldCBoaWRkZW5Qcm9wZXJ0eSA9IHR5cGVvZiAobm9kZSBhcyBhbnkpLmhpZGRlbiA9PT0gXCJib29sZWFuXCIgPyAobm9kZSBhcyBhbnkpLmhpZGRlbiA6IGZhbHNlO1xuICAgICAgICAgICAgLy8gSWYgY29tcFN0eWxlIG9iamVjdCBpcyBlbXB0eSwgbm9kZSBkb2VzJ3QgaGF2ZSBoaWRkZW4gcHJvcGVydHksIG5vZGUgZG9lcyd0IGhhdmUgaGlkZGVuIGF0dHJpYnV0ZSBhbmQgZG9lcyd0IGhhdmUgY3VzdG9tIFBUXG4gICAgICAgICAgICAvLyBoaWRkZW4gcHJvcGVydHkgdGhlbiB3ZSBjYW4ganVzdCByZXR1cm4gdHJ1ZSAobm9kZSB2aXNpYmxlKSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgaWYgKCFjb21wU3R5bGUgJiZcbiAgICAgICAgICAgICAgICAhaGlkZGVuUHJvcGVydHkgJiYgLy8gdGhpcyBjb3ZlcnMgZmFsc2UsIG51bGwsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIChoaWRkZW5BdHRyaWJ1dGUgPT09IG51bGwgfHwgaGlkZGVuQXR0cmlidXRlID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAgICAgIWhpZGRlblByb3BlcnR5Q3VzdG9tIC8vIFRoaXMgY292ZXJzIGZhbHNlLCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjb21wU3R5bGUgaXMgZGVmaW5lZCB3ZSBjaGVjayB0aGUgZm9sbG93aW5nOlxuICAgICAgICAgICAgLy8gIENTUyBzdHlsZSBkaXNwbGF5IHNldCB0byBub25lXG4gICAgICAgICAgICAvLyAgQ1NTIHN0eWxlIHZpc2liaWxpdHkgc2V0IHRvIGhpZGRlblxuICAgICAgICAgICAgLy8gICAgTm90ZTogRm9yIHRoaXMgcHJvcGVydHkgc2luY2UgaXQgaXMgaW5oZXJpdGVkLCBuZWVkIHRvIHNraXAgdGhlIGNoZWNrIG9uIHBhcmVudHMgYXNcbiAgICAgICAgICAgIC8vICAgICAgICAgIHRoZSBwYXJlbnQgY2FuIGhhdmUgaGlkZGVuIGJ1dCB0aGUgY2hpbGQgY2FuIGJlIHZpc2libGUuIFNvIHdlIG9ubHkgY2hlY2sgdGhpcyBwcm9wZXJ0eVxuICAgICAgICAgICAgLy8gICAgICAgICAgb24gY2hpbGQgZWxlbWVudHMvZWxlbWVudHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAgICAvLyAgbm9kZSBoaWRkZW4gcHJvcGVydHkgc2V0IChub2RlLmhpZGRlbilcbiAgICAgICAgICAgIC8vICBub2RlIGF0dHJpYnV0ZSBoaWRkZW4gc2V0ICh0byBhbnkgdmFsdWUpXG4gICAgICAgICAgICAvLyAgbm9kZSBjdXN0b20gaGlkZGVuIHByb3BlcnR5IHNlciAobm9kZS5QVF9OT0RFX0hJRERFTilcbiAgICAgICAgICAgIC8vIElmIGFueSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgdHJ1ZSB0aGVuIHdlIHJldHVybiBmYWxzZSBhcyB0aGlzIGVsZW1lbnQgaXMgbm90IHZpc2libGVcbiAgICAgICAgICAgIGlmICgoY29tcFN0eWxlICE9PSBudWxsICYmICgoY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8XG4gICAgICAgICAgICAgICAgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJWaXNpYmlsaXR5X0NoZWNrX1BhcmVudFwiLCBudWxsKSAmJiBjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndmlzaWJpbGl0eScpID09PSAnaGlkZGVuJykpKSB8fFxuICAgICAgICAgICAgICAgIChjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpICE9PSAnYmxvY2snICAmJiAoaGlkZGVuUHJvcGVydHkgfHwgaGlkZGVuQXR0cmlidXRlICE9IG51bGwgfHwgaGlkZGVuUHJvcGVydHlDdXN0b20pKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXQgYSBjdXN0b20gZXhwYW5kb3MgcHJvcGVydHkgb24gdGhlIHRoZSBub2RlIHRvIGlkZW50aWZ5IHRoYXQgaXQgaXMgaGlkZGVuLCBzbyB0aGF0IHdlIGNhbiB1c2VzXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoaXMgaW4gdGhlIHJ1bGVzIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBpcyBoaWRkZW4gb3Igbm90LCBpZiB3ZSBuZWVkIHRvLlxuICAgICAgICAgICAgICAgIC8vIFVzZSBleHBhbmRvcyBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGEgaGFzaCBtYXAgd2hpY2ggc3RvcmVzIHRoZSBlbGVtZW50cywgYWRkaW5nL2NoZWNraW5nIGV4cGFuZG9zXG4gICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBpcyBhIGxvdCBmYXN0ZXIgcGVyZm9ybWFuY2Ugd2hpc2UuIEZvciBIYXNoIG1hcCB3ZSBuZWVkIHRvIHN0b3JlIGJhc2VkIG9uIHhwYXRoLCBhbmQgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgLy8geHBhdGggaXQgaXMgbW9yZSBwZXJmb3JtYW5jZSBpbXBhY3QuXG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgY29udGVudC12aXNpYmlsaXR5OiBpZiB0aGUgY29udGVudC12aXNpYmlsaXR5IGlzIGhpZGRlbiwgdGhlbiwgcmV0dXJuIGZhbHNlIGFzIHRoZSBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoVmlzVXRpbC5pc0NvbnRlbnRIaWRkZW4obm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBoaWRkZW4gYnkgY2xpcC1wYXRoXG4gICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IGNvbnRhaW5zIGZvY3VzYWJsZSBlbGVtZW50cywgc2ltaWxhcmx5IHRvIG9mZnNjcmVlbiBjb250ZW50XG4gICAgICAgICAgICBpZiAoQ2xpcFBhdGhVdGlsLmlzTm9kZVZpc3VhbGx5SGlkZGVuQnlDbGlwUGF0aChub2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgIC8vIHRoZSBoaWRkZW4gQ1NTLCBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUuIE9ubHkga2VlcCBjaGVja2luZyB1bnRpbCB3ZSBhcmUgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgcGFyZW50Tm9kZVxuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuXG4gICAgICAgIC8vIElmIHRoZSBwYXJlbnQgbm9kZSBleGlzdHMgYW5kIHRoZSBub2RldHlwZSBpcyBlbGVtZW50ICgxKSwgdGhlbiBydW4gcmVjdXJzaXZlIGNhbGwgdG8gcGVyZm9ybSB0aGUgY2hlY2tcbiAgICAgICAgLy8gYWxsIHRoZSB3YXkgdXAgdG8gdGhlIHZlcnkgcGFyZW50IG5vZGUuIFVzZSByZWN1cnNpdmUgY2FsbCBoZXJlIGluc3RlYWQgb2YgYSB3aGlsZSBsb29wIHNvIHRoYXQgd2UgZG8gbm90XG4gICAgICAgIC8vIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgaWYgdGhlIG5vZGUgaXMgdmlzaWJsZSBvciBub3QgZm9yIGFsbCB0aGUgcGFyZW50cyBzdGFydGluZyB3aXRoXG4gICAgICAgIC8vIGNoaWxkIG5vZGUuXG4gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwgJiYgcGFyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIGEgcGFyZW50IGVsZW1lbnQgZ29pbmcgdGhyb3VnaCB0aGUgaXNOb2RlVmlzaWJsZSBmdW5jdGlvbiB3ZSBoYXZlIHRvIG1hcmsgaXQgYXMgc3VjaFxuICAgICAgICAgICAgLy8gc28gdGhhdCBpbiB0aGUgZnVuY3Rpb24gd2UgY2FuIHNraXAgY2hlY2tpbmcgdmlzaWJpbGl0eTogaGlkZGVuIGZvciBwYXJlbnQgZWxlbWVudHMgc2luY2UgdmlzaWJpbGl0eTogaGlkZGVuXG4gICAgICAgICAgICAvLyBpcyBpbmhlcml0ZWQsIHdoaWNoIGFsbG93cyBhIGNoaWxkIHRvIGhhdmUgYSBkaWZmZXJlbnQgc2V0dGluZyB0aGVuIHRoZSBjaGlsZC4gVGhpcyBwcm9wZXJ0eSBvbmx5IG5lZWRzIHRvIGJlIGNoZWNrZWRcbiAgICAgICAgICAgIC8vIG9uY2UgZm9yIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcGFzc2VkIGRvd24gYW5kIHRoYXQgaXMgYWxsLiBJZ25vcmUgaXQgZm9yIGFsbCB0aGUgcGFyZW50cyB0aGF0IHdlIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRFbGVtZW50IGFzIEVsZW1lbnQsIFwiVmlzaWJpbGl0eV9DaGVja19QYXJlbnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHVwd2FyZHMgcmVjdXJzaXZlbHksIGFuZCBzYXZlIHRoZSByZXN1bHRzIGluIGFuIHZhcmlhYmxlXG4gICAgICAgICAgICBsZXQgbm9kZVZpc2libGUgPSBWaXNVdGlsLmlzTm9kZVZpc2libGUocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIG5vdCBiZSB2aXNpYmxlIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ISURERU4gdG8gdHJ1ZS5cbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIGluIHRoZSBydWxlcy5cbiAgICAgICAgICAgIC8vIGlmICghbm9kZVZpc2libGUpIHtcbiAgICAgICAgICAgIC8vICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIG5vZGVWaXNpYmxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB0cnVlIChub2RlIGlzIHZpc2libGUpXG4gICAgICAgIHJldHVybiBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHZpc3VhbGx5IGhpZGRlbiBieSBjbGlwcGluZyBvciBvcGFxOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuOlxuICAgICAqICAgICAgIENTUyAtLT4gY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpXG4gICAgICogICAgICAgQ1NTIC0tPiBvcGFjaXR5OiAwXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSB2aXN1YWxseSBoaWRkZW4gdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSAobm9kZSBpcyBub3QgdmlzdWFsbHkgaGlkZGVuKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpIG9yIG9wYWNpdHk6MCBvciBmaWx0ZXI6b3BhY2l0eSgwJSksIG9yIHNpbWlsYXIgU1ZHIG1lY2hhbmlzbXM6IFxuICAgICAqICAgICAgVGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuIHRvIGFuIEFULiBUZXh0IGhpZGRlbiB3aXRoIHRoZXNlIG1ldGhvZHMgY2FuIHN0aWxsIGJlIHNlbGVjdGVkIG9yIGNvcGllZCwgXG4gICAgICogICAgICBhbmQgdXNlciBhZ2VudHMgc3RpbGwgZXhwb3NlIGl0IGluIHRoZWlyIGFjY2Vzc2liaWxpdHkgdHJlZXMuICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyB2aXN1YWxseSBoaWRkZW4gb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgdGhlIG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBWaXNVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXN1YWxseUhpZGRlbihub2RlOiBOb2RlKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvLyBTZXQgUFRfTk9ERV9ISURERU4gdG8gZmFsc2UgZm9yIGFsbCB0aGUgbm9kZXMsIGJlZm9yZSB0aGUgY2hlY2sgYW5kIHRoaXMgd2lsbCBiZSBjaGFuZ2VkIHRvXG4gICAgICAgIC8vIHRydWUgd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgbm9kZSBpcyBoaWRkZW4uIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgcnVsZXMgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICAgICAgICBjb25zdCBoaWRkZW4gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTlwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoaGlkZGVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGRlZmluZWQgc3R5bGVzIG9ubHkgZ2l2ZSB0aGUgc3R5bGVzIHRoYXQgY2hhbmdlZFxuICAgICAgICAgICAgY29uc3QgY29tcF9zdHlsZXMgPSBDU1NVdGlsLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBpZiAoKGNvbXBfc3R5bGVzWydwb3NpdGlvbiddPT09J2Fic29sdXRlJyAmJiBjb21wX3N0eWxlc1snY2xpcCddICYmIChjb21wX3N0eWxlc1snY2xpcCddIGFzIGFueSkucmVwbGFjZUFsbCgnICcsICcnKT09PSdyZWN0KDBweCwwcHgsMHB4LDBweCknKVxuICAgICAgICAgICAgICAgIHx8IChjb21wX3N0eWxlc1snb3BhY2l0eSddICYmIHBhcnNlRmxvYXQoY29tcF9zdHlsZXNbJ29wYWNpdHknXSkgPCAwLjEpKSAge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgICAgICAvLyB0aGUgaGlkZGVuIENTUywgcHJvcGVydHkgb3IgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgIC8vIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgY29uc3QgaGlkID0gVmlzVXRpbC5pc05vZGVWaXN1YWxseUhpZGRlbihwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIGhpZCk7XG4gICAgICAgICAgICByZXR1cm4gaGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaWRkZW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIGhpZGRlbiBieSBDU1MgY29udGVudC12aXNpYmlsaXR5OmhpZGRlblxuICAgICAqIEF0IHRoaXMgdGltZSwgQ1NTIGNvbnRlbnQtdmlzaWJpbGl0eSBpcyBwYXJ0aWFsbHkgc3VwcG9ydGVkIGJ5IENocm9tZSAmIEVkZ2UsIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3hcbiAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gVEVNUE9SQVJJTFkgZm9sbG93cyB0aGUgQ2hyb21lIHRlc3QgcmVzdWx0czpcbiAgICAgKiAgIGlmIGNvbnRlbnQtdmlzaWJpbGl0eTpoaWRkZW5cbiAgICAgKiAgICAgIGlmIHRoZSBlbGVtZW50IGlzIGJsb2NrLWxldmVsIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgaGlkZGVuO1xuICAgICAqICAgICAgaWYgdGhlIGVsZW1lbnQgaXMgaW5saW5lIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgTk9UIGhpZGRlbjsgXG4gICAgICogXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQ29udGVudEhpZGRlbihub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgICBcblxuICAgICAgICBjb25zdCBzdHlsZSA9ICBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRlbnRfdmlzaWJpbGl0eSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJjb250ZW50LXZpc2liaWxpdHlcIik7XG4gICAgICAgIGlmIChjb250ZW50X3Zpc2liaWxpdHkgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgICAgIH0gXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKTsgXG4gICAgICAgIC8vIGlubGluZSBlbGVtZW50IG9ubHlcbiAgICAgICAgaWYgKGRpc3BsYXkgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9ICBcbiAgICAgICAgXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfQ29udGVudEhpZGRlblwiLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaXMgb2Zmc2NyZWVuIGJ5IENTUyBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0VsZW1lbnRPZmZzY3JlZW4obm9kZTogSFRNTEVsZW1lbnQpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbm9kZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSAsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgXG5cbiAgICAgICAgY29uc3QgbWFwcGVyIDogRE9NTWFwcGVyID0gbmV3IERPTU1hcHBlcigpO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhub2RlKTsgXG4gICAgICAgIGlmICghYm91bmRzKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCB0cnVlKTsgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGJvdW5kc1snaGVpZ2h0J10gPT09IDAgfHwgYm91bmRzWyd3aWR0aCddID09PSAwIHx8IChib3VuZHNbJ3RvcCddK2JvdW5kc1snaGVpZ2h0J10pIDw9IDAgfHwgKGJvdW5kc1snbGVmdCddK2JvdW5kc1snd2lkdGgnXSkgPD0gMCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBcblxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBvciBpdHMgYW5jZXN0b3IgaXMgbmF0aXZlbHkgaGlkZGVuIG9yIGFyaWEtaGlkZGVuID0gJ3RydWUnXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUhpZGRlbkZyb21BVChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlzID0gQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgIFxuXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgbGV0IGFuY2VzdG9yID0gRE9NVXRpbC5nZXRBbmNlc3RvcldpdGhBdHRyaWJ1dGUobm9kZSwgXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hpZGRlbkZyb21BVFwiLCBmYWxzZSk7ICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIG5hdGl2ZWx5IGhpZGRlbiBvciBhcmlhLWhpZGRlbiA9ICd0cnVlJ1xuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVQcmVzZW50YXRpb25hbChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG5vZGUpO1xuICAgICAgICBpZiAocm9sZSAmJiAocm9sZSA9PT0gJ25vbmUnIHx8IHJvbGUgPT09ICdwcmVzZW50YXRpb24nKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBzY3JvbGxhYmxlXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRWxlbWVudFNjcm9sbGFibGUoZWxlbTogSFRNTEVsZW1lbnQpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcbiAgICAgICAgaWYgKCFzdHlsZXMpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgeF9zY3JvbGwgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cteCcpO1xuICAgICAgICBsZXQgeV9zY3JvbGwgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cteScpO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiYmVmb3JlIG5vZGU9XCIrIGVsZW0ubm9kZU5hbWUgK1wiLCBpZD1cIitlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpICtcIiwgeF9zY3JvbGw9XCIreF9zY3JvbGwgKyBcIiwgeV9zY3JvbGw9XCIreV9zY3JvbGwpO1xuIFxuICAgICAgICAvLyBJZiBvdmVyZmxvdy15IGlzIGhpZGRlbiwgc2Nyb2xsLCBvciBhdXRvLCBhbmQgdGhlIG92ZXJmbG93LXggcHJvcGVydHkgaXMgdmlzaWJsZSAoZGVmYXVsdCksIHRoZSB2YWx1ZSB3aWxsIGJlIGltcGxpY2l0bHkgY29tcHV0ZWQgYXMgYXV0by5cbiAgICAgICAgaWYgKHhfc2Nyb2xsID09PSAndmlzaWJsZScgJiYgKHlfc2Nyb2xsID09PSAnaGlkZGVuJyB8fCB5X3Njcm9sbCA9PT0gJ3Njcm9sbCcgfHwgeV9zY3JvbGwgPT09ICdhdXRvJykpXG4gICAgICAgICAgICB4X3Njcm9sbCA9ICdhdXRvJztcblxuICAgICAgICAvLyBJZiBvdmVyZmxvdy14IGlzIGhpZGRlbiwgc2Nyb2xsLCBvciBhdXRvIGFuZCB0aGUgb3ZlcmZsb3cteSBwcm9wZXJ0eSBpcyB2aXNpYmxlIChkZWZhdWx0KSwgdGhlIHZhbHVlIHdpbGwgYmUgaW1wbGljaXRseSBjb21wdXRlZCBhcyBhdXRvLlxuICAgICAgICBpZiAoeV9zY3JvbGwgPT09ICd2aXNpYmxlJyAmJiAoeF9zY3JvbGwgPT09ICdoaWRkZW4nIHx8IHhfc2Nyb2xsID09PSAnc2Nyb2xsJyB8fCB4X3Njcm9sbCA9PT0gJ2F1dG8nKSlcbiAgICAgICAgICAgIHlfc2Nyb2xsID0gJ2F1dG8nO1xuXG4gICAgICAgIC8vIHNldHRpbmcgb3ZlcmZsb3cgdG8gY2xpcCBpbiBvbmUgZGlyZWN0aW9uIHdoZW4gaXQgaXNuJ3Qgc2V0IHRvIHZpc2libGUgb3IgY2xpcCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uIHJlc3VsdHMgaW4gdGhlIGNsaXAgdmFsdWUgYmVoYXZpbmcgYXMgaGlkZGVuLiBcbiAgICAgICAgaWYgKHhfc2Nyb2xsID09PSAnY2xpcCcgJiYgeV9zY3JvbGwgIT09ICd2aXNpYmxlJyAmJiB5X3Njcm9sbCAhPT0gJ2NsaXAnKVxuICAgICAgICAgICAgeF9zY3JvbGwgPSAnaGlkZGVuJztcbiAgICAgICAgaWYgKHlfc2Nyb2xsID09PSAnY2xpcCcgJiYgeF9zY3JvbGwgIT09ICd2aXNpYmxlJyAmJiB4X3Njcm9sbCAhPT0gJ2NsaXAnKVxuICAgICAgICAgICAgeV9zY3JvbGwgPSAnaGlkZGVuJztcblxuICAgICAgICAvLyBub3Qgc2Nyb2xsYWJsZTogbm8gc2Nyb2xsIGJhcnNcbiAgICAgICAgaWYgKCh4X3Njcm9sbCA9PT0gJ3Zpc2libGUnIHx8IHhfc2Nyb2xsID09PSAnaGlkZGVuJyB8fCB4X3Njcm9sbCA9PT0gJ2NsaXAnKVxuICAgICAgICAgICAgJiYgKHlfc2Nyb2xsID09PSAndmlzaWJsZScgfHwgeV9zY3JvbGwgPT09ICdoaWRkZW4nIHx8IHlfc2Nyb2xsID09PSAnY2xpcCcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIGZhbHNlIGlmIHRoZSBvdmVyYWxsIHNjcm9sbGFibGUgZWxlbWVudCAoY2xpZW50V2lkdGggKyBzY3JvbGxiYXJXaWR0aCBhbmQgY2xpZW50SGVpZ2h0ICsgc2Nyb2xsYmFySGVpZ2h0KSBpcyB0b28gc21hbGwgdG8gYmUgdmlzaWJsZSBvbiBzY3JlZW5cbiAgICAgICAgaWYgKE1hdGgubWF4KGVsZW0ub2Zmc2V0V2lkdGgsIGVsZW0ub2Zmc2V0SGVpZ2h0KSA8IDMwIHx8IE1hdGgubWluKGVsZW0ub2Zmc2V0V2lkdGgsIGVsZW0ub2Zmc2V0SGVpZ2h0KSA8IDE1KSAgXG4gICAgICAgICAgIHJldHVybiBmYWxzZTsgXG5cbiAgICAgICAgLy8gZmFsc2UgaWYgY29udGVudCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNjcm9sbGFibGUgY29udGFpbmVyOiBib3RoIHggYW5kIHkgc2Nyb2xsIGRpc3RhbmNlcyA8IGVsZW1lbnQncyBob3Jpem9udGFsL3ZlcnRpY2FsIHBhZGRpbmdcbiAgICAgICAgY29uc3QgcGFkZGluZ194ID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVzLnBhZGRpbmdMZWZ0LCBlbGVtKSArIENTU1V0aWwuZ2V0UGl4ZWxzRnJvbVN0eWxlKHN0eWxlcy5wYWRkaW5nUmlnaHQsIGVsZW0pO1xuICAgICAgICBjb25zdCBwYWRkaW5nX3kgPSBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1RvcCwgZWxlbSkgKyBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ0JvdHRvbSwgZWxlbSk7XG4gICAgICAgIGlmIChlbGVtLnNjcm9sbFdpZHRoIC0gIGVsZW0uY2xpZW50V2lkdGggPCAxICsgcGFkZGluZ194IFxuICAgICAgICAgICAgJiYgZWxlbS5zY3JvbGxIZWlnaHQgLSAgZWxlbS5jbGllbnRIZWlnaHQgPCAxKyBwYWRkaW5nX3kpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufSIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbmNvbnN0IF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0Y29uc3QgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdGNvbnN0IG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0aWYgKCEobW9kdWxlSWQgaW4gX193ZWJwYWNrX21vZHVsZXNfXykpIHtcblx0XHRkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0XHRjb25zdCBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIG1vZHVsZUlkICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vdjIvY29tbW9uL0NvbnRleHRcIlxuLy8gaW1wb3J0IHsgU2ltdWxhdG9yIH0gZnJvbSBcIi4vdjIvc2ltdWxhdG9yXCJcbmltcG9ydCB7IENoZWNrZXIgfSBmcm9tIFwiLi92NC9jaGVja2VyL0NoZWNrZXJcIlxuZXhwb3J0IHsgQ2hlY2tlciB9XG5leHBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5leHBvcnQgeyBDb25maWcgfSBmcm9tIFwiLi92Mi9jb25maWcvQ29uZmlnXCI7XG5leHBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5leHBvcnQgeyBTUkNvbnRyb2xsZXIgfSBmcm9tIFwiLi92NC9zaW11bGF0b3IvU1JDb250cm9sbGVyXCI7XG5leHBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL3Y0L3NpbXVsYXRvci9TUkN1cnNvclwiO1xuZXhwb3J0IHsgU1JWaWV3ZXIgfSBmcm9tIFwiLi92NC9zaW11bGF0b3IvU1JWaWV3ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRGVtbyh0aW1lb3V0PzogbnVtYmVyKSB7XG4gICAgaWYgKCF0aW1lb3V0KSB0aW1lb3V0ID0gMDtcbiAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKCk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgY2hlY2tlci5jaGVjayhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0Rlc2lnblwiXSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVwb3J0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXBvcnQpO1xuICAgICAgICAgICAgY29uc3QgdmFscyA9IHtcbiAgICAgICAgICAgICAgICBcIkZBSUxcIjogMCxcbiAgICAgICAgICAgICAgICBcIlBPVEVOVElBTFwiOiAxLFxuICAgICAgICAgICAgICAgIFwiTUFOVUFMXCI6IDIsXG4gICAgICAgICAgICAgICAgXCJQQVNTXCI6IDNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8cmVwb3J0LnJlc3VsdHMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXBvcnQucmVzdWx0c1tpZHhdLnZhbHVlWzFdID09PSBcIlBBU1NcIikge1xuICAgICAgICAgICAgICAgICAgICByZXBvcnQucmVzdWx0cy5zcGxpY2UoaWR4LS0sMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVwb3J0LnJlc3VsdHMuc29ydCgoYSxiKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGEuY2F0ZWdvcnkgIT0gYi5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jYXRlZ29yeS5sb2NhbGVDb21wYXJlKGIuY2F0ZWdvcnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYS5wYXRoW1wiYXJpYVwiXSA9PT0gYi5wYXRoW1wiYXJpYVwiXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsc1thLnZhbHVlWzFdXS12YWxzW2IudmFsdWVbMV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYS5wYXRoW1wiYXJpYVwiXS5sb2NhbGVDb21wYXJlKGIucGF0aFtcImFyaWFcIl0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGxldCBsYXN0UGF0aCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgY2F0ZWdvcnkgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVwb3J0LnJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IHJlc3VsdC5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYXRoID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IHJlc3VsdC5jYXRlZ29yeTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChyZXN1bHQuY2F0ZWdvcnkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucGF0aFtcImFyaWFcIl0gIT0gbGFzdFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdFBhdGggPSByZXN1bHQucGF0aFtcImFyaWFcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UGF0aCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChcInBhZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKGxhc3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQudmFsdWUsIHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfSk7XG4gICAgfSwgdGltZW91dCk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.09.02/js/ace-node-debug.js b/rule-server/src/static/archives/2026.09.02/js/ace-node-debug.js new file mode 100644 index 000000000..848d485fa --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/js/ace-node-debug.js @@ -0,0 +1,37967 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * 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. + */ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 9910 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIADefinitions = void 0; +var ARIADefinitions = /** @class */ (function () { + function ARIADefinitions() { + } + ARIADefinitions.nameFromContent = function (role) { + return (role in ARIADefinitions.designPatterns) + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"); + }; + /* + * array of WAI-ARIA global states and properties + * @see https://www.w3.org/TR/wai-aria-1.2/#global_states + */ + ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby", + "aria-details", "aria-flowto", "aria-hidden", "aria-keyshortcuts", + "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription" + // the following are deprecated in ARIA 1.2, will indicate deprecation in individual role + , + 'aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid' + ]; + //properties contains id(s) that refer to other element(s) + ARIADefinitions.referenceProperties = ["aria-owns", "aria-controls", "aria-describedby", "aria-labelledby", "aria-flowto", "aria-activedescendant"]; + // deprecated roles + ARIADefinitions.globalDeprecatedRoles = [ + 'directory', 'doc-biblioentry', 'doc-endnote' + ]; + // the following are deprecated in ARIA 1.1 for all the roles + ARIADefinitions.globalDeprecatedProperties = [ + 'aria-grabbed', 'aria-dropeffect' + ]; + /* + * XSD data types for all WAI-ARIA properties + * along with valid values when the data type is NMTOKEN + * WAI-ARIA properties data types explaned: + * type: Used to identify the type of values allowed for the WAI-ARIA property + * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken + * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID + * true: refers to WAI-ARIA property supports hidden ID references + * false: refers to WAI-ARIA property does not support hidden ID references + * Default value will be set to false, if not specified. + */ + ARIADefinitions.propertyDataTypes = { + "aria-activedescendant": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-atomic": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-autocomplete": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty + }, + "aria-busy": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-checked": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-colcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-controls": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-current": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value + }, + "aria-describedby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-details": { + type: "http://www.w3.org/2001/XMLSchema#idrefs" + }, + "aria-disabled": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-dropeffect": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["copy", "move", "link", "execute", "popup", "none"] + }, + "aria-errormessage": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-expanded": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-flowto": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: false + }, + "aria-grabbed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-haspopup": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"] + }, + "aria-hidden": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-invalid": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value + }, + "aria-keyshortcuts": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-label": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-labelledby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-level": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-live": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["off", "polite", "assertive"] + }, + "aria-modal": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiline": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiselectable": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-orientation": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["horizontal", "vertical", "undefined"] + }, + "aria-owns": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-placeholder": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-posinset": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-pressed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-readonly": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-relevant": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["additions", "removals", "text", "all"] + }, + "aria-required": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-roledescription": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-rowcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-selected": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-setsize": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-sort": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["ascending", "descending", "other", "none"] + }, + "aria-valuemax": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuemin": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuenow": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuetext": { + type: "http://www.w3.org/2001/XMLSchema#string" + } + }; + /* + * design patterns for concrete WAI-ARIA roles + * legitimate keys for each role include: + * + * - container: appropriate container(s) for that role + * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above) + * - reqProps: required states or properties for this role + * - reqChildren: required children for this role + * - htmlEquiv: HTML equivalent for this role + * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization) + * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.) + * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.) + * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s) + */ + ARIADefinitions.designPatterns = { + "alert": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "alertdialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "application": { + container: null, + props: ["aria-activedescendant", "aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "article": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "banner": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "blockquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "button": { + container: null, + props: ["aria-expanded", "aria-pressed"], + reqProps: null, + reqChildren: null, + htmlEquiv: "button | input[@type='button']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "caption": { + container: ["figure", "grid", "table", "treegrid"], + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "cell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "checkbox": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='checkbox']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "code": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "columnheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='col']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "combobox": { + container: null, + props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-readonly", "aria-required"], + reqProps: ["aria-expanded"], + reqChildren: [], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "complementary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "comment": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "contentinfo": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "definition": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "deletion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "dialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "directory": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecated: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "doc-abstract": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-acknowledgments": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-afterword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-appendix": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-backlink": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-biblioentry": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-bibliography": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-biblioref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-chapter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-colophon": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-conclusion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-cover": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true + }, + "doc-credit": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-credits": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-dedication": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnote": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnotes": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-epigraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-epilogue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-errata": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-example": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-footnote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-foreword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-index": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-introduction": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-noteref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-notice": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagebreak": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "doc-pagelist": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagefooter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-pageheader": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-part": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-preface": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-prologue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pullquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-qna": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-subtitle": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"] + }, + "doc-tip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-toc": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "emphasis": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "feed": { + container: null, + props: null, + reqProps: null, + reqChildren: ["article"], + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "figure": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "form": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "form", + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "generic": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "div | span", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby", "aria-roledescription"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "graphics-document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"] + }, + "graphics-object": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: false, + nameFrom: ["author"] + }, + "graphics-symbol": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "grid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-readonly", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: "table", + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "gridcell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "widget", + nameFrom: ["author", "contents"] + }, + "group": { + container: null, + props: ["aria-activedescendant"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "heading": { + container: null, + props: null, + reqProps: ["aria-level"], + reqChildren: null, + htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "img": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "image": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "insertion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "link": { + container: null, + props: ["aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "list": { + container: null, + props: null, + reqProps: null, + reqChildren: ["listitem"], + htmlEquiv: "ol | ul", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "listbox": { + container: null, + props: ["aria-activedescendant", "aria-expanded", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["group", "option"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "listitem": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "log": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "main": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "mark": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "mark", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "marquee": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "math": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: false, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menu": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menubar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menuitem": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemcheckbox": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemradio": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "meter": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "navigation": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "none": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "note": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "option": { + container: ["group", "listbox"], + props: ["aria-selected", "aria-checked", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "option", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "paragraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "presentation": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "progressbar": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radio": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='radio']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radiogroup": { + container: null, + props: ["aria-activedescendant", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["radio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "region": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "row": { + container: ["grid", "rowgroup", "table", "treegrid"], + props: ["aria-activedescendant", "aria-colindex", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: ["cell", "columnheader", "gridcell", "rowheader"], + htmlEquiv: "tr", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowgroup": { + container: ["grid", "table", "treegrid"], + props: [], + reqProps: null, + reqChildren: ["row"], + htmlEquiv: "tbody | tfoot | thead", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='row']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "scrollbar": { + container: null, + props: ["aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-controls", "aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "search": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "searchbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='search']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "separator": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "slider": { + container: null, + props: ["aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "spinbutton": { + container: null, + props: ["aria-activedescendant", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "status": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "strong": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "subscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "suggestion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "superscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "switch": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "tab": { + container: ["tablist"], + props: ["aria-expanded", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "table": { + container: null, + props: ["aria-colcount", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup", "caption"], + htmlEquiv: "table", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tablist": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation"], + reqProps: null, + reqChildren: ["tab"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tabpanel": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "term": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "dfn", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "textbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='text']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "time": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "timer": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "toolbar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tooltip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tree": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation", "aria-required"], + reqProps: null, + reqChildren: ["group", "treeitem"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treegrid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treeitem": { + container: ["group", "tree"], + props: ["aria-checked", "aria-expanded", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + }; // end designPatterns + // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements + // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary + // https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled + /** note: + * if a <fieldset> is disabled, the descendant form controls are all disabled except <legend> + * If an <optgroup> is disabled, the select is still interactive (unless otherwise disabled), but none of the items in the option group are selectable. + * When an element has the disabled attribute applied, the :disabled pseudo-class also applies to it. + */ + ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element + ARIADefinitions.elementsAllowedRequired = ["select", "textarea"]; // remove 'input' and add to the individual element, becuase required is not supported on input@type="range", "color", "hidden" or any button types + ARIADefinitions.elementsAllowedReadOnly = ["textarea"]; // remove 'input' and add to the individual element, because readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types + /* https://www.w3.org/TR/html-aria/#docconformance + * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value + * documentConformanceRequirementSpecialTags contains those tags that require special considerations + */ + ARIADefinitions.documentConformanceRequirement = { + "abbr": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "address": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "article": { + implicitRole: ["article"], + validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"], + globalAriaAttributesValid: true + }, + "aside": { + implicitRole: ["complementary"], + validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-glossary", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"], + globalAriaAttributesValid: true + }, + "audio": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "b": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "base": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "bdi": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "bdo": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "blockquote": { + implicitRole: ["blockquote"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "body": { + implicitRole: ["generic"], + validRoles: null, + otherDisallowedAriaAttributes: ['aria-hidden'], + globalAriaAttributesValid: true + }, + "br": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "canvas": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "caption": { + implicitRole: ['caption'], + validRoles: null, + globalAriaAttributesValid: true, + allowAttributesFromImplicitRole: false + }, + "cite": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "code": { + implicitRole: ["code"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "col": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "colgroup": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "data": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "datalist": { + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "dd": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "del": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "details": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "dfn": { + implicitRole: ["term"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "dialog": { + implicitRole: ["dialog"], + validRoles: ["alertdialog"], + globalAriaAttributesValid: true + }, + "dl": { + implicitRole: null, + validRoles: ["group", "list", "none", "presentation"], + globalAriaAttributesValid: true + }, + "dt": { + implicitRole: ["term"], + validRoles: ["listitem"], + globalAriaAttributesValid: true + }, + "em": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "embed": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "fieldset": { + implicitRole: ["group"], + validRoles: ["none", "presentation", "radiogroup"], + globalAriaAttributesValid: true + }, + "figcaption": { + implicitRole: null, + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "form": { + implicitRole: ["form"], + validRoles: ["none", "presentation", "search"], + globalAriaAttributesValid: true + }, + "head": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "hgroup": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "h1": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h2": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h3": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h4": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h5": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h6": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "hr": { + implicitRole: ["separator"], + validRoles: ["doc-pagebreak", "none", "presentation"], + globalAriaAttributesValid: true + }, + "html": { + implicitRole: ["document"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "i": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "iframe": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "ins": { + implicitRole: ["insertion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "kbd": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "label": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "legend": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "link": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "main": { + implicitRole: ["main"], + validRoles: null, + globalAriaAttributesValid: true + }, + "map": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "mark": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "math": { + implicitRole: ["math"], + validRoles: null, + globalAriaAttributesValid: true + }, + "menu": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "meta": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "meter": { + implicitRole: ["meter"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ['aria-valuemax', 'aria-valuemin'], + allowAttributesFromImplicitRole: false + }, + "nav": { + implicitRole: ["navigation"], + validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist", "none", "presentation"], + globalAriaAttributesValid: true + }, + "noscript": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "object": { + implicitRole: null, + validRoles: ["application", "document", "img"], + globalAriaAttributesValid: true + }, + "ol": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "optgroup": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "option": { + implicitRole: ["option"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-selected"] + }, + "output": { + implicitRole: ["status"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "p": { + implicitRole: ["paragraph"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "param": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "picture": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "pre": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "progress": { + implicitRole: ["progressbar"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax"] + }, + "q": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rp": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rt": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "ruby": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "s": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-label", "aria-labelledby"] + }, + "samp": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "script": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "search": { + implicitRole: ['search'], + validRoles: ['search', 'form', 'group', 'none', 'presentation', 'region'], + globalAriaAttributesValid: true + }, + "slot": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "small": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "source": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "span": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "strong": { + implicitRole: ["strong"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "style": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "sub": { + implicitRole: ["subscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "sup": { + implicitRole: ["superscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "svg": { + implicitRole: ["graphics-document"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "table": { + implicitRole: ["table"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "template": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "textarea": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "tfoot": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "thead": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "time": { + implicitRole: ["time"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "title": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "track": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "u": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "ul": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "var": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "video": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "wbr": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + } + }; // end documentConformanceRequirement + ARIADefinitions.documentConformanceRequirementSpecialTags = { + "a": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-disabled=true"] + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "area": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["button", "link"], + globalAriaAttributesValid: true + } + }, + // TODO + // "autonomous custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."], + // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "div": { + "child-dl": { + implicitRole: ["generic"], + validRoles: ["presentation", "none"], + globalAriaAttributesValid: true + }, + "no-child-dl": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "figure": { + "child-figcaption": { + implicitRole: ["figure"], + validRoles: ['doc-example'], + globalAriaAttributesValid: true + }, + "no-child-figcaption": { + implicitRole: ["figure"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "footer": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["contentinfo"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + // TODO + // "form-associated custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise 'generic'."], + // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "header": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["banner"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + "img": { + "img-with-accname": { + implicitRole: ["img"], + //roleCondition: "when accessible name presents", + validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "meter", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "img-without-accname-empty-alt": { + implicitRole: ["presentation", "none"], + //roleCondition: "when no accessible name presents and alt=''", + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + }, + "img-without-accname-no-alt": { + implicitRole: ["img"], + //roleCondition: "when neither accessible name no alt presents", + validRoles: ["presentation", "none"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + } + }, + "input": { + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "checkbox-with-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is present", + validRoles: ["menuitemcheckbox", "option", "switch", "button"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "checkbox-without-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is not present", + validRoles: ["menuitemcheckbox", "option", "switch"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "color": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "date": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "datetime-local": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=email and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "file": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + }, + "hidden": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "image": { + implicitRole: ["button"], + validRoles: ["checkbox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "month": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "number": { + implicitRole: ["spinbutton"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + }, + "password": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "radio": { + implicitRole: ["radio"], + validRoles: ["menuitemradio"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "range": { + implicitRole: ["slider"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax", "aria-valuemin"] + }, + "reset": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "search-no-list": { + implicitRole: ["searchbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "search-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "submit": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "tel-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "tel-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "text-no-list": { + implicitRole: ["textbox"], + validRoles: ["combobox", "searchbox", "spinbutton"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "text-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + // otherDisallowedAriaAttributes: ["aria-haspopup"] // covered in a different rule + }, + "time": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "url-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "url-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "week": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "default-with-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "default-no-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + } + }, + "li": { + "child-of-list-role": { + implicitRole: ['listitem'], + validRoles: null, + globalAriaAttributesValid: true + }, + "no-child-of-list-role": { + implicitRole: ['generic'], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "section": { + "with-name": { + implicitRole: ["region"], + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + }, + "without-name": { + implicitRole: null, + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + } + }, + "select": { + "no-multiple-attr-size-gt1": { + //roleCondition: " with a multiple attribute or a size attribute having value greater than 1" + implicitRole: ["combobox"], + validRoles: ["menu"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + }, + "multiple-attr-size-gt1": { + //roleCondition: " with no multiple attribute and no size attribute having value greater than 1" + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + } + }, + "summary": { + "first-summary-of-detail": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-disabled", "aria-haspopup"] + }, + "no-first-summary-of-detail": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tbody": { + "des-table": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "td": { + "des-table": { + implicitRole: ["cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "th": { + "des-table-row-scope": { + implicitRole: ["rowheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-table-column-scope": { + implicitRole: ["columnheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-row-scope": { + implicitRole: ["rowheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-column-scope": { + implicitRole: ["columnheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tr": { + "des-table": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "default": { + implicitRole: null, + //roleCondition: "", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }; // end of documentConformanceRequirementSpecialTags + // map aria attribute to the corresponding native attribute, apply to any element applicable + // note this mapping is for the related attributes in the same element without checking the parent tree. + // refer to https://w3c.github.io/html-aria/ + ARIADefinitions.relatedAriaHtmlAttributes = { + "aria-checked": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }] + }, + "aria-disabled": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }] + }, + "aria-hidden": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }, + { + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["until-found"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }] + }, + "aria-placeholder": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["placeholder"], + htmlAttributeValues: null + }] + }, + "aria-valuemax": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["max"], + htmlAttributeValues: null + }] + //overlap case covered in the role definition: Authors SHOULD NOT use aria-valuemax on any element which allows the max attribute. Use the max attribute instead. + }, + "aria-valuemin": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["min"], + htmlAttributeValues: null + }] + ////overlap case covered in the role definition:Authors SHOULD NOT use aria-valuemin on any element which allows the min attribute. Use the min attribute instead. + }, + "aria-readonly": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "false", "false"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "true", "true"] + }] + }, + "aria-required": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }] + }, + "aria-colspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["colspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["colspan"], + htmlAttributeValues: null + }] + }, + "aria-rowspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: null + }] + }, + /** "aria-autocomplete": { + conflict: [{ + // conflict occurs if both exists, aria value is only for custom widget, rather than native + ariaAttributeValue: null, + htmlAttributeNames: ["autocomplete"], + htmlAttributeValues: null + }] + } */ + }; + ARIADefinitions.containers = []; + return ARIADefinitions; +}()); +exports.ARIADefinitions = ARIADefinitions; +; +var containerArray = []; +for (var roleDesign in ARIADefinitions.designPatterns) { + var containers = ARIADefinitions.designPatterns[roleDesign].container; + if (containers !== null) { + for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) { + var container = containers_1[_i]; + if (containerArray.indexOf(container) == -1) { + containerArray.push(container); + } + } + } +} +ARIADefinitions.containers = containerArray; + + +/***/ }, + +/***/ 9955 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAMapper = void 0; +var ARIADefinitions_1 = __webpack_require__(9910); +var CommonMapper_1 = __webpack_require__(3103); +var DOMUtil_1 = __webpack_require__(1686); +var CommonUtil_1 = __webpack_require__(7139); +var AriaUtil_1 = __webpack_require__(7011); +var fragment_1 = __webpack_require__(5279); +var ARIAWalker_1 = __webpack_require__(1560); +var CacheUtil_1 = __webpack_require__(4566); +var DOMWalker_1 = __webpack_require__(3864); +var AccNameUtil_1 = __webpack_require__(1950); +var ARIAMapper = /** @class */ (function (_super) { + __extends(ARIAMapper, _super); + function ARIAMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + ARIAMapper.prototype.childrenCanHaveRole = function (node, role) { + // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = node as Element; + // if (elem.getAttribute("aria-hidden") === "true") { + // return false; + // } + // } + return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren); + }; + ARIAMapper.prototype.getRole = function (node) { + var role = ARIAMapper.nodeToRole(node); + return role; + }; + ARIAMapper.prototype.getNamespace = function () { + return "aria"; + }; + ARIAMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "ARIAMapper::getAttributes", undefined); + if (typeof cacheVal !== "undefined") + return cacheVal; + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + var name_1 = attrInfo.name.toLowerCase(); + if (name_1.startsWith("aria-")) { + retVal[name_1.substring(5)] = attrInfo.nodeValue; + } + } + // Optimize: Cache nodeName.toLowerCase() to avoid repeated calls + var nodeName = node.nodeName.toLowerCase(); + // Apply global attributes first + ARIAMapper.applyAttrRole(elem, "global", retVal); + // Apply element-specific attributes + ARIAMapper.applyAttrRole(elem, nodeName, retVal); + CacheUtil_1.CacheUtil.setCache(node, "ARIAMapper::getAttributes", retVal); + } + else if (node.nodeType === 3 /* Node.TEXT_NODE */) { + var calculators = ARIAMapper.textAttrValueCalculators; + for (var attr in calculators) { + var val = calculators[attr](node); + if (typeof val !== "undefined" && val !== null) { + retVal[attr] = val; + } + } + } + return retVal; + }; + // Optimize: Move applyAttrRole outside getAttributes to avoid function recreation + ARIAMapper.applyAttrRole = function (elem, nodeName, retVal) { + var calculators = ARIAMapper.elemAttrValueCalculators; + if (!(nodeName in calculators)) + return; + for (var attr in calculators[nodeName]) { + if (!(attr in retVal)) { + var value = calculators[nodeName][attr]; + if (typeof value !== "undefined" && value !== null) { + if (typeof value !== "string") { + value = value(elem); + } + retVal[attr] = value; + } + } + } + }; + ARIAMapper.getAriaOwnedBy = function (elem) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + if (!CacheUtil_1.CacheUtil.getCache(doc, "ARIAMapper::precalcOwned", false)) { + var owners = doc.querySelectorAll("[aria-owns]"); + for (var iOwner = 0; iOwner < owners.length; ++iOwner) { + var owner = owners[iOwner]; + var ownIds = owner.getAttribute("aria-owns").split(/ +/g); + var _loop_1 = function (iId) { + var owned = doc.getElementById(ownIds[iId]); + //ignore if the aria-owns point to the element itself + //if (owned && !DOMUtil.sameNode(owner, owned)) { + // CacheUtil.setCache(owned, "aria-owned", owner); + //} + /** + * circular hierarchy check: + * (1) the owned element is neither the same element with the owner nor any ascendant of the owner + * (2) any child with aria-owns cannot point to the owner or any ascendant of the owner + */ + if (owned && !DOMUtil_1.DOMUtil.sameNode(owner, owned)) { + // check if the owned with aria-owns that points to another element + var ownedNodes = []; + var sub_owners = owned.querySelectorAll("[aria-owns]"); + for (var i = 0; i < sub_owners.length; ++i) { + var sub_owner = sub_owners[i]; + var sub_ownIds = sub_owner.getAttribute("aria-owns").split(/ +/g); + for (var j = 0; j < sub_ownIds.length; ++j) { + var ownedNode = doc.getElementById(sub_ownIds[j]); + if (ownedNode) + ownedNodes.push(ownedNode); + } + } + if (ownedNodes.length === 0) { + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + return "continue"; + } + // check if any aria-owns points to the element itself or any of it's parent + var parent_1 = owner; + var circular = false; + while (parent_1 !== null) { + var found = ownedNodes.some(function (item) { return DOMUtil_1.DOMUtil.sameNode(parent_1, item); }); + if (!found) + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + else { + circular = true; + break; + } + } + if (!circular) + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + } + }; + for (var iId = 0; iId < ownIds.length; ++iId) { + _loop_1(iId); + } + } + CacheUtil_1.CacheUtil.setCache(doc, "ARIAMapper::precalcOwned", true); + } + return CacheUtil_1.CacheUtil.getCache(elem, "aria-owned", null); + }; + ARIAMapper.prototype.getNodeHierarchy = function (node) { + if (!node) + return []; + if (node.nodeType !== 1) { + var parentHierarchy = this.getNodeHierarchy(DOMWalker_1.DOMWalker.parentElement(node)); + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + var nodeHierarchy = []; + // Set hierarchy + for (var _i = 0, parentHierarchy_1 = parentHierarchy; _i < parentHierarchy_1.length; _i++) { + var item = parentHierarchy_1[_i]; + nodeHierarchy.push(item); + } + nodeHierarchy.push({ + attributes: {}, + bounds: this.getBounds(node), + namespace: this.getNamespace(), + node: node, + role: this.getRole(node) || null, + rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || null), + roleCount: {}, + childrenCanHaveRole: parentInfo.childrenCanHaveRole + }); + return nodeHierarchy; + } + else { + var elem = node; + var nodeHierarchy = CacheUtil_1.CacheUtil.getCache(elem, "ARIAMapper::getNodeHierarchy", null); + if (!nodeHierarchy) { + // This element hasn't been processed yet - but ::reset processes them all in the right order + // Get details about the correct parent first + var parent_2 = ARIAMapper.getAriaOwnedBy(elem); + if (!parent_2) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + while (parent_2 && parent_2.nodeType !== 1) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + var parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + while (parentInfo.role === null) { + parent_2 = ARIAMapper.getAriaOwnedBy(parent_2) || DOMWalker_1.DOMWalker.parentElement(parent_2); + parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + parentInfo = parentHierarchy[parentHierarchy.length - 1]; + } + // Set initial node info + var nodeInfo = { + attributes: elem.nodeType === 1 ? this.getAttributes(elem) : {}, + bounds: this.getBounds(elem), + namespace: this.getNamespace(), + node: elem, + role: this.getRole(elem) || null, + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + // Adjust role if we're within a presentational container + var presentationalContainer = !parentInfo.childrenCanHaveRole; + if (presentationalContainer) { + nodeInfo.role = null; + } + else { + nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole + && this.childrenCanHaveRole(elem, nodeInfo.role); + } + // Set the paths + if (nodeInfo.role !== null) { + parentInfo.roleCount[nodeInfo.role] = (parentInfo.roleCount[nodeInfo.role] || 0) + 1; + nodeInfo.rolePath = parentInfo.rolePath + "/" + nodeInfo.role + "[" + parentInfo.roleCount[nodeInfo.role] + "]"; + } + else { + nodeInfo.rolePath = parentInfo.rolePath; + } + // Set hierarchy + nodeHierarchy = []; + for (var _a = 0, parentHierarchy_2 = parentHierarchy; _a < parentHierarchy_2.length; _a++) { + var item = parentHierarchy_2[_a]; + nodeHierarchy.push(item); + } + nodeHierarchy.push(nodeInfo); + CacheUtil_1.CacheUtil.setCache(elem, "ARIAMapper::getNodeHierarchy", nodeHierarchy); + } + return nodeHierarchy; + } + }; + ARIAMapper.prototype.reset = function (node) { + ARIAMapper.nameComputationId = 0; + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + // Get to the topmost node + var goodNode = node; + var next; + while (next = DOMWalker_1.DOMWalker.parentNode(goodNode)) { + goodNode = next; + } + ; + // Walk the tree and set the hierarchies in the right order + var ariaWalker = new ARIAWalker_1.ARIAWalker(goodNode, false, goodNode); + do { + if (ariaWalker.node.nodeType === 1) { + this.getNodeHierarchy(ariaWalker.node); + } + } while (ariaWalker.nextNode()); + }; + ARIAMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + for (var idx = 0; idx < this.hierarchyResults.length; ++idx) { + if (this.hierarchyResults[idx].role && this.hierarchyResults[idx].role[0] === "/") { + this.hierarchyResults[idx].role = (this.hierarchyResults[idx].role ? this.hierarchyResults[idx].role.substring(1) : null); + } + } + return this.hierarchyResults; + }; + ARIAMapper.prototype.pushHierarchy = function (node) { + // If we're not an element, no special handling + var nodeHierarchy = []; + // Determine our node info + nodeHierarchy = this.getNodeHierarchy(node); + var nodeInfo = nodeHierarchy[nodeHierarchy.length - 1]; + this.hierarchyRole.push(nodeInfo.role); + if (nodeInfo.role !== null) { + this.hierarchyPath.push(nodeInfo); + } + this.hierarchyResults = nodeHierarchy; + }; + ARIAMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + if (retVal.length > 0) { + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + var parent_3 = DOMWalker_1.DOMWalker.parentElement(node); + this.hierarchyResults = parent_3 ? CacheUtil_1.CacheUtil.getCache(parent_3, "ARIAMapper::getNodeInfo", []) : []; + } + return retVal; + }; + /**public static computeName(cur: Node) : string { + ++ARIAMapper.nameComputationId; + return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false); + } + + public static computeNameHelp(walkId: number, cur: Node, labelledbyTraverse: boolean, walkTraverse: boolean) : string { + // 2g. None of the other content applies to text nodes, so just do this first + if (cur.nodeType === 3 ) return cur.nodeValue; + if (cur.nodeType === 11) return ""; + if (cur.nodeType !== 1 ) { + if (walkTraverse || labelledbyTraverse) return ""; + throw new Error ("Can only compute name on Element and Text " + cur.nodeType); + } + + const elem = cur as Element; + // We've been here before - prevent recursion + if (CacheUtil.getCache(elem, "data-namewalk", null) === ""+walkId) return ""; + CacheUtil.setCache(elem, "data-namewalk", ""+walkId); + // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element + + // 2a. Only show hidden content if it's referenced by a labelledby + if (!labelledbyTraverse && !VisUtil.isNodeVisible(cur)) { + return ""; + } + + // 2b. collect valid id references + if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) { + let labelledby = elem.getAttribute("aria-labelledby").split(" "); + let validElems = []; + for (const ref of labelledby) { + const refElem = FragmentUtil.getById(cur, ref); + if (refElem && !DOMUtil.sameNode(elem, refElem)) { + validElems.push(refElem); + } + } + if (validElems.length > 0) { + let accumulated = ""; + for (const elem of validElems) { + accumulated += " " + this.computeNameHelp(walkId, elem, true, false); + } + return accumulated.trim(); + } + } + + // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases + if (["section", "form"].includes(cur.nodeName.toLowerCase())) { + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse) { + return elem.getAttribute("aria-label").trim(); + } + } + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + return ""; + } + + // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label + const role = ARIAMapper.nodeToRole(cur); + let isEmbeddedControl = [ + "textbox", "button", "combobox", "listbox", + "progressbar", "scrollbar", "slider", "spinbutton" + ].includes(role); + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) { + return elem.getAttribute("aria-label").trim(); + } + } + + // 2d. + if (role !== "presentation" && role !== "none") { + if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) { + return DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim(); + } + + if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) { + let label = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id")+"']"); + if (label) { + if (label.hasAttribute("aria-label") || (label.hasAttribute("aria-labelledby") && !CommonUtil.isIdReferToSelf(cur, label.getAttribute("aria-labelledby")))) { + return this.computeNameHelp(walkId, label, false, false); + } else { + return label.textContent; + } + } + } + if (cur.nodeName.toLowerCase() === "fieldset") { + if( (<Element>cur).querySelector("legend")){ + let legend = (<Element>cur).querySelector("legend"); + return legend.innerText; + }else{ + return this.computeNameHelp(walkId, cur, false, false); + } + + } + + } + + // 2e. + if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) { + // If the embedded control has role textbox, return its value. + if (role === "textbox") { + if (elem.nodeName.toLowerCase() === "input") { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + } else { + walkTraverse = false; + } + } + + // If the embedded control has role button, return the text alternative of the button. + if (role === "button") { + if (elem.nodeName.toLowerCase() === "input") { + let type = elem.getAttribute("type").toLowerCase(); + if (["button", "submit", "reset"].includes(type)) { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + if (type === "submit") return "Submit"; + if (type === "reset") return "Reset"; + } + } else { + walkTraverse = false; + } + } + + // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option. + if (role === "combobox") { + if (elem.hasAttribute("aria-activedescendant")) { + let selected = FragmentUtil.getById(elem, "aria-activedescendant"); + if (selected && !DOMUtil.sameNode(elem, selected)) { + return ARIAMapper.computeNameHelp(walkId, selected, false, false); + } + } + } + + // If the embedded control has role range (e.g., a spinbutton or slider): + if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) { + // If the aria-valuetext property is present, return its value, + if (elem.hasAttribute("aria-valuetext")) return elem.getAttribute("aria-valuetext"); + // Otherwise, if the aria-valuenow property is present, return its value, + if (elem.hasAttribute("aria-valuenow")) return elem.getAttribute("aria-valuenow"); + // TODO: Otherwise, use the value as specified by a host language attribute. + } + } + + // 2f. 2h. + if (walkTraverse || ARIADefinitions.nameFromContent(role) || labelledbyTraverse) { + // 2fi. Set the accumulated text to the empty string. + let accumulated = ""; + // 2fii. Check for CSS generated textual content associated with the current node and + // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2] + // can provide textual content for elements that have a content model. + // For :before pseudo elements, User agents MUST prepend CSS textual content, without + // a space, to the textual content of the current node. + // For :after pseudo elements, User agents MUST append CSS textual content, without a + // space, to the textual content of the current node. + let before = null; + before = elem.ownerDocument.defaultView.getComputedStyle(elem,"before").content; + + if (before && before !== "none") { + before = before.replace(/^"/,"").replace(/"$/,""); + accumulated += before; + } + // 2fiii. For each child node of the current node: + // Set the current node to the child node. + // Compute the text alternative of the current node beginning with step 2. Set the result + // to that text alternative. + // Append the result to the accumulated text. + if (elem.nodeName.toUpperCase() === "SLOT") { + //if no assignedNode, check its own text + if (!(elem as HTMLSlotElement).assignedNodes() || (elem as HTMLSlotElement).assignedNodes().length === 0) { + let innerText = CommonUtil.getInnerText(elem); + if (innerText && innerText !== null && innerText.trim().length > 0) + accumulated += " " + innerText; + } else { + // check text from all assigned nodes + for (const slotChild of (elem as HTMLSlotElement).assignedNodes()) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + } + } + } else { + let walkChild = elem.firstChild; + while (walkChild) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + walkChild = walkChild.nextSibling; + } + } + + let after = null; + try { + after = elem.ownerDocument.defaultView.getComputedStyle(elem,"after").content; + } catch (e) {} + + if (after && after !== "none") { + after = after.replace(/^"/,"").replace(/"$/,""); + accumulated += after; + } + // 2fiv. Return the accumulated text. + accumulated = accumulated.replace(/\s+/g," ").trim(); + if (accumulated.trim().length > 0) { + return accumulated; + } + } + + // 2i. Otherwise, if the current node has a Tooltip attribute, return its value. + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + if (elem.tagName.toLowerCase() === "svg") { + let title = elem.querySelector("title"); + if (title) { + return title.textContent || title.innerText; + } + } + + return ""; + } + */ + /* if (role in ARIADefinitions.designPatterns + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) + { + name = elem.textContent; + } + if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) { + name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent; + } + if (elem.hasAttribute("aria-label")) { + name = elem.getAttribute("aria-label"); + } + if (elem.hasAttribute("aria-labelledby")) { + name = ""; + const ids = elem.getAttribute("aria-labelledby").split(" "); + for (const id of ids) { + name += FragmentUtil.getById(elem, id).textContent + " "; + } + name = name.trim(); + } + return name; + }*/ + ARIAMapper.nodeToRole = function (node) { + if (node.nodeType === 3 /* Node.TEXT_NODE */) { + return "text"; + } + else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + var elem = node; + if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + // TO DO: use AriaUtil.getResolvedRole(elem) to replace the code following, which uses only the valid roles for the element based on the aria fallback rule + //const role = AriaUtil.getResolvedRole(elem); + //return role === "presentation" || role === "none" ? null : role; + if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) { + var roleStr = elem.getAttribute("role").trim(); + var roles_2 = roleStr.split(" "); + for (var _i = 0, roles_1 = roles_2; _i < roles_1.length; _i++) { + var role_1 = roles_1[_i]; + if (role_1 === "presentation" || role_1 === "none") { + // If element is focusable, then presentation roles are to be ignored + if (!CommonUtil_1.CommonUtil.isFocusable(elem)) { + return null; + } + } + else if (role_1 in ARIADefinitions_1.ARIADefinitions.designPatterns) { + return role_1; + } + } + } + //return this.elemToImplicitRole(elem); + var roles = AriaUtil_1.AriaUtil.getImplicitRole(elem); + //console.log("node=" + node.nodeName +", role= " + (roles ? roles[0] : null) +", resolved=" + AriaUtil.getResolvedRole(elem)); + var role = !roles || roles.length === 0 ? null : roles[0]; + return role === "presentation" || role === "none" ? null : role; + //return AriaUtil.getResolvedRole(elem); + }; + //////////////////////////////////////////////////////////////////////////// + // Helper functions + //// + // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis + ARIAMapper.elemAttrValueCalculators = { + "global": { + "name": function (elem) { var _a; return (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem)) === null || _a === void 0 ? void 0 : _a.name; } //ARIAMapper.computeName + }, + "datalist": { + // set to "true" if the datalist's selection model allows multiple option elements to be + // selected at a time, and "false" otherwise + "multiselectable": function (elem) { + var id = elem.getAttribute("id"); + if (id && id.length > 0) { + var input = elem.ownerDocument.querySelector("input[list='" + id + "']"); + return "" + (elem.getAttribute("multiple") + && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == "")); + } + return null; + } + }, + "h1": { + "level": "1" + }, + "h2": { + "level": "2" + }, + "h3": { + "level": "3" + }, + "h4": { + "level": "4" + }, + "h5": { + "level": "5" + }, + "h6": { + "level": "6" + }, + "input": { + // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute + // is true, or "true" if the element's checkedness is true, or "false" otherwise + // - type="radio" state set to "true" if the element's checkedness is true, or "false" + // otherwise. + "checked": function (elem) { + var type = elem.getAttribute("type"); + if (type === "checkbox" || type === "radio") { + return "" + elem.checked; + } + return null; + } + // - type="radio" and not in menu reflecting number of type=radio input elements + // within the radio button group + , + "setsize": function (elem) { return null; // removed by dead control flow + } + // - type="radio" and not in menu value reflecting the elements position + // within the radio button group." + , + "posinset": function (elem) { return null; // removed by dead control flow + } + // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a + // suggestions source element) combobox role, with the aria-owns property set to the same + // value as the list attribute + , + "owns": function (elem) { return null; // removed by dead control flow + } + }, + "keygen": { + "multiselectable": "false" + }, + "li": { + // Number of li elements within the ol, ul, menu + "setsize": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var otherlis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::otherlis", function () { return parent.querySelectorAll("ol li, ul li, menu li"); }); + return "" + (lis.length - otherlis.length); + } + // Position of li element within the ol, ul, menu + , + "posinset": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var num = 0; + for (var idx = 0; idx < lis.length; ++idx) { + var li = lis[idx]; + if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) { + return "" + num; + } + ++num; + } + return null; + } + }, + "menuitem": { + // type = checkbox or radio, set to "true" if the checked attribute + // is present, and "false" otherwise + "checked": function (elem) { return "" + !!(elem.getAttribute("checked") + && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); } + }, + "option": { + // set to "true" if the element's selectedness is true, or "false" otherwise. + "selected": function (elem) { return "" + !!(elem.getAttribute("selected") + && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); } + }, + "progress": { + "valuemax": function (elem) { return elem.getAttribute("max") || "1"; }, + "valuemin": function (elem) { return "0"; }, + "valuenow": function (elem) { return elem.getAttribute("value"); } + } + }; + ARIAMapper.textAttrValueCalculators = { + "name": function (node) { return node.nodeValue; } + }; + ARIAMapper.nameComputationId = 0; + return ARIAMapper; +}(CommonMapper_1.CommonMapper)); +exports.ARIAMapper = ARIAMapper; + + +/***/ }, + +/***/ 1560 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAWalker = void 0; +var fragment_1 = __webpack_require__(5279); +var ARIAMapper_1 = __webpack_require__(9955); +var VisUtil_1 = __webpack_require__(3946); +var DOMWalker_1 = __webpack_require__(3864); +/** + * Walks in an ARIA order + * + * See also ../dom/DOMWalker + */ +var ARIAWalker = /** @class */ (function () { + function ARIAWalker(element, bEnd, root) { + this.root = root || element; + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + // if (this.node.nodeType === 9) { + // this.node = (this.node as Document).documentElement + // } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + } + ARIAWalker.prototype.atRoot = function () { + if (this.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + ARIAWalker.prototype.nextNode = function () { + var skipOwned = false; + do { + skipOwned = false; + // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = true; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + ARIAWalker.prototype.prevNode = function () { + var skipOwned = false; + do { + skipOwned = false; + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + return ARIAWalker; +}()); +exports.ARIAWalker = ARIAWalker; + + +/***/ }, + +/***/ 6858 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AncestorUtil = void 0; +var AncestorUtil = /** @class */ (function () { + function AncestorUtil() { + } + AncestorUtil.isPresentationFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 + && elem.nodeName.toLowerCase() === "iframe" + && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) { + return true; + } + } + } + return false; + }; + AncestorUtil.isFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") { + return true; + } + } + } + return false; + }; + return AncestorUtil; +}()); +exports.AncestorUtil = AncestorUtil; + + +/***/ }, + +/***/ 5279 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FragmentUtil = void 0; +var FragmentUtil = /** @class */ (function () { + function FragmentUtil() { + } + FragmentUtil.getOwnerFragment = function (node) { + var n = node; + while (n.parentNode && (n = n.parentNode)) { + if (n.nodeType === 11) { + return n; + } + } + return node.ownerDocument; + }; + FragmentUtil.getById = function (node, id) { + return this.getOwnerFragment(node).getElementById(id); + }; + FragmentUtil.getAncestor = function (hierarchies, elemName) { + var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; }); + return matches.length > 0 && matches[0].node || null; + }; + FragmentUtil.getAncestorWithRole = function (hierarchies, role) { + var matches = hierarchies["aria"].filter(function (info) { return info.role === role; }); + return matches.length > 0 && matches[0].node || null; + }; + return FragmentUtil; +}()); +exports.FragmentUtil = FragmentUtil; + + +/***/ }, + +/***/ 1043 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2021- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LangUtil = void 0; +// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry +var validPrimaryLangs = [ + ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"], + ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"], + ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"], + ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"], + ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"], + ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"], + ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"], + ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"], + ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"], + ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"], + ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"], + ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"], + ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"], + ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"], + ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"], + ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"], + ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"], + ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"], + ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"], + ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"], + ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"], + ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"], + ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"], + ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"], + ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"], + ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"] +]; +var LangUtil = /** @class */ (function () { + function LangUtil() { + } + /* Determine if given string is a valid BCP 47 string */ + LangUtil.isBcp47 = function (langStr) { + return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr); + }; + LangUtil.validPrimaryLang = function (langStr) { + var primary = langStr.toLowerCase(); + if (primary.includes("-")) { + primary = primary.split("-")[0]; + } + if (!primary.match(/[a-z]{2,3}/)) + return false; + // qaa..qtz + if (primary.length === 3 + && primary.charAt(0) === "q" + && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116 + && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) { + } + return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary); + }; + LangUtil.matchPrimaryLang = function (lang1, lang2) { + var primary1 = lang1; + if (primary1.includes("-")) { + primary1 = primary1.split("-")[0]; + } + var primary2 = lang2; + if (primary2.includes("-")) { + primary2 = primary2.split("-")[0]; + } + return primary1.toLowerCase() === primary2.toLowerCase(); + }; + return LangUtil; +}()); +exports.LangUtil = LangUtil; + + +/***/ }, + +/***/ 3103 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonMapper = void 0; +var DOMWalker_1 = __webpack_require__(3864); +var CommonMapper = /** @class */ (function () { + function CommonMapper() { + this.hierarchyRole = null; + this.hierarchyPath = null; + this.hierarchyResults = null; + } + CommonMapper.prototype.getBounds = function (node) { + return null; + }; + CommonMapper.prototype.reset = function (node) { + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + var ancestors = []; + var parent = DOMWalker_1.DOMWalker.parentNode(node); + while (parent && parent.nodeType != 9 /* Node.DOCUMENT_NODE */) { + ancestors.push(parent); + parent = DOMWalker_1.DOMWalker.parentNode(parent); + } + ancestors = ancestors.reverse(); + for (var _i = 0, ancestors_1 = ancestors; _i < ancestors_1.length; _i++) { + var ancestor = ancestors_1[_i]; + var siblings = []; + var sibling = ancestor.previousSibling; + while (sibling) { + siblings.push(sibling); + sibling = sibling.previousSibling; + } + siblings = siblings.reverse(); + for (var _a = 0, siblings_1 = siblings; _a < siblings_1.length; _a++) { + var sibling_1 = siblings_1[_a]; + this.pushHierarchy(sibling_1); + this.popHierarchy(); + } + this.pushHierarchy(ancestor); + } + }; + CommonMapper.prototype.pushHierarchy = function (node) { + var role = this.getRole(node) || null; + this.hierarchyRole.push(role); + if (role !== null) { + var parentPathInfo = this.hierarchyPath[this.hierarchyPath.length - 1]; + parentPathInfo.roleCount[role] = (parentPathInfo.roleCount[role] || 0) + 1; + this.hierarchyPath.push({ + "rolePath": parentPathInfo.rolePath + "/" + role + "[" + parentPathInfo.roleCount[role] + "]", + "roleCount": {} + }); + } + var attr = {}; + if (node.nodeType === 1) { + attr = this.getAttributes(node); + } + this.hierarchyResults.push({ + node: node, + namespace: this.getNamespace(), + role: role, + attributes: attr, + rolePath: this.hierarchyPath[this.hierarchyPath.length - 1].rolePath, + bounds: this.getBounds(node) + }); + }; + CommonMapper.prototype.popHierarchy = function () { + var role = this.hierarchyRole.pop(); + if (role !== null) { + this.hierarchyPath.pop(); + } + this.hierarchyResults.pop(); + }; + CommonMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + return this.hierarchyResults; + }; + CommonMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + this.popHierarchy(); + return retVal; + }; + return CommonMapper; +}()); +exports.CommonMapper = CommonMapper; + + +/***/ }, + +/***/ 920 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = exports.PartInfo = exports.AttrInfo = void 0; +// Context that will cause this rule to execute. +// Context syntax: +// Triggers: +// aria:role - Triggers on element with ARIA role role +// aria:role[attribute] - Triggers on elements with the equivalent logical +// aria- attribute (e.g., button[disabled] will trigger on +// <button disabled> or <div role="button" aria-disabled="true">) +// role[attribute=value] - Similar to above, with case-sensitive match +// to value +// role[attribute~value] - Similar to above, with case-insensitive match +// dom:element - Triggers on an element with the specified name +// dom:element[attribute] - Triggers on a dom element with the specified attribute +// dom:*[attribute] - Triggers on all elements with the specified attribute +// Combining triggers: +// trigger1 trigger2 - Triggers on elements with trigger2 within an +// element with trigger1 +// !trigger1 trigger2 - Triggers on elements with trigger2 not within +// element with trigger1 +// trigger1>trigger2 - Triggers on elements with trigger2 with an +// an immediate parent with trigger1 +// trigger1+trigger2 - Triggers on elements with trigger2 with an +// immediate previous sibling with trigger1 +// trigger1~trigger2 - Triggers on elements with trigger2 with an +// some earlier sibling with trigger1 +// context,context - Triggers on elements with either context +var AttrInfo = /** @class */ (function () { + function AttrInfo(inclusive, attr, eq, value) { + this.inclusive = inclusive; + this.attr = attr; + this.eq = eq; + this.value = value; + if (!inclusive + && ((typeof eq) !== "undefined" && eq.length > 0)) { + throw new Error("Cannot have !attr" + eq + " context"); + } + if (inclusive && (typeof eq) !== "undefined" && eq.length > 0 && ((typeof value) === "undefined" || value.length === 0)) { + throw new Error("Cannot have equivalence check without a value"); + } + } + AttrInfo.prototype.matches = function (context) { + var ruleAttrPart = this; + var elemAttrs = context.attributes; + if (!(ruleAttrPart.attr in elemAttrs)) { + return !ruleAttrPart.inclusive; + } + else if (!ruleAttrPart.inclusive) { + return false; + } + else if (!ruleAttrPart.eq) { + // inclusive match and I have that attribute and no equivalence defined + return true; + } + else { + // inclusive match and I have that attribute and equivalence defined + var attrValue = elemAttrs[ruleAttrPart.attr]; + if (ruleAttrPart.eq === "=") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!=") { + return ruleAttrPart.value !== attrValue; + } + else if (ruleAttrPart.eq === "~") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!~") { + return ruleAttrPart.value !== attrValue; + } + else { + throw new Error("Context equivalence operator not supported"); + } + } + }; + return AttrInfo; +}()); +exports.AttrInfo = AttrInfo; +var PartInfo = /** @class */ (function () { + function PartInfo(inclusive, namespace, role, attrs, connector) { + this.inclusive = inclusive; + this.namespace = namespace; + this.role = role; + this.attrs = attrs; + this.connector = connector; + if (role === "*" && !inclusive) { + throw new Error("!* context not supported"); + } + } + PartInfo.prototype.matches = function (contextHier, hierLevel) { + var rulePart = this; + var ruleRoleMatch = (rulePart.namespace in contextHier) && contextHier[rulePart.namespace][hierLevel] + && (contextHier[rulePart.namespace][hierLevel].role === rulePart.role + || contextHier[rulePart.namespace][hierLevel].role !== "none" && rulePart.role === "*"); + if (ruleRoleMatch + && rulePart.role === "*" + && rulePart.namespace === "dom" + && (contextHier[rulePart.namespace][hierLevel].role === "#text" + || contextHier[rulePart.namespace][hierLevel].role === "/#text")) { + ruleRoleMatch = false; + } + if (rulePart.inclusive && !ruleRoleMatch) + return false; + if (!rulePart.inclusive && !ruleRoleMatch) + return true; + // Match the attributes + var ruleAttrs = rulePart.attrs; + var elemContext = contextHier[rulePart.namespace][hierLevel]; + var match = true; + for (var _i = 0, ruleAttrs_1 = ruleAttrs; _i < ruleAttrs_1.length; _i++) { + var ruleAttrPart = ruleAttrs_1[_i]; + match = match && ruleAttrPart.matches(elemContext); + } + if (!rulePart.inclusive) + match = !match; + return match; + }; + return PartInfo; +}()); +exports.PartInfo = PartInfo; +var Context = /** @class */ (function () { + function Context(context) { + this.contextInfo = []; + var contextHierMatches = context.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g); + var results = []; + for (var _i = 0, contextHierMatches_1 = contextHierMatches; _i < contextHierMatches_1.length; _i++) { + var part = contextHierMatches_1[_i]; + var parts = part.match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/); + var attrInfo = []; + for (var _a = 0, _b = parts[3].match(/\[([^\]]+)\]/g) || []; _a < _b.length; _a++) { + var attrPart = _b[_a]; + var attrParts = attrPart.match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/); + attrInfo.push(new AttrInfo(attrParts[1] !== "!", attrParts[2].toLowerCase(), attrParts[3], attrParts[4])); + } + parts[2] = parts[2].toLowerCase(); + var nsParts = parts[2].split(":"); + var incl = parts[1] !== "!"; + var ns = nsParts.shift(); + var role = nsParts.join(":"); + var partInfo = new PartInfo(incl, ns, role, attrInfo, parts[parts.length - 1]); + results.push(partInfo); + } + this.contextInfo = results; + } + Context.cleanContext = function (context) { + context = context.toLowerCase().trim(); + context = context.replace(/ +!/g, " !"); + context = context.replace(/ +([>+~,])/g, "$1"); + context = context.replace(/([>+~,]) +/g, "$1"); + context = context.replace(/ +/g, " "); + return context.trim(); + }; + Context.parse = function (context) { + var contexts = Context.splitMultiple(Context.cleanContext(context)); + var retVal = []; + for (var i = 0; i < contexts.length; ++i) { + var ctx = new Context(contexts[i]); + retVal.push(ctx); + } + return retVal; + }; + /** + * Handles initial processing of splitting on comma - context,context + * @param context + */ + Context.splitMultiple = function (context) { + var contexts = []; + if (context) { + if (context.indexOf(",") === -1) { + contexts.push(context); + } + else { + for (var _i = 0, _a = context.split(","); _i < _a.length; _i++) { + var c = _a[_i]; + contexts.push(c); + } + } + } + return contexts; + }; + return Context; +}()); +exports.Context = Context; + + +/***/ }, + +/***/ 7301 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Engine = void 0; +var DOMWalker_1 = __webpack_require__(3864); +var Context_1 = __webpack_require__(920); +var Config_1 = __webpack_require__(4516); +var DOMMapper_1 = __webpack_require__(7507); +var DOMUtil_1 = __webpack_require__(1686); +var CacheUtil_1 = __webpack_require__(4566); +var IRule_1 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var WrappedRule = /** @class */ (function () { + function WrappedRule(rule, parsedInfo) { + this.rule = rule; + this.parsedInfo = parsedInfo; + this.ns = this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length - 1].namespace; + Config_1.Config.DEBUG && console.log("Added Rule:", rule.id, JSON.stringify(this.parsedInfo)); + } + /** + * This function is responsible converting the node into a snippet which can be added to report. + * + * Note: This function will take the node and extract the node name and the attributes and build the snippet based on this. + * + * TODO: Future, maybe we can extract more then just single line, add more info or even add closing tags etc... + * + * @param {HTMLElement} node - The html element to convert into element snippet with node name and attributes only. + * + * @return {String} nodeSnippet - return the element snippet of the element that was provided which only contains, + * nodename and attributes. i.e. <table id=\"layout_table1\" role=\"presentation\"> + * + * @memberOf this + */ + WrappedRule.convertNodeToSnippet = function (node) { + // Variable Decleration + var nodeSnippet = ''; + // Extract the node name and add it to the node snippet + nodeSnippet += '<' + node.nodeName.toLowerCase(); + // Extract all the node attributes as an array + var nodeAttributes = node.attributes; + // In the case there are attributes on this node + if (nodeAttributes !== null && typeof nodeAttributes !== 'undefined') { + // Loop over all theses attributes and add the name and value to the nodeSnippet which will be returned + for (var i = nodeAttributes.length - 1; i >= 0; i--) { + if (nodeAttributes[i].name === "data-namewalk") + continue; + // Add the attribute name and value. + nodeSnippet += ' ' + nodeAttributes[i].name + '="' + nodeAttributes[i].value + '"'; + } + } + // Close the node + nodeSnippet += '>'; + // Return the node snippet + return nodeSnippet; + }; + /** + * This function is responsible for finding the source location for a node, which can be added to a report. + * Supports debug directives in the following forms: + * 1. An attribute on the element itself: + * ibm-a11y-debug="file.ts:10:5" + * 2. A comment node preceding the element (as a sibling or ancestor sibling): + * <!-- ibm-a11y-debug: file.ts:10:5 --> + * 3. A wrapper element (e.g. div) whose first non-whitespace child is such a comment node. + * 4. An ancestor element that carries the ibm-a11y-debug attribute. + * + * Traversal: checks the node itself for an inline attribute, then scans previous siblings at + * each ancestor level upward (also checking each ancestor element's own inline attribute), + * stopping if a blank or 'end' marker is found. + * + * @param {Node} node - The DOM node to find source info for + * @return {string | null} - The source location string, or null if not found + * + * @memberOf this + */ + WrappedRule.convertNodeToSource = function (node, enabled) { + if (enabled === void 0) { enabled = false; } + //console.log("Source Map enabled:", enabled); + if (!enabled || !node) + return null; + var DEBUG_DIRECTIVE = "ibm-a11y-debug"; + /** + * Parses a source string into a DirectiveResult. + * The source is the final resolved value — after any ':' separator has already been stripped. + * A blank value or the exact word 'end' (case-insensitive) is a stop marker. + */ + var parseSource = function (source) { + if (!source || source.toLowerCase() === 'end') { + return { found: true, stop: true }; + } + return { found: true, stop: false, source: source }; + }; + /** + * Extracts the debug-directive comment value from a node. + * Handles: + * - A comment node directly + * - A wrapper element (e.g. <div>) whose first non-whitespace child is a comment node + * + * Returns { found: true, stop: true } if the directive is blank or exactly 'end', + * returns { found: true, stop: false, source } if a valid source is found, + * or returns { found: false } if no directive is present on this node. + */ + var extractDirective = function (elem) { + if (!elem) + return { found: false }; + var commentValue = null; + if (elem.nodeType === Node.COMMENT_NODE) { + // Direct comment node + commentValue = elem.nodeValue; + } + else if (elem.nodeType === Node.ELEMENT_NODE) { + // Element wrapper (e.g. <div><!-- ibm-a11y-debug: ... --></div>) + // Find the first non-whitespace child node + var child = elem.firstChild; + while (child) { + if (child.nodeType === Node.TEXT_NODE) { + // Skip pure whitespace text nodes + if (child.nodeValue && child.nodeValue.trim().length > 0) { + // Non-whitespace text before a comment — not a directive wrapper + break; + } + } + else if (child.nodeType === Node.COMMENT_NODE) { + commentValue = child.nodeValue; + break; + } + else { + // Any other node type before a comment — not a directive wrapper + break; + } + child = child.nextSibling; + } + } + if (commentValue !== null) { + var trimmed = commentValue.trim(); + // Match exactly "ibm-a11y-debug" followed by end-of-string, whitespace, or ':' + // This prevents "ibm-a11y-debug-extra" from being treated as a directive. + if (trimmed === DEBUG_DIRECTIVE || + trimmed.startsWith(DEBUG_DIRECTIVE + ':') || + trimmed.startsWith(DEBUG_DIRECTIVE + ' ') || + trimmed.startsWith(DEBUG_DIRECTIVE + '\t')) { + // Strip the directive name and optional leading whitespace + var afterDirective = trimmed.substring(DEBUG_DIRECTIVE.length).trimStart(); + // Strip a single leading ':' separator if present + // (e.g. "ibm-a11y-debug: file.ts:10:5" → afterDirective = ": file.ts:10:5") + var source = afterDirective.startsWith(':') + ? afterDirective.substring(1).trim() + : afterDirective.trim(); + return parseSource(source); + } + } + return { found: false }; + }; + /** + * Returns the ibm-a11y-debug attribute value from an element node as a DirectiveResult, + * or { found: false } if absent. Recognises the 'end' stop marker just like comment directives. + * The attribute value is the source directly (no ':' prefix), e.g. ibm-a11y-debug="file.ts:10:5". + */ + var getInlineAttr = function (n) { + if (n.nodeType !== Node.ELEMENT_NODE) + return { found: false }; + var val = n.getAttribute(DEBUG_DIRECTIVE); + if (val === null) + return { found: false }; + // Attribute value is the source directly — no ':' separator to strip + return parseSource(val.trim()); + }; + /** + * Traverses left (previous siblings) then upward (parent) to find source info. + * Does NOT check the starting element itself — only its preceding siblings and ancestors. + * This avoids misidentifying a content node as its own source directive. + * + * At each ancestor level the function also checks the ancestor element's own inline + * ibm-a11y-debug attribute, so that a parent element can annotate all its descendants. + * + * Sibling scanning stops at the first node that is recognised as a directive (found or stop). + * Non-directive nodes (real content elements, text nodes) are skipped so that a directive + * placed further back in the sibling list is still found even if content nodes intervene. + * However, traversal does NOT cross element boundaries when scanning siblings — only + * comment nodes and dedicated wrapper elements (whose sole first child is a comment) are + * treated as transparent. + * + * Shadow DOM traversal: uses DOMWalker.parentNode() to cross shadow boundaries correctly, + * including slotted content and nested Shadow DOM (shadow-in-shadow). When the parent + * chain reaches a ShadowRoot, DOMWalker.parentNode() automatically resolves it to the + * shadow host element in the outer DOM. A plain DocumentFragment with no host returns + * null from DOMWalker.parentNode(), stopping traversal. + * + * Sibling traversal uses DOMWalker.previousSiblingNotOwnedBySlot() to skip nodes that + * are assigned to slots (and therefore logically belong to a different part of the tree). + * + * Uses an iterative approach (rather than recursion) to safely handle deeply nested + * DOM structures without risk of stack overflow. + * + * @param elem - The node whose context we are searching + * @returns The source location string, or null if not found + */ + var findSource = function (elem) { + var current = elem; + while (current) { + // Scan previous siblings for a debug directive comment or wrapper element. + // Use previousSiblingNotOwnedBySlot to skip nodes assigned to slots, which + // logically belong to a different part of the composed tree. + // Only comment nodes and dedicated wrapper elements are considered directives; + // all other node types are skipped (they do not block further scanning). + var prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(current); + while (prev) { + var result = extractDirective(prev); + if (result.found) { + if (result.stop) + return null; + return result.source; + } + prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(prev); + } + // No directive found among siblings — move up to parent. + // Use DOMWalker.parentNode() instead of node.parentNode directly so that: + // 1. Shadow DOM boundaries are crossed automatically (ShadowRoot → host element), + // supporting both regular and nested Shadow DOM (shadow-in-shadow). + // 2. Slotted nodes are re-parented to their slot owner rather than their + // light-DOM parent, matching the composed (rendered) tree structure. + // 3. Nodes with an ownerElement (e.g. iframe document roots) are re-parented + // to their owner element. + var parent_1 = DOMWalker_1.DOMWalker.parentNode(current); + if (!parent_1 || parent_1.nodeType === Node.DOCUMENT_NODE) { + // Reached the top of the tree (or a plain DocumentFragment with no host) + // without finding a directive. + return null; + } + // Check the parent element's own inline attribute before continuing upward. + // This allows a containing element to annotate all its descendants. + // An 'end' inline attribute on the parent stops traversal entirely. + var parentAttrResult = getInlineAttr(parent_1); + if (parentAttrResult.found) { + if (parentAttrResult.stop) + return null; + return parentAttrResult.source; + } + current = parent_1; + } + return null; + }; + // First, check for an inline attribute directive on the element itself. + // An 'end' attribute on the element itself stops traversal (returns null). + var selfAttrResult = getInlineAttr(node); + if (selfAttrResult.found) { + if (selfAttrResult.stop) + return null; + return selfAttrResult.source; + } + // Then traverse the DOM to find a preceding comment directive or ancestor attribute + return findSource(node); + }; + WrappedRule.prototype.run = function (engine, context, options, contextHierarchies) { + var startTime = new Date().getTime(); + var results; + try { + results = this.rule.run(context, options, contextHierarchies); + } + catch (e) { + var err = e; + console.error("RULE EXCEPTION:", this.rule.id, context.dom.rolePath, err.stack); + throw e; + } + var endTime = new Date().getTime(); + if (!results) + results = []; + if (!(results instanceof Array)) { + results = [results]; + } + var retVal = []; + for (var _i = 0, results_1 = results; _i < results_1.length; _i++) { + var result = results_1[_i]; + var message = engine.getMessage(this.rule.id, result.reasonId, result.messageArgs); + var path = {}; + for (var ns in context) { + path[ns] = context[ns].rolePath; + } + var ruleId = this.rule.id.replace(/^(.*)\$\$\d+$/, "$1"); + retVal.push({ + ruleId: ruleId, + value: result.value, + node: context["dom"].node, + path: path, + ruleTime: endTime - startTime, + reasonId: result.reasonId, + message: message, + messageArgs: result.messageArgs, + apiArgs: result.apiArgs, + bounds: context["dom"].bounds, + snippet: WrappedRule.convertNodeToSnippet(context["dom"].node), + source: WrappedRule.convertNodeToSource(context["dom"].node, engine.isSourceMapEnabled()) + }); + } + return retVal; + }; + return WrappedRule; +}()); +var Engine = /** @class */ (function () { + function Engine() { + this.mappers = {}; + this.ruleMap = {}; + this.wrappedRuleMap = {}; + this.nlsMap = {}; + this.helpMap = {}; + this.sourceMapEnabled = false; + this.inclRules = {}; + this.exclRules = {}; + // Need a DOM Mapper as a minimum + this.addMapper(new DOMMapper_1.DOMMapper()); + } + Engine.getLanguages = function () { + var env = typeof process !== "undefined" && typeof process.nodeType === "undefined" && process.env; + // If all else fails, default to US English + var nodeLang = "en-US"; + if (env) { + nodeLang = env.LANG || env.LANGUAGE || env.LC_ALL || env.LC_MESSAGES; + if (nodeLang && nodeLang.length > 0) { + nodeLang = nodeLang.split(".")[0].replace(/_/g, "-"); + } + else { + nodeLang = "en-US"; + } + } + return typeof navigator !== "undefined" && navigator.languages || [nodeLang]; + }; + Engine.prototype.run = function (root, options) { + if (root === null) { + return Promise.reject("null document"); + } + if (root.nodeType === 9 /* Node.DOCUMENT_NODE */) { + root = root.documentElement; + } + root.ownerDocument && (root.ownerDocument.PT_CHECK_HIDDEN_CONTENT = false); + var numNodesVisited = CacheUtil_1.CacheUtil.clearCaches(root); + var walker = new DOMWalker_1.DOMWalker(root, false, root, true); + var retVal = { + results: [], + numExecuted: 0, + ruleTime: 0, + totalTime: 0 + }; + var start = new Date().getTime(); + // Reset the role mappers + for (var namespace in this.mappers) { + this.mappers[namespace].reset(root); + } + // Initialize the context detector + var currentNodeCount = 0; + var lastReportedPercent = -1; + do { + currentNodeCount++; + // Report progress at each percentage milestone + var currentPercent = Math.floor((currentNodeCount / numNodesVisited) * 100); + if (currentPercent > lastReportedPercent) { + if (numNodesVisited > 10000) { + // if (currentPercent > 6) break; + console.log("Progress: ".concat(currentPercent, "% (").concat(currentNodeCount, "/").concat(numNodesVisited, " nodes)")); + // const ruleTimes = retVal.results.reduce((prev, cur) => { + // prev[cur.ruleId] = (prev[cur.ruleId] || 0)+cur.ruleTime; + // return prev; + // }, {}); + // for (const ruleId in ruleTimes) { + // if (ruleTimes[ruleId] > 10000) { + // console.log(`${ruleId}: ${ruleTimes[ruleId]}`); + // } + // } + // console.groupEnd(); + } + lastReportedPercent = currentPercent; + } + // Get the context information from the rule mappers + var contextHierarchies = {}; + for (var namespace in this.mappers) { + if (!walker.bEndTag) { + contextHierarchies[namespace] = this.mappers[namespace].openScope(walker.node); + // if (namespace === "dom" && walker.node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = walker.node as Element; + // let id; + // if (elem.hasAttribute("id") && (id = elem.getAttribute("id").trim()).length > 0) { + // if (root.ownerDocument.getElementById(id) === elem) { + // contextHierarchies["dom"][contextHierarchies["dom"].length-1].rolePath = "//*[@id='"+id+"']"; + // } + // } + // } + } + else { + contextHierarchies[namespace] = this.mappers[namespace].closeScope(walker.node); + } + } + if (walker.node.nodeType !== 11 + && (VisUtil_1.VisUtil.isNodeVisible(walker.node) + // || walker.node.nodeName.toLowerCase() === "head" + || walker.node.nodeName.toLowerCase() === "meta" + || walker.node.nodeName.toLowerCase() === "style" + || walker.node.nodeName.toLowerCase() === "datalist" + || walker.node.nodeName.toLowerCase() === "param" + || !DOMUtil_1.DOMUtil.getAncestor(walker.node, ["body"]))) { + var context = {}; + for (var ns in contextHierarchies) { + var nsHier = contextHierarchies[ns]; + var lastHier = nsHier[nsHier.length - 1]; + context[ns] = lastHier; + } + var matchingRules = this.getMatchingRules(contextHierarchies); + var depMatch = {}; + for (var _i = 0, matchingRules_1 = matchingRules; _i < matchingRules_1.length; _i++) { + var matchingRule = matchingRules_1[_i]; + var fulfillsDependencies = true; + for (var _a = 0, _b = matchingRule.rule.dependencies || []; _a < _b.length; _a++) { + var dep = _b[_a]; + if (!depMatch[dep]) + fulfillsDependencies = false; + } + if (fulfillsDependencies) { + var results = []; + var start_1 = new Date().getTime(); + try { + results = matchingRule.run(this, context, options, contextHierarchies); + } + catch (err) { + // Wrapper shows error in console. Skip this rule as N/A + // We don't want to kill the engine + } + // If out of scope, it fulfills the dependency + if (results.length === 0) { + depMatch[matchingRule.rule.id] = true; + } + for (var _c = 0, results_2 = results; _c < results_2.length; _c++) { + var result = results_2[_c]; + retVal.results.push(result); + retVal.ruleTime += result.ruleTime; + retVal.numExecuted++; + if (result.value[1] === IRule_1.eRuleConfidence.PASS) { + depMatch[result.ruleId] = true; + } + } + } + } + } + } while (walker.nextNode()); + CacheUtil_1.CacheUtil.clearCaches(root); + retVal.totalTime = new Date().getTime() - start; + return Promise.resolve(retVal); + }; + Engine.prototype.enableRules = function (ruleIds) { + for (var ruleId in this.ruleMap) { + this.ruleMap[ruleId].enabled = false; + } + for (var _i = 0, _a = ruleIds || []; _i < _a.length; _i++) { + var ruleId = _a[_i]; + if (!(ruleId in this.ruleMap)) { + console.warn("WARNING: Rule Id", ruleId, "could not be enabled."); + } + else { + this.ruleMap[ruleId].enabled = true; + } + } + }; + Engine.prototype.getRule = function (ruleId) { + return this.ruleMap[ruleId]; + }; + Engine.prototype.getRulesIds = function () { + var retVal = []; + for (var ruleId in this.ruleMap) { + retVal.push(ruleId); + } + return retVal; + }; + Engine.prototype.addRules = function (rules) { + for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) { + var rule = rules_1[_i]; + this.addRule(rule, true); + } + this._sortRules(); + }; + Engine.prototype.addRule = function (rule, skipSort) { + var ctxs = Context_1.Context.parse(rule.context); + var idx = 0; + var ruleId = rule.id; + if (ruleId in this.ruleMap) { + console.log("WARNING: Rule", ruleId, "already added to engine. Ignoring..."); + return; + } + this.ruleMap[ruleId] = rule; + for (var _i = 0, ctxs_1 = ctxs; _i < ctxs_1.length; _i++) { + var ctx = ctxs_1[_i]; + var wrapId = ruleId; + if (idx >= 1) { + wrapId = ruleId + "$$" + idx; + } + ++idx; + var wrappedRule = new WrappedRule(rule, ctx); + this.wrappedRuleMap[wrapId] = wrappedRule; + var parts = wrappedRule.parsedInfo.contextInfo; + var lastPart = parts[parts.length - 1]; + var triggerRole = lastPart.namespace + ":" + lastPart.role; + if (lastPart.inclusive) { + this.inclRules[triggerRole] = this.inclRules[triggerRole] || []; + this.inclRules[triggerRole].push(wrappedRule); + } + else { + this.exclRules[triggerRole] = this.exclRules[triggerRole] || []; + this.exclRules[triggerRole].push(wrappedRule); + } + } + if (!skipSort) { + this._sortRules(); + } + }; + Engine.prototype.enableSourceMap = function (enable) { + this.sourceMapEnabled = enable; + }; + Engine.prototype.isSourceMapEnabled = function () { + return this.sourceMapEnabled; + }; + Engine.prototype._sortRules = function () { + for (var role in this.inclRules) { + this.inclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + for (var role in this.exclRules) { + this.exclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + }; + Engine.prototype.addNlsMap = function (map) { + for (var key in map) { + this.nlsMap[key] = map[key]; + } + }; + Engine.prototype.addHelpMap = function (map) { + for (var key in map) { + this.helpMap[key] = map[key]; + } + }; + Engine.prototype.getMessage = function (ruleId, ruleIdx, msgArgs) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.nlsMap)) + return ruleId; + var messageTemplate = this.nlsMap[ruleId][ruleIdx || 0]; + if (!messageTemplate) + return ruleId + "_" + ruleIdx; + return messageTemplate.replace(/\{(\d+)\}/g, function (matchedStr, matchedNum, matchedIndex) { return msgArgs[matchedNum]; }); + }; + Engine.prototype.getHelp = function (ruleId, reasonId, archiveId) { + if (!archiveId) { + // Set to the latest + archiveId = "latest"; + } + return "".concat(Config_1.Config.helpRoot, "/").concat(archiveId, "/doc").concat(this.getHelpRel(ruleId, reasonId)); + }; + Engine.prototype.getHelpRel = function (ruleId, ruleIdx) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.helpMap)) + return ruleId; + ruleIdx = ruleIdx || 0; + var helpStr = null; + if (ruleIdx in this.helpMap[ruleId]) { + helpStr = this.helpMap[ruleId][ruleIdx || 0]; + } + else { + helpStr = this.helpMap[ruleId][0]; + } + if (!helpStr) + return ruleId + "_" + ruleIdx; + return helpStr; + }; + Engine.prototype.addMapper = function (mapper) { + this.mappers[mapper.getNamespace()] = mapper; + }; + Engine.match = function (rule, contextHier) { + var ruleParts = rule.parsedInfo.contextInfo; + var partIdx = ruleParts.length - 1; + var curNS = ruleParts[partIdx].namespace; + var curHier = contextHier[curNS][contextHier[curNS].length - 1]; + var contextNode = curHier.node; + // If the end of the rule part doesn't match the end of the hierarchy, we don't have a match + if (!ruleParts[partIdx].matches(contextHier, contextHier[curNS].length - 1)) { + return false; + } + // If there was only one part, we have a match + if (ruleParts.length === 1) { + return true; + } + // Need to deal with parent parts. To walk the hierarchy, these need to be + // all in the same namespace. Confirm that is true. + curNS = ruleParts[0].namespace; + curHier = contextHier[curNS][contextHier[curNS].length - 1]; + --partIdx; + if (ruleParts.slice(0, ruleParts.length - 1).some(function (part) { return part.namespace !== curNS; })) { + console.error("[ERROR] Rule ".concat(rule.rule.id, " has inconsitent parent namespaces")); + return false; + } + // If the target node matches the end of the hierarchy, move up past it, otherwise, start at the end + var hierIdx = contextHier[curNS].length - (curHier.node.isSameNode(contextNode) ? 2 : 1); + while (hierIdx >= 0 && partIdx >= 0) { + var part = ruleParts[partIdx]; + var matchesPart = ruleParts[partIdx].matches(contextHier, hierIdx); + if (part.connector === ">") { + if (!matchesPart) { + // Direct parent check and doesn't match + return false; + } + else { + // Direct parent check and does match + --partIdx; + --hierIdx; + } + } + else if (part.connector === " ") { + if (part.inclusive) { + // inclusive ancestor match + if (matchesPart) { + --partIdx; + } + // If doesn't match, just move up the role hierarchy + --hierIdx; + } + else if (!matchesPart) { + // exclusive ancestor match and current matches + return false; + } + else { + // exclusive ancestor match and current doesn't match - check for other ancestors + var parentMatch = false; + for (var searchIdx = hierIdx - 1; !parentMatch && searchIdx >= 0; --searchIdx) { + parentMatch = !ruleParts[partIdx].matches(contextHier, searchIdx); + } + if (parentMatch) + return false; + else + --partIdx; + } + } + else { + throw new Error("Context connector " + part.connector + " is not supported"); + } + } + return partIdx === -1; + }; + Engine.prototype.getMatchingRules = function (ctxHier) { + var matches = []; + function addMatches(rules) { + for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) { + var rule = rules_2[_i]; + if (rule.rule.enabled && Engine.match(rule, ctxHier)) { + matches.push(rule); + } + } + } + for (var ns in ctxHier) { + var role = ns + ":" + (ctxHier[ns].length > 0 ? ctxHier[ns][ctxHier[ns].length - 1].role : "none"); + if (role in this.inclRules) { + addMatches(this.inclRules[role]); + } + for (var xRole in this.exclRules) { + if (xRole !== role) { + addMatches(this.exclRules[xRole]); + } + } + if (role !== ns + ":none") { + if (role.startsWith(ns + ":/")) { + if (ns + ":/*" in this.inclRules) { + addMatches(this.inclRules[ns + ":/*"]); + } + } + else { + if (ns + ":*" in this.inclRules) { + addMatches(this.inclRules[ns + ":*"]); + } + } + } + } + return this.sortDeps(matches); + }; + /** + * Sorts the rules in order to execute dependencies in the correct order + * @param inRules List of wrapped rules to sort + * @returns Sorted list of wrapped rules + */ + Engine.prototype.sortDeps = function (inRules) { + var depRules = []; + for (var _i = 0, inRules_1 = inRules; _i < inRules_1.length; _i++) { + var rule = inRules_1[_i]; + depRules.push(rule); + } + var retVal = []; + var idToRule = {}; + // Iterate through the rules. If that rule's dependencies can be met by rules already in the list, add it to the list + // Repeat until no changes are made to the satisfied list + // If a rule cannot be satisfied, it will never execute, so it can be dropped. + var change = false; + do { + change = false; + for (var idx = 0; idx < depRules.length; ++idx) { + var depRule = depRules[idx]; + if (depRule.rule.id in idToRule) + continue; + var allMatch = true; + if (depRule.rule.dependencies && depRule.rule.dependencies.length > 0) { + for (var _a = 0, _b = depRule.rule.dependencies; _a < _b.length; _a++) { + var depId = _b[_a]; + if (!(depId in idToRule)) { + allMatch = false; + } + } + } + // if (depRule.rule.prereqs && depRule.rule.prereqs.length > 0) { + // for (const depId of depRule.rule.prereqs) { + // if (!(depId in idToRule)) { + // allMatch = false; + // } + // } + // } + if (allMatch) { + change = true; + retVal.push(depRule); + idToRule[depRule.rule.id] = true; + depRules.splice(idx--, 1); + } + } + } while (change); + return retVal; + }; + return Engine; +}()); +exports.Engine = Engine; + + +/***/ }, + +/***/ 4516 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Config = void 0; +var Config = /** @class */ (function () { + function Config() { + } + Config.DEBUG = false; + Config.helpRoot = "https://able.ibm.com/rules/archives"; + return Config; +}()); +exports.Config = Config; + + +/***/ }, + +/***/ 7507 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMMapper = void 0; +var CommonMapper_1 = __webpack_require__(3103); +var CacheUtil_1 = __webpack_require__(4566); +var DOMMapper = /** @class */ (function (_super) { + __extends(DOMMapper, _super); + function DOMMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + DOMMapper.prototype.getRole = function (node) { + return node.nodeName.toLowerCase(); + }; + DOMMapper.prototype.getNamespace = function () { + return "dom"; + }; + DOMMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + retVal[attrInfo.name.toLowerCase()] = attrInfo.nodeValue; + } + } + return retVal; + }; + /** + * get scaled bounds for screenshot etc. adjusted for devicePixelRatio and scroll + * @param node + * @returns + */ + DOMMapper.prototype.getBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_Bounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var adjustment = 1; + if (node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.devicePixelRatio) { + adjustment = node.ownerDocument.defaultView.devicePixelRatio; + } + var bounds = node.getBoundingClientRect(); + // Do a check whether bounds has value as we use different tool (htmlUnit, browser) to call this function + if (bounds) { + var scrollX_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil((bounds.left + scrollX_1) * adjustment), + "top": Math.ceil((bounds.top + scrollY_1) * adjustment), + "height": Math.ceil(bounds.height * adjustment), + "width": Math.ceil(bounds.width * adjustment) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_Bounds", ret); + return ret; + } + return null; + }; + /** + * get real CSS bounds in css pixels, adjusted for scroll only + * @param node + * @returns + */ + DOMMapper.prototype.getUnadjustedBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_UnadjustedBounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var bounds = node.getBoundingClientRect(); + // adjusted for scroll if any + if (bounds) { + var scrollX_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil(bounds.left + scrollX_2), + "top": Math.ceil(bounds.top + scrollY_2), + "height": Math.ceil(bounds.height), + "width": Math.ceil(bounds.width) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_UnadjustedBounds", ret); + return ret; + } + return null; + }; + return DOMMapper; +}(CommonMapper_1.CommonMapper)); +exports.DOMMapper = DOMMapper; + + +/***/ }, + +/***/ 1686 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMUtil = void 0; +var DOMWalker_1 = __webpack_require__(3864); +/** + * Utility class providing helper methods for DOM manipulation and traversal operations. + * Used throughout the accessibility checker engine to navigate and analyze DOM structures. + */ +var DOMUtil = /** @class */ (function () { + function DOMUtil() { + } + /** + * Checks if a given node has an ancestor element with a node name matching any of the provided names. + * Traverses up the DOM tree from the given node until a match is found or the root is reached. + * + * @param node - The starting DOM node to check + * @param names - Array of node names (tag names) to search for in uppercase (e.g., ['TABLE', 'DIV']) + * @returns true if an ancestor with a matching name is found, false otherwise + */ + DOMUtil.hasParent = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName)) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return !!p; + }; + /** + * Retrieves the first ancestor element that matches any of the provided node names (case-insensitive). + * Similar to hasParent but returns the actual element reference and performs case-insensitive comparison. + * + * @param node - The starting DOM node + * @param names - Array of lowercase node names to search for (e.g., ['table', 'div']) + * @returns The matching ancestor element, or null if none found + */ + DOMUtil.getAncestor = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName.toLowerCase())) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return p; + }; + /** + * Determines if two nodes are the same node, with fallback strategies for different browser environments. + * Uses multiple comparison methods for cross-browser compatibility: + * 1. Strict equality (===) + * 2. isSameNode() method if available + * 3. compareDocumentPosition() (returns 0 if same node) + * 4. Returns true as last resort if no comparison method is available + * + * @param a - First node to compare + * @param b - Second node to compare + * @returns true if nodes are the same, false otherwise + */ + DOMUtil.sameNode = function (a, b) { + if (a === b) { + return true; + } + else if (a.isSameNode) { + return a.isSameNode(b); + } + else if (a.compareDocumentPosition) { + return a.compareDocumentPosition(b) === 0; + } + else { + // Not supported in this environment - try our best + return true; + } + }; + /** + * Normalizes whitespace in a string by replacing all whitespace characters + * (spaces, tabs, carriage returns, newlines) with single spaces and collapsing + * multiple consecutive spaces into one. + * + * @param s - The input string to clean + * @returns The cleaned string with normalized whitespace + * @example "Hello\n\t World" → "Hello World" + */ + DOMUtil.cleanWhitespace = function (s) { + var retVal = s.replace(/[ \t\r\n]/g, " ").replace(/ +/g, " "); + return retVal; + }; + /** + * Collapses multiple consecutive spaces into a single space. + * Unlike cleanWhitespace, only handles spaces, not other whitespace characters like tabs or newlines. + * + * @param s - The input string to clean + * @returns The string with collapsed spaces + */ + DOMUtil.cleanSpace = function (s) { + var retVal = s.replace(/ +/g, " "); + return retVal; + }; + /** + * Determines if two elements (typically table cells) belong to the same table element. + * Finds the table ancestor for each element and compares them using sameNode(). + * + * @param element1 - First element to check + * @param element2 - Second element to check + * @returns true if both elements share the same table ancestor, false otherwise + */ + DOMUtil.isInSameTable = function (element1, element2) { + if (element1 && element2) { + var parentName = ['table']; + var parent1 = DOMUtil.getAncestor(element1, parentName); + var parent2 = DOMUtil.getAncestor(element2, parentName); + if (parent1 !== null && parent2 != null && DOMUtil.sameNode(parent1, parent2)) + return true; + } + return false; + }; + /** + * Traverses up the DOM tree to find the shadow root (document fragment) that contains the given node. + * Important for handling Web Components and Shadow DOM structures in accessibility checking. + * + * @param node - The starting node + * @returns The shadow root node (nodeType 11 = DOCUMENT_FRAGMENT_NODE), or null if none found + */ + DOMUtil.shadowRootNode = function (node) { + var nd = node; + while (nd != null && nd.nodeType !== 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + nd = nd.parentNode; + return nd; + }; + /** + * Creates a deep copy of an object while preserving Node references (doesn't clone Node objects). + * Useful when copying data structures that contain DOM node references, as you typically want + * to preserve those references rather than attempting to clone the nodes themselves. + * + * Behavior: + * - Primitive values: Deep copied via JSON serialization + * - Functions: Returned as-is (reference) + * - Node objects: Returned as-is (reference, not cloned) + * - Arrays/Objects: Recursively copied with the same rules + * + * @param rhs - The object to copy (right-hand side) + * @returns A copy of the object with Node references preserved + */ + DOMUtil.objectCopyWithNodeRefs = function (rhs) { + if (!rhs) + return rhs; + if (typeof rhs !== "object") { + if (typeof rhs === "function") { + return rhs; + } + else { + return JSON.parse(JSON.stringify(rhs)); + } + } + else if (rhs instanceof Node || !!rhs.nodeType) { + return rhs; + } + else { + var retVal = void 0; + if (rhs.constructor.name === "Array") { + retVal = []; + for (var _i = 0, rhs_1 = rhs; _i < rhs_1.length; _i++) { + var item = rhs_1[_i]; + retVal.push(this.objectCopyWithNodeRefs(item)); + } + } + else { + retVal = {}; + for (var key in rhs) { + retVal[key] = this.objectCopyWithNodeRefs(rhs[key]); + } + } + return retVal; + } + }; + /** + * Finds the first ancestor element that has a specific attribute with a specific value. + * Traverses up the DOM tree from the given element until a matching ancestor is found. + * + * @param element - The starting element + * @param attrName - The attribute name to search for + * @param attrValue - The expected attribute value + * @returns The matching ancestor element, or null if none found + * @example Finding an ancestor with aria-hidden="true" or data-testid="container" + */ + DOMUtil.getAncestorWithAttribute = function (element, attrName, attrValue) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (walkNode.nodeType === 1 /* Node.ELEMENT_NODE */ && walkNode.getAttribute(attrName) === attrValue) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + return DOMUtil; +}()); +exports.DOMUtil = DOMUtil; + + +/***/ }, + +/***/ 3864 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMWalker = void 0; +var VisUtil_1 = __webpack_require__(3946); +/** + * Walks in a DOM order + * + * Assumption that nodes of shadow DOMs call assignSlots on the shadow root before + * doing other processing in that tree. If you walk into a shadow root, the DOMWalker + * will do it automatically. + * + * See also ../aria/ARIAWalker + */ +var DOMWalker = /** @class */ (function () { + function DOMWalker(element, bEnd, root, considerHidden, DEBUG) { + this.DEBUGIDX = 0; + this.indent = 0; + this.DEBUG = !!DEBUG; + this.root = root || ((element && element.ownerDocument) ? element.ownerDocument.documentElement : element); + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + if (this.node.nodeType === 9) { + this.node = this.node.documentElement; + } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + this.considerHidden = considerHidden || false; + } + DOMWalker.prototype.elem = function () { + return this.node.nodeType === 1 && this.node || null; + }; + DOMWalker.parentNode = function (node) { + if (node === null) + return null; + var p = node.parentNode; + if (node.slotOwner) { + p = node.slotOwner; + } + else if (node.ownerElement) { + p = node.ownerElement; + } + else if (p && p.nodeType === 11) { + if (p.host) { + p = p.host; + } + else { + p = null; + } + } + return p; + }; + DOMWalker.parentElement = function (node) { + var elem = node; + do { + elem = DOMWalker.parentNode(elem); + } while (elem && elem.nodeType !== 1); + return elem; + }; + DOMWalker.assignSlots = function (root) { + var slots = root.querySelectorAll("slot"); + for (var iSlot = 0; iSlot < slots.length; ++iSlot) { + var processSlot = slots[iSlot]; + var assignedNodes = processSlot.assignedNodes(); + for (var iAssigned = 0; iAssigned < assignedNodes.length; ++iAssigned) { + assignedNodes[iAssigned].slotOwner = processSlot; + assignedNodes[iAssigned].slotIndex = iAssigned; + } + } + }; + DOMWalker.firstChildNotOwnedBySlot = function (node) { + var retVal = node.firstChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.lastChildNotOwnedBySlot = function (node) { + var retVal = node.lastChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.nextSiblingNotOwnedBySlot = function (node) { + var retVal = node.nextSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.previousSiblingNotOwnedBySlot = function (node) { + var retVal = node.previousSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.prototype.atRoot = function () { + if (this.node.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + DOMWalker.prototype.nextNode = function () { + var _this = this; + var indent = function () { + var s = ""; + for (var idx = 0; idx < _this.indent; ++idx) { + s += " "; + } + return s; + }; + var DBG = false; //this.DEBUGIDX >= 7 && this.DEBUGIDX <= 10; + var startName = this.node.nodeName; + if (!this.node) { + this.bEndTag = false; + return false; + } + do { + //console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + DBG && console.log("!!!Into Frame"); + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + DBG && console.log("!!!Into shadow root"); + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + DBG && console.log("!!!Into slot"); + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker.firstChildNotOwnedBySlot(this.node)) { + DBG && console.log("!!!First child"); + this.node = DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + DBG && console.log("!!!Flip to end tag"); + this.bEndTag = true; + } + } + else { + DBG && console.log("!!!1"); + if (this.atRoot()) { + DBG && console.log("!!!Done at root"); + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + DBG && console.log("!!!Next slot child"); + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + DBG && console.log("!!!Back up to slot owner"); + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + DBG && console.log("!!!Up to frame owner"); + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + DBG && console.log("!!!Next sibling"); + this.node = DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + } + else if (this.node.parentNode) { + DBG && console.log("!!!Parent"); + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + DBG && console.log("!!!Done with walk"); + return false; + } + } + if (DBG && ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"))) { + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++, " SKIPPED")); + } + } while ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + if (this.bEndTag) + this.indent -= 2; + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++)); + this.DEBUG && this.node.slotOwner && console.log(indent() + "slotOwner: ".concat(this.node.slotOwner.nodeName)); + this.DEBUG && this.node.slotIndex && console.log(indent() + "slotIndex: ".concat(this.node.slotIndex)); + this.DEBUG && this.node.ownerElement && console.log(indent() + "ownerElement: ".concat(this.node.ownerElement.nodeName)); + if (!this.bEndTag) + this.indent += 2; + return true; + }; + DOMWalker.prototype.prevNode = function () { + do { + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && elementNode.assignedNodes().length > 0) { + // Enter slot with assigned nodes - go to last assigned node + var slotElement = elementNode; + this.node = slotElement.assignedNodes()[slotElement.assignedNodes().length - 1]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var prevSlotIndex = this.node.slotIndex - 1; + if (prevSlotIndex >= 0) { + this.node = slotOwner.assignedNodes()[prevSlotIndex]; + this.bEndTag = true; + } + else { + this.node = slotOwner; + this.bEndTag = false; + } + } + else if (DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + } + else if (this.node.parentNode) { + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + return true; + }; + return DOMWalker; +}()); +exports.DOMWalker = DOMWalker; + + +/***/ }, + +/***/ 8601 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eGuidelineType = exports.eGuidelineCategory = exports.eToolkitLevel = void 0; +var eToolkitLevel; +(function (eToolkitLevel) { + eToolkitLevel["LEVEL_ONE"] = "1"; + eToolkitLevel["LEVEL_TWO"] = "2"; + eToolkitLevel["LEVEL_THREE"] = "3"; + eToolkitLevel["LEVEL_FOUR"] = "4"; +})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {})); +var eGuidelineCategory; +(function (eGuidelineCategory) { + eGuidelineCategory["ACCESSIBILITY"] = "Accessibility"; + eGuidelineCategory["DESIGN"] = "Design"; + eGuidelineCategory["OTHER"] = "Other"; +})(eGuidelineCategory = exports.eGuidelineCategory || (exports.eGuidelineCategory = {})); +var eGuidelineType; +(function (eGuidelineType) { + eGuidelineType["DEFAULT"] = "default"; + eGuidelineType["EXTENSION"] = "extension"; +})(eGuidelineType = exports.eGuidelineType || (exports.eGuidelineType = {})); + + +/***/ }, + +/***/ 461 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulePolicy = exports.eRuleConfidence = void 0; +var eRuleConfidence; +(function (eRuleConfidence) { + eRuleConfidence["PASS"] = "PASS"; + eRuleConfidence["FAIL"] = "FAIL"; + eRuleConfidence["POTENTIAL"] = "POTENTIAL"; + eRuleConfidence["MANUAL"] = "MANUAL"; +})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {})); +var eRulePolicy; +(function (eRulePolicy) { + eRulePolicy["VIOLATION"] = "VIOLATION"; + eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION"; + eRulePolicy["INFORMATION"] = "INFORMATION"; +})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {})); +function RulePass(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePass = RulePass; +function RuleRender(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: 0, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleRender = RuleRender; +function RuleFail(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleFail = RuleFail; +function RulePotential(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePotential = RulePotential; +function RuleManual(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleManual = RuleManual; +/** + * @deprecated See ./IGuideline + */ +var IGuideline_1 = __webpack_require__(8601); +Object.defineProperty(exports, "eToolkitLevel", ({ enumerable: true, get: function () { return IGuideline_1.eToolkitLevel; } })); +/** + * @deprecated See ./IGuideline:eGuidelineCategory + */ +var IGuideline_2 = __webpack_require__(8601); +Object.defineProperty(exports, "eRuleCategory", ({ enumerable: true, get: function () { return IGuideline_2.eGuidelineCategory; } })); +/** + * @deprecated See ./IGuideline:eGuidelineType + */ +var IGuideline_3 = __webpack_require__(8601); +Object.defineProperty(exports, "eRulesetType", ({ enumerable: true, get: function () { return IGuideline_3.eGuidelineType; } })); + + +/***/ }, + +/***/ 7412 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Checker = void 0; +var IRule_1 = __webpack_require__(461); +var Engine_1 = __webpack_require__(7301); +var ARIAMapper_1 = __webpack_require__(9955); +var rulesets_1 = __webpack_require__(6160); +var checkRulesV4 = __importStar(__webpack_require__(591)); +var IGuideline_1 = __webpack_require__(8601); +var checkRules = []; +var checkNls = {}; +var checkHelp = {}; +function _initialize() { + var langs = JSON.parse(JSON.stringify(Engine_1.Engine.getLanguages())); + // Default lang to en-US if nothing else specified is found + langs.push("en-US"); + // Process V4 rules into the V2 format + for (var rulename in checkRulesV4) { + // Convert rule + var v4Rule = checkRulesV4[rulename]; + checkRules.push(v4Rule); + // Go backwards because the first lang is the preferred, so + // earlier languages will override later languages + for (var idx = langs.length - 1; idx >= 0; --idx) { + var langId = langs[idx]; + if (langId in v4Rule.messages) { + checkNls[v4Rule.id] = v4Rule.messages[langId]; + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + if (langId in v4Rule.help) { + checkHelp[v4Rule.id] = {}; + for (var reasonId in v4Rule.help[langId]) { + checkHelp[v4Rule.id][reasonId] = "/".concat(langId, "/").concat(v4Rule.help[langId][reasonId]); + } + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + } + // Convert RS + for (var _i = 0, _a = v4Rule.rulesets; _i < _a.length; _i++) { + var rsSection = _a[_i]; + for (var _b = 0, _c = rulesets_1.a11yRulesets; _b < _c.length; _b++) { + var rs = _c[_b]; + var checkRsIds = typeof rsSection.id === "string" ? [rsSection.id] : rsSection.id; + if (checkRsIds.includes(rs.id)) { + for (var _d = 0, _e = rs.checkpoints; _d < _e.length; _d++) { + var cp = _e[_d]; + var checkCPIds = typeof rsSection.num === "string" ? [rsSection.num] : rsSection.num; + if (checkCPIds.includes(cp.num)) { + cp.rules = cp.rules || []; + cp.rules.push({ + id: v4Rule.id, + reasonCodes: rsSection.reasonCodes, + level: rsSection.level, + toolkitLevel: rsSection.toolkitLevel + }); + } + } + } + } + } + } +} +_initialize(); +var Checker = /** @class */ (function () { + function Checker() { + this.guidelines = []; + /** + * @deprecated Use getGuidelines(). + */ + this.rulesets = this.guidelines; + /** + * @deprecated Use getGuidelineIds(). + */ + this.rulesetIds = []; + this.rulesetRules = {}; + this.ruleLevels = {}; + this.ruleReasonLevels = {}; + this.ruleCategory = {}; + var engine = this.engine = new Engine_1.Engine(); + engine.addMapper(new ARIAMapper_1.ARIAMapper()); + engine.addRules(checkRules); + engine.addNlsMap(checkNls); + engine.addHelpMap(checkHelp); + for (var _i = 0, a11yRulesets_1 = rulesets_1.a11yRulesets; _i < a11yRulesets_1.length; _i++) { + var rs = a11yRulesets_1[_i]; + this.addRuleset(rs); + } + } + /** + * Adds a guideline to the engine. If the id already exists, the previous guideline will be replaced. + * @param guideline + */ + Checker.prototype.addGuideline = function (guideline) { + if (guideline.id in this.rulesetRules) { + this.removeGuideline(guideline.id); + } + this.guidelines.push(guideline); + this.rulesetIds.push(guideline.id); + var ruleIds = []; + for (var _i = 0, _a = guideline.checkpoints; _i < _a.length; _i++) { + var cp = _a[_i]; + cp.rules = cp.rules || []; + for (var _b = 0, _c = cp.rules; _b < _c.length; _b++) { + var rule = _c[_b]; + if (rule.enabled !== false) { + ruleIds.push(rule.id); + //this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {}; + //this.ruleLevels[rule.id][guideline.id] = rule.level; + this.ruleReasonLevels[rule.id] = this.ruleReasonLevels[rule.id] || {}; + this.ruleReasonLevels[rule.id][guideline.id] = this.ruleReasonLevels[rule.id][guideline.id] || {}; + var code = rule.reasonCodes ? rule.reasonCodes.join('--') : "None"; + this.ruleReasonLevels[rule.id][guideline.id][code] = rule.level; + this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {}; + this.ruleCategory[rule.id][guideline.id] = guideline.category; + } + } + } + this.rulesetRules[guideline.id] = ruleIds; + }; + /** + * Enable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.enableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled === false) { + updated = true; + delete rule.enabled; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Disable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.disableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled !== false) { + updated = true; + rule.enabled = false; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Remove a guideline from the engine + * + * Generally, there isn't a good reason to do this. Users should just not select the guideline as an option in check + * @param guidelineId + */ + Checker.prototype.removeGuideline = function (guidelineId) { + if (guidelineId in this.rulesetRules) { + delete this.rulesetRules[guidelineId]; + this.rulesets = this.guidelines = this.guidelines.filter(function (guideline) { return guideline.id !== guidelineId; }); + this.rulesetIds = this.getGuidelineIds(); + } + }; + /** + * Get the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelines = function () { + return JSON.parse(JSON.stringify(this.guidelines)); + }; + /** + * Get the ids of the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelineIds = function () { + return this.guidelines.map(function (guideline) { return guideline.id; }); + }; + /** + * + * @deprecated See addGuideline + */ + Checker.prototype.addRuleset = function (rs) { + this.addGuideline(rs); + }; + Checker.prototype.enableSourceMap = function (enable) { + this.engine.enableSourceMap(enable); + }; + Checker.prototype.isSourceMapEnabled = function () { + return this.engine.isSourceMapEnabled(); + }; + /** + * Perform a check of the specified node/document + * @param node DOMNode or Document on which to run the check + * @param guidelineIds Guideline ids to check with to specify which rules to run + * @returns + */ + Checker.prototype.check = function (node, guidelineIds) { + // Determine which rules to run + var ruleIds = []; + // Fix the input + if (!guidelineIds) { + ruleIds = this.engine.getRulesIds(); + } + else { + if (typeof guidelineIds === "string") { + guidelineIds = [guidelineIds]; + } + for (var _i = 0, guidelineIds_1 = guidelineIds; _i < guidelineIds_1.length; _i++) { + var rsId = guidelineIds_1[_i]; + if (rsId in this.rulesetRules) { + ruleIds = ruleIds.concat(this.rulesetRules[rsId]); + } + } + } + this.engine.enableRules(ruleIds); + // Add the report levels + var myThis = this; + return this.engine.run(node) + .then(function (report) { + report.nls = {}; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (result.ruleId in checkNls) { + report.nls[result.ruleId] = report.nls[result.ruleId] || { + 0: checkNls[result.ruleId][0] + }; + if (result.reasonId in checkNls[result.ruleId]) { + report.nls[result.ruleId][result.reasonId] = checkNls[result.ruleId][result.reasonId]; + } + } + //result.value[0] = myThis.getLevel(guidelineIds as string[], result.ruleId); + var code = result.reasonId ? result.reasonId : "None"; + result.value[0] = myThis.getReasonLevel(guidelineIds, result.ruleId, code); + result.category = myThis.getCategory(guidelineIds, result.ruleId); + delete result.path.css; + } + return report; + }); + }; + Checker.prototype.getLevel = function (rsIds, ruleId) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleLevels)) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) { + var rsId = rsIds_1[_i]; + if (rsId in rsInfo) { + if (rsInfo[rsId] === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (rsInfo[rsId] === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getReasonLevel = function (rsIds, ruleId, reasonCode) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleReasonLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleReasonLevels)) { + throw new Error("Rule triggered for which we have no rule level information " + ruleId); + } + var _loop_1 = function (rsId) { + if (rsId in rsInfo) { + var reCode_1 = new RegExp("(^|--)".concat(reasonCode, "($|--)")); + Object.keys(rsInfo[rsId]).forEach(function (code) { + var level = null; + if (code === 'None') + level = rsInfo[rsId]["None"]; + else if (reCode_1.test(code)) + level = rsInfo[rsId][code]; + if (level !== null) { + if (level === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (level === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }); + if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }; + for (var _i = 0, rsIds_2 = rsIds; _i < rsIds_2.length; _i++) { + var rsId = rsIds_2[_i]; + _loop_1(rsId); + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getCategory = function (rsIds, ruleId) { + var rsInfo = this.ruleCategory[ruleId]; + var retVal = ""; + if (!(ruleId in this.ruleCategory)) { + return IGuideline_1.eGuidelineCategory.OTHER; + } + if (!rsIds) { + rsIds = this.getGuidelineIds(); + } + for (var _i = 0, rsIds_3 = rsIds; _i < rsIds_3.length; _i++) { + var rsId = rsIds_3[_i]; + if (rsId in rsInfo) { + return rsInfo[rsId]; + } + } + return IGuideline_1.eGuidelineCategory.OTHER; + }; + return Checker; +}()); +exports.Checker = Checker; + + +/***/ }, + +/***/ 2297 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_target_warning = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var fragment_1 = __webpack_require__(5279); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.a_target_warning = { + id: "a_target_warning", + context: "dom:a[target],dom:area[target],dom:base[target]", + refactor: { + "WCAG20_A_TargetAndText": { + "Pass_0": "pass", + "Potential_1": "potential_warn" + } + }, + help: { + "en-US": { + "group": "a_target_warning.html", + "pass": "a_target_warning.html", + "potential_warn": "a_target_warning.html" + } + }, + messages: { + "en-US": { + "group": "Users should be warned in advance if their input action will open a new window", + "pass": "The user is warned in advance that the input action opens a new window", + "potential_warn": "Inform the user when their input action will open a new window" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.2.2", + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // skip the rule if it's AT hidden and not tabbable + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var params = { + paramWinText: { + value: ["new window", "new tab"], + type: "array" + } + }; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr == "_parent" || tStr == "_self" || tStr == "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + // Check aria-describedby for warning text + if (ruleContext.hasAttribute("aria-describedby")) { + var describedbyIds = ruleContext.getAttribute("aria-describedby").trim().split(/\s+/); + for (var _i = 0, describedbyIds_1 = describedbyIds; _i < describedbyIds_1.length; _i++) { + var id = describedbyIds_1[_i]; + var referencedElem = fragment_1.FragmentUtil.getById(ruleContext, id); + if (referencedElem) { + var describedText = CommonUtil_1.CommonUtil.getInnerText(referencedElem); + if (describedText && describedText.trim().length > 0) { + textStr += " " + describedText; + } + } + } + } + for (var i = 0; !passed && i < params.paramWinText.value.length; ++i) + if (textStr.indexOf(params.paramWinText.value[i]) != -1) + passed = true; + } + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_warn"); + } +}; + + +/***/ }, + +/***/ 4401 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_text_purpose = void 0; +var IRule_1 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var IRule_2 = __webpack_require__(461); +var AccNameUtil_1 = __webpack_require__(1950); +exports.a_text_purpose = { + id: "a_text_purpose", + // doc-biblioref is a link + context: "aria:link,aria:doc-biblioref", + refactor: { + "WCAG20_A_HasText": { + "Pass_0": "pass", + "Fail_1": "fail_acc_name" + } + }, + help: { + "en-US": { + "group": "a_text_purpose.html", + "pass": "a_text_purpose.html", + "fail_acc_name": "a_text_purpose.html" + } + }, + messages: { + "en-US": { + "group": "Hyperlinks must have an accessible name for their purpose", + "pass": "Hyperlink has a description of its purpose", + "fail_acc_name": "Hyperlink has no link text, label or image with a text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["2.4.4", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: "c487ae", + run: function (context, options) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Rule only passes if an element has inner content, + // in the case that there is only hidden content under the the element it is a violation + var accName_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = (accName_pair && accName_pair.name && accName_pair.name.trim().length > 0) + /**ARIAMapper.computeName(ruleContext).trim().length > 0*/ + || CommonUtil_1.CommonUtil.nonTabableChildCheck(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_acc_name"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 4546 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.applet_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.applet_alt_exists = { + id: "applet_alt_exists", + context: "dom:applet", + refactor: { + "WCAG20_Applet_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "applet_alt_exists.html", + "Pass_0": "applet_alt_exists.html", + "Fail_1": "applet_alt_exists.html", + "Fail_2": "applet_alt_exists.html", + "Fail_3": "applet_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<applet> elements must provide an 'alt' attribute and an alternative description", + "Pass_0": "Rule Passed", + "Fail_1": "An <applet> element does not have an 'alt' attribute that provides a short text alternative", + "Fail_2": "The 'alt' attribute value for an <applet> element duplicates the 'code' attribute", + "Fail_3": "An <applet> element provides alternative text, but does not provide inner content" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + var alt = ruleContext.getAttribute("alt").trim(); + if (ruleContext.hasAttribute("code") && alt == ruleContext.getAttribute("code").trim()) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ 9292 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.application_content_accessible = void 0; +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.application_content_accessible = { + id: "application_content_accessible", + context: "aria:application", + refactor: { + "HAAC_Application_Role_Text": { + 0: "HAAC_Application_Role_Text.html", + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + 0: "application_content_accessible.html", + "Pass_0": "application_content_accessible.html", + "Potential_1": "application_content_accessible.html" + } + }, + messages: { + "en-US": { + "group": "Non-decorative static text and image content within an element with \"application\" role must be accessible", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the non-decorative static text and image content within an element with \"application\" role are accessible" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.1.1", "2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var children = ruleContext.childNodes; + for (var i = 0; passed && i < children.length; i++) { + if (children[i].nodeType === 1) { + if (VisUtil_1.VisUtil.isNodeVisible(children[i])) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "document") || AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "article"); + } + } + else if (children[i].nodeType === 3) { + passed = children[i].nodeValue.trim().length === 0; + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 9605 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.area_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.area_alt_exists = { + id: "area_alt_exists", + context: "dom:area", + refactor: { + "WCAG20_Area_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "area_alt_exists.html", + "Pass_0": "area_alt_exists.html", + "Fail_1": "area_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<area> elements in an image map must have a text alternative", + "Pass_0": "Rule Passed", + "Fail_1": "<area> element in an image map has no text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ 3987 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_accessiblename_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +var AccNameUtil_1 = __webpack_require__(1950); +var ARIADefinitions_1 = __webpack_require__(9910); +exports.aria_accessiblename_exists = { + id: "aria_accessiblename_exists", + context: "aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example", + help: { + "en-US": { + "pass": "aria_accessiblename_exists.html", + "fail_no_accessible_name": "aria_accessiblename_exists.html", + "fail_no_accessible_name_image": "aria_accessiblename_exists.html", + "group": "aria_accessiblename_exists.html" + } + }, + messages: { + "en-US": { + "pass": "An accessible name is provided for the element", + "fail_no_accessible_name": "Element <{0}> with \"{1}\" role has no accessible name", + "fail_no_accessible_name_image": "Element <{0}> with \"{1}\" role has no accessible name", + "group": "Elements with certain roles should have accessible names" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name_image"] + }], + act: [{ "23a2a8": { "fail_no_accessible_name_image": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg element is handled in svg_graphics_labbelled rule and image rules + if (nodeName === 'svg' || nodeName === 'img') + return; + // when table element with a caption as first child + if (nodeName === 'table' + && ruleContext.firstElementChild && ruleContext.firstElementChild.nodeName.toLowerCase() === 'caption' + && ruleContext.firstElementChild.textContent && ruleContext.firstElementChild.textContent.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (invalidRoles && invalidRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role || !ARIADefinitions_1.ARIADefinitions.designPatterns[role] || !ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameRequired) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!name_pair || !name_pair.name || name_pair.name.trim().length === 0) { + if (role === 'img' || role === 'image') + return (0, IRule_1.RuleFail)("fail_no_accessible_name_image", [ruleContext.nodeName.toLowerCase(), role]); + return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), role]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ 8631 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_tabindex_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.aria_activedescendant_tabindex_valid = { + id: "aria_activedescendant_tabindex_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "Rpt_Aria_InvalidTabindexForActivedescendant": { + "pass": "pass", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "pass": "aria_activedescendant_tabindex_valid.html", + "Fail_1": "aria_activedescendant_tabindex_valid.html", + "group": "aria_activedescendant_tabindex_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "Fail_1": "The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable", + "group": "Element using 'aria-activedescendant' property should be tabbable" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Rule not supported on mobile + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + // Handle the case where the element is hidden by a disabled HTML5 attribute or aria-disabled: + // 1. In the case that this element has a disabled attribute and the element supports it, we mark this rule as passed. + // 2. In the case that this element has an aria-disabled attribute then, we mark this rule as passed. + // For both of the cases above we do not need to perform any further checks, as the element is disabled in some form or another. + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + //ignore if the attribute 'aria-activedescendant' is blank + if (ruleContext.getAttribute("aria-activedescendant").trim().length === 0) + return; + // If the tabindex attribute is provided then verify that it is 0 or -1 + passed = CommonUtil_1.CommonUtil.isTabbable(ruleContext); + // pass if one of the children is tabbable. in this case, the tab will stop on the first tabbable element + if (!passed) + passed = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext) > 0; + // Build array for node token + var retToken1 = new Array(); + retToken1.push(nodeName); + // Build array for id referenced by aria-activedescendant + var retToken2 = new Array(); + retToken2.push(ruleContext.getAttribute("aria-activedescendant").split(" ").join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 8025 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +var VisUtil_1 = __webpack_require__(3946); +var DOMUtil_1 = __webpack_require__(1686); +exports.aria_activedescendant_valid = { + id: "aria_activedescendant_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "HAAC_ActiveDescendantCheck": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + // "Fail_4": "Fail_4" + } + }, + help: { + "en-US": { + "Pass_0": "aria_activedescendant_valid.html", + "Fail_1": "aria_activedescendant_valid.html", + "Fail_2": "aria_activedescendant_valid.html", + "Fail_3": "aria_activedescendant_valid.html", + // "Fail_4": "aria_activedescendant_valid.html", + "group": "aria_activedescendant_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'aria-activedescendant' property is empty", + "Fail_2": "The 'aria-activedescendant' property references a hidden node", + "Fail_3": "Element is not a combobox, and the referenced active-descendant element is not a valid descendant", + // "Fail_4": "Element is a combobox, and the referenced active-descendant element is not controlled by this component", + "group": "The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // combobox active descendants handled by 'combobox_active_descendant' + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")) { + return null; + } + var descendant_id = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-activedescendant"); + // POF1: The attribute is empty + if (!descendant_id || descendant_id.trim() === "") { + return (0, IRule_1.RuleFail)("Fail_1"); + } + var descendant = fragment_1.FragmentUtil.getById(ruleContext, descendant_id.trim()); + if (!descendant || DOMUtil_1.DOMUtil.sameNode(descendant_id, ruleContext)) { + // The referenced element doesn't exist. We let 1077 to trigger the error + return null; + } + if (!VisUtil_1.VisUtil.isNodeVisible(descendant)) { + // POF2: aria-activedescendant references a hidden node + return (0, IRule_1.RuleFail)("Fail_2"); + } + // 1. The value of aria-activedescendant refers to an element that is either a descendant of + // the element with DOM focus + if (ruleContext.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var pofId = 2; + // or is a logical descendant as indicated by the aria-owns attribute. + if (ruleContext.hasAttribute("aria-owns")) { + var owned_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-owns").trim()).split(" "); + for (var i = 0; i < owned_ids.length; i++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owned_ids[i]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + // 2. The element with DOM focus is a textbox with aria-controls referring to an element that + // supports aria-activedescendant, and the value of aria-activedescendant specified for the + // textbox refers to either a descendant of the element controlled by the textbox or is a logical + // descendant of that controlled element as indicated by the aria-owns attribute. + // + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") && ruleContext.hasAttribute("aria-controls")) { + pofId = 3; + var controlled_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-controls").trim()).split(" "); + for (var i = 0; i < controlled_ids.length; i++) { + var controlled_ele = fragment_1.FragmentUtil.getById(ruleContext, controlled_ids[i]); + if (controlled_ele && !DOMUtil_1.DOMUtil.sameNode(controlled_ele, ruleContext) && controlled_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + if (controlled_ele.hasAttribute("aria-owns")) { + var owns_ids = CommonUtil_1.CommonUtil.normalizeSpacing(controlled_ele.getAttribute("aria-owns").trim()).split(" "); + for (var j = 0; j < owns_ids.length; j++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owns_ids[j]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + } + } + // POF3: I'm not a combobox, and the referenced active-descendant is not a descendant and not owned by the element + // that referenced it. + if (pofId == 3) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + return null; + } +}; + + +/***/ }, + +/***/ 1198 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_application_label_unique = { + id: "aria_application_label_unique", + context: "aria:application", + refactor: { + "Rpt_Aria_MultipleApplicationLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_application_label_unique.html", + "fail_label_not_unique": "aria_application_label_unique.html", + "group": "aria_application_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"application\" role do not have unique labels", + "group": "Each element with \"application\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "application"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 8001 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AccNameUtil_1 = __webpack_require__(1950); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_application_labelled = { + id: "aria_application_labelled", + context: "aria:application", + refactor: { + "Rpt_Aria_ApplicationLandmarkLabel": { + "Pass_0": "pass", + "Fail_1": "fail_no_label" + } + }, + help: { + "en-US": { + "pass": "aria_application_labelled.html", + "fail_no_label": "aria_application_labelled.html", + "group": "aria_application_labelled.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a label that describes its purpose", + "fail_no_label": "Element with \"application\" role does not have a label", + "group": "Each element with \"application\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!pair) { + return (0, IRule_1.RuleFail)("fail_no_label"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 5778 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_article_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_article_label_unique = { + id: "aria_article_label_unique", + context: "aria:article", + refactor: { + "Rpt_Aria_MultipleArticleRoles_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_article_label_unique.html", + "fail_label_not_unique": "aria_article_label_unique.html", + "group": "aria_article_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"article\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"article\" role do not have unique labels", + "group": "Each element with \"article\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "article"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 8118 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_allowed = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var ARIADefinitions_1 = __webpack_require__(9910); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_attribute_allowed = { + id: "aria_attribute_allowed", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidProperty": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_allowed.html", + "Pass_0": "aria_attribute_allowed.html", + "Fail_1": "aria_attribute_allowed.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes must be valid for the element's role", + "Pass_0": "Rule Passed", + "Fail_1": "The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "5f99a7", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var contextAttributes = ruleContext.attributes; + // This gets all elements with attributes so we still have some + // Out of Scope since not all attributes are aria + if (contextAttributes) { + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var failedProperties = ""; + var testedProperties = 0; + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + testedProperties++; + // Now we just have aria attributes which can + // pass or fail based on whether there property is valid + var dataTypes = propertyDataTypes[attrName]; + if (!dataTypes) { // if property is not in valid property list + // create failedProperties comma sep list + if (failedProperties.length == 0) { + failedProperties = attrName; + } + else { + failedProperties = failedProperties + ", " + attrName; + } + } + } + } + if (testedProperties == 0) { + return null; + } + else if (failedProperties.length != 0) { + return (0, IRule_1.RuleFail)("Fail_1", [failedProperties, ruleContext.nodeName.toLowerCase()]); + } + else { + //return RulePass(1); + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + // JCH - passing is based on all attributes not just aria attributes + // leading to OVER COUNTING so moved pass up + //return RulePass(1); + } +}; + + +/***/ }, + +/***/ 2242 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_conflict = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.aria_attribute_conflict = { + id: "aria_attribute_conflict", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + // "pass": "aria_attribute_conflict.html", + "fail_conflict": "aria_attribute_conflict.html", + "group": "aria_attribute_conflict.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA attribute is not conflict with the corresponding HTML attribute", + "fail_conflict": "The ARIA attribute \"{0}\" is in conflict with the corresponding HTML attribute \"{1}\"", + "group": "An ARIA attribute must not conflict with the corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + var ret = []; + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (!ariaAttributes || ariaAttributes.length === 0) + return null; + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + for (var i = 0; i < conflictAttributes.length; i++) { + ret.push((0, IRule_1.RuleFail)("fail_conflict", [conflictAttributes[i]['ariaAttr'], conflictAttributes[i]['htmlAttr']])); + if (ariaAttributes.includes(conflictAttributes[i]['ariaAttr'])) + CommonUtil_1.CommonUtil.reduceArrayItemList([conflictAttributes[i]['ariaAttr']], ariaAttributes); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ 3673 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_attribute_deprecated = { + id: "aria_attribute_deprecated", + context: "dom:*", + help: { + "en-US": { + // "pass": "aria_attribute_deprecated.html", + "fail_aria_role": "aria_attribute_deprecated.html", + "fail_aria_attr": "aria_attribute_deprecated.html", + "fail_role_attr": "aria_attribute_deprecated.html", + "group": "aria_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA roles and attribute are used per specification", + "fail_aria_role": "The ARIA role \"{0}\" is deprecated in the ARIA specification", + "fail_aria_attr": "The ARIA attributes \"{0}\" are deprecated in the ARIA specification", + "fail_role_attr": "The ARIA attributes \"{0}\" are deprecated for the role \"{1}\" in the ARIA specification", + "group": "No deprecated ARIA role or attribute should be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var ret = []; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) { + for (var i = 0; i < deprecatedRoles.length; i++) + ret.push((0, IRule_1.RuleFail)('fail_aria_role', [deprecatedRoles[i]])); + } + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) { + for (var i = 0; i < deprecatedAttributes.length; i++) { + // "role":"any", "attribute":ariaAttrs[i]} + if (deprecatedAttributes[i].role === 'any') + ret.push((0, IRule_1.RuleFail)('fail_aria_attr', [deprecatedAttributes[i].attribute])); + else + ret.push((0, IRule_1.RuleFail)('fail_role_attr', [deprecatedAttributes[i].attribute, deprecatedAttributes[i].role])); + } + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ 5080 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIADefinitions_1 = __webpack_require__(9910); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_attribute_exists = { + id: "aria_attribute_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_EmptyPropertyValue": { + "pass": "pass", + "fail_empty_attribute": "fail_empty_attribute" + } + }, + help: { + "en-US": { + "pass": "aria_attribute_exists.html", + "fail_empty_attribute": "aria_attribute_exists.html", + "group": "aria_attribute_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_empty_attribute": "The element attribute(s): '{0}' value is empty", + "group": "When specifying a required ARIA attribute, the value must not be empty" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return; + var attrNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedProperties = 0; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + if (designPatterns[role] && AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext) != null) { + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + for (var i = 0, length_1 = requiredRoleProps.length; i < length_1; i++) { + var attribute = requiredRoleProps[i]; + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(requiredRoleProps[i])); + if (nodeValue.length == 0) + attrNameArr.push(requiredRoleProps[i]); + } + else if (requiredRoleProps[i] == "aria-labelledby") { + if ((role == "radiogroup") && (hasAttribute(ruleContext, "aria-label"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-label")); + if (nodeValue.length == 0) + attrNameArr.push("aria-label"); + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((role == "progressbar") && (hasAttribute(ruleContext, "aria-valuetext"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-valuetext")); + if (nodeValue.length == 0) + attrNameArr.push("aria-valuetext"); + } + } + } + } + if (designPatterns[role]) { + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var permittedRoles = []; + permittedRoles.push(role); + var allowedAttributes = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, permittedRoles, tagProperty); + for (var i = 0, length_2 = allowedAttributes.length; i < length_2; i++) { + var attribute = allowedAttributes[i]; + if (attribute == "aria-checked" || attribute == "aria-selected" || + attribute == "aria-expanded" || attribute == "aria-orientation" || + attribute == "aria-level") { + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(attribute)); + if (nodeValue.length == 0 && !attrNameArr.includes(attribute)) { + attrNameArr.push(attribute); + } + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(attrNameArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedProperties == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_empty_attribute", retMsg); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 183 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_redundant = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_attribute_redundant = { + id: "aria_attribute_redundant", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + "pass": "aria_attribute_redundant.html", + "fail_redundant": "aria_attribute_redundant.html", + "group": "aria_attribute_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "The ARIA attribute is not redundant with a corresponding HTML attribute", + "fail_redundant": "The ARIA attribute \"{0}\" is redundant with the HTML attribute \"{1}\"", + "group": "An ARIA attribute should not be redundant with a corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + // if conflict already reported, ignore reporting overlap + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + if (conflictAttributes && conflictAttributes.length > 0) + return null; + var domAttributes = ruleContext.attributes; + var ariaAttrs = []; + var htmlAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = ruleContext.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push({ name: attrName, value: attrValue }); + else + htmlAttrs.push({ name: attrName, value: attrValue }); + } + } + var ret = []; + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil_1.AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'overlapping'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Pass') { //pass + ret.push((0, IRule_1.RulePass)("pass")); + } + else if (item['result'] === 'Failed') { //failed + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaAttrs[i]['name'], item['attr']])); + } + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ 6805 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_required = void 0; +var ARIADefinitions_1 = __webpack_require__(9910); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.aria_attribute_required = { + id: "aria_attribute_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredProperties": { + "Pass_0": "pass", + "Fail_1": "fail_missing" + } + }, + help: { + "en-US": { + "group": "aria_attribute_required.html", + "pass": "aria_attribute_required.html", + "fail_missing": "aria_attribute_required.html" + } + }, + messages: { + "en-US": { + "group": "The required attributes for the element with a role must be defined", + "pass": "The required attributes for the element with the role are defined", + "fail_missing": "Element with '{0}' role does not have the required ARIA attribute(s): '{1}'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "4e8ab6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var attrNameArr = new Array(); + var roleNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let implicitRole = ARIAMapper.elemToImplicitRole(ruleContext); + //let implicitRole = AriaUtil.getImplicitRole(ruleContext); + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedRoles = 0; + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + if (designPatterns[role] && requiredRoleProps !== null) { + var allowedRoleProps = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, role, tagProperty); + var roleMissingReqProp = false; + for (var i = 0, propertiesLength = requiredRoleProps.length; i < propertiesLength; i++) { + if (!allowedRoleProps.includes(requiredRoleProps[i])) + continue; + if (!hasAttribute(ruleContext, requiredRoleProps[i])) { + // If an aria-labelledby isn't present, an aria-label will meet the requirement. + if (requiredRoleProps[i] == "aria-labelledby") { + if ((!hasAttribute(ruleContext, "aria-label")) || (role != "radiogroup")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((!hasAttribute(ruleContext, "aria-valuetext")) || (role != "progressbar")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-controls" && role == "combobox") { + // Skip this check since aria-controls in the textbox of a combobox is already handled in rule HAAC_Combobox_Must_have_Text_Input + } + else { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + } + if (roleMissingReqProp == true) { + roleNameArr.push(role); + } + } + var passed = roleNameArr.length == 0 || attrNameArr.length == 0; // only aria attributes so NO OUT OF SCOPE + if (!passed) { + var retToken = new Array(); + retToken.push(roleNameArr.join(", ")); + retToken.push(attrNameArr.join(", ")); + return (0, IRule_1.RuleFail)("fail_missing", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 1886 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_value_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIADefinitions_1 = __webpack_require__(9910); +exports.aria_attribute_value_valid = { + id: "aria_attribute_value_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "Rpt_Aria_ValidPropertyValue": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_value_valid.html", + "Pass_0": "aria_attribute_value_valid.html", + "Fail_1": "aria_attribute_value_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA property values must be valid", + "Pass_0": "Rule Passed", + "Fail_1": "The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "6a7281", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var valueArr = new Array(); + var attrNameArr = new Array(); + var dataTypeArr = new Array(); + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var contextAttributes = ruleContext.attributes; + var testedPropertyValues = 0; + if (contextAttributes) { + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = propertyDataTypes[attrName]; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue); + testedPropertyValues++; + if (dataTypes && dataTypes.values) { + if (dataTypes.values.indexOf(nodeValue) == -1) { + if (dataTypes.values.indexOf('undefined') != -1 && nodeValue.length == 0) { + //translate 'undefined' to mean '' + } + else { + // aria-relevant is represented as a space delimited list of the following values: + // additions, removals, text; or a single catch-all value all. + if (dataTypes.type === "http://www.w3.org/2001/XMLSchema#nmtokens") { + var attrValues = contextAttributes[i].nodeValue.trim().split(" "); + // if the value all is specified, it cannot have any other value + if (attrValues.length > 1 && attrValues.includes("all")) { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + else { + var hash = {}; + for (var j = 0; j < attrValues.length; j++) { + // if the individual value is not in the list of allowed values + if (attrValues[j] != "" && !dataTypes.values.includes(attrValues[j])) { + if (!hash.hasOwnProperty(attrName)) { + hash[attrName] = true; + attrNameArr.push(attrName); + } + valueArr.push(attrValues[j]); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else if (dataTypes && dataTypes.type && dataTypes.type === "http://www.w3.org/2001/XMLSchema#int") { + var iVal = parseInt(nodeValue); + if (isNaN(iVal) || ("" + iVal !== nodeValue)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && dataTypes.type == "http://www.w3.org/2001/XMLSchema#decimal") { + var fVal = parseFloat(nodeValue); + if (isNaN(fVal)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#boolean")) { + var tmpV = nodeValue.trim().toLowerCase(); + if (tmpV !== "true" && tmpV !== "false") { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#string")) { + } + else { + testedPropertyValues--; + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(valueArr.join(", ")); + retMsg.push(attrNameArr.join(", ")); + retMsg.push(ruleContext.nodeName.toLowerCase()); + // retMsg.push (dataTypeArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedPropertyValues == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", retMsg); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 4078 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_banner_label_unique = { + id: "aria_banner_label_unique", + context: "aria:banner", + refactor: { + "Rpt_Aria_MultipleBannerLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_banner_label_unique.html", + "fail_label_not_unique": "aria_banner_label_unique.html", + "group": "aria_banner_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"banner\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"banner\" role do not have unique labels", + "group": "Each element with \"banner\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "banner", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 5750 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_single = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_banner_single = { + id: "aria_banner_single", + context: "dom:*[role], dom:header", + refactor: { + "Rpt_Aria_OneBannerInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_banner_single.html", + "Fail_1": "aria_banner_single.html", + "group": "aria_banner_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"banner\" role found on the page", + "group": "A page, document, or application should only have one element with \"banner\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "banner")) { + return null; + } + var passed = AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "banner", true, true) === null; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ 85 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_tabbable = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIADefinitions_1 = __webpack_require__(9910); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_child_tabbable = { + id: "aria_child_tabbable", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingFocusableChild": { + "pass": "pass", + "fail_missing_child": "fail_missing_child" + } + }, + help: { + "en-US": { + "pass": "aria_child_tabbable.html", + "fail_missing_child": "aria_child_tabbable.html", + "group": "aria_child_tabbable.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_missing_child": "None of the descendent elements with \"{1}\" role is tabbable", + "group": "UI component must have at least one tabbable descendant for keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) || AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + // An ARIA list is not interactive + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, { "list": true, "row": true, "rowgroup": true, "table": true, "grid": true })) { + return null; + } + // Not a valid message for mobile because all elements are focusable in iOS when VoiceOver is enabled. + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + //ignore datalist element check since it will be part of a input element or hidden by default + if (ruleContext.nodeName.toLowerCase() === 'datalist') + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + var passed = true; + var doc = ruleContext.ownerDocument; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + var nodeName = ""; + var inScope = false; + if (ARIADefinitions_1.ARIADefinitions.containers.includes(role)) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (disabled != 'true' && !hasAttribute(ruleContext, 'aria-activedescendant') && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqChildren; + if (reqChildren) { + inScope = true; + passed = false; + var xp = "descendant::*["; + for (var i = 0; i < reqChildren.length; i++) { + xp += "@role='" + reqChildren[i] + "' or "; + } + xp = xp.substring(0, xp.length - 4) + ']'; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + r = xpathResult.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + // Required child is not focusable via tabindex. See if there is a grandchild that is focusable by default or by tabindex. + if (!passed) { + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + roleNameArr = r.getAttribute("role").trim().split(" "); + nodeName = r.nodeName.toLowerCase(); + } + r = xpathResult.iterateNext(); + } + } + } + } + // Variable Decleration + var retToken1 = new Array(); + var retToken2 = new Array(); + // In the case the arrays/strings are empty, that means that there is no violation so we can reset it back to passed, the reason for this + // is that we are setting passed=false while we perform a loop which causes violation to trigger even if there is no issues. Instead of + // updating the whole rule to switch from using passed in that way simply do the check at this point. + if (nodeName.length > 0 && roleNameArr.length > 0) { + retToken1.push(nodeName); + retToken2.push(roleNameArr.join(", ")); + } + else { + passed = true; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', passed == true ? [] : [retToken1, retToken2]); + if (!inScope) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_missing_child", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 514 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_child_valid = { + id: "aria_child_valid", + //context: "dom:*[role]", + //dependencies: ["Rpt_Aria_ValidRole"], + context: "dom:*", + dependencies: ["aria_role_valid", "aria_descendant_valid"], + help: { + "en-US": { + "group": "aria_child_valid.html", + "Pass": "aria_child_valid.html", + "Fail_no_child": "aria_child_valid.html", + "Fail_invalid_child": "aria_child_valid.html" + } + }, + messages: { + "en-US": { + "group": "An element with an ARIA role must own a required child", + "Pass": "An element with an ARIA role owns a required child", + "Fail_no_child": "The element with role \"{0}\" does not own any child element with any of the following role(s): \"{1}\"", + "Fail_invalid_child": "The element with role \"{0}\" owns the child element with the role \"{1}\" that is not one of the allowed role(s): \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Verify mapping + act: ["bc4a75"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // ignore if the element contains none or presentation role + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + // For combobox, we have g1193 ... g1199 to check the values etc. + // We don't want to trigger 1152 again. So, we bypass it here. + if (roles.includes("combobox")) + return null; + var requiredChildRoles = AriaUtil_1.AriaUtil.getRequiredChildRoles(ruleContext, true); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (requiredChildRoles.includes('group')) { + var index = requiredChildRoles.indexOf('group'); + if (index > -1) + requiredChildRoles.splice(index, 1); + } + /** + * ignore if a role doesn't require a child with any specific role + * the reverse might be not true - parent will be checked in Rpt_Aria_RequiredParent_Native_Host_Sematics rule + */ + if (requiredChildRoles.length == 0) + return null; + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (!directATChildren || directATChildren.length == 0) { + // the element with at least one required role dosen't contain any accessible child + /** + * When a widget is missing required owned elements due to script execution or loading, + * authors MUST mark a containing element with 'aria-busy' equal to true. + */ + var busy = ruleContext.getAttribute("aria-busy"); + if (!busy || busy !== 'true') { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(requiredChildRoles.join(", ")); + return (0, IRule_1.RuleFail)("Fail_no_child", retToken); + } + // it's 'busy' loading, ignore it + return null; + } + var violateElemRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + // if explicit role doesn't exist, get the implicit one + if (!childRoles || childRoles.length == 0) + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + if (childRoles && childRoles.length > 0) { + /** + * when multiple roles are specified as required owned elements for a role, at least one instance of one required owned element is expected. + * the specification does not require an instance of each of the listed owned roles. + * therefore, the requirement is met if it has any one of the required roles. + */ + var found_1 = childRoles.some(function (r) { return requiredChildRoles.includes(r); }); + if (!found_1) + violateElemRoles.push(childRoles.join(", ")); + } + else { + // ignore the element since it's not semantic, shouldn't happen + } + } + if (violateElemRoles.length > 0) { + var retValues = []; + for (var i = 0; i < violateElemRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(violateElemRoles[i]); + retToken.push(requiredChildRoles.join(", ")); + retValues.push((0, IRule_1.RuleFail)("Fail_invalid_child", retToken)); + } + return retValues; + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ 5310 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_complementary_label_unique = { + id: "aria_complementary_label_unique", + context: "aria:complementary", + refactor: { + "Rpt_Aria_MultipleComplementaryLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_complementary_label_unique.html", + "fail_label_not_unique": "aria_complementary_label_unique.html", + "group": "aria_complementary_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"complementary\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"complementary\" role do not have unique labels", + "group": "Each element with \"complementary\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "complementary"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 9083 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_visible = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_complementary_label_visible = { + id: "aria_complementary_label_visible", + context: "dom:*[role], dom:aside", + dependencies: ["aria_complementary_labelled"], + refactor: { + "Rpt_Aria_ComplementaryLandmarkLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_label_visible.html", + "Fail_1": "aria_complementary_label_visible.html", + "group": "aria_complementary_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a visible label", + "group": "Each element with \"complementary\" role should have a visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "complementary")) { + return null; + } + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby"); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ 6049 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AccNameUtil_1 = __webpack_require__(1950); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_complementary_labelled = { + id: "aria_complementary_labelled", + context: "aria:complementary", + refactor: { + "Rpt_Aria_ComplementaryRequiredLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_labelled.html", + "Fail_1": "aria_complementary_labelled.html", + "group": "aria_complementary_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a label", + "group": "Each element with \"complementary\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ 5099 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_content_in_landmark = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var CacheUtil_1 = __webpack_require__(4566); +var DOMWalker_1 = __webpack_require__(3864); +var VisUtil_1 = __webpack_require__(3946); +var TableUtil_1 = __webpack_require__(9196); +exports.aria_content_in_landmark = { + id: "aria_content_in_landmark", + context: "dom:*", + refactor: { + "Rpt_Aria_OrphanedContent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_content_in_landmark.html", + "Fail_1": "aria_content_in_landmark.html", + "group": "aria_content_in_landmark.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Content is not within a landmark element", + "group": "All content must reside within an element with a landmark role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var params = CacheUtil_1.CacheUtil.getCache(context.dom.node.ownerDocument, "aria_content_in_landmark", null); + if (!params) { + params = { + landmarks: { + value: ["banner", "complementary", "contentinfo", "form", "main", "navigation", "region", "search"], + type: "array" + }, + possibleOrphanedWidgets: { + value: ["button", "combobox", "checkbox", "grid", "heading", "link", "list", + "listbox", "menu", "menubar", "progressbar", "radio", "tablist", "textbox", "toolbar", "tree", + "treegrid" + ], + type: "array" + }, + possibleOrphanedElements: { + value: ["p", "table", "input", "textarea", "select", "button", "a", "ol", "ul", "dl", "h1", "h2", "h3", "h4", "h5", + "h6", "embed", "object", "area" + ], + type: "array" + }, + noLandmarkedRoles: { + // These roles don't require landmarks + value: ["alert", "alertdialog", "dialog", "tooltip"], + type: "array" + }, + mapLandmarks: {}, + mapPossibleOrphanedWidgets: {}, + mapPossibleOrphanedElements: {}, + mapNoLandmarkedRoles: {} + }; + // Convert arrays to maps + params.mapLandmarks = {}; + for (var i = 0; i < params.landmarks.value.length; ++i) { + params.mapLandmarks[params.landmarks.value[i]] = true; + } + params.mapPossibleOrphanedWidgets = {}; + for (var i = 0; i < params.possibleOrphanedWidgets.value.length; ++i) { + params.mapPossibleOrphanedWidgets[params.possibleOrphanedWidgets.value[i]] = true; + } + params.mapPossibleOrphanedElements = {}; + for (var i = 0; i < params.possibleOrphanedElements.value.length; ++i) { + params.mapPossibleOrphanedElements[params.possibleOrphanedElements.value[i]] = true; + } + params.mapNoLandmarkedRoles = {}; + for (var i = 0; i < params.noLandmarkedRoles.value.length; ++i) { + params.mapNoLandmarkedRoles[params.noLandmarkedRoles.value[i]] = true; + } + CacheUtil_1.CacheUtil.setCache(context.dom.node.ownerDocument, "aria_content_in_landmark", params); + } + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || // avoid diagnosing g1157 for non-visible nodes + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var elemsWithoutContent = ["area", "input", "embed", "button", "textarea", "select"]; + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext) && //only trigger the rule on elements that have content + elemsWithoutContent.indexOf(nodeName) === -1) { // a few elems wihout content should not be skipped + return (0, IRule_1.RulePass)("Pass_0"); + } + // Short circuit for layout tables + if (nodeName == "table" && TableUtil_1.TableUtil.isLayoutTable(ruleContext)) { + return null; + } + // Check if it is a possible orphan + var passed = true; + var isPossibleOrphanedWidget = AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapPossibleOrphanedWidgets, true); + //exclude <link rel="stylesheet" href="xyz.css"> in the <head> and <body>(#608) + //having link in the head could cause lot of violaions + if (nodeName === 'link') { + isPossibleOrphanedWidget = false; + } + var isPossibleOrphanedElement = nodeName in params.mapPossibleOrphanedElements; + if (isPossibleOrphanedWidget || isPossibleOrphanedElement) { + // See if ancestor has landmark roles or implicit land mark roles + var parentRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + passed = parentRoles.filter(function (role) { return role in params.mapLandmarks; }).length > 0; + if (!passed) { + // Don't fail elements when a parent or sibling has failed - causes too many messages. + var walkElement = DOMWalker_1.DOMWalker.parentElement(ruleContext); + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = DOMWalker_1.DOMWalker.parentElement(walkElement); + } + walkElement = ruleContext.nextElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.nextElementSibling; + } + walkElement = ruleContext.previousElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.previousElementSibling; + } + if (!passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent", true); + // Don't trigger rule if element is a stand-alone widget + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", false) || + AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapNoLandmarkedRoles, true) || + AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, params.mapNoLandmarkedRoles, true); + if (passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", true); + return null; + } + } + else { + return null; + } + } + } + else { + return null; + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 2759 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_contentinfo_label_unique = { + id: "aria_contentinfo_label_unique", + context: "aria:contentinfo", + refactor: { + "Rpt_Aria_MultipleContentinfoLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_contentinfo_label_unique.html", + "fail_label_not_unique": "aria_contentinfo_label_unique.html", + "group": "aria_contentinfo_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"contentinfo\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"contentinfo\" role do not have unique labels", + "group": "Each element with \"contentinfo\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "contentinfo", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 3141 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_contentinfo_misuse = { + id: "aria_contentinfo_misuse", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_ContentinfoWithNoMain_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_misuse.html", + "Fail_1": "aria_contentinfo_misuse.html", + "group": "aria_contentinfo_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"contentinfo\" role is present without an element with \"main\" role", + "group": "Each element with \"contentinfo\" role is only permitted with an element with \"main\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //consider implicit role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + // Consider the Check Hidden Content setting that is set by the rules + var passed = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true).length > 0; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 5131 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_single = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_contentinfo_single = { + id: "aria_contentinfo_single", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_single.html", + "Fail_1": "aria_contentinfo_single.html", + "group": "aria_contentinfo_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"contentinfo\" role found on the page", + "group": "A page, document, or application should only have one element with \"contentinfo\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //find out if <footer> element has siblings as <footer> has implicit contentinfo role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + var passed = !AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "contentinfo", true, true); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 5167 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_descendant_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_descendant_valid = { + id: "aria_descendant_valid", + context: "dom:*", + dependencies: ["aria_role_valid"], + help: { + "en-US": { + "group": "aria_descendant_valid.html", + "pass": "aria_descendant_valid.html", + "potential_child_implicit_role": "aria_descendant_valid.html", + "recommendation_no_impact_role": "aria_descendant_valid.html", + "fail_child_explicit_role": "aria_descendant_valid.html" + } + }, + messages: { + "en-US": { + "group": "Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements", + "pass": "The element contains valid descendants", + "potential_child_implicit_role": "The element with role \"{0}\" contains descendants with implicit roles \"{1}\" which are ignored by browsers", + "recommendation_no_impact_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers", + "fail_child_explicit_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["pass", "potential_child_implicit_role", "fail_child_explicit_role"] + }, { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["recommendation_no_impact_role"] + }], + // TODO: ACT: Verify mapping + act: ["307n5z"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element doesn't require presentational children only + if (!AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // let tagName = ruleContext.tagName.toLowerCase(); + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (directATChildren && directATChildren.length > 0) { + // the element with at least one non-presentational children + var explicitRoles = new Array(); + var implicitRoles = new Array(); + var noImpactRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + // ignore <img> and <svg> + var tag = directATChildren[j].nodeName.toLowerCase(); + if (tag === 'img' || tag === 'svg') + continue; + // get explicit role if exists + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + if (childRoles && childRoles.length > 0) { + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + explicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + else { + // get implicit role if exists + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + if (childRoles && childRoles.length > 0) + implicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + } + if (explicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < explicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(explicitRoles[i]); + retValues.push((0, IRule_1.RuleFail)("fail_child_explicit_role", retToken)); + } + return retValues; + } + if (implicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < implicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(implicitRoles[i]); + retValues.push((0, IRule_1.RulePotential)("potential_child_implicit_role", retToken)); + } + return retValues; + } + if (noImpactRoles.length > 0) { + var retValues = []; + for (var i = 0; i < noImpactRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(noImpactRoles[i]); + retValues.push((0, IRule_1.RulePotential)("recommendation_no_impact_role", retToken)); + } + return retValues; + } + } + else + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ 8115 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_document_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_document_label_unique = { + id: "aria_document_label_unique", + context: "aria:document", + refactor: { + "Rpt_Aria_MultipleDocumentRoles": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_document_label_unique.html", + "fail_label_not_unique": "aria_document_label_unique.html", + "group": "aria_document_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"document\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"document\" roles do not have unique labels", + "group": "Each element with \"document\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "document", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 5733 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_eventhandler_role_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.aria_eventhandler_role_valid = { + id: "aria_eventhandler_role_valid", + context: "dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]", + refactor: { + "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_eventhandler_role_valid.html", + "Fail_1": "aria_eventhandler_role_valid.html", + "group": "aria_eventhandler_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with '{1}' does not have a valid ARIA role specified", + "group": "Elements with event handlers must have a valid ARIA role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + //this rule is passed if a element has attribut role + //also, passed of element has any implicit roles. + if (AriaUtil_1.AriaUtil.hasAnyRole(ruleContext, true)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //pass if this element is received focus by default + if (CommonUtil_1.CommonUtil.isfocusableByDefault(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //validate if this element has any of the given event handler's + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var eventArr = new Array(); + // From WCAG20_Script_UseW3CDomFunctions + //let events = ["onblur", "onfocus", "onchange", "onclick", "oncontextmenu", "ondblclick", "onkeydown", + // "onkeypress", "onkeyup", "onload", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + // "onmouseover", "onmousewheel", "onreset", "onpaste", "onresize", "onscroll", + // "onselect", "onsubmit", "onactivate", "ondeactivate", "onmouseenter", "onmouseleave"]; + var events = ["onblur", "onfocus", "onchange", "onclick", "ondblclick", "onkeydown", + "onkeypress", "onkeyup", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + "onmouseover", "onresize" + ]; + for (var i = 0; i < events.length; ++i) { + if (ruleContext.hasAttribute(events[i])) + eventArr.push(events[i]); + } + var retToken2 = new Array(); + retToken2.push(eventArr.join(", ")); + //return new ValidationResult(false, [ruleContext], '', '', [retToken1, retToken2]); + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ 5782 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_form_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_form_label_unique = { + id: "aria_form_label_unique", + context: "aria:form", + refactor: { + "Rpt_Aria_MultipleFormLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_form_label_unique.html", + "fail_label_not_unique": "aria_form_label_unique.html", + "group": "aria_form_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"form\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"form\" role do not have unique labels", + "group": "Each element with \"form\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "form", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 6731 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_graphic_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_graphic_labelled = { + id: "aria_graphic_labelled", + context: "aria:graphics-document,aria:graphics-symbol", + refactor: { + "HAAC_Aria_SvgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_graphic_labelled.html", + "Pass_0": "aria_graphic_labelled.html", + "Fail_1": "aria_graphic_labelled.html", + "Fail_2": "aria_graphic_labelled.html", + "Fail_3": "aria_graphic_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with a graphics role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" graphics role has no label", + "Fail_2": "Element with \"{0}\" graphics role has no label or an empty label", + "Fail_3": "Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: [{ + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role") || !ruleContext.getAttribute("role").includes("graphics-")) + return null; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.getAttribute("role")]); + } + } +}; + + +/***/ }, + +/***/ 390 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_hidden_nontabbable = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.aria_hidden_nontabbable = { + id: "aria_hidden_nontabbable", + context: "dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*", + refactor: { + "aria_hidden_focus_misuse": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_hidden_nontabbable.html", + "Pass_0": "aria_hidden_nontabbable.html", + "Fail_1": "aria_hidden_nontabbable.html" + } + }, + messages: { + "en-US": { + "group": "A hidden element should not contain any tabbable elements", + "Pass_0": "Rule Passed", + "Fail_1": "Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.3.1", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Handle testcase with focus jumping away + act: "6cfa84", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ 3900 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_id_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +var ARIADefinitions_1 = __webpack_require__(9910); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_id_unique = { + id: "aria_id_unique", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidIdRef": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_id_unique.html", + "Fail_1": "aria_id_unique.html", + "group": "aria_id_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid", + "group": "The ARIA property must reference a non-empty unique id of an existing element that is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: 6a7281 - Need a separate reason code when the property is not required. ACT says it's okay to be + // invalid when not required. I think we should still fail, but flag it as a different reason so that we can have a subset + // aligns with ACT. + act: ["59796f", "6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pass = true; + var attrNameArr = new Array(); + var nonExistantIDs = new Array(); + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var contextAttributes = ruleContext.attributes; + var idTokens = new Array(); + var testedReferences = 0; + if (contextAttributes) { + for (var i = 0, attrLength = contextAttributes.length; i < attrLength; i++) { + pass = true; + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes[attrName]; + if (dataTypes && dataTypes.type) { + var supportsOneIDRef = (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idref") ? true : false; + //If the data type supports one or more id refs do error checking + if (supportsOneIDRef || (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idrefs")) { + testedReferences++; + var nodeValueLength = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue).length; + var idArray = contextAttributes[i].nodeValue.split(" "); + // Check for an empty ID Ref + if (nodeValueLength < 1) { + pass = false; + idTokens.push("\"" + contextAttributes[i].nodeValue + "\""); + } + // check to see if too many IDRefs + else if (supportsOneIDRef) { + //If has too many IDRefs it is an error + if (nodeValueLength >= 1) { + if (idArray.length > 1) { + pass = false; + // Need to capture all the IDRefs for idTokens + for (var z = 0, length_1 = idArray.length; z < length_1; ++z) { + if (idArray[z] != "") { + idTokens.push(idArray[z]); + } + } + } + } + } + // check to see if id refs are invalid + if (pass && nodeValueLength >= 1) { + for (var j = 0, length_2 = idArray.length; j < length_2; ++j) { + if (idArray[j].length > 0) { // it is an empty string if spaces are one after the other + // Get the element by Id + var elementById = ownerDocument.getElementById(idArray[j]); + // Pass if the element exists + pass = elementById != null; + // If the element exists and this is an aria attribute that doesn't support hidden ID reference + // then perform a isNodeVisible check, in the case the node is not visible then we return + // false and true otherwise. + if (pass && !dataTypes.hiddenIDRefSupported) { + pass = VisUtil_1.VisUtil.isNodeVisible(elementById); + } + if (!pass) { + if (idArray[j] != "") { + idTokens.push(idArray[j]); + } + } + // Only one of the id references need to be valid to mark the rule as passed. + // Therefore if we find a single visible element then stop checking and mark as + // passed. + else { + break; + } + } + } + } + } + } + if (!pass) + attrNameArr.push(attrName); + } + } + } + var passed = attrNameArr.length == 0; + var retToken1 = new Array(); + var retToken2 = new Array(); + var retToken3 = new Array(); + if (!passed) { + retToken2.push(attrNameArr.join(", ")); + retToken3.push(ruleContext.nodeName.toLowerCase()); + if (idTokens.length > 0) { + retToken1.push(idTokens.join(", ")); + } + } + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : [retToken1, retToken2, retToken3]); + if (testedReferences == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString(), retToken3.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 1218 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_img_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_img_labelled = { + id: "aria_img_labelled", + context: "aria:img, aria:image", + refactor: { + "HAAC_Aria_ImgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_img_labelled.html", + "Pass_0": "aria_img_labelled.html", + "Fail_1": "aria_img_labelled.html", + "Fail_2": "aria_img_labelled.html", + "Fail_3": "aria_img_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with \"img\" role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"img\" role has no label", + "Fail_2": "Element with \"img\" role has no label or an empty label", + "Fail_3": "Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: ["23a2a8", { + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role")) { + // If no role, this is implicit, and covered by WCAG20_Img_HasAlt + return null; + } + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg and img elements are handled in svg_graphics_labbelled and img_alt_valid rules + if (nodeName === 'svg' || nodeName === 'img') + return; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + /* JCH - Points of failure + * 0. Missing alt attr with value + * 1. Missing aria-label or aria-labelledby + * 2. Missing title attr with value + */ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2"); + } + } +}; + + +/***/ }, + +/***/ 6734 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_keyboard_handler_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIADefinitions_1 = __webpack_require__(9910); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_keyboard_handler_exists = { + id: "aria_keyboard_handler_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingKeyboardHandler": { + "pass": "pass", + "potential_no_keyboard_access": "potential_no_keyboard_access" + } + }, + help: { + "en-US": { + "pass": "aria_keyboard_handler_exists.html", + "potential_no_keyboard_access": "aria_keyboard_handler_exists.html", + "group": "aria_keyboard_handler_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_no_keyboard_access": "Verify the <{0}> element with \"{1}\" role has keyboard access", + "group": "Interactive WAI_ARIA UI components must provide keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var passed = true; + var savedPassed = passed; + var doc = ruleContext.ownerDocument; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/); + //only consider user specified role(s), rather than native containers + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + var nodeName = ruleContext.nodeName.toLowerCase(); + //if an explicit role is specified, the 'aria_role_redundant' rule should be triggered and addressed first, + // and the current rule should be ignored + if (nodeName === 'datalist' && roles && roles.includes("listbox")) + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + for (var j = 0; j < roles.length; ++j) { + var pattern = designPatterns[roles[j]]; + if (roleContainers.indexOf(roles[j]) >= 0) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (!disabled) { + // See if there is a keyboard event handler on the parent element. + passed = (ruleContext.hasAttribute("onkeydown") || ruleContext.hasAttribute("onkeypress") || ruleContext.hasAttribute("onkeyup")); + // No keyboard event handler found on parent. See if keyboard event handlers are on required child elements. + if (!passed) { + if (!hasAttribute(ruleContext, 'aria-activedescendant')) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren; + if (reqChildren) { /* SMF TODO menubar does not have any reqChildren */ + for (var i = 0, requiredChildrenLength = reqChildren.length; i < requiredChildrenLength; i++) { + var xp = "*[contains(@role,'" + reqChildren[i] + "')]"; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r) { + passed = (r.hasAttribute("onkeydown") || r.hasAttribute("onkeypress")); + if (!passed) { + // Child did not have a key handler. See if any of the grandchildren do. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + // All the required children (or any descendants of the required children) must have keypress/keydown + // If not, it is a failure, no need to keep checking any more. + break; + } + r = xpathResult.iterateNext(); + } + } + } + else { + // The current element failed the keydown/keypress, and it does not have required children, such as menubar. + // Let's check its descendants. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + } + else { + // Attribute 'aria-activedescendant' is specified. + passed = true; + } + } + } + } + if (!passed) { + roleNameArr.push(roles[j]); + } + if (!passed && savedPassed) { + savedPassed = passed; + } + } + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var retToken2 = new Array(); + retToken2.push(roleNameArr.join(", ")); + // Determine if this is referenced by a combobox. If so, leave it to the combobox rules to check + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + return savedPassed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_no_keyboard_access", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ 9973 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_landmark_name_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var ARIAMapper_1 = __webpack_require__(9955); +var DOMUtil_1 = __webpack_require__(1686); +var fragment_1 = __webpack_require__(5279); +var CacheUtil_1 = __webpack_require__(4566); +var AccNameUtil_1 = __webpack_require__(1950); +var VisUtil_1 = __webpack_require__(3946); +var CommonUtil_1 = __webpack_require__(7139); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_landmark_name_unique = { + id: "aria_landmark_name_unique", + context: "aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form", + refactor: { + "landmark_name_unique": { + "Pass_0": "pass", + "Fail_0": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_landmark_name_unique.html", + "fail_label_not_unique": "aria_landmark_name_unique.html", + "group": "aria_landmark_name_unique.html" + } + }, + messages: { + "en-US": { + "pass": "Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'", + "fail_label_not_unique": "Multiple elements with \"{0}\" landmarks within the same parent region are not distinguished from one another because they have the same \"{1}\" label", + "group": "Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // TODO do I need to fiter out bad contentinfo nodes: The footer element is not a contentinfo landmark when it is a descendant of the following HTML5 sectioning elements: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Checking if this landmark is inside a dialog element. If it is we are going to skip checking it. + /**var copyOfRuleContext = ruleContext; + var parnetNodesOfRuleContext = []; + while (copyOfRuleContext) { + parnetNodesOfRuleContext.unshift(copyOfRuleContext); + copyOfRuleContext = copyOfRuleContext.parentElement; + } + parnetNodesOfRuleContext.forEach(elem => { + if (elem !== null) { + if (elem.tagName == "DIALOG" || elem.getAttribute('role') == "dialog") { + return null // Skipping checking landmarks that happen to be inside dialog elements + } + } + }) + */ + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "dialog", true) !== null) + return null; + // Begining formCache work + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_landmark_name_unique", null); + if (!formCache) { + // console.log("---------ENTERING FORM CACHE") + formCache = { + navigationNodes: [], + navigationNodesComputedLabels: [], + navigationNodesParents: [], + navigationNodesMatchFound: [] + }; + var navigationNodesTemp = ownerDocument.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'); + var navigationNodes = Array.from(navigationNodesTemp); + var navigationNodesParents = []; + var navigationNodesMatchFound = []; + // This block of code filters out any nav elements that are under a dialog. As those are not ones we want to test against as we consider dialogs are separate locations from the rest of the main page. + var navigationNodesWithoutDialogs = []; + for (var i = 0; i < navigationNodes.length; i++) { + /**let a = navigationNodes[i]; + + let dialogNodeFoundFlag = false; + while (a) { + a = a.parentElement; + if (a !== null) { + if (a.tagName == "DIALOG" || a.getAttribute('role') == "dialog") { + dialogNodeFoundFlag = true; + } + } + } + if (!dialogNodeFoundFlag) { + navigationNodesWithoutDialogs.push(navigationNodes[i]) + }*/ + // ignore node that is AT hidden or in a dialog + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(navigationNodes[i]) || CommonUtil_1.CommonUtil.getAncestor(navigationNodes[i], ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(navigationNodes[i], "dialog", true) !== null) + continue; + navigationNodesWithoutDialogs.push(navigationNodes[i]); + } + navigationNodes = navigationNodesWithoutDialogs; + for (var i = 0; i < navigationNodes.length; i++) { + // Loop over all the landmark nodes + var els = []; + var a = navigationNodes[i].parentElement; + while (a) { + els.push(a); + a = a.parentElement; + } + for (var j = 0; j < els.length; j++) { + // Loop over all the parents of the landmark nodes + // Find nearest landmark parent based on the tagName or the role attribute + var tagNameTrigger = [ + "ASIDE", + "FOOTER", + "FORM", + "HEADER", + "MAIN", + "NAV", + "SECTION", + ].includes(els[j].tagName); + var roleNameTrigger = false; + if (els[j].hasAttribute("role")) { + roleNameTrigger = [ + "complementary", + "contentinfo", + "form", + "banner", + "main", + "navigation", + "region", + "search", + ].includes(els[j].getAttribute("role")); // TODO we are not covering the case where a elemenent with multiple roles. e.g., role = "form banner". This is a improvment we might want to add in the future. + } + if (tagNameTrigger || roleNameTrigger) { + // Nearest parent-landmark found + navigationNodesParents.push(els[j]); + break; + } + if (j === els.length - 1) { + // This node is at the head of the file so it does not have a parent + navigationNodesParents.push(null); + break; + } + } + } + var navigationNodesComputedLabels = []; + for (var i = 0; i < navigationNodes.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(navigationNodes[i]); + // Loop over all the landmark nodes + navigationNodesComputedLabels.push( + /**ARIAMapper.computeName(navigationNodes[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + for (var i = 0; i < navigationNodesParents.length; i++) { + // Loop over all the parents of the landmark nodes to find duplicates + var matchFound = false; + var pass_0_flag = false; + for (var j = 0; j < navigationNodesParents.length; j++) { + if (j === i) { + // We do not want to compare against ourselfs + continue; + } + // This if statement focus on the case where the parent landmark is null + if (navigationNodesParents[i] === null && + navigationNodesParents[j] === null) { + // We are looking at two root nodes, so we should compare them. + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else if (navigationNodesParents[i] === null || + navigationNodesParents[j] === null) { + // We are looking at a single root node + continue; + } + // This if statement focus on the case where the parent landmark is NOT null + if (DOMUtil_1.DOMUtil.sameNode(navigationNodesParents[i], navigationNodesParents[j])) { + // We have the same parent-landmark AND + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else { + // Different parents // Not applicable + } + } + if (!matchFound) { + if (pass_0_flag) { + navigationNodesMatchFound.push("pass"); + } + else { + navigationNodesMatchFound.push("null"); // This is not the keyword null on purpose. It is a spaceholder in the array so indexes match up. + } + } + } + formCache.navigationNodesComputedLabels = + navigationNodesComputedLabels; + formCache.navigationNodes = navigationNodes; + formCache.navigationNodesParents = navigationNodesParents; + formCache.navigationNodesMatchFound = navigationNodesMatchFound; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_landmark_name_unique", formCache); + // TODO Add validation that all 3 arrays are the same length + // console.log("-------------End formCache") + } // End formCache + var indexToCheck = -1; + for (var i = 0; i < formCache.navigationNodes.length; i++) { + if (ruleContext.isSameNode(formCache.navigationNodes[i])) { + indexToCheck = i; + } + } + if (indexToCheck === -1) { + return null; + } + if (formCache.navigationNodesMatchFound[indexToCheck] === "pass") { + return (0, IRule_1.RulePass)("pass", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + ]); + } + else if (formCache.navigationNodesMatchFound[indexToCheck] === "fail_label_not_unique") { + return (0, IRule_1.RuleFail)("fail_label_not_unique", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + formCache.navigationNodesComputedLabels[indexToCheck], + ]); + } + else { + return null; + } + } +}; + + +/***/ }, + +/***/ 5711 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_main_label_unique = { + id: "aria_main_label_unique", + context: "aria:main", + refactor: { + "Rpt_Aria_MultipleMainsRequireLabel_Implicit_2": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_unique.html", + "Fail_1": "aria_main_label_unique.html", + "group": "aria_main_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique labels", + "group": "Each element with \"main\" role must have unique label that describes its purposes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var contextLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var parentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "document", true); + var mains = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + var result = null; + for (var i = 0; i < mains.length; ++i) { + if (mains[i] === ruleContext) + continue; + result = (0, IRule_1.RulePass)("Pass_0"); + var thisParentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(mains[i], "document", true); + if (thisParentDocRole === parentDocRole) { + if (AriaUtil_1.AriaUtil.getAriaLabel(mains[i]) === contextLabel) { + result = (0, IRule_1.RuleFail)("Fail_1"); + break; + } + } + } + return result; + } +}; + + +/***/ }, + +/***/ 3384 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_visible = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_main_label_visible = { + id: "aria_main_label_visible", + context: "dom:body", + refactor: { + "Rpt_Aria_MultipleMainsVisibleLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_visible.html", + "Fail_1": "aria_main_label_visible.html", + "group": "aria_main_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique visible labels", + "group": "Each element with \"main\" role should have a unique visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Consider the Check Hidden Content setting that is set by the rules + //call getElementsByRoleHidden with considerImplicit flag as true + //so that the method returs <main> elements + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var passed = AriaUtil_1.AriaUtil.hasUniqueAriaLabelledby(landmarks); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 2762 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_navigation_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_navigation_label_unique = { + id: "aria_navigation_label_unique", + context: "aria:navigation", + refactor: { + "Rpt_Aria_MultipleNavigationLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_navigation_label_unique.html", + "fail_label_not_unique": "aria_navigation_label_unique.html", + "group": "aria_navigation_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"navigation\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"navigation\" role do not have unique labels", + "group": "Each element with \"navigation\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "navigation", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 5757 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_parent_required = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var ARIADefinitions_1 = __webpack_require__(9910); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_parent_required = { + id: "aria_parent_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredParent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_parent_required.html", + "Pass_0": "aria_parent_required.html", + "Fail_1": "aria_parent_required.html" + } + }, + messages: { + "en-US": { + "group": "Each element with an implicit or explicit role must be contained within a valid element", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" role is not contained in or owned by an element with one of the following roles: \"{1}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Check Fail 3 + act: "ff89c9", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext)) + return; + var passed = true; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var roleNameArr = new Array(); + var containerRoles = new Array(); + var testedContainer = 0; + var ancestorRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + var parentRole = ancestorRoles[ancestorRoles.length - 2]; + var count = 2; + while (parentRole === 'none') { + count++; + parentRole = ancestorRoles[ancestorRoles.length - count]; + } + /**for (let j = 0, length = roles.length; j < length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[roles[j]].container; + for (let i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) break; + } + if (passed == false) { + roleNameArr.push(roles[j]); + } + } + } + */ + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (designPatterns[role] && designPatterns[role].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[role].container; + for (var i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) + break; + } + if (passed == false) { + roleNameArr.push(role); + } + } + var retToken1 = new Array(); + retToken1.push(roleNameArr.join(", ")); + var retToken2 = new Array(); + retToken2.push(containerRoles.join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (testedContainer == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 5232 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_region_label_unique = { + id: "aria_region_label_unique", + context: "aria:region", + refactor: { + "Rpt_Aria_MultipleRegionsUniqueLabel_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_region_label_unique.html", + "fail_label_not_unique": "aria_region_label_unique.html", + "group": "aria_region_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"region\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"region\" role do not have unique labels", + "group": "Each element with \"region\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "region"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 1891 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_region_labelled = { + id: "aria_region_labelled", + context: "aria:region", + refactor: { + "Rpt_Aria_RegionLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + // "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_region_labelled.html", + "Fail_1": "aria_region_labelled.html", + // "Fail_2": "aria_region_labelled.html", + "group": "aria_region_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"region\" role does not have a label", + // "Fail_2": "Element with \"region\" role is not labeled with 'aria-label' or 'aria-labelledby'", + "group": "Each element with \"region\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ 6142 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_allowed = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_role_allowed = { + id: "aria_role_allowed", + context: "dom:*[role]", + refactor: { + "Rpt_Aria_ValidRole": { + "Pass_0": "Pass_0", + "Fail_2": "Fail_2", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "aria_role_allowed.html", + "Pass_0": "aria_role_allowed.html", + "Fail_2": "aria_role_allowed.html", + "Potential_1": "aria_role_allowed.html" + } + }, + messages: { + "en-US": { + "group": "Elements must have a valid 'role' per ARIA specification", + "Pass_0": "Rule Passed", + "Fail_2": "The role '{0}' defined on the element is not valid per ARIA specification", + "Potential_1": "Some of the roles, '{0}', defined on the element are not valid per ARIA specification" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Recheck + act: "674b10", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var roleStr = ruleContext.getAttribute("role").trim().toLowerCase(); + if (roleStr.length === 0) { + return null; + } + if (ruleContext.hasAttribute("aria-hidden") && ruleContext.getAttribute("aria-hidden").toLowerCase() === "true") { + return null; + } + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (!invalidRoles || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + else { + var roles = roleStr.split(/\s+/); + if (invalidRoles.length === roles.length) { + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(",")]); + } + else if (invalidRoles.length > 0) { + return (0, IRule_1.RulePotential)("Potential_1", [invalidRoles.join(",")]); + } + } + } +}; + + +/***/ }, + +/***/ 4863 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_redundant = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_role_redundant = { + id: "aria_role_redundant", + context: "dom:*[role]", + help: { + "en-US": { + "pass": "aria_role_redundant.html", + "fail_redundant": "aria_role_redundant.html", + "group": "aria_role_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "An explicitly-assigned ARIA role is not redundant with the implicit role of the element", + "fail_redundant": "The explicitly-assigned ARIA role \"{0}\" is redundant with the implicit role of the element <{1}>", + "group": "An explicitly-assigned ARIA role should not be redundant with the implicit role of the element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var elemName = ruleContext.tagName.toLowerCase(); + var ariaRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + if (!ariaRoles || ariaRoles.length === 0) + return; + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + var role_defined = AriaUtil_1.AriaUtil.areRolesDefined(ariaRoles); + if (!role_defined) + return null; + // dependency check: if it's already failed in the parent relation, then skip this check + // comment out to report the redundant role for table element: tr, td & th + /**if (["td", "th", "tr"].includes(elemName)) { + let parentRole = TableUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + }*/ + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + if (!implicitRoles || implicitRoles.length === 0) + return (0, IRule_1.RulePass)("pass"); + var ret = []; + for (var i = 0; i < ariaRoles.length; i++) { + if (!implicitRoles.includes(ariaRoles[i])) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaRoles[i], elemName])); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ 1440 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_search_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_search_label_unique = { + id: "aria_search_label_unique", + context: "aria:search", + refactor: { + "Rpt_Aria_MultipleSearchLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_search_label_unique.html", + "fail_label_not_unique": "aria_search_label_unique.html", + "group": "aria_search_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"search\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"search\" role do not have unique labels", + "group": "Each element with \"search\" role must have a unique label that describes its purpose" + } + }, + /** + * deprecated the rule on 01/27/2025 + * rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + rulesets: [{ + "id": [], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "search", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 1968 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_valid = exports.aria_role_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.aria_role_valid = { + id: "aria_role_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "aria_semantics_role": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_role_valid.html", + "Fail_1": "aria_role_valid.html", + "Fail_2": "aria_role_valid.html", + "group": "aria_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The ARIA role '{0}' is not valid for the element <{1}>", + "Fail_2": "The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable", + "group": "ARIA roles must be valid for the element to which they are assigned" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var tagName = ruleContext.tagName.toLowerCase(); + // only chek element (1) and fragment nodes (11) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + //skip the rule + // the invalid role case: handled by aria_role_allowed. Ignore to avoid duplicated report + var undefinedRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (undefinedRoles && undefinedRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + // dependency check: if it's already failed, then skip + if (["td", "th", "tr"].includes(tagName)) { + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + } + var domRoles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles.includes('generic')) + return (0, IRule_1.RuleFail)("Fail_1", ["generic", tagName]); + var invalidRoles = AriaUtil_1.AriaUtil.getInvalidRoles(ruleContext); + if (invalidRoles === null || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + if (invalidRoles.includes("presentation") || invalidRoles.includes("none") && CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(", "), tagName]); + if (invalidRoles.length > 0) + return (0, IRule_1.RuleFail)("Fail_1", [invalidRoles.join(", "), tagName]); + if (domRoles.length > 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + return null; + } +}; +// This rule is in the same file because there is a dependency that aria_role_valid runs first, +// and the info is passed by cache, but there isn't a dependency in the Fail_2 scenario, so regular +// dependency cannot be used +exports.aria_attribute_valid = { + id: "aria_attribute_valid", + context: "dom:*", + // The the ARIA role is completely invalid, skip this check + dependencies: ["aria_attribute_deprecated", "aria_role_valid"], + refactor: { + "aria_attribute_allowed": { + "Pass": "Pass", + "Fail_invalid_role_attr": "Fail_invalid_role_attr", + "Fail_invalid_implicit_role_attr": "Fail_invalid_implicit_role_attr" + } + }, + help: { + "en-US": { + "group": "aria_attribute_valid.html", + "Pass": "aria_attribute_valid.html", + "Fail_invalid_role_attr": "aria_attribute_valid.html", + "Fail_invalid_implicit_role_attr": "aria_attribute_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes should be valid for the element and ARIA role to which they are assigned", + "Pass": "ARIA attributes are valid for the element and ARIA role", + "Fail_invalid_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with ARIA role \"{2}\"", + "Fail_invalid_implicit_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with implicit ARIA role \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["5c01ea", { "46ca7f": { "Pass": "pass", "Fail_invalid_role_attr": "fail", "Fail_invalid_implicit_role_attr": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // only chek element (1) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + // ignore if no aria attribute + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (ariaAttributes === null || ariaAttributes.length === 0) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + var explicit = true; + if (roles && roles.length > 0) { + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + if (!AriaUtil_1.AriaUtil.areRolesDefined(roles)) + return null; + } + else { + //no explicit role defined + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + explicit = false; + } + var tagName = ruleContext.tagName.toLowerCase(); + var failedAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (!failedAttributes || failedAttributes.length === 0) + return (0, IRule_1.RulePass)("Pass", [ariaAttributes.join(", "), tagName, roles.join(", ")]); + if (roles.length > 0) { + if (explicit) + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + else + return (0, IRule_1.RuleFail)("Fail_invalid_implicit_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + } + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, "none"]); + } +}; + + +/***/ }, + +/***/ 1617 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_toolbar_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var CacheUtil_1 = __webpack_require__(4566); +exports.aria_toolbar_label_unique = { + id: "aria_toolbar_label_unique", + context: "aria:toolbar", + refactor: { + "Rpt_Aria_MultipleToolbarUniqueLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_toolbar_label_unique.html", + "Fail_1": "aria_toolbar_label_unique.html", + "group": "aria_toolbar_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"toolbar\" roles do not have unique labels", + "group": "Each element with \"toolbar\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "toolbar", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 3475 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_widget_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIAMapper_1 = __webpack_require__(9955); +var fragment_1 = __webpack_require__(5279); +var ARIADefinitions_1 = __webpack_require__(9910); +var DOMUtil_1 = __webpack_require__(1686); +exports.aria_widget_labelled = { + id: "aria_widget_labelled", + context: "dom:*", + refactor: { + "Rpt_Aria_WidgetLabels_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_widget_labelled.html", + "Pass_0": "aria_widget_labelled.html", + "Fail_1": "aria_widget_labelled.html" + } + }, + messages: { + "en-US": { + "group": "Interactive component must have a programmatically associated name", + "Pass_0": "Rule Passed", + "Fail_1": "Interactive component with ARIA role '{0}' does not have a programmatically associated name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "m6b1q3", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + /* removed the role check role= presentation and role=none since these 2 roles are not in the list of widget type roles */ + if ((ruleContext.hasAttribute("type") && + ruleContext.getAttribute("type") === "hidden") || + (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || + AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox")))) { + // we need to diagnose that a combobox input textbox has a label(github issue #1104) + return null; + } + var elemRole = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var tagName = ruleContext.nodeName.toLowerCase(); + // Handled by input_label_exists + var skipRoles = [ + "button", + "checkbox", + "combobox", + "listbox", + "menuitemcheckbox", + "menuitemradio", + "radio", + "searchbox", + "slider", + "spinbutton", + "switch", + "textbox", + "progressbar", + "link", + ]; + if (skipRoles.includes(elemRole)) + return null; + if (tagName === "output" || + (tagName === "input" && + ruleContext.getAttribute("type") === "file")) { + } + if (!ruleContext.hasAttribute("role")) { + // Form/input elements are checked by G41, we skip them from this rule. Github issue 449 + var skipElements = [ + "input", + "textarea", + "select", + "button", + "datalist", + "optgroup", + "option", + "keygen", + "output", + "progress", + "meter", + ]; + if (skipElements.indexOf(ruleContext.nodeName.toLowerCase()) != + -1) { + return null; + } + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var passed = true; + var prohibited = false; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //get attribute roles as well as implicit roles. + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + var numWidgetsTested = 0; + var interactiveRoleTypes = ["widget", "liveRegion", "window"]; + for (var i = 0, length_1 = roles.length; passed && i < length_1; ++i) { + var pattern = designPatterns[roles[i]]; + if (pattern && + pattern.nameRequired && + pattern.roleType && + interactiveRoleTypes.includes(pattern.roleType)) { + ++numWidgetsTested; + // All widgets may have an author supplied accessible name. + // Title is legal, but don't advertise its use in documentation. + // Encourage use of aria-label, aria-labelledby or html label element. + passed = + AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title") || + CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!passed && + pattern.nameFrom && + pattern.nameFrom.indexOf("contents") >= 0) { + // See if widget's accessible name is supplied by element's inner text + // nameFrom: ["author", "contents"] + passed = CommonUtil_1.CommonUtil.hasInnerContentOrAlt(ruleContext); + } + if (!passed) { + // check if it has implicit label, like <label><input ....>abc </label> + passed = CommonUtil_1.CommonUtil.hasImplicitLabel(ruleContext); + } + if (!passed && + ruleContext.tagName.toLowerCase() === "img" && + !ruleContext.hasAttribute("role") && + ruleContext.hasAttribute("alt")) { + passed = + DOMUtil_1.DOMUtil.cleanWhitespace(ruleContext.getAttribute("alt")).trim().length > 0; + } + if (pattern.nameFrom.indexOf("prohibited") >= 0) { + prohibited = true; + } + } + } + if (numWidgetsTested === 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [elemRole]); + } + else { + //TODO + // if (prohibited) { + // return RuleFail("Fail_2"); + // } else { + return (0, IRule_1.RulePass)("Pass_0"); + // } + } + } +}; + + +/***/ }, + +/***/ 3370 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.asciiart_alt_exists = void 0; +var IRule_1 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.asciiart_alt_exists = { + id: "asciiart_alt_exists", + context: "dom:pre, dom:listing, dom:xmp, dom:plaintext", + refactor: { + "RPT_Pre_ASCIIArt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "asciiart_alt_exists.html", + "Potential_1": "asciiart_alt_exists.html", + "group": "asciiart_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that ASCII art has a text alternative", + "group": "ASCII art must have a text alternative" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Fix for IDWB writers. Don't trigger if content is in a code element. The code element is searched for + // in various places because of the weird way various browsers render <code><pre></pre></code. Firefox, + // HtmlUnit and Chrome all render differently. Firefox: <code></code><pre></pre> HtmlUnit: </code><pre><code></code></pre> + // See unit test CodeElementAbovePreElement.html. Don't know how RPT renders, so cover all the bases. + if (ruleContext.nodeName.toLowerCase() == "pre") { + if ((ruleContext.previousSibling && ruleContext.previousSibling.nodeName.toLowerCase() == "code") || + ruleContext.getElementsByTagName("code").length > 0 || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, "code")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + var passed = true; + var txtValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + var nonAlphaNumericNorSpaceCount = 0; + var alphNumSameCharacterCount = 0; + var lastCharacter = ""; + // Iterate through the text content + for (var idx = 0; passed && (idx < txtValue.length); ++idx) { + var chStr = txtValue.substr(idx, 1); + // Check if it is alphanumeric or punctuation + if (/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(chStr)) { + // Detect same character sequence + if (lastCharacter == chStr) { + alphNumSameCharacterCount = alphNumSameCharacterCount + 1; + ; + } + else { + alphNumSameCharacterCount = 0; + } + } + else if (/\s/.test(chStr)) { + alphNumSameCharacterCount = 0; + } + else { + nonAlphaNumericNorSpaceCount = nonAlphaNumericNorSpaceCount + 1; + alphNumSameCharacterCount = 0; + } + lastCharacter = chStr; + // Make the decision + if (nonAlphaNumericNorSpaceCount >= 5 || alphNumSameCharacterCount >= 4) { + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 9272 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_css_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.blink_css_review = { + id: "blink_css_review", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Blink_CSSTrigger1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "blink_css_review.html", + "Pass_0": "blink_css_review.html", + "Potential_1": "blink_css_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds", + "Pass_0": "Rule Passed", + "Potential_1": "Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var textValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute('style')) { + textValue = ruleContext.getAttribute('style'); + } + var passed = textValue.toLowerCase().indexOf("text-decoration:blink") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 7735 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_elem_deprecated = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.blink_elem_deprecated = { + id: "blink_elem_deprecated", + context: "dom:blink", + refactor: { + "WCAG20_Blink_AlwaysTrigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "blink_elem_deprecated.html", + "Fail_1": "blink_elem_deprecated.html" + } + }, + messages: { + "en-US": { + "group": "Content that blinks persistently must not be used", + "Fail_1": "Content found that blinks persistently" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + // const ruleContext = context["dom"].node as Element; + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ 3923 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blockquote_cite_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.blockquote_cite_exists = { + id: "blockquote_cite_exists", + context: "dom:blockquote", + refactor: { + "RPT_Blockquote_HasCite": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "blockquote_cite_exists.html", + "Potential_1": "blockquote_cite_exists.html", + "group": "blockquote_cite_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only", + "group": "Use <blockquote> only for quotations, not indentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "cite"); + if (!passed) { + var citeElems = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "cite"); + passed = citeElems != null && citeElems.length > 0; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 7521 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.canvas_content_described = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +exports.canvas_content_described = { + id: "canvas_content_described", + context: "dom:canvas", + refactor: { + "HAAC_Canvas": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "canvas_content_described.html", + "Manual_1": "canvas_content_described.html", + "group": "canvas_content_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify accessibility of the <canvas> element", + "group": "The <canvas> element may not be accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.1.1", "4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = ruleContext.innerHTML.trim().length > 0; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 1852 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.caption_track_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.caption_track_exists = { + id: "caption_track_exists", + context: "dom:video", + refactor: { + "HAAC_Video_HasNoTrack": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "caption_track_exists.html", + "Potential_1": "caption_track_exists.html", + "group": "caption_track_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that captions are available for any meaningful audio or provide a caption track for the <video> element", + "group": "A <video> element must have a text alternative for any meaningful audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + // ignore decorative video if user uses aria-hidden + if (ruleContext.getAttribute("aria-hidden") === "true") { + return null; + } + var tracks = ruleContext.getElementsByTagName("track"); + for (var i = 0; i < tracks.length; ++i) { + passed = passed || tracks[i].getAttribute("kind") === 'captions'; + } + // checks for addition of dynamic tracks + if (ruleContext.textTracks && ruleContext.textTracks.length > 0) { + for (var i = 0; i < ruleContext.textTracks.length; i++) { + passed = passed || ruleContext.textTracks[i].kind === 'captions'; + } + } + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_1"); + } + } +}; + + +/***/ }, + +/***/ 799 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_active_descendant = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var fragment_1 = __webpack_require__(5279); +var DOMWalker_1 = __webpack_require__(3864); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.combobox_active_descendant = { + id: "combobox_active_descendant", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_active_descendant.html", + "Fail_missing": "combobox_active_descendant.html", + "Fail_not_in_popup": "combobox_active_descendant.html", + "Fail_active_role_invalid": "combobox_active_descendant.html", + "Fail_active_not_selected": "combobox_active_descendant.html", + "group": "combobox_active_descendant.html" + } + }, + messages: { + "en-US": { + "Pass": "'aria-activedescendant' is used appropriately for this combobox", + "Fail_missing": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist", + "Fail_not_in_popup": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"", + "Fail_active_role_invalid": "The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'", + "Fail_active_not_selected": "The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true", + "group": "'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // This rule only applies if the activedescendant is specified + var activeId = ruleContext.getAttribute("aria-activedescendant"); + if (!activeId || activeId.trim().length === 0) { + return null; + } + var activeElem = fragment_1.FragmentUtil.getById(ruleContext, activeId); + if (!activeElem) { + return (0, IRule_1.RuleFail)("Fail_missing", [activeId]); + } + var found = false; + // examine the children + if (popupElement) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (!found && nw.nextNode() && nw.node != popupElement && nw.node != popupElement.nextSibling) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + found = nw.elem().getAttribute("id") === activeId; + } + } + } + var retVal = []; + if (!found) { + retVal.push((0, IRule_1.RulePass)("Fail_not_in_popup", [activeId, popupId])); + } + var activeRoles = AriaUtil_1.AriaUtil.getRoles(activeElem, true); + var validRoles = ["option", "gridcell", "row", "treeitem"].filter(function (validRole) { return activeRoles.includes(validRole); }); + if (validRoles.length === 0) { + retVal.push((0, IRule_1.RuleFail)("Fail_active_role_invalid", [activeId, activeRoles.join(",")])); + } + if (activeElem.getAttribute("aria-selected") !== "true") { + retVal.push((0, IRule_1.RuleFail)("Fail_active_not_selected", [activeId])); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ 4614 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMWalker_1 = __webpack_require__(3864); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.combobox_autocomplete_valid = { + id: "combobox_autocomplete_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_autocomplete": { + "Pass": "Pass", + "Fail_1": "Fail_1", + "Fail_inline": "Fail_inline" + } + }, + help: { + "en-US": { + "Pass": "combobox_autocomplete_valid.html", + "Fail_1": "combobox_autocomplete_valid.html", + "Fail_inline": "combobox_autocomplete_valid.html", + "group": "combobox_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup", + "Fail_1": "The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"", + "Fail_inline": "The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ", + "group": "A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupId = cachedElem.popupId, popupElement = cachedElem.popupElement; + var retVal = []; + if (ruleContext.getAttribute("aria-autocomplete") === "inline") { + retVal.push((0, IRule_1.RuleFail)("Fail_inline")); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-autocomplete" + passed = !popupElement.hasAttribute("aria-autocomplete"); + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !nw.elem().hasAttribute("aria-autocomplete"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_1", [popupId])); + } + if (retVal.length > 0) { + return retVal; + } + else { + return (0, IRule_1.RulePass)("Pass"); + } + } +}; + + +/***/ }, + +/***/ 5952 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_design_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var CacheUtil_1 = __webpack_require__(4566); +function patternDetect(elem) { + // check 'explicit' role combobox and that it is not <select>. + if (elem.tagName.toLowerCase() === "select" && elem.getAttribute("role") !== "combobox") { + return "implicit"; + } + else if (elem.nodeName.toLowerCase() === "input" + && (!elem.hasAttribute("type") || elem.getAttribute("type") === "text") + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.0 pattern, which the ARIA 1.2 spec says to continue to allow + return "1.0"; + } + else if (elem.nodeName.toLowerCase() !== "input" + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.1 pattern, which the ARIA 1.2 spec says is now invalid + return "1.1"; + } + // Assume they're trying to do the latest, 1.2 pattern + return "1.2"; +} +exports.combobox_design_valid = { + id: "combobox_design_valid", + context: "aria:combobox", + refactor: { + "combobox_version": { + "Pass_1.0": "Pass_1.0", + "Fail_1.1": "Fail_1.1", + "Pass_1.2": "Pass_1.2" + } + }, + help: { + "en-US": { + "Pass_1.0": "combobox_design_valid.html", + "Fail_1.1": "combobox_design_valid.html", + "Pass_1.2": "combobox_design_valid.html", + "group": "combobox_design_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1.0": "The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2", + "Fail_1.1": "The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2", + "Pass_1.2": "The combobox design pattern is detected as ARIA 1.2", + "group": "The combobox design pattern must be valid for ARIA 1.2" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var pattern = patternDetect(ruleContext); + // We don't assess native select elements here + if (pattern === "implicit") { + return null; + } + var tagName = ruleContext.tagName.toLowerCase(); + var expanded = (AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-expanded") || "").trim().toLowerCase() === "true"; + var editable = tagName === "input" && (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() === "text"); + var key = context["dom"].rolePath; + if (key) { + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + cache[key] = { + "inputElement": editable ? ruleContext : null, + "pattern": pattern, + "expanded": expanded + }; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "combobox", cache); + } + else { + // No xpath? + return null; + } + if (pattern === "1.0") { + return (0, IRule_1.RulePass)("Pass_1.0"); + } + else if (pattern === "1.1") { + return (0, IRule_1.RuleFail)("Fail_1.1"); + } + else if (pattern === "1.2") { + return (0, IRule_1.RulePass)("Pass_1.2"); + } + } +}; + + +/***/ }, + +/***/ 5395 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_focusable_elements = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMWalker_1 = __webpack_require__(3864); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.combobox_focusable_elements = { + id: "combobox_focusable_elements", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_focusable_elements.html", + "Fail_not_tabbable": "combobox_focusable_elements.html", + "Fail_tabbable_child": "combobox_focusable_elements.html", + "group": "combobox_focusable_elements.html" + } + }, + messages: { + "en-US": { + "Pass": "DOM focus is allowed only on the combobox element as required", + "Fail_not_tabbable": "The combobox element does not allow DOM focus as required", + "Fail_tabbable_child": "The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed", + "group": "Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, expanded = cachedElem.expanded; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + var popupRole = AriaUtil_1.AriaUtil.getRoles(popupElement, true)[0]; + var retVal = []; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + retVal.push((0, IRule_1.RuleFail)("Fail_not_tabbable")); + } + // Only makes sense to check the popup when expanded + // this does not apply to dialogs, return pass since the main element was focusable above + if (expanded === false || popupRole === "dialog") { + return (0, IRule_1.RulePass)("Pass"); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-activedescendant" + passed = !CommonUtil_1.CommonUtil.isTabbable(popupElement) && !AriaUtil_1.AriaUtil.getAriaAttribute(popupElement, "aria-activedescendant"); + ; + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !CommonUtil_1.CommonUtil.isTabbable(nw.node) && + !AriaUtil_1.AriaUtil.getAriaAttribute(nw.node, "aria-activedescendant"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_tabbable_child")); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ 1992 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_haspopup_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CacheUtil_1 = __webpack_require__(4566); +exports.combobox_haspopup_valid = { + id: "combobox_haspopup_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_haspopup": { + "Pass": "Pass", + "Fail_popup_role_invalid": "Fail_popup_role_invalid", + "Fail_combobox_popup_role_mismatch": "Fail_combobox_popup_role_mismatch" + } + }, + help: { + "en-US": { + "Pass": "combobox_haspopup_valid.html", + "Fail_popup_role_invalid": "combobox_haspopup_valid.html", + "Fail_combobox_popup_role_mismatch": "combobox_haspopup_valid.html", + "group": "combobox_haspopup_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value", + "Fail_popup_role_invalid": "The 'role' value \"{0}\" of the popup element \"{1}\" should be one of \"listbox\", \"grid\", \"tree\" or \"dialog\"", + "Fail_combobox_popup_role_mismatch": "The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"", + "group": "The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // Check that popup role is listbox, grid, tree, or dialog and that it matches the combobox + var popupRoles = AriaUtil_1.AriaUtil.getRoles(popupElement, true); + var validRoles = ["listbox", "grid", "tree", "dialog"].filter(function (validRole) { return popupRoles.includes(validRole); }); + if (validRoles.length === 0) { + return (0, IRule_1.RuleFail)("Fail_popup_role_invalid", [popupRoles.join(","), popupId]); + } + else { + var popupRole = validRoles[0]; + var haspopupVal = ruleContext.getAttribute("aria-haspopup") || "listbox"; + // Popup role must match aria-haspopup unless popupRole is listbox, then aria-haspopup should not be defined + if (haspopupVal !== popupRole) { + if (popupRole !== "listbox" || ruleContext.hasAttribute("aria-haspopup")) { + return (0, IRule_1.RuleFail)("Fail_combobox_popup_role_mismatch", [haspopupVal, popupRole]); + } + } + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ 7955 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_popup_reference = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var fragment_1 = __webpack_require__(5279); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.combobox_popup_reference = { + id: "combobox_popup_reference", + context: "aria:combobox", + dependencies: ["combobox_design_valid"], + help: { + "en-US": { + "group": "combobox_popup_reference.html", + "Pass_1.0_expanded": "combobox_popup_reference.html", + "Pass_1.0_collapsed": "combobox_popup_reference.html", + "Pass_1.2_expanded": "combobox_popup_reference.html", + "Pass_1.2_collapsed": "combobox_popup_reference.html", + "Fail_1.0_missing_owns": "combobox_popup_reference.html", + "Fail_1.2_missing_controls": "combobox_popup_reference.html", + "Fail_1.0_popup_reference_missing": "combobox_popup_reference.html", + "Fail_1.2_popup_reference_missing": "combobox_popup_reference.html", + "Fail_combobox_expanded_hidden": "combobox_popup_reference.html", + "Fail_combobox_collapsed_visible": "combobox_popup_reference.html" + } + }, + messages: { + "en-US": { + "group": "The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value", + "Pass_1.0_expanded": "The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible", + "Pass_1.0_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Pass_1.2_expanded": "The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible", + "Pass_1.2_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Fail_1.0_missing_owns": "The 'aria-owns' attribute of the expanded combobox is missing", + "Fail_1.2_missing_controls": "The 'aria-controls' attribute of the expanded combobox is missing", + "Fail_1.0_popup_reference_missing": "The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_1.2_popup_reference_missing": "The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_combobox_expanded_hidden": "The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible", + "Fail_combobox_collapsed_visible": "The combobox 'aria-expanded' attribute is false, but the combobox popup is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "4e8ab6": { + "Pass_1.0_expanded": "fail", + "Pass_1.0_collapsed": "fail", + "Pass_1.2_expanded": "pass", + "Pass_1.2_collapsed": "pass", + "Fail_1.0_missing_owns": "inapplicable", + "Fail_1.2_missing_controls": "fail", + "Fail_1.0_popup_reference_missing": "inapplicable", + "Fail_1.2_popup_reference_missing": "fail", + "Fail_combobox_expanded_hidden": "inapplicable", + "Fail_combobox_collapsed_visible": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var pattern = cachedElem.pattern, expanded = cachedElem.expanded; + var popupId; + var popupElement; + if (pattern === "1.0") { + if (!ruleContext.hasAttribute("aria-owns")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_missing_owns"); + } + popupId = ruleContext.getAttribute("aria-owns"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_popup_reference_missing", [popupId]); + } + } + else if (pattern === "1.2") { + if (!ruleContext.hasAttribute("aria-controls")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_missing_controls"); + } + popupId = ruleContext.getAttribute("aria-controls"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_popup_reference_missing", [popupId]); + } + } + else { + return null; + } + // We have an element, stick it in the cache and then check its role + cachedElem.popupId = popupId; + cachedElem.popupElement = popupElement; + if (expanded && !VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_expanded_hidden"); + } + else if (!expanded && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_collapsed_visible"); + } + if (pattern === "1.0") { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.0_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.0_collapsed"); + } + } + else { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.2_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.2_collapsed"); + } + } + } +}; + + +/***/ }, + +/***/ 9531 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.debug_paths = void 0; +var IRule_1 = __webpack_require__(461); +exports.debug_paths = { + id: "debug_paths", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["DEBUG"], + num: "1", + level: IRule_1.eRulePolicy.INFORMATION, + toolkitLevel: IRule_1.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + ruleContext.setAttribute("domPath", context["dom"].rolePath); + ruleContext.setAttribute("ariaPath", context["aria"].rolePath); + return null; + } +}; + + +/***/ }, + +/***/ 891 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.detector_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.detector_tabbable = { + id: "detector_tabbable", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["EXTENSIONS"], + num: "1", + level: IRule_2.eRulePolicy.INFORMATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return null; + } + var hierContext = contextHierarchies.aria[contextHierarchies.aria.length - 1]; + return (0, IRule_1.RulePass)("Pass_0", [], [{ + name: hierContext.attributes.name, + role: hierContext.role, + tabindex: parseInt(ruleContext.getAttribute("tabindex") || "0") + }]); + } +}; + + +/***/ }, + +/***/ 7446 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.dir_attribute_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.dir_attribute_valid = { + id: "dir_attribute_valid", + context: "dom:*[dir]", + refactor: { + "Valerie_Elem_DirValid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "dir_attribute_valid.html", + "Fail_1": "dir_attribute_valid.html", + "group": "dir_attribute_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Invalid value used for the 'dir' attribute", + "group": "'dir' attribute value must be \"ltr\", \"rtl\", or \"auto\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var dirStr = ruleContext.getAttribute("dir").toLowerCase(); + var passed = dirStr == "ltr" || dirStr == "rtl" || dirStr == "auto"; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 6137 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.download_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.download_keyboard_controllable = { + id: "download_keyboard_controllable", + context: "dom:a[href],dom:area[href]", + refactor: { + "HAAC_Media_DocumentTrigger2": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "download_keyboard_controllable.html", + "group": "download_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify that the file download mechanism does not cause a keyboard trap", + "group": "File download mechanisms should be keyboard-operable and preserve page focus location" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var href = ruleContext.getAttribute("href"); + var ext = CommonUtil_1.CommonUtil.getFileExt(href); + var passed = ![".docx", ".doc", ".pdf", ".odt"].includes(ext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 6839 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.draggable_alternative_exists = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +exports.draggable_alternative_exists = { + id: "draggable_alternative_exists", + context: "dom:*[draggable]", + dependencies: [], + help: { + "en-US": { + "group": "draggable_alternative_exists.html", + // "pass_alternative": "draggable_alternative_exists.html", + "pass_undraggable": "draggable_alternative_exists.html", + "potential_alternative": "draggable_alternative_exists.html" + } + }, + messages: { + "en-US": { + "group": "A draggable element must have a \"single pointer\" alternative", + // "pass_alternative": "The draggable element \"{0}\" has a \"single pointer\" alternative", + "pass_undraggable": "The element \"{0}\" is not draggable", + "potential_alternative": "Ensure the draggable element \"{0}\" has a \"single pointer\" alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + //ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + if (ruleContext.getAttribute("draggable") === 'true') + return (0, IRule_1.RulePotential)("potential_alternative", [nodeName]); + else if (ruleContext.getAttribute("draggable") === 'false') + return (0, IRule_1.RulePass)("pass_undraggable", [nodeName]); + else + return null; + } +}; + + +/***/ }, + +/***/ 8135 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var ARIADefinitions_1 = __webpack_require__(9910); +var AccNameUtil_1 = __webpack_require__(1950); +exports.element_accesskey_labelled = { + id: "element_accesskey_labelled", + context: "dom:*[accesskey]", + refactor: { + "HAAC_Accesskey_NeedLabel": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_labelled.html", + "Potential_1": "element_accesskey_labelled.html", + "group": "element_accesskey_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "The element with an assigned 'accesskey' attribute does not have an associated label", + "group": "An element with an assigned 'accesskey' attribute must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip if the element is tabbable, it's covered by other rules + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + //skip the native element, mostly text elements + if (!roles || roles.length === 0) + return; + var patterns = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]]; + if (!patterns || !patterns.nameFrom) + return; + // ignore if accessble name is required (checked in other rules) or prohibited (text element) + if (patterns.nameRequired || !patterns.nameFrom || patterns.nameFrom.includes("prohibited")) + return; + //special case: legend, as a child of a fieldset, delegate the accesskey command to the field of the fieldset which is covered by other rules + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'fieldset') + return; + // check if accessible name exists + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair && pair.name && pair.name.trim().length > 0) + //if (ARIAMapper.computeName(ruleContext).trim().length > 0) + return (0, IRule_1.RulePass)("Pass_0"); + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 507 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CacheUtil_1 = __webpack_require__(4566); +exports.element_accesskey_unique = { + id: "element_accesskey_unique", + context: "dom:*[accesskey]", + refactor: { + "WCAG20_Elem_UniqueAccessKey": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_unique.html", + "Fail_1": "element_accesskey_unique.html", + "group": "element_accesskey_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "'accesskey' attribute value on the element is not unique", + "group": "'accesskey' attribute values on each element must be unique for the page" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var map = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "element_accesskey_unique", {}); + var key = ruleContext.getAttribute("accesskey"); + var passed = !(key in map); + map[key] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 3566 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DEPRECATED_ELEMENTS = [ + /** original */ + "applet", "basefont", "center", "dir", "font", "isindex", "listing", + "plaintext", "spacer", "s", "strike", "u", "xmp", + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "acronym", "frame", "frameset", "noframes", "noembed", "big", "blink", "marquee", "tt", +]; +var DEPRECATED_HTML_GLOBAL_ATTRIBUTES = [ + /** original */ + "align", "link", "archive", "background", "bgcolor", "clear", "code", "color", + "compact", "face", "hspace", "language", "link", "noshade", "nowrap", "object", + "prompt", "start", "text", "version", "vlink", "vspace" +]; +var DEPRECATED_ELEMENT_ATTRIBUTES = { + /** original */ + "td": ["height", "width", "abbr", "axis", "char", "charoff", "height", "nowrap", "valign", "width", "align", "bgcolor"], + "th": ["height", "width", "abbr", "axis", "charoff", "height", "bgcolor", "align", "nowrap", "char", "valign", "width"], + "li": ["type", "value", "type"], + "ul": ["type", "compact"], + "pre": ["width"], + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "meta": ["http-equiv"], + "a": ["charset", "coords", "shape", "rev", "scheme"], + "link": ["rev", "charset", "target"], + "img": ["name", "longdesc", "align", "hspace", "vspace", "border"], + "area": ["nohref"], + "head": ["profile"], + "html": ["version"], + "iframe": ["longdesc", "align", "frameborder", "marginheight", "marginwidth", "scrolling"], + "object": ["archive", "code", "codebase", "codetype", "declare", "standby", "align", "hspace", "vspace", "border"], + "param": ["type", "valuetype"], + "script": ["language"], + "body": ["alink", "background", "bgcolor", "link", "text", "vlink"], + "br": ["clear"], + "caption": ["align"], + "col": ["align", "char", "charoff", "valign", "width"], + "div": ["align"], + "dl": ["compact"], + "hr": ["align", "noshade", "size", "width", "align"], + "h2": ["align"], + "h3": ["align"], + "h4": ["align"], + "h5": ["align"], + "h6": ["align"], + "input": ["align", "usemap"], + "legend": ["align"], + "menu": ["compact"], + "ol": ["compact", "type", "type"], + "p": ["align"], + "table": ["bgcolor", "cellpadding", "cellspacing", "frame", "rules", "width", "align"], + "tbody": ["align", "char", "valign", "charoff"], + "tfoot": ["align", "charoff", "char", "valign"], + "thead": ["char", "charoff", "valign", "align"], + "tr": ["align", "bgcolor", "char", "charoff", "valign"] +}; +function arrayToContextStr(obj, type) { + var str = ""; + for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) { + var prop = obj_1[_i]; + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENTS') + str += 'dom:' + prop; + else if (type === 'HTML_ATTRIBUTES') + str += 'dom:*[' + prop + "]"; + } + return str; +} +function objToContextStr(obj, type) { + var str = ""; + for (var prop in obj) { + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENT_ATTRIBUTES') { + for (var _i = 0, _a = obj[prop]; _i < _a.length; _i++) { + var item = _a[_i]; + if (str !== '' && !str.endsWith(", ")) + str += ", "; + str += 'dom:' + prop + '[' + item + ']'; + } + } + } + return str; +} +exports.element_attribute_deprecated = { + id: "element_attribute_deprecated", + context: "dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]", + help: { + "en-US": { + "pass": "element_attribute_deprecated.html", + "fail_elem": "element_attribute_deprecated.html", + "fail_attr": "element_attribute_deprecated.html", + "fail_elem_attr": "element_attribute_deprecated.html", + "group": "element_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_elem": "The <{0}> element is deprecated in HTML 5", + "fail_attr": "The HTML attribute(s) \"{0}\" is deprecated in HTML 5", + "fail_elem_attr": "The HTML attribute(s) \"{0}\" is deprecated for the <{1}> element in HTML 5", + "group": "Avoid use of obsolete features if possible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // HTMLUnit auto adds a tbody[align=left] to tables if tbody is missing! + if (ruleContext.nodeName.toLowerCase() === "tbody" && ruleContext.hasAttribute("align")) { + return (0, IRule_1.RulePass)("pass"); + } + if (ruleContext.nodeName.includes("-")) { + // This is a webcomponent element, HTML doesn't define what's deprecated + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + var ret = []; + // check if it's a deprecated element + if (DEPRECATED_ELEMENTS.includes(nodeName)) { + return (0, IRule_1.RuleFail)("fail_elem", [nodeName]); + } + // check if it's a deprecated HTML global attribute + var attrs = ruleContext.getAttributeNames(); + var violations = ''; + for (var _i = 0, attrs_1 = attrs; _i < attrs_1.length; _i++) { + var attr = attrs_1[_i]; + if (DEPRECATED_HTML_GLOBAL_ATTRIBUTES.includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_attr", [violations]); + } + // check if it's a deprecated HTML element & attribute + violations = ''; + if (nodeName in DEPRECATED_ELEMENT_ATTRIBUTES) { + for (var _a = 0, attrs_2 = attrs; _a < attrs_2.length; _a++) { + var attr = attrs_2[_a]; + if (DEPRECATED_ELEMENT_ATTRIBUTES[nodeName] && DEPRECATED_ELEMENT_ATTRIBUTES[nodeName].includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_elem_attr", [violations, nodeName]); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ 5173 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_id_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var fragment_1 = __webpack_require__(5279); +exports.element_id_unique = { + id: "element_id_unique", + context: "dom:*[id]", + refactor: { + "RPT_Elem_UniqueId": { + "Pass_0": "pass", + "Fail_1": "potential_empty", + "Fail_2": "potential_in_use" + } + }, + help: { + "en-US": { + "group": "element_id_unique.html", + "pass": "element_id_unique.html", + "potential_empty": "element_id_unique.html", + "potential_in_use": "element_id_unique.html" + } + }, + messages: { + "en-US": { + "group": "Element 'id' attribute values must be unique within a document", + "pass": "Rule Passed", + "potential_empty": "The <{0}> element has the id \"{1}\" that is empty", + "potential_in_use": "The <{0}> element has the id \"{1}\" that is already in use" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "3ea0c8": { + "pass": "pass", + "potential_empty": "pass", + "potential_in_use": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("id"); + // In the case that id is empty we should trigger a violation right away with out checking + // for uniqueness. + if (id === "") { + //return new ValidationResult(false, [ruleContext], '', '', [ruleContext.nodeName.toLowerCase(), id]); + return (0, IRule_1.RulePotential)("potential_empty", [ruleContext.nodeName.toLowerCase(), id]); + } + var element = fragment_1.FragmentUtil.getById(ruleContext, id); + var passed = element === ruleContext; + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [ruleContext.nodeName.toLowerCase(), id]); + if (!passed) { + return (0, IRule_1.RulePotential)("potential_in_use", [ruleContext.nodeName.toLowerCase(), id]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 6027 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_lang_valid = exports.html_lang_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var lang_1 = __webpack_require__(1043); +var VisUtil_1 = __webpack_require__(3946); +var DOMWalker_1 = __webpack_require__(3864); +var AccNameUtil_1 = __webpack_require__(1950); +var validateLang = function (context) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (ruleContext.hasAttribute("lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 1; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 2; + } + } + } + if (ruleContext.hasAttribute("xml:lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("xml:lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("xml:lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 3; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 4; + } + } + } + return 0; +}; +exports.html_lang_valid = { + id: "html_lang_valid", + context: "dom:html[lang], dom:html[xml:lang]", + help: { + "en-US": { + "Pass_0": "html_lang_valid.html", + "Fail_1": "html_lang_valid.html", + "Fail_2": "html_lang_valid.html", + "Fail_3": "html_lang_valid.html", + "Fail_4": "html_lang_valid.html", + "group": "html_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The default human language of the page must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + }, + "bf051a": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "fail", + "Fail_4": "inapplicable" + }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + // "de46e4": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // } + }], + run: function (context, options, contextHierarchies) { + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + return retArr[reasonCode]; + } +}; +exports.element_lang_valid = { + id: "element_lang_valid", + context: "dom:*[lang], dom:*[xml:lang]", + help: { + "en-US": { + "Pass_0": "element_lang_valid.html", + "Fail_1": "element_lang_valid.html", + "Fail_2": "element_lang_valid.html", + "Fail_3": "element_lang_valid.html", + "Fail_4": "element_lang_valid.html", + "group": "element_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The change in language of specific content must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + // "b5c3f8": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "inapplicable", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // }, + // "bf051a": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "fail", + // "Fail_4": "inapplicable" + // }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + "de46e4": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // If it's the HTML node, that's handled by html_lang_valid + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "html") + return null; + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + var retVal = retArr[reasonCode]; + if (retVal.value[1] !== IRule_1.eRuleConfidence.PASS) { + // Ensure that there's actually content of this element - skip subtrees that have other lang attributes + var hasContent = false; + if (ruleContext.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(ruleContext, false, ruleContext, true); + while (!hasContent && nw.nextNode()) { + // Skip hidden + if (nw.node.nodeType === 1) { + var element = nw.node; + if (!VisUtil_1.VisUtil.isNodeVisible(element) || element.hasAttribute("lang")) { + nw.bEndTag = true; + } + else { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(element); + hasContent = hasContent + || element.nodeName.toLowerCase() === "img" && (pair && pair.name && pair.name.trim().length > 0) /**ARIAMapper.computeName(element).trim().length > 0*/; + } + } + else { + hasContent = hasContent + || nw.node.nodeType === 3 && nw.node.nodeValue.trim().length > 0; + } + } + } + if (!hasContent) + return null; + } + return retVal; + } +}; + + +/***/ }, + +/***/ 7515 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_mouseevent_keyboard = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.element_mouseevent_keyboard = { + id: "element_mouseevent_keyboard", + context: "dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]", + refactor: { + "RPT_Elem_EventMouseAndKey": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_mouseevent_keyboard.html", + "Manual_1": "element_mouseevent_keyboard.html", + "group": "element_mouseevent_keyboard.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)", + "group": "All interactive content with mouse event handlers must have equivalent keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = ruleContext.hasAttribute("href") || + (!ruleContext.hasAttribute("ondblclick") && + !ruleContext.hasAttribute("onmousemove") && + (!ruleContext.hasAttribute("onmousedown") || ruleContext.hasAttribute("onkeydown")) && + (!ruleContext.hasAttribute("onmouseup") || ruleContext.hasAttribute("onkeyup")) && + (!ruleContext.hasAttribute("onmouseover") || ruleContext.hasAttribute("onfocus")) && + (!ruleContext.hasAttribute("onmouseout") || ruleContext.hasAttribute("onblur")) && + (!ruleContext.hasAttribute("onclick") || ruleContext.hasAttribute("onkeypress") || + nodeName == "a" || nodeName == "button")); + var failedMouseEvents = new Array(); + if (!passed) { + //store and display event name and node name in the tokens + if (ruleContext.hasAttribute("ondblclick")) { + failedMouseEvents.push("ondblclick"); + } + if (ruleContext.hasAttribute("onmousemove")) { + failedMouseEvents.push("onmousemove"); + } + if (ruleContext.hasAttribute("onmousedown") && !ruleContext.hasAttribute("onkeydown")) { + failedMouseEvents.push("onmousedown"); + } + if (ruleContext.hasAttribute("onmouseup") && !ruleContext.hasAttribute("onkeyup")) { + failedMouseEvents.push("onmouseup"); + } + if (ruleContext.hasAttribute("onmouseover") && !ruleContext.hasAttribute("onfocus")) { + failedMouseEvents.push("onmouseover"); + } + if (ruleContext.hasAttribute("onmouseout") && !ruleContext.hasAttribute("onblur")) { + failedMouseEvents.push("onmouseout"); + } + if (ruleContext.hasAttribute("onclick") && !ruleContext.hasAttribute("onkeypress")) { + if (!(nodeName == "a" || nodeName == "button")) + failedMouseEvents.push("onclick"); + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1", [nodeName, failedMouseEvents.join(", ")]); + } +}; + + +/***/ }, + +/***/ 1704 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_orientation_unlocked = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CSSUtil_1 = __webpack_require__(4919); +var VisUtil_1 = __webpack_require__(3946); +var CacheUtil_1 = __webpack_require__(4566); +var fragment_1 = __webpack_require__(5279); +var CommonUtil_1 = __webpack_require__(7139); +exports.element_orientation_unlocked = { + id: "element_orientation_unlocked", + context: "dom:*", + help: { + "en-US": { + "pass": "element_orientation_unlocked.html", + "fail_locked": "element_orientation_unlocked.html", + "group": "element_orientation_unlocked.html" + } + }, + messages: { + "en-US": { + "pass": "The element is not restricted to either landscape or portrait orientation using CSS transform property", + "fail_locked": "The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property", + "group": "Elements should not be restricted to either landscape or portrait orientation using CSS transform property" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ['b33eff'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip invisible element + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "meta", "title"])) + return null; + // Skip elements that have no meaningful visible content (no text, no img with alt). + // Orientation lock on a purely decorative or empty element is not a WCAG violation + // because there is no content whose orientation matters to the user. + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // cache the orientation result for all the elements in the page + var doc = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var orientationTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", null); + if (!orientationTransforms) { + orientationTransforms = CSSUtil_1.CSSUtil.getMediaOrientationTransform(doc); + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", orientationTransforms); + } + // find if the element matches orientation selector(s) + var media_transforms = []; + Object.keys(orientationTransforms).forEach(function (key) { + Object.keys(orientationTransforms[key]).forEach(function (tag) { + if (Object.keys(orientationTransforms[key][tag]).length > 0 && CSSUtil_1.CSSUtil.selectorMatchesElem(ruleContext, tag)) { + if (orientationTransforms[key][tag].transform) + media_transforms.push(orientationTransforms[key][tag].transform); + else + media_transforms.push(orientationTransforms[key][tag]); + } + }); + }); + // no match, the element is not in media orientation transform + if (media_transforms.length === 0) + return null; + var ret = []; + var _loop_1 = function (i) { + var media_transform = media_transforms[i]; + if (typeof media_transform === 'object') + for (var key in media_transform) + media_transform = key + "(" + media_transform[key] + ")"; + var containsRotation = false; + ['rotate', 'rotate3d', 'rotateZ', 'matrix', 'matrix3d'].forEach(function (rotation) { + if (media_transform.includes(rotation)) + containsRotation = true; + }); + // no rotation transform, skip + if (!containsRotation) + return "continue"; + var degree = CSSUtil_1.CSSUtil.getRotationDegree(media_transform); + // no or 360n degree rotation + if (degree === 0) { + ret.push((0, IRule_1.RulePass)("pass")); + return "continue"; + } + /** + * calculate the original page rotation transformation, example + * html { transform: rotate(2.5deg); } + */ + var definedStyle = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["transform"]); + /** + * compensate the media orientation with the page orientation + */ + if (definedStyle['transform']) { + var page_degree = CSSUtil_1.CSSUtil.getRotationDegree(definedStyle['transform']); + // rotate is additive + degree += page_degree; + } + // 180° rotation is a vertical flip — it does not swap portrait and landscape, + // so it does not lock orientation in the WCAG 1.3.4 sense. + // 360° (full turn) is also not a lock (already normalised to 0 above). + // Allow 1° floating-point tolerance around both 0° and 180°. + var normalised = degree % 180; + if (normalised <= 1 || normalised >= 179) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_locked", [nodeName])); + }; + for (var i = 0; i < media_transforms.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ 5053 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_scrollable_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var AriaUtil_1 = __webpack_require__(7011); +exports.element_scrollable_tabbable = { + id: "element_scrollable_tabbable", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_scrollable_tabbable.html", + "pass_tabbable": "element_scrollable_tabbable.html", + "pass_interactive": "element_scrollable_tabbable.html", + "fail_scrollable": "element_scrollable_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Scrollable elements should be tabbable or contain tabbable content", + "pass_tabbable": "The scrollable element is tabbable", + "pass_interactive": "The scrollable element has tabbable content", + "fail_scrollable": "The scrollable element <{0}> with non-interactive content is not tabbable" + } + }, + /** + * deprecated on 6/10/2025 due to Browser support for auto-focus of a scrollable element + * rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: eRulePolicy.VIOLATION, + toolkitLevel: eToolkitLevel.LEVEL_ONE + }],*/ + rulesets: [], + act: ["0ssw9k"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["iframe", "svg", "script", "meta", "style"])) + return null; + //skip if no visible content + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + // ignore if the element's navigation is controlled or owned by another element + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is not scrollable or content withouting needing a scroll + if (!VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // pass if element is tabbable + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RulePass)("pass_tabbable"); + // check if element content is tabbable + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RulePass)("pass_interactive"); + // ignore in Firefox if no tabindex at all (not tested in embedded or any simulator) + if (!ruleContext.hasAttribute("tabindex") && navigator.userAgent.indexOf("Firefox") > -1) + return null; + return (0, IRule_1.RuleFail)("fail_scrollable", [ruleContext.nodeName.toLowerCase()]); + } +}; + + +/***/ }, + +/***/ 4681 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_role_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIADefinitions_1 = __webpack_require__(9910); +var DOMWalker_1 = __webpack_require__(3864); +var VisUtil_1 = __webpack_require__(3946); +exports.element_tabbable_role_valid = { + id: "element_tabbable_role_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "element_tabbable_role_valid.html", + "fail_invalid_role": "element_tabbable_role_valid.html", + "fail_no_valid_role": "element_tabbable_role_valid.html", + "group": "element_tabbable_role_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The tabbable element has a widget role", + "fail_invalid_role": "The tabbable element's role '{0}' is not a widget role", + "fail_no_valid_role": "The tabbable element does not have a valid widget role", + "group": "A tabbable element must have a valid widget role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // if the element is tabbable by default with or without tabindex, let the other rules (such as widget_tabbable_single) to handle it + if (nodeName in CommonUtil_1.CommonUtil.tabTagMap) { + var value = CommonUtil_1.CommonUtil.tabTagMap[nodeName]; + if (typeof (value) === "function") { + value = value(ruleContext); + } + if (value) + return null; + } + // handle the case: no tabindex or tabindex < 0 + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) < 0) + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is scrollable + if (VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // elements whose roles allow no descendants that are interactive or with a tabindex >= 0 + // this case should be handled in widget_tabbable_single and aria_child_tabbable + var roles_no_interactive_child = ["button", "checkbox", "img", "link", "menuitem", "menuitemcheckbox", "menuitemradio", + "option", "radio", "switch", "tab"]; + var parent = DOMWalker_1.DOMWalker.parentNode(ruleContext); + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent); + // ignore if the parent role is in roles_no_interactive_child + if (roles_no_interactive_child.includes(parent_role)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return (0, IRule_1.RuleFail)("fail_no_valid_role"); + // ignore 'application' role that contains one or more focusable elements that do not follow a standard interaction pattern supported by a widget role:https://www.w3.org/TR/2023/PR-WAI-ARIA-1.2-20230328/#application + if (role === "application") + return null; + // handle the case: tabindex >= 0 to examine whether a widget role is setup or not + // pass if one of the roles is a widget type + // Row is weird. It's structure, but can also be widget + // Focusable separators are widgets + if (role === "row" || role === "separator" || ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return (0, IRule_1.RulePass)("pass"); + } + return (0, IRule_1.RuleFail)("fail_invalid_role", [role]); + } +}; + + +/***/ }, + +/***/ 8050 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_unobscured = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var DOMMapper_1 = __webpack_require__(7507); +var ColorUtil_1 = __webpack_require__(3883); +exports.element_tabbable_unobscured = { + id: "element_tabbable_unobscured", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_unobscured.html", + "pass": "element_tabbable_unobscured.html", + "potential_obscured": "element_tabbable_unobscured.html" + } + }, + messages: { + "en-US": { + "group": "When an element receives focus, it is not entirely covered by other content", + "pass": "The element is not entirely covered by other content", + "potential_obscured": "Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.4.11"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Early exit: check visibility and tabbability first + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // Early exit: ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return null; + var win = doc.defaultView; + if (!win) + return null; + // Reuse single DOMMapper instance + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + // Early exit: bounds not available or element has no dimensions + if (!bounds || bounds.height === 0 || bounds.width === 0) + return null; + var cStyle = win.getComputedStyle(ruleContext); + if (!cStyle) + return null; + // Parse z-index once and cache + var zindex = parseInt(cStyle.zIndex === 'auto' || !cStyle.zIndex ? '0' : cStyle.zIndex); + // More specific selector to reduce iteration + var elems = doc.querySelectorAll('body *:not(script):not(style):not(meta):not(link)'); + if (!elems || elems.length === 0) + return null; + var before = true; + var boundsRight = bounds.left + bounds.width; + var boundsBottom = bounds.top + bounds.height; + // Check for obscuring elements + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + /** + * The nodes returned from querySelectorAll are in document order. + * If two elements overlap and z-index are not defined, then the node + * rendered earlier will be overlaid by the node rendered later. + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + // The next node in elems will be after the target node (ruleContext) + before = false; + continue; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // Skip if element contains ruleContext or is not visible + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || !VisUtil_1.VisUtil.isNodeVisible(elem)) + continue; + var bnds = mapper.getUnadjustedBounds(elem); + // Skip if no bounds or zero dimensions + if (!bnds || bnds.height === 0 || bnds.width === 0) + continue; + // Quick bounds check: does elem completely cover ruleContext? + if (bnds.top > bounds.top || bnds.left > bounds.left) + continue; + var bndsRight = bnds.left + bnds.width; + var bndsBottom = bnds.top + bnds.height; + if (bndsRight < boundsRight || bndsBottom < boundsBottom) + continue; + // Check z-index to determine if elem obscures ruleContext + var zStyle = win.getComputedStyle(elem); + if (!zStyle) + continue; + var elemZindex = parseInt(zStyle.zIndex === 'auto' || !zStyle.zIndex || isNaN(Number(zStyle.zIndex)) ? '0' : zStyle.zIndex); + // If before ruleContext in DOM order, elem must have higher z-index to obscure + // If after ruleContext in DOM order, elem can obscure with equal or higher z-index + if ((before && elemZindex > zindex) || (!before && elemZindex >= zindex)) { + // Check if element has opaque background + var hasOpaqueBackground = false; + if (zStyle.background && zStyle.background !== 'none') { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.background); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + if (!hasOpaqueBackground && zStyle.backgroundColor) { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.backgroundColor); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + // If element has no content and no opaque background, skip it + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(elem) && !hasOpaqueBackground) { + continue; + } + return (0, IRule_1.RulePotential)("potential_obscured", []); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ 2644 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_visible = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var CSSUtil_1 = __webpack_require__(4919); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMMapper_1 = __webpack_require__(7507); +exports.element_tabbable_visible = { + id: "element_tabbable_visible", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_visible.html", + "pass": "element_tabbable_visible.html", + "potential_visible": "element_tabbable_visible.html" + } + }, + messages: { + "en-US": { + "group": "A tabbable element should be visible on the screen when it has keyboard focus", + "pass": "The tabbable element is visible on the screen", + "potential_visible": "Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.4.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // Get all needed styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, ["position", "clip"], ["", ":focus"]); + var defined_styles = allStyles[""]; + var onfocus_styles = allStyles[":focus"]; + if (bounds['height'] === 0 || bounds['width'] === 0) + return (0, IRule_1.RulePotential)("potential_visible", []); + if (defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)' + && !onfocus_styles['clip']) { + /** + * note that A user can select a checkbox and radio button by selecting the button or the label text. + * When a checkbox or radio button is clipped to 0 size, it is still available to a keyboard or a screen reader. + * The rule should be passed if the label text exists and the button on-focus style is defined by the user, + * which likely incurs the changes of the label style. + */ + if (nodeName === 'input' && (ruleContext.getAttribute('type') === 'checkbox' || ruleContext.getAttribute('type') === 'radio')) { + var label = CommonUtil_1.CommonUtil.getLabelForElement(ruleContext); + if (label && !CommonUtil_1.CommonUtil.isInnerTextEmpty(label)) { + // Get additional pseudo-class styles (reuse onfocus_styles from line 60) + var pseudoStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, [":focus-visible", ":focus-within", ":checked", ":focus"]); + var focus_visible_styles = pseudoStyles[":focus-visible"]; + var focus_within_styles = pseudoStyles[":focus-within"]; + var checked_styles = pseudoStyles[":checked"]; + var onfocus_styles_1 = pseudoStyles[":focus"]; + if (onfocus_styles_1 || focus_visible_styles || focus_within_styles || checked_styles) + return (0, IRule_1.RulePass)("pass"); + } + } + return (0, IRule_1.RulePotential)("potential_visible", []); + } + if (bounds['top'] >= 0 && bounds['left'] >= 0) + return (0, IRule_1.RulePass)("pass"); + var default_styles = getComputedStyle(ruleContext); + var top = bounds['top']; + var left = bounds['left']; + if (Object.keys(onfocus_styles).length === 0) { + // no onfocus position change, but could be changed from js + return (0, IRule_1.RulePotential)("potential_visible", []); + } + else { + // with onfocus position change + var positions = ['absolute', 'fixed']; + if (typeof onfocus_styles['top'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + top = onfocus_styles['top'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + top = Number.MIN_VALUE; + } + } + if (typeof onfocus_styles['left'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + left = onfocus_styles['left'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + left = Number.MIN_VALUE; + } + } + } + if (top >= 0 && left >= 0) + return (0, IRule_1.RulePass)("pass"); + else + return (0, IRule_1.RulePotential)("potential_visible", []); + } +}; + + +/***/ }, + +/***/ 429 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.embed_alt_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.embed_alt_exists = { + id: "embed_alt_exists", + context: "dom:embed", + refactor: { + "RPT_Embed_HasAlt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "embed_alt_exists.html", + "Potential_1": "embed_alt_exists.html", + "group": "embed_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the <embed> element has alternative content", + "group": "Provide alternative content for <embed> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt"); + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 4617 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.emoticons_alt_exists = void 0; +var IRule_1 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.emoticons_alt_exists = { + id: "emoticons_alt_exists", + context: "dom:*", + refactor: { + "WCAG20_Text_Emoticons": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "emoticons_alt_exists.html", + "Potential_1": "emoticons_alt_exists.html", + "group": "emoticons_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that emoticons have a text alternative", + "group": "Emoticons must have a short text alternative that describes their purpose" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_TWO + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + emoticons: { + value: [":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":D", "C:", + ":-D", ":D", "8D", "XD", "=D", "=3", "<=3", "<=8", "--!--", ":-(", ":(", ":c", ":<", ":[", + "D:", "D8", "D;", "D=", "DX", "v.v", ":-9", ";-)", ";)", "*)", ";]", ";D", ":-P", ":P", + ":-p", ":p", "=p", ":-Þ", ":Þ", ":-b", ":b", ":-O", ":O", "O_O", "o_o", "8O", "OwO", "O-O", + "0_o", "O_o", "O3O", "o0o ;o_o;", "o...o", "0w0", ":-/", ":/", ":\\", "=/", "=\\", ":S", ":|", + "d:-)", "qB-)", ":)~", ":-)>....", ":-X", ":X", ":-#", ":#", "O:-)", "0:3", "O:)", ":'(", ";*(", + "T_T", "TT_TT", "T.T", ":-*", ":*", "^o)", ">:)", ">;)", ">:-)", "B)", "B-)", "8)", "8-)", + "^>.>^", "^<.<^", "^>_>^", "^<_<^", "D:<", ">:(", "D-:<", ">:-(", ":-@[1]", ";(", "`_´", "D<", + "<3", "<333", "=^_^=", "=>.>=", "=<_<=", "=>.<=", "\\,,/", "\\m/", "\\m/\\>.</\\m/", "\\o/", "\\o o/", + "o/\\o", ":&", ":u" + ], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + var emoticons = validateParams.emoticons.value; + var passed = true; + var testText = ""; + var walkNode = ruleContext.firstChild; + while (walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + testText += " " + walkNode.nodeValue; + } + walkNode = walkNode.nextSibling; + } + if (testText.trim().length > 0) { + for (var j = 0; passed && j < emoticons.length; ++j) { + var emotIdx = testText.indexOf(emoticons[j]); + var eLngth = emoticons[j].length; + while (passed && emotIdx != -1) { + // Passes if: the emoticon is not preceded by whitespace, + // or the emoticon is not followed by whitespace unless it's punctuation, + // or it's in a pre, code, or script + passed = + (emotIdx > 0 && !/\s/.test(testText.substring(emotIdx - 1, emotIdx))) || + (emotIdx < testText.length - eLngth && !/\s/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)) && + !/[.,!'"?]/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1))); + // Allow usage of (: stuff :) since this is a comment in some languages + passed = passed || ((emoticons[j] == ":)" || emoticons[j] == "(:") && /\(\:.*\:\)/.test(testText)); + passed = passed || ((emoticons[j] == ";)" || emoticons[j] == "(;") && /\(\;.*\;\)/.test(testText)); + emotIdx = testText.indexOf(emoticons[j], emotIdx + 1); + } + } + } + if (!passed) { + // Don't trigger if we're not in the body or if we're in a script, pre, code + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "body"]); + passed = checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body"; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 5460 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.error_message_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var fragment_1 = __webpack_require__(5279); +var VisUtil_1 = __webpack_require__(3946); +exports.error_message_exists = { + id: "error_message_exists", + context: "dom:*[aria-invalid=true]", + refactor: { + "HAAC_Aria_ErrorMessage": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "error_message_exists.html", + "Fail_1": "error_message_exists.html", + "Fail_2": "error_message_exists.html", + "group": "error_message_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Custom error message has invalid reference 'id' value", + "Fail_2": "Custom error message is not visible", + "group": "A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aria_errMsgId = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-errormessage"); + // If aria-errormessage is not provided, then OUT_OF_SCOPE + if (!aria_errMsgId) { + return null; + } + var msg_ele = fragment_1.FragmentUtil.getById(ruleContext, aria_errMsgId); + // POF0: Invalid id reference + if (!msg_ele) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + // POF1: Referenced element is not visible + if (!VisUtil_1.VisUtil.isNodeVisible(msg_ele)) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ 3399 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_label_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var fragment_1 = __webpack_require__(5279); +var CacheUtil_1 = __webpack_require__(4566); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var AccNameUtil_1 = __webpack_require__(1950); +exports.fieldset_label_valid = { + id: "fieldset_label_valid", + context: "aria:group", + refactor: { + "group_withInputs_hasName": { + "Pass_1": "Pass_1", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_1": "fieldset_label_valid.html", + "Fail_1": "fieldset_label_valid.html", + "Fail_2": "fieldset_label_valid.html", + "group": "fieldset_label_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1": "Group/Fieldset \"{0}\" with an input has a unique name", + "Fail_1": "Group/Fieldset does not have an accessible name", + "Fail_2": "Group/Fieldset \"{0}\" has a duplicate name to another group", + "group": "Groups with nested inputs must have unique accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "landmark_group_input", null); + if (!formCache) { + formCache = { + groupsWithInputs: [], + groupsWithInputsComputedLabels: [], + }; + var allGroupsTemp = ownerDocument.querySelectorAll('fieldset,[role="group"]'); + var allGroups = Array.from(allGroupsTemp); + var groupsWithInputs = []; + for (var i = 0; i < allGroups.length; i++) { + // Loop over all the group nodes + if (allGroups[i].querySelector("input")) { + groupsWithInputs.push(allGroups[i]); + } + } + var groupsWithInputsComputedLabels = []; + for (var i = 0; i < groupsWithInputs.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(groupsWithInputs[i]); + // Loop over all the landmark nodes + groupsWithInputsComputedLabels.push( + /**ARIAMapper.computeName(groupsWithInputs[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + formCache.groupsWithInputs = groupsWithInputs; + formCache.groupsWithInputsComputedLabels = + groupsWithInputsComputedLabels; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "landmark_group_input", formCache); + } + // formCache.groupsWithInputs.forEach(element => { + // console.log("formCache.groupsWithInputs: " +element.id) + // }); + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels) + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels.length) + var ruleContextFoundIngroupsWithInputsFlag = false; + var computedName = ""; + if (!formCache.groupsWithInputs) { + // We do not have any groups with inputs. Therefore we should skip this rule trigger. + return null; + } + for (var i = 0; i < formCache.groupsWithInputs.length; i++) { + if (ruleContext.isSameNode(formCache.groupsWithInputs[i])) { + // We have found our ruleContext in the cache + ruleContextFoundIngroupsWithInputsFlag = true; + if (formCache.groupsWithInputsComputedLabels[i] === "" || + formCache.groupsWithInputsComputedLabels[i] === null) { + // console.log("Fail_1") + return (0, IRule_1.RuleFail)("Fail_1"); + } + var foundSameNameFlag = false; + for (var j = 0; j < formCache.groupsWithInputsComputedLabels.length; j++) { + if (i == j) { + continue; + } // We do not want to compare against ourselfs + if (formCache.groupsWithInputsComputedLabels[i] === + formCache.groupsWithInputsComputedLabels[j]) { + foundSameNameFlag = true; + } + } + if (foundSameNameFlag) { + // console.log("Fail_2") + return (0, IRule_1.RuleFail)("Fail_2", [ + formCache.groupsWithInputsComputedLabels[i], + ]); + } + computedName = formCache.groupsWithInputsComputedLabels[i]; + } + } + if (!ruleContextFoundIngroupsWithInputsFlag) { + // console.log("null return") + return null; + } + // console.log("Pass_1") + return (0, IRule_1.RulePass)("Pass_1", [computedName]); + } +}; + + +/***/ }, + +/***/ 3498 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_legend_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.fieldset_legend_valid = { + id: "fieldset_legend_valid", + context: "dom:fieldset", + refactor: { + "WCAG20_Fieldset_HasLegend": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "fieldset_legend_valid.html", + "Fail_1": "fieldset_legend_valid.html", + "Fail_2": "fieldset_legend_valid.html", + "Fail_3": "fieldset_legend_valid.html", + "group": "fieldset_legend_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<fieldset> element does not have a <legend>", + "Fail_2": "<fieldset> element has more than one <legend>", + "Fail_3": "<fieldset> element <legend> is empty", + "group": " <fieldset> elements should have a single, non-empty <legend> as a label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // In the case a legend is hidden, we should still trigger a violations for this + var legends = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "legend", true, false); + if (legends.length === 0) { + // Fieldset has NO Legend + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (legends.length > 1) { + // Fieldset has more than one legend + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (CommonUtil_1.CommonUtil.getInnerText(legends[0]).trim().length === 0) { + // Fieldset has legend but legend is empty + return (0, IRule_1.RuleFail)("Fail_3"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ 9629 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.figure_label_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var AccNameUtil_1 = __webpack_require__(1950); +exports.figure_label_exists = { + id: "figure_label_exists", + context: "dom:figure", + refactor: { + "HAAC_Figure_label": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "figure_label_exists.html", + "Fail_1": "figure_label_exists.html", + "group": "figure_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <figure> element does not have an associated label", + "group": "A <figure> element must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + //let passed = AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", []); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 733 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_font_color = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.form_font_color = { + id: "form_font_color", + context: "dom:form", + refactor: { + "RPT_Font_ColorInForm": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_font_color.html", + "Potential_1": "form_font_color.html", + "group": "form_font_color.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Check color is not used as the only visual means to convey which fields are required", + "group": "Combine color and descriptive markup to indicate required form fields" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var fonts = ruleContext.getElementsByTagName("font"); + if (fonts != null) { + for (var i = 0; i < fonts.length; ++i) { + passed = !fonts[i].hasAttribute("color"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 9797 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_interaction_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.form_interaction_review = { + id: "form_interaction_review", + context: "dom:form[target]", + refactor: { + "WCAG20_Form_TargetAndText": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_interaction_review.html", + "Potential_1": "form_interaction_review.html", + "group": "form_interaction_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that interacting with content will not open pop-up windows or change the active window without informing the user", + "group": "User should be informed in advance when interacting with content causes a change of context" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramWinText: { + value: ["new window"], + type: "array" + } + }; + var ruleContext = context["dom"].node; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr === "_parent" || tStr === "_self" || tStr === "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + for (var i = 0; !passed && i < validateParams.paramWinText.value.length; ++i) + if (textStr.indexOf(validateParams.paramWinText.value[i]) != -1) + passed = true; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 7156 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var fragment_1 = __webpack_require__(5279); +var CacheUtil_1 = __webpack_require__(4566); +exports.form_label_unique = { + id: "form_label_unique", + context: "dom:label[for]", + refactor: { + "RPT_Label_UniqueFor": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_label_unique.html", + "Fail_1": "form_label_unique.html", + "group": "form_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control has more than one label", + "group": "Form controls should have exactly one label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + var labelIds = CacheUtil_1.CacheUtil.getCache(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "RPT_Label_Single", {}); + var id = ruleContext.getAttribute("for"); + var passed = !(id in labelIds); + labelIds[id] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 3062 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_button_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var DOMWalker_1 = __webpack_require__(3864); +exports.form_submit_button_exists = { + id: "form_submit_button_exists", + context: "dom:form", + refactor: { + "WCAG20_Form_HasSubmit": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_button_exists.html", + "Potential_1": "form_submit_button_exists.html", + "group": "form_submit_button_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the <form> element has a submit button or an image button", + "group": "A <form> element should have a submit button or an image button" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + if (ruleContext.firstChild) { + // submit buttons are usually at the bottom - walk backwards + var nw = new DOMWalker_1.DOMWalker(ruleContext, true); + while (!passed && nw.prevNode() && nw.node != ruleContext) { + if (!nw.bEndTag) { + var nodeName = nw.node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = nw.elem().getAttribute("type"); + if (type) { + type = type.toLowerCase(); + } + passed = type === "submit" || type === "image"; + } + else if (nodeName === "button") { + passed = nw.elem().hasAttribute("type") && nw.elem().getAttribute("type").toLowerCase() === "submit"; + } + else if (nw.node.nodeType === 1) { + passed = AriaUtil_1.AriaUtil.hasRole(nw.node, "button"); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 3827 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_review = void 0; +var IRule_1 = __webpack_require__(461); +exports.form_submit_review = { + id: "form_submit_review", + context: "dom:select[onchange], dom:input[onchange]", + refactor: { + "RPT_Form_ChangeEmpty": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_review.html", + "Potential_1": "form_submit_review.html", + "group": "form_submit_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Confirm the form does not submit automatically without warning", + "group": "A form should not be submitted automatically without warning the user" + } + }, + /** + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + //deprecate the rule on Jun 10, 2024 + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onchange").trim().length === 0; + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 5498 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_src_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.frame_src_valid = { + id: "frame_src_valid", + context: "dom:frame, dom:iframe", + refactor: { + "Valerie_Frame_SrcHtml": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "frame_src_valid.html", + "Potential_1": "frame_src_valid.html", + "group": "frame_src_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify <frame> content is accessible", + "group": "A <frame> containing non-HTML content must be made accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "src") && + CommonUtil_1.CommonUtil.isHtmlExt(CommonUtil_1.CommonUtil.getFileExt(ruleContext.getAttribute("src"))); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 510 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_title_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AccNameUtil_1 = __webpack_require__(1950); +var VisUtil_1 = __webpack_require__(3946); +exports.frame_title_exists = { + id: "frame_title_exists", + context: "dom:frame, dom:iframe", + refactor: { + "WCAG20_Frame_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "frame_title_exists.html", + "Pass_0": "frame_title_exists.html", + "Fail_1": "frame_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "Inline frames must have a unique, non-empty 'title' attribute", + "Pass_0": "Rule Passed", + "Fail_1": "Inline frame does not have a 'title' attribute", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: "cae760", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) { + //if (CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ 7722 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_content_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.heading_content_exists = { + id: "heading_content_exists", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + refactor: { + "RPT_Header_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_content_exists.html", + "Fail_1": "heading_content_exists.html", + "group": "heading_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Heading element has descriptive text", + "Fail_1": "Heading element has no descriptive content", + "group": "Heading elements must provide descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.6"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 4597 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_markup_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.heading_markup_misuse = { + id: "heading_markup_misuse", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + dependencies: ["heading_content_exists"], + refactor: { + "RPT_Headers_FewWords": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_markup_misuse.html", + "Potential_1": "heading_markup_misuse.html", + "group": "heading_markup_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the heading element is a genuine heading", + "group": "Heading elements must not be used for presentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + headingLengthThresh: { + value: 20, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + var headingLengthThresh = validateParams.headingLengthThresh.value; + var passed = CommonUtil_1.CommonUtil.wordCount(CommonUtil_1.CommonUtil.getInnerText(ruleContext)) <= headingLengthThresh; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 2104 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_lang_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var ancestor_1 = __webpack_require__(6858); +var lang_1 = __webpack_require__(1043); +exports.html_lang_exists = { + id: "html_lang_exists", + context: "dom:html", + refactor: { + "WCAG20_Html_HasLang": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3", + "Fail_4": "Fail_4", + "Fail_5": "Fail_5", + "Potential_5": "Potential_5", + "Potential_6": "Potential_6" + } + }, + help: { + "en-US": { + "group": "html_lang_exists.html", + "Pass_0": "html_lang_exists.html", + "Fail_1": "html_lang_exists.html", + "Fail_2": "html_lang_exists.html", + "Fail_3": "html_lang_exists.html", + "Fail_4": "html_lang_exists.html", + "Fail_5": "html_lang_exists.html", + "Potential_5": "html_lang_exists.html", + "Potential_6": "html_lang_exists.html" + } + }, + messages: { + "en-US": { + "group": "Page must identify the default language of the document with a 'lang' attribute", + "Pass_0": "Page language detected as \"{0}\"", + "Fail_1": "Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes", + "Fail_2": "Page detected as XHTML, but does not have an 'xml:lang' attribute", + "Fail_3": "Page detected as HTML, but does not have a 'lang' attribute", + "Fail_4": "Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"", + "Fail_5": "Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"", + "Potential_5": "Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type", + "Potential_6": "Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "fail", + "Fail_4": "inapplicable", + "Fail_5": "inapplicable", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + }, + "5b7ae0": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "fail", + "Fail_5": "pass", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + var doctypeString = ruleContext.ownerDocument.doctype ? ruleContext.ownerDocument.doctype.publicId : ""; + if (!doctypeString) + doctypeString = ""; + var lang = ruleContext.getAttribute("lang"); + var langXML = ruleContext.getAttribute("xml:lang"); + if (doctypeString.includes('XHTML') && !doctypeString.includes("1.0")) { + if (!langXML) { + // XHTML != 1.0 (must have xml:lang + return (0, IRule_1.RuleFail)("Fail_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [langXML]); + } + } + else if (doctypeString.includes('XHTML') && doctypeString.includes("1.0")) { + // Handle XHTML 1.0 + // If neither is provided, it's a failure + if (!lang && !langXML) { + // XHTML and no lang + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (lang && langXML) { + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else if (lang) { + // XHTML and only lang (okay if only delivered via text/html) + return (0, IRule_1.RulePotential)("Potential_5"); + } + else { + // XHTML and only xml:lang (okay if only delivered via xml mime type) + return (0, IRule_1.RulePotential)("Potential_6"); + } + } + else { + if (!lang) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else if (lang && langXML) { + // HTML5 polyglot documents + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else { + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + } +}; + + +/***/ }, + +/***/ 8260 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_skipnav_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +exports.html_skipnav_exists = { + id: "html_skipnav_exists", + context: "dom:html", + refactor: { + "RPT_Html_SkipNav": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "html_skipnav_exists.html", + "Pass_0": "html_skipnav_exists.html", + "Potential_1": "html_skipnav_exists.html" + } + }, + messages: { + "en-US": { + "group": "Provide a way to bypass blocks of content that are repeated on multiple Web pages", + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a way to bypass blocks of content that are repeated on multiple Web pages" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var frames = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "frame"); + var headers = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "h1"); + if ((frames != null && frames.length > 0) || (headers != null && headers.length > 0)) { + // If frames or headings are used, pass + passed = true; + } + else { + // Look for skip anchors + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + var targets = {}; + for (var idx = 0; !passed && idx < anchors.length; ++idx) { + if (anchors[idx].hasAttribute("href")) { + var href = anchors[idx].href; + if (typeof href !== typeof "") { + if (href.baseVal) { + href = href.baseVal; + } + else { + href = ""; + } + } + var tmpLocation = void 0; + if (typeof (ruleContext.ownerDocument.locationFromDAP) != "undefined" && ruleContext.ownerDocument.locationFromDAP != null) { // DAP sets it + tmpLocation = ruleContext.ownerDocument.locationFromDAP; + } + else { // server scan has the location object + tmpLocation = ruleContext.ownerDocument.location; + } + var docHref = ""; + if (tmpLocation) { + docHref = tmpLocation.href; + } + // Fix weird bugs with how various parsers report on file: url's: + if (href.startsWith("file:///")) + href = "file:/" + href.substring("file:///".length); + if (docHref.startsWith("file:///")) + docHref = "file:/" + docHref.substring("file:///".length); + if (href.charAt(0) == "#" || href.startsWith(docHref + "#")) { + var target = CommonUtil_1.CommonUtil.getFileAnchor(href); + if (fragment_1.FragmentUtil.getById(ruleContext, target) != null) + passed = true; + else + targets[target] = true; + } + } + else if (anchors[idx].hasAttribute("name")) { + // Assume forward jumping targets + var name_1 = anchors[idx].getAttribute("name"); + if (name_1.indexOf("#") != -1) + name_1 = CommonUtil_1.CommonUtil.getFileAnchor(name_1); + passed = name_1 in targets; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 8920 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.iframe_interactive_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var DOMMapper_1 = __webpack_require__(7507); +exports.iframe_interactive_tabbable = { + id: "iframe_interactive_tabbable", + context: "dom:iframe", + dependencies: [], + help: { + "en-US": { + "group": "iframe_interactive_tabbable.html", + "pass": "iframe_interactive_tabbable.html", + "fail_invalid": "iframe_interactive_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Iframe with interactive content should not be excluded from tab order using tabindex", + "pass": "The iframe with interactive content is not excluded from the tab order using tabindex", + "fail_invalid": "The <iframe> with interactive content is excluded from tab order using tabindex" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["akn7bn"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // ignore if iframe is too small to be visible on screen + if (Math.max(bounds['height'], bounds['width']) < 30 || Math.min(bounds['height'], bounds['width']) < 15) + return null; + // pass iframe element does not have a tabindex attribute value that is a negative number + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) >= 0) + return (0, IRule_1.RulePass)("pass"); + // check iframe content + var iframElem = ruleContext; + if (!iframElem || !iframElem.contentDocument || !iframElem.contentDocument.documentElement) + return null; + // If the iframe is blocked by an open modal dialog it is effectively inert — inapplicable + var doc = ruleContext.ownerDocument; + if (doc) { + var dialogs = Array.from(doc.querySelectorAll("dialog")); + var blockedByModal = dialogs.some(function (d) { return d.matches(":modal") && !d.contains(ruleContext); }); + if (blockedByModal) + return null; + } + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RuleFail)("fail_invalid"); + return null; + } +}; + + +/***/ }, + +/***/ 1237 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagebutton_alt_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.imagebutton_alt_exists = { + id: "imagebutton_alt_exists", + context: "dom:input", + refactor: { + "WCAG20_Input_ExplicitLabelImage": { + "Pass_0": "Pass_0", + "Pass_1": "Pass_1", + "Pass_2": "Pass_2", + "Fail": "Fail" + } + }, + help: { + "en-US": { + "Pass_0": "imagebutton_alt_exists.html", + "Pass_1": "imagebutton_alt_exists.html", + "Pass_2": "imagebutton_alt_exists.html", + "Fail": "imagebutton_alt_exists.html", + "group": "imagebutton_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Image button provides alternative text using the 'alt' attribute", + "Pass_1": "Image button provides alternative text using an ARIA label", + "Pass_2": "Image button provides alternative text using the 'title' attribute", + "Fail": "The <input> element of type \"image\" has no text alternative", + "group": "The <input> element of type \"image\" should have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "59796f", + run: function (context, options, contextHierarchies) { + // See https://www.w3.org/WAI/WCAG22/Techniques/failures/F65 + var ruleContext = context["dom"].node; + if (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() != "image") { + return null; + } + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_1"); + } + else if (ruleContext.hasAttribute("title") && ruleContext.getAttribute("title").length > 0) { + return (0, IRule_1.RulePass)("Pass_2"); + } + return (0, IRule_1.RuleFail)("Fail"); + } +}; + + +/***/ }, + +/***/ 4101 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagemap_alt_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.imagemap_alt_exists = { + id: "imagemap_alt_exists", + context: "dom:img[usemap], dom:img[ismap]", + refactor: { + "HAAC_Img_UsemapAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "imagemap_alt_exists.html", + "Fail_1": "imagemap_alt_exists.html", + "group": "imagemap_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image map or child <area> has no text alternative", + "group": "An image map and each <area> element in an image map must have text alternative(s)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt") || + (!ruleContext.hasAttribute("ismap") && !CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "usemap")); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 275 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_background = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +exports.img_alt_background = { + id: "img_alt_background", + context: "dom:*", + refactor: { + "HAAC_BackgroundImg_HasTextOrTitle": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_background.html", + "Manual_1": "img_alt_background.html", + "group": "img_alt_background.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify important background image information has a text alternative in system high contrast mode", + "group": "Background images that convey important information must have a text alternative that describes the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var doc = ruleContext.ownerDocument; + var style = doc.defaultView.getComputedStyle(ruleContext); + if (style == null) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var backgroundImgs = style.backgroundImage; + var passed = true; + if (backgroundImgs != null && backgroundImgs != "" && backgroundImgs != 'none' && backgroundImgs != 'inherit') { + if (ruleContext.innerHTML != null && ruleContext.innerHTML.trim().length != 0) { + passed = false; + } + else { + var title = ruleContext.getAttribute('title'); + if (title != null && title.length != 0) + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 7601 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_decorative = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.img_alt_decorative = { + id: "img_alt_decorative", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_PresentationImgHasNonNullAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_decorative.html", + "Fail_1": "img_alt_decorative.html", + "group": "img_alt_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image designated as decorative has non-null 'alt' attribute", + "group": "Image designated as decorative must have 'alt=\"\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, "presentation") || AriaUtil_1.AriaUtil.hasRole(ruleContext, "none")) { + passed = ruleContext.getAttribute("alt").length == 0; + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 7541 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +exports.img_alt_misuse = { + id: "img_alt_misuse", + context: "dom:img, dom:area, dom:input", + refactor: { + "RPT_Img_AltCommonMisuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_misuse.html", + "Potential_1": "img_alt_misuse.html", + "group": "img_alt_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file name serves as a good inline replacement for the image", + "group": "'alt' attribute value must be a good inline replacement for the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + badText: { + value: ["short description"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + // Alt text check are elsewhere (See 41, 240, 455) + if (ruleContext.hasAttribute("alt")) { + var altText = ruleContext.getAttribute("alt").trim(); + if (altText.length > 0) { + var badText = validateParams.badText.value; + for (var i = 0; passed && i < badText.length; ++i) { + passed = altText.indexOf(badText[i]) == -1; + } + if (passed) { + var src = ruleContext.getAttribute((nodeName == "area") ? "href" : "src"); + // Allow it to pass if there's no src - can't determine these. + if (src != null) { + // Fail if the alt matches the src exactly + // Also fail if the alt has a . in it and either the src is in the alt or the alt is in the src + passed = src.trim() != altText && + (altText.indexOf(".") == -1 || (altText.indexOf(src) == -1 && src.indexOf(altText) == -1)); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 8274 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_null = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.img_alt_null = { + id: "img_alt_null", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_TitleEmptyWhenAltNull": { + "Pass_0": "pass", + "Fail_1": "fail_decorative" + } + }, + help: { + "en-US": { + "pass": "img_alt_null.html", + "fail_decorative": "img_alt_null.html", + "potential_aria_override": "img_alt_null.html", + "group": "img_alt_null.html" + } + }, + messages: { + "en-US": { + "pass": "Neither 'aria' nor 'title' attributes are used for the decorative image", + "fail_decorative": "The image 'alt' attribute is empty, but the 'title' attribute is not empty", + "potential_aria_override": "The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute", + "group": "When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_decorative"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["potential_aria_override"] + } + ], + act: [{ "46ca7f": { "potential_aria_override": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (ruleContext.getAttribute("alt").trim().length > 0) { + return null; + } + // We have a title, but alt is empty + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0) { + return (0, IRule_1.RulePotential)("potential_aria_override"); + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RuleFail)("fail_decorative"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 590 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_redundant = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMWalker_1 = __webpack_require__(3864); +var CommonUtil_1 = __webpack_require__(7139); +exports.img_alt_redundant = { + id: "img_alt_redundant", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_LinkTextNotRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_redundant.html", + "Fail_1": "img_alt_redundant.html", + "Fail_2": "img_alt_redundant.html", + "Fail_3": "img_alt_redundant.html", + "group": "img_alt_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Link text is repeated in an image 'alt' value within the same link", + "Fail_2": "Link text of previous link is repeated in image 'alt' value of a link", + "Fail_3": "Image 'alt' value within a link is repeated in link text of the link after", + "group": "The text alternative for an image within a link should not repeat the link text or adjacent link text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.4.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aNode = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "a"); + //If not in an anchor, Out of Scope + if (aNode == null) + return null; + var altText = ruleContext.getAttribute("alt").trim().toLowerCase(); + if (altText.length == 0) { + // If alt text is empty, there's no text to be redundant - let a_text_purpose + // trigger in that case. + // So Out of Scope for this rule + return null; + } + var innerText = aNode.innerText; + var linkText = ""; + if (innerText != null) { + linkText = innerText.trim().toLowerCase(); + } + if (linkText.length > 0) { + if (altText == linkText) { + // Text in link + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + var passed = true; + //alt is non-zero, but no link text - ensure adjacent link text isn't redundant + var walk = new DOMWalker_1.DOMWalker(aNode); + while (passed && walk.prevNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName === "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + // Text before image link + passed = (node.innerText || node.textContent || "").trim().toLowerCase() != altText; + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + walk = new DOMWalker_1.DOMWalker(aNode, true); + while (passed && walk.nextNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName == "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + passed = node.innerText.trim().toLowerCase() != altText; + } + } + if (!passed) { + // Text after image link + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ 8925 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +var AccNameUtil_1 = __webpack_require__(1950); +exports.img_alt_valid = { + id: "img_alt_valid", + context: "dom:img", + refactor: { + "WCAG20_Img_HasAlt": { + "pass": "pass", + "fail_blank_alt": "fail_blank_alt", + "fail_no_alt": "fail_no_alt", + "fail_blank_title": "fail_blank_title" + } + }, + help: { + "en-US": { + "pass": "img_alt_valid.html", + "fail_blank_alt": "img_alt_valid.html", + "fail_no_alt": "img_alt_valid.html", + "fail_blank_title": "img_alt_valid.html", + "group": "img_alt_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The image has an accessible name or is correctly marked as decorative or redundant", + "fail_blank_alt": "Image 'alt' attribute value consists only of blank space(s)", + "fail_no_alt": "The image has neither an accessible name nor is marked as decorative or redundant", + "fail_blank_title": "The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)", + "group": "Images must have accessible names unless they are decorative or redundant" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "23a2a8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If not visible to the screen reader, or can be ignored + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).trim().length !== 0) { + // the img has non-empty aria label + return (0, IRule_1.RulePass)("pass"); + } + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + // check title attribute + if (alt === null) { + // the img has no alt or attribute, examine the title attribute + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (title === null || title.length === 0) { + // no title or title is empty, examine alt further + if (alt === null) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext, false); + if (role === 'presentation' || role === 'none') + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_no_alt"); + } + if (alt.length === 0) + return (0, IRule_1.RulePass)("pass"); + } + else { + if (title.trim().length === 0) { + // title contains blank space only (title=" ") + return (0, IRule_1.RuleFail)("fail_blank_title"); + } + // title contains some text (title="some text") + return (0, IRule_1.RulePass)("pass"); + } + } + else { + if (alt.length === 0 || alt.trim().length > 0) { + // the img has empty alt (alt="") or non-empty alt (alt="some text") + return (0, IRule_1.RulePass)("pass"); + } + else { + // alt contains blank space only (alt=" ") + return (0, IRule_1.RuleFail)("fail_blank_alt"); + } + } + } +}; + + +/***/ }, + +/***/ 9234 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_ismap_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.img_ismap_misuse = { + id: "img_ismap_misuse", + context: "dom:img[ismap]", + refactor: { + "RPT_Img_UsemapValid": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_ismap_misuse.html", + "Potential_1": "img_ismap_misuse.html", + "group": "img_ismap_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Server-side image map hot-spots do not have duplicate text links", + "group": "Server-side image map hot-spots must have duplicate text links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = false; + if (ruleContext.hasAttribute("usemap")) { + var usemap = ruleContext.getAttribute("usemap"); + usemap = usemap.trim().toLowerCase(); + var idx = usemap.indexOf("#"); + if (idx != -1) + usemap = usemap.substr(idx + 1); + if (usemap.length > 0) { + var maps = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "map"); + for (var i = 0; !passed && i < maps.length; ++i) { + passed = maps[i].hasAttribute("name") && + maps[i].getAttribute("name").toLowerCase() == usemap; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 8617 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_longdesc_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.img_longdesc_misuse = { + id: "img_longdesc_misuse", + context: "dom:img[longdesc]", + refactor: { + "RPT_Img_LongDescription2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_longdesc_misuse.html", + "Potential_1": "img_longdesc_misuse.html", + "group": "img_longdesc_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)", + "group": " The 'longdesc' attribute must reference HTML content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var longdesc = ruleContext.getAttribute("longdesc"); + // if (longdesc is bad URL) passed = false; + var ext = CommonUtil_1.CommonUtil.getFileExt(longdesc); + var passed = ext.length != 0 && CommonUtil_1.CommonUtil.isHtmlExt(ext) + || longdesc.startsWith("#") + || longdesc.startsWith("http://") + || longdesc.startsWith("https://") + || longdesc.startsWith("data:"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 591 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +// This file is automatically generated by "npm run prebuild". Do not edit +__exportStar(__webpack_require__(2297), exports); +__exportStar(__webpack_require__(4401), exports); +__exportStar(__webpack_require__(4546), exports); +__exportStar(__webpack_require__(9292), exports); +__exportStar(__webpack_require__(9605), exports); +__exportStar(__webpack_require__(3987), exports); +__exportStar(__webpack_require__(8631), exports); +__exportStar(__webpack_require__(8025), exports); +__exportStar(__webpack_require__(1198), exports); +__exportStar(__webpack_require__(8001), exports); +__exportStar(__webpack_require__(5778), exports); +__exportStar(__webpack_require__(8118), exports); +__exportStar(__webpack_require__(2242), exports); +__exportStar(__webpack_require__(3673), exports); +__exportStar(__webpack_require__(5080), exports); +__exportStar(__webpack_require__(183), exports); +__exportStar(__webpack_require__(6805), exports); +__exportStar(__webpack_require__(1886), exports); +__exportStar(__webpack_require__(4078), exports); +__exportStar(__webpack_require__(5750), exports); +__exportStar(__webpack_require__(85), exports); +__exportStar(__webpack_require__(514), exports); +__exportStar(__webpack_require__(5310), exports); +__exportStar(__webpack_require__(9083), exports); +__exportStar(__webpack_require__(6049), exports); +__exportStar(__webpack_require__(5099), exports); +__exportStar(__webpack_require__(2759), exports); +__exportStar(__webpack_require__(3141), exports); +__exportStar(__webpack_require__(5131), exports); +__exportStar(__webpack_require__(5167), exports); +__exportStar(__webpack_require__(8115), exports); +__exportStar(__webpack_require__(5733), exports); +__exportStar(__webpack_require__(5782), exports); +__exportStar(__webpack_require__(6731), exports); +__exportStar(__webpack_require__(390), exports); +__exportStar(__webpack_require__(3900), exports); +__exportStar(__webpack_require__(1218), exports); +__exportStar(__webpack_require__(6734), exports); +__exportStar(__webpack_require__(9973), exports); +__exportStar(__webpack_require__(5711), exports); +__exportStar(__webpack_require__(3384), exports); +__exportStar(__webpack_require__(2762), exports); +__exportStar(__webpack_require__(5757), exports); +__exportStar(__webpack_require__(5232), exports); +__exportStar(__webpack_require__(1891), exports); +__exportStar(__webpack_require__(6142), exports); +__exportStar(__webpack_require__(4863), exports); +__exportStar(__webpack_require__(1440), exports); +__exportStar(__webpack_require__(1968), exports); +__exportStar(__webpack_require__(1617), exports); +__exportStar(__webpack_require__(3475), exports); +__exportStar(__webpack_require__(3370), exports); +__exportStar(__webpack_require__(9272), exports); +__exportStar(__webpack_require__(7735), exports); +__exportStar(__webpack_require__(3923), exports); +__exportStar(__webpack_require__(7521), exports); +__exportStar(__webpack_require__(1852), exports); +__exportStar(__webpack_require__(799), exports); +__exportStar(__webpack_require__(4614), exports); +__exportStar(__webpack_require__(5952), exports); +__exportStar(__webpack_require__(5395), exports); +__exportStar(__webpack_require__(1992), exports); +__exportStar(__webpack_require__(7955), exports); +__exportStar(__webpack_require__(9531), exports); +__exportStar(__webpack_require__(891), exports); +__exportStar(__webpack_require__(7446), exports); +__exportStar(__webpack_require__(6137), exports); +__exportStar(__webpack_require__(6839), exports); +__exportStar(__webpack_require__(8135), exports); +__exportStar(__webpack_require__(507), exports); +__exportStar(__webpack_require__(3566), exports); +__exportStar(__webpack_require__(5173), exports); +__exportStar(__webpack_require__(6027), exports); +__exportStar(__webpack_require__(7515), exports); +__exportStar(__webpack_require__(1704), exports); +__exportStar(__webpack_require__(5053), exports); +__exportStar(__webpack_require__(4681), exports); +__exportStar(__webpack_require__(8050), exports); +__exportStar(__webpack_require__(2644), exports); +__exportStar(__webpack_require__(429), exports); +__exportStar(__webpack_require__(4617), exports); +__exportStar(__webpack_require__(5460), exports); +__exportStar(__webpack_require__(3399), exports); +__exportStar(__webpack_require__(3498), exports); +__exportStar(__webpack_require__(9629), exports); +__exportStar(__webpack_require__(733), exports); +__exportStar(__webpack_require__(9797), exports); +__exportStar(__webpack_require__(7156), exports); +__exportStar(__webpack_require__(3062), exports); +__exportStar(__webpack_require__(3827), exports); +__exportStar(__webpack_require__(5498), exports); +__exportStar(__webpack_require__(510), exports); +__exportStar(__webpack_require__(7722), exports); +__exportStar(__webpack_require__(4597), exports); +__exportStar(__webpack_require__(2104), exports); +__exportStar(__webpack_require__(8260), exports); +__exportStar(__webpack_require__(8920), exports); +__exportStar(__webpack_require__(1237), exports); +__exportStar(__webpack_require__(4101), exports); +__exportStar(__webpack_require__(275), exports); +__exportStar(__webpack_require__(7601), exports); +__exportStar(__webpack_require__(7541), exports); +__exportStar(__webpack_require__(8274), exports); +__exportStar(__webpack_require__(590), exports); +__exportStar(__webpack_require__(8925), exports); +__exportStar(__webpack_require__(9234), exports); +__exportStar(__webpack_require__(8617), exports); +__exportStar(__webpack_require__(1939), exports); +__exportStar(__webpack_require__(7726), exports); +__exportStar(__webpack_require__(3142), exports); +__exportStar(__webpack_require__(1353), exports); +__exportStar(__webpack_require__(2631), exports); +__exportStar(__webpack_require__(8550), exports); +__exportStar(__webpack_require__(8853), exports); +__exportStar(__webpack_require__(3180), exports); +__exportStar(__webpack_require__(1382), exports); +__exportStar(__webpack_require__(953), exports); +__exportStar(__webpack_require__(2222), exports); +__exportStar(__webpack_require__(4678), exports); +__exportStar(__webpack_require__(7578), exports); +__exportStar(__webpack_require__(9964), exports); +__exportStar(__webpack_require__(6401), exports); +__exportStar(__webpack_require__(1174), exports); +__exportStar(__webpack_require__(9907), exports); +__exportStar(__webpack_require__(6032), exports); +__exportStar(__webpack_require__(5622), exports); +__exportStar(__webpack_require__(2240), exports); +__exportStar(__webpack_require__(4019), exports); +__exportStar(__webpack_require__(361), exports); +__exportStar(__webpack_require__(5960), exports); +__exportStar(__webpack_require__(5515), exports); +__exportStar(__webpack_require__(8752), exports); +__exportStar(__webpack_require__(8834), exports); +__exportStar(__webpack_require__(1025), exports); +__exportStar(__webpack_require__(9116), exports); +__exportStar(__webpack_require__(435), exports); +__exportStar(__webpack_require__(6640), exports); +__exportStar(__webpack_require__(2068), exports); +__exportStar(__webpack_require__(7322), exports); +__exportStar(__webpack_require__(5702), exports); +__exportStar(__webpack_require__(1961), exports); +__exportStar(__webpack_require__(3022), exports); +__exportStar(__webpack_require__(375), exports); +__exportStar(__webpack_require__(4658), exports); +__exportStar(__webpack_require__(4605), exports); +__exportStar(__webpack_require__(5294), exports); +__exportStar(__webpack_require__(3506), exports); +__exportStar(__webpack_require__(7475), exports); +__exportStar(__webpack_require__(8064), exports); +__exportStar(__webpack_require__(7942), exports); +__exportStar(__webpack_require__(2219), exports); +__exportStar(__webpack_require__(1473), exports); +__exportStar(__webpack_require__(1912), exports); +__exportStar(__webpack_require__(6539), exports); +__exportStar(__webpack_require__(4), exports); +__exportStar(__webpack_require__(5334), exports); +__exportStar(__webpack_require__(2173), exports); +__exportStar(__webpack_require__(8349), exports); +__exportStar(__webpack_require__(8142), exports); +__exportStar(__webpack_require__(3980), exports); +__exportStar(__webpack_require__(4701), exports); +__exportStar(__webpack_require__(18), exports); +__exportStar(__webpack_require__(9314), exports); +__exportStar(__webpack_require__(1667), exports); +__exportStar(__webpack_require__(9599), exports); +__exportStar(__webpack_require__(4672), exports); +__exportStar(__webpack_require__(4353), exports); +__exportStar(__webpack_require__(7147), exports); +__exportStar(__webpack_require__(1419), exports); +__exportStar(__webpack_require__(855), exports); +__exportStar(__webpack_require__(3420), exports); +__exportStar(__webpack_require__(408), exports); + + +/***/ }, + +/***/ 1939 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.input_autocomplete_valid = { + id: "input_autocomplete_valid", + context: "dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]", + refactor: { + "WCAG21_Input_Autocomplete": { + "Pass_0": "pass", + "Fail_1": "fail_inappropriate", + "Fail_2": "fail_invalid", + "Fail_attribute_incorrect": "fail_incorrect" + } + }, + help: { + "en-US": { + "group": "input_autocomplete_valid.html", + "pass": "input_autocomplete_valid.html", + "fail_inappropriate": "input_autocomplete_valid.html", + "fail_invalid": "input_autocomplete_valid.html", + "fail_incorrect": "input_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "group": "The 'autocomplete' attribute's token(s) must be appropriate for the input form field", + "pass": "The 'autocomplete' attribute's token(s) is appropriate for the input form field", + "fail_inappropriate": "The 'autocomplete' attribute's token(s) are not appropriate for the input form field", + "fail_invalid": "The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type", + "fail_incorrect": "The 'autocomplete' attribute has an incorrect value" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "73f2c2": { + "pass": "pass", + "fail_inappropriate": "fail", + "fail_invalid": "pass", + "fail_incorrect": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var autocompleteAttr = ruleContext.getAttribute("autocomplete").trim().toLowerCase(); + var tokens = autocompleteAttr.split(/\s+/); + if (tokens.length === 0 || autocompleteAttr.length === 0) { + return null; + } + var cache = { + "tokensOnOff": ["on", "off"], + "tokenOptionalSection": "section-", + "tokensOptionalPurpose": ["shipping", "billing"], + "tokensMandatoryGroup1_password": ["new-password", "current-password", "one-time-code"], + "tokensMandatoryGroup1_multiline": ["street-address"], + "tokensMandatoryGroup1_month": ["cc-exp"], + "tokensMandatoryGroup1_numeric": ["cc-exp-month", + "cc-exp-year", + "transaction-amount", + "bday-day", + "bday-month", + "bday-year"], + "tokensMandatoryGroup1_date": ["bday"], + "tokensMandatoryGroup1_url": ["url", "photo"], + "tokensMandatoryGroup1_text": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "organization-title", + "organization", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-csc", + "cc-type", + "transaction-currency", + "language", + "sex"], + "tokensMandatoryGroup1_all": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "new-password", + "current-password", + "organization-title", + "organization", + "street-address", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-exp", + "cc-exp-month", + "cc-exp-year", + "cc-csc", + "cc-type", + "transaction-currency", + "transaction-amount", + "language", + "bday", + "bday-day", + "bday-month", + "bday-year", + "sex", + "url", + "photo"], + "tokensOptionalGroup2": ["home", + "work", + "mobile", + "fax", + "pager"], + "tokensMandatoryGroup2_tel": ["tel"], + "tokensMandatoryGroup2_email": ["email"], + "tokensMandatoryGroup2_url": ["impp"], + "tokensMandatoryGroup2_text": ["tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension"], + "tokensMandatoryGroup2_all": ["tel", + "tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension", + "email", + "impp"], + "tokensOptionGroup1_webauthn": ["webauthn"] + }; + var valid_values = []; + for (var key in cache) + valid_values = valid_values.concat(cache[key]); + var foundMandatoryToken = false; + var foundRecognizedToken = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!tokens.every(function (r) { return valid_values.includes(r) || r.startsWith(cache['tokenOptionalSection']); })) + return (0, IRule_1.RuleFail)("fail_incorrect"); + var type = ruleContext.hasAttribute("type") ? ruleContext.getAttribute("type").trim().toLowerCase() : "text"; + var tokensMandatoryGroup1 = []; + var tokensMandatoryGroup2 = []; + var tokensOptionalGroup = []; + if (nodeName === "textarea" || nodeName === "select") { + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + if (nodeName === "textarea") + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + } + else if (nodeName === "input") { + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + // handle the various 'input' types + switch (type) { + // Disable check for input type=hidden for now based on scrum discussion + /* + case "hidden": + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + */ + case "text": + case "search": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_text.concat(cache.tokensMandatoryGroup1_password, cache.tokensMandatoryGroup1_url, cache.tokensMandatoryGroup1_numeric, cache.tokensMandatoryGroup1_month, cache.tokensMandatoryGroup1_date); + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + case "password": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_password; + break; + case "url": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_url; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_url; + break; + case "email": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_email; + break; + case "tel": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_tel; + break; + case "number": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_numeric; + break; + case "month": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_month; + break; + case "date": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_date; + break; + default: + // unsupported type for this rule. + return null; + } + } + else { + // should never get here. + return null; + } + // Disable check for input type=hidden for now based on scrum discussion + var autofillMantle = /* (nodeName==="input" && type==="hidden") ? "anchor" : */ "expectation"; + if (autofillMantle === "expectation") { + // check on|off for expectation mantle. + if (tokens.includes("on") || tokens.includes("off")) { + // on|off should be the only token + if (tokens.length === 1) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_invalid"); + } + } + } + // check detail autofill tokens + var currIndex = 0; + var currRecognizedIndex = 0; + // check optional 'section-*' tokens + if (tokens[currIndex].startsWith(cache.tokenOptionalSection) && + tokens[currIndex].length > 8) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check optional 'shipping|billing' tokens + if (tokens.length > currIndex && + cache.tokensOptionalPurpose.includes(tokens[currIndex])) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currIndex) { + // check mandatory group 1 + if (tokensMandatoryGroup1.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currIndex])) { + currIndex++; + } + // check mandatory group 2 + if (tokensMandatoryGroup2.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + } + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currRecognizedIndex) { + // check mandatory group 1 + if (cache.tokensMandatoryGroup1_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currRecognizedIndex])) { + currRecognizedIndex++; + } + // check mandatory group 2 + if (cache.tokensMandatoryGroup2_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + } + } + if (tokens.length > currIndex + currRecognizedIndex) { + // check optional tokens webauthn + if (tokensOptionalGroup.includes(tokens[currIndex + currRecognizedIndex])) { + currIndex++; + } + } + if ((tokens.length > currIndex && tokensOptionalGroup.includes(tokens[currIndex])) + || (tokens.length > currRecognizedIndex && tokensOptionalGroup.includes(tokens[currRecognizedIndex]))) { + currIndex++; + currRecognizedIndex++; + } + // Only pass if we have seen either of the mandatory groups and all tokens have been consumed + if (foundMandatoryToken && tokens.length === currIndex) { + return (0, IRule_1.RulePass)("pass"); + } + else if (foundRecognizedToken && tokens.length === currRecognizedIndex) { + return (0, IRule_1.RuleFail)("fail_incorrect"); + } + else { + return (0, IRule_1.RuleFail)("fail_inappropriate"); + } + } +}; + + +/***/ }, + +/***/ 7726 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_checkboxes_grouped = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var DOMWalker_1 = __webpack_require__(3864); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +var TableUtil_1 = __webpack_require__(9196); +exports.input_checkboxes_grouped = { + id: "input_checkboxes_grouped", + context: "dom:input[type=radio], dom:input[type=checkbox]", + refactor: { + "WCAG20_Input_RadioChkInFieldSet": { + "Pass_LoneNogroup": "pass_lonenogroup", + "Pass_Grouped": "pass_grouped", + "Pass_RadioNoName": "pass_radioNoName", + "Fail_ControlNameMismatch": "fail_controlnamemismatch", + "Fail_NotGroupedOtherGrouped": "fail_notgroupedothergrouped", + "Fail_NotGroupedOtherNotGrouped": "fail_notgroupedothernotgrouped", + "Fail_NotSameGroup": "fail_notsamegroup", + "Potential_LoneCheckbox": "potential_lonecheckbox", + "Potential_UnnamedCheckbox": "potential_unnamedcheckbox" + } + }, + help: { + "en-US": { + "group": "input_checkboxes_grouped.html", + "pass_lonenogroup": "input_checkboxes_grouped.html", + "pass_grouped": "input_checkboxes_grouped.html", + "pass_radiononame": "input_checkboxes_grouped.html", + "fail_controlnamemismatch": "input_checkboxes_grouped.html", + "fail_notgroupedothergrouped": "input_checkboxes_grouped.html", + "fail_notgroupedothernotgrouped": "input_checkboxes_grouped.html", + "fail_notsamegroup": "input_checkboxes_grouped.html", + "potential_lonecheckbox": "input_checkboxes_grouped.html", + "potential_unnamedcheckbox": "input_checkboxes_grouped.html" + } + }, + messages: { + "en-US": { + "group": "Related sets of radio buttons or checkboxes should be programmatically grouped", + "pass_lonenogroup": "{0} grouping not required for a control of this type", + "pass_grouped": "{0} input is grouped with other related controls with the same name", + "pass_radiononame": "Radio input is not grouped, but passes because it has no name to group with other radio inputs", + "fail_controlnamemismatch": "{0} input found that has the same name, \"{2}\" as a {1} input", + "fail_notgroupedothergrouped": "{0} input is not in the group with another {0} with the name \"{1}\"", + "fail_notgroupedothernotgrouped": "{0} input and others with the name \"{1}\" are not grouped together", + "fail_notsamegroup": "{0} input is in a different group than another {0} with the name \"{1}\"", + "potential_lonecheckbox": "Verify that this ungrouped checkbox input is not related to other checkboxes", + "potential_unnamedcheckbox": "Verify that this un-named, ungrouped checkbox input is not related to other checkboxes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var getGroup = function (e) { + var retVal = CommonUtil_1.CommonUtil.getAncestor(e, "fieldset") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "radiogroup") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "group") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "grid") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "table"); + if (!retVal) { + retVal = CommonUtil_1.CommonUtil.getAncestor(e, "table"); + if (retVal && !TableUtil_1.TableUtil.isDataTable(retVal)) { + retVal = null; + } + } + return retVal; + }; + // Only radio buttons and checkboxes are in scope + var ctxType = ruleContext.getAttribute("type").toLowerCase(); + // Determine which form we're in (if any) to determine our scope + var ctxForm = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement; + // Get data about all of the visible checkboxes and radios in the scope of this form + // and cache it for all of the other inputs in this scope + var formCache = CacheUtil_1.CacheUtil.getCache(ctxForm, "input_checkboxes_grouped", null); + if (!formCache) { + formCache = { + checkboxByName: {}, + radiosByName: {}, + nameToGroup: {}, + numCheckboxes: 0, + numRadios: 0 + }; + // Get all of the checkboxes in the form or body (but not nested in something else and not hidden) + // And get a mapping of these checkboxes to + var cWalker = new DOMWalker_1.DOMWalker(ctxForm, false, ctxForm, true); + var checkboxQ = []; + var radiosQ = []; + while (cWalker.nextNode()) { + if (!cWalker.bEndTag + && cWalker.node.nodeType === 1 + && cWalker.node.nodeName.toLowerCase() === "input" + && VisUtil_1.VisUtil.isNodeVisible(cWalker.node)) { + var type = cWalker.node.getAttribute("type"); + if (type === "checkbox") { + checkboxQ.push(cWalker.node); + } + else if (type === "radio") { + radiosQ.push(cWalker.node); + } + } + } + // let checkboxQ = ctxForm.querySelectorAll("input[type=checkbox]"); + for (var idx = 0; idx < checkboxQ.length; ++idx) { + var cb = checkboxQ[idx]; + if ((AriaUtil_1.AriaUtil.getAncestorWithRole(cb, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement) === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(cb)) { + var name_1 = cb.getAttribute("name") || ""; + (formCache.checkboxByName[name_1] = formCache.checkboxByName[name_1] || []).push(cb); + formCache.nameToGroup[name_1] = formCache.nameToGroup[name_1] || getGroup(cb); + ++formCache.numCheckboxes; + } + } + // Get all of the radios in the form or body (but not nested in something else and not hidden) + // let radiosQ = ctxForm.querySelectorAll("input[type=radio]"); + for (var idx = 0; idx < radiosQ.length; ++idx) { + var r = radiosQ[idx]; + var radCtx = (AriaUtil_1.AriaUtil.getAncestorWithRole(r, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement); + if (radCtx === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + var name_2 = r.getAttribute("name") || ""; + (formCache.radiosByName[name_2] = formCache.radiosByName[name_2] || []).push(r); + formCache.nameToGroup[name_2] = formCache.nameToGroup[name_2] || getGroup(r); + ++formCache.numRadios; + } + } + CacheUtil_1.CacheUtil.setCache(ctxForm, "input_checkboxes_grouped", formCache); + } + ///////////// Calculated everything, now check the various cases + var ctxName = ruleContext.getAttribute("name"); + var ctxGroup = getGroup(ruleContext); + ctxType = ctxType === "radio" ? "Radio" : "Checkbox"; + if (!ctxName || ctxName === "") { + // First process cases where the control is not named + if (ctxType === "Radio") { + // Radios without names don't act like groups, so don't enforce grouping + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_radiononame", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // Must be an unnamed checkbox + if (ctxGroup === null) { + if ((formCache.checkboxByName[""] || []).length > 1) { + return (0, IRule_1.RulePotential)("potential_unnamedcheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + else { + // Considering a named checkbox + var numRadiosWithName = (formCache.radiosByName[ctxName] || []).length; + var numCheckboxesWithName = (formCache.checkboxByName[ctxName] || []).length; + // Capitalize the input type for messages + if (numRadiosWithName > 0 && numCheckboxesWithName > 0) { + // We have a naming mismatch between different controls + return (0, IRule_1.RuleFail)("fail_controlnamemismatch", [ctxType, ctxType === "checkbox" ? "radio" : "checkbox", ctxName]); + } + else if (ctxType === "Radio" && (formCache.numRadios === 1 || numRadiosWithName === 1) + || ctxType === "Checkbox" && formCache.numCheckboxes === 1) { + // This is a lone control (either only control of this type on the page, or a radio button without any others by that name) + // We pass this control in all cases + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else if (ctxType === "Checkbox" && formCache.numCheckboxes > 1 && numCheckboxesWithName === 1) { + // We have only one checkbox with this name, but there are other checkboxes in the form. + // If we're not grouped, ask them to examine it + if (ctxGroup === null) { + return (0, IRule_1.RulePotential)("potential_lonecheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // We share a name with another similar control. Are we grouped together? + if (ctxGroup === null) { + if (formCache.nameToGroup[ctxName] !== null) { + // We're not grouped, but some control with the same name is in a group + return (0, IRule_1.RuleFail)("fail_notgroupedothergrouped", [ctxType, ctxName]); + } + else { + // None of us are grouped + return (0, IRule_1.RuleFail)("fail_notgroupedothernotgrouped", [ctxType, ctxName]); + } + } + else if (formCache.nameToGroup[ctxName] !== ctxGroup) { + // We're not in the main group with the others + return (0, IRule_1.RuleFail)("fail_notsamegroup", [ctxType, ctxName]); + } + else { + // We're all grouped up! + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + } +}; + + +/***/ }, + +/***/ 3142 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_fields_grouped = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.input_fields_grouped = { + id: "input_fields_grouped", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_InFieldSet": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "input_fields_grouped.html", + "Potential_1": "input_fields_grouped.html", + "group": "input_fields_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Use the <fieldset> element to group logically related input elements", + "group": "Groups of logically related input elements should be contained within a <fieldset> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger for other input types or if we're in a fieldset + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") + return (0, IRule_1.RulePass)("Pass_0"); + } + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "fieldset") != null) + return (0, IRule_1.RulePass)("Pass_0"); + // No fieldset - see if this input is all by itself - no need to group single inputs + var parent = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["form", "body"]); + var checkTypes = ["input", "textarea", "select"]; + var passed = true; + for (var i = 0; passed && i < checkTypes.length; ++i) { + var controls = parent.getElementsByTagName(checkTypes[i]); + for (var j = 0; passed && j < controls.length; ++j) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(controls[j])) { + continue; + } + // Note that textareas and selects will be called type='text' + var type = controls[j].hasAttribute("type") ? controls[j].getAttribute("type").toLowerCase() : "text"; + // Only fail if this is another control in the form and its type is another text-like input + passed = controls[j] == ruleContext || (type != "text" && type != "password" && type != "file"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 1353 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_haspopup_conflict = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.input_haspopup_conflict = { + id: "input_haspopup_conflict", + context: "dom:input[list][aria-haspopup]", + refactor: { + "input_haspopup_invalid": { + // "Pass": "pass", + "Potential_1": "potential_type_misuse", + "Potential_2": "potential_misuse" + } + }, + help: { + "en-US": { + "group": "input_haspopup_conflict.html", + // "pass": "input_haspopup_conflict.html", + "potential_type_misuse": "input_haspopup_conflict.html", + "potential_misuse": "input_haspopup_conflict.html", + "potential_list_notexist": "input_haspopup_conflict.html", + "fail_invalid_list_type": "input_haspopup_conflict.html", + "fail_invalid_list_elem": "input_haspopup_conflict.html" + } + }, + messages: { + "en-US": { + "group": "<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute", + // "pass": "The <input> element with a 'list' attribute does not use an explicit 'aria-haspopup' attribute", + "potential_type_misuse": "The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_misuse": "The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_list_notexist": "The list attribute for the <input> element is invalid", + "fail_invalid_list_type": "The list attribute for the <input> element with the type \"{0}\" is invalid", + "fail_invalid_list_elem": "The list attribute for the <input> element does not reference a datalist element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + // let "aria_role_valid" to handle invalid role. Only allowed role is combobox which is implicit. + if (roles && roles.length > 0 && !roles.includes('combobox')) + return null; + //triggering input types: text, search, tel, url, email, or missing or invalid + var yesTypes = ["text", "search", "tel", "url", "email", "date", "month", "week", "time", "datetime-local", "number", "range", "color"]; + var noTypes = ["file", "password", "checkbox", "radio", "submit", "reset", "image", "hidden", "button"]; + var attrValue = ruleContext.getAttribute("type"); + //missing input type for list but with aria_has_popup + if (!attrValue || attrValue.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_misuse"); + attrValue = attrValue.trim().toLowerCase(); + //invalid input types for list but with aria_has_popup + if (!yesTypes.includes(attrValue) && !noTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_misuse"); + // the list attribute is used for wrong input type + if (attrValue && noTypes.includes(attrValue)) + return (0, IRule_1.RuleFail)("fail_invalid_list_type"); + var list = ruleContext.getAttribute("list"); + // the list attribute is blank + if (!list || list.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_list_notexist"); + var listElem = ruleContext.ownerDocument.getElementById(list); + // the list element doesn't exist + if (!listElem) + return (0, IRule_1.RuleFail)("potential_list_notexist"); + // the list element is not a datalist element + if (listElem.nodeName.toLowerCase() !== 'datalist') + return (0, IRule_1.RuleFail)("fail_invalid_list_elem"); + // valid input types for list but with aria_has_popup + if (yesTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_type_misuse", [attrValue]); + // shouldn't get here + return; + } +}; + + +/***/ }, + +/***/ 2631 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_after = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMWalker_1 = __webpack_require__(3864); +var CommonUtil_1 = __webpack_require__(7139); +exports.input_label_after = { + id: "input_label_after", + context: "dom:input", + refactor: { + "WCAG20_Input_LabelAfter": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_after.html", + "Fail_1": "input_label_after.html", + "Fail_2": "input_label_after.html", + "group": "input_label_after.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Checkbox or radio button is nested in label, so label is not after the input control", + "Fail_2": "Label text is located before its associated checkbox or radio button element", + "group": "Checkboxes and radio buttons must have a label after the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var type = ""; + if (ruleContext.hasAttribute("type")) + type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "checkbox" && type != "radio") { + return null; + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem === null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + var passed; + if (value === -2) { + // input nested in label + passed = false; + var walkNode = new DOMWalker_1.DOMWalker(labelElem); + walkNode.node = ruleContext; + while (!passed && walkNode.nextNode()) { + passed = ((walkNode.node.nodeName.toLowerCase() === "#text" && walkNode.node.nodeValue.trim().length > 0) + || (walkNode.node.nodeName.toLowerCase() === "span" && walkNode.node.textContent.trim().length > 0)); + } + if (!passed) { + // Input nested in label and text before input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != 1) { + // label is before input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ 8550 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_before = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.input_label_before = { + id: "input_label_before", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_LabelBefore": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_before.html", + "Fail_1": "input_label_before.html", + "Fail_2": "input_label_before.html", + "group": "input_label_before.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Text input is nested in label such that input precedes the label text", + "Fail_2": "Label text is located after its associated text input or <select> element", + "group": "Text inputs and <select> elements must have a label before the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") { + return null; + } + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem == null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + if (value === -2) { + // ignore if no label or the content for the label is only from the nested input control + var text = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (text && text.trim().length > 0 && CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim() === text.trim()) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + // input nested in label + var passed = false; + var walkNode = ruleContext.previousSibling; + while (!passed && walkNode !== null) { + passed = ((walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0) + || (walkNode.nodeName.toLowerCase() == "span" && walkNode.textContent.trim().length > 0)); + walkNode = walkNode.previousSibling; + } + if (!passed) { + // Input nested in label and text after input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != -1) { + // label is after input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + // Haven't returned yet, then I pass + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ 8853 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +var AccNameUtil_1 = __webpack_require__(1950); +exports.input_label_exists = { + id: "input_label_exists", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]", + //dependencies: ["aria_role_redundant", "aria_role_valid"], + refactor: { + "WCAG20_Input_ExplicitLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_exists.html", + "Fail_1": "input_label_exists.html", + "Fail_2": "input_label_exists.html", + "group": "input_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control element <{0}> has no associated label", + "Fail_2": "Form control with \"{0}\" role has no associated label", + "group": "Each form control must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: https://github.com/IBMa/equal-access/issues/756 + act: ["97a4e1", "e086e5"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) { + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Determine the input type + var passed = true; + var type = "text"; + if (nodeName == "input" && ruleContext.hasAttribute("type")) { + type = ruleContext.getAttribute("type").toLowerCase(); + } + else if (nodeName === "button" || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "button")) { + type = "buttonelem"; + } + if (nodeName == "input" && type == "") { + type = "text"; + } + if (type === "image") { + // Handled by input_label_existsImage + return null; + } + /** + let POF = -1; + let textTypes = CommonUtil.input_text_types; + let buttonTypes = CommonUtil.form_button_types; + + let buttonTypesWithDefaults = ["reset", "submit"]; // 'submit' and 'reset' have visible defaults. + if (textTypes.indexOf(type) !== -1) { // If type is in the list + // Get only the non-hidden labels for elements, in the case that a label is hidden then it is a violation + // Note: label[for] does not work for ARIA defined inputs + let labelElem = ruleContext.hasAttribute("role") ? null : CommonUtil.getLabelForElementHidden(ruleContext, true); + let hasLabelElemContent = false; + if (labelElem) { + if (CommonUtil.hasInnerContentHidden(labelElem)) { + hasLabelElemContent = true; + } else if ((labelElem.getAttribute("aria-label") || "").trim().length > 0) { + hasLabelElemContent = true; + } else if (labelElem.hasAttribute("aria-labelledby")) { + let labelledByElem = FragmentUtil.getById(labelElem, labelElem.getAttribute('aria-labelledby')); + if (labelledByElem && !DOMUtil.sameNode(labelledByElem, labelElem) && CommonUtil.hasInnerContent(labelledByElem)) { + hasLabelElemContent = true; + } + } + } + passed = (!!labelElem && hasLabelElemContent) || + (!labelElem && CommonUtil.attributeNonEmpty(ruleContext, "title") || CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) || + AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.hasImplicitLabel(ruleContext); + if (!passed) POF = 2 + textTypes.indexOf(type); + + } else if (buttonTypes.indexOf(type) !== -1) { // If type is a button + if (buttonTypesWithDefaults.indexOf(type) !== -1 && !ruleContext.hasAttribute("value")) { + // 'submit' and 'reset' have visible defaults so pass if there is no 'value' attribute + passed = true; + } else { + passed = CommonUtil.attributeNonEmpty(ruleContext, "value") || AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.indexOf(type); + } + } else if (type == "buttonelem") { + // If I am an image and I have alt text - accessibility-web-engine#269 + let bAlt = false; + if (ruleContext.nodeName.toLowerCase() === "img" && ruleContext.hasAttribute("alt")) { + let alt = ruleContext.getAttribute("alt"); + if (alt.trim().length === 0) { + bAlt = false; + } else { + bAlt = true; + } + }; + passed = CommonUtil.hasInnerContentHidden(ruleContext) || AriaUtil.hasAriaLabel(ruleContext) || bAlt || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 1; + } + + //check if a native button is labelled + if (!passed && nodeName == "button") { + if (CommonUtil.hasImplicitLabel(ruleContext)) + passed = true; + else { + let label = CommonUtil.getLabelForElement(ruleContext); + if (label && CommonUtil.hasInnerContentHidden(label)) + passed = true; + } + } + + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + if (!passed && (buttonTypes.indexOf(type) !== -1)) { + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class") == "dijitOffScreen" && DOMWalker.parentElement(ruleContext).hasAttribute("widgetid")) { + // Special handling for dijit buttons + let labelId = DOMWalker.parentElement(ruleContext).getAttribute("widgetid") + "_label"; + let label = FragmentUtil.getById(ruleContext, labelId); + if (label != null) { + passed = CommonUtil.hasInnerContentHidden(label); + // This means I failed above also + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 4 + buttonTypes.indexOf(type); + } + } + } + + if (!passed && nodeName == "optgroup") { + passed = CommonUtil.attributeNonEmpty(ruleContext, "label"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 2; + } + if (!passed && nodeName == "option") { + // Is a non-empty value attribute also enough for an option element? + passed = CommonUtil.attributeNonEmpty(ruleContext, "label") || ruleContext.innerHTML.trim().length > 0; + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 3; + } + + if (!passed) + passed = AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) { + // check aria role to figure out if the accessible name can be from content + const roles = AriaUtil.getRoles(ruleContext, true); + //when multiple roles specified, only the first valid role (guaranteed by dependencies) is applied, and the others just as fallbacks + if (ARIADefinitions.designPatterns[roles[0]] && ARIADefinitions.designPatterns[roles[0]].nameFrom && ARIADefinitions.designPatterns[roles[0]].nameFrom.includes("contents")) + passed = CommonUtil.hasInnerContentHidden(ruleContext); + } + */ + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + passed = pair && pair.name && pair.name.trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (ruleContext.hasAttribute("role") && ruleContext.getAttribute("role").trim().length > 0) { + return (0, IRule_1.RuleFail)("Fail_2", ruleContext.getAttribute("role").split(" ")); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + } +}; + + +/***/ }, + +/***/ 3180 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_visible = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +var VisUtil_1 = __webpack_require__(3946); +var DOMUtil_1 = __webpack_require__(1686); +var AccNameUtil_1 = __webpack_require__(1950); +exports.input_label_visible = { + id: "input_label_visible", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox", + dependencies: ["input_label_exists"], + refactor: { + "WCAG20_Input_VisibleLabel": { + "Pass_0": "pass", + "Potential_1": "potential_no_label", + "potential_placeholder_only": "potential_placeholder_only" + } + }, + help: { + "en-US": { + "pass": "input_label_visible.html", + "potential_placeholder_only": "input_label_visible.html", + "potential_no_label": "input_label_visible.html", + "group": "input_label_visible.html" + } + }, + messages: { + "en-US": { + "pass": "The input element has an associated visible label", + "potential_placeholder_only": "The ‘placeholder’ is the only visible label", + "potential_no_label": "The input element does not have an associated visible label", + "group": "An input element must have an associated visible label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.5.3", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // if a control is in a table cell, the col headers can act as visible label, which is checked in table heading rule + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table")) + return null; + // custom widget submission is not in scope for this success criteria (IBMa/equal-access#204) if it is not associated with data entry + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role && role === "button" && nodeName !== 'input' && nodeName !== 'button') { + // likely a custom widget, skip if not associated with data entry + if (!CommonUtil_1.CommonUtil.getAncestor(ruleContext, "form")) + return null; + } + // when in a combobox, only look at the input textbox. + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox") || + nodeName === "input" || (nodeName === "select" && AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")))) { + return null; + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + // check visible label for input or button + if (nodeName === 'input' || nodeName === 'button') { + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'internal' || pair.nameFrom === 'alt')) + return (0, IRule_1.RulePass)("pass"); + } + // check if an alternative tooltip exists that can be made visible through mouseover + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'text' || pair.nameFrom === 'title')) + return (0, IRule_1.RulePass)("pass"); + // check if any visible text from the control. + // note that (1) the text doesn’t need to be associated with the control to form a relationship + // (2) the text doesn't need to follow accessible name requirement (e.g. nameFrom) + var text = CommonUtil_1.CommonUtil.getOnScreenInnerText(ruleContext); + if (text && text.length !== 0) + return (0, IRule_1.RulePass)("pass"); + // check if any descendant with an alternative tooltip that can be made visible through mouseover + // only consider img and svg, and other text content of the descendant is covered in the isInnerText above + var descendants = AriaUtil_1.AriaUtil.getAllDescendantsWithRoles(ruleContext, ["img", "graphics-document", "graphics-object", "graphics-symbol"], false, true); + if (descendants && descendants.length > 0) { + for (var d = 0; d < descendants.length; d++) { + if (CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "title") || CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "alt")) + return (0, IRule_1.RulePass)("pass"); + } + } + // check if there is a visible label pointed to by the aria-labelledby attribute. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby")) { + var theLabel = ruleContext.getAttribute("aria-labelledby"); + var labelValues = theLabel.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById && !DOMUtil_1.DOMUtil.sameNode(elementById, ruleContext) && VisUtil_1.VisUtil.isNodeVisible(elementById) && CommonUtil_1.CommonUtil.hasInnerContentHidden(elementById)) { + return (0, IRule_1.RulePass)("pass"); + } + } + } + if ((nodeName === "optgroup" || nodeName == "option") && (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'content'))) + return (0, IRule_1.RulePass)("pass"); + // Determine if this is referenced by a combobox. If so, the label belongs to the combobox + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + // check if a placeholder exists even though a placeholder text is not sufficient as a visible text + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) + return (0, IRule_1.RulePotential)("potential_placeholder_only"); + return (0, IRule_1.RulePotential)("potential_no_label"); + } +}; + + +/***/ }, + +/***/ 1382 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_onchange_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.input_onchange_review = { + id: "input_onchange_review", + context: "dom:input[onchange], dom:textarea[onchange], dom:select[onchange]", + refactor: { + "WCAG20_Input_HasOnchange": { + // "Pass_0": "pass", + "Potential_1": "potential_warning" + } + }, + help: { + "en-US": { + // "pass": "input_onchange_review.html", + "potential_warning": "input_onchange_review.html", + "group": "input_onchange_review.html" + } + }, + messages: { + "en-US": { + "group": "Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs", + // "pass": "The user is advised of the automatic form submission, new window opening, or focus change", + "potential_warning": "Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type === "hidden" || type === "submit" || type === "image" || type === "button" || type === "reset") + return null; + } + return (0, IRule_1.RulePotential)("potential_warning"); + } +}; + + +/***/ }, + +/***/ 953 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_placeholder_label_visible = void 0; +var IRule_1 = __webpack_require__(461); +exports.input_placeholder_label_visible = { + id: "input_placeholder_label_visible", + context: "dom:input[placeholder], dom:textarea[placeholder]", + refactor: { + "HAAC_Input_Placeholder": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_placeholder_label_visible.html", + "Potential_1": "input_placeholder_label_visible.html", + "Potential_2": "input_placeholder_label_visible.html", + "group": "input_placeholder_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "HTML5 placeholder is the only visible label", + "Potential_2": "Additional visible label referenced by 'aria-labelledby' is not valid", + "group": "HTML5 'placeholder' attribute must not be used as a visible label replacement" + } + }, + /** + * merge the rule into input_label_visible + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type == "hidden" || type == "button") { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("hidden")) { + var hidden = ruleContext.getAttribute("hidden"); + if (hidden == "" || hidden.toLowerCase() == "hidden") { // when hidden is empty in the element, "" is returned, same as it has a value of "". + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("aria-label")) { + return (0, IRule_1.RulePotential)("Potential_1"); + } + if (ruleContext.hasAttribute("aria-labelledby") && ruleContext.hasAttribute("id")) { + var id = ruleContext.getAttribute("id").trim(); + var refIds = ruleContext.getAttribute("aria-labelledby").trim().split(/\s+/); // separated by one or more white spaces + if (!refIds.includes(id)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ 2222 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_content_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +var DOMUtil_1 = __webpack_require__(1686); +exports.label_content_exists = { + id: "label_content_exists", + context: "dom:label", + refactor: { + "Valerie_Label_HasContent": { + "Pass_Regular": "Pass_Regular", + "Pass_AriaLabel": "Pass_AriaLabel", + "Pass_LabelledBy": "Pass_LabelledBy", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_Regular": "label_content_exists.html", + "Pass_AriaLabel": "label_content_exists.html", + "Pass_LabelledBy": "label_content_exists.html", + "Fail_1": "label_content_exists.html", + "group": "label_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_Regular": "<label> element has accessible name with inner content", + "Pass_AriaLabel": "<label> element has accessible name via 'aria-label'", + "Pass_LabelledBy": "<label> element has accessible name via 'aria-labelledby'", + "Fail_1": "The <label> element does not have descriptive text that identifies the expected input", + "group": "A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_Regular"); + } + else if ((ruleContext.getAttribute("aria-label") || "").trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_AriaLabel"); + } + else if (ruleContext.hasAttribute("aria-labelledby")) { + var labelElem = fragment_1.FragmentUtil.getById(ruleContext, ruleContext.getAttribute('aria-labelledby')); + if (labelElem && !DOMUtil_1.DOMUtil.sameNode(labelElem, ruleContext) && CommonUtil_1.CommonUtil.hasInnerContent(labelElem)) { + return (0, IRule_1.RulePass)("Pass_LabelledBy"); + } + } + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ 4678 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_name_visible = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +var VisUtil_1 = __webpack_require__(3946); +var CSSUtil_1 = __webpack_require__(4919); +var DOMWalker_1 = __webpack_require__(3864); +exports.label_name_visible = { + id: "label_name_visible", + context: "aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter", + refactor: { + "WCAG21_Label_Accessible": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "label_name_visible.html", + "Fail_1": "label_name_visible.html", + "group": "label_name_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Accessible name matches or contains the visible label text", + "Fail_1": "Accessible name does not match or contain the visible label text", + "group": "Accessible name must match or contain the visible label text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["2.5.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Review https://github.com/act-rules/act-rules.github.io/issues/1618 + // https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA24 + act: "2ee8b8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // pass if the visible text uses Material Icon font + if (CSSUtil_1.CSSUtil.isMaterialIconFont(ruleContext)) + return (0, IRule_1.RulePass)("Pass_0"); + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + var isInputButton = false; + //let buttonTypes = ["button", "reset", "submit"]; //"image" + var inputType = null; + if (nodeName === "input" && ruleContext.hasAttribute("type")) { + inputType = ruleContext.getAttribute("type").toLowerCase(); + if (CommonUtil_1.CommonUtil.form_button_types.indexOf(inputType) !== -1) { + isInputButton = true; + } + } + var theLabelBy = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-labelledby"); + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy) && !isInputButton) { + // skip the checks if it has an aria-labelledby since it takes precedence. + } + else { + var theLabel = null; + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy)) { + var labelValues = theLabelBy.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById) { + theLabel = CommonUtil_1.CommonUtil.getInnerText(elementById); + break; + } + } + } + else { + theLabel = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-label"); + } + if (!theLabel) { + return null; + } + var text = null; + if (isInputButton) { + /* Note: Disable the alt check in images until we get confirmation + if (inputType==="image" && ruleContext.hasAttribute("alt")){ + // use 'alt' attribute as visible text + text = ruleContext.getAttribute("alt"); + }else + */ + if (ruleContext.hasAttribute("value")) { + // use 'value' attribute as visible text + text = ruleContext.getAttribute("value"); + } + else { + // use default value + if (inputType === "submit" /*||inputType==="image"*/) { + text = "submit"; + } + else if (inputType === "reset") { + text = "reset"; + } + } + } + if (!text) { + // look for a <label> element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!labelElem) { + var parentNode = DOMWalker_1.DOMWalker.parentNode(ruleContext); + if (parentNode.nodeName.toLowerCase() === "label" /*&& RPTUtil.isFirstFormElement(parentNode, ruleContext)*/) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + labelElem = CommonUtil_1.CommonUtil.removeAllFormElementsFromLabel(parentClone); + } + } + var element = labelElem ? labelElem : ruleContext; + var elementsToSkipContentCheck = ["meter", "output", "progress", "select", "textarea"]; + if (!labelElem && elementsToSkipContentCheck.indexOf(nodeName) !== -1) { + text = ""; // skip content check for some elements + } + else { + // get the visible text only + text = CommonUtil_1.CommonUtil.getOnScreenInnerText(element); + } + /* Note: Disable this alt check in images for now until we get confirmation + // Look for the alt attribute of an image which is considered visible text. + let hasImgAlt = false; + if (element.firstChild != null) { + let nw = RPTUtil.new NodeWalker(element); + while (!hasImgAlt && nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + hasImgAlt = (nw.node.nodeName.toLowerCase() == "img" && RPTUtil.attributeNonEmpty(nw.node, "alt")); + if (hasImgAlt) { + text = text ? text + nw.node.getAttribute("alt") : nw.node.getAttribute("alt"); + } + } + } + */ + } + var nonalphanumeric = /[^a-zA-Z0-9]/g; + text = text.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedText = CommonUtil_1.CommonUtil.normalizeSpacing(text).toLowerCase(); // Leading and trailing whitespace and difference in case sensitivity should be ignored. + theLabel = theLabel.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(theLabel).toLowerCase(); + if (normalizedText.length > 1) { // skip non-text content. e.g., <button aria-label="close">X</button> + var location_1 = normalizedLabel.indexOf(normalizedText); + // Avoid matching partial words.e.g., text "name" should not match 'surname' or 'names' + if (location_1 >= 0 && normalizedLabel.length > normalizedText.length) { + var letters = /^[0-9a-zA-Z]+$/; + if ((location_1 + normalizedText.length) < normalizedLabel.length) { + // check ending + var theChar = normalizedLabel.charAt(location_1 + normalizedText.length); + if (theChar.match(letters)) { + passed = false; + } + } + if (passed && location_1 > 0) { + // check beginning + var theChar = normalizedLabel.charAt(location_1 - 1); + if (theChar.match(letters)) { + passed = false; + } + } + } + if (location_1 === -1) { // check that visible text content of the target is contained within its accessible name. + passed = false; + } + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 7578 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_ref_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var fragment_1 = __webpack_require__(5279); +var VisUtil_1 = __webpack_require__(3946); +exports.label_ref_valid = { + id: "label_ref_valid", + context: "dom:label[for]", + refactor: { + "WCAG20_Label_RefValid": { + "Pass_0": "pass", + "Fail_1": "fail_invalid" + } + }, + help: { + "en-US": { + "pass": "label_ref_valid.html", + "fail_invalid": "label_ref_valid.html", + "group": "label_ref_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element", + "fail_invalid": "The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element", + "group": "The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("for"); + var passed = false; + var target = fragment_1.FragmentUtil.getById(ruleContext, id); + if (target) { + // ignore if both label and control are invisible + if (!VisUtil_1.VisUtil.isNodeVisible(target) && !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + passed = true; + // handles null and undefined + if (!target.hasAttribute("role")) { + // Fail if we're pointing at something that is labelled by another mechanism + var nodeName = target.nodeName.toLowerCase(); + passed = nodeName == "input" || nodeName == "select" || nodeName == "textarea" + || nodeName == "button" || nodeName == "datalist" + || nodeName == "optgroup" || nodeName == "option" + || nodeName == "keygen" || nodeName == "output" + || nodeName == "progress" || nodeName == "meter" + || nodeName == "fieldset" || nodeName == "legend"; + if (target.nodeName.toLowerCase() == "input" && target.hasAttribute("type")) { + var type = target.getAttribute("type").toLowerCase(); + passed = type == "text" || type == "password" || type == "file" || + type == "checkbox" || type == "radio" || + type == "hidden" || type == "search" || type == "tel" || type == "url" || type == "email" || //HTML 5 + type == "date" || type == "number" || type == "range" || type == "image" || //HTML 5 + type == "time" || type == "color" || // HTML 5 + type == "datetime-local" || type == "month" || type == "week"; //HTML5.1 + } + } + // Add one more check to make sure the target element is NOT hidden, in the case the target is hidden + // flag a violation regardless of what the Check Hidden Content setting is. + if (passed && !VisUtil_1.VisUtil.isNodeVisible(target)) { + passed = false; + } + } + var retToken = []; + if (!passed) { + retToken.push(id); + } + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken]); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_invalid", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 9964 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_children_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var DOMWalker_1 = __webpack_require__(3864); +exports.list_children_valid = { + id: "list_children_valid", + context: "aria:group", + refactor: { + "HAAC_List_Group_ListItem": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_children_valid.html", + "Fail_1": "list_children_valid.html", + "group": "list_children_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "List component with \"group\" role has children that are not <listitem> elements", + "group": "List component with \"group\" role must limit children to <listitem> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parent = DOMWalker_1.DOMWalker.parentElement(ruleContext); + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(parent, "list")) { + return null; + } + var passed = true; + var children = ruleContext.children; + for (var i = 0; passed && i < children.length; i++) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "listitem"); + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 6401 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_markup_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +// Matches unordered list item prefixes: •, ◦, ▪, ▸, ►, ✓, ✗, ✦, –, —, *, -, o +var UNORDERED_BULLET_PATTERN = /^[ \t]*[•◦▪▸►✓✗✦\-–—*o][ \t]+\S/; +// Matches ordered list item prefixes: 1. 1) (1) a. a) (a) A. A) i. ii. iii. etc. +var ORDERED_ITEM_PATTERN = /^[ \t]*(?:\(?\d+[.)]\)?|\(?[a-zA-Z][.)]\)?|\(?(?:i{1,3}|iv|vi{0,3}|ix|xi{0,3}|xiv|xv)[.)]\)?)[ \t]+\S/i; +var LIST_ITEM_PATTERN = new RegExp(UNORDERED_BULLET_PATTERN.source + "|" + ORDERED_ITEM_PATTERN.source, "i"); +// Block-level elements that act as boundaries between independent content groups +var BLOCK_ELEMENTS = new Set([ + "blockquote", "center", "dir", "div", "form", + "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "br", "menu", "p", "pre", "table", + "section", "article", "aside", "nav", "header", "footer", + "figure", "figcaption", "details", "summary", "dialog", + "script", "style", "label", + "ul", "ol", "dl", "li", "dt", "dd" +]); +// Inline elements whose text content is treated as part of the surrounding text run +var INLINE_ELEMENTS = new Set([ + "a", "abbr", "acronym", "b", "bdo", "big", "br", "button", "cite", + "code", "dfn", "em", "i", "img", "input", "kbd", "label", "map", + "object", "output", "q", "samp", "select", "small", "span", + "strong", "sub", "sup", "textarea", "time", "tt", "u", "var" +]); +// Returns the combined text of a node and its inline descendants, normalised to single spaces +function getShallowText(node) { + var text = ""; + node.childNodes.forEach(function (child) { + var _a; + if (child.nodeType === Node.TEXT_NODE) { + text += (_a = child.nodeValue) !== null && _a !== void 0 ? _a : ""; + } + else if (child.nodeType === Node.ELEMENT_NODE) { + var tag = child.nodeName.toLowerCase(); + if (INLINE_ELEMENTS.has(tag)) { + text += getShallowText(child); + } + } + }); + return text.replace(/\s+/g, " "); +} +// Returns trimmed non-empty lines from a node, splitting on newlines and <br> boundaries +function getLinesFromNode(node) { + var lines = []; + function walk(n) { + var _a; + if (n.nodeType === Node.TEXT_NODE) { + ((_a = n.nodeValue) !== null && _a !== void 0 ? _a : "").split(/\r?\n/).forEach(function (p) { + var trimmed = p.trim(); + if (trimmed.length > 0) + lines.push(trimmed); + }); + } + else if (n.nodeType === Node.ELEMENT_NODE) { + var elem = n; + var tag = elem.nodeName.toLowerCase(); + if (tag === "br") { + lines.push("\x00"); + return; + } + if (BLOCK_ELEMENTS.has(tag)) + return; + // Skip elements with list-related or widget roles + var role = elem.getAttribute("role"); + if (role) { + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(elem, ["widget"]); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "rowheader"], roles); + if (roles.length > 0) + return; + } + n.childNodes.forEach(walk); + } + } + walk(node); + return lines.filter(function (l) { return l !== "\x00"; }); +} +// Returns the maximum number of consecutive list-item-like lines found among +// the direct children of parent, treating <br> and whitespace-only text as separators +function maxConsecutiveListItems(parent) { + var maxRun = 0; + var currentRun = 0; + var currentLineText = ""; // accumulate text across inline siblings until <br> + parent.childNodes.forEach(function (child) { + var _a; + var tag = child.nodeName.toLowerCase(); + if (tag === "br") { + // test the accumulated line + var trimmed_1 = currentLineText.trim(); + if (trimmed_1.length > 0) { + if (LIST_ITEM_PATTERN.test(trimmed_1)) { + maxRun = Math.max(maxRun, ++currentRun); + } + else { + currentRun = 0; + } + } + currentLineText = ""; + return; + } + if (child.nodeType === Node.TEXT_NODE) { + var raw = (_a = child.nodeValue) !== null && _a !== void 0 ? _a : ""; + if (raw.trim().length === 0) + return; + // if there are embedded newlines, flush on each + var segs = raw.split(/\r?\n/); + segs.forEach(function (seg, i) { + if (i > 0) { + var trimmed_2 = currentLineText.trim(); + if (trimmed_2.length > 0) { + if (LIST_ITEM_PATTERN.test(trimmed_2)) { + maxRun = Math.max(maxRun, ++currentRun); + } + else { + currentRun = 0; + } + } + currentLineText = ""; + } + currentLineText += seg; + }); + return; + } + if (child.nodeType === Node.ELEMENT_NODE) { + var elem = child; + if (BLOCK_ELEMENTS.has(tag)) { + // flush current line before block boundary + var trimmed_3 = currentLineText.trim(); + if (trimmed_3.length > 0 && LIST_ITEM_PATTERN.test(trimmed_3)) { + maxRun = Math.max(maxRun, ++currentRun); + } + currentLineText = ""; + currentRun = 0; + return; + } + if (INLINE_ELEMENTS.has(tag)) { + currentLineText += getShallowText(elem); + } + else { + currentRun = 0; + currentLineText = ""; + } + } + }); + // flush any remaining line at end of container + var trimmed = currentLineText.trim(); + if (trimmed.length > 0 && LIST_ITEM_PATTERN.test(trimmed)) { + maxRun = Math.max(maxRun, ++currentRun); + } + return maxRun; +} +// Returns true if 2+ consecutive <br>-separated lines within element match the list-item pattern +function hasBrSeparatedListLines(element) { + var run = 0; + for (var _i = 0, _a = getLinesFromNode(element); _i < _a.length; _i++) { + var line = _a[_i]; + if (LIST_ITEM_PATTERN.test(line)) { + if (++run >= 2) + return true; + } + else { + run = 0; + } + } + return false; +} +exports.list_markup_review = { + id: "list_markup_review", + context: "dom:*", + refactor: { + "RPT_List_UseMarkup": { + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "potential_list": "list_markup_review.html", + "group": "list_markup_review.html" + } + }, + messages: { + "en-US": { + "potential_list": "Verify this is a list and if so, modify to use proper HTML elements for the list", + "group": "Proper HTML elements should be used to create a list" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "style", "label"]) !== null) + return null; + // Only check block-level and table-cell elements first — + // td/th must be checked before the ancestor role check since + // table/row/cell ARIA roles would otherwise cause an early exit + if (nodeName === "td" || nodeName === "th") { + if (maxConsecutiveListItems(ruleContext) >= 2) + return (0, IRule_1.RulePotential)("potential_list"); + if (hasBrSeparatedListLines(ruleContext)) + return (0, IRule_1.RulePotential)("potential_list"); + return null; + } + // Skip elements that already have semantic list, widget, or structural roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget"]); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "rowheader"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + // Only check block-level elements to avoid duplicate reports + if (!BLOCK_ELEMENTS.has(nodeName) && nodeName !== "body" && nodeName !== "li") + return null; + if (["ul", "ol", "dl", "menu"].includes(nodeName)) + return null; + if (maxConsecutiveListItems(ruleContext) >= 2) + return (0, IRule_1.RulePotential)("potential_list"); + if (hasBrSeparatedListLines(ruleContext)) + return (0, IRule_1.RulePotential)("potential_list"); + return null; + } +}; + + +/***/ }, + +/***/ 1174 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_structure_proper = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.list_structure_proper = { + id: "list_structure_proper", + context: "dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt", + refactor: { + "RPT_List_Misuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_structure_proper.html", + "Potential_1": "list_structure_proper.html", + "group": "list_structure_proper.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "List element is missing or improperly structured", + "group": "List elements should only be used for lists of related items" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Get all the childrens of the ruleContext + var children = ruleContext.children; + if (nodeName == "dl") { + var first = ""; + var last = ""; + var walkChildren = ruleContext.firstChild; + passed = true; + var presentationalFound = false; + // If there are no childrens set as passed, since dl elements can have + // zero or more of: one or more dt elements, followed by one or more dd elements + if (!ruleContext.children || ruleContext.children.length == 0) { + passed = true; + } + else { + while (passed && walkChildren != null) { + if (walkChildren.nodeType == 1) { + var nodeName_1 = walkChildren.nodeName.toLowerCase(); + // While walking through the elements under dl, if we find a + // presentational element we move to the next element as presentational + // elements are allowed under list elements as they are only for + // formatting text nodes. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Only set to pass if we find dd or dt element, in the case of + // an element that is not supported we will catch it here. i.e. img + // element + passed = nodeName_1 == "dd" || nodeName_1 == "dt"; + // Set the first and last node depending on which is found first and last + if (first == "") + first = nodeName_1; + last = nodeName_1; + } + walkChildren = walkChildren.nextSibling; + } + // In the case that we have found dt and dd elements under dl we pass right away. + // In the case that there is no dt or dd element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && first == "dt" && last == "dd") || (passed && presentationalFound); + } + } + else if (nodeName == "li") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["ul", "ol", "dir", "menu"]) != null; + } + else if (nodeName == "dd" || nodeName == "dt") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "dl") != null; + } + else { + var walkChildren = ruleContext.firstChild; + // Zero or more li elements are permitted inside of <ol>, <ul> or <menu> elements now as per the html5 spec. This handles the case + // when there are zero elements under the <ol>, <ul> or <menu>. + if ((nodeName == "ul" || nodeName == "ol" || nodeName == "menu") && (!ruleContext.children || ruleContext.children.length == 0)) { + passed = true; + } + else { + var liFound = false; + var presentationalFound = false; + passed = true; + while (passed && walkChildren != null) { + // While walking through the list elements, if we find a + // presentational element we skip checking as presentational + // elements are allowed under list elements as they are only for + // formatting text. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Pass if the node type is anything but 1, or in the case that it is a li element. For any other node + // it will be caught here that element is not allowed under list node. + // Furthermore in the case that there is a template element with the parent being ul/ol don't flag a violation + passed = walkChildren.nodeType != 1 || walkChildren.nodeName.toLowerCase() == "li" || (walkChildren.nodeName.toLowerCase() == "template" && (nodeName == "ul" || nodeName == "ol")); + // Set li found to true if the current element (nodeType=1) is an li element + liFound = liFound || (walkChildren.nodeType == 1 && walkChildren.nodeName.toLowerCase() == "li"); + walkChildren = walkChildren.nextSibling; + } + // In the case that it has passed and also li element is found under list node, we pass right away. + // In the case that there is no li element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && liFound) || (passed && presentationalFound); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 9907 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.marquee_elem_avoid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.marquee_elem_avoid = { + id: "marquee_elem_avoid", + context: "dom:marquee", + refactor: { + "RPT_Marquee_Trigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Fail_1": "marquee_elem_avoid.html", + "group": "marquee_elem_avoid.html" + } + }, + messages: { + "en-US": { + "Fail_1": "Scrolling content found that uses the obsolete <marquee> element", + "group": "The <marquee> element is obsolete and should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ 6032 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_brief = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +exports.media_alt_brief = { + id: "media_alt_brief", + context: "dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]", + refactor: { + "RPT_Media_AltBrief": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_brief.html", + "Potential_1": "media_alt_brief.html", + "group": "media_alt_brief.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Text alternative is more than 150 characters", + "group": "Alternative text in 'alt' attribute should be brief (<150 characters)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + maxAlt: { + value: 150, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var altLength = ruleContext.getAttribute("alt").trim().length; + var passed = altLength <= validateParams.maxAlt.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 5622 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.media_alt_exists = { + id: "media_alt_exists", + context: "dom:area[alt], dom:embed[alt]", + refactor: { + "RPT_Media_AudioVideoAltFilename": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_exists.html", + "Potential_1": "media_alt_exists.html", + "group": "media_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Filename used as label for embedded audio or video", + "group": "Audio or video on the page must have a short text alternative that describes the media content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var uri = ""; + if (ruleContext.nodeName.toLowerCase() == "area") { + uri = ruleContext.getAttribute("href"); + } + else { + uri = ruleContext.getAttribute("src"); + } + if (uri == null) + uri = ""; + var ext = CommonUtil_1.CommonUtil.getFileExt(uri); + var isAudVid = ext.length != 0 && (CommonUtil_1.CommonUtil.isAudioExt(ext) || CommonUtil_1.CommonUtil.isVideoExt(ext)); + var altText = ruleContext.getAttribute("alt"); + var passed = !isAudVid || (altText.length > 0 && altText.indexOf(ext) == -1); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 2240 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_audio_transcribed = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.media_audio_transcribed = { + id: "media_audio_transcribed", + context: "dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object", + refactor: { + "RPT_Media_AudioTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_audio_transcribed.html", + "group": "media_audio_transcribed.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Provide transcripts for audio files", + "group": "Audio information should also be available in text form" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed; + var thisNode = ruleContext.nodeName.toLowerCase(); + if (thisNode == "bgsound") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isAudioObjEmbedLink(ruleContext); + } + if (passed) + return null; // Out of Scope + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 4019 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_autostart_controllable = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.media_autostart_controllable = { + id: "media_autostart_controllable", + context: "dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound", + refactor: { + "RPT_Embed_AutoStart": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_autostart_controllable.html", + "Potential_1": "media_autostart_controllable.html", + "group": "media_autostart_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically", + "group": "Mechanism must be available to pause or stop and control the volume of the audio that plays automatically" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed; + if (nodeName == "bgsound") { + passed = false; + } + else if (nodeName == "param") { + var content = ""; + if (ruleContext.hasAttribute("value")) + content = ruleContext.getAttribute("value").toLowerCase(); + passed = content.indexOf("0;") == 0 || + !(content.indexOf("true") != -1 || content.indexOf("1") != -1); + } + else if (nodeName == "embed") { + passed = true; + if (ruleContext.hasAttribute("flashvars")) { + var str = ruleContext.getAttribute("flashvars"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + if (passed && ruleContext.hasAttribute("src")) { + var str = ruleContext.getAttribute("src"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + } + if (passed && ruleContext.hasAttribute("autostart")) { + var val = ruleContext.getAttribute("autostart").toLowerCase(); + passed = val != 'true' && val != '1'; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 361 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +exports.media_keyboard_controllable = { + id: "media_keyboard_controllable", + context: "dom:audio, dom:video", + refactor: { + "HAAC_Audio_Video_Trigger": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_keyboard_controllable.html", + "Manual_1": "media_keyboard_controllable.html", + "group": "media_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify media using <audio> and/or <video> elements have keyboard accessible controls", + "group": "Media using <audio> and/or <video> elements must have keyboard accessible controls" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName == "audio" || nodeName === "video") { + passed = false; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 5960 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_live_captioned = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.media_live_captioned = { + id: "media_live_captioned", + context: "dom:embed, dom:object", + refactor: { + "RPT_Media_VideoObjectTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_live_captioned.html", + "group": "media_live_captioned.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify captions are provided for live media (streaming video with audio)", + "group": "Live media (streaming video with audio) should have captions for audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 5515 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_track_available = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.media_track_available = { + id: "media_track_available", + context: "dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object", + refactor: { + "RPT_Media_VideoReferenceTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_track_available.html", + "group": "media_track_available.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify availability of a user-selectable audio track with description of visual content", + "group": "Pre-recorded media should have an audio track that describes visual information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.3", "1.2.5"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName == "applet") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 8752 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_redirect_optional = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CacheUtil_1 = __webpack_require__(4566); +exports.meta_redirect_optional = { + id: "meta_redirect_optional", + context: "dom:meta[http-equiv][content]", + refactor: { + "WCAG20_Meta_RedirectZero": { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "fail_longrefresh" + } + }, + help: { + "en-US": { + "group": "meta_redirect_optional.html", + "pass": "meta_redirect_optional.html", + "fail": "meta_redirect_optional.html", + "fail_longrefresh": "meta_redirect_optional.html" + } + }, + messages: { + "en-US": { + "group": "Page should not automatically refresh without warning or option to turn it off or adjust the time limit", + "pass": "Rule Passed", + "fail": "Check page does not automatically refresh without warning or options", + "fail_longrefresh": "Check page does not automatically refresh without warning or options" + } + }, + /** + * deprecate WCAG AAA + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.4", "3.2.5"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }], + */ + rulesets: [{ + "id": [], + "num": ["2.2.4", "3.2.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + // Removed ACT bisz58 AAA + /**act: [{ + "bc659a" : { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "pass" + } + }],*/ + act: ["bisz58"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') { + return null; + } + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed or failed: only the first one tridders if multiple + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_redirect_optional_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_redirect_optional_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + else if (time < 72001) + return (0, IRule_1.RuleFail)("fail"); + return (0, IRule_1.RuleFail)("fail_longrefresh"); + } +}; + + +/***/ }, + +/***/ 8834 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_refresh_delay = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CacheUtil_1 = __webpack_require__(4566); +exports.meta_refresh_delay = { + id: "meta_refresh_delay", + context: "dom:meta[http-equiv][content]", + refactor: { + "RPT_Meta_Refresh": { + "Pass_0": "pass", + "Potential_1": "potential_refresh" + } + }, + help: { + "en-US": { + "group": "meta_refresh_delay.html", + "pass": "meta_refresh_delay.html", + "potential_refresh": "meta_refresh_delay.html" + } + }, + messages: { + "en-US": { + "group": "Pages should not refresh automatically", + "pass": "Pages do not refresh automatically", + "potential_refresh": "Verify page is not being caused to refresh automatically", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + //act: [ "bisz58", "bc659a" ], + act: ["bc659a"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed: the first one takes priority + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_refresh_delay_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_refresh_delay_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_refresh"); + } +}; + + +/***/ }, + +/***/ 1025 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_viewport_zoomable = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.meta_viewport_zoomable = { + id: "meta_viewport_zoomable", + context: "dom:meta[name][content]", + refactor: { + "meta_viewport_zoom": { + "Pass_0": "pass", + "Potential_1": "potential_zoomable" + } + }, + help: { + "en-US": { + "group": "meta_viewport_zoomable.html", + "pass": "meta_viewport_zoomable.html", + "potential_zoomable": "meta_viewport_zoomable.html" + } + }, + messages: { + "en-US": { + "group": "The 'meta[name=viewport]' should not prevent the browser zooming the content", + "pass": "The 'meta[name=viewport]' does not prevent the browser zooming the content", + "potential_zoomable": "Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "b4f0c3": { + "pass": "pass", + "potential_zoomable": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("name").toLowerCase() !== 'viewport') + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + // neither maximum-scale nor user-scalable (default yes) + if (!content || content.trim() === '' || (!content.includes('maximum-scale') && !content.includes('user-scalable'))) + return null; + var user_msg = null; + var max_msg = null; + var props = content.split(","); + var user_scale_value = 'yes'; + var maximum_scale_value = '2.0'; + for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { + var prop = props_1[_i]; + var pieces = prop.trim().split('='); + if (pieces.length < 2) + continue; + if (prop.includes('user-scalable')) { + user_msg = prop; + user_scale_value = pieces[1].trim(); + if (user_scale_value.startsWith("'") || user_scale_value.startsWith('"')) { + user_scale_value = user_scale_value.substring(1, user_scale_value.length - 1); + } + } + else if (prop.includes('maximum-scale')) { + max_msg = prop; + maximum_scale_value = pieces[1].trim(); + if (maximum_scale_value.startsWith("'") || maximum_scale_value.startsWith('"')) { + maximum_scale_value = maximum_scale_value.substring(1, maximum_scale_value.length - 1).trim(); + } + } + } + var value = Number(user_scale_value); + if (!isNaN(value)) { + if (value >= 1 || value <= -1) + user_scale_value = 'yes'; + } + var maximum_scale = 2.0; + value = Number(maximum_scale_value); + if (!isNaN(value)) { + if (value < 0) + maximum_scale = 2.0; + else + maximum_scale = value; + } + else { + if (maximum_scale_value === 'yes') + maximum_scale = 1.0; + else + maximum_scale = 0.1; + } + // user-scalable is not set to 'yes', ignore maximum_scale + if (user_scale_value !== 'yes') { + return (0, IRule_1.RulePotential)("potential_zoomable", [user_msg]); + } + // user-scalable is 'yes', but maximum_scale is too small + if (maximum_scale < 2.0) { + return (0, IRule_1.RulePotential)("potential_zoomable", [max_msg]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ 9116 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.noembed_content_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.noembed_content_exists = { + id: "noembed_content_exists", + context: "dom:noembed", + refactor: { + "Valerie_Noembed_HasContent": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "noembed_content_exists.html", + "Potential_1": "noembed_content_exists.html", + "group": "noembed_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Add descriptive text to the <noembed> element", + "group": "<noembed> elements should contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 435 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.object_text_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var AccNameUtil_1 = __webpack_require__(1950); +exports.object_text_exists = { + id: "object_text_exists", + context: "dom:object", + refactor: { + "WCAG20_Object_HasText": { + "pass": "pass", + "fail_no_text_alternative": "fail_no_text_alternative" + } + }, + help: { + "en-US": { + "group": "object_text_exists.html", + "pass": "object_text_exists.html", + "fail_no_text_alternative": "object_text_exists.html" + } + }, + messages: { + "en-US": { + "group": "<object> element must have a text alternative for the content rendered by the object", + "pass": "<object> element has a text alternative", + "fail_no_text_alternative": "An <object> element does not have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "8fc3b6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Detect if this object is of type text, by checking the object type in the case it is text then do not trigger this rule + if (ruleContext.hasAttribute("type") && (ruleContext.getAttribute("type")).indexOf("text") !== -1) { + return null; + } + // ignore if an explicit role is specified: including 'presentation', 'none', 'application', 'document' or 'img' + // this case will be covered in other rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + // Per ACT, ignore embedded HTML files + var data = ruleContext.getAttribute("data"); + var ext = data && typeof data === typeof "" ? data.substring(data.lastIndexOf(".")) : ""; + if (ext === ".html" || ext === ".htm") { + return null; + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //let passed = ARIAMapper.computeName(ruleContext).trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_no_text_alternative"); + } + } +}; + + +/***/ }, + +/***/ 6640 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var ancestor_1 = __webpack_require__(6858); +exports.page_title_exists = { + id: "page_title_exists", + context: "dom:html", + refactor: { + "WCAG20_Doc_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "page_title_exists.html", + "Pass_0": "page_title_exists.html", + "Fail_1": "page_title_exists.html", + "Fail_2": "page_title_exists.html", + "Fail_3": "page_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "The page should have a title that correctly identifies the subject of the page", + "Pass_0": "Rule Passed", + "Fail_1": "Missing <head> element so there can be no <title> element present", + "Fail_2": "Missing <title> element in <head> element", + "Fail_3": "The <title> element is empty (no innerHTML)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "2779a5": { + "Pass_0": "pass", + "Fail_1": "pass", + "Fail_2": "fail", + "Fail_3": "fail" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // First, find the head element + var findHead = ruleContext.firstChild; + var findTitle = null; + while (findHead != null) { + if (findHead.nodeName.toLowerCase() == "head") + break; + findHead = findHead.nextSibling; + } + var possibleTitles = ruleContext.querySelectorAll("title"); + for (var idx = 0; idx < possibleTitles.length; ++idx) { + if (!CommonUtil_1.CommonUtil.getAncestor(possibleTitles[idx], ["svg"])) { + findTitle = possibleTitles[idx]; + break; + } + } + if (findHead === null) { + if (!findTitle) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + if (findTitle === null) { // don't have title second PoF + return (0, IRule_1.RuleFail)("Fail_2"); + } + // if we get here we have <head> and <title> + if (findTitle != null && CommonUtil_1.CommonUtil.getInnerText(findTitle).trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { // <title> has no innerHTML third PoF + return (0, IRule_1.RuleFail)("Fail_3"); + } + } +}; + + +/***/ }, + +/***/ 2068 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.page_title_valid = { + id: "page_title_valid", + context: "dom:head dom:title", + refactor: { + "RPT_Title_Valid": { + "Pass_0": "Pass_0", + // "Fail_1": "Fail_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "page_title_valid.html", + // "Fail_1": "page_title_valid.html", + "Potential_2": "page_title_valid.html", + "group": "page_title_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + // "Fail_1": "Page <title> is empty", + "Potential_2": "Verify that using the filename as the page <title> value is descriptive", + "group": "Page <title> should be a descriptive title, rather than a filename" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var titleStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim(); + // allow .com, .net and .org + var titleStrLowercase = titleStr.toLowerCase(); + if (titleStrLowercase.includes(".com") || titleStrLowercase.includes(".net") || titleStrLowercase.includes(".org")) { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + if (titleStr.length === 0) { + // This is covered by page_title_exists + return null; //RuleFail("Fail_1"); + } + else { + var passed = !/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(titleStr); + if (!passed) { + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + } + } +}; + + +/***/ }, + +/***/ 7322 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_focus_blur_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.script_focus_blur_review = { + id: "script_focus_blur_review", + context: "dom:*[onfocus]", + refactor: { + "WCAG20_Script_FocusBlurs": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_focus_blur_review.html", + "Potential_1": "script_focus_blur_review.html", + "group": "script_focus_blur_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify script does not remove focus from content that normally receives focus", + "group": "Scripting must not remove focus from content that normally receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.7", "3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onfocus").indexOf(".blur(") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 5702 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_avoid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.script_onclick_avoid = { + id: "script_onclick_avoid", + context: "dom:*[onclick]", + dependencies: ["script_onclick_misuse"], + refactor: { + "RPT_Script_OnclickHTML2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_avoid.html", + "Potential_1": "script_onclick_avoid.html", + "group": "script_onclick_avoid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that 'onclick' events are not used in script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + // If there's an aria-role specified, don't trigger this. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role")) + return (0, IRule_1.RulePass)("Pass_0"); + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = nodeName == "a" || nodeName == "area" || nodeName == "input"; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 1961 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.script_onclick_misuse = { + id: "script_onclick_misuse", + context: "dom:*[onclick]", + refactor: { + "RPT_Script_OnclickHTML1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_misuse.html", + "Potential_1": "script_onclick_misuse.html", + "group": "script_onclick_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Possible use of a script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + failSubstring: { + value: [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml", + "location.href"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // If there's an aria-role specified, don't trigger this. + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role"); + // If this is an a or area, don't trigger if there's an href. + var nodeName = ruleContext.nodeName.toLowerCase(); + passed = passed || ((nodeName == "a" || nodeName == "area") && CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href")); + // If the guards failed, check to see if they're looking at links + if (!passed) { + var failSubstring = validateParams.failSubstring.value; + ; + var onclick_1 = ruleContext.getAttribute("onclick").toLowerCase(); + passed = true; + for (var i = 0; passed && i < failSubstring.length; ++i) { + passed = onclick_1.indexOf(failSubstring[i]) == -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 3022 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_select_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.script_select_review = { + id: "script_select_review", + context: "dom:select", + refactor: { + "WCAG20_Select_NoChangeAction": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_select_review.html", + "Potential_1": "script_select_review.html", + "group": "script_select_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that no change of context or action occurs when selection options in this component receive focus", + "group": "No changes of context should occur when a selection value receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !ruleContext.hasAttribute("onchange") && !ruleContext.hasAttribute("onfocus"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 375 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.select_options_grouped = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.select_options_grouped = { + id: "select_options_grouped", + context: "dom:select", + refactor: { + "WCAG20_Select_HasOptGroup": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "select_options_grouped.html", + "Potential_1": "select_options_grouped.html", + "group": "select_options_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Group of related options may need <optgroup>", + "group": "Groups of related options within a selection list should be grouped with <optgroup>" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramNumOptions: { + value: 10, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + // Handle the cases where optgroup is hidden, which should trigger a violations + // but in the case that Check hidden option is set then should not trigger a violation. + var passed = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "optgroup", false, true).length > 0 || + CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "option", false, true).length <= + validateParams.paramNumOptions.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 4658 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_described = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.skip_main_described = { + id: "skip_main_described", + context: "dom:body", + dependencies: ["skip_main_exists"], + refactor: { + "WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_described.html", + "Potential_1": "skip_main_described.html", + "group": "skip_main_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that if this hyperlink skips content, the description communicates where it links to", + "group": "The description of a hyperlink used to skip content must communicate where it links to" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramSkipText: { + value: ["skip", "jump"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var links = doc.links; + // Skip link should be the first one on the page with an href attribute (i.e., links[0]) + // also if the first link is hidden then we should also trigger a violation. + if (links && links.length > 0 && VisUtil_1.VisUtil.isNodeVisible(links[0])) { + var testText = CommonUtil_1.CommonUtil.getInnerText(doc.links[0]).toLowerCase(); + for (var i = 0; !passed && i < validateParams.paramSkipText.value.length; ++i) { + passed = testText.indexOf(validateParams.paramSkipText.value[i]) != -1; + } + } + else + passed = false; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 4605 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var ancestor_1 = __webpack_require__(6858); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.skip_main_exists = { + id: "skip_main_exists", + context: "dom:body", + refactor: { + "WCAG20_Body_FirstASkips_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_exists.html", + "Fail_1": "skip_main_exists.html", + "group": "skip_main_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The page does not provide a way to quickly navigate to the main content (ARIA \"main\" landmark or a skip link)", + "group": "Pages must provide a way to skip directly to the main content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + // Skip anchor should be the first one on the page with an href attribute + var testAnchor = null; + for (var i = 0; i < anchors.length; ++i) { + if (anchors[i].hasAttribute("href") && VisUtil_1.VisUtil.isNodeVisible(anchors[i])) { + testAnchor = anchors[i]; + break; + } + } + // Pull out the target id + var targetId = null; + if (testAnchor != null) { + var hrefStr = testAnchor.getAttribute("href"); + var idx = hrefStr.indexOf("#"); + if (idx != -1) { + targetId = hrefStr.substring(idx + 1); + } + } + // Determine if there is an element id or named anchor on the page with this + // target id. + if (targetId != null) { + passed = doc.getElementById(targetId) != null; + for (var i = 0; !passed && i < anchors.length; ++i) { + if (!anchors[i].hasAttribute("href") && + anchors[i].hasAttribute("name") && + anchors[i].getAttribute("name") == targetId) { + passed = true; + } + } + } + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 5294 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_background_decorative = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.style_background_decorative = { + id: "style_background_decorative", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Style_BackgroundImage": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_background_decorative.html", + "Potential_1": "style_background_decorative.html", + "group": "style_background_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the CSS background image does not convey important information", + "group": "Images included by using CSS alone must not convey important information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet") { + // External stylesheet - trigger + passed = CommonUtil_1.CommonUtil.triggerOnce(ruleContext, "style_background_decorative", false); + } + if (passed && nodeName === "style" || ruleContext.hasAttribute("style")) { + var styleText = void 0; + if (nodeName === "style") + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + else + styleText = ruleContext.getAttribute("style"); + var bgMatches = styleText.match(/background:[^;]*/g); + if (bgMatches !== null) { + for (var i = 0; passed && i < bgMatches.length; ++i) + passed = bgMatches[i].indexOf("url(") === -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 3506 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_before_after_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CSSUtil_1 = __webpack_require__(4919); +/** + * Description: Trigger if :before and :after are used in CSS (Internal and External) with content + * Origin: WCAG 2.0 F87 + */ +exports.style_before_after_review = { + id: "style_before_after_review", + context: "dom:style, dom:link", + refactor: { + "WCAG20_Style_BeforeAfter": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_before_after_review.html", + "Pass_0": "style_before_after_review.html", + "Potential_1": "style_before_after_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content", + "Pass_0": "Rule Passed", + "Potential_1": "Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content" + } + }, + rulesets: [{ + // Turn off the rule due to the obsolete requirement + //id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + id: [], + num: "1.3.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + //check Internal styles + if (ruleContext.nodeName.toLowerCase() === "style") { + var css = CSSUtil_1.CSSUtil.getCSSStyle(ruleContext); + for (var i = 0; passed && i < css.length; ++i) { + // Guard against bad CSS + if (css[i].selector) { + passed = (css[i].selector.indexOf(":before") === -1 && css[i].selector.indexOf(":after") === -1) || + !("content" in css[i].values) || css[i].values["content"].trim().length === 0 || css[i].values["content"].trim() === "\"\"" + || css[i].values["content"].trim() === "\'\'" || css[i].values["content"].trim() === "none" || css[i].values["content"].trim() === "attr(x)" + || css[i].values["content"].trim() === "attr(y)"; + } + } + // check special rules in the stylesheets + if (passed) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + // check @media rules + // + // The check 'if (styleRule instanceof CSSMediaRule)' doesn't work when run in Karma(but works in DAP) + // so let's access the type directly as a workaround + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var styleMediaRule = styleRule; + var mediaRules = styleMediaRule.cssRules; + if (mediaRules) { + for (var rIndex = 0; passed && rIndex < mediaRules.length; rIndex++) { + var mRule = mediaRules[rIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + // check import rules + else if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var rules = styleImportRule.styleSheet.cssRules ? + styleImportRule.styleSheet.cssRules : + styleImportRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + // check @media rules + if (importedRule.type && importedRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = importedRule.cssRules; + if (mediaRules) { + for (var mIndex = 0; mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (importedRule.selectorText !== null && importedRule.selectorText !== undefined) { + var rule = importedRule.selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = importedRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + } + //check external styles + if (ruleContext.nodeName.toLowerCase() === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check @media rules + if (ruleFromLink.type && ruleFromLink.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = ruleFromLink.cssRules; + if (mediaRules) { + for (var mIndex = 0; passed && mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var ruleSelTxt = mRule.selectorText.toLowerCase(); + if (ruleSelTxt.indexOf(":before") !== -1 || ruleSelTxt.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (rules[rIndex].selectorText !== null && rules[rIndex].selectorText !== undefined) { + var rule = rules[rIndex].selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = rules[rIndex].style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 7475 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_color_misuse = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMWalker_1 = __webpack_require__(3864); +var CacheUtil_1 = __webpack_require__(4566); +exports.style_color_misuse = { + id: "style_color_misuse", + context: "dom:style, dom:*[style], dom:font[color], dom:link", + refactor: { + "RPT_Style_ColorSemantics1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_color_misuse.html", + "Pass_0": "style_color_misuse.html", + "Potential_1": "style_color_misuse.html" + } + }, + messages: { + "en-US": { + "group": "Combine color and descriptive markup to convey information", + "Pass_0": "Rule Passed", + "Potential_1": "Verify color is not used as the only visual means of conveying information" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var importRules = styleImportRule.styleSheet.cssRules ? styleImportRule.styleSheet.cssRules : styleImportRule.styleSheet.rules; + for (var rIndex = 0; rIndex < importRules.length; rIndex++) { + var iRule = importRules[rIndex]; + styleText += iRule.cssText; + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + else if (ruleContext.hasAttribute("style")) { + styleText = ruleContext.getAttribute("style").toLowerCase(); + } + else if (nodeName === "link" && //check external styles + ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && + ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var rIndex = 0; rIndex < rules.length; rIndex++) { + styleText += rules[rIndex].cssText; + } + } + catch (e) { + // Silence css access issues + } + } + } + } + var passed = true; + // Defect 1022: Find uses of 'color' and '*background*' only + var isBgUsed = styleText.match(/\bbackground\b/i); + var theColorStyleToCheck = styleText.replace(/-color/g, ""); + var isColorUsed = theColorStyleToCheck.match(/\bcolor\b/i); + if (ruleContext.hasAttribute("color") || isColorUsed || isBgUsed) { + var goodTagNames = { + "em": "", "strong": "", "cite": "", "dfn": "", + "code": "", "samp": "", "kbd": "", "var": "", "abbr": "", "acronym": "" + }; + // Color used � are there semantics involved? + passed = nodeName in goodTagNames || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, goodTagNames) !== null; + if (!passed && ruleContext.hasChildNodes()) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (!passed && nw.nextNode() && nw.node !== ruleContext) { + passed = nw.node.nodeName.toLowerCase() in goodTagNames; + } + } + } + // Trigger only once + if (!passed) { + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_color_misuse", false); + passed = triggered; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_color_misuse", true); + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 8064 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_focus_visible = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CSSUtil_1 = __webpack_require__(4919); +var ColorUtil_1 = __webpack_require__(3883); +exports.style_focus_visible = { + id: "style_focus_visible", + context: "dom:*", + refactor: { + "RPT_Style_HinderFocus1": { + "Potential_1": "potential_focus_not_visible" + } + }, + help: { + "en-US": { + "group": "style_focus_visible.html", + "potential_focus_not_visible": "style_focus_visible.html", + "pass_focus_visible": "style_focus_visible.html" + } + }, + messages: { + "en-US": { + "group": "The keyboard focus indicator should be visible when default border or outline is modified by CSS", + "potential_focus_not_visible": "Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'", + "pass_focus_visible": "The keyboard focus indicator is visible or is not changed from the browser default" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.7", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + skipNodes: { + value: ["table"], + type: "[string]" + }, + checkParams: { + value: ["border", "border-width", "border-style", + "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", + "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", + "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", + "outline", "outline-width", "outline-color", "outline-style"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext) || validateParams.skipNodes.value.includes(ruleContext.nodeName.toLowerCase())) { + return null; + } + // Get all styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, ["", ":focus", ":focus-visible", ":focus-within"]); + var normalStyles = allStyles[""]; // consider both user-defined and browser default + var focusStyles = []; + focusStyles.push(allStyles[":focus"]); + focusStyles.push(allStyles[":focus-visible"]); + focusStyles.push(allStyles[":focus-within"]); + // if focus style is defined + var styleObj = focusStyles[0]; + if (Object.keys(styleObj).length > 0) { + //pass if outline is not defined at all, browser will override + if (((!normalStyles["outline-width"] && !normalStyles["outline-style"]) + || (normalStyles["outline-width"] === '0px' || normalStyles["outline-style"] === 'none')) + && (!styleObj["outline-style"] || styleObj["outline-style"] !== 'none')) + return (0, IRule_1.RulePass)("pass_focus_visible"); + var noneStyle = false; + var numOtherStyle = 0; + for (var focusStyle in styleObj) { + if (validateParams.checkParams.value.includes(focusStyle)) { + /** + * failure case: + * 1. focus outline or border style is none and no other style (color or width) defined + * 2. focus outline or border style is same with the normal + * 3. size in focus is same or smaller than default + * 4. color contrast in focus is better + */ + var focusStyleValue = styleObj[focusStyle]; + var normalStyleValue = normalStyles[focusStyle]; + if (focusStyle.includes("style")) { + if (focusStyleValue === "none") + noneStyle = true; + else + noneStyle = false; + if (normalStyleValue && focusStyleValue !== "none" && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("width")) { + numOtherStyle++; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thin') + focusStyleValue = '1px'; + else if (focusStyleValue === 'medium') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thick') + focusStyleValue = '3px'; + if (normalStyleValue) { + if (normalStyleValue === 'initial') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thin') + normalStyleValue = '1px'; + else if (normalStyleValue === 'medium') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thick') + normalStyleValue = '3px'; + } + focusStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(focusStyleValue, ruleContext); + normalStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(normalStyleValue, ruleContext); + if (focusStyleValue == 0 || focusStyleValue <= normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("color")) { + numOtherStyle++; + // get the element bg color + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(ruleContext); + if (colorCombo === null) + continue; + var bg = colorCombo.bg; + if (!bg) + continue; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = 'black'; + if (normalStyleValue && normalStyleValue === 'initial') + normalStyleValue = 'black'; + // get the border/outline color as fg colors + focusStyleValue = ColorUtil_1.ColorUtil.Color(focusStyleValue); + normalStyleValue = ColorUtil_1.ColorUtil.Color(normalStyleValue); + if (focusStyleValue === null || normalStyleValue === null) + continue; + //get the border/outline color contrast ratios + var focusRatio = focusStyleValue.contrastRatio(bg); + var normalRatio = normalStyleValue.contrastRatio(bg); + if (focusRatio < 3.0 || focusRatio <= normalRatio) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + //other + numOtherStyle++; + if (normalStyleValue != null && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + // warn if a border/outline focus style is 'none' and noe other (color and/or width) is defined + if (noneStyle && numOtherStyle === 0) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + // no focus style defined + // warn if normal style is defined and is not "none" + for (var normalStyle in normalStyles) { + if (validateParams.checkParams.value.includes(normalStyle)) { + var normalStyleValue = normalStyles[normalStyle]; + // ignore if border or outline style is "none" + if (normalStyleValue !== 'none') + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + return (0, IRule_1.RulePass)("pass_focus_visible"); + } +}; + + +/***/ }, + +/***/ 7942 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_highcontrast_visible = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CacheUtil_1 = __webpack_require__(4566); +exports.style_highcontrast_visible = { + id: "style_highcontrast_visible", + context: "dom:style, dom:link, dom:*[style]", + refactor: { + "RPT_Style_Trigger2": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_highcontrast_visible.html", + "Manual_1": "style_highcontrast_visible.html", + "group": "style_highcontrast_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content", + "group": "Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "link" && + (!ruleContext.hasAttribute("rel") || ruleContext.getAttribute("rel").toLowerCase() !== "stylesheet")) + return (0, IRule_1.RulePass)("Pass_0"); + if (nodeName !== "style" && nodeName !== "link" && + ruleContext.hasAttribute("style") && ruleContext.getAttribute("style").trim().length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_highcontrast_visible", false); + var passed = triggered; + // Packages.java.lang.System.out.println(triggered); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_highcontrast_visible", true); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 2219 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_hover_persistent = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.style_hover_persistent = { + id: "style_hover_persistent", + context: "dom:style, dom:*[style], dom:*", + help: { + "en-US": { + "Pass_0": "style_hover_persistent.html", + // "Pass_1": "style_hover_persistent.html", + "Pass_2": "style_hover_persistent.html", + "Potential_1": "style_hover_persistent.html", + "Potential_2": "style_hover_persistent.html", + "Potential_3": "style_hover_persistent.html", + "group": "style_hover_persistent.html" + } + }, + messages: { + "en-US": { + "Pass_0": "the hover: pseudo-class is not used to display content", + // "Pass_1": "content displayed via the :hover pseudo-class is a direct child of the trigger element", + "Pass_2": "content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element", + "Potential_1": "Confirm the pointer can be positioned over the displayed element, not just the trigger", + "Potential_2": "Confirm the pointer can be positioned over all the information displayed on hover", + "Potential_3": "Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger", + "group": "The pointer should be able to move over content displayed on hover" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["1.4.13"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var pass0 = false; + var pass1 = false; + var pass2 = false; // never happen + var potential1 = false; + var potential2 = false; + var potential3 = false; + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + // console.log("RULE RUN ******************"); + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + // console.log("ruleContext.ownerDocument.styleSheets.length = "+ruleContext.ownerDocument.styleSheets.length); + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; ++sIndex) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules.length = "+styleRules.length); + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + // console.log("**********"); + // console.log("********** FOR LOOP styleRuleIndex = "+styleRuleIndex); + var foundHover = false; + var hoverElement = ""; + var plusCombinator = false; + var tildeCombinator = false; + var afterCombinatorElement = ""; + var afterCombinatorElementDisplay = false; + var afterCombinatorElementDisplayValue = false; + var afterCombinatorElementHover = false; + var supportingElement = false; + var supportingHover = false; + var supportingHoverElementDisplayProperty = false; + var supportingHoverElementDisplayValue = false; + var adjacentPlusSibling = false; + var adjacentTildeMultipleSibling = false; + var styleRule = styleRules[styleRuleIndex]; + var ruleText = styleRules[styleRuleIndex].cssText; + // console.log("styleRules["+styleRuleIndex+"] = "+ruleText); + // 1. Check for :hover + if (ruleText.match(/:hover/g)) { + foundHover = true; + // console.log("1. found :hover = "+ foundHover); + // 2. Get hover element + hoverElement = ruleText.split(":")[0]; + // console.log("2. found element that goes with :hover = "+hoverElement); + } + else { + // console.log("1. No hover on css element so skip this rule"); + continue; // if no :hover skip this rule + } + // 3a. Check for css combinator + + // 4a. if so do we have an after combinator element + var plusTempStr = ruleText.substring(ruleText.indexOf("+") + 1); + plusTempStr = plusTempStr.trim(); + if (ruleText.match(/:hover \+/g) || ruleText.match(/:hover\+/g)) { + plusCombinator = true; + // console.log("3a. Found plusCombinator = "+ plusCombinator); + afterCombinatorElement = plusTempStr.split(" ")[0]; + // console.log("4a. Found plus afterCombinatorElement = "+afterCombinatorElement); + } + // 3b. Check for css combinator + + // 4b. if so do we have an after combinator element + if (ruleText.match(/:hover \~/g) || ruleText.match(/:hover\~/g)) { + // console.log("match = "+ruleText.match(":hover \~")); + tildeCombinator = true; + // console.log("3b. Found tildeCombinator = "+ tildeCombinator); + var plusTempStr_1 = ruleText.substring(ruleText.indexOf("~") + 1); + plusTempStr_1 = plusTempStr_1.trim(); + afterCombinatorElement = plusTempStr_1.split(" ")[0]; + // console.log("4b. Found tilde afterCombinatorElement = "+afterCombinatorElement); + } + if (!plusCombinator && !tildeCombinator) { + // NO plusCombinator or tildeCombinator so skip this rule + // console.log("NO plusCombinator or tildeCombinator so PASS"); + // console.log("**** REPORT PASS 0 HERE"); + return (0, IRule_1.RulePass)("Pass_0"); // JCH: should we have a N/A pass + } + // So now we have a css element with hover - element:hover so we have problems + // to check + // 5. Check if the after combinator element has display: property + // 6. Check if display property is not none + if (afterCombinatorElement) { + // get index of display: + // console.log("plusTempStr = "+plusTempStr); + var index = plusTempStr.indexOf("display:"); + if (index) { + afterCombinatorElementDisplay = true; + // console.log("5. Found afterCombinatorElementDisplay = "+afterCombinatorElementDisplay); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + afterCombinatorElementDisplayValue = true; + // console.log("6. Found afterCombinatorElementDisplayValue not none = "+afterCombinatorElementDisplayValue); + } + else { + // console.log("afterCombinatorElementDisplayValue === none"); + // console.log("**** PUT POTENTIAL 0 HERE"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElementDisplay so skip this rule"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElement so skip this rule"); + continue; + } + if (afterCombinatorElementDisplayValue) + if (sheet && sheet.ownerNode === ruleContext) { + // console.log("**** At this point we have verified that we have a css element with a hover of the format span:hover + div { display: block; } with all the proper properties and values"); + // NOTE: At this point we have verified that we have a css element with a hover + // of the format span:hover + div { display: block; } + // with all the proper properties and values + try { + var styleRules2 = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules2.length = "+styleRules2.length); + for (var styleRuleIndex2 = 0; styleRuleIndex2 < styleRules2.length; styleRuleIndex2++) { + // Check rule for afterCominatorElement:hover + // If find afterCombinatorElement:hover see if rule has property display: value where + // value != none + // console.log("**********"); + // console.log("********** 2nd FOR styleRuleIndex2 = "+styleRuleIndex2); + var ruleText2 = styleRules[styleRuleIndex2].cssText; + // console.log("ruleText2 = ", ruleText2); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // Check all supporting elements for margin property + // If find margin STOP and REPORT ERROR + var regExString = afterCombinatorElement + " {"; + var trimRuleText2 = ruleText2.trim(); + var regIndex = trimRuleText2.indexOf(regExString); + var afterCombinatorElementProperties = trimRuleText2.slice(regIndex).trim(); + //if (!afterCombinatorElementProperties.match(/margin/g)) { + if (!trimRuleText2.match(/margin/g)) { + // console.log("No margin problem so continue on..."); + // do we have a supporting element css definitions + var supportingHoverElement = ruleText2.split(":")[0]; + supportingHoverElement = supportingHoverElement.split(" ")[0]; + // console.log("supportingHoverElement = "+supportingHoverElement); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // NEED TO CHECK FOR afterCominatorElement:hover in ONE STEP + if (supportingHoverElement === afterCombinatorElement && ruleText2.match(/:hover/g)) { + // console.log("7. Found supporting hover element same as afterCombinatorElement") + // 7. Found supporting hover element same as afterCombinatorElement + supportingElement = true; + // does supporting element have hover + // console.log("8. Supporting element has hover also = "+ foundHover); + // 8. Supporting element has hover also + supportingHover = true; + var index = ruleText2.indexOf("display:"); + // console.log("index = "+index); + if (index) { + // 9. Found supportingHoverElementDisplayProperty + supportingHoverElementDisplayProperty = true; + // console.log("9. Found supportingHoverElementDisplayProperty = "+supportingHoverElementDisplayProperty); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + // 10. Found supportingHoverElementDisplayValue not none + supportingHoverElementDisplayValue = true; + // console.log("10. Found supportingHoverElementDisplayValue not none = "+supportingHoverElementDisplayValue); + // Get list of hover elements and next sibling for + + // For + there must be at least one ADJACENT sibling + if (hoverElement !== "" && plusCombinator) { + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // console.log("hoverElementList[0].tagName = "+hoverElementList[0].tagName); + // Get adjacent sibling + // console.log("Adjacent sibling = "+hoverElementList[0].nextElementSibling.tagName); + // console.log("afterCombinatorElement.toUpperCase() = "+afterCombinatorElement.toUpperCase()); + if (afterCombinatorElement.toUpperCase() === hoverElementList[0].nextElementSibling.tagName) { + // console.log("11a. Hover with plus has adjacent sibling.") + // 11a. Hover with plus has adjacent sibling. + adjacentPlusSibling = true; + // At this point we have verified a supporting afterCombinatorElement css rule that contains hover and display property that is not equal to none and has a hover element in the body with an adjacent sibling + // console.log("**** REPORT PASS 1 HERE"); + pass0 = true; + continue; + } + } + else if (plusCombinator) { + // console.log("11a. Main hover with + combinator has no adjacent sibling"); + if (!potential1) { + // console.log("**** PUT POTENTIAL 1 HERE"); + potential1 = true; + break; + } + continue; + } + // Get list of hover elements and determine if there are 2 or more adjacent siblings for ~ + // For ~ there must be at least one ADJACENT sibling + if (hoverElement !== "" && tildeCombinator) { + // console.log("hoverElement.toUpperCase() = "+hoverElement.toUpperCase()); + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // Check for two or more adjacent siblings + var siblings = []; + var sibling = hoverElementList[0].nextElementSibling; + do { + // console.log("sibling.tagName = "+sibling.tagName); + if (sibling.tagName === afterCombinatorElement.toUpperCase()) { + siblings.push(sibling); + } + else { + break; + } + } while ((sibling = sibling.nextElementSibling)); + var siblingCount = siblings.length; + // console.log("siblingCount = "+siblingCount); + // JCH TODO: what if sibling count 0 + if (siblingCount === 1) { + // console.log("11b. Hover with tilde and one adjacent sibling"); + adjacentTildeMultipleSibling = true; + // console.log("**** REPORT PASS 2 HERE"); + return (0, IRule_1.RulePass)("Pass_2"); + } + else if (siblingCount > 1) { + // console.log("Main hover with ~ combinator has two or more siblings"); + if (!potential2) { + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + } + } + else if (plusCombinator) { + // supportingHoverElementDisplayValue + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a display property + } + else if (plusCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO tilde supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a supportingElement:hover + } + else if (plusCombinator) { + // if we make it to the last rule and supportingElement is still false => potential1 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO plus supportingElement:hover"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingElement is still false => potential2 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO tilde supportingElement:hover"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + continue; + } + } + } + else { + // console.log("There is a margin in the supporting element"); + if (!potential3) { + // console.log("**** PUT POTENTIAL 3 HERE"); + potential3 = true; + return (0, IRule_1.RulePotential)("Potential_3"); + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + // console.log("----------------------"); + // console.log("pass0 = "+pass0); + // console.log("pass1 = "+pass1); + // console.log("pass2 = "+pass2); + // console.log("potential1 = "+potential1); + // console.log("potential2 = "+potential2); + // console.log("potential3 = "+potential3); + if (pass0) + return (0, IRule_1.RulePass)("Pass_0"); + // if (pass1) return RulePass("Pass_2"); // Doesn't trigger + // if (pass2) return RulePass("Pass_3"); // Doesn't trigger + if (potential1) + return (0, IRule_1.RulePotential)("Potential_1"); + if (potential2) + return (0, IRule_1.RulePotential)("Potential_2"); + if (potential3) + return (0, IRule_1.RulePotential)("Potential_3"); + } +}; + + +/***/ }, + +/***/ 1473 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_viewport_resizable = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +/** + * Description: Trigger when viewport units are used for font size. + * Origin: Various + */ +exports.style_viewport_resizable = { + id: "style_viewport_resizable", + context: "dom:link, dom:style, dom:*[style]", + refactor: { + "WCAG21_Style_Viewport": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_viewport_resizable.html", + "Pass_0": "style_viewport_resizable.html", + "Potential_1": "style_viewport_resizable.html" + } + }, + messages: { + "en-US": { + "group": "Text must scale up to 200% without loss of content or functionality", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that text sized using viewport units can be resized up to 200%" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.4.4", "1.4.10"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var thePattern = /\d+(vw|vh|vmin|vmax)/gi; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "style") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var rule = styleRules[styleRuleIndex]; + if (rule.type && rule.type === 1 /* CSSRule.STYLE_RULE */) { + var styleRule = rule; + if (styleRule.style['fontSize']) { + var fontSize = styleRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + // check import rules + else if (rule.type && rule.type === 3 /* CSSRule.IMPORT_RULE */ && rule.styleSheet) { + var importRule = rule; + var rules = importRule.styleSheet.cssRules ? importRule.styleSheet.cssRules : importRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + if (importedRule.type && importedRule.type === 1 /* CSSRule.STYLE_RULE */) { + if (importedRule.style['fontSize']) { + var fontSize = importedRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else if (nodeName === "link") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check rules + if (ruleFromLink.type && ruleFromLink.type === 1 /* CSSRule.STYLE_RULE */) { + if (ruleFromLink.style['fontSize']) { + var fontSize = ruleFromLink.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else { + var styleValue = ruleContext.getAttribute('style'); + if (styleValue) { + var stylePattern = /font-size:\s*\d+(vw|vh|vmin|vmax)/gi; + var found = styleValue.match(stylePattern); + if (found) { + passed = false; + } + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 1912 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.svg_graphics_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AccNameUtil_1 = __webpack_require__(1950); +var VisUtil_1 = __webpack_require__(3946); +exports.svg_graphics_labelled = { + id: "svg_graphics_labelled", + context: "dom:svg", + help: { + "en-US": { + "group": "svg_graphics_labelled.html", + "pass": "svg_graphics_labelled.html", + "fail_acc_name": "svg_graphics_labelled.html" + } + }, + messages: { + "en-US": { + "group": "A non-decorative SVG element must have an accessible name", + "pass": "The SVG element has an accessible name", + "fail_acc_name": "The SVG element has no accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "7d6734": { + "pass": "pass", + "fail_acc_name": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_acc_name"); + } +}; + + +/***/ }, + +/***/ 6539 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_aria_descendants = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.table_aria_descendants = { + id: "table_aria_descendants", + context: "aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]", + help: { + "en-US": { + "group": "table_aria_descendants.html", + "explicit_role": "table_aria_descendants.html" + } + }, + messages: { + "en-US": { + "group": "Table structure elements cannot specify an explicit 'role' within table containers", + "explicit_role": "An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + // cache the result + if (parentRole === null || parentRole.length === 0) + return; + // ignore the redundancy cases: reported in the aria_role_redundant rule + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + var explicitRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + ; + if (implicitRoles && implicitRoles.length > 0 && explicitRoles && explicitRoles.length > 0 + && explicitRoles.some(function (item) { return implicitRoles.includes(item); })) + return; + return (0, IRule_1.RuleFail)("explicit_role", [context["dom"].node.nodeName.toLowerCase(), parentRole[0].role]); + } +}; + + +/***/ }, + +/***/ 4 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_empty = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.table_caption_empty = { + id: "table_caption_empty", + context: "dom:caption", + refactor: { + "Valerie_Caption_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_empty.html", + "Fail_1": "table_caption_empty.html", + "group": "table_caption_empty.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <table> element has an empty <caption> element", + "group": "A <caption> element for a <table> element must contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 5334 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_nested = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.table_caption_nested = { + id: "table_caption_nested", + context: "dom:caption", + refactor: { + "Valerie_Caption_InTable": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_nested.html", + "Fail_1": "table_caption_nested.html", + "group": "table_caption_nested.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<caption> element is not nested inside a <table> element", + "group": "The <caption> element must be nested inside the associated <table> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table") != null; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 2173 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var TableUtil_1 = __webpack_require__(9196); +exports.table_headers_exists = { + id: "table_headers_exists", + context: "dom:table", + refactor: { + "RPT_Table_DataHeadingsAria": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_exists.html", + "Fail_1": "table_headers_exists.html", + "group": "table_headers_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Table has no headers identified", + "group": "Data table must identify headers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If this is a layout table or there are no rows, the rule does not apply. + var rows = ruleContext.rows; + if (!TableUtil_1.TableUtil.isDataTable(ruleContext) || rows === null || rows.length === 0) + return null; + var passed = TableUtil_1.TableUtil.tableHeaderExists(ruleContext); + if (passed === null) + return; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 8349 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_ref_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var DOMUtil_1 = __webpack_require__(1686); +var VisUtil_1 = __webpack_require__(3946); +var ARIAMapper_1 = __webpack_require__(9955); +exports.table_headers_ref_valid = { + id: "table_headers_ref_valid", + context: "dom:td[headers], dom:th[headers]", + help: { + "en-US": { + "Pass_0": "table_headers_ref_valid.html", + "Fail_1": "table_headers_ref_valid.html", + "Fail_2": "table_headers_ref_valid.html", + "Fail_3": "table_headers_ref_valid.html", + "Fail_4": "table_headers_ref_valid.html", + "group": "table_headers_ref_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document", + "Fail_2": "The 'headers' attribute value \"{0}\" refers to itself", + "Fail_3": "The 'headers' attribute value \"{0}\" does not refer to a cell in the same table", + "Fail_4": "The 'headers' attribute value \"{0}\" does not refer to a cell indicated with <th> or a role of \"columnheader\" or \"rowheader\"", + "group": "The 'headers' attribute should refer to a valid cell in the same table" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ["a25f45"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + var parentRole = ARIAMapper_1.ARIAMapper.nodeToRole(parentTable); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !VisUtil_1.VisUtil.isNodeVisible(parentTable) || !["table", "grid"].includes(parentRole)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var doc = ruleContext.ownerDocument; + var value = ruleContext.getAttribute("headers"); + if (!value) + return null; + var ids = value.split(" "); + var invalidHeaderValues = []; + var sameNodeHeaderValues = []; + var sameTableHeaderValues = []; + var invalidElemHeaderValues = []; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + if (id.trim() === '') + continue; + var elem = doc.getElementById(id); + if (!elem) + invalidHeaderValues.push(id); + else if (DOMUtil_1.DOMUtil.sameNode(elem, ruleContext)) + sameNodeHeaderValues.push(id); + else if (!DOMUtil_1.DOMUtil.isInSameTable(elem, ruleContext)) + sameTableHeaderValues.push(id); + else { + var elemName = elem.nodeName.toLowerCase(); + if (elemName !== 'th') { + var roles = AriaUtil_1.AriaUtil.getRoles(elem, true); + if (!roles.includes('columnheader') && !roles.includes('rowheader')) + invalidElemHeaderValues.push(id); + } + } + } + var results = []; + if (invalidHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_1", [invalidHeaderValues.toString()])); + if (sameNodeHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_2", [sameNodeHeaderValues.toString()])); + if (sameTableHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_3", [sameTableHeaderValues.toString()])); + if (invalidElemHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_4", [invalidElemHeaderValues.toString()])); + if (results.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return results; + } + } +}; + + +/***/ }, + +/***/ 8142 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_related = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var CacheUtil_1 = __webpack_require__(4566); +var TableUtil_1 = __webpack_require__(9196); +exports.table_headers_related = { + id: "table_headers_related", + context: "dom:td, dom:th", + refactor: { + "Valerie_Table_DataCellRelationships": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_related.html", + "Fail_1": "table_headers_related.html", + "group": "table_headers_related.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Complex table does not have headers for each cell properly defined with 'header' or 'scope'", + "group": "For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !TableUtil_1.TableUtil.isComplexDataTable(parentTable)) + return null; + // If this table hasn't been preprocessed, process it. + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null) === null) { + // Build a grid that's actually usable (rowspan and colspan elements are duplicated) + // This builds a real 2d table array. + var grid = []; + for (var i = 0; i < parentTable.rows.length; ++i) { + var row = parentTable.rows[i]; + if (!grid[i]) + grid[i] = []; + for (var j = 0; j < row.cells.length; ++j) { + var cell = row.cells[j]; + CacheUtil_1.CacheUtil.setCache(cell, "table_headers_related", i + ":" + j); + var width = parseInt(cell.getAttribute("colspan")); + if (!width) + width = 1; + var height = parseInt(cell.getAttribute("rowspan")); + if (!height) + height = 1; + var gX = 0; + while (grid[i][gX]) + gX += 1; + for (var k = 0; k < height; ++k) { + if (!grid[i + k]) + grid[i + k] = []; + for (var l = 0; l < width; ++l) { + grid[i + k][gX + l] = cell; + } + } + } + } + // Iterate through the table grid and record headers that point to cells and + // cells that are pointed to by headers + var doc = ruleContext.ownerDocument; + var lookup = {}; + var scopedCols = {}; + for (var i = 0; i < grid.length; ++i) { + var rowScoped = false; + for (var j = 0; j < grid[i].length; ++j) { + var gridCell = grid[i][j]; + var gridNodeName = gridCell.nodeName.toLowerCase(); + if (gridNodeName == "th") { + if (gridCell.getAttribute("scope") == "row") { + rowScoped = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "rowgroup") { + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "col") { + scopedCols[j] = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + // Headers can refer to other headers + if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + else if (gridNodeName == "td") { + if (rowScoped || scopedCols[j]) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + } + } + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related", lookup); + } + var rcInfo = CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null); + var tInfo = CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related", null); + var passed = rcInfo && tInfo && rcInfo in tInfo; + if (!passed && rcInfo === "0:0" && + CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim().length == 0) { + // We don't test if it's the upper-left cell and it's empty + return null; + } + // If the table has no th's, it may just be that this was supposed to be a layout + // table, which introduces a lot of noise. In that case, only trigger this error + // once per table. + if (!passed && parentTable.getElementsByTagName("th").length == 0) { + if (CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related_TrigOnce", false) === true) { + passed = true; + } + else { + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related_TrigOnce", true); + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 3980 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_layout_linearized = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var TableUtil_1 = __webpack_require__(9196); +exports.table_layout_linearized = { + id: "table_layout_linearized", + context: "dom:table", + refactor: { + "RPT_Table_LayoutTrigger": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_layout_linearized.html", + "Potential_1": "table_layout_linearized.html", + "group": "table_layout_linearized.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify table is not being used to format text content in columns unless the table can be linearized", + "group": "Avoid using tables to format text documents in columns unless the table can be linearized" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = !TableUtil_1.TableUtil.isLayoutTable(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 4701 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_scope_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.table_scope_valid = { + id: "table_scope_valid", + context: "dom:td[scope], dom:th[scope]", + refactor: { + "WCAG20_Table_Scope_Valid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "table_scope_valid.html", + "Fail_1": "table_scope_valid.html", + "Fail_2": "table_scope_valid.html", + "group": "table_scope_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Value provided is invalid for the 'scope' attribute", + "Fail_2": "The 'scope' attribute should only be used on a <th> element", + "group": "Value for 'scope' attribute must be \"row\", \"col\", \"rowgroup\", or \"colgroup\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === 'td') + return (0, IRule_1.RuleFail)("Fail_2"); + //only continue for 'th' + var scopeVal = ruleContext.getAttribute("scope").trim().toLowerCase(); + var passed = /^(row|col|rowgroup|colgroup)$/.test(scopeVal); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 18 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_structure_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var TableUtil_1 = __webpack_require__(9196); +exports.table_structure_misuse = { + id: "table_structure_misuse", + context: "dom:table", + refactor: { + "WCAG20_Table_Structure": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_structure_misuse.html", + "Fail_1": "table_structure_misuse.html", + "group": "table_structure_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with \"presentation\" role or \"none\" role has structural element(s) and/or attribute(s) '{1}'", + "group": "Table elements with 'role=\"presentation\" or 'role=\"none\" should not have structural elements or attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - OUT OF SCOPE hidden in context + if (TableUtil_1.TableUtil.isDataTable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.isNodeInGrid(ruleContext)) + return null; + var errorNodes = []; + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "summary")) + errorNodes.push(ruleContext); + var captionElems = ruleContext.getElementsByTagName("caption"); + for (var i = 0; i < captionElems.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(captionElems[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(captionElems[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(captionElems[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var thNodes = ruleContext.getElementsByTagName("th"); + for (var i = 0; i < thNodes.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(thNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(thNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(thNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var tdNodes = ruleContext.getElementsByTagName("td"); + for (var i = 0; i < tdNodes.length; ++i) { + if ((tdNodes[i].hasAttribute("scope") || tdNodes[i].hasAttribute("headers")) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(tdNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(tdNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + // Get the node name for the rule context element in this case it will always be table + var currentElementToken = ruleContext.nodeName.toLowerCase(); + // Construct a new array which will contan only the element tag for the violation elements + var structuralElementTokens = new Array(); + // Construct a seen hash that will keep trask of all the elements that were already added to the token array, to make sure + // we do not duplicate any of the elements. Duplicate element tags in the token message looks bad and confusing. + var seen = {}; + // Loop through all the violating structural elements and extract the element tag to be used as a token + for (var i = 0; i < errorNodes.length; i++) { + // Get the node name (tag name) for the violating structural element + var nodeName = errorNodes[i].nodeName.toLowerCase(); + // Only need to add the violating element once + if (!seen.hasOwnProperty(nodeName)) { + // Since we are adding the token as elements and attributes we need to handle + // the summary attribute on the ruleContext (table). We only add summary once, same as + // for elements to avoid duplication in the message. (Summary should not duplicate, but just in case) + if (nodeName == "table" && !seen.hasOwnProperty["summary"]) { + // Mark this as a new attribute + seen["summary"] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push("summary"); + } + else { + // Mark this as a new element + seen[nodeName] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push(nodeName); + } + } + } + // We need to take the array of structural elements and join them with a comma and a space to make grammatical correct in + // the message. + var structuralElementTokensStr = structuralElementTokens.join(", "); + //return new ValidationResult(errorNodes.length == 0, errorNodes, '', '', [currentElementToken, structuralElementTokens]); + if (errorNodes.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [currentElementToken, structuralElementTokensStr]); + } + } +}; + + +/***/ }, + +/***/ 9314 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_summary_redundant = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +var DOMUtil_1 = __webpack_require__(1686); +exports.table_summary_redundant = { + id: "table_summary_redundant", + context: "dom:table", + refactor: { + "WCAG20_Table_CapSummRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_summary_redundant.html", + "Fail_1": "table_summary_redundant.html", + "group": "table_summary_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The table summary duplicates the caption", + "group": "The table summary must not duplicate the caption" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pofId; + var passed = true; + var sumStr; + if (ruleContext.hasAttribute("summary")) { + pofId = 0; + sumStr = ruleContext.getAttribute("summary").trim().toLowerCase(); + } + else if (ruleContext.hasAttribute("aria-describedby")) { + pofId = 1; + var summaryNodeIds = ruleContext.getAttribute("aria-describedby").split(" "); + var summaryNodeConcat = ""; + for (var i = 0; i < summaryNodeIds.length; i++) { + var summaryNodeId = summaryNodeIds[i]; + if (summaryNodeId) { + var summaryNode = fragment_1.FragmentUtil.getById(ruleContext, summaryNodeId); + if (summaryNode && !DOMUtil_1.DOMUtil.sameNode(summaryNode, ruleContext)) { + summaryNodeConcat += " " + CommonUtil_1.CommonUtil.getInnerText(summaryNode).trim().toLowerCase(); + } + } + } + sumStr = summaryNodeConcat; + } + if (!sumStr) { + return null; + } + else { + var capElems = ruleContext.getElementsByTagName("caption"); + if (capElems.length === 0) { + return null; + } + else if (sumStr.length > 0) { + var capStr = CommonUtil_1.CommonUtil.getInnerText(capElems[0]).trim().toLowerCase(); + if (!sumStr.includes(capStr)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + } + } +}; + + +/***/ }, + +/***/ 1667 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.target_spacing_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMMapper_1 = __webpack_require__(7507); +var CSSUtil_1 = __webpack_require__(4919); +var CacheUtil_1 = __webpack_require__(4566); +exports.target_spacing_sufficient = { + id: "target_spacing_sufficient", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "target_spacing_sufficient.html", + "pass_spacing": "target_spacing_sufficient.html", + "pass_sized": "target_spacing_sufficient.html", + "pass_inline": "target_spacing_sufficient.html", + "pass_default": "target_spacing_sufficient.html", + "violation_spacing": "target_spacing_sufficient.html", + "recommendation_inline": "target_spacing_sufficient.html", + "potential_overlap": "target_spacing_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The target must be sufficiently sized or spaced from other targets", + "pass_spacing": "The target's spacing from other targets is sufficient", + "pass_sized": "The target’s size is more than 24 CSS pixels", + "pass_inline": "The target is in a sentence or its size is otherwise constrained by the line-height of non-target text", + "pass_default": "The target's size is determined by the user agent and is not modified by the author", + "violation_spacing": "Undersized target \"{0}\" does not have sufficient spacing of 12 CSS pixels from another target \"{1}\"", + "recommendation_inline": "Confirm the inline target \"{0}\" is sufficiently spaced from another inline target \"{1}\"", + "potential_overlap": "Ensure the overlapped target \"{0}\" meets a minimum target size or has sufficient spacing from the overlapping target \"{1}\"" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["pass_spacing", "pass_sized", "pass_inline", "pass_default", "violation_spacing", "potential_overlap"] + }, + { + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["recommendation_inline"] + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); //context["dom"].bounds; + if (!bounds) + return null; + // ignore hidden, non-target + if (!CommonUtil_1.CommonUtil.isTarget(ruleContext)) + return null; + if (bounds.height >= 24 && bounds.width >= 24) + return (0, IRule_1.RulePass)("pass_sized"); + // check inline element: without text in the same line + var status = CSSUtil_1.CSSUtil.getInlineStatus(ruleContext); + if (status === null) + return null; + if (status.inline) { + if (status.text) { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_inline"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + else { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_default"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + } + else { + // ignore browser default + if (CSSUtil_1.CSSUtil.isTargetBrowserDefault(ruleContext)) + return (0, IRule_1.RulePass)("pass_default"); + } + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var cStyle = getComputedStyle(ruleContext); + if (cStyle === null) + return null; + var zindex = cStyle.zIndex; + if (!zindex || isNaN(Number(zindex))) + zindex = "0"; + // Get the list of target elements + var targetElems = CacheUtil_1.CacheUtil.getCache(doc.documentElement, "target_spacing_sufficient::targets", undefined); + if (typeof targetElems === "undefined") { + targetElems = []; + //select all elements except itself and descendants + var elems = doc.querySelectorAll('body *:not(script):not(style)'); + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + if (CommonUtil_1.CommonUtil.isTarget(elem)) { + targetElems.push(elem); + } + } + CacheUtil_1.CacheUtil.setCache(doc.documentElement, "target_spacing_sufficient::targets", targetElems); + } + if (!targetElems || targetElems.length === 0) + return; + var before = true; + var minX = 24; + var minY = 24; + var adjacentX = null; + var adjacentY = null; + var checked = []; //contains a list of elements that have been checked so their descendants don't need to be checked again + var _loop_1 = function (i) { + var elem = targetElems[i]; + /** + * the nodes returned from querySelectorAll is in document order + * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later + * filter out the elements that’re descendant or ancestors of the target element, nor descendant of the target element's siblings + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + //the next node in elems will be after the target node (ruleContext). + before = false; + return "continue"; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // ignore ascendants of the element, or itself or its ascendant already checked + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || checked.some(function (item) { return item.contains(elem); })) + return "continue"; + var bnds = mapper.getUnadjustedBounds(elem); + if (!bnds) + return "continue"; + var zStyle = getComputedStyle(elem); + var z_index = '0'; + if (zStyle) { + z_index = zStyle.zIndex; + if (!z_index || isNaN(Number(z_index))) + z_index = "0"; + } + // case 2: the element overlaps the target entirely + // note when a link is inline with other target, if the link text wraps in another line in a given viewport, + // the bounds of the link may cover and the entire two lines, causing the other tagets to be overlapped, see two links in the test case: element_inline.html + if (bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height + && bnds.left + bnds.width >= bounds.left + bounds.width) { + // if the target on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: null }; + } + else + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 3: if the target overlaps the element entirely + if (bounds.top <= bnds.top && bounds.left <= bnds.left && bounds.top + bounds.height >= bnds.top + bnds.height + && bounds.left + bounds.width >= bnds.left + bnds.width) { + // if the element on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else // the target on top + return { value: (0, IRule_1.RuleFail)("violation_spacing", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 4: the element overlaps partially with the target + if ((((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top + bounds.height <= bnds.top && bounds.top + bounds.height >= bnds.top + bnds.height)) + && ((bounds.left > bnds.left && bounds.left < bnds.left + bnds.width) || (bnds.left > bounds.left && bnds.left < bounds.left + bounds.width))) + || (((bounds.top > bnds.top && bounds.top < bnds.top + bnds.height) || (bnds.top > bounds.top && bnds.top < bounds.top + bounds.height)) + && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left + bounds.width >= bnds.left && bounds.left + bounds.width <= bnds.left + bnds.width)))) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else { // no overlap with the elem, though may overlap withe other elements + var disX = 24; + var disY = 24; + // the element is in the horizontally same row with the target + if (bounds.width < 24 && ((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top <= bnds.top && bounds.top + bounds.height > bnds.top))) + disX = Math.min(Math.abs(bounds.left - bnds.left), Math.abs(bounds.left - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - bnds.left)); + // the element is in the vertically same column with the target + if (bounds.height < 24 && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left <= bnds.left && bounds.left + bounds.width > bnds.left))) + disY = Math.min(Math.abs(bounds.top - bnds.top), Math.abs(bounds.top - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - bnds.top)); + if (disX < minX) { + minX = disX; + adjacentX = elem; + } + if (disY < minY) { + minY = disY; + adjacentY = elem; + } + } + checked.push(elem); + }; + for (var i = 0; i < targetElems.length; i++) { + var state_1 = _loop_1(i); + if (typeof state_1 === "object") + return state_1.value; + } + // case 5: no overlap + insufficient target size. check spacing + if (Math.round(bounds.width / 2) + minX < 12 || Math.round(bounds.height / 2) + minY < 12) { + if (Math.round(bounds.width / 2) + minX < Math.round(bounds.height / 2) + minY) + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentX.nodeName.toLowerCase()]); + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentY.nodeName.toLowerCase()]); + } + else + return (0, IRule_1.RulePass)("pass_spacing"); + } +}; + + +/***/ }, + +/***/ 9599 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_block_heading = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var DOMWalker_1 = __webpack_require__(3864); +var CSSUtil_1 = __webpack_require__(4919); +var VisUtil_1 = __webpack_require__(3946); +exports.text_block_heading = { + id: "text_block_heading", + context: "dom:p, dom:div, dom:br", + refactor: { + "RPT_Block_ShouldBeHeading": { + // "Pass_0": "pass", + "Potential_1": "potential_heading" + } + }, + help: { + "en-US": { + // "pass": "text_block_heading.html", + "potential_heading": "text_block_heading.html", + "group": "text_block_heading.html" + } + }, + messages: { + "en-US": { + // "pass": "Heading text uses a heading element or role", + "potential_heading": "Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role", + "group": "Heading text should use a heading element or role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script"]) !== null) + return null; + var validateParams = { + numWords: { + value: 10, + type: "integer" + } + }; + var bodyFont = 0; + var body = ruleContext.ownerDocument.getElementsByTagName("body"); + if (body != null) { + var bodyStyle = getComputedStyle(body[0]); + if (bodyStyle) + bodyFont = CSSUtil_1.CSSUtil.getPixelsFromStyle(bodyStyle['font-size'], body); + } + var numWords = validateParams.numWords.value; + var wordsSeen = 0; + var wordStr = []; + var emphasizedText = false; + var nw = new DOMWalker_1.DOMWalker(ruleContext); + nw.nextNode(); + var passed = false; + while (!passed && + nw.nextNode() && + nw.node !== ruleContext && + nw.node !== DOMWalker_1.DOMWalker.parentNode(ruleContext) && + !["br", "div", "p"].includes(nw.node.nodeName.toLowerCase())) // Don't report twice + { + if (nw.node === ruleContext || CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) + continue; + var nwName = nw.node.nodeName.toLowerCase(); + if (nw.node.nodeType === 3) { + // for text child + if (nw.node.nodeValue.trim().length > 0 && nw.node.parentElement) { + // check it's style if the target element contains text, e.g., <p> fake heading</p> + var style = getComputedStyle(nw.node.parentElement); + if (style && (style['font-weight'] === 'bold' || style['font-weight'] >= 700 + || (style['font-size'] && style['font-size'].includes("large")) + || (style['font-size'] && bodyFont !== 0 && CSSUtil_1.CSSUtil.getPixelsFromStyle(style['font-size'], nw.node.parentElement) > bodyFont))) { + var nextStr = nw.node.nodeValue.trim(); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // the node contain regular text + passed = true; + } + } + } + else if (nw.node.nodeType === 1) { + // for element child + if (nwName === "b" || nwName === "strong" || nwName === "u" || nwName === "font") { + // if the target element contains emphasis child, e.g., <p><strong>fake heading</strong></p> + var nextStr = CommonUtil_1.CommonUtil.getInnerText(nw.node); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // ignore the element which has a role except 'generic', 'paragraph' or 'strong' + // ignore applet element that is deprecated anyway + var role = AriaUtil_1.AriaUtil.getResolvedRole(nw.node); + passed = (role !== null && role !== 'generic' && role !== 'paragraph' && role !== 'strong') || nwName === "applet"; + } + } + } + if (wordsSeen == 0) + passed = true; + //ignore if the string ends with “:” “,” “-” “;” or “.” + if (!passed) + passed = /[:,;\-\.]$/.test(wordStr.join(" ").trim()); + if (passed) { + return null; + } + else { + return (0, IRule_1.RulePotential)("potential_heading", [wordStr.join(" ")]); + } + } +}; + + +/***/ }, + +/***/ 4672 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_contrast_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var ColorUtil_1 = __webpack_require__(3883); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CSSUtil_1 = __webpack_require__(4919); +exports.text_contrast_sufficient = { + id: "text_contrast_sufficient", + context: "dom:*", + refactor: { + "IBMA_Color_Contrast_WCAG2AA": { + "Pass_0": "pass", + "Fail_1": "fail_contrast", + "Potential_1": "potential_same_color" + }, + "IBMA_Color_Contrast_WCAG2AA_PV": { + "pass_0": "pass", + "potential_1": "potential_graphic_background" + } + }, + help: { + "en-US": { + "group": "text_contrast_sufficient.html", + "pass": "text_contrast_sufficient.html", + "fail_contrast": "text_contrast_sufficient.html", + "potential_same_color": "text_contrast_sufficient.html", + "potential_graphic_background": "text_contrast_sufficient.html", + "potential_text_shadow": "text_contrast_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The contrast ratio of text with its background must meet WCAG AA requirements", + "pass": "The contrast ratio of text with its background meets WCAG AA requirements", + "fail_contrast": "Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_same_color": "The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast", + "potential_graphic_background": "Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_text_shadow": "Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.3", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ['afw4f7'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + // avoid diagnosing elements that are not visible + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return null; + } + //TODO ? should only consider native disabled, ignore aria-disabled + //skip disabled element + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["svg", "script", "meta", "style"])) + return null; + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + // Ensure that this element has children with actual text. + var childStr = CommonUtil_1.CommonUtil.getNodeText(ruleContext); + if (!CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) || (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) && CommonUtil_1.CommonUtil.getNodeText(ruleContext.shadowRoot) === '')) { + if (childStr.trim().length == 0) + return null; + // ignore if the text does not convey anything in human language + /** + * (1) ignore non-alphanumeric or special characters in ASCI: ^(a-zA-Z\d\s) + * (2) ignore non-printable unicode characters: \u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF + * see https://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters + * (3) for now not consider unicode special characters that are different in different languages + */ + //let regex = /[^(a-zA-Z\d\s)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + var regex = /[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + childStr = childStr.trim().replace(regex, ''); + if (childStr.trim().length === 0) + return null; + } + var elem = ruleContext; + // the child elements (rather than shadow root) of a shadow host is either re-assigned to the shadow slot if the slot exists + // or not displayed, so shouldn't be checked from the light DOM, rather it should be checked as reassginged slot element(s) in the shadow DOM. + if (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext)) { + // if it's direct text of a shadow host + if (ruleContext.shadowRoot) { + for (var node = ruleContext.firstChild; node; node = node.nextSibling) { + if (node.nodeType == 3) { + //if multiple texts exist, only need to check one + elem = node.assignedSlot; + break; + } + } + } + if (elem === null) + return; + } + var style = win.getComputedStyle(elem); + // JCH clip INFO: + // The clip property lets you specify a rectangle to clip an absolutely positioned element. + // The rectangle specified as four coordinates, all from the top-left corner of the element to be clipped. + // Property values: + // none This is default. No clipping is done + // auto No clipping will be done + // shape The only valid value is: rect (top, right, bottom, left) + // e.g., clip: rect(10px, 20px, 30px, 40px); + // Note: the four values are in the same order as margin/padding + // The rect values are positive pixel values, e.g., 10px, etc. + // margin-box Uses the margin box as the reference box + // border-box Uses the border box as the reference box + // padding-box Uses the padding box as the reference box + // content-box + // fill-box + // stroke-box + // NOTE: the CSS clip property is deprecated + // Also: clip only works if the element is absolutely positioned and can only do rectangles + // check if element visible + var visible = true; + if (style.width !== "0" && + style.height !== "0" && + style.opacity !== "0" && + style.display !== 'none' && + style.visibility !== 'hidden' && + style.overflow !== 'hidden' && + // left and right work with all absolute units + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.left.replace(/[^0-9.+-]/, '')) > 0)) && + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.top.replace(/[^0-9.+-]/, '')) > 0))) { + visible = true; + // console.log("element IS visible"); + // console.log("CHECK COLOR CONTRAST unless to small"); + } + else { + visible = false; + // console.log("element NOT visible"); + } + if (visible === false) { + // console.log("DO NOT CHECK COLOR CONTRAST"); + return null; + } + var clipHeight = -1; + if (style.clip !== "auto") { + var clipString = style.clip.toString(); + if (clipString.includes("rect")) { + var reBrackets = /\((.*)\)/g; + var listOfText = []; + var found = reBrackets.exec(clipString); + var foundArr = found[1].split(', '); + for (var i = 0; i < foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + listOfText.push(foundArr[i]); + } + ; + } + // console.log("listOfText = ",listOfText); + clipHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + clipHeight = Math.abs(clipHeight); + } + // JCH clip-path INFO: + // Excellent article on clip-path: https://ishadeed.com/article/clip-path/ + // clip-path is a totally different animal with many, many different variations + // The goal was for it to not be as limited as clip + // The syntax is more complicated (as it does more) and it is different from clip, + // e.g., the above clip rectangle would be clip-path: inset(10px 20px 30px 40px); + // Note: there are no commas + // Also, it can take single values to make all sides the same, or 2 values (vert/hori). + // or 3 values (top/hori/bottom) + // And percentages can works as well as px + // + // Although there are five different shapes: inset (term used for rectangle), circle, + // ellipse, polygon, path - we will only concern ourselves with inset + // There are 7 box values: margin-box, border-box, padding-box, content-box, fill-box, stroke-box, view-box + // Box and shape values may be combined: clip-path: padding-box circle(50px at 0 100px); + // NOTE: the box values are NOT intuitive, see: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/From_box_values#margin-box + // + // So the key question is what amount of effort do we want to invest into clip-path + // + // JCH don't do clip-path now + var clipPathHeight = -1; + // if (style.clipPath !== "auto") { + // console.log("style.clipPath = ",style.clipPath); + // console.log("style.clipPath.toString = ",style.clipPath.toString()); + // let clipString = style.clipPath.toString(); + // if (clipString.includes("inset")) { + // var reBrackets = /\((.*)\)/g; + // var listOfText = []; + // var found = reBrackets.exec(clipString); + // var foundArr = found[1].split(' '); + // for (let i=0; i<foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + // listOfText.push(foundArr[i]); + // }; + // } + // console.log("listOfText = ",listOfText); + // clipPathHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + // clipPathHeight = Math.abs(clipHeight); + // } + // console.log("clipPathHeight = ", clipPathHeight); + // if (style.position === "absolute" && style.clip === "rect(0px, 0px, 0px, 0px)" && style.overflow !== "visible") { + // JCH arbitrarily use less that 7px for clipHeight + if (style.position === "absolute" && clipHeight < 7 && clipHeight !== -1) { + // console.log("DO NOT CHECK COLOR CONTRAST because too small"); + // Corner case where item is hidden (accessibility hiding technique) + return null; + } + // First determine the color contrast ratio + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(elem); + if (colorCombo === null) { + //some exception occurred, or not able to get color combo for some reason + console.log("unable to get color combo for element: " + elem.nodeName); + return; + } + var fg = colorCombo.fg; + var bg = colorCombo.bg; + var ratio = fg.contrastRatio(bg); + var weight = CSSUtil_1.CSSUtil.getWeightNumber(style.fontWeight); + var size = CSSUtil_1.CSSUtil.getFontInPixels(style.fontSize, elem); + var isLargeScale = size >= 24 || size >= 18.6 && weight >= 700; + if (CSSUtil_1.CSSUtil.containsCKJ(childStr)) { + // https://github.com/act-rules/act-rules.github.io/pull/2121/files + // for CJK, 22 pt or 18 pt with font-weight >= 700, 1pt = 1.333 px + isLargeScale = size >= 29.3 || size >= 24 && weight >= 700; + } + var passed = ratio >= 4.5 || (ratio >= 3 && isLargeScale); + var hasBackground = colorCombo.hasBGImage || colorCombo.hasGradient; + var textShadow = colorCombo.textShadow; + var isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(elem); + if (!isDisabled) { + var control = CommonUtil_1.CommonUtil.getControlOfLabel(elem); + if (control) { + isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(control); + } + } + if (!isDisabled && nodeName === 'label' && CommonUtil_1.CommonUtil.isDisabledByFirstChildFormElement(elem)) { + isDisabled = true; + } + if (!isDisabled && ruleContext.hasAttribute("id") && CommonUtil_1.CommonUtil.isDisabledByReferringElement(elem)) { + isDisabled = true; + } + /**setCache(ruleContext, "EXT_Color_Contrast_WCAG2AA", { + "ratio": ratio, + "isLargeScale": isLargeScale, + "weight": weight, + "size": size, + "hasBackground": hasBackground, + "isDisabled": isDisabled + });*/ + // If element or parent is disabled, this rule does not apply (but may be 3:1 in future) + if (!passed && isDisabled) { + passed = true; + } + if (!passed) { + if (hasBackground) { + // fire potential since a text on an image or gradient may be still viewable, depending on the text location on the gradient or image + return (0, IRule_1.RulePotential)("potential_graphic_background", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else if (textShadow) { + // fire potential since a text with shadow may be still viewable, depending on the shadow efffects + return (0, IRule_1.RulePotential)("potential_text_shadow", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else { + if (fg.toHex() === bg.toHex()) { + return (0, IRule_1.RulePotential)("potential_same_color", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + else { + return (0, IRule_1.RuleFail)("fail_contrast", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } + } + else { + return (0, IRule_1.RulePass)("pass", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } +}; + + +/***/ }, + +/***/ 4353 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_quoted_correctly = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.text_quoted_correctly = { + id: "text_quoted_correctly", + context: "dom:*", + help: { + "en-US": { + "Pass_0": "text_quoted_correctly.html", + "Potential_1": "text_quoted_correctly.html", + "group": "text_quoted_correctly.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}", + "group": "Quotations should be marked with <q> or <blockquote> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // ignore the check if the node is hidden + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if the element is not in the body + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + var validateParams = { + minWords: { + value: 3, + type: "integer" + } + }; + var minWords = validateParams.minWords.value; + var passed = true; + var walkNode = ruleContext.firstChild; + var violatedtext = null; + // ignore the check for the text of the following elements + var ignored = ["blockquote", "q", "script", "style", "pre", "code", "ruby", "samp"]; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName === "#text") { + var txtVal = walkNode.nodeValue; + // Do the regex tests first - should be fast + // Remove apostrophe's + txtVal = txtVal.replace(/(\S)'(\S)/g, "$1$2"); + var dblQuotes = txtVal.match(/("[^"]+")/g); + var snglQuotes = txtVal.match(/('[^']+')/g); + // Walk the parents - only continue testing if we found a quote, but + // we're not already marked up + // Also skip if we're in a script - there's lots of quotes used in scripts + if ((dblQuotes !== null || snglQuotes !== null) && + CommonUtil_1.CommonUtil.getAncestor(walkNode, ignored) === null) { + if (dblQuotes != null) { + for (var i = 0; passed && i < dblQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(dblQuotes[i]) < minWords; + } + if (snglQuotes != null) { + for (var i = 0; passed && i < snglQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(snglQuotes[i]) < minWords; + } + // Remove any linefeed inside the quote + // violatedtext = txtVal.replace(new RegExp("\\r?\\n|\\r","g"),""); + if (dblQuotes === null) { + violatedtext = snglQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else if (snglQuotes === null) { + violatedtext = dblQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else { + violatedtext = dblQuotes.concat(snglQuotes).join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + } + } + walkNode = walkNode.nextSibling; + } + //if the violatedtext is longer than 69 chars, only keep the first 32, the " ... ", and the last 32 chars + if (!passed && violatedtext.length && violatedtext.length > 69) { + violatedtext = violatedtext.substring(0, 32) + " ... " + violatedtext.substring(violatedtext.length - 32); + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]); + } +}; + + +/***/ }, + +/***/ 7147 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_sensory_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.text_sensory_misuse = { + id: "text_sensory_misuse", + context: "dom:body, dom:body dom:*", + refactor: { + "RPT_Text_SensoryReference": { + // "Pass_0": "pass", + "Potential_1": "potential_position, potential_other" + } + }, + help: { + "en-US": { + // "pass": "text_sensory_misuse.html", + "potential_position": "text_sensory_misuse.html", + "potential_other": "text_sensory_misuse.html", + "group": "text_sensory_misuse.html" + } + }, + messages: { + "en-US": { + // "pass": "Instructions are meaningful without relying solely on shape, size, or location words", + "potential_position": "Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position", + "potential_other": "Confirm the user instruction is still understandable without the word(s) '{0}'", + "group": "Instructions should be meaningful without relying solely on shape, size, or location words" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, link, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "a", 'label']) !== null) + return null; + // ignore text on landmark roles, but not on their children (e.g., section, main) + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role) { + var lmRoles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["landmark"]); + if (lmRoles && lmRoles.includes(role)) + return null; + } + // ignore all widgets and headings, and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget", "heading"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "cell", "code", "columnheader", "definition", "figure", "list", "listitem", "math", "meter", "row", "rowgroup", "rowheader", "term"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var violatedPositionText = ""; + var violatedOtherText = ""; + var walkNode = ruleContext.firstChild; + var txtVal = ""; + while (walkNode) { + // for each element it only checks that single elements text nodes and nothing else. + // all inner elements will be covered on their own. + // whitespace characters (space, newline, tab) between elements are considered a node too. + if (walkNode.nodeName === "#text") { + var txt = walkNode.nodeValue.trim(); + if (txt.length > 0) + txtVal += (txtVal.length > 0 ? ", " + txt : txt); + } + walkNode = walkNode.nextSibling; + } + if (txtVal.length > 0) { + // first to remove each exempt word with a single space in the text + var exemptRegex = getRegex(ruleContext.ownerDocument, "exemptText"); + txtVal = txtVal.replace(exemptRegex, " "); + violatedPositionText = getViolatedText(ruleContext.ownerDocument, "positionText", txtVal); + violatedOtherText = getViolatedText(ruleContext.ownerDocument, "otherText", txtVal); + } + var ret = []; + if (violatedPositionText) + ret.push((0, IRule_1.RulePotential)("potential_position", [violatedPositionText])); + if (violatedOtherText) + ret.push((0, IRule_1.RulePotential)("potential_other", [violatedOtherText])); + return ret.length == 0 ? null : ret; + } +}; +var validateParams = { + positionText: { + value: ["top-left", "top-right", "bottom-right", "bottom-left", + "top-to-bottom", "left-to-right", "bottom-to-top", "right-to-left", + "right", "left", "above", "below", "top", "bottom", + "upper", "lower", "corner", "beside" + ], + type: "[string]" + }, + otherText: { + value: ["round", "square", "shape", "rectangle", "triangle", + "size", "large", "small", "medium", "big", "huge", "tiny", "extra", + "larger", "smaller", "bigger", "little", "largest", "smallest", "biggest" + ], + type: "[string]" + }, + exemptText: { + value: ["right-click", "left-click", "right-clicking", "right-clicks", + "left-clicking", "left-clicks", "square root", "right now", "off the top" //append as needed + ], + type: "[string]" + } +}; +function getRegex(doc, type) { + if (!validateParams[type]) + return ""; + var sensoryRegex = CacheUtil_1.CacheUtil.getCache(doc, type + "_sensory_misuse", null); + if (sensoryRegex == null) { + var sensoryText = validateParams[type].value; + var regexStr = "(\s\s+|" + sensoryText[0]; + for (var j = 1; j < sensoryText.length; ++j) { + var words = sensoryText[j].trim().split(" "); + regexStr += "|" + words[0]; + if (words.length > 1) { + for (var c = 1; c < words.length; ++c) + regexStr += " +" + words[c]; + } + } + //regexStr += ")\\W"; + regexStr += ")"; + sensoryRegex = new RegExp(regexStr, "gi"); + CacheUtil_1.CacheUtil.setCache(doc, type + "_sensory_misuse", sensoryRegex); + } + return sensoryRegex; +} +function getViolatedText(doc, type, txtVal) { + if (!txtVal) + return ""; + var sensoryTextArr = validateParams[type].value; + var hash = {}, result = []; + // split the string into words + var counts = txtVal.split(/\s+/).reduce(function (map, word) { + var wordWoTrailingPunc = word.replace(/[.?!:;()'",`\]]+$/, ""); + var lcWordWoPunc = word.toLowerCase().replace(/[.?!:;()'",`\]]/g, ""); + for (var counter = 0; counter < sensoryTextArr.length; counter++) { + var a = lcWordWoPunc.indexOf(sensoryTextArr[counter]); + var sensoryWordLen = sensoryTextArr[counter].length; + var charFollowSensoryText = lcWordWoPunc.charAt(sensoryWordLen + a); + // If the word does not contains substring of sensoryTextArr[counter] + // proceed to the next loop iteration for next sensoryText. + if (a < 0) { + continue; + } + //check the following and proceeding punctuations + //let isPuncfollowing = ((charFollowSensoryText == '\-') || + var isPuncfollowing = ((charFollowSensoryText == '\.') || + (charFollowSensoryText == '\?') || (charFollowSensoryText == '\!') || + (charFollowSensoryText == '\:') || (charFollowSensoryText == '\;') || + (charFollowSensoryText == '\(') || (charFollowSensoryText == '\)') || + (charFollowSensoryText == '\'') || (charFollowSensoryText == '\"') || + (charFollowSensoryText == '\,') || (charFollowSensoryText == '.\`') || + (charFollowSensoryText == '\\') || (charFollowSensoryText == '\]')); + var isPuncPreceding = false; + if (a > 0) { + var charPrecedeSensoryText = lcWordWoPunc.charAt(a - 1); + isPuncPreceding = ((charPrecedeSensoryText == '\-') || + (charPrecedeSensoryText == '\.') || + (charPrecedeSensoryText == '\?') || (charPrecedeSensoryText == '\!') || + (charPrecedeSensoryText == '\:') || (charPrecedeSensoryText == '\;') || + (charPrecedeSensoryText == '\(') || (charPrecedeSensoryText == '\)') || + (charPrecedeSensoryText == '\'') || (charPrecedeSensoryText == '\"') || + (charPrecedeSensoryText == '\,') || (charPrecedeSensoryText == '.\`') || + (charPrecedeSensoryText == '\\') || (charPrecedeSensoryText == '\]')); + } + if (((lcWordWoPunc.length == sensoryWordLen) || (isPuncfollowing == true) || (isPuncPreceding == true))) { + if (!hash.hasOwnProperty(wordWoTrailingPunc)) { + hash[wordWoTrailingPunc] = true; + result.push(wordWoTrailingPunc); + } + counter = sensoryTextArr.length; + } + } + map[wordWoTrailingPunc] = (map[wordWoTrailingPunc] || 0) + 1; + return map; + }, Object.create(null)); + return result.join(", "); +} + + +/***/ }, + +/***/ 1419 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_spacing_valid = void 0; +var IRule_1 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var CSSUtil_1 = __webpack_require__(4919); +var DOMMapper_1 = __webpack_require__(7507); +// Module-level constants +var STYLE_VALUE_REGEX = /(-?[\d.]+)([a-z%]*)/; +var MIN_WORD_SPACING_RATIO = 0.16; +var MIN_LETTER_SPACING_RATIO = 0.12; +var MIN_LINE_HEIGHT_RATIO = 1.5; +var IMPORTANT_SUFFIX = "!important"; +var IMPORTANT_SUFFIX_LENGTH = IMPORTANT_SUFFIX.length + 1; // +1 for the space before !important +/** + * Resolves inherited or unset style values by traversing up the DOM tree + * @param element - The element to resolve the style for + * @param property - The CSS property name + * @param currentValue - The current style value + * @returns The resolved style value + */ +function resolveInheritedStyle(element, property, currentValue) { + var _a; + if (currentValue.startsWith('inherit') || currentValue.startsWith('unset')) { + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(element.parentElement, (_a = {}, _a[property] = ["*"], _a), ['inherit', 'unset']); + if (ancestor !== null) { + return CSSUtil_1.CSSUtil.getDefinedStyles(ancestor, [property])[property]; + } + else if (currentValue.startsWith('unset')) { + return "initial"; + } + } + return currentValue; +} +/** + * Removes the !important suffix from a style value + * @param styleValue - The style value potentially containing !important + * @returns The style value without !important + */ +function removeImportantSuffix(styleValue) { + return styleValue.substring(0, styleValue.length - IMPORTANT_SUFFIX_LENGTH); +} +/** + * Checks if a spacing property violates accessibility requirements + * @param element - The HTML element being checked + * @param property - The CSS property name (word-spacing, letter-spacing, line-height) + * @param styleValue - The current style value + * @param fontSize - The computed font size in pixels + * @param minRatio - The minimum ratio threshold + * @param allowUnitless - Whether unitless values are allowed (for line-height) + * @returns RuleResult indicating pass or fail + */ +function checkSpacingProperty(element, property, styleValue, fontSize, minRatio, allowUnitless) { + if (allowUnitless === void 0) { allowUnitless = false; } + // Check if !important is used + if (element.style.getPropertyPriority(property) !== 'important') { + return true; + } + // Remove !important suffix + var cleanValue = removeImportantSuffix(styleValue); + // Check for initial or normal values (computed space is 0) + if (cleanValue === 'initial' || cleanValue === 'normal') { + return false; + } + // Parse the numeric value + var numericValue = parseFloat(cleanValue); + if (isNaN(numericValue)) { + return true; + } + // Match value and unit + var parsedValue = cleanValue.trim().match(STYLE_VALUE_REGEX); + if (!parsedValue) { + return true; + } + var value = parsedValue[1], unit = parsedValue[2]; + // Handle unitless values (only for line-height) + if (unit === '') { + if (allowUnitless) { + return parseFloat(value) < minRatio ? false : true; + } + // For other properties, zero value without unit is ignored + if (parseFloat(value) === 0) { + return null; + } + } + // Skip if no unit and non-zero (error case, inapplicable) + if (unit === '' && parseFloat(value) !== 0) { + return null; + } + // Convert to pixels and check ratio + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(unit, value, element); + if (pixels !== null && pixels / fontSize < minRatio) { + return false; + } + return true; +} +exports.text_spacing_valid = { + id: "text_spacing_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_spacing_valid.html", + "group": "text_spacing_valid.html", + "fail_letter_spacing_style": "text_spacing_valid.html", + "fail_word_spacing_style": "text_spacing_valid.html", + "fail_line_height_style": "text_spacing_valid.html" + } + }, + messages: { + "en-US": { + "pass": "CSS !important is not used in inline style to control letter or word spacing or line height", + "group": "CSS !important should not be used in inline style to control letter or word spacing or line height", + "fail_letter_spacing_style": "CSS !important should not be used in inline ‘letter-spacing’ style", + "fail_word_spacing_style": "CSS !important should not be used in inline ‘word-spacing’ style", + "fail_line_height_style": "CSS !important should not be used in inline ‘line-height’ style" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.12"], + "level": IRule_1.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_1.eToolkitLevel.LEVEL_THREE + }], + act: ['9e45ec', '24afc2', '78fd32'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Ensure that this element has children with actual text + var childStr = ""; + var childNodes = ruleContext.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType === 3) { // Text node + childStr += childNodes[i].nodeValue; + } + } + if (childStr.trim().length === 0) { + return null; + } + // Skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Skip the check if the element is off screen + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + if (!bounds || bounds['top'] < 0 || bounds['left'] < 0) { + return null; + } + // Skip non-HTML elements (e.g., SVG) + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + // Font size always resolved to 'px' + var computedStyle = getComputedStyle(ruleContext); + var fontSize = parseFloat(computedStyle.getPropertyValue('font-size')); + // Early exit optimization: Check if computed styles already pass + // If all three properties have passing values, we can skip the expensive getDefinedStyles call + var computedWordSpacing = computedStyle.getPropertyValue('word-spacing'); + var computedLetterSpacing = computedStyle.getPropertyValue('letter-spacing'); + var computedLineHeight = computedStyle.getPropertyValue('line-height'); + // Check if computed values pass the requirements + var wordSpacingPasses = true; + var letterSpacingPasses = true; + var lineHeightPasses = true; + // Check word-spacing (ignore 0px which represents default/normal) + if (computedWordSpacing) { + var wordValue = parseFloat(computedWordSpacing); + if (!isNaN(wordValue)) { + var wordPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', wordValue.toString(), ruleContext); + if (wordPixels !== null && wordPixels / fontSize < MIN_WORD_SPACING_RATIO) { + wordSpacingPasses = false; + } + } + } + // Check letter-spacing (ignore 0px which represents default/normal) + if (computedLetterSpacing) { + var letterValue = parseFloat(computedLetterSpacing); + if (!isNaN(letterValue)) { + var letterPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', letterValue.toString(), ruleContext); + if (letterPixels !== null && letterPixels / fontSize < MIN_LETTER_SPACING_RATIO) { + letterSpacingPasses = false; + } + } + } + // Check line-height + if (computedLineHeight) { + var lineValue = parseFloat(computedLineHeight); + if (!isNaN(lineValue)) { + // Line height can be unitless or in pixels + var match = computedLineHeight.match(STYLE_VALUE_REGEX); + if (match) { + var value = match[1], unit = match[2]; + if (unit === '' || unit === 'px') { + var ratio = unit === '' ? parseFloat(value) : parseFloat(value) / fontSize; + if (ratio < MIN_LINE_HEIGHT_RATIO) { + lineHeightPasses = false; + } + } + } + } + } + // If all computed values pass, we can skip the expensive getDefinedStyles check + if (wordSpacingPasses && letterSpacingPasses && lineHeightPasses) { + return null; + } + // Get defined styles to check for !important declarations + var styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["word-spacing", "letter-spacing", "line-height"]); + if (Object.keys(styles).length === 0) { + return null; + } + var results = []; + // Check word-spacing + var wordStyle = styles['word-spacing']; + if (wordStyle) { + wordStyle = resolveInheritedStyle(ruleContext, 'word-spacing', wordStyle); + var result = checkSpacingProperty(ruleContext, 'word-spacing', wordStyle, fontSize, MIN_WORD_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_word_spacing_style')); + } + // Check letter-spacing + var letterStyle = styles['letter-spacing']; + if (letterStyle) { + letterStyle = resolveInheritedStyle(ruleContext, 'letter-spacing', letterStyle); + var result = checkSpacingProperty(ruleContext, 'letter-spacing', letterStyle, fontSize, MIN_LETTER_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_letter_spacing_style')); + } + // Check line-height (only if no scrollable ancestor) + var lineStyle = styles['line-height']; + var overflowStyles = { + "overflow": ['auto', 'scroll'], + "overflow-x": ['auto', 'scroll'], + "overflow-y": ['auto', 'scroll'] + }; + if (lineStyle && CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext, overflowStyles) === null) { + lineStyle = resolveInheritedStyle(ruleContext, 'line-height', lineStyle); + var result = checkSpacingProperty(ruleContext, 'line-height', lineStyle, fontSize, MIN_LINE_HEIGHT_RATIO, true // Allow unitless values for line-height + ); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_line_height_style')); + } + return results.length > 0 ? results : null; + } +}; + + +/***/ }, + +/***/ 855 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_whitespace_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.text_whitespace_valid = { + id: "text_whitespace_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_whitespace_valid.html", + "potential_text": "text_whitespace_valid.html", + "group": "text_whitespace_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_text": "Space characters should not be used to create space between the letters of a word", + "group": "Space characters should not be used to control spacing within a word" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger if we're not in the body or if we're in a script + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body", "script", "code"]); + if (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body") + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + passed = !(/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(txtVal)); + } + walkNode = walkNode.nextSibling; + } + if (passed) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_text"); + } +}; + + +/***/ }, + +/***/ 3420 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIAMapper_1 = __webpack_require__(9955); +var DOMWalker_1 = __webpack_require__(3864); +var VisUtil_1 = __webpack_require__(3946); +exports.widget_tabbable_exists = { + id: "widget_tabbable_exists", + context: "aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton", + refactor: { + "IBMA_Focus_Tabbable": { + "pass": "pass", + "fail_no_tabbable": "fail_no_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_exists.html", + "fail_no_tabbable": "widget_tabbable_exists.html", + "group": "widget_tabbable_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_no_tabbable": "Component with \"{0}\" role does not have a tabbable element", + "group": "Component must have at least one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role_1 = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role_1, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + // skip the count if the element requires presentational children only + if (count < 1 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 1 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + var passed = count >= 1; + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_no_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ 408 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_single = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMWalker_1 = __webpack_require__(3864); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIAMapper_1 = __webpack_require__(9955); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.widget_tabbable_single = { + id: "widget_tabbable_single", + context: "aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab", + refactor: { + "IBMA_Focus_MultiTab": { + "pass": "pass", + "potential_multiple_tabbable": "potential_multiple_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_single.html", + "potential_multiple_tabbable": "widget_tabbable_single.html", + "group": "widget_tabbable_single.html" + } + }, + messages: { + "en-US": { + "pass": "Components with a widget role should have no more than one tabbable element", + "potential_multiple_tabbable": "Component with \"{0}\" role has more than one tabbable element", + "group": "Components with a widget role must have no more than one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + //skip the count if the element requires presentational children only + var name = []; + if (count < 2 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 2 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + // Radio inputs with the same name natively are only one tab stop + /**if (nw.node.nodeName.toLowerCase() === 'input' && (nw.node as Element).getAttribute("type") === 'radio') { + let curName = (nw.node as Element).getAttribute("name"); + if (name.includes(curName)) + continue; + else + name.push(curName); + }*/ + ++count; + } + } + } + var passed = count < 2; + if (!passed) + CacheUtil_1.CacheUtil.setCache(ruleContext, "widget_tabbable_single", "potential_multiple_tabbable"); + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_multiple_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ 6160 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a11yRulesets = void 0; +// This file comes from https://raw.githubusercontent.com/act-rules/act-tools/main/src/data/sc-urls.json +var SCURLs = __importStar(__webpack_require__(8855)); +var IGuideline_1 = __webpack_require__(8601); +var SCs = []; +for (var key in SCURLs) { + SCs.push(SCURLs[key]); +} +var summaries = { + "1.1.1": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.", + "1.2.1": "For prerecorded audio-only or video-only media, an alternative provides equivalent information.", + "1.2.2": "Captions are provided for all prerecorded audio content in synchronized media.", + "1.2.3": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.", + "1.2.4": "Captions are provided for all live audio content in synchronized media.", + "1.2.5": "Audio description is provided for all prerecorded video content in synchronized media.", + "1.3.1": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.", + "1.3.2": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.", + "1.3.3": "Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.", + "1.3.4": "Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.", + "1.3.5": "The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.", + "1.4.1": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.", + "1.4.2": "If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.", + "1.4.3": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.", + "1.4.4": "Text can be resized without assistive technology up to 200 percent without loss of content or functionality.", + "1.4.5": "If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.", + "1.4.10": "Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.", + "1.4.11": "The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.", + "1.4.12": "No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.", + "1.4.13": "Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.", + "2.1.1": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.", + "2.1.2": "If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.", + "2.1.4": "If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.", + "2.2.1": "For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.", + "2.2.2": "For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.", + "2.3.1": "Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.", + "2.4.1": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.", + "2.4.2": "Web pages, non-web documents, and software have titles that describe topic or purpose.", + "2.4.3": "If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.", + "2.4.4": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.", + "2.4.5": "More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.", + "2.4.6": "Headings and labels describe topic or purpose.", + "2.4.7": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.", + "2.4.11": "When an element receives focus, it is not entirely covered by other content.", + "2.5.1": "All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.", + "2.5.2": "For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.", + "2.5.3": "For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.", + "2.5.4": "Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.", + "2.5.8": "The size of the target for pointer inputs is at least 24 by 24 CSS pixels.", + "2.5.7": "All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.", + "3.1.1": "The default human language of Web pages, non-Web documents, or software can be programmatically determined.", + "3.1.2": "The human language of each passage or phrase in the content can be programmatically determined.", + "3.2.1": "When any component receives focus, it does not initiate a change of context.", + "3.2.2": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.", + "3.2.3": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.", + "3.2.4": "Components that have the same functionality within a set of Web pages are identified consistently.", + "3.2.6": "Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.", + "3.3.1": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.", + "3.3.2": "Labels or instructions are provided when content requires user input.", + "3.3.3": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.", + "3.3.4": "For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.", + "3.3.7": "Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.", + "3.3.8": "Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.", + "4.1.1": "(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.", + "4.1.2": "For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.", + "4.1.3": "In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.", + "HTML": "The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.", + "ARIA": "The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.", +}; +exports.a11yRulesets = [ + // { + // id: "DEBUG", + // name: "DEBUG Rules", + // category: eRuleCategory.ACCESSIBILITY, + // description: "Rules for debugging", + // checkpoints: [{ + // num: "1", + // name: "Debug CP 1", + // wcagLevel: "A", + // summary: "Rules for Debug" + // }] + // }, + { + id: "EXTENSIONS", + name: "Extension Rules", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for enabling the browser extensions", + type: IGuideline_1.eGuidelineType.EXTENSION, + checkpoints: [{ + num: "1", + name: "Extension CP 1", + wcagLevel: "A", + summary: "Rules for Extension" + }] + }, + { + id: "IBM_Accessibility", + name: "IBM Accessibility 7.3", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "IBM_Accessibility_next", + name: "IBM Accessibility next", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_2", + name: "WCAG 2.2 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_1", + name: "WCAG 2.1 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_0", + name: "WCAG 2.0 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.", + // This ruleset has all 2.0 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + } +]; + + +/***/ }, + +/***/ 5233 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRController = void 0; +var SRCursor_1 = __webpack_require__(8195); +var SRRenderer_1 = __webpack_require__(7014); +var SRNavigator_1 = __webpack_require__(248); +var CacheUtil_1 = __webpack_require__(4566); +var SRUtil_1 = __webpack_require__(2165); +var VisUtil_1 = __webpack_require__(3946); +var DOMUtil_1 = __webpack_require__(1686); +/** + * SRController class for managing screen reader simulation + * Maintains a point of regard and provides navigation functions + */ +var SRController = /** @class */ (function () { + /** + * Creates a new SRController + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRController(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + this.rootElement = rootElement; + this.liveListeners = []; + this.ctrlDoc = rootElement.ownerDocument; + this.setPointOfRegard(rootElement); + this.setupMutationTracking(); + console.info("[WARNING] The SRController is a new feature that is not yet \"stable\". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback."); + } + SRController.getController = function (ctrlDoc) { + if (ctrlDoc === void 0) { ctrlDoc = document; } + if (!this.singleton) { + this.singleton = new SRController(ctrlDoc.body); + } + return this.singleton; + }; + SRController.prototype.disconnect = function () { + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + }; + SRController.prototype.findAllShadowRoots = function (root) { + if (root === void 0) { root = document; } + var shadowRoots = []; + // Get all elements in the current root + var walker = this.ctrlDoc.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null); + var node; + while (node = walker.nextNode()) { + var element = node; + // Check if this element has an open shadow root + if (element.shadowRoot) { + shadowRoots.push(element.shadowRoot); + // Recursively search inside this shadow root + var nestedShadowRoots = this.findAllShadowRoots(element.shadowRoot); + shadowRoots.push.apply(shadowRoots, nestedShadowRoots); + } + } + return shadowRoots; + }; + /** + * Set up mutation tracking + * + * In the event that the point of regard is removed from the DOM, we need to get up to the nearest parent that's not being removed + */ + SRController.prototype.setupMutationTracking = function () { + var _this = this; + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + var myThis = this; + var observer = new MutationObserver(function (mutations) { + var porNode = myThis.pointOfRegard.getNode(); + var _loop_1 = function (removalMutation) { + removalMutation.removedNodes.forEach(function (removedNode) { + if (removedNode.isSameNode(porNode) || removedNode.contains(porNode)) { + console.info("Adjusting PoR due to DOM mutation removing PoR"); //, removalMutation.target, removedNode, porNode) + porNode = removalMutation.target; + } + }); + }; + for (var _i = 0, _a = mutations.filter(function (mutation) { var _a; return ((_a = mutation.removedNodes) === null || _a === void 0 ? void 0 : _a.length) > 0; }); _i < _a.length; _i++) { + var removalMutation = _a[_i]; + _loop_1(removalMutation); + } + ; + _this.setPointOfRegard(porNode); + var _loop_2 = function (mutation) { + if (mutation.addedNodes) { + mutation.addedNodes.forEach(function (addedNode) { + // Add observation of new shadow roots + var allRoots = _this.findAllShadowRoots(addedNode); + for (var _i = 0, allRoots_2 = allRoots; _i < allRoots_2.length; _i++) { + var root = allRoots_2[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }); + } + var node = mutation.target; + var elem = node.nodeType === 1 ? node : node.parentElement; + if (elem + && !elem.closest("[aria-busy=\"true\"]") + && elem.getAttribute("aria-busy") !== "true") { + // Identify the live region container + var liveRegionElem = + // The element itself is a live region container + ((["polite", "assertive"].includes(elem.getAttribute("aria-live")) + || elem.nodeName.toUpperCase() === "OUTPUT" + || ["status", "log", "progressbar", "alert", "timer"].includes(elem.getAttribute("role"))) && elem) + // Or get the nearest ancestor + || elem.closest("[aria-live=\"polite\"],[aria-live=\"assertive\"],output,[role=\"status\"],[role=\"log\"],[role=\"progressbar\"],[role=\"alert\"],[role=\"timer\"]"); + var isMutationRelevant = false; + var relevance_1 = ["additions", "text"]; + if (liveRegionElem) { + // Determine what kinds of changes are 'relevant' + var relevantElem = elem.closest("[aria-relevant]"); + if (relevantElem) { + relevance_1 = relevantElem.getAttribute("aria-relevant").split(/ +/g); + } + if (liveRegionElem.getAttribute("role") === "log") { + relevance_1 = ["additions"]; + } + if (liveRegionElem.hasAttribute("aria-relevant")) { + relevance_1 = liveRegionElem.getAttribute("aria-relevant").split(/ +/g); + } + if (relevance_1.includes("all")) { + relevance_1 = ["additions", "removals", "text"]; + } + isMutationRelevant = (mutation.target.nodeType === 3 && relevance_1.includes("text")) + || (mutation.addedNodes.length > 0 && relevance_1.includes("additions")) + || (mutation.removedNodes.length > 0 && relevance_1.includes("removals")); + } + if (liveRegionElem && isMutationRelevant) { + var isAtomic_1 = liveRegionElem.getAttribute("aria-atomic") === "true" || ["alert", "status", "timer", "marquee"].includes(liveRegionElem.getAttribute("role")); + // Read the whole region if atomic + if (!isAtomic_1 && mutation.type === "characterData" && mutation.target.nodeType === 3 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(mutation.target.parentElement)) { + for (var _c = 0, _d = _this.liveListeners; _c < _d.length; _c++) { + var liveListener = _d[_c]; + liveListener(mutation.target.nodeValue); + } + } + else { + var liveTarget_1 = isAtomic_1 ? liveRegionElem : mutation.target; + if (liveTarget_1.liveAnnounce) { + clearTimeout(liveTarget_1.liveAnnounce); + } + liveTarget_1.liveAnnounce = setTimeout(function () { + var results = []; + var isRemoval = (relevance_1.includes("removals") && mutation.removedNodes.length > 0); + if (isAtomic_1 || isRemoval) { + var liveCursor = new SRCursor_1.SRCursor(liveTarget_1, false); + var liveCursorEnd = new SRCursor_1.SRCursor(liveTarget_1, true); + liveCursorEnd.next(function () { return true; }); + results.push((isRemoval ? "[removed] " : "") + SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + } + else if (relevance_1.includes("additions") && mutation.addedNodes.length > 0) { + mutation.addedNodes.forEach(function (addedNode) { + // Just render the additions + var liveCursor = new SRCursor_1.SRCursor(addedNode, false); + var liveCursorEnd = new SRCursor_1.SRCursor(addedNode, true); + liveCursorEnd.next(function () { return true; }); + results.push(SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + }); + } + for (var _i = 0, _a = _this.liveListeners; _i < _a.length; _i++) { + var liveListener = _a[_i]; + liveListener(results.join("\n")); + } + }, 100); + } + } + } + }; + for (var _b = 0, mutations_1 = mutations; _b < mutations_1.length; _b++) { + var mutation = mutations_1[_b]; + _loop_2(mutation); + } + }); + // Need to observe all of the shadow roots + var allRoots = this.findAllShadowRoots(this.ctrlDoc.documentElement); + allRoots.push(this.ctrlDoc.documentElement); + for (var _i = 0, allRoots_1 = allRoots; _i < allRoots_1.length; _i++) { + var root = allRoots_1[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }; + SRController.prototype.addLiveListener = function (listener) { + this.liveListeners.push(listener); + }; + SRController.prototype.removeLiveListener = function (removeListener) { + this.liveListeners = this.liveListeners.filter(function (listener) { return listener !== removeListener; }); + }; + /** + * Get the current point of regard + * @returns The current SRCursor representing the point of regard + */ + SRController.prototype.getPointOfRegard = function () { + return this.pointOfRegard; + }; + /** + * Set the point of regard to a specific DOM node + * @param node The node to set as the point of regard + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.setPointOfRegard = function (node) { + var _a; + var DEBUG = false; + DEBUG && console.group("setPointOfRegard"); + try { + this.pointOfRegard = new SRCursor_1.SRCursor(node); + // Update container state + var containerChanges = SRController.diffContainers("focus", this.pointOfRegard); + var role = this.pointOfRegard.getRole(); + var name_1 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + return { + success: true, + renderingResult: SRRenderer_1.SRRenderer.renderCurrent("focus", this.pointOfRegard, containerChanges), + role: role, + name: name_1 + }; + } + catch (error) { + return { + success: false, + renderingResult: { + start: this.pointOfRegard.clone(), + end: this.pointOfRegard.clone(), + message: "Failed to set point of regard: ".concat(error.message) + } + }; + } + finally { + DEBUG && console.groupEnd(); + } + }; + /** + * Jump to the next element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpNext = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + var DEBUG = false; + DEBUG && console.group("jumpNext"); + try { + var bContinue = true; + var nextJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && nextJump) { + var lastJump = nextJump.clone(); + nextJump = SRNavigator_1.SRNavigator.jumpNext(mode, nextJump); + if (nextJump) { + var containerChanges = SRController.diffContainers(mode, nextJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(nextJump.getRole(), !nextJump.isEndTag(), nextJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, nextJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!nextJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No next ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = nextJump; + var role = this.pointOfRegard.getRole(); + var name_2 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // Check for container changes + DEBUG && console.log("New POR:", this.pointOfRegard.getNode(), renderingResult); + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_2 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + finally { + console.groupEnd(); + } + }; + /** + * Jump to the previous element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpPrevious = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + try { + var bContinue = true; + var prevJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && prevJump) { + var lastJump = prevJump.clone(); + prevJump = SRNavigator_1.SRNavigator.jumpPrevious(mode, prevJump); + if (prevJump) { + var containerChanges = SRController.diffContainers(mode, prevJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(prevJump.getRole(), !prevJump.isEndTag(), prevJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, prevJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!prevJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No previous ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = prevJump; + var role = this.pointOfRegard.getRole(); + var name_3 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // // Check for container changes + // const containerChanges = SRController.diffContainers(mode, this.pointOfRegard, oldPointOfRegard); + // let s = SRRenderer.renderEnter(mode, this.pointOfRegard); + // if (containerChanges.entering[containerChanges.entering.length-1] !== s) { + // containerChanges.entering.push(s); + // } + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_3 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + }; + /** + * Determine the different in containers between the two nodes + * @param newWalker The new node we're navigating to + * @param oldWalker The previous node we were at + * @returns Array of container change messages + */ + /** + * Walk up from a node in an iframe subdocument to find the host <iframe> element + * in the nearest ancestor document. Returns null if the node is not in a subdocument. + */ + SRController.hostIframe = function (node) { + var doc = node.ownerDocument; + if (!doc || doc === document) + return null; + // contentWindow.frameElement is the <iframe> in the parent document + try { + return DOMUtil_1.DOMUtil.getAncestor(node, ["iframe"]); + } + catch (_a) { + return null; + } + }; + SRController.diffContainers = function (mode, newWalker, oldWalker) { + var _a, _b; + var DEBUG = false; + DEBUG && console.log("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"); + DEBUG && console.log("A)", oldWalker === null || oldWalker === void 0 ? void 0 : oldWalker.getNode().nodeName, newWalker.getNode().nodeName); + var leaving = []; + var entering = []; + try { + var newDoc = (_a = newWalker === null || newWalker === void 0 ? void 0 : newWalker.getNode().ownerDocument) !== null && _a !== void 0 ? _a : document; + var oldDoc = (_b = oldWalker === null || oldWalker === void 0 ? void 0 : oldWalker.getNode().ownerDocument) !== null && _b !== void 0 ? _b : document; + // ── Cross-document iframe boundary ────────────────────────────────── + // When the navigation crosses into or out of an <iframe> subdocument + // the normal commonParent walk cannot span document boundaries. + // We detect this and manually inject the container-enter/exit for the + // <iframe> element itself. + if (newDoc !== oldDoc) { + var newIframe = SRController.hostIframe(newWalker.getNode()); + var oldIframe = SRController.hostIframe(oldWalker === null || oldWalker === void 0 ? void 0 : oldWalker.getNode()); + if (newIframe && !oldIframe) { + // Entering an iframe subdocument — emit the frame container-enter. + var iframeCursor = new SRCursor_1.SRCursor(newIframe, false); + var enter = SRRenderer_1.SRRenderer.renderEnter(mode, iframeCursor, oldWalker); + if (enter && enter.trim()) + entering.push(enter.trim()); + } + else if (!newIframe && oldIframe) { + // Leaving an iframe subdocument — emit the frame container-exit. + var iframeCursor = new SRCursor_1.SRCursor(oldIframe, true); + var leave = SRRenderer_1.SRRenderer.renderLeave(mode, iframeCursor, oldWalker); + if (leave && leave.trim()) + leaving.push(leave.trim()); + } + else if (newIframe && oldIframe && newIframe !== oldIframe) { + // Moving between two different iframes — exit old, enter new. + var oldCursor = new SRCursor_1.SRCursor(oldIframe, true); + var leave = SRRenderer_1.SRRenderer.renderLeave(mode, oldCursor, oldWalker); + if (leave && leave.trim()) + leaving.push(leave.trim()); + var newCursor = new SRCursor_1.SRCursor(newIframe, false); + var enter = SRRenderer_1.SRRenderer.renderEnter(mode, newCursor, oldWalker); + if (enter && enter.trim()) + entering.push(enter.trim()); + } + // After injecting iframe boundary announcements, also run the normal + // within-document diffContainers for each side independently so that + // landmarks inside the iframe are announced correctly. + return { leaving: leaving, entering: entering }; + } + // ── Same-document path (original logic) ───────────────────────────── + var docRoot = newWalker ? + (newWalker.getNode().ownerDocument.body || newWalker.getNode().ownerDocument.documentElement) : + oldWalker ? + (oldWalker.getNode().ownerDocument.body || oldWalker.getNode().ownerDocument.documentElement) : + document.body || document.documentElement; + var walkNew = newWalker ? newWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + var walkOld = oldWalker ? oldWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + if (!walkNew.getNode().isSameNode(walkOld.getNode())) { + var commonParent = SRController.commonParent(walkNew, walkOld); + if (commonParent) { + DEBUG && console.log("B)", commonParent.getNode().nodeName); + while (commonParent.contains(walkNew)) { + DEBUG && console.log("Entering:", walkNew.getNode().nodeName); + entering.push(SRRenderer_1.SRRenderer.renderEnter(mode, walkNew, walkOld)); + walkNew.parent(); + } + entering.reverse(); + entering = entering.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + ; + while (commonParent.contains(walkOld)) { + DEBUG && console.log("Leaving:", walkOld.getNode().nodeName); + leaving.push(SRRenderer_1.SRRenderer.renderLeave(mode, walkOld, walkOld)); + walkOld.parent(); + } + leaving = leaving.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + } + } + } + catch (err) { + console.error(err); + } + DEBUG && console.log(leaving, entering); + return { + leaving: leaving, + entering: entering + }; + }; + SRController.commonParent = function (walkerOne, walkerTwo) { + if (walkerOne.contains(walkerTwo)) { + return walkerOne.clone(); + } + else if (walkerTwo.contains(walkerOne)) { + return walkerTwo.clone(); + } + else { + var commonParent = walkerOne.clone(); + while (!commonParent.contains(walkerTwo) && commonParent.parent()) + ; + if (!commonParent.contains(walkerOne) || !commonParent.contains(walkerTwo)) { + return null; + } + return commonParent; + } + }; + SRController.renderAll = function (mode) { + var ctrl = SRController.getController(); + var dialogs = ctrl.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg.message); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + results.push(nextVal.renderingResult.message); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderAllDetail = function (doc, mode) { + var ctrl = SRController.getController(doc); + ctrl.setPointOfRegard(doc.body); + var dialogs = doc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + // mode === "item" && console.log(nextVal); + results.push(nextVal.renderingResult); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderStructure = function (doc) { + var _a, _b; + var modes = ["region", "heading", "item", "tab_focus", "image"]; + var details = modes.map(function (modeLabel) { return SRController.renderAllDetail(doc, modeLabel); }); + var retVal = []; + var _loop_3 = function () { + var next = (_a = details[0][0]) === null || _a === void 0 ? void 0 : _a.start; + modes.forEach(function (mode, idx) { + if (details[idx].length > 0) { + if (!next || SRCursor_1.SRCursor.compare(details[idx][0].start, next) < 0) { + next = details[idx][0].start; + } + } + }); + var nextItem = {}; + var hasValue = false; + modes.forEach(function (mode, idx) { + nextItem[mode] = ""; + if (details[idx].length > 0 && SRCursor_1.SRCursor.compare(details[idx][0].start, next) === 0) { + nextItem[mode] = details[idx].shift().message; + hasValue = nextItem[mode] !== ""; + } + }); + if (hasValue) { + var elem = next.getElement(); + var selector = elem && SRUtil_1.SRUtil.getUniqueSelector(elem); + // Use the element's own document for querySelector so that elements + // inside iframe subdocuments resolve correctly. + var elemDoc = (_b = elem === null || elem === void 0 ? void 0 : elem.ownerDocument) !== null && _b !== void 0 ? _b : doc; + if (selector && elemDoc.querySelector(selector)) { + nextItem.selector = selector; + } + retVal.push(nextItem); + } + }; + while (details.some(function (detail) { return detail.length > 0; })) { + _loop_3(); + } + return retVal; + }; + return SRController; +}()); +exports.SRController = SRController; + + +/***/ }, + +/***/ 8195 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRCursor = void 0; +var DOMWalker_1 = __webpack_require__(3864); +var AccNameUtil_1 = __webpack_require__(1950); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var SRUtil_1 = __webpack_require__(2165); +/** + * SRCursor (Screen Reader Cursor) class + * + * This class provides a cursor-like interface for navigating the DOM in a way that + * simulates how screen readers process and navigate content. It tracks: + * - The current node position + * - Whether it's at a start or end tag + * - The ARIA role of the current node + * - The accessible name of the current node + */ +var SRCursor = /** @class */ (function () { + /** + * Creates a new SRCursor positioned at the specified element + * @param element - The DOM node to position the cursor at + * @param bEnd - Whether to position at the end tag (true) or start tag (false) + */ + function SRCursor(element, bEnd) { + // Use DOMWalker with considerHidden=false to process all content (including hidden elements) + // This is important for screen reader simulation which needs to see all content + this.walker = new DOMWalker_1.DOMWalker(element, bEnd, undefined, false); + if (element) { + this.refreshName(); + } + } + /** + * Creates a copy of this cursor at the same position + * @returns A new SRCursor instance with the same position and properties + */ + SRCursor.prototype.clone = function () { + var retVal = new SRCursor(this.walker.node, this.walker.bEndTag); + retVal.role = this.role; + retVal.name = this.name; + retVal.preLineIndex = this.preLineIndex; + return retVal; + }; + /** + * Updates the role and accessible name properties based on the current node + * This is called whenever the cursor position changes + * @private + */ + SRCursor.prototype.refreshName = function () { + if (this.walker.node.nodeType === 1) { + // Element node + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + // Text node + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + // Other node types + this.role = undefined; + this.name = undefined; + } + }; + /** + * Moves the cursor to the next node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.next = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + // const DEBUG = false; + var foundNext = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("next function"); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && !this.walker.bEndTag) { + this.walker.bEndTag = true; + } + else if (!this.walker.nextNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundNext = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundNext); + DEBUG && console.log("foundNext:", foundNext, this.isEndTag() ? "/" : "", this.getNode()); + DEBUG && console.groupEnd(); + if (foundNext) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundNext; + }; + /** + * Moves the cursor to the previous node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.previous = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + var foundPrevious = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("previous function"); + DEBUG && console.log(this.isEndTag(), this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log(skipCurrent, skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && this.walker.bEndTag) { + DEBUG && console.log("Skipping node"); + this.walker.bEndTag = false; + } + else if (!this.walker.prevNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag(), this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log(skipCurrent, skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && !this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundPrevious = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundPrevious); + DEBUG && console.log(this.isEndTag(), this.getNode()); + DEBUG && console.groupEnd(); + if (foundPrevious) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundPrevious; + }; + /** + * Moves the cursor to the parent node of the current node + * @param endTag - Whether to position at the end tag (true) or start tag (false) + * @returns true if successfully moved to parent, false if no parent exists + */ + SRCursor.prototype.parent = function (endTag) { + if (!this.walker.node.parentNode) + return false; + this.walker.node = this.walker.node.parentNode; + this.walker.bEndTag = endTag === true; + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + this.role = undefined; + this.name = undefined; + } + return true; + }; + /** + * Moves the cursor up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.getCurrentOrParentByRole = function (roles, elems) { + var _this = this; + var uppElems = elems ? elems.map(function (elem) { return elem.toUpperCase(); }) : []; + var matches = function (walker) { + var elem = walker.getElement(); + return roles.includes(_this.getRole()) + || (elem && !elem.hasAttribute("role") && uppElems.includes(elem.nodeName.toUpperCase())); + }; + while (!matches(this) && this.parent()) + ; + return matches(this); + }; + /** + * Creates a new cursor and moves it up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns A new cursor at the matching node, or null if no match found + */ + SRCursor.prototype.getCurrentOrParentByRoleClone = function (roles, elems) { + var retVal = this.clone(); + if (retVal.getCurrentOrParentByRole(roles, elems)) { + return retVal; + } + return null; + }; + SRCursor.prototype.getCurrentOrParentTabbableClone = function () { + var retVal = this.clone(); + while (retVal) { + var elem = retVal.getElement(); + if (retVal.isStartTag() && elem && CommonUtil_1.CommonUtil.isTabbable(elem)) { + return retVal; + } + if (!retVal.parent(false)) { + break; + } + } + return null; + }; + /** + * Gets the ARIA role of the current node + * @returns The ARIA role as a string, or undefined if not available + */ + SRCursor.prototype.getRole = function () { + return this.role; + }; + /** + * Gets the accessible name info for the current node + * @returns The AccessibleNameResult object, or undefined if not available + */ + SRCursor.prototype.getNameInfo = function () { + return this.name; + }; + /** + * Get the accessible name of the current node + */ + SRCursor.prototype.getName = function () { + // Handle one-off quirks in the name calculation + var nameInfo = this.getNameInfo(); + if (nameInfo && nameInfo.name) { + return nameInfo.name; + } + var elem = this.getElement(); + if (elem) { + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + return labelElem.innerText || labelElem.textContent; + } + } + }; + /** + * Sets whether the cursor is at an end tag or start tag + * @param val - True for end tag, false for start tag + */ + SRCursor.prototype.setEndTag = function (val) { + this.walker.bEndTag = val; + }; + /** + * Gets the DOM node at the current cursor position + * @returns The current DOM node + */ + SRCursor.prototype.getNode = function () { + return this.walker.node; + }; + /** + * Gets the current node as an HTMLElement if it is an element node + * @returns The current node as HTMLElement, or undefined if not an element + */ + SRCursor.prototype.getElement = function () { + if (!this.walker.node) + return undefined; + if (this.walker.node.nodeType !== 1) + return undefined; + return this.walker.node; + }; + SRCursor.prototype.getParentElement = function () { + if (!this.walker.node) + return null; + var retVal = this.clone(); + retVal.walker.node = DOMWalker_1.DOMWalker.parentElement(retVal.walker.node); + return retVal; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isEndTag = function () { + return this.walker.bEndTag; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isStartTag = function () { + return !this.walker.bEndTag; + }; + /** + * Compares the document position of two cursors + * @param one - First cursor to compare + * @param two - Second cursor to compare + * @returns 0 if equal, -1 if one is before two, 1 if one is after two + */ + SRCursor.compare = function (one, two) { + var _a, _b; + var nodeOne = (_a = one === null || one === void 0 ? void 0 : one.walker) === null || _a === void 0 ? void 0 : _a.node; + var nodeTwo = (_b = two === null || two === void 0 ? void 0 : two.walker) === null || _b === void 0 ? void 0 : _b.node; + if (!nodeOne && !nodeTwo) + return 0; + if (!nodeOne) + return 1; + if (!nodeTwo) + return -1; + // When both cursors are at the same <pre> element and at least one has a + // preLineIndex, use line index ordering so virtual per-line stops are sequenced + // correctly. preLineIndex=undefined means the block-enter stop, which comes + // before all numbered lines (undefined < 0 < 1 < 2 …). + if (nodeOne === nodeTwo && !one.walker.bEndTag && !two.walker.bEndTag) { + var lineOneUndefined = one.preLineIndex === undefined; + var lineTwoUndefined = two.preLineIndex === undefined; + if (!lineOneUndefined || !lineTwoUndefined) { + // At least one cursor has a line index + if (lineOneUndefined) + return -1; // undefined (block-enter) sorts before all lines + if (lineTwoUndefined) + return 1; // two is block-enter; one (a numbered line) is after + if (one.preLineIndex !== two.preLineIndex) { + return one.preLineIndex < two.preLineIndex ? -1 : 1; + } + } + } + var docPosition = nodeOne.compareDocumentPosition(nodeTwo); + // Handle disconnected nodes (different documents or shadow DOMs) + if (docPosition & 0x1) { + // Nodes are disconnected - they're in different trees (iframe or shadow DOM) + // Build ancestor chains using DOMWalker.parentNode (handles shadow DOM & iframes) + var ancestorsOne = [nodeOne]; + var ancestorsTwo = [nodeTwo]; + var current = nodeOne; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsOne.push(current); + } + current = nodeTwo; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsTwo.push(current); + } + // Reverse so root is first + ancestorsOne.reverse(); + ancestorsTwo.reverse(); + // Find where the paths diverge + var commonDepth = 0; + while (commonDepth < ancestorsOne.length && + commonDepth < ancestorsTwo.length && + ancestorsOne[commonDepth] === ancestorsTwo[commonDepth]) { + commonDepth++; + } + // If one path is a prefix of the other, handle containment + if (commonDepth === ancestorsOne.length) { + // nodeOne is an ancestor of nodeTwo + return one.walker.bEndTag ? 1 : -1; + } + if (commonDepth === ancestorsTwo.length) { + // nodeTwo is an ancestor of nodeOne + return two.walker.bEndTag ? -1 : 1; + } + // Compare the nodes where paths diverge + if (commonDepth > 0) { + var childOne = ancestorsOne[commonDepth]; + var childTwo = ancestorsTwo[commonDepth]; + var childPosition = childOne.compareDocumentPosition(childTwo); + if (childPosition & 0x2) + return 1; // childTwo precedes childOne + if (childPosition & 0x4) + return -1; // childOne precedes childTwo + } + // No common ancestor found - shouldn't happen in a well-formed document + return 0; + } + if (docPosition & 0x8) { + // one is contained within two + // if two is an end tag, one is before, otherwise, one is after + return two.walker.bEndTag ? -1 : 1; + } + else if (docPosition & 0x10) { + // two is contained within one + // if one is an end tag, one is after, otherwise, one is before + return one.walker.bEndTag ? 1 : -1; + } + else if (docPosition & 0x2) { + // two precedes one in the document + return 1; + } + else if (docPosition & 0x4) { + // one precedes two in the document + return -1; + } + return 0; + }; + /** + * Checks if this cursor's node contains another cursor's node + * @param other - The other cursor to check + * @returns true if this cursor contains (is a parent/ancestor of) the other cursor's node + */ + SRCursor.prototype.contains = function (other) { + return this.getNode().contains(other.getNode()) + && !this.isSameNode(other); + }; + /** + * Checks if this cursor points to the same node as another cursor + * @param other - The other cursor to compare with + * @returns true if both cursors point to the same node + */ + SRCursor.prototype.isSameNode = function (other) { + if (!other) + return false; + return this.getNode().isSameNode(other.getNode()); + }; + /** + * Checks if the current node has a non-empty accessible name + * @returns true if the node has a non-empty accessible name + */ + SRCursor.prototype.hasNonEmptyName = function () { + var _a; + return (((_a = this.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || "").trim().length > 0; + }; + return SRCursor; +}()); +exports.SRCursor = SRCursor; + + +/***/ }, + +/***/ 248 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRNavigator = void 0; +var DOMWalker_1 = __webpack_require__(3864); +var AccNameUtil_1 = __webpack_require__(1950); +var SRCursor_1 = __webpack_require__(8195); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var AriaUtil_1 = __webpack_require__(7011); +var SRNavigator; +(function (SRNavigator) { + /** + * Determine if a node is a block-level element based on its display property + * @param node The DOM node to check + * @returns true if the node is a block-level element, false otherwise + */ + function isBlockElement(node) { + var _a; + if (node.nodeType !== 1) + return false; + if (["br", "iframe"].includes(node.nodeName.toLowerCase())) + return true; + var elem = node; + var mywin = elem.ownerDocument.defaultView; + var disp = (_a = mywin.getComputedStyle(elem)) === null || _a === void 0 ? void 0 : _a.display; + if (disp && disp.startsWith("table")) + return true; + if (disp === "block" && elem.style.display !== "block") { + // Is this block because it's a flex elem? + if (elem.parentElement && mywin.getComputedStyle(elem.parentElement).display === "flex") { + return false; + } + } + if (AriaUtil_1.AriaUtil.getResolvedRole(elem, true) === "link") { + var temp = new DOMWalker_1.DOMWalker(node, false, undefined, false); + temp.prevNode(); + if (!isBlockElement(temp.node)) { + return true; + } + } + return ["block", "flex", "grid", "list-item"].includes(disp); + } + /** + * Collect all logical lines from a <pre> element by walking its entire subtree + * (via DOMWalker, shadow-DOM safe) and concatenating text node content, splitting + * on newlines. Only inline-context nodes are included — any descendant block + * element would be unusual inside <pre> and is ignored. + * + * Returns the trimmed, non-empty lines. + */ + function getPreLines(preElem) { + var _a; + // Concatenate all text inside the <pre>, preserving inline structure + var fullText = (_a = preElem.textContent) !== null && _a !== void 0 ? _a : ""; + var rawLines = fullText.split("\n"); + // Trim leading and trailing blank lines + var start = 0; + while (start < rawLines.length && rawLines[start].trim() === "") + start++; + var end = rawLines.length - 1; + while (end >= start && rawLines[end].trim() === "") + end--; + return rawLines.slice(start, end + 1); + } + SRNavigator.getPreLines = getPreLines; + /** + * Returns true if node is a <pre> element (the item-level cursor position for + * preformatted lines uses the <pre> element itself with preLineIndex set). + */ + function isPreElement(node) { + return node.nodeType === 1 && node.nodeName.toUpperCase() === "PRE"; + } + function getExplicitTabindex(node) { + if (!node || node.nodeType !== 1) + return null; + var elem = node; + if (!elem.hasAttribute("tabindex")) + return null; + var tabindexValue = parseInt(elem.getAttribute("tabindex"), 10); + return Number.isNaN(tabindexValue) ? null : tabindexValue; + } + function isPositiveTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return explicitTabindex !== null && explicitTabindex > 0 && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function isDefaultOrZeroTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return (explicitTabindex === null || explicitTabindex === 0) && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function getTabFocusStartFunc(includePositiveTabindex) { + if (includePositiveTabindex === void 0) { includePositiveTabindex = true; } + return function (_role, bStartTag, node) { + if (!(node && node.nodeType === 1 && bStartTag && CommonUtil_1.CommonUtil.isTabbable(node))) + return false; + return includePositiveTabindex || isDefaultOrZeroTabFocus(node); + }; + } + /** + * Collect all tabbable elements in tab order (positive tabindex first, then document order) + * @param matchFunc Function to match tabbable elements + * @param rootNode Optional root node to start collection from (defaults to document body) + * @returns Array of cursors pointing to tabbable elements in tab order + */ + function collectTabFocusCursors(matchFunc, rootNode) { + var root = ((rootNode === null || rootNode === void 0 ? void 0 : rootNode.ownerDocument) || document).body || rootNode; + if (!root) + return []; + var walker = new SRCursor_1.SRCursor(root, false); + var skipFunc = getSkipFunc("tab_focus"); + var positiveResults = []; + var normalResults = []; + var addCursor = function (cursor) { + if (!matchFunc(cursor.getRole(), !cursor.isEndTag(), cursor.getNode())) + return; + if (isPositiveTabFocus(cursor.getNode())) { + positiveResults.push(cursor.clone()); + } + else if (isDefaultOrZeroTabFocus(cursor.getNode())) { + normalResults.push(cursor.clone()); + } + }; + addCursor(walker); + while (walker.next(function () { return true; }, skipFunc)) { + addCursor(walker); + } + positiveResults.sort(function (a, b) { + var aElem = a.getElement(); + var bElem = b.getElement(); + var aTabindex = getExplicitTabindex(aElem) || 0; + var bTabindex = getExplicitTabindex(bElem) || 0; + if (aTabindex !== bTabindex) + return bTabindex - aTabindex; + return SRCursor_1.SRCursor.compare(a, b); + }); + return positiveResults.concat(normalResults); + } + /** + * Find the index of a cursor in an array of tab focus cursors + * @param cursors Array of cursors to search + * @param walker The cursor to find + * @returns The index of the cursor, or -1 if not found + */ + function findTabFocusIndex(cursors, walker) { + return cursors.findIndex(function (cursor) { return SRCursor_1.SRCursor.compare(cursor, walker) === 0; }); + } + /** + * Get the match function for identifying start positions in a given navigation mode + * @param mode The navigation mode (e.g., "link", "heading", "button", etc.) + * @returns A function that matches elements appropriate for the navigation mode + */ + function getStartFunc(mode) { + switch (mode) { + case "link": + return function (role, bStartTag) { return (bStartTag && role === "link"); }; + case "tab_focus": + return getTabFocusStartFunc(false); + case "heading": + return function (role, bStartTag) { return (bStartTag && role === "heading"); }; + case "h1": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "1"); }; + case "h2": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "2"); }; + case "h3": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "3"); }; + case "h4": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "4"); }; + case "h5": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "5"); }; + case "h6": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "6"); }; + case "image": + return function (role, bStartTag) { return (bStartTag && ["img", "graphics-document"].includes(role)); }; + case "radio": + return function (role, bStartTag) { return (bStartTag && role === "radio"); }; + case "button": + return function (role, bStartTag) { return (bStartTag && role === "button"); }; + case "checkbox": + return function (role, bStartTag) { return (bStartTag && role === "checkbox"); }; + case "combo": + return function (role, bStartTag) { return (bStartTag && role === "combobox"); }; + case "list": + return function (role, bStartTag) { return (bStartTag && role === "list"); }; + case "listitem": + return function (role, bStartTag) { return (bStartTag && role === "listitem"); }; + case "article": + return function (role, bStartTag) { return (bStartTag && role === "article"); }; + case "table": + return function (role, bStartTag) { return (bStartTag && role === "table"); }; + case "paragraph": + return function (_role, bStartTag, node) { return (bStartTag && node.nodeName.toUpperCase() === "P"); }; + case "dom": + return function () { return true; }; + case "item": + return function (cursor, bStartTag, node) { + if (!bStartTag) + return false; + // <iframe> content is inlined by the IFRAME SR_RULE into the + // parent block's rendering — the iframe itself is not an item stop. + if (node.nodeType === 1 && node.nodeName.toUpperCase() === "IFRAME") + return false; + // A <pre> element with preLineIndex set is a virtual per-line item. + // The initial encounter (preLineIndex undefined) is also a match so + // jumpNext can set preLineIndex=0 on it. + if (isPreElement(node)) + return true; + if (isBlockElement(node)) + return true; + var temp = new DOMWalker_1.DOMWalker(node, !bStartTag); + if (temp.prevNode() && temp.bEndTag) { + return isBlockElement(temp.node); + } + return false; + }; + case "region": + return function (role, bStartTag, node) { + var _a, _b; + if (!bStartTag) + return false; + if (["main", "navigation", "form", "banner", "search", "contentinfo"].includes(role)) + return true; + if (role !== "region" || (node === null || node === void 0 ? void 0 : node.nodeType) !== 1) + return false; + return !!((_b = (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(node)) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.trim()); + }; + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getStartFunc = getStartFunc; + /** + * Check if an element is within a Shadow DOM + * @param element The element to check + * @returns true if the element is in a Shadow DOM, false otherwise + */ + var isInShadowDOM = function (element) { + var root = element.getRootNode(); + return root instanceof ShadowRoot; + }; + /** + * Determine skip behavior for item navigation mode + * Handles complex visibility rules including hidden content in headings/links + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_ITEM_BEHAVIOR = function (cursor) { + var DEBUG = false; + DEBUG && console.group("SKIP_ITEM_BEHAVIOR"); + var retVal = null; + try { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + var cursorStart = cursor.clone(); + cursorStart.setEndTag(false); + DEBUG && console.log(nodeType); + // Skip CDATA and comments completely + if ([4, 8].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: true }; + // Only process elements and text + if (![1, 3].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: false }; + // For text elements, Consider with relation to their parent element + if (nodeType === 3) { + elem = cursor.getNode().parentElement; + if (!elem) + return retVal = VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + } + // if (!elem) console.log(cursor.getNode()); + // We have an element + // Make sure we're within the body element (or shadow DOM, or an iframe subdocument) + if (!elem.closest("body") && !isInShadowDOM(elem)) + return retVal = { skipCurrent: true, skipChildren: false }; + // Make sure we're not in a script or style + if (elem.closest("script,style")) + return retVal = { skipCurrent: true, skipChildren: true }; + // For text nodes, we need to check visibility in context of parent heading/link + // So we'll handle text node visibility checks below with the element visibility checks + // Skip things hidden from the AT, UNLESS we're inside a heading or link + // (headings and links should include their full accessible name, including hidden parts) + // BUT only if the heading/link uses nameFrom="content" (not aria-label/aria-labelledby) + var parentHeadingOrLink = cursorStart.getCurrentOrParentByRoleClone(["heading", "link"]); + // Special case: if current element itself is a heading or link AND we're NOT inside another heading/link, + // apply normal skip rules + var currentRole = AriaUtil_1.AriaUtil.getResolvedRole(elem); + var isCurrentHeadingOrLink = currentRole === "heading" || currentRole === "link"; + if (!parentHeadingOrLink) { + // Not inside any heading/link - apply normal skip rules + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + else { + // Check if the parent heading/link uses aria-label or aria-labelledby + var parentElem = parentHeadingOrLink.getElement(); + var nameInfo = parentHeadingOrLink.getNameInfo(); + // If nameFrom is NOT "content" or "text", skip all content (it's using aria-label/aria-labelledby) + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Parent uses aria-label/aria-labelledby - skip all content including nested headings/links + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + } + else if (isCurrentHeadingOrLink) { + // Current element is a heading/link inside another heading/link with content-based name + // Don't skip it - let it through so its content can be read + // (The logic at line 183 will handle whether to skip its children) + } + else { + // nameFrom is "content", so include hidden content but skip hidden images/graphics + var role_1 = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if ((role_1 === "img" || role_1 === "graphics-document") && VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + // Don't skip other hidden content - it should be included in the accessible name + } + } + if (elem.nodeName.toUpperCase() === "BODY") + return retVal = { skipCurrent: false, skipChildren: false }; + // Skip labels that are associated with controls - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL") { + if (elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + else { + var nestedControl = elem.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']"); + if (nestedControl && nestedControl.getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + // A <label> with no `for` and no nested control, used purely as an aria-labelledby + // target by another element, should be suppressed — it will be read as part of the + // widget's accessible name announcement. + var id = elem.getAttribute("id"); + if (id && document.querySelector("[aria-labelledby~=\"".concat(id, "\"]"))) { + return retVal = { skipCurrent: true, skipChildren: false }; + } + } + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursorStart.getRole(); + // A div/span combobox (role="combobox" on a non-input, non-select element) announces + // its value directly from text content or the controlled listbox, so skip its children + // to avoid double-announcing the inner text. + if (role === "combobox" + && elem.nodeName.toUpperCase() !== "SELECT" + && elem.nodeName.toUpperCase() !== "INPUT" + && !cursor.isEndTag()) { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // Skip children of headings/links that don't use content-based names + // UNLESS we're inside another heading/link that DOES use content-based names + if (["link", "heading"].includes(role) && (!cursorStart.getName() || (!["content", "text"].includes(cursorStart.getNameInfo().nameFrom)))) { + // Check if we're inside a parent heading/link with content-based name + if (parentHeadingOrLink && parentHeadingOrLink.getNameInfo() && ["content", "text"].includes(parentHeadingOrLink.getNameInfo().nameFrom)) { + // Don't skip children - we're nested inside a content-based heading/link + } + else { + return retVal = { skipCurrent: false, skipChildren: true }; + } + } + if (elem.nodeName.toUpperCase() === "LEGEND") { + var parent_1 = DOMWalker_1.DOMWalker.parentElement(cursor.getNode()); + while (parent_1) { + if (parent_1.nodeName.toUpperCase() === 'FIELDSET') { + // Legend is within a fieldset, suppress output + return retVal = { skipCurrent: false, skipChildren: true }; + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // <summary> is a self-announcing disclosure button — its children + // are folded into the ["label", button, collapsed] announcement, + // so skip traversal into them. + if (!cursor.isEndTag() && elem.nodeName.toUpperCase() === "SUMMARY") { + var detailsParent = elem.parentElement; + if (detailsParent && detailsParent.nodeName.toUpperCase() === "DETAILS") { + return retVal = { skipCurrent: false, skipChildren: true }; + } + } + // Skip non-summary children of a closed <details> element. + // Browsers hide those children via UA stylesheet (display:none), so + // they must not appear as reading stops when the widget is collapsed. + // Exempt the <details> element itself and <summary> (always visible). + if (!cursor.isEndTag() + && elem.nodeName.toUpperCase() !== "DETAILS" + && !elem.closest("summary")) { + var detailsAncestor = elem.closest("details"); + if (detailsAncestor && !detailsAncestor.hasAttribute("open")) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + } + if (elem.closest(".ibma-sr-overlay")) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + // Skip popup elements (listbox, tree, grid, dialog) that are owned by a combobox + // via aria-controls. In a real SR these are only reachable via aria-activedescendant, + // not by DOM traversal, so they should not appear as reading stops. + if (nodeType === 1 && !cursor.isEndTag()) { + var id = elem.getAttribute("id"); + if (id) { + var owner = document.querySelector("[aria-controls~=\"".concat(id, "\"]")); + if (owner && AriaUtil_1.AriaUtil.getResolvedRole(owner) === "combobox") { + return retVal = { skipCurrent: true, skipChildren: true }; + } + } + } + return retVal = null; + } + finally { + DEBUG && console.log("SKIP_ITEM retVal:", retVal); + DEBUG && console.groupEnd(); + } + }; + /** + * Determine skip behavior for nested navigation modes (link, heading, image, etc.) + * Simpler than SKIP_ITEM_BEHAVIOR as it doesn't need complex heading/link content rules + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_NESTED_BEHAVIOR = function (cursor) { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + // Only visit elements and text nodes + if (nodeType !== 1 && nodeType !== 3) + return { skipCurrent: true, skipChildren: false }; + if (nodeType === 3) + return VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + // We have an element + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return { skipCurrent: true, skipChildren: true }; + // Skip the inner document of an <iframe> — screen readers render the + // accessible name as the tab_focus label; the subdocument body should + // not contribute additional reading stops during renderRange traversal. + if (elem.nodeName.toUpperCase() === "IFRAME" && !cursor.isEndTag()) { + return { skipCurrent: false, skipChildren: true }; + } + // Skip label fors - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL" + && elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return { skipCurrent: true, skipChildren: false }; + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursor.getRole(); + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return { skipCurrent: false, skipChildren: true }; + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return { skipCurrent: true, skipChildren: true }; + } + if (elem.closest(".ibma-sr-overlay")) { + return { skipCurrent: true, skipChildren: true }; + } + return null; + }; + /** + * Get the skip function for a given navigation mode + * @param mode The navigation mode + * @returns A function that determines which nodes to skip during navigation + */ + function getSkipFunc(mode) { + switch (mode) { + case "region": + case "item": + return SKIP_ITEM_BEHAVIOR; + case "link": + case "tab_focus": + case "heading": + case "h1": + case "h2": + case "h3": + case "h4": + case "h5": + case "h6": + case "image": + return SKIP_NESTED_BEHAVIOR; + case "radio": + case "button": + case "checkbox": + case "combo": + case "list": + case "listitem": + case "article": + case "table": + case "paragraph": + case "dom": + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getSkipFunc = getSkipFunc; + /** + * Jump to the current position or the previous matching element if current doesn't match + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the current or previous matching position + */ + function jumpCurrent(mode, walker) { + var matchFunc = mode === "tab_focus" ? getTabFocusStartFunc(true) : getStartFunc(mode); + if (matchFunc(walker.getRole(), !walker.isEndTag(), walker.getNode())) { + return walker.clone(); + } + else { + return jumpPrevious(mode, walker); + } + } + SRNavigator.jumpCurrent = jumpCurrent; + /** + * Jump to the end of the current element and return all intermediate item positions + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns Array of cursors representing positions from current to end + */ + function jumpCurrentEnd(mode, walker) { + if (mode === "item") { + // For any <pre> item (block-enter stop or per-line stop), the render range + // must end at the next virtual line cursor (same <pre> node, next index) so + // that renderRange never walks into <pre>'s children. + if (isPreElement(walker.getNode()) && !walker.isEndTag()) { + var lines = getPreLines(walker.getNode()); + var nextIdx = walker.preLineIndex === undefined ? 0 : walker.preLineIndex + 1; + // Use nextIdx as the end sentinel — even if it equals lines.length (past + // the last line), compare() will still correctly stop renderRange before + // any child node because children are contained within <pre>. + var endCursor = walker.clone(); + endCursor.preLineIndex = nextIdx; + return [endCursor]; + } + var itemEnd = jumpNext(mode, walker); + return itemEnd ? [itemEnd] : []; + } + else { + var nameInfo = walker.getNameInfo(); + var retVal = walker.clone(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Name is just from the item itself + retVal.next(function () { return true; }); + } + else { + // Name is from the content + retVal.setEndTag(true); + retVal.next(function () { return true; }); + } + var endCursors = []; + var itemEnd = jumpNext("item", walker); + while (itemEnd && SRCursor_1.SRCursor.compare(itemEnd, retVal) < 0) { + endCursors.push(itemEnd); + itemEnd = jumpNext("item", itemEnd); + } + endCursors.push(retVal); + return mode === "tab_focus" && walker.getRole() === "link" ? [endCursors[endCursors.length - 1]] : endCursors; + } + } + SRNavigator.jumpCurrentEnd = jumpCurrentEnd; + /** + * Jump to the next matching element in the given navigation mode + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the next matching position, or null if none found + */ + function jumpNext(mode, walker) { + var DEBUG = false; + DEBUG && console.group("SRNavigator::jumpNext", walker.isEndTag() ? "/" : "", walker.getNode()); + try { + if (mode === "tab_focus") { + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + // console.log(tabFocusCursors.map(c => c.getNode())); + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex >= 0) { + if (currentIndex + 1 < tabFocusCursors.length) { + return tabFocusCursors[currentIndex + 1].clone(); + } + return null; + } + return tabFocusCursors[0].clone(); + } + } + if (mode === "item" && isPreElement(walker.getNode()) && !walker.isEndTag()) { + var lines = getPreLines(walker.getNode()); + if (walker.preLineIndex === undefined) { + // At the block-enter stop — jump to the first line item + if (lines.length > 0) { + var retVal_1 = walker.clone(); + retVal_1.preLineIndex = 0; + return retVal_1; + } + // Empty <pre> — fall through to DOM traversal past </pre> + } + else { + // At a line item — advance to the next line or past </pre> + var currentLineIdx = walker.preLineIndex; + if (currentLineIdx + 1 < lines.length) { + var retVal_2 = walker.clone(); + retVal_2.preLineIndex = currentLineIdx + 1; + return retVal_2; + } + // All lines exhausted — move past </pre> to the next DOM item. + // Always land on the block-enter stop (preLineIndex=undefined) so the + // caller gets a chance to render the container-enter announcement before + // advancing to the first line. + var retVal_3 = walker.clone(); + retVal_3.setEndTag(true); + var matchFunc_1 = getStartFunc(mode); + var skipFunc_1 = getSkipFunc(mode); + if (retVal_3.next(matchFunc_1, skipFunc_1)) { + if (isPreElement(retVal_3.getNode()) && !retVal_3.isEndTag()) { + retVal_3.preLineIndex = undefined; // block-enter stop + } + return retVal_3; + } + return null; + } + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.next(matchFunc, skipFunc)) { + // Landing on <pre> via DOM traversal always starts at the block-enter stop + // (preLineIndex=undefined). The per-line items are returned on subsequent + // calls via the isPreElement early-return above. + if (mode === "item" && isPreElement(retVal.getNode()) && !retVal.isEndTag()) { + retVal.preLineIndex = undefined; + } + DEBUG && console.log("SRNavigator::jumpNext result", retVal); + return retVal; + } + else { + return null; + } + } + finally { + console.groupEnd(); + } + } + SRNavigator.jumpNext = jumpNext; + /** + * Navigates to the previous element in screen reader navigation based on the specified mode. + * + * For tab_focus mode, this function attempts to move to the previous tabbable element by: + * 1. First trying to move backward using the mode's match and skip functions + * 2. If that fails, collecting all tab focus cursors and finding the previous one in the tab order + * + * @param mode - The navigation mode (e.g., "tab_focus") that determines how to navigate + * @param walker - The current cursor position in the screen reader navigation + * @returns A new cursor positioned at the previous element, or null if no previous element exists + */ + function jumpPrevious(mode, walker) { + if (mode === "tab_focus") { + var retVal_4 = walker.clone(); + var matchFunc_2 = getStartFunc(mode); + var skipFunc_2 = getSkipFunc(mode); + if (retVal_4.previous(matchFunc_2, skipFunc_2)) { + return retVal_4; + } + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex > 0) { + return tabFocusCursors[currentIndex - 1].clone(); + } + } + return null; + } + if (mode === "item" && isPreElement(walker.getNode()) && !walker.isEndTag()) { + if (walker.preLineIndex === undefined) { + // At the block-enter stop — go to the previous DOM item (before <pre>) + // fall through to normal previous() traversal below + } + else if (walker.preLineIndex === 0) { + // At the first line — step back to the block-enter stop + var retVal_5 = walker.clone(); + retVal_5.preLineIndex = undefined; + return retVal_5; + } + else { + // Step back one line + var retVal_6 = walker.clone(); + retVal_6.preLineIndex = walker.preLineIndex - 1; + return retVal_6; + } + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.previous(matchFunc, skipFunc)) { + // If we just landed on a <pre> element, position at its last line + if (mode === "item" && isPreElement(retVal.getNode()) && !retVal.isEndTag()) { + var lines = getPreLines(retVal.getNode()); + retVal.preLineIndex = lines.length > 0 ? lines.length - 1 : undefined; + } + return retVal; + } + else { + return null; + } + } + SRNavigator.jumpPrevious = jumpPrevious; +})(SRNavigator = exports.SRNavigator || (exports.SRNavigator = {})); + + +/***/ }, + +/***/ 7014 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRenderer = void 0; +var AriaUtil_1 = __webpack_require__(7011); +var SRNavigator_1 = __webpack_require__(248); +var SRCursor_1 = __webpack_require__(8195); +var render_rules_1 = __webpack_require__(2151); +var common_1 = __webpack_require__(7242); +/** + * SRRenderer namespace provides functionality for simulating how screen readers + * announce content to users. It contains rules for rendering different types of + * elements and ARIA roles in various navigation modes. + * + * The renderer uses a rule-based system to determine what text should be announced + * when navigating to, within, or away from elements based on their roles and properties. + */ +var SRRenderer; +(function (SRRenderer) { + /** + * Generates the announcement text when entering an element + * + * This function looks up the appropriate rule based on the element's role or tag name + * and applies it to generate the announcement text. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for entering the element, or null if no rule applies + */ + function renderEnter(mode, walker, oldWalker) { + var DEBUG = false; + for (var _i = 0, CONTAINER_ENTER_RULES_1 = render_rules_1.CONTAINER_ENTER_RULES; _i < CONTAINER_ENTER_RULES_1.length; _i++) { + var rule = CONTAINER_ENTER_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + DEBUG && console.log(mode, walker, rule, s); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderEnter = renderEnter; + /** + * Generates the announcement text when leaving an element + * + * Similar to renderEnter, but applies rules for leaving elements instead. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for leaving the element, or null if no rule applies + */ + function renderLeave(mode, walker, oldWalker) { + for (var _i = 0, CONTAINER_EXIT_RULES_1 = render_rules_1.CONTAINER_EXIT_RULES; _i < CONTAINER_EXIT_RULES_1.length; _i++) { + var rule = CONTAINER_EXIT_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderLeave = renderLeave; + /** + * Renders the current element and any container changes + * + * This function combines announcements for: + * - Containers being left + * - Containers being entered + * - The current element itself + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param containerChanges - Information about containers being entered or left + * @returns Combined announcement text + */ + function renderCurrent(mode, walker, containerChanges) { + var DEBUG = false; //mode === "tab_focus" && document.getElementById("fixture")?.getAttribute("class") === "tomtest"; + var startOfRender = SRNavigator_1.SRNavigator.jumpCurrent(mode, walker); + if (!startOfRender) + return null; + var endOfRenders = SRNavigator_1.SRNavigator.jumpCurrentEnd(mode, startOfRender); + if (!endOfRenders || endOfRenders.length === 0) { + endOfRenders = [null]; + } + DEBUG && console.log("AAAA", startOfRender.isStartTag(), startOfRender.getNode()); + DEBUG && console.log("BBBB", endOfRenders.map(function (val) { return val && val.isStartTag(); }), endOfRenders.map(function (val) { return val && val.getNode(); })); + var endOfRender = endOfRenders[endOfRenders.length - 1]; + var renderStr = ""; + for (var _i = 0, endOfRenders_1 = endOfRenders; _i < endOfRenders_1.length; _i++) { + var candidateEnd = endOfRenders_1[_i]; + var candidateRenderStr = SRRenderer.renderRange(mode, startOfRender, candidateEnd); + if (candidateRenderStr.trim().length > 0) { + endOfRender = candidateEnd; + renderStr = candidateRenderStr; + break; + } + } + if (renderStr === "") { + renderStr = SRRenderer.renderRange(mode, startOfRender, endOfRender); + } + DEBUG && console.log("CCCC", renderStr); + return { + start: startOfRender, + end: endOfRender, + message: (containerChanges.leaving || []).concat(containerChanges.entering || []).concat([renderStr]).join(" ").replace(/\s+/g, " ") + }; + } + SRRenderer.renderCurrent = renderCurrent; + /** + * Renders a range of elements between two cursors + * + * This function traverses the DOM from startOfRender to endOfRender, + * applying rendering rules to each element and combining the results. + * + * @param mode - The current navigation mode + * @param startOfRender - Cursor at the start of the range + * @param endOfRender - Cursor at the end of the range + * @returns Combined announcement text for the entire range + */ + function renderRange(mode, startOfRender, endOfRender) { + var _a; + var iterWalker = startOfRender.clone(); + var elemStrs = []; + var bContinue = true; + var currentLink = null; + while (bContinue) { + var elem = iterWalker.getElement(); + var node = iterWalker.getNode(); + var nodeType = node.nodeType; + var renderStrs = []; + var linkParent = AriaUtil_1.AriaUtil.getAncestorWithRole(node, "link", true); + if (linkParent && !["content", "text"].includes((_a = new SRCursor_1.SRCursor(linkParent).getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + // We don't consider links that announce themselves + linkParent = null; + } + for (var _i = 0, SR_RULES_1 = render_rules_1.SR_RULES; _i < SR_RULES_1.length; _i++) { + var rule = SR_RULES_1[_i]; + var s = rule.test(mode, iterWalker); + if (typeof s !== "undefined" && s !== null && s.trim().length > 0) { + if (nodeType === 1 && !iterWalker.isEndTag() && elem.getAttribute("aria-haspopup") === "menu") { + s = "[subMenu] " + s; + } + // Handle links + if (mode === "tab_focus") { + // We're in link mode + if (currentLink && (!linkParent || (linkParent && currentLink !== linkParent))) { + // We've added a string within a link (currentLink), but now we've left the link or moved to a new link + s = "".concat(s, " ").concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false))); + } + } + else { + if (linkParent && (!currentLink || (currentLink !== linkParent))) { + // We're in a link, and we haven't announced this link, or we've moved to a new link + s = "".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(linkParent, false)), " ").concat(s); + } + } + if (s !== "") { + currentLink = linkParent; + elemStrs.push(s); + } + break; + } + } + elemStrs.push(renderStrs.filter(function (s) { return s.trim().length > 0; }).join(" ")); + bContinue = iterWalker.next(function () { return true; }, SRNavigator_1.SRNavigator.getSkipFunc(mode)) && SRCursor_1.SRCursor.compare(iterWalker, endOfRender) < 0; + } + if (mode === "tab_focus" && currentLink) { + elemStrs.push("".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false)))); + } + var retVal = elemStrs.filter(function (s) { return s.trim().length > 0; }).join(" "); + retVal = retVal.replace(/, \u0001([^\u0002]+)\u0002/g, function (match, describedByText) { + var quotedText = "\"".concat(describedByText, "\""); + var unmarkedRetVal = retVal.replace(match, ""); + return unmarkedRetVal.includes(quotedText) || unmarkedRetVal.includes(describedByText) ? "" : ", ".concat(quotedText); + }); + retVal = retVal.replace(/[\u0001\u0002]/g, ""); + return retVal; + } + SRRenderer.renderRange = renderRange; +})(SRRenderer = exports.SRRenderer || (exports.SRRenderer = {})); + + +/***/ }, + +/***/ 328 +(__unused_webpack_module, exports) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRendererRule = void 0; +var SRRendererRule = /** @class */ (function () { + function SRRendererRule(ruleDefinition) { + this.ruleDefinition = ruleDefinition; + } + SRRendererRule.prototype.test = function (mode, cursor, oldCursor) { + if (this.ruleDefinition.modes.includes(mode) + && (this.ruleDefinition.roles.includes(cursor.getRole()) + || this.ruleDefinition.elems.includes(cursor.getNode().nodeName.toUpperCase()))) { + for (var _i = 0, _a = this.ruleDefinition.tests; _i < _a.length; _i++) { + var test_1 = _a[_i]; + var s = test_1(cursor, oldCursor, mode); + if (typeof s === "string") + return s; + } + } + return null; + }; + return SRRendererRule; +}()); +exports.SRRendererRule = SRRendererRule; + + +/***/ }, + +/***/ 369 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRTableUtil = void 0; +var SRCursor_1 = __webpack_require__(8195); +/** + * TableUtil namespace provides utility functions for handling HTML tables in the accessibility simulator. + * These functions help determine cell positions, relationships, and extract header information + * to simulate how screen readers would announce table navigation. + */ +var SRTableUtil; +(function (SRTableUtil) { + /** + * Determines if the cursor is pointing to a cell element (TD or TH) + * or has a cell-related ARIA role + * @param cursor - The SRCursor to check + * @returns true if the cursor is on a cell, false otherwise + */ + function isCursorCellRole(cursor) { + if (!cursor.getElement()) + return false; + if (["cell", "rowheader", "columnheader"].includes(cursor.getRole())) { + return true; + } + return !cursor.getElement().hasAttribute("role") && ["TH", "TD"].includes(cursor.getElement().nodeName.toUpperCase()); + } + SRTableUtil.isCursorCellRole = isCursorCellRole; + /** + * Gets a cursor pointing to the current cell or the parent cell if the cursor + * is inside a cell's content + * @param cursor - The SRCursor to check + * @returns A new SRCursor pointing to the cell or null if not in a cell + */ + function getCurrentOrParentCellCursor(cursor) { + return cursor.getCurrentOrParentByRoleClone(["cell", "rowheader", "columnheader"], ["TD", "TH"]); + } + SRTableUtil.getCurrentOrParentCellCursor = getCurrentOrParentCellCursor; + /** + * Get the colspan of a cell at a given location + * @param cursor The cursor to get the colspan from + * @returns The colspan of the cell at the cursor's location or 0 if not in a column + */ + function getColSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var colSpan = cursor.getElement().getAttribute("colspan"); + if (colSpan) { + return parseInt(colSpan); + } + return 1; + } + SRTableUtil.getColSpan = getColSpan; + /** + * Get the rowspan of a cell at a given location + * @param cursor The cursor to get the rowspan from + * @returns The rowspan of the cell at the cursor's location or 0 if not in a column + */ + function getRowSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var rowSpan = cursor.getElement().getAttribute("rowspan"); + if (rowSpan) { + return parseInt(rowSpan); + } + return 1; + } + SRTableUtil.getRowSpan = getRowSpan; + /** + * Builds a complete model of a table's structure, accounting for rowspan and colspan + * + * This function traverses the entire table and creates a data structure that represents + * the logical grid of cells, properly handling cells that span multiple rows or columns. + * The resulting model makes it easier to determine cell relationships and positions. + * + * @param inTableCursor - A cursor within the table + * @returns A TableModel representing the complete table structure, or null if not in a table + */ + function getTableModel(inTableCursor) { + // Get a cursor pointing to the table element + var tableCursor = inTableCursor.getCurrentOrParentByRoleClone(["table"]); + if (!tableCursor) + return null; + var walkTableCursor = tableCursor.clone(); + var retVal = []; // The complete table model we're building + var curRow = []; // The current row being processed + var prevRow; // The previous row (needed for rowspan handling) + // Walk through the table's DOM structure + while (walkTableCursor.next(function () { return true; }) && !walkTableCursor.getNode().isSameNode(tableCursor.getNode())) { + if (walkTableCursor.isEndTag() && walkTableCursor.getRole() === "row") { + // Reached the end of the row, push what we have and reset + retVal.push(curRow); + prevRow = curRow; + curRow = []; + // Handle cells with rowspan from previous rows that affect this row + // This ensures cells spanning multiple rows are properly represented in the model + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + // Process each cell in the row + if (!walkTableCursor.isEndTag() && isCursorCellRole(walkTableCursor)) { + var colspan = getColSpan(walkTableCursor); + // Create a cell model with position and spanning information + var cellInfo = { + rowIndexStart: retVal.length, + colIndexStart: curRow.length, + rowspan: getRowSpan(walkTableCursor), + colspan: colspan, + cellCursor: walkTableCursor.clone() + }; + // For cells with colspan, add the same cell info to multiple columns + for (var idx = 0; idx < colspan; ++idx) { + curRow.push(cellInfo); + } + // Continue handling cells with rowspan from previous rows + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + } + return retVal; + } + SRTableUtil.getTableModel = getTableModel; + /** + * Gets the cell model for a specific cell in the table + * + * This function finds the CellModel object that represents a specific cell, + * which contains information about its position and spanning. + * + * @param inCellCursor - A cursor pointing to a cell or its contents + * @param tableModel - Optional pre-built table model (will be created if not provided) + * @returns The CellModel for the specified cell, or null if not found + */ + function getCellModel(inCellCursor, tableModel) { + var cellCursor = getCurrentOrParentCellCursor(inCellCursor); + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + } + // Search through the table model to find the matching cell + for (var rowIndex = 0; rowIndex < tableModel.length; ++rowIndex) { + for (var colIndex = 0; colIndex < tableModel[rowIndex].length; ++colIndex) { + if (tableModel[rowIndex][colIndex].cellCursor.isSameNode(cellCursor)) { + return tableModel[rowIndex][colIndex]; + } + } + } + return null; + } + SRTableUtil.getCellModel = getCellModel; + /** + * Checks if a cell spans a specific column + * + * @param cellModel - The cell model to check + * @param colIdx - The column index to check + * @returns True if the cell contains the specified column + */ + function cellModelContainsColumn(cellModel, colIdx) { + return colIdx >= cellModel.colIndexStart && colIdx < cellModel.colIndexStart + cellModel.colspan; + } + SRTableUtil.cellModelContainsColumn = cellModelContainsColumn; + /** + * Checks if a cell spans a specific row + * + * @param cellModel - The cell model to check + * @param rowIdx - The row index to check + * @returns True if the cell contains the specified row + */ + function cellModelContainsRow(cellModel, rowIdx) { + return rowIdx >= cellModel.rowIndexStart && rowIdx < cellModel.rowIndexStart + cellModel.rowspan; + } + SRTableUtil.cellModelContainsRow = cellModelContainsRow; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeaders(cursor) { + return ""; + } + SRTableUtil.getRowHeaders = getRowHeaders; + /** + * Gets the column headers associated with a cell + * First checks for explicit headers attribute, then looks for column headers in the same column + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getColumnHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var colDatas = []; + for (var colIdx = cellModel.colIndexStart; colIdx < cellModel.colIndexStart + cellModel.colspan; ++colIdx) { + colDatas.push({ + potentialColHeaders: [], + existsDataCell: false, + colIdx: colIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same column (ignore column headers) + .filter(function (cursor) { return colDatas.some(function (colData) { return cellModelContainsColumn(SRTableUtil.getCellModel(cursor, tableModel), colData.colIdx); }); }); + } + else { + // Get all cells in this column + // Note - if everything in this column is empty or a header cell, this is probably not a heading + for (var rowIdx = 0; rowIdx < tableModel.length; ++rowIdx) { + var _loop_1 = function (colData) { + var colIdx = colData.colIdx; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "columnheader") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "col" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + } + else { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + } + }; + for (var _i = 0, colDatas_1 = colDatas; _i < colDatas_1.length; _i++) { + var colData = colDatas_1[_i]; + _loop_1(colData); + } + } + for (var _a = 0, colDatas_2 = colDatas; _a < colDatas_2.length; _a++) { + var colData = colDatas_2[_a]; + if (!colData.existsDataCell) { + colData.potentialColHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return colDatas.some(function (colData) { return colData.potentialColHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getColumnHeadersForCursor = getColumnHeadersForCursor; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var rowDatas = []; + for (var rowIdx = cellModel.rowIndexStart; rowIdx < cellModel.rowIndexStart + cellModel.rowspan; ++rowIdx) { + rowDatas.push({ + potentialRowHeaders: [], + existsDataCell: false, + rowIdx: rowIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same row (ignore column headers) + .filter(function (cursor) { return rowDatas.some(function (rowData) { return cellModelContainsRow(SRTableUtil.getCellModel(cursor, tableModel), rowData.rowIdx); }); }); + } + else { + // Get all cells in the rows + // Note - if everything in the row is empty or a header cell, this is probably not a heading + var longestRow = rowDatas.reduce(function (prev, cur) { return Math.max(prev, tableModel[cur.rowIdx].length); }, 0); + for (var colIdx = 0; colIdx < longestRow; ++colIdx) { + var _loop_2 = function (rowData) { + var rowIdx = rowData.rowIdx; + if (colIdx >= tableModel[rowIdx].length) + return "continue"; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "rowheader") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "row" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + } + else { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + } + }; + for (var _i = 0, rowDatas_1 = rowDatas; _i < rowDatas_1.length; _i++) { + var rowData = rowDatas_1[_i]; + _loop_2(rowData); + } + } + for (var _a = 0, rowDatas_2 = rowDatas; _a < rowDatas_2.length; _a++) { + var rowData = rowDatas_2[_a]; + if (!rowData.existsDataCell) { + rowData.potentialRowHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return rowDatas.some(function (rowData) { return rowData.potentialRowHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getRowHeadersForCursor = getRowHeadersForCursor; + /** + * Determines if a cell is a data cell (not a header cell) + * + * A data cell is one with either: + * - An explicit ARIA role of "cell" + * - A TD element without an overriding role attribute + * + * @param checkCursor - The cursor to check + * @returns True if the cursor points to a data cell + */ + function isDataCell(checkCursor) { + var checkCursorElem = checkCursor.getElement(); + if (!checkCursorElem) + return false; + return checkCursor.getRole() === "cell" || (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TD"); + } + SRTableUtil.isDataCell = isDataCell; +})(SRTableUtil = exports.SRTableUtil || (exports.SRTableUtil = {})); + + +/***/ }, + +/***/ 2165 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRUtil = void 0; +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +var SRUtil; +(function (SRUtil) { + function isModalDialogElement(node) { + if (node.nodeType !== 1) + return false; + var elem = node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem, true); + return role === "dialog" && elem.getAttribute("aria-modal") === "true" && VisUtil_1.VisUtil.isNodeVisible(node); + } + SRUtil.isModalDialogElement = isModalDialogElement; + /** + * Generates a unique CSS selector for a specific HTML element + * The selector is built using a combination of: + * 1. Element tag name + * 2. ID (if available) + * 3. Classes (if available) + * 4. Attributes (if needed) + * 5. nth-child selectors for position in parent + * + * @param element The HTML element to generate a selector for + * @param optimized If true, creates a shorter but possibly less robust selector + * @return A CSS selector string that uniquely identifies the element + */ + function getUniqueSelector(element, optimized) { + if (optimized === void 0) { optimized = false; } + // If the element has an ID, that's the most direct way to select it + if (element.id) { + return "#".concat(CSS.escape(element.id)); + } + // If we're at the root or document element, return the tag name + if (element.isSameNode(document.documentElement) || element.isSameNode(document.body)) { + return element.tagName.toLowerCase(); + } + // Start building the selector with the tag name + var selector = element.tagName.toLowerCase(); + // Add classes if available and we're not optimizing for brevity + if (element.classList.length && !optimized) { + // Take up to 3 classes to avoid overly specific selectors + var classes = Array.from(element.classList).slice(0, 3); + selector += classes.map(function (cls) { return ".".concat(CSS.escape(cls)); }).join(''); + } + // Add distinguishing attributes if needed and not optimizing + if (!optimized) { + // Consider adding role, aria-label, or other distinctive attributes + if (element.hasAttribute('role')) { + selector += "[role=\"".concat(CSS.escape(element.getAttribute('role') || ''), "\"]"); + } + if (element.hasAttribute('aria-label')) { + var label = element.getAttribute('aria-label') || ''; + if (label.length <= 20) { // Avoid overly long selectors + selector += "[aria-label=\"".concat(CSS.escape(label), "\"]"); + } + } + // For inputs, add type attribute + if (element.tagName.toLowerCase() === 'input' && element.hasAttribute('type')) { + selector += "[type=\"".concat(CSS.escape(element.getAttribute('type') || ''), "\"]"); + } + } + // If we have a parent node, determine position among siblings + if (element.parentElement) { + // Find all siblings with the same tag + var siblings = Array.from(element.parentElement.children) + .filter(function (child) { return child.tagName === element.tagName; }); + // If there's more than one sibling with the same tag, add nth-child + if (siblings.length > 1) { + var index = siblings.indexOf(element) + 1; + selector += ":nth-of-type(".concat(index, ")"); + } + // If we're not at the root, recursively build the parent selector + // but use optimized selectors for ancestors to keep the overall selector manageable + return "".concat(getUniqueSelector(element.parentElement, true), " > ").concat(selector); + } + return selector; + } + SRUtil.getUniqueSelector = getUniqueSelector; +})(SRUtil = exports.SRUtil || (exports.SRUtil = {})); + + +/***/ }, + +/***/ 8107 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRViewer = exports.SROverlay = void 0; +var SRController_1 = __webpack_require__(5233); +/** + * SROverlay class for creating a UI widget to control screen reader simulation + * Provides buttons for navigation and displays results + */ +var SROverlay = /** @class */ (function () { + /** + * Creates a new SROverlay + * @param controller The SRController instance to use for navigation + */ + function SROverlay(srViewer) { + this.srViewer = srViewer; + /** Navigation modes available in the UI */ + this.navigationModes = [ + { mode: "item", label: "Item" }, + { mode: "tab_focus", label: "Tabbable" }, + { mode: "heading", label: "Heading" }, + { mode: "region", label: "Region" } + ]; + this.createOverlay(); + } + SROverlay.prototype.createDOMElement = function (elemName, attrs, styles) { + var retVal = this.srViewer.viewerDoc.createElement(elemName); + if (attrs) { + for (var key in attrs) { + retVal[key] = attrs[key]; + } + } + if (styles) { + for (var key in styles) { + retVal.style[key] = styles[key]; + } + } + return retVal; + }; + /** + * Creates the overlay UI elements and adds them to the DOM + */ + SROverlay.prototype.createOverlay = function () { + var _this = this; + // Create main container + this.container = this.createDOMElement("div", { + className: "ibma-sr-overlay" + }, { + position: 'fixed', + bottom: '0', + left: '0', + width: '100%', + backgroundColor: 'rgba(0, 0, 0, 0.8)', + color: 'white', + padding: '10px', + zIndex: '10000', + display: 'flex', + flexDirection: 'column', + gap: '10px' + }); + // Create controls container + var controlsContainer = this.createDOMElement("div", {}, { + display: "flex", flexWrap: "wrap", gap: "10px" + }); + // Create navigation mode groups + this.navigationModes.forEach(function (navMode) { + var modeGroup = _this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + modeGroup.appendChild(_this.createDOMElement('span', { + textContent: navMode.label + ":" + }, {})); + // Previous button + var prevButton = _this.createDOMElement('button', { + textContent: '◀ Prev' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + prevButton.addEventListener('click', function () { return _this.srViewer.navigatePrevious(navMode.mode); }); + modeGroup.appendChild(prevButton); + // Next button + var nextButton = _this.createDOMElement('button', { + textContent: 'Next ▶' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + nextButton.addEventListener('click', function () { return _this.srViewer.navigateNext(navMode.mode); }); + modeGroup.appendChild(nextButton); + controlsContainer.appendChild(modeGroup); + }); + var otherButtonGroup = this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + // Show all button + var showAllButton = this.createDOMElement('button', { + textContent: 'Show all' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + showAllButton.addEventListener('click', function () { return _this.srViewer.showAll(true); }); + otherButtonGroup.appendChild(showAllButton); + // Toggle Speech Button + var toggleSpeech = this.createDOMElement('button', { + textContent: 'Toggle speech' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + toggleSpeech.addEventListener('click', function () { return _this.srViewer.toggleSpeech(); }); + otherButtonGroup.appendChild(toggleSpeech); + controlsContainer.appendChild(otherButtonGroup); + // Create results display + this.resultsDisplay = this.createDOMElement('div', { + textContent: 'Screen reader simulation results will appear here.' + }, { + padding: '10px', + backgroundColor: 'rgba(255, 255, 255, 0.1)', + borderRadius: '3px', + minHeight: '100px', + maxHeight: '50vh', + fontFamily: 'monospace', + overflow: 'auto' + }); + // Add elements to container + this.container.appendChild(controlsContainer); + this.container.appendChild(this.resultsDisplay); + // Add to document + this.srViewer.viewerDoc.body.appendChild(this.container); + }; + /** + * Display the navigation result in the overlay + * @param result The navigation result + * @param mode The navigation mode used + * @param direction The navigation direction ('next', 'previous', or 'focus') + */ + SROverlay.prototype.displayResult = function (result, mode, direction) { + var _a, _b, _c, _d; + var displayText = ''; + if (result.success) { + // console.log("???", result); + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + else { + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + (_b = (_a = result.renderingResult.end) === null || _a === void 0 ? void 0 : _a.getElement()) === null || _b === void 0 ? void 0 : _b.scrollIntoView(); + (_d = (_c = result.renderingResult.start) === null || _c === void 0 ? void 0 : _c.getElement()) === null || _d === void 0 ? void 0 : _d.scrollIntoView(); + window.scrollBy(0, -200); + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.textContent = displayText; + var inspectButton = this.createDOMElement("button", { + innerText: "Debug" + }, {}); + inspectButton.addEventListener("click", function () { + var _a, _b; + console.log((_a = result.renderingResult.start) === null || _a === void 0 ? void 0 : _a.getNode(), (_b = result.renderingResult.end) === null || _b === void 0 ? void 0 : _b.getNode()); + }); + this.resultsDisplay.appendChild(inspectButton); + }; + SROverlay.prototype.displayAll = function (result) { + var _this = this; + var table = this.createDOMElement("table", {}, {}); + var headerRow = this.createDOMElement("tr", {}, {}); + var headingLabels = ["Region", "Heading", "Item", "Tabbable"]; + var headingFields = ["region", "heading", "item", "tab_focus"]; + for (var _i = 0, headingLabels_1 = headingLabels; _i < headingLabels_1.length; _i++) { + var headingLabel = headingLabels_1[_i]; + headerRow.appendChild(this.createDOMElement("th", { + scope: "col", + innerText: headingLabel + }, { + textAlign: "left", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + table.appendChild(headerRow); + } + var _loop_1 = function (line) { + var dataRow = this_1.createDOMElement("tr", {}, {}); + headingFields.forEach(function (field) { + dataRow.appendChild(_this.createDOMElement("td", { + innerText: line[field] + }, { + verticalAlign: "top", + border: "solid white 1px", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + }); + table.appendChild(dataRow); + }; + var this_1 = this; + for (var _a = 0, result_1 = result; _a < result_1.length; _a++) { + var line = result_1[_a]; + _loop_1(line); + } + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.appendChild(table); + }; + /** + * Remove the overlay from the DOM + */ + SROverlay.prototype.destroy = function () { + if (this.container && this.container.parentNode) { + this.container.parentNode.removeChild(this.container); + } + }; + return SROverlay; +}()); +exports.SROverlay = SROverlay; +/** + * SRViewer class for managing screen reader simulation with UI controls + */ +var SRViewer = /** @class */ (function () { + /** + * Creates a new SRViewer + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRViewer(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + /** Flag to track if speech is active */ + this.isStreaming = false; + /** Flag to set if showing all */ + this.isShowingAll = false; + /** Flag to set if it should be speaking */ + this.speechEnabled = false; + this.viewerDoc = rootElement.ownerDocument; + // Create controller for the document body + this.controller = SRController_1.SRController.getController(this.viewerDoc); + // Create overlay UI + this.overlay = new SROverlay(this); + // Set up keyboard handlers + this.setupKeyboardHandlers(); + // Set up focus tracking + this.setupFocusTracking(); + // Set up mutation tracking + this.setupMutationTracking(); + } + SRViewer.prototype.showAll = function (bEnableAllMode) { + if (bEnableAllMode) { + this.isShowingAll = true; + } + var result = SRController_1.SRController.renderStructure(this.viewerDoc); + this.overlay.displayAll(result); + }; + SRViewer.prototype.toggleSpeech = function () { + this.speechEnabled = !this.speechEnabled; + }; + /** + * Navigate to the next element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigateNext = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpNext(mode); + this.overlay.displayResult(result, mode, 'next'); + this.speakResult(result); + }; + /** + * Navigate to the previous element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigatePrevious = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpPrevious(mode); + this.overlay.displayResult(result, mode, 'previous'); + this.speakResult(result); + }; + /** + * Set up keyboard event handlers for screen reader navigation + */ + SRViewer.prototype.setupKeyboardHandlers = function () { + var _this = this; + this.keyboardHandler = function (e) { + // Don't capture keyboard events when focus is in form controls + var target = e.target; + if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') { + return; + } + // Handle keyboard shortcuts + if (e.ctrlKey) { + // Ctrl key stops speech + _this.stopSpeech(); + return; + } + if (e.altKey || e.metaKey) + return; + // console.log(e.key); + switch (e.key) { + case 'ArrowUp': + e.preventDefault(); + _this.navigatePrevious('item'); + break; + case ' ': + _this.isStreaming = true; + case 'ArrowDown': + e.preventDefault(); + _this.navigateNext('item'); + break; + case 'Enter': + e.preventDefault(); + _this.activateCurrentElement(); + _this.controller.setPointOfRegard(_this.viewerDoc.activeElement); + break; + case 'H': + case 'h': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('heading'); + } + else { + e.preventDefault(); + _this.navigateNext('heading'); + } + break; + case 'R': + case 'r': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('region'); + } + else { + e.preventDefault(); + _this.navigateNext('region'); + } + break; + case 'Tab': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('tab_focus'); + } + else { + e.preventDefault(); + _this.navigateNext('tab_focus'); + } + break; + } + }; + // Add the event listener + this.viewerDoc.addEventListener('keydown', this.keyboardHandler); + }; + SRViewer.prototype.speakResult = function (result) { + var _this = this; + if (!this.speechEnabled) + return; + var utterance = new SpeechSynthesisUtterance(result.renderingResult.message); + utterance.rate = 1.5; + var myThis = this; + utterance.addEventListener("end", function (event) { + if (myThis.isStreaming) { + _this.navigateNext('item'); + } + }); + speechSynthesis.cancel(); + speechSynthesis.speak(utterance); + }; + /** + * Stop speech output + */ + SRViewer.prototype.stopSpeech = function () { + this.isStreaming = false; + // Cancel any active speech synthesis + speechSynthesis.cancel(); + }; + /** + * Set up mutation tracking + */ + SRViewer.prototype.setupMutationTracking = function () { + var _this = this; + var observer = new MutationObserver(function (mutations) { + // console.log(this.isShowingAll, mutations.length); + if (_this.isShowingAll) { + var outsideOverlay = mutations.filter(function (mutation) { return mutation.target.nodeType === 1 + && !mutation.target.closest(".ibma-sr-overlay"); }); + if (outsideOverlay.length > 0) { + // console.log("Mutations",outsideOverlay); + observer.disconnect(); + var myThis_1 = _this; + myThis_1.showAll(); + setTimeout(function () { + myThis_1.showAll(); + observer.observe(_this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }, 1000); + } + } + }); + observer.observe(this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }; + /** + * Set up focus tracking to update the point of regard when focus changes + */ + SRViewer.prototype.setupFocusTracking = function () { + var _this = this; + this.focusHandler = function (e) { + // Skip if the focus is on the overlay itself + if (e.target instanceof HTMLElement) { + var target = e.target; + if (_this.overlay && target.closest('.ibma-sr-overlay')) { + return; + } + console.group("focusHandler"); + // Update the point of regard to the newly focused element + var result = _this.controller.setPointOfRegard(target); + // Announce the focus change + if (result.success) { + _this.overlay.displayResult(result, 'focus', 'focus'); + _this.speakResult(result); + } + console.groupEnd(); + } + }; + // Add the focus event listener to the document + this.viewerDoc.addEventListener('focusin', this.focusHandler); + }; + /** + * Activate (click) the element at the current point of regard + */ + SRViewer.prototype.activateCurrentElement = function () { + var currentElement = this.controller.getPointOfRegard().getElement(); + if (currentElement) { + // Announce that we're activating the element + var result = { + success: true, + renderingResult: { + message: "Activating: ".concat(currentElement.textContent || currentElement.nodeName), + start: this.controller.getPointOfRegard(), + end: this.controller.getPointOfRegard() + } + }; + this.overlay.displayResult(result, 'focus', 'focus'); + this.speakResult(result); + // Focus the element first + if (currentElement.focus) { + currentElement.focus(); + } + // Simulate a click on the element + currentElement.click(); + } + }; + /** + * Get the controller instance + * @returns The SRController instance + */ + SRViewer.prototype.getController = function () { + return this.controller; + }; + /** + * Destroy the viewer and clean up resources + */ + SRViewer.prototype.destroy = function () { + // Remove event listeners + this.viewerDoc.removeEventListener('keydown', this.keyboardHandler); + this.viewerDoc.removeEventListener('focusin', this.focusHandler); + // Stop any active speech + this.stopSpeech(); + // Destroy overlay + this.overlay.destroy(); + }; + return SRViewer; +}()); +exports.SRViewer = SRViewer; + + +/***/ }, + +/***/ 7242 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = exports.getLinkAnnouncement = exports.getRoleDescription = exports.quoteName = exports.quoteNamePadBefore = exports.quoteNamePadAfter = void 0; +var SRCursor_1 = __webpack_require__(8195); +var SRRendererRule_1 = __webpack_require__(328); +var AriaUtil_1 = __webpack_require__(7011); +var ARIADefinitions_1 = __webpack_require__(9910); +var DOMWalker_1 = __webpack_require__(3864); +var VisUtil_1 = __webpack_require__(3946); +/** + * Provide the name, surrounded by the quoteCharBefore and quoteCharAfter and followed by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add after, if the name exists + * @param quoteCharBefore The string to use as the leading quote, if the name exists + * @param quoteCharBefore The string to use as the trailing quote, if the name exists + * @returns + */ +function quoteNamePadAfter(cursor, padding, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteName(cursor)).concat(padding || ", ") + : ""; +} +exports.quoteNamePadAfter = quoteNamePadAfter; +/** + * Provide the name, surrounded by quotes and preceded by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add before, if the name exists (defaults to ", ") + * @returns The quoted name with leading padding, or empty string if no name exists + */ +function quoteNamePadBefore(cursor, padding) { + return cursor.getName() + ? "".concat(padding || ", ").concat(quoteName(cursor)) + : ""; +} +exports.quoteNamePadBefore = quoteNamePadBefore; +/** + * Provide the name surrounded by quote characters + * @param cursor The cursor for which to fetch the name + * @param quoteCharBefore The string to use as the leading quote (defaults to ") + * @param quoteCharAfter The string to use as the trailing quote (defaults to ") + * @returns The quoted name, or empty string if no name exists + */ +function quoteName(cursor, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteCharBefore || '"').concat(cursor.getName()).concat(quoteCharAfter || '"') + : ""; +} +exports.quoteName = quoteName; +/** + * Get the role description for an element, using aria-roledescription if present + * Falls back to the provided default role name if aria-roledescription is not specified or empty + * @param cursor The cursor positioned at the element + * @param defaultRole The default role name to use if aria-roledescription is not present + * @returns The role description (either custom or default) + */ +function getRoleDescription(cursor, defaultRole) { + var elem = cursor.getElement(); + if (!elem) + return defaultRole; + var roleDescription = elem.getAttribute("aria-roledescription"); + if (roleDescription && roleDescription.trim().length > 0) { + return roleDescription.trim(); + } + return defaultRole; +} +exports.getRoleDescription = getRoleDescription; +/** + * Generate the screen reader announcement for a link element + * Distinguishes between same-page links (anchors) and regular links + * @param cursor The cursor positioned at the link element + * @param mode The navigation mode (affects announcement order) + * @returns The formatted link announcement string + */ +function getLinkAnnouncement(cursor, mode) { + var href = (cursor.getNode().href) || ""; + var announceStr = ""; + if (href.startsWith(document.location.href) && href.charAt(document.location.href.length) === "#") { + announceStr = "same page link"; + } + else { + announceStr = "link"; + } + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + if (mode === "tab_focus") { + return "[".concat(quoteNamePadAfter(cursor)).concat(announceStr, "]"); + } + else { + return "[".concat(announceStr).concat(quoteNamePadBefore(cursor), "]"); + } + } + return "[".concat(announceStr, "]"); +} +exports.getLinkAnnouncement = getLinkAnnouncement; +/** + * Get the description text from aria-describedby references + * Resolves all IDs in aria-describedby and concatenates their text content + * @param elem The element with aria-describedby attribute + * @param mode The navigation mode (returns empty string in "item" mode) + * @returns The formatted description text with leading comma and quotes, or empty string + */ +function getDescribedByAnnouncements(elem, mode) { + var describedBy = elem.getAttribute("aria-describedby"); + if (!describedBy) + return ""; + var descriptionElems = describedBy + .split(/\s+/) + .map(function (id) { return document.getElementById(id); }) + .filter(function (descElem) { return !!descElem; }); + var descriptionText = descriptionElems + .map(function (descElem) { var _a; return (_a = descElem.textContent) === null || _a === void 0 ? void 0 : _a.trim(); }) + .filter(function (text) { return !!text; }) + .join(" "); + if (!descriptionText || descriptionText.length === 0) + return ""; + if (mode === "item") + return ", \u0001".concat(descriptionText, "\u0002"); + return ", \"".concat(descriptionText, "\""); +} +/** + * Get state announcements for disabled, readonly, required, and invalid attributes + * @param elem The element to check for state attributes + * @returns A string with state announcements (e.g., ", disabled", ", read only", ", required", ", invalid") + */ +function getStateAnnouncements(elem) { + var states = ""; + // Check for disabled state (both attribute and aria-disabled) + if (elem.hasAttribute("disabled") || elem.getAttribute("aria-disabled") === "true") { + states += ", disabled"; + } + // Check for readonly state (both attribute and aria-readonly) + if (elem.hasAttribute("readonly") || elem.getAttribute("aria-readonly") === "true") { + states += ", read only"; + } + // Check for required state (both attribute and aria-required) + if (elem.hasAttribute("required") || elem.getAttribute("aria-required") === "true") { + states += ", required"; + // A required <select> whose selected value is "" is implicitly invalid — + // JAWS and NVDA announce "invalid entry" in this case. + if (elem.nodeName.toUpperCase() === "SELECT" && elem.validity.valueMissing) { + states += ", invalid entry"; + } + } + // Check for invalid state (aria-invalid) + if (elem.getAttribute("aria-invalid") === "true") { + states += ", invalid"; + } + return states; +} +/** + * Check if a listitem contains interactive/widget elements + * Screen readers typically don't read the accessible name of a listitem when it contains interactive elements + * Uses DOMWalker to properly traverse shadow DOM and other complex structures + */ +function listitemContainsInteractiveElement(cursor) { + var elem = cursor.getElement(); + if (!elem) + return false; + // Use DOMWalker to traverse the entire subtree including shadow DOM + var walker = new DOMWalker_1.DOMWalker(elem, false, elem, false); + // Walk through all descendants + while (walker.nextNode()) { + // Only check element nodes at start tags + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(walker.node); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return true; + } + } + } + return false; +} +/** + * Check if an iframe's content can be accessed (not cross-origin) + * Attempts to access the iframe's document to determine if it's accessible + * @param iframe The iframe element to check + * @returns true if the iframe content is accessible, false if cross-origin or blocked + */ +function canAccessFrame(iframe) { + try { + // This throws a DOMException for cross-origin frames + var doc = iframe.contentDocument || iframe.contentWindow.document; + return doc !== null; + } + catch (e) { + return false; + // if (e instanceof DOMException && e.name === 'SecurityError') { + // return false; // Cross-origin, access blocked + // } + // throw e; // Re-throw unexpected errors + } +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Button role + new SRRendererRule_1.SRRendererRule({ + roles: ["button"], + elems: [], + modes: ["item", "button", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "true") { + return "[toggle ".concat(roleDesc, ", pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "false") { + return "[toggle ".concat(roleDesc, ", not pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (cursor.isEndTag()) + return undefined; + var expandStr = ""; + var elem = cursor.getElement(); + var roleDesc = getRoleDescription(cursor, "button"); + if (["menu", "true"].includes(elem.getAttribute("aria-haspopup"))) { + expandStr += ", menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + expandStr += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(expandStr).concat(getDescribedByAnnouncements(elem, mode), "]"); + }, + function (cursor) { if (cursor.isEndTag()) + return ""; } + ] + }), + // Checkbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["checkbox"], + elems: [], + modes: ["item", "checkbox", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "checkbox"); + var stateStr = ""; + if (elem.getAttribute("aria-checked") === "mixed") { + stateStr = "half checked"; + } + else { + var bChecked = false; + if (elem.hasAttribute("aria-checked")) { + bChecked = elem.getAttribute("aria-checked") === "true"; + } + else { + bChecked = elem.checked; + } + stateStr = bChecked ? "checked" : "not checked"; + } + stateStr += getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Cell, Columnheader, and Rowheader roles + new SRRendererRule_1.SRRendererRule({ + roles: ["cell", "columnheader", "rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var _a; + if (!cursor.isStartTag()) + return null; + // Get the cell element + var cellElem = cursor.getElement(); + if (!cellElem) + return null; + // Check if the cell has any visible content by checking: + // 1. Text content (trimmed) + // 2. Child elements with roles (buttons, links, etc.) + // 3. Images with alt text + var textContent = ((_a = cellElem.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || ""; + // Check for child elements with interactive roles or content + var walker = new DOMWalker_1.DOMWalker(cellElem, false, cellElem, false); + var hasContent = textContent.length > 0; + if (!hasContent) { + // Check for elements that would have content (buttons, links, images, etc.) + while (walker.nextNode()) { + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var elem = walker.node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // Check for interactive elements or elements with accessible names + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + hasContent = true; + break; + } + // Check for images with alt text + if (elem.nodeName.toUpperCase() === "IMG" && elem.hasAttribute("alt")) { + hasContent = true; + break; + } + } + } + } + // If the cell is empty, return "[blank]" + if (!hasContent) { + return "[blank]"; + } + // Otherwise, return null to let default rendering continue + return null; + } + ] + }), + // Combobox role + new SRRendererRule_1.SRRendererRule({ + roles: ["combobox"], + elems: [], + modes: ["item", "combo", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "combo box"); + var elem = cursor.getElement(); + var state = ""; + if (cursor.getNode().nodeName.toUpperCase() === "SELECT") { + state = ", collapsed"; + var selectElem = cursor.getElement(); + var valueElem = selectElem.selectedIndex >= 0 ? selectElem.options[selectElem.selectedIndex] : null; + var valueStr = ""; + if (valueElem) { + var temp = new SRCursor_1.SRCursor(valueElem, false); + valueStr = quoteNamePadBefore(temp, ", "); + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + else if (cursor.getNode().nodeName.toUpperCase() === "INPUT") { + if (elem.hasAttribute("aria-expanded")) { + state = ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state, ", has auto complete, editable, opens list]"); + } + else { + if (elem.hasAttribute("aria-expanded")) { + state = ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + if (elem.hasAttribute("aria-autocomplete")) { + state += ", has auto complete"; + } + } + state += getStateAnnouncements(elem); + // Determine the current value to announce: + // 1. If expanded and aria-controls points to a listbox, use the aria-selected option text + // 2. Otherwise use the combobox element's own text content + var valueStr = ""; + var controlsId = elem.getAttribute("aria-controls"); + var popup = controlsId ? document.getElementById(controlsId) : null; + if (popup) { + var selectedOption = popup.querySelector("[role='option'][aria-selected='true']"); + if (selectedOption) { + valueStr = ", \"".concat((selectedOption.textContent || "").trim(), "\""); + } + } + if (!valueStr) { + var textContent = (elem.textContent || "").trim(); + if (textContent) { + valueStr = ", \"".concat(textContent, "\""); + } + } + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + } + ] + }), + // Listbox role - covers <select size> / <select multiple> + new SRRendererRule_1.SRRendererRule({ + roles: ["listbox"], + elems: [], + modes: ["item", "combo", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "list box"); + var elem = cursor.getElement(); + var state = ""; + if (cursor.getNode().nodeName.toUpperCase() === "SELECT") { + var selectElem = cursor.getElement(); + var selectedOptions = Array.from(selectElem.options).filter(function (o) { return o.selected; }); + var valueStr_1 = selectedOptions + .map(function (o) { return quoteNamePadBefore(new SRCursor_1.SRCursor(o, false), ", "); }) + .join(""); + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr_1, "]"); + } + // ARIA listbox (non-select) + state += getStateAnnouncements(elem); + var textContent = (elem.textContent || "").trim(); + var valueStr = textContent ? ", \"".concat(textContent, "\"") : ""; + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + ] + }), + // Default role (fallback) + new SRRendererRule_1.SRRendererRule({ + roles: ["default"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + return cursor.isStartTag() ? + "!!<".concat(cursor.getRole(), ">").concat((((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) + ""), "!!") : + "!!</".concat(cursor.getRole(), ">!!"); + } + ] + }), + // Deletion role + new SRRendererRule_1.SRRendererRule({ + roles: ["deletion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[deleted]" || ""); } + ] + }), + // Dialog role + new SRRendererRule_1.SRRendererRule({ + roles: ["dialog"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + return cursor.isEndTag() ? "[End of dialog]" : "[Start of dialog".concat(quoteNamePadBefore(cursor)); + } + ] + }), + // Contenteditable (editable region) - elements with contenteditable="true" (or "") + // Must come before the generic/document rule so it takes precedence. + // Screen readers (JAWS/NVDA) announce these as an editable section when entering + // and "out of section" when leaving. + // We use a broad element list (covering the most common host elements) plus + // "generic" and "paragraph" roles so both bare <div> and labelled variants are caught. + // The test function always checks the attribute and bails out when: + // - the attribute is absent or "false" + // - an explicit ARIA role overrides the semantics (e.g. role="textbox") + new SRRendererRule_1.SRRendererRule({ + roles: ["generic", "paragraph"], + elems: ["DIV", "SPAN", "P", "SECTION", "ARTICLE", "HEADER", "FOOTER", "MAIN", "ASIDE", "NAV", "LI", "TD", "TH", "PRE", "BLOCKQUOTE", "FIGURE", "FIGCAPTION", "DETAILS", "SUMMARY"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + var elem = cursor.getElement(); + if (!elem) + return null; + var ce = elem.getAttribute("contenteditable"); + if (ce !== "true" && ce !== "") + return null; + // Defer to the explicit-role rule when an author provides a concrete ARIA role + // (e.g. role="textbox") — those roles carry richer semantics and their own rules. + if (elem.hasAttribute("role")) + return null; + // <p> retains its "paragraph" semantics even when editable. + var isParagraph = cursor.getRole() === "paragraph" || elem.nodeName.toUpperCase() === "P"; + if (cursor.isEndTag()) { + return mode === "item" ? (isParagraph ? "[out of paragraph]" : "[out of section]") : ""; + } + // aria-readonly is not a supported state on contenteditable elements — + // screen readers (JAWS/NVDA) ignore it entirely, so we exclude it here. + // Only disabled is meaningful (it overrides the editable semantics). + var stateAnnouncements = ""; + if (elem.hasAttribute("disabled") || elem.getAttribute("aria-disabled") === "true") { + stateAnnouncements = ", disabled"; + } + var containerWord = isParagraph ? "paragraph" : "section"; + // In tab_focus mode, only append textContent when the accessible name + // is extrinsic (aria-label / aria-labelledby, i.e. nameFrom ≠ "content"/"text"). + // When nameFrom IS "content", jumpCurrentEnd already walks children so + // appending again would duplicate the text. + var nameInfo = cursor.getNameInfo(); + var nameFromContent = !nameInfo || ["content", "text"].includes(nameInfo.nameFrom); + var textContent = (mode === "tab_focus" && !nameFromContent) ? (_a = elem.textContent) === null || _a === void 0 ? void 0 : _a.trim() : ""; + var contentSuffix = textContent ? " ".concat(textContent) : ""; + return "[".concat(quoteNamePadAfter(cursor)).concat(containerWord, ", editable").concat(stateAnnouncements, "]").concat(contentSuffix); + } + ] + }), + // Document role + new SRRendererRule_1.SRRendererRule({ + roles: ["document", "generic"], + elems: [], + modes: ["item"], + tests: [ + function () { return ""; } + ] + }), + // Graphics document role + new SRRendererRule_1.SRRendererRule({ + roles: ["graphics-document"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isStartTag() && !((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + return null; + }, + function (cursor) { var _a; return (cursor.isStartTag() && (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) === "")) ? "" : null; }, + function (cursor) { var _a; return (cursor.isStartTag() && ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && "[graphic".concat(quoteNamePadBefore(cursor), "]")) || null; }, + function (cursor) { return (cursor.isEndTag()) ? "" : null; } + ] + }), + // Heading role + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && cursor.isStartTag()) + return ""; + if (mode === "item" && cursor.isEndTag()) + return ""; + var level; + var node = cursor.getElement(); + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + return "[heading level ".concat(level).concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[heading level ".concat(level, "]"); + } + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["heading", "h1", "h2", "h3", "h4", "h5", "h6"], + tests: [ + function (cursor) { + if (cursor.isStartTag()) { + var node = cursor.getNode(); + var level = void 0; + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + return "[".concat(quoteNamePadAfter(cursor), "heading level ").concat(level, "]"); + } + return ""; + } + ] + }), + // Image role + new SRRendererRule_1.SRRendererRule({ + roles: ["img"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b, _c; + if (cursor.isEndTag()) { + return ""; + } + else { + if (!((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + // (these were only included because of the SKIP_ITEM_BEHAVIOR change) + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + else if (((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) === "") { + return ""; + } + else { + return "[graphic".concat(quoteNamePadBefore(cursor), "]"); + } + } + } + ] + }), + // Insertion role + new SRRendererRule_1.SRRendererRule({ + roles: ["insertion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[inserted]" || ""); } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["link"], + elems: [], + modes: ["item", "region", "link", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && !["content", "text"].includes((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + return getLinkAnnouncement(cursor, mode); + } + return null; + } + ] + }), + // Listitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["listitem"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + var isOrdered; + var parentListElem; + var walkParents = DOMWalker_1.DOMWalker.parentNode(cursor.getNode()); + while (typeof isOrdered === "undefined" && walkParents) { + if (walkParents.nodeType === 1) { + var elem = walkParents; + if (elem.hasAttribute("role")) { + if (elem.getAttribute("role") === "list") { + isOrdered = false; + parentListElem = elem; + } + } + else if (elem.nodeName.toUpperCase() === "UL") { + isOrdered = false; + parentListElem = elem; + } + else if (elem.nodeName.toUpperCase() === "OL") { + isOrdered = true; + parentListElem = elem; + } + } + walkParents = DOMWalker_1.DOMWalker.parentNode(walkParents); + } + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var retStr = ""; + if (!isOrdered) { + var elem = cursor.getElement(); + if ((elem.nodeName.toUpperCase() === "LI" && window.getComputedStyle(elem).listStyleType === "none") + || elem.nodeName.toUpperCase() !== "LI") { + retStr = cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + retStr = cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + else { + // For ordered lists, count sibling listitems and account for start attribute + var count = 1; // Start at 1 by default + // Get the start attribute if it exists on the <ol> element + if (parentListElem && parentListElem.nodeName.toUpperCase() === 'OL' && + parentListElem.hasAttribute('start')) { + var startValue = parseInt(parentListElem.getAttribute('start') || '1', 10); + count = isNaN(startValue) ? 1 : startValue; + } + // Count previous sibling listitems at the same level using DOMWalker + var currentElem = cursor.getElement(); + var sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(currentElem); + while (sibling) { + // Only count direct siblings that are listitems (element nodes only) + if (sibling.nodeType === 1) { + var siblingElem = sibling; + if (siblingElem.getAttribute('role') === 'listitem' || + siblingElem.nodeName.toUpperCase() === 'LI') { + count++; + } + } + sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(sibling); + } + retStr = cursor.isStartTag() ? "".concat(count, ". ").concat(nameToUse) : ""; + } + return retStr; + } + ] + }), + // Math role + new SRRendererRule_1.SRRendererRule({ + roles: ["math"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isEndTag() ? "[math content]" : ""; } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["menuitem"], + elems: [], + modes: ["item", "tab_focus", "region"], + tests: [ + function (cursor) { + var retVal = ""; + if (cursor.isStartTag()) { + // let isSubMenuContainer = false; + // for (let checkChildren=cursor.getNode().firstChild; !isSubMenuContainer && checkChildren !== null; checkChildren = checkChildren.nextSibling) { + // isSubMenuContainer = checkChildren.nodeName.toUpperCase() === "UL"; + // } + // if (isSubMenuContainer) return "[????menu]"; + var expandStr = ""; + var elem = cursor.getElement(); + if (elem.getAttribute("aria-haspopup") === "true") { + expandStr += ", sub-menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + retVal = "[menu".concat(expandStr); + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + retVal += quoteNamePadBefore(cursor); + } + retVal += "]"; + } + return retVal; + } + ] + }), + // Meter role + new SRRendererRule_1.SRRendererRule({ + roles: ["meter"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Progressbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["progressbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Radio role + new SRRendererRule_1.SRRendererRule({ + roles: ["radio"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var roleDesc = getRoleDescription(cursor, "radio button"); + var bChecked = false; + if (cursor.getElement().hasAttribute("aria-checked")) { + bChecked = cursor.getElement().getAttribute("aria-checked") === "true"; + } + else { + bChecked = cursor.getNode().checked; + } + var stateStr = getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(bChecked ? "checked" : "not checked").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Searchbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["searchbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[".concat(quoteNamePadAfter(cursor), "edit]") : ""; } + ] + }), + // Separator role + new SRRendererRule_1.SRRendererRule({ + roles: ["separator"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[separator]" || ""); } + ] + }), + // Slider role + new SRRendererRule_1.SRRendererRule({ + roles: ["slider"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "slider"); + var elem = cursor.getElement(); + // Check for aria-valuenow first, then fall back to native value property + var value = elem.hasAttribute("aria-valuenow") + ? elem.getAttribute("aria-valuenow") + : cursor.getNode().value; + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", ").concat(value).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Spinbutton role + new SRRendererRule_1.SRRendererRule({ + roles: ["spinbutton"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "spinbutton"); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", editable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Tab role + new SRRendererRule_1.SRRendererRule({ + roles: ["tab"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "tab"); + return "[".concat(roleDesc).concat(cursor.getNode().getAttribute("aria-selected") === "true" ? ", selected" : "").concat(quoteNamePadBefore(cursor), "]"); + } + ] + }), + // Tablist role + new SRRendererRule_1.SRRendererRule({ + roles: ["tablist"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[group start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[group end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Tabpanel role + new SRRendererRule_1.SRRendererRule({ + roles: ["tabpanel"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[Tab panel start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[Tab panel end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Text role + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["item", "link", "tab_focus", "region"], + tests: [ + function (cursor) { + var _a, _b, _c, _d; + if (cursor.isEndTag() || !((_a = cursor.getParentElement()) === null || _a === void 0 ? void 0 : _a.getElement())) + return null; + var elem = (_b = cursor.getParentElement()) === null || _b === void 0 ? void 0 : _b.getElement(); + if (elem.ownerDocument.defaultView.getComputedStyle(elem).textDecorationLine === "line-through") { + return "[strikethrough] ".concat((((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) + ""), " [end strikethrough]"); + } + return "".concat((((_d = cursor.getNameInfo()) === null || _d === void 0 ? void 0 : _d.name) + "")); + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["heading"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Textbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["textbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + var elem = cursor.getElement(); + if (cursor.isEndTag()) { + return mode === "item" && elem.nodeName.toUpperCase() === "TEXTAREA" ? "[out of edit]" : ""; + } + if (!cursor.isStartTag()) { + return ""; + } + var attributes = ""; + if (elem.hasAttribute("placeholder") && elem.getAttribute("placeholder").trim().length > 0) { + attributes += ", placeholder: ".concat(elem.getAttribute("placeholder")); + } + attributes += getStateAnnouncements(elem); + var isMultiline = elem.nodeName.toUpperCase() === "TEXTAREA" || elem.getAttribute("aria-multiline") === "true"; + var describedBy = getDescribedByAnnouncements(elem, mode); + if (isMultiline) { + var textContent = mode === "tab_focus" ? (_a = elem.textContent) === null || _a === void 0 ? void 0 : _a.trim() : ""; + var contentSuffix = textContent ? " ".concat(textContent) : ""; + return "[".concat(quoteNamePadAfter(cursor), "edit, multiline").concat(attributes).concat(describedBy, "]").concat(contentSuffix); + } + return "[".concat(quoteNamePadAfter(cursor), "edit").concat(attributes).concat(describedBy, "]"); + } + ] + }), + // Treeitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["treeitem"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var elem = cursor.getElement(); + // Build the announcement string without the name (let content render separately) + var announcement = "[treeview item"; + // Add selected state if present + if (elem.getAttribute("aria-selected") === "true") { + announcement += ", selected"; + } + // Add expanded/collapsed state if present + if (elem.hasAttribute("aria-expanded")) { + announcement += elem.getAttribute("aria-expanded") === "true" ? ", expanded" : ", collapsed"; + } + // Add level if explicitly set or calculate from nesting + var level = elem.getAttribute("aria-level"); + if (level) { + announcement += ", level ".concat(level); + } + else { + // Calculate level by counting parent treeitems or groups using DOMWalker for shadow DOM support + var calculatedLevel = 1; + var parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + while (parent_1) { + var parentRole = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + if (parentRole === "group" || parentRole === "tree") { + // Check if this group is inside a treeitem + var groupParent = DOMWalker_1.DOMWalker.parentElement(parent_1); + while (groupParent) { + var groupParentRole = AriaUtil_1.AriaUtil.getResolvedRole(groupParent); + if (groupParentRole === "treeitem") { + calculatedLevel++; + break; + } + else if (groupParentRole === "tree") { + break; + } + groupParent = DOMWalker_1.DOMWalker.parentElement(groupParent); + } + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + if (calculatedLevel > 1) { + announcement += ", level ".concat(calculatedLevel); + } + } + // Add position information (aria-posinset/aria-setsize or calculate) + var position = elem.getAttribute("aria-posinset"); + var setSize = elem.getAttribute("aria-setsize"); + if (!position || !setSize) { + // Calculate position by counting siblings with same role using DOMWalker for shadow DOM support + var pos = 0; + var total = 0; + var parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + if (parent_2) { + // Iterate through children to count treeitems + var child = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(parent_2); + while (child) { + if (child.nodeType === 1) { // Element node + var childElem = child; + if (AriaUtil_1.AriaUtil.getResolvedRole(childElem) === "treeitem") { + total++; + if (childElem === elem) { + pos = total; + } + } + } + child = child.nextSibling; + } + } + position = pos.toString(); + setSize = total.toString(); + } + announcement += ", ".concat(position, " of ").concat(setSize, "] "); + return announcement; + } + ] + }), + // HTML Element rules + // Preformatted text line rendering: when cursor is at a <pre> element with + // preLineIndex set, render only that line of the pre's text content. + // This rule fires inside renderRange for per-line item stops. + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["PRE"], + modes: ["item"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isEndTag()) + return ""; + if (cursor.preLineIndex === undefined) + return null; // let container_enter handle it + var fullText = (_a = cursor.getNode().textContent) !== null && _a !== void 0 ? _a : ""; + var rawLines = fullText.split("\n"); + var start = 0; + while (start < rawLines.length && rawLines[start].trim() === "") + start++; + var end = rawLines.length - 1; + while (end >= start && rawLines[end].trim() === "") + end--; + var lines = rawLines.slice(start, end + 1); + return (_b = lines[cursor.preLineIndex]) !== null && _b !== void 0 ? _b : ""; + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BODY"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + // Suppress [Start/End of document] for iframe subdocument bodies. + // When the inner body is entered from an <iframe>, diffContainers emits + // the ["name", frame] container-enter announcement instead. Suppressing + // the document title announcements here avoids double-announcements. + var body = cursor.getNode(); + if (body.ownerDocument !== document) + return ""; + var titleStr = cursor.getNode().ownerDocument.title; + return cursor.isEndTag() ? "[End of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]") : "[Start of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]"); + } + ] + }), + // Inline frame (<iframe>) — tab_focus mode: announces the frame as a tab stop. + // A titled iframe announces its accessible name; an untitled one announces just "frame". + // (The item-mode announcement is handled by diffContainers emitting the container_enter + // IFRAME rule when crossing into the subdocument — no separate SR_RULE needed for item mode.) + // When role="none" or role="presentation" is set, screen readers treat the frame as a + // generic grouping — announce "grouping" instead of "frame". + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return null; + var role = cursor.getElement().getAttribute("role"); + var isPresentation = role === "none" || role === "presentation"; + // An untitled presentational iframe produces no meaningful tab stop label — + // suppress it entirely so it does not appear in the tab_focus column. + if (isPresentation && !cursor.getName()) + return null; + var label = isPresentation ? "grouping" : "frame"; + return "[".concat(quoteNamePadAfter(cursor)).concat(label, "]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BR"], + modes: ["item"], + tests: [ + function (cursor) { + try { + var walk = cursor.clone(); + // Walk until we hit the beginning of the page, find another BR, or find something with a name + while (walk.previous(function () { return true; }) && walk.getNode().nodeName.toUpperCase() !== "BR" && walk.getNameInfo() && walk.getNameInfo().name.trim().length === 0) + ; + return walk.getNode().nodeName.toUpperCase() === "BR" ? "[blank]" : null; + } + catch (err) { + console.error(err); + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["INPUT"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { var _a; return (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "password" && "[".concat(quoteNamePadAfter(cursor), "edit, protected").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]")) || null; }, + function (cursor, _oldCursor, mode) { + var _a, _b; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "file") { + var value = ((_b = cursor.getElement()) === null || _b === void 0 ? void 0 : _b.value) || ""; + value = value === "" ? "No file chosen" : value.substring("C:\\fakepath\\".length); + return "[".concat(quoteNamePadAfter(cursor), "button").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(quoteNamePadAfter(cursor)).concat(value, "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "color") { + var val = cursor.getElement().value; + var r = (Number("0x".concat(val.substring(1, 3))) * 100.0 / Number("0xff")).toFixed(0); + var g = (Number("0x".concat(val.substring(3, 5))) * 100.0 / Number("0xff")).toFixed(0); + var b = (Number("0x".concat(val.substring(5))) * 100.0 / Number("0xff")).toFixed(0); + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(r, "% red ").concat(g, "% green ").concat(b, "% blue]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "month") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] [spin button, ").concat(y, "] [menu button] [subMenu] Show month picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "date") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + var day = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [menu button] [subMenu] Show date picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "datetime-local") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var y = "0"; + var m = "0"; + var day = "0"; + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + if (date.getHours() === 0 || date.getHours() === 12) { + hour = "12"; + } + else if (date.getHours() < 12) { + hour = "" + date.getHours(); + } + else { + hour = "" + (date.getHours() - 12); + } + min = "" + date.getMinutes(); + ampm = date.getHours() >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show local date and time picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "time") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = val.split(":"); + var hours = parseInt(date[0]); + if (hours === 0 || hours === 12) { + hour = "12"; + } + else if (hours < 12) { + hour = "" + hours; + } + else { + hour = "" + (hours - 12); + } + min = date[1]; + ampm = hours >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "grouping clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), " [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show time picker [out of grouping]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "week") { + var val = cursor.getElement().value; // 2025-W38 + var year = "0"; + var week = "0"; + if (val.trim().length > 0) { + var date = val.split(/-W/); + year = date[0]; + week = date[1]; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(week, "], [spin button, ").concat(year, "] [menu button] [subMenu] Show week picker"); + } + return null; + }, + function (cursor) { var _a; return ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "hidden" ? "" : null; }, + function (cursor) { return (cursor.isStartTag() && "!![".concat(quoteNamePadAfter(cursor), "input!!]").concat(cursor.getElement().outerHTML)) || null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["LI"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var elem = cursor.getElement(); + if (window.getComputedStyle(elem).listStyleType === "none") { + return cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + return cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + ] + }), + // MathML elements + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MFRAC"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[fraction]" : "[end fraction]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MROW"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Only announce over on the end tag + if (cursor.isStartTag()) + return undefined; + var fraction = cursor.getCurrentOrParentByRoleClone([], ["mfrac"]); + if (fraction && ((_a = fraction.getElement().querySelectorAll("mrow")[0]) === null || _a === void 0 ? void 0 : _a.isSameNode(cursor.getNode()))) { + return "[over]"; + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSQRT"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[square root]" : "[end root]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSUP"], + modes: ["item"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isEndTag()) + return undefined; + var mi = ((_a = cursor.getElement().querySelector("mi")) === null || _a === void 0 ? void 0 : _a.innerHTML) || ""; + var mn = ((_b = cursor.getElement().querySelector("mn")) === null || _b === void 0 ? void 0 : _b.innerHTML) || ""; + if (mn === "2") + return "".concat(mi, " [squared]"); + if (mn === "3") + return "".concat(mi, " [cubed]"); + return "".concat(mi, " [to the ").concat(mn, "]"); + } + ] + }), + // Summary element — the disclosure button for a <details> widget. + // <summary> has implicitRole: null in ARIADefinitions so no role-based + // button rule fires. We add an explicit element rule that announces it as + // a button with the collapsed / expanded state from the parent <details>. + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["SUMMARY"], + modes: ["item", "button", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a, _b; + if (cursor.isEndTag()) + return ""; + var summaryElem = cursor.getElement(); + if (!summaryElem) + return null; + // Only the first <summary> that is a direct child of <details> + // acts as the disclosure button. + var detailsParent = summaryElem.parentElement; + if (!detailsParent || detailsParent.nodeName.toUpperCase() !== "DETAILS") + return null; + var firstSummary = Array.from(detailsParent.children).find(function (c) { return c.nodeName.toUpperCase() === "SUMMARY"; }); + if (!firstSummary || !firstSummary.isSameNode(summaryElem)) + return null; + var stateStr = detailsParent.hasAttribute("open") ? "expanded" : "collapsed"; + // <summary> has implicitRole: null so AccNameUtil may not compute a name; + // read aria-label first, then fall back to visible text content. + var ariaLabel = (_a = summaryElem.getAttribute("aria-label")) === null || _a === void 0 ? void 0 : _a.trim(); + var textContent = ((_b = summaryElem.textContent) === null || _b === void 0 ? void 0 : _b.trim()) || ""; + var label = ariaLabel || textContent; + var labelStr = label ? "\"".concat(label, "\", ") : ""; + // Description: prefer explicit aria-describedby; when aria-label is the + // name source, the subtree text becomes the description (accname-1.2 §4.3). + var descStr = getDescribedByAnnouncements(summaryElem, mode); + if (!descStr && ariaLabel && textContent) { + descStr = mode === "item" ? ", \u0001".concat(textContent, "\u0002") : ", \"".concat(textContent, "\""); + } + return "[".concat(labelStr, "button, ").concat(stateStr).concat(descStr, "]"); + } + ] + }), + // Multiple roles rules - placed at the bottom + // Default mode rules - Container elements (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "code", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "list", "main", + "mark", "navigation", "region", "row", "rowheader", "search", "table", "toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Default mode rules - Elements that screen readers typically ignore (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["paragraph", "rowgroup", "status", "strong", "subscript", "superscript", + "term", "time", "none", "presentation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ 8485 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(328); +var SRTableUtil_1 = __webpack_require__(369); +var common_1 = __webpack_require__(7242); +var AriaUtil_1 = __webpack_require__(7011); +var ARIADefinitions_1 = __webpack_require__(9910); +var CommonUtil_1 = __webpack_require__(7139); +/** + * Generates the announcement text when entering a table cell + */ +function renderEnterTableCell(newCursor, oldCursor) { + var _a; + // We seem to be at the newline text node after the cell + if (oldCursor && ((_a = oldCursor.getNode()) === null || _a === void 0 ? void 0 : _a.nodeName) === "#text") { + oldCursor = oldCursor.clone(); + oldCursor.previous(function () { return true; }); + } + var newTableModel = SRTableUtil_1.SRTableUtil.getTableModel(newCursor); + var oldCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(oldCursor, newTableModel); + var newCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(newCursor, newTableModel); + if (!newCellInfo) + return ""; + var retVal = []; + // Announce row information if we've moved to a different row or the rowspan has changed + if (!oldCellInfo || oldCellInfo.rowIndexStart !== newCellInfo.rowIndexStart || oldCellInfo.rowspan !== newCellInfo.rowspan) { + // If a change in row or a change in rowSpan + var rowHeaders = SRTableUtil_1.SRTableUtil.getRowHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = rowHeaders && rowHeaders.trim().length > 0 ? "\"".concat(rowHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "row ").concat((newCellInfo.rowIndexStart + 1)).concat(newCellInfo.rowspan > 1 ? " through " + (newCellInfo.rowIndexStart + newCellInfo.rowspan) : "", "]")); + } + // Announce column information if we've moved to a different column or the colspan has changed + if (!oldCellInfo || oldCellInfo.colIndexStart !== newCellInfo.colIndexStart || oldCellInfo.colspan !== newCellInfo.colspan) { + // If a change in column or a change in colspan + var columnHeaders = SRTableUtil_1.SRTableUtil.getColumnHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = columnHeaders && columnHeaders.trim().length > 0 ? "\"".concat(columnHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "column ").concat((newCellInfo.colIndexStart + 1)).concat(newCellInfo.colspan > 1 ? " through " + (newCellInfo.colIndexStart + newCellInfo.colspan) : "", "]")); + } + return retVal.join(" "); +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item", "article", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + // Cell role + new SRRendererRule_1.SRRendererRule({ + roles: ["cell"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Columnheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["columnheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "complementary region]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "content info region]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[section]"; + } + else { + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "form region]"); + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item", "region"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + var elem = cursor.getElement(); + var hasSummary = Array.from(elem.children).some(function (c) { return c.nodeName.toUpperCase() === "SUMMARY"; }); + if (hasSummary) { + // The <summary> child speaks as the disclosure button; suppress + // the container-enter announcement entirely. + return ""; + } + // No explicit <summary>: in a real browser the UA injects a default + // "Details" summary. jsdom does not, so we announce the widget here + // as a fallback using the same default label a real browser would use. + return "[\"Details\", button, ".concat(elem.hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // -- tab_focus + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["tab_focus"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + var elem = cursor.getElement(); + var hasSummary = Array.from(elem.children).some(function (c) { return c.nodeName.toUpperCase() === "SUMMARY"; }); + if (hasSummary) { + // <summary> is the tab stop, not <details> itself. + return null; + } + // No <summary>: <details> itself is focusable (UA default behaviour). + return "[\"Details\", button, ".concat(elem.hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + return ""; + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var _a; + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // Count items, excluding those in other lists or within presentational containers + var numItems = 0; + for (var i = 0; i < descendantListItems.snapshotLength; i++) { + var item = descendantListItems.snapshotItem(i); + // Walk up ancestors to check for both nested lists and presentational containers + var isInOtherList = false; + var hasPresentationalAncestor = false; + var ancestor = item.parentElement; + while (ancestor && ancestor !== node) { + // Check if ancestor is another list + var ancestorRole = AriaUtil_1.AriaUtil.getResolvedRole(ancestor); + if (ancestorRole === "list" || + ancestor.nodeName.toUpperCase() === "UL" || + ancestor.nodeName.toUpperCase() === "OL") { + isInOtherList = true; + break; + } + // Check if ancestor has presentational children + if (ancestorRole && ((_a = ARIADefinitions_1.ARIADefinitions.designPatterns[ancestorRole]) === null || _a === void 0 ? void 0 : _a.presentationalChildren)) { + hasPresentationalAncestor = true; + break; + } + ancestor = ancestor.parentElement; + } + if (!isInOtherList && !hasPresentationalAncestor) { + numItems++; + } + } + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "list of ").concat(numItems, " items]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "main region]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers = document.evaluate(".//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers2 = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']/*[@role='menu']|.//*[@role='menu']//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + console.log("MENUBAR", cursor.isEndTag() ? "/" : "", cursor.getNode()); + console.log(descendantListItems, descendantListItemsInOtherLists); //, descendantContainers, descendantContainers2) + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; //-descendantContainers.snapshotLength+descendantContainers2.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "menubar with ").concat(numItems, " items]"); + } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Radio group role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.getNameInfo() === null) + return null; + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Row role + new SRRendererRule_1.SRRendererRule({ + roles: ["row"], + elems: [], + modes: ["item", "table"], + tests: [ + function () { return ""; } + ] + }), + // Rowheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var tableWalker = cursor.clone(); + // Get to the start of the table + while (tableWalker.getRole() !== "table" && tableWalker.previous(function () { return true; })) + ; + // Set an end to the table + var tableNode = tableWalker.getNode(); + var rows = 0; + var cols = 0; + // Sanity check that the table has content + if (tableWalker.getNode().firstChild) { + var firstRowComplete = false; + while (tableWalker.next(function () { return true; }) && !tableWalker.getNode().isSameNode(tableNode)) { + var role = tableWalker.getRole(); + if (tableWalker.isStartTag()) { + if (role === "row") { + ++rows; + } + else { + if (!firstRowComplete && ["cell", "rowheader", "columnheader"].includes(role)) { + var elem = tableWalker.getNode(); + cols += parseInt(elem.getAttribute("colspan") || "1"); + } + } + } + else if (role === "row") { + firstRowComplete = true; + } + } + } + return "[table with ".concat(rows, " ").concat(rows === 1 ? "row" : "rows", " and ").concat(cols, " ").concat(cols === 1 ? "column" : "columns").concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "toolbar]"); + } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//dt", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "definition list of ").concat(numItems, " terms]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[highlighted]"; } + ] + }), + // Inline frame (<iframe>) + // Only fires in item mode (where it produces the container-enter label on the parent + // block stop). In tab_focus mode the iframe element itself is the stop and the + // IFRAME SR_RULE in common.ts supplies the label directly — no container-enter needed. + // When role="none" or role="presentation" is set, screen readers treat the frame + // as a generic grouping — announce "grouping" instead of "frame". + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["item"], + tests: [ + function (cursor) { + var role = cursor.getElement().getAttribute("role"); + var isPresentation = role === "none" || role === "presentation"; + // An untitled presentational iframe has no meaningful grouping label to + // announce — suppress the container-enter entirely. + if (isPresentation && !cursor.getName()) + return null; + var label = isPresentation ? "grouping" : "frame"; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(label, "]"); + } + ] + }), + // Preformatted text (<pre>) + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["PRE"], + modes: ["item"], + tests: [ + function (cursor) { return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "preformatted text]"); } + ] + }), + // Multiple roles rules - placed at the bottom + // Heading mode rules - ignore container elements in heading mode (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "region", + "row", "rowheader", "search", "toolbar", "list", "main", "navigation", "table"], + elems: [], + modes: ["heading"], + tests: [ + function () { return ""; } + ] + }) +]; + + +/***/ }, + +/***/ 2099 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(328); +var common_1 = __webpack_require__(7242); +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "complementary region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "content info region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[out of figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[out of section]"; + } + else { + return "[out of form]"; + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // <details> uses the group role but has its own disclosure widget semantics; + // SRs do not announce "out of grouping" when leaving a details element. + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + return ""; + } + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + return "[out of grouping]"; + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "out of list]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "main region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (_cursor) { return "[out of menubar]"; } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // radiogroup role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (_cursor) { return "[out of grouping]"; } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of table]"; } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of toolbar]"; } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["ABBR"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.getElement().hasAttribute("title") ? + "[".concat(cursor.getElement().getAttribute("title"), "]") : null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of definition list]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of highlighted]"; } + ] + }), + // Inline frame (<iframe>) + // When role="none" or role="presentation" is set, screen readers treat the frame + // as a generic grouping — announce "out of grouping" instead of "out of frame". + // Exception: an untitled presentational iframe produces no container-enter label, so + // the matching container-exit must also be suppressed to avoid a stray "[out of grouping]". + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["item"], + tests: [ + function (cursor) { + var role = cursor.getElement().getAttribute("role"); + var isPresentation = role === "none" || role === "presentation"; + if (isPresentation && !cursor.getName()) + return null; + return isPresentation ? "[out of grouping]" : "[out of frame]"; + } + ] + }), + // Preformatted text (<pre>) + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["PRE"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of preformatted text]"; } + ] + }), + // Multiple roles rules - placed at the bottom + // Region mode rules - ignore container elements in region and heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["group", "article", "banner", "blockquote", "caption", "complementary", + "contentinfo", "figure", "form", "list", "region", "main", "navigation", + "search", "table", "toolbar"], + elems: [], + modes: ["region", "heading"], + tests: [ + function () { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ 2151 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CONTAINER_EXIT_RULES = exports.CONTAINER_ENTER_RULES = exports.SR_RULES = void 0; +var common_1 = __webpack_require__(7242); +var container_enter_1 = __webpack_require__(8485); +var containter_exit_1 = __webpack_require__(2099); +exports.SR_RULES = common_1.RULES; +exports.CONTAINER_ENTER_RULES = container_enter_1.RULES; +exports.CONTAINER_EXIT_RULES = containter_exit_1.RULES; + + +/***/ }, + +/***/ 1950 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AccNameUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(9910); +var CommonUtil_1 = __webpack_require__(7139); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +var CacheUtil_1 = __webpack_require__(4566); +var DOMWalker_1 = __webpack_require__(3864); +var DOMUtil_1 = __webpack_require__(1686); +var AccNameUtil = /** @class */ (function () { + function AccNameUtil() { + } + /** + * Computes the accessible name for an SVG element according to W3C specification + * Following the Accessible Name and Description Computation 1.1 algorithm + * https://www.w3.org/TR/accname-1.1/ + * + * @param elem The SVG element + * @returns The accessible name result or null if no accessible name is found + */ + AccNameUtil.computeAccessibleNameForSVGElementW3C = function (elem) { + if (!elem || elem.nodeName.toLowerCase() !== 'svg') + return null; + // Step 1: Check for aria-labelledby (already handled by main computeAccessibleName function) + // Step 2: Check for aria-label (already handled by main computeAccessibleName function) + // Step 3: Check for title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_1 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_1 += title.trim(); + } + }); + if (text_1 && text_1.trim() !== '') + return { "name": text_1.trim(), "nameFrom": "svgTitle" }; + } + // Step 4: Check for text content in SVG text elements + var textContent = ""; + var textElements = elem.querySelectorAll("text, textPath, tspan"); + if (textElements && textElements.length > 0) { + textElements.forEach(function (textElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(textElement) && !VisUtil_1.VisUtil.isNodePresentational(textElement)) { + var content = textElement.textContent; + if (content && content.trim() !== '') + textContent += " " + content.trim(); + } + }); + if (textContent.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(textContent.trim()), "nameFrom": "svgText" }; + } + // Step 5: Check for xlink:title attribute on links within SVG + var links = elem.querySelectorAll("a"); + for (var i = 0; i < links.length; i++) { + var link = links[i]; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(link) && !VisUtil_1.VisUtil.isNodePresentational(link)) { + var xlinkTitle = link.getAttribute("xlink:title"); + if (xlinkTitle && xlinkTitle.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(xlinkTitle), "nameFrom": "svglinkTitle" }; + } + } + // Step 6: Check for aria-describedby or aria-description + var description = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (description && description.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(description), "nameFrom": "aria-description" }; + // Step 7: Check for desc element + var descElements = elem.querySelectorAll(":scope > desc"); + if (descElements && descElements.length > 0) { + var descText_1 = ""; + descElements.forEach(function (descElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(descElement) && !VisUtil_1.VisUtil.isNodePresentational(descElement)) { + var desc = descElement.textContent; + if (desc && desc.trim() !== '') + descText_1 += " " + desc.trim(); + } + }); + if (descText_1.trim() !== '') + return { "name": descText_1.trim(), "nameFrom": "svgDesc" }; + } + // Step 8: Check for title attribute + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title"); + if (title && title.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(title), "nameFrom": "title" }; + } + // No accessible name found + return null; + }; + // calculate accessible name for a given node + AccNameUtil.computeAccessibleName = function (elem) { + if (!elem) + return null; + var nodeName = elem.nodeName.toLowerCase(); + var name_pair = CacheUtil_1.CacheUtil.getCache(elem, "ELEMENT_ACCESSBLE_NAME", undefined); + if (name_pair !== undefined) + return name_pair; + // 1. name from author, or elements without a role but with aria-labelledby or aria-label + // get aria label even for the role where the name is prohibited or is 'presentation' or 'none' + var accName = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (accName && accName.trim() !== "") { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }); + return { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }; + } + // 2. accessible name mapping for native html elements + name_pair = AccNameUtil.computeAccessibleNameForNativeElement(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + // 3. name from native or aria attribute + /**name_pair = AccNameUtil.computeAccessibleNameFromAttribute(elem); + if (name_pair) { + CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + }*/ + // 4. name from content for custom elements with a role + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) { + name_pair = AccNameUtil.computeAccessibleNameFromContent(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + } + // 5. name from the global attribute "title" + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title").trim(); + if (title && title.trim().length > 0) { + title = CommonUtil_1.CommonUtil.truncateText(title); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": title, "nameFrom": "title" }); + return { "name": title, "nameFrom": "title" }; + } + } + // 6. name from the attribute "placeholder" + if (nodeName === 'textarea' || (nodeName === 'input' && (!elem.hasAttribute("type") || CommonUtil_1.CommonUtil.input_type_with_placeholder.includes(elem.getAttribute("type"))))) { + var placeholder = elem.getAttribute("placeholder"); + if (placeholder && placeholder.trim().length > 0) { + placeholder = CommonUtil_1.CommonUtil.truncateText(placeholder); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": placeholder, "nameFrom": "placeholder" }); + return { "name": placeholder, "nameFrom": "placeholder" }; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", null); + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForNativeElement = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + // labellable fields + if (CommonUtil_1.CommonUtil.form_labelable_elements.includes(nodeName)) { + // Get only the non-hidden labels for element + var label = CommonUtil_1.CommonUtil.getFormFieldLabel(elem); + if (label && label.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // input types: button, reset, submit, image + if (nodeName === "input" && elem.hasAttribute("type")) { + if (CommonUtil_1.CommonUtil.form_button_types.includes(elem.getAttribute("type"))) { + // input types: button, reset, submit + // Get the "value" attribute for the element + var value = CommonUtil_1.CommonUtil.getElementAttribute(elem, "value"); + if (value && value.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(value), "nameFrom": "value" }; + // input 'submit' and 'reset' have visible defaults so pass if there is no explicit 'value' attribute + var type = elem.getAttribute("type"); + if (type === 'submit' || type === 'reset') + return { "name": type, "nameFrom": "internal" }; + } + else if (elem.getAttribute("type") === 'image') { + // input type = 'image' + // note that though HTML 5 spec indicates "The element's [value] attribute must be omitted", Chrome uses the value. + // Get the accessible name for the alt attribute + var alt = CommonUtil_1.CommonUtil.getElementAttribute(elem, "alt"); + if (alt && alt.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + ; + // the visible default text for type "image" is "Submit" same with the type "submit" + //return {"name":elem.getAttribute("type"), "nameFrom": "internal"}; + } + } + // button + // note button may have a value attribute, but it's not a visible text + if (nodeName === "button") { + // first use the button text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + // for image button: get the first image if exists + var image = elem.querySelector('img'); + if (image && !VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + // for a button with a svg image + var svg = elem.querySelector('svg'); + if (svg && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svg) && !VisUtil_1.VisUtil.isNodePresentational(svg)) { + var pair = AccNameUtil.computeAccessibleName(svg); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + } + // fieldset + if (nodeName === "fieldset") { + // if the fieldset element's first child is a legend element, then use the subtree of the legend + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'legend') { + // legend can be mixed text + var text = first.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + } + // output + if (nodeName === "output") { + // if the associated label element exists, use concatenated accessible name(s) from labelled elements. + if (elem.hasAttribute("for")) { + var labelIDs = elem.getAttribute("for").trim().split(" "); + if (labelIDs && labelIDs.length > 0) { + var label = ""; + for (var j = 0; j < labelIDs.length; j++) { + var labelNode = elem.ownerDocument.getElementById(labelIDs[j]); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elem) && !VisUtil_1.VisUtil.isNodeHiddenFromAT(labelNode) && !VisUtil_1.VisUtil.isNodePresentational(labelNode)) { + var pair = AccNameUtil.computeAccessibleName(labelNode); + if (pair && pair.name && pair.name.trim().length > 0) + label += " " + CommonUtil_1.CommonUtil.normalizeSpacing(pair.name); + } + } + if (label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + } + } + // summary + if (nodeName === "summary") { + // use summary element subtree + var text = elem.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + // details + if (nodeName === "details") { + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'summary') { + // get accessible name from summary + var pair = AccNameUtil.computeAccessibleName(first); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(pair.name.trim()), "nameFrom": "summary" }; + } + // If no summary element as a direct child of the details element, + // the user agent should provide one with a subtree containing a localized string of the word "details". + return { "name": "details", "nameFrom": "internal" }; + } + // figure + if (nodeName === "figure") { + // if the figure element has a figcaption as a child + var caption = CommonUtil_1.CommonUtil.getChildByTagHidden(elem, "figcaption", true, false); + if (caption && caption.length > 0) { + // figcaption can be mixed text + var text = caption[0].innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "figcaption" }; + } + } + // img elements: use attribute "alt" + if (nodeName === "img") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // area elements: use attribute "alt" + if (nodeName === "area") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + if (alt && alt.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // table element + if (nodeName === "table") { + // if the figure element has a caption as the first child + var captionElem = elem.firstElementChild; + if (captionElem && captionElem.nodeName.toLowerCase() === 'caption') { + // caption can be mixed text + var caption = captionElem.innerText; + if (caption && caption.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(caption), "nameFrom": "caption" }; + } + } + // a element + if (nodeName === "a") { + // first use the link text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + //for image link: get the image or svg if exists + var images = elem.querySelectorAll(":scope > img, :scope > svg"); + if (images && images.length > 0) { + var text_2 = ""; + images.forEach(function (image) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + text_2 += " " + pair.name.trim(); + } + }); + if (text_2.trim() !== '') + return { "name": text_2.trim(), "nameFrom": "alt" }; + } + } + // optgroup + // label participate in accessible name calculation: https://www.w3.org/TR/html-aam-1.0/#att-label + // The label attribute must be specified. Its value gives the name of the group + // the value is disabled in the interface + if (nodeName === "optgroup" || nodeName === "option" || nodeName === "track") { + var label = elem.getAttribute("label"); + if (label && label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // svg + if (nodeName === "svg") { + var pair = AccNameUtil.computeAccessibleNameForSVGElementW3C(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForSVGElement = function (elem) { + // 1. a direct child or descendant title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_3 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_3 += title.trim(); + } + }); + if (text_3 && text_3.trim() !== '') + return { "name": text_3.trim(), "nameFrom": "svgTitle" }; + } + // 2. xlink:title attribute on a link + var linkTitle = elem.querySelector("a"); + if (linkTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(linkTitle) && !VisUtil_1.VisUtil.isNodePresentational(linkTitle)) { + var link = linkTitle.getAttribute("xlink:title"); + if (link && link.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(link), "nameFrom": "svglinkTitle" }; + } + /** 3. for text container elements, the text content. + * note the SVG text content elements are: ‘text’, ‘textPath’ and ‘tspan’. + * svg element can be nested. One of the purposes is to to group SVG shapes together as a collection for responsive design. + * + * select text content excluded the text from the nested svg elements and their children + */ + var text = ""; + elem.querySelectorAll(":scope > *").forEach(function (element) { + if (element.nodeName.toLowerCase() !== 'svg' && !VisUtil_1.VisUtil.isNodeHiddenFromAT(element) && !VisUtil_1.VisUtil.isNodePresentational(element)) { + var value = CommonUtil_1.CommonUtil.getInnerText(element); + if (value && value.trim().length > 0) + text += value; + } + }); + if (text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "svgText" }; + // 4. from aria-describedby or aria-description + var descby = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (descby && descby.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(descby), "nameFrom": "aria-description" }; + // 5. a direct child or descendant desc element + var descElems = elem.querySelectorAll(":scope > desc"); + if (descElems && descElems.length > 0) { + var text_4 = ""; + descElems.forEach(function (descElem) { + if (descElem && !VisUtil_1.VisUtil.isNodeHiddenFromAT(descElem) && !VisUtil_1.VisUtil.isNodePresentational(descElem)) { + var desc = descElem.textContent; + if (desc && desc.trim() !== '') + text_4 += desc.trim(); + } + }); + if (text_4 && text_4.trim() !== '') + return { "name": text_4.trim(), "nameFrom": "svgDesc" }; + } + }; + // calculate accessible name for custom elements marked with aria + AccNameUtil.computeAccessibleNameFromContent = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + /** for acc name from content, the content from CSS pseudo-elements + * :before and :after pseudo elements [CSS2] can provide textual content for elements that have a content model. + * For :before or :after pseudo elements, user agents must prepend CSS textual content, without a space, + * to the textual content of the current node. + */ + var pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "before"); + if (pair !== null && pair.name && pair.name.trim().length > 0) + return pair; + pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "after"); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + // shadow host + if (elem.shadowRoot) { + pair = AccNameUtil.computeAccessibleNameForShadowHost(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "shadow" }; + ; + } + // slot element + if (nodeName === "slot") { + pair = AccNameUtil.computeAccessibleNameForSlotElement(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "slot" }; + } + // otherwise: get the value from the element + pair = AccNameUtil.computeAccessibleNameFromChildren(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "content" }; + // no accessible name exists + return null; + }; + // calculate accessible name from CSS generated content + AccNameUtil.computeAccessibleNameForCSSPseudoElement = function (elem, type) { + var contentElem = elem.ownerDocument.defaultView.getComputedStyle(elem, type); + if (contentElem) { + var content = contentElem.content; + if (content && content !== "none" && content !== "no" && content !== "normal") { + content = content.replace(/^"/, "").replace(/"$/, ""); + if (content.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(content), "nameFrom": "css-" + type }; + } + } + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForShadowHost = function (elem) { + var text = ""; + var shadowRoot = elem.shadowRoot; + if (shadowRoot) { + var children = shadowRoot.querySelectorAll('*'); + // check text from all the children elements + children.forEach(function (child) { + var pair = AccNameUtil.computeAccessibleName(child); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + }); + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "shadow-host" }; + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForSlotElement = function (elem) { + //if no assignedNode, check its own text + var text = ""; + if (!elem.assignedNodes() || elem.assignedNodes().length === 0) { + var pair = AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + } + else { + // check text from all assigned nodes + for (var _i = 0, _a = elem.assignedNodes(); _i < _a.length; _i++) { + var slotChild = _a[_i]; + var pair = AccNameUtil.computeAccessibleName(slotChild); + if (pair && pair.name && pair.name.length > 0) + text += " " + pair.name.trim(); + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content-slot" }; + return null; + }; + // calculate accessible name from children content + AccNameUtil.computeAccessibleNameFromChildren = function (elem) { + var text = ""; + //let walkChild = elem.firstChild; + var nw = new DOMWalker_1.DOMWalker(elem); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + //while (walkChild) { + var walkChild = nw.node; + if (walkChild.nodeType === 3) { + // for the text node, get the parentnode to check visibility + var parent_1 = walkChild.parentElement; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(parent_1) && !VisUtil_1.VisUtil.isNodePresentational(parent_1) && walkChild.nodeValue && walkChild.nodeValue.trim().length > 0) { + text += " " + walkChild.nodeValue.trim(); + } + } + else if (walkChild.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(walkChild) && !VisUtil_1.VisUtil.isNodePresentational(walkChild)) { + var pair = AccNameUtil.computeAccessibleName(walkChild); + if (pair && pair.name && pair.name.length > 0) { + text += " " + pair.name.trim(); + nw.bEndTag = true; + } + // Skip children if this element only has presentational children + else if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(nw.node)) { + nw.bEndTag = true; + } + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content" }; + return null; + }; + // if accessible name can be ignored for image or svg + AccNameUtil.isAccessibleNameIgnorable = function (elem) { + if (!elem) + return false; + var nodeName = elem.nodeName.toLowerCase(); + if (nodeName !== 'img' && nodeName !== 'svg') + return false; + var parent = elem.parentElement; + if (parent) { + // if the parent is a widget and has an aria label, then image/svg label is not necessary + if ((AriaUtil_1.AriaUtil.isWidget(parent) || AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(parent)) && AriaUtil_1.AriaUtil.hasAriaLabel(parent)) + return true; + } + return false; + }; + return AccNameUtil; +}()); +exports.AccNameUtil = AccNameUtil; + + +/***/ }, + +/***/ 7011 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AriaUtil = void 0; +var CacheUtil_1 = __webpack_require__(4566); +var ARIADefinitions_1 = __webpack_require__(9910); +var ARIAMapper_1 = __webpack_require__(9955); +var DOMWalker_1 = __webpack_require__(3864); +var VisUtil_1 = __webpack_require__(3946); +var CommonUtil_1 = __webpack_require__(7139); +var AccNameUtil_1 = __webpack_require__(1950); +var fragment_1 = __webpack_require__(5279); +var DOMUtil_1 = __webpack_require__(1686); +var AriaUtil = /** @class */ (function () { + function AriaUtil() { + } + AriaUtil.isDefinedAriaAttributeAtIndex = function (ele, index) { + var attrName = ele.attributes[index].name; + return AriaUtil.isDefinedAriaAttribute(ele, attrName); + }; + /** + * this method returns user-defined aria attribute name from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributes = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push(attrName); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributes = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push(attrName); + } + } + return htmlAttributes; + }; + /** + * this method returns user-defined aria attribute name-value pair from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributeNameValuePairs = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push({ name: attrName, value: attrValue }); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name-value pair from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributeNameValuePairs = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push({ name: attrName, value: attrValue }); + } + } + return htmlAttributes; + }; + /** + * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true" + */ + AriaUtil.getAriaAttribute = function (ele, attributeName) { + // If the attribute is defined, it takes precedence + var retVal = ele.getAttribute(attributeName); + if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check + return retVal; + } + // Then determine implicit values from other attributes + if (!retVal) { + var tag = ele.nodeName.toLowerCase(); + if (attributeName in AriaUtil.ariaAttributeImplicitMappings) { + if (tag in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName][tag]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + else if ("*" in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName]["*"]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + } + // Check role-based defaults + if (!retVal) { + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele); + if (role in AriaUtil.ariaAttributeRoleDefaults && attributeName in AriaUtil.ariaAttributeRoleDefaults[role]) { + retVal = AriaUtil.ariaAttributeRoleDefaults[role][attributeName]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + // Still not defined? Check global defaults + if (!retVal && attributeName in AriaUtil.ariaAttributeGlobalDefaults) { + retVal = AriaUtil.ariaAttributeGlobalDefaults[attributeName]; + } + return retVal; + }; + AriaUtil.isDefinedAriaAttribute = function (ele, attrName) { + var isDefinedAriaAttribute = false; + if (attrName.substring(0, 5) === 'aria-') { + // User agents SHOULD treat state and property attributes with a value of "" the same as they treat an absent attribute. + isDefinedAriaAttribute = ele.hasAttribute && ele.hasAttribute(attrName) && ele.getAttribute(attrName).length > 0; + } + return isDefinedAriaAttribute; + }; + /** + * WAI-ARIA’s role attribute may have a list of values, but only the first valid and supported WAI-ARIA role is used + * https://www.w3.org/TR/wai-aria-implementation/#mapping_role_table + * This function is responsible for retrieving the resoled role for an element. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return string - resolved role for the element: + * explicit role: resoled from the list of values + * implicit role: if not explicitely specified, or none of the specified role values is allowed for the element + * null: if none of the specified role values is allowed for the element, neither implicit role exists + * + * @memberOf AriaUtil + */ + AriaUtil.getResolvedRole = function (elem, considerImplicitRoles) { + if (considerImplicitRoles === void 0) { considerImplicitRoles = true; } + if (!elem) + return null; + var role = CacheUtil_1.CacheUtil.getCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", null); + if (role === null) { + var roles = AriaUtil.getUserDefinedRoles(elem); + var tagProperty = AriaUtil.getElementAriaProperty(elem); + var allowedRoles = AriaUtil.getAllowedAriaRoles(elem, tagProperty); + var containsGeneric = false; + if (roles && roles.length > 0 && allowedRoles && allowedRoles.length > 0) { + for (var i = 0; i < roles.length; i++) { + if (allowedRoles.includes("any") || allowedRoles.includes(roles[i])) { + if (allowedRoles.includes("any") && roles[i] === 'generic') { + containsGeneric = true; + continue; + } + role = roles[i]; + if (role === "presentation" || role === "none") { + // If element is focusable, then presentation roles are to be ignored + if (CommonUtil_1.CommonUtil.isFocusable(elem)) { + //reset rule to null + role = null; + continue; + } + } + break; + } + } + if (containsGeneric) + role = 'generic'; + } + if (role === null && considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(elem); + role = implicitRole && implicitRole.length > 0 ? implicitRole[0] : undefined; + } + CacheUtil_1.CacheUtil.setCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", role); + } + return role !== undefined ? role : null; + }; + /** + * This function is responsible for retrieving user defined element's roles from dom. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} roles - list of user defined roles in the element role attribute. + * + * @memberOf AriaUtil + */ + AriaUtil.getUserDefinedRoles = function (ele) { + return AriaUtil.getRoles(ele, false); + }; + /** + * This function is responsible for retrieving element's roles. + * This function also finds implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} roles - list of attribute roles and implicit roles. + * + * @memberOf AriaUtil + */ + AriaUtil.getRoles = function (ele, considerImplicitRoles) { + var roles = []; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + var attrRoles = CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("role").trim()).split(" "); + for (var i = 0; i < attrRoles.length; ++i) { + roles.push(attrRoles[i]); + } + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + //add implicit roles to the attributes roles. + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, roles); + } + } + return roles; + }; + /** + * Returns the implicit role of the elemement + * @parm {HTMLElement} ele - element for which to find role. + * + * @return the implicit role or [] if doesn't exist + * + * @memberOf AriaUtil + */ + AriaUtil.getImplicitRole = function (ele) { + if (!ele || ele.nodeType !== 1) + return null; + var implicitRoles = CacheUtil_1.CacheUtil.getCache(ele, "AriaUtil_ImplicitRole", null); + if (!implicitRoles) { + var tagProperty = AriaUtil.getElementAriaProperty(ele); + // check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole) { + if (tagProperty.implicitRole.includes("generic")) { + // the 'generic' role is only allowed if a valid aria attribute exists. + var domAriaAttributes_1 = AriaUtil.getUserDefinedAriaAttributes(ele); + if (domAriaAttributes_1.length === 0) { + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + var roleAttributes = []; + var pattern = ARIADefinitions_1.ARIADefinitions.designPatterns['generic']; + if (pattern.reqProps && pattern.reqProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(pattern.reqProps, roleAttributes); + if (tagProperty.globalAriaAttributesValid) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(ARIADefinitions_1.ARIADefinitions.globalProperties, roleAttributes); + if (pattern.deprecatedProps && pattern.deprecatedProps.length > 0) + CommonUtil_1.CommonUtil.reduceArrayItemList(pattern.deprecatedProps, roleAttributes); + // remove 'generic' role if roleAttributes doesn't contain any of domAriaAttributes + if (roleAttributes.length > 0 && !roleAttributes.some(function (attr) { return domAriaAttributes_1.includes(attr); })) { + var implicit = CommonUtil_1.CommonUtil.reduceArrayItemList(['generic'], tagProperty.implicitRole); + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", implicit); + return implicit; + } + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", tagProperty.implicitRole); + return tagProperty.implicitRole; + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + return implicitRoles; + }; + /** + * Returns the required properties of the role + * @parm {string} role - the role + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} properties - list of properties that are required by the role + * + * @memberOf AriaUtil + */ + AriaUtil.getRoleRequiredProperties = function (role, ele) { + if (role === null) { + return null; + } + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + var requiredAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqProps; + // handle special case of separator + if (role.toLowerCase() === "separator" && ele && CommonUtil_1.CommonUtil.isFocusable(ele)) { + requiredAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []); + } + return requiredAttributes; + } + else { + return null; + } + }; + /** + * This function is responsible for finding if a element has given role. + * This function aslo finds if element has given roles as implicit role. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - true or false based on if th element has the specified role. + * + * @memberOf AriaUtil + * + * Consider to use hasRoleInSemantics() instead. + */ + AriaUtil.hasRole = function (ele, role, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] === role; + } + } + } + //if none of the the attribute roles matched with given role + //check if implicit roles matches. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + var wRoles = []; + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, wRoles); + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] === role; + } + } + } + } + return retVal; + }; + /** + * Checks if the element has the role, including the implied role if role is not explicitly specified. + * + * This function is replacing the hasRole function + * + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * + * @return {List} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasRoleInSemantics = function (ele, role) { + var retVal = false; + var roleSpecified = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] === role; + } + } + } + if (roleSpecified) { + return retVal; + } + //check if implicit roles matches. + //Note: element can have multiple implicit roles + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) { + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] === role; + } + } + } + return retVal; + }; + /** + * This function is responsible for finding if a element has given role. + * This function also checks if element has given roles as implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {bool} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasAnyRole = function (ele, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + retVal = true; + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) + retVal = true; + } + return retVal; + }; + AriaUtil.isPresentationalElement = function (node) { + // Elements extracted from https://developer.mozilla.org/en/docs/Web/HTML/Element#Inline_text_semantics, + // http://dev.w3.org/html5/html-author/#text-level-semantics and https://wiki.whatwg.org/wiki/Presentational_elements_and_attributes + var presentationalElements = ["abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn", + "em", "i", "kbd", "mark", "q", "rp", "rt", "rtc", "ruby", "s", + "samp", "small", "span", "strong", "sub", "sup", "time", "u", + "var", "wbr", "a", "progress", "meter", "basefont", "big", "center", + "strike", "tt", "font", "blink", "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "blockquote", "p" + ]; + return CommonUtil_1.CommonUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements); + }; + /** + * return the ancestor of the given element and role. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (considerImplicitRoles) { + if (AriaUtil.hasRoleInSemantics(walkNode, roleName)) { + break; + } + } + else { + if (AriaUtil.hasRole(walkNode, roleName, false)) { + break; + } + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + /** + * return the ancestor of the given element and roles. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roles - the role names to search for + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRoles = function (element, roleNames) { + if (!element || !roleNames || !roleNames.length || roleNames.length === 0) + return null; + var walkNode = element; + while (walkNode !== null) { + var role = AriaUtil.getResolvedRole(walkNode); + if (role !== null && + (roleNames.includes(role) || + (roleNames.includes("*") && !["presentation", "none"].includes(role)))) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getRolesWithTypes = function (element, types) { + if (!element || !types || !types.length || types.length === 0) + return null; + var roles = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "roles_with_given_types", null); + if (!roles || roles.length === 0) { + roles = []; + Object.entries(ARIADefinitions_1.ARIADefinitions.designPatterns).forEach(function (_a) { + var key = _a[0], value = _a[1]; + if (types.includes(value.roleType)) + roles.push(key); + }); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "roles_with_given_types", roles); + } + return roles; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.isWidget = function (element) { + if (!element) + return false; + var widget = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "is_element_widget", null); + if (widget === null) { + var ret = false; + var role = AriaUtil.getResolvedRole(element); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') + ret = true; + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "is_element_widget", ret); + return ret; + } + return widget; + }; + /** + * return if the element is owned or controlled by another element. + * If an ancestor of an element is owned or controlled by another element, then the element is also considered as owned or controlled. + * an element can be owned or controlled by another element through aria-owns or aria-controls + * when the DOM hierarchy cannot be used to represent the relationship. + * aria-owns attribute is used to define contextual relationship with a owning parent + * aria-controls attribute is used to associate an element with the controlling element. + * example elements with roles: combobox, scrollbar, tab, button, listbox, menu, menubar, radiogroup, tree, treegrid + * + * when an element is owned or controlled by another element, its navigation may be controlled by the parent + * through aria-activedescendants attribute or roving tabindex + * + * Note navigation with native combobox (input with a datalist) is in native focus navigation, not considered here + * + * @parm {element} element - The element to inspect + * @return {boolean} + * + * @memberOf AriaUtil + */ + AriaUtil.isNavigationOwnedOrControlled = function (element) { + if (!element) + return false; + var ownerElems = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", null); + if (ownerElems !== null && ownerElems.length > 0) { + if (CommonUtil_1.CommonUtil.getAncestor(element, ownerElems)) + return true; + } + var role = AriaUtil.getResolvedRole(element); + if (!role) + return false; + var id = element.getAttribute("id"); + if (!id || id.trim().length === 0) + return false; + var elem = element.ownerDocument.querySelector("*[aria-controls~='".concat(id, "'], *[aria-owns~='").concat(id, "']")); + if (!elem) + return false; + var containers = ['combobox', 'scrollbar', 'button', 'tab', 'listbox', 'menu', 'menubar', 'radiogroup', 'tree', 'treegrid']; + if (containers.includes(role)) { + if (ownerElems === null) + ownerElems = []; + ownerElems.push(element); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", ownerElems); + return true; + } + return false; + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function by default will not consider Check Hidden Setting at all. + * + * Note: This is a wrapper function to: AriaUtil.getSiblingWithRoleHidden + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRole = function (element, role) { + return AriaUtil.getSiblingWithRoleHidden(element, role, false); + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function also considers implicit roles for the elements. + * + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicit - true or false based on if Implicit roles should be considered. + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRoleHidden = function (element, role, considerHiddenSetting, considerImplicitRole) { + // Variable Declaration + var walkNode = null; + var hasRole = false; + // Only perform the check if element and role are both provided + if (element && role) { + // Fetch the next sibling element + walkNode = element.nextSibling; + // Keep looping over the next siblings to find element which matches + // the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.nextSibling; + continue; + } + // Check if this node has the role that we need to check exists + if (considerImplicitRole) { + hasRole = AriaUtil.hasRoleInSemantics(walkNode, role); + } + else { + hasRole = AriaUtil.hasRole(walkNode, role, false); + } + // Move on to the next node + walkNode = walkNode.nextSibling; + } + // If we still have not found a node that matches the role, start a reverse look up + if (!walkNode) { + // Fetch the previous Sibling of this element + walkNode = element.previousSibling; + // Keep looping over all the previous siblings to search for an element which + // matches the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.previousSibling; + continue; + } + // Check if this node has the role that we need to check exists + hasRole = AriaUtil.hasRole(walkNode, role, considerImplicitRole); + // Move on to the next node + walkNode = walkNode.previousSibling; + } + } + } + return walkNode; + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getDescendantWithRoleHidden + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRole = function (element, roleName) { + return AriaUtil.getDescendantWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendant = null; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (considerImplicitRoles ? AriaUtil.hasRoleInSemantics(nw.node, roleName) : AriaUtil.hasRole(nw.node, roleName, false)) { + descendant = nw.node; + break; + } + } + return descendant; + }; + /** + * This function is responsible for getting All descendant elements with the specified roles, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string[]} roleNames - The roles to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - all descendant elements that match the roles specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoles = function (element, roleNames, considerHiddenSetting, considerImplicitRoles) { + if (!roleNames || roleNames.length === 0) + return; + // Variable Decleration + var descendants = []; + roleNames.forEach(function (roleName) { + var kids = AriaUtil.getAllDescendantsWithRoleHidden(element, roleName, considerHiddenSetting, considerImplicitRoles); + if (kids && kids.length > 0) + descendants = descendants.concat(kids); + }); + return descendants; + }; + /** + * This function is responsible for getting All descendant elements with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - The descendant elements that match the role specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendants = []; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + if (nw.bEndTag) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (AriaUtil.hasRole(nw.node, roleName, considerImplicitRoles)) { + descendants.push(nw.node); + } + } + return descendants; + }; + /** + * This function is responsible for getting All direct children in AT tree with a role (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree that has a role + * + * @memberOf AriaUtil + */ + AriaUtil.getDirectATChildren = function (element) { + var requiredChildRoles = AriaUtil.getRequiredChildRoles(element, true); + var direct = []; + AriaUtil.retrieveDirectATChildren(element, requiredChildRoles, direct); + return direct; + }; + /** + * This function is responsible for recursively any child path till either no child or a child with a role is found (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree + * + * @memberOf AriaUtil + */ + AriaUtil.retrieveDirectATChildren = function (element, requiredChildRoles, direct) { + var children = []; + if (element.children !== null && element.children.length > 0) { + for (var i = 0; i < element.children.length; i++) { + children.push(element.children[i]); + } + } + // if the element contains "aria-own" attribute, then the aria-owned children need to be included too + var owned = element.getAttribute("aria-owns"); + if (owned) { + var doc = element.ownerDocument; + if (doc) { + var ownedIds = owned.split(" "); + for (var i = 0; i < ownedIds.length; i++) { + var ownedElem = doc.getElementById(ownedIds[i]); + if (ownedElem) { + children.push(ownedElem); + } + } + } + } + if (children.length > 0) { + for (var i = 0; i < children.length; i++) { + //ignore hidden and invisible child + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(children[i]) || !VisUtil_1.VisUtil.isNodeVisible(children[i])) + continue; + var roles = AriaUtil.getRoles(children[i], false); + if (roles === null || roles.length === 0) { + roles = AriaUtil.getImplicitRole(children[i]); + } + if (roles && roles !== null && roles.length > 0) { + //remove 'none' and 'presentation' + roles = roles.filter(function (role) { + return role !== "none" && role !== "presentation"; + }); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (roles.includes("group") && requiredChildRoles && requiredChildRoles.includes('group')) { + roles = roles.filter(function (role) { + return role !== 'group'; + }); + } + } + if (roles && roles !== null && roles.length > 0) { + direct.push(children[i]); + } + else { + // recursive until get a return value, + AriaUtil.retrieveDirectATChildren(children[i], requiredChildRoles, direct); + } + } + return null; + } + else + return null; + }; + /** + * this function returns null or required child roles for a given element with one more roles, + * return null if the role is 'none' or 'presentation' + * @param element + * @param includeImplicit include implicit roles if no role is explicitly provided + * @returns + */ + AriaUtil.getRequiredChildRoles = function (element, includeImplicit) { + var roles = AriaUtil.getRoles(element, false); + // if explicit role doesn't exist, get the implicit one + if ((!roles || roles.length === 0) && includeImplicit) { + roles = AriaUtil.getImplicitRole(element); + } + /** + * ignore if the element doesn't have any explicit or implicit role + */ + if (!roles || roles.length === 0) { + return null; + } + /** + * ignore if the element contains none or presentation role + */ + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var requiredChildRoles = new Array(); + for (var j = 0; j < roles.length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].reqChildren !== null) { + requiredChildRoles = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(designPatterns[roles[j]].reqChildren, requiredChildRoles); + } + } + return requiredChildRoles; + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getAriaOwnsWithRoleHidden + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRole = function (element, roleName) { + return AriaUtil.getAriaOwnsWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. This function aslo finds elements with implicit roles. + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var referencedElement = null; + var referencedElemHasRole = false; + // In the case aria-owns is not on the element just break out of this function with null + if (CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-owns")) { + // Get the reference ID + var referenceID = element.getAttribute("aria-owns"); + // Get the element for the reference ID + referencedElement = fragment_1.FragmentUtil.getById(element, referenceID); + //ignore if the aria-owns point to the element itself + if (DOMUtil_1.DOMUtil.sameNode(element, referencedElement)) + return null; + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if (considerHiddenSetting && referencedElement != null && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(referencedElement)) { + referencedElemHasRole = null; + } + else { + referencedElemHasRole = AriaUtil.hasRole(referencedElement, roleName, considerImplicitRoles); + } + } + return referencedElemHasRole ? referencedElement : null; + }; + // Return true if the element has an ARIA label + AriaUtil.hasAriaLabel = function (element) { + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + return CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-label") || CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-labelledby"); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelID = elements[i].getAttribute("aria-labelledby"); + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = ""; + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + label = AriaUtil.getTextContentExcludingScripts(labelNode); + } + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + } + else { + // Has no label at all + hasDuplicateLabels = true; + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return !hasDuplicateLabels; + }; + /** + * Get text content from an element, excluding script and style elements + * This is a simplified version that doesn't go through full accessible name computation + * to avoid circular dependencies when called from getAriaLabel + * + * Note: When an element is referenced by aria-labelledby, its content is included + * even if the element is hidden (per ARIA spec) + */ + AriaUtil.getTextContentExcludingScripts = function (elem) { + if (!elem) + return ""; + var text = ""; + var nw = new DOMWalker_1.DOMWalker(elem); + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + var node = nw.node; + var nodeName = node.nodeName ? node.nodeName.toLowerCase() : ""; + // Skip script and style elements + if (nodeName === 'script' || nodeName === 'style') { + nw.bEndTag = true; // Skip children + continue; + } + if (node.nodeType === 3) { // Text node + // Include text even from hidden elements when referenced by aria-labelledby + if (node.nodeValue && node.nodeValue.trim().length > 0) { + text += " " + node.nodeValue.trim(); + } + } + else if (node.nodeType === 1) { // Element node + // Handle images - get alt text + if (nodeName === 'img' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children of img + } + // Handle input with type="image" - get alt text + else if (nodeName === 'input' && node.getAttribute('type') === 'image' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children + } + } + } + return text.trim(); + }; + AriaUtil.getAriaLabel = function (ele) { + if (ele.hasAttribute) { + if (ele.hasAttribute("aria-labelledby")) { + var labelIDs = ele.getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_1 = labelIDs.length; j < length_1; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + // Use our helper to get text content without circular dependency + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label); + } + } + return normalizedLabel.trim(); + } + else if (ele.hasAttribute("aria-label")) { + return CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("aria-label")).trim(); + } + } + return ""; + }; + AriaUtil.getAriaDescription = function (ele) { + if (!ele) + return ""; + var normalizedLabel = ""; + var desc = ele.getAttribute("aria-labelledby"); + if (desc && desc.trim().length > 0) { + var labelIDs = desc.trim().split(" "); + for (var j = 0, length_2 = labelIDs.length; j < length_2; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + if (label && label.trim().length > 0) + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + if (normalizedLabel.trim().length > 0) + return normalizedLabel.trim(); + } + desc = ele.getAttribute("aria-description"); + if (desc && desc.trim().length > 0) + return desc.trim().toLowerCase(); + return ""; + }; + AriaUtil.findAriaLabelDupes = function (elements) { + var dupeMap = {}; + elements.forEach(function (ele) { + dupeMap[AriaUtil.getAriaLabel(ele)] = (dupeMap[AriaUtil.getAriaLabel(ele)] || 0) + 1; + }); + return dupeMap; + }; + /** + * return accessible names for all AT visible landmark elements + * @param doc + * @returns + */ + AriaUtil.getLandmarkAccNames = function (doc) { + var nameMap = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_Landmark_AccNames", null); + if (nameMap && nameMap.length !== 0) + return nameMap; + nameMap = []; + var landmarkElems = doc.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]'); + if (landmarkElems.length === 0) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + } + landmarkElems.forEach(function (elem) { + // ignore node that is AT hidden or in a dialog that is considered as a separate location from the rest of the main page + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) && CommonUtil_1.CommonUtil.getAncestor(elem, ["DIALOG"]) === null && AriaUtil.getAncestorWithRole(elem, "dialog", true) === null) { + var name_1 = ""; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + name_1 = pair.name.trim(); + // check neested landmark to calculate the accessible name + var ancestors = __spreadArray([], landmarkElems, true).filter(function (e) { return e.contains(elem) && e !== elem; }); + if (ancestors.length > 1) { + ancestors.forEach(function (ancestor) { + var ancestor_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ancestor); + if (ancestor_pair && ancestor_pair.name && ancestor_pair.name.trim().length > 0) + name_1 = ancestor_pair.name.trim() + " " + name_1; + }); + } + var role = AriaUtil.getResolvedRole(elem); + nameMap.push({ "elem": elem, "role": role, "name": name_1 }); + } + }); + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + }; + /** + * check if the given element with the landmark rolw is unique + * @param element + * @param role: a specific landmark role, or "any" for all landmark role + * @param considerNoneLabel: if consider the landmarks without a label + * @returns + */ + AriaUtil.isLandmarkNameUnique = function (element, role, considerNoneLabel) { + if (considerNoneLabel === void 0) { considerNoneLabel = false; } + var nameMap = AriaUtil.getLandmarkAccNames(element.ownerDocument); + var exist = null; + if (role === 'any') + exist = nameMap.find(function (entry) { return entry.elem === element; }); + else + exist = nameMap.find(function (entry) { return entry.elem === element && entry.role === role; }); + if (!exist) + return null; + var name = exist.name; + if (!considerNoneLabel && name === '') + return null; + for (var i = 0; i < nameMap.length; i++) { + if (nameMap[i].elem === element) + continue; + if (name === nameMap[i].name) { + if (role === 'any') + return true; + else if (nameMap[i].role === role) + return true; + } + } + return false; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasUniqueAriaLabels = function (elements) { + return AriaUtil.hasUniqueAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasDuplicateAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + var duplicateLabelNameArray = new Array(); + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + if (!(ariaLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[ariaLabel] = new Array(); + } + duplicateLabelNameArray[ariaLabel].push(elements[i].nodeName.toLowerCase()); + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelIDs = elements[i].getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_3 = labelIDs.length; j < length_3; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + if (!(normalizedLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[normalizedLabel] = new Array(); + } + duplicateLabelNameArray[normalizedLabel].push(elements[i].nodeName.toLowerCase()); + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return duplicateLabelNameArray; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasDuplicateAriaLabels = function (elements) { + return AriaUtil.hasDuplicateAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique aria-labelledby attributes + AriaUtil.hasUniqueAriaLabelledby = function (elements) { + var hasDuplicateLabels = false; + var labelRefs = {}; + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute && elements[i].hasAttribute("aria-labelledby") && !CommonUtil_1.CommonUtil.isIdReferToSelf(elements[i], elements[i].getAttribute("aria-labelledby"))) { + var labelRef = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby")); + hasDuplicateLabels = labelRef in labelRefs; + labelRefs[labelRef] = true; + } + else { + hasDuplicateLabels = true; + } + } + return !hasDuplicateLabels; + }; + /** + * this function is responsible for resolving ARIA requirements for an HTML element per ARIA in HTML + * @param ruleContext the HTML element to be examined + * @returns + */ + AriaUtil.getElementAriaProperty = function (ruleContext) { + var tagProperty = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_ElementAriaProperty", null); + if (!tagProperty) { + var tagName = null; + var name_2 = null; + if (ruleContext.tagName) { + tagName = ruleContext.tagName.toLowerCase(); + } + else if (ruleContext.nodeName) { + tagName = ruleContext.nodeName.toLowerCase(); + } + // check if the tagProperty exists in the documentConformanceRequirement hash. + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirement[tagName]; + // The tag needs to check some special attributes + if (tagProperty === null || tagProperty === undefined) { + var specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags[tagName]; + switch (tagName) { // special cases + case "a": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "area": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "figure": { + var fcs = CommonUtil_1.CommonUtil.getChildByTag(ruleContext, "figcaption"); + fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"]; + break; + } + case "footer": + case "header": + if (AriaUtil.getAncestorWithRole(ruleContext, "article", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "complementary", true) !== null + || AriaUtil.getAncestorWithRole(ruleContext, "navigation", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "region", true) !== null + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["article", "aside", "main", "nav", "section"]) !== null) + tagProperty = specialTagProperties["des-section-article-aside-main-nav"]; + else + tagProperty = specialTagProperties["other"]; + break; + case "img": + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (AriaUtil.getAriaLabel(ruleContext).trim().length !== 0 || (alt !== null && alt.length > 0) || (title !== null && title.length > 0)) { + // If the img has non-empty alt (alt="some text" or alt=" ") or an accessible name is provided + tagProperty = specialTagProperties["img-with-accname"]; + } + else { + if (alt !== null) { + // If the img has an empty alt (alt="") + tagProperty = specialTagProperties["img-without-accname-empty-alt"]; + } + else { + // If the img lacks an alt attribute + tagProperty = specialTagProperties["img-without-accname-no-alt"]; + } + } + break; + case "input": + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "type")) { + var type = ruleContext.getAttribute("type").trim().toLowerCase(); + tagProperty = specialTagProperties[type]; + if (tagProperty === null || tagProperty === undefined) { + switch (type) { + case "checkbox": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"]; + break; + case "email": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"]; + break; + case "search": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"]; + break; + case "tel": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"]; + break; + case "text": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + break; + case "url": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"]; + break; + default: + // default + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["default-with-list"] : tagProperty = specialTagProperties["default-no-list"]; + break; + } + } + } + else { + // default type is the same as type=text + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + } + break; + case "li": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["li"]; + if (ruleContext.parentElement && AriaUtil.hasRoleInSemantics(ruleContext.parentElement, "list")) + tagProperty = specialTagProperties["child-of-list-role"]; + else + tagProperty = specialTagProperties["no-child-of-list-role"]; + break; + case "section": + //name = ARIAMapper.computeName(ruleContext); + //if (name && name.trim().length > 0) { + var label = AriaUtil.getAriaLabel(ruleContext); + if ((label && label.trim().length > 0) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + tagProperty = specialTagProperties["with-name"]; + } + else { + tagProperty = specialTagProperties["without-name"]; + } + break; + case "select": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"]; + if (ruleContext.hasAttribute("multiple") || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "size") && ruleContext.getAttribute("size") > 1) + tagProperty = specialTagProperties["multiple-attr-size-gt1"]; + else + tagProperty = specialTagProperties["no-multiple-attr-size-gt1"]; + break; + case "summary": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["summary"]; + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], ruleContext.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], ruleContext)) + tagProperty = specialTagProperties["first-summary-of-detail"]; + else + tagProperty = specialTagProperties["no-first-summary-of-detail"]; + break; + case "tbody": + case "td": + case "tr": + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + tagProperty = specialTagProperties["des-table"]; + } + else { + AriaUtil.getAncestorWithRole(ruleContext, "grid", true) || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"]; + } + break; + case "th": + var scope = CommonUtil_1.CommonUtil.getScopeForTh(ruleContext); + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-table-column-scope"]; + else + tagProperty = specialTagProperties["des-table-row-scope"]; + } + else if (AriaUtil.getAncestorWithRole(ruleContext, "grid", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-grid-treegrid-column-scope"]; + else + tagProperty = specialTagProperties["des-grid-treegrid-row-scope"]; + } + else + tagProperty = specialTagProperties["des-other"]; + break; + case "div": + var prt = ruleContext.parentElement; + prt !== null && prt.nodeName.toLowerCase() === 'dl' ? tagProperty = specialTagProperties["child-dl"] : tagProperty = specialTagProperties["no-child-dl"]; + break; + default: + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["default"]; + } //switch + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_ElementAriaProperty", tagProperty); + return tagProperty || null; + }; + AriaUtil.getAllowedAriaRoles = function (ruleContext, properties) { + var allowedRoles = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaRoles", null); + if (!allowedRoles) { + allowedRoles = []; + var tagProperty = null; + if (properties !== null && properties !== undefined) { + tagProperty = properties; + } + else { + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + } + if (tagProperty !== null && tagProperty !== undefined) { + if (tagProperty.implicitRole !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles); + } + if (tagProperty.validRoles !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + var implicitRoles = AriaUtil.getImplicitRole(ruleContext); + if (implicitRoles && implicitRoles.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaRoles", allowedRoles); + } + return allowedRoles; + }; + AriaUtil.getAllowedAriaAttributes = function (ruleContext, roles, properties) { + var allowedAttributes = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaAttributes", null); + if (!allowedAttributes) { + allowedAttributes = []; + var permittedRoles = __spreadArray([], roles, true); + var tagName = ruleContext.tagName.toLowerCase(); + var prohibitedAttributes = []; + // Element with a disabled attribute https://www.w3.org/TR/html5/disabled-elements.html + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(tagName) > -1) { + // Use the aria-disabled attribute on any element that is allowed the disabled attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-disabled", allowedAttributes); + } + // Element with a required attribute http://www.the-art-of-web.com/html/html5-form-validation/ + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedRequired.indexOf(tagName) > -1) { + // Use the aria-required attribute on any element that is allowed the required attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-required", allowedAttributes); + } + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedReadOnly.indexOf(tagName) > -1) { + // Use the aria-readonly attribute on any element that is allowed the readonly attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes); + } + var tagProperty = null; + if (properties != null && properties !== undefined) + tagProperty = properties; + else + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + if (tagProperty !== null && tagProperty !== undefined) { + // add the implicit role allowed attributes to the allowed role list if there is no specified role + // ignore if the element doesn't allow the attributes from the implicit roles + if (tagProperty.implicitRole !== null && + (permittedRoles === null || permittedRoles === undefined || permittedRoles.length === 0) + && tagProperty.allowAttributesFromImplicitRole === undefined) { + for (var i = 0; i < tagProperty.implicitRole.length; i++) { + var roleProperty = ARIADefinitions_1.ARIADefinitions.designPatterns[tagProperty.implicitRole[i]]; + if (roleProperty !== null && roleProperty !== undefined) { + var properties_1 = roleProperty.props; + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + properties_1 = AriaUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + var prohibitedProps = roleProperty.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case of separator + if (tagProperty.implicitRole[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuenow", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + } + // Adding the global properties to the valid attribute list + if (tagProperty.globalAriaAttributesValid) { + var properties_2 = ARIADefinitions_1.ARIADefinitions.globalProperties; // global properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_2, allowedAttributes); + } + } + // adding the other role to the allowed roles for the attributes + if (tagProperty && tagProperty.otherRolesForAttributes && tagProperty.otherRolesForAttributes.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.otherRolesForAttributes, permittedRoles); + // adding the specified role properties to the allowed attribute list + for (var i = 0; permittedRoles !== null && i < permittedRoles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[permittedRoles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + // ignore the properties if the element doesn't allow attributes from the implicit role + if (!tagProperty || tagProperty.implicitRole === null || !tagProperty.implicitRole.includes(permittedRoles[i]) || (tagProperty.implicitRole.includes(permittedRoles[i]) && tagProperty.allowAttributesFromImplicitRole === undefined)) { + var properties_3 = roleProperties.props; // allowed properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + properties_3 = AriaUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + } + var prohibitedProps = roleProperties.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case for separator + if (permittedRoles[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + // ignore aria-level, aria-setsize or aria-posinset if "row" is not in treegrid + if (permittedRoles.includes("row") && AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) == null) { + var index = -1; + if ((index = allowedAttributes.indexOf("aria-level")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-setsize")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-posinset")) > -1) + allowedAttributes.splice(index, 1); + } + // add the other allowed attributes for the element + if (tagProperty && tagProperty.otherAllowedAriaAttributes && tagProperty.otherAllowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var allowed = []; + for (var p = 0; p < tagProperty.otherAllowedAriaAttributes.length; p++) { + var attr = tagProperty.otherAllowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + allowed.push(pair[0]); + } + else + allowed.push(attr); + } + if (allowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(allowed, allowedAttributes); + } + // add the other prohibitted attributes for the element + if (tagProperty && tagProperty.otherDisallowedAriaAttributes && tagProperty.otherDisallowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var disallowed = []; + for (var p = 0; p < tagProperty.otherDisallowedAriaAttributes.length; p++) { + var attr = tagProperty.otherDisallowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + disallowed.push(pair[0]); + } + else + disallowed.push(attr); + } + if (disallowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(disallowed, prohibitedAttributes); + } + //exclude the prohibitedAttributes from the allowedAttributes + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(prohibitedAttributes, allowedAttributes); + //exclude aria attribute for elements without implicit role and with 'Naming Prohibited' + if ((!roles || roles.length === 0) && tagProperty.implicitRole === null && tagProperty.prohibitedAriaAttributesWhenNoImplicitRole) + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(tagProperty.prohibitedAriaAttributesWhenNoImplicitRole, allowedAttributes); + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaAttributes", allowedAttributes); + } + return allowedAttributes; + }; + /** + * + * @param ariaAttr + * @param htmlAttrs + * @type: conflict or overlapping + * @returns htmlAttrName, 'Pass' or null + * htmlAttrName that conflicts with the ariaAttr, + * 'Pass' with no conflict with the ariaAttr, + * or null where ariaAttr won't cause conflict + */ + AriaUtil.getConflictOrOverlappingHtmlAttribute = function (ariaAttr, htmlAttrs, type) { + var exist = ARIADefinitions_1.ARIADefinitions.relatedAriaHtmlAttributes[ariaAttr['name']]; + if (exist) { + if (!ariaAttr || ariaAttr.length == 0 || !htmlAttrs || htmlAttrs.length == 0) + return []; + var examinedHtmlAtrNames = []; + var concernTypes = null; + if (type === 'conflict') { + if (!exist.conflict || Object.keys(exist.conflict).length === 0) + return null; + concernTypes = exist.conflict; + } + else if (type === 'overlapping') { + if (!exist.overlapping || Object.keys(exist.overlapping).length === 0) + return null; + concernTypes = exist.overlapping; + } + else + return null; + var applicable = false; + var fail_1 = false; + for (var k = 0; k < concernTypes.length; k++) { + var concernAriaValue = concernTypes[k].ariaAttributeValue; + var concernHtmlNames = concernTypes[k].htmlAttributeNames; + var concernHtmlValues = concernTypes[k].htmlAttributeValues; + for (var i = 0; i < htmlAttrs.length; i++) { + var index = concernHtmlNames.indexOf(htmlAttrs[i]['name']); + if (index !== -1) { + applicable = true; + var htmlValuesInConcern = (concernHtmlValues === null || concernHtmlValues[index] === null) ? null : concernHtmlValues[index].split(","); + if (concernAriaValue === null) { + if (htmlValuesInConcern === null) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (htmlValuesInConcern === null) { + if (concernAriaValue === ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (concernAriaValue === 'VALUE' && htmlValuesInConcern.includes('VALUE') && htmlValuesInConcern[0] !== ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (concernAriaValue === ariaAttr['value'] && htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + } + } + if (applicable && !fail_1) + examinedHtmlAtrNames.push({ result: 'Pass', 'attr': '' }); + return examinedHtmlAtrNames; + } + else + return null; + }; + AriaUtil.containsPresentationalChildrenOnly = function (elem) { + var roles = AriaUtil.getRoles(elem, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil.getImplicitRole(elem); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return false; + for (var i = 0; roles !== null && i < roles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + var presentional = roleProperties.presentationalChildren; + if (presentional === true) + return true; + } + } + return false; + }; + AriaUtil.shouldBePresentationalChild = function (element) { + var walkNode = DOMWalker_1.DOMWalker.parentElement(element); + while (walkNode) { + if (AriaUtil.containsPresentationalChildrenOnly(walkNode)) + return true; + //aria-own case: if the element is referred by an aria-won + walkNode = ARIAMapper_1.ARIAMapper.getAriaOwnedBy(walkNode) || DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA +*/ + AriaUtil.areRolesDefined = function (roles) { + if (!roles || roles.length === 0) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) { + var role = roles_1[_i]; + if (!(role.toLowerCase() in designPatterns)) + return false; + } + return true; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA + */ + AriaUtil.getInvalidRoles = function (ruleContext) { + var domRoles = AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles && domRoles.includes('generic')) + return ["generic"]; + // Failing roles + var failRoleTokens = []; + // Passing roles + var passRoleTokens = []; + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + var allowedRoles = AriaUtil.getAllowedAriaRoles(ruleContext, tagProperty); + if (!allowedRoles || allowedRoles.length === 0) + return domRoles; + var invalidRoles = []; + if (allowedRoles.includes('any')) + return []; + for (var i = 0; i < domRoles.length; i++) + if (!allowedRoles.includes(domRoles[i]) && !invalidRoles.includes(domRoles[i])) + invalidRoles.push(domRoles[i]); + return invalidRoles; + }; + /* + * check if any explicit role specified for the element is not defined in ARIA + * return: list of specified roles not defined in ARIA + */ + AriaUtil.getRolesUndefinedByAria = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var undefinedRoles = []; + if (roles && roles.length > 0) { + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var i = 0; i < roles.length; i++) { + if (!(roles[i] in designPatterns)) { + undefinedRoles.push(roles[i]); + } + } + } + return undefinedRoles; + }; + /* + * this method first checks explicit roles, if no explicit role, it will check the implicit role + * return: null if any explicit role is invalid, + * a list of invalid attributes + * empty list if all attributes are valid, or no aria attributes are specified + */ + AriaUtil.getInvalidAriaAttributes = function (ruleContext) { + var roles = AriaUtil.getUserDefinedRoles(ruleContext); + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + // for mutiple roles, skip if any role is invalid + var defined = AriaUtil.areRolesDefined(roles); + if (defined !== null && !defined) + return null; + var attrs = []; + if (!roles || roles.length == 0) + roles = AriaUtil.getImplicitRole(ruleContext); + var aria_attrs = AriaUtil.getUserDefinedAriaAttributes(ruleContext); + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + // Attributes allowed on this node + var allowedAttributes = AriaUtil.getAllowedAriaAttributes(ruleContext, roles, tagProperty); + if (aria_attrs) { + for (var i = 0; i < aria_attrs.length; i++) { + var attrName = aria_attrs[i].trim().toLowerCase(); + if (!allowedAttributes.includes(attrName) && !attrs.includes(attrName)) + attrs.push(attrName); + } + } + return attrs; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + AriaUtil.getConflictAriaAndHtmlAttributes = function (elem) { + var ariaAttrs = AriaUtil.getUserDefinedAriaAttributeNameValuePairs(elem); + var htmlAttrs = AriaUtil.getUserDefinedHtmlAttributeNameValuePairs(elem); + var ret = []; + if (ariaAttrs && ariaAttrs.length > 0 && htmlAttrs && htmlAttrs.length > 0) { + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'conflict'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Failed') //failed + ret.push({ 'ariaAttr': ariaAttrs[i]['name'], 'htmlAttr': item['attr'] }); + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + } + return ret; + }; + /* + * get deprecated Aria roles + * return: a list of deprecated Aria roles + */ + AriaUtil.getDeprecatedAriaRoles = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var ret = []; + if (roles && roles.length > 0) { + var globalDeprecatedRoles = ARIADefinitions_1.ARIADefinitions.globalDeprecatedRoles; + for (var i = 0; i < roles.length; i++) { + if (globalDeprecatedRoles.includes(roles[i])) + ret.push(roles[i]); + } + } + return ret; + }; + /* + * get deprecated Aria role-attributes + * return: a list of deprecated Aria role-attributes paris + * for global the role is marked as 'any' + */ + AriaUtil.getDeprecatedAriaAttributes = function (element) { + if (!element) + return null; + var domAttributes = element.attributes; + var ariaAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push(attrName); + } + } + if (ariaAttrs.length === 0) + return []; + var ret = []; + var globalDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.globalDeprecatedProperties; + for (var i = 0; i < ariaAttrs.length; i++) { + if (globalDeprecatedAttributes.includes(ariaAttrs[i])) + ret.push({ "role": "any", "attribute": ariaAttrs[i] }); + } + var roles = AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) { + for (var i = 0; i < roles.length; i++) { + var roleWithDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleWithDeprecatedAttributes) { + var deprecatedAttriNames = roleWithDeprecatedAttributes['deprecatedProps']; + if (deprecatedAttriNames && deprecatedAttriNames.length > 0) { + for (var j = 0; j < ariaAttrs.length; j++) { + if (deprecatedAttriNames.includes(ariaAttrs[j])) + ret.push({ "role": roles[i], "attribute": ariaAttrs[j] }); + } + } + } + } + } + return ret; + }; + AriaUtil.isNodeInGrid = function (node) { + return AriaUtil.getAncestorWithRole(node, "grid") != null; + }; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + AriaUtil.navLinkKeywords = ['start', 'next', 'prev', 'previous', 'contents', 'index']; + // This list contains a list of rule ids for the rules that have to check for hidden content regardless of the Check Hidden + // Content Setting. This means that when the engine is actually determine which elements to mass to the rules, it will always + // pass theses rules no matter what the Check Hidden Content Setting is. + AriaUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId']; + // https://www.w3.org/TR/wai-aria-1.1/#introstates + AriaUtil.ariaAttributeRoleDefaults = { + "alert": { + "aria-live": "assertive", + "aria-atomic": "true" + }, + "combobox": { + "aria-haspopup": "listbox" + }, + "listbox": { + "aria-orientation": "vertical" + }, + "log": { + "aria-live": "polite" + }, + "menu": { + "aria-orientation": "vertical" + }, + "menubar": { + "aria-orientation": "horizontal" + }, + "meter": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "option": { + "aria-selected": "false" + }, + "progressbar": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "scrollbar": { + "aria-orientation": "vertical", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "separator": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "slider": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "spinbutton": { + // Not sure how to encode min/max (or now in 1.2 - "has no value") + //"aria-valuenow": "0" TODO: at risk: maybe delete after ARIA 1.2 reaches proposed rec + // Probably just delete spinbutton from this list completely and let user agents handle "defaults" + }, + "status": { + "aria-live": "polite", + "aria-atomic": "true" + }, + "tab": { + "aria-selected": "false" + }, + "tablist": { + "aria-orientation": "horizontal" + }, + "toolbar": { + "aria-orientation": "horizontal" + }, + "tree": { + "aria-orientation": "vertical" + } + }; + // https://www.w3.org/TR/wai-aria-1.1/#aria-atomic + AriaUtil.ariaAttributeGlobalDefaults = { + "aria-atomic": "false", + "aria-autocomplete": "none", + "aria-busy": "false", + "aria-checked": undefined, + "aria-current": "false", + "aria-disabled": "false", + "aria-dropeffect": "none", + "aria-expanded": undefined, + "aria-grabbed": undefined, + "aria-haspopup": "false", + "aria-hidden": undefined, + "aria-invalid": "false", + "aria-live": "off", + "aria-modal": "false", + "aria-multiline": "false", + "aria-multiselectable": "false", + "aria-orientation": undefined, + "aria-pressed": undefined, + "aria-readonly": "false", + //"aria-relevant": "additions text", TODO: are multiple values supported? + "aria-required": "false", + "aria-selected": undefined, + "aria-sort": "none" + }; + // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings + AriaUtil.ariaAttributeImplicitMappings = { + "aria-autocomplete": { + "form": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "input": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "select": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "textarea": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + } + }, + "aria-checked": { + "input": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "menuitem": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "*": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + }, + }, + "aria-disabled": { + "button": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "fieldset": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "input": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "optgroup": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "option": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "select": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "textarea": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + } + }, + "aria-expanded": { + "details": function (e) { + return e.getAttribute("open"); + }, + "dialog": function (e) { + return e.getAttribute("open"); + } + }, + "aria-multiselectable": { + "select": function (e) { + if (e.hasAttribute("multiple")) + return "true"; + return; + } + }, + "aria-placeholder": { + "input": function (e) { + return e.getAttribute("placeholder"); + }, + "textarea": function (e) { + return e.getAttribute("placeholder"); + } + }, + "aria-required": { + "input": function (e) { + return e.getAttribute("required"); + }, + "select": function (e) { + return e.getAttribute("required"); + }, + "textarea": function (e) { + return e.getAttribute("required"); + } + } + }; + return AriaUtil; +}()); +exports.AriaUtil = AriaUtil; + + +/***/ }, + +/***/ 4919 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CSSUtil = void 0; +var CacheUtil_1 = __webpack_require__(4566); +var CommonUtil_1 = __webpack_require__(7139); +var AriaUtil_1 = __webpack_require__(7011); +var DOMMapper_1 = __webpack_require__(7507); +var DOMWalker_1 = __webpack_require__(3864); +var CSSUtil = /** @class */ (function () { + function CSSUtil() { + } + CSSUtil.selectorMatchesElem = function (element, selector) { + // Early return for empty selector (before try-catch for performance) + if (!selector || selector.length === 0 || selector.trim() === "") + return false; + try { + // Modern standard method + if (typeof element.matches === "function") { + return element.matches(selector); + } + // Vendor-prefixed fallbacks (older browsers) + if (typeof element.webkitMatchesSelector === "function") { + return element.webkitMatchesSelector(selector); + } + if (typeof element.msMatchesSelector === "function") { + return element.msMatchesSelector(selector); + } + // Legacy method (deprecated but kept for compatibility) + if (typeof element.matchesSelector === "function") { + return element.matchesSelector(selector); + } + // Fallback: use querySelectorAll and check if element is in results + var doc = element.ownerDocument || element.document; + if (!doc) + return false; + var matches = doc.querySelectorAll(selector); + // Use Array.from for better performance with modern engines + return Array.from(matches).includes(element); + } + catch (err) { + // Bad selector? Doesn't match then... + return false; + } + }; + /** + * Returns the style computed for this element + * @param elem + */ + CSSUtil.getComputedStyle = function (elem, pseudoElt) { + if (!elem) + return null; + var doc = elem.ownerDocument; + var win = doc.defaultView; + return win.getComputedStyle(elem, pseudoElt); + }; + /** + * Parse and cache all stylesheet rules at the document level + * Returns an array of parsed rule objects with selector and style information + */ + CSSUtil.getParsedStylesheetRules = function (ownerDoc) { + // Check if we already have cached parsed rules for this document + var cachedRules = CacheUtil_1.CacheUtil.getCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", null); + if (cachedRules) { + return cachedRules; + } + var parsedRules = []; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < ownerDoc.styleSheets.length; ++ssIndex) { + var sheet = ownerDoc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var rule = sheet.cssRules[rIndex]; + var fullRuleSelector = rule.selectorText; + if (fullRuleSelector) { + var pseudoMatch = fullRuleSelector.match(/^(.*)(:[a-zA-Z-]*)$/); + var hasPseudoClass = !!pseudoMatch; + var selMain = hasPseudoClass ? pseudoMatch[1] : fullRuleSelector; + var selPseudo = hasPseudoClass ? pseudoMatch[2] : ""; + parsedRules.push({ + fullRuleSelector: fullRuleSelector, + hasPseudoClass: hasPseudoClass, + selMain: selMain, + selPseudo: selPseudo, + style: rule.style + }); + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the parsed rules at the document level + CacheUtil_1.CacheUtil.setCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", parsedRules); + return parsedRules; + }; + /** + * Private helper method to fill style maps from a CSSStyleDeclaration + * Handles CSS property priorities and the "all" shorthand property + */ + CSSUtil.fillStyle = function (maps, style) { + for (var sIndex = 0; sIndex < style.length; ++sIndex) { + if (style[sIndex] === "all" && style[style[sIndex]]) { + for (var _i = 0, maps_1 = maps; _i < maps_1.length; _i++) { + var map = maps_1[_i]; + for (var key in map) { + delete map[key]; + } + } + break; + } + else { + var key = style[sIndex]; + for (var _a = 0, maps_2 = maps; _a < maps_2.length; _a++) { + var map = maps_2[_a]; + var priority = style.getPropertyPriority(key); + if (key in map && map[key].endsWith("!important")) { + if (priority === "important" && + !map[key].startsWith("inherit") && + !map[key].startsWith("unset")) + map[key] = style[key] + " !important"; + else + continue; + } + else + map[key] = + style[key] + + (priority === "important" ? " !important" : ""); + } + } + } + }; + /** + * Private helper method that consolidates the logic for getting defined styles + * Used by both getDefinedStyles and getDefinedStylesMultiple + */ + CSSUtil.getDefinedStylesInternal = function (elem, props, pseudoClasses) { + var results = {}; + var definedStylesMap = {}; + var definedStylePseudoMap = {}; + // Initialize result objects for all pseudo-classes + for (var _i = 0, pseudoClasses_1 = pseudoClasses; _i < pseudoClasses_1.length; _i++) { + var pseudoClass = pseudoClasses_1[_i]; + definedStylesMap[pseudoClass] = {}; + definedStylePseudoMap[pseudoClass] = {}; + } + // Get pre-parsed stylesheet rules from cache + var parsedRules = CSSUtil.getParsedStylesheetRules(elem.ownerDocument); + // Check once if we need to handle :focus pseudo-class + var hasFocusPseudo = pseudoClasses.includes(":focus"); + var _loop_1 = function (parsedRule) { + if (props !== null && !props.some(function (prop) { return !!parsedRule.style[prop]; })) { + return "continue"; + } + var selPseudo = parsedRule.selPseudo; + var hasPseudoClass = parsedRule.hasPseudoClass; + // Handle :focus-within replacement once per rule if needed + var selMain = parsedRule.selMain; + if (hasFocusPseudo && selPseudo === ":focus") { + // If this element has focus, remove focus-within from parents + selMain = selMain.replace(/([ >][^+~ >]+):focus-within/g, "$1"); + } + // Cache selector matching result (only once per rule, not per pseudo-class) + var selectorMatches = CSSUtil.selectorMatchesElem(elem, selMain); + // Only process if selector matches + if (selectorMatches) { + // Process for each pseudo-class + for (var _c = 0, pseudoClasses_3 = pseudoClasses; _c < pseudoClasses_3.length; _c++) { + var pseudoClass = pseudoClasses_3[_c]; + // Cache map references to avoid repeated lookups + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Get styles of non-pseudo selectors + if (!hasPseudoClass) { + CSSUtil.fillStyle([styleMap, pseudoMap], parsedRule.style); + } + // Get styles for matching pseudo-class + if (selPseudo === pseudoClass) { + CSSUtil.fillStyle([pseudoMap], parsedRule.style); + } + } + } + }; + // Process each cached rule + for (var _a = 0, parsedRules_1 = parsedRules; _a < parsedRules_1.length; _a++) { + var parsedRule = parsedRules_1[_a]; + _loop_1(parsedRule); + } + // Handle element styles and build results in one pass + for (var _b = 0, pseudoClasses_2 = pseudoClasses; _b < pseudoClasses_2.length; _b++) { + var pseudoClass = pseudoClasses_2[_b]; + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Add element's inline styles + CSSUtil.fillStyle([styleMap, pseudoMap], elem.style); + // Build results + if (pseudoClass === "") { + results[pseudoClass] = styleMap; + } + else { + // For pseudo-classes, return only styles that differ from default + var diffStyles = {}; + var keys = Object.keys(pseudoMap); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (pseudoMap[key] !== styleMap[key]) { + diffStyles[key] = pseudoMap[key]; + } + } + results[pseudoClass] = diffStyles; + } + } + return results; + }; + /** + * Returns the style defined for this element for multiple pseudo-classes in a single pass + * + * This is more efficient than calling getDefinedStyles multiple times as it only + * iterates through stylesheets once. + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string[]} pseudoClasses - Array of pseudo-classes to retrieve. Use "" for default (no pseudo-class). + * @returns {Object} Object mapping each pseudo-class to its defined styles + */ + CSSUtil.getDefinedStylesMultiple = function (elem, props, pseudoClasses) { + if (!elem) + return null; + var results = {}; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + // Check cache first - see if we have all requested pseudo-classes cached + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + var missingPseudoClasses = []; + if (cachedStyles) { + // Check which pseudo-classes are already cached + for (var _i = 0, pseudoClasses_4 = pseudoClasses; _i < pseudoClasses_4.length; _i++) { + var pseudoClass = pseudoClasses_4[_i]; + if (cachedStyles[pseudoClass] !== undefined) { + results[pseudoClass] = cachedStyles[pseudoClass]; + } + else { + missingPseudoClasses.push(pseudoClass); + } + } + // If all are cached, return immediately + if (missingPseudoClasses.length === 0) { + return results; + } + } + else { + cachedStyles = {}; + missingPseudoClasses = pseudoClasses; + } + // Only process missing pseudo-classes using the internal helper + if (missingPseudoClasses.length > 0) { + var newResults = CSSUtil.getDefinedStylesInternal(elem, props, missingPseudoClasses); + // Merge new results with cached results + for (var _a = 0, missingPseudoClasses_1 = missingPseudoClasses; _a < missingPseudoClasses_1.length; _a++) { + var pseudoClass = missingPseudoClasses_1[_a]; + results[pseudoClass] = newResults[pseudoClass]; + cachedStyles[pseudoClass] = newResults[pseudoClass]; + } + // Update cache with all styles (existing + new) + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + } + return results; + }; + /** + * Returns the style defined for this element + * + * This differs from the computed style in that the computed style will return + * styles defined by the user agent. This will only return styles defined by the + * application + * if rotation transform is used, the computed style returns the resolved matrix + * while the defined style return the transform function(s) + * for example, for 'transform: rotate(2.5deg);', the computed style returns 'matrix(-0.0436194, 0.999048, -0.999048, -0.0436194, 0, 0)' + * and the defined style returns 'rotate(2.5deg)' + * + * change the type of the parameter pseudoClass from PseudoClass to string to include both pseudo classes (e.g., :focus, :checked) + * and pseudo elements (e.g., ::before, ::after). + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string} [pseudoClass] If specified, will return values that are different + * than when the pseudoClass does not match. + */ + CSSUtil.getDefinedStyles = function (elem, props, pseudoClass) { + if (!elem) + return null; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + var pseudoKey = pseudoClass || ""; + // Check cache first - use shared cache structure with getDefinedStylesMultiple + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + if (!cachedStyles) { + cachedStyles = {}; + } + if (cachedStyles[pseudoKey] !== undefined) { + return cachedStyles[pseudoKey]; + } + // Use the internal helper method with a single pseudo-class + var results = CSSUtil.getDefinedStylesInternal(elem, props, [pseudoKey]); + var result = results[pseudoKey]; + // Cache the result + cachedStyles[pseudoKey] = result; + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + return result; + }; + /** + * Returns the media query defined for the document + * Get media orientation transforms from stylesheets with caching + * Returns transform/rotate properties for elements within media queries + * + * @param {Document} doc + */ + CSSUtil.getMediaOrientationTransform = function (doc) { + // Check if we already have cached media orientation transforms for this document + var cachedTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MediaOrientationTransforms", null); + if (cachedTransforms) { + return cachedTransforms; + } + var orientationTransforms = {}; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < doc.styleSheets.length; ++ssIndex) { + var sheet = doc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var sheetRule = sheet.cssRules[rIndex]; + if (4 /* CSSRule.MEDIA_RULE */ === sheetRule.MEDIA_RULE) { + var rule = sheetRule; + if (rule && rule.media) { + var mediaList = rule.media; + for (var i = 0; i < mediaList.length; i++) { + if (!mediaList.item(i)) + continue; + var mediaKey = mediaList.item(i).toLocaleLowerCase(); + var elem_transforms = orientationTransforms[mediaKey]; + if (!elem_transforms) + elem_transforms = {}; + var styleRules = rule.cssRules; + for (var j = 0; j < styleRules.length; ++j) { + if (1 /* CSSRule.STYLE_RULE */ === styleRules[j].STYLE_RULE) { + var styleRule = styleRules[j]; + var selector = styleRule.selectorText; + if (selector) { + var transforms = {}; + var styles = styleRule.style; + for (var s = 0; s < styles.length; ++s) { + var key = styles[s]; + var keyLower = key.toLocaleLowerCase(); + if (keyLower === "transform") { + if (key === "all" && styles[key]) { + transforms = {}; + break; + } + else { + transforms[key] = styles[key]; + } + } + else if (keyLower === "rotate") { + transforms[key] = styles[key]; + } + } + if (Object.keys(transforms).length > 0) { + elem_transforms[selector] = transforms; + } + } + } + } + if (Object.keys(elem_transforms).length > 0) { + orientationTransforms[mediaKey] = elem_transforms; + } + } + } + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the media orientation transforms at the document level + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MediaOrientationTransforms", orientationTransforms); + return orientationTransforms; + }; + /** + * convert given rotation transform functions to the degree transformed. + * If multiple functions are given, then the functions are applied linearly in the order. + * rotation_transform function example: rotate(45deg), rotate(2turn), rotate(2rad), rotate3d(1, 1, 1, 45deg), + * rotate(2rad) rotate3d(1, 1, 1, 45deg) + * @param rotation_transform + */ + CSSUtil.getRotationDegree = function (rotation_transform) { + var degree = 0; + try { + if (!rotation_transform) + return degree; + // normalize the rotation_transform + rotation_transform = rotation_transform.replaceAll(", ", ","); + var transform_functions = rotation_transform.split(" "); + for (var i = 0; i < transform_functions.length; i++) { + var transform_function = transform_functions[i].trim(); + if (transform_function === "") + continue; + if (transform_function.startsWith("rotate3d")) { + // example: rotate3d(1, 1, 1, 45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = void 0; + if (matrix) + values = matrix.split(","); + if (values && values.length === 4) { + var rotation = values[3]; + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + } + else if (transform_function.startsWith("rotate") || + transform_function.startsWith("rotateZ")) { + // example: rotate(45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var rotation = transform_function.substring(left + 1, right); + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + else if (transform_function.startsWith("matrix3d")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[4], values[5]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + else if (transform_function.startsWith("matrix")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[1], values[0]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + } + while (degree >= 360) + degree -= 360; + } + catch (err) { + console.log("Cannot retrieve rotation degree: " + err); + throw err; + } + return degree; + }; + /** + * Convert CSS style string values to pixels. + * + * @param value style value in string, such as 3rem, 230px etc. + * @param target element. + * @return value in pixels + */ + CSSUtil.getPixelsFromStyle = function (value, elem) { + if (!value) + return 0; + var regex = /(-?[\d.]+)([a-z%]*)/; + var parsed = value.trim().match(regex); + if (parsed === null) + return 0; + if (parsed[2] === "" || parsed[1] === 0) + //no zero value without unit which is considered as error, so implicable + return 0; + var pixels = CSSUtil.convertValue2Pixels(parsed[2], parsed[1], elem); + return pixels === null ? pixels : parseFloat(pixels); + }; + /** + * Convert absolute CSS numerical values to pixels. + * + * @param unitValue in string + * @param target element. + * @return value in pixels + */ + CSSUtil.convertValue2Pixels = function (unit, unitValue, elem) { + if (unitValue === 0) + return 0; + if (!unit) + unit = "px"; + var supportedUnits = { + // absolute unit + px: function (value) { return value; }, + cm: function (value) { return value * 37.8; }, + mm: function (value) { return value * 3.78; }, + q: function (value) { return value * 0.95; }, + in: function (value) { return value * 96; }, + pc: function (value) { return value * 16; }, + pt: function (value) { return value * 1.33; }, + // relative unit + rem: function (value) { + return value * + parseFloat(getComputedStyle(elem.ownerDocument.documentElement).getPropertyValue("font-size")); + }, + em: function (value) { + return value * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + vw: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerWidth; + }, + vh: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerHeight; + }, + "%": function (value) { + return (value / 100) * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + }; + if (unit in supportedUnits) + return supportedUnits[unit](unitValue); + return null; + }; + /* + * Returns if the font for visible text of the element is defined by material icons + * + * @param {HTMLElement} elem + */ + CSSUtil.isMaterialIconFont = function (elem) { + // TODO: check the existence material icons using fetch in node 18+ + // for now (node 16) just dertermine if the stylesheet for the 'Material Icons' exists statically. note that the loading of the font stylesheet occurs at run time. + //list of known material icons and stylesheet link + var known_icons = { + "Material Icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + var known_css_classes = { + "material-icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + // material icon font can be defined either by font-family: 'Material Icons' or by class="material-icons" + var styles = CSSUtil.getDefinedStyles(elem, ["font-family"]); + var fontFamily = styles["font-family"]; + var found = false; + // font-family specifies a prioritized list of one or more font family names + if (fontFamily && + fontFamily.split(",")[0].replace(/['"]+/g, "").trim() in known_icons) + found = true; + if (!found) { + var list = elem.classList; + for (var css_class in known_css_classes) { + if (list.contains(css_class)) { + found = true; + break; + } + } + } + if (!found) + return false; + var passed = false; + // check if the stylesheet for the 'Material Icons' exists statically + var sheets = elem.ownerDocument.styleSheets; + for (var s = 0; s < sheets.length; s++) { + if (sheets && + sheets.length > 0 && + Object.values(known_icons).indexOf(sheets[s].href) > -1) { + passed = true; + break; + } + } + return passed; + }; + CSSUtil.getWeightNumber = function (styleVal) { + var map = { + light: 100, + bold: 700, + }; + var retVal = parseInt(styleVal); + if (retVal) + return retVal; + if (styleVal in map) + return map[styleVal]; + return 400; + }; + CSSUtil.getFontInPixels = function (styleVal, elem) { + var map = { + "xx-small": 16, + "x-small": 10, + small: 13, + medium: 16, + large: 18, + "x-large": 24, + "xx-large": 32, + }; + var value = parseFloat(styleVal); + if (!value) { + return map[styleVal]; + } + var units = styleVal.substring(("" + value).length); + /** + if (units === "" || units === "px") return value; + if (units === "em") return value * 16; + if (units === "%") return value / 100 * 16; + if (units === "pt") return value * 4 / 3; + return Math.round(value); + */ + return CSSUtil.convertValue2Pixels(units, value, elem); + }; + CSSUtil.getCSSStyle = function (element) { + var styleText = ""; + if (element === null) + return []; + if (element.IBM_CSS_THB) + return element.IBM_CSS_THB; + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === "style") { + styleText = element.innerText; + if (styleText === undefined || styleText.trim() === "") + styleText = element.textContent; + } + else if (element.hasAttribute("style")) { + styleText = element.getAttribute("style"); + } + else + return []; + if (styleText === null || styleText.trim().length === 0) + return []; + //remove comment blocks + var re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g; + var subst = " "; + styleText = styleText.replace(re, subst); + // Find all "key : val;" pairs with various whitespace inbetween + var rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g; + // Find all "selector { csskeyvals } with various whitespace inbetween + var rSelectors = /\s*([^{]*){([^}]*)}/g; + if (styleText.indexOf("{") === -1) { + var keyVals = {}; + var m = void 0; + while ((m = rKeyVals.exec(styleText)) != null) { + keyVals[m[1]] = m[2].trim().toLowerCase(); + } + var retVal = [ + { + selector: null, + values: keyVals, + }, + ]; + element.IBM_CSS_THB = retVal; + return retVal; + } + else { + var retVal = []; + var m = void 0; + var m2 = void 0; + while ((m = rSelectors.exec(styleText)) != null) { + var keyVals = {}; + var selKey = m[1]; + var selVal = m[2]; + while ((m2 = rKeyVals.exec(selVal)) != null) { + keyVals[m2[1]] = m2[2].trim().toLowerCase(); + } + retVal.push({ + selector: selKey, + values: keyVals, + }); + } + element.IBM_CSS_THB = retVal; + return retVal; + } + }; + /** + * an "inline" CSS display property tells the element to fit itself on the same line. An 'inline' element's width and height are ignored. + * some element has default inline property, such as <span>, <a> + * most formatting elements inherent inline property, such as <em>, <strong>, <i>, <small> + * other inline elements: <abbr> <acronym> <b> <bdo> <big> <br> <cite> <code> <dfn> <em> <i> <input> <kbd> <label> + * <map> <object> <output> <q> <samp> <script> <select> <small> <span> <strong> <sub> <sup> <textarea> <time> <tt> <var> + * an "inline-block" element still place element in the same line without breaking the line, but the element's width and height are applied. + * inline-block elements: img, button, select, meter, progress, marguee, also in Chrome: textarea, input + * A block-level element always starts on a new line, and the browsers automatically add some space (a margin) before and after the element. + * block-level elements: <address> <article> <aside> <blockquote> <canvas> <dd> <div> <dl> <dt> <fieldset> <figcaption> <figure> <footer> <form> + * <h1>-<h6> <header> <hr> <li> <main> <nav> <noscript> <ol> <p> <pre> <section> <table> <tfoot> <ul> <video> + * + * return: if it's inline element and { inline: true | false, text: true | false, violation: null | {node} } + */ + CSSUtil.getInlineStatus = function (element) { + if (!element) + return null; + var elem_styl = getComputedStyle(element); + if (!elem_styl) + return null; + var status = { inline: false, text: false, violation: null }; + var udisplay = elem_styl.getPropertyValue("display"); + // inline element only + if (udisplay !== "inline") + return status; + status.inline = true; + var parent = element.parentElement; + if (!parent) + return status; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(element); + var style = getComputedStyle(parent); + var display = style.getPropertyValue("display"); + // an inline element is inside a block. note <body> is a block element too + if (display !== "block" && display !== "inline-block") { + //parent is inline element + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(parent)) + status.text = true; + return status; + } + /** + * @returns "yes"": inline with text, "no": inline without text, + * "violation": not spacing enough to neiboring inline target + * "block": block element, + */ + function isInlineWithText(node, before) { + // note browsers insert Text nodes to represent whitespaces. + if (node.nodeType === Node.TEXT_NODE) { + if (node.nodeValue && node.nodeValue.trim().length > 0) + return "yes"; + else + return "no"; + } + else if (node.nodeType === Node.ELEMENT_NODE) { + // special case: <br> is styled 'inline' by default, but change the line + if (node.nodeName.toLowerCase() === "br") + return "block"; + var cStyle = getComputedStyle(node); + var cDisplay = cStyle.getPropertyValue("display"); + if (cDisplay === "inline") { + if (CommonUtil_1.CommonUtil.isTarget(node)) { + if (bounds.width < 24) { + // check if the horizontal spacing is sufficient + var bnds = mapper.getUnadjustedBounds(node); + if ((before && (Math.round(bounds.width / 2) + bounds.left - bnds.left < 24)) + || (!before && (Math.round(bounds.width / 2) + bounds.left - (bnds.left + bnds.width) < 24))) { + status.violation = node.nodeName.toLowerCase(); + return "violation"; + } + else + return "no"; + } + } + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(node)) + return "yes"; + return "no"; + } + else + return "block"; + } + else + return "block"; + } + // an inline element is inside a block. note <body> is a block element too + // one or more inline elements with text in the same line: <target>, text<target>, <target>text, <inline>+text<target>, <target><inline>+text, text<target><inline>+ + var walkNode = element.nextSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, true); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.nextSibling; + } + walkNode = element.previousSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, false); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.previousSibling; + } + return status; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * a target is a browser default if it's a native widget (no user defined role) without user style + */ + CSSUtil.isTargetBrowserDefault = function (element) { + if (!element) + return false; + // user defined widget + var roles = AriaUtil_1.AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) + return false; + // no user style to space control size, including use of font + var styles = CSSUtil.getDefinedStyles(element, [ + "line-height", "height", "width", "min-height", "min-width", + "font-size", "margin-top", "margin-bottom", "margin-left", "margin-right" + ]); + if (styles["line-height"] || + styles["height"] || + styles["width"] || + styles["min-height"] || + styles["min-width"] || + styles["font-size"] || + styles["margin-top"] || + styles["margin-bottom"] || + styles["margin-left"] || + styles["margin-right"]) + return false; + return true; + }; + /* + * string contains CJK (chinese, japaneses, or korea) + * return: boolean + */ + CSSUtil.containsCKJ = function (text) { + if (!text) + return false; + // https://en.wikipedia.org/wiki/CJK_Unified_Ideographs https://ayaka.shn.hk/hanregex/ + var regex = /(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g; + var replaced = text.trim().replace(regex, ""); + if (replaced.length === text.trim().length) + return false; + return true; + }; + /** + * Return the ancestor with the given style properties. + * Searches up the DOM tree to find an ancestor that has ALL specified style properties + * with values matching the criteria. + * + * @param {element} elem - The element to start the node walk on to find parent node + * @param {Object} styleProps - The style properties and values of the parent to search for. + * such as {"overflow":['auto', 'scroll'], "overflow-x":['auto', 'scroll']} + * or {"overflow":['*'], "overflow-x":['*']}, The '*' for any value to check the existence of the style prop. + * @param {Array} excludedValues - style values that should be ignored. + * @return {Element|null} - An ancestor element that has all the specified style properties, or null if none found + * @memberOf CSSUtil + */ + CSSUtil.getAncestorWithStyles = function (elem, styleProps, excludedValues) { + if (excludedValues === void 0) { excludedValues = []; } + // Create a cache key that includes the style properties being searched for + var cacheKey = "AriaUtil_AncestorWithStyles_" + JSON.stringify(styleProps) + "_" + JSON.stringify(excludedValues); + // Check if we already have a cached result for this specific query + var cachedResult = CacheUtil_1.CacheUtil.getCache(elem, cacheKey, null); + if (cachedResult !== null) { + return cachedResult === "NOT_FOUND" ? null : cachedResult; + } + // Start with the element itself (not just parent) to maintain backward compatibility + var walkNode = elem; + while (walkNode !== null) { + // Skip if not an HTMLElement (e.g., SVGElement) + // Use nodeType check instead of instanceof to work across different document contexts + if (walkNode.nodeType !== 1 || walkNode.namespaceURI === "http://www.w3.org/2000/svg") { + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + continue; + } + var styles = CSSUtil.getDefinedStyles(walkNode, Object.keys(styleProps)); + // Check if ANY specified style property matches the criteria (OR logic) + for (var styleProp in styleProps) { + var value = styles[styleProp]; + if (!value) { + // Property not defined on this element, try next property + continue; + } + // Remove !important suffix for comparison + value = value.split(" ")[0]; + // Check if value should be excluded + if (excludedValues.includes(value)) { + continue; + } + // Check if value matches the criteria + var acceptedValues = styleProps[styleProp]; + if (acceptedValues.includes('*')) { + // Any value is acceptable (just checking existence) + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + else if (acceptedValues.includes(value)) { + // Value matches one of the accepted values + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + } + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + // No matching element or ancestor found - cache this result to avoid re-searching + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, "NOT_FOUND"); + return null; + }; + /** + * return an array [value, Unit] from a value-unit combo string + * @param valueUnitCombo, such as 20px, 2rem + * @returns + */ + CSSUtil.getValueUnitPair = function (valueUnitCombo) { + if (!valueUnitCombo) + return null; + if (Number.isInteger(valueUnitCombo)) + return ["px", valueUnitCombo]; + var value = parseInt(valueUnitCombo); + if (isNaN(value)) + return null; + valueUnitCombo = valueUnitCombo.trim().toLowerCase(); + var match = valueUnitCombo.trim().match(/([a-z]+)$/); + var unit = 'px'; + if (match) + unit = match[1]; + return [unit, value]; + }; + return CSSUtil; +}()); +exports.CSSUtil = CSSUtil; + + +/***/ }, + +/***/ 4566 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CacheUtil = void 0; +var DOMUtil_1 = __webpack_require__(1686); +var DOMWalker_1 = __webpack_require__(3864); +var CacheUtil = /** @class */ (function () { + function CacheUtil() { + } + /* Return a pointer to the given global variable + * with its initial value as given */ + CacheUtil.getCache = function (cacheSpot, keyName, initValue) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined) { + cacheObj.aceCache[keyName] = initValue; + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.setCache = function (cacheSpot, globalName, value) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + cacheObj.aceCache[globalName] = value; + return value; + }; + CacheUtil.getSetCache = function (cacheSpot, keyName, initFunc) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined || typeof cacheObj.aceCache[keyName] === "undefined") { + cacheObj.aceCache[keyName] = initFunc(); + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.clearCaches = function (cacheRoot) { + var _a; + var numNodesVisited = 0; + delete cacheRoot.ownerDocument.aceCache; + var nw = new DOMWalker_1.DOMWalker(cacheRoot, false, cacheRoot, true); + do { + ++numNodesVisited; + delete nw.node.aceCache; + nw.node.ownerDocument && delete nw.node.ownerDocument.aceCache; + } while (nw.nextNode()); + if (cacheRoot !== ((_a = cacheRoot.ownerDocument) === null || _a === void 0 ? void 0 : _a.documentElement)) { + // Start the walker at the documentElement of cacheRoot's immediate document. + // ownerDocument is guaranteed non-null here because the if-guard above + // checks cacheRoot.ownerDocument?.documentElement. + var nwDoc = new DOMWalker_1.DOMWalker(cacheRoot.ownerDocument.documentElement, false, undefined, true); + // cacheRoot may be inside a shadow root or an iframe, which are themselves + // nested inside ancestor documents. Walk up from cacheRoot across any + // frame/shadow boundaries (DOMWalker.parentElement handles ownerElement + // links set by the walker) to find the outermost ancestor element, then + // reposition the walker there so the second pass covers every containing + // document as well. + { + var tempElem = nwDoc.node; + var parentElem = void 0; + while (parentElem = DOMWalker_1.DOMWalker.parentElement(tempElem)) { + tempElem = parentElem; + } + nwDoc.node = tempElem; + } + do { + // On the start-tag visit of cacheRoot, skip its entire subtree — + // it was already cleared and counted in the first pass above. + // Setting bEndTag=true makes the next nextNode() call emit cacheRoot's + // end-tag and then advance to its next sibling without descending into + // its children. + if (!nwDoc.bEndTag && DOMUtil_1.DOMUtil.sameNode(cacheRoot, nwDoc.node)) { + nwDoc.bEndTag = true; + continue; + } + delete nwDoc.node.aceCache; + nwDoc.node.ownerDocument && delete nwDoc.node.ownerDocument.aceCache; + } while (nwDoc.nextNode()); + } + return numNodesVisited; + }; + return CacheUtil; +}()); +exports.CacheUtil = CacheUtil; + + +/***/ }, + +/***/ 167 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ClipPathUtil = void 0; +var CacheUtil_1 = __webpack_require__(4566); +var CSSUtil_1 = __webpack_require__(4919); +var ClipPathUtil = /** @class */ (function () { + function ClipPathUtil() { + } + /** + * This function is responsible for checking if the node that is visually hidden by css clip-path: + * + * Note 1: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note 2: nodes with CSS properties clip-path, the content is not considered hidden to an AT. Text hidden with these methods + * can still be reedable by screen readers. + * Note 3: if a link, form control, or other focusable element is given this style, the element would be focusable but not visible, + * keyboard users might be confused. + * + * @parm {Node} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + ClipPathUtil.isNodeVisuallyHiddenByClipPath = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", undefined); + if (hidden !== undefined) + return hidden; + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + var path = style['clip-path']; + if (!path || path.trim() === 'none' || path.trim() === '') { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + path = path.trim().replace(/\s+/g, ' ').toLowerCase(); + var index = path.indexOf("inset("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + // When one value is specified, it applies the same inset to all four sides + if (numbers.length === 1) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[0], numbers[0], numbers[0]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When two values are specified, the first value applies to the top and bottom, the second to the left and right. + if (numbers.length === 2) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[0], numbers[1]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When three values are specified, the first applies to the top, the second to the right and left, the third to the bottom. + if (numbers.length === 3) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[1], numbers[2]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When four values are specified, the values apply to the top, right, bottom, and left in that order (clockwise). + if (numbers.length === 4) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[2], numbers[3]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + } + index = path.indexOf("rect("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + /** + * The first (top) and third (bottom) values are distances from the top edge of the containing block, + * and the second (right) and fourth (left) values are distances from the left edge of the containing block. + * The second (right) and third (bottom) values are clamped by the fourth (left) and first (top) values, respectively, + * + * If auto is used for the first (top) or fourth (left) value, the value of auto is 0, + * and if used for the second (right) or third (bottom) value, the value of auto is 100%. + */ + if (numbers[0] === 'auto') + numbers[0] = '0px'; + if (numbers[3] === 'auto') + numbers[3] = '0px'; + if (numbers[1] === 'auto') + numbers[1] = '100%'; + if (numbers[2] === 'auto') + numbers[2] = '100%'; + // to prevent the bottom edge from crossing over the top edge and right edge from crossing over the left edge. + // for example, rect(10px 0 0 20px) is clamped to rect(10px 20px 10px 20px) + numbers[2] = Math.max(numbers[0], numbers[2]); + numbers[1] = Math.max(numbers[1], numbers[3]); + var top_1 = parseInt(numbers[0]); + if (isNaN(top_1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + top_1 = top_1 * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + top_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (top_1 >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var left = parseInt(numbers[3]); + if (isNaN(left)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + left = left * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + left = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (left >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var right = parseInt(numbers[1]); + if (isNaN(right)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + right = right * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + right = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + var bottom = parseInt(numbers[2]); + if (isNaN(bottom)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + bottom = bottom * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + bottom = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if ((bottom - top_1) <= ClipPathUtil.THRESHOLD || (right - left) <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("xywh("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + var x = parseInt(numbers[0]); + if (isNaN(x)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + x = x * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + x = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (x >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var y = parseInt(numbers[1]); + if (isNaN(y)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + y = y * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(y); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + scrollY = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (y >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var w = parseInt(numbers[2]); + if (isNaN(w)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + w = w * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(w); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + w = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (w <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + var h = parseInt(numbers[3]); + if (isNaN(h)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + h = h * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(h); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + h = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (h <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("circle("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + var radius = parseInt(numbers[0]); + if (isNaN(radius)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) { + var short = width > height ? height : width; + radius = radius * short / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("ellipse("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + // ellipse(closest-side farthest-side at 30% 40%); + if (numbers.length > 3 && numbers[0] === 'closest-side' && numbers[1] === 'farthest-side' && numbers[2] === 'at') { + var radius = parseInt(numbers[3]); + if (numbers.length === 4) { + if (numbers[3].endsWith("%")) { + var value = width > height ? height : width; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + else if (numbers.length === 5) { + for (var i = 3; i < numbers.length; i++) { + var radius_1 = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 3) ? width : height; + radius_1 = radius_1 * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius_1 <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + // ellipse(40% 50% at left); + var at_index = path.indexOf("at"); + str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (at_index !== -1) + str = path.substring(path.indexOf("(") + 1, at_index); + numbers = str.trim().split(" "); + if (numbers.length !== 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + for (var i = 0; i < numbers.length; i++) { + var radius = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 0) ? width : height; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("polygon("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(","); + // polygon(nonzero|evenodd, 0% 0%, 50% 50%, 0% 100%) + if (numbers[0] === 'nonzero' || numbers[0] === 'evenodd') + numbers.shift(); + var y = 0; + var x = 0; + var changed_x = false; + var changed_y = false; + for (var i = 0; i < numbers.length; i++) { + var coordinates = numbers[i].trim().split(" "); + if (coordinates.length != 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var coordinate_xy = [0, 0]; + for (var i_1 = 0; i_1 < 2; i_1++) { + var value = parseInt(coordinates[i_1]); + if (isNaN(value)) + return false; + if (coordinates[i_1].endsWith("%")) + coordinate_xy[i_1] = (i_1 === 0) ? value * width / 100 : value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(coordinates[i_1]); + if (!pair) + return false; + coordinate_xy[i_1] = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + } + if (i === 0) { + x = coordinate_xy[0]; + y = coordinate_xy[1]; + } + if (Math.abs(coordinate_xy[0] - x) >= ClipPathUtil.THRESHOLD) + changed_x = true; + if (Math.abs(coordinate_xy[1] - y) >= ClipPathUtil.THRESHOLD) + changed_y = true; + } + if (changed_x && changed_y) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + }; + ClipPathUtil.isClippedByInset = function (elem, top, right, bottom, left) { + if (right === void 0) { right = '0px'; } + if (bottom === void 0) { bottom = '0px'; } + if (left === void 0) { left = '0px'; } + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + // top + var top_value = parseInt(top); + if (isNaN(top_value)) + return false; + if (top.endsWith("%")) + top_value = top_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) + return false; + top_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (top_value > height) + return false; + // right + var right_value = parseInt(right); + if (isNaN(right_value)) + return false; + if (right.endsWith("%")) + right_value = right_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) + return false; + right_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (right_value > width) + return false; + // bottom + var bottom_value = parseInt(bottom); + if (isNaN(bottom_value)) + return false; + if (bottom.endsWith("%")) + bottom_value = bottom_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) + return false; + bottom_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (bottom_value > height) + return false; + // left + var left_value = parseInt(left); + if (isNaN(left_value)) + return false; + if (left.endsWith("%")) + left_value = left_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) + return false; + left_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (left_value > width) + return false; + if (height - (top_value + bottom_value) <= ClipPathUtil.THRESHOLD || width - (right_value + left_value) <= ClipPathUtil.THRESHOLD) + return true; + return false; + }; + ClipPathUtil.THRESHOLD = 5; // 5px + return ClipPathUtil; +}()); +exports.ClipPathUtil = ClipPathUtil; + + +/***/ }, + +/***/ 3883 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ColorObj = exports.ColorUtil = void 0; +var DOMWalker_1 = __webpack_require__(3864); +var ColorUtil = /** @class */ (function () { + function ColorUtil() { + } + // Rewrite the color object to account for alpha + ColorUtil.Color = function (cssStyleColor) { + if (!cssStyleColor) + return null; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor === "transparent") + return new ColorObj(255, 255, 255, 0); + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3]); + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3], m[4]); + } + } + else if (cssStyleColor.charAt(0) != "#") { + return null; + } + else { + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + var thisRed = parseInt(cssStyleColor.substring(1, 3), 16); + var thisGreen = parseInt(cssStyleColor.substring(3, 5), 16); + var thisBlue = parseInt(cssStyleColor.substring(5, 7), 16); + return new ColorObj(thisRed, thisGreen, thisBlue); + } + // return null; // Unreachable + }; + ; + ColorUtil.ColorCombo = function (ruleContext) { + try { + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + var ancestors = []; + var walkNode = ruleContext; + while (walkNode) { + if (walkNode.nodeType === 1) + ancestors.push(walkNode); + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + var retVal = { + "hasGradient": false, + "hasBGImage": false, + "textShadow": false, + "fg": null, + "bg": null + }; + // start + var cStyle = win.getComputedStyle(ruleContext); + var compStyleColor = cStyle.color; + if (!compStyleColor) + compStyleColor = "black"; + var fg = ColorUtil.Color(compStyleColor); + var reColor = /transparent|rgba?\([^)]+\)/gi; + var guessGradColor = function (gradList, bgColor, fgColor) { + try { + // If there's only one color, return that + if (typeof gradList.length === "undefined") + return gradList; + var overallWorst = null; + var overallWorstRatio = null; + for (var iGrad = 1; iGrad < gradList.length; ++iGrad) { + var worstColor = gradList[iGrad - 1]; + var worstRatio = fgColor.contrastRatio(gradList[iGrad - 1]); + var step = .1; + var idx = 0; + while (step > .0001) { + while (idx + step <= 1 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx + step; + } + while (idx - step >= 0 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx - step; + } + step = step / 10; + } + if (overallWorstRatio === null || overallWorstRatio > worstRatio) { + overallWorstRatio = worstRatio; + overallWorst = worstColor; + } + } + return overallWorst; // return the darkest color + } + catch (e) { + console.log(e); + } + return bgColor; + }; + var priorStackBG = ColorUtil.Color("white"); + var thisStackOpacity = null; + var thisStackAlpha = null; + var thisStackBG = null; + // Ancestors processed from the topmost parent toward the child + while (ancestors.length > 0) { + var procNext = ancestors.pop(); + //var procNext = ancestors.splice(0, 1)[0]; + // cStyle is the computed style of this layer + var cStyle = win.getComputedStyle(procNext); + if (cStyle === null) + continue; + // thisBgColor is the color of this layer or null if the layer is transparent + var thisBgColor = null; + if (cStyle.backgroundColor && cStyle.backgroundColor != "transparent" && cStyle.backgroundColor != "rgba(0, 0, 0, 0)") { + thisBgColor = ColorUtil.Color(cStyle.backgroundColor); + } + // If there is a gradient involved, set thisBgColor to the worst color combination available against the foreground + if (cStyle.backgroundImage && cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + var gradColors = cStyle.backgroundImage.match(reColor); + if (gradColors) { + var gradColorComp = []; + for (var i = 0; i < gradColors.length; ++i) { + if (!gradColors[i].length) { + gradColors.splice(i--, 1); + } + else { + var colorComp = ColorUtil.Color(gradColors[i]); + if (colorComp.alpha !== undefined && colorComp.alpha < 1) { + // mix the grdient bg color wit parent bg if alpha < 1 + var compStackBg = thisStackBG || priorStackBG; + colorComp = colorComp.getOverlayColor(compStackBg); + } + gradColorComp.push(colorComp); + } + } + thisBgColor = guessGradColor(gradColorComp, thisStackBG || priorStackBG, fg); + } + } + // Handle non-solid opacity + if (thisStackOpacity === null || (cStyle.opacity && cStyle.opacity.length > 0 && parseFloat(cStyle.opacity) < 1)) { + // New stack, reset + if (thisStackBG != null) { + // Overlay + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + thisStackOpacity = 1.0; + thisStackAlpha = null; + thisStackBG = null; + if (cStyle.opacity && cStyle.opacity.length > 0) { + thisStackOpacity = parseFloat(cStyle.opacity); + } + if (thisBgColor != null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0) { + retVal.hasBGImage = false; + retVal.hasGradient = false; + } + } + } + // Handle solid color backgrounds and gradient color backgrounds + else if (thisBgColor != null) { + // If this stack already has a background color, blend it + if (thisStackBG === null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + } + else { + thisStackBG = thisBgColor.getOverlayColor(thisStackBG); + //thisStackAlpha = thisBgColor.alpha || 1.0; + thisStackAlpha = thisStackBG.alpha || 1.0; + } + // #526: If thisBgColor had an alpha value, it may not expose through thisStackBG in the above code + // We can't wipe out the gradient info if this layer was transparent + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0 && (thisStackBG.alpha || 1.0) === 1.0 && (thisBgColor.alpha || 1.0) === 0) // removed by dead control flow +{} + } + if (cStyle.backgroundImage && cStyle.backgroundImage != "none") { + if (cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + retVal.hasGradient = true; + } + else { + retVal.hasBGImage = true; + } + } + } + if (thisStackBG != null) { + fg = fg.getOverlayColor(thisStackBG); + delete fg.alpha; + } + fg.alpha = (fg.alpha || 1) * thisStackOpacity; + fg = fg.getOverlayColor(priorStackBG); + if (thisStackBG != null) { + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + retVal.fg = fg; + retVal.bg = priorStackBG; + if (cStyle.textShadow && cStyle.textShadow !== 'none') + retVal.textShadow = true; + return retVal; + } + catch (err) { + // something happened, then... + return null; + } + }; + ; + ColorUtil.CSSColorLookup = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", + "buttontext": "rgba(0, 0, 0, 0.847)", + "buttonface": "#ffffff", + "graytext": "rgba(0, 0, 0, 0.247)" + }; + return ColorUtil; +}()); +exports.ColorUtil = ColorUtil; +var ColorObj = /** @class */ (function () { + function ColorObj(red, green, blue, alpha) { + function fixComponent(comp) { + if (typeof (comp) != typeof ("")) + return comp; + var compStr = comp; + compStr = compStr.trim(); + if (compStr[compStr.length - 1] != "%") + return parseInt(compStr); + return Math.round(parseFloat(compStr.substring(0, compStr.length - 1)) * 2.55); + } + this.red = fixComponent(red); + this.green = fixComponent(green); + this.blue = fixComponent(blue); + if (typeof (alpha) != "undefined") { + this.alpha = (typeof (alpha) === typeof ("")) ? parseFloat(alpha) : alpha; + } + } + ColorObj.prototype.toHexHelp = function (value) { + var retVal = Math.round(value).toString(16); + if (retVal.length === 1) + return "0" + retVal; + return retVal; + }; + ; + ColorObj.prototype.toHex = function () { + return "#" + this.toHexHelp(this.red) + this.toHexHelp(this.green) + this.toHexHelp(this.blue); + }; + ; + ColorObj.prototype.contrastRatio = function (bgColor) { + var fgColor = this; + if (typeof (this.alpha) != "undefined") + fgColor = this.getOverlayColor(bgColor); + var lum1 = fgColor.relativeLuminance(); + if (!bgColor.relativeLuminance) { + var s = ""; + for (var key in bgColor) { + s += key + "\n"; + } + alert(bgColor); + alert(s); + } + var lum2 = bgColor.relativeLuminance(); + var ratio = (lum1 > lum2) ? (lum1 + .05) / (lum2 + .05) : (lum2 + .05) / (lum1 + .05); + return ratio; + }; + ; + ColorObj.prototype.relativeLuminance = function () { + var R = this.red / 255.0; + var G = this.green / 255.0; + var B = this.blue / 255.0; + R = R <= .04045 ? R / 12.92 : Math.pow((R + .055) / 1.055, 2.4); + G = G <= .04045 ? G / 12.92 : Math.pow((G + .055) / 1.055, 2.4); + B = B <= .04045 ? B / 12.92 : Math.pow((B + .055) / 1.055, 2.4); + return 0.2126 * R + 0.7152 * G + 0.0722 * B; + }; + ; + ColorObj.prototype.mix = function (color2, percThis) { + if (typeof (this.alpha) === "undefined" && typeof (color2.alpha) === "undefined") { + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue); + } + else { + var alphaThis = this.alpha ? this.alpha : 1; + var alphaOther = color2.alpha ? color2.alpha : 1; + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue, percThis * alphaThis + (1 - percThis) * alphaOther); + } + }; + ; + ColorObj.prototype.getOverlayColor = function (bgColor) { + if (typeof (this.alpha) === "undefined" || this.alpha >= 1) { + // No mixing required - it's opaque + return this; + } + if (this.alpha < 0) { + // Haac.Error.logError("Invalid alpha value"); + return null; + } + if (typeof (bgColor.alpha) != "undefined" && bgColor.alpha < 1) { + // Haac.Error.logError("Cannot mix with a background alpha"); + return null; + } + var retVal = this.mix(bgColor, this.alpha); + delete retVal.alpha; + return retVal; + }; + ColorObj.fromCSSColor = function (cssStyleColor) { + var thisRed = -1; + var thisGreen = -1; + var thisBlue = -1; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else { + if (cssStyleColor.charAt(0) != "#") { + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + else + return null; + } + var fromHex = function (val) { + var lookup = { + "a": 10, + "b": 11, + "c": 12, + "d": 13, + "e": 14, + "f": 15 + }; + var retVal = 0; + for (var i = 0; i < val.length; ++i) { + retVal = retVal * 16 + + parseInt(val.charAt(i) in lookup ? lookup[val.charAt(i)] : val.charAt(i)); + } + return retVal; + }; + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + thisRed = fromHex(cssStyleColor.substring(1, 3)); + thisGreen = fromHex(cssStyleColor.substring(3, 5)); + thisBlue = fromHex(cssStyleColor.substring(5, 7)); + } + return new ColorObj(thisRed, thisGreen, thisBlue); + }; + return ColorObj; +}()); +exports.ColorObj = ColorObj; + + +/***/ }, + +/***/ 7139 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(9910); +var CacheUtil_1 = __webpack_require__(4566); +var AriaUtil_1 = __webpack_require__(7011); +var AccNameUtil_1 = __webpack_require__(1950); +var VisUtil_1 = __webpack_require__(3946); +var DOMUtil_1 = __webpack_require__(1686); +var DOMWalker_1 = __webpack_require__(3864); +var fragment_1 = __webpack_require__(5279); +var CommonUtil = /** @class */ (function () { + function CommonUtil() { + } + CommonUtil.wordCount = function (str) { + str = str.trim(); + if (str.length === 0) + return 0; + return str.split(/\s+/g).length; + }; + /** + * Note that this only detects if the element itself is in the tab order. + * However, this element may delegate focus to another element via aria-activedescendant. + * Also, focus varies by browser... sticking to things that are focusable on Chrome and Firefox. + */ + CommonUtil.isTabbable = function (element) { + // Using https://allyjs.io/data-tables/focusable.html + // Handle the explicit cases first + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + if (element.hasAttribute("inert") || DOMUtil_1.DOMUtil.getAncestorWithAttribute(element, "inert", "")) + return false; + if (element.hasAttribute("tabindex")) { + return parseInt(element.getAttribute("tabindex")) >= 0; + } + // Explicit cases handled - now the implicit + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + var ce = element.getAttribute("contenteditable"); + if (ce === "true" || ce === "") + return true; + return false; + } + }; + /** + * Test if the ele node is focusable + */ + CommonUtil.isFocusable = function (ele) { + if (ele === "undefined" || ele === null) { + return false; + } + return CommonUtil.isTabbable(ele); + }; + /** + * Note that this only detects if the element itself is interactive, but not onclick event. + */ + CommonUtil.isClickable = function (element) { + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + // native focusable element + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + //custom widget + if (AriaUtil_1.AriaUtil.isWidget(element) && element.hasAttribute("tabindex")) { + return true; + } + } + return false; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + CommonUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + CommonUtil.tabIndexLEZero = function (elem) { + if (CommonUtil.hasAttribute(elem, "tabindex")) { + if (elem.getAttribute("tabindex").match(/^-?\d+$/)) { + var tabindexValue = parseInt(elem.getAttribute("tabindex")); + return tabindexValue === 0 || tabindexValue === -1; + } + } + return false; + }; + /** + * get number of tabbable children + * @param element + */ + CommonUtil.getTabbableChildren = function (element) { + var count = 0; + // If node has children, look for tab stops in the children + if (element.firstChild || element.nodeName.toUpperCase() === "IFRAME") { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode() && nw.node != element) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + return count; + }; + CommonUtil.normalizeSpacing = function (s) { + if (!s) + return ''; + return s.trim().replace(/\s+/g, ' '); + }; + ; + //TODO: function does not handle equivalents for roles: row, link, header, button + // But it may not have to. Bug reports have been about radio buttons and checkboxes. + CommonUtil.isHtmlEquiv = function (node, htmlEquiv) { + var retVal = false; + if (node) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = node.getAttribute("type").toLowerCase(); + if (type) { + if (htmlEquiv.indexOf("checkbox") != -1) { + retVal = type === "checkbox"; + } + else if (htmlEquiv.indexOf("radio") != -1) { + retVal = type === "radio"; + } + } + } + } + return retVal; + }; + CommonUtil.nonExistantIDs = function (node, targetids) { + var returnnotfoundids = ''; + if (CommonUtil.normalizeSpacing(targetids).length < 1) + return returnnotfoundids; + var targetArray = targetids.split(" "); + var doc = node.ownerDocument; + for (var i = 0; i < targetArray.length; i++) { + var xp = "//*[@id='" + targetArray[i] + "']"; + var xpathResult = doc.evaluate(xp, node, doc.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + if (!r) + returnnotfoundids += targetArray[i] + ', '; + } + if (CommonUtil.normalizeSpacing(returnnotfoundids).length >= 2) + returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2); + else + returnnotfoundids = ''; + return returnnotfoundids; + }; + CommonUtil.getDocElementsByTag = function (elem, tagName) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + tagName = tagName.toLowerCase(); + var cache = CacheUtil_1.CacheUtil.getCache(doc, "RPT_DOCELEMSBYTAG", {}); + if (!(tagName in cache)) { + cache[tagName] = doc.querySelectorAll(tagName); + CacheUtil_1.CacheUtil.setCache(doc, "RPT_DOCELEMSBYTAG", cache); + } + return cache[tagName]; + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * Note: This is a wrapper function to: AriaUtil.getChildByTagHidden + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTag = function (parentElem, tagName) { + return CommonUtil.getChildByTagHidden(parentElem, tagName, false, false); + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTagHidden = function (parentElem, tagName, ignoreHidden, considerHiddenSetting) { + // Variable Decleration + var retVal = []; + var child = parentElem.firstChild; + // Loop over all the child elements of the parent to build a list of all the elements that + // match the tagName provided + while (child != null) { + // Only include the children into the return array if they match with tagname. + if (child.nodeName.toLowerCase() === tagName) { + // In the case that ignorehidden was set to true, then perform a isNodeVisible check + // and in the case the node is not visilble we more to theses then move to the next node. + // Perform a couple of checks to determine if hidden elements should be ignored or not. + // 1. When ignoreHidden is set to true upfront, then perform a isNodeVisible + // 2. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2.1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if ((ignoreHidden || (considerHiddenSetting && !CommonUtil.shouldCheckHiddenContent(child))) && !VisUtil_1.VisUtil.isNodeVisible(child)) { + // Move on to the next element + child = child.nextSibling; + continue; + } + // Push the element + retVal.push(child); + } + // Move to the next sibling element + child = child.nextSibling; + } + return retVal; + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function by defauly will not consider Check Hidden Setting at all. + * This function by defauly will not consider implicit roles. + * Note: This is a wrapper function to: AriaUtil.getElementsByRoleHidden + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRole = function (doc, roles) { + return CommonUtil.getElementsByRoleHidden(doc, roles, false, false); + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function aslo finds elements with implicit roles. + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRoleHidden = function (doc, roles, considerHiddenSetting, considerImplicitRoles) { + // In the case that the role to element assoication is already made, and available in the global hasAttribute + // we can just use that one instead of building a new one. + var roleToElems = null; + if (considerImplicitRoles) { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", null); + } + else { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", null); + } + // Build the new role to element, this is where we loop through all the elements and extract all the + // elements bsaed on roles. + if (roleToElems === null) { + // Re-initialize the roleToElems hash + roleToElems = {}; + // Get the body of the doc + var root = doc.body; + // Keep looping until we are at the very parent node of the entire page, so that we can loop through + // all the nodes. + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + // Build a nodewalter based of the root node, this node walter will be use loop over all the nodes + // and build the roles to Element coralation + var nw = new DOMWalker_1.DOMWalker(root); + // Loop over the entire doc/list of nodes to build the role to element map + // Note: This will build an roleToElems hash which is in the following format. + // roleToElems = { + // document: [{div},{abbr},{var}], + // main: [{div}], + // navigation: [{div}] + // } + while (nw.nextNode()) { + if (!nw.elem()) + continue; + // Only check the elements which have the role attribute assiciated to them + if (!nw.bEndTag) { + var wRoles = []; + //check if the node has role attributes + if (nw.elem() && nw.elem().hasAttribute("role")) { + // Extract all the roles that are assigned to this element, can have multiple roles on one + // element split by space, so we need to extract all of them into an array. + wRoles = nw.elem().getAttribute("role").split(" "); + } + if (nw.elem() && wRoles.length === 0 && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil_1.AriaUtil.getImplicitRole(nw.node); + if (implicitRole !== null && implicitRole.length > 0) + wRoles = implicitRole; + } + if (wRoles.length === 0) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Loop through all the roles and assigned this node to all thes roles + for (var i = 0; i < wRoles.length; ++i) { + // In the case that the role key is not already in the roleToElems hash, construct the + // add the key and assign empty array. + if (!(wRoles[i] in roleToElems)) { + roleToElems[wRoles[i]] = []; + } + // Add the node to the array for the role + roleToElems[wRoles[i]].push(nw.node); + } + } + } + // Set the roleToElems hash map as a global variable + if (considerImplicitRoles) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems); + } + else { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", roleToElems); + } + } + // Initilize the return value + var retVal = []; + // Handle the cases where the provided role is a string and not an array, + // for this case we take the string and put it into an array + if (typeof (roles) === "string") { + var role = roles; + roles = []; + roles.push(role); + } + // Loop through the roles that were provided and find the list of elements for this roles + // and add them to the return value. + if (roles.length) { + // loop over all the roles + for (var i = 0; i < roles.length; ++i) { + // Extract the role from the array + var nextRole = roles[i]; + // Fetch the list of all the elements for this role + var copyRoles = roleToElems[nextRole]; + // If there are elements to copy to another array, then perform the copy + if (copyRoles) { + // Loop over all the elements which are to be copied + for (var j = 0; j < copyRoles.length; ++j) { + // Add this element to the return val + retVal.push(copyRoles[j]); + } + } + } + } + return retVal; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * + */ + CommonUtil.isTarget = function (element) { + if (!element || element.nodeType !== 1 + || ["html", "body"].includes(element.nodeName.toLowerCase()) + || CommonUtil.getAncestor(element, ["svg", "pre", "code", "script", "meta", 'head']) !== null + || !VisUtil_1.VisUtil.isNodeVisible(element) || VisUtil_1.VisUtil.isNodeVisuallyHidden(element) + || CommonUtil.isNodeDisabled(element) || VisUtil_1.VisUtil.isElementOffscreen(element)) + return false; + if (CommonUtil.isClickable(element)) + return true; + var role = AriaUtil_1.AriaUtil.getResolvedRole(element); + if (!role) + return false; + var target_roles = ["listitem", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "treeitem"]; + if (target_roles.includes(role)) { + // find the proper parent elements + var parent_1 = element.parentElement; + if (parent_1) { + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + // datalist, fieldset, optgroup, etc. may be just used for grouping purpose, so go up to the parent + if (parent_role === 'group') + parent_1 = parent_1.parentElement; + } + if (parent_1 && CommonUtil.isTarget(parent_1)) + return true; + } + return false; + }; + CommonUtil.getFileExt = function (url) { + var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/); + if (m != null && m.length >= 2) { + return "." + m[1]; + } + return ""; + }; + CommonUtil.getFileAnchor = function (url) { + var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/); + if (m != null && m.length >= 2) { + return m[1]; + } + return ""; + }; + CommonUtil.checkObjEmbed = function (node, extTest, mimeTest) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName != "object" && nodeName != "embed" && + nodeName != "a" && nodeName != "area") + return false; + var retVal = false; + // Check mime type + if (!retVal && node.hasAttribute("type")) { + var mime = node.getAttribute("type").toLowerCase(); + retVal = mimeTest(mime); + } + if (!retVal && node.hasAttribute("codetype")) { + var mime = node.getAttribute("codetype"); + retVal = mimeTest(mime); + } + // Check the filename + if (!retVal) { + var filename = ""; + if (nodeName === "embed") { + filename = node.getAttribute("src"); + } + else if (nodeName === "a" || nodeName === "area") { + filename = node.getAttribute("href"); + } + else if (node.hasAttribute("data")) { + filename = node.getAttribute("data"); + } + if (filename === null) + filename = ""; + var ext = CommonUtil.getFileExt(filename); + retVal = extTest(ext); + } + // Check for filenames in the params + if (!retVal && nodeName === "object") { + // In the case that Check Hidden Option is set then comply with that setting + var params = CommonUtil.getChildByTagHidden(node, "param", false, true); + for (var i = 0; !retVal && params != null && i < params.length; ++i) { + retVal = params[i].hasAttribute("value") && + extTest(CommonUtil.getFileExt(params[i].getAttribute("value"))); + } + } + return retVal; + }; + CommonUtil.isAudioObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isAudioExt, function (mime) { + return mime.startsWith("audio"); + }); + }; + CommonUtil.isAudioExt = function (ext) { + var audio_extensions = [".aif", ".aifc", ".aiff", ".air", ".asf", ".au", ".cda", + ".dsm", ".dss", ".dwd", ".iff", ".kar", ".m1a", ".med", + ".mp2", ".mp3", ".mpa", ".pcm", ".ra", ".ram", ".rm", + ".sam", ".sf", ".sf2", ".smp", ".snd", ".svx", ".ul", + ".voc", ".wav", ".wma", ".wve" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), audio_extensions); + }; + CommonUtil.isVideoObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isVideoExt, function (mime) { + return mime.startsWith("video") || + mime.startsWith("application/x-shockwave-flash"); + }); + }; + CommonUtil.isVideoExt = function (ext) { + var video_extensions = [".asf", ".avi", ".divx", ".dv", ".m1v", ".m2p", ".m2v", ".moov", + ".mov", ".mp4", ".mpeg", ".mpg", ".mpv", ".ogm", ".omf", ".qt", + ".rm", ".rv", ".smi", ".smil", ".swf", ".vob", ".wmv", ".rmvb", + ".mvb" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), video_extensions); + }; + CommonUtil.isImageObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isImgExt, function (mime) { + return mime.startsWith("image"); + }); + }; + CommonUtil.isImgExt = function (ext) { + return CommonUtil.valInArray(ext.toLowerCase(), CommonUtil.image_extensions); + }; + CommonUtil.isHtmlExt = function (ext) { + var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), html_extensions); + }; + CommonUtil.hasTriggered = function (doc, id) { + return CacheUtil_1.CacheUtil.getCache(doc, id, false); + }; + CommonUtil.triggerOnce = function (doc, id, passed) { + if (passed) + return true; + var triggered = CacheUtil_1.CacheUtil.getCache(doc, id, false); + CacheUtil_1.CacheUtil.setCache(doc, id, true); + return triggered; + }; + /* determine if the given value exists in the given array */ + CommonUtil.valInArray = function (value, arr) { + for (var idx in arr) { + if (arr[idx] === value) + return true; + } + return false; + }; + /** + * return the ancestor of the given element + * @param tagNames string, array, or dictionary containing the tags to search for + */ + CommonUtil.getAncestor = function (element, tagNames) { + var walkNode = element; + while (walkNode !== null) { + var thisTag = walkNode.nodeName.toLowerCase(); + if (typeof (tagNames) === "string") { + if (thisTag === tagNames.toLowerCase()) { + break; + } + } + else if (tagNames.length) { + for (var idx in tagNames) { + if (tagNames[idx] === thisTag) + return walkNode; + } + } + else if (thisTag in tagNames) { + break; + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + // return true if element1 and element2 are siblings + CommonUtil.isSibling = function (element1, element2) { + if (element1 && element2) { + var node = null; + if (DOMWalker_1.DOMWalker.parentNode(element1) && DOMWalker_1.DOMWalker.parentNode(element1).firstChild) { + node = DOMWalker_1.DOMWalker.parentNode(element1).firstChild; + } + while (node) { + if (node === element2) + return true; + node = node.nextSibling; + } + } + return false; + }; + CommonUtil.isDescendant = function (parent, child) { + var node = DOMWalker_1.DOMWalker.parentNode(child); + while (node != null) { + if (node === parent) { + return true; + } + node = DOMWalker_1.DOMWalker.parentNode(node); + } + return false; + }; + //check if the first form control child is disabled + CommonUtil.isDisabledByFirstChildFormElement = function (element) { + var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + if (formElements.includes(nw.node.nodeName.toLowerCase())) { + if (CommonUtil.isNodeDisabled(nw.node)) + return true; + return false; + } + } + } + return false; + }; + CommonUtil.isDisabledByReferringElement = function (element) { + var id = element.getAttribute("id"); + var doc = element.ownerDocument; + var root = doc.body; + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + var nw = new DOMWalker_1.DOMWalker(root); + while (nw.nextNode()) { + // check the element whose 'aria-describedby' equals to the id + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var AriaDescribedbyIDArray = (nw.elem().getAttribute("aria-describedby") || "").split(" "); + if (AriaDescribedbyIDArray.includes(id) && CommonUtil.isNodeDisabled(nw.node)) { + return true; + } + } + } + }; + /** get element containing label for the given element + * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead + */ + CommonUtil.getInputLabel = function (element) { + return CommonUtil.getLabelForElement(element); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * Note: This is a wrapper function to: AriaUtil.getLabelForElementHidden + * + * @parm {element} element - The element for which to get the label element for. + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElement = function (element) { + return CommonUtil.getLabelForElementHidden(element, false); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * This function will return null if the containing lable element is hidden, when the ignoreHidden option + * is set to true. + * + * @parm {element} element - The element for which to get the label element for. + * @parm {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElementHidden = function (element, ignoreHidden) { + // Check if the global AriaUtil_LABELS hash is available, as this will contain the label nodes based on + // for attribute. + //if (!getCache(element.ownerDocument,"AriaUtil_LABELS", null)) { + var root = element.getRootNode(); + if (!CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", null)) { + // Variable Decleration + var idToLabel = {}; + // Get all the label elements in the entire doc + var labelNodes = CommonUtil.getDocElementsByTag(element, "label"); + // Loop over all the label nodes, in the case the label node has a for attribute, + // extract that attribute and add this node to the hash if it is visible. + for (var i = 0; i < labelNodes.length; ++i) { + if (labelNodes[i].hasAttribute("for")) { + // If ignore hidden is specified and the node is not visible we do not add it to the + // labelNodes hash. + if (ignoreHidden && !VisUtil_1.VisUtil.isNodeVisible(labelNodes[i])) { + continue; + } + idToLabel[labelNodes[i].getAttribute("for")] = labelNodes[i]; + } + } + // Add the built hash to the ownerDocument (document), to be used later to fast retrival + //setCache(element.ownerDocument, "AriaUtil_LABELS", idToLabel); + CacheUtil_1.CacheUtil.setCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", idToLabel); + } + // If this element has an id attribute, get the corosponding label element + if (element.hasAttribute("id")) { + // Fetch the id attribute + var ctrlId = element.getAttribute("id"); + // Return the corosponding label element. + // Note: in the case that the the id is not found in the hash that means, it does not exists or is hidden + if (ctrlId.trim().length > 0) { + //return getCache(element.getRootNode().ownerDocument,"AriaUtil_LABELS",{})[ctrlId]; + return CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", {})[ctrlId]; + } + } + return null; + }; + /* Return specified element attribute if present else return null */ + CommonUtil.getElementAttribute = function (element, attr) { + //return (element && element.hasAttribute && element.hasAttribute(attr)) ? element.getAttribute(attr) : null; + if (!attr || !element || !element.hasAttribute || !element.hasAttribute(attr)) + return null; + var atrValue = element.getAttribute(attr); + if (!ARIADefinitions_1.ARIADefinitions.referenceProperties.includes(attr)) + return atrValue; + //attr is a reference to other elements(s) + var values = atrValue.split(/ +/g); + //ignore if none of the referred element(s) exist or all point to the element itself + var exist = false; + for (var id = 0; values < values.length; ++id) { + var referred = document.getElementById(values[id]); + if (referred && !DOMUtil_1.DOMUtil.sameNode(referred, element)) { + exist = true; + break; + } + } + return exist ? atrValue : null; + }; + // Return true if element has valid implicit label + CommonUtil.hasImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + return CommonUtil.hasInnerContentHidden(parentClone); + } + else { + return false; + } + }; + // Return the implicit label of the given form field + CommonUtil.getImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + var label = CommonUtil.getInnerText(parentClone); + return label && label.trim() !== '' ? label.trim() : null; + } + else + return null; + }; + /** + * This function is responsible for getting the label for a form field element. + * + * + * @parm {element} element - The element from which to get the label. + * + * @return {string} text - return the label text or null + * + * @memberOf AriaUtil + */ + CommonUtil.getFormFieldLabel = function (elem) { + // get the label from the attribute "for" of the label element + // Get only the non-hidden labels for element + var value = ""; + var label = null; + var labelElem = CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + // value directly from element text + label = labelElem.innerText; // ignore hidden text + } + else { + /** if it's not label with for attribute, then find implicit label + * cases for explict label: + * <label for='my'></label><input id='my'/> + * <label for='my'><input id='my'/></label> + * cases for implicit label: + * <label><input /></label> + */ + labelElem = CommonUtil.getAncestor(elem, "label"); + if (labelElem && labelElem.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(labelElem, elem)) { + var parentClone = labelElem.cloneNode(true); + // exclude all the text from the first form element since they might also + // have inner content that is part of innerText + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + label = CommonUtil.getInnerText(parentClone); + } + else + return null; + } + if (label && label.trim() !== "") + value += label.trim(); + // value from child element attribute + label = CommonUtil.getLabelTextFromAttribute(labelElem, true); + if (label && label.trim() !== "") + value += label.trim(); + // wired case: get aria label from label element itself just in case (though name prohibited from aria in html) + label = AriaUtil_1.AriaUtil.getAriaLabel(labelElem); + if (label && label.trim() !== "") + value += label.trim(); + return value.trim(); + }; + /** + * calculate label from embedded control: https://w3c.github.io/accname/ + * @param {element} labelElem label element + * @param {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * @returns label text or '' + * + * note the assumption is the labelElem refers either to a labelled element by 'for' attribute + * or its first form field is labbelled element + */ + CommonUtil.getLabelTextFromAttribute = function (labelElem, ignoreHidden) { + // label either points to a labelable element by its for attribute or the first element child + // get the labelled elment if it's an implicit label + var labeledElem = null; + for (var i = 0; i < labelElem.children.length; i++) { + var child = labelElem.children.item(i); + if (CommonUtil.form_labelable_elements.includes(child.nodeName.toLowerCase())) { + labeledElem = child; + break; + } + } + var nw = new DOMWalker_1.DOMWalker(labelElem); + var text = ''; + while (nw.nextNode() && nw.node !== labelElem) { + // only check element children + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var elem = nw.elem(); + // ignore if it's hidden, or labelled element, or first form element if not labeled by for attribute + if ((ignoreHidden && (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) || VisUtil_1.VisUtil.isNodePresentational(elem))) + || (labeledElem && labeledElem.contains(elem))) + continue; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // textbox etc. return its text value + if (role === "textbox") { + var name_1 = elem.getAttribute("value"); + if (name_1 && name_1.trim().length > 0) + text += ' ' + name_1.trim(); + } + else if (role === "combobox" || role === "listbox") { + // for combobox or listbox roles, return the text alternative of the chosen option. + var selectedId = elem.getAttribute("aria-activedescendant") || elem.getAttribute("aria-selected") || elem.getAttribute("aria-checked"); + if (selectedId) { + var selectedOption = elem.ownerDocument.getElementById(selectedId); + if (selectedOption && !DOMUtil_1.DOMUtil.sameNode(elem, selectedOption)) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(selectedOption); + if (pair && pair.name) + text += ' ' + pair.name.trim(); + } + } + } + else if (["progressbar", "scrollbar", "slider", "spinbutton", "meter"].includes(role)) { + // for range role type, including "progressbar", "scrollbar", "slider", "spinbutton" roles + // If the aria-valuetext property is present, return its value + var value_1 = elem.getAttribute("aria-valuetext"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // Otherwise, if the aria-valuenow property is present, return its value, + value_1 = elem.getAttribute("aria-valuenow"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // finally use native value attribute + value_1 = elem.getAttribute("value"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + } + // get aria label from the element + var value = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (value && value.trim() !== "") + text += ' ' + value.trim(); + } + } + return text.trim(); + }; + CommonUtil.isFirstFormElement = function (parentNode, element) { + //let formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (parentNode.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(parentNode); + while (nw.nextNode()) { + if (CommonUtil.form_labelable_elements.indexOf(nw.node.nodeName.toLowerCase()) !== -1) { + return nw.node === element; + } + } + } + return false; + }; + // check if the element is a shadow host or descendant of a shadow host, but not a descedant of the shadow root of the host (to be assigned to shadow slot or ignored) + CommonUtil.isShadowHostElement = function (element) { + if (CommonUtil.isShadowElement(element)) + return false; + var walkNode = element; + while (walkNode) { + if (walkNode.shadowRoot) + return true; + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + //check if an element is in a shadow tree + CommonUtil.isShadowElement = function (element) { + var root = element.getRootNode(); + if (root.toString() === "[object ShadowRoot]") + return true; + return false; + }; + CommonUtil.removeAllFormElementsFromLabel = function (element) { + var formElements = ["input", "textarea", "select", "button", "datalist", "optgroup", "option", "keygen", "output", "progress", "meter"]; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; i++) { + if (formElements.indexOf(childNodes[i].nodeName.toLowerCase()) > -1) { + element.removeChild(childNodes[i]); + } + } + return element; + }; + /** + * @param element + * @param idStr + * @returns true if any one (if multiple Ids) id points to itself + */ + CommonUtil.isIdReferToSelf = function (element, idStr) { + if (!idStr || idStr.trim() === '') + return false; + var ids = idStr.trim().split(" "); + for (var j = 0, length_1 = ids.length; j < length_1; ++j) { + var referredNode = fragment_1.FragmentUtil.getById(element, ids[j]); + if (referredNode && DOMUtil_1.DOMUtil.sameNode(referredNode, element)) + return true; + } + return false; + }; + /* Determine the node depth of the given element */ + CommonUtil.nodeDepth = function (element) { + var depth = 0; + var walkNode = element; + while (walkNode !== null) { + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + depth = depth + 1; + } + return depth; + }; + /* compare node order of the 2 given nodes */ + /* returns + * 0 if the nodes are equal + * 1 if node b is before node a + * -1 if node a is before node b + * 2 if node a is nested in node b + * -2 if node b is nested in node a + * null if either node is null or their parent nodes are not equal + */ + CommonUtil.compareNodeOrder = function (nodeA, nodeB) { + if (nodeA === nodeB) + return 0; + var aDepth = CommonUtil.nodeDepth(nodeA); + var bDepth = CommonUtil.nodeDepth(nodeB); + if (bDepth > aDepth) { + for (var i = 0; i < bDepth - aDepth; ++i) + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + if (nodeA === nodeB) // Node B nested in Node A + return -2; + } + else if (aDepth > bDepth) { + for (var i = 0; i < aDepth - bDepth; ++i) + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + if (nodeA === nodeB) // Node A nested in Node B + return 2; + } + while (nodeA != null && nodeB != null && DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) { + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + } + if (nodeA === null || nodeB === null || DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) + return null; + while (nodeB != null && nodeB != nodeA) + nodeB = nodeB.previousSibling; + if (nodeB === null) // nodeB before nodeA + return 1; + else + return -1; + }; + /** + * Determine if the given attribute of the given element is not empty + * @memberOf AriaUtil + */ + CommonUtil.attributeNonEmpty = function (element, attrStr) { + return element.hasAttribute(attrStr) && element.getAttribute(attrStr).trim().length > 0; + }; + /* Return a pointer to the given frame, null if not found */ + CommonUtil.getFrameByName = function (ruleContext, frameName) { + var window = ruleContext.ownerDocument.defaultView; + var frameList = [window]; + var idx = 0; + while (idx < frameList.length) { + try { + if (frameList[idx].name === frameName) + return frameList[idx]; + for (var i = 0; i < frameList[idx].frames.length; ++i) { + try { + // Ensure it's a real frame and avoid recursion + if (frameList[idx].frames[i] && !frameList.includes(frameList[idx].frames[i])) { + frameList.push(frameList[idx].frames[i]); + } + } + catch (e) { } + } + } + catch (e) { } + ++idx; + } + return null; + }; + CommonUtil.defaultNSResolver = function (prefix) { + var uri; + switch (prefix) { + case 'html': + uri = 'http://www.w3.org/1999/xhtml'; + case 'x2': + uri = 'http://www.w3.org/TR/xhtml2'; + case 'x': + uri = 'http://www.w3.org/1999/xhtml'; + case 'xhtml': + uri = 'http://www.w3.org/1999/xhtml'; + default: + uri = null; + } + return uri; + }; + //checking if only the inner text is empty or not + CommonUtil.isInnerTextOnlyEmpty = function (element) { + // Get the innerText of the element + var text = element.innerText; + if ((text === undefined || text === null || text.trim().length === 0) && element.nodeName.toLowerCase() !== 'slot' && element.textContent !== undefined) { + //ignore slot because its text will be filled by the corresponding content in the light DOM + // innerText is sometimes 'undefined' in headless mode, or null if the element is invisible or not erxpanded + // so we try textContent as a workaround + text = element.textContent; + } + var retVal = !(text !== null && text.trim().length > 0); + if (element.nodeType === 1 && element.nodeName.toLowerCase() === "slot") { + //TODO: need to conside its own content, a slot may have its own content or assigned content + for (var _i = 0, _a = element.assignedNodes(); _i < _a.length; _i++) { + var slotElem = _a[_i]; + retVal = retVal && CommonUtil.isInnerTextEmpty(slotElem); + } + } + // Trim the inner text and verify that it is not empty. + return retVal; + }; + /* Return the inner text of the given element */ + CommonUtil.getInnerText = function (element) { + var retVal = element.innerText; + if (retVal === undefined || retVal === null || retVal.trim() === "") + retVal = element.textContent; + return retVal; + }; + /** + * return onscreen innerText only. + * This function should return the same result as innerText if no offscreen content exists + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {null | string} null if element has empty inner text, text otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.getOnScreenInnerText = function (element) { + if (!element) + return null; + if (element.nodeType === 3) + return element.nodeValue(); + var text = ""; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== element && nw.node !== element.parentNode) { + if (nw.bEndTag) + continue; + if (nw.node.nodeType === 1 && (VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nw.node.nodeName.toLowerCase()) || !VisUtil_1.VisUtil.isNodeVisible(nw.node) || VisUtil_1.VisUtil.isElementOffscreen(nw.node))) { + /** special case for svg <title> element: + * text in a <title> element is not rendered as part of the graphic, but browsers usually display it as a tooltip + * note some svg elements, such as title, desc, have a bounds {"left":0,"top":0,"height":0,"width":0} + */ + if (nw.node.nodeName.toLowerCase() === 'title' && CommonUtil.getAncestor(nw.node, "svg")) + continue; + if (nw.node.nextSibling) { + if (nw.node.nextSibling.nodeType === 3 && nw.node.nextSibling.nodeValue && nw.node.nextSibling.nodeValue.trim() !== '') + text += ' ' + nw.node.nextSibling.nodeValue.trim(); + nw.node = nw.node.nextSibling; + continue; + } + else + break; + } + if (nw.node.nodeType === 3 && nw.node.nodeValue && nw.node.nodeValue.trim() !== '') { + text += ' ' + nw.node.nodeValue.trim(); + } + } + return text.trim(); + }; + /** Return the text content of the given node + * this is different than innerText or textContent that return text content of a node and its descendants + */ + CommonUtil.getNodeText = function (element) { + if (!element) + return ""; + var text = ""; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType == 3) { + text += childNodes[i].nodeValue; + } + } + return text; + }; + /** + * This function is responsible for checking if elements inner text is empty or not. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isInnerTextEmpty = function (element) { + // Get the innerText of the element + var text = CommonUtil.getInnerText(element); + // Trim the inner text and verify that it is not empty. + return !(text != null && text.trim().length > 0); + }; + CommonUtil.hasInnerContent = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text !== null && text.trim().length > 0); + if (element.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode()) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + } + } + return hasContent; + }; + /** + * This function is responsible for determine if an element has inner content. + * This function also considers cases where inner text is hidden, which now will + * be classified as does not have hidden content. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.hasInnerContentHidden = function (element) { + return CommonUtil.hasInnerContentHiddenHyperLink(element, false); + }; + CommonUtil.svgHasName = function (element) { + return CommonUtil.attributeNonEmpty(element, "aria-label") + || CommonUtil.attributeNonEmpty(element, "aria-labelledby") + || !!element.querySelector(":scope > title"); + }; + CommonUtil.hasInnerContentHiddenHyperLink = function (element, hyperlink_flag) { + if (!element) + return false; + // Variable Decleration + var childElement = element.firstElementChild; + var hasContent = false; + // In the case that the childElement is not null then we need to check each of the elements + // to make sure that the elements are not all hidden. + if (childElement != null) { + // Get the nodewalter of the element node, so that we can loop over it and verify + // that the elements under the element are not completly hidden. + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the nodes until there are no more nodes or we have determine that there is content under + // this parent element. + while (!hasContent && nw.nextNode() && nw.node != element) { + // Get the next node + var node = nw.node; + // In the case an img element is present with alt then we can mark this as pass + // otherwise keep checking all the other elements. Make sure that this image element is not hidden. + hasContent = (node.nodeName.toLowerCase() === "img" + && (CommonUtil.attributeNonEmpty(node, "alt") || CommonUtil.attributeNonEmpty(node, "title")) + && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) || (node.nodeName.toLowerCase() === "svg" + && CommonUtil.svgHasName(node)); + // Now we check if this node is of type element, visible + if (!hasContent && node.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextOnlyEmpty(node); + if (!hasContent && hyperlink_flag === true) { + hasContent = CommonUtil.attributeNonEmpty(node, "aria-label") || CommonUtil.attributeNonEmpty(node, "aria-labelledby"); + var doc = node.ownerDocument; + if (doc) { + var win = doc.defaultView; + if (win) { + var cStyle = win.getComputedStyle(node); + if (!hasContent && cStyle != null) { + // console.log(cStyle.backgroundImage); + // console.log(cStyle.content) + hasContent = ((cStyle.backgroundImage && cStyle.backgroundImage.indexOf) || cStyle.content) && CommonUtil.attributeNonEmpty(node, "alt"); + } + } + } + } + } + // Check for cases where there is text node after an element under the parent + // In the case we detect nodetype as text node and the patent of the text node is + // the same element we are checking has Inner content for then get the inner content of this + // text node. + if (node.nodeType === 3 && DOMWalker_1.DOMWalker.parentElement(node) === element) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(node); + } + } + } + // In the case there are no child elements then we can simply perform the check for only innertext + // the img with alt case will be covered in the above if, as img is considers as an element. + else { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(element); + } + return hasContent; + }; + CommonUtil.hasInnerContentOrAlt = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text != null && text.trim().length > 0) || CommonUtil.attributeNonEmpty(element, "alt"); + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode() && nw.node != element) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + if (!hasContent + && (AriaUtil_1.AriaUtil.hasRole(nw.node, "button", true) || AriaUtil_1.AriaUtil.hasRole(nw.node, "textbox")) + && (AriaUtil_1.AriaUtil.hasAriaLabel(nw.node) || CommonUtil.attributeNonEmpty(nw.node, "title") || CommonUtil.getLabelForElementHidden(nw.elem(), true))) { + hasContent = true; + } + } + } + return hasContent; + }; + CommonUtil.concatUniqueArrayItem = function (item, arr) { + arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false; + return arr; + }; + CommonUtil.concatUniqueArrayItemList = function (itemList, arr) { + for (var i = 0; itemList !== null && i < itemList.length; i++) { + arr = CommonUtil.concatUniqueArrayItem(itemList[i], arr); + } + return arr; + }; + /** + * remove array items from a given array + * @param itemList items to be removed from arr + * @param arr the array + * @returns + */ + CommonUtil.reduceArrayItemList = function (itemList, arr) { + if (arr && arr.length > 0 && itemList && itemList.length > 0) { + var result = arr.filter(function (value) { + return !itemList.includes(value); + }); + return result; + } + return arr; + }; + CommonUtil.getScopeForTh = function (element) { + /** https://www.w3.org/TR/html5/tabular-data.html#header-and-data-cell-semantics + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a column header if any of the following conditions are true: + * * The cell's scope attribute is in the column state, or + * * The cell's scope attribute is in the auto state, and there are no data cells in any of + * the cells covering slots with y-coordinates y .. y+height-1. + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a row header if any of the following conditions are true: + * * The cell's scope attribute is in the row state, or + * * The cell's scope attribute is in the auto state, the cell is not a column header, and there are + * no data cells in any of the cells covering slots with x-coordinates x .. x+width-1. + */ + // Note: auto is default scope + // Easiest answer is if scope is specified + if (element.hasAttribute("scope")) { + var scope = element.getAttribute("scope").toLowerCase(); + if (scope === "row" || scope === 'rowgroup') + return "row"; + if (scope === "col" || scope === 'colgroup') + return "column"; + } + // scope is auto, default (without a scope) or invalid value. + // if all the sibling elements are th, then return "columnheader" + var siblings = __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName.toLowerCase() != "th"; }); + if (siblings === null || siblings.length === 0) + return "column"; + else + return "row"; + }; + CommonUtil.getControlOfLabel = function (node) { + // Handle the easy case of label -> for + var labelAncestor = CommonUtil.getAncestor(node, "label"); + if (labelAncestor && labelAncestor.hasAttribute("for")) { + return fragment_1.FragmentUtil.getById(node, labelAncestor.getAttribute("for")); + } + // Create a dictionary containing ids of parent nodes + var idDict = {}; + var parentWalk = node; + while (parentWalk) { + if (parentWalk.nodeType === 1 /* Node.ELEMENT_NODE */) { + var ancestor = parentWalk; + if (ancestor.hasAttribute("id")) { + idDict[ancestor.getAttribute("id")] = true; + } + } + parentWalk = DOMWalker_1.DOMWalker.parentNode(parentWalk); + } + // Early return if no ancestor IDs found + if (Object.keys(idDict).length === 0) { + return null; + } + // Cache aria-labelledby attribute if node is an element + var nodeAriaLabelledBy = node.nodeType === 1 ? node.getAttribute("aria-labelledby") : null; + // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids + var inputsUsingLabelledBy = CacheUtil_1.CacheUtil.getSetCache(node.ownerDocument, "CommonUtil::getControlOfLabel", function () { return node.ownerDocument.querySelectorAll("*[aria-labelledby]"); }); + for (var idx = 0; idx < inputsUsingLabelledBy.length; ++idx) { + var inputUsingLabelledBy = inputsUsingLabelledBy[idx]; + var ariaLabelledBy = inputUsingLabelledBy.getAttribute("aria-labelledby"); + var sp = ariaLabelledBy.split(" "); + for (var _i = 0, sp_1 = sp; _i < sp_1.length; _i++) { + var id = sp_1[_i]; + if (id in idDict && !CommonUtil.isIdReferToSelf(node, nodeAriaLabelledBy)) { + return inputUsingLabelledBy; + } + } + } + // Find the cases where we're within an aria labelledby + return null; + }; + /** + * This function is responsible for checking if the node that is provied is + * disabled or not. Following is how the check is performed: + * 1. Check if the current node is disabled with the following options: + * attribute --> disabled + * Also needs to be "button", "input", "select", "textarea", "optgroup", "option", + * "menuitem", "fieldset" nodes (in array elementsAllowedDisabled) + * attribute --> aria-disabled="true" + * 2. Check if any of the current nodes parents are disabled with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are disabled then this + * function will return true (node is disabled). + * + * @parm {HTMLElement} node - The node which should be checked if it is disabled or not. + * @return {bool} true if the node is disabled, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isNodeDisabled = function (node) { + // Set PT_NODE_DISABLED to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is disabled. We have to set it to false so that we know + // the node has already been checked. Only set it to false if the setting is undefined or null + // as if it is defined we do not wnat to reset it. As if it is true then we should make use of it + // to speed up the check. + var PT_NODE_DISABLED = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_DISABLED", undefined); + if (typeof PT_NODE_DISABLED !== "undefined") + return PT_NODE_DISABLED; + PT_NODE_DISABLED = false; + // Check the nodeType of this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // disabled is directly related to the parent node. + if (node.nodeType === 3) { + node = DOMWalker_1.DOMWalker.parentNode(node); + } + // Variable Declaration + var nodeName = node.nodeName.toLowerCase(); + // Get the disabled element property, disabled and aria-disabled attribute and check that it is true + var disabledAttribute = node.hasAttribute("disabled"); + var disabledPropertyCustom = PT_NODE_DISABLED; + var ariaDisabledAttribute = node.hasAttribute('aria-disabled') && node.getAttribute("aria-disabled") === 'true'; + // If this node has disabled attribute and the node allows disabled attribute, then return true. + // Disabled attribute is only allowed on "button", "input", "select", "textarea", "optgroup", "option", "menuitem", "fieldset" + // In the case aria-disabled is set to true, then also return true + if (disabledPropertyCustom || (disabledAttribute && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(nodeName) > -1) || ariaDisabledAttribute) { + PT_NODE_DISABLED = true; + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // disabled attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is disabled or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // Check upwards recursively, and save the results in an variable + var nodeDisabled = CommonUtil.isNodeDisabled(parentElement); + // If the node is found to be disabled then add the custom PT_NODE_DISABLED to true. + // so that we can use this next time, to quickly determine if node is disabled or not. + // This is extra percaution, the isNodeDisabled function already sets this. + if (nodeDisabled) { + PT_NODE_DISABLED = true; + } + // Check upwards recursively + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return nodeDisabled; + } + // Return false (node is not disabled) + return false; + }; + /** + * This function is responsible for determine if hidden content should be checked + * in rules. + * + * @parm {element} node - A node so that the document can be accessed to check for the + * option. Can be document element or a simple node element. + * @return {bool} true if hidden content should be checked, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldCheckHiddenContent = function (node) { + return false; + }; + /** + * This function is responsible for determining if node should be skipped from checking or not, based + * on the Check Hidden Content settings and if the node is visible or not. + * + * @parm {element} node - Node to check if it is visible or not based on the Check Hidden Content + * setting. + * + * @return {bool} true if node should be skipped, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldNodeBeSkippedHidden = function (node) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we + // return true to identify that the node should not be scanned/added to any hash/array. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (!CommonUtil.shouldCheckHiddenContent(node) && !VisUtil_1.VisUtil.isNodeVisible(node)) { + return true; + } + return false; + }; + CommonUtil.isfocusableByDefault = function (node) { + var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area']; + if (node.nodeName.toLowerCase() === "a" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (node.nodeName.toLowerCase() === "area" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (focusableElements.indexOf(node.nodeName.toLowerCase()) !== -1) + return true; + return false; + }; + /** + * This function check if a non-tabable node has valid tabable content. + * If it is tabable (the tabindex is not speicified or is not -1), returns false; + * If it is non-tabable, but a child is tabable and does not have element content, returns false; + * Otherwise, returns true. + */ + CommonUtil.nonTabableChildCheck = function (element) { + if (!element.hasAttribute("tabindex") || + (parseInt(element.getAttribute("tabindex")) != -1)) { + return false; + } + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + var child = nw.elem(); + if (child === null) { // Text node. usually is a cartridge return. + continue; + } + if (child.hasAttribute("tabindex") && + (parseInt(child.getAttribute("tabindex")) != -1) && + !CommonUtil.hasInnerContent(child)) { + return false; + } + } + return true; + }; + CommonUtil.hasAttribute = function (element, attributeName) { + var hasAttribute = false; + if (element.hasAttribute) { + hasAttribute = element.hasAttribute(attributeName); + } + else if (element.attributes && element.attributes.getNamedItem) { + var attr = element.attributes.getNamedItem(attributeName); + hasAttribute = attr && attr.specified; + } + return hasAttribute; + }; + // truncate the given text to a given number of characters + // return truncated text to 150 chars, same with the media_alt_brief rule + CommonUtil.truncateText = function (text, len) { + if (len === void 0) { len = 150; } + if (!text) + return text; + text = text.trim(); + if (text.length > len) + return text.substring(0, len - 1) + "..."; + return text; + }; + CommonUtil.input_type_with_placeholder = ["text", "search", "tel", "url", "email", "password", "number"]; + CommonUtil.input_text_types = [ + "text", "file", "password", + "checkbox", "radio", + "search", "tel", "url", "email", + "date", "number", "range", + "time", "color" + ]; + CommonUtil.input_time_types = [ + "date", "month", "week", "time", "datetime-local" + ]; + CommonUtil.input_other_types = [ + "range", "color", "checkbox", "radio", "file", "image" + ]; + CommonUtil.form_button_types = [ + "button", "reset", "submit" + ]; + CommonUtil.form_labelable_elements = ["input", "textarea", "select", "keygen", "progress", "meter", "output", "button"]; + CommonUtil.tabTagMap = { + "button": function (element) { + return !element.hasAttribute("disabled"); + }, + "iframe": true, + "input": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + if (element.getAttribute("type") === "radio") { + var name_2 = element.getAttribute("name"); + if (!name_2 || name_2.trim().length === 0) + return true; //single radio, no group + var doc = element.ownerDocument; + var group = doc.querySelectorAll("input[type='radio'][name='" + name_2.trim() + "']"); + if (group.length === 0 || group.length === 1) + return true; //single radio with the name, no others in group + var checked = null; + for (var i = 0; i < group.length; i++) { + if (group[i].checked) + checked = group[i]; + } + //only last one applies if multiple radios with 'checked' attributes + if (checked !== null) { + if (DOMUtil_1.DOMUtil.sameNode(checked, element)) + return true; + return false; + } + else { + // if nothing checked yet, return true if it's the first element + if (DOMUtil_1.DOMUtil.sameNode(group[0], element)) + return true; + return false; + } + } + else + return true; + }, + "select": function (element) { + return !element.hasAttribute("disabled"); + }, + "textarea": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + return true; + }, + /**"div": function (element) { + return element.hasAttribute("contenteditable"); + },*/ + "a": function (element) { + // xlink:href?? see svg + return element.hasAttribute("href"); + }, + "area": function (element) { + return element.hasAttribute("href"); + }, + "audio": function (element) { + return element.hasAttribute("controls"); + }, + "video": function (element) { + return element.hasAttribute("controls"); + }, + "summary": function (element) { + // first summary child of a details element is automatically focusable + return element.parentElement && element.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], element.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], element); + }, + "details": function (element) { + //details element without a direct summary child is automatically focusable + return element.children && __spreadArray([], element.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; }).length === 0; + } + }; + CommonUtil.image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"]; + return CommonUtil; +}()); +exports.CommonUtil = CommonUtil; + + +/***/ }, + +/***/ 9196 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableUtil = void 0; +var VisUtil_1 = __webpack_require__(3946); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var TableUtil = /** @class */ (function () { + function TableUtil() { + } + TableUtil.isDataTable = function (tableNode) { + return !(AriaUtil_1.AriaUtil.hasRole(tableNode, "none") || AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation")); + }; + /* + * A complex data table is a data table with any of the following characteristics: + * + * a thead element that contains two or more tr elements + * a table with more than one thead element + * a table with two or more tr elements that contain only th elements + * a th or td element with a rowspan or colspan attribute + * a tr element that contains at least one td element and two or more th elements + * a table with headers not located in the first row or first column + * a td element with a headers attribute value that contains more than two IDREFs + */ + TableUtil.isComplexDataTable = function (table) { + if ("AriaUtil_isComplexDataTable" in table) { + return !!table.AriaUtil_isComplexDataTable; + } + var isComplexTable = false; + if (table && TableUtil.isDataTable(table)) { + var thNodes = null, tdNodes = null; + var trNodes = table.getElementsByTagName("tr"); + var trNodeCount = trNodes.length; + var tdNodeCount = 0, thNodeCount = 0, trNodesHavingOnlyThNodes = 0; + for (var i = 0; !isComplexTable && i < trNodeCount; ++i) { + thNodes = trNodes[i].getElementsByTagName("th"); + tdNodes = trNodes[i].getElementsByTagName("td"); + thNodeCount = thNodes.length; + tdNodeCount = tdNodes.length; + if (tdNodeCount !== 0) { + // a tr element that contains at least one td element and two or more th elements; + isComplexTable = thNodeCount > 1; + // a th element with a rowspan or colspan attribute + for (var j = 0; !isComplexTable && j < thNodeCount; ++j) { + isComplexTable = ((thNodes[j].hasAttribute("rowspan") || + thNodes[j].hasAttribute("colspan")) && + CommonUtil_1.CommonUtil.getAncestor(thNodes[j], "table") === table); + } + // a td element with a rowspan or colspan attribute + // a td element with a headers attribute value that contains more than two IDREFs + for (var k = 0; !isComplexTable && k < tdNodeCount; ++k) { + isComplexTable = ((tdNodes[k].hasAttribute("rowspan") || + tdNodes[k].hasAttribute("colspan") || + (tdNodes[k].hasAttribute("headers") && CommonUtil_1.CommonUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[k], "table") === table); + } + } + else { + // two or more tr elements that contain only th elements + if (thNodeCount > 0) { + ++trNodesHavingOnlyThNodes; + } + isComplexTable = trNodesHavingOnlyThNodes === 2; + } + } + if (!isComplexTable) { + var theadNodes = table.getElementsByTagName("thead"); + var theadNodesLength = theadNodes.length; + if (theadNodesLength > 0) { + // table has more than one thead element + isComplexTable = theadNodesLength > 1; + // a thead element that contains two or more tr elements + if (!isComplexTable) { + isComplexTable = theadNodes[0].getElementsByTagName("tr").length > 1; + } + } + } + if (!isComplexTable && trNodeCount !== 0) { + // a table with headers not located in the first row or first column + isComplexTable = thNodeCount > 0 && !TableUtil.tableHeaderExists(table); + } + } + table.AriaUtil_isComplexDataTable = isComplexTable; + return isComplexTable; + }; + // Return true if a table cell is hidden or contain no data: <td></td> + TableUtil.isTableCellEmpty = function (cell) { + if (!cell || !VisUtil_1.VisUtil.isNodeVisible(cell) || cell.innerHTML.replace(/&nbsp;/g, ' ').trim().length === 0) + return true; + return false; + }; + // Return true if a table row is hidden or contain no data: <tr /> or <tr><td></td><td></td></tr> + TableUtil.isTableRowEmpty = function (row) { + if (!row || !row.cells || row.cells.length === 0 || !VisUtil_1.VisUtil.isNodeVisible(row)) + return true; + var passed = true; //empty + for (var c = 0; passed && c < row.cells.length; c++) { + var cell = row.cells[c]; + passed = TableUtil.isTableCellEmpty(cell); + } + return passed; + }; + // Return true if a table's header is in the first row or column + TableUtil.tableHeaderExists = function (ruleContext) { + var rows = ruleContext.rows; + if (!rows || rows.length === 0) + return null; + // note that table.rows return all all the rows in the table, + // including the rows contained within <thead>, <tfoot>, and <tbody> elements. + //case 1: headers are in the very first row with data in tbody or thead, but not in tfoot + //get the first row with data, ignoring the rows with no data + var passed = true; + var firstRow = rows[0]; + for (var r = 0; passed && r < rows.length; r++) { + firstRow = rows[r]; + // ignore the rows from tfoot + if (firstRow.parentNode && firstRow.parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + passed = TableUtil.isTableRowEmpty(firstRow); + } + //table contain no data: <table><tr><td></td><td></td></tr></table> + if (passed) + return null; + // Check if the cells with data in the first data row are all TH's + passed = true; + for (var r = 0; passed && r < firstRow.cells.length; r++) { + var cell = firstRow.cells[r]; + passed = TableUtil.isTableCellEmpty(cell) || cell.nodeName.toLowerCase() === 'th'; + } + if (passed) + return true; + // Case 2: headers are in the first column with data + // Assume that the first column has all TH's or a TD without data in the first column. + passed = true; + for (var i = 0; passed && i < rows.length; ++i) { + // ignore the rows from tfoot + if (rows[i].parentNode && rows[i].parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + // If no cells in this row, or no data at all, that's okay too. + passed = !rows[i].cells || + rows[i].cells.length === 0 || + rows[i].cells[0].innerHTML.trim().length === 0 || + rows[i].cells[0].nodeName.toLowerCase() != "td"; + } + if (passed) + return true; + //case 3: all td data cells have headers attributes that point to the id of a th element in the same table. + // https://html.spec.whatwg.org/multipage/tables.html#attributes-common-to-td-and-th-elements + passed = true; + var thIds = []; + var tdHeaders = []; + for (var r = 0; passed && r < rows.length; r++) { + var row = rows[r]; + // Check if the cells with data in the last data row are all TH's + for (var c = 0; c < row.cells.length; c++) { + var cell = row.cells[c]; + if (TableUtil.isTableCellEmpty(cell)) + continue; + if (cell.nodeName.toLowerCase() === 'td') { + if (!cell.getAttribute('headers') || cell.getAttribute('headers').trim().length === 0) + passed = false; + else + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(cell.getAttribute('headers').trim().split(" "), tdHeaders); + } + else if (cell.nodeName.toLowerCase() === 'th' && cell.getAttribute('id') && cell.getAttribute('id').trim().length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItem(cell.getAttribute('id').trim(), thIds); + } + } + if (passed) { // all td elements have headers, to exam if the headers point to a th id + if (thIds.length > 0 && tdHeaders.every(function (header) { return thIds.includes(header); })) + return true; + } + return false; + }; + TableUtil.isLayoutTable = function (tableNode) { + return AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation") || AriaUtil_1.AriaUtil.hasRole(tableNode, "none"); + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + TableUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + return TableUtil; +}()); +exports.TableUtil = TableUtil; + + +/***/ }, + +/***/ 3946 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VisUtil = void 0; +var CacheUtil_1 = __webpack_require__(4566); +var DOMUtil_1 = __webpack_require__(1686); +var DOMWalker_1 = __webpack_require__(3864); +var DOMMapper_1 = __webpack_require__(7507); +var AriaUtil_1 = __webpack_require__(7011); +var CSSUtil_1 = __webpack_require__(4919); +var ClipPathUtil_1 = __webpack_require__(167); +var VisUtil = /** @class */ (function () { + function VisUtil() { + } + /** + * This function is responsible for checking if the node that is provied is + * visible or not. Following is how the check is performed: + * 1. Check if the current node is hidden with the following options: + * CSS --> dislay: none + * CSS --> visibility: hidden + * attribute --> hidden + * 2. Check if the any of the current nodes parents are hidden with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are hidden then this + * function will return false (node is not visible). + * + * Note: nodes with CSS properties opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * Note: nodes hidden off screen or behind another object: they are not considered hidden. + * They are exposed in the accessibility tree and they can even name on-screen objects. + * + * @parm {element} node The node which should be checked if it is visible or not. + * @return {bool} false if the node is NOT visible, true otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisible = function (nodeIn) { + // Check the nodeType if this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // visibility is directly related to the parent node. + if (nodeIn.nodeType === 3) { + nodeIn = DOMWalker_1.DOMWalker.parentNode(nodeIn); + } + var node = nodeIn; + // We should only allow nodeType element, and TextNode all other nodesTypes + // we can return the visibility as visible. + // Following nodes will be returned as visable by default, since we can not + // actually change their visibility. + // Node.PROCESSING_INSTRUCTION_NODE --> 7 + // Node.COMMENT_NODE --> 8 + // 9 /* Node.DOCUMENT_NODE */ --> 9 + // Node.DOCUMENT_TYPE_NODE --> 10 + // Node.DOCUMENT_FRAGMENT_NODE --> 11 + if (node.nodeType !== 1) { + return true; + } + // Make sure that the ownerDocument is present before moving forward + // in detecting if the node is visible or not. In the case that ownerDocument + // does not exist then we simply return node is visible by default. + if (!node.ownerDocument) { + return true; + } + // Variable Declaration + var compStyle; + var nodeName = node.nodeName.toLowerCase(); + // In the case this node is a script, link or style node, right away return node is visible + // because scripts, links and style nodes can not be hidden by HTML attribute or CSS or are hidden by default. But we want to scan + // the elements everytime as they render content still which is still visible to users. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // datalist --> In the rendering, the datalist element represents nothing and it, along with its children, should be hidden. + if (VisUtil.hiddenByDefaultElements != null && VisUtil.hiddenByDefaultElements != undefined && VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) { + //return true; + return false; + } + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined); + if (cacheVal !== undefined) { + return cacheVal; + } + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + cacheVal = CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + // Check if this node is visible, we check couple of CSS properties and hidden attribute. + // area, param and audio elements we do not check if they are hidden as it does not apply to them. + // Check the unhideableElements array which is part of the rules, to check if this element is allowed to be hidden or not + // in the case that the element is part of the unhideableElements array then we do not run the hidden check on this element, + // and go stright to the parent node. + // Array check elements like: + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // In the case that unhideableElements array is not defined then we just scan all elements and do no filtering at all. + if (VisUtil.unhideableElements === null || VisUtil.unhideableElements === undefined || VisUtil.unhideableElements.indexOf(nodeName) === -1) { + // Check if defaultView exists for this node, if it does then use this to run the getComputedStyle + // function to get the CSS style for the node. + if (node.ownerDocument.defaultView) { + // Run the getComputedStyle on this node to fetch the CSS compuation of the node + compStyle = node.ownerDocument.defaultView.getComputedStyle(node, null); + } + // In the case that defaultView does not exists return true to identify that this + // node is visible, because were not able to detect if it was not. + else { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // Get the hidden element property and hidden attribute + var hiddenAttribute = node.getAttribute("hidden"); + var hiddenPropertyCustom = cacheVal; + // To get the hidden property we need to perform a special check as in some cases the hidden property will not be + // a boolean, for theses cases we set it to false as we are not able to determine the true hidden condition. + // The reason for this is because form elements are able to perform an override, so when we have id="hidden" for an element + // which is under the form element then, node.hidden gives the element/list of elements which have id="hidden". Refer to + // mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1267356 + var hiddenProperty = typeof node.hidden === "boolean" ? node.hidden : false; + // If compStyle object is empty, node does't have hidden property, node does't have hidden attribute and does't have custom PT + // hidden property then we can just return true (node visible) at this point. + if (!compStyle && + !hiddenProperty && // this covers false, null, or undefined + (hiddenAttribute === null || hiddenAttribute === undefined) && + !hiddenPropertyCustom // This covers false, null or undefined + ) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // In the case that the compStyle is defined we check the following: + // CSS style display set to none + // CSS style visibility set to hidden + // Note: For this property since it is inherited, need to skip the check on parents as + // the parent can have hidden but the child can be visible. So we only check this property + // on child elements/elements that are passed to this function the first time. + // node hidden property set (node.hidden) + // node attribute hidden set (to any value) + // node custom hidden property ser (node.PT_NODE_HIDDEN) + // If any of the above conditions are true then we return false as this element is not visible + if ((compStyle !== null && ((compStyle.getPropertyValue('display') === 'none' || + (!CacheUtil_1.CacheUtil.getCache(node, "Visibility_Check_Parent", null) && compStyle.getPropertyValue('visibility') === 'hidden'))) || + (compStyle.getPropertyValue('display') !== 'block' && (hiddenProperty || hiddenAttribute != null || hiddenPropertyCustom)))) { + // Set a custom expandos property on the the node to identify that it is hidden, so that we can uses + // use this in the rules to determine if the node is hidden or not, if we need to. + // Use expandos property instead of a hash map which stores the elements, adding/checking expandos + // properties is a lot faster performance whise. For Hash map we need to store based on xpath, and to calculate + // xpath it is more performance impact. + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check content-visibility: if the content-visibility is hidden, then, return false as the element is not visible + if (VisUtil.isContentHidden(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check hidden by clip-path + // TODO: need to check if hidden content contains focusable elements, similarly to offscreen content + if (ClipPathUtil_1.ClipPathUtil.isNodeVisuallyHiddenByClipPath(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is visible or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // When we have a parent element going through the isNodeVisible function we have to mark it as such + // so that in the function we can skip checking visibility: hidden for parent elements since visibility: hidden + // is inherited, which allows a child to have a different setting then the child. This property only needs to be checked + // once for the first element that is passed down and that is all. Ignore it for all the parents that we iterate over. + CacheUtil_1.CacheUtil.setCache(parentElement, "Visibility_Check_Parent", true); + // Check upwards recursively, and save the results in an variable + var nodeVisible = VisUtil.isNodeVisible(parentElement); + // If the node is found to not be visible then add the custom PT_NODE_HIDDEN to true. + // so that we can use this in the rules. + // if (!nodeVisible) { + // CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + // } + // Check upwards recursively + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", nodeVisible); + } + // Return true (node is visible) + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + }; + /** + * This function is responsible for checking if the node that is visually hidden by clipping or opaq: + * 1. Check if the current node is visually hidden: + * CSS --> clip: rect(0px, 0px, 0px, 0px) + * CSS --> opacity: 0 + * + * Note: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note: nodes with CSS properties clip: rect(0px, 0px, 0px, 0px) or opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden to an AT. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * @parm {element} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisuallyHidden = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN", undefined); + if (hidden === undefined) { + // defined styles only give the styles that changed + var comp_styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if ((comp_styles['position'] === 'absolute' && comp_styles['clip'] && comp_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)') + || (comp_styles['opacity'] && parseFloat(comp_styles['opacity']) < 0.1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", true); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentElement(elem); + if (!parentElement) + return false; + // Check upwards recursively + var hid = VisUtil.isNodeVisuallyHidden(parentElement); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", hid); + return hid; + } + return hidden; + }; + /** + * return true if the node or its ancestor is hidden by CSS content-visibility:hidden + * At this time, CSS content-visibility is partially supported by Chrome & Edge, but not supported by Firefox + * The implementation TEMPORARILY follows the Chrome test results: + * if content-visibility:hidden + * if the element is block-level (default or specified by the user), then the element and its children are normally hidden; + * if the element is inline (default or specified by the user), then the element and its children are normally NOT hidden; + * + * @param node + */ + VisUtil.isContentHidden = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_ContentHidden", undefined); + if (vis !== undefined) + return vis; + var style = getComputedStyle(node); + if (!style) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var content_visibility = style.getPropertyValue("content-visibility"); + if (content_visibility !== 'hidden') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var display = style.getPropertyValue("display"); + // inline element only + if (display === 'inline') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", true); + return true; + }; + /** + * return true if the node is offscreen by CSS position + * @param node + */ + VisUtil.isElementOffscreen = function (node) { + if (!node) + return true; + if (node.nodeType !== 1) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_Offscreen", undefined); + if (vis !== undefined) + return vis; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(node); + if (!bounds) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + if (bounds['height'] === 0 || bounds['width'] === 0 || (bounds['top'] + bounds['height']) <= 0 || (bounds['left'] + bounds['width']) <= 0) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodeHiddenFromAT = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HiddenFromAT", undefined); + if (vis !== undefined) + return vis; + if (!VisUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + var ancestor = DOMUtil_1.DOMUtil.getAncestorWithAttribute(node, "aria-hidden", "true"); + if (ancestor) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodePresentational = function (node) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(node); + if (role && (role === 'none' || role === 'presentation')) + return true; + return false; + }; + /** + * return true if the element is scrollable + * @param node + */ + VisUtil.isElementScrollable = function (elem) { + if (!elem) + return false; + var styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if (!styles) + return false; + var x_scroll = styles.getPropertyValue('overflow-x'); + var y_scroll = styles.getPropertyValue('overflow-y'); + //console.log("before node="+ elem.nodeName +", id="+elem.getAttribute("id") +", x_scroll="+x_scroll + ", y_scroll="+y_scroll); + // If overflow-y is hidden, scroll, or auto, and the overflow-x property is visible (default), the value will be implicitly computed as auto. + if (x_scroll === 'visible' && (y_scroll === 'hidden' || y_scroll === 'scroll' || y_scroll === 'auto')) + x_scroll = 'auto'; + // If overflow-x is hidden, scroll, or auto and the overflow-y property is visible (default), the value will be implicitly computed as auto. + if (y_scroll === 'visible' && (x_scroll === 'hidden' || x_scroll === 'scroll' || x_scroll === 'auto')) + y_scroll = 'auto'; + // setting overflow to clip in one direction when it isn't set to visible or clip in the other direction results in the clip value behaving as hidden. + if (x_scroll === 'clip' && y_scroll !== 'visible' && y_scroll !== 'clip') + x_scroll = 'hidden'; + if (y_scroll === 'clip' && x_scroll !== 'visible' && x_scroll !== 'clip') + y_scroll = 'hidden'; + // not scrollable: no scroll bars + if ((x_scroll === 'visible' || x_scroll === 'hidden' || x_scroll === 'clip') + && (y_scroll === 'visible' || y_scroll === 'hidden' || y_scroll === 'clip')) + return false; + // false if the overall scrollable element (clientWidth + scrollbarWidth and clientHeight + scrollbarHeight) is too small to be visible on screen + if (Math.max(elem.offsetWidth, elem.offsetHeight) < 30 || Math.min(elem.offsetWidth, elem.offsetHeight) < 15) + return false; + // false if content is smaller than the scrollable container: both x and y scroll distances < element's horizontal/vertical padding + var padding_x = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingLeft, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingRight, elem); + var padding_y = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingTop, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingBottom, elem); + if (elem.scrollWidth - elem.clientWidth < 1 + padding_x + && elem.scrollHeight - elem.clientHeight < 1 + padding_y) + return false; + return true; + }; + // This list contains a list of element tags which can not be hidden, when hidden is + // added to theses elements it does not do anything at all. + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // Note: All element tags that are added here should be added as lowercase, as we are using indexOf to do the check. + VisUtil.unhideableElements = ['area', 'param', 'audio']; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + // on theses elements we need to make then visible by default so that the rules can trigger regardless of the + // Check Hidden Content option in the tools. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // head --> head elements have display: none by default, but it will still behave correct + // title --> title elements have display: none by default, but it will still display the title. remove title from the list because a title can be a child of a svg element too + // meta --> meta elements have display: none by default, but it will still perform the action that meta is suppose to + // base --> base elements have display: none by default, but it will still perform the action that meta is suppose to + // noscript --> noscript elements have display: none by default, but it will still perform the action that meta is suppose to + // template --> template elements have display: none by default, because they are just a mechanism for holding client-side content + // that is not to be rendered when a page is loaded. https://developer.mozilla.org/en/docs/Web/HTML/Element/template + // datalist --> datalist elements have display: none by default, + VisUtil.hiddenByDefaultElements = ['script', 'link', 'style', 'head', 'meta', 'base', 'noscript', 'template', 'datalist']; + return VisUtil; +}()); +exports.VisUtil = VisUtil; + + +/***/ }, + +/***/ 8855 +(module) { + +module.exports = /*#__PURE__*/JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}'); + +/***/ } + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ const __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ const cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ const module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +let __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it uses a non-standard name for the exports (exports). +(() => { +let exports = __webpack_exports__; + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkDemo = exports.SRViewer = exports.SRCursor = exports.SRController = exports.DOMWalker = exports.Config = exports.ARIAMapper = exports.Checker = exports.Context = void 0; +var Context_1 = __webpack_require__(920); +Object.defineProperty(exports, "Context", ({ enumerable: true, get: function () { return Context_1.Context; } })); +// import { Simulator } from "./v2/simulator" +var Checker_1 = __webpack_require__(7412); +Object.defineProperty(exports, "Checker", ({ enumerable: true, get: function () { return Checker_1.Checker; } })); +var ARIAMapper_1 = __webpack_require__(9955); +Object.defineProperty(exports, "ARIAMapper", ({ enumerable: true, get: function () { return ARIAMapper_1.ARIAMapper; } })); +var Config_1 = __webpack_require__(4516); +Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return Config_1.Config; } })); +var DOMWalker_1 = __webpack_require__(3864); +Object.defineProperty(exports, "DOMWalker", ({ enumerable: true, get: function () { return DOMWalker_1.DOMWalker; } })); +var SRController_1 = __webpack_require__(5233); +Object.defineProperty(exports, "SRController", ({ enumerable: true, get: function () { return SRController_1.SRController; } })); +var SRCursor_1 = __webpack_require__(8195); +Object.defineProperty(exports, "SRCursor", ({ enumerable: true, get: function () { return SRCursor_1.SRCursor; } })); +var SRViewer_1 = __webpack_require__(8107); +Object.defineProperty(exports, "SRViewer", ({ enumerable: true, get: function () { return SRViewer_1.SRViewer; } })); +function checkDemo(timeout) { + if (!timeout) + timeout = 0; + var checker = new Checker_1.Checker(); + setTimeout(function () { + checker.check(document.documentElement, ["IBM_Accessibility", "IBM_Design"]) + .then(function (report) { + console.log(report); + var vals = { + "FAIL": 0, + "POTENTIAL": 1, + "MANUAL": 2, + "PASS": 3 + }; + for (var idx = 0; idx < report.results.length; ++idx) { + if (report.results[idx].value[1] === "PASS") { + report.results.splice(idx--, 1); + } + } + report.results.sort(function (a, b) { + if (a.category != b.category) { + return a.category.localeCompare(b.category); + } + if (a.path["aria"] === b.path["aria"]) { + return vals[a.value[1]] - vals[b.value[1]]; + } + return a.path["aria"].localeCompare(b.path["aria"]); + }); + var lastPath = null; + var category = null; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (category !== result.category) { + if (category !== null) { + console.groupEnd(); + console.groupEnd(); + lastPath = null; + } + category = result.category; + console.group(result.category); + } + if (result.path["aria"] != lastPath) { + if (lastPath !== null) { + console.groupEnd(); + } + lastPath = result.path["aria"]; + if (lastPath === "") { + console.group("page"); + } + else { + console.group(lastPath); + } + } + console.log(result.value, result.message); + } + console.groupEnd(); + console.groupEnd(); + }); + }, timeout); +} +exports.checkDemo = checkDemo; + +})(); + +module.exports = __webpack_exports__; +/******/ })() +; \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.09.02/js/ace-node.js b/rule-server/src/static/archives/2026.09.02/js/ace-node.js new file mode 100644 index 000000000..6f2c20bf5 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/js/ace-node.js @@ -0,0 +1,2 @@ +/*! For license information please see ace-node.js.LICENSE.txt */ +(()=>{"use strict";var e={9910(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIADefinitions=void 0;var i=function(){function e(){}return e.nameFromContent=function(t){return t in e.designPatterns&&e.designPatterns[t].nameFrom&&e.designPatterns[t].nameFrom.includes("contents")},e.globalProperties=["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-details","aria-flowto","aria-hidden","aria-keyshortcuts","aria-label","aria-labelledby","aria-live","aria-owns","aria-relevant","aria-roledescription","aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"],e.referenceProperties=["aria-owns","aria-controls","aria-describedby","aria-labelledby","aria-flowto","aria-activedescendant"],e.globalDeprecatedRoles=["directory","doc-biblioentry","doc-endnote"],e.globalDeprecatedProperties=["aria-grabbed","aria-dropeffect"],e.propertyDataTypes={"aria-activedescendant":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-atomic":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-autocomplete":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["inline","list","both","none","undefined"]},"aria-busy":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-checked":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-colcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-controls":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-current":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["page","step","location","date","time","true","false","undefined"]},"aria-describedby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-details":{type:"http://www.w3.org/2001/XMLSchema#idrefs"},"aria-disabled":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-dropeffect":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["copy","move","link","execute","popup","none"]},"aria-errormessage":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-expanded":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-flowto":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!1},"aria-grabbed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-haspopup":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","menu","listbox","tree","grid","dialog"]},"aria-hidden":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-invalid":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","spelling","grammar","undefined"]},"aria-keyshortcuts":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-label":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-labelledby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-level":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-live":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["off","polite","assertive"]},"aria-modal":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiline":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiselectable":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-orientation":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["horizontal","vertical","undefined"]},"aria-owns":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-placeholder":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-posinset":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-pressed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-readonly":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-relevant":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["additions","removals","text","all"]},"aria-required":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-roledescription":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-rowcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-selected":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-setsize":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-sort":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["ascending","descending","other","none"]},"aria-valuemax":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuemin":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuenow":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuetext":{type:"http://www.w3.org/2001/XMLSchema#string"}},e.designPatterns={alert:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},alertdialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},application:{container:null,props:["aria-activedescendant","aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"]},article:{container:null,props:["aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},banner:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},blockquote:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},button:{container:null,props:["aria-expanded","aria-pressed"],reqProps:null,reqChildren:null,htmlEquiv:"button | input[@type='button']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},caption:{container:["figure","grid","table","treegrid"],props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},cell:{container:["row"],props:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},checkbox:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='checkbox']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},code:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},columnheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='col']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},combobox:{container:null,props:["aria-controls","aria-activedescendant","aria-autocomplete","aria-readonly","aria-required"],reqProps:["aria-expanded"],reqChildren:[],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"]},complementary:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},comment:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},contentinfo:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},definition:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},deletion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},dialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},directory:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecated:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"doc-abstract":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-acknowledgments":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-afterword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-appendix":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-backlink":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-biblioentry":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!0,nameFrom:["author"]},"doc-bibliography":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-biblioref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-chapter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-colophon":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-conclusion":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-cover":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0},"doc-credit":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-credits":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-dedication":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-endnote":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-endnotes":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-epigraph":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-epilogue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-errata":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-example":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-footnote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-foreword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossary":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-index":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-introduction":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-noteref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-notice":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-pagebreak":{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0},"doc-pagelist":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pagefooter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-pageheader":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-part":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-preface":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-prologue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pullquote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-qna":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-subtitle":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"]},"doc-tip":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-toc":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},document:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},emphasis:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},feed:{container:null,props:null,reqProps:null,reqChildren:["article"],htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},figure:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},form:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"form",roleType:"landmark",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},generic:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"div | span",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby","aria-roledescription"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"graphics-document":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"]},"graphics-object":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!1,nameFrom:["author"]},"graphics-symbol":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},grid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-readonly","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:"table",roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},gridcell:{container:["row"],props:["aria-colindex","aria-colspan","aria-disabled","aria-errormessage","aria-expanded","aria-haspopup","aria-invalid","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"widget",nameFrom:["author","contents"]},group:{container:null,props:["aria-activedescendant"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},heading:{container:null,props:null,reqProps:["aria-level"],reqChildren:null,htmlEquiv:"h1 | h2 | h3 | h4 | h5 | h6",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},img:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},image:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},insertion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},link:{container:null,props:["aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},list:{container:null,props:null,reqProps:null,reqChildren:["listitem"],htmlEquiv:"ol | ul",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},listbox:{container:null,props:["aria-activedescendant","aria-expanded","aria-multiselectable","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["group","option"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},listitem:{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},log:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},main:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},mark:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"mark",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},marquee:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},math:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!1,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},menu:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menubar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menuitem:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemcheckbox:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemradio:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},meter:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},navigation:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},none:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},note:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},option:{container:["group","listbox"],props:["aria-selected","aria-checked","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"option",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},paragraph:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},presentation:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},progressbar:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},radio:{container:null,props:["aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='radio']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},radiogroup:{container:null,props:["aria-activedescendant","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["radio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},region:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},row:{container:["grid","rowgroup","table","treegrid"],props:["aria-activedescendant","aria-colindex","aria-expanded","aria-level","aria-posinset","aria-rowindex","aria-selected","aria-setsize"],reqProps:null,reqChildren:["cell","columnheader","gridcell","rowheader"],htmlEquiv:"tr",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},rowgroup:{container:["grid","table","treegrid"],props:[],reqProps:null,reqChildren:["row"],htmlEquiv:"tbody | tfoot | thead",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},rowheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='row']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},scrollbar:{container:null,props:["aria-orientation","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-controls","aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},search:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},searchbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='search']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},separator:{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},slider:{container:null,props:["aria-orientation","aria-readonly","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},spinbutton:{container:null,props:["aria-activedescendant","aria-readonly","aria-required","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},status:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},strong:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},subscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},suggestion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},superscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},switch:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},tab:{container:["tablist"],props:["aria-expanded","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},table:{container:null,props:["aria-colcount","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup","caption"],htmlEquiv:"table",roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tablist:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation"],reqProps:null,reqChildren:["tab"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tabpanel:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},term:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"dfn",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},textbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='text']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},time:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},timer:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},toolbar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tooltip:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tree:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation","aria-required"],reqProps:null,reqChildren:["group","treeitem"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treegrid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-orientation","aria-readonly","aria-required","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treeitem:{container:["group","tree"],props:["aria-checked","aria-expanded","aria-level","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]}},e.elementsAllowedDisabled=["button","input","select","textarea","optgroup","option","fieldset"],e.elementsAllowedRequired=["select","textarea"],e.elementsAllowedReadOnly=["textarea"],e.documentConformanceRequirement={abbr:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},address:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},article:{implicitRole:["article"],validRoles:["application","document","feed","main","none","presentation","region"],globalAriaAttributesValid:!0},aside:{implicitRole:["complementary"],validRoles:["doc-dedication","doc-example","doc-footnote","doc-glossary","doc-pullquote","doc-tip","feed","none","note","presentation","region","search"],globalAriaAttributesValid:!0},audio:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},b:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},base:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},bdi:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},bdo:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},blockquote:{implicitRole:["blockquote"],validRoles:["any"],globalAriaAttributesValid:!0},body:{implicitRole:["generic"],validRoles:null,otherDisallowedAriaAttributes:["aria-hidden"],globalAriaAttributesValid:!0},br:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},canvas:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},caption:{implicitRole:["caption"],validRoles:null,globalAriaAttributesValid:!0,allowAttributesFromImplicitRole:!1},cite:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},code:{implicitRole:["code"],validRoles:["any"],globalAriaAttributesValid:!0},col:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},colgroup:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},data:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},datalist:{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},dd:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},del:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0},details:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},dfn:{implicitRole:["term"],validRoles:["any"],globalAriaAttributesValid:!0},dialog:{implicitRole:["dialog"],validRoles:["alertdialog"],globalAriaAttributesValid:!0},dl:{implicitRole:null,validRoles:["group","list","none","presentation"],globalAriaAttributesValid:!0},dt:{implicitRole:["term"],validRoles:["listitem"],globalAriaAttributesValid:!0},em:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},embed:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},fieldset:{implicitRole:["group"],validRoles:["none","presentation","radiogroup"],globalAriaAttributesValid:!0},figcaption:{implicitRole:null,validRoles:["group","none","presentation"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},form:{implicitRole:["form"],validRoles:["none","presentation","search"],globalAriaAttributesValid:!0},head:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},hgroup:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},h1:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h2:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h3:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h4:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h5:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h6:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},hr:{implicitRole:["separator"],validRoles:["doc-pagebreak","none","presentation"],globalAriaAttributesValid:!0},html:{implicitRole:["document"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},i:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},iframe:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},ins:{implicitRole:["insertion"],validRoles:["any"],globalAriaAttributesValid:!0},kbd:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},label:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},legend:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},link:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},main:{implicitRole:["main"],validRoles:null,globalAriaAttributesValid:!0},map:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},mark:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},math:{implicitRole:["math"],validRoles:null,globalAriaAttributesValid:!0},menu:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},meta:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},meter:{implicitRole:["meter"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"],allowAttributesFromImplicitRole:!1},nav:{implicitRole:["navigation"],validRoles:["doc-index","doc-pagelist","doc-toc","menu","menubar","tablist","none","presentation"],globalAriaAttributesValid:!0},noscript:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},object:{implicitRole:null,validRoles:["application","document","img"],globalAriaAttributesValid:!0},ol:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},optgroup:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},option:{implicitRole:["option"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-selected"]},output:{implicitRole:["status"],validRoles:["any"],globalAriaAttributesValid:!0},p:{implicitRole:["paragraph"],validRoles:["any"],globalAriaAttributesValid:!0},param:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},picture:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},pre:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},progress:{implicitRole:["progressbar"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax"]},q:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},rp:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},rt:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},ruby:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},s:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-label","aria-labelledby"]},samp:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},script:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},search:{implicitRole:["search"],validRoles:["search","form","group","none","presentation","region"],globalAriaAttributesValid:!0},slot:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},small:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},source:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},span:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},strong:{implicitRole:["strong"],validRoles:["any"],globalAriaAttributesValid:!0},style:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},sub:{implicitRole:["subscript"],validRoles:["any"],globalAriaAttributesValid:!0},sup:{implicitRole:["superscript"],validRoles:["any"],globalAriaAttributesValid:!0},svg:{implicitRole:["graphics-document"],validRoles:["any"],globalAriaAttributesValid:!0},table:{implicitRole:["table"],validRoles:["any"],globalAriaAttributesValid:!0},template:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},textarea:{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0},tfoot:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},thead:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},time:{implicitRole:["time"],validRoles:["any"],globalAriaAttributesValid:!0},title:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},track:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},u:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},ul:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},var:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},video:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},wbr:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]}},e.documentConformanceRequirementSpecialTags={a:{"with-href":{implicitRole:["link"],validRoles:["button","checkbox","doc-backlink","doc-biblioref","doc-glossref","doc-noteref","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab","treeitem"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-disabled=true"]},"without-href":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},area:{"with-href":{implicitRole:["link"],validRoles:null,globalAriaAttributesValid:!0},"without-href":{implicitRole:["generic"],validRoles:["button","link"],globalAriaAttributesValid:!0}},div:{"child-dl":{implicitRole:["generic"],validRoles:["presentation","none"],globalAriaAttributesValid:!0},"no-child-dl":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},figure:{"child-figcaption":{implicitRole:["figure"],validRoles:["doc-example"],globalAriaAttributesValid:!0},"no-child-figcaption":{implicitRole:["figure"],validRoles:["any"],globalAriaAttributesValid:!0}},footer:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["contentinfo"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0}},header:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["banner"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0}},img:{"img-with-accname":{implicitRole:["img"],validRoles:["button","checkbox","doc-cover","link","menuitem","menuitemcheckbox","menuitemradio","meter","option","progressbar","radio","scrollbar","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"img-without-accname-empty-alt":{implicitRole:["presentation","none"],validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]},"img-without-accname-no-alt":{implicitRole:["img"],validRoles:["presentation","none"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]}},input:{button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"checkbox-with-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch","button"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},"checkbox-without-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},color:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},date:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"datetime-local":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},file:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"]},hidden:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},image:{implicitRole:["button"],validRoles:["checkbox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},month:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},number:{implicitRole:["spinbutton"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},password:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},radio:{implicitRole:["radio"],validRoles:["menuitemradio"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},range:{implicitRole:["slider"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"]},reset:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"search-no-list":{implicitRole:["searchbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"search-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},submit:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"tel-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"tel-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"text-no-list":{implicitRole:["textbox"],validRoles:["combobox","searchbox","spinbutton"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"text-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},time:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"url-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"url-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},week:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"default-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"default-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0}},li:{"child-of-list-role":{implicitRole:["listitem"],validRoles:null,globalAriaAttributesValid:!0},"no-child-of-list-role":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},section:{"with-name":{implicitRole:["region"],validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0},"without-name":{implicitRole:null,validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0}},select:{"no-multiple-attr-size-gt1":{implicitRole:["combobox"],validRoles:["menu"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]},"multiple-attr-size-gt1":{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]}},summary:{"first-summary-of-detail":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-disabled","aria-haspopup"]},"no-first-summary-of-detail":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tbody:{"des-table":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-grid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},td:{"des-table":{implicitRole:["cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},th:{"des-table-row-scope":{implicitRole:["rowheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-table-column-scope":{implicitRole:["columnheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-row-scope":{implicitRole:["rowheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-column-scope":{implicitRole:["columnheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tr:{"des-table":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},default:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},e.relatedAriaHtmlAttributes={"aria-checked":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["checked"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["checked"],htmlAttributeValues:null}]},"aria-disabled":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["disabled"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["disabled"],htmlAttributeValues:null}]},"aria-hidden":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]},{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["until-found"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]}]},"aria-placeholder":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["placeholder"],htmlAttributeValues:null}]},"aria-valuemax":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["max"],htmlAttributeValues:null}]},"aria-valuemin":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["min"],htmlAttributeValues:null}]},"aria-readonly":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"false","false"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"true","true"]}]},"aria-required":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["required"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["required"],htmlAttributeValues:null}]},"aria-colspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["colspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["colspan"],htmlAttributeValues:null}]},"aria-rowspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["rowspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["rowspan"],htmlAttributeValues:null}]}},e.containers=[],e}();t.ARIADefinitions=i;var a=[];for(var n in i.designPatterns){var r=i.designPatterns[n].container;if(null!==r)for(var l=0,o=r;l<o.length;l++){var s=o[l];-1==a.indexOf(s)&&a.push(s)}}i.containers=a},9955(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAMapper=void 0;var r=i(9910),l=i(3103),o=i(1686),s=i(7139),u=i(7011),d=i(5279),c=i(1560),m=i(4566),p=i(3864),h=i(1950),g=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.childrenCanHaveRole=function(e,t){return!(t in r.ARIADefinitions.designPatterns&&r.ARIADefinitions.designPatterns[t].presentationalChildren)},t.prototype.getRole=function(e){return t.nodeToRole(e)},t.prototype.getNamespace=function(){return"aria"},t.prototype.getAttributes=function(e){var i={};if(1===e.nodeType){var a=m.CacheUtil.getCache(e,"ARIAMapper::getAttributes",void 0);if(void 0!==a)return a;for(var n=e,r=0;r<n.attributes.length;++r){var l=n.attributes[r],o=l.name.toLowerCase();o.startsWith("aria-")&&(i[o.substring(5)]=l.nodeValue)}var s=e.nodeName.toLowerCase();t.applyAttrRole(n,"global",i),t.applyAttrRole(n,s,i),m.CacheUtil.setCache(e,"ARIAMapper::getAttributes",i)}else if(3===e.nodeType){var u=t.textAttrValueCalculators;for(var d in u){var c=u[d](e);null!=c&&(i[d]=c)}}return i},t.applyAttrRole=function(e,i,a){var n=t.elemAttrValueCalculators;if(i in n)for(var r in n[i])if(!(r in a)){var l=n[i][r];null!=l&&("string"!=typeof l&&(l=l(e)),a[r]=l)}},t.getAriaOwnedBy=function(e){var t=d.FragmentUtil.getOwnerFragment(e);if(!m.CacheUtil.getCache(t,"ARIAMapper::precalcOwned",!1)){for(var i=t.querySelectorAll("[aria-owns]"),a=0;a<i.length;++a)for(var n=i[a],r=n.getAttribute("aria-owns").split(/ +/g),l=function(e){var i=t.getElementById(r[e]);if(i&&!o.DOMUtil.sameNode(n,i)){for(var a=[],l=i.querySelectorAll("[aria-owns]"),s=0;s<l.length;++s)for(var u=l[s].getAttribute("aria-owns").split(/ +/g),d=0;d<u.length;++d){var c=t.getElementById(u[d]);c&&a.push(c)}if(0===a.length)return m.CacheUtil.setCache(i,"aria-owned",n),"continue";for(var h=n,g=!1;null!==h;){if(a.some(function(e){return o.DOMUtil.sameNode(h,e)})){g=!0;break}h=p.DOMWalker.parentElement(h)}g||m.CacheUtil.setCache(i,"aria-owned",n)}},s=0;s<r.length;++s)l(s);m.CacheUtil.setCache(t,"ARIAMapper::precalcOwned",!0)}return m.CacheUtil.getCache(e,"aria-owned",null)},t.prototype.getNodeHierarchy=function(e){if(!e)return[];if(1!==e.nodeType){for(var i=(s=this.getNodeHierarchy(p.DOMWalker.parentElement(e))).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0},a=[],n=0,r=s;n<r.length;n++){var l=r[n];a.push(l)}return a.push({attributes:{},bounds:this.getBounds(e),namespace:this.getNamespace(),node:e,role:this.getRole(e)||null,rolePath:i.rolePath+"/"+(this.getRole(e)||null),roleCount:{},childrenCanHaveRole:i.childrenCanHaveRole}),a}var o=e;if(!(a=m.CacheUtil.getCache(o,"ARIAMapper::getNodeHierarchy",null))){var s,u=t.getAriaOwnedBy(o);for(u||(u=p.DOMWalker.parentElement(o));u&&1!==u.nodeType;)u=p.DOMWalker.parentElement(o);for(i=(s=u?this.getNodeHierarchy(u):[]).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0};null===i.role;)i=(s=(u=t.getAriaOwnedBy(u)||p.DOMWalker.parentElement(u))?this.getNodeHierarchy(u):[])[s.length-1];var d={attributes:1===o.nodeType?this.getAttributes(o):{},bounds:this.getBounds(o),namespace:this.getNamespace(),node:o,role:this.getRole(o)||null,rolePath:"",roleCount:{},childrenCanHaveRole:!0};i.childrenCanHaveRole?d.childrenCanHaveRole=i.childrenCanHaveRole&&this.childrenCanHaveRole(o,d.role):d.role=null,null!==d.role?(i.roleCount[d.role]=(i.roleCount[d.role]||0)+1,d.rolePath=i.rolePath+"/"+d.role+"["+i.roleCount[d.role]+"]"):d.rolePath=i.rolePath,a=[];for(var c=0,h=s;c<h.length;c++)l=h[c],a.push(l);a.push(d),m.CacheUtil.setCache(o,"ARIAMapper::getNodeHierarchy",a)}return a},t.prototype.reset=function(e){t.nameComputationId=0,this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var i,a=e;i=p.DOMWalker.parentNode(a);)a=i;var n=new c.ARIAWalker(a,!1,a);do{1===n.node.nodeType&&this.getNodeHierarchy(n.node)}while(n.nextNode())},t.prototype.openScope=function(e){null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e);for(var t=0;t<this.hierarchyResults.length;++t)this.hierarchyResults[t].role&&"/"===this.hierarchyResults[t].role[0]&&(this.hierarchyResults[t].role=this.hierarchyResults[t].role?this.hierarchyResults[t].role.substring(1):null);return this.hierarchyResults},t.prototype.pushHierarchy=function(e){var t,i=(t=this.getNodeHierarchy(e))[t.length-1];this.hierarchyRole.push(i.role),null!==i.role&&this.hierarchyPath.push(i),this.hierarchyResults=t},t.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}if(t.length>0){t[t.length-1].role="/"+t[t.length-1].role;var r=p.DOMWalker.parentElement(e);this.hierarchyResults=r?m.CacheUtil.getCache(r,"ARIAMapper::getNodeInfo",[]):[]}return t},t.nodeToRole=function(e){if(3===e.nodeType)return"text";if(1!==e.nodeType)return null;var t=e;if(!t||1!==t.nodeType)return null;if(t.hasAttribute("role")&&t.getAttribute("role").trim().length>0)for(var i=0,a=t.getAttribute("role").trim().split(" ");i<a.length;i++){var n=a[i];if("presentation"===n||"none"===n){if(!s.CommonUtil.isFocusable(t))return null}else if(n in r.ARIADefinitions.designPatterns)return n}var l=u.AriaUtil.getImplicitRole(t),o=l&&0!==l.length?l[0]:null;return"presentation"===o||"none"===o?null:o},t.elemAttrValueCalculators={global:{name:function(e){var t;return null===(t=h.AccNameUtil.computeAccessibleName(e))||void 0===t?void 0:t.name}},datalist:{multiselectable:function(e){var t=e.getAttribute("id");return t&&t.length>0?(e.ownerDocument.querySelector("input[list='"+t+"']"),""+(e.getAttribute("multiple")&&("true"==e.getAttribute("multiple")||""==e.getAttribute("multiple")))):null}},h1:{level:"1"},h2:{level:"2"},h3:{level:"3"},h4:{level:"4"},h5:{level:"5"},h6:{level:"6"},input:{checked:function(e){var t=e.getAttribute("type");return"checkbox"===t||"radio"===t?""+e.checked:null},setsize:function(e){return null},posinset:function(e){return null},owns:function(e){return null}},keygen:{multiselectable:"false"},li:{setsize:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::otherlis",function(){return t.querySelectorAll("ol li, ul li, menu li")});return""+(i.length-a.length)},posinset:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;for(var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=0,n=0;n<i.length;++n){var r=i[n];if(o.DOMUtil.sameNode(t,o.DOMUtil.getAncestor(r,["ol","ul","menu"])))return""+a;++a}return null}},menuitem:{checked:function(e){return""+!(!e.getAttribute("checked")||"true"!=e.getAttribute("checked")&&""!=e.getAttribute("checked"))}},option:{selected:function(e){return""+!(!e.getAttribute("selected")||"true"!=e.getAttribute("selected")&&""!=e.getAttribute("selected"))}},progress:{valuemax:function(e){return e.getAttribute("max")||"1"},valuemin:function(e){return"0"},valuenow:function(e){return e.getAttribute("value")}}},t.textAttrValueCalculators={name:function(e){return e.nodeValue}},t.nameComputationId=0,t}(l.CommonMapper);t.ARIAMapper=g},1560(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAWalker=void 0;var a=i(5279),n=i(9955),r=i(3946),l=i(3864),o=function(){function e(e,t,i){this.root=i||e,9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,this.bEndTag=null!=t&&1==t}return e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var e=!1;do{if(e=!1,this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var t=this.node.slotOwner,i=this.node.slotIndex+1;i<t.assignedNodes().length?(this.node=t.assignedNodes()[i],this.bEndTag=!1):(this.node=t,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(l.DOMWalker.nextSiblingNotOwnedBySlot(this.node))this.node=l.DOMWalker.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var o=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var s=o.indexOf(this.node.getAttribute("id"));s===o.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[s+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!0}}else{var u=this.node,d=this.node,c=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&r.VisUtil.isNodeVisible(u)&&u.contentDocument&&u.contentDocument.documentElement){var m=this.node;this.node=u.contentDocument.documentElement,this.node.ownerElement=m}else 1===this.node.nodeType&&r.VisUtil.isNodeVisible(d)&&d.shadowRoot&&d.shadowRoot.firstChild?(m=this.node,this.node=d.shadowRoot,this.node.ownerElement=m,l.DOMWalker.assignSlots(this.node)):1===this.node.nodeType&&"slot"===d.nodeName.toLowerCase()&&c.assignedNodes().length>0?this.node=c.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!l.DOMWalker.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=l.DOMWalker.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e.prototype.prevNode=function(){var e=!1;do{if(e=!1,this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&r.VisUtil.isNodeVisible(t)&&t.contentDocument&&t.contentDocument.documentElement){var o=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=o}else 1===this.node.nodeType&&r.VisUtil.isNodeVisible(i)&&i.shadowRoot&&i.shadowRoot.lastChild?(o=this.node,this.node=i.shadowRoot,this.node.ownerElement=o,l.DOMWalker.assignSlots(this.node)):1!==this.node.nodeType&&11!==this.node.nodeType||!l.DOMWalker.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=l.DOMWalker.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(l.DOMWalker.previousSiblingNotOwnedBySlot(this.node))this.node=l.DOMWalker.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var s=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var u=s.indexOf(this.node.getAttribute("id"));u===s.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[u+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e}();t.ARIAWalker=o},6858(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AncestorUtil=void 0;var i=function(){function e(){}return e.isPresentationFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase()&&("presentation"===i.getAttribute("role")||"true"===i.getAttribute("aria-hidden")))return!0}return!1},e.isFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase())return!0}return!1},e}();t.AncestorUtil=i},5279(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FragmentUtil=void 0;var i=function(){function e(){}return e.getOwnerFragment=function(e){for(var t=e;t.parentNode&&(t=t.parentNode);)if(11===t.nodeType)return t;return e.ownerDocument},e.getById=function(e,t){return this.getOwnerFragment(e).getElementById(t)},e.getAncestor=function(e,t){var i=e.dom.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e.getAncestorWithRole=function(e,t){var i=e.aria.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e}();t.FragmentUtil=i},1043(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LangUtil=void 0;var i=[["aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","aaa","aab","aac","aad","aae","aaf","aag","aah","aai","aak","aal","aam","aan","aao","aap","aaq","aas","aat","aau","aav","aaw","aax","aaz","aba","abb","abc","abd","abe","abf","abg","abh","abi","abj","abl","abm","abn","abo","abp","abq","abr","abs","abt","abu","abv","abw","abx","aby","abz","aca","acb","acd","ace","acf","ach","aci","ack","acl","acm","acn","acp","acq","acr","acs","act","acu","acv","acw","acx","acy","acz","ada","adb","add","ade","adf","adg","adh","adi","adj","adl","adn","ado","adp","adq","adr","ads","adt","adu","adw","adx","ady","adz","aea","aeb","aec","aed","aee","aek","ael","aem","aen","aeq","aer","aes","aeu","aew","aey","aez","afa","afb","afd","afe","afg","afh","afi","afk","afn","afo","afp","afs","aft","afu","afz","aga","agb","agc","agd","age","agf","agg","agh","agi","agj","agk","agl","agm","agn","ago","agp","agq","agr","ags","agt","agu","agv","agw","agx","agy","agz","aha","ahb","ahg","ahh","ahi","ahk","ahl","ahm","ahn","aho","ahp","ahr","ahs","aht","aia","aib","aic","aid","aie","aif","aig","aih","aii","aij","aik","ail","aim","ain","aio","aip","aiq","air","ais","ait","aiw","aix","aiy","aja","ajg","aji","ajn","ajp","ajt","aju","ajw","ajz","akb","akc","akd","ake","akf","akg","akh","aki","akj","akk","akl","akm","ako","akp","akq","akr","aks","akt","aku","akv","akw","akx","aky","akz","ala","alc","ald","ale","alf","alg","alh","ali","alj","alk","all","alm","aln","alo","alp","alq","alr","als","alt","alu","alv","alw","alx","aly","alz","ama","amb","amc","ame","amf","amg","ami","amj","amk","aml","amm","amn","amo","amp","amq","amr","ams","amt","amu","amv","amw","amx","amy","amz","ana","anb","anc","and","ane","anf","ang","anh","ani","anj","ank","anl","anm","ann","ano","anp","anq","anr","ans","ant","anu","anv","anw","anx","any","anz","aoa","aob","aoc","aod","aoe","aof","aog","aoh","aoi","aoj","aok","aol","aom","aon","aor","aos","aot","aou","aox","aoz","apa","apb","apc","apd","ape","apf","apg","aph","api","apj","apk","apl","apm","apn","apo","app","apq","apr","aps","apt","apu","apv","apw","apx","apy","apz","aqa","aqc","aqd","aqg","aqk","aql","aqm","aqn","aqp","aqr","aqt","aqz","arb","arc","ard","are","arh","ari","arj","ark","arl","arn","aro","arp","arq","arr","ars","art","aru","arv","arw","arx","ary","arz","asa","asb","asc","asd","ase","asf","asg","ash","asi","asj","ask","asl","asn","aso","asp","asq","asr","ass","ast","asu","asv","asw","asx","asy","asz","ata","atb","atc","atd","ate","atg","ath","ati","atj","atk","atl","atm","atn","ato","atp","atq","atr","ats","att","atu","atv","atw","atx","aty","atz","aua","aub","auc","aud","aue","auf","aug","auh","aui","auj","auk","aul","aum","aun","auo","aup","auq","aur","aus","aut","auu","auw","aux","auy","auz","avb","avd","avi","avk","avl","avm","avn","avo","avs","avt","avu","avv","awa","awb","awc","awd","awe","awg","awh","awi","awk","awm","awn","awo","awr","aws","awt","awu","awv","aww","awx","awy","axb","axe","axg","axk","axl","axm","axx","aya","ayb","ayc","ayd","aye","ayg","ayh","ayi","ayk","ayl","ayn","ayo","ayp","ayq","ayr","ays","ayt","ayu","ayx","ayy","ayz","aza","azb","azc","azd","azg","azj","azm","azn","azo","azt","azz"],["ba","be","bg","bh","bi","bm","bn","bo","br","bs","baa","bab","bac","bad","bae","baf","bag","bah","bai","baj","bal","ban","bao","bap","bar","bas","bat","bau","bav","baw","bax","bay","baz","bba","bbb","bbc","bbd","bbe","bbf","bbg","bbh","bbi","bbj","bbk","bbl","bbm","bbn","bbo","bbp","bbq","bbr","bbs","bbt","bbu","bbv","bbw","bbx","bby","bbz","bca","bcb","bcc","bcd","bce","bcf","bcg","bch","bci","bcj","bck","bcl","bcm","bcn","bco","bcp","bcq","bcr","bcs","bct","bcu","bcv","bcw","bcy","bcz","bda","bdb","bdc","bdd","bde","bdf","bdg","bdh","bdi","bdj","bdk","bdl","bdm","bdn","bdo","bdp","bdq","bdr","bds","bdt","bdu","bdv","bdw","bdx","bdy","bdz","bea","beb","bec","bed","bee","bef","beg","beh","bei","bej","bek","bem","beo","bep","beq","ber","bes","bet","beu","bev","bew","bex","bey","bez","bfa","bfb","bfc","bfd","bfe","bff","bfg","bfh","bfi","bfj","bfk","bfl","bfm","bfn","bfo","bfp","bfq","bfr","bfs","bft","bfu","bfw","bfx","bfy","bfz","bga","bgb","bgc","bgd","bge","bgf","bgg","bgi","bgj","bgk","bgl","bgm","bgn","bgo","bgp","bgq","bgr","bgs","bgt","bgu","bgv","bgw","bgx","bgy","bgz","bha","bhb","bhc","bhd","bhe","bhf","bhg","bhh","bhi","bhj","bhk","bhl","bhm","bhn","bho","bhp","bhq","bhr","bhs","bht","bhu","bhv","bhw","bhx","bhy","bhz","bia","bib","bic","bid","bie","bif","big","bij","bik","bil","bim","bin","bio","bip","biq","bir","bit","biu","biv","biw","bix","biy","biz","bja","bjb","bjc","bjd","bje","bjf","bjg","bjh","bji","bjj","bjk","bjl","bjm","bjn","bjo","bjp","bjq","bjr","bjs","bjt","bju","bjv","bjw","bjx","bjy","bjz","bka","bkb","bkc","bkd","bkf","bkg","bkh","bki","bkj","bkk","bkl","bkm","bkn","bko","bkp","bkq","bkr","bks","bkt","bku","bkv","bkw","bkx","bky","bkz","bla","blb","blc","bld","ble","blf","blg","blh","bli","blj","blk","bll","blm","bln","blo","blp","blq","blr","bls","blt","blv","blw","blx","bly","blz","bma","bmb","bmc","bmd","bme","bmf","bmg","bmh","bmi","bmj","bmk","bml","bmm","bmn","bmo","bmp","bmq","bmr","bms","bmt","bmu","bmv","bmw","bmx","bmy","bmz","bna","bnb","bnc","bnd","bne","bnf","bng","bni","bnj","bnk","bnl","bnm","bnn","bno","bnp","bnq","bnr","bns","bnt","bnu","bnv","bnw","bnx","bny","bnz","boa","bob","boe","bof","bog","boh","boi","boj","bok","bol","bom","bon","boo","bop","boq","bor","bot","bou","bov","bow","box","boy","boz","bpa","bpb","bpd","bpe","bpg","bph","bpi","bpj","bpk","bpl","bpm","bpn","bpo","bpp","bpq","bpr","bps","bpt","bpu","bpv","bpw","bpx","bpy","bpz","bqa","bqb","bqc","bqd","bqf","bqg","bqh","bqi","bqj","bqk","bql","bqm","bqn","bqo","bqp","bqq","bqr","bqs","bqt","bqu","bqv","bqw","bqx","bqy","bqz","bra","brb","brc","brd","brf","brg","brh","bri","brj","brk","brl","brm","brn","bro","brp","brq","brr","brs","brt","bru","brv","brw","brx","bry","brz","bsa","bsb","bsc","bse","bsf","bsg","bsh","bsi","bsj","bsk","bsl","bsm","bsn","bso","bsp","bsq","bsr","bss","bst","bsu","bsv","bsw","bsx","bsy","bta","btb","btc","btd","bte","btf","btg","bth","bti","btj","btk","btl","btm","btn","bto","btp","btq","btr","bts","btt","btu","btv","btw","btx","bty","btz","bua","bub","buc","bud","bue","buf","bug","buh","bui","buj","buk","bum","bun","buo","bup","buq","bus","but","buu","buv","buw","bux","buy","buz","bva","bvb","bvc","bvd","bve","bvf","bvg","bvh","bvi","bvj","bvk","bvl","bvm","bvn","bvo","bvp","bvq","bvr","bvt","bvu","bvv","bvw","bvx","bvy","bvz","bwa","bwb","bwc","bwd","bwe","bwf","bwg","bwh","bwi","bwj","bwk","bwl","bwm","bwn","bwo","bwp","bwq","bwr","bws","bwt","bwu","bww","bwx","bwy","bwz","bxa","bxb","bxc","bxd","bxe","bxf","bxg","bxh","bxi","bxj","bxk","bxl","bxm","bxn","bxo","bxp","bxq","bxr","bxs","bxu","bxv","bxw","bxx","bxz","bya","byb","byc","byd","bye","byf","byg","byh","byi","byj","byk","byl","bym","byn","byo","byp","byq","byr","bys","byt","byv","byw","byx","byy","byz","bza","bzb","bzc","bzd","bze","bzf","bzg","bzh","bzi","bzj","bzk","bzl","bzm","bzn","bzo","bzp","bzq","bzr","bzs","bzt","bzu","bzv","bzw","bzx","bzy","bzz"],["ca","ce","ch","co","cr","cs","cu","cv","cy","caa","cab","cac","cad","cae","caf","cag","cah","cai","caj","cak","cal","cam","can","cao","cap","caq","car","cas","cau","cav","caw","cax","cay","caz","cba","cbb","cbc","cbd","cbe","cbg","cbh","cbi","cbj","cbk","cbl","cbn","cbo","cbq","cbr","cbs","cbt","cbu","cbv","cbw","cby","cca","ccc","ccd","cce","ccg","cch","ccj","ccl","ccm","ccn","cco","ccp","ccq","ccr","ccs","cda","cdc","cdd","cde","cdf","cdg","cdh","cdi","cdj","cdm","cdn","cdo","cdr","cds","cdy","cdz","cea","ceb","ceg","cek","cel","cen","cet","cey","cfa","cfd","cfg","cfm","cga","cgc","cgg","cgk","chb","chc","chd","chf","chg","chh","chj","chk","chl","chm","chn","cho","chp","chq","chr","cht","chw","chx","chy","chz","cia","cib","cic","cid","cie","cih","cik","cim","cin","cip","cir","ciw","ciy","cja","cje","cjh","cji","cjk","cjm","cjn","cjo","cjp","cjr","cjs","cjv","cjy","cka","ckb","ckh","ckl","ckm","ckn","cko","ckq","ckr","cks","ckt","cku","ckv","ckx","cky","ckz","cla","clc","cld","cle","clh","cli","clj","clk","cll","clm","clo","clt","clu","clw","cly","cma","cmc","cme","cmg","cmi","cmk","cml","cmm","cmn","cmo","cmr","cms","cmt","cna","cnb","cnc","cng","cnh","cni","cnk","cnl","cno","cnp","cnr","cns","cnt","cnu","cnw","cnx","coa","cob","coc","cod","coe","cof","cog","coh","coj","cok","col","com","con","coo","cop","coq","cot","cou","cov","cow","cox","coy","coz","cpa","cpb","cpc","cpe","cpf","cpg","cpi","cpn","cpo","cpp","cps","cpu","cpx","cpy","cqd","cqu","cra","crb","crc","crd","crf","crg","crh","cri","crj","crk","crl","crm","crn","cro","crp","crq","crr","crs","crt","crv","crw","crx","cry","crz","csa","csb","csc","csd","cse","csf","csg","csh","csi","csj","csk","csl","csm","csn","cso","csp","csq","csr","css","cst","csu","csv","csw","csx","csy","csz","cta","ctc","ctd","cte","ctg","cth","ctl","ctm","ctn","cto","ctp","cts","ctt","ctu","cty","ctz","cua","cub","cuc","cug","cuh","cui","cuj","cuk","cul","cum","cuo","cup","cuq","cur","cus","cut","cuu","cuv","cuw","cux","cuy","cvg","cvn","cwa","cwb","cwd","cwe","cwg","cwt","cya","cyb","cyo","czh","czk","czn","czo","czt"],["da","de","dv","dz","daa","dac","dad","dae","daf","dag","dah","dai","daj","dak","dal","dam","dao","dap","daq","dar","das","dau","dav","daw","dax","day","daz","dba","dbb","dbd","dbe","dbf","dbg","dbi","dbj","dbl","dbm","dbn","dbo","dbp","dbq","dbr","dbt","dbu","dbv","dbw","dby","dcc","dcr","dda","ddd","dde","ddg","ddi","ddj","ddn","ddo","ddr","dds","ddw","dec","ded","dee","def","deg","deh","dei","dek","del","dem","den","dep","deq","der","des","dev","dez","dga","dgb","dgc","dgd","dge","dgg","dgh","dgi","dgk","dgl","dgn","dgo","dgr","dgs","dgt","dgu","dgw","dgx","dgz","dha","dhd","dhg","dhi","dhl","dhm","dhn","dho","dhr","dhs","dhu","dhv","dhw","dhx","dia","dib","dic","did","dif","dig","dih","dii","dij","dik","dil","dim","din","dio","dip","diq","dir","dis","dit","diu","diw","dix","diy","diz","dja","djb","djc","djd","dje","djf","dji","djj","djk","djl","djm","djn","djo","djr","dju","djw","dka","dkg","dkk","dkl","dkr","dks","dkx","dlg","dlk","dlm","dln","dma","dmb","dmc","dmd","dme","dmf","dmg","dmk","dml","dmm","dmn","dmo","dmr","dms","dmu","dmv","dmw","dmx","dmy","dna","dnd","dne","dng","dni","dnj","dnk","dnn","dno","dnr","dnt","dnu","dnv","dnw","dny","doa","dob","doc","doe","dof","doh","doi","dok","dol","don","doo","dop","doq","dor","dos","dot","dov","dow","dox","doy","doz","dpp","dra","drb","drc","drd","dre","drg","drh","dri","drl","drn","dro","drq","drr","drs","drt","dru","drw","dry","dsb","dse","dsh","dsi","dsl","dsn","dso","dsq","dta","dtb","dtd","dth","dti","dtk","dtm","dtn","dto","dtp","dtr","dts","dtt","dtu","dty","dua","dub","duc","dud","due","duf","dug","duh","dui","duj","duk","dul","dum","dun","duo","dup","duq","dur","dus","duu","duv","duw","dux","duy","duz","dva","dwa","dwk","dwl","dwr","dws","dwu","dww","dwy","dwz","dya","dyb","dyd","dyg","dyi","dym","dyn","dyo","dyu","dyy","dza","dzd","dze","dzg","dzl","dzn"],["ee","el","en","eo","es","et","eu","eaa","ebc","ebg","ebk","ebo","ebr","ebu","ecr","ecs","ecy","eee","efa","efe","efi","ega","egl","ego","egx","egy","ehs","ehu","eip","eit","eiv","eja","eka","ekc","eke","ekg","eki","ekk","ekl","ekm","eko","ekp","ekr","eky","ele","elh","eli","elk","elm","elo","elp","elu","elx","ema","emb","eme","emg","emi","emk","emm","emn","emo","emp","emq","ems","emu","emw","emx","emy","emz","ena","enb","enc","end","enf","enh","enl","enm","enn","eno","enq","enr","enu","env","enw","enx","eot","epi","era","erg","erh","eri","erk","ero","err","ers","ert","erw","ese","esg","esh","esi","esk","esl","esm","esn","eso","esq","ess","esu","esx","esy","etb","etc","eth","etn","eto","etr","ets","ett","etu","etx","etz","euq","eve","evh","evn","ewo","ext","eya","eyo","eza","eze"],["fa","ff","fi","fj","fo","fr","fy","faa","fab","fad","faf","fag","fah","fai","faj","fak","fal","fam","fan","fap","far","fat","fau","fax","fay","faz","fbl","fcs","fer","ffi","ffm","fgr","fia","fie","fif","fil","fip","fir","fit","fiu","fiw","fkk","fkv","fla","flh","fli","fll","fln","flr","fly","fmp","fmu","fnb","fng","fni","fod","foi","fom","fon","for","fos","fox","fpe","fqs","frc","frd","frk","frm","fro","frp","frq","frr","frs","frt","fse","fsl","fss","fub","fuc","fud","fue","fuf","fuh","fui","fuj","fum","fun","fuq","fur","fut","fuu","fuv","fuy","fvr","fwa","fwe"],["ga","gd","gl","gn","gu","gv","gaa","gab","gac","gad","gae","gaf","gag","gah","gai","gaj","gak","gal","gam","gan","gao","gap","gaq","gar","gas","gat","gau","gav","gaw","gax","gay","gaz","gba","gbb","gbc","gbd","gbe","gbf","gbg","gbh","gbi","gbj","gbk","gbl","gbm","gbn","gbo","gbp","gbq","gbr","gbs","gbu","gbv","gbw","gbx","gby","gbz","gcc","gcd","gce","gcf","gcl","gcn","gcr","gct","gda","gdb","gdc","gdd","gde","gdf","gdg","gdh","gdi","gdj","gdk","gdl","gdm","gdn","gdo","gdq","gdr","gds","gdt","gdu","gdx","gea","geb","gec","ged","gef","geg","geh","gei","gej","gek","gel","gem","geq","ges","gev","gew","gex","gey","gez","gfk","gft","gfx","gga","ggb","ggd","gge","ggg","ggk","ggl","ggn","ggo","ggr","ggt","ggu","ggw","gha","ghc","ghe","ghh","ghk","ghl","ghn","gho","ghr","ghs","ght","gia","gib","gic","gid","gie","gig","gih","gii","gil","gim","gin","gio","gip","giq","gir","gis","git","giu","giw","gix","giy","giz","gji","gjk","gjm","gjn","gjr","gju","gka","gkd","gke","gkn","gko","gkp","gku","glb","glc","gld","glh","gli","glj","glk","gll","glo","glr","glu","glw","gly","gma","gmb","gmd","gme","gmg","gmh","gml","gmm","gmn","gmq","gmr","gmu","gmv","gmw","gmx","gmy","gmz","gna","gnb","gnc","gnd","gne","gng","gnh","gni","gnj","gnk","gnl","gnm","gnn","gno","gnq","gnr","gnt","gnu","gnw","gnz","goa","gob","goc","god","goe","gof","gog","goh","goi","goj","gok","gol","gom","gon","goo","gop","goq","gor","gos","got","gou","gow","gox","goy","goz","gpa","gpe","gpn","gqa","gqi","gqn","gqr","gqu","gra","grb","grc","grd","grg","grh","gri","grj","grk","grm","gro","grq","grr","grs","grt","gru","grv","grw","grx","gry","grz","gse","gsg","gsl","gsm","gsn","gso","gsp","gss","gsw","gta","gti","gtu","gua","gub","guc","gud","gue","guf","gug","guh","gui","guk","gul","gum","gun","guo","gup","guq","gur","gus","gut","guu","guv","guw","gux","guz","gva","gvc","gve","gvf","gvj","gvl","gvm","gvn","gvo","gvp","gvr","gvs","gvy","gwa","gwb","gwc","gwd","gwe","gwf","gwg","gwi","gwj","gwm","gwn","gwr","gwt","gwu","gww","gwx","gxx","gya","gyb","gyd","gye","gyf","gyg","gyi","gyl","gym","gyn","gyo","gyr","gyy","gyz","gza","gzi","gzn"],["ha","he","hi","ho","hr","ht","hu","hy","hz","haa","hab","hac","had","hae","haf","hag","hah","hai","haj","hak","hal","ham","han","hao","hap","haq","har","has","hav","haw","hax","hay","haz","hba","hbb","hbn","hbo","hbu","hca","hch","hdn","hds","hdy","hea","hed","heg","heh","hei","hem","hgm","hgw","hhi","hhr","hhy","hia","hib","hid","hif","hig","hih","hii","hij","hik","hil","him","hio","hir","hit","hiw","hix","hji","hka","hke","hkh","hkk","hkn","hks","hla","hlb","hld","hle","hlt","hlu","hma","hmb","hmc","hmd","hme","hmf","hmg","hmh","hmi","hmj","hmk","hml","hmm","hmn","hmp","hmq","hmr","hms","hmt","hmu","hmv","hmw","hmx","hmy","hmz","hna","hnd","hne","hng","hnh","hni","hnj","hnn","hno","hns","hnu","hoa","hob","hoc","hod","hoe","hoh","hoi","hoj","hok","hol","hom","hoo","hop","hor","hos","hot","hov","how","hoy","hoz","hpo","hps","hra","hrc","hre","hrk","hrm","hro","hrp","hrr","hrt","hru","hrw","hrx","hrz","hsb","hsh","hsl","hsn","hss","hti","hto","hts","htu","htx","hub","huc","hud","hue","huf","hug","huh","hui","huj","huk","hul","hum","huo","hup","huq","hur","hus","hut","huu","huv","huw","hux","huy","huz","hvc","hve","hvk","hvn","hvv","hwa","hwc","hwo","hya","hyw","hyx"],["ia","id","ie","ig","ii","ik","in","io","is","it","iu","iw","iai","ian","iap","iar","iba","ibb","ibd","ibe","ibg","ibh","ibi","ibl","ibm","ibn","ibr","ibu","iby","ica","ich","icl","icr","ida","idb","idc","idd","ide","idi","idr","ids","idt","idu","ifa","ifb","ife","iff","ifk","ifm","ifu","ify","igb","ige","igg","igl","igm","ign","igo","igs","igw","ihb","ihi","ihp","ihw","iin","iir","ijc","ije","ijj","ijn","ijo","ijs","ike","iki","ikk","ikl","iko","ikp","ikr","iks","ikt","ikv","ikw","ikx","ikz","ila","ilb","ilg","ili","ilk","ill","ilm","ilo","ilp","ils","ilu","ilv","ilw","ima","ime","imi","iml","imn","imo","imr","ims","imy","inb","inc","ine","ing","inh","inj","inl","inm","inn","ino","inp","ins","int","inz","ior","iou","iow","ipi","ipo","iqu","iqw","ira","ire","irh","iri","irk","irn","iro","irr","iru","irx","iry","isa","isc","isd","ise","isg","ish","isi","isk","ism","isn","iso","isr","ist","isu","itb","itc","itd","ite","iti","itk","itl","itm","ito","itr","its","itt","itv","itw","itx","ity","itz","ium","ivb","ivv","iwk","iwm","iwo","iws","ixc","ixl","iya","iyo","iyx","izh","izi","izr","izz"],["ja","ji","jv","jw","jaa","jab","jac","jad","jae","jaf","jah","jaj","jak","jal","jam","jan","jao","jaq","jar","jas","jat","jau","jax","jay","jaz","jbe","jbi","jbj","jbk","jbm","jbn","jbo","jbr","jbt","jbu","jbw","jcs","jct","jda","jdg","jdt","jeb","jee","jeg","jeh","jei","jek","jel","jen","jer","jet","jeu","jgb","jge","jgk","jgo","jhi","jhs","jia","jib","jic","jid","jie","jig","jih","jii","jil","jim","jio","jiq","jit","jiu","jiv","jiy","jje","jjr","jka","jkm","jko","jkp","jkr","jks","jku","jle","jls","jma","jmb","jmc","jmd","jmi","jml","jmn","jmr","jms","jmw","jmx","jna","jnd","jng","jni","jnj","jnl","jns","job","jod","jog","jor","jos","jow","jpa","jpr","jpx","jqr","jra","jrb","jrr","jrt","jru","jsl","jua","jub","juc","jud","juh","jui","juk","jul","jum","jun","juo","jup","jur","jus","jut","juu","juw","juy","jvd","jvn","jwi","jya","jye","jyy"],["ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","kaa","kab","kac","kad","kae","kaf","kag","kah","kai","kaj","kak","kam","kao","kap","kaq","kar","kav","kaw","kax","kay","kba","kbb","kbc","kbd","kbe","kbf","kbg","kbh","kbi","kbj","kbk","kbl","kbm","kbn","kbo","kbp","kbq","kbr","kbs","kbt","kbu","kbv","kbw","kbx","kby","kbz","kca","kcb","kcc","kcd","kce","kcf","kcg","kch","kci","kcj","kck","kcl","kcm","kcn","kco","kcp","kcq","kcr","kcs","kct","kcu","kcv","kcw","kcx","kcy","kcz","kda","kdc","kdd","kde","kdf","kdg","kdh","kdi","kdj","kdk","kdl","kdm","kdn","kdo","kdp","kdq","kdr","kdt","kdu","kdv","kdw","kdx","kdy","kdz","kea","keb","kec","ked","kee","kef","keg","keh","kei","kej","kek","kel","kem","ken","keo","kep","keq","ker","kes","ket","keu","kev","kew","kex","key","kez","kfa","kfb","kfc","kfd","kfe","kff","kfg","kfh","kfi","kfj","kfk","kfl","kfm","kfn","kfo","kfp","kfq","kfr","kfs","kft","kfu","kfv","kfw","kfx","kfy","kfz","kga","kgb","kgc","kgd","kge","kgf","kgg","kgh","kgi","kgj","kgk","kgl","kgm","kgn","kgo","kgp","kgq","kgr","kgs","kgt","kgu","kgv","kgw","kgx","kgy","kha","lyg","khb","khc","khd","khe","khf","khg","khh","khi","khj","khk","khl","khn","kho","khp","khq","khr","khs","kht","khu","khv","khw","khx","khy","khz","kia","kib","kic","kid","kie","kif","kig","kih","kii","kij","kil","kim","kio","kip","kiq","kis","kit","kiu","kiv","kiw","kix","kiy","kiz","kja","kjb","kjc","kjd","kje","kjf","kjg","kjh","kji","kjj","kjk","kjl","kjm","kjn","kjo","kjp","kjq","kjr","kjs","kjt","kju","kjv","kjx","kjy","kjz","kka","kkb","kkc","kkd","kke","kkf","kkg","kkh","kki","kkj","kkk","kkl","kkm","kkn","kko","kkp","kkq","kkr","kks","kkt","kku","kkv","kkw","kkx","kky","kkz","kla","klb","klc","kld","kle","klf","klg","klh","kli","klj","klk","kll","klm","kln","klo","klp","klq","klr","kls","klt","klu","klv","klw","klx","kly","klz","kma","kmb","kmc","kmd","kme","kmf","kmg","kmh","kmi","kmj","kmk","kml","kmm","kmn","kmo","kmp","kmq","kmr","kms","kmt","kmu","kmv","kmw","kmx","kmy","kmz","kna","knb","knc","knd","kne","knf","kng","kni","knj","knk","knl","knm","knn","kno","knp","knq","knr","kns","knt","knu","knv","knw","knx","kny","knz","koa","koc","kod","koe","kof","kog","koh","koi","koj","kok","kol","koo","kop","koq","kos","kot","kou","kov","kow","kox","koy","koz","kpa","kpb","kpc","kpd","kpe","kpf","kpg","kph","kpi","kpj","kpk","kpl","kpm","kpn","kpo","kpp","kpq","kpr","kps","kpt","kpu","kpv","kpw","kpx","kpy","kpz","kqa","kqb","kqc","kqd","kqe","kqf","kqg","kqh","kqi","kqj","kqk","kql","kqm","kqn","kqo","kqp","kqq","kqr","kqs","kqt","kqu","kqv","kqw","kqx","kqy","kqz","kra","krb","krc","krd","kre","krf","krh","kri","krj","krk","krl","krm","krn","kro","krp","krr","krs","krt","kru","krv","krw","krx","kry","krz","ksa","ksb","ksc","ksd","kse","ksf","ksg","ksh","ksi","ksj","ksk","ksl","ksm","ksn","kso","ksp","ksq","ksr","kss","kst","ksu","ksv","ksw","ksx","ksy","ksz","kta","ktb","ktc","ktd","kte","ktf","ktg","kth","kti","ktj","ktk","ktl","ktm","ktn","kto","ktp","ktq","ktr","kts","ktt","ktu","ktv","ktw","ktx","kty","ktz","kub","kuc","kud","kue","kuf","kug","kuh","kui","kuj","kuk","kul","kum","kun","kuo","kup","kuq","kus","kut","kuu","kuv","kuw","kux","kuy","kuz","kva","kvb","kvc","kvd","kve","kvf","kvg","kvh","kvi","kvj","kvk","kvl","kvm","kvn","kvo","kvp","kvq","kvr","kvs","kvt","kvu","kvv","kvw","kvx","kvy","kvz","kwa","kwb","kwc","kwd","kwe","kwf","kwg","kwh","kwi","kwj","kwk","kwl","kwm","kwn","kwo","kwp","kwq","kwr","kws","kwt","kwu","kwv","kww","kwx","kwy","kwz","kxa","kxb","kxc","kxd","kxe","kxf","kxh","kxi","kxj","kxk","kxl","kxm","kxn","kxo","kxp","kxq","kxr","kxs","kxt","kxu","kxv","kxw","kxx","kxy","kxz","kya","kyb","kyc","kyd","kye","kyf","kyg","kyh","kyi","kyj","kyk","kyl","kym","kyn","kyo","kyp","kyq","kyr","kys","kyt","kyu","kyv","kyw","kyx","kyy","kyz","kza","kzb","kzc","kzd","kze","kzf","kzg","kzh","kzi","kzj","kzk","kzl","kzm","kzn","kzo","kzp","kzq","kzr","kzs","kzt","kzu","kzv","kzw","kzx","kzy","kzz"],["la","lb","lg","li","ln","lo","lt","lu","lv","laa","lab","lac","lad","lae","laf","lag","lah","lai","laj","lak","lal","lam","lan","lap","laq","lar","las","lau","law","lax","lay","laz","lba","lbb","lbc","lbe","lbf","lbg","lbi","lbj","lbk","lbl","lbm","lbn","lbo","lbq","lbr","lbs","lbt","lbu","lbv","lbw","lbx","lby","lbz","lcc","lcd","lce","lcf","lch","lcl","lcm","lcp","lcq","lcs","lda","ldb","ldd","ldg","ldh","ldi","ldj","ldk","ldl","ldm","ldn","ldo","ldp","ldq","lea","leb","lec","led","lee","lef","leg","leh","lei","lej","lek","lel","lem","len","leo","lep","leq","ler","les","let","leu","lev","lew","lex","ley","lez","lfa","lfn","lga","lgb","lgg","lgh","lgi","lgk","lgl","lgm","lgn","lgq","lgr","lgt","lgu","lgz","lha","lhh","lhi","lhl","lhm","lhn","lhp","lhs","lht","lhu","lia","lib","lic","lid","lie","lif","lig","lih","lii","lij","lik","lil","lio","lip","liq","lir","lis","liu","liv","liw","lix","liy","liz","lja","lje","lji","ljl","ljp","ljw","ljx","lka","lkb","lkc","lkd","lke","lkh","lki","lkj","lkl","lkm","lkn","lko","lkr","lks","lkt","lku","lky","lla","llb","llc","lld","lle","llf","llg","llh","lli","llj","llk","lll","llm","lln","llo","llp","llq","lls","llu","llx","lma","lmb","lmc","lmd","lme","lmf","lmg","lmh","lmi","lmj","lmk","lml","lmm","lmn","lmo","lmp","lmq","lmr","lmu","lmv","lmw","lmx","lmy","lmz","lna","lnb","lnd","lng","lnh","lni","lnj","lnl","lnm","lnn","lno","lns","lnu","lnw","lnz","loa","lob","loc","loe","lof","log","loh","loi","loj","lok","lol","lom","lon","loo","lop","loq","lor","los","lot","lou","lov","low","lox","loy","loz","lpa","lpe","lpn","lpo","lpx","lra","lrc","lre","lrg","lri","lrk","lrl","lrm","lrn","lro","lrr","lrt","lrv","lrz","lsa","lsb","lsd","lse","lsg","lsh","lsi","lsl","lsm","lsn","lso","lsp","lsr","lss","lst","lsv","lsy","ltc","ltg","lth","lti","ltn","lto","lts","ltu","lua","luc","lud","lue","luf","lui","luj","luk","lul","lum","lun","luo","lup","luq","lur","lus","lut","luu","luv","luw","luy","luz","lva","lvi","lvk","lvs","lvu","lwa","lwe","lwg","lwh","lwl","lwm","lwo","lws","lwt","lwu","lww","lxm","lya","lyg","lyn","lzh","lzl","lzn","lzz"],["mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","maa","mab","mad","mae","maf","mag","mai","maj","mak","mam","man","map","maq","mas","mat","mau","mav","maw","max","maz","mba","mbb","mbc","mbd","mbe","mbf","mbh","mbi","mbj","mbk","mbl","mbm","mbn","mbo","mbp","mbq","mbr","mbs","mbt","mbu","mbv","mbw","mbx","mby","mbz","mca","mcb","mcc","mcd","mce","mcf","mcg","mch","mci","mcj","mck","mcl","mcm","mcn","mco","mcp","mcq","mcr","mcs","mct","mcu","mcv","mcw","mcx","mcy","mcz","mda","mdb","mdc","mdd","mde","mdf","mdg","mdh","mdi","mdj","mdk","mdl","mdm","mdn","mdp","mdq","mdr","mds","mdt","mdu","mdv","mdw","mdx","mdy","mdz","mea","meb","mec","med","mee","mef","meg","meh","mei","mej","mek","mel","mem","men","meo","mep","meq","mer","mes","met","meu","mev","mew","mey","mez","mfa","mfb","mfc","mfd","mfe","mff","mfg","mfh","mfi","mfj","mfk","mfl","mfm","mfn","mfo","mfp","mfq","mfr","mfs","mft","mfu","mfv","mfw","mfx","mfy","mfz","mga","mgb","mgc","mgd","mge","mgf","mgg","mgh","mgi","mgj","mgk","mgl","mgm","mgn","mgo","mgp","mgq","mgr","mgs","mgt","mgu","mgv","mgw","mgx","mgy","mgz","mha","mhb","mhc","mhd","mhe","mhf","mhg","mhh","mhi","mhj","mhk","mhl","mhm","mhn","mho","mhp","mhq","mhr","mhs","mht","mhu","mhw","mhx","mhy","mhz","mia","mib","mic","mid","mie","mif","mig","mih","mii","mij","mik","mil","mim","min","mio","mip","miq","mir","mis","mit","miu","miw","mix","miy","miz","mja","mjb","mjc","mjd","mje","mjg","mjh","mji","mjj","mjk","mjl","mjm","mjn","mjo","mjp","mjq","mjr","mjs","mjt","mju","mjv","mjw","mjx","mjy","mjz","mka","mkb","mkc","mke","mkf","mkg","mkh","mki","mkj","mkk","mkl","mkm","mkn","mko","mkp","mkq","mkr","mks","mkt","mku","mkv","mkw","mkx","mky","mkz","mla","mlb","mlc","mld","mle","mlf","mlh","mli","mlj","mlk","mll","mlm","mln","mlo","mlp","mlq","mlr","mls","mlu","mlv","mlw","mlx","mlz","mma","mmb","mmc","mmd","mme","mmf","mmg","mmh","mmi","mmj","mmk","mml","mmm","mmn","mmo","mmp","mmq","mmr","mmt","mmu","mmv","mmw","mmx","mmy","mmz","mna","mnb","mnc","mnd","mne","mnf","mng","mnh","mni","mnj","mnk","mnl","mnm","mnn","mno","mnp","mnq","mnr","mns","mnt","mnu","mnv","mnw","mnx","mny","mnz","moa","moc","mod","moe","mof","mog","moh","moi","moj","mok","mom","moo","mop","moq","mor","mos","mot","mou","mov","mow","mox","moy","moz","mpa","mpb","mpc","mpd","mpe","mpg","mph","mpi","mpj","mpk","mpl","mpm","mpn","mpo","mpp","mpq","mpr","mps","mpt","mpu","mpv","mpw","mpx","mpy","mpz","mqa","mqb","mqc","mqe","mqf","mqg","mqh","mqi","mqj","mqk","mql","mqm","mqn","mqo","mqp","mqq","mqr","mqs","mqt","mqu","mqv","mqw","mqx","mqy","mqz","mra","mrb","mrc","mrd","mre","mrf","mrg","mrh","mrj","mrk","mrl","mrm","mrn","mro","mrp","mrq","mrr","mrs","mrt","mru","mrv","mrw","mrx","mry","mrz","msb","msc","msd","mse","msf","msg","msh","msi","msj","msk","msl","msm","msn","mso","msp","msq","msr","mss","mst","msu","msv","msw","msx","msy","msz","mta","mtb","mtc","mtd","mte","mtf","mtg","mth","mti","mtj","mtk","mtl","mtm","mtn","mto","mtp","mtq","mtr","mts","mtt","mtu","mtv","mtw","mtx","mty","mua","mub","muc","mud","mue","mug","muh","mui","muj","muk","mul","mum","mun","muo","mup","muq","mur","mus","mut","muu","muv","mux","muy","muz","mva","mvb","mvd","mve","mvf","mvg","mvh","mvi","mvk","mvl","mvm","mvn","mvo","mvp","mvq","mvr","mvs","mvt","mvu","mvv","mvw","mvx","mvy","mvz","mwa","mwb","mwc","mwd","mwe","mwf","mwg","mwh","mwi","mwj","mwk","mwl","mwm","mwn","mwo","mwp","mwq","mwr","mws","mwt","mwu","mwv","mww","mwx","mwy","mwz","mxa","mxb","mxc","mxd","mxe","mxf","mxg","mxh","mxi","mxj","mxk","mxl","mxm","mxn","mxo","mxp","mxq","mxr","mxs","mxt","mxu","mxv","mxw","mxx","mxy","mxz","myb","myc","myd","mye","myf","myg","myh","myi","myj","myk","myl","mym","myn","myo","myp","myq","myr","mys","myt","myu","myv","myw","myx","myy","myz","mza","mzb","mzc","mzd","mze","mzg","mzh","mzi","mzj","mzk","mzl","mzm","mzn","mzo","mzp","mzq","mzr","mzs","mzt","mzu","mzv","mzw","mzx","mzy","mzz"],["na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","naa","nab","nac","nad","nae","naf","nag","nah","nai","naj","nak","nal","nam","nan","nao","nap","naq","nar","nas","nat","naw","nax","nay","naz","nba","nbb","nbc","nbd","nbe","nbf","nbg","nbh","nbi","nbj","nbk","nbm","nbn","nbo","nbp","nbq","nbr","nbs","nbt","nbu","nbv","nbw","nbx","nby","nca","ncb","ncc","ncd","nce","ncf","ncg","nch","nci","ncj","nck","ncl","ncm","ncn","nco","ncp","ncq","ncr","ncs","nct","ncu","ncx","ncz","nda","ndb","ndc","ndd","ndf","ndg","ndh","ndi","ndj","ndk","ndl","ndm","ndn","ndp","ndq","ndr","nds","ndt","ndu","ndv","ndw","ndx","ndy","ndz","nea","neb","nec","ned","nee","nef","neg","neh","nei","nej","nek","nem","nen","neo","neq","ner","nes","net","neu","nev","new","nex","ney","nez","nfa","nfd","nfl","nfr","nfu","nga","ngb","ngc","ngd","nge","ngf","ngg","ngh","ngi","ngj","ngk","ngl","ngm","ngn","ngo","ngp","ngq","ngr","ngs","ngt","ngu","ngv","ngw","ngx","ngy","ngz","nha","nhb","nhc","nhd","nhe","nhf","nhg","nhh","nhi","nhk","nhm","nhn","nho","nhp","nhq","nhr","nht","nhu","nhv","nhw","nhx","nhy","nhz","nia","nib","nic","nid","nie","nif","nig","nih","nii","nij","nik","nil","nim","nin","nio","niq","nir","nis","nit","niu","niv","niw","nix","niy","niz","nja","njb","njd","njh","nji","njj","njl","njm","njn","njo","njr","njs","njt","nju","njx","njy","njz","nka","nkb","nkc","nkd","nke","nkf","nkg","nkh","nki","nkj","nkk","nkm","nkn","nko","nkp","nkq","nkr","nks","nkt","nku","nkv","nkw","nkx","nkz","nla","nlc","nle","nlg","nli","nlj","nlk","nll","nlm","nln","nlo","nlq","nlr","nlu","nlv","nlw","nlx","nly","nlz","nma","nmb","nmc","nmd","nme","nmf","nmg","nmh","nmi","nmj","nmk","nml","nmm","nmn","nmo","nmp","nmq","nmr","nms","nmt","nmu","nmv","nmw","nmx","nmy","nmz","nna","nnb","nnc","nnd","nne","nnf","nng","nnh","nni","nnj","nnk","nnl","nnm","nnn","nnp","nnq","nnr","nns","nnt","nnu","nnv","nnw","nnx","nny","nnz","noa","noc","nod","noe","nof","nog","noh","noi","noj","nok","nol","nom","non","noo","nop","noq","nos","not","nou","nov","now","noy","noz","npa","npb","npg","nph","npi","npl","npn","npo","nps","npu","npx","npy","nqg","nqk","nql","nqm","nqn","nqo","nqq","nqt","nqy","nra","nrb","nrc","nre","nrf","nrg","nri","nrk","nrl","nrm","nrn","nrp","nrr","nrt","nru","nrx","nrz","nsa","nsb","nsc","nsd","nse","nsf","nsg","nsh","nsi","nsk","nsl","nsm","nsn","nso","nsp","nsq","nsr","nss","nst","nsu","nsv","nsw","nsx","nsy","nsz","ntd","nte","ntg","nti","ntj","ntk","ntm","nto","ntp","ntr","nts","ntu","ntw","ntx","nty","ntz","nua","nub","nuc","nud","nue","nuf","nug","nuh","nui","nuj","nuk","nul","num","nun","nuo","nup","nuq","nur","nus","nut","nuu","nuv","nuw","nux","nuy","nuz","nvh","nvm","nvo","nwa","nwb","nwc","nwe","nwg","nwi","nwm","nwo","nwr","nwx","nwy","nxa","nxd","nxe","nxg","nxi","nxk","nxl","nxm","nxn","nxo","nxq","nxr","nxu","nxx","nyb","nyc","nyd","nye","nyf","nyg","nyh","nyi","nyj","nyk","nyl","nym","nyn","nyo","nyp","nyq","nyr","nys","nyt","nyu","nyv","nyw","nyx","nyy","nza","nzb","nzd","nzi","nzk","nzm","nzs","nzu","nzy","nzz"],["oc","oj","om","or","os","oaa","oac","oar","oav","obi","obk","obl","obm","obo","obr","obt","obu","oca","och","ocm","oco","ocu","oda","odk","odt","odu","ofo","ofs","ofu","ogb","ogc","oge","ogg","ogo","ogu","oht","ohu","oia","oin","ojb","ojc","ojg","ojp","ojs","ojv","ojw","oka","okb","okc","okd","oke","okg","okh","oki","okj","okk","okl","okm","okn","oko","okr","oks","oku","okv","okx","okz","ola","old","ole","olk","olm","olo","olr","olt","olu","oma","omb","omc","ome","omg","omi","omk","oml","omn","omo","omp","omq","omr","omt","omu","omv","omw","omx","omy","ona","onb","one","ong","oni","onj","onk","onn","ono","onp","onr","ons","ont","onu","onw","onx","ood","oog","oon","oor","oos","opa","opk","opm","opo","opt","opy","ora","orc","ore","org","orh","orn","oro","orr","ors","ort","oru","orv","orw","orx","ory","orz","osa","osc","osi","osn","oso","osp","ost","osu","osx","ota","otb","otd","ote","oti","otk","otl","otm","otn","oto","otq","otr","ots","ott","otu","otw","otx","oty","otz","oua","oub","oue","oui","oum","oun","ovd","owi","owl","oyb","oyd","oym","oyy","ozm"],["pa","pi","pl","ps","pt","paa","pab","pac","pad","pae","paf","pag","pah","pai","pak","pal","pam","pao","pap","paq","par","pas","pat","pau","pav","paw","pax","pay","paz","pbb","pbc","pbe","pbf","pbg","pbh","pbi","pbl","pbm","pbn","pbo","pbp","pbr","pbs","pbt","pbu","pbv","pby","pbz","pca","pcb","pcc","pcd","pce","pcf","pcg","pch","pci","pcj","pck","pcl","pcm","pcn","pcp","pcr","pcw","pda","pdc","pdi","pdn","pdo","pdt","pdu","pea","peb","ped","pee","pef","peg","peh","pei","pej","pek","pel","pem","peo","pep","peq","pes","pev","pex","pey","pez","pfa","pfe","pfl","pga","pgd","pgg","pgi","pgk","pgl","pgn","pgs","pgu","pgy","pgz","pha","phd","phg","phh","phi","phk","phl","phm","phn","pho","phq","phr","pht","phu","phv","phw","pia","pib","pic","pid","pie","pif","pig","pih","pii","pij","pil","pim","pin","pio","pip","pir","pis","pit","piu","piv","piw","pix","piy","piz","pjt","pka","pkb","pkc","pkg","pkh","pkn","pko","pkp","pkr","pks","pkt","pku","pla","plb","plc","pld","ple","plf","plg","plh","plj","plk","pll","pln","plo","plp","plq","plr","pls","plt","plu","plv","plw","ply","plz","pma","pmb","pmc","pmd","pme","pmf","pmh","pmi","pmj","pmk","pml","pmm","pmn","pmo","pmq","pmr","pms","pmt","pmu","pmw","pmx","pmy","pmz","pna","pnb","pnc","pnd","pne","png","pnh","pni","pnj","pnk","pnl","pnm","pnn","pno","pnp","pnq","pnr","pns","pnt","pnu","pnv","pnw","pnx","pny","pnz","poc","pod","poe","pof","pog","poh","poi","pok","pom","pon","poo","pop","poq","pos","pot","pov","pow","pox","poy","poz","ppa","ppe","ppi","ppk","ppl","ppm","ppn","ppo","ppp","ppq","ppr","pps","ppt","ppu","pqa","pqe","pqm","pqw","pra","prb","prc","prd","pre","prf","prg","prh","pri","prk","prl","prm","prn","pro","prp","prq","prr","prs","prt","pru","prw","prx","pry","prz","psa","psc","psd","pse","psg","psh","psi","psl","psm","psn","pso","psp","psq","psr","pss","pst","psu","psw","psy","pta","pth","pti","ptn","pto","ptp","ptq","ptr","ptt","ptu","ptv","ptw","pty","pua","pub","puc","pud","pue","puf","pug","pui","puj","puk","pum","puo","pup","puq","pur","put","puu","puw","pux","puy","puz","pwa","pwb","pwg","pwi","pwm","pwn","pwo","pwr","pww","pxm","pye","pym","pyn","pys","pyu","pyx","pyy","pzn"],["qu","qua","qub","quc","qud","quf","qug","quh","qui","quk","qul","qum","qun","qup","quq","qur","qus","quv","quw","qux","quy","quz","qva","qvc","qve","qvh","qvi","qvj","qvl","qvm","qvn","qvo","qvp","qvs","qvw","qvy","qvz","qwa","qwc","qwe","qwh","qwm","qws","qwt","qxa","qxc","qxh","qxl","qxn","qxo","qxp","qxq","qxr","qxs","qxt","qxu","qxw","qya","qyp"],["rm","rn","ro","ru","rw","raa","rab","rac","rad","raf","rag","rah","rai","raj","rak","ral","ram","ran","rao","rap","raq","rar","ras","rat","rau","rav","raw","rax","ray","raz","rbb","rbk","rbl","rbp","rcf","rdb","rea","reb","ree","reg","rei","rej","rel","rem","ren","rer","res","ret","rey","rga","rge","rgk","rgn","rgr","rgs","rgu","rhg","rhp","ria","rie","rif","ril","rim","rin","rir","rit","riu","rjg","rji","rjs","rka","rkb","rkh","rki","rkm","rkt","rkw","rma","rmb","rmc","rmd","rme","rmf","rmg","rmh","rmi","rmk","rml","rmm","rmn","rmo","rmp","rmq","rmr","rms","rmt","rmu","rmv","rmw","rmx","rmy","rmz","rna","rnd","rng","rnl","rnn","rnp","rnr","rnw","roa","rob","roc","rod","roe","rof","rog","rol","rom","roo","rop","ror","rou","row","rpn","rpt","rri","rro","rrt","rsb","rsi","rsl","rsm","rtc","rth","rtm","rts","rtw","rub","ruc","rue","ruf","rug","ruh","rui","ruk","ruo","rup","ruq","rut","ruu","ruy","ruz","rwa","rwk","rwl","rwm","rwo","rwr","rxd","rxw","ryn","rys","ryu","rzh"],["sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","saa","sab","sac","sad","sae","saf","sah","sai","saj","sak","sal","sam","sao","sap","saq","sar","sas","sat","sau","sav","saw","sax","say","saz","sba","sbb","sbc","sbd","sbe","sbf","sbg","sbh","sbi","sbj","sbk","sbl","sbm","sbn","sbo","sbp","sbq","sbr","sbs","sbt","sbu","sbv","sbw","sbx","sby","sbz","sca","scb","sce","scf","scg","sch","sci","sck","scl","scn","sco","scp","scq","scs","sct","scu","scv","scw","scx","sda","sdb","sdc","sde","sdf","sdg","sdh","sdj","sdk","sdl","sdm","sdn","sdo","sdp","sdq","sdr","sds","sdt","sdu","sdv","sdx","sdz","sea","seb","sec","sed","see","sef","seg","seh","sei","sej","sek","sel","sem","sen","seo","sep","seq","ser","ses","set","seu","sev","sew","sey","sez","sfb","sfe","sfm","sfs","sfw","sga","sgb","sgc","sgd","sge","sgg","sgh","sgi","sgj","sgk","sgl","sgm","sgn","sgo","sgp","sgr","sgs","sgt","sgu","sgw","sgx","sgy","sgz","sha","shb","shc","shd","she","shg","shh","shi","shj","shk","shl","shm","shn","sho","shp","shq","shr","shs","sht","shu","shv","shw","shx","shy","shz","sia","sib","sid","sie","sif","sig","sih","sii","sij","sik","sil","sim","sio","sip","siq","sir","sis","sit","siu","siv","siw","six","siy","siz","sja","sjb","sjd","sje","sjg","sjk","sjl","sjm","sjn","sjo","sjp","sjr","sjs","sjt","sju","sjw","ska","skb","skc","skd","ske","skf","skg","skh","ski","skj","skk","skm","skn","sko","skp","skq","skr","sks","skt","sku","skv","skw","skx","sky","skz","sla","slc","sld","sle","slf","slg","slh","sli","slj","sll","slm","sln","slp","slq","slr","sls","slt","slu","slw","slx","sly","slz","sma","smb","smc","smd","smf","smg","smh","smi","smj","smk","sml","smm","smn","smp","smq","smr","sms","smt","smu","smv","smw","smx","smy","smz","snb","snc","sne","snf","sng","snh","sni","snj","snk","snl","snm","snn","sno","snp","snq","snr","sns","snu","snv","snw","snx","sny","snz","soa","sob","soc","sod","soe","sog","soh","soi","soj","sok","sol","son","soo","sop","soq","sor","sos","sou","sov","sow","sox","soy","soz","spb","spc","spd","spe","spg","spi","spk","spl","spm","spn","spo","spp","spq","spr","sps","spt","spu","spv","spx","spy","sqa","sqh","sqj","sqk","sqm","sqn","sqo","sqq","sqr","sqs","sqt","squ","sqx","sra","srb","src","sre","srf","srg","srh","sri","srk","srl","srm","srn","sro","srq","srr","srs","srt","sru","srv","srw","srx","sry","srz","ssa","ssb","ssc","ssd","sse","ssf","ssg","ssh","ssi","ssj","ssk","ssl","ssm","ssn","sso","ssp","ssq","ssr","sss","sst","ssu","ssv","ssx","ssy","ssz","sta","stb","std","ste","stf","stg","sth","sti","stj","stk","stl","stm","stn","sto","stp","stq","str","sts","stt","stu","stv","stw","sty","sua","sub","suc","sue","sug","sui","suj","suk","sul","sum","suo","suq","sur","sus","sut","suv","suw","sux","suy","suz","sva","svb","svc","sve","svk","svm","svr","svs","svx","swb","swc","swf","swg","swh","swi","swj","swk","swl","swm","swn","swo","swp","swq","swr","sws","swt","swu","swv","sww","swx","swy","sxb","sxc","sxe","sxg","sxk","sxl","sxm","sxn","sxo","sxr","sxs","sxu","sxw","sya","syb","syc","syd","syi","syk","syl","sym","syn","syo","syr","sys","syw","syx","syy","sza","szb","szc","szd","sze","szg","szl","szn","szp","szs","szv","szw","szy"],["ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","taa","tab","tac","tad","tae","taf","tag","tai","taj","tak","tal","tan","tao","tap","taq","tar","tas","tau","tav","taw","tax","tay","taz","tba","tbb","tbc","tbd","tbe","tbf","tbg","tbh","tbi","tbj","tbk","tbl","tbm","tbn","tbo","tbp","tbq","tbr","tbs","tbt","tbu","tbv","tbw","tbx","tby","tbz","tca","tcb","tcc","tcd","tce","tcf","tcg","tch","tci","tck","tcl","tcm","tcn","tco","tcp","tcq","tcs","tct","tcu","tcw","tcx","tcy","tcz","tda","tdb","tdc","tdd","tde","tdf","tdg","tdh","tdi","tdj","tdk","tdl","tdm","tdn","tdo","tdq","tdr","tds","tdt","tdu","tdv","tdx","tdy","tea","teb","tec","ted","tee","tef","teg","teh","tei","tek","tem","ten","teo","tep","teq","ter","tes","tet","teu","tev","tew","tex","tey","tez","tfi","tfn","tfo","tfr","tft","tga","tgb","tgc","tgd","tge","tgf","tgg","tgh","tgi","tgj","tgn","tgo","tgp","tgq","tgr","tgs","tgt","tgu","tgv","tgw","tgx","tgy","tgz","thc","thd","the","thf","thh","thi","thk","thl","thm","thn","thp","thq","thr","ths","tht","thu","thv","thw","thx","thy","thz","tia","tic","tid","tie","tif","tig","tih","tii","tij","tik","til","tim","tin","tio","tip","tiq","tis","tit","tiu","tiv","tiw","tix","tiy","tiz","tja","tjg","tji","tjj","tjl","tjm","tjn","tjo","tjp","tjs","tju","tjw","tka","tkb","tkd","tke","tkf","tkg","tkk","tkl","tkm","tkn","tkp","tkq","tkr","tks","tkt","tku","tkv","tkw","tkx","tkz","tla","tlb","tlc","tld","tlf","tlg","tlh","tli","tlj","tlk","tll","tlm","tln","tlo","tlp","tlq","tlr","tls","tlt","tlu","tlv","tlw","tlx","tly","tma","tmb","tmc","tmd","tme","tmf","tmg","tmh","tmi","tmj","tmk","tml","tmm","tmn","tmo","tmp","tmq","tmr","tms","tmt","tmu","tmv","tmw","tmy","tmz","tna","tnb","tnc","tnd","tne","tnf","tng","tnh","tni","tnk","tnl","tnm","tnn","tno","tnp","tnq","tnr","tns","tnt","tnu","tnv","tnw","tnx","tny","tnz","tob","toc","tod","toe","tof","tog","toh","toi","toj","tol","tom","too","top","toq","tor","tos","tou","tov","tow","tox","toy","toz","tpa","tpc","tpe","tpf","tpg","tpi","tpj","tpk","tpl","tpm","tpn","tpo","tpp","tpq","tpr","tpt","tpu","tpv","tpw","tpx","tpy","tpz","tqb","tql","tqm","tqn","tqo","tqp","tqq","tqr","tqt","tqu","tqw","tra","trb","trc","trd","tre","trf","trg","trh","tri","trj","trk","trl","trm","trn","tro","trp","trq","trr","trs","trt","tru","trv","trw","trx","try","trz","tsa","tsb","tsc","tsd","tse","tsf","tsg","tsh","tsi","tsj","tsk","tsl","tsm","tsp","tsq","tsr","tss","tst","tsu","tsv","tsw","tsx","tsy","tsz","tta","ttb","ttc","ttd","tte","ttf","ttg","tth","tti","ttj","ttk","ttl","ttm","ttn","tto","ttp","ttq","ttr","tts","ttt","ttu","ttv","ttw","tty","ttz","tua","tub","tuc","tud","tue","tuf","tug","tuh","tui","tuj","tul","tum","tun","tuo","tup","tuq","tus","tut","tuu","tuv","tuw","tux","tuy","tuz","tva","tvd","tve","tvk","tvl","tvm","tvn","tvo","tvs","tvt","tvu","tvw","tvx","tvy","twa","twb","twc","twd","twe","twf","twg","twh","twl","twm","twn","two","twp","twq","twr","twt","twu","tww","twx","twy","txa","txb","txc","txe","txg","txh","txi","txj","txm","txn","txo","txq","txr","txs","txt","txu","txx","txy","tya","tye","tyh","tyi","tyj","tyl","tyn","typ","tyr","tys","tyt","tyu","tyv","tyx","tyy","tyz","tza","tzh","tzj","tzl","tzm","tzn","tzo","tzx"],["ug","uk","ur","uz","uam","uan","uar","uba","ubi","ubl","ubr","ubu","uby","uda","ude","udg","udi","udj","udl","udm","udu","ues","ufi","uga","ugb","uge","ugn","ugo","ugy","uha","uhn","uis","uiv","uji","uka","ukg","ukh","uki","ukk","ukl","ukp","ukq","uks","uku","ukv","ukw","uky","ula","ulb","ulc","ule","ulf","uli","ulk","ull","ulm","uln","ulu","ulw","uma","umb","umc","umd","umg","umi","umm","umn","umo","ump","umr","ums","umu","una","und","une","ung","uni","unk","unm","unn","unp","unr","unu","unx","unz","uok","upi","upv","ura","urb","urc","ure","urf","urg","urh","uri","urj","urk","url","urm","urn","uro","urp","urr","urt","uru","urv","urw","urx","ury","urz","usa","ush","usi","usk","usp","uss","usu","uta","ute","uth","utp","utr","utu","uum","uun","uur","uuu","uve","uvh","uvl","uwa","uya","uzn","uzs"],["ve","vi","vo","vaa","vae","vaf","vag","vah","vai","vaj","val","vam","van","vao","vap","var","vas","vau","vav","vay","vbb","vbk","vec","ved","vel","vem","veo","vep","ver","vgr","vgt","vic","vid","vif","vig","vil","vin","vis","vit","viv","vka","vki","vkj","vkk","vkl","vkm","vkn","vko","vkp","vkt","vku","vkz","vlp","vls","vma","vmb","vmc","vmd","vme","vmf","vmg","vmh","vmi","vmj","vmk","vml","vmm","vmp","vmq","vmr","vms","vmu","vmv","vmw","vmx","vmy","vmz","vnk","vnm","vnp","vor","vot","vra","vro","vrs","vrt","vsi","vsl","vsv","vto","vum","vun","vut","vwa"],["wa","wo","waa","wab","wac","wad","wae","waf","wag","wah","wai","waj","wak","wal","wam","wan","wao","wap","waq","war","was","wat","wau","wav","waw","wax","way","waz","wba","wbb","wbe","wbf","wbh","wbi","wbj","wbk","wbl","wbm","wbp","wbq","wbr","wbs","wbt","wbv","wbw","wca","wci","wdd","wdg","wdj","wdk","wdu","wdy","wea","wec","wed","weg","weh","wei","wem","wen","weo","wep","wer","wes","wet","weu","wew","wfg","wga","wgb","wgg","wgi","wgo","wgu","wgw","wgy","wha","whg","whk","whu","wib","wic","wie","wif","wig","wih","wii","wij","wik","wil","wim","win","wir","wit","wiu","wiv","wiw","wiy","wja","wji","wka","wkb","wkd","wkl","wkr","wku","wkw","wky","wla","wlc","wle","wlg","wlh","wli","wlk","wll","wlm","wlo","wlr","wls","wlu","wlv","wlw","wlx","wly","wma","wmb","wmc","wmd","wme","wmg","wmh","wmi","wmm","wmn","wmo","wms","wmt","wmw","wmx","wnb","wnc","wnd","wne","wng","wni","wnk","wnm","wnn","wno","wnp","wnu","wnw","wny","woa","wob","woc","wod","woe","wof","wog","woi","wok","wom","won","woo","wor","wos","wow","woy","wpc","wra","wrb","wrd","wrg","wrh","wri","wrk","wrl","wrm","wrn","wro","wrp","wrr","wrs","wru","wrv","wrw","wrx","wry","wrz","wsa","wsg","wsi","wsk","wsr","wss","wsu","wsv","wtf","wth","wti","wtk","wtm","wtw","wua","wub","wud","wuh","wul","wum","wun","wur","wut","wuu","wuv","wux","wuy","wwa","wwb","wwo","wwr","www","wxa","wxw","wya","wyb","wyi","wym","wyr","wyy"],["xh","xaa","xab","xac","xad","xae","xag","xai","xaj","xak","xal","xam","xan","xao","xap","xaq","xar","xas","xat","xau","xav","xaw","xay","xba","xbb","xbc","xbd","xbe","xbg","xbi","xbj","xbm","xbn","xbo","xbp","xbr","xbw","xbx","xby","xcb","xcc","xce","xcg","xch","xcl","xcm","xcn","xco","xcr","xct","xcu","xcv","xcw","xcy","xda","xdc","xdk","xdm","xdo","xdy","xeb","xed","xeg","xel","xem","xep","xer","xes","xet","xeu","xfa","xga","xgb","xgd","xgf","xgg","xgi","xgl","xgm","xgn","xgr","xgu","xgw","xha","xhc","xhd","xhe","xhr","xht","xhu","xhv","xia","xib","xii","xil","xin","xip","xir","xis","xiv","xiy","xjb","xjt","xka","xkb","xkc","xkd","xke","xkf","xkg","xkh","xki","xkj","xkk","xkl","xkn","xko","xkp","xkq","xkr","xks","xkt","xku","xkv","xkw","xkx","xky","xkz","xla","xlb","xlc","xld","xle","xlg","xli","xln","xlo","xlp","xls","xlu","xly","xma","xmb","xmc","xmd","xme","xmf","xmg","xmh","xmj","xmk","xml","xmm","xmn","xmo","xmp","xmq","xmr","xms","xmt","xmu","xmv","xmw","xmx","xmy","xmz","xna","xnb","xnd","xng","xnh","xni","xnj","xnk","xnm","xnn","xno","xnq","xnr","xns","xnt","xnu","xny","xnz","xoc","xod","xog","xoi","xok","xom","xon","xoo","xop","xor","xow","xpa","xpb","xpc","xpd","xpe","xpf","xpg","xph","xpi","xpj","xpk","xpl","xpm","xpn","xpo","xpp","xpq","xpr","xps","xpt","xpu","xpv","xpw","xpx","xpy","xpz","xqa","xqt","xra","xrb","xrd","xre","xrg","xri","xrm","xrn","xrq","xrr","xrt","xru","xrw","xsa","xsb","xsc","xsd","xse","xsh","xsi","xsj","xsl","xsm","xsn","xso","xsp","xsq","xsr","xss","xsu","xsv","xsy","xta","xtb","xtc","xtd","xte","xtg","xth","xti","xtj","xtl","xtm","xtn","xto","xtp","xtq","xtr","xts","xtt","xtu","xtv","xtw","xty","xtz","xua","xub","xud","xug","xuj","xul","xum","xun","xuo","xup","xur","xut","xuu","xve","xvi","xvn","xvo","xvs","xwa","xwc","xwd","xwe","xwg","xwj","xwk","xwl","xwo","xwr","xwt","xww","xxb","xxk","xxm","xxr","xxt","xya","xyb","xyj","xyk","xyl","xyt","xyy","xzh","xzm","xzp"],["yi","yo","yaa","yab","yac","yad","yae","yaf","yag","yah","yai","yaj","yak","yal","yam","yan","yao","yap","yaq","yar","yas","yat","yau","yav","yaw","yax","yay","yaz","yba","ybb","ybd","ybe","ybh","ybi","ybj","ybk","ybl","ybm","ybn","ybo","ybx","yby","ych","ycl","ycn","ycp","yda","ydd","yde","ydg","ydk","yds","yea","yec","yee","yei","yej","yel","yen","yer","yes","yet","yeu","yev","yey","yga","ygi","ygl","ygm","ygp","ygr","ygs","ygu","ygw","yha","yhd","yhl","yhs","yia","yif","yig","yih","yii","yij","yik","yil","yim","yin","yip","yiq","yir","yis","yit","yiu","yiv","yix","yiy","yiz","yka","ykg","yki","ykk","ykl","ykm","ykn","yko","ykr","ykt","yku","yky","yla","ylb","yle","ylg","yli","yll","ylm","yln","ylo","ylr","ylu","yly","yma","ymb","ymc","ymd","yme","ymg","ymh","ymi","ymk","yml","ymm","ymn","ymo","ymp","ymq","ymr","yms","ymt","ymx","ymz","yna","ynd","yne","yng","ynh","ynk","ynl","ynn","yno","ynq","yns","ynu","yob","yog","yoi","yok","yol","yom","yon","yos","yot","yox","yoy","ypa","ypb","ypg","yph","ypk","ypm","ypn","ypo","ypp","ypz","yra","yrb","yre","yri","yrk","yrl","yrm","yrn","yro","yrs","yrw","yry","ysc","ysd","ysg","ysl","ysm","ysn","yso","ysp","ysr","yss","ysy","yta","ytl","ytp","ytw","yty","yua","yub","yuc","yud","yue","yuf","yug","yui","yuj","yuk","yul","yum","yun","yup","yuq","yur","yut","yuu","yuw","yux","yuy","yuz","yva","yvt","ywa","ywg","ywl","ywn","ywq","ywr","ywt","ywu","yww","yxa","yxg","yxl","yxm","yxu","yxy","yyr","yyu","yyz","yzg","yzk"],["za","zh","zu","zaa","zab","zac","zad","zae","zaf","zag","zah","zai","zaj","zak","zal","zam","zao","zap","zaq","zar","zas","zat","zau","zav","zaw","zax","zay","zaz","zba","zbc","zbe","zbl","zbt","zbu","zbw","zca","zch","zdj","zea","zeg","zeh","zen","zga","zgb","zgh","zgm","zgn","zgr","zhb","zhd","zhi","zhn","zhw","zhx","zia","zib","zik","zil","zim","zin","zir","ziw","ziz","zka","zkb","zkd","zkg","zkh","zkk","zkn","zko","zkp","zkr","zkt","zku","zkv","zkz","zla","zle","zlj","zlm","zln","zlq","zls","zlw","zma","zmb","zmc","zmd","zme","zmf","zmg","zmh","zmi","zmj","zmk","zml","zmm","zmn","zmo","zmp","zmq","zmr","zms","zmt","zmu","zmv","zmw","zmx","zmy","zmz","zna","znd","zne","zng","znk","zns","zoc","zoh","zom","zoo","zoq","zor","zos","zpa","zpb","zpc","zpd","zpe","zpf","zpg","zph","zpi","zpj","zpk","zpl","zpm","zpn","zpo","zpp","zpq","zpr","zps","zpt","zpu","zpv","zpw","zpx","zpy","zpz","zqe","zra","zrg","zrn","zro","zrp","zrs","zsa","zsk","zsl","zsm","zsr","zsu","zte","ztg","ztl","ztm","ztn","ztp","ztq","zts","ztt","ztu","ztx","zty","zua","zuh","zum","zun","zuy","zwa","zxx","zyb","zyg","zyj","zyn","zyp","zza","zzj"]],a=function(){function e(){}return e.isBcp47=function(e){return/^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(e)},e.validPrimaryLang=function(e){var t=e.toLowerCase();return t.includes("-")&&(t=t.split("-")[0]),!!t.match(/[a-z]{2,3}/)&&(3===t.length&&"q"===t.charAt(0)&&t.charCodeAt(1)>=97&&t.charCodeAt(1)<=116&&t.charCodeAt(2)>=97&&t.charCodeAt(2),i[t.charCodeAt(0)-97].includes(t))},e.matchPrimaryLang=function(e,t){var i=e;i.includes("-")&&(i=i.split("-")[0]);var a=t;return a.includes("-")&&(a=a.split("-")[0]),i.toLowerCase()===a.toLowerCase()},e}();t.LangUtil=a},3103(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CommonMapper=void 0;var a=i(3864),n=function(){function e(){this.hierarchyRole=null,this.hierarchyPath=null,this.hierarchyResults=null}return e.prototype.getBounds=function(e){return null},e.prototype.reset=function(e){this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var t=[],i=a.DOMWalker.parentNode(e);i&&9!=i.nodeType;)t.push(i),i=a.DOMWalker.parentNode(i);for(var n=0,r=t=t.reverse();n<r.length;n++){for(var l=r[n],o=[],s=l.previousSibling;s;)o.push(s),s=s.previousSibling;for(var u=0,d=o=o.reverse();u<d.length;u++){var c=d[u];this.pushHierarchy(c),this.popHierarchy()}this.pushHierarchy(l)}},e.prototype.pushHierarchy=function(e){var t=this.getRole(e)||null;if(this.hierarchyRole.push(t),null!==t){var i=this.hierarchyPath[this.hierarchyPath.length-1];i.roleCount[t]=(i.roleCount[t]||0)+1,this.hierarchyPath.push({rolePath:i.rolePath+"/"+t+"["+i.roleCount[t]+"]",roleCount:{}})}var a={};1===e.nodeType&&(a=this.getAttributes(e)),this.hierarchyResults.push({node:e,namespace:this.getNamespace(),role:t,attributes:a,rolePath:this.hierarchyPath[this.hierarchyPath.length-1].rolePath,bounds:this.getBounds(e)})},e.prototype.popHierarchy=function(){null!==this.hierarchyRole.pop()&&this.hierarchyPath.pop(),this.hierarchyResults.pop()},e.prototype.openScope=function(e){return null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e),this.hierarchyResults},e.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}return t[t.length-1].role="/"+t[t.length-1].role,this.popHierarchy(),t},e}();t.CommonMapper=n},920(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Context=t.PartInfo=t.AttrInfo=void 0;var i=function(){function e(e,t,i,a){if(this.inclusive=e,this.attr=t,this.eq=i,this.value=a,!e&&void 0!==i&&i.length>0)throw new Error("Cannot have !attr"+i+" context");if(e&&void 0!==i&&i.length>0&&(void 0===a||0===a.length))throw new Error("Cannot have equivalence check without a value")}return e.prototype.matches=function(e){var t=this,i=e.attributes;if(t.attr in i){if(t.inclusive){if(t.eq){var a=i[t.attr];if("="===t.eq)return t.value===a;if("!="===t.eq)return t.value!==a;if("~"===t.eq)return t.value===a;if("!~"===t.eq)return t.value!==a;throw new Error("Context equivalence operator not supported")}return!0}return!1}return!t.inclusive},e}();t.AttrInfo=i;var a=function(){function e(e,t,i,a,n){if(this.inclusive=e,this.namespace=t,this.role=i,this.attrs=a,this.connector=n,"*"===i&&!e)throw new Error("!* context not supported")}return e.prototype.matches=function(e,t){var i=this,a=i.namespace in e&&e[i.namespace][t]&&(e[i.namespace][t].role===i.role||"none"!==e[i.namespace][t].role&&"*"===i.role);if(!a||"*"!==i.role||"dom"!==i.namespace||"#text"!==e[i.namespace][t].role&&"/#text"!==e[i.namespace][t].role||(a=!1),i.inclusive&&!a)return!1;if(!i.inclusive&&!a)return!0;for(var n=i.attrs,r=e[i.namespace][t],l=!0,o=0,s=n;o<s.length;o++){var u=s[o];l=l&&u.matches(r)}return i.inclusive||(l=!l),l},e}();t.PartInfo=a;var n=function(){function e(e){this.contextInfo=[];for(var t=[],n=0,r=e.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g);n<r.length;n++){for(var l=r[n].match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/),o=[],s=0,u=l[3].match(/\[([^\]]+)\]/g)||[];s<u.length;s++){var d=u[s].match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/);o.push(new i("!"!==d[1],d[2].toLowerCase(),d[3],d[4]))}l[2]=l[2].toLowerCase();var c=l[2].split(":"),m="!"!==l[1],p=c.shift(),h=c.join(":"),g=new a(m,p,h,o,l[l.length-1]);t.push(g)}this.contextInfo=t}return e.cleanContext=function(e){return(e=(e=(e=(e=(e=e.toLowerCase().trim()).replace(/ +!/g," !")).replace(/ +([>+~,])/g,"$1")).replace(/([>+~,]) +/g,"$1")).replace(/ +/g," ")).trim()},e.parse=function(t){for(var i=e.splitMultiple(e.cleanContext(t)),a=[],n=0;n<i.length;++n){var r=new e(i[n]);a.push(r)}return a},e.splitMultiple=function(e){var t=[];if(e)if(-1===e.indexOf(","))t.push(e);else for(var i=0,a=e.split(",");i<a.length;i++){var n=a[i];t.push(n)}return t},e}();t.Context=n},7301(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Engine=void 0;var a=i(3864),n=i(920),r=i(4516),l=i(7507),o=i(1686),s=i(4566),u=i(461),d=i(3946),c=function(){function e(e,t){this.rule=e,this.parsedInfo=t,this.ns=this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length-1].namespace,r.Config.DEBUG&&console.log("Added Rule:",e.id,JSON.stringify(this.parsedInfo))}return e.convertNodeToSnippet=function(e){var t="";t+="<"+e.nodeName.toLowerCase();var i=e.attributes;if(null!=i)for(var a=i.length-1;a>=0;a--)"data-namewalk"!==i[a].name&&(t+=" "+i[a].name+'="'+i[a].value+'"');return t+">"},e.convertNodeToSource=function(e,t){if(void 0===t&&(t=!1),!t||!e)return null;var i="ibm-a11y-debug",n=function(e){return e&&"end"!==e.toLowerCase()?{found:!0,stop:!1,source:e}:{found:!0,stop:!0}},r=function(e){if(!e)return{found:!1};var t=null;if(e.nodeType===Node.COMMENT_NODE)t=e.nodeValue;else if(e.nodeType===Node.ELEMENT_NODE)for(var a=e.firstChild;a;){if(a.nodeType!==Node.TEXT_NODE){if(a.nodeType===Node.COMMENT_NODE){t=a.nodeValue;break}break}if(a.nodeValue&&a.nodeValue.trim().length>0)break;a=a.nextSibling}if(null!==t){var r=t.trim();if(r===i||r.startsWith(i+":")||r.startsWith(i+" ")||r.startsWith(i+"\t")){var l=r.substring(14).trimStart(),o=l.startsWith(":")?l.substring(1).trim():l.trim();return n(o)}}return{found:!1}},l=function(e){if(e.nodeType!==Node.ELEMENT_NODE)return{found:!1};var t=e.getAttribute(i);return null===t?{found:!1}:n(t.trim())},o=l(e);return o.found?o.stop?null:o.source:function(e){for(var t=e;t;){for(var i=a.DOMWalker.previousSiblingNotOwnedBySlot(t);i;){var n=r(i);if(n.found)return n.stop?null:n.source;i=a.DOMWalker.previousSiblingNotOwnedBySlot(i)}var o=a.DOMWalker.parentNode(t);if(!o||o.nodeType===Node.DOCUMENT_NODE)return null;var s=l(o);if(s.found)return s.stop?null:s.source;t=o}return null}(e)},e.prototype.run=function(t,i,a,n){var r,l=(new Date).getTime();try{r=this.rule.run(i,a,n)}catch(e){var o=e;throw console.error("RULE EXCEPTION:",this.rule.id,i.dom.rolePath,o.stack),e}var s=(new Date).getTime();r||(r=[]),r instanceof Array||(r=[r]);for(var u=[],d=0,c=r;d<c.length;d++){var m=c[d],p=t.getMessage(this.rule.id,m.reasonId,m.messageArgs),h={};for(var g in i)h[g]=i[g].rolePath;var b=this.rule.id.replace(/^(.*)\$\$\d+$/,"$1");u.push({ruleId:b,value:m.value,node:i.dom.node,path:h,ruleTime:s-l,reasonId:m.reasonId,message:p,messageArgs:m.messageArgs,apiArgs:m.apiArgs,bounds:i.dom.bounds,snippet:e.convertNodeToSnippet(i.dom.node),source:e.convertNodeToSource(i.dom.node,t.isSourceMapEnabled())})}return u},e}(),m=function(){function e(){this.mappers={},this.ruleMap={},this.wrappedRuleMap={},this.nlsMap={},this.helpMap={},this.sourceMapEnabled=!1,this.inclRules={},this.exclRules={},this.addMapper(new l.DOMMapper)}return e.getLanguages=function(){var e="undefined"!=typeof process&&void 0===process.nodeType&&process.env,t="en-US";return e&&(t=(t=e.LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES)&&t.length>0?t.split(".")[0].replace(/_/g,"-"):"en-US"),"undefined"!=typeof navigator&&navigator.languages||[t]},e.prototype.run=function(e,t){if(null===e)return Promise.reject("null document");9===e.nodeType&&(e=e.documentElement),e.ownerDocument&&(e.ownerDocument.PT_CHECK_HIDDEN_CONTENT=!1);var i=s.CacheUtil.clearCaches(e),n=new a.DOMWalker(e,!1,e,!0),r={results:[],numExecuted:0,ruleTime:0,totalTime:0},l=(new Date).getTime();for(var c in this.mappers)this.mappers[c].reset(e);var m=0,p=-1;do{m++;var h=Math.floor(m/i*100);h>p&&(i>1e4&&console.log("Progress: ".concat(h,"% (").concat(m,"/").concat(i," nodes)")),p=h);var g={};for(var c in this.mappers)n.bEndTag?g[c]=this.mappers[c].closeScope(n.node):g[c]=this.mappers[c].openScope(n.node);if(11!==n.node.nodeType&&(d.VisUtil.isNodeVisible(n.node)||"meta"===n.node.nodeName.toLowerCase()||"style"===n.node.nodeName.toLowerCase()||"datalist"===n.node.nodeName.toLowerCase()||"param"===n.node.nodeName.toLowerCase()||!o.DOMUtil.getAncestor(n.node,["body"]))){var b={};for(var _ in g){var f=g[_],v=f[f.length-1];b[_]=v}for(var A={},w=0,y=this.getMatchingRules(g);w<y.length;w++){for(var C=y[w],k=!0,R=0,x=C.rule.dependencies||[];R<x.length;R++)A[x[R]]||(k=!1);if(k){var P=[];(new Date).getTime();try{P=C.run(this,b,t,g)}catch(e){}0===P.length&&(A[C.rule.id]=!0);for(var T=0,U=P;T<U.length;T++){var I=U[T];r.results.push(I),r.ruleTime+=I.ruleTime,r.numExecuted++,I.value[1]===u.eRuleConfidence.PASS&&(A[I.ruleId]=!0)}}}}}while(n.nextNode());return s.CacheUtil.clearCaches(e),r.totalTime=(new Date).getTime()-l,Promise.resolve(r)},e.prototype.enableRules=function(e){for(var t in this.ruleMap)this.ruleMap[t].enabled=!1;for(var i=0,a=e||[];i<a.length;i++)(t=a[i])in this.ruleMap?this.ruleMap[t].enabled=!0:console.warn("WARNING: Rule Id",t,"could not be enabled.")},e.prototype.getRule=function(e){return this.ruleMap[e]},e.prototype.getRulesIds=function(){var e=[];for(var t in this.ruleMap)e.push(t);return e},e.prototype.addRules=function(e){for(var t=0,i=e;t<i.length;t++){var a=i[t];this.addRule(a,!0)}this._sortRules()},e.prototype.addRule=function(e,t){var i=n.Context.parse(e.context),a=0,r=e.id;if(r in this.ruleMap)console.log("WARNING: Rule",r,"already added to engine. Ignoring...");else{this.ruleMap[r]=e;for(var l=0,o=i;l<o.length;l++){var s=o[l],u=r;a>=1&&(u=r+"$$"+a),++a;var d=new c(e,s);this.wrappedRuleMap[u]=d;var m=d.parsedInfo.contextInfo,p=m[m.length-1],h=p.namespace+":"+p.role;p.inclusive?(this.inclRules[h]=this.inclRules[h]||[],this.inclRules[h].push(d)):(this.exclRules[h]=this.exclRules[h]||[],this.exclRules[h].push(d))}t||this._sortRules()}},e.prototype.enableSourceMap=function(e){this.sourceMapEnabled=e},e.prototype.isSourceMapEnabled=function(){return this.sourceMapEnabled},e.prototype._sortRules=function(){for(var e in this.inclRules)this.inclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0});for(var e in this.exclRules)this.exclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0})},e.prototype.addNlsMap=function(e){for(var t in e)this.nlsMap[t]=e[t]},e.prototype.addHelpMap=function(e){for(var t in e)this.helpMap[t]=e[t]},e.prototype.getMessage=function(e,t,i){var a=e.indexOf("$$");if(a>=0&&(e=e.substring(0,a)),!(e in this.nlsMap))return e;var n=this.nlsMap[e][t||0];return n?n.replace(/\{(\d+)\}/g,function(e,t,a){return i[t]}):e+"_"+t},e.prototype.getHelp=function(e,t,i){return i||(i="latest"),"".concat(r.Config.helpRoot,"/").concat(i,"/doc").concat(this.getHelpRel(e,t))},e.prototype.getHelpRel=function(e,t){var i=e.indexOf("$$");return i>=0&&(e=e.substring(0,i)),e in this.helpMap?((t=t||0)in this.helpMap[e]?this.helpMap[e][t||0]:this.helpMap[e][0])||e+"_"+t:e},e.prototype.addMapper=function(e){this.mappers[e.getNamespace()]=e},e.match=function(e,t){var i=e.parsedInfo.contextInfo,a=i.length-1,n=i[a].namespace,r=t[n][t[n].length-1],l=r.node;if(!i[a].matches(t,t[n].length-1))return!1;if(1===i.length)return!0;if(r=t[n=i[0].namespace][t[n].length-1],--a,i.slice(0,i.length-1).some(function(e){return e.namespace!==n}))return console.error("[ERROR] Rule ".concat(e.rule.id," has inconsitent parent namespaces")),!1;for(var o=t[n].length-(r.node.isSameNode(l)?2:1);o>=0&&a>=0;){var s=i[a],u=i[a].matches(t,o);if(">"===s.connector){if(!u)return!1;--a,--o}else{if(" "!==s.connector)throw new Error("Context connector "+s.connector+" is not supported");if(s.inclusive)u&&--a,--o;else{if(!u)return!1;for(var d=!1,c=o-1;!d&&c>=0;--c)d=!i[a].matches(t,c);if(d)return!1;--a}}}return-1===a},e.prototype.getMatchingRules=function(t){var i=[];function a(a){for(var n=0,r=a;n<r.length;n++){var l=r[n];l.rule.enabled&&e.match(l,t)&&i.push(l)}}for(var n in t){var r=n+":"+(t[n].length>0?t[n][t[n].length-1].role:"none");for(var l in r in this.inclRules&&a(this.inclRules[r]),this.exclRules)l!==r&&a(this.exclRules[l]);r!==n+":none"&&(r.startsWith(n+":/")?n+":/*"in this.inclRules&&a(this.inclRules[n+":/*"]):n+":*"in this.inclRules&&a(this.inclRules[n+":*"]))}return this.sortDeps(i)},e.prototype.sortDeps=function(e){for(var t=[],i=0,a=e;i<a.length;i++){var n=a[i];t.push(n)}var r=[],l={},o=!1;do{o=!1;for(var s=0;s<t.length;++s){var u=t[s];if(!(u.rule.id in l)){var d=!0;if(u.rule.dependencies&&u.rule.dependencies.length>0)for(var c=0,m=u.rule.dependencies;c<m.length;c++)m[c]in l||(d=!1);d&&(o=!0,r.push(u),l[u.rule.id]=!0,t.splice(s--,1))}}}while(o);return r},e}();t.Engine=m},4516(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;var i=function(){function e(){}return e.DEBUG=!1,e.helpRoot="https://able.ibm.com/rules/archives",e}();t.Config=i},7507(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.DOMMapper=void 0;var r=i(3103),l=i(4566),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getRole=function(e){return e.nodeName.toLowerCase()},t.prototype.getNamespace=function(){return"dom"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=0;a<i.attributes.length;++a){var n=i.attributes[a];t[n.name.toLowerCase()]=n.nodeValue}return t},t.prototype.getBounds=function(e){if(1!==e.nodeType)return null;var t=l.CacheUtil.getCache(e,"DOMMapper_Bounds",void 0);if(void 0!==t)return t;var i=1;e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.devicePixelRatio&&(i=e.ownerDocument.defaultView.devicePixelRatio);var a=e.getBoundingClientRect();if(a){var n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,r=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,o={left:Math.ceil((a.left+n)*i),top:Math.ceil((a.top+r)*i),height:Math.ceil(a.height*i),width:Math.ceil(a.width*i)};return l.CacheUtil.setCache(e,"DOMMapper_Bounds",o),o}return null},t.prototype.getUnadjustedBounds=function(e){if(1!==e.nodeType)return null;var t=l.CacheUtil.getCache(e,"DOMMapper_UnadjustedBounds",void 0);if(void 0!==t)return t;var i=e.getBoundingClientRect();if(i){var a=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,r={left:Math.ceil(i.left+a),top:Math.ceil(i.top+n),height:Math.ceil(i.height),width:Math.ceil(i.width)};return l.CacheUtil.setCache(e,"DOMMapper_UnadjustedBounds",r),r}return null},t}(r.CommonMapper);t.DOMMapper=o},1686(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMUtil=void 0;var a=i(3864),n=function(){function e(){}return e.hasParent=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName);)i=a.DOMWalker.parentElement(i);return!!i},e.getAncestor=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName.toLowerCase());)i=a.DOMWalker.parentElement(i);return i},e.sameNode=function(e,t){return e===t||(e.isSameNode?e.isSameNode(t):!e.compareDocumentPosition||0===e.compareDocumentPosition(t))},e.cleanWhitespace=function(e){return e.replace(/[ \t\r\n]/g," ").replace(/ +/g," ")},e.cleanSpace=function(e){return e.replace(/ +/g," ")},e.isInSameTable=function(t,i){if(t&&i){var a=["table"],n=e.getAncestor(t,a),r=e.getAncestor(i,a);if(null!==n&&null!=r&&e.sameNode(n,r))return!0}return!1},e.shadowRootNode=function(e){for(var t=e;null!=t&&11!==t.nodeType;)t=t.parentNode;return t},e.objectCopyWithNodeRefs=function(e){if(!e)return e;if("object"!=typeof e)return"function"==typeof e?e:JSON.parse(JSON.stringify(e));if(e instanceof Node||e.nodeType)return e;var t=void 0;if("Array"===e.constructor.name){t=[];for(var i=0,a=e;i<a.length;i++){var n=a[i];t.push(this.objectCopyWithNodeRefs(n))}}else for(var r in t={},e)t[r]=this.objectCopyWithNodeRefs(e[r]);return t},e.getAncestorWithAttribute=function(e,t,i){for(var n=a.DOMWalker.parentNode(e);null!==n;){if(1===n.nodeType&&n.getAttribute(t)===i)return n;n=a.DOMWalker.parentNode(n)}return null},e}();t.DOMUtil=n},3864(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMWalker=void 0;var a=i(3946),n=function(){function e(e,t,i,a,n){this.DEBUGIDX=0,this.indent=0,this.DEBUG=!!n,this.root=i||(e&&e.ownerDocument?e.ownerDocument.documentElement:e),9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,9===this.node.nodeType&&(this.node=this.node.documentElement),this.bEndTag=null!=t&&1==t,this.considerHidden=a||!1}return e.prototype.elem=function(){return 1===this.node.nodeType&&this.node||null},e.parentNode=function(e){if(null===e)return null;var t=e.parentNode;return e.slotOwner?t=e.slotOwner:e.ownerElement?t=e.ownerElement:t&&11===t.nodeType&&(t=t.host?t.host:null),t},e.parentElement=function(t){var i=t;do{i=e.parentNode(i)}while(i&&1!==i.nodeType);return i},e.assignSlots=function(e){for(var t=e.querySelectorAll("slot"),i=0;i<t.length;++i)for(var a=t[i],n=a.assignedNodes(),r=0;r<n.length;++r)n[r].slotOwner=a,n[r].slotIndex=r},e.firstChildNotOwnedBySlot=function(e){for(var t=e.firstChild;t&&t.slotOwner;)t=t.nextSibling;return t},e.lastChildNotOwnedBySlot=function(e){for(var t=e.lastChild;t&&t.slotOwner;)t=t.previousSibling;return t},e.nextSiblingNotOwnedBySlot=function(e){for(var t=e.nextSibling;t&&t.slotOwner;)t=t.nextSibling;return t},e.previousSiblingNotOwnedBySlot=function(e){for(var t=e.previousSibling;t&&t.slotOwner;)t=t.previousSibling;return t},e.prototype.atRoot=function(){return!this.node.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var t=this,i=function(){for(var e="",i=0;i<t.indent;++i)e+=" ";return e},n=this.node.nodeName;if(!this.node)return this.bEndTag=!1,!1;do{if(this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var r=this.node.slotOwner,l=this.node.slotIndex+1;l<r.assignedNodes().length?(this.node=r.assignedNodes()[l],this.bEndTag=!1):(this.node=r,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(e.nextSiblingNotOwnedBySlot(this.node))this.node=e.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!0}}else{var o=this.node,s=this.node,u=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(o))&&o.contentDocument&&o.contentDocument.documentElement){var d=this.node;this.node=o.contentDocument.documentElement,this.node.ownerElement=d}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(s))&&s.shadowRoot&&s.shadowRoot.firstChild?(d=this.node,this.node=s.shadowRoot,this.node.ownerElement=d,e.assignSlots(this.node)):1===this.node.nodeType&&"slot"===s.nodeName.toLowerCase()&&u.assignedNodes().length>0?this.node=u.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!e.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=e.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return this.bEndTag&&(this.indent-=2),this.DEBUG&&console.log(i()+"<".concat(this.bEndTag?"/":"").concat(this.node.nodeName,"> (from ").concat(n,") ").concat(this.DEBUGIDX++)),this.DEBUG&&this.node.slotOwner&&console.log(i()+"slotOwner: ".concat(this.node.slotOwner.nodeName)),this.DEBUG&&this.node.slotIndex&&console.log(i()+"slotIndex: ".concat(this.node.slotIndex)),this.DEBUG&&this.node.ownerElement&&console.log(i()+"ownerElement: ".concat(this.node.ownerElement.nodeName)),this.bEndTag||(this.indent+=2),!0},e.prototype.prevNode=function(){do{if(this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(t))&&t.contentDocument&&t.contentDocument.documentElement){var n=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=n}else if(1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(i))&&i.shadowRoot&&i.shadowRoot.lastChild)n=this.node,this.node=i.shadowRoot,this.node.ownerElement=n,e.assignSlots(this.node);else if(1===this.node.nodeType&&"slot"===i.nodeName.toLowerCase()&&i.assignedNodes().length>0){var r=i;this.node=r.assignedNodes()[r.assignedNodes().length-1]}else 1!==this.node.nodeType&&11!==this.node.nodeType||!e.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=e.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(this.node.slotOwner){var l=this.node.slotOwner,o=this.node.slotIndex-1;o>=0?(this.node=l.assignedNodes()[o],this.bEndTag=!0):(this.node=l,this.bEndTag=!1)}else if(e.previousSiblingNotOwnedBySlot(this.node))this.node=e.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return!0},e}();t.DOMWalker=n},8601(e,t){var i,a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eGuidelineType=t.eGuidelineCategory=t.eToolkitLevel=void 0,(n=t.eToolkitLevel||(t.eToolkitLevel={})).LEVEL_ONE="1",n.LEVEL_TWO="2",n.LEVEL_THREE="3",n.LEVEL_FOUR="4",(a=t.eGuidelineCategory||(t.eGuidelineCategory={})).ACCESSIBILITY="Accessibility",a.DESIGN="Design",a.OTHER="Other",(i=t.eGuidelineType||(t.eGuidelineType={})).DEFAULT="default",i.EXTENSION="extension"},461(e,t,i){var a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eRulesetType=t.eRuleCategory=t.eToolkitLevel=t.RuleManual=t.RulePotential=t.RuleFail=t.RuleRender=t.RulePass=t.eRulePolicy=t.eRuleConfidence=void 0,function(e){e.PASS="PASS",e.FAIL="FAIL",e.POTENTIAL="POTENTIAL",e.MANUAL="MANUAL"}(a=t.eRuleConfidence||(t.eRuleConfidence={})),function(e){e.VIOLATION="VIOLATION",e.RECOMMENDATION="RECOMMENDATION",e.INFORMATION="INFORMATION"}(n=t.eRulePolicy||(t.eRulePolicy={})),t.RulePass=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleRender=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:0,messageArgs:t||[],apiArgs:i||[]}},t.RuleFail=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.FAIL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RulePotential=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.POTENTIAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleManual=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.MANUAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}};var r=i(8601);Object.defineProperty(t,"eToolkitLevel",{enumerable:!0,get:function(){return r.eToolkitLevel}});var l=i(8601);Object.defineProperty(t,"eRuleCategory",{enumerable:!0,get:function(){return l.eGuidelineCategory}});var o=i(8601);Object.defineProperty(t,"eRulesetType",{enumerable:!0,get:function(){return o.eGuidelineType}})},7412(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.Checker=void 0;var l=i(461),o=i(7301),s=i(9955),u=i(6160),d=r(i(591)),c=i(8601),m=[],p={},h={};!function(){var e=JSON.parse(JSON.stringify(o.Engine.getLanguages()));for(var t in e.push("en-US"),d){var i=d[t];m.push(i);for(var a=e.length-1;a>=0;--a){var n=e[a];if(n in i.messages&&(p[i.id]=i.messages[n],p[i.id][0]=p[i.id].group),n in i.help){for(var r in h[i.id]={},i.help[n])h[i.id][r]="/".concat(n,"/").concat(i.help[n][r]);p[i.id][0]=p[i.id].group}}for(var l=0,s=i.rulesets;l<s.length;l++)for(var c=s[l],g=0,b=u.a11yRulesets;g<b.length;g++){var _=b[g];if(("string"==typeof c.id?[c.id]:c.id).includes(_.id))for(var f=0,v=_.checkpoints;f<v.length;f++){var A=v[f];("string"==typeof c.num?[c.num]:c.num).includes(A.num)&&(A.rules=A.rules||[],A.rules.push({id:i.id,reasonCodes:c.reasonCodes,level:c.level,toolkitLevel:c.toolkitLevel}))}}}}();var g=function(){function e(){this.guidelines=[],this.rulesets=this.guidelines,this.rulesetIds=[],this.rulesetRules={},this.ruleLevels={},this.ruleReasonLevels={},this.ruleCategory={};var e=this.engine=new o.Engine;e.addMapper(new s.ARIAMapper),e.addRules(m),e.addNlsMap(p),e.addHelpMap(h);for(var t=0,i=u.a11yRulesets;t<i.length;t++){var a=i[t];this.addRuleset(a)}}return e.prototype.addGuideline=function(e){e.id in this.rulesetRules&&this.removeGuideline(e.id),this.guidelines.push(e),this.rulesetIds.push(e.id);for(var t=[],i=0,a=e.checkpoints;i<a.length;i++){var n=a[i];n.rules=n.rules||[];for(var r=0,l=n.rules;r<l.length;r++){var o=l[r];if(!1!==o.enabled){t.push(o.id),this.ruleReasonLevels[o.id]=this.ruleReasonLevels[o.id]||{},this.ruleReasonLevels[o.id][e.id]=this.ruleReasonLevels[o.id][e.id]||{};var s=o.reasonCodes?o.reasonCodes.join("--"):"None";this.ruleReasonLevels[o.id][e.id][s]=o.level,this.ruleCategory[o.id]=this.ruleCategory[o.id]||{},this.ruleCategory[o.id][e.id]=e.category}}}this.rulesetRules[e.id]=t},e.prototype.enableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,r=0,l=a.checkpoints;r<l.length;r++)for(var o=0,s=l[r].rules;o<s.length;o++){var u=s[o];!1===u.enabled&&(n=!0,delete u.enabled)}n&&this.addGuideline(a)}},e.prototype.disableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,r=0,l=a.checkpoints;r<l.length;r++)for(var o=0,s=l[r].rules;o<s.length;o++){var u=s[o];!1!==u.enabled&&(n=!0,u.enabled=!1)}n&&this.addGuideline(a)}},e.prototype.removeGuideline=function(e){e in this.rulesetRules&&(delete this.rulesetRules[e],this.rulesets=this.guidelines=this.guidelines.filter(function(t){return t.id!==e}),this.rulesetIds=this.getGuidelineIds())},e.prototype.getGuidelines=function(){return JSON.parse(JSON.stringify(this.guidelines))},e.prototype.getGuidelineIds=function(){return this.guidelines.map(function(e){return e.id})},e.prototype.addRuleset=function(e){this.addGuideline(e)},e.prototype.enableSourceMap=function(e){this.engine.enableSourceMap(e)},e.prototype.isSourceMapEnabled=function(){return this.engine.isSourceMapEnabled()},e.prototype.check=function(e,t){var i=[];if(t){"string"==typeof t&&(t=[t]);for(var a=0,n=t;a<n.length;a++){var r=n[a];r in this.rulesetRules&&(i=i.concat(this.rulesetRules[r]))}}else i=this.engine.getRulesIds();this.engine.enableRules(i);var l=this;return this.engine.run(e).then(function(e){e.nls={};for(var i=0,a=e.results;i<a.length;i++){var n=a[i];n.ruleId in p&&(e.nls[n.ruleId]=e.nls[n.ruleId]||{0:p[n.ruleId][0]},n.reasonId in p[n.ruleId]&&(e.nls[n.ruleId][n.reasonId]=p[n.ruleId][n.reasonId]));var r=n.reasonId?n.reasonId:"None";n.value[0]=l.getReasonLevel(t,n.ruleId,r),n.category=l.getCategory(t,n.ruleId),delete n.path.css}return e})},e.prototype.getLevel=function(e,t){if(!e)return l.eRulePolicy.INFORMATION;var i=this.ruleLevels[t],a=null;if(e){if(!(t in this.ruleLevels))throw new Error("Rule triggered for which we have no rule level information: "+t);for(var n=0,r=e;n<r.length;n++){var o=r[n];o in i&&(i[o]===l.eRulePolicy.VIOLATION?a=l.eRulePolicy.VIOLATION:i[o]===l.eRulePolicy.RECOMMENDATION&&null===a?a=l.eRulePolicy.RECOMMENDATION:null===a&&(a=l.eRulePolicy.INFORMATION))}}if(null===a)throw new Error("Rule triggered for which we have no rule level information: "+t);return a},e.prototype.getReasonLevel=function(e,t,i){if(!e)return l.eRulePolicy.INFORMATION;var a=this.ruleReasonLevels[t],n=null;if(e){if(!(t in this.ruleReasonLevels))throw new Error("Rule triggered for which we have no rule level information "+t);for(var r=function(e){if(e in a){var t=new RegExp("(^|--)".concat(i,"($|--)"));Object.keys(a[e]).forEach(function(i){var r=null;"None"===i?r=a[e].None:t.test(i)&&(r=a[e][i]),null!==r&&(r===l.eRulePolicy.VIOLATION?n=l.eRulePolicy.VIOLATION:r===l.eRulePolicy.RECOMMENDATION&&null===n?n=l.eRulePolicy.RECOMMENDATION:null===n&&(n=l.eRulePolicy.INFORMATION))}),null===n&&(n=l.eRulePolicy.INFORMATION)}},o=0,s=e;o<s.length;o++)r(s[o])}if(null===n)throw new Error("Rule triggered for which we have no rule level information: "+t);return n},e.prototype.getCategory=function(e,t){var i=this.ruleCategory[t];if(!(t in this.ruleCategory))return c.eGuidelineCategory.OTHER;e||(e=this.getGuidelineIds());for(var a=0,n=e;a<n.length;a++){var r=n[a];if(r in i)return i[r]}return c.eGuidelineCategory.OTHER},e}();t.Checker=g},2297(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_target_warning=void 0;var a=i(7139),n=i(3946),r=i(5279),l=i(461),o=i(461);t.a_target_warning={id:"a_target_warning",context:"dom:a[target],dom:area[target],dom:base[target]",refactor:{WCAG20_A_TargetAndText:{Pass_0:"pass",Potential_1:"potential_warn"}},help:{"en-US":{group:"a_target_warning.html",pass:"a_target_warning.html",potential_warn:"a_target_warning.html"}},messages:{"en-US":{group:"Users should be warned in advance if their input action will open a new window",pass:"The user is warned in advance that the input action opens a new window",potential_warn:"Inform the user when their input action will open a new window"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.2.2",level:o.eRulePolicy.RECOMMENDATION,toolkitLevel:o.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var o=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(o)&&!a.CommonUtil.isTabbable(o))return null;var s={paramWinText:{value:["new window","new tab"],type:"array"}},u=o.getAttribute("target"),d="_parent"==u||"_self"==u||"_top"==u||null!=a.CommonUtil.getFrameByName(o,u);if(!d){var c=a.CommonUtil.getInnerText(o);if(o.hasAttribute("title")&&(c+=" "+o.getAttribute("title")),o.hasAttribute("aria-describedby"))for(var m=0,p=o.getAttribute("aria-describedby").trim().split(/\s+/);m<p.length;m++){var h=p[m],g=r.FragmentUtil.getById(o,h);if(g){var b=a.CommonUtil.getInnerText(g);b&&b.trim().length>0&&(c+=" "+b)}}for(var _=0;!d&&_<s.paramWinText.value.length;++_)-1!=c.indexOf(s.paramWinText.value[_])&&(d=!0)}return d?(0,l.RulePass)("pass"):(0,l.RulePotential)("potential_warn")}}},4401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_text_purpose=void 0;var a=i(461),n=i(7139),r=i(3946),l=i(461),o=i(1950);t.a_text_purpose={id:"a_text_purpose",context:"aria:link,aria:doc-biblioref",refactor:{WCAG20_A_HasText:{Pass_0:"pass",Fail_1:"fail_acc_name"}},help:{"en-US":{group:"a_text_purpose.html",pass:"a_text_purpose.html",fail_acc_name:"a_text_purpose.html"}},messages:{"en-US":{group:"Hyperlinks must have an accessible name for their purpose",pass:"Hyperlink has a description of its purpose",fail_acc_name:"Hyperlink has no link text, label or image with a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["2.4.4","4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:"c487ae",run:function(e,t){var i=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(i)||n.CommonUtil.isNodeDisabled(i))return null;var l=o.AccNameUtil.computeAccessibleName(i);return l&&l.name&&l.name.trim().length>0||n.CommonUtil.nonTabableChildCheck(i)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},4546(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.applet_alt_exists=void 0;var a=i(7139),n=i(3946),r=i(461),l=i(461);t.applet_alt_exists={id:"applet_alt_exists",context:"dom:applet",refactor:{WCAG20_Applet_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"applet_alt_exists.html",Pass_0:"applet_alt_exists.html",Fail_1:"applet_alt_exists.html",Fail_2:"applet_alt_exists.html",Fail_3:"applet_alt_exists.html"}},messages:{"en-US":{group:"<applet> elements must provide an 'alt' attribute and an alternative description",Pass_0:"Rule Passed",Fail_1:"An <applet> element does not have an 'alt' attribute that provides a short text alternative",Fail_2:"The 'alt' attribute value for an <applet> element duplicates the 'code' attribute",Fail_3:"An <applet> element provides alternative text, but does not provide inner content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;if(a.CommonUtil.attributeNonEmpty(l,"alt")){var o=l.getAttribute("alt").trim();return l.hasAttribute("code")&&o==l.getAttribute("code").trim()?(0,r.RuleFail)("Fail_2"):a.CommonUtil.hasInnerContentHidden(l)?(0,r.RulePass)("Pass_0"):(0,r.RuleFail)("Fail_3")}return(0,r.RuleFail)("Fail_1")}}},9292(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.application_content_accessible=void 0;var a=i(7011),n=i(3946),r=i(461),l=i(461);t.application_content_accessible={id:"application_content_accessible",context:"aria:application",refactor:{HAAC_Application_Role_Text:{0:"HAAC_Application_Role_Text.html",Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{0:"application_content_accessible.html",Pass_0:"application_content_accessible.html",Potential_1:"application_content_accessible.html"}},messages:{"en-US":{group:'Non-decorative static text and image content within an element with "application" role must be accessible',Pass_0:"Rule Passed",Potential_1:'Verify that the non-decorative static text and image content within an element with "application" role are accessible'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.1.1","2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){for(var l=!0,o=e.dom.node.childNodes,s=0;l&&s<o.length;s++)1===o[s].nodeType?n.VisUtil.isNodeVisible(o[s])&&(l=a.AriaUtil.hasRoleInSemantics(o[s],"document")||a.AriaUtil.hasRoleInSemantics(o[s],"article")):3===o[s].nodeType&&(l=0===o[s].nodeValue.trim().length);return l?(0,r.RulePass)("Pass_0"):(0,r.RulePotential)("Potential_1")}}},9605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.area_alt_exists=void 0;var a=i(7139),n=i(3946),r=i(461),l=i(461);t.area_alt_exists={id:"area_alt_exists",context:"dom:area",refactor:{WCAG20_Area_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"area_alt_exists.html",Pass_0:"area_alt_exists.html",Fail_1:"area_alt_exists.html"}},messages:{"en-US":{group:"<area> elements in an image map must have a text alternative",Pass_0:"Rule Passed",Fail_1:"<area> element in an image map has no text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.VisUtil.isNodeHiddenFromAT(l)?null:a.CommonUtil.attributeNonEmpty(l,"alt")?(0,r.RulePass)("Pass_0"):(0,r.RuleFail)("Fail_1")}}},3987(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_accessiblename_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946),o=i(1950),s=i(9910);t.aria_accessiblename_exists={id:"aria_accessiblename_exists",context:"aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example",help:{"en-US":{pass:"aria_accessiblename_exists.html",fail_no_accessible_name:"aria_accessiblename_exists.html",fail_no_accessible_name_image:"aria_accessiblename_exists.html",group:"aria_accessiblename_exists.html"}},messages:{"en-US":{pass:"An accessible name is provided for the element",fail_no_accessible_name:'Element <{0}> with "{1}" role has no accessible name',fail_no_accessible_name_image:'Element <{0}> with "{1}" role has no accessible name',group:"Elements with certain roles should have accessible names"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name_image"]}],act:[{"23a2a8":{fail_no_accessible_name_image:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var u=n.nodeName.toLocaleLowerCase();if("svg"!==u&&"img"!==u){if("table"===u&&n.firstElementChild&&"caption"===n.firstElementChild.nodeName.toLowerCase()&&n.firstElementChild.textContent&&n.firstElementChild.textContent.trim().length>0)return(0,a.RulePass)("pass");var d=r.AriaUtil.getRolesUndefinedByAria(n);if(d&&d.length>0)return null;var c=r.AriaUtil.getDeprecatedAriaRoles(n);if(c&&c.length>0)return null;var m=r.AriaUtil.getDeprecatedAriaAttributes(n);if(m&&m.length>0)return null;var p=r.AriaUtil.getResolvedRole(n);if(!p||!s.ARIADefinitions.designPatterns[p]||!s.ARIADefinitions.designPatterns[p].nameRequired)return null;var h=o.AccNameUtil.computeAccessibleName(n);return h&&h.name&&0!==h.name.trim().length?(0,a.RulePass)("pass"):"img"===p||"image"===p?(0,a.RuleFail)("fail_no_accessible_name_image",[n.nodeName.toLowerCase(),p]):(0,a.RuleFail)("fail_no_accessible_name",[n.nodeName.toLowerCase(),p])}}}},8631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_tabindex_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.aria_activedescendant_tabindex_valid={id:"aria_activedescendant_tabindex_valid",context:"dom:*[aria-activedescendant]",refactor:{Rpt_Aria_InvalidTabindexForActivedescendant:{pass:"pass",Fail_1:"Fail_1"}},help:{"en-US":{pass:"aria_activedescendant_tabindex_valid.html",Fail_1:"aria_activedescendant_tabindex_valid.html",group:"aria_activedescendant_tabindex_valid.html"}},messages:{"en-US":{pass:"Rule Passed",Fail_1:"The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable",group:"Element using 'aria-activedescendant' property should be tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!1,o=n.nodeName.toLowerCase();if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if(r.CommonUtil.isNodeDisabled(n))return null;if(0!==n.getAttribute("aria-activedescendant").trim().length){(l=r.CommonUtil.isTabbable(n))||(l=r.CommonUtil.getTabbableChildren(n)>0);var s=new Array;s.push(o);var u=new Array;return u.push(n.getAttribute("aria-activedescendant").split(" ").join(", ")),l?(0,a.RulePass)("pass"):(0,a.RuleFail)("Fail_1",[s.toString(),u.toString()])}}}},8025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(3946),u=i(1686);t.aria_activedescendant_valid={id:"aria_activedescendant_valid",context:"dom:*[aria-activedescendant]",refactor:{HAAC_ActiveDescendantCheck:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"aria_activedescendant_valid.html",Fail_1:"aria_activedescendant_valid.html",Fail_2:"aria_activedescendant_valid.html",Fail_3:"aria_activedescendant_valid.html",group:"aria_activedescendant_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'aria-activedescendant' property is empty",Fail_2:"The 'aria-activedescendant' property references a hidden node",Fail_3:"Element is not a combobox, and the referenced active-descendant element is not a valid descendant",group:"The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.AriaUtil.hasRoleInSemantics(n,"combobox"))return null;var d=r.AriaUtil.getAriaAttribute(n,"aria-activedescendant");if(!d||""===d.trim())return(0,a.RuleFail)("Fail_1");var c=o.FragmentUtil.getById(n,d.trim());if(!c||u.DOMUtil.sameNode(d,n))return null;if(!s.VisUtil.isNodeVisible(c))return(0,a.RuleFail)("Fail_2");if(n.contains(c))return(0,a.RulePass)("Pass_0");var m=2;if(n.hasAttribute("aria-owns"))for(var p=l.CommonUtil.normalizeSpacing(n.getAttribute("aria-owns").trim()).split(" "),h=0;h<p.length;h++)if((v=o.FragmentUtil.getById(n,p[h]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0");if(r.AriaUtil.hasRoleInSemantics(n,"textbox")&&n.hasAttribute("aria-controls")){m=3;var g=l.CommonUtil.normalizeSpacing(n.getAttribute("aria-controls").trim()).split(" ");for(h=0;h<g.length;h++){var b=o.FragmentUtil.getById(n,g[h]);if(b&&!u.DOMUtil.sameNode(b,n)&&b.contains(c))return(0,a.RulePass)("Pass_0");if(b.hasAttribute("aria-owns"))for(var _=l.CommonUtil.normalizeSpacing(b.getAttribute("aria-owns").trim()).split(" "),f=0;f<_.length;f++){var v;if((v=o.FragmentUtil.getById(n,_[f]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0")}}}return 3==m?(0,a.RuleFail)("Fail_3"):null}}},1198(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_application_label_unique={id:"aria_application_label_unique",context:"aria:application",refactor:{Rpt_Aria_MultipleApplicationLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_application_label_unique.html",fail_label_not_unique:"aria_application_label_unique.html",group:"aria_application_label_unique.html"}},messages:{"en-US":{pass:'The element with "application" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "application" role do not have unique labels',group:'Each element with "application" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"application");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8001(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_labelled=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.aria_application_labelled={id:"aria_application_labelled",context:"aria:application",refactor:{Rpt_Aria_ApplicationLandmarkLabel:{Pass_0:"pass",Fail_1:"fail_no_label"}},help:{"en-US":{pass:"aria_application_labelled.html",fail_no_label:"aria_application_labelled.html",group:"aria_application_labelled.html"}},messages:{"en-US":{pass:'The element with "application" role has a label that describes its purpose',fail_no_label:'Element with "application" role does not have a label',group:'Each element with "application" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_label")}}},5778(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_article_label_unique=void 0;var a=i(461),n=i(461),r=i(3946),l=i(7011);t.aria_article_label_unique={id:"aria_article_label_unique",context:"aria:article",refactor:{Rpt_Aria_MultipleArticleRoles_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_article_label_unique.html",fail_label_not_unique:"aria_article_label_unique.html",group:"aria_article_label_unique.html"}},messages:{"en-US":{pass:'The element with "article" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "article" role do not have unique labels',group:'Each element with "article" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"article");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8118(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_allowed=void 0;var a=i(461),n=i(461),r=i(9910),l=i(7011);t.aria_attribute_allowed={id:"aria_attribute_allowed",context:"dom:*",refactor:{Rpt_Aria_ValidProperty:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_allowed.html",Pass_0:"aria_attribute_allowed.html",Fail_1:"aria_attribute_allowed.html"}},messages:{"en-US":{group:"ARIA attributes must be valid for the element's role",Pass_0:"Rule Passed",Fail_1:"The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"5f99a7",run:function(e,t,i){var n=e.dom.node,o=n.attributes;if(o){for(var s=r.ARIADefinitions.propertyDataTypes,u="",d=0,c=0,m=o.length;c<m;c++){var p=o[c].name;l.AriaUtil.isDefinedAriaAttribute(n,p)&&(d++,s[p]||(u=0==u.length?p:u+", "+p))}return 0==d?null:0!=u.length?(0,a.RuleFail)("Fail_1",[u,n.nodeName.toLowerCase()]):(0,a.RulePass)("Pass_0")}return null}}},2242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_conflict=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.aria_attribute_conflict={id:"aria_attribute_conflict",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{fail_conflict:"aria_attribute_conflict.html",group:"aria_attribute_conflict.html"}},messages:{"en-US":{fail_conflict:'The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"',group:"An ARIA attribute must not conflict with the corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.AriaUtil.getInvalidAriaAttributes(n);if(o&&o.length>0)return null;var s=[],u=r.AriaUtil.getUserDefinedAriaAttributes(n);if(!u||0===u.length)return null;for(var d=r.AriaUtil.getConflictAriaAndHtmlAttributes(n),c=0;c<d.length;c++)s.push((0,a.RuleFail)("fail_conflict",[d[c].ariaAttr,d[c].htmlAttr])),u.includes(d[c].ariaAttr)&&l.CommonUtil.reduceArrayItemList([d[c].ariaAttr],u);return s.length>0?s:null}}},3673(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_deprecated=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_attribute_deprecated={id:"aria_attribute_deprecated",context:"dom:*",help:{"en-US":{fail_aria_role:"aria_attribute_deprecated.html",fail_aria_attr:"aria_attribute_deprecated.html",fail_role_attr:"aria_attribute_deprecated.html",group:"aria_attribute_deprecated.html"}},messages:{"en-US":{fail_aria_role:'The ARIA role "{0}" is deprecated in the ARIA specification',fail_aria_attr:'The ARIA attributes "{0}" are deprecated in the ARIA specification',fail_role_attr:'The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification',group:"No deprecated ARIA role or attribute should be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=[],o=r.AriaUtil.getDeprecatedAriaRoles(n);if(o&&o.length>0)for(var s=0;s<o.length;s++)l.push((0,a.RuleFail)("fail_aria_role",[o[s]]));var u=r.AriaUtil.getDeprecatedAriaAttributes(n);if(u&&u.length>0)for(s=0;s<u.length;s++)"any"===u[s].role?l.push((0,a.RuleFail)("fail_aria_attr",[u[s].attribute])):l.push((0,a.RuleFail)("fail_role_attr",[u[s].attribute,u[s].role]));return l.length>0?l:null}}},5080(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3946);t.aria_attribute_exists={id:"aria_attribute_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_EmptyPropertyValue:{pass:"pass",fail_empty_attribute:"fail_empty_attribute"}},help:{"en-US":{pass:"aria_attribute_exists.html",fail_empty_attribute:"aria_attribute_exists.html",group:"aria_attribute_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_empty_attribute:"The element attribute(s): '{0}' value is empty",group:"When specifying a required ARIA attribute, the value must not be empty"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["6a7281"],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)){var u=new Array,d=o.ARIADefinitions.designPatterns,c=l.CommonUtil.hasAttribute,m=0,p=r.AriaUtil.getResolvedRole(n);if(p){if(d[p]&&null!=r.AriaUtil.getRoleRequiredProperties(p,n))for(var h=r.AriaUtil.getRoleRequiredProperties(p,n),g=0,b=h.length;g<b;g++)c(n,w=h[g])?(m++,0==l.CommonUtil.normalizeSpacing(n.getAttribute(h[g])).length&&u.push(h[g])):"aria-labelledby"==h[g]?"radiogroup"==p&&c(n,"aria-label")&&(m++,0==l.CommonUtil.normalizeSpacing(n.getAttribute("aria-label")).length&&u.push("aria-label")):"aria-valuenow"==h[g]&&"progressbar"==p&&c(n,"aria-valuetext")&&(m++,0==l.CommonUtil.normalizeSpacing(n.getAttribute("aria-valuetext")).length&&u.push("aria-valuetext"));if(d[p]){var _=r.AriaUtil.getElementAriaProperty(n),f=[];f.push(p);for(var v=r.AriaUtil.getAllowedAriaAttributes(n,f,_),A=(g=0,v.length);g<A;g++){var w;"aria-checked"!=(w=v[g])&&"aria-selected"!=w&&"aria-expanded"!=w&&"aria-orientation"!=w&&"aria-level"!=w||c(n,w)&&(m++,0!=l.CommonUtil.normalizeSpacing(n.getAttribute(w)).length||u.includes(w)||u.push(w))}}var y=new Array,C=0==u.length;return y.push(u.join(", ")),0==m?null:C?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_empty_attribute",y)}}}}},183(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_redundant=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_attribute_redundant={id:"aria_attribute_redundant",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{pass:"aria_attribute_redundant.html",fail_redundant:"aria_attribute_redundant.html",group:"aria_attribute_redundant.html"}},messages:{"en-US":{pass:"The ARIA attribute is not redundant with a corresponding HTML attribute",fail_redundant:'The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"',group:"An ARIA attribute should not be redundant with a corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.AriaUtil.getInvalidAriaAttributes(n);if(l&&l.length>0)return null;var o=r.AriaUtil.getConflictAriaAndHtmlAttributes(n);if(o&&o.length>0)return null;var s=n.attributes,u=[],d=[];if(s)for(var c=0;c<s.length;c++){var m=s[c].name.trim().toLowerCase(),p=n.getAttribute(m);""===p&&(p=null),"aria-"===m.substring(0,5)?u.push({name:m,value:p}):d.push({name:m,value:p})}var h=[],g=function(e){var t=r.AriaUtil.getConflictOrOverlappingHtmlAttribute(u[e],d,"overlapping");if(null===t)return"continue";t.forEach(function(t){"Pass"===t.result?h.push((0,a.RulePass)("pass")):"Failed"===t.result&&h.push((0,a.RuleFail)("fail_redundant",[u[e].name,t.attr]))})};for(c=0;c<u.length;c++)g(c);return h.length>0?h:null}}},6805(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_required=void 0;var a=i(9910),n=i(7011),r=i(7139),l=i(461),o=i(461);t.aria_attribute_required={id:"aria_attribute_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredProperties:{Pass_0:"pass",Fail_1:"fail_missing"}},help:{"en-US":{group:"aria_attribute_required.html",pass:"aria_attribute_required.html",fail_missing:"aria_attribute_required.html"}},messages:{"en-US":{group:"The required attributes for the element with a role must be defined",pass:"The required attributes for the element with the role are defined",fail_missing:"Element with '{0}' role does not have the required ARIA attribute(s): '{1}'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:"4e8ab6",run:function(e,t,i){var o=e.dom.node,s=new Array,u=new Array,d=a.ARIADefinitions.designPatterns,c=r.CommonUtil.hasAttribute,m=n.AriaUtil.getElementAriaProperty(o),p=n.AriaUtil.getResolvedRole(o);if(p){var h=n.AriaUtil.getRoleRequiredProperties(p,o);if(d[p]&&null!==h){for(var g=n.AriaUtil.getAllowedAriaAttributes(o,p,m),b=!1,_=0,f=h.length;_<f;_++)g.includes(h[_])&&(c(o,h[_])||("aria-labelledby"==h[_]?c(o,"aria-label")&&"radiogroup"==p||(s.push(h[_]),b=!0):"aria-valuenow"==h[_]?c(o,"aria-valuetext")&&"progressbar"==p||(s.push(h[_]),b=!0):"aria-controls"==h[_]&&"combobox"==p||(s.push(h[_]),b=!0)));1==b&&u.push(p)}if(0==u.length||0==s.length)return(0,l.RulePass)("pass");var v=new Array;return v.push(u.join(", ")),v.push(s.join(", ")),(0,l.RuleFail)("fail_missing",v)}}}},1886(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_value_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910);t.aria_attribute_value_valid={id:"aria_attribute_value_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{Rpt_Aria_ValidPropertyValue:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_value_valid.html",Pass_0:"aria_attribute_value_valid.html",Fail_1:"aria_attribute_value_valid.html"}},messages:{"en-US":{group:"ARIA property values must be valid",Pass_0:"Rule Passed",Fail_1:"The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"6a7281",run:function(e,t,i){var n=e.dom.node,s=new Array,u=new Array,d=new Array,c=o.ARIADefinitions.propertyDataTypes,m=n.attributes,p=0;if(m)for(var h=0,g=m.length;h<g;h++){var b=m[h].name;if(r.AriaUtil.isDefinedAriaAttribute(n,b)){var _=c[b],f=l.CommonUtil.normalizeSpacing(m[h].nodeValue);if(p++,_&&_.values){if(-1==_.values.indexOf(f))if(-1!=_.values.indexOf("undefined")&&0==f.length);else if("http://www.w3.org/2001/XMLSchema#nmtokens"===_.type){var v=m[h].nodeValue.trim().split(" ");if(v.length>1&&v.includes("all"))s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString());else for(var A={},w=0;w<v.length;w++)""==v[w]||_.values.includes(v[w])||(A.hasOwnProperty(b)||(A[b]=!0,u.push(b)),s.push(v[w]),d.push(_.values.toString()))}else s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString())}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#int"===_.type){var y=parseInt(f);(isNaN(y)||""+y!==f)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#decimal"==_.type){var C=parseFloat(f);isNaN(C)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#boolean"==_.type){var k=f.trim().toLowerCase();"true"!==k&&"false"!==k&&(s.push(f),u.push(b))}else _&&_.type&&"http://www.w3.org/2001/XMLSchema#string"==_.type||p--}}var R=new Array,x=0==u.length;return R.push(s.join(", ")),R.push(u.join(", ")),R.push(n.nodeName.toLowerCase()),0==p?null:x?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",R)}}},4078(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_banner_label_unique={id:"aria_banner_label_unique",context:"aria:banner",refactor:{Rpt_Aria_MultipleBannerLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_banner_label_unique.html",fail_label_not_unique:"aria_banner_label_unique.html",group:"aria_banner_label_unique.html"}},messages:{"en-US":{pass:'The element with "banner" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "banner" role do not have unique labels',group:'Each element with "banner" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"banner",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5750(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_single=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_banner_single={id:"aria_banner_single",context:"dom:*[role], dom:header",refactor:{Rpt_Aria_OneBannerInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_single.html",Fail_1:"aria_banner_single.html",group:"aria_banner_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role found on the page',group:'A page, document, or application should only have one element with "banner" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"banner")?null===r.AriaUtil.getSiblingWithRoleHidden(n,"banner",!0,!0)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},85(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_tabbable=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3946);t.aria_child_tabbable={id:"aria_child_tabbable",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingFocusableChild:{pass:"pass",fail_missing_child:"fail_missing_child"}},help:{"en-US":{pass:"aria_child_tabbable.html",fail_missing_child:"aria_child_tabbable.html",group:"aria_child_tabbable.html"}},messages:{"en-US":{pass:"Rule Passed",fail_missing_child:'None of the descendent elements with "{1}" role is tabbable',group:"UI component must have at least one tabbable descendant for keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||l.CommonUtil.isNodeDisabled(n)||r.AriaUtil.containsPresentationalChildrenOnly(n)||r.AriaUtil.shouldBePresentationalChild(n))){if(r.AriaUtil.hasRole(n,{list:!0,row:!0,rowgroup:!0,table:!0,grid:!0}))return null;if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if("datalist"===n.nodeName.toLowerCase())return null;if(r.AriaUtil.isNavigationOwnedOrControlled(n))return null;var u=r.AriaUtil.getResolvedRole(n),d=!0,c=n.ownerDocument,m=l.CommonUtil.hasAttribute,p=new Array,h="",g=!1;if(o.ARIADefinitions.containers.includes(u)&&"true"!=(m(n,"aria-disabled")?n.getAttribute("aria-disabled"):"")&&!m(n,"aria-activedescendant")&&!l.CommonUtil.isTabbable(n)){var b=o.ARIADefinitions.designPatterns[u].reqChildren;if(b){g=!0,d=!1;for(var _="descendant::*[",f=0;f<b.length;f++)_+="@role='"+b[f]+"' or ";_=_.substring(0,_.length-4)+"]";for(var v=c.evaluate(_,n,l.CommonUtil.defaultNSResolver,0,null),A=v.iterateNext();A&&!d;)if(l.CommonUtil.shouldNodeBeSkippedHidden(A))A=v.iterateNext();else{if(!(d=l.CommonUtil.isTabbable(A)))for(var w=c.evaluate("descendant::*",A,l.CommonUtil.defaultNSResolver,0,null),y=w.iterateNext();y&&!d;)l.CommonUtil.shouldNodeBeSkippedHidden(y)||(d=l.CommonUtil.isTabbable(A)),y=w.iterateNext();d||(p=A.getAttribute("role").trim().split(" "),h=A.nodeName.toLowerCase()),A=v.iterateNext()}}}var C=new Array,k=new Array;return h.length>0&&p.length>0?(C.push(h),k.push(p.join(", "))):d=!0,g?d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_missing_child",[C.toString(),k.toString()]):null}}}},514(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_child_valid={id:"aria_child_valid",context:"dom:*",dependencies:["aria_role_valid","aria_descendant_valid"],help:{"en-US":{group:"aria_child_valid.html",Pass:"aria_child_valid.html",Fail_no_child:"aria_child_valid.html",Fail_invalid_child:"aria_child_valid.html"}},messages:{"en-US":{group:"An element with an ARIA role must own a required child",Pass:"An element with an ARIA role owns a required child",Fail_no_child:'The element with role "{0}" does not own any child element with any of the following role(s): "{1}"',Fail_invalid_child:'The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["bc4a75"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)&&!r.AriaUtil.containsPresentationalChildrenOnly(n)){var s=r.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=r.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=["none","presentation"];if(s.some(function(e){return u.includes(e)}))return null;if(s.includes("combobox"))return null;var d=r.AriaUtil.getRequiredChildRoles(n,!0);if(d.includes("group")){var c=d.indexOf("group");c>-1&&d.splice(c,1)}if(0==d.length)return null;var m=r.AriaUtil.getDirectATChildren(n);if(!m||0==m.length){var p=n.getAttribute("aria-busy");return p&&"true"===p?null:((v=new Array).push(s.join(", ")),v.push(d.join(", ")),(0,a.RuleFail)("Fail_no_child",v))}for(var h=new Array,g=0;g<m.length;g++){var b=r.AriaUtil.getRoles(m[g],!1);b&&0!=b.length||(b=r.AriaUtil.getImplicitRole(m[g])),b&&b.length>0&&(b.some(function(e){return d.includes(e)})||h.push(b.join(", ")))}if(h.length>0){for(var _=[],f=0;f<h.length;f++){var v;(v=new Array).push(s.join(", ")),v.push(h[f]),v.push(d.join(", ")),_.push((0,a.RuleFail)("Fail_invalid_child",v))}return _}return(0,a.RulePass)("Pass")}}}},5310(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_complementary_label_unique={id:"aria_complementary_label_unique",context:"aria:complementary",refactor:{Rpt_Aria_MultipleComplementaryLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_complementary_label_unique.html",fail_label_not_unique:"aria_complementary_label_unique.html",group:"aria_complementary_label_unique.html"}},messages:{"en-US":{pass:'The element with "complementary" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "complementary" role do not have unique labels',group:'Each element with "complementary" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"complementary");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},9083(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_complementary_label_visible={id:"aria_complementary_label_visible",context:"dom:*[role], dom:aside",dependencies:["aria_complementary_labelled"],refactor:{Rpt_Aria_ComplementaryLandmarkLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_visible.html",Fail_1:"aria_complementary_label_visible.html",group:"aria_complementary_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a visible label',group:'Each element with "complementary" role should have a visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"complementary")?l.CommonUtil.attributeNonEmpty(n,"aria-labelledby")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},6049(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_labelled=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.aria_complementary_labelled={id:"aria_complementary_labelled",context:"aria:complementary",refactor:{Rpt_Aria_ComplementaryRequiredLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_labelled.html",Fail_1:"aria_complementary_labelled.html",group:"aria_complementary_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a label',group:'Each element with "complementary" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_content_in_landmark=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(4566),s=i(3864),u=i(3946),d=i(9196);t.aria_content_in_landmark={id:"aria_content_in_landmark",context:"dom:*",refactor:{Rpt_Aria_OrphanedContent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_content_in_landmark.html",Fail_1:"aria_content_in_landmark.html",group:"aria_content_in_landmark.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Content is not within a landmark element",group:"All content must reside within an element with a landmark role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=o.CacheUtil.getCache(e.dom.node.ownerDocument,"aria_content_in_landmark",null);if(!n){(n={landmarks:{value:["banner","complementary","contentinfo","form","main","navigation","region","search"],type:"array"},possibleOrphanedWidgets:{value:["button","combobox","checkbox","grid","heading","link","list","listbox","menu","menubar","progressbar","radio","tablist","textbox","toolbar","tree","treegrid"],type:"array"},possibleOrphanedElements:{value:["p","table","input","textarea","select","button","a","ol","ul","dl","h1","h2","h3","h4","h5","h6","embed","object","area"],type:"array"},noLandmarkedRoles:{value:["alert","alertdialog","dialog","tooltip"],type:"array"},mapLandmarks:{},mapPossibleOrphanedWidgets:{},mapPossibleOrphanedElements:{},mapNoLandmarkedRoles:{}}).mapLandmarks={};for(var c=0;c<n.landmarks.value.length;++c)n.mapLandmarks[n.landmarks.value[c]]=!0;for(n.mapPossibleOrphanedWidgets={},c=0;c<n.possibleOrphanedWidgets.value.length;++c)n.mapPossibleOrphanedWidgets[n.possibleOrphanedWidgets.value[c]]=!0;for(n.mapPossibleOrphanedElements={},c=0;c<n.possibleOrphanedElements.value.length;++c)n.mapPossibleOrphanedElements[n.possibleOrphanedElements.value[c]]=!0;for(n.mapNoLandmarkedRoles={},c=0;c<n.noLandmarkedRoles.value.length;++c)n.mapNoLandmarkedRoles[n.noLandmarkedRoles.value[c]]=!0;o.CacheUtil.setCache(e.dom.node.ownerDocument,"aria_content_in_landmark",n)}var m=e.dom.node,p=m.nodeName.toLowerCase();if(!u.VisUtil.isNodeVisible(m)||null!=u.VisUtil.hiddenByDefaultElements&&null!=u.VisUtil.hiddenByDefaultElements&&u.VisUtil.hiddenByDefaultElements.indexOf(p)>-1)return(0,a.RulePass)("Pass_0");if(!l.CommonUtil.hasInnerContentHidden(m)&&-1===["area","input","embed","button","textarea","select"].indexOf(p))return(0,a.RulePass)("Pass_0");if("table"==p&&d.TableUtil.isLayoutTable(m))return null;var h=!0,g=r.AriaUtil.hasRole(m,n.mapPossibleOrphanedWidgets,!0);"link"===p&&(g=!1);var b=p in n.mapPossibleOrphanedElements;if(!g&&!b)return null;if(!(h=i.aria.map(function(e){return e.role}).filter(function(e){return e in n.mapLandmarks}).length>0)){for(var _=s.DOMWalker.parentElement(m);!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=s.DOMWalker.parentElement(_);for(_=m.nextElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.nextElementSibling;for(_=m.previousElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.previousElementSibling;if(h)return null;if(o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent",!0),h=o.CacheUtil.getCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!1)||r.AriaUtil.hasRole(m,n.mapNoLandmarkedRoles,!0)||r.AriaUtil.getAncestorWithRole(m,n.mapNoLandmarkedRoles,!0))return o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!0),null}return h?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2759(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_contentinfo_label_unique={id:"aria_contentinfo_label_unique",context:"aria:contentinfo",refactor:{Rpt_Aria_MultipleContentinfoLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_contentinfo_label_unique.html",fail_label_not_unique:"aria_contentinfo_label_unique.html",group:"aria_contentinfo_label_unique.html"}},messages:{"en-US":{pass:'The element with "contentinfo" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "contentinfo" role do not have unique labels',group:'Each element with "contentinfo" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"contentinfo",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},3141(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_misuse=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_contentinfo_misuse={id:"aria_contentinfo_misuse",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_ContentinfoWithNoMain_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_misuse.html",Fail_1:"aria_contentinfo_misuse.html",group:"aria_contentinfo_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "contentinfo" role is present without an element with "main" role',group:'Each element with "contentinfo" role is only permitted with an element with "main" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"contentinfo")?l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0).length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},5131(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_single=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_contentinfo_single={id:"aria_contentinfo_single",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_single.html",Fail_1:"aria_contentinfo_single.html",group:"aria_contentinfo_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role found on the page',group:'A page, document, or application should only have one element with "contentinfo" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"contentinfo")?r.AriaUtil.getSiblingWithRoleHidden(n,"contentinfo",!0,!0)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0"):null}}},5167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_descendant_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_descendant_valid={id:"aria_descendant_valid",context:"dom:*",dependencies:["aria_role_valid"],help:{"en-US":{group:"aria_descendant_valid.html",pass:"aria_descendant_valid.html",potential_child_implicit_role:"aria_descendant_valid.html",recommendation_no_impact_role:"aria_descendant_valid.html",fail_child_explicit_role:"aria_descendant_valid.html"}},messages:{"en-US":{group:"Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements",pass:"The element contains valid descendants",potential_child_implicit_role:'The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers',recommendation_no_impact_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers',fail_child_explicit_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["pass","potential_child_implicit_role","fail_child_explicit_role"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["recommendation_no_impact_role"]}],act:["307n5z"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)&&r.AriaUtil.containsPresentationalChildrenOnly(n)){var s=r.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=r.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=r.AriaUtil.getDirectATChildren(n);if(!(u&&u.length>0))return(0,a.RulePass)("pass");for(var d=new Array,c=new Array,m=new Array,p=0;p<u.length;p++){var h=u[p].nodeName.toLowerCase();if("img"!==h&&"svg"!==h){var g=r.AriaUtil.getRoles(u[p],!1);g&&g.length>0?(g.includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),d.push(g.filter(function(e){return"code"!==e}).join(", "))):((g=r.AriaUtil.getImplicitRole(u[p])).includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),g&&g.length>0&&c.push(g.filter(function(e){return"code"!==e}).join(", ")))}}if(d.length>0){for(var b=[],_=0;_<d.length;_++)(f=new Array).push(s.join(", ")),f.push(d[_]),b.push((0,a.RuleFail)("fail_child_explicit_role",f));return b}if(c.length>0){for(b=[],_=0;_<c.length;_++)(f=new Array).push(s.join(", ")),f.push(c[_]),b.push((0,a.RulePotential)("potential_child_implicit_role",f));return b}if(m.length>0){for(b=[],_=0;_<m.length;_++){var f;(f=new Array).push(s.join(", ")),f.push(m[_]),b.push((0,a.RulePotential)("recommendation_no_impact_role",f))}return b}}}}},8115(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_document_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_document_label_unique={id:"aria_document_label_unique",context:"aria:document",refactor:{Rpt_Aria_MultipleDocumentRoles:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_document_label_unique.html",fail_label_not_unique:"aria_document_label_unique.html",group:"aria_document_label_unique.html"}},messages:{"en-US":{pass:'The element with "document" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "document" roles do not have unique labels',group:'Each element with "document" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"document",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_eventhandler_role_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.aria_eventhandler_role_valid={id:"aria_eventhandler_role_valid",context:"dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]",refactor:{Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_eventhandler_role_valid.html",Fail_1:"aria_eventhandler_role_valid.html",group:"aria_eventhandler_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <{0}> element with '{1}' does not have a valid ARIA role specified",group:"Elements with event handlers must have a valid ARIA role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.getAncestor(n,"svg"))return null;if(r.AriaUtil.hasAnyRole(n,!0))return(0,a.RulePass)("Pass_0");if(l.CommonUtil.isfocusableByDefault(n))return(0,a.RulePass)("Pass_0");var o=new Array;o.push(n.nodeName.toLowerCase());for(var s=new Array,u=["onblur","onfocus","onchange","onclick","ondblclick","onkeydown","onkeypress","onkeyup","onmousedown","onmouseup","onmousemove","onmouseout","onmouseover","onresize"],d=0;d<u.length;++d)n.hasAttribute(u[d])&&s.push(u[d]);var c=new Array;return c.push(s.join(", ")),(0,a.RuleFail)("Fail_1",[o.toString(),c.toString()])}}},5782(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_form_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_form_label_unique={id:"aria_form_label_unique",context:"aria:form",refactor:{Rpt_Aria_MultipleFormLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_form_label_unique.html",fail_label_not_unique:"aria_form_label_unique.html",group:"aria_form_label_unique.html"}},messages:{"en-US":{pass:'The element with "form" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "form" role do not have unique labels',group:'Each element with "form" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"form",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},6731(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_graphic_labelled=void 0;var a=i(461),n=i(7011),r=i(7139),l=i(3946);t.aria_graphic_labelled={id:"aria_graphic_labelled",context:"aria:graphics-document,aria:graphics-symbol",refactor:{HAAC_Aria_SvgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_graphic_labelled.html",Pass_0:"aria_graphic_labelled.html",Fail_1:"aria_graphic_labelled.html",Fail_2:"aria_graphic_labelled.html",Fail_3:"aria_graphic_labelled.html"}},messages:{"en-US":{group:"An element with a graphics role must have a non-empty label",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" graphics role has no label',Fail_2:'Element with "{0}" graphics role has no label or an empty label',Fail_3:"Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:[{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role")||!o.getAttribute("role").includes("graphics-"))return null;var s=n.AriaUtil.getAriaLabel(o).length>0;if(!s&&"svg"===o.nodeName.toLowerCase()){var u=o.querySelector("title");s=u&&r.CommonUtil.hasInnerContent(u)}return s||(s=r.CommonUtil.attributeNonEmpty(o,"title")),s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[o.getAttribute("role")])}}},390(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_hidden_nontabbable=void 0;var a=i(7139),n=i(461),r=i(461);t.aria_hidden_nontabbable={id:"aria_hidden_nontabbable",context:"dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*",refactor:{aria_hidden_focus_misuse:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_hidden_nontabbable.html",Pass_0:"aria_hidden_nontabbable.html",Fail_1:"aria_hidden_nontabbable.html"}},messages:{"en-US":{group:"A hidden element should not contain any tabbable elements",Pass_0:"Rule Passed",Fail_1:"Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.3.1","4.1.2"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:"6cfa84",run:function(e,t,i){var r=e.dom.node,l=r.nodeName.toLowerCase();return a.CommonUtil.isTabbable(r)?(0,n.RuleFail)("Fail_1",[l]):(0,n.RulePass)("Pass_0")}}},3900(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_id_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(9910),u=i(3946);t.aria_id_unique={id:"aria_id_unique",context:"dom:*",refactor:{Rpt_Aria_ValidIdRef:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_id_unique.html",Fail_1:"aria_id_unique.html",group:"aria_id_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid",group:"The ARIA property must reference a non-empty unique id of an existing element that is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["59796f","6a7281"],run:function(e,t,i){var n=e.dom.node,d=!0,c=new Array,m=(new Array,o.FragmentUtil.getOwnerFragment(n)),p=n.attributes,h=new Array,g=0;if(p)for(var b=0,_=p.length;b<_;b++){d=!0;var f=p[b].name;if(r.AriaUtil.isDefinedAriaAttribute(n,f)){var v=s.ARIADefinitions.propertyDataTypes[f];if(v&&v.type){var A="http://www.w3.org/2001/XMLSchema#idref"==v.type;if(A||"http://www.w3.org/2001/XMLSchema#idrefs"==v.type){g++;var w=l.CommonUtil.normalizeSpacing(p[b].nodeValue).length,y=p[b].nodeValue.split(" ");if(w<1)d=!1,h.push('"'+p[b].nodeValue+'"');else if(A&&w>=1&&y.length>1){d=!1;for(var C=0,k=y.length;C<k;++C)""!=y[C]&&h.push(y[C])}if(d&&w>=1)for(var R=0,x=y.length;R<x;++R)if(y[R].length>0){var P=m.getElementById(y[R]);if((d=null!=P)&&!v.hiddenIDRefSupported&&(d=u.VisUtil.isNodeVisible(P)),d)break;""!=y[R]&&h.push(y[R])}}}d||c.push(f)}}var T=0==c.length,U=new Array,I=new Array,E=new Array;return T||(I.push(c.join(", ")),E.push(n.nodeName.toLowerCase()),h.length>0&&U.push(h.join(", "))),0==g?null:T?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[U.toString(),I.toString(),E.toString()])}}},1218(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_img_labelled=void 0;var a=i(461),n=i(7011),r=i(7139),l=i(3946);t.aria_img_labelled={id:"aria_img_labelled",context:"aria:img, aria:image",refactor:{HAAC_Aria_ImgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_img_labelled.html",Pass_0:"aria_img_labelled.html",Fail_1:"aria_img_labelled.html",Fail_2:"aria_img_labelled.html",Fail_3:"aria_img_labelled.html"}},messages:{"en-US":{group:'An element with "img" role must have a non-empty label',Pass_0:"Rule Passed",Fail_1:'Element with "img" role has no label',Fail_2:'Element with "img" role has no label or an empty label',Fail_3:"Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:["23a2a8",{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role"))return null;var s=o.nodeName.toLocaleLowerCase();if("svg"!==s&&"img"!==s){var u=n.AriaUtil.getAriaLabel(o).length>0;if(!u&&"svg"===o.nodeName.toLowerCase()){var d=o.querySelector("title");u=d&&r.CommonUtil.hasInnerContent(d)}return u||(u=r.CommonUtil.attributeNonEmpty(o,"title")),u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2")}}}},6734(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_keyboard_handler_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3946);t.aria_keyboard_handler_exists={id:"aria_keyboard_handler_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingKeyboardHandler:{pass:"pass",potential_no_keyboard_access:"potential_no_keyboard_access"}},help:{"en-US":{pass:"aria_keyboard_handler_exists.html",potential_no_keyboard_access:"aria_keyboard_handler_exists.html",group:"aria_keyboard_handler_exists.html"}},messages:{"en-US":{pass:"Rule Passed",potential_no_keyboard_access:'Verify the <{0}> element with "{1}" role has keyboard access',group:"Interactive WAI_ARIA UI components must provide keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)){var u=!0,d=u,c=n.ownerDocument,m=o.ARIADefinitions.designPatterns,p=r.AriaUtil.getRoles(n,!1);if("datalist"===n.nodeName.toLowerCase()&&p&&p.includes("listbox"))return null;for(var h=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"],g=0,b=h;g<b.length;g++){var _=b[g];if(null!=r.AriaUtil.getAncestorWithRole(n,_,!0))return null}for(var f=l.CommonUtil.hasAttribute,v=new Array,A=0;A<p.length;++A){if(m[p[A]],h.indexOf(p[A])>=0&&!(f(n,"aria-disabled")&&n.getAttribute("aria-disabled")||(u=n.hasAttribute("onkeydown")||n.hasAttribute("onkeypress")||n.hasAttribute("onkeyup"))))if(f(n,"aria-activedescendant"))u=!0;else{var w,y=o.ARIADefinitions.designPatterns[p[A]].reqChildren;if(y)for(var C=0,k=y.length;C<k;C++)for(var R="*[contains(@role,'"+y[C]+"')]",x=c.evaluate(R,n,l.CommonUtil.defaultNSResolver,0,null),P=x.iterateNext();P;){if(!(u=P.hasAttribute("onkeydown")||P.hasAttribute("onkeypress")))for(var T="descendant::*",U=(w=c.evaluate(T,P,l.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)l.CommonUtil.shouldNodeBeSkippedHidden(U)||(u=l.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext();if(!u)break;P=x.iterateNext()}else for(T="descendant::*",U=(w=c.evaluate(T,n,l.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)if(l.CommonUtil.shouldNodeBeSkippedHidden(U))U=w.iterateNext();else{var I;(u=l.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext()}}u||v.push(p[A]),!u&&d&&(d=u)}var E=new Array;E.push(n.nodeName.toLowerCase());var N=new Array;N.push(v.join(", "));var L=n.getAttribute("id");return L&&L.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(L,"'][role='combobox']"))?null:d?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_no_keyboard_access",[E.toString(),N.toString()])}}}},9973(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_landmark_name_unique=void 0;var a=i(461),n=i(461),r=i(9955),l=i(1686),o=i(5279),s=i(4566),u=i(1950),d=i(3946),c=i(7139),m=i(7011);t.aria_landmark_name_unique={id:"aria_landmark_name_unique",context:"aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form",refactor:{landmark_name_unique:{Pass_0:"pass",Fail_0:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_landmark_name_unique.html",fail_label_not_unique:"aria_landmark_name_unique.html",group:"aria_landmark_name_unique.html"}},messages:{"en-US":{pass:"Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",fail_label_not_unique:'Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label',group:"Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(d.VisUtil.isNodeHiddenFromAT(n))return null;if(null!==c.CommonUtil.getAncestor(n,["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(n,"dialog",!0))return null;var p=o.FragmentUtil.getOwnerFragment(n),h=s.CacheUtil.getCache(n.ownerDocument,"aria_landmark_name_unique",null);if(!h){h={navigationNodes:[],navigationNodesComputedLabels:[],navigationNodesParents:[],navigationNodesMatchFound:[]};for(var g=p.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'),b=Array.from(g),_=[],f=[],v=[],A=0;A<b.length;A++)d.VisUtil.isNodeHiddenFromAT(b[A])||null!==c.CommonUtil.getAncestor(b[A],["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(b[A],"dialog",!0)||v.push(b[A]);for(b=v,A=0;A<b.length;A++){for(var w=[],y=b[A].parentElement;y;)w.push(y),y=y.parentElement;for(var C=0;C<w.length;C++){var k=["ASIDE","FOOTER","FORM","HEADER","MAIN","NAV","SECTION"].includes(w[C].tagName),R=!1;if(w[C].hasAttribute("role")&&(R=["complementary","contentinfo","form","banner","main","navigation","region","search"].includes(w[C].getAttribute("role"))),k||R){_.push(w[C]);break}if(C===w.length-1){_.push(null);break}}}var x=[];for(A=0;A<b.length;A++){var P=u.AccNameUtil.computeAccessibleName(b[A]);x.push(P&&P.name&&P.name.trim().length>0?P.name.trim():"")}for(A=0;A<_.length;A++){var T=!1,U=!1;for(C=0;C<_.length;C++)if(C!==A){if(null===_[A]&&null===_[C]){if(r.ARIAMapper.nodeToRole(b[A])===r.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}else if(null===_[A]||null===_[C])continue;if(l.DOMUtil.sameNode(_[A],_[C])&&r.ARIAMapper.nodeToRole(b[A])===r.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}T||(U?f.push("pass"):f.push("null"))}h.navigationNodesComputedLabels=x,h.navigationNodes=b,h.navigationNodesParents=_,h.navigationNodesMatchFound=f,s.CacheUtil.setCache(n.ownerDocument,"aria_landmark_name_unique",h)}var I=-1;for(A=0;A<h.navigationNodes.length;A++)n.isSameNode(h.navigationNodes[A])&&(I=A);return-1===I?null:"pass"===h.navigationNodesMatchFound[I]?(0,a.RulePass)("pass",[r.ARIAMapper.nodeToRole(h.navigationNodes[I])]):"fail_label_not_unique"===h.navigationNodesMatchFound[I]?(0,a.RuleFail)("fail_label_not_unique",[r.ARIAMapper.nodeToRole(h.navigationNodes[I]),h.navigationNodesComputedLabels[I]]):null}}},5711(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_main_label_unique={id:"aria_main_label_unique",context:"aria:main",refactor:{Rpt_Aria_MultipleMainsRequireLabel_Implicit_2:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_unique.html",Fail_1:"aria_main_label_unique.html",group:"aria_main_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique labels',group:'Each element with "main" role must have unique label that describes its purposes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;for(var s=r.AriaUtil.getAriaLabel(n),u=r.AriaUtil.getAncestorWithRole(n,"document",!0),d=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0),c=null,m=0;m<d.length;++m)if(d[m]!==n&&(c=(0,a.RulePass)("Pass_0"),r.AriaUtil.getAncestorWithRole(d[m],"document",!0)===u&&r.AriaUtil.getAriaLabel(d[m])===s)){c=(0,a.RuleFail)("Fail_1");break}return c}}},3384(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_main_label_visible={id:"aria_main_label_visible",context:"dom:body",refactor:{Rpt_Aria_MultipleMainsVisibleLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_visible.html",Fail_1:"aria_main_label_visible.html",group:"aria_main_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique visible labels',group:'Each element with "main" role should have a unique visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;var s=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0);return 0===s.length||1===s.length?null:r.AriaUtil.hasUniqueAriaLabelledby(s)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2762(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_navigation_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_navigation_label_unique={id:"aria_navigation_label_unique",context:"aria:navigation",refactor:{Rpt_Aria_MultipleNavigationLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_navigation_label_unique.html",fail_label_not_unique:"aria_navigation_label_unique.html",group:"aria_navigation_label_unique.html"}},messages:{"en-US":{pass:'The element with "navigation" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "navigation" role do not have unique labels',group:'Each element with "navigation" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"navigation",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5757(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_parent_required=void 0;var a=i(461),n=i(461),r=i(9910),l=i(7011),o=i(7139),s=i(3946);t.aria_parent_required={id:"aria_parent_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredParent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_parent_required.html",Pass_0:"aria_parent_required.html",Fail_1:"aria_parent_required.html"}},messages:{"en-US":{group:"Each element with an implicit or explicit role must be contained within a valid element",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"ff89c9",run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||o.CommonUtil.isNodeDisabled(n)||l.AriaUtil.shouldBePresentationalChild(n)||s.VisUtil.isNodePresentational(n))){for(var u=!0,d=r.ARIADefinitions.designPatterns,c=new Array,m=new Array,p=0,h=i.aria.map(function(e){return e.role}),g=h[h.length-2],b=2;"none"===g;)b++,g=h[h.length-b];var _=l.AriaUtil.getResolvedRole(n);if(d[_]&&null!=d[_].container){p++,u=!1;for(var f=0,v=(m=d[_].container).length;!u&&f<v&&!(u=g===m[f]);f++);0==u&&c.push(_)}var A=new Array;A.push(c.join(", "));var w=new Array;return w.push(m.join(", ")),0==p?null:u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[A.toString(),w.toString()])}}}},5232(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_region_label_unique={id:"aria_region_label_unique",context:"aria:region",refactor:{Rpt_Aria_MultipleRegionsUniqueLabel_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_region_label_unique.html",fail_label_not_unique:"aria_region_label_unique.html",group:"aria_region_label_unique.html"}},messages:{"en-US":{pass:'The element with "region" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "region" role do not have unique labels',group:'Each element with "region" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"region");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_labelled=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_region_labelled={id:"aria_region_labelled",context:"aria:region",refactor:{Rpt_Aria_RegionLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_labelled.html",Fail_1:"aria_region_labelled.html",group:"aria_region_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "region" role does not have a label',group:'Each element with "region" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasAriaLabel(n)||l.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_allowed=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_role_allowed={id:"aria_role_allowed",context:"dom:*[role]",refactor:{Rpt_Aria_ValidRole:{Pass_0:"Pass_0",Fail_2:"Fail_2",Potential_1:"Potential_1"}},help:{"en-US":{group:"aria_role_allowed.html",Pass_0:"aria_role_allowed.html",Fail_2:"aria_role_allowed.html",Potential_1:"aria_role_allowed.html"}},messages:{"en-US":{group:"Elements must have a valid 'role' per ARIA specification",Pass_0:"Rule Passed",Fail_2:"The role '{0}' defined on the element is not valid per ARIA specification",Potential_1:"Some of the roles, '{0}', defined on the element are not valid per ARIA specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"674b10",run:function(e,t,i){var n=e.dom.node,l=n.getAttribute("role").trim().toLowerCase();if(0===l.length)return null;if(n.hasAttribute("aria-hidden")&&"true"===n.getAttribute("aria-hidden").toLowerCase())return null;var o=r.AriaUtil.getRolesUndefinedByAria(n);if(!o||0===o.length)return(0,a.RulePass)("Pass_0");var s=l.split(/\s+/);return o.length===s.length?(0,a.RuleFail)("Fail_2",[o.join(",")]):o.length>0?(0,a.RulePotential)("Potential_1",[o.join(",")]):void 0}}},4863(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_redundant=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_role_redundant={id:"aria_role_redundant",context:"dom:*[role]",help:{"en-US":{pass:"aria_role_redundant.html",fail_redundant:"aria_role_redundant.html",group:"aria_role_redundant.html"}},messages:{"en-US":{pass:"An explicitly-assigned ARIA role is not redundant with the implicit role of the element",fail_redundant:'The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element <{1}>',group:"An explicitly-assigned ARIA role should not be redundant with the implicit role of the element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.tagName.toLowerCase(),o=r.AriaUtil.getRoles(n,!1);if(o&&0!==o.length){if(!r.AriaUtil.areRolesDefined(o))return null;var s=r.AriaUtil.getImplicitRole(n);if(!s||0===s.length)return(0,a.RulePass)("pass");for(var u=[],d=0;d<o.length;d++)s.includes(o[d])?u.push((0,a.RuleFail)("fail_redundant",[o[d],l])):u.push((0,a.RulePass)("pass"));return u.length>0?u:null}}}},1440(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_search_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_search_label_unique={id:"aria_search_label_unique",context:"aria:search",refactor:{Rpt_Aria_MultipleSearchLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_search_label_unique.html",fail_label_not_unique:"aria_search_label_unique.html",group:"aria_search_label_unique.html"}},messages:{"en-US":{pass:'The element with "search" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "search" role do not have unique labels',group:'Each element with "search" role must have a unique label that describes its purpose'}},rulesets:[{id:[],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"search",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1968(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_valid=t.aria_role_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.aria_role_valid={id:"aria_role_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{aria_semantics_role:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"aria_role_valid.html",Fail_1:"aria_role_valid.html",Fail_2:"aria_role_valid.html",group:"aria_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The ARIA role '{0}' is not valid for the element <{1}>",Fail_2:"The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable",group:"ARIA roles must be valid for the element to which they are assigned"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.tagName.toLowerCase();if(1!==n.nodeType)return null;var s=r.AriaUtil.getRolesUndefinedByAria(n);if(s&&s.length>0)return null;var u=r.AriaUtil.getDeprecatedAriaRoles(n);if(u&&u.length>0)return null;var d=r.AriaUtil.getDeprecatedAriaAttributes(n);if(d&&d.length>0)return null;if(["td","th","tr"].includes(o)){var c=l.CommonUtil.isTableDescendant(i);if(null!==c&&c.length>0)return null}var m=r.AriaUtil.getUserDefinedRoles(n);if(!m||0===m.length)return null;if(m.includes("generic"))return(0,a.RuleFail)("Fail_1",["generic",o]);var p=r.AriaUtil.getInvalidRoles(n);return null===p||0===p.length?(0,a.RulePass)("Pass_0",[m.join(", "),o]):p.includes("presentation")||p.includes("none")&&l.CommonUtil.isTabbable(n)?(0,a.RuleFail)("Fail_2",[p.join(", "),o]):p.length>0?(0,a.RuleFail)("Fail_1",[p.join(", "),o]):m.length>0?(0,a.RulePass)("Pass_0",[m.join(", "),o]):null}},t.aria_attribute_valid={id:"aria_attribute_valid",context:"dom:*",dependencies:["aria_attribute_deprecated","aria_role_valid"],refactor:{aria_attribute_allowed:{Pass:"Pass",Fail_invalid_role_attr:"Fail_invalid_role_attr",Fail_invalid_implicit_role_attr:"Fail_invalid_implicit_role_attr"}},help:{"en-US":{group:"aria_attribute_valid.html",Pass:"aria_attribute_valid.html",Fail_invalid_role_attr:"aria_attribute_valid.html",Fail_invalid_implicit_role_attr:"aria_attribute_valid.html"}},messages:{"en-US":{group:"ARIA attributes should be valid for the element and ARIA role to which they are assigned",Pass:"ARIA attributes are valid for the element and ARIA role",Fail_invalid_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with ARIA role "{2}"',Fail_invalid_implicit_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with implicit ARIA role "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["5c01ea",{"46ca7f":{Pass:"pass",Fail_invalid_role_attr:"fail",Fail_invalid_implicit_role_attr:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(1!==n.nodeType)return null;var l=r.AriaUtil.getUserDefinedAriaAttributes(n);if(null===l||0===l.length)return null;var o=r.AriaUtil.getUserDefinedRoles(n),s=!0;if(o&&o.length>0){if(!r.AriaUtil.areRolesDefined(o))return null}else o=r.AriaUtil.getImplicitRole(n),s=!1;var u=n.tagName.toLowerCase(),d=r.AriaUtil.getInvalidAriaAttributes(n);return d&&0!==d.length?o.length>0?s?(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_implicit_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,"none"]):(0,a.RulePass)("Pass",[l.join(", "),u,o.join(", ")])}}},1617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_toolbar_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(4566);t.aria_toolbar_label_unique={id:"aria_toolbar_label_unique",context:"aria:toolbar",refactor:{Rpt_Aria_MultipleToolbarUniqueLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_toolbar_label_unique.html",Fail_1:"aria_toolbar_label_unique.html",group:"aria_toolbar_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "toolbar" roles do not have unique labels',group:'Each element with "toolbar" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"toolbar",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(n.ownerDocument,"aria_toolbar_label_unique",null);u||(u=r.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(n.ownerDocument,"aria_toolbar_label_unique",u));var d=r.AriaUtil.getAriaLabel(n);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_widget_labelled=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9955),s=i(5279),u=i(9910),d=i(1686);t.aria_widget_labelled={id:"aria_widget_labelled",context:"dom:*",refactor:{Rpt_Aria_WidgetLabels_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_widget_labelled.html",Pass_0:"aria_widget_labelled.html",Fail_1:"aria_widget_labelled.html"}},messages:{"en-US":{group:"Interactive component must have a programmatically associated name",Pass_0:"Rule Passed",Fail_1:"Interactive component with ARIA role '{0}' does not have a programmatically associated name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"m6b1q3",run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")&&"hidden"===n.getAttribute("type")||r.AriaUtil.getAncestorWithRole(n,"combobox")&&!r.AriaUtil.hasRoleInSemantics(n,"textbox")&&!r.AriaUtil.hasRoleInSemantics(n,"searchbox"))return null;var c=o.ARIAMapper.nodeToRole(n),m=n.nodeName.toLowerCase();if(["button","checkbox","combobox","listbox","menuitemcheckbox","menuitemradio","radio","searchbox","slider","spinbutton","switch","textbox","progressbar","link"].includes(c))return null;if("output"===m||"input"===m&&n.getAttribute("type"),!n.hasAttribute("role")&&-1!=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"].indexOf(n.nodeName.toLowerCase()))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(r.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=l.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=l.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(s.FragmentUtil.getById(n,v[A])===n)return null}for(var w=!0,y=u.ARIADefinitions.designPatterns,C=r.AriaUtil.getRoles(n,!0),k=0,R=["widget","liveRegion","window"],x=(A=0,C.length);w&&A<x;++A){var P=y[C[A]];P&&P.nameRequired&&P.roleType&&R.includes(P.roleType)&&(++k,!(w=r.AriaUtil.hasAriaLabel(n)||l.CommonUtil.attributeNonEmpty(n,"title")||l.CommonUtil.getLabelForElementHidden(n,!0))&&P.nameFrom&&P.nameFrom.indexOf("contents")>=0&&(w=l.CommonUtil.hasInnerContentOrAlt(n)),w||(w=l.CommonUtil.hasImplicitLabel(n)),w||"img"!==n.tagName.toLowerCase()||n.hasAttribute("role")||!n.hasAttribute("alt")||(w=d.DOMUtil.cleanWhitespace(n.getAttribute("alt")).trim().length>0),P.nameFrom.indexOf("prohibited"))}return 0===k?null:w?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[c])}}},3370(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.asciiart_alt_exists=void 0;var a=i(461),n=i(7139);t.asciiart_alt_exists={id:"asciiart_alt_exists",context:"dom:pre, dom:listing, dom:xmp, dom:plaintext",refactor:{RPT_Pre_ASCIIArt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"asciiart_alt_exists.html",Potential_1:"asciiart_alt_exists.html",group:"asciiart_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that ASCII art has a text alternative",group:"ASCII art must have a text alternative"}},rulesets:[],act:[],run:function(e,t,i){var r=e.dom.node;if("pre"==r.nodeName.toLowerCase()&&(r.previousSibling&&"code"==r.previousSibling.nodeName.toLowerCase()||r.getElementsByTagName("code").length>0||n.CommonUtil.getAncestor(r,"code")))return(0,a.RulePass)("Pass_0");for(var l=!0,o=n.CommonUtil.getInnerText(r),s=0,u=0,d="",c=0;l&&c<o.length;++c){var m=o.substr(c,1);/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(m)?d==m?u+=1:u=0:(/\s/.test(m)||(s+=1),u=0),d=m,(s>=5||u>=4)&&(l=!1)}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},9272(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_css_review=void 0;var a=i(461),n=i(461),r=i(7139);t.blink_css_review={id:"blink_css_review",context:"dom:style, dom:*[style]",refactor:{RPT_Blink_CSSTrigger1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"blink_css_review.html",Pass_0:"blink_css_review.html",Potential_1:"blink_css_review.html"}},messages:{"en-US":{group:"Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds",Pass_0:"Rule Passed",Potential_1:"Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getInnerText(n);n.hasAttribute("style")&&(l=n.getAttribute("style"));var o=-1==l.toLowerCase().indexOf("text-decoration:blink");return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},7735(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_elem_deprecated=void 0;var a=i(461),n=i(461);t.blink_elem_deprecated={id:"blink_elem_deprecated",context:"dom:blink",refactor:{WCAG20_Blink_AlwaysTrigger:{Fail_1:"Fail_1"}},help:{"en-US":{group:"blink_elem_deprecated.html",Fail_1:"blink_elem_deprecated.html"}},messages:{"en-US":{group:"Content that blinks persistently must not be used",Fail_1:"Content found that blinks persistently"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){return(0,a.RuleFail)("Fail_1")}}},3923(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blockquote_cite_exists=void 0;var a=i(461),n=i(461),r=i(7139);t.blockquote_cite_exists={id:"blockquote_cite_exists",context:"dom:blockquote",refactor:{RPT_Blockquote_HasCite:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"blockquote_cite_exists.html",Potential_1:"blockquote_cite_exists.html",group:"blockquote_cite_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only",group:"Use <blockquote> only for quotations, not indentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.attributeNonEmpty(n,"cite");if(!l){var o=r.CommonUtil.getDocElementsByTag(n,"cite");l=null!=o&&o.length>0}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},7521(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.canvas_content_described=void 0;var a=i(461),n=i(461),r=i(3946);t.canvas_content_described={id:"canvas_content_described",context:"dom:canvas",refactor:{HAAC_Canvas:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"canvas_content_described.html",Manual_1:"canvas_content_described.html",group:"canvas_content_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify accessibility of the <canvas> element",group:"The <canvas> element may not be accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.1.1","4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.innerHTML.trim().length>0;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RuleManual)("Manual_1")}}},1852(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.caption_track_exists=void 0;var a=i(461),n=i(461);t.caption_track_exists={id:"caption_track_exists",context:"dom:video",refactor:{HAAC_Video_HasNoTrack:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"caption_track_exists.html",Potential_1:"caption_track_exists.html",group:"caption_track_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that captions are available for any meaningful audio or provide a caption track for the <video> element",group:"A <video> element must have a text alternative for any meaningful audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!1;if("true"===n.getAttribute("aria-hidden"))return null;for(var l=n.getElementsByTagName("track"),o=0;o<l.length;++o)r=r||"captions"===l[o].getAttribute("kind");if(n.textTracks&&n.textTracks.length>0)for(o=0;o<n.textTracks.length;o++)r=r||"captions"===n.textTracks[o].kind;return r?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},799(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_active_descendant=void 0;var a=i(461),n=i(461),r=i(7011),l=i(5279),o=i(3864),s=i(4566),u=i(3946);t.combobox_active_descendant={id:"combobox_active_descendant",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_active_descendant.html",Fail_missing:"combobox_active_descendant.html",Fail_not_in_popup:"combobox_active_descendant.html",Fail_active_role_invalid:"combobox_active_descendant.html",Fail_active_not_selected:"combobox_active_descendant.html",group:"combobox_active_descendant.html"}},messages:{"en-US":{Pass:"'aria-activedescendant' is used appropriately for this combobox",Fail_missing:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist",Fail_not_in_popup:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"",Fail_active_role_invalid:"The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'",Fail_active_not_selected:"The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true",group:"'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.popupId;if(!m)return null;var h=n.getAttribute("aria-activedescendant");if(!h||0===h.trim().length)return null;var g=l.FragmentUtil.getById(n,h);if(!g)return(0,a.RuleFail)("Fail_missing",[h]);var b=!1;if(m)for(var _=new o.DOMWalker(m);!b&&_.nextNode()&&_.node!=m&&_.node!=m.nextSibling;)1===_.node.nodeType&&u.VisUtil.isNodeVisible(_.node)&&(b=_.elem().getAttribute("id")===h);var f=[];b||f.push((0,a.RulePass)("Fail_not_in_popup",[h,p]));var v=r.AriaUtil.getRoles(g,!0);return 0===["option","gridcell","row","treeitem"].filter(function(e){return v.includes(e)}).length&&f.push((0,a.RuleFail)("Fail_active_role_invalid",[h,v.join(",")])),"true"!==g.getAttribute("aria-selected")&&f.push((0,a.RuleFail)("Fail_active_not_selected",[h])),0===f.length?(0,a.RulePass)("Pass"):f}}},4614(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_autocomplete_valid=void 0;var a=i(461),n=i(461),r=i(3864),l=i(4566),o=i(3946);t.combobox_autocomplete_valid={id:"combobox_autocomplete_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_autocomplete:{Pass:"Pass",Fail_1:"Fail_1",Fail_inline:"Fail_inline"}},help:{"en-US":{Pass:"combobox_autocomplete_valid.html",Fail_1:"combobox_autocomplete_valid.html",Fail_inline:"combobox_autocomplete_valid.html",group:"combobox_autocomplete_valid.html"}},messages:{"en-US":{Pass:"The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup",Fail_1:"The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"",Fail_inline:"The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ",group:"A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d=u.popupId,c=u.popupElement,m=[];"inline"===n.getAttribute("aria-autocomplete")&&m.push((0,a.RuleFail)("Fail_inline"));var p=!0;if(c&&o.VisUtil.isNodeVisible(c)&&(p=!c.hasAttribute("aria-autocomplete"))&&c.children&&c.children.length>0)for(var h=new r.DOMWalker(c);p&&h.nextNode()&&(1!==h.node.nodeType||!o.VisUtil.isNodeVisible(h.node)||(p=!h.elem().hasAttribute("aria-autocomplete"),!h.bEndTag||h.node!==c.lastElementChild)););return p||m.push((0,a.RuleFail)("Fail_1",[d])),m.length>0?m:(0,a.RulePass)("Pass")}}},5952(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_design_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=i(4566);t.combobox_design_valid={id:"combobox_design_valid",context:"aria:combobox",refactor:{combobox_version:{"Pass_1.0":"Pass_1.0","Fail_1.1":"Fail_1.1","Pass_1.2":"Pass_1.2"}},help:{"en-US":{"Pass_1.0":"combobox_design_valid.html","Fail_1.1":"combobox_design_valid.html","Pass_1.2":"combobox_design_valid.html",group:"combobox_design_valid.html"}},messages:{"en-US":{"Pass_1.0":"The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Fail_1.1":"The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Pass_1.2":"The combobox design pattern is detected as ARIA 1.2",group:"The combobox design pattern must be valid for ARIA 1.2"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;var u,d="select"===(u=n).tagName.toLowerCase()&&"combobox"!==u.getAttribute("role")?"implicit":"input"!==u.nodeName.toLowerCase()||u.hasAttribute("type")&&"text"!==u.getAttribute("type")||!u.hasAttribute("aria-owns")||u.hasAttribute("aria-controls")?"input"!==u.nodeName.toLowerCase()&&u.hasAttribute("aria-owns")&&!u.hasAttribute("aria-controls")?"1.1":"1.2":"1.0";if("implicit"===d)return null;var c=n.tagName.toLowerCase(),m="true"===(r.AriaUtil.getAriaAttribute(n,"aria-expanded")||"").trim().toLowerCase(),p="input"===c&&(!n.hasAttribute("type")||"text"===n.getAttribute("type").toLowerCase()),h=e.dom.rolePath;if(!h)return null;var g=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});return g?(g[h]={inputElement:p?n:null,pattern:d,expanded:m},s.CacheUtil.setCache(n.ownerDocument,"combobox",g),"1.0"===d?(0,a.RulePass)("Pass_1.0"):"1.1"===d?(0,a.RuleFail)("Fail_1.1"):"1.2"===d?(0,a.RulePass)("Pass_1.2"):void 0):null}}},5395(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_focusable_elements=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7011),o=i(7139),s=i(4566),u=i(3946);t.combobox_focusable_elements={id:"combobox_focusable_elements",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_focusable_elements.html",Fail_not_tabbable:"combobox_focusable_elements.html",Fail_tabbable_child:"combobox_focusable_elements.html",group:"combobox_focusable_elements.html"}},messages:{"en-US":{Pass:"DOM focus is allowed only on the combobox element as required",Fail_not_tabbable:"The combobox element does not allow DOM focus as required",Fail_tabbable_child:"The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed",group:"Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.expanded;if(!m)return null;var h=l.AriaUtil.getRoles(m,!0)[0],g=[];if(o.CommonUtil.isTabbable(n)||g.push((0,a.RuleFail)("Fail_not_tabbable")),!1===p||"dialog"===h)return(0,a.RulePass)("Pass");var b=!0;if(m&&u.VisUtil.isNodeVisible(m)&&(b=!o.CommonUtil.isTabbable(m)&&!l.AriaUtil.getAriaAttribute(m,"aria-activedescendant"))&&m.children&&m.children.length>0)for(var _=new r.DOMWalker(m);b&&_.nextNode()&&(1!==_.node.nodeType||!u.VisUtil.isNodeVisible(_.node)||(b=!o.CommonUtil.isTabbable(_.node)&&!l.AriaUtil.getAriaAttribute(_.node,"aria-activedescendant"),!_.bEndTag||_.node!==m.lastElementChild)););return b||g.push((0,a.RuleFail)("Fail_tabbable_child")),0===g.length?(0,a.RulePass)("Pass"):g}}},1992(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_haspopup_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(4566);t.combobox_haspopup_valid={id:"combobox_haspopup_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_haspopup:{Pass:"Pass",Fail_popup_role_invalid:"Fail_popup_role_invalid",Fail_combobox_popup_role_mismatch:"Fail_combobox_popup_role_mismatch"}},help:{"en-US":{Pass:"combobox_haspopup_valid.html",Fail_popup_role_invalid:"combobox_haspopup_valid.html",Fail_combobox_popup_role_mismatch:"combobox_haspopup_valid.html",group:"combobox_haspopup_valid.html"}},messages:{"en-US":{Pass:"The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value",Fail_popup_role_invalid:'The \'role\' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"',Fail_combobox_popup_role_mismatch:"The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"",group:"The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!o)return null;var s=o[e.dom.rolePath];if(!s)return null;var u=s.popupElement,d=s.popupId;if(!u)return null;var c=r.AriaUtil.getRoles(u,!0),m=["listbox","grid","tree","dialog"].filter(function(e){return c.includes(e)});if(0===m.length)return(0,a.RuleFail)("Fail_popup_role_invalid",[c.join(","),d]);var p=m[0],h=n.getAttribute("aria-haspopup")||"listbox";return h===p||"listbox"===p&&!n.hasAttribute("aria-haspopup")?(0,a.RulePass)("Pass"):(0,a.RuleFail)("Fail_combobox_popup_role_mismatch",[h,p])}}},7955(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_popup_reference=void 0;var a=i(461),n=i(461),r=i(5279),l=i(4566),o=i(3946);t.combobox_popup_reference={id:"combobox_popup_reference",context:"aria:combobox",dependencies:["combobox_design_valid"],help:{"en-US":{group:"combobox_popup_reference.html","Pass_1.0_expanded":"combobox_popup_reference.html","Pass_1.0_collapsed":"combobox_popup_reference.html","Pass_1.2_expanded":"combobox_popup_reference.html","Pass_1.2_collapsed":"combobox_popup_reference.html","Fail_1.0_missing_owns":"combobox_popup_reference.html","Fail_1.2_missing_controls":"combobox_popup_reference.html","Fail_1.0_popup_reference_missing":"combobox_popup_reference.html","Fail_1.2_popup_reference_missing":"combobox_popup_reference.html",Fail_combobox_expanded_hidden:"combobox_popup_reference.html",Fail_combobox_collapsed_visible:"combobox_popup_reference.html"}},messages:{"en-US":{group:"The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","Pass_1.0_expanded":"The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass_1.0_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Pass_1.2_expanded":"The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass_1.2_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Fail_1.0_missing_owns":"The 'aria-owns' attribute of the expanded combobox is missing","Fail_1.2_missing_controls":"The 'aria-controls' attribute of the expanded combobox is missing","Fail_1.0_popup_reference_missing":"The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value","Fail_1.2_popup_reference_missing":"The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",Fail_combobox_expanded_hidden:"The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible",Fail_combobox_collapsed_visible:"The combobox 'aria-expanded' attribute is false, but the combobox popup is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"4e8ab6":{"Pass_1.0_expanded":"fail","Pass_1.0_collapsed":"fail","Pass_1.2_expanded":"pass","Pass_1.2_collapsed":"pass","Fail_1.0_missing_owns":"inapplicable","Fail_1.2_missing_controls":"fail","Fail_1.0_popup_reference_missing":"inapplicable","Fail_1.2_popup_reference_missing":"fail",Fail_combobox_expanded_hidden:"inapplicable",Fail_combobox_collapsed_visible:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node,s=l.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d,c,m=u.pattern,p=u.expanded;if("1.0"===m){if(!n.hasAttribute("aria-owns"))return p?(0,a.RuleFail)("Fail_1.0_missing_owns"):null;if(d=n.getAttribute("aria-owns"),!(c=r.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.0_popup_reference_missing",[d]):null}else{if("1.2"!==m)return null;if(!n.hasAttribute("aria-controls"))return p?(0,a.RuleFail)("Fail_1.2_missing_controls"):null;if(d=n.getAttribute("aria-controls"),!(c=r.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.2_popup_reference_missing",[d]):null}return u.popupId=d,u.popupElement=c,p&&!o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_expanded_hidden"):!p&&o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_collapsed_visible"):"1.0"===m?p?(0,a.RulePass)("Pass_1.0_expanded"):(0,a.RulePass)("Pass_1.0_collapsed"):p?(0,a.RulePass)("Pass_1.2_expanded"):(0,a.RulePass)("Pass_1.2_collapsed")}}},9531(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.debug_paths=void 0;var a=i(461);t.debug_paths={id:"debug_paths",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["DEBUG"],num:"1",level:a.eRulePolicy.INFORMATION,toolkitLevel:a.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var a=e.dom.node;return a.setAttribute("domPath",e.dom.rolePath),a.setAttribute("ariaPath",e.aria.rolePath),null}}},891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.detector_tabbable=void 0;var a=i(7139),n=i(461),r=i(461);t.detector_tabbable={id:"detector_tabbable",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["EXTENSIONS"],num:"1",level:r.eRulePolicy.INFORMATION,toolkitLevel:r.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var r=e.dom.node;if(!a.CommonUtil.isTabbable(r))return null;var l=i.aria[i.aria.length-1];return(0,n.RulePass)("Pass_0",[],[{name:l.attributes.name,role:l.role,tabindex:parseInt(r.getAttribute("tabindex")||"0")}])}}},7446(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.dir_attribute_valid=void 0;var a=i(461),n=i(461);t.dir_attribute_valid={id:"dir_attribute_valid",context:"dom:*[dir]",refactor:{Valerie_Elem_DirValid:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"dir_attribute_valid.html",Fail_1:"dir_attribute_valid.html",group:"dir_attribute_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Invalid value used for the 'dir' attribute",group:'\'dir\' attribute value must be "ltr", "rtl", or "auto"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node.getAttribute("dir").toLowerCase();return"ltr"==n||"rtl"==n||"auto"==n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6137(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.download_keyboard_controllable=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.download_keyboard_controllable={id:"download_keyboard_controllable",context:"dom:a[href],dom:area[href]",refactor:{HAAC_Media_DocumentTrigger2:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"download_keyboard_controllable.html",group:"download_keyboard_controllable.html"}},messages:{"en-US":{Manual_1:"Verify that the file download mechanism does not cause a keyboard trap",group:"File download mechanisms should be keyboard-operable and preserve page focus location"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("href"),s=r.CommonUtil.getFileExt(o),u=![".docx",".doc",".pdf",".odt"].includes(s);return u?null:u?void 0:(0,a.RuleManual)("Manual_1")}}},6839(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.draggable_alternative_exists=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3946);t.draggable_alternative_exists={id:"draggable_alternative_exists",context:"dom:*[draggable]",dependencies:[],help:{"en-US":{group:"draggable_alternative_exists.html",pass_undraggable:"draggable_alternative_exists.html",potential_alternative:"draggable_alternative_exists.html"}},messages:{"en-US":{group:'A draggable element must have a "single pointer" alternative',pass_undraggable:'The element "{0}" is not draggable',potential_alternative:'Ensure the draggable element "{0}" has a "single pointer" alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.7"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!l.VisUtil.isNodeVisible(r))return null;var o=r.nodeName.toLocaleLowerCase();return null!==a.CommonUtil.getAncestor(r,["pre","code","script","meta"])||"body"===o||"html"===o?null:"true"===r.getAttribute("draggable")?(0,n.RulePotential)("potential_alternative",[o]):"false"===r.getAttribute("draggable")?(0,n.RulePass)("pass_undraggable",[o]):null}}},8135(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_labelled=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=i(9910),u=i(1950);t.element_accesskey_labelled={id:"element_accesskey_labelled",context:"dom:*[accesskey]",refactor:{HAAC_Accesskey_NeedLabel:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"element_accesskey_labelled.html",Potential_1:"element_accesskey_labelled.html",group:"element_accesskey_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"The element with an assigned 'accesskey' attribute does not have an associated label",group:"An element with an assigned 'accesskey' attribute must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeVisible(n)&&!l.CommonUtil.isNodeDisabled(n)&&!l.CommonUtil.isTabbable(n)){var d=r.AriaUtil.getRoles(n,!0);if(d&&0!==d.length){var c=s.ARIADefinitions.designPatterns[d[0]];if(c&&c.nameFrom&&!c.nameRequired&&c.nameFrom&&!c.nameFrom.includes("prohibited")&&(!n.parentElement||"fieldset"!==n.parentElement.nodeName.toLowerCase())){var m=u.AccNameUtil.computeAccessibleName(n);return m&&m.name&&m.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}}}}},507(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_unique=void 0;var a=i(461),n=i(461),r=i(4566);t.element_accesskey_unique={id:"element_accesskey_unique",context:"dom:*[accesskey]",refactor:{WCAG20_Elem_UniqueAccessKey:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"element_accesskey_unique.html",Fail_1:"element_accesskey_unique.html",group:"element_accesskey_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"'accesskey' attribute value on the element is not unique",group:"'accesskey' attribute values on each element must be unique for the page"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CacheUtil.getCache(n.ownerDocument,"element_accesskey_unique",{}),o=n.getAttribute("accesskey"),s=!(o in l);return l[o]=!0,s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_attribute_deprecated=void 0;var a=i(461),n=i(461),r=["applet","basefont","center","dir","font","isindex","listing","plaintext","spacer","s","strike","u","xmp","acronym","frame","frameset","noframes","noembed","big","blink","marquee","tt"],l=["align","link","archive","background","bgcolor","clear","code","color","compact","face","hspace","language","link","noshade","nowrap","object","prompt","start","text","version","vlink","vspace"],o={td:["height","width","abbr","axis","char","charoff","height","nowrap","valign","width","align","bgcolor"],th:["height","width","abbr","axis","charoff","height","bgcolor","align","nowrap","char","valign","width"],li:["type","value","type"],ul:["type","compact"],pre:["width"],meta:["http-equiv"],a:["charset","coords","shape","rev","scheme"],link:["rev","charset","target"],img:["name","longdesc","align","hspace","vspace","border"],area:["nohref"],head:["profile"],html:["version"],iframe:["longdesc","align","frameborder","marginheight","marginwidth","scrolling"],object:["archive","code","codebase","codetype","declare","standby","align","hspace","vspace","border"],param:["type","valuetype"],script:["language"],body:["alink","background","bgcolor","link","text","vlink"],br:["clear"],caption:["align"],col:["align","char","charoff","valign","width"],div:["align"],dl:["compact"],hr:["align","noshade","size","width","align"],h2:["align"],h3:["align"],h4:["align"],h5:["align"],h6:["align"],input:["align","usemap"],legend:["align"],menu:["compact"],ol:["compact","type","type"],p:["align"],table:["bgcolor","cellpadding","cellspacing","frame","rules","width","align"],tbody:["align","char","valign","charoff"],tfoot:["align","charoff","char","valign"],thead:["char","charoff","valign","align"],tr:["align","bgcolor","char","charoff","valign"]};t.element_attribute_deprecated={id:"element_attribute_deprecated",context:"dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]",help:{"en-US":{pass:"element_attribute_deprecated.html",fail_elem:"element_attribute_deprecated.html",fail_attr:"element_attribute_deprecated.html",fail_elem_attr:"element_attribute_deprecated.html",group:"element_attribute_deprecated.html"}},messages:{"en-US":{pass:"Rule Passed",fail_elem:"The <{0}> element is deprecated in HTML 5",fail_attr:'The HTML attribute(s) "{0}" is deprecated in HTML 5',fail_elem_attr:'The HTML attribute(s) "{0}" is deprecated for the <{1}> element in HTML 5',group:"Avoid use of obsolete features if possible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("tbody"===n.nodeName.toLowerCase()&&n.hasAttribute("align"))return(0,a.RulePass)("pass");if(n.nodeName.includes("-"))return null;var s=n.nodeName.toLowerCase();if(r.includes(s))return(0,a.RuleFail)("fail_elem",[s]);for(var u=n.getAttributeNames(),d="",c=0,m=u;c<m.length;c++){var p=m[c];l.includes(p)&&(""!==d&&(d+=", "),d+=p)}if(""!==d)return(0,a.RuleFail)("fail_attr",[d]);if(d="",s in o){for(var h=0,g=u;h<g.length;h++)p=g[h],o[s]&&o[s].includes(p)&&(""!==d&&(d+=", "),d+=p);if(""!==d)return(0,a.RuleFail)("fail_elem_attr",[d,s])}return(0,a.RulePass)("pass")}}},5173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_id_unique=void 0;var a=i(461),n=i(461),r=i(5279);t.element_id_unique={id:"element_id_unique",context:"dom:*[id]",refactor:{RPT_Elem_UniqueId:{Pass_0:"pass",Fail_1:"potential_empty",Fail_2:"potential_in_use"}},help:{"en-US":{group:"element_id_unique.html",pass:"element_id_unique.html",potential_empty:"element_id_unique.html",potential_in_use:"element_id_unique.html"}},messages:{"en-US":{group:"Element 'id' attribute values must be unique within a document",pass:"Rule Passed",potential_empty:'The <{0}> element has the id "{1}" that is empty',potential_in_use:'The <{0}> element has the id "{1}" that is already in use'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"3ea0c8":{pass:"pass",potential_empty:"pass",potential_in_use:"fail"}}],run:function(e,t,i){var n=e.dom.node,l=n.getAttribute("id");return""===l?(0,a.RulePotential)("potential_empty",[n.nodeName.toLowerCase(),l]):r.FragmentUtil.getById(n,l)===n?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_in_use",[n.nodeName.toLowerCase(),l])}}},6027(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_lang_valid=t.html_lang_valid=void 0;var a=i(461),n=i(461),r=i(1043),l=i(3946),o=i(3864),s=i(1950),u=function(e){var t=e.dom.node,i=t.nodeName.toLowerCase();if(t.hasAttribute("lang"))if("html"!==i&&""===t.getAttribute("lang"));else{var a=t.getAttribute("lang");if(!r.LangUtil.validPrimaryLang(a))return 1;if(!r.LangUtil.isBcp47(a))return 2}if(t.hasAttribute("xml:lang"))if("html"!==i&&""===t.getAttribute("xml:lang"));else{if(a=t.getAttribute("xml:lang"),!r.LangUtil.validPrimaryLang(a))return 3;if(!r.LangUtil.isBcp47(a))return 4}return 0};t.html_lang_valid={id:"html_lang_valid",context:"dom:html[lang], dom:html[xml:lang]",help:{"en-US":{Pass_0:"html_lang_valid.html",Fail_1:"html_lang_valid.html",Fail_2:"html_lang_valid.html",Fail_3:"html_lang_valid.html",Fail_4:"html_lang_valid.html",group:"html_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The default human language of the page must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"fail",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"inapplicable"},bf051a:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"fail",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=u(e);return[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][n]}},t.element_lang_valid={id:"element_lang_valid",context:"dom:*[lang], dom:*[xml:lang]",help:{"en-US":{Pass_0:"element_lang_valid.html",Fail_1:"element_lang_valid.html",Fail_2:"element_lang_valid.html",Fail_3:"element_lang_valid.html",Fail_4:"element_lang_valid.html",group:"element_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The change in language of specific content must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{de46e4:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"inapplicable",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node;if("html"===n.nodeName.toLowerCase())return null;var r=u(e),d=[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][r];if(d.value[1]!==a.eRuleConfidence.PASS){var c=!1;if(null!==n.firstChild)for(var m=new o.DOMWalker(n,!1,n,!0);!c&&m.nextNode();)if(1===m.node.nodeType){var p=m.node;if(!l.VisUtil.isNodeVisible(p)||p.hasAttribute("lang"))m.bEndTag=!0;else{var h=s.AccNameUtil.computeAccessibleName(p);c=c||"img"===p.nodeName.toLowerCase()&&h&&h.name&&h.name.trim().length>0}}else c=c||3===m.node.nodeType&&m.node.nodeValue.trim().length>0;if(!c)return null}return d}}},7515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_mouseevent_keyboard=void 0;var a=i(461),n=i(461);t.element_mouseevent_keyboard={id:"element_mouseevent_keyboard",context:"dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]",refactor:{RPT_Elem_EventMouseAndKey:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"element_mouseevent_keyboard.html",Manual_1:"element_mouseevent_keyboard.html",group:"element_mouseevent_keyboard.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)",group:"All interactive content with mouse event handlers must have equivalent keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase(),l=n.hasAttribute("href")||!n.hasAttribute("ondblclick")&&!n.hasAttribute("onmousemove")&&(!n.hasAttribute("onmousedown")||n.hasAttribute("onkeydown"))&&(!n.hasAttribute("onmouseup")||n.hasAttribute("onkeyup"))&&(!n.hasAttribute("onmouseover")||n.hasAttribute("onfocus"))&&(!n.hasAttribute("onmouseout")||n.hasAttribute("onblur"))&&(!n.hasAttribute("onclick")||n.hasAttribute("onkeypress")||"a"==r||"button"==r),o=new Array;return l||(n.hasAttribute("ondblclick")&&o.push("ondblclick"),n.hasAttribute("onmousemove")&&o.push("onmousemove"),n.hasAttribute("onmousedown")&&!n.hasAttribute("onkeydown")&&o.push("onmousedown"),n.hasAttribute("onmouseup")&&!n.hasAttribute("onkeyup")&&o.push("onmouseup"),n.hasAttribute("onmouseover")&&!n.hasAttribute("onfocus")&&o.push("onmouseover"),n.hasAttribute("onmouseout")&&!n.hasAttribute("onblur")&&o.push("onmouseout"),n.hasAttribute("onclick")&&!n.hasAttribute("onkeypress")&&"a"!=r&&"button"!=r&&o.push("onclick")),l?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1",[r,o.join(", ")])}}},1704(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_orientation_unlocked=void 0;var a=i(461),n=i(461),r=i(4919),l=i(3946),o=i(4566),s=i(5279),u=i(7139);t.element_orientation_unlocked={id:"element_orientation_unlocked",context:"dom:*",help:{"en-US":{pass:"element_orientation_unlocked.html",fail_locked:"element_orientation_unlocked.html",group:"element_orientation_unlocked.html"}},messages:{"en-US":{pass:"The element is not restricted to either landscape or portrait orientation using CSS transform property",fail_locked:"The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property",group:"Elements should not be restricted to either landscape or portrait orientation using CSS transform property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["b33eff"],run:function(e,t,i){var n=e.dom.node;if(!l.VisUtil.isNodeVisible(n))return null;if(u.CommonUtil.getAncestor(n,["script","meta","title"]))return null;if(!u.CommonUtil.hasInnerContent(n))return null;var d=n.nodeName.toLowerCase(),c=s.FragmentUtil.getOwnerFragment(n),m=o.CacheUtil.getCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",null);m||(m=r.CSSUtil.getMediaOrientationTransform(c),o.CacheUtil.setCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",m));var p=[];if(Object.keys(m).forEach(function(e){Object.keys(m[e]).forEach(function(t){Object.keys(m[e][t]).length>0&&r.CSSUtil.selectorMatchesElem(n,t)&&(m[e][t].transform?p.push(m[e][t].transform):p.push(m[e][t]))})}),0===p.length)return null;for(var h=[],g=function(e){var t=p[e];if("object"==typeof t)for(var i in t)t=i+"("+t[i]+")";var l=!1;if(["rotate","rotate3d","rotateZ","matrix","matrix3d"].forEach(function(e){t.includes(e)&&(l=!0)}),!l)return"continue";var o=r.CSSUtil.getRotationDegree(t);if(0===o)return h.push((0,a.RulePass)("pass")),"continue";var s=r.CSSUtil.getDefinedStyles(n,["transform"]);s.transform&&(o+=r.CSSUtil.getRotationDegree(s.transform));var u=o%180;u<=1||u>=179?h.push((0,a.RulePass)("pass")):h.push((0,a.RuleFail)("fail_locked",[d]))},b=0;b<p.length;b++)g(b);return h.length>0?h:null}}},5053(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_scrollable_tabbable=void 0;var a=i(7139),n=i(461),r=i(3946),l=i(7011);t.element_scrollable_tabbable={id:"element_scrollable_tabbable",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_scrollable_tabbable.html",pass_tabbable:"element_scrollable_tabbable.html",pass_interactive:"element_scrollable_tabbable.html",fail_scrollable:"element_scrollable_tabbable.html"}},messages:{"en-US":{group:"Scrollable elements should be tabbable or contain tabbable content",pass_tabbable:"The scrollable element is tabbable",pass_interactive:"The scrollable element has tabbable content",fail_scrollable:"The scrollable element <{0}> with non-interactive content is not tabbable"}},rulesets:[],act:["0ssw9k"],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeVisible(o)&&!a.CommonUtil.isNodeDisabled(o))return a.CommonUtil.getAncestor(o,["iframe","svg","script","meta","style"])?null:a.CommonUtil.hasInnerContent(o)?l.AriaUtil.isNavigationOwnedOrControlled(o)?null:r.VisUtil.isElementScrollable(o)?a.CommonUtil.isTabbable(o)?(0,n.RulePass)("pass_tabbable"):a.CommonUtil.getTabbableChildren(o)>0?(0,n.RulePass)("pass_interactive"):!o.hasAttribute("tabindex")&&navigator.userAgent.indexOf("Firefox")>-1?null:(0,n.RuleFail)("fail_scrollable",[o.nodeName.toLowerCase()]):null:null}}},4681(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_role_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3864),u=i(3946);t.element_tabbable_role_valid={id:"element_tabbable_role_valid",context:"dom:*",help:{"en-US":{pass:"element_tabbable_role_valid.html",fail_invalid_role:"element_tabbable_role_valid.html",fail_no_valid_role:"element_tabbable_role_valid.html",group:"element_tabbable_role_valid.html"}},messages:{"en-US":{pass:"The tabbable element has a widget role",fail_invalid_role:"The tabbable element's role '{0}' is not a widget role",fail_no_valid_role:"The tabbable element does not have a valid widget role",group:"A tabbable element must have a valid widget role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.isNodeDisabled(n)||u.VisUtil.isNodeHiddenFromAT(n))return null;var d=n.nodeName.toLowerCase();if(d in l.CommonUtil.tabTagMap){var c=l.CommonUtil.tabTagMap[d];if("function"==typeof c&&(c=c(n)),c)return null}if(!n.hasAttribute("tabindex")||parseInt(n.getAttribute("tabindex"))<0)return null;if(r.AriaUtil.isNavigationOwnedOrControlled(n))return null;if(u.VisUtil.isElementScrollable(n))return null;var m=s.DOMWalker.parentNode(n),p=r.AriaUtil.getResolvedRole(m);if(["button","checkbox","img","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab"].includes(p))return null;var h=r.AriaUtil.getResolvedRole(n);return h?"application"===h?null:"row"===h||"separator"===h||"widget"===o.ARIADefinitions.designPatterns[h].roleType?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid_role",[h]):(0,a.RuleFail)("fail_no_valid_role")}}},8050(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_unobscured=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3946),o=i(7507),s=i(3883);t.element_tabbable_unobscured={id:"element_tabbable_unobscured",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_unobscured.html",pass:"element_tabbable_unobscured.html",potential_obscured:"element_tabbable_unobscured.html"}},messages:{"en-US":{group:"When an element receives focus, it is not entirely covered by other content",pass:"The element is not entirely covered by other content",potential_obscured:"Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.4.11"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!l.VisUtil.isNodeVisible(r)||!a.CommonUtil.isTabbable(r))return null;var u=r.nodeName.toLocaleLowerCase();if(null!==a.CommonUtil.getAncestor(r,["pre","code","script","meta"])||"body"===u||"html"===u)return null;var d=r.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=new o.DOMMapper,p=m.getUnadjustedBounds(r);if(!p||0===p.height||0===p.width)return null;var h=c.getComputedStyle(r);if(!h)return null;var g=parseInt("auto"!==h.zIndex&&h.zIndex?h.zIndex:"0"),b=d.querySelectorAll("body *:not(script):not(style):not(meta):not(link)");if(!b||0===b.length)return null;for(var _=!0,f=p.left+p.width,v=p.top+p.height,A=0;A<b.length;A++){var w=b[A],y=r.compareDocumentPosition(w);if(0===y||y&Node.DOCUMENT_POSITION_CONTAINED_BY)_=!1;else if(!(y&Node.DOCUMENT_POSITION_CONTAINS)&&l.VisUtil.isNodeVisible(w)){var C=m.getUnadjustedBounds(w);if(C&&0!==C.height&&0!==C.width&&!(C.top>p.top||C.left>p.left)){var k=C.left+C.width,R=C.top+C.height;if(!(k<f||R<v)){var x=c.getComputedStyle(w);if(x){var P=parseInt("auto"===x.zIndex||!x.zIndex||isNaN(Number(x.zIndex))?"0":x.zIndex);if(_&&P>g||!_&&P>=g){var T,U=!1;if(x.background&&"none"!==x.background&&(U=(T=s.ColorUtil.Color(x.background))&&(void 0===T.alpha||T.alpha>0)),!U&&x.backgroundColor&&(U=(T=s.ColorUtil.Color(x.backgroundColor))&&(void 0===T.alpha||T.alpha>0)),!a.CommonUtil.hasInnerContentHidden(w)&&!U)continue;return(0,n.RulePotential)("potential_obscured",[])}}}}}}return(0,n.RulePass)("pass")}}},2644(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_visible=void 0;var a=i(7139),n=i(4919),r=i(461),l=i(461),o=i(7507);t.element_tabbable_visible={id:"element_tabbable_visible",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_visible.html",pass:"element_tabbable_visible.html",potential_visible:"element_tabbable_visible.html"}},messages:{"en-US":{group:"A tabbable element should be visible on the screen when it has keyboard focus",pass:"The tabbable element is visible on the screen",potential_visible:"Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.7"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!a.CommonUtil.isTabbable(l))return null;var s=l.nodeName.toLocaleLowerCase(),u=(new o.DOMMapper).getUnadjustedBounds(l);if(!u)return null;var d=n.CSSUtil.getDefinedStylesMultiple(l,["position","clip"],["",":focus"]),c=d[""],m=d[":focus"];if(0===u.height||0===u.width)return(0,r.RulePotential)("potential_visible",[]);if("absolute"===c.position&&c.clip&&"rect(0px,0px,0px,0px)"===c.clip.replaceAll(" ","")&&!m.clip){if("input"===s&&("checkbox"===l.getAttribute("type")||"radio"===l.getAttribute("type"))){var p=a.CommonUtil.getLabelForElement(l);if(p&&!a.CommonUtil.isInnerTextEmpty(p)){var h=n.CSSUtil.getDefinedStylesMultiple(l,null,[":focus-visible",":focus-within",":checked",":focus"]),g=h[":focus-visible"],b=h[":focus-within"],_=h[":checked"];if(h[":focus"]||g||b||_)return(0,r.RulePass)("pass")}}return(0,r.RulePotential)("potential_visible",[])}if(u.top>=0&&u.left>=0)return(0,r.RulePass)("pass");var f=getComputedStyle(l),v=u.top,A=u.left;if(0===Object.keys(m).length)return(0,r.RulePotential)("potential_visible",[]);var w=["absolute","fixed"];return void 0!==m.top&&(v=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.top.replace(/\D/g,""):Number.MIN_VALUE),void 0!==m.left&&(A=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.left.replace(/\D/g,""):Number.MIN_VALUE),v>=0&&A>=0?(0,r.RulePass)("pass"):(0,r.RulePotential)("potential_visible",[])}}},429(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.embed_alt_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.embed_alt_exists={id:"embed_alt_exists",context:"dom:embed",refactor:{RPT_Embed_HasAlt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_alt_exists.html",Potential_1:"embed_alt_exists.html",group:"embed_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element has alternative content",group:"Provide alternative content for <embed> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},4617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.emoticons_alt_exists=void 0;var a=i(461),n=i(7139);t.emoticons_alt_exists={id:"emoticons_alt_exists",context:"dom:*",refactor:{WCAG20_Text_Emoticons:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"emoticons_alt_exists.html",Potential_1:"emoticons_alt_exists.html",group:"emoticons_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that emoticons have a text alternative",group:"Emoticons must have a short text alternative that describes their purpose"}},rulesets:[],act:[],run:function(e,t,i){for(var r=e.dom.node,l=[":-)",":)",":o)",":]",":3",":c)",":>","=]","8)","=)",":D","C:",":-D",":D","8D","XD","=D","=3","<=3","<=8","--!--",":-(",":(",":c",":<",":[","D:","D8","D;","D=","DX","v.v",":-9",";-)",";)","*)",";]",";D",":-P",":P",":-p",":p","=p",":-Þ",":Þ",":-b",":b",":-O",":O","O_O","o_o","8O","OwO","O-O","0_o","O_o","O3O","o0o ;o_o;","o...o","0w0",":-/",":/",":\\","=/","=\\",":S",":|","d:-)","qB-)",":)~",":-)>....",":-X",":X",":-#",":#","O:-)","0:3","O:)",":'(",";*(","T_T","TT_TT","T.T",":-*",":*","^o)",">:)",">;)",">:-)","B)","B-)","8)","8-)","^>.>^","^<.<^","^>_>^","^<_<^","D:<",">:(","D-:<",">:-(",":-@[1]",";(","`_´","D<","<3","<333","=^_^=","=>.>=","=<_<=","=>.<=","\\,,/","\\m/","\\m/\\>.</\\m/","\\o/","\\o o/","o/\\o",":&",":u"],o=!0,s="",u=r.firstChild;u;)"#text"==u.nodeName&&(s+=" "+u.nodeValue),u=u.nextSibling;if(s.trim().length>0)for(var d=0;o&&d<l.length;++d)for(var c=s.indexOf(l[d]),m=l[d].length;o&&-1!=c;)o=(o=(o=c>0&&!/\s/.test(s.substring(c-1,c))||c<s.length-m&&!/\s/.test(s.substring(c+m,c+m+1))&&!/[.,!'"?]/.test(s.substring(c+m,c+m+1)))||(":)"==l[d]||"(:"==l[d])&&/\(\:.*\:\)/.test(s))||(";)"==l[d]||"(;"==l[d])&&/\(\;.*\;\)/.test(s),c=s.indexOf(l[d],c+1);if(!o){var p=n.CommonUtil.getAncestor(r,["pre","code","script","body"]);o=null==p||"body"!=p.nodeName.toLowerCase()}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},5460(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.error_message_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(5279),o=i(3946);t.error_message_exists={id:"error_message_exists",context:"dom:*[aria-invalid=true]",refactor:{HAAC_Aria_ErrorMessage:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"error_message_exists.html",Fail_1:"error_message_exists.html",Fail_2:"error_message_exists.html",group:"error_message_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Custom error message has invalid reference 'id' value",Fail_2:"Custom error message is not visible",group:"A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.AriaUtil.getAriaAttribute(n,"aria-errormessage");if(!s)return null;var u=l.FragmentUtil.getById(n,s);return u?o.VisUtil.isNodeVisible(u)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2"):(0,a.RuleFail)("Fail_1")}}},3399(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_label_valid=void 0;var a=i(461),n=i(461),r=i(5279),l=i(4566),o=i(7139),s=i(3946),u=i(1950);t.fieldset_label_valid={id:"fieldset_label_valid",context:"aria:group",refactor:{group_withInputs_hasName:{Pass_1:"Pass_1",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_1:"fieldset_label_valid.html",Fail_1:"fieldset_label_valid.html",Fail_2:"fieldset_label_valid.html",group:"fieldset_label_valid.html"}},messages:{"en-US":{Pass_1:'Group/Fieldset "{0}" with an input has a unique name',Fail_1:"Group/Fieldset does not have an accessible name",Fail_2:'Group/Fieldset "{0}" has a duplicate name to another group',group:"Groups with nested inputs must have unique accessible name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)){var d=r.FragmentUtil.getOwnerFragment(n),c=l.CacheUtil.getCache(n.ownerDocument,"landmark_group_input",null);if(!c){c={groupsWithInputs:[],groupsWithInputsComputedLabels:[]};for(var m=d.querySelectorAll('fieldset,[role="group"]'),p=Array.from(m),h=[],g=0;g<p.length;g++)p[g].querySelector("input")&&h.push(p[g]);var b=[];for(g=0;g<h.length;g++){var _=u.AccNameUtil.computeAccessibleName(h[g]);b.push(_&&_.name&&_.name.trim().length>0?_.name.trim():"")}c.groupsWithInputs=h,c.groupsWithInputsComputedLabels=b,l.CacheUtil.setCache(n.ownerDocument,"landmark_group_input",c)}var f=!1,v="";if(!c.groupsWithInputs)return null;for(g=0;g<c.groupsWithInputs.length;g++)if(n.isSameNode(c.groupsWithInputs[g])){if(f=!0,""===c.groupsWithInputsComputedLabels[g]||null===c.groupsWithInputsComputedLabels[g])return(0,a.RuleFail)("Fail_1");for(var A=!1,w=0;w<c.groupsWithInputsComputedLabels.length;w++)g!=w&&c.groupsWithInputsComputedLabels[g]===c.groupsWithInputsComputedLabels[w]&&(A=!0);if(A)return(0,a.RuleFail)("Fail_2",[c.groupsWithInputsComputedLabels[g]]);v=c.groupsWithInputsComputedLabels[g]}return f?(0,a.RulePass)("Pass_1",[v]):null}}}},3498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_legend_valid=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.fieldset_legend_valid={id:"fieldset_legend_valid",context:"dom:fieldset",refactor:{WCAG20_Fieldset_HasLegend:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"fieldset_legend_valid.html",Fail_1:"fieldset_legend_valid.html",Fail_2:"fieldset_legend_valid.html",Fail_3:"fieldset_legend_valid.html",group:"fieldset_legend_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<fieldset> element does not have a <legend>",Fail_2:"<fieldset> element has more than one <legend>",Fail_3:"<fieldset> element <legend> is empty",group:" <fieldset> elements should have a single, non-empty <legend> as a label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n)||r.CommonUtil.isNodeDisabled(n))return null;var o=r.CommonUtil.getChildByTagHidden(n,"legend",!0,!1);return 0===o.length?(0,a.RuleFail)("Fail_1"):o.length>1?(0,a.RuleFail)("Fail_2"):0===r.CommonUtil.getInnerText(o[0]).trim().length?(0,a.RuleFail)("Fail_3"):(0,a.RulePass)("Pass_0")}}},9629(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.figure_label_exists=void 0;var a=i(461),n=i(461),r=i(3946),l=i(1950);t.figure_label_exists={id:"figure_label_exists",context:"dom:figure",refactor:{HAAC_Figure_label:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"figure_label_exists.html",Fail_1:"figure_label_exists.html",group:"figure_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <figure> element does not have an associated label",group:"A <figure> element must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=l.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[])}}},733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_font_color=void 0;var a=i(461),n=i(461);t.form_font_color={id:"form_font_color",context:"dom:form",refactor:{RPT_Font_ColorInForm:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_font_color.html",Potential_1:"form_font_color.html",group:"form_font_color.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Check color is not used as the only visual means to convey which fields are required",group:"Combine color and descriptive markup to indicate required form fields"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!0,r=e.dom.node.getElementsByTagName("font");if(null!=r)for(var l=0;l<r.length;++l)n=!r[l].hasAttribute("color");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9797(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_interaction_review=void 0;var a=i(461),n=i(461),r=i(7139);t.form_interaction_review={id:"form_interaction_review",context:"dom:form[target]",refactor:{WCAG20_Form_TargetAndText:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_interaction_review.html",Potential_1:"form_interaction_review.html",group:"form_interaction_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that interacting with content will not open pop-up windows or change the active window without informing the user",group:"User should be informed in advance when interacting with content causes a change of context"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n={paramWinText:{value:["new window"],type:"array"}},l=e.dom.node,o=l.getAttribute("target"),s="_parent"===o||"_self"===o||"_top"===o||null!=r.CommonUtil.getFrameByName(l,o);if(!s){var u=r.CommonUtil.getInnerText(l);l.hasAttribute("title")&&(u+=" "+l.getAttribute("title"));for(var d=0;!s&&d<n.paramWinText.value.length;++d)-1!=u.indexOf(n.paramWinText.value[d])&&(s=!0)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},7156(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_label_unique=void 0;var a=i(461),n=i(461),r=i(5279),l=i(4566);t.form_label_unique={id:"form_label_unique",context:"dom:label[for]",refactor:{RPT_Label_UniqueFor:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"form_label_unique.html",Fail_1:"form_label_unique.html",group:"form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control has more than one label",group:"Form controls should have exactly one label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CacheUtil.getCache(r.FragmentUtil.getOwnerFragment(n),"RPT_Label_Single",{}),s=n.getAttribute("for"),u=!(s in o);return o[s]=!0,u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3062(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_button_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3864);t.form_submit_button_exists={id:"form_submit_button_exists",context:"dom:form",refactor:{WCAG20_Form_HasSubmit:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_button_exists.html",Potential_1:"form_submit_button_exists.html",group:"form_submit_button_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the <form> element has a submit button or an image button",group:"A <form> element should have a submit button or an image button"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1;if(n.firstChild)for(var s=new l.DOMWalker(n,!0);!o&&s.prevNode()&&s.node!=n;)if(!s.bEndTag){var u=s.node.nodeName.toLowerCase();if("input"===u){var d=s.elem().getAttribute("type");d&&(d=d.toLowerCase()),o="submit"===d||"image"===d}else"button"===u?o=s.elem().hasAttribute("type")&&"submit"===s.elem().getAttribute("type").toLowerCase():1===s.node.nodeType&&(o=r.AriaUtil.hasRole(s.node,"button"))}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3827(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_review=void 0;var a=i(461);t.form_submit_review={id:"form_submit_review",context:"dom:select[onchange], dom:input[onchange]",refactor:{RPT_Form_ChangeEmpty:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_review.html",Potential_1:"form_submit_review.html",group:"form_submit_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Confirm the form does not submit automatically without warning",group:"A form should not be submitted automatically without warning the user"}},rulesets:[],act:[],run:function(e,t,i){var n=0===e.dom.node.getAttribute("onchange").trim().length;return n?null:n?void 0:(0,a.RulePotential)("Potential_1")}}},5498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_src_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.frame_src_valid={id:"frame_src_valid",context:"dom:frame, dom:iframe",refactor:{Valerie_Frame_SrcHtml:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"frame_src_valid.html",Potential_1:"frame_src_valid.html",group:"frame_src_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify <frame> content is accessible",group:"A <frame> containing non-HTML content must be made accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.attributeNonEmpty(n,"src")&&r.CommonUtil.isHtmlExt(r.CommonUtil.getFileExt(n.getAttribute("src")));return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},510(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_title_exists=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.frame_title_exists={id:"frame_title_exists",context:"dom:frame, dom:iframe",refactor:{WCAG20_Frame_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"frame_title_exists.html",Pass_0:"frame_title_exists.html",Fail_1:"frame_title_exists.html"}},messages:{"en-US":{group:"Inline frames must have a unique, non-empty 'title' attribute",Pass_0:"Rule Passed",Fail_1:"Inline frame does not have a 'title' attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:"cae760",run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=r.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7722(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_content_exists=void 0;var a=i(461),n=i(461),r=i(7139);t.heading_content_exists={id:"heading_content_exists",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",refactor:{RPT_Header_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"heading_content_exists.html",Fail_1:"heading_content_exists.html",group:"heading_content_exists.html"}},messages:{"en-US":{Pass_0:"Heading element has descriptive text",Fail_1:"Heading element has no descriptive content",group:"Heading elements must provide descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.6"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4597(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_markup_misuse=void 0;var a=i(461),n=i(461),r=i(7139);t.heading_markup_misuse={id:"heading_markup_misuse",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",dependencies:["heading_content_exists"],refactor:{RPT_Headers_FewWords:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"heading_markup_misuse.html",Potential_1:"heading_markup_misuse.html",group:"heading_markup_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the heading element is a genuine heading",group:"Heading elements must not be used for presentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.wordCount(r.CommonUtil.getInnerText(n))<=20;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},2104(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_lang_exists=void 0;var a=i(461),n=i(461),r=i(6858),l=i(1043);t.html_lang_exists={id:"html_lang_exists",context:"dom:html",refactor:{WCAG20_Html_HasLang:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3",Fail_4:"Fail_4",Fail_5:"Fail_5",Potential_5:"Potential_5",Potential_6:"Potential_6"}},help:{"en-US":{group:"html_lang_exists.html",Pass_0:"html_lang_exists.html",Fail_1:"html_lang_exists.html",Fail_2:"html_lang_exists.html",Fail_3:"html_lang_exists.html",Fail_4:"html_lang_exists.html",Fail_5:"html_lang_exists.html",Potential_5:"html_lang_exists.html",Potential_6:"html_lang_exists.html"}},messages:{"en-US":{group:"Page must identify the default language of the document with a 'lang' attribute",Pass_0:'Page language detected as "{0}"',Fail_1:"Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes",Fail_2:"Page detected as XHTML, but does not have an 'xml:lang' attribute",Fail_3:"Page detected as HTML, but does not have a 'lang' attribute",Fail_4:"Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"",Fail_5:"Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"",Potential_5:"Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type",Potential_6:"Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.1.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"fail",Fail_4:"inapplicable",Fail_5:"inapplicable",Potential_5:"inapplicable",Potential_6:"inapplicable"},"5b7ae0":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"fail",Fail_5:"pass",Potential_5:"inapplicable",Potential_6:"inapplicable"}}],run:function(e,t,i){if(r.AncestorUtil.isPresentationFrame(i))return null;var n=e.dom.node,o=n.ownerDocument.doctype?n.ownerDocument.doctype.publicId:"";o||(o="");var s=n.getAttribute("lang"),u=n.getAttribute("xml:lang");return o.includes("XHTML")&&!o.includes("1.0")?u?(0,a.RulePass)("Pass_0",[u]):(0,a.RuleFail)("Fail_2"):o.includes("XHTML")&&o.includes("1.0")?s||u?s&&u?s!==u?l.LangUtil.validPrimaryLang(s)&&l.LangUtil.validPrimaryLang(u)?l.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):s?(0,a.RulePotential)("Potential_5"):(0,a.RulePotential)("Potential_6"):(0,a.RuleFail)("Fail_1"):s?s&&u&&s!==u?l.LangUtil.validPrimaryLang(s)&&l.LangUtil.validPrimaryLang(u)?l.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):(0,a.RuleFail)("Fail_3")}}},8260(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_skipnav_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(5279);t.html_skipnav_exists={id:"html_skipnav_exists",context:"dom:html",refactor:{RPT_Html_SkipNav:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"html_skipnav_exists.html",Pass_0:"html_skipnav_exists.html",Potential_1:"html_skipnav_exists.html"}},messages:{"en-US":{group:"Provide a way to bypass blocks of content that are repeated on multiple Web pages",Pass_0:"Rule Passed",Potential_1:"Verify there is a way to bypass blocks of content that are repeated on multiple Web pages"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1,s=r.CommonUtil.getDocElementsByTag(n,"frame"),u=r.CommonUtil.getDocElementsByTag(n,"h1");if(null!=s&&s.length>0||null!=u&&u.length>0)o=!0;else for(var d=r.CommonUtil.getDocElementsByTag(n,"a"),c={},m=0;!o&&m<d.length;++m)if(d[m].hasAttribute("href")){var p=d[m].href;"string"!=typeof p&&(p=p.baseVal?p.baseVal:"");var h,g="";if((h=void 0!==n.ownerDocument.locationFromDAP&&null!=n.ownerDocument.locationFromDAP?n.ownerDocument.locationFromDAP:n.ownerDocument.location)&&(g=h.href),p.startsWith("file:///")&&(p="file:/"+p.substring(8)),g.startsWith("file:///")&&(g="file:/"+g.substring(8)),"#"==p.charAt(0)||p.startsWith(g+"#")){var b=r.CommonUtil.getFileAnchor(p);null!=l.FragmentUtil.getById(n,b)?o=!0:c[b]=!0}}else if(d[m].hasAttribute("name")){var _=d[m].getAttribute("name");-1!=_.indexOf("#")&&(_=r.CommonUtil.getFileAnchor(_)),o=_ in c}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8920(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.iframe_interactive_tabbable=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3946),o=i(7507);t.iframe_interactive_tabbable={id:"iframe_interactive_tabbable",context:"dom:iframe",dependencies:[],help:{"en-US":{group:"iframe_interactive_tabbable.html",pass:"iframe_interactive_tabbable.html",fail_invalid:"iframe_interactive_tabbable.html"}},messages:{"en-US":{group:"Iframe with interactive content should not be excluded from tab order using tabindex",pass:"The iframe with interactive content is not excluded from the tab order using tabindex",fail_invalid:"The <iframe> with interactive content is excluded from tab order using tabindex"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:["akn7bn"],run:function(e,t,i){var r=e.dom.node;if(!l.VisUtil.isNodeHiddenFromAT(r)&&!a.CommonUtil.isNodeDisabled(r)){var s=(new o.DOMMapper).getUnadjustedBounds(r);if(!s)return null;if(Math.max(s.height,s.width)<30||Math.min(s.height,s.width)<15)return null;if(!r.hasAttribute("tabindex")||parseInt(r.getAttribute("tabindex"))>=0)return(0,n.RulePass)("pass");var u=r;if(!u||!u.contentDocument||!u.contentDocument.documentElement)return null;var d=r.ownerDocument;return d&&Array.from(d.querySelectorAll("dialog")).some(function(e){return e.matches(":modal")&&!e.contains(r)})?null:a.CommonUtil.getTabbableChildren(r)>0?(0,n.RuleFail)("fail_invalid"):null}}}},1237(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagebutton_alt_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.imagebutton_alt_exists={id:"imagebutton_alt_exists",context:"dom:input",refactor:{WCAG20_Input_ExplicitLabelImage:{Pass_0:"Pass_0",Pass_1:"Pass_1",Pass_2:"Pass_2",Fail:"Fail"}},help:{"en-US":{Pass_0:"imagebutton_alt_exists.html",Pass_1:"imagebutton_alt_exists.html",Pass_2:"imagebutton_alt_exists.html",Fail:"imagebutton_alt_exists.html",group:"imagebutton_alt_exists.html"}},messages:{"en-US":{Pass_0:"Image button provides alternative text using the 'alt' attribute",Pass_1:"Image button provides alternative text using an ARIA label",Pass_2:"Image button provides alternative text using the 'title' attribute",Fail:'The <input> element of type "image" has no text alternative',group:'The <input> element of type "image" should have a text alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"59796f",run:function(e,t,i){var n=e.dom.node;return n.hasAttribute("type")&&"image"==n.getAttribute("type").toLowerCase()?l.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):r.AriaUtil.hasAriaLabel(n)?(0,a.RulePass)("Pass_1"):n.hasAttribute("title")&&n.getAttribute("title").length>0?(0,a.RulePass)("Pass_2"):(0,a.RuleFail)("Fail"):null}}},4101(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagemap_alt_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.imagemap_alt_exists={id:"imagemap_alt_exists",context:"dom:img[usemap], dom:img[ismap]",refactor:{HAAC_Img_UsemapAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"imagemap_alt_exists.html",Fail_1:"imagemap_alt_exists.html",group:"imagemap_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image map or child <area> has no text alternative",group:"An image map and each <area> element in an image map must have text alternative(s)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.CommonUtil.attributeNonEmpty(n,"alt")||!n.hasAttribute("ismap")&&!r.CommonUtil.attributeNonEmpty(n,"usemap")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},275(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_background=void 0;var a=i(461),n=i(461),r=i(3946);t.img_alt_background={id:"img_alt_background",context:"dom:*",refactor:{HAAC_BackgroundImg_HasTextOrTitle:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"img_alt_background.html",Manual_1:"img_alt_background.html",group:"img_alt_background.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify important background image information has a text alternative in system high contrast mode",group:"Background images that convey important information must have a text alternative that describes the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.ownerDocument.defaultView.getComputedStyle(n);if(null==l)return(0,a.RulePass)("Pass_0");var o=l.backgroundImage,s=!0;if(null!=o&&""!=o&&"none"!=o&&"inherit"!=o)if(null!=n.innerHTML&&0!=n.innerHTML.trim().length)s=!1;else{var u=n.getAttribute("title");null!=u&&0!=u.length&&(s=!1)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RuleManual)("Manual_1")}}},7601(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_decorative=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.img_alt_decorative={id:"img_alt_decorative",context:"dom:img[alt]",refactor:{WCAG20_Img_PresentationImgHasNonNullAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"img_alt_decorative.html",Fail_1:"img_alt_decorative.html",group:"img_alt_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image designated as decorative has non-null 'alt' attribute",group:'Image designated as decorative must have \'alt=""'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=!0;return(r.AriaUtil.hasRole(n,"presentation")||r.AriaUtil.hasRole(n,"none"))&&(o=0==n.getAttribute("alt").length),o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7541(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_misuse=void 0;var a=i(461),n=i(461),r=i(3946);t.img_alt_misuse={id:"img_alt_misuse",context:"dom:img, dom:area, dom:input",refactor:{RPT_Img_AltCommonMisuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_alt_misuse.html",Potential_1:"img_alt_misuse.html",group:"img_alt_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file name serves as a good inline replacement for the image",group:"'alt' attribute value must be a good inline replacement for the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.nodeName.toLowerCase(),o=!0;if(n.hasAttribute("alt")){var s=n.getAttribute("alt").trim();if(s.length>0){for(var u=["short description"],d=0;o&&d<u.length;++d)o=-1==s.indexOf(u[d]);if(o){var c=n.getAttribute("area"==l?"href":"src");null!=c&&(o=c.trim()!=s&&(-1==s.indexOf(".")||-1==s.indexOf(c)&&-1==c.indexOf(s)))}}}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8274(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_null=void 0;var a=i(461),n=i(461),r=i(3946),l=i(7011),o=i(7139);t.img_alt_null={id:"img_alt_null",context:"dom:img[alt]",refactor:{WCAG20_Img_TitleEmptyWhenAltNull:{Pass_0:"pass",Fail_1:"fail_decorative"}},help:{"en-US":{pass:"img_alt_null.html",fail_decorative:"img_alt_null.html",potential_aria_override:"img_alt_null.html",group:"img_alt_null.html"}},messages:{"en-US":{pass:"Neither 'aria' nor 'title' attributes are used for the decorative image",fail_decorative:"The image 'alt' attribute is empty, but the 'title' attribute is not empty",potential_aria_override:"The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute",group:"When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_decorative"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["potential_aria_override"]}],act:[{"46ca7f":{potential_aria_override:"fail"}}],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)||n.getAttribute("alt").trim().length>0?null:l.AriaUtil.getAriaLabel(n).length>0?(0,a.RulePotential)("potential_aria_override"):o.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RuleFail)("fail_decorative"):(0,a.RulePass)("pass")}}},590(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_redundant=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7139);t.img_alt_redundant={id:"img_alt_redundant",context:"dom:img[alt]",refactor:{WCAG20_Img_LinkTextNotRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"img_alt_redundant.html",Fail_1:"img_alt_redundant.html",Fail_2:"img_alt_redundant.html",Fail_3:"img_alt_redundant.html",group:"img_alt_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Link text is repeated in an image 'alt' value within the same link",Fail_2:"Link text of previous link is repeated in image 'alt' value of a link",Fail_3:"Image 'alt' value within a link is repeated in link text of the link after",group:"The text alternative for an image within a link should not repeat the link text or adjacent link text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.4.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CommonUtil.getAncestor(n,"a");if(null==o)return null;var s=n.getAttribute("alt").trim().toLowerCase();if(0==s.length)return null;var u=o.innerText,d="";if(null!=u&&(d=u.trim().toLowerCase()),!(d.length>0)){for(var c=!0,m=new r.DOMWalker(o);c&&m.prevNode()&&!("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&l.CommonUtil.attributeNonEmpty(p,"alt"));)"a"!==h||l.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=(p.innerText||p.textContent||"").trim().toLowerCase()!=s);if(!c)return(0,a.RuleFail)("Fail_2");for(m=new r.DOMWalker(o,!0);c&&m.nextNode();){var p,h;if("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&l.CommonUtil.attributeNonEmpty(p,"alt"))break;"a"!=h||l.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=p.innerText.trim().toLowerCase()!=s)}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3")}return s==d?(0,a.RuleFail)("Fail_1"):void 0}}},8925(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946),o=i(1950);t.img_alt_valid={id:"img_alt_valid",context:"dom:img",refactor:{WCAG20_Img_HasAlt:{pass:"pass",fail_blank_alt:"fail_blank_alt",fail_no_alt:"fail_no_alt",fail_blank_title:"fail_blank_title"}},help:{"en-US":{pass:"img_alt_valid.html",fail_blank_alt:"img_alt_valid.html",fail_no_alt:"img_alt_valid.html",fail_blank_title:"img_alt_valid.html",group:"img_alt_valid.html"}},messages:{"en-US":{pass:"The image has an accessible name or is correctly marked as decorative or redundant",fail_blank_alt:"Image 'alt' attribute value consists only of blank space(s)",fail_no_alt:"The image has neither an accessible name nor is marked as decorative or redundant",fail_blank_title:"The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)",group:"Images must have accessible names unless they are decorative or redundant"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"23a2a8",run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n)||o.AccNameUtil.isAccessibleNameIgnorable(n))return null;if(0!==r.AriaUtil.getAriaLabel(n).trim().length)return(0,a.RulePass)("pass");var s=n.hasAttribute("alt")?n.getAttribute("alt"):null;if(null!==s)return 0===s.length||s.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_blank_alt");var u=n.hasAttribute("title")?n.getAttribute("title"):null;if(null!==u&&0!==u.length)return 0===u.trim().length?(0,a.RuleFail)("fail_blank_title"):(0,a.RulePass)("pass");if(null===s){var d=r.AriaUtil.getResolvedRole(n,!1);return"presentation"===d||"none"===d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_alt")}return 0===s.length?(0,a.RulePass)("pass"):void 0}}},9234(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_ismap_misuse=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.img_ismap_misuse={id:"img_ismap_misuse",context:"dom:img[ismap]",refactor:{RPT_Img_UsemapValid:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_ismap_misuse.html",Potential_1:"img_ismap_misuse.html",group:"img_ismap_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Server-side image map hot-spots do not have duplicate text links",group:"Server-side image map hot-spots must have duplicate text links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=!1;if(n.hasAttribute("usemap")){var s=n.getAttribute("usemap"),u=(s=s.trim().toLowerCase()).indexOf("#");if(-1!=u&&(s=s.substr(u+1)),s.length>0)for(var d=r.CommonUtil.getDocElementsByTag(n,"map"),c=0;!o&&c<d.length;++c)o=d[c].hasAttribute("name")&&d[c].getAttribute("name").toLowerCase()==s}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_longdesc_misuse=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.img_longdesc_misuse={id:"img_longdesc_misuse",context:"dom:img[longdesc]",refactor:{RPT_Img_LongDescription2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_longdesc_misuse.html",Potential_1:"img_longdesc_misuse.html",group:"img_longdesc_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)",group:" The 'longdesc' attribute must reference HTML content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("longdesc"),s=r.CommonUtil.getFileExt(o),u=0!=s.length&&r.CommonUtil.isHtmlExt(s)||o.startsWith("#")||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("data:");return u?(0,a.RulePass)("Pass_0"):u?void 0:(0,a.RulePotential)("Potential_1")}}},591(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||a(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),n(i(2297),t),n(i(4401),t),n(i(4546),t),n(i(9292),t),n(i(9605),t),n(i(3987),t),n(i(8631),t),n(i(8025),t),n(i(1198),t),n(i(8001),t),n(i(5778),t),n(i(8118),t),n(i(2242),t),n(i(3673),t),n(i(5080),t),n(i(183),t),n(i(6805),t),n(i(1886),t),n(i(4078),t),n(i(5750),t),n(i(85),t),n(i(514),t),n(i(5310),t),n(i(9083),t),n(i(6049),t),n(i(5099),t),n(i(2759),t),n(i(3141),t),n(i(5131),t),n(i(5167),t),n(i(8115),t),n(i(5733),t),n(i(5782),t),n(i(6731),t),n(i(390),t),n(i(3900),t),n(i(1218),t),n(i(6734),t),n(i(9973),t),n(i(5711),t),n(i(3384),t),n(i(2762),t),n(i(5757),t),n(i(5232),t),n(i(1891),t),n(i(6142),t),n(i(4863),t),n(i(1440),t),n(i(1968),t),n(i(1617),t),n(i(3475),t),n(i(3370),t),n(i(9272),t),n(i(7735),t),n(i(3923),t),n(i(7521),t),n(i(1852),t),n(i(799),t),n(i(4614),t),n(i(5952),t),n(i(5395),t),n(i(1992),t),n(i(7955),t),n(i(9531),t),n(i(891),t),n(i(7446),t),n(i(6137),t),n(i(6839),t),n(i(8135),t),n(i(507),t),n(i(3566),t),n(i(5173),t),n(i(6027),t),n(i(7515),t),n(i(1704),t),n(i(5053),t),n(i(4681),t),n(i(8050),t),n(i(2644),t),n(i(429),t),n(i(4617),t),n(i(5460),t),n(i(3399),t),n(i(3498),t),n(i(9629),t),n(i(733),t),n(i(9797),t),n(i(7156),t),n(i(3062),t),n(i(3827),t),n(i(5498),t),n(i(510),t),n(i(7722),t),n(i(4597),t),n(i(2104),t),n(i(8260),t),n(i(8920),t),n(i(1237),t),n(i(4101),t),n(i(275),t),n(i(7601),t),n(i(7541),t),n(i(8274),t),n(i(590),t),n(i(8925),t),n(i(9234),t),n(i(8617),t),n(i(1939),t),n(i(7726),t),n(i(3142),t),n(i(1353),t),n(i(2631),t),n(i(8550),t),n(i(8853),t),n(i(3180),t),n(i(1382),t),n(i(953),t),n(i(2222),t),n(i(4678),t),n(i(7578),t),n(i(9964),t),n(i(6401),t),n(i(1174),t),n(i(9907),t),n(i(6032),t),n(i(5622),t),n(i(2240),t),n(i(4019),t),n(i(361),t),n(i(5960),t),n(i(5515),t),n(i(8752),t),n(i(8834),t),n(i(1025),t),n(i(9116),t),n(i(435),t),n(i(6640),t),n(i(2068),t),n(i(7322),t),n(i(5702),t),n(i(1961),t),n(i(3022),t),n(i(375),t),n(i(4658),t),n(i(4605),t),n(i(5294),t),n(i(3506),t),n(i(7475),t),n(i(8064),t),n(i(7942),t),n(i(2219),t),n(i(1473),t),n(i(1912),t),n(i(6539),t),n(i(4),t),n(i(5334),t),n(i(2173),t),n(i(8349),t),n(i(8142),t),n(i(3980),t),n(i(4701),t),n(i(18),t),n(i(9314),t),n(i(1667),t),n(i(9599),t),n(i(4672),t),n(i(4353),t),n(i(7147),t),n(i(1419),t),n(i(855),t),n(i(3420),t),n(i(408),t)},1939(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_autocomplete_valid=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.input_autocomplete_valid={id:"input_autocomplete_valid",context:"dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]",refactor:{WCAG21_Input_Autocomplete:{Pass_0:"pass",Fail_1:"fail_inappropriate",Fail_2:"fail_invalid",Fail_attribute_incorrect:"fail_incorrect"}},help:{"en-US":{group:"input_autocomplete_valid.html",pass:"input_autocomplete_valid.html",fail_inappropriate:"input_autocomplete_valid.html",fail_invalid:"input_autocomplete_valid.html",fail_incorrect:"input_autocomplete_valid.html"}},messages:{"en-US":{group:"The 'autocomplete' attribute's token(s) must be appropriate for the input form field",pass:"The 'autocomplete' attribute's token(s) is appropriate for the input form field",fail_inappropriate:"The 'autocomplete' attribute's token(s) are not appropriate for the input form field",fail_invalid:"The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type",fail_incorrect:"The 'autocomplete' attribute has an incorrect value"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"73f2c2":{pass:"pass",fail_inappropriate:"fail",fail_invalid:"pass",fail_incorrect:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(!l.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;var o=n.getAttribute("autocomplete").trim().toLowerCase(),s=o.split(/\s+/);if(0===s.length||0===o.length)return null;var u={tokensOnOff:["on","off"],tokenOptionalSection:"section-",tokensOptionalPurpose:["shipping","billing"],tokensMandatoryGroup1_password:["new-password","current-password","one-time-code"],tokensMandatoryGroup1_multiline:["street-address"],tokensMandatoryGroup1_month:["cc-exp"],tokensMandatoryGroup1_numeric:["cc-exp-month","cc-exp-year","transaction-amount","bday-day","bday-month","bday-year"],tokensMandatoryGroup1_date:["bday"],tokensMandatoryGroup1_url:["url","photo"],tokensMandatoryGroup1_text:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","organization-title","organization","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-csc","cc-type","transaction-currency","language","sex"],tokensMandatoryGroup1_all:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","new-password","current-password","organization-title","organization","street-address","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc","cc-type","transaction-currency","transaction-amount","language","bday","bday-day","bday-month","bday-year","sex","url","photo"],tokensOptionalGroup2:["home","work","mobile","fax","pager"],tokensMandatoryGroup2_tel:["tel"],tokensMandatoryGroup2_email:["email"],tokensMandatoryGroup2_url:["impp"],tokensMandatoryGroup2_text:["tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension"],tokensMandatoryGroup2_all:["tel","tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension","email","impp"],tokensOptionGroup1_webauthn:["webauthn"]},d=[];for(var c in u)d=d.concat(u[c]);var m=!1,p=!0,h=n.nodeName.toLowerCase();if(!s.every(function(e){return d.includes(e)||e.startsWith(u.tokenOptionalSection)}))return(0,a.RuleFail)("fail_incorrect");var g=n.hasAttribute("type")?n.getAttribute("type").trim().toLowerCase():"text",b=[],_=[],f=[];if("textarea"===h||"select"===h)b=u.tokensMandatoryGroup1_all,_=u.tokensMandatoryGroup2_all,"textarea"===h&&(f=u.tokensOptionGroup1_webauthn);else{if("input"!==h)return null;switch(f=u.tokensOptionGroup1_webauthn,g){case"text":case"search":b=u.tokensMandatoryGroup1_text.concat(u.tokensMandatoryGroup1_password,u.tokensMandatoryGroup1_url,u.tokensMandatoryGroup1_numeric,u.tokensMandatoryGroup1_month,u.tokensMandatoryGroup1_date),_=u.tokensMandatoryGroup2_all;break;case"password":b=u.tokensMandatoryGroup1_password;break;case"url":b=u.tokensMandatoryGroup1_url,_=u.tokensMandatoryGroup2_url;break;case"email":_=u.tokensMandatoryGroup2_email;break;case"tel":_=u.tokensMandatoryGroup2_tel;break;case"number":b=u.tokensMandatoryGroup1_numeric;break;case"month":b=u.tokensMandatoryGroup1_month;break;case"date":b=u.tokensMandatoryGroup1_date;break;default:return null}}if(s.includes("on")||s.includes("off"))return 1===s.length?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid");var v=0,A=0;return s[v].startsWith(u.tokenOptionalSection)&&s[v].length>8&&(v++,A++),s.length>v&&u.tokensOptionalPurpose.includes(s[v])&&(v++,A++),s.length>v&&(b.includes(s[v])?(m=!0,v++):(u.tokensOptionalGroup2.includes(s[v])&&v++,_.includes(s[v])&&(m=!0,v++))),s.length>A&&(u.tokensMandatoryGroup1_all.includes(s[A])?(p=!0,A++):(u.tokensOptionalGroup2.includes(s[A])&&A++,u.tokensMandatoryGroup2_all.includes(s[A])&&(p=!0,A++))),s.length>v+A&&f.includes(s[v+A])&&v++,(s.length>v&&f.includes(s[v])||s.length>A&&f.includes(s[A]))&&(v++,A++),m&&s.length===v?(0,a.RulePass)("pass"):p&&s.length===A?(0,a.RuleFail)("fail_incorrect"):(0,a.RuleFail)("fail_inappropriate")}}},7726(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_checkboxes_grouped=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3864),s=i(4566),u=i(3946),d=i(9196);t.input_checkboxes_grouped={id:"input_checkboxes_grouped",context:"dom:input[type=radio], dom:input[type=checkbox]",refactor:{WCAG20_Input_RadioChkInFieldSet:{Pass_LoneNogroup:"pass_lonenogroup",Pass_Grouped:"pass_grouped",Pass_RadioNoName:"pass_radioNoName",Fail_ControlNameMismatch:"fail_controlnamemismatch",Fail_NotGroupedOtherGrouped:"fail_notgroupedothergrouped",Fail_NotGroupedOtherNotGrouped:"fail_notgroupedothernotgrouped",Fail_NotSameGroup:"fail_notsamegroup",Potential_LoneCheckbox:"potential_lonecheckbox",Potential_UnnamedCheckbox:"potential_unnamedcheckbox"}},help:{"en-US":{group:"input_checkboxes_grouped.html",pass_lonenogroup:"input_checkboxes_grouped.html",pass_grouped:"input_checkboxes_grouped.html",pass_radiononame:"input_checkboxes_grouped.html",fail_controlnamemismatch:"input_checkboxes_grouped.html",fail_notgroupedothergrouped:"input_checkboxes_grouped.html",fail_notgroupedothernotgrouped:"input_checkboxes_grouped.html",fail_notsamegroup:"input_checkboxes_grouped.html",potential_lonecheckbox:"input_checkboxes_grouped.html",potential_unnamedcheckbox:"input_checkboxes_grouped.html"}},messages:{"en-US":{group:"Related sets of radio buttons or checkboxes should be programmatically grouped",pass_lonenogroup:"{0} grouping not required for a control of this type",pass_grouped:"{0} input is grouped with other related controls with the same name",pass_radiononame:"Radio input is not grouped, but passes because it has no name to group with other radio inputs",fail_controlnamemismatch:'{0} input found that has the same name, "{2}" as a {1} input',fail_notgroupedothergrouped:'{0} input is not in the group with another {0} with the name "{1}"',fail_notgroupedothernotgrouped:'{0} input and others with the name "{1}" are not grouped together',fail_notsamegroup:'{0} input is in a different group than another {0} with the name "{1}"',potential_lonecheckbox:"Verify that this ungrouped checkbox input is not related to other checkboxes",potential_unnamedcheckbox:"Verify that this un-named, ungrouped checkbox input is not related to other checkboxes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(u.VisUtil.isNodeHiddenFromAT(n))return null;var c=function(e){var t=l.CommonUtil.getAncestor(e,"fieldset")||r.AriaUtil.getAncestorWithRole(e,"radiogroup")||r.AriaUtil.getAncestorWithRole(e,"group")||r.AriaUtil.getAncestorWithRole(e,"grid")||r.AriaUtil.getAncestorWithRole(e,"table");return t||(t=l.CommonUtil.getAncestor(e,"table"))&&!d.TableUtil.isDataTable(t)&&(t=null),t},m=n.getAttribute("type").toLowerCase(),p=r.AriaUtil.getAncestorWithRole(n,"form")||l.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement,h=s.CacheUtil.getCache(p,"input_checkboxes_grouped",null);if(!h){h={checkboxByName:{},radiosByName:{},nameToGroup:{},numCheckboxes:0,numRadios:0};for(var g=new o.DOMWalker(p,!1,p,!0),b=[],_=[];g.nextNode();)if(!g.bEndTag&&1===g.node.nodeType&&"input"===g.node.nodeName.toLowerCase()&&u.VisUtil.isNodeVisible(g.node)){var f=g.node.getAttribute("type");"checkbox"===f?b.push(g.node):"radio"===f&&_.push(g.node)}for(var v=0;v<b.length;++v){var A=b[v];if((r.AriaUtil.getAncestorWithRole(A,"form")||l.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!l.CommonUtil.shouldNodeBeSkippedHidden(A)){var w=A.getAttribute("name")||"";(h.checkboxByName[w]=h.checkboxByName[w]||[]).push(A),h.nameToGroup[w]=h.nameToGroup[w]||c(A),++h.numCheckboxes}}for(v=0;v<_.length;++v){var y=_[v];if((r.AriaUtil.getAncestorWithRole(y,"form")||l.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!l.CommonUtil.shouldNodeBeSkippedHidden(y)){var C=y.getAttribute("name")||"";(h.radiosByName[C]=h.radiosByName[C]||[]).push(y),h.nameToGroup[C]=h.nameToGroup[C]||c(y),++h.numRadios}}s.CacheUtil.setCache(p,"input_checkboxes_grouped",h)}var k=n.getAttribute("name"),R=c(n);if(m="radio"===m?"Radio":"Checkbox",k&&""!==k){var x=(h.radiosByName[k]||[]).length,P=(h.checkboxByName[k]||[]).length;return x>0&&P>0?(0,a.RuleFail)("fail_controlnamemismatch",[m,"checkbox"===m?"radio":"checkbox",k]):"Radio"===m&&(1===h.numRadios||1===x)||"Checkbox"===m&&1===h.numCheckboxes?null===R?(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m]):"Checkbox"===m&&h.numCheckboxes>1&&1===P?null===R?(0,a.RulePotential)("potential_lonecheckbox",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?null!==h.nameToGroup[k]?(0,a.RuleFail)("fail_notgroupedothergrouped",[m,k]):(0,a.RuleFail)("fail_notgroupedothernotgrouped",[m,k]):h.nameToGroup[k]!==R?(0,a.RuleFail)("fail_notsamegroup",[m,k]):(0,a.RulePass)("pass_grouped",[m])}return"Radio"===m?null===R?(0,a.RulePass)("pass_radiononame",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?(h.checkboxByName[""]||[]).length>1?(0,a.RulePotential)("potential_unnamedcheckbox",[m]):(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m])}}},3142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_fields_grouped=void 0;var a=i(461),n=i(461),r=i(7139);t.input_fields_grouped={id:"input_fields_grouped",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_InFieldSet:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"input_fields_grouped.html",Potential_1:"input_fields_grouped.html",group:"input_fields_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Use the <fieldset> element to group logically related input elements",group:"Groups of logically related input elements should be contained within a <fieldset> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")&&"text"!=(m=n.getAttribute("type").toLowerCase())&&"file"!=m&&"password"!=m)return(0,a.RulePass)("Pass_0");if(null!=r.CommonUtil.getAncestor(n,"fieldset"))return(0,a.RulePass)("Pass_0");for(var l=r.CommonUtil.getAncestor(n,["form","body"]),o=["input","textarea","select"],s=!0,u=0;s&&u<o.length;++u)for(var d=l.getElementsByTagName(o[u]),c=0;s&&c<d.length;++c)if(!r.CommonUtil.shouldNodeBeSkippedHidden(d[c])){var m=d[c].hasAttribute("type")?d[c].getAttribute("type").toLowerCase():"text";s=d[c]==n||"text"!=m&&"password"!=m&&"file"!=m}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},1353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_haspopup_conflict=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.input_haspopup_conflict={id:"input_haspopup_conflict",context:"dom:input[list][aria-haspopup]",refactor:{input_haspopup_invalid:{Potential_1:"potential_type_misuse",Potential_2:"potential_misuse"}},help:{"en-US":{group:"input_haspopup_conflict.html",potential_type_misuse:"input_haspopup_conflict.html",potential_misuse:"input_haspopup_conflict.html",potential_list_notexist:"input_haspopup_conflict.html",fail_invalid_list_type:"input_haspopup_conflict.html",fail_invalid_list_elem:"input_haspopup_conflict.html"}},messages:{"en-US":{group:"<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute",potential_type_misuse:"The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_misuse:"The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_list_notexist:"The list attribute for the <input> element is invalid",fail_invalid_list_type:'The list attribute for the <input> element with the type "{0}" is invalid',fail_invalid_list_elem:"The list attribute for the <input> element does not reference a datalist element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n)||l.CommonUtil.isNodeDisabled(n))return null;var s=r.AriaUtil.getUserDefinedRoles(n);if(s&&s.length>0&&!s.includes("combobox"))return null;var u=["text","search","tel","url","email","date","month","week","time","datetime-local","number","range","color"],d=["file","password","checkbox","radio","submit","reset","image","hidden","button"],c=n.getAttribute("type");if(!c||0===c.trim().length)return(0,a.RulePotential)("potential_misuse");if(c=c.trim().toLowerCase(),!u.includes(c)&&!d.includes(c))return(0,a.RulePotential)("potential_misuse");if(c&&d.includes(c))return(0,a.RuleFail)("fail_invalid_list_type");var m=n.getAttribute("list");if(!m||0===m.trim().length)return(0,a.RulePotential)("potential_list_notexist");var p=n.ownerDocument.getElementById(m);return p?"datalist"!==p.nodeName.toLowerCase()?(0,a.RuleFail)("fail_invalid_list_elem"):u.includes(c)?(0,a.RulePotential)("potential_type_misuse",[c]):void 0:(0,a.RuleFail)("potential_list_notexist")}}},2631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_after=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7139);t.input_label_after={id:"input_label_after",context:"dom:input",refactor:{WCAG20_Input_LabelAfter:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_after.html",Fail_1:"input_label_after.html",Fail_2:"input_label_after.html",group:"input_label_after.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Checkbox or radio button is nested in label, so label is not after the input control",Fail_2:"Label text is located before its associated checkbox or radio button element",group:"Checkboxes and radio buttons must have a label after the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o="";if(n.hasAttribute("type")&&(o=n.getAttribute("type").toLowerCase()),"checkbox"!=o&&"radio"!=o)return null;var s=l.CommonUtil.getLabelForElementHidden(n,!0);if(null===s||!l.CommonUtil.hasInnerContentHidden(s))return null;var u,d=l.CommonUtil.compareNodeOrder(s,n);if(-2===d){u=!1;var c=new r.DOMWalker(s);for(c.node=n;!u&&c.nextNode();)u="#text"===c.node.nodeName.toLowerCase()&&c.node.nodeValue.trim().length>0||"span"===c.node.nodeName.toLowerCase()&&c.node.textContent.trim().length>0;if(!u)return(0,a.RuleFail)("Fail_1")}else if(1!=d)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8550(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_before=void 0;var a=i(461),n=i(461),r=i(7139);t.input_label_before={id:"input_label_before",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_LabelBefore:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_before.html",Fail_1:"input_label_before.html",Fail_2:"input_label_before.html",group:"input_label_before.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Text input is nested in label such that input precedes the label text",Fail_2:"Label text is located after its associated text input or <select> element",group:"Text inputs and <select> elements must have a label before the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var l=n.getAttribute("type").toLowerCase();if("text"!=l&&"file"!=l&&"password"!=l)return null}var o=r.CommonUtil.getLabelForElementHidden(n,!0);if(null==o||!r.CommonUtil.hasInnerContentHidden(o))return null;var s=r.CommonUtil.compareNodeOrder(o,n);if(-2===s){var u=r.CommonUtil.getInnerText(n);if(u&&u.trim().length>0&&r.CommonUtil.getInnerText(n).trim()===u.trim())return null;for(var d=!1,c=n.previousSibling;!d&&null!==c;)d="#text"==c.nodeName.toLowerCase()&&c.nodeValue.trim().length>0||"span"==c.nodeName.toLowerCase()&&c.textContent.trim().length>0,c=c.previousSibling;if(!d)return(0,a.RuleFail)("Fail_1")}else if(-1!=s)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8853(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946),o=i(1950);t.input_label_exists={id:"input_label_exists",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]",refactor:{WCAG20_Input_ExplicitLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_exists.html",Fail_1:"input_label_exists.html",Fail_2:"input_label_exists.html",group:"input_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control element <{0}> has no associated label",Fail_2:'Form control with "{0}" role has no associated label',group:"Each form control must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["97a4e1","e086e5"],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var s=n.nodeName.toLowerCase();if("datalist"===s)return null;var u="text";if("input"==s&&n.hasAttribute("type")?u=n.getAttribute("type").toLowerCase():("button"===s||r.AriaUtil.hasRoleInSemantics(n,"button"))&&(u="buttonelem"),"input"==s&&""==u&&(u="text"),"image"===u)return null;var d=o.AccNameUtil.computeAccessibleName(n);return d&&d.name&&d.name.trim().length>0?(0,a.RulePass)("Pass_0"):n.hasAttribute("role")&&n.getAttribute("role").trim().length>0?(0,a.RuleFail)("Fail_2",n.getAttribute("role").split(" ")):(0,a.RuleFail)("Fail_1",[s])}}},3180(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(3946),u=i(1686),d=i(1950);t.input_label_visible={id:"input_label_visible",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox",dependencies:["input_label_exists"],refactor:{WCAG20_Input_VisibleLabel:{Pass_0:"pass",Potential_1:"potential_no_label",potential_placeholder_only:"potential_placeholder_only"}},help:{"en-US":{pass:"input_label_visible.html",potential_placeholder_only:"input_label_visible.html",potential_no_label:"input_label_visible.html",group:"input_label_visible.html"}},messages:{"en-US":{pass:"The input element has an associated visible label",potential_placeholder_only:"The ‘placeholder’ is the only visible label",potential_no_label:"The input element does not have an associated visible label",group:"An input element must have an associated visible label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.5.3","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if("datalist"===c)return null;if(!s.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;if(l.CommonUtil.getAncestor(n,"table"))return null;var m=r.AriaUtil.getResolvedRole(n);if(m&&"button"===m&&"input"!==c&&"button"!==c&&!l.CommonUtil.getAncestor(n,"form"))return null;if(r.AriaUtil.getAncestorWithRole(n,"combobox")&&!(r.AriaUtil.hasRoleInSemantics(n,"textbox")||r.AriaUtil.hasRoleInSemantics(n,"searchbox")||"input"===c||"select"===c&&r.AriaUtil.hasRoleInSemantics(n,"combobox")))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(r.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=l.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=l.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(o.FragmentUtil.getById(n,v[A])===n)return null}var w=d.AccNameUtil.computeAccessibleName(n);if(("input"===c||"button"===c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"internal"===w.nameFrom||"alt"===w.nameFrom))return(0,a.RulePass)("pass");if(w&&w.name&&w.name.trim().length>0&&("text"===w.nameFrom||"title"===w.nameFrom))return(0,a.RulePass)("pass");var y=l.CommonUtil.getOnScreenInnerText(n);if(y&&0!==y.length)return(0,a.RulePass)("pass");var C=r.AriaUtil.getAllDescendantsWithRoles(n,["img","graphics-document","graphics-object","graphics-symbol"],!1,!0);if(C&&C.length>0)for(var k=0;k<C.length;k++)if(l.CommonUtil.attributeNonEmpty(C[k],"title")||l.CommonUtil.attributeNonEmpty(C[k],"alt"))return(0,a.RulePass)("pass");if(l.CommonUtil.attributeNonEmpty(n,"aria-labelledby")){var R=n.getAttribute("aria-labelledby").split(/\s+/);for(h=0;h<R.length;++h){var x=o.FragmentUtil.getById(n,R[h]);if(x&&!u.DOMUtil.sameNode(x,n)&&s.VisUtil.isNodeVisible(x)&&l.CommonUtil.hasInnerContentHidden(x))return(0,a.RulePass)("pass")}}if(("optgroup"===c||"option"==c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"content"===w.nameFrom))return(0,a.RulePass)("pass");var P=n.getAttribute("id");return P&&P.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(P,"'][role='combobox']"))?null:l.CommonUtil.attributeNonEmpty(n,"placeholder")?(0,a.RulePotential)("potential_placeholder_only"):(0,a.RulePotential)("potential_no_label")}}},1382(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_onchange_review=void 0;var a=i(461),n=i(461);t.input_onchange_review={id:"input_onchange_review",context:"dom:input[onchange], dom:textarea[onchange], dom:select[onchange]",refactor:{WCAG20_Input_HasOnchange:{Potential_1:"potential_warning"}},help:{"en-US":{potential_warning:"input_onchange_review.html",group:"input_onchange_review.html"}},messages:{"en-US":{group:"Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs",potential_warning:"Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var r=n.getAttribute("type").toLowerCase();if("hidden"===r||"submit"===r||"image"===r||"button"===r||"reset"===r)return null}return(0,a.RulePotential)("potential_warning")}}},953(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_placeholder_label_visible=void 0;var a=i(461);t.input_placeholder_label_visible={id:"input_placeholder_label_visible",context:"dom:input[placeholder], dom:textarea[placeholder]",refactor:{HAAC_Input_Placeholder:{Pass_0:"Pass_0",Potential_1:"Potential_1",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"input_placeholder_label_visible.html",Potential_1:"input_placeholder_label_visible.html",Potential_2:"input_placeholder_label_visible.html",group:"input_placeholder_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"HTML5 placeholder is the only visible label",Potential_2:"Additional visible label referenced by 'aria-labelledby' is not valid",group:"HTML5 'placeholder' attribute must not be used as a visible label replacement"}},rulesets:[],act:[],run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")){var r=n.getAttribute("type").toLowerCase();if("hidden"==r||"button"==r)return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("hidden")){var l=n.getAttribute("hidden");if(""==l||"hidden"==l.toLowerCase())return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("aria-label"))return(0,a.RulePotential)("Potential_1");if(n.hasAttribute("aria-labelledby")&&n.hasAttribute("id")){var o=n.getAttribute("id").trim();return n.getAttribute("aria-labelledby").trim().split(/\s+/).includes(o)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0")}return(0,a.RulePass)("Pass_0")}}},2222(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_content_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(5279),o=i(1686);t.label_content_exists={id:"label_content_exists",context:"dom:label",refactor:{Valerie_Label_HasContent:{Pass_Regular:"Pass_Regular",Pass_AriaLabel:"Pass_AriaLabel",Pass_LabelledBy:"Pass_LabelledBy",Fail_1:"Fail_1"}},help:{"en-US":{Pass_Regular:"label_content_exists.html",Pass_AriaLabel:"label_content_exists.html",Pass_LabelledBy:"label_content_exists.html",Fail_1:"label_content_exists.html",group:"label_content_exists.html"}},messages:{"en-US":{Pass_Regular:"<label> element has accessible name with inner content",Pass_AriaLabel:"<label> element has accessible name via 'aria-label'",Pass_LabelledBy:"<label> element has accessible name via 'aria-labelledby'",Fail_1:"The <label> element does not have descriptive text that identifies the expected input",group:"A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.hasInnerContentHidden(n))return(0,a.RulePass)("Pass_Regular");if((n.getAttribute("aria-label")||"").trim().length>0)return(0,a.RulePass)("Pass_AriaLabel");if(n.hasAttribute("aria-labelledby")){var s=l.FragmentUtil.getById(n,n.getAttribute("aria-labelledby"));if(s&&!o.DOMUtil.sameNode(s,n)&&r.CommonUtil.hasInnerContent(s))return(0,a.RulePass)("Pass_LabelledBy")}return(0,a.RuleFail)("Fail_1")}}},4678(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_name_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(3946),u=i(4919),d=i(3864);t.label_name_visible={id:"label_name_visible",context:"aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter",refactor:{WCAG21_Label_Accessible:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"label_name_visible.html",Fail_1:"label_name_visible.html",group:"label_name_visible.html"}},messages:{"en-US":{Pass_0:"Accessible name matches or contains the visible label text",Fail_1:"Accessible name does not match or contain the visible label text",group:"Accessible name must match or contain the visible label text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["2.5.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:"2ee8b8",run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;if(u.CSSUtil.isMaterialIconFont(n))return(0,a.RulePass)("Pass_0");var c=!0,m=n.nodeName.toLowerCase(),p=!1,h=null;"input"===m&&n.hasAttribute("type")&&(h=n.getAttribute("type").toLowerCase(),-1!==l.CommonUtil.form_button_types.indexOf(h)&&(p=!0));var g=r.AriaUtil.getAriaAttribute(n,"aria-labelledby");if(!g||l.CommonUtil.isIdReferToSelf(n,g)||p){var b=null;if(g&&!l.CommonUtil.isIdReferToSelf(n,g))for(var _=g.split(/\s+/),f=0;f<_.length;++f){var v=o.FragmentUtil.getById(n,_[f]);if(v){b=l.CommonUtil.getInnerText(v);break}}else b=r.AriaUtil.getAriaAttribute(n,"aria-label");if(!b)return null;var A=null;if(p&&(n.hasAttribute("value")?A=n.getAttribute("value"):"submit"===h?A="submit":"reset"===h&&(A="reset")),!A){var w=l.CommonUtil.getLabelForElementHidden(n,!0);if(!w){var y=d.DOMWalker.parentNode(n);if("label"===y.nodeName.toLowerCase()){var C=y.cloneNode(!0);w=l.CommonUtil.removeAllFormElementsFromLabel(C)}}var k=w||n;A=w||-1===["meter","output","progress","select","textarea"].indexOf(m)?l.CommonUtil.getOnScreenInnerText(k):""}var R=/[^a-zA-Z0-9]/g;A=A.replace(R," ");var x=l.CommonUtil.normalizeSpacing(A).toLowerCase();b=b.replace(R," ");var P=l.CommonUtil.normalizeSpacing(b).toLowerCase();if(x.length>1){var T=P.indexOf(x);if(T>=0&&P.length>x.length){var U=/^[0-9a-zA-Z]+$/;T+x.length<P.length&&P.charAt(T+x.length).match(U)&&(c=!1),c&&T>0&&P.charAt(T-1).match(U)&&(c=!1)}-1===T&&(c=!1)}}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7578(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_ref_valid=void 0;var a=i(461),n=i(461),r=i(5279),l=i(3946);t.label_ref_valid={id:"label_ref_valid",context:"dom:label[for]",refactor:{WCAG20_Label_RefValid:{Pass_0:"pass",Fail_1:"fail_invalid"}},help:{"en-US":{pass:"label_ref_valid.html",fail_invalid:"label_ref_valid.html",group:"label_ref_valid.html"}},messages:{"en-US":{pass:"The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element",fail_invalid:"The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element",group:"The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.getAttribute("for"),s=!1,u=r.FragmentUtil.getById(n,o);if(u){if(!l.VisUtil.isNodeVisible(u)&&!l.VisUtil.isNodeVisible(n))return null;if(s=!0,!u.hasAttribute("role")){var d=u.nodeName.toLowerCase();if(s="input"==d||"select"==d||"textarea"==d||"button"==d||"datalist"==d||"optgroup"==d||"option"==d||"keygen"==d||"output"==d||"progress"==d||"meter"==d||"fieldset"==d||"legend"==d,"input"==u.nodeName.toLowerCase()&&u.hasAttribute("type")){var c=u.getAttribute("type").toLowerCase();s="text"==c||"password"==c||"file"==c||"checkbox"==c||"radio"==c||"hidden"==c||"search"==c||"tel"==c||"url"==c||"email"==c||"date"==c||"number"==c||"range"==c||"image"==c||"time"==c||"color"==c||"datetime-local"==c||"month"==c||"week"==c}}s&&!l.VisUtil.isNodeVisible(u)&&(s=!1)}var m=[];return s||m.push(o),s?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid",m)}}},9964(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_children_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3864);t.list_children_valid={id:"list_children_valid",context:"aria:group",refactor:{HAAC_List_Group_ListItem:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"list_children_valid.html",Fail_1:"list_children_valid.html",group:"list_children_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'List component with "group" role has children that are not <listitem> elements',group:'List component with "group" role must limit children to <listitem> elements'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.DOMWalker.parentElement(n);if(!r.AriaUtil.hasRoleInSemantics(o,"list"))return null;for(var s=!0,u=n.children,d=0;s&&d<u.length;d++)s=r.AriaUtil.hasRoleInSemantics(u[d],"listitem");return s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_markup_review=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=new RegExp(/^[ \t]*[•◦▪▸►✓✗✦\-–—*o][ \t]+\S/.source+"|"+/^[ \t]*(?:\(?\d+[.)]\)?|\(?[a-zA-Z][.)]\)?|\(?(?:i{1,3}|iv|vi{0,3}|ix|xi{0,3}|xiv|xv)[.)]\)?)[ \t]+\S/i.source,"i"),u=new Set(["blockquote","center","dir","div","form","h1","h2","h3","h4","h5","h6","hr","br","menu","p","pre","table","section","article","aside","nav","header","footer","figure","figcaption","details","summary","dialog","script","style","label","ul","ol","dl","li","dt","dd"]),d=new Set(["a","abbr","acronym","b","bdo","big","br","button","cite","code","dfn","em","i","img","input","kbd","label","map","object","output","q","samp","select","small","span","strong","sub","sup","textarea","time","tt","u","var"]);function c(e){var t="";return e.childNodes.forEach(function(e){var i;if(e.nodeType===Node.TEXT_NODE)t+=null!==(i=e.nodeValue)&&void 0!==i?i:"";else if(e.nodeType===Node.ELEMENT_NODE){var a=e.nodeName.toLowerCase();d.has(a)&&(t+=c(e))}}),t.replace(/\s+/g," ")}function m(e){var t=0,i=0,a="";e.childNodes.forEach(function(e){var n,r=e.nodeName.toLowerCase();if("br"===r){var l=a.trim();return l.length>0&&(s.test(l)?t=Math.max(t,++i):i=0),void(a="")}if(e.nodeType!==Node.TEXT_NODE){if(e.nodeType===Node.ELEMENT_NODE){var o=e;if(u.has(r)){var m=a.trim();return m.length>0&&s.test(m)&&(t=Math.max(t,++i)),a="",void(i=0)}d.has(r)?a+=c(o):(i=0,a="")}}else{var p=null!==(n=e.nodeValue)&&void 0!==n?n:"";if(0===p.trim().length)return;p.split(/\r?\n/).forEach(function(e,n){if(n>0){var r=a.trim();r.length>0&&(s.test(r)?t=Math.max(t,++i):i=0),a=""}a+=e})}});var n=a.trim();return n.length>0&&s.test(n)&&(t=Math.max(t,++i)),t}function p(e){for(var t=0,i=0,a=function(e){var t=[];return function e(i){var a;if(i.nodeType===Node.TEXT_NODE)(null!==(a=i.nodeValue)&&void 0!==a?a:"").split(/\r?\n/).forEach(function(e){var i=e.trim();i.length>0&&t.push(i)});else if(i.nodeType===Node.ELEMENT_NODE){var n=i,o=n.nodeName.toLowerCase();if("br"===o)return void t.push("\0");if(u.has(o))return;if(n.getAttribute("role")){var s=r.AriaUtil.getRolesWithTypes(n,["widget"]);if(l.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","rowheader"],s),s.length>0)return}i.childNodes.forEach(e)}}(e),t.filter(function(e){return"\0"!==e})}(e);i<a.length;i++){var n=a[i];if(s.test(n)){if(++t>=2)return!0}else t=0}return!1}t.list_markup_review={id:"list_markup_review",context:"dom:*",refactor:{RPT_List_UseMarkup:{Potential_1:"Potential_1"}},help:{"en-US":{potential_list:"list_markup_review.html",group:"list_markup_review.html"}},messages:{"en-US":{potential_list:"Verify this is a list and if so, modify to use proper HTML elements for the list",group:"Proper HTML elements should be used to create a list"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,s=n.nodeName.toLowerCase();if(l.CommonUtil.isNodeDisabled(n)||o.VisUtil.hiddenByDefaultElements.includes(s))return null;if(null===l.CommonUtil.getAncestor(n,["body"]))return null;if(null!==l.CommonUtil.getAncestor(n,["script","style","label"]))return null;if("td"===s||"th"===s)return m(n)>=2||p(n)?(0,a.RulePotential)("potential_list"):null;var d=r.AriaUtil.getRolesWithTypes(n,["widget"]);return l.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","rowheader"],d),null!==r.AriaUtil.getAncestorWithRoles(n,d)?null:u.has(s)||"body"===s||"li"===s?["ul","ol","dl","menu"].includes(s)?null:m(n)>=2||p(n)?(0,a.RulePotential)("potential_list"):null:null}}},1174(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_structure_proper=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.list_structure_proper={id:"list_structure_proper",context:"dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt",refactor:{RPT_List_Misuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"list_structure_proper.html",Potential_1:"list_structure_proper.html",group:"list_structure_proper.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"List element is missing or improperly structured",group:"List elements should only be used for lists of related items"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node,s=o.nodeName.toLowerCase();if(o.children,"dl"==s){var u="",d="",c=o.firstChild;n=!0;var m=!1;if(o.children&&0!=o.children.length){for(;n&&null!=c;){if(1==c.nodeType){var p=c.nodeName.toLowerCase();if(r.AriaUtil.isPresentationalElement(c)){m=!0,c=c.nextSibling;continue}n="dd"==p||"dt"==p,""==u&&(u=p),d=p}c=c.nextSibling}n=n&&"dt"==u&&"dd"==d||n&&m}else n=!0}else if("li"==s)n=null!=l.CommonUtil.getAncestor(o,["ul","ol","dir","menu"]);else if("dd"==s||"dt"==s)n=null!=l.CommonUtil.getAncestor(o,"dl");else if(c=o.firstChild,"ul"!=s&&"ol"!=s&&"menu"!=s||o.children&&0!=o.children.length){var h=!1;for(m=!1,n=!0;n&&null!=c;)r.AriaUtil.isPresentationalElement(c)?(m=!0,c=c.nextSibling):(n=1!=c.nodeType||"li"==c.nodeName.toLowerCase()||"template"==c.nodeName.toLowerCase()&&("ul"==s||"ol"==s),h=h||1==c.nodeType&&"li"==c.nodeName.toLowerCase(),c=c.nextSibling);n=n&&h||n&&m}else n=!0;return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9907(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.marquee_elem_avoid=void 0;var a=i(461),n=i(461);t.marquee_elem_avoid={id:"marquee_elem_avoid",context:"dom:marquee",refactor:{RPT_Marquee_Trigger:{Fail_1:"Fail_1"}},help:{"en-US":{Fail_1:"marquee_elem_avoid.html",group:"marquee_elem_avoid.html"}},messages:{"en-US":{Fail_1:"Scrolling content found that uses the obsolete <marquee> element",group:"The <marquee> element is obsolete and should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){return e.dom.node,(0,a.RuleFail)("Fail_1")}}},6032(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_brief=void 0;var a=i(461),n=i(461),r=i(3946);t.media_alt_brief={id:"media_alt_brief",context:"dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]",refactor:{RPT_Media_AltBrief:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_brief.html",Potential_1:"media_alt_brief.html",group:"media_alt_brief.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Text alternative is more than 150 characters",group:"Alternative text in 'alt' attribute should be brief (<150 characters)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.getAttribute("alt").trim().length<=150;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},5622(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.media_alt_exists={id:"media_alt_exists",context:"dom:area[alt], dom:embed[alt]",refactor:{RPT_Media_AudioVideoAltFilename:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_exists.html",Potential_1:"media_alt_exists.html",group:"media_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Filename used as label for embedded audio or video",group:"Audio or video on the page must have a short text alternative that describes the media content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o="";null==(o="area"==n.nodeName.toLowerCase()?n.getAttribute("href"):n.getAttribute("src"))&&(o="");var s=r.CommonUtil.getFileExt(o),u=0!=s.length&&(r.CommonUtil.isAudioExt(s)||r.CommonUtil.isVideoExt(s)),d=n.getAttribute("alt"),c=!u||d.length>0&&-1==d.indexOf(s);return c?(0,a.RulePass)("Pass_0"):c?void 0:(0,a.RulePotential)("Potential_1")}}},2240(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_audio_transcribed=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.media_audio_transcribed={id:"media_audio_transcribed",context:"dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object",refactor:{RPT_Media_AudioTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_audio_transcribed.html",group:"media_audio_transcribed.html"}},messages:{"en-US":{Manual_1:"Provide transcripts for audio files",group:"Audio information should also be available in text form"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(o)||(n="bgsound"!=o.nodeName.toLowerCase()&&!r.CommonUtil.isAudioObjEmbedLink(o))?null:n?void 0:(0,a.RuleManual)("Manual_1")}}},4019(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_autostart_controllable=void 0;var a=i(461),n=i(461);t.media_autostart_controllable={id:"media_autostart_controllable",context:"dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound",refactor:{RPT_Embed_AutoStart:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_autostart_controllable.html",Potential_1:"media_autostart_controllable.html",group:"media_autostart_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically",group:"Mechanism must be available to pause or stop and control the volume of the audio that plays automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n,r=e.dom.node,l=r.nodeName.toLowerCase();if("bgsound"==l)n=!1;else if("param"==l){var o="";r.hasAttribute("value")&&(o=r.getAttribute("value").toLowerCase()),n=0==o.indexOf("0;")||!(-1!=o.indexOf("true")||-1!=o.indexOf("1"))}else if("embed"==l){var s;n=!0,r.hasAttribute("flashvars")&&(n=-1==(s=r.getAttribute("flashvars")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1")),n&&r.hasAttribute("src")&&(n=-1==(s=r.getAttribute("src")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1"))}if(n&&r.hasAttribute("autostart")){var u=r.getAttribute("autostart").toLowerCase();n="true"!=u&&"1"!=u}return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},361(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_keyboard_controllable=void 0;var a=i(461),n=i(461),r=i(3946);t.media_keyboard_controllable={id:"media_keyboard_controllable",context:"dom:audio, dom:video",refactor:{HAAC_Audio_Video_Trigger:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"media_keyboard_controllable.html",Manual_1:"media_keyboard_controllable.html",group:"media_keyboard_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify media using <audio> and/or <video> elements have keyboard accessible controls",group:"Media using <audio> and/or <video> elements must have keyboard accessible controls"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=!0,o=n.nodeName.toLowerCase();return"audio"!=o&&"video"!==o||(l=!1),l?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1")}}},5960(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_live_captioned=void 0;var a=i(461),n=i(461),r=i(7139);t.media_live_captioned={id:"media_live_captioned",context:"dom:embed, dom:object",refactor:{RPT_Media_VideoObjectTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_live_captioned.html",group:"media_live_captioned.html"}},messages:{"en-US":{Manual_1:"Verify captions are provided for live media (streaming video with audio)",group:"Live media (streaming video with audio) should have captions for audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!r.CommonUtil.isVideoObjEmbedLink(n);return l?null:l?void 0:(0,a.RuleManual)("Manual_1")}}},5515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_track_available=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.media_track_available={id:"media_track_available",context:"dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object",refactor:{RPT_Media_VideoReferenceTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_track_available.html",group:"media_track_available.html"}},messages:{"en-US":{Manual_1:"Verify availability of a user-selectable audio track with description of visual content",group:"Pre-recorded media should have an audio track that describes visual information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.3","1.2.5"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o;return(o="applet"!=n.nodeName.toLowerCase()&&!r.CommonUtil.isVideoObjEmbedLink(n))?null:o?void 0:(0,a.RuleManual)("Manual_1")}}},8752(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_redirect_optional=void 0;var a=i(461),n=i(461),r=i(4566);t.meta_redirect_optional={id:"meta_redirect_optional",context:"dom:meta[http-equiv][content]",refactor:{WCAG20_Meta_RedirectZero:{pass:"pass",fail:"fail",fail_longrefresh:"fail_longrefresh"}},help:{"en-US":{group:"meta_redirect_optional.html",pass:"meta_redirect_optional.html",fail:"meta_redirect_optional.html",fail_longrefresh:"meta_redirect_optional.html"}},messages:{"en-US":{group:"Page should not automatically refresh without warning or option to turn it off or adjust the time limit",pass:"Rule Passed",fail:"Check page does not automatically refresh without warning or options",fail_longrefresh:"Check page does not automatically refresh without warning or options"}},rulesets:[{id:[],num:["2.2.4","3.2.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bisz58"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var l=n.ownerDocument;if(l){if(r.CacheUtil.getCache(l,"meta_redirect_optional_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(r.CacheUtil.setCache(l,"meta_redirect_optional_done",!0),0===s?(0,a.RulePass)("pass"):s<72001?(0,a.RuleFail)("fail"):(0,a.RuleFail)("fail_longrefresh"))}}}},8834(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_refresh_delay=void 0;var a=i(461),n=i(461),r=i(4566);t.meta_refresh_delay={id:"meta_refresh_delay",context:"dom:meta[http-equiv][content]",refactor:{RPT_Meta_Refresh:{Pass_0:"pass",Potential_1:"potential_refresh"}},help:{"en-US":{group:"meta_refresh_delay.html",pass:"meta_refresh_delay.html",potential_refresh:"meta_refresh_delay.html"}},messages:{"en-US":{group:"Pages should not refresh automatically",pass:"Pages do not refresh automatically",potential_refresh:"Verify page is not being caused to refresh automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bc659a"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var l=n.ownerDocument;if(l){if(r.CacheUtil.getCache(l,"meta_refresh_delay_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(r.CacheUtil.setCache(l,"meta_refresh_delay_done",!0),0===s?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_refresh"))}}}},1025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_viewport_zoomable=void 0;var a=i(461),n=i(461);t.meta_viewport_zoomable={id:"meta_viewport_zoomable",context:"dom:meta[name][content]",refactor:{meta_viewport_zoom:{Pass_0:"pass",Potential_1:"potential_zoomable"}},help:{"en-US":{group:"meta_viewport_zoomable.html",pass:"meta_viewport_zoomable.html",potential_zoomable:"meta_viewport_zoomable.html"}},messages:{"en-US":{group:"The 'meta[name=viewport]' should not prevent the browser zooming the content",pass:"The 'meta[name=viewport]' does not prevent the browser zooming the content",potential_zoomable:"Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{b4f0c3:{pass:"pass",potential_zoomable:"fail"}}],run:function(e,t,i){var n=e.dom.node;if("viewport"!==n.getAttribute("name").toLowerCase())return null;var r=n.getAttribute("content").toLowerCase();if(!r||""===r.trim()||!r.includes("maximum-scale")&&!r.includes("user-scalable"))return null;for(var l=null,o=null,s="yes",u="2.0",d=0,c=r.split(",");d<c.length;d++){var m=c[d],p=m.trim().split("=");p.length<2||(m.includes("user-scalable")?(l=m,((s=p[1].trim()).startsWith("'")||s.startsWith('"'))&&(s=s.substring(1,s.length-1))):m.includes("maximum-scale")&&(o=m,((u=p[1].trim()).startsWith("'")||u.startsWith('"'))&&(u=u.substring(1,u.length-1).trim())))}var h=Number(s);isNaN(h)||(h>=1||h<=-1)&&(s="yes");var g;return h=Number(u),g=isNaN(h)?"yes"===u?1:.1:h<0?2:h,"yes"!==s?(0,a.RulePotential)("potential_zoomable",[l]):g<2?(0,a.RulePotential)("potential_zoomable",[o]):(0,a.RulePass)("pass")}}},9116(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.noembed_content_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.noembed_content_exists={id:"noembed_content_exists",context:"dom:noembed",refactor:{Valerie_Noembed_HasContent:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"noembed_content_exists.html",Potential_1:"noembed_content_exists.html",group:"noembed_content_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Add descriptive text to the <noembed> element",group:"<noembed> elements should contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.CommonUtil.hasInnerContentHidden(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},435(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.object_text_exists=void 0;var a=i(461),n=i(461),r=i(3946),l=i(1950);t.object_text_exists={id:"object_text_exists",context:"dom:object",refactor:{WCAG20_Object_HasText:{pass:"pass",fail_no_text_alternative:"fail_no_text_alternative"}},help:{"en-US":{group:"object_text_exists.html",pass:"object_text_exists.html",fail_no_text_alternative:"object_text_exists.html"}},messages:{"en-US":{group:"<object> element must have a text alternative for the content rendered by the object",pass:"<object> element has a text alternative",fail_no_text_alternative:"An <object> element does not have a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"8fc3b6",run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;if(n.hasAttribute("type")&&-1!==n.getAttribute("type").indexOf("text"))return null;if(n.getAttribute("role"))return null;var o=n.getAttribute("data"),s=o&&"string"==typeof o?o.substring(o.lastIndexOf(".")):"";if(".html"===s||".htm"===s)return null;var u=l.AccNameUtil.computeAccessibleName(n);return u&&u.name&&u.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_text_alternative")}}},6640(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(6858);t.page_title_exists={id:"page_title_exists",context:"dom:html",refactor:{WCAG20_Doc_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"page_title_exists.html",Pass_0:"page_title_exists.html",Fail_1:"page_title_exists.html",Fail_2:"page_title_exists.html",Fail_3:"page_title_exists.html"}},messages:{"en-US":{group:"The page should have a title that correctly identifies the subject of the page",Pass_0:"Rule Passed",Fail_1:"Missing <head> element so there can be no <title> element present",Fail_2:"Missing <title> element in <head> element",Fail_3:"The <title> element is empty (no innerHTML)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"2779a5":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail",Fail_3:"fail"}}],run:function(e,t,i){if(l.AncestorUtil.isFrame(i))return null;for(var n=e.dom.node,o=n.firstChild,s=null;null!=o&&"head"!=o.nodeName.toLowerCase();)o=o.nextSibling;for(var u=n.querySelectorAll("title"),d=0;d<u.length;++d)if(!r.CommonUtil.getAncestor(u[d],["svg"])){s=u[d];break}return null!==o||s?null===s?(0,a.RuleFail)("Fail_2"):null!=s&&r.CommonUtil.getInnerText(s).trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3"):(0,a.RuleFail)("Fail_1")}}},2068(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.page_title_valid={id:"page_title_valid",context:"dom:head dom:title",refactor:{RPT_Title_Valid:{Pass_0:"Pass_0",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"page_title_valid.html",Potential_2:"page_title_valid.html",group:"page_title_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_2:"Verify that using the filename as the page <title> value is descriptive",group:"Page <title> should be a descriptive title, rather than a filename"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getInnerText(n).trim(),o=l.toLowerCase();return o.includes(".com")||o.includes(".net")||o.includes(".org")?(0,a.RulePass)("Pass_0",[l]):0===l.length?null:/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(l)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0",[l])}}},7322(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_focus_blur_review=void 0;var a=i(461),n=i(461);t.script_focus_blur_review={id:"script_focus_blur_review",context:"dom:*[onfocus]",refactor:{WCAG20_Script_FocusBlurs:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_focus_blur_review.html",Potential_1:"script_focus_blur_review.html",group:"script_focus_blur_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify script does not remove focus from content that normally receives focus",group:"Scripting must not remove focus from content that normally receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.7","3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=-1==e.dom.node.getAttribute("onfocus").indexOf(".blur(");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},5702(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_avoid=void 0;var a=i(461),n=i(461),r=i(7139);t.script_onclick_avoid={id:"script_onclick_avoid",context:"dom:*[onclick]",dependencies:["script_onclick_misuse"],refactor:{RPT_Script_OnclickHTML2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_avoid.html",Potential_1:"script_onclick_avoid.html",group:"script_onclick_avoid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that 'onclick' events are not used in script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.getAncestor(n,"svg"))return(0,a.RulePass)("Pass_0");if(r.CommonUtil.attributeNonEmpty(n,"role"))return(0,a.RulePass)("Pass_0");var l=n.nodeName.toLowerCase(),o="a"==l||"area"==l||"input"==l;return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},1961(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_misuse=void 0;var a=i(461),n=i(461),r=i(7139);t.script_onclick_misuse={id:"script_onclick_misuse",context:"dom:*[onclick]",refactor:{RPT_Script_OnclickHTML1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_misuse.html",Potential_1:"script_onclick_misuse.html",group:"script_onclick_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Possible use of a script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.attributeNonEmpty(n,"role"),o=n.nodeName.toLowerCase();if(!(l=l||("a"==o||"area"==o)&&r.CommonUtil.attributeNonEmpty(n,"href"))){var s=[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml","location.href"],u=n.getAttribute("onclick").toLowerCase();l=!0;for(var d=0;l&&d<s.length;++d)l=-1==u.indexOf(s[d])}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},3022(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_select_review=void 0;var a=i(461),n=i(461);t.script_select_review={id:"script_select_review",context:"dom:select",refactor:{WCAG20_Select_NoChangeAction:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_select_review.html",Potential_1:"script_select_review.html",group:"script_select_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that no change of context or action occurs when selection options in this component receive focus",group:"No changes of context should occur when a selection value receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!n.hasAttribute("onchange")&&!n.hasAttribute("onfocus");return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},375(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.select_options_grouped=void 0;var a=i(461),n=i(461),r=i(7139);t.select_options_grouped={id:"select_options_grouped",context:"dom:select",refactor:{WCAG20_Select_HasOptGroup:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"select_options_grouped.html",Potential_1:"select_options_grouped.html",group:"select_options_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Group of related options may need <optgroup>",group:"Groups of related options within a selection list should be grouped with <optgroup>"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getChildByTagHidden(n,"optgroup",!1,!0).length>0||r.CommonUtil.getChildByTagHidden(n,"option",!1,!0).length<=10;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},4658(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_described=void 0;var a=i(461),n=i(461),r=i(7139),l=i(4566),o=i(3946);t.skip_main_described={id:"skip_main_described",context:"dom:body",dependencies:["skip_main_exists"],refactor:{WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"skip_main_described.html",Potential_1:"skip_main_described.html",group:"skip_main_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that if this hyperlink skips content, the description communicates where it links to",group:"The description of a hyperlink used to skip content must communicate where it links to"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s={paramSkipText:{value:["skip","jump"],type:"[string]"}},u=e.dom.node,d=u.ownerDocument;if(null===l.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&l.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",r.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=l.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){var c=d.links;if(c&&c.length>0&&o.VisUtil.isNodeVisible(c[0]))for(var m=r.CommonUtil.getInnerText(d.links[0]).toLowerCase(),p=0;!n&&p<s.paramSkipText.value.length;++p)n=-1!=m.indexOf(s.paramSkipText.value[p]);else n=!1}return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},4605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(6858),o=i(4566),s=i(3946);t.skip_main_exists={id:"skip_main_exists",context:"dom:body",refactor:{WCAG20_Body_FirstASkips_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"skip_main_exists.html",Fail_1:"skip_main_exists.html",group:"skip_main_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)',group:"Pages must provide a way to skip directly to the main content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){if(l.AncestorUtil.isPresentationFrame(i))return null;var n,u=e.dom.node,d=u.ownerDocument;if(null===o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&o.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",r.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){for(var c=r.CommonUtil.getDocElementsByTag(u,"a"),m=null,p=0;p<c.length;++p)if(c[p].hasAttribute("href")&&s.VisUtil.isNodeVisible(c[p])){m=c[p];break}var h=null;if(null!=m){var g=m.getAttribute("href"),b=g.indexOf("#");-1!=b&&(h=g.substring(b+1))}if(null!=h)for(n=null!=d.getElementById(h),p=0;!n&&p<c.length;++p)!c[p].hasAttribute("href")&&c[p].hasAttribute("name")&&c[p].getAttribute("name")==h&&(n=!0)}return n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5294(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_background_decorative=void 0;var a=i(461),n=i(461),r=i(7139);t.style_background_decorative={id:"style_background_decorative",context:"dom:style, dom:*[style]",refactor:{RPT_Style_BackgroundImage:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"style_background_decorative.html",Potential_1:"style_background_decorative.html",group:"style_background_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the CSS background image does not convey important information",group:"Images included by using CSS alone must not convey important information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.nodeName.toLowerCase(),o=!0;if("link"===l&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&(o=r.CommonUtil.triggerOnce(n,"style_background_decorative",!1)),o&&"style"===l||n.hasAttribute("style")){var s=("style"===l?r.CommonUtil.getInnerText(n):n.getAttribute("style")).match(/background:[^;]*/g);if(null!==s)for(var u=0;o&&u<s.length;++u)o=-1===s[u].indexOf("url(")}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3506(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_before_after_review=void 0;var a=i(461),n=i(461),r=i(4919);t.style_before_after_review={id:"style_before_after_review",context:"dom:style, dom:link",refactor:{WCAG20_Style_BeforeAfter:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_before_after_review.html",Pass_0:"style_before_after_review.html",Potential_1:"style_before_after_review.html"}},messages:{"en-US":{group:"Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content",Pass_0:"Rule Passed",Potential_1:"Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content"}},rulesets:[{id:[],num:"1.3.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!0;if("style"===n.nodeName.toLowerCase()){for(var o=r.CSSUtil.getCSSStyle(n),s=0;l&&s<o.length;++s)o[s].selector&&(l=-1===o[s].selector.indexOf(":before")&&-1===o[s].selector.indexOf(":after")||!("content"in o[s].values)||0===o[s].values.content.trim().length||'""'===o[s].values.content.trim()||"''"===o[s].values.content.trim()||"none"===o[s].values.content.trim()||"attr(x)"===o[s].values.content.trim()||"attr(y)"===o[s].values.content.trim());if(l)for(var u=0;u<n.ownerDocument.styleSheets.length;u++)if((_=n.ownerDocument.styleSheets[u]).ownerNode===n)try{var d=_.cssRules?_.cssRules:_.rules;if(d)for(var c=0;l&&c<d.length;c++){var m=d[c],p=void 0;if(m.type&&4===m.type){if(v=m.cssRules)for(var h=0;l&&h<v.length;h++)null!==(w=v[h]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1))}else if(m.type&&3===m.type&&(p=m).styleSheet&&(f=p.styleSheet.cssRules?p.styleSheet.cssRules:p.styleSheet.rules))for(h=0;l&&h<f.length;h++){var g=f[h];if(g.type&&4===g.type){if(v=g.cssRules)for(var b=0;b<v.length;b++)null!==(w=v[b]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1))}else null!==g.selectorText&&void 0!==g.selectorText&&(-1===(C=g.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=g.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1))}}}catch(e){}}if("link"===n.nodeName.toLowerCase()&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&n.hasAttribute("href")&&0!==n.getAttribute("href").trim().length)for(u=0;u<n.ownerDocument.styleSheets.length;u++){var _;if((_=n.ownerDocument.styleSheets[u])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(h=0;l&&h<f.length;h++){var v,A=f[h];if(A.type&&4===A.type){if(v=A.cssRules)for(b=0;l&&b<v.length;b++){var w;if(null!==(w=v[b]).selectorText&&void 0!==w.selectorText){var y=w.selectorText.toLowerCase();-1===y.indexOf(":before")&&-1===y.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1)}}}else if(null!==f[h].selectorText&&void 0!==f[h].selectorText){var C,k;-1===(C=f[h].selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=f[h].style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1)}}}catch(e){}}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},7475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_color_misuse=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3864),o=i(4566);t.style_color_misuse={id:"style_color_misuse",context:"dom:style, dom:*[style], dom:font[color], dom:link",refactor:{RPT_Style_ColorSemantics1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_color_misuse.html",Pass_0:"style_color_misuse.html",Potential_1:"style_color_misuse.html"}},messages:{"en-US":{group:"Combine color and descriptive markup to convey information",Pass_0:"Rule Passed",Potential_1:"Verify color is not used as the only visual means of conveying information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var r=e.dom.node,s=r.nodeName.toLowerCase(),u="";if("style"===s){u=a.CommonUtil.getInnerText(r).toLowerCase();for(var d=0;d<r.ownerDocument.styleSheets.length;d++)if((_=r.ownerDocument.styleSheets[d])&&_.ownerNode===r)try{for(var c=_.cssRules?_.cssRules:_.rules,m=0;m<c.length;m++){var p=c[m],h=void 0;if(p.type&&3===p.type&&(h=p).styleSheet)for(var g=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules,b=0;b<g.length;b++)u+=g[b].cssText}}catch(e){}}else if(r.hasAttribute("style"))u=r.getAttribute("style").toLowerCase();else if("link"===s&&r.hasAttribute("rel")&&"stylesheet"===r.getAttribute("rel").toLowerCase()&&r.hasAttribute("href")&&0!==r.getAttribute("href").trim().length)for(d=0;d<r.ownerDocument.styleSheets.length;d++){var _;if((_=r.ownerDocument.styleSheets[d])&&_.ownerNode===r)try{var f=_.cssRules?_.cssRules:_.rules;for(b=0;b<f.length;b++)u+=f[b].cssText}catch(e){}}var v=!0,A=u.match(/\bbackground\b/i),w=u.replace(/-color/g,"").match(/\bcolor\b/i);if(r.hasAttribute("color")||w||A){var y={em:"",strong:"",cite:"",dfn:"",code:"",samp:"",kbd:"",var:"",abbr:"",acronym:""};if(!(v=s in y||null!==a.CommonUtil.getAncestor(r,y))&&r.hasChildNodes())for(var C=new l.DOMWalker(r);!v&&C.nextNode()&&C.node!==r;)v=C.node.nodeName.toLowerCase()in y}return v||(v=o.CacheUtil.getCache(r.ownerDocument,"style_color_misuse",!1),o.CacheUtil.setCache(r.ownerDocument,"style_color_misuse",!0)),v?(0,n.RulePass)("Pass_0"):v?void 0:(0,n.RulePotential)("Potential_1")}}},8064(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_focus_visible=void 0;var a=i(7139),n=i(461),r=i(461),l=i(4919),o=i(3883);t.style_focus_visible={id:"style_focus_visible",context:"dom:*",refactor:{RPT_Style_HinderFocus1:{Potential_1:"potential_focus_not_visible"}},help:{"en-US":{group:"style_focus_visible.html",potential_focus_not_visible:"style_focus_visible.html",pass_focus_visible:"style_focus_visible.html"}},messages:{"en-US":{group:"The keyboard focus indicator should be visible when default border or outline is modified by CSS",potential_focus_not_visible:"Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'",pass_focus_visible:"The keyboard focus indicator is visible or is not changed from the browser default"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.7",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r={skipNodes:{value:["table"],type:"[string]"},checkParams:{value:["border","border-width","border-style","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","outline","outline-width","outline-color","outline-style"],type:"[string]"}},s=e.dom.node;if(!a.CommonUtil.isTabbable(s)||r.skipNodes.value.includes(s.nodeName.toLowerCase()))return null;var u=l.CSSUtil.getDefinedStylesMultiple(s,null,["",":focus",":focus-visible",":focus-within"]),d=u[""],c=[];c.push(u[":focus"]),c.push(u[":focus-visible"]),c.push(u[":focus-within"]);var m=c[0];if(Object.keys(m).length>0){if(!((d["outline-width"]||d["outline-style"])&&"0px"!==d["outline-width"]&&"none"!==d["outline-style"]||m["outline-style"]&&"none"===m["outline-style"]))return(0,n.RulePass)("pass_focus_visible");var p=!1,h=0;for(var g in m)if(r.checkParams.value.includes(g)){var b=m[g],_=d[g];if(g.includes("style")){if(p="none"===b,_&&"none"!==b&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("width")){if(h++,"initial"===b?b="2px":"thin"===b?b="1px":"medium"===b?b="2px":"thick"===b&&(b="3px"),_&&("initial"===_?_="2px":"thin"===_?_="1px":"medium"===_?_="2px":"thick"===_&&(_="3px")),b=l.CSSUtil.getPixelsFromStyle(b,s),_=l.CSSUtil.getPixelsFromStyle(_,s),0==b||b<=_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("color")){h++;var f=o.ColorUtil.ColorCombo(s);if(null===f)continue;var v=f.bg;if(!v)continue;if("initial"===b&&(b="black"),_&&"initial"===_&&(_="black"),b=o.ColorUtil.Color(b),_=o.ColorUtil.Color(_),null===b||null===_)continue;var A=b.contrastRatio(v),w=_.contrastRatio(v);if(A<3||A<=w)return(0,n.RulePotential)("potential_focus_not_visible")}else if(h++,null!=_&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}if(p&&0===h)return(0,n.RulePotential)("potential_focus_not_visible")}else for(var y in d)if(r.checkParams.value.includes(y)&&"none"!==(_=d[y]))return(0,n.RulePotential)("potential_focus_not_visible");return(0,n.RulePass)("pass_focus_visible")}}},7942(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_highcontrast_visible=void 0;var a=i(461),n=i(461),r=i(4566);t.style_highcontrast_visible={id:"style_highcontrast_visible",context:"dom:style, dom:link, dom:*[style]",refactor:{RPT_Style_Trigger2:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"style_highcontrast_visible.html",Manual_1:"style_highcontrast_visible.html",group:"style_highcontrast_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content",group:"Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.nodeName.toLowerCase();if("link"===l&&(!n.hasAttribute("rel")||"stylesheet"!==n.getAttribute("rel").toLowerCase()))return(0,a.RulePass)("Pass_0");if("style"!==l&&"link"!==l&&n.hasAttribute("style")&&0===n.getAttribute("style").trim().length)return(0,a.RulePass)("Pass_0");var o=r.CacheUtil.getCache(n.ownerDocument,"style_highcontrast_visible",!1);return r.CacheUtil.setCache(n.ownerDocument,"style_highcontrast_visible",!0),o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RuleManual)("Manual_1")}}},2219(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_hover_persistent=void 0;var a=i(461),n=i(461),r=i(7139);t.style_hover_persistent={id:"style_hover_persistent",context:"dom:style, dom:*[style], dom:*",help:{"en-US":{Pass_0:"style_hover_persistent.html",Pass_2:"style_hover_persistent.html",Potential_1:"style_hover_persistent.html",Potential_2:"style_hover_persistent.html",Potential_3:"style_hover_persistent.html",group:"style_hover_persistent.html"}},messages:{"en-US":{Pass_0:"the hover: pseudo-class is not used to display content",Pass_2:"content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element",Potential_1:"Confirm the pointer can be positioned over the displayed element, not just the trigger",Potential_2:"Confirm the pointer can be positioned over all the information displayed on hover",Potential_3:"Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger",group:"The pointer should be able to move over content displayed on hover"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["1.4.13"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!1,l=!1,o=!1,s=e.dom.node;if("style"===s.nodeName.toLowerCase()){r.CommonUtil.getInnerText(s).toLowerCase();for(var u=0;u<s.ownerDocument.styleSheets.length;++u){var d=s.ownerDocument.styleSheets[u];if(d&&d.ownerNode===s)try{for(var c=d.cssRules?d.cssRules:d.rules,m=0;m<c.length;m++){var p="",h=!1,g=!1,b="",_=!1,f=!1,v=!1,A=(c[m],c[m].cssText);if(A.match(/:hover/g)){p=A.split(":")[0];var w=A.substring(A.indexOf("+")+1);if(w=w.trim(),(A.match(/:hover \+/g)||A.match(/:hover\+/g))&&(h=!0,b=w.split(" ")[0]),A.match(/:hover \~/g)||A.match(/:hover\~/g)){g=!0;var y=A.substring(A.indexOf("~")+1);b=(y=y.trim()).split(" ")[0]}if(!h&&!g)return(0,a.RulePass)("Pass_0");if(b&&(I=w.indexOf("display:"))&&"none;"!==w.slice(I+8).trim().split(" ")[0]&&d&&d.ownerNode===s)try{for(var C=d.cssRules?d.cssRules:d.rules,k=0;k<C.length;k++){var R=c[k].cssText,x=b+" {",P=R.trim(),T=P.indexOf(x);if(P.slice(T).trim(),P.match(/margin/g)){if(!o)return o=!0,(0,a.RulePotential)("Potential_3")}else{var U=R.split(":")[0];if((U=U.split(" ")[0])===b&&R.match(/:hover/g)){var I;if(_=!0,I=R.indexOf("display:"))if(f=!0,"none;"!==w.slice(I+8).trim().split(" ")[0]){if(v=!0,""!==p&&h){var E=s.ownerDocument.getElementsByTagName(p.toUpperCase());if(b.toUpperCase()===E[0].nextElementSibling.tagName){n=!0;continue}}else if(h){if(!l){l=!0;break}continue}if(""!==p&&g){E=s.ownerDocument.getElementsByTagName(p.toUpperCase());var N=[],L=E[0].nextElementSibling;do{if(L.tagName!==b.toUpperCase())break;N.push(L)}while(L=L.nextElementSibling);var S=N.length;if(1===S)return(0,a.RulePass)("Pass_2");if(S>1)return(0,a.RulePotential)("Potential_2")}}else{if(h){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}}else{if(h){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}}}else{if(h){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_2");continue}}}}}catch(e){}}}}catch(e){}}}return n?(0,a.RulePass)("Pass_0"):l?(0,a.RulePotential)("Potential_1"):o?(0,a.RulePotential)("Potential_3"):void 0}}},1473(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_viewport_resizable=void 0;var a=i(461),n=i(461);t.style_viewport_resizable={id:"style_viewport_resizable",context:"dom:link, dom:style, dom:*[style]",refactor:{WCAG21_Style_Viewport:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_viewport_resizable.html",Pass_0:"style_viewport_resizable.html",Potential_1:"style_viewport_resizable.html"}},messages:{"en-US":{group:"Text must scale up to 200% without loss of content or functionality",Pass_0:"Rule Passed",Potential_1:"Verify that text sized using viewport units can be resized up to 200%"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.4.4","1.4.10"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!0,l=/\d+(vw|vh|vmin|vmax)/gi,o=n.nodeName.toLowerCase();if("style"===o){for(var s=0;s<n.ownerDocument.styleSheets.length;s++)if((_=n.ownerDocument.styleSheets[s]).ownerNode===n)try{var u=_.cssRules?_.cssRules:_.rules;if(u)for(var d=0;r&&d<u.length;d++){var c=u[d];if(c.type&&1===c.type){var m=c;if(m.style.fontSize){var p=(v=m.style.fontSize.trim()).match(l);v.length&&p&&(r=!1)}}else if(c.type&&3===c.type&&c.styleSheet){var h=c;if(f=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules)for(var g=0;r&&g<f.length;g++){var b=f[g];b.type&&1===b.type&&b.style.fontSize&&(p=(v=b.style.fontSize.trim()).match(l),v.length&&p&&(r=!1))}}}}catch(e){}}else if("link"===o)for(s=0;s<n.ownerDocument.styleSheets.length;s++){var _;if((_=n.ownerDocument.styleSheets[s])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(g=0;r&&g<f.length;g++){var v,A=f[g];if(A.type&&1===A.type&&A.style.fontSize)p=(v=A.style.fontSize.trim()).match(l),v.length&&p&&(r=!1)}}catch(e){}}else{var w=n.getAttribute("style");w&&(p=w.match(/font-size:\s*\d+(vw|vh|vmin|vmax)/gi))&&(r=!1)}return r?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},1912(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.svg_graphics_labelled=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.svg_graphics_labelled={id:"svg_graphics_labelled",context:"dom:svg",help:{"en-US":{group:"svg_graphics_labelled.html",pass:"svg_graphics_labelled.html",fail_acc_name:"svg_graphics_labelled.html"}},messages:{"en-US":{group:"A non-decorative SVG element must have an accessible name",pass:"The SVG element has an accessible name",fail_acc_name:"The SVG element has no accessible name"}},rulesets:[{id:["IBM_Accessibility","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"7d6734":{pass:"pass",fail_acc_name:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n)||l.VisUtil.isNodePresentational(n)||r.AccNameUtil.isAccessibleNameIgnorable(n))return null;var o=r.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},6539(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_aria_descendants=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.table_aria_descendants={id:"table_aria_descendants",context:"aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]",help:{"en-US":{group:"table_aria_descendants.html",explicit_role:"table_aria_descendants.html"}},messages:{"en-US":{group:"Table structure elements cannot specify an explicit 'role' within table containers",explicit_role:"An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CommonUtil.isTableDescendant(i);if(null!==o&&0!==o.length){var s=r.AriaUtil.getImplicitRole(n),u=r.AriaUtil.getRoles(n,!1);if(!(s&&s.length>0&&u&&u.length>0&&u.some(function(e){return s.includes(e)})))return(0,a.RuleFail)("explicit_role",[e.dom.node.nodeName.toLowerCase(),o[0].role])}}}},4(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_empty=void 0;var a=i(461),n=i(461),r=i(7139);t.table_caption_empty={id:"table_caption_empty",context:"dom:caption",refactor:{Valerie_Caption_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_empty.html",Fail_1:"table_caption_empty.html",group:"table_caption_empty.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <table> element has an empty <caption> element",group:"A <caption> element for a <table> element must contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5334(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_nested=void 0;var a=i(461),n=i(461),r=i(7139);t.table_caption_nested={id:"table_caption_nested",context:"dom:caption",refactor:{Valerie_Caption_InTable:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_nested.html",Fail_1:"table_caption_nested.html",group:"table_caption_nested.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<caption> element is not nested inside a <table> element",group:"The <caption> element must be nested inside the associated <table> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return null!=r.CommonUtil.getAncestor(n,"table")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_exists=void 0;var a=i(461),n=i(461),r=i(9196);t.table_headers_exists={id:"table_headers_exists",context:"dom:table",refactor:{RPT_Table_DataHeadingsAria:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_exists.html",Fail_1:"table_headers_exists.html",group:"table_headers_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Table has no headers identified",group:"Data table must identify headers"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.rows;if(!r.TableUtil.isDataTable(n)||null===l||0===l.length)return null;var o=r.TableUtil.tableHeaderExists(n);return null!==o?o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):void 0}}},8349(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_ref_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(1686),s=i(3946),u=i(9955);t.table_headers_ref_valid={id:"table_headers_ref_valid",context:"dom:td[headers], dom:th[headers]",help:{"en-US":{Pass_0:"table_headers_ref_valid.html",Fail_1:"table_headers_ref_valid.html",Fail_2:"table_headers_ref_valid.html",Fail_3:"table_headers_ref_valid.html",Fail_4:"table_headers_ref_valid.html",group:"table_headers_ref_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document",Fail_2:"The 'headers' attribute value \"{0}\" refers to itself",Fail_3:"The 'headers' attribute value \"{0}\" does not refer to a cell in the same table",Fail_4:'The \'headers\' attribute value "{0}" does not refer to a cell indicated with <th> or a role of "columnheader" or "rowheader"',group:"The 'headers' attribute should refer to a valid cell in the same table"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["a25f45"],run:function(e,t,i){var n=e.dom.node,d=l.CommonUtil.getAncestor(n,"table"),c=u.ARIAMapper.nodeToRole(d);if(null==d||!s.VisUtil.isNodeVisible(d)||!["table","grid"].includes(c))return null;n.nodeName.toLowerCase();var m=n.ownerDocument,p=n.getAttribute("headers");if(!p)return null;for(var h=p.split(" "),g=[],b=[],_=[],f=[],v=0;v<h.length;v++){var A=h[v];if(""!==A.trim()){var w=m.getElementById(A);if(w)if(o.DOMUtil.sameNode(w,n))b.push(A);else if(o.DOMUtil.isInSameTable(w,n)){if("th"!==w.nodeName.toLowerCase()){var y=r.AriaUtil.getRoles(w,!0);y.includes("columnheader")||y.includes("rowheader")||f.push(A)}}else _.push(A);else g.push(A)}}var C=[];return 0!=g.length&&C.push((0,a.RuleFail)("Fail_1",[g.toString()])),0!=b.length&&C.push((0,a.RuleFail)("Fail_2",[b.toString()])),0!=_.length&&C.push((0,a.RuleFail)("Fail_3",[_.toString()])),0!=f.length&&C.push((0,a.RuleFail)("Fail_4",[f.toString()])),0==C.length?(0,a.RulePass)("Pass_0"):C}}},8142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_related=void 0;var a=i(461),n=i(461),r=i(7139),l=i(4566),o=i(9196);t.table_headers_related={id:"table_headers_related",context:"dom:td, dom:th",refactor:{Valerie_Table_DataCellRelationships:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_related.html",Fail_1:"table_headers_related.html",group:"table_headers_related.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Complex table does not have headers for each cell properly defined with 'header' or 'scope'",group:"For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.CommonUtil.getAncestor(n,"table");if(null==s||!o.TableUtil.isComplexDataTable(s))return null;if(null===l.CacheUtil.getCache(n,"table_headers_related",null)){for(var u=[],d=0;d<s.rows.length;++d){var c=s.rows[d];u[d]||(u[d]=[]);for(var m=0;m<c.cells.length;++m){var p=c.cells[m];l.CacheUtil.setCache(p,"table_headers_related",d+":"+m);var h=parseInt(p.getAttribute("colspan"));h||(h=1);var g=parseInt(p.getAttribute("rowspan"));g||(g=1);for(var b=0;u[d][b];)b+=1;for(var _=0;_<g;++_){u[d+_]||(u[d+_]=[]);for(var f=0;f<h;++f)u[d+_][b+f]=p}}}var v=n.ownerDocument,A={},w={};for(d=0;d<u.length;++d){var y=!1;for(m=0;m<u[d].length;++m){var C=u[d][m],k=C.nodeName.toLowerCase();if("th"==k){if("row"==C.getAttribute("scope")?(y=!0,r.CommonUtil.attributeNonEmpty(C,"axis")||(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0)):"rowgroup"==C.getAttribute("scope")?r.CommonUtil.attributeNonEmpty(C,"axis")||(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0):"col"==C.getAttribute("scope")&&(w[m]=!0,r.CommonUtil.attributeNonEmpty(C,"axis")||(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0)),r.CommonUtil.attributeNonEmpty(C,"headers")){var R=C.getAttribute("headers").split(" ");for(_=0;_<R.length;++_)(x=v.getElementById(R[_].trim()))&&r.CommonUtil.getAncestor(x,"table")==s&&(A[l.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}else if("td"==k)if(y||w[m])A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0;else if(r.CommonUtil.attributeNonEmpty(C,"headers"))for(R=C.getAttribute("headers").split(" "),_=0;_<R.length;++_){var x;(x=v.getElementById(R[_].trim()))&&r.CommonUtil.getAncestor(x,"table")==s&&(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0,A[l.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}}l.CacheUtil.setCache(s,"table_headers_related",A)}var P=l.CacheUtil.getCache(n,"table_headers_related",null),T=l.CacheUtil.getCache(s,"table_headers_related",null),U=P&&T&&P in T;return U||"0:0"!==P||0!=r.CommonUtil.getInnerText(n).trim().length?(U||0!=s.getElementsByTagName("th").length||(!0===l.CacheUtil.getCache(s,"table_headers_related_TrigOnce",!1)?U=!0:l.CacheUtil.setCache(s,"table_headers_related_TrigOnce",!0)),U?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")):null}}},3980(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_layout_linearized=void 0;var a=i(461),n=i(461),r=i(3946),l=i(9196);t.table_layout_linearized={id:"table_layout_linearized",context:"dom:table",refactor:{RPT_Table_LayoutTrigger:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"table_layout_linearized.html",Potential_1:"table_layout_linearized.html",group:"table_layout_linearized.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify table is not being used to format text content in columns unless the table can be linearized",group:"Avoid using tables to format text documents in columns unless the table can be linearized"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=!l.TableUtil.isLayoutTable(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},4701(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_scope_valid=void 0;var a=i(461),n=i(461);t.table_scope_valid={id:"table_scope_valid",context:"dom:td[scope], dom:th[scope]",refactor:{WCAG20_Table_Scope_Valid:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"table_scope_valid.html",Fail_1:"table_scope_valid.html",Fail_2:"table_scope_valid.html",group:"table_scope_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Value provided is invalid for the 'scope' attribute",Fail_2:"The 'scope' attribute should only be used on a <th> element",group:'Value for \'scope\' attribute must be "row", "col", "rowgroup", or "colgroup"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("td"===n.nodeName.toLowerCase())return(0,a.RuleFail)("Fail_2");var r=n.getAttribute("scope").trim().toLowerCase();return/^(row|col|rowgroup|colgroup)$/.test(r)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},18(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_structure_misuse=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=i(9196);t.table_structure_misuse={id:"table_structure_misuse",context:"dom:table",refactor:{WCAG20_Table_Structure:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_structure_misuse.html",Fail_1:"table_structure_misuse.html",group:"table_structure_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The <{0}> element with "presentation" role or "none" role has structural element(s) and/or attribute(s) \'{1}\'',group:'Table elements with \'role="presentation" or \'role="none" should not have structural elements or attributes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;if(s.TableUtil.isDataTable(n))return null;if(r.AriaUtil.isNodeInGrid(n))return null;var u=[];l.CommonUtil.attributeNonEmpty(n,"summary")&&u.push(n);for(var d=n.getElementsByTagName("caption"),c=0;c<d.length;++c)if(l.CommonUtil.getAncestor(d[c],"table")==n){if(l.CommonUtil.shouldNodeBeSkippedHidden(d[c]))continue;u.push(d[c]);break}var m=n.getElementsByTagName("th");for(c=0;c<m.length;++c)if(l.CommonUtil.getAncestor(m[c],"table")==n){if(l.CommonUtil.shouldNodeBeSkippedHidden(m[c]))continue;u.push(m[c]);break}var p=n.getElementsByTagName("td");for(c=0;c<p.length;++c)if((p[c].hasAttribute("scope")||p[c].hasAttribute("headers"))&&l.CommonUtil.getAncestor(p[c],"table")==n){if(l.CommonUtil.shouldNodeBeSkippedHidden(p[c]))continue;u.push(p[c]);break}var h=n.nodeName.toLowerCase(),g=new Array,b={};for(c=0;c<u.length;c++){var _=u[c].nodeName.toLowerCase();b.hasOwnProperty(_)||("table"!=_||b.hasOwnProperty.summary?(b[_]=!0,g.push(_)):(b.summary=!0,g.push("summary")))}var f=g.join(", ");return 0==u.length?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[h,f])}}},9314(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_summary_redundant=void 0;var a=i(461),n=i(461),r=i(7139),l=i(5279),o=i(1686);t.table_summary_redundant={id:"table_summary_redundant",context:"dom:table",refactor:{WCAG20_Table_CapSummRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_summary_redundant.html",Fail_1:"table_summary_redundant.html",group:"table_summary_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The table summary duplicates the caption",group:"The table summary must not duplicate the caption"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s=e.dom.node;if(s.hasAttribute("summary"))n=s.getAttribute("summary").trim().toLowerCase();else if(s.hasAttribute("aria-describedby")){for(var u=s.getAttribute("aria-describedby").split(" "),d="",c=0;c<u.length;c++){var m=u[c];if(m){var p=l.FragmentUtil.getById(s,m);p&&!o.DOMUtil.sameNode(p,s)&&(d+=" "+r.CommonUtil.getInnerText(p).trim().toLowerCase())}}n=d}if(!n)return null;var h=s.getElementsByTagName("caption");if(0===h.length)return null;if(n.length>0){var g=r.CommonUtil.getInnerText(h[0]).trim().toLowerCase();return n.includes(g)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0")}}}},1667(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.target_spacing_sufficient=void 0;var a=i(7139),n=i(461),r=i(461),l=i(7507),o=i(4919),s=i(4566);t.target_spacing_sufficient={id:"target_spacing_sufficient",context:"dom:*",dependencies:[],help:{"en-US":{group:"target_spacing_sufficient.html",pass_spacing:"target_spacing_sufficient.html",pass_sized:"target_spacing_sufficient.html",pass_inline:"target_spacing_sufficient.html",pass_default:"target_spacing_sufficient.html",violation_spacing:"target_spacing_sufficient.html",recommendation_inline:"target_spacing_sufficient.html",potential_overlap:"target_spacing_sufficient.html"}},messages:{"en-US":{group:"The target must be sufficiently sized or spaced from other targets",pass_spacing:"The target's spacing from other targets is sufficient",pass_sized:"The target’s size is more than 24 CSS pixels",pass_inline:"The target is in a sentence or its size is otherwise constrained by the line-height of non-target text",pass_default:"The target's size is determined by the user agent and is not modified by the author",violation_spacing:'Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"',recommendation_inline:'Confirm the inline target "{0}" is sufficiently spaced from another inline target "{1}"',potential_overlap:'Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE,reasonCodes:["pass_spacing","pass_sized","pass_inline","pass_default","violation_spacing","potential_overlap"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:r.eRulePolicy.RECOMMENDATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE,reasonCodes:["recommendation_inline"]}],act:[],run:function(e,t,i){var r=e.dom.node,u=r.nodeName.toLocaleLowerCase(),d=new l.DOMMapper,c=d.getUnadjustedBounds(r);if(!c)return null;if(!a.CommonUtil.isTarget(r))return null;if(c.height>=24&&c.width>=24)return(0,n.RulePass)("pass_sized");var m=o.CSSUtil.getInlineStatus(r);if(null===m)return null;if(m.inline)return m.text?null===m.violation?(0,n.RulePass)("pass_inline"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]):null===m.violation?(0,n.RulePass)("pass_default"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]);if(o.CSSUtil.isTargetBrowserDefault(r))return(0,n.RulePass)("pass_default");var p=r.ownerDocument;if(!p)return null;var h=getComputedStyle(r);if(null===h)return null;var g=h.zIndex;g&&!isNaN(Number(g))||(g="0");var b=s.CacheUtil.getCache(p.documentElement,"target_spacing_sufficient::targets",void 0);if(void 0===b){b=[];for(var _=p.querySelectorAll("body *:not(script):not(style)"),f=0;f<_.length;f++){var v=_[f];a.CommonUtil.isTarget(v)&&b.push(v)}s.CacheUtil.setCache(p.documentElement,"target_spacing_sufficient::targets",b)}if(b&&0!==b.length){var A=!0,w=24,y=24,C=null,k=null,R=[],x=function(e){var t=b[e],i=r.compareDocumentPosition(t);if(0===i||i&Node.DOCUMENT_POSITION_CONTAINED_BY)return A=!1,"continue";if(i&Node.DOCUMENT_POSITION_CONTAINS||R.some(function(e){return e.contains(t)}))return"continue";var a=d.getUnadjustedBounds(t);if(!a)return"continue";var l=getComputedStyle(t),o="0";if(l&&((o=l.zIndex)&&!isNaN(Number(o))||(o="0")),a.top<=c.top&&a.left<=c.left&&a.top+a.height>=c.top+c.height&&a.left+a.width>=c.left+c.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:null}:{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};if(c.top<=a.top&&c.left<=a.left&&c.top+c.height>=a.top+a.height&&c.left+c.width>=a.left+a.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])}:{value:(0,n.RuleFail)("violation_spacing",[u,t.nodeName.toLowerCase()])};if((c.top>=a.top&&c.top<=a.top+a.height||c.top+c.height<=a.top&&c.top+c.height>=a.top+a.height)&&(c.left>a.left&&c.left<a.left+a.width||a.left>c.left&&a.left<c.left+c.width)||(c.top>a.top&&c.top<a.top+a.height||a.top>c.top&&a.top<c.top+c.height)&&(c.left>=a.left&&c.left<=a.left+a.width||c.left+c.width>=a.left&&c.left+c.width<=a.left+a.width))return{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};var s=24,m=24;c.width<24&&(c.top>=a.top&&c.top<=a.top+a.height||c.top<=a.top&&c.top+c.height>a.top)&&(s=Math.min(Math.abs(c.left-a.left),Math.abs(c.left-(a.left+a.width)),Math.abs(c.left+c.width-(a.left+a.width)),Math.abs(c.left+c.width-a.left))),c.height<24&&(c.left>=a.left&&c.left<=a.left+a.width||c.left<=a.left&&c.left+c.width>a.left)&&(m=Math.min(Math.abs(c.top-a.top),Math.abs(c.top-(a.top+a.height)),Math.abs(c.top+c.height-(a.top+a.height)),Math.abs(c.top+c.height-a.top))),s<w&&(w=s,C=t),m<y&&(y=m,k=t),R.push(t)};for(f=0;f<b.length;f++){var P=x(f);if("object"==typeof P)return P.value}return Math.round(c.width/2)+w<12||Math.round(c.height/2)+y<12?Math.round(c.width/2)+w<Math.round(c.height/2)+y?(0,n.RuleFail)("violation_spacing",[u,C.nodeName.toLowerCase()]):(0,n.RuleFail)("violation_spacing",[u,k.nodeName.toLowerCase()]):(0,n.RulePass)("pass_spacing")}}}},9599(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_block_heading=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3864),s=i(4919),u=i(3946);t.text_block_heading={id:"text_block_heading",context:"dom:p, dom:div, dom:br",refactor:{RPT_Block_ShouldBeHeading:{Potential_1:"potential_heading"}},help:{"en-US":{potential_heading:"text_block_heading.html",group:"text_block_heading.html"}},messages:{"en-US":{potential_heading:"Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role",group:"Heading text should use a heading element or role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.isNodeDisabled(n)||!u.VisUtil.isNodeVisible(n))return null;if(null===l.CommonUtil.getAncestor(n,["body"])||null!==l.CommonUtil.getAncestor(n,["script"]))return null;var d=0,c=n.ownerDocument.getElementsByTagName("body");if(null!=c){var m=getComputedStyle(c[0]);m&&(d=s.CSSUtil.getPixelsFromStyle(m["font-size"],c))}var p=0,h=[],g=new o.DOMWalker(n);g.nextNode();for(var b=!1;!b&&g.nextNode()&&g.node!==n&&g.node!==o.DOMWalker.parentNode(n)&&!["br","div","p"].includes(g.node.nodeName.toLowerCase());)if(g.node!==n&&!l.CommonUtil.shouldNodeBeSkippedHidden(g.node)){var _=g.node.nodeName.toLowerCase();if(3===g.node.nodeType){if(g.node.nodeValue.trim().length>0&&g.node.parentElement){var f=getComputedStyle(g.node.parentElement);if(f&&("bold"===f["font-weight"]||f["font-weight"]>=700||f["font-size"]&&f["font-size"].includes("large")||f["font-size"]&&0!==d&&s.CSSUtil.getPixelsFromStyle(f["font-size"],g.node.parentElement)>d)){var v=g.node.nodeValue.trim();(A=l.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else b=!0}}else if(1===g.node.nodeType)if("b"===_||"strong"===_||"u"===_||"font"===_){var A;v=l.CommonUtil.getInnerText(g.node),(A=l.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else{var w=r.AriaUtil.getResolvedRole(g.node);b=null!==w&&"generic"!==w&&"paragraph"!==w&&"strong"!==w||"applet"===_}}return 0==p&&(b=!0),b||(b=/[:,;\-\.]$/.test(h.join(" ").trim())),b?null:(0,a.RulePotential)("potential_heading",[h.join(" ")])}}},4672(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_contrast_sufficient=void 0;var a=i(7139),n=i(3946),r=i(3883),l=i(461),o=i(461),s=i(4919);t.text_contrast_sufficient={id:"text_contrast_sufficient",context:"dom:*",refactor:{IBMA_Color_Contrast_WCAG2AA:{Pass_0:"pass",Fail_1:"fail_contrast",Potential_1:"potential_same_color"},IBMA_Color_Contrast_WCAG2AA_PV:{pass_0:"pass",potential_1:"potential_graphic_background"}},help:{"en-US":{group:"text_contrast_sufficient.html",pass:"text_contrast_sufficient.html",fail_contrast:"text_contrast_sufficient.html",potential_same_color:"text_contrast_sufficient.html",potential_graphic_background:"text_contrast_sufficient.html",potential_text_shadow:"text_contrast_sufficient.html"}},messages:{"en-US":{group:"The contrast ratio of text with its background must meet WCAG AA requirements",pass:"The contrast ratio of text with its background meets WCAG AA requirements",fail_contrast:"Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_same_color:"The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast",potential_graphic_background:"Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_text_shadow:"Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.3",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:["afw4f7"],run:function(e,t,i){var o=e.dom.node,u=o.nodeName.toLowerCase();if(!n.VisUtil.isNodeVisible(o)||null!=n.VisUtil.hiddenByDefaultElements&&null!=n.VisUtil.hiddenByDefaultElements&&n.VisUtil.hiddenByDefaultElements.indexOf(u)>-1)return null;if(a.CommonUtil.isNodeDisabled(o))return null;if(a.CommonUtil.getAncestor(o,["svg","script","meta","style"]))return null;var d=o.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=a.CommonUtil.getNodeText(o);if(!a.CommonUtil.isShadowHostElement(o)||a.CommonUtil.isShadowHostElement(o)&&""===a.CommonUtil.getNodeText(o.shadowRoot)){if(0==m.trim().length)return null;if(0===(m=m.trim().replace(/[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g,"")).trim().length)return null}var p=o;if(a.CommonUtil.isShadowHostElement(o)){if(o.shadowRoot)for(var h=o.firstChild;h;h=h.nextSibling)if(3==h.nodeType){p=h.assignedSlot;break}if(null===p)return}var g=c.getComputedStyle(p);if(!1==("0"!==g.width&&"0"!==g.height&&"0"!==g.opacity&&"none"!==g.display&&"hidden"!==g.visibility&&"hidden"!==g.overflow&&("auto"===g.left||"absolute"===g.position&&parseInt(g.left.replace(/[^0-9.+-]/,""))>0)&&("auto"===g.left||"absolute"===g.position&&parseInt(g.top.replace(/[^0-9.+-]/,""))>0)))return null;var b=-1;if("auto"!==g.clip){var _=g.clip.toString();if(_.includes("rect"))for(var f=[],v=/\((.*)\)/g.exec(_)[1].split(", "),A=0;A<v.length;A++)f.push(v[A]);b=parseInt(f[0].replace(/px/g,""))-parseInt(f[2].replace(/px/g,"")),b=Math.abs(b)}if("absolute"===g.position&&b<7&&-1!==b)return null;var w=r.ColorUtil.ColorCombo(p);if(null!==w){var y=w.fg,C=w.bg,k=y.contrastRatio(C),R=s.CSSUtil.getWeightNumber(g.fontWeight),x=s.CSSUtil.getFontInPixels(g.fontSize,p),P=x>=24||x>=18.6&&R>=700;s.CSSUtil.containsCKJ(m)&&(P=x>=29.3||x>=24&&R>=700);var T=k>=4.5||k>=3&&P,U=w.hasBGImage||w.hasGradient,I=w.textShadow,E=a.CommonUtil.isNodeDisabled(p);if(!E){var N=a.CommonUtil.getControlOfLabel(p);N&&(E=a.CommonUtil.isNodeDisabled(N))}return!E&&"label"===u&&a.CommonUtil.isDisabledByFirstChildFormElement(p)&&(E=!0),!E&&o.hasAttribute("id")&&a.CommonUtil.isDisabledByReferringElement(p)&&(E=!0),!T&&E&&(T=!0),T?(0,l.RulePass)("pass",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):U?(0,l.RulePotential)("potential_graphic_background",[k.toFixed(2),x,R]):I?(0,l.RulePotential)("potential_text_shadow",[k.toFixed(2),x,R]):y.toHex()===C.toHex()?(0,l.RulePotential)("potential_same_color",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):(0,l.RuleFail)("fail_contrast",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient])}console.log("unable to get color combo for element: "+p.nodeName)}}},4353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_quoted_correctly=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.text_quoted_correctly={id:"text_quoted_correctly",context:"dom:*",help:{"en-US":{Pass_0:"text_quoted_correctly.html",Potential_1:"text_quoted_correctly.html",group:"text_quoted_correctly.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}",group:"Quotations should be marked with <q> or <blockquote> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!l.VisUtil.isNodeVisible(n))return null;if(null===r.CommonUtil.getAncestor(n,["body"]))return null;for(var o=!0,s=n.firstChild,u=null,d=["blockquote","q","script","style","pre","code","ruby","samp"];o&&s;){if("#text"===s.nodeName){var c=s.nodeValue,m=(c=c.replace(/(\S)'(\S)/g,"$1$2")).match(/("[^"]+")/g),p=c.match(/('[^']+')/g);if((null!==m||null!==p)&&null===r.CommonUtil.getAncestor(s,d)){if(null!=m)for(var h=0;o&&h<m.length;++h)o=r.CommonUtil.wordCount(m[h])<3;if(null!=p)for(h=0;o&&h<p.length;++h)o=r.CommonUtil.wordCount(p[h])<3;u=null===m?p.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):null===p?m.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):m.concat(p).join(", ").replace(new RegExp("\\r?\\n|\\r","g"),"")}}s=s.nextSibling}return!o&&u.length&&u.length>69&&(u=u.substring(0,32)+" ... "+u.substring(u.length-32)),o?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1",[u])}}},7147(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_sensory_misuse=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(4566),s=i(3946);t.text_sensory_misuse={id:"text_sensory_misuse",context:"dom:body, dom:body dom:*",refactor:{RPT_Text_SensoryReference:{Potential_1:"potential_position, potential_other"}},help:{"en-US":{potential_position:"text_sensory_misuse.html",potential_other:"text_sensory_misuse.html",group:"text_sensory_misuse.html"}},messages:{"en-US":{potential_position:"Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position",potential_other:"Confirm the user instruction is still understandable without the word(s) '{0}'",group:"Instructions should be meaningful without relying solely on shape, size, or location words"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if(!s.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n)||s.VisUtil.hiddenByDefaultElements.includes(c))return null;if(null===l.CommonUtil.getAncestor(n,["body"]))return null;if(null!==l.CommonUtil.getAncestor(n,["script","a","label"]))return null;var m=r.AriaUtil.getResolvedRole(n);if(m){var p=r.AriaUtil.getRolesWithTypes(n,["landmark"]);if(p&&p.includes(m))return null}var h=r.AriaUtil.getRolesWithTypes(n,["widget","heading"]);if(l.CommonUtil.concatUniqueArrayItemList(["caption","cell","code","columnheader","definition","figure","list","listitem","math","meter","row","rowgroup","rowheader","term"],h),null!==r.AriaUtil.getAncestorWithRoles(n,h))return null;for(var g="",b="",_=n.firstChild,f="";_;){if("#text"===_.nodeName){var v=_.nodeValue.trim();v.length>0&&(f+=f.length>0?", "+v:v)}_=_.nextSibling}if(f.length>0){var A=function(e,t){if(!u[t])return"";var i=o.CacheUtil.getCache(e,t+"_sensory_misuse",null);if(null==i){for(var a=u[t].value,n="(ss+|"+a[0],r=1;r<a.length;++r){var l=a[r].trim().split(" ");if(n+="|"+l[0],l.length>1)for(var s=1;s<l.length;++s)n+=" +"+l[s]}n+=")",i=new RegExp(n,"gi"),o.CacheUtil.setCache(e,t+"_sensory_misuse",i)}return i}(n.ownerDocument,"exemptText");f=f.replace(A," "),g=d(n.ownerDocument,"positionText",f),b=d(n.ownerDocument,"otherText",f)}var w=[];return g&&w.push((0,a.RulePotential)("potential_position",[g])),b&&w.push((0,a.RulePotential)("potential_other",[b])),0==w.length?null:w}};var u={positionText:{value:["top-left","top-right","bottom-right","bottom-left","top-to-bottom","left-to-right","bottom-to-top","right-to-left","right","left","above","below","top","bottom","upper","lower","corner","beside"],type:"[string]"},otherText:{value:["round","square","shape","rectangle","triangle","size","large","small","medium","big","huge","tiny","extra","larger","smaller","bigger","little","largest","smallest","biggest"],type:"[string]"},exemptText:{value:["right-click","left-click","right-clicking","right-clicks","left-clicking","left-clicks","square root","right now","off the top"],type:"[string]"}};function d(e,t,i){if(!i)return"";var a=u[t].value,n={},r=[];return i.split(/\s+/).reduce(function(e,t){for(var i=t.replace(/[.?!:;()'",`\]]+$/,""),l=t.toLowerCase().replace(/[.?!:;()'",`\]]/g,""),o=0;o<a.length;o++){var s=l.indexOf(a[o]),u=a[o].length,d=l.charAt(u+s);if(!(s<0)){var c="."==d||"?"==d||"!"==d||":"==d||";"==d||"("==d||")"==d||"'"==d||'"'==d||","==d||".`"==d||"\\"==d||"]"==d,m=!1;if(s>0){var p=l.charAt(s-1);m="-"==p||"."==p||"?"==p||"!"==p||":"==p||";"==p||"("==p||")"==p||"'"==p||'"'==p||","==p||".`"==p||"\\"==p||"]"==p}l.length!=u&&1!=c&&1!=m||(n.hasOwnProperty(i)||(n[i]=!0,r.push(i)),o=a.length)}}return e[i]=(e[i]||0)+1,e},Object.create(null)),r.join(", ")}},1419(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_spacing_valid=void 0;var a=i(461),n=i(7139),r=i(3946),l=i(4919),o=i(7507),s=/(-?[\d.]+)([a-z%]*)/;function u(e,t,i){var a;if(i.startsWith("inherit")||i.startsWith("unset")){var n=l.CSSUtil.getAncestorWithStyles(e.parentElement,((a={})[t]=["*"],a),["inherit","unset"]);if(null!==n)return l.CSSUtil.getDefinedStyles(n,[t])[t];if(i.startsWith("unset"))return"initial"}return i}function d(e,t,i,a,n,r){if(void 0===r&&(r=!1),"important"!==e.style.getPropertyPriority(t))return!0;var o=function(e){return e.substring(0,e.length-11)}(i);if("initial"===o||"normal"===o)return!1;var u=parseFloat(o);if(isNaN(u))return!0;var d=o.trim().match(s);if(!d)return!0;var c=d[1],m=d[2];if(""===m){if(r)return!(parseFloat(c)<n);if(0===parseFloat(c))return null}if(""===m&&0!==parseFloat(c))return null;var p=l.CSSUtil.convertValue2Pixels(m,c,e);return!(null!==p&&p/a<n)}t.text_spacing_valid={id:"text_spacing_valid",context:"dom:*",help:{"en-US":{pass:"text_spacing_valid.html",group:"text_spacing_valid.html",fail_letter_spacing_style:"text_spacing_valid.html",fail_word_spacing_style:"text_spacing_valid.html",fail_line_height_style:"text_spacing_valid.html"}},messages:{"en-US":{pass:"CSS !important is not used in inline style to control letter or word spacing or line height",group:"CSS !important should not be used in inline style to control letter or word spacing or line height",fail_letter_spacing_style:"CSS !important should not be used in inline ‘letter-spacing’ style",fail_word_spacing_style:"CSS !important should not be used in inline ‘word-spacing’ style",fail_line_height_style:"CSS !important should not be used in inline ‘line-height’ style"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.12"],level:a.eRulePolicy.VIOLATION,toolkitLevel:a.eToolkitLevel.LEVEL_THREE}],act:["9e45ec","24afc2","78fd32"],run:function(e,t,i){for(var c=e.dom.node,m="",p=c.childNodes,h=0;h<p.length;++h)3===p[h].nodeType&&(m+=p[h].nodeValue);if(0===m.trim().length)return null;if(r.VisUtil.isNodeHiddenFromAT(c)||n.CommonUtil.isNodeDisabled(c))return null;var g=(new o.DOMMapper).getUnadjustedBounds(c);if(!g||g.top<0||g.left<0)return null;if(n.CommonUtil.getAncestor(c,"svg"))return null;var b=getComputedStyle(c),_=parseFloat(b.getPropertyValue("font-size")),f=b.getPropertyValue("word-spacing"),v=b.getPropertyValue("letter-spacing"),A=b.getPropertyValue("line-height"),w=!0,y=!0,C=!0;if(f){var k=parseFloat(f);if(!isNaN(k)){var R=l.CSSUtil.convertValue2Pixels("px",k.toString(),c);null!==R&&R/_<.16&&(w=!1)}}if(v){var x=parseFloat(v);if(!isNaN(x)){var P=l.CSSUtil.convertValue2Pixels("px",x.toString(),c);null!==P&&P/_<.12&&(y=!1)}}if(A){var T=parseFloat(A);if(!isNaN(T)){var U=A.match(s);if(U){var I=U[1],E=U[2];""!==E&&"px"!==E||(""===E?parseFloat(I):parseFloat(I)/_)<1.5&&(C=!1)}}}if(w&&y&&C)return null;var N=l.CSSUtil.getDefinedStyles(c,["word-spacing","letter-spacing","line-height"]);if(0===Object.keys(N).length)return null;var L=[],S=N["word-spacing"];if(S){var O=d(c,"word-spacing",S=u(c,"word-spacing",S),_,.16);L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_word_spacing_style"))}var q=N["letter-spacing"];q&&(O=d(c,"letter-spacing",q=u(c,"letter-spacing",q),_,.12),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_letter_spacing_style")));var M=N["line-height"];return M&&null===l.CSSUtil.getAncestorWithStyles(c,{overflow:["auto","scroll"],"overflow-x":["auto","scroll"],"overflow-y":["auto","scroll"]})&&(O=d(c,"line-height",M=u(c,"line-height",M),_,1.5,!0),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_line_height_style"))),L.length>0?L:null}}},855(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_whitespace_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.text_whitespace_valid={id:"text_whitespace_valid",context:"dom:*",help:{"en-US":{pass:"text_whitespace_valid.html",potential_text:"text_whitespace_valid.html",group:"text_whitespace_valid.html"}},messages:{"en-US":{pass:"Rule Passed",potential_text:"Space characters should not be used to create space between the letters of a word",group:"Space characters should not be used to control spacing within a word"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getAncestor(n,["body","script","code"]);if(null==l||"body"!=l.nodeName.toLowerCase())return null;for(var o=!0,s=n.firstChild;o&&s;){if("#text"==s.nodeName){var u=s.nodeValue;o=!/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(u)}s=s.nextSibling}return o?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_text")}}},3420(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9955),s=i(3864),u=i(3946);t.widget_tabbable_exists={id:"widget_tabbable_exists",context:"aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton",refactor:{IBMA_Focus_Tabbable:{pass:"pass",fail_no_tabbable:"fail_no_tabbable"}},help:{"en-US":{pass:"widget_tabbable_exists.html",fail_no_tabbable:"widget_tabbable_exists.html",group:"widget_tabbable_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_no_tabbable:'Component with "{0}" role does not have a tabbable element',group:"Component must have at least one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!u.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)&&!r.AriaUtil.shouldBePresentationalChild(n)){if("datalist"===n.nodeName.toLowerCase())return null;for(var d=0,c=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"];d<c.length;d++){var m=c[d];if(null!=r.AriaUtil.getAncestorWithRole(n,m,!0))return null}var p=o.ARIAMapper.nodeToRole(n),h=0;if(l.CommonUtil.isTabbable(n)&&++h,h<1&&!r.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var g=new s.DOMWalker(n);h<1&&g.nextNode()&&g.node!=n;)1==g.node.nodeType&&!g.bEndTag&&l.CommonUtil.isTabbable(g.node)&&++h;return h>=1?(0,a.RulePass)("pass"):(0,a.RulePotential)("fail_no_tabbable",[p])}}}},408(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_single=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7011),o=i(7139),s=i(9955),u=i(4566),d=i(3946);t.widget_tabbable_single={id:"widget_tabbable_single",context:"aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab",refactor:{IBMA_Focus_MultiTab:{pass:"pass",potential_multiple_tabbable:"potential_multiple_tabbable"}},help:{"en-US":{pass:"widget_tabbable_single.html",potential_multiple_tabbable:"widget_tabbable_single.html",group:"widget_tabbable_single.html"}},messages:{"en-US":{pass:"Components with a widget role should have no more than one tabbable element",potential_multiple_tabbable:'Component with "{0}" role has more than one tabbable element',group:"Components with a widget role must have no more than one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!d.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)&&!l.AriaUtil.shouldBePresentationalChild(n)){var c=s.ARIAMapper.nodeToRole(n),m=0;if(o.CommonUtil.isTabbable(n)&&++m,m<2&&!l.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var p=new r.DOMWalker(n);m<2&&p.nextNode()&&p.node!=n;)1==p.node.nodeType&&!p.bEndTag&&o.CommonUtil.isTabbable(p.node)&&++m;var h=m<2;return h||u.CacheUtil.setCache(n,"widget_tabbable_single","potential_multiple_tabbable"),h?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_multiple_tabbable",[c])}}}},6160(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.a11yRulesets=void 0;var l=r(i(8855)),o=i(8601),s=[];for(var u in l)s.push(l[u]);var d={"1.1.1":"All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.","1.2.1":"For prerecorded audio-only or video-only media, an alternative provides equivalent information.","1.2.2":"Captions are provided for all prerecorded audio content in synchronized media.","1.2.3":"An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.","1.2.4":"Captions are provided for all live audio content in synchronized media.","1.2.5":"Audio description is provided for all prerecorded video content in synchronized media.","1.3.1":"Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.","1.3.2":"When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.","1.3.3":"Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.","1.3.4":"Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.","1.3.5":"The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.","1.4.1":"Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.","1.4.2":"If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.","1.4.3":"The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.","1.4.4":"Text can be resized without assistive technology up to 200 percent without loss of content or functionality.","1.4.5":"If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.","1.4.10":"Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.","1.4.11":"The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.","1.4.12":"No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.","1.4.13":"Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.","2.1.1":"All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.","2.1.2":"If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.","2.1.4":"If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.","2.2.1":"For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.","2.2.2":"For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.","2.3.1":"Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.","2.4.1":"A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.","2.4.2":"Web pages, non-web documents, and software have titles that describe topic or purpose.","2.4.3":"If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.","2.4.4":"The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.","2.4.5":"More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.","2.4.6":"Headings and labels describe topic or purpose.","2.4.7":"Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.","2.4.11":"When an element receives focus, it is not entirely covered by other content.","2.5.1":"All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.","2.5.2":"For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.","2.5.3":"For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.","2.5.4":"Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.","2.5.8":"The size of the target for pointer inputs is at least 24 by 24 CSS pixels.","2.5.7":"All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.","3.1.1":"The default human language of Web pages, non-Web documents, or software can be programmatically determined.","3.1.2":"The human language of each passage or phrase in the content can be programmatically determined.","3.2.1":"When any component receives focus, it does not initiate a change of context.","3.2.2":"Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.","3.2.3":"Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.","3.2.4":"Components that have the same functionality within a set of Web pages are identified consistently.","3.2.6":"Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.","3.3.1":"If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.","3.3.2":"Labels or instructions are provided when content requires user input.","3.3.3":"If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.","3.3.4":"For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.","3.3.7":"Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.","3.3.8":"Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.","4.1.1":"(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.","4.1.2":"For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.","4.1.3":"In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",HTML:"The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.",ARIA:"The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported."};t.a11yRulesets=[{id:"EXTENSIONS",name:"Extension Rules",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for enabling the browser extensions",type:o.eGuidelineType.EXTENSION,checkpoints:[{num:"1",name:"Extension CP 1",wcagLevel:"A",summary:"Rules for Extension"}]},{id:"IBM_Accessibility",name:"IBM Accessibility 7.3",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"IBM_Accessibility_next",name:"IBM Accessibility next",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_2",name:"WCAG 2.2 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_1",name:"WCAG 2.1 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_0",name:"WCAG 2.0 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.",checkpoints:s.filter(function(e){return("A"===e.level||"AA"===e.level)&&"2.0"===e.wcagType}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})}]},5233(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRController=void 0;var a=i(8195),n=i(7014),r=i(248),l=i(4566),o=i(2165),s=i(3946),u=i(1686),d=function(){function e(e){void 0===e&&(e=document.body),this.rootElement=e,this.liveListeners=[],this.ctrlDoc=e.ownerDocument,this.setPointOfRegard(e),this.setupMutationTracking(),console.info('[WARNING] The SRController is a new feature that is not yet "stable". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback.')}return e.getController=function(t){return void 0===t&&(t=document),this.singleton||(this.singleton=new e(t.body)),this.singleton},e.prototype.disconnect=function(){this.mutationObserver&&this.mutationObserver.disconnect()},e.prototype.findAllShadowRoots=function(e){void 0===e&&(e=document);for(var t,i=[],a=this.ctrlDoc.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,null);t=a.nextNode();){var n=t;if(n.shadowRoot){i.push(n.shadowRoot);var r=this.findAllShadowRoots(n.shadowRoot);i.push.apply(i,r)}}return i},e.prototype.setupMutationTracking=function(){var e=this;this.mutationObserver&&this.mutationObserver.disconnect();var t=this,i=new MutationObserver(function(r){for(var l=t.pointOfRegard.getNode(),o=function(e){e.removedNodes.forEach(function(t){(t.isSameNode(l)||t.contains(l))&&(console.info("Adjusting PoR due to DOM mutation removing PoR"),l=e.target)})},u=0,d=r.filter(function(e){var t;return(null===(t=e.removedNodes)||void 0===t?void 0:t.length)>0});u<d.length;u++)o(d[u]);e.setPointOfRegard(l);for(var c=function(t){t.addedNodes&&t.addedNodes.forEach(function(t){for(var a=0,n=e.findAllShadowRoots(t);a<n.length;a++){var r=n[a];i.observe(r,{childList:!0,subtree:!0,characterData:!0})}});var r=t.target,l=1===r.nodeType?r:r.parentElement;if(l&&!l.closest('[aria-busy="true"]')&&"true"!==l.getAttribute("aria-busy")){var o=(["polite","assertive"].includes(l.getAttribute("aria-live"))||"OUTPUT"===l.nodeName.toUpperCase()||["status","log","progressbar","alert","timer"].includes(l.getAttribute("role")))&&l||l.closest('[aria-live="polite"],[aria-live="assertive"],output,[role="status"],[role="log"],[role="progressbar"],[role="alert"],[role="timer"]'),u=!1,d=["additions","text"];if(o){var c=l.closest("[aria-relevant]");c&&(d=c.getAttribute("aria-relevant").split(/ +/g)),"log"===o.getAttribute("role")&&(d=["additions"]),o.hasAttribute("aria-relevant")&&(d=o.getAttribute("aria-relevant").split(/ +/g)),d.includes("all")&&(d=["additions","removals","text"]),u=3===t.target.nodeType&&d.includes("text")||t.addedNodes.length>0&&d.includes("additions")||t.removedNodes.length>0&&d.includes("removals")}if(o&&u){var m="true"===o.getAttribute("aria-atomic")||["alert","status","timer","marquee"].includes(o.getAttribute("role"));if(m||"characterData"!==t.type||3!==t.target.nodeType||s.VisUtil.isNodeHiddenFromAT(t.target.parentElement)){var p=m?o:t.target;p.liveAnnounce&&clearTimeout(p.liveAnnounce),p.liveAnnounce=setTimeout(function(){var i=[],r=d.includes("removals")&&t.removedNodes.length>0;if(m||r){var l=new a.SRCursor(p,!1),o=new a.SRCursor(p,!0);o.next(function(){return!0}),i.push((r?"[removed] ":"")+n.SRRenderer.renderRange("item",l,o))}else d.includes("additions")&&t.addedNodes.length>0&&t.addedNodes.forEach(function(e){var t=new a.SRCursor(e,!1),r=new a.SRCursor(e,!0);r.next(function(){return!0}),i.push(n.SRRenderer.renderRange("item",t,r))});for(var s=0,u=e.liveListeners;s<u.length;s++)(0,u[s])(i.join("\n"))},100)}else for(var h=0,g=e.liveListeners;h<g.length;h++)(0,g[h])(t.target.nodeValue)}}},m=0,p=r;m<p.length;m++)c(p[m])}),r=this.findAllShadowRoots(this.ctrlDoc.documentElement);r.push(this.ctrlDoc.documentElement);for(var l=0,o=r;l<o.length;l++){var u=o[l];i.observe(u,{childList:!0,subtree:!0,characterData:!0})}},e.prototype.addLiveListener=function(e){this.liveListeners.push(e)},e.prototype.removeLiveListener=function(e){this.liveListeners=this.liveListeners.filter(function(t){return t!==e})},e.prototype.getPointOfRegard=function(){return this.pointOfRegard},e.prototype.setPointOfRegard=function(t){var i;try{this.pointOfRegard=new a.SRCursor(t);var r=e.diffContainers("focus",this.pointOfRegard),l=this.pointOfRegard.getRole(),o=null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name;return{success:!0,renderingResult:n.SRRenderer.renderCurrent("focus",this.pointOfRegard,r),role:l,name:o}}catch(e){return{success:!1,renderingResult:{start:this.pointOfRegard.clone(),end:this.pointOfRegard.clone(),message:"Failed to set point of regard: ".concat(e.message)}}}},e.prototype.jumpNext=function(t){var i;l.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=r.SRNavigator.jumpNext(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||r.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No next ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}finally{console.groupEnd()}},e.prototype.jumpPrevious=function(t){var i;l.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=r.SRNavigator.jumpPrevious(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||r.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No previous ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}},e.hostIframe=function(e){var t=e.ownerDocument;if(!t||t===document)return null;try{return u.DOMUtil.getAncestor(e,["iframe"])}catch(e){return null}},e.diffContainers=function(t,i,r){var l,o,s=[],u=[];try{if((null!==(l=null==i?void 0:i.getNode().ownerDocument)&&void 0!==l?l:document)!==(null!==(o=null==r?void 0:r.getNode().ownerDocument)&&void 0!==o?o:document)){var d=e.hostIframe(i.getNode()),c=e.hostIframe(null==r?void 0:r.getNode());if(d&&!c){var m=new a.SRCursor(d,!1);(g=n.SRRenderer.renderEnter(t,m,r))&&g.trim()&&u.push(g.trim())}else if(!d&&c)m=new a.SRCursor(c,!0),(p=n.SRRenderer.renderLeave(t,m,r))&&p.trim()&&s.push(p.trim());else if(d&&c&&d!==c){var p,h=new a.SRCursor(c,!0);(p=n.SRRenderer.renderLeave(t,h,r))&&p.trim()&&s.push(p.trim());var g,b=new a.SRCursor(d,!1);(g=n.SRRenderer.renderEnter(t,b,r))&&g.trim()&&u.push(g.trim())}return{leaving:s,entering:u}}var _=i?i.getNode().ownerDocument.body||i.getNode().ownerDocument.documentElement:r?r.getNode().ownerDocument.body||r.getNode().ownerDocument.documentElement:document.body||document.documentElement,f=i?i.clone():new a.SRCursor(_),v=r?r.clone():new a.SRCursor(_);if(!f.getNode().isSameNode(v.getNode())){var A=e.commonParent(f,v);if(A){for(;A.contains(f);)u.push(n.SRRenderer.renderEnter(t,f,v)),f.parent();for(u.reverse(),u=u.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()});A.contains(v);)s.push(n.SRRenderer.renderLeave(t,v,v)),v.parent();s=s.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()})}}}catch(e){console.error(e)}return{leaving:s,entering:u}},e.commonParent=function(e,t){if(e.contains(t))return e.clone();if(t.contains(e))return t.clone();for(var i=e.clone();!i.contains(t)&&i.parent(););return i.contains(e)&&i.contains(t)?i:null},e.renderAll=function(t){var i=e.getController();i.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&i.setPointOfRegard(e)});var a=[],r=n.SRRenderer.renderCurrent(t,i.getPointOfRegard(),{entering:[],leaving:[]});r&&a.push(r.message);for(var l=!0;l;){var s=i.jumpNext(t);s.success?a.push(s.renderingResult.message):l=!1}return a},e.renderAllDetail=function(t,i){var a=e.getController(t);a.setPointOfRegard(t.body),t.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&a.setPointOfRegard(e)});var r=[],l=n.SRRenderer.renderCurrent(i,a.getPointOfRegard(),{entering:[],leaving:[]});l&&r.push(l);for(var s=!0;s;){var u=a.jumpNext(i);u.success?r.push(u.renderingResult):s=!1}return r},e.renderStructure=function(t){for(var i,n,r=["region","heading","item","tab_focus","image"],l=r.map(function(i){return e.renderAllDetail(t,i)}),s=[],u=function(){var e=null===(i=l[0][0])||void 0===i?void 0:i.start;r.forEach(function(t,i){l[i].length>0&&(!e||a.SRCursor.compare(l[i][0].start,e)<0)&&(e=l[i][0].start)});var u={},d=!1;if(r.forEach(function(t,i){u[t]="",l[i].length>0&&0===a.SRCursor.compare(l[i][0].start,e)&&(u[t]=l[i].shift().message,d=""!==u[t])}),d){var c=e.getElement(),m=c&&o.SRUtil.getUniqueSelector(c),p=null!==(n=null==c?void 0:c.ownerDocument)&&void 0!==n?n:t;m&&p.querySelector(m)&&(u.selector=m),s.push(u)}};l.some(function(e){return e.length>0});)u();return s},e}();t.SRController=d},8195(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRCursor=void 0;var a=i(3864),n=i(1950),r=i(7011),l=i(7139),o=i(2165),s=function(){function e(e,t){this.walker=new a.DOMWalker(e,t,void 0,!1),e&&this.refreshName()}return e.prototype.clone=function(){var t=new e(this.walker.node,this.walker.bEndTag);return t.role=this.role,t.name=this.name,t.preLineIndex=this.preLineIndex,t},e.prototype.refreshName=function(){1===this.walker.node.nodeType?(this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0)},e.prototype.next=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},l=n.skipCurrent,s=n.skipChildren;do{if(s&&!this.walker.bEndTag)this.walker.bEndTag=!0;else if(!this.walker.nextNode())break;if(this.refreshName(),l=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&this.isEndTag())break;l||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.previous=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},l=n.skipCurrent,s=n.skipChildren;do{if(s&&this.walker.bEndTag)this.walker.bEndTag=!1;else if(!this.walker.prevNode())break;if(this.refreshName(),l=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&!this.isEndTag())break;l||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.parent=function(e){return!!this.walker.node.parentNode&&(this.walker.node=this.walker.node.parentNode,this.walker.bEndTag=!0===e,1===this.walker.node.nodeType?(this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0),!0)},e.prototype.getCurrentOrParentByRole=function(e,t){for(var i=this,a=t?t.map(function(e){return e.toUpperCase()}):[],n=function(t){var n=t.getElement();return e.includes(i.getRole())||n&&!n.hasAttribute("role")&&a.includes(n.nodeName.toUpperCase())};!n(this)&&this.parent(););return n(this)},e.prototype.getCurrentOrParentByRoleClone=function(e,t){var i=this.clone();return i.getCurrentOrParentByRole(e,t)?i:null},e.prototype.getCurrentOrParentTabbableClone=function(){for(var e=this.clone();e;){var t=e.getElement();if(e.isStartTag()&&t&&l.CommonUtil.isTabbable(t))return e;if(!e.parent(!1))break}return null},e.prototype.getRole=function(){return this.role},e.prototype.getNameInfo=function(){return this.name},e.prototype.getName=function(){var e=this.getNameInfo();if(e&&e.name)return e.name;var t=this.getElement();if(t){var i=l.CommonUtil.getLabelForElementHidden(t,!0);if(i)return i.innerText||i.textContent}},e.prototype.setEndTag=function(e){this.walker.bEndTag=e},e.prototype.getNode=function(){return this.walker.node},e.prototype.getElement=function(){if(this.walker.node&&1===this.walker.node.nodeType)return this.walker.node},e.prototype.getParentElement=function(){if(!this.walker.node)return null;var e=this.clone();return e.walker.node=a.DOMWalker.parentElement(e.walker.node),e},e.prototype.isEndTag=function(){return this.walker.bEndTag},e.prototype.isStartTag=function(){return!this.walker.bEndTag},e.compare=function(e,t){var i,n,r=null===(i=null==e?void 0:e.walker)||void 0===i?void 0:i.node,l=null===(n=null==t?void 0:t.walker)||void 0===n?void 0:n.node;if(!r&&!l)return 0;if(!r)return 1;if(!l)return-1;if(r===l&&!e.walker.bEndTag&&!t.walker.bEndTag){var o=void 0===e.preLineIndex,s=void 0===t.preLineIndex;if(!o||!s){if(o)return-1;if(s)return 1;if(e.preLineIndex!==t.preLineIndex)return e.preLineIndex<t.preLineIndex?-1:1}}var u=r.compareDocumentPosition(l);if(1&u){for(var d=[r],c=[l],m=r;m=a.DOMWalker.parentNode(m);)d.push(m);for(m=l;m=a.DOMWalker.parentNode(m);)c.push(m);d.reverse(),c.reverse();for(var p=0;p<d.length&&p<c.length&&d[p]===c[p];)p++;if(p===d.length)return e.walker.bEndTag?1:-1;if(p===c.length)return t.walker.bEndTag?-1:1;if(p>0){var h=d[p],g=c[p],b=h.compareDocumentPosition(g);if(2&b)return 1;if(4&b)return-1}return 0}return 8&u?t.walker.bEndTag?-1:1:16&u?e.walker.bEndTag?1:-1:2&u?1:4&u?-1:0},e.prototype.contains=function(e){return this.getNode().contains(e.getNode())&&!this.isSameNode(e)},e.prototype.isSameNode=function(e){return!!e&&this.getNode().isSameNode(e.getNode())},e.prototype.hasNonEmptyName=function(){var e;return((null===(e=this.getNameInfo())||void 0===e?void 0:e.name)||"").trim().length>0},e}();t.SRCursor=s},248(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRNavigator=void 0;var a=i(3864),n=i(1950),r=i(8195),l=i(7139),o=i(3946),s=i(7011);!function(e){function t(e){var i;if(1!==e.nodeType)return!1;if(["br","iframe"].includes(e.nodeName.toLowerCase()))return!0;var n=e,r=n.ownerDocument.defaultView,l=null===(i=r.getComputedStyle(n))||void 0===i?void 0:i.display;if(l&&l.startsWith("table"))return!0;if("block"===l&&"block"!==n.style.display&&n.parentElement&&"flex"===r.getComputedStyle(n.parentElement).display)return!1;if("link"===s.AriaUtil.getResolvedRole(n,!0)){var o=new a.DOMWalker(e,!1,void 0,!1);if(o.prevNode(),!t(o.node))return!0}return["block","flex","grid","list-item"].includes(l)}function i(e){for(var t,i=(null!==(t=e.textContent)&&void 0!==t?t:"").split("\n"),a=0;a<i.length&&""===i[a].trim();)a++;for(var n=i.length-1;n>=a&&""===i[n].trim();)n--;return i.slice(a,n+1)}function u(e){return 1===e.nodeType&&"PRE"===e.nodeName.toUpperCase()}function d(e){if(!e||1!==e.nodeType)return null;var t=e;if(!t.hasAttribute("tabindex"))return null;var i=parseInt(t.getAttribute("tabindex"),10);return Number.isNaN(i)?null:i}function c(e){if(!e||1!==e.nodeType)return!1;var t=e,i=d(t);return(null===i||0===i)&&l.CommonUtil.isTabbable(t)}function m(e){return void 0===e&&(e=!0),function(t,i,a){return!!(a&&1===a.nodeType&&i&&l.CommonUtil.isTabbable(a))&&(e||c(a))}}function p(e,t){var i=((null==t?void 0:t.ownerDocument)||document).body||t;if(!i)return[];var a=new r.SRCursor(i,!1),n=f("tab_focus"),o=[],s=[],u=function(t){e(t.getRole(),!t.isEndTag(),t.getNode())&&(function(e){if(!e||1!==e.nodeType)return!1;var t=e,i=d(t);return null!==i&&i>0&&l.CommonUtil.isTabbable(t)}(t.getNode())?o.push(t.clone()):c(t.getNode())&&s.push(t.clone()))};for(u(a);a.next(function(){return!0},n);)u(a);return o.sort(function(e,t){var i=e.getElement(),a=t.getElement(),n=d(i)||0,l=d(a)||0;return n!==l?l-n:r.SRCursor.compare(e,t)}),o.concat(s)}function h(e,t){return e.findIndex(function(e){return 0===r.SRCursor.compare(e,t)})}function g(e){switch(e){case"link":return function(e,t){return t&&"link"===e};case"tab_focus":return m(!1);case"heading":return function(e,t){return t&&"heading"===e};case"h1":return function(e,t,i){return t&&"heading"===e&&"1"===i.ariaLevel};case"h2":return function(e,t,i){return t&&"heading"===e&&"2"===i.ariaLevel};case"h3":return function(e,t,i){return t&&"heading"===e&&"3"===i.ariaLevel};case"h4":return function(e,t,i){return t&&"heading"===e&&"4"===i.ariaLevel};case"h5":return function(e,t,i){return t&&"heading"===e&&"5"===i.ariaLevel};case"h6":return function(e,t,i){return t&&"heading"===e&&"6"===i.ariaLevel};case"image":return function(e,t){return t&&["img","graphics-document"].includes(e)};case"radio":return function(e,t){return t&&"radio"===e};case"button":return function(e,t){return t&&"button"===e};case"checkbox":return function(e,t){return t&&"checkbox"===e};case"combo":return function(e,t){return t&&"combobox"===e};case"list":return function(e,t){return t&&"list"===e};case"listitem":return function(e,t){return t&&"listitem"===e};case"article":return function(e,t){return t&&"article"===e};case"table":return function(e,t){return t&&"table"===e};case"paragraph":return function(e,t,i){return t&&"P"===i.nodeName.toUpperCase()};case"dom":return function(){return!0};case"item":return function(e,i,n){if(!i)return!1;if(1===n.nodeType&&"IFRAME"===n.nodeName.toUpperCase())return!1;if(u(n))return!0;if(t(n))return!0;var r=new a.DOMWalker(n,!i);return!(!r.prevNode()||!r.bEndTag)&&t(r.node)};case"region":return function(e,t,i){var a,r;return!!t&&(!!["main","navigation","form","banner","search","contentinfo"].includes(e)||"region"===e&&1===(null==i?void 0:i.nodeType)&&!!(null===(r=null===(a=n.AccNameUtil.computeAccessibleName(i))||void 0===a?void 0:a.name)||void 0===r?void 0:r.trim()))};case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}e.getPreLines=i,e.getStartFunc=g;var b=function(e){var t;try{var i=e.getNode().nodeType,n=e.getElement(),r=e.clone();if(r.setEndTag(!1),[4,8].includes(i))return{skipCurrent:!0,skipChildren:!0};if(![1,3].includes(i))return{skipCurrent:!0,skipChildren:!1};if(3===i&&!(n=e.getNode().parentElement))return o.VisUtil.isNodeHiddenFromAT(n)?{skipCurrent:!0,skipChildren:!1}:null;if(!(n.closest("body")||(t=n,t.getRootNode()instanceof ShadowRoot)))return{skipCurrent:!0,skipChildren:!1};if(n.closest("script,style"))return{skipCurrent:!0,skipChildren:!0};var l=r.getCurrentOrParentByRoleClone(["heading","link"]),u=s.AriaUtil.getResolvedRole(n),d="heading"===u||"link"===u;if(l){l.getElement();var c=l.getNameInfo();if(c&&!["content","text"].includes(c.nameFrom)){if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:!0}}else if(d);else{var m=s.AriaUtil.getResolvedRole(n);if(("img"===m||"graphics-document"===m)&&o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0}}}else{if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:1===i};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:1===i}}if("BODY"===n.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!1};if("LABEL"===n.nodeName.toUpperCase()){if(n.hasAttribute("for")&&document.getElementById(n.getAttribute("for"))&&"hidden"!==document.getElementById(n.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var p=n.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']");if(p&&"hidden"!==p.getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};if((b=n.getAttribute("id"))&&document.querySelector('[aria-labelledby~="'.concat(b,'"]')))return{skipCurrent:!0,skipChildren:!1}}var h=n.closest("label[for]"),g=h&&h.getAttribute("for");if(h&&g&&document.getElementById(g)&&"hidden"!==document.getElementById(g).getAttribute("type")&&!n.closest("a[href], [role='link'], button, [role='button']"))return{skipCurrent:!0,skipChildren:1===i};var b,_=r.getRole();if("combobox"===_&&"SELECT"!==n.nodeName.toUpperCase()&&"INPUT"!==n.nodeName.toUpperCase()&&!e.isEndTag())return{skipCurrent:!1,skipChildren:!0};if(s.AriaUtil.containsPresentationalChildrenOnly(n))return{skipCurrent:!1,skipChildren:!0};if(["link","heading"].includes(_)&&(!r.getName()||!["content","text"].includes(r.getNameInfo().nameFrom))&&!(l&&l.getNameInfo()&&["content","text"].includes(l.getNameInfo().nameFrom)))return{skipCurrent:!1,skipChildren:!0};if("LEGEND"===n.nodeName.toUpperCase())for(var f=a.DOMWalker.parentElement(e.getNode());f;){if("FIELDSET"===f.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0};f=a.DOMWalker.parentElement(f)}if(n&&"MSUP"===n.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0};if(!e.isEndTag()&&"SUMMARY"===n.nodeName.toUpperCase()){var v=n.parentElement;if(v&&"DETAILS"===v.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0}}if(!e.isEndTag()&&"DETAILS"!==n.nodeName.toUpperCase()&&!n.closest("summary")){var A=n.closest("details");if(A&&!A.hasAttribute("open"))return{skipCurrent:!0,skipChildren:!0}}if(n.closest(".ibma-sr-overlay"))return{skipCurrent:!0,skipChildren:!0};if(1===i&&!e.isEndTag()&&(b=n.getAttribute("id"))){var w=document.querySelector('[aria-controls~="'.concat(b,'"]'));if(w&&"combobox"===s.AriaUtil.getResolvedRole(w))return{skipCurrent:!0,skipChildren:!0}}return null}finally{}},_=function(e){var t=e.getNode().nodeType,i=e.getElement();if(1!==t&&3!==t)return{skipCurrent:!0,skipChildren:!1};if(3===t)return o.VisUtil.isNodeHiddenFromAT(i)?{skipCurrent:!0,skipChildren:!1}:null;if(o.VisUtil.isNodeHiddenFromAT(i))return{skipCurrent:!0,skipChildren:!0};if("IFRAME"===i.nodeName.toUpperCase()&&!e.isEndTag())return{skipCurrent:!1,skipChildren:!0};if("LABEL"===i.nodeName.toUpperCase()&&i.hasAttribute("for")&&document.getElementById(i.getAttribute("for"))&&"hidden"!==document.getElementById(i.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var a=i.closest("label[for]"),n=a&&a.getAttribute("for");return a&&n&&document.getElementById(n)&&"hidden"!==document.getElementById(n).getAttribute("type")&&!i.closest("a[href], [role='link'], button, [role='button']")?{skipCurrent:!0,skipChildren:1===t}:(e.getRole(),s.AriaUtil.containsPresentationalChildrenOnly(i)?{skipCurrent:!1,skipChildren:!0}:i&&"MSUP"===i.nodeName.toUpperCase()||i.closest(".ibma-sr-overlay")?{skipCurrent:!0,skipChildren:!0}:null)};function f(e){switch(e){case"region":case"item":return b;case"link":case"tab_focus":case"heading":case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":case"image":return _;case"radio":case"button":case"checkbox":case"combo":case"list":case"listitem":case"article":case"table":case"paragraph":case"dom":case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}function v(e,t){try{if("tab_focus"===e){var a=p(m(!0),t.getNode());if(a.length>0){var n=t.getCurrentOrParentTabbableClone(),r=n&&h(a,n)>=0?n:t.clone(),l=h(a,r);return l>=0?l+1<a.length?a[l+1].clone():null:a[0].clone()}}if("item"===e&&u(t.getNode())&&!t.isEndTag()){var o=i(t.getNode());if(void 0!==t.preLineIndex){var s=t.preLineIndex;if(s+1<o.length){var d=t.clone();return d.preLineIndex=s+1,d}var c=t.clone();c.setEndTag(!0);var b=g(e),_=f(e);return c.next(b,_)?(u(c.getNode())&&!c.isEndTag()&&(c.preLineIndex=void 0),c):null}if(o.length>0){var v=t.clone();return v.preLineIndex=0,v}}var A=t.clone(),w=g(e),y=f(e);return A.next(w,y)?("item"===e&&u(A.getNode())&&!A.isEndTag()&&(A.preLineIndex=void 0),A):null}finally{console.groupEnd()}}function A(e,t){if("tab_focus"===e){var a=t.clone(),n=g(e),r=f(e);if(a.previous(n,r))return a;var l=p(m(!0),t.getNode());if(l.length>0){var o=t.getCurrentOrParentTabbableClone(),s=o&&h(l,o)>=0?o:t.clone(),d=h(l,s);if(d>0)return l[d-1].clone()}return null}if("item"===e&&u(t.getNode())&&!t.isEndTag()&&void 0!==t.preLineIndex){if(0===t.preLineIndex){var c=t.clone();return c.preLineIndex=void 0,c}var b=t.clone();return b.preLineIndex=t.preLineIndex-1,b}var _=t.clone(),v=g(e),A=f(e);if(_.previous(v,A)){if("item"===e&&u(_.getNode())&&!_.isEndTag()){var w=i(_.getNode());_.preLineIndex=w.length>0?w.length-1:void 0}return _}return null}e.getSkipFunc=f,e.jumpCurrent=function(e,t){return("tab_focus"===e?m(!0):g(e))(t.getRole(),!t.isEndTag(),t.getNode())?t.clone():A(e,t)},e.jumpCurrentEnd=function(e,t){if("item"===e){if(u(t.getNode())&&!t.isEndTag()){i(t.getNode());var a=void 0===t.preLineIndex?0:t.preLineIndex+1,n=t.clone();return n.preLineIndex=a,[n]}return(d=v(e,t))?[d]:[]}var l=t.getNameInfo(),o=t.clone();l&&!["content","text"].includes(l.nameFrom)||o.setEndTag(!0),o.next(function(){return!0});for(var s=[],d=v("item",t);d&&r.SRCursor.compare(d,o)<0;)s.push(d),d=v("item",d);return s.push(o),"tab_focus"===e&&"link"===t.getRole()?[s[s.length-1]]:s},e.jumpNext=v,e.jumpPrevious=A}(t.SRNavigator||(t.SRNavigator={}))},7014(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRenderer=void 0;var a,n=i(7011),r=i(248),l=i(8195),o=i(2151),s=i(7242);(a=t.SRRenderer||(t.SRRenderer={})).renderEnter=function(e,t,i){for(var a=0,n=o.CONTAINER_ENTER_RULES;a<n.length;a++){var r=n[a].test(e,t,i);if(null!=r)return r}return null},a.renderLeave=function(e,t,i){for(var a=0,n=o.CONTAINER_EXIT_RULES;a<n.length;a++){var r=n[a].test(e,t,i);if(null!=r)return r}return null},a.renderCurrent=function(e,t,i){var n=r.SRNavigator.jumpCurrent(e,t);if(!n)return null;var l=r.SRNavigator.jumpCurrentEnd(e,n);l&&0!==l.length||(l=[null]);for(var o=l[l.length-1],s="",u=0,d=l;u<d.length;u++){var c=d[u],m=a.renderRange(e,n,c);if(m.trim().length>0){o=c,s=m;break}}return""===s&&(s=a.renderRange(e,n,o)),{start:n,end:o,message:(i.leaving||[]).concat(i.entering||[]).concat([s]).join(" ").replace(/\s+/g," ")}},a.renderRange=function(e,t,i){for(var a,u=t.clone(),d=[],c=!0,m=null;c;){var p=u.getElement(),h=u.getNode(),g=h.nodeType,b=n.AriaUtil.getAncestorWithRole(h,"link",!0);b&&!["content","text"].includes(null===(a=new l.SRCursor(b).getNameInfo())||void 0===a?void 0:a.nameFrom)&&(b=null);for(var _=0,f=o.SR_RULES;_<f.length;_++){var v=f[_].test(e,u);if(null!=v&&v.trim().length>0){1!==g||u.isEndTag()||"menu"!==p.getAttribute("aria-haspopup")||(v="[subMenu] "+v),"tab_focus"===e?m&&(!b||b&&m!==b)&&(v="".concat(v," ").concat((0,s.getLinkAnnouncement)(new l.SRCursor(m,!1)))):!b||m&&m===b||(v="".concat((0,s.getLinkAnnouncement)(new l.SRCursor(b,!1))," ").concat(v)),""!==v&&(m=b,d.push(v));break}}d.push([].filter(function(e){return e.trim().length>0}).join(" ")),c=u.next(function(){return!0},r.SRNavigator.getSkipFunc(e))&&l.SRCursor.compare(u,i)<0}"tab_focus"===e&&m&&d.push("".concat((0,s.getLinkAnnouncement)(new l.SRCursor(m,!1))));var A=d.filter(function(e){return e.trim().length>0}).join(" ");return A=(A=A.replace(/, \u0001([^\u0002]+)\u0002/g,function(e,t){var i='"'.concat(t,'"'),a=A.replace(e,"");return a.includes(i)||a.includes(t)?"":", ".concat(i)})).replace(/[\u0001\u0002]/g,"")}},328(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRendererRule=void 0;var i=function(){function e(e){this.ruleDefinition=e}return e.prototype.test=function(e,t,i){if(this.ruleDefinition.modes.includes(e)&&(this.ruleDefinition.roles.includes(t.getRole())||this.ruleDefinition.elems.includes(t.getNode().nodeName.toUpperCase())))for(var a=0,n=this.ruleDefinition.tests;a<n.length;a++){var r=(0,n[a])(t,i,e);if("string"==typeof r)return r}return null},e}();t.SRRendererRule=i},369(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRTableUtil=void 0;var a=i(8195);!function(e){function t(e){return!!e.getElement()&&(!!["cell","rowheader","columnheader"].includes(e.getRole())||!e.getElement().hasAttribute("role")&&["TH","TD"].includes(e.getElement().nodeName.toUpperCase()))}function i(e){return e.getCurrentOrParentByRoleClone(["cell","rowheader","columnheader"],["TD","TH"])}function n(e){if(!t(e))return 0;var i=e.getElement().getAttribute("colspan");return i?parseInt(i):1}function r(e){if(!t(e))return 0;var i=e.getElement().getAttribute("rowspan");return i?parseInt(i):1}function l(e){var i=e.getCurrentOrParentByRoleClone(["table"]);if(!i)return null;for(var a,l=i.clone(),o=[],s=[];l.next(function(){return!0})&&!l.getNode().isSameNode(i.getNode());){if(l.isEndTag()&&"row"===l.getRole())for(o.push(s),a=s,s=[];a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length]);if(!l.isEndTag()&&t(l)){for(var u=n(l),d={rowIndexStart:o.length,colIndexStart:s.length,rowspan:r(l),colspan:u,cellCursor:l.clone()},c=0;c<u;++c)s.push(d);for(;a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length])}}return o}function o(e,t){var a=i(e);t||(t=l(e));for(var n=0;n<t.length;++n)for(var r=0;r<t[n].length;++r)if(t[n][r].cellCursor.isSameNode(a))return t[n][r];return null}function s(e,t){return t>=e.colIndexStart&&t<e.colIndexStart+e.colspan}function u(e,t){return t>=e.rowIndexStart&&t<e.rowIndexStart+e.rowspan}function d(e){var t=e.getElement();return!!t&&("cell"===e.getRole()||!t.hasAttribute("role")&&"TD"===t.nodeName.toUpperCase())}e.isCursorCellRole=t,e.getCurrentOrParentCellCursor=i,e.getColSpan=n,e.getRowSpan=r,e.getTableModel=l,e.getCellModel=o,e.cellModelContainsColumn=s,e.cellModelContainsRow=u,e.getRowHeaders=function(e){return""},e.getColumnHeadersForCursor=function(t,i){if(!i&&!(i=l(t)))return"";var n=o(t,i);if(!n)return"";var r=n.cellCursor;if(!r)return"";var u=r.getElement();if(!u)return"";for(var c=[],m=n.colIndexStart;m<n.colIndexStart+n.colspan;++m)c.push({potentialColHeaders:[],existsDataCell:!1,colIdx:m});var p=[];if(u.hasAttribute("headers"))p=u.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return s(e.getCellModel(t,i),a.colIdx)})});else{for(var h=0;h<i.length;++h)for(var g=function(e){var t=e.colIdx,a=i[h][t],n=a.cellCursor,l=n.getElement();if(!a||!n||n.isSameNode(r)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0),"continue";var o=n.clone();"columnheader"===n.getRole()?(p.push(o),e.potentialColHeaders.push(o)):l.hasAttribute("role")||"TH"!==l.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0):("col"===l.getAttribute("scope")||"axis"===l.getAttribute("scope")||!l.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialColHeaders.push(o))},b=0,_=c;b<_.length;b++)g(A=_[b]);for(var f=0,v=c;f<v.length;f++){var A;(A=v[f]).existsDataCell||(A.potentialColHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialColHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.getRowHeadersForCursor=function(t,i){if(!i&&!(i=l(t)))return"";var n=o(t,i);if(!n)return"";var r=n.cellCursor;if(!r)return"";var s=r.getElement();if(!s)return"";for(var c=[],m=n.rowIndexStart;m<n.rowIndexStart+n.rowspan;++m)c.push({potentialRowHeaders:[],existsDataCell:!1,rowIdx:m});var p=[];if(s.hasAttribute("headers"))p=s.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return u(e.getCellModel(t,i),a.rowIdx)})});else{for(var h=c.reduce(function(e,t){return Math.max(e,i[t.rowIdx].length)},0),g=0;g<h;++g)for(var b=function(e){var t=e.rowIdx;if(g>=i[t].length)return"continue";var a=i[t][g],n=a.cellCursor,l=n.getElement();if(!a||!n||n.isSameNode(r)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0),"continue";var o=n.clone();"rowheader"===n.getRole()?(p.push(o),e.potentialRowHeaders.push(o)):l.hasAttribute("role")||"TH"!==l.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0):("row"===l.getAttribute("scope")||"axis"===l.getAttribute("scope")||!l.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialRowHeaders.push(o))},_=0,f=c;_<f.length;_++)b(w=f[_]);for(var v=0,A=c;v<A.length;v++){var w;(w=A[v]).existsDataCell||(w.potentialRowHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialRowHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.isDataCell=d}(t.SRTableUtil||(t.SRTableUtil={}))},2165(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRUtil=void 0;var a,n=i(7011),r=i(3946);(a=t.SRUtil||(t.SRUtil={})).isModalDialogElement=function(e){if(1!==e.nodeType)return!1;var t=e;return"dialog"===n.AriaUtil.getResolvedRole(t,!0)&&"true"===t.getAttribute("aria-modal")&&r.VisUtil.isNodeVisible(e)},a.getUniqueSelector=function e(t,i){if(void 0===i&&(i=!1),t.id)return"#".concat(CSS.escape(t.id));if(t.isSameNode(document.documentElement)||t.isSameNode(document.body))return t.tagName.toLowerCase();var a=t.tagName.toLowerCase();if(t.classList.length&&!i&&(a+=Array.from(t.classList).slice(0,3).map(function(e){return".".concat(CSS.escape(e))}).join("")),!i){if(t.hasAttribute("role")&&(a+='[role="'.concat(CSS.escape(t.getAttribute("role")||""),'"]')),t.hasAttribute("aria-label")){var n=t.getAttribute("aria-label")||"";n.length<=20&&(a+='[aria-label="'.concat(CSS.escape(n),'"]'))}"input"===t.tagName.toLowerCase()&&t.hasAttribute("type")&&(a+='[type="'.concat(CSS.escape(t.getAttribute("type")||""),'"]'))}if(t.parentElement){var r=Array.from(t.parentElement.children).filter(function(e){return e.tagName===t.tagName});if(r.length>1){var l=r.indexOf(t)+1;a+=":nth-of-type(".concat(l,")")}return"".concat(e(t.parentElement,!0)," > ").concat(a)}return a}},8107(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRViewer=t.SROverlay=void 0;var a=i(5233),n=function(){function e(e){this.srViewer=e,this.navigationModes=[{mode:"item",label:"Item"},{mode:"tab_focus",label:"Tabbable"},{mode:"heading",label:"Heading"},{mode:"region",label:"Region"}],this.createOverlay()}return e.prototype.createDOMElement=function(e,t,i){var a=this.srViewer.viewerDoc.createElement(e);if(t)for(var n in t)a[n]=t[n];if(i)for(var n in i)a.style[n]=i[n];return a},e.prototype.createOverlay=function(){var e=this;this.container=this.createDOMElement("div",{className:"ibma-sr-overlay"},{position:"fixed",bottom:"0",left:"0",width:"100%",backgroundColor:"rgba(0, 0, 0, 0.8)",color:"white",padding:"10px",zIndex:"10000",display:"flex",flexDirection:"column",gap:"10px"});var t=this.createDOMElement("div",{},{display:"flex",flexWrap:"wrap",gap:"10px"});this.navigationModes.forEach(function(i){var a=e.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"});a.appendChild(e.createDOMElement("span",{textContent:i.label+":"},{}));var n=e.createDOMElement("button",{textContent:"◀ Prev"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.navigatePrevious(i.mode)}),a.appendChild(n);var r=e.createDOMElement("button",{textContent:"Next ▶"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});r.addEventListener("click",function(){return e.srViewer.navigateNext(i.mode)}),a.appendChild(r),t.appendChild(a)});var i=this.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"}),a=this.createDOMElement("button",{textContent:"Show all"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});a.addEventListener("click",function(){return e.srViewer.showAll(!0)}),i.appendChild(a);var n=this.createDOMElement("button",{textContent:"Toggle speech"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.toggleSpeech()}),i.appendChild(n),t.appendChild(i),this.resultsDisplay=this.createDOMElement("div",{textContent:"Screen reader simulation results will appear here."},{padding:"10px",backgroundColor:"rgba(255, 255, 255, 0.1)",borderRadius:"3px",minHeight:"100px",maxHeight:"50vh",fontFamily:"monospace",overflow:"auto"}),this.container.appendChild(t),this.container.appendChild(this.resultsDisplay),this.srViewer.viewerDoc.body.appendChild(this.container)},e.prototype.displayResult=function(e,t,i){var a,n,r,l,o="";e.success,o="".concat(i.toUpperCase()," ").concat(t,": ").concat(e.renderingResult.message),null===(n=null===(a=e.renderingResult.end)||void 0===a?void 0:a.getElement())||void 0===n||n.scrollIntoView(),null===(l=null===(r=e.renderingResult.start)||void 0===r?void 0:r.getElement())||void 0===l||l.scrollIntoView(),window.scrollBy(0,-200),this.resultsDisplay.innerHTML="",this.resultsDisplay.textContent=o;var s=this.createDOMElement("button",{innerText:"Debug"},{});s.addEventListener("click",function(){var t,i;console.log(null===(t=e.renderingResult.start)||void 0===t?void 0:t.getNode(),null===(i=e.renderingResult.end)||void 0===i?void 0:i.getNode())}),this.resultsDisplay.appendChild(s)},e.prototype.displayAll=function(e){for(var t=this,i=this.createDOMElement("table",{},{}),a=this.createDOMElement("tr",{},{}),n=["region","heading","item","tab_focus"],r=0,l=["Region","Heading","Item","Tabbable"];r<l.length;r++){var o=l[r];a.appendChild(this.createDOMElement("th",{scope:"col",innerText:o},{textAlign:"left",padding:".25rem",margin:"0rem",color:"white"})),i.appendChild(a)}for(var s=function(e){var a=u.createDOMElement("tr",{},{});n.forEach(function(i){a.appendChild(t.createDOMElement("td",{innerText:e[i]},{verticalAlign:"top",border:"solid white 1px",padding:".25rem",margin:"0rem",color:"white"}))}),i.appendChild(a)},u=this,d=0,c=e;d<c.length;d++)s(c[d]);this.resultsDisplay.innerHTML="",this.resultsDisplay.appendChild(i)},e.prototype.destroy=function(){this.container&&this.container.parentNode&&this.container.parentNode.removeChild(this.container)},e}();t.SROverlay=n;var r=function(){function e(e){void 0===e&&(e=document.body),this.isStreaming=!1,this.isShowingAll=!1,this.speechEnabled=!1,this.viewerDoc=e.ownerDocument,this.controller=a.SRController.getController(this.viewerDoc),this.overlay=new n(this),this.setupKeyboardHandlers(),this.setupFocusTracking(),this.setupMutationTracking()}return e.prototype.showAll=function(e){e&&(this.isShowingAll=!0);var t=a.SRController.renderStructure(this.viewerDoc);this.overlay.displayAll(t)},e.prototype.toggleSpeech=function(){this.speechEnabled=!this.speechEnabled},e.prototype.navigateNext=function(e){this.isShowingAll=!1;var t=this.controller.jumpNext(e);this.overlay.displayResult(t,e,"next"),this.speakResult(t)},e.prototype.navigatePrevious=function(e){this.isShowingAll=!1;var t=this.controller.jumpPrevious(e);this.overlay.displayResult(t,e,"previous"),this.speakResult(t)},e.prototype.setupKeyboardHandlers=function(){var e=this;this.keyboardHandler=function(t){var i=t.target;if("INPUT"!==i.tagName&&"TEXTAREA"!==i.tagName&&"SELECT"!==i.tagName)if(t.ctrlKey)e.stopSpeech();else if(!t.altKey&&!t.metaKey)switch(t.key){case"ArrowUp":t.preventDefault(),e.navigatePrevious("item");break;case" ":e.isStreaming=!0;case"ArrowDown":t.preventDefault(),e.navigateNext("item");break;case"Enter":t.preventDefault(),e.activateCurrentElement(),e.controller.setPointOfRegard(e.viewerDoc.activeElement);break;case"H":case"h":t.shiftKey?(t.preventDefault(),e.navigatePrevious("heading")):(t.preventDefault(),e.navigateNext("heading"));break;case"R":case"r":t.shiftKey?(t.preventDefault(),e.navigatePrevious("region")):(t.preventDefault(),e.navigateNext("region"));break;case"Tab":t.shiftKey?(t.preventDefault(),e.navigatePrevious("tab_focus")):(t.preventDefault(),e.navigateNext("tab_focus"))}},this.viewerDoc.addEventListener("keydown",this.keyboardHandler)},e.prototype.speakResult=function(e){var t=this;if(this.speechEnabled){var i=new SpeechSynthesisUtterance(e.renderingResult.message);i.rate=1.5;var a=this;i.addEventListener("end",function(e){a.isStreaming&&t.navigateNext("item")}),speechSynthesis.cancel(),speechSynthesis.speak(i)}},e.prototype.stopSpeech=function(){this.isStreaming=!1,speechSynthesis.cancel()},e.prototype.setupMutationTracking=function(){var e=this,t=new MutationObserver(function(i){if(e.isShowingAll&&i.filter(function(e){return 1===e.target.nodeType&&!e.target.closest(".ibma-sr-overlay")}).length>0){t.disconnect();var a=e;a.showAll(),setTimeout(function(){a.showAll(),t.observe(e.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},1e3)}});t.observe(this.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},e.prototype.setupFocusTracking=function(){var e=this;this.focusHandler=function(t){if(t.target instanceof HTMLElement){var i=t.target;if(e.overlay&&i.closest(".ibma-sr-overlay"))return;console.group("focusHandler");var a=e.controller.setPointOfRegard(i);a.success&&(e.overlay.displayResult(a,"focus","focus"),e.speakResult(a)),console.groupEnd()}},this.viewerDoc.addEventListener("focusin",this.focusHandler)},e.prototype.activateCurrentElement=function(){var e=this.controller.getPointOfRegard().getElement();if(e){var t={success:!0,renderingResult:{message:"Activating: ".concat(e.textContent||e.nodeName),start:this.controller.getPointOfRegard(),end:this.controller.getPointOfRegard()}};this.overlay.displayResult(t,"focus","focus"),this.speakResult(t),e.focus&&e.focus(),e.click()}},e.prototype.getController=function(){return this.controller},e.prototype.destroy=function(){this.viewerDoc.removeEventListener("keydown",this.keyboardHandler),this.viewerDoc.removeEventListener("focusin",this.focusHandler),this.stopSpeech(),this.overlay.destroy()},e}();t.SRViewer=r},7242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=t.getLinkAnnouncement=t.getRoleDescription=t.quoteName=t.quoteNamePadBefore=t.quoteNamePadAfter=void 0;var a=i(8195),n=i(328),r=i(7011),l=i(9910),o=i(3864),s=i(3946);function u(e,t,i,a){return e.getName()?"".concat(c(e)).concat(t||", "):""}function d(e,t){return e.getName()?"".concat(t||", ").concat(c(e)):""}function c(e,t,i){return e.getName()?"".concat(t||'"').concat(e.getName()).concat(i||'"'):""}function m(e,t){var i=e.getElement();if(!i)return t;var a=i.getAttribute("aria-roledescription");return a&&a.trim().length>0?a.trim():t}function p(e,t){var i,a=e.getNode().href||"";i=a.startsWith(document.location.href)&&"#"===a.charAt(document.location.href.length)?"same page link":"link";var n=e.getNameInfo();return n&&!["content","text"].includes(n.nameFrom)?"tab_focus"===t?"[".concat(u(e)).concat(i,"]"):"[".concat(i).concat(d(e),"]"):"[".concat(i,"]")}function h(e,t){var i=e.getAttribute("aria-describedby");if(!i)return"";var a=i.split(/\s+/).map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){var t;return null===(t=e.textContent)||void 0===t?void 0:t.trim()}).filter(function(e){return!!e}).join(" ");return a&&0!==a.length?"item"===t?", ".concat(a,""):', "'.concat(a,'"'):""}function g(e){var t="";return(e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled"))&&(t+=", disabled"),(e.hasAttribute("readonly")||"true"===e.getAttribute("aria-readonly"))&&(t+=", read only"),(e.hasAttribute("required")||"true"===e.getAttribute("aria-required"))&&(t+=", required","SELECT"===e.nodeName.toUpperCase()&&e.validity.valueMissing&&(t+=", invalid entry")),"true"===e.getAttribute("aria-invalid")&&(t+=", invalid"),t}function b(e){var t=e.getElement();if(!t)return!1;for(var i=new o.DOMWalker(t,!1,t,!1);i.nextNode();)if(1===i.node.nodeType&&!i.bEndTag){var a=r.AriaUtil.getResolvedRole(i.node);if(a&&l.ARIADefinitions.designPatterns[a]&&"widget"===l.ARIADefinitions.designPatterns[a].roleType)return!0}return!1}t.quoteNamePadAfter=u,t.quoteNamePadBefore=d,t.quoteName=c,t.getRoleDescription=m,t.getLinkAnnouncement=p,t.RULES=[new n.SRRendererRule({roles:["button"],elems:[],modes:["item","button","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"true"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"false"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", not pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isEndTag()){var a="",n=e.getElement(),r=m(e,"button");return["menu","true"].includes(n.getAttribute("aria-haspopup"))&&(a+=", menu"),n.hasAttribute("aria-expanded")&&(a+=", ".concat("true"===n.getAttribute("aria-expanded")?"expanded":"collapsed")),a+=g(n),"[".concat(u(e)).concat(r).concat(a).concat(h(n,i),"]")}},function(e){if(e.isEndTag())return""}]}),new n.SRRendererRule({roles:["checkbox"],elems:[],modes:["item","checkbox","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a=e.getNode(),n=m(e,"checkbox"),r="";return r="mixed"===a.getAttribute("aria-checked")?"half checked":(a.hasAttribute("aria-checked")?"true"===a.getAttribute("aria-checked"):a.checked)?"checked":"not checked",r+=g(e.getElement()),"[".concat(n,", ").concat(r).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["cell","columnheader","rowheader"],elems:[],modes:["item","table"],tests:[function(e){var t;if(!e.isStartTag())return null;var i=e.getElement();if(!i)return null;var a=(null===(t=i.textContent)||void 0===t?void 0:t.trim())||"",n=new o.DOMWalker(i,!1,i,!1),s=a.length>0;if(!s)for(;n.nextNode();)if(1===n.node.nodeType&&!n.bEndTag){var u=n.node,d=r.AriaUtil.getResolvedRole(u);if(d&&l.ARIADefinitions.designPatterns[d]){s=!0;break}if("IMG"===u.nodeName.toUpperCase()&&u.hasAttribute("alt")){s=!0;break}}return s?null:"[blank]"}]}),new n.SRRendererRule({roles:["combobox"],elems:[],modes:["item","combo","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=m(e,"combo box"),i=e.getElement(),n="";if("SELECT"===e.getNode().nodeName.toUpperCase()){n=", collapsed";var r=e.getElement(),l=r.selectedIndex>=0?r.options[r.selectedIndex]:null,o="";return l&&(o=d(new a.SRCursor(l,!1),", ")),n+=g(i),"[".concat(u(e)).concat(t).concat(n).concat(o,"]")}if("INPUT"===e.getNode().nodeName.toUpperCase())return i.hasAttribute("aria-expanded")&&(n=", ".concat("true"===i.getAttribute("aria-expanded")?"expanded":"collapsed")),n+=g(i),"[".concat(u(e)).concat(t).concat(n,", has auto complete, editable, opens list]");i.hasAttribute("aria-expanded")&&(n=", ".concat("true"===i.getAttribute("aria-expanded")?"expanded":"collapsed"),i.hasAttribute("aria-autocomplete")&&(n+=", has auto complete")),n+=g(i),o="";var s=i.getAttribute("aria-controls"),c=s?document.getElementById(s):null;if(c){var p=c.querySelector("[role='option'][aria-selected='true']");p&&(o=', "'.concat((p.textContent||"").trim(),'"'))}if(!o){var h=(i.textContent||"").trim();h&&(o=', "'.concat(h,'"'))}return"[".concat(u(e)).concat(t).concat(n).concat(o,"]")}]}),new n.SRRendererRule({roles:["listbox"],elems:[],modes:["item","combo","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=m(e,"list box"),i=e.getElement(),n="";if("SELECT"===e.getNode().nodeName.toUpperCase()){var r=e.getElement(),l=Array.from(r.options).filter(function(e){return e.selected}).map(function(e){return d(new a.SRCursor(e,!1),", ")}).join("");return n+=g(i),"[".concat(u(e)).concat(t).concat(n).concat(l,"]")}n+=g(i);var o=(i.textContent||"").trim(),s=o?', "'.concat(o,'"'):"";return"[".concat(u(e)).concat(t).concat(n).concat(s,"]")}]}),new n.SRRendererRule({roles:["default"],elems:[],modes:["item"],tests:[function(e){var t;return e.isStartTag()?"!!<".concat(e.getRole(),">").concat((null===(t=e.getNameInfo())||void 0===t?void 0:t.name)+"","!!"):"!!</".concat(e.getRole(),">!!")}]}),new n.SRRendererRule({roles:["deletion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[deleted]":""}]}),new n.SRRendererRule({roles:["dialog"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[End of dialog]":"[Start of dialog".concat(d(e))}]}),new n.SRRendererRule({roles:["generic","paragraph"],elems:["DIV","SPAN","P","SECTION","ARTICLE","HEADER","FOOTER","MAIN","ASIDE","NAV","LI","TD","TH","PRE","BLOCKQUOTE","FIGURE","FIGCAPTION","DETAILS","SUMMARY"],modes:["item","tab_focus"],tests:[function(e,t,i){var a,n=e.getElement();if(!n)return null;var r=n.getAttribute("contenteditable");if("true"!==r&&""!==r)return null;if(n.hasAttribute("role"))return null;var l="paragraph"===e.getRole()||"P"===n.nodeName.toUpperCase();if(e.isEndTag())return"item"===i?l?"[out of paragraph]":"[out of section]":"";var o="";(n.hasAttribute("disabled")||"true"===n.getAttribute("aria-disabled"))&&(o=", disabled");var s=l?"paragraph":"section",d=e.getNameInfo(),c=!d||["content","text"].includes(d.nameFrom),m="tab_focus"!==i||c?"":null===(a=n.textContent)||void 0===a?void 0:a.trim(),p=m?" ".concat(m):"";return"[".concat(u(e)).concat(s,", editable").concat(o,"]").concat(p)}]}),new n.SRRendererRule({roles:["document","generic"],elems:[],modes:["item"],tests:[function(){return""}]}),new n.SRRendererRule({roles:["graphics-document"],elems:[],modes:["item","image"],tests:[function(e){var t,i;return e.isStartTag()&&!(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&""!==(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]":null},function(e){var t;return e.isStartTag()&&""===(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)?"":null},function(e){var t;return e.isStartTag()&&(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&"[graphic".concat(d(e),"]")||null},function(e){return e.isEndTag()?"":null}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&e.isStartTag())return"";if("item"===i&&e.isEndTag())return"";var a,n=e.getElement();a=n.ariaLevel?n.ariaLevel:"heading"===n.getAttribute("role")?"2":n.nodeName.substring(1);var r=e.getNameInfo();return r&&!["content","text"].includes(r.nameFrom)||(n.textContent||"").trim()?r&&!["content","text"].includes(r.nameFrom)?"[heading level ".concat(a).concat(d(e),"]"):"[heading level ".concat(a,"]"):""}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["heading","h1","h2","h3","h4","h5","h6"],tests:[function(e){if(e.isStartTag()){var t,i=e.getNode();t=i.ariaLevel?i.ariaLevel:"heading"===i.getAttribute("role")?"2":i.nodeName.substring(1);var a=e.getNameInfo();return a&&!["content","text"].includes(a.nameFrom)||(i.textContent||"").trim()?"[".concat(u(e),"heading level ").concat(t,"]"):""}return""}]}),new n.SRRendererRule({roles:["img"],elems:[],modes:["item","image"],tests:[function(e){var t,i,a;return e.isEndTag()?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""===(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?""===(null===(a=e.getNameInfo())||void 0===a?void 0:a.name)?"":"[graphic".concat(d(e),"]"):e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]"}]}),new n.SRRendererRule({roles:["insertion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[inserted]":""}]}),new n.SRRendererRule({roles:["link"],elems:[],modes:["item","region","link","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&!["content","text"].includes(null===(a=e.getNameInfo())||void 0===a?void 0:a.nameFrom)?p(e,i):null}]}),new n.SRRendererRule({roles:["listitem"],elems:[],modes:["item"],tests:[function(e){for(var t,i,a,n=o.DOMWalker.parentNode(e.getNode());void 0===i&&n;)1===n.nodeType&&((p=n).hasAttribute("role")?"list"===p.getAttribute("role")&&(i=!1,a=p):"UL"===p.nodeName.toUpperCase()?(i=!1,a=p):"OL"===p.nodeName.toUpperCase()&&(i=!0,a=p)),n=o.DOMWalker.parentNode(n);var r=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",l="";if(i){var s=1;if(a&&"OL"===a.nodeName.toUpperCase()&&a.hasAttribute("start")){var u=parseInt(a.getAttribute("start")||"1",10);s=isNaN(u)?1:u}for(var d=e.getElement(),c=o.DOMWalker.previousSiblingNotOwnedBySlot(d);c;){if(1===c.nodeType){var m=c;"listitem"!==m.getAttribute("role")&&"LI"!==m.nodeName.toUpperCase()||s++}c=o.DOMWalker.previousSiblingNotOwnedBySlot(c)}l=e.isStartTag()?"".concat(s,". ").concat(r):""}else{var p;l="LI"===(p=e.getElement()).nodeName.toUpperCase()&&"none"===window.getComputedStyle(p).listStyleType||"LI"!==p.nodeName.toUpperCase()?e.isStartTag()?"".concat(r):"":e.isStartTag()?"[bullet] ".concat(r):""}return l}]}),new n.SRRendererRule({roles:["math"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[math content]":""}]}),new n.SRRendererRule({roles:["menuitem"],elems:[],modes:["item","tab_focus","region"],tests:[function(e){var t="";if(e.isStartTag()){var i="",a=e.getElement();"true"===a.getAttribute("aria-haspopup")&&(i+=", sub-menu"),a.hasAttribute("aria-expanded")&&(i+=", ".concat("true"===a.getAttribute("aria-expanded")?"expanded":"collapsed")),t="[menu".concat(i);var n=e.getNameInfo();n&&!["content","text"].includes(n.nameFrom)&&(t+=d(e)),t+="]"}return t}]}),new n.SRRendererRule({roles:["meter"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["progressbar"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["radio"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a,n=m(e,"radio button");a=e.getElement().hasAttribute("aria-checked")?"true"===e.getElement().getAttribute("aria-checked"):e.getNode().checked;var r=g(e.getElement());return"[".concat(n,", ").concat(a?"checked":"not checked").concat(r).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["searchbox"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[".concat(u(e),"edit]"):""}]}),new n.SRRendererRule({roles:["separator"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[separator]":""}]}),new n.SRRendererRule({roles:["slider"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"slider"),n=e.getElement(),r=n.hasAttribute("aria-valuenow")?n.getAttribute("aria-valuenow"):e.getNode().value;return"[".concat(u(e)).concat(a,", ").concat(r).concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["spinbutton"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"spinbutton");return"[".concat(u(e)).concat(a,", editable").concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["tab"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(!e.isStartTag())return"";var t=m(e,"tab");return"[".concat(t).concat("true"===e.getNode().getAttribute("aria-selected")?", selected":"").concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tablist"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[group start".concat(d(e),"]"):"[group end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tabpanel"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[Tab panel start".concat(d(e),"]"):"[Tab panel end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["item","link","tab_focus","region"],tests:[function(e){var t,i,a,n;if(e.isEndTag()||!(null===(t=e.getParentElement())||void 0===t?void 0:t.getElement()))return null;var r=null===(i=e.getParentElement())||void 0===i?void 0:i.getElement();return"line-through"===r.ownerDocument.defaultView.getComputedStyle(r).textDecorationLine?"[strikethrough] ".concat((null===(a=e.getNameInfo())||void 0===a?void 0:a.name)+""," [end strikethrough]"):"".concat((null===(n=e.getNameInfo())||void 0===n?void 0:n.name)+"")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["heading"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["textbox"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){var a,n=e.getElement();if(e.isEndTag())return"item"===i&&"TEXTAREA"===n.nodeName.toUpperCase()?"[out of edit]":"";if(!e.isStartTag())return"";var r="";n.hasAttribute("placeholder")&&n.getAttribute("placeholder").trim().length>0&&(r+=", placeholder: ".concat(n.getAttribute("placeholder"))),r+=g(n);var l="TEXTAREA"===n.nodeName.toUpperCase()||"true"===n.getAttribute("aria-multiline"),o=h(n,i);if(l){var s="tab_focus"===i?null===(a=n.textContent)||void 0===a?void 0:a.trim():"",d=s?" ".concat(s):"";return"[".concat(u(e),"edit, multiline").concat(r).concat(o,"]").concat(d)}return"[".concat(u(e),"edit").concat(r).concat(o,"]")}]}),new n.SRRendererRule({roles:["treeitem"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=e.getElement(),i="[treeview item";"true"===t.getAttribute("aria-selected")&&(i+=", selected"),t.hasAttribute("aria-expanded")&&(i+="true"===t.getAttribute("aria-expanded")?", expanded":", collapsed");var a=t.getAttribute("aria-level");if(a)i+=", level ".concat(a);else{for(var n=1,l=o.DOMWalker.parentElement(t);l;){var s=r.AriaUtil.getResolvedRole(l);if("group"===s||"tree"===s)for(var u=o.DOMWalker.parentElement(l);u;){var d=r.AriaUtil.getResolvedRole(u);if("treeitem"===d){n++;break}if("tree"===d)break;u=o.DOMWalker.parentElement(u)}l=o.DOMWalker.parentElement(l)}n>1&&(i+=", level ".concat(n))}var c=t.getAttribute("aria-posinset"),m=t.getAttribute("aria-setsize");if(!c||!m){var p=0,h=0,g=o.DOMWalker.parentElement(t);if(g)for(var b=o.DOMWalker.firstChildNotOwnedBySlot(g);b;){if(1===b.nodeType){var _=b;"treeitem"===r.AriaUtil.getResolvedRole(_)&&(h++,_===t&&(p=h))}b=b.nextSibling}c=p.toString(),m=h.toString()}return i+", ".concat(c," of ").concat(m,"] ")}]}),new n.SRRendererRule({roles:[],elems:["PRE"],modes:["item"],tests:[function(e){var t,i;if(e.isEndTag())return"";if(void 0===e.preLineIndex)return null;for(var a=(null!==(t=e.getNode().textContent)&&void 0!==t?t:"").split("\n"),n=0;n<a.length&&""===a[n].trim();)n++;for(var r=a.length-1;r>=n&&""===a[r].trim();)r--;return null!==(i=a.slice(n,r+1)[e.preLineIndex])&&void 0!==i?i:""}]}),new n.SRRendererRule({roles:[],elems:["BODY"],modes:["item","tab_focus"],tests:[function(e){if(e.getNode().ownerDocument!==document)return"";var t=e.getNode().ownerDocument.title;return e.isEndTag()?"[End of document".concat(t.trim().length>0?": "+t.trim():"","]"):"[Start of document".concat(t.trim().length>0?": "+t.trim():"","]")}]}),new n.SRRendererRule({roles:[],elems:["IFRAME"],modes:["tab_focus"],tests:[function(e){if(e.isEndTag())return null;var t=e.getElement().getAttribute("role"),i="none"===t||"presentation"===t;if(i&&!e.getName())return null;var a=i?"grouping":"frame";return"[".concat(u(e)).concat(a,"]")}]}),new n.SRRendererRule({roles:[],elems:["BR"],modes:["item"],tests:[function(e){try{for(var t=e.clone();t.previous(function(){return!0})&&"BR"!==t.getNode().nodeName.toUpperCase()&&t.getNameInfo()&&0===t.getNameInfo().name.trim().length;);return"BR"===t.getNode().nodeName.toUpperCase()?"[blank]":null}catch(e){console.error(e)}}]}),new n.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:[],elems:["INPUT"],modes:["item","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&"password"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))&&"[".concat(u(e),"edit, protected").concat(h(e.getElement(),i),"]")||null},function(e,t,i){var a,n;if(e.isStartTag()&&"file"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var r=(null===(n=e.getElement())||void 0===n?void 0:n.value)||"";return r=""===r?"No file chosen":r.substring(12),"[".concat(u(e),"button").concat(h(e.getElement(),i),"] [").concat(u(e)).concat(r,"]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"color"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r=(100*Number("0x".concat(n.substring(1,3)))/Number("0xff")).toFixed(0),l=(100*Number("0x".concat(n.substring(3,5)))/Number("0xff")).toFixed(0),o=(100*Number("0x".concat(n.substring(5)))/Number("0xff")).toFixed(0);return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [").concat(r,"% red ").concat(l,"% green ").concat(o,"% blue]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"month"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0";if(n.trim().length>0){var o=new Date(n);r=""+o.getFullYear(),l=""+(o.getMonth()+1)}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"] [spin button, ").concat(r,"] [menu button] [subMenu] Show month picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"date"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0",o="0";if(n.trim().length>0){var s=new Date(n);r=""+s.getFullYear(),l=""+(s.getMonth()+1),o=""+s.getDate()}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"] / [spin button, ").concat(o,"] / [spin button, ").concat(r,"] [menu button] [subMenu] Show date picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"datetime-local"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0",o="0",s="0",d="0",c="0";if(n.trim().length>0){var m=new Date(n);r=""+m.getFullYear(),l=""+(m.getMonth()+1),o=""+m.getDate(),s=0===m.getHours()||12===m.getHours()?"12":m.getHours()<12?""+m.getHours():""+(m.getHours()-12),d=""+m.getMinutes(),c=m.getHours()>=12?"pm":"am"}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"] / [spin button, ").concat(o,"] / [spin button, ").concat(r,"] [spin button, ").concat(s,"] : [spin button, ").concat(d,"] [spin button, ").concat(c,"] [menu button] [subMenu] Show local date and time picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"time"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0",o="0";if(n.trim().length>0){var s=n.split(":"),d=parseInt(s[0]);r=0===d||12===d?"12":d<12?""+d:""+(d-12),l=s[1],o=d>=12?"pm":"am"}return"[".concat(u(e),"grouping clickable").concat(h(e.getElement(),i)," [spin button, ").concat(r,"] : [spin button, ").concat(l,"] [spin button, ").concat(o,"] [menu button] [subMenu] Show time picker [out of grouping]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"week"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0";if(n.trim().length>0){var o=n.split(/-W/);r=o[0],l=o[1]}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"], [spin button, ").concat(r,"] [menu button] [subMenu] Show week picker")}return null},function(e){var t;return"hidden"===(null===(t=e.getElement())||void 0===t?void 0:t.getAttribute("type"))?"":null},function(e){return e.isStartTag()&&"!![".concat(u(e),"input!!]").concat(e.getElement().outerHTML)||null}]}),new n.SRRendererRule({roles:[],elems:["LI"],modes:["item"],tests:[function(e){var t,i=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",a=e.getElement();return"none"===window.getComputedStyle(a).listStyleType?e.isStartTag()?"".concat(i):"":e.isStartTag()?"[bullet] ".concat(i):""}]}),new n.SRRendererRule({roles:[],elems:["MFRAC"],modes:["item"],tests:[function(e){return e.isStartTag()?"[fraction]":"[end fraction]"}]}),new n.SRRendererRule({roles:[],elems:["MROW"],modes:["item"],tests:[function(e){var t;if(!e.isStartTag()){var i=e.getCurrentOrParentByRoleClone([],["mfrac"]);return i&&(null===(t=i.getElement().querySelectorAll("mrow")[0])||void 0===t?void 0:t.isSameNode(e.getNode()))?"[over]":void 0}}]}),new n.SRRendererRule({roles:[],elems:["MSQRT"],modes:["item"],tests:[function(e){return e.isStartTag()?"[square root]":"[end root]"}]}),new n.SRRendererRule({roles:[],elems:["MSUP"],modes:["item"],tests:[function(e){var t,i;if(!e.isEndTag()){var a=(null===(t=e.getElement().querySelector("mi"))||void 0===t?void 0:t.innerHTML)||"",n=(null===(i=e.getElement().querySelector("mn"))||void 0===i?void 0:i.innerHTML)||"";return"2"===n?"".concat(a," [squared]"):"3"===n?"".concat(a," [cubed]"):"".concat(a," [to the ").concat(n,"]")}}]}),new n.SRRendererRule({roles:[],elems:["SUMMARY"],modes:["item","button","tab_focus"],tests:[function(e,t,i){var a,n;if(e.isEndTag())return"";var r=e.getElement();if(!r)return null;var l=r.parentElement;if(!l||"DETAILS"!==l.nodeName.toUpperCase())return null;var o=Array.from(l.children).find(function(e){return"SUMMARY"===e.nodeName.toUpperCase()});if(!o||!o.isSameNode(r))return null;var s=l.hasAttribute("open")?"expanded":"collapsed",u=null===(a=r.getAttribute("aria-label"))||void 0===a?void 0:a.trim(),d=(null===(n=r.textContent)||void 0===n?void 0:n.trim())||"",c=u||d,m=c?'"'.concat(c,'", '):"",p=h(r,i);return!p&&u&&d&&(p="item"===i?", ".concat(d,""):', "'.concat(d,'"')),"[".concat(m,"button, ").concat(s).concat(p,"]")}]}),new n.SRRendererRule({roles:["article","banner","blockquote","caption","cell","code","columnheader","complementary","contentinfo","figure","form","group","list","main","mark","navigation","region","row","rowheader","search","table","toolbar"],elems:[],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["paragraph","rowgroup","status","strong","subscript","superscript","term","time","none","presentation"],elems:[],modes:["item"],tests:[function(e){return""}]})]},8485(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(369),r=i(7242),l=i(7011),o=i(9910),s=i(7139);function u(e,t){var i;t&&"#text"===(null===(i=t.getNode())||void 0===i?void 0:i.nodeName)&&(t=t.clone()).previous(function(){return!0});var a=n.SRTableUtil.getTableModel(e),r=n.SRTableUtil.getCellModel(t,a),l=n.SRTableUtil.getCellModel(e,a);if(!l)return"";var o=[];if(!r||r.rowIndexStart!==l.rowIndexStart||r.rowspan!==l.rowspan){var s=n.SRTableUtil.getRowHeadersForCursor(e,a),u=s&&s.trim().length>0?'"'.concat(s,'", '):"";o.push("[".concat(u,"row ").concat(l.rowIndexStart+1).concat(l.rowspan>1?" through "+(l.rowIndexStart+l.rowspan):"","]"))}if(!r||r.colIndexStart!==l.colIndexStart||r.colspan!==l.colspan){var d=n.SRTableUtil.getColumnHeadersForCursor(e,a);u=d&&d.trim().length>0?'"'.concat(d,'", '):"",o.push("[".concat(u,"column ").concat(l.colIndexStart+1).concat(l.colspan>1?" through "+(l.colIndexStart+l.colspan):"","]"))}return o.join(" ")}t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item","article","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"article");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"banner region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item","region"],tests:[function(e){return"[blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item","region"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:["cell"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["columnheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"complementary region]"):null}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"content info region]"):null}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[section]":"[".concat((0,r.quoteNamePadAfter)(e),"form region]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item","region"],tests:[function(e){var t;if("DETAILS"===e.getNode().nodeName.toUpperCase()){var i=e.getElement();return Array.from(i.children).some(function(e){return"SUMMARY"===e.nodeName.toUpperCase()})?"":'["Details", button, '.concat(i.hasAttribute("open")?"expanded":"collapsed","]")}return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"[grouping".concat((0,r.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["tab_focus"],tests:[function(e){var t;if("DETAILS"===e.getNode().nodeName.toUpperCase()){var i=e.getElement();return Array.from(i.children).some(function(e){return"SUMMARY"===e.nodeName.toUpperCase()})?null:'["Details", button, '.concat(i.hasAttribute("open")?"expanded":"collapsed","]")}return null===e.getNameInfo()?null:(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t||t.getNode().nodeName.toUpperCase(),"")}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item","list"],tests:[function(e){for(var t,i=e.getNode(),a=document.evaluate(".//li | .//*[@role='listitem']",i,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),n=0,s=0;s<a.snapshotLength;s++){for(var u=!1,d=!1,c=a.snapshotItem(s).parentElement;c&&c!==i;){var m=l.AriaUtil.getResolvedRole(c);if("list"===m||"UL"===c.nodeName.toUpperCase()||"OL"===c.nodeName.toUpperCase()){u=!0;break}if(m&&(null===(t=o.ARIADefinitions.designPatterns[m])||void 0===t?void 0:t.presentationalChildren)){d=!0;break}c=c.parentElement}u||d||n++}return 0===n?null:"[".concat((0,r.quoteNamePadAfter)(e),"list of ").concat(n," items]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"main region]"):null}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);console.log("MENUBAR",e.isEndTag()?"/":"",e.getNode()),console.log(i,a);var n=i.snapshotLength-a.snapshotLength;return 0===n?null:"[".concat((0,r.quoteNamePadAfter)(e),"menubar with ").concat(n," items]")}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"navigation region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return null===e.getNameInfo()?null:"[grouping".concat((0,r.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if(null===e.getNameInfo())return null;if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["row"],elems:[],modes:["item","table"],tests:[function(){return""}]}),new a.SRRendererRule({roles:["rowheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"search region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item","table"],tests:[function(e){for(var t=e.clone();"table"!==t.getRole()&&t.previous(function(){return!0}););var i=t.getNode(),a=0,n=0;if(t.getNode().firstChild)for(var l=!1;t.next(function(){return!0})&&!t.getNode().isSameNode(i);){var o=t.getRole();if(t.isStartTag()){if("row"===o)++a;else if(!l&&["cell","rowheader","columnheader"].includes(o)){var s=t.getNode();n+=parseInt(s.getAttribute("colspan")||"1")}}else"row"===o&&(l=!0)}return"[table with ".concat(a," ").concat(1===a?"row":"rows"," and ").concat(n," ").concat(1===n?"column":"columns").concat((0,r.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"toolbar]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//dt",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotLength;return"[".concat((0,r.quoteNamePadAfter)(e),"definition list of ").concat(i," terms]")}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[highlighted]"}]}),new a.SRRendererRule({roles:[],elems:["IFRAME"],modes:["item"],tests:[function(e){var t=e.getElement().getAttribute("role"),i="none"===t||"presentation"===t;if(i&&!e.getName())return null;var a=i?"grouping":"frame";return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:[],elems:["PRE"],modes:["item"],tests:[function(e){return"[".concat((0,r.quoteNamePadAfter)(e),"preformatted text]")}]}),new a.SRRendererRule({roles:["article","banner","blockquote","caption","cell","columnheader","complementary","contentinfo","figure","form","group","region","row","rowheader","search","toolbar","list","main","navigation","table"],elems:[],modes:["heading"],tests:[function(){return""}]})]},2099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(7242);t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"article");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"banner region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item"],tests:[function(e){return"[out of blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"complementary region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"content info region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[out of figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[out of section]":"[out of form]"}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item"],tests:[function(e){var t;return"DETAILS"===e.getNode().nodeName.toUpperCase()?"":null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"[out of grouping]"}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//li | .//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);return 0===i.snapshotLength-a.snapshotLength?null:"[".concat((0,n.quoteNamePadAfter)(e),"out of list]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"main region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){return"[out of menubar]"}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"navigation region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return"[out of grouping]"}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item"],tests:[function(e){if(null===e.getNameInfo())return null;var t=(0,n.getRoleDescription)(e,"region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"search region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item"],tests:[function(e){return"[out of table]"}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item"],tests:[function(e){return"[out of toolbar]"}]}),new a.SRRendererRule({roles:[],elems:["ABBR"],modes:["item"],tests:[function(e){return e.getElement().hasAttribute("title")?"[".concat(e.getElement().getAttribute("title"),"]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return"[out of definition list]"}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[out of highlighted]"}]}),new a.SRRendererRule({roles:[],elems:["IFRAME"],modes:["item"],tests:[function(e){var t=e.getElement().getAttribute("role"),i="none"===t||"presentation"===t;return i&&!e.getName()?null:i?"[out of grouping]":"[out of frame]"}]}),new a.SRRendererRule({roles:[],elems:["PRE"],modes:["item"],tests:[function(e){return"[out of preformatted text]"}]}),new a.SRRendererRule({roles:["group","article","banner","blockquote","caption","complementary","contentinfo","figure","form","list","region","main","navigation","search","table","toolbar"],elems:[],modes:["region","heading"],tests:[function(){return""}]})]},2151(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CONTAINER_EXIT_RULES=t.CONTAINER_ENTER_RULES=t.SR_RULES=void 0;var a=i(7242),n=i(8485),r=i(2099);t.SR_RULES=a.RULES,t.CONTAINER_ENTER_RULES=n.RULES,t.CONTAINER_EXIT_RULES=r.RULES},1950(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.AccNameUtil=void 0;var a=i(9910),n=i(7139),r=i(7011),l=i(3946),o=i(4566),s=i(3864),u=i(1686),d=function(){function e(){}return e.computeAccessibleNameForSVGElementW3C=function(e){if(!e||"svg"!==e.nodeName.toLowerCase())return null;var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a="",o=e.querySelectorAll("text, textPath, tspan");if(o&&o.length>0&&(o.forEach(function(e){if(!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(a+=" "+t.trim())}}),""!==a.trim()))return{name:n.CommonUtil.truncateText(a.trim()),nameFrom:"svgText"};for(var s=e.querySelectorAll("a"),u=0;u<s.length;u++){var d=s[u];if(!l.VisUtil.isNodeHiddenFromAT(d)&&!l.VisUtil.isNodePresentational(d)){var c=d.getAttribute("xlink:title");if(c&&""!==c.trim())return{name:n.CommonUtil.truncateText(c),nameFrom:"svglinkTitle"}}}var m=r.AriaUtil.getAriaDescription(e);if(m&&""!==m.trim())return{name:n.CommonUtil.truncateText(m),nameFrom:"aria-description"};var p=e.querySelectorAll(":scope > desc");if(p&&p.length>0){var h="";if(p.forEach(function(e){if(!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(h+=" "+t.trim())}}),""!==h.trim())return{name:h.trim(),nameFrom:"svgDesc"}}if(e.hasAttribute("title")){var g=e.getAttribute("title");if(g&&""!==g.trim())return{name:n.CommonUtil.truncateText(g),nameFrom:"title"}}return null},e.computeAccessibleName=function(t){if(!t)return null;var i=t.nodeName.toLowerCase(),l=o.CacheUtil.getCache(t,"ELEMENT_ACCESSBLE_NAME",void 0);if(void 0!==l)return l;var s=r.AriaUtil.getAriaLabel(t);if(s&&""!==s.trim())return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"}),{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"};if(l=e.computeAccessibleNameForNativeElement(t))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",l),l;var u=r.AriaUtil.getResolvedRole(t);if(a.ARIADefinitions.designPatterns[u]&&a.ARIADefinitions.designPatterns[u].nameFrom.includes("contents")&&(l=e.computeAccessibleNameFromContent(t)))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",l),l;if(t.hasAttribute("title")){var d=t.getAttribute("title").trim();if(d&&d.trim().length>0)return d=n.CommonUtil.truncateText(d),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:d,nameFrom:"title"}),{name:d,nameFrom:"title"}}if("textarea"===i||"input"===i&&(!t.hasAttribute("type")||n.CommonUtil.input_type_with_placeholder.includes(t.getAttribute("type")))){var c=t.getAttribute("placeholder");if(c&&c.trim().length>0)return c=n.CommonUtil.truncateText(c),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:c,nameFrom:"placeholder"}),{name:c,nameFrom:"placeholder"}}return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",null),null},e.computeAccessibleNameForNativeElement=function(t){var i,a,r=t.nodeName.toLowerCase();if(n.CommonUtil.form_labelable_elements.includes(r)&&(p=n.CommonUtil.getFormFieldLabel(t))&&""!==p.trim())return{name:n.CommonUtil.truncateText(p),nameFrom:"label"};if("input"===r&&t.hasAttribute("type"))if(n.CommonUtil.form_button_types.includes(t.getAttribute("type"))){var o=n.CommonUtil.getElementAttribute(t,"value");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"value"};var s=t.getAttribute("type");if("submit"===s||"reset"===s)return{name:s,nameFrom:"internal"}}else if("image"===t.getAttribute("type")&&(b=n.CommonUtil.getElementAttribute(t,"alt"))&&""!==b.trim())return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("button"===r){if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var d=t.querySelector("img");if(d&&!l.VisUtil.isNodeHiddenFromAT(d)&&!l.VisUtil.isNodePresentational(d)&&(a=e.computeAccessibleName(d))&&a.name&&a.name.trim().length>0)return a;var c=t.querySelector("svg");if(c&&!l.VisUtil.isNodeHiddenFromAT(c)&&!l.VisUtil.isNodePresentational(c)&&(a=e.computeAccessibleName(c))&&a.name&&a.name.trim().length>0)return a}if("fieldset"===r&&(i=t.firstElementChild)&&"legend"===i.nodeName.toLowerCase()&&(v=i.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("output"===r&&t.hasAttribute("for")){var m=t.getAttribute("for").trim().split(" ");if(m&&m.length>0){for(var p="",h=0;h<m.length;h++){var g=t.ownerDocument.getElementById(m[h]);!g||u.DOMUtil.sameNode(g,t)||l.VisUtil.isNodeHiddenFromAT(g)||l.VisUtil.isNodePresentational(g)||(a=e.computeAccessibleName(g))&&a.name&&a.name.trim().length>0&&(p+=" "+n.CommonUtil.normalizeSpacing(a.name))}if(p.trim().length>0)return{name:n.CommonUtil.truncateText(p),nameFrom:"label"}}}if("summary"===r&&(v=t.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("details"===r)return(i=t.firstElementChild)&&"summary"===i.nodeName.toLowerCase()&&(a=e.computeAccessibleName(i))&&a.name&&a.name.trim().length>0?{name:n.CommonUtil.truncateText(a.name.trim()),nameFrom:"summary"}:{name:"details",nameFrom:"internal"};if("figure"===r&&(_=n.CommonUtil.getChildByTagHidden(t,"figcaption",!0,!1))&&_.length>0&&(v=_[0].innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"figcaption"};if("img"===r&&t.hasAttribute("alt")){var b=t.getAttribute("alt");return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"}}if("area"===r&&t.hasAttribute("alt")&&(b=t.getAttribute("alt"))&&b.trim().length>0)return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("table"===r){var _,f=t.firstElementChild;if(f&&"caption"===f.nodeName.toLowerCase()&&(_=f.innerText)&&_.trim().length>0)return{name:n.CommonUtil.truncateText(_),nameFrom:"caption"}}if("a"===r){var v;if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var A=t.querySelectorAll(":scope > img, :scope > svg");if(A&&A.length>0){var w="";if(A.forEach(function(t){if(!l.VisUtil.isNodeHiddenFromAT(t)&&!l.VisUtil.isNodePresentational(t)){var i=e.computeAccessibleName(t);i&&i.name&&i.name.trim().length>0&&(w+=" "+i.name.trim())}}),""!==w.trim())return{name:w.trim(),nameFrom:"alt"}}}return("optgroup"===r||"option"===r||"track"===r)&&(p=t.getAttribute("label"))&&p.trim().length>0?{name:n.CommonUtil.truncateText(p),nameFrom:"label"}:"svg"===r&&(a=e.computeAccessibleNameForSVGElementW3C(t))&&a.name&&a.name.trim().length>0?a:null},e.computeAccessibleNameForSVGElement=function(e){var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a=e.querySelector("a");if(a&&!l.VisUtil.isNodeHiddenFromAT(a)&&!l.VisUtil.isNodePresentational(a)){var o=a.getAttribute("xlink:title");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"svglinkTitle"}}var s="";if(e.querySelectorAll(":scope > *").forEach(function(e){if("svg"!==e.nodeName.toLowerCase()&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=n.CommonUtil.getInnerText(e);t&&t.trim().length>0&&(s+=t)}}),""!==s.trim())return{name:n.CommonUtil.truncateText(s),nameFrom:"svgText"};var u=r.AriaUtil.getAriaDescription(e);if(u&&u.trim().length>0)return{name:n.CommonUtil.truncateText(u),nameFrom:"aria-description"};var d=e.querySelectorAll(":scope > desc");if(d&&d.length>0){var c="";if(d.forEach(function(e){if(e&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(c+=t.trim())}}),c&&""!==c.trim())return{name:c.trim(),nameFrom:"svgDesc"}}},e.computeAccessibleNameFromContent=function(t){var i=t.nodeName.toLowerCase(),a=(r.AriaUtil.getResolvedRole(t),e.computeAccessibleNameForCSSPseudoElement(t,"before"));return null!==a&&a.name&&a.name.trim().length>0||(a=e.computeAccessibleNameForCSSPseudoElement(t,"after"))&&a.name&&a.name.trim().length>0?a:t.shadowRoot&&(a=e.computeAccessibleNameForShadowHost(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"shadow"}:"slot"===i&&(a=e.computeAccessibleNameForSlotElement(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"slot"}:(a=e.computeAccessibleNameFromChildren(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"content"}:null},e.computeAccessibleNameForCSSPseudoElement=function(e,t){var i=e.ownerDocument.defaultView.getComputedStyle(e,t);if(i){var a=i.content;if(a&&"none"!==a&&"no"!==a&&"normal"!==a&&(a=a.replace(/^"/,"").replace(/"$/,"")).trim().length>0)return{name:n.CommonUtil.truncateText(a),nameFrom:"css-"+t}}return null},e.computeAccessibleNameForShadowHost=function(t){var i="",a=t.shadowRoot;return a&&a.querySelectorAll("*").forEach(function(t){var a=e.computeAccessibleName(t);a&&a.name&&a.name.trim().length>0&&(i+=" "+a.name.trim())}),i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"shadow-host"}:null},e.computeAccessibleNameForSlotElement=function(t){var i="";if(t.assignedNodes()&&0!==t.assignedNodes().length)for(var a=0,r=t.assignedNodes();a<r.length;a++){var l,o=r[a];(l=e.computeAccessibleName(o))&&l.name&&l.name.length>0&&(i+=" "+l.name.trim())}else(l=e.computeAccessibleName(t))&&l.name&&l.name.trim().length>0&&(i+=" "+l.name.trim());return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content-slot"}:null},e.computeAccessibleNameFromChildren=function(t){for(var i="",a=new s.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){var o=a.node;if(3===o.nodeType){var u=o.parentElement;!l.VisUtil.isNodeHiddenFromAT(u)&&!l.VisUtil.isNodePresentational(u)&&o.nodeValue&&o.nodeValue.trim().length>0&&(i+=" "+o.nodeValue.trim())}else if(1===o.nodeType&&!l.VisUtil.isNodeHiddenFromAT(o)&&!l.VisUtil.isNodePresentational(o)){var d=e.computeAccessibleName(o);d&&d.name&&d.name.length>0?(i+=" "+d.name.trim(),a.bEndTag=!0):r.AriaUtil.containsPresentationalChildrenOnly(a.node)&&(a.bEndTag=!0)}}return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content"}:null},e.isAccessibleNameIgnorable=function(e){if(!e)return!1;var t=e.nodeName.toLowerCase();if("img"!==t&&"svg"!==t)return!1;var i=e.parentElement;return!(!i||!r.AriaUtil.isWidget(i)&&!r.AriaUtil.containsPresentationalChildrenOnly(i)||!r.AriaUtil.hasAriaLabel(i))},e}();t.AccNameUtil=d},7011(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,r=t.length;n<r;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.AriaUtil=void 0;var n=i(4566),r=i(9910),l=i(9955),o=i(3864),s=i(3946),u=i(7139),d=i(1950),c=i(5279),m=i(1686),p=function(){function e(){}return e.isDefinedAriaAttributeAtIndex=function(t,i){var a=t.attributes[i].name;return e.isDefinedAriaAttribute(t,a)},e.getUserDefinedAriaAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)&&t.push(n)}return t},e.getUserDefinedHtmlAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)||t.push(n)}return t},e.getUserDefinedAriaAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),r=e.getAttribute(n);""===r&&(r=null),"aria-"===n.substring(0,5)&&t.push({name:n,value:r})}return t},e.getUserDefinedHtmlAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),r=e.getAttribute(n);""===r&&(r=null),"aria-"===n.substring(0,5)||t.push({name:n,value:r})}return t},e.getAriaAttribute=function(t,i){var a=t.getAttribute(i);if(t.hasAttribute(i)&&""===a.trim())return a;if(!a){var n=t.nodeName.toLowerCase();i in e.ariaAttributeImplicitMappings&&(n in e.ariaAttributeImplicitMappings[i]?"function"==typeof(a=e.ariaAttributeImplicitMappings[i][n])&&(a=a(t)):"*"in e.ariaAttributeImplicitMappings[i]&&"function"==typeof(a=e.ariaAttributeImplicitMappings[i]["*"])&&(a=a(t)))}if(!a){var r=l.ARIAMapper.nodeToRole(t);r in e.ariaAttributeRoleDefaults&&i in e.ariaAttributeRoleDefaults[r]&&"function"==typeof(a=e.ariaAttributeRoleDefaults[r][i])&&(a=a(t))}return!a&&i in e.ariaAttributeGlobalDefaults&&(a=e.ariaAttributeGlobalDefaults[i]),a},e.isDefinedAriaAttribute=function(e,t){var i=!1;return"aria-"===t.substring(0,5)&&(i=e.hasAttribute&&e.hasAttribute(t)&&e.getAttribute(t).length>0),i},e.getResolvedRole=function(t,i){if(void 0===i&&(i=!0),!t)return null;var a=n.CacheUtil.getCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",null);if(null===a){var r=e.getUserDefinedRoles(t),l=e.getElementAriaProperty(t),o=e.getAllowedAriaRoles(t,l),s=!1;if(r&&r.length>0&&o&&o.length>0){for(var d=0;d<r.length;d++)if(o.includes("any")||o.includes(r[d])){if(o.includes("any")&&"generic"===r[d]){s=!0;continue}if(("presentation"===(a=r[d])||"none"===a)&&u.CommonUtil.isFocusable(t)){a=null;continue}break}s&&(a="generic")}if(null===a&&i){var c=e.getImplicitRole(t);a=c&&c.length>0?c[0]:void 0}n.CacheUtil.setCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",a)}return void 0!==a?a:null},e.getUserDefinedRoles=function(t){return e.getRoles(t,!1)},e.getRoles=function(t,i){var a=[];if(t&&t.hasAttribute&&t.hasAttribute("role"))for(var n=u.CommonUtil.normalizeSpacing(t.getAttribute("role").trim()).split(" "),r=0;r<n.length;++r)a.push(n[r]);if(i){var l=e.getImplicitRole(t);null!==l&&l.length>0&&u.CommonUtil.concatUniqueArrayItemList(l,a)}return a},e.getImplicitRole=function(t){if(!t||1!==t.nodeType)return null;var i=n.CacheUtil.getCache(t,"AriaUtil_ImplicitRole",null);if(!i){var a=e.getElementAriaProperty(t);if(a&&a.implicitRole){if(a.implicitRole.includes("generic")){var l=e.getUserDefinedAriaAttributes(t);if(0===l.length)return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[];var o=[],s=r.ARIADefinitions.designPatterns.generic;if(s.reqProps&&s.reqProps.length>0&&u.CommonUtil.concatUniqueArrayItemList(s.reqProps,o),a.globalAriaAttributesValid&&u.CommonUtil.concatUniqueArrayItemList(r.ARIADefinitions.globalProperties,o),s.deprecatedProps&&s.deprecatedProps.length>0&&u.CommonUtil.reduceArrayItemList(s.deprecatedProps,o),o.length>0&&!o.some(function(e){return l.includes(e)})){var d=u.CommonUtil.reduceArrayItemList(["generic"],a.implicitRole);return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",d),d}}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",a.implicitRole),a.implicitRole}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[]}return i},e.getRoleRequiredProperties=function(e,t){if(null===e)return null;if(r.ARIADefinitions.designPatterns[e]){var i=r.ARIADefinitions.designPatterns[e].reqProps;return"separator"===e.toLowerCase()&&t&&u.CommonUtil.isFocusable(t)&&(i=u.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"],i||[])),i}return null},e.hasRole=function(t,i,a){var n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var r=t.getAttribute("role").trim().split(" "),l=0;!n&&l<r.length;++l)n=r[l]in i;else for(r=t.getAttribute("role").trim().split(" "),l=0;!n&&l<r.length;++l)n=r[l]===i;if(!n&&a){var o=[],s=e.getImplicitRole(t);if(null!==s&&s.length>0)if(u.CommonUtil.concatUniqueArrayItemList(s,o),"string"!=typeof i)for(l=0;!n&&l<o.length;++l)n=o[l]in i;else for(l=0;!n&&l<o.length;++l)n=o[l]===i}return n},e.hasRoleInSemantics=function(t,i){var a=!1,n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var r=t.getAttribute("role").trim().toLowerCase().split(/\s+/),l=0;!a&&l<r.length;++l)n=!0,a=r[l]in i;else for(r=t.getAttribute("role").trim().toLowerCase().split(/\s+/),l=0;!a&&l<r.length;++l)n=!0,a=r[l]===i;if(n)return a;var o=e.getImplicitRole(t);if(null!==o&&o.length>0)if("string"!=typeof i)for(l=0;!a&&l<o.length;++l)a=o[l]in i;else for(l=0;!a&&l<o.length;++l)a=o[l]===i;return a},e.hasAnyRole=function(t,i){var a=!1;if(t&&t.hasAttribute&&t.hasAttribute("role")&&(a=!0),!a&&i){var n=e.getImplicitRole(t);null!==n&&n.length>0&&(a=!0)}return a},e.isPresentationalElement=function(e){return u.CommonUtil.valInArray(e.nodeName.toLowerCase(),["abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","a","progress","meter","basefont","big","center","strike","tt","font","blink","h1","h2","h3","h4","h5","h6","hr","blockquote","p"])},e.getAncestorWithRole=function(t,i,a){for(var n=o.DOMWalker.parentNode(t);null!==n;){if(a){if(e.hasRoleInSemantics(n,i))break}else if(e.hasRole(n,i,!1))break;n=o.DOMWalker.parentNode(n)}return n},e.getAncestorWithRoles=function(t,i){if(!t||!i||!i.length||0===i.length)return null;for(var a=t;null!==a;){var n=e.getResolvedRole(a);if(null!==n&&(i.includes(n)||i.includes("*")&&!["presentation","none"].includes(n)))return a;a=o.DOMWalker.parentNode(a)}return null},e.getRolesWithTypes=function(e,t){if(!e||!t||!t.length||0===t.length)return null;var i=n.CacheUtil.getCache(e.ownerDocument,"roles_with_given_types",null);return i&&0!==i.length||(i=[],Object.entries(r.ARIADefinitions.designPatterns).forEach(function(e){var a=e[0],n=e[1];t.includes(n.roleType)&&i.push(a)}),n.CacheUtil.setCache(e.ownerDocument,"roles_with_given_types",i)),i},e.isWidget=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"is_element_widget",null);if(null===i){var a=!1,l=e.getResolvedRole(t);return l&&r.ARIADefinitions.designPatterns[l]&&"widget"===r.ARIADefinitions.designPatterns[l].roleType&&(a=!0),n.CacheUtil.setCache(t.ownerDocument,"is_element_widget",a),a}return i},e.isNavigationOwnedOrControlled=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",null);if(null!==i&&i.length>0&&u.CommonUtil.getAncestor(t,i))return!0;var a=e.getResolvedRole(t);if(!a)return!1;var r=t.getAttribute("id");return!(!r||0===r.trim().length)&&(!!t.ownerDocument.querySelector("*[aria-controls~='".concat(r,"'], *[aria-owns~='").concat(r,"']"))&&(!!["combobox","scrollbar","button","tab","listbox","menu","menubar","radiogroup","tree","treegrid"].includes(a)&&(null===i&&(i=[]),i.push(t),n.CacheUtil.setCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",i),!0)))},e.getSiblingWithRole=function(t,i){return e.getSiblingWithRoleHidden(t,i,!1)},e.getSiblingWithRoleHidden=function(t,i,a,n){var r=null,l=!1;if(t&&i){for(r=t.nextSibling;null!==r&&!l;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(r)||(l=n?e.hasRoleInSemantics(r,i):e.hasRole(r,i,!1)),r=r.nextSibling;if(!r)for(r=t.previousSibling;null!==r&&!l;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(r)||(l=e.hasRole(r,i,n)),r=r.previousSibling}return r},e.getDescendantWithRole=function(t,i){return e.getDescendantWithRoleHidden(t,i,!1)},e.getDescendantWithRoleHidden=function(t,i,a,n){for(var r=null,l=new o.DOMWalker(t);l.nextNode()&&l.node!=t&&l.node!=t.nextSibling;)if((!a||!u.CommonUtil.shouldNodeBeSkippedHidden(l.node))&&(n?e.hasRoleInSemantics(l.node,i):e.hasRole(l.node,i,!1))){r=l.node;break}return r},e.getAllDescendantsWithRoles=function(t,i,a,n){if(i&&0!==i.length){var r=[];return i.forEach(function(i){var l=e.getAllDescendantsWithRoleHidden(t,i,a,n);l&&l.length>0&&(r=r.concat(l))}),r}},e.getAllDescendantsWithRoleHidden=function(t,i,a,n){for(var r=[],l=new o.DOMWalker(t);l.nextNode()&&l.node!=t&&l.node!=t.nextSibling;)l.bEndTag||a&&u.CommonUtil.shouldNodeBeSkippedHidden(l.node)||e.hasRole(l.node,i,n)&&r.push(l.node);return r},e.getDirectATChildren=function(t){var i=e.getRequiredChildRoles(t,!0),a=[];return e.retrieveDirectATChildren(t,i,a),a},e.retrieveDirectATChildren=function(t,i,a){var n=[];if(null!==t.children&&t.children.length>0)for(var r=0;r<t.children.length;r++)n.push(t.children[r]);var l=t.getAttribute("aria-owns");if(l){var o=t.ownerDocument;if(o){var u=l.split(" ");for(r=0;r<u.length;r++){var d=o.getElementById(u[r]);d&&n.push(d)}}}if(n.length>0){for(r=0;r<n.length;r++)if(!s.VisUtil.isNodeHiddenFromAT(n[r])&&s.VisUtil.isNodeVisible(n[r])){var c=e.getRoles(n[r],!1);null!==c&&0!==c.length||(c=e.getImplicitRole(n[r])),c&&null!==c&&c.length>0&&(c=c.filter(function(e){return"none"!==e&&"presentation"!==e})).includes("group")&&i&&i.includes("group")&&(c=c.filter(function(e){return"group"!==e})),c&&null!==c&&c.length>0?a.push(n[r]):e.retrieveDirectATChildren(n[r],i,a)}return null}return null},e.getRequiredChildRoles=function(t,i){var a=e.getRoles(t,!1);if(a&&0!==a.length||!i||(a=e.getImplicitRole(t)),!a||0===a.length)return null;var n=["none","presentation"];if(a.some(function(e){return n.includes(e)}))return null;for(var l=r.ARIADefinitions.designPatterns,o=new Array,s=0;s<a.length;++s)l[a[s]]&&null!==l[a[s]].reqChildren&&(o=u.CommonUtil.concatUniqueArrayItemList(l[a[s]].reqChildren,o));return o},e.getAriaOwnsWithRole=function(t,i){return e.getAriaOwnsWithRoleHidden(t,i,!1)},e.getAriaOwnsWithRoleHidden=function(t,i,a,n){var r=null,l=!1;if(u.CommonUtil.attributeNonEmpty(t,"aria-owns")){var o=t.getAttribute("aria-owns");if(r=c.FragmentUtil.getById(t,o),m.DOMUtil.sameNode(t,r))return null;l=a&&null!=r&&u.CommonUtil.shouldNodeBeSkippedHidden(r)?null:e.hasRole(r,i,n)}return l?r:null},e.hasAriaLabel=function(e){return u.CommonUtil.attributeNonEmpty(e,"aria-label")||u.CommonUtil.attributeNonEmpty(e,"aria-labelledby")},e.hasUniqueAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,r=!1,l=null;i&&(l=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===l&&(l={});for(var o=0;!r&&o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();r=s in l,l[s]=!0}else if(t[o].hasAttribute("aria-labelledby")){var d=t[o].getAttribute("aria-labelledby"),p=c.FragmentUtil.getById(t[o],d),h="";p&&!m.DOMUtil.sameNode(p,t[o])&&(h=e.getTextContentExcludingScripts(p));var g=u.CommonUtil.normalizeSpacing(h).toLowerCase();r=g in l,l[g]=!0}else r=!0;return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",l),!r},e.getTextContentExcludingScripts=function(e){if(!e)return"";for(var t="",i=new o.DOMWalker(e);i.nextNode()&&i.node!==e&&i.node!==e.parentNode;)if(!i.bEndTag){var a=i.node,n=a.nodeName?a.nodeName.toLowerCase():"";"script"!==n&&"style"!==n?3===a.nodeType?a.nodeValue&&a.nodeValue.trim().length>0&&(t+=" "+a.nodeValue.trim()):1===a.nodeType&&("img"===n&&a.hasAttribute("alt")||"input"===n&&"image"===a.getAttribute("type")&&a.hasAttribute("alt"))&&(t+=" "+a.getAttribute("alt").trim(),i.bEndTag=!0):i.bEndTag=!0}return t.trim()},e.getAriaLabel=function(t){if(t.hasAttribute){if(t.hasAttribute("aria-labelledby")){for(var i=t.getAttribute("aria-labelledby").trim().split(" "),a="",n=0,r=i.length;n<r;++n){var l=i[n],o=c.FragmentUtil.getById(t,l);if(o&&!m.DOMUtil.sameNode(o,t)){var s=e.getTextContentExcludingScripts(o);a+=u.CommonUtil.normalizeSpacing(s)}}return a.trim()}if(t.hasAttribute("aria-label"))return u.CommonUtil.normalizeSpacing(t.getAttribute("aria-label")).trim()}return""},e.getAriaDescription=function(t){if(!t)return"";var i="",a=t.getAttribute("aria-labelledby");if(a&&a.trim().length>0){for(var n=a.trim().split(" "),r=0,l=n.length;r<l;++r){var o=n[r],s=c.FragmentUtil.getById(t,o);if(s&&!m.DOMUtil.sameNode(s,t)){var d=e.getTextContentExcludingScripts(s);d&&d.trim().length>0&&(i+=u.CommonUtil.normalizeSpacing(d).toLowerCase())}}if(i.trim().length>0)return i.trim()}return(a=t.getAttribute("aria-description"))&&a.trim().length>0?a.trim().toLowerCase():""},e.findAriaLabelDupes=function(t){var i={};return t.forEach(function(t){i[e.getAriaLabel(t)]=(i[e.getAriaLabel(t)]||0)+1}),i},e.getLandmarkAccNames=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_Landmark_AccNames",null);if(i&&0!==i.length)return i;i=[];var r=t.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]');return 0===r.length?(n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i):(r.forEach(function(t){if(!s.VisUtil.isNodeHiddenFromAT(t)&&null===u.CommonUtil.getAncestor(t,["DIALOG"])&&null===e.getAncestorWithRole(t,"dialog",!0)){var n="",l=d.AccNameUtil.computeAccessibleName(t);l&&l.name&&l.name.trim().length>0&&(n=l.name.trim());var o=a([],r,!0).filter(function(e){return e.contains(t)&&e!==t});o.length>1&&o.forEach(function(e){var t=d.AccNameUtil.computeAccessibleName(e);t&&t.name&&t.name.trim().length>0&&(n=t.name.trim()+" "+n)});var c=e.getResolvedRole(t);i.push({elem:t,role:c,name:n})}}),n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i)},e.isLandmarkNameUnique=function(t,i,a){void 0===a&&(a=!1);var n,r=e.getLandmarkAccNames(t.ownerDocument);if(!(n="any"===i?r.find(function(e){return e.elem===t}):r.find(function(e){return e.elem===t&&e.role===i})))return null;var l=n.name;if(!a&&""===l)return null;for(var o=0;o<r.length;o++)if(r[o].elem!==t&&l===r[o].name){if("any"===i)return!0;if(r[o].role===i)return!0}return!1},e.hasUniqueAriaLabels=function(t){return e.hasUniqueAriaLabelsLocally(t,!0)},e.hasDuplicateAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,r=null,l=new Array;i&&(r=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===r&&(r={});for(var o=0;o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();r[s]=!0,s in l||(l[s]=new Array),l[s].push(t[o].nodeName.toLowerCase())}else if(t[o].hasAttribute("aria-labelledby")){for(var d=t[o].getAttribute("aria-labelledby").trim().split(" "),p="",h=0,g=d.length;h<g;++h){var b=d[h],_=c.FragmentUtil.getById(t[o],b);if(_&&!m.DOMUtil.sameNode(_,t[o])){var f=e.getTextContentExcludingScripts(_);p+=u.CommonUtil.normalizeSpacing(f).toLowerCase()}}r[p]=!0,p in l||(l[p]=new Array),l[p].push(t[o].nodeName.toLowerCase())}return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",r),l},e.hasDuplicateAriaLabels=function(t){return e.hasDuplicateAriaLabelsLocally(t,!0)},e.hasUniqueAriaLabelledby=function(e){for(var t=!1,i={},a=0;!t&&a<e.length;++a)if(e[a].hasAttribute&&e[a].hasAttribute("aria-labelledby")&&!u.CommonUtil.isIdReferToSelf(e[a],e[a].getAttribute("aria-labelledby"))){var n=u.CommonUtil.normalizeSpacing(e[a].getAttribute("aria-labelledby"));t=n in i,i[n]=!0}else t=!0;return!t},e.getElementAriaProperty=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_ElementAriaProperty",null);if(!i){var l=null;if(t.tagName?l=t.tagName.toLowerCase():t.nodeName&&(l=t.nodeName.toLowerCase()),null==(i=r.ARIADefinitions.documentConformanceRequirement[l])){var o=r.ARIADefinitions.documentConformanceRequirementSpecialTags[l];switch(l){case"a":case"area":i=t.hasAttribute("href")?o["with-href"]:o["without-href"];break;case"figure":var s=u.CommonUtil.getChildByTag(t,"figcaption");i=null!==s&&s.length>0?o["child-figcaption"]:o["no-child-figcaption"];break;case"footer":case"header":i=null!==e.getAncestorWithRole(t,"article",!0)||null!==e.getAncestorWithRole(t,"complementary",!0)||null!==e.getAncestorWithRole(t,"navigation",!0)||null!==e.getAncestorWithRole(t,"region",!0)||null!==u.CommonUtil.getAncestor(t,["article","aside","main","nav","section"])?o["des-section-article-aside-main-nav"]:o.other;break;case"img":var d=t.hasAttribute("alt")?t.getAttribute("alt"):null,c=t.hasAttribute("title")?t.getAttribute("title"):null;i=0!==e.getAriaLabel(t).trim().length||null!==d&&d.length>0||null!==c&&c.length>0?o["img-with-accname"]:null!==d?o["img-without-accname-empty-alt"]:o["img-without-accname-no-alt"];break;case"input":if(u.CommonUtil.attributeNonEmpty(t,"type")){var p=t.getAttribute("type").trim().toLowerCase();if(null==(i=o[p]))switch(p){case"checkbox":i=u.CommonUtil.attributeNonEmpty(t,"aria-pressed")?o["checkbox-with-aria-pressed"]:o["checkbox-without-aria-pressed"];break;case"email":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["email-with-list"]:o["email-no-list"];break;case"search":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["search-with-list"]:o["search-no-list"];break;case"tel":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["tel-with-list"]:o["tel-no-list"];break;case"text":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"url":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["url-with-list"]:o["url-no-list"];break;default:i=u.CommonUtil.attributeNonEmpty(t,"list")?o["default-with-list"]:o["default-no-list"]}}else i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"li":o=r.ARIADefinitions.documentConformanceRequirementSpecialTags.li,i=t.parentElement&&e.hasRoleInSemantics(t.parentElement,"list")?o["child-of-list-role"]:o["no-child-of-list-role"];break;case"section":var h=e.getAriaLabel(t);i=h&&h.trim().length>0||u.CommonUtil.attributeNonEmpty(t,"title")?o["with-name"]:o["without-name"];break;case"select":o=r.ARIADefinitions.documentConformanceRequirementSpecialTags.select,i=t.hasAttribute("multiple")||u.CommonUtil.attributeNonEmpty(t,"size")&&t.getAttribute("size")>1?o["multiple-attr-size-gt1"]:o["no-multiple-attr-size-gt1"];break;case"summary":o=r.ARIADefinitions.documentConformanceRequirementSpecialTags.summary,i=t.parentElement&&"details"===t.parentElement.nodeName.toLowerCase()&&m.DOMUtil.sameNode(a([],t.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],t)?o["first-summary-of-detail"]:o["no-first-summary-of-detail"];break;case"tbody":case"td":case"tr":i=null!==e.getAncestorWithRole(t,"table",!0)?o["des-table"]:e.getAncestorWithRole(t,"grid",!0)||e.getAncestorWithRole(t,"treegrid",!0)?o["des-grid"]:o["des-other"];break;case"th":var g=u.CommonUtil.getScopeForTh(t);i=null!==e.getAncestorWithRole(t,"table",!0)?"column"===g?o["des-table-column-scope"]:o["des-table-row-scope"]:null!==e.getAncestorWithRole(t,"grid",!0)||null!==e.getAncestorWithRole(t,"treegrid",!0)?"column"===g?o["des-grid-treegrid-column-scope"]:o["des-grid-treegrid-row-scope"]:o["des-other"];break;case"div":var b=t.parentElement;i=null!==b&&"dl"===b.nodeName.toLowerCase()?o["child-dl"]:o["no-child-dl"];break;default:i=r.ARIADefinitions.documentConformanceRequirementSpecialTags.default}}}return n.CacheUtil.setCache(t,"AriaUtil_ElementAriaProperty",i),i||null},e.getAllowedAriaRoles=function(t,i){var a=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaRoles",null);if(!a){a=[];var r;if(null!=(r=null!=i?i:e.getElementAriaProperty(t))){null!==r.implicitRole&&u.CommonUtil.concatUniqueArrayItemList(r.implicitRole,a),null!==r.validRoles&&u.CommonUtil.concatUniqueArrayItemList(r.validRoles,a);var l=e.getImplicitRole(t);l&&l.length>0&&u.CommonUtil.concatUniqueArrayItemList(r.validRoles,a)}n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaRoles",a)}return a},e.getAllowedAriaAttributes=function(t,i,l){var o=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaAttributes",null);if(!o){o=[];var s=a([],i,!0),d=t.tagName.toLowerCase(),c=[];r.ARIADefinitions.elementsAllowedDisabled.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-disabled",o)),r.ARIADefinitions.elementsAllowedRequired.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-required",o)),r.ARIADefinitions.elementsAllowedReadOnly.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-readonly",o));var m=null;if(null!=(m=null!=l&&void 0!==l?l:e.getElementAriaProperty(t))){if(null!==m.implicitRole&&(null==s||0===s.length)&&void 0===m.allowAttributesFromImplicitRole)for(var p=0;p<m.implicitRole.length;p++){var h=r.ARIADefinitions.designPatterns[m.implicitRole[p]];if(null!=h){var g=h.props;u.CommonUtil.concatUniqueArrayItemList(g,o),g=e.getRoleRequiredProperties(m.implicitRole[p],t),u.CommonUtil.concatUniqueArrayItemList(g,o),(v=h.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===m.implicitRole[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuenow","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(m.globalAriaAttributesValid){var b=r.ARIADefinitions.globalProperties;u.CommonUtil.concatUniqueArrayItemList(b,o)}}for(m&&m.otherRolesForAttributes&&m.otherRolesForAttributes.length>0&&u.CommonUtil.concatUniqueArrayItemList(m.otherRolesForAttributes,s),p=0;null!==s&&p<s.length;p++){var _=r.ARIADefinitions.designPatterns[s[p]];if(null!=_){if(!m||null===m.implicitRole||!m.implicitRole.includes(s[p])||m.implicitRole.includes(s[p])&&void 0===m.allowAttributesFromImplicitRole){var f=_.props;u.CommonUtil.concatUniqueArrayItemList(f,o),f=e.getRoleRequiredProperties(s[p],t),u.CommonUtil.concatUniqueArrayItemList(f,o)}var v;(v=_.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===s[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(s.includes("row")&&null==e.getAncestorWithRole(t,"treegrid",!0)){var A=-1;(A=o.indexOf("aria-level"))>-1&&o.splice(A,1),(A=o.indexOf("aria-setsize"))>-1&&o.splice(A,1),(A=o.indexOf("aria-posinset"))>-1&&o.splice(A,1)}if(m&&m.otherAllowedAriaAttributes&&m.otherAllowedAriaAttributes.length>0){for(var w=[],y=0;y<m.otherAllowedAriaAttributes.length;y++)if((R=m.otherAllowedAriaAttributes[y]).includes("=")){var C=R.split("=");t.getAttribute(C[0])===C[1]&&w.push(C[0])}else w.push(R);w.length>0&&u.CommonUtil.concatUniqueArrayItemList(w,o)}if(m&&m.otherDisallowedAriaAttributes&&m.otherDisallowedAriaAttributes.length>0){var k=[];for(y=0;y<m.otherDisallowedAriaAttributes.length;y++){var R;(R=m.otherDisallowedAriaAttributes[y]).includes("=")?(C=R.split("="),t.getAttribute(C[0])===C[1]&&k.push(C[0])):k.push(R)}k.length>0&&u.CommonUtil.concatUniqueArrayItemList(k,c)}o=u.CommonUtil.reduceArrayItemList(c,o),i&&0!==i.length||null!==m.implicitRole||!m.prohibitedAriaAttributesWhenNoImplicitRole||(o=u.CommonUtil.reduceArrayItemList(m.prohibitedAriaAttributesWhenNoImplicitRole,o)),n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaAttributes",o)}return o},e.getConflictOrOverlappingHtmlAttribute=function(e,t,i){var a=r.ARIADefinitions.relatedAriaHtmlAttributes[e.name];if(a){if(!e||0==e.length||!t||0==t.length)return[];var n=[],l=null;if("conflict"===i){if(!a.conflict||0===Object.keys(a.conflict).length)return null;l=a.conflict}else{if("overlapping"!==i)return null;if(!a.overlapping||0===Object.keys(a.overlapping).length)return null;l=a.overlapping}for(var o=!1,s=!1,u=0;u<l.length;u++)for(var d=l[u].ariaAttributeValue,c=l[u].htmlAttributeNames,m=l[u].htmlAttributeValues,p=0;p<t.length;p++){var h=c.indexOf(t[p].name);if(-1!==h){o=!0;var g=null===m||null===m[h]?null:m[h].split(",");null===d?(null===g||g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0):null===g?d===e.value&&(n.push({result:"Failed",attr:t[p].name}),s=!0):("VALUE"===d&&g.includes("VALUE")&&g[0]!==e.value||d===e.value&&g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0)}}return o&&!s&&n.push({result:"Pass",attr:""}),n}return null},e.containsPresentationalChildrenOnly=function(t){var i=e.getRoles(t,!1);if(i&&0!==i.length||(i=e.getImplicitRole(t)),!i||0===i.length)return!1;for(var a=0;null!==i&&a<i.length;a++){var n=r.ARIADefinitions.designPatterns[i[a]];if(null!=n&&!0===n.presentationalChildren)return!0}return!1},e.shouldBePresentationalChild=function(t){for(var i=o.DOMWalker.parentElement(t);i;){if(e.containsPresentationalChildrenOnly(i))return!0;i=l.ARIAMapper.getAriaOwnedBy(i)||o.DOMWalker.parentElement(i)}return!1},e.areRolesDefined=function(e){if(!e||0===e.length)return null;for(var t=r.ARIADefinitions.designPatterns,i=0,a=e;i<a.length;i++)if(!(a[i].toLowerCase()in t))return!1;return!0},e.getInvalidRoles=function(t){var i=e.getUserDefinedRoles(t);if(!i||0===i.length)return null;if(i&&i.includes("generic"))return["generic"];var a=e.getElementAriaProperty(t),n=e.getAllowedAriaRoles(t,a);if(!n||0===n.length)return i;var r=[];if(n.includes("any"))return[];for(var l=0;l<i.length;l++)n.includes(i[l])||r.includes(i[l])||r.push(i[l]);return r},e.getRolesUndefinedByAria=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=r.ARIADefinitions.designPatterns,l=0;l<i.length;l++)i[l]in n||a.push(i[l]);return a},e.getInvalidAriaAttributes=function(t){var i=e.getUserDefinedRoles(t),a=e.areRolesDefined(i);if(null!==a&&!a)return null;var n=[];i&&0!=i.length||(i=e.getImplicitRole(t));var r=e.getUserDefinedAriaAttributes(t),l=e.getElementAriaProperty(t),o=e.getAllowedAriaAttributes(t,i,l);if(r)for(var s=0;s<r.length;s++){var u=r[s].trim().toLowerCase();o.includes(u)||n.includes(u)||n.push(u)}return n},e.getConflictAriaAndHtmlAttributes=function(t){var i=e.getUserDefinedAriaAttributeNameValuePairs(t),a=e.getUserDefinedHtmlAttributeNameValuePairs(t),n=[];if(i&&i.length>0&&a&&a.length>0)for(var r=function(t){var r=e.getConflictOrOverlappingHtmlAttribute(i[t],a,"conflict");if(null===r)return"continue";r.forEach(function(e){"Failed"===e.result&&n.push({ariaAttr:i[t].name,htmlAttr:e.attr})})},l=0;l<i.length;l++)r(l);return n},e.getDeprecatedAriaRoles=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=r.ARIADefinitions.globalDeprecatedRoles,l=0;l<i.length;l++)n.includes(i[l])&&a.push(i[l]);return a},e.getDeprecatedAriaAttributes=function(t){if(!t)return null;var i=t.attributes,a=[];if(i)for(var n=0;n<i.length;n++){var l=i[n].name;"aria-"===l.substring(0,5)&&a.push(l)}if(0===a.length)return[];var o=[],s=r.ARIADefinitions.globalDeprecatedProperties;for(n=0;n<a.length;n++)s.includes(a[n])&&o.push({role:"any",attribute:a[n]});var u=e.getRoles(t,!1);if(u&&u.length>0)for(n=0;n<u.length;n++){var d=r.ARIADefinitions.designPatterns[u[n]];if(d){var c=d.deprecatedProps;if(c&&c.length>0)for(var m=0;m<a.length;m++)c.includes(a[m])&&o.push({role:u[n],attribute:a[m]})}}return o},e.isNodeInGrid=function(t){return null!=e.getAncestorWithRole(t,"grid")},e.navLinkKeywords=["start","next","prev","previous","contents","index"],e.rulesThatHaveToCheckHidden=["RPT_Elem_UniqueId"],e.ariaAttributeRoleDefaults={alert:{"aria-live":"assertive","aria-atomic":"true"},combobox:{"aria-haspopup":"listbox"},listbox:{"aria-orientation":"vertical"},log:{"aria-live":"polite"},menu:{"aria-orientation":"vertical"},menubar:{"aria-orientation":"horizontal"},meter:{"aria-valuemin":"0","aria-valuemax":"100"},option:{"aria-selected":"false"},progressbar:{"aria-valuemin":"0","aria-valuemax":"100"},scrollbar:{"aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},separator:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},slider:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},spinbutton:{},status:{"aria-live":"polite","aria-atomic":"true"},tab:{"aria-selected":"false"},tablist:{"aria-orientation":"horizontal"},toolbar:{"aria-orientation":"horizontal"},tree:{"aria-orientation":"vertical"}},e.ariaAttributeGlobalDefaults={"aria-atomic":"false","aria-autocomplete":"none","aria-busy":"false","aria-checked":void 0,"aria-current":"false","aria-disabled":"false","aria-dropeffect":"none","aria-expanded":void 0,"aria-grabbed":void 0,"aria-haspopup":"false","aria-hidden":void 0,"aria-invalid":"false","aria-live":"off","aria-modal":"false","aria-multiline":"false","aria-multiselectable":"false","aria-orientation":void 0,"aria-pressed":void 0,"aria-readonly":"false","aria-required":"false","aria-selected":void 0,"aria-sort":"none"},e.ariaAttributeImplicitMappings={"aria-autocomplete":{form:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},input:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},select:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},textarea:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"}},"aria-checked":{input:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},menuitem:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},"*":function(e){if(e.hasAttribute("indeterminate"))return"mixed"}},"aria-disabled":{button:function(e){return e.hasAttribute("disabled")?"true":"false"},fieldset:function(e){return e.hasAttribute("disabled")?"true":"false"},input:function(e){return e.hasAttribute("disabled")?"true":"false"},optgroup:function(e){return e.hasAttribute("disabled")?"true":"false"},option:function(e){return e.hasAttribute("disabled")?"true":"false"},select:function(e){return e.hasAttribute("disabled")?"true":"false"},textarea:function(e){return e.hasAttribute("disabled")?"true":"false"}},"aria-expanded":{details:function(e){return e.getAttribute("open")},dialog:function(e){return e.getAttribute("open")}},"aria-multiselectable":{select:function(e){if(e.hasAttribute("multiple"))return"true"}},"aria-placeholder":{input:function(e){return e.getAttribute("placeholder")},textarea:function(e){return e.getAttribute("placeholder")}},"aria-required":{input:function(e){return e.getAttribute("required")},select:function(e){return e.getAttribute("required")},textarea:function(e){return e.getAttribute("required")}}},e}();t.AriaUtil=p},4919(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CSSUtil=void 0;var a=i(4566),n=i(7139),r=i(7011),l=i(7507),o=i(3864),s=function(){function e(){}return e.selectorMatchesElem=function(e,t){if(!t||0===t.length||""===t.trim())return!1;try{if("function"==typeof e.matches)return e.matches(t);if("function"==typeof e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if("function"==typeof e.msMatchesSelector)return e.msMatchesSelector(t);if("function"==typeof e.matchesSelector)return e.matchesSelector(t);var i=e.ownerDocument||e.document;if(!i)return!1;var a=i.querySelectorAll(t);return Array.from(a).includes(e)}catch(e){return!1}},e.getComputedStyle=function(e,t){return e?e.ownerDocument.defaultView.getComputedStyle(e,t):null},e.getParsedStylesheetRules=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_ParsedStylesheetRules",null);if(t)return t;for(var i=[],n=0;n<e.styleSheets.length;++n){var r=e.styleSheets[n];try{if(r&&r.cssRules)for(var l=0;l<r.cssRules.length;++l){var o=r.cssRules[l],s=o.selectorText;if(s){var u=s.match(/^(.*)(:[a-zA-Z-]*)$/),d=!!u,c=d?u[1]:s,m=d?u[2]:"";i.push({fullRuleSelector:s,hasPseudoClass:d,selMain:c,selPseudo:m,style:o.style})}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_ParsedStylesheetRules",i),i},e.fillStyle=function(e,t){for(var i=0;i<t.length;++i){if("all"===t[i]&&t[t[i]]){for(var a=0,n=e;a<n.length;a++){var r=n[a];for(var l in r)delete r[l]}break}l=t[i];for(var o=0,s=e;o<s.length;o++){r=s[o];var u=t.getPropertyPriority(l);if(l in r&&r[l].endsWith("!important")){if("important"!==u||r[l].startsWith("inherit")||r[l].startsWith("unset"))continue;r[l]=t[l]+" !important"}else r[l]=t[l]+("important"===u?" !important":"")}}},e.getDefinedStylesInternal=function(t,i,a){for(var n={},r={},l={},o=0,s=a;o<s.length;o++){var u=s[o];r[u]={},l[u]={}}for(var d=e.getParsedStylesheetRules(t.ownerDocument),c=a.includes(":focus"),m=function(n){if(null!==i&&!i.some(function(e){return!!n.style[e]}))return"continue";var o=n.selPseudo,s=n.hasPseudoClass,u=n.selMain;if(c&&":focus"===o&&(u=u.replace(/([ >][^+~ >]+):focus-within/g,"$1")),e.selectorMatchesElem(t,u))for(var d=0,m=a;d<m.length;d++){var p=m[d],h=r[p],g=l[p];s||e.fillStyle([h,g],n.style),o===p&&e.fillStyle([g],n.style)}},p=0,h=d;p<h.length;p++)m(h[p]);for(var g=0,b=a;g<b.length;g++){u=b[g];var _=r[u],f=l[u];if(e.fillStyle([_,f],t.style),""===u)n[u]=_;else{for(var v={},A=Object.keys(f),w=0;w<A.length;w++){var y=A[w];f[y]!==_[y]&&(v[y]=f[y])}n[u]=v}}return n},e.getDefinedStylesMultiple=function(t,i,n){if(!t)return null;var r={},l=null===i?"all":i.slice().sort().join(","),o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[l],u=[];if(s){for(var d=0,c=n;d<c.length;d++)void 0!==s[g=c[d]]?r[g]=s[g]:u.push(g);if(0===u.length)return r}else s={},u=n;if(u.length>0){for(var m=e.getDefinedStylesInternal(t,i,u),p=0,h=u;p<h.length;p++){var g;r[g=h[p]]=m[g],s[g]=m[g]}o[l]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o)}return r},e.getDefinedStyles=function(t,i,n){if(!t)return null;var r=null===i?"all":i.slice().sort().join(","),l=n||"",o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[r];if(s||(s={}),void 0!==s[l])return s[l];var u=e.getDefinedStylesInternal(t,i,[l])[l];return s[l]=u,o[r]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o),u},e.getMediaOrientationTransform=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_MediaOrientationTransforms",null);if(t)return t;for(var i={},n=0;n<e.styleSheets.length;++n){var r=e.styleSheets[n];try{if(r&&r.cssRules)for(var l=0;l<r.cssRules.length;++l){var o=r.cssRules[l];if(4===o.MEDIA_RULE){var s=o;if(s&&s.media)for(var u=s.media,d=0;d<u.length;d++)if(u.item(d)){var c=u.item(d).toLocaleLowerCase(),m=i[c];m||(m={});for(var p=s.cssRules,h=0;h<p.length;++h)if(1===p[h].STYLE_RULE){var g=p[h],b=g.selectorText;if(b){for(var _={},f=g.style,v=0;v<f.length;++v){var A=f[v],w=A.toLocaleLowerCase();if("transform"===w){if("all"===A&&f[A]){_={};break}_[A]=f[A]}else"rotate"===w&&(_[A]=f[A])}Object.keys(_).length>0&&(m[b]=_)}}Object.keys(m).length>0&&(i[c]=m)}}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_MediaOrientationTransforms",i),i},e.getRotationDegree=function(e){var t=0;try{if(!e)return t;for(var i=(e=e.replaceAll(", ",",")).split(" "),a=0;a<i.length;a++){var n=i[a].trim();if(""!==n)if(n.startsWith("rotate3d")){var r=n.indexOf("("),l=n.indexOf(")");if(-1!==r&&-1!==l){var o=n.substring(r+1,l),s=void 0;if(o&&(s=o.split(",")),s&&4===s.length){if(!(d=s[3]))continue;if((d=d.trim()).endsWith("turn")){var u=d.substring(0,d.length-4);u=parseFloat(u),isNaN(u)||(t=360*u)}else d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}}else if(n.startsWith("rotate")||n.startsWith("rotateZ")){if(r=n.indexOf("("),l=n.indexOf(")"),-1!==r&&-1!==l){var d;if(!(d=n.substring(r+1,l)))continue;(d=d.trim()).endsWith("turn")?(u=d.substring(0,d.length-4),u=parseFloat(u),isNaN(u)||(t=360*u)):d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}else if(n.startsWith("matrix3d")){if(r=n.indexOf("("),l=n.indexOf(")"),-1!==r&&-1!==l&&(o=n.substring(r+1,l),s=null,o&&(s=o.split(",")),null!==s)){var c=Math.atan2(s[4],s[5]);t+=Math.round(Math.round(180*c/Math.PI))}}else n.startsWith("matrix")&&(r=n.indexOf("("),l=n.indexOf(")"),-1!==r&&-1!==l&&(o=n.substring(r+1,l),s=null,o&&(s=o.split(",")),null!==s&&(c=Math.atan2(s[1],s[0]),t+=Math.round(Math.round(180*c/Math.PI)))))}for(;t>=360;)t-=360}catch(e){throw console.log("Cannot retrieve rotation degree: "+e),e}return t},e.getPixelsFromStyle=function(t,i){if(!t)return 0;var a=t.trim().match(/(-?[\d.]+)([a-z%]*)/);if(null===a)return 0;if(""===a[2]||0===a[1])return 0;var n=e.convertValue2Pixels(a[2],a[1],i);return null===n?n:parseFloat(n)},e.convertValue2Pixels=function(e,t,i){if(0===t)return 0;e||(e="px");var a={px:function(e){return e},cm:function(e){return 37.8*e},mm:function(e){return 3.78*e},q:function(e){return.95*e},in:function(e){return 96*e},pc:function(e){return 16*e},pt:function(e){return 1.33*e},rem:function(e){return e*parseFloat(getComputedStyle(i.ownerDocument.documentElement).getPropertyValue("font-size"))},em:function(e){return e*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))},vw:function(e){return e/100*i.ownerDocument.defaultView.innerWidth},vh:function(e){return e/100*i.ownerDocument.defaultView.innerHeight},"%":function(e){return e/100*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))}};return e in a?a[e](t):null},e.isMaterialIconFont=function(t){var i={"Material Icons":"https://fonts.googleapis.com/icon?family=Material+Icons"},a=e.getDefinedStyles(t,["font-family"])["font-family"],n=!1;if(a&&a.split(",")[0].replace(/['"]+/g,"").trim()in i&&(n=!0),!n){var r=t.classList;for(var l in{"material-icons":"https://fonts.googleapis.com/icon?family=Material+Icons"})if(r.contains(l)){n=!0;break}}if(!n)return!1;for(var o=!1,s=t.ownerDocument.styleSheets,u=0;u<s.length;u++)if(s&&s.length>0&&Object.values(i).indexOf(s[u].href)>-1){o=!0;break}return o},e.getWeightNumber=function(e){var t={light:100,bold:700};return parseInt(e)||(e in t?t[e]:400)},e.getFontInPixels=function(t,i){var a=parseFloat(t);if(!a)return{"xx-small":16,"x-small":10,small:13,medium:16,large:18,"x-large":24,"xx-large":32}[t];var n=t.substring((""+a).length);return e.convertValue2Pixels(n,a,i)},e.getCSSStyle=function(e){var t="";if(null===e)return[];if(e.IBM_CSS_THB)return e.IBM_CSS_THB;if("style"===e.nodeName.toLowerCase())void 0!==(t=e.innerText)&&""!==t.trim()||(t=e.textContent);else{if(!e.hasAttribute("style"))return[];t=e.getAttribute("style")}if(null===t||0===t.trim().length)return[];var i=/\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g,a=/\s*([^{]*){([^}]*)}/g;if(-1===(t=t.replace(/(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g," ")).indexOf("{")){for(var n={},r=void 0;null!=(r=i.exec(t));)n[r[1]]=r[2].trim().toLowerCase();var l=[{selector:null,values:n}];return e.IBM_CSS_THB=l,l}l=[],r=void 0;for(var o=void 0;null!=(r=a.exec(t));){n={};for(var s=r[1],u=r[2];null!=(o=i.exec(u));)n[o[1]]=o[2].trim().toLowerCase();l.push({selector:s,values:n})}return e.IBM_CSS_THB=l,l},e.getInlineStatus=function(e){if(!e)return null;var t=getComputedStyle(e);if(!t)return null;var i={inline:!1,text:!1,violation:null};if("inline"!==t.getPropertyValue("display"))return i;i.inline=!0;var a=e.parentElement;if(!a)return i;var r=new l.DOMMapper,o=r.getUnadjustedBounds(e),s=getComputedStyle(a).getPropertyValue("display");if("block"!==s&&"inline-block"!==s)return n.CommonUtil.isInnerTextOnlyEmpty(a)||(i.text=!0),i;function u(e,t){if(e.nodeType===Node.TEXT_NODE)return e.nodeValue&&e.nodeValue.trim().length>0?"yes":"no";if(e.nodeType===Node.ELEMENT_NODE){if("br"===e.nodeName.toLowerCase())return"block";if("inline"===getComputedStyle(e).getPropertyValue("display")){if(n.CommonUtil.isTarget(e)&&o.width<24){var a=r.getUnadjustedBounds(e);return t&&Math.round(o.width/2)+o.left-a.left<24||!t&&Math.round(o.width/2)+o.left-(a.left+a.width)<24?(i.violation=e.nodeName.toLowerCase(),"violation"):"no"}return n.CommonUtil.isInnerTextOnlyEmpty(e)?"no":"yes"}return"block"}return"block"}for(var d=e.nextSibling;d;){if("yes"===(c=u(d,!0))){i.text=!0;break}if("block"===c)break;d=d.nextSibling}for(d=e.previousSibling;d;){var c;if("yes"===(c=u(d,!1))){i.text=!0;break}if("block"===c)break;d=d.previousSibling}return i},e.isTargetBrowserDefault=function(t){if(!t)return!1;var i=r.AriaUtil.getRoles(t,!1);if(i&&i.length>0)return!1;var a=e.getDefinedStyles(t,["line-height","height","width","min-height","min-width","font-size","margin-top","margin-bottom","margin-left","margin-right"]);return!(a["line-height"]||a.height||a.width||a["min-height"]||a["min-width"]||a["font-size"]||a["margin-top"]||a["margin-bottom"]||a["margin-left"]||a["margin-right"])},e.containsCKJ=function(e){return!!e&&e.trim().replace(/(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g,"").length!==e.trim().length},e.getAncestorWithStyles=function(t,i,n){void 0===n&&(n=[]);var r="AriaUtil_AncestorWithStyles_"+JSON.stringify(i)+"_"+JSON.stringify(n),l=a.CacheUtil.getCache(t,r,null);if(null!==l)return"NOT_FOUND"===l?null:l;for(var s=t;null!==s;)if(1===s.nodeType&&"http://www.w3.org/2000/svg"!==s.namespaceURI){var u=e.getDefinedStyles(s,Object.keys(i));for(var d in i){var c=u[d];if(c&&(c=c.split(" ")[0],!n.includes(c))){var m=i[d];if(m.includes("*"))return a.CacheUtil.setCache(t,r,s),s;if(m.includes(c))return a.CacheUtil.setCache(t,r,s),s}}s=o.DOMWalker.parentElement(s)}else s=o.DOMWalker.parentElement(s);return a.CacheUtil.setCache(t,r,"NOT_FOUND"),null},e.getValueUnitPair=function(e){if(!e)return null;if(Number.isInteger(e))return["px",e];var t=parseInt(e);if(isNaN(t))return null;var i=(e=e.trim().toLowerCase()).trim().match(/([a-z]+)$/),a="px";return i&&(a=i[1]),[a,t]},e}();t.CSSUtil=s},4566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CacheUtil=void 0;var a=i(1686),n=i(3864),r=function(){function e(){}return e.getCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0===a.aceCache[t]&&(a.aceCache[t]=i),a.aceCache[t]}},e.setCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),a.aceCache[t]=i,i}},e.getSetCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0!==a.aceCache[t]&&void 0!==a.aceCache[t]||(a.aceCache[t]=i()),a.aceCache[t]}},e.clearCaches=function(e){var t,i=0;delete e.ownerDocument.aceCache;var r=new n.DOMWalker(e,!1,e,!0);do{++i,delete r.node.aceCache,r.node.ownerDocument&&delete r.node.ownerDocument.aceCache}while(r.nextNode());if(e!==(null===(t=e.ownerDocument)||void 0===t?void 0:t.documentElement)){for(var l=new n.DOMWalker(e.ownerDocument.documentElement,!1,void 0,!0),o=l.node,s=void 0;s=n.DOMWalker.parentElement(o);)o=s;l.node=o;do{l.bEndTag||!a.DOMUtil.sameNode(e,l.node)?(delete l.node.aceCache,l.node.ownerDocument&&delete l.node.ownerDocument.aceCache):l.bEndTag=!0}while(l.nextNode())}return i},e}();t.CacheUtil=r},167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ClipPathUtil=void 0;var a=i(4566),n=i(4919),r=function(){function e(){}return e.isNodeVisuallyHiddenByClipPath=function(t){if(!t||1!==t.nodeType)return!1;var i=t,r=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",void 0);if(void 0!==r)return r;var l=n.CSSUtil.getComputedStyle(i),o=parseInt(l.width),s=parseInt(l.height),u=l["clip-path"];if(!u||"none"===u.trim()||""===u.trim())return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var d=(u=u.trim().replace(/\s+/g," ").toLowerCase()).indexOf("inset(");if(-1!==d){var c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")"));if(-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),1===(f=m.trim().split(" ")).length){var p=e.isClippedByInset(i,f[0],f[0],f[0],f[0]);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(2===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[0],f[1]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(3===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[1],f[2]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(4===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[2],f[3]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(-1!==(d=u.indexOf("rect("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),"auto"===(f=m.trim().split(" "))[0]&&(f[0]="0px"),"auto"===f[3]&&(f[3]="0px"),"auto"===f[1]&&(f[1]="100%"),"auto"===f[2]&&(f[2]="100%"),f[2]=Math.max(f[0],f[2]),f[1]=Math.max(f[1],f[3]);var h=parseInt(f[0]);if(isNaN(h))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))h=h*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(h)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;h=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(h>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var g=parseInt(f[3]);if(isNaN(g))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))g=g*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(g)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;g=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(g>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var b=parseInt(f[1]);if(isNaN(b))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))b=b*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(b)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;b=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}var _=parseInt(f[2]);if(isNaN(_))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))_=_*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(_)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;_=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return _-h<=e.THRESHOLD||b-g<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("xywh("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c));var f=m.trim().split(" "),v=parseInt(f[0]);if(isNaN(v))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))v=v*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(top)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;v=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(v>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var A=parseInt(f[1]);if(isNaN(A))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))A=A*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(A)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;scrollY=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(A>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var w=parseInt(f[2]);if(isNaN(w))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))w=w*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(w)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;w=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(w<=e.THRESHOLD)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0;var y=parseInt(f[3]);if(isNaN(y))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))y=y*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(y)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;y=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return y<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("circle("))){f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ");var C=parseInt(f[0]);if(isNaN(C))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))C=C*(o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("ellipse("))){if((f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ")).length>3&&"closest-side"===f[0]&&"farthest-side"===f[1]&&"at"===f[2]){if(C=parseInt(f[3]),4===f.length){if(f[3].endsWith("%"))C=C*(N=o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(5===f.length)for(var k=3;k<f.length;k++){var R=parseInt(f[k]);if(f[k].endsWith("%"))R=R*(N=3===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(R)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;R=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return R<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}var x=u.indexOf("at");if(m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==x&&(m=u.substring(u.indexOf("(")+1,x)),2!==(f=m.trim().split(" ")).length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(k=0;k<f.length;k++){if(C=parseInt(f[k]),f[k].endsWith("%"))C=C*(N=0===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}if(-1!==(d=u.indexOf("polygon("))){"nonzero"!==(f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(","))[0]&&"evenodd"!==f[0]||f.shift(),A=0,v=0;var P=!1,T=!1;for(k=0;k<f.length;k++){var U=f[k].trim().split(" ");if(2!=U.length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(var I=[0,0],E=0;E<2;E++){var N=parseInt(U[E]);if(isNaN(N))return!1;if(U[E].endsWith("%"))I[E]=0===E?N*o/100:N*s/100;else{var L;if(!(L=n.CSSUtil.getValueUnitPair(U[E])))return!1;I[E]=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}}0===k&&(v=I[0],A=I[1]),Math.abs(I[0]-v)>=e.THRESHOLD&&(P=!0),Math.abs(I[1]-A)>=e.THRESHOLD&&(T=!0)}return P&&T?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1},e.isClippedByInset=function(t,i,a,r,l){void 0===a&&(a="0px"),void 0===r&&(r="0px"),void 0===l&&(l="0px");var o=n.CSSUtil.getComputedStyle(t),s=parseInt(o.width),u=parseInt(o.height),d=parseInt(i);if(isNaN(d))return!1;if(i.endsWith("%"))d=d*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(i)))return!1;d=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(d>u)return!1;var c=parseInt(a);if(isNaN(c))return!1;if(a.endsWith("%"))c=c*s/100;else{if(!(h=n.CSSUtil.getValueUnitPair(a)))return!1;c=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(c>s)return!1;var m=parseInt(r);if(isNaN(m))return!1;if(r.endsWith("%"))m=m*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(r)))return!1;m=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(m>u)return!1;var p=parseInt(l);if(isNaN(p))return!1;if(l.endsWith("%"))p=p*s/100;else{var h;if(!(h=n.CSSUtil.getValueUnitPair(l)))return!1;p=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}return!(p>s)&&(u-(d+m)<=e.THRESHOLD||s-(c+p)<=e.THRESHOLD)},e.THRESHOLD=5,e}();t.ClipPathUtil=r},3883(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ColorObj=t.ColorUtil=void 0;var a=i(3864),n=function(){function e(){}return e.Color=function(t){if(!t)return null;if("transparent"===(t=t.toLowerCase()))return new r(255,255,255,0);if(t in e.CSSColorLookup&&(t=e.CSSColorLookup[t]),t.startsWith("rgb(")){var i=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;return null===(a=t.match(i))?null:new r(a[1],a[2],a[3])}var a;if(t.startsWith("rgba("))return i=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(a=t.match(i))?null:new r(a[1],a[2],a[3],a[4]);if("#"!=t.charAt(0))return null;4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2));var n=parseInt(t.substring(1,3),16),l=parseInt(t.substring(3,5),16),o=parseInt(t.substring(5,7),16);return new r(n,l,o)},e.ColorCombo=function(t){try{var i=t.ownerDocument;if(!i)return null;var n=i.defaultView;if(!n)return null;for(var r=[],l=t;l;)1===l.nodeType&&r.push(l),l=a.DOMWalker.parentElement(l);var o={hasGradient:!1,hasBGImage:!1,textShadow:!1,fg:null,bg:null},s=(b=n.getComputedStyle(t)).color;s||(s="black");for(var u=e.Color(s),d=/transparent|rgba?\([^)]+\)/gi,c=function(e,t,i){try{if(void 0===e.length)return e;for(var a=null,n=null,r=1;r<e.length;++r){for(var l=e[r-1],o=i.contrastRatio(e[r-1]),s=.1,u=0;s>1e-4;){for(;u+s<=1&&o>i.contrastRatio(e[r].mix(e[r-1],u+s).getOverlayColor(t));)l=e[r].mix(e[r-1],u+s).getOverlayColor(t),o=i.contrastRatio(l),u+=s;for(;u-s>=0&&o>i.contrastRatio(e[r].mix(e[r-1],u-s).getOverlayColor(t));)l=e[r].mix(e[r-1],u-s).getOverlayColor(t),o=i.contrastRatio(l),u-=s;s/=10}(null===n||n>o)&&(n=o,a=l)}return a}catch(e){console.log(e)}return t},m=e.Color("white"),p=null,h=null,g=null;r.length>0;){var b,_=r.pop();if(null!==(b=n.getComputedStyle(_))){var f=null;if(b.backgroundColor&&"transparent"!=b.backgroundColor&&"rgba(0, 0, 0, 0)"!=b.backgroundColor&&(f=e.Color(b.backgroundColor)),b.backgroundImage&&b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")){var v=b.backgroundImage.match(d);if(v){for(var A=[],w=0;w<v.length;++w)if(v[w].length){var y=e.Color(v[w]);if(void 0!==y.alpha&&y.alpha<1){var C=g||m;y=y.getOverlayColor(C)}A.push(y)}else v.splice(w--,1);f=c(A,g||m,u)}}null===p||b.opacity&&b.opacity.length>0&&parseFloat(b.opacity)<1?(null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),p=1,h=null,g=null,b.opacity&&b.opacity.length>0&&(p=parseFloat(b.opacity)),null!=f&&(h=(g=f).alpha||1,delete g.alpha,1===p&&1===h&&(o.hasBGImage=!1,o.hasGradient=!1))):null!=f&&(null===g?(h=(g=f).alpha||1,delete g.alpha):h=(g=f.getOverlayColor(g)).alpha||1,1===p&&1===h&&1===(g.alpha||1)&&f.alpha),b.backgroundImage&&"none"!=b.backgroundImage&&(b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")?o.hasGradient=!0:o.hasBGImage=!0)}}return null!=g&&delete(u=u.getOverlayColor(g)).alpha,u.alpha=(u.alpha||1)*p,u=u.getOverlayColor(m),null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),o.fg=u,o.bg=m,b.textShadow&&"none"!==b.textShadow&&(o.textShadow=!0),o}catch(e){return null}},e.CSSColorLookup={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",buttontext:"rgba(0, 0, 0, 0.847)",buttonface:"#ffffff",graytext:"rgba(0, 0, 0, 0.247)"},e}();t.ColorUtil=n;var r=function(){function e(e,t,i,a){function n(e){if("string"!=typeof e)return e;var t=e;return"%"!=(t=t.trim())[t.length-1]?parseInt(t):Math.round(2.55*parseFloat(t.substring(0,t.length-1)))}this.red=n(e),this.green=n(t),this.blue=n(i),void 0!==a&&(this.alpha="string"==typeof a?parseFloat(a):a)}return e.prototype.toHexHelp=function(e){var t=Math.round(e).toString(16);return 1===t.length?"0"+t:t},e.prototype.toHex=function(){return"#"+this.toHexHelp(this.red)+this.toHexHelp(this.green)+this.toHexHelp(this.blue)},e.prototype.contrastRatio=function(e){var t=this;void 0!==this.alpha&&(t=this.getOverlayColor(e));var i=t.relativeLuminance();if(!e.relativeLuminance){var a="";for(var n in e)a+=n+"\n";alert(e),alert(a)}var r=e.relativeLuminance();return i>r?(i+.05)/(r+.05):(r+.05)/(i+.05)},e.prototype.relativeLuminance=function(){var e=this.red/255,t=this.green/255,i=this.blue/255;return.2126*(e=e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4))},e.prototype.mix=function(t,i){if(void 0===this.alpha&&void 0===t.alpha)return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue);var a=this.alpha?this.alpha:1,n=t.alpha?t.alpha:1;return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue,i*a+(1-i)*n)},e.prototype.getOverlayColor=function(e){if(void 0===this.alpha||this.alpha>=1)return this;if(this.alpha<0)return null;if(void 0!==e.alpha&&e.alpha<1)return null;var t=this.mix(e,this.alpha);return delete t.alpha,t},e.fromCSSColor=function(t){var i=-1,a=-1,r=-1;if((t=t.toLowerCase()).startsWith("rgb(")){var l=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;if(null===(o=t.match(l)))return null;i=o[1],a=o[2],r=o[3]}else if(t.startsWith("rgba(")){var o;if(l=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(o=t.match(l)))return null;i=o[1],a=o[2],r=o[3]}else{if("#"!=t.charAt(0)){if(!(t in n.CSSColorLookup))return null;t=n.CSSColorLookup[t]}var s=function(e){for(var t={a:10,b:11,c:12,d:13,e:14,f:15},i=0,a=0;a<e.length;++a)i=16*i+parseInt(e.charAt(a)in t?t[e.charAt(a)]:e.charAt(a));return i};4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2)),i=s(t.substring(1,3)),a=s(t.substring(3,5)),r=s(t.substring(5,7))}return new e(i,a,r)},e}();t.ColorObj=r},7139(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,r=t.length;n<r;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.CommonUtil=void 0;var n=i(9910),r=i(4566),l=i(7011),o=i(1950),s=i(3946),u=i(1686),d=i(3864),c=i(5279),m=function(){function e(){}return e.wordCount=function(e){return 0===(e=e.trim()).length?0:e.split(/\s+/g).length},e.isTabbable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;if(t.hasAttribute("inert")||u.DOMUtil.getAncestorWithAttribute(t,"inert",""))return!1;if(t.hasAttribute("tabindex"))return parseInt(t.getAttribute("tabindex"))>=0;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}var n=t.getAttribute("contenteditable");return"true"===n||""===n},e.isFocusable=function(t){return"undefined"!==t&&null!==t&&e.isTabbable(t)},e.isClickable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!(!l.AriaUtil.isWidget(t)||!t.hasAttribute("tabindex"))},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e.tabIndexLEZero=function(t){if(e.hasAttribute(t,"tabindex")&&t.getAttribute("tabindex").match(/^-?\d+$/)){var i=parseInt(t.getAttribute("tabindex"));return 0===i||-1===i}return!1},e.getTabbableChildren=function(t){var i=0;if(t.firstChild||"IFRAME"===t.nodeName.toUpperCase())for(var a=new d.DOMWalker(t);a.nextNode()&&a.node!=t;)1==a.node.nodeType&&!a.bEndTag&&e.isTabbable(a.node)&&++i;return i},e.normalizeSpacing=function(e){return e?e.trim().replace(/\s+/g," "):""},e.isHtmlEquiv=function(e,t){var i=!1;if(e&&"input"===e.nodeName.toLowerCase()){var a=e.getAttribute("type").toLowerCase();a&&(-1!=t.indexOf("checkbox")?i="checkbox"===a:-1!=t.indexOf("radio")&&(i="radio"===a))}return i},e.nonExistantIDs=function(t,i){var a="";if(e.normalizeSpacing(i).length<1)return a;for(var n=i.split(" "),r=t.ownerDocument,l=0;l<n.length;l++){var o="//*[@id='"+n[l]+"']";r.evaluate(o,t,r.defaultNSResolver,0,null).iterateNext()||(a+=n[l]+", ")}return e.normalizeSpacing(a).length>=2?a.substring(0,a.length-2):""},e.getDocElementsByTag=function(e,t){var i=c.FragmentUtil.getOwnerFragment(e);t=t.toLowerCase();var a=r.CacheUtil.getCache(i,"RPT_DOCELEMSBYTAG",{});return t in a||(a[t]=i.querySelectorAll(t),r.CacheUtil.setCache(i,"RPT_DOCELEMSBYTAG",a)),a[t]},e.getChildByTag=function(t,i){return e.getChildByTagHidden(t,i,!1,!1)},e.getChildByTagHidden=function(t,i,a,n){for(var r=[],l=t.firstChild;null!=l;){if(l.nodeName.toLowerCase()===i){if((a||n&&!e.shouldCheckHiddenContent(l))&&!s.VisUtil.isNodeVisible(l)){l=l.nextSibling;continue}r.push(l)}l=l.nextSibling}return r},e.getElementsByRole=function(t,i){return e.getElementsByRoleHidden(t,i,!1,!1)},e.getElementsByRoleHidden=function(t,i,a,n){var o=null;if(null===(o=n?r.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",null):r.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE",null))){o={};for(var s=t.body;null!==d.DOMWalker.parentNode(s);)s=d.DOMWalker.parentNode(s);for(var u=new d.DOMWalker(s);u.nextNode();)if(u.elem()&&!u.bEndTag){var c=[];if(u.elem()&&u.elem().hasAttribute("role")&&(c=u.elem().getAttribute("role").split(" ")),u.elem()&&0===c.length&&n){var m=l.AriaUtil.getImplicitRole(u.node);null!==m&&m.length>0&&(c=m)}if(0===c.length)continue;if(a&&e.shouldNodeBeSkippedHidden(u.node))continue;for(var p=0;p<c.length;++p)c[p]in o||(o[c[p]]=[]),o[c[p]].push(u.node)}n?r.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",o):r.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE",o)}var h=[];if("string"==typeof i){var g=i;(i=[]).push(g)}if(i.length)for(p=0;p<i.length;++p){var b=o[i[p]];if(b)for(var _=0;_<b.length;++_)h.push(b[_])}return h},e.isTarget=function(t){if(!t||1!==t.nodeType||["html","body"].includes(t.nodeName.toLowerCase())||null!==e.getAncestor(t,["svg","pre","code","script","meta","head"])||!s.VisUtil.isNodeVisible(t)||s.VisUtil.isNodeVisuallyHidden(t)||e.isNodeDisabled(t)||s.VisUtil.isElementOffscreen(t))return!1;if(e.isClickable(t))return!0;var i=l.AriaUtil.getResolvedRole(t);if(!i)return!1;if(["listitem","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","treeitem"].includes(i)){var a=t.parentElement;if(a&&"group"===l.AriaUtil.getResolvedRole(a)&&(a=a.parentElement),a&&e.isTarget(a))return!0}return!1},e.getFileExt=function(e){var t=e.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);return null!=t&&t.length>=2?"."+t[1]:""},e.getFileAnchor=function(e){var t=e.match(/#(([^;?\.]|^$)+)([;?]|$)/);return null!=t&&t.length>=2?t[1]:""},e.checkObjEmbed=function(t,i,a){var n=t.nodeName.toLowerCase();if("object"!=n&&"embed"!=n&&"a"!=n&&"area"!=n)return!1;var r=!1;if(!r&&t.hasAttribute("type")&&(r=a(t.getAttribute("type").toLowerCase())),!r&&t.hasAttribute("codetype")&&(r=a(t.getAttribute("codetype"))),!r){var l="";"embed"===n?l=t.getAttribute("src"):"a"===n||"area"===n?l=t.getAttribute("href"):t.hasAttribute("data")&&(l=t.getAttribute("data")),null===l&&(l=""),r=i(e.getFileExt(l))}if(!r&&"object"===n)for(var o=e.getChildByTagHidden(t,"param",!1,!0),s=0;!r&&null!=o&&s<o.length;++s)r=o[s].hasAttribute("value")&&i(e.getFileExt(o[s].getAttribute("value")));return r},e.isAudioObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isAudioExt,function(e){return e.startsWith("audio")})},e.isAudioExt=function(t){return e.valInArray(t.toLowerCase(),[".aif",".aifc",".aiff",".air",".asf",".au",".cda",".dsm",".dss",".dwd",".iff",".kar",".m1a",".med",".mp2",".mp3",".mpa",".pcm",".ra",".ram",".rm",".sam",".sf",".sf2",".smp",".snd",".svx",".ul",".voc",".wav",".wma",".wve"])},e.isVideoObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isVideoExt,function(e){return e.startsWith("video")||e.startsWith("application/x-shockwave-flash")})},e.isVideoExt=function(t){return e.valInArray(t.toLowerCase(),[".asf",".avi",".divx",".dv",".m1v",".m2p",".m2v",".moov",".mov",".mp4",".mpeg",".mpg",".mpv",".ogm",".omf",".qt",".rm",".rv",".smi",".smil",".swf",".vob",".wmv",".rmvb",".mvb"])},e.isImageObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isImgExt,function(e){return e.startsWith("image")})},e.isImgExt=function(t){return e.valInArray(t.toLowerCase(),e.image_extensions)},e.isHtmlExt=function(t){return e.valInArray(t.toLowerCase(),[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml"])},e.hasTriggered=function(e,t){return r.CacheUtil.getCache(e,t,!1)},e.triggerOnce=function(e,t,i){if(i)return!0;var a=r.CacheUtil.getCache(e,t,!1);return r.CacheUtil.setCache(e,t,!0),a},e.valInArray=function(e,t){for(var i in t)if(t[i]===e)return!0;return!1},e.getAncestor=function(e,t){for(var i=e;null!==i;){var a=i.nodeName.toLowerCase();if("string"==typeof t){if(a===t.toLowerCase())break}else if(t.length){for(var n in t)if(t[n]===a)return i}else if(a in t)break;i=d.DOMWalker.parentNode(i)}return i},e.isSibling=function(e,t){if(e&&t){var i=null;for(d.DOMWalker.parentNode(e)&&d.DOMWalker.parentNode(e).firstChild&&(i=d.DOMWalker.parentNode(e).firstChild);i;){if(i===t)return!0;i=i.nextSibling}}return!1},e.isDescendant=function(e,t){for(var i=d.DOMWalker.parentNode(t);null!=i;){if(i===e)return!0;i=d.DOMWalker.parentNode(i)}return!1},e.isDisabledByFirstChildFormElement=function(t){var i=["input","textarea","select","keygen","progress","meter","output"];if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(i.includes(a.node.nodeName.toLowerCase()))return!!e.isNodeDisabled(a.node);return!1},e.isDisabledByReferringElement=function(t){for(var i=t.getAttribute("id"),a=t.ownerDocument.body;null!==d.DOMWalker.parentNode(a);)a=d.DOMWalker.parentNode(a);for(var n=new d.DOMWalker(a);n.nextNode();)if(n.node&&1===n.node.nodeType&&n.elem()&&(n.elem().getAttribute("aria-describedby")||"").split(" ").includes(i)&&e.isNodeDisabled(n.node))return!0},e.getInputLabel=function(t){return e.getLabelForElement(t)},e.getLabelForElement=function(t){return e.getLabelForElementHidden(t,!1)},e.getLabelForElementHidden=function(t,i){var a=t.getRootNode();if(!r.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",null)){for(var n={},l=e.getDocElementsByTag(t,"label"),o=0;o<l.length;++o)if(l[o].hasAttribute("for")){if(i&&!s.VisUtil.isNodeVisible(l[o]))continue;n[l[o].getAttribute("for")]=l[o]}r.CacheUtil.setCache((a.nodeType,a),"AriaUtil_LABELS",n)}if(t.hasAttribute("id")){var u=t.getAttribute("id");if(u.trim().length>0)return r.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",{})[u]}return null},e.getElementAttribute=function(e,t){if(!(t&&e&&e.hasAttribute&&e.hasAttribute(t)))return null;var i=e.getAttribute(t);if(!n.ARIADefinitions.referenceProperties.includes(t))return i;for(var a=i.split(/ +/g),r=!1,l=0;a<a.length;++l){var o=document.getElementById(a[l]);if(o&&!u.DOMUtil.sameNode(o,e)){r=!0;break}}return r?i:null},e.hasImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);return a=e.removeAllFormElementsFromLabel(a),e.hasInnerContentHidden(a)}return!1},e.getImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);a=e.removeAllFormElementsFromLabel(a);var n=e.getInnerText(a);return n&&""!==n.trim()?n.trim():null}return null},e.getFormFieldLabel=function(t){var i="",a=null,n=e.getLabelForElementHidden(t,!0);if(n)a=n.innerText;else{if(!(n=e.getAncestor(t,"label"))||"label"!==n.tagName.toLowerCase()||!e.isFirstFormElement(n,t))return null;var r=n.cloneNode(!0);r=e.removeAllFormElementsFromLabel(r),a=e.getInnerText(r)}return a&&""!==a.trim()&&(i+=a.trim()),(a=e.getLabelTextFromAttribute(n,!0))&&""!==a.trim()&&(i+=a.trim()),(a=l.AriaUtil.getAriaLabel(n))&&""!==a.trim()&&(i+=a.trim()),i.trim()},e.getLabelTextFromAttribute=function(t,i){for(var a=null,n=0;n<t.children.length;n++){var r=t.children.item(n);if(e.form_labelable_elements.includes(r.nodeName.toLowerCase())){a=r;break}}for(var c=new d.DOMWalker(t),m="";c.nextNode()&&c.node!==t;)if(c.node&&1===c.node.nodeType&&c.elem()){var p=c.elem();if(i&&(s.VisUtil.isNodeHiddenFromAT(p)||s.VisUtil.isNodePresentational(p))||a&&a.contains(p))continue;var h=l.AriaUtil.getResolvedRole(p);if("textbox"===h){var g=p.getAttribute("value");g&&g.trim().length>0&&(m+=" "+g.trim())}else if("combobox"===h||"listbox"===h){var b=p.getAttribute("aria-activedescendant")||p.getAttribute("aria-selected")||p.getAttribute("aria-checked");if(b){var _=p.ownerDocument.getElementById(b);if(_&&!u.DOMUtil.sameNode(p,_)){var f=o.AccNameUtil.computeAccessibleName(_);f&&f.name&&(m+=" "+f.name.trim())}}}else if(["progressbar","scrollbar","slider","spinbutton","meter"].includes(h)){var v=p.getAttribute("aria-valuetext");v&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("aria-valuenow"))&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("value"))&&v.trim().length>0&&(m+=" "+v.trim())}var A=l.AriaUtil.getAriaLabel(p);A&&""!==A.trim()&&(m+=" "+A.trim())}return m.trim()},e.isFirstFormElement=function(t,i){if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(-1!==e.form_labelable_elements.indexOf(a.node.nodeName.toLowerCase()))return a.node===i;return!1},e.isShadowHostElement=function(t){if(e.isShadowElement(t))return!1;for(var i=t;i;){if(i.shadowRoot)return!0;i=d.DOMWalker.parentElement(i)}return!1},e.isShadowElement=function(e){return"[object ShadowRoot]"===e.getRootNode().toString()},e.removeAllFormElementsFromLabel=function(e){for(var t=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"],i=e.childNodes,a=0;a<i.length;a++)t.indexOf(i[a].nodeName.toLowerCase())>-1&&e.removeChild(i[a]);return e},e.isIdReferToSelf=function(e,t){if(!t||""===t.trim())return!1;for(var i=t.trim().split(" "),a=0,n=i.length;a<n;++a){var r=c.FragmentUtil.getById(e,i[a]);if(r&&u.DOMUtil.sameNode(r,e))return!0}return!1},e.nodeDepth=function(e){for(var t=0,i=e;null!==i;)i=d.DOMWalker.parentNode(i),t+=1;return t},e.compareNodeOrder=function(t,i){if(t===i)return 0;var a=e.nodeDepth(t),n=e.nodeDepth(i);if(n>a){for(var r=0;r<n-a;++r)i=d.DOMWalker.parentNode(i);if(t===i)return-2}else if(a>n){for(r=0;r<a-n;++r)t=d.DOMWalker.parentNode(t);if(t===i)return 2}for(;null!=t&&null!=i&&d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i);)t=d.DOMWalker.parentNode(t),i=d.DOMWalker.parentNode(i);if(null===t||null===i||d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i))return null;for(;null!=i&&i!=t;)i=i.previousSibling;return null===i?1:-1},e.attributeNonEmpty=function(e,t){return e.hasAttribute(t)&&e.getAttribute(t).trim().length>0},e.getFrameByName=function(e,t){for(var i=[e.ownerDocument.defaultView],a=0;a<i.length;){try{if(i[a].name===t)return i[a];for(var n=0;n<i[a].frames.length;++n)try{i[a].frames[n]&&!i.includes(i[a].frames[n])&&i.push(i[a].frames[n])}catch(e){}}catch(e){}++a}return null},e.defaultNSResolver=function(e){var t;switch(e){case"html":t="http://www.w3.org/1999/xhtml";case"x2":t="http://www.w3.org/TR/xhtml2";case"x":t="http://www.w3.org/1999/xhtml";case"xhtml":t="http://www.w3.org/1999/xhtml";default:t=null}return t},e.isInnerTextOnlyEmpty=function(t){var i=t.innerText;null!=i&&0!==i.trim().length||"slot"===t.nodeName.toLowerCase()||void 0===t.textContent||(i=t.textContent);var a=!(null!==i&&i.trim().length>0);if(1===t.nodeType&&"slot"===t.nodeName.toLowerCase())for(var n=0,r=t.assignedNodes();n<r.length;n++){var l=r[n];a=a&&e.isInnerTextEmpty(l)}return a},e.getInnerText=function(e){var t=e.innerText;return null!=t&&""!==t.trim()||(t=e.textContent),t},e.getOnScreenInnerText=function(t){if(!t)return null;if(3===t.nodeType)return t.nodeValue();for(var i="",a=new d.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){if(1===a.node.nodeType&&(s.VisUtil.hiddenByDefaultElements.includes(a.node.nodeName.toLowerCase())||!s.VisUtil.isNodeVisible(a.node)||s.VisUtil.isElementOffscreen(a.node))){if("title"===a.node.nodeName.toLowerCase()&&e.getAncestor(a.node,"svg"))continue;if(a.node.nextSibling){3===a.node.nextSibling.nodeType&&a.node.nextSibling.nodeValue&&""!==a.node.nextSibling.nodeValue.trim()&&(i+=" "+a.node.nextSibling.nodeValue.trim()),a.node=a.node.nextSibling;continue}break}3===a.node.nodeType&&a.node.nodeValue&&""!==a.node.nodeValue.trim()&&(i+=" "+a.node.nodeValue.trim())}return i.trim()},e.getNodeText=function(e){if(!e)return"";for(var t="",i=e.childNodes,a=0;a<i.length;++a)3==i[a].nodeType&&(t+=i[a].nodeValue);return t},e.isInnerTextEmpty=function(t){var i=e.getInnerText(t);return!(null!=i&&i.trim().length>0)},e.hasInnerContent=function(t){var i=e.getInnerText(t),a=null!==i&&i.trim().length>0;if(null!==t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode();)a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt");return a},e.hasInnerContentHidden=function(t){return e.hasInnerContentHiddenHyperLink(t,!1)},e.svgHasName=function(t){return e.attributeNonEmpty(t,"aria-label")||e.attributeNonEmpty(t,"aria-labelledby")||!!t.querySelector(":scope > title")},e.hasInnerContentHiddenHyperLink=function(t,i){if(!t)return!1;var a=!1;if(null!=t.firstElementChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;){var r=n.node;if(!((a="img"===r.nodeName.toLowerCase()&&(e.attributeNonEmpty(r,"alt")||e.attributeNonEmpty(r,"title"))&&!s.VisUtil.isNodeHiddenFromAT(r)&&!s.VisUtil.isNodePresentational(r)||"svg"===r.nodeName.toLowerCase()&&e.svgHasName(r))||1!==r.nodeType||s.VisUtil.isNodeHiddenFromAT(r)||s.VisUtil.isNodePresentational(r)||(a=!e.isInnerTextOnlyEmpty(r))||!0!==i)){a=e.attributeNonEmpty(r,"aria-label")||e.attributeNonEmpty(r,"aria-labelledby");var l=r.ownerDocument;if(l){var o=l.defaultView;if(o){var u=o.getComputedStyle(r);a||null==u||(a=(u.backgroundImage&&u.backgroundImage.indexOf||u.content)&&e.attributeNonEmpty(r,"alt"))}}}3===r.nodeType&&d.DOMWalker.parentElement(r)===t&&(a=!e.isInnerTextEmpty(r))}else a=!e.isInnerTextEmpty(t);return a},e.hasInnerContentOrAlt=function(t){var i=e.getInnerText(t),a=null!=i&&i.trim().length>0||e.attributeNonEmpty(t,"alt");if(null!=t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;)!(a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt"))&&(l.AriaUtil.hasRole(n.node,"button",!0)||l.AriaUtil.hasRole(n.node,"textbox"))&&(l.AriaUtil.hasAriaLabel(n.node)||e.attributeNonEmpty(n.node,"title")||e.getLabelForElementHidden(n.elem(),!0))&&(a=!0);return a},e.concatUniqueArrayItem=function(e,t){return-1===t.indexOf(e)&&null!==e&&t.push(e),t},e.concatUniqueArrayItemList=function(t,i){for(var a=0;null!==t&&a<t.length;a++)i=e.concatUniqueArrayItem(t[a],i);return i},e.reduceArrayItemList=function(e,t){return t&&t.length>0&&e&&e.length>0?t.filter(function(t){return!e.includes(t)}):t},e.getScopeForTh=function(e){if(e.hasAttribute("scope")){var t=e.getAttribute("scope").toLowerCase();if("row"===t||"rowgroup"===t)return"row";if("col"===t||"colgroup"===t)return"column"}var i=a([],e.parentElement.children,!0).filter(function(e){return 1===e.nodeType&&"th"!=e.tagName.toLowerCase()});return null===i||0===i.length?"column":"row"},e.getControlOfLabel=function(t){var i=e.getAncestor(t,"label");if(i&&i.hasAttribute("for"))return c.FragmentUtil.getById(t,i.getAttribute("for"));for(var a={},n=t;n;){if(1===n.nodeType){var l=n;l.hasAttribute("id")&&(a[l.getAttribute("id")]=!0)}n=d.DOMWalker.parentNode(n)}if(0===Object.keys(a).length)return null;for(var o=1===t.nodeType?t.getAttribute("aria-labelledby"):null,s=r.CacheUtil.getSetCache(t.ownerDocument,"CommonUtil::getControlOfLabel",function(){return t.ownerDocument.querySelectorAll("*[aria-labelledby]")}),u=0;u<s.length;++u)for(var m=s[u],p=0,h=m.getAttribute("aria-labelledby").split(" ");p<h.length;p++)if(h[p]in a&&!e.isIdReferToSelf(t,o))return m;return null},e.isNodeDisabled=function(t){var i=r.CacheUtil.getCache(t,"PT_NODE_DISABLED",void 0);if(void 0!==i)return i;i=!1,3===t.nodeType&&(t=d.DOMWalker.parentNode(t));var a=t.nodeName.toLowerCase(),l=t.hasAttribute("disabled"),o=i,s=t.hasAttribute("aria-disabled")&&"true"===t.getAttribute("aria-disabled");if(o||l&&n.ARIADefinitions.elementsAllowedDisabled.indexOf(a)>-1||s)return i=!0,r.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),!0;var u=d.DOMWalker.parentNode(t);if(null!=u&&1===u.nodeType){var c=e.isNodeDisabled(u);return c&&(i=!0),r.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),c}return!1},e.shouldCheckHiddenContent=function(e){return!1},e.shouldNodeBeSkippedHidden=function(t){return!e.shouldCheckHiddenContent(t)&&!s.VisUtil.isNodeVisible(t)},e.isfocusableByDefault=function(t){return!("a"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||!("area"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||-1!==["input","select","button","textarea","option","area"].indexOf(t.nodeName.toLowerCase())},e.nonTabableChildCheck=function(t){if(!t.hasAttribute("tabindex")||-1!=parseInt(t.getAttribute("tabindex")))return!1;for(var i=new d.DOMWalker(t);i.nextNode();){var a=i.elem();if(null!==a&&a.hasAttribute("tabindex")&&-1!=parseInt(a.getAttribute("tabindex"))&&!e.hasInnerContent(a))return!1}return!0},e.hasAttribute=function(e,t){var i=!1;if(e.hasAttribute)i=e.hasAttribute(t);else if(e.attributes&&e.attributes.getNamedItem){var a=e.attributes.getNamedItem(t);i=a&&a.specified}return i},e.truncateText=function(e,t){return void 0===t&&(t=150),e&&(e=e.trim()).length>t?e.substring(0,t-1)+"...":e},e.input_type_with_placeholder=["text","search","tel","url","email","password","number"],e.input_text_types=["text","file","password","checkbox","radio","search","tel","url","email","date","number","range","time","color"],e.input_time_types=["date","month","week","time","datetime-local"],e.input_other_types=["range","color","checkbox","radio","file","image"],e.form_button_types=["button","reset","submit"],e.form_labelable_elements=["input","textarea","select","keygen","progress","meter","output","button"],e.tabTagMap={button:function(e){return!e.hasAttribute("disabled")},iframe:!0,input:function(e){if(e.hasAttribute("disabled")||"hidden"===e.getAttribute("type"))return!1;if("radio"===e.getAttribute("type")){var t=e.getAttribute("name");if(!t||0===t.trim().length)return!0;var i=e.ownerDocument.querySelectorAll("input[type='radio'][name='"+t.trim()+"']");if(0===i.length||1===i.length)return!0;for(var a=null,n=0;n<i.length;n++)i[n].checked&&(a=i[n]);return null!==a?!!u.DOMUtil.sameNode(a,e):!!u.DOMUtil.sameNode(i[0],e)}return!0},select:function(e){return!e.hasAttribute("disabled")},textarea:function(e){return!e.hasAttribute("disabled")&&"hidden"!==e.getAttribute("type")},a:function(e){return e.hasAttribute("href")},area:function(e){return e.hasAttribute("href")},audio:function(e){return e.hasAttribute("controls")},video:function(e){return e.hasAttribute("controls")},summary:function(e){return e.parentElement&&"details"===e.parentElement.nodeName.toLowerCase()&&u.DOMUtil.sameNode(a([],e.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],e)},details:function(e){return e.children&&0===a([],e.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()}).length}},e.image_extensions=[".bmp",".gif",".jpg",".jpeg",".pcx",".png"],e}();t.CommonUtil=m},9196(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.TableUtil=void 0;var a=i(3946),n=i(7011),r=i(7139),l=function(){function e(){}return e.isDataTable=function(e){return!(n.AriaUtil.hasRole(e,"none")||n.AriaUtil.hasRole(e,"presentation"))},e.isComplexDataTable=function(t){if("AriaUtil_isComplexDataTable"in t)return!!t.AriaUtil_isComplexDataTable;var i=!1;if(t&&e.isDataTable(t)){for(var a=null,n=null,l=t.getElementsByTagName("tr"),o=l.length,s=0,u=0,d=0,c=0;!i&&c<o;++c)if(a=l[c].getElementsByTagName("th"),n=l[c].getElementsByTagName("td"),u=a.length,0!==(s=n.length)){i=u>1;for(var m=0;!i&&m<u;++m)i=(a[m].hasAttribute("rowspan")||a[m].hasAttribute("colspan"))&&r.CommonUtil.getAncestor(a[m],"table")===t;for(var p=0;!i&&p<s;++p)i=(n[p].hasAttribute("rowspan")||n[p].hasAttribute("colspan")||n[p].hasAttribute("headers")&&r.CommonUtil.normalizeSpacing(n[p].getAttribute("headers")).split(" ").length>2)&&r.CommonUtil.getAncestor(n[p],"table")===t}else u>0&&++d,i=2===d;if(!i){var h=t.getElementsByTagName("thead"),g=h.length;g>0&&((i=g>1)||(i=h[0].getElementsByTagName("tr").length>1))}i||0===o||(i=u>0&&!e.tableHeaderExists(t))}return t.AriaUtil_isComplexDataTable=i,i},e.isTableCellEmpty=function(e){return!e||!a.VisUtil.isNodeVisible(e)||0===e.innerHTML.replace(/&nbsp;/g," ").trim().length},e.isTableRowEmpty=function(t){if(!t||!t.cells||0===t.cells.length||!a.VisUtil.isNodeVisible(t))return!0;for(var i=!0,n=0;i&&n<t.cells.length;n++){var r=t.cells[n];i=e.isTableCellEmpty(r)}return i},e.tableHeaderExists=function(t){var i=t.rows;if(!i||0===i.length)return null;for(var a=!0,n=i[0],l=0;a&&l<i.length;l++)(n=i[l]).parentNode&&"tfoot"===n.parentNode.nodeName.toLowerCase()||(a=e.isTableRowEmpty(n));if(a)return null;for(a=!0,l=0;a&&l<n.cells.length;l++){var o=n.cells[l];a=e.isTableCellEmpty(o)||"th"===o.nodeName.toLowerCase()}if(a)return!0;a=!0;for(var s=0;a&&s<i.length;++s)i[s].parentNode&&"tfoot"===i[s].parentNode.nodeName.toLowerCase()||(a=!i[s].cells||0===i[s].cells.length||0===i[s].cells[0].innerHTML.trim().length||"td"!=i[s].cells[0].nodeName.toLowerCase());if(a)return!0;a=!0;var u=[],d=[];for(l=0;a&&l<i.length;l++)for(var c=i[l],m=0;m<c.cells.length;m++)o=c.cells[m],e.isTableCellEmpty(o)||("td"===o.nodeName.toLowerCase()?o.getAttribute("headers")&&0!==o.getAttribute("headers").trim().length?r.CommonUtil.concatUniqueArrayItemList(o.getAttribute("headers").trim().split(" "),d):a=!1:"th"===o.nodeName.toLowerCase()&&o.getAttribute("id")&&o.getAttribute("id").trim().length>0&&r.CommonUtil.concatUniqueArrayItem(o.getAttribute("id").trim(),u));return!!(a&&u.length>0&&d.every(function(e){return u.includes(e)}))},e.isLayoutTable=function(e){return n.AriaUtil.hasRole(e,"presentation")||n.AriaUtil.hasRole(e,"none")},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e}();t.TableUtil=l},3946(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.VisUtil=void 0;var a=i(4566),n=i(1686),r=i(3864),l=i(7507),o=i(7011),s=i(4919),u=i(167),d=function(){function e(){}return e.isNodeVisible=function(t){3===t.nodeType&&(t=r.DOMWalker.parentNode(t));var i,n=t;if(1!==n.nodeType)return!0;if(!n.ownerDocument)return!0;var l=n.nodeName.toLowerCase();if(null!=e.hiddenByDefaultElements&&null!=e.hiddenByDefaultElements&&e.hiddenByDefaultElements.indexOf(l)>-1)return!1;var o=a.CacheUtil.getCache(n,"PT_NODE_HIDDEN",void 0);if(void 0!==o)return o;if(o=a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1),null===e.unhideableElements||void 0===e.unhideableElements||-1===e.unhideableElements.indexOf(l)){if(!n.ownerDocument.defaultView)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);i=n.ownerDocument.defaultView.getComputedStyle(n,null);var s=n.getAttribute("hidden"),d=o,c="boolean"==typeof n.hidden&&n.hidden;if(!i&&!c&&null==s&&!d)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);if(null!==i&&("none"===i.getPropertyValue("display")||!a.CacheUtil.getCache(n,"Visibility_Check_Parent",null)&&"hidden"===i.getPropertyValue("visibility"))||"block"!==i.getPropertyValue("display")&&(c||null!=s||d))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(e.isContentHidden(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(u.ClipPathUtil.isNodeVisuallyHiddenByClipPath(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1)}var m=r.DOMWalker.parentNode(n);if(null!=m&&1===m.nodeType){a.CacheUtil.setCache(m,"Visibility_Check_Parent",!0);var p=e.isNodeVisible(m);return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",p)}return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0)},e.isNodeVisuallyHidden=function(t){if(!t||1!==t.nodeType)return!1;var i=t,n=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN",void 0);if(void 0===n){var l=s.CSSUtil.getComputedStyle(i);if("absolute"===l.position&&l.clip&&"rect(0px,0px,0px,0px)"===l.clip.replaceAll(" ","")||l.opacity&&parseFloat(l.opacity)<.1)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",!0),!0;var o=r.DOMWalker.parentElement(i);if(!o)return!1;var u=e.isNodeVisuallyHidden(o);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",u),u}return n},e.isContentHidden=function(e){if(!e)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_ContentHidden",void 0);if(void 0!==t)return t;var i=getComputedStyle(e);return i?"hidden"!==i.getPropertyValue("content-visibility")||"inline"===i.getPropertyValue("display")?(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1)},e.isElementOffscreen=function(e){if(!e)return!0;if(1!==e.nodeType)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_Offscreen",void 0);if(void 0!==t)return t;var i=(new l.DOMMapper).getUnadjustedBounds(e);return i?0===i.height||0===i.width||i.top+i.height<=0||i.left+i.width<=0?(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0)},e.isNodeHiddenFromAT=function(t){if(!t)return!1;var i=a.CacheUtil.getCache(t,"PT_NODE_HiddenFromAT",void 0);return void 0!==i?i:e.isNodeVisible(t)&&"true"!==t.getAttribute("aria-hidden")?n.DOMUtil.getAncestorWithAttribute(t,"aria-hidden","true")?(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!1),!1):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0)},e.isNodePresentational=function(e){var t=o.AriaUtil.getResolvedRole(e);return!(!t||"none"!==t&&"presentation"!==t)},e.isElementScrollable=function(e){if(!e)return!1;var t=s.CSSUtil.getComputedStyle(e);if(!t)return!1;var i=t.getPropertyValue("overflow-x"),a=t.getPropertyValue("overflow-y");if("visible"!==i||"hidden"!==a&&"scroll"!==a&&"auto"!==a||(i="auto"),"visible"!==a||"hidden"!==i&&"scroll"!==i&&"auto"!==i||(a="auto"),"clip"===i&&"visible"!==a&&"clip"!==a&&(i="hidden"),"clip"===a&&"visible"!==i&&"clip"!==i&&(a="hidden"),!("visible"!==i&&"hidden"!==i&&"clip"!==i||"visible"!==a&&"hidden"!==a&&"clip"!==a))return!1;if(Math.max(e.offsetWidth,e.offsetHeight)<30||Math.min(e.offsetWidth,e.offsetHeight)<15)return!1;var n=s.CSSUtil.getPixelsFromStyle(t.paddingLeft,e)+s.CSSUtil.getPixelsFromStyle(t.paddingRight,e),r=s.CSSUtil.getPixelsFromStyle(t.paddingTop,e)+s.CSSUtil.getPixelsFromStyle(t.paddingBottom,e);return!(e.scrollWidth-e.clientWidth<1+n&&e.scrollHeight-e.clientHeight<1+r)},e.unhideableElements=["area","param","audio"],e.hiddenByDefaultElements=["script","link","style","head","meta","base","noscript","template","datalist"],e}();t.VisUtil=d},8855(e){e.exports=JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}')}};const t={};function i(a){const n=t[a];if(void 0!==n)return n.exports;const r=t[a]={exports:{}};return e[a].call(r.exports,r,r.exports,i),r.exports}let a={};(()=>{let e=a;Object.defineProperty(e,"__esModule",{value:!0}),e.checkDemo=e.SRViewer=e.SRCursor=e.SRController=e.DOMWalker=e.Config=e.ARIAMapper=e.Checker=e.Context=void 0;var t=i(920);Object.defineProperty(e,"Context",{enumerable:!0,get:function(){return t.Context}});var n=i(7412);Object.defineProperty(e,"Checker",{enumerable:!0,get:function(){return n.Checker}});var r=i(9955);Object.defineProperty(e,"ARIAMapper",{enumerable:!0,get:function(){return r.ARIAMapper}});var l=i(4516);Object.defineProperty(e,"Config",{enumerable:!0,get:function(){return l.Config}});var o=i(3864);Object.defineProperty(e,"DOMWalker",{enumerable:!0,get:function(){return o.DOMWalker}});var s=i(5233);Object.defineProperty(e,"SRController",{enumerable:!0,get:function(){return s.SRController}});var u=i(8195);Object.defineProperty(e,"SRCursor",{enumerable:!0,get:function(){return u.SRCursor}});var d=i(8107);Object.defineProperty(e,"SRViewer",{enumerable:!0,get:function(){return d.SRViewer}}),e.checkDemo=function(e){e||(e=0);var t=new n.Checker;setTimeout(function(){t.check(document.documentElement,["IBM_Accessibility","IBM_Design"]).then(function(e){console.log(e);for(var t={FAIL:0,POTENTIAL:1,MANUAL:2,PASS:3},i=0;i<e.results.length;++i)"PASS"===e.results[i].value[1]&&e.results.splice(i--,1);e.results.sort(function(e,i){return e.category!=i.category?e.category.localeCompare(i.category):e.path.aria===i.path.aria?t[e.value[1]]-t[i.value[1]]:e.path.aria.localeCompare(i.path.aria)});for(var a=null,n=null,r=0,l=e.results;r<l.length;r++){var o=l[r];n!==o.category&&(null!==n&&(console.groupEnd(),console.groupEnd(),a=null),n=o.category,console.group(o.category)),o.path.aria!=a&&(null!==a&&console.groupEnd(),""===(a=o.path.aria)?console.group("page"):console.group(a)),console.log(o.value,o.message)}console.groupEnd(),console.groupEnd()})},e)}})(),module.exports=a})(); \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.09.02/js/ace-node.js.LICENSE.txt b/rule-server/src/static/archives/2026.09.02/js/ace-node.js.LICENSE.txt new file mode 100644 index 000000000..614ccacb5 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/js/ace-node.js.LICENSE.txt @@ -0,0 +1,15 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/rule-server/src/static/archives/2026.09.02/js/ace-sr-debug.js b/rule-server/src/static/archives/2026.09.02/js/ace-sr-debug.js new file mode 100644 index 000000000..0839e2706 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/js/ace-sr-debug.js @@ -0,0 +1,38615 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * 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. + */ +var ace; +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/v2/aria/ARIADefinitions.ts" +/*!****************************************!*\ + !*** ./src/v2/aria/ARIADefinitions.ts ***! + \****************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIADefinitions = void 0; +var ARIADefinitions = /** @class */ (function () { + function ARIADefinitions() { + } + ARIADefinitions.nameFromContent = function (role) { + return (role in ARIADefinitions.designPatterns) + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"); + }; + /* + * array of WAI-ARIA global states and properties + * @see https://www.w3.org/TR/wai-aria-1.2/#global_states + */ + ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby", + "aria-details", "aria-flowto", "aria-hidden", "aria-keyshortcuts", + "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription" + // the following are deprecated in ARIA 1.2, will indicate deprecation in individual role + , + 'aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid' + ]; + //properties contains id(s) that refer to other element(s) + ARIADefinitions.referenceProperties = ["aria-owns", "aria-controls", "aria-describedby", "aria-labelledby", "aria-flowto", "aria-activedescendant"]; + // deprecated roles + ARIADefinitions.globalDeprecatedRoles = [ + 'directory', 'doc-biblioentry', 'doc-endnote' + ]; + // the following are deprecated in ARIA 1.1 for all the roles + ARIADefinitions.globalDeprecatedProperties = [ + 'aria-grabbed', 'aria-dropeffect' + ]; + /* + * XSD data types for all WAI-ARIA properties + * along with valid values when the data type is NMTOKEN + * WAI-ARIA properties data types explaned: + * type: Used to identify the type of values allowed for the WAI-ARIA property + * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken + * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID + * true: refers to WAI-ARIA property supports hidden ID references + * false: refers to WAI-ARIA property does not support hidden ID references + * Default value will be set to false, if not specified. + */ + ARIADefinitions.propertyDataTypes = { + "aria-activedescendant": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-atomic": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-autocomplete": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty + }, + "aria-busy": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-checked": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-colcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-controls": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-current": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value + }, + "aria-describedby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-details": { + type: "http://www.w3.org/2001/XMLSchema#idrefs" + }, + "aria-disabled": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-dropeffect": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["copy", "move", "link", "execute", "popup", "none"] + }, + "aria-errormessage": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-expanded": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-flowto": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: false + }, + "aria-grabbed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-haspopup": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"] + }, + "aria-hidden": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-invalid": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value + }, + "aria-keyshortcuts": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-label": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-labelledby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-level": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-live": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["off", "polite", "assertive"] + }, + "aria-modal": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiline": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiselectable": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-orientation": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["horizontal", "vertical", "undefined"] + }, + "aria-owns": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-placeholder": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-posinset": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-pressed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-readonly": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-relevant": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["additions", "removals", "text", "all"] + }, + "aria-required": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-roledescription": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-rowcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-selected": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-setsize": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-sort": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["ascending", "descending", "other", "none"] + }, + "aria-valuemax": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuemin": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuenow": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuetext": { + type: "http://www.w3.org/2001/XMLSchema#string" + } + }; + /* + * design patterns for concrete WAI-ARIA roles + * legitimate keys for each role include: + * + * - container: appropriate container(s) for that role + * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above) + * - reqProps: required states or properties for this role + * - reqChildren: required children for this role + * - htmlEquiv: HTML equivalent for this role + * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization) + * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.) + * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.) + * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s) + */ + ARIADefinitions.designPatterns = { + "alert": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "alertdialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "application": { + container: null, + props: ["aria-activedescendant", "aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "article": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "banner": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "blockquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "button": { + container: null, + props: ["aria-expanded", "aria-pressed"], + reqProps: null, + reqChildren: null, + htmlEquiv: "button | input[@type='button']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "caption": { + container: ["figure", "grid", "table", "treegrid"], + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "cell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "checkbox": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='checkbox']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "code": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "columnheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='col']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "combobox": { + container: null, + props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-readonly", "aria-required"], + reqProps: ["aria-expanded"], + reqChildren: [], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "complementary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "comment": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "contentinfo": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "definition": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "deletion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "dialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "directory": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecated: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "doc-abstract": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-acknowledgments": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-afterword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-appendix": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-backlink": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-biblioentry": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-bibliography": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-biblioref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-chapter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-colophon": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-conclusion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-cover": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true + }, + "doc-credit": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-credits": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-dedication": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnote": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnotes": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-epigraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-epilogue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-errata": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-example": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-footnote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-foreword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-index": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-introduction": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-noteref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-notice": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagebreak": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "doc-pagelist": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagefooter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-pageheader": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-part": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-preface": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-prologue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pullquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-qna": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-subtitle": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"] + }, + "doc-tip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-toc": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "emphasis": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "feed": { + container: null, + props: null, + reqProps: null, + reqChildren: ["article"], + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "figure": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "form": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "form", + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "generic": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "div | span", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby", "aria-roledescription"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "graphics-document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"] + }, + "graphics-object": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: false, + nameFrom: ["author"] + }, + "graphics-symbol": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "grid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-readonly", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: "table", + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "gridcell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "widget", + nameFrom: ["author", "contents"] + }, + "group": { + container: null, + props: ["aria-activedescendant"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "heading": { + container: null, + props: null, + reqProps: ["aria-level"], + reqChildren: null, + htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "img": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "image": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "insertion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "link": { + container: null, + props: ["aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "list": { + container: null, + props: null, + reqProps: null, + reqChildren: ["listitem"], + htmlEquiv: "ol | ul", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "listbox": { + container: null, + props: ["aria-activedescendant", "aria-expanded", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["group", "option"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "listitem": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "log": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "main": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "mark": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "mark", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "marquee": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "math": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: false, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menu": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menubar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menuitem": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemcheckbox": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemradio": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "meter": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "navigation": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "none": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "note": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "option": { + container: ["group", "listbox"], + props: ["aria-selected", "aria-checked", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "option", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "paragraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "presentation": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "progressbar": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radio": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='radio']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radiogroup": { + container: null, + props: ["aria-activedescendant", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["radio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "region": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "row": { + container: ["grid", "rowgroup", "table", "treegrid"], + props: ["aria-activedescendant", "aria-colindex", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: ["cell", "columnheader", "gridcell", "rowheader"], + htmlEquiv: "tr", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowgroup": { + container: ["grid", "table", "treegrid"], + props: [], + reqProps: null, + reqChildren: ["row"], + htmlEquiv: "tbody | tfoot | thead", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='row']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "scrollbar": { + container: null, + props: ["aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-controls", "aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "search": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "searchbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='search']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "separator": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "slider": { + container: null, + props: ["aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "spinbutton": { + container: null, + props: ["aria-activedescendant", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "status": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "strong": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "subscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "suggestion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "superscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "switch": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "tab": { + container: ["tablist"], + props: ["aria-expanded", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "table": { + container: null, + props: ["aria-colcount", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup", "caption"], + htmlEquiv: "table", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tablist": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation"], + reqProps: null, + reqChildren: ["tab"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tabpanel": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "term": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "dfn", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "textbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='text']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "time": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "timer": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "toolbar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tooltip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tree": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation", "aria-required"], + reqProps: null, + reqChildren: ["group", "treeitem"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treegrid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treeitem": { + container: ["group", "tree"], + props: ["aria-checked", "aria-expanded", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + }; // end designPatterns + // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements + // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary + // https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled + /** note: + * if a <fieldset> is disabled, the descendant form controls are all disabled except <legend> + * If an <optgroup> is disabled, the select is still interactive (unless otherwise disabled), but none of the items in the option group are selectable. + * When an element has the disabled attribute applied, the :disabled pseudo-class also applies to it. + */ + ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element + ARIADefinitions.elementsAllowedRequired = ["select", "textarea"]; // remove 'input' and add to the individual element, becuase required is not supported on input@type="range", "color", "hidden" or any button types + ARIADefinitions.elementsAllowedReadOnly = ["textarea"]; // remove 'input' and add to the individual element, because readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types + /* https://www.w3.org/TR/html-aria/#docconformance + * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value + * documentConformanceRequirementSpecialTags contains those tags that require special considerations + */ + ARIADefinitions.documentConformanceRequirement = { + "abbr": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "address": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "article": { + implicitRole: ["article"], + validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"], + globalAriaAttributesValid: true + }, + "aside": { + implicitRole: ["complementary"], + validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-glossary", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"], + globalAriaAttributesValid: true + }, + "audio": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "b": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "base": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "bdi": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "bdo": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "blockquote": { + implicitRole: ["blockquote"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "body": { + implicitRole: ["generic"], + validRoles: null, + otherDisallowedAriaAttributes: ['aria-hidden'], + globalAriaAttributesValid: true + }, + "br": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "canvas": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "caption": { + implicitRole: ['caption'], + validRoles: null, + globalAriaAttributesValid: true, + allowAttributesFromImplicitRole: false + }, + "cite": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "code": { + implicitRole: ["code"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "col": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "colgroup": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "data": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "datalist": { + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "dd": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "del": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "details": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "dfn": { + implicitRole: ["term"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "dialog": { + implicitRole: ["dialog"], + validRoles: ["alertdialog"], + globalAriaAttributesValid: true + }, + "dl": { + implicitRole: null, + validRoles: ["group", "list", "none", "presentation"], + globalAriaAttributesValid: true + }, + "dt": { + implicitRole: ["term"], + validRoles: ["listitem"], + globalAriaAttributesValid: true + }, + "em": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "embed": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "fieldset": { + implicitRole: ["group"], + validRoles: ["none", "presentation", "radiogroup"], + globalAriaAttributesValid: true + }, + "figcaption": { + implicitRole: null, + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "form": { + implicitRole: ["form"], + validRoles: ["none", "presentation", "search"], + globalAriaAttributesValid: true + }, + "head": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "hgroup": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "h1": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h2": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h3": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h4": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h5": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h6": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "hr": { + implicitRole: ["separator"], + validRoles: ["doc-pagebreak", "none", "presentation"], + globalAriaAttributesValid: true + }, + "html": { + implicitRole: ["document"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "i": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "iframe": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "ins": { + implicitRole: ["insertion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "kbd": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "label": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "legend": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "link": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "main": { + implicitRole: ["main"], + validRoles: null, + globalAriaAttributesValid: true + }, + "map": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "mark": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "math": { + implicitRole: ["math"], + validRoles: null, + globalAriaAttributesValid: true + }, + "menu": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "meta": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "meter": { + implicitRole: ["meter"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ['aria-valuemax', 'aria-valuemin'], + allowAttributesFromImplicitRole: false + }, + "nav": { + implicitRole: ["navigation"], + validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist", "none", "presentation"], + globalAriaAttributesValid: true + }, + "noscript": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "object": { + implicitRole: null, + validRoles: ["application", "document", "img"], + globalAriaAttributesValid: true + }, + "ol": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "optgroup": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "option": { + implicitRole: ["option"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-selected"] + }, + "output": { + implicitRole: ["status"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "p": { + implicitRole: ["paragraph"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "param": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "picture": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "pre": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "progress": { + implicitRole: ["progressbar"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax"] + }, + "q": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rp": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rt": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "ruby": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "s": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-label", "aria-labelledby"] + }, + "samp": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "script": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "search": { + implicitRole: ['search'], + validRoles: ['search', 'form', 'group', 'none', 'presentation', 'region'], + globalAriaAttributesValid: true + }, + "slot": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "small": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "source": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "span": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "strong": { + implicitRole: ["strong"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "style": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "sub": { + implicitRole: ["subscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "sup": { + implicitRole: ["superscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "svg": { + implicitRole: ["graphics-document"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "table": { + implicitRole: ["table"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "template": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "textarea": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "tfoot": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "thead": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "time": { + implicitRole: ["time"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "title": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "track": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "u": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "ul": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "var": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "video": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "wbr": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + } + }; // end documentConformanceRequirement + ARIADefinitions.documentConformanceRequirementSpecialTags = { + "a": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-disabled=true"] + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "area": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["button", "link"], + globalAriaAttributesValid: true + } + }, + // TODO + // "autonomous custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."], + // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "div": { + "child-dl": { + implicitRole: ["generic"], + validRoles: ["presentation", "none"], + globalAriaAttributesValid: true + }, + "no-child-dl": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "figure": { + "child-figcaption": { + implicitRole: ["figure"], + validRoles: ['doc-example'], + globalAriaAttributesValid: true + }, + "no-child-figcaption": { + implicitRole: ["figure"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "footer": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["contentinfo"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + // TODO + // "form-associated custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise 'generic'."], + // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "header": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["banner"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + "img": { + "img-with-accname": { + implicitRole: ["img"], + //roleCondition: "when accessible name presents", + validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "meter", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "img-without-accname-empty-alt": { + implicitRole: ["presentation", "none"], + //roleCondition: "when no accessible name presents and alt=''", + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + }, + "img-without-accname-no-alt": { + implicitRole: ["img"], + //roleCondition: "when neither accessible name no alt presents", + validRoles: ["presentation", "none"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + } + }, + "input": { + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "checkbox-with-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is present", + validRoles: ["menuitemcheckbox", "option", "switch", "button"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "checkbox-without-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is not present", + validRoles: ["menuitemcheckbox", "option", "switch"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "color": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "date": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "datetime-local": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=email and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "file": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + }, + "hidden": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "image": { + implicitRole: ["button"], + validRoles: ["checkbox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "month": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "number": { + implicitRole: ["spinbutton"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + }, + "password": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "radio": { + implicitRole: ["radio"], + validRoles: ["menuitemradio"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "range": { + implicitRole: ["slider"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax", "aria-valuemin"] + }, + "reset": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "search-no-list": { + implicitRole: ["searchbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "search-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "submit": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "tel-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "tel-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "text-no-list": { + implicitRole: ["textbox"], + validRoles: ["combobox", "searchbox", "spinbutton"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "text-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + // otherDisallowedAriaAttributes: ["aria-haspopup"] // covered in a different rule + }, + "time": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "url-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "url-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "week": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "default-with-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "default-no-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + } + }, + "li": { + "child-of-list-role": { + implicitRole: ['listitem'], + validRoles: null, + globalAriaAttributesValid: true + }, + "no-child-of-list-role": { + implicitRole: ['generic'], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "section": { + "with-name": { + implicitRole: ["region"], + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + }, + "without-name": { + implicitRole: null, + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + } + }, + "select": { + "no-multiple-attr-size-gt1": { + //roleCondition: " with a multiple attribute or a size attribute having value greater than 1" + implicitRole: ["combobox"], + validRoles: ["menu"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + }, + "multiple-attr-size-gt1": { + //roleCondition: " with no multiple attribute and no size attribute having value greater than 1" + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + } + }, + "summary": { + "first-summary-of-detail": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-disabled", "aria-haspopup"] + }, + "no-first-summary-of-detail": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tbody": { + "des-table": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "td": { + "des-table": { + implicitRole: ["cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "th": { + "des-table-row-scope": { + implicitRole: ["rowheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-table-column-scope": { + implicitRole: ["columnheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-row-scope": { + implicitRole: ["rowheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-column-scope": { + implicitRole: ["columnheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tr": { + "des-table": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "default": { + implicitRole: null, + //roleCondition: "", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }; // end of documentConformanceRequirementSpecialTags + // map aria attribute to the corresponding native attribute, apply to any element applicable + // note this mapping is for the related attributes in the same element without checking the parent tree. + // refer to https://w3c.github.io/html-aria/ + ARIADefinitions.relatedAriaHtmlAttributes = { + "aria-checked": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }] + }, + "aria-disabled": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }] + }, + "aria-hidden": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }, + { + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["until-found"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }] + }, + "aria-placeholder": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["placeholder"], + htmlAttributeValues: null + }] + }, + "aria-valuemax": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["max"], + htmlAttributeValues: null + }] + //overlap case covered in the role definition: Authors SHOULD NOT use aria-valuemax on any element which allows the max attribute. Use the max attribute instead. + }, + "aria-valuemin": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["min"], + htmlAttributeValues: null + }] + ////overlap case covered in the role definition:Authors SHOULD NOT use aria-valuemin on any element which allows the min attribute. Use the min attribute instead. + }, + "aria-readonly": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "false", "false"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "true", "true"] + }] + }, + "aria-required": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }] + }, + "aria-colspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["colspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["colspan"], + htmlAttributeValues: null + }] + }, + "aria-rowspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: null + }] + }, + /** "aria-autocomplete": { + conflict: [{ + // conflict occurs if both exists, aria value is only for custom widget, rather than native + ariaAttributeValue: null, + htmlAttributeNames: ["autocomplete"], + htmlAttributeValues: null + }] + } */ + }; + ARIADefinitions.containers = []; + return ARIADefinitions; +}()); +exports.ARIADefinitions = ARIADefinitions; +; +var containerArray = []; +for (var roleDesign in ARIADefinitions.designPatterns) { + var containers = ARIADefinitions.designPatterns[roleDesign].container; + if (containers !== null) { + for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) { + var container = containers_1[_i]; + if (containerArray.indexOf(container) == -1) { + containerArray.push(container); + } + } + } +} +ARIADefinitions.containers = containerArray; + + +/***/ }, + +/***/ "./src/v2/aria/ARIAMapper.ts" +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAMapper.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAMapper = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ./ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../../v4/util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../v4/util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAWalker_1 = __webpack_require__(/*! ./ARIAWalker */ "./src/v2/aria/ARIAWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../../v4/util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var ARIAMapper = /** @class */ (function (_super) { + __extends(ARIAMapper, _super); + function ARIAMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + ARIAMapper.prototype.childrenCanHaveRole = function (node, role) { + // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = node as Element; + // if (elem.getAttribute("aria-hidden") === "true") { + // return false; + // } + // } + return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren); + }; + ARIAMapper.prototype.getRole = function (node) { + var role = ARIAMapper.nodeToRole(node); + return role; + }; + ARIAMapper.prototype.getNamespace = function () { + return "aria"; + }; + ARIAMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "ARIAMapper::getAttributes", undefined); + if (typeof cacheVal !== "undefined") + return cacheVal; + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + var name_1 = attrInfo.name.toLowerCase(); + if (name_1.startsWith("aria-")) { + retVal[name_1.substring(5)] = attrInfo.nodeValue; + } + } + // Optimize: Cache nodeName.toLowerCase() to avoid repeated calls + var nodeName = node.nodeName.toLowerCase(); + // Apply global attributes first + ARIAMapper.applyAttrRole(elem, "global", retVal); + // Apply element-specific attributes + ARIAMapper.applyAttrRole(elem, nodeName, retVal); + CacheUtil_1.CacheUtil.setCache(node, "ARIAMapper::getAttributes", retVal); + } + else if (node.nodeType === 3 /* Node.TEXT_NODE */) { + var calculators = ARIAMapper.textAttrValueCalculators; + for (var attr in calculators) { + var val = calculators[attr](node); + if (typeof val !== "undefined" && val !== null) { + retVal[attr] = val; + } + } + } + return retVal; + }; + // Optimize: Move applyAttrRole outside getAttributes to avoid function recreation + ARIAMapper.applyAttrRole = function (elem, nodeName, retVal) { + var calculators = ARIAMapper.elemAttrValueCalculators; + if (!(nodeName in calculators)) + return; + for (var attr in calculators[nodeName]) { + if (!(attr in retVal)) { + var value = calculators[nodeName][attr]; + if (typeof value !== "undefined" && value !== null) { + if (typeof value !== "string") { + value = value(elem); + } + retVal[attr] = value; + } + } + } + }; + ARIAMapper.getAriaOwnedBy = function (elem) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + if (!CacheUtil_1.CacheUtil.getCache(doc, "ARIAMapper::precalcOwned", false)) { + var owners = doc.querySelectorAll("[aria-owns]"); + for (var iOwner = 0; iOwner < owners.length; ++iOwner) { + var owner = owners[iOwner]; + var ownIds = owner.getAttribute("aria-owns").split(/ +/g); + var _loop_1 = function (iId) { + var owned = doc.getElementById(ownIds[iId]); + //ignore if the aria-owns point to the element itself + //if (owned && !DOMUtil.sameNode(owner, owned)) { + // CacheUtil.setCache(owned, "aria-owned", owner); + //} + /** + * circular hierarchy check: + * (1) the owned element is neither the same element with the owner nor any ascendant of the owner + * (2) any child with aria-owns cannot point to the owner or any ascendant of the owner + */ + if (owned && !DOMUtil_1.DOMUtil.sameNode(owner, owned)) { + // check if the owned with aria-owns that points to another element + var ownedNodes = []; + var sub_owners = owned.querySelectorAll("[aria-owns]"); + for (var i = 0; i < sub_owners.length; ++i) { + var sub_owner = sub_owners[i]; + var sub_ownIds = sub_owner.getAttribute("aria-owns").split(/ +/g); + for (var j = 0; j < sub_ownIds.length; ++j) { + var ownedNode = doc.getElementById(sub_ownIds[j]); + if (ownedNode) + ownedNodes.push(ownedNode); + } + } + if (ownedNodes.length === 0) { + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + return "continue"; + } + // check if any aria-owns points to the element itself or any of it's parent + var parent_1 = owner; + var circular = false; + while (parent_1 !== null) { + var found = ownedNodes.some(function (item) { return DOMUtil_1.DOMUtil.sameNode(parent_1, item); }); + if (!found) + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + else { + circular = true; + break; + } + } + if (!circular) + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + } + }; + for (var iId = 0; iId < ownIds.length; ++iId) { + _loop_1(iId); + } + } + CacheUtil_1.CacheUtil.setCache(doc, "ARIAMapper::precalcOwned", true); + } + return CacheUtil_1.CacheUtil.getCache(elem, "aria-owned", null); + }; + ARIAMapper.prototype.getNodeHierarchy = function (node) { + if (!node) + return []; + if (node.nodeType !== 1) { + var parentHierarchy = this.getNodeHierarchy(DOMWalker_1.DOMWalker.parentElement(node)); + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + var nodeHierarchy = []; + // Set hierarchy + for (var _i = 0, parentHierarchy_1 = parentHierarchy; _i < parentHierarchy_1.length; _i++) { + var item = parentHierarchy_1[_i]; + nodeHierarchy.push(item); + } + nodeHierarchy.push({ + attributes: {}, + bounds: this.getBounds(node), + namespace: this.getNamespace(), + node: node, + role: this.getRole(node) || null, + rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || null), + roleCount: {}, + childrenCanHaveRole: parentInfo.childrenCanHaveRole + }); + return nodeHierarchy; + } + else { + var elem = node; + var nodeHierarchy = CacheUtil_1.CacheUtil.getCache(elem, "ARIAMapper::getNodeHierarchy", null); + if (!nodeHierarchy) { + // This element hasn't been processed yet - but ::reset processes them all in the right order + // Get details about the correct parent first + var parent_2 = ARIAMapper.getAriaOwnedBy(elem); + if (!parent_2) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + while (parent_2 && parent_2.nodeType !== 1) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + var parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + while (parentInfo.role === null) { + parent_2 = ARIAMapper.getAriaOwnedBy(parent_2) || DOMWalker_1.DOMWalker.parentElement(parent_2); + parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + parentInfo = parentHierarchy[parentHierarchy.length - 1]; + } + // Set initial node info + var nodeInfo = { + attributes: elem.nodeType === 1 ? this.getAttributes(elem) : {}, + bounds: this.getBounds(elem), + namespace: this.getNamespace(), + node: elem, + role: this.getRole(elem) || null, + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + // Adjust role if we're within a presentational container + var presentationalContainer = !parentInfo.childrenCanHaveRole; + if (presentationalContainer) { + nodeInfo.role = null; + } + else { + nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole + && this.childrenCanHaveRole(elem, nodeInfo.role); + } + // Set the paths + if (nodeInfo.role !== null) { + parentInfo.roleCount[nodeInfo.role] = (parentInfo.roleCount[nodeInfo.role] || 0) + 1; + nodeInfo.rolePath = parentInfo.rolePath + "/" + nodeInfo.role + "[" + parentInfo.roleCount[nodeInfo.role] + "]"; + } + else { + nodeInfo.rolePath = parentInfo.rolePath; + } + // Set hierarchy + nodeHierarchy = []; + for (var _a = 0, parentHierarchy_2 = parentHierarchy; _a < parentHierarchy_2.length; _a++) { + var item = parentHierarchy_2[_a]; + nodeHierarchy.push(item); + } + nodeHierarchy.push(nodeInfo); + CacheUtil_1.CacheUtil.setCache(elem, "ARIAMapper::getNodeHierarchy", nodeHierarchy); + } + return nodeHierarchy; + } + }; + ARIAMapper.prototype.reset = function (node) { + ARIAMapper.nameComputationId = 0; + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + // Get to the topmost node + var goodNode = node; + var next; + while (next = DOMWalker_1.DOMWalker.parentNode(goodNode)) { + goodNode = next; + } + ; + // Walk the tree and set the hierarchies in the right order + var ariaWalker = new ARIAWalker_1.ARIAWalker(goodNode, false, goodNode); + do { + if (ariaWalker.node.nodeType === 1) { + this.getNodeHierarchy(ariaWalker.node); + } + } while (ariaWalker.nextNode()); + }; + ARIAMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + for (var idx = 0; idx < this.hierarchyResults.length; ++idx) { + if (this.hierarchyResults[idx].role && this.hierarchyResults[idx].role[0] === "/") { + this.hierarchyResults[idx].role = (this.hierarchyResults[idx].role ? this.hierarchyResults[idx].role.substring(1) : null); + } + } + return this.hierarchyResults; + }; + ARIAMapper.prototype.pushHierarchy = function (node) { + // If we're not an element, no special handling + var nodeHierarchy = []; + // Determine our node info + nodeHierarchy = this.getNodeHierarchy(node); + var nodeInfo = nodeHierarchy[nodeHierarchy.length - 1]; + this.hierarchyRole.push(nodeInfo.role); + if (nodeInfo.role !== null) { + this.hierarchyPath.push(nodeInfo); + } + this.hierarchyResults = nodeHierarchy; + }; + ARIAMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + if (retVal.length > 0) { + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + var parent_3 = DOMWalker_1.DOMWalker.parentElement(node); + this.hierarchyResults = parent_3 ? CacheUtil_1.CacheUtil.getCache(parent_3, "ARIAMapper::getNodeInfo", []) : []; + } + return retVal; + }; + /**public static computeName(cur: Node) : string { + ++ARIAMapper.nameComputationId; + return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false); + } + + public static computeNameHelp(walkId: number, cur: Node, labelledbyTraverse: boolean, walkTraverse: boolean) : string { + // 2g. None of the other content applies to text nodes, so just do this first + if (cur.nodeType === 3 ) return cur.nodeValue; + if (cur.nodeType === 11) return ""; + if (cur.nodeType !== 1 ) { + if (walkTraverse || labelledbyTraverse) return ""; + throw new Error ("Can only compute name on Element and Text " + cur.nodeType); + } + + const elem = cur as Element; + // We've been here before - prevent recursion + if (CacheUtil.getCache(elem, "data-namewalk", null) === ""+walkId) return ""; + CacheUtil.setCache(elem, "data-namewalk", ""+walkId); + // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element + + // 2a. Only show hidden content if it's referenced by a labelledby + if (!labelledbyTraverse && !VisUtil.isNodeVisible(cur)) { + return ""; + } + + // 2b. collect valid id references + if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) { + let labelledby = elem.getAttribute("aria-labelledby").split(" "); + let validElems = []; + for (const ref of labelledby) { + const refElem = FragmentUtil.getById(cur, ref); + if (refElem && !DOMUtil.sameNode(elem, refElem)) { + validElems.push(refElem); + } + } + if (validElems.length > 0) { + let accumulated = ""; + for (const elem of validElems) { + accumulated += " " + this.computeNameHelp(walkId, elem, true, false); + } + return accumulated.trim(); + } + } + + // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases + if (["section", "form"].includes(cur.nodeName.toLowerCase())) { + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse) { + return elem.getAttribute("aria-label").trim(); + } + } + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + return ""; + } + + // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label + const role = ARIAMapper.nodeToRole(cur); + let isEmbeddedControl = [ + "textbox", "button", "combobox", "listbox", + "progressbar", "scrollbar", "slider", "spinbutton" + ].includes(role); + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) { + return elem.getAttribute("aria-label").trim(); + } + } + + // 2d. + if (role !== "presentation" && role !== "none") { + if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) { + return DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim(); + } + + if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) { + let label = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id")+"']"); + if (label) { + if (label.hasAttribute("aria-label") || (label.hasAttribute("aria-labelledby") && !CommonUtil.isIdReferToSelf(cur, label.getAttribute("aria-labelledby")))) { + return this.computeNameHelp(walkId, label, false, false); + } else { + return label.textContent; + } + } + } + if (cur.nodeName.toLowerCase() === "fieldset") { + if( (<Element>cur).querySelector("legend")){ + let legend = (<Element>cur).querySelector("legend"); + return legend.innerText; + }else{ + return this.computeNameHelp(walkId, cur, false, false); + } + + } + + } + + // 2e. + if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) { + // If the embedded control has role textbox, return its value. + if (role === "textbox") { + if (elem.nodeName.toLowerCase() === "input") { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + } else { + walkTraverse = false; + } + } + + // If the embedded control has role button, return the text alternative of the button. + if (role === "button") { + if (elem.nodeName.toLowerCase() === "input") { + let type = elem.getAttribute("type").toLowerCase(); + if (["button", "submit", "reset"].includes(type)) { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + if (type === "submit") return "Submit"; + if (type === "reset") return "Reset"; + } + } else { + walkTraverse = false; + } + } + + // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option. + if (role === "combobox") { + if (elem.hasAttribute("aria-activedescendant")) { + let selected = FragmentUtil.getById(elem, "aria-activedescendant"); + if (selected && !DOMUtil.sameNode(elem, selected)) { + return ARIAMapper.computeNameHelp(walkId, selected, false, false); + } + } + } + + // If the embedded control has role range (e.g., a spinbutton or slider): + if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) { + // If the aria-valuetext property is present, return its value, + if (elem.hasAttribute("aria-valuetext")) return elem.getAttribute("aria-valuetext"); + // Otherwise, if the aria-valuenow property is present, return its value, + if (elem.hasAttribute("aria-valuenow")) return elem.getAttribute("aria-valuenow"); + // TODO: Otherwise, use the value as specified by a host language attribute. + } + } + + // 2f. 2h. + if (walkTraverse || ARIADefinitions.nameFromContent(role) || labelledbyTraverse) { + // 2fi. Set the accumulated text to the empty string. + let accumulated = ""; + // 2fii. Check for CSS generated textual content associated with the current node and + // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2] + // can provide textual content for elements that have a content model. + // For :before pseudo elements, User agents MUST prepend CSS textual content, without + // a space, to the textual content of the current node. + // For :after pseudo elements, User agents MUST append CSS textual content, without a + // space, to the textual content of the current node. + let before = null; + before = elem.ownerDocument.defaultView.getComputedStyle(elem,"before").content; + + if (before && before !== "none") { + before = before.replace(/^"/,"").replace(/"$/,""); + accumulated += before; + } + // 2fiii. For each child node of the current node: + // Set the current node to the child node. + // Compute the text alternative of the current node beginning with step 2. Set the result + // to that text alternative. + // Append the result to the accumulated text. + if (elem.nodeName.toUpperCase() === "SLOT") { + //if no assignedNode, check its own text + if (!(elem as HTMLSlotElement).assignedNodes() || (elem as HTMLSlotElement).assignedNodes().length === 0) { + let innerText = CommonUtil.getInnerText(elem); + if (innerText && innerText !== null && innerText.trim().length > 0) + accumulated += " " + innerText; + } else { + // check text from all assigned nodes + for (const slotChild of (elem as HTMLSlotElement).assignedNodes()) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + } + } + } else { + let walkChild = elem.firstChild; + while (walkChild) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + walkChild = walkChild.nextSibling; + } + } + + let after = null; + try { + after = elem.ownerDocument.defaultView.getComputedStyle(elem,"after").content; + } catch (e) {} + + if (after && after !== "none") { + after = after.replace(/^"/,"").replace(/"$/,""); + accumulated += after; + } + // 2fiv. Return the accumulated text. + accumulated = accumulated.replace(/\s+/g," ").trim(); + if (accumulated.trim().length > 0) { + return accumulated; + } + } + + // 2i. Otherwise, if the current node has a Tooltip attribute, return its value. + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + if (elem.tagName.toLowerCase() === "svg") { + let title = elem.querySelector("title"); + if (title) { + return title.textContent || title.innerText; + } + } + + return ""; + } + */ + /* if (role in ARIADefinitions.designPatterns + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) + { + name = elem.textContent; + } + if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) { + name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent; + } + if (elem.hasAttribute("aria-label")) { + name = elem.getAttribute("aria-label"); + } + if (elem.hasAttribute("aria-labelledby")) { + name = ""; + const ids = elem.getAttribute("aria-labelledby").split(" "); + for (const id of ids) { + name += FragmentUtil.getById(elem, id).textContent + " "; + } + name = name.trim(); + } + return name; + }*/ + ARIAMapper.nodeToRole = function (node) { + if (node.nodeType === 3 /* Node.TEXT_NODE */) { + return "text"; + } + else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + var elem = node; + if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + // TO DO: use AriaUtil.getResolvedRole(elem) to replace the code following, which uses only the valid roles for the element based on the aria fallback rule + //const role = AriaUtil.getResolvedRole(elem); + //return role === "presentation" || role === "none" ? null : role; + if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) { + var roleStr = elem.getAttribute("role").trim(); + var roles_2 = roleStr.split(" "); + for (var _i = 0, roles_1 = roles_2; _i < roles_1.length; _i++) { + var role_1 = roles_1[_i]; + if (role_1 === "presentation" || role_1 === "none") { + // If element is focusable, then presentation roles are to be ignored + if (!CommonUtil_1.CommonUtil.isFocusable(elem)) { + return null; + } + } + else if (role_1 in ARIADefinitions_1.ARIADefinitions.designPatterns) { + return role_1; + } + } + } + //return this.elemToImplicitRole(elem); + var roles = AriaUtil_1.AriaUtil.getImplicitRole(elem); + //console.log("node=" + node.nodeName +", role= " + (roles ? roles[0] : null) +", resolved=" + AriaUtil.getResolvedRole(elem)); + var role = !roles || roles.length === 0 ? null : roles[0]; + return role === "presentation" || role === "none" ? null : role; + //return AriaUtil.getResolvedRole(elem); + }; + //////////////////////////////////////////////////////////////////////////// + // Helper functions + //// + // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis + ARIAMapper.elemAttrValueCalculators = { + "global": { + "name": function (elem) { var _a; return (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem)) === null || _a === void 0 ? void 0 : _a.name; } //ARIAMapper.computeName + }, + "datalist": { + // set to "true" if the datalist's selection model allows multiple option elements to be + // selected at a time, and "false" otherwise + "multiselectable": function (elem) { + var id = elem.getAttribute("id"); + if (id && id.length > 0) { + var input = elem.ownerDocument.querySelector("input[list='" + id + "']"); + return "" + (elem.getAttribute("multiple") + && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == "")); + } + return null; + } + }, + "h1": { + "level": "1" + }, + "h2": { + "level": "2" + }, + "h3": { + "level": "3" + }, + "h4": { + "level": "4" + }, + "h5": { + "level": "5" + }, + "h6": { + "level": "6" + }, + "input": { + // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute + // is true, or "true" if the element's checkedness is true, or "false" otherwise + // - type="radio" state set to "true" if the element's checkedness is true, or "false" + // otherwise. + "checked": function (elem) { + var type = elem.getAttribute("type"); + if (type === "checkbox" || type === "radio") { + return "" + elem.checked; + } + return null; + } + // - type="radio" and not in menu reflecting number of type=radio input elements + // within the radio button group + , + "setsize": function (elem) { return null; // removed by dead control flow + } + // - type="radio" and not in menu value reflecting the elements position + // within the radio button group." + , + "posinset": function (elem) { return null; // removed by dead control flow + } + // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a + // suggestions source element) combobox role, with the aria-owns property set to the same + // value as the list attribute + , + "owns": function (elem) { return null; // removed by dead control flow + } + }, + "keygen": { + "multiselectable": "false" + }, + "li": { + // Number of li elements within the ol, ul, menu + "setsize": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var otherlis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::otherlis", function () { return parent.querySelectorAll("ol li, ul li, menu li"); }); + return "" + (lis.length - otherlis.length); + } + // Position of li element within the ol, ul, menu + , + "posinset": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var num = 0; + for (var idx = 0; idx < lis.length; ++idx) { + var li = lis[idx]; + if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) { + return "" + num; + } + ++num; + } + return null; + } + }, + "menuitem": { + // type = checkbox or radio, set to "true" if the checked attribute + // is present, and "false" otherwise + "checked": function (elem) { return "" + !!(elem.getAttribute("checked") + && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); } + }, + "option": { + // set to "true" if the element's selectedness is true, or "false" otherwise. + "selected": function (elem) { return "" + !!(elem.getAttribute("selected") + && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); } + }, + "progress": { + "valuemax": function (elem) { return elem.getAttribute("max") || "1"; }, + "valuemin": function (elem) { return "0"; }, + "valuenow": function (elem) { return elem.getAttribute("value"); } + } + }; + ARIAMapper.textAttrValueCalculators = { + "name": function (node) { return node.nodeValue; } + }; + ARIAMapper.nameComputationId = 0; + return ARIAMapper; +}(CommonMapper_1.CommonMapper)); +exports.ARIAMapper = ARIAMapper; + + +/***/ }, + +/***/ "./src/v2/aria/ARIAWalker.ts" +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAWalker.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAWalker = void 0; +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ./ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +/** + * Walks in an ARIA order + * + * See also ../dom/DOMWalker + */ +var ARIAWalker = /** @class */ (function () { + function ARIAWalker(element, bEnd, root) { + this.root = root || element; + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + // if (this.node.nodeType === 9) { + // this.node = (this.node as Document).documentElement + // } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + } + ARIAWalker.prototype.atRoot = function () { + if (this.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + ARIAWalker.prototype.nextNode = function () { + var skipOwned = false; + do { + skipOwned = false; + // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = true; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + ARIAWalker.prototype.prevNode = function () { + var skipOwned = false; + do { + skipOwned = false; + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + return ARIAWalker; +}()); +exports.ARIAWalker = ARIAWalker; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/ancestor.ts" +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/ancestor.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AncestorUtil = void 0; +var AncestorUtil = /** @class */ (function () { + function AncestorUtil() { + } + AncestorUtil.isPresentationFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 + && elem.nodeName.toLowerCase() === "iframe" + && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) { + return true; + } + } + } + return false; + }; + AncestorUtil.isFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") { + return true; + } + } + } + return false; + }; + return AncestorUtil; +}()); +exports.AncestorUtil = AncestorUtil; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/fragment.ts" +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/fragment.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FragmentUtil = void 0; +var FragmentUtil = /** @class */ (function () { + function FragmentUtil() { + } + FragmentUtil.getOwnerFragment = function (node) { + var n = node; + while (n.parentNode && (n = n.parentNode)) { + if (n.nodeType === 11) { + return n; + } + } + return node.ownerDocument; + }; + FragmentUtil.getById = function (node, id) { + return this.getOwnerFragment(node).getElementById(id); + }; + FragmentUtil.getAncestor = function (hierarchies, elemName) { + var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; }); + return matches.length > 0 && matches[0].node || null; + }; + FragmentUtil.getAncestorWithRole = function (hierarchies, role) { + var matches = hierarchies["aria"].filter(function (info) { return info.role === role; }); + return matches.length > 0 && matches[0].node || null; + }; + return FragmentUtil; +}()); +exports.FragmentUtil = FragmentUtil; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/lang.ts" +/*!***************************************************!*\ + !*** ./src/v2/checker/accessibility/util/lang.ts ***! + \***************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2021- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LangUtil = void 0; +// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry +var validPrimaryLangs = [ + ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"], + ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"], + ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"], + ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"], + ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"], + ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"], + ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"], + ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"], + ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"], + ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"], + ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"], + ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"], + ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"], + ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"], + ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"], + ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"], + ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"], + ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"], + ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"], + ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"], + ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"], + ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"], + ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"], + ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"], + ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"], + ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"] +]; +var LangUtil = /** @class */ (function () { + function LangUtil() { + } + /* Determine if given string is a valid BCP 47 string */ + LangUtil.isBcp47 = function (langStr) { + return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr); + }; + LangUtil.validPrimaryLang = function (langStr) { + var primary = langStr.toLowerCase(); + if (primary.includes("-")) { + primary = primary.split("-")[0]; + } + if (!primary.match(/[a-z]{2,3}/)) + return false; + // qaa..qtz + if (primary.length === 3 + && primary.charAt(0) === "q" + && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116 + && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) { + } + return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary); + }; + LangUtil.matchPrimaryLang = function (lang1, lang2) { + var primary1 = lang1; + if (primary1.includes("-")) { + primary1 = primary1.split("-")[0]; + } + var primary2 = lang2; + if (primary2.includes("-")) { + primary2 = primary2.split("-")[0]; + } + return primary1.toLowerCase() === primary2.toLowerCase(); + }; + return LangUtil; +}()); +exports.LangUtil = LangUtil; + + +/***/ }, + +/***/ "./src/v2/common/CommonMapper.ts" +/*!***************************************!*\ + !*** ./src/v2/common/CommonMapper.ts ***! + \***************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonMapper = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonMapper = /** @class */ (function () { + function CommonMapper() { + this.hierarchyRole = null; + this.hierarchyPath = null; + this.hierarchyResults = null; + } + CommonMapper.prototype.getBounds = function (node) { + return null; + }; + CommonMapper.prototype.reset = function (node) { + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + var ancestors = []; + var parent = DOMWalker_1.DOMWalker.parentNode(node); + while (parent && parent.nodeType != 9 /* Node.DOCUMENT_NODE */) { + ancestors.push(parent); + parent = DOMWalker_1.DOMWalker.parentNode(parent); + } + ancestors = ancestors.reverse(); + for (var _i = 0, ancestors_1 = ancestors; _i < ancestors_1.length; _i++) { + var ancestor = ancestors_1[_i]; + var siblings = []; + var sibling = ancestor.previousSibling; + while (sibling) { + siblings.push(sibling); + sibling = sibling.previousSibling; + } + siblings = siblings.reverse(); + for (var _a = 0, siblings_1 = siblings; _a < siblings_1.length; _a++) { + var sibling_1 = siblings_1[_a]; + this.pushHierarchy(sibling_1); + this.popHierarchy(); + } + this.pushHierarchy(ancestor); + } + }; + CommonMapper.prototype.pushHierarchy = function (node) { + var role = this.getRole(node) || null; + this.hierarchyRole.push(role); + if (role !== null) { + var parentPathInfo = this.hierarchyPath[this.hierarchyPath.length - 1]; + parentPathInfo.roleCount[role] = (parentPathInfo.roleCount[role] || 0) + 1; + this.hierarchyPath.push({ + "rolePath": parentPathInfo.rolePath + "/" + role + "[" + parentPathInfo.roleCount[role] + "]", + "roleCount": {} + }); + } + var attr = {}; + if (node.nodeType === 1) { + attr = this.getAttributes(node); + } + this.hierarchyResults.push({ + node: node, + namespace: this.getNamespace(), + role: role, + attributes: attr, + rolePath: this.hierarchyPath[this.hierarchyPath.length - 1].rolePath, + bounds: this.getBounds(node) + }); + }; + CommonMapper.prototype.popHierarchy = function () { + var role = this.hierarchyRole.pop(); + if (role !== null) { + this.hierarchyPath.pop(); + } + this.hierarchyResults.pop(); + }; + CommonMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + return this.hierarchyResults; + }; + CommonMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + this.popHierarchy(); + return retVal; + }; + return CommonMapper; +}()); +exports.CommonMapper = CommonMapper; + + +/***/ }, + +/***/ "./src/v2/common/Context.ts" +/*!**********************************!*\ + !*** ./src/v2/common/Context.ts ***! + \**********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = exports.PartInfo = exports.AttrInfo = void 0; +// Context that will cause this rule to execute. +// Context syntax: +// Triggers: +// aria:role - Triggers on element with ARIA role role +// aria:role[attribute] - Triggers on elements with the equivalent logical +// aria- attribute (e.g., button[disabled] will trigger on +// <button disabled> or <div role="button" aria-disabled="true">) +// role[attribute=value] - Similar to above, with case-sensitive match +// to value +// role[attribute~value] - Similar to above, with case-insensitive match +// dom:element - Triggers on an element with the specified name +// dom:element[attribute] - Triggers on a dom element with the specified attribute +// dom:*[attribute] - Triggers on all elements with the specified attribute +// Combining triggers: +// trigger1 trigger2 - Triggers on elements with trigger2 within an +// element with trigger1 +// !trigger1 trigger2 - Triggers on elements with trigger2 not within +// element with trigger1 +// trigger1>trigger2 - Triggers on elements with trigger2 with an +// an immediate parent with trigger1 +// trigger1+trigger2 - Triggers on elements with trigger2 with an +// immediate previous sibling with trigger1 +// trigger1~trigger2 - Triggers on elements with trigger2 with an +// some earlier sibling with trigger1 +// context,context - Triggers on elements with either context +var AttrInfo = /** @class */ (function () { + function AttrInfo(inclusive, attr, eq, value) { + this.inclusive = inclusive; + this.attr = attr; + this.eq = eq; + this.value = value; + if (!inclusive + && ((typeof eq) !== "undefined" && eq.length > 0)) { + throw new Error("Cannot have !attr" + eq + " context"); + } + if (inclusive && (typeof eq) !== "undefined" && eq.length > 0 && ((typeof value) === "undefined" || value.length === 0)) { + throw new Error("Cannot have equivalence check without a value"); + } + } + AttrInfo.prototype.matches = function (context) { + var ruleAttrPart = this; + var elemAttrs = context.attributes; + if (!(ruleAttrPart.attr in elemAttrs)) { + return !ruleAttrPart.inclusive; + } + else if (!ruleAttrPart.inclusive) { + return false; + } + else if (!ruleAttrPart.eq) { + // inclusive match and I have that attribute and no equivalence defined + return true; + } + else { + // inclusive match and I have that attribute and equivalence defined + var attrValue = elemAttrs[ruleAttrPart.attr]; + if (ruleAttrPart.eq === "=") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!=") { + return ruleAttrPart.value !== attrValue; + } + else if (ruleAttrPart.eq === "~") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!~") { + return ruleAttrPart.value !== attrValue; + } + else { + throw new Error("Context equivalence operator not supported"); + } + } + }; + return AttrInfo; +}()); +exports.AttrInfo = AttrInfo; +var PartInfo = /** @class */ (function () { + function PartInfo(inclusive, namespace, role, attrs, connector) { + this.inclusive = inclusive; + this.namespace = namespace; + this.role = role; + this.attrs = attrs; + this.connector = connector; + if (role === "*" && !inclusive) { + throw new Error("!* context not supported"); + } + } + PartInfo.prototype.matches = function (contextHier, hierLevel) { + var rulePart = this; + var ruleRoleMatch = (rulePart.namespace in contextHier) && contextHier[rulePart.namespace][hierLevel] + && (contextHier[rulePart.namespace][hierLevel].role === rulePart.role + || contextHier[rulePart.namespace][hierLevel].role !== "none" && rulePart.role === "*"); + if (ruleRoleMatch + && rulePart.role === "*" + && rulePart.namespace === "dom" + && (contextHier[rulePart.namespace][hierLevel].role === "#text" + || contextHier[rulePart.namespace][hierLevel].role === "/#text")) { + ruleRoleMatch = false; + } + if (rulePart.inclusive && !ruleRoleMatch) + return false; + if (!rulePart.inclusive && !ruleRoleMatch) + return true; + // Match the attributes + var ruleAttrs = rulePart.attrs; + var elemContext = contextHier[rulePart.namespace][hierLevel]; + var match = true; + for (var _i = 0, ruleAttrs_1 = ruleAttrs; _i < ruleAttrs_1.length; _i++) { + var ruleAttrPart = ruleAttrs_1[_i]; + match = match && ruleAttrPart.matches(elemContext); + } + if (!rulePart.inclusive) + match = !match; + return match; + }; + return PartInfo; +}()); +exports.PartInfo = PartInfo; +var Context = /** @class */ (function () { + function Context(context) { + this.contextInfo = []; + var contextHierMatches = context.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g); + var results = []; + for (var _i = 0, contextHierMatches_1 = contextHierMatches; _i < contextHierMatches_1.length; _i++) { + var part = contextHierMatches_1[_i]; + var parts = part.match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/); + var attrInfo = []; + for (var _a = 0, _b = parts[3].match(/\[([^\]]+)\]/g) || []; _a < _b.length; _a++) { + var attrPart = _b[_a]; + var attrParts = attrPart.match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/); + attrInfo.push(new AttrInfo(attrParts[1] !== "!", attrParts[2].toLowerCase(), attrParts[3], attrParts[4])); + } + parts[2] = parts[2].toLowerCase(); + var nsParts = parts[2].split(":"); + var incl = parts[1] !== "!"; + var ns = nsParts.shift(); + var role = nsParts.join(":"); + var partInfo = new PartInfo(incl, ns, role, attrInfo, parts[parts.length - 1]); + results.push(partInfo); + } + this.contextInfo = results; + } + Context.cleanContext = function (context) { + context = context.toLowerCase().trim(); + context = context.replace(/ +!/g, " !"); + context = context.replace(/ +([>+~,])/g, "$1"); + context = context.replace(/([>+~,]) +/g, "$1"); + context = context.replace(/ +/g, " "); + return context.trim(); + }; + Context.parse = function (context) { + var contexts = Context.splitMultiple(Context.cleanContext(context)); + var retVal = []; + for (var i = 0; i < contexts.length; ++i) { + var ctx = new Context(contexts[i]); + retVal.push(ctx); + } + return retVal; + }; + /** + * Handles initial processing of splitting on comma - context,context + * @param context + */ + Context.splitMultiple = function (context) { + var contexts = []; + if (context) { + if (context.indexOf(",") === -1) { + contexts.push(context); + } + else { + for (var _i = 0, _a = context.split(","); _i < _a.length; _i++) { + var c = _a[_i]; + contexts.push(c); + } + } + } + return contexts; + }; + return Context; +}()); +exports.Context = Context; + + +/***/ }, + +/***/ "./src/v2/common/Engine.ts" +/*!*********************************!*\ + !*** ./src/v2/common/Engine.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Engine = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var Context_1 = __webpack_require__(/*! ./Context */ "./src/v2/common/Context.ts"); +var Config_1 = __webpack_require__(/*! ../config/Config */ "./src/v2/config/Config.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../../v4/api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var WrappedRule = /** @class */ (function () { + function WrappedRule(rule, parsedInfo) { + this.rule = rule; + this.parsedInfo = parsedInfo; + this.ns = this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length - 1].namespace; + Config_1.Config.DEBUG && console.log("Added Rule:", rule.id, JSON.stringify(this.parsedInfo)); + } + /** + * This function is responsible converting the node into a snippet which can be added to report. + * + * Note: This function will take the node and extract the node name and the attributes and build the snippet based on this. + * + * TODO: Future, maybe we can extract more then just single line, add more info or even add closing tags etc... + * + * @param {HTMLElement} node - The html element to convert into element snippet with node name and attributes only. + * + * @return {String} nodeSnippet - return the element snippet of the element that was provided which only contains, + * nodename and attributes. i.e. <table id=\"layout_table1\" role=\"presentation\"> + * + * @memberOf this + */ + WrappedRule.convertNodeToSnippet = function (node) { + // Variable Decleration + var nodeSnippet = ''; + // Extract the node name and add it to the node snippet + nodeSnippet += '<' + node.nodeName.toLowerCase(); + // Extract all the node attributes as an array + var nodeAttributes = node.attributes; + // In the case there are attributes on this node + if (nodeAttributes !== null && typeof nodeAttributes !== 'undefined') { + // Loop over all theses attributes and add the name and value to the nodeSnippet which will be returned + for (var i = nodeAttributes.length - 1; i >= 0; i--) { + if (nodeAttributes[i].name === "data-namewalk") + continue; + // Add the attribute name and value. + nodeSnippet += ' ' + nodeAttributes[i].name + '="' + nodeAttributes[i].value + '"'; + } + } + // Close the node + nodeSnippet += '>'; + // Return the node snippet + return nodeSnippet; + }; + /** + * This function is responsible for finding the source location for a node, which can be added to a report. + * Supports debug directives in the following forms: + * 1. An attribute on the element itself: + * ibm-a11y-debug="file.ts:10:5" + * 2. A comment node preceding the element (as a sibling or ancestor sibling): + * <!-- ibm-a11y-debug: file.ts:10:5 --> + * 3. A wrapper element (e.g. div) whose first non-whitespace child is such a comment node. + * 4. An ancestor element that carries the ibm-a11y-debug attribute. + * + * Traversal: checks the node itself for an inline attribute, then scans previous siblings at + * each ancestor level upward (also checking each ancestor element's own inline attribute), + * stopping if a blank or 'end' marker is found. + * + * @param {Node} node - The DOM node to find source info for + * @return {string | null} - The source location string, or null if not found + * + * @memberOf this + */ + WrappedRule.convertNodeToSource = function (node, enabled) { + if (enabled === void 0) { enabled = false; } + //console.log("Source Map enabled:", enabled); + if (!enabled || !node) + return null; + var DEBUG_DIRECTIVE = "ibm-a11y-debug"; + /** + * Parses a source string into a DirectiveResult. + * The source is the final resolved value — after any ':' separator has already been stripped. + * A blank value or the exact word 'end' (case-insensitive) is a stop marker. + */ + var parseSource = function (source) { + if (!source || source.toLowerCase() === 'end') { + return { found: true, stop: true }; + } + return { found: true, stop: false, source: source }; + }; + /** + * Extracts the debug-directive comment value from a node. + * Handles: + * - A comment node directly + * - A wrapper element (e.g. <div>) whose first non-whitespace child is a comment node + * + * Returns { found: true, stop: true } if the directive is blank or exactly 'end', + * returns { found: true, stop: false, source } if a valid source is found, + * or returns { found: false } if no directive is present on this node. + */ + var extractDirective = function (elem) { + if (!elem) + return { found: false }; + var commentValue = null; + if (elem.nodeType === Node.COMMENT_NODE) { + // Direct comment node + commentValue = elem.nodeValue; + } + else if (elem.nodeType === Node.ELEMENT_NODE) { + // Element wrapper (e.g. <div><!-- ibm-a11y-debug: ... --></div>) + // Find the first non-whitespace child node + var child = elem.firstChild; + while (child) { + if (child.nodeType === Node.TEXT_NODE) { + // Skip pure whitespace text nodes + if (child.nodeValue && child.nodeValue.trim().length > 0) { + // Non-whitespace text before a comment — not a directive wrapper + break; + } + } + else if (child.nodeType === Node.COMMENT_NODE) { + commentValue = child.nodeValue; + break; + } + else { + // Any other node type before a comment — not a directive wrapper + break; + } + child = child.nextSibling; + } + } + if (commentValue !== null) { + var trimmed = commentValue.trim(); + // Match exactly "ibm-a11y-debug" followed by end-of-string, whitespace, or ':' + // This prevents "ibm-a11y-debug-extra" from being treated as a directive. + if (trimmed === DEBUG_DIRECTIVE || + trimmed.startsWith(DEBUG_DIRECTIVE + ':') || + trimmed.startsWith(DEBUG_DIRECTIVE + ' ') || + trimmed.startsWith(DEBUG_DIRECTIVE + '\t')) { + // Strip the directive name and optional leading whitespace + var afterDirective = trimmed.substring(DEBUG_DIRECTIVE.length).trimStart(); + // Strip a single leading ':' separator if present + // (e.g. "ibm-a11y-debug: file.ts:10:5" → afterDirective = ": file.ts:10:5") + var source = afterDirective.startsWith(':') + ? afterDirective.substring(1).trim() + : afterDirective.trim(); + return parseSource(source); + } + } + return { found: false }; + }; + /** + * Returns the ibm-a11y-debug attribute value from an element node as a DirectiveResult, + * or { found: false } if absent. Recognises the 'end' stop marker just like comment directives. + * The attribute value is the source directly (no ':' prefix), e.g. ibm-a11y-debug="file.ts:10:5". + */ + var getInlineAttr = function (n) { + if (n.nodeType !== Node.ELEMENT_NODE) + return { found: false }; + var val = n.getAttribute(DEBUG_DIRECTIVE); + if (val === null) + return { found: false }; + // Attribute value is the source directly — no ':' separator to strip + return parseSource(val.trim()); + }; + /** + * Traverses left (previous siblings) then upward (parent) to find source info. + * Does NOT check the starting element itself — only its preceding siblings and ancestors. + * This avoids misidentifying a content node as its own source directive. + * + * At each ancestor level the function also checks the ancestor element's own inline + * ibm-a11y-debug attribute, so that a parent element can annotate all its descendants. + * + * Sibling scanning stops at the first node that is recognised as a directive (found or stop). + * Non-directive nodes (real content elements, text nodes) are skipped so that a directive + * placed further back in the sibling list is still found even if content nodes intervene. + * However, traversal does NOT cross element boundaries when scanning siblings — only + * comment nodes and dedicated wrapper elements (whose sole first child is a comment) are + * treated as transparent. + * + * Shadow DOM traversal: uses DOMWalker.parentNode() to cross shadow boundaries correctly, + * including slotted content and nested Shadow DOM (shadow-in-shadow). When the parent + * chain reaches a ShadowRoot, DOMWalker.parentNode() automatically resolves it to the + * shadow host element in the outer DOM. A plain DocumentFragment with no host returns + * null from DOMWalker.parentNode(), stopping traversal. + * + * Sibling traversal uses DOMWalker.previousSiblingNotOwnedBySlot() to skip nodes that + * are assigned to slots (and therefore logically belong to a different part of the tree). + * + * Uses an iterative approach (rather than recursion) to safely handle deeply nested + * DOM structures without risk of stack overflow. + * + * @param elem - The node whose context we are searching + * @returns The source location string, or null if not found + */ + var findSource = function (elem) { + var current = elem; + while (current) { + // Scan previous siblings for a debug directive comment or wrapper element. + // Use previousSiblingNotOwnedBySlot to skip nodes assigned to slots, which + // logically belong to a different part of the composed tree. + // Only comment nodes and dedicated wrapper elements are considered directives; + // all other node types are skipped (they do not block further scanning). + var prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(current); + while (prev) { + var result = extractDirective(prev); + if (result.found) { + if (result.stop) + return null; + return result.source; + } + prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(prev); + } + // No directive found among siblings — move up to parent. + // Use DOMWalker.parentNode() instead of node.parentNode directly so that: + // 1. Shadow DOM boundaries are crossed automatically (ShadowRoot → host element), + // supporting both regular and nested Shadow DOM (shadow-in-shadow). + // 2. Slotted nodes are re-parented to their slot owner rather than their + // light-DOM parent, matching the composed (rendered) tree structure. + // 3. Nodes with an ownerElement (e.g. iframe document roots) are re-parented + // to their owner element. + var parent_1 = DOMWalker_1.DOMWalker.parentNode(current); + if (!parent_1 || parent_1.nodeType === Node.DOCUMENT_NODE) { + // Reached the top of the tree (or a plain DocumentFragment with no host) + // without finding a directive. + return null; + } + // Check the parent element's own inline attribute before continuing upward. + // This allows a containing element to annotate all its descendants. + // An 'end' inline attribute on the parent stops traversal entirely. + var parentAttrResult = getInlineAttr(parent_1); + if (parentAttrResult.found) { + if (parentAttrResult.stop) + return null; + return parentAttrResult.source; + } + current = parent_1; + } + return null; + }; + // First, check for an inline attribute directive on the element itself. + // An 'end' attribute on the element itself stops traversal (returns null). + var selfAttrResult = getInlineAttr(node); + if (selfAttrResult.found) { + if (selfAttrResult.stop) + return null; + return selfAttrResult.source; + } + // Then traverse the DOM to find a preceding comment directive or ancestor attribute + return findSource(node); + }; + WrappedRule.prototype.run = function (engine, context, options, contextHierarchies) { + var startTime = new Date().getTime(); + var results; + try { + results = this.rule.run(context, options, contextHierarchies); + } + catch (e) { + var err = e; + console.error("RULE EXCEPTION:", this.rule.id, context.dom.rolePath, err.stack); + throw e; + } + var endTime = new Date().getTime(); + if (!results) + results = []; + if (!(results instanceof Array)) { + results = [results]; + } + var retVal = []; + for (var _i = 0, results_1 = results; _i < results_1.length; _i++) { + var result = results_1[_i]; + var message = engine.getMessage(this.rule.id, result.reasonId, result.messageArgs); + var path = {}; + for (var ns in context) { + path[ns] = context[ns].rolePath; + } + var ruleId = this.rule.id.replace(/^(.*)\$\$\d+$/, "$1"); + retVal.push({ + ruleId: ruleId, + value: result.value, + node: context["dom"].node, + path: path, + ruleTime: endTime - startTime, + reasonId: result.reasonId, + message: message, + messageArgs: result.messageArgs, + apiArgs: result.apiArgs, + bounds: context["dom"].bounds, + snippet: WrappedRule.convertNodeToSnippet(context["dom"].node), + source: WrappedRule.convertNodeToSource(context["dom"].node, engine.isSourceMapEnabled()) + }); + } + return retVal; + }; + return WrappedRule; +}()); +var Engine = /** @class */ (function () { + function Engine() { + this.mappers = {}; + this.ruleMap = {}; + this.wrappedRuleMap = {}; + this.nlsMap = {}; + this.helpMap = {}; + this.sourceMapEnabled = false; + this.inclRules = {}; + this.exclRules = {}; + // Need a DOM Mapper as a minimum + this.addMapper(new DOMMapper_1.DOMMapper()); + } + Engine.getLanguages = function () { + var env = typeof process !== "undefined" && typeof process.nodeType === "undefined" && process.env; + // If all else fails, default to US English + var nodeLang = "en-US"; + if (env) { + nodeLang = env.LANG || env.LANGUAGE || env.LC_ALL || env.LC_MESSAGES; + if (nodeLang && nodeLang.length > 0) { + nodeLang = nodeLang.split(".")[0].replace(/_/g, "-"); + } + else { + nodeLang = "en-US"; + } + } + return typeof navigator !== "undefined" && navigator.languages || [nodeLang]; + }; + Engine.prototype.run = function (root, options) { + if (root === null) { + return Promise.reject("null document"); + } + if (root.nodeType === 9 /* Node.DOCUMENT_NODE */) { + root = root.documentElement; + } + root.ownerDocument && (root.ownerDocument.PT_CHECK_HIDDEN_CONTENT = false); + var numNodesVisited = CacheUtil_1.CacheUtil.clearCaches(root); + var walker = new DOMWalker_1.DOMWalker(root, false, root, true); + var retVal = { + results: [], + numExecuted: 0, + ruleTime: 0, + totalTime: 0 + }; + var start = new Date().getTime(); + // Reset the role mappers + for (var namespace in this.mappers) { + this.mappers[namespace].reset(root); + } + // Initialize the context detector + var currentNodeCount = 0; + var lastReportedPercent = -1; + do { + currentNodeCount++; + // Report progress at each percentage milestone + var currentPercent = Math.floor((currentNodeCount / numNodesVisited) * 100); + if (currentPercent > lastReportedPercent) { + if (numNodesVisited > 10000) { + // if (currentPercent > 6) break; + console.log("Progress: ".concat(currentPercent, "% (").concat(currentNodeCount, "/").concat(numNodesVisited, " nodes)")); + // const ruleTimes = retVal.results.reduce((prev, cur) => { + // prev[cur.ruleId] = (prev[cur.ruleId] || 0)+cur.ruleTime; + // return prev; + // }, {}); + // for (const ruleId in ruleTimes) { + // if (ruleTimes[ruleId] > 10000) { + // console.log(`${ruleId}: ${ruleTimes[ruleId]}`); + // } + // } + // console.groupEnd(); + } + lastReportedPercent = currentPercent; + } + // Get the context information from the rule mappers + var contextHierarchies = {}; + for (var namespace in this.mappers) { + if (!walker.bEndTag) { + contextHierarchies[namespace] = this.mappers[namespace].openScope(walker.node); + // if (namespace === "dom" && walker.node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = walker.node as Element; + // let id; + // if (elem.hasAttribute("id") && (id = elem.getAttribute("id").trim()).length > 0) { + // if (root.ownerDocument.getElementById(id) === elem) { + // contextHierarchies["dom"][contextHierarchies["dom"].length-1].rolePath = "//*[@id='"+id+"']"; + // } + // } + // } + } + else { + contextHierarchies[namespace] = this.mappers[namespace].closeScope(walker.node); + } + } + if (walker.node.nodeType !== 11 + && (VisUtil_1.VisUtil.isNodeVisible(walker.node) + // || walker.node.nodeName.toLowerCase() === "head" + || walker.node.nodeName.toLowerCase() === "meta" + || walker.node.nodeName.toLowerCase() === "style" + || walker.node.nodeName.toLowerCase() === "datalist" + || walker.node.nodeName.toLowerCase() === "param" + || !DOMUtil_1.DOMUtil.getAncestor(walker.node, ["body"]))) { + var context = {}; + for (var ns in contextHierarchies) { + var nsHier = contextHierarchies[ns]; + var lastHier = nsHier[nsHier.length - 1]; + context[ns] = lastHier; + } + var matchingRules = this.getMatchingRules(contextHierarchies); + var depMatch = {}; + for (var _i = 0, matchingRules_1 = matchingRules; _i < matchingRules_1.length; _i++) { + var matchingRule = matchingRules_1[_i]; + var fulfillsDependencies = true; + for (var _a = 0, _b = matchingRule.rule.dependencies || []; _a < _b.length; _a++) { + var dep = _b[_a]; + if (!depMatch[dep]) + fulfillsDependencies = false; + } + if (fulfillsDependencies) { + var results = []; + var start_1 = new Date().getTime(); + try { + results = matchingRule.run(this, context, options, contextHierarchies); + } + catch (err) { + // Wrapper shows error in console. Skip this rule as N/A + // We don't want to kill the engine + } + // If out of scope, it fulfills the dependency + if (results.length === 0) { + depMatch[matchingRule.rule.id] = true; + } + for (var _c = 0, results_2 = results; _c < results_2.length; _c++) { + var result = results_2[_c]; + retVal.results.push(result); + retVal.ruleTime += result.ruleTime; + retVal.numExecuted++; + if (result.value[1] === IRule_1.eRuleConfidence.PASS) { + depMatch[result.ruleId] = true; + } + } + } + } + } + } while (walker.nextNode()); + CacheUtil_1.CacheUtil.clearCaches(root); + retVal.totalTime = new Date().getTime() - start; + return Promise.resolve(retVal); + }; + Engine.prototype.enableRules = function (ruleIds) { + for (var ruleId in this.ruleMap) { + this.ruleMap[ruleId].enabled = false; + } + for (var _i = 0, _a = ruleIds || []; _i < _a.length; _i++) { + var ruleId = _a[_i]; + if (!(ruleId in this.ruleMap)) { + console.warn("WARNING: Rule Id", ruleId, "could not be enabled."); + } + else { + this.ruleMap[ruleId].enabled = true; + } + } + }; + Engine.prototype.getRule = function (ruleId) { + return this.ruleMap[ruleId]; + }; + Engine.prototype.getRulesIds = function () { + var retVal = []; + for (var ruleId in this.ruleMap) { + retVal.push(ruleId); + } + return retVal; + }; + Engine.prototype.addRules = function (rules) { + for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) { + var rule = rules_1[_i]; + this.addRule(rule, true); + } + this._sortRules(); + }; + Engine.prototype.addRule = function (rule, skipSort) { + var ctxs = Context_1.Context.parse(rule.context); + var idx = 0; + var ruleId = rule.id; + if (ruleId in this.ruleMap) { + console.log("WARNING: Rule", ruleId, "already added to engine. Ignoring..."); + return; + } + this.ruleMap[ruleId] = rule; + for (var _i = 0, ctxs_1 = ctxs; _i < ctxs_1.length; _i++) { + var ctx = ctxs_1[_i]; + var wrapId = ruleId; + if (idx >= 1) { + wrapId = ruleId + "$$" + idx; + } + ++idx; + var wrappedRule = new WrappedRule(rule, ctx); + this.wrappedRuleMap[wrapId] = wrappedRule; + var parts = wrappedRule.parsedInfo.contextInfo; + var lastPart = parts[parts.length - 1]; + var triggerRole = lastPart.namespace + ":" + lastPart.role; + if (lastPart.inclusive) { + this.inclRules[triggerRole] = this.inclRules[triggerRole] || []; + this.inclRules[triggerRole].push(wrappedRule); + } + else { + this.exclRules[triggerRole] = this.exclRules[triggerRole] || []; + this.exclRules[triggerRole].push(wrappedRule); + } + } + if (!skipSort) { + this._sortRules(); + } + }; + Engine.prototype.enableSourceMap = function (enable) { + this.sourceMapEnabled = enable; + }; + Engine.prototype.isSourceMapEnabled = function () { + return this.sourceMapEnabled; + }; + Engine.prototype._sortRules = function () { + for (var role in this.inclRules) { + this.inclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + for (var role in this.exclRules) { + this.exclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + }; + Engine.prototype.addNlsMap = function (map) { + for (var key in map) { + this.nlsMap[key] = map[key]; + } + }; + Engine.prototype.addHelpMap = function (map) { + for (var key in map) { + this.helpMap[key] = map[key]; + } + }; + Engine.prototype.getMessage = function (ruleId, ruleIdx, msgArgs) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.nlsMap)) + return ruleId; + var messageTemplate = this.nlsMap[ruleId][ruleIdx || 0]; + if (!messageTemplate) + return ruleId + "_" + ruleIdx; + return messageTemplate.replace(/\{(\d+)\}/g, function (matchedStr, matchedNum, matchedIndex) { return msgArgs[matchedNum]; }); + }; + Engine.prototype.getHelp = function (ruleId, reasonId, archiveId) { + if (!archiveId) { + // Set to the latest + archiveId = "latest"; + } + return "".concat(Config_1.Config.helpRoot, "/").concat(archiveId, "/doc").concat(this.getHelpRel(ruleId, reasonId)); + }; + Engine.prototype.getHelpRel = function (ruleId, ruleIdx) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.helpMap)) + return ruleId; + ruleIdx = ruleIdx || 0; + var helpStr = null; + if (ruleIdx in this.helpMap[ruleId]) { + helpStr = this.helpMap[ruleId][ruleIdx || 0]; + } + else { + helpStr = this.helpMap[ruleId][0]; + } + if (!helpStr) + return ruleId + "_" + ruleIdx; + return helpStr; + }; + Engine.prototype.addMapper = function (mapper) { + this.mappers[mapper.getNamespace()] = mapper; + }; + Engine.match = function (rule, contextHier) { + var ruleParts = rule.parsedInfo.contextInfo; + var partIdx = ruleParts.length - 1; + var curNS = ruleParts[partIdx].namespace; + var curHier = contextHier[curNS][contextHier[curNS].length - 1]; + var contextNode = curHier.node; + // If the end of the rule part doesn't match the end of the hierarchy, we don't have a match + if (!ruleParts[partIdx].matches(contextHier, contextHier[curNS].length - 1)) { + return false; + } + // If there was only one part, we have a match + if (ruleParts.length === 1) { + return true; + } + // Need to deal with parent parts. To walk the hierarchy, these need to be + // all in the same namespace. Confirm that is true. + curNS = ruleParts[0].namespace; + curHier = contextHier[curNS][contextHier[curNS].length - 1]; + --partIdx; + if (ruleParts.slice(0, ruleParts.length - 1).some(function (part) { return part.namespace !== curNS; })) { + console.error("[ERROR] Rule ".concat(rule.rule.id, " has inconsitent parent namespaces")); + return false; + } + // If the target node matches the end of the hierarchy, move up past it, otherwise, start at the end + var hierIdx = contextHier[curNS].length - (curHier.node.isSameNode(contextNode) ? 2 : 1); + while (hierIdx >= 0 && partIdx >= 0) { + var part = ruleParts[partIdx]; + var matchesPart = ruleParts[partIdx].matches(contextHier, hierIdx); + if (part.connector === ">") { + if (!matchesPart) { + // Direct parent check and doesn't match + return false; + } + else { + // Direct parent check and does match + --partIdx; + --hierIdx; + } + } + else if (part.connector === " ") { + if (part.inclusive) { + // inclusive ancestor match + if (matchesPart) { + --partIdx; + } + // If doesn't match, just move up the role hierarchy + --hierIdx; + } + else if (!matchesPart) { + // exclusive ancestor match and current matches + return false; + } + else { + // exclusive ancestor match and current doesn't match - check for other ancestors + var parentMatch = false; + for (var searchIdx = hierIdx - 1; !parentMatch && searchIdx >= 0; --searchIdx) { + parentMatch = !ruleParts[partIdx].matches(contextHier, searchIdx); + } + if (parentMatch) + return false; + else + --partIdx; + } + } + else { + throw new Error("Context connector " + part.connector + " is not supported"); + } + } + return partIdx === -1; + }; + Engine.prototype.getMatchingRules = function (ctxHier) { + var matches = []; + function addMatches(rules) { + for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) { + var rule = rules_2[_i]; + if (rule.rule.enabled && Engine.match(rule, ctxHier)) { + matches.push(rule); + } + } + } + for (var ns in ctxHier) { + var role = ns + ":" + (ctxHier[ns].length > 0 ? ctxHier[ns][ctxHier[ns].length - 1].role : "none"); + if (role in this.inclRules) { + addMatches(this.inclRules[role]); + } + for (var xRole in this.exclRules) { + if (xRole !== role) { + addMatches(this.exclRules[xRole]); + } + } + if (role !== ns + ":none") { + if (role.startsWith(ns + ":/")) { + if (ns + ":/*" in this.inclRules) { + addMatches(this.inclRules[ns + ":/*"]); + } + } + else { + if (ns + ":*" in this.inclRules) { + addMatches(this.inclRules[ns + ":*"]); + } + } + } + } + return this.sortDeps(matches); + }; + /** + * Sorts the rules in order to execute dependencies in the correct order + * @param inRules List of wrapped rules to sort + * @returns Sorted list of wrapped rules + */ + Engine.prototype.sortDeps = function (inRules) { + var depRules = []; + for (var _i = 0, inRules_1 = inRules; _i < inRules_1.length; _i++) { + var rule = inRules_1[_i]; + depRules.push(rule); + } + var retVal = []; + var idToRule = {}; + // Iterate through the rules. If that rule's dependencies can be met by rules already in the list, add it to the list + // Repeat until no changes are made to the satisfied list + // If a rule cannot be satisfied, it will never execute, so it can be dropped. + var change = false; + do { + change = false; + for (var idx = 0; idx < depRules.length; ++idx) { + var depRule = depRules[idx]; + if (depRule.rule.id in idToRule) + continue; + var allMatch = true; + if (depRule.rule.dependencies && depRule.rule.dependencies.length > 0) { + for (var _a = 0, _b = depRule.rule.dependencies; _a < _b.length; _a++) { + var depId = _b[_a]; + if (!(depId in idToRule)) { + allMatch = false; + } + } + } + // if (depRule.rule.prereqs && depRule.rule.prereqs.length > 0) { + // for (const depId of depRule.rule.prereqs) { + // if (!(depId in idToRule)) { + // allMatch = false; + // } + // } + // } + if (allMatch) { + change = true; + retVal.push(depRule); + idToRule[depRule.rule.id] = true; + depRules.splice(idx--, 1); + } + } + } while (change); + return retVal; + }; + return Engine; +}()); +exports.Engine = Engine; + + +/***/ }, + +/***/ "./src/v2/config/Config.ts" +/*!*********************************!*\ + !*** ./src/v2/config/Config.ts ***! + \*********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Config = void 0; +var Config = /** @class */ (function () { + function Config() { + } + Config.DEBUG = false; + Config.helpRoot = "https://able.ibm.com/rules/archives"; + return Config; +}()); +exports.Config = Config; + + +/***/ }, + +/***/ "./src/v2/dom/DOMMapper.ts" +/*!*********************************!*\ + !*** ./src/v2/dom/DOMMapper.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMMapper = void 0; +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMMapper = /** @class */ (function (_super) { + __extends(DOMMapper, _super); + function DOMMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + DOMMapper.prototype.getRole = function (node) { + return node.nodeName.toLowerCase(); + }; + DOMMapper.prototype.getNamespace = function () { + return "dom"; + }; + DOMMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + retVal[attrInfo.name.toLowerCase()] = attrInfo.nodeValue; + } + } + return retVal; + }; + /** + * get scaled bounds for screenshot etc. adjusted for devicePixelRatio and scroll + * @param node + * @returns + */ + DOMMapper.prototype.getBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_Bounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var adjustment = 1; + if (node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.devicePixelRatio) { + adjustment = node.ownerDocument.defaultView.devicePixelRatio; + } + var bounds = node.getBoundingClientRect(); + // Do a check whether bounds has value as we use different tool (htmlUnit, browser) to call this function + if (bounds) { + var scrollX_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil((bounds.left + scrollX_1) * adjustment), + "top": Math.ceil((bounds.top + scrollY_1) * adjustment), + "height": Math.ceil(bounds.height * adjustment), + "width": Math.ceil(bounds.width * adjustment) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_Bounds", ret); + return ret; + } + return null; + }; + /** + * get real CSS bounds in css pixels, adjusted for scroll only + * @param node + * @returns + */ + DOMMapper.prototype.getUnadjustedBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_UnadjustedBounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var bounds = node.getBoundingClientRect(); + // adjusted for scroll if any + if (bounds) { + var scrollX_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil(bounds.left + scrollX_2), + "top": Math.ceil(bounds.top + scrollY_2), + "height": Math.ceil(bounds.height), + "width": Math.ceil(bounds.width) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_UnadjustedBounds", ret); + return ret; + } + return null; + }; + return DOMMapper; +}(CommonMapper_1.CommonMapper)); +exports.DOMMapper = DOMMapper; + + +/***/ }, + +/***/ "./src/v2/dom/DOMUtil.ts" +/*!*******************************!*\ + !*** ./src/v2/dom/DOMUtil.ts ***! + \*******************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ./DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +/** + * Utility class providing helper methods for DOM manipulation and traversal operations. + * Used throughout the accessibility checker engine to navigate and analyze DOM structures. + */ +var DOMUtil = /** @class */ (function () { + function DOMUtil() { + } + /** + * Checks if a given node has an ancestor element with a node name matching any of the provided names. + * Traverses up the DOM tree from the given node until a match is found or the root is reached. + * + * @param node - The starting DOM node to check + * @param names - Array of node names (tag names) to search for in uppercase (e.g., ['TABLE', 'DIV']) + * @returns true if an ancestor with a matching name is found, false otherwise + */ + DOMUtil.hasParent = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName)) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return !!p; + }; + /** + * Retrieves the first ancestor element that matches any of the provided node names (case-insensitive). + * Similar to hasParent but returns the actual element reference and performs case-insensitive comparison. + * + * @param node - The starting DOM node + * @param names - Array of lowercase node names to search for (e.g., ['table', 'div']) + * @returns The matching ancestor element, or null if none found + */ + DOMUtil.getAncestor = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName.toLowerCase())) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return p; + }; + /** + * Determines if two nodes are the same node, with fallback strategies for different browser environments. + * Uses multiple comparison methods for cross-browser compatibility: + * 1. Strict equality (===) + * 2. isSameNode() method if available + * 3. compareDocumentPosition() (returns 0 if same node) + * 4. Returns true as last resort if no comparison method is available + * + * @param a - First node to compare + * @param b - Second node to compare + * @returns true if nodes are the same, false otherwise + */ + DOMUtil.sameNode = function (a, b) { + if (a === b) { + return true; + } + else if (a.isSameNode) { + return a.isSameNode(b); + } + else if (a.compareDocumentPosition) { + return a.compareDocumentPosition(b) === 0; + } + else { + // Not supported in this environment - try our best + return true; + } + }; + /** + * Normalizes whitespace in a string by replacing all whitespace characters + * (spaces, tabs, carriage returns, newlines) with single spaces and collapsing + * multiple consecutive spaces into one. + * + * @param s - The input string to clean + * @returns The cleaned string with normalized whitespace + * @example "Hello\n\t World" → "Hello World" + */ + DOMUtil.cleanWhitespace = function (s) { + var retVal = s.replace(/[ \t\r\n]/g, " ").replace(/ +/g, " "); + return retVal; + }; + /** + * Collapses multiple consecutive spaces into a single space. + * Unlike cleanWhitespace, only handles spaces, not other whitespace characters like tabs or newlines. + * + * @param s - The input string to clean + * @returns The string with collapsed spaces + */ + DOMUtil.cleanSpace = function (s) { + var retVal = s.replace(/ +/g, " "); + return retVal; + }; + /** + * Determines if two elements (typically table cells) belong to the same table element. + * Finds the table ancestor for each element and compares them using sameNode(). + * + * @param element1 - First element to check + * @param element2 - Second element to check + * @returns true if both elements share the same table ancestor, false otherwise + */ + DOMUtil.isInSameTable = function (element1, element2) { + if (element1 && element2) { + var parentName = ['table']; + var parent1 = DOMUtil.getAncestor(element1, parentName); + var parent2 = DOMUtil.getAncestor(element2, parentName); + if (parent1 !== null && parent2 != null && DOMUtil.sameNode(parent1, parent2)) + return true; + } + return false; + }; + /** + * Traverses up the DOM tree to find the shadow root (document fragment) that contains the given node. + * Important for handling Web Components and Shadow DOM structures in accessibility checking. + * + * @param node - The starting node + * @returns The shadow root node (nodeType 11 = DOCUMENT_FRAGMENT_NODE), or null if none found + */ + DOMUtil.shadowRootNode = function (node) { + var nd = node; + while (nd != null && nd.nodeType !== 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + nd = nd.parentNode; + return nd; + }; + /** + * Creates a deep copy of an object while preserving Node references (doesn't clone Node objects). + * Useful when copying data structures that contain DOM node references, as you typically want + * to preserve those references rather than attempting to clone the nodes themselves. + * + * Behavior: + * - Primitive values: Deep copied via JSON serialization + * - Functions: Returned as-is (reference) + * - Node objects: Returned as-is (reference, not cloned) + * - Arrays/Objects: Recursively copied with the same rules + * + * @param rhs - The object to copy (right-hand side) + * @returns A copy of the object with Node references preserved + */ + DOMUtil.objectCopyWithNodeRefs = function (rhs) { + if (!rhs) + return rhs; + if (typeof rhs !== "object") { + if (typeof rhs === "function") { + return rhs; + } + else { + return JSON.parse(JSON.stringify(rhs)); + } + } + else if (rhs instanceof Node || !!rhs.nodeType) { + return rhs; + } + else { + var retVal = void 0; + if (rhs.constructor.name === "Array") { + retVal = []; + for (var _i = 0, rhs_1 = rhs; _i < rhs_1.length; _i++) { + var item = rhs_1[_i]; + retVal.push(this.objectCopyWithNodeRefs(item)); + } + } + else { + retVal = {}; + for (var key in rhs) { + retVal[key] = this.objectCopyWithNodeRefs(rhs[key]); + } + } + return retVal; + } + }; + /** + * Finds the first ancestor element that has a specific attribute with a specific value. + * Traverses up the DOM tree from the given element until a matching ancestor is found. + * + * @param element - The starting element + * @param attrName - The attribute name to search for + * @param attrValue - The expected attribute value + * @returns The matching ancestor element, or null if none found + * @example Finding an ancestor with aria-hidden="true" or data-testid="container" + */ + DOMUtil.getAncestorWithAttribute = function (element, attrName, attrValue) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (walkNode.nodeType === 1 /* Node.ELEMENT_NODE */ && walkNode.getAttribute(attrName) === attrValue) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + return DOMUtil; +}()); +exports.DOMUtil = DOMUtil; + + +/***/ }, + +/***/ "./src/v2/dom/DOMWalker.ts" +/*!*********************************!*\ + !*** ./src/v2/dom/DOMWalker.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMWalker = void 0; +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * Walks in a DOM order + * + * Assumption that nodes of shadow DOMs call assignSlots on the shadow root before + * doing other processing in that tree. If you walk into a shadow root, the DOMWalker + * will do it automatically. + * + * See also ../aria/ARIAWalker + */ +var DOMWalker = /** @class */ (function () { + function DOMWalker(element, bEnd, root, considerHidden, DEBUG) { + this.DEBUGIDX = 0; + this.indent = 0; + this.DEBUG = !!DEBUG; + this.root = root || ((element && element.ownerDocument) ? element.ownerDocument.documentElement : element); + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + if (this.node.nodeType === 9) { + this.node = this.node.documentElement; + } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + this.considerHidden = considerHidden || false; + } + DOMWalker.prototype.elem = function () { + return this.node.nodeType === 1 && this.node || null; + }; + DOMWalker.parentNode = function (node) { + if (node === null) + return null; + var p = node.parentNode; + if (node.slotOwner) { + p = node.slotOwner; + } + else if (node.ownerElement) { + p = node.ownerElement; + } + else if (p && p.nodeType === 11) { + if (p.host) { + p = p.host; + } + else { + p = null; + } + } + return p; + }; + DOMWalker.parentElement = function (node) { + var elem = node; + do { + elem = DOMWalker.parentNode(elem); + } while (elem && elem.nodeType !== 1); + return elem; + }; + DOMWalker.assignSlots = function (root) { + var slots = root.querySelectorAll("slot"); + for (var iSlot = 0; iSlot < slots.length; ++iSlot) { + var processSlot = slots[iSlot]; + var assignedNodes = processSlot.assignedNodes(); + for (var iAssigned = 0; iAssigned < assignedNodes.length; ++iAssigned) { + assignedNodes[iAssigned].slotOwner = processSlot; + assignedNodes[iAssigned].slotIndex = iAssigned; + } + } + }; + DOMWalker.firstChildNotOwnedBySlot = function (node) { + var retVal = node.firstChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.lastChildNotOwnedBySlot = function (node) { + var retVal = node.lastChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.nextSiblingNotOwnedBySlot = function (node) { + var retVal = node.nextSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.previousSiblingNotOwnedBySlot = function (node) { + var retVal = node.previousSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.prototype.atRoot = function () { + if (this.node.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + DOMWalker.prototype.nextNode = function () { + var _this = this; + var indent = function () { + var s = ""; + for (var idx = 0; idx < _this.indent; ++idx) { + s += " "; + } + return s; + }; + var DBG = false; //this.DEBUGIDX >= 7 && this.DEBUGIDX <= 10; + var startName = this.node.nodeName; + if (!this.node) { + this.bEndTag = false; + return false; + } + do { + //console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + DBG && console.log("!!!Into Frame"); + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + DBG && console.log("!!!Into shadow root"); + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + DBG && console.log("!!!Into slot"); + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker.firstChildNotOwnedBySlot(this.node)) { + DBG && console.log("!!!First child"); + this.node = DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + DBG && console.log("!!!Flip to end tag"); + this.bEndTag = true; + } + } + else { + DBG && console.log("!!!1"); + if (this.atRoot()) { + DBG && console.log("!!!Done at root"); + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + DBG && console.log("!!!Next slot child"); + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + DBG && console.log("!!!Back up to slot owner"); + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + DBG && console.log("!!!Up to frame owner"); + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + DBG && console.log("!!!Next sibling"); + this.node = DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + } + else if (this.node.parentNode) { + DBG && console.log("!!!Parent"); + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + DBG && console.log("!!!Done with walk"); + return false; + } + } + if (DBG && ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"))) { + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++, " SKIPPED")); + } + } while ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + if (this.bEndTag) + this.indent -= 2; + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++)); + this.DEBUG && this.node.slotOwner && console.log(indent() + "slotOwner: ".concat(this.node.slotOwner.nodeName)); + this.DEBUG && this.node.slotIndex && console.log(indent() + "slotIndex: ".concat(this.node.slotIndex)); + this.DEBUG && this.node.ownerElement && console.log(indent() + "ownerElement: ".concat(this.node.ownerElement.nodeName)); + if (!this.bEndTag) + this.indent += 2; + return true; + }; + DOMWalker.prototype.prevNode = function () { + do { + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && elementNode.assignedNodes().length > 0) { + // Enter slot with assigned nodes - go to last assigned node + var slotElement = elementNode; + this.node = slotElement.assignedNodes()[slotElement.assignedNodes().length - 1]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var prevSlotIndex = this.node.slotIndex - 1; + if (prevSlotIndex >= 0) { + this.node = slotOwner.assignedNodes()[prevSlotIndex]; + this.bEndTag = true; + } + else { + this.node = slotOwner; + this.bEndTag = false; + } + } + else if (DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + } + else if (this.node.parentNode) { + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + return true; + }; + return DOMWalker; +}()); +exports.DOMWalker = DOMWalker; + + +/***/ }, + +/***/ "./src/v4/api/IGuideline.ts" +/*!**********************************!*\ + !*** ./src/v4/api/IGuideline.ts ***! + \**********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eGuidelineType = exports.eGuidelineCategory = exports.eToolkitLevel = void 0; +var eToolkitLevel; +(function (eToolkitLevel) { + eToolkitLevel["LEVEL_ONE"] = "1"; + eToolkitLevel["LEVEL_TWO"] = "2"; + eToolkitLevel["LEVEL_THREE"] = "3"; + eToolkitLevel["LEVEL_FOUR"] = "4"; +})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {})); +var eGuidelineCategory; +(function (eGuidelineCategory) { + eGuidelineCategory["ACCESSIBILITY"] = "Accessibility"; + eGuidelineCategory["DESIGN"] = "Design"; + eGuidelineCategory["OTHER"] = "Other"; +})(eGuidelineCategory = exports.eGuidelineCategory || (exports.eGuidelineCategory = {})); +var eGuidelineType; +(function (eGuidelineType) { + eGuidelineType["DEFAULT"] = "default"; + eGuidelineType["EXTENSION"] = "extension"; +})(eGuidelineType = exports.eGuidelineType || (exports.eGuidelineType = {})); + + +/***/ }, + +/***/ "./src/v4/api/IRule.ts" +/*!*****************************!*\ + !*** ./src/v4/api/IRule.ts ***! + \*****************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulePolicy = exports.eRuleConfidence = void 0; +var eRuleConfidence; +(function (eRuleConfidence) { + eRuleConfidence["PASS"] = "PASS"; + eRuleConfidence["FAIL"] = "FAIL"; + eRuleConfidence["POTENTIAL"] = "POTENTIAL"; + eRuleConfidence["MANUAL"] = "MANUAL"; +})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {})); +var eRulePolicy; +(function (eRulePolicy) { + eRulePolicy["VIOLATION"] = "VIOLATION"; + eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION"; + eRulePolicy["INFORMATION"] = "INFORMATION"; +})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {})); +function RulePass(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePass = RulePass; +function RuleRender(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: 0, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleRender = RuleRender; +function RuleFail(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleFail = RuleFail; +function RulePotential(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePotential = RulePotential; +function RuleManual(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleManual = RuleManual; +/** + * @deprecated See ./IGuideline + */ +var IGuideline_1 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eToolkitLevel", ({ enumerable: true, get: function () { return IGuideline_1.eToolkitLevel; } })); +/** + * @deprecated See ./IGuideline:eGuidelineCategory + */ +var IGuideline_2 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRuleCategory", ({ enumerable: true, get: function () { return IGuideline_2.eGuidelineCategory; } })); +/** + * @deprecated See ./IGuideline:eGuidelineType + */ +var IGuideline_3 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRulesetType", ({ enumerable: true, get: function () { return IGuideline_3.eGuidelineType; } })); + + +/***/ }, + +/***/ "./src/v4/checker/Checker.ts" +/*!***********************************!*\ + !*** ./src/v4/checker/Checker.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Checker = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var Engine_1 = __webpack_require__(/*! ../../v2/common/Engine */ "./src/v2/common/Engine.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var rulesets_1 = __webpack_require__(/*! ../rulesets */ "./src/v4/rulesets.ts"); +var checkRulesV4 = __importStar(__webpack_require__(/*! ../rules */ "./src/v4/rules/index.ts")); +var IGuideline_1 = __webpack_require__(/*! ../api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var checkRules = []; +var checkNls = {}; +var checkHelp = {}; +function _initialize() { + var langs = JSON.parse(JSON.stringify(Engine_1.Engine.getLanguages())); + // Default lang to en-US if nothing else specified is found + langs.push("en-US"); + // Process V4 rules into the V2 format + for (var rulename in checkRulesV4) { + // Convert rule + var v4Rule = checkRulesV4[rulename]; + checkRules.push(v4Rule); + // Go backwards because the first lang is the preferred, so + // earlier languages will override later languages + for (var idx = langs.length - 1; idx >= 0; --idx) { + var langId = langs[idx]; + if (langId in v4Rule.messages) { + checkNls[v4Rule.id] = v4Rule.messages[langId]; + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + if (langId in v4Rule.help) { + checkHelp[v4Rule.id] = {}; + for (var reasonId in v4Rule.help[langId]) { + checkHelp[v4Rule.id][reasonId] = "/".concat(langId, "/").concat(v4Rule.help[langId][reasonId]); + } + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + } + // Convert RS + for (var _i = 0, _a = v4Rule.rulesets; _i < _a.length; _i++) { + var rsSection = _a[_i]; + for (var _b = 0, _c = rulesets_1.a11yRulesets; _b < _c.length; _b++) { + var rs = _c[_b]; + var checkRsIds = typeof rsSection.id === "string" ? [rsSection.id] : rsSection.id; + if (checkRsIds.includes(rs.id)) { + for (var _d = 0, _e = rs.checkpoints; _d < _e.length; _d++) { + var cp = _e[_d]; + var checkCPIds = typeof rsSection.num === "string" ? [rsSection.num] : rsSection.num; + if (checkCPIds.includes(cp.num)) { + cp.rules = cp.rules || []; + cp.rules.push({ + id: v4Rule.id, + reasonCodes: rsSection.reasonCodes, + level: rsSection.level, + toolkitLevel: rsSection.toolkitLevel + }); + } + } + } + } + } + } +} +_initialize(); +var Checker = /** @class */ (function () { + function Checker() { + this.guidelines = []; + /** + * @deprecated Use getGuidelines(). + */ + this.rulesets = this.guidelines; + /** + * @deprecated Use getGuidelineIds(). + */ + this.rulesetIds = []; + this.rulesetRules = {}; + this.ruleLevels = {}; + this.ruleReasonLevels = {}; + this.ruleCategory = {}; + var engine = this.engine = new Engine_1.Engine(); + engine.addMapper(new ARIAMapper_1.ARIAMapper()); + engine.addRules(checkRules); + engine.addNlsMap(checkNls); + engine.addHelpMap(checkHelp); + for (var _i = 0, a11yRulesets_1 = rulesets_1.a11yRulesets; _i < a11yRulesets_1.length; _i++) { + var rs = a11yRulesets_1[_i]; + this.addRuleset(rs); + } + } + /** + * Adds a guideline to the engine. If the id already exists, the previous guideline will be replaced. + * @param guideline + */ + Checker.prototype.addGuideline = function (guideline) { + if (guideline.id in this.rulesetRules) { + this.removeGuideline(guideline.id); + } + this.guidelines.push(guideline); + this.rulesetIds.push(guideline.id); + var ruleIds = []; + for (var _i = 0, _a = guideline.checkpoints; _i < _a.length; _i++) { + var cp = _a[_i]; + cp.rules = cp.rules || []; + for (var _b = 0, _c = cp.rules; _b < _c.length; _b++) { + var rule = _c[_b]; + if (rule.enabled !== false) { + ruleIds.push(rule.id); + //this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {}; + //this.ruleLevels[rule.id][guideline.id] = rule.level; + this.ruleReasonLevels[rule.id] = this.ruleReasonLevels[rule.id] || {}; + this.ruleReasonLevels[rule.id][guideline.id] = this.ruleReasonLevels[rule.id][guideline.id] || {}; + var code = rule.reasonCodes ? rule.reasonCodes.join('--') : "None"; + this.ruleReasonLevels[rule.id][guideline.id][code] = rule.level; + this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {}; + this.ruleCategory[rule.id][guideline.id] = guideline.category; + } + } + } + this.rulesetRules[guideline.id] = ruleIds; + }; + /** + * Enable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.enableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled === false) { + updated = true; + delete rule.enabled; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Disable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.disableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled !== false) { + updated = true; + rule.enabled = false; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Remove a guideline from the engine + * + * Generally, there isn't a good reason to do this. Users should just not select the guideline as an option in check + * @param guidelineId + */ + Checker.prototype.removeGuideline = function (guidelineId) { + if (guidelineId in this.rulesetRules) { + delete this.rulesetRules[guidelineId]; + this.rulesets = this.guidelines = this.guidelines.filter(function (guideline) { return guideline.id !== guidelineId; }); + this.rulesetIds = this.getGuidelineIds(); + } + }; + /** + * Get the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelines = function () { + return JSON.parse(JSON.stringify(this.guidelines)); + }; + /** + * Get the ids of the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelineIds = function () { + return this.guidelines.map(function (guideline) { return guideline.id; }); + }; + /** + * + * @deprecated See addGuideline + */ + Checker.prototype.addRuleset = function (rs) { + this.addGuideline(rs); + }; + Checker.prototype.enableSourceMap = function (enable) { + this.engine.enableSourceMap(enable); + }; + Checker.prototype.isSourceMapEnabled = function () { + return this.engine.isSourceMapEnabled(); + }; + /** + * Perform a check of the specified node/document + * @param node DOMNode or Document on which to run the check + * @param guidelineIds Guideline ids to check with to specify which rules to run + * @returns + */ + Checker.prototype.check = function (node, guidelineIds) { + // Determine which rules to run + var ruleIds = []; + // Fix the input + if (!guidelineIds) { + ruleIds = this.engine.getRulesIds(); + } + else { + if (typeof guidelineIds === "string") { + guidelineIds = [guidelineIds]; + } + for (var _i = 0, guidelineIds_1 = guidelineIds; _i < guidelineIds_1.length; _i++) { + var rsId = guidelineIds_1[_i]; + if (rsId in this.rulesetRules) { + ruleIds = ruleIds.concat(this.rulesetRules[rsId]); + } + } + } + this.engine.enableRules(ruleIds); + // Add the report levels + var myThis = this; + return this.engine.run(node) + .then(function (report) { + report.nls = {}; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (result.ruleId in checkNls) { + report.nls[result.ruleId] = report.nls[result.ruleId] || { + 0: checkNls[result.ruleId][0] + }; + if (result.reasonId in checkNls[result.ruleId]) { + report.nls[result.ruleId][result.reasonId] = checkNls[result.ruleId][result.reasonId]; + } + } + //result.value[0] = myThis.getLevel(guidelineIds as string[], result.ruleId); + var code = result.reasonId ? result.reasonId : "None"; + result.value[0] = myThis.getReasonLevel(guidelineIds, result.ruleId, code); + result.category = myThis.getCategory(guidelineIds, result.ruleId); + delete result.path.css; + } + return report; + }); + }; + Checker.prototype.getLevel = function (rsIds, ruleId) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleLevels)) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) { + var rsId = rsIds_1[_i]; + if (rsId in rsInfo) { + if (rsInfo[rsId] === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (rsInfo[rsId] === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getReasonLevel = function (rsIds, ruleId, reasonCode) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleReasonLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleReasonLevels)) { + throw new Error("Rule triggered for which we have no rule level information " + ruleId); + } + var _loop_1 = function (rsId) { + if (rsId in rsInfo) { + var reCode_1 = new RegExp("(^|--)".concat(reasonCode, "($|--)")); + Object.keys(rsInfo[rsId]).forEach(function (code) { + var level = null; + if (code === 'None') + level = rsInfo[rsId]["None"]; + else if (reCode_1.test(code)) + level = rsInfo[rsId][code]; + if (level !== null) { + if (level === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (level === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }); + if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }; + for (var _i = 0, rsIds_2 = rsIds; _i < rsIds_2.length; _i++) { + var rsId = rsIds_2[_i]; + _loop_1(rsId); + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getCategory = function (rsIds, ruleId) { + var rsInfo = this.ruleCategory[ruleId]; + var retVal = ""; + if (!(ruleId in this.ruleCategory)) { + return IGuideline_1.eGuidelineCategory.OTHER; + } + if (!rsIds) { + rsIds = this.getGuidelineIds(); + } + for (var _i = 0, rsIds_3 = rsIds; _i < rsIds_3.length; _i++) { + var rsId = rsIds_3[_i]; + if (rsId in rsInfo) { + return rsInfo[rsId]; + } + } + return IGuideline_1.eGuidelineCategory.OTHER; + }; + return Checker; +}()); +exports.Checker = Checker; + + +/***/ }, + +/***/ "./src/v4/rules/a_target_warning.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/a_target_warning.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_target_warning = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.a_target_warning = { + id: "a_target_warning", + context: "dom:a[target],dom:area[target],dom:base[target]", + refactor: { + "WCAG20_A_TargetAndText": { + "Pass_0": "pass", + "Potential_1": "potential_warn" + } + }, + help: { + "en-US": { + "group": "a_target_warning.html", + "pass": "a_target_warning.html", + "potential_warn": "a_target_warning.html" + } + }, + messages: { + "en-US": { + "group": "Users should be warned in advance if their input action will open a new window", + "pass": "The user is warned in advance that the input action opens a new window", + "potential_warn": "Inform the user when their input action will open a new window" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.2.2", + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // skip the rule if it's AT hidden and not tabbable + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var params = { + paramWinText: { + value: ["new window", "new tab"], + type: "array" + } + }; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr == "_parent" || tStr == "_self" || tStr == "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + // Check aria-describedby for warning text + if (ruleContext.hasAttribute("aria-describedby")) { + var describedbyIds = ruleContext.getAttribute("aria-describedby").trim().split(/\s+/); + for (var _i = 0, describedbyIds_1 = describedbyIds; _i < describedbyIds_1.length; _i++) { + var id = describedbyIds_1[_i]; + var referencedElem = fragment_1.FragmentUtil.getById(ruleContext, id); + if (referencedElem) { + var describedText = CommonUtil_1.CommonUtil.getInnerText(referencedElem); + if (describedText && describedText.trim().length > 0) { + textStr += " " + describedText; + } + } + } + } + for (var i = 0; !passed && i < params.paramWinText.value.length; ++i) + if (textStr.indexOf(params.paramWinText.value[i]) != -1) + passed = true; + } + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_warn"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/a_text_purpose.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/a_text_purpose.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_text_purpose = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.a_text_purpose = { + id: "a_text_purpose", + // doc-biblioref is a link + context: "aria:link,aria:doc-biblioref", + refactor: { + "WCAG20_A_HasText": { + "Pass_0": "pass", + "Fail_1": "fail_acc_name" + } + }, + help: { + "en-US": { + "group": "a_text_purpose.html", + "pass": "a_text_purpose.html", + "fail_acc_name": "a_text_purpose.html" + } + }, + messages: { + "en-US": { + "group": "Hyperlinks must have an accessible name for their purpose", + "pass": "Hyperlink has a description of its purpose", + "fail_acc_name": "Hyperlink has no link text, label or image with a text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["2.4.4", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: "c487ae", + run: function (context, options) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Rule only passes if an element has inner content, + // in the case that there is only hidden content under the the element it is a violation + var accName_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = (accName_pair && accName_pair.name && accName_pair.name.trim().length > 0) + /**ARIAMapper.computeName(ruleContext).trim().length > 0*/ + || CommonUtil_1.CommonUtil.nonTabableChildCheck(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_acc_name"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/applet_alt_exists.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/applet_alt_exists.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.applet_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.applet_alt_exists = { + id: "applet_alt_exists", + context: "dom:applet", + refactor: { + "WCAG20_Applet_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "applet_alt_exists.html", + "Pass_0": "applet_alt_exists.html", + "Fail_1": "applet_alt_exists.html", + "Fail_2": "applet_alt_exists.html", + "Fail_3": "applet_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<applet> elements must provide an 'alt' attribute and an alternative description", + "Pass_0": "Rule Passed", + "Fail_1": "An <applet> element does not have an 'alt' attribute that provides a short text alternative", + "Fail_2": "The 'alt' attribute value for an <applet> element duplicates the 'code' attribute", + "Fail_3": "An <applet> element provides alternative text, but does not provide inner content" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + var alt = ruleContext.getAttribute("alt").trim(); + if (ruleContext.hasAttribute("code") && alt == ruleContext.getAttribute("code").trim()) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/application_content_accessible.ts" +/*!********************************************************!*\ + !*** ./src/v4/rules/application_content_accessible.ts ***! + \********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.application_content_accessible = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.application_content_accessible = { + id: "application_content_accessible", + context: "aria:application", + refactor: { + "HAAC_Application_Role_Text": { + 0: "HAAC_Application_Role_Text.html", + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + 0: "application_content_accessible.html", + "Pass_0": "application_content_accessible.html", + "Potential_1": "application_content_accessible.html" + } + }, + messages: { + "en-US": { + "group": "Non-decorative static text and image content within an element with \"application\" role must be accessible", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the non-decorative static text and image content within an element with \"application\" role are accessible" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.1.1", "2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var children = ruleContext.childNodes; + for (var i = 0; passed && i < children.length; i++) { + if (children[i].nodeType === 1) { + if (VisUtil_1.VisUtil.isNodeVisible(children[i])) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "document") || AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "article"); + } + } + else if (children[i].nodeType === 3) { + passed = children[i].nodeValue.trim().length === 0; + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/area_alt_exists.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/area_alt_exists.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.area_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.area_alt_exists = { + id: "area_alt_exists", + context: "dom:area", + refactor: { + "WCAG20_Area_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "area_alt_exists.html", + "Pass_0": "area_alt_exists.html", + "Fail_1": "area_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<area> elements in an image map must have a text alternative", + "Pass_0": "Rule Passed", + "Fail_1": "<area> element in an image map has no text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_accessiblename_exists.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_accessiblename_exists.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_accessiblename_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +exports.aria_accessiblename_exists = { + id: "aria_accessiblename_exists", + context: "aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example", + help: { + "en-US": { + "pass": "aria_accessiblename_exists.html", + "fail_no_accessible_name": "aria_accessiblename_exists.html", + "fail_no_accessible_name_image": "aria_accessiblename_exists.html", + "group": "aria_accessiblename_exists.html" + } + }, + messages: { + "en-US": { + "pass": "An accessible name is provided for the element", + "fail_no_accessible_name": "Element <{0}> with \"{1}\" role has no accessible name", + "fail_no_accessible_name_image": "Element <{0}> with \"{1}\" role has no accessible name", + "group": "Elements with certain roles should have accessible names" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name_image"] + }], + act: [{ "23a2a8": { "fail_no_accessible_name_image": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg element is handled in svg_graphics_labbelled rule and image rules + if (nodeName === 'svg' || nodeName === 'img') + return; + // when table element with a caption as first child + if (nodeName === 'table' + && ruleContext.firstElementChild && ruleContext.firstElementChild.nodeName.toLowerCase() === 'caption' + && ruleContext.firstElementChild.textContent && ruleContext.firstElementChild.textContent.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (invalidRoles && invalidRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role || !ARIADefinitions_1.ARIADefinitions.designPatterns[role] || !ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameRequired) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!name_pair || !name_pair.name || name_pair.name.trim().length === 0) { + if (role === 'img' || role === 'image') + return (0, IRule_1.RuleFail)("fail_no_accessible_name_image", [ruleContext.nodeName.toLowerCase(), role]); + return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), role]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts" +/*!**************************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_tabindex_valid.ts ***! + \**************************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_tabindex_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_activedescendant_tabindex_valid = { + id: "aria_activedescendant_tabindex_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "Rpt_Aria_InvalidTabindexForActivedescendant": { + "pass": "pass", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "pass": "aria_activedescendant_tabindex_valid.html", + "Fail_1": "aria_activedescendant_tabindex_valid.html", + "group": "aria_activedescendant_tabindex_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "Fail_1": "The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable", + "group": "Element using 'aria-activedescendant' property should be tabbable" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Rule not supported on mobile + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + // Handle the case where the element is hidden by a disabled HTML5 attribute or aria-disabled: + // 1. In the case that this element has a disabled attribute and the element supports it, we mark this rule as passed. + // 2. In the case that this element has an aria-disabled attribute then, we mark this rule as passed. + // For both of the cases above we do not need to perform any further checks, as the element is disabled in some form or another. + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + //ignore if the attribute 'aria-activedescendant' is blank + if (ruleContext.getAttribute("aria-activedescendant").trim().length === 0) + return; + // If the tabindex attribute is provided then verify that it is 0 or -1 + passed = CommonUtil_1.CommonUtil.isTabbable(ruleContext); + // pass if one of the children is tabbable. in this case, the tab will stop on the first tabbable element + if (!passed) + passed = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext) > 0; + // Build array for node token + var retToken1 = new Array(); + retToken1.push(nodeName); + // Build array for id referenced by aria-activedescendant + var retToken2 = new Array(); + retToken2.push(ruleContext.getAttribute("aria-activedescendant").split(" ").join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_activedescendant_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_activedescendant_valid = { + id: "aria_activedescendant_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "HAAC_ActiveDescendantCheck": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + // "Fail_4": "Fail_4" + } + }, + help: { + "en-US": { + "Pass_0": "aria_activedescendant_valid.html", + "Fail_1": "aria_activedescendant_valid.html", + "Fail_2": "aria_activedescendant_valid.html", + "Fail_3": "aria_activedescendant_valid.html", + // "Fail_4": "aria_activedescendant_valid.html", + "group": "aria_activedescendant_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'aria-activedescendant' property is empty", + "Fail_2": "The 'aria-activedescendant' property references a hidden node", + "Fail_3": "Element is not a combobox, and the referenced active-descendant element is not a valid descendant", + // "Fail_4": "Element is a combobox, and the referenced active-descendant element is not controlled by this component", + "group": "The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // combobox active descendants handled by 'combobox_active_descendant' + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")) { + return null; + } + var descendant_id = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-activedescendant"); + // POF1: The attribute is empty + if (!descendant_id || descendant_id.trim() === "") { + return (0, IRule_1.RuleFail)("Fail_1"); + } + var descendant = fragment_1.FragmentUtil.getById(ruleContext, descendant_id.trim()); + if (!descendant || DOMUtil_1.DOMUtil.sameNode(descendant_id, ruleContext)) { + // The referenced element doesn't exist. We let 1077 to trigger the error + return null; + } + if (!VisUtil_1.VisUtil.isNodeVisible(descendant)) { + // POF2: aria-activedescendant references a hidden node + return (0, IRule_1.RuleFail)("Fail_2"); + } + // 1. The value of aria-activedescendant refers to an element that is either a descendant of + // the element with DOM focus + if (ruleContext.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var pofId = 2; + // or is a logical descendant as indicated by the aria-owns attribute. + if (ruleContext.hasAttribute("aria-owns")) { + var owned_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-owns").trim()).split(" "); + for (var i = 0; i < owned_ids.length; i++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owned_ids[i]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + // 2. The element with DOM focus is a textbox with aria-controls referring to an element that + // supports aria-activedescendant, and the value of aria-activedescendant specified for the + // textbox refers to either a descendant of the element controlled by the textbox or is a logical + // descendant of that controlled element as indicated by the aria-owns attribute. + // + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") && ruleContext.hasAttribute("aria-controls")) { + pofId = 3; + var controlled_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-controls").trim()).split(" "); + for (var i = 0; i < controlled_ids.length; i++) { + var controlled_ele = fragment_1.FragmentUtil.getById(ruleContext, controlled_ids[i]); + if (controlled_ele && !DOMUtil_1.DOMUtil.sameNode(controlled_ele, ruleContext) && controlled_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + if (controlled_ele.hasAttribute("aria-owns")) { + var owns_ids = CommonUtil_1.CommonUtil.normalizeSpacing(controlled_ele.getAttribute("aria-owns").trim()).split(" "); + for (var j = 0; j < owns_ids.length; j++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owns_ids[j]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + } + } + // POF3: I'm not a combobox, and the referenced active-descendant is not a descendant and not owned by the element + // that referenced it. + if (pofId == 3) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_application_label_unique.ts" +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_application_label_unique.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_application_label_unique = { + id: "aria_application_label_unique", + context: "aria:application", + refactor: { + "Rpt_Aria_MultipleApplicationLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_application_label_unique.html", + "fail_label_not_unique": "aria_application_label_unique.html", + "group": "aria_application_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"application\" role do not have unique labels", + "group": "Each element with \"application\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "application"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_application_labelled.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_application_labelled.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_application_labelled = { + id: "aria_application_labelled", + context: "aria:application", + refactor: { + "Rpt_Aria_ApplicationLandmarkLabel": { + "Pass_0": "pass", + "Fail_1": "fail_no_label" + } + }, + help: { + "en-US": { + "pass": "aria_application_labelled.html", + "fail_no_label": "aria_application_labelled.html", + "group": "aria_application_labelled.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a label that describes its purpose", + "fail_no_label": "Element with \"application\" role does not have a label", + "group": "Each element with \"application\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!pair) { + return (0, IRule_1.RuleFail)("fail_no_label"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_article_label_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_article_label_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_article_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_article_label_unique = { + id: "aria_article_label_unique", + context: "aria:article", + refactor: { + "Rpt_Aria_MultipleArticleRoles_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_article_label_unique.html", + "fail_label_not_unique": "aria_article_label_unique.html", + "group": "aria_article_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"article\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"article\" role do not have unique labels", + "group": "Each element with \"article\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "article"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_allowed.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_attribute_allowed.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_allowed = { + id: "aria_attribute_allowed", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidProperty": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_allowed.html", + "Pass_0": "aria_attribute_allowed.html", + "Fail_1": "aria_attribute_allowed.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes must be valid for the element's role", + "Pass_0": "Rule Passed", + "Fail_1": "The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "5f99a7", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var contextAttributes = ruleContext.attributes; + // This gets all elements with attributes so we still have some + // Out of Scope since not all attributes are aria + if (contextAttributes) { + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var failedProperties = ""; + var testedProperties = 0; + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + testedProperties++; + // Now we just have aria attributes which can + // pass or fail based on whether there property is valid + var dataTypes = propertyDataTypes[attrName]; + if (!dataTypes) { // if property is not in valid property list + // create failedProperties comma sep list + if (failedProperties.length == 0) { + failedProperties = attrName; + } + else { + failedProperties = failedProperties + ", " + attrName; + } + } + } + } + if (testedProperties == 0) { + return null; + } + else if (failedProperties.length != 0) { + return (0, IRule_1.RuleFail)("Fail_1", [failedProperties, ruleContext.nodeName.toLowerCase()]); + } + else { + //return RulePass(1); + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + // JCH - passing is based on all attributes not just aria attributes + // leading to OVER COUNTING so moved pass up + //return RulePass(1); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_conflict.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_conflict.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_attribute_conflict = { + id: "aria_attribute_conflict", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + // "pass": "aria_attribute_conflict.html", + "fail_conflict": "aria_attribute_conflict.html", + "group": "aria_attribute_conflict.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA attribute is not conflict with the corresponding HTML attribute", + "fail_conflict": "The ARIA attribute \"{0}\" is in conflict with the corresponding HTML attribute \"{1}\"", + "group": "An ARIA attribute must not conflict with the corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + var ret = []; + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (!ariaAttributes || ariaAttributes.length === 0) + return null; + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + for (var i = 0; i < conflictAttributes.length; i++) { + ret.push((0, IRule_1.RuleFail)("fail_conflict", [conflictAttributes[i]['ariaAttr'], conflictAttributes[i]['htmlAttr']])); + if (ariaAttributes.includes(conflictAttributes[i]['ariaAttr'])) + CommonUtil_1.CommonUtil.reduceArrayItemList([conflictAttributes[i]['ariaAttr']], ariaAttributes); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_deprecated.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_attribute_deprecated.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_deprecated = { + id: "aria_attribute_deprecated", + context: "dom:*", + help: { + "en-US": { + // "pass": "aria_attribute_deprecated.html", + "fail_aria_role": "aria_attribute_deprecated.html", + "fail_aria_attr": "aria_attribute_deprecated.html", + "fail_role_attr": "aria_attribute_deprecated.html", + "group": "aria_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA roles and attribute are used per specification", + "fail_aria_role": "The ARIA role \"{0}\" is deprecated in the ARIA specification", + "fail_aria_attr": "The ARIA attributes \"{0}\" are deprecated in the ARIA specification", + "fail_role_attr": "The ARIA attributes \"{0}\" are deprecated for the role \"{1}\" in the ARIA specification", + "group": "No deprecated ARIA role or attribute should be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var ret = []; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) { + for (var i = 0; i < deprecatedRoles.length; i++) + ret.push((0, IRule_1.RuleFail)('fail_aria_role', [deprecatedRoles[i]])); + } + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) { + for (var i = 0; i < deprecatedAttributes.length; i++) { + // "role":"any", "attribute":ariaAttrs[i]} + if (deprecatedAttributes[i].role === 'any') + ret.push((0, IRule_1.RuleFail)('fail_aria_attr', [deprecatedAttributes[i].attribute])); + else + ret.push((0, IRule_1.RuleFail)('fail_role_attr', [deprecatedAttributes[i].attribute, deprecatedAttributes[i].role])); + } + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_exists.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_attribute_exists.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_attribute_exists = { + id: "aria_attribute_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_EmptyPropertyValue": { + "pass": "pass", + "fail_empty_attribute": "fail_empty_attribute" + } + }, + help: { + "en-US": { + "pass": "aria_attribute_exists.html", + "fail_empty_attribute": "aria_attribute_exists.html", + "group": "aria_attribute_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_empty_attribute": "The element attribute(s): '{0}' value is empty", + "group": "When specifying a required ARIA attribute, the value must not be empty" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return; + var attrNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedProperties = 0; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + if (designPatterns[role] && AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext) != null) { + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + for (var i = 0, length_1 = requiredRoleProps.length; i < length_1; i++) { + var attribute = requiredRoleProps[i]; + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(requiredRoleProps[i])); + if (nodeValue.length == 0) + attrNameArr.push(requiredRoleProps[i]); + } + else if (requiredRoleProps[i] == "aria-labelledby") { + if ((role == "radiogroup") && (hasAttribute(ruleContext, "aria-label"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-label")); + if (nodeValue.length == 0) + attrNameArr.push("aria-label"); + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((role == "progressbar") && (hasAttribute(ruleContext, "aria-valuetext"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-valuetext")); + if (nodeValue.length == 0) + attrNameArr.push("aria-valuetext"); + } + } + } + } + if (designPatterns[role]) { + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var permittedRoles = []; + permittedRoles.push(role); + var allowedAttributes = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, permittedRoles, tagProperty); + for (var i = 0, length_2 = allowedAttributes.length; i < length_2; i++) { + var attribute = allowedAttributes[i]; + if (attribute == "aria-checked" || attribute == "aria-selected" || + attribute == "aria-expanded" || attribute == "aria-orientation" || + attribute == "aria-level") { + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(attribute)); + if (nodeValue.length == 0 && !attrNameArr.includes(attribute)) { + attrNameArr.push(attribute); + } + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(attrNameArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedProperties == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_empty_attribute", retMsg); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_redundant.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_attribute_redundant.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_redundant = { + id: "aria_attribute_redundant", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + "pass": "aria_attribute_redundant.html", + "fail_redundant": "aria_attribute_redundant.html", + "group": "aria_attribute_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "The ARIA attribute is not redundant with a corresponding HTML attribute", + "fail_redundant": "The ARIA attribute \"{0}\" is redundant with the HTML attribute \"{1}\"", + "group": "An ARIA attribute should not be redundant with a corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + // if conflict already reported, ignore reporting overlap + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + if (conflictAttributes && conflictAttributes.length > 0) + return null; + var domAttributes = ruleContext.attributes; + var ariaAttrs = []; + var htmlAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = ruleContext.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push({ name: attrName, value: attrValue }); + else + htmlAttrs.push({ name: attrName, value: attrValue }); + } + } + var ret = []; + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil_1.AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'overlapping'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Pass') { //pass + ret.push((0, IRule_1.RulePass)("pass")); + } + else if (item['result'] === 'Failed') { //failed + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaAttrs[i]['name'], item['attr']])); + } + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_required.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_required.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_required = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_attribute_required = { + id: "aria_attribute_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredProperties": { + "Pass_0": "pass", + "Fail_1": "fail_missing" + } + }, + help: { + "en-US": { + "group": "aria_attribute_required.html", + "pass": "aria_attribute_required.html", + "fail_missing": "aria_attribute_required.html" + } + }, + messages: { + "en-US": { + "group": "The required attributes for the element with a role must be defined", + "pass": "The required attributes for the element with the role are defined", + "fail_missing": "Element with '{0}' role does not have the required ARIA attribute(s): '{1}'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "4e8ab6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var attrNameArr = new Array(); + var roleNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let implicitRole = ARIAMapper.elemToImplicitRole(ruleContext); + //let implicitRole = AriaUtil.getImplicitRole(ruleContext); + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedRoles = 0; + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + if (designPatterns[role] && requiredRoleProps !== null) { + var allowedRoleProps = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, role, tagProperty); + var roleMissingReqProp = false; + for (var i = 0, propertiesLength = requiredRoleProps.length; i < propertiesLength; i++) { + if (!allowedRoleProps.includes(requiredRoleProps[i])) + continue; + if (!hasAttribute(ruleContext, requiredRoleProps[i])) { + // If an aria-labelledby isn't present, an aria-label will meet the requirement. + if (requiredRoleProps[i] == "aria-labelledby") { + if ((!hasAttribute(ruleContext, "aria-label")) || (role != "radiogroup")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((!hasAttribute(ruleContext, "aria-valuetext")) || (role != "progressbar")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-controls" && role == "combobox") { + // Skip this check since aria-controls in the textbox of a combobox is already handled in rule HAAC_Combobox_Must_have_Text_Input + } + else { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + } + if (roleMissingReqProp == true) { + roleNameArr.push(role); + } + } + var passed = roleNameArr.length == 0 || attrNameArr.length == 0; // only aria attributes so NO OUT OF SCOPE + if (!passed) { + var retToken = new Array(); + retToken.push(roleNameArr.join(", ")); + retToken.push(attrNameArr.join(", ")); + return (0, IRule_1.RuleFail)("fail_missing", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_value_valid.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_attribute_value_valid.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_value_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +exports.aria_attribute_value_valid = { + id: "aria_attribute_value_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "Rpt_Aria_ValidPropertyValue": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_value_valid.html", + "Pass_0": "aria_attribute_value_valid.html", + "Fail_1": "aria_attribute_value_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA property values must be valid", + "Pass_0": "Rule Passed", + "Fail_1": "The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "6a7281", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var valueArr = new Array(); + var attrNameArr = new Array(); + var dataTypeArr = new Array(); + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var contextAttributes = ruleContext.attributes; + var testedPropertyValues = 0; + if (contextAttributes) { + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = propertyDataTypes[attrName]; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue); + testedPropertyValues++; + if (dataTypes && dataTypes.values) { + if (dataTypes.values.indexOf(nodeValue) == -1) { + if (dataTypes.values.indexOf('undefined') != -1 && nodeValue.length == 0) { + //translate 'undefined' to mean '' + } + else { + // aria-relevant is represented as a space delimited list of the following values: + // additions, removals, text; or a single catch-all value all. + if (dataTypes.type === "http://www.w3.org/2001/XMLSchema#nmtokens") { + var attrValues = contextAttributes[i].nodeValue.trim().split(" "); + // if the value all is specified, it cannot have any other value + if (attrValues.length > 1 && attrValues.includes("all")) { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + else { + var hash = {}; + for (var j = 0; j < attrValues.length; j++) { + // if the individual value is not in the list of allowed values + if (attrValues[j] != "" && !dataTypes.values.includes(attrValues[j])) { + if (!hash.hasOwnProperty(attrName)) { + hash[attrName] = true; + attrNameArr.push(attrName); + } + valueArr.push(attrValues[j]); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else if (dataTypes && dataTypes.type && dataTypes.type === "http://www.w3.org/2001/XMLSchema#int") { + var iVal = parseInt(nodeValue); + if (isNaN(iVal) || ("" + iVal !== nodeValue)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && dataTypes.type == "http://www.w3.org/2001/XMLSchema#decimal") { + var fVal = parseFloat(nodeValue); + if (isNaN(fVal)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#boolean")) { + var tmpV = nodeValue.trim().toLowerCase(); + if (tmpV !== "true" && tmpV !== "false") { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#string")) { + } + else { + testedPropertyValues--; + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(valueArr.join(", ")); + retMsg.push(attrNameArr.join(", ")); + retMsg.push(ruleContext.nodeName.toLowerCase()); + // retMsg.push (dataTypeArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedPropertyValues == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", retMsg); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_banner_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_banner_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_banner_label_unique = { + id: "aria_banner_label_unique", + context: "aria:banner", + refactor: { + "Rpt_Aria_MultipleBannerLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_banner_label_unique.html", + "fail_label_not_unique": "aria_banner_label_unique.html", + "group": "aria_banner_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"banner\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"banner\" role do not have unique labels", + "group": "Each element with \"banner\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "banner", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_banner_single.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/aria_banner_single.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_banner_single = { + id: "aria_banner_single", + context: "dom:*[role], dom:header", + refactor: { + "Rpt_Aria_OneBannerInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_banner_single.html", + "Fail_1": "aria_banner_single.html", + "group": "aria_banner_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"banner\" role found on the page", + "group": "A page, document, or application should only have one element with \"banner\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "banner")) { + return null; + } + var passed = AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "banner", true, true) === null; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_child_tabbable.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_child_tabbable.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_tabbable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_tabbable = { + id: "aria_child_tabbable", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingFocusableChild": { + "pass": "pass", + "fail_missing_child": "fail_missing_child" + } + }, + help: { + "en-US": { + "pass": "aria_child_tabbable.html", + "fail_missing_child": "aria_child_tabbable.html", + "group": "aria_child_tabbable.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_missing_child": "None of the descendent elements with \"{1}\" role is tabbable", + "group": "UI component must have at least one tabbable descendant for keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) || AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + // An ARIA list is not interactive + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, { "list": true, "row": true, "rowgroup": true, "table": true, "grid": true })) { + return null; + } + // Not a valid message for mobile because all elements are focusable in iOS when VoiceOver is enabled. + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + //ignore datalist element check since it will be part of a input element or hidden by default + if (ruleContext.nodeName.toLowerCase() === 'datalist') + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + var passed = true; + var doc = ruleContext.ownerDocument; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + var nodeName = ""; + var inScope = false; + if (ARIADefinitions_1.ARIADefinitions.containers.includes(role)) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (disabled != 'true' && !hasAttribute(ruleContext, 'aria-activedescendant') && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqChildren; + if (reqChildren) { + inScope = true; + passed = false; + var xp = "descendant::*["; + for (var i = 0; i < reqChildren.length; i++) { + xp += "@role='" + reqChildren[i] + "' or "; + } + xp = xp.substring(0, xp.length - 4) + ']'; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + r = xpathResult.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + // Required child is not focusable via tabindex. See if there is a grandchild that is focusable by default or by tabindex. + if (!passed) { + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + roleNameArr = r.getAttribute("role").trim().split(" "); + nodeName = r.nodeName.toLowerCase(); + } + r = xpathResult.iterateNext(); + } + } + } + } + // Variable Decleration + var retToken1 = new Array(); + var retToken2 = new Array(); + // In the case the arrays/strings are empty, that means that there is no violation so we can reset it back to passed, the reason for this + // is that we are setting passed=false while we perform a loop which causes violation to trigger even if there is no issues. Instead of + // updating the whole rule to switch from using passed in that way simply do the check at this point. + if (nodeName.length > 0 && roleNameArr.length > 0) { + retToken1.push(nodeName); + retToken2.push(roleNameArr.join(", ")); + } + else { + passed = true; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', passed == true ? [] : [retToken1, retToken2]); + if (!inScope) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_missing_child", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_child_valid.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/aria_child_valid.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_valid = { + id: "aria_child_valid", + //context: "dom:*[role]", + //dependencies: ["Rpt_Aria_ValidRole"], + context: "dom:*", + dependencies: ["aria_role_valid", "aria_descendant_valid"], + help: { + "en-US": { + "group": "aria_child_valid.html", + "Pass": "aria_child_valid.html", + "Fail_no_child": "aria_child_valid.html", + "Fail_invalid_child": "aria_child_valid.html" + } + }, + messages: { + "en-US": { + "group": "An element with an ARIA role must own a required child", + "Pass": "An element with an ARIA role owns a required child", + "Fail_no_child": "The element with role \"{0}\" does not own any child element with any of the following role(s): \"{1}\"", + "Fail_invalid_child": "The element with role \"{0}\" owns the child element with the role \"{1}\" that is not one of the allowed role(s): \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Verify mapping + act: ["bc4a75"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // ignore if the element contains none or presentation role + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + // For combobox, we have g1193 ... g1199 to check the values etc. + // We don't want to trigger 1152 again. So, we bypass it here. + if (roles.includes("combobox")) + return null; + var requiredChildRoles = AriaUtil_1.AriaUtil.getRequiredChildRoles(ruleContext, true); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (requiredChildRoles.includes('group')) { + var index = requiredChildRoles.indexOf('group'); + if (index > -1) + requiredChildRoles.splice(index, 1); + } + /** + * ignore if a role doesn't require a child with any specific role + * the reverse might be not true - parent will be checked in Rpt_Aria_RequiredParent_Native_Host_Sematics rule + */ + if (requiredChildRoles.length == 0) + return null; + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (!directATChildren || directATChildren.length == 0) { + // the element with at least one required role dosen't contain any accessible child + /** + * When a widget is missing required owned elements due to script execution or loading, + * authors MUST mark a containing element with 'aria-busy' equal to true. + */ + var busy = ruleContext.getAttribute("aria-busy"); + if (!busy || busy !== 'true') { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(requiredChildRoles.join(", ")); + return (0, IRule_1.RuleFail)("Fail_no_child", retToken); + } + // it's 'busy' loading, ignore it + return null; + } + var violateElemRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + // if explicit role doesn't exist, get the implicit one + if (!childRoles || childRoles.length == 0) + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + if (childRoles && childRoles.length > 0) { + /** + * when multiple roles are specified as required owned elements for a role, at least one instance of one required owned element is expected. + * the specification does not require an instance of each of the listed owned roles. + * therefore, the requirement is met if it has any one of the required roles. + */ + var found_1 = childRoles.some(function (r) { return requiredChildRoles.includes(r); }); + if (!found_1) + violateElemRoles.push(childRoles.join(", ")); + } + else { + // ignore the element since it's not semantic, shouldn't happen + } + } + if (violateElemRoles.length > 0) { + var retValues = []; + for (var i = 0; i < violateElemRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(violateElemRoles[i]); + retToken.push(requiredChildRoles.join(", ")); + retValues.push((0, IRule_1.RuleFail)("Fail_invalid_child", retToken)); + } + return retValues; + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_label_unique.ts" +/*!*********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_unique.ts ***! + \*********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_label_unique = { + id: "aria_complementary_label_unique", + context: "aria:complementary", + refactor: { + "Rpt_Aria_MultipleComplementaryLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_complementary_label_unique.html", + "fail_label_not_unique": "aria_complementary_label_unique.html", + "group": "aria_complementary_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"complementary\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"complementary\" role do not have unique labels", + "group": "Each element with \"complementary\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "complementary"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_label_visible.ts" +/*!**********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_visible.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_label_visible = { + id: "aria_complementary_label_visible", + context: "dom:*[role], dom:aside", + dependencies: ["aria_complementary_labelled"], + refactor: { + "Rpt_Aria_ComplementaryLandmarkLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_label_visible.html", + "Fail_1": "aria_complementary_label_visible.html", + "group": "aria_complementary_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a visible label", + "group": "Each element with \"complementary\" role should have a visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "complementary")) { + return null; + } + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby"); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_labelled.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_complementary_labelled.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_labelled = { + id: "aria_complementary_labelled", + context: "aria:complementary", + refactor: { + "Rpt_Aria_ComplementaryRequiredLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_labelled.html", + "Fail_1": "aria_complementary_labelled.html", + "group": "aria_complementary_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a label", + "group": "Each element with \"complementary\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_content_in_landmark.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_content_in_landmark.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_content_in_landmark = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.aria_content_in_landmark = { + id: "aria_content_in_landmark", + context: "dom:*", + refactor: { + "Rpt_Aria_OrphanedContent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_content_in_landmark.html", + "Fail_1": "aria_content_in_landmark.html", + "group": "aria_content_in_landmark.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Content is not within a landmark element", + "group": "All content must reside within an element with a landmark role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var params = CacheUtil_1.CacheUtil.getCache(context.dom.node.ownerDocument, "aria_content_in_landmark", null); + if (!params) { + params = { + landmarks: { + value: ["banner", "complementary", "contentinfo", "form", "main", "navigation", "region", "search"], + type: "array" + }, + possibleOrphanedWidgets: { + value: ["button", "combobox", "checkbox", "grid", "heading", "link", "list", + "listbox", "menu", "menubar", "progressbar", "radio", "tablist", "textbox", "toolbar", "tree", + "treegrid" + ], + type: "array" + }, + possibleOrphanedElements: { + value: ["p", "table", "input", "textarea", "select", "button", "a", "ol", "ul", "dl", "h1", "h2", "h3", "h4", "h5", + "h6", "embed", "object", "area" + ], + type: "array" + }, + noLandmarkedRoles: { + // These roles don't require landmarks + value: ["alert", "alertdialog", "dialog", "tooltip"], + type: "array" + }, + mapLandmarks: {}, + mapPossibleOrphanedWidgets: {}, + mapPossibleOrphanedElements: {}, + mapNoLandmarkedRoles: {} + }; + // Convert arrays to maps + params.mapLandmarks = {}; + for (var i = 0; i < params.landmarks.value.length; ++i) { + params.mapLandmarks[params.landmarks.value[i]] = true; + } + params.mapPossibleOrphanedWidgets = {}; + for (var i = 0; i < params.possibleOrphanedWidgets.value.length; ++i) { + params.mapPossibleOrphanedWidgets[params.possibleOrphanedWidgets.value[i]] = true; + } + params.mapPossibleOrphanedElements = {}; + for (var i = 0; i < params.possibleOrphanedElements.value.length; ++i) { + params.mapPossibleOrphanedElements[params.possibleOrphanedElements.value[i]] = true; + } + params.mapNoLandmarkedRoles = {}; + for (var i = 0; i < params.noLandmarkedRoles.value.length; ++i) { + params.mapNoLandmarkedRoles[params.noLandmarkedRoles.value[i]] = true; + } + CacheUtil_1.CacheUtil.setCache(context.dom.node.ownerDocument, "aria_content_in_landmark", params); + } + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || // avoid diagnosing g1157 for non-visible nodes + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var elemsWithoutContent = ["area", "input", "embed", "button", "textarea", "select"]; + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext) && //only trigger the rule on elements that have content + elemsWithoutContent.indexOf(nodeName) === -1) { // a few elems wihout content should not be skipped + return (0, IRule_1.RulePass)("Pass_0"); + } + // Short circuit for layout tables + if (nodeName == "table" && TableUtil_1.TableUtil.isLayoutTable(ruleContext)) { + return null; + } + // Check if it is a possible orphan + var passed = true; + var isPossibleOrphanedWidget = AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapPossibleOrphanedWidgets, true); + //exclude <link rel="stylesheet" href="xyz.css"> in the <head> and <body>(#608) + //having link in the head could cause lot of violaions + if (nodeName === 'link') { + isPossibleOrphanedWidget = false; + } + var isPossibleOrphanedElement = nodeName in params.mapPossibleOrphanedElements; + if (isPossibleOrphanedWidget || isPossibleOrphanedElement) { + // See if ancestor has landmark roles or implicit land mark roles + var parentRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + passed = parentRoles.filter(function (role) { return role in params.mapLandmarks; }).length > 0; + if (!passed) { + // Don't fail elements when a parent or sibling has failed - causes too many messages. + var walkElement = DOMWalker_1.DOMWalker.parentElement(ruleContext); + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = DOMWalker_1.DOMWalker.parentElement(walkElement); + } + walkElement = ruleContext.nextElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.nextElementSibling; + } + walkElement = ruleContext.previousElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.previousElementSibling; + } + if (!passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent", true); + // Don't trigger rule if element is a stand-alone widget + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", false) || + AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapNoLandmarkedRoles, true) || + AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, params.mapNoLandmarkedRoles, true); + if (passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", true); + return null; + } + } + else { + return null; + } + } + } + else { + return null; + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_label_unique.ts" +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_label_unique.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_label_unique = { + id: "aria_contentinfo_label_unique", + context: "aria:contentinfo", + refactor: { + "Rpt_Aria_MultipleContentinfoLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_contentinfo_label_unique.html", + "fail_label_not_unique": "aria_contentinfo_label_unique.html", + "group": "aria_contentinfo_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"contentinfo\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"contentinfo\" role do not have unique labels", + "group": "Each element with \"contentinfo\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "contentinfo", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_misuse.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_misuse.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_misuse = { + id: "aria_contentinfo_misuse", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_ContentinfoWithNoMain_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_misuse.html", + "Fail_1": "aria_contentinfo_misuse.html", + "group": "aria_contentinfo_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"contentinfo\" role is present without an element with \"main\" role", + "group": "Each element with \"contentinfo\" role is only permitted with an element with \"main\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //consider implicit role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + // Consider the Check Hidden Content setting that is set by the rules + var passed = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true).length > 0; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_single.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_single.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_single = { + id: "aria_contentinfo_single", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_single.html", + "Fail_1": "aria_contentinfo_single.html", + "group": "aria_contentinfo_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"contentinfo\" role found on the page", + "group": "A page, document, or application should only have one element with \"contentinfo\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //find out if <footer> element has siblings as <footer> has implicit contentinfo role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + var passed = !AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "contentinfo", true, true); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_descendant_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_descendant_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_descendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_descendant_valid = { + id: "aria_descendant_valid", + context: "dom:*", + dependencies: ["aria_role_valid"], + help: { + "en-US": { + "group": "aria_descendant_valid.html", + "pass": "aria_descendant_valid.html", + "potential_child_implicit_role": "aria_descendant_valid.html", + "recommendation_no_impact_role": "aria_descendant_valid.html", + "fail_child_explicit_role": "aria_descendant_valid.html" + } + }, + messages: { + "en-US": { + "group": "Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements", + "pass": "The element contains valid descendants", + "potential_child_implicit_role": "The element with role \"{0}\" contains descendants with implicit roles \"{1}\" which are ignored by browsers", + "recommendation_no_impact_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers", + "fail_child_explicit_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["pass", "potential_child_implicit_role", "fail_child_explicit_role"] + }, { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["recommendation_no_impact_role"] + }], + // TODO: ACT: Verify mapping + act: ["307n5z"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element doesn't require presentational children only + if (!AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // let tagName = ruleContext.tagName.toLowerCase(); + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (directATChildren && directATChildren.length > 0) { + // the element with at least one non-presentational children + var explicitRoles = new Array(); + var implicitRoles = new Array(); + var noImpactRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + // ignore <img> and <svg> + var tag = directATChildren[j].nodeName.toLowerCase(); + if (tag === 'img' || tag === 'svg') + continue; + // get explicit role if exists + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + if (childRoles && childRoles.length > 0) { + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + explicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + else { + // get implicit role if exists + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + if (childRoles && childRoles.length > 0) + implicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + } + if (explicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < explicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(explicitRoles[i]); + retValues.push((0, IRule_1.RuleFail)("fail_child_explicit_role", retToken)); + } + return retValues; + } + if (implicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < implicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(implicitRoles[i]); + retValues.push((0, IRule_1.RulePotential)("potential_child_implicit_role", retToken)); + } + return retValues; + } + if (noImpactRoles.length > 0) { + var retValues = []; + for (var i = 0; i < noImpactRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(noImpactRoles[i]); + retValues.push((0, IRule_1.RulePotential)("recommendation_no_impact_role", retToken)); + } + return retValues; + } + } + else + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_document_label_unique.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_document_label_unique.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_document_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_document_label_unique = { + id: "aria_document_label_unique", + context: "aria:document", + refactor: { + "Rpt_Aria_MultipleDocumentRoles": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_document_label_unique.html", + "fail_label_not_unique": "aria_document_label_unique.html", + "group": "aria_document_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"document\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"document\" roles do not have unique labels", + "group": "Each element with \"document\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "document", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_eventhandler_role_valid.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_eventhandler_role_valid.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_eventhandler_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_eventhandler_role_valid = { + id: "aria_eventhandler_role_valid", + context: "dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]", + refactor: { + "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_eventhandler_role_valid.html", + "Fail_1": "aria_eventhandler_role_valid.html", + "group": "aria_eventhandler_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with '{1}' does not have a valid ARIA role specified", + "group": "Elements with event handlers must have a valid ARIA role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + //this rule is passed if a element has attribut role + //also, passed of element has any implicit roles. + if (AriaUtil_1.AriaUtil.hasAnyRole(ruleContext, true)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //pass if this element is received focus by default + if (CommonUtil_1.CommonUtil.isfocusableByDefault(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //validate if this element has any of the given event handler's + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var eventArr = new Array(); + // From WCAG20_Script_UseW3CDomFunctions + //let events = ["onblur", "onfocus", "onchange", "onclick", "oncontextmenu", "ondblclick", "onkeydown", + // "onkeypress", "onkeyup", "onload", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + // "onmouseover", "onmousewheel", "onreset", "onpaste", "onresize", "onscroll", + // "onselect", "onsubmit", "onactivate", "ondeactivate", "onmouseenter", "onmouseleave"]; + var events = ["onblur", "onfocus", "onchange", "onclick", "ondblclick", "onkeydown", + "onkeypress", "onkeyup", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + "onmouseover", "onresize" + ]; + for (var i = 0; i < events.length; ++i) { + if (ruleContext.hasAttribute(events[i])) + eventArr.push(events[i]); + } + var retToken2 = new Array(); + retToken2.push(eventArr.join(", ")); + //return new ValidationResult(false, [ruleContext], '', '', [retToken1, retToken2]); + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_form_label_unique.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_form_label_unique.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_form_label_unique = { + id: "aria_form_label_unique", + context: "aria:form", + refactor: { + "Rpt_Aria_MultipleFormLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_form_label_unique.html", + "fail_label_not_unique": "aria_form_label_unique.html", + "group": "aria_form_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"form\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"form\" role do not have unique labels", + "group": "Each element with \"form\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "form", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_graphic_labelled.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_graphic_labelled.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_graphic_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_graphic_labelled = { + id: "aria_graphic_labelled", + context: "aria:graphics-document,aria:graphics-symbol", + refactor: { + "HAAC_Aria_SvgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_graphic_labelled.html", + "Pass_0": "aria_graphic_labelled.html", + "Fail_1": "aria_graphic_labelled.html", + "Fail_2": "aria_graphic_labelled.html", + "Fail_3": "aria_graphic_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with a graphics role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" graphics role has no label", + "Fail_2": "Element with \"{0}\" graphics role has no label or an empty label", + "Fail_3": "Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: [{ + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role") || !ruleContext.getAttribute("role").includes("graphics-")) + return null; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.getAttribute("role")]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_hidden_nontabbable.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_hidden_nontabbable.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_hidden_nontabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_hidden_nontabbable = { + id: "aria_hidden_nontabbable", + context: "dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*", + refactor: { + "aria_hidden_focus_misuse": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_hidden_nontabbable.html", + "Pass_0": "aria_hidden_nontabbable.html", + "Fail_1": "aria_hidden_nontabbable.html" + } + }, + messages: { + "en-US": { + "group": "A hidden element should not contain any tabbable elements", + "Pass_0": "Rule Passed", + "Fail_1": "Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.3.1", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Handle testcase with focus jumping away + act: "6cfa84", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_id_unique.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/aria_id_unique.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_id_unique = { + id: "aria_id_unique", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidIdRef": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_id_unique.html", + "Fail_1": "aria_id_unique.html", + "group": "aria_id_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid", + "group": "The ARIA property must reference a non-empty unique id of an existing element that is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: 6a7281 - Need a separate reason code when the property is not required. ACT says it's okay to be + // invalid when not required. I think we should still fail, but flag it as a different reason so that we can have a subset + // aligns with ACT. + act: ["59796f", "6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pass = true; + var attrNameArr = new Array(); + var nonExistantIDs = new Array(); + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var contextAttributes = ruleContext.attributes; + var idTokens = new Array(); + var testedReferences = 0; + if (contextAttributes) { + for (var i = 0, attrLength = contextAttributes.length; i < attrLength; i++) { + pass = true; + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes[attrName]; + if (dataTypes && dataTypes.type) { + var supportsOneIDRef = (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idref") ? true : false; + //If the data type supports one or more id refs do error checking + if (supportsOneIDRef || (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idrefs")) { + testedReferences++; + var nodeValueLength = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue).length; + var idArray = contextAttributes[i].nodeValue.split(" "); + // Check for an empty ID Ref + if (nodeValueLength < 1) { + pass = false; + idTokens.push("\"" + contextAttributes[i].nodeValue + "\""); + } + // check to see if too many IDRefs + else if (supportsOneIDRef) { + //If has too many IDRefs it is an error + if (nodeValueLength >= 1) { + if (idArray.length > 1) { + pass = false; + // Need to capture all the IDRefs for idTokens + for (var z = 0, length_1 = idArray.length; z < length_1; ++z) { + if (idArray[z] != "") { + idTokens.push(idArray[z]); + } + } + } + } + } + // check to see if id refs are invalid + if (pass && nodeValueLength >= 1) { + for (var j = 0, length_2 = idArray.length; j < length_2; ++j) { + if (idArray[j].length > 0) { // it is an empty string if spaces are one after the other + // Get the element by Id + var elementById = ownerDocument.getElementById(idArray[j]); + // Pass if the element exists + pass = elementById != null; + // If the element exists and this is an aria attribute that doesn't support hidden ID reference + // then perform a isNodeVisible check, in the case the node is not visible then we return + // false and true otherwise. + if (pass && !dataTypes.hiddenIDRefSupported) { + pass = VisUtil_1.VisUtil.isNodeVisible(elementById); + } + if (!pass) { + if (idArray[j] != "") { + idTokens.push(idArray[j]); + } + } + // Only one of the id references need to be valid to mark the rule as passed. + // Therefore if we find a single visible element then stop checking and mark as + // passed. + else { + break; + } + } + } + } + } + } + if (!pass) + attrNameArr.push(attrName); + } + } + } + var passed = attrNameArr.length == 0; + var retToken1 = new Array(); + var retToken2 = new Array(); + var retToken3 = new Array(); + if (!passed) { + retToken2.push(attrNameArr.join(", ")); + retToken3.push(ruleContext.nodeName.toLowerCase()); + if (idTokens.length > 0) { + retToken1.push(idTokens.join(", ")); + } + } + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : [retToken1, retToken2, retToken3]); + if (testedReferences == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString(), retToken3.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_img_labelled.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_img_labelled.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_img_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_img_labelled = { + id: "aria_img_labelled", + context: "aria:img, aria:image", + refactor: { + "HAAC_Aria_ImgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_img_labelled.html", + "Pass_0": "aria_img_labelled.html", + "Fail_1": "aria_img_labelled.html", + "Fail_2": "aria_img_labelled.html", + "Fail_3": "aria_img_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with \"img\" role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"img\" role has no label", + "Fail_2": "Element with \"img\" role has no label or an empty label", + "Fail_3": "Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: ["23a2a8", { + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role")) { + // If no role, this is implicit, and covered by WCAG20_Img_HasAlt + return null; + } + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg and img elements are handled in svg_graphics_labbelled and img_alt_valid rules + if (nodeName === 'svg' || nodeName === 'img') + return; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + /* JCH - Points of failure + * 0. Missing alt attr with value + * 1. Missing aria-label or aria-labelledby + * 2. Missing title attr with value + */ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_keyboard_handler_exists.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_keyboard_handler_exists.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_keyboard_handler_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_keyboard_handler_exists = { + id: "aria_keyboard_handler_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingKeyboardHandler": { + "pass": "pass", + "potential_no_keyboard_access": "potential_no_keyboard_access" + } + }, + help: { + "en-US": { + "pass": "aria_keyboard_handler_exists.html", + "potential_no_keyboard_access": "aria_keyboard_handler_exists.html", + "group": "aria_keyboard_handler_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_no_keyboard_access": "Verify the <{0}> element with \"{1}\" role has keyboard access", + "group": "Interactive WAI_ARIA UI components must provide keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var passed = true; + var savedPassed = passed; + var doc = ruleContext.ownerDocument; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/); + //only consider user specified role(s), rather than native containers + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + var nodeName = ruleContext.nodeName.toLowerCase(); + //if an explicit role is specified, the 'aria_role_redundant' rule should be triggered and addressed first, + // and the current rule should be ignored + if (nodeName === 'datalist' && roles && roles.includes("listbox")) + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + for (var j = 0; j < roles.length; ++j) { + var pattern = designPatterns[roles[j]]; + if (roleContainers.indexOf(roles[j]) >= 0) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (!disabled) { + // See if there is a keyboard event handler on the parent element. + passed = (ruleContext.hasAttribute("onkeydown") || ruleContext.hasAttribute("onkeypress") || ruleContext.hasAttribute("onkeyup")); + // No keyboard event handler found on parent. See if keyboard event handlers are on required child elements. + if (!passed) { + if (!hasAttribute(ruleContext, 'aria-activedescendant')) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren; + if (reqChildren) { /* SMF TODO menubar does not have any reqChildren */ + for (var i = 0, requiredChildrenLength = reqChildren.length; i < requiredChildrenLength; i++) { + var xp = "*[contains(@role,'" + reqChildren[i] + "')]"; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r) { + passed = (r.hasAttribute("onkeydown") || r.hasAttribute("onkeypress")); + if (!passed) { + // Child did not have a key handler. See if any of the grandchildren do. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + // All the required children (or any descendants of the required children) must have keypress/keydown + // If not, it is a failure, no need to keep checking any more. + break; + } + r = xpathResult.iterateNext(); + } + } + } + else { + // The current element failed the keydown/keypress, and it does not have required children, such as menubar. + // Let's check its descendants. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + } + else { + // Attribute 'aria-activedescendant' is specified. + passed = true; + } + } + } + } + if (!passed) { + roleNameArr.push(roles[j]); + } + if (!passed && savedPassed) { + savedPassed = passed; + } + } + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var retToken2 = new Array(); + retToken2.push(roleNameArr.join(", ")); + // Determine if this is referenced by a combobox. If so, leave it to the combobox rules to check + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + return savedPassed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_no_keyboard_access", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_landmark_name_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_landmark_name_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_landmark_name_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_landmark_name_unique = { + id: "aria_landmark_name_unique", + context: "aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form", + refactor: { + "landmark_name_unique": { + "Pass_0": "pass", + "Fail_0": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_landmark_name_unique.html", + "fail_label_not_unique": "aria_landmark_name_unique.html", + "group": "aria_landmark_name_unique.html" + } + }, + messages: { + "en-US": { + "pass": "Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'", + "fail_label_not_unique": "Multiple elements with \"{0}\" landmarks within the same parent region are not distinguished from one another because they have the same \"{1}\" label", + "group": "Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // TODO do I need to fiter out bad contentinfo nodes: The footer element is not a contentinfo landmark when it is a descendant of the following HTML5 sectioning elements: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Checking if this landmark is inside a dialog element. If it is we are going to skip checking it. + /**var copyOfRuleContext = ruleContext; + var parnetNodesOfRuleContext = []; + while (copyOfRuleContext) { + parnetNodesOfRuleContext.unshift(copyOfRuleContext); + copyOfRuleContext = copyOfRuleContext.parentElement; + } + parnetNodesOfRuleContext.forEach(elem => { + if (elem !== null) { + if (elem.tagName == "DIALOG" || elem.getAttribute('role') == "dialog") { + return null // Skipping checking landmarks that happen to be inside dialog elements + } + } + }) + */ + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "dialog", true) !== null) + return null; + // Begining formCache work + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_landmark_name_unique", null); + if (!formCache) { + // console.log("---------ENTERING FORM CACHE") + formCache = { + navigationNodes: [], + navigationNodesComputedLabels: [], + navigationNodesParents: [], + navigationNodesMatchFound: [] + }; + var navigationNodesTemp = ownerDocument.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'); + var navigationNodes = Array.from(navigationNodesTemp); + var navigationNodesParents = []; + var navigationNodesMatchFound = []; + // This block of code filters out any nav elements that are under a dialog. As those are not ones we want to test against as we consider dialogs are separate locations from the rest of the main page. + var navigationNodesWithoutDialogs = []; + for (var i = 0; i < navigationNodes.length; i++) { + /**let a = navigationNodes[i]; + + let dialogNodeFoundFlag = false; + while (a) { + a = a.parentElement; + if (a !== null) { + if (a.tagName == "DIALOG" || a.getAttribute('role') == "dialog") { + dialogNodeFoundFlag = true; + } + } + } + if (!dialogNodeFoundFlag) { + navigationNodesWithoutDialogs.push(navigationNodes[i]) + }*/ + // ignore node that is AT hidden or in a dialog + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(navigationNodes[i]) || CommonUtil_1.CommonUtil.getAncestor(navigationNodes[i], ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(navigationNodes[i], "dialog", true) !== null) + continue; + navigationNodesWithoutDialogs.push(navigationNodes[i]); + } + navigationNodes = navigationNodesWithoutDialogs; + for (var i = 0; i < navigationNodes.length; i++) { + // Loop over all the landmark nodes + var els = []; + var a = navigationNodes[i].parentElement; + while (a) { + els.push(a); + a = a.parentElement; + } + for (var j = 0; j < els.length; j++) { + // Loop over all the parents of the landmark nodes + // Find nearest landmark parent based on the tagName or the role attribute + var tagNameTrigger = [ + "ASIDE", + "FOOTER", + "FORM", + "HEADER", + "MAIN", + "NAV", + "SECTION", + ].includes(els[j].tagName); + var roleNameTrigger = false; + if (els[j].hasAttribute("role")) { + roleNameTrigger = [ + "complementary", + "contentinfo", + "form", + "banner", + "main", + "navigation", + "region", + "search", + ].includes(els[j].getAttribute("role")); // TODO we are not covering the case where a elemenent with multiple roles. e.g., role = "form banner". This is a improvment we might want to add in the future. + } + if (tagNameTrigger || roleNameTrigger) { + // Nearest parent-landmark found + navigationNodesParents.push(els[j]); + break; + } + if (j === els.length - 1) { + // This node is at the head of the file so it does not have a parent + navigationNodesParents.push(null); + break; + } + } + } + var navigationNodesComputedLabels = []; + for (var i = 0; i < navigationNodes.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(navigationNodes[i]); + // Loop over all the landmark nodes + navigationNodesComputedLabels.push( + /**ARIAMapper.computeName(navigationNodes[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + for (var i = 0; i < navigationNodesParents.length; i++) { + // Loop over all the parents of the landmark nodes to find duplicates + var matchFound = false; + var pass_0_flag = false; + for (var j = 0; j < navigationNodesParents.length; j++) { + if (j === i) { + // We do not want to compare against ourselfs + continue; + } + // This if statement focus on the case where the parent landmark is null + if (navigationNodesParents[i] === null && + navigationNodesParents[j] === null) { + // We are looking at two root nodes, so we should compare them. + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else if (navigationNodesParents[i] === null || + navigationNodesParents[j] === null) { + // We are looking at a single root node + continue; + } + // This if statement focus on the case where the parent landmark is NOT null + if (DOMUtil_1.DOMUtil.sameNode(navigationNodesParents[i], navigationNodesParents[j])) { + // We have the same parent-landmark AND + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else { + // Different parents // Not applicable + } + } + if (!matchFound) { + if (pass_0_flag) { + navigationNodesMatchFound.push("pass"); + } + else { + navigationNodesMatchFound.push("null"); // This is not the keyword null on purpose. It is a spaceholder in the array so indexes match up. + } + } + } + formCache.navigationNodesComputedLabels = + navigationNodesComputedLabels; + formCache.navigationNodes = navigationNodes; + formCache.navigationNodesParents = navigationNodesParents; + formCache.navigationNodesMatchFound = navigationNodesMatchFound; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_landmark_name_unique", formCache); + // TODO Add validation that all 3 arrays are the same length + // console.log("-------------End formCache") + } // End formCache + var indexToCheck = -1; + for (var i = 0; i < formCache.navigationNodes.length; i++) { + if (ruleContext.isSameNode(formCache.navigationNodes[i])) { + indexToCheck = i; + } + } + if (indexToCheck === -1) { + return null; + } + if (formCache.navigationNodesMatchFound[indexToCheck] === "pass") { + return (0, IRule_1.RulePass)("pass", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + ]); + } + else if (formCache.navigationNodesMatchFound[indexToCheck] === "fail_label_not_unique") { + return (0, IRule_1.RuleFail)("fail_label_not_unique", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + formCache.navigationNodesComputedLabels[indexToCheck], + ]); + } + else { + return null; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_main_label_unique.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_main_label_unique.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_main_label_unique = { + id: "aria_main_label_unique", + context: "aria:main", + refactor: { + "Rpt_Aria_MultipleMainsRequireLabel_Implicit_2": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_unique.html", + "Fail_1": "aria_main_label_unique.html", + "group": "aria_main_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique labels", + "group": "Each element with \"main\" role must have unique label that describes its purposes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var contextLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var parentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "document", true); + var mains = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + var result = null; + for (var i = 0; i < mains.length; ++i) { + if (mains[i] === ruleContext) + continue; + result = (0, IRule_1.RulePass)("Pass_0"); + var thisParentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(mains[i], "document", true); + if (thisParentDocRole === parentDocRole) { + if (AriaUtil_1.AriaUtil.getAriaLabel(mains[i]) === contextLabel) { + result = (0, IRule_1.RuleFail)("Fail_1"); + break; + } + } + } + return result; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_main_label_visible.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_main_label_visible.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_main_label_visible = { + id: "aria_main_label_visible", + context: "dom:body", + refactor: { + "Rpt_Aria_MultipleMainsVisibleLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_visible.html", + "Fail_1": "aria_main_label_visible.html", + "group": "aria_main_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique visible labels", + "group": "Each element with \"main\" role should have a unique visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Consider the Check Hidden Content setting that is set by the rules + //call getElementsByRoleHidden with considerImplicit flag as true + //so that the method returs <main> elements + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var passed = AriaUtil_1.AriaUtil.hasUniqueAriaLabelledby(landmarks); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_navigation_label_unique.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_navigation_label_unique.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_navigation_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_navigation_label_unique = { + id: "aria_navigation_label_unique", + context: "aria:navigation", + refactor: { + "Rpt_Aria_MultipleNavigationLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_navigation_label_unique.html", + "fail_label_not_unique": "aria_navigation_label_unique.html", + "group": "aria_navigation_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"navigation\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"navigation\" role do not have unique labels", + "group": "Each element with \"navigation\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "navigation", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_parent_required.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_parent_required.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_parent_required = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_parent_required = { + id: "aria_parent_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredParent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_parent_required.html", + "Pass_0": "aria_parent_required.html", + "Fail_1": "aria_parent_required.html" + } + }, + messages: { + "en-US": { + "group": "Each element with an implicit or explicit role must be contained within a valid element", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" role is not contained in or owned by an element with one of the following roles: \"{1}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Check Fail 3 + act: "ff89c9", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext)) + return; + var passed = true; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var roleNameArr = new Array(); + var containerRoles = new Array(); + var testedContainer = 0; + var ancestorRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + var parentRole = ancestorRoles[ancestorRoles.length - 2]; + var count = 2; + while (parentRole === 'none') { + count++; + parentRole = ancestorRoles[ancestorRoles.length - count]; + } + /**for (let j = 0, length = roles.length; j < length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[roles[j]].container; + for (let i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) break; + } + if (passed == false) { + roleNameArr.push(roles[j]); + } + } + } + */ + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (designPatterns[role] && designPatterns[role].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[role].container; + for (var i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) + break; + } + if (passed == false) { + roleNameArr.push(role); + } + } + var retToken1 = new Array(); + retToken1.push(roleNameArr.join(", ")); + var retToken2 = new Array(); + retToken2.push(containerRoles.join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (testedContainer == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_region_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_region_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_region_label_unique = { + id: "aria_region_label_unique", + context: "aria:region", + refactor: { + "Rpt_Aria_MultipleRegionsUniqueLabel_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_region_label_unique.html", + "fail_label_not_unique": "aria_region_label_unique.html", + "group": "aria_region_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"region\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"region\" role do not have unique labels", + "group": "Each element with \"region\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "region"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_region_labelled.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_region_labelled.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_region_labelled = { + id: "aria_region_labelled", + context: "aria:region", + refactor: { + "Rpt_Aria_RegionLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + // "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_region_labelled.html", + "Fail_1": "aria_region_labelled.html", + // "Fail_2": "aria_region_labelled.html", + "group": "aria_region_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"region\" role does not have a label", + // "Fail_2": "Element with \"region\" role is not labeled with 'aria-label' or 'aria-labelledby'", + "group": "Each element with \"region\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_role_allowed.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_role_allowed.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_role_allowed = { + id: "aria_role_allowed", + context: "dom:*[role]", + refactor: { + "Rpt_Aria_ValidRole": { + "Pass_0": "Pass_0", + "Fail_2": "Fail_2", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "aria_role_allowed.html", + "Pass_0": "aria_role_allowed.html", + "Fail_2": "aria_role_allowed.html", + "Potential_1": "aria_role_allowed.html" + } + }, + messages: { + "en-US": { + "group": "Elements must have a valid 'role' per ARIA specification", + "Pass_0": "Rule Passed", + "Fail_2": "The role '{0}' defined on the element is not valid per ARIA specification", + "Potential_1": "Some of the roles, '{0}', defined on the element are not valid per ARIA specification" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Recheck + act: "674b10", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var roleStr = ruleContext.getAttribute("role").trim().toLowerCase(); + if (roleStr.length === 0) { + return null; + } + if (ruleContext.hasAttribute("aria-hidden") && ruleContext.getAttribute("aria-hidden").toLowerCase() === "true") { + return null; + } + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (!invalidRoles || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + else { + var roles = roleStr.split(/\s+/); + if (invalidRoles.length === roles.length) { + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(",")]); + } + else if (invalidRoles.length > 0) { + return (0, IRule_1.RulePotential)("Potential_1", [invalidRoles.join(",")]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_role_redundant.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_role_redundant.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_role_redundant = { + id: "aria_role_redundant", + context: "dom:*[role]", + help: { + "en-US": { + "pass": "aria_role_redundant.html", + "fail_redundant": "aria_role_redundant.html", + "group": "aria_role_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "An explicitly-assigned ARIA role is not redundant with the implicit role of the element", + "fail_redundant": "The explicitly-assigned ARIA role \"{0}\" is redundant with the implicit role of the element <{1}>", + "group": "An explicitly-assigned ARIA role should not be redundant with the implicit role of the element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var elemName = ruleContext.tagName.toLowerCase(); + var ariaRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + if (!ariaRoles || ariaRoles.length === 0) + return; + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + var role_defined = AriaUtil_1.AriaUtil.areRolesDefined(ariaRoles); + if (!role_defined) + return null; + // dependency check: if it's already failed in the parent relation, then skip this check + // comment out to report the redundant role for table element: tr, td & th + /**if (["td", "th", "tr"].includes(elemName)) { + let parentRole = TableUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + }*/ + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + if (!implicitRoles || implicitRoles.length === 0) + return (0, IRule_1.RulePass)("pass"); + var ret = []; + for (var i = 0; i < ariaRoles.length; i++) { + if (!implicitRoles.includes(ariaRoles[i])) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaRoles[i], elemName])); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_search_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_search_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_search_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_search_label_unique = { + id: "aria_search_label_unique", + context: "aria:search", + refactor: { + "Rpt_Aria_MultipleSearchLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_search_label_unique.html", + "fail_label_not_unique": "aria_search_label_unique.html", + "group": "aria_search_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"search\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"search\" role do not have unique labels", + "group": "Each element with \"search\" role must have a unique label that describes its purpose" + } + }, + /** + * deprecated the rule on 01/27/2025 + * rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + rulesets: [{ + "id": [], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "search", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_semantics.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/aria_semantics.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_valid = exports.aria_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_role_valid = { + id: "aria_role_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "aria_semantics_role": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_role_valid.html", + "Fail_1": "aria_role_valid.html", + "Fail_2": "aria_role_valid.html", + "group": "aria_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The ARIA role '{0}' is not valid for the element <{1}>", + "Fail_2": "The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable", + "group": "ARIA roles must be valid for the element to which they are assigned" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var tagName = ruleContext.tagName.toLowerCase(); + // only chek element (1) and fragment nodes (11) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + //skip the rule + // the invalid role case: handled by aria_role_allowed. Ignore to avoid duplicated report + var undefinedRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (undefinedRoles && undefinedRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + // dependency check: if it's already failed, then skip + if (["td", "th", "tr"].includes(tagName)) { + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + } + var domRoles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles.includes('generic')) + return (0, IRule_1.RuleFail)("Fail_1", ["generic", tagName]); + var invalidRoles = AriaUtil_1.AriaUtil.getInvalidRoles(ruleContext); + if (invalidRoles === null || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + if (invalidRoles.includes("presentation") || invalidRoles.includes("none") && CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(", "), tagName]); + if (invalidRoles.length > 0) + return (0, IRule_1.RuleFail)("Fail_1", [invalidRoles.join(", "), tagName]); + if (domRoles.length > 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + return null; + } +}; +// This rule is in the same file because there is a dependency that aria_role_valid runs first, +// and the info is passed by cache, but there isn't a dependency in the Fail_2 scenario, so regular +// dependency cannot be used +exports.aria_attribute_valid = { + id: "aria_attribute_valid", + context: "dom:*", + // The the ARIA role is completely invalid, skip this check + dependencies: ["aria_attribute_deprecated", "aria_role_valid"], + refactor: { + "aria_attribute_allowed": { + "Pass": "Pass", + "Fail_invalid_role_attr": "Fail_invalid_role_attr", + "Fail_invalid_implicit_role_attr": "Fail_invalid_implicit_role_attr" + } + }, + help: { + "en-US": { + "group": "aria_attribute_valid.html", + "Pass": "aria_attribute_valid.html", + "Fail_invalid_role_attr": "aria_attribute_valid.html", + "Fail_invalid_implicit_role_attr": "aria_attribute_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes should be valid for the element and ARIA role to which they are assigned", + "Pass": "ARIA attributes are valid for the element and ARIA role", + "Fail_invalid_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with ARIA role \"{2}\"", + "Fail_invalid_implicit_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with implicit ARIA role \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["5c01ea", { "46ca7f": { "Pass": "pass", "Fail_invalid_role_attr": "fail", "Fail_invalid_implicit_role_attr": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // only chek element (1) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + // ignore if no aria attribute + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (ariaAttributes === null || ariaAttributes.length === 0) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + var explicit = true; + if (roles && roles.length > 0) { + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + if (!AriaUtil_1.AriaUtil.areRolesDefined(roles)) + return null; + } + else { + //no explicit role defined + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + explicit = false; + } + var tagName = ruleContext.tagName.toLowerCase(); + var failedAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (!failedAttributes || failedAttributes.length === 0) + return (0, IRule_1.RulePass)("Pass", [ariaAttributes.join(", "), tagName, roles.join(", ")]); + if (roles.length > 0) { + if (explicit) + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + else + return (0, IRule_1.RuleFail)("Fail_invalid_implicit_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + } + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, "none"]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_toolbar_label_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_toolbar_label_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_toolbar_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_toolbar_label_unique = { + id: "aria_toolbar_label_unique", + context: "aria:toolbar", + refactor: { + "Rpt_Aria_MultipleToolbarUniqueLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_toolbar_label_unique.html", + "Fail_1": "aria_toolbar_label_unique.html", + "group": "aria_toolbar_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"toolbar\" roles do not have unique labels", + "group": "Each element with \"toolbar\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "toolbar", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_widget_labelled.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_widget_labelled.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_widget_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_widget_labelled = { + id: "aria_widget_labelled", + context: "dom:*", + refactor: { + "Rpt_Aria_WidgetLabels_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_widget_labelled.html", + "Pass_0": "aria_widget_labelled.html", + "Fail_1": "aria_widget_labelled.html" + } + }, + messages: { + "en-US": { + "group": "Interactive component must have a programmatically associated name", + "Pass_0": "Rule Passed", + "Fail_1": "Interactive component with ARIA role '{0}' does not have a programmatically associated name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "m6b1q3", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + /* removed the role check role= presentation and role=none since these 2 roles are not in the list of widget type roles */ + if ((ruleContext.hasAttribute("type") && + ruleContext.getAttribute("type") === "hidden") || + (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || + AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox")))) { + // we need to diagnose that a combobox input textbox has a label(github issue #1104) + return null; + } + var elemRole = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var tagName = ruleContext.nodeName.toLowerCase(); + // Handled by input_label_exists + var skipRoles = [ + "button", + "checkbox", + "combobox", + "listbox", + "menuitemcheckbox", + "menuitemradio", + "radio", + "searchbox", + "slider", + "spinbutton", + "switch", + "textbox", + "progressbar", + "link", + ]; + if (skipRoles.includes(elemRole)) + return null; + if (tagName === "output" || + (tagName === "input" && + ruleContext.getAttribute("type") === "file")) { + } + if (!ruleContext.hasAttribute("role")) { + // Form/input elements are checked by G41, we skip them from this rule. Github issue 449 + var skipElements = [ + "input", + "textarea", + "select", + "button", + "datalist", + "optgroup", + "option", + "keygen", + "output", + "progress", + "meter", + ]; + if (skipElements.indexOf(ruleContext.nodeName.toLowerCase()) != + -1) { + return null; + } + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var passed = true; + var prohibited = false; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //get attribute roles as well as implicit roles. + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + var numWidgetsTested = 0; + var interactiveRoleTypes = ["widget", "liveRegion", "window"]; + for (var i = 0, length_1 = roles.length; passed && i < length_1; ++i) { + var pattern = designPatterns[roles[i]]; + if (pattern && + pattern.nameRequired && + pattern.roleType && + interactiveRoleTypes.includes(pattern.roleType)) { + ++numWidgetsTested; + // All widgets may have an author supplied accessible name. + // Title is legal, but don't advertise its use in documentation. + // Encourage use of aria-label, aria-labelledby or html label element. + passed = + AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title") || + CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!passed && + pattern.nameFrom && + pattern.nameFrom.indexOf("contents") >= 0) { + // See if widget's accessible name is supplied by element's inner text + // nameFrom: ["author", "contents"] + passed = CommonUtil_1.CommonUtil.hasInnerContentOrAlt(ruleContext); + } + if (!passed) { + // check if it has implicit label, like <label><input ....>abc </label> + passed = CommonUtil_1.CommonUtil.hasImplicitLabel(ruleContext); + } + if (!passed && + ruleContext.tagName.toLowerCase() === "img" && + !ruleContext.hasAttribute("role") && + ruleContext.hasAttribute("alt")) { + passed = + DOMUtil_1.DOMUtil.cleanWhitespace(ruleContext.getAttribute("alt")).trim().length > 0; + } + if (pattern.nameFrom.indexOf("prohibited") >= 0) { + prohibited = true; + } + } + } + if (numWidgetsTested === 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [elemRole]); + } + else { + //TODO + // if (prohibited) { + // return RuleFail("Fail_2"); + // } else { + return (0, IRule_1.RulePass)("Pass_0"); + // } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/asciiart_alt_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/asciiart_alt_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.asciiart_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.asciiart_alt_exists = { + id: "asciiart_alt_exists", + context: "dom:pre, dom:listing, dom:xmp, dom:plaintext", + refactor: { + "RPT_Pre_ASCIIArt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "asciiart_alt_exists.html", + "Potential_1": "asciiart_alt_exists.html", + "group": "asciiart_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that ASCII art has a text alternative", + "group": "ASCII art must have a text alternative" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Fix for IDWB writers. Don't trigger if content is in a code element. The code element is searched for + // in various places because of the weird way various browsers render <code><pre></pre></code. Firefox, + // HtmlUnit and Chrome all render differently. Firefox: <code></code><pre></pre> HtmlUnit: </code><pre><code></code></pre> + // See unit test CodeElementAbovePreElement.html. Don't know how RPT renders, so cover all the bases. + if (ruleContext.nodeName.toLowerCase() == "pre") { + if ((ruleContext.previousSibling && ruleContext.previousSibling.nodeName.toLowerCase() == "code") || + ruleContext.getElementsByTagName("code").length > 0 || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, "code")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + var passed = true; + var txtValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + var nonAlphaNumericNorSpaceCount = 0; + var alphNumSameCharacterCount = 0; + var lastCharacter = ""; + // Iterate through the text content + for (var idx = 0; passed && (idx < txtValue.length); ++idx) { + var chStr = txtValue.substr(idx, 1); + // Check if it is alphanumeric or punctuation + if (/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(chStr)) { + // Detect same character sequence + if (lastCharacter == chStr) { + alphNumSameCharacterCount = alphNumSameCharacterCount + 1; + ; + } + else { + alphNumSameCharacterCount = 0; + } + } + else if (/\s/.test(chStr)) { + alphNumSameCharacterCount = 0; + } + else { + nonAlphaNumericNorSpaceCount = nonAlphaNumericNorSpaceCount + 1; + alphNumSameCharacterCount = 0; + } + lastCharacter = chStr; + // Make the decision + if (nonAlphaNumericNorSpaceCount >= 5 || alphNumSameCharacterCount >= 4) { + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blink_css_review.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/blink_css_review.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_css_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blink_css_review = { + id: "blink_css_review", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Blink_CSSTrigger1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "blink_css_review.html", + "Pass_0": "blink_css_review.html", + "Potential_1": "blink_css_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds", + "Pass_0": "Rule Passed", + "Potential_1": "Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var textValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute('style')) { + textValue = ruleContext.getAttribute('style'); + } + var passed = textValue.toLowerCase().indexOf("text-decoration:blink") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blink_elem_deprecated.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/blink_elem_deprecated.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_elem_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.blink_elem_deprecated = { + id: "blink_elem_deprecated", + context: "dom:blink", + refactor: { + "WCAG20_Blink_AlwaysTrigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "blink_elem_deprecated.html", + "Fail_1": "blink_elem_deprecated.html" + } + }, + messages: { + "en-US": { + "group": "Content that blinks persistently must not be used", + "Fail_1": "Content found that blinks persistently" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + // const ruleContext = context["dom"].node as Element; + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blockquote_cite_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/blockquote_cite_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blockquote_cite_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blockquote_cite_exists = { + id: "blockquote_cite_exists", + context: "dom:blockquote", + refactor: { + "RPT_Blockquote_HasCite": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "blockquote_cite_exists.html", + "Potential_1": "blockquote_cite_exists.html", + "group": "blockquote_cite_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only", + "group": "Use <blockquote> only for quotations, not indentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "cite"); + if (!passed) { + var citeElems = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "cite"); + passed = citeElems != null && citeElems.length > 0; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/canvas_content_described.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/canvas_content_described.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.canvas_content_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.canvas_content_described = { + id: "canvas_content_described", + context: "dom:canvas", + refactor: { + "HAAC_Canvas": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "canvas_content_described.html", + "Manual_1": "canvas_content_described.html", + "group": "canvas_content_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify accessibility of the <canvas> element", + "group": "The <canvas> element may not be accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.1.1", "4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = ruleContext.innerHTML.trim().length > 0; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/caption_track_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/caption_track_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.caption_track_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.caption_track_exists = { + id: "caption_track_exists", + context: "dom:video", + refactor: { + "HAAC_Video_HasNoTrack": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "caption_track_exists.html", + "Potential_1": "caption_track_exists.html", + "group": "caption_track_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that captions are available for any meaningful audio or provide a caption track for the <video> element", + "group": "A <video> element must have a text alternative for any meaningful audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + // ignore decorative video if user uses aria-hidden + if (ruleContext.getAttribute("aria-hidden") === "true") { + return null; + } + var tracks = ruleContext.getElementsByTagName("track"); + for (var i = 0; i < tracks.length; ++i) { + passed = passed || tracks[i].getAttribute("kind") === 'captions'; + } + // checks for addition of dynamic tracks + if (ruleContext.textTracks && ruleContext.textTracks.length > 0) { + for (var i = 0; i < ruleContext.textTracks.length; i++) { + passed = passed || ruleContext.textTracks[i].kind === 'captions'; + } + } + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_active_descendant.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/combobox_active_descendant.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_active_descendant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_active_descendant = { + id: "combobox_active_descendant", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_active_descendant.html", + "Fail_missing": "combobox_active_descendant.html", + "Fail_not_in_popup": "combobox_active_descendant.html", + "Fail_active_role_invalid": "combobox_active_descendant.html", + "Fail_active_not_selected": "combobox_active_descendant.html", + "group": "combobox_active_descendant.html" + } + }, + messages: { + "en-US": { + "Pass": "'aria-activedescendant' is used appropriately for this combobox", + "Fail_missing": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist", + "Fail_not_in_popup": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"", + "Fail_active_role_invalid": "The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'", + "Fail_active_not_selected": "The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true", + "group": "'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // This rule only applies if the activedescendant is specified + var activeId = ruleContext.getAttribute("aria-activedescendant"); + if (!activeId || activeId.trim().length === 0) { + return null; + } + var activeElem = fragment_1.FragmentUtil.getById(ruleContext, activeId); + if (!activeElem) { + return (0, IRule_1.RuleFail)("Fail_missing", [activeId]); + } + var found = false; + // examine the children + if (popupElement) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (!found && nw.nextNode() && nw.node != popupElement && nw.node != popupElement.nextSibling) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + found = nw.elem().getAttribute("id") === activeId; + } + } + } + var retVal = []; + if (!found) { + retVal.push((0, IRule_1.RulePass)("Fail_not_in_popup", [activeId, popupId])); + } + var activeRoles = AriaUtil_1.AriaUtil.getRoles(activeElem, true); + var validRoles = ["option", "gridcell", "row", "treeitem"].filter(function (validRole) { return activeRoles.includes(validRole); }); + if (validRoles.length === 0) { + retVal.push((0, IRule_1.RuleFail)("Fail_active_role_invalid", [activeId, activeRoles.join(",")])); + } + if (activeElem.getAttribute("aria-selected") !== "true") { + retVal.push((0, IRule_1.RuleFail)("Fail_active_not_selected", [activeId])); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_autocomplete_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_autocomplete_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_autocomplete_valid = { + id: "combobox_autocomplete_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_autocomplete": { + "Pass": "Pass", + "Fail_1": "Fail_1", + "Fail_inline": "Fail_inline" + } + }, + help: { + "en-US": { + "Pass": "combobox_autocomplete_valid.html", + "Fail_1": "combobox_autocomplete_valid.html", + "Fail_inline": "combobox_autocomplete_valid.html", + "group": "combobox_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup", + "Fail_1": "The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"", + "Fail_inline": "The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ", + "group": "A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupId = cachedElem.popupId, popupElement = cachedElem.popupElement; + var retVal = []; + if (ruleContext.getAttribute("aria-autocomplete") === "inline") { + retVal.push((0, IRule_1.RuleFail)("Fail_inline")); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-autocomplete" + passed = !popupElement.hasAttribute("aria-autocomplete"); + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !nw.elem().hasAttribute("aria-autocomplete"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_1", [popupId])); + } + if (retVal.length > 0) { + return retVal; + } + else { + return (0, IRule_1.RulePass)("Pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_design_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/combobox_design_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_design_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +function patternDetect(elem) { + // check 'explicit' role combobox and that it is not <select>. + if (elem.tagName.toLowerCase() === "select" && elem.getAttribute("role") !== "combobox") { + return "implicit"; + } + else if (elem.nodeName.toLowerCase() === "input" + && (!elem.hasAttribute("type") || elem.getAttribute("type") === "text") + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.0 pattern, which the ARIA 1.2 spec says to continue to allow + return "1.0"; + } + else if (elem.nodeName.toLowerCase() !== "input" + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.1 pattern, which the ARIA 1.2 spec says is now invalid + return "1.1"; + } + // Assume they're trying to do the latest, 1.2 pattern + return "1.2"; +} +exports.combobox_design_valid = { + id: "combobox_design_valid", + context: "aria:combobox", + refactor: { + "combobox_version": { + "Pass_1.0": "Pass_1.0", + "Fail_1.1": "Fail_1.1", + "Pass_1.2": "Pass_1.2" + } + }, + help: { + "en-US": { + "Pass_1.0": "combobox_design_valid.html", + "Fail_1.1": "combobox_design_valid.html", + "Pass_1.2": "combobox_design_valid.html", + "group": "combobox_design_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1.0": "The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2", + "Fail_1.1": "The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2", + "Pass_1.2": "The combobox design pattern is detected as ARIA 1.2", + "group": "The combobox design pattern must be valid for ARIA 1.2" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var pattern = patternDetect(ruleContext); + // We don't assess native select elements here + if (pattern === "implicit") { + return null; + } + var tagName = ruleContext.tagName.toLowerCase(); + var expanded = (AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-expanded") || "").trim().toLowerCase() === "true"; + var editable = tagName === "input" && (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() === "text"); + var key = context["dom"].rolePath; + if (key) { + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + cache[key] = { + "inputElement": editable ? ruleContext : null, + "pattern": pattern, + "expanded": expanded + }; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "combobox", cache); + } + else { + // No xpath? + return null; + } + if (pattern === "1.0") { + return (0, IRule_1.RulePass)("Pass_1.0"); + } + else if (pattern === "1.1") { + return (0, IRule_1.RuleFail)("Fail_1.1"); + } + else if (pattern === "1.2") { + return (0, IRule_1.RulePass)("Pass_1.2"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_focusable_elements.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_focusable_elements.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_focusable_elements = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_focusable_elements = { + id: "combobox_focusable_elements", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_focusable_elements.html", + "Fail_not_tabbable": "combobox_focusable_elements.html", + "Fail_tabbable_child": "combobox_focusable_elements.html", + "group": "combobox_focusable_elements.html" + } + }, + messages: { + "en-US": { + "Pass": "DOM focus is allowed only on the combobox element as required", + "Fail_not_tabbable": "The combobox element does not allow DOM focus as required", + "Fail_tabbable_child": "The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed", + "group": "Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, expanded = cachedElem.expanded; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + var popupRole = AriaUtil_1.AriaUtil.getRoles(popupElement, true)[0]; + var retVal = []; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + retVal.push((0, IRule_1.RuleFail)("Fail_not_tabbable")); + } + // Only makes sense to check the popup when expanded + // this does not apply to dialogs, return pass since the main element was focusable above + if (expanded === false || popupRole === "dialog") { + return (0, IRule_1.RulePass)("Pass"); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-activedescendant" + passed = !CommonUtil_1.CommonUtil.isTabbable(popupElement) && !AriaUtil_1.AriaUtil.getAriaAttribute(popupElement, "aria-activedescendant"); + ; + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !CommonUtil_1.CommonUtil.isTabbable(nw.node) && + !AriaUtil_1.AriaUtil.getAriaAttribute(nw.node, "aria-activedescendant"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_tabbable_child")); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_haspopup_valid.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/combobox_haspopup_valid.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_haspopup_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.combobox_haspopup_valid = { + id: "combobox_haspopup_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_haspopup": { + "Pass": "Pass", + "Fail_popup_role_invalid": "Fail_popup_role_invalid", + "Fail_combobox_popup_role_mismatch": "Fail_combobox_popup_role_mismatch" + } + }, + help: { + "en-US": { + "Pass": "combobox_haspopup_valid.html", + "Fail_popup_role_invalid": "combobox_haspopup_valid.html", + "Fail_combobox_popup_role_mismatch": "combobox_haspopup_valid.html", + "group": "combobox_haspopup_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value", + "Fail_popup_role_invalid": "The 'role' value \"{0}\" of the popup element \"{1}\" should be one of \"listbox\", \"grid\", \"tree\" or \"dialog\"", + "Fail_combobox_popup_role_mismatch": "The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"", + "group": "The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // Check that popup role is listbox, grid, tree, or dialog and that it matches the combobox + var popupRoles = AriaUtil_1.AriaUtil.getRoles(popupElement, true); + var validRoles = ["listbox", "grid", "tree", "dialog"].filter(function (validRole) { return popupRoles.includes(validRole); }); + if (validRoles.length === 0) { + return (0, IRule_1.RuleFail)("Fail_popup_role_invalid", [popupRoles.join(","), popupId]); + } + else { + var popupRole = validRoles[0]; + var haspopupVal = ruleContext.getAttribute("aria-haspopup") || "listbox"; + // Popup role must match aria-haspopup unless popupRole is listbox, then aria-haspopup should not be defined + if (haspopupVal !== popupRole) { + if (popupRole !== "listbox" || ruleContext.hasAttribute("aria-haspopup")) { + return (0, IRule_1.RuleFail)("Fail_combobox_popup_role_mismatch", [haspopupVal, popupRole]); + } + } + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_popup_reference.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/combobox_popup_reference.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_popup_reference = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_popup_reference = { + id: "combobox_popup_reference", + context: "aria:combobox", + dependencies: ["combobox_design_valid"], + help: { + "en-US": { + "group": "combobox_popup_reference.html", + "Pass_1.0_expanded": "combobox_popup_reference.html", + "Pass_1.0_collapsed": "combobox_popup_reference.html", + "Pass_1.2_expanded": "combobox_popup_reference.html", + "Pass_1.2_collapsed": "combobox_popup_reference.html", + "Fail_1.0_missing_owns": "combobox_popup_reference.html", + "Fail_1.2_missing_controls": "combobox_popup_reference.html", + "Fail_1.0_popup_reference_missing": "combobox_popup_reference.html", + "Fail_1.2_popup_reference_missing": "combobox_popup_reference.html", + "Fail_combobox_expanded_hidden": "combobox_popup_reference.html", + "Fail_combobox_collapsed_visible": "combobox_popup_reference.html" + } + }, + messages: { + "en-US": { + "group": "The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value", + "Pass_1.0_expanded": "The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible", + "Pass_1.0_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Pass_1.2_expanded": "The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible", + "Pass_1.2_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Fail_1.0_missing_owns": "The 'aria-owns' attribute of the expanded combobox is missing", + "Fail_1.2_missing_controls": "The 'aria-controls' attribute of the expanded combobox is missing", + "Fail_1.0_popup_reference_missing": "The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_1.2_popup_reference_missing": "The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_combobox_expanded_hidden": "The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible", + "Fail_combobox_collapsed_visible": "The combobox 'aria-expanded' attribute is false, but the combobox popup is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "4e8ab6": { + "Pass_1.0_expanded": "fail", + "Pass_1.0_collapsed": "fail", + "Pass_1.2_expanded": "pass", + "Pass_1.2_collapsed": "pass", + "Fail_1.0_missing_owns": "inapplicable", + "Fail_1.2_missing_controls": "fail", + "Fail_1.0_popup_reference_missing": "inapplicable", + "Fail_1.2_popup_reference_missing": "fail", + "Fail_combobox_expanded_hidden": "inapplicable", + "Fail_combobox_collapsed_visible": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var pattern = cachedElem.pattern, expanded = cachedElem.expanded; + var popupId; + var popupElement; + if (pattern === "1.0") { + if (!ruleContext.hasAttribute("aria-owns")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_missing_owns"); + } + popupId = ruleContext.getAttribute("aria-owns"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_popup_reference_missing", [popupId]); + } + } + else if (pattern === "1.2") { + if (!ruleContext.hasAttribute("aria-controls")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_missing_controls"); + } + popupId = ruleContext.getAttribute("aria-controls"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_popup_reference_missing", [popupId]); + } + } + else { + return null; + } + // We have an element, stick it in the cache and then check its role + cachedElem.popupId = popupId; + cachedElem.popupElement = popupElement; + if (expanded && !VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_expanded_hidden"); + } + else if (!expanded && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_collapsed_visible"); + } + if (pattern === "1.0") { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.0_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.0_collapsed"); + } + } + else { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.2_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.2_collapsed"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/debug_paths.ts" +/*!*************************************!*\ + !*** ./src/v4/rules/debug_paths.ts ***! + \*************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.debug_paths = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.debug_paths = { + id: "debug_paths", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["DEBUG"], + num: "1", + level: IRule_1.eRulePolicy.INFORMATION, + toolkitLevel: IRule_1.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + ruleContext.setAttribute("domPath", context["dom"].rolePath); + ruleContext.setAttribute("ariaPath", context["aria"].rolePath); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/detector_tabbable.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/detector_tabbable.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.detector_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.detector_tabbable = { + id: "detector_tabbable", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["EXTENSIONS"], + num: "1", + level: IRule_2.eRulePolicy.INFORMATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return null; + } + var hierContext = contextHierarchies.aria[contextHierarchies.aria.length - 1]; + return (0, IRule_1.RulePass)("Pass_0", [], [{ + name: hierContext.attributes.name, + role: hierContext.role, + tabindex: parseInt(ruleContext.getAttribute("tabindex") || "0") + }]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/dir_attribute_valid.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/dir_attribute_valid.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.dir_attribute_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.dir_attribute_valid = { + id: "dir_attribute_valid", + context: "dom:*[dir]", + refactor: { + "Valerie_Elem_DirValid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "dir_attribute_valid.html", + "Fail_1": "dir_attribute_valid.html", + "group": "dir_attribute_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Invalid value used for the 'dir' attribute", + "group": "'dir' attribute value must be \"ltr\", \"rtl\", or \"auto\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var dirStr = ruleContext.getAttribute("dir").toLowerCase(); + var passed = dirStr == "ltr" || dirStr == "rtl" || dirStr == "auto"; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/download_keyboard_controllable.ts" +/*!********************************************************!*\ + !*** ./src/v4/rules/download_keyboard_controllable.ts ***! + \********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.download_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.download_keyboard_controllable = { + id: "download_keyboard_controllable", + context: "dom:a[href],dom:area[href]", + refactor: { + "HAAC_Media_DocumentTrigger2": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "download_keyboard_controllable.html", + "group": "download_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify that the file download mechanism does not cause a keyboard trap", + "group": "File download mechanisms should be keyboard-operable and preserve page focus location" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var href = ruleContext.getAttribute("href"); + var ext = CommonUtil_1.CommonUtil.getFileExt(href); + var passed = ![".docx", ".doc", ".pdf", ".odt"].includes(ext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/draggable_alternative_exists.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/draggable_alternative_exists.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.draggable_alternative_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.draggable_alternative_exists = { + id: "draggable_alternative_exists", + context: "dom:*[draggable]", + dependencies: [], + help: { + "en-US": { + "group": "draggable_alternative_exists.html", + // "pass_alternative": "draggable_alternative_exists.html", + "pass_undraggable": "draggable_alternative_exists.html", + "potential_alternative": "draggable_alternative_exists.html" + } + }, + messages: { + "en-US": { + "group": "A draggable element must have a \"single pointer\" alternative", + // "pass_alternative": "The draggable element \"{0}\" has a \"single pointer\" alternative", + "pass_undraggable": "The element \"{0}\" is not draggable", + "potential_alternative": "Ensure the draggable element \"{0}\" has a \"single pointer\" alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + //ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + if (ruleContext.getAttribute("draggable") === 'true') + return (0, IRule_1.RulePotential)("potential_alternative", [nodeName]); + else if (ruleContext.getAttribute("draggable") === 'false') + return (0, IRule_1.RulePass)("pass_undraggable", [nodeName]); + else + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_accesskey_labelled.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/element_accesskey_labelled.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.element_accesskey_labelled = { + id: "element_accesskey_labelled", + context: "dom:*[accesskey]", + refactor: { + "HAAC_Accesskey_NeedLabel": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_labelled.html", + "Potential_1": "element_accesskey_labelled.html", + "group": "element_accesskey_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "The element with an assigned 'accesskey' attribute does not have an associated label", + "group": "An element with an assigned 'accesskey' attribute must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip if the element is tabbable, it's covered by other rules + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + //skip the native element, mostly text elements + if (!roles || roles.length === 0) + return; + var patterns = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]]; + if (!patterns || !patterns.nameFrom) + return; + // ignore if accessble name is required (checked in other rules) or prohibited (text element) + if (patterns.nameRequired || !patterns.nameFrom || patterns.nameFrom.includes("prohibited")) + return; + //special case: legend, as a child of a fieldset, delegate the accesskey command to the field of the fieldset which is covered by other rules + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'fieldset') + return; + // check if accessible name exists + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair && pair.name && pair.name.trim().length > 0) + //if (ARIAMapper.computeName(ruleContext).trim().length > 0) + return (0, IRule_1.RulePass)("Pass_0"); + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_accesskey_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/element_accesskey_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.element_accesskey_unique = { + id: "element_accesskey_unique", + context: "dom:*[accesskey]", + refactor: { + "WCAG20_Elem_UniqueAccessKey": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_unique.html", + "Fail_1": "element_accesskey_unique.html", + "group": "element_accesskey_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "'accesskey' attribute value on the element is not unique", + "group": "'accesskey' attribute values on each element must be unique for the page" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var map = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "element_accesskey_unique", {}); + var key = ruleContext.getAttribute("accesskey"); + var passed = !(key in map); + map[key] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_attribute_deprecated.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/element_attribute_deprecated.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DEPRECATED_ELEMENTS = [ + /** original */ + "applet", "basefont", "center", "dir", "font", "isindex", "listing", + "plaintext", "spacer", "s", "strike", "u", "xmp", + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "acronym", "frame", "frameset", "noframes", "noembed", "big", "blink", "marquee", "tt", +]; +var DEPRECATED_HTML_GLOBAL_ATTRIBUTES = [ + /** original */ + "align", "link", "archive", "background", "bgcolor", "clear", "code", "color", + "compact", "face", "hspace", "language", "link", "noshade", "nowrap", "object", + "prompt", "start", "text", "version", "vlink", "vspace" +]; +var DEPRECATED_ELEMENT_ATTRIBUTES = { + /** original */ + "td": ["height", "width", "abbr", "axis", "char", "charoff", "height", "nowrap", "valign", "width", "align", "bgcolor"], + "th": ["height", "width", "abbr", "axis", "charoff", "height", "bgcolor", "align", "nowrap", "char", "valign", "width"], + "li": ["type", "value", "type"], + "ul": ["type", "compact"], + "pre": ["width"], + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "meta": ["http-equiv"], + "a": ["charset", "coords", "shape", "rev", "scheme"], + "link": ["rev", "charset", "target"], + "img": ["name", "longdesc", "align", "hspace", "vspace", "border"], + "area": ["nohref"], + "head": ["profile"], + "html": ["version"], + "iframe": ["longdesc", "align", "frameborder", "marginheight", "marginwidth", "scrolling"], + "object": ["archive", "code", "codebase", "codetype", "declare", "standby", "align", "hspace", "vspace", "border"], + "param": ["type", "valuetype"], + "script": ["language"], + "body": ["alink", "background", "bgcolor", "link", "text", "vlink"], + "br": ["clear"], + "caption": ["align"], + "col": ["align", "char", "charoff", "valign", "width"], + "div": ["align"], + "dl": ["compact"], + "hr": ["align", "noshade", "size", "width", "align"], + "h2": ["align"], + "h3": ["align"], + "h4": ["align"], + "h5": ["align"], + "h6": ["align"], + "input": ["align", "usemap"], + "legend": ["align"], + "menu": ["compact"], + "ol": ["compact", "type", "type"], + "p": ["align"], + "table": ["bgcolor", "cellpadding", "cellspacing", "frame", "rules", "width", "align"], + "tbody": ["align", "char", "valign", "charoff"], + "tfoot": ["align", "charoff", "char", "valign"], + "thead": ["char", "charoff", "valign", "align"], + "tr": ["align", "bgcolor", "char", "charoff", "valign"] +}; +function arrayToContextStr(obj, type) { + var str = ""; + for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) { + var prop = obj_1[_i]; + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENTS') + str += 'dom:' + prop; + else if (type === 'HTML_ATTRIBUTES') + str += 'dom:*[' + prop + "]"; + } + return str; +} +function objToContextStr(obj, type) { + var str = ""; + for (var prop in obj) { + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENT_ATTRIBUTES') { + for (var _i = 0, _a = obj[prop]; _i < _a.length; _i++) { + var item = _a[_i]; + if (str !== '' && !str.endsWith(", ")) + str += ", "; + str += 'dom:' + prop + '[' + item + ']'; + } + } + } + return str; +} +exports.element_attribute_deprecated = { + id: "element_attribute_deprecated", + context: "dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]", + help: { + "en-US": { + "pass": "element_attribute_deprecated.html", + "fail_elem": "element_attribute_deprecated.html", + "fail_attr": "element_attribute_deprecated.html", + "fail_elem_attr": "element_attribute_deprecated.html", + "group": "element_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_elem": "The <{0}> element is deprecated in HTML 5", + "fail_attr": "The HTML attribute(s) \"{0}\" is deprecated in HTML 5", + "fail_elem_attr": "The HTML attribute(s) \"{0}\" is deprecated for the <{1}> element in HTML 5", + "group": "Avoid use of obsolete features if possible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // HTMLUnit auto adds a tbody[align=left] to tables if tbody is missing! + if (ruleContext.nodeName.toLowerCase() === "tbody" && ruleContext.hasAttribute("align")) { + return (0, IRule_1.RulePass)("pass"); + } + if (ruleContext.nodeName.includes("-")) { + // This is a webcomponent element, HTML doesn't define what's deprecated + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + var ret = []; + // check if it's a deprecated element + if (DEPRECATED_ELEMENTS.includes(nodeName)) { + return (0, IRule_1.RuleFail)("fail_elem", [nodeName]); + } + // check if it's a deprecated HTML global attribute + var attrs = ruleContext.getAttributeNames(); + var violations = ''; + for (var _i = 0, attrs_1 = attrs; _i < attrs_1.length; _i++) { + var attr = attrs_1[_i]; + if (DEPRECATED_HTML_GLOBAL_ATTRIBUTES.includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_attr", [violations]); + } + // check if it's a deprecated HTML element & attribute + violations = ''; + if (nodeName in DEPRECATED_ELEMENT_ATTRIBUTES) { + for (var _a = 0, attrs_2 = attrs; _a < attrs_2.length; _a++) { + var attr = attrs_2[_a]; + if (DEPRECATED_ELEMENT_ATTRIBUTES[nodeName] && DEPRECATED_ELEMENT_ATTRIBUTES[nodeName].includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_elem_attr", [violations, nodeName]); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_id_unique.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/element_id_unique.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.element_id_unique = { + id: "element_id_unique", + context: "dom:*[id]", + refactor: { + "RPT_Elem_UniqueId": { + "Pass_0": "pass", + "Fail_1": "potential_empty", + "Fail_2": "potential_in_use" + } + }, + help: { + "en-US": { + "group": "element_id_unique.html", + "pass": "element_id_unique.html", + "potential_empty": "element_id_unique.html", + "potential_in_use": "element_id_unique.html" + } + }, + messages: { + "en-US": { + "group": "Element 'id' attribute values must be unique within a document", + "pass": "Rule Passed", + "potential_empty": "The <{0}> element has the id \"{1}\" that is empty", + "potential_in_use": "The <{0}> element has the id \"{1}\" that is already in use" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "3ea0c8": { + "pass": "pass", + "potential_empty": "pass", + "potential_in_use": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("id"); + // In the case that id is empty we should trigger a violation right away with out checking + // for uniqueness. + if (id === "") { + //return new ValidationResult(false, [ruleContext], '', '', [ruleContext.nodeName.toLowerCase(), id]); + return (0, IRule_1.RulePotential)("potential_empty", [ruleContext.nodeName.toLowerCase(), id]); + } + var element = fragment_1.FragmentUtil.getById(ruleContext, id); + var passed = element === ruleContext; + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [ruleContext.nodeName.toLowerCase(), id]); + if (!passed) { + return (0, IRule_1.RulePotential)("potential_in_use", [ruleContext.nodeName.toLowerCase(), id]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_lang_valid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/element_lang_valid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_lang_valid = exports.html_lang_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var validateLang = function (context) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (ruleContext.hasAttribute("lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 1; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 2; + } + } + } + if (ruleContext.hasAttribute("xml:lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("xml:lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("xml:lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 3; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 4; + } + } + } + return 0; +}; +exports.html_lang_valid = { + id: "html_lang_valid", + context: "dom:html[lang], dom:html[xml:lang]", + help: { + "en-US": { + "Pass_0": "html_lang_valid.html", + "Fail_1": "html_lang_valid.html", + "Fail_2": "html_lang_valid.html", + "Fail_3": "html_lang_valid.html", + "Fail_4": "html_lang_valid.html", + "group": "html_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The default human language of the page must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + }, + "bf051a": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "fail", + "Fail_4": "inapplicable" + }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + // "de46e4": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // } + }], + run: function (context, options, contextHierarchies) { + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + return retArr[reasonCode]; + } +}; +exports.element_lang_valid = { + id: "element_lang_valid", + context: "dom:*[lang], dom:*[xml:lang]", + help: { + "en-US": { + "Pass_0": "element_lang_valid.html", + "Fail_1": "element_lang_valid.html", + "Fail_2": "element_lang_valid.html", + "Fail_3": "element_lang_valid.html", + "Fail_4": "element_lang_valid.html", + "group": "element_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The change in language of specific content must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + // "b5c3f8": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "inapplicable", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // }, + // "bf051a": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "fail", + // "Fail_4": "inapplicable" + // }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + "de46e4": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // If it's the HTML node, that's handled by html_lang_valid + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "html") + return null; + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + var retVal = retArr[reasonCode]; + if (retVal.value[1] !== IRule_1.eRuleConfidence.PASS) { + // Ensure that there's actually content of this element - skip subtrees that have other lang attributes + var hasContent = false; + if (ruleContext.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(ruleContext, false, ruleContext, true); + while (!hasContent && nw.nextNode()) { + // Skip hidden + if (nw.node.nodeType === 1) { + var element = nw.node; + if (!VisUtil_1.VisUtil.isNodeVisible(element) || element.hasAttribute("lang")) { + nw.bEndTag = true; + } + else { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(element); + hasContent = hasContent + || element.nodeName.toLowerCase() === "img" && (pair && pair.name && pair.name.trim().length > 0) /**ARIAMapper.computeName(element).trim().length > 0*/; + } + } + else { + hasContent = hasContent + || nw.node.nodeType === 3 && nw.node.nodeValue.trim().length > 0; + } + } + } + if (!hasContent) + return null; + } + return retVal; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_mouseevent_keyboard.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_mouseevent_keyboard.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_mouseevent_keyboard = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.element_mouseevent_keyboard = { + id: "element_mouseevent_keyboard", + context: "dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]", + refactor: { + "RPT_Elem_EventMouseAndKey": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_mouseevent_keyboard.html", + "Manual_1": "element_mouseevent_keyboard.html", + "group": "element_mouseevent_keyboard.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)", + "group": "All interactive content with mouse event handlers must have equivalent keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = ruleContext.hasAttribute("href") || + (!ruleContext.hasAttribute("ondblclick") && + !ruleContext.hasAttribute("onmousemove") && + (!ruleContext.hasAttribute("onmousedown") || ruleContext.hasAttribute("onkeydown")) && + (!ruleContext.hasAttribute("onmouseup") || ruleContext.hasAttribute("onkeyup")) && + (!ruleContext.hasAttribute("onmouseover") || ruleContext.hasAttribute("onfocus")) && + (!ruleContext.hasAttribute("onmouseout") || ruleContext.hasAttribute("onblur")) && + (!ruleContext.hasAttribute("onclick") || ruleContext.hasAttribute("onkeypress") || + nodeName == "a" || nodeName == "button")); + var failedMouseEvents = new Array(); + if (!passed) { + //store and display event name and node name in the tokens + if (ruleContext.hasAttribute("ondblclick")) { + failedMouseEvents.push("ondblclick"); + } + if (ruleContext.hasAttribute("onmousemove")) { + failedMouseEvents.push("onmousemove"); + } + if (ruleContext.hasAttribute("onmousedown") && !ruleContext.hasAttribute("onkeydown")) { + failedMouseEvents.push("onmousedown"); + } + if (ruleContext.hasAttribute("onmouseup") && !ruleContext.hasAttribute("onkeyup")) { + failedMouseEvents.push("onmouseup"); + } + if (ruleContext.hasAttribute("onmouseover") && !ruleContext.hasAttribute("onfocus")) { + failedMouseEvents.push("onmouseover"); + } + if (ruleContext.hasAttribute("onmouseout") && !ruleContext.hasAttribute("onblur")) { + failedMouseEvents.push("onmouseout"); + } + if (ruleContext.hasAttribute("onclick") && !ruleContext.hasAttribute("onkeypress")) { + if (!(nodeName == "a" || nodeName == "button")) + failedMouseEvents.push("onclick"); + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1", [nodeName, failedMouseEvents.join(", ")]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_orientation_unlocked.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/element_orientation_unlocked.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_orientation_unlocked = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.element_orientation_unlocked = { + id: "element_orientation_unlocked", + context: "dom:*", + help: { + "en-US": { + "pass": "element_orientation_unlocked.html", + "fail_locked": "element_orientation_unlocked.html", + "group": "element_orientation_unlocked.html" + } + }, + messages: { + "en-US": { + "pass": "The element is not restricted to either landscape or portrait orientation using CSS transform property", + "fail_locked": "The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property", + "group": "Elements should not be restricted to either landscape or portrait orientation using CSS transform property" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ['b33eff'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip invisible element + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "meta", "title"])) + return null; + // Skip elements that have no meaningful visible content (no text, no img with alt). + // Orientation lock on a purely decorative or empty element is not a WCAG violation + // because there is no content whose orientation matters to the user. + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // cache the orientation result for all the elements in the page + var doc = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var orientationTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", null); + if (!orientationTransforms) { + orientationTransforms = CSSUtil_1.CSSUtil.getMediaOrientationTransform(doc); + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", orientationTransforms); + } + // find if the element matches orientation selector(s) + var media_transforms = []; + Object.keys(orientationTransforms).forEach(function (key) { + Object.keys(orientationTransforms[key]).forEach(function (tag) { + if (Object.keys(orientationTransforms[key][tag]).length > 0 && CSSUtil_1.CSSUtil.selectorMatchesElem(ruleContext, tag)) { + if (orientationTransforms[key][tag].transform) + media_transforms.push(orientationTransforms[key][tag].transform); + else + media_transforms.push(orientationTransforms[key][tag]); + } + }); + }); + // no match, the element is not in media orientation transform + if (media_transforms.length === 0) + return null; + var ret = []; + var _loop_1 = function (i) { + var media_transform = media_transforms[i]; + if (typeof media_transform === 'object') + for (var key in media_transform) + media_transform = key + "(" + media_transform[key] + ")"; + var containsRotation = false; + ['rotate', 'rotate3d', 'rotateZ', 'matrix', 'matrix3d'].forEach(function (rotation) { + if (media_transform.includes(rotation)) + containsRotation = true; + }); + // no rotation transform, skip + if (!containsRotation) + return "continue"; + var degree = CSSUtil_1.CSSUtil.getRotationDegree(media_transform); + // no or 360n degree rotation + if (degree === 0) { + ret.push((0, IRule_1.RulePass)("pass")); + return "continue"; + } + /** + * calculate the original page rotation transformation, example + * html { transform: rotate(2.5deg); } + */ + var definedStyle = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["transform"]); + /** + * compensate the media orientation with the page orientation + */ + if (definedStyle['transform']) { + var page_degree = CSSUtil_1.CSSUtil.getRotationDegree(definedStyle['transform']); + // rotate is additive + degree += page_degree; + } + // 180° rotation is a vertical flip — it does not swap portrait and landscape, + // so it does not lock orientation in the WCAG 1.3.4 sense. + // 360° (full turn) is also not a lock (already normalised to 0 above). + // Allow 1° floating-point tolerance around both 0° and 180°. + var normalised = degree % 180; + if (normalised <= 1 || normalised >= 179) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_locked", [nodeName])); + }; + for (var i = 0; i < media_transforms.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_scrollable_tabbable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_scrollable_tabbable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_scrollable_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.element_scrollable_tabbable = { + id: "element_scrollable_tabbable", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_scrollable_tabbable.html", + "pass_tabbable": "element_scrollable_tabbable.html", + "pass_interactive": "element_scrollable_tabbable.html", + "fail_scrollable": "element_scrollable_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Scrollable elements should be tabbable or contain tabbable content", + "pass_tabbable": "The scrollable element is tabbable", + "pass_interactive": "The scrollable element has tabbable content", + "fail_scrollable": "The scrollable element <{0}> with non-interactive content is not tabbable" + } + }, + /** + * deprecated on 6/10/2025 due to Browser support for auto-focus of a scrollable element + * rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: eRulePolicy.VIOLATION, + toolkitLevel: eToolkitLevel.LEVEL_ONE + }],*/ + rulesets: [], + act: ["0ssw9k"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["iframe", "svg", "script", "meta", "style"])) + return null; + //skip if no visible content + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + // ignore if the element's navigation is controlled or owned by another element + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is not scrollable or content withouting needing a scroll + if (!VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // pass if element is tabbable + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RulePass)("pass_tabbable"); + // check if element content is tabbable + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RulePass)("pass_interactive"); + // ignore in Firefox if no tabindex at all (not tested in embedded or any simulator) + if (!ruleContext.hasAttribute("tabindex") && navigator.userAgent.indexOf("Firefox") > -1) + return null; + return (0, IRule_1.RuleFail)("fail_scrollable", [ruleContext.nodeName.toLowerCase()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_role_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_role_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.element_tabbable_role_valid = { + id: "element_tabbable_role_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "element_tabbable_role_valid.html", + "fail_invalid_role": "element_tabbable_role_valid.html", + "fail_no_valid_role": "element_tabbable_role_valid.html", + "group": "element_tabbable_role_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The tabbable element has a widget role", + "fail_invalid_role": "The tabbable element's role '{0}' is not a widget role", + "fail_no_valid_role": "The tabbable element does not have a valid widget role", + "group": "A tabbable element must have a valid widget role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // if the element is tabbable by default with or without tabindex, let the other rules (such as widget_tabbable_single) to handle it + if (nodeName in CommonUtil_1.CommonUtil.tabTagMap) { + var value = CommonUtil_1.CommonUtil.tabTagMap[nodeName]; + if (typeof (value) === "function") { + value = value(ruleContext); + } + if (value) + return null; + } + // handle the case: no tabindex or tabindex < 0 + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) < 0) + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is scrollable + if (VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // elements whose roles allow no descendants that are interactive or with a tabindex >= 0 + // this case should be handled in widget_tabbable_single and aria_child_tabbable + var roles_no_interactive_child = ["button", "checkbox", "img", "link", "menuitem", "menuitemcheckbox", "menuitemradio", + "option", "radio", "switch", "tab"]; + var parent = DOMWalker_1.DOMWalker.parentNode(ruleContext); + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent); + // ignore if the parent role is in roles_no_interactive_child + if (roles_no_interactive_child.includes(parent_role)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return (0, IRule_1.RuleFail)("fail_no_valid_role"); + // ignore 'application' role that contains one or more focusable elements that do not follow a standard interaction pattern supported by a widget role:https://www.w3.org/TR/2023/PR-WAI-ARIA-1.2-20230328/#application + if (role === "application") + return null; + // handle the case: tabindex >= 0 to examine whether a widget role is setup or not + // pass if one of the roles is a widget type + // Row is weird. It's structure, but can also be widget + // Focusable separators are widgets + if (role === "row" || role === "separator" || ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return (0, IRule_1.RulePass)("pass"); + } + return (0, IRule_1.RuleFail)("fail_invalid_role", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_unobscured.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_unobscured.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_unobscured = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +exports.element_tabbable_unobscured = { + id: "element_tabbable_unobscured", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_unobscured.html", + "pass": "element_tabbable_unobscured.html", + "potential_obscured": "element_tabbable_unobscured.html" + } + }, + messages: { + "en-US": { + "group": "When an element receives focus, it is not entirely covered by other content", + "pass": "The element is not entirely covered by other content", + "potential_obscured": "Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.4.11"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Early exit: check visibility and tabbability first + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // Early exit: ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return null; + var win = doc.defaultView; + if (!win) + return null; + // Reuse single DOMMapper instance + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + // Early exit: bounds not available or element has no dimensions + if (!bounds || bounds.height === 0 || bounds.width === 0) + return null; + var cStyle = win.getComputedStyle(ruleContext); + if (!cStyle) + return null; + // Parse z-index once and cache + var zindex = parseInt(cStyle.zIndex === 'auto' || !cStyle.zIndex ? '0' : cStyle.zIndex); + // More specific selector to reduce iteration + var elems = doc.querySelectorAll('body *:not(script):not(style):not(meta):not(link)'); + if (!elems || elems.length === 0) + return null; + var before = true; + var boundsRight = bounds.left + bounds.width; + var boundsBottom = bounds.top + bounds.height; + // Check for obscuring elements + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + /** + * The nodes returned from querySelectorAll are in document order. + * If two elements overlap and z-index are not defined, then the node + * rendered earlier will be overlaid by the node rendered later. + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + // The next node in elems will be after the target node (ruleContext) + before = false; + continue; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // Skip if element contains ruleContext or is not visible + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || !VisUtil_1.VisUtil.isNodeVisible(elem)) + continue; + var bnds = mapper.getUnadjustedBounds(elem); + // Skip if no bounds or zero dimensions + if (!bnds || bnds.height === 0 || bnds.width === 0) + continue; + // Quick bounds check: does elem completely cover ruleContext? + if (bnds.top > bounds.top || bnds.left > bounds.left) + continue; + var bndsRight = bnds.left + bnds.width; + var bndsBottom = bnds.top + bnds.height; + if (bndsRight < boundsRight || bndsBottom < boundsBottom) + continue; + // Check z-index to determine if elem obscures ruleContext + var zStyle = win.getComputedStyle(elem); + if (!zStyle) + continue; + var elemZindex = parseInt(zStyle.zIndex === 'auto' || !zStyle.zIndex || isNaN(Number(zStyle.zIndex)) ? '0' : zStyle.zIndex); + // If before ruleContext in DOM order, elem must have higher z-index to obscure + // If after ruleContext in DOM order, elem can obscure with equal or higher z-index + if ((before && elemZindex > zindex) || (!before && elemZindex >= zindex)) { + // Check if element has opaque background + var hasOpaqueBackground = false; + if (zStyle.background && zStyle.background !== 'none') { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.background); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + if (!hasOpaqueBackground && zStyle.backgroundColor) { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.backgroundColor); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + // If element has no content and no opaque background, skip it + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(elem) && !hasOpaqueBackground) { + continue; + } + return (0, IRule_1.RulePotential)("potential_obscured", []); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_visible.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/element_tabbable_visible.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.element_tabbable_visible = { + id: "element_tabbable_visible", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_visible.html", + "pass": "element_tabbable_visible.html", + "potential_visible": "element_tabbable_visible.html" + } + }, + messages: { + "en-US": { + "group": "A tabbable element should be visible on the screen when it has keyboard focus", + "pass": "The tabbable element is visible on the screen", + "potential_visible": "Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.4.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // Get all needed styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, ["position", "clip"], ["", ":focus"]); + var defined_styles = allStyles[""]; + var onfocus_styles = allStyles[":focus"]; + if (bounds['height'] === 0 || bounds['width'] === 0) + return (0, IRule_1.RulePotential)("potential_visible", []); + if (defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)' + && !onfocus_styles['clip']) { + /** + * note that A user can select a checkbox and radio button by selecting the button or the label text. + * When a checkbox or radio button is clipped to 0 size, it is still available to a keyboard or a screen reader. + * The rule should be passed if the label text exists and the button on-focus style is defined by the user, + * which likely incurs the changes of the label style. + */ + if (nodeName === 'input' && (ruleContext.getAttribute('type') === 'checkbox' || ruleContext.getAttribute('type') === 'radio')) { + var label = CommonUtil_1.CommonUtil.getLabelForElement(ruleContext); + if (label && !CommonUtil_1.CommonUtil.isInnerTextEmpty(label)) { + // Get additional pseudo-class styles (reuse onfocus_styles from line 60) + var pseudoStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, [":focus-visible", ":focus-within", ":checked", ":focus"]); + var focus_visible_styles = pseudoStyles[":focus-visible"]; + var focus_within_styles = pseudoStyles[":focus-within"]; + var checked_styles = pseudoStyles[":checked"]; + var onfocus_styles_1 = pseudoStyles[":focus"]; + if (onfocus_styles_1 || focus_visible_styles || focus_within_styles || checked_styles) + return (0, IRule_1.RulePass)("pass"); + } + } + return (0, IRule_1.RulePotential)("potential_visible", []); + } + if (bounds['top'] >= 0 && bounds['left'] >= 0) + return (0, IRule_1.RulePass)("pass"); + var default_styles = getComputedStyle(ruleContext); + var top = bounds['top']; + var left = bounds['left']; + if (Object.keys(onfocus_styles).length === 0) { + // no onfocus position change, but could be changed from js + return (0, IRule_1.RulePotential)("potential_visible", []); + } + else { + // with onfocus position change + var positions = ['absolute', 'fixed']; + if (typeof onfocus_styles['top'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + top = onfocus_styles['top'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + top = Number.MIN_VALUE; + } + } + if (typeof onfocus_styles['left'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + left = onfocus_styles['left'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + left = Number.MIN_VALUE; + } + } + } + if (top >= 0 && left >= 0) + return (0, IRule_1.RulePass)("pass"); + else + return (0, IRule_1.RulePotential)("potential_visible", []); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/embed_alt_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/embed_alt_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.embed_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.embed_alt_exists = { + id: "embed_alt_exists", + context: "dom:embed", + refactor: { + "RPT_Embed_HasAlt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "embed_alt_exists.html", + "Potential_1": "embed_alt_exists.html", + "group": "embed_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the <embed> element has alternative content", + "group": "Provide alternative content for <embed> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt"); + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/emoticons_alt_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/emoticons_alt_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.emoticons_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.emoticons_alt_exists = { + id: "emoticons_alt_exists", + context: "dom:*", + refactor: { + "WCAG20_Text_Emoticons": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "emoticons_alt_exists.html", + "Potential_1": "emoticons_alt_exists.html", + "group": "emoticons_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that emoticons have a text alternative", + "group": "Emoticons must have a short text alternative that describes their purpose" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_TWO + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + emoticons: { + value: [":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":D", "C:", + ":-D", ":D", "8D", "XD", "=D", "=3", "<=3", "<=8", "--!--", ":-(", ":(", ":c", ":<", ":[", + "D:", "D8", "D;", "D=", "DX", "v.v", ":-9", ";-)", ";)", "*)", ";]", ";D", ":-P", ":P", + ":-p", ":p", "=p", ":-Þ", ":Þ", ":-b", ":b", ":-O", ":O", "O_O", "o_o", "8O", "OwO", "O-O", + "0_o", "O_o", "O3O", "o0o ;o_o;", "o...o", "0w0", ":-/", ":/", ":\\", "=/", "=\\", ":S", ":|", + "d:-)", "qB-)", ":)~", ":-)>....", ":-X", ":X", ":-#", ":#", "O:-)", "0:3", "O:)", ":'(", ";*(", + "T_T", "TT_TT", "T.T", ":-*", ":*", "^o)", ">:)", ">;)", ">:-)", "B)", "B-)", "8)", "8-)", + "^>.>^", "^<.<^", "^>_>^", "^<_<^", "D:<", ">:(", "D-:<", ">:-(", ":-@[1]", ";(", "`_´", "D<", + "<3", "<333", "=^_^=", "=>.>=", "=<_<=", "=>.<=", "\\,,/", "\\m/", "\\m/\\>.</\\m/", "\\o/", "\\o o/", + "o/\\o", ":&", ":u" + ], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + var emoticons = validateParams.emoticons.value; + var passed = true; + var testText = ""; + var walkNode = ruleContext.firstChild; + while (walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + testText += " " + walkNode.nodeValue; + } + walkNode = walkNode.nextSibling; + } + if (testText.trim().length > 0) { + for (var j = 0; passed && j < emoticons.length; ++j) { + var emotIdx = testText.indexOf(emoticons[j]); + var eLngth = emoticons[j].length; + while (passed && emotIdx != -1) { + // Passes if: the emoticon is not preceded by whitespace, + // or the emoticon is not followed by whitespace unless it's punctuation, + // or it's in a pre, code, or script + passed = + (emotIdx > 0 && !/\s/.test(testText.substring(emotIdx - 1, emotIdx))) || + (emotIdx < testText.length - eLngth && !/\s/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)) && + !/[.,!'"?]/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1))); + // Allow usage of (: stuff :) since this is a comment in some languages + passed = passed || ((emoticons[j] == ":)" || emoticons[j] == "(:") && /\(\:.*\:\)/.test(testText)); + passed = passed || ((emoticons[j] == ";)" || emoticons[j] == "(;") && /\(\;.*\;\)/.test(testText)); + emotIdx = testText.indexOf(emoticons[j], emotIdx + 1); + } + } + } + if (!passed) { + // Don't trigger if we're not in the body or if we're in a script, pre, code + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "body"]); + passed = checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body"; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/error_message_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/error_message_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.error_message_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.error_message_exists = { + id: "error_message_exists", + context: "dom:*[aria-invalid=true]", + refactor: { + "HAAC_Aria_ErrorMessage": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "error_message_exists.html", + "Fail_1": "error_message_exists.html", + "Fail_2": "error_message_exists.html", + "group": "error_message_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Custom error message has invalid reference 'id' value", + "Fail_2": "Custom error message is not visible", + "group": "A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aria_errMsgId = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-errormessage"); + // If aria-errormessage is not provided, then OUT_OF_SCOPE + if (!aria_errMsgId) { + return null; + } + var msg_ele = fragment_1.FragmentUtil.getById(ruleContext, aria_errMsgId); + // POF0: Invalid id reference + if (!msg_ele) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + // POF1: Referenced element is not visible + if (!VisUtil_1.VisUtil.isNodeVisible(msg_ele)) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/fieldset_label_valid.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/fieldset_label_valid.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_label_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.fieldset_label_valid = { + id: "fieldset_label_valid", + context: "aria:group", + refactor: { + "group_withInputs_hasName": { + "Pass_1": "Pass_1", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_1": "fieldset_label_valid.html", + "Fail_1": "fieldset_label_valid.html", + "Fail_2": "fieldset_label_valid.html", + "group": "fieldset_label_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1": "Group/Fieldset \"{0}\" with an input has a unique name", + "Fail_1": "Group/Fieldset does not have an accessible name", + "Fail_2": "Group/Fieldset \"{0}\" has a duplicate name to another group", + "group": "Groups with nested inputs must have unique accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "landmark_group_input", null); + if (!formCache) { + formCache = { + groupsWithInputs: [], + groupsWithInputsComputedLabels: [], + }; + var allGroupsTemp = ownerDocument.querySelectorAll('fieldset,[role="group"]'); + var allGroups = Array.from(allGroupsTemp); + var groupsWithInputs = []; + for (var i = 0; i < allGroups.length; i++) { + // Loop over all the group nodes + if (allGroups[i].querySelector("input")) { + groupsWithInputs.push(allGroups[i]); + } + } + var groupsWithInputsComputedLabels = []; + for (var i = 0; i < groupsWithInputs.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(groupsWithInputs[i]); + // Loop over all the landmark nodes + groupsWithInputsComputedLabels.push( + /**ARIAMapper.computeName(groupsWithInputs[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + formCache.groupsWithInputs = groupsWithInputs; + formCache.groupsWithInputsComputedLabels = + groupsWithInputsComputedLabels; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "landmark_group_input", formCache); + } + // formCache.groupsWithInputs.forEach(element => { + // console.log("formCache.groupsWithInputs: " +element.id) + // }); + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels) + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels.length) + var ruleContextFoundIngroupsWithInputsFlag = false; + var computedName = ""; + if (!formCache.groupsWithInputs) { + // We do not have any groups with inputs. Therefore we should skip this rule trigger. + return null; + } + for (var i = 0; i < formCache.groupsWithInputs.length; i++) { + if (ruleContext.isSameNode(formCache.groupsWithInputs[i])) { + // We have found our ruleContext in the cache + ruleContextFoundIngroupsWithInputsFlag = true; + if (formCache.groupsWithInputsComputedLabels[i] === "" || + formCache.groupsWithInputsComputedLabels[i] === null) { + // console.log("Fail_1") + return (0, IRule_1.RuleFail)("Fail_1"); + } + var foundSameNameFlag = false; + for (var j = 0; j < formCache.groupsWithInputsComputedLabels.length; j++) { + if (i == j) { + continue; + } // We do not want to compare against ourselfs + if (formCache.groupsWithInputsComputedLabels[i] === + formCache.groupsWithInputsComputedLabels[j]) { + foundSameNameFlag = true; + } + } + if (foundSameNameFlag) { + // console.log("Fail_2") + return (0, IRule_1.RuleFail)("Fail_2", [ + formCache.groupsWithInputsComputedLabels[i], + ]); + } + computedName = formCache.groupsWithInputsComputedLabels[i]; + } + } + if (!ruleContextFoundIngroupsWithInputsFlag) { + // console.log("null return") + return null; + } + // console.log("Pass_1") + return (0, IRule_1.RulePass)("Pass_1", [computedName]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/fieldset_legend_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/fieldset_legend_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_legend_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.fieldset_legend_valid = { + id: "fieldset_legend_valid", + context: "dom:fieldset", + refactor: { + "WCAG20_Fieldset_HasLegend": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "fieldset_legend_valid.html", + "Fail_1": "fieldset_legend_valid.html", + "Fail_2": "fieldset_legend_valid.html", + "Fail_3": "fieldset_legend_valid.html", + "group": "fieldset_legend_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<fieldset> element does not have a <legend>", + "Fail_2": "<fieldset> element has more than one <legend>", + "Fail_3": "<fieldset> element <legend> is empty", + "group": " <fieldset> elements should have a single, non-empty <legend> as a label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // In the case a legend is hidden, we should still trigger a violations for this + var legends = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "legend", true, false); + if (legends.length === 0) { + // Fieldset has NO Legend + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (legends.length > 1) { + // Fieldset has more than one legend + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (CommonUtil_1.CommonUtil.getInnerText(legends[0]).trim().length === 0) { + // Fieldset has legend but legend is empty + return (0, IRule_1.RuleFail)("Fail_3"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/figure_label_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/figure_label_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.figure_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.figure_label_exists = { + id: "figure_label_exists", + context: "dom:figure", + refactor: { + "HAAC_Figure_label": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "figure_label_exists.html", + "Fail_1": "figure_label_exists.html", + "group": "figure_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <figure> element does not have an associated label", + "group": "A <figure> element must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + //let passed = AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", []); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_font_color.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/form_font_color.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_font_color = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_font_color = { + id: "form_font_color", + context: "dom:form", + refactor: { + "RPT_Font_ColorInForm": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_font_color.html", + "Potential_1": "form_font_color.html", + "group": "form_font_color.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Check color is not used as the only visual means to convey which fields are required", + "group": "Combine color and descriptive markup to indicate required form fields" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var fonts = ruleContext.getElementsByTagName("font"); + if (fonts != null) { + for (var i = 0; i < fonts.length; ++i) { + passed = !fonts[i].hasAttribute("color"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_interaction_review.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/form_interaction_review.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_interaction_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.form_interaction_review = { + id: "form_interaction_review", + context: "dom:form[target]", + refactor: { + "WCAG20_Form_TargetAndText": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_interaction_review.html", + "Potential_1": "form_interaction_review.html", + "group": "form_interaction_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that interacting with content will not open pop-up windows or change the active window without informing the user", + "group": "User should be informed in advance when interacting with content causes a change of context" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramWinText: { + value: ["new window"], + type: "array" + } + }; + var ruleContext = context["dom"].node; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr === "_parent" || tStr === "_self" || tStr === "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + for (var i = 0; !passed && i < validateParams.paramWinText.value.length; ++i) + if (textStr.indexOf(validateParams.paramWinText.value[i]) != -1) + passed = true; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_label_unique.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/form_label_unique.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.form_label_unique = { + id: "form_label_unique", + context: "dom:label[for]", + refactor: { + "RPT_Label_UniqueFor": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_label_unique.html", + "Fail_1": "form_label_unique.html", + "group": "form_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control has more than one label", + "group": "Form controls should have exactly one label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + var labelIds = CacheUtil_1.CacheUtil.getCache(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "RPT_Label_Single", {}); + var id = ruleContext.getAttribute("for"); + var passed = !(id in labelIds); + labelIds[id] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_submit_button_exists.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/form_submit_button_exists.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_button_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.form_submit_button_exists = { + id: "form_submit_button_exists", + context: "dom:form", + refactor: { + "WCAG20_Form_HasSubmit": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_button_exists.html", + "Potential_1": "form_submit_button_exists.html", + "group": "form_submit_button_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the <form> element has a submit button or an image button", + "group": "A <form> element should have a submit button or an image button" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + if (ruleContext.firstChild) { + // submit buttons are usually at the bottom - walk backwards + var nw = new DOMWalker_1.DOMWalker(ruleContext, true); + while (!passed && nw.prevNode() && nw.node != ruleContext) { + if (!nw.bEndTag) { + var nodeName = nw.node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = nw.elem().getAttribute("type"); + if (type) { + type = type.toLowerCase(); + } + passed = type === "submit" || type === "image"; + } + else if (nodeName === "button") { + passed = nw.elem().hasAttribute("type") && nw.elem().getAttribute("type").toLowerCase() === "submit"; + } + else if (nw.node.nodeType === 1) { + passed = AriaUtil_1.AriaUtil.hasRole(nw.node, "button"); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_submit_review.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/form_submit_review.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_submit_review = { + id: "form_submit_review", + context: "dom:select[onchange], dom:input[onchange]", + refactor: { + "RPT_Form_ChangeEmpty": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_review.html", + "Potential_1": "form_submit_review.html", + "group": "form_submit_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Confirm the form does not submit automatically without warning", + "group": "A form should not be submitted automatically without warning the user" + } + }, + /** + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + //deprecate the rule on Jun 10, 2024 + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onchange").trim().length === 0; + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/frame_src_valid.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/frame_src_valid.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_src_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.frame_src_valid = { + id: "frame_src_valid", + context: "dom:frame, dom:iframe", + refactor: { + "Valerie_Frame_SrcHtml": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "frame_src_valid.html", + "Potential_1": "frame_src_valid.html", + "group": "frame_src_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify <frame> content is accessible", + "group": "A <frame> containing non-HTML content must be made accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "src") && + CommonUtil_1.CommonUtil.isHtmlExt(CommonUtil_1.CommonUtil.getFileExt(ruleContext.getAttribute("src"))); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/frame_title_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/frame_title_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.frame_title_exists = { + id: "frame_title_exists", + context: "dom:frame, dom:iframe", + refactor: { + "WCAG20_Frame_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "frame_title_exists.html", + "Pass_0": "frame_title_exists.html", + "Fail_1": "frame_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "Inline frames must have a unique, non-empty 'title' attribute", + "Pass_0": "Rule Passed", + "Fail_1": "Inline frame does not have a 'title' attribute", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: "cae760", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) { + //if (CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/heading_content_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/heading_content_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_content_exists = { + id: "heading_content_exists", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + refactor: { + "RPT_Header_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_content_exists.html", + "Fail_1": "heading_content_exists.html", + "group": "heading_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Heading element has descriptive text", + "Fail_1": "Heading element has no descriptive content", + "group": "Heading elements must provide descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.6"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/heading_markup_misuse.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/heading_markup_misuse.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_markup_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_markup_misuse = { + id: "heading_markup_misuse", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + dependencies: ["heading_content_exists"], + refactor: { + "RPT_Headers_FewWords": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_markup_misuse.html", + "Potential_1": "heading_markup_misuse.html", + "group": "heading_markup_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the heading element is a genuine heading", + "group": "Heading elements must not be used for presentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + headingLengthThresh: { + value: 20, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + var headingLengthThresh = validateParams.headingLengthThresh.value; + var passed = CommonUtil_1.CommonUtil.wordCount(CommonUtil_1.CommonUtil.getInnerText(ruleContext)) <= headingLengthThresh; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/html_lang_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/html_lang_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_lang_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +exports.html_lang_exists = { + id: "html_lang_exists", + context: "dom:html", + refactor: { + "WCAG20_Html_HasLang": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3", + "Fail_4": "Fail_4", + "Fail_5": "Fail_5", + "Potential_5": "Potential_5", + "Potential_6": "Potential_6" + } + }, + help: { + "en-US": { + "group": "html_lang_exists.html", + "Pass_0": "html_lang_exists.html", + "Fail_1": "html_lang_exists.html", + "Fail_2": "html_lang_exists.html", + "Fail_3": "html_lang_exists.html", + "Fail_4": "html_lang_exists.html", + "Fail_5": "html_lang_exists.html", + "Potential_5": "html_lang_exists.html", + "Potential_6": "html_lang_exists.html" + } + }, + messages: { + "en-US": { + "group": "Page must identify the default language of the document with a 'lang' attribute", + "Pass_0": "Page language detected as \"{0}\"", + "Fail_1": "Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes", + "Fail_2": "Page detected as XHTML, but does not have an 'xml:lang' attribute", + "Fail_3": "Page detected as HTML, but does not have a 'lang' attribute", + "Fail_4": "Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"", + "Fail_5": "Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"", + "Potential_5": "Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type", + "Potential_6": "Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "fail", + "Fail_4": "inapplicable", + "Fail_5": "inapplicable", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + }, + "5b7ae0": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "fail", + "Fail_5": "pass", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + var doctypeString = ruleContext.ownerDocument.doctype ? ruleContext.ownerDocument.doctype.publicId : ""; + if (!doctypeString) + doctypeString = ""; + var lang = ruleContext.getAttribute("lang"); + var langXML = ruleContext.getAttribute("xml:lang"); + if (doctypeString.includes('XHTML') && !doctypeString.includes("1.0")) { + if (!langXML) { + // XHTML != 1.0 (must have xml:lang + return (0, IRule_1.RuleFail)("Fail_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [langXML]); + } + } + else if (doctypeString.includes('XHTML') && doctypeString.includes("1.0")) { + // Handle XHTML 1.0 + // If neither is provided, it's a failure + if (!lang && !langXML) { + // XHTML and no lang + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (lang && langXML) { + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else if (lang) { + // XHTML and only lang (okay if only delivered via text/html) + return (0, IRule_1.RulePotential)("Potential_5"); + } + else { + // XHTML and only xml:lang (okay if only delivered via xml mime type) + return (0, IRule_1.RulePotential)("Potential_6"); + } + } + else { + if (!lang) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else if (lang && langXML) { + // HTML5 polyglot documents + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else { + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/html_skipnav_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/html_skipnav_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_skipnav_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.html_skipnav_exists = { + id: "html_skipnav_exists", + context: "dom:html", + refactor: { + "RPT_Html_SkipNav": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "html_skipnav_exists.html", + "Pass_0": "html_skipnav_exists.html", + "Potential_1": "html_skipnav_exists.html" + } + }, + messages: { + "en-US": { + "group": "Provide a way to bypass blocks of content that are repeated on multiple Web pages", + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a way to bypass blocks of content that are repeated on multiple Web pages" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var frames = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "frame"); + var headers = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "h1"); + if ((frames != null && frames.length > 0) || (headers != null && headers.length > 0)) { + // If frames or headings are used, pass + passed = true; + } + else { + // Look for skip anchors + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + var targets = {}; + for (var idx = 0; !passed && idx < anchors.length; ++idx) { + if (anchors[idx].hasAttribute("href")) { + var href = anchors[idx].href; + if (typeof href !== typeof "") { + if (href.baseVal) { + href = href.baseVal; + } + else { + href = ""; + } + } + var tmpLocation = void 0; + if (typeof (ruleContext.ownerDocument.locationFromDAP) != "undefined" && ruleContext.ownerDocument.locationFromDAP != null) { // DAP sets it + tmpLocation = ruleContext.ownerDocument.locationFromDAP; + } + else { // server scan has the location object + tmpLocation = ruleContext.ownerDocument.location; + } + var docHref = ""; + if (tmpLocation) { + docHref = tmpLocation.href; + } + // Fix weird bugs with how various parsers report on file: url's: + if (href.startsWith("file:///")) + href = "file:/" + href.substring("file:///".length); + if (docHref.startsWith("file:///")) + docHref = "file:/" + docHref.substring("file:///".length); + if (href.charAt(0) == "#" || href.startsWith(docHref + "#")) { + var target = CommonUtil_1.CommonUtil.getFileAnchor(href); + if (fragment_1.FragmentUtil.getById(ruleContext, target) != null) + passed = true; + else + targets[target] = true; + } + } + else if (anchors[idx].hasAttribute("name")) { + // Assume forward jumping targets + var name_1 = anchors[idx].getAttribute("name"); + if (name_1.indexOf("#") != -1) + name_1 = CommonUtil_1.CommonUtil.getFileAnchor(name_1); + passed = name_1 in targets; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/iframe_interactive_tabbable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/iframe_interactive_tabbable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.iframe_interactive_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.iframe_interactive_tabbable = { + id: "iframe_interactive_tabbable", + context: "dom:iframe", + dependencies: [], + help: { + "en-US": { + "group": "iframe_interactive_tabbable.html", + "pass": "iframe_interactive_tabbable.html", + "fail_invalid": "iframe_interactive_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Iframe with interactive content should not be excluded from tab order using tabindex", + "pass": "The iframe with interactive content is not excluded from the tab order using tabindex", + "fail_invalid": "The <iframe> with interactive content is excluded from tab order using tabindex" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["akn7bn"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // ignore if iframe is too small to be visible on screen + if (Math.max(bounds['height'], bounds['width']) < 30 || Math.min(bounds['height'], bounds['width']) < 15) + return null; + // pass iframe element does not have a tabindex attribute value that is a negative number + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) >= 0) + return (0, IRule_1.RulePass)("pass"); + // check iframe content + var iframElem = ruleContext; + if (!iframElem || !iframElem.contentDocument || !iframElem.contentDocument.documentElement) + return null; + // If the iframe is blocked by an open modal dialog it is effectively inert — inapplicable + var doc = ruleContext.ownerDocument; + if (doc) { + var dialogs = Array.from(doc.querySelectorAll("dialog")); + var blockedByModal = dialogs.some(function (d) { return d.matches(":modal") && !d.contains(ruleContext); }); + if (blockedByModal) + return null; + } + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RuleFail)("fail_invalid"); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/imagebutton_alt_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/imagebutton_alt_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagebutton_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.imagebutton_alt_exists = { + id: "imagebutton_alt_exists", + context: "dom:input", + refactor: { + "WCAG20_Input_ExplicitLabelImage": { + "Pass_0": "Pass_0", + "Pass_1": "Pass_1", + "Pass_2": "Pass_2", + "Fail": "Fail" + } + }, + help: { + "en-US": { + "Pass_0": "imagebutton_alt_exists.html", + "Pass_1": "imagebutton_alt_exists.html", + "Pass_2": "imagebutton_alt_exists.html", + "Fail": "imagebutton_alt_exists.html", + "group": "imagebutton_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Image button provides alternative text using the 'alt' attribute", + "Pass_1": "Image button provides alternative text using an ARIA label", + "Pass_2": "Image button provides alternative text using the 'title' attribute", + "Fail": "The <input> element of type \"image\" has no text alternative", + "group": "The <input> element of type \"image\" should have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "59796f", + run: function (context, options, contextHierarchies) { + // See https://www.w3.org/WAI/WCAG22/Techniques/failures/F65 + var ruleContext = context["dom"].node; + if (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() != "image") { + return null; + } + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_1"); + } + else if (ruleContext.hasAttribute("title") && ruleContext.getAttribute("title").length > 0) { + return (0, IRule_1.RulePass)("Pass_2"); + } + return (0, IRule_1.RuleFail)("Fail"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/imagemap_alt_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/imagemap_alt_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagemap_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.imagemap_alt_exists = { + id: "imagemap_alt_exists", + context: "dom:img[usemap], dom:img[ismap]", + refactor: { + "HAAC_Img_UsemapAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "imagemap_alt_exists.html", + "Fail_1": "imagemap_alt_exists.html", + "group": "imagemap_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image map or child <area> has no text alternative", + "group": "An image map and each <area> element in an image map must have text alternative(s)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt") || + (!ruleContext.hasAttribute("ismap") && !CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "usemap")); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_background.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_background.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_background = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_background = { + id: "img_alt_background", + context: "dom:*", + refactor: { + "HAAC_BackgroundImg_HasTextOrTitle": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_background.html", + "Manual_1": "img_alt_background.html", + "group": "img_alt_background.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify important background image information has a text alternative in system high contrast mode", + "group": "Background images that convey important information must have a text alternative that describes the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var doc = ruleContext.ownerDocument; + var style = doc.defaultView.getComputedStyle(ruleContext); + if (style == null) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var backgroundImgs = style.backgroundImage; + var passed = true; + if (backgroundImgs != null && backgroundImgs != "" && backgroundImgs != 'none' && backgroundImgs != 'inherit') { + if (ruleContext.innerHTML != null && ruleContext.innerHTML.trim().length != 0) { + passed = false; + } + else { + var title = ruleContext.getAttribute('title'); + if (title != null && title.length != 0) + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_decorative.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_decorative.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_decorative = { + id: "img_alt_decorative", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_PresentationImgHasNonNullAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_decorative.html", + "Fail_1": "img_alt_decorative.html", + "group": "img_alt_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image designated as decorative has non-null 'alt' attribute", + "group": "Image designated as decorative must have 'alt=\"\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, "presentation") || AriaUtil_1.AriaUtil.hasRole(ruleContext, "none")) { + passed = ruleContext.getAttribute("alt").length == 0; + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_misuse.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/img_alt_misuse.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_misuse = { + id: "img_alt_misuse", + context: "dom:img, dom:area, dom:input", + refactor: { + "RPT_Img_AltCommonMisuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_misuse.html", + "Potential_1": "img_alt_misuse.html", + "group": "img_alt_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file name serves as a good inline replacement for the image", + "group": "'alt' attribute value must be a good inline replacement for the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + badText: { + value: ["short description"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + // Alt text check are elsewhere (See 41, 240, 455) + if (ruleContext.hasAttribute("alt")) { + var altText = ruleContext.getAttribute("alt").trim(); + if (altText.length > 0) { + var badText = validateParams.badText.value; + for (var i = 0; passed && i < badText.length; ++i) { + passed = altText.indexOf(badText[i]) == -1; + } + if (passed) { + var src = ruleContext.getAttribute((nodeName == "area") ? "href" : "src"); + // Allow it to pass if there's no src - can't determine these. + if (src != null) { + // Fail if the alt matches the src exactly + // Also fail if the alt has a . in it and either the src is in the alt or the alt is in the src + passed = src.trim() != altText && + (altText.indexOf(".") == -1 || (altText.indexOf(src) == -1 && src.indexOf(altText) == -1)); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_null.ts" +/*!**************************************!*\ + !*** ./src/v4/rules/img_alt_null.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_null = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_null = { + id: "img_alt_null", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_TitleEmptyWhenAltNull": { + "Pass_0": "pass", + "Fail_1": "fail_decorative" + } + }, + help: { + "en-US": { + "pass": "img_alt_null.html", + "fail_decorative": "img_alt_null.html", + "potential_aria_override": "img_alt_null.html", + "group": "img_alt_null.html" + } + }, + messages: { + "en-US": { + "pass": "Neither 'aria' nor 'title' attributes are used for the decorative image", + "fail_decorative": "The image 'alt' attribute is empty, but the 'title' attribute is not empty", + "potential_aria_override": "The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute", + "group": "When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_decorative"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["potential_aria_override"] + } + ], + act: [{ "46ca7f": { "potential_aria_override": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (ruleContext.getAttribute("alt").trim().length > 0) { + return null; + } + // We have a title, but alt is empty + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0) { + return (0, IRule_1.RulePotential)("potential_aria_override"); + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RuleFail)("fail_decorative"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_redundant.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/img_alt_redundant.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_redundant = { + id: "img_alt_redundant", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_LinkTextNotRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_redundant.html", + "Fail_1": "img_alt_redundant.html", + "Fail_2": "img_alt_redundant.html", + "Fail_3": "img_alt_redundant.html", + "group": "img_alt_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Link text is repeated in an image 'alt' value within the same link", + "Fail_2": "Link text of previous link is repeated in image 'alt' value of a link", + "Fail_3": "Image 'alt' value within a link is repeated in link text of the link after", + "group": "The text alternative for an image within a link should not repeat the link text or adjacent link text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.4.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aNode = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "a"); + //If not in an anchor, Out of Scope + if (aNode == null) + return null; + var altText = ruleContext.getAttribute("alt").trim().toLowerCase(); + if (altText.length == 0) { + // If alt text is empty, there's no text to be redundant - let a_text_purpose + // trigger in that case. + // So Out of Scope for this rule + return null; + } + var innerText = aNode.innerText; + var linkText = ""; + if (innerText != null) { + linkText = innerText.trim().toLowerCase(); + } + if (linkText.length > 0) { + if (altText == linkText) { + // Text in link + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + var passed = true; + //alt is non-zero, but no link text - ensure adjacent link text isn't redundant + var walk = new DOMWalker_1.DOMWalker(aNode); + while (passed && walk.prevNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName === "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + // Text before image link + passed = (node.innerText || node.textContent || "").trim().toLowerCase() != altText; + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + walk = new DOMWalker_1.DOMWalker(aNode, true); + while (passed && walk.nextNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName == "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + passed = node.innerText.trim().toLowerCase() != altText; + } + } + if (!passed) { + // Text after image link + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_valid.ts" +/*!***************************************!*\ + !*** ./src/v4/rules/img_alt_valid.ts ***! + \***************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.img_alt_valid = { + id: "img_alt_valid", + context: "dom:img", + refactor: { + "WCAG20_Img_HasAlt": { + "pass": "pass", + "fail_blank_alt": "fail_blank_alt", + "fail_no_alt": "fail_no_alt", + "fail_blank_title": "fail_blank_title" + } + }, + help: { + "en-US": { + "pass": "img_alt_valid.html", + "fail_blank_alt": "img_alt_valid.html", + "fail_no_alt": "img_alt_valid.html", + "fail_blank_title": "img_alt_valid.html", + "group": "img_alt_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The image has an accessible name or is correctly marked as decorative or redundant", + "fail_blank_alt": "Image 'alt' attribute value consists only of blank space(s)", + "fail_no_alt": "The image has neither an accessible name nor is marked as decorative or redundant", + "fail_blank_title": "The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)", + "group": "Images must have accessible names unless they are decorative or redundant" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "23a2a8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If not visible to the screen reader, or can be ignored + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).trim().length !== 0) { + // the img has non-empty aria label + return (0, IRule_1.RulePass)("pass"); + } + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + // check title attribute + if (alt === null) { + // the img has no alt or attribute, examine the title attribute + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (title === null || title.length === 0) { + // no title or title is empty, examine alt further + if (alt === null) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext, false); + if (role === 'presentation' || role === 'none') + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_no_alt"); + } + if (alt.length === 0) + return (0, IRule_1.RulePass)("pass"); + } + else { + if (title.trim().length === 0) { + // title contains blank space only (title=" ") + return (0, IRule_1.RuleFail)("fail_blank_title"); + } + // title contains some text (title="some text") + return (0, IRule_1.RulePass)("pass"); + } + } + else { + if (alt.length === 0 || alt.trim().length > 0) { + // the img has empty alt (alt="") or non-empty alt (alt="some text") + return (0, IRule_1.RulePass)("pass"); + } + else { + // alt contains blank space only (alt=" ") + return (0, IRule_1.RuleFail)("fail_blank_alt"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_ismap_misuse.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/img_ismap_misuse.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_ismap_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_ismap_misuse = { + id: "img_ismap_misuse", + context: "dom:img[ismap]", + refactor: { + "RPT_Img_UsemapValid": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_ismap_misuse.html", + "Potential_1": "img_ismap_misuse.html", + "group": "img_ismap_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Server-side image map hot-spots do not have duplicate text links", + "group": "Server-side image map hot-spots must have duplicate text links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = false; + if (ruleContext.hasAttribute("usemap")) { + var usemap = ruleContext.getAttribute("usemap"); + usemap = usemap.trim().toLowerCase(); + var idx = usemap.indexOf("#"); + if (idx != -1) + usemap = usemap.substr(idx + 1); + if (usemap.length > 0) { + var maps = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "map"); + for (var i = 0; !passed && i < maps.length; ++i) { + passed = maps[i].hasAttribute("name") && + maps[i].getAttribute("name").toLowerCase() == usemap; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_longdesc_misuse.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/img_longdesc_misuse.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_longdesc_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_longdesc_misuse = { + id: "img_longdesc_misuse", + context: "dom:img[longdesc]", + refactor: { + "RPT_Img_LongDescription2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_longdesc_misuse.html", + "Potential_1": "img_longdesc_misuse.html", + "group": "img_longdesc_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)", + "group": " The 'longdesc' attribute must reference HTML content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var longdesc = ruleContext.getAttribute("longdesc"); + // if (longdesc is bad URL) passed = false; + var ext = CommonUtil_1.CommonUtil.getFileExt(longdesc); + var passed = ext.length != 0 && CommonUtil_1.CommonUtil.isHtmlExt(ext) + || longdesc.startsWith("#") + || longdesc.startsWith("http://") + || longdesc.startsWith("https://") + || longdesc.startsWith("data:"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/index.ts" +/*!*******************************!*\ + !*** ./src/v4/rules/index.ts ***! + \*******************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +// This file is automatically generated by "npm run prebuild". Do not edit +__exportStar(__webpack_require__(/*! ./a_target_warning */ "./src/v4/rules/a_target_warning.ts"), exports); +__exportStar(__webpack_require__(/*! ./a_text_purpose */ "./src/v4/rules/a_text_purpose.ts"), exports); +__exportStar(__webpack_require__(/*! ./applet_alt_exists */ "./src/v4/rules/applet_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./application_content_accessible */ "./src/v4/rules/application_content_accessible.ts"), exports); +__exportStar(__webpack_require__(/*! ./area_alt_exists */ "./src/v4/rules/area_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_accessiblename_exists */ "./src/v4/rules/aria_accessiblename_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_tabindex_valid */ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_valid */ "./src/v4/rules/aria_activedescendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_label_unique */ "./src/v4/rules/aria_application_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_labelled */ "./src/v4/rules/aria_application_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_article_label_unique */ "./src/v4/rules/aria_article_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_allowed */ "./src/v4/rules/aria_attribute_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_conflict */ "./src/v4/rules/aria_attribute_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_deprecated */ "./src/v4/rules/aria_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_exists */ "./src/v4/rules/aria_attribute_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_redundant */ "./src/v4/rules/aria_attribute_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_required */ "./src/v4/rules/aria_attribute_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_value_valid */ "./src/v4/rules/aria_attribute_value_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_label_unique */ "./src/v4/rules/aria_banner_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_single */ "./src/v4/rules/aria_banner_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_tabbable */ "./src/v4/rules/aria_child_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_valid */ "./src/v4/rules/aria_child_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_unique */ "./src/v4/rules/aria_complementary_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_visible */ "./src/v4/rules/aria_complementary_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_labelled */ "./src/v4/rules/aria_complementary_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_content_in_landmark */ "./src/v4/rules/aria_content_in_landmark.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_label_unique */ "./src/v4/rules/aria_contentinfo_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_misuse */ "./src/v4/rules/aria_contentinfo_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_single */ "./src/v4/rules/aria_contentinfo_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_descendant_valid */ "./src/v4/rules/aria_descendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_document_label_unique */ "./src/v4/rules/aria_document_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_eventhandler_role_valid */ "./src/v4/rules/aria_eventhandler_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_form_label_unique */ "./src/v4/rules/aria_form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_graphic_labelled */ "./src/v4/rules/aria_graphic_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_hidden_nontabbable */ "./src/v4/rules/aria_hidden_nontabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_id_unique */ "./src/v4/rules/aria_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_img_labelled */ "./src/v4/rules/aria_img_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_keyboard_handler_exists */ "./src/v4/rules/aria_keyboard_handler_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_landmark_name_unique */ "./src/v4/rules/aria_landmark_name_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_unique */ "./src/v4/rules/aria_main_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_visible */ "./src/v4/rules/aria_main_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_navigation_label_unique */ "./src/v4/rules/aria_navigation_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_parent_required */ "./src/v4/rules/aria_parent_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_label_unique */ "./src/v4/rules/aria_region_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_labelled */ "./src/v4/rules/aria_region_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_allowed */ "./src/v4/rules/aria_role_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_redundant */ "./src/v4/rules/aria_role_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_search_label_unique */ "./src/v4/rules/aria_search_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_semantics */ "./src/v4/rules/aria_semantics.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_toolbar_label_unique */ "./src/v4/rules/aria_toolbar_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_widget_labelled */ "./src/v4/rules/aria_widget_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./asciiart_alt_exists */ "./src/v4/rules/asciiart_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_css_review */ "./src/v4/rules/blink_css_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_elem_deprecated */ "./src/v4/rules/blink_elem_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./blockquote_cite_exists */ "./src/v4/rules/blockquote_cite_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./canvas_content_described */ "./src/v4/rules/canvas_content_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./caption_track_exists */ "./src/v4/rules/caption_track_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_active_descendant */ "./src/v4/rules/combobox_active_descendant.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_autocomplete_valid */ "./src/v4/rules/combobox_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_design_valid */ "./src/v4/rules/combobox_design_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_focusable_elements */ "./src/v4/rules/combobox_focusable_elements.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_haspopup_valid */ "./src/v4/rules/combobox_haspopup_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_popup_reference */ "./src/v4/rules/combobox_popup_reference.ts"), exports); +__exportStar(__webpack_require__(/*! ./debug_paths */ "./src/v4/rules/debug_paths.ts"), exports); +__exportStar(__webpack_require__(/*! ./detector_tabbable */ "./src/v4/rules/detector_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./dir_attribute_valid */ "./src/v4/rules/dir_attribute_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./download_keyboard_controllable */ "./src/v4/rules/download_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./draggable_alternative_exists */ "./src/v4/rules/draggable_alternative_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_labelled */ "./src/v4/rules/element_accesskey_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_unique */ "./src/v4/rules/element_accesskey_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_attribute_deprecated */ "./src/v4/rules/element_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_id_unique */ "./src/v4/rules/element_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_lang_valid */ "./src/v4/rules/element_lang_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_mouseevent_keyboard */ "./src/v4/rules/element_mouseevent_keyboard.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_orientation_unlocked */ "./src/v4/rules/element_orientation_unlocked.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_scrollable_tabbable */ "./src/v4/rules/element_scrollable_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_role_valid */ "./src/v4/rules/element_tabbable_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_unobscured */ "./src/v4/rules/element_tabbable_unobscured.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_visible */ "./src/v4/rules/element_tabbable_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./embed_alt_exists */ "./src/v4/rules/embed_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./emoticons_alt_exists */ "./src/v4/rules/emoticons_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./error_message_exists */ "./src/v4/rules/error_message_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_label_valid */ "./src/v4/rules/fieldset_label_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_legend_valid */ "./src/v4/rules/fieldset_legend_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./figure_label_exists */ "./src/v4/rules/figure_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_font_color */ "./src/v4/rules/form_font_color.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_interaction_review */ "./src/v4/rules/form_interaction_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_label_unique */ "./src/v4/rules/form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_button_exists */ "./src/v4/rules/form_submit_button_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_review */ "./src/v4/rules/form_submit_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_src_valid */ "./src/v4/rules/frame_src_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_title_exists */ "./src/v4/rules/frame_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_content_exists */ "./src/v4/rules/heading_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_markup_misuse */ "./src/v4/rules/heading_markup_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_lang_exists */ "./src/v4/rules/html_lang_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_skipnav_exists */ "./src/v4/rules/html_skipnav_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./iframe_interactive_tabbable */ "./src/v4/rules/iframe_interactive_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagebutton_alt_exists */ "./src/v4/rules/imagebutton_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagemap_alt_exists */ "./src/v4/rules/imagemap_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_background */ "./src/v4/rules/img_alt_background.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_decorative */ "./src/v4/rules/img_alt_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_misuse */ "./src/v4/rules/img_alt_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_null */ "./src/v4/rules/img_alt_null.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_redundant */ "./src/v4/rules/img_alt_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_valid */ "./src/v4/rules/img_alt_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_ismap_misuse */ "./src/v4/rules/img_ismap_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_longdesc_misuse */ "./src/v4/rules/img_longdesc_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_autocomplete_valid */ "./src/v4/rules/input_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_checkboxes_grouped */ "./src/v4/rules/input_checkboxes_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_fields_grouped */ "./src/v4/rules/input_fields_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_haspopup_conflict */ "./src/v4/rules/input_haspopup_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_after */ "./src/v4/rules/input_label_after.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_before */ "./src/v4/rules/input_label_before.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_exists */ "./src/v4/rules/input_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_visible */ "./src/v4/rules/input_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_onchange_review */ "./src/v4/rules/input_onchange_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_placeholder_label_visible */ "./src/v4/rules/input_placeholder_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_content_exists */ "./src/v4/rules/label_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_name_visible */ "./src/v4/rules/label_name_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_ref_valid */ "./src/v4/rules/label_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_children_valid */ "./src/v4/rules/list_children_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_markup_review */ "./src/v4/rules/list_markup_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_structure_proper */ "./src/v4/rules/list_structure_proper.ts"), exports); +__exportStar(__webpack_require__(/*! ./marquee_elem_avoid */ "./src/v4/rules/marquee_elem_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_brief */ "./src/v4/rules/media_alt_brief.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_exists */ "./src/v4/rules/media_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_audio_transcribed */ "./src/v4/rules/media_audio_transcribed.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_autostart_controllable */ "./src/v4/rules/media_autostart_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_keyboard_controllable */ "./src/v4/rules/media_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_live_captioned */ "./src/v4/rules/media_live_captioned.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_track_available */ "./src/v4/rules/media_track_available.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_redirect_optional */ "./src/v4/rules/meta_redirect_optional.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_refresh_delay */ "./src/v4/rules/meta_refresh_delay.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_viewport_zoomable */ "./src/v4/rules/meta_viewport_zoomable.ts"), exports); +__exportStar(__webpack_require__(/*! ./noembed_content_exists */ "./src/v4/rules/noembed_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./object_text_exists */ "./src/v4/rules/object_text_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_exists */ "./src/v4/rules/page_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_valid */ "./src/v4/rules/page_title_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_focus_blur_review */ "./src/v4/rules/script_focus_blur_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_avoid */ "./src/v4/rules/script_onclick_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_misuse */ "./src/v4/rules/script_onclick_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_select_review */ "./src/v4/rules/script_select_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./select_options_grouped */ "./src/v4/rules/select_options_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_described */ "./src/v4/rules/skip_main_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_exists */ "./src/v4/rules/skip_main_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_background_decorative */ "./src/v4/rules/style_background_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_before_after_review */ "./src/v4/rules/style_before_after_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_color_misuse */ "./src/v4/rules/style_color_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_focus_visible */ "./src/v4/rules/style_focus_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_highcontrast_visible */ "./src/v4/rules/style_highcontrast_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_hover_persistent */ "./src/v4/rules/style_hover_persistent.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_viewport_resizable */ "./src/v4/rules/style_viewport_resizable.ts"), exports); +__exportStar(__webpack_require__(/*! ./svg_graphics_labelled */ "./src/v4/rules/svg_graphics_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_aria_descendants */ "./src/v4/rules/table_aria_descendants.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_empty */ "./src/v4/rules/table_caption_empty.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_nested */ "./src/v4/rules/table_caption_nested.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_exists */ "./src/v4/rules/table_headers_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_ref_valid */ "./src/v4/rules/table_headers_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_related */ "./src/v4/rules/table_headers_related.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_layout_linearized */ "./src/v4/rules/table_layout_linearized.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_scope_valid */ "./src/v4/rules/table_scope_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_structure_misuse */ "./src/v4/rules/table_structure_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_summary_redundant */ "./src/v4/rules/table_summary_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./target_spacing_sufficient */ "./src/v4/rules/target_spacing_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_block_heading */ "./src/v4/rules/text_block_heading.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_contrast_sufficient */ "./src/v4/rules/text_contrast_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_quoted_correctly */ "./src/v4/rules/text_quoted_correctly.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_sensory_misuse */ "./src/v4/rules/text_sensory_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_spacing_valid */ "./src/v4/rules/text_spacing_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_whitespace_valid */ "./src/v4/rules/text_whitespace_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_exists */ "./src/v4/rules/widget_tabbable_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_single */ "./src/v4/rules/widget_tabbable_single.ts"), exports); + + +/***/ }, + +/***/ "./src/v4/rules/input_autocomplete_valid.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/input_autocomplete_valid.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_autocomplete_valid = { + id: "input_autocomplete_valid", + context: "dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]", + refactor: { + "WCAG21_Input_Autocomplete": { + "Pass_0": "pass", + "Fail_1": "fail_inappropriate", + "Fail_2": "fail_invalid", + "Fail_attribute_incorrect": "fail_incorrect" + } + }, + help: { + "en-US": { + "group": "input_autocomplete_valid.html", + "pass": "input_autocomplete_valid.html", + "fail_inappropriate": "input_autocomplete_valid.html", + "fail_invalid": "input_autocomplete_valid.html", + "fail_incorrect": "input_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "group": "The 'autocomplete' attribute's token(s) must be appropriate for the input form field", + "pass": "The 'autocomplete' attribute's token(s) is appropriate for the input form field", + "fail_inappropriate": "The 'autocomplete' attribute's token(s) are not appropriate for the input form field", + "fail_invalid": "The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type", + "fail_incorrect": "The 'autocomplete' attribute has an incorrect value" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "73f2c2": { + "pass": "pass", + "fail_inappropriate": "fail", + "fail_invalid": "pass", + "fail_incorrect": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var autocompleteAttr = ruleContext.getAttribute("autocomplete").trim().toLowerCase(); + var tokens = autocompleteAttr.split(/\s+/); + if (tokens.length === 0 || autocompleteAttr.length === 0) { + return null; + } + var cache = { + "tokensOnOff": ["on", "off"], + "tokenOptionalSection": "section-", + "tokensOptionalPurpose": ["shipping", "billing"], + "tokensMandatoryGroup1_password": ["new-password", "current-password", "one-time-code"], + "tokensMandatoryGroup1_multiline": ["street-address"], + "tokensMandatoryGroup1_month": ["cc-exp"], + "tokensMandatoryGroup1_numeric": ["cc-exp-month", + "cc-exp-year", + "transaction-amount", + "bday-day", + "bday-month", + "bday-year"], + "tokensMandatoryGroup1_date": ["bday"], + "tokensMandatoryGroup1_url": ["url", "photo"], + "tokensMandatoryGroup1_text": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "organization-title", + "organization", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-csc", + "cc-type", + "transaction-currency", + "language", + "sex"], + "tokensMandatoryGroup1_all": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "new-password", + "current-password", + "organization-title", + "organization", + "street-address", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-exp", + "cc-exp-month", + "cc-exp-year", + "cc-csc", + "cc-type", + "transaction-currency", + "transaction-amount", + "language", + "bday", + "bday-day", + "bday-month", + "bday-year", + "sex", + "url", + "photo"], + "tokensOptionalGroup2": ["home", + "work", + "mobile", + "fax", + "pager"], + "tokensMandatoryGroup2_tel": ["tel"], + "tokensMandatoryGroup2_email": ["email"], + "tokensMandatoryGroup2_url": ["impp"], + "tokensMandatoryGroup2_text": ["tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension"], + "tokensMandatoryGroup2_all": ["tel", + "tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension", + "email", + "impp"], + "tokensOptionGroup1_webauthn": ["webauthn"] + }; + var valid_values = []; + for (var key in cache) + valid_values = valid_values.concat(cache[key]); + var foundMandatoryToken = false; + var foundRecognizedToken = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!tokens.every(function (r) { return valid_values.includes(r) || r.startsWith(cache['tokenOptionalSection']); })) + return (0, IRule_1.RuleFail)("fail_incorrect"); + var type = ruleContext.hasAttribute("type") ? ruleContext.getAttribute("type").trim().toLowerCase() : "text"; + var tokensMandatoryGroup1 = []; + var tokensMandatoryGroup2 = []; + var tokensOptionalGroup = []; + if (nodeName === "textarea" || nodeName === "select") { + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + if (nodeName === "textarea") + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + } + else if (nodeName === "input") { + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + // handle the various 'input' types + switch (type) { + // Disable check for input type=hidden for now based on scrum discussion + /* + case "hidden": + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + */ + case "text": + case "search": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_text.concat(cache.tokensMandatoryGroup1_password, cache.tokensMandatoryGroup1_url, cache.tokensMandatoryGroup1_numeric, cache.tokensMandatoryGroup1_month, cache.tokensMandatoryGroup1_date); + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + case "password": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_password; + break; + case "url": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_url; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_url; + break; + case "email": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_email; + break; + case "tel": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_tel; + break; + case "number": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_numeric; + break; + case "month": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_month; + break; + case "date": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_date; + break; + default: + // unsupported type for this rule. + return null; + } + } + else { + // should never get here. + return null; + } + // Disable check for input type=hidden for now based on scrum discussion + var autofillMantle = /* (nodeName==="input" && type==="hidden") ? "anchor" : */ "expectation"; + if (autofillMantle === "expectation") { + // check on|off for expectation mantle. + if (tokens.includes("on") || tokens.includes("off")) { + // on|off should be the only token + if (tokens.length === 1) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_invalid"); + } + } + } + // check detail autofill tokens + var currIndex = 0; + var currRecognizedIndex = 0; + // check optional 'section-*' tokens + if (tokens[currIndex].startsWith(cache.tokenOptionalSection) && + tokens[currIndex].length > 8) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check optional 'shipping|billing' tokens + if (tokens.length > currIndex && + cache.tokensOptionalPurpose.includes(tokens[currIndex])) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currIndex) { + // check mandatory group 1 + if (tokensMandatoryGroup1.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currIndex])) { + currIndex++; + } + // check mandatory group 2 + if (tokensMandatoryGroup2.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + } + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currRecognizedIndex) { + // check mandatory group 1 + if (cache.tokensMandatoryGroup1_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currRecognizedIndex])) { + currRecognizedIndex++; + } + // check mandatory group 2 + if (cache.tokensMandatoryGroup2_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + } + } + if (tokens.length > currIndex + currRecognizedIndex) { + // check optional tokens webauthn + if (tokensOptionalGroup.includes(tokens[currIndex + currRecognizedIndex])) { + currIndex++; + } + } + if ((tokens.length > currIndex && tokensOptionalGroup.includes(tokens[currIndex])) + || (tokens.length > currRecognizedIndex && tokensOptionalGroup.includes(tokens[currRecognizedIndex]))) { + currIndex++; + currRecognizedIndex++; + } + // Only pass if we have seen either of the mandatory groups and all tokens have been consumed + if (foundMandatoryToken && tokens.length === currIndex) { + return (0, IRule_1.RulePass)("pass"); + } + else if (foundRecognizedToken && tokens.length === currRecognizedIndex) { + return (0, IRule_1.RuleFail)("fail_incorrect"); + } + else { + return (0, IRule_1.RuleFail)("fail_inappropriate"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_checkboxes_grouped.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/input_checkboxes_grouped.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_checkboxes_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.input_checkboxes_grouped = { + id: "input_checkboxes_grouped", + context: "dom:input[type=radio], dom:input[type=checkbox]", + refactor: { + "WCAG20_Input_RadioChkInFieldSet": { + "Pass_LoneNogroup": "pass_lonenogroup", + "Pass_Grouped": "pass_grouped", + "Pass_RadioNoName": "pass_radioNoName", + "Fail_ControlNameMismatch": "fail_controlnamemismatch", + "Fail_NotGroupedOtherGrouped": "fail_notgroupedothergrouped", + "Fail_NotGroupedOtherNotGrouped": "fail_notgroupedothernotgrouped", + "Fail_NotSameGroup": "fail_notsamegroup", + "Potential_LoneCheckbox": "potential_lonecheckbox", + "Potential_UnnamedCheckbox": "potential_unnamedcheckbox" + } + }, + help: { + "en-US": { + "group": "input_checkboxes_grouped.html", + "pass_lonenogroup": "input_checkboxes_grouped.html", + "pass_grouped": "input_checkboxes_grouped.html", + "pass_radiononame": "input_checkboxes_grouped.html", + "fail_controlnamemismatch": "input_checkboxes_grouped.html", + "fail_notgroupedothergrouped": "input_checkboxes_grouped.html", + "fail_notgroupedothernotgrouped": "input_checkboxes_grouped.html", + "fail_notsamegroup": "input_checkboxes_grouped.html", + "potential_lonecheckbox": "input_checkboxes_grouped.html", + "potential_unnamedcheckbox": "input_checkboxes_grouped.html" + } + }, + messages: { + "en-US": { + "group": "Related sets of radio buttons or checkboxes should be programmatically grouped", + "pass_lonenogroup": "{0} grouping not required for a control of this type", + "pass_grouped": "{0} input is grouped with other related controls with the same name", + "pass_radiononame": "Radio input is not grouped, but passes because it has no name to group with other radio inputs", + "fail_controlnamemismatch": "{0} input found that has the same name, \"{2}\" as a {1} input", + "fail_notgroupedothergrouped": "{0} input is not in the group with another {0} with the name \"{1}\"", + "fail_notgroupedothernotgrouped": "{0} input and others with the name \"{1}\" are not grouped together", + "fail_notsamegroup": "{0} input is in a different group than another {0} with the name \"{1}\"", + "potential_lonecheckbox": "Verify that this ungrouped checkbox input is not related to other checkboxes", + "potential_unnamedcheckbox": "Verify that this un-named, ungrouped checkbox input is not related to other checkboxes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var getGroup = function (e) { + var retVal = CommonUtil_1.CommonUtil.getAncestor(e, "fieldset") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "radiogroup") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "group") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "grid") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "table"); + if (!retVal) { + retVal = CommonUtil_1.CommonUtil.getAncestor(e, "table"); + if (retVal && !TableUtil_1.TableUtil.isDataTable(retVal)) { + retVal = null; + } + } + return retVal; + }; + // Only radio buttons and checkboxes are in scope + var ctxType = ruleContext.getAttribute("type").toLowerCase(); + // Determine which form we're in (if any) to determine our scope + var ctxForm = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement; + // Get data about all of the visible checkboxes and radios in the scope of this form + // and cache it for all of the other inputs in this scope + var formCache = CacheUtil_1.CacheUtil.getCache(ctxForm, "input_checkboxes_grouped", null); + if (!formCache) { + formCache = { + checkboxByName: {}, + radiosByName: {}, + nameToGroup: {}, + numCheckboxes: 0, + numRadios: 0 + }; + // Get all of the checkboxes in the form or body (but not nested in something else and not hidden) + // And get a mapping of these checkboxes to + var cWalker = new DOMWalker_1.DOMWalker(ctxForm, false, ctxForm, true); + var checkboxQ = []; + var radiosQ = []; + while (cWalker.nextNode()) { + if (!cWalker.bEndTag + && cWalker.node.nodeType === 1 + && cWalker.node.nodeName.toLowerCase() === "input" + && VisUtil_1.VisUtil.isNodeVisible(cWalker.node)) { + var type = cWalker.node.getAttribute("type"); + if (type === "checkbox") { + checkboxQ.push(cWalker.node); + } + else if (type === "radio") { + radiosQ.push(cWalker.node); + } + } + } + // let checkboxQ = ctxForm.querySelectorAll("input[type=checkbox]"); + for (var idx = 0; idx < checkboxQ.length; ++idx) { + var cb = checkboxQ[idx]; + if ((AriaUtil_1.AriaUtil.getAncestorWithRole(cb, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement) === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(cb)) { + var name_1 = cb.getAttribute("name") || ""; + (formCache.checkboxByName[name_1] = formCache.checkboxByName[name_1] || []).push(cb); + formCache.nameToGroup[name_1] = formCache.nameToGroup[name_1] || getGroup(cb); + ++formCache.numCheckboxes; + } + } + // Get all of the radios in the form or body (but not nested in something else and not hidden) + // let radiosQ = ctxForm.querySelectorAll("input[type=radio]"); + for (var idx = 0; idx < radiosQ.length; ++idx) { + var r = radiosQ[idx]; + var radCtx = (AriaUtil_1.AriaUtil.getAncestorWithRole(r, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement); + if (radCtx === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + var name_2 = r.getAttribute("name") || ""; + (formCache.radiosByName[name_2] = formCache.radiosByName[name_2] || []).push(r); + formCache.nameToGroup[name_2] = formCache.nameToGroup[name_2] || getGroup(r); + ++formCache.numRadios; + } + } + CacheUtil_1.CacheUtil.setCache(ctxForm, "input_checkboxes_grouped", formCache); + } + ///////////// Calculated everything, now check the various cases + var ctxName = ruleContext.getAttribute("name"); + var ctxGroup = getGroup(ruleContext); + ctxType = ctxType === "radio" ? "Radio" : "Checkbox"; + if (!ctxName || ctxName === "") { + // First process cases where the control is not named + if (ctxType === "Radio") { + // Radios without names don't act like groups, so don't enforce grouping + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_radiononame", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // Must be an unnamed checkbox + if (ctxGroup === null) { + if ((formCache.checkboxByName[""] || []).length > 1) { + return (0, IRule_1.RulePotential)("potential_unnamedcheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + else { + // Considering a named checkbox + var numRadiosWithName = (formCache.radiosByName[ctxName] || []).length; + var numCheckboxesWithName = (formCache.checkboxByName[ctxName] || []).length; + // Capitalize the input type for messages + if (numRadiosWithName > 0 && numCheckboxesWithName > 0) { + // We have a naming mismatch between different controls + return (0, IRule_1.RuleFail)("fail_controlnamemismatch", [ctxType, ctxType === "checkbox" ? "radio" : "checkbox", ctxName]); + } + else if (ctxType === "Radio" && (formCache.numRadios === 1 || numRadiosWithName === 1) + || ctxType === "Checkbox" && formCache.numCheckboxes === 1) { + // This is a lone control (either only control of this type on the page, or a radio button without any others by that name) + // We pass this control in all cases + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else if (ctxType === "Checkbox" && formCache.numCheckboxes > 1 && numCheckboxesWithName === 1) { + // We have only one checkbox with this name, but there are other checkboxes in the form. + // If we're not grouped, ask them to examine it + if (ctxGroup === null) { + return (0, IRule_1.RulePotential)("potential_lonecheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // We share a name with another similar control. Are we grouped together? + if (ctxGroup === null) { + if (formCache.nameToGroup[ctxName] !== null) { + // We're not grouped, but some control with the same name is in a group + return (0, IRule_1.RuleFail)("fail_notgroupedothergrouped", [ctxType, ctxName]); + } + else { + // None of us are grouped + return (0, IRule_1.RuleFail)("fail_notgroupedothernotgrouped", [ctxType, ctxName]); + } + } + else if (formCache.nameToGroup[ctxName] !== ctxGroup) { + // We're not in the main group with the others + return (0, IRule_1.RuleFail)("fail_notsamegroup", [ctxType, ctxName]); + } + else { + // We're all grouped up! + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_fields_grouped.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/input_fields_grouped.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_fields_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_fields_grouped = { + id: "input_fields_grouped", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_InFieldSet": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "input_fields_grouped.html", + "Potential_1": "input_fields_grouped.html", + "group": "input_fields_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Use the <fieldset> element to group logically related input elements", + "group": "Groups of logically related input elements should be contained within a <fieldset> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger for other input types or if we're in a fieldset + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") + return (0, IRule_1.RulePass)("Pass_0"); + } + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "fieldset") != null) + return (0, IRule_1.RulePass)("Pass_0"); + // No fieldset - see if this input is all by itself - no need to group single inputs + var parent = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["form", "body"]); + var checkTypes = ["input", "textarea", "select"]; + var passed = true; + for (var i = 0; passed && i < checkTypes.length; ++i) { + var controls = parent.getElementsByTagName(checkTypes[i]); + for (var j = 0; passed && j < controls.length; ++j) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(controls[j])) { + continue; + } + // Note that textareas and selects will be called type='text' + var type = controls[j].hasAttribute("type") ? controls[j].getAttribute("type").toLowerCase() : "text"; + // Only fail if this is another control in the form and its type is another text-like input + passed = controls[j] == ruleContext || (type != "text" && type != "password" && type != "file"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_haspopup_conflict.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/input_haspopup_conflict.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_haspopup_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_haspopup_conflict = { + id: "input_haspopup_conflict", + context: "dom:input[list][aria-haspopup]", + refactor: { + "input_haspopup_invalid": { + // "Pass": "pass", + "Potential_1": "potential_type_misuse", + "Potential_2": "potential_misuse" + } + }, + help: { + "en-US": { + "group": "input_haspopup_conflict.html", + // "pass": "input_haspopup_conflict.html", + "potential_type_misuse": "input_haspopup_conflict.html", + "potential_misuse": "input_haspopup_conflict.html", + "potential_list_notexist": "input_haspopup_conflict.html", + "fail_invalid_list_type": "input_haspopup_conflict.html", + "fail_invalid_list_elem": "input_haspopup_conflict.html" + } + }, + messages: { + "en-US": { + "group": "<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute", + // "pass": "The <input> element with a 'list' attribute does not use an explicit 'aria-haspopup' attribute", + "potential_type_misuse": "The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_misuse": "The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_list_notexist": "The list attribute for the <input> element is invalid", + "fail_invalid_list_type": "The list attribute for the <input> element with the type \"{0}\" is invalid", + "fail_invalid_list_elem": "The list attribute for the <input> element does not reference a datalist element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + // let "aria_role_valid" to handle invalid role. Only allowed role is combobox which is implicit. + if (roles && roles.length > 0 && !roles.includes('combobox')) + return null; + //triggering input types: text, search, tel, url, email, or missing or invalid + var yesTypes = ["text", "search", "tel", "url", "email", "date", "month", "week", "time", "datetime-local", "number", "range", "color"]; + var noTypes = ["file", "password", "checkbox", "radio", "submit", "reset", "image", "hidden", "button"]; + var attrValue = ruleContext.getAttribute("type"); + //missing input type for list but with aria_has_popup + if (!attrValue || attrValue.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_misuse"); + attrValue = attrValue.trim().toLowerCase(); + //invalid input types for list but with aria_has_popup + if (!yesTypes.includes(attrValue) && !noTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_misuse"); + // the list attribute is used for wrong input type + if (attrValue && noTypes.includes(attrValue)) + return (0, IRule_1.RuleFail)("fail_invalid_list_type"); + var list = ruleContext.getAttribute("list"); + // the list attribute is blank + if (!list || list.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_list_notexist"); + var listElem = ruleContext.ownerDocument.getElementById(list); + // the list element doesn't exist + if (!listElem) + return (0, IRule_1.RuleFail)("potential_list_notexist"); + // the list element is not a datalist element + if (listElem.nodeName.toLowerCase() !== 'datalist') + return (0, IRule_1.RuleFail)("fail_invalid_list_elem"); + // valid input types for list but with aria_has_popup + if (yesTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_type_misuse", [attrValue]); + // shouldn't get here + return; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_after.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/input_label_after.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_after = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_after = { + id: "input_label_after", + context: "dom:input", + refactor: { + "WCAG20_Input_LabelAfter": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_after.html", + "Fail_1": "input_label_after.html", + "Fail_2": "input_label_after.html", + "group": "input_label_after.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Checkbox or radio button is nested in label, so label is not after the input control", + "Fail_2": "Label text is located before its associated checkbox or radio button element", + "group": "Checkboxes and radio buttons must have a label after the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var type = ""; + if (ruleContext.hasAttribute("type")) + type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "checkbox" && type != "radio") { + return null; + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem === null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + var passed; + if (value === -2) { + // input nested in label + passed = false; + var walkNode = new DOMWalker_1.DOMWalker(labelElem); + walkNode.node = ruleContext; + while (!passed && walkNode.nextNode()) { + passed = ((walkNode.node.nodeName.toLowerCase() === "#text" && walkNode.node.nodeValue.trim().length > 0) + || (walkNode.node.nodeName.toLowerCase() === "span" && walkNode.node.textContent.trim().length > 0)); + } + if (!passed) { + // Input nested in label and text before input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != 1) { + // label is before input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_before.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_before.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_before = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_before = { + id: "input_label_before", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_LabelBefore": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_before.html", + "Fail_1": "input_label_before.html", + "Fail_2": "input_label_before.html", + "group": "input_label_before.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Text input is nested in label such that input precedes the label text", + "Fail_2": "Label text is located after its associated text input or <select> element", + "group": "Text inputs and <select> elements must have a label before the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") { + return null; + } + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem == null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + if (value === -2) { + // ignore if no label or the content for the label is only from the nested input control + var text = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (text && text.trim().length > 0 && CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim() === text.trim()) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + // input nested in label + var passed = false; + var walkNode = ruleContext.previousSibling; + while (!passed && walkNode !== null) { + passed = ((walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0) + || (walkNode.nodeName.toLowerCase() == "span" && walkNode.textContent.trim().length > 0)); + walkNode = walkNode.previousSibling; + } + if (!passed) { + // Input nested in label and text after input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != -1) { + // label is after input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + // Haven't returned yet, then I pass + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_exists = { + id: "input_label_exists", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]", + //dependencies: ["aria_role_redundant", "aria_role_valid"], + refactor: { + "WCAG20_Input_ExplicitLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_exists.html", + "Fail_1": "input_label_exists.html", + "Fail_2": "input_label_exists.html", + "group": "input_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control element <{0}> has no associated label", + "Fail_2": "Form control with \"{0}\" role has no associated label", + "group": "Each form control must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: https://github.com/IBMa/equal-access/issues/756 + act: ["97a4e1", "e086e5"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) { + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Determine the input type + var passed = true; + var type = "text"; + if (nodeName == "input" && ruleContext.hasAttribute("type")) { + type = ruleContext.getAttribute("type").toLowerCase(); + } + else if (nodeName === "button" || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "button")) { + type = "buttonelem"; + } + if (nodeName == "input" && type == "") { + type = "text"; + } + if (type === "image") { + // Handled by input_label_existsImage + return null; + } + /** + let POF = -1; + let textTypes = CommonUtil.input_text_types; + let buttonTypes = CommonUtil.form_button_types; + + let buttonTypesWithDefaults = ["reset", "submit"]; // 'submit' and 'reset' have visible defaults. + if (textTypes.indexOf(type) !== -1) { // If type is in the list + // Get only the non-hidden labels for elements, in the case that a label is hidden then it is a violation + // Note: label[for] does not work for ARIA defined inputs + let labelElem = ruleContext.hasAttribute("role") ? null : CommonUtil.getLabelForElementHidden(ruleContext, true); + let hasLabelElemContent = false; + if (labelElem) { + if (CommonUtil.hasInnerContentHidden(labelElem)) { + hasLabelElemContent = true; + } else if ((labelElem.getAttribute("aria-label") || "").trim().length > 0) { + hasLabelElemContent = true; + } else if (labelElem.hasAttribute("aria-labelledby")) { + let labelledByElem = FragmentUtil.getById(labelElem, labelElem.getAttribute('aria-labelledby')); + if (labelledByElem && !DOMUtil.sameNode(labelledByElem, labelElem) && CommonUtil.hasInnerContent(labelledByElem)) { + hasLabelElemContent = true; + } + } + } + passed = (!!labelElem && hasLabelElemContent) || + (!labelElem && CommonUtil.attributeNonEmpty(ruleContext, "title") || CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) || + AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.hasImplicitLabel(ruleContext); + if (!passed) POF = 2 + textTypes.indexOf(type); + + } else if (buttonTypes.indexOf(type) !== -1) { // If type is a button + if (buttonTypesWithDefaults.indexOf(type) !== -1 && !ruleContext.hasAttribute("value")) { + // 'submit' and 'reset' have visible defaults so pass if there is no 'value' attribute + passed = true; + } else { + passed = CommonUtil.attributeNonEmpty(ruleContext, "value") || AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.indexOf(type); + } + } else if (type == "buttonelem") { + // If I am an image and I have alt text - accessibility-web-engine#269 + let bAlt = false; + if (ruleContext.nodeName.toLowerCase() === "img" && ruleContext.hasAttribute("alt")) { + let alt = ruleContext.getAttribute("alt"); + if (alt.trim().length === 0) { + bAlt = false; + } else { + bAlt = true; + } + }; + passed = CommonUtil.hasInnerContentHidden(ruleContext) || AriaUtil.hasAriaLabel(ruleContext) || bAlt || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 1; + } + + //check if a native button is labelled + if (!passed && nodeName == "button") { + if (CommonUtil.hasImplicitLabel(ruleContext)) + passed = true; + else { + let label = CommonUtil.getLabelForElement(ruleContext); + if (label && CommonUtil.hasInnerContentHidden(label)) + passed = true; + } + } + + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + if (!passed && (buttonTypes.indexOf(type) !== -1)) { + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class") == "dijitOffScreen" && DOMWalker.parentElement(ruleContext).hasAttribute("widgetid")) { + // Special handling for dijit buttons + let labelId = DOMWalker.parentElement(ruleContext).getAttribute("widgetid") + "_label"; + let label = FragmentUtil.getById(ruleContext, labelId); + if (label != null) { + passed = CommonUtil.hasInnerContentHidden(label); + // This means I failed above also + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 4 + buttonTypes.indexOf(type); + } + } + } + + if (!passed && nodeName == "optgroup") { + passed = CommonUtil.attributeNonEmpty(ruleContext, "label"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 2; + } + if (!passed && nodeName == "option") { + // Is a non-empty value attribute also enough for an option element? + passed = CommonUtil.attributeNonEmpty(ruleContext, "label") || ruleContext.innerHTML.trim().length > 0; + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 3; + } + + if (!passed) + passed = AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) { + // check aria role to figure out if the accessible name can be from content + const roles = AriaUtil.getRoles(ruleContext, true); + //when multiple roles specified, only the first valid role (guaranteed by dependencies) is applied, and the others just as fallbacks + if (ARIADefinitions.designPatterns[roles[0]] && ARIADefinitions.designPatterns[roles[0]].nameFrom && ARIADefinitions.designPatterns[roles[0]].nameFrom.includes("contents")) + passed = CommonUtil.hasInnerContentHidden(ruleContext); + } + */ + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + passed = pair && pair.name && pair.name.trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (ruleContext.hasAttribute("role") && ruleContext.getAttribute("role").trim().length > 0) { + return (0, IRule_1.RuleFail)("Fail_2", ruleContext.getAttribute("role").split(" ")); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_visible.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/input_label_visible.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_visible = { + id: "input_label_visible", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox", + dependencies: ["input_label_exists"], + refactor: { + "WCAG20_Input_VisibleLabel": { + "Pass_0": "pass", + "Potential_1": "potential_no_label", + "potential_placeholder_only": "potential_placeholder_only" + } + }, + help: { + "en-US": { + "pass": "input_label_visible.html", + "potential_placeholder_only": "input_label_visible.html", + "potential_no_label": "input_label_visible.html", + "group": "input_label_visible.html" + } + }, + messages: { + "en-US": { + "pass": "The input element has an associated visible label", + "potential_placeholder_only": "The ‘placeholder’ is the only visible label", + "potential_no_label": "The input element does not have an associated visible label", + "group": "An input element must have an associated visible label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.5.3", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // if a control is in a table cell, the col headers can act as visible label, which is checked in table heading rule + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table")) + return null; + // custom widget submission is not in scope for this success criteria (IBMa/equal-access#204) if it is not associated with data entry + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role && role === "button" && nodeName !== 'input' && nodeName !== 'button') { + // likely a custom widget, skip if not associated with data entry + if (!CommonUtil_1.CommonUtil.getAncestor(ruleContext, "form")) + return null; + } + // when in a combobox, only look at the input textbox. + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox") || + nodeName === "input" || (nodeName === "select" && AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")))) { + return null; + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + // check visible label for input or button + if (nodeName === 'input' || nodeName === 'button') { + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'internal' || pair.nameFrom === 'alt')) + return (0, IRule_1.RulePass)("pass"); + } + // check if an alternative tooltip exists that can be made visible through mouseover + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'text' || pair.nameFrom === 'title')) + return (0, IRule_1.RulePass)("pass"); + // check if any visible text from the control. + // note that (1) the text doesn’t need to be associated with the control to form a relationship + // (2) the text doesn't need to follow accessible name requirement (e.g. nameFrom) + var text = CommonUtil_1.CommonUtil.getOnScreenInnerText(ruleContext); + if (text && text.length !== 0) + return (0, IRule_1.RulePass)("pass"); + // check if any descendant with an alternative tooltip that can be made visible through mouseover + // only consider img and svg, and other text content of the descendant is covered in the isInnerText above + var descendants = AriaUtil_1.AriaUtil.getAllDescendantsWithRoles(ruleContext, ["img", "graphics-document", "graphics-object", "graphics-symbol"], false, true); + if (descendants && descendants.length > 0) { + for (var d = 0; d < descendants.length; d++) { + if (CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "title") || CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "alt")) + return (0, IRule_1.RulePass)("pass"); + } + } + // check if there is a visible label pointed to by the aria-labelledby attribute. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby")) { + var theLabel = ruleContext.getAttribute("aria-labelledby"); + var labelValues = theLabel.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById && !DOMUtil_1.DOMUtil.sameNode(elementById, ruleContext) && VisUtil_1.VisUtil.isNodeVisible(elementById) && CommonUtil_1.CommonUtil.hasInnerContentHidden(elementById)) { + return (0, IRule_1.RulePass)("pass"); + } + } + } + if ((nodeName === "optgroup" || nodeName == "option") && (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'content'))) + return (0, IRule_1.RulePass)("pass"); + // Determine if this is referenced by a combobox. If so, the label belongs to the combobox + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + // check if a placeholder exists even though a placeholder text is not sufficient as a visible text + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) + return (0, IRule_1.RulePotential)("potential_placeholder_only"); + return (0, IRule_1.RulePotential)("potential_no_label"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_onchange_review.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/input_onchange_review.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_onchange_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_onchange_review = { + id: "input_onchange_review", + context: "dom:input[onchange], dom:textarea[onchange], dom:select[onchange]", + refactor: { + "WCAG20_Input_HasOnchange": { + // "Pass_0": "pass", + "Potential_1": "potential_warning" + } + }, + help: { + "en-US": { + // "pass": "input_onchange_review.html", + "potential_warning": "input_onchange_review.html", + "group": "input_onchange_review.html" + } + }, + messages: { + "en-US": { + "group": "Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs", + // "pass": "The user is advised of the automatic form submission, new window opening, or focus change", + "potential_warning": "Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type === "hidden" || type === "submit" || type === "image" || type === "button" || type === "reset") + return null; + } + return (0, IRule_1.RulePotential)("potential_warning"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_placeholder_label_visible.ts" +/*!*********************************************************!*\ + !*** ./src/v4/rules/input_placeholder_label_visible.ts ***! + \*********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_placeholder_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_placeholder_label_visible = { + id: "input_placeholder_label_visible", + context: "dom:input[placeholder], dom:textarea[placeholder]", + refactor: { + "HAAC_Input_Placeholder": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_placeholder_label_visible.html", + "Potential_1": "input_placeholder_label_visible.html", + "Potential_2": "input_placeholder_label_visible.html", + "group": "input_placeholder_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "HTML5 placeholder is the only visible label", + "Potential_2": "Additional visible label referenced by 'aria-labelledby' is not valid", + "group": "HTML5 'placeholder' attribute must not be used as a visible label replacement" + } + }, + /** + * merge the rule into input_label_visible + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type == "hidden" || type == "button") { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("hidden")) { + var hidden = ruleContext.getAttribute("hidden"); + if (hidden == "" || hidden.toLowerCase() == "hidden") { // when hidden is empty in the element, "" is returned, same as it has a value of "". + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("aria-label")) { + return (0, IRule_1.RulePotential)("Potential_1"); + } + if (ruleContext.hasAttribute("aria-labelledby") && ruleContext.hasAttribute("id")) { + var id = ruleContext.getAttribute("id").trim(); + var refIds = ruleContext.getAttribute("aria-labelledby").trim().split(/\s+/); // separated by one or more white spaces + if (!refIds.includes(id)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_content_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/label_content_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.label_content_exists = { + id: "label_content_exists", + context: "dom:label", + refactor: { + "Valerie_Label_HasContent": { + "Pass_Regular": "Pass_Regular", + "Pass_AriaLabel": "Pass_AriaLabel", + "Pass_LabelledBy": "Pass_LabelledBy", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_Regular": "label_content_exists.html", + "Pass_AriaLabel": "label_content_exists.html", + "Pass_LabelledBy": "label_content_exists.html", + "Fail_1": "label_content_exists.html", + "group": "label_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_Regular": "<label> element has accessible name with inner content", + "Pass_AriaLabel": "<label> element has accessible name via 'aria-label'", + "Pass_LabelledBy": "<label> element has accessible name via 'aria-labelledby'", + "Fail_1": "The <label> element does not have descriptive text that identifies the expected input", + "group": "A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_Regular"); + } + else if ((ruleContext.getAttribute("aria-label") || "").trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_AriaLabel"); + } + else if (ruleContext.hasAttribute("aria-labelledby")) { + var labelElem = fragment_1.FragmentUtil.getById(ruleContext, ruleContext.getAttribute('aria-labelledby')); + if (labelElem && !DOMUtil_1.DOMUtil.sameNode(labelElem, ruleContext) && CommonUtil_1.CommonUtil.hasInnerContent(labelElem)) { + return (0, IRule_1.RulePass)("Pass_LabelledBy"); + } + } + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_name_visible.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/label_name_visible.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_name_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.label_name_visible = { + id: "label_name_visible", + context: "aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter", + refactor: { + "WCAG21_Label_Accessible": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "label_name_visible.html", + "Fail_1": "label_name_visible.html", + "group": "label_name_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Accessible name matches or contains the visible label text", + "Fail_1": "Accessible name does not match or contain the visible label text", + "group": "Accessible name must match or contain the visible label text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["2.5.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Review https://github.com/act-rules/act-rules.github.io/issues/1618 + // https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA24 + act: "2ee8b8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // pass if the visible text uses Material Icon font + if (CSSUtil_1.CSSUtil.isMaterialIconFont(ruleContext)) + return (0, IRule_1.RulePass)("Pass_0"); + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + var isInputButton = false; + //let buttonTypes = ["button", "reset", "submit"]; //"image" + var inputType = null; + if (nodeName === "input" && ruleContext.hasAttribute("type")) { + inputType = ruleContext.getAttribute("type").toLowerCase(); + if (CommonUtil_1.CommonUtil.form_button_types.indexOf(inputType) !== -1) { + isInputButton = true; + } + } + var theLabelBy = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-labelledby"); + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy) && !isInputButton) { + // skip the checks if it has an aria-labelledby since it takes precedence. + } + else { + var theLabel = null; + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy)) { + var labelValues = theLabelBy.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById) { + theLabel = CommonUtil_1.CommonUtil.getInnerText(elementById); + break; + } + } + } + else { + theLabel = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-label"); + } + if (!theLabel) { + return null; + } + var text = null; + if (isInputButton) { + /* Note: Disable the alt check in images until we get confirmation + if (inputType==="image" && ruleContext.hasAttribute("alt")){ + // use 'alt' attribute as visible text + text = ruleContext.getAttribute("alt"); + }else + */ + if (ruleContext.hasAttribute("value")) { + // use 'value' attribute as visible text + text = ruleContext.getAttribute("value"); + } + else { + // use default value + if (inputType === "submit" /*||inputType==="image"*/) { + text = "submit"; + } + else if (inputType === "reset") { + text = "reset"; + } + } + } + if (!text) { + // look for a <label> element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!labelElem) { + var parentNode = DOMWalker_1.DOMWalker.parentNode(ruleContext); + if (parentNode.nodeName.toLowerCase() === "label" /*&& RPTUtil.isFirstFormElement(parentNode, ruleContext)*/) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + labelElem = CommonUtil_1.CommonUtil.removeAllFormElementsFromLabel(parentClone); + } + } + var element = labelElem ? labelElem : ruleContext; + var elementsToSkipContentCheck = ["meter", "output", "progress", "select", "textarea"]; + if (!labelElem && elementsToSkipContentCheck.indexOf(nodeName) !== -1) { + text = ""; // skip content check for some elements + } + else { + // get the visible text only + text = CommonUtil_1.CommonUtil.getOnScreenInnerText(element); + } + /* Note: Disable this alt check in images for now until we get confirmation + // Look for the alt attribute of an image which is considered visible text. + let hasImgAlt = false; + if (element.firstChild != null) { + let nw = RPTUtil.new NodeWalker(element); + while (!hasImgAlt && nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + hasImgAlt = (nw.node.nodeName.toLowerCase() == "img" && RPTUtil.attributeNonEmpty(nw.node, "alt")); + if (hasImgAlt) { + text = text ? text + nw.node.getAttribute("alt") : nw.node.getAttribute("alt"); + } + } + } + */ + } + var nonalphanumeric = /[^a-zA-Z0-9]/g; + text = text.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedText = CommonUtil_1.CommonUtil.normalizeSpacing(text).toLowerCase(); // Leading and trailing whitespace and difference in case sensitivity should be ignored. + theLabel = theLabel.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(theLabel).toLowerCase(); + if (normalizedText.length > 1) { // skip non-text content. e.g., <button aria-label="close">X</button> + var location_1 = normalizedLabel.indexOf(normalizedText); + // Avoid matching partial words.e.g., text "name" should not match 'surname' or 'names' + if (location_1 >= 0 && normalizedLabel.length > normalizedText.length) { + var letters = /^[0-9a-zA-Z]+$/; + if ((location_1 + normalizedText.length) < normalizedLabel.length) { + // check ending + var theChar = normalizedLabel.charAt(location_1 + normalizedText.length); + if (theChar.match(letters)) { + passed = false; + } + } + if (passed && location_1 > 0) { + // check beginning + var theChar = normalizedLabel.charAt(location_1 - 1); + if (theChar.match(letters)) { + passed = false; + } + } + } + if (location_1 === -1) { // check that visible text content of the target is contained within its accessible name. + passed = false; + } + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_ref_valid.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/label_ref_valid.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.label_ref_valid = { + id: "label_ref_valid", + context: "dom:label[for]", + refactor: { + "WCAG20_Label_RefValid": { + "Pass_0": "pass", + "Fail_1": "fail_invalid" + } + }, + help: { + "en-US": { + "pass": "label_ref_valid.html", + "fail_invalid": "label_ref_valid.html", + "group": "label_ref_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element", + "fail_invalid": "The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element", + "group": "The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("for"); + var passed = false; + var target = fragment_1.FragmentUtil.getById(ruleContext, id); + if (target) { + // ignore if both label and control are invisible + if (!VisUtil_1.VisUtil.isNodeVisible(target) && !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + passed = true; + // handles null and undefined + if (!target.hasAttribute("role")) { + // Fail if we're pointing at something that is labelled by another mechanism + var nodeName = target.nodeName.toLowerCase(); + passed = nodeName == "input" || nodeName == "select" || nodeName == "textarea" + || nodeName == "button" || nodeName == "datalist" + || nodeName == "optgroup" || nodeName == "option" + || nodeName == "keygen" || nodeName == "output" + || nodeName == "progress" || nodeName == "meter" + || nodeName == "fieldset" || nodeName == "legend"; + if (target.nodeName.toLowerCase() == "input" && target.hasAttribute("type")) { + var type = target.getAttribute("type").toLowerCase(); + passed = type == "text" || type == "password" || type == "file" || + type == "checkbox" || type == "radio" || + type == "hidden" || type == "search" || type == "tel" || type == "url" || type == "email" || //HTML 5 + type == "date" || type == "number" || type == "range" || type == "image" || //HTML 5 + type == "time" || type == "color" || // HTML 5 + type == "datetime-local" || type == "month" || type == "week"; //HTML5.1 + } + } + // Add one more check to make sure the target element is NOT hidden, in the case the target is hidden + // flag a violation regardless of what the Check Hidden Content setting is. + if (passed && !VisUtil_1.VisUtil.isNodeVisible(target)) { + passed = false; + } + } + var retToken = []; + if (!passed) { + retToken.push(id); + } + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken]); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_invalid", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_children_valid.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/list_children_valid.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_children_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.list_children_valid = { + id: "list_children_valid", + context: "aria:group", + refactor: { + "HAAC_List_Group_ListItem": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_children_valid.html", + "Fail_1": "list_children_valid.html", + "group": "list_children_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "List component with \"group\" role has children that are not <listitem> elements", + "group": "List component with \"group\" role must limit children to <listitem> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parent = DOMWalker_1.DOMWalker.parentElement(ruleContext); + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(parent, "list")) { + return null; + } + var passed = true; + var children = ruleContext.children; + for (var i = 0; passed && i < children.length; i++) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "listitem"); + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_markup_review.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/list_markup_review.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_markup_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +// Matches unordered list item prefixes: •, ◦, ▪, ▸, ►, ✓, ✗, ✦, –, —, *, -, o +var UNORDERED_BULLET_PATTERN = /^[ \t]*[•◦▪▸►✓✗✦\-–—*o][ \t]+\S/; +// Matches ordered list item prefixes: 1. 1) (1) a. a) (a) A. A) i. ii. iii. etc. +var ORDERED_ITEM_PATTERN = /^[ \t]*(?:\(?\d+[.)]\)?|\(?[a-zA-Z][.)]\)?|\(?(?:i{1,3}|iv|vi{0,3}|ix|xi{0,3}|xiv|xv)[.)]\)?)[ \t]+\S/i; +var LIST_ITEM_PATTERN = new RegExp(UNORDERED_BULLET_PATTERN.source + "|" + ORDERED_ITEM_PATTERN.source, "i"); +// Block-level elements that act as boundaries between independent content groups +var BLOCK_ELEMENTS = new Set([ + "blockquote", "center", "dir", "div", "form", + "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "br", "menu", "p", "pre", "table", + "section", "article", "aside", "nav", "header", "footer", + "figure", "figcaption", "details", "summary", "dialog", + "script", "style", "label", + "ul", "ol", "dl", "li", "dt", "dd" +]); +// Inline elements whose text content is treated as part of the surrounding text run +var INLINE_ELEMENTS = new Set([ + "a", "abbr", "acronym", "b", "bdo", "big", "br", "button", "cite", + "code", "dfn", "em", "i", "img", "input", "kbd", "label", "map", + "object", "output", "q", "samp", "select", "small", "span", + "strong", "sub", "sup", "textarea", "time", "tt", "u", "var" +]); +// Returns the combined text of a node and its inline descendants, normalised to single spaces +function getShallowText(node) { + var text = ""; + node.childNodes.forEach(function (child) { + var _a; + if (child.nodeType === Node.TEXT_NODE) { + text += (_a = child.nodeValue) !== null && _a !== void 0 ? _a : ""; + } + else if (child.nodeType === Node.ELEMENT_NODE) { + var tag = child.nodeName.toLowerCase(); + if (INLINE_ELEMENTS.has(tag)) { + text += getShallowText(child); + } + } + }); + return text.replace(/\s+/g, " "); +} +// Returns trimmed non-empty lines from a node, splitting on newlines and <br> boundaries +function getLinesFromNode(node) { + var lines = []; + function walk(n) { + var _a; + if (n.nodeType === Node.TEXT_NODE) { + ((_a = n.nodeValue) !== null && _a !== void 0 ? _a : "").split(/\r?\n/).forEach(function (p) { + var trimmed = p.trim(); + if (trimmed.length > 0) + lines.push(trimmed); + }); + } + else if (n.nodeType === Node.ELEMENT_NODE) { + var elem = n; + var tag = elem.nodeName.toLowerCase(); + if (tag === "br") { + lines.push("\x00"); + return; + } + if (BLOCK_ELEMENTS.has(tag)) + return; + // Skip elements with list-related or widget roles + var role = elem.getAttribute("role"); + if (role) { + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(elem, ["widget"]); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "rowheader"], roles); + if (roles.length > 0) + return; + } + n.childNodes.forEach(walk); + } + } + walk(node); + return lines.filter(function (l) { return l !== "\x00"; }); +} +// Returns the maximum number of consecutive list-item-like lines found among +// the direct children of parent, treating <br> and whitespace-only text as separators +function maxConsecutiveListItems(parent) { + var maxRun = 0; + var currentRun = 0; + var currentLineText = ""; // accumulate text across inline siblings until <br> + parent.childNodes.forEach(function (child) { + var _a; + var tag = child.nodeName.toLowerCase(); + if (tag === "br") { + // test the accumulated line + var trimmed_1 = currentLineText.trim(); + if (trimmed_1.length > 0) { + if (LIST_ITEM_PATTERN.test(trimmed_1)) { + maxRun = Math.max(maxRun, ++currentRun); + } + else { + currentRun = 0; + } + } + currentLineText = ""; + return; + } + if (child.nodeType === Node.TEXT_NODE) { + var raw = (_a = child.nodeValue) !== null && _a !== void 0 ? _a : ""; + if (raw.trim().length === 0) + return; + // if there are embedded newlines, flush on each + var segs = raw.split(/\r?\n/); + segs.forEach(function (seg, i) { + if (i > 0) { + var trimmed_2 = currentLineText.trim(); + if (trimmed_2.length > 0) { + if (LIST_ITEM_PATTERN.test(trimmed_2)) { + maxRun = Math.max(maxRun, ++currentRun); + } + else { + currentRun = 0; + } + } + currentLineText = ""; + } + currentLineText += seg; + }); + return; + } + if (child.nodeType === Node.ELEMENT_NODE) { + var elem = child; + if (BLOCK_ELEMENTS.has(tag)) { + // flush current line before block boundary + var trimmed_3 = currentLineText.trim(); + if (trimmed_3.length > 0 && LIST_ITEM_PATTERN.test(trimmed_3)) { + maxRun = Math.max(maxRun, ++currentRun); + } + currentLineText = ""; + currentRun = 0; + return; + } + if (INLINE_ELEMENTS.has(tag)) { + currentLineText += getShallowText(elem); + } + else { + currentRun = 0; + currentLineText = ""; + } + } + }); + // flush any remaining line at end of container + var trimmed = currentLineText.trim(); + if (trimmed.length > 0 && LIST_ITEM_PATTERN.test(trimmed)) { + maxRun = Math.max(maxRun, ++currentRun); + } + return maxRun; +} +// Returns true if 2+ consecutive <br>-separated lines within element match the list-item pattern +function hasBrSeparatedListLines(element) { + var run = 0; + for (var _i = 0, _a = getLinesFromNode(element); _i < _a.length; _i++) { + var line = _a[_i]; + if (LIST_ITEM_PATTERN.test(line)) { + if (++run >= 2) + return true; + } + else { + run = 0; + } + } + return false; +} +exports.list_markup_review = { + id: "list_markup_review", + context: "dom:*", + refactor: { + "RPT_List_UseMarkup": { + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "potential_list": "list_markup_review.html", + "group": "list_markup_review.html" + } + }, + messages: { + "en-US": { + "potential_list": "Verify this is a list and if so, modify to use proper HTML elements for the list", + "group": "Proper HTML elements should be used to create a list" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "style", "label"]) !== null) + return null; + // Only check block-level and table-cell elements first — + // td/th must be checked before the ancestor role check since + // table/row/cell ARIA roles would otherwise cause an early exit + if (nodeName === "td" || nodeName === "th") { + if (maxConsecutiveListItems(ruleContext) >= 2) + return (0, IRule_1.RulePotential)("potential_list"); + if (hasBrSeparatedListLines(ruleContext)) + return (0, IRule_1.RulePotential)("potential_list"); + return null; + } + // Skip elements that already have semantic list, widget, or structural roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget"]); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "rowheader"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + // Only check block-level elements to avoid duplicate reports + if (!BLOCK_ELEMENTS.has(nodeName) && nodeName !== "body" && nodeName !== "li") + return null; + if (["ul", "ol", "dl", "menu"].includes(nodeName)) + return null; + if (maxConsecutiveListItems(ruleContext) >= 2) + return (0, IRule_1.RulePotential)("potential_list"); + if (hasBrSeparatedListLines(ruleContext)) + return (0, IRule_1.RulePotential)("potential_list"); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_structure_proper.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/list_structure_proper.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_structure_proper = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.list_structure_proper = { + id: "list_structure_proper", + context: "dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt", + refactor: { + "RPT_List_Misuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_structure_proper.html", + "Potential_1": "list_structure_proper.html", + "group": "list_structure_proper.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "List element is missing or improperly structured", + "group": "List elements should only be used for lists of related items" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Get all the childrens of the ruleContext + var children = ruleContext.children; + if (nodeName == "dl") { + var first = ""; + var last = ""; + var walkChildren = ruleContext.firstChild; + passed = true; + var presentationalFound = false; + // If there are no childrens set as passed, since dl elements can have + // zero or more of: one or more dt elements, followed by one or more dd elements + if (!ruleContext.children || ruleContext.children.length == 0) { + passed = true; + } + else { + while (passed && walkChildren != null) { + if (walkChildren.nodeType == 1) { + var nodeName_1 = walkChildren.nodeName.toLowerCase(); + // While walking through the elements under dl, if we find a + // presentational element we move to the next element as presentational + // elements are allowed under list elements as they are only for + // formatting text nodes. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Only set to pass if we find dd or dt element, in the case of + // an element that is not supported we will catch it here. i.e. img + // element + passed = nodeName_1 == "dd" || nodeName_1 == "dt"; + // Set the first and last node depending on which is found first and last + if (first == "") + first = nodeName_1; + last = nodeName_1; + } + walkChildren = walkChildren.nextSibling; + } + // In the case that we have found dt and dd elements under dl we pass right away. + // In the case that there is no dt or dd element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && first == "dt" && last == "dd") || (passed && presentationalFound); + } + } + else if (nodeName == "li") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["ul", "ol", "dir", "menu"]) != null; + } + else if (nodeName == "dd" || nodeName == "dt") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "dl") != null; + } + else { + var walkChildren = ruleContext.firstChild; + // Zero or more li elements are permitted inside of <ol>, <ul> or <menu> elements now as per the html5 spec. This handles the case + // when there are zero elements under the <ol>, <ul> or <menu>. + if ((nodeName == "ul" || nodeName == "ol" || nodeName == "menu") && (!ruleContext.children || ruleContext.children.length == 0)) { + passed = true; + } + else { + var liFound = false; + var presentationalFound = false; + passed = true; + while (passed && walkChildren != null) { + // While walking through the list elements, if we find a + // presentational element we skip checking as presentational + // elements are allowed under list elements as they are only for + // formatting text. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Pass if the node type is anything but 1, or in the case that it is a li element. For any other node + // it will be caught here that element is not allowed under list node. + // Furthermore in the case that there is a template element with the parent being ul/ol don't flag a violation + passed = walkChildren.nodeType != 1 || walkChildren.nodeName.toLowerCase() == "li" || (walkChildren.nodeName.toLowerCase() == "template" && (nodeName == "ul" || nodeName == "ol")); + // Set li found to true if the current element (nodeType=1) is an li element + liFound = liFound || (walkChildren.nodeType == 1 && walkChildren.nodeName.toLowerCase() == "li"); + walkChildren = walkChildren.nextSibling; + } + // In the case that it has passed and also li element is found under list node, we pass right away. + // In the case that there is no li element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && liFound) || (passed && presentationalFound); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/marquee_elem_avoid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/marquee_elem_avoid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.marquee_elem_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.marquee_elem_avoid = { + id: "marquee_elem_avoid", + context: "dom:marquee", + refactor: { + "RPT_Marquee_Trigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Fail_1": "marquee_elem_avoid.html", + "group": "marquee_elem_avoid.html" + } + }, + messages: { + "en-US": { + "Fail_1": "Scrolling content found that uses the obsolete <marquee> element", + "group": "The <marquee> element is obsolete and should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_alt_brief.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/media_alt_brief.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_brief = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_brief = { + id: "media_alt_brief", + context: "dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]", + refactor: { + "RPT_Media_AltBrief": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_brief.html", + "Potential_1": "media_alt_brief.html", + "group": "media_alt_brief.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Text alternative is more than 150 characters", + "group": "Alternative text in 'alt' attribute should be brief (<150 characters)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + maxAlt: { + value: 150, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var altLength = ruleContext.getAttribute("alt").trim().length; + var passed = altLength <= validateParams.maxAlt.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_alt_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/media_alt_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_exists = { + id: "media_alt_exists", + context: "dom:area[alt], dom:embed[alt]", + refactor: { + "RPT_Media_AudioVideoAltFilename": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_exists.html", + "Potential_1": "media_alt_exists.html", + "group": "media_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Filename used as label for embedded audio or video", + "group": "Audio or video on the page must have a short text alternative that describes the media content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var uri = ""; + if (ruleContext.nodeName.toLowerCase() == "area") { + uri = ruleContext.getAttribute("href"); + } + else { + uri = ruleContext.getAttribute("src"); + } + if (uri == null) + uri = ""; + var ext = CommonUtil_1.CommonUtil.getFileExt(uri); + var isAudVid = ext.length != 0 && (CommonUtil_1.CommonUtil.isAudioExt(ext) || CommonUtil_1.CommonUtil.isVideoExt(ext)); + var altText = ruleContext.getAttribute("alt"); + var passed = !isAudVid || (altText.length > 0 && altText.indexOf(ext) == -1); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_audio_transcribed.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/media_audio_transcribed.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_audio_transcribed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_audio_transcribed = { + id: "media_audio_transcribed", + context: "dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object", + refactor: { + "RPT_Media_AudioTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_audio_transcribed.html", + "group": "media_audio_transcribed.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Provide transcripts for audio files", + "group": "Audio information should also be available in text form" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed; + var thisNode = ruleContext.nodeName.toLowerCase(); + if (thisNode == "bgsound") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isAudioObjEmbedLink(ruleContext); + } + if (passed) + return null; // Out of Scope + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_autostart_controllable.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/media_autostart_controllable.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_autostart_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.media_autostart_controllable = { + id: "media_autostart_controllable", + context: "dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound", + refactor: { + "RPT_Embed_AutoStart": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_autostart_controllable.html", + "Potential_1": "media_autostart_controllable.html", + "group": "media_autostart_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically", + "group": "Mechanism must be available to pause or stop and control the volume of the audio that plays automatically" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed; + if (nodeName == "bgsound") { + passed = false; + } + else if (nodeName == "param") { + var content = ""; + if (ruleContext.hasAttribute("value")) + content = ruleContext.getAttribute("value").toLowerCase(); + passed = content.indexOf("0;") == 0 || + !(content.indexOf("true") != -1 || content.indexOf("1") != -1); + } + else if (nodeName == "embed") { + passed = true; + if (ruleContext.hasAttribute("flashvars")) { + var str = ruleContext.getAttribute("flashvars"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + if (passed && ruleContext.hasAttribute("src")) { + var str = ruleContext.getAttribute("src"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + } + if (passed && ruleContext.hasAttribute("autostart")) { + var val = ruleContext.getAttribute("autostart").toLowerCase(); + passed = val != 'true' && val != '1'; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_keyboard_controllable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/media_keyboard_controllable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_keyboard_controllable = { + id: "media_keyboard_controllable", + context: "dom:audio, dom:video", + refactor: { + "HAAC_Audio_Video_Trigger": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_keyboard_controllable.html", + "Manual_1": "media_keyboard_controllable.html", + "group": "media_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify media using <audio> and/or <video> elements have keyboard accessible controls", + "group": "Media using <audio> and/or <video> elements must have keyboard accessible controls" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName == "audio" || nodeName === "video") { + passed = false; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_live_captioned.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/media_live_captioned.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_live_captioned = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.media_live_captioned = { + id: "media_live_captioned", + context: "dom:embed, dom:object", + refactor: { + "RPT_Media_VideoObjectTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_live_captioned.html", + "group": "media_live_captioned.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify captions are provided for live media (streaming video with audio)", + "group": "Live media (streaming video with audio) should have captions for audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_track_available.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/media_track_available.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_track_available = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_track_available = { + id: "media_track_available", + context: "dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object", + refactor: { + "RPT_Media_VideoReferenceTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_track_available.html", + "group": "media_track_available.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify availability of a user-selectable audio track with description of visual content", + "group": "Pre-recorded media should have an audio track that describes visual information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.3", "1.2.5"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName == "applet") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_redirect_optional.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/meta_redirect_optional.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_redirect_optional = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.meta_redirect_optional = { + id: "meta_redirect_optional", + context: "dom:meta[http-equiv][content]", + refactor: { + "WCAG20_Meta_RedirectZero": { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "fail_longrefresh" + } + }, + help: { + "en-US": { + "group": "meta_redirect_optional.html", + "pass": "meta_redirect_optional.html", + "fail": "meta_redirect_optional.html", + "fail_longrefresh": "meta_redirect_optional.html" + } + }, + messages: { + "en-US": { + "group": "Page should not automatically refresh without warning or option to turn it off or adjust the time limit", + "pass": "Rule Passed", + "fail": "Check page does not automatically refresh without warning or options", + "fail_longrefresh": "Check page does not automatically refresh without warning or options" + } + }, + /** + * deprecate WCAG AAA + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.4", "3.2.5"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }], + */ + rulesets: [{ + "id": [], + "num": ["2.2.4", "3.2.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + // Removed ACT bisz58 AAA + /**act: [{ + "bc659a" : { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "pass" + } + }],*/ + act: ["bisz58"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') { + return null; + } + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed or failed: only the first one tridders if multiple + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_redirect_optional_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_redirect_optional_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + else if (time < 72001) + return (0, IRule_1.RuleFail)("fail"); + return (0, IRule_1.RuleFail)("fail_longrefresh"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_refresh_delay.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/meta_refresh_delay.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_refresh_delay = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.meta_refresh_delay = { + id: "meta_refresh_delay", + context: "dom:meta[http-equiv][content]", + refactor: { + "RPT_Meta_Refresh": { + "Pass_0": "pass", + "Potential_1": "potential_refresh" + } + }, + help: { + "en-US": { + "group": "meta_refresh_delay.html", + "pass": "meta_refresh_delay.html", + "potential_refresh": "meta_refresh_delay.html" + } + }, + messages: { + "en-US": { + "group": "Pages should not refresh automatically", + "pass": "Pages do not refresh automatically", + "potential_refresh": "Verify page is not being caused to refresh automatically", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + //act: [ "bisz58", "bc659a" ], + act: ["bc659a"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed: the first one takes priority + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_refresh_delay_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_refresh_delay_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_refresh"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_viewport_zoomable.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/meta_viewport_zoomable.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_viewport_zoomable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.meta_viewport_zoomable = { + id: "meta_viewport_zoomable", + context: "dom:meta[name][content]", + refactor: { + "meta_viewport_zoom": { + "Pass_0": "pass", + "Potential_1": "potential_zoomable" + } + }, + help: { + "en-US": { + "group": "meta_viewport_zoomable.html", + "pass": "meta_viewport_zoomable.html", + "potential_zoomable": "meta_viewport_zoomable.html" + } + }, + messages: { + "en-US": { + "group": "The 'meta[name=viewport]' should not prevent the browser zooming the content", + "pass": "The 'meta[name=viewport]' does not prevent the browser zooming the content", + "potential_zoomable": "Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "b4f0c3": { + "pass": "pass", + "potential_zoomable": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("name").toLowerCase() !== 'viewport') + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + // neither maximum-scale nor user-scalable (default yes) + if (!content || content.trim() === '' || (!content.includes('maximum-scale') && !content.includes('user-scalable'))) + return null; + var user_msg = null; + var max_msg = null; + var props = content.split(","); + var user_scale_value = 'yes'; + var maximum_scale_value = '2.0'; + for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { + var prop = props_1[_i]; + var pieces = prop.trim().split('='); + if (pieces.length < 2) + continue; + if (prop.includes('user-scalable')) { + user_msg = prop; + user_scale_value = pieces[1].trim(); + if (user_scale_value.startsWith("'") || user_scale_value.startsWith('"')) { + user_scale_value = user_scale_value.substring(1, user_scale_value.length - 1); + } + } + else if (prop.includes('maximum-scale')) { + max_msg = prop; + maximum_scale_value = pieces[1].trim(); + if (maximum_scale_value.startsWith("'") || maximum_scale_value.startsWith('"')) { + maximum_scale_value = maximum_scale_value.substring(1, maximum_scale_value.length - 1).trim(); + } + } + } + var value = Number(user_scale_value); + if (!isNaN(value)) { + if (value >= 1 || value <= -1) + user_scale_value = 'yes'; + } + var maximum_scale = 2.0; + value = Number(maximum_scale_value); + if (!isNaN(value)) { + if (value < 0) + maximum_scale = 2.0; + else + maximum_scale = value; + } + else { + if (maximum_scale_value === 'yes') + maximum_scale = 1.0; + else + maximum_scale = 0.1; + } + // user-scalable is not set to 'yes', ignore maximum_scale + if (user_scale_value !== 'yes') { + return (0, IRule_1.RulePotential)("potential_zoomable", [user_msg]); + } + // user-scalable is 'yes', but maximum_scale is too small + if (maximum_scale < 2.0) { + return (0, IRule_1.RulePotential)("potential_zoomable", [max_msg]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/noembed_content_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/noembed_content_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.noembed_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.noembed_content_exists = { + id: "noembed_content_exists", + context: "dom:noembed", + refactor: { + "Valerie_Noembed_HasContent": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "noembed_content_exists.html", + "Potential_1": "noembed_content_exists.html", + "group": "noembed_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Add descriptive text to the <noembed> element", + "group": "<noembed> elements should contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/object_text_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/object_text_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.object_text_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.object_text_exists = { + id: "object_text_exists", + context: "dom:object", + refactor: { + "WCAG20_Object_HasText": { + "pass": "pass", + "fail_no_text_alternative": "fail_no_text_alternative" + } + }, + help: { + "en-US": { + "group": "object_text_exists.html", + "pass": "object_text_exists.html", + "fail_no_text_alternative": "object_text_exists.html" + } + }, + messages: { + "en-US": { + "group": "<object> element must have a text alternative for the content rendered by the object", + "pass": "<object> element has a text alternative", + "fail_no_text_alternative": "An <object> element does not have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "8fc3b6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Detect if this object is of type text, by checking the object type in the case it is text then do not trigger this rule + if (ruleContext.hasAttribute("type") && (ruleContext.getAttribute("type")).indexOf("text") !== -1) { + return null; + } + // ignore if an explicit role is specified: including 'presentation', 'none', 'application', 'document' or 'img' + // this case will be covered in other rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + // Per ACT, ignore embedded HTML files + var data = ruleContext.getAttribute("data"); + var ext = data && typeof data === typeof "" ? data.substring(data.lastIndexOf(".")) : ""; + if (ext === ".html" || ext === ".htm") { + return null; + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //let passed = ARIAMapper.computeName(ruleContext).trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_no_text_alternative"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/page_title_exists.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/page_title_exists.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +exports.page_title_exists = { + id: "page_title_exists", + context: "dom:html", + refactor: { + "WCAG20_Doc_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "page_title_exists.html", + "Pass_0": "page_title_exists.html", + "Fail_1": "page_title_exists.html", + "Fail_2": "page_title_exists.html", + "Fail_3": "page_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "The page should have a title that correctly identifies the subject of the page", + "Pass_0": "Rule Passed", + "Fail_1": "Missing <head> element so there can be no <title> element present", + "Fail_2": "Missing <title> element in <head> element", + "Fail_3": "The <title> element is empty (no innerHTML)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "2779a5": { + "Pass_0": "pass", + "Fail_1": "pass", + "Fail_2": "fail", + "Fail_3": "fail" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // First, find the head element + var findHead = ruleContext.firstChild; + var findTitle = null; + while (findHead != null) { + if (findHead.nodeName.toLowerCase() == "head") + break; + findHead = findHead.nextSibling; + } + var possibleTitles = ruleContext.querySelectorAll("title"); + for (var idx = 0; idx < possibleTitles.length; ++idx) { + if (!CommonUtil_1.CommonUtil.getAncestor(possibleTitles[idx], ["svg"])) { + findTitle = possibleTitles[idx]; + break; + } + } + if (findHead === null) { + if (!findTitle) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + if (findTitle === null) { // don't have title second PoF + return (0, IRule_1.RuleFail)("Fail_2"); + } + // if we get here we have <head> and <title> + if (findTitle != null && CommonUtil_1.CommonUtil.getInnerText(findTitle).trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { // <title> has no innerHTML third PoF + return (0, IRule_1.RuleFail)("Fail_3"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/page_title_valid.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/page_title_valid.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.page_title_valid = { + id: "page_title_valid", + context: "dom:head dom:title", + refactor: { + "RPT_Title_Valid": { + "Pass_0": "Pass_0", + // "Fail_1": "Fail_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "page_title_valid.html", + // "Fail_1": "page_title_valid.html", + "Potential_2": "page_title_valid.html", + "group": "page_title_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + // "Fail_1": "Page <title> is empty", + "Potential_2": "Verify that using the filename as the page <title> value is descriptive", + "group": "Page <title> should be a descriptive title, rather than a filename" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var titleStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim(); + // allow .com, .net and .org + var titleStrLowercase = titleStr.toLowerCase(); + if (titleStrLowercase.includes(".com") || titleStrLowercase.includes(".net") || titleStrLowercase.includes(".org")) { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + if (titleStr.length === 0) { + // This is covered by page_title_exists + return null; //RuleFail("Fail_1"); + } + else { + var passed = !/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(titleStr); + if (!passed) { + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_focus_blur_review.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/script_focus_blur_review.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_focus_blur_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_focus_blur_review = { + id: "script_focus_blur_review", + context: "dom:*[onfocus]", + refactor: { + "WCAG20_Script_FocusBlurs": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_focus_blur_review.html", + "Potential_1": "script_focus_blur_review.html", + "group": "script_focus_blur_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify script does not remove focus from content that normally receives focus", + "group": "Scripting must not remove focus from content that normally receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.7", "3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onfocus").indexOf(".blur(") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_onclick_avoid.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/script_onclick_avoid.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_avoid = { + id: "script_onclick_avoid", + context: "dom:*[onclick]", + dependencies: ["script_onclick_misuse"], + refactor: { + "RPT_Script_OnclickHTML2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_avoid.html", + "Potential_1": "script_onclick_avoid.html", + "group": "script_onclick_avoid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that 'onclick' events are not used in script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + // If there's an aria-role specified, don't trigger this. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role")) + return (0, IRule_1.RulePass)("Pass_0"); + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = nodeName == "a" || nodeName == "area" || nodeName == "input"; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_onclick_misuse.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/script_onclick_misuse.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_misuse = { + id: "script_onclick_misuse", + context: "dom:*[onclick]", + refactor: { + "RPT_Script_OnclickHTML1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_misuse.html", + "Potential_1": "script_onclick_misuse.html", + "group": "script_onclick_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Possible use of a script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + failSubstring: { + value: [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml", + "location.href"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // If there's an aria-role specified, don't trigger this. + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role"); + // If this is an a or area, don't trigger if there's an href. + var nodeName = ruleContext.nodeName.toLowerCase(); + passed = passed || ((nodeName == "a" || nodeName == "area") && CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href")); + // If the guards failed, check to see if they're looking at links + if (!passed) { + var failSubstring = validateParams.failSubstring.value; + ; + var onclick_1 = ruleContext.getAttribute("onclick").toLowerCase(); + passed = true; + for (var i = 0; passed && i < failSubstring.length; ++i) { + passed = onclick_1.indexOf(failSubstring[i]) == -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_select_review.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/script_select_review.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_select_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_select_review = { + id: "script_select_review", + context: "dom:select", + refactor: { + "WCAG20_Select_NoChangeAction": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_select_review.html", + "Potential_1": "script_select_review.html", + "group": "script_select_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that no change of context or action occurs when selection options in this component receive focus", + "group": "No changes of context should occur when a selection value receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !ruleContext.hasAttribute("onchange") && !ruleContext.hasAttribute("onfocus"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/select_options_grouped.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/select_options_grouped.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.select_options_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.select_options_grouped = { + id: "select_options_grouped", + context: "dom:select", + refactor: { + "WCAG20_Select_HasOptGroup": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "select_options_grouped.html", + "Potential_1": "select_options_grouped.html", + "group": "select_options_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Group of related options may need <optgroup>", + "group": "Groups of related options within a selection list should be grouped with <optgroup>" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramNumOptions: { + value: 10, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + // Handle the cases where optgroup is hidden, which should trigger a violations + // but in the case that Check hidden option is set then should not trigger a violation. + var passed = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "optgroup", false, true).length > 0 || + CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "option", false, true).length <= + validateParams.paramNumOptions.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/skip_main_described.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/skip_main_described.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_described = { + id: "skip_main_described", + context: "dom:body", + dependencies: ["skip_main_exists"], + refactor: { + "WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_described.html", + "Potential_1": "skip_main_described.html", + "group": "skip_main_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that if this hyperlink skips content, the description communicates where it links to", + "group": "The description of a hyperlink used to skip content must communicate where it links to" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramSkipText: { + value: ["skip", "jump"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var links = doc.links; + // Skip link should be the first one on the page with an href attribute (i.e., links[0]) + // also if the first link is hidden then we should also trigger a violation. + if (links && links.length > 0 && VisUtil_1.VisUtil.isNodeVisible(links[0])) { + var testText = CommonUtil_1.CommonUtil.getInnerText(doc.links[0]).toLowerCase(); + for (var i = 0; !passed && i < validateParams.paramSkipText.value.length; ++i) { + passed = testText.indexOf(validateParams.paramSkipText.value[i]) != -1; + } + } + else + passed = false; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/skip_main_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/skip_main_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_exists = { + id: "skip_main_exists", + context: "dom:body", + refactor: { + "WCAG20_Body_FirstASkips_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_exists.html", + "Fail_1": "skip_main_exists.html", + "group": "skip_main_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The page does not provide a way to quickly navigate to the main content (ARIA \"main\" landmark or a skip link)", + "group": "Pages must provide a way to skip directly to the main content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + // Skip anchor should be the first one on the page with an href attribute + var testAnchor = null; + for (var i = 0; i < anchors.length; ++i) { + if (anchors[i].hasAttribute("href") && VisUtil_1.VisUtil.isNodeVisible(anchors[i])) { + testAnchor = anchors[i]; + break; + } + } + // Pull out the target id + var targetId = null; + if (testAnchor != null) { + var hrefStr = testAnchor.getAttribute("href"); + var idx = hrefStr.indexOf("#"); + if (idx != -1) { + targetId = hrefStr.substring(idx + 1); + } + } + // Determine if there is an element id or named anchor on the page with this + // target id. + if (targetId != null) { + passed = doc.getElementById(targetId) != null; + for (var i = 0; !passed && i < anchors.length; ++i) { + if (!anchors[i].hasAttribute("href") && + anchors[i].hasAttribute("name") && + anchors[i].getAttribute("name") == targetId) { + passed = true; + } + } + } + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_background_decorative.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/style_background_decorative.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_background_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_background_decorative = { + id: "style_background_decorative", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Style_BackgroundImage": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_background_decorative.html", + "Potential_1": "style_background_decorative.html", + "group": "style_background_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the CSS background image does not convey important information", + "group": "Images included by using CSS alone must not convey important information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet") { + // External stylesheet - trigger + passed = CommonUtil_1.CommonUtil.triggerOnce(ruleContext, "style_background_decorative", false); + } + if (passed && nodeName === "style" || ruleContext.hasAttribute("style")) { + var styleText = void 0; + if (nodeName === "style") + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + else + styleText = ruleContext.getAttribute("style"); + var bgMatches = styleText.match(/background:[^;]*/g); + if (bgMatches !== null) { + for (var i = 0; passed && i < bgMatches.length; ++i) + passed = bgMatches[i].indexOf("url(") === -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_before_after_review.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/style_before_after_review.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_before_after_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +/** + * Description: Trigger if :before and :after are used in CSS (Internal and External) with content + * Origin: WCAG 2.0 F87 + */ +exports.style_before_after_review = { + id: "style_before_after_review", + context: "dom:style, dom:link", + refactor: { + "WCAG20_Style_BeforeAfter": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_before_after_review.html", + "Pass_0": "style_before_after_review.html", + "Potential_1": "style_before_after_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content", + "Pass_0": "Rule Passed", + "Potential_1": "Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content" + } + }, + rulesets: [{ + // Turn off the rule due to the obsolete requirement + //id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + id: [], + num: "1.3.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + //check Internal styles + if (ruleContext.nodeName.toLowerCase() === "style") { + var css = CSSUtil_1.CSSUtil.getCSSStyle(ruleContext); + for (var i = 0; passed && i < css.length; ++i) { + // Guard against bad CSS + if (css[i].selector) { + passed = (css[i].selector.indexOf(":before") === -1 && css[i].selector.indexOf(":after") === -1) || + !("content" in css[i].values) || css[i].values["content"].trim().length === 0 || css[i].values["content"].trim() === "\"\"" + || css[i].values["content"].trim() === "\'\'" || css[i].values["content"].trim() === "none" || css[i].values["content"].trim() === "attr(x)" + || css[i].values["content"].trim() === "attr(y)"; + } + } + // check special rules in the stylesheets + if (passed) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + // check @media rules + // + // The check 'if (styleRule instanceof CSSMediaRule)' doesn't work when run in Karma(but works in DAP) + // so let's access the type directly as a workaround + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var styleMediaRule = styleRule; + var mediaRules = styleMediaRule.cssRules; + if (mediaRules) { + for (var rIndex = 0; passed && rIndex < mediaRules.length; rIndex++) { + var mRule = mediaRules[rIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + // check import rules + else if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var rules = styleImportRule.styleSheet.cssRules ? + styleImportRule.styleSheet.cssRules : + styleImportRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + // check @media rules + if (importedRule.type && importedRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = importedRule.cssRules; + if (mediaRules) { + for (var mIndex = 0; mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (importedRule.selectorText !== null && importedRule.selectorText !== undefined) { + var rule = importedRule.selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = importedRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + } + //check external styles + if (ruleContext.nodeName.toLowerCase() === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check @media rules + if (ruleFromLink.type && ruleFromLink.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = ruleFromLink.cssRules; + if (mediaRules) { + for (var mIndex = 0; passed && mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var ruleSelTxt = mRule.selectorText.toLowerCase(); + if (ruleSelTxt.indexOf(":before") !== -1 || ruleSelTxt.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (rules[rIndex].selectorText !== null && rules[rIndex].selectorText !== undefined) { + var rule = rules[rIndex].selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = rules[rIndex].style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_color_misuse.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/style_color_misuse.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_color_misuse = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_color_misuse = { + id: "style_color_misuse", + context: "dom:style, dom:*[style], dom:font[color], dom:link", + refactor: { + "RPT_Style_ColorSemantics1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_color_misuse.html", + "Pass_0": "style_color_misuse.html", + "Potential_1": "style_color_misuse.html" + } + }, + messages: { + "en-US": { + "group": "Combine color and descriptive markup to convey information", + "Pass_0": "Rule Passed", + "Potential_1": "Verify color is not used as the only visual means of conveying information" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var importRules = styleImportRule.styleSheet.cssRules ? styleImportRule.styleSheet.cssRules : styleImportRule.styleSheet.rules; + for (var rIndex = 0; rIndex < importRules.length; rIndex++) { + var iRule = importRules[rIndex]; + styleText += iRule.cssText; + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + else if (ruleContext.hasAttribute("style")) { + styleText = ruleContext.getAttribute("style").toLowerCase(); + } + else if (nodeName === "link" && //check external styles + ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && + ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var rIndex = 0; rIndex < rules.length; rIndex++) { + styleText += rules[rIndex].cssText; + } + } + catch (e) { + // Silence css access issues + } + } + } + } + var passed = true; + // Defect 1022: Find uses of 'color' and '*background*' only + var isBgUsed = styleText.match(/\bbackground\b/i); + var theColorStyleToCheck = styleText.replace(/-color/g, ""); + var isColorUsed = theColorStyleToCheck.match(/\bcolor\b/i); + if (ruleContext.hasAttribute("color") || isColorUsed || isBgUsed) { + var goodTagNames = { + "em": "", "strong": "", "cite": "", "dfn": "", + "code": "", "samp": "", "kbd": "", "var": "", "abbr": "", "acronym": "" + }; + // Color used � are there semantics involved? + passed = nodeName in goodTagNames || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, goodTagNames) !== null; + if (!passed && ruleContext.hasChildNodes()) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (!passed && nw.nextNode() && nw.node !== ruleContext) { + passed = nw.node.nodeName.toLowerCase() in goodTagNames; + } + } + } + // Trigger only once + if (!passed) { + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_color_misuse", false); + passed = triggered; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_color_misuse", true); + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_focus_visible.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/style_focus_visible.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_focus_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +exports.style_focus_visible = { + id: "style_focus_visible", + context: "dom:*", + refactor: { + "RPT_Style_HinderFocus1": { + "Potential_1": "potential_focus_not_visible" + } + }, + help: { + "en-US": { + "group": "style_focus_visible.html", + "potential_focus_not_visible": "style_focus_visible.html", + "pass_focus_visible": "style_focus_visible.html" + } + }, + messages: { + "en-US": { + "group": "The keyboard focus indicator should be visible when default border or outline is modified by CSS", + "potential_focus_not_visible": "Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'", + "pass_focus_visible": "The keyboard focus indicator is visible or is not changed from the browser default" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.7", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + skipNodes: { + value: ["table"], + type: "[string]" + }, + checkParams: { + value: ["border", "border-width", "border-style", + "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", + "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", + "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", + "outline", "outline-width", "outline-color", "outline-style"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext) || validateParams.skipNodes.value.includes(ruleContext.nodeName.toLowerCase())) { + return null; + } + // Get all styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, ["", ":focus", ":focus-visible", ":focus-within"]); + var normalStyles = allStyles[""]; // consider both user-defined and browser default + var focusStyles = []; + focusStyles.push(allStyles[":focus"]); + focusStyles.push(allStyles[":focus-visible"]); + focusStyles.push(allStyles[":focus-within"]); + // if focus style is defined + var styleObj = focusStyles[0]; + if (Object.keys(styleObj).length > 0) { + //pass if outline is not defined at all, browser will override + if (((!normalStyles["outline-width"] && !normalStyles["outline-style"]) + || (normalStyles["outline-width"] === '0px' || normalStyles["outline-style"] === 'none')) + && (!styleObj["outline-style"] || styleObj["outline-style"] !== 'none')) + return (0, IRule_1.RulePass)("pass_focus_visible"); + var noneStyle = false; + var numOtherStyle = 0; + for (var focusStyle in styleObj) { + if (validateParams.checkParams.value.includes(focusStyle)) { + /** + * failure case: + * 1. focus outline or border style is none and no other style (color or width) defined + * 2. focus outline or border style is same with the normal + * 3. size in focus is same or smaller than default + * 4. color contrast in focus is better + */ + var focusStyleValue = styleObj[focusStyle]; + var normalStyleValue = normalStyles[focusStyle]; + if (focusStyle.includes("style")) { + if (focusStyleValue === "none") + noneStyle = true; + else + noneStyle = false; + if (normalStyleValue && focusStyleValue !== "none" && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("width")) { + numOtherStyle++; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thin') + focusStyleValue = '1px'; + else if (focusStyleValue === 'medium') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thick') + focusStyleValue = '3px'; + if (normalStyleValue) { + if (normalStyleValue === 'initial') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thin') + normalStyleValue = '1px'; + else if (normalStyleValue === 'medium') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thick') + normalStyleValue = '3px'; + } + focusStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(focusStyleValue, ruleContext); + normalStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(normalStyleValue, ruleContext); + if (focusStyleValue == 0 || focusStyleValue <= normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("color")) { + numOtherStyle++; + // get the element bg color + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(ruleContext); + if (colorCombo === null) + continue; + var bg = colorCombo.bg; + if (!bg) + continue; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = 'black'; + if (normalStyleValue && normalStyleValue === 'initial') + normalStyleValue = 'black'; + // get the border/outline color as fg colors + focusStyleValue = ColorUtil_1.ColorUtil.Color(focusStyleValue); + normalStyleValue = ColorUtil_1.ColorUtil.Color(normalStyleValue); + if (focusStyleValue === null || normalStyleValue === null) + continue; + //get the border/outline color contrast ratios + var focusRatio = focusStyleValue.contrastRatio(bg); + var normalRatio = normalStyleValue.contrastRatio(bg); + if (focusRatio < 3.0 || focusRatio <= normalRatio) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + //other + numOtherStyle++; + if (normalStyleValue != null && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + // warn if a border/outline focus style is 'none' and noe other (color and/or width) is defined + if (noneStyle && numOtherStyle === 0) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + // no focus style defined + // warn if normal style is defined and is not "none" + for (var normalStyle in normalStyles) { + if (validateParams.checkParams.value.includes(normalStyle)) { + var normalStyleValue = normalStyles[normalStyle]; + // ignore if border or outline style is "none" + if (normalStyleValue !== 'none') + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + return (0, IRule_1.RulePass)("pass_focus_visible"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_highcontrast_visible.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/style_highcontrast_visible.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_highcontrast_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_highcontrast_visible = { + id: "style_highcontrast_visible", + context: "dom:style, dom:link, dom:*[style]", + refactor: { + "RPT_Style_Trigger2": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_highcontrast_visible.html", + "Manual_1": "style_highcontrast_visible.html", + "group": "style_highcontrast_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content", + "group": "Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "link" && + (!ruleContext.hasAttribute("rel") || ruleContext.getAttribute("rel").toLowerCase() !== "stylesheet")) + return (0, IRule_1.RulePass)("Pass_0"); + if (nodeName !== "style" && nodeName !== "link" && + ruleContext.hasAttribute("style") && ruleContext.getAttribute("style").trim().length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_highcontrast_visible", false); + var passed = triggered; + // Packages.java.lang.System.out.println(triggered); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_highcontrast_visible", true); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_hover_persistent.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/style_hover_persistent.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_hover_persistent = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_hover_persistent = { + id: "style_hover_persistent", + context: "dom:style, dom:*[style], dom:*", + help: { + "en-US": { + "Pass_0": "style_hover_persistent.html", + // "Pass_1": "style_hover_persistent.html", + "Pass_2": "style_hover_persistent.html", + "Potential_1": "style_hover_persistent.html", + "Potential_2": "style_hover_persistent.html", + "Potential_3": "style_hover_persistent.html", + "group": "style_hover_persistent.html" + } + }, + messages: { + "en-US": { + "Pass_0": "the hover: pseudo-class is not used to display content", + // "Pass_1": "content displayed via the :hover pseudo-class is a direct child of the trigger element", + "Pass_2": "content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element", + "Potential_1": "Confirm the pointer can be positioned over the displayed element, not just the trigger", + "Potential_2": "Confirm the pointer can be positioned over all the information displayed on hover", + "Potential_3": "Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger", + "group": "The pointer should be able to move over content displayed on hover" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["1.4.13"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var pass0 = false; + var pass1 = false; + var pass2 = false; // never happen + var potential1 = false; + var potential2 = false; + var potential3 = false; + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + // console.log("RULE RUN ******************"); + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + // console.log("ruleContext.ownerDocument.styleSheets.length = "+ruleContext.ownerDocument.styleSheets.length); + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; ++sIndex) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules.length = "+styleRules.length); + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + // console.log("**********"); + // console.log("********** FOR LOOP styleRuleIndex = "+styleRuleIndex); + var foundHover = false; + var hoverElement = ""; + var plusCombinator = false; + var tildeCombinator = false; + var afterCombinatorElement = ""; + var afterCombinatorElementDisplay = false; + var afterCombinatorElementDisplayValue = false; + var afterCombinatorElementHover = false; + var supportingElement = false; + var supportingHover = false; + var supportingHoverElementDisplayProperty = false; + var supportingHoverElementDisplayValue = false; + var adjacentPlusSibling = false; + var adjacentTildeMultipleSibling = false; + var styleRule = styleRules[styleRuleIndex]; + var ruleText = styleRules[styleRuleIndex].cssText; + // console.log("styleRules["+styleRuleIndex+"] = "+ruleText); + // 1. Check for :hover + if (ruleText.match(/:hover/g)) { + foundHover = true; + // console.log("1. found :hover = "+ foundHover); + // 2. Get hover element + hoverElement = ruleText.split(":")[0]; + // console.log("2. found element that goes with :hover = "+hoverElement); + } + else { + // console.log("1. No hover on css element so skip this rule"); + continue; // if no :hover skip this rule + } + // 3a. Check for css combinator + + // 4a. if so do we have an after combinator element + var plusTempStr = ruleText.substring(ruleText.indexOf("+") + 1); + plusTempStr = plusTempStr.trim(); + if (ruleText.match(/:hover \+/g) || ruleText.match(/:hover\+/g)) { + plusCombinator = true; + // console.log("3a. Found plusCombinator = "+ plusCombinator); + afterCombinatorElement = plusTempStr.split(" ")[0]; + // console.log("4a. Found plus afterCombinatorElement = "+afterCombinatorElement); + } + // 3b. Check for css combinator + + // 4b. if so do we have an after combinator element + if (ruleText.match(/:hover \~/g) || ruleText.match(/:hover\~/g)) { + // console.log("match = "+ruleText.match(":hover \~")); + tildeCombinator = true; + // console.log("3b. Found tildeCombinator = "+ tildeCombinator); + var plusTempStr_1 = ruleText.substring(ruleText.indexOf("~") + 1); + plusTempStr_1 = plusTempStr_1.trim(); + afterCombinatorElement = plusTempStr_1.split(" ")[0]; + // console.log("4b. Found tilde afterCombinatorElement = "+afterCombinatorElement); + } + if (!plusCombinator && !tildeCombinator) { + // NO plusCombinator or tildeCombinator so skip this rule + // console.log("NO plusCombinator or tildeCombinator so PASS"); + // console.log("**** REPORT PASS 0 HERE"); + return (0, IRule_1.RulePass)("Pass_0"); // JCH: should we have a N/A pass + } + // So now we have a css element with hover - element:hover so we have problems + // to check + // 5. Check if the after combinator element has display: property + // 6. Check if display property is not none + if (afterCombinatorElement) { + // get index of display: + // console.log("plusTempStr = "+plusTempStr); + var index = plusTempStr.indexOf("display:"); + if (index) { + afterCombinatorElementDisplay = true; + // console.log("5. Found afterCombinatorElementDisplay = "+afterCombinatorElementDisplay); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + afterCombinatorElementDisplayValue = true; + // console.log("6. Found afterCombinatorElementDisplayValue not none = "+afterCombinatorElementDisplayValue); + } + else { + // console.log("afterCombinatorElementDisplayValue === none"); + // console.log("**** PUT POTENTIAL 0 HERE"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElementDisplay so skip this rule"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElement so skip this rule"); + continue; + } + if (afterCombinatorElementDisplayValue) + if (sheet && sheet.ownerNode === ruleContext) { + // console.log("**** At this point we have verified that we have a css element with a hover of the format span:hover + div { display: block; } with all the proper properties and values"); + // NOTE: At this point we have verified that we have a css element with a hover + // of the format span:hover + div { display: block; } + // with all the proper properties and values + try { + var styleRules2 = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules2.length = "+styleRules2.length); + for (var styleRuleIndex2 = 0; styleRuleIndex2 < styleRules2.length; styleRuleIndex2++) { + // Check rule for afterCominatorElement:hover + // If find afterCombinatorElement:hover see if rule has property display: value where + // value != none + // console.log("**********"); + // console.log("********** 2nd FOR styleRuleIndex2 = "+styleRuleIndex2); + var ruleText2 = styleRules[styleRuleIndex2].cssText; + // console.log("ruleText2 = ", ruleText2); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // Check all supporting elements for margin property + // If find margin STOP and REPORT ERROR + var regExString = afterCombinatorElement + " {"; + var trimRuleText2 = ruleText2.trim(); + var regIndex = trimRuleText2.indexOf(regExString); + var afterCombinatorElementProperties = trimRuleText2.slice(regIndex).trim(); + //if (!afterCombinatorElementProperties.match(/margin/g)) { + if (!trimRuleText2.match(/margin/g)) { + // console.log("No margin problem so continue on..."); + // do we have a supporting element css definitions + var supportingHoverElement = ruleText2.split(":")[0]; + supportingHoverElement = supportingHoverElement.split(" ")[0]; + // console.log("supportingHoverElement = "+supportingHoverElement); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // NEED TO CHECK FOR afterCominatorElement:hover in ONE STEP + if (supportingHoverElement === afterCombinatorElement && ruleText2.match(/:hover/g)) { + // console.log("7. Found supporting hover element same as afterCombinatorElement") + // 7. Found supporting hover element same as afterCombinatorElement + supportingElement = true; + // does supporting element have hover + // console.log("8. Supporting element has hover also = "+ foundHover); + // 8. Supporting element has hover also + supportingHover = true; + var index = ruleText2.indexOf("display:"); + // console.log("index = "+index); + if (index) { + // 9. Found supportingHoverElementDisplayProperty + supportingHoverElementDisplayProperty = true; + // console.log("9. Found supportingHoverElementDisplayProperty = "+supportingHoverElementDisplayProperty); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + // 10. Found supportingHoverElementDisplayValue not none + supportingHoverElementDisplayValue = true; + // console.log("10. Found supportingHoverElementDisplayValue not none = "+supportingHoverElementDisplayValue); + // Get list of hover elements and next sibling for + + // For + there must be at least one ADJACENT sibling + if (hoverElement !== "" && plusCombinator) { + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // console.log("hoverElementList[0].tagName = "+hoverElementList[0].tagName); + // Get adjacent sibling + // console.log("Adjacent sibling = "+hoverElementList[0].nextElementSibling.tagName); + // console.log("afterCombinatorElement.toUpperCase() = "+afterCombinatorElement.toUpperCase()); + if (afterCombinatorElement.toUpperCase() === hoverElementList[0].nextElementSibling.tagName) { + // console.log("11a. Hover with plus has adjacent sibling.") + // 11a. Hover with plus has adjacent sibling. + adjacentPlusSibling = true; + // At this point we have verified a supporting afterCombinatorElement css rule that contains hover and display property that is not equal to none and has a hover element in the body with an adjacent sibling + // console.log("**** REPORT PASS 1 HERE"); + pass0 = true; + continue; + } + } + else if (plusCombinator) { + // console.log("11a. Main hover with + combinator has no adjacent sibling"); + if (!potential1) { + // console.log("**** PUT POTENTIAL 1 HERE"); + potential1 = true; + break; + } + continue; + } + // Get list of hover elements and determine if there are 2 or more adjacent siblings for ~ + // For ~ there must be at least one ADJACENT sibling + if (hoverElement !== "" && tildeCombinator) { + // console.log("hoverElement.toUpperCase() = "+hoverElement.toUpperCase()); + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // Check for two or more adjacent siblings + var siblings = []; + var sibling = hoverElementList[0].nextElementSibling; + do { + // console.log("sibling.tagName = "+sibling.tagName); + if (sibling.tagName === afterCombinatorElement.toUpperCase()) { + siblings.push(sibling); + } + else { + break; + } + } while ((sibling = sibling.nextElementSibling)); + var siblingCount = siblings.length; + // console.log("siblingCount = "+siblingCount); + // JCH TODO: what if sibling count 0 + if (siblingCount === 1) { + // console.log("11b. Hover with tilde and one adjacent sibling"); + adjacentTildeMultipleSibling = true; + // console.log("**** REPORT PASS 2 HERE"); + return (0, IRule_1.RulePass)("Pass_2"); + } + else if (siblingCount > 1) { + // console.log("Main hover with ~ combinator has two or more siblings"); + if (!potential2) { + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + } + } + else if (plusCombinator) { + // supportingHoverElementDisplayValue + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a display property + } + else if (plusCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO tilde supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a supportingElement:hover + } + else if (plusCombinator) { + // if we make it to the last rule and supportingElement is still false => potential1 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO plus supportingElement:hover"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingElement is still false => potential2 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO tilde supportingElement:hover"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + continue; + } + } + } + else { + // console.log("There is a margin in the supporting element"); + if (!potential3) { + // console.log("**** PUT POTENTIAL 3 HERE"); + potential3 = true; + return (0, IRule_1.RulePotential)("Potential_3"); + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + // console.log("----------------------"); + // console.log("pass0 = "+pass0); + // console.log("pass1 = "+pass1); + // console.log("pass2 = "+pass2); + // console.log("potential1 = "+potential1); + // console.log("potential2 = "+potential2); + // console.log("potential3 = "+potential3); + if (pass0) + return (0, IRule_1.RulePass)("Pass_0"); + // if (pass1) return RulePass("Pass_2"); // Doesn't trigger + // if (pass2) return RulePass("Pass_3"); // Doesn't trigger + if (potential1) + return (0, IRule_1.RulePotential)("Potential_1"); + if (potential2) + return (0, IRule_1.RulePotential)("Potential_2"); + if (potential3) + return (0, IRule_1.RulePotential)("Potential_3"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_viewport_resizable.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/style_viewport_resizable.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_viewport_resizable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +/** + * Description: Trigger when viewport units are used for font size. + * Origin: Various + */ +exports.style_viewport_resizable = { + id: "style_viewport_resizable", + context: "dom:link, dom:style, dom:*[style]", + refactor: { + "WCAG21_Style_Viewport": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_viewport_resizable.html", + "Pass_0": "style_viewport_resizable.html", + "Potential_1": "style_viewport_resizable.html" + } + }, + messages: { + "en-US": { + "group": "Text must scale up to 200% without loss of content or functionality", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that text sized using viewport units can be resized up to 200%" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.4.4", "1.4.10"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var thePattern = /\d+(vw|vh|vmin|vmax)/gi; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "style") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var rule = styleRules[styleRuleIndex]; + if (rule.type && rule.type === 1 /* CSSRule.STYLE_RULE */) { + var styleRule = rule; + if (styleRule.style['fontSize']) { + var fontSize = styleRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + // check import rules + else if (rule.type && rule.type === 3 /* CSSRule.IMPORT_RULE */ && rule.styleSheet) { + var importRule = rule; + var rules = importRule.styleSheet.cssRules ? importRule.styleSheet.cssRules : importRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + if (importedRule.type && importedRule.type === 1 /* CSSRule.STYLE_RULE */) { + if (importedRule.style['fontSize']) { + var fontSize = importedRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else if (nodeName === "link") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check rules + if (ruleFromLink.type && ruleFromLink.type === 1 /* CSSRule.STYLE_RULE */) { + if (ruleFromLink.style['fontSize']) { + var fontSize = ruleFromLink.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else { + var styleValue = ruleContext.getAttribute('style'); + if (styleValue) { + var stylePattern = /font-size:\s*\d+(vw|vh|vmin|vmax)/gi; + var found = styleValue.match(stylePattern); + if (found) { + passed = false; + } + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/svg_graphics_labelled.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/svg_graphics_labelled.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.svg_graphics_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.svg_graphics_labelled = { + id: "svg_graphics_labelled", + context: "dom:svg", + help: { + "en-US": { + "group": "svg_graphics_labelled.html", + "pass": "svg_graphics_labelled.html", + "fail_acc_name": "svg_graphics_labelled.html" + } + }, + messages: { + "en-US": { + "group": "A non-decorative SVG element must have an accessible name", + "pass": "The SVG element has an accessible name", + "fail_acc_name": "The SVG element has no accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "7d6734": { + "pass": "pass", + "fail_acc_name": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_acc_name"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_aria_descendants.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/table_aria_descendants.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_aria_descendants = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_aria_descendants = { + id: "table_aria_descendants", + context: "aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]", + help: { + "en-US": { + "group": "table_aria_descendants.html", + "explicit_role": "table_aria_descendants.html" + } + }, + messages: { + "en-US": { + "group": "Table structure elements cannot specify an explicit 'role' within table containers", + "explicit_role": "An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + // cache the result + if (parentRole === null || parentRole.length === 0) + return; + // ignore the redundancy cases: reported in the aria_role_redundant rule + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + var explicitRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + ; + if (implicitRoles && implicitRoles.length > 0 && explicitRoles && explicitRoles.length > 0 + && explicitRoles.some(function (item) { return implicitRoles.includes(item); })) + return; + return (0, IRule_1.RuleFail)("explicit_role", [context["dom"].node.nodeName.toLowerCase(), parentRole[0].role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_caption_empty.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/table_caption_empty.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_empty = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_empty = { + id: "table_caption_empty", + context: "dom:caption", + refactor: { + "Valerie_Caption_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_empty.html", + "Fail_1": "table_caption_empty.html", + "group": "table_caption_empty.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <table> element has an empty <caption> element", + "group": "A <caption> element for a <table> element must contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_caption_nested.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/table_caption_nested.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_nested = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_nested = { + id: "table_caption_nested", + context: "dom:caption", + refactor: { + "Valerie_Caption_InTable": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_nested.html", + "Fail_1": "table_caption_nested.html", + "group": "table_caption_nested.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<caption> element is not nested inside a <table> element", + "group": "The <caption> element must be nested inside the associated <table> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table") != null; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/table_headers_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_exists = { + id: "table_headers_exists", + context: "dom:table", + refactor: { + "RPT_Table_DataHeadingsAria": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_exists.html", + "Fail_1": "table_headers_exists.html", + "group": "table_headers_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Table has no headers identified", + "group": "Data table must identify headers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If this is a layout table or there are no rows, the rule does not apply. + var rows = ruleContext.rows; + if (!TableUtil_1.TableUtil.isDataTable(ruleContext) || rows === null || rows.length === 0) + return null; + var passed = TableUtil_1.TableUtil.tableHeaderExists(ruleContext); + if (passed === null) + return; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_ref_valid.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_headers_ref_valid.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +exports.table_headers_ref_valid = { + id: "table_headers_ref_valid", + context: "dom:td[headers], dom:th[headers]", + help: { + "en-US": { + "Pass_0": "table_headers_ref_valid.html", + "Fail_1": "table_headers_ref_valid.html", + "Fail_2": "table_headers_ref_valid.html", + "Fail_3": "table_headers_ref_valid.html", + "Fail_4": "table_headers_ref_valid.html", + "group": "table_headers_ref_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document", + "Fail_2": "The 'headers' attribute value \"{0}\" refers to itself", + "Fail_3": "The 'headers' attribute value \"{0}\" does not refer to a cell in the same table", + "Fail_4": "The 'headers' attribute value \"{0}\" does not refer to a cell indicated with <th> or a role of \"columnheader\" or \"rowheader\"", + "group": "The 'headers' attribute should refer to a valid cell in the same table" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ["a25f45"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + var parentRole = ARIAMapper_1.ARIAMapper.nodeToRole(parentTable); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !VisUtil_1.VisUtil.isNodeVisible(parentTable) || !["table", "grid"].includes(parentRole)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var doc = ruleContext.ownerDocument; + var value = ruleContext.getAttribute("headers"); + if (!value) + return null; + var ids = value.split(" "); + var invalidHeaderValues = []; + var sameNodeHeaderValues = []; + var sameTableHeaderValues = []; + var invalidElemHeaderValues = []; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + if (id.trim() === '') + continue; + var elem = doc.getElementById(id); + if (!elem) + invalidHeaderValues.push(id); + else if (DOMUtil_1.DOMUtil.sameNode(elem, ruleContext)) + sameNodeHeaderValues.push(id); + else if (!DOMUtil_1.DOMUtil.isInSameTable(elem, ruleContext)) + sameTableHeaderValues.push(id); + else { + var elemName = elem.nodeName.toLowerCase(); + if (elemName !== 'th') { + var roles = AriaUtil_1.AriaUtil.getRoles(elem, true); + if (!roles.includes('columnheader') && !roles.includes('rowheader')) + invalidElemHeaderValues.push(id); + } + } + } + var results = []; + if (invalidHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_1", [invalidHeaderValues.toString()])); + if (sameNodeHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_2", [sameNodeHeaderValues.toString()])); + if (sameTableHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_3", [sameTableHeaderValues.toString()])); + if (invalidElemHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_4", [invalidElemHeaderValues.toString()])); + if (results.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return results; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_related.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/table_headers_related.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_related = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_related = { + id: "table_headers_related", + context: "dom:td, dom:th", + refactor: { + "Valerie_Table_DataCellRelationships": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_related.html", + "Fail_1": "table_headers_related.html", + "group": "table_headers_related.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Complex table does not have headers for each cell properly defined with 'header' or 'scope'", + "group": "For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !TableUtil_1.TableUtil.isComplexDataTable(parentTable)) + return null; + // If this table hasn't been preprocessed, process it. + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null) === null) { + // Build a grid that's actually usable (rowspan and colspan elements are duplicated) + // This builds a real 2d table array. + var grid = []; + for (var i = 0; i < parentTable.rows.length; ++i) { + var row = parentTable.rows[i]; + if (!grid[i]) + grid[i] = []; + for (var j = 0; j < row.cells.length; ++j) { + var cell = row.cells[j]; + CacheUtil_1.CacheUtil.setCache(cell, "table_headers_related", i + ":" + j); + var width = parseInt(cell.getAttribute("colspan")); + if (!width) + width = 1; + var height = parseInt(cell.getAttribute("rowspan")); + if (!height) + height = 1; + var gX = 0; + while (grid[i][gX]) + gX += 1; + for (var k = 0; k < height; ++k) { + if (!grid[i + k]) + grid[i + k] = []; + for (var l = 0; l < width; ++l) { + grid[i + k][gX + l] = cell; + } + } + } + } + // Iterate through the table grid and record headers that point to cells and + // cells that are pointed to by headers + var doc = ruleContext.ownerDocument; + var lookup = {}; + var scopedCols = {}; + for (var i = 0; i < grid.length; ++i) { + var rowScoped = false; + for (var j = 0; j < grid[i].length; ++j) { + var gridCell = grid[i][j]; + var gridNodeName = gridCell.nodeName.toLowerCase(); + if (gridNodeName == "th") { + if (gridCell.getAttribute("scope") == "row") { + rowScoped = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "rowgroup") { + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "col") { + scopedCols[j] = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + // Headers can refer to other headers + if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + else if (gridNodeName == "td") { + if (rowScoped || scopedCols[j]) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + } + } + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related", lookup); + } + var rcInfo = CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null); + var tInfo = CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related", null); + var passed = rcInfo && tInfo && rcInfo in tInfo; + if (!passed && rcInfo === "0:0" && + CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim().length == 0) { + // We don't test if it's the upper-left cell and it's empty + return null; + } + // If the table has no th's, it may just be that this was supposed to be a layout + // table, which introduces a lot of noise. In that case, only trigger this error + // once per table. + if (!passed && parentTable.getElementsByTagName("th").length == 0) { + if (CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related_TrigOnce", false) === true) { + passed = true; + } + else { + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related_TrigOnce", true); + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_layout_linearized.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_layout_linearized.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_layout_linearized = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_layout_linearized = { + id: "table_layout_linearized", + context: "dom:table", + refactor: { + "RPT_Table_LayoutTrigger": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_layout_linearized.html", + "Potential_1": "table_layout_linearized.html", + "group": "table_layout_linearized.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify table is not being used to format text content in columns unless the table can be linearized", + "group": "Avoid using tables to format text documents in columns unless the table can be linearized" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = !TableUtil_1.TableUtil.isLayoutTable(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_scope_valid.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/table_scope_valid.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_scope_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.table_scope_valid = { + id: "table_scope_valid", + context: "dom:td[scope], dom:th[scope]", + refactor: { + "WCAG20_Table_Scope_Valid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "table_scope_valid.html", + "Fail_1": "table_scope_valid.html", + "Fail_2": "table_scope_valid.html", + "group": "table_scope_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Value provided is invalid for the 'scope' attribute", + "Fail_2": "The 'scope' attribute should only be used on a <th> element", + "group": "Value for 'scope' attribute must be \"row\", \"col\", \"rowgroup\", or \"colgroup\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === 'td') + return (0, IRule_1.RuleFail)("Fail_2"); + //only continue for 'th' + var scopeVal = ruleContext.getAttribute("scope").trim().toLowerCase(); + var passed = /^(row|col|rowgroup|colgroup)$/.test(scopeVal); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_structure_misuse.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/table_structure_misuse.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_structure_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_structure_misuse = { + id: "table_structure_misuse", + context: "dom:table", + refactor: { + "WCAG20_Table_Structure": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_structure_misuse.html", + "Fail_1": "table_structure_misuse.html", + "group": "table_structure_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with \"presentation\" role or \"none\" role has structural element(s) and/or attribute(s) '{1}'", + "group": "Table elements with 'role=\"presentation\" or 'role=\"none\" should not have structural elements or attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - OUT OF SCOPE hidden in context + if (TableUtil_1.TableUtil.isDataTable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.isNodeInGrid(ruleContext)) + return null; + var errorNodes = []; + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "summary")) + errorNodes.push(ruleContext); + var captionElems = ruleContext.getElementsByTagName("caption"); + for (var i = 0; i < captionElems.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(captionElems[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(captionElems[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(captionElems[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var thNodes = ruleContext.getElementsByTagName("th"); + for (var i = 0; i < thNodes.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(thNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(thNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(thNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var tdNodes = ruleContext.getElementsByTagName("td"); + for (var i = 0; i < tdNodes.length; ++i) { + if ((tdNodes[i].hasAttribute("scope") || tdNodes[i].hasAttribute("headers")) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(tdNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(tdNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + // Get the node name for the rule context element in this case it will always be table + var currentElementToken = ruleContext.nodeName.toLowerCase(); + // Construct a new array which will contan only the element tag for the violation elements + var structuralElementTokens = new Array(); + // Construct a seen hash that will keep trask of all the elements that were already added to the token array, to make sure + // we do not duplicate any of the elements. Duplicate element tags in the token message looks bad and confusing. + var seen = {}; + // Loop through all the violating structural elements and extract the element tag to be used as a token + for (var i = 0; i < errorNodes.length; i++) { + // Get the node name (tag name) for the violating structural element + var nodeName = errorNodes[i].nodeName.toLowerCase(); + // Only need to add the violating element once + if (!seen.hasOwnProperty(nodeName)) { + // Since we are adding the token as elements and attributes we need to handle + // the summary attribute on the ruleContext (table). We only add summary once, same as + // for elements to avoid duplication in the message. (Summary should not duplicate, but just in case) + if (nodeName == "table" && !seen.hasOwnProperty["summary"]) { + // Mark this as a new attribute + seen["summary"] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push("summary"); + } + else { + // Mark this as a new element + seen[nodeName] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push(nodeName); + } + } + } + // We need to take the array of structural elements and join them with a comma and a space to make grammatical correct in + // the message. + var structuralElementTokensStr = structuralElementTokens.join(", "); + //return new ValidationResult(errorNodes.length == 0, errorNodes, '', '', [currentElementToken, structuralElementTokens]); + if (errorNodes.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [currentElementToken, structuralElementTokensStr]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_summary_redundant.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_summary_redundant.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_summary_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.table_summary_redundant = { + id: "table_summary_redundant", + context: "dom:table", + refactor: { + "WCAG20_Table_CapSummRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_summary_redundant.html", + "Fail_1": "table_summary_redundant.html", + "group": "table_summary_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The table summary duplicates the caption", + "group": "The table summary must not duplicate the caption" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pofId; + var passed = true; + var sumStr; + if (ruleContext.hasAttribute("summary")) { + pofId = 0; + sumStr = ruleContext.getAttribute("summary").trim().toLowerCase(); + } + else if (ruleContext.hasAttribute("aria-describedby")) { + pofId = 1; + var summaryNodeIds = ruleContext.getAttribute("aria-describedby").split(" "); + var summaryNodeConcat = ""; + for (var i = 0; i < summaryNodeIds.length; i++) { + var summaryNodeId = summaryNodeIds[i]; + if (summaryNodeId) { + var summaryNode = fragment_1.FragmentUtil.getById(ruleContext, summaryNodeId); + if (summaryNode && !DOMUtil_1.DOMUtil.sameNode(summaryNode, ruleContext)) { + summaryNodeConcat += " " + CommonUtil_1.CommonUtil.getInnerText(summaryNode).trim().toLowerCase(); + } + } + } + sumStr = summaryNodeConcat; + } + if (!sumStr) { + return null; + } + else { + var capElems = ruleContext.getElementsByTagName("caption"); + if (capElems.length === 0) { + return null; + } + else if (sumStr.length > 0) { + var capStr = CommonUtil_1.CommonUtil.getInnerText(capElems[0]).trim().toLowerCase(); + if (!sumStr.includes(capStr)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/target_spacing_sufficient.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/target_spacing_sufficient.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.target_spacing_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.target_spacing_sufficient = { + id: "target_spacing_sufficient", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "target_spacing_sufficient.html", + "pass_spacing": "target_spacing_sufficient.html", + "pass_sized": "target_spacing_sufficient.html", + "pass_inline": "target_spacing_sufficient.html", + "pass_default": "target_spacing_sufficient.html", + "violation_spacing": "target_spacing_sufficient.html", + "recommendation_inline": "target_spacing_sufficient.html", + "potential_overlap": "target_spacing_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The target must be sufficiently sized or spaced from other targets", + "pass_spacing": "The target's spacing from other targets is sufficient", + "pass_sized": "The target’s size is more than 24 CSS pixels", + "pass_inline": "The target is in a sentence or its size is otherwise constrained by the line-height of non-target text", + "pass_default": "The target's size is determined by the user agent and is not modified by the author", + "violation_spacing": "Undersized target \"{0}\" does not have sufficient spacing of 12 CSS pixels from another target \"{1}\"", + "recommendation_inline": "Confirm the inline target \"{0}\" is sufficiently spaced from another inline target \"{1}\"", + "potential_overlap": "Ensure the overlapped target \"{0}\" meets a minimum target size or has sufficient spacing from the overlapping target \"{1}\"" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["pass_spacing", "pass_sized", "pass_inline", "pass_default", "violation_spacing", "potential_overlap"] + }, + { + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["recommendation_inline"] + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); //context["dom"].bounds; + if (!bounds) + return null; + // ignore hidden, non-target + if (!CommonUtil_1.CommonUtil.isTarget(ruleContext)) + return null; + if (bounds.height >= 24 && bounds.width >= 24) + return (0, IRule_1.RulePass)("pass_sized"); + // check inline element: without text in the same line + var status = CSSUtil_1.CSSUtil.getInlineStatus(ruleContext); + if (status === null) + return null; + if (status.inline) { + if (status.text) { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_inline"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + else { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_default"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + } + else { + // ignore browser default + if (CSSUtil_1.CSSUtil.isTargetBrowserDefault(ruleContext)) + return (0, IRule_1.RulePass)("pass_default"); + } + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var cStyle = getComputedStyle(ruleContext); + if (cStyle === null) + return null; + var zindex = cStyle.zIndex; + if (!zindex || isNaN(Number(zindex))) + zindex = "0"; + // Get the list of target elements + var targetElems = CacheUtil_1.CacheUtil.getCache(doc.documentElement, "target_spacing_sufficient::targets", undefined); + if (typeof targetElems === "undefined") { + targetElems = []; + //select all elements except itself and descendants + var elems = doc.querySelectorAll('body *:not(script):not(style)'); + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + if (CommonUtil_1.CommonUtil.isTarget(elem)) { + targetElems.push(elem); + } + } + CacheUtil_1.CacheUtil.setCache(doc.documentElement, "target_spacing_sufficient::targets", targetElems); + } + if (!targetElems || targetElems.length === 0) + return; + var before = true; + var minX = 24; + var minY = 24; + var adjacentX = null; + var adjacentY = null; + var checked = []; //contains a list of elements that have been checked so their descendants don't need to be checked again + var _loop_1 = function (i) { + var elem = targetElems[i]; + /** + * the nodes returned from querySelectorAll is in document order + * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later + * filter out the elements that’re descendant or ancestors of the target element, nor descendant of the target element's siblings + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + //the next node in elems will be after the target node (ruleContext). + before = false; + return "continue"; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // ignore ascendants of the element, or itself or its ascendant already checked + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || checked.some(function (item) { return item.contains(elem); })) + return "continue"; + var bnds = mapper.getUnadjustedBounds(elem); + if (!bnds) + return "continue"; + var zStyle = getComputedStyle(elem); + var z_index = '0'; + if (zStyle) { + z_index = zStyle.zIndex; + if (!z_index || isNaN(Number(z_index))) + z_index = "0"; + } + // case 2: the element overlaps the target entirely + // note when a link is inline with other target, if the link text wraps in another line in a given viewport, + // the bounds of the link may cover and the entire two lines, causing the other tagets to be overlapped, see two links in the test case: element_inline.html + if (bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height + && bnds.left + bnds.width >= bounds.left + bounds.width) { + // if the target on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: null }; + } + else + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 3: if the target overlaps the element entirely + if (bounds.top <= bnds.top && bounds.left <= bnds.left && bounds.top + bounds.height >= bnds.top + bnds.height + && bounds.left + bounds.width >= bnds.left + bnds.width) { + // if the element on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else // the target on top + return { value: (0, IRule_1.RuleFail)("violation_spacing", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 4: the element overlaps partially with the target + if ((((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top + bounds.height <= bnds.top && bounds.top + bounds.height >= bnds.top + bnds.height)) + && ((bounds.left > bnds.left && bounds.left < bnds.left + bnds.width) || (bnds.left > bounds.left && bnds.left < bounds.left + bounds.width))) + || (((bounds.top > bnds.top && bounds.top < bnds.top + bnds.height) || (bnds.top > bounds.top && bnds.top < bounds.top + bounds.height)) + && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left + bounds.width >= bnds.left && bounds.left + bounds.width <= bnds.left + bnds.width)))) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else { // no overlap with the elem, though may overlap withe other elements + var disX = 24; + var disY = 24; + // the element is in the horizontally same row with the target + if (bounds.width < 24 && ((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top <= bnds.top && bounds.top + bounds.height > bnds.top))) + disX = Math.min(Math.abs(bounds.left - bnds.left), Math.abs(bounds.left - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - bnds.left)); + // the element is in the vertically same column with the target + if (bounds.height < 24 && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left <= bnds.left && bounds.left + bounds.width > bnds.left))) + disY = Math.min(Math.abs(bounds.top - bnds.top), Math.abs(bounds.top - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - bnds.top)); + if (disX < minX) { + minX = disX; + adjacentX = elem; + } + if (disY < minY) { + minY = disY; + adjacentY = elem; + } + } + checked.push(elem); + }; + for (var i = 0; i < targetElems.length; i++) { + var state_1 = _loop_1(i); + if (typeof state_1 === "object") + return state_1.value; + } + // case 5: no overlap + insufficient target size. check spacing + if (Math.round(bounds.width / 2) + minX < 12 || Math.round(bounds.height / 2) + minY < 12) { + if (Math.round(bounds.width / 2) + minX < Math.round(bounds.height / 2) + minY) + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentX.nodeName.toLowerCase()]); + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentY.nodeName.toLowerCase()]); + } + else + return (0, IRule_1.RulePass)("pass_spacing"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_block_heading.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/text_block_heading.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_block_heading = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_block_heading = { + id: "text_block_heading", + context: "dom:p, dom:div, dom:br", + refactor: { + "RPT_Block_ShouldBeHeading": { + // "Pass_0": "pass", + "Potential_1": "potential_heading" + } + }, + help: { + "en-US": { + // "pass": "text_block_heading.html", + "potential_heading": "text_block_heading.html", + "group": "text_block_heading.html" + } + }, + messages: { + "en-US": { + // "pass": "Heading text uses a heading element or role", + "potential_heading": "Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role", + "group": "Heading text should use a heading element or role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script"]) !== null) + return null; + var validateParams = { + numWords: { + value: 10, + type: "integer" + } + }; + var bodyFont = 0; + var body = ruleContext.ownerDocument.getElementsByTagName("body"); + if (body != null) { + var bodyStyle = getComputedStyle(body[0]); + if (bodyStyle) + bodyFont = CSSUtil_1.CSSUtil.getPixelsFromStyle(bodyStyle['font-size'], body); + } + var numWords = validateParams.numWords.value; + var wordsSeen = 0; + var wordStr = []; + var emphasizedText = false; + var nw = new DOMWalker_1.DOMWalker(ruleContext); + nw.nextNode(); + var passed = false; + while (!passed && + nw.nextNode() && + nw.node !== ruleContext && + nw.node !== DOMWalker_1.DOMWalker.parentNode(ruleContext) && + !["br", "div", "p"].includes(nw.node.nodeName.toLowerCase())) // Don't report twice + { + if (nw.node === ruleContext || CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) + continue; + var nwName = nw.node.nodeName.toLowerCase(); + if (nw.node.nodeType === 3) { + // for text child + if (nw.node.nodeValue.trim().length > 0 && nw.node.parentElement) { + // check it's style if the target element contains text, e.g., <p> fake heading</p> + var style = getComputedStyle(nw.node.parentElement); + if (style && (style['font-weight'] === 'bold' || style['font-weight'] >= 700 + || (style['font-size'] && style['font-size'].includes("large")) + || (style['font-size'] && bodyFont !== 0 && CSSUtil_1.CSSUtil.getPixelsFromStyle(style['font-size'], nw.node.parentElement) > bodyFont))) { + var nextStr = nw.node.nodeValue.trim(); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // the node contain regular text + passed = true; + } + } + } + else if (nw.node.nodeType === 1) { + // for element child + if (nwName === "b" || nwName === "strong" || nwName === "u" || nwName === "font") { + // if the target element contains emphasis child, e.g., <p><strong>fake heading</strong></p> + var nextStr = CommonUtil_1.CommonUtil.getInnerText(nw.node); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // ignore the element which has a role except 'generic', 'paragraph' or 'strong' + // ignore applet element that is deprecated anyway + var role = AriaUtil_1.AriaUtil.getResolvedRole(nw.node); + passed = (role !== null && role !== 'generic' && role !== 'paragraph' && role !== 'strong') || nwName === "applet"; + } + } + } + if (wordsSeen == 0) + passed = true; + //ignore if the string ends with “:” “,” “-” “;” or “.” + if (!passed) + passed = /[:,;\-\.]$/.test(wordStr.join(" ").trim()); + if (passed) { + return null; + } + else { + return (0, IRule_1.RulePotential)("potential_heading", [wordStr.join(" ")]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_contrast_sufficient.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/text_contrast_sufficient.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_contrast_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +exports.text_contrast_sufficient = { + id: "text_contrast_sufficient", + context: "dom:*", + refactor: { + "IBMA_Color_Contrast_WCAG2AA": { + "Pass_0": "pass", + "Fail_1": "fail_contrast", + "Potential_1": "potential_same_color" + }, + "IBMA_Color_Contrast_WCAG2AA_PV": { + "pass_0": "pass", + "potential_1": "potential_graphic_background" + } + }, + help: { + "en-US": { + "group": "text_contrast_sufficient.html", + "pass": "text_contrast_sufficient.html", + "fail_contrast": "text_contrast_sufficient.html", + "potential_same_color": "text_contrast_sufficient.html", + "potential_graphic_background": "text_contrast_sufficient.html", + "potential_text_shadow": "text_contrast_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The contrast ratio of text with its background must meet WCAG AA requirements", + "pass": "The contrast ratio of text with its background meets WCAG AA requirements", + "fail_contrast": "Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_same_color": "The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast", + "potential_graphic_background": "Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_text_shadow": "Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.3", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ['afw4f7'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + // avoid diagnosing elements that are not visible + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return null; + } + //TODO ? should only consider native disabled, ignore aria-disabled + //skip disabled element + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["svg", "script", "meta", "style"])) + return null; + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + // Ensure that this element has children with actual text. + var childStr = CommonUtil_1.CommonUtil.getNodeText(ruleContext); + if (!CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) || (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) && CommonUtil_1.CommonUtil.getNodeText(ruleContext.shadowRoot) === '')) { + if (childStr.trim().length == 0) + return null; + // ignore if the text does not convey anything in human language + /** + * (1) ignore non-alphanumeric or special characters in ASCI: ^(a-zA-Z\d\s) + * (2) ignore non-printable unicode characters: \u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF + * see https://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters + * (3) for now not consider unicode special characters that are different in different languages + */ + //let regex = /[^(a-zA-Z\d\s)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + var regex = /[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + childStr = childStr.trim().replace(regex, ''); + if (childStr.trim().length === 0) + return null; + } + var elem = ruleContext; + // the child elements (rather than shadow root) of a shadow host is either re-assigned to the shadow slot if the slot exists + // or not displayed, so shouldn't be checked from the light DOM, rather it should be checked as reassginged slot element(s) in the shadow DOM. + if (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext)) { + // if it's direct text of a shadow host + if (ruleContext.shadowRoot) { + for (var node = ruleContext.firstChild; node; node = node.nextSibling) { + if (node.nodeType == 3) { + //if multiple texts exist, only need to check one + elem = node.assignedSlot; + break; + } + } + } + if (elem === null) + return; + } + var style = win.getComputedStyle(elem); + // JCH clip INFO: + // The clip property lets you specify a rectangle to clip an absolutely positioned element. + // The rectangle specified as four coordinates, all from the top-left corner of the element to be clipped. + // Property values: + // none This is default. No clipping is done + // auto No clipping will be done + // shape The only valid value is: rect (top, right, bottom, left) + // e.g., clip: rect(10px, 20px, 30px, 40px); + // Note: the four values are in the same order as margin/padding + // The rect values are positive pixel values, e.g., 10px, etc. + // margin-box Uses the margin box as the reference box + // border-box Uses the border box as the reference box + // padding-box Uses the padding box as the reference box + // content-box + // fill-box + // stroke-box + // NOTE: the CSS clip property is deprecated + // Also: clip only works if the element is absolutely positioned and can only do rectangles + // check if element visible + var visible = true; + if (style.width !== "0" && + style.height !== "0" && + style.opacity !== "0" && + style.display !== 'none' && + style.visibility !== 'hidden' && + style.overflow !== 'hidden' && + // left and right work with all absolute units + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.left.replace(/[^0-9.+-]/, '')) > 0)) && + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.top.replace(/[^0-9.+-]/, '')) > 0))) { + visible = true; + // console.log("element IS visible"); + // console.log("CHECK COLOR CONTRAST unless to small"); + } + else { + visible = false; + // console.log("element NOT visible"); + } + if (visible === false) { + // console.log("DO NOT CHECK COLOR CONTRAST"); + return null; + } + var clipHeight = -1; + if (style.clip !== "auto") { + var clipString = style.clip.toString(); + if (clipString.includes("rect")) { + var reBrackets = /\((.*)\)/g; + var listOfText = []; + var found = reBrackets.exec(clipString); + var foundArr = found[1].split(', '); + for (var i = 0; i < foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + listOfText.push(foundArr[i]); + } + ; + } + // console.log("listOfText = ",listOfText); + clipHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + clipHeight = Math.abs(clipHeight); + } + // JCH clip-path INFO: + // Excellent article on clip-path: https://ishadeed.com/article/clip-path/ + // clip-path is a totally different animal with many, many different variations + // The goal was for it to not be as limited as clip + // The syntax is more complicated (as it does more) and it is different from clip, + // e.g., the above clip rectangle would be clip-path: inset(10px 20px 30px 40px); + // Note: there are no commas + // Also, it can take single values to make all sides the same, or 2 values (vert/hori). + // or 3 values (top/hori/bottom) + // And percentages can works as well as px + // + // Although there are five different shapes: inset (term used for rectangle), circle, + // ellipse, polygon, path - we will only concern ourselves with inset + // There are 7 box values: margin-box, border-box, padding-box, content-box, fill-box, stroke-box, view-box + // Box and shape values may be combined: clip-path: padding-box circle(50px at 0 100px); + // NOTE: the box values are NOT intuitive, see: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/From_box_values#margin-box + // + // So the key question is what amount of effort do we want to invest into clip-path + // + // JCH don't do clip-path now + var clipPathHeight = -1; + // if (style.clipPath !== "auto") { + // console.log("style.clipPath = ",style.clipPath); + // console.log("style.clipPath.toString = ",style.clipPath.toString()); + // let clipString = style.clipPath.toString(); + // if (clipString.includes("inset")) { + // var reBrackets = /\((.*)\)/g; + // var listOfText = []; + // var found = reBrackets.exec(clipString); + // var foundArr = found[1].split(' '); + // for (let i=0; i<foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + // listOfText.push(foundArr[i]); + // }; + // } + // console.log("listOfText = ",listOfText); + // clipPathHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + // clipPathHeight = Math.abs(clipHeight); + // } + // console.log("clipPathHeight = ", clipPathHeight); + // if (style.position === "absolute" && style.clip === "rect(0px, 0px, 0px, 0px)" && style.overflow !== "visible") { + // JCH arbitrarily use less that 7px for clipHeight + if (style.position === "absolute" && clipHeight < 7 && clipHeight !== -1) { + // console.log("DO NOT CHECK COLOR CONTRAST because too small"); + // Corner case where item is hidden (accessibility hiding technique) + return null; + } + // First determine the color contrast ratio + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(elem); + if (colorCombo === null) { + //some exception occurred, or not able to get color combo for some reason + console.log("unable to get color combo for element: " + elem.nodeName); + return; + } + var fg = colorCombo.fg; + var bg = colorCombo.bg; + var ratio = fg.contrastRatio(bg); + var weight = CSSUtil_1.CSSUtil.getWeightNumber(style.fontWeight); + var size = CSSUtil_1.CSSUtil.getFontInPixels(style.fontSize, elem); + var isLargeScale = size >= 24 || size >= 18.6 && weight >= 700; + if (CSSUtil_1.CSSUtil.containsCKJ(childStr)) { + // https://github.com/act-rules/act-rules.github.io/pull/2121/files + // for CJK, 22 pt or 18 pt with font-weight >= 700, 1pt = 1.333 px + isLargeScale = size >= 29.3 || size >= 24 && weight >= 700; + } + var passed = ratio >= 4.5 || (ratio >= 3 && isLargeScale); + var hasBackground = colorCombo.hasBGImage || colorCombo.hasGradient; + var textShadow = colorCombo.textShadow; + var isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(elem); + if (!isDisabled) { + var control = CommonUtil_1.CommonUtil.getControlOfLabel(elem); + if (control) { + isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(control); + } + } + if (!isDisabled && nodeName === 'label' && CommonUtil_1.CommonUtil.isDisabledByFirstChildFormElement(elem)) { + isDisabled = true; + } + if (!isDisabled && ruleContext.hasAttribute("id") && CommonUtil_1.CommonUtil.isDisabledByReferringElement(elem)) { + isDisabled = true; + } + /**setCache(ruleContext, "EXT_Color_Contrast_WCAG2AA", { + "ratio": ratio, + "isLargeScale": isLargeScale, + "weight": weight, + "size": size, + "hasBackground": hasBackground, + "isDisabled": isDisabled + });*/ + // If element or parent is disabled, this rule does not apply (but may be 3:1 in future) + if (!passed && isDisabled) { + passed = true; + } + if (!passed) { + if (hasBackground) { + // fire potential since a text on an image or gradient may be still viewable, depending on the text location on the gradient or image + return (0, IRule_1.RulePotential)("potential_graphic_background", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else if (textShadow) { + // fire potential since a text with shadow may be still viewable, depending on the shadow efffects + return (0, IRule_1.RulePotential)("potential_text_shadow", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else { + if (fg.toHex() === bg.toHex()) { + return (0, IRule_1.RulePotential)("potential_same_color", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + else { + return (0, IRule_1.RuleFail)("fail_contrast", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } + } + else { + return (0, IRule_1.RulePass)("pass", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_quoted_correctly.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/text_quoted_correctly.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_quoted_correctly = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_quoted_correctly = { + id: "text_quoted_correctly", + context: "dom:*", + help: { + "en-US": { + "Pass_0": "text_quoted_correctly.html", + "Potential_1": "text_quoted_correctly.html", + "group": "text_quoted_correctly.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}", + "group": "Quotations should be marked with <q> or <blockquote> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // ignore the check if the node is hidden + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if the element is not in the body + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + var validateParams = { + minWords: { + value: 3, + type: "integer" + } + }; + var minWords = validateParams.minWords.value; + var passed = true; + var walkNode = ruleContext.firstChild; + var violatedtext = null; + // ignore the check for the text of the following elements + var ignored = ["blockquote", "q", "script", "style", "pre", "code", "ruby", "samp"]; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName === "#text") { + var txtVal = walkNode.nodeValue; + // Do the regex tests first - should be fast + // Remove apostrophe's + txtVal = txtVal.replace(/(\S)'(\S)/g, "$1$2"); + var dblQuotes = txtVal.match(/("[^"]+")/g); + var snglQuotes = txtVal.match(/('[^']+')/g); + // Walk the parents - only continue testing if we found a quote, but + // we're not already marked up + // Also skip if we're in a script - there's lots of quotes used in scripts + if ((dblQuotes !== null || snglQuotes !== null) && + CommonUtil_1.CommonUtil.getAncestor(walkNode, ignored) === null) { + if (dblQuotes != null) { + for (var i = 0; passed && i < dblQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(dblQuotes[i]) < minWords; + } + if (snglQuotes != null) { + for (var i = 0; passed && i < snglQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(snglQuotes[i]) < minWords; + } + // Remove any linefeed inside the quote + // violatedtext = txtVal.replace(new RegExp("\\r?\\n|\\r","g"),""); + if (dblQuotes === null) { + violatedtext = snglQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else if (snglQuotes === null) { + violatedtext = dblQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else { + violatedtext = dblQuotes.concat(snglQuotes).join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + } + } + walkNode = walkNode.nextSibling; + } + //if the violatedtext is longer than 69 chars, only keep the first 32, the " ... ", and the last 32 chars + if (!passed && violatedtext.length && violatedtext.length > 69) { + violatedtext = violatedtext.substring(0, 32) + " ... " + violatedtext.substring(violatedtext.length - 32); + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_sensory_misuse.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/text_sensory_misuse.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_sensory_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_sensory_misuse = { + id: "text_sensory_misuse", + context: "dom:body, dom:body dom:*", + refactor: { + "RPT_Text_SensoryReference": { + // "Pass_0": "pass", + "Potential_1": "potential_position, potential_other" + } + }, + help: { + "en-US": { + // "pass": "text_sensory_misuse.html", + "potential_position": "text_sensory_misuse.html", + "potential_other": "text_sensory_misuse.html", + "group": "text_sensory_misuse.html" + } + }, + messages: { + "en-US": { + // "pass": "Instructions are meaningful without relying solely on shape, size, or location words", + "potential_position": "Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position", + "potential_other": "Confirm the user instruction is still understandable without the word(s) '{0}'", + "group": "Instructions should be meaningful without relying solely on shape, size, or location words" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, link, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "a", 'label']) !== null) + return null; + // ignore text on landmark roles, but not on their children (e.g., section, main) + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role) { + var lmRoles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["landmark"]); + if (lmRoles && lmRoles.includes(role)) + return null; + } + // ignore all widgets and headings, and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget", "heading"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "cell", "code", "columnheader", "definition", "figure", "list", "listitem", "math", "meter", "row", "rowgroup", "rowheader", "term"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var violatedPositionText = ""; + var violatedOtherText = ""; + var walkNode = ruleContext.firstChild; + var txtVal = ""; + while (walkNode) { + // for each element it only checks that single elements text nodes and nothing else. + // all inner elements will be covered on their own. + // whitespace characters (space, newline, tab) between elements are considered a node too. + if (walkNode.nodeName === "#text") { + var txt = walkNode.nodeValue.trim(); + if (txt.length > 0) + txtVal += (txtVal.length > 0 ? ", " + txt : txt); + } + walkNode = walkNode.nextSibling; + } + if (txtVal.length > 0) { + // first to remove each exempt word with a single space in the text + var exemptRegex = getRegex(ruleContext.ownerDocument, "exemptText"); + txtVal = txtVal.replace(exemptRegex, " "); + violatedPositionText = getViolatedText(ruleContext.ownerDocument, "positionText", txtVal); + violatedOtherText = getViolatedText(ruleContext.ownerDocument, "otherText", txtVal); + } + var ret = []; + if (violatedPositionText) + ret.push((0, IRule_1.RulePotential)("potential_position", [violatedPositionText])); + if (violatedOtherText) + ret.push((0, IRule_1.RulePotential)("potential_other", [violatedOtherText])); + return ret.length == 0 ? null : ret; + } +}; +var validateParams = { + positionText: { + value: ["top-left", "top-right", "bottom-right", "bottom-left", + "top-to-bottom", "left-to-right", "bottom-to-top", "right-to-left", + "right", "left", "above", "below", "top", "bottom", + "upper", "lower", "corner", "beside" + ], + type: "[string]" + }, + otherText: { + value: ["round", "square", "shape", "rectangle", "triangle", + "size", "large", "small", "medium", "big", "huge", "tiny", "extra", + "larger", "smaller", "bigger", "little", "largest", "smallest", "biggest" + ], + type: "[string]" + }, + exemptText: { + value: ["right-click", "left-click", "right-clicking", "right-clicks", + "left-clicking", "left-clicks", "square root", "right now", "off the top" //append as needed + ], + type: "[string]" + } +}; +function getRegex(doc, type) { + if (!validateParams[type]) + return ""; + var sensoryRegex = CacheUtil_1.CacheUtil.getCache(doc, type + "_sensory_misuse", null); + if (sensoryRegex == null) { + var sensoryText = validateParams[type].value; + var regexStr = "(\s\s+|" + sensoryText[0]; + for (var j = 1; j < sensoryText.length; ++j) { + var words = sensoryText[j].trim().split(" "); + regexStr += "|" + words[0]; + if (words.length > 1) { + for (var c = 1; c < words.length; ++c) + regexStr += " +" + words[c]; + } + } + //regexStr += ")\\W"; + regexStr += ")"; + sensoryRegex = new RegExp(regexStr, "gi"); + CacheUtil_1.CacheUtil.setCache(doc, type + "_sensory_misuse", sensoryRegex); + } + return sensoryRegex; +} +function getViolatedText(doc, type, txtVal) { + if (!txtVal) + return ""; + var sensoryTextArr = validateParams[type].value; + var hash = {}, result = []; + // split the string into words + var counts = txtVal.split(/\s+/).reduce(function (map, word) { + var wordWoTrailingPunc = word.replace(/[.?!:;()'",`\]]+$/, ""); + var lcWordWoPunc = word.toLowerCase().replace(/[.?!:;()'",`\]]/g, ""); + for (var counter = 0; counter < sensoryTextArr.length; counter++) { + var a = lcWordWoPunc.indexOf(sensoryTextArr[counter]); + var sensoryWordLen = sensoryTextArr[counter].length; + var charFollowSensoryText = lcWordWoPunc.charAt(sensoryWordLen + a); + // If the word does not contains substring of sensoryTextArr[counter] + // proceed to the next loop iteration for next sensoryText. + if (a < 0) { + continue; + } + //check the following and proceeding punctuations + //let isPuncfollowing = ((charFollowSensoryText == '\-') || + var isPuncfollowing = ((charFollowSensoryText == '\.') || + (charFollowSensoryText == '\?') || (charFollowSensoryText == '\!') || + (charFollowSensoryText == '\:') || (charFollowSensoryText == '\;') || + (charFollowSensoryText == '\(') || (charFollowSensoryText == '\)') || + (charFollowSensoryText == '\'') || (charFollowSensoryText == '\"') || + (charFollowSensoryText == '\,') || (charFollowSensoryText == '.\`') || + (charFollowSensoryText == '\\') || (charFollowSensoryText == '\]')); + var isPuncPreceding = false; + if (a > 0) { + var charPrecedeSensoryText = lcWordWoPunc.charAt(a - 1); + isPuncPreceding = ((charPrecedeSensoryText == '\-') || + (charPrecedeSensoryText == '\.') || + (charPrecedeSensoryText == '\?') || (charPrecedeSensoryText == '\!') || + (charPrecedeSensoryText == '\:') || (charPrecedeSensoryText == '\;') || + (charPrecedeSensoryText == '\(') || (charPrecedeSensoryText == '\)') || + (charPrecedeSensoryText == '\'') || (charPrecedeSensoryText == '\"') || + (charPrecedeSensoryText == '\,') || (charPrecedeSensoryText == '.\`') || + (charPrecedeSensoryText == '\\') || (charPrecedeSensoryText == '\]')); + } + if (((lcWordWoPunc.length == sensoryWordLen) || (isPuncfollowing == true) || (isPuncPreceding == true))) { + if (!hash.hasOwnProperty(wordWoTrailingPunc)) { + hash[wordWoTrailingPunc] = true; + result.push(wordWoTrailingPunc); + } + counter = sensoryTextArr.length; + } + } + map[wordWoTrailingPunc] = (map[wordWoTrailingPunc] || 0) + 1; + return map; + }, Object.create(null)); + return result.join(", "); +} + + +/***/ }, + +/***/ "./src/v4/rules/text_spacing_valid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/text_spacing_valid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_spacing_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +// Module-level constants +var STYLE_VALUE_REGEX = /(-?[\d.]+)([a-z%]*)/; +var MIN_WORD_SPACING_RATIO = 0.16; +var MIN_LETTER_SPACING_RATIO = 0.12; +var MIN_LINE_HEIGHT_RATIO = 1.5; +var IMPORTANT_SUFFIX = "!important"; +var IMPORTANT_SUFFIX_LENGTH = IMPORTANT_SUFFIX.length + 1; // +1 for the space before !important +/** + * Resolves inherited or unset style values by traversing up the DOM tree + * @param element - The element to resolve the style for + * @param property - The CSS property name + * @param currentValue - The current style value + * @returns The resolved style value + */ +function resolveInheritedStyle(element, property, currentValue) { + var _a; + if (currentValue.startsWith('inherit') || currentValue.startsWith('unset')) { + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(element.parentElement, (_a = {}, _a[property] = ["*"], _a), ['inherit', 'unset']); + if (ancestor !== null) { + return CSSUtil_1.CSSUtil.getDefinedStyles(ancestor, [property])[property]; + } + else if (currentValue.startsWith('unset')) { + return "initial"; + } + } + return currentValue; +} +/** + * Removes the !important suffix from a style value + * @param styleValue - The style value potentially containing !important + * @returns The style value without !important + */ +function removeImportantSuffix(styleValue) { + return styleValue.substring(0, styleValue.length - IMPORTANT_SUFFIX_LENGTH); +} +/** + * Checks if a spacing property violates accessibility requirements + * @param element - The HTML element being checked + * @param property - The CSS property name (word-spacing, letter-spacing, line-height) + * @param styleValue - The current style value + * @param fontSize - The computed font size in pixels + * @param minRatio - The minimum ratio threshold + * @param allowUnitless - Whether unitless values are allowed (for line-height) + * @returns RuleResult indicating pass or fail + */ +function checkSpacingProperty(element, property, styleValue, fontSize, minRatio, allowUnitless) { + if (allowUnitless === void 0) { allowUnitless = false; } + // Check if !important is used + if (element.style.getPropertyPriority(property) !== 'important') { + return true; + } + // Remove !important suffix + var cleanValue = removeImportantSuffix(styleValue); + // Check for initial or normal values (computed space is 0) + if (cleanValue === 'initial' || cleanValue === 'normal') { + return false; + } + // Parse the numeric value + var numericValue = parseFloat(cleanValue); + if (isNaN(numericValue)) { + return true; + } + // Match value and unit + var parsedValue = cleanValue.trim().match(STYLE_VALUE_REGEX); + if (!parsedValue) { + return true; + } + var value = parsedValue[1], unit = parsedValue[2]; + // Handle unitless values (only for line-height) + if (unit === '') { + if (allowUnitless) { + return parseFloat(value) < minRatio ? false : true; + } + // For other properties, zero value without unit is ignored + if (parseFloat(value) === 0) { + return null; + } + } + // Skip if no unit and non-zero (error case, inapplicable) + if (unit === '' && parseFloat(value) !== 0) { + return null; + } + // Convert to pixels and check ratio + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(unit, value, element); + if (pixels !== null && pixels / fontSize < minRatio) { + return false; + } + return true; +} +exports.text_spacing_valid = { + id: "text_spacing_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_spacing_valid.html", + "group": "text_spacing_valid.html", + "fail_letter_spacing_style": "text_spacing_valid.html", + "fail_word_spacing_style": "text_spacing_valid.html", + "fail_line_height_style": "text_spacing_valid.html" + } + }, + messages: { + "en-US": { + "pass": "CSS !important is not used in inline style to control letter or word spacing or line height", + "group": "CSS !important should not be used in inline style to control letter or word spacing or line height", + "fail_letter_spacing_style": "CSS !important should not be used in inline ‘letter-spacing’ style", + "fail_word_spacing_style": "CSS !important should not be used in inline ‘word-spacing’ style", + "fail_line_height_style": "CSS !important should not be used in inline ‘line-height’ style" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.12"], + "level": IRule_1.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_1.eToolkitLevel.LEVEL_THREE + }], + act: ['9e45ec', '24afc2', '78fd32'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Ensure that this element has children with actual text + var childStr = ""; + var childNodes = ruleContext.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType === 3) { // Text node + childStr += childNodes[i].nodeValue; + } + } + if (childStr.trim().length === 0) { + return null; + } + // Skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Skip the check if the element is off screen + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + if (!bounds || bounds['top'] < 0 || bounds['left'] < 0) { + return null; + } + // Skip non-HTML elements (e.g., SVG) + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + // Font size always resolved to 'px' + var computedStyle = getComputedStyle(ruleContext); + var fontSize = parseFloat(computedStyle.getPropertyValue('font-size')); + // Early exit optimization: Check if computed styles already pass + // If all three properties have passing values, we can skip the expensive getDefinedStyles call + var computedWordSpacing = computedStyle.getPropertyValue('word-spacing'); + var computedLetterSpacing = computedStyle.getPropertyValue('letter-spacing'); + var computedLineHeight = computedStyle.getPropertyValue('line-height'); + // Check if computed values pass the requirements + var wordSpacingPasses = true; + var letterSpacingPasses = true; + var lineHeightPasses = true; + // Check word-spacing (ignore 0px which represents default/normal) + if (computedWordSpacing) { + var wordValue = parseFloat(computedWordSpacing); + if (!isNaN(wordValue)) { + var wordPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', wordValue.toString(), ruleContext); + if (wordPixels !== null && wordPixels / fontSize < MIN_WORD_SPACING_RATIO) { + wordSpacingPasses = false; + } + } + } + // Check letter-spacing (ignore 0px which represents default/normal) + if (computedLetterSpacing) { + var letterValue = parseFloat(computedLetterSpacing); + if (!isNaN(letterValue)) { + var letterPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', letterValue.toString(), ruleContext); + if (letterPixels !== null && letterPixels / fontSize < MIN_LETTER_SPACING_RATIO) { + letterSpacingPasses = false; + } + } + } + // Check line-height + if (computedLineHeight) { + var lineValue = parseFloat(computedLineHeight); + if (!isNaN(lineValue)) { + // Line height can be unitless or in pixels + var match = computedLineHeight.match(STYLE_VALUE_REGEX); + if (match) { + var value = match[1], unit = match[2]; + if (unit === '' || unit === 'px') { + var ratio = unit === '' ? parseFloat(value) : parseFloat(value) / fontSize; + if (ratio < MIN_LINE_HEIGHT_RATIO) { + lineHeightPasses = false; + } + } + } + } + } + // If all computed values pass, we can skip the expensive getDefinedStyles check + if (wordSpacingPasses && letterSpacingPasses && lineHeightPasses) { + return null; + } + // Get defined styles to check for !important declarations + var styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["word-spacing", "letter-spacing", "line-height"]); + if (Object.keys(styles).length === 0) { + return null; + } + var results = []; + // Check word-spacing + var wordStyle = styles['word-spacing']; + if (wordStyle) { + wordStyle = resolveInheritedStyle(ruleContext, 'word-spacing', wordStyle); + var result = checkSpacingProperty(ruleContext, 'word-spacing', wordStyle, fontSize, MIN_WORD_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_word_spacing_style')); + } + // Check letter-spacing + var letterStyle = styles['letter-spacing']; + if (letterStyle) { + letterStyle = resolveInheritedStyle(ruleContext, 'letter-spacing', letterStyle); + var result = checkSpacingProperty(ruleContext, 'letter-spacing', letterStyle, fontSize, MIN_LETTER_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_letter_spacing_style')); + } + // Check line-height (only if no scrollable ancestor) + var lineStyle = styles['line-height']; + var overflowStyles = { + "overflow": ['auto', 'scroll'], + "overflow-x": ['auto', 'scroll'], + "overflow-y": ['auto', 'scroll'] + }; + if (lineStyle && CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext, overflowStyles) === null) { + lineStyle = resolveInheritedStyle(ruleContext, 'line-height', lineStyle); + var result = checkSpacingProperty(ruleContext, 'line-height', lineStyle, fontSize, MIN_LINE_HEIGHT_RATIO, true // Allow unitless values for line-height + ); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_line_height_style')); + } + return results.length > 0 ? results : null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_whitespace_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/text_whitespace_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_whitespace_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.text_whitespace_valid = { + id: "text_whitespace_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_whitespace_valid.html", + "potential_text": "text_whitespace_valid.html", + "group": "text_whitespace_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_text": "Space characters should not be used to create space between the letters of a word", + "group": "Space characters should not be used to control spacing within a word" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger if we're not in the body or if we're in a script + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body", "script", "code"]); + if (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body") + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + passed = !(/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(txtVal)); + } + walkNode = walkNode.nextSibling; + } + if (passed) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_text"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/widget_tabbable_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_exists = { + id: "widget_tabbable_exists", + context: "aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton", + refactor: { + "IBMA_Focus_Tabbable": { + "pass": "pass", + "fail_no_tabbable": "fail_no_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_exists.html", + "fail_no_tabbable": "widget_tabbable_exists.html", + "group": "widget_tabbable_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_no_tabbable": "Component with \"{0}\" role does not have a tabbable element", + "group": "Component must have at least one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role_1 = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role_1, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + // skip the count if the element requires presentational children only + if (count < 1 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 1 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + var passed = count >= 1; + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_no_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/widget_tabbable_single.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_single.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_single = { + id: "widget_tabbable_single", + context: "aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab", + refactor: { + "IBMA_Focus_MultiTab": { + "pass": "pass", + "potential_multiple_tabbable": "potential_multiple_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_single.html", + "potential_multiple_tabbable": "widget_tabbable_single.html", + "group": "widget_tabbable_single.html" + } + }, + messages: { + "en-US": { + "pass": "Components with a widget role should have no more than one tabbable element", + "potential_multiple_tabbable": "Component with \"{0}\" role has more than one tabbable element", + "group": "Components with a widget role must have no more than one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + //skip the count if the element requires presentational children only + var name = []; + if (count < 2 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 2 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + // Radio inputs with the same name natively are only one tab stop + /**if (nw.node.nodeName.toLowerCase() === 'input' && (nw.node as Element).getAttribute("type") === 'radio') { + let curName = (nw.node as Element).getAttribute("name"); + if (name.includes(curName)) + continue; + else + name.push(curName); + }*/ + ++count; + } + } + } + var passed = count < 2; + if (!passed) + CacheUtil_1.CacheUtil.setCache(ruleContext, "widget_tabbable_single", "potential_multiple_tabbable"); + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_multiple_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rulesets.ts" +/*!****************************!*\ + !*** ./src/v4/rulesets.ts ***! + \****************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a11yRulesets = void 0; +// This file comes from https://raw.githubusercontent.com/act-rules/act-tools/main/src/data/sc-urls.json +var SCURLs = __importStar(__webpack_require__(/*! ./sc-urls.json */ "./src/v4/sc-urls.json")); +var IGuideline_1 = __webpack_require__(/*! ./api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var SCs = []; +for (var key in SCURLs) { + SCs.push(SCURLs[key]); +} +var summaries = { + "1.1.1": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.", + "1.2.1": "For prerecorded audio-only or video-only media, an alternative provides equivalent information.", + "1.2.2": "Captions are provided for all prerecorded audio content in synchronized media.", + "1.2.3": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.", + "1.2.4": "Captions are provided for all live audio content in synchronized media.", + "1.2.5": "Audio description is provided for all prerecorded video content in synchronized media.", + "1.3.1": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.", + "1.3.2": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.", + "1.3.3": "Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.", + "1.3.4": "Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.", + "1.3.5": "The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.", + "1.4.1": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.", + "1.4.2": "If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.", + "1.4.3": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.", + "1.4.4": "Text can be resized without assistive technology up to 200 percent without loss of content or functionality.", + "1.4.5": "If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.", + "1.4.10": "Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.", + "1.4.11": "The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.", + "1.4.12": "No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.", + "1.4.13": "Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.", + "2.1.1": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.", + "2.1.2": "If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.", + "2.1.4": "If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.", + "2.2.1": "For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.", + "2.2.2": "For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.", + "2.3.1": "Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.", + "2.4.1": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.", + "2.4.2": "Web pages, non-web documents, and software have titles that describe topic or purpose.", + "2.4.3": "If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.", + "2.4.4": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.", + "2.4.5": "More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.", + "2.4.6": "Headings and labels describe topic or purpose.", + "2.4.7": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.", + "2.4.11": "When an element receives focus, it is not entirely covered by other content.", + "2.5.1": "All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.", + "2.5.2": "For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.", + "2.5.3": "For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.", + "2.5.4": "Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.", + "2.5.8": "The size of the target for pointer inputs is at least 24 by 24 CSS pixels.", + "2.5.7": "All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.", + "3.1.1": "The default human language of Web pages, non-Web documents, or software can be programmatically determined.", + "3.1.2": "The human language of each passage or phrase in the content can be programmatically determined.", + "3.2.1": "When any component receives focus, it does not initiate a change of context.", + "3.2.2": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.", + "3.2.3": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.", + "3.2.4": "Components that have the same functionality within a set of Web pages are identified consistently.", + "3.2.6": "Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.", + "3.3.1": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.", + "3.3.2": "Labels or instructions are provided when content requires user input.", + "3.3.3": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.", + "3.3.4": "For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.", + "3.3.7": "Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.", + "3.3.8": "Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.", + "4.1.1": "(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.", + "4.1.2": "For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.", + "4.1.3": "In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.", + "HTML": "The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.", + "ARIA": "The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.", +}; +exports.a11yRulesets = [ + // { + // id: "DEBUG", + // name: "DEBUG Rules", + // category: eRuleCategory.ACCESSIBILITY, + // description: "Rules for debugging", + // checkpoints: [{ + // num: "1", + // name: "Debug CP 1", + // wcagLevel: "A", + // summary: "Rules for Debug" + // }] + // }, + { + id: "EXTENSIONS", + name: "Extension Rules", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for enabling the browser extensions", + type: IGuideline_1.eGuidelineType.EXTENSION, + checkpoints: [{ + num: "1", + name: "Extension CP 1", + wcagLevel: "A", + summary: "Rules for Extension" + }] + }, + { + id: "IBM_Accessibility", + name: "IBM Accessibility 7.3", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "IBM_Accessibility_next", + name: "IBM Accessibility next", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_2", + name: "WCAG 2.2 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_1", + name: "WCAG 2.1 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_0", + name: "WCAG 2.0 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.", + // This ruleset has all 2.0 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + } +]; + + +/***/ }, + +/***/ "./src/v4/simulator/SRController.ts" +/*!******************************************!*\ + !*** ./src/v4/simulator/SRController.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRController = void 0; +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var SRRenderer_1 = __webpack_require__(/*! ./SRRenderer */ "./src/v4/simulator/SRRenderer.ts"); +var SRNavigator_1 = __webpack_require__(/*! ./SRNavigator */ "./src/v4/simulator/SRNavigator.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var SRUtil_1 = __webpack_require__(/*! ./SRUtil */ "./src/v4/simulator/SRUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +/** + * SRController class for managing screen reader simulation + * Maintains a point of regard and provides navigation functions + */ +var SRController = /** @class */ (function () { + /** + * Creates a new SRController + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRController(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + this.rootElement = rootElement; + this.liveListeners = []; + this.ctrlDoc = rootElement.ownerDocument; + this.setPointOfRegard(rootElement); + this.setupMutationTracking(); + console.info("[WARNING] The SRController is a new feature that is not yet \"stable\". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback."); + } + SRController.getController = function (ctrlDoc) { + if (ctrlDoc === void 0) { ctrlDoc = document; } + if (!this.singleton) { + this.singleton = new SRController(ctrlDoc.body); + } + return this.singleton; + }; + SRController.prototype.disconnect = function () { + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + }; + SRController.prototype.findAllShadowRoots = function (root) { + if (root === void 0) { root = document; } + var shadowRoots = []; + // Get all elements in the current root + var walker = this.ctrlDoc.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null); + var node; + while (node = walker.nextNode()) { + var element = node; + // Check if this element has an open shadow root + if (element.shadowRoot) { + shadowRoots.push(element.shadowRoot); + // Recursively search inside this shadow root + var nestedShadowRoots = this.findAllShadowRoots(element.shadowRoot); + shadowRoots.push.apply(shadowRoots, nestedShadowRoots); + } + } + return shadowRoots; + }; + /** + * Set up mutation tracking + * + * In the event that the point of regard is removed from the DOM, we need to get up to the nearest parent that's not being removed + */ + SRController.prototype.setupMutationTracking = function () { + var _this = this; + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + var myThis = this; + var observer = new MutationObserver(function (mutations) { + var porNode = myThis.pointOfRegard.getNode(); + var _loop_1 = function (removalMutation) { + removalMutation.removedNodes.forEach(function (removedNode) { + if (removedNode.isSameNode(porNode) || removedNode.contains(porNode)) { + console.info("Adjusting PoR due to DOM mutation removing PoR"); //, removalMutation.target, removedNode, porNode) + porNode = removalMutation.target; + } + }); + }; + for (var _i = 0, _a = mutations.filter(function (mutation) { var _a; return ((_a = mutation.removedNodes) === null || _a === void 0 ? void 0 : _a.length) > 0; }); _i < _a.length; _i++) { + var removalMutation = _a[_i]; + _loop_1(removalMutation); + } + ; + _this.setPointOfRegard(porNode); + var _loop_2 = function (mutation) { + if (mutation.addedNodes) { + mutation.addedNodes.forEach(function (addedNode) { + // Add observation of new shadow roots + var allRoots = _this.findAllShadowRoots(addedNode); + for (var _i = 0, allRoots_2 = allRoots; _i < allRoots_2.length; _i++) { + var root = allRoots_2[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }); + } + var node = mutation.target; + var elem = node.nodeType === 1 ? node : node.parentElement; + if (elem + && !elem.closest("[aria-busy=\"true\"]") + && elem.getAttribute("aria-busy") !== "true") { + // Identify the live region container + var liveRegionElem = + // The element itself is a live region container + ((["polite", "assertive"].includes(elem.getAttribute("aria-live")) + || elem.nodeName.toUpperCase() === "OUTPUT" + || ["status", "log", "progressbar", "alert", "timer"].includes(elem.getAttribute("role"))) && elem) + // Or get the nearest ancestor + || elem.closest("[aria-live=\"polite\"],[aria-live=\"assertive\"],output,[role=\"status\"],[role=\"log\"],[role=\"progressbar\"],[role=\"alert\"],[role=\"timer\"]"); + var isMutationRelevant = false; + var relevance_1 = ["additions", "text"]; + if (liveRegionElem) { + // Determine what kinds of changes are 'relevant' + var relevantElem = elem.closest("[aria-relevant]"); + if (relevantElem) { + relevance_1 = relevantElem.getAttribute("aria-relevant").split(/ +/g); + } + if (liveRegionElem.getAttribute("role") === "log") { + relevance_1 = ["additions"]; + } + if (liveRegionElem.hasAttribute("aria-relevant")) { + relevance_1 = liveRegionElem.getAttribute("aria-relevant").split(/ +/g); + } + if (relevance_1.includes("all")) { + relevance_1 = ["additions", "removals", "text"]; + } + isMutationRelevant = (mutation.target.nodeType === 3 && relevance_1.includes("text")) + || (mutation.addedNodes.length > 0 && relevance_1.includes("additions")) + || (mutation.removedNodes.length > 0 && relevance_1.includes("removals")); + } + if (liveRegionElem && isMutationRelevant) { + var isAtomic_1 = liveRegionElem.getAttribute("aria-atomic") === "true" || ["alert", "status", "timer", "marquee"].includes(liveRegionElem.getAttribute("role")); + // Read the whole region if atomic + if (!isAtomic_1 && mutation.type === "characterData" && mutation.target.nodeType === 3 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(mutation.target.parentElement)) { + for (var _c = 0, _d = _this.liveListeners; _c < _d.length; _c++) { + var liveListener = _d[_c]; + liveListener(mutation.target.nodeValue); + } + } + else { + var liveTarget_1 = isAtomic_1 ? liveRegionElem : mutation.target; + if (liveTarget_1.liveAnnounce) { + clearTimeout(liveTarget_1.liveAnnounce); + } + liveTarget_1.liveAnnounce = setTimeout(function () { + var results = []; + var isRemoval = (relevance_1.includes("removals") && mutation.removedNodes.length > 0); + if (isAtomic_1 || isRemoval) { + var liveCursor = new SRCursor_1.SRCursor(liveTarget_1, false); + var liveCursorEnd = new SRCursor_1.SRCursor(liveTarget_1, true); + liveCursorEnd.next(function () { return true; }); + results.push((isRemoval ? "[removed] " : "") + SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + } + else if (relevance_1.includes("additions") && mutation.addedNodes.length > 0) { + mutation.addedNodes.forEach(function (addedNode) { + // Just render the additions + var liveCursor = new SRCursor_1.SRCursor(addedNode, false); + var liveCursorEnd = new SRCursor_1.SRCursor(addedNode, true); + liveCursorEnd.next(function () { return true; }); + results.push(SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + }); + } + for (var _i = 0, _a = _this.liveListeners; _i < _a.length; _i++) { + var liveListener = _a[_i]; + liveListener(results.join("\n")); + } + }, 100); + } + } + } + }; + for (var _b = 0, mutations_1 = mutations; _b < mutations_1.length; _b++) { + var mutation = mutations_1[_b]; + _loop_2(mutation); + } + }); + // Need to observe all of the shadow roots + var allRoots = this.findAllShadowRoots(this.ctrlDoc.documentElement); + allRoots.push(this.ctrlDoc.documentElement); + for (var _i = 0, allRoots_1 = allRoots; _i < allRoots_1.length; _i++) { + var root = allRoots_1[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }; + SRController.prototype.addLiveListener = function (listener) { + this.liveListeners.push(listener); + }; + SRController.prototype.removeLiveListener = function (removeListener) { + this.liveListeners = this.liveListeners.filter(function (listener) { return listener !== removeListener; }); + }; + /** + * Get the current point of regard + * @returns The current SRCursor representing the point of regard + */ + SRController.prototype.getPointOfRegard = function () { + return this.pointOfRegard; + }; + /** + * Set the point of regard to a specific DOM node + * @param node The node to set as the point of regard + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.setPointOfRegard = function (node) { + var _a; + var DEBUG = false; + DEBUG && console.group("setPointOfRegard"); + try { + this.pointOfRegard = new SRCursor_1.SRCursor(node); + // Update container state + var containerChanges = SRController.diffContainers("focus", this.pointOfRegard); + var role = this.pointOfRegard.getRole(); + var name_1 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + return { + success: true, + renderingResult: SRRenderer_1.SRRenderer.renderCurrent("focus", this.pointOfRegard, containerChanges), + role: role, + name: name_1 + }; + } + catch (error) { + return { + success: false, + renderingResult: { + start: this.pointOfRegard.clone(), + end: this.pointOfRegard.clone(), + message: "Failed to set point of regard: ".concat(error.message) + } + }; + } + finally { + DEBUG && console.groupEnd(); + } + }; + /** + * Jump to the next element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpNext = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + var DEBUG = false; + DEBUG && console.group("jumpNext"); + try { + var bContinue = true; + var nextJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && nextJump) { + var lastJump = nextJump.clone(); + nextJump = SRNavigator_1.SRNavigator.jumpNext(mode, nextJump); + if (nextJump) { + var containerChanges = SRController.diffContainers(mode, nextJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(nextJump.getRole(), !nextJump.isEndTag(), nextJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, nextJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!nextJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No next ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = nextJump; + var role = this.pointOfRegard.getRole(); + var name_2 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // Check for container changes + DEBUG && console.log("New POR:", this.pointOfRegard.getNode(), renderingResult); + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_2 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + finally { + console.groupEnd(); + } + }; + /** + * Jump to the previous element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpPrevious = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + try { + var bContinue = true; + var prevJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && prevJump) { + var lastJump = prevJump.clone(); + prevJump = SRNavigator_1.SRNavigator.jumpPrevious(mode, prevJump); + if (prevJump) { + var containerChanges = SRController.diffContainers(mode, prevJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(prevJump.getRole(), !prevJump.isEndTag(), prevJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, prevJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!prevJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No previous ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = prevJump; + var role = this.pointOfRegard.getRole(); + var name_3 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // // Check for container changes + // const containerChanges = SRController.diffContainers(mode, this.pointOfRegard, oldPointOfRegard); + // let s = SRRenderer.renderEnter(mode, this.pointOfRegard); + // if (containerChanges.entering[containerChanges.entering.length-1] !== s) { + // containerChanges.entering.push(s); + // } + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_3 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + }; + /** + * Determine the different in containers between the two nodes + * @param newWalker The new node we're navigating to + * @param oldWalker The previous node we were at + * @returns Array of container change messages + */ + /** + * Walk up from a node in an iframe subdocument to find the host <iframe> element + * in the nearest ancestor document. Returns null if the node is not in a subdocument. + */ + SRController.hostIframe = function (node) { + var doc = node.ownerDocument; + if (!doc || doc === document) + return null; + // contentWindow.frameElement is the <iframe> in the parent document + try { + return DOMUtil_1.DOMUtil.getAncestor(node, ["iframe"]); + } + catch (_a) { + return null; + } + }; + SRController.diffContainers = function (mode, newWalker, oldWalker) { + var _a, _b; + var DEBUG = false; + DEBUG && console.log("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"); + DEBUG && console.log("A)", oldWalker === null || oldWalker === void 0 ? void 0 : oldWalker.getNode().nodeName, newWalker.getNode().nodeName); + var leaving = []; + var entering = []; + try { + var newDoc = (_a = newWalker === null || newWalker === void 0 ? void 0 : newWalker.getNode().ownerDocument) !== null && _a !== void 0 ? _a : document; + var oldDoc = (_b = oldWalker === null || oldWalker === void 0 ? void 0 : oldWalker.getNode().ownerDocument) !== null && _b !== void 0 ? _b : document; + // ── Cross-document iframe boundary ────────────────────────────────── + // When the navigation crosses into or out of an <iframe> subdocument + // the normal commonParent walk cannot span document boundaries. + // We detect this and manually inject the container-enter/exit for the + // <iframe> element itself. + if (newDoc !== oldDoc) { + var newIframe = SRController.hostIframe(newWalker.getNode()); + var oldIframe = SRController.hostIframe(oldWalker === null || oldWalker === void 0 ? void 0 : oldWalker.getNode()); + if (newIframe && !oldIframe) { + // Entering an iframe subdocument — emit the frame container-enter. + var iframeCursor = new SRCursor_1.SRCursor(newIframe, false); + var enter = SRRenderer_1.SRRenderer.renderEnter(mode, iframeCursor, oldWalker); + if (enter && enter.trim()) + entering.push(enter.trim()); + } + else if (!newIframe && oldIframe) { + // Leaving an iframe subdocument — emit the frame container-exit. + var iframeCursor = new SRCursor_1.SRCursor(oldIframe, true); + var leave = SRRenderer_1.SRRenderer.renderLeave(mode, iframeCursor, oldWalker); + if (leave && leave.trim()) + leaving.push(leave.trim()); + } + else if (newIframe && oldIframe && newIframe !== oldIframe) { + // Moving between two different iframes — exit old, enter new. + var oldCursor = new SRCursor_1.SRCursor(oldIframe, true); + var leave = SRRenderer_1.SRRenderer.renderLeave(mode, oldCursor, oldWalker); + if (leave && leave.trim()) + leaving.push(leave.trim()); + var newCursor = new SRCursor_1.SRCursor(newIframe, false); + var enter = SRRenderer_1.SRRenderer.renderEnter(mode, newCursor, oldWalker); + if (enter && enter.trim()) + entering.push(enter.trim()); + } + // After injecting iframe boundary announcements, also run the normal + // within-document diffContainers for each side independently so that + // landmarks inside the iframe are announced correctly. + return { leaving: leaving, entering: entering }; + } + // ── Same-document path (original logic) ───────────────────────────── + var docRoot = newWalker ? + (newWalker.getNode().ownerDocument.body || newWalker.getNode().ownerDocument.documentElement) : + oldWalker ? + (oldWalker.getNode().ownerDocument.body || oldWalker.getNode().ownerDocument.documentElement) : + document.body || document.documentElement; + var walkNew = newWalker ? newWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + var walkOld = oldWalker ? oldWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + if (!walkNew.getNode().isSameNode(walkOld.getNode())) { + var commonParent = SRController.commonParent(walkNew, walkOld); + if (commonParent) { + DEBUG && console.log("B)", commonParent.getNode().nodeName); + while (commonParent.contains(walkNew)) { + DEBUG && console.log("Entering:", walkNew.getNode().nodeName); + entering.push(SRRenderer_1.SRRenderer.renderEnter(mode, walkNew, walkOld)); + walkNew.parent(); + } + entering.reverse(); + entering = entering.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + ; + while (commonParent.contains(walkOld)) { + DEBUG && console.log("Leaving:", walkOld.getNode().nodeName); + leaving.push(SRRenderer_1.SRRenderer.renderLeave(mode, walkOld, walkOld)); + walkOld.parent(); + } + leaving = leaving.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + } + } + } + catch (err) { + console.error(err); + } + DEBUG && console.log(leaving, entering); + return { + leaving: leaving, + entering: entering + }; + }; + SRController.commonParent = function (walkerOne, walkerTwo) { + if (walkerOne.contains(walkerTwo)) { + return walkerOne.clone(); + } + else if (walkerTwo.contains(walkerOne)) { + return walkerTwo.clone(); + } + else { + var commonParent = walkerOne.clone(); + while (!commonParent.contains(walkerTwo) && commonParent.parent()) + ; + if (!commonParent.contains(walkerOne) || !commonParent.contains(walkerTwo)) { + return null; + } + return commonParent; + } + }; + SRController.renderAll = function (mode) { + var ctrl = SRController.getController(); + var dialogs = ctrl.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg.message); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + results.push(nextVal.renderingResult.message); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderAllDetail = function (doc, mode) { + var ctrl = SRController.getController(doc); + ctrl.setPointOfRegard(doc.body); + var dialogs = doc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + // mode === "item" && console.log(nextVal); + results.push(nextVal.renderingResult); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderStructure = function (doc) { + var _a, _b; + var modes = ["region", "heading", "item", "tab_focus", "image"]; + var details = modes.map(function (modeLabel) { return SRController.renderAllDetail(doc, modeLabel); }); + var retVal = []; + var _loop_3 = function () { + var next = (_a = details[0][0]) === null || _a === void 0 ? void 0 : _a.start; + modes.forEach(function (mode, idx) { + if (details[idx].length > 0) { + if (!next || SRCursor_1.SRCursor.compare(details[idx][0].start, next) < 0) { + next = details[idx][0].start; + } + } + }); + var nextItem = {}; + var hasValue = false; + modes.forEach(function (mode, idx) { + nextItem[mode] = ""; + if (details[idx].length > 0 && SRCursor_1.SRCursor.compare(details[idx][0].start, next) === 0) { + nextItem[mode] = details[idx].shift().message; + hasValue = nextItem[mode] !== ""; + } + }); + if (hasValue) { + var elem = next.getElement(); + var selector = elem && SRUtil_1.SRUtil.getUniqueSelector(elem); + // Use the element's own document for querySelector so that elements + // inside iframe subdocuments resolve correctly. + var elemDoc = (_b = elem === null || elem === void 0 ? void 0 : elem.ownerDocument) !== null && _b !== void 0 ? _b : doc; + if (selector && elemDoc.querySelector(selector)) { + nextItem.selector = selector; + } + retVal.push(nextItem); + } + }; + while (details.some(function (detail) { return detail.length > 0; })) { + _loop_3(); + } + return retVal; + }; + return SRController; +}()); +exports.SRController = SRController; + + +/***/ }, + +/***/ "./src/v4/simulator/SRCursor.ts" +/*!**************************************!*\ + !*** ./src/v4/simulator/SRCursor.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRCursor = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var SRUtil_1 = __webpack_require__(/*! ./SRUtil */ "./src/v4/simulator/SRUtil.ts"); +/** + * SRCursor (Screen Reader Cursor) class + * + * This class provides a cursor-like interface for navigating the DOM in a way that + * simulates how screen readers process and navigate content. It tracks: + * - The current node position + * - Whether it's at a start or end tag + * - The ARIA role of the current node + * - The accessible name of the current node + */ +var SRCursor = /** @class */ (function () { + /** + * Creates a new SRCursor positioned at the specified element + * @param element - The DOM node to position the cursor at + * @param bEnd - Whether to position at the end tag (true) or start tag (false) + */ + function SRCursor(element, bEnd) { + // Use DOMWalker with considerHidden=false to process all content (including hidden elements) + // This is important for screen reader simulation which needs to see all content + this.walker = new DOMWalker_1.DOMWalker(element, bEnd, undefined, false); + if (element) { + this.refreshName(); + } + } + /** + * Creates a copy of this cursor at the same position + * @returns A new SRCursor instance with the same position and properties + */ + SRCursor.prototype.clone = function () { + var retVal = new SRCursor(this.walker.node, this.walker.bEndTag); + retVal.role = this.role; + retVal.name = this.name; + retVal.preLineIndex = this.preLineIndex; + return retVal; + }; + /** + * Updates the role and accessible name properties based on the current node + * This is called whenever the cursor position changes + * @private + */ + SRCursor.prototype.refreshName = function () { + if (this.walker.node.nodeType === 1) { + // Element node + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + // Text node + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + // Other node types + this.role = undefined; + this.name = undefined; + } + }; + /** + * Moves the cursor to the next node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.next = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + // const DEBUG = false; + var foundNext = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("next function"); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && !this.walker.bEndTag) { + this.walker.bEndTag = true; + } + else if (!this.walker.nextNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundNext = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundNext); + DEBUG && console.log("foundNext:", foundNext, this.isEndTag() ? "/" : "", this.getNode()); + DEBUG && console.groupEnd(); + if (foundNext) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundNext; + }; + /** + * Moves the cursor to the previous node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.previous = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + var foundPrevious = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("previous function"); + DEBUG && console.log(this.isEndTag(), this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log(skipCurrent, skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && this.walker.bEndTag) { + DEBUG && console.log("Skipping node"); + this.walker.bEndTag = false; + } + else if (!this.walker.prevNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag(), this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log(skipCurrent, skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && !this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundPrevious = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundPrevious); + DEBUG && console.log(this.isEndTag(), this.getNode()); + DEBUG && console.groupEnd(); + if (foundPrevious) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundPrevious; + }; + /** + * Moves the cursor to the parent node of the current node + * @param endTag - Whether to position at the end tag (true) or start tag (false) + * @returns true if successfully moved to parent, false if no parent exists + */ + SRCursor.prototype.parent = function (endTag) { + if (!this.walker.node.parentNode) + return false; + this.walker.node = this.walker.node.parentNode; + this.walker.bEndTag = endTag === true; + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + this.role = undefined; + this.name = undefined; + } + return true; + }; + /** + * Moves the cursor up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.getCurrentOrParentByRole = function (roles, elems) { + var _this = this; + var uppElems = elems ? elems.map(function (elem) { return elem.toUpperCase(); }) : []; + var matches = function (walker) { + var elem = walker.getElement(); + return roles.includes(_this.getRole()) + || (elem && !elem.hasAttribute("role") && uppElems.includes(elem.nodeName.toUpperCase())); + }; + while (!matches(this) && this.parent()) + ; + return matches(this); + }; + /** + * Creates a new cursor and moves it up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns A new cursor at the matching node, or null if no match found + */ + SRCursor.prototype.getCurrentOrParentByRoleClone = function (roles, elems) { + var retVal = this.clone(); + if (retVal.getCurrentOrParentByRole(roles, elems)) { + return retVal; + } + return null; + }; + SRCursor.prototype.getCurrentOrParentTabbableClone = function () { + var retVal = this.clone(); + while (retVal) { + var elem = retVal.getElement(); + if (retVal.isStartTag() && elem && CommonUtil_1.CommonUtil.isTabbable(elem)) { + return retVal; + } + if (!retVal.parent(false)) { + break; + } + } + return null; + }; + /** + * Gets the ARIA role of the current node + * @returns The ARIA role as a string, or undefined if not available + */ + SRCursor.prototype.getRole = function () { + return this.role; + }; + /** + * Gets the accessible name info for the current node + * @returns The AccessibleNameResult object, or undefined if not available + */ + SRCursor.prototype.getNameInfo = function () { + return this.name; + }; + /** + * Get the accessible name of the current node + */ + SRCursor.prototype.getName = function () { + // Handle one-off quirks in the name calculation + var nameInfo = this.getNameInfo(); + if (nameInfo && nameInfo.name) { + return nameInfo.name; + } + var elem = this.getElement(); + if (elem) { + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + return labelElem.innerText || labelElem.textContent; + } + } + }; + /** + * Sets whether the cursor is at an end tag or start tag + * @param val - True for end tag, false for start tag + */ + SRCursor.prototype.setEndTag = function (val) { + this.walker.bEndTag = val; + }; + /** + * Gets the DOM node at the current cursor position + * @returns The current DOM node + */ + SRCursor.prototype.getNode = function () { + return this.walker.node; + }; + /** + * Gets the current node as an HTMLElement if it is an element node + * @returns The current node as HTMLElement, or undefined if not an element + */ + SRCursor.prototype.getElement = function () { + if (!this.walker.node) + return undefined; + if (this.walker.node.nodeType !== 1) + return undefined; + return this.walker.node; + }; + SRCursor.prototype.getParentElement = function () { + if (!this.walker.node) + return null; + var retVal = this.clone(); + retVal.walker.node = DOMWalker_1.DOMWalker.parentElement(retVal.walker.node); + return retVal; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isEndTag = function () { + return this.walker.bEndTag; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isStartTag = function () { + return !this.walker.bEndTag; + }; + /** + * Compares the document position of two cursors + * @param one - First cursor to compare + * @param two - Second cursor to compare + * @returns 0 if equal, -1 if one is before two, 1 if one is after two + */ + SRCursor.compare = function (one, two) { + var _a, _b; + var nodeOne = (_a = one === null || one === void 0 ? void 0 : one.walker) === null || _a === void 0 ? void 0 : _a.node; + var nodeTwo = (_b = two === null || two === void 0 ? void 0 : two.walker) === null || _b === void 0 ? void 0 : _b.node; + if (!nodeOne && !nodeTwo) + return 0; + if (!nodeOne) + return 1; + if (!nodeTwo) + return -1; + // When both cursors are at the same <pre> element and at least one has a + // preLineIndex, use line index ordering so virtual per-line stops are sequenced + // correctly. preLineIndex=undefined means the block-enter stop, which comes + // before all numbered lines (undefined < 0 < 1 < 2 …). + if (nodeOne === nodeTwo && !one.walker.bEndTag && !two.walker.bEndTag) { + var lineOneUndefined = one.preLineIndex === undefined; + var lineTwoUndefined = two.preLineIndex === undefined; + if (!lineOneUndefined || !lineTwoUndefined) { + // At least one cursor has a line index + if (lineOneUndefined) + return -1; // undefined (block-enter) sorts before all lines + if (lineTwoUndefined) + return 1; // two is block-enter; one (a numbered line) is after + if (one.preLineIndex !== two.preLineIndex) { + return one.preLineIndex < two.preLineIndex ? -1 : 1; + } + } + } + var docPosition = nodeOne.compareDocumentPosition(nodeTwo); + // Handle disconnected nodes (different documents or shadow DOMs) + if (docPosition & 0x1) { + // Nodes are disconnected - they're in different trees (iframe or shadow DOM) + // Build ancestor chains using DOMWalker.parentNode (handles shadow DOM & iframes) + var ancestorsOne = [nodeOne]; + var ancestorsTwo = [nodeTwo]; + var current = nodeOne; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsOne.push(current); + } + current = nodeTwo; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsTwo.push(current); + } + // Reverse so root is first + ancestorsOne.reverse(); + ancestorsTwo.reverse(); + // Find where the paths diverge + var commonDepth = 0; + while (commonDepth < ancestorsOne.length && + commonDepth < ancestorsTwo.length && + ancestorsOne[commonDepth] === ancestorsTwo[commonDepth]) { + commonDepth++; + } + // If one path is a prefix of the other, handle containment + if (commonDepth === ancestorsOne.length) { + // nodeOne is an ancestor of nodeTwo + return one.walker.bEndTag ? 1 : -1; + } + if (commonDepth === ancestorsTwo.length) { + // nodeTwo is an ancestor of nodeOne + return two.walker.bEndTag ? -1 : 1; + } + // Compare the nodes where paths diverge + if (commonDepth > 0) { + var childOne = ancestorsOne[commonDepth]; + var childTwo = ancestorsTwo[commonDepth]; + var childPosition = childOne.compareDocumentPosition(childTwo); + if (childPosition & 0x2) + return 1; // childTwo precedes childOne + if (childPosition & 0x4) + return -1; // childOne precedes childTwo + } + // No common ancestor found - shouldn't happen in a well-formed document + return 0; + } + if (docPosition & 0x8) { + // one is contained within two + // if two is an end tag, one is before, otherwise, one is after + return two.walker.bEndTag ? -1 : 1; + } + else if (docPosition & 0x10) { + // two is contained within one + // if one is an end tag, one is after, otherwise, one is before + return one.walker.bEndTag ? 1 : -1; + } + else if (docPosition & 0x2) { + // two precedes one in the document + return 1; + } + else if (docPosition & 0x4) { + // one precedes two in the document + return -1; + } + return 0; + }; + /** + * Checks if this cursor's node contains another cursor's node + * @param other - The other cursor to check + * @returns true if this cursor contains (is a parent/ancestor of) the other cursor's node + */ + SRCursor.prototype.contains = function (other) { + return this.getNode().contains(other.getNode()) + && !this.isSameNode(other); + }; + /** + * Checks if this cursor points to the same node as another cursor + * @param other - The other cursor to compare with + * @returns true if both cursors point to the same node + */ + SRCursor.prototype.isSameNode = function (other) { + if (!other) + return false; + return this.getNode().isSameNode(other.getNode()); + }; + /** + * Checks if the current node has a non-empty accessible name + * @returns true if the node has a non-empty accessible name + */ + SRCursor.prototype.hasNonEmptyName = function () { + var _a; + return (((_a = this.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || "").trim().length > 0; + }; + return SRCursor; +}()); +exports.SRCursor = SRCursor; + + +/***/ }, + +/***/ "./src/v4/simulator/SRNavigator.ts" +/*!*****************************************!*\ + !*** ./src/v4/simulator/SRNavigator.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRNavigator = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var SRNavigator; +(function (SRNavigator) { + /** + * Determine if a node is a block-level element based on its display property + * @param node The DOM node to check + * @returns true if the node is a block-level element, false otherwise + */ + function isBlockElement(node) { + var _a; + if (node.nodeType !== 1) + return false; + if (["br", "iframe"].includes(node.nodeName.toLowerCase())) + return true; + var elem = node; + var mywin = elem.ownerDocument.defaultView; + var disp = (_a = mywin.getComputedStyle(elem)) === null || _a === void 0 ? void 0 : _a.display; + if (disp && disp.startsWith("table")) + return true; + if (disp === "block" && elem.style.display !== "block") { + // Is this block because it's a flex elem? + if (elem.parentElement && mywin.getComputedStyle(elem.parentElement).display === "flex") { + return false; + } + } + if (AriaUtil_1.AriaUtil.getResolvedRole(elem, true) === "link") { + var temp = new DOMWalker_1.DOMWalker(node, false, undefined, false); + temp.prevNode(); + if (!isBlockElement(temp.node)) { + return true; + } + } + return ["block", "flex", "grid", "list-item"].includes(disp); + } + /** + * Collect all logical lines from a <pre> element by walking its entire subtree + * (via DOMWalker, shadow-DOM safe) and concatenating text node content, splitting + * on newlines. Only inline-context nodes are included — any descendant block + * element would be unusual inside <pre> and is ignored. + * + * Returns the trimmed, non-empty lines. + */ + function getPreLines(preElem) { + var _a; + // Concatenate all text inside the <pre>, preserving inline structure + var fullText = (_a = preElem.textContent) !== null && _a !== void 0 ? _a : ""; + var rawLines = fullText.split("\n"); + // Trim leading and trailing blank lines + var start = 0; + while (start < rawLines.length && rawLines[start].trim() === "") + start++; + var end = rawLines.length - 1; + while (end >= start && rawLines[end].trim() === "") + end--; + return rawLines.slice(start, end + 1); + } + SRNavigator.getPreLines = getPreLines; + /** + * Returns true if node is a <pre> element (the item-level cursor position for + * preformatted lines uses the <pre> element itself with preLineIndex set). + */ + function isPreElement(node) { + return node.nodeType === 1 && node.nodeName.toUpperCase() === "PRE"; + } + function getExplicitTabindex(node) { + if (!node || node.nodeType !== 1) + return null; + var elem = node; + if (!elem.hasAttribute("tabindex")) + return null; + var tabindexValue = parseInt(elem.getAttribute("tabindex"), 10); + return Number.isNaN(tabindexValue) ? null : tabindexValue; + } + function isPositiveTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return explicitTabindex !== null && explicitTabindex > 0 && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function isDefaultOrZeroTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return (explicitTabindex === null || explicitTabindex === 0) && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function getTabFocusStartFunc(includePositiveTabindex) { + if (includePositiveTabindex === void 0) { includePositiveTabindex = true; } + return function (_role, bStartTag, node) { + if (!(node && node.nodeType === 1 && bStartTag && CommonUtil_1.CommonUtil.isTabbable(node))) + return false; + return includePositiveTabindex || isDefaultOrZeroTabFocus(node); + }; + } + /** + * Collect all tabbable elements in tab order (positive tabindex first, then document order) + * @param matchFunc Function to match tabbable elements + * @param rootNode Optional root node to start collection from (defaults to document body) + * @returns Array of cursors pointing to tabbable elements in tab order + */ + function collectTabFocusCursors(matchFunc, rootNode) { + var root = ((rootNode === null || rootNode === void 0 ? void 0 : rootNode.ownerDocument) || document).body || rootNode; + if (!root) + return []; + var walker = new SRCursor_1.SRCursor(root, false); + var skipFunc = getSkipFunc("tab_focus"); + var positiveResults = []; + var normalResults = []; + var addCursor = function (cursor) { + if (!matchFunc(cursor.getRole(), !cursor.isEndTag(), cursor.getNode())) + return; + if (isPositiveTabFocus(cursor.getNode())) { + positiveResults.push(cursor.clone()); + } + else if (isDefaultOrZeroTabFocus(cursor.getNode())) { + normalResults.push(cursor.clone()); + } + }; + addCursor(walker); + while (walker.next(function () { return true; }, skipFunc)) { + addCursor(walker); + } + positiveResults.sort(function (a, b) { + var aElem = a.getElement(); + var bElem = b.getElement(); + var aTabindex = getExplicitTabindex(aElem) || 0; + var bTabindex = getExplicitTabindex(bElem) || 0; + if (aTabindex !== bTabindex) + return bTabindex - aTabindex; + return SRCursor_1.SRCursor.compare(a, b); + }); + return positiveResults.concat(normalResults); + } + /** + * Find the index of a cursor in an array of tab focus cursors + * @param cursors Array of cursors to search + * @param walker The cursor to find + * @returns The index of the cursor, or -1 if not found + */ + function findTabFocusIndex(cursors, walker) { + return cursors.findIndex(function (cursor) { return SRCursor_1.SRCursor.compare(cursor, walker) === 0; }); + } + /** + * Get the match function for identifying start positions in a given navigation mode + * @param mode The navigation mode (e.g., "link", "heading", "button", etc.) + * @returns A function that matches elements appropriate for the navigation mode + */ + function getStartFunc(mode) { + switch (mode) { + case "link": + return function (role, bStartTag) { return (bStartTag && role === "link"); }; + case "tab_focus": + return getTabFocusStartFunc(false); + case "heading": + return function (role, bStartTag) { return (bStartTag && role === "heading"); }; + case "h1": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "1"); }; + case "h2": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "2"); }; + case "h3": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "3"); }; + case "h4": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "4"); }; + case "h5": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "5"); }; + case "h6": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "6"); }; + case "image": + return function (role, bStartTag) { return (bStartTag && ["img", "graphics-document"].includes(role)); }; + case "radio": + return function (role, bStartTag) { return (bStartTag && role === "radio"); }; + case "button": + return function (role, bStartTag) { return (bStartTag && role === "button"); }; + case "checkbox": + return function (role, bStartTag) { return (bStartTag && role === "checkbox"); }; + case "combo": + return function (role, bStartTag) { return (bStartTag && role === "combobox"); }; + case "list": + return function (role, bStartTag) { return (bStartTag && role === "list"); }; + case "listitem": + return function (role, bStartTag) { return (bStartTag && role === "listitem"); }; + case "article": + return function (role, bStartTag) { return (bStartTag && role === "article"); }; + case "table": + return function (role, bStartTag) { return (bStartTag && role === "table"); }; + case "paragraph": + return function (_role, bStartTag, node) { return (bStartTag && node.nodeName.toUpperCase() === "P"); }; + case "dom": + return function () { return true; }; + case "item": + return function (cursor, bStartTag, node) { + if (!bStartTag) + return false; + // <iframe> content is inlined by the IFRAME SR_RULE into the + // parent block's rendering — the iframe itself is not an item stop. + if (node.nodeType === 1 && node.nodeName.toUpperCase() === "IFRAME") + return false; + // A <pre> element with preLineIndex set is a virtual per-line item. + // The initial encounter (preLineIndex undefined) is also a match so + // jumpNext can set preLineIndex=0 on it. + if (isPreElement(node)) + return true; + if (isBlockElement(node)) + return true; + var temp = new DOMWalker_1.DOMWalker(node, !bStartTag); + if (temp.prevNode() && temp.bEndTag) { + return isBlockElement(temp.node); + } + return false; + }; + case "region": + return function (role, bStartTag, node) { + var _a, _b; + if (!bStartTag) + return false; + if (["main", "navigation", "form", "banner", "search", "contentinfo"].includes(role)) + return true; + if (role !== "region" || (node === null || node === void 0 ? void 0 : node.nodeType) !== 1) + return false; + return !!((_b = (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(node)) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.trim()); + }; + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getStartFunc = getStartFunc; + /** + * Check if an element is within a Shadow DOM + * @param element The element to check + * @returns true if the element is in a Shadow DOM, false otherwise + */ + var isInShadowDOM = function (element) { + var root = element.getRootNode(); + return root instanceof ShadowRoot; + }; + /** + * Determine skip behavior for item navigation mode + * Handles complex visibility rules including hidden content in headings/links + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_ITEM_BEHAVIOR = function (cursor) { + var DEBUG = false; + DEBUG && console.group("SKIP_ITEM_BEHAVIOR"); + var retVal = null; + try { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + var cursorStart = cursor.clone(); + cursorStart.setEndTag(false); + DEBUG && console.log(nodeType); + // Skip CDATA and comments completely + if ([4, 8].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: true }; + // Only process elements and text + if (![1, 3].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: false }; + // For text elements, Consider with relation to their parent element + if (nodeType === 3) { + elem = cursor.getNode().parentElement; + if (!elem) + return retVal = VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + } + // if (!elem) console.log(cursor.getNode()); + // We have an element + // Make sure we're within the body element (or shadow DOM, or an iframe subdocument) + if (!elem.closest("body") && !isInShadowDOM(elem)) + return retVal = { skipCurrent: true, skipChildren: false }; + // Make sure we're not in a script or style + if (elem.closest("script,style")) + return retVal = { skipCurrent: true, skipChildren: true }; + // For text nodes, we need to check visibility in context of parent heading/link + // So we'll handle text node visibility checks below with the element visibility checks + // Skip things hidden from the AT, UNLESS we're inside a heading or link + // (headings and links should include their full accessible name, including hidden parts) + // BUT only if the heading/link uses nameFrom="content" (not aria-label/aria-labelledby) + var parentHeadingOrLink = cursorStart.getCurrentOrParentByRoleClone(["heading", "link"]); + // Special case: if current element itself is a heading or link AND we're NOT inside another heading/link, + // apply normal skip rules + var currentRole = AriaUtil_1.AriaUtil.getResolvedRole(elem); + var isCurrentHeadingOrLink = currentRole === "heading" || currentRole === "link"; + if (!parentHeadingOrLink) { + // Not inside any heading/link - apply normal skip rules + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + else { + // Check if the parent heading/link uses aria-label or aria-labelledby + var parentElem = parentHeadingOrLink.getElement(); + var nameInfo = parentHeadingOrLink.getNameInfo(); + // If nameFrom is NOT "content" or "text", skip all content (it's using aria-label/aria-labelledby) + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Parent uses aria-label/aria-labelledby - skip all content including nested headings/links + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + } + else if (isCurrentHeadingOrLink) { + // Current element is a heading/link inside another heading/link with content-based name + // Don't skip it - let it through so its content can be read + // (The logic at line 183 will handle whether to skip its children) + } + else { + // nameFrom is "content", so include hidden content but skip hidden images/graphics + var role_1 = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if ((role_1 === "img" || role_1 === "graphics-document") && VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + // Don't skip other hidden content - it should be included in the accessible name + } + } + if (elem.nodeName.toUpperCase() === "BODY") + return retVal = { skipCurrent: false, skipChildren: false }; + // Skip labels that are associated with controls - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL") { + if (elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + else { + var nestedControl = elem.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']"); + if (nestedControl && nestedControl.getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + // A <label> with no `for` and no nested control, used purely as an aria-labelledby + // target by another element, should be suppressed — it will be read as part of the + // widget's accessible name announcement. + var id = elem.getAttribute("id"); + if (id && document.querySelector("[aria-labelledby~=\"".concat(id, "\"]"))) { + return retVal = { skipCurrent: true, skipChildren: false }; + } + } + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursorStart.getRole(); + // A div/span combobox (role="combobox" on a non-input, non-select element) announces + // its value directly from text content or the controlled listbox, so skip its children + // to avoid double-announcing the inner text. + if (role === "combobox" + && elem.nodeName.toUpperCase() !== "SELECT" + && elem.nodeName.toUpperCase() !== "INPUT" + && !cursor.isEndTag()) { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // Skip children of headings/links that don't use content-based names + // UNLESS we're inside another heading/link that DOES use content-based names + if (["link", "heading"].includes(role) && (!cursorStart.getName() || (!["content", "text"].includes(cursorStart.getNameInfo().nameFrom)))) { + // Check if we're inside a parent heading/link with content-based name + if (parentHeadingOrLink && parentHeadingOrLink.getNameInfo() && ["content", "text"].includes(parentHeadingOrLink.getNameInfo().nameFrom)) { + // Don't skip children - we're nested inside a content-based heading/link + } + else { + return retVal = { skipCurrent: false, skipChildren: true }; + } + } + if (elem.nodeName.toUpperCase() === "LEGEND") { + var parent_1 = DOMWalker_1.DOMWalker.parentElement(cursor.getNode()); + while (parent_1) { + if (parent_1.nodeName.toUpperCase() === 'FIELDSET') { + // Legend is within a fieldset, suppress output + return retVal = { skipCurrent: false, skipChildren: true }; + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // <summary> is a self-announcing disclosure button — its children + // are folded into the ["label", button, collapsed] announcement, + // so skip traversal into them. + if (!cursor.isEndTag() && elem.nodeName.toUpperCase() === "SUMMARY") { + var detailsParent = elem.parentElement; + if (detailsParent && detailsParent.nodeName.toUpperCase() === "DETAILS") { + return retVal = { skipCurrent: false, skipChildren: true }; + } + } + // Skip non-summary children of a closed <details> element. + // Browsers hide those children via UA stylesheet (display:none), so + // they must not appear as reading stops when the widget is collapsed. + // Exempt the <details> element itself and <summary> (always visible). + if (!cursor.isEndTag() + && elem.nodeName.toUpperCase() !== "DETAILS" + && !elem.closest("summary")) { + var detailsAncestor = elem.closest("details"); + if (detailsAncestor && !detailsAncestor.hasAttribute("open")) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + } + if (elem.closest(".ibma-sr-overlay")) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + // Skip popup elements (listbox, tree, grid, dialog) that are owned by a combobox + // via aria-controls. In a real SR these are only reachable via aria-activedescendant, + // not by DOM traversal, so they should not appear as reading stops. + if (nodeType === 1 && !cursor.isEndTag()) { + var id = elem.getAttribute("id"); + if (id) { + var owner = document.querySelector("[aria-controls~=\"".concat(id, "\"]")); + if (owner && AriaUtil_1.AriaUtil.getResolvedRole(owner) === "combobox") { + return retVal = { skipCurrent: true, skipChildren: true }; + } + } + } + return retVal = null; + } + finally { + DEBUG && console.log("SKIP_ITEM retVal:", retVal); + DEBUG && console.groupEnd(); + } + }; + /** + * Determine skip behavior for nested navigation modes (link, heading, image, etc.) + * Simpler than SKIP_ITEM_BEHAVIOR as it doesn't need complex heading/link content rules + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_NESTED_BEHAVIOR = function (cursor) { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + // Only visit elements and text nodes + if (nodeType !== 1 && nodeType !== 3) + return { skipCurrent: true, skipChildren: false }; + if (nodeType === 3) + return VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + // We have an element + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return { skipCurrent: true, skipChildren: true }; + // Skip the inner document of an <iframe> — screen readers render the + // accessible name as the tab_focus label; the subdocument body should + // not contribute additional reading stops during renderRange traversal. + if (elem.nodeName.toUpperCase() === "IFRAME" && !cursor.isEndTag()) { + return { skipCurrent: false, skipChildren: true }; + } + // Skip label fors - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL" + && elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return { skipCurrent: true, skipChildren: false }; + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursor.getRole(); + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return { skipCurrent: false, skipChildren: true }; + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return { skipCurrent: true, skipChildren: true }; + } + if (elem.closest(".ibma-sr-overlay")) { + return { skipCurrent: true, skipChildren: true }; + } + return null; + }; + /** + * Get the skip function for a given navigation mode + * @param mode The navigation mode + * @returns A function that determines which nodes to skip during navigation + */ + function getSkipFunc(mode) { + switch (mode) { + case "region": + case "item": + return SKIP_ITEM_BEHAVIOR; + case "link": + case "tab_focus": + case "heading": + case "h1": + case "h2": + case "h3": + case "h4": + case "h5": + case "h6": + case "image": + return SKIP_NESTED_BEHAVIOR; + case "radio": + case "button": + case "checkbox": + case "combo": + case "list": + case "listitem": + case "article": + case "table": + case "paragraph": + case "dom": + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getSkipFunc = getSkipFunc; + /** + * Jump to the current position or the previous matching element if current doesn't match + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the current or previous matching position + */ + function jumpCurrent(mode, walker) { + var matchFunc = mode === "tab_focus" ? getTabFocusStartFunc(true) : getStartFunc(mode); + if (matchFunc(walker.getRole(), !walker.isEndTag(), walker.getNode())) { + return walker.clone(); + } + else { + return jumpPrevious(mode, walker); + } + } + SRNavigator.jumpCurrent = jumpCurrent; + /** + * Jump to the end of the current element and return all intermediate item positions + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns Array of cursors representing positions from current to end + */ + function jumpCurrentEnd(mode, walker) { + if (mode === "item") { + // For any <pre> item (block-enter stop or per-line stop), the render range + // must end at the next virtual line cursor (same <pre> node, next index) so + // that renderRange never walks into <pre>'s children. + if (isPreElement(walker.getNode()) && !walker.isEndTag()) { + var lines = getPreLines(walker.getNode()); + var nextIdx = walker.preLineIndex === undefined ? 0 : walker.preLineIndex + 1; + // Use nextIdx as the end sentinel — even if it equals lines.length (past + // the last line), compare() will still correctly stop renderRange before + // any child node because children are contained within <pre>. + var endCursor = walker.clone(); + endCursor.preLineIndex = nextIdx; + return [endCursor]; + } + var itemEnd = jumpNext(mode, walker); + return itemEnd ? [itemEnd] : []; + } + else { + var nameInfo = walker.getNameInfo(); + var retVal = walker.clone(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Name is just from the item itself + retVal.next(function () { return true; }); + } + else { + // Name is from the content + retVal.setEndTag(true); + retVal.next(function () { return true; }); + } + var endCursors = []; + var itemEnd = jumpNext("item", walker); + while (itemEnd && SRCursor_1.SRCursor.compare(itemEnd, retVal) < 0) { + endCursors.push(itemEnd); + itemEnd = jumpNext("item", itemEnd); + } + endCursors.push(retVal); + return mode === "tab_focus" && walker.getRole() === "link" ? [endCursors[endCursors.length - 1]] : endCursors; + } + } + SRNavigator.jumpCurrentEnd = jumpCurrentEnd; + /** + * Jump to the next matching element in the given navigation mode + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the next matching position, or null if none found + */ + function jumpNext(mode, walker) { + var DEBUG = false; + DEBUG && console.group("SRNavigator::jumpNext", walker.isEndTag() ? "/" : "", walker.getNode()); + try { + if (mode === "tab_focus") { + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + // console.log(tabFocusCursors.map(c => c.getNode())); + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex >= 0) { + if (currentIndex + 1 < tabFocusCursors.length) { + return tabFocusCursors[currentIndex + 1].clone(); + } + return null; + } + return tabFocusCursors[0].clone(); + } + } + if (mode === "item" && isPreElement(walker.getNode()) && !walker.isEndTag()) { + var lines = getPreLines(walker.getNode()); + if (walker.preLineIndex === undefined) { + // At the block-enter stop — jump to the first line item + if (lines.length > 0) { + var retVal_1 = walker.clone(); + retVal_1.preLineIndex = 0; + return retVal_1; + } + // Empty <pre> — fall through to DOM traversal past </pre> + } + else { + // At a line item — advance to the next line or past </pre> + var currentLineIdx = walker.preLineIndex; + if (currentLineIdx + 1 < lines.length) { + var retVal_2 = walker.clone(); + retVal_2.preLineIndex = currentLineIdx + 1; + return retVal_2; + } + // All lines exhausted — move past </pre> to the next DOM item. + // Always land on the block-enter stop (preLineIndex=undefined) so the + // caller gets a chance to render the container-enter announcement before + // advancing to the first line. + var retVal_3 = walker.clone(); + retVal_3.setEndTag(true); + var matchFunc_1 = getStartFunc(mode); + var skipFunc_1 = getSkipFunc(mode); + if (retVal_3.next(matchFunc_1, skipFunc_1)) { + if (isPreElement(retVal_3.getNode()) && !retVal_3.isEndTag()) { + retVal_3.preLineIndex = undefined; // block-enter stop + } + return retVal_3; + } + return null; + } + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.next(matchFunc, skipFunc)) { + // Landing on <pre> via DOM traversal always starts at the block-enter stop + // (preLineIndex=undefined). The per-line items are returned on subsequent + // calls via the isPreElement early-return above. + if (mode === "item" && isPreElement(retVal.getNode()) && !retVal.isEndTag()) { + retVal.preLineIndex = undefined; + } + DEBUG && console.log("SRNavigator::jumpNext result", retVal); + return retVal; + } + else { + return null; + } + } + finally { + console.groupEnd(); + } + } + SRNavigator.jumpNext = jumpNext; + /** + * Navigates to the previous element in screen reader navigation based on the specified mode. + * + * For tab_focus mode, this function attempts to move to the previous tabbable element by: + * 1. First trying to move backward using the mode's match and skip functions + * 2. If that fails, collecting all tab focus cursors and finding the previous one in the tab order + * + * @param mode - The navigation mode (e.g., "tab_focus") that determines how to navigate + * @param walker - The current cursor position in the screen reader navigation + * @returns A new cursor positioned at the previous element, or null if no previous element exists + */ + function jumpPrevious(mode, walker) { + if (mode === "tab_focus") { + var retVal_4 = walker.clone(); + var matchFunc_2 = getStartFunc(mode); + var skipFunc_2 = getSkipFunc(mode); + if (retVal_4.previous(matchFunc_2, skipFunc_2)) { + return retVal_4; + } + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex > 0) { + return tabFocusCursors[currentIndex - 1].clone(); + } + } + return null; + } + if (mode === "item" && isPreElement(walker.getNode()) && !walker.isEndTag()) { + if (walker.preLineIndex === undefined) { + // At the block-enter stop — go to the previous DOM item (before <pre>) + // fall through to normal previous() traversal below + } + else if (walker.preLineIndex === 0) { + // At the first line — step back to the block-enter stop + var retVal_5 = walker.clone(); + retVal_5.preLineIndex = undefined; + return retVal_5; + } + else { + // Step back one line + var retVal_6 = walker.clone(); + retVal_6.preLineIndex = walker.preLineIndex - 1; + return retVal_6; + } + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.previous(matchFunc, skipFunc)) { + // If we just landed on a <pre> element, position at its last line + if (mode === "item" && isPreElement(retVal.getNode()) && !retVal.isEndTag()) { + var lines = getPreLines(retVal.getNode()); + retVal.preLineIndex = lines.length > 0 ? lines.length - 1 : undefined; + } + return retVal; + } + else { + return null; + } + } + SRNavigator.jumpPrevious = jumpPrevious; +})(SRNavigator = exports.SRNavigator || (exports.SRNavigator = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRRenderer.ts" +/*!****************************************!*\ + !*** ./src/v4/simulator/SRRenderer.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRenderer = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var SRNavigator_1 = __webpack_require__(/*! ./SRNavigator */ "./src/v4/simulator/SRNavigator.ts"); +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var render_rules_1 = __webpack_require__(/*! ./render_rules */ "./src/v4/simulator/render_rules/index.ts"); +var common_1 = __webpack_require__(/*! ./render_rules/common */ "./src/v4/simulator/render_rules/common.ts"); +/** + * SRRenderer namespace provides functionality for simulating how screen readers + * announce content to users. It contains rules for rendering different types of + * elements and ARIA roles in various navigation modes. + * + * The renderer uses a rule-based system to determine what text should be announced + * when navigating to, within, or away from elements based on their roles and properties. + */ +var SRRenderer; +(function (SRRenderer) { + /** + * Generates the announcement text when entering an element + * + * This function looks up the appropriate rule based on the element's role or tag name + * and applies it to generate the announcement text. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for entering the element, or null if no rule applies + */ + function renderEnter(mode, walker, oldWalker) { + var DEBUG = false; + for (var _i = 0, CONTAINER_ENTER_RULES_1 = render_rules_1.CONTAINER_ENTER_RULES; _i < CONTAINER_ENTER_RULES_1.length; _i++) { + var rule = CONTAINER_ENTER_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + DEBUG && console.log(mode, walker, rule, s); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderEnter = renderEnter; + /** + * Generates the announcement text when leaving an element + * + * Similar to renderEnter, but applies rules for leaving elements instead. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for leaving the element, or null if no rule applies + */ + function renderLeave(mode, walker, oldWalker) { + for (var _i = 0, CONTAINER_EXIT_RULES_1 = render_rules_1.CONTAINER_EXIT_RULES; _i < CONTAINER_EXIT_RULES_1.length; _i++) { + var rule = CONTAINER_EXIT_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderLeave = renderLeave; + /** + * Renders the current element and any container changes + * + * This function combines announcements for: + * - Containers being left + * - Containers being entered + * - The current element itself + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param containerChanges - Information about containers being entered or left + * @returns Combined announcement text + */ + function renderCurrent(mode, walker, containerChanges) { + var DEBUG = false; //mode === "tab_focus" && document.getElementById("fixture")?.getAttribute("class") === "tomtest"; + var startOfRender = SRNavigator_1.SRNavigator.jumpCurrent(mode, walker); + if (!startOfRender) + return null; + var endOfRenders = SRNavigator_1.SRNavigator.jumpCurrentEnd(mode, startOfRender); + if (!endOfRenders || endOfRenders.length === 0) { + endOfRenders = [null]; + } + DEBUG && console.log("AAAA", startOfRender.isStartTag(), startOfRender.getNode()); + DEBUG && console.log("BBBB", endOfRenders.map(function (val) { return val && val.isStartTag(); }), endOfRenders.map(function (val) { return val && val.getNode(); })); + var endOfRender = endOfRenders[endOfRenders.length - 1]; + var renderStr = ""; + for (var _i = 0, endOfRenders_1 = endOfRenders; _i < endOfRenders_1.length; _i++) { + var candidateEnd = endOfRenders_1[_i]; + var candidateRenderStr = SRRenderer.renderRange(mode, startOfRender, candidateEnd); + if (candidateRenderStr.trim().length > 0) { + endOfRender = candidateEnd; + renderStr = candidateRenderStr; + break; + } + } + if (renderStr === "") { + renderStr = SRRenderer.renderRange(mode, startOfRender, endOfRender); + } + DEBUG && console.log("CCCC", renderStr); + return { + start: startOfRender, + end: endOfRender, + message: (containerChanges.leaving || []).concat(containerChanges.entering || []).concat([renderStr]).join(" ").replace(/\s+/g, " ") + }; + } + SRRenderer.renderCurrent = renderCurrent; + /** + * Renders a range of elements between two cursors + * + * This function traverses the DOM from startOfRender to endOfRender, + * applying rendering rules to each element and combining the results. + * + * @param mode - The current navigation mode + * @param startOfRender - Cursor at the start of the range + * @param endOfRender - Cursor at the end of the range + * @returns Combined announcement text for the entire range + */ + function renderRange(mode, startOfRender, endOfRender) { + var _a; + var iterWalker = startOfRender.clone(); + var elemStrs = []; + var bContinue = true; + var currentLink = null; + while (bContinue) { + var elem = iterWalker.getElement(); + var node = iterWalker.getNode(); + var nodeType = node.nodeType; + var renderStrs = []; + var linkParent = AriaUtil_1.AriaUtil.getAncestorWithRole(node, "link", true); + if (linkParent && !["content", "text"].includes((_a = new SRCursor_1.SRCursor(linkParent).getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + // We don't consider links that announce themselves + linkParent = null; + } + for (var _i = 0, SR_RULES_1 = render_rules_1.SR_RULES; _i < SR_RULES_1.length; _i++) { + var rule = SR_RULES_1[_i]; + var s = rule.test(mode, iterWalker); + if (typeof s !== "undefined" && s !== null && s.trim().length > 0) { + if (nodeType === 1 && !iterWalker.isEndTag() && elem.getAttribute("aria-haspopup") === "menu") { + s = "[subMenu] " + s; + } + // Handle links + if (mode === "tab_focus") { + // We're in link mode + if (currentLink && (!linkParent || (linkParent && currentLink !== linkParent))) { + // We've added a string within a link (currentLink), but now we've left the link or moved to a new link + s = "".concat(s, " ").concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false))); + } + } + else { + if (linkParent && (!currentLink || (currentLink !== linkParent))) { + // We're in a link, and we haven't announced this link, or we've moved to a new link + s = "".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(linkParent, false)), " ").concat(s); + } + } + if (s !== "") { + currentLink = linkParent; + elemStrs.push(s); + } + break; + } + } + elemStrs.push(renderStrs.filter(function (s) { return s.trim().length > 0; }).join(" ")); + bContinue = iterWalker.next(function () { return true; }, SRNavigator_1.SRNavigator.getSkipFunc(mode)) && SRCursor_1.SRCursor.compare(iterWalker, endOfRender) < 0; + } + if (mode === "tab_focus" && currentLink) { + elemStrs.push("".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false)))); + } + var retVal = elemStrs.filter(function (s) { return s.trim().length > 0; }).join(" "); + retVal = retVal.replace(/, \u0001([^\u0002]+)\u0002/g, function (match, describedByText) { + var quotedText = "\"".concat(describedByText, "\""); + var unmarkedRetVal = retVal.replace(match, ""); + return unmarkedRetVal.includes(quotedText) || unmarkedRetVal.includes(describedByText) ? "" : ", ".concat(quotedText); + }); + retVal = retVal.replace(/[\u0001\u0002]/g, ""); + return retVal; + } + SRRenderer.renderRange = renderRange; +})(SRRenderer = exports.SRRenderer || (exports.SRRenderer = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRRendererRule.ts" +/*!********************************************!*\ + !*** ./src/v4/simulator/SRRendererRule.ts ***! + \********************************************/ +(__unused_webpack_module, exports) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRendererRule = void 0; +var SRRendererRule = /** @class */ (function () { + function SRRendererRule(ruleDefinition) { + this.ruleDefinition = ruleDefinition; + } + SRRendererRule.prototype.test = function (mode, cursor, oldCursor) { + if (this.ruleDefinition.modes.includes(mode) + && (this.ruleDefinition.roles.includes(cursor.getRole()) + || this.ruleDefinition.elems.includes(cursor.getNode().nodeName.toUpperCase()))) { + for (var _i = 0, _a = this.ruleDefinition.tests; _i < _a.length; _i++) { + var test_1 = _a[_i]; + var s = test_1(cursor, oldCursor, mode); + if (typeof s === "string") + return s; + } + } + return null; + }; + return SRRendererRule; +}()); +exports.SRRendererRule = SRRendererRule; + + +/***/ }, + +/***/ "./src/v4/simulator/SRTableUtil.ts" +/*!*****************************************!*\ + !*** ./src/v4/simulator/SRTableUtil.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRTableUtil = void 0; +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +/** + * TableUtil namespace provides utility functions for handling HTML tables in the accessibility simulator. + * These functions help determine cell positions, relationships, and extract header information + * to simulate how screen readers would announce table navigation. + */ +var SRTableUtil; +(function (SRTableUtil) { + /** + * Determines if the cursor is pointing to a cell element (TD or TH) + * or has a cell-related ARIA role + * @param cursor - The SRCursor to check + * @returns true if the cursor is on a cell, false otherwise + */ + function isCursorCellRole(cursor) { + if (!cursor.getElement()) + return false; + if (["cell", "rowheader", "columnheader"].includes(cursor.getRole())) { + return true; + } + return !cursor.getElement().hasAttribute("role") && ["TH", "TD"].includes(cursor.getElement().nodeName.toUpperCase()); + } + SRTableUtil.isCursorCellRole = isCursorCellRole; + /** + * Gets a cursor pointing to the current cell or the parent cell if the cursor + * is inside a cell's content + * @param cursor - The SRCursor to check + * @returns A new SRCursor pointing to the cell or null if not in a cell + */ + function getCurrentOrParentCellCursor(cursor) { + return cursor.getCurrentOrParentByRoleClone(["cell", "rowheader", "columnheader"], ["TD", "TH"]); + } + SRTableUtil.getCurrentOrParentCellCursor = getCurrentOrParentCellCursor; + /** + * Get the colspan of a cell at a given location + * @param cursor The cursor to get the colspan from + * @returns The colspan of the cell at the cursor's location or 0 if not in a column + */ + function getColSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var colSpan = cursor.getElement().getAttribute("colspan"); + if (colSpan) { + return parseInt(colSpan); + } + return 1; + } + SRTableUtil.getColSpan = getColSpan; + /** + * Get the rowspan of a cell at a given location + * @param cursor The cursor to get the rowspan from + * @returns The rowspan of the cell at the cursor's location or 0 if not in a column + */ + function getRowSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var rowSpan = cursor.getElement().getAttribute("rowspan"); + if (rowSpan) { + return parseInt(rowSpan); + } + return 1; + } + SRTableUtil.getRowSpan = getRowSpan; + /** + * Builds a complete model of a table's structure, accounting for rowspan and colspan + * + * This function traverses the entire table and creates a data structure that represents + * the logical grid of cells, properly handling cells that span multiple rows or columns. + * The resulting model makes it easier to determine cell relationships and positions. + * + * @param inTableCursor - A cursor within the table + * @returns A TableModel representing the complete table structure, or null if not in a table + */ + function getTableModel(inTableCursor) { + // Get a cursor pointing to the table element + var tableCursor = inTableCursor.getCurrentOrParentByRoleClone(["table"]); + if (!tableCursor) + return null; + var walkTableCursor = tableCursor.clone(); + var retVal = []; // The complete table model we're building + var curRow = []; // The current row being processed + var prevRow; // The previous row (needed for rowspan handling) + // Walk through the table's DOM structure + while (walkTableCursor.next(function () { return true; }) && !walkTableCursor.getNode().isSameNode(tableCursor.getNode())) { + if (walkTableCursor.isEndTag() && walkTableCursor.getRole() === "row") { + // Reached the end of the row, push what we have and reset + retVal.push(curRow); + prevRow = curRow; + curRow = []; + // Handle cells with rowspan from previous rows that affect this row + // This ensures cells spanning multiple rows are properly represented in the model + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + // Process each cell in the row + if (!walkTableCursor.isEndTag() && isCursorCellRole(walkTableCursor)) { + var colspan = getColSpan(walkTableCursor); + // Create a cell model with position and spanning information + var cellInfo = { + rowIndexStart: retVal.length, + colIndexStart: curRow.length, + rowspan: getRowSpan(walkTableCursor), + colspan: colspan, + cellCursor: walkTableCursor.clone() + }; + // For cells with colspan, add the same cell info to multiple columns + for (var idx = 0; idx < colspan; ++idx) { + curRow.push(cellInfo); + } + // Continue handling cells with rowspan from previous rows + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + } + return retVal; + } + SRTableUtil.getTableModel = getTableModel; + /** + * Gets the cell model for a specific cell in the table + * + * This function finds the CellModel object that represents a specific cell, + * which contains information about its position and spanning. + * + * @param inCellCursor - A cursor pointing to a cell or its contents + * @param tableModel - Optional pre-built table model (will be created if not provided) + * @returns The CellModel for the specified cell, or null if not found + */ + function getCellModel(inCellCursor, tableModel) { + var cellCursor = getCurrentOrParentCellCursor(inCellCursor); + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + } + // Search through the table model to find the matching cell + for (var rowIndex = 0; rowIndex < tableModel.length; ++rowIndex) { + for (var colIndex = 0; colIndex < tableModel[rowIndex].length; ++colIndex) { + if (tableModel[rowIndex][colIndex].cellCursor.isSameNode(cellCursor)) { + return tableModel[rowIndex][colIndex]; + } + } + } + return null; + } + SRTableUtil.getCellModel = getCellModel; + /** + * Checks if a cell spans a specific column + * + * @param cellModel - The cell model to check + * @param colIdx - The column index to check + * @returns True if the cell contains the specified column + */ + function cellModelContainsColumn(cellModel, colIdx) { + return colIdx >= cellModel.colIndexStart && colIdx < cellModel.colIndexStart + cellModel.colspan; + } + SRTableUtil.cellModelContainsColumn = cellModelContainsColumn; + /** + * Checks if a cell spans a specific row + * + * @param cellModel - The cell model to check + * @param rowIdx - The row index to check + * @returns True if the cell contains the specified row + */ + function cellModelContainsRow(cellModel, rowIdx) { + return rowIdx >= cellModel.rowIndexStart && rowIdx < cellModel.rowIndexStart + cellModel.rowspan; + } + SRTableUtil.cellModelContainsRow = cellModelContainsRow; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeaders(cursor) { + return ""; + } + SRTableUtil.getRowHeaders = getRowHeaders; + /** + * Gets the column headers associated with a cell + * First checks for explicit headers attribute, then looks for column headers in the same column + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getColumnHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var colDatas = []; + for (var colIdx = cellModel.colIndexStart; colIdx < cellModel.colIndexStart + cellModel.colspan; ++colIdx) { + colDatas.push({ + potentialColHeaders: [], + existsDataCell: false, + colIdx: colIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same column (ignore column headers) + .filter(function (cursor) { return colDatas.some(function (colData) { return cellModelContainsColumn(SRTableUtil.getCellModel(cursor, tableModel), colData.colIdx); }); }); + } + else { + // Get all cells in this column + // Note - if everything in this column is empty or a header cell, this is probably not a heading + for (var rowIdx = 0; rowIdx < tableModel.length; ++rowIdx) { + var _loop_1 = function (colData) { + var colIdx = colData.colIdx; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "columnheader") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "col" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + } + else { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + } + }; + for (var _i = 0, colDatas_1 = colDatas; _i < colDatas_1.length; _i++) { + var colData = colDatas_1[_i]; + _loop_1(colData); + } + } + for (var _a = 0, colDatas_2 = colDatas; _a < colDatas_2.length; _a++) { + var colData = colDatas_2[_a]; + if (!colData.existsDataCell) { + colData.potentialColHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return colDatas.some(function (colData) { return colData.potentialColHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getColumnHeadersForCursor = getColumnHeadersForCursor; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var rowDatas = []; + for (var rowIdx = cellModel.rowIndexStart; rowIdx < cellModel.rowIndexStart + cellModel.rowspan; ++rowIdx) { + rowDatas.push({ + potentialRowHeaders: [], + existsDataCell: false, + rowIdx: rowIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same row (ignore column headers) + .filter(function (cursor) { return rowDatas.some(function (rowData) { return cellModelContainsRow(SRTableUtil.getCellModel(cursor, tableModel), rowData.rowIdx); }); }); + } + else { + // Get all cells in the rows + // Note - if everything in the row is empty or a header cell, this is probably not a heading + var longestRow = rowDatas.reduce(function (prev, cur) { return Math.max(prev, tableModel[cur.rowIdx].length); }, 0); + for (var colIdx = 0; colIdx < longestRow; ++colIdx) { + var _loop_2 = function (rowData) { + var rowIdx = rowData.rowIdx; + if (colIdx >= tableModel[rowIdx].length) + return "continue"; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "rowheader") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "row" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + } + else { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + } + }; + for (var _i = 0, rowDatas_1 = rowDatas; _i < rowDatas_1.length; _i++) { + var rowData = rowDatas_1[_i]; + _loop_2(rowData); + } + } + for (var _a = 0, rowDatas_2 = rowDatas; _a < rowDatas_2.length; _a++) { + var rowData = rowDatas_2[_a]; + if (!rowData.existsDataCell) { + rowData.potentialRowHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return rowDatas.some(function (rowData) { return rowData.potentialRowHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getRowHeadersForCursor = getRowHeadersForCursor; + /** + * Determines if a cell is a data cell (not a header cell) + * + * A data cell is one with either: + * - An explicit ARIA role of "cell" + * - A TD element without an overriding role attribute + * + * @param checkCursor - The cursor to check + * @returns True if the cursor points to a data cell + */ + function isDataCell(checkCursor) { + var checkCursorElem = checkCursor.getElement(); + if (!checkCursorElem) + return false; + return checkCursor.getRole() === "cell" || (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TD"); + } + SRTableUtil.isDataCell = isDataCell; +})(SRTableUtil = exports.SRTableUtil || (exports.SRTableUtil = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRUtil.ts" +/*!************************************!*\ + !*** ./src/v4/simulator/SRUtil.ts ***! + \************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRUtil = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var SRUtil; +(function (SRUtil) { + function isModalDialogElement(node) { + if (node.nodeType !== 1) + return false; + var elem = node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem, true); + return role === "dialog" && elem.getAttribute("aria-modal") === "true" && VisUtil_1.VisUtil.isNodeVisible(node); + } + SRUtil.isModalDialogElement = isModalDialogElement; + /** + * Generates a unique CSS selector for a specific HTML element + * The selector is built using a combination of: + * 1. Element tag name + * 2. ID (if available) + * 3. Classes (if available) + * 4. Attributes (if needed) + * 5. nth-child selectors for position in parent + * + * @param element The HTML element to generate a selector for + * @param optimized If true, creates a shorter but possibly less robust selector + * @return A CSS selector string that uniquely identifies the element + */ + function getUniqueSelector(element, optimized) { + if (optimized === void 0) { optimized = false; } + // If the element has an ID, that's the most direct way to select it + if (element.id) { + return "#".concat(CSS.escape(element.id)); + } + // If we're at the root or document element, return the tag name + if (element.isSameNode(document.documentElement) || element.isSameNode(document.body)) { + return element.tagName.toLowerCase(); + } + // Start building the selector with the tag name + var selector = element.tagName.toLowerCase(); + // Add classes if available and we're not optimizing for brevity + if (element.classList.length && !optimized) { + // Take up to 3 classes to avoid overly specific selectors + var classes = Array.from(element.classList).slice(0, 3); + selector += classes.map(function (cls) { return ".".concat(CSS.escape(cls)); }).join(''); + } + // Add distinguishing attributes if needed and not optimizing + if (!optimized) { + // Consider adding role, aria-label, or other distinctive attributes + if (element.hasAttribute('role')) { + selector += "[role=\"".concat(CSS.escape(element.getAttribute('role') || ''), "\"]"); + } + if (element.hasAttribute('aria-label')) { + var label = element.getAttribute('aria-label') || ''; + if (label.length <= 20) { // Avoid overly long selectors + selector += "[aria-label=\"".concat(CSS.escape(label), "\"]"); + } + } + // For inputs, add type attribute + if (element.tagName.toLowerCase() === 'input' && element.hasAttribute('type')) { + selector += "[type=\"".concat(CSS.escape(element.getAttribute('type') || ''), "\"]"); + } + } + // If we have a parent node, determine position among siblings + if (element.parentElement) { + // Find all siblings with the same tag + var siblings = Array.from(element.parentElement.children) + .filter(function (child) { return child.tagName === element.tagName; }); + // If there's more than one sibling with the same tag, add nth-child + if (siblings.length > 1) { + var index = siblings.indexOf(element) + 1; + selector += ":nth-of-type(".concat(index, ")"); + } + // If we're not at the root, recursively build the parent selector + // but use optimized selectors for ancestors to keep the overall selector manageable + return "".concat(getUniqueSelector(element.parentElement, true), " > ").concat(selector); + } + return selector; + } + SRUtil.getUniqueSelector = getUniqueSelector; +})(SRUtil = exports.SRUtil || (exports.SRUtil = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRViewer.ts" +/*!**************************************!*\ + !*** ./src/v4/simulator/SRViewer.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRViewer = exports.SROverlay = void 0; +var SRController_1 = __webpack_require__(/*! ./SRController */ "./src/v4/simulator/SRController.ts"); +/** + * SROverlay class for creating a UI widget to control screen reader simulation + * Provides buttons for navigation and displays results + */ +var SROverlay = /** @class */ (function () { + /** + * Creates a new SROverlay + * @param controller The SRController instance to use for navigation + */ + function SROverlay(srViewer) { + this.srViewer = srViewer; + /** Navigation modes available in the UI */ + this.navigationModes = [ + { mode: "item", label: "Item" }, + { mode: "tab_focus", label: "Tabbable" }, + { mode: "heading", label: "Heading" }, + { mode: "region", label: "Region" } + ]; + this.createOverlay(); + } + SROverlay.prototype.createDOMElement = function (elemName, attrs, styles) { + var retVal = this.srViewer.viewerDoc.createElement(elemName); + if (attrs) { + for (var key in attrs) { + retVal[key] = attrs[key]; + } + } + if (styles) { + for (var key in styles) { + retVal.style[key] = styles[key]; + } + } + return retVal; + }; + /** + * Creates the overlay UI elements and adds them to the DOM + */ + SROverlay.prototype.createOverlay = function () { + var _this = this; + // Create main container + this.container = this.createDOMElement("div", { + className: "ibma-sr-overlay" + }, { + position: 'fixed', + bottom: '0', + left: '0', + width: '100%', + backgroundColor: 'rgba(0, 0, 0, 0.8)', + color: 'white', + padding: '10px', + zIndex: '10000', + display: 'flex', + flexDirection: 'column', + gap: '10px' + }); + // Create controls container + var controlsContainer = this.createDOMElement("div", {}, { + display: "flex", flexWrap: "wrap", gap: "10px" + }); + // Create navigation mode groups + this.navigationModes.forEach(function (navMode) { + var modeGroup = _this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + modeGroup.appendChild(_this.createDOMElement('span', { + textContent: navMode.label + ":" + }, {})); + // Previous button + var prevButton = _this.createDOMElement('button', { + textContent: '◀ Prev' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + prevButton.addEventListener('click', function () { return _this.srViewer.navigatePrevious(navMode.mode); }); + modeGroup.appendChild(prevButton); + // Next button + var nextButton = _this.createDOMElement('button', { + textContent: 'Next ▶' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + nextButton.addEventListener('click', function () { return _this.srViewer.navigateNext(navMode.mode); }); + modeGroup.appendChild(nextButton); + controlsContainer.appendChild(modeGroup); + }); + var otherButtonGroup = this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + // Show all button + var showAllButton = this.createDOMElement('button', { + textContent: 'Show all' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + showAllButton.addEventListener('click', function () { return _this.srViewer.showAll(true); }); + otherButtonGroup.appendChild(showAllButton); + // Toggle Speech Button + var toggleSpeech = this.createDOMElement('button', { + textContent: 'Toggle speech' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + toggleSpeech.addEventListener('click', function () { return _this.srViewer.toggleSpeech(); }); + otherButtonGroup.appendChild(toggleSpeech); + controlsContainer.appendChild(otherButtonGroup); + // Create results display + this.resultsDisplay = this.createDOMElement('div', { + textContent: 'Screen reader simulation results will appear here.' + }, { + padding: '10px', + backgroundColor: 'rgba(255, 255, 255, 0.1)', + borderRadius: '3px', + minHeight: '100px', + maxHeight: '50vh', + fontFamily: 'monospace', + overflow: 'auto' + }); + // Add elements to container + this.container.appendChild(controlsContainer); + this.container.appendChild(this.resultsDisplay); + // Add to document + this.srViewer.viewerDoc.body.appendChild(this.container); + }; + /** + * Display the navigation result in the overlay + * @param result The navigation result + * @param mode The navigation mode used + * @param direction The navigation direction ('next', 'previous', or 'focus') + */ + SROverlay.prototype.displayResult = function (result, mode, direction) { + var _a, _b, _c, _d; + var displayText = ''; + if (result.success) { + // console.log("???", result); + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + else { + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + (_b = (_a = result.renderingResult.end) === null || _a === void 0 ? void 0 : _a.getElement()) === null || _b === void 0 ? void 0 : _b.scrollIntoView(); + (_d = (_c = result.renderingResult.start) === null || _c === void 0 ? void 0 : _c.getElement()) === null || _d === void 0 ? void 0 : _d.scrollIntoView(); + window.scrollBy(0, -200); + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.textContent = displayText; + var inspectButton = this.createDOMElement("button", { + innerText: "Debug" + }, {}); + inspectButton.addEventListener("click", function () { + var _a, _b; + console.log((_a = result.renderingResult.start) === null || _a === void 0 ? void 0 : _a.getNode(), (_b = result.renderingResult.end) === null || _b === void 0 ? void 0 : _b.getNode()); + }); + this.resultsDisplay.appendChild(inspectButton); + }; + SROverlay.prototype.displayAll = function (result) { + var _this = this; + var table = this.createDOMElement("table", {}, {}); + var headerRow = this.createDOMElement("tr", {}, {}); + var headingLabels = ["Region", "Heading", "Item", "Tabbable"]; + var headingFields = ["region", "heading", "item", "tab_focus"]; + for (var _i = 0, headingLabels_1 = headingLabels; _i < headingLabels_1.length; _i++) { + var headingLabel = headingLabels_1[_i]; + headerRow.appendChild(this.createDOMElement("th", { + scope: "col", + innerText: headingLabel + }, { + textAlign: "left", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + table.appendChild(headerRow); + } + var _loop_1 = function (line) { + var dataRow = this_1.createDOMElement("tr", {}, {}); + headingFields.forEach(function (field) { + dataRow.appendChild(_this.createDOMElement("td", { + innerText: line[field] + }, { + verticalAlign: "top", + border: "solid white 1px", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + }); + table.appendChild(dataRow); + }; + var this_1 = this; + for (var _a = 0, result_1 = result; _a < result_1.length; _a++) { + var line = result_1[_a]; + _loop_1(line); + } + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.appendChild(table); + }; + /** + * Remove the overlay from the DOM + */ + SROverlay.prototype.destroy = function () { + if (this.container && this.container.parentNode) { + this.container.parentNode.removeChild(this.container); + } + }; + return SROverlay; +}()); +exports.SROverlay = SROverlay; +/** + * SRViewer class for managing screen reader simulation with UI controls + */ +var SRViewer = /** @class */ (function () { + /** + * Creates a new SRViewer + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRViewer(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + /** Flag to track if speech is active */ + this.isStreaming = false; + /** Flag to set if showing all */ + this.isShowingAll = false; + /** Flag to set if it should be speaking */ + this.speechEnabled = false; + this.viewerDoc = rootElement.ownerDocument; + // Create controller for the document body + this.controller = SRController_1.SRController.getController(this.viewerDoc); + // Create overlay UI + this.overlay = new SROverlay(this); + // Set up keyboard handlers + this.setupKeyboardHandlers(); + // Set up focus tracking + this.setupFocusTracking(); + // Set up mutation tracking + this.setupMutationTracking(); + } + SRViewer.prototype.showAll = function (bEnableAllMode) { + if (bEnableAllMode) { + this.isShowingAll = true; + } + var result = SRController_1.SRController.renderStructure(this.viewerDoc); + this.overlay.displayAll(result); + }; + SRViewer.prototype.toggleSpeech = function () { + this.speechEnabled = !this.speechEnabled; + }; + /** + * Navigate to the next element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigateNext = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpNext(mode); + this.overlay.displayResult(result, mode, 'next'); + this.speakResult(result); + }; + /** + * Navigate to the previous element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigatePrevious = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpPrevious(mode); + this.overlay.displayResult(result, mode, 'previous'); + this.speakResult(result); + }; + /** + * Set up keyboard event handlers for screen reader navigation + */ + SRViewer.prototype.setupKeyboardHandlers = function () { + var _this = this; + this.keyboardHandler = function (e) { + // Don't capture keyboard events when focus is in form controls + var target = e.target; + if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') { + return; + } + // Handle keyboard shortcuts + if (e.ctrlKey) { + // Ctrl key stops speech + _this.stopSpeech(); + return; + } + if (e.altKey || e.metaKey) + return; + // console.log(e.key); + switch (e.key) { + case 'ArrowUp': + e.preventDefault(); + _this.navigatePrevious('item'); + break; + case ' ': + _this.isStreaming = true; + case 'ArrowDown': + e.preventDefault(); + _this.navigateNext('item'); + break; + case 'Enter': + e.preventDefault(); + _this.activateCurrentElement(); + _this.controller.setPointOfRegard(_this.viewerDoc.activeElement); + break; + case 'H': + case 'h': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('heading'); + } + else { + e.preventDefault(); + _this.navigateNext('heading'); + } + break; + case 'R': + case 'r': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('region'); + } + else { + e.preventDefault(); + _this.navigateNext('region'); + } + break; + case 'Tab': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('tab_focus'); + } + else { + e.preventDefault(); + _this.navigateNext('tab_focus'); + } + break; + } + }; + // Add the event listener + this.viewerDoc.addEventListener('keydown', this.keyboardHandler); + }; + SRViewer.prototype.speakResult = function (result) { + var _this = this; + if (!this.speechEnabled) + return; + var utterance = new SpeechSynthesisUtterance(result.renderingResult.message); + utterance.rate = 1.5; + var myThis = this; + utterance.addEventListener("end", function (event) { + if (myThis.isStreaming) { + _this.navigateNext('item'); + } + }); + speechSynthesis.cancel(); + speechSynthesis.speak(utterance); + }; + /** + * Stop speech output + */ + SRViewer.prototype.stopSpeech = function () { + this.isStreaming = false; + // Cancel any active speech synthesis + speechSynthesis.cancel(); + }; + /** + * Set up mutation tracking + */ + SRViewer.prototype.setupMutationTracking = function () { + var _this = this; + var observer = new MutationObserver(function (mutations) { + // console.log(this.isShowingAll, mutations.length); + if (_this.isShowingAll) { + var outsideOverlay = mutations.filter(function (mutation) { return mutation.target.nodeType === 1 + && !mutation.target.closest(".ibma-sr-overlay"); }); + if (outsideOverlay.length > 0) { + // console.log("Mutations",outsideOverlay); + observer.disconnect(); + var myThis_1 = _this; + myThis_1.showAll(); + setTimeout(function () { + myThis_1.showAll(); + observer.observe(_this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }, 1000); + } + } + }); + observer.observe(this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }; + /** + * Set up focus tracking to update the point of regard when focus changes + */ + SRViewer.prototype.setupFocusTracking = function () { + var _this = this; + this.focusHandler = function (e) { + // Skip if the focus is on the overlay itself + if (e.target instanceof HTMLElement) { + var target = e.target; + if (_this.overlay && target.closest('.ibma-sr-overlay')) { + return; + } + console.group("focusHandler"); + // Update the point of regard to the newly focused element + var result = _this.controller.setPointOfRegard(target); + // Announce the focus change + if (result.success) { + _this.overlay.displayResult(result, 'focus', 'focus'); + _this.speakResult(result); + } + console.groupEnd(); + } + }; + // Add the focus event listener to the document + this.viewerDoc.addEventListener('focusin', this.focusHandler); + }; + /** + * Activate (click) the element at the current point of regard + */ + SRViewer.prototype.activateCurrentElement = function () { + var currentElement = this.controller.getPointOfRegard().getElement(); + if (currentElement) { + // Announce that we're activating the element + var result = { + success: true, + renderingResult: { + message: "Activating: ".concat(currentElement.textContent || currentElement.nodeName), + start: this.controller.getPointOfRegard(), + end: this.controller.getPointOfRegard() + } + }; + this.overlay.displayResult(result, 'focus', 'focus'); + this.speakResult(result); + // Focus the element first + if (currentElement.focus) { + currentElement.focus(); + } + // Simulate a click on the element + currentElement.click(); + } + }; + /** + * Get the controller instance + * @returns The SRController instance + */ + SRViewer.prototype.getController = function () { + return this.controller; + }; + /** + * Destroy the viewer and clean up resources + */ + SRViewer.prototype.destroy = function () { + // Remove event listeners + this.viewerDoc.removeEventListener('keydown', this.keyboardHandler); + this.viewerDoc.removeEventListener('focusin', this.focusHandler); + // Stop any active speech + this.stopSpeech(); + // Destroy overlay + this.overlay.destroy(); + }; + return SRViewer; +}()); +exports.SRViewer = SRViewer; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/common.ts" +/*!*************************************************!*\ + !*** ./src/v4/simulator/render_rules/common.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = exports.getLinkAnnouncement = exports.getRoleDescription = exports.quoteName = exports.quoteNamePadBefore = exports.quoteNamePadAfter = void 0; +var SRCursor_1 = __webpack_require__(/*! ../SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * Provide the name, surrounded by the quoteCharBefore and quoteCharAfter and followed by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add after, if the name exists + * @param quoteCharBefore The string to use as the leading quote, if the name exists + * @param quoteCharBefore The string to use as the trailing quote, if the name exists + * @returns + */ +function quoteNamePadAfter(cursor, padding, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteName(cursor)).concat(padding || ", ") + : ""; +} +exports.quoteNamePadAfter = quoteNamePadAfter; +/** + * Provide the name, surrounded by quotes and preceded by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add before, if the name exists (defaults to ", ") + * @returns The quoted name with leading padding, or empty string if no name exists + */ +function quoteNamePadBefore(cursor, padding) { + return cursor.getName() + ? "".concat(padding || ", ").concat(quoteName(cursor)) + : ""; +} +exports.quoteNamePadBefore = quoteNamePadBefore; +/** + * Provide the name surrounded by quote characters + * @param cursor The cursor for which to fetch the name + * @param quoteCharBefore The string to use as the leading quote (defaults to ") + * @param quoteCharAfter The string to use as the trailing quote (defaults to ") + * @returns The quoted name, or empty string if no name exists + */ +function quoteName(cursor, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteCharBefore || '"').concat(cursor.getName()).concat(quoteCharAfter || '"') + : ""; +} +exports.quoteName = quoteName; +/** + * Get the role description for an element, using aria-roledescription if present + * Falls back to the provided default role name if aria-roledescription is not specified or empty + * @param cursor The cursor positioned at the element + * @param defaultRole The default role name to use if aria-roledescription is not present + * @returns The role description (either custom or default) + */ +function getRoleDescription(cursor, defaultRole) { + var elem = cursor.getElement(); + if (!elem) + return defaultRole; + var roleDescription = elem.getAttribute("aria-roledescription"); + if (roleDescription && roleDescription.trim().length > 0) { + return roleDescription.trim(); + } + return defaultRole; +} +exports.getRoleDescription = getRoleDescription; +/** + * Generate the screen reader announcement for a link element + * Distinguishes between same-page links (anchors) and regular links + * @param cursor The cursor positioned at the link element + * @param mode The navigation mode (affects announcement order) + * @returns The formatted link announcement string + */ +function getLinkAnnouncement(cursor, mode) { + var href = (cursor.getNode().href) || ""; + var announceStr = ""; + if (href.startsWith(document.location.href) && href.charAt(document.location.href.length) === "#") { + announceStr = "same page link"; + } + else { + announceStr = "link"; + } + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + if (mode === "tab_focus") { + return "[".concat(quoteNamePadAfter(cursor)).concat(announceStr, "]"); + } + else { + return "[".concat(announceStr).concat(quoteNamePadBefore(cursor), "]"); + } + } + return "[".concat(announceStr, "]"); +} +exports.getLinkAnnouncement = getLinkAnnouncement; +/** + * Get the description text from aria-describedby references + * Resolves all IDs in aria-describedby and concatenates their text content + * @param elem The element with aria-describedby attribute + * @param mode The navigation mode (returns empty string in "item" mode) + * @returns The formatted description text with leading comma and quotes, or empty string + */ +function getDescribedByAnnouncements(elem, mode) { + var describedBy = elem.getAttribute("aria-describedby"); + if (!describedBy) + return ""; + var descriptionElems = describedBy + .split(/\s+/) + .map(function (id) { return document.getElementById(id); }) + .filter(function (descElem) { return !!descElem; }); + var descriptionText = descriptionElems + .map(function (descElem) { var _a; return (_a = descElem.textContent) === null || _a === void 0 ? void 0 : _a.trim(); }) + .filter(function (text) { return !!text; }) + .join(" "); + if (!descriptionText || descriptionText.length === 0) + return ""; + if (mode === "item") + return ", \u0001".concat(descriptionText, "\u0002"); + return ", \"".concat(descriptionText, "\""); +} +/** + * Get state announcements for disabled, readonly, required, and invalid attributes + * @param elem The element to check for state attributes + * @returns A string with state announcements (e.g., ", disabled", ", read only", ", required", ", invalid") + */ +function getStateAnnouncements(elem) { + var states = ""; + // Check for disabled state (both attribute and aria-disabled) + if (elem.hasAttribute("disabled") || elem.getAttribute("aria-disabled") === "true") { + states += ", disabled"; + } + // Check for readonly state (both attribute and aria-readonly) + if (elem.hasAttribute("readonly") || elem.getAttribute("aria-readonly") === "true") { + states += ", read only"; + } + // Check for required state (both attribute and aria-required) + if (elem.hasAttribute("required") || elem.getAttribute("aria-required") === "true") { + states += ", required"; + // A required <select> whose selected value is "" is implicitly invalid — + // JAWS and NVDA announce "invalid entry" in this case. + if (elem.nodeName.toUpperCase() === "SELECT" && elem.validity.valueMissing) { + states += ", invalid entry"; + } + } + // Check for invalid state (aria-invalid) + if (elem.getAttribute("aria-invalid") === "true") { + states += ", invalid"; + } + return states; +} +/** + * Check if a listitem contains interactive/widget elements + * Screen readers typically don't read the accessible name of a listitem when it contains interactive elements + * Uses DOMWalker to properly traverse shadow DOM and other complex structures + */ +function listitemContainsInteractiveElement(cursor) { + var elem = cursor.getElement(); + if (!elem) + return false; + // Use DOMWalker to traverse the entire subtree including shadow DOM + var walker = new DOMWalker_1.DOMWalker(elem, false, elem, false); + // Walk through all descendants + while (walker.nextNode()) { + // Only check element nodes at start tags + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(walker.node); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return true; + } + } + } + return false; +} +/** + * Check if an iframe's content can be accessed (not cross-origin) + * Attempts to access the iframe's document to determine if it's accessible + * @param iframe The iframe element to check + * @returns true if the iframe content is accessible, false if cross-origin or blocked + */ +function canAccessFrame(iframe) { + try { + // This throws a DOMException for cross-origin frames + var doc = iframe.contentDocument || iframe.contentWindow.document; + return doc !== null; + } + catch (e) { + return false; + // if (e instanceof DOMException && e.name === 'SecurityError') { + // return false; // Cross-origin, access blocked + // } + // throw e; // Re-throw unexpected errors + } +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Button role + new SRRendererRule_1.SRRendererRule({ + roles: ["button"], + elems: [], + modes: ["item", "button", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "true") { + return "[toggle ".concat(roleDesc, ", pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "false") { + return "[toggle ".concat(roleDesc, ", not pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (cursor.isEndTag()) + return undefined; + var expandStr = ""; + var elem = cursor.getElement(); + var roleDesc = getRoleDescription(cursor, "button"); + if (["menu", "true"].includes(elem.getAttribute("aria-haspopup"))) { + expandStr += ", menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + expandStr += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(expandStr).concat(getDescribedByAnnouncements(elem, mode), "]"); + }, + function (cursor) { if (cursor.isEndTag()) + return ""; } + ] + }), + // Checkbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["checkbox"], + elems: [], + modes: ["item", "checkbox", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "checkbox"); + var stateStr = ""; + if (elem.getAttribute("aria-checked") === "mixed") { + stateStr = "half checked"; + } + else { + var bChecked = false; + if (elem.hasAttribute("aria-checked")) { + bChecked = elem.getAttribute("aria-checked") === "true"; + } + else { + bChecked = elem.checked; + } + stateStr = bChecked ? "checked" : "not checked"; + } + stateStr += getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Cell, Columnheader, and Rowheader roles + new SRRendererRule_1.SRRendererRule({ + roles: ["cell", "columnheader", "rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var _a; + if (!cursor.isStartTag()) + return null; + // Get the cell element + var cellElem = cursor.getElement(); + if (!cellElem) + return null; + // Check if the cell has any visible content by checking: + // 1. Text content (trimmed) + // 2. Child elements with roles (buttons, links, etc.) + // 3. Images with alt text + var textContent = ((_a = cellElem.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || ""; + // Check for child elements with interactive roles or content + var walker = new DOMWalker_1.DOMWalker(cellElem, false, cellElem, false); + var hasContent = textContent.length > 0; + if (!hasContent) { + // Check for elements that would have content (buttons, links, images, etc.) + while (walker.nextNode()) { + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var elem = walker.node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // Check for interactive elements or elements with accessible names + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + hasContent = true; + break; + } + // Check for images with alt text + if (elem.nodeName.toUpperCase() === "IMG" && elem.hasAttribute("alt")) { + hasContent = true; + break; + } + } + } + } + // If the cell is empty, return "[blank]" + if (!hasContent) { + return "[blank]"; + } + // Otherwise, return null to let default rendering continue + return null; + } + ] + }), + // Combobox role + new SRRendererRule_1.SRRendererRule({ + roles: ["combobox"], + elems: [], + modes: ["item", "combo", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "combo box"); + var elem = cursor.getElement(); + var state = ""; + if (cursor.getNode().nodeName.toUpperCase() === "SELECT") { + state = ", collapsed"; + var selectElem = cursor.getElement(); + var valueElem = selectElem.selectedIndex >= 0 ? selectElem.options[selectElem.selectedIndex] : null; + var valueStr = ""; + if (valueElem) { + var temp = new SRCursor_1.SRCursor(valueElem, false); + valueStr = quoteNamePadBefore(temp, ", "); + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + else if (cursor.getNode().nodeName.toUpperCase() === "INPUT") { + if (elem.hasAttribute("aria-expanded")) { + state = ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state, ", has auto complete, editable, opens list]"); + } + else { + if (elem.hasAttribute("aria-expanded")) { + state = ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + if (elem.hasAttribute("aria-autocomplete")) { + state += ", has auto complete"; + } + } + state += getStateAnnouncements(elem); + // Determine the current value to announce: + // 1. If expanded and aria-controls points to a listbox, use the aria-selected option text + // 2. Otherwise use the combobox element's own text content + var valueStr = ""; + var controlsId = elem.getAttribute("aria-controls"); + var popup = controlsId ? document.getElementById(controlsId) : null; + if (popup) { + var selectedOption = popup.querySelector("[role='option'][aria-selected='true']"); + if (selectedOption) { + valueStr = ", \"".concat((selectedOption.textContent || "").trim(), "\""); + } + } + if (!valueStr) { + var textContent = (elem.textContent || "").trim(); + if (textContent) { + valueStr = ", \"".concat(textContent, "\""); + } + } + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + } + ] + }), + // Listbox role - covers <select size> / <select multiple> + new SRRendererRule_1.SRRendererRule({ + roles: ["listbox"], + elems: [], + modes: ["item", "combo", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "list box"); + var elem = cursor.getElement(); + var state = ""; + if (cursor.getNode().nodeName.toUpperCase() === "SELECT") { + var selectElem = cursor.getElement(); + var selectedOptions = Array.from(selectElem.options).filter(function (o) { return o.selected; }); + var valueStr_1 = selectedOptions + .map(function (o) { return quoteNamePadBefore(new SRCursor_1.SRCursor(o, false), ", "); }) + .join(""); + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr_1, "]"); + } + // ARIA listbox (non-select) + state += getStateAnnouncements(elem); + var textContent = (elem.textContent || "").trim(); + var valueStr = textContent ? ", \"".concat(textContent, "\"") : ""; + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + ] + }), + // Default role (fallback) + new SRRendererRule_1.SRRendererRule({ + roles: ["default"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + return cursor.isStartTag() ? + "!!<".concat(cursor.getRole(), ">").concat((((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) + ""), "!!") : + "!!</".concat(cursor.getRole(), ">!!"); + } + ] + }), + // Deletion role + new SRRendererRule_1.SRRendererRule({ + roles: ["deletion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[deleted]" || ""); } + ] + }), + // Dialog role + new SRRendererRule_1.SRRendererRule({ + roles: ["dialog"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + return cursor.isEndTag() ? "[End of dialog]" : "[Start of dialog".concat(quoteNamePadBefore(cursor)); + } + ] + }), + // Contenteditable (editable region) - elements with contenteditable="true" (or "") + // Must come before the generic/document rule so it takes precedence. + // Screen readers (JAWS/NVDA) announce these as an editable section when entering + // and "out of section" when leaving. + // We use a broad element list (covering the most common host elements) plus + // "generic" and "paragraph" roles so both bare <div> and labelled variants are caught. + // The test function always checks the attribute and bails out when: + // - the attribute is absent or "false" + // - an explicit ARIA role overrides the semantics (e.g. role="textbox") + new SRRendererRule_1.SRRendererRule({ + roles: ["generic", "paragraph"], + elems: ["DIV", "SPAN", "P", "SECTION", "ARTICLE", "HEADER", "FOOTER", "MAIN", "ASIDE", "NAV", "LI", "TD", "TH", "PRE", "BLOCKQUOTE", "FIGURE", "FIGCAPTION", "DETAILS", "SUMMARY"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + var elem = cursor.getElement(); + if (!elem) + return null; + var ce = elem.getAttribute("contenteditable"); + if (ce !== "true" && ce !== "") + return null; + // Defer to the explicit-role rule when an author provides a concrete ARIA role + // (e.g. role="textbox") — those roles carry richer semantics and their own rules. + if (elem.hasAttribute("role")) + return null; + // <p> retains its "paragraph" semantics even when editable. + var isParagraph = cursor.getRole() === "paragraph" || elem.nodeName.toUpperCase() === "P"; + if (cursor.isEndTag()) { + return mode === "item" ? (isParagraph ? "[out of paragraph]" : "[out of section]") : ""; + } + // aria-readonly is not a supported state on contenteditable elements — + // screen readers (JAWS/NVDA) ignore it entirely, so we exclude it here. + // Only disabled is meaningful (it overrides the editable semantics). + var stateAnnouncements = ""; + if (elem.hasAttribute("disabled") || elem.getAttribute("aria-disabled") === "true") { + stateAnnouncements = ", disabled"; + } + var containerWord = isParagraph ? "paragraph" : "section"; + // In tab_focus mode, only append textContent when the accessible name + // is extrinsic (aria-label / aria-labelledby, i.e. nameFrom ≠ "content"/"text"). + // When nameFrom IS "content", jumpCurrentEnd already walks children so + // appending again would duplicate the text. + var nameInfo = cursor.getNameInfo(); + var nameFromContent = !nameInfo || ["content", "text"].includes(nameInfo.nameFrom); + var textContent = (mode === "tab_focus" && !nameFromContent) ? (_a = elem.textContent) === null || _a === void 0 ? void 0 : _a.trim() : ""; + var contentSuffix = textContent ? " ".concat(textContent) : ""; + return "[".concat(quoteNamePadAfter(cursor)).concat(containerWord, ", editable").concat(stateAnnouncements, "]").concat(contentSuffix); + } + ] + }), + // Document role + new SRRendererRule_1.SRRendererRule({ + roles: ["document", "generic"], + elems: [], + modes: ["item"], + tests: [ + function () { return ""; } + ] + }), + // Graphics document role + new SRRendererRule_1.SRRendererRule({ + roles: ["graphics-document"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isStartTag() && !((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + return null; + }, + function (cursor) { var _a; return (cursor.isStartTag() && (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) === "")) ? "" : null; }, + function (cursor) { var _a; return (cursor.isStartTag() && ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && "[graphic".concat(quoteNamePadBefore(cursor), "]")) || null; }, + function (cursor) { return (cursor.isEndTag()) ? "" : null; } + ] + }), + // Heading role + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && cursor.isStartTag()) + return ""; + if (mode === "item" && cursor.isEndTag()) + return ""; + var level; + var node = cursor.getElement(); + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + return "[heading level ".concat(level).concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[heading level ".concat(level, "]"); + } + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["heading", "h1", "h2", "h3", "h4", "h5", "h6"], + tests: [ + function (cursor) { + if (cursor.isStartTag()) { + var node = cursor.getNode(); + var level = void 0; + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + return "[".concat(quoteNamePadAfter(cursor), "heading level ").concat(level, "]"); + } + return ""; + } + ] + }), + // Image role + new SRRendererRule_1.SRRendererRule({ + roles: ["img"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b, _c; + if (cursor.isEndTag()) { + return ""; + } + else { + if (!((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + // (these were only included because of the SKIP_ITEM_BEHAVIOR change) + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + else if (((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) === "") { + return ""; + } + else { + return "[graphic".concat(quoteNamePadBefore(cursor), "]"); + } + } + } + ] + }), + // Insertion role + new SRRendererRule_1.SRRendererRule({ + roles: ["insertion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[inserted]" || ""); } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["link"], + elems: [], + modes: ["item", "region", "link", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && !["content", "text"].includes((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + return getLinkAnnouncement(cursor, mode); + } + return null; + } + ] + }), + // Listitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["listitem"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + var isOrdered; + var parentListElem; + var walkParents = DOMWalker_1.DOMWalker.parentNode(cursor.getNode()); + while (typeof isOrdered === "undefined" && walkParents) { + if (walkParents.nodeType === 1) { + var elem = walkParents; + if (elem.hasAttribute("role")) { + if (elem.getAttribute("role") === "list") { + isOrdered = false; + parentListElem = elem; + } + } + else if (elem.nodeName.toUpperCase() === "UL") { + isOrdered = false; + parentListElem = elem; + } + else if (elem.nodeName.toUpperCase() === "OL") { + isOrdered = true; + parentListElem = elem; + } + } + walkParents = DOMWalker_1.DOMWalker.parentNode(walkParents); + } + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var retStr = ""; + if (!isOrdered) { + var elem = cursor.getElement(); + if ((elem.nodeName.toUpperCase() === "LI" && window.getComputedStyle(elem).listStyleType === "none") + || elem.nodeName.toUpperCase() !== "LI") { + retStr = cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + retStr = cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + else { + // For ordered lists, count sibling listitems and account for start attribute + var count = 1; // Start at 1 by default + // Get the start attribute if it exists on the <ol> element + if (parentListElem && parentListElem.nodeName.toUpperCase() === 'OL' && + parentListElem.hasAttribute('start')) { + var startValue = parseInt(parentListElem.getAttribute('start') || '1', 10); + count = isNaN(startValue) ? 1 : startValue; + } + // Count previous sibling listitems at the same level using DOMWalker + var currentElem = cursor.getElement(); + var sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(currentElem); + while (sibling) { + // Only count direct siblings that are listitems (element nodes only) + if (sibling.nodeType === 1) { + var siblingElem = sibling; + if (siblingElem.getAttribute('role') === 'listitem' || + siblingElem.nodeName.toUpperCase() === 'LI') { + count++; + } + } + sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(sibling); + } + retStr = cursor.isStartTag() ? "".concat(count, ". ").concat(nameToUse) : ""; + } + return retStr; + } + ] + }), + // Math role + new SRRendererRule_1.SRRendererRule({ + roles: ["math"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isEndTag() ? "[math content]" : ""; } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["menuitem"], + elems: [], + modes: ["item", "tab_focus", "region"], + tests: [ + function (cursor) { + var retVal = ""; + if (cursor.isStartTag()) { + // let isSubMenuContainer = false; + // for (let checkChildren=cursor.getNode().firstChild; !isSubMenuContainer && checkChildren !== null; checkChildren = checkChildren.nextSibling) { + // isSubMenuContainer = checkChildren.nodeName.toUpperCase() === "UL"; + // } + // if (isSubMenuContainer) return "[????menu]"; + var expandStr = ""; + var elem = cursor.getElement(); + if (elem.getAttribute("aria-haspopup") === "true") { + expandStr += ", sub-menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + retVal = "[menu".concat(expandStr); + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + retVal += quoteNamePadBefore(cursor); + } + retVal += "]"; + } + return retVal; + } + ] + }), + // Meter role + new SRRendererRule_1.SRRendererRule({ + roles: ["meter"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Progressbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["progressbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Radio role + new SRRendererRule_1.SRRendererRule({ + roles: ["radio"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var roleDesc = getRoleDescription(cursor, "radio button"); + var bChecked = false; + if (cursor.getElement().hasAttribute("aria-checked")) { + bChecked = cursor.getElement().getAttribute("aria-checked") === "true"; + } + else { + bChecked = cursor.getNode().checked; + } + var stateStr = getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(bChecked ? "checked" : "not checked").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Searchbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["searchbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[".concat(quoteNamePadAfter(cursor), "edit]") : ""; } + ] + }), + // Separator role + new SRRendererRule_1.SRRendererRule({ + roles: ["separator"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[separator]" || ""); } + ] + }), + // Slider role + new SRRendererRule_1.SRRendererRule({ + roles: ["slider"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "slider"); + var elem = cursor.getElement(); + // Check for aria-valuenow first, then fall back to native value property + var value = elem.hasAttribute("aria-valuenow") + ? elem.getAttribute("aria-valuenow") + : cursor.getNode().value; + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", ").concat(value).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Spinbutton role + new SRRendererRule_1.SRRendererRule({ + roles: ["spinbutton"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "spinbutton"); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", editable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Tab role + new SRRendererRule_1.SRRendererRule({ + roles: ["tab"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "tab"); + return "[".concat(roleDesc).concat(cursor.getNode().getAttribute("aria-selected") === "true" ? ", selected" : "").concat(quoteNamePadBefore(cursor), "]"); + } + ] + }), + // Tablist role + new SRRendererRule_1.SRRendererRule({ + roles: ["tablist"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[group start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[group end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Tabpanel role + new SRRendererRule_1.SRRendererRule({ + roles: ["tabpanel"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[Tab panel start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[Tab panel end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Text role + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["item", "link", "tab_focus", "region"], + tests: [ + function (cursor) { + var _a, _b, _c, _d; + if (cursor.isEndTag() || !((_a = cursor.getParentElement()) === null || _a === void 0 ? void 0 : _a.getElement())) + return null; + var elem = (_b = cursor.getParentElement()) === null || _b === void 0 ? void 0 : _b.getElement(); + if (elem.ownerDocument.defaultView.getComputedStyle(elem).textDecorationLine === "line-through") { + return "[strikethrough] ".concat((((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) + ""), " [end strikethrough]"); + } + return "".concat((((_d = cursor.getNameInfo()) === null || _d === void 0 ? void 0 : _d.name) + "")); + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["heading"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Textbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["textbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + var elem = cursor.getElement(); + if (cursor.isEndTag()) { + return mode === "item" && elem.nodeName.toUpperCase() === "TEXTAREA" ? "[out of edit]" : ""; + } + if (!cursor.isStartTag()) { + return ""; + } + var attributes = ""; + if (elem.hasAttribute("placeholder") && elem.getAttribute("placeholder").trim().length > 0) { + attributes += ", placeholder: ".concat(elem.getAttribute("placeholder")); + } + attributes += getStateAnnouncements(elem); + var isMultiline = elem.nodeName.toUpperCase() === "TEXTAREA" || elem.getAttribute("aria-multiline") === "true"; + var describedBy = getDescribedByAnnouncements(elem, mode); + if (isMultiline) { + var textContent = mode === "tab_focus" ? (_a = elem.textContent) === null || _a === void 0 ? void 0 : _a.trim() : ""; + var contentSuffix = textContent ? " ".concat(textContent) : ""; + return "[".concat(quoteNamePadAfter(cursor), "edit, multiline").concat(attributes).concat(describedBy, "]").concat(contentSuffix); + } + return "[".concat(quoteNamePadAfter(cursor), "edit").concat(attributes).concat(describedBy, "]"); + } + ] + }), + // Treeitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["treeitem"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var elem = cursor.getElement(); + // Build the announcement string without the name (let content render separately) + var announcement = "[treeview item"; + // Add selected state if present + if (elem.getAttribute("aria-selected") === "true") { + announcement += ", selected"; + } + // Add expanded/collapsed state if present + if (elem.hasAttribute("aria-expanded")) { + announcement += elem.getAttribute("aria-expanded") === "true" ? ", expanded" : ", collapsed"; + } + // Add level if explicitly set or calculate from nesting + var level = elem.getAttribute("aria-level"); + if (level) { + announcement += ", level ".concat(level); + } + else { + // Calculate level by counting parent treeitems or groups using DOMWalker for shadow DOM support + var calculatedLevel = 1; + var parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + while (parent_1) { + var parentRole = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + if (parentRole === "group" || parentRole === "tree") { + // Check if this group is inside a treeitem + var groupParent = DOMWalker_1.DOMWalker.parentElement(parent_1); + while (groupParent) { + var groupParentRole = AriaUtil_1.AriaUtil.getResolvedRole(groupParent); + if (groupParentRole === "treeitem") { + calculatedLevel++; + break; + } + else if (groupParentRole === "tree") { + break; + } + groupParent = DOMWalker_1.DOMWalker.parentElement(groupParent); + } + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + if (calculatedLevel > 1) { + announcement += ", level ".concat(calculatedLevel); + } + } + // Add position information (aria-posinset/aria-setsize or calculate) + var position = elem.getAttribute("aria-posinset"); + var setSize = elem.getAttribute("aria-setsize"); + if (!position || !setSize) { + // Calculate position by counting siblings with same role using DOMWalker for shadow DOM support + var pos = 0; + var total = 0; + var parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + if (parent_2) { + // Iterate through children to count treeitems + var child = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(parent_2); + while (child) { + if (child.nodeType === 1) { // Element node + var childElem = child; + if (AriaUtil_1.AriaUtil.getResolvedRole(childElem) === "treeitem") { + total++; + if (childElem === elem) { + pos = total; + } + } + } + child = child.nextSibling; + } + } + position = pos.toString(); + setSize = total.toString(); + } + announcement += ", ".concat(position, " of ").concat(setSize, "] "); + return announcement; + } + ] + }), + // HTML Element rules + // Preformatted text line rendering: when cursor is at a <pre> element with + // preLineIndex set, render only that line of the pre's text content. + // This rule fires inside renderRange for per-line item stops. + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["PRE"], + modes: ["item"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isEndTag()) + return ""; + if (cursor.preLineIndex === undefined) + return null; // let container_enter handle it + var fullText = (_a = cursor.getNode().textContent) !== null && _a !== void 0 ? _a : ""; + var rawLines = fullText.split("\n"); + var start = 0; + while (start < rawLines.length && rawLines[start].trim() === "") + start++; + var end = rawLines.length - 1; + while (end >= start && rawLines[end].trim() === "") + end--; + var lines = rawLines.slice(start, end + 1); + return (_b = lines[cursor.preLineIndex]) !== null && _b !== void 0 ? _b : ""; + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BODY"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + // Suppress [Start/End of document] for iframe subdocument bodies. + // When the inner body is entered from an <iframe>, diffContainers emits + // the ["name", frame] container-enter announcement instead. Suppressing + // the document title announcements here avoids double-announcements. + var body = cursor.getNode(); + if (body.ownerDocument !== document) + return ""; + var titleStr = cursor.getNode().ownerDocument.title; + return cursor.isEndTag() ? "[End of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]") : "[Start of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]"); + } + ] + }), + // Inline frame (<iframe>) — tab_focus mode: announces the frame as a tab stop. + // A titled iframe announces its accessible name; an untitled one announces just "frame". + // (The item-mode announcement is handled by diffContainers emitting the container_enter + // IFRAME rule when crossing into the subdocument — no separate SR_RULE needed for item mode.) + // When role="none" or role="presentation" is set, screen readers treat the frame as a + // generic grouping — announce "grouping" instead of "frame". + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return null; + var role = cursor.getElement().getAttribute("role"); + var isPresentation = role === "none" || role === "presentation"; + // An untitled presentational iframe produces no meaningful tab stop label — + // suppress it entirely so it does not appear in the tab_focus column. + if (isPresentation && !cursor.getName()) + return null; + var label = isPresentation ? "grouping" : "frame"; + return "[".concat(quoteNamePadAfter(cursor)).concat(label, "]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BR"], + modes: ["item"], + tests: [ + function (cursor) { + try { + var walk = cursor.clone(); + // Walk until we hit the beginning of the page, find another BR, or find something with a name + while (walk.previous(function () { return true; }) && walk.getNode().nodeName.toUpperCase() !== "BR" && walk.getNameInfo() && walk.getNameInfo().name.trim().length === 0) + ; + return walk.getNode().nodeName.toUpperCase() === "BR" ? "[blank]" : null; + } + catch (err) { + console.error(err); + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["INPUT"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { var _a; return (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "password" && "[".concat(quoteNamePadAfter(cursor), "edit, protected").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]")) || null; }, + function (cursor, _oldCursor, mode) { + var _a, _b; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "file") { + var value = ((_b = cursor.getElement()) === null || _b === void 0 ? void 0 : _b.value) || ""; + value = value === "" ? "No file chosen" : value.substring("C:\\fakepath\\".length); + return "[".concat(quoteNamePadAfter(cursor), "button").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(quoteNamePadAfter(cursor)).concat(value, "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "color") { + var val = cursor.getElement().value; + var r = (Number("0x".concat(val.substring(1, 3))) * 100.0 / Number("0xff")).toFixed(0); + var g = (Number("0x".concat(val.substring(3, 5))) * 100.0 / Number("0xff")).toFixed(0); + var b = (Number("0x".concat(val.substring(5))) * 100.0 / Number("0xff")).toFixed(0); + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(r, "% red ").concat(g, "% green ").concat(b, "% blue]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "month") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] [spin button, ").concat(y, "] [menu button] [subMenu] Show month picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "date") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + var day = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [menu button] [subMenu] Show date picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "datetime-local") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var y = "0"; + var m = "0"; + var day = "0"; + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + if (date.getHours() === 0 || date.getHours() === 12) { + hour = "12"; + } + else if (date.getHours() < 12) { + hour = "" + date.getHours(); + } + else { + hour = "" + (date.getHours() - 12); + } + min = "" + date.getMinutes(); + ampm = date.getHours() >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show local date and time picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "time") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = val.split(":"); + var hours = parseInt(date[0]); + if (hours === 0 || hours === 12) { + hour = "12"; + } + else if (hours < 12) { + hour = "" + hours; + } + else { + hour = "" + (hours - 12); + } + min = date[1]; + ampm = hours >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "grouping clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), " [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show time picker [out of grouping]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "week") { + var val = cursor.getElement().value; // 2025-W38 + var year = "0"; + var week = "0"; + if (val.trim().length > 0) { + var date = val.split(/-W/); + year = date[0]; + week = date[1]; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(week, "], [spin button, ").concat(year, "] [menu button] [subMenu] Show week picker"); + } + return null; + }, + function (cursor) { var _a; return ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "hidden" ? "" : null; }, + function (cursor) { return (cursor.isStartTag() && "!![".concat(quoteNamePadAfter(cursor), "input!!]").concat(cursor.getElement().outerHTML)) || null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["LI"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var elem = cursor.getElement(); + if (window.getComputedStyle(elem).listStyleType === "none") { + return cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + return cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + ] + }), + // MathML elements + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MFRAC"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[fraction]" : "[end fraction]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MROW"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Only announce over on the end tag + if (cursor.isStartTag()) + return undefined; + var fraction = cursor.getCurrentOrParentByRoleClone([], ["mfrac"]); + if (fraction && ((_a = fraction.getElement().querySelectorAll("mrow")[0]) === null || _a === void 0 ? void 0 : _a.isSameNode(cursor.getNode()))) { + return "[over]"; + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSQRT"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[square root]" : "[end root]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSUP"], + modes: ["item"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isEndTag()) + return undefined; + var mi = ((_a = cursor.getElement().querySelector("mi")) === null || _a === void 0 ? void 0 : _a.innerHTML) || ""; + var mn = ((_b = cursor.getElement().querySelector("mn")) === null || _b === void 0 ? void 0 : _b.innerHTML) || ""; + if (mn === "2") + return "".concat(mi, " [squared]"); + if (mn === "3") + return "".concat(mi, " [cubed]"); + return "".concat(mi, " [to the ").concat(mn, "]"); + } + ] + }), + // Summary element — the disclosure button for a <details> widget. + // <summary> has implicitRole: null in ARIADefinitions so no role-based + // button rule fires. We add an explicit element rule that announces it as + // a button with the collapsed / expanded state from the parent <details>. + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["SUMMARY"], + modes: ["item", "button", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a, _b; + if (cursor.isEndTag()) + return ""; + var summaryElem = cursor.getElement(); + if (!summaryElem) + return null; + // Only the first <summary> that is a direct child of <details> + // acts as the disclosure button. + var detailsParent = summaryElem.parentElement; + if (!detailsParent || detailsParent.nodeName.toUpperCase() !== "DETAILS") + return null; + var firstSummary = Array.from(detailsParent.children).find(function (c) { return c.nodeName.toUpperCase() === "SUMMARY"; }); + if (!firstSummary || !firstSummary.isSameNode(summaryElem)) + return null; + var stateStr = detailsParent.hasAttribute("open") ? "expanded" : "collapsed"; + // <summary> has implicitRole: null so AccNameUtil may not compute a name; + // read aria-label first, then fall back to visible text content. + var ariaLabel = (_a = summaryElem.getAttribute("aria-label")) === null || _a === void 0 ? void 0 : _a.trim(); + var textContent = ((_b = summaryElem.textContent) === null || _b === void 0 ? void 0 : _b.trim()) || ""; + var label = ariaLabel || textContent; + var labelStr = label ? "\"".concat(label, "\", ") : ""; + // Description: prefer explicit aria-describedby; when aria-label is the + // name source, the subtree text becomes the description (accname-1.2 §4.3). + var descStr = getDescribedByAnnouncements(summaryElem, mode); + if (!descStr && ariaLabel && textContent) { + descStr = mode === "item" ? ", \u0001".concat(textContent, "\u0002") : ", \"".concat(textContent, "\""); + } + return "[".concat(labelStr, "button, ").concat(stateStr).concat(descStr, "]"); + } + ] + }), + // Multiple roles rules - placed at the bottom + // Default mode rules - Container elements (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "code", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "list", "main", + "mark", "navigation", "region", "row", "rowheader", "search", "table", "toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Default mode rules - Elements that screen readers typically ignore (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["paragraph", "rowgroup", "status", "strong", "subscript", "superscript", + "term", "time", "none", "presentation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/container_enter.ts" +/*!**********************************************************!*\ + !*** ./src/v4/simulator/render_rules/container_enter.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var SRTableUtil_1 = __webpack_require__(/*! ../SRTableUtil */ "./src/v4/simulator/SRTableUtil.ts"); +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +/** + * Generates the announcement text when entering a table cell + */ +function renderEnterTableCell(newCursor, oldCursor) { + var _a; + // We seem to be at the newline text node after the cell + if (oldCursor && ((_a = oldCursor.getNode()) === null || _a === void 0 ? void 0 : _a.nodeName) === "#text") { + oldCursor = oldCursor.clone(); + oldCursor.previous(function () { return true; }); + } + var newTableModel = SRTableUtil_1.SRTableUtil.getTableModel(newCursor); + var oldCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(oldCursor, newTableModel); + var newCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(newCursor, newTableModel); + if (!newCellInfo) + return ""; + var retVal = []; + // Announce row information if we've moved to a different row or the rowspan has changed + if (!oldCellInfo || oldCellInfo.rowIndexStart !== newCellInfo.rowIndexStart || oldCellInfo.rowspan !== newCellInfo.rowspan) { + // If a change in row or a change in rowSpan + var rowHeaders = SRTableUtil_1.SRTableUtil.getRowHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = rowHeaders && rowHeaders.trim().length > 0 ? "\"".concat(rowHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "row ").concat((newCellInfo.rowIndexStart + 1)).concat(newCellInfo.rowspan > 1 ? " through " + (newCellInfo.rowIndexStart + newCellInfo.rowspan) : "", "]")); + } + // Announce column information if we've moved to a different column or the colspan has changed + if (!oldCellInfo || oldCellInfo.colIndexStart !== newCellInfo.colIndexStart || oldCellInfo.colspan !== newCellInfo.colspan) { + // If a change in column or a change in colspan + var columnHeaders = SRTableUtil_1.SRTableUtil.getColumnHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = columnHeaders && columnHeaders.trim().length > 0 ? "\"".concat(columnHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "column ").concat((newCellInfo.colIndexStart + 1)).concat(newCellInfo.colspan > 1 ? " through " + (newCellInfo.colIndexStart + newCellInfo.colspan) : "", "]")); + } + return retVal.join(" "); +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item", "article", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + // Cell role + new SRRendererRule_1.SRRendererRule({ + roles: ["cell"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Columnheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["columnheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "complementary region]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "content info region]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[section]"; + } + else { + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "form region]"); + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item", "region"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + var elem = cursor.getElement(); + var hasSummary = Array.from(elem.children).some(function (c) { return c.nodeName.toUpperCase() === "SUMMARY"; }); + if (hasSummary) { + // The <summary> child speaks as the disclosure button; suppress + // the container-enter announcement entirely. + return ""; + } + // No explicit <summary>: in a real browser the UA injects a default + // "Details" summary. jsdom does not, so we announce the widget here + // as a fallback using the same default label a real browser would use. + return "[\"Details\", button, ".concat(elem.hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // -- tab_focus + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["tab_focus"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + var elem = cursor.getElement(); + var hasSummary = Array.from(elem.children).some(function (c) { return c.nodeName.toUpperCase() === "SUMMARY"; }); + if (hasSummary) { + // <summary> is the tab stop, not <details> itself. + return null; + } + // No <summary>: <details> itself is focusable (UA default behaviour). + return "[\"Details\", button, ".concat(elem.hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + return ""; + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var _a; + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // Count items, excluding those in other lists or within presentational containers + var numItems = 0; + for (var i = 0; i < descendantListItems.snapshotLength; i++) { + var item = descendantListItems.snapshotItem(i); + // Walk up ancestors to check for both nested lists and presentational containers + var isInOtherList = false; + var hasPresentationalAncestor = false; + var ancestor = item.parentElement; + while (ancestor && ancestor !== node) { + // Check if ancestor is another list + var ancestorRole = AriaUtil_1.AriaUtil.getResolvedRole(ancestor); + if (ancestorRole === "list" || + ancestor.nodeName.toUpperCase() === "UL" || + ancestor.nodeName.toUpperCase() === "OL") { + isInOtherList = true; + break; + } + // Check if ancestor has presentational children + if (ancestorRole && ((_a = ARIADefinitions_1.ARIADefinitions.designPatterns[ancestorRole]) === null || _a === void 0 ? void 0 : _a.presentationalChildren)) { + hasPresentationalAncestor = true; + break; + } + ancestor = ancestor.parentElement; + } + if (!isInOtherList && !hasPresentationalAncestor) { + numItems++; + } + } + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "list of ").concat(numItems, " items]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "main region]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers = document.evaluate(".//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers2 = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']/*[@role='menu']|.//*[@role='menu']//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + console.log("MENUBAR", cursor.isEndTag() ? "/" : "", cursor.getNode()); + console.log(descendantListItems, descendantListItemsInOtherLists); //, descendantContainers, descendantContainers2) + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; //-descendantContainers.snapshotLength+descendantContainers2.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "menubar with ").concat(numItems, " items]"); + } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Radio group role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.getNameInfo() === null) + return null; + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Row role + new SRRendererRule_1.SRRendererRule({ + roles: ["row"], + elems: [], + modes: ["item", "table"], + tests: [ + function () { return ""; } + ] + }), + // Rowheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var tableWalker = cursor.clone(); + // Get to the start of the table + while (tableWalker.getRole() !== "table" && tableWalker.previous(function () { return true; })) + ; + // Set an end to the table + var tableNode = tableWalker.getNode(); + var rows = 0; + var cols = 0; + // Sanity check that the table has content + if (tableWalker.getNode().firstChild) { + var firstRowComplete = false; + while (tableWalker.next(function () { return true; }) && !tableWalker.getNode().isSameNode(tableNode)) { + var role = tableWalker.getRole(); + if (tableWalker.isStartTag()) { + if (role === "row") { + ++rows; + } + else { + if (!firstRowComplete && ["cell", "rowheader", "columnheader"].includes(role)) { + var elem = tableWalker.getNode(); + cols += parseInt(elem.getAttribute("colspan") || "1"); + } + } + } + else if (role === "row") { + firstRowComplete = true; + } + } + } + return "[table with ".concat(rows, " ").concat(rows === 1 ? "row" : "rows", " and ").concat(cols, " ").concat(cols === 1 ? "column" : "columns").concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "toolbar]"); + } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//dt", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "definition list of ").concat(numItems, " terms]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[highlighted]"; } + ] + }), + // Inline frame (<iframe>) + // Only fires in item mode (where it produces the container-enter label on the parent + // block stop). In tab_focus mode the iframe element itself is the stop and the + // IFRAME SR_RULE in common.ts supplies the label directly — no container-enter needed. + // When role="none" or role="presentation" is set, screen readers treat the frame + // as a generic grouping — announce "grouping" instead of "frame". + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["item"], + tests: [ + function (cursor) { + var role = cursor.getElement().getAttribute("role"); + var isPresentation = role === "none" || role === "presentation"; + // An untitled presentational iframe has no meaningful grouping label to + // announce — suppress the container-enter entirely. + if (isPresentation && !cursor.getName()) + return null; + var label = isPresentation ? "grouping" : "frame"; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(label, "]"); + } + ] + }), + // Preformatted text (<pre>) + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["PRE"], + modes: ["item"], + tests: [ + function (cursor) { return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "preformatted text]"); } + ] + }), + // Multiple roles rules - placed at the bottom + // Heading mode rules - ignore container elements in heading mode (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "region", + "row", "rowheader", "search", "toolbar", "list", "main", "navigation", "table"], + elems: [], + modes: ["heading"], + tests: [ + function () { return ""; } + ] + }) +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/containter_exit.ts" +/*!**********************************************************!*\ + !*** ./src/v4/simulator/render_rules/containter_exit.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "complementary region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "content info region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[out of figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[out of section]"; + } + else { + return "[out of form]"; + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // <details> uses the group role but has its own disclosure widget semantics; + // SRs do not announce "out of grouping" when leaving a details element. + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + return ""; + } + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + return "[out of grouping]"; + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "out of list]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "main region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (_cursor) { return "[out of menubar]"; } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // radiogroup role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (_cursor) { return "[out of grouping]"; } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of table]"; } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of toolbar]"; } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["ABBR"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.getElement().hasAttribute("title") ? + "[".concat(cursor.getElement().getAttribute("title"), "]") : null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of definition list]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of highlighted]"; } + ] + }), + // Inline frame (<iframe>) + // When role="none" or role="presentation" is set, screen readers treat the frame + // as a generic grouping — announce "out of grouping" instead of "out of frame". + // Exception: an untitled presentational iframe produces no container-enter label, so + // the matching container-exit must also be suppressed to avoid a stray "[out of grouping]". + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["item"], + tests: [ + function (cursor) { + var role = cursor.getElement().getAttribute("role"); + var isPresentation = role === "none" || role === "presentation"; + if (isPresentation && !cursor.getName()) + return null; + return isPresentation ? "[out of grouping]" : "[out of frame]"; + } + ] + }), + // Preformatted text (<pre>) + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["PRE"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of preformatted text]"; } + ] + }), + // Multiple roles rules - placed at the bottom + // Region mode rules - ignore container elements in region and heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["group", "article", "banner", "blockquote", "caption", "complementary", + "contentinfo", "figure", "form", "list", "region", "main", "navigation", + "search", "table", "toolbar"], + elems: [], + modes: ["region", "heading"], + tests: [ + function () { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/index.ts" +/*!************************************************!*\ + !*** ./src/v4/simulator/render_rules/index.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CONTAINER_EXIT_RULES = exports.CONTAINER_ENTER_RULES = exports.SR_RULES = void 0; +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +var container_enter_1 = __webpack_require__(/*! ./container_enter */ "./src/v4/simulator/render_rules/container_enter.ts"); +var containter_exit_1 = __webpack_require__(/*! ./containter_exit */ "./src/v4/simulator/render_rules/containter_exit.ts"); +exports.SR_RULES = common_1.RULES; +exports.CONTAINER_ENTER_RULES = container_enter_1.RULES; +exports.CONTAINER_EXIT_RULES = containter_exit_1.RULES; + + +/***/ }, + +/***/ "./src/v4/util/AccNameUtil.ts" +/*!************************************!*\ + !*** ./src/v4/util/AccNameUtil.ts ***! + \************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AccNameUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil = /** @class */ (function () { + function AccNameUtil() { + } + /** + * Computes the accessible name for an SVG element according to W3C specification + * Following the Accessible Name and Description Computation 1.1 algorithm + * https://www.w3.org/TR/accname-1.1/ + * + * @param elem The SVG element + * @returns The accessible name result or null if no accessible name is found + */ + AccNameUtil.computeAccessibleNameForSVGElementW3C = function (elem) { + if (!elem || elem.nodeName.toLowerCase() !== 'svg') + return null; + // Step 1: Check for aria-labelledby (already handled by main computeAccessibleName function) + // Step 2: Check for aria-label (already handled by main computeAccessibleName function) + // Step 3: Check for title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_1 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_1 += title.trim(); + } + }); + if (text_1 && text_1.trim() !== '') + return { "name": text_1.trim(), "nameFrom": "svgTitle" }; + } + // Step 4: Check for text content in SVG text elements + var textContent = ""; + var textElements = elem.querySelectorAll("text, textPath, tspan"); + if (textElements && textElements.length > 0) { + textElements.forEach(function (textElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(textElement) && !VisUtil_1.VisUtil.isNodePresentational(textElement)) { + var content = textElement.textContent; + if (content && content.trim() !== '') + textContent += " " + content.trim(); + } + }); + if (textContent.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(textContent.trim()), "nameFrom": "svgText" }; + } + // Step 5: Check for xlink:title attribute on links within SVG + var links = elem.querySelectorAll("a"); + for (var i = 0; i < links.length; i++) { + var link = links[i]; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(link) && !VisUtil_1.VisUtil.isNodePresentational(link)) { + var xlinkTitle = link.getAttribute("xlink:title"); + if (xlinkTitle && xlinkTitle.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(xlinkTitle), "nameFrom": "svglinkTitle" }; + } + } + // Step 6: Check for aria-describedby or aria-description + var description = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (description && description.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(description), "nameFrom": "aria-description" }; + // Step 7: Check for desc element + var descElements = elem.querySelectorAll(":scope > desc"); + if (descElements && descElements.length > 0) { + var descText_1 = ""; + descElements.forEach(function (descElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(descElement) && !VisUtil_1.VisUtil.isNodePresentational(descElement)) { + var desc = descElement.textContent; + if (desc && desc.trim() !== '') + descText_1 += " " + desc.trim(); + } + }); + if (descText_1.trim() !== '') + return { "name": descText_1.trim(), "nameFrom": "svgDesc" }; + } + // Step 8: Check for title attribute + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title"); + if (title && title.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(title), "nameFrom": "title" }; + } + // No accessible name found + return null; + }; + // calculate accessible name for a given node + AccNameUtil.computeAccessibleName = function (elem) { + if (!elem) + return null; + var nodeName = elem.nodeName.toLowerCase(); + var name_pair = CacheUtil_1.CacheUtil.getCache(elem, "ELEMENT_ACCESSBLE_NAME", undefined); + if (name_pair !== undefined) + return name_pair; + // 1. name from author, or elements without a role but with aria-labelledby or aria-label + // get aria label even for the role where the name is prohibited or is 'presentation' or 'none' + var accName = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (accName && accName.trim() !== "") { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }); + return { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }; + } + // 2. accessible name mapping for native html elements + name_pair = AccNameUtil.computeAccessibleNameForNativeElement(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + // 3. name from native or aria attribute + /**name_pair = AccNameUtil.computeAccessibleNameFromAttribute(elem); + if (name_pair) { + CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + }*/ + // 4. name from content for custom elements with a role + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) { + name_pair = AccNameUtil.computeAccessibleNameFromContent(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + } + // 5. name from the global attribute "title" + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title").trim(); + if (title && title.trim().length > 0) { + title = CommonUtil_1.CommonUtil.truncateText(title); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": title, "nameFrom": "title" }); + return { "name": title, "nameFrom": "title" }; + } + } + // 6. name from the attribute "placeholder" + if (nodeName === 'textarea' || (nodeName === 'input' && (!elem.hasAttribute("type") || CommonUtil_1.CommonUtil.input_type_with_placeholder.includes(elem.getAttribute("type"))))) { + var placeholder = elem.getAttribute("placeholder"); + if (placeholder && placeholder.trim().length > 0) { + placeholder = CommonUtil_1.CommonUtil.truncateText(placeholder); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": placeholder, "nameFrom": "placeholder" }); + return { "name": placeholder, "nameFrom": "placeholder" }; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", null); + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForNativeElement = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + // labellable fields + if (CommonUtil_1.CommonUtil.form_labelable_elements.includes(nodeName)) { + // Get only the non-hidden labels for element + var label = CommonUtil_1.CommonUtil.getFormFieldLabel(elem); + if (label && label.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // input types: button, reset, submit, image + if (nodeName === "input" && elem.hasAttribute("type")) { + if (CommonUtil_1.CommonUtil.form_button_types.includes(elem.getAttribute("type"))) { + // input types: button, reset, submit + // Get the "value" attribute for the element + var value = CommonUtil_1.CommonUtil.getElementAttribute(elem, "value"); + if (value && value.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(value), "nameFrom": "value" }; + // input 'submit' and 'reset' have visible defaults so pass if there is no explicit 'value' attribute + var type = elem.getAttribute("type"); + if (type === 'submit' || type === 'reset') + return { "name": type, "nameFrom": "internal" }; + } + else if (elem.getAttribute("type") === 'image') { + // input type = 'image' + // note that though HTML 5 spec indicates "The element's [value] attribute must be omitted", Chrome uses the value. + // Get the accessible name for the alt attribute + var alt = CommonUtil_1.CommonUtil.getElementAttribute(elem, "alt"); + if (alt && alt.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + ; + // the visible default text for type "image" is "Submit" same with the type "submit" + //return {"name":elem.getAttribute("type"), "nameFrom": "internal"}; + } + } + // button + // note button may have a value attribute, but it's not a visible text + if (nodeName === "button") { + // first use the button text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + // for image button: get the first image if exists + var image = elem.querySelector('img'); + if (image && !VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + // for a button with a svg image + var svg = elem.querySelector('svg'); + if (svg && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svg) && !VisUtil_1.VisUtil.isNodePresentational(svg)) { + var pair = AccNameUtil.computeAccessibleName(svg); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + } + // fieldset + if (nodeName === "fieldset") { + // if the fieldset element's first child is a legend element, then use the subtree of the legend + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'legend') { + // legend can be mixed text + var text = first.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + } + // output + if (nodeName === "output") { + // if the associated label element exists, use concatenated accessible name(s) from labelled elements. + if (elem.hasAttribute("for")) { + var labelIDs = elem.getAttribute("for").trim().split(" "); + if (labelIDs && labelIDs.length > 0) { + var label = ""; + for (var j = 0; j < labelIDs.length; j++) { + var labelNode = elem.ownerDocument.getElementById(labelIDs[j]); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elem) && !VisUtil_1.VisUtil.isNodeHiddenFromAT(labelNode) && !VisUtil_1.VisUtil.isNodePresentational(labelNode)) { + var pair = AccNameUtil.computeAccessibleName(labelNode); + if (pair && pair.name && pair.name.trim().length > 0) + label += " " + CommonUtil_1.CommonUtil.normalizeSpacing(pair.name); + } + } + if (label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + } + } + // summary + if (nodeName === "summary") { + // use summary element subtree + var text = elem.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + // details + if (nodeName === "details") { + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'summary') { + // get accessible name from summary + var pair = AccNameUtil.computeAccessibleName(first); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(pair.name.trim()), "nameFrom": "summary" }; + } + // If no summary element as a direct child of the details element, + // the user agent should provide one with a subtree containing a localized string of the word "details". + return { "name": "details", "nameFrom": "internal" }; + } + // figure + if (nodeName === "figure") { + // if the figure element has a figcaption as a child + var caption = CommonUtil_1.CommonUtil.getChildByTagHidden(elem, "figcaption", true, false); + if (caption && caption.length > 0) { + // figcaption can be mixed text + var text = caption[0].innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "figcaption" }; + } + } + // img elements: use attribute "alt" + if (nodeName === "img") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // area elements: use attribute "alt" + if (nodeName === "area") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + if (alt && alt.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // table element + if (nodeName === "table") { + // if the figure element has a caption as the first child + var captionElem = elem.firstElementChild; + if (captionElem && captionElem.nodeName.toLowerCase() === 'caption') { + // caption can be mixed text + var caption = captionElem.innerText; + if (caption && caption.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(caption), "nameFrom": "caption" }; + } + } + // a element + if (nodeName === "a") { + // first use the link text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + //for image link: get the image or svg if exists + var images = elem.querySelectorAll(":scope > img, :scope > svg"); + if (images && images.length > 0) { + var text_2 = ""; + images.forEach(function (image) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + text_2 += " " + pair.name.trim(); + } + }); + if (text_2.trim() !== '') + return { "name": text_2.trim(), "nameFrom": "alt" }; + } + } + // optgroup + // label participate in accessible name calculation: https://www.w3.org/TR/html-aam-1.0/#att-label + // The label attribute must be specified. Its value gives the name of the group + // the value is disabled in the interface + if (nodeName === "optgroup" || nodeName === "option" || nodeName === "track") { + var label = elem.getAttribute("label"); + if (label && label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // svg + if (nodeName === "svg") { + var pair = AccNameUtil.computeAccessibleNameForSVGElementW3C(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForSVGElement = function (elem) { + // 1. a direct child or descendant title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_3 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_3 += title.trim(); + } + }); + if (text_3 && text_3.trim() !== '') + return { "name": text_3.trim(), "nameFrom": "svgTitle" }; + } + // 2. xlink:title attribute on a link + var linkTitle = elem.querySelector("a"); + if (linkTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(linkTitle) && !VisUtil_1.VisUtil.isNodePresentational(linkTitle)) { + var link = linkTitle.getAttribute("xlink:title"); + if (link && link.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(link), "nameFrom": "svglinkTitle" }; + } + /** 3. for text container elements, the text content. + * note the SVG text content elements are: ‘text’, ‘textPath’ and ‘tspan’. + * svg element can be nested. One of the purposes is to to group SVG shapes together as a collection for responsive design. + * + * select text content excluded the text from the nested svg elements and their children + */ + var text = ""; + elem.querySelectorAll(":scope > *").forEach(function (element) { + if (element.nodeName.toLowerCase() !== 'svg' && !VisUtil_1.VisUtil.isNodeHiddenFromAT(element) && !VisUtil_1.VisUtil.isNodePresentational(element)) { + var value = CommonUtil_1.CommonUtil.getInnerText(element); + if (value && value.trim().length > 0) + text += value; + } + }); + if (text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "svgText" }; + // 4. from aria-describedby or aria-description + var descby = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (descby && descby.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(descby), "nameFrom": "aria-description" }; + // 5. a direct child or descendant desc element + var descElems = elem.querySelectorAll(":scope > desc"); + if (descElems && descElems.length > 0) { + var text_4 = ""; + descElems.forEach(function (descElem) { + if (descElem && !VisUtil_1.VisUtil.isNodeHiddenFromAT(descElem) && !VisUtil_1.VisUtil.isNodePresentational(descElem)) { + var desc = descElem.textContent; + if (desc && desc.trim() !== '') + text_4 += desc.trim(); + } + }); + if (text_4 && text_4.trim() !== '') + return { "name": text_4.trim(), "nameFrom": "svgDesc" }; + } + }; + // calculate accessible name for custom elements marked with aria + AccNameUtil.computeAccessibleNameFromContent = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + /** for acc name from content, the content from CSS pseudo-elements + * :before and :after pseudo elements [CSS2] can provide textual content for elements that have a content model. + * For :before or :after pseudo elements, user agents must prepend CSS textual content, without a space, + * to the textual content of the current node. + */ + var pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "before"); + if (pair !== null && pair.name && pair.name.trim().length > 0) + return pair; + pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "after"); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + // shadow host + if (elem.shadowRoot) { + pair = AccNameUtil.computeAccessibleNameForShadowHost(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "shadow" }; + ; + } + // slot element + if (nodeName === "slot") { + pair = AccNameUtil.computeAccessibleNameForSlotElement(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "slot" }; + } + // otherwise: get the value from the element + pair = AccNameUtil.computeAccessibleNameFromChildren(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "content" }; + // no accessible name exists + return null; + }; + // calculate accessible name from CSS generated content + AccNameUtil.computeAccessibleNameForCSSPseudoElement = function (elem, type) { + var contentElem = elem.ownerDocument.defaultView.getComputedStyle(elem, type); + if (contentElem) { + var content = contentElem.content; + if (content && content !== "none" && content !== "no" && content !== "normal") { + content = content.replace(/^"/, "").replace(/"$/, ""); + if (content.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(content), "nameFrom": "css-" + type }; + } + } + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForShadowHost = function (elem) { + var text = ""; + var shadowRoot = elem.shadowRoot; + if (shadowRoot) { + var children = shadowRoot.querySelectorAll('*'); + // check text from all the children elements + children.forEach(function (child) { + var pair = AccNameUtil.computeAccessibleName(child); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + }); + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "shadow-host" }; + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForSlotElement = function (elem) { + //if no assignedNode, check its own text + var text = ""; + if (!elem.assignedNodes() || elem.assignedNodes().length === 0) { + var pair = AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + } + else { + // check text from all assigned nodes + for (var _i = 0, _a = elem.assignedNodes(); _i < _a.length; _i++) { + var slotChild = _a[_i]; + var pair = AccNameUtil.computeAccessibleName(slotChild); + if (pair && pair.name && pair.name.length > 0) + text += " " + pair.name.trim(); + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content-slot" }; + return null; + }; + // calculate accessible name from children content + AccNameUtil.computeAccessibleNameFromChildren = function (elem) { + var text = ""; + //let walkChild = elem.firstChild; + var nw = new DOMWalker_1.DOMWalker(elem); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + //while (walkChild) { + var walkChild = nw.node; + if (walkChild.nodeType === 3) { + // for the text node, get the parentnode to check visibility + var parent_1 = walkChild.parentElement; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(parent_1) && !VisUtil_1.VisUtil.isNodePresentational(parent_1) && walkChild.nodeValue && walkChild.nodeValue.trim().length > 0) { + text += " " + walkChild.nodeValue.trim(); + } + } + else if (walkChild.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(walkChild) && !VisUtil_1.VisUtil.isNodePresentational(walkChild)) { + var pair = AccNameUtil.computeAccessibleName(walkChild); + if (pair && pair.name && pair.name.length > 0) { + text += " " + pair.name.trim(); + nw.bEndTag = true; + } + // Skip children if this element only has presentational children + else if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(nw.node)) { + nw.bEndTag = true; + } + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content" }; + return null; + }; + // if accessible name can be ignored for image or svg + AccNameUtil.isAccessibleNameIgnorable = function (elem) { + if (!elem) + return false; + var nodeName = elem.nodeName.toLowerCase(); + if (nodeName !== 'img' && nodeName !== 'svg') + return false; + var parent = elem.parentElement; + if (parent) { + // if the parent is a widget and has an aria label, then image/svg label is not necessary + if ((AriaUtil_1.AriaUtil.isWidget(parent) || AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(parent)) && AriaUtil_1.AriaUtil.hasAriaLabel(parent)) + return true; + } + return false; + }; + return AccNameUtil; +}()); +exports.AccNameUtil = AccNameUtil; + + +/***/ }, + +/***/ "./src/v4/util/AriaUtil.ts" +/*!*********************************!*\ + !*** ./src/v4/util/AriaUtil.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AriaUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ./AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AriaUtil = /** @class */ (function () { + function AriaUtil() { + } + AriaUtil.isDefinedAriaAttributeAtIndex = function (ele, index) { + var attrName = ele.attributes[index].name; + return AriaUtil.isDefinedAriaAttribute(ele, attrName); + }; + /** + * this method returns user-defined aria attribute name from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributes = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push(attrName); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributes = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push(attrName); + } + } + return htmlAttributes; + }; + /** + * this method returns user-defined aria attribute name-value pair from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributeNameValuePairs = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push({ name: attrName, value: attrValue }); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name-value pair from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributeNameValuePairs = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push({ name: attrName, value: attrValue }); + } + } + return htmlAttributes; + }; + /** + * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true" + */ + AriaUtil.getAriaAttribute = function (ele, attributeName) { + // If the attribute is defined, it takes precedence + var retVal = ele.getAttribute(attributeName); + if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check + return retVal; + } + // Then determine implicit values from other attributes + if (!retVal) { + var tag = ele.nodeName.toLowerCase(); + if (attributeName in AriaUtil.ariaAttributeImplicitMappings) { + if (tag in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName][tag]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + else if ("*" in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName]["*"]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + } + // Check role-based defaults + if (!retVal) { + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele); + if (role in AriaUtil.ariaAttributeRoleDefaults && attributeName in AriaUtil.ariaAttributeRoleDefaults[role]) { + retVal = AriaUtil.ariaAttributeRoleDefaults[role][attributeName]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + // Still not defined? Check global defaults + if (!retVal && attributeName in AriaUtil.ariaAttributeGlobalDefaults) { + retVal = AriaUtil.ariaAttributeGlobalDefaults[attributeName]; + } + return retVal; + }; + AriaUtil.isDefinedAriaAttribute = function (ele, attrName) { + var isDefinedAriaAttribute = false; + if (attrName.substring(0, 5) === 'aria-') { + // User agents SHOULD treat state and property attributes with a value of "" the same as they treat an absent attribute. + isDefinedAriaAttribute = ele.hasAttribute && ele.hasAttribute(attrName) && ele.getAttribute(attrName).length > 0; + } + return isDefinedAriaAttribute; + }; + /** + * WAI-ARIA’s role attribute may have a list of values, but only the first valid and supported WAI-ARIA role is used + * https://www.w3.org/TR/wai-aria-implementation/#mapping_role_table + * This function is responsible for retrieving the resoled role for an element. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return string - resolved role for the element: + * explicit role: resoled from the list of values + * implicit role: if not explicitely specified, or none of the specified role values is allowed for the element + * null: if none of the specified role values is allowed for the element, neither implicit role exists + * + * @memberOf AriaUtil + */ + AriaUtil.getResolvedRole = function (elem, considerImplicitRoles) { + if (considerImplicitRoles === void 0) { considerImplicitRoles = true; } + if (!elem) + return null; + var role = CacheUtil_1.CacheUtil.getCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", null); + if (role === null) { + var roles = AriaUtil.getUserDefinedRoles(elem); + var tagProperty = AriaUtil.getElementAriaProperty(elem); + var allowedRoles = AriaUtil.getAllowedAriaRoles(elem, tagProperty); + var containsGeneric = false; + if (roles && roles.length > 0 && allowedRoles && allowedRoles.length > 0) { + for (var i = 0; i < roles.length; i++) { + if (allowedRoles.includes("any") || allowedRoles.includes(roles[i])) { + if (allowedRoles.includes("any") && roles[i] === 'generic') { + containsGeneric = true; + continue; + } + role = roles[i]; + if (role === "presentation" || role === "none") { + // If element is focusable, then presentation roles are to be ignored + if (CommonUtil_1.CommonUtil.isFocusable(elem)) { + //reset rule to null + role = null; + continue; + } + } + break; + } + } + if (containsGeneric) + role = 'generic'; + } + if (role === null && considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(elem); + role = implicitRole && implicitRole.length > 0 ? implicitRole[0] : undefined; + } + CacheUtil_1.CacheUtil.setCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", role); + } + return role !== undefined ? role : null; + }; + /** + * This function is responsible for retrieving user defined element's roles from dom. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} roles - list of user defined roles in the element role attribute. + * + * @memberOf AriaUtil + */ + AriaUtil.getUserDefinedRoles = function (ele) { + return AriaUtil.getRoles(ele, false); + }; + /** + * This function is responsible for retrieving element's roles. + * This function also finds implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} roles - list of attribute roles and implicit roles. + * + * @memberOf AriaUtil + */ + AriaUtil.getRoles = function (ele, considerImplicitRoles) { + var roles = []; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + var attrRoles = CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("role").trim()).split(" "); + for (var i = 0; i < attrRoles.length; ++i) { + roles.push(attrRoles[i]); + } + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + //add implicit roles to the attributes roles. + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, roles); + } + } + return roles; + }; + /** + * Returns the implicit role of the elemement + * @parm {HTMLElement} ele - element for which to find role. + * + * @return the implicit role or [] if doesn't exist + * + * @memberOf AriaUtil + */ + AriaUtil.getImplicitRole = function (ele) { + if (!ele || ele.nodeType !== 1) + return null; + var implicitRoles = CacheUtil_1.CacheUtil.getCache(ele, "AriaUtil_ImplicitRole", null); + if (!implicitRoles) { + var tagProperty = AriaUtil.getElementAriaProperty(ele); + // check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole) { + if (tagProperty.implicitRole.includes("generic")) { + // the 'generic' role is only allowed if a valid aria attribute exists. + var domAriaAttributes_1 = AriaUtil.getUserDefinedAriaAttributes(ele); + if (domAriaAttributes_1.length === 0) { + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + var roleAttributes = []; + var pattern = ARIADefinitions_1.ARIADefinitions.designPatterns['generic']; + if (pattern.reqProps && pattern.reqProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(pattern.reqProps, roleAttributes); + if (tagProperty.globalAriaAttributesValid) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(ARIADefinitions_1.ARIADefinitions.globalProperties, roleAttributes); + if (pattern.deprecatedProps && pattern.deprecatedProps.length > 0) + CommonUtil_1.CommonUtil.reduceArrayItemList(pattern.deprecatedProps, roleAttributes); + // remove 'generic' role if roleAttributes doesn't contain any of domAriaAttributes + if (roleAttributes.length > 0 && !roleAttributes.some(function (attr) { return domAriaAttributes_1.includes(attr); })) { + var implicit = CommonUtil_1.CommonUtil.reduceArrayItemList(['generic'], tagProperty.implicitRole); + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", implicit); + return implicit; + } + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", tagProperty.implicitRole); + return tagProperty.implicitRole; + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + return implicitRoles; + }; + /** + * Returns the required properties of the role + * @parm {string} role - the role + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} properties - list of properties that are required by the role + * + * @memberOf AriaUtil + */ + AriaUtil.getRoleRequiredProperties = function (role, ele) { + if (role === null) { + return null; + } + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + var requiredAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqProps; + // handle special case of separator + if (role.toLowerCase() === "separator" && ele && CommonUtil_1.CommonUtil.isFocusable(ele)) { + requiredAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []); + } + return requiredAttributes; + } + else { + return null; + } + }; + /** + * This function is responsible for finding if a element has given role. + * This function aslo finds if element has given roles as implicit role. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - true or false based on if th element has the specified role. + * + * @memberOf AriaUtil + * + * Consider to use hasRoleInSemantics() instead. + */ + AriaUtil.hasRole = function (ele, role, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] === role; + } + } + } + //if none of the the attribute roles matched with given role + //check if implicit roles matches. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + var wRoles = []; + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, wRoles); + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] === role; + } + } + } + } + return retVal; + }; + /** + * Checks if the element has the role, including the implied role if role is not explicitly specified. + * + * This function is replacing the hasRole function + * + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * + * @return {List} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasRoleInSemantics = function (ele, role) { + var retVal = false; + var roleSpecified = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] === role; + } + } + } + if (roleSpecified) { + return retVal; + } + //check if implicit roles matches. + //Note: element can have multiple implicit roles + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) { + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] === role; + } + } + } + return retVal; + }; + /** + * This function is responsible for finding if a element has given role. + * This function also checks if element has given roles as implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {bool} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasAnyRole = function (ele, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + retVal = true; + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) + retVal = true; + } + return retVal; + }; + AriaUtil.isPresentationalElement = function (node) { + // Elements extracted from https://developer.mozilla.org/en/docs/Web/HTML/Element#Inline_text_semantics, + // http://dev.w3.org/html5/html-author/#text-level-semantics and https://wiki.whatwg.org/wiki/Presentational_elements_and_attributes + var presentationalElements = ["abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn", + "em", "i", "kbd", "mark", "q", "rp", "rt", "rtc", "ruby", "s", + "samp", "small", "span", "strong", "sub", "sup", "time", "u", + "var", "wbr", "a", "progress", "meter", "basefont", "big", "center", + "strike", "tt", "font", "blink", "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "blockquote", "p" + ]; + return CommonUtil_1.CommonUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements); + }; + /** + * return the ancestor of the given element and role. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (considerImplicitRoles) { + if (AriaUtil.hasRoleInSemantics(walkNode, roleName)) { + break; + } + } + else { + if (AriaUtil.hasRole(walkNode, roleName, false)) { + break; + } + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + /** + * return the ancestor of the given element and roles. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roles - the role names to search for + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRoles = function (element, roleNames) { + if (!element || !roleNames || !roleNames.length || roleNames.length === 0) + return null; + var walkNode = element; + while (walkNode !== null) { + var role = AriaUtil.getResolvedRole(walkNode); + if (role !== null && + (roleNames.includes(role) || + (roleNames.includes("*") && !["presentation", "none"].includes(role)))) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getRolesWithTypes = function (element, types) { + if (!element || !types || !types.length || types.length === 0) + return null; + var roles = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "roles_with_given_types", null); + if (!roles || roles.length === 0) { + roles = []; + Object.entries(ARIADefinitions_1.ARIADefinitions.designPatterns).forEach(function (_a) { + var key = _a[0], value = _a[1]; + if (types.includes(value.roleType)) + roles.push(key); + }); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "roles_with_given_types", roles); + } + return roles; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.isWidget = function (element) { + if (!element) + return false; + var widget = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "is_element_widget", null); + if (widget === null) { + var ret = false; + var role = AriaUtil.getResolvedRole(element); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') + ret = true; + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "is_element_widget", ret); + return ret; + } + return widget; + }; + /** + * return if the element is owned or controlled by another element. + * If an ancestor of an element is owned or controlled by another element, then the element is also considered as owned or controlled. + * an element can be owned or controlled by another element through aria-owns or aria-controls + * when the DOM hierarchy cannot be used to represent the relationship. + * aria-owns attribute is used to define contextual relationship with a owning parent + * aria-controls attribute is used to associate an element with the controlling element. + * example elements with roles: combobox, scrollbar, tab, button, listbox, menu, menubar, radiogroup, tree, treegrid + * + * when an element is owned or controlled by another element, its navigation may be controlled by the parent + * through aria-activedescendants attribute or roving tabindex + * + * Note navigation with native combobox (input with a datalist) is in native focus navigation, not considered here + * + * @parm {element} element - The element to inspect + * @return {boolean} + * + * @memberOf AriaUtil + */ + AriaUtil.isNavigationOwnedOrControlled = function (element) { + if (!element) + return false; + var ownerElems = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", null); + if (ownerElems !== null && ownerElems.length > 0) { + if (CommonUtil_1.CommonUtil.getAncestor(element, ownerElems)) + return true; + } + var role = AriaUtil.getResolvedRole(element); + if (!role) + return false; + var id = element.getAttribute("id"); + if (!id || id.trim().length === 0) + return false; + var elem = element.ownerDocument.querySelector("*[aria-controls~='".concat(id, "'], *[aria-owns~='").concat(id, "']")); + if (!elem) + return false; + var containers = ['combobox', 'scrollbar', 'button', 'tab', 'listbox', 'menu', 'menubar', 'radiogroup', 'tree', 'treegrid']; + if (containers.includes(role)) { + if (ownerElems === null) + ownerElems = []; + ownerElems.push(element); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", ownerElems); + return true; + } + return false; + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function by default will not consider Check Hidden Setting at all. + * + * Note: This is a wrapper function to: AriaUtil.getSiblingWithRoleHidden + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRole = function (element, role) { + return AriaUtil.getSiblingWithRoleHidden(element, role, false); + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function also considers implicit roles for the elements. + * + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicit - true or false based on if Implicit roles should be considered. + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRoleHidden = function (element, role, considerHiddenSetting, considerImplicitRole) { + // Variable Declaration + var walkNode = null; + var hasRole = false; + // Only perform the check if element and role are both provided + if (element && role) { + // Fetch the next sibling element + walkNode = element.nextSibling; + // Keep looping over the next siblings to find element which matches + // the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.nextSibling; + continue; + } + // Check if this node has the role that we need to check exists + if (considerImplicitRole) { + hasRole = AriaUtil.hasRoleInSemantics(walkNode, role); + } + else { + hasRole = AriaUtil.hasRole(walkNode, role, false); + } + // Move on to the next node + walkNode = walkNode.nextSibling; + } + // If we still have not found a node that matches the role, start a reverse look up + if (!walkNode) { + // Fetch the previous Sibling of this element + walkNode = element.previousSibling; + // Keep looping over all the previous siblings to search for an element which + // matches the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.previousSibling; + continue; + } + // Check if this node has the role that we need to check exists + hasRole = AriaUtil.hasRole(walkNode, role, considerImplicitRole); + // Move on to the next node + walkNode = walkNode.previousSibling; + } + } + } + return walkNode; + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getDescendantWithRoleHidden + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRole = function (element, roleName) { + return AriaUtil.getDescendantWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendant = null; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (considerImplicitRoles ? AriaUtil.hasRoleInSemantics(nw.node, roleName) : AriaUtil.hasRole(nw.node, roleName, false)) { + descendant = nw.node; + break; + } + } + return descendant; + }; + /** + * This function is responsible for getting All descendant elements with the specified roles, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string[]} roleNames - The roles to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - all descendant elements that match the roles specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoles = function (element, roleNames, considerHiddenSetting, considerImplicitRoles) { + if (!roleNames || roleNames.length === 0) + return; + // Variable Decleration + var descendants = []; + roleNames.forEach(function (roleName) { + var kids = AriaUtil.getAllDescendantsWithRoleHidden(element, roleName, considerHiddenSetting, considerImplicitRoles); + if (kids && kids.length > 0) + descendants = descendants.concat(kids); + }); + return descendants; + }; + /** + * This function is responsible for getting All descendant elements with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - The descendant elements that match the role specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendants = []; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + if (nw.bEndTag) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (AriaUtil.hasRole(nw.node, roleName, considerImplicitRoles)) { + descendants.push(nw.node); + } + } + return descendants; + }; + /** + * This function is responsible for getting All direct children in AT tree with a role (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree that has a role + * + * @memberOf AriaUtil + */ + AriaUtil.getDirectATChildren = function (element) { + var requiredChildRoles = AriaUtil.getRequiredChildRoles(element, true); + var direct = []; + AriaUtil.retrieveDirectATChildren(element, requiredChildRoles, direct); + return direct; + }; + /** + * This function is responsible for recursively any child path till either no child or a child with a role is found (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree + * + * @memberOf AriaUtil + */ + AriaUtil.retrieveDirectATChildren = function (element, requiredChildRoles, direct) { + var children = []; + if (element.children !== null && element.children.length > 0) { + for (var i = 0; i < element.children.length; i++) { + children.push(element.children[i]); + } + } + // if the element contains "aria-own" attribute, then the aria-owned children need to be included too + var owned = element.getAttribute("aria-owns"); + if (owned) { + var doc = element.ownerDocument; + if (doc) { + var ownedIds = owned.split(" "); + for (var i = 0; i < ownedIds.length; i++) { + var ownedElem = doc.getElementById(ownedIds[i]); + if (ownedElem) { + children.push(ownedElem); + } + } + } + } + if (children.length > 0) { + for (var i = 0; i < children.length; i++) { + //ignore hidden and invisible child + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(children[i]) || !VisUtil_1.VisUtil.isNodeVisible(children[i])) + continue; + var roles = AriaUtil.getRoles(children[i], false); + if (roles === null || roles.length === 0) { + roles = AriaUtil.getImplicitRole(children[i]); + } + if (roles && roles !== null && roles.length > 0) { + //remove 'none' and 'presentation' + roles = roles.filter(function (role) { + return role !== "none" && role !== "presentation"; + }); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (roles.includes("group") && requiredChildRoles && requiredChildRoles.includes('group')) { + roles = roles.filter(function (role) { + return role !== 'group'; + }); + } + } + if (roles && roles !== null && roles.length > 0) { + direct.push(children[i]); + } + else { + // recursive until get a return value, + AriaUtil.retrieveDirectATChildren(children[i], requiredChildRoles, direct); + } + } + return null; + } + else + return null; + }; + /** + * this function returns null or required child roles for a given element with one more roles, + * return null if the role is 'none' or 'presentation' + * @param element + * @param includeImplicit include implicit roles if no role is explicitly provided + * @returns + */ + AriaUtil.getRequiredChildRoles = function (element, includeImplicit) { + var roles = AriaUtil.getRoles(element, false); + // if explicit role doesn't exist, get the implicit one + if ((!roles || roles.length === 0) && includeImplicit) { + roles = AriaUtil.getImplicitRole(element); + } + /** + * ignore if the element doesn't have any explicit or implicit role + */ + if (!roles || roles.length === 0) { + return null; + } + /** + * ignore if the element contains none or presentation role + */ + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var requiredChildRoles = new Array(); + for (var j = 0; j < roles.length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].reqChildren !== null) { + requiredChildRoles = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(designPatterns[roles[j]].reqChildren, requiredChildRoles); + } + } + return requiredChildRoles; + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getAriaOwnsWithRoleHidden + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRole = function (element, roleName) { + return AriaUtil.getAriaOwnsWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. This function aslo finds elements with implicit roles. + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var referencedElement = null; + var referencedElemHasRole = false; + // In the case aria-owns is not on the element just break out of this function with null + if (CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-owns")) { + // Get the reference ID + var referenceID = element.getAttribute("aria-owns"); + // Get the element for the reference ID + referencedElement = fragment_1.FragmentUtil.getById(element, referenceID); + //ignore if the aria-owns point to the element itself + if (DOMUtil_1.DOMUtil.sameNode(element, referencedElement)) + return null; + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if (considerHiddenSetting && referencedElement != null && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(referencedElement)) { + referencedElemHasRole = null; + } + else { + referencedElemHasRole = AriaUtil.hasRole(referencedElement, roleName, considerImplicitRoles); + } + } + return referencedElemHasRole ? referencedElement : null; + }; + // Return true if the element has an ARIA label + AriaUtil.hasAriaLabel = function (element) { + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + return CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-label") || CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-labelledby"); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelID = elements[i].getAttribute("aria-labelledby"); + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = ""; + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + label = AriaUtil.getTextContentExcludingScripts(labelNode); + } + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + } + else { + // Has no label at all + hasDuplicateLabels = true; + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return !hasDuplicateLabels; + }; + /** + * Get text content from an element, excluding script and style elements + * This is a simplified version that doesn't go through full accessible name computation + * to avoid circular dependencies when called from getAriaLabel + * + * Note: When an element is referenced by aria-labelledby, its content is included + * even if the element is hidden (per ARIA spec) + */ + AriaUtil.getTextContentExcludingScripts = function (elem) { + if (!elem) + return ""; + var text = ""; + var nw = new DOMWalker_1.DOMWalker(elem); + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + var node = nw.node; + var nodeName = node.nodeName ? node.nodeName.toLowerCase() : ""; + // Skip script and style elements + if (nodeName === 'script' || nodeName === 'style') { + nw.bEndTag = true; // Skip children + continue; + } + if (node.nodeType === 3) { // Text node + // Include text even from hidden elements when referenced by aria-labelledby + if (node.nodeValue && node.nodeValue.trim().length > 0) { + text += " " + node.nodeValue.trim(); + } + } + else if (node.nodeType === 1) { // Element node + // Handle images - get alt text + if (nodeName === 'img' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children of img + } + // Handle input with type="image" - get alt text + else if (nodeName === 'input' && node.getAttribute('type') === 'image' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children + } + } + } + return text.trim(); + }; + AriaUtil.getAriaLabel = function (ele) { + if (ele.hasAttribute) { + if (ele.hasAttribute("aria-labelledby")) { + var labelIDs = ele.getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_1 = labelIDs.length; j < length_1; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + // Use our helper to get text content without circular dependency + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label); + } + } + return normalizedLabel.trim(); + } + else if (ele.hasAttribute("aria-label")) { + return CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("aria-label")).trim(); + } + } + return ""; + }; + AriaUtil.getAriaDescription = function (ele) { + if (!ele) + return ""; + var normalizedLabel = ""; + var desc = ele.getAttribute("aria-labelledby"); + if (desc && desc.trim().length > 0) { + var labelIDs = desc.trim().split(" "); + for (var j = 0, length_2 = labelIDs.length; j < length_2; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + if (label && label.trim().length > 0) + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + if (normalizedLabel.trim().length > 0) + return normalizedLabel.trim(); + } + desc = ele.getAttribute("aria-description"); + if (desc && desc.trim().length > 0) + return desc.trim().toLowerCase(); + return ""; + }; + AriaUtil.findAriaLabelDupes = function (elements) { + var dupeMap = {}; + elements.forEach(function (ele) { + dupeMap[AriaUtil.getAriaLabel(ele)] = (dupeMap[AriaUtil.getAriaLabel(ele)] || 0) + 1; + }); + return dupeMap; + }; + /** + * return accessible names for all AT visible landmark elements + * @param doc + * @returns + */ + AriaUtil.getLandmarkAccNames = function (doc) { + var nameMap = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_Landmark_AccNames", null); + if (nameMap && nameMap.length !== 0) + return nameMap; + nameMap = []; + var landmarkElems = doc.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]'); + if (landmarkElems.length === 0) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + } + landmarkElems.forEach(function (elem) { + // ignore node that is AT hidden or in a dialog that is considered as a separate location from the rest of the main page + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) && CommonUtil_1.CommonUtil.getAncestor(elem, ["DIALOG"]) === null && AriaUtil.getAncestorWithRole(elem, "dialog", true) === null) { + var name_1 = ""; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + name_1 = pair.name.trim(); + // check neested landmark to calculate the accessible name + var ancestors = __spreadArray([], landmarkElems, true).filter(function (e) { return e.contains(elem) && e !== elem; }); + if (ancestors.length > 1) { + ancestors.forEach(function (ancestor) { + var ancestor_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ancestor); + if (ancestor_pair && ancestor_pair.name && ancestor_pair.name.trim().length > 0) + name_1 = ancestor_pair.name.trim() + " " + name_1; + }); + } + var role = AriaUtil.getResolvedRole(elem); + nameMap.push({ "elem": elem, "role": role, "name": name_1 }); + } + }); + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + }; + /** + * check if the given element with the landmark rolw is unique + * @param element + * @param role: a specific landmark role, or "any" for all landmark role + * @param considerNoneLabel: if consider the landmarks without a label + * @returns + */ + AriaUtil.isLandmarkNameUnique = function (element, role, considerNoneLabel) { + if (considerNoneLabel === void 0) { considerNoneLabel = false; } + var nameMap = AriaUtil.getLandmarkAccNames(element.ownerDocument); + var exist = null; + if (role === 'any') + exist = nameMap.find(function (entry) { return entry.elem === element; }); + else + exist = nameMap.find(function (entry) { return entry.elem === element && entry.role === role; }); + if (!exist) + return null; + var name = exist.name; + if (!considerNoneLabel && name === '') + return null; + for (var i = 0; i < nameMap.length; i++) { + if (nameMap[i].elem === element) + continue; + if (name === nameMap[i].name) { + if (role === 'any') + return true; + else if (nameMap[i].role === role) + return true; + } + } + return false; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasUniqueAriaLabels = function (elements) { + return AriaUtil.hasUniqueAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasDuplicateAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + var duplicateLabelNameArray = new Array(); + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + if (!(ariaLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[ariaLabel] = new Array(); + } + duplicateLabelNameArray[ariaLabel].push(elements[i].nodeName.toLowerCase()); + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelIDs = elements[i].getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_3 = labelIDs.length; j < length_3; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + if (!(normalizedLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[normalizedLabel] = new Array(); + } + duplicateLabelNameArray[normalizedLabel].push(elements[i].nodeName.toLowerCase()); + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return duplicateLabelNameArray; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasDuplicateAriaLabels = function (elements) { + return AriaUtil.hasDuplicateAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique aria-labelledby attributes + AriaUtil.hasUniqueAriaLabelledby = function (elements) { + var hasDuplicateLabels = false; + var labelRefs = {}; + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute && elements[i].hasAttribute("aria-labelledby") && !CommonUtil_1.CommonUtil.isIdReferToSelf(elements[i], elements[i].getAttribute("aria-labelledby"))) { + var labelRef = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby")); + hasDuplicateLabels = labelRef in labelRefs; + labelRefs[labelRef] = true; + } + else { + hasDuplicateLabels = true; + } + } + return !hasDuplicateLabels; + }; + /** + * this function is responsible for resolving ARIA requirements for an HTML element per ARIA in HTML + * @param ruleContext the HTML element to be examined + * @returns + */ + AriaUtil.getElementAriaProperty = function (ruleContext) { + var tagProperty = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_ElementAriaProperty", null); + if (!tagProperty) { + var tagName = null; + var name_2 = null; + if (ruleContext.tagName) { + tagName = ruleContext.tagName.toLowerCase(); + } + else if (ruleContext.nodeName) { + tagName = ruleContext.nodeName.toLowerCase(); + } + // check if the tagProperty exists in the documentConformanceRequirement hash. + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirement[tagName]; + // The tag needs to check some special attributes + if (tagProperty === null || tagProperty === undefined) { + var specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags[tagName]; + switch (tagName) { // special cases + case "a": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "area": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "figure": { + var fcs = CommonUtil_1.CommonUtil.getChildByTag(ruleContext, "figcaption"); + fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"]; + break; + } + case "footer": + case "header": + if (AriaUtil.getAncestorWithRole(ruleContext, "article", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "complementary", true) !== null + || AriaUtil.getAncestorWithRole(ruleContext, "navigation", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "region", true) !== null + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["article", "aside", "main", "nav", "section"]) !== null) + tagProperty = specialTagProperties["des-section-article-aside-main-nav"]; + else + tagProperty = specialTagProperties["other"]; + break; + case "img": + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (AriaUtil.getAriaLabel(ruleContext).trim().length !== 0 || (alt !== null && alt.length > 0) || (title !== null && title.length > 0)) { + // If the img has non-empty alt (alt="some text" or alt=" ") or an accessible name is provided + tagProperty = specialTagProperties["img-with-accname"]; + } + else { + if (alt !== null) { + // If the img has an empty alt (alt="") + tagProperty = specialTagProperties["img-without-accname-empty-alt"]; + } + else { + // If the img lacks an alt attribute + tagProperty = specialTagProperties["img-without-accname-no-alt"]; + } + } + break; + case "input": + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "type")) { + var type = ruleContext.getAttribute("type").trim().toLowerCase(); + tagProperty = specialTagProperties[type]; + if (tagProperty === null || tagProperty === undefined) { + switch (type) { + case "checkbox": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"]; + break; + case "email": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"]; + break; + case "search": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"]; + break; + case "tel": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"]; + break; + case "text": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + break; + case "url": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"]; + break; + default: + // default + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["default-with-list"] : tagProperty = specialTagProperties["default-no-list"]; + break; + } + } + } + else { + // default type is the same as type=text + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + } + break; + case "li": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["li"]; + if (ruleContext.parentElement && AriaUtil.hasRoleInSemantics(ruleContext.parentElement, "list")) + tagProperty = specialTagProperties["child-of-list-role"]; + else + tagProperty = specialTagProperties["no-child-of-list-role"]; + break; + case "section": + //name = ARIAMapper.computeName(ruleContext); + //if (name && name.trim().length > 0) { + var label = AriaUtil.getAriaLabel(ruleContext); + if ((label && label.trim().length > 0) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + tagProperty = specialTagProperties["with-name"]; + } + else { + tagProperty = specialTagProperties["without-name"]; + } + break; + case "select": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"]; + if (ruleContext.hasAttribute("multiple") || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "size") && ruleContext.getAttribute("size") > 1) + tagProperty = specialTagProperties["multiple-attr-size-gt1"]; + else + tagProperty = specialTagProperties["no-multiple-attr-size-gt1"]; + break; + case "summary": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["summary"]; + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], ruleContext.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], ruleContext)) + tagProperty = specialTagProperties["first-summary-of-detail"]; + else + tagProperty = specialTagProperties["no-first-summary-of-detail"]; + break; + case "tbody": + case "td": + case "tr": + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + tagProperty = specialTagProperties["des-table"]; + } + else { + AriaUtil.getAncestorWithRole(ruleContext, "grid", true) || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"]; + } + break; + case "th": + var scope = CommonUtil_1.CommonUtil.getScopeForTh(ruleContext); + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-table-column-scope"]; + else + tagProperty = specialTagProperties["des-table-row-scope"]; + } + else if (AriaUtil.getAncestorWithRole(ruleContext, "grid", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-grid-treegrid-column-scope"]; + else + tagProperty = specialTagProperties["des-grid-treegrid-row-scope"]; + } + else + tagProperty = specialTagProperties["des-other"]; + break; + case "div": + var prt = ruleContext.parentElement; + prt !== null && prt.nodeName.toLowerCase() === 'dl' ? tagProperty = specialTagProperties["child-dl"] : tagProperty = specialTagProperties["no-child-dl"]; + break; + default: + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["default"]; + } //switch + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_ElementAriaProperty", tagProperty); + return tagProperty || null; + }; + AriaUtil.getAllowedAriaRoles = function (ruleContext, properties) { + var allowedRoles = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaRoles", null); + if (!allowedRoles) { + allowedRoles = []; + var tagProperty = null; + if (properties !== null && properties !== undefined) { + tagProperty = properties; + } + else { + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + } + if (tagProperty !== null && tagProperty !== undefined) { + if (tagProperty.implicitRole !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles); + } + if (tagProperty.validRoles !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + var implicitRoles = AriaUtil.getImplicitRole(ruleContext); + if (implicitRoles && implicitRoles.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaRoles", allowedRoles); + } + return allowedRoles; + }; + AriaUtil.getAllowedAriaAttributes = function (ruleContext, roles, properties) { + var allowedAttributes = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaAttributes", null); + if (!allowedAttributes) { + allowedAttributes = []; + var permittedRoles = __spreadArray([], roles, true); + var tagName = ruleContext.tagName.toLowerCase(); + var prohibitedAttributes = []; + // Element with a disabled attribute https://www.w3.org/TR/html5/disabled-elements.html + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(tagName) > -1) { + // Use the aria-disabled attribute on any element that is allowed the disabled attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-disabled", allowedAttributes); + } + // Element with a required attribute http://www.the-art-of-web.com/html/html5-form-validation/ + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedRequired.indexOf(tagName) > -1) { + // Use the aria-required attribute on any element that is allowed the required attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-required", allowedAttributes); + } + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedReadOnly.indexOf(tagName) > -1) { + // Use the aria-readonly attribute on any element that is allowed the readonly attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes); + } + var tagProperty = null; + if (properties != null && properties !== undefined) + tagProperty = properties; + else + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + if (tagProperty !== null && tagProperty !== undefined) { + // add the implicit role allowed attributes to the allowed role list if there is no specified role + // ignore if the element doesn't allow the attributes from the implicit roles + if (tagProperty.implicitRole !== null && + (permittedRoles === null || permittedRoles === undefined || permittedRoles.length === 0) + && tagProperty.allowAttributesFromImplicitRole === undefined) { + for (var i = 0; i < tagProperty.implicitRole.length; i++) { + var roleProperty = ARIADefinitions_1.ARIADefinitions.designPatterns[tagProperty.implicitRole[i]]; + if (roleProperty !== null && roleProperty !== undefined) { + var properties_1 = roleProperty.props; + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + properties_1 = AriaUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + var prohibitedProps = roleProperty.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case of separator + if (tagProperty.implicitRole[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuenow", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + } + // Adding the global properties to the valid attribute list + if (tagProperty.globalAriaAttributesValid) { + var properties_2 = ARIADefinitions_1.ARIADefinitions.globalProperties; // global properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_2, allowedAttributes); + } + } + // adding the other role to the allowed roles for the attributes + if (tagProperty && tagProperty.otherRolesForAttributes && tagProperty.otherRolesForAttributes.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.otherRolesForAttributes, permittedRoles); + // adding the specified role properties to the allowed attribute list + for (var i = 0; permittedRoles !== null && i < permittedRoles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[permittedRoles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + // ignore the properties if the element doesn't allow attributes from the implicit role + if (!tagProperty || tagProperty.implicitRole === null || !tagProperty.implicitRole.includes(permittedRoles[i]) || (tagProperty.implicitRole.includes(permittedRoles[i]) && tagProperty.allowAttributesFromImplicitRole === undefined)) { + var properties_3 = roleProperties.props; // allowed properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + properties_3 = AriaUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + } + var prohibitedProps = roleProperties.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case for separator + if (permittedRoles[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + // ignore aria-level, aria-setsize or aria-posinset if "row" is not in treegrid + if (permittedRoles.includes("row") && AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) == null) { + var index = -1; + if ((index = allowedAttributes.indexOf("aria-level")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-setsize")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-posinset")) > -1) + allowedAttributes.splice(index, 1); + } + // add the other allowed attributes for the element + if (tagProperty && tagProperty.otherAllowedAriaAttributes && tagProperty.otherAllowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var allowed = []; + for (var p = 0; p < tagProperty.otherAllowedAriaAttributes.length; p++) { + var attr = tagProperty.otherAllowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + allowed.push(pair[0]); + } + else + allowed.push(attr); + } + if (allowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(allowed, allowedAttributes); + } + // add the other prohibitted attributes for the element + if (tagProperty && tagProperty.otherDisallowedAriaAttributes && tagProperty.otherDisallowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var disallowed = []; + for (var p = 0; p < tagProperty.otherDisallowedAriaAttributes.length; p++) { + var attr = tagProperty.otherDisallowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + disallowed.push(pair[0]); + } + else + disallowed.push(attr); + } + if (disallowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(disallowed, prohibitedAttributes); + } + //exclude the prohibitedAttributes from the allowedAttributes + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(prohibitedAttributes, allowedAttributes); + //exclude aria attribute for elements without implicit role and with 'Naming Prohibited' + if ((!roles || roles.length === 0) && tagProperty.implicitRole === null && tagProperty.prohibitedAriaAttributesWhenNoImplicitRole) + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(tagProperty.prohibitedAriaAttributesWhenNoImplicitRole, allowedAttributes); + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaAttributes", allowedAttributes); + } + return allowedAttributes; + }; + /** + * + * @param ariaAttr + * @param htmlAttrs + * @type: conflict or overlapping + * @returns htmlAttrName, 'Pass' or null + * htmlAttrName that conflicts with the ariaAttr, + * 'Pass' with no conflict with the ariaAttr, + * or null where ariaAttr won't cause conflict + */ + AriaUtil.getConflictOrOverlappingHtmlAttribute = function (ariaAttr, htmlAttrs, type) { + var exist = ARIADefinitions_1.ARIADefinitions.relatedAriaHtmlAttributes[ariaAttr['name']]; + if (exist) { + if (!ariaAttr || ariaAttr.length == 0 || !htmlAttrs || htmlAttrs.length == 0) + return []; + var examinedHtmlAtrNames = []; + var concernTypes = null; + if (type === 'conflict') { + if (!exist.conflict || Object.keys(exist.conflict).length === 0) + return null; + concernTypes = exist.conflict; + } + else if (type === 'overlapping') { + if (!exist.overlapping || Object.keys(exist.overlapping).length === 0) + return null; + concernTypes = exist.overlapping; + } + else + return null; + var applicable = false; + var fail_1 = false; + for (var k = 0; k < concernTypes.length; k++) { + var concernAriaValue = concernTypes[k].ariaAttributeValue; + var concernHtmlNames = concernTypes[k].htmlAttributeNames; + var concernHtmlValues = concernTypes[k].htmlAttributeValues; + for (var i = 0; i < htmlAttrs.length; i++) { + var index = concernHtmlNames.indexOf(htmlAttrs[i]['name']); + if (index !== -1) { + applicable = true; + var htmlValuesInConcern = (concernHtmlValues === null || concernHtmlValues[index] === null) ? null : concernHtmlValues[index].split(","); + if (concernAriaValue === null) { + if (htmlValuesInConcern === null) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (htmlValuesInConcern === null) { + if (concernAriaValue === ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (concernAriaValue === 'VALUE' && htmlValuesInConcern.includes('VALUE') && htmlValuesInConcern[0] !== ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (concernAriaValue === ariaAttr['value'] && htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + } + } + if (applicable && !fail_1) + examinedHtmlAtrNames.push({ result: 'Pass', 'attr': '' }); + return examinedHtmlAtrNames; + } + else + return null; + }; + AriaUtil.containsPresentationalChildrenOnly = function (elem) { + var roles = AriaUtil.getRoles(elem, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil.getImplicitRole(elem); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return false; + for (var i = 0; roles !== null && i < roles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + var presentional = roleProperties.presentationalChildren; + if (presentional === true) + return true; + } + } + return false; + }; + AriaUtil.shouldBePresentationalChild = function (element) { + var walkNode = DOMWalker_1.DOMWalker.parentElement(element); + while (walkNode) { + if (AriaUtil.containsPresentationalChildrenOnly(walkNode)) + return true; + //aria-own case: if the element is referred by an aria-won + walkNode = ARIAMapper_1.ARIAMapper.getAriaOwnedBy(walkNode) || DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA +*/ + AriaUtil.areRolesDefined = function (roles) { + if (!roles || roles.length === 0) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) { + var role = roles_1[_i]; + if (!(role.toLowerCase() in designPatterns)) + return false; + } + return true; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA + */ + AriaUtil.getInvalidRoles = function (ruleContext) { + var domRoles = AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles && domRoles.includes('generic')) + return ["generic"]; + // Failing roles + var failRoleTokens = []; + // Passing roles + var passRoleTokens = []; + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + var allowedRoles = AriaUtil.getAllowedAriaRoles(ruleContext, tagProperty); + if (!allowedRoles || allowedRoles.length === 0) + return domRoles; + var invalidRoles = []; + if (allowedRoles.includes('any')) + return []; + for (var i = 0; i < domRoles.length; i++) + if (!allowedRoles.includes(domRoles[i]) && !invalidRoles.includes(domRoles[i])) + invalidRoles.push(domRoles[i]); + return invalidRoles; + }; + /* + * check if any explicit role specified for the element is not defined in ARIA + * return: list of specified roles not defined in ARIA + */ + AriaUtil.getRolesUndefinedByAria = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var undefinedRoles = []; + if (roles && roles.length > 0) { + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var i = 0; i < roles.length; i++) { + if (!(roles[i] in designPatterns)) { + undefinedRoles.push(roles[i]); + } + } + } + return undefinedRoles; + }; + /* + * this method first checks explicit roles, if no explicit role, it will check the implicit role + * return: null if any explicit role is invalid, + * a list of invalid attributes + * empty list if all attributes are valid, or no aria attributes are specified + */ + AriaUtil.getInvalidAriaAttributes = function (ruleContext) { + var roles = AriaUtil.getUserDefinedRoles(ruleContext); + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + // for mutiple roles, skip if any role is invalid + var defined = AriaUtil.areRolesDefined(roles); + if (defined !== null && !defined) + return null; + var attrs = []; + if (!roles || roles.length == 0) + roles = AriaUtil.getImplicitRole(ruleContext); + var aria_attrs = AriaUtil.getUserDefinedAriaAttributes(ruleContext); + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + // Attributes allowed on this node + var allowedAttributes = AriaUtil.getAllowedAriaAttributes(ruleContext, roles, tagProperty); + if (aria_attrs) { + for (var i = 0; i < aria_attrs.length; i++) { + var attrName = aria_attrs[i].trim().toLowerCase(); + if (!allowedAttributes.includes(attrName) && !attrs.includes(attrName)) + attrs.push(attrName); + } + } + return attrs; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + AriaUtil.getConflictAriaAndHtmlAttributes = function (elem) { + var ariaAttrs = AriaUtil.getUserDefinedAriaAttributeNameValuePairs(elem); + var htmlAttrs = AriaUtil.getUserDefinedHtmlAttributeNameValuePairs(elem); + var ret = []; + if (ariaAttrs && ariaAttrs.length > 0 && htmlAttrs && htmlAttrs.length > 0) { + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'conflict'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Failed') //failed + ret.push({ 'ariaAttr': ariaAttrs[i]['name'], 'htmlAttr': item['attr'] }); + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + } + return ret; + }; + /* + * get deprecated Aria roles + * return: a list of deprecated Aria roles + */ + AriaUtil.getDeprecatedAriaRoles = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var ret = []; + if (roles && roles.length > 0) { + var globalDeprecatedRoles = ARIADefinitions_1.ARIADefinitions.globalDeprecatedRoles; + for (var i = 0; i < roles.length; i++) { + if (globalDeprecatedRoles.includes(roles[i])) + ret.push(roles[i]); + } + } + return ret; + }; + /* + * get deprecated Aria role-attributes + * return: a list of deprecated Aria role-attributes paris + * for global the role is marked as 'any' + */ + AriaUtil.getDeprecatedAriaAttributes = function (element) { + if (!element) + return null; + var domAttributes = element.attributes; + var ariaAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push(attrName); + } + } + if (ariaAttrs.length === 0) + return []; + var ret = []; + var globalDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.globalDeprecatedProperties; + for (var i = 0; i < ariaAttrs.length; i++) { + if (globalDeprecatedAttributes.includes(ariaAttrs[i])) + ret.push({ "role": "any", "attribute": ariaAttrs[i] }); + } + var roles = AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) { + for (var i = 0; i < roles.length; i++) { + var roleWithDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleWithDeprecatedAttributes) { + var deprecatedAttriNames = roleWithDeprecatedAttributes['deprecatedProps']; + if (deprecatedAttriNames && deprecatedAttriNames.length > 0) { + for (var j = 0; j < ariaAttrs.length; j++) { + if (deprecatedAttriNames.includes(ariaAttrs[j])) + ret.push({ "role": roles[i], "attribute": ariaAttrs[j] }); + } + } + } + } + } + return ret; + }; + AriaUtil.isNodeInGrid = function (node) { + return AriaUtil.getAncestorWithRole(node, "grid") != null; + }; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + AriaUtil.navLinkKeywords = ['start', 'next', 'prev', 'previous', 'contents', 'index']; + // This list contains a list of rule ids for the rules that have to check for hidden content regardless of the Check Hidden + // Content Setting. This means that when the engine is actually determine which elements to mass to the rules, it will always + // pass theses rules no matter what the Check Hidden Content Setting is. + AriaUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId']; + // https://www.w3.org/TR/wai-aria-1.1/#introstates + AriaUtil.ariaAttributeRoleDefaults = { + "alert": { + "aria-live": "assertive", + "aria-atomic": "true" + }, + "combobox": { + "aria-haspopup": "listbox" + }, + "listbox": { + "aria-orientation": "vertical" + }, + "log": { + "aria-live": "polite" + }, + "menu": { + "aria-orientation": "vertical" + }, + "menubar": { + "aria-orientation": "horizontal" + }, + "meter": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "option": { + "aria-selected": "false" + }, + "progressbar": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "scrollbar": { + "aria-orientation": "vertical", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "separator": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "slider": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "spinbutton": { + // Not sure how to encode min/max (or now in 1.2 - "has no value") + //"aria-valuenow": "0" TODO: at risk: maybe delete after ARIA 1.2 reaches proposed rec + // Probably just delete spinbutton from this list completely and let user agents handle "defaults" + }, + "status": { + "aria-live": "polite", + "aria-atomic": "true" + }, + "tab": { + "aria-selected": "false" + }, + "tablist": { + "aria-orientation": "horizontal" + }, + "toolbar": { + "aria-orientation": "horizontal" + }, + "tree": { + "aria-orientation": "vertical" + } + }; + // https://www.w3.org/TR/wai-aria-1.1/#aria-atomic + AriaUtil.ariaAttributeGlobalDefaults = { + "aria-atomic": "false", + "aria-autocomplete": "none", + "aria-busy": "false", + "aria-checked": undefined, + "aria-current": "false", + "aria-disabled": "false", + "aria-dropeffect": "none", + "aria-expanded": undefined, + "aria-grabbed": undefined, + "aria-haspopup": "false", + "aria-hidden": undefined, + "aria-invalid": "false", + "aria-live": "off", + "aria-modal": "false", + "aria-multiline": "false", + "aria-multiselectable": "false", + "aria-orientation": undefined, + "aria-pressed": undefined, + "aria-readonly": "false", + //"aria-relevant": "additions text", TODO: are multiple values supported? + "aria-required": "false", + "aria-selected": undefined, + "aria-sort": "none" + }; + // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings + AriaUtil.ariaAttributeImplicitMappings = { + "aria-autocomplete": { + "form": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "input": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "select": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "textarea": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + } + }, + "aria-checked": { + "input": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "menuitem": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "*": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + }, + }, + "aria-disabled": { + "button": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "fieldset": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "input": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "optgroup": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "option": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "select": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "textarea": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + } + }, + "aria-expanded": { + "details": function (e) { + return e.getAttribute("open"); + }, + "dialog": function (e) { + return e.getAttribute("open"); + } + }, + "aria-multiselectable": { + "select": function (e) { + if (e.hasAttribute("multiple")) + return "true"; + return; + } + }, + "aria-placeholder": { + "input": function (e) { + return e.getAttribute("placeholder"); + }, + "textarea": function (e) { + return e.getAttribute("placeholder"); + } + }, + "aria-required": { + "input": function (e) { + return e.getAttribute("required"); + }, + "select": function (e) { + return e.getAttribute("required"); + }, + "textarea": function (e) { + return e.getAttribute("required"); + } + } + }; + return AriaUtil; +}()); +exports.AriaUtil = AriaUtil; + + +/***/ }, + +/***/ "./src/v4/util/CSSUtil.ts" +/*!********************************!*\ + !*** ./src/v4/util/CSSUtil.ts ***! + \********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CSSUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil = /** @class */ (function () { + function CSSUtil() { + } + CSSUtil.selectorMatchesElem = function (element, selector) { + // Early return for empty selector (before try-catch for performance) + if (!selector || selector.length === 0 || selector.trim() === "") + return false; + try { + // Modern standard method + if (typeof element.matches === "function") { + return element.matches(selector); + } + // Vendor-prefixed fallbacks (older browsers) + if (typeof element.webkitMatchesSelector === "function") { + return element.webkitMatchesSelector(selector); + } + if (typeof element.msMatchesSelector === "function") { + return element.msMatchesSelector(selector); + } + // Legacy method (deprecated but kept for compatibility) + if (typeof element.matchesSelector === "function") { + return element.matchesSelector(selector); + } + // Fallback: use querySelectorAll and check if element is in results + var doc = element.ownerDocument || element.document; + if (!doc) + return false; + var matches = doc.querySelectorAll(selector); + // Use Array.from for better performance with modern engines + return Array.from(matches).includes(element); + } + catch (err) { + // Bad selector? Doesn't match then... + return false; + } + }; + /** + * Returns the style computed for this element + * @param elem + */ + CSSUtil.getComputedStyle = function (elem, pseudoElt) { + if (!elem) + return null; + var doc = elem.ownerDocument; + var win = doc.defaultView; + return win.getComputedStyle(elem, pseudoElt); + }; + /** + * Parse and cache all stylesheet rules at the document level + * Returns an array of parsed rule objects with selector and style information + */ + CSSUtil.getParsedStylesheetRules = function (ownerDoc) { + // Check if we already have cached parsed rules for this document + var cachedRules = CacheUtil_1.CacheUtil.getCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", null); + if (cachedRules) { + return cachedRules; + } + var parsedRules = []; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < ownerDoc.styleSheets.length; ++ssIndex) { + var sheet = ownerDoc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var rule = sheet.cssRules[rIndex]; + var fullRuleSelector = rule.selectorText; + if (fullRuleSelector) { + var pseudoMatch = fullRuleSelector.match(/^(.*)(:[a-zA-Z-]*)$/); + var hasPseudoClass = !!pseudoMatch; + var selMain = hasPseudoClass ? pseudoMatch[1] : fullRuleSelector; + var selPseudo = hasPseudoClass ? pseudoMatch[2] : ""; + parsedRules.push({ + fullRuleSelector: fullRuleSelector, + hasPseudoClass: hasPseudoClass, + selMain: selMain, + selPseudo: selPseudo, + style: rule.style + }); + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the parsed rules at the document level + CacheUtil_1.CacheUtil.setCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", parsedRules); + return parsedRules; + }; + /** + * Private helper method to fill style maps from a CSSStyleDeclaration + * Handles CSS property priorities and the "all" shorthand property + */ + CSSUtil.fillStyle = function (maps, style) { + for (var sIndex = 0; sIndex < style.length; ++sIndex) { + if (style[sIndex] === "all" && style[style[sIndex]]) { + for (var _i = 0, maps_1 = maps; _i < maps_1.length; _i++) { + var map = maps_1[_i]; + for (var key in map) { + delete map[key]; + } + } + break; + } + else { + var key = style[sIndex]; + for (var _a = 0, maps_2 = maps; _a < maps_2.length; _a++) { + var map = maps_2[_a]; + var priority = style.getPropertyPriority(key); + if (key in map && map[key].endsWith("!important")) { + if (priority === "important" && + !map[key].startsWith("inherit") && + !map[key].startsWith("unset")) + map[key] = style[key] + " !important"; + else + continue; + } + else + map[key] = + style[key] + + (priority === "important" ? " !important" : ""); + } + } + } + }; + /** + * Private helper method that consolidates the logic for getting defined styles + * Used by both getDefinedStyles and getDefinedStylesMultiple + */ + CSSUtil.getDefinedStylesInternal = function (elem, props, pseudoClasses) { + var results = {}; + var definedStylesMap = {}; + var definedStylePseudoMap = {}; + // Initialize result objects for all pseudo-classes + for (var _i = 0, pseudoClasses_1 = pseudoClasses; _i < pseudoClasses_1.length; _i++) { + var pseudoClass = pseudoClasses_1[_i]; + definedStylesMap[pseudoClass] = {}; + definedStylePseudoMap[pseudoClass] = {}; + } + // Get pre-parsed stylesheet rules from cache + var parsedRules = CSSUtil.getParsedStylesheetRules(elem.ownerDocument); + // Check once if we need to handle :focus pseudo-class + var hasFocusPseudo = pseudoClasses.includes(":focus"); + var _loop_1 = function (parsedRule) { + if (props !== null && !props.some(function (prop) { return !!parsedRule.style[prop]; })) { + return "continue"; + } + var selPseudo = parsedRule.selPseudo; + var hasPseudoClass = parsedRule.hasPseudoClass; + // Handle :focus-within replacement once per rule if needed + var selMain = parsedRule.selMain; + if (hasFocusPseudo && selPseudo === ":focus") { + // If this element has focus, remove focus-within from parents + selMain = selMain.replace(/([ >][^+~ >]+):focus-within/g, "$1"); + } + // Cache selector matching result (only once per rule, not per pseudo-class) + var selectorMatches = CSSUtil.selectorMatchesElem(elem, selMain); + // Only process if selector matches + if (selectorMatches) { + // Process for each pseudo-class + for (var _c = 0, pseudoClasses_3 = pseudoClasses; _c < pseudoClasses_3.length; _c++) { + var pseudoClass = pseudoClasses_3[_c]; + // Cache map references to avoid repeated lookups + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Get styles of non-pseudo selectors + if (!hasPseudoClass) { + CSSUtil.fillStyle([styleMap, pseudoMap], parsedRule.style); + } + // Get styles for matching pseudo-class + if (selPseudo === pseudoClass) { + CSSUtil.fillStyle([pseudoMap], parsedRule.style); + } + } + } + }; + // Process each cached rule + for (var _a = 0, parsedRules_1 = parsedRules; _a < parsedRules_1.length; _a++) { + var parsedRule = parsedRules_1[_a]; + _loop_1(parsedRule); + } + // Handle element styles and build results in one pass + for (var _b = 0, pseudoClasses_2 = pseudoClasses; _b < pseudoClasses_2.length; _b++) { + var pseudoClass = pseudoClasses_2[_b]; + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Add element's inline styles + CSSUtil.fillStyle([styleMap, pseudoMap], elem.style); + // Build results + if (pseudoClass === "") { + results[pseudoClass] = styleMap; + } + else { + // For pseudo-classes, return only styles that differ from default + var diffStyles = {}; + var keys = Object.keys(pseudoMap); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (pseudoMap[key] !== styleMap[key]) { + diffStyles[key] = pseudoMap[key]; + } + } + results[pseudoClass] = diffStyles; + } + } + return results; + }; + /** + * Returns the style defined for this element for multiple pseudo-classes in a single pass + * + * This is more efficient than calling getDefinedStyles multiple times as it only + * iterates through stylesheets once. + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string[]} pseudoClasses - Array of pseudo-classes to retrieve. Use "" for default (no pseudo-class). + * @returns {Object} Object mapping each pseudo-class to its defined styles + */ + CSSUtil.getDefinedStylesMultiple = function (elem, props, pseudoClasses) { + if (!elem) + return null; + var results = {}; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + // Check cache first - see if we have all requested pseudo-classes cached + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + var missingPseudoClasses = []; + if (cachedStyles) { + // Check which pseudo-classes are already cached + for (var _i = 0, pseudoClasses_4 = pseudoClasses; _i < pseudoClasses_4.length; _i++) { + var pseudoClass = pseudoClasses_4[_i]; + if (cachedStyles[pseudoClass] !== undefined) { + results[pseudoClass] = cachedStyles[pseudoClass]; + } + else { + missingPseudoClasses.push(pseudoClass); + } + } + // If all are cached, return immediately + if (missingPseudoClasses.length === 0) { + return results; + } + } + else { + cachedStyles = {}; + missingPseudoClasses = pseudoClasses; + } + // Only process missing pseudo-classes using the internal helper + if (missingPseudoClasses.length > 0) { + var newResults = CSSUtil.getDefinedStylesInternal(elem, props, missingPseudoClasses); + // Merge new results with cached results + for (var _a = 0, missingPseudoClasses_1 = missingPseudoClasses; _a < missingPseudoClasses_1.length; _a++) { + var pseudoClass = missingPseudoClasses_1[_a]; + results[pseudoClass] = newResults[pseudoClass]; + cachedStyles[pseudoClass] = newResults[pseudoClass]; + } + // Update cache with all styles (existing + new) + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + } + return results; + }; + /** + * Returns the style defined for this element + * + * This differs from the computed style in that the computed style will return + * styles defined by the user agent. This will only return styles defined by the + * application + * if rotation transform is used, the computed style returns the resolved matrix + * while the defined style return the transform function(s) + * for example, for 'transform: rotate(2.5deg);', the computed style returns 'matrix(-0.0436194, 0.999048, -0.999048, -0.0436194, 0, 0)' + * and the defined style returns 'rotate(2.5deg)' + * + * change the type of the parameter pseudoClass from PseudoClass to string to include both pseudo classes (e.g., :focus, :checked) + * and pseudo elements (e.g., ::before, ::after). + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string} [pseudoClass] If specified, will return values that are different + * than when the pseudoClass does not match. + */ + CSSUtil.getDefinedStyles = function (elem, props, pseudoClass) { + if (!elem) + return null; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + var pseudoKey = pseudoClass || ""; + // Check cache first - use shared cache structure with getDefinedStylesMultiple + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + if (!cachedStyles) { + cachedStyles = {}; + } + if (cachedStyles[pseudoKey] !== undefined) { + return cachedStyles[pseudoKey]; + } + // Use the internal helper method with a single pseudo-class + var results = CSSUtil.getDefinedStylesInternal(elem, props, [pseudoKey]); + var result = results[pseudoKey]; + // Cache the result + cachedStyles[pseudoKey] = result; + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + return result; + }; + /** + * Returns the media query defined for the document + * Get media orientation transforms from stylesheets with caching + * Returns transform/rotate properties for elements within media queries + * + * @param {Document} doc + */ + CSSUtil.getMediaOrientationTransform = function (doc) { + // Check if we already have cached media orientation transforms for this document + var cachedTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MediaOrientationTransforms", null); + if (cachedTransforms) { + return cachedTransforms; + } + var orientationTransforms = {}; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < doc.styleSheets.length; ++ssIndex) { + var sheet = doc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var sheetRule = sheet.cssRules[rIndex]; + if (4 /* CSSRule.MEDIA_RULE */ === sheetRule.MEDIA_RULE) { + var rule = sheetRule; + if (rule && rule.media) { + var mediaList = rule.media; + for (var i = 0; i < mediaList.length; i++) { + if (!mediaList.item(i)) + continue; + var mediaKey = mediaList.item(i).toLocaleLowerCase(); + var elem_transforms = orientationTransforms[mediaKey]; + if (!elem_transforms) + elem_transforms = {}; + var styleRules = rule.cssRules; + for (var j = 0; j < styleRules.length; ++j) { + if (1 /* CSSRule.STYLE_RULE */ === styleRules[j].STYLE_RULE) { + var styleRule = styleRules[j]; + var selector = styleRule.selectorText; + if (selector) { + var transforms = {}; + var styles = styleRule.style; + for (var s = 0; s < styles.length; ++s) { + var key = styles[s]; + var keyLower = key.toLocaleLowerCase(); + if (keyLower === "transform") { + if (key === "all" && styles[key]) { + transforms = {}; + break; + } + else { + transforms[key] = styles[key]; + } + } + else if (keyLower === "rotate") { + transforms[key] = styles[key]; + } + } + if (Object.keys(transforms).length > 0) { + elem_transforms[selector] = transforms; + } + } + } + } + if (Object.keys(elem_transforms).length > 0) { + orientationTransforms[mediaKey] = elem_transforms; + } + } + } + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the media orientation transforms at the document level + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MediaOrientationTransforms", orientationTransforms); + return orientationTransforms; + }; + /** + * convert given rotation transform functions to the degree transformed. + * If multiple functions are given, then the functions are applied linearly in the order. + * rotation_transform function example: rotate(45deg), rotate(2turn), rotate(2rad), rotate3d(1, 1, 1, 45deg), + * rotate(2rad) rotate3d(1, 1, 1, 45deg) + * @param rotation_transform + */ + CSSUtil.getRotationDegree = function (rotation_transform) { + var degree = 0; + try { + if (!rotation_transform) + return degree; + // normalize the rotation_transform + rotation_transform = rotation_transform.replaceAll(", ", ","); + var transform_functions = rotation_transform.split(" "); + for (var i = 0; i < transform_functions.length; i++) { + var transform_function = transform_functions[i].trim(); + if (transform_function === "") + continue; + if (transform_function.startsWith("rotate3d")) { + // example: rotate3d(1, 1, 1, 45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = void 0; + if (matrix) + values = matrix.split(","); + if (values && values.length === 4) { + var rotation = values[3]; + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + } + else if (transform_function.startsWith("rotate") || + transform_function.startsWith("rotateZ")) { + // example: rotate(45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var rotation = transform_function.substring(left + 1, right); + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + else if (transform_function.startsWith("matrix3d")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[4], values[5]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + else if (transform_function.startsWith("matrix")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[1], values[0]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + } + while (degree >= 360) + degree -= 360; + } + catch (err) { + console.log("Cannot retrieve rotation degree: " + err); + throw err; + } + return degree; + }; + /** + * Convert CSS style string values to pixels. + * + * @param value style value in string, such as 3rem, 230px etc. + * @param target element. + * @return value in pixels + */ + CSSUtil.getPixelsFromStyle = function (value, elem) { + if (!value) + return 0; + var regex = /(-?[\d.]+)([a-z%]*)/; + var parsed = value.trim().match(regex); + if (parsed === null) + return 0; + if (parsed[2] === "" || parsed[1] === 0) + //no zero value without unit which is considered as error, so implicable + return 0; + var pixels = CSSUtil.convertValue2Pixels(parsed[2], parsed[1], elem); + return pixels === null ? pixels : parseFloat(pixels); + }; + /** + * Convert absolute CSS numerical values to pixels. + * + * @param unitValue in string + * @param target element. + * @return value in pixels + */ + CSSUtil.convertValue2Pixels = function (unit, unitValue, elem) { + if (unitValue === 0) + return 0; + if (!unit) + unit = "px"; + var supportedUnits = { + // absolute unit + px: function (value) { return value; }, + cm: function (value) { return value * 37.8; }, + mm: function (value) { return value * 3.78; }, + q: function (value) { return value * 0.95; }, + in: function (value) { return value * 96; }, + pc: function (value) { return value * 16; }, + pt: function (value) { return value * 1.33; }, + // relative unit + rem: function (value) { + return value * + parseFloat(getComputedStyle(elem.ownerDocument.documentElement).getPropertyValue("font-size")); + }, + em: function (value) { + return value * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + vw: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerWidth; + }, + vh: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerHeight; + }, + "%": function (value) { + return (value / 100) * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + }; + if (unit in supportedUnits) + return supportedUnits[unit](unitValue); + return null; + }; + /* + * Returns if the font for visible text of the element is defined by material icons + * + * @param {HTMLElement} elem + */ + CSSUtil.isMaterialIconFont = function (elem) { + // TODO: check the existence material icons using fetch in node 18+ + // for now (node 16) just dertermine if the stylesheet for the 'Material Icons' exists statically. note that the loading of the font stylesheet occurs at run time. + //list of known material icons and stylesheet link + var known_icons = { + "Material Icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + var known_css_classes = { + "material-icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + // material icon font can be defined either by font-family: 'Material Icons' or by class="material-icons" + var styles = CSSUtil.getDefinedStyles(elem, ["font-family"]); + var fontFamily = styles["font-family"]; + var found = false; + // font-family specifies a prioritized list of one or more font family names + if (fontFamily && + fontFamily.split(",")[0].replace(/['"]+/g, "").trim() in known_icons) + found = true; + if (!found) { + var list = elem.classList; + for (var css_class in known_css_classes) { + if (list.contains(css_class)) { + found = true; + break; + } + } + } + if (!found) + return false; + var passed = false; + // check if the stylesheet for the 'Material Icons' exists statically + var sheets = elem.ownerDocument.styleSheets; + for (var s = 0; s < sheets.length; s++) { + if (sheets && + sheets.length > 0 && + Object.values(known_icons).indexOf(sheets[s].href) > -1) { + passed = true; + break; + } + } + return passed; + }; + CSSUtil.getWeightNumber = function (styleVal) { + var map = { + light: 100, + bold: 700, + }; + var retVal = parseInt(styleVal); + if (retVal) + return retVal; + if (styleVal in map) + return map[styleVal]; + return 400; + }; + CSSUtil.getFontInPixels = function (styleVal, elem) { + var map = { + "xx-small": 16, + "x-small": 10, + small: 13, + medium: 16, + large: 18, + "x-large": 24, + "xx-large": 32, + }; + var value = parseFloat(styleVal); + if (!value) { + return map[styleVal]; + } + var units = styleVal.substring(("" + value).length); + /** + if (units === "" || units === "px") return value; + if (units === "em") return value * 16; + if (units === "%") return value / 100 * 16; + if (units === "pt") return value * 4 / 3; + return Math.round(value); + */ + return CSSUtil.convertValue2Pixels(units, value, elem); + }; + CSSUtil.getCSSStyle = function (element) { + var styleText = ""; + if (element === null) + return []; + if (element.IBM_CSS_THB) + return element.IBM_CSS_THB; + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === "style") { + styleText = element.innerText; + if (styleText === undefined || styleText.trim() === "") + styleText = element.textContent; + } + else if (element.hasAttribute("style")) { + styleText = element.getAttribute("style"); + } + else + return []; + if (styleText === null || styleText.trim().length === 0) + return []; + //remove comment blocks + var re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g; + var subst = " "; + styleText = styleText.replace(re, subst); + // Find all "key : val;" pairs with various whitespace inbetween + var rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g; + // Find all "selector { csskeyvals } with various whitespace inbetween + var rSelectors = /\s*([^{]*){([^}]*)}/g; + if (styleText.indexOf("{") === -1) { + var keyVals = {}; + var m = void 0; + while ((m = rKeyVals.exec(styleText)) != null) { + keyVals[m[1]] = m[2].trim().toLowerCase(); + } + var retVal = [ + { + selector: null, + values: keyVals, + }, + ]; + element.IBM_CSS_THB = retVal; + return retVal; + } + else { + var retVal = []; + var m = void 0; + var m2 = void 0; + while ((m = rSelectors.exec(styleText)) != null) { + var keyVals = {}; + var selKey = m[1]; + var selVal = m[2]; + while ((m2 = rKeyVals.exec(selVal)) != null) { + keyVals[m2[1]] = m2[2].trim().toLowerCase(); + } + retVal.push({ + selector: selKey, + values: keyVals, + }); + } + element.IBM_CSS_THB = retVal; + return retVal; + } + }; + /** + * an "inline" CSS display property tells the element to fit itself on the same line. An 'inline' element's width and height are ignored. + * some element has default inline property, such as <span>, <a> + * most formatting elements inherent inline property, such as <em>, <strong>, <i>, <small> + * other inline elements: <abbr> <acronym> <b> <bdo> <big> <br> <cite> <code> <dfn> <em> <i> <input> <kbd> <label> + * <map> <object> <output> <q> <samp> <script> <select> <small> <span> <strong> <sub> <sup> <textarea> <time> <tt> <var> + * an "inline-block" element still place element in the same line without breaking the line, but the element's width and height are applied. + * inline-block elements: img, button, select, meter, progress, marguee, also in Chrome: textarea, input + * A block-level element always starts on a new line, and the browsers automatically add some space (a margin) before and after the element. + * block-level elements: <address> <article> <aside> <blockquote> <canvas> <dd> <div> <dl> <dt> <fieldset> <figcaption> <figure> <footer> <form> + * <h1>-<h6> <header> <hr> <li> <main> <nav> <noscript> <ol> <p> <pre> <section> <table> <tfoot> <ul> <video> + * + * return: if it's inline element and { inline: true | false, text: true | false, violation: null | {node} } + */ + CSSUtil.getInlineStatus = function (element) { + if (!element) + return null; + var elem_styl = getComputedStyle(element); + if (!elem_styl) + return null; + var status = { inline: false, text: false, violation: null }; + var udisplay = elem_styl.getPropertyValue("display"); + // inline element only + if (udisplay !== "inline") + return status; + status.inline = true; + var parent = element.parentElement; + if (!parent) + return status; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(element); + var style = getComputedStyle(parent); + var display = style.getPropertyValue("display"); + // an inline element is inside a block. note <body> is a block element too + if (display !== "block" && display !== "inline-block") { + //parent is inline element + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(parent)) + status.text = true; + return status; + } + /** + * @returns "yes"": inline with text, "no": inline without text, + * "violation": not spacing enough to neiboring inline target + * "block": block element, + */ + function isInlineWithText(node, before) { + // note browsers insert Text nodes to represent whitespaces. + if (node.nodeType === Node.TEXT_NODE) { + if (node.nodeValue && node.nodeValue.trim().length > 0) + return "yes"; + else + return "no"; + } + else if (node.nodeType === Node.ELEMENT_NODE) { + // special case: <br> is styled 'inline' by default, but change the line + if (node.nodeName.toLowerCase() === "br") + return "block"; + var cStyle = getComputedStyle(node); + var cDisplay = cStyle.getPropertyValue("display"); + if (cDisplay === "inline") { + if (CommonUtil_1.CommonUtil.isTarget(node)) { + if (bounds.width < 24) { + // check if the horizontal spacing is sufficient + var bnds = mapper.getUnadjustedBounds(node); + if ((before && (Math.round(bounds.width / 2) + bounds.left - bnds.left < 24)) + || (!before && (Math.round(bounds.width / 2) + bounds.left - (bnds.left + bnds.width) < 24))) { + status.violation = node.nodeName.toLowerCase(); + return "violation"; + } + else + return "no"; + } + } + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(node)) + return "yes"; + return "no"; + } + else + return "block"; + } + else + return "block"; + } + // an inline element is inside a block. note <body> is a block element too + // one or more inline elements with text in the same line: <target>, text<target>, <target>text, <inline>+text<target>, <target><inline>+text, text<target><inline>+ + var walkNode = element.nextSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, true); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.nextSibling; + } + walkNode = element.previousSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, false); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.previousSibling; + } + return status; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * a target is a browser default if it's a native widget (no user defined role) without user style + */ + CSSUtil.isTargetBrowserDefault = function (element) { + if (!element) + return false; + // user defined widget + var roles = AriaUtil_1.AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) + return false; + // no user style to space control size, including use of font + var styles = CSSUtil.getDefinedStyles(element, [ + "line-height", "height", "width", "min-height", "min-width", + "font-size", "margin-top", "margin-bottom", "margin-left", "margin-right" + ]); + if (styles["line-height"] || + styles["height"] || + styles["width"] || + styles["min-height"] || + styles["min-width"] || + styles["font-size"] || + styles["margin-top"] || + styles["margin-bottom"] || + styles["margin-left"] || + styles["margin-right"]) + return false; + return true; + }; + /* + * string contains CJK (chinese, japaneses, or korea) + * return: boolean + */ + CSSUtil.containsCKJ = function (text) { + if (!text) + return false; + // https://en.wikipedia.org/wiki/CJK_Unified_Ideographs https://ayaka.shn.hk/hanregex/ + var regex = /(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g; + var replaced = text.trim().replace(regex, ""); + if (replaced.length === text.trim().length) + return false; + return true; + }; + /** + * Return the ancestor with the given style properties. + * Searches up the DOM tree to find an ancestor that has ALL specified style properties + * with values matching the criteria. + * + * @param {element} elem - The element to start the node walk on to find parent node + * @param {Object} styleProps - The style properties and values of the parent to search for. + * such as {"overflow":['auto', 'scroll'], "overflow-x":['auto', 'scroll']} + * or {"overflow":['*'], "overflow-x":['*']}, The '*' for any value to check the existence of the style prop. + * @param {Array} excludedValues - style values that should be ignored. + * @return {Element|null} - An ancestor element that has all the specified style properties, or null if none found + * @memberOf CSSUtil + */ + CSSUtil.getAncestorWithStyles = function (elem, styleProps, excludedValues) { + if (excludedValues === void 0) { excludedValues = []; } + // Create a cache key that includes the style properties being searched for + var cacheKey = "AriaUtil_AncestorWithStyles_" + JSON.stringify(styleProps) + "_" + JSON.stringify(excludedValues); + // Check if we already have a cached result for this specific query + var cachedResult = CacheUtil_1.CacheUtil.getCache(elem, cacheKey, null); + if (cachedResult !== null) { + return cachedResult === "NOT_FOUND" ? null : cachedResult; + } + // Start with the element itself (not just parent) to maintain backward compatibility + var walkNode = elem; + while (walkNode !== null) { + // Skip if not an HTMLElement (e.g., SVGElement) + // Use nodeType check instead of instanceof to work across different document contexts + if (walkNode.nodeType !== 1 || walkNode.namespaceURI === "http://www.w3.org/2000/svg") { + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + continue; + } + var styles = CSSUtil.getDefinedStyles(walkNode, Object.keys(styleProps)); + // Check if ANY specified style property matches the criteria (OR logic) + for (var styleProp in styleProps) { + var value = styles[styleProp]; + if (!value) { + // Property not defined on this element, try next property + continue; + } + // Remove !important suffix for comparison + value = value.split(" ")[0]; + // Check if value should be excluded + if (excludedValues.includes(value)) { + continue; + } + // Check if value matches the criteria + var acceptedValues = styleProps[styleProp]; + if (acceptedValues.includes('*')) { + // Any value is acceptable (just checking existence) + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + else if (acceptedValues.includes(value)) { + // Value matches one of the accepted values + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + } + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + // No matching element or ancestor found - cache this result to avoid re-searching + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, "NOT_FOUND"); + return null; + }; + /** + * return an array [value, Unit] from a value-unit combo string + * @param valueUnitCombo, such as 20px, 2rem + * @returns + */ + CSSUtil.getValueUnitPair = function (valueUnitCombo) { + if (!valueUnitCombo) + return null; + if (Number.isInteger(valueUnitCombo)) + return ["px", valueUnitCombo]; + var value = parseInt(valueUnitCombo); + if (isNaN(value)) + return null; + valueUnitCombo = valueUnitCombo.trim().toLowerCase(); + var match = valueUnitCombo.trim().match(/([a-z]+)$/); + var unit = 'px'; + if (match) + unit = match[1]; + return [unit, value]; + }; + return CSSUtil; +}()); +exports.CSSUtil = CSSUtil; + + +/***/ }, + +/***/ "./src/v4/util/CacheUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/CacheUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CacheUtil = void 0; +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil = /** @class */ (function () { + function CacheUtil() { + } + /* Return a pointer to the given global variable + * with its initial value as given */ + CacheUtil.getCache = function (cacheSpot, keyName, initValue) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined) { + cacheObj.aceCache[keyName] = initValue; + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.setCache = function (cacheSpot, globalName, value) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + cacheObj.aceCache[globalName] = value; + return value; + }; + CacheUtil.getSetCache = function (cacheSpot, keyName, initFunc) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined || typeof cacheObj.aceCache[keyName] === "undefined") { + cacheObj.aceCache[keyName] = initFunc(); + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.clearCaches = function (cacheRoot) { + var _a; + var numNodesVisited = 0; + delete cacheRoot.ownerDocument.aceCache; + var nw = new DOMWalker_1.DOMWalker(cacheRoot, false, cacheRoot, true); + do { + ++numNodesVisited; + delete nw.node.aceCache; + nw.node.ownerDocument && delete nw.node.ownerDocument.aceCache; + } while (nw.nextNode()); + if (cacheRoot !== ((_a = cacheRoot.ownerDocument) === null || _a === void 0 ? void 0 : _a.documentElement)) { + // Start the walker at the documentElement of cacheRoot's immediate document. + // ownerDocument is guaranteed non-null here because the if-guard above + // checks cacheRoot.ownerDocument?.documentElement. + var nwDoc = new DOMWalker_1.DOMWalker(cacheRoot.ownerDocument.documentElement, false, undefined, true); + // cacheRoot may be inside a shadow root or an iframe, which are themselves + // nested inside ancestor documents. Walk up from cacheRoot across any + // frame/shadow boundaries (DOMWalker.parentElement handles ownerElement + // links set by the walker) to find the outermost ancestor element, then + // reposition the walker there so the second pass covers every containing + // document as well. + { + var tempElem = nwDoc.node; + var parentElem = void 0; + while (parentElem = DOMWalker_1.DOMWalker.parentElement(tempElem)) { + tempElem = parentElem; + } + nwDoc.node = tempElem; + } + do { + // On the start-tag visit of cacheRoot, skip its entire subtree — + // it was already cleared and counted in the first pass above. + // Setting bEndTag=true makes the next nextNode() call emit cacheRoot's + // end-tag and then advance to its next sibling without descending into + // its children. + if (!nwDoc.bEndTag && DOMUtil_1.DOMUtil.sameNode(cacheRoot, nwDoc.node)) { + nwDoc.bEndTag = true; + continue; + } + delete nwDoc.node.aceCache; + nwDoc.node.ownerDocument && delete nwDoc.node.ownerDocument.aceCache; + } while (nwDoc.nextNode()); + } + return numNodesVisited; + }; + return CacheUtil; +}()); +exports.CacheUtil = CacheUtil; + + +/***/ }, + +/***/ "./src/v4/util/ClipPathUtil.ts" +/*!*************************************!*\ + !*** ./src/v4/util/ClipPathUtil.ts ***! + \*************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ClipPathUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ./CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ClipPathUtil = /** @class */ (function () { + function ClipPathUtil() { + } + /** + * This function is responsible for checking if the node that is visually hidden by css clip-path: + * + * Note 1: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note 2: nodes with CSS properties clip-path, the content is not considered hidden to an AT. Text hidden with these methods + * can still be reedable by screen readers. + * Note 3: if a link, form control, or other focusable element is given this style, the element would be focusable but not visible, + * keyboard users might be confused. + * + * @parm {Node} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + ClipPathUtil.isNodeVisuallyHiddenByClipPath = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", undefined); + if (hidden !== undefined) + return hidden; + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + var path = style['clip-path']; + if (!path || path.trim() === 'none' || path.trim() === '') { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + path = path.trim().replace(/\s+/g, ' ').toLowerCase(); + var index = path.indexOf("inset("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + // When one value is specified, it applies the same inset to all four sides + if (numbers.length === 1) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[0], numbers[0], numbers[0]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When two values are specified, the first value applies to the top and bottom, the second to the left and right. + if (numbers.length === 2) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[0], numbers[1]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When three values are specified, the first applies to the top, the second to the right and left, the third to the bottom. + if (numbers.length === 3) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[1], numbers[2]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When four values are specified, the values apply to the top, right, bottom, and left in that order (clockwise). + if (numbers.length === 4) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[2], numbers[3]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + } + index = path.indexOf("rect("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + /** + * The first (top) and third (bottom) values are distances from the top edge of the containing block, + * and the second (right) and fourth (left) values are distances from the left edge of the containing block. + * The second (right) and third (bottom) values are clamped by the fourth (left) and first (top) values, respectively, + * + * If auto is used for the first (top) or fourth (left) value, the value of auto is 0, + * and if used for the second (right) or third (bottom) value, the value of auto is 100%. + */ + if (numbers[0] === 'auto') + numbers[0] = '0px'; + if (numbers[3] === 'auto') + numbers[3] = '0px'; + if (numbers[1] === 'auto') + numbers[1] = '100%'; + if (numbers[2] === 'auto') + numbers[2] = '100%'; + // to prevent the bottom edge from crossing over the top edge and right edge from crossing over the left edge. + // for example, rect(10px 0 0 20px) is clamped to rect(10px 20px 10px 20px) + numbers[2] = Math.max(numbers[0], numbers[2]); + numbers[1] = Math.max(numbers[1], numbers[3]); + var top_1 = parseInt(numbers[0]); + if (isNaN(top_1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + top_1 = top_1 * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + top_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (top_1 >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var left = parseInt(numbers[3]); + if (isNaN(left)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + left = left * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + left = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (left >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var right = parseInt(numbers[1]); + if (isNaN(right)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + right = right * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + right = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + var bottom = parseInt(numbers[2]); + if (isNaN(bottom)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + bottom = bottom * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + bottom = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if ((bottom - top_1) <= ClipPathUtil.THRESHOLD || (right - left) <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("xywh("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + var x = parseInt(numbers[0]); + if (isNaN(x)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + x = x * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + x = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (x >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var y = parseInt(numbers[1]); + if (isNaN(y)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + y = y * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(y); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + scrollY = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (y >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var w = parseInt(numbers[2]); + if (isNaN(w)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + w = w * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(w); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + w = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (w <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + var h = parseInt(numbers[3]); + if (isNaN(h)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + h = h * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(h); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + h = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (h <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("circle("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + var radius = parseInt(numbers[0]); + if (isNaN(radius)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) { + var short = width > height ? height : width; + radius = radius * short / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("ellipse("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + // ellipse(closest-side farthest-side at 30% 40%); + if (numbers.length > 3 && numbers[0] === 'closest-side' && numbers[1] === 'farthest-side' && numbers[2] === 'at') { + var radius = parseInt(numbers[3]); + if (numbers.length === 4) { + if (numbers[3].endsWith("%")) { + var value = width > height ? height : width; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + else if (numbers.length === 5) { + for (var i = 3; i < numbers.length; i++) { + var radius_1 = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 3) ? width : height; + radius_1 = radius_1 * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius_1 <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + // ellipse(40% 50% at left); + var at_index = path.indexOf("at"); + str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (at_index !== -1) + str = path.substring(path.indexOf("(") + 1, at_index); + numbers = str.trim().split(" "); + if (numbers.length !== 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + for (var i = 0; i < numbers.length; i++) { + var radius = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 0) ? width : height; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("polygon("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(","); + // polygon(nonzero|evenodd, 0% 0%, 50% 50%, 0% 100%) + if (numbers[0] === 'nonzero' || numbers[0] === 'evenodd') + numbers.shift(); + var y = 0; + var x = 0; + var changed_x = false; + var changed_y = false; + for (var i = 0; i < numbers.length; i++) { + var coordinates = numbers[i].trim().split(" "); + if (coordinates.length != 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var coordinate_xy = [0, 0]; + for (var i_1 = 0; i_1 < 2; i_1++) { + var value = parseInt(coordinates[i_1]); + if (isNaN(value)) + return false; + if (coordinates[i_1].endsWith("%")) + coordinate_xy[i_1] = (i_1 === 0) ? value * width / 100 : value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(coordinates[i_1]); + if (!pair) + return false; + coordinate_xy[i_1] = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + } + if (i === 0) { + x = coordinate_xy[0]; + y = coordinate_xy[1]; + } + if (Math.abs(coordinate_xy[0] - x) >= ClipPathUtil.THRESHOLD) + changed_x = true; + if (Math.abs(coordinate_xy[1] - y) >= ClipPathUtil.THRESHOLD) + changed_y = true; + } + if (changed_x && changed_y) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + }; + ClipPathUtil.isClippedByInset = function (elem, top, right, bottom, left) { + if (right === void 0) { right = '0px'; } + if (bottom === void 0) { bottom = '0px'; } + if (left === void 0) { left = '0px'; } + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + // top + var top_value = parseInt(top); + if (isNaN(top_value)) + return false; + if (top.endsWith("%")) + top_value = top_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) + return false; + top_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (top_value > height) + return false; + // right + var right_value = parseInt(right); + if (isNaN(right_value)) + return false; + if (right.endsWith("%")) + right_value = right_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) + return false; + right_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (right_value > width) + return false; + // bottom + var bottom_value = parseInt(bottom); + if (isNaN(bottom_value)) + return false; + if (bottom.endsWith("%")) + bottom_value = bottom_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) + return false; + bottom_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (bottom_value > height) + return false; + // left + var left_value = parseInt(left); + if (isNaN(left_value)) + return false; + if (left.endsWith("%")) + left_value = left_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) + return false; + left_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (left_value > width) + return false; + if (height - (top_value + bottom_value) <= ClipPathUtil.THRESHOLD || width - (right_value + left_value) <= ClipPathUtil.THRESHOLD) + return true; + return false; + }; + ClipPathUtil.THRESHOLD = 5; // 5px + return ClipPathUtil; +}()); +exports.ClipPathUtil = ClipPathUtil; + + +/***/ }, + +/***/ "./src/v4/util/ColorUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/ColorUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ColorObj = exports.ColorUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var ColorUtil = /** @class */ (function () { + function ColorUtil() { + } + // Rewrite the color object to account for alpha + ColorUtil.Color = function (cssStyleColor) { + if (!cssStyleColor) + return null; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor === "transparent") + return new ColorObj(255, 255, 255, 0); + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3]); + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3], m[4]); + } + } + else if (cssStyleColor.charAt(0) != "#") { + return null; + } + else { + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + var thisRed = parseInt(cssStyleColor.substring(1, 3), 16); + var thisGreen = parseInt(cssStyleColor.substring(3, 5), 16); + var thisBlue = parseInt(cssStyleColor.substring(5, 7), 16); + return new ColorObj(thisRed, thisGreen, thisBlue); + } + // return null; // Unreachable + }; + ; + ColorUtil.ColorCombo = function (ruleContext) { + try { + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + var ancestors = []; + var walkNode = ruleContext; + while (walkNode) { + if (walkNode.nodeType === 1) + ancestors.push(walkNode); + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + var retVal = { + "hasGradient": false, + "hasBGImage": false, + "textShadow": false, + "fg": null, + "bg": null + }; + // start + var cStyle = win.getComputedStyle(ruleContext); + var compStyleColor = cStyle.color; + if (!compStyleColor) + compStyleColor = "black"; + var fg = ColorUtil.Color(compStyleColor); + var reColor = /transparent|rgba?\([^)]+\)/gi; + var guessGradColor = function (gradList, bgColor, fgColor) { + try { + // If there's only one color, return that + if (typeof gradList.length === "undefined") + return gradList; + var overallWorst = null; + var overallWorstRatio = null; + for (var iGrad = 1; iGrad < gradList.length; ++iGrad) { + var worstColor = gradList[iGrad - 1]; + var worstRatio = fgColor.contrastRatio(gradList[iGrad - 1]); + var step = .1; + var idx = 0; + while (step > .0001) { + while (idx + step <= 1 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx + step; + } + while (idx - step >= 0 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx - step; + } + step = step / 10; + } + if (overallWorstRatio === null || overallWorstRatio > worstRatio) { + overallWorstRatio = worstRatio; + overallWorst = worstColor; + } + } + return overallWorst; // return the darkest color + } + catch (e) { + console.log(e); + } + return bgColor; + }; + var priorStackBG = ColorUtil.Color("white"); + var thisStackOpacity = null; + var thisStackAlpha = null; + var thisStackBG = null; + // Ancestors processed from the topmost parent toward the child + while (ancestors.length > 0) { + var procNext = ancestors.pop(); + //var procNext = ancestors.splice(0, 1)[0]; + // cStyle is the computed style of this layer + var cStyle = win.getComputedStyle(procNext); + if (cStyle === null) + continue; + // thisBgColor is the color of this layer or null if the layer is transparent + var thisBgColor = null; + if (cStyle.backgroundColor && cStyle.backgroundColor != "transparent" && cStyle.backgroundColor != "rgba(0, 0, 0, 0)") { + thisBgColor = ColorUtil.Color(cStyle.backgroundColor); + } + // If there is a gradient involved, set thisBgColor to the worst color combination available against the foreground + if (cStyle.backgroundImage && cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + var gradColors = cStyle.backgroundImage.match(reColor); + if (gradColors) { + var gradColorComp = []; + for (var i = 0; i < gradColors.length; ++i) { + if (!gradColors[i].length) { + gradColors.splice(i--, 1); + } + else { + var colorComp = ColorUtil.Color(gradColors[i]); + if (colorComp.alpha !== undefined && colorComp.alpha < 1) { + // mix the grdient bg color wit parent bg if alpha < 1 + var compStackBg = thisStackBG || priorStackBG; + colorComp = colorComp.getOverlayColor(compStackBg); + } + gradColorComp.push(colorComp); + } + } + thisBgColor = guessGradColor(gradColorComp, thisStackBG || priorStackBG, fg); + } + } + // Handle non-solid opacity + if (thisStackOpacity === null || (cStyle.opacity && cStyle.opacity.length > 0 && parseFloat(cStyle.opacity) < 1)) { + // New stack, reset + if (thisStackBG != null) { + // Overlay + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + thisStackOpacity = 1.0; + thisStackAlpha = null; + thisStackBG = null; + if (cStyle.opacity && cStyle.opacity.length > 0) { + thisStackOpacity = parseFloat(cStyle.opacity); + } + if (thisBgColor != null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0) { + retVal.hasBGImage = false; + retVal.hasGradient = false; + } + } + } + // Handle solid color backgrounds and gradient color backgrounds + else if (thisBgColor != null) { + // If this stack already has a background color, blend it + if (thisStackBG === null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + } + else { + thisStackBG = thisBgColor.getOverlayColor(thisStackBG); + //thisStackAlpha = thisBgColor.alpha || 1.0; + thisStackAlpha = thisStackBG.alpha || 1.0; + } + // #526: If thisBgColor had an alpha value, it may not expose through thisStackBG in the above code + // We can't wipe out the gradient info if this layer was transparent + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0 && (thisStackBG.alpha || 1.0) === 1.0 && (thisBgColor.alpha || 1.0) === 0) // removed by dead control flow +{} + } + if (cStyle.backgroundImage && cStyle.backgroundImage != "none") { + if (cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + retVal.hasGradient = true; + } + else { + retVal.hasBGImage = true; + } + } + } + if (thisStackBG != null) { + fg = fg.getOverlayColor(thisStackBG); + delete fg.alpha; + } + fg.alpha = (fg.alpha || 1) * thisStackOpacity; + fg = fg.getOverlayColor(priorStackBG); + if (thisStackBG != null) { + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + retVal.fg = fg; + retVal.bg = priorStackBG; + if (cStyle.textShadow && cStyle.textShadow !== 'none') + retVal.textShadow = true; + return retVal; + } + catch (err) { + // something happened, then... + return null; + } + }; + ; + ColorUtil.CSSColorLookup = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", + "buttontext": "rgba(0, 0, 0, 0.847)", + "buttonface": "#ffffff", + "graytext": "rgba(0, 0, 0, 0.247)" + }; + return ColorUtil; +}()); +exports.ColorUtil = ColorUtil; +var ColorObj = /** @class */ (function () { + function ColorObj(red, green, blue, alpha) { + function fixComponent(comp) { + if (typeof (comp) != typeof ("")) + return comp; + var compStr = comp; + compStr = compStr.trim(); + if (compStr[compStr.length - 1] != "%") + return parseInt(compStr); + return Math.round(parseFloat(compStr.substring(0, compStr.length - 1)) * 2.55); + } + this.red = fixComponent(red); + this.green = fixComponent(green); + this.blue = fixComponent(blue); + if (typeof (alpha) != "undefined") { + this.alpha = (typeof (alpha) === typeof ("")) ? parseFloat(alpha) : alpha; + } + } + ColorObj.prototype.toHexHelp = function (value) { + var retVal = Math.round(value).toString(16); + if (retVal.length === 1) + return "0" + retVal; + return retVal; + }; + ; + ColorObj.prototype.toHex = function () { + return "#" + this.toHexHelp(this.red) + this.toHexHelp(this.green) + this.toHexHelp(this.blue); + }; + ; + ColorObj.prototype.contrastRatio = function (bgColor) { + var fgColor = this; + if (typeof (this.alpha) != "undefined") + fgColor = this.getOverlayColor(bgColor); + var lum1 = fgColor.relativeLuminance(); + if (!bgColor.relativeLuminance) { + var s = ""; + for (var key in bgColor) { + s += key + "\n"; + } + alert(bgColor); + alert(s); + } + var lum2 = bgColor.relativeLuminance(); + var ratio = (lum1 > lum2) ? (lum1 + .05) / (lum2 + .05) : (lum2 + .05) / (lum1 + .05); + return ratio; + }; + ; + ColorObj.prototype.relativeLuminance = function () { + var R = this.red / 255.0; + var G = this.green / 255.0; + var B = this.blue / 255.0; + R = R <= .04045 ? R / 12.92 : Math.pow((R + .055) / 1.055, 2.4); + G = G <= .04045 ? G / 12.92 : Math.pow((G + .055) / 1.055, 2.4); + B = B <= .04045 ? B / 12.92 : Math.pow((B + .055) / 1.055, 2.4); + return 0.2126 * R + 0.7152 * G + 0.0722 * B; + }; + ; + ColorObj.prototype.mix = function (color2, percThis) { + if (typeof (this.alpha) === "undefined" && typeof (color2.alpha) === "undefined") { + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue); + } + else { + var alphaThis = this.alpha ? this.alpha : 1; + var alphaOther = color2.alpha ? color2.alpha : 1; + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue, percThis * alphaThis + (1 - percThis) * alphaOther); + } + }; + ; + ColorObj.prototype.getOverlayColor = function (bgColor) { + if (typeof (this.alpha) === "undefined" || this.alpha >= 1) { + // No mixing required - it's opaque + return this; + } + if (this.alpha < 0) { + // Haac.Error.logError("Invalid alpha value"); + return null; + } + if (typeof (bgColor.alpha) != "undefined" && bgColor.alpha < 1) { + // Haac.Error.logError("Cannot mix with a background alpha"); + return null; + } + var retVal = this.mix(bgColor, this.alpha); + delete retVal.alpha; + return retVal; + }; + ColorObj.fromCSSColor = function (cssStyleColor) { + var thisRed = -1; + var thisGreen = -1; + var thisBlue = -1; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else { + if (cssStyleColor.charAt(0) != "#") { + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + else + return null; + } + var fromHex = function (val) { + var lookup = { + "a": 10, + "b": 11, + "c": 12, + "d": 13, + "e": 14, + "f": 15 + }; + var retVal = 0; + for (var i = 0; i < val.length; ++i) { + retVal = retVal * 16 + + parseInt(val.charAt(i) in lookup ? lookup[val.charAt(i)] : val.charAt(i)); + } + return retVal; + }; + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + thisRed = fromHex(cssStyleColor.substring(1, 3)); + thisGreen = fromHex(cssStyleColor.substring(3, 5)); + thisBlue = fromHex(cssStyleColor.substring(5, 7)); + } + return new ColorObj(thisRed, thisGreen, thisBlue); + }; + return ColorObj; +}()); +exports.ColorObj = ColorObj; + + +/***/ }, + +/***/ "./src/v4/util/CommonUtil.ts" +/*!***********************************!*\ + !*** ./src/v4/util/CommonUtil.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ./AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil = /** @class */ (function () { + function CommonUtil() { + } + CommonUtil.wordCount = function (str) { + str = str.trim(); + if (str.length === 0) + return 0; + return str.split(/\s+/g).length; + }; + /** + * Note that this only detects if the element itself is in the tab order. + * However, this element may delegate focus to another element via aria-activedescendant. + * Also, focus varies by browser... sticking to things that are focusable on Chrome and Firefox. + */ + CommonUtil.isTabbable = function (element) { + // Using https://allyjs.io/data-tables/focusable.html + // Handle the explicit cases first + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + if (element.hasAttribute("inert") || DOMUtil_1.DOMUtil.getAncestorWithAttribute(element, "inert", "")) + return false; + if (element.hasAttribute("tabindex")) { + return parseInt(element.getAttribute("tabindex")) >= 0; + } + // Explicit cases handled - now the implicit + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + var ce = element.getAttribute("contenteditable"); + if (ce === "true" || ce === "") + return true; + return false; + } + }; + /** + * Test if the ele node is focusable + */ + CommonUtil.isFocusable = function (ele) { + if (ele === "undefined" || ele === null) { + return false; + } + return CommonUtil.isTabbable(ele); + }; + /** + * Note that this only detects if the element itself is interactive, but not onclick event. + */ + CommonUtil.isClickable = function (element) { + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + // native focusable element + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + //custom widget + if (AriaUtil_1.AriaUtil.isWidget(element) && element.hasAttribute("tabindex")) { + return true; + } + } + return false; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + CommonUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + CommonUtil.tabIndexLEZero = function (elem) { + if (CommonUtil.hasAttribute(elem, "tabindex")) { + if (elem.getAttribute("tabindex").match(/^-?\d+$/)) { + var tabindexValue = parseInt(elem.getAttribute("tabindex")); + return tabindexValue === 0 || tabindexValue === -1; + } + } + return false; + }; + /** + * get number of tabbable children + * @param element + */ + CommonUtil.getTabbableChildren = function (element) { + var count = 0; + // If node has children, look for tab stops in the children + if (element.firstChild || element.nodeName.toUpperCase() === "IFRAME") { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode() && nw.node != element) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + return count; + }; + CommonUtil.normalizeSpacing = function (s) { + if (!s) + return ''; + return s.trim().replace(/\s+/g, ' '); + }; + ; + //TODO: function does not handle equivalents for roles: row, link, header, button + // But it may not have to. Bug reports have been about radio buttons and checkboxes. + CommonUtil.isHtmlEquiv = function (node, htmlEquiv) { + var retVal = false; + if (node) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = node.getAttribute("type").toLowerCase(); + if (type) { + if (htmlEquiv.indexOf("checkbox") != -1) { + retVal = type === "checkbox"; + } + else if (htmlEquiv.indexOf("radio") != -1) { + retVal = type === "radio"; + } + } + } + } + return retVal; + }; + CommonUtil.nonExistantIDs = function (node, targetids) { + var returnnotfoundids = ''; + if (CommonUtil.normalizeSpacing(targetids).length < 1) + return returnnotfoundids; + var targetArray = targetids.split(" "); + var doc = node.ownerDocument; + for (var i = 0; i < targetArray.length; i++) { + var xp = "//*[@id='" + targetArray[i] + "']"; + var xpathResult = doc.evaluate(xp, node, doc.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + if (!r) + returnnotfoundids += targetArray[i] + ', '; + } + if (CommonUtil.normalizeSpacing(returnnotfoundids).length >= 2) + returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2); + else + returnnotfoundids = ''; + return returnnotfoundids; + }; + CommonUtil.getDocElementsByTag = function (elem, tagName) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + tagName = tagName.toLowerCase(); + var cache = CacheUtil_1.CacheUtil.getCache(doc, "RPT_DOCELEMSBYTAG", {}); + if (!(tagName in cache)) { + cache[tagName] = doc.querySelectorAll(tagName); + CacheUtil_1.CacheUtil.setCache(doc, "RPT_DOCELEMSBYTAG", cache); + } + return cache[tagName]; + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * Note: This is a wrapper function to: AriaUtil.getChildByTagHidden + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTag = function (parentElem, tagName) { + return CommonUtil.getChildByTagHidden(parentElem, tagName, false, false); + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTagHidden = function (parentElem, tagName, ignoreHidden, considerHiddenSetting) { + // Variable Decleration + var retVal = []; + var child = parentElem.firstChild; + // Loop over all the child elements of the parent to build a list of all the elements that + // match the tagName provided + while (child != null) { + // Only include the children into the return array if they match with tagname. + if (child.nodeName.toLowerCase() === tagName) { + // In the case that ignorehidden was set to true, then perform a isNodeVisible check + // and in the case the node is not visilble we more to theses then move to the next node. + // Perform a couple of checks to determine if hidden elements should be ignored or not. + // 1. When ignoreHidden is set to true upfront, then perform a isNodeVisible + // 2. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2.1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if ((ignoreHidden || (considerHiddenSetting && !CommonUtil.shouldCheckHiddenContent(child))) && !VisUtil_1.VisUtil.isNodeVisible(child)) { + // Move on to the next element + child = child.nextSibling; + continue; + } + // Push the element + retVal.push(child); + } + // Move to the next sibling element + child = child.nextSibling; + } + return retVal; + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function by defauly will not consider Check Hidden Setting at all. + * This function by defauly will not consider implicit roles. + * Note: This is a wrapper function to: AriaUtil.getElementsByRoleHidden + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRole = function (doc, roles) { + return CommonUtil.getElementsByRoleHidden(doc, roles, false, false); + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function aslo finds elements with implicit roles. + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRoleHidden = function (doc, roles, considerHiddenSetting, considerImplicitRoles) { + // In the case that the role to element assoication is already made, and available in the global hasAttribute + // we can just use that one instead of building a new one. + var roleToElems = null; + if (considerImplicitRoles) { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", null); + } + else { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", null); + } + // Build the new role to element, this is where we loop through all the elements and extract all the + // elements bsaed on roles. + if (roleToElems === null) { + // Re-initialize the roleToElems hash + roleToElems = {}; + // Get the body of the doc + var root = doc.body; + // Keep looping until we are at the very parent node of the entire page, so that we can loop through + // all the nodes. + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + // Build a nodewalter based of the root node, this node walter will be use loop over all the nodes + // and build the roles to Element coralation + var nw = new DOMWalker_1.DOMWalker(root); + // Loop over the entire doc/list of nodes to build the role to element map + // Note: This will build an roleToElems hash which is in the following format. + // roleToElems = { + // document: [{div},{abbr},{var}], + // main: [{div}], + // navigation: [{div}] + // } + while (nw.nextNode()) { + if (!nw.elem()) + continue; + // Only check the elements which have the role attribute assiciated to them + if (!nw.bEndTag) { + var wRoles = []; + //check if the node has role attributes + if (nw.elem() && nw.elem().hasAttribute("role")) { + // Extract all the roles that are assigned to this element, can have multiple roles on one + // element split by space, so we need to extract all of them into an array. + wRoles = nw.elem().getAttribute("role").split(" "); + } + if (nw.elem() && wRoles.length === 0 && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil_1.AriaUtil.getImplicitRole(nw.node); + if (implicitRole !== null && implicitRole.length > 0) + wRoles = implicitRole; + } + if (wRoles.length === 0) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Loop through all the roles and assigned this node to all thes roles + for (var i = 0; i < wRoles.length; ++i) { + // In the case that the role key is not already in the roleToElems hash, construct the + // add the key and assign empty array. + if (!(wRoles[i] in roleToElems)) { + roleToElems[wRoles[i]] = []; + } + // Add the node to the array for the role + roleToElems[wRoles[i]].push(nw.node); + } + } + } + // Set the roleToElems hash map as a global variable + if (considerImplicitRoles) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems); + } + else { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", roleToElems); + } + } + // Initilize the return value + var retVal = []; + // Handle the cases where the provided role is a string and not an array, + // for this case we take the string and put it into an array + if (typeof (roles) === "string") { + var role = roles; + roles = []; + roles.push(role); + } + // Loop through the roles that were provided and find the list of elements for this roles + // and add them to the return value. + if (roles.length) { + // loop over all the roles + for (var i = 0; i < roles.length; ++i) { + // Extract the role from the array + var nextRole = roles[i]; + // Fetch the list of all the elements for this role + var copyRoles = roleToElems[nextRole]; + // If there are elements to copy to another array, then perform the copy + if (copyRoles) { + // Loop over all the elements which are to be copied + for (var j = 0; j < copyRoles.length; ++j) { + // Add this element to the return val + retVal.push(copyRoles[j]); + } + } + } + } + return retVal; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * + */ + CommonUtil.isTarget = function (element) { + if (!element || element.nodeType !== 1 + || ["html", "body"].includes(element.nodeName.toLowerCase()) + || CommonUtil.getAncestor(element, ["svg", "pre", "code", "script", "meta", 'head']) !== null + || !VisUtil_1.VisUtil.isNodeVisible(element) || VisUtil_1.VisUtil.isNodeVisuallyHidden(element) + || CommonUtil.isNodeDisabled(element) || VisUtil_1.VisUtil.isElementOffscreen(element)) + return false; + if (CommonUtil.isClickable(element)) + return true; + var role = AriaUtil_1.AriaUtil.getResolvedRole(element); + if (!role) + return false; + var target_roles = ["listitem", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "treeitem"]; + if (target_roles.includes(role)) { + // find the proper parent elements + var parent_1 = element.parentElement; + if (parent_1) { + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + // datalist, fieldset, optgroup, etc. may be just used for grouping purpose, so go up to the parent + if (parent_role === 'group') + parent_1 = parent_1.parentElement; + } + if (parent_1 && CommonUtil.isTarget(parent_1)) + return true; + } + return false; + }; + CommonUtil.getFileExt = function (url) { + var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/); + if (m != null && m.length >= 2) { + return "." + m[1]; + } + return ""; + }; + CommonUtil.getFileAnchor = function (url) { + var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/); + if (m != null && m.length >= 2) { + return m[1]; + } + return ""; + }; + CommonUtil.checkObjEmbed = function (node, extTest, mimeTest) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName != "object" && nodeName != "embed" && + nodeName != "a" && nodeName != "area") + return false; + var retVal = false; + // Check mime type + if (!retVal && node.hasAttribute("type")) { + var mime = node.getAttribute("type").toLowerCase(); + retVal = mimeTest(mime); + } + if (!retVal && node.hasAttribute("codetype")) { + var mime = node.getAttribute("codetype"); + retVal = mimeTest(mime); + } + // Check the filename + if (!retVal) { + var filename = ""; + if (nodeName === "embed") { + filename = node.getAttribute("src"); + } + else if (nodeName === "a" || nodeName === "area") { + filename = node.getAttribute("href"); + } + else if (node.hasAttribute("data")) { + filename = node.getAttribute("data"); + } + if (filename === null) + filename = ""; + var ext = CommonUtil.getFileExt(filename); + retVal = extTest(ext); + } + // Check for filenames in the params + if (!retVal && nodeName === "object") { + // In the case that Check Hidden Option is set then comply with that setting + var params = CommonUtil.getChildByTagHidden(node, "param", false, true); + for (var i = 0; !retVal && params != null && i < params.length; ++i) { + retVal = params[i].hasAttribute("value") && + extTest(CommonUtil.getFileExt(params[i].getAttribute("value"))); + } + } + return retVal; + }; + CommonUtil.isAudioObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isAudioExt, function (mime) { + return mime.startsWith("audio"); + }); + }; + CommonUtil.isAudioExt = function (ext) { + var audio_extensions = [".aif", ".aifc", ".aiff", ".air", ".asf", ".au", ".cda", + ".dsm", ".dss", ".dwd", ".iff", ".kar", ".m1a", ".med", + ".mp2", ".mp3", ".mpa", ".pcm", ".ra", ".ram", ".rm", + ".sam", ".sf", ".sf2", ".smp", ".snd", ".svx", ".ul", + ".voc", ".wav", ".wma", ".wve" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), audio_extensions); + }; + CommonUtil.isVideoObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isVideoExt, function (mime) { + return mime.startsWith("video") || + mime.startsWith("application/x-shockwave-flash"); + }); + }; + CommonUtil.isVideoExt = function (ext) { + var video_extensions = [".asf", ".avi", ".divx", ".dv", ".m1v", ".m2p", ".m2v", ".moov", + ".mov", ".mp4", ".mpeg", ".mpg", ".mpv", ".ogm", ".omf", ".qt", + ".rm", ".rv", ".smi", ".smil", ".swf", ".vob", ".wmv", ".rmvb", + ".mvb" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), video_extensions); + }; + CommonUtil.isImageObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isImgExt, function (mime) { + return mime.startsWith("image"); + }); + }; + CommonUtil.isImgExt = function (ext) { + return CommonUtil.valInArray(ext.toLowerCase(), CommonUtil.image_extensions); + }; + CommonUtil.isHtmlExt = function (ext) { + var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), html_extensions); + }; + CommonUtil.hasTriggered = function (doc, id) { + return CacheUtil_1.CacheUtil.getCache(doc, id, false); + }; + CommonUtil.triggerOnce = function (doc, id, passed) { + if (passed) + return true; + var triggered = CacheUtil_1.CacheUtil.getCache(doc, id, false); + CacheUtil_1.CacheUtil.setCache(doc, id, true); + return triggered; + }; + /* determine if the given value exists in the given array */ + CommonUtil.valInArray = function (value, arr) { + for (var idx in arr) { + if (arr[idx] === value) + return true; + } + return false; + }; + /** + * return the ancestor of the given element + * @param tagNames string, array, or dictionary containing the tags to search for + */ + CommonUtil.getAncestor = function (element, tagNames) { + var walkNode = element; + while (walkNode !== null) { + var thisTag = walkNode.nodeName.toLowerCase(); + if (typeof (tagNames) === "string") { + if (thisTag === tagNames.toLowerCase()) { + break; + } + } + else if (tagNames.length) { + for (var idx in tagNames) { + if (tagNames[idx] === thisTag) + return walkNode; + } + } + else if (thisTag in tagNames) { + break; + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + // return true if element1 and element2 are siblings + CommonUtil.isSibling = function (element1, element2) { + if (element1 && element2) { + var node = null; + if (DOMWalker_1.DOMWalker.parentNode(element1) && DOMWalker_1.DOMWalker.parentNode(element1).firstChild) { + node = DOMWalker_1.DOMWalker.parentNode(element1).firstChild; + } + while (node) { + if (node === element2) + return true; + node = node.nextSibling; + } + } + return false; + }; + CommonUtil.isDescendant = function (parent, child) { + var node = DOMWalker_1.DOMWalker.parentNode(child); + while (node != null) { + if (node === parent) { + return true; + } + node = DOMWalker_1.DOMWalker.parentNode(node); + } + return false; + }; + //check if the first form control child is disabled + CommonUtil.isDisabledByFirstChildFormElement = function (element) { + var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + if (formElements.includes(nw.node.nodeName.toLowerCase())) { + if (CommonUtil.isNodeDisabled(nw.node)) + return true; + return false; + } + } + } + return false; + }; + CommonUtil.isDisabledByReferringElement = function (element) { + var id = element.getAttribute("id"); + var doc = element.ownerDocument; + var root = doc.body; + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + var nw = new DOMWalker_1.DOMWalker(root); + while (nw.nextNode()) { + // check the element whose 'aria-describedby' equals to the id + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var AriaDescribedbyIDArray = (nw.elem().getAttribute("aria-describedby") || "").split(" "); + if (AriaDescribedbyIDArray.includes(id) && CommonUtil.isNodeDisabled(nw.node)) { + return true; + } + } + } + }; + /** get element containing label for the given element + * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead + */ + CommonUtil.getInputLabel = function (element) { + return CommonUtil.getLabelForElement(element); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * Note: This is a wrapper function to: AriaUtil.getLabelForElementHidden + * + * @parm {element} element - The element for which to get the label element for. + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElement = function (element) { + return CommonUtil.getLabelForElementHidden(element, false); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * This function will return null if the containing lable element is hidden, when the ignoreHidden option + * is set to true. + * + * @parm {element} element - The element for which to get the label element for. + * @parm {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElementHidden = function (element, ignoreHidden) { + // Check if the global AriaUtil_LABELS hash is available, as this will contain the label nodes based on + // for attribute. + //if (!getCache(element.ownerDocument,"AriaUtil_LABELS", null)) { + var root = element.getRootNode(); + if (!CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", null)) { + // Variable Decleration + var idToLabel = {}; + // Get all the label elements in the entire doc + var labelNodes = CommonUtil.getDocElementsByTag(element, "label"); + // Loop over all the label nodes, in the case the label node has a for attribute, + // extract that attribute and add this node to the hash if it is visible. + for (var i = 0; i < labelNodes.length; ++i) { + if (labelNodes[i].hasAttribute("for")) { + // If ignore hidden is specified and the node is not visible we do not add it to the + // labelNodes hash. + if (ignoreHidden && !VisUtil_1.VisUtil.isNodeVisible(labelNodes[i])) { + continue; + } + idToLabel[labelNodes[i].getAttribute("for")] = labelNodes[i]; + } + } + // Add the built hash to the ownerDocument (document), to be used later to fast retrival + //setCache(element.ownerDocument, "AriaUtil_LABELS", idToLabel); + CacheUtil_1.CacheUtil.setCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", idToLabel); + } + // If this element has an id attribute, get the corosponding label element + if (element.hasAttribute("id")) { + // Fetch the id attribute + var ctrlId = element.getAttribute("id"); + // Return the corosponding label element. + // Note: in the case that the the id is not found in the hash that means, it does not exists or is hidden + if (ctrlId.trim().length > 0) { + //return getCache(element.getRootNode().ownerDocument,"AriaUtil_LABELS",{})[ctrlId]; + return CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", {})[ctrlId]; + } + } + return null; + }; + /* Return specified element attribute if present else return null */ + CommonUtil.getElementAttribute = function (element, attr) { + //return (element && element.hasAttribute && element.hasAttribute(attr)) ? element.getAttribute(attr) : null; + if (!attr || !element || !element.hasAttribute || !element.hasAttribute(attr)) + return null; + var atrValue = element.getAttribute(attr); + if (!ARIADefinitions_1.ARIADefinitions.referenceProperties.includes(attr)) + return atrValue; + //attr is a reference to other elements(s) + var values = atrValue.split(/ +/g); + //ignore if none of the referred element(s) exist or all point to the element itself + var exist = false; + for (var id = 0; values < values.length; ++id) { + var referred = document.getElementById(values[id]); + if (referred && !DOMUtil_1.DOMUtil.sameNode(referred, element)) { + exist = true; + break; + } + } + return exist ? atrValue : null; + }; + // Return true if element has valid implicit label + CommonUtil.hasImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + return CommonUtil.hasInnerContentHidden(parentClone); + } + else { + return false; + } + }; + // Return the implicit label of the given form field + CommonUtil.getImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + var label = CommonUtil.getInnerText(parentClone); + return label && label.trim() !== '' ? label.trim() : null; + } + else + return null; + }; + /** + * This function is responsible for getting the label for a form field element. + * + * + * @parm {element} element - The element from which to get the label. + * + * @return {string} text - return the label text or null + * + * @memberOf AriaUtil + */ + CommonUtil.getFormFieldLabel = function (elem) { + // get the label from the attribute "for" of the label element + // Get only the non-hidden labels for element + var value = ""; + var label = null; + var labelElem = CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + // value directly from element text + label = labelElem.innerText; // ignore hidden text + } + else { + /** if it's not label with for attribute, then find implicit label + * cases for explict label: + * <label for='my'></label><input id='my'/> + * <label for='my'><input id='my'/></label> + * cases for implicit label: + * <label><input /></label> + */ + labelElem = CommonUtil.getAncestor(elem, "label"); + if (labelElem && labelElem.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(labelElem, elem)) { + var parentClone = labelElem.cloneNode(true); + // exclude all the text from the first form element since they might also + // have inner content that is part of innerText + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + label = CommonUtil.getInnerText(parentClone); + } + else + return null; + } + if (label && label.trim() !== "") + value += label.trim(); + // value from child element attribute + label = CommonUtil.getLabelTextFromAttribute(labelElem, true); + if (label && label.trim() !== "") + value += label.trim(); + // wired case: get aria label from label element itself just in case (though name prohibited from aria in html) + label = AriaUtil_1.AriaUtil.getAriaLabel(labelElem); + if (label && label.trim() !== "") + value += label.trim(); + return value.trim(); + }; + /** + * calculate label from embedded control: https://w3c.github.io/accname/ + * @param {element} labelElem label element + * @param {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * @returns label text or '' + * + * note the assumption is the labelElem refers either to a labelled element by 'for' attribute + * or its first form field is labbelled element + */ + CommonUtil.getLabelTextFromAttribute = function (labelElem, ignoreHidden) { + // label either points to a labelable element by its for attribute or the first element child + // get the labelled elment if it's an implicit label + var labeledElem = null; + for (var i = 0; i < labelElem.children.length; i++) { + var child = labelElem.children.item(i); + if (CommonUtil.form_labelable_elements.includes(child.nodeName.toLowerCase())) { + labeledElem = child; + break; + } + } + var nw = new DOMWalker_1.DOMWalker(labelElem); + var text = ''; + while (nw.nextNode() && nw.node !== labelElem) { + // only check element children + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var elem = nw.elem(); + // ignore if it's hidden, or labelled element, or first form element if not labeled by for attribute + if ((ignoreHidden && (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) || VisUtil_1.VisUtil.isNodePresentational(elem))) + || (labeledElem && labeledElem.contains(elem))) + continue; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // textbox etc. return its text value + if (role === "textbox") { + var name_1 = elem.getAttribute("value"); + if (name_1 && name_1.trim().length > 0) + text += ' ' + name_1.trim(); + } + else if (role === "combobox" || role === "listbox") { + // for combobox or listbox roles, return the text alternative of the chosen option. + var selectedId = elem.getAttribute("aria-activedescendant") || elem.getAttribute("aria-selected") || elem.getAttribute("aria-checked"); + if (selectedId) { + var selectedOption = elem.ownerDocument.getElementById(selectedId); + if (selectedOption && !DOMUtil_1.DOMUtil.sameNode(elem, selectedOption)) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(selectedOption); + if (pair && pair.name) + text += ' ' + pair.name.trim(); + } + } + } + else if (["progressbar", "scrollbar", "slider", "spinbutton", "meter"].includes(role)) { + // for range role type, including "progressbar", "scrollbar", "slider", "spinbutton" roles + // If the aria-valuetext property is present, return its value + var value_1 = elem.getAttribute("aria-valuetext"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // Otherwise, if the aria-valuenow property is present, return its value, + value_1 = elem.getAttribute("aria-valuenow"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // finally use native value attribute + value_1 = elem.getAttribute("value"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + } + // get aria label from the element + var value = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (value && value.trim() !== "") + text += ' ' + value.trim(); + } + } + return text.trim(); + }; + CommonUtil.isFirstFormElement = function (parentNode, element) { + //let formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (parentNode.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(parentNode); + while (nw.nextNode()) { + if (CommonUtil.form_labelable_elements.indexOf(nw.node.nodeName.toLowerCase()) !== -1) { + return nw.node === element; + } + } + } + return false; + }; + // check if the element is a shadow host or descendant of a shadow host, but not a descedant of the shadow root of the host (to be assigned to shadow slot or ignored) + CommonUtil.isShadowHostElement = function (element) { + if (CommonUtil.isShadowElement(element)) + return false; + var walkNode = element; + while (walkNode) { + if (walkNode.shadowRoot) + return true; + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + //check if an element is in a shadow tree + CommonUtil.isShadowElement = function (element) { + var root = element.getRootNode(); + if (root.toString() === "[object ShadowRoot]") + return true; + return false; + }; + CommonUtil.removeAllFormElementsFromLabel = function (element) { + var formElements = ["input", "textarea", "select", "button", "datalist", "optgroup", "option", "keygen", "output", "progress", "meter"]; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; i++) { + if (formElements.indexOf(childNodes[i].nodeName.toLowerCase()) > -1) { + element.removeChild(childNodes[i]); + } + } + return element; + }; + /** + * @param element + * @param idStr + * @returns true if any one (if multiple Ids) id points to itself + */ + CommonUtil.isIdReferToSelf = function (element, idStr) { + if (!idStr || idStr.trim() === '') + return false; + var ids = idStr.trim().split(" "); + for (var j = 0, length_1 = ids.length; j < length_1; ++j) { + var referredNode = fragment_1.FragmentUtil.getById(element, ids[j]); + if (referredNode && DOMUtil_1.DOMUtil.sameNode(referredNode, element)) + return true; + } + return false; + }; + /* Determine the node depth of the given element */ + CommonUtil.nodeDepth = function (element) { + var depth = 0; + var walkNode = element; + while (walkNode !== null) { + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + depth = depth + 1; + } + return depth; + }; + /* compare node order of the 2 given nodes */ + /* returns + * 0 if the nodes are equal + * 1 if node b is before node a + * -1 if node a is before node b + * 2 if node a is nested in node b + * -2 if node b is nested in node a + * null if either node is null or their parent nodes are not equal + */ + CommonUtil.compareNodeOrder = function (nodeA, nodeB) { + if (nodeA === nodeB) + return 0; + var aDepth = CommonUtil.nodeDepth(nodeA); + var bDepth = CommonUtil.nodeDepth(nodeB); + if (bDepth > aDepth) { + for (var i = 0; i < bDepth - aDepth; ++i) + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + if (nodeA === nodeB) // Node B nested in Node A + return -2; + } + else if (aDepth > bDepth) { + for (var i = 0; i < aDepth - bDepth; ++i) + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + if (nodeA === nodeB) // Node A nested in Node B + return 2; + } + while (nodeA != null && nodeB != null && DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) { + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + } + if (nodeA === null || nodeB === null || DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) + return null; + while (nodeB != null && nodeB != nodeA) + nodeB = nodeB.previousSibling; + if (nodeB === null) // nodeB before nodeA + return 1; + else + return -1; + }; + /** + * Determine if the given attribute of the given element is not empty + * @memberOf AriaUtil + */ + CommonUtil.attributeNonEmpty = function (element, attrStr) { + return element.hasAttribute(attrStr) && element.getAttribute(attrStr).trim().length > 0; + }; + /* Return a pointer to the given frame, null if not found */ + CommonUtil.getFrameByName = function (ruleContext, frameName) { + var window = ruleContext.ownerDocument.defaultView; + var frameList = [window]; + var idx = 0; + while (idx < frameList.length) { + try { + if (frameList[idx].name === frameName) + return frameList[idx]; + for (var i = 0; i < frameList[idx].frames.length; ++i) { + try { + // Ensure it's a real frame and avoid recursion + if (frameList[idx].frames[i] && !frameList.includes(frameList[idx].frames[i])) { + frameList.push(frameList[idx].frames[i]); + } + } + catch (e) { } + } + } + catch (e) { } + ++idx; + } + return null; + }; + CommonUtil.defaultNSResolver = function (prefix) { + var uri; + switch (prefix) { + case 'html': + uri = 'http://www.w3.org/1999/xhtml'; + case 'x2': + uri = 'http://www.w3.org/TR/xhtml2'; + case 'x': + uri = 'http://www.w3.org/1999/xhtml'; + case 'xhtml': + uri = 'http://www.w3.org/1999/xhtml'; + default: + uri = null; + } + return uri; + }; + //checking if only the inner text is empty or not + CommonUtil.isInnerTextOnlyEmpty = function (element) { + // Get the innerText of the element + var text = element.innerText; + if ((text === undefined || text === null || text.trim().length === 0) && element.nodeName.toLowerCase() !== 'slot' && element.textContent !== undefined) { + //ignore slot because its text will be filled by the corresponding content in the light DOM + // innerText is sometimes 'undefined' in headless mode, or null if the element is invisible or not erxpanded + // so we try textContent as a workaround + text = element.textContent; + } + var retVal = !(text !== null && text.trim().length > 0); + if (element.nodeType === 1 && element.nodeName.toLowerCase() === "slot") { + //TODO: need to conside its own content, a slot may have its own content or assigned content + for (var _i = 0, _a = element.assignedNodes(); _i < _a.length; _i++) { + var slotElem = _a[_i]; + retVal = retVal && CommonUtil.isInnerTextEmpty(slotElem); + } + } + // Trim the inner text and verify that it is not empty. + return retVal; + }; + /* Return the inner text of the given element */ + CommonUtil.getInnerText = function (element) { + var retVal = element.innerText; + if (retVal === undefined || retVal === null || retVal.trim() === "") + retVal = element.textContent; + return retVal; + }; + /** + * return onscreen innerText only. + * This function should return the same result as innerText if no offscreen content exists + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {null | string} null if element has empty inner text, text otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.getOnScreenInnerText = function (element) { + if (!element) + return null; + if (element.nodeType === 3) + return element.nodeValue(); + var text = ""; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== element && nw.node !== element.parentNode) { + if (nw.bEndTag) + continue; + if (nw.node.nodeType === 1 && (VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nw.node.nodeName.toLowerCase()) || !VisUtil_1.VisUtil.isNodeVisible(nw.node) || VisUtil_1.VisUtil.isElementOffscreen(nw.node))) { + /** special case for svg <title> element: + * text in a <title> element is not rendered as part of the graphic, but browsers usually display it as a tooltip + * note some svg elements, such as title, desc, have a bounds {"left":0,"top":0,"height":0,"width":0} + */ + if (nw.node.nodeName.toLowerCase() === 'title' && CommonUtil.getAncestor(nw.node, "svg")) + continue; + if (nw.node.nextSibling) { + if (nw.node.nextSibling.nodeType === 3 && nw.node.nextSibling.nodeValue && nw.node.nextSibling.nodeValue.trim() !== '') + text += ' ' + nw.node.nextSibling.nodeValue.trim(); + nw.node = nw.node.nextSibling; + continue; + } + else + break; + } + if (nw.node.nodeType === 3 && nw.node.nodeValue && nw.node.nodeValue.trim() !== '') { + text += ' ' + nw.node.nodeValue.trim(); + } + } + return text.trim(); + }; + /** Return the text content of the given node + * this is different than innerText or textContent that return text content of a node and its descendants + */ + CommonUtil.getNodeText = function (element) { + if (!element) + return ""; + var text = ""; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType == 3) { + text += childNodes[i].nodeValue; + } + } + return text; + }; + /** + * This function is responsible for checking if elements inner text is empty or not. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isInnerTextEmpty = function (element) { + // Get the innerText of the element + var text = CommonUtil.getInnerText(element); + // Trim the inner text and verify that it is not empty. + return !(text != null && text.trim().length > 0); + }; + CommonUtil.hasInnerContent = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text !== null && text.trim().length > 0); + if (element.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode()) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + } + } + return hasContent; + }; + /** + * This function is responsible for determine if an element has inner content. + * This function also considers cases where inner text is hidden, which now will + * be classified as does not have hidden content. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.hasInnerContentHidden = function (element) { + return CommonUtil.hasInnerContentHiddenHyperLink(element, false); + }; + CommonUtil.svgHasName = function (element) { + return CommonUtil.attributeNonEmpty(element, "aria-label") + || CommonUtil.attributeNonEmpty(element, "aria-labelledby") + || !!element.querySelector(":scope > title"); + }; + CommonUtil.hasInnerContentHiddenHyperLink = function (element, hyperlink_flag) { + if (!element) + return false; + // Variable Decleration + var childElement = element.firstElementChild; + var hasContent = false; + // In the case that the childElement is not null then we need to check each of the elements + // to make sure that the elements are not all hidden. + if (childElement != null) { + // Get the nodewalter of the element node, so that we can loop over it and verify + // that the elements under the element are not completly hidden. + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the nodes until there are no more nodes or we have determine that there is content under + // this parent element. + while (!hasContent && nw.nextNode() && nw.node != element) { + // Get the next node + var node = nw.node; + // In the case an img element is present with alt then we can mark this as pass + // otherwise keep checking all the other elements. Make sure that this image element is not hidden. + hasContent = (node.nodeName.toLowerCase() === "img" + && (CommonUtil.attributeNonEmpty(node, "alt") || CommonUtil.attributeNonEmpty(node, "title")) + && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) || (node.nodeName.toLowerCase() === "svg" + && CommonUtil.svgHasName(node)); + // Now we check if this node is of type element, visible + if (!hasContent && node.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextOnlyEmpty(node); + if (!hasContent && hyperlink_flag === true) { + hasContent = CommonUtil.attributeNonEmpty(node, "aria-label") || CommonUtil.attributeNonEmpty(node, "aria-labelledby"); + var doc = node.ownerDocument; + if (doc) { + var win = doc.defaultView; + if (win) { + var cStyle = win.getComputedStyle(node); + if (!hasContent && cStyle != null) { + // console.log(cStyle.backgroundImage); + // console.log(cStyle.content) + hasContent = ((cStyle.backgroundImage && cStyle.backgroundImage.indexOf) || cStyle.content) && CommonUtil.attributeNonEmpty(node, "alt"); + } + } + } + } + } + // Check for cases where there is text node after an element under the parent + // In the case we detect nodetype as text node and the patent of the text node is + // the same element we are checking has Inner content for then get the inner content of this + // text node. + if (node.nodeType === 3 && DOMWalker_1.DOMWalker.parentElement(node) === element) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(node); + } + } + } + // In the case there are no child elements then we can simply perform the check for only innertext + // the img with alt case will be covered in the above if, as img is considers as an element. + else { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(element); + } + return hasContent; + }; + CommonUtil.hasInnerContentOrAlt = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text != null && text.trim().length > 0) || CommonUtil.attributeNonEmpty(element, "alt"); + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode() && nw.node != element) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + if (!hasContent + && (AriaUtil_1.AriaUtil.hasRole(nw.node, "button", true) || AriaUtil_1.AriaUtil.hasRole(nw.node, "textbox")) + && (AriaUtil_1.AriaUtil.hasAriaLabel(nw.node) || CommonUtil.attributeNonEmpty(nw.node, "title") || CommonUtil.getLabelForElementHidden(nw.elem(), true))) { + hasContent = true; + } + } + } + return hasContent; + }; + CommonUtil.concatUniqueArrayItem = function (item, arr) { + arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false; + return arr; + }; + CommonUtil.concatUniqueArrayItemList = function (itemList, arr) { + for (var i = 0; itemList !== null && i < itemList.length; i++) { + arr = CommonUtil.concatUniqueArrayItem(itemList[i], arr); + } + return arr; + }; + /** + * remove array items from a given array + * @param itemList items to be removed from arr + * @param arr the array + * @returns + */ + CommonUtil.reduceArrayItemList = function (itemList, arr) { + if (arr && arr.length > 0 && itemList && itemList.length > 0) { + var result = arr.filter(function (value) { + return !itemList.includes(value); + }); + return result; + } + return arr; + }; + CommonUtil.getScopeForTh = function (element) { + /** https://www.w3.org/TR/html5/tabular-data.html#header-and-data-cell-semantics + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a column header if any of the following conditions are true: + * * The cell's scope attribute is in the column state, or + * * The cell's scope attribute is in the auto state, and there are no data cells in any of + * the cells covering slots with y-coordinates y .. y+height-1. + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a row header if any of the following conditions are true: + * * The cell's scope attribute is in the row state, or + * * The cell's scope attribute is in the auto state, the cell is not a column header, and there are + * no data cells in any of the cells covering slots with x-coordinates x .. x+width-1. + */ + // Note: auto is default scope + // Easiest answer is if scope is specified + if (element.hasAttribute("scope")) { + var scope = element.getAttribute("scope").toLowerCase(); + if (scope === "row" || scope === 'rowgroup') + return "row"; + if (scope === "col" || scope === 'colgroup') + return "column"; + } + // scope is auto, default (without a scope) or invalid value. + // if all the sibling elements are th, then return "columnheader" + var siblings = __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName.toLowerCase() != "th"; }); + if (siblings === null || siblings.length === 0) + return "column"; + else + return "row"; + }; + CommonUtil.getControlOfLabel = function (node) { + // Handle the easy case of label -> for + var labelAncestor = CommonUtil.getAncestor(node, "label"); + if (labelAncestor && labelAncestor.hasAttribute("for")) { + return fragment_1.FragmentUtil.getById(node, labelAncestor.getAttribute("for")); + } + // Create a dictionary containing ids of parent nodes + var idDict = {}; + var parentWalk = node; + while (parentWalk) { + if (parentWalk.nodeType === 1 /* Node.ELEMENT_NODE */) { + var ancestor = parentWalk; + if (ancestor.hasAttribute("id")) { + idDict[ancestor.getAttribute("id")] = true; + } + } + parentWalk = DOMWalker_1.DOMWalker.parentNode(parentWalk); + } + // Early return if no ancestor IDs found + if (Object.keys(idDict).length === 0) { + return null; + } + // Cache aria-labelledby attribute if node is an element + var nodeAriaLabelledBy = node.nodeType === 1 ? node.getAttribute("aria-labelledby") : null; + // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids + var inputsUsingLabelledBy = CacheUtil_1.CacheUtil.getSetCache(node.ownerDocument, "CommonUtil::getControlOfLabel", function () { return node.ownerDocument.querySelectorAll("*[aria-labelledby]"); }); + for (var idx = 0; idx < inputsUsingLabelledBy.length; ++idx) { + var inputUsingLabelledBy = inputsUsingLabelledBy[idx]; + var ariaLabelledBy = inputUsingLabelledBy.getAttribute("aria-labelledby"); + var sp = ariaLabelledBy.split(" "); + for (var _i = 0, sp_1 = sp; _i < sp_1.length; _i++) { + var id = sp_1[_i]; + if (id in idDict && !CommonUtil.isIdReferToSelf(node, nodeAriaLabelledBy)) { + return inputUsingLabelledBy; + } + } + } + // Find the cases where we're within an aria labelledby + return null; + }; + /** + * This function is responsible for checking if the node that is provied is + * disabled or not. Following is how the check is performed: + * 1. Check if the current node is disabled with the following options: + * attribute --> disabled + * Also needs to be "button", "input", "select", "textarea", "optgroup", "option", + * "menuitem", "fieldset" nodes (in array elementsAllowedDisabled) + * attribute --> aria-disabled="true" + * 2. Check if any of the current nodes parents are disabled with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are disabled then this + * function will return true (node is disabled). + * + * @parm {HTMLElement} node - The node which should be checked if it is disabled or not. + * @return {bool} true if the node is disabled, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isNodeDisabled = function (node) { + // Set PT_NODE_DISABLED to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is disabled. We have to set it to false so that we know + // the node has already been checked. Only set it to false if the setting is undefined or null + // as if it is defined we do not wnat to reset it. As if it is true then we should make use of it + // to speed up the check. + var PT_NODE_DISABLED = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_DISABLED", undefined); + if (typeof PT_NODE_DISABLED !== "undefined") + return PT_NODE_DISABLED; + PT_NODE_DISABLED = false; + // Check the nodeType of this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // disabled is directly related to the parent node. + if (node.nodeType === 3) { + node = DOMWalker_1.DOMWalker.parentNode(node); + } + // Variable Declaration + var nodeName = node.nodeName.toLowerCase(); + // Get the disabled element property, disabled and aria-disabled attribute and check that it is true + var disabledAttribute = node.hasAttribute("disabled"); + var disabledPropertyCustom = PT_NODE_DISABLED; + var ariaDisabledAttribute = node.hasAttribute('aria-disabled') && node.getAttribute("aria-disabled") === 'true'; + // If this node has disabled attribute and the node allows disabled attribute, then return true. + // Disabled attribute is only allowed on "button", "input", "select", "textarea", "optgroup", "option", "menuitem", "fieldset" + // In the case aria-disabled is set to true, then also return true + if (disabledPropertyCustom || (disabledAttribute && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(nodeName) > -1) || ariaDisabledAttribute) { + PT_NODE_DISABLED = true; + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // disabled attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is disabled or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // Check upwards recursively, and save the results in an variable + var nodeDisabled = CommonUtil.isNodeDisabled(parentElement); + // If the node is found to be disabled then add the custom PT_NODE_DISABLED to true. + // so that we can use this next time, to quickly determine if node is disabled or not. + // This is extra percaution, the isNodeDisabled function already sets this. + if (nodeDisabled) { + PT_NODE_DISABLED = true; + } + // Check upwards recursively + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return nodeDisabled; + } + // Return false (node is not disabled) + return false; + }; + /** + * This function is responsible for determine if hidden content should be checked + * in rules. + * + * @parm {element} node - A node so that the document can be accessed to check for the + * option. Can be document element or a simple node element. + * @return {bool} true if hidden content should be checked, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldCheckHiddenContent = function (node) { + return false; + }; + /** + * This function is responsible for determining if node should be skipped from checking or not, based + * on the Check Hidden Content settings and if the node is visible or not. + * + * @parm {element} node - Node to check if it is visible or not based on the Check Hidden Content + * setting. + * + * @return {bool} true if node should be skipped, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldNodeBeSkippedHidden = function (node) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we + // return true to identify that the node should not be scanned/added to any hash/array. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (!CommonUtil.shouldCheckHiddenContent(node) && !VisUtil_1.VisUtil.isNodeVisible(node)) { + return true; + } + return false; + }; + CommonUtil.isfocusableByDefault = function (node) { + var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area']; + if (node.nodeName.toLowerCase() === "a" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (node.nodeName.toLowerCase() === "area" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (focusableElements.indexOf(node.nodeName.toLowerCase()) !== -1) + return true; + return false; + }; + /** + * This function check if a non-tabable node has valid tabable content. + * If it is tabable (the tabindex is not speicified or is not -1), returns false; + * If it is non-tabable, but a child is tabable and does not have element content, returns false; + * Otherwise, returns true. + */ + CommonUtil.nonTabableChildCheck = function (element) { + if (!element.hasAttribute("tabindex") || + (parseInt(element.getAttribute("tabindex")) != -1)) { + return false; + } + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + var child = nw.elem(); + if (child === null) { // Text node. usually is a cartridge return. + continue; + } + if (child.hasAttribute("tabindex") && + (parseInt(child.getAttribute("tabindex")) != -1) && + !CommonUtil.hasInnerContent(child)) { + return false; + } + } + return true; + }; + CommonUtil.hasAttribute = function (element, attributeName) { + var hasAttribute = false; + if (element.hasAttribute) { + hasAttribute = element.hasAttribute(attributeName); + } + else if (element.attributes && element.attributes.getNamedItem) { + var attr = element.attributes.getNamedItem(attributeName); + hasAttribute = attr && attr.specified; + } + return hasAttribute; + }; + // truncate the given text to a given number of characters + // return truncated text to 150 chars, same with the media_alt_brief rule + CommonUtil.truncateText = function (text, len) { + if (len === void 0) { len = 150; } + if (!text) + return text; + text = text.trim(); + if (text.length > len) + return text.substring(0, len - 1) + "..."; + return text; + }; + CommonUtil.input_type_with_placeholder = ["text", "search", "tel", "url", "email", "password", "number"]; + CommonUtil.input_text_types = [ + "text", "file", "password", + "checkbox", "radio", + "search", "tel", "url", "email", + "date", "number", "range", + "time", "color" + ]; + CommonUtil.input_time_types = [ + "date", "month", "week", "time", "datetime-local" + ]; + CommonUtil.input_other_types = [ + "range", "color", "checkbox", "radio", "file", "image" + ]; + CommonUtil.form_button_types = [ + "button", "reset", "submit" + ]; + CommonUtil.form_labelable_elements = ["input", "textarea", "select", "keygen", "progress", "meter", "output", "button"]; + CommonUtil.tabTagMap = { + "button": function (element) { + return !element.hasAttribute("disabled"); + }, + "iframe": true, + "input": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + if (element.getAttribute("type") === "radio") { + var name_2 = element.getAttribute("name"); + if (!name_2 || name_2.trim().length === 0) + return true; //single radio, no group + var doc = element.ownerDocument; + var group = doc.querySelectorAll("input[type='radio'][name='" + name_2.trim() + "']"); + if (group.length === 0 || group.length === 1) + return true; //single radio with the name, no others in group + var checked = null; + for (var i = 0; i < group.length; i++) { + if (group[i].checked) + checked = group[i]; + } + //only last one applies if multiple radios with 'checked' attributes + if (checked !== null) { + if (DOMUtil_1.DOMUtil.sameNode(checked, element)) + return true; + return false; + } + else { + // if nothing checked yet, return true if it's the first element + if (DOMUtil_1.DOMUtil.sameNode(group[0], element)) + return true; + return false; + } + } + else + return true; + }, + "select": function (element) { + return !element.hasAttribute("disabled"); + }, + "textarea": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + return true; + }, + /**"div": function (element) { + return element.hasAttribute("contenteditable"); + },*/ + "a": function (element) { + // xlink:href?? see svg + return element.hasAttribute("href"); + }, + "area": function (element) { + return element.hasAttribute("href"); + }, + "audio": function (element) { + return element.hasAttribute("controls"); + }, + "video": function (element) { + return element.hasAttribute("controls"); + }, + "summary": function (element) { + // first summary child of a details element is automatically focusable + return element.parentElement && element.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], element.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], element); + }, + "details": function (element) { + //details element without a direct summary child is automatically focusable + return element.children && __spreadArray([], element.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; }).length === 0; + } + }; + CommonUtil.image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"]; + return CommonUtil; +}()); +exports.CommonUtil = CommonUtil; + + +/***/ }, + +/***/ "./src/v4/util/TableUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/TableUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableUtil = void 0; +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var TableUtil = /** @class */ (function () { + function TableUtil() { + } + TableUtil.isDataTable = function (tableNode) { + return !(AriaUtil_1.AriaUtil.hasRole(tableNode, "none") || AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation")); + }; + /* + * A complex data table is a data table with any of the following characteristics: + * + * a thead element that contains two or more tr elements + * a table with more than one thead element + * a table with two or more tr elements that contain only th elements + * a th or td element with a rowspan or colspan attribute + * a tr element that contains at least one td element and two or more th elements + * a table with headers not located in the first row or first column + * a td element with a headers attribute value that contains more than two IDREFs + */ + TableUtil.isComplexDataTable = function (table) { + if ("AriaUtil_isComplexDataTable" in table) { + return !!table.AriaUtil_isComplexDataTable; + } + var isComplexTable = false; + if (table && TableUtil.isDataTable(table)) { + var thNodes = null, tdNodes = null; + var trNodes = table.getElementsByTagName("tr"); + var trNodeCount = trNodes.length; + var tdNodeCount = 0, thNodeCount = 0, trNodesHavingOnlyThNodes = 0; + for (var i = 0; !isComplexTable && i < trNodeCount; ++i) { + thNodes = trNodes[i].getElementsByTagName("th"); + tdNodes = trNodes[i].getElementsByTagName("td"); + thNodeCount = thNodes.length; + tdNodeCount = tdNodes.length; + if (tdNodeCount !== 0) { + // a tr element that contains at least one td element and two or more th elements; + isComplexTable = thNodeCount > 1; + // a th element with a rowspan or colspan attribute + for (var j = 0; !isComplexTable && j < thNodeCount; ++j) { + isComplexTable = ((thNodes[j].hasAttribute("rowspan") || + thNodes[j].hasAttribute("colspan")) && + CommonUtil_1.CommonUtil.getAncestor(thNodes[j], "table") === table); + } + // a td element with a rowspan or colspan attribute + // a td element with a headers attribute value that contains more than two IDREFs + for (var k = 0; !isComplexTable && k < tdNodeCount; ++k) { + isComplexTable = ((tdNodes[k].hasAttribute("rowspan") || + tdNodes[k].hasAttribute("colspan") || + (tdNodes[k].hasAttribute("headers") && CommonUtil_1.CommonUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[k], "table") === table); + } + } + else { + // two or more tr elements that contain only th elements + if (thNodeCount > 0) { + ++trNodesHavingOnlyThNodes; + } + isComplexTable = trNodesHavingOnlyThNodes === 2; + } + } + if (!isComplexTable) { + var theadNodes = table.getElementsByTagName("thead"); + var theadNodesLength = theadNodes.length; + if (theadNodesLength > 0) { + // table has more than one thead element + isComplexTable = theadNodesLength > 1; + // a thead element that contains two or more tr elements + if (!isComplexTable) { + isComplexTable = theadNodes[0].getElementsByTagName("tr").length > 1; + } + } + } + if (!isComplexTable && trNodeCount !== 0) { + // a table with headers not located in the first row or first column + isComplexTable = thNodeCount > 0 && !TableUtil.tableHeaderExists(table); + } + } + table.AriaUtil_isComplexDataTable = isComplexTable; + return isComplexTable; + }; + // Return true if a table cell is hidden or contain no data: <td></td> + TableUtil.isTableCellEmpty = function (cell) { + if (!cell || !VisUtil_1.VisUtil.isNodeVisible(cell) || cell.innerHTML.replace(/&nbsp;/g, ' ').trim().length === 0) + return true; + return false; + }; + // Return true if a table row is hidden or contain no data: <tr /> or <tr><td></td><td></td></tr> + TableUtil.isTableRowEmpty = function (row) { + if (!row || !row.cells || row.cells.length === 0 || !VisUtil_1.VisUtil.isNodeVisible(row)) + return true; + var passed = true; //empty + for (var c = 0; passed && c < row.cells.length; c++) { + var cell = row.cells[c]; + passed = TableUtil.isTableCellEmpty(cell); + } + return passed; + }; + // Return true if a table's header is in the first row or column + TableUtil.tableHeaderExists = function (ruleContext) { + var rows = ruleContext.rows; + if (!rows || rows.length === 0) + return null; + // note that table.rows return all all the rows in the table, + // including the rows contained within <thead>, <tfoot>, and <tbody> elements. + //case 1: headers are in the very first row with data in tbody or thead, but not in tfoot + //get the first row with data, ignoring the rows with no data + var passed = true; + var firstRow = rows[0]; + for (var r = 0; passed && r < rows.length; r++) { + firstRow = rows[r]; + // ignore the rows from tfoot + if (firstRow.parentNode && firstRow.parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + passed = TableUtil.isTableRowEmpty(firstRow); + } + //table contain no data: <table><tr><td></td><td></td></tr></table> + if (passed) + return null; + // Check if the cells with data in the first data row are all TH's + passed = true; + for (var r = 0; passed && r < firstRow.cells.length; r++) { + var cell = firstRow.cells[r]; + passed = TableUtil.isTableCellEmpty(cell) || cell.nodeName.toLowerCase() === 'th'; + } + if (passed) + return true; + // Case 2: headers are in the first column with data + // Assume that the first column has all TH's or a TD without data in the first column. + passed = true; + for (var i = 0; passed && i < rows.length; ++i) { + // ignore the rows from tfoot + if (rows[i].parentNode && rows[i].parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + // If no cells in this row, or no data at all, that's okay too. + passed = !rows[i].cells || + rows[i].cells.length === 0 || + rows[i].cells[0].innerHTML.trim().length === 0 || + rows[i].cells[0].nodeName.toLowerCase() != "td"; + } + if (passed) + return true; + //case 3: all td data cells have headers attributes that point to the id of a th element in the same table. + // https://html.spec.whatwg.org/multipage/tables.html#attributes-common-to-td-and-th-elements + passed = true; + var thIds = []; + var tdHeaders = []; + for (var r = 0; passed && r < rows.length; r++) { + var row = rows[r]; + // Check if the cells with data in the last data row are all TH's + for (var c = 0; c < row.cells.length; c++) { + var cell = row.cells[c]; + if (TableUtil.isTableCellEmpty(cell)) + continue; + if (cell.nodeName.toLowerCase() === 'td') { + if (!cell.getAttribute('headers') || cell.getAttribute('headers').trim().length === 0) + passed = false; + else + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(cell.getAttribute('headers').trim().split(" "), tdHeaders); + } + else if (cell.nodeName.toLowerCase() === 'th' && cell.getAttribute('id') && cell.getAttribute('id').trim().length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItem(cell.getAttribute('id').trim(), thIds); + } + } + if (passed) { // all td elements have headers, to exam if the headers point to a th id + if (thIds.length > 0 && tdHeaders.every(function (header) { return thIds.includes(header); })) + return true; + } + return false; + }; + TableUtil.isLayoutTable = function (tableNode) { + return AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation") || AriaUtil_1.AriaUtil.hasRole(tableNode, "none"); + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + TableUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + return TableUtil; +}()); +exports.TableUtil = TableUtil; + + +/***/ }, + +/***/ "./src/v4/util/VisUtil.ts" +/*!********************************!*\ + !*** ./src/v4/util/VisUtil.ts ***! + \********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VisUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ./CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ClipPathUtil_1 = __webpack_require__(/*! ./ClipPathUtil */ "./src/v4/util/ClipPathUtil.ts"); +var VisUtil = /** @class */ (function () { + function VisUtil() { + } + /** + * This function is responsible for checking if the node that is provied is + * visible or not. Following is how the check is performed: + * 1. Check if the current node is hidden with the following options: + * CSS --> dislay: none + * CSS --> visibility: hidden + * attribute --> hidden + * 2. Check if the any of the current nodes parents are hidden with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are hidden then this + * function will return false (node is not visible). + * + * Note: nodes with CSS properties opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * Note: nodes hidden off screen or behind another object: they are not considered hidden. + * They are exposed in the accessibility tree and they can even name on-screen objects. + * + * @parm {element} node The node which should be checked if it is visible or not. + * @return {bool} false if the node is NOT visible, true otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisible = function (nodeIn) { + // Check the nodeType if this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // visibility is directly related to the parent node. + if (nodeIn.nodeType === 3) { + nodeIn = DOMWalker_1.DOMWalker.parentNode(nodeIn); + } + var node = nodeIn; + // We should only allow nodeType element, and TextNode all other nodesTypes + // we can return the visibility as visible. + // Following nodes will be returned as visable by default, since we can not + // actually change their visibility. + // Node.PROCESSING_INSTRUCTION_NODE --> 7 + // Node.COMMENT_NODE --> 8 + // 9 /* Node.DOCUMENT_NODE */ --> 9 + // Node.DOCUMENT_TYPE_NODE --> 10 + // Node.DOCUMENT_FRAGMENT_NODE --> 11 + if (node.nodeType !== 1) { + return true; + } + // Make sure that the ownerDocument is present before moving forward + // in detecting if the node is visible or not. In the case that ownerDocument + // does not exist then we simply return node is visible by default. + if (!node.ownerDocument) { + return true; + } + // Variable Declaration + var compStyle; + var nodeName = node.nodeName.toLowerCase(); + // In the case this node is a script, link or style node, right away return node is visible + // because scripts, links and style nodes can not be hidden by HTML attribute or CSS or are hidden by default. But we want to scan + // the elements everytime as they render content still which is still visible to users. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // datalist --> In the rendering, the datalist element represents nothing and it, along with its children, should be hidden. + if (VisUtil.hiddenByDefaultElements != null && VisUtil.hiddenByDefaultElements != undefined && VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) { + //return true; + return false; + } + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined); + if (cacheVal !== undefined) { + return cacheVal; + } + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + cacheVal = CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + // Check if this node is visible, we check couple of CSS properties and hidden attribute. + // area, param and audio elements we do not check if they are hidden as it does not apply to them. + // Check the unhideableElements array which is part of the rules, to check if this element is allowed to be hidden or not + // in the case that the element is part of the unhideableElements array then we do not run the hidden check on this element, + // and go stright to the parent node. + // Array check elements like: + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // In the case that unhideableElements array is not defined then we just scan all elements and do no filtering at all. + if (VisUtil.unhideableElements === null || VisUtil.unhideableElements === undefined || VisUtil.unhideableElements.indexOf(nodeName) === -1) { + // Check if defaultView exists for this node, if it does then use this to run the getComputedStyle + // function to get the CSS style for the node. + if (node.ownerDocument.defaultView) { + // Run the getComputedStyle on this node to fetch the CSS compuation of the node + compStyle = node.ownerDocument.defaultView.getComputedStyle(node, null); + } + // In the case that defaultView does not exists return true to identify that this + // node is visible, because were not able to detect if it was not. + else { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // Get the hidden element property and hidden attribute + var hiddenAttribute = node.getAttribute("hidden"); + var hiddenPropertyCustom = cacheVal; + // To get the hidden property we need to perform a special check as in some cases the hidden property will not be + // a boolean, for theses cases we set it to false as we are not able to determine the true hidden condition. + // The reason for this is because form elements are able to perform an override, so when we have id="hidden" for an element + // which is under the form element then, node.hidden gives the element/list of elements which have id="hidden". Refer to + // mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1267356 + var hiddenProperty = typeof node.hidden === "boolean" ? node.hidden : false; + // If compStyle object is empty, node does't have hidden property, node does't have hidden attribute and does't have custom PT + // hidden property then we can just return true (node visible) at this point. + if (!compStyle && + !hiddenProperty && // this covers false, null, or undefined + (hiddenAttribute === null || hiddenAttribute === undefined) && + !hiddenPropertyCustom // This covers false, null or undefined + ) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // In the case that the compStyle is defined we check the following: + // CSS style display set to none + // CSS style visibility set to hidden + // Note: For this property since it is inherited, need to skip the check on parents as + // the parent can have hidden but the child can be visible. So we only check this property + // on child elements/elements that are passed to this function the first time. + // node hidden property set (node.hidden) + // node attribute hidden set (to any value) + // node custom hidden property ser (node.PT_NODE_HIDDEN) + // If any of the above conditions are true then we return false as this element is not visible + if ((compStyle !== null && ((compStyle.getPropertyValue('display') === 'none' || + (!CacheUtil_1.CacheUtil.getCache(node, "Visibility_Check_Parent", null) && compStyle.getPropertyValue('visibility') === 'hidden'))) || + (compStyle.getPropertyValue('display') !== 'block' && (hiddenProperty || hiddenAttribute != null || hiddenPropertyCustom)))) { + // Set a custom expandos property on the the node to identify that it is hidden, so that we can uses + // use this in the rules to determine if the node is hidden or not, if we need to. + // Use expandos property instead of a hash map which stores the elements, adding/checking expandos + // properties is a lot faster performance whise. For Hash map we need to store based on xpath, and to calculate + // xpath it is more performance impact. + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check content-visibility: if the content-visibility is hidden, then, return false as the element is not visible + if (VisUtil.isContentHidden(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check hidden by clip-path + // TODO: need to check if hidden content contains focusable elements, similarly to offscreen content + if (ClipPathUtil_1.ClipPathUtil.isNodeVisuallyHiddenByClipPath(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is visible or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // When we have a parent element going through the isNodeVisible function we have to mark it as such + // so that in the function we can skip checking visibility: hidden for parent elements since visibility: hidden + // is inherited, which allows a child to have a different setting then the child. This property only needs to be checked + // once for the first element that is passed down and that is all. Ignore it for all the parents that we iterate over. + CacheUtil_1.CacheUtil.setCache(parentElement, "Visibility_Check_Parent", true); + // Check upwards recursively, and save the results in an variable + var nodeVisible = VisUtil.isNodeVisible(parentElement); + // If the node is found to not be visible then add the custom PT_NODE_HIDDEN to true. + // so that we can use this in the rules. + // if (!nodeVisible) { + // CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + // } + // Check upwards recursively + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", nodeVisible); + } + // Return true (node is visible) + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + }; + /** + * This function is responsible for checking if the node that is visually hidden by clipping or opaq: + * 1. Check if the current node is visually hidden: + * CSS --> clip: rect(0px, 0px, 0px, 0px) + * CSS --> opacity: 0 + * + * Note: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note: nodes with CSS properties clip: rect(0px, 0px, 0px, 0px) or opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden to an AT. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * @parm {element} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisuallyHidden = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN", undefined); + if (hidden === undefined) { + // defined styles only give the styles that changed + var comp_styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if ((comp_styles['position'] === 'absolute' && comp_styles['clip'] && comp_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)') + || (comp_styles['opacity'] && parseFloat(comp_styles['opacity']) < 0.1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", true); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentElement(elem); + if (!parentElement) + return false; + // Check upwards recursively + var hid = VisUtil.isNodeVisuallyHidden(parentElement); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", hid); + return hid; + } + return hidden; + }; + /** + * return true if the node or its ancestor is hidden by CSS content-visibility:hidden + * At this time, CSS content-visibility is partially supported by Chrome & Edge, but not supported by Firefox + * The implementation TEMPORARILY follows the Chrome test results: + * if content-visibility:hidden + * if the element is block-level (default or specified by the user), then the element and its children are normally hidden; + * if the element is inline (default or specified by the user), then the element and its children are normally NOT hidden; + * + * @param node + */ + VisUtil.isContentHidden = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_ContentHidden", undefined); + if (vis !== undefined) + return vis; + var style = getComputedStyle(node); + if (!style) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var content_visibility = style.getPropertyValue("content-visibility"); + if (content_visibility !== 'hidden') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var display = style.getPropertyValue("display"); + // inline element only + if (display === 'inline') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", true); + return true; + }; + /** + * return true if the node is offscreen by CSS position + * @param node + */ + VisUtil.isElementOffscreen = function (node) { + if (!node) + return true; + if (node.nodeType !== 1) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_Offscreen", undefined); + if (vis !== undefined) + return vis; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(node); + if (!bounds) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + if (bounds['height'] === 0 || bounds['width'] === 0 || (bounds['top'] + bounds['height']) <= 0 || (bounds['left'] + bounds['width']) <= 0) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodeHiddenFromAT = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HiddenFromAT", undefined); + if (vis !== undefined) + return vis; + if (!VisUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + var ancestor = DOMUtil_1.DOMUtil.getAncestorWithAttribute(node, "aria-hidden", "true"); + if (ancestor) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodePresentational = function (node) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(node); + if (role && (role === 'none' || role === 'presentation')) + return true; + return false; + }; + /** + * return true if the element is scrollable + * @param node + */ + VisUtil.isElementScrollable = function (elem) { + if (!elem) + return false; + var styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if (!styles) + return false; + var x_scroll = styles.getPropertyValue('overflow-x'); + var y_scroll = styles.getPropertyValue('overflow-y'); + //console.log("before node="+ elem.nodeName +", id="+elem.getAttribute("id") +", x_scroll="+x_scroll + ", y_scroll="+y_scroll); + // If overflow-y is hidden, scroll, or auto, and the overflow-x property is visible (default), the value will be implicitly computed as auto. + if (x_scroll === 'visible' && (y_scroll === 'hidden' || y_scroll === 'scroll' || y_scroll === 'auto')) + x_scroll = 'auto'; + // If overflow-x is hidden, scroll, or auto and the overflow-y property is visible (default), the value will be implicitly computed as auto. + if (y_scroll === 'visible' && (x_scroll === 'hidden' || x_scroll === 'scroll' || x_scroll === 'auto')) + y_scroll = 'auto'; + // setting overflow to clip in one direction when it isn't set to visible or clip in the other direction results in the clip value behaving as hidden. + if (x_scroll === 'clip' && y_scroll !== 'visible' && y_scroll !== 'clip') + x_scroll = 'hidden'; + if (y_scroll === 'clip' && x_scroll !== 'visible' && x_scroll !== 'clip') + y_scroll = 'hidden'; + // not scrollable: no scroll bars + if ((x_scroll === 'visible' || x_scroll === 'hidden' || x_scroll === 'clip') + && (y_scroll === 'visible' || y_scroll === 'hidden' || y_scroll === 'clip')) + return false; + // false if the overall scrollable element (clientWidth + scrollbarWidth and clientHeight + scrollbarHeight) is too small to be visible on screen + if (Math.max(elem.offsetWidth, elem.offsetHeight) < 30 || Math.min(elem.offsetWidth, elem.offsetHeight) < 15) + return false; + // false if content is smaller than the scrollable container: both x and y scroll distances < element's horizontal/vertical padding + var padding_x = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingLeft, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingRight, elem); + var padding_y = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingTop, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingBottom, elem); + if (elem.scrollWidth - elem.clientWidth < 1 + padding_x + && elem.scrollHeight - elem.clientHeight < 1 + padding_y) + return false; + return true; + }; + // This list contains a list of element tags which can not be hidden, when hidden is + // added to theses elements it does not do anything at all. + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // Note: All element tags that are added here should be added as lowercase, as we are using indexOf to do the check. + VisUtil.unhideableElements = ['area', 'param', 'audio']; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + // on theses elements we need to make then visible by default so that the rules can trigger regardless of the + // Check Hidden Content option in the tools. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // head --> head elements have display: none by default, but it will still behave correct + // title --> title elements have display: none by default, but it will still display the title. remove title from the list because a title can be a child of a svg element too + // meta --> meta elements have display: none by default, but it will still perform the action that meta is suppose to + // base --> base elements have display: none by default, but it will still perform the action that meta is suppose to + // noscript --> noscript elements have display: none by default, but it will still perform the action that meta is suppose to + // template --> template elements have display: none by default, because they are just a mechanism for holding client-side content + // that is not to be rendered when a page is loaded. https://developer.mozilla.org/en/docs/Web/HTML/Element/template + // datalist --> datalist elements have display: none by default, + VisUtil.hiddenByDefaultElements = ['script', 'link', 'style', 'head', 'meta', 'base', 'noscript', 'template', 'datalist']; + return VisUtil; +}()); +exports.VisUtil = VisUtil; + + +/***/ }, + +/***/ "./src/v4/sc-urls.json" +/*!*****************************!*\ + !*** ./src/v4/sc-urls.json ***! + \*****************************/ +(module) { + +module.exports = /*#__PURE__*/JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}'); + +/***/ } + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ const __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ const cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ const module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ if (!(moduleId in __webpack_modules__)) { +/******/ delete __webpack_module_cache__[moduleId]; +/******/ const e = new Error("Cannot find module '" + moduleId + "'"); +/******/ e.code = 'MODULE_NOT_FOUND'; +/******/ throw e; +/******/ } +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +let __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +let exports = __webpack_exports__; +/*!**********************!*\ + !*** ./src/index.ts ***! + \**********************/ + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkDemo = exports.SRViewer = exports.SRCursor = exports.SRController = exports.DOMWalker = exports.Config = exports.ARIAMapper = exports.Checker = exports.Context = void 0; +var Context_1 = __webpack_require__(/*! ./v2/common/Context */ "./src/v2/common/Context.ts"); +Object.defineProperty(exports, "Context", ({ enumerable: true, get: function () { return Context_1.Context; } })); +// import { Simulator } from "./v2/simulator" +var Checker_1 = __webpack_require__(/*! ./v4/checker/Checker */ "./src/v4/checker/Checker.ts"); +Object.defineProperty(exports, "Checker", ({ enumerable: true, get: function () { return Checker_1.Checker; } })); +var ARIAMapper_1 = __webpack_require__(/*! ./v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +Object.defineProperty(exports, "ARIAMapper", ({ enumerable: true, get: function () { return ARIAMapper_1.ARIAMapper; } })); +var Config_1 = __webpack_require__(/*! ./v2/config/Config */ "./src/v2/config/Config.ts"); +Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return Config_1.Config; } })); +var DOMWalker_1 = __webpack_require__(/*! ./v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +Object.defineProperty(exports, "DOMWalker", ({ enumerable: true, get: function () { return DOMWalker_1.DOMWalker; } })); +var SRController_1 = __webpack_require__(/*! ./v4/simulator/SRController */ "./src/v4/simulator/SRController.ts"); +Object.defineProperty(exports, "SRController", ({ enumerable: true, get: function () { return SRController_1.SRController; } })); +var SRCursor_1 = __webpack_require__(/*! ./v4/simulator/SRCursor */ "./src/v4/simulator/SRCursor.ts"); +Object.defineProperty(exports, "SRCursor", ({ enumerable: true, get: function () { return SRCursor_1.SRCursor; } })); +var SRViewer_1 = __webpack_require__(/*! ./v4/simulator/SRViewer */ "./src/v4/simulator/SRViewer.ts"); +Object.defineProperty(exports, "SRViewer", ({ enumerable: true, get: function () { return SRViewer_1.SRViewer; } })); +function checkDemo(timeout) { + if (!timeout) + timeout = 0; + var checker = new Checker_1.Checker(); + setTimeout(function () { + checker.check(document.documentElement, ["IBM_Accessibility", "IBM_Design"]) + .then(function (report) { + console.log(report); + var vals = { + "FAIL": 0, + "POTENTIAL": 1, + "MANUAL": 2, + "PASS": 3 + }; + for (var idx = 0; idx < report.results.length; ++idx) { + if (report.results[idx].value[1] === "PASS") { + report.results.splice(idx--, 1); + } + } + report.results.sort(function (a, b) { + if (a.category != b.category) { + return a.category.localeCompare(b.category); + } + if (a.path["aria"] === b.path["aria"]) { + return vals[a.value[1]] - vals[b.value[1]]; + } + return a.path["aria"].localeCompare(b.path["aria"]); + }); + var lastPath = null; + var category = null; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (category !== result.category) { + if (category !== null) { + console.groupEnd(); + console.groupEnd(); + lastPath = null; + } + category = result.category; + console.group(result.category); + } + if (result.path["aria"] != lastPath) { + if (lastPath !== null) { + console.groupEnd(); + } + lastPath = result.path["aria"]; + if (lastPath === "") { + console.group("page"); + } + else { + console.group(lastPath); + } + } + console.log(result.value, result.message); + } + console.groupEnd(); + console.groupEnd(); + }); + }, timeout); +} +exports.checkDemo = checkDemo; + +})(); + +ace = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzdtRyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFILENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM3aUUsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM1ekQsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDenhCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDM2pCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeGtFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ25xQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2xsQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzNUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDempFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN2MUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzK0YsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9pQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9uRSxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDblcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzOUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDN3BHLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4cUcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4eUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbmpCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2gzQyxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbjVELENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzE4QyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0NBQzdtQyxDQUFDO0FBR0Y7SUFBQTtJQXFDQSxDQUFDO0lBbkNHLHdEQUF3RDtJQUMxQyxnQkFBTyxHQUFyQixVQUFzQixPQUFlO1FBQ2pD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SSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7bUJBQ2xLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7bUJBQzNJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7dUJBQ3JJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0NBRXRLLHlCQUFhLEVBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLEVB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QUFRLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoQixDQUFDO0FBeERELDhCQXdEQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFEZWZpbml0aW9ucy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvYXJpYS9BUklBTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFXYWxrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29tbW9uL0NvbW1vbk1hcHBlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29tbW9uL0NvbnRleHQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NvbW1vbi9FbmdpbmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NvbmZpZy9Db25maWcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9ET01NYXBwZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9ET01VdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9kb20vRE9NV2Fsa2VyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9hcGkvSUd1aWRlbGluZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvYXBpL0lSdWxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9jaGVja2VyL0NoZWNrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FfdGFyZ2V0X3dhcm5pbmcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FfdGV4dF9wdXJwb3NlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcHBsZXRfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmVhX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2FsbG93ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2NvbmZsaWN0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYmFubmVyX3NpbmdsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jaGlsZF90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jaGlsZF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50X2luX2xhbmRtYXJrLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50aW5mb19taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29udGVudGluZm9fc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Rlc2NlbmRhbnRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2dyYXBoaWNfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfaGlkZGVuX25vbnRhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2lkX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9pbWdfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbWFpbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbWFpbl9sYWJlbF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3BhcmVudF9yZXF1aXJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JlZ2lvbl9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yb2xlX2FsbG93ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcm9sZV9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9zZW1hbnRpY3MudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfd2lkZ2V0X2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hc2NpaWFydF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ibGlua19jc3NfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ibGlua19lbGVtX2RlcHJlY2F0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Jsb2NrcXVvdGVfY2l0ZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NhbnZhc19jb250ZW50X2Rlc2NyaWJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY2FwdGlvbl90cmFja19leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2Rlc2lnbl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9oYXNwb3B1cF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kZWJ1Z19wYXRocy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZGV0ZWN0b3JfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Rpcl9hdHRyaWJ1dGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Rvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9pZF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfbGFuZ192YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3RhYmJhYmxlX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VtYmVkX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Vtb3RpY29uc19hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lcnJvcl9tZXNzYWdlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZmllbGRzZXRfbGFiZWxfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZpZWxkc2V0X2xlZ2VuZF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZmlndXJlX2xhYmVsX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9mb250X2NvbG9yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX2ludGVyYWN0aW9uX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fc3VibWl0X2J1dHRvbl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fc3VibWl0X3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZnJhbWVfc3JjX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mcmFtZV90aXRsZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2hlYWRpbmdfY29udGVudF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2hlYWRpbmdfbWFya3VwX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaHRtbF9sYW5nX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaHRtbF9za2lwbmF2X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWFnZW1hcF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X2JhY2tncm91bmQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfZGVjb3JhdGl2ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfbnVsbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19pc21hcF9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19sb25nZGVzY19taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2luZGV4LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9hdXRvY29tcGxldGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfZmllbGRzX2dyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2hhc3BvcHVwX2NvbmZsaWN0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF9hZnRlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfYmVmb3JlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X29uY2hhbmdlX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGFiZWxfY29udGVudF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xhYmVsX25hbWVfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGFiZWxfcmVmX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9saXN0X2NoaWxkcmVuX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9saXN0X21hcmt1cF9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xpc3Rfc3RydWN0dXJlX3Byb3Blci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWFycXVlZV9lbGVtX2F2b2lkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hbHRfYnJpZWYudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2xpdmVfY2FwdGlvbmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV90cmFja19hdmFpbGFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21ldGFfcmVkaXJlY3Rfb3B0aW9uYWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21ldGFfcmVmcmVzaF9kZWxheS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWV0YV92aWV3cG9ydF96b29tYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbm9lbWJlZF9jb250ZW50X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvb2JqZWN0X3RleHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9wYWdlX3RpdGxlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvcGFnZV90aXRsZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfb25jbGlja19hdm9pZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X29uY2xpY2tfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfc2VsZWN0X3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2VsZWN0X29wdGlvbnNfZ3JvdXBlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2tpcF9tYWluX2Rlc2NyaWJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2tpcF9tYWluX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9jb2xvcl9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2ZvY3VzX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9ob3Zlcl9wZXJzaXN0ZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV92aWV3cG9ydF9yZXNpemFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N2Z19ncmFwaGljc19sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfYXJpYV9kZXNjZW5kYW50cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfY2FwdGlvbl9lbXB0eS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfY2FwdGlvbl9uZXN0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2hlYWRlcnNfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9oZWFkZXJzX3JlZl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfaGVhZGVyc19yZWxhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9sYXlvdXRfbGluZWFyaXplZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc2NvcGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX3N0cnVjdHVyZV9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX3N1bW1hcnlfcmVkdW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X2Jsb2NrX2hlYWRpbmcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfY29udHJhc3Rfc3VmZmljaWVudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9xdW90ZWRfY29ycmVjdGx5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3NlbnNvcnlfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3NwYWNpbmdfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfd2hpdGVzcGFjZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvd2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvd2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXNldHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUkNvbnRyb2xsZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUkN1cnNvci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSTmF2aWdhdG9yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvU1JSZW5kZXJlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSUmVuZGVyZXJSdWxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvU1JUYWJsZVV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUlV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUlZpZXdlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL3JlbmRlcl9ydWxlcy9jb21tb24udHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9yZW5kZXJfcnVsZXMvY29udGFpbmVyX2VudGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvcmVuZGVyX3J1bGVzL2NvbnRhaW50ZXJfZXhpdC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL3JlbmRlcl9ydWxlcy9pbmRleC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9BY2NOYW1lVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9BcmlhVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9DU1NVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NhY2hlVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9DbGlwUGF0aFV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvQ29sb3JVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NvbW1vblV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvVGFibGVVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL1Zpc1V0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2FjZS8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qZ2xvYmFsIE9wZW5BamF4Ki9cbi8vIGFsbCByZWZlcmVuY2VzIHRvIFdBSS1BUklBIHNwZWNpZmljYXRpb24gaXMgdGhlIFdBSS1BUklBIDEuMlxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMi9cblxuZXhwb3J0IHR5cGUgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCA9IHtcbiAgICBpbXBsaWNpdFJvbGU6IHN0cmluZ1tdLFxuICAgIHZhbGlkUm9sZXM6IHN0cmluZ1tdLFxuICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGJvb2xlYW4sXG4gICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM/OiBzdHJpbmdbXSwgXG4gICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM/OiBzdHJpbmdbXSxcbiAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlcz86IHN0cmluZ1tdLCAvL3JvbGVzLCBvdGhlciB0aGFuIGltcGxpY2l0IGFuZCB2YWxpZCByb2xlcywgd2hvc2UgYXR0cmlidXRlcyBhcmUgYWxzbyBhbGxvd2VkXG4gICAgLy8gYSBmZXcgZWxlbWVudHMgKHN1Y2ggYXMgZGF0YWxpc3QsIGh0bWwsIGNhcHRpb24pIHRoYXQgaGF2ZSBhbiBpbXBsaWNpdCByb2xlIGJ1dCBkaXNhbGxvdyBzb21lIG9yIGFsbCBhdHRyaWJ1dGVzIGFsbG93ZWQgZm9yIHRoZSByb2xlLlxuICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU/OiBib29sZWFuLFxuICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZT86IHN0cmluZ1tdICAvL3NvbWUgZWxlbWVudHMgKHZhcixhYmJyIGV0Yy4pIGhhdmUgbm8gaW1wbGljaXQgcm9sZSBidXQgbmFtaW5nIHByb2hpYml0ZWQgICBcbn1cblxuZXhwb3J0IGNsYXNzIEFSSUFEZWZpbml0aW9ucyB7XG4gICAgc3RhdGljIG5hbWVGcm9tQ29udGVudChyb2xlOiBzdHJpbmcpIDogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAocm9sZSBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpIFxuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tIFxuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tLmluY2x1ZGVzKFwiY29udGVudHNcIik7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBhcnJheSBvZiBXQUktQVJJQSBnbG9iYWwgc3RhdGVzIGFuZCBwcm9wZXJ0aWVzXG4gICAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4yLyNnbG9iYWxfc3RhdGVzXG4gICAgICovXG4gICAgc3RhdGljIGdsb2JhbFByb3BlcnRpZXMgOiBzdHJpbmdbXSA9IFtcImFyaWEtYXRvbWljXCIsIFwiYXJpYS1idXN5XCIsIFwiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtY3VycmVudFwiLCBcImFyaWEtZGVzY3JpYmVkYnlcIiwgXG4gICAgICAgIFwiYXJpYS1kZXRhaWxzXCIsIFwiYXJpYS1mbG93dG9cIiwgXCJhcmlhLWhpZGRlblwiLCBcImFyaWEta2V5c2hvcnRjdXRzXCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiLCBcImFyaWEtbGl2ZVwiLCBcImFyaWEtb3duc1wiLCBcImFyaWEtcmVsZXZhbnRcIiwgXCJhcmlhLXJvbGVkZXNjcmlwdGlvblwiXG4gICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgYXJlIGRlcHJlY2F0ZWQgaW4gQVJJQSAxLjIsIHdpbGwgaW5kaWNhdGUgZGVwcmVjYXRpb24gaW4gaW5kaXZpZHVhbCByb2xlXG4gICAgICAgICwgJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXG4gICAgXTtcblxuICAgIC8vcHJvcGVydGllcyBjb250YWlucyBpZChzKSB0aGF0IHJlZmVyIHRvIG90aGVyIGVsZW1lbnQocylcbiAgICBzdGF0aWMgcmVmZXJlbmNlUHJvcGVydGllcyA6IHN0cmluZ1tdID0gW1wiYXJpYS1vd25zXCIsIFwiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtZGVzY3JpYmVkYnlcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIiwgXCJhcmlhLWZsb3d0b1wiLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXTtcblxuICAgIC8vIGRlcHJlY2F0ZWQgcm9sZXNcbiAgICBzdGF0aWMgZ2xvYmFsRGVwcmVjYXRlZFJvbGVzIDogc3RyaW5nW10gPSBbXG4gICAgICAgICdkaXJlY3RvcnknLCAnZG9jLWJpYmxpb2VudHJ5JywgJ2RvYy1lbmRub3RlJ1xuICAgIF07XG5cbiAgICAvLyB0aGUgZm9sbG93aW5nIGFyZSBkZXByZWNhdGVkIGluIEFSSUEgMS4xIGZvciBhbGwgdGhlIHJvbGVzXG4gICAgc3RhdGljIGdsb2JhbERlcHJlY2F0ZWRQcm9wZXJ0aWVzIDogc3RyaW5nW10gPSBbXG4gICAgICAgICdhcmlhLWdyYWJiZWQnLCAnYXJpYS1kcm9wZWZmZWN0J1xuICAgIF07XG4gICAgXG4gICAgLypcbiAgICAgKiBYU0QgZGF0YSB0eXBlcyBmb3IgYWxsIFdBSS1BUklBIHByb3BlcnRpZXNcbiAgICAgKiBhbG9uZyB3aXRoIHZhbGlkIHZhbHVlcyB3aGVuIHRoZSBkYXRhIHR5cGUgaXMgTk1UT0tFTlxuICAgICAqIFdBSS1BUklBIHByb3BlcnRpZXMgZGF0YSB0eXBlcyBleHBsYW5lZDpcbiAgICAgKiAgdHlwZTogVXNlZCB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiB2YWx1ZXMgYWxsb3dlZCBmb3IgdGhlIFdBSS1BUklBIHByb3BlcnR5XG4gICAgICogIHZhbHVlczogVXNlZCB0byBpZGVudGlmeSBzcGVjaWZpYyB2YWx1ZXMgb2YgYW4gV0FJLUFSSUEgcHJvcGVydHkgd2hlbiB0eXBlIGlzIG5tdG9rZW5cbiAgICAgKiAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IFVzZWQgdG8gaWRlbnRpZnkgaWYgdGhlIFdBSS1BUklBIHByb3BlcnR5IHN1cHBvcnRzIHJlZmVyZW5jaW5nIGhpZGRlbiBJRFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlOiByZWZlcnMgdG8gV0FJLUFSSUEgcHJvcGVydHkgc3VwcG9ydHMgaGlkZGVuIElEIHJlZmVyZW5jZXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U6IHJlZmVycyB0byBXQUktQVJJQSBwcm9wZXJ0eSBkb2VzIG5vdCBzdXBwb3J0IGhpZGRlbiBJRCByZWZlcmVuY2VzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlIHdpbGwgYmUgc2V0IHRvIGZhbHNlLCBpZiBub3Qgc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIHN0YXRpYyBwcm9wZXJ0eURhdGFUeXBlcyA6IHsgXG4gICAgICAgIFtwcm9wOiBzdHJpbmddIDogeyBcbiAgICAgICAgICAgIHR5cGU6IHN0cmluZywgXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZD86IGJvb2xlYW4sXG4gICAgICAgICAgICB2YWx1ZXM/OiBzdHJpbmdbXSBcbiAgICAgICAgfVxuICAgIH0gPSB7XG4gICAgICAgIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1hdG9taWNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWF1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiaW5saW5lXCIsIFwibGlzdFwiLCBcImJvdGhcIiwgXCJub25lXCIsIFwidW5kZWZpbmVkXCJdIC8vYWRkIHVuZGVmaW5lZCB0byBoYW5kbGUgdmFsdWUgZW1wdHlcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWJ1c3lcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcIm1peGVkXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jb2xjb3VudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jb2xpbmRleFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jb2xzcGFuXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbnRyb2xzXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY3VycmVudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wicGFnZVwiLCBcInN0ZXBcIiwgXCJsb2NhdGlvblwiLCBcImRhdGVcIiwgXCJ0aW1lXCIsIFwidHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdIC8vYWRkIHVuZGVmaW5lZCBmb3IgZW1wdHkgdmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGV0YWlsc1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kaXNhYmxlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZHJvcGVmZmVjdFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5zXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImNvcHlcIiwgXCJtb3ZlXCIsIFwibGlua1wiLCBcImV4ZWN1dGVcIiwgXCJwb3B1cFwiLCBcIm5vbmVcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWVycm9ybWVzc2FnZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZmxvd3RvXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWdyYWJiZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcIm1lbnVcIiwgXCJsaXN0Ym94XCIsIFwidHJlZVwiLCBcImdyaWRcIiwgXCJkaWFsb2dcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1pbnZhbGlkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJzcGVsbGluZ1wiLCBcImdyYW1tYXJcIiwgXCJ1bmRlZmluZWRcIl0gLy9hZGQgdW5kZWZpbmVkIGZvciBlbXB0eSB2YWx1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEta2V5c2hvcnRjdXRzXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxhYmVsbGVkYnlcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1sZXZlbFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1saXZlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJvZmZcIiwgXCJwb2xpdGVcIiwgXCJhc3NlcnRpdmVcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW1vZGFsXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tdWx0aWxpbmVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImhvcml6b250YWxcIiwgXCJ2ZXJ0aWNhbFwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtb3duc1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXBvc2luc2V0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXByZXNzZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcIm1peGVkXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZWFkb25seVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVsZXZhbnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2Vuc1wiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJhZGRpdGlvbnNcIiwgXCJyZW1vdmFsc1wiLCBcInRleHRcIiwgXCJhbGxcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb2xlZGVzY3JpcHRpb25cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93Y291bnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93aW5kZXhcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93c3BhblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1zZXRzaXplXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXNvcnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImFzY2VuZGluZ1wiLCBcImRlc2NlbmRpbmdcIiwgXCJvdGhlclwiLCBcIm5vbmVcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWVub3dcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVldGV4dFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGRlc2lnbiBwYXR0ZXJucyBmb3IgY29uY3JldGUgV0FJLUFSSUEgcm9sZXNcbiAgICAgKiBsZWdpdGltYXRlIGtleXMgZm9yIGVhY2ggcm9sZSBpbmNsdWRlOlxuICAgICAqXG4gICAgICogLSBjb250YWluZXI6IGFwcHJvcHJpYXRlIGNvbnRhaW5lcihzKSBmb3IgdGhhdCByb2xlXG4gICAgICogLSBwcm9wczogc3RhdGVzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvbGUgKGluIGFkZGl0aW9uIHRvIHRoZSBnbG9iYWwgc3RhdGVzIGFuZCBwcm9wZXJ0aWVzIGxpc3RlZCBhYm92ZSlcbiAgICAgKiAtIHJlcVByb3BzOiByZXF1aXJlZCBzdGF0ZXMgb3IgcHJvcGVydGllcyBmb3IgdGhpcyByb2xlXG4gICAgICogLSByZXFDaGlsZHJlbjogcmVxdWlyZWQgY2hpbGRyZW4gZm9yIHRoaXMgcm9sZVxuICAgICAqIC0gaHRtbEVxdWl2OiBIVE1MIGVxdWl2YWxlbnQgZm9yIHRoaXMgcm9sZVxuICAgICAqIC0gcm9sZVR5cGU6IG9uZSBvZiB3aWRnZXQsIHN0cnVjdHVyZSwgbGFuZG1hcmssIGxpdmVSZWdpb24sIHdpbmRvdyAoYXMgc2VlbiBpbiBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4yLyNyb2xlc19jYXRlZ29yaXphdGlvbilcbiAgICAgKiAtIG5hbWVSZXF1aXJlZDogZGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGFjY2Vzc2libGUgbmFtZSBpcyByZXF1aXJlZCBmb3IgYSB3aWRnZXQgKHNlZSBBUklBIHNwZWMuKVxuICAgICAqIC0gbmFtZUZyb206IGRldGVybWluZXMgaG93IGFuIGFjY2Vzc2libGUgbmFtZSBpcyBzdXBwbGllZCAoYXV0aG9yIG9yIGNvbnRlbnQgLSBzZWUgQVJJQSBzcGVjLilcbiAgICAgKiAtIGRlcHJlY2F0ZWQ6IGlmIHByZXNlbnQsIGluZGljYXRlcyB0aGF0IHRoZSByb2xlIGlzIGRlcHJlY2F0ZWQsIGFuZCBwcm92aWRlcyBhIGxpc3Qgb2YgYWx0ZXJuYXRpdmUgcm9sZShzKVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNpZ25QYXR0ZXJucyA6IHtcbiAgICAgICAgW3JvbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogc3RyaW5nW10sXG4gICAgICAgICAgICBwcm9wczogc3RyaW5nW10sXG4gICAgICAgICAgICByZXFQcm9wczogc3RyaW5nW10sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogc3RyaW5nW10sXG4gICAgICAgICAgICBodG1sRXF1aXY6IHN0cmluZyxcbiAgICAgICAgICAgIHJvbGVUeXBlPzogc3RyaW5nLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIG5hbWVGcm9tPzogc3RyaW5nW10sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuPzogYm9vbGVhbixcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ/OiBib29sZWFuLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzPzogc3RyaW5nW11cbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wcz86IHN0cmluZ1tdXG4gICAgICAgIH1cbiAgICB9ID0ge1xuICAgICAgICBcImFsZXJ0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImFsZXJ0ZGlhbG9nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW1vZGFsXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpbmRvd1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYXBwbGljYXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtZXhwYW5kZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIGNhbiBiZSBcIndpZGdldFwiXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYXJ0aWNsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYmFubmVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJsb2NrcXVvdGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJ1dHRvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcHJlc3NlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYnV0dG9uIHwgaW5wdXRbQHR5cGU9J2J1dHRvbiddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZmlndXJlXCIsIFwiZ3JpZFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNlbGxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjaGVja2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSdjaGVja2JveCddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29kZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbHVtbmhlYWRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInJvd1wiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGluZGV4XCIsIFwiYXJpYS1jb2xzcGFuXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiLCBcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLXNvcnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRoW0BzY29wZT0nY29sJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29tYm9ib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29udHJvbHNcIiwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIl0sIC8vIGFyaWEtY29udHJvbHMgaXNuJ3QgYWN0dWFsbHkgcmVxdWlyZWQgd2hlbiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29tcGxlbWVudGFyeVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb21tZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb250ZW50aW5mb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkZWZpbml0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZGVsZXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkaWFsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbW9kYWxcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2luZG93XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGlyZWN0b3J5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddICBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiZG9jLWFic3RyYWN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1hY2tub3dsZWRnbWVudHNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWFmdGVyd29yZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYXBwZW5kaXhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJhY2tsaW5rXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9lbnRyeVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYmlibGlvZ3JhcGh5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9yZWZcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNoYXB0ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNvbG9waG9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNvbmNsdXNpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNvdmVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbWdcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNyZWRpdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY3JlZGl0c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZGVkaWNhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZW5kbm90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVuZG5vdGVzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVwaWdyYXBoXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lcGlsb2d1ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZXJyYXRhXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1leGFtcGxlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1mb290bm90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZm9yZXdvcmRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWdsb3NzYXJ5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1nbG9zc3JlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtaW5kZXhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWludHJvZHVjdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2Mtbm90ZXJlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2Mtbm90aWNlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWJyZWFrXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCJdLCAvLyBhcmlhLWRpc2FibGVkLCBhcmlhLXZhbHVlbWF4LCBhcmlhLXZhbHVlbWluLCBhcmlhLXZhbHVldGV4dCBhcmUgdmFsaWQgaWYgZm9jdXNhYmxlLiBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIGNvZGUuXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCwgLy8gYXJpYS12YWx1ZW5vdyBpcyByZXF1aXJlZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIHdpZGdldCBpZiBmb2N1c2FibGVcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWxpc3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXBhZ2Vmb290ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlaGVhZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFydFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHJlZmFjZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHJvbG9ndWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXB1bGxxdW90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXFuYVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2Mtc3VidGl0bGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXRpcFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXRvY1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2N1bWVudFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImVtcGhhc2lzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZmVlZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImFydGljbGVcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZmlndXJlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmb3JtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJmb3JtXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ2VuZXJpY1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiZGl2IHwgc3BhblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiLCBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImdyYXBoaWNzLWRvY3VtZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZ3JhcGhpY3Mtb2JqZWN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImdyYXBoaWNzLXN5bWJvbFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJncmlkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWNvbGNvdW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCJdLCAvLyByb3dncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGFibGVcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImdyaWRjZWxsXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1lcnJvcm1lc3NhZ2VcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiLCBcImFyaWEtaW52YWxpZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiLCBcImFyaWEtc2VsZWN0ZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ3JvdXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImhlYWRpbmdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1sZXZlbFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImgxIHwgaDIgfCBoMyB8IGg0IHwgaDUgfCBoNlwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaW1nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbWdcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImltZ1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJpbnNlcnRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaW5rXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaXN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wibGlzdGl0ZW1cIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwib2wgfCB1bFwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpc3Rib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwib3B0aW9uXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibGlzdGl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJsaXN0XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbGV2ZWxcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJsaVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxvZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1haW5cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWFya1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibWFya1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtYXJxdWVlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1hdGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogZmFsc2UsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWJhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLCBcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1lbnVpdGVtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JvdXBcIiwgXCJtZW51XCIsIFwibWVudWJhclwiXSwgLy8gZ3JvdXAgb25seSBjb3VudHMgYXMgYSB2YWxpZCBjb250YWluZXIgaWYgaXQgaXMgY29udGFpbmVkIGluIGEgbWVudSBvciBtZW51YmFyXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcIm1lbnVpdGVtY2hlY2tib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1lbnVpdGVtcmFkaW9cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1ldGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibmF2aWdhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJub25lXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm5vdGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiXSwgLy8gZ3JvdXAgb25seSBjb3VudHMgYXMgYSB2YWxpZCBjb250YWluZXIgaWYgaXQgaXMgY29udGFpbmVkIGluIGEgbGlzdGJveFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLWNoZWNrZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsIC8vIFwiYXJpYS1zZWxlY3RlZFwiIGhhcyBhIGRlZmF1bHRcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcIm9wdGlvblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwYXJhZ3JhcGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwcmVzZW50YXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicHJvZ3Jlc3NiYXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmFkaW9cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jaGVja2VkXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW5wdXRbQHR5cGU9J3JhZGlvJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmFkaW9ncm91cFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicmFkaW9cIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJlZ2lvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyb3dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncmlkXCIsIFwicm93Z3JvdXBcIiwgXCJ0YWJsZVwiLCBcInRyZWVncmlkXCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImNlbGxcIiwgXCJjb2x1bW5oZWFkZXJcIiwgXCJncmlkY2VsbFwiLCBcInJvd2hlYWRlclwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0clwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJvd2dyb3VwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JpZFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogW10sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGJvZHkgfCB0Zm9vdCB8IHRoZWFkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicm93aGVhZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1yb3dzcGFuXCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc29ydFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGhbQHNjb3BlPSdyb3cnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcblxuICAgICAgICBcInNjcm9sbGJhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZWFyY2hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2VhcmNoYm94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtbXVsdGlsaW5lXCIsIFwiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0nc2VhcmNoJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2VwYXJhdG9yXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCJdLCAvLyBhcmlhLWRpc2FibGVkLCBhcmlhLXZhbHVlbWF4LCBhcmlhLXZhbHVlbWluLCBhcmlhLXZhbHVldGV4dCBhcmUgdmFsaWQgaWYgZm9jdXNhYmxlLiBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIGNvZGUuXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCwgLy8gYXJpYS12YWx1ZW5vdyBpcyByZXF1aXJlZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIHdpZGdldCBpZiBmb2N1c2FibGVcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzbGlkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLXZhbHVlbm93XCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzcGluYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdGF0dXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdHJvbmdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdWJzY3JpcHRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdWdnZXN0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic3VwZXJzY3JpcHRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzd2l0Y2hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJ0YWJsaXN0XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xjb3VudFwiLCBcImFyaWEtcm93Y291bnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIiwgXCJyb3dncm91cFwiLCBcImNhcHRpb25cIl0sIC8vIHJvd2dyb3VwIGFuZCBjYXB0aW9uIGFyZSBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGFibGVcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGFibGlzdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1widGFiXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLCBcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYnBhbmVsXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0ZXJtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJkZm5cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGV4dGJveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1hdXRvY29tcGxldGVcIiwgXCJhcmlhLW11bHRpbGluZVwiLCBcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW5wdXRbQHR5cGU9J3RleHQnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0aW1lXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGltZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0b29sYmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidG9vbHRpcFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIC8vIEFSSUEgMS4yIGhhcyB0aGlzIGFzIG5hbWVSZXF1aXJlZDogdHJ1ZSwgYnV0IEFSSUEgMS4zIHJlbW92ZWQgaXQgYmVjYXVzZSBpdCBtYWtlcyBubyBzZW5zZSB0byByZXF1aXJlIGEgbmFtZSBvbiBhIHRvb2x0aXAuXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidHJlZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwidHJlZWl0ZW1cIl0sIC8vIGdyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1jb2xjb3VudFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCJdLCAvLyByb3dncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidHJlZWl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jaGVja2VkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtbGV2ZWxcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICB9IC8vIGVuZCBkZXNpZ25QYXR0ZXJuc1xuXG4gICAgLy8gY29waWVkIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLW90aGVyLmh0bWwjZGlzYWJsZWQtZWxlbWVudHNcbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbnB1dC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9BdHRyaWJ1dGVzL2Rpc2FibGVkXG4gICAgLyoqIG5vdGU6XG4gICAgICAqIGlmIGEgPGZpZWxkc2V0PiBpcyBkaXNhYmxlZCwgdGhlIGRlc2NlbmRhbnQgZm9ybSBjb250cm9scyBhcmUgYWxsIGRpc2FibGVkIGV4Y2VwdCA8bGVnZW5kPlxuICAgICAgKiBJZiBhbiA8b3B0Z3JvdXA+IGlzIGRpc2FibGVkLCB0aGUgc2VsZWN0IGlzIHN0aWxsIGludGVyYWN0aXZlICh1bmxlc3Mgb3RoZXJ3aXNlIGRpc2FibGVkKSwgYnV0IG5vbmUgb2YgdGhlIGl0ZW1zIGluIHRoZSBvcHRpb24gZ3JvdXAgYXJlIHNlbGVjdGFibGUuXG4gICAgICAqIFdoZW4gYW4gZWxlbWVudCBoYXMgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBhcHBsaWVkLCB0aGUgOmRpc2FibGVkIHBzZXVkby1jbGFzcyBhbHNvIGFwcGxpZXMgdG8gaXQuIFxuICAgICAqL1xuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWREaXNhYmxlZCA9IFtcImJ1dHRvblwiLCBcImlucHV0XCIsIFwic2VsZWN0XCIsIFwidGV4dGFyZWFcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImZpZWxkc2V0XCJdOyAvLyBhbHNvIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudFxuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWRSZXF1aXJlZCA9IFtcInNlbGVjdFwiLCBcInRleHRhcmVhXCJdOyAvLyByZW1vdmUgJ2lucHV0JyBhbmQgYWRkIHRvIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnQsIGJlY3Vhc2UgcmVxdWlyZWQgaXMgbm90IHN1cHBvcnRlZCBvbiBpbnB1dEB0eXBlPVwicmFuZ2VcIiwgXCJjb2xvclwiLCBcImhpZGRlblwiIG9yIGFueSBidXR0b24gdHlwZXNcbiAgICBzdGF0aWMgZWxlbWVudHNBbGxvd2VkUmVhZE9ubHkgPSBbXCJ0ZXh0YXJlYVwiXTsgLy8gcmVtb3ZlICdpbnB1dCcgYW5kIGFkZCB0byB0aGUgaW5kaXZpZHVhbCBlbGVtZW50LCBiZWNhdXNlIHJlYWRvbmx5IGlzIG5vdCBzdXBwb3J0ZWQgb24gaW5wdXRAdHlwZT1cImNoZWNrYm94XCIsIFwicmFkaW9cIiwgXCJyYW5nZVwiLCBcImNvbG9yXCIsIFwiZmlsZVwiLCBoaWRkZW5cIiBvciBhbnkgYnV0dG9uIHR5cGVzXG5cblxuICAgIC8qIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFyaWEvI2RvY2NvbmZvcm1hbmNlXG4gICAgICAgICogZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50IGNvbnRhaW5zIHByb3BlcnRpZXMgb2YgdGhlIHRhZ3MgcmVsYXRlZCB0byByb2xlIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgYXR0cmlidXRlIHZhbHVlXG4gICAgICAgICogZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3MgY29udGFpbnMgdGhvc2UgdGFncyB0aGF0IHJlcXVpcmUgc3BlY2lhbCBjb25zaWRlcmF0aW9uc1xuICAgICAgICAqL1xuICAgIHN0YXRpYyBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQ6IHtcbiAgICAgICAgW3JvbGU6IHN0cmluZ106IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICB9ID0ge1xuICAgICAgICBcImFiYnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFkZHJlc3NcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcnRpY2xlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJmZWVkXCIsIFwibWFpblwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXNpZGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21wbGVtZW50YXJ5XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWRlZGljYXRpb25cIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb290bm90ZVwiLCBcImRvYy1nbG9zc2FyeVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtdGlwXCIsIFwiZmVlZFwiLCBcIm5vbmVcIiwgXCJub3RlXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmVnaW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImF1ZGlvXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJhc2VcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmRpXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJiZG9cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJsb2NrcXVvdGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJibG9ja3F1b3RlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJvZHlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbJ2FyaWEtaGlkZGVuJ10sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLFwic2VwYXJhdG9yXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2FudmFzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydjYXB0aW9uJ10sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2l0ZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29kZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvZGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImNvbGdyb3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRhdGFsaXN0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdGJveFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkZWxldGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZXRhaWxzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRmblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRlcm1cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGlhbG9nXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZGlhbG9nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYWxlcnRkaWFsb2dcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgXCJkbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3RcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImR0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGVybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImxpc3RpdGVtXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImVtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJlbWJlZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWVsZHNldFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlnY2FwdGlvblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZm9ybVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImZvcm1cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImhlYWRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGdyb3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoMlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImgzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoNVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImg2XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaHJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzZXBhcmF0b3JcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtcGFnZWJyZWFrXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJodG1sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZG9jdW1lbnRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImlmcmFtZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJpbnNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbnNlcnRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwia2JkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJsYWJlbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxlZ2VuZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxpbmtcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWFpblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm1haW5cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm1hcFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXJrXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXRoXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibWF0aFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWVudVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm1ldGFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWV0ZXJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJtZXRlclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFsnYXJpYS12YWx1ZW1heCcsICdhcmlhLXZhbHVlbWluJ10sXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5hdlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm5hdmlnYXRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtaW5kZXhcIiwgXCJkb2MtcGFnZWxpc3RcIiwgXCJkb2MtdG9jXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJ0YWJsaXN0XCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJub3NjcmlwdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJvYmplY3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIiwgXCJkb2N1bWVudFwiLCBcImltZ1wiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJvbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9wdGdyb3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm9wdGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtc2VsZWN0ZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJvdXRwdXRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdGF0dXNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInBhcmFncmFwaFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJwYXJhbVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJwaWN0dXJlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlblwiXSBcbiAgICAgICAgfSxcbiAgICAgICAgXCJwcmVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInByb2dyZXNzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicHJvZ3Jlc3NiYXJcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXZhbHVlbWF4XCJdIFxuICAgICAgICB9LFxuICAgICAgICBcInFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInJwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJydFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwicnVieVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImRlbGV0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwic2FtcFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2NyaXB0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnc2VhcmNoJ10sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbJ3NlYXJjaCcsICdmb3JtJywgJ2dyb3VwJywgJ25vbmUnLCAncHJlc2VudGF0aW9uJywgJ3JlZ2lvbiddLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNsb3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic21hbGxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNvdXJjZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGFuXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdHJvbmdcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdHJvbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3R5bGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3ViXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3Vic2NyaXB0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN1cFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN1cGVyc2NyaXB0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN2Z1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyYXBoaWNzLWRvY3VtZW50XCJdLCAvLyBhcyBkZWZpbmVkIGJ5IFNWRyBBQU1cbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJsZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRhYmxlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRlbXBsYXRlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInRleHRhcmVhXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGZvb3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0aGVhZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRpbWVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0aW1lXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRpdGxlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInRyYWNrXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInVsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidmFyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ2aWRlb1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3YnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdXG4gICAgICAgIH1cbiAgICB9IC8vIGVuZCBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcblxuICAgIHN0YXRpYyBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnczoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXToge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXSA6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICAgICAgfSB8IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICB9ID0ge1xuICAgICAgICBcImFcIjoge1xuICAgICAgICAgICAgXCJ3aXRoLWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlua1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm9uLWVtcHR5IGhyZWYgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImRvYy1iYWNrbGlua1wiLCBcImRvYy1iaWJsaW9yZWZcIiwgXCJkb2MtZ2xvc3NyZWZcIiwgXCJkb2Mtbm90ZXJlZlwiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtZGlzYWJsZWQ9dHJ1ZVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2l0aG91dC1ocmVmXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGhyZWYgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmVhXCI6IHtcbiAgICAgICAgICAgIFwid2l0aC1ocmVmXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpbmtcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vbi1lbXB0eSBocmVmIGF0dHJpYnV0ZSBpcyBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gaHJlZiBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJsaW5rXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbi8vIFRPRE9cbi8vICAgICAgICBcImF1dG9ub21vdXMgY3VzdG9tIGVsZW1lbnRcIjoge1xuLy8gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIlJvbGUgZXhwb3NlZCBmcm9tIGF1dGhvciBkZWZpbmVkIEVsZW1lbnRJbnRlcm5hbHMuIE90aGVyd2lzZSBubyBjb3JyZXNwb25kaW5nIHJvbGUuXCJdLFxuLy8gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJJZiByb2xlIGRlZmluZWQgYnkgRWxlbWVudEludGVybmFsc1wiLCBcImFueSByb2xlXCIsIFwibm8gcm9sZSBPdGhlcndpc2VcIl0sXG4vLyAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbi8vICAgICAgICB9LFxuICAgICAgICBcImRpdlwiOiB7XG4gICAgICAgICAgICBcImNoaWxkLWRsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wicHJlc2VudGF0aW9uXCIsIFwibm9uZVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuby1jaGlsZC1kbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlndXJlXCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtZmlnY2FwdGlvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJmaWd1cmVcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogWydkb2MtZXhhbXBsZSddLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLWZpZ2NhcHRpb25cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZmlndXJlXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZm9vdGVyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXNlY3Rpb24tYXJ0aWNsZS1hc2lkZS1tYWluLW5hdlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWZvb3Rub3RlXCIsIFwiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbnRlbnRpbmZvXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBub3QgYSBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWZvb3Rub3RlXCIsIFwiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbi8vIFRPRE9cbi8vICAgICAgICBcImZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudFwiOiB7XG4vLyAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiUm9sZSBleHBvc2VkIGZyb20gYXV0aG9yIGRlZmluZWQgRWxlbWVudEludGVybmFscy4gT3RoZXJ3aXNlICdnZW5lcmljJy5cIl0sXG4vLyAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIklmIHJvbGUgZGVmaW5lZCBieSBFbGVtZW50SW50ZXJuYWxzXCIsIFwiZm9ybS1yZWxhdGVkIHJvbGVzOiBidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JvdXBcIiwgXCJsaXN0Ym94XCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJyYWRpb1wiLCBcInJhZGlvZ3JvdXBcIiwgXCJzZWFyY2hib3hcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCIsIFwic3dpdGNoXCIsIFwidGV4dGJveFwiLCBcIm5vIHJvbGUgT3RoZXJ3aXNlXCJdLFxuLy8gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4vLyAgICAgICAgfSxcblxuICAgICAgICBcImhlYWRlclwiOiB7XG4gICAgICAgICAgICBcImRlcy1zZWN0aW9uLWFydGljbGUtYXNpZGUtbWFpbi1uYXZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gZGVzY2VuZGFudCBvZiBhbiBhcnRpY2xlLCBhc2lkZSwgbWFpbiwgbmF2IG9yIHNlY3Rpb24gZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJiYW5uZXJcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vdCBhIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG4gICAgICAgIFwiaW1nXCI6IHtcbiAgICAgICAgICAgIFwiaW1nLXdpdGgtYWNjbmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbWdcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIndoZW4gYWNjZXNzaWJsZSBuYW1lIHByZXNlbnRzXCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYnV0dG9uXCIsIFwiY2hlY2tib3hcIiwgXCJkb2MtY292ZXJcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm1ldGVyXCIsIFwib3B0aW9uXCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJyYWRpb1wiLCBcInNjcm9sbGJhclwiLCBcInNlcGFyYXRvclwiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImltZy13aXRob3V0LWFjY25hbWUtZW1wdHktYWx0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInByZXNlbnRhdGlvblwiLCBcIm5vbmVcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIndoZW4gbm8gYWNjZXNzaWJsZSBuYW1lIHByZXNlbnRzIGFuZCBhbHQ9JydcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLCBcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW49dHJ1ZVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW1nLXdpdGhvdXQtYWNjbmFtZS1uby1hbHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaW1nXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCJ3aGVuIG5laXRoZXIgYWNjZXNzaWJsZSBuYW1lIG5vIGFsdCBwcmVzZW50c1wiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcInByZXNlbnRhdGlvblwiLCBcIm5vbmVcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsIFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlbj10cnVlXCJdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaW5wdXRcIjoge1xuICAgICAgICAgICAgXCJidXR0b25cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjaGVja2JveC13aXRoLWFyaWEtcHJlc3NlZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjaGVja2JveFwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggdHlwZT1jaGVja2JveCBhbmQgYXJpYS1wcmVzc2VkIGF0dHJpYnV0ZSBpcyBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudWl0ZW1jaGVja2JveFwiLCBcIm9wdGlvblwiLCBcInN3aXRjaFwiLCBcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNoZWNrYm94LXdpdGhvdXQtYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCB0eXBlPWNoZWNrYm94IGFuZCBhcmlhLXByZXNzZWQgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudWl0ZW1jaGVja2JveFwiLCBcIm9wdGlvblwiLCBcInN3aXRjaFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNvbG9yXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkYXRlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbWFpbC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIHR5cGU9ZW1haWwgYW5kIG5vIGxpc3QgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW1haWwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImhpZGRlblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1vbnRoXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJudW1iZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3BpbmJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInBhc3N3b3JkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInJhZGlvXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJhZGlvXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm1lbnVpdGVtcmFkaW9cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1jaGVja2VkXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJyYW5nZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzbGlkZXJcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVzZXRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWFyY2gtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzZWFyY2hib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlYXJjaC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzdWJtaXRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZWwtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZWwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY29tYm9ib3hcIiwgXCJzZWFyY2hib3hcIiwgXCJzcGluYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGFzcG9wdXBcIl0gIC8vIGNvdmVyZWQgaW4gYSBkaWZmZXJlbnQgcnVsZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidXJsLW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidXJsLXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndlZWtcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlZmF1bHQtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB3aXRoIGEgbWlzc2luZyBvciBpbnZhbGlkIHR5cGUsIHdpdGggYSBsaXN0IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZWZhdWx0LW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSwgd2l0aCBhIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImxpXCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtb2YtbGlzdC1yb2xlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnbGlzdGl0ZW0nXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLW9mLWxpc3Qtcm9sZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbJ2dlbmVyaWMnXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY3Rpb25cIjoge1xuICAgICAgICAgICAgXCJ3aXRoLW5hbWVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicmVnaW9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFsZXJ0XCIsIFwiYWxlcnRkaWFsb2dcIiwgXCJhcHBsaWNhdGlvblwiLCBcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImRpYWxvZ1wiLCBcImRvYy1hYnN0cmFjdFwiLCBcImRvYy1hY2tub3dsZWRnbWVudHNcIiwgXCJkb2MtYWZ0ZXJ3b3JkXCIsIFwiZG9jLWFwcGVuZGl4XCIsIFwiZG9jLWJpYmxpb2dyYXBoeVwiLCBcImRvYy1jaGFwdGVyXCIsIFwiZG9jLWNvbG9waG9uXCIsIFwiZG9jLWNvbmNsdXNpb25cIiwgXCJkb2MtY3JlZGl0XCIsIFwiZG9jLWNyZWRpdHNcIiwgXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1lbmRub3Rlc1wiLCBcImRvYy1lcGlncmFwaFwiLCBcImRvYy1lcGlsb2d1ZVwiLCBcImRvYy1lcnJhdGFcIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb3Jld29yZFwiLCBcImRvYy1nbG9zc2FyeVwiLCBcImRvYy1pbmRleFwiLCBcImRvYy1pbnRyb2R1Y3Rpb25cIiwgXCJkb2Mtbm90aWNlXCIsIFwiZG9jLXBhZ2VsaXN0XCIsIFwiZG9jLXBhcnRcIiwgXCJkb2MtcHJlZmFjZVwiLCBcImRvYy1wcm9sb2d1ZVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtcW5hXCIsIFwiZG9jLXRvY1wiLCBcImRvY3VtZW50XCIsIFwiZmVlZFwiLCBcImdyb3VwXCIsIFwibG9nXCIsIFwibWFpblwiLCBcIm1hcnF1ZWVcIiwgXCJuYXZpZ2F0aW9uXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIiwgXCJzdGF0dXNcIiwgXCJ0YWJwYW5lbFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LW5hbWVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbGVydFwiLCBcImFsZXJ0ZGlhbG9nXCIsIFwiYXBwbGljYXRpb25cIiwgXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIiwgXCJkaWFsb2dcIiwgXCJkb2MtYWJzdHJhY3RcIiwgXCJkb2MtYWNrbm93bGVkZ21lbnRzXCIsIFwiZG9jLWFmdGVyd29yZFwiLCBcImRvYy1hcHBlbmRpeFwiLCBcImRvYy1iaWJsaW9ncmFwaHlcIiwgXCJkb2MtY2hhcHRlclwiLCBcImRvYy1jb2xvcGhvblwiLCBcImRvYy1jb25jbHVzaW9uXCIsIFwiZG9jLWNyZWRpdFwiLCBcImRvYy1jcmVkaXRzXCIsIFwiZG9jLWRlZGljYXRpb25cIiwgXCJkb2MtZW5kbm90ZXNcIiwgXCJkb2MtZXBpZ3JhcGhcIiwgXCJkb2MtZXBpbG9ndWVcIiwgXCJkb2MtZXJyYXRhXCIsIFwiZG9jLWV4YW1wbGVcIiwgXCJkb2MtZm9yZXdvcmRcIiwgXCJkb2MtZ2xvc3NhcnlcIiwgXCJkb2MtaW5kZXhcIiwgXCJkb2MtaW50cm9kdWN0aW9uXCIsIFwiZG9jLW5vdGljZVwiLCBcImRvYy1wYWdlbGlzdFwiLCBcImRvYy1wYXJ0XCIsIFwiZG9jLXByZWZhY2VcIiwgXCJkb2MtcHJvbG9ndWVcIiwgXCJkb2MtcHVsbHF1b3RlXCIsIFwiZG9jLXFuYVwiLCBcImRvYy10b2NcIiwgXCJkb2N1bWVudFwiLCBcImZlZWRcIiwgXCJncm91cFwiLCBcImxvZ1wiLCBcIm1haW5cIiwgXCJtYXJxdWVlXCIsIFwibmF2aWdhdGlvblwiLCBcIm5vbmVcIiwgXCJub3RlXCIsIFwicHJlc2VudGF0aW9uXCIsIFwic2VhcmNoXCIsIFwic3RhdHVzXCIsIFwidGFicGFuZWxcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlbGVjdFwiOiB7XG4gICAgICAgICAgICBcIm5vLW11bHRpcGxlLWF0dHItc2l6ZS1ndDFcIjoge1xuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCBhIG11bHRpcGxlIGF0dHJpYnV0ZSBvciBhIHNpemUgYXR0cmlidXRlIGhhdmluZyB2YWx1ZSBncmVhdGVyIHRoYW4gMVwiXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJtdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCI6IHtcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggbm8gbXVsdGlwbGUgYXR0cmlidXRlIGFuZCBubyBzaXplIGF0dHJpYnV0ZSBoYXZpbmcgdmFsdWUgZ3JlYXRlciB0aGFuIDFcIlxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCJdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3VtbWFyeVwiOiB7XG4gICAgICAgICAgICBcImZpcnN0LXN1bW1hcnktb2YtZGV0YWlsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRib2R5XCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRkXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGhcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGUtcm93LXNjb3BlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2hlYWRlclwiLCBcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtdGFibGUtY29sdW1uLXNjb3BlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbHVtbmhlYWRlclwiLCBcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93aGVhZGVyXCIsIFwiZ3JpZGNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZC10cmVlZ3JpZC1jb2x1bW4tc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29sdW1uaGVhZGVyXCIsIFwiZ3JpZGNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJkZWZhdWx0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCJcIixcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfVxuICAgIH0gLy8gZW5kIG9mIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzXG5cbiAgICAvLyBtYXAgYXJpYSBhdHRyaWJ1dGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbmF0aXZlIGF0dHJpYnV0ZSwgYXBwbHkgdG8gYW55IGVsZW1lbnQgYXBwbGljYWJsZVxuICAgIC8vIG5vdGUgdGhpcyBtYXBwaW5nIGlzIGZvciB0aGUgcmVsYXRlZCBhdHRyaWJ1dGVzIGluIHRoZSBzYW1lIGVsZW1lbnQgd2l0aG91dCBjaGVja2luZyB0aGUgcGFyZW50IHRyZWUuXG4gICAgLy8gcmVmZXIgdG8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2h0bWwtYXJpYS9cbiAgICBzdGF0aWMgcmVsYXRlZEFyaWFIdG1sQXR0cmlidXRlczoge1xuICAgICAgICBbYXJpYUF0dHI6IHN0cmluZ10gOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IHN0cmluZ1tdIHwgbnVsbFxuICAgICAgICAgICAgfVtdLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc/OiB7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IHN0cmluZ1tdIHwgbnVsbFxuICAgICAgICAgICAgfVtdXG4gICAgICAgIH0gXG4gICAgfSA9ICB7XG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY2hlY2tlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY2hlY2tlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiZGlzYWJsZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImRpc2FibGVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJoaWRkZW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW1wiaGlkZGVuLG51bGxcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImhpZGRlblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJ1bnRpbC1mb3VuZFwiXVxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImhpZGRlblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJoaWRkZW4sbnVsbFwiXVxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJwbGFjZWhvbGRlclwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcIm1heFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICAgICAgLy9vdmVybGFwIGNhc2UgY292ZXJlZCBpbiB0aGUgcm9sZSBkZWZpbml0aW9uOiBBdXRob3JzIFNIT1VMRCBOT1QgdXNlIGFyaWEtdmFsdWVtYXggb24gYW55IGVsZW1lbnQgd2hpY2ggYWxsb3dzIHRoZSBtYXggYXR0cmlidXRlLiBVc2UgdGhlIG1heCBhdHRyaWJ1dGUgaW5zdGVhZC4gXG4gICAgICAgIH0sICAgIFxuICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wibWluXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAvLy8vb3ZlcmxhcCBjYXNlIGNvdmVyZWQgaW4gdGhlIHJvbGUgZGVmaW5pdGlvbjpBdXRob3JzIFNIT1VMRCBOT1QgdXNlIGFyaWEtdmFsdWVtaW4gb24gYW55IGVsZW1lbnQgd2hpY2ggYWxsb3dzIHRoZSBtaW4gYXR0cmlidXRlLiBVc2UgdGhlIG1pbiBhdHRyaWJ1dGUgaW5zdGVhZC5cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS1yZWFkb25seVwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlYWRvbmx5XCIsIFwiY29udGVudGVkaXRhYmxlXCIsIFwiaXNjb250ZW50ZWRpdGFibGVcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW251bGwsIFwiZmFsc2VcIiwgXCJmYWxzZVwiXVxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlYWRvbmx5XCIsIFwiY29udGVudGVkaXRhYmxlXCIsIFwiaXNjb250ZW50ZWRpdGFibGVcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW251bGwsIFwidHJ1ZVwiLCBcInRydWVcIl1cbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZXF1aXJlZFwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIFwiYXJpYS1jb2xzcGFuXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIHZhbHVlcyBhcmUgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcIlZBTFVFXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjb2xzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcIlZBTFVFXCJdXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICAvLyBvdmVybGFwIG9jY3VycyBpZiBib3RoIGV4aXN0c1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImNvbHNwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd3NwYW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgLy8gY29uZmxpY3Qgb2NjdXJzIGlmIGJvdGggdmFsdWVzIGFyZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiVkFMVUVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJvd3NwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW1wiVkFMVUVcIl1cbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgXG4gICAgICAgICAgICAgICAgLy8gb3ZlcmxhcCBvY2N1cnMgaWYgYm90aCBleGlzdHMgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicm93c3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LFxuICAgICAgICAvKiogXCJhcmlhLWF1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICAvLyBjb25mbGljdCBvY2N1cnMgaWYgYm90aCBleGlzdHMsIGFyaWEgdmFsdWUgaXMgb25seSBmb3IgY3VzdG9tIHdpZGdldCwgcmF0aGVyIHRoYW4gbmF0aXZlXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiYXV0b2NvbXBsZXRlXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0gKi8gXG4gICAgfVxuXG4gICAgc3RhdGljIGNvbnRhaW5lcnMgPSBbXVxufTtcblxubGV0IGNvbnRhaW5lckFycmF5ID0gW107XG5cbmZvciAoY29uc3Qgcm9sZURlc2lnbiBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpIHtcbiAgICBjb25zdCBjb250YWluZXJzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVEZXNpZ25dLmNvbnRhaW5lcjtcbiAgICBpZiAoY29udGFpbmVycyAhPT0gbnVsbCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBjb250YWluZXJzKSB7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyQXJyYXkuaW5kZXhPZihjb250YWluZXIpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyQXJyYXkucHVzaChjb250YWluZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuQVJJQURlZmluaXRpb25zLmNvbnRhaW5lcnMgPSBjb250YWluZXJBcnJheTtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4vQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBDb21tb25NYXBwZXIgfSBmcm9tIFwiLi4vY29tbW9uL0NvbW1vbk1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgSU1hcFJlc3VsdCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgQVJJQVdhbGtlciB9IGZyb20gXCIuL0FSSUFXYWxrZXJcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQWNjTmFtZVV0aWxcIjtcblxudHlwZSBFbGVtQ2FsYyA9IChlbGVtOiBFbGVtZW50KSA9PiBzdHJpbmc7XG50eXBlIE5vZGVDYWxjID0gKG5vZGU6IE5vZGUpID0+IHN0cmluZztcblxuZXhwb3J0IGNsYXNzIEFSSUFNYXBwZXIgZXh0ZW5kcyBDb21tb25NYXBwZXIge1xuICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGUobm9kZTogTm9kZSwgcm9sZTogc3RyaW5nKSA6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAvLyAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gIShyb2xlIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucyAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucHJlc2VudGF0aW9uYWxDaGlsZHJlbik7XG4gICAgfVxuICAgIGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5vZGUpO1xuICAgICAgICByZXR1cm4gcm9sZTtcbiAgICB9XG4gICAgZ2V0TmFtZXNwYWNlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcImFyaWFcIlxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9IHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHt9O1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVWYWwgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSBhcyBIVE1MRWxlbWVudCwgXCJBUklBTWFwcGVyOjpnZXRBdHRyaWJ1dGVzXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhY2hlVmFsICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gY2FjaGVWYWw7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxlbGVtLmF0dHJpYnV0ZXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJJbmZvID0gZWxlbS5hdHRyaWJ1dGVzW2lkeF07XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGF0dHJJbmZvLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiYXJpYS1cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW25hbWUuc3Vic3RyaW5nKDUpXSA9IGF0dHJJbmZvLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9wdGltaXplOiBDYWNoZSBub2RlTmFtZS50b0xvd2VyQ2FzZSgpIHRvIGF2b2lkIHJlcGVhdGVkIGNhbGxzXG4gICAgICAgICAgICBjb25zdCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQXBwbHkgZ2xvYmFsIGF0dHJpYnV0ZXMgZmlyc3RcbiAgICAgICAgICAgIEFSSUFNYXBwZXIuYXBwbHlBdHRyUm9sZShlbGVtLCBcImdsb2JhbFwiLCByZXRWYWwpO1xuICAgICAgICAgICAgLy8gQXBwbHkgZWxlbWVudC1zcGVjaWZpYyBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBBUklBTWFwcGVyLmFwcGx5QXR0clJvbGUoZWxlbSwgbm9kZU5hbWUsIHJldFZhbCk7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSBhcyBIVE1MRWxlbWVudCwgXCJBUklBTWFwcGVyOjpnZXRBdHRyaWJ1dGVzXCIsIHJldFZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgY2FsY3VsYXRvcnMgPSBBUklBTWFwcGVyLnRleHRBdHRyVmFsdWVDYWxjdWxhdG9ycztcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBjYWxjdWxhdG9ycykge1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBjYWxjdWxhdG9yc1thdHRyXShub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW2F0dHJdID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8vIE9wdGltaXplOiBNb3ZlIGFwcGx5QXR0clJvbGUgb3V0c2lkZSBnZXRBdHRyaWJ1dGVzIHRvIGF2b2lkIGZ1bmN0aW9uIHJlY3JlYXRpb25cbiAgICBwcml2YXRlIHN0YXRpYyBhcHBseUF0dHJSb2xlKGVsZW06IEVsZW1lbnQsIG5vZGVOYW1lOiBzdHJpbmcsIHJldFZhbDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0b3JzID0gQVJJQU1hcHBlci5lbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnM7XG4gICAgICAgIGlmICghKG5vZGVOYW1lIGluIGNhbGN1bGF0b3JzKSkgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCBhdHRyIGluIGNhbGN1bGF0b3JzW25vZGVOYW1lXSkge1xuICAgICAgICAgICAgaWYgKCEoYXR0ciBpbiByZXRWYWwpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gY2FsY3VsYXRvcnNbbm9kZU5hbWVdW2F0dHJdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgYXMgRWxlbUNhbGMpKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbFthdHRyXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRBcmlhT3duZWRCeShlbGVtOiBIVE1MRWxlbWVudCkgOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChlbGVtKTtcbiAgICAgICAgaWYgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIkFSSUFNYXBwZXI6OnByZWNhbGNPd25lZFwiLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG93bmVycyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFwiW2FyaWEtb3duc11cIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpT3duZXIgPSAwOyBpT3duZXIgPCBvd25lcnMubGVuZ3RoOyArK2lPd25lcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG93bmVyID0gb3duZXJzW2lPd25lcl07XG4gICAgICAgICAgICAgICAgY29uc3Qgb3duSWRzID0gb3duZXIuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpSWQ9MDsgaUlkIDwgb3duSWRzLmxlbmd0aDsgKytpSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZWQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lJZF0pO1xuICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZSBpZiB0aGUgYXJpYS1vd25zIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICAgICAgICAgICAgICAvL2lmIChvd25lZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShvd25lciwgb3duZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgIENhY2hlVXRpbC5zZXRDYWNoZShvd25lZCwgXCJhcmlhLW93bmVkXCIsIG93bmVyKTtcbiAgICAgICAgICAgICAgICAgICAgLy99XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiAgY2lyY3VsYXIgaGllcmFyY2h5IGNoZWNrOlxuICAgICAgICAgICAgICAgICAgICAgKiAgKDEpIHRoZSBvd25lZCBlbGVtZW50IGlzIG5laXRoZXIgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHRoZSBvd25lciBub3IgYW55IGFzY2VuZGFudCBvZiB0aGUgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICogICgyKSBhbnkgY2hpbGQgd2l0aCBhcmlhLW93bnMgY2Fubm90IHBvaW50IHRvIHRoZSBvd25lciBvciBhbnkgYXNjZW5kYW50IG9mIHRoZSBvd25lclxuICAgICAgICAgICAgICAgICAgICAgKi8gXG4gICAgICAgICAgICAgICAgICAgIGlmIChvd25lZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShvd25lciwgb3duZWQpKSB7ICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgb3duZWQgd2l0aCBhcmlhLW93bnMgdGhhdCBwb2ludHMgdG8gYW5vdGhlciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWROb2RlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViX293bmVycyA9IG93bmVkLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbYXJpYS1vd25zXVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViX293bmVycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Yl9vd25lciA9IHN1Yl9vd25lcnNbaV07IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Yl9vd25JZHMgPSBzdWJfb3duZXIuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqPTA7IGogPCBzdWJfb3duSWRzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG93bmVkTm9kZSA9IGRvYy5nZXRFbGVtZW50QnlJZChzdWJfb3duSWRzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkTm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkTm9kZXMucHVzaChvd25lZE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUob3duZWQsIFwiYXJpYS1vd25lZFwiLCBvd25lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYW55IGFyaWEtb3ducyBwb2ludHMgdG8gdGhlIGVsZW1lbnQgaXRzZWxmIG9yIGFueSBvZiBpdCdzIHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudCA6IEVsZW1lbnQgPSBvd25lcjsgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaXJjdWxhciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gb3duZWROb2Rlcy5zb21lKGl0ZW0gPT4gRE9NVXRpbC5zYW1lTm9kZShwYXJlbnQsIGl0ZW0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VsYXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNpcmN1bGFyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShvd25lZCwgXCJhcmlhLW93bmVkXCIsIG93bmVyKTsgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFSSUFNYXBwZXI6OnByZWNhbGNPd25lZFwiLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiYXJpYS1vd25lZFwiLCBudWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5vZGVIaWVyYXJjaHkobm9kZTogTm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBbXTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRIaWVyYXJjaHkgPSB0aGlzLmdldE5vZGVIaWVyYXJjaHkoRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkpO1xuICAgICAgICAgICAgbGV0IHBhcmVudEluZm8gPSBwYXJlbnRIaWVyYXJjaHkubGVuZ3RoID4gMCA/IHBhcmVudEhpZXJhcmNoeVtwYXJlbnRIaWVyYXJjaHkubGVuZ3RoLTFdIDoge1xuICAgICAgICAgICAgICAgIHJvbGU6IFwiXCIsXG4gICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbkNhbkhhdmVSb2xlOiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IG5vZGVIaWVyYXJjaHkgPSBbXTtcbiAgICAgICAgICAgIC8vIFNldCBoaWVyYXJjaHlcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRIaWVyYXJjaHkpIHtcbiAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2goe1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgICAgICAgIGJvdW5kczogdGhpcy5nZXRCb3VuZHMobm9kZSksXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB0aGlzLmdldE5hbWVzcGFjZSgpLFxuICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgICAgcm9sZTogdGhpcy5nZXRSb2xlKG5vZGUpIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgcm9sZVBhdGg6IHBhcmVudEluZm8ucm9sZVBhdGgrXCIvXCIrKHRoaXMuZ2V0Um9sZShub2RlKSB8fCBudWxsKSxcbiAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHt9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHBhcmVudEluZm8uY2hpbGRyZW5DYW5IYXZlUm9sZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZUhpZXJhcmNoeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGxldCBub2RlSGllcmFyY2h5IDogQXJyYXk8e1xuICAgICAgICAgICAgICAgIHJvbGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogbnVtYmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IGJvb2xlYW5cbiAgICAgICAgICAgIH0+ID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUhpZXJhcmNoeVwiLCBudWxsKTtcbiAgICAgICAgICAgIGlmICghbm9kZUhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgZWxlbWVudCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0IC0gYnV0IDo6cmVzZXQgcHJvY2Vzc2VzIHRoZW0gYWxsIGluIHRoZSByaWdodCBvcmRlclxuXG4gICAgICAgICAgICAgICAgLy8gR2V0IGRldGFpbHMgYWJvdXQgdGhlIGNvcnJlY3QgcGFyZW50IGZpcnN0XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMSkgeyBcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRIaWVyYXJjaHkgPSBwYXJlbnQgPyB0aGlzLmdldE5vZGVIaWVyYXJjaHkocGFyZW50KSA6IFtdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJbmZvID0gcGFyZW50SGllcmFyY2h5Lmxlbmd0aCA+IDAgPyBwYXJlbnRIaWVyYXJjaHlbcGFyZW50SGllcmFyY2h5Lmxlbmd0aC0xXSA6IHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnRJbmZvLnJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeShwYXJlbnQpIHx8IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHBhcmVudCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEhpZXJhcmNoeSA9IHBhcmVudCA/IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShwYXJlbnQpIDogW107XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZm8gPSBwYXJlbnRIaWVyYXJjaHlbcGFyZW50SGllcmFyY2h5Lmxlbmd0aC0xXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCBub2RlIGluZm9cbiAgICAgICAgICAgICAgICBsZXQgbm9kZUluZm8gOiB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBib3VuZHM6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICByb2xlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGU6IHN0cmluZ106IG51bWJlclxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IGJvb2xlYW5cbiAgICAgICAgICAgICAgICB9ID0ge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBlbGVtLm5vZGVUeXBlID09PSAxID8gdGhpcy5nZXRBdHRyaWJ1dGVzKGVsZW0pOiB7fSwgICBcbiAgICAgICAgICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhlbGVtKSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB0aGlzLmdldE5hbWVzcGFjZSgpLFxuICAgICAgICAgICAgICAgICAgICBub2RlOiBlbGVtLFxuICAgICAgICAgICAgICAgICAgICByb2xlOiB0aGlzLmdldFJvbGUoZWxlbSkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGp1c3Qgcm9sZSBpZiB3ZSdyZSB3aXRoaW4gYSBwcmVzZW50YXRpb25hbCBjb250YWluZXJcbiAgICAgICAgICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxDb250YWluZXIgPSAhcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlO1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25hbENvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5yb2xlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlID0gcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlIFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5jaGlsZHJlbkNhbkhhdmVSb2xlKGVsZW0sIG5vZGVJbmZvLnJvbGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcGF0aHNcbiAgICAgICAgICAgICAgICBpZiAobm9kZUluZm8ucm9sZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmZvLnJvbGVDb3VudFtub2RlSW5mby5yb2xlXSA9IChwYXJlbnRJbmZvLnJvbGVDb3VudFtub2RlSW5mby5yb2xlXSB8fCAwKSArIDE7IFxuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5yb2xlUGF0aCA9IHBhcmVudEluZm8ucm9sZVBhdGgrXCIvXCIrbm9kZUluZm8ucm9sZStcIltcIitwYXJlbnRJbmZvLnJvbGVDb3VudFtub2RlSW5mby5yb2xlXStcIl1cIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5yb2xlUGF0aCA9IHBhcmVudEluZm8ucm9sZVBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTZXQgaGllcmFyY2h5XG4gICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeSA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudEhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaChub2RlSW5mbyk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUhpZXJhcmNoeVwiLCBub2RlSGllcmFyY2h5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlSGllcmFyY2h5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXQobm9kZTogTm9kZSkge1xuICAgICAgICBBUklBTWFwcGVyLm5hbWVDb21wdXRhdGlvbklkID0gMDtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IFtdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGggPSBbe1xuICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICByb2xlQ291bnQ6IHt9XG4gICAgICAgIH1dO1xuICAgICAgICAvLyBHZXQgdG8gdGhlIHRvcG1vc3Qgbm9kZVxuICAgICAgICBsZXQgZ29vZE5vZGUgPSBub2RlO1xuICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgd2hpbGUgKG5leHQgPSBET01XYWxrZXIucGFyZW50Tm9kZShnb29kTm9kZSkpIHtcbiAgICAgICAgICAgIGdvb2ROb2RlID0gbmV4dDtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gV2FsayB0aGUgdHJlZSBhbmQgc2V0IHRoZSBoaWVyYXJjaGllcyBpbiB0aGUgcmlnaHQgb3JkZXJcbiAgICAgICAgbGV0IGFyaWFXYWxrZXIgPSBuZXcgQVJJQVdhbGtlcihnb29kTm9kZSwgZmFsc2UsIGdvb2ROb2RlKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGFyaWFXYWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShhcmlhV2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChhcmlhV2Fsa2VyLm5leHROb2RlKCkpO1xuICAgIH1cblxuICAgIG9wZW5TY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5Um9sZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkobm9kZSlcbiAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDx0aGlzLmhpZXJhcmNoeVJlc3VsdHMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUgJiYgdGhpcy5oaWVyYXJjaHlSZXN1bHRzW2lkeF0ucm9sZVswXSA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlID0gKHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUgPyB0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlLnN1YnN0cmluZygxKSA6IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmhpZXJhcmNoeVJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVzaEhpZXJhcmNoeShub2RlOiBOb2RlKSB7XG4gICAgICAgIC8vIElmIHdlJ3JlIG5vdCBhbiBlbGVtZW50LCBubyBzcGVjaWFsIGhhbmRsaW5nXG4gICAgICAgIGxldCBub2RlSGllcmFyY2h5ID0gW11cbiAgICAgICAgLy8gRGV0ZXJtaW5lIG91ciBub2RlIGluZm9cbiAgICAgICAgbm9kZUhpZXJhcmNoeSA9IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShub2RlKTtcbiAgICAgICAgbGV0IG5vZGVJbmZvID0gbm9kZUhpZXJhcmNoeVtub2RlSGllcmFyY2h5Lmxlbmd0aC0xXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlLnB1c2gobm9kZUluZm8ucm9sZSk7XG4gICAgICAgIGlmIChub2RlSW5mby5yb2xlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGgucHVzaChub2RlSW5mbyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMgPSBub2RlSGllcmFyY2h5O1xuICAgIH1cblxuICAgIGNsb3NlU2NvcGUobm9kZTogTm9kZSk6IElNYXBSZXN1bHRbXSB7XG4gICAgICAgIGxldCByZXRWYWwgOiBJTWFwUmVzdWx0W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgdGhpcy5oaWVyYXJjaHlSZXN1bHRzKSB7XG4gICAgICAgICAgICAvLyBjb25zdCB0ZW1wID0gcmVzLm5vZGU7XG4gICAgICAgICAgICAvLyByZXMubm9kZSA9IG51bGw7XG4gICAgICAgICAgICAvLyBsZXQgY2xvbmVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgICAgIC8vIGNsb25lZC5ub2RlID0gcmVzLm5vZGUgPSB0ZW1wOyBcbiAgICAgICAgICAgIC8vIHJldFZhbC5wdXNoKGNsb25lZCk7XG4gICAgICAgICAgICByZXRWYWwucHVzaChyZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZSA9IFwiL1wiK3JldFZhbFtyZXRWYWwubGVuZ3RoLTFdLnJvbGVcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChub2RlKTtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IHBhcmVudCA/IENhY2hlVXRpbC5nZXRDYWNoZShwYXJlbnQgYXMgSFRNTEVsZW1lbnQsIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUluZm9cIiwgW10pIDogW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uc1xuICAgIC8vLy9cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFhbS0xLjAvI21hcHBpbmctaHRtbC10by1hY2Nlc3NpYmlsaXR5LWFwaXNcbiAgICBwdWJsaWMgc3RhdGljIGVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yczogeyBbbm9kZU5hbWU6c3RyaW5nXTogeyBbYXR0cjpzdHJpbmddOiBzdHJpbmcgfCBFbGVtQ2FsYyB9fSA9IHtcbiAgICAgICAgXCJnbG9iYWxcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IGVsZW0gPT4gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGVsZW0pPy5uYW1lICAvL0FSSUFNYXBwZXIuY29tcHV0ZU5hbWVcbiAgICAgICAgfVxuICAgICAgICAsIFwiZGF0YWxpc3RcIjoge1xuICAgICAgICAgICAgLy8gc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBkYXRhbGlzdCdzIHNlbGVjdGlvbiBtb2RlbCBhbGxvd3MgbXVsdGlwbGUgb3B0aW9uIGVsZW1lbnRzIHRvIGJlXG4gICAgICAgICAgICAvLyBzZWxlY3RlZCBhdCBhIHRpbWUsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICBcIm11bHRpc2VsZWN0YWJsZVwiOiBlbGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgICAgICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0ID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFtsaXN0PSdcIitpZCtcIiddXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisoZWxlbS5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpPT1cIlwiKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcImgxXCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCIxXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDJcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjJcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoM1wiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiM1wiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImg0XCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCI0XCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDVcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjVcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoNlwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiNlwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImlucHV0XCI6IHtcbiAgICAgICAgICAgIC8vIC0gdHlwZT1cImNoZWNrYm94XCIgc3RhdGUgc2V0IHRvIFwibWl4ZWRcIiBpZiB0aGUgZWxlbWVudCdzIGluZGV0ZXJtaW5hdGUgSURMIGF0dHJpYnV0ZVxuICAgICAgICAgICAgLy8gaXMgdHJ1ZSwgb3IgXCJ0cnVlXCIgaWYgdGhlIGVsZW1lbnQncyBjaGVja2VkbmVzcyBpcyB0cnVlLCBvciBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIHN0YXRlIHNldCB0byBcInRydWVcIiBpZiB0aGUgZWxlbWVudCdzIGNoZWNrZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIlxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLlxuICAgICAgICAgICAgXCJjaGVja2VkXCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiY2hlY2tib3hcIiB8fCB0eXBlID09PSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrKGVsZW0gYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIGFuZCBub3QgaW4gbWVudSByZWZsZWN0aW5nIG51bWJlciBvZiB0eXBlPXJhZGlvIGlucHV0IGVsZW1lbnRzIFxuICAgICAgICAgICAgLy8gd2l0aGluIHRoZSByYWRpbyBidXR0b24gZ3JvdXBcbiAgICAgICAgICAgICwgXCJzZXRzaXplXCI6IGVsZW0gPT4geyByZXR1cm4gbnVsbDsgdGhyb3cgbmV3IEVycm9yKFwiTk9UIElNUExFTUVOVEVEXCIpOyB9XG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIGFuZCBub3QgaW4gbWVudSB2YWx1ZSByZWZsZWN0aW5nIHRoZSBlbGVtZW50cyBwb3NpdGlvbiBcbiAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgcmFkaW8gYnV0dG9uIGdyb3VwLlwiXG4gICAgICAgICAgICAsIFwicG9zaW5zZXRcIjogZWxlbSA9PiB7IHJldHVybiBudWxsOyB0aHJvdyBuZXcgRXJyb3IoXCJOT1QgSU1QTEVNRU5URURcIik7IH1cbiAgICAgICAgICAgIC8vIGlucHV0ICh0eXBlIGF0dHJpYnV0ZSBpbiB0aGUgVGV4dCwgU2VhcmNoLCBUZWxlcGhvbmUsIFVSTCwgb3IgRS1tYWlsIHN0YXRlcyB3aXRoIGEgXG4gICAgICAgICAgICAvLyBzdWdnZXN0aW9ucyBzb3VyY2UgZWxlbWVudCkgY29tYm9ib3ggcm9sZSwgd2l0aCB0aGUgYXJpYS1vd25zIHByb3BlcnR5IHNldCB0byB0aGUgc2FtZVxuICAgICAgICAgICAgLy8gdmFsdWUgYXMgdGhlIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAsIFwib3duc1wiOiBlbGVtID0+IHsgcmV0dXJuIG51bGw7IHRocm93IG5ldyBFcnJvcihcIk5PVCBJTVBMRU1FTlRFRFwiKTsgfVxuICAgICAgICB9XG4gICAgICAgICwgXCJrZXlnZW5cIjoge1xuICAgICAgICAgICAgXCJtdWx0aXNlbGVjdGFibGVcIjogXCJmYWxzZVwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImxpXCI6IHtcbiAgICAgICAgICAgIC8vIE51bWJlciBvZiBsaSBlbGVtZW50cyB3aXRoaW4gdGhlIG9sLCB1bCwgbWVudVxuICAgICAgICAgICAgXCJzZXRzaXplXCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbSwgW1wib2xcIiwgXCJ1bFwiLCBcIm1lbnVcIl0pO1xuICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXMgPSBDYWNoZVV0aWwuZ2V0U2V0Q2FjaGUocGFyZW50LCBcImVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yczo6bGlzXCIsICgpID0+IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwibGlcIikpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVybGlzID0gQ2FjaGVVdGlsLmdldFNldENhY2hlKHBhcmVudCwgXCJlbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnM6Om90aGVybGlzXCIsICgpID0+IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwib2wgbGksIHVsIGxpLCBtZW51IGxpXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisobGlzLmxlbmd0aC1vdGhlcmxpcy5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUG9zaXRpb24gb2YgbGkgZWxlbWVudCB3aXRoaW4gdGhlIG9sLCB1bCwgbWVudVxuICAgICAgICAgICAgLCBcInBvc2luc2V0XCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbSwgW1wib2xcIiwgXCJ1bFwiLCBcIm1lbnVcIl0pXG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpcyA9IENhY2hlVXRpbC5nZXRTZXRDYWNoZShwYXJlbnQsIFwiZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzOjpsaXNcIiwgKCkgPT4gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaVwiKSk7XG4gICAgICAgICAgICAgICAgbGV0IG51bSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxsaXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaSA9IGxpc1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShwYXJlbnQsIERPTVV0aWwuZ2V0QW5jZXN0b3IobGksIFtcIm9sXCIsIFwidWxcIiwgXCJtZW51XCJdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiK251bTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICArK251bTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcIm1lbnVpdGVtXCI6IHtcbiAgICAgICAgICAgIC8vIHR5cGUgPSBjaGVja2JveCBvciByYWRpbywgc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSBcbiAgICAgICAgICAgIC8vIGlzIHByZXNlbnQsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICBcImNoZWNrZWRcIjogZWxlbSA9PiBcIlwiKyEhKGVsZW0uZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSBcbiAgICAgICAgICAgICAgICAmJiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIik9PVwiXCIpKVxuICAgICAgICB9XG4gICAgICAgICwgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgLy8gc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBlbGVtZW50J3Mgc2VsZWN0ZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIiBvdGhlcndpc2UuXG4gICAgICAgICAgICBcInNlbGVjdGVkXCI6IGVsZW0gPT4gXCJcIishIShlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpIFxuICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpPT1cIlwiKSlcbiAgICAgICAgfVxuICAgICAgICAsIFwicHJvZ3Jlc3NcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZW1heFwiOiBlbGVtID0+IGVsZW0uZ2V0QXR0cmlidXRlKFwibWF4XCIpIHx8IFwiMVwiXG4gICAgICAgICAgICAsIFwidmFsdWVtaW5cIjogZWxlbSA9PiBcIjBcIlxuICAgICAgICAgICAgLCBcInZhbHVlbm93XCI6IGVsZW0gPT4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHRleHRBdHRyVmFsdWVDYWxjdWxhdG9yczogeyBbYXR0cjpzdHJpbmddOiBOb2RlQ2FsYyB9ID0ge1xuICAgICAgICBcIm5hbWVcIjogbm9kZSA9PiBub2RlLm5vZGVWYWx1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG5hbWVDb21wdXRhdGlvbklkID0gMDtcbiAgICAvKipwdWJsaWMgc3RhdGljIGNvbXB1dGVOYW1lKGN1cjogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICArK0FSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQ7XG4gICAgICAgIHJldHVybiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscChBUklBTWFwcGVyLm5hbWVDb21wdXRhdGlvbklkLCBjdXIsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlTmFtZUhlbHAod2Fsa0lkOiBudW1iZXIsIGN1cjogTm9kZSwgbGFiZWxsZWRieVRyYXZlcnNlOiBib29sZWFuLCB3YWxrVHJhdmVyc2U6IGJvb2xlYW4pIDogc3RyaW5nIHtcbiAgICAgICAgLy8gMmcuIE5vbmUgb2YgdGhlIG90aGVyIGNvbnRlbnQgYXBwbGllcyB0byB0ZXh0IG5vZGVzLCBzbyBqdXN0IGRvIHRoaXMgZmlyc3RcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSA9PT0gMyApIHJldHVybiBjdXIubm9kZVZhbHVlO1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09PSAxMSkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgIT09IDEgKSB7XG4gICAgICAgICAgICBpZiAod2Fsa1RyYXZlcnNlIHx8IGxhYmVsbGVkYnlUcmF2ZXJzZSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IgKFwiQ2FuIG9ubHkgY29tcHV0ZSBuYW1lIG9uIEVsZW1lbnQgYW5kIFRleHQgXCIgKyBjdXIubm9kZVR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxlbSA9IGN1ciBhcyBFbGVtZW50O1xuICAgICAgICAvLyBXZSd2ZSBiZWVuIGhlcmUgYmVmb3JlIC0gcHJldmVudCByZWN1cnNpb25cbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcImRhdGEtbmFtZXdhbGtcIiwgbnVsbCkgPT09IFwiXCIrd2Fsa0lkKSByZXR1cm4gXCJcIjtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiZGF0YS1uYW1ld2Fsa1wiLCBcIlwiK3dhbGtJZCk7XG4gICAgICAgIC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNpbnB1dC10eXBlLXRleHQtaW5wdXQtdHlwZS1wYXNzd29yZC1pbnB1dC10eXBlLXNlYXJjaC1pbnB1dC10eXBlLXRlbC1pbnB1dC10eXBlLXVybC1hbmQtdGV4dGFyZWEtZWxlbWVudFxuXG4gICAgICAgIC8vIDJhLiBPbmx5IHNob3cgaGlkZGVuIGNvbnRlbnQgaWYgaXQncyByZWZlcmVuY2VkIGJ5IGEgbGFiZWxsZWRieVxuICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGN1cikpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmIuIGNvbGxlY3QgdmFsaWQgaWQgcmVmZXJlbmNlc1xuICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbGV0IGxhYmVsbGVkYnkgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBsZXQgdmFsaWRFbGVtcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWYgb2YgbGFiZWxsZWRieSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChjdXIsIHJlZik7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkVsZW0gJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgcmVmRWxlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRFbGVtcy5wdXNoKHJlZkVsZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWxpZEVsZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgYWNjdW11bGF0ZWQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbSBvZiB2YWxpZEVsZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IFwiIFwiICsgdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBlbGVtLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZC50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5jZSBub2RlVG9Sb2xlIGNhbGxzIGJhY2sgaGVyZSBmb3IgZm9ybSBhbmQgc2VjdGlvbiwgd2UgbmVlZCBzcGVjaWFsIGNhc2luZyBoZXJlIHRvIGhhbmRsZSB0aG9zZSB0d28gY2FzZXNcbiAgICAgICAgaWYgKFtcInNlY3Rpb25cIiwgXCJmb3JtXCJdLmluY2x1ZGVzKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBJJ20gbm90IGFuIGVtYmVkZGVkIGNvbnRyb2wgb3IgSSdtIG5vdCByZWN1cnNpbmcsIHJldHVybiB0aGUgYXJpYS1sYWJlbFxuICAgICAgICAgICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICF3YWxrVHJhdmVyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmMuIElmIGxhYmVsIG9yIHdhbGssIGFuZCB0aGlzIGlzIGEgY29udHJvbCwgc2tpcCB0byB0aGUgdmFsdWUsIG90aGVyd2lzZSBwcm92aWRlIHRoZSBsYWJlbFxuICAgICAgICBjb25zdCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKGN1cik7XG4gICAgICAgIGxldCBpc0VtYmVkZGVkQ29udHJvbCA9IFtcbiAgICAgICAgICAgIFwidGV4dGJveFwiLCBcImJ1dHRvblwiLCBcImNvbWJvYm94XCIsIFwibGlzdGJveFwiLCBcbiAgICAgICAgICAgIFwicHJvZ3Jlc3NiYXJcIiwgXCJzY3JvbGxiYXJcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCJcbiAgICAgICAgXS5pbmNsdWRlcyhyb2xlKTtcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIElmIEknbSBub3QgYW4gZW1iZWRkZWQgY29udHJvbCBvciBJJ20gbm90IHJlY3Vyc2luZywgcmV0dXJuIHRoZSBhcmlhLWxhYmVsXG4gICAgICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiAhd2Fsa1RyYXZlcnNlIHx8ICFpc0VtYmVkZGVkQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmQuIFxuICAgICAgICBpZiAocm9sZSAhPT0gXCJwcmVzZW50YXRpb25cIiAmJiByb2xlICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgaWYgKChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiB8fCBjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhcmVhXCIpICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERPTVV0aWwuY2xlYW5XaGl0ZXNwYWNlKGVsZW0uZ2V0QXR0cmlidXRlKFwiYWx0XCIpKS50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiaWRcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJsYWJlbFtmb3I9J1wiK2VsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikrXCInXVwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgfHwgKGxhYmVsLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYoY3VyLCBsYWJlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgbGFiZWwsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWwudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZmllbGRzZXRcIikge1xuICAgICAgICAgICAgICAgIGlmKCAoPEVsZW1lbnQ+Y3VyKS5xdWVyeVNlbGVjdG9yKFwibGVnZW5kXCIpKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZ2VuZCA9ICg8RWxlbWVudD5jdXIpLnF1ZXJ5U2VsZWN0b3IoXCJsZWdlbmRcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWdlbmQuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBjdXIsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyAyZS5cbiAgICAgICAgaWYgKCh3YWxrVHJhdmVyc2UgfHwgbGFiZWxsZWRieVRyYXZlcnNlKSAmJiBpc0VtYmVkZGVkQ29udHJvbCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGVtYmVkZGVkIGNvbnRyb2wgaGFzIHJvbGUgdGV4dGJveCwgcmV0dXJuIGl0cyB2YWx1ZS5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcInRleHRib3hcIikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa1RyYXZlcnNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSBidXR0b24sIHJldHVybiB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgYnV0dG9uLlxuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFtcImJ1dHRvblwiLCBcInN1Ym1pdFwiLCBcInJlc2V0XCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJzdWJtaXRcIikgcmV0dXJuIFwiU3VibWl0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJyZXNldFwiKSByZXR1cm4gXCJSZXNldFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa1RyYXZlcnNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUT0RPOiBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSBjb21ib2JveCBvciBsaXN0Ym94LCByZXR1cm4gdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGNob3NlbiBvcHRpb24uXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW0sIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQgJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgc2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVJJQU1hcHBlci5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBzZWxlY3RlZCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIGVtYmVkZGVkIGNvbnRyb2wgaGFzIHJvbGUgcmFuZ2UgKGUuZy4sIGEgc3BpbmJ1dHRvbiBvciBzbGlkZXIpOlxuICAgICAgICAgICAgaWYgKFtcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiXS5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcmlhLXZhbHVldGV4dCBwcm9wZXJ0eSBpcyBwcmVzZW50LCByZXR1cm4gaXRzIHZhbHVlLFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtdmFsdWV0ZXh0XCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKTtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBhcmlhLXZhbHVlbm93IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBPdGhlcndpc2UsIHVzZSB0aGUgdmFsdWUgYXMgc3BlY2lmaWVkIGJ5IGEgaG9zdCBsYW5ndWFnZSBhdHRyaWJ1dGUuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyZi4gMmguXG4gICAgICAgIGlmICh3YWxrVHJhdmVyc2UgfHwgQVJJQURlZmluaXRpb25zLm5hbWVGcm9tQ29udGVudChyb2xlKSB8fCBsYWJlbGxlZGJ5VHJhdmVyc2UpIHtcbiAgICAgICAgICAgIC8vIDJmaS4gU2V0IHRoZSBhY2N1bXVsYXRlZCB0ZXh0IHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgICAgICAgICBsZXQgYWNjdW11bGF0ZWQgPSBcIlwiO1xuICAgICAgICAgICAgLy8gMmZpaS4gQ2hlY2sgZm9yIENTUyBnZW5lcmF0ZWQgdGV4dHVhbCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBub2RlIGFuZCBcbiAgICAgICAgICAgIC8vIGluY2x1ZGUgaXQgaW4gdGhlIGFjY3VtdWxhdGVkIHRleHQuIFRoZSBDU1MgOmJlZm9yZSBhbmQgOmFmdGVyIHBzZXVkbyBlbGVtZW50cyBbQ1NTMl0gXG4gICAgICAgICAgICAvLyBjYW4gcHJvdmlkZSB0ZXh0dWFsIGNvbnRlbnQgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIGNvbnRlbnQgbW9kZWwuXG4gICAgICAgICAgICAvLyAgIEZvciA6YmVmb3JlIHBzZXVkbyBlbGVtZW50cywgVXNlciBhZ2VudHMgTVVTVCBwcmVwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgXG4gICAgICAgICAgICAvLyAgICAgYSBzcGFjZSwgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgICAgLy8gICBGb3IgOmFmdGVyIHBzZXVkbyBlbGVtZW50cywgVXNlciBhZ2VudHMgTVVTVCBhcHBlbmQgQ1NTIHRleHR1YWwgY29udGVudCwgd2l0aG91dCBhIFxuICAgICAgICAgICAgLy8gICAgIHNwYWNlLCB0byB0aGUgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gbnVsbDtcbiAgICAgICAgICAgIGJlZm9yZSA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sXCJiZWZvcmVcIikuY29udGVudDtcblxuICAgICAgICAgICAgaWYgKGJlZm9yZSAmJiBiZWZvcmUgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlID0gYmVmb3JlLnJlcGxhY2UoL15cIi8sXCJcIikucmVwbGFjZSgvXCIkLyxcIlwiKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBiZWZvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAyZmlpaS4gRm9yIGVhY2ggY2hpbGQgbm9kZSBvZiB0aGUgY3VycmVudCBub2RlOlxuICAgICAgICAgICAgLy8gICBTZXQgdGhlIGN1cnJlbnQgbm9kZSB0byB0aGUgY2hpbGQgbm9kZS5cbiAgICAgICAgICAgIC8vICAgQ29tcHV0ZSB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgY3VycmVudCBub2RlIGJlZ2lubmluZyB3aXRoIHN0ZXAgMi4gU2V0IHRoZSByZXN1bHQgXG4gICAgICAgICAgICAvLyAgICAgdG8gdGhhdCB0ZXh0IGFsdGVybmF0aXZlLlxuICAgICAgICAgICAgLy8gICBBcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUgYWNjdW11bGF0ZWQgdGV4dC5cbiAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0xPVFwiKSB7XG4gICAgICAgICAgICAgICAgLy9pZiBubyBhc3NpZ25lZE5vZGUsIGNoZWNrIGl0cyBvd24gdGV4dCBcbiAgICAgICAgICAgICAgICBpZiAoIShlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpIHx8IChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5uZXJUZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lclRleHQgJiYgaW5uZXJUZXh0ICE9PSBudWxsICYmIGlubmVyVGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9ICBcIiBcIiArIGlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGV4dCBmcm9tIGFsbCBhc3NpZ25lZCBub2Rlc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNsb3RDaGlsZCBvZiAoZWxlbSBhcyBIVE1MU2xvdEVsZW1lbnQpLmFzc2lnbmVkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRDaGlsZENvbnRlbnQgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIHNsb3RDaGlsZCwgbGFiZWxsZWRieVRyYXZlcnNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IFwiIFwiICsgbmV4dENoaWxkQ29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHdhbGtDaGlsZCA9IGVsZW0uZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB3aGlsZSAod2Fsa0NoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0Q2hpbGRDb250ZW50ID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCB3YWxrQ2hpbGQsIGxhYmVsbGVkYnlUcmF2ZXJzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IFwiIFwiICsgbmV4dENoaWxkQ29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkID0gd2Fsa0NoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGFmdGVyID0gbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLFwiYWZ0ZXJcIikuY29udGVudDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgICAgICAgIGlmIChhZnRlciAmJiBhZnRlciAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBhZnRlciA9IGFmdGVyLnJlcGxhY2UoL15cIi8sXCJcIikucmVwbGFjZSgvXCIkLyxcIlwiKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBhZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDJmaXYuIFJldHVybiB0aGUgYWNjdW11bGF0ZWQgdGV4dC5cbiAgICAgICAgICAgIGFjY3VtdWxhdGVkID0gYWNjdW11bGF0ZWQucmVwbGFjZSgvXFxzKy9nLFwiIFwiKS50cmltKCk7XG4gICAgICAgICAgICBpZiAoYWNjdW11bGF0ZWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyaS4gT3RoZXJ3aXNlLCBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBhIFRvb2x0aXAgYXR0cmlidXRlLCByZXR1cm4gaXRzIHZhbHVlLlxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aXRsZS50ZXh0Q29udGVudCB8fCB0aXRsZS5pbm5lclRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgKi9cbi8qICAgICAgICBpZiAocm9sZSBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbSBcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKSBcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSA9IGVsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiaWRcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbmFtZSA9IGVsZW0ub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibGFiZWxbZm9yPSdcIitlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpLnRyaW0oKStcIiddXCIpLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgIG5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICBuYW1lID0gXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICAgICAgbmFtZSArPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtLCBpZCkudGV4dENvbnRlbnQgKyBcIiBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9Ki9cblxuICAgIHB1YmxpYyBzdGF0aWMgbm9kZVRvUm9sZShub2RlIDogTm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIFwidGV4dFwiO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghZWxlbSB8fCBlbGVtLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPIERPOiB1c2UgQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pIHRvIHJlcGxhY2UgdGhlIGNvZGUgZm9sbG93aW5nLCB3aGljaCB1c2VzIG9ubHkgdGhlIHZhbGlkIHJvbGVzIGZvciB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgYXJpYSBmYWxsYmFjayBydWxlXG4gICAgICAgIC8vY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgLy9yZXR1cm4gcm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCByb2xlID09PSBcIm5vbmVcIiA/IG51bGwgOiByb2xlO1xuICAgICAgICBcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCByb2xlU3RyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGxldCByb2xlcyA9IHJvbGVTdHIuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgcm9sZSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZWxlbWVudCBpcyBmb2N1c2FibGUsIHRoZW4gcHJlc2VudGF0aW9uIHJvbGVzIGFyZSB0byBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5pc0ZvY3VzYWJsZShlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb2xlO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gdGhpcy5lbGVtVG9JbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZW0pO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwibm9kZT1cIiArIG5vZGUubm9kZU5hbWUgK1wiLCByb2xlPSBcIiArIChyb2xlcyA/IHJvbGVzWzBdIDogbnVsbCkgK1wiLCByZXNvbHZlZD1cIiArIEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKSk7XG4gICAgICAgIGNvbnN0IHJvbGUgPSAhcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PTAgPyBudWxsIDogcm9sZXNbMF07XG4gICAgICAgIHJldHVybiByb2xlID09PSBcInByZXNlbnRhdGlvblwiIHx8IHJvbGUgPT09IFwibm9uZVwiID8gbnVsbCA6IHJvbGU7XG4gICAgICAgIC8vcmV0dXJuIEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgXG4gICAgfVxufSBcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4vQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG5cbi8qKlxuICogV2Fsa3MgaW4gYW4gQVJJQSBvcmRlclxuICogXG4gKiBTZWUgYWxzbyAuLi9kb20vRE9NV2Fsa2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBBUklBV2Fsa2VyIHtcbiAgICByb290IDogTm9kZTtcbiAgICBub2RlIDogTm9kZTtcbiAgICBiRW5kVGFnOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudCA6IE5vZGUsIGJFbmQ/IDogYm9vbGVhbiwgcm9vdD8gOiBOb2RlKSB7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3QgfHwgZWxlbWVudDtcbiAgICAgICAgaWYgKHRoaXMucm9vdC5ub2RlVHlwZSA9PT0gOSkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gKHRoaXMucm9vdCBhcyBEb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudDtcbiAgICAgICAgLy8gaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gOSkge1xuICAgICAgICAvLyAgICAgdGhpcy5ub2RlID0gKHRoaXMubm9kZSBhcyBEb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5iRW5kVGFnID0gKGJFbmQgPT0gdW5kZWZpbmVkID8gZmFsc2UgOiBiRW5kID09IHRydWUpO1xuICAgIH1cblxuICAgIGF0Um9vdCgpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICgodGhpcyBhcyBhbnkpLm93bmVyRWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yb290ID09PSB0aGlzLm5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5pc1NhbWVOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmlzU2FtZU5vZGUodGhpcy5ub2RlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5ub2RlKSA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCAtIHRyeSBvdXIgYmVzdFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wYXJlbnROb2RlID09PSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmV4dE5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgc2tpcE93bmVkID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5ub2RlLm5vZGVOYW1lLCB0aGlzLmJFbmRUYWc/XCJFTkRcIjpcIlNUQVJUXCIsIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIGFueSkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBzbG90RWxlbWVudCA9ICh0aGlzLm5vZGUgYXMgSFRNTFNsb3RFbGVtZW50KVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290LmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50Tm9kZS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBET01XYWxrZXIuYXNzaWduU2xvdHModGhpcy5ub2RlIGFzIFNoYWRvd1Jvb3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICAgICAmJiBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKClbMF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICovKSBcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5maXJzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2xvdE93bmVyID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTbG90SW5kZXggPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4KzE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRTbG90SW5kZXggPCBzbG90T3duZXIuYXNzaWduZWROb2RlcygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKVtuZXh0U2xvdEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLm5leHRTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIubmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgc2tpcE93bmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG93bklkcyA9ICh0aGlzLm5vZGUucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgfHwgISh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpLmhhc0F0dHJpYnV0ZShcImlkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQodGhpcy5ub2RlKS5nZXRFbGVtZW50QnlJZChvd25JZHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gb3duSWRzLmluZGV4T2YoKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT09IG93bklkcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlOyAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyYWIgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudCh0aGlzLm5vZGUpLmdldEVsZW1lbnRCeUlkKG93bklkc1tpZHgrMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICAgICAgfHwgKHNraXBPd25lZCAmJiB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgISFBUklBTWFwcGVyLmdldEFyaWFPd25lZEJ5KHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByZXZOb2RlKCkgOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBza2lwT3duZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3RcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdC5sYXN0Q2hpbGQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgRE9NV2Fsa2VyLmFzc2lnblNsb3RzKHRoaXMubm9kZSBhcyBTaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSkgXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBza2lwT3duZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duSWRzID0gKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSB8fCAhKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudCh0aGlzLm5vZGUpLmdldEVsZW1lbnRCeUlkKG93bklkc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBvd25JZHMuaW5kZXhPZigodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gb3duSWRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7ICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JhYiBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lkeCsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEpXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICAgICB8fCAoc2tpcE93bmVkICYmIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhIUFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vLi4vLi4vYXBpL0lFbmdpbmVcIjtcblxuZXhwb3J0IGNsYXNzIEFuY2VzdG9yVXRpbCB7XG4gICAgcHVibGljIHN0YXRpYyBpc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaHk6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY29udGV4dEhpZXJhcmNoeSAmJiBjb250ZXh0SGllcmFyY2h5LmRvbSkge1xuICAgICAgICAgICAgLy8gU2tpcCBjdXJyZW50IG5vZGUgYmVjYXVzZSB3ZSB3YW50IGFuY2VzdHJ5XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9Y29udGV4dEhpZXJhcmNoeS5kb20ubGVuZ3RoLTI7IGlkeCA+PSAwOyAtLWlkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSAoY29udGV4dEhpZXJhcmNoeS5kb21baWR4XS5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlVHlwZSA9PT0gMSBcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlmcmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSA9PT0gXCJ0cnVlXCIpKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0ZyYW1lKGNvbnRleHRIaWVyYXJjaHk6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY29udGV4dEhpZXJhcmNoeSAmJiBjb250ZXh0SGllcmFyY2h5LmRvbSkge1xuICAgICAgICAgICAgLy8gU2tpcCBjdXJyZW50IG5vZGUgYmVjYXVzZSB3ZSB3YW50IGFuY2VzdHJ5XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9Y29udGV4dEhpZXJhcmNoeS5kb20ubGVuZ3RoLTI7IGlkeCA+PSAwOyAtLWlkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSAoY29udGV4dEhpZXJhcmNoeS5kb21baWR4XS5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaWZyYW1lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi8uLi8uLi9hcGkvSUVuZ2luZVwiO1xuXG5leHBvcnQgY2xhc3MgRnJhZ21lbnRVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIGdldE93bmVyRnJhZ21lbnQobm9kZTogTm9kZSkgOiBEb2N1bWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICAgICAgICBsZXQgbiA6IE5vZGUgPSBub2RlO1xuICAgICAgICB3aGlsZShuLnBhcmVudE5vZGUgJiYgKG4gPSBuLnBhcmVudE5vZGUpKXtcbiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlID09PSAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEJ5SWQobm9kZTogTm9kZSwgaWQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPd25lckZyYWdtZW50KG5vZGUpLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yKGhpZXJhcmNoaWVzOiBSdWxlQ29udGV4dEhpZXJhcmNoeSwgZWxlbU5hbWU6IHN0cmluZykge1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IGhpZXJhcmNoaWVzW1wiZG9tXCJdLmZpbHRlcihpbmZvID0+IGluZm8ucm9sZSA9PT0gZWxlbU5hbWUpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlcy5sZW5ndGggPiAwICYmIG1hdGNoZXNbMF0ubm9kZSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QW5jZXN0b3JXaXRoUm9sZShoaWVyYXJjaGllczogUnVsZUNvbnRleHRIaWVyYXJjaHksIHJvbGU6IHN0cmluZykge1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IGhpZXJhcmNoaWVzW1wiYXJpYVwiXS5maWx0ZXIoaW5mbyA9PiBpbmZvLnJvbGUgPT09IHJvbGUpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlcy5sZW5ndGggPiAwICYmIG1hdGNoZXNbMF0ubm9kZSB8fCBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjEtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIEZyb20gaHR0cHM6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbGFuZ3VhZ2Utc3VidGFnLXJlZ2lzdHJ5L2xhbmd1YWdlLXN1YnRhZy1yZWdpc3RyeVxuY29uc3QgdmFsaWRQcmltYXJ5TGFuZ3MgPSBbIC8vIFwicWFhLi5xdHpcIixcblsgXCJhYVwiLFwiYWJcIixcImFlXCIsXCJhZlwiLFwiYWtcIixcImFtXCIsXCJhblwiLFwiYXJcIixcImFzXCIsXCJhdlwiLFwiYXlcIixcImF6XCIsXCJhYWFcIixcImFhYlwiLFwiYWFjXCIsXCJhYWRcIixcImFhZVwiLFwiYWFmXCIsXCJhYWdcIixcImFhaFwiLFwiYWFpXCIsXCJhYWtcIixcImFhbFwiLFwiYWFtXCIsXCJhYW5cIixcImFhb1wiLFwiYWFwXCIsXCJhYXFcIixcImFhc1wiLFwiYWF0XCIsXCJhYXVcIixcImFhdlwiLFwiYWF3XCIsXCJhYXhcIixcImFhelwiLFwiYWJhXCIsXCJhYmJcIixcImFiY1wiLFwiYWJkXCIsXCJhYmVcIixcImFiZlwiLFwiYWJnXCIsXCJhYmhcIixcImFiaVwiLFwiYWJqXCIsXCJhYmxcIixcImFibVwiLFwiYWJuXCIsXCJhYm9cIixcImFicFwiLFwiYWJxXCIsXCJhYnJcIixcImFic1wiLFwiYWJ0XCIsXCJhYnVcIixcImFidlwiLFwiYWJ3XCIsXCJhYnhcIixcImFieVwiLFwiYWJ6XCIsXCJhY2FcIixcImFjYlwiLFwiYWNkXCIsXCJhY2VcIixcImFjZlwiLFwiYWNoXCIsXCJhY2lcIixcImFja1wiLFwiYWNsXCIsXCJhY21cIixcImFjblwiLFwiYWNwXCIsXCJhY3FcIixcImFjclwiLFwiYWNzXCIsXCJhY3RcIixcImFjdVwiLFwiYWN2XCIsXCJhY3dcIixcImFjeFwiLFwiYWN5XCIsXCJhY3pcIixcImFkYVwiLFwiYWRiXCIsXCJhZGRcIixcImFkZVwiLFwiYWRmXCIsXCJhZGdcIixcImFkaFwiLFwiYWRpXCIsXCJhZGpcIixcImFkbFwiLFwiYWRuXCIsXCJhZG9cIixcImFkcFwiLFwiYWRxXCIsXCJhZHJcIixcImFkc1wiLFwiYWR0XCIsXCJhZHVcIixcImFkd1wiLFwiYWR4XCIsXCJhZHlcIixcImFkelwiLFwiYWVhXCIsXCJhZWJcIixcImFlY1wiLFwiYWVkXCIsXCJhZWVcIixcImFla1wiLFwiYWVsXCIsXCJhZW1cIixcImFlblwiLFwiYWVxXCIsXCJhZXJcIixcImFlc1wiLFwiYWV1XCIsXCJhZXdcIixcImFleVwiLFwiYWV6XCIsXCJhZmFcIixcImFmYlwiLFwiYWZkXCIsXCJhZmVcIixcImFmZ1wiLFwiYWZoXCIsXCJhZmlcIixcImFma1wiLFwiYWZuXCIsXCJhZm9cIixcImFmcFwiLFwiYWZzXCIsXCJhZnRcIixcImFmdVwiLFwiYWZ6XCIsXCJhZ2FcIixcImFnYlwiLFwiYWdjXCIsXCJhZ2RcIixcImFnZVwiLFwiYWdmXCIsXCJhZ2dcIixcImFnaFwiLFwiYWdpXCIsXCJhZ2pcIixcImFna1wiLFwiYWdsXCIsXCJhZ21cIixcImFnblwiLFwiYWdvXCIsXCJhZ3BcIixcImFncVwiLFwiYWdyXCIsXCJhZ3NcIixcImFndFwiLFwiYWd1XCIsXCJhZ3ZcIixcImFnd1wiLFwiYWd4XCIsXCJhZ3lcIixcImFnelwiLFwiYWhhXCIsXCJhaGJcIixcImFoZ1wiLFwiYWhoXCIsXCJhaGlcIixcImFoa1wiLFwiYWhsXCIsXCJhaG1cIixcImFoblwiLFwiYWhvXCIsXCJhaHBcIixcImFoclwiLFwiYWhzXCIsXCJhaHRcIixcImFpYVwiLFwiYWliXCIsXCJhaWNcIixcImFpZFwiLFwiYWllXCIsXCJhaWZcIixcImFpZ1wiLFwiYWloXCIsXCJhaWlcIixcImFpalwiLFwiYWlrXCIsXCJhaWxcIixcImFpbVwiLFwiYWluXCIsXCJhaW9cIixcImFpcFwiLFwiYWlxXCIsXCJhaXJcIixcImFpc1wiLFwiYWl0XCIsXCJhaXdcIixcImFpeFwiLFwiYWl5XCIsXCJhamFcIixcImFqZ1wiLFwiYWppXCIsXCJham5cIixcImFqcFwiLFwiYWp0XCIsXCJhanVcIixcImFqd1wiLFwiYWp6XCIsXCJha2JcIixcImFrY1wiLFwiYWtkXCIsXCJha2VcIixcImFrZlwiLFwiYWtnXCIsXCJha2hcIixcImFraVwiLFwiYWtqXCIsXCJha2tcIixcImFrbFwiLFwiYWttXCIsXCJha29cIixcImFrcFwiLFwiYWtxXCIsXCJha3JcIixcImFrc1wiLFwiYWt0XCIsXCJha3VcIixcImFrdlwiLFwiYWt3XCIsXCJha3hcIixcImFreVwiLFwiYWt6XCIsXCJhbGFcIixcImFsY1wiLFwiYWxkXCIsXCJhbGVcIixcImFsZlwiLFwiYWxnXCIsXCJhbGhcIixcImFsaVwiLFwiYWxqXCIsXCJhbGtcIixcImFsbFwiLFwiYWxtXCIsXCJhbG5cIixcImFsb1wiLFwiYWxwXCIsXCJhbHFcIixcImFsclwiLFwiYWxzXCIsXCJhbHRcIixcImFsdVwiLFwiYWx2XCIsXCJhbHdcIixcImFseFwiLFwiYWx5XCIsXCJhbHpcIixcImFtYVwiLFwiYW1iXCIsXCJhbWNcIixcImFtZVwiLFwiYW1mXCIsXCJhbWdcIixcImFtaVwiLFwiYW1qXCIsXCJhbWtcIixcImFtbFwiLFwiYW1tXCIsXCJhbW5cIixcImFtb1wiLFwiYW1wXCIsXCJhbXFcIixcImFtclwiLFwiYW1zXCIsXCJhbXRcIixcImFtdVwiLFwiYW12XCIsXCJhbXdcIixcImFteFwiLFwiYW15XCIsXCJhbXpcIixcImFuYVwiLFwiYW5iXCIsXCJhbmNcIixcImFuZFwiLFwiYW5lXCIsXCJhbmZcIixcImFuZ1wiLFwiYW5oXCIsXCJhbmlcIixcImFualwiLFwiYW5rXCIsXCJhbmxcIixcImFubVwiLFwiYW5uXCIsXCJhbm9cIixcImFucFwiLFwiYW5xXCIsXCJhbnJcIixcImFuc1wiLFwiYW50XCIsXCJhbnVcIixcImFudlwiLFwiYW53XCIsXCJhbnhcIixcImFueVwiLFwiYW56XCIsXCJhb2FcIixcImFvYlwiLFwiYW9jXCIsXCJhb2RcIixcImFvZVwiLFwiYW9mXCIsXCJhb2dcIixcImFvaFwiLFwiYW9pXCIsXCJhb2pcIixcImFva1wiLFwiYW9sXCIsXCJhb21cIixcImFvblwiLFwiYW9yXCIsXCJhb3NcIixcImFvdFwiLFwiYW91XCIsXCJhb3hcIixcImFvelwiLFwiYXBhXCIsXCJhcGJcIixcImFwY1wiLFwiYXBkXCIsXCJhcGVcIixcImFwZlwiLFwiYXBnXCIsXCJhcGhcIixcImFwaVwiLFwiYXBqXCIsXCJhcGtcIixcImFwbFwiLFwiYXBtXCIsXCJhcG5cIixcImFwb1wiLFwiYXBwXCIsXCJhcHFcIixcImFwclwiLFwiYXBzXCIsXCJhcHRcIixcImFwdVwiLFwiYXB2XCIsXCJhcHdcIixcImFweFwiLFwiYXB5XCIsXCJhcHpcIixcImFxYVwiLFwiYXFjXCIsXCJhcWRcIixcImFxZ1wiLFwiYXFrXCIsXCJhcWxcIixcImFxbVwiLFwiYXFuXCIsXCJhcXBcIixcImFxclwiLFwiYXF0XCIsXCJhcXpcIixcImFyYlwiLFwiYXJjXCIsXCJhcmRcIixcImFyZVwiLFwiYXJoXCIsXCJhcmlcIixcImFyalwiLFwiYXJrXCIsXCJhcmxcIixcImFyblwiLFwiYXJvXCIsXCJhcnBcIixcImFycVwiLFwiYXJyXCIsXCJhcnNcIixcImFydFwiLFwiYXJ1XCIsXCJhcnZcIixcImFyd1wiLFwiYXJ4XCIsXCJhcnlcIixcImFyelwiLFwiYXNhXCIsXCJhc2JcIixcImFzY1wiLFwiYXNkXCIsXCJhc2VcIixcImFzZlwiLFwiYXNnXCIsXCJhc2hcIixcImFzaVwiLFwiYXNqXCIsXCJhc2tcIixcImFzbFwiLFwiYXNuXCIsXCJhc29cIixcImFzcFwiLFwiYXNxXCIsXCJhc3JcIixcImFzc1wiLFwiYXN0XCIsXCJhc3VcIixcImFzdlwiLFwiYXN3XCIsXCJhc3hcIixcImFzeVwiLFwiYXN6XCIsXCJhdGFcIixcImF0YlwiLFwiYXRjXCIsXCJhdGRcIixcImF0ZVwiLFwiYXRnXCIsXCJhdGhcIixcImF0aVwiLFwiYXRqXCIsXCJhdGtcIixcImF0bFwiLFwiYXRtXCIsXCJhdG5cIixcImF0b1wiLFwiYXRwXCIsXCJhdHFcIixcImF0clwiLFwiYXRzXCIsXCJhdHRcIixcImF0dVwiLFwiYXR2XCIsXCJhdHdcIixcImF0eFwiLFwiYXR5XCIsXCJhdHpcIixcImF1YVwiLFwiYXViXCIsXCJhdWNcIixcImF1ZFwiLFwiYXVlXCIsXCJhdWZcIixcImF1Z1wiLFwiYXVoXCIsXCJhdWlcIixcImF1alwiLFwiYXVrXCIsXCJhdWxcIixcImF1bVwiLFwiYXVuXCIsXCJhdW9cIixcImF1cFwiLFwiYXVxXCIsXCJhdXJcIixcImF1c1wiLFwiYXV0XCIsXCJhdXVcIixcImF1d1wiLFwiYXV4XCIsXCJhdXlcIixcImF1elwiLFwiYXZiXCIsXCJhdmRcIixcImF2aVwiLFwiYXZrXCIsXCJhdmxcIixcImF2bVwiLFwiYXZuXCIsXCJhdm9cIixcImF2c1wiLFwiYXZ0XCIsXCJhdnVcIixcImF2dlwiLFwiYXdhXCIsXCJhd2JcIixcImF3Y1wiLFwiYXdkXCIsXCJhd2VcIixcImF3Z1wiLFwiYXdoXCIsXCJhd2lcIixcImF3a1wiLFwiYXdtXCIsXCJhd25cIixcImF3b1wiLFwiYXdyXCIsXCJhd3NcIixcImF3dFwiLFwiYXd1XCIsXCJhd3ZcIixcImF3d1wiLFwiYXd4XCIsXCJhd3lcIixcImF4YlwiLFwiYXhlXCIsXCJheGdcIixcImF4a1wiLFwiYXhsXCIsXCJheG1cIixcImF4eFwiLFwiYXlhXCIsXCJheWJcIixcImF5Y1wiLFwiYXlkXCIsXCJheWVcIixcImF5Z1wiLFwiYXloXCIsXCJheWlcIixcImF5a1wiLFwiYXlsXCIsXCJheW5cIixcImF5b1wiLFwiYXlwXCIsXCJheXFcIixcImF5clwiLFwiYXlzXCIsXCJheXRcIixcImF5dVwiLFwiYXl4XCIsXCJheXlcIixcImF5elwiLFwiYXphXCIsXCJhemJcIixcImF6Y1wiLFwiYXpkXCIsXCJhemdcIixcImF6alwiLFwiYXptXCIsXCJhem5cIixcImF6b1wiLFwiYXp0XCIsXCJhenpcIl1cbixbIFwiYmFcIixcImJlXCIsXCJiZ1wiLFwiYmhcIixcImJpXCIsXCJibVwiLFwiYm5cIixcImJvXCIsXCJiclwiLFwiYnNcIixcImJhYVwiLFwiYmFiXCIsXCJiYWNcIixcImJhZFwiLFwiYmFlXCIsXCJiYWZcIixcImJhZ1wiLFwiYmFoXCIsXCJiYWlcIixcImJhalwiLFwiYmFsXCIsXCJiYW5cIixcImJhb1wiLFwiYmFwXCIsXCJiYXJcIixcImJhc1wiLFwiYmF0XCIsXCJiYXVcIixcImJhdlwiLFwiYmF3XCIsXCJiYXhcIixcImJheVwiLFwiYmF6XCIsXCJiYmFcIixcImJiYlwiLFwiYmJjXCIsXCJiYmRcIixcImJiZVwiLFwiYmJmXCIsXCJiYmdcIixcImJiaFwiLFwiYmJpXCIsXCJiYmpcIixcImJia1wiLFwiYmJsXCIsXCJiYm1cIixcImJiblwiLFwiYmJvXCIsXCJiYnBcIixcImJicVwiLFwiYmJyXCIsXCJiYnNcIixcImJidFwiLFwiYmJ1XCIsXCJiYnZcIixcImJid1wiLFwiYmJ4XCIsXCJiYnlcIixcImJielwiLFwiYmNhXCIsXCJiY2JcIixcImJjY1wiLFwiYmNkXCIsXCJiY2VcIixcImJjZlwiLFwiYmNnXCIsXCJiY2hcIixcImJjaVwiLFwiYmNqXCIsXCJiY2tcIixcImJjbFwiLFwiYmNtXCIsXCJiY25cIixcImJjb1wiLFwiYmNwXCIsXCJiY3FcIixcImJjclwiLFwiYmNzXCIsXCJiY3RcIixcImJjdVwiLFwiYmN2XCIsXCJiY3dcIixcImJjeVwiLFwiYmN6XCIsXCJiZGFcIixcImJkYlwiLFwiYmRjXCIsXCJiZGRcIixcImJkZVwiLFwiYmRmXCIsXCJiZGdcIixcImJkaFwiLFwiYmRpXCIsXCJiZGpcIixcImJka1wiLFwiYmRsXCIsXCJiZG1cIixcImJkblwiLFwiYmRvXCIsXCJiZHBcIixcImJkcVwiLFwiYmRyXCIsXCJiZHNcIixcImJkdFwiLFwiYmR1XCIsXCJiZHZcIixcImJkd1wiLFwiYmR4XCIsXCJiZHlcIixcImJkelwiLFwiYmVhXCIsXCJiZWJcIixcImJlY1wiLFwiYmVkXCIsXCJiZWVcIixcImJlZlwiLFwiYmVnXCIsXCJiZWhcIixcImJlaVwiLFwiYmVqXCIsXCJiZWtcIixcImJlbVwiLFwiYmVvXCIsXCJiZXBcIixcImJlcVwiLFwiYmVyXCIsXCJiZXNcIixcImJldFwiLFwiYmV1XCIsXCJiZXZcIixcImJld1wiLFwiYmV4XCIsXCJiZXlcIixcImJlelwiLFwiYmZhXCIsXCJiZmJcIixcImJmY1wiLFwiYmZkXCIsXCJiZmVcIixcImJmZlwiLFwiYmZnXCIsXCJiZmhcIixcImJmaVwiLFwiYmZqXCIsXCJiZmtcIixcImJmbFwiLFwiYmZtXCIsXCJiZm5cIixcImJmb1wiLFwiYmZwXCIsXCJiZnFcIixcImJmclwiLFwiYmZzXCIsXCJiZnRcIixcImJmdVwiLFwiYmZ3XCIsXCJiZnhcIixcImJmeVwiLFwiYmZ6XCIsXCJiZ2FcIixcImJnYlwiLFwiYmdjXCIsXCJiZ2RcIixcImJnZVwiLFwiYmdmXCIsXCJiZ2dcIixcImJnaVwiLFwiYmdqXCIsXCJiZ2tcIixcImJnbFwiLFwiYmdtXCIsXCJiZ25cIixcImJnb1wiLFwiYmdwXCIsXCJiZ3FcIixcImJnclwiLFwiYmdzXCIsXCJiZ3RcIixcImJndVwiLFwiYmd2XCIsXCJiZ3dcIixcImJneFwiLFwiYmd5XCIsXCJiZ3pcIixcImJoYVwiLFwiYmhiXCIsXCJiaGNcIixcImJoZFwiLFwiYmhlXCIsXCJiaGZcIixcImJoZ1wiLFwiYmhoXCIsXCJiaGlcIixcImJoalwiLFwiYmhrXCIsXCJiaGxcIixcImJobVwiLFwiYmhuXCIsXCJiaG9cIixcImJocFwiLFwiYmhxXCIsXCJiaHJcIixcImJoc1wiLFwiYmh0XCIsXCJiaHVcIixcImJodlwiLFwiYmh3XCIsXCJiaHhcIixcImJoeVwiLFwiYmh6XCIsXCJiaWFcIixcImJpYlwiLFwiYmljXCIsXCJiaWRcIixcImJpZVwiLFwiYmlmXCIsXCJiaWdcIixcImJpalwiLFwiYmlrXCIsXCJiaWxcIixcImJpbVwiLFwiYmluXCIsXCJiaW9cIixcImJpcFwiLFwiYmlxXCIsXCJiaXJcIixcImJpdFwiLFwiYml1XCIsXCJiaXZcIixcImJpd1wiLFwiYml4XCIsXCJiaXlcIixcImJpelwiLFwiYmphXCIsXCJiamJcIixcImJqY1wiLFwiYmpkXCIsXCJiamVcIixcImJqZlwiLFwiYmpnXCIsXCJiamhcIixcImJqaVwiLFwiYmpqXCIsXCJiamtcIixcImJqbFwiLFwiYmptXCIsXCJiam5cIixcImJqb1wiLFwiYmpwXCIsXCJianFcIixcImJqclwiLFwiYmpzXCIsXCJianRcIixcImJqdVwiLFwiYmp2XCIsXCJiandcIixcImJqeFwiLFwiYmp5XCIsXCJianpcIixcImJrYVwiLFwiYmtiXCIsXCJia2NcIixcImJrZFwiLFwiYmtmXCIsXCJia2dcIixcImJraFwiLFwiYmtpXCIsXCJia2pcIixcImJra1wiLFwiYmtsXCIsXCJia21cIixcImJrblwiLFwiYmtvXCIsXCJia3BcIixcImJrcVwiLFwiYmtyXCIsXCJia3NcIixcImJrdFwiLFwiYmt1XCIsXCJia3ZcIixcImJrd1wiLFwiYmt4XCIsXCJia3lcIixcImJrelwiLFwiYmxhXCIsXCJibGJcIixcImJsY1wiLFwiYmxkXCIsXCJibGVcIixcImJsZlwiLFwiYmxnXCIsXCJibGhcIixcImJsaVwiLFwiYmxqXCIsXCJibGtcIixcImJsbFwiLFwiYmxtXCIsXCJibG5cIixcImJsb1wiLFwiYmxwXCIsXCJibHFcIixcImJsclwiLFwiYmxzXCIsXCJibHRcIixcImJsdlwiLFwiYmx3XCIsXCJibHhcIixcImJseVwiLFwiYmx6XCIsXCJibWFcIixcImJtYlwiLFwiYm1jXCIsXCJibWRcIixcImJtZVwiLFwiYm1mXCIsXCJibWdcIixcImJtaFwiLFwiYm1pXCIsXCJibWpcIixcImJta1wiLFwiYm1sXCIsXCJibW1cIixcImJtblwiLFwiYm1vXCIsXCJibXBcIixcImJtcVwiLFwiYm1yXCIsXCJibXNcIixcImJtdFwiLFwiYm11XCIsXCJibXZcIixcImJtd1wiLFwiYm14XCIsXCJibXlcIixcImJtelwiLFwiYm5hXCIsXCJibmJcIixcImJuY1wiLFwiYm5kXCIsXCJibmVcIixcImJuZlwiLFwiYm5nXCIsXCJibmlcIixcImJualwiLFwiYm5rXCIsXCJibmxcIixcImJubVwiLFwiYm5uXCIsXCJibm9cIixcImJucFwiLFwiYm5xXCIsXCJibnJcIixcImJuc1wiLFwiYm50XCIsXCJibnVcIixcImJudlwiLFwiYm53XCIsXCJibnhcIixcImJueVwiLFwiYm56XCIsXCJib2FcIixcImJvYlwiLFwiYm9lXCIsXCJib2ZcIixcImJvZ1wiLFwiYm9oXCIsXCJib2lcIixcImJvalwiLFwiYm9rXCIsXCJib2xcIixcImJvbVwiLFwiYm9uXCIsXCJib29cIixcImJvcFwiLFwiYm9xXCIsXCJib3JcIixcImJvdFwiLFwiYm91XCIsXCJib3ZcIixcImJvd1wiLFwiYm94XCIsXCJib3lcIixcImJvelwiLFwiYnBhXCIsXCJicGJcIixcImJwZFwiLFwiYnBlXCIsXCJicGdcIixcImJwaFwiLFwiYnBpXCIsXCJicGpcIixcImJwa1wiLFwiYnBsXCIsXCJicG1cIixcImJwblwiLFwiYnBvXCIsXCJicHBcIixcImJwcVwiLFwiYnByXCIsXCJicHNcIixcImJwdFwiLFwiYnB1XCIsXCJicHZcIixcImJwd1wiLFwiYnB4XCIsXCJicHlcIixcImJwelwiLFwiYnFhXCIsXCJicWJcIixcImJxY1wiLFwiYnFkXCIsXCJicWZcIixcImJxZ1wiLFwiYnFoXCIsXCJicWlcIixcImJxalwiLFwiYnFrXCIsXCJicWxcIixcImJxbVwiLFwiYnFuXCIsXCJicW9cIixcImJxcFwiLFwiYnFxXCIsXCJicXJcIixcImJxc1wiLFwiYnF0XCIsXCJicXVcIixcImJxdlwiLFwiYnF3XCIsXCJicXhcIixcImJxeVwiLFwiYnF6XCIsXCJicmFcIixcImJyYlwiLFwiYnJjXCIsXCJicmRcIixcImJyZlwiLFwiYnJnXCIsXCJicmhcIixcImJyaVwiLFwiYnJqXCIsXCJicmtcIixcImJybFwiLFwiYnJtXCIsXCJicm5cIixcImJyb1wiLFwiYnJwXCIsXCJicnFcIixcImJyclwiLFwiYnJzXCIsXCJicnRcIixcImJydVwiLFwiYnJ2XCIsXCJicndcIixcImJyeFwiLFwiYnJ5XCIsXCJicnpcIixcImJzYVwiLFwiYnNiXCIsXCJic2NcIixcImJzZVwiLFwiYnNmXCIsXCJic2dcIixcImJzaFwiLFwiYnNpXCIsXCJic2pcIixcImJza1wiLFwiYnNsXCIsXCJic21cIixcImJzblwiLFwiYnNvXCIsXCJic3BcIixcImJzcVwiLFwiYnNyXCIsXCJic3NcIixcImJzdFwiLFwiYnN1XCIsXCJic3ZcIixcImJzd1wiLFwiYnN4XCIsXCJic3lcIixcImJ0YVwiLFwiYnRiXCIsXCJidGNcIixcImJ0ZFwiLFwiYnRlXCIsXCJidGZcIixcImJ0Z1wiLFwiYnRoXCIsXCJidGlcIixcImJ0alwiLFwiYnRrXCIsXCJidGxcIixcImJ0bVwiLFwiYnRuXCIsXCJidG9cIixcImJ0cFwiLFwiYnRxXCIsXCJidHJcIixcImJ0c1wiLFwiYnR0XCIsXCJidHVcIixcImJ0dlwiLFwiYnR3XCIsXCJidHhcIixcImJ0eVwiLFwiYnR6XCIsXCJidWFcIixcImJ1YlwiLFwiYnVjXCIsXCJidWRcIixcImJ1ZVwiLFwiYnVmXCIsXCJidWdcIixcImJ1aFwiLFwiYnVpXCIsXCJidWpcIixcImJ1a1wiLFwiYnVtXCIsXCJidW5cIixcImJ1b1wiLFwiYnVwXCIsXCJidXFcIixcImJ1c1wiLFwiYnV0XCIsXCJidXVcIixcImJ1dlwiLFwiYnV3XCIsXCJidXhcIixcImJ1eVwiLFwiYnV6XCIsXCJidmFcIixcImJ2YlwiLFwiYnZjXCIsXCJidmRcIixcImJ2ZVwiLFwiYnZmXCIsXCJidmdcIixcImJ2aFwiLFwiYnZpXCIsXCJidmpcIixcImJ2a1wiLFwiYnZsXCIsXCJidm1cIixcImJ2blwiLFwiYnZvXCIsXCJidnBcIixcImJ2cVwiLFwiYnZyXCIsXCJidnRcIixcImJ2dVwiLFwiYnZ2XCIsXCJidndcIixcImJ2eFwiLFwiYnZ5XCIsXCJidnpcIixcImJ3YVwiLFwiYndiXCIsXCJid2NcIixcImJ3ZFwiLFwiYndlXCIsXCJid2ZcIixcImJ3Z1wiLFwiYndoXCIsXCJid2lcIixcImJ3alwiLFwiYndrXCIsXCJid2xcIixcImJ3bVwiLFwiYnduXCIsXCJid29cIixcImJ3cFwiLFwiYndxXCIsXCJid3JcIixcImJ3c1wiLFwiYnd0XCIsXCJid3VcIixcImJ3d1wiLFwiYnd4XCIsXCJid3lcIixcImJ3elwiLFwiYnhhXCIsXCJieGJcIixcImJ4Y1wiLFwiYnhkXCIsXCJieGVcIixcImJ4ZlwiLFwiYnhnXCIsXCJieGhcIixcImJ4aVwiLFwiYnhqXCIsXCJieGtcIixcImJ4bFwiLFwiYnhtXCIsXCJieG5cIixcImJ4b1wiLFwiYnhwXCIsXCJieHFcIixcImJ4clwiLFwiYnhzXCIsXCJieHVcIixcImJ4dlwiLFwiYnh3XCIsXCJieHhcIixcImJ4elwiLFwiYnlhXCIsXCJieWJcIixcImJ5Y1wiLFwiYnlkXCIsXCJieWVcIixcImJ5ZlwiLFwiYnlnXCIsXCJieWhcIixcImJ5aVwiLFwiYnlqXCIsXCJieWtcIixcImJ5bFwiLFwiYnltXCIsXCJieW5cIixcImJ5b1wiLFwiYnlwXCIsXCJieXFcIixcImJ5clwiLFwiYnlzXCIsXCJieXRcIixcImJ5dlwiLFwiYnl3XCIsXCJieXhcIixcImJ5eVwiLFwiYnl6XCIsXCJiemFcIixcImJ6YlwiLFwiYnpjXCIsXCJiemRcIixcImJ6ZVwiLFwiYnpmXCIsXCJiemdcIixcImJ6aFwiLFwiYnppXCIsXCJiempcIixcImJ6a1wiLFwiYnpsXCIsXCJiem1cIixcImJ6blwiLFwiYnpvXCIsXCJienBcIixcImJ6cVwiLFwiYnpyXCIsXCJienNcIixcImJ6dFwiLFwiYnp1XCIsXCJienZcIixcImJ6d1wiLFwiYnp4XCIsXCJienlcIixcImJ6elwiXVxuLFsgXCJjYVwiLFwiY2VcIixcImNoXCIsXCJjb1wiLFwiY3JcIixcImNzXCIsXCJjdVwiLFwiY3ZcIixcImN5XCIsXCJjYWFcIixcImNhYlwiLFwiY2FjXCIsXCJjYWRcIixcImNhZVwiLFwiY2FmXCIsXCJjYWdcIixcImNhaFwiLFwiY2FpXCIsXCJjYWpcIixcImNha1wiLFwiY2FsXCIsXCJjYW1cIixcImNhblwiLFwiY2FvXCIsXCJjYXBcIixcImNhcVwiLFwiY2FyXCIsXCJjYXNcIixcImNhdVwiLFwiY2F2XCIsXCJjYXdcIixcImNheFwiLFwiY2F5XCIsXCJjYXpcIixcImNiYVwiLFwiY2JiXCIsXCJjYmNcIixcImNiZFwiLFwiY2JlXCIsXCJjYmdcIixcImNiaFwiLFwiY2JpXCIsXCJjYmpcIixcImNia1wiLFwiY2JsXCIsXCJjYm5cIixcImNib1wiLFwiY2JxXCIsXCJjYnJcIixcImNic1wiLFwiY2J0XCIsXCJjYnVcIixcImNidlwiLFwiY2J3XCIsXCJjYnlcIixcImNjYVwiLFwiY2NjXCIsXCJjY2RcIixcImNjZVwiLFwiY2NnXCIsXCJjY2hcIixcImNjalwiLFwiY2NsXCIsXCJjY21cIixcImNjblwiLFwiY2NvXCIsXCJjY3BcIixcImNjcVwiLFwiY2NyXCIsXCJjY3NcIixcImNkYVwiLFwiY2RjXCIsXCJjZGRcIixcImNkZVwiLFwiY2RmXCIsXCJjZGdcIixcImNkaFwiLFwiY2RpXCIsXCJjZGpcIixcImNkbVwiLFwiY2RuXCIsXCJjZG9cIixcImNkclwiLFwiY2RzXCIsXCJjZHlcIixcImNkelwiLFwiY2VhXCIsXCJjZWJcIixcImNlZ1wiLFwiY2VrXCIsXCJjZWxcIixcImNlblwiLFwiY2V0XCIsXCJjZXlcIixcImNmYVwiLFwiY2ZkXCIsXCJjZmdcIixcImNmbVwiLFwiY2dhXCIsXCJjZ2NcIixcImNnZ1wiLFwiY2drXCIsXCJjaGJcIixcImNoY1wiLFwiY2hkXCIsXCJjaGZcIixcImNoZ1wiLFwiY2hoXCIsXCJjaGpcIixcImNoa1wiLFwiY2hsXCIsXCJjaG1cIixcImNoblwiLFwiY2hvXCIsXCJjaHBcIixcImNocVwiLFwiY2hyXCIsXCJjaHRcIixcImNod1wiLFwiY2h4XCIsXCJjaHlcIixcImNoelwiLFwiY2lhXCIsXCJjaWJcIixcImNpY1wiLFwiY2lkXCIsXCJjaWVcIixcImNpaFwiLFwiY2lrXCIsXCJjaW1cIixcImNpblwiLFwiY2lwXCIsXCJjaXJcIixcImNpd1wiLFwiY2l5XCIsXCJjamFcIixcImNqZVwiLFwiY2poXCIsXCJjamlcIixcImNqa1wiLFwiY2ptXCIsXCJjam5cIixcImNqb1wiLFwiY2pwXCIsXCJjanJcIixcImNqc1wiLFwiY2p2XCIsXCJjanlcIixcImNrYVwiLFwiY2tiXCIsXCJja2hcIixcImNrbFwiLFwiY2ttXCIsXCJja25cIixcImNrb1wiLFwiY2txXCIsXCJja3JcIixcImNrc1wiLFwiY2t0XCIsXCJja3VcIixcImNrdlwiLFwiY2t4XCIsXCJja3lcIixcImNrelwiLFwiY2xhXCIsXCJjbGNcIixcImNsZFwiLFwiY2xlXCIsXCJjbGhcIixcImNsaVwiLFwiY2xqXCIsXCJjbGtcIixcImNsbFwiLFwiY2xtXCIsXCJjbG9cIixcImNsdFwiLFwiY2x1XCIsXCJjbHdcIixcImNseVwiLFwiY21hXCIsXCJjbWNcIixcImNtZVwiLFwiY21nXCIsXCJjbWlcIixcImNta1wiLFwiY21sXCIsXCJjbW1cIixcImNtblwiLFwiY21vXCIsXCJjbXJcIixcImNtc1wiLFwiY210XCIsXCJjbmFcIixcImNuYlwiLFwiY25jXCIsXCJjbmdcIixcImNuaFwiLFwiY25pXCIsXCJjbmtcIixcImNubFwiLFwiY25vXCIsXCJjbnBcIixcImNuclwiLFwiY25zXCIsXCJjbnRcIixcImNudVwiLFwiY253XCIsXCJjbnhcIixcImNvYVwiLFwiY29iXCIsXCJjb2NcIixcImNvZFwiLFwiY29lXCIsXCJjb2ZcIixcImNvZ1wiLFwiY29oXCIsXCJjb2pcIixcImNva1wiLFwiY29sXCIsXCJjb21cIixcImNvblwiLFwiY29vXCIsXCJjb3BcIixcImNvcVwiLFwiY290XCIsXCJjb3VcIixcImNvdlwiLFwiY293XCIsXCJjb3hcIixcImNveVwiLFwiY296XCIsXCJjcGFcIixcImNwYlwiLFwiY3BjXCIsXCJjcGVcIixcImNwZlwiLFwiY3BnXCIsXCJjcGlcIixcImNwblwiLFwiY3BvXCIsXCJjcHBcIixcImNwc1wiLFwiY3B1XCIsXCJjcHhcIixcImNweVwiLFwiY3FkXCIsXCJjcXVcIixcImNyYVwiLFwiY3JiXCIsXCJjcmNcIixcImNyZFwiLFwiY3JmXCIsXCJjcmdcIixcImNyaFwiLFwiY3JpXCIsXCJjcmpcIixcImNya1wiLFwiY3JsXCIsXCJjcm1cIixcImNyblwiLFwiY3JvXCIsXCJjcnBcIixcImNycVwiLFwiY3JyXCIsXCJjcnNcIixcImNydFwiLFwiY3J2XCIsXCJjcndcIixcImNyeFwiLFwiY3J5XCIsXCJjcnpcIixcImNzYVwiLFwiY3NiXCIsXCJjc2NcIixcImNzZFwiLFwiY3NlXCIsXCJjc2ZcIixcImNzZ1wiLFwiY3NoXCIsXCJjc2lcIixcImNzalwiLFwiY3NrXCIsXCJjc2xcIixcImNzbVwiLFwiY3NuXCIsXCJjc29cIixcImNzcFwiLFwiY3NxXCIsXCJjc3JcIixcImNzc1wiLFwiY3N0XCIsXCJjc3VcIixcImNzdlwiLFwiY3N3XCIsXCJjc3hcIixcImNzeVwiLFwiY3N6XCIsXCJjdGFcIixcImN0Y1wiLFwiY3RkXCIsXCJjdGVcIixcImN0Z1wiLFwiY3RoXCIsXCJjdGxcIixcImN0bVwiLFwiY3RuXCIsXCJjdG9cIixcImN0cFwiLFwiY3RzXCIsXCJjdHRcIixcImN0dVwiLFwiY3R5XCIsXCJjdHpcIixcImN1YVwiLFwiY3ViXCIsXCJjdWNcIixcImN1Z1wiLFwiY3VoXCIsXCJjdWlcIixcImN1alwiLFwiY3VrXCIsXCJjdWxcIixcImN1bVwiLFwiY3VvXCIsXCJjdXBcIixcImN1cVwiLFwiY3VyXCIsXCJjdXNcIixcImN1dFwiLFwiY3V1XCIsXCJjdXZcIixcImN1d1wiLFwiY3V4XCIsXCJjdXlcIixcImN2Z1wiLFwiY3ZuXCIsXCJjd2FcIixcImN3YlwiLFwiY3dkXCIsXCJjd2VcIixcImN3Z1wiLFwiY3d0XCIsXCJjeWFcIixcImN5YlwiLFwiY3lvXCIsXCJjemhcIixcImN6a1wiLFwiY3puXCIsXCJjem9cIixcImN6dFwiXVxuLFsgXCJkYVwiLFwiZGVcIixcImR2XCIsXCJkelwiLFwiZGFhXCIsXCJkYWNcIixcImRhZFwiLFwiZGFlXCIsXCJkYWZcIixcImRhZ1wiLFwiZGFoXCIsXCJkYWlcIixcImRhalwiLFwiZGFrXCIsXCJkYWxcIixcImRhbVwiLFwiZGFvXCIsXCJkYXBcIixcImRhcVwiLFwiZGFyXCIsXCJkYXNcIixcImRhdVwiLFwiZGF2XCIsXCJkYXdcIixcImRheFwiLFwiZGF5XCIsXCJkYXpcIixcImRiYVwiLFwiZGJiXCIsXCJkYmRcIixcImRiZVwiLFwiZGJmXCIsXCJkYmdcIixcImRiaVwiLFwiZGJqXCIsXCJkYmxcIixcImRibVwiLFwiZGJuXCIsXCJkYm9cIixcImRicFwiLFwiZGJxXCIsXCJkYnJcIixcImRidFwiLFwiZGJ1XCIsXCJkYnZcIixcImRid1wiLFwiZGJ5XCIsXCJkY2NcIixcImRjclwiLFwiZGRhXCIsXCJkZGRcIixcImRkZVwiLFwiZGRnXCIsXCJkZGlcIixcImRkalwiLFwiZGRuXCIsXCJkZG9cIixcImRkclwiLFwiZGRzXCIsXCJkZHdcIixcImRlY1wiLFwiZGVkXCIsXCJkZWVcIixcImRlZlwiLFwiZGVnXCIsXCJkZWhcIixcImRlaVwiLFwiZGVrXCIsXCJkZWxcIixcImRlbVwiLFwiZGVuXCIsXCJkZXBcIixcImRlcVwiLFwiZGVyXCIsXCJkZXNcIixcImRldlwiLFwiZGV6XCIsXCJkZ2FcIixcImRnYlwiLFwiZGdjXCIsXCJkZ2RcIixcImRnZVwiLFwiZGdnXCIsXCJkZ2hcIixcImRnaVwiLFwiZGdrXCIsXCJkZ2xcIixcImRnblwiLFwiZGdvXCIsXCJkZ3JcIixcImRnc1wiLFwiZGd0XCIsXCJkZ3VcIixcImRnd1wiLFwiZGd4XCIsXCJkZ3pcIixcImRoYVwiLFwiZGhkXCIsXCJkaGdcIixcImRoaVwiLFwiZGhsXCIsXCJkaG1cIixcImRoblwiLFwiZGhvXCIsXCJkaHJcIixcImRoc1wiLFwiZGh1XCIsXCJkaHZcIixcImRod1wiLFwiZGh4XCIsXCJkaWFcIixcImRpYlwiLFwiZGljXCIsXCJkaWRcIixcImRpZlwiLFwiZGlnXCIsXCJkaWhcIixcImRpaVwiLFwiZGlqXCIsXCJkaWtcIixcImRpbFwiLFwiZGltXCIsXCJkaW5cIixcImRpb1wiLFwiZGlwXCIsXCJkaXFcIixcImRpclwiLFwiZGlzXCIsXCJkaXRcIixcImRpdVwiLFwiZGl3XCIsXCJkaXhcIixcImRpeVwiLFwiZGl6XCIsXCJkamFcIixcImRqYlwiLFwiZGpjXCIsXCJkamRcIixcImRqZVwiLFwiZGpmXCIsXCJkamlcIixcImRqalwiLFwiZGprXCIsXCJkamxcIixcImRqbVwiLFwiZGpuXCIsXCJkam9cIixcImRqclwiLFwiZGp1XCIsXCJkandcIixcImRrYVwiLFwiZGtnXCIsXCJka2tcIixcImRrbFwiLFwiZGtyXCIsXCJka3NcIixcImRreFwiLFwiZGxnXCIsXCJkbGtcIixcImRsbVwiLFwiZGxuXCIsXCJkbWFcIixcImRtYlwiLFwiZG1jXCIsXCJkbWRcIixcImRtZVwiLFwiZG1mXCIsXCJkbWdcIixcImRta1wiLFwiZG1sXCIsXCJkbW1cIixcImRtblwiLFwiZG1vXCIsXCJkbXJcIixcImRtc1wiLFwiZG11XCIsXCJkbXZcIixcImRtd1wiLFwiZG14XCIsXCJkbXlcIixcImRuYVwiLFwiZG5kXCIsXCJkbmVcIixcImRuZ1wiLFwiZG5pXCIsXCJkbmpcIixcImRua1wiLFwiZG5uXCIsXCJkbm9cIixcImRuclwiLFwiZG50XCIsXCJkbnVcIixcImRudlwiLFwiZG53XCIsXCJkbnlcIixcImRvYVwiLFwiZG9iXCIsXCJkb2NcIixcImRvZVwiLFwiZG9mXCIsXCJkb2hcIixcImRvaVwiLFwiZG9rXCIsXCJkb2xcIixcImRvblwiLFwiZG9vXCIsXCJkb3BcIixcImRvcVwiLFwiZG9yXCIsXCJkb3NcIixcImRvdFwiLFwiZG92XCIsXCJkb3dcIixcImRveFwiLFwiZG95XCIsXCJkb3pcIixcImRwcFwiLFwiZHJhXCIsXCJkcmJcIixcImRyY1wiLFwiZHJkXCIsXCJkcmVcIixcImRyZ1wiLFwiZHJoXCIsXCJkcmlcIixcImRybFwiLFwiZHJuXCIsXCJkcm9cIixcImRycVwiLFwiZHJyXCIsXCJkcnNcIixcImRydFwiLFwiZHJ1XCIsXCJkcndcIixcImRyeVwiLFwiZHNiXCIsXCJkc2VcIixcImRzaFwiLFwiZHNpXCIsXCJkc2xcIixcImRzblwiLFwiZHNvXCIsXCJkc3FcIixcImR0YVwiLFwiZHRiXCIsXCJkdGRcIixcImR0aFwiLFwiZHRpXCIsXCJkdGtcIixcImR0bVwiLFwiZHRuXCIsXCJkdG9cIixcImR0cFwiLFwiZHRyXCIsXCJkdHNcIixcImR0dFwiLFwiZHR1XCIsXCJkdHlcIixcImR1YVwiLFwiZHViXCIsXCJkdWNcIixcImR1ZFwiLFwiZHVlXCIsXCJkdWZcIixcImR1Z1wiLFwiZHVoXCIsXCJkdWlcIixcImR1alwiLFwiZHVrXCIsXCJkdWxcIixcImR1bVwiLFwiZHVuXCIsXCJkdW9cIixcImR1cFwiLFwiZHVxXCIsXCJkdXJcIixcImR1c1wiLFwiZHV1XCIsXCJkdXZcIixcImR1d1wiLFwiZHV4XCIsXCJkdXlcIixcImR1elwiLFwiZHZhXCIsXCJkd2FcIixcImR3a1wiLFwiZHdsXCIsXCJkd3JcIixcImR3c1wiLFwiZHd1XCIsXCJkd3dcIixcImR3eVwiLFwiZHd6XCIsXCJkeWFcIixcImR5YlwiLFwiZHlkXCIsXCJkeWdcIixcImR5aVwiLFwiZHltXCIsXCJkeW5cIixcImR5b1wiLFwiZHl1XCIsXCJkeXlcIixcImR6YVwiLFwiZHpkXCIsXCJkemVcIixcImR6Z1wiLFwiZHpsXCIsXCJkem5cIl1cbixbIFwiZWVcIixcImVsXCIsXCJlblwiLFwiZW9cIixcImVzXCIsXCJldFwiLFwiZXVcIixcImVhYVwiLFwiZWJjXCIsXCJlYmdcIixcImVia1wiLFwiZWJvXCIsXCJlYnJcIixcImVidVwiLFwiZWNyXCIsXCJlY3NcIixcImVjeVwiLFwiZWVlXCIsXCJlZmFcIixcImVmZVwiLFwiZWZpXCIsXCJlZ2FcIixcImVnbFwiLFwiZWdvXCIsXCJlZ3hcIixcImVneVwiLFwiZWhzXCIsXCJlaHVcIixcImVpcFwiLFwiZWl0XCIsXCJlaXZcIixcImVqYVwiLFwiZWthXCIsXCJla2NcIixcImVrZVwiLFwiZWtnXCIsXCJla2lcIixcImVra1wiLFwiZWtsXCIsXCJla21cIixcImVrb1wiLFwiZWtwXCIsXCJla3JcIixcImVreVwiLFwiZWxlXCIsXCJlbGhcIixcImVsaVwiLFwiZWxrXCIsXCJlbG1cIixcImVsb1wiLFwiZWxwXCIsXCJlbHVcIixcImVseFwiLFwiZW1hXCIsXCJlbWJcIixcImVtZVwiLFwiZW1nXCIsXCJlbWlcIixcImVta1wiLFwiZW1tXCIsXCJlbW5cIixcImVtb1wiLFwiZW1wXCIsXCJlbXFcIixcImVtc1wiLFwiZW11XCIsXCJlbXdcIixcImVteFwiLFwiZW15XCIsXCJlbXpcIixcImVuYVwiLFwiZW5iXCIsXCJlbmNcIixcImVuZFwiLFwiZW5mXCIsXCJlbmhcIixcImVubFwiLFwiZW5tXCIsXCJlbm5cIixcImVub1wiLFwiZW5xXCIsXCJlbnJcIixcImVudVwiLFwiZW52XCIsXCJlbndcIixcImVueFwiLFwiZW90XCIsXCJlcGlcIixcImVyYVwiLFwiZXJnXCIsXCJlcmhcIixcImVyaVwiLFwiZXJrXCIsXCJlcm9cIixcImVyclwiLFwiZXJzXCIsXCJlcnRcIixcImVyd1wiLFwiZXNlXCIsXCJlc2dcIixcImVzaFwiLFwiZXNpXCIsXCJlc2tcIixcImVzbFwiLFwiZXNtXCIsXCJlc25cIixcImVzb1wiLFwiZXNxXCIsXCJlc3NcIixcImVzdVwiLFwiZXN4XCIsXCJlc3lcIixcImV0YlwiLFwiZXRjXCIsXCJldGhcIixcImV0blwiLFwiZXRvXCIsXCJldHJcIixcImV0c1wiLFwiZXR0XCIsXCJldHVcIixcImV0eFwiLFwiZXR6XCIsXCJldXFcIixcImV2ZVwiLFwiZXZoXCIsXCJldm5cIixcImV3b1wiLFwiZXh0XCIsXCJleWFcIixcImV5b1wiLFwiZXphXCIsXCJlemVcIl1cbixbIFwiZmFcIixcImZmXCIsXCJmaVwiLFwiZmpcIixcImZvXCIsXCJmclwiLFwiZnlcIixcImZhYVwiLFwiZmFiXCIsXCJmYWRcIixcImZhZlwiLFwiZmFnXCIsXCJmYWhcIixcImZhaVwiLFwiZmFqXCIsXCJmYWtcIixcImZhbFwiLFwiZmFtXCIsXCJmYW5cIixcImZhcFwiLFwiZmFyXCIsXCJmYXRcIixcImZhdVwiLFwiZmF4XCIsXCJmYXlcIixcImZhelwiLFwiZmJsXCIsXCJmY3NcIixcImZlclwiLFwiZmZpXCIsXCJmZm1cIixcImZnclwiLFwiZmlhXCIsXCJmaWVcIixcImZpZlwiLFwiZmlsXCIsXCJmaXBcIixcImZpclwiLFwiZml0XCIsXCJmaXVcIixcImZpd1wiLFwiZmtrXCIsXCJma3ZcIixcImZsYVwiLFwiZmxoXCIsXCJmbGlcIixcImZsbFwiLFwiZmxuXCIsXCJmbHJcIixcImZseVwiLFwiZm1wXCIsXCJmbXVcIixcImZuYlwiLFwiZm5nXCIsXCJmbmlcIixcImZvZFwiLFwiZm9pXCIsXCJmb21cIixcImZvblwiLFwiZm9yXCIsXCJmb3NcIixcImZveFwiLFwiZnBlXCIsXCJmcXNcIixcImZyY1wiLFwiZnJkXCIsXCJmcmtcIixcImZybVwiLFwiZnJvXCIsXCJmcnBcIixcImZycVwiLFwiZnJyXCIsXCJmcnNcIixcImZydFwiLFwiZnNlXCIsXCJmc2xcIixcImZzc1wiLFwiZnViXCIsXCJmdWNcIixcImZ1ZFwiLFwiZnVlXCIsXCJmdWZcIixcImZ1aFwiLFwiZnVpXCIsXCJmdWpcIixcImZ1bVwiLFwiZnVuXCIsXCJmdXFcIixcImZ1clwiLFwiZnV0XCIsXCJmdXVcIixcImZ1dlwiLFwiZnV5XCIsXCJmdnJcIixcImZ3YVwiLFwiZndlXCJdXG4sWyBcImdhXCIsXCJnZFwiLFwiZ2xcIixcImduXCIsXCJndVwiLFwiZ3ZcIixcImdhYVwiLFwiZ2FiXCIsXCJnYWNcIixcImdhZFwiLFwiZ2FlXCIsXCJnYWZcIixcImdhZ1wiLFwiZ2FoXCIsXCJnYWlcIixcImdhalwiLFwiZ2FrXCIsXCJnYWxcIixcImdhbVwiLFwiZ2FuXCIsXCJnYW9cIixcImdhcFwiLFwiZ2FxXCIsXCJnYXJcIixcImdhc1wiLFwiZ2F0XCIsXCJnYXVcIixcImdhdlwiLFwiZ2F3XCIsXCJnYXhcIixcImdheVwiLFwiZ2F6XCIsXCJnYmFcIixcImdiYlwiLFwiZ2JjXCIsXCJnYmRcIixcImdiZVwiLFwiZ2JmXCIsXCJnYmdcIixcImdiaFwiLFwiZ2JpXCIsXCJnYmpcIixcImdia1wiLFwiZ2JsXCIsXCJnYm1cIixcImdiblwiLFwiZ2JvXCIsXCJnYnBcIixcImdicVwiLFwiZ2JyXCIsXCJnYnNcIixcImdidVwiLFwiZ2J2XCIsXCJnYndcIixcImdieFwiLFwiZ2J5XCIsXCJnYnpcIixcImdjY1wiLFwiZ2NkXCIsXCJnY2VcIixcImdjZlwiLFwiZ2NsXCIsXCJnY25cIixcImdjclwiLFwiZ2N0XCIsXCJnZGFcIixcImdkYlwiLFwiZ2RjXCIsXCJnZGRcIixcImdkZVwiLFwiZ2RmXCIsXCJnZGdcIixcImdkaFwiLFwiZ2RpXCIsXCJnZGpcIixcImdka1wiLFwiZ2RsXCIsXCJnZG1cIixcImdkblwiLFwiZ2RvXCIsXCJnZHFcIixcImdkclwiLFwiZ2RzXCIsXCJnZHRcIixcImdkdVwiLFwiZ2R4XCIsXCJnZWFcIixcImdlYlwiLFwiZ2VjXCIsXCJnZWRcIixcImdlZlwiLFwiZ2VnXCIsXCJnZWhcIixcImdlaVwiLFwiZ2VqXCIsXCJnZWtcIixcImdlbFwiLFwiZ2VtXCIsXCJnZXFcIixcImdlc1wiLFwiZ2V2XCIsXCJnZXdcIixcImdleFwiLFwiZ2V5XCIsXCJnZXpcIixcImdma1wiLFwiZ2Z0XCIsXCJnZnhcIixcImdnYVwiLFwiZ2diXCIsXCJnZ2RcIixcImdnZVwiLFwiZ2dnXCIsXCJnZ2tcIixcImdnbFwiLFwiZ2duXCIsXCJnZ29cIixcImdnclwiLFwiZ2d0XCIsXCJnZ3VcIixcImdnd1wiLFwiZ2hhXCIsXCJnaGNcIixcImdoZVwiLFwiZ2hoXCIsXCJnaGtcIixcImdobFwiLFwiZ2huXCIsXCJnaG9cIixcImdoclwiLFwiZ2hzXCIsXCJnaHRcIixcImdpYVwiLFwiZ2liXCIsXCJnaWNcIixcImdpZFwiLFwiZ2llXCIsXCJnaWdcIixcImdpaFwiLFwiZ2lpXCIsXCJnaWxcIixcImdpbVwiLFwiZ2luXCIsXCJnaW9cIixcImdpcFwiLFwiZ2lxXCIsXCJnaXJcIixcImdpc1wiLFwiZ2l0XCIsXCJnaXVcIixcImdpd1wiLFwiZ2l4XCIsXCJnaXlcIixcImdpelwiLFwiZ2ppXCIsXCJnamtcIixcImdqbVwiLFwiZ2puXCIsXCJnanJcIixcImdqdVwiLFwiZ2thXCIsXCJna2RcIixcImdrZVwiLFwiZ2tuXCIsXCJna29cIixcImdrcFwiLFwiZ2t1XCIsXCJnbGJcIixcImdsY1wiLFwiZ2xkXCIsXCJnbGhcIixcImdsaVwiLFwiZ2xqXCIsXCJnbGtcIixcImdsbFwiLFwiZ2xvXCIsXCJnbHJcIixcImdsdVwiLFwiZ2x3XCIsXCJnbHlcIixcImdtYVwiLFwiZ21iXCIsXCJnbWRcIixcImdtZVwiLFwiZ21nXCIsXCJnbWhcIixcImdtbFwiLFwiZ21tXCIsXCJnbW5cIixcImdtcVwiLFwiZ21yXCIsXCJnbXVcIixcImdtdlwiLFwiZ213XCIsXCJnbXhcIixcImdteVwiLFwiZ216XCIsXCJnbmFcIixcImduYlwiLFwiZ25jXCIsXCJnbmRcIixcImduZVwiLFwiZ25nXCIsXCJnbmhcIixcImduaVwiLFwiZ25qXCIsXCJnbmtcIixcImdubFwiLFwiZ25tXCIsXCJnbm5cIixcImdub1wiLFwiZ25xXCIsXCJnbnJcIixcImdudFwiLFwiZ251XCIsXCJnbndcIixcImduelwiLFwiZ29hXCIsXCJnb2JcIixcImdvY1wiLFwiZ29kXCIsXCJnb2VcIixcImdvZlwiLFwiZ29nXCIsXCJnb2hcIixcImdvaVwiLFwiZ29qXCIsXCJnb2tcIixcImdvbFwiLFwiZ29tXCIsXCJnb25cIixcImdvb1wiLFwiZ29wXCIsXCJnb3FcIixcImdvclwiLFwiZ29zXCIsXCJnb3RcIixcImdvdVwiLFwiZ293XCIsXCJnb3hcIixcImdveVwiLFwiZ296XCIsXCJncGFcIixcImdwZVwiLFwiZ3BuXCIsXCJncWFcIixcImdxaVwiLFwiZ3FuXCIsXCJncXJcIixcImdxdVwiLFwiZ3JhXCIsXCJncmJcIixcImdyY1wiLFwiZ3JkXCIsXCJncmdcIixcImdyaFwiLFwiZ3JpXCIsXCJncmpcIixcImdya1wiLFwiZ3JtXCIsXCJncm9cIixcImdycVwiLFwiZ3JyXCIsXCJncnNcIixcImdydFwiLFwiZ3J1XCIsXCJncnZcIixcImdyd1wiLFwiZ3J4XCIsXCJncnlcIixcImdyelwiLFwiZ3NlXCIsXCJnc2dcIixcImdzbFwiLFwiZ3NtXCIsXCJnc25cIixcImdzb1wiLFwiZ3NwXCIsXCJnc3NcIixcImdzd1wiLFwiZ3RhXCIsXCJndGlcIixcImd0dVwiLFwiZ3VhXCIsXCJndWJcIixcImd1Y1wiLFwiZ3VkXCIsXCJndWVcIixcImd1ZlwiLFwiZ3VnXCIsXCJndWhcIixcImd1aVwiLFwiZ3VrXCIsXCJndWxcIixcImd1bVwiLFwiZ3VuXCIsXCJndW9cIixcImd1cFwiLFwiZ3VxXCIsXCJndXJcIixcImd1c1wiLFwiZ3V0XCIsXCJndXVcIixcImd1dlwiLFwiZ3V3XCIsXCJndXhcIixcImd1elwiLFwiZ3ZhXCIsXCJndmNcIixcImd2ZVwiLFwiZ3ZmXCIsXCJndmpcIixcImd2bFwiLFwiZ3ZtXCIsXCJndm5cIixcImd2b1wiLFwiZ3ZwXCIsXCJndnJcIixcImd2c1wiLFwiZ3Z5XCIsXCJnd2FcIixcImd3YlwiLFwiZ3djXCIsXCJnd2RcIixcImd3ZVwiLFwiZ3dmXCIsXCJnd2dcIixcImd3aVwiLFwiZ3dqXCIsXCJnd21cIixcImd3blwiLFwiZ3dyXCIsXCJnd3RcIixcImd3dVwiLFwiZ3d3XCIsXCJnd3hcIixcImd4eFwiLFwiZ3lhXCIsXCJneWJcIixcImd5ZFwiLFwiZ3llXCIsXCJneWZcIixcImd5Z1wiLFwiZ3lpXCIsXCJneWxcIixcImd5bVwiLFwiZ3luXCIsXCJneW9cIixcImd5clwiLFwiZ3l5XCIsXCJneXpcIixcImd6YVwiLFwiZ3ppXCIsXCJnem5cIl1cbixbIFwiaGFcIixcImhlXCIsXCJoaVwiLFwiaG9cIixcImhyXCIsXCJodFwiLFwiaHVcIixcImh5XCIsXCJoelwiLFwiaGFhXCIsXCJoYWJcIixcImhhY1wiLFwiaGFkXCIsXCJoYWVcIixcImhhZlwiLFwiaGFnXCIsXCJoYWhcIixcImhhaVwiLFwiaGFqXCIsXCJoYWtcIixcImhhbFwiLFwiaGFtXCIsXCJoYW5cIixcImhhb1wiLFwiaGFwXCIsXCJoYXFcIixcImhhclwiLFwiaGFzXCIsXCJoYXZcIixcImhhd1wiLFwiaGF4XCIsXCJoYXlcIixcImhhelwiLFwiaGJhXCIsXCJoYmJcIixcImhiblwiLFwiaGJvXCIsXCJoYnVcIixcImhjYVwiLFwiaGNoXCIsXCJoZG5cIixcImhkc1wiLFwiaGR5XCIsXCJoZWFcIixcImhlZFwiLFwiaGVnXCIsXCJoZWhcIixcImhlaVwiLFwiaGVtXCIsXCJoZ21cIixcImhnd1wiLFwiaGhpXCIsXCJoaHJcIixcImhoeVwiLFwiaGlhXCIsXCJoaWJcIixcImhpZFwiLFwiaGlmXCIsXCJoaWdcIixcImhpaFwiLFwiaGlpXCIsXCJoaWpcIixcImhpa1wiLFwiaGlsXCIsXCJoaW1cIixcImhpb1wiLFwiaGlyXCIsXCJoaXRcIixcImhpd1wiLFwiaGl4XCIsXCJoamlcIixcImhrYVwiLFwiaGtlXCIsXCJoa2hcIixcImhra1wiLFwiaGtuXCIsXCJoa3NcIixcImhsYVwiLFwiaGxiXCIsXCJobGRcIixcImhsZVwiLFwiaGx0XCIsXCJobHVcIixcImhtYVwiLFwiaG1iXCIsXCJobWNcIixcImhtZFwiLFwiaG1lXCIsXCJobWZcIixcImhtZ1wiLFwiaG1oXCIsXCJobWlcIixcImhtalwiLFwiaG1rXCIsXCJobWxcIixcImhtbVwiLFwiaG1uXCIsXCJobXBcIixcImhtcVwiLFwiaG1yXCIsXCJobXNcIixcImhtdFwiLFwiaG11XCIsXCJobXZcIixcImhtd1wiLFwiaG14XCIsXCJobXlcIixcImhtelwiLFwiaG5hXCIsXCJobmRcIixcImhuZVwiLFwiaG5nXCIsXCJobmhcIixcImhuaVwiLFwiaG5qXCIsXCJobm5cIixcImhub1wiLFwiaG5zXCIsXCJobnVcIixcImhvYVwiLFwiaG9iXCIsXCJob2NcIixcImhvZFwiLFwiaG9lXCIsXCJob2hcIixcImhvaVwiLFwiaG9qXCIsXCJob2tcIixcImhvbFwiLFwiaG9tXCIsXCJob29cIixcImhvcFwiLFwiaG9yXCIsXCJob3NcIixcImhvdFwiLFwiaG92XCIsXCJob3dcIixcImhveVwiLFwiaG96XCIsXCJocG9cIixcImhwc1wiLFwiaHJhXCIsXCJocmNcIixcImhyZVwiLFwiaHJrXCIsXCJocm1cIixcImhyb1wiLFwiaHJwXCIsXCJocnJcIixcImhydFwiLFwiaHJ1XCIsXCJocndcIixcImhyeFwiLFwiaHJ6XCIsXCJoc2JcIixcImhzaFwiLFwiaHNsXCIsXCJoc25cIixcImhzc1wiLFwiaHRpXCIsXCJodG9cIixcImh0c1wiLFwiaHR1XCIsXCJodHhcIixcImh1YlwiLFwiaHVjXCIsXCJodWRcIixcImh1ZVwiLFwiaHVmXCIsXCJodWdcIixcImh1aFwiLFwiaHVpXCIsXCJodWpcIixcImh1a1wiLFwiaHVsXCIsXCJodW1cIixcImh1b1wiLFwiaHVwXCIsXCJodXFcIixcImh1clwiLFwiaHVzXCIsXCJodXRcIixcImh1dVwiLFwiaHV2XCIsXCJodXdcIixcImh1eFwiLFwiaHV5XCIsXCJodXpcIixcImh2Y1wiLFwiaHZlXCIsXCJodmtcIixcImh2blwiLFwiaHZ2XCIsXCJod2FcIixcImh3Y1wiLFwiaHdvXCIsXCJoeWFcIixcImh5d1wiLFwiaHl4XCJdXG4sWyBcImlhXCIsXCJpZFwiLFwiaWVcIixcImlnXCIsXCJpaVwiLFwiaWtcIixcImluXCIsXCJpb1wiLFwiaXNcIixcIml0XCIsXCJpdVwiLFwiaXdcIixcImlhaVwiLFwiaWFuXCIsXCJpYXBcIixcImlhclwiLFwiaWJhXCIsXCJpYmJcIixcImliZFwiLFwiaWJlXCIsXCJpYmdcIixcImliaFwiLFwiaWJpXCIsXCJpYmxcIixcImlibVwiLFwiaWJuXCIsXCJpYnJcIixcImlidVwiLFwiaWJ5XCIsXCJpY2FcIixcImljaFwiLFwiaWNsXCIsXCJpY3JcIixcImlkYVwiLFwiaWRiXCIsXCJpZGNcIixcImlkZFwiLFwiaWRlXCIsXCJpZGlcIixcImlkclwiLFwiaWRzXCIsXCJpZHRcIixcImlkdVwiLFwiaWZhXCIsXCJpZmJcIixcImlmZVwiLFwiaWZmXCIsXCJpZmtcIixcImlmbVwiLFwiaWZ1XCIsXCJpZnlcIixcImlnYlwiLFwiaWdlXCIsXCJpZ2dcIixcImlnbFwiLFwiaWdtXCIsXCJpZ25cIixcImlnb1wiLFwiaWdzXCIsXCJpZ3dcIixcImloYlwiLFwiaWhpXCIsXCJpaHBcIixcImlod1wiLFwiaWluXCIsXCJpaXJcIixcImlqY1wiLFwiaWplXCIsXCJpampcIixcImlqblwiLFwiaWpvXCIsXCJpanNcIixcImlrZVwiLFwiaWtpXCIsXCJpa2tcIixcImlrbFwiLFwiaWtvXCIsXCJpa3BcIixcImlrclwiLFwiaWtzXCIsXCJpa3RcIixcImlrdlwiLFwiaWt3XCIsXCJpa3hcIixcImlrelwiLFwiaWxhXCIsXCJpbGJcIixcImlsZ1wiLFwiaWxpXCIsXCJpbGtcIixcImlsbFwiLFwiaWxtXCIsXCJpbG9cIixcImlscFwiLFwiaWxzXCIsXCJpbHVcIixcImlsdlwiLFwiaWx3XCIsXCJpbWFcIixcImltZVwiLFwiaW1pXCIsXCJpbWxcIixcImltblwiLFwiaW1vXCIsXCJpbXJcIixcImltc1wiLFwiaW15XCIsXCJpbmJcIixcImluY1wiLFwiaW5lXCIsXCJpbmdcIixcImluaFwiLFwiaW5qXCIsXCJpbmxcIixcImlubVwiLFwiaW5uXCIsXCJpbm9cIixcImlucFwiLFwiaW5zXCIsXCJpbnRcIixcImluelwiLFwiaW9yXCIsXCJpb3VcIixcImlvd1wiLFwiaXBpXCIsXCJpcG9cIixcImlxdVwiLFwiaXF3XCIsXCJpcmFcIixcImlyZVwiLFwiaXJoXCIsXCJpcmlcIixcImlya1wiLFwiaXJuXCIsXCJpcm9cIixcImlyclwiLFwiaXJ1XCIsXCJpcnhcIixcImlyeVwiLFwiaXNhXCIsXCJpc2NcIixcImlzZFwiLFwiaXNlXCIsXCJpc2dcIixcImlzaFwiLFwiaXNpXCIsXCJpc2tcIixcImlzbVwiLFwiaXNuXCIsXCJpc29cIixcImlzclwiLFwiaXN0XCIsXCJpc3VcIixcIml0YlwiLFwiaXRjXCIsXCJpdGRcIixcIml0ZVwiLFwiaXRpXCIsXCJpdGtcIixcIml0bFwiLFwiaXRtXCIsXCJpdG9cIixcIml0clwiLFwiaXRzXCIsXCJpdHRcIixcIml0dlwiLFwiaXR3XCIsXCJpdHhcIixcIml0eVwiLFwiaXR6XCIsXCJpdW1cIixcIml2YlwiLFwiaXZ2XCIsXCJpd2tcIixcIml3bVwiLFwiaXdvXCIsXCJpd3NcIixcIml4Y1wiLFwiaXhsXCIsXCJpeWFcIixcIml5b1wiLFwiaXl4XCIsXCJpemhcIixcIml6aVwiLFwiaXpyXCIsXCJpenpcIl1cbixbIFwiamFcIixcImppXCIsXCJqdlwiLFwiandcIixcImphYVwiLFwiamFiXCIsXCJqYWNcIixcImphZFwiLFwiamFlXCIsXCJqYWZcIixcImphaFwiLFwiamFqXCIsXCJqYWtcIixcImphbFwiLFwiamFtXCIsXCJqYW5cIixcImphb1wiLFwiamFxXCIsXCJqYXJcIixcImphc1wiLFwiamF0XCIsXCJqYXVcIixcImpheFwiLFwiamF5XCIsXCJqYXpcIixcImpiZVwiLFwiamJpXCIsXCJqYmpcIixcImpia1wiLFwiamJtXCIsXCJqYm5cIixcImpib1wiLFwiamJyXCIsXCJqYnRcIixcImpidVwiLFwiamJ3XCIsXCJqY3NcIixcImpjdFwiLFwiamRhXCIsXCJqZGdcIixcImpkdFwiLFwiamViXCIsXCJqZWVcIixcImplZ1wiLFwiamVoXCIsXCJqZWlcIixcImpla1wiLFwiamVsXCIsXCJqZW5cIixcImplclwiLFwiamV0XCIsXCJqZXVcIixcImpnYlwiLFwiamdlXCIsXCJqZ2tcIixcImpnb1wiLFwiamhpXCIsXCJqaHNcIixcImppYVwiLFwiamliXCIsXCJqaWNcIixcImppZFwiLFwiamllXCIsXCJqaWdcIixcImppaFwiLFwiamlpXCIsXCJqaWxcIixcImppbVwiLFwiamlvXCIsXCJqaXFcIixcImppdFwiLFwiaml1XCIsXCJqaXZcIixcImppeVwiLFwiamplXCIsXCJqanJcIixcImprYVwiLFwiamttXCIsXCJqa29cIixcImprcFwiLFwiamtyXCIsXCJqa3NcIixcImprdVwiLFwiamxlXCIsXCJqbHNcIixcImptYVwiLFwiam1iXCIsXCJqbWNcIixcImptZFwiLFwiam1pXCIsXCJqbWxcIixcImptblwiLFwiam1yXCIsXCJqbXNcIixcImptd1wiLFwiam14XCIsXCJqbmFcIixcImpuZFwiLFwiam5nXCIsXCJqbmlcIixcImpualwiLFwiam5sXCIsXCJqbnNcIixcImpvYlwiLFwiam9kXCIsXCJqb2dcIixcImpvclwiLFwiam9zXCIsXCJqb3dcIixcImpwYVwiLFwianByXCIsXCJqcHhcIixcImpxclwiLFwianJhXCIsXCJqcmJcIixcImpyclwiLFwianJ0XCIsXCJqcnVcIixcImpzbFwiLFwianVhXCIsXCJqdWJcIixcImp1Y1wiLFwianVkXCIsXCJqdWhcIixcImp1aVwiLFwianVrXCIsXCJqdWxcIixcImp1bVwiLFwianVuXCIsXCJqdW9cIixcImp1cFwiLFwianVyXCIsXCJqdXNcIixcImp1dFwiLFwianV1XCIsXCJqdXdcIixcImp1eVwiLFwianZkXCIsXCJqdm5cIixcImp3aVwiLFwianlhXCIsXCJqeWVcIixcImp5eVwiXVxuLFsgXCJrYVwiLFwia2dcIixcImtpXCIsXCJralwiLFwia2tcIixcImtsXCIsXCJrbVwiLFwia25cIixcImtvXCIsXCJrclwiLFwia3NcIixcImt1XCIsXCJrdlwiLFwia3dcIixcImt5XCIsXCJrYWFcIixcImthYlwiLFwia2FjXCIsXCJrYWRcIixcImthZVwiLFwia2FmXCIsXCJrYWdcIixcImthaFwiLFwia2FpXCIsXCJrYWpcIixcImtha1wiLFwia2FtXCIsXCJrYW9cIixcImthcFwiLFwia2FxXCIsXCJrYXJcIixcImthdlwiLFwia2F3XCIsXCJrYXhcIixcImtheVwiLFwia2JhXCIsXCJrYmJcIixcImtiY1wiLFwia2JkXCIsXCJrYmVcIixcImtiZlwiLFwia2JnXCIsXCJrYmhcIixcImtiaVwiLFwia2JqXCIsXCJrYmtcIixcImtibFwiLFwia2JtXCIsXCJrYm5cIixcImtib1wiLFwia2JwXCIsXCJrYnFcIixcImticlwiLFwia2JzXCIsXCJrYnRcIixcImtidVwiLFwia2J2XCIsXCJrYndcIixcImtieFwiLFwia2J5XCIsXCJrYnpcIixcImtjYVwiLFwia2NiXCIsXCJrY2NcIixcImtjZFwiLFwia2NlXCIsXCJrY2ZcIixcImtjZ1wiLFwia2NoXCIsXCJrY2lcIixcImtjalwiLFwia2NrXCIsXCJrY2xcIixcImtjbVwiLFwia2NuXCIsXCJrY29cIixcImtjcFwiLFwia2NxXCIsXCJrY3JcIixcImtjc1wiLFwia2N0XCIsXCJrY3VcIixcImtjdlwiLFwia2N3XCIsXCJrY3hcIixcImtjeVwiLFwia2N6XCIsXCJrZGFcIixcImtkY1wiLFwia2RkXCIsXCJrZGVcIixcImtkZlwiLFwia2RnXCIsXCJrZGhcIixcImtkaVwiLFwia2RqXCIsXCJrZGtcIixcImtkbFwiLFwia2RtXCIsXCJrZG5cIixcImtkb1wiLFwia2RwXCIsXCJrZHFcIixcImtkclwiLFwia2R0XCIsXCJrZHVcIixcImtkdlwiLFwia2R3XCIsXCJrZHhcIixcImtkeVwiLFwia2R6XCIsXCJrZWFcIixcImtlYlwiLFwia2VjXCIsXCJrZWRcIixcImtlZVwiLFwia2VmXCIsXCJrZWdcIixcImtlaFwiLFwia2VpXCIsXCJrZWpcIixcImtla1wiLFwia2VsXCIsXCJrZW1cIixcImtlblwiLFwia2VvXCIsXCJrZXBcIixcImtlcVwiLFwia2VyXCIsXCJrZXNcIixcImtldFwiLFwia2V1XCIsXCJrZXZcIixcImtld1wiLFwia2V4XCIsXCJrZXlcIixcImtlelwiLFwia2ZhXCIsXCJrZmJcIixcImtmY1wiLFwia2ZkXCIsXCJrZmVcIixcImtmZlwiLFwia2ZnXCIsXCJrZmhcIixcImtmaVwiLFwia2ZqXCIsXCJrZmtcIixcImtmbFwiLFwia2ZtXCIsXCJrZm5cIixcImtmb1wiLFwia2ZwXCIsXCJrZnFcIixcImtmclwiLFwia2ZzXCIsXCJrZnRcIixcImtmdVwiLFwia2Z2XCIsXCJrZndcIixcImtmeFwiLFwia2Z5XCIsXCJrZnpcIixcImtnYVwiLFwia2diXCIsXCJrZ2NcIixcImtnZFwiLFwia2dlXCIsXCJrZ2ZcIixcImtnZ1wiLFwia2doXCIsXCJrZ2lcIixcImtnalwiLFwia2drXCIsXCJrZ2xcIixcImtnbVwiLFwia2duXCIsXCJrZ29cIixcImtncFwiLFwia2dxXCIsXCJrZ3JcIixcImtnc1wiLFwia2d0XCIsXCJrZ3VcIixcImtndlwiLFwia2d3XCIsXCJrZ3hcIixcImtneVwiLFwia2hhXCIsXCJseWdcIixcImtoYlwiLFwia2hjXCIsXCJraGRcIixcImtoZVwiLFwia2hmXCIsXCJraGdcIixcImtoaFwiLFwia2hpXCIsXCJraGpcIixcImtoa1wiLFwia2hsXCIsXCJraG5cIixcImtob1wiLFwia2hwXCIsXCJraHFcIixcImtoclwiLFwia2hzXCIsXCJraHRcIixcImtodVwiLFwia2h2XCIsXCJraHdcIixcImtoeFwiLFwia2h5XCIsXCJraHpcIixcImtpYVwiLFwia2liXCIsXCJraWNcIixcImtpZFwiLFwia2llXCIsXCJraWZcIixcImtpZ1wiLFwia2loXCIsXCJraWlcIixcImtpalwiLFwia2lsXCIsXCJraW1cIixcImtpb1wiLFwia2lwXCIsXCJraXFcIixcImtpc1wiLFwia2l0XCIsXCJraXVcIixcImtpdlwiLFwia2l3XCIsXCJraXhcIixcImtpeVwiLFwia2l6XCIsXCJramFcIixcImtqYlwiLFwia2pjXCIsXCJramRcIixcImtqZVwiLFwia2pmXCIsXCJramdcIixcImtqaFwiLFwia2ppXCIsXCJrampcIixcImtqa1wiLFwia2psXCIsXCJram1cIixcImtqblwiLFwia2pvXCIsXCJranBcIixcImtqcVwiLFwia2pyXCIsXCJranNcIixcImtqdFwiLFwia2p1XCIsXCJranZcIixcImtqeFwiLFwia2p5XCIsXCJranpcIixcImtrYVwiLFwia2tiXCIsXCJra2NcIixcImtrZFwiLFwia2tlXCIsXCJra2ZcIixcImtrZ1wiLFwia2toXCIsXCJra2lcIixcImtralwiLFwia2trXCIsXCJra2xcIixcImtrbVwiLFwia2tuXCIsXCJra29cIixcImtrcFwiLFwia2txXCIsXCJra3JcIixcImtrc1wiLFwia2t0XCIsXCJra3VcIixcImtrdlwiLFwia2t3XCIsXCJra3hcIixcImtreVwiLFwia2t6XCIsXCJrbGFcIixcImtsYlwiLFwia2xjXCIsXCJrbGRcIixcImtsZVwiLFwia2xmXCIsXCJrbGdcIixcImtsaFwiLFwia2xpXCIsXCJrbGpcIixcImtsa1wiLFwia2xsXCIsXCJrbG1cIixcImtsblwiLFwia2xvXCIsXCJrbHBcIixcImtscVwiLFwia2xyXCIsXCJrbHNcIixcImtsdFwiLFwia2x1XCIsXCJrbHZcIixcImtsd1wiLFwia2x4XCIsXCJrbHlcIixcImtselwiLFwia21hXCIsXCJrbWJcIixcImttY1wiLFwia21kXCIsXCJrbWVcIixcImttZlwiLFwia21nXCIsXCJrbWhcIixcImttaVwiLFwia21qXCIsXCJrbWtcIixcImttbFwiLFwia21tXCIsXCJrbW5cIixcImttb1wiLFwia21wXCIsXCJrbXFcIixcImttclwiLFwia21zXCIsXCJrbXRcIixcImttdVwiLFwia212XCIsXCJrbXdcIixcImtteFwiLFwia215XCIsXCJrbXpcIixcImtuYVwiLFwia25iXCIsXCJrbmNcIixcImtuZFwiLFwia25lXCIsXCJrbmZcIixcImtuZ1wiLFwia25pXCIsXCJrbmpcIixcImtua1wiLFwia25sXCIsXCJrbm1cIixcImtublwiLFwia25vXCIsXCJrbnBcIixcImtucVwiLFwia25yXCIsXCJrbnNcIixcImtudFwiLFwia251XCIsXCJrbnZcIixcImtud1wiLFwia254XCIsXCJrbnlcIixcImtuelwiLFwia29hXCIsXCJrb2NcIixcImtvZFwiLFwia29lXCIsXCJrb2ZcIixcImtvZ1wiLFwia29oXCIsXCJrb2lcIixcImtvalwiLFwia29rXCIsXCJrb2xcIixcImtvb1wiLFwia29wXCIsXCJrb3FcIixcImtvc1wiLFwia290XCIsXCJrb3VcIixcImtvdlwiLFwia293XCIsXCJrb3hcIixcImtveVwiLFwia296XCIsXCJrcGFcIixcImtwYlwiLFwia3BjXCIsXCJrcGRcIixcImtwZVwiLFwia3BmXCIsXCJrcGdcIixcImtwaFwiLFwia3BpXCIsXCJrcGpcIixcImtwa1wiLFwia3BsXCIsXCJrcG1cIixcImtwblwiLFwia3BvXCIsXCJrcHBcIixcImtwcVwiLFwia3ByXCIsXCJrcHNcIixcImtwdFwiLFwia3B1XCIsXCJrcHZcIixcImtwd1wiLFwia3B4XCIsXCJrcHlcIixcImtwelwiLFwia3FhXCIsXCJrcWJcIixcImtxY1wiLFwia3FkXCIsXCJrcWVcIixcImtxZlwiLFwia3FnXCIsXCJrcWhcIixcImtxaVwiLFwia3FqXCIsXCJrcWtcIixcImtxbFwiLFwia3FtXCIsXCJrcW5cIixcImtxb1wiLFwia3FwXCIsXCJrcXFcIixcImtxclwiLFwia3FzXCIsXCJrcXRcIixcImtxdVwiLFwia3F2XCIsXCJrcXdcIixcImtxeFwiLFwia3F5XCIsXCJrcXpcIixcImtyYVwiLFwia3JiXCIsXCJrcmNcIixcImtyZFwiLFwia3JlXCIsXCJrcmZcIixcImtyaFwiLFwia3JpXCIsXCJrcmpcIixcImtya1wiLFwia3JsXCIsXCJrcm1cIixcImtyblwiLFwia3JvXCIsXCJrcnBcIixcImtyclwiLFwia3JzXCIsXCJrcnRcIixcImtydVwiLFwia3J2XCIsXCJrcndcIixcImtyeFwiLFwia3J5XCIsXCJrcnpcIixcImtzYVwiLFwia3NiXCIsXCJrc2NcIixcImtzZFwiLFwia3NlXCIsXCJrc2ZcIixcImtzZ1wiLFwia3NoXCIsXCJrc2lcIixcImtzalwiLFwia3NrXCIsXCJrc2xcIixcImtzbVwiLFwia3NuXCIsXCJrc29cIixcImtzcFwiLFwia3NxXCIsXCJrc3JcIixcImtzc1wiLFwia3N0XCIsXCJrc3VcIixcImtzdlwiLFwia3N3XCIsXCJrc3hcIixcImtzeVwiLFwia3N6XCIsXCJrdGFcIixcImt0YlwiLFwia3RjXCIsXCJrdGRcIixcImt0ZVwiLFwia3RmXCIsXCJrdGdcIixcImt0aFwiLFwia3RpXCIsXCJrdGpcIixcImt0a1wiLFwia3RsXCIsXCJrdG1cIixcImt0blwiLFwia3RvXCIsXCJrdHBcIixcImt0cVwiLFwia3RyXCIsXCJrdHNcIixcImt0dFwiLFwia3R1XCIsXCJrdHZcIixcImt0d1wiLFwia3R4XCIsXCJrdHlcIixcImt0elwiLFwia3ViXCIsXCJrdWNcIixcImt1ZFwiLFwia3VlXCIsXCJrdWZcIixcImt1Z1wiLFwia3VoXCIsXCJrdWlcIixcImt1alwiLFwia3VrXCIsXCJrdWxcIixcImt1bVwiLFwia3VuXCIsXCJrdW9cIixcImt1cFwiLFwia3VxXCIsXCJrdXNcIixcImt1dFwiLFwia3V1XCIsXCJrdXZcIixcImt1d1wiLFwia3V4XCIsXCJrdXlcIixcImt1elwiLFwia3ZhXCIsXCJrdmJcIixcImt2Y1wiLFwia3ZkXCIsXCJrdmVcIixcImt2ZlwiLFwia3ZnXCIsXCJrdmhcIixcImt2aVwiLFwia3ZqXCIsXCJrdmtcIixcImt2bFwiLFwia3ZtXCIsXCJrdm5cIixcImt2b1wiLFwia3ZwXCIsXCJrdnFcIixcImt2clwiLFwia3ZzXCIsXCJrdnRcIixcImt2dVwiLFwia3Z2XCIsXCJrdndcIixcImt2eFwiLFwia3Z5XCIsXCJrdnpcIixcImt3YVwiLFwia3diXCIsXCJrd2NcIixcImt3ZFwiLFwia3dlXCIsXCJrd2ZcIixcImt3Z1wiLFwia3doXCIsXCJrd2lcIixcImt3alwiLFwia3drXCIsXCJrd2xcIixcImt3bVwiLFwia3duXCIsXCJrd29cIixcImt3cFwiLFwia3dxXCIsXCJrd3JcIixcImt3c1wiLFwia3d0XCIsXCJrd3VcIixcImt3dlwiLFwia3d3XCIsXCJrd3hcIixcImt3eVwiLFwia3d6XCIsXCJreGFcIixcImt4YlwiLFwia3hjXCIsXCJreGRcIixcImt4ZVwiLFwia3hmXCIsXCJreGhcIixcImt4aVwiLFwia3hqXCIsXCJreGtcIixcImt4bFwiLFwia3htXCIsXCJreG5cIixcImt4b1wiLFwia3hwXCIsXCJreHFcIixcImt4clwiLFwia3hzXCIsXCJreHRcIixcImt4dVwiLFwia3h2XCIsXCJreHdcIixcImt4eFwiLFwia3h5XCIsXCJreHpcIixcImt5YVwiLFwia3liXCIsXCJreWNcIixcImt5ZFwiLFwia3llXCIsXCJreWZcIixcImt5Z1wiLFwia3loXCIsXCJreWlcIixcImt5alwiLFwia3lrXCIsXCJreWxcIixcImt5bVwiLFwia3luXCIsXCJreW9cIixcImt5cFwiLFwia3lxXCIsXCJreXJcIixcImt5c1wiLFwia3l0XCIsXCJreXVcIixcImt5dlwiLFwia3l3XCIsXCJreXhcIixcImt5eVwiLFwia3l6XCIsXCJremFcIixcImt6YlwiLFwia3pjXCIsXCJremRcIixcImt6ZVwiLFwia3pmXCIsXCJremdcIixcImt6aFwiLFwia3ppXCIsXCJrempcIixcImt6a1wiLFwia3psXCIsXCJrem1cIixcImt6blwiLFwia3pvXCIsXCJrenBcIixcImt6cVwiLFwia3pyXCIsXCJrenNcIixcImt6dFwiLFwia3p1XCIsXCJrenZcIixcImt6d1wiLFwia3p4XCIsXCJrenlcIixcImt6elwiXVxuLFsgXCJsYVwiLFwibGJcIixcImxnXCIsXCJsaVwiLFwibG5cIixcImxvXCIsXCJsdFwiLFwibHVcIixcImx2XCIsXCJsYWFcIixcImxhYlwiLFwibGFjXCIsXCJsYWRcIixcImxhZVwiLFwibGFmXCIsXCJsYWdcIixcImxhaFwiLFwibGFpXCIsXCJsYWpcIixcImxha1wiLFwibGFsXCIsXCJsYW1cIixcImxhblwiLFwibGFwXCIsXCJsYXFcIixcImxhclwiLFwibGFzXCIsXCJsYXVcIixcImxhd1wiLFwibGF4XCIsXCJsYXlcIixcImxhelwiLFwibGJhXCIsXCJsYmJcIixcImxiY1wiLFwibGJlXCIsXCJsYmZcIixcImxiZ1wiLFwibGJpXCIsXCJsYmpcIixcImxia1wiLFwibGJsXCIsXCJsYm1cIixcImxiblwiLFwibGJvXCIsXCJsYnFcIixcImxiclwiLFwibGJzXCIsXCJsYnRcIixcImxidVwiLFwibGJ2XCIsXCJsYndcIixcImxieFwiLFwibGJ5XCIsXCJsYnpcIixcImxjY1wiLFwibGNkXCIsXCJsY2VcIixcImxjZlwiLFwibGNoXCIsXCJsY2xcIixcImxjbVwiLFwibGNwXCIsXCJsY3FcIixcImxjc1wiLFwibGRhXCIsXCJsZGJcIixcImxkZFwiLFwibGRnXCIsXCJsZGhcIixcImxkaVwiLFwibGRqXCIsXCJsZGtcIixcImxkbFwiLFwibGRtXCIsXCJsZG5cIixcImxkb1wiLFwibGRwXCIsXCJsZHFcIixcImxlYVwiLFwibGViXCIsXCJsZWNcIixcImxlZFwiLFwibGVlXCIsXCJsZWZcIixcImxlZ1wiLFwibGVoXCIsXCJsZWlcIixcImxlalwiLFwibGVrXCIsXCJsZWxcIixcImxlbVwiLFwibGVuXCIsXCJsZW9cIixcImxlcFwiLFwibGVxXCIsXCJsZXJcIixcImxlc1wiLFwibGV0XCIsXCJsZXVcIixcImxldlwiLFwibGV3XCIsXCJsZXhcIixcImxleVwiLFwibGV6XCIsXCJsZmFcIixcImxmblwiLFwibGdhXCIsXCJsZ2JcIixcImxnZ1wiLFwibGdoXCIsXCJsZ2lcIixcImxna1wiLFwibGdsXCIsXCJsZ21cIixcImxnblwiLFwibGdxXCIsXCJsZ3JcIixcImxndFwiLFwibGd1XCIsXCJsZ3pcIixcImxoYVwiLFwibGhoXCIsXCJsaGlcIixcImxobFwiLFwibGhtXCIsXCJsaG5cIixcImxocFwiLFwibGhzXCIsXCJsaHRcIixcImxodVwiLFwibGlhXCIsXCJsaWJcIixcImxpY1wiLFwibGlkXCIsXCJsaWVcIixcImxpZlwiLFwibGlnXCIsXCJsaWhcIixcImxpaVwiLFwibGlqXCIsXCJsaWtcIixcImxpbFwiLFwibGlvXCIsXCJsaXBcIixcImxpcVwiLFwibGlyXCIsXCJsaXNcIixcImxpdVwiLFwibGl2XCIsXCJsaXdcIixcImxpeFwiLFwibGl5XCIsXCJsaXpcIixcImxqYVwiLFwibGplXCIsXCJsamlcIixcImxqbFwiLFwibGpwXCIsXCJsandcIixcImxqeFwiLFwibGthXCIsXCJsa2JcIixcImxrY1wiLFwibGtkXCIsXCJsa2VcIixcImxraFwiLFwibGtpXCIsXCJsa2pcIixcImxrbFwiLFwibGttXCIsXCJsa25cIixcImxrb1wiLFwibGtyXCIsXCJsa3NcIixcImxrdFwiLFwibGt1XCIsXCJsa3lcIixcImxsYVwiLFwibGxiXCIsXCJsbGNcIixcImxsZFwiLFwibGxlXCIsXCJsbGZcIixcImxsZ1wiLFwibGxoXCIsXCJsbGlcIixcImxsalwiLFwibGxrXCIsXCJsbGxcIixcImxsbVwiLFwibGxuXCIsXCJsbG9cIixcImxscFwiLFwibGxxXCIsXCJsbHNcIixcImxsdVwiLFwibGx4XCIsXCJsbWFcIixcImxtYlwiLFwibG1jXCIsXCJsbWRcIixcImxtZVwiLFwibG1mXCIsXCJsbWdcIixcImxtaFwiLFwibG1pXCIsXCJsbWpcIixcImxta1wiLFwibG1sXCIsXCJsbW1cIixcImxtblwiLFwibG1vXCIsXCJsbXBcIixcImxtcVwiLFwibG1yXCIsXCJsbXVcIixcImxtdlwiLFwibG13XCIsXCJsbXhcIixcImxteVwiLFwibG16XCIsXCJsbmFcIixcImxuYlwiLFwibG5kXCIsXCJsbmdcIixcImxuaFwiLFwibG5pXCIsXCJsbmpcIixcImxubFwiLFwibG5tXCIsXCJsbm5cIixcImxub1wiLFwibG5zXCIsXCJsbnVcIixcImxud1wiLFwibG56XCIsXCJsb2FcIixcImxvYlwiLFwibG9jXCIsXCJsb2VcIixcImxvZlwiLFwibG9nXCIsXCJsb2hcIixcImxvaVwiLFwibG9qXCIsXCJsb2tcIixcImxvbFwiLFwibG9tXCIsXCJsb25cIixcImxvb1wiLFwibG9wXCIsXCJsb3FcIixcImxvclwiLFwibG9zXCIsXCJsb3RcIixcImxvdVwiLFwibG92XCIsXCJsb3dcIixcImxveFwiLFwibG95XCIsXCJsb3pcIixcImxwYVwiLFwibHBlXCIsXCJscG5cIixcImxwb1wiLFwibHB4XCIsXCJscmFcIixcImxyY1wiLFwibHJlXCIsXCJscmdcIixcImxyaVwiLFwibHJrXCIsXCJscmxcIixcImxybVwiLFwibHJuXCIsXCJscm9cIixcImxyclwiLFwibHJ0XCIsXCJscnZcIixcImxyelwiLFwibHNhXCIsXCJsc2JcIixcImxzZFwiLFwibHNlXCIsXCJsc2dcIixcImxzaFwiLFwibHNpXCIsXCJsc2xcIixcImxzbVwiLFwibHNuXCIsXCJsc29cIixcImxzcFwiLFwibHNyXCIsXCJsc3NcIixcImxzdFwiLFwibHN2XCIsXCJsc3lcIixcImx0Y1wiLFwibHRnXCIsXCJsdGhcIixcImx0aVwiLFwibHRuXCIsXCJsdG9cIixcImx0c1wiLFwibHR1XCIsXCJsdWFcIixcImx1Y1wiLFwibHVkXCIsXCJsdWVcIixcImx1ZlwiLFwibHVpXCIsXCJsdWpcIixcImx1a1wiLFwibHVsXCIsXCJsdW1cIixcImx1blwiLFwibHVvXCIsXCJsdXBcIixcImx1cVwiLFwibHVyXCIsXCJsdXNcIixcImx1dFwiLFwibHV1XCIsXCJsdXZcIixcImx1d1wiLFwibHV5XCIsXCJsdXpcIixcImx2YVwiLFwibHZpXCIsXCJsdmtcIixcImx2c1wiLFwibHZ1XCIsXCJsd2FcIixcImx3ZVwiLFwibHdnXCIsXCJsd2hcIixcImx3bFwiLFwibHdtXCIsXCJsd29cIixcImx3c1wiLFwibHd0XCIsXCJsd3VcIixcImx3d1wiLFwibHhtXCIsXCJseWFcIixcImx5Z1wiLFwibHluXCIsXCJsemhcIixcImx6bFwiLFwibHpuXCIsXCJsenpcIl1cbixbIFwibWdcIixcIm1oXCIsXCJtaVwiLFwibWtcIixcIm1sXCIsXCJtblwiLFwibW9cIixcIm1yXCIsXCJtc1wiLFwibXRcIixcIm15XCIsXCJtYWFcIixcIm1hYlwiLFwibWFkXCIsXCJtYWVcIixcIm1hZlwiLFwibWFnXCIsXCJtYWlcIixcIm1halwiLFwibWFrXCIsXCJtYW1cIixcIm1hblwiLFwibWFwXCIsXCJtYXFcIixcIm1hc1wiLFwibWF0XCIsXCJtYXVcIixcIm1hdlwiLFwibWF3XCIsXCJtYXhcIixcIm1helwiLFwibWJhXCIsXCJtYmJcIixcIm1iY1wiLFwibWJkXCIsXCJtYmVcIixcIm1iZlwiLFwibWJoXCIsXCJtYmlcIixcIm1ialwiLFwibWJrXCIsXCJtYmxcIixcIm1ibVwiLFwibWJuXCIsXCJtYm9cIixcIm1icFwiLFwibWJxXCIsXCJtYnJcIixcIm1ic1wiLFwibWJ0XCIsXCJtYnVcIixcIm1idlwiLFwibWJ3XCIsXCJtYnhcIixcIm1ieVwiLFwibWJ6XCIsXCJtY2FcIixcIm1jYlwiLFwibWNjXCIsXCJtY2RcIixcIm1jZVwiLFwibWNmXCIsXCJtY2dcIixcIm1jaFwiLFwibWNpXCIsXCJtY2pcIixcIm1ja1wiLFwibWNsXCIsXCJtY21cIixcIm1jblwiLFwibWNvXCIsXCJtY3BcIixcIm1jcVwiLFwibWNyXCIsXCJtY3NcIixcIm1jdFwiLFwibWN1XCIsXCJtY3ZcIixcIm1jd1wiLFwibWN4XCIsXCJtY3lcIixcIm1jelwiLFwibWRhXCIsXCJtZGJcIixcIm1kY1wiLFwibWRkXCIsXCJtZGVcIixcIm1kZlwiLFwibWRnXCIsXCJtZGhcIixcIm1kaVwiLFwibWRqXCIsXCJtZGtcIixcIm1kbFwiLFwibWRtXCIsXCJtZG5cIixcIm1kcFwiLFwibWRxXCIsXCJtZHJcIixcIm1kc1wiLFwibWR0XCIsXCJtZHVcIixcIm1kdlwiLFwibWR3XCIsXCJtZHhcIixcIm1keVwiLFwibWR6XCIsXCJtZWFcIixcIm1lYlwiLFwibWVjXCIsXCJtZWRcIixcIm1lZVwiLFwibWVmXCIsXCJtZWdcIixcIm1laFwiLFwibWVpXCIsXCJtZWpcIixcIm1la1wiLFwibWVsXCIsXCJtZW1cIixcIm1lblwiLFwibWVvXCIsXCJtZXBcIixcIm1lcVwiLFwibWVyXCIsXCJtZXNcIixcIm1ldFwiLFwibWV1XCIsXCJtZXZcIixcIm1ld1wiLFwibWV5XCIsXCJtZXpcIixcIm1mYVwiLFwibWZiXCIsXCJtZmNcIixcIm1mZFwiLFwibWZlXCIsXCJtZmZcIixcIm1mZ1wiLFwibWZoXCIsXCJtZmlcIixcIm1malwiLFwibWZrXCIsXCJtZmxcIixcIm1mbVwiLFwibWZuXCIsXCJtZm9cIixcIm1mcFwiLFwibWZxXCIsXCJtZnJcIixcIm1mc1wiLFwibWZ0XCIsXCJtZnVcIixcIm1mdlwiLFwibWZ3XCIsXCJtZnhcIixcIm1meVwiLFwibWZ6XCIsXCJtZ2FcIixcIm1nYlwiLFwibWdjXCIsXCJtZ2RcIixcIm1nZVwiLFwibWdmXCIsXCJtZ2dcIixcIm1naFwiLFwibWdpXCIsXCJtZ2pcIixcIm1na1wiLFwibWdsXCIsXCJtZ21cIixcIm1nblwiLFwibWdvXCIsXCJtZ3BcIixcIm1ncVwiLFwibWdyXCIsXCJtZ3NcIixcIm1ndFwiLFwibWd1XCIsXCJtZ3ZcIixcIm1nd1wiLFwibWd4XCIsXCJtZ3lcIixcIm1nelwiLFwibWhhXCIsXCJtaGJcIixcIm1oY1wiLFwibWhkXCIsXCJtaGVcIixcIm1oZlwiLFwibWhnXCIsXCJtaGhcIixcIm1oaVwiLFwibWhqXCIsXCJtaGtcIixcIm1obFwiLFwibWhtXCIsXCJtaG5cIixcIm1ob1wiLFwibWhwXCIsXCJtaHFcIixcIm1oclwiLFwibWhzXCIsXCJtaHRcIixcIm1odVwiLFwibWh3XCIsXCJtaHhcIixcIm1oeVwiLFwibWh6XCIsXCJtaWFcIixcIm1pYlwiLFwibWljXCIsXCJtaWRcIixcIm1pZVwiLFwibWlmXCIsXCJtaWdcIixcIm1paFwiLFwibWlpXCIsXCJtaWpcIixcIm1pa1wiLFwibWlsXCIsXCJtaW1cIixcIm1pblwiLFwibWlvXCIsXCJtaXBcIixcIm1pcVwiLFwibWlyXCIsXCJtaXNcIixcIm1pdFwiLFwibWl1XCIsXCJtaXdcIixcIm1peFwiLFwibWl5XCIsXCJtaXpcIixcIm1qYVwiLFwibWpiXCIsXCJtamNcIixcIm1qZFwiLFwibWplXCIsXCJtamdcIixcIm1qaFwiLFwibWppXCIsXCJtampcIixcIm1qa1wiLFwibWpsXCIsXCJtam1cIixcIm1qblwiLFwibWpvXCIsXCJtanBcIixcIm1qcVwiLFwibWpyXCIsXCJtanNcIixcIm1qdFwiLFwibWp1XCIsXCJtanZcIixcIm1qd1wiLFwibWp4XCIsXCJtanlcIixcIm1qelwiLFwibWthXCIsXCJta2JcIixcIm1rY1wiLFwibWtlXCIsXCJta2ZcIixcIm1rZ1wiLFwibWtoXCIsXCJta2lcIixcIm1ralwiLFwibWtrXCIsXCJta2xcIixcIm1rbVwiLFwibWtuXCIsXCJta29cIixcIm1rcFwiLFwibWtxXCIsXCJta3JcIixcIm1rc1wiLFwibWt0XCIsXCJta3VcIixcIm1rdlwiLFwibWt3XCIsXCJta3hcIixcIm1reVwiLFwibWt6XCIsXCJtbGFcIixcIm1sYlwiLFwibWxjXCIsXCJtbGRcIixcIm1sZVwiLFwibWxmXCIsXCJtbGhcIixcIm1saVwiLFwibWxqXCIsXCJtbGtcIixcIm1sbFwiLFwibWxtXCIsXCJtbG5cIixcIm1sb1wiLFwibWxwXCIsXCJtbHFcIixcIm1sclwiLFwibWxzXCIsXCJtbHVcIixcIm1sdlwiLFwibWx3XCIsXCJtbHhcIixcIm1selwiLFwibW1hXCIsXCJtbWJcIixcIm1tY1wiLFwibW1kXCIsXCJtbWVcIixcIm1tZlwiLFwibW1nXCIsXCJtbWhcIixcIm1taVwiLFwibW1qXCIsXCJtbWtcIixcIm1tbFwiLFwibW1tXCIsXCJtbW5cIixcIm1tb1wiLFwibW1wXCIsXCJtbXFcIixcIm1tclwiLFwibW10XCIsXCJtbXVcIixcIm1tdlwiLFwibW13XCIsXCJtbXhcIixcIm1teVwiLFwibW16XCIsXCJtbmFcIixcIm1uYlwiLFwibW5jXCIsXCJtbmRcIixcIm1uZVwiLFwibW5mXCIsXCJtbmdcIixcIm1uaFwiLFwibW5pXCIsXCJtbmpcIixcIm1ua1wiLFwibW5sXCIsXCJtbm1cIixcIm1ublwiLFwibW5vXCIsXCJtbnBcIixcIm1ucVwiLFwibW5yXCIsXCJtbnNcIixcIm1udFwiLFwibW51XCIsXCJtbnZcIixcIm1ud1wiLFwibW54XCIsXCJtbnlcIixcIm1uelwiLFwibW9hXCIsXCJtb2NcIixcIm1vZFwiLFwibW9lXCIsXCJtb2ZcIixcIm1vZ1wiLFwibW9oXCIsXCJtb2lcIixcIm1valwiLFwibW9rXCIsXCJtb21cIixcIm1vb1wiLFwibW9wXCIsXCJtb3FcIixcIm1vclwiLFwibW9zXCIsXCJtb3RcIixcIm1vdVwiLFwibW92XCIsXCJtb3dcIixcIm1veFwiLFwibW95XCIsXCJtb3pcIixcIm1wYVwiLFwibXBiXCIsXCJtcGNcIixcIm1wZFwiLFwibXBlXCIsXCJtcGdcIixcIm1waFwiLFwibXBpXCIsXCJtcGpcIixcIm1wa1wiLFwibXBsXCIsXCJtcG1cIixcIm1wblwiLFwibXBvXCIsXCJtcHBcIixcIm1wcVwiLFwibXByXCIsXCJtcHNcIixcIm1wdFwiLFwibXB1XCIsXCJtcHZcIixcIm1wd1wiLFwibXB4XCIsXCJtcHlcIixcIm1welwiLFwibXFhXCIsXCJtcWJcIixcIm1xY1wiLFwibXFlXCIsXCJtcWZcIixcIm1xZ1wiLFwibXFoXCIsXCJtcWlcIixcIm1xalwiLFwibXFrXCIsXCJtcWxcIixcIm1xbVwiLFwibXFuXCIsXCJtcW9cIixcIm1xcFwiLFwibXFxXCIsXCJtcXJcIixcIm1xc1wiLFwibXF0XCIsXCJtcXVcIixcIm1xdlwiLFwibXF3XCIsXCJtcXhcIixcIm1xeVwiLFwibXF6XCIsXCJtcmFcIixcIm1yYlwiLFwibXJjXCIsXCJtcmRcIixcIm1yZVwiLFwibXJmXCIsXCJtcmdcIixcIm1yaFwiLFwibXJqXCIsXCJtcmtcIixcIm1ybFwiLFwibXJtXCIsXCJtcm5cIixcIm1yb1wiLFwibXJwXCIsXCJtcnFcIixcIm1yclwiLFwibXJzXCIsXCJtcnRcIixcIm1ydVwiLFwibXJ2XCIsXCJtcndcIixcIm1yeFwiLFwibXJ5XCIsXCJtcnpcIixcIm1zYlwiLFwibXNjXCIsXCJtc2RcIixcIm1zZVwiLFwibXNmXCIsXCJtc2dcIixcIm1zaFwiLFwibXNpXCIsXCJtc2pcIixcIm1za1wiLFwibXNsXCIsXCJtc21cIixcIm1zblwiLFwibXNvXCIsXCJtc3BcIixcIm1zcVwiLFwibXNyXCIsXCJtc3NcIixcIm1zdFwiLFwibXN1XCIsXCJtc3ZcIixcIm1zd1wiLFwibXN4XCIsXCJtc3lcIixcIm1zelwiLFwibXRhXCIsXCJtdGJcIixcIm10Y1wiLFwibXRkXCIsXCJtdGVcIixcIm10ZlwiLFwibXRnXCIsXCJtdGhcIixcIm10aVwiLFwibXRqXCIsXCJtdGtcIixcIm10bFwiLFwibXRtXCIsXCJtdG5cIixcIm10b1wiLFwibXRwXCIsXCJtdHFcIixcIm10clwiLFwibXRzXCIsXCJtdHRcIixcIm10dVwiLFwibXR2XCIsXCJtdHdcIixcIm10eFwiLFwibXR5XCIsXCJtdWFcIixcIm11YlwiLFwibXVjXCIsXCJtdWRcIixcIm11ZVwiLFwibXVnXCIsXCJtdWhcIixcIm11aVwiLFwibXVqXCIsXCJtdWtcIixcIm11bFwiLFwibXVtXCIsXCJtdW5cIixcIm11b1wiLFwibXVwXCIsXCJtdXFcIixcIm11clwiLFwibXVzXCIsXCJtdXRcIixcIm11dVwiLFwibXV2XCIsXCJtdXhcIixcIm11eVwiLFwibXV6XCIsXCJtdmFcIixcIm12YlwiLFwibXZkXCIsXCJtdmVcIixcIm12ZlwiLFwibXZnXCIsXCJtdmhcIixcIm12aVwiLFwibXZrXCIsXCJtdmxcIixcIm12bVwiLFwibXZuXCIsXCJtdm9cIixcIm12cFwiLFwibXZxXCIsXCJtdnJcIixcIm12c1wiLFwibXZ0XCIsXCJtdnVcIixcIm12dlwiLFwibXZ3XCIsXCJtdnhcIixcIm12eVwiLFwibXZ6XCIsXCJtd2FcIixcIm13YlwiLFwibXdjXCIsXCJtd2RcIixcIm13ZVwiLFwibXdmXCIsXCJtd2dcIixcIm13aFwiLFwibXdpXCIsXCJtd2pcIixcIm13a1wiLFwibXdsXCIsXCJtd21cIixcIm13blwiLFwibXdvXCIsXCJtd3BcIixcIm13cVwiLFwibXdyXCIsXCJtd3NcIixcIm13dFwiLFwibXd1XCIsXCJtd3ZcIixcIm13d1wiLFwibXd4XCIsXCJtd3lcIixcIm13elwiLFwibXhhXCIsXCJteGJcIixcIm14Y1wiLFwibXhkXCIsXCJteGVcIixcIm14ZlwiLFwibXhnXCIsXCJteGhcIixcIm14aVwiLFwibXhqXCIsXCJteGtcIixcIm14bFwiLFwibXhtXCIsXCJteG5cIixcIm14b1wiLFwibXhwXCIsXCJteHFcIixcIm14clwiLFwibXhzXCIsXCJteHRcIixcIm14dVwiLFwibXh2XCIsXCJteHdcIixcIm14eFwiLFwibXh5XCIsXCJteHpcIixcIm15YlwiLFwibXljXCIsXCJteWRcIixcIm15ZVwiLFwibXlmXCIsXCJteWdcIixcIm15aFwiLFwibXlpXCIsXCJteWpcIixcIm15a1wiLFwibXlsXCIsXCJteW1cIixcIm15blwiLFwibXlvXCIsXCJteXBcIixcIm15cVwiLFwibXlyXCIsXCJteXNcIixcIm15dFwiLFwibXl1XCIsXCJteXZcIixcIm15d1wiLFwibXl4XCIsXCJteXlcIixcIm15elwiLFwibXphXCIsXCJtemJcIixcIm16Y1wiLFwibXpkXCIsXCJtemVcIixcIm16Z1wiLFwibXpoXCIsXCJtemlcIixcIm16alwiLFwibXprXCIsXCJtemxcIixcIm16bVwiLFwibXpuXCIsXCJtem9cIixcIm16cFwiLFwibXpxXCIsXCJtenJcIixcIm16c1wiLFwibXp0XCIsXCJtenVcIixcIm16dlwiLFwibXp3XCIsXCJtenhcIixcIm16eVwiLFwibXp6XCJdXG4sWyBcIm5hXCIsXCJuYlwiLFwibmRcIixcIm5lXCIsXCJuZ1wiLFwibmxcIixcIm5uXCIsXCJub1wiLFwibnJcIixcIm52XCIsXCJueVwiLFwibmFhXCIsXCJuYWJcIixcIm5hY1wiLFwibmFkXCIsXCJuYWVcIixcIm5hZlwiLFwibmFnXCIsXCJuYWhcIixcIm5haVwiLFwibmFqXCIsXCJuYWtcIixcIm5hbFwiLFwibmFtXCIsXCJuYW5cIixcIm5hb1wiLFwibmFwXCIsXCJuYXFcIixcIm5hclwiLFwibmFzXCIsXCJuYXRcIixcIm5hd1wiLFwibmF4XCIsXCJuYXlcIixcIm5helwiLFwibmJhXCIsXCJuYmJcIixcIm5iY1wiLFwibmJkXCIsXCJuYmVcIixcIm5iZlwiLFwibmJnXCIsXCJuYmhcIixcIm5iaVwiLFwibmJqXCIsXCJuYmtcIixcIm5ibVwiLFwibmJuXCIsXCJuYm9cIixcIm5icFwiLFwibmJxXCIsXCJuYnJcIixcIm5ic1wiLFwibmJ0XCIsXCJuYnVcIixcIm5idlwiLFwibmJ3XCIsXCJuYnhcIixcIm5ieVwiLFwibmNhXCIsXCJuY2JcIixcIm5jY1wiLFwibmNkXCIsXCJuY2VcIixcIm5jZlwiLFwibmNnXCIsXCJuY2hcIixcIm5jaVwiLFwibmNqXCIsXCJuY2tcIixcIm5jbFwiLFwibmNtXCIsXCJuY25cIixcIm5jb1wiLFwibmNwXCIsXCJuY3FcIixcIm5jclwiLFwibmNzXCIsXCJuY3RcIixcIm5jdVwiLFwibmN4XCIsXCJuY3pcIixcIm5kYVwiLFwibmRiXCIsXCJuZGNcIixcIm5kZFwiLFwibmRmXCIsXCJuZGdcIixcIm5kaFwiLFwibmRpXCIsXCJuZGpcIixcIm5ka1wiLFwibmRsXCIsXCJuZG1cIixcIm5kblwiLFwibmRwXCIsXCJuZHFcIixcIm5kclwiLFwibmRzXCIsXCJuZHRcIixcIm5kdVwiLFwibmR2XCIsXCJuZHdcIixcIm5keFwiLFwibmR5XCIsXCJuZHpcIixcIm5lYVwiLFwibmViXCIsXCJuZWNcIixcIm5lZFwiLFwibmVlXCIsXCJuZWZcIixcIm5lZ1wiLFwibmVoXCIsXCJuZWlcIixcIm5lalwiLFwibmVrXCIsXCJuZW1cIixcIm5lblwiLFwibmVvXCIsXCJuZXFcIixcIm5lclwiLFwibmVzXCIsXCJuZXRcIixcIm5ldVwiLFwibmV2XCIsXCJuZXdcIixcIm5leFwiLFwibmV5XCIsXCJuZXpcIixcIm5mYVwiLFwibmZkXCIsXCJuZmxcIixcIm5mclwiLFwibmZ1XCIsXCJuZ2FcIixcIm5nYlwiLFwibmdjXCIsXCJuZ2RcIixcIm5nZVwiLFwibmdmXCIsXCJuZ2dcIixcIm5naFwiLFwibmdpXCIsXCJuZ2pcIixcIm5na1wiLFwibmdsXCIsXCJuZ21cIixcIm5nblwiLFwibmdvXCIsXCJuZ3BcIixcIm5ncVwiLFwibmdyXCIsXCJuZ3NcIixcIm5ndFwiLFwibmd1XCIsXCJuZ3ZcIixcIm5nd1wiLFwibmd4XCIsXCJuZ3lcIixcIm5nelwiLFwibmhhXCIsXCJuaGJcIixcIm5oY1wiLFwibmhkXCIsXCJuaGVcIixcIm5oZlwiLFwibmhnXCIsXCJuaGhcIixcIm5oaVwiLFwibmhrXCIsXCJuaG1cIixcIm5oblwiLFwibmhvXCIsXCJuaHBcIixcIm5ocVwiLFwibmhyXCIsXCJuaHRcIixcIm5odVwiLFwibmh2XCIsXCJuaHdcIixcIm5oeFwiLFwibmh5XCIsXCJuaHpcIixcIm5pYVwiLFwibmliXCIsXCJuaWNcIixcIm5pZFwiLFwibmllXCIsXCJuaWZcIixcIm5pZ1wiLFwibmloXCIsXCJuaWlcIixcIm5palwiLFwibmlrXCIsXCJuaWxcIixcIm5pbVwiLFwibmluXCIsXCJuaW9cIixcIm5pcVwiLFwibmlyXCIsXCJuaXNcIixcIm5pdFwiLFwibml1XCIsXCJuaXZcIixcIm5pd1wiLFwibml4XCIsXCJuaXlcIixcIm5pelwiLFwibmphXCIsXCJuamJcIixcIm5qZFwiLFwibmpoXCIsXCJuamlcIixcIm5qalwiLFwibmpsXCIsXCJuam1cIixcIm5qblwiLFwibmpvXCIsXCJuanJcIixcIm5qc1wiLFwibmp0XCIsXCJuanVcIixcIm5qeFwiLFwibmp5XCIsXCJuanpcIixcIm5rYVwiLFwibmtiXCIsXCJua2NcIixcIm5rZFwiLFwibmtlXCIsXCJua2ZcIixcIm5rZ1wiLFwibmtoXCIsXCJua2lcIixcIm5ralwiLFwibmtrXCIsXCJua21cIixcIm5rblwiLFwibmtvXCIsXCJua3BcIixcIm5rcVwiLFwibmtyXCIsXCJua3NcIixcIm5rdFwiLFwibmt1XCIsXCJua3ZcIixcIm5rd1wiLFwibmt4XCIsXCJua3pcIixcIm5sYVwiLFwibmxjXCIsXCJubGVcIixcIm5sZ1wiLFwibmxpXCIsXCJubGpcIixcIm5sa1wiLFwibmxsXCIsXCJubG1cIixcIm5sblwiLFwibmxvXCIsXCJubHFcIixcIm5sclwiLFwibmx1XCIsXCJubHZcIixcIm5sd1wiLFwibmx4XCIsXCJubHlcIixcIm5selwiLFwibm1hXCIsXCJubWJcIixcIm5tY1wiLFwibm1kXCIsXCJubWVcIixcIm5tZlwiLFwibm1nXCIsXCJubWhcIixcIm5taVwiLFwibm1qXCIsXCJubWtcIixcIm5tbFwiLFwibm1tXCIsXCJubW5cIixcIm5tb1wiLFwibm1wXCIsXCJubXFcIixcIm5tclwiLFwibm1zXCIsXCJubXRcIixcIm5tdVwiLFwibm12XCIsXCJubXdcIixcIm5teFwiLFwibm15XCIsXCJubXpcIixcIm5uYVwiLFwibm5iXCIsXCJubmNcIixcIm5uZFwiLFwibm5lXCIsXCJubmZcIixcIm5uZ1wiLFwibm5oXCIsXCJubmlcIixcIm5ualwiLFwibm5rXCIsXCJubmxcIixcIm5ubVwiLFwibm5uXCIsXCJubnBcIixcIm5ucVwiLFwibm5yXCIsXCJubnNcIixcIm5udFwiLFwibm51XCIsXCJubnZcIixcIm5ud1wiLFwibm54XCIsXCJubnlcIixcIm5uelwiLFwibm9hXCIsXCJub2NcIixcIm5vZFwiLFwibm9lXCIsXCJub2ZcIixcIm5vZ1wiLFwibm9oXCIsXCJub2lcIixcIm5valwiLFwibm9rXCIsXCJub2xcIixcIm5vbVwiLFwibm9uXCIsXCJub29cIixcIm5vcFwiLFwibm9xXCIsXCJub3NcIixcIm5vdFwiLFwibm91XCIsXCJub3ZcIixcIm5vd1wiLFwibm95XCIsXCJub3pcIixcIm5wYVwiLFwibnBiXCIsXCJucGdcIixcIm5waFwiLFwibnBpXCIsXCJucGxcIixcIm5wblwiLFwibnBvXCIsXCJucHNcIixcIm5wdVwiLFwibnB4XCIsXCJucHlcIixcIm5xZ1wiLFwibnFrXCIsXCJucWxcIixcIm5xbVwiLFwibnFuXCIsXCJucW9cIixcIm5xcVwiLFwibnF0XCIsXCJucXlcIixcIm5yYVwiLFwibnJiXCIsXCJucmNcIixcIm5yZVwiLFwibnJmXCIsXCJucmdcIixcIm5yaVwiLFwibnJrXCIsXCJucmxcIixcIm5ybVwiLFwibnJuXCIsXCJucnBcIixcIm5yclwiLFwibnJ0XCIsXCJucnVcIixcIm5yeFwiLFwibnJ6XCIsXCJuc2FcIixcIm5zYlwiLFwibnNjXCIsXCJuc2RcIixcIm5zZVwiLFwibnNmXCIsXCJuc2dcIixcIm5zaFwiLFwibnNpXCIsXCJuc2tcIixcIm5zbFwiLFwibnNtXCIsXCJuc25cIixcIm5zb1wiLFwibnNwXCIsXCJuc3FcIixcIm5zclwiLFwibnNzXCIsXCJuc3RcIixcIm5zdVwiLFwibnN2XCIsXCJuc3dcIixcIm5zeFwiLFwibnN5XCIsXCJuc3pcIixcIm50ZFwiLFwibnRlXCIsXCJudGdcIixcIm50aVwiLFwibnRqXCIsXCJudGtcIixcIm50bVwiLFwibnRvXCIsXCJudHBcIixcIm50clwiLFwibnRzXCIsXCJudHVcIixcIm50d1wiLFwibnR4XCIsXCJudHlcIixcIm50elwiLFwibnVhXCIsXCJudWJcIixcIm51Y1wiLFwibnVkXCIsXCJudWVcIixcIm51ZlwiLFwibnVnXCIsXCJudWhcIixcIm51aVwiLFwibnVqXCIsXCJudWtcIixcIm51bFwiLFwibnVtXCIsXCJudW5cIixcIm51b1wiLFwibnVwXCIsXCJudXFcIixcIm51clwiLFwibnVzXCIsXCJudXRcIixcIm51dVwiLFwibnV2XCIsXCJudXdcIixcIm51eFwiLFwibnV5XCIsXCJudXpcIixcIm52aFwiLFwibnZtXCIsXCJudm9cIixcIm53YVwiLFwibndiXCIsXCJud2NcIixcIm53ZVwiLFwibndnXCIsXCJud2lcIixcIm53bVwiLFwibndvXCIsXCJud3JcIixcIm53eFwiLFwibnd5XCIsXCJueGFcIixcIm54ZFwiLFwibnhlXCIsXCJueGdcIixcIm54aVwiLFwibnhrXCIsXCJueGxcIixcIm54bVwiLFwibnhuXCIsXCJueG9cIixcIm54cVwiLFwibnhyXCIsXCJueHVcIixcIm54eFwiLFwibnliXCIsXCJueWNcIixcIm55ZFwiLFwibnllXCIsXCJueWZcIixcIm55Z1wiLFwibnloXCIsXCJueWlcIixcIm55alwiLFwibnlrXCIsXCJueWxcIixcIm55bVwiLFwibnluXCIsXCJueW9cIixcIm55cFwiLFwibnlxXCIsXCJueXJcIixcIm55c1wiLFwibnl0XCIsXCJueXVcIixcIm55dlwiLFwibnl3XCIsXCJueXhcIixcIm55eVwiLFwibnphXCIsXCJuemJcIixcIm56ZFwiLFwibnppXCIsXCJuemtcIixcIm56bVwiLFwibnpzXCIsXCJuenVcIixcIm56eVwiLFwibnp6XCJdXG4sWyBcIm9jXCIsXCJvalwiLFwib21cIixcIm9yXCIsXCJvc1wiLFwib2FhXCIsXCJvYWNcIixcIm9hclwiLFwib2F2XCIsXCJvYmlcIixcIm9ia1wiLFwib2JsXCIsXCJvYm1cIixcIm9ib1wiLFwib2JyXCIsXCJvYnRcIixcIm9idVwiLFwib2NhXCIsXCJvY2hcIixcIm9jbVwiLFwib2NvXCIsXCJvY3VcIixcIm9kYVwiLFwib2RrXCIsXCJvZHRcIixcIm9kdVwiLFwib2ZvXCIsXCJvZnNcIixcIm9mdVwiLFwib2diXCIsXCJvZ2NcIixcIm9nZVwiLFwib2dnXCIsXCJvZ29cIixcIm9ndVwiLFwib2h0XCIsXCJvaHVcIixcIm9pYVwiLFwib2luXCIsXCJvamJcIixcIm9qY1wiLFwib2pnXCIsXCJvanBcIixcIm9qc1wiLFwib2p2XCIsXCJvandcIixcIm9rYVwiLFwib2tiXCIsXCJva2NcIixcIm9rZFwiLFwib2tlXCIsXCJva2dcIixcIm9raFwiLFwib2tpXCIsXCJva2pcIixcIm9ra1wiLFwib2tsXCIsXCJva21cIixcIm9rblwiLFwib2tvXCIsXCJva3JcIixcIm9rc1wiLFwib2t1XCIsXCJva3ZcIixcIm9reFwiLFwib2t6XCIsXCJvbGFcIixcIm9sZFwiLFwib2xlXCIsXCJvbGtcIixcIm9sbVwiLFwib2xvXCIsXCJvbHJcIixcIm9sdFwiLFwib2x1XCIsXCJvbWFcIixcIm9tYlwiLFwib21jXCIsXCJvbWVcIixcIm9tZ1wiLFwib21pXCIsXCJvbWtcIixcIm9tbFwiLFwib21uXCIsXCJvbW9cIixcIm9tcFwiLFwib21xXCIsXCJvbXJcIixcIm9tdFwiLFwib211XCIsXCJvbXZcIixcIm9td1wiLFwib214XCIsXCJvbXlcIixcIm9uYVwiLFwib25iXCIsXCJvbmVcIixcIm9uZ1wiLFwib25pXCIsXCJvbmpcIixcIm9ua1wiLFwib25uXCIsXCJvbm9cIixcIm9ucFwiLFwib25yXCIsXCJvbnNcIixcIm9udFwiLFwib251XCIsXCJvbndcIixcIm9ueFwiLFwib29kXCIsXCJvb2dcIixcIm9vblwiLFwib29yXCIsXCJvb3NcIixcIm9wYVwiLFwib3BrXCIsXCJvcG1cIixcIm9wb1wiLFwib3B0XCIsXCJvcHlcIixcIm9yYVwiLFwib3JjXCIsXCJvcmVcIixcIm9yZ1wiLFwib3JoXCIsXCJvcm5cIixcIm9yb1wiLFwib3JyXCIsXCJvcnNcIixcIm9ydFwiLFwib3J1XCIsXCJvcnZcIixcIm9yd1wiLFwib3J4XCIsXCJvcnlcIixcIm9yelwiLFwib3NhXCIsXCJvc2NcIixcIm9zaVwiLFwib3NuXCIsXCJvc29cIixcIm9zcFwiLFwib3N0XCIsXCJvc3VcIixcIm9zeFwiLFwib3RhXCIsXCJvdGJcIixcIm90ZFwiLFwib3RlXCIsXCJvdGlcIixcIm90a1wiLFwib3RsXCIsXCJvdG1cIixcIm90blwiLFwib3RvXCIsXCJvdHFcIixcIm90clwiLFwib3RzXCIsXCJvdHRcIixcIm90dVwiLFwib3R3XCIsXCJvdHhcIixcIm90eVwiLFwib3R6XCIsXCJvdWFcIixcIm91YlwiLFwib3VlXCIsXCJvdWlcIixcIm91bVwiLFwib3VuXCIsXCJvdmRcIixcIm93aVwiLFwib3dsXCIsXCJveWJcIixcIm95ZFwiLFwib3ltXCIsXCJveXlcIixcIm96bVwiXVxuLFsgXCJwYVwiLFwicGlcIixcInBsXCIsXCJwc1wiLFwicHRcIixcInBhYVwiLFwicGFiXCIsXCJwYWNcIixcInBhZFwiLFwicGFlXCIsXCJwYWZcIixcInBhZ1wiLFwicGFoXCIsXCJwYWlcIixcInBha1wiLFwicGFsXCIsXCJwYW1cIixcInBhb1wiLFwicGFwXCIsXCJwYXFcIixcInBhclwiLFwicGFzXCIsXCJwYXRcIixcInBhdVwiLFwicGF2XCIsXCJwYXdcIixcInBheFwiLFwicGF5XCIsXCJwYXpcIixcInBiYlwiLFwicGJjXCIsXCJwYmVcIixcInBiZlwiLFwicGJnXCIsXCJwYmhcIixcInBiaVwiLFwicGJsXCIsXCJwYm1cIixcInBiblwiLFwicGJvXCIsXCJwYnBcIixcInBiclwiLFwicGJzXCIsXCJwYnRcIixcInBidVwiLFwicGJ2XCIsXCJwYnlcIixcInBielwiLFwicGNhXCIsXCJwY2JcIixcInBjY1wiLFwicGNkXCIsXCJwY2VcIixcInBjZlwiLFwicGNnXCIsXCJwY2hcIixcInBjaVwiLFwicGNqXCIsXCJwY2tcIixcInBjbFwiLFwicGNtXCIsXCJwY25cIixcInBjcFwiLFwicGNyXCIsXCJwY3dcIixcInBkYVwiLFwicGRjXCIsXCJwZGlcIixcInBkblwiLFwicGRvXCIsXCJwZHRcIixcInBkdVwiLFwicGVhXCIsXCJwZWJcIixcInBlZFwiLFwicGVlXCIsXCJwZWZcIixcInBlZ1wiLFwicGVoXCIsXCJwZWlcIixcInBlalwiLFwicGVrXCIsXCJwZWxcIixcInBlbVwiLFwicGVvXCIsXCJwZXBcIixcInBlcVwiLFwicGVzXCIsXCJwZXZcIixcInBleFwiLFwicGV5XCIsXCJwZXpcIixcInBmYVwiLFwicGZlXCIsXCJwZmxcIixcInBnYVwiLFwicGdkXCIsXCJwZ2dcIixcInBnaVwiLFwicGdrXCIsXCJwZ2xcIixcInBnblwiLFwicGdzXCIsXCJwZ3VcIixcInBneVwiLFwicGd6XCIsXCJwaGFcIixcInBoZFwiLFwicGhnXCIsXCJwaGhcIixcInBoaVwiLFwicGhrXCIsXCJwaGxcIixcInBobVwiLFwicGhuXCIsXCJwaG9cIixcInBocVwiLFwicGhyXCIsXCJwaHRcIixcInBodVwiLFwicGh2XCIsXCJwaHdcIixcInBpYVwiLFwicGliXCIsXCJwaWNcIixcInBpZFwiLFwicGllXCIsXCJwaWZcIixcInBpZ1wiLFwicGloXCIsXCJwaWlcIixcInBpalwiLFwicGlsXCIsXCJwaW1cIixcInBpblwiLFwicGlvXCIsXCJwaXBcIixcInBpclwiLFwicGlzXCIsXCJwaXRcIixcInBpdVwiLFwicGl2XCIsXCJwaXdcIixcInBpeFwiLFwicGl5XCIsXCJwaXpcIixcInBqdFwiLFwicGthXCIsXCJwa2JcIixcInBrY1wiLFwicGtnXCIsXCJwa2hcIixcInBrblwiLFwicGtvXCIsXCJwa3BcIixcInBrclwiLFwicGtzXCIsXCJwa3RcIixcInBrdVwiLFwicGxhXCIsXCJwbGJcIixcInBsY1wiLFwicGxkXCIsXCJwbGVcIixcInBsZlwiLFwicGxnXCIsXCJwbGhcIixcInBsalwiLFwicGxrXCIsXCJwbGxcIixcInBsblwiLFwicGxvXCIsXCJwbHBcIixcInBscVwiLFwicGxyXCIsXCJwbHNcIixcInBsdFwiLFwicGx1XCIsXCJwbHZcIixcInBsd1wiLFwicGx5XCIsXCJwbHpcIixcInBtYVwiLFwicG1iXCIsXCJwbWNcIixcInBtZFwiLFwicG1lXCIsXCJwbWZcIixcInBtaFwiLFwicG1pXCIsXCJwbWpcIixcInBta1wiLFwicG1sXCIsXCJwbW1cIixcInBtblwiLFwicG1vXCIsXCJwbXFcIixcInBtclwiLFwicG1zXCIsXCJwbXRcIixcInBtdVwiLFwicG13XCIsXCJwbXhcIixcInBteVwiLFwicG16XCIsXCJwbmFcIixcInBuYlwiLFwicG5jXCIsXCJwbmRcIixcInBuZVwiLFwicG5nXCIsXCJwbmhcIixcInBuaVwiLFwicG5qXCIsXCJwbmtcIixcInBubFwiLFwicG5tXCIsXCJwbm5cIixcInBub1wiLFwicG5wXCIsXCJwbnFcIixcInBuclwiLFwicG5zXCIsXCJwbnRcIixcInBudVwiLFwicG52XCIsXCJwbndcIixcInBueFwiLFwicG55XCIsXCJwbnpcIixcInBvY1wiLFwicG9kXCIsXCJwb2VcIixcInBvZlwiLFwicG9nXCIsXCJwb2hcIixcInBvaVwiLFwicG9rXCIsXCJwb21cIixcInBvblwiLFwicG9vXCIsXCJwb3BcIixcInBvcVwiLFwicG9zXCIsXCJwb3RcIixcInBvdlwiLFwicG93XCIsXCJwb3hcIixcInBveVwiLFwicG96XCIsXCJwcGFcIixcInBwZVwiLFwicHBpXCIsXCJwcGtcIixcInBwbFwiLFwicHBtXCIsXCJwcG5cIixcInBwb1wiLFwicHBwXCIsXCJwcHFcIixcInBwclwiLFwicHBzXCIsXCJwcHRcIixcInBwdVwiLFwicHFhXCIsXCJwcWVcIixcInBxbVwiLFwicHF3XCIsXCJwcmFcIixcInByYlwiLFwicHJjXCIsXCJwcmRcIixcInByZVwiLFwicHJmXCIsXCJwcmdcIixcInByaFwiLFwicHJpXCIsXCJwcmtcIixcInBybFwiLFwicHJtXCIsXCJwcm5cIixcInByb1wiLFwicHJwXCIsXCJwcnFcIixcInByclwiLFwicHJzXCIsXCJwcnRcIixcInBydVwiLFwicHJ3XCIsXCJwcnhcIixcInByeVwiLFwicHJ6XCIsXCJwc2FcIixcInBzY1wiLFwicHNkXCIsXCJwc2VcIixcInBzZ1wiLFwicHNoXCIsXCJwc2lcIixcInBzbFwiLFwicHNtXCIsXCJwc25cIixcInBzb1wiLFwicHNwXCIsXCJwc3FcIixcInBzclwiLFwicHNzXCIsXCJwc3RcIixcInBzdVwiLFwicHN3XCIsXCJwc3lcIixcInB0YVwiLFwicHRoXCIsXCJwdGlcIixcInB0blwiLFwicHRvXCIsXCJwdHBcIixcInB0cVwiLFwicHRyXCIsXCJwdHRcIixcInB0dVwiLFwicHR2XCIsXCJwdHdcIixcInB0eVwiLFwicHVhXCIsXCJwdWJcIixcInB1Y1wiLFwicHVkXCIsXCJwdWVcIixcInB1ZlwiLFwicHVnXCIsXCJwdWlcIixcInB1alwiLFwicHVrXCIsXCJwdW1cIixcInB1b1wiLFwicHVwXCIsXCJwdXFcIixcInB1clwiLFwicHV0XCIsXCJwdXVcIixcInB1d1wiLFwicHV4XCIsXCJwdXlcIixcInB1elwiLFwicHdhXCIsXCJwd2JcIixcInB3Z1wiLFwicHdpXCIsXCJwd21cIixcInB3blwiLFwicHdvXCIsXCJwd3JcIixcInB3d1wiLFwicHhtXCIsXCJweWVcIixcInB5bVwiLFwicHluXCIsXCJweXNcIixcInB5dVwiLFwicHl4XCIsXCJweXlcIixcInB6blwiXVxuLFsgXCJxdVwiLFwicXVhXCIsXCJxdWJcIixcInF1Y1wiLFwicXVkXCIsXCJxdWZcIixcInF1Z1wiLFwicXVoXCIsXCJxdWlcIixcInF1a1wiLFwicXVsXCIsXCJxdW1cIixcInF1blwiLFwicXVwXCIsXCJxdXFcIixcInF1clwiLFwicXVzXCIsXCJxdXZcIixcInF1d1wiLFwicXV4XCIsXCJxdXlcIixcInF1elwiLFwicXZhXCIsXCJxdmNcIixcInF2ZVwiLFwicXZoXCIsXCJxdmlcIixcInF2alwiLFwicXZsXCIsXCJxdm1cIixcInF2blwiLFwicXZvXCIsXCJxdnBcIixcInF2c1wiLFwicXZ3XCIsXCJxdnlcIixcInF2elwiLFwicXdhXCIsXCJxd2NcIixcInF3ZVwiLFwicXdoXCIsXCJxd21cIixcInF3c1wiLFwicXd0XCIsXCJxeGFcIixcInF4Y1wiLFwicXhoXCIsXCJxeGxcIixcInF4blwiLFwicXhvXCIsXCJxeHBcIixcInF4cVwiLFwicXhyXCIsXCJxeHNcIixcInF4dFwiLFwicXh1XCIsXCJxeHdcIixcInF5YVwiLFwicXlwXCJdXG4sWyBcInJtXCIsXCJyblwiLFwicm9cIixcInJ1XCIsXCJyd1wiLFwicmFhXCIsXCJyYWJcIixcInJhY1wiLFwicmFkXCIsXCJyYWZcIixcInJhZ1wiLFwicmFoXCIsXCJyYWlcIixcInJhalwiLFwicmFrXCIsXCJyYWxcIixcInJhbVwiLFwicmFuXCIsXCJyYW9cIixcInJhcFwiLFwicmFxXCIsXCJyYXJcIixcInJhc1wiLFwicmF0XCIsXCJyYXVcIixcInJhdlwiLFwicmF3XCIsXCJyYXhcIixcInJheVwiLFwicmF6XCIsXCJyYmJcIixcInJia1wiLFwicmJsXCIsXCJyYnBcIixcInJjZlwiLFwicmRiXCIsXCJyZWFcIixcInJlYlwiLFwicmVlXCIsXCJyZWdcIixcInJlaVwiLFwicmVqXCIsXCJyZWxcIixcInJlbVwiLFwicmVuXCIsXCJyZXJcIixcInJlc1wiLFwicmV0XCIsXCJyZXlcIixcInJnYVwiLFwicmdlXCIsXCJyZ2tcIixcInJnblwiLFwicmdyXCIsXCJyZ3NcIixcInJndVwiLFwicmhnXCIsXCJyaHBcIixcInJpYVwiLFwicmllXCIsXCJyaWZcIixcInJpbFwiLFwicmltXCIsXCJyaW5cIixcInJpclwiLFwicml0XCIsXCJyaXVcIixcInJqZ1wiLFwicmppXCIsXCJyanNcIixcInJrYVwiLFwicmtiXCIsXCJya2hcIixcInJraVwiLFwicmttXCIsXCJya3RcIixcInJrd1wiLFwicm1hXCIsXCJybWJcIixcInJtY1wiLFwicm1kXCIsXCJybWVcIixcInJtZlwiLFwicm1nXCIsXCJybWhcIixcInJtaVwiLFwicm1rXCIsXCJybWxcIixcInJtbVwiLFwicm1uXCIsXCJybW9cIixcInJtcFwiLFwicm1xXCIsXCJybXJcIixcInJtc1wiLFwicm10XCIsXCJybXVcIixcInJtdlwiLFwicm13XCIsXCJybXhcIixcInJteVwiLFwicm16XCIsXCJybmFcIixcInJuZFwiLFwicm5nXCIsXCJybmxcIixcInJublwiLFwicm5wXCIsXCJybnJcIixcInJud1wiLFwicm9hXCIsXCJyb2JcIixcInJvY1wiLFwicm9kXCIsXCJyb2VcIixcInJvZlwiLFwicm9nXCIsXCJyb2xcIixcInJvbVwiLFwicm9vXCIsXCJyb3BcIixcInJvclwiLFwicm91XCIsXCJyb3dcIixcInJwblwiLFwicnB0XCIsXCJycmlcIixcInJyb1wiLFwicnJ0XCIsXCJyc2JcIixcInJzaVwiLFwicnNsXCIsXCJyc21cIixcInJ0Y1wiLFwicnRoXCIsXCJydG1cIixcInJ0c1wiLFwicnR3XCIsXCJydWJcIixcInJ1Y1wiLFwicnVlXCIsXCJydWZcIixcInJ1Z1wiLFwicnVoXCIsXCJydWlcIixcInJ1a1wiLFwicnVvXCIsXCJydXBcIixcInJ1cVwiLFwicnV0XCIsXCJydXVcIixcInJ1eVwiLFwicnV6XCIsXCJyd2FcIixcInJ3a1wiLFwicndsXCIsXCJyd21cIixcInJ3b1wiLFwicndyXCIsXCJyeGRcIixcInJ4d1wiLFwicnluXCIsXCJyeXNcIixcInJ5dVwiLFwicnpoXCJdXG4sWyBcInNhXCIsXCJzY1wiLFwic2RcIixcInNlXCIsXCJzZ1wiLFwic2hcIixcInNpXCIsXCJza1wiLFwic2xcIixcInNtXCIsXCJzblwiLFwic29cIixcInNxXCIsXCJzclwiLFwic3NcIixcInN0XCIsXCJzdVwiLFwic3ZcIixcInN3XCIsXCJzYWFcIixcInNhYlwiLFwic2FjXCIsXCJzYWRcIixcInNhZVwiLFwic2FmXCIsXCJzYWhcIixcInNhaVwiLFwic2FqXCIsXCJzYWtcIixcInNhbFwiLFwic2FtXCIsXCJzYW9cIixcInNhcFwiLFwic2FxXCIsXCJzYXJcIixcInNhc1wiLFwic2F0XCIsXCJzYXVcIixcInNhdlwiLFwic2F3XCIsXCJzYXhcIixcInNheVwiLFwic2F6XCIsXCJzYmFcIixcInNiYlwiLFwic2JjXCIsXCJzYmRcIixcInNiZVwiLFwic2JmXCIsXCJzYmdcIixcInNiaFwiLFwic2JpXCIsXCJzYmpcIixcInNia1wiLFwic2JsXCIsXCJzYm1cIixcInNiblwiLFwic2JvXCIsXCJzYnBcIixcInNicVwiLFwic2JyXCIsXCJzYnNcIixcInNidFwiLFwic2J1XCIsXCJzYnZcIixcInNid1wiLFwic2J4XCIsXCJzYnlcIixcInNielwiLFwic2NhXCIsXCJzY2JcIixcInNjZVwiLFwic2NmXCIsXCJzY2dcIixcInNjaFwiLFwic2NpXCIsXCJzY2tcIixcInNjbFwiLFwic2NuXCIsXCJzY29cIixcInNjcFwiLFwic2NxXCIsXCJzY3NcIixcInNjdFwiLFwic2N1XCIsXCJzY3ZcIixcInNjd1wiLFwic2N4XCIsXCJzZGFcIixcInNkYlwiLFwic2RjXCIsXCJzZGVcIixcInNkZlwiLFwic2RnXCIsXCJzZGhcIixcInNkalwiLFwic2RrXCIsXCJzZGxcIixcInNkbVwiLFwic2RuXCIsXCJzZG9cIixcInNkcFwiLFwic2RxXCIsXCJzZHJcIixcInNkc1wiLFwic2R0XCIsXCJzZHVcIixcInNkdlwiLFwic2R4XCIsXCJzZHpcIixcInNlYVwiLFwic2ViXCIsXCJzZWNcIixcInNlZFwiLFwic2VlXCIsXCJzZWZcIixcInNlZ1wiLFwic2VoXCIsXCJzZWlcIixcInNlalwiLFwic2VrXCIsXCJzZWxcIixcInNlbVwiLFwic2VuXCIsXCJzZW9cIixcInNlcFwiLFwic2VxXCIsXCJzZXJcIixcInNlc1wiLFwic2V0XCIsXCJzZXVcIixcInNldlwiLFwic2V3XCIsXCJzZXlcIixcInNlelwiLFwic2ZiXCIsXCJzZmVcIixcInNmbVwiLFwic2ZzXCIsXCJzZndcIixcInNnYVwiLFwic2diXCIsXCJzZ2NcIixcInNnZFwiLFwic2dlXCIsXCJzZ2dcIixcInNnaFwiLFwic2dpXCIsXCJzZ2pcIixcInNna1wiLFwic2dsXCIsXCJzZ21cIixcInNnblwiLFwic2dvXCIsXCJzZ3BcIixcInNnclwiLFwic2dzXCIsXCJzZ3RcIixcInNndVwiLFwic2d3XCIsXCJzZ3hcIixcInNneVwiLFwic2d6XCIsXCJzaGFcIixcInNoYlwiLFwic2hjXCIsXCJzaGRcIixcInNoZVwiLFwic2hnXCIsXCJzaGhcIixcInNoaVwiLFwic2hqXCIsXCJzaGtcIixcInNobFwiLFwic2htXCIsXCJzaG5cIixcInNob1wiLFwic2hwXCIsXCJzaHFcIixcInNoclwiLFwic2hzXCIsXCJzaHRcIixcInNodVwiLFwic2h2XCIsXCJzaHdcIixcInNoeFwiLFwic2h5XCIsXCJzaHpcIixcInNpYVwiLFwic2liXCIsXCJzaWRcIixcInNpZVwiLFwic2lmXCIsXCJzaWdcIixcInNpaFwiLFwic2lpXCIsXCJzaWpcIixcInNpa1wiLFwic2lsXCIsXCJzaW1cIixcInNpb1wiLFwic2lwXCIsXCJzaXFcIixcInNpclwiLFwic2lzXCIsXCJzaXRcIixcInNpdVwiLFwic2l2XCIsXCJzaXdcIixcInNpeFwiLFwic2l5XCIsXCJzaXpcIixcInNqYVwiLFwic2piXCIsXCJzamRcIixcInNqZVwiLFwic2pnXCIsXCJzamtcIixcInNqbFwiLFwic2ptXCIsXCJzam5cIixcInNqb1wiLFwic2pwXCIsXCJzanJcIixcInNqc1wiLFwic2p0XCIsXCJzanVcIixcInNqd1wiLFwic2thXCIsXCJza2JcIixcInNrY1wiLFwic2tkXCIsXCJza2VcIixcInNrZlwiLFwic2tnXCIsXCJza2hcIixcInNraVwiLFwic2tqXCIsXCJza2tcIixcInNrbVwiLFwic2tuXCIsXCJza29cIixcInNrcFwiLFwic2txXCIsXCJza3JcIixcInNrc1wiLFwic2t0XCIsXCJza3VcIixcInNrdlwiLFwic2t3XCIsXCJza3hcIixcInNreVwiLFwic2t6XCIsXCJzbGFcIixcInNsY1wiLFwic2xkXCIsXCJzbGVcIixcInNsZlwiLFwic2xnXCIsXCJzbGhcIixcInNsaVwiLFwic2xqXCIsXCJzbGxcIixcInNsbVwiLFwic2xuXCIsXCJzbHBcIixcInNscVwiLFwic2xyXCIsXCJzbHNcIixcInNsdFwiLFwic2x1XCIsXCJzbHdcIixcInNseFwiLFwic2x5XCIsXCJzbHpcIixcInNtYVwiLFwic21iXCIsXCJzbWNcIixcInNtZFwiLFwic21mXCIsXCJzbWdcIixcInNtaFwiLFwic21pXCIsXCJzbWpcIixcInNta1wiLFwic21sXCIsXCJzbW1cIixcInNtblwiLFwic21wXCIsXCJzbXFcIixcInNtclwiLFwic21zXCIsXCJzbXRcIixcInNtdVwiLFwic212XCIsXCJzbXdcIixcInNteFwiLFwic215XCIsXCJzbXpcIixcInNuYlwiLFwic25jXCIsXCJzbmVcIixcInNuZlwiLFwic25nXCIsXCJzbmhcIixcInNuaVwiLFwic25qXCIsXCJzbmtcIixcInNubFwiLFwic25tXCIsXCJzbm5cIixcInNub1wiLFwic25wXCIsXCJzbnFcIixcInNuclwiLFwic25zXCIsXCJzbnVcIixcInNudlwiLFwic253XCIsXCJzbnhcIixcInNueVwiLFwic256XCIsXCJzb2FcIixcInNvYlwiLFwic29jXCIsXCJzb2RcIixcInNvZVwiLFwic29nXCIsXCJzb2hcIixcInNvaVwiLFwic29qXCIsXCJzb2tcIixcInNvbFwiLFwic29uXCIsXCJzb29cIixcInNvcFwiLFwic29xXCIsXCJzb3JcIixcInNvc1wiLFwic291XCIsXCJzb3ZcIixcInNvd1wiLFwic294XCIsXCJzb3lcIixcInNvelwiLFwic3BiXCIsXCJzcGNcIixcInNwZFwiLFwic3BlXCIsXCJzcGdcIixcInNwaVwiLFwic3BrXCIsXCJzcGxcIixcInNwbVwiLFwic3BuXCIsXCJzcG9cIixcInNwcFwiLFwic3BxXCIsXCJzcHJcIixcInNwc1wiLFwic3B0XCIsXCJzcHVcIixcInNwdlwiLFwic3B4XCIsXCJzcHlcIixcInNxYVwiLFwic3FoXCIsXCJzcWpcIixcInNxa1wiLFwic3FtXCIsXCJzcW5cIixcInNxb1wiLFwic3FxXCIsXCJzcXJcIixcInNxc1wiLFwic3F0XCIsXCJzcXVcIixcInNxeFwiLFwic3JhXCIsXCJzcmJcIixcInNyY1wiLFwic3JlXCIsXCJzcmZcIixcInNyZ1wiLFwic3JoXCIsXCJzcmlcIixcInNya1wiLFwic3JsXCIsXCJzcm1cIixcInNyblwiLFwic3JvXCIsXCJzcnFcIixcInNyclwiLFwic3JzXCIsXCJzcnRcIixcInNydVwiLFwic3J2XCIsXCJzcndcIixcInNyeFwiLFwic3J5XCIsXCJzcnpcIixcInNzYVwiLFwic3NiXCIsXCJzc2NcIixcInNzZFwiLFwic3NlXCIsXCJzc2ZcIixcInNzZ1wiLFwic3NoXCIsXCJzc2lcIixcInNzalwiLFwic3NrXCIsXCJzc2xcIixcInNzbVwiLFwic3NuXCIsXCJzc29cIixcInNzcFwiLFwic3NxXCIsXCJzc3JcIixcInNzc1wiLFwic3N0XCIsXCJzc3VcIixcInNzdlwiLFwic3N4XCIsXCJzc3lcIixcInNzelwiLFwic3RhXCIsXCJzdGJcIixcInN0ZFwiLFwic3RlXCIsXCJzdGZcIixcInN0Z1wiLFwic3RoXCIsXCJzdGlcIixcInN0alwiLFwic3RrXCIsXCJzdGxcIixcInN0bVwiLFwic3RuXCIsXCJzdG9cIixcInN0cFwiLFwic3RxXCIsXCJzdHJcIixcInN0c1wiLFwic3R0XCIsXCJzdHVcIixcInN0dlwiLFwic3R3XCIsXCJzdHlcIixcInN1YVwiLFwic3ViXCIsXCJzdWNcIixcInN1ZVwiLFwic3VnXCIsXCJzdWlcIixcInN1alwiLFwic3VrXCIsXCJzdWxcIixcInN1bVwiLFwic3VvXCIsXCJzdXFcIixcInN1clwiLFwic3VzXCIsXCJzdXRcIixcInN1dlwiLFwic3V3XCIsXCJzdXhcIixcInN1eVwiLFwic3V6XCIsXCJzdmFcIixcInN2YlwiLFwic3ZjXCIsXCJzdmVcIixcInN2a1wiLFwic3ZtXCIsXCJzdnJcIixcInN2c1wiLFwic3Z4XCIsXCJzd2JcIixcInN3Y1wiLFwic3dmXCIsXCJzd2dcIixcInN3aFwiLFwic3dpXCIsXCJzd2pcIixcInN3a1wiLFwic3dsXCIsXCJzd21cIixcInN3blwiLFwic3dvXCIsXCJzd3BcIixcInN3cVwiLFwic3dyXCIsXCJzd3NcIixcInN3dFwiLFwic3d1XCIsXCJzd3ZcIixcInN3d1wiLFwic3d4XCIsXCJzd3lcIixcInN4YlwiLFwic3hjXCIsXCJzeGVcIixcInN4Z1wiLFwic3hrXCIsXCJzeGxcIixcInN4bVwiLFwic3huXCIsXCJzeG9cIixcInN4clwiLFwic3hzXCIsXCJzeHVcIixcInN4d1wiLFwic3lhXCIsXCJzeWJcIixcInN5Y1wiLFwic3lkXCIsXCJzeWlcIixcInN5a1wiLFwic3lsXCIsXCJzeW1cIixcInN5blwiLFwic3lvXCIsXCJzeXJcIixcInN5c1wiLFwic3l3XCIsXCJzeXhcIixcInN5eVwiLFwic3phXCIsXCJzemJcIixcInN6Y1wiLFwic3pkXCIsXCJzemVcIixcInN6Z1wiLFwic3psXCIsXCJzem5cIixcInN6cFwiLFwic3pzXCIsXCJzenZcIixcInN6d1wiLFwic3p5XCJdXG4sWyBcInRhXCIsXCJ0ZVwiLFwidGdcIixcInRoXCIsXCJ0aVwiLFwidGtcIixcInRsXCIsXCJ0blwiLFwidG9cIixcInRyXCIsXCJ0c1wiLFwidHRcIixcInR3XCIsXCJ0eVwiLFwidGFhXCIsXCJ0YWJcIixcInRhY1wiLFwidGFkXCIsXCJ0YWVcIixcInRhZlwiLFwidGFnXCIsXCJ0YWlcIixcInRhalwiLFwidGFrXCIsXCJ0YWxcIixcInRhblwiLFwidGFvXCIsXCJ0YXBcIixcInRhcVwiLFwidGFyXCIsXCJ0YXNcIixcInRhdVwiLFwidGF2XCIsXCJ0YXdcIixcInRheFwiLFwidGF5XCIsXCJ0YXpcIixcInRiYVwiLFwidGJiXCIsXCJ0YmNcIixcInRiZFwiLFwidGJlXCIsXCJ0YmZcIixcInRiZ1wiLFwidGJoXCIsXCJ0YmlcIixcInRialwiLFwidGJrXCIsXCJ0YmxcIixcInRibVwiLFwidGJuXCIsXCJ0Ym9cIixcInRicFwiLFwidGJxXCIsXCJ0YnJcIixcInRic1wiLFwidGJ0XCIsXCJ0YnVcIixcInRidlwiLFwidGJ3XCIsXCJ0YnhcIixcInRieVwiLFwidGJ6XCIsXCJ0Y2FcIixcInRjYlwiLFwidGNjXCIsXCJ0Y2RcIixcInRjZVwiLFwidGNmXCIsXCJ0Y2dcIixcInRjaFwiLFwidGNpXCIsXCJ0Y2tcIixcInRjbFwiLFwidGNtXCIsXCJ0Y25cIixcInRjb1wiLFwidGNwXCIsXCJ0Y3FcIixcInRjc1wiLFwidGN0XCIsXCJ0Y3VcIixcInRjd1wiLFwidGN4XCIsXCJ0Y3lcIixcInRjelwiLFwidGRhXCIsXCJ0ZGJcIixcInRkY1wiLFwidGRkXCIsXCJ0ZGVcIixcInRkZlwiLFwidGRnXCIsXCJ0ZGhcIixcInRkaVwiLFwidGRqXCIsXCJ0ZGtcIixcInRkbFwiLFwidGRtXCIsXCJ0ZG5cIixcInRkb1wiLFwidGRxXCIsXCJ0ZHJcIixcInRkc1wiLFwidGR0XCIsXCJ0ZHVcIixcInRkdlwiLFwidGR4XCIsXCJ0ZHlcIixcInRlYVwiLFwidGViXCIsXCJ0ZWNcIixcInRlZFwiLFwidGVlXCIsXCJ0ZWZcIixcInRlZ1wiLFwidGVoXCIsXCJ0ZWlcIixcInRla1wiLFwidGVtXCIsXCJ0ZW5cIixcInRlb1wiLFwidGVwXCIsXCJ0ZXFcIixcInRlclwiLFwidGVzXCIsXCJ0ZXRcIixcInRldVwiLFwidGV2XCIsXCJ0ZXdcIixcInRleFwiLFwidGV5XCIsXCJ0ZXpcIixcInRmaVwiLFwidGZuXCIsXCJ0Zm9cIixcInRmclwiLFwidGZ0XCIsXCJ0Z2FcIixcInRnYlwiLFwidGdjXCIsXCJ0Z2RcIixcInRnZVwiLFwidGdmXCIsXCJ0Z2dcIixcInRnaFwiLFwidGdpXCIsXCJ0Z2pcIixcInRnblwiLFwidGdvXCIsXCJ0Z3BcIixcInRncVwiLFwidGdyXCIsXCJ0Z3NcIixcInRndFwiLFwidGd1XCIsXCJ0Z3ZcIixcInRnd1wiLFwidGd4XCIsXCJ0Z3lcIixcInRnelwiLFwidGhjXCIsXCJ0aGRcIixcInRoZVwiLFwidGhmXCIsXCJ0aGhcIixcInRoaVwiLFwidGhrXCIsXCJ0aGxcIixcInRobVwiLFwidGhuXCIsXCJ0aHBcIixcInRocVwiLFwidGhyXCIsXCJ0aHNcIixcInRodFwiLFwidGh1XCIsXCJ0aHZcIixcInRod1wiLFwidGh4XCIsXCJ0aHlcIixcInRoelwiLFwidGlhXCIsXCJ0aWNcIixcInRpZFwiLFwidGllXCIsXCJ0aWZcIixcInRpZ1wiLFwidGloXCIsXCJ0aWlcIixcInRpalwiLFwidGlrXCIsXCJ0aWxcIixcInRpbVwiLFwidGluXCIsXCJ0aW9cIixcInRpcFwiLFwidGlxXCIsXCJ0aXNcIixcInRpdFwiLFwidGl1XCIsXCJ0aXZcIixcInRpd1wiLFwidGl4XCIsXCJ0aXlcIixcInRpelwiLFwidGphXCIsXCJ0amdcIixcInRqaVwiLFwidGpqXCIsXCJ0amxcIixcInRqbVwiLFwidGpuXCIsXCJ0am9cIixcInRqcFwiLFwidGpzXCIsXCJ0anVcIixcInRqd1wiLFwidGthXCIsXCJ0a2JcIixcInRrZFwiLFwidGtlXCIsXCJ0a2ZcIixcInRrZ1wiLFwidGtrXCIsXCJ0a2xcIixcInRrbVwiLFwidGtuXCIsXCJ0a3BcIixcInRrcVwiLFwidGtyXCIsXCJ0a3NcIixcInRrdFwiLFwidGt1XCIsXCJ0a3ZcIixcInRrd1wiLFwidGt4XCIsXCJ0a3pcIixcInRsYVwiLFwidGxiXCIsXCJ0bGNcIixcInRsZFwiLFwidGxmXCIsXCJ0bGdcIixcInRsaFwiLFwidGxpXCIsXCJ0bGpcIixcInRsa1wiLFwidGxsXCIsXCJ0bG1cIixcInRsblwiLFwidGxvXCIsXCJ0bHBcIixcInRscVwiLFwidGxyXCIsXCJ0bHNcIixcInRsdFwiLFwidGx1XCIsXCJ0bHZcIixcInRsd1wiLFwidGx4XCIsXCJ0bHlcIixcInRtYVwiLFwidG1iXCIsXCJ0bWNcIixcInRtZFwiLFwidG1lXCIsXCJ0bWZcIixcInRtZ1wiLFwidG1oXCIsXCJ0bWlcIixcInRtalwiLFwidG1rXCIsXCJ0bWxcIixcInRtbVwiLFwidG1uXCIsXCJ0bW9cIixcInRtcFwiLFwidG1xXCIsXCJ0bXJcIixcInRtc1wiLFwidG10XCIsXCJ0bXVcIixcInRtdlwiLFwidG13XCIsXCJ0bXlcIixcInRtelwiLFwidG5hXCIsXCJ0bmJcIixcInRuY1wiLFwidG5kXCIsXCJ0bmVcIixcInRuZlwiLFwidG5nXCIsXCJ0bmhcIixcInRuaVwiLFwidG5rXCIsXCJ0bmxcIixcInRubVwiLFwidG5uXCIsXCJ0bm9cIixcInRucFwiLFwidG5xXCIsXCJ0bnJcIixcInRuc1wiLFwidG50XCIsXCJ0bnVcIixcInRudlwiLFwidG53XCIsXCJ0bnhcIixcInRueVwiLFwidG56XCIsXCJ0b2JcIixcInRvY1wiLFwidG9kXCIsXCJ0b2VcIixcInRvZlwiLFwidG9nXCIsXCJ0b2hcIixcInRvaVwiLFwidG9qXCIsXCJ0b2xcIixcInRvbVwiLFwidG9vXCIsXCJ0b3BcIixcInRvcVwiLFwidG9yXCIsXCJ0b3NcIixcInRvdVwiLFwidG92XCIsXCJ0b3dcIixcInRveFwiLFwidG95XCIsXCJ0b3pcIixcInRwYVwiLFwidHBjXCIsXCJ0cGVcIixcInRwZlwiLFwidHBnXCIsXCJ0cGlcIixcInRwalwiLFwidHBrXCIsXCJ0cGxcIixcInRwbVwiLFwidHBuXCIsXCJ0cG9cIixcInRwcFwiLFwidHBxXCIsXCJ0cHJcIixcInRwdFwiLFwidHB1XCIsXCJ0cHZcIixcInRwd1wiLFwidHB4XCIsXCJ0cHlcIixcInRwelwiLFwidHFiXCIsXCJ0cWxcIixcInRxbVwiLFwidHFuXCIsXCJ0cW9cIixcInRxcFwiLFwidHFxXCIsXCJ0cXJcIixcInRxdFwiLFwidHF1XCIsXCJ0cXdcIixcInRyYVwiLFwidHJiXCIsXCJ0cmNcIixcInRyZFwiLFwidHJlXCIsXCJ0cmZcIixcInRyZ1wiLFwidHJoXCIsXCJ0cmlcIixcInRyalwiLFwidHJrXCIsXCJ0cmxcIixcInRybVwiLFwidHJuXCIsXCJ0cm9cIixcInRycFwiLFwidHJxXCIsXCJ0cnJcIixcInRyc1wiLFwidHJ0XCIsXCJ0cnVcIixcInRydlwiLFwidHJ3XCIsXCJ0cnhcIixcInRyeVwiLFwidHJ6XCIsXCJ0c2FcIixcInRzYlwiLFwidHNjXCIsXCJ0c2RcIixcInRzZVwiLFwidHNmXCIsXCJ0c2dcIixcInRzaFwiLFwidHNpXCIsXCJ0c2pcIixcInRza1wiLFwidHNsXCIsXCJ0c21cIixcInRzcFwiLFwidHNxXCIsXCJ0c3JcIixcInRzc1wiLFwidHN0XCIsXCJ0c3VcIixcInRzdlwiLFwidHN3XCIsXCJ0c3hcIixcInRzeVwiLFwidHN6XCIsXCJ0dGFcIixcInR0YlwiLFwidHRjXCIsXCJ0dGRcIixcInR0ZVwiLFwidHRmXCIsXCJ0dGdcIixcInR0aFwiLFwidHRpXCIsXCJ0dGpcIixcInR0a1wiLFwidHRsXCIsXCJ0dG1cIixcInR0blwiLFwidHRvXCIsXCJ0dHBcIixcInR0cVwiLFwidHRyXCIsXCJ0dHNcIixcInR0dFwiLFwidHR1XCIsXCJ0dHZcIixcInR0d1wiLFwidHR5XCIsXCJ0dHpcIixcInR1YVwiLFwidHViXCIsXCJ0dWNcIixcInR1ZFwiLFwidHVlXCIsXCJ0dWZcIixcInR1Z1wiLFwidHVoXCIsXCJ0dWlcIixcInR1alwiLFwidHVsXCIsXCJ0dW1cIixcInR1blwiLFwidHVvXCIsXCJ0dXBcIixcInR1cVwiLFwidHVzXCIsXCJ0dXRcIixcInR1dVwiLFwidHV2XCIsXCJ0dXdcIixcInR1eFwiLFwidHV5XCIsXCJ0dXpcIixcInR2YVwiLFwidHZkXCIsXCJ0dmVcIixcInR2a1wiLFwidHZsXCIsXCJ0dm1cIixcInR2blwiLFwidHZvXCIsXCJ0dnNcIixcInR2dFwiLFwidHZ1XCIsXCJ0dndcIixcInR2eFwiLFwidHZ5XCIsXCJ0d2FcIixcInR3YlwiLFwidHdjXCIsXCJ0d2RcIixcInR3ZVwiLFwidHdmXCIsXCJ0d2dcIixcInR3aFwiLFwidHdsXCIsXCJ0d21cIixcInR3blwiLFwidHdvXCIsXCJ0d3BcIixcInR3cVwiLFwidHdyXCIsXCJ0d3RcIixcInR3dVwiLFwidHd3XCIsXCJ0d3hcIixcInR3eVwiLFwidHhhXCIsXCJ0eGJcIixcInR4Y1wiLFwidHhlXCIsXCJ0eGdcIixcInR4aFwiLFwidHhpXCIsXCJ0eGpcIixcInR4bVwiLFwidHhuXCIsXCJ0eG9cIixcInR4cVwiLFwidHhyXCIsXCJ0eHNcIixcInR4dFwiLFwidHh1XCIsXCJ0eHhcIixcInR4eVwiLFwidHlhXCIsXCJ0eWVcIixcInR5aFwiLFwidHlpXCIsXCJ0eWpcIixcInR5bFwiLFwidHluXCIsXCJ0eXBcIixcInR5clwiLFwidHlzXCIsXCJ0eXRcIixcInR5dVwiLFwidHl2XCIsXCJ0eXhcIixcInR5eVwiLFwidHl6XCIsXCJ0emFcIixcInR6aFwiLFwidHpqXCIsXCJ0emxcIixcInR6bVwiLFwidHpuXCIsXCJ0em9cIixcInR6eFwiXVxuLFsgXCJ1Z1wiLFwidWtcIixcInVyXCIsXCJ1elwiLFwidWFtXCIsXCJ1YW5cIixcInVhclwiLFwidWJhXCIsXCJ1YmlcIixcInVibFwiLFwidWJyXCIsXCJ1YnVcIixcInVieVwiLFwidWRhXCIsXCJ1ZGVcIixcInVkZ1wiLFwidWRpXCIsXCJ1ZGpcIixcInVkbFwiLFwidWRtXCIsXCJ1ZHVcIixcInVlc1wiLFwidWZpXCIsXCJ1Z2FcIixcInVnYlwiLFwidWdlXCIsXCJ1Z25cIixcInVnb1wiLFwidWd5XCIsXCJ1aGFcIixcInVoblwiLFwidWlzXCIsXCJ1aXZcIixcInVqaVwiLFwidWthXCIsXCJ1a2dcIixcInVraFwiLFwidWtpXCIsXCJ1a2tcIixcInVrbFwiLFwidWtwXCIsXCJ1a3FcIixcInVrc1wiLFwidWt1XCIsXCJ1a3ZcIixcInVrd1wiLFwidWt5XCIsXCJ1bGFcIixcInVsYlwiLFwidWxjXCIsXCJ1bGVcIixcInVsZlwiLFwidWxpXCIsXCJ1bGtcIixcInVsbFwiLFwidWxtXCIsXCJ1bG5cIixcInVsdVwiLFwidWx3XCIsXCJ1bWFcIixcInVtYlwiLFwidW1jXCIsXCJ1bWRcIixcInVtZ1wiLFwidW1pXCIsXCJ1bW1cIixcInVtblwiLFwidW1vXCIsXCJ1bXBcIixcInVtclwiLFwidW1zXCIsXCJ1bXVcIixcInVuYVwiLFwidW5kXCIsXCJ1bmVcIixcInVuZ1wiLFwidW5pXCIsXCJ1bmtcIixcInVubVwiLFwidW5uXCIsXCJ1bnBcIixcInVuclwiLFwidW51XCIsXCJ1bnhcIixcInVuelwiLFwidW9rXCIsXCJ1cGlcIixcInVwdlwiLFwidXJhXCIsXCJ1cmJcIixcInVyY1wiLFwidXJlXCIsXCJ1cmZcIixcInVyZ1wiLFwidXJoXCIsXCJ1cmlcIixcInVyalwiLFwidXJrXCIsXCJ1cmxcIixcInVybVwiLFwidXJuXCIsXCJ1cm9cIixcInVycFwiLFwidXJyXCIsXCJ1cnRcIixcInVydVwiLFwidXJ2XCIsXCJ1cndcIixcInVyeFwiLFwidXJ5XCIsXCJ1cnpcIixcInVzYVwiLFwidXNoXCIsXCJ1c2lcIixcInVza1wiLFwidXNwXCIsXCJ1c3NcIixcInVzdVwiLFwidXRhXCIsXCJ1dGVcIixcInV0aFwiLFwidXRwXCIsXCJ1dHJcIixcInV0dVwiLFwidXVtXCIsXCJ1dW5cIixcInV1clwiLFwidXV1XCIsXCJ1dmVcIixcInV2aFwiLFwidXZsXCIsXCJ1d2FcIixcInV5YVwiLFwidXpuXCIsXCJ1enNcIl1cbixbIFwidmVcIixcInZpXCIsXCJ2b1wiLFwidmFhXCIsXCJ2YWVcIixcInZhZlwiLFwidmFnXCIsXCJ2YWhcIixcInZhaVwiLFwidmFqXCIsXCJ2YWxcIixcInZhbVwiLFwidmFuXCIsXCJ2YW9cIixcInZhcFwiLFwidmFyXCIsXCJ2YXNcIixcInZhdVwiLFwidmF2XCIsXCJ2YXlcIixcInZiYlwiLFwidmJrXCIsXCJ2ZWNcIixcInZlZFwiLFwidmVsXCIsXCJ2ZW1cIixcInZlb1wiLFwidmVwXCIsXCJ2ZXJcIixcInZnclwiLFwidmd0XCIsXCJ2aWNcIixcInZpZFwiLFwidmlmXCIsXCJ2aWdcIixcInZpbFwiLFwidmluXCIsXCJ2aXNcIixcInZpdFwiLFwidml2XCIsXCJ2a2FcIixcInZraVwiLFwidmtqXCIsXCJ2a2tcIixcInZrbFwiLFwidmttXCIsXCJ2a25cIixcInZrb1wiLFwidmtwXCIsXCJ2a3RcIixcInZrdVwiLFwidmt6XCIsXCJ2bHBcIixcInZsc1wiLFwidm1hXCIsXCJ2bWJcIixcInZtY1wiLFwidm1kXCIsXCJ2bWVcIixcInZtZlwiLFwidm1nXCIsXCJ2bWhcIixcInZtaVwiLFwidm1qXCIsXCJ2bWtcIixcInZtbFwiLFwidm1tXCIsXCJ2bXBcIixcInZtcVwiLFwidm1yXCIsXCJ2bXNcIixcInZtdVwiLFwidm12XCIsXCJ2bXdcIixcInZteFwiLFwidm15XCIsXCJ2bXpcIixcInZua1wiLFwidm5tXCIsXCJ2bnBcIixcInZvclwiLFwidm90XCIsXCJ2cmFcIixcInZyb1wiLFwidnJzXCIsXCJ2cnRcIixcInZzaVwiLFwidnNsXCIsXCJ2c3ZcIixcInZ0b1wiLFwidnVtXCIsXCJ2dW5cIixcInZ1dFwiLFwidndhXCJdXG4sWyBcIndhXCIsXCJ3b1wiLFwid2FhXCIsXCJ3YWJcIixcIndhY1wiLFwid2FkXCIsXCJ3YWVcIixcIndhZlwiLFwid2FnXCIsXCJ3YWhcIixcIndhaVwiLFwid2FqXCIsXCJ3YWtcIixcIndhbFwiLFwid2FtXCIsXCJ3YW5cIixcIndhb1wiLFwid2FwXCIsXCJ3YXFcIixcIndhclwiLFwid2FzXCIsXCJ3YXRcIixcIndhdVwiLFwid2F2XCIsXCJ3YXdcIixcIndheFwiLFwid2F5XCIsXCJ3YXpcIixcIndiYVwiLFwid2JiXCIsXCJ3YmVcIixcIndiZlwiLFwid2JoXCIsXCJ3YmlcIixcIndialwiLFwid2JrXCIsXCJ3YmxcIixcIndibVwiLFwid2JwXCIsXCJ3YnFcIixcIndiclwiLFwid2JzXCIsXCJ3YnRcIixcIndidlwiLFwid2J3XCIsXCJ3Y2FcIixcIndjaVwiLFwid2RkXCIsXCJ3ZGdcIixcIndkalwiLFwid2RrXCIsXCJ3ZHVcIixcIndkeVwiLFwid2VhXCIsXCJ3ZWNcIixcIndlZFwiLFwid2VnXCIsXCJ3ZWhcIixcIndlaVwiLFwid2VtXCIsXCJ3ZW5cIixcIndlb1wiLFwid2VwXCIsXCJ3ZXJcIixcIndlc1wiLFwid2V0XCIsXCJ3ZXVcIixcIndld1wiLFwid2ZnXCIsXCJ3Z2FcIixcIndnYlwiLFwid2dnXCIsXCJ3Z2lcIixcIndnb1wiLFwid2d1XCIsXCJ3Z3dcIixcIndneVwiLFwid2hhXCIsXCJ3aGdcIixcIndoa1wiLFwid2h1XCIsXCJ3aWJcIixcIndpY1wiLFwid2llXCIsXCJ3aWZcIixcIndpZ1wiLFwid2loXCIsXCJ3aWlcIixcIndpalwiLFwid2lrXCIsXCJ3aWxcIixcIndpbVwiLFwid2luXCIsXCJ3aXJcIixcIndpdFwiLFwid2l1XCIsXCJ3aXZcIixcIndpd1wiLFwid2l5XCIsXCJ3amFcIixcIndqaVwiLFwid2thXCIsXCJ3a2JcIixcIndrZFwiLFwid2tsXCIsXCJ3a3JcIixcIndrdVwiLFwid2t3XCIsXCJ3a3lcIixcIndsYVwiLFwid2xjXCIsXCJ3bGVcIixcIndsZ1wiLFwid2xoXCIsXCJ3bGlcIixcIndsa1wiLFwid2xsXCIsXCJ3bG1cIixcIndsb1wiLFwid2xyXCIsXCJ3bHNcIixcIndsdVwiLFwid2x2XCIsXCJ3bHdcIixcIndseFwiLFwid2x5XCIsXCJ3bWFcIixcIndtYlwiLFwid21jXCIsXCJ3bWRcIixcIndtZVwiLFwid21nXCIsXCJ3bWhcIixcIndtaVwiLFwid21tXCIsXCJ3bW5cIixcIndtb1wiLFwid21zXCIsXCJ3bXRcIixcIndtd1wiLFwid214XCIsXCJ3bmJcIixcInduY1wiLFwid25kXCIsXCJ3bmVcIixcInduZ1wiLFwid25pXCIsXCJ3bmtcIixcIndubVwiLFwid25uXCIsXCJ3bm9cIixcInducFwiLFwid251XCIsXCJ3bndcIixcIndueVwiLFwid29hXCIsXCJ3b2JcIixcIndvY1wiLFwid29kXCIsXCJ3b2VcIixcIndvZlwiLFwid29nXCIsXCJ3b2lcIixcIndva1wiLFwid29tXCIsXCJ3b25cIixcIndvb1wiLFwid29yXCIsXCJ3b3NcIixcIndvd1wiLFwid295XCIsXCJ3cGNcIixcIndyYVwiLFwid3JiXCIsXCJ3cmRcIixcIndyZ1wiLFwid3JoXCIsXCJ3cmlcIixcIndya1wiLFwid3JsXCIsXCJ3cm1cIixcIndyblwiLFwid3JvXCIsXCJ3cnBcIixcIndyclwiLFwid3JzXCIsXCJ3cnVcIixcIndydlwiLFwid3J3XCIsXCJ3cnhcIixcIndyeVwiLFwid3J6XCIsXCJ3c2FcIixcIndzZ1wiLFwid3NpXCIsXCJ3c2tcIixcIndzclwiLFwid3NzXCIsXCJ3c3VcIixcIndzdlwiLFwid3RmXCIsXCJ3dGhcIixcInd0aVwiLFwid3RrXCIsXCJ3dG1cIixcInd0d1wiLFwid3VhXCIsXCJ3dWJcIixcInd1ZFwiLFwid3VoXCIsXCJ3dWxcIixcInd1bVwiLFwid3VuXCIsXCJ3dXJcIixcInd1dFwiLFwid3V1XCIsXCJ3dXZcIixcInd1eFwiLFwid3V5XCIsXCJ3d2FcIixcInd3YlwiLFwid3dvXCIsXCJ3d3JcIixcInd3d1wiLFwid3hhXCIsXCJ3eHdcIixcInd5YVwiLFwid3liXCIsXCJ3eWlcIixcInd5bVwiLFwid3lyXCIsXCJ3eXlcIl1cbixbIFwieGhcIixcInhhYVwiLFwieGFiXCIsXCJ4YWNcIixcInhhZFwiLFwieGFlXCIsXCJ4YWdcIixcInhhaVwiLFwieGFqXCIsXCJ4YWtcIixcInhhbFwiLFwieGFtXCIsXCJ4YW5cIixcInhhb1wiLFwieGFwXCIsXCJ4YXFcIixcInhhclwiLFwieGFzXCIsXCJ4YXRcIixcInhhdVwiLFwieGF2XCIsXCJ4YXdcIixcInhheVwiLFwieGJhXCIsXCJ4YmJcIixcInhiY1wiLFwieGJkXCIsXCJ4YmVcIixcInhiZ1wiLFwieGJpXCIsXCJ4YmpcIixcInhibVwiLFwieGJuXCIsXCJ4Ym9cIixcInhicFwiLFwieGJyXCIsXCJ4YndcIixcInhieFwiLFwieGJ5XCIsXCJ4Y2JcIixcInhjY1wiLFwieGNlXCIsXCJ4Y2dcIixcInhjaFwiLFwieGNsXCIsXCJ4Y21cIixcInhjblwiLFwieGNvXCIsXCJ4Y3JcIixcInhjdFwiLFwieGN1XCIsXCJ4Y3ZcIixcInhjd1wiLFwieGN5XCIsXCJ4ZGFcIixcInhkY1wiLFwieGRrXCIsXCJ4ZG1cIixcInhkb1wiLFwieGR5XCIsXCJ4ZWJcIixcInhlZFwiLFwieGVnXCIsXCJ4ZWxcIixcInhlbVwiLFwieGVwXCIsXCJ4ZXJcIixcInhlc1wiLFwieGV0XCIsXCJ4ZXVcIixcInhmYVwiLFwieGdhXCIsXCJ4Z2JcIixcInhnZFwiLFwieGdmXCIsXCJ4Z2dcIixcInhnaVwiLFwieGdsXCIsXCJ4Z21cIixcInhnblwiLFwieGdyXCIsXCJ4Z3VcIixcInhnd1wiLFwieGhhXCIsXCJ4aGNcIixcInhoZFwiLFwieGhlXCIsXCJ4aHJcIixcInhodFwiLFwieGh1XCIsXCJ4aHZcIixcInhpYVwiLFwieGliXCIsXCJ4aWlcIixcInhpbFwiLFwieGluXCIsXCJ4aXBcIixcInhpclwiLFwieGlzXCIsXCJ4aXZcIixcInhpeVwiLFwieGpiXCIsXCJ4anRcIixcInhrYVwiLFwieGtiXCIsXCJ4a2NcIixcInhrZFwiLFwieGtlXCIsXCJ4a2ZcIixcInhrZ1wiLFwieGtoXCIsXCJ4a2lcIixcInhralwiLFwieGtrXCIsXCJ4a2xcIixcInhrblwiLFwieGtvXCIsXCJ4a3BcIixcInhrcVwiLFwieGtyXCIsXCJ4a3NcIixcInhrdFwiLFwieGt1XCIsXCJ4a3ZcIixcInhrd1wiLFwieGt4XCIsXCJ4a3lcIixcInhrelwiLFwieGxhXCIsXCJ4bGJcIixcInhsY1wiLFwieGxkXCIsXCJ4bGVcIixcInhsZ1wiLFwieGxpXCIsXCJ4bG5cIixcInhsb1wiLFwieGxwXCIsXCJ4bHNcIixcInhsdVwiLFwieGx5XCIsXCJ4bWFcIixcInhtYlwiLFwieG1jXCIsXCJ4bWRcIixcInhtZVwiLFwieG1mXCIsXCJ4bWdcIixcInhtaFwiLFwieG1qXCIsXCJ4bWtcIixcInhtbFwiLFwieG1tXCIsXCJ4bW5cIixcInhtb1wiLFwieG1wXCIsXCJ4bXFcIixcInhtclwiLFwieG1zXCIsXCJ4bXRcIixcInhtdVwiLFwieG12XCIsXCJ4bXdcIixcInhteFwiLFwieG15XCIsXCJ4bXpcIixcInhuYVwiLFwieG5iXCIsXCJ4bmRcIixcInhuZ1wiLFwieG5oXCIsXCJ4bmlcIixcInhualwiLFwieG5rXCIsXCJ4bm1cIixcInhublwiLFwieG5vXCIsXCJ4bnFcIixcInhuclwiLFwieG5zXCIsXCJ4bnRcIixcInhudVwiLFwieG55XCIsXCJ4bnpcIixcInhvY1wiLFwieG9kXCIsXCJ4b2dcIixcInhvaVwiLFwieG9rXCIsXCJ4b21cIixcInhvblwiLFwieG9vXCIsXCJ4b3BcIixcInhvclwiLFwieG93XCIsXCJ4cGFcIixcInhwYlwiLFwieHBjXCIsXCJ4cGRcIixcInhwZVwiLFwieHBmXCIsXCJ4cGdcIixcInhwaFwiLFwieHBpXCIsXCJ4cGpcIixcInhwa1wiLFwieHBsXCIsXCJ4cG1cIixcInhwblwiLFwieHBvXCIsXCJ4cHBcIixcInhwcVwiLFwieHByXCIsXCJ4cHNcIixcInhwdFwiLFwieHB1XCIsXCJ4cHZcIixcInhwd1wiLFwieHB4XCIsXCJ4cHlcIixcInhwelwiLFwieHFhXCIsXCJ4cXRcIixcInhyYVwiLFwieHJiXCIsXCJ4cmRcIixcInhyZVwiLFwieHJnXCIsXCJ4cmlcIixcInhybVwiLFwieHJuXCIsXCJ4cnFcIixcInhyclwiLFwieHJ0XCIsXCJ4cnVcIixcInhyd1wiLFwieHNhXCIsXCJ4c2JcIixcInhzY1wiLFwieHNkXCIsXCJ4c2VcIixcInhzaFwiLFwieHNpXCIsXCJ4c2pcIixcInhzbFwiLFwieHNtXCIsXCJ4c25cIixcInhzb1wiLFwieHNwXCIsXCJ4c3FcIixcInhzclwiLFwieHNzXCIsXCJ4c3VcIixcInhzdlwiLFwieHN5XCIsXCJ4dGFcIixcInh0YlwiLFwieHRjXCIsXCJ4dGRcIixcInh0ZVwiLFwieHRnXCIsXCJ4dGhcIixcInh0aVwiLFwieHRqXCIsXCJ4dGxcIixcInh0bVwiLFwieHRuXCIsXCJ4dG9cIixcInh0cFwiLFwieHRxXCIsXCJ4dHJcIixcInh0c1wiLFwieHR0XCIsXCJ4dHVcIixcInh0dlwiLFwieHR3XCIsXCJ4dHlcIixcInh0elwiLFwieHVhXCIsXCJ4dWJcIixcInh1ZFwiLFwieHVnXCIsXCJ4dWpcIixcInh1bFwiLFwieHVtXCIsXCJ4dW5cIixcInh1b1wiLFwieHVwXCIsXCJ4dXJcIixcInh1dFwiLFwieHV1XCIsXCJ4dmVcIixcInh2aVwiLFwieHZuXCIsXCJ4dm9cIixcInh2c1wiLFwieHdhXCIsXCJ4d2NcIixcInh3ZFwiLFwieHdlXCIsXCJ4d2dcIixcInh3alwiLFwieHdrXCIsXCJ4d2xcIixcInh3b1wiLFwieHdyXCIsXCJ4d3RcIixcInh3d1wiLFwieHhiXCIsXCJ4eGtcIixcInh4bVwiLFwieHhyXCIsXCJ4eHRcIixcInh5YVwiLFwieHliXCIsXCJ4eWpcIixcInh5a1wiLFwieHlsXCIsXCJ4eXRcIixcInh5eVwiLFwieHpoXCIsXCJ4em1cIixcInh6cFwiXVxuLFsgXCJ5aVwiLFwieW9cIixcInlhYVwiLFwieWFiXCIsXCJ5YWNcIixcInlhZFwiLFwieWFlXCIsXCJ5YWZcIixcInlhZ1wiLFwieWFoXCIsXCJ5YWlcIixcInlhalwiLFwieWFrXCIsXCJ5YWxcIixcInlhbVwiLFwieWFuXCIsXCJ5YW9cIixcInlhcFwiLFwieWFxXCIsXCJ5YXJcIixcInlhc1wiLFwieWF0XCIsXCJ5YXVcIixcInlhdlwiLFwieWF3XCIsXCJ5YXhcIixcInlheVwiLFwieWF6XCIsXCJ5YmFcIixcInliYlwiLFwieWJkXCIsXCJ5YmVcIixcInliaFwiLFwieWJpXCIsXCJ5YmpcIixcInlia1wiLFwieWJsXCIsXCJ5Ym1cIixcInliblwiLFwieWJvXCIsXCJ5YnhcIixcInlieVwiLFwieWNoXCIsXCJ5Y2xcIixcInljblwiLFwieWNwXCIsXCJ5ZGFcIixcInlkZFwiLFwieWRlXCIsXCJ5ZGdcIixcInlka1wiLFwieWRzXCIsXCJ5ZWFcIixcInllY1wiLFwieWVlXCIsXCJ5ZWlcIixcInllalwiLFwieWVsXCIsXCJ5ZW5cIixcInllclwiLFwieWVzXCIsXCJ5ZXRcIixcInlldVwiLFwieWV2XCIsXCJ5ZXlcIixcInlnYVwiLFwieWdpXCIsXCJ5Z2xcIixcInlnbVwiLFwieWdwXCIsXCJ5Z3JcIixcInlnc1wiLFwieWd1XCIsXCJ5Z3dcIixcInloYVwiLFwieWhkXCIsXCJ5aGxcIixcInloc1wiLFwieWlhXCIsXCJ5aWZcIixcInlpZ1wiLFwieWloXCIsXCJ5aWlcIixcInlpalwiLFwieWlrXCIsXCJ5aWxcIixcInlpbVwiLFwieWluXCIsXCJ5aXBcIixcInlpcVwiLFwieWlyXCIsXCJ5aXNcIixcInlpdFwiLFwieWl1XCIsXCJ5aXZcIixcInlpeFwiLFwieWl5XCIsXCJ5aXpcIixcInlrYVwiLFwieWtnXCIsXCJ5a2lcIixcInlra1wiLFwieWtsXCIsXCJ5a21cIixcInlrblwiLFwieWtvXCIsXCJ5a3JcIixcInlrdFwiLFwieWt1XCIsXCJ5a3lcIixcInlsYVwiLFwieWxiXCIsXCJ5bGVcIixcInlsZ1wiLFwieWxpXCIsXCJ5bGxcIixcInlsbVwiLFwieWxuXCIsXCJ5bG9cIixcInlsclwiLFwieWx1XCIsXCJ5bHlcIixcInltYVwiLFwieW1iXCIsXCJ5bWNcIixcInltZFwiLFwieW1lXCIsXCJ5bWdcIixcInltaFwiLFwieW1pXCIsXCJ5bWtcIixcInltbFwiLFwieW1tXCIsXCJ5bW5cIixcInltb1wiLFwieW1wXCIsXCJ5bXFcIixcInltclwiLFwieW1zXCIsXCJ5bXRcIixcInlteFwiLFwieW16XCIsXCJ5bmFcIixcInluZFwiLFwieW5lXCIsXCJ5bmdcIixcInluaFwiLFwieW5rXCIsXCJ5bmxcIixcInlublwiLFwieW5vXCIsXCJ5bnFcIixcInluc1wiLFwieW51XCIsXCJ5b2JcIixcInlvZ1wiLFwieW9pXCIsXCJ5b2tcIixcInlvbFwiLFwieW9tXCIsXCJ5b25cIixcInlvc1wiLFwieW90XCIsXCJ5b3hcIixcInlveVwiLFwieXBhXCIsXCJ5cGJcIixcInlwZ1wiLFwieXBoXCIsXCJ5cGtcIixcInlwbVwiLFwieXBuXCIsXCJ5cG9cIixcInlwcFwiLFwieXB6XCIsXCJ5cmFcIixcInlyYlwiLFwieXJlXCIsXCJ5cmlcIixcInlya1wiLFwieXJsXCIsXCJ5cm1cIixcInlyblwiLFwieXJvXCIsXCJ5cnNcIixcInlyd1wiLFwieXJ5XCIsXCJ5c2NcIixcInlzZFwiLFwieXNnXCIsXCJ5c2xcIixcInlzbVwiLFwieXNuXCIsXCJ5c29cIixcInlzcFwiLFwieXNyXCIsXCJ5c3NcIixcInlzeVwiLFwieXRhXCIsXCJ5dGxcIixcInl0cFwiLFwieXR3XCIsXCJ5dHlcIixcInl1YVwiLFwieXViXCIsXCJ5dWNcIixcInl1ZFwiLFwieXVlXCIsXCJ5dWZcIixcInl1Z1wiLFwieXVpXCIsXCJ5dWpcIixcInl1a1wiLFwieXVsXCIsXCJ5dW1cIixcInl1blwiLFwieXVwXCIsXCJ5dXFcIixcInl1clwiLFwieXV0XCIsXCJ5dXVcIixcInl1d1wiLFwieXV4XCIsXCJ5dXlcIixcInl1elwiLFwieXZhXCIsXCJ5dnRcIixcInl3YVwiLFwieXdnXCIsXCJ5d2xcIixcInl3blwiLFwieXdxXCIsXCJ5d3JcIixcInl3dFwiLFwieXd1XCIsXCJ5d3dcIixcInl4YVwiLFwieXhnXCIsXCJ5eGxcIixcInl4bVwiLFwieXh1XCIsXCJ5eHlcIixcInl5clwiLFwieXl1XCIsXCJ5eXpcIixcInl6Z1wiLFwieXprXCJdXG4sWyBcInphXCIsXCJ6aFwiLFwienVcIixcInphYVwiLFwiemFiXCIsXCJ6YWNcIixcInphZFwiLFwiemFlXCIsXCJ6YWZcIixcInphZ1wiLFwiemFoXCIsXCJ6YWlcIixcInphalwiLFwiemFrXCIsXCJ6YWxcIixcInphbVwiLFwiemFvXCIsXCJ6YXBcIixcInphcVwiLFwiemFyXCIsXCJ6YXNcIixcInphdFwiLFwiemF1XCIsXCJ6YXZcIixcInphd1wiLFwiemF4XCIsXCJ6YXlcIixcInphelwiLFwiemJhXCIsXCJ6YmNcIixcInpiZVwiLFwiemJsXCIsXCJ6YnRcIixcInpidVwiLFwiemJ3XCIsXCJ6Y2FcIixcInpjaFwiLFwiemRqXCIsXCJ6ZWFcIixcInplZ1wiLFwiemVoXCIsXCJ6ZW5cIixcInpnYVwiLFwiemdiXCIsXCJ6Z2hcIixcInpnbVwiLFwiemduXCIsXCJ6Z3JcIixcInpoYlwiLFwiemhkXCIsXCJ6aGlcIixcInpoblwiLFwiemh3XCIsXCJ6aHhcIixcInppYVwiLFwiemliXCIsXCJ6aWtcIixcInppbFwiLFwiemltXCIsXCJ6aW5cIixcInppclwiLFwieml3XCIsXCJ6aXpcIixcInprYVwiLFwiemtiXCIsXCJ6a2RcIixcInprZ1wiLFwiemtoXCIsXCJ6a2tcIixcInprblwiLFwiemtvXCIsXCJ6a3BcIixcInprclwiLFwiemt0XCIsXCJ6a3VcIixcInprdlwiLFwiemt6XCIsXCJ6bGFcIixcInpsZVwiLFwiemxqXCIsXCJ6bG1cIixcInpsblwiLFwiemxxXCIsXCJ6bHNcIixcInpsd1wiLFwiem1hXCIsXCJ6bWJcIixcInptY1wiLFwiem1kXCIsXCJ6bWVcIixcInptZlwiLFwiem1nXCIsXCJ6bWhcIixcInptaVwiLFwiem1qXCIsXCJ6bWtcIixcInptbFwiLFwiem1tXCIsXCJ6bW5cIixcInptb1wiLFwiem1wXCIsXCJ6bXFcIixcInptclwiLFwiem1zXCIsXCJ6bXRcIixcInptdVwiLFwiem12XCIsXCJ6bXdcIixcInpteFwiLFwiem15XCIsXCJ6bXpcIixcInpuYVwiLFwiem5kXCIsXCJ6bmVcIixcInpuZ1wiLFwiem5rXCIsXCJ6bnNcIixcInpvY1wiLFwiem9oXCIsXCJ6b21cIixcInpvb1wiLFwiem9xXCIsXCJ6b3JcIixcInpvc1wiLFwienBhXCIsXCJ6cGJcIixcInpwY1wiLFwienBkXCIsXCJ6cGVcIixcInpwZlwiLFwienBnXCIsXCJ6cGhcIixcInpwaVwiLFwienBqXCIsXCJ6cGtcIixcInpwbFwiLFwienBtXCIsXCJ6cG5cIixcInpwb1wiLFwienBwXCIsXCJ6cHFcIixcInpwclwiLFwienBzXCIsXCJ6cHRcIixcInpwdVwiLFwienB2XCIsXCJ6cHdcIixcInpweFwiLFwienB5XCIsXCJ6cHpcIixcInpxZVwiLFwienJhXCIsXCJ6cmdcIixcInpyblwiLFwienJvXCIsXCJ6cnBcIixcInpyc1wiLFwienNhXCIsXCJ6c2tcIixcInpzbFwiLFwienNtXCIsXCJ6c3JcIixcInpzdVwiLFwienRlXCIsXCJ6dGdcIixcInp0bFwiLFwienRtXCIsXCJ6dG5cIixcInp0cFwiLFwienRxXCIsXCJ6dHNcIixcInp0dFwiLFwienR1XCIsXCJ6dHhcIixcInp0eVwiLFwienVhXCIsXCJ6dWhcIixcInp1bVwiLFwienVuXCIsXCJ6dXlcIixcInp3YVwiLFwienh4XCIsXCJ6eWJcIixcInp5Z1wiLFwienlqXCIsXCJ6eW5cIixcInp5cFwiLFwienphXCIsXCJ6empcIl1cbl07XG5cblxuZXhwb3J0IGNsYXNzIExhbmdVdGlsIHtcblxuICAgIC8qIERldGVybWluZSBpZiBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBCQ1AgNDcgc3RyaW5nICovXG4gICAgcHVibGljIHN0YXRpYyBpc0JjcDQ3KGxhbmdTdHI6IHN0cmluZykgOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIC9eKChbYS16QS1aXXsyLDN9KC1bYS16QS1aXSgtW2EtekEtWl17M30pezAsMn0pP3xbYS16QS1aXXs0fXxbYS16QS1aXXs1LDh9KSgtW2EtekEtWl17NH0pPygtKFthLXpBLVpdezJ9fFswLTldezN9KSk/KC0oWzAtOWEtekEtWl17NSw4fXxbMC05XVthLXpBLVpdezN9KSkqKC1bMC05YS13eS16QS1XWS1aXSgtW2EtekEtWjAtOV17Miw4fSkrKSooLXgoLVthLXpBLVowLTldezEsOH0pKyk/fHgoLVthLXpBLVowLTldezEsOH0pK3woZW4tR0Itb2VkfGktYW1pfGktYm5ufGktZGVmYXVsdHxpLWVub2NoaWFufGktaGFrfGkta2xpbmdvbnxpLWx1eHxpLW1pbmdvfGktbmF2YWpvfGktcHdufGktdGFvfGktdGF5fGktdHN1fHNnbi1CRS1GUnxzZ24tQkUtTkx8c2duLUNILURFfGFydC1sb2piYW58Y2VsLWdhdWxpc2h8bm8tYm9rfG5vLW55bnx6aC1ndW95dXx6aC1oYWtrYXx6aC1taW58emgtbWluLW5hbnx6aC14aWFuZykpJC8udGVzdChsYW5nU3RyKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHByaW1hcnkgPSBsYW5nU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChwcmltYXJ5LmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgcHJpbWFyeSA9IHByaW1hcnkuc3BsaXQoXCItXCIpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwcmltYXJ5Lm1hdGNoKC9bYS16XXsyLDN9LykpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBxYWEuLnF0elxuICAgICAgICBpZiAocHJpbWFyeS5sZW5ndGggPT09IDMgXG4gICAgICAgICAgICAmJiBwcmltYXJ5LmNoYXJBdCgwKSA9PT0gXCJxXCJcbiAgICAgICAgICAgICYmIHByaW1hcnkuY2hhckNvZGVBdCgxKSA+PSA5NyAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMSkgPD0gMTE2XG4gICAgICAgICAgICAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMikgPj0gOTcgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDIpIDw9IDEyMikge1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZFByaW1hcnlMYW5nc1twcmltYXJ5LmNoYXJDb2RlQXQoMCktOTddLmluY2x1ZGVzKHByaW1hcnkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbWF0Y2hQcmltYXJ5TGFuZyhsYW5nMTogc3RyaW5nLCBsYW5nMjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBwcmltYXJ5MSA9IGxhbmcxO1xuICAgICAgICBpZiAocHJpbWFyeTEuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICBwcmltYXJ5MSA9IHByaW1hcnkxLnNwbGl0KFwiLVwiKVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcmltYXJ5MiA9IGxhbmcyO1xuICAgICAgICBpZiAocHJpbWFyeTIuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICBwcmltYXJ5MiA9IHByaW1hcnkyLnNwbGl0KFwiLVwiKVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmltYXJ5MS50b0xvd2VyQ2FzZSgpID09PSBwcmltYXJ5Mi50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IElNYXBwZXIsIElNYXBSZXN1bHQsIEJvdW5kcyB9IGZyb20gXCIuLi9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbW1vbk1hcHBlciBpbXBsZW1lbnRzIElNYXBwZXIge1xuICAgIGFic3RyYWN0IGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmc7XG4gICAgYWJzdHJhY3QgZ2V0TmFtZXNwYWNlKCkgOiBzdHJpbmc7XG4gICAgYWJzdHJhY3QgZ2V0QXR0cmlidXRlcyhub2RlOiBOb2RlKSA6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfTtcblxuICAgIHByb3RlY3RlZCBoaWVyYXJjaHlSb2xlIDogc3RyaW5nW10gPSBudWxsO1xuICAgIHByb3RlY3RlZCBoaWVyYXJjaHlQYXRoOiBBcnJheTx7XG4gICAgICAgIHJvbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgW3JvbGU6IHN0cmluZ106IG51bWJlclxuICAgICAgICB9XG4gICAgfT4gPSBudWxsO1xuICAgIHByb3RlY3RlZCBoaWVyYXJjaHlSZXN1bHRzOiBJTWFwUmVzdWx0W10gPSBudWxsO1xuXG4gICAgZ2V0Qm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmVzZXQobm9kZTogTm9kZSkge1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUgPSBbXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aCA9IFt7XG4gICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgIHJvbGVDb3VudDoge31cbiAgICAgICAgfV07XG5cbiAgICAgICAgbGV0IGFuY2VzdG9ycyA6IE5vZGVbXSA9IFtdO1xuICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9IDkgLyogTm9kZS5ET0NVTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICBhbmNlc3RvcnMucHVzaChwYXJlbnQpO1xuICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMucmV2ZXJzZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGFuY2VzdG9ycykge1xuICAgICAgICAgICAgbGV0IHNpYmxpbmdzID0gW107XG4gICAgICAgICAgICBsZXQgc2libGluZyA9IGFuY2VzdG9yLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIHdoaWxlIChzaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaWJsaW5ncyA9IHNpYmxpbmdzLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2libGluZyBvZiBzaWJsaW5ncykge1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcEhpZXJhcmNoeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wdXNoSGllcmFyY2h5KGFuY2VzdG9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBwdXNoSGllcmFyY2h5KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgbGV0IHJvbGUgOiBzdHJpbmcgPSB0aGlzLmdldFJvbGUobm9kZSkgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlLnB1c2gocm9sZSk7XG4gICAgICAgIGlmIChyb2xlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50UGF0aEluZm8gPSB0aGlzLmhpZXJhcmNoeVBhdGhbdGhpcy5oaWVyYXJjaHlQYXRoLmxlbmd0aC0xXTtcbiAgICAgICAgICAgIHBhcmVudFBhdGhJbmZvLnJvbGVDb3VudFtyb2xlXSA9IChwYXJlbnRQYXRoSW5mby5yb2xlQ291bnRbcm9sZV0gfHwgMCkgKyAxOyBcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wdXNoKHtcbiAgICAgICAgICAgICAgICBcInJvbGVQYXRoXCI6IHBhcmVudFBhdGhJbmZvLnJvbGVQYXRoK1wiL1wiK3JvbGUrXCJbXCIrcGFyZW50UGF0aEluZm8ucm9sZUNvdW50W3JvbGVdK1wiXVwiLFxuICAgICAgICAgICAgICAgIFwicm9sZUNvdW50XCI6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhdHRyID0ge31cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZXMobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZTogdGhpcy5nZXROYW1lc3BhY2UoKSxcbiAgICAgICAgICAgIHJvbGU6IHJvbGUsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyLFxuICAgICAgICAgICAgcm9sZVBhdGg6IHRoaXMuaGllcmFyY2h5UGF0aFt0aGlzLmhpZXJhcmNoeVBhdGgubGVuZ3RoLTFdLnJvbGVQYXRoLFxuICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhub2RlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBwb3BIaWVyYXJjaHkoKSB7XG4gICAgICAgIGxldCByb2xlID0gdGhpcy5oaWVyYXJjaHlSb2xlLnBvcCgpO1xuICAgICAgICBpZiAocm9sZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cy5wb3AoKTtcbiAgICB9XG5cbiAgICBvcGVuU2NvcGUobm9kZTogTm9kZSk6IElNYXBSZXN1bHRbXSB7XG4gICAgICAgIGlmICh0aGlzLmhpZXJhcmNoeVJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wdXNoSGllcmFyY2h5KG5vZGUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGllcmFyY2h5UmVzdWx0cztcbiAgICB9XG5cbiAgICBjbG9zZVNjb3BlKG5vZGU6IE5vZGUpOiBJTWFwUmVzdWx0W10ge1xuICAgICAgICBsZXQgcmV0VmFsIDogSU1hcFJlc3VsdFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHRoaXMuaGllcmFyY2h5UmVzdWx0cykge1xuICAgICAgICAgICAgLy8gY29uc3QgdGVtcCA9IHJlcy5ub2RlO1xuICAgICAgICAgICAgLy8gcmVzLm5vZGUgPSBudWxsO1xuICAgICAgICAgICAgLy8gbGV0IGNsb25lZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzKSk7XG4gICAgICAgICAgICAvLyBjbG9uZWQubm9kZSA9IHJlcy5ub2RlID0gdGVtcDsgXG4gICAgICAgICAgICAvLyByZXRWYWwucHVzaChjbG9uZWQpO1xuICAgICAgICAgICAgcmV0VmFsLnB1c2gocmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlID0gXCIvXCIrcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZVxuICAgICAgICB0aGlzLnBvcEhpZXJhcmNoeSgpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgSU1hcFJlc3VsdCB9IGZyb20gXCIuLi9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lFbmdpbmVcIjtcblxuLy8gQ29udGV4dCB0aGF0IHdpbGwgY2F1c2UgdGhpcyBydWxlIHRvIGV4ZWN1dGUuIFxuLy8gQ29udGV4dCBzeW50YXg6XG4vLyAgIFRyaWdnZXJzOlxuLy8gICAgIGFyaWE6cm9sZSAtIFRyaWdnZXJzIG9uIGVsZW1lbnQgd2l0aCBBUklBIHJvbGUgcm9sZVxuLy8gICAgIGFyaWE6cm9sZVthdHRyaWJ1dGVdIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0aGUgZXF1aXZhbGVudCBsb2dpY2FsIFxuLy8gICAgICAgYXJpYS0gYXR0cmlidXRlIChlLmcuLCBidXR0b25bZGlzYWJsZWRdIHdpbGwgdHJpZ2dlciBvbiBcbi8vICAgICAgIDxidXR0b24gZGlzYWJsZWQ+IG9yIDxkaXYgcm9sZT1cImJ1dHRvblwiIGFyaWEtZGlzYWJsZWQ9XCJ0cnVlXCI+KVxuLy8gICAgIHJvbGVbYXR0cmlidXRlPXZhbHVlXSAtIFNpbWlsYXIgdG8gYWJvdmUsIHdpdGggY2FzZS1zZW5zaXRpdmUgbWF0Y2hcbi8vICAgICAgIHRvIHZhbHVlXG4vLyAgICAgcm9sZVthdHRyaWJ1dGV+dmFsdWVdIC0gU2ltaWxhciB0byBhYm92ZSwgd2l0aCBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoXG4vLyAgICAgZG9tOmVsZW1lbnQgLSBUcmlnZ2VycyBvbiBhbiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lXG4vLyAgICAgZG9tOmVsZW1lbnRbYXR0cmlidXRlXSAtIFRyaWdnZXJzIG9uIGEgZG9tIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuLy8gICAgIGRvbToqW2F0dHJpYnV0ZV0gLSBUcmlnZ2VycyBvbiBhbGwgZWxlbWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuLy8gICBDb21iaW5pbmcgdHJpZ2dlcnM6XG4vLyAgICAgdHJpZ2dlcjEgdHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGhpbiBhbiBcbi8vICAgICAgIGVsZW1lbnQgd2l0aCB0cmlnZ2VyMVxuLy8gICAgICF0cmlnZ2VyMSB0cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgbm90IHdpdGhpblxuLy8gICAgICAgZWxlbWVudCB3aXRoIHRyaWdnZXIxXG4vLyAgICAgdHJpZ2dlcjE+dHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGggYW5cbi8vICAgICAgIGFuIGltbWVkaWF0ZSBwYXJlbnQgd2l0aCB0cmlnZ2VyMVxuLy8gICAgIHRyaWdnZXIxK3RyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiB3aXRoIGFuXG4vLyAgICAgICBpbW1lZGlhdGUgcHJldmlvdXMgc2libGluZyB3aXRoIHRyaWdnZXIxXG4vLyAgICAgdHJpZ2dlcjF+dHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGggYW5cbi8vICAgICAgIHNvbWUgZWFybGllciBzaWJsaW5nIHdpdGggdHJpZ2dlcjFcbi8vICAgICBjb250ZXh0LGNvbnRleHQgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIGVpdGhlciBjb250ZXh0XG5leHBvcnQgY2xhc3MgQXR0ckluZm8ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaW5jbHVzaXZlOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgYXR0cjogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgZXE/OiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyB2YWx1ZT86IHN0cmluZ1xuICAgICkge1xuICAgICAgICBpZiAoIWluY2x1c2l2ZSBcbiAgICAgICAgICAgICAgICAmJiAoKHR5cGVvZiBlcSkgIT09IFwidW5kZWZpbmVkXCIgJiYgZXEubGVuZ3RoID4gMCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBoYXZlICFhdHRyXCIrZXErXCIgY29udGV4dFwiKTsgICAgXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1c2l2ZSAmJiAodHlwZW9mIGVxKSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlcS5sZW5ndGggPiAwICYmICgodHlwZW9mIHZhbHVlKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB2YWx1ZS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaGF2ZSBlcXVpdmFsZW5jZSBjaGVjayB3aXRob3V0IGEgdmFsdWVcIik7ICAgIFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG1hdGNoZXMoY29udGV4dDogSU1hcFJlc3VsdCkge1xuICAgICAgICBjb25zdCBydWxlQXR0clBhcnQgPSB0aGlzOyBcbiAgICAgICAgY29uc3QgZWxlbUF0dHJzID0gY29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoIShydWxlQXR0clBhcnQuYXR0ciBpbiBlbGVtQXR0cnMpKSB7XG4gICAgICAgICAgICByZXR1cm4gIXJ1bGVBdHRyUGFydC5pbmNsdXNpdmVcbiAgICAgICAgfSBlbHNlIGlmICghcnVsZUF0dHJQYXJ0LmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKCFydWxlQXR0clBhcnQuZXEpIHtcbiAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBtYXRjaCBhbmQgSSBoYXZlIHRoYXQgYXR0cmlidXRlIGFuZCBubyBlcXVpdmFsZW5jZSBkZWZpbmVkXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBtYXRjaCBhbmQgSSBoYXZlIHRoYXQgYXR0cmlidXRlIGFuZCBlcXVpdmFsZW5jZSBkZWZpbmVkXG4gICAgICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSBlbGVtQXR0cnNbcnVsZUF0dHJQYXJ0LmF0dHJdO1xuICAgICAgICAgICAgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZUF0dHJQYXJ0LnZhbHVlID09PSBhdHRyVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCIhPVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSAhPT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiflwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSA9PT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiIX5cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlQXR0clBhcnQudmFsdWUgIT09IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBlcXVpdmFsZW5jZSBvcGVyYXRvciBub3Qgc3VwcG9ydGVkXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYXJ0SW5mbyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpbmNsdXNpdmU6IGJvb2xlYW4sIFxuICAgICAgICBwdWJsaWMgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByb2xlOiBzdHJpbmcsIFxuICAgICAgICBwdWJsaWMgYXR0cnM6IEF0dHJJbmZvW10sIFxuICAgICAgICBwdWJsaWMgY29ubmVjdG9yOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcIipcIiAmJiAhaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiISogY29udGV4dCBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hlcyggXG4gICAgICAgIGNvbnRleHRIaWVyOiBSdWxlQ29udGV4dEhpZXJhcmNoeSxcbiAgICAgICAgaGllckxldmVsOiBudW1iZXIpIDogYm9vbGVhbiBcbiAgICB7XG4gICAgICAgIGNvbnN0IHJ1bGVQYXJ0ID0gdGhpcztcbiAgICAgICAgbGV0IHJ1bGVSb2xlTWF0Y2ggPSAocnVsZVBhcnQubmFtZXNwYWNlIGluIGNvbnRleHRIaWVyKSAmJiBjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF1cbiAgICAgICAgICAgICYmIChjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF0ucm9sZSA9PT0gcnVsZVBhcnQucm9sZVxuICAgICAgICAgICAgICAgIHx8IGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlICE9PSBcIm5vbmVcIiAmJiBydWxlUGFydC5yb2xlID09PSBcIipcIik7XG4gICAgICAgIGlmIChydWxlUm9sZU1hdGNoIFxuICAgICAgICAgICAgJiYgcnVsZVBhcnQucm9sZSA9PT0gXCIqXCIgXG4gICAgICAgICAgICAmJiBydWxlUGFydC5uYW1lc3BhY2UgPT09IFwiZG9tXCIgXG4gICAgICAgICAgICAmJiAoY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdLnJvbGUgPT09IFwiI3RleHRcIlxuICAgICAgICAgICAgICAgIHx8IGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlID09PSBcIi8jdGV4dFwiKSkge1xuICAgICAgICAgICAgcnVsZVJvbGVNYXRjaCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlUGFydC5pbmNsdXNpdmUgJiYgIXJ1bGVSb2xlTWF0Y2gpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFydWxlUGFydC5pbmNsdXNpdmUgJiYgIXJ1bGVSb2xlTWF0Y2gpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIE1hdGNoIHRoZSBhdHRyaWJ1dGVzXG4gICAgICAgIGNvbnN0IHJ1bGVBdHRycyA9IHJ1bGVQYXJ0LmF0dHJzO1xuICAgICAgICBjb25zdCBlbGVtQ29udGV4dCA9IGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXTtcbiAgICAgICAgbGV0IG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlQXR0clBhcnQgb2YgcnVsZUF0dHJzKSB7XG4gICAgICAgICAgICBtYXRjaCA9IG1hdGNoICYmIHJ1bGVBdHRyUGFydC5tYXRjaGVzKGVsZW1Db250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bGVQYXJ0LmluY2x1c2l2ZSkgbWF0Y2ggPSAhbWF0Y2g7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIENvbnRleHQge1xuICAgIGNvbnRleHRJbmZvIDogUGFydEluZm9bXSA9IFtdXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGNvbnRleHRIaWVyTWF0Y2hlcyA6IHN0cmluZ1tdID0gY29udGV4dC5tYXRjaCgvIT9bL2EtekEtWjowLTkqXFwtX10rKFxcW1teXFxdXStcXF0pKlsgPit+XT8vZyk7XG4gICAgICAgIGxldCByZXN1bHRzIDogUGFydEluZm9bXSA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBjb250ZXh0SGllck1hdGNoZXMpIHtcbiAgICAgICAgICAgIGxldCBwYXJ0cyA9IHBhcnQubWF0Y2goLyghPykoWy9hLXpBLVo6MC05KlxcLV9dKykoKFxcW1teXFxdXStcXF0pKikoWyA+K35dPykvKTtcbiAgICAgICAgICAgIGxldCBhdHRySW5mbyA6IEF0dHJJbmZvW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0clBhcnQgb2YgcGFydHNbM10ubWF0Y2goL1xcWyhbXlxcXV0rKVxcXS9nKSB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyUGFydHMgPSBhdHRyUGFydC5tYXRjaCgvXFxbKCE/KShbYS16OkEtWipcXC1fXSspKCE/Wz1+XSk/KFteXFxdXSspP1xcXS8pO1xuICAgICAgICAgICAgICAgIGF0dHJJbmZvLnB1c2gobmV3IEF0dHJJbmZvKFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbMV0gIT09IFwiIVwiLFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbMl0udG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzNdLFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbNF1cbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnRzWzJdID0gcGFydHNbMl0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IG5zUGFydHMgPSBwYXJ0c1syXS5zcGxpdChcIjpcIik7XG4gICAgICAgICAgICBsZXQgaW5jbCA9IHBhcnRzWzFdICE9PSBcIiFcIjtcbiAgICAgICAgICAgIGNvbnN0IG5zID0gbnNQYXJ0cy5zaGlmdCgpO1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBuc1BhcnRzLmpvaW4oXCI6XCIpO1xuICAgICAgICAgICAgbGV0IHBhcnRJbmZvID0gbmV3IFBhcnRJbmZvKGluY2wsIG5zLCByb2xlLCBhdHRySW5mbywgcGFydHNbcGFydHMubGVuZ3RoLTFdKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChwYXJ0SW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250ZXh0SW5mbyA9IHJlc3VsdHM7XG4gICAgfVxuXG4gICAgc3RhdGljIGNsZWFuQ29udGV4dChjb250ZXh0OiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyArIS9nLCBcIiAhXCIpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8gKyhbPit+LF0pL2csIFwiJDFcIik7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyhbPit+LF0pICsvZywgXCIkMVwiKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvICsvZywgXCIgXCIpO1xuICAgICAgICByZXR1cm4gY29udGV4dC50cmltKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGNvbnRleHQ6IHN0cmluZykge1xuICAgICAgICBsZXQgY29udGV4dHMgPSBDb250ZXh0LnNwbGl0TXVsdGlwbGUoQ29udGV4dC5jbGVhbkNvbnRleHQoY29udGV4dCkpO1xuXG4gICAgICAgIGxldCByZXRWYWwgOiBDb250ZXh0W10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgY3R4ID0gbmV3IENvbnRleHQoY29udGV4dHNbaV0pO1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goY3R4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaW5pdGlhbCBwcm9jZXNzaW5nIG9mIHNwbGl0dGluZyBvbiBjb21tYSAtIGNvbnRleHQsY29udGV4dFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFxuICAgICAqL1xuICAgIHN0YXRpYyBzcGxpdE11bHRpcGxlKGNvbnRleHQ6IHN0cmluZykgOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBjb250ZXh0cyA9IFtdO1xuICAgICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuaW5kZXhPZihcIixcIikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbnRleHQuc3BsaXQoXCIsXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0cztcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gXCIuLi9jb25maWcvQ29uZmlnXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBJc3N1ZSwgUnVsZSwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlUmVzdWx0LCBlUnVsZUNvbmZpZGVuY2UgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBIZWxwTWFwLCBJRW5naW5lLCBObHNNYXAgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lFbmdpbmVcIjtcbmltcG9ydCB7IElNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lNYXBwZXJcIjtcbmltcG9ydCB7IFJlcG9ydCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSVJlcG9ydFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL1Zpc1V0aWxcIjtcblxuY2xhc3MgV3JhcHBlZFJ1bGUge1xuICAgIG5zOiBzdHJpbmc7XG4gICAgaWR4PzogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IgKHB1YmxpYyBydWxlOiBSdWxlLCBwdWJsaWMgcGFyc2VkSW5mbyA6IENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5ucyA9IHRoaXMucGFyc2VkSW5mby5jb250ZXh0SW5mb1t0aGlzLnBhcnNlZEluZm8uY29udGV4dEluZm8ubGVuZ3RoLTFdLm5hbWVzcGFjZTtcbiAgICAgICAgQ29uZmlnLkRFQlVHICYmIGNvbnNvbGUubG9nKFwiQWRkZWQgUnVsZTpcIiwgcnVsZS5pZCwgSlNPTi5zdHJpbmdpZnkodGhpcy5wYXJzZWRJbmZvKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBjb252ZXJ0aW5nIHRoZSBub2RlIGludG8gYSBzbmlwcGV0IHdoaWNoIGNhbiBiZSBhZGRlZCB0byByZXBvcnQuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgbm9kZSBhbmQgZXh0cmFjdCB0aGUgbm9kZSBuYW1lIGFuZCB0aGUgYXR0cmlidXRlcyBhbmQgYnVpbGQgdGhlIHNuaXBwZXQgYmFzZWQgb24gdGhpcy5cbiAgICAgKlxuICAgICAqIFRPRE86IEZ1dHVyZSwgbWF5YmUgd2UgY2FuIGV4dHJhY3QgbW9yZSB0aGVuIGp1c3Qgc2luZ2xlIGxpbmUsIGFkZCBtb3JlIGluZm8gb3IgZXZlbiBhZGQgY2xvc2luZyB0YWdzIGV0Yy4uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBodG1sIGVsZW1lbnQgdG8gY29udmVydCBpbnRvIGVsZW1lbnQgc25pcHBldCB3aXRoIG5vZGUgbmFtZSBhbmQgYXR0cmlidXRlcyBvbmx5LlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBub2RlU25pcHBldCAtIHJldHVybiB0aGUgZWxlbWVudCBzbmlwcGV0IG9mIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkIHdoaWNoIG9ubHkgY29udGFpbnMsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVuYW1lIGFuZCBhdHRyaWJ1dGVzLiBpLmUuIDx0YWJsZSBpZD1cXFwibGF5b3V0X3RhYmxlMVxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiB0aGlzXG4gICAgICovXG4gICAgc3RhdGljIGNvbnZlcnROb2RlVG9TbmlwcGV0KG5vZGUgOiBFbGVtZW50KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIHZhciBub2RlU25pcHBldCA9ICcnO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGUgbmFtZSBhbmQgYWRkIGl0IHRvIHRoZSBub2RlIHNuaXBwZXRcbiAgICAgICAgbm9kZVNuaXBwZXQgKz0gJzwnICsgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgYWxsIHRoZSBub2RlIGF0dHJpYnV0ZXMgYXMgYW4gYXJyYXlcbiAgICAgICAgdmFyIG5vZGVBdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBhdHRyaWJ1dGVzIG9uIHRoaXMgbm9kZVxuICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXMgIT09IG51bGwgJiYgdHlwZW9mIG5vZGVBdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJykge1xuXG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZXNlcyBhdHRyaWJ1dGVzIGFuZCBhZGQgdGhlIG5hbWUgYW5kIHZhbHVlIHRvIHRoZSBub2RlU25pcHBldCB3aGljaCB3aWxsIGJlIHJldHVybmVkXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbm9kZUF0dHJpYnV0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXNbaV0ubmFtZSA9PT0gXCJkYXRhLW5hbWV3YWxrXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIHZhbHVlLlxuICAgICAgICAgICAgICAgIG5vZGVTbmlwcGV0ICs9ICcgJyArIG5vZGVBdHRyaWJ1dGVzW2ldLm5hbWUgKyAnPVwiJyArIG5vZGVBdHRyaWJ1dGVzW2ldLnZhbHVlICsgJ1wiJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsb3NlIHRoZSBub2RlXG4gICAgICAgIG5vZGVTbmlwcGV0ICs9ICc+JztcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIG5vZGUgc25pcHBldFxuICAgICAgICByZXR1cm4gbm9kZVNuaXBwZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyB0aGUgc291cmNlIGxvY2F0aW9uIGZvciBhIG5vZGUsIHdoaWNoIGNhbiBiZSBhZGRlZCB0byBhIHJlcG9ydC5cbiAgICAgKiBTdXBwb3J0cyBkZWJ1ZyBkaXJlY3RpdmVzIGluIHRoZSBmb2xsb3dpbmcgZm9ybXM6XG4gICAgICogICAxLiBBbiBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgaXRzZWxmOlxuICAgICAqICAgICAgICBpYm0tYTExeS1kZWJ1Zz1cImZpbGUudHM6MTA6NVwiXG4gICAgICogICAyLiBBIGNvbW1lbnQgbm9kZSBwcmVjZWRpbmcgdGhlIGVsZW1lbnQgKGFzIGEgc2libGluZyBvciBhbmNlc3RvciBzaWJsaW5nKTpcbiAgICAgKiAgICAgICAgPCEtLSBpYm0tYTExeS1kZWJ1ZzogZmlsZS50czoxMDo1IC0tPlxuICAgICAqICAgMy4gQSB3cmFwcGVyIGVsZW1lbnQgKGUuZy4gZGl2KSB3aG9zZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGlsZCBpcyBzdWNoIGEgY29tbWVudCBub2RlLlxuICAgICAqICAgNC4gQW4gYW5jZXN0b3IgZWxlbWVudCB0aGF0IGNhcnJpZXMgdGhlIGlibS1hMTF5LWRlYnVnIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIFRyYXZlcnNhbDogY2hlY2tzIHRoZSBub2RlIGl0c2VsZiBmb3IgYW4gaW5saW5lIGF0dHJpYnV0ZSwgdGhlbiBzY2FucyBwcmV2aW91cyBzaWJsaW5ncyBhdFxuICAgICAqIGVhY2ggYW5jZXN0b3IgbGV2ZWwgdXB3YXJkIChhbHNvIGNoZWNraW5nIGVhY2ggYW5jZXN0b3IgZWxlbWVudCdzIG93biBpbmxpbmUgYXR0cmlidXRlKSxcbiAgICAgKiBzdG9wcGluZyBpZiBhIGJsYW5rIG9yICdlbmQnIG1hcmtlciBpcyBmb3VuZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBET00gbm9kZSB0byBmaW5kIHNvdXJjZSBpbmZvIGZvclxuICAgICAqIEByZXR1cm4ge3N0cmluZyB8IG51bGx9IC0gVGhlIHNvdXJjZSBsb2NhdGlvbiBzdHJpbmcsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgdGhpc1xuICAgICAqL1xuICAgIHN0YXRpYyBjb252ZXJ0Tm9kZVRvU291cmNlKG5vZGU6IE5vZGUsIGVuYWJsZWQ6IGJvb2xlYW49ZmFsc2UpOiBzdHJpbmcge1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiU291cmNlIE1hcCBlbmFibGVkOlwiLCBlbmFibGVkKTtcbiAgICAgICAgaWYgKCFlbmFibGVkIHx8ICFub2RlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IERFQlVHX0RJUkVDVElWRSA9IFwiaWJtLWExMXktZGVidWdcIjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVHlwZWQgcmVzdWx0IGZyb20gZXh0cmFjdERpcmVjdGl2ZSB0byBhdm9pZCBzZW50aW5lbCBzdHJpbmcgY29sbGlzaW9ucy5cbiAgICAgICAgICogICB7IGZvdW5kOiBmYWxzZSB9ICAgICAgICAgICAg4oCUIG5vIGRpcmVjdGl2ZSBvbiB0aGlzIG5vZGVcbiAgICAgICAgICogICB7IGZvdW5kOiB0cnVlLCBzdG9wOiB0cnVlIH0g4oCUIGRpcmVjdGl2ZSBpcyBhIHNjb3BlLWVuZCBtYXJrZXIgKGJsYW5rIG9yICdlbmQnKVxuICAgICAgICAgKiAgIHsgZm91bmQ6IHRydWUsIHN0b3A6IGZhbHNlLCBzb3VyY2U6IHN0cmluZyB9IOKAlCB2YWxpZCBzb3VyY2UgbG9jYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHR5cGUgRGlyZWN0aXZlUmVzdWx0ID1cbiAgICAgICAgICAgIHwgeyBmb3VuZDogZmFsc2UgfVxuICAgICAgICAgICAgfCB7IGZvdW5kOiB0cnVlOyBzdG9wOiB0cnVlIH1cbiAgICAgICAgICAgIHwgeyBmb3VuZDogdHJ1ZTsgc3RvcDogZmFsc2U7IHNvdXJjZTogc3RyaW5nIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhcnNlcyBhIHNvdXJjZSBzdHJpbmcgaW50byBhIERpcmVjdGl2ZVJlc3VsdC5cbiAgICAgICAgICogVGhlIHNvdXJjZSBpcyB0aGUgZmluYWwgcmVzb2x2ZWQgdmFsdWUg4oCUIGFmdGVyIGFueSAnOicgc2VwYXJhdG9yIGhhcyBhbHJlYWR5IGJlZW4gc3RyaXBwZWQuXG4gICAgICAgICAqIEEgYmxhbmsgdmFsdWUgb3IgdGhlIGV4YWN0IHdvcmQgJ2VuZCcgKGNhc2UtaW5zZW5zaXRpdmUpIGlzIGEgc3RvcCBtYXJrZXIuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBwYXJzZVNvdXJjZSA9IGZ1bmN0aW9uIChzb3VyY2U6IHN0cmluZyk6IERpcmVjdGl2ZVJlc3VsdCB7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UudG9Mb3dlckNhc2UoKSA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBmb3VuZDogdHJ1ZSwgc3RvcDogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZm91bmQ6IHRydWUsIHN0b3A6IGZhbHNlLCBzb3VyY2UgfTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRXh0cmFjdHMgdGhlIGRlYnVnLWRpcmVjdGl2ZSBjb21tZW50IHZhbHVlIGZyb20gYSBub2RlLlxuICAgICAgICAgKiBIYW5kbGVzOlxuICAgICAgICAgKiAgIC0gQSBjb21tZW50IG5vZGUgZGlyZWN0bHlcbiAgICAgICAgICogICAtIEEgd3JhcHBlciBlbGVtZW50IChlLmcuIDxkaXY+KSB3aG9zZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGlsZCBpcyBhIGNvbW1lbnQgbm9kZVxuICAgICAgICAgKlxuICAgICAgICAgKiBSZXR1cm5zIHsgZm91bmQ6IHRydWUsIHN0b3A6IHRydWUgfSBpZiB0aGUgZGlyZWN0aXZlIGlzIGJsYW5rIG9yIGV4YWN0bHkgJ2VuZCcsXG4gICAgICAgICAqIHJldHVybnMgeyBmb3VuZDogdHJ1ZSwgc3RvcDogZmFsc2UsIHNvdXJjZSB9IGlmIGEgdmFsaWQgc291cmNlIGlzIGZvdW5kLFxuICAgICAgICAgKiBvciByZXR1cm5zIHsgZm91bmQ6IGZhbHNlIH0gaWYgbm8gZGlyZWN0aXZlIGlzIHByZXNlbnQgb24gdGhpcyBub2RlLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZXh0cmFjdERpcmVjdGl2ZSA9IGZ1bmN0aW9uIChlbGVtOiBOb2RlIHwgbnVsbCk6IERpcmVjdGl2ZVJlc3VsdCB7XG4gICAgICAgICAgICBpZiAoIWVsZW0pIHJldHVybiB7IGZvdW5kOiBmYWxzZSB9O1xuXG4gICAgICAgICAgICBsZXQgY29tbWVudFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgLy8gRGlyZWN0IGNvbW1lbnQgbm9kZVxuICAgICAgICAgICAgICAgIGNvbW1lbnRWYWx1ZSA9IGVsZW0ubm9kZVZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgd3JhcHBlciAoZS5nLiA8ZGl2PjwhLS0gaWJtLWExMXktZGVidWc6IC4uLiAtLT48L2Rpdj4pXG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hpbGQgbm9kZVxuICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IGVsZW0uZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBwdXJlIHdoaXRlc3BhY2UgdGV4dCBub2Rlc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVWYWx1ZSAmJiBjaGlsZC5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb24td2hpdGVzcGFjZSB0ZXh0IGJlZm9yZSBhIGNvbW1lbnQg4oCUIG5vdCBhIGRpcmVjdGl2ZSB3cmFwcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50VmFsdWUgPSBjaGlsZC5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFueSBvdGhlciBub2RlIHR5cGUgYmVmb3JlIGEgY29tbWVudCDigJQgbm90IGEgZGlyZWN0aXZlIHdyYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29tbWVudFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IGNvbW1lbnRWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgLy8gTWF0Y2ggZXhhY3RseSBcImlibS1hMTF5LWRlYnVnXCIgZm9sbG93ZWQgYnkgZW5kLW9mLXN0cmluZywgd2hpdGVzcGFjZSwgb3IgJzonXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBcImlibS1hMTF5LWRlYnVnLWV4dHJhXCIgZnJvbSBiZWluZyB0cmVhdGVkIGFzIGEgZGlyZWN0aXZlLlxuICAgICAgICAgICAgICAgIGlmICh0cmltbWVkID09PSBERUJVR19ESVJFQ1RJVkUgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5zdGFydHNXaXRoKERFQlVHX0RJUkVDVElWRSArICc6JykgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5zdGFydHNXaXRoKERFQlVHX0RJUkVDVElWRSArICcgJykgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5zdGFydHNXaXRoKERFQlVHX0RJUkVDVElWRSArICdcXHQnKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdHJpcCB0aGUgZGlyZWN0aXZlIG5hbWUgYW5kIG9wdGlvbmFsIGxlYWRpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZnRlckRpcmVjdGl2ZSA9IHRyaW1tZWQuc3Vic3RyaW5nKERFQlVHX0RJUkVDVElWRS5sZW5ndGgpLnRyaW1TdGFydCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTdHJpcCBhIHNpbmdsZSBsZWFkaW5nICc6JyBzZXBhcmF0b3IgaWYgcHJlc2VudFxuICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBcImlibS1hMTF5LWRlYnVnOiBmaWxlLnRzOjEwOjVcIiDihpIgYWZ0ZXJEaXJlY3RpdmUgPSBcIjogZmlsZS50czoxMDo1XCIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGFmdGVyRGlyZWN0aXZlLnN0YXJ0c1dpdGgoJzonKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhZnRlckRpcmVjdGl2ZS5zdWJzdHJpbmcoMSkudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFmdGVyRGlyZWN0aXZlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlU291cmNlKHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geyBmb3VuZDogZmFsc2UgfTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgaWJtLWExMXktZGVidWcgYXR0cmlidXRlIHZhbHVlIGZyb20gYW4gZWxlbWVudCBub2RlIGFzIGEgRGlyZWN0aXZlUmVzdWx0LFxuICAgICAgICAgKiBvciB7IGZvdW5kOiBmYWxzZSB9IGlmIGFic2VudC4gUmVjb2duaXNlcyB0aGUgJ2VuZCcgc3RvcCBtYXJrZXIganVzdCBsaWtlIGNvbW1lbnQgZGlyZWN0aXZlcy5cbiAgICAgICAgICogVGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyB0aGUgc291cmNlIGRpcmVjdGx5IChubyAnOicgcHJlZml4KSwgZS5nLiBpYm0tYTExeS1kZWJ1Zz1cImZpbGUudHM6MTA6NVwiLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZ2V0SW5saW5lQXR0ciA9IGZ1bmN0aW9uIChuOiBOb2RlKTogRGlyZWN0aXZlUmVzdWx0IHtcbiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgcmV0dXJuIHsgZm91bmQ6IGZhbHNlIH07XG4gICAgICAgICAgICBjb25zdCB2YWwgPSAobiBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoREVCVUdfRElSRUNUSVZFKTtcbiAgICAgICAgICAgIGlmICh2YWwgPT09IG51bGwpIHJldHVybiB7IGZvdW5kOiBmYWxzZSB9O1xuICAgICAgICAgICAgLy8gQXR0cmlidXRlIHZhbHVlIGlzIHRoZSBzb3VyY2UgZGlyZWN0bHkg4oCUIG5vICc6JyBzZXBhcmF0b3IgdG8gc3RyaXBcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVNvdXJjZSh2YWwudHJpbSgpKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVHJhdmVyc2VzIGxlZnQgKHByZXZpb3VzIHNpYmxpbmdzKSB0aGVuIHVwd2FyZCAocGFyZW50KSB0byBmaW5kIHNvdXJjZSBpbmZvLlxuICAgICAgICAgKiBEb2VzIE5PVCBjaGVjayB0aGUgc3RhcnRpbmcgZWxlbWVudCBpdHNlbGYg4oCUIG9ubHkgaXRzIHByZWNlZGluZyBzaWJsaW5ncyBhbmQgYW5jZXN0b3JzLlxuICAgICAgICAgKiBUaGlzIGF2b2lkcyBtaXNpZGVudGlmeWluZyBhIGNvbnRlbnQgbm9kZSBhcyBpdHMgb3duIHNvdXJjZSBkaXJlY3RpdmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEF0IGVhY2ggYW5jZXN0b3IgbGV2ZWwgdGhlIGZ1bmN0aW9uIGFsc28gY2hlY2tzIHRoZSBhbmNlc3RvciBlbGVtZW50J3Mgb3duIGlubGluZVxuICAgICAgICAgKiBpYm0tYTExeS1kZWJ1ZyBhdHRyaWJ1dGUsIHNvIHRoYXQgYSBwYXJlbnQgZWxlbWVudCBjYW4gYW5ub3RhdGUgYWxsIGl0cyBkZXNjZW5kYW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogU2libGluZyBzY2FubmluZyBzdG9wcyBhdCB0aGUgZmlyc3Qgbm9kZSB0aGF0IGlzIHJlY29nbmlzZWQgYXMgYSBkaXJlY3RpdmUgKGZvdW5kIG9yIHN0b3ApLlxuICAgICAgICAgKiBOb24tZGlyZWN0aXZlIG5vZGVzIChyZWFsIGNvbnRlbnQgZWxlbWVudHMsIHRleHQgbm9kZXMpIGFyZSBza2lwcGVkIHNvIHRoYXQgYSBkaXJlY3RpdmVcbiAgICAgICAgICogcGxhY2VkIGZ1cnRoZXIgYmFjayBpbiB0aGUgc2libGluZyBsaXN0IGlzIHN0aWxsIGZvdW5kIGV2ZW4gaWYgY29udGVudCBub2RlcyBpbnRlcnZlbmUuXG4gICAgICAgICAqIEhvd2V2ZXIsIHRyYXZlcnNhbCBkb2VzIE5PVCBjcm9zcyBlbGVtZW50IGJvdW5kYXJpZXMgd2hlbiBzY2FubmluZyBzaWJsaW5ncyDigJQgb25seVxuICAgICAgICAgKiBjb21tZW50IG5vZGVzIGFuZCBkZWRpY2F0ZWQgd3JhcHBlciBlbGVtZW50cyAod2hvc2Ugc29sZSBmaXJzdCBjaGlsZCBpcyBhIGNvbW1lbnQpIGFyZVxuICAgICAgICAgKiB0cmVhdGVkIGFzIHRyYW5zcGFyZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBTaGFkb3cgRE9NIHRyYXZlcnNhbDogdXNlcyBET01XYWxrZXIucGFyZW50Tm9kZSgpIHRvIGNyb3NzIHNoYWRvdyBib3VuZGFyaWVzIGNvcnJlY3RseSxcbiAgICAgICAgICogaW5jbHVkaW5nIHNsb3R0ZWQgY29udGVudCBhbmQgbmVzdGVkIFNoYWRvdyBET00gKHNoYWRvdy1pbi1zaGFkb3cpLiBXaGVuIHRoZSBwYXJlbnRcbiAgICAgICAgICogY2hhaW4gcmVhY2hlcyBhIFNoYWRvd1Jvb3QsIERPTVdhbGtlci5wYXJlbnROb2RlKCkgYXV0b21hdGljYWxseSByZXNvbHZlcyBpdCB0byB0aGVcbiAgICAgICAgICogc2hhZG93IGhvc3QgZWxlbWVudCBpbiB0aGUgb3V0ZXIgRE9NLiBBIHBsYWluIERvY3VtZW50RnJhZ21lbnQgd2l0aCBubyBob3N0IHJldHVybnNcbiAgICAgICAgICogbnVsbCBmcm9tIERPTVdhbGtlci5wYXJlbnROb2RlKCksIHN0b3BwaW5nIHRyYXZlcnNhbC5cbiAgICAgICAgICpcbiAgICAgICAgICogU2libGluZyB0cmF2ZXJzYWwgdXNlcyBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QoKSB0byBza2lwIG5vZGVzIHRoYXRcbiAgICAgICAgICogYXJlIGFzc2lnbmVkIHRvIHNsb3RzIChhbmQgdGhlcmVmb3JlIGxvZ2ljYWxseSBiZWxvbmcgdG8gYSBkaWZmZXJlbnQgcGFydCBvZiB0aGUgdHJlZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFVzZXMgYW4gaXRlcmF0aXZlIGFwcHJvYWNoIChyYXRoZXIgdGhhbiByZWN1cnNpb24pIHRvIHNhZmVseSBoYW5kbGUgZGVlcGx5IG5lc3RlZFxuICAgICAgICAgKiBET00gc3RydWN0dXJlcyB3aXRob3V0IHJpc2sgb2Ygc3RhY2sgb3ZlcmZsb3cuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbGVtIC0gVGhlIG5vZGUgd2hvc2UgY29udGV4dCB3ZSBhcmUgc2VhcmNoaW5nXG4gICAgICAgICAqIEByZXR1cm5zIFRoZSBzb3VyY2UgbG9jYXRpb24gc3RyaW5nLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZmluZFNvdXJjZSA9IGZ1bmN0aW9uIChlbGVtOiBOb2RlIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBlbGVtO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBTY2FuIHByZXZpb3VzIHNpYmxpbmdzIGZvciBhIGRlYnVnIGRpcmVjdGl2ZSBjb21tZW50IG9yIHdyYXBwZXIgZWxlbWVudC5cbiAgICAgICAgICAgICAgICAvLyBVc2UgcHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QgdG8gc2tpcCBub2RlcyBhc3NpZ25lZCB0byBzbG90cywgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyBsb2dpY2FsbHkgYmVsb25nIHRvIGEgZGlmZmVyZW50IHBhcnQgb2YgdGhlIGNvbXBvc2VkIHRyZWUuXG4gICAgICAgICAgICAgICAgLy8gT25seSBjb21tZW50IG5vZGVzIGFuZCBkZWRpY2F0ZWQgd3JhcHBlciBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCBkaXJlY3RpdmVzO1xuICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciBub2RlIHR5cGVzIGFyZSBza2lwcGVkICh0aGV5IGRvIG5vdCBibG9jayBmdXJ0aGVyIHNjYW5uaW5nKS5cbiAgICAgICAgICAgICAgICBsZXQgcHJldiA9IERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJldikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBleHRyYWN0RGlyZWN0aXZlKHByZXYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0b3ApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgYXMgeyBmb3VuZDogdHJ1ZTsgc3RvcDogZmFsc2U7IHNvdXJjZTogc3RyaW5nIH0pLnNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHByZXYpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5vIGRpcmVjdGl2ZSBmb3VuZCBhbW9uZyBzaWJsaW5ncyDigJQgbW92ZSB1cCB0byBwYXJlbnQuXG4gICAgICAgICAgICAgICAgLy8gVXNlIERPTVdhbGtlci5wYXJlbnROb2RlKCkgaW5zdGVhZCBvZiBub2RlLnBhcmVudE5vZGUgZGlyZWN0bHkgc28gdGhhdDpcbiAgICAgICAgICAgICAgICAvLyAgIDEuIFNoYWRvdyBET00gYm91bmRhcmllcyBhcmUgY3Jvc3NlZCBhdXRvbWF0aWNhbGx5IChTaGFkb3dSb290IOKGkiBob3N0IGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgIC8vICAgICAgc3VwcG9ydGluZyBib3RoIHJlZ3VsYXIgYW5kIG5lc3RlZCBTaGFkb3cgRE9NIChzaGFkb3ctaW4tc2hhZG93KS5cbiAgICAgICAgICAgICAgICAvLyAgIDIuIFNsb3R0ZWQgbm9kZXMgYXJlIHJlLXBhcmVudGVkIHRvIHRoZWlyIHNsb3Qgb3duZXIgcmF0aGVyIHRoYW4gdGhlaXJcbiAgICAgICAgICAgICAgICAvLyAgICAgIGxpZ2h0LURPTSBwYXJlbnQsIG1hdGNoaW5nIHRoZSBjb21wb3NlZCAocmVuZGVyZWQpIHRyZWUgc3RydWN0dXJlLlxuICAgICAgICAgICAgICAgIC8vICAgMy4gTm9kZXMgd2l0aCBhbiBvd25lckVsZW1lbnQgKGUuZy4gaWZyYW1lIGRvY3VtZW50IHJvb3RzKSBhcmUgcmUtcGFyZW50ZWRcbiAgICAgICAgICAgICAgICAvLyAgICAgIHRvIHRoZWlyIG93bmVyIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoY3VycmVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZWFjaGVkIHRoZSB0b3Agb2YgdGhlIHRyZWUgKG9yIGEgcGxhaW4gRG9jdW1lbnRGcmFnbWVudCB3aXRoIG5vIGhvc3QpXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZmluZGluZyBhIGRpcmVjdGl2ZS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHBhcmVudCBlbGVtZW50J3Mgb3duIGlubGluZSBhdHRyaWJ1dGUgYmVmb3JlIGNvbnRpbnVpbmcgdXB3YXJkLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIGEgY29udGFpbmluZyBlbGVtZW50IHRvIGFubm90YXRlIGFsbCBpdHMgZGVzY2VuZGFudHMuXG4gICAgICAgICAgICAgICAgLy8gQW4gJ2VuZCcgaW5saW5lIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHN0b3BzIHRyYXZlcnNhbCBlbnRpcmVseS5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRBdHRyUmVzdWx0ID0gZ2V0SW5saW5lQXR0cihwYXJlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRBdHRyUmVzdWx0LmZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRBdHRyUmVzdWx0LnN0b3ApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHBhcmVudEF0dHJSZXN1bHQgYXMgeyBmb3VuZDogdHJ1ZTsgc3RvcDogZmFsc2U7IHNvdXJjZTogc3RyaW5nIH0pLnNvdXJjZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRmlyc3QsIGNoZWNrIGZvciBhbiBpbmxpbmUgYXR0cmlidXRlIGRpcmVjdGl2ZSBvbiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gICAgICAgIC8vIEFuICdlbmQnIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCBpdHNlbGYgc3RvcHMgdHJhdmVyc2FsIChyZXR1cm5zIG51bGwpLlxuICAgICAgICBjb25zdCBzZWxmQXR0clJlc3VsdCA9IGdldElubGluZUF0dHIobm9kZSk7XG4gICAgICAgIGlmIChzZWxmQXR0clJlc3VsdC5mb3VuZCkge1xuICAgICAgICAgICAgaWYgKHNlbGZBdHRyUmVzdWx0LnN0b3ApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIChzZWxmQXR0clJlc3VsdCBhcyB7IGZvdW5kOiB0cnVlOyBzdG9wOiBmYWxzZTsgc291cmNlOiBzdHJpbmcgfSkuc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlbiB0cmF2ZXJzZSB0aGUgRE9NIHRvIGZpbmQgYSBwcmVjZWRpbmcgY29tbWVudCBkaXJlY3RpdmUgb3IgYW5jZXN0b3IgYXR0cmlidXRlXG4gICAgICAgIHJldHVybiBmaW5kU291cmNlKG5vZGUpO1xuICAgIH1cblxuICAgIHJ1bihlbmdpbmU6IEVuZ2luZSwgY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogSXNzdWVbXSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBsZXQgcmVzdWx0czogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdHMgPSB0aGlzLnJ1bGUucnVuKGNvbnRleHQsIG9wdGlvbnMsIGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycjogRXJyb3IgPSBlO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlJVTEUgRVhDRVBUSU9OOlwiLHRoaXMucnVsZS5pZCwgY29udGV4dC5kb20ucm9sZVBhdGgsIGVyci5zdGFjayk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgaWYgKCFyZXN1bHRzKSByZXN1bHRzID0gW107XG5cbiAgICAgICAgaWYgKCEocmVzdWx0cyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IFtyZXN1bHRzXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VmFsIDogSXNzdWVbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZW5naW5lLmdldE1lc3NhZ2UodGhpcy5ydWxlLmlkLCByZXN1bHQucmVhc29uSWQsIHJlc3VsdC5tZXNzYWdlQXJncyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5zIGluIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBwYXRoW25zXSA9IGNvbnRleHRbbnNdLnJvbGVQYXRoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBydWxlSWQgPSB0aGlzLnJ1bGUuaWQucmVwbGFjZSgvXiguKilcXCRcXCRcXGQrJC8sIFwiJDFcIik7XG5cbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICBydWxlSWQ6IHJ1bGVJZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIG5vZGU6IGNvbnRleHRbXCJkb21cIl0ubm9kZSxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgICAgIHJ1bGVUaW1lOiBlbmRUaW1lLXN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICByZWFzb25JZDogcmVzdWx0LnJlYXNvbklkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUFyZ3M6IHJlc3VsdC5tZXNzYWdlQXJncyxcbiAgICAgICAgICAgICAgICBhcGlBcmdzOiByZXN1bHQuYXBpQXJncyxcbiAgICAgICAgICAgICAgICBib3VuZHM6IGNvbnRleHRbXCJkb21cIl0uYm91bmRzLFxuICAgICAgICAgICAgICAgIHNuaXBwZXQ6IFdyYXBwZWRSdWxlLmNvbnZlcnROb2RlVG9TbmlwcGV0KGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50KSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IFdyYXBwZWRSdWxlLmNvbnZlcnROb2RlVG9Tb3VyY2UoY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQsIGVuZ2luZS5pc1NvdXJjZU1hcEVuYWJsZWQoKSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmdpbmUgaW1wbGVtZW50cyBJRW5naW5lIHtcbiAgICBwdWJsaWMgc3RhdGljIGdldExhbmd1YWdlcygpIHtcbiAgICAgICAgY29uc3QgZW52ID0gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIChwcm9jZXNzIGFzIGFueSkubm9kZVR5cGUgPT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY7XG4gICAgICAgIC8vIElmIGFsbCBlbHNlIGZhaWxzLCBkZWZhdWx0IHRvIFVTIEVuZ2xpc2hcbiAgICAgICAgbGV0IG5vZGVMYW5nID0gXCJlbi1VU1wiO1xuICAgICAgICBpZiAoZW52KSB7XG4gICAgICAgICAgICBub2RlTGFuZyA9IGVudi5MQU5HIHx8IGVudi5MQU5HVUFHRSB8fCBlbnYuTENfQUxMIHx8IGVudi5MQ19NRVNTQUdFUztcbiAgICAgICAgICAgIGlmIChub2RlTGFuZyAmJiBub2RlTGFuZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZUxhbmcgPSBub2RlTGFuZy5zcGxpdChcIi5cIilbMF0ucmVwbGFjZSgvXy9nLFwiLVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZUxhbmcgPSBcImVuLVVTXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcyB8fCBbbm9kZUxhbmddO1xuICAgIH1cbiAgICBtYXBwZXJzIDogeyBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcHBlciB9ID0ge307XG4gICAgcnVsZU1hcCA6IHsgW2lkOiBzdHJpbmddOiBSdWxlIH0gPSB7fTtcbiAgICB3cmFwcGVkUnVsZU1hcCA6IHsgW2lkOiBzdHJpbmddOiBXcmFwcGVkUnVsZSB9ID0ge307XG4gICAgbmxzTWFwIDogTmxzTWFwID0ge31cbiAgICBoZWxwTWFwIDogSGVscE1hcCA9IHt9XG4gICAgc291cmNlTWFwRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBpbmNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgcHJpdmF0ZSBleGNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIE5lZWQgYSBET00gTWFwcGVyIGFzIGEgbWluaW11bVxuICAgICAgICB0aGlzLmFkZE1hcHBlcihuZXcgRE9NTWFwcGVyKCkpO1xuICAgIH1cblxuICAgIHJ1bihyb290OiBEb2N1bWVudCB8IE5vZGUsIG9wdGlvbnM/OiB7fSk6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJudWxsIGRvY3VtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb290Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcm9vdCA9IChyb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5vd25lckRvY3VtZW50ICYmICgocm9vdC5vd25lckRvY3VtZW50IGFzIGFueSkuUFRfQ0hFQ0tfSElEREVOX0NPTlRFTlQgPSBmYWxzZSk7XG4gICAgICAgIGNvbnN0IG51bU5vZGVzVmlzaXRlZCA9IENhY2hlVXRpbC5jbGVhckNhY2hlcyhyb290KTtcbiAgICAgICAgY29uc3Qgd2Fsa2VyID0gbmV3IERPTVdhbGtlcihyb290LCBmYWxzZSwgcm9vdCwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHJldFZhbCA6IFJlcG9ydCA9IHtcbiAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgbnVtRXhlY3V0ZWQ6IDAsXG4gICAgICAgICAgICBydWxlVGltZTogMCxcbiAgICAgICAgICAgIHRvdGFsVGltZTogMFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7ICAgICAgICBcbiAgICAgICAgLy8gUmVzZXQgdGhlIHJvbGUgbWFwcGVyc1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWVzcGFjZSBpbiB0aGlzLm1hcHBlcnMpIHtcbiAgICAgICAgICAgIHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLnJlc2V0KHJvb3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29udGV4dCBkZXRlY3RvclxuICAgICAgICBsZXQgY3VycmVudE5vZGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBsYXN0UmVwb3J0ZWRQZXJjZW50ID0gLTE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlQ291bnQrKztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gUmVwb3J0IHByb2dyZXNzIGF0IGVhY2ggcGVyY2VudGFnZSBtaWxlc3RvbmVcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQZXJjZW50ID0gTWF0aC5mbG9vcigoY3VycmVudE5vZGVDb3VudCAvIG51bU5vZGVzVmlzaXRlZCkgKiAxMDApO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQZXJjZW50ID4gbGFzdFJlcG9ydGVkUGVyY2VudCkge1xuICAgICAgICAgICAgICAgIGlmIChudW1Ob2Rlc1Zpc2l0ZWQgPiAxMDAwMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoY3VycmVudFBlcmNlbnQgPiA2KSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFByb2dyZXNzOiAke2N1cnJlbnRQZXJjZW50fSUgKCR7Y3VycmVudE5vZGVDb3VudH0vJHtudW1Ob2Rlc1Zpc2l0ZWR9IG5vZGVzKWApO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBydWxlVGltZXMgPSByZXRWYWwucmVzdWx0cy5yZWR1Y2UoKHByZXYsIGN1cikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgcHJldltjdXIucnVsZUlkXSA9IChwcmV2W2N1ci5ydWxlSWRdIHx8IDApK2N1ci5ydWxlVGltZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgICAgICAgICAvLyB9LCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciAoY29uc3QgcnVsZUlkIGluIHJ1bGVUaW1lcykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWYgKHJ1bGVUaW1lc1tydWxlSWRdID4gMTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhgJHtydWxlSWR9OiAke3J1bGVUaW1lc1tydWxlSWRdfWApO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFzdFJlcG9ydGVkUGVyY2VudCA9IGN1cnJlbnRQZXJjZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IHRoZSBjb250ZXh0IGluZm9ybWF0aW9uIGZyb20gdGhlIHJ1bGUgbWFwcGVyc1xuICAgICAgICAgICAgY29uc3QgY29udGV4dEhpZXJhcmNoaWVzIDogUnVsZUNvbnRleHRIaWVyYXJjaHkgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIGluIHRoaXMubWFwcGVycykge1xuICAgICAgICAgICAgICAgIGlmICghd2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dEhpZXJhcmNoaWVzW25hbWVzcGFjZV0gPSB0aGlzLm1hcHBlcnNbbmFtZXNwYWNlXS5vcGVuU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmFtZXNwYWNlID09PSBcImRvbVwiICYmIHdhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBlbGVtID0gd2Fsa2VyLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIChpZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHJvb3Qub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkgPT09IGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGV4dEhpZXJhcmNoaWVzW1wiZG9tXCJdW2NvbnRleHRIaWVyYXJjaGllc1tcImRvbVwiXS5sZW5ndGgtMV0ucm9sZVBhdGggPSBcIi8vKltAaWQ9J1wiK2lkK1wiJ11cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0SGllcmFyY2hpZXNbbmFtZXNwYWNlXSA9IHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLmNsb3NlU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHdhbGtlci5ub2RlLm5vZGVUeXBlICE9PSAxMSBcbiAgICAgICAgICAgICAgICAmJiAoVmlzVXRpbC5pc05vZGVWaXNpYmxlKHdhbGtlci5ub2RlKVxuICAgICAgICAgICAgICAgICAgICAvLyB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImhlYWRcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcIm1ldGFcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgd2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicGFyYW1cIlxuICAgICAgICAgICAgICAgICAgICB8fCAhRE9NVXRpbC5nZXRBbmNlc3Rvcih3YWxrZXIubm9kZSwgW1wiYm9keVwiXSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGV4dCA6IFJ1bGVDb250ZXh0ID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBucyBpbiBjb250ZXh0SGllcmFyY2hpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnNIaWVyID0gY29udGV4dEhpZXJhcmNoaWVzW25zXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdEhpZXIgPSBuc0hpZXJbbnNIaWVyLmxlbmd0aC0xXTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFtuc10gPSBsYXN0SGllcjsgXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoaW5nUnVsZXMgPSB0aGlzLmdldE1hdGNoaW5nUnVsZXMoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwTWF0Y2ggPSB7fVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2hpbmdSdWxlIG9mIG1hdGNoaW5nUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZ1bGZpbGxzRGVwZW5kZW5jaWVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgbWF0Y2hpbmdSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcE1hdGNoW2RlcF0pIGZ1bGZpbGxzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGZpbGxzRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA6IElzc3VlW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbWF0Y2hpbmdSdWxlLnJ1bih0aGlzLCBjb250ZXh0LCBvcHRpb25zLCBjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcHBlciBzaG93cyBlcnJvciBpbiBjb25zb2xlLiBTa2lwIHRoaXMgcnVsZSBhcyBOL0FcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGtpbGwgdGhlIGVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb3V0IG9mIHNjb3BlLCBpdCBmdWxmaWxscyB0aGUgZGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwTWF0Y2hbbWF0Y2hpbmdSdWxlLnJ1bGUuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnJ1bGVUaW1lICs9IHJlc3VsdC5ydWxlVGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwubnVtRXhlY3V0ZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnZhbHVlWzFdID09PSBlUnVsZUNvbmZpZGVuY2UuUEFTUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBNYXRjaFtyZXN1bHQucnVsZUlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSk7XG4gICAgICAgIENhY2hlVXRpbC5jbGVhckNhY2hlcyhyb290KTtcbiAgICAgICAgcmV0VmFsLnRvdGFsVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLXN0YXJ0O1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldFZhbCk7XG4gICAgfVxuXG4gICAgZW5hYmxlUnVsZXMocnVsZUlkczogc3RyaW5nW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bGVNYXBbcnVsZUlkXS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBydWxlSWQgb2YgcnVsZUlkcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZU1hcCkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJXQVJOSU5HOiBSdWxlIElkXCIscnVsZUlkLFwiY291bGQgbm90IGJlIGVuYWJsZWQuXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bGVNYXBbcnVsZUlkXS5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFJ1bGUocnVsZUlkOiBzdHJpbmcpOiBSdWxlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVsZU1hcFtydWxlSWRdO1xuICAgIH1cblxuICAgIGdldFJ1bGVzSWRzKCkgOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChydWxlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgYWRkUnVsZXMocnVsZXM6IFJ1bGVbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUnVsZShydWxlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb3J0UnVsZXMoKTtcbiAgICB9XG5cbiAgICBhZGRSdWxlKHJ1bGU6IFJ1bGUsIHNraXBTb3J0PzogYm9vbGVhbikge1xuICAgICAgICBsZXQgY3R4cyA6Q29udGV4dFtdID0gQ29udGV4dC5wYXJzZShydWxlLmNvbnRleHQpO1xuICAgICAgICBsZXQgaWR4ID0gMDtcbiAgICAgICAgY29uc3QgcnVsZUlkID0gcnVsZS5pZDtcbiAgICAgICAgaWYgKHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiV0FSTklORzogUnVsZVwiLHJ1bGVJZCxcImFscmVhZHkgYWRkZWQgdG8gZW5naW5lLiBJZ25vcmluZy4uLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJ1bGVNYXBbcnVsZUlkXSA9IHJ1bGU7XG4gICAgICAgIGZvciAoY29uc3QgY3R4IG9mIGN0eHMpIHtcbiAgICAgICAgICAgIGxldCB3cmFwSWQgPSBydWxlSWQ7XG4gICAgICAgICAgICBpZiAoaWR4ID49IDEpIHtcbiAgICAgICAgICAgICAgICB3cmFwSWQgPSBydWxlSWQrXCIkJFwiK2lkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICsraWR4O1xuICAgICAgICAgICAgbGV0IHdyYXBwZWRSdWxlID0gbmV3IFdyYXBwZWRSdWxlKHJ1bGUsY3R4KTtcbiAgICAgICAgICAgIHRoaXMud3JhcHBlZFJ1bGVNYXBbd3JhcElkXSA9IHdyYXBwZWRSdWxlO1xuICAgICAgICAgICAgbGV0IHBhcnRzID0gd3JhcHBlZFJ1bGUucGFyc2VkSW5mby5jb250ZXh0SW5mbztcbiAgICAgICAgICAgIGxldCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTtcbiAgICAgICAgICAgIGxldCB0cmlnZ2VyUm9sZSA9IGxhc3RQYXJ0Lm5hbWVzcGFjZStcIjpcIitsYXN0UGFydC5yb2xlO1xuICAgICAgICAgICAgaWYgKGxhc3RQYXJ0LmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXSA9IHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXSB8fCBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmluY2xSdWxlc1t0cmlnZ2VyUm9sZV0ucHVzaCh3cmFwcGVkUnVsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXSA9IHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXSB8fCBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmV4Y2xSdWxlc1t0cmlnZ2VyUm9sZV0ucHVzaCh3cmFwcGVkUnVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFza2lwU29ydCkge1xuICAgICAgICAgICAgdGhpcy5fc29ydFJ1bGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlbmFibGVTb3VyY2VNYXAoZW5hYmxlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc291cmNlTWFwRW5hYmxlZCA9IGVuYWJsZTtcbiAgICB9XG5cbiAgICBpc1NvdXJjZU1hcEVuYWJsZWQoKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VNYXBFbmFibGVkO1xuICAgIH1cbiAgICBcbiAgICBfc29ydFJ1bGVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJvbGUgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3JvbGVdLnNvcnQoKHJ1bGVBOiBXcmFwcGVkUnVsZSwgcnVsZUI6IFdyYXBwZWRSdWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQSA9IHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQiA9IHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgLy8gSWYgQiBkZXBlbmRzIG9uIEEsIHNvcnQgQSBiZWZvcmUgQlxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBCICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVBLnJ1bGUuaWQpKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgLy8gSWYgQSBkZXBlbmRzIG9uIEIsIHNvcnQgQiBiZWZvcmUgQVxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBBICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVCLnJ1bGUuaWQpKSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJvbGUgaW4gdGhpcy5leGNsUnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3JvbGVdLnNvcnQoKHJ1bGVBOiBXcmFwcGVkUnVsZSwgcnVsZUI6IFdyYXBwZWRSdWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQSA9IHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQiA9IHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgLy8gSWYgQiBkZXBlbmRzIG9uIEEsIHNvcnQgQSBiZWZvcmUgQlxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBCICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVBLnJ1bGUuaWQpKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgLy8gSWYgQSBkZXBlbmRzIG9uIEIsIHNvcnQgQiBiZWZvcmUgQVxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBBICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVCLnJ1bGUuaWQpKSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZE5sc01hcChtYXA6IE5sc01hcCkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtYXApIHtcbiAgICAgICAgICAgIHRoaXMubmxzTWFwW2tleV0gPSBtYXBba2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEhlbHBNYXAobWFwOiBIZWxwTWFwKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgdGhpcy5oZWxwTWFwW2tleV0gPSBtYXBba2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE1lc3NhZ2UocnVsZUlkOiBzdHJpbmcsIHJ1bGVJZHg6IG51bWJlciB8IHN0cmluZywgbXNnQXJncz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHNwbGl0dGVyID0gcnVsZUlkLmluZGV4T2YoXCIkJFwiKTtcbiAgICAgICAgaWYgKHNwbGl0dGVyID49IDApIHtcbiAgICAgICAgICAgIHJ1bGVJZCA9IHJ1bGVJZC5zdWJzdHJpbmcoMCxzcGxpdHRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMubmxzTWFwKSkgcmV0dXJuIHJ1bGVJZDtcbiAgICAgICAgbGV0IG1lc3NhZ2VUZW1wbGF0ZSA9IHRoaXMubmxzTWFwW3J1bGVJZF1bcnVsZUlkeCB8fCAwXTtcbiAgICAgICAgaWYgKCFtZXNzYWdlVGVtcGxhdGUpIHJldHVybiBydWxlSWQrXCJfXCIrcnVsZUlkeDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKC9cXHsoXFxkKylcXH0vZyxcbiAgICAgICAgICAgIChtYXRjaGVkU3RyLCBtYXRjaGVkTnVtLCBtYXRjaGVkSW5kZXgpID0+IG1zZ0FyZ3NbbWF0Y2hlZE51bV1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRIZWxwKHJ1bGVJZDogc3RyaW5nLCByZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBhcmNoaXZlSWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIWFyY2hpdmVJZCkge1xuICAgICAgICAgICAgLy8gU2V0IHRvIHRoZSBsYXRlc3RcbiAgICAgICAgICAgIGFyY2hpdmVJZCA9IFwibGF0ZXN0XCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke0NvbmZpZy5oZWxwUm9vdH0vJHthcmNoaXZlSWR9L2RvYyR7dGhpcy5nZXRIZWxwUmVsKHJ1bGVJZCwgcmVhc29uSWQpfWA7XG4gICAgfVxuXG4gICAgZ2V0SGVscFJlbChydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHNwbGl0dGVyID0gcnVsZUlkLmluZGV4T2YoXCIkJFwiKTtcbiAgICAgICAgaWYgKHNwbGl0dGVyID49IDApIHtcbiAgICAgICAgICAgIHJ1bGVJZCA9IHJ1bGVJZC5zdWJzdHJpbmcoMCxzcGxpdHRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMuaGVscE1hcCkpIHJldHVybiBydWxlSWQ7XG4gICAgICAgIHJ1bGVJZHggPSBydWxlSWR4IHx8IDA7XG4gICAgICAgIGxldCBoZWxwU3RyID0gbnVsbDtcbiAgICAgICAgaWYgKHJ1bGVJZHggaW4gdGhpcy5oZWxwTWFwW3J1bGVJZF0pIHtcbiAgICAgICAgICAgIGhlbHBTdHIgPSB0aGlzLmhlbHBNYXBbcnVsZUlkXVtydWxlSWR4IHx8IDBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVscFN0ciA9IHRoaXMuaGVscE1hcFtydWxlSWRdWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoZWxwU3RyKSByZXR1cm4gcnVsZUlkK1wiX1wiK3J1bGVJZHg7XG4gICAgICAgIHJldHVybiBoZWxwU3RyO1xuICAgIH1cblxuICAgIGFkZE1hcHBlcihtYXBwZXI6IElNYXBwZXIpIHtcbiAgICAgICAgdGhpcy5tYXBwZXJzW21hcHBlci5nZXROYW1lc3BhY2UoKV0gPSBtYXBwZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbWF0Y2gocnVsZTogV3JhcHBlZFJ1bGUsXG4gICAgICAgIGNvbnRleHRIaWVyOiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBib29sZWFuXG4gICAge1xuICAgICAgICBsZXQgcnVsZVBhcnRzID0gcnVsZS5wYXJzZWRJbmZvLmNvbnRleHRJbmZvO1xuICAgICAgICBsZXQgcGFydElkeCA9IHJ1bGVQYXJ0cy5sZW5ndGgtMTtcbiAgICAgICAgbGV0IGN1ck5TID0gcnVsZVBhcnRzW3BhcnRJZHhdLm5hbWVzcGFjZTtcbiAgICAgICAgbGV0IGN1ckhpZXIgPSBjb250ZXh0SGllcltjdXJOU11bY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aC0xXTtcbiAgICAgICAgY29uc3QgY29udGV4dE5vZGUgPSBjdXJIaWVyLm5vZGU7XG5cbiAgICAgICAgLy8gSWYgdGhlIGVuZCBvZiB0aGUgcnVsZSBwYXJ0IGRvZXNuJ3QgbWF0Y2ggdGhlIGVuZCBvZiB0aGUgaGllcmFyY2h5LCB3ZSBkb24ndCBoYXZlIGEgbWF0Y2hcbiAgICAgICAgaWYgKCFydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZXJlIHdhcyBvbmx5IG9uZSBwYXJ0LCB3ZSBoYXZlIGEgbWF0Y2hcbiAgICAgICAgaWYgKHJ1bGVQYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5lZWQgdG8gZGVhbCB3aXRoIHBhcmVudCBwYXJ0cy4gVG8gd2FsayB0aGUgaGllcmFyY2h5LCB0aGVzZSBuZWVkIHRvIGJlXG4gICAgICAgIC8vIGFsbCBpbiB0aGUgc2FtZSBuYW1lc3BhY2UuIENvbmZpcm0gdGhhdCBpcyB0cnVlLlxuICAgICAgICBjdXJOUyA9IHJ1bGVQYXJ0c1swXS5uYW1lc3BhY2U7XG4gICAgICAgIGN1ckhpZXIgPSBjb250ZXh0SGllcltjdXJOU11bY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aC0xXTtcbiAgICAgICAgLS1wYXJ0SWR4O1xuICAgICAgICBpZiAocnVsZVBhcnRzLnNsaWNlKDAsIHJ1bGVQYXJ0cy5sZW5ndGgtMSkuc29tZShwYXJ0ID0+IHBhcnQubmFtZXNwYWNlICE9PSBjdXJOUykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtFUlJPUl0gUnVsZSAke3J1bGUucnVsZS5pZH0gaGFzIGluY29uc2l0ZW50IHBhcmVudCBuYW1lc3BhY2VzYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBub2RlIG1hdGNoZXMgdGhlIGVuZCBvZiB0aGUgaGllcmFyY2h5LCBtb3ZlIHVwIHBhc3QgaXQsIG90aGVyd2lzZSwgc3RhcnQgYXQgdGhlIGVuZFxuICAgICAgICBsZXQgaGllcklkeCA9IGNvbnRleHRIaWVyW2N1ck5TXS5sZW5ndGggLSAoY3VySGllci5ub2RlLmlzU2FtZU5vZGUoY29udGV4dE5vZGUpID8gMiA6IDEpO1xuICAgICAgICB3aGlsZSAoaGllcklkeCA+PSAwICYmIHBhcnRJZHggPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFydCA9IHJ1bGVQYXJ0c1twYXJ0SWR4XTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXNQYXJ0ID0gcnVsZVBhcnRzW3BhcnRJZHhdLm1hdGNoZXMoY29udGV4dEhpZXIsIGhpZXJJZHgpO1xuICAgICAgICAgICAgaWYgKHBhcnQuY29ubmVjdG9yID09PSBcIj5cIikge1xuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0IHBhcmVudCBjaGVjayBhbmQgZG9lc24ndCBtYXRjaFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0IHBhcmVudCBjaGVjayBhbmQgZG9lcyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgICAgICAgICAgICAgIC0taGllcklkeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQuY29ubmVjdG9yID09PSBcIiBcIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdXNpdmUgYW5jZXN0b3IgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXNQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZG9lc24ndCBtYXRjaCwganVzdCBtb3ZlIHVwIHRoZSByb2xlIGhpZXJhcmNoeVxuICAgICAgICAgICAgICAgICAgICAtLWhpZXJJZHg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVzaXZlIGFuY2VzdG9yIG1hdGNoIGFuZCBjdXJyZW50IG1hdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4Y2x1c2l2ZSBhbmNlc3RvciBtYXRjaCBhbmQgY3VycmVudCBkb2Vzbid0IG1hdGNoIC0gY2hlY2sgZm9yIG90aGVyIGFuY2VzdG9yc1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50TWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc2VhcmNoSWR4ID0gaGllcklkeC0xOyAhcGFyZW50TWF0Y2ggJiYgc2VhcmNoSWR4ID49IDA7IC0tc2VhcmNoSWR4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNYXRjaCA9ICFydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgc2VhcmNoSWR4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50TWF0Y2gpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSAtLXBhcnRJZHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IGNvbm5lY3RvciBcIitwYXJ0LmNvbm5lY3RvcitcIiBpcyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0SWR4ID09PSAtMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1hdGNoaW5nUnVsZXMoY3R4SGllciA6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IFdyYXBwZWRSdWxlW10ge1xuICAgICAgICBsZXQgbWF0Y2hlcyA6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gYWRkTWF0Y2hlcyhydWxlczogV3JhcHBlZFJ1bGVbXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUucnVsZS5lbmFibGVkICYmIEVuZ2luZS5tYXRjaChydWxlLCBjdHhIaWVyKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2gocnVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbnMgaW4gY3R4SGllcikge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBucytcIjpcIisoY3R4SGllcltuc10ubGVuZ3RoID4gMCA/IGN0eEhpZXJbbnNdW2N0eEhpZXJbbnNdLmxlbmd0aC0xXS5yb2xlIDogXCJub25lXCIpO1xuICAgICAgICAgICAgaWYgKHJvbGUgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuaW5jbFJ1bGVzW3JvbGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgeFJvbGUgaW4gdGhpcy5leGNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoeFJvbGUgIT09IHJvbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkTWF0Y2hlcyh0aGlzLmV4Y2xSdWxlc1t4Um9sZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyb2xlICE9PSBucytcIjpub25lXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZS5zdGFydHNXaXRoKG5zK1wiOi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5zK1wiOi8qXCIgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbbnMrXCI6LypcIl0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnMrXCI6KlwiIGluIHRoaXMuaW5jbFJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuaW5jbFJ1bGVzW25zK1wiOipcIl0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERlcHMobWF0Y2hlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU29ydHMgdGhlIHJ1bGVzIGluIG9yZGVyIHRvIGV4ZWN1dGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb3JyZWN0IG9yZGVyXG4gICAgICogQHBhcmFtIGluUnVsZXMgTGlzdCBvZiB3cmFwcGVkIHJ1bGVzIHRvIHNvcnRcbiAgICAgKiBAcmV0dXJucyBTb3J0ZWQgbGlzdCBvZiB3cmFwcGVkIHJ1bGVzXG4gICAgICovXG4gICAgc29ydERlcHMoaW5SdWxlczogV3JhcHBlZFJ1bGVbXSkge1xuICAgICAgICBsZXQgZGVwUnVsZXM6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGluUnVsZXMpIHtcbiAgICAgICAgICAgIGRlcFJ1bGVzLnB1c2gocnVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCByZXRWYWwgOiBXcmFwcGVkUnVsZVtdID0gW107XG4gICAgICAgIGxldCBpZFRvUnVsZSA9IHt9O1xuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHJ1bGVzLiBJZiB0aGF0IHJ1bGUncyBkZXBlbmRlbmNpZXMgY2FuIGJlIG1ldCBieSBydWxlcyBhbHJlYWR5IGluIHRoZSBsaXN0LCBhZGQgaXQgdG8gdGhlIGxpc3RcbiAgICAgICAgLy8gUmVwZWF0IHVudGlsIG5vIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlIHNhdGlzZmllZCBsaXN0XG4gICAgICAgIC8vIElmIGEgcnVsZSBjYW5ub3QgYmUgc2F0aXNmaWVkLCBpdCB3aWxsIG5ldmVyIGV4ZWN1dGUsIHNvIGl0IGNhbiBiZSBkcm9wcGVkLlxuICAgICAgICBsZXQgY2hhbmdlID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxkZXBSdWxlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwUnVsZSA9IGRlcFJ1bGVzW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKGRlcFJ1bGUucnVsZS5pZCBpbiBpZFRvUnVsZSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGFsbE1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwUnVsZS5ydWxlLmRlcGVuZGVuY2llcyAmJiBkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShkZXBJZCBpbiBpZFRvUnVsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIChkZXBSdWxlLnJ1bGUucHJlcmVxcyAmJiBkZXBSdWxlLnJ1bGUucHJlcmVxcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGZvciAoY29uc3QgZGVwSWQgb2YgZGVwUnVsZS5ydWxlLnByZXJlcXMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGlmICghKGRlcElkIGluIGlkVG9SdWxlKSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgaWYgKGFsbE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGRlcFJ1bGUpO1xuICAgICAgICAgICAgICAgICAgICBpZFRvUnVsZVtkZXBSdWxlLnJ1bGUuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVwUnVsZXMuc3BsaWNlKGlkeC0tLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGNoYW5nZSk7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZXhwb3J0IGNsYXNzIENvbmZpZyB7XG4gICAgc3RhdGljIERFQlVHID0gZmFsc2U7XG4gICAgc3RhdGljIGhlbHBSb290ID0gXCJodHRwczovL2FibGUuaWJtLmNvbS9ydWxlcy9hcmNoaXZlc1wiO1xufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uTWFwcGVyIH0gZnJvbSBcIi4uL2NvbW1vbi9Db21tb25NYXBwZXJcIjtcbmltcG9ydCB7IEJvdW5kcyB9IGZyb20gXCIuLi9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBET01NYXBwZXIgZXh0ZW5kcyBDb21tb25NYXBwZXIge1xuICAgIGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBnZXROYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiZG9tXCJcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlcyhub2RlOiBOb2RlKSA6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB7fTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGVsZW0uYXR0cmlidXRlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ckluZm8gPSBlbGVtLmF0dHJpYnV0ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICByZXRWYWxbYXR0ckluZm8ubmFtZS50b0xvd2VyQ2FzZSgpXSA9IGF0dHJJbmZvLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdldCBzY2FsZWQgYm91bmRzIGZvciBzY3JlZW5zaG90IGV0Yy4gYWRqdXN0ZWQgZm9yIGRldmljZVBpeGVsUmF0aW8gYW5kIHNjcm9sbFxuICAgICAqIEBwYXJhbSBub2RlIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGdldEJvdW5kcyhub2RlOiBOb2RlKSA6IEJvdW5kcyB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxIC8qTm9kZS5FTEVNRU5UX05PREUqLykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgY2FjaGVkQm91bmRzID0gQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUgYXMgRWxlbWVudCwgXCJET01NYXBwZXJfQm91bmRzXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0eXBlb2YgY2FjaGVkQm91bmRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQm91bmRzO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgYWRqdXN0bWVudCA9IDE7XG4gICAgICAgIGlmIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5kZXZpY2VQaXhlbFJhdGlvKSB7XG4gICAgICAgICAgICBhZGp1c3RtZW50ID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJvdW5kcyA9IChub2RlIGFzIEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIC8vIERvIGEgY2hlY2sgd2hldGhlciBib3VuZHMgaGFzIHZhbHVlIGFzIHdlIHVzZSBkaWZmZXJlbnQgdG9vbCAoaHRtbFVuaXQsIGJyb3dzZXIpIHRvIGNhbGwgdGhpcyBmdW5jdGlvblxuICAgICAgICBpZiAoYm91bmRzKSB7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsWCA9IG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuc2Nyb2xsWCB8fCAwO1xuICAgICAgICAgICAgbGV0IHNjcm9sbFkgPSBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LnNjcm9sbFkgfHwgMDtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IHtcbiAgICAgICAgICAgICAgICBcImxlZnRcIjogTWF0aC5jZWlsKChib3VuZHMubGVmdCArIHNjcm9sbFgpICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgXCJ0b3BcIjogTWF0aC5jZWlsKChib3VuZHMudG9wICsgc2Nyb2xsWSkgKiBhZGp1c3RtZW50KSxcbiAgICAgICAgICAgICAgICBcImhlaWdodFwiOiBNYXRoLmNlaWwoYm91bmRzLmhlaWdodCAqIGFkanVzdG1lbnQpLFxuICAgICAgICAgICAgICAgIFwid2lkdGhcIjogTWF0aC5jZWlsKGJvdW5kcy53aWR0aCAqIGFkanVzdG1lbnQpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUgYXMgRWxlbWVudCwgXCJET01NYXBwZXJfQm91bmRzXCIsIHJldCk7XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdldCByZWFsIENTUyBib3VuZHMgaW4gY3NzIHBpeGVscywgYWRqdXN0ZWQgZm9yIHNjcm9sbCBvbmx5XG4gICAgICogQHBhcmFtIG5vZGUgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2V0VW5hZGp1c3RlZEJvdW5kcyhub2RlOiBOb2RlKSA6IEJvdW5kcyB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxIC8qTm9kZS5FTEVNRU5UX05PREUqLykgcmV0dXJuIG51bGw7XG5cblxuICAgICAgICBjb25zdCBjYWNoZWRCb3VuZHMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSBhcyBFbGVtZW50LCBcIkRPTU1hcHBlcl9VbmFkanVzdGVkQm91bmRzXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0eXBlb2YgY2FjaGVkQm91bmRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQm91bmRzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm91bmRzID0gKG5vZGUgYXMgRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIC8vIGFkanVzdGVkIGZvciBzY3JvbGwgaWYgYW55XG4gICAgICAgIGlmIChib3VuZHMpIHtcbiAgICAgICAgICAgIGxldCBzY3JvbGxYID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxYIHx8IDA7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsWSA9IG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuc2Nyb2xsWSB8fCAwO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgIFwibGVmdFwiOiBNYXRoLmNlaWwoYm91bmRzLmxlZnQgKyBzY3JvbGxYKSxcbiAgICAgICAgICAgICAgICBcInRvcFwiOiBNYXRoLmNlaWwoYm91bmRzLnRvcCArIHNjcm9sbFkpLFxuICAgICAgICAgICAgICAgIFwiaGVpZ2h0XCI6IE1hdGguY2VpbChib3VuZHMuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICBcIndpZHRoXCI6IE1hdGguY2VpbChib3VuZHMud2lkdGgpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUgYXMgRWxlbWVudCwgXCJET01NYXBwZXJfVW5hZGp1c3RlZEJvdW5kc1wiLCByZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuL0RPTVdhbGtlclwiO1xuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgcHJvdmlkaW5nIGhlbHBlciBtZXRob2RzIGZvciBET00gbWFuaXB1bGF0aW9uIGFuZCB0cmF2ZXJzYWwgb3BlcmF0aW9ucy5cbiAqIFVzZWQgdGhyb3VnaG91dCB0aGUgYWNjZXNzaWJpbGl0eSBjaGVja2VyIGVuZ2luZSB0byBuYXZpZ2F0ZSBhbmQgYW5hbHl6ZSBET00gc3RydWN0dXJlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIERPTVV0aWwge1xuICAgIFxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGdpdmVuIG5vZGUgaGFzIGFuIGFuY2VzdG9yIGVsZW1lbnQgd2l0aCBhIG5vZGUgbmFtZSBtYXRjaGluZyBhbnkgb2YgdGhlIHByb3ZpZGVkIG5hbWVzLlxuICAgICAqIFRyYXZlcnNlcyB1cCB0aGUgRE9NIHRyZWUgZnJvbSB0aGUgZ2l2ZW4gbm9kZSB1bnRpbCBhIG1hdGNoIGlzIGZvdW5kIG9yIHRoZSByb290IGlzIHJlYWNoZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSAtIFRoZSBzdGFydGluZyBET00gbm9kZSB0byBjaGVja1xuICAgICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIG5vZGUgbmFtZXMgKHRhZyBuYW1lcykgdG8gc2VhcmNoIGZvciBpbiB1cHBlcmNhc2UgKGUuZy4sIFsnVEFCTEUnLCAnRElWJ10pXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhbiBhbmNlc3RvciB3aXRoIGEgbWF0Y2hpbmcgbmFtZSBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgc3RhdGljIGhhc1BhcmVudChub2RlOiBOb2RlLCBuYW1lczpzdHJpbmdbXSkge1xuICAgICAgICBsZXQgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICB3aGlsZSAocCAmJiAhbmFtZXMuaW5jbHVkZXMocC5ub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIHAgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgZmlyc3QgYW5jZXN0b3IgZWxlbWVudCB0aGF0IG1hdGNoZXMgYW55IG9mIHRoZSBwcm92aWRlZCBub2RlIG5hbWVzIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAgICAgKiBTaW1pbGFyIHRvIGhhc1BhcmVudCBidXQgcmV0dXJucyB0aGUgYWN0dWFsIGVsZW1lbnQgcmVmZXJlbmNlIGFuZCBwZXJmb3JtcyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSAtIFRoZSBzdGFydGluZyBET00gbm9kZVxuICAgICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIGxvd2VyY2FzZSBub2RlIG5hbWVzIHRvIHNlYXJjaCBmb3IgKGUuZy4sIFsndGFibGUnLCAnZGl2J10pXG4gICAgICogQHJldHVybnMgVGhlIG1hdGNoaW5nIGFuY2VzdG9yIGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZSBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRBbmNlc3Rvcihub2RlOiBOb2RlLCBuYW1lczpzdHJpbmdbXSkge1xuICAgICAgICBsZXQgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICB3aGlsZSAocCAmJiAhbmFtZXMuaW5jbHVkZXMocC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdHdvIG5vZGVzIGFyZSB0aGUgc2FtZSBub2RlLCB3aXRoIGZhbGxiYWNrIHN0cmF0ZWdpZXMgZm9yIGRpZmZlcmVudCBicm93c2VyIGVudmlyb25tZW50cy5cbiAgICAgKiBVc2VzIG11bHRpcGxlIGNvbXBhcmlzb24gbWV0aG9kcyBmb3IgY3Jvc3MtYnJvd3NlciBjb21wYXRpYmlsaXR5OlxuICAgICAqIDEuIFN0cmljdCBlcXVhbGl0eSAoPT09KVxuICAgICAqIDIuIGlzU2FtZU5vZGUoKSBtZXRob2QgaWYgYXZhaWxhYmxlXG4gICAgICogMy4gY29tcGFyZURvY3VtZW50UG9zaXRpb24oKSAocmV0dXJucyAwIGlmIHNhbWUgbm9kZSlcbiAgICAgKiA0LiBSZXR1cm5zIHRydWUgYXMgbGFzdCByZXNvcnQgaWYgbm8gY29tcGFyaXNvbiBtZXRob2QgaXMgYXZhaWxhYmxlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYSAtIEZpcnN0IG5vZGUgdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSBiIC0gU2Vjb25kIG5vZGUgdG8gY29tcGFyZVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgbm9kZXMgYXJlIHRoZSBzYW1lLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgc2FtZU5vZGUoYTogTm9kZSwgYjogTm9kZSkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGEuaXNTYW1lTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGEuaXNTYW1lTm9kZShiKTtcbiAgICAgICAgfSBlbHNlIGlmIChhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCAtIHRyeSBvdXIgYmVzdFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIHdoaXRlc3BhY2UgaW4gYSBzdHJpbmcgYnkgcmVwbGFjaW5nIGFsbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcbiAgICAgKiAoc3BhY2VzLCB0YWJzLCBjYXJyaWFnZSByZXR1cm5zLCBuZXdsaW5lcykgd2l0aCBzaW5nbGUgc3BhY2VzIGFuZCBjb2xsYXBzaW5nXG4gICAgICogbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIGludG8gb25lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHMgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGNsZWFuXG4gICAgICogQHJldHVybnMgVGhlIGNsZWFuZWQgc3RyaW5nIHdpdGggbm9ybWFsaXplZCB3aGl0ZXNwYWNlXG4gICAgICogQGV4YW1wbGUgXCJIZWxsb1xcblxcdCAgV29ybGRcIiDihpIgXCJIZWxsbyBXb3JsZFwiXG4gICAgICovXG4gICAgc3RhdGljIGNsZWFuV2hpdGVzcGFjZShzOiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHMucmVwbGFjZSgvWyBcXHRcXHJcXG5dL2csIFwiIFwiKS5yZXBsYWNlKC8gKy9nLFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZXMgbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIGludG8gYSBzaW5nbGUgc3BhY2UuXG4gICAgICogVW5saWtlIGNsZWFuV2hpdGVzcGFjZSwgb25seSBoYW5kbGVzIHNwYWNlcywgbm90IG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBsaWtlIHRhYnMgb3IgbmV3bGluZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcyAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gY2xlYW5cbiAgICAgKiBAcmV0dXJucyBUaGUgc3RyaW5nIHdpdGggY29sbGFwc2VkIHNwYWNlc1xuICAgICAqL1xuICAgIHN0YXRpYyBjbGVhblNwYWNlKHM6IHN0cmluZykgOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsID0gcy5yZXBsYWNlKC8gKy9nLFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHR3byBlbGVtZW50cyAodHlwaWNhbGx5IHRhYmxlIGNlbGxzKSBiZWxvbmcgdG8gdGhlIHNhbWUgdGFibGUgZWxlbWVudC5cbiAgICAgKiBGaW5kcyB0aGUgdGFibGUgYW5jZXN0b3IgZm9yIGVhY2ggZWxlbWVudCBhbmQgY29tcGFyZXMgdGhlbSB1c2luZyBzYW1lTm9kZSgpLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQxIC0gRmlyc3QgZWxlbWVudCB0byBjaGVja1xuICAgICAqIEBwYXJhbSBlbGVtZW50MiAtIFNlY29uZCBlbGVtZW50IHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBib3RoIGVsZW1lbnRzIHNoYXJlIHRoZSBzYW1lIHRhYmxlIGFuY2VzdG9yLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNJblNhbWVUYWJsZShlbGVtZW50MSwgZWxlbWVudDIpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQxICYmIGVsZW1lbnQyKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnROYW1lID0gWyd0YWJsZSddO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50MT0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtZW50MSwgcGFyZW50TmFtZSk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQyPSBET01VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQyLCBwYXJlbnROYW1lKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQxICE9PSBudWxsICYmIHBhcmVudDIgIT0gbnVsbCAmJiBET01VdGlsLnNhbWVOb2RlKHBhcmVudDEsIHBhcmVudDIpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogVHJhdmVyc2VzIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIHRoZSBzaGFkb3cgcm9vdCAoZG9jdW1lbnQgZnJhZ21lbnQpIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIG5vZGUuXG4gICAgICogSW1wb3J0YW50IGZvciBoYW5kbGluZyBXZWIgQ29tcG9uZW50cyBhbmQgU2hhZG93IERPTSBzdHJ1Y3R1cmVzIGluIGFjY2Vzc2liaWxpdHkgY2hlY2tpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSAtIFRoZSBzdGFydGluZyBub2RlXG4gICAgICogQHJldHVybnMgVGhlIHNoYWRvdyByb290IG5vZGUgKG5vZGVUeXBlIDExID0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSksIG9yIG51bGwgaWYgbm9uZSBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBzaGFkb3dSb290Tm9kZShub2RlOiBOb2RlKSA6IE5vZGUgfCBudWxsIHtcbiAgICAgICAgbGV0IG5kID0gbm9kZTtcbiAgICAgICAgd2hpbGUgKG5kICE9IG51bGwgJiYgbmQubm9kZVR5cGUgIT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLylcbiAgICAgICAgICAgIG5kID0gbmQucGFyZW50Tm9kZTtcbiAgICAgICAgcmV0dXJuIG5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgYW4gb2JqZWN0IHdoaWxlIHByZXNlcnZpbmcgTm9kZSByZWZlcmVuY2VzIChkb2Vzbid0IGNsb25lIE5vZGUgb2JqZWN0cykuXG4gICAgICogVXNlZnVsIHdoZW4gY29weWluZyBkYXRhIHN0cnVjdHVyZXMgdGhhdCBjb250YWluIERPTSBub2RlIHJlZmVyZW5jZXMsIGFzIHlvdSB0eXBpY2FsbHkgd2FudFxuICAgICAqIHRvIHByZXNlcnZlIHRob3NlIHJlZmVyZW5jZXMgcmF0aGVyIHRoYW4gYXR0ZW1wdGluZyB0byBjbG9uZSB0aGUgbm9kZXMgdGhlbXNlbHZlcy5cbiAgICAgKlxuICAgICAqIEJlaGF2aW9yOlxuICAgICAqIC0gUHJpbWl0aXZlIHZhbHVlczogRGVlcCBjb3BpZWQgdmlhIEpTT04gc2VyaWFsaXphdGlvblxuICAgICAqIC0gRnVuY3Rpb25zOiBSZXR1cm5lZCBhcy1pcyAocmVmZXJlbmNlKVxuICAgICAqIC0gTm9kZSBvYmplY3RzOiBSZXR1cm5lZCBhcy1pcyAocmVmZXJlbmNlLCBub3QgY2xvbmVkKVxuICAgICAqIC0gQXJyYXlzL09iamVjdHM6IFJlY3Vyc2l2ZWx5IGNvcGllZCB3aXRoIHRoZSBzYW1lIHJ1bGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmhzIC0gVGhlIG9iamVjdCB0byBjb3B5IChyaWdodC1oYW5kIHNpZGUpXG4gICAgICogQHJldHVybnMgQSBjb3B5IG9mIHRoZSBvYmplY3Qgd2l0aCBOb2RlIHJlZmVyZW5jZXMgcHJlc2VydmVkXG4gICAgICovXG4gICAgc3RhdGljIG9iamVjdENvcHlXaXRoTm9kZVJlZnMocmhzOiBhbnkpIHtcbiAgICAgICAgaWYgKCFyaHMpIHJldHVybiByaHM7XG4gICAgICAgIGlmICh0eXBlb2YgcmhzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJocyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJocztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmhzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmhzIGluc3RhbmNlb2YgTm9kZSB8fCAhIXJocy5ub2RlVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJocztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXRWYWw7XG4gICAgICAgICAgICBpZiAocmhzLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiQXJyYXlcIikge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByaHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnB1c2godGhpcy5vYmplY3RDb3B5V2l0aE5vZGVSZWZzKGl0ZW0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJocykge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxba2V5XSA9IHRoaXMub2JqZWN0Q29weVdpdGhOb2RlUmVmcyhyaHNba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBmaXJzdCBhbmNlc3RvciBlbGVtZW50IHRoYXQgaGFzIGEgc3BlY2lmaWMgYXR0cmlidXRlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZS5cbiAgICAgKiBUcmF2ZXJzZXMgdXAgdGhlIERPTSB0cmVlIGZyb20gdGhlIGdpdmVuIGVsZW1lbnQgdW50aWwgYSBtYXRjaGluZyBhbmNlc3RvciBpcyBmb3VuZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIHN0YXJ0aW5nIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gYXR0ck5hbWUgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gc2VhcmNoIGZvclxuICAgICAqIEBwYXJhbSBhdHRyVmFsdWUgLSBUaGUgZXhwZWN0ZWQgYXR0cmlidXRlIHZhbHVlXG4gICAgICogQHJldHVybnMgVGhlIG1hdGNoaW5nIGFuY2VzdG9yIGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZSBmb3VuZFxuICAgICAqIEBleGFtcGxlIEZpbmRpbmcgYW4gYW5jZXN0b3Igd2l0aCBhcmlhLWhpZGRlbj1cInRydWVcIiBvciBkYXRhLXRlc3RpZD1cImNvbnRhaW5lclwiXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcldpdGhBdHRyaWJ1dGUoZWxlbWVudCwgYXR0ck5hbWUsIGF0dHJWYWx1ZSkge1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgKDxFbGVtZW50PndhbGtOb2RlKS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpID09PSBhdHRyVmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL1Zpc1V0aWxcIjtcbi8qKlxuICogV2Fsa3MgaW4gYSBET00gb3JkZXJcbiAqIFxuICogQXNzdW1wdGlvbiB0aGF0IG5vZGVzIG9mIHNoYWRvdyBET01zIGNhbGwgYXNzaWduU2xvdHMgb24gdGhlIHNoYWRvdyByb290IGJlZm9yZSBcbiAqIGRvaW5nIG90aGVyIHByb2Nlc3NpbmcgaW4gdGhhdCB0cmVlLiBJZiB5b3Ugd2FsayBpbnRvIGEgc2hhZG93IHJvb3QsIHRoZSBET01XYWxrZXJcbiAqIHdpbGwgZG8gaXQgYXV0b21hdGljYWxseS5cbiAqIFxuICogU2VlIGFsc28gLi4vYXJpYS9BUklBV2Fsa2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBET01XYWxrZXIge1xuICAgIHJvb3QgOiBOb2RlO1xuICAgIG5vZGUgOiBOb2RlO1xuICAgIGJFbmRUYWc6IGJvb2xlYW47XG4gICAgY29uc2lkZXJIaWRkZW46IGJvb2xlYW47XG4gICAgREVCVUc6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50IDogTm9kZSwgYkVuZD8gOiBib29sZWFuLCByb290PyA6IE5vZGUsIGNvbnNpZGVySGlkZGVuPyA6IGJvb2xlYW4sIERFQlVHPzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLkRFQlVHID0gISFERUJVRztcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdCB8fCAoKGVsZW1lbnQgJiYgZWxlbWVudC5vd25lckRvY3VtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6IGVsZW1lbnQpO1xuICAgICAgICBpZiAodGhpcy5yb290Lm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSAodGhpcy5yb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJFbmQgPT0gdHJ1ZSk7XG4gICAgICAgIHRoaXMuY29uc2lkZXJIaWRkZW4gPSBjb25zaWRlckhpZGRlbiB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBlbGVtKCkgOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmIHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCB8fCBudWxsO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgcGFyZW50Tm9kZShub2RlOiBOb2RlKSA6IE5vZGUgfCBudWxsIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcCA6IE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGlmICgobm9kZSBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgcCA9IChub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICB9IGVsc2UgaWYgKChub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICBwID0gKG5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAocCAmJiBwLm5vZGVUeXBlID09PSAxMSkge1xuICAgICAgICAgICAgaWYgKChwIGFzIFNoYWRvd1Jvb3QpLmhvc3QpIHtcbiAgICAgICAgICAgICAgICBwID0gKHAgYXMgU2hhZG93Um9vdCkuaG9zdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcmVudEVsZW1lbnQobm9kZTogTm9kZSkgOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGxldCBlbGVtIDogRWxlbWVudCA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgZG8geyBcbiAgICAgICAgICAgIGVsZW0gPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtKSBhcyBFbGVtZW50O1xuICAgICAgICB9IHdoaWxlIChlbGVtICYmIGVsZW0ubm9kZVR5cGUgIT09IDEpO1xuICAgICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXNzaWduU2xvdHMocm9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBsZXQgc2xvdHMgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuICAgICAgICBmb3IgKGxldCBpU2xvdD0wOyBpU2xvdDxzbG90cy5sZW5ndGg7ICsraVNsb3QpIHtcbiAgICAgICAgICAgIGxldCBwcm9jZXNzU2xvdCA9IHNsb3RzW2lTbG90XTtcbiAgICAgICAgICAgIGxldCBhc3NpZ25lZE5vZGVzID0gcHJvY2Vzc1Nsb3QuYXNzaWduZWROb2RlcygpO1xuICAgICAgICAgICAgZm9yIChsZXQgaUFzc2lnbmVkPTA7IGlBc3NpZ25lZDxhc3NpZ25lZE5vZGVzLmxlbmd0aDsgKytpQXNzaWduZWQpIHtcbiAgICAgICAgICAgICAgICAoYXNzaWduZWROb2Rlc1tpQXNzaWduZWRdIGFzIGFueSkuc2xvdE93bmVyID0gcHJvY2Vzc1Nsb3Q7XG4gICAgICAgICAgICAgICAgKGFzc2lnbmVkTm9kZXNbaUFzc2lnbmVkXSBhcyBhbnkpLnNsb3RJbmRleCA9IGlBc3NpZ25lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmaXJzdENoaWxkTm90T3duZWRCeVNsb3Qobm9kZTogTm9kZSkge1xuICAgICAgICBsZXQgcmV0VmFsID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHN0YXRpYyBsYXN0Q2hpbGROb3RPd25lZEJ5U2xvdChub2RlOiBOb2RlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBub2RlLmxhc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKHJldFZhbCAmJiAocmV0VmFsIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICByZXRWYWwgPSByZXRWYWwucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgc3RhdGljIG5leHRTaWJsaW5nTm90T3duZWRCeVNsb3Qobm9kZTpOb2RlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHN0YXRpYyBwcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdChub2RlOk5vZGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBhdFJvb3QoKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yb290ID09PSB0aGlzLm5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5pc1NhbWVOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmlzU2FtZU5vZGUodGhpcy5ub2RlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5ub2RlKSA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCAtIHRyeSBvdXIgYmVzdFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wYXJlbnROb2RlID09PSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgREVCVUdJRFggPSAwO1xuICAgIGluZGVudCA9IDA7XG4gICAgbmV4dE5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpbmRlbnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcyA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PHRoaXMuaW5kZW50OyArK2lkeCkge1xuICAgICAgICAgICAgICAgIHMgKz0gXCIgXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgREJHID0gZmFsc2U7Ly90aGlzLkRFQlVHSURYID49IDcgJiYgdGhpcy5ERUJVR0lEWCA8PSAxMDtcbiAgICAgICAgbGV0IHN0YXJ0TmFtZSA9IHRoaXMubm9kZS5ub2RlTmFtZTtcbiAgICAgICAgaWYgKCF0aGlzLm5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codGhpcy5ub2RlLm5vZGVOYW1lLCB0aGlzLmJFbmRUYWc/XCJFTkRcIjpcIlNUQVJUXCIsIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIGFueSkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBzbG90RWxlbWVudCA9ICh0aGlzLm5vZGUgYXMgSFRNTFNsb3RFbGVtZW50KVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmICh0aGlzLmNvbnNpZGVySGlkZGVuID8gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhSW50byBGcmFtZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5jb25zaWRlckhpZGRlbiA/IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSkgOiB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUludG8gc2hhZG93IHJvb3RcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVdhbGtlci5hc3NpZ25TbG90cyh0aGlzLm5vZGUgYXMgU2hhZG93Um9vdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzbG90XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFJbnRvIHNsb3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5maXJzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFGaXJzdCBjaGlsZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUZsaXAgdG8gZW5kIHRhZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhITFcIik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhRG9uZSBhdCByb290XCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFNsb3RJbmRleCA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXgrMTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFNsb3RJbmRleCA8IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFOZXh0IHNsb3QgY2hpbGRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXIuYXNzaWduZWROb2RlcygpW25leHRTbG90SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFCYWNrIHVwIHRvIHNsb3Qgb3duZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIVVwIHRvIGZyYW1lIG93bmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLm5leHRTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFOZXh0IHNpYmxpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5uZXh0U2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhUGFyZW50XCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFEb25lIHdpdGggd2Fsa1wiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChEQkcgJiYgKFxuICAgICAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgKVxuICAgICAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLkRFQlVHICYmIGNvbnNvbGUubG9nKGluZGVudCgpK2A8JHt0aGlzLmJFbmRUYWc/XCIvXCI6XCJcIn0ke3RoaXMubm9kZS5ub2RlTmFtZX0+IChmcm9tICR7c3RhcnROYW1lfSkgJHt0aGlzLkRFQlVHSURYKyt9IFNLSVBQRURgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAzIClcbiAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuYkVuZFRhZykgdGhpcy5pbmRlbnQgLT0gMjtcbiAgICAgICAgdGhpcy5ERUJVRyAmJiBjb25zb2xlLmxvZyhpbmRlbnQoKStgPCR7dGhpcy5iRW5kVGFnP1wiL1wiOlwiXCJ9JHt0aGlzLm5vZGUubm9kZU5hbWV9PiAoZnJvbSAke3N0YXJ0TmFtZX0pICR7dGhpcy5ERUJVR0lEWCsrfWApO1xuICAgICAgICB0aGlzLkRFQlVHICYmICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIgJiYgY29uc29sZS5sb2coaW5kZW50KCkrYHNsb3RPd25lcjogJHsodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyLm5vZGVOYW1lfWApO1xuICAgICAgICB0aGlzLkRFQlVHICYmICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXggJiYgY29uc29sZS5sb2coaW5kZW50KCkrYHNsb3RJbmRleDogJHsodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4fWApO1xuICAgICAgICB0aGlzLkRFQlVHICYmICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgJiYgY29uc29sZS5sb2coaW5kZW50KCkrYG93bmVyRWxlbWVudDogJHsodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50Lm5vZGVOYW1lfWApO1xuICAgICAgICBpZiAoIXRoaXMuYkVuZFRhZykgdGhpcy5pbmRlbnQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJldk5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlmcmFtZU5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxJRnJhbWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5jb25zaWRlckhpZGRlbiA/IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKSA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi9cbiAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMuY29uc2lkZXJIaWRkZW4gPyBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudE5vZGUpIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290Lmxhc3RDaGlsZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVdhbGtlci5hc3NpZ25TbG90cyh0aGlzLm5vZGUgYXMgU2hhZG93Um9vdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzbG90XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgKGVsZW1lbnROb2RlIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbnRlciBzbG90IHdpdGggYXNzaWduZWQgbm9kZXMgLSBnbyB0byBsYXN0IGFzc2lnbmVkIG5vZGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RFbGVtZW50ID0gZWxlbWVudE5vZGUgYXMgSFRNTFNsb3RFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKClbc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExKVxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIubGFzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIubGFzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0Um9vdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmV2U2xvdEluZGV4ID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2U2xvdEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKClbcHJldlNsb3RJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBlUnVsZVBvbGljeSB9IGZyb20gXCIuL0lSdWxlXCJcblxuZXhwb3J0IGVudW0gZVRvb2xraXRMZXZlbCB7XG4gICAgTEVWRUxfT05FID0gXCIxXCIsXG4gICAgTEVWRUxfVFdPID0gXCIyXCIsXG4gICAgTEVWRUxfVEhSRUUgPSBcIjNcIixcbiAgICBMRVZFTF9GT1VSID0gXCI0XCJcbn1cblxuZXhwb3J0IGVudW0gZUd1aWRlbGluZUNhdGVnb3J5IHtcbiAgICBBQ0NFU1NJQklMSVRZID0gXCJBY2Nlc3NpYmlsaXR5XCIsXG4gICAgREVTSUdOID0gXCJEZXNpZ25cIixcbiAgICBPVEhFUiA9IFwiT3RoZXJcIlxufVxuXG5leHBvcnQgZW51bSBlR3VpZGVsaW5lVHlwZSB7XG4gICAgREVGQVVMVCA9IFwiZGVmYXVsdFwiLFxuICAgIEVYVEVOU0lPTiA9IFwiZXh0ZW5zaW9uXCJcbn1cblxuZXhwb3J0IHR5cGUgQ2hlY2twb2ludCA9IHtcbiAgICBudW06IHN0cmluZyxcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FjdC1ydWxlcy9hY3QtdG9vbHMvYmxvYi9tYWluL3NyYy9kYXRhL3NjLXVybHMuanNvblxuICAgIHNjSWQ/OiBzdHJpbmcsXG4gICAgLy8gSkNIOiBhZGQgbmFtZSBvZiBjaGVja3BvaW50IGFuZCBzdW1tYXJ5IGRlc2NyaXB0aW9uXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHdjYWdMZXZlbDogc3RyaW5nLFxuICAgIHN1bW1hcnk6IHN0cmluZyxcbiAgICBydWxlcz86IEFycmF5PHsgXG4gICAgICAgIGlkOiBzdHJpbmcsIFxuICAgICAgICAvLyAob3B0aW9uYWwpIFJlYXNvbiBjb2RlcyB0aGF0IHRoaXMgcnVsZXNldCBtYXBwaW5nIGFwcGxpZXMgdG8sIFxuICAgICAgICAvLyBvciBhbGwgaWYgbm90IHNwZWNpZmllZFxuICAgICAgICByZWFzb25Db2Rlcz86IHN0cmluZ1tdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3ksIFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwsXG4gICAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgfT5cbn1cblxuZXhwb3J0IHR5cGUgR3VpZGVsaW5lID0ge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnksXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICB0eXBlPzogZUd1aWRlbGluZVR5cGUsXG4gICAgY2hlY2twb2ludHM6IEFycmF5PENoZWNrcG9pbnQ+XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGVHdWlkZWxpbmVDYXRlZ29yeSwgZUd1aWRlbGluZVR5cGUgfSBmcm9tIFwiLi9JR3VpZGVsaW5lXCI7XG5pbXBvcnQgeyBJTWFwUmVzdWx0IH0gZnJvbSBcIi4vSU1hcHBlclwiO1xuaW1wb3J0IHsgTmxzTWFwIGFzIE5sc01hcE5ldywgSGVscE1hcCBhcyBIZWxwTWFwTmV3LCBJRW5naW5lIGFzIElFbmdpbmVOZXcgfSBmcm9tIFwiLi9JRW5naW5lXCI7XG5pbXBvcnQgeyBSZXBvcnQgYXMgUmVwb3J0TmV3IH0gZnJvbSBcIi4vSVJlcG9ydFwiO1xuaW1wb3J0IHsgZVRvb2xraXRMZXZlbCBhcyBlVG9vbGtpdExldmVsTmV3IH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiXG5pbXBvcnQgeyBCb3VuZHMgfSBmcm9tIFwiLi9JQm91bmRzXCI7XG5cbmV4cG9ydCBlbnVtIGVSdWxlQ29uZmlkZW5jZSB7XG4gICAgUEFTUyA9IFwiUEFTU1wiLFxuICAgIEZBSUwgPSBcIkZBSUxcIixcbiAgICBQT1RFTlRJQUwgPSBcIlBPVEVOVElBTFwiLFxuICAgIE1BTlVBTCA9IFwiTUFOVUFMXCJcbn1cblxuZXhwb3J0IGVudW0gZVJ1bGVQb2xpY3kge1xuICAgIFZJT0xBVElPTiA9IFwiVklPTEFUSU9OXCIsXG4gICAgUkVDT01NRU5EQVRJT04gPSBcIlJFQ09NTUVOREFUSU9OXCIsXG4gICAgSU5GT1JNQVRJT04gPSBcIklORk9STUFUSU9OXCJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVQYXNzKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBBU1NdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVSZW5kZXIocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUEFTU10sXG4gICAgICAgIHJlYXNvbklkOiAwLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gUnVsZUZhaWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuRkFJTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVBvdGVudGlhbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QT1RFTlRJQUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVNYW51YWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuTUFOVUFMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVSZXN1bHQgPSB7XG4gICAgdmFsdWU6IFtlUnVsZVBvbGljeSwgZVJ1bGVDb25maWRlbmNlXSxcbiAgICByZWFzb25JZD86IG51bWJlciB8IHN0cmluZyxcbiAgICBtZXNzYWdlQXJncz86IHN0cmluZ1tdLFxuICAgIGFwaUFyZ3M/OiBhbnlbXVxufVxuXG5leHBvcnQgdHlwZSBJc3N1ZSA9IFJ1bGVSZXN1bHQgJiB7XG4gICAgcnVsZUlkOiBzdHJpbmcsXG5cbiAgICBub2RlOiBOb2RlLFxuICAgIC8vIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGNhdGVnb3J5PzogZUd1aWRlbGluZUNhdGVnb3J5LFxuICAgIHBhdGg6IHsgW25zOiBzdHJpbmddIDogc3RyaW5nIH0sXG5cbiAgICBydWxlVGltZTogbnVtYmVyLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBib3VuZHM/OiBCb3VuZHMsXG4gICAgc25pcHBldDogc3RyaW5nLFxuICAgIHNvdXJjZT86IHN0cmluZyxcbiAgICBsZXZlbD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBSdWxlQ29udGV4dEhpZXJhcmNoeSA9IHsgW25hbWVzcGFjZTogc3RyaW5nXSA6IElNYXBSZXN1bHRbXSB9O1xuXG5leHBvcnQgdHlwZSBSdWxlQ29udGV4dCA9IHtcbiAgICBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcFJlc3VsdFxufVxuXG5leHBvcnQgdHlwZSBSdWxlID0ge1xuICAgIC8vIFVuaXF1ZSBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhpcyBydWxlIChzaG91bGQgYmUgaHVtYW4gdW5kZXJzdGFuZGFibGUpXG4gICAgLy8gTkxTIGNvZGVzIGFuZCBoZWxwIHNvdXJjZXMgd2lsbCBiZSBiYXNlZCBvZmYgb2YgdGhpcyBpZFxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBydWxlc2V0czogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nIHwgc3RyaW5nW11cbiAgICAgICAgbnVtOiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3ksXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbE5ldyxcbiAgICAgICAgLy8gKG9wdGlvbmFsKSBSZWFzb24gY29kZXMgdGhhdCB0aGlzIHJ1bGVzZXQgbWFwcGluZyBhcHBsaWVzIHRvLCBcbiAgICAgICAgLy8gb3IgYWxsIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgcmVhc29uQ29kZXM/OiBzdHJpbmdbXVxuICAgIH0+XG5cbiAgICByZWZhY3Rvcj86IHtcbiAgICAgICAgW29sZFJ1bGVJZDogc3RyaW5nXToge1xuICAgICAgICAgICAgW29sZFJlYXNvbkNvZGU6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFtsb2NhbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaGVscDoge1xuICAgICAgICBbbG9jYWxlOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBcbiAgICAgKiBIb3cgdGhpcyBydWxlIG1hcHMgdG8gQUNUIHJ1bGVzLCBpZiBhbnkgKGh0dHBzOi8vYWN0LXJ1bGVzLmdpdGh1Yi5pby9ydWxlcy8pXG4gICAgICogXG4gICAgICogc3RyaW5nOiBGb3IgYSBzaW5nbGUgcnVsZSBtYXBwaW5nIHRoYXQgbWF0Y2hlcyBleGFjdGx5IHRvIHRoZSBydWxlIChQYXNzIC0+IHBhc3MsIFBvdGVudGlhbCAtPiBjYW50VGVsbCwgRmFpbCAtPiBmYWlsLCB1bmxpc3RlZCA9PiBpbmFwcGxpY2FibGUpXG4gICAgICogQXJyYXk8PjogQ3VzdG9tIG1hcHBpbmcgb2YgcnVsZSB0byBBQ1QgcmVzdWx0c1xuICAgICAqL1xuICAgIGFjdD86IHN0cmluZyB8IHN0cmluZ1tdIHwgQXJyYXk8c3RyaW5nIHwge1xuICAgICAgICBbYWN0UnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IFwicGFzc1wiIHwgXCJmYWlsXCIgfCBcImNhbnRUZWxsXCIgfCBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9PlxuXG4gICAgLy8gU2VlIHNyYy92Mi9jb21tb24vQ29udGV4dC50cyBmb3IgdmFsaWQgY29udGV4dHNcbiAgICBjb250ZXh0OiBzdHJpbmc7XG5cbiAgICAvLyBBcnJheSBvZiBydWxlcyB0aGF0IG11c3QgcGFzcyB0byBhbGxvdyB0aGlzIHZhbGlkYXRlIHRvIHJ1biAtIHRoZXkgbXVzdCBoYXZlIHRoZSBzYW1lIGNvbnRleHQgcHJvcGVydHlcbiAgICBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXVxuXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpID0+IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gfCBudWxsXG5cbiAgICBlbmFibGVkPzogYm9vbGVhblxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVEZXRhaWxzID0gSXNzdWU7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2VlIElFbmdpbmVcbiAqL1xuZXhwb3J0IHR5cGUgUmVwb3J0ID0gUmVwb3J0TmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSBJRW5naW5lXG4gKi9cbmV4cG9ydCB0eXBlIE5sc01hcCA9IE5sc01hcE5ldztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgSUVuZ2luZVxuICovXG5leHBvcnQgdHlwZSBIZWxwTWFwID0gSGVscE1hcE5ldztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JRW5naW5lXG4gKi9cbmV4cG9ydCB0eXBlIElFbmdpbmUgPSBJRW5naW5lTmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lHdWlkZWxpbmVcbiAqL1xuZXhwb3J0IHsgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JR3VpZGVsaW5lOmVHdWlkZWxpbmVDYXRlZ29yeVxuICovXG5leHBvcnQgeyBlR3VpZGVsaW5lQ2F0ZWdvcnkgYXMgZVJ1bGVDYXRlZ29yeSB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JR3VpZGVsaW5lOmVHdWlkZWxpbmVUeXBlXG4gKi9cbmV4cG9ydCB7IGVHdWlkZWxpbmVUeXBlIGFzIGVSdWxlc2V0VHlwZSB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSBhcyBSdWxlVjQsIGVSdWxlUG9saWN5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uLy4uL3YyL2NvbW1vbi9FbmdpbmVcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBhMTF5UnVsZXNldHMgfSBmcm9tIFwiLi4vcnVsZXNldHNcIjtcbmltcG9ydCAqIGFzIGNoZWNrUnVsZXNWNCBmcm9tIFwiLi4vcnVsZXNcIjtcbmltcG9ydCB7IEd1aWRlbGluZSwgZUd1aWRlbGluZUNhdGVnb3J5IH0gZnJvbSBcIi4uL2FwaS9JR3VpZGVsaW5lXCI7XG5pbXBvcnQgeyBJRW5naW5lIH0gZnJvbSBcIi4uL2FwaS9JRW5naW5lXCI7XG5pbXBvcnQgeyBSZXBvcnQgfSBmcm9tIFwiLi4vYXBpL0lSZXBvcnRcIjtcbmltcG9ydCB7IElDaGVja2VyIH0gZnJvbSBcIi4uL2FwaS9JQ2hlY2tlclwiO1xuXG5sZXQgY2hlY2tSdWxlcyA9IFtdO1xubGV0IGNoZWNrTmxzID0ge307XG5sZXQgY2hlY2tIZWxwID0ge307XG5cbmZ1bmN0aW9uIF9pbml0aWFsaXplKCkge1xuICAgIGNvbnN0IGxhbmdzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShFbmdpbmUuZ2V0TGFuZ3VhZ2VzKCkpKTtcbiAgICAvLyBEZWZhdWx0IGxhbmcgdG8gZW4tVVMgaWYgbm90aGluZyBlbHNlIHNwZWNpZmllZCBpcyBmb3VuZFxuICAgIGxhbmdzLnB1c2goXCJlbi1VU1wiKTtcbiAgICAvLyBQcm9jZXNzIFY0IHJ1bGVzIGludG8gdGhlIFYyIGZvcm1hdFxuICAgIGZvciAobGV0IHJ1bGVuYW1lIGluIGNoZWNrUnVsZXNWNCkge1xuICAgICAgICAvLyBDb252ZXJ0IHJ1bGVcbiAgICAgICAgbGV0IHY0UnVsZTogUnVsZVY0ID0gY2hlY2tSdWxlc1Y0W3J1bGVuYW1lXTtcbiAgICAgICAgY2hlY2tSdWxlcy5wdXNoKHY0UnVsZSk7XG4gICAgICAgIC8vIEdvIGJhY2t3YXJkcyBiZWNhdXNlIHRoZSBmaXJzdCBsYW5nIGlzIHRoZSBwcmVmZXJyZWQsIHNvXG4gICAgICAgIC8vIGVhcmxpZXIgbGFuZ3VhZ2VzIHdpbGwgb3ZlcnJpZGUgbGF0ZXIgbGFuZ3VhZ2VzXG4gICAgICAgIGZvciAobGV0IGlkeD1sYW5ncy5sZW5ndGgtMTsgaWR4ID49MDsgLS1pZHgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhbmdJZCA9IGxhbmdzW2lkeF07XG4gICAgICAgICAgICBpZiAobGFuZ0lkIGluIHY0UnVsZS5tZXNzYWdlcykge1xuICAgICAgICAgICAgICAgIGNoZWNrTmxzW3Y0UnVsZS5pZF0gPSB2NFJ1bGUubWVzc2FnZXNbbGFuZ0lkXTtcbiAgICAgICAgICAgICAgICBjaGVja05sc1t2NFJ1bGUuaWRdWzBdID0gY2hlY2tObHNbdjRSdWxlLmlkXS5ncm91cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsYW5nSWQgaW4gdjRSdWxlLmhlbHApIHtcbiAgICAgICAgICAgICAgICBjaGVja0hlbHBbdjRSdWxlLmlkXSA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVhc29uSWQgaW4gdjRSdWxlLmhlbHBbbGFuZ0lkXSkge1xuICAgICAgICAgICAgICAgICAgICBjaGVja0hlbHBbdjRSdWxlLmlkXVtyZWFzb25JZF0gPSBgLyR7bGFuZ0lkfS8ke3Y0UnVsZS5oZWxwW2xhbmdJZF1bcmVhc29uSWRdfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoZWNrTmxzW3Y0UnVsZS5pZF1bMF0gPSBjaGVja05sc1t2NFJ1bGUuaWRdLmdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENvbnZlcnQgUlNcbiAgICAgICAgZm9yIChjb25zdCByc1NlY3Rpb24gb2YgdjRSdWxlLnJ1bGVzZXRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzIG9mIGExMXlSdWxlc2V0cyBhcyBHdWlkZWxpbmVbXSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGVja1JzSWRzIDogc3RyaW5nW10gPSB0eXBlb2YgcnNTZWN0aW9uLmlkID09PSBcInN0cmluZ1wiID8gW3JzU2VjdGlvbi5pZF0gOiByc1NlY3Rpb24uaWQ7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrUnNJZHMuaW5jbHVkZXMocnMuaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgcnMuY2hlY2twb2ludHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGVja0NQSWRzIDogc3RyaW5nW10gPSB0eXBlb2YgcnNTZWN0aW9uLm51bSA9PT0gXCJzdHJpbmdcIiA/IFtyc1NlY3Rpb24ubnVtXSA6IHJzU2VjdGlvbi5udW07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDUElkcy5pbmNsdWRlcyhjcC5udW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AucnVsZXMgPSBjcC5ydWxlcyB8fCBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLnJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdjRSdWxlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb25Db2RlczogcnNTZWN0aW9uLnJlYXNvbkNvZGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogcnNTZWN0aW9uLmxldmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sa2l0TGV2ZWw6IHJzU2VjdGlvbi50b29sa2l0TGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuX2luaXRpYWxpemUoKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi4vYXBpL0lHdWlkZWxpbmVcbiAqL1xuZXhwb3J0IHR5cGUgUnVsZXNldCA9IEd1aWRlbGluZTtcblxuZXhwb3J0IGNsYXNzIENoZWNrZXIgaW1wbGVtZW50cyBJQ2hlY2tlciB7XG4gICAgcHJpdmF0ZSBndWlkZWxpbmVzOiBHdWlkZWxpbmVbXSA9IFtdO1xuXG4gICAgZW5naW5lOiBJRW5naW5lO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBnZXRHdWlkZWxpbmVzKCkuXG4gICAgICovXG4gICAgcnVsZXNldHM6IEd1aWRlbGluZVtdID0gdGhpcy5ndWlkZWxpbmVzO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBnZXRHdWlkZWxpbmVJZHMoKS5cbiAgICAgKi9cbiAgICBydWxlc2V0SWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHJ1bGVzZXRSdWxlczogeyBbcnNJZDogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgIHJ1bGVMZXZlbHMgOiB7IFtydWxlSWQ6IHN0cmluZ106IHsgW3JzSWQ6IHN0cmluZ10gOiBlUnVsZVBvbGljeSB9fSA9IHt9O1xuICAgIHJ1bGVSZWFzb25MZXZlbHMgOiB7IFtydWxlSWQ6IHN0cmluZ106IHsgW3JzSWQ6IHN0cmluZ10gOiB7W3JlYXNvbkNvZGVzOiBzdHJpbmddIDogZVJ1bGVQb2xpY3kgfX19ID0ge307XG4gICAgcnVsZUNhdGVnb3J5IDogeyBbcnVsZUlkOiBzdHJpbmddOiB7IFtyc0lkOiBzdHJpbmddIDogZUd1aWRlbGluZUNhdGVnb3J5IH19ID0ge307XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGxldCBlbmdpbmUgPSB0aGlzLmVuZ2luZSA9IG5ldyBFbmdpbmUoKTtcblxuICAgICAgICBlbmdpbmUuYWRkTWFwcGVyKG5ldyBBUklBTWFwcGVyKCkpO1xuXG4gICAgICAgIGVuZ2luZS5hZGRSdWxlcyhjaGVja1J1bGVzKTtcbiAgICAgICAgZW5naW5lLmFkZE5sc01hcChjaGVja05scyk7XG4gICAgICAgIGVuZ2luZS5hZGRIZWxwTWFwKGNoZWNrSGVscCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBycyBvZiBhMTF5UnVsZXNldHMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUnVsZXNldChycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZ3VpZGVsaW5lIHRvIHRoZSBlbmdpbmUuIElmIHRoZSBpZCBhbHJlYWR5IGV4aXN0cywgdGhlIHByZXZpb3VzIGd1aWRlbGluZSB3aWxsIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBndWlkZWxpbmUgXG4gICAgICovXG4gICAgYWRkR3VpZGVsaW5lKGd1aWRlbGluZTogR3VpZGVsaW5lKSB7XG4gICAgICAgIGlmIChndWlkZWxpbmUuaWQgaW4gdGhpcy5ydWxlc2V0UnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlR3VpZGVsaW5lKGd1aWRlbGluZS5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ndWlkZWxpbmVzLnB1c2goZ3VpZGVsaW5lKTtcbiAgICAgICAgdGhpcy5ydWxlc2V0SWRzLnB1c2goZ3VpZGVsaW5lLmlkKTtcbiAgICAgICAgY29uc3QgcnVsZUlkcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNwIG9mIGd1aWRlbGluZS5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgY3AucnVsZXMgPSBjcC5ydWxlcyB8fCBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBjcC5ydWxlcykge1xuICAgICAgICAgICAgICAgIGlmIChydWxlLmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGVJZHMucHVzaChydWxlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF0gPSB0aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5ydWxlTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF0gPSBydWxlLmxldmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVSZWFzb25MZXZlbHNbcnVsZS5pZF0gPSB0aGlzLnJ1bGVSZWFzb25MZXZlbHNbcnVsZS5pZF0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXVtndWlkZWxpbmUuaWRdID0gdGhpcy5ydWxlUmVhc29uTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBydWxlLnJlYXNvbkNvZGVzID8gcnVsZS5yZWFzb25Db2Rlcy5qb2luKCctLScpIDogXCJOb25lXCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXVtndWlkZWxpbmUuaWRdW2NvZGVdID0gcnVsZS5sZXZlbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZS5pZF0gPSB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZS5pZF1bZ3VpZGVsaW5lLmlkXSA9IGd1aWRlbGluZS5jYXRlZ29yeTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ydWxlc2V0UnVsZXNbZ3VpZGVsaW5lLmlkXSA9IHJ1bGVJZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGEgcnVsZSBmb3IgYWxsIGd1aWRlbGluZXNcbiAgICAgKiBAcGFyYW0gcnVsZUlkIFxuICAgICAqL1xuICAgIGVuYWJsZVJ1bGUocnVsZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgZm9yIChjb25zdCBndWlkZWxpbmUgb2YgdGhpcy5nZXRHdWlkZWxpbmVzKCkpIHtcbiAgICAgICAgICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNwIG9mIGd1aWRlbGluZS5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBjcC5ydWxlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5lbmFibGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcnVsZS5lbmFibGVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEd1aWRlbGluZShndWlkZWxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBhIHJ1bGUgZm9yIGFsbCBndWlkZWxpbmVzXG4gICAgICogQHBhcmFtIHJ1bGVJZCBcbiAgICAgKi9cbiAgICBkaXNhYmxlUnVsZShydWxlSWQ6IHN0cmluZykge1xuICAgICAgICBmb3IgKGNvbnN0IGd1aWRlbGluZSBvZiB0aGlzLmdldEd1aWRlbGluZXMoKSkge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgZ3VpZGVsaW5lLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNwLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEd1aWRlbGluZShndWlkZWxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZ3VpZGVsaW5lIGZyb20gdGhlIGVuZ2luZVxuICAgICAqIFxuICAgICAqIEdlbmVyYWxseSwgdGhlcmUgaXNuJ3QgYSBnb29kIHJlYXNvbiB0byBkbyB0aGlzLiBVc2VycyBzaG91bGQganVzdCBub3Qgc2VsZWN0IHRoZSBndWlkZWxpbmUgYXMgYW4gb3B0aW9uIGluIGNoZWNrXG4gICAgICogQHBhcmFtIGd1aWRlbGluZUlkXG4gICAgICovXG4gICAgcHJpdmF0ZSByZW1vdmVHdWlkZWxpbmUoZ3VpZGVsaW5lSWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoZ3VpZGVsaW5lSWQgaW4gdGhpcy5ydWxlc2V0UnVsZXMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJ1bGVzZXRSdWxlc1tndWlkZWxpbmVJZF07XG4gICAgICAgICAgICB0aGlzLnJ1bGVzZXRzID0gdGhpcy5ndWlkZWxpbmVzID0gdGhpcy5ndWlkZWxpbmVzLmZpbHRlcihndWlkZWxpbmUgPT4gZ3VpZGVsaW5lLmlkICE9PSBndWlkZWxpbmVJZCk7XG4gICAgICAgICAgICB0aGlzLnJ1bGVzZXRJZHMgPSB0aGlzLmdldEd1aWRlbGluZUlkcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBndWlkZWxpbmVzIGF2YWlsYWJsZSBpbiB0aGUgZW5naW5lXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2V0R3VpZGVsaW5lcygpIDogR3VpZGVsaW5lW10ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmd1aWRlbGluZXMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGlkcyBvZiB0aGUgZ3VpZGVsaW5lcyBhdmFpbGFibGUgaW4gdGhlIGVuZ2luZVxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGdldEd1aWRlbGluZUlkcygpIDogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlkZWxpbmVzLm1hcChndWlkZWxpbmUgPT4gZ3VpZGVsaW5lLmlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAZGVwcmVjYXRlZCBTZWUgYWRkR3VpZGVsaW5lXG4gICAgICovXG4gICAgYWRkUnVsZXNldChyczogUnVsZXNldCkge1xuICAgICAgICB0aGlzLmFkZEd1aWRlbGluZShycyk7XG4gICAgfVxuXG4gICAgZW5hYmxlU291cmNlTWFwKGVuYWJsZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmVuZ2luZS5lbmFibGVTb3VyY2VNYXAoZW5hYmxlKTtcbiAgICB9XG5cbiAgICBpc1NvdXJjZU1hcEVuYWJsZWQoKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUuaXNTb3VyY2VNYXBFbmFibGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybSBhIGNoZWNrIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS9kb2N1bWVudFxuICAgICAqIEBwYXJhbSBub2RlIERPTU5vZGUgb3IgRG9jdW1lbnQgb24gd2hpY2ggdG8gcnVuIHRoZSBjaGVja1xuICAgICAqIEBwYXJhbSBndWlkZWxpbmVJZHMgR3VpZGVsaW5lIGlkcyB0byBjaGVjayB3aXRoIHRvIHNwZWNpZnkgd2hpY2ggcnVsZXMgdG8gcnVuXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgY2hlY2sobm9kZTogTm9kZSB8IERvY3VtZW50LCBndWlkZWxpbmVJZHM/OiBzdHJpbmcgfCBzdHJpbmdbXSkgOiBQcm9taXNlPFJlcG9ydD4ge1xuICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggcnVsZXMgdG8gcnVuXG4gICAgICAgIGxldCBydWxlSWRzIDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAvLyBGaXggdGhlIGlucHV0XG4gICAgICAgIGlmICghZ3VpZGVsaW5lSWRzKSB7XG4gICAgICAgICAgICBydWxlSWRzID0gdGhpcy5lbmdpbmUuZ2V0UnVsZXNJZHMoKTtcbiAgICAgICAgfSBlbHNle1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBndWlkZWxpbmVJZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBndWlkZWxpbmVJZHMgPSBbZ3VpZGVsaW5lSWRzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCByc0lkIG9mIGd1aWRlbGluZUlkcykge1xuICAgICAgICAgICAgICAgIGlmIChyc0lkIGluIHRoaXMucnVsZXNldFJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGVJZHMgPSBydWxlSWRzLmNvbmNhdCh0aGlzLnJ1bGVzZXRSdWxlc1tyc0lkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9ICAgIFxuICAgICAgICB0aGlzLmVuZ2luZS5lbmFibGVSdWxlcyhydWxlSWRzKTtcbiAgICAgICAgLy8gQWRkIHRoZSByZXBvcnQgbGV2ZWxzXG4gICAgICAgIGxldCBteVRoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUucnVuKG5vZGUpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVwb3J0KSB7XG4gICAgICAgICAgICAgICAgcmVwb3J0Lm5scyA9IHt9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXBvcnQucmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJ1bGVJZCBpbiBjaGVja05scykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0Lm5sc1tyZXN1bHQucnVsZUlkXSA9IHJlcG9ydC5ubHNbcmVzdWx0LnJ1bGVJZF0gfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IGNoZWNrTmxzW3Jlc3VsdC5ydWxlSWRdWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlYXNvbklkIGluIGNoZWNrTmxzW3Jlc3VsdC5ydWxlSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0Lm5sc1tyZXN1bHQucnVsZUlkXVtyZXN1bHQucmVhc29uSWRdID0gY2hlY2tObHNbcmVzdWx0LnJ1bGVJZF1bcmVzdWx0LnJlYXNvbklkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvL3Jlc3VsdC52YWx1ZVswXSA9IG15VGhpcy5nZXRMZXZlbChndWlkZWxpbmVJZHMgYXMgc3RyaW5nW10sIHJlc3VsdC5ydWxlSWQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29kZSA9IHJlc3VsdC5yZWFzb25JZD8gcmVzdWx0LnJlYXNvbklkIGFzIHN0cmluZyA6IFwiTm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudmFsdWVbMF0gPSBteVRoaXMuZ2V0UmVhc29uTGV2ZWwoZ3VpZGVsaW5lSWRzIGFzIHN0cmluZ1tdLCByZXN1bHQucnVsZUlkLCBjb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNhdGVnb3J5ID0gbXlUaGlzLmdldENhdGVnb3J5KGd1aWRlbGluZUlkcyBhcyBzdHJpbmdbXSwgcmVzdWx0LnJ1bGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQucGF0aC5jc3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXBvcnQ7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgIHByaXZhdGUgZ2V0TGV2ZWwocnNJZHM6IHN0cmluZ1tdLCBydWxlSWQ6IHN0cmluZykgOiBlUnVsZVBvbGljeSB7XG4gICAgICAgIGlmICghcnNJZHMpIHJldHVybiBlUnVsZVBvbGljeS5JTkZPUk1BVElPTjtcbiAgICAgICAgbGV0IHJzSW5mbyA9IHRoaXMucnVsZUxldmVsc1tydWxlSWRdO1xuICAgICAgICBsZXQgcmV0VmFsID0gbnVsbDtcbiAgICAgICAgaWYgKHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlTGV2ZWxzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bGUgdHJpZ2dlcmVkIGZvciB3aGljaCB3ZSBoYXZlIG5vIHJ1bGUgbGV2ZWwgaW5mb3JtYXRpb246IFwiK3J1bGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgcnNJZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnNJZCBpbiByc0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzSW5mb1tyc0lkXSA9PT0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5WSU9MQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnNJbmZvW3JzSWRdID09PSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiAmJiByZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVsZSB0cmlnZ2VyZWQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gcnVsZSBsZXZlbCBpbmZvcm1hdGlvbjogXCIrcnVsZUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVhc29uTGV2ZWwocnNJZHM6IHN0cmluZ1tdLCBydWxlSWQ6IHN0cmluZywgcmVhc29uQ29kZT86IHN0cmluZykgOiBlUnVsZVBvbGljeSB7XG4gICAgICAgIGlmICghcnNJZHMpIHJldHVybiBlUnVsZVBvbGljeS5JTkZPUk1BVElPTjsgXG4gICAgICAgIGxldCByc0luZm8gPSB0aGlzLnJ1bGVSZWFzb25MZXZlbHNbcnVsZUlkXTtcbiAgICAgICAgbGV0IHJldFZhbCA9IG51bGw7XG4gICAgICAgIGlmIChyc0lkcykge1xuICAgICAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZVJlYXNvbkxldmVscykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uIFwiK3J1bGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgcnNJZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnNJZCBpbiByc0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVDb2RlID0gbmV3IFJlZ0V4cChgKF58LS0pJHtyZWFzb25Db2RlfSgkfC0tKWApO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyc0luZm9bcnNJZF0pLmZvckVhY2goY29kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGV2ZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09ICdOb25lJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IHJzSW5mb1tyc0lkXVtcIk5vbmVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZUNvZGUudGVzdChjb2RlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IHJzSW5mb1tyc0lkXVtjb2RlXTsgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PT0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LlZJT0xBVElPTjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsID09PSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiAmJiByZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT047IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LklORk9STUFUSU9OO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LklORk9STUFUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBcbiAgICAgICAgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVsZSB0cmlnZ2VyZWQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gcnVsZSBsZXZlbCBpbmZvcm1hdGlvbjogXCIrcnVsZUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2F0ZWdvcnkocnNJZHM6IHN0cmluZ1tdLCBydWxlSWQ/OiBzdHJpbmcpIDogZUd1aWRlbGluZUNhdGVnb3J5IHtcbiAgICAgICAgbGV0IHJzSW5mbyA9IHRoaXMucnVsZUNhdGVnb3J5W3J1bGVJZF07XG4gICAgICAgIGxldCByZXRWYWwgPSBcIlwiO1xuXG4gICAgICAgIGlmICghKHJ1bGVJZCBpbiB0aGlzLnJ1bGVDYXRlZ29yeSkpIHtcbiAgICAgICAgICAgIHJldHVybiBlR3VpZGVsaW5lQ2F0ZWdvcnkuT1RIRVI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyc0lkcykge1xuICAgICAgICAgICAgcnNJZHMgPSB0aGlzLmdldEd1aWRlbGluZUlkcygpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcnNJZCBvZiByc0lkcykge1xuICAgICAgICAgICAgaWYgKHJzSWQgaW4gcnNJbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJzSW5mb1tyc0lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZUd1aWRlbGluZUNhdGVnb3J5Lk9USEVSO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhX3RhcmdldF93YXJuaW5nOiBSdWxlID0ge1xuICAgIGlkOiBcImFfdGFyZ2V0X3dhcm5pbmdcIixcbiAgICBjb250ZXh0OiBcImRvbTphW3RhcmdldF0sZG9tOmFyZWFbdGFyZ2V0XSxkb206YmFzZVt0YXJnZXRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQV9UYXJnZXRBbmRUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF93YXJuXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFfdGFyZ2V0X3dhcm5pbmcuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYGFfdGFyZ2V0X3dhcm5pbmcuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF93YXJuXCI6IGBhX3RhcmdldF93YXJuaW5nLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZXJzIHNob3VsZCBiZSB3YXJuZWQgaW4gYWR2YW5jZSBpZiB0aGVpciBpbnB1dCBhY3Rpb24gd2lsbCBvcGVuIGEgbmV3IHdpbmRvd1wiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHVzZXIgaXMgd2FybmVkIGluIGFkdmFuY2UgdGhhdCB0aGUgaW5wdXQgYWN0aW9uIG9wZW5zIGEgbmV3IHdpbmRvd1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfd2FyblwiOiBcIkluZm9ybSB0aGUgdXNlciB3aGVuIHRoZWlyIGlucHV0IGFjdGlvbiB3aWxsIG9wZW4gYSBuZXcgd2luZG93XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMy4yLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBza2lwIHRoZSBydWxlIGlmIGl0J3MgQVQgaGlkZGVuIGFuZCBub3QgdGFiYmFibGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtV2luVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJuZXcgd2luZG93XCIsIFwibmV3IHRhYlwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0U3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdFN0ciA9PSBcIl9wYXJlbnRcIiB8fCB0U3RyID09IFwiX3NlbGZcIiB8fCB0U3RyID09IFwiX3RvcFwiIHx8IENvbW1vblV0aWwuZ2V0RnJhbWVCeU5hbWUocnVsZUNvbnRleHQsdFN0cikgIT0gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vIE5hbWUgaXMgbm90IHBhcnQgb2YgdGhpcyBmcmFtZXNldCDigJMgbXVzdCBoYXZlIHBvdGVudGlhbCB0byBjcmVhdGUgbmV3IHdpbmRvdz9cbiAgICAgICAgICAgIC8vIFNlZSBpZiBhIG5ldyB3aW5kb3cgaXMgbWVudGlvbmVkXG4gICAgICAgICAgICBsZXQgdGV4dFN0ciA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICB0ZXh0U3RyICs9IFwiIFwiICsgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENoZWNrIGFyaWEtZGVzY3JpYmVkYnkgZm9yIHdhcm5pbmcgdGV4dFxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVzY3JpYmVkYnlJZHMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGlkIG9mIGRlc2NyaWJlZGJ5SWRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWZlcmVuY2VkRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBpZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlc2NyaWJlZFRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChyZWZlcmVuY2VkRWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpYmVkVGV4dCAmJiBkZXNjcmliZWRUZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0ciArPSBcIiBcIiArIGRlc2NyaWJlZFRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCBwYXJhbXMucGFyYW1XaW5UZXh0LnZhbHVlLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGlmICh0ZXh0U3RyLmluZGV4T2YocGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZVtpXSkgIT0gLTEpIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfd2FyblwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcyB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhX3RleHRfcHVycG9zZTogUnVsZSA9IHtcbiAgICBpZDogXCJhX3RleHRfcHVycG9zZVwiLFxuICAgIC8vIGRvYy1iaWJsaW9yZWYgaXMgYSBsaW5rXG4gICAgY29udGV4dDogXCJhcmlhOmxpbmssYXJpYTpkb2MtYmlibGlvcmVmXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQV9IYXNUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2FjY19uYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgLFxuICAgICAgICAgICAgXCJwYXNzXCI6IGBhX3RleHRfcHVycG9zZS5odG1sYCxcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBgYV90ZXh0X3B1cnBvc2UuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSHlwZXJsaW5rcyBtdXN0IGhhdmUgYW4gYWNjZXNzaWJsZSBuYW1lIGZvciB0aGVpciBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJIeXBlcmxpbmsgaGFzIGEgZGVzY3JpcHRpb24gb2YgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBcIkh5cGVybGluayBoYXMgbm8gbGluayB0ZXh0LCBsYWJlbCBvciBpbWFnZSB3aXRoIGEgdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjQuNFwiLCBcIjQuMS4yXCJdLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogXCJjNDg3YWVcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFJ1bGUgb25seSBwYXNzZXMgaWYgYW4gZWxlbWVudCBoYXMgaW5uZXIgY29udGVudCxcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBvbmx5IGhpZGRlbiBjb250ZW50IHVuZGVyIHRoZSB0aGUgZWxlbWVudCBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgICBjb25zdCBhY2NOYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIChhY2NOYW1lX3BhaXIgJiYgYWNjTmFtZV9wYWlyLm5hbWUgJiYgYWNjTmFtZV9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgLyoqQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDAqL1xuICAgICAgICAgICAgfHwgQ29tbW9uVXRpbC5ub25UYWJhYmxlQ2hpbGRDaGVjayhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2FjY19uYW1lXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhcHBsZXRfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcHBsZXRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFwcGxldFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0FwcGxldF9IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGFwcGxldD4gZWxlbWVudHMgbXVzdCBwcm92aWRlIGFuICdhbHQnIGF0dHJpYnV0ZSBhbmQgYW4gYWx0ZXJuYXRpdmUgZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQW4gPGFwcGxldD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuICdhbHQnIGF0dHJpYnV0ZSB0aGF0IHByb3ZpZGVzIGEgc2hvcnQgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2FsdCcgYXR0cmlidXRlIHZhbHVlIGZvciBhbiA8YXBwbGV0PiBlbGVtZW50IGR1cGxpY2F0ZXMgdGhlICdjb2RlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiQW4gPGFwcGxldD4gZWxlbWVudCBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0LCBidXQgZG9lcyBub3QgcHJvdmlkZSBpbm5lciBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMS4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNvZGVcIikgJiYgYWx0ID09IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvZGVcIikudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FwcGxpY2F0aW9uX1JvbGVfVGV4dFwiOiB7XG4gICAgICAgICAgICAwOiBgSEFBQ19BcHBsaWNhdGlvbl9Sb2xlX1RleHQuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIDA6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIk5vbi1kZWNvcmF0aXZlIHN0YXRpYyB0ZXh0IGFuZCBpbWFnZSBjb250ZW50IHdpdGhpbiBhbiBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIG11c3QgYmUgYWNjZXNzaWJsZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBub24tZGVjb3JhdGl2ZSBzdGF0aWMgdGV4dCBhbmQgaW1hZ2UgY29udGVudCB3aXRoaW4gYW4gZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBhcmUgYWNjZXNzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIxLjEuMVwiLCBcIjIuMS4xXCJdLCAvL21hdGNoIGxpc3RpbmcgaW4gaGVscFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcnVsZUNvbnRleHQuY2hpbGROb2RlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZVZpc2libGUoY2hpbGRyZW5baV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhjaGlsZHJlbltpXSwgXCJkb2N1bWVudFwiKSB8fCBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwiYXJ0aWNsZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gY2hpbGRyZW5baV0ubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFyZWFfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmVhX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTphcmVhXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQXJlYV9IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyZWFfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmVhX2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJlYV9hbHRfZXhpc3RzLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxhcmVhPiBlbGVtZW50cyBpbiBhbiBpbWFnZSBtYXAgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCI8YXJlYT4gZWxlbWVudCBpbiBhbiBpbWFnZSBtYXAgaGFzIG5vIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMS4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbn1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb2x1bW5oZWFkZXIsIGFyaWE6aGVhZGluZywgYXJpYTpyb3doZWFkZXIsIGFyaWE6Z3JhcGhpY3MtZG9jdW1lbnQsYXJpYTpncmFwaGljcy1zeW1ib2wsIGFyaWE6aW1nLGFyaWE6aW1hZ2UsIGRvYy1iYWNrbGluaywgZG9jLWJpYmxpb2VudHJ5LCBkb2MtYmlibGlvcmVmLCBkb2MtZ2xvc3NyZWYsIGRvYy1ub3RlcmVmLCBkb2MtcGFnZWJyZWFrLCBkb2MtZXhhbXBsZVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lXCI6IFwiYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZV9pbWFnZVwiOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJBbiBhY2Nlc3NpYmxlIG5hbWUgaXMgcHJvdmlkZWQgZm9yIHRoZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lXCI6IFwiRWxlbWVudCA8ezB9PiB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaGFzIG5vIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZV9pbWFnZVwiOiBcIkVsZW1lbnQgPHswfT4gd2l0aCBcXFwiezF9XFxcIiByb2xlIGhhcyBubyBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyB3aXRoIGNlcnRhaW4gcm9sZXMgc2hvdWxkIGhhdmUgYWNjZXNzaWJsZSBuYW1lc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIl1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVfaW1hZ2VcIl1cbiAgICB9XSxcbiAgICBhY3Q6IFt7XCIyM2EyYThcIjogeyBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCI6IFwiZmFpbFwifX1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgLy8gc3ZnIGVsZW1lbnQgaXMgaGFuZGxlZCBpbiBzdmdfZ3JhcGhpY3NfbGFiYmVsbGVkIHJ1bGUgYW5kIGltYWdlIHJ1bGVzXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3N2ZycgfHwgbm9kZU5hbWUgPT09ICdpbWcnKSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvLyB3aGVuIHRhYmxlIGVsZW1lbnQgd2l0aCBhIGNhcHRpb24gYXMgZmlyc3QgY2hpbGRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAndGFibGUnIFxuICAgICAgICAgICAgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2NhcHRpb24nXG4gICAgICAgICAgICAmJiBydWxlQ29udGV4dC5maXJzdEVsZW1lbnRDaGlsZC50ZXh0Q29udGVudCAmJiBydWxlQ29udGV4dC5maXJzdEVsZW1lbnRDaGlsZC50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgY29uc3QgaW52YWxpZFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZFJvbGVzICYmIGludmFsaWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZFJvbGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkUm9sZXMgJiYgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldERlcHJlY2F0ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlidXRlcyAmJiBkZXByZWNhdGVkQXR0cmlidXRlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcm9sZSB8fCAhQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdIHx8ICFBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZVJlcXVpcmVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIW5hbWVfcGFpciB8fCAhbmFtZV9wYWlyLm5hbWUgfHwgbmFtZV9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHJvbGUgPT09ICdpbWcnIHx8IHJvbGUgPT09ICdpbWFnZScpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVfaW1hZ2VcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHJvbGVdKTsgXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcm9sZV0pO1xuICAgICAgICB9ICAgIFxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtYWN0aXZlZGVzY2VuZGFudF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0ludmFsaWRUYWJpbmRleEZvckFjdGl2ZWRlc2NlbmRhbnRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHswfT4gZWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBzZXQgdG8gXFxcInsxfVxcXCIgaXMgbm90IHRhYmJhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBzaG91bGQgYmUgdGFiYmFibGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBSdWxlIG5vdCBzdXBwb3J0ZWQgb24gbW9iaWxlXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKS5zdWJzdHJpbmcoMCwgMykgPT0gXCJtYmxcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIGJ5IGEgZGlzYWJsZWQgSFRNTDUgYXR0cmlidXRlIG9yIGFyaWEtZGlzYWJsZWQ6XG4gICAgICAgIC8vICAxLiBJbiB0aGUgY2FzZSB0aGF0IHRoaXMgZWxlbWVudCBoYXMgYSBkaXNhYmxlZCBhdHRyaWJ1dGUgYW5kIHRoZSBlbGVtZW50IHN1cHBvcnRzIGl0LCB3ZSBtYXJrIHRoaXMgcnVsZSBhcyBwYXNzZWQuXG4gICAgICAgIC8vICAyLiBJbiB0aGUgY2FzZSB0aGF0IHRoaXMgZWxlbWVudCBoYXMgYW4gYXJpYS1kaXNhYmxlZCBhdHRyaWJ1dGUgdGhlbiwgd2UgbWFyayB0aGlzIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAvLyBGb3IgYm90aCBvZiB0aGUgY2FzZXMgYWJvdmUgd2UgZG8gbm90IG5lZWQgdG8gcGVyZm9ybSBhbnkgZnVydGhlciBjaGVja3MsIGFzIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIGluIHNvbWUgZm9ybSBvciBhbm90aGVyLlxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGF0dHJpYnV0ZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyBibGFua1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gSWYgdGhlIHRhYmluZGV4IGF0dHJpYnV0ZSBpcyBwcm92aWRlZCB0aGVuIHZlcmlmeSB0aGF0IGl0IGlzIDAgb3IgLTFcbiAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgY2hpbGRyZW4gaXMgdGFiYmFibGUuIGluIHRoaXMgY2FzZSwgdGhlIHRhYiB3aWxsIHN0b3Agb24gdGhlIGZpcnN0IHRhYmJhYmxlIGVsZW1lbnRcbiAgICAgICAgaWYgKCFwYXNzZWQpIFxuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5nZXRUYWJiYWJsZUNoaWxkcmVuKHJ1bGVDb250ZXh0KSA+IDA7XG5cbiAgICAgICAgLy8gQnVpbGQgYXJyYXkgZm9yIG5vZGUgdG9rZW5cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjEucHVzaChub2RlTmFtZSk7XG5cbiAgICAgICAgLy8gQnVpbGQgYXJyYXkgZm9yIGlkIHJlZmVyZW5jZWQgYnkgYXJpYS1hY3RpdmVkZXNjZW5kYW50XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2gocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpLnNwbGl0KFwiIFwiKS5qb2luKFwiLCBcIikpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLWFjdGl2ZWRlc2NlbmRhbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FjdGl2ZURlc2NlbmRhbnRDaGVja1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgICAgICAvLyBcIkZhaWxfNFwiOiBcIkZhaWxfNFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfNFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIHByb3BlcnR5IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSByZWZlcmVuY2VzIGEgaGlkZGVuIG5vZGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRWxlbWVudCBpcyBub3QgYSBjb21ib2JveCwgYW5kIHRoZSByZWZlcmVuY2VkIGFjdGl2ZS1kZXNjZW5kYW50IGVsZW1lbnQgaXMgbm90IGEgdmFsaWQgZGVzY2VuZGFudFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzRcIjogXCJFbGVtZW50IGlzIGEgY29tYm9ib3gsIGFuZCB0aGUgcmVmZXJlbmNlZCBhY3RpdmUtZGVzY2VuZGFudCBlbGVtZW50IGlzIG5vdCBjb250cm9sbGVkIGJ5IHRoaXMgY29tcG9uZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIHByb3BlcnR5IG11c3QgcmVmZXJlbmNlIHRoZSAnaWQnIG9mIGEgbm9uLWVtcHR5LCBub24taGlkZGVuIGFjdGl2ZSBjaGlsZCBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gY29tYm9ib3ggYWN0aXZlIGRlc2NlbmRhbnRzIGhhbmRsZWQgYnkgJ2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50J1xuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZXNjZW5kYW50X2lkID0gQXJpYVV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgIC8vIFBPRjE6IFRoZSBhdHRyaWJ1dGUgaXMgZW1wdHlcbiAgICAgICAgaWYgKCFkZXNjZW5kYW50X2lkIHx8IGRlc2NlbmRhbnRfaWQudHJpbSgpID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVzY2VuZGFudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBkZXNjZW5kYW50X2lkLnRyaW0oKSk7XG4gICAgICAgIGlmICghZGVzY2VuZGFudCB8fCBET01VdGlsLnNhbWVOb2RlKGRlc2NlbmRhbnRfaWQsIHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgLy8gVGhlIHJlZmVyZW5jZWQgZWxlbWVudCBkb2Vzbid0IGV4aXN0LiBXZSBsZXQgMTA3NyB0byB0cmlnZ2VyIHRoZSBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgLy8gUE9GMjogYXJpYS1hY3RpdmVkZXNjZW5kYW50IHJlZmVyZW5jZXMgYSBoaWRkZW4gbm9kZVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMS4gVGhlIHZhbHVlIG9mIGFyaWEtYWN0aXZlZGVzY2VuZGFudCByZWZlcnMgdG8gYW4gZWxlbWVudCB0aGF0IGlzIGVpdGhlciBhIGRlc2NlbmRhbnQgb2YgXG4gICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggRE9NIGZvY3VzXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvZklkID0gMjtcblxuICAgICAgICAvLyBvciBpcyBhIGxvZ2ljYWwgZGVzY2VuZGFudCBhcyBpbmRpY2F0ZWQgYnkgdGhlIGFyaWEtb3ducyBhdHRyaWJ1dGUuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgIGxldCBvd25lZF9pZHMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnRyaW0oKSkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvd25lZF9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb3duZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIG93bmVkX2lkc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKG93bmVkX2VsZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShvd25lZF9lbGUsIHJ1bGVDb250ZXh0KSAmJiBvd25lZF9lbGUuY29udGFpbnMoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIFRoZSBlbGVtZW50IHdpdGggRE9NIGZvY3VzIGlzIGEgdGV4dGJveCB3aXRoIGFyaWEtY29udHJvbHMgcmVmZXJyaW5nIHRvIGFuIGVsZW1lbnQgdGhhdCBcbiAgICAgICAgLy8gIHN1cHBvcnRzIGFyaWEtYWN0aXZlZGVzY2VuZGFudCwgYW5kIHRoZSB2YWx1ZSBvZiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgc3BlY2lmaWVkIGZvciB0aGUgXG4gICAgICAgIC8vICB0ZXh0Ym94IHJlZmVycyB0byBlaXRoZXIgYSBkZXNjZW5kYW50IG9mIHRoZSBlbGVtZW50IGNvbnRyb2xsZWQgYnkgdGhlIHRleHRib3ggb3IgaXMgYSBsb2dpY2FsIFxuICAgICAgICAvLyAgZGVzY2VuZGFudCBvZiB0aGF0IGNvbnRyb2xsZWQgZWxlbWVudCBhcyBpbmRpY2F0ZWQgYnkgdGhlIGFyaWEtb3ducyBhdHRyaWJ1dGUuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDM7XG4gICAgICAgICAgICBsZXQgY29udHJvbGxlZF9pZHMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbGxlZF9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udHJvbGxlZF9lbGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgY29udHJvbGxlZF9pZHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVkX2VsZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShjb250cm9sbGVkX2VsZSwgcnVsZUNvbnRleHQpICYmIGNvbnRyb2xsZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZWRfZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duc19pZHMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udHJvbGxlZF9lbGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnRyaW0oKSkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG93bnNfaWRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIG93bnNfaWRzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZWRfZWxlLCBydWxlQ29udGV4dCkgJiYgb3duZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMzogSSdtIG5vdCBhIGNvbWJvYm94LCBhbmQgdGhlIHJlZmVyZW5jZWQgYWN0aXZlLWRlc2NlbmRhbnQgaXMgbm90IGEgZGVzY2VuZGFudCBhbmQgbm90IG93bmVkIGJ5IHRoZSBlbGVtZW50IFxuICAgICAgICAvLyB0aGF0IHJlZmVyZW5jZWQgaXQuXG4gICAgICAgIGlmIChwb2ZJZCA9PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUFwcGxpY2F0aW9uTGFuZG1hcmtzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwiYXBwbGljYXRpb25cIik7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXBwbGljYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0FwcGxpY2F0aW9uTGFuZG1hcmtMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9ub19sYWJlbFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2xhYmVsXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBoYXMgYSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2xhYmVsXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2xhYmVsXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXJ0aWNsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVBcnRpY2xlUm9sZXNfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImFydGljbGVcXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImFydGljbGVcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJhcnRpY2xlXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJhcnRpY2xlXCIpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9WYWxpZFByb3BlcnR5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyaWFfYXR0cmlidXRlX2FsbG93ZWQuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIGF0dHJpYnV0ZXMgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQncyByb2xlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBhdHRyaWJ1dGUocykgJ3swfScgcmVmZXJlbmNlZCBieSB0aGUgZWxlbWVudCA8ezF9PiBpcyBub3QgYSB2YWxpZCBBUklBIHN0YXRlIG9yIHByb3BlcnR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNWY5OWE3XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgXG4gICAgICAgIC8vIFRoaXMgZ2V0cyBhbGwgZWxlbWVudHMgd2l0aCBhdHRyaWJ1dGVzIHNvIHdlIHN0aWxsIGhhdmUgc29tZVxuICAgICAgICAvLyBPdXQgb2YgU2NvcGUgc2luY2Ugbm90IGFsbCBhdHRyaWJ1dGVzIGFyZSBhcmlhIFxuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgbGV0IHByb3BlcnR5RGF0YVR5cGVzID0gQVJJQURlZmluaXRpb25zLnByb3BlcnR5RGF0YVR5cGVzO1xuICAgICAgICAgICAgbGV0IGZhaWxlZFByb3BlcnRpZXMgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IHRlc3RlZFByb3BlcnRpZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGNvbnRleHRBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgLy8gTm93IHdlIGp1c3QgaGF2ZSBhcmlhIGF0dHJpYnV0ZXMgd2hpY2ggY2FuXG4gICAgICAgICAgICAgICAgICAgIC8vIHBhc3Mgb3IgZmFpbCBiYXNlZCBvbiB3aGV0aGVyIHRoZXJlIHByb3BlcnR5IGlzIHZhbGlkXG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVHlwZXMgPSBwcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YVR5cGVzKSB7IC8vIGlmIHByb3BlcnR5IGlzIG5vdCBpbiB2YWxpZCBwcm9wZXJ0eSBsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZmFpbGVkUHJvcGVydGllcyBjb21tYSBzZXAgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxlZFByb3BlcnRpZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRQcm9wZXJ0aWVzID0gYXR0ck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZFByb3BlcnRpZXMgPSBmYWlsZWRQcm9wZXJ0aWVzICsgXCIsIFwiICsgYXR0ck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGVzdGVkUHJvcGVydGllcyA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZhaWxlZFByb3BlcnRpZXMubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2ZhaWxlZFByb3BlcnRpZXMsIHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSkNIIC0gcGFzc2luZyBpcyBiYXNlZCBvbiBhbGwgYXR0cmlidXRlcyBub3QganVzdCBhcmlhIGF0dHJpYnV0ZXNcbiAgICAgICAgLy8gICAgICAgbGVhZGluZyB0byBPVkVSIENPVU5USU5HIHNvIG1vdmVkIHBhc3MgdXBcbiAgICAgICAgLy9yZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgfVxufVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3Q6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3RcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtcmVxdWlyZWRdLCBkb206KlthcmlhLWF1dG9jb21wbGV0ZV0sIGRvbToqW2FyaWEtcmVhZG9ubHldLCBkb206KlthcmlhLWRpc2FibGVkXSwgZG9tOipbYXJpYS1wbGFjZWhvbGRlcl1cIiBcbiAgICAgICAgICAgICsgXCIsIGRvbToqW2FyaWEtY2hlY2tlZF0sIGRvbToqW2FyaWEtaGlkZGVuXSwgZG9tOipbYXJpYS12YWx1ZW1heF0sIGRvbToqW2FyaWEtdmFsdWVtaW5dLCBkb206KlthcmlhLWNvbHNwYW5dXCJcbiAgICAgICAgICAgICsgXCIsIGRvbToqW2FyaWEtcm93c3Bhbl1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2NvbmZsaWN0XCI6IFwiYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBpcyBub3QgY29uZmxpY3Qgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBIVE1MIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2NvbmZsaWN0XCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIGlzIGluIGNvbmZsaWN0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBBUklBIGF0dHJpYnV0ZSBtdXN0IG5vdCBjb25mbGljdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy8gZGVwZW5kZW5jeSBjaGVjazogaWYgdGhlIEFSSUEgYXR0cmlidXRlIGlzIGNvbXBsZXRlbHkgaW52YWxpZCwgc2tpcCB0aGlzIGNoZWNrXG4gICAgICAgIGxldCBpbnZhbGlkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldEludmFsaWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChpbnZhbGlkQXR0cmlidXRlcyAmJiBpbnZhbGlkQXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGxldCBhcmlhQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWFyaWFBdHRyaWJ1dGVzIHx8IGFyaWFBdHRyaWJ1dGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGNvbmZsaWN0QXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25mbGljdEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9jb25mbGljdFwiLCBbY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydhcmlhQXR0ciddLCBjb25mbGljdEF0dHJpYnV0ZXNbaV1bJ2h0bWxBdHRyJ11dKSk7XG4gICAgICAgICAgICBpZiAoYXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydhcmlhQXR0ciddKSlcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoW2NvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXV0sIGFyaWFBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuXG4gICAgICAgIHJldHVybiBudWxsOyAgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfcm9sZVwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JvbGVfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiVGhlIEFSSUEgcm9sZXMgYW5kIGF0dHJpYnV0ZSBhcmUgdXNlZCBwZXIgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfcm9sZVwiOiBcIlRoZSBBUklBIHJvbGUgXFxcInswfVxcXCIgaXMgZGVwcmVjYXRlZCBpbiB0aGUgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcImZhaWxfYXJpYV9hdHRyXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlcyBcXFwiezB9XFxcIiBhcmUgZGVwcmVjYXRlZCBpbiB0aGUgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcImZhaWxfcm9sZV9hdHRyXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlcyBcXFwiezB9XFxcIiBhcmUgZGVwcmVjYXRlZCBmb3IgdGhlIHJvbGUgXFxcInsxfVxcXCIgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk5vIGRlcHJlY2F0ZWQgQVJJQSByb2xlIG9yIGF0dHJpYnV0ZSBzaG91bGQgYmUgdXNlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkUm9sZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYVJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRSb2xlcyAmJiBkZXByZWNhdGVkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXByZWNhdGVkUm9sZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoJ2ZhaWxfYXJpYV9yb2xlJywgW2RlcHJlY2F0ZWRSb2xlc1tpXV0pKTsgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXByZWNhdGVkQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIFwicm9sZVwiOlwiYW55XCIsIFwiYXR0cmlidXRlXCI6YXJpYUF0dHJzW2ldfVxuICAgICAgICAgICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5yb2xlID09PSAnYW55JylcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoJ2ZhaWxfYXJpYV9hdHRyJywgW2RlcHJlY2F0ZWRBdHRyaWJ1dGVzW2ldLmF0dHJpYnV0ZV0pKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX3JvbGVfYXR0cicsIFtkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5hdHRyaWJ1dGUsIGRlcHJlY2F0ZWRBdHRyaWJ1dGVzW2ldLnJvbGVdKSk7XG4gICAgICAgICAgICB9ICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfRW1wdHlQcm9wZXJ0eVZhbHVlXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIjogXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfZW1wdHlfYXR0cmlidXRlXCI6IFwiVGhlIGVsZW1lbnQgYXR0cmlidXRlKHMpOiAnezB9JyB2YWx1ZSBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIldoZW4gc3BlY2lmeWluZyBhIHJlcXVpcmVkIEFSSUEgYXR0cmlidXRlLCB0aGUgdmFsdWUgbXVzdCBub3QgYmUgZW1wdHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtcIjZhNzI4MVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IENvbW1vblV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBsZXQgdGVzdGVkUHJvcGVydGllcyA9IDA7XG5cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXJvbGUpIHJldHVybjtcbiAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFyaWFVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZSwgcnVsZUNvbnRleHQpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCByZXF1aXJlZFJvbGVQcm9wcyA9IEFyaWFVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJlcXVpcmVkUm9sZVByb3BzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9IHJlcXVpcmVkUm9sZVByb3BzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShyZXF1aXJlZFJvbGVQcm9wc1tpXSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlLmxlbmd0aCA9PSAwKSBhdHRyTmFtZUFyci5wdXNoKHJlcXVpcmVkUm9sZVByb3BzW2ldKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS1sYWJlbGxlZGJ5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChyb2xlID09IFwicmFkaW9ncm91cFwiKSAmJiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkgYXR0ck5hbWVBcnIucHVzaChcImFyaWEtbGFiZWxcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS12YWx1ZW5vd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocm9sZSA9PSBcInByb2dyZXNzYmFyXCIpICYmIChoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS12YWx1ZXRleHRcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtdmFsdWV0ZXh0XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDApIGF0dHJOYW1lQXJyLnB1c2goXCJhcmlhLXZhbHVldGV4dFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVdKSB7XG4gICAgICAgICAgICBsZXQgdGFnUHJvcGVydHkgPSBBcmlhVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGxldCBwZXJtaXR0ZWRSb2xlcyA9IFtdO1xuICAgICAgICAgICAgcGVybWl0dGVkUm9sZXMucHVzaChyb2xlKTtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcGVybWl0dGVkUm9sZXMsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBhbGxvd2VkQXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBhbGxvd2VkQXR0cmlidXRlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlID09IFwiYXJpYS1jaGVja2VkXCIgfHwgYXR0cmlidXRlID09IFwiYXJpYS1zZWxlY3RlZFwiIHx8XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9PSBcImFyaWEtZXhwYW5kZWRcIiB8fCBhdHRyaWJ1dGUgPT0gXCJhcmlhLW9yaWVudGF0aW9uXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlID09IFwiYXJpYS1sZXZlbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWUgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCAmJiAhYXR0ck5hbWVBcnIuaW5jbHVkZXMoYXR0cmlidXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRNc2cgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwO1xuICAgICAgICByZXRNc2cucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcmV0TXNnKTtcbiAgICAgICAgaWYgKHRlc3RlZFByb3BlcnRpZXMgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIiwgcmV0TXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLXJlcXVpcmVkXSwgZG9tOipbYXJpYS1hdXRvY29tcGxldGVdLCBkb206KlthcmlhLXJlYWRvbmx5XSwgZG9tOipbYXJpYS1kaXNhYmxlZF0sIGRvbToqW2FyaWEtcGxhY2Vob2xkZXJdXCIgXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLWNoZWNrZWRdLCBkb206KlthcmlhLWhpZGRlbl0sIGRvbToqW2FyaWEtdmFsdWVtYXhdLCBkb206KlthcmlhLXZhbHVlbWluXSwgZG9tOipbYXJpYS1jb2xzcGFuXVwiXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLXJvd3NwYW5dXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlIGlzIG5vdCByZWR1bmRhbnQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGUgXFxcInswfVxcXCIgaXMgcmVkdW5kYW50IHdpdGggdGhlIEhUTUwgYXR0cmlidXRlIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gQVJJQSBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSByZWR1bmRhbnQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIHRoZSBBUklBIGF0dHJpYnV0ZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgICAgICBsZXQgaW52YWxpZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZEF0dHJpYnV0ZXMgJiYgaW52YWxpZEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlmIGNvbmZsaWN0IGFscmVhZHkgcmVwb3J0ZWQsIGlnbm9yZSByZXBvcnRpbmcgb3ZlcmxhcFxuICAgICAgICBsZXQgY29uZmxpY3RBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0Q29uZmxpY3RBcmlhQW5kSHRtbEF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY29uZmxpY3RBdHRyaWJ1dGVzICYmIGNvbmZsaWN0QXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgYXJpYUF0dHJzID0gW107XG4gICAgICAgIGxldCBodG1sQXR0cnMgPSBbXTtcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsgXG4gICAgICAgICAgICAgICAgbGV0IGF0dHJWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gJycpIGF0dHJWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykgXG4gICAgICAgICAgICAgICAgICAgIGFyaWFBdHRycy5wdXNoKHtuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZX0pO1xuICAgICAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRycy5wdXNoKHtuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gQXJpYVV0aWwuZ2V0Q29uZmxpY3RPck92ZXJsYXBwaW5nSHRtbEF0dHJpYnV0ZShhcmlhQXR0cnNbaV0sIGh0bWxBdHRycywgJ292ZXJsYXBwaW5nJyk7XG4gICAgICAgICAgICBpZiAoZXhhbWluZWRIdG1sQXRyTmFtZXMgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdQYXNzJykgeyAvL3Bhc3NcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW1bJ3Jlc3VsdCddID09PSAnRmFpbGVkJykgeyAvL2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfcmVkdW5kYW50XCIsIFthcmlhQXR0cnNbaV1bJ25hbWUnXSwgaXRlbVsnYXR0ciddXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pOyAgICBcbiAgICAgICAgfSAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1JlcXVpcmVkUHJvcGVydGllc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9taXNzaW5nXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkLmh0bWxgLFxuICAgICAgICAgICAgXCJwYXNzXCI6IGBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC5odG1sYCxcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nXCI6IGBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgcmVxdWlyZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnQgd2l0aCBhIHJvbGUgbXVzdCBiZSBkZWZpbmVkXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgcmVxdWlyZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnQgd2l0aCB0aGUgcm9sZSBhcmUgZGVmaW5lZFwiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdcIjogXCJFbGVtZW50IHdpdGggJ3swfScgcm9sZSBkb2VzIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBBUklBIGF0dHJpYnV0ZShzKTogJ3sxfSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCI0LjEuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI0ZThhYjZcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgYXR0ck5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgLy9sZXQgaW1wbGljaXRSb2xlID0gQVJJQU1hcHBlci5lbGVtVG9JbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICAvL2xldCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgaGFzQXR0cmlidXRlID0gQ29tbW9uVXRpbC5oYXNBdHRyaWJ1dGU7XG4gICAgICAgIGxldCB0ZXN0ZWRSb2xlcyA9IDA7XG5cbiAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFyb2xlKSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcmVxdWlyZWRSb2xlUHJvcHMgPSBBcmlhVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGUsIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVdICYmIHJlcXVpcmVkUm9sZVByb3BzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgYWxsb3dlZFJvbGVQcm9wcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcm9sZSwgdGFnUHJvcGVydHkpO1xuICAgICAgICAgICAgbGV0IHJvbGVNaXNzaW5nUmVxUHJvcCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHByb3BlcnRpZXNMZW5ndGggPSByZXF1aXJlZFJvbGVQcm9wcy5sZW5ndGg7IGkgPCBwcm9wZXJ0aWVzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFsbG93ZWRSb2xlUHJvcHMuaW5jbHVkZXMocmVxdWlyZWRSb2xlUHJvcHNbaV0pKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgcmVxdWlyZWRSb2xlUHJvcHNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIGFyaWEtbGFiZWxsZWRieSBpc24ndCBwcmVzZW50LCBhbiBhcmlhLWxhYmVsIHdpbGwgbWVldCB0aGUgcmVxdWlyZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtbGFiZWxsZWRieVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbFwiKSkgfHwgKHJvbGUgIT0gXCJyYWRpb2dyb3VwXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU1pc3NpbmdSZXFQcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtdmFsdWVub3dcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtdmFsdWV0ZXh0XCIpKSB8fCAocm9sZSAhPSBcInByb2dyZXNzYmFyXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU1pc3NpbmdSZXFQcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtY29udHJvbHNcIiAmJiByb2xlID09IFwiY29tYm9ib3hcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIGNoZWNrIHNpbmNlIGFyaWEtY29udHJvbHMgaW4gdGhlIHRleHRib3ggb2YgYSBjb21ib2JveCBpcyBhbHJlYWR5IGhhbmRsZWQgaW4gcnVsZSBIQUFDX0NvbWJvYm94X011c3RfaGF2ZV9UZXh0X0lucHV0XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKHJlcXVpcmVkUm9sZVByb3BzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm9sZU1pc3NpbmdSZXFQcm9wID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByb2xlTmFtZUFyci5wdXNoKHJvbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gcm9sZU5hbWVBcnIubGVuZ3RoID09IDAgfHwgYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7IC8vIG9ubHkgYXJpYSBhdHRyaWJ1dGVzIHNvIE5PIE9VVCBPRiBTQ09QRVxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICByZXRUb2tlbi5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX21pc3NpbmdcIiwgcmV0VG9rZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRQcm9wZXJ0eVZhbHVlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIHByb3BlcnR5IHZhbHVlcyBtdXN0IGJlIHZhbGlkXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSB2YWx1ZSBcXFwiezB9XFxcIiBzcGVjaWZpZWQgZm9yIGF0dHJpYnV0ZSAnezF9JyBvbiBlbGVtZW50IDx7Mn0+IGlzIG5vdCB2YWxpZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI2YTcyODFcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdmFsdWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkYXRhVHlwZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcHJvcGVydHlEYXRhVHlwZXMgPSBBUklBRGVmaW5pdGlvbnMucHJvcGVydHlEYXRhVHlwZXM7XG4gICAgICAgIGxldCBjb250ZXh0QXR0cmlidXRlcyA9IHJ1bGVDb250ZXh0LmF0dHJpYnV0ZXM7XG4gICAgICAgIGxldCB0ZXN0ZWRQcm9wZXJ0eVZhbHVlcyA9IDA7XG5cbiAgICAgICAgaWYgKGNvbnRleHRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gY29udGV4dEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlcyA9IHByb3BlcnR5RGF0YVR5cGVzW2F0dHJOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0eVZhbHVlcysrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMudmFsdWVzLmluZGV4T2Yobm9kZVZhbHVlKSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMudmFsdWVzLmluZGV4T2YoJ3VuZGVmaW5lZCcpICE9IC0xICYmIG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RyYW5zbGF0ZSAndW5kZWZpbmVkJyB0byBtZWFuICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJpYS1yZWxldmFudCBpcyByZXByZXNlbnRlZCBhcyBhIHNwYWNlIGRlbGltaXRlZCBsaXN0IG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkaXRpb25zLCByZW1vdmFscywgdGV4dDsgb3IgYSBzaW5nbGUgY2F0Y2gtYWxsIHZhbHVlIGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcy50eXBlID09PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5zXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWVzID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgYWxsIGlzIHNwZWNpZmllZCwgaXQgY2Fubm90IGhhdmUgYW55IG90aGVyIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0clZhbHVlcy5sZW5ndGggPiAxICYmIGF0dHJWYWx1ZXMuaW5jbHVkZXMoXCJhbGxcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZS5zcGxpdChcIiBcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc2ggPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJWYWx1ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGluZGl2aWR1YWwgdmFsdWUgaXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWVzW2pdICE9IFwiXCIgJiYgIWRhdGFUeXBlcy52YWx1ZXMuaW5jbHVkZXMoYXR0clZhbHVlc1tqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzaC5oYXNPd25Qcm9wZXJ0eShhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoW2F0dHJOYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKGF0dHJWYWx1ZXNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGVBcnIucHVzaChkYXRhVHlwZXMudmFsdWVzLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGVBcnIucHVzaChkYXRhVHlwZXMudmFsdWVzLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiBkYXRhVHlwZXMudHlwZSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlWYWwgPSBwYXJzZUludChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGlWYWwpIHx8IChcIlwiICsgaVZhbCAhPT0gbm9kZVZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2gobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmVmFsID0gcGFyc2VGbG9hdChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGZWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiAoZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG1wViA9IG5vZGVWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXBWICE9PSBcInRydWVcIiAmJiB0bXBWICE9PSBcImZhbHNlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlICYmIChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydHlWYWx1ZXMtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0TXNnID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhdHRyTmFtZUFyci5sZW5ndGggPT0gMDtcbiAgICAgICAgcmV0TXNnLnB1c2godmFsdWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgcmV0TXNnLnB1c2goYXR0ck5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgcmV0TXNnLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIC8vIHJldE1zZy5wdXNoIChkYXRhVHlwZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcmV0TXNnKTtcbiAgICAgICAgaWYgKHRlc3RlZFByb3BlcnR5VmFsdWVzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCByZXRNc2cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YmFubmVyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUJhbm5lckxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImJhbm5lclwiLCB0cnVlKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYmFubmVyX3NpbmdsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Jhbm5lcl9zaW5nbGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206aGVhZGVyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9PbmVCYW5uZXJJblNpYmxpbmdTZXRfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYmFubmVyX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImJhbm5lclxcXCIgcm9sZSBmb3VuZCBvbiB0aGUgcGFnZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgcGFnZSwgZG9jdW1lbnQsIG9yIGFwcGxpY2F0aW9uIHNob3VsZCBvbmx5IGhhdmUgb25lIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICghQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImJhbm5lclwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIEFyaWFVdGlsLmdldFNpYmxpbmdXaXRoUm9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICBcImJhbm5lclwiLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKSA9PT0gbnVsbDtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2NoaWxkX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY2hpbGRfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX01pc3NpbmdGb2N1c2FibGVDaGlsZFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ19jaGlsZFwiOiBcImZhaWxfbWlzc2luZ19jaGlsZFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfY2hpbGRfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJhcmlhX2NoaWxkX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NoaWxkX3RhYmJhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ19jaGlsZFwiOiBcIk5vbmUgb2YgdGhlIGRlc2NlbmRlbnQgZWxlbWVudHMgd2l0aCBcXFwiezF9XFxcIiByb2xlIGlzIHRhYmJhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVUkgY29tcG9uZW50IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdGFiYmFibGUgZGVzY2VuZGFudCBmb3Iga2V5Ym9hcmQgYWNjZXNzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCByZXF1aXJlcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmIChBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSB8fCBBcmlhVXRpbC5zaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIEFuIEFSSUEgbGlzdCBpcyBub3QgaW50ZXJhY3RpdmVcbiAgICAgICAgaWYgKEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHsgXCJsaXN0XCI6IHRydWUsIFwicm93XCI6IHRydWUsIFwicm93Z3JvdXBcIjogdHJ1ZSwgXCJ0YWJsZVwiOiB0cnVlLCBcImdyaWRcIjogdHJ1ZSB9KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3QgYSB2YWxpZCBtZXNzYWdlIGZvciBtb2JpbGUgYmVjYXVzZSBhbGwgZWxlbWVudHMgYXJlIGZvY3VzYWJsZSBpbiBpT1Mgd2hlbiBWb2ljZU92ZXIgaXMgZW5hYmxlZC5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNsYXNzXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNsYXNzXCIpLnN1YnN0cmluZygwLCAzKSA9PSBcIm1ibFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2RhdGFsaXN0JylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgZWxlbWVudCdzIG5hdmlnYXRpb24gaXMgY29udHJvbGxlZCBieSBhbm90aGVyIGVsZW1lbnQsIHN1Y2ggYXMgY29tYm9ib3hcbiAgICAgICAgaWYgKEFyaWFVdGlsLmlzTmF2aWdhdGlvbk93bmVkT3JDb250cm9sbGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgXG5cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IFwiXCI7XG4gICAgICAgIGxldCBpblNjb3BlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5jb250YWluZXJzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICBsZXQgZGlzYWJsZWQgPSBoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWRpc2FibGVkJykgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpIDogJyc7XG4gICAgICAgICAgICBpZiAoZGlzYWJsZWQgIT0gJ3RydWUnICYmICFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnKSAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIGxldCByZXFDaGlsZHJlbiA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yZXFDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICBpZiAocmVxQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgaW5TY29wZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeHAgPSBcImRlc2NlbmRhbnQ6OipbXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhwICs9IFwiQHJvbGU9J1wiICsgcmVxQ2hpbGRyZW5baV0gKyBcIicgb3IgXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeHAgPSB4cC5zdWJzdHJpbmcoMCwgeHAubGVuZ3RoIC0gNCkgKyAnXSc7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdCA9IGRvYy5ldmFsdWF0ZSh4cCwgcnVsZUNvbnRleHQsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcjogRWxlbWVudCA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIgJiYgIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgMS4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmlzVGFiYmFibGUocik7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVpcmVkIGNoaWxkIGlzIG5vdCBmb2N1c2FibGUgdmlhIHRhYmluZGV4LiBTZWUgaWYgdGhlcmUgaXMgYSBncmFuZGNoaWxkIHRoYXQgaXMgZm9jdXNhYmxlIGJ5IGRlZmF1bHQgb3IgYnkgdGFiaW5kZXguXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cDIgPSBcImRlc2NlbmRhbnQ6OipcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgciwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIgPSByLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGUgYXJyYXlzL3N0cmluZ3MgYXJlIGVtcHR5LCB0aGF0IG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gdmlvbGF0aW9uIHNvIHdlIGNhbiByZXNldCBpdCBiYWNrIHRvIHBhc3NlZCwgdGhlIHJlYXNvbiBmb3IgdGhpc1xuICAgICAgICAvLyBpcyB0aGF0IHdlIGFyZSBzZXR0aW5nIHBhc3NlZD1mYWxzZSB3aGlsZSB3ZSBwZXJmb3JtIGEgbG9vcCB3aGljaCBjYXVzZXMgdmlvbGF0aW9uIHRvIHRyaWdnZXIgZXZlbiBpZiB0aGVyZSBpcyBubyBpc3N1ZXMuIEluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXBkYXRpbmcgdGhlIHdob2xlIHJ1bGUgdG8gc3dpdGNoIGZyb20gdXNpbmcgcGFzc2VkIGluIHRoYXQgd2F5IHNpbXBseSBkbyB0aGUgY2hlY2sgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgaWYgKG5vZGVOYW1lLmxlbmd0aCA+IDAgJiYgcm9sZU5hbWVBcnIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0VG9rZW4xLnB1c2gobm9kZU5hbWUpO1xuICAgICAgICAgICAgcmV0VG9rZW4yLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgaWYgKCFpblNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX21pc3NpbmdfY2hpbGRcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jaGlsZF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NoaWxkX3ZhbGlkXCIsXG4gICAgLy9jb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgLy9kZXBlbmRlbmNpZXM6IFtcIlJwdF9BcmlhX1ZhbGlkUm9sZVwiXSxcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfdmFsaWRcIiwgXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vX2NoaWxkXCI6IFwiYXJpYV9jaGlsZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9jaGlsZFwiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhbiBBUklBIHJvbGUgbXVzdCBvd24gYSByZXF1aXJlZCBjaGlsZFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiQW4gZWxlbWVudCB3aXRoIGFuIEFSSUEgcm9sZSBvd25zIGEgcmVxdWlyZWQgY2hpbGRcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub19jaGlsZFwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBkb2VzIG5vdCBvd24gYW55IGNoaWxkIGVsZW1lbnQgd2l0aCBhbnkgb2YgdGhlIGZvbGxvd2luZyByb2xlKHMpOiBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfY2hpbGRcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgb3ducyB0aGUgY2hpbGQgZWxlbWVudCB3aXRoIHRoZSByb2xlIFxcXCJ7MX1cXFwiIHRoYXQgaXMgbm90IG9uZSBvZiB0aGUgYWxsb3dlZCByb2xlKHMpOiBcXFwiezJ9XFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBWZXJpZnkgbWFwcGluZ1xuICAgIGFjdDogW1wiYmM0YTc1XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJvbGVzID0gIEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGV4cGxpY2l0IG9yIGltcGxpY2l0IHJvbGUsIHNob3VsZG4ndCBoYXBwZW5cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgbm9uZSBvciBwcmVzZW50YXRpb24gcm9sZVxuICAgICAgICBsZXQgcHJlc2VudGF0aW9uUm9sZXMgPSBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdO1xuICAgICAgICBjb25zdCBmb3VuZCA9IHJvbGVzLnNvbWUocj0+IHByZXNlbnRhdGlvblJvbGVzLmluY2x1ZGVzKHIpKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyAgRm9yIGNvbWJvYm94LCB3ZSBoYXZlIGcxMTkzIC4uLiBnMTE5OSB0byBjaGVjayB0aGUgdmFsdWVzIGV0Yy5cbiAgICAgICAgLy8gIFdlIGRvbid0IHdhbnQgdG8gdHJpZ2dlciAxMTUyIGFnYWluLiBTbywgd2UgYnlwYXNzIGl0IGhlcmUuXG4gICAgICAgIGlmIChyb2xlcy5pbmNsdWRlcyhcImNvbWJvYm94XCIpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcmVxdWlyZWRDaGlsZFJvbGVzID0gQXJpYVV0aWwuZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgLy8gYSAnZ3JvdXAnIHJvbGUgaXMgYWxsb3dlZCBidXQgbm90IHJlcXVpcmVkIGZvciBzb21lIGVsZW1lbnRzIHNvIHJlbW92ZSBpdCBpZiBleGlzdHNcbiAgICAgICAgaWYgKHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmNsdWRlcygnZ3JvdXAnKSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gcmVxdWlyZWRDaGlsZFJvbGVzLmluZGV4T2YoJ2dyb3VwJyk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICByZXF1aXJlZENoaWxkUm9sZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLyoqICBcbiAgICAgICAgICogaWdub3JlIGlmIGEgcm9sZSBkb2Vzbid0IHJlcXVpcmUgYSBjaGlsZCB3aXRoIGFueSBzcGVjaWZpYyByb2xlXG4gICAgICAgICAqIHRoZSByZXZlcnNlIG1pZ2h0IGJlIG5vdCB0cnVlIC0gcGFyZW50IHdpbGwgYmUgY2hlY2tlZCBpbiBScHRfQXJpYV9SZXF1aXJlZFBhcmVudF9OYXRpdmVfSG9zdF9TZW1hdGljcyBydWxlXG4gICAgICAgICovXG4gICAgICAgICBpZiAocmVxdWlyZWRDaGlsZFJvbGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgY2hpbGRyZW4gZnJvbSBhY2Nlc3NpYmlsaXR5IHRyZWUsIFxuICAgICAgICAvLyBpbmNsdWRpbmcgb25lcyB3aXRoIGFyaWEtb3ducyAgICBcbiAgICAgICAgbGV0IGRpcmVjdEFUQ2hpbGRyZW4gPSBBcmlhVXRpbC5nZXREaXJlY3RBVENoaWxkcmVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZGlyZWN0QVRDaGlsZHJlbiB8fCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyB0aGUgZWxlbWVudCB3aXRoIGF0IGxlYXN0IG9uZSByZXF1aXJlZCByb2xlIGRvc2VuJ3QgY29udGFpbiBhbnkgYWNjZXNzaWJsZSBjaGlsZFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBXaGVuIGEgd2lkZ2V0IGlzIG1pc3NpbmcgcmVxdWlyZWQgb3duZWQgZWxlbWVudHMgZHVlIHRvIHNjcmlwdCBleGVjdXRpb24gb3IgbG9hZGluZywgXG4gICAgICAgICAgICAgKiBhdXRob3JzIE1VU1QgbWFyayBhIGNvbnRhaW5pbmcgZWxlbWVudCB3aXRoICdhcmlhLWJ1c3knIGVxdWFsIHRvIHRydWUuIFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgbGV0IGJ1c3kgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWJ1c3lcIik7XG4gICAgICAgICAgICAgaWYgKCFidXN5IHx8IGJ1c3kgIT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJlcXVpcmVkQ2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX25vX2NoaWxkXCIsIHJldFRva2VuKTtcbiAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgIC8vIGl0J3MgJ2J1c3knIGxvYWRpbmcsIGlnbm9yZSBpdCBcbiAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHZpb2xhdGVFbGVtUm9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhkaXJlY3RBVENoaWxkcmVuW2pdLCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgICAgICBpZiAoIWNoaWxkUm9sZXMgfHwgY2hpbGRSb2xlcy5sZW5ndGggPT0gMCkgXG4gICAgICAgICAgICAgICAgY2hpbGRSb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZGlyZWN0QVRDaGlsZHJlbltqXSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChjaGlsZFJvbGVzICYmIGNoaWxkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIHdoZW4gbXVsdGlwbGUgcm9sZXMgYXJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBvd25lZCBlbGVtZW50cyBmb3IgYSByb2xlLCBhdCBsZWFzdCBvbmUgaW5zdGFuY2Ugb2Ygb25lIHJlcXVpcmVkIG93bmVkIGVsZW1lbnQgaXMgZXhwZWN0ZWQuIFxuICAgICAgICAgICAgICAgICAqIHRoZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW4gaW5zdGFuY2Ugb2YgZWFjaCBvZiB0aGUgbGlzdGVkIG93bmVkIHJvbGVzLlxuICAgICAgICAgICAgICAgICAqIHRoZXJlZm9yZSwgdGhlIHJlcXVpcmVtZW50IGlzIG1ldCBpZiBpdCBoYXMgYW55IG9uZSBvZiB0aGUgcmVxdWlyZWQgcm9sZXMuXG4gICAgICAgICAgICAgICAgICovICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gY2hpbGRSb2xlcy5zb21lKHI9PiByZXF1aXJlZENoaWxkUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICAgICAgICAgIGlmICghZm91bmQpIFxuICAgICAgICAgICAgICAgICAgICB2aW9sYXRlRWxlbVJvbGVzLnB1c2goY2hpbGRSb2xlcy5qb2luKFwiLCBcIikpOyBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBlbGVtZW50IHNpbmNlIGl0J3Mgbm90IHNlbWFudGljLCBzaG91bGRuJ3QgaGFwcGVuIFxuICAgICAgICAgICAgfSAgICAgXG4gICAgICAgIH0gXG4gICAgICAgIFxuICAgICAgICBpZiAodmlvbGF0ZUVsZW1Sb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB2aW9sYXRlRWxlbVJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2godmlvbGF0ZUVsZW1Sb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyZXF1aXJlZENoaWxkUm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9jaGlsZFwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbXBsZW1lbnRhcnlcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQ29tcGxlbWVudGFyeUxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIik7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV0sIGRvbTphc2lkZVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfQ29tcGxlbWVudGFyeUxhbmRtYXJrTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIHNob3VsZCBoYXZlIGEgdmlzaWJsZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICghQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoXG4gICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCJcbiAgICAgICAgKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9Db21wbGVtZW50YXJ5UmVxdWlyZWRMYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIG11c3QgaGF2ZSBhIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChwYWlyKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFRhYmxlVXRpbCB9IGZyb20gXCIuLi91dGlsL1RhYmxlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb250ZW50X2luX2xhbmRtYXJrOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29udGVudCBpcyBub3Qgd2l0aGluIGEgbGFuZG1hcmsgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFsbCBjb250ZW50IG11c3QgcmVzaWRlIHdpdGhpbiBhbiBlbGVtZW50IHdpdGggYSBsYW5kbWFyayByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBsZXQgcGFyYW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGNvbnRleHQuZG9tLm5vZGUub3duZXJEb2N1bWVudCwgXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmtcIiwgbnVsbCk7XG4gICAgICAgIGlmICghcGFyYW1zKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgbGFuZG1hcmtzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIiwgXCJmb3JtXCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJyZWdpb25cIiwgXCJzZWFyY2hcIl0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcG9zc2libGVPcnBoYW5lZFdpZGdldHM6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtcImJ1dHRvblwiLCBcImNvbWJvYm94XCIsIFwiY2hlY2tib3hcIiwgXCJncmlkXCIsIFwiaGVhZGluZ1wiLCBcImxpbmtcIiwgXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcInByb2dyZXNzYmFyXCIsIFwicmFkaW9cIiwgXCJ0YWJsaXN0XCIsIFwidGV4dGJveFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInRyZWVncmlkXCJcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwb3NzaWJsZU9ycGhhbmVkRWxlbWVudHM6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtcInBcIiwgXCJ0YWJsZVwiLCBcImlucHV0XCIsIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJidXR0b25cIiwgXCJhXCIsIFwib2xcIiwgXCJ1bFwiLCBcImRsXCIsIFwiaDFcIiwgXCJoMlwiLCBcImgzXCIsIFwiaDRcIiwgXCJoNVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJoNlwiLCBcImVtYmVkXCIsIFwib2JqZWN0XCIsIFwiYXJlYVwiXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbm9MYW5kbWFya2VkUm9sZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2Ugcm9sZXMgZG9uJ3QgcmVxdWlyZSBsYW5kbWFya3NcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtcImFsZXJ0XCIsIFwiYWxlcnRkaWFsb2dcIiwgXCJkaWFsb2dcIiwgXCJ0b29sdGlwXCJdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1hcExhbmRtYXJrczoge30sXG4gICAgICAgICAgICAgICAgbWFwUG9zc2libGVPcnBoYW5lZFdpZGdldHM6IHt9LFxuICAgICAgICAgICAgICAgIG1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50czoge30sXG4gICAgICAgICAgICAgICAgbWFwTm9MYW5kbWFya2VkUm9sZXM6IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb252ZXJ0IGFycmF5cyB0byBtYXBzXG4gICAgICAgICAgICBwYXJhbXMubWFwTGFuZG1hcmtzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5sYW5kbWFya3MudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwTGFuZG1hcmtzW3BhcmFtcy5sYW5kbWFya3MudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzID0ge31cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLnBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzW3BhcmFtcy5wb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzID0ge31cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLnBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkRWxlbWVudHNbcGFyYW1zLnBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXJhbXMubWFwTm9MYW5kbWFya2VkUm9sZXMgPSB7fVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubm9MYW5kbWFya2VkUm9sZXMudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwTm9MYW5kbWFya2VkUm9sZXNbcGFyYW1zLm5vTGFuZG1hcmtlZFJvbGVzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShjb250ZXh0LmRvbS5ub2RlLm93bmVyRG9jdW1lbnQsIFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrXCIsIHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8ICAvLyBhdm9pZCBkaWFnbm9zaW5nIGcxMTU3IGZvciBub24tdmlzaWJsZSBub2Rlc1xuICAgICAgICAgICAgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsZW1zV2l0aG91dENvbnRlbnQgPSBbXCJhcmVhXCIsIFwiaW5wdXRcIiwgXCJlbWJlZFwiLCBcImJ1dHRvblwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCJdO1xuICAgICAgICBpZiAoIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSAmJiAvL29ubHkgdHJpZ2dlciB0aGUgcnVsZSBvbiBlbGVtZW50cyB0aGF0IGhhdmUgY29udGVudFxuICAgICAgICAgICAgZWxlbXNXaXRob3V0Q29udGVudC5pbmRleE9mKG5vZGVOYW1lKSA9PT0gLTEpIHsgLy8gYSBmZXcgZWxlbXMgd2lob3V0IGNvbnRlbnQgc2hvdWxkIG5vdCBiZSBza2lwcGVkXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaG9ydCBjaXJjdWl0IGZvciBsYXlvdXQgdGFibGVzXG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcInRhYmxlXCIgJiYgVGFibGVVdGlsLmlzTGF5b3V0VGFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGEgcG9zc2libGUgb3JwaGFuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgaXNQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0ID0gQXJpYVV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzLCB0cnVlKTtcbiAgICAgICAgLy9leGNsdWRlIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwieHl6LmNzc1wiPiBpbiB0aGUgPGhlYWQ+IGFuZCA8Ym9keT4oIzYwOClcbiAgICAgICAgLy9oYXZpbmcgbGluayBpbiB0aGUgaGVhZCBjb3VsZCBjYXVzZSBsb3Qgb2YgdmlvbGFpb25zICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnbGluaycpIHtcbiAgICAgICAgICAgIGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzUG9zc2libGVPcnBoYW5lZEVsZW1lbnQgPSBub2RlTmFtZSBpbiBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzO1xuICAgICAgICBpZiAoaXNQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0IHx8IGlzUG9zc2libGVPcnBoYW5lZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIFNlZSBpZiBhbmNlc3RvciBoYXMgbGFuZG1hcmsgcm9sZXMgb3IgaW1wbGljaXQgbGFuZCBtYXJrIHJvbGVzXG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZXMgPSBjb250ZXh0SGllcmFyY2hpZXNbXCJhcmlhXCJdLm1hcChpbmZvID0+IGluZm8ucm9sZSk7XG4gICAgICAgICAgICBwYXNzZWQgPSBwYXJlbnRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlIGluIHBhcmFtcy5tYXBMYW5kbWFya3MpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgZmFpbCBlbGVtZW50cyB3aGVuIGEgcGFyZW50IG9yIHNpYmxpbmcgaGFzIGZhaWxlZCAtIGNhdXNlcyB0b28gbWFueSBtZXNzYWdlcy5cbiAgICAgICAgICAgICAgICBsZXQgd2Fsa0VsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgd2Fsa0VsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUod2Fsa0VsZW1lbnQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gcnVsZUNvbnRleHQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gd2Fsa0VsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3YWxrRWxlbWVudCA9IHJ1bGVDb250ZXh0LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgd2Fsa0VsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUod2Fsa0VsZW1lbnQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSB3YWxrRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHRyaWdnZXIgcnVsZSBpZiBlbGVtZW50IGlzIGEgc3RhbmQtYWxvbmUgd2lkZ2V0XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRfTm9UcmlnZ2VyXCIsIGZhbHNlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzLCB0cnVlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50X05vVHJpZ2dlclwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbnRlbnRpbmZvXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUNvbnRlbnRpbmZvTGFuZG1hcmtzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwiY29udGVudGluZm9cIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudGluZm9fbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudGluZm9fbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmZvb3RlciwgZG9tOmFkZHJlc3NcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0NvbnRlbnRpbmZvV2l0aE5vTWFpbl9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudGluZm9fbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgaXMgcHJlc2VudCB3aXRob3V0IGFuIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBpcyBvbmx5IHBlcm1pdHRlZCB3aXRoIGFuIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vY29uc2lkZXIgaW1wbGljaXQgcm9sZVxuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb250ZW50aW5mb1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb250ZW50aW5mb19zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206Zm9vdGVyLCBkb206YWRkcmVzc1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVDb250ZW50aW5mb0luU2libGluZ1NldF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgZm91bmQgb24gdGhlIHBhZ2VcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHBhZ2UsIGRvY3VtZW50LCBvciBhcHBsaWNhdGlvbiBzaG91bGQgb25seSBoYXZlIG9uZSBlbGVtZW50IHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vZmluZCBvdXQgaWYgPGZvb3Rlcj4gZWxlbWVudCBoYXMgc2libGluZ3MgYXMgPGZvb3Rlcj4gaGFzIGltcGxpY2l0IGNvbnRlbnRpbmZvIHJvbGVcbiAgICAgICAgaWYgKCFBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiY29udGVudGluZm9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9ICFBcmlhVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgIFwiY29udGVudGluZm9cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZGVzY2VuZGFudF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2NoaWxkX2ltcGxpY2l0X3JvbGVcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJyZWNvbW1lbmRhdGlvbl9ub19pbXBhY3Rfcm9sZVwiOiBcImFyaWFfZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiOiBcImFyaWFfZGVzY2VuZGFudF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQnJvd3NlcnMgaWdub3JlIHRoZSBleHBsaWNpdCBhbmQgaW1wbGljaXQgQVJJQSByb2xlcyBvZiB0aGUgZGVzY2VuZGFudHMgb2YgY2VydGFpbiBlbGVtZW50c1wiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgY29udGFpbnMgdmFsaWQgZGVzY2VuZGFudHNcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2NoaWxkX2ltcGxpY2l0X3JvbGVcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgY29udGFpbnMgZGVzY2VuZGFudHMgd2l0aCBpbXBsaWNpdCByb2xlcyBcXFwiezF9XFxcIiB3aGljaCBhcmUgaWdub3JlZCBieSBicm93c2Vyc1wiLFxuICAgICAgICAgICAgXCJyZWNvbW1lbmRhdGlvbl9ub19pbXBhY3Rfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCIsXG4gICAgICAgICAgICBcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wicGFzc1wiLCBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCIsIFwiZmFpbF9jaGlsZF9leHBsaWNpdF9yb2xlXCJdXG4gICAgfSx7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJyZWNvbW1lbmRhdGlvbl9ub19pbXBhY3Rfcm9sZVwiXVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogVmVyaWZ5IG1hcHBpbmdcbiAgICBhY3Q6IFtcIjMwN241elwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgcmVxdWlyZSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmICghQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJvbGVzID0gIEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGV4cGxpY2l0IG9yIGltcGxpY2l0IHJvbGUsIHNob3VsZG4ndCBoYXBwZW5cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNoaWxkcmVuIGZyb20gYWNjZXNzaWJpbGl0eSB0cmVlLCBcbiAgICAgICAgLy8gaW5jbHVkaW5nIG9uZXMgd2l0aCBhcmlhLW93bnMgICAgXG4gICAgICAgIGxldCBkaXJlY3RBVENoaWxkcmVuID0gQXJpYVV0aWwuZ2V0RGlyZWN0QVRDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkaXJlY3RBVENoaWxkcmVuICYmIGRpcmVjdEFUQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXByZXNlbnRhdGlvbmFsIGNoaWxkcmVuXG4gICAgICAgICAgICBsZXQgZXhwbGljaXRSb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgIGxldCBub0ltcGFjdFJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqPTA7IGogPCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIDxpbWc+IGFuZCA8c3ZnPlxuICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IGRpcmVjdEFUQ2hpbGRyZW5bal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAodGFnID09PSAnaW1nJyB8fCB0YWcgPT09ICdzdmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBnZXQgZXhwbGljaXQgcm9sZSBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGRpcmVjdEFUQ2hpbGRyZW5bal0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdGUgY2FzZSBmb3Igcm9sZT1cImNvZGVcIlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcy5pbmNsdWRlcyhcImNvZGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vSW1wYWN0Um9sZXMucHVzaChjaGlsZFJvbGVzLmZpbHRlcihyb2xlID0+IHJvbGUgPT09IFwiY29kZVwiKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0Um9sZXMucHVzaChjaGlsZFJvbGVzLmZpbHRlcihyb2xlID0+IHJvbGUgIT09IFwiY29kZVwiKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbXBsaWNpdCByb2xlIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICBjaGlsZFJvbGVzID0gIEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShkaXJlY3RBVENoaWxkcmVuW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdGUgY2FzZSBmb3Igcm9sZT1cImNvZGVcIlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcy5pbmNsdWRlcyhcImNvZGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vSW1wYWN0Um9sZXMucHVzaChjaGlsZFJvbGVzLmZpbHRlcihyb2xlID0+IHJvbGUgPT09IFwiY29kZVwiKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZFJvbGVzICYmIGNoaWxkUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZXMucHVzaChjaGlsZFJvbGVzLmZpbHRlcihyb2xlID0+IHJvbGUgIT09IFwiY29kZVwiKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGV4cGxpY2l0Um9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBleHBsaWNpdFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2goZXhwbGljaXRSb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbHVlcy5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9jaGlsZF9leHBsaWNpdF9yb2xlXCIsIHJldFRva2VuKSk7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGltcGxpY2l0Um9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChpbXBsaWNpdFJvbGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsdWVzLnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCIsIHJldFRva2VuKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub0ltcGFjdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9JbXBhY3RSb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKG5vSW1wYWN0Um9sZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25fbm9faW1wYWN0X3JvbGVcIiwgcmV0VG9rZW4pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyAgICAgICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6ZG9jdW1lbnRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlRG9jdW1lbnRSb2xlc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiZG9jdW1lbnRcXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImRvY3VtZW50XFxcIiByb2xlcyBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImRvY3VtZW50XFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJkb2N1bWVudFwiLCB0cnVlKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7IFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25jbGlja10sZG9tOipbb25ibHVyXSwgZG9tOipbb25kYmxjbGlja10sIGRvbToqW29uZm9jdXNdLCBkb206KltvbmtleWRvd25dLGRvbToqW29ua2V5cHJlc3NdLCBkb206KltvbmtleXVwXSwgZG9tOipbb25tb3VzZWRvd25dLCBkb206Kltvbm1vdXNldXBdLCBkb206Kltvbm1vdXNlbW92ZV0sIGRvbToqW29ubW91c2VvdXRdLCBkb206Kltvbm1vdXNlb3Zlcl0sIGRvbToqW29ucmVzaXplXSwgZG9tOipbb25jaGFuZ2VdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9FdmVudEhhbmRsZXJNaXNzaW5nUm9sZV9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgd2l0aCAnezF9JyBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgQVJJQSByb2xlIHNwZWNpZmllZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIHdpdGggZXZlbnQgaGFuZGxlcnMgbXVzdCBoYXZlIGEgdmFsaWQgQVJJQSByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIHRoaXMgZm9yIFNWRyBlbGVtZW50IGZvciBub3cgdW50aWwgYSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUgKGJ5IFJpY2gpXG4gICAgICAgIC8vIHRvIHN1cHBvcnQgU1ZHIGF0IGEgcG9pbnQgd2hlbiB0aGUgU1ZHIGExMXkgc3BlYyBpcyByZWFkeS5cbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwic3ZnXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdGhpcyBydWxlIGlzIHBhc3NlZCBpZiBhIGVsZW1lbnQgaGFzIGF0dHJpYnV0IHJvbGUgXG4gICAgICAgIC8vYWxzbywgcGFzc2VkIG9mIGVsZW1lbnQgaGFzIGFueSBpbXBsaWNpdCByb2xlcy4gXG4gICAgICAgIGlmIChBcmlhVXRpbC5oYXNBbnlSb2xlKHJ1bGVDb250ZXh0LCB0cnVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9wYXNzIGlmIHRoaXMgZWxlbWVudCBpcyByZWNlaXZlZCBmb2N1cyBieSBkZWZhdWx0XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzZm9jdXNhYmxlQnlEZWZhdWx0KHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy92YWxpZGF0ZSBpZiB0aGlzIGVsZW1lbnQgaGFzIGFueSBvZiB0aGUgZ2l2ZW4gZXZlbnQgaGFuZGxlcidzXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGxldCBldmVudEFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICAvLyBGcm9tIFdDQUcyMF9TY3JpcHRfVXNlVzNDRG9tRnVuY3Rpb25zXG4gICAgICAgIC8vbGV0IGV2ZW50cyA9IFtcIm9uYmx1clwiLCBcIm9uZm9jdXNcIiwgXCJvbmNoYW5nZVwiLCBcIm9uY2xpY2tcIiwgXCJvbmNvbnRleHRtZW51XCIsIFwib25kYmxjbGlja1wiLCBcIm9ua2V5ZG93blwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbmtleXByZXNzXCIsIFwib25rZXl1cFwiLCBcIm9ubG9hZFwiLCBcIm9ubW91c2Vkb3duXCIsIFwib25tb3VzZXVwXCIsIFwib25tb3VzZW1vdmVcIiwgXCJvbm1vdXNlb3V0XCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICBcIm9ubW91c2VvdmVyXCIsIFwib25tb3VzZXdoZWVsXCIsIFwib25yZXNldFwiLCBcIm9ucGFzdGVcIiwgXCJvbnJlc2l6ZVwiLCBcIm9uc2Nyb2xsXCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICBcIm9uc2VsZWN0XCIsIFwib25zdWJtaXRcIiwgXCJvbmFjdGl2YXRlXCIsIFwib25kZWFjdGl2YXRlXCIsIFwib25tb3VzZWVudGVyXCIsIFwib25tb3VzZWxlYXZlXCJdO1xuICAgICAgICBsZXQgZXZlbnRzID0gW1wib25ibHVyXCIsIFwib25mb2N1c1wiLCBcIm9uY2hhbmdlXCIsIFwib25jbGlja1wiLCBcIm9uZGJsY2xpY2tcIiwgXCJvbmtleWRvd25cIixcbiAgICAgICAgICAgIFwib25rZXlwcmVzc1wiLCBcIm9ua2V5dXBcIiwgXCJvbm1vdXNlZG93blwiLCBcIm9ubW91c2V1cFwiLCBcIm9ubW91c2Vtb3ZlXCIsIFwib25tb3VzZW91dFwiLFxuICAgICAgICAgICAgXCJvbm1vdXNlb3ZlclwiLCBcIm9ucmVzaXplXCJcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoZXZlbnRzW2ldKSlcbiAgICAgICAgICAgICAgICBldmVudEFyci5wdXNoKGV2ZW50c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChldmVudEFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChmYWxzZSwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlRm9ybUxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiZm9ybVxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiZm9ybVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImZvcm1cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImZvcm1cIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsOyBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZ3JhcGhpY19sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JhcGhpY3MtZG9jdW1lbnQsYXJpYTpncmFwaGljcy1zeW1ib2xcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXJpYV9TdmdBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIGEgZ3JhcGhpY3Mgcm9sZSBtdXN0IGhhdmUgYSBub24tZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIGdyYXBoaWNzIHJvbGUgaGFzIG5vIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiezB9XFxcIiBncmFwaGljcyByb2xlIGhhcyBubyBsYWJlbCBvciBhbiBlbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgZ3JhcGhpY3Mgcm9sZSBtaXNzaW5nIG5vbi1lbXB0eSAnYXJpYS1sYWJlbCcgb3IgJ2FyaWEtbGFiZWxsZWRieSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW10sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjdkNjczNFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSB8fCAhcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS5pbmNsdWRlcyhcImdyYXBoaWNzLVwiKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLyogcmVtb3ZlZCB0aGUgcm9sZSBjaGVjayByb2xlPSBwcmVzZW50YXRpb24gc2luY2UgaWYgYW4gZWxlbWVudCBoYXMgcm9sZT1pbWcsIHRoZW4gdGhlcmUgbmVlZHMgdG8gYmUgYSBjaGVjayBmb3IgYWx0IGF0dHJpYnV0ZSByZWdhcmRsZXNzIG9mIHRoZSBwcmVzZWNuZSBvZiByb2xlPXByZXNlbnRhdGlvblxuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcInByZXNlbnRhdGlvblwiKSB8fCBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICB9Ki9cblxuICAgICAgICAvLyBJZiByb2xlID09PSBpbWcsIHlvdSBtdXN0IHVzZSBhbiBhcmlhIGxhYmVsXG4gICAgICAgIC8vY2hlY2sgYXR0cmlidXRlcyBhcmlhLWxhYmVsIGFuZCBhcmlhLWxhYmVsbGVkYnkgZm9yIG90aGVyIHRhZ3MgKGUuZy4sIDxkaXY+LCA8c3Bhbj4sIGV0YylcbiAgICAgICAgbGV0IHBhc3NlZCA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgICBsZXQgc3ZnVGl0bGUgPSBydWxlQ29udGV4dC5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIik7XG4gICAgICAgICAgICBwYXNzZWQgPSBzdmdUaXRsZSAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudChzdmdUaXRsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy9jaGVjayB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICAvLyBXZSBzaG91bGQgZ3VpZGUgcGVvcGxlIHRvIHVzZSBhbHQgb3IgbGFiZWwgLSB0aGlzIGlzIGp1c3QgYSBzZWNvbmRhcnkgYXBwcm9hY2ggdG8gc2lsZW5jZSB0aGUgcnVsZS5cbiAgICAgICAgICAgIC8vIFNvLCB3ZSBzaG91bGQga2VlcCB0aGUgUE9GIGZyb20gYWJvdmUuXG4gICAgICAgICAgICAvLyBpZiAoIXBhc3NlZCkgUE9GID0gXCJGYWlsXzNcIjtcbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpXSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfaGlkZGVuX25vbnRhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaGlkZGVuX25vbnRhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLWhpZGRlbj10cnVlXSwgZG9tOipbYXJpYS1oaWRkZW49dHJ1ZV0gZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImFyaWFfaGlkZGVuX2ZvY3VzX21pc3VzZVwiOiB7IFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfaGlkZGVuX25vbnRhYmJhYmxlLmh0bWxgLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGhpZGRlbiBlbGVtZW50IHNob3VsZCBub3QgY29udGFpbiBhbnkgdGFiYmFibGUgZWxlbWVudHNcIiwgXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgXFxcInswfVxcXCIgc2hvdWxkIG5vdCBiZSBmb2N1c2FibGUgd2l0aGluIHRoZSBzdWJ0cmVlIG9mIGFuIGVsZW1lbnQgd2l0aCBhbiAnYXJpYS1oaWRkZW4nIGF0dHJpYnV0ZSB3aXRoIHZhbHVlICd0cnVlJ1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIxLjMuMVwiLCBcIjQuMS4yXCJdLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogSGFuZGxlIHRlc3RjYXNlIHdpdGggZm9jdXMganVtcGluZyBhd2F5XG4gICAgYWN0OiBcIjZjZmE4NFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbm9kZU5hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9pZF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9pZF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9WYWxpZElkUmVmXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgJ2lkJyBcXFwiezB9XFxcIiBzcGVjaWZpZWQgZm9yIHRoZSBBUklBIHByb3BlcnR5ICd7MX0nIHZhbHVlIGlzIG5vdCB2YWxpZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBBUklBIHByb3BlcnR5IG11c3QgcmVmZXJlbmNlIGEgbm9uLWVtcHR5IHVuaXF1ZSBpZCBvZiBhbiBleGlzdGluZyBlbGVtZW50IHRoYXQgaXMgdmlzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogNmE3MjgxIC0gTmVlZCBhIHNlcGFyYXRlIHJlYXNvbiBjb2RlIHdoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCByZXF1aXJlZC4gQUNUIHNheXMgaXQncyBva2F5IHRvIGJlXG4gICAgLy8gaW52YWxpZCB3aGVuIG5vdCByZXF1aXJlZC4gSSB0aGluayB3ZSBzaG91bGQgc3RpbGwgZmFpbCwgYnV0IGZsYWcgaXQgYXMgYSBkaWZmZXJlbnQgcmVhc29uIHNvIHRoYXQgd2UgY2FuIGhhdmUgYSBzdWJzZXRcbiAgICAvLyBhbGlnbnMgd2l0aCBBQ1QuXG4gICAgYWN0OiBbXCI1OTc5NmZcIiwgXCI2YTcyODFcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3MgPSB0cnVlO1xuICAgICAgICBsZXQgYXR0ck5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IG5vbkV4aXN0YW50SURzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgY29udGV4dEF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgaWRUb2tlbnMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHRlc3RlZFJlZmVyZW5jZXMgPSAwO1xuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGF0dHJMZW5ndGggPSBjb250ZXh0QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBhdHRyTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlcyA9IEFSSUFEZWZpbml0aW9ucy5wcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0c09uZUlEUmVmID0gKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIikgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBkYXRhIHR5cGUgc3VwcG9ydHMgb25lIG9yIG1vcmUgaWQgcmVmcyBkbyBlcnJvciBjaGVja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRzT25lSURSZWYgfHwgKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUmVmZXJlbmNlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWVMZW5ndGggPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkQXJyYXkgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFuIGVtcHR5IElEIFJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWVMZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChcIlxcXCJcIiArIGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSArIFwiXFxcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRvbyBtYW55IElEUmVmc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1cHBvcnRzT25lSURSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBoYXMgdG9vIG1hbnkgSURSZWZzIGl0IGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWVMZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNhcHR1cmUgYWxsIHRoZSBJRFJlZnMgZm9yIGlkVG9rZW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IDAsIGxlbmd0aCA9IGlkQXJyYXkubGVuZ3RoOyB6IDwgbGVuZ3RoOyArK3opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbel0gIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChpZEFycmF5W3pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgaWQgcmVmcyBhcmUgaW52YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzICYmIG5vZGVWYWx1ZUxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBsZW5ndGggPSBpZEFycmF5Lmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRBcnJheVtqXS5sZW5ndGggPiAwKSB7IC8vIGl0IGlzIGFuIGVtcHR5IHN0cmluZyBpZiBzcGFjZXMgYXJlIG9uZSBhZnRlciB0aGUgb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnQgYnkgSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudEJ5SWQgPSBvd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkQXJyYXlbal0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpZiB0aGUgZWxlbWVudCBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZWxlbWVudEJ5SWQgIT0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGV4aXN0cyBhbmQgdGhpcyBpcyBhbiBhcmlhIGF0dHJpYnV0ZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBoaWRkZW4gSUQgcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBwZXJmb3JtIGEgaXNOb2RlVmlzaWJsZSBjaGVjaywgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2libGUgdGhlbiB3ZSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgJiYgIWRhdGFUeXBlcy5oaWRkZW5JRFJlZlN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnRCeUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbal0gIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChpZEFycmF5W2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IG9uZSBvZiB0aGUgaWQgcmVmZXJlbmNlcyBuZWVkIHRvIGJlIHZhbGlkIHRvIG1hcmsgdGhlIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSBpZiB3ZSBmaW5kIGEgc2luZ2xlIHZpc2libGUgZWxlbWVudCB0aGVuIHN0b3AgY2hlY2tpbmcgYW5kIG1hcmsgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3MpIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFzc2VkID0gYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7XG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcmV0VG9rZW4zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG5cbiAgICAgICAgICAgIHJldFRva2VuMi5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICByZXRUb2tlbjMucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmIChpZFRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4xLnB1c2goaWRUb2tlbnMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgYXR0ck5hbWVBcnIsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yLCByZXRUb2tlbjNdKTtcbiAgICAgICAgaWYgKHRlc3RlZFJlZmVyZW5jZXMgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCksIHJldFRva2VuMy50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2ltZ19sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2ltZ19sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTppbWcsIGFyaWE6aW1hZ2VcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXJpYV9JbWdBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBoYXMgbm8gbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgaGFzIG5vIGxhYmVsIG9yIGFuIGVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIG1pc3Npbmcgbm9uLWVtcHR5ICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtcIjIzYTJhOFwiLCB7XG4gICAgICAgIFwiN2Q2NzM0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIC8vIElmIG5vIHJvbGUsIHRoaXMgaXMgaW1wbGljaXQsIGFuZCBjb3ZlcmVkIGJ5IFdDQUcyMF9JbWdfSGFzQWx0XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIHN2ZyBhbmQgaW1nIGVsZW1lbnRzIGFyZSBoYW5kbGVkIGluIHN2Z19ncmFwaGljc19sYWJiZWxsZWQgYW5kIGltZ19hbHRfdmFsaWQgcnVsZXNcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnc3ZnJyB8fCBub2RlTmFtZSA9PT0gJ2ltZycpIHJldHVybjtcblxuICAgICAgICAvKiByZW1vdmVkIHRoZSByb2xlIGNoZWNrIHJvbGU9IHByZXNlbnRhdGlvbiBzaW5jZSBpZiBhbiBlbGVtZW50IGhhcyByb2xlPWltZywgdGhlbiB0aGVyZSBuZWVkcyB0byBiZSBhIGNoZWNrIGZvciBhbHQgYXR0cmlidXRlIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZXNlY25lIG9mIHJvbGU9cHJlc2VudGF0aW9uXG4gICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwicHJlc2VudGF0aW9uXCIpIHx8IFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJub25lXCIpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgICAgIH0qL1xuXG4gICAgICAgIC8qIEpDSCAtIFBvaW50cyBvZiBmYWlsdXJlXG4gICAgICAgICAqICAgIDAuIE1pc3NpbmcgYWx0IGF0dHIgd2l0aCB2YWx1ZVxuICAgICAgICAgKiAgICAxLiBNaXNzaW5nIGFyaWEtbGFiZWwgb3IgYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAqICAgIDIuIE1pc3NpbmcgdGl0bGUgYXR0ciB3aXRoIHZhbHVlXG4gICAgICAgICAqL1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgcm9sZSA9PT0gaW1nLCB5b3UgbXVzdCB1c2UgYW4gYXJpYSBsYWJlbFxuICAgICAgICAvL2NoZWNrIGF0dHJpYnV0ZXMgYXJpYS1sYWJlbCBhbmQgYXJpYS1sYWJlbGxlZGJ5IGZvciBvdGhlciB0YWdzIChlLmcuLCA8ZGl2PiwgPHNwYW4+LCBldGMpXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIikge1xuICAgICAgICAgICAgbGV0IHN2Z1RpdGxlID0gcnVsZUNvbnRleHQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpO1xuICAgICAgICAgICAgcGFzc2VkID0gc3ZnVGl0bGUgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQoc3ZnVGl0bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vY2hlY2sgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGd1aWRlIHBlb3BsZSB0byB1c2UgYWx0IG9yIGxhYmVsIC0gdGhpcyBpcyBqdXN0IGEgc2Vjb25kYXJ5IGFwcHJvYWNoIHRvIHNpbGVuY2UgdGhlIHJ1bGUuXG4gICAgICAgICAgICAvLyBTbywgd2Ugc2hvdWxkIGtlZXAgdGhlIFBPRiBmcm9tIGFib3ZlLlxuICAgICAgICAgICAgLy8gaWYgKCFwYXNzZWQpIFBPRiA9IFwiRmFpbF8zXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX01pc3NpbmdLZXlib2FyZEhhbmRsZXJcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCI6IFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCI6IFwiYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCI6IFwiVmVyaWZ5IHRoZSA8ezB9PiBlbGVtZW50IHdpdGggXFxcInsxfVxcXCIgcm9sZSBoYXMga2V5Ym9hcmQgYWNjZXNzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW50ZXJhY3RpdmUgV0FJX0FSSUEgVUkgY29tcG9uZW50cyBtdXN0IHByb3ZpZGUga2V5Ym9hcmQgYWNjZXNzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBzYXZlZFBhc3NlZCA9IHBhc3NlZDtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgLy9sZXQgcm9sZXMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIC8vb25seSBjb25zaWRlciB1c2VyIHNwZWNpZmllZCByb2xlKHMpLCByYXRoZXIgdGhhbiBuYXRpdmUgY29udGFpbmVyc1xuICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICBcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy9pZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZCwgdGhlICdhcmlhX3JvbGVfcmVkdW5kYW50JyBydWxlIHNob3VsZCBiZSB0cmlnZ2VyZWQgYW5kIGFkZHJlc3NlZCBmaXJzdCxcbiAgICAgICAgLy8gYW5kIHRoZSBjdXJyZW50IHJ1bGUgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnICYmIHJvbGVzICYmIHJvbGVzLmluY2x1ZGVzKFwibGlzdGJveFwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIC8vIENvbXBvc2l0ZSB1c2VyIGludGVyZmFjZSB3aWRnZXQgcm9sZXMuIFRoZXkgYWN0IGFzIGNvbnRhaW5lcnMgdGhhdCBtYW5hZ2Ugb3RoZXIsIGNvbnRhaW5lZCB3aWRnZXRzLlxuICAgICAgICBsZXQgcm9sZUNvbnRhaW5lcnMgPSBbXCJjb21ib2JveFwiLCBcImdyaWRcIiwgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRyZWVcIiwgXCJ0cmVlZ3JpZFwiXTtcbiAgICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVDb250YWluZXJzKSB7XG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgcm9sZSwgdHJ1ZSkgIT0gbnVsbCkgXG4gICAgICAgICAgICAgICAgLy8gaXQncyBhIGRlc2NlbmRhbnQgb2YgYSBjb21wb3NpdGUgd2lkZ2V0IGFscmVhZHkgZXhhbWluZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IENvbW1vblV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV07XG4gICAgICAgICAgICBpZiAocm9sZUNvbnRhaW5lcnMuaW5kZXhPZihyb2xlc1tqXSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGxldCBkaXNhYmxlZCA9IGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgJ2FyaWEtZGlzYWJsZWQnKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtZGlzYWJsZWRcIikgOiAnJztcbiAgICAgICAgICAgICAgICBpZiAoIWRpc2FibGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEga2V5Ym9hcmQgZXZlbnQgaGFuZGxlciBvbiB0aGUgcGFyZW50IGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXVwXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBObyBrZXlib2FyZCBldmVudCBoYW5kbGVyIGZvdW5kIG9uIHBhcmVudC4gU2VlIGlmIGtleWJvYXJkIGV2ZW50IGhhbmRsZXJzIGFyZSBvbiByZXF1aXJlZCBjaGlsZCBlbGVtZW50cy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVxQ2hpbGRyZW4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXFDaGlsZHJlbikgeyAvKiBTTUYgVE9ETyBtZW51YmFyIGRvZXMgbm90IGhhdmUgYW55IHJlcUNoaWxkcmVuICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCByZXF1aXJlZENoaWxkcmVuTGVuZ3RoID0gcmVxQ2hpbGRyZW4ubGVuZ3RoOyBpIDwgcmVxdWlyZWRDaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAgPSBcIipbY29udGFpbnMoQHJvbGUsJ1wiICsgcmVxQ2hpbGRyZW5baV0gKyBcIicpXVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0ID0gZG9jLmV2YWx1YXRlKHhwLCBydWxlQ29udGV4dCwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoci5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgci5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoaWxkIGRpZCBub3QgaGF2ZSBhIGtleSBoYW5kbGVyLiBTZWUgaWYgYW55IG9mIHRoZSBncmFuZGNoaWxkcmVuIGRvLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdDIgPSBkb2MuZXZhbHVhdGUoeHAyLCByLCBDb21tb25VdGlsLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIyOiBFbGVtZW50ID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHIyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyMi5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgcjIuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoaXMgYW4gYWN0aW9uIGxpbms/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiYVwiICYmIHIyLmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBocmVmID0gcjIuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGlvbiBsaW5rIG11c3Qgc3RhcnQgd2l0aCBcImphdmFzY3JpcHQ6XCIsIG11c3Qgbm90IGNvbnRhaW4gYSBcInZvaWRcIiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIG5hbWUgZm9sbG93aW5nIFwiamF2YXNjcmlwdDpcIiAoaS5lLiwgaHJlZi5sZW5ndGggPiAxMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChocmVmLnN0YXJ0c1dpdGgoXCJqYXZhc2NyaXB0OlwiKSAmJiBocmVmLmluZGV4T2YoXCJ2b2lkXCIpID09IC0xICYmIGhyZWYubGVuZ3RoID4gMTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIHRoZSByZXF1aXJlZCBjaGlsZHJlbiAob3IgYW55IGRlc2NlbmRhbnRzIG9mIHRoZSByZXF1aXJlZCBjaGlsZHJlbikgbXVzdCBoYXZlIGtleXByZXNzL2tleWRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90LCBpdCBpcyBhIGZhaWx1cmUsIG5vIG5lZWQgdG8ga2VlcCBjaGVja2luZyBhbnkgbW9yZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudCBlbGVtZW50IGZhaWxlZCB0aGUga2V5ZG93bi9rZXlwcmVzcywgYW5kIGl0IGRvZXMgbm90IGhhdmUgcmVxdWlyZWQgY2hpbGRyZW4sIHN1Y2ggYXMgbWVudWJhci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0J3MgY2hlY2sgaXRzIGRlc2NlbmRhbnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdDIgPSBkb2MuZXZhbHVhdGUoeHAyLCBydWxlQ29udGV4dCwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShyMikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoaXMgYW4gYWN0aW9uIGxpbms/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJhXCIgJiYgcjIuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHJlZiA9IHIyLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aW9uIGxpbmsgbXVzdCBzdGFydCB3aXRoIFwiamF2YXNjcmlwdDpcIiwgbXVzdCBub3QgY29udGFpbiBhIFwidm9pZFwiIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgYSBmdW5jdGlvbiBuYW1lIGZvbGxvd2luZyBcImphdmFzY3JpcHQ6XCIgKGkuZS4sIGhyZWYubGVuZ3RoID4gMTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChocmVmLnN0YXJ0c1dpdGgoXCJqYXZhc2NyaXB0OlwiKSAmJiBocmVmLmluZGV4T2YoXCJ2b2lkXCIpID09IC0xICYmIGhyZWYubGVuZ3RoID4gMTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0cmlidXRlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIGlzIHNwZWNpZmllZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICByb2xlTmFtZUFyci5wdXNoKHJvbGVzW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkICYmIHNhdmVkUGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgc2F2ZWRQYXNzZWQgPSBwYXNzZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgcmVmZXJlbmNlZCBieSBhIGNvbWJvYm94LiBJZiBzbywgbGVhdmUgaXQgdG8gdGhlIGNvbWJvYm94IHJ1bGVzIHRvIGNoZWNrXG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICBpZiAoaWQgJiYgaWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCpbYXJpYS1jb250cm9scz0nJHtpZH0nXVtyb2xlPSdjb21ib2JveCddYCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2F2ZWRQYXNzZWQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5LCBhcmlhOmJhbm5lciwgYXJpYTpjb250ZW50aW5mbywgYXJpYTptYWluLCBhcmlhOm5hdmlnYXRpb24sIGFyaWE6cmVnaW9uLCBhcmlhOnNlYXJjaCwgYXJpYTpmb3JtXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJsYW5kbWFya19uYW1lX3VuaXF1ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8wXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiezB9XFxcIiBsYW5kbWFya3Mgd2l0aGluIHRoZSBzYW1lIHBhcmVudCByZWdpb24gYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdW5pcXVlICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJ7MH1cXFwiIGxhbmRtYXJrcyB3aXRoaW4gdGhlIHNhbWUgcGFyZW50IHJlZ2lvbiBhcmUgbm90IGRpc3Rpbmd1aXNoZWQgZnJvbSBvbmUgYW5vdGhlciBiZWNhdXNlIHRoZXkgaGF2ZSB0aGUgc2FtZSBcXFwiezF9XFxcIiBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggbGFuZG1hcmsgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJ2FyaWEtbGFiZWxsZWRieScgb3IgJ2FyaWEtbGFiZWwnIG9yIGJlIG5lc3RlZCBpbiBhIGRpZmZlcmVudCBwYXJlbnQgcmVnaW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUT0RPIGRvIEkgbmVlZCB0byBmaXRlciBvdXQgYmFkIGNvbnRlbnRpbmZvIG5vZGVzOiBUaGUgZm9vdGVyIGVsZW1lbnQgaXMgbm90IGEgY29udGVudGluZm8gbGFuZG1hcmsgd2hlbiBpdCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIGZvbGxvd2luZyBIVE1MNSBzZWN0aW9uaW5nIGVsZW1lbnRzOiBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNy9OT1RFLXdhaS1hcmlhLXByYWN0aWNlcy0xLjEtMjAxNzEyMTQvZXhhbXBsZXMvbGFuZG1hcmtzL0hUTUw1Lmh0bWxcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVja2luZyBpZiB0aGlzIGxhbmRtYXJrIGlzIGluc2lkZSBhIGRpYWxvZyBlbGVtZW50LiBJZiBpdCBpcyB3ZSBhcmUgZ29pbmcgdG8gc2tpcCBjaGVja2luZyBpdC4gXG4gICAgICAgIC8qKnZhciBjb3B5T2ZSdWxlQ29udGV4dCA9IHJ1bGVDb250ZXh0O1xuICAgICAgICB2YXIgcGFybmV0Tm9kZXNPZlJ1bGVDb250ZXh0ID0gW107XG4gICAgICAgIHdoaWxlIChjb3B5T2ZSdWxlQ29udGV4dCkge1xuICAgICAgICAgICAgcGFybmV0Tm9kZXNPZlJ1bGVDb250ZXh0LnVuc2hpZnQoY29weU9mUnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgY29weU9mUnVsZUNvbnRleHQgPSBjb3B5T2ZSdWxlQ29udGV4dC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dC5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS50YWdOYW1lID09IFwiRElBTE9HXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PSBcImRpYWxvZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsIC8vIFNraXBwaW5nIGNoZWNraW5nIGxhbmRtYXJrcyB0aGF0IGhhcHBlbiB0byBiZSBpbnNpZGUgZGlhbG9nIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAqL1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiRElBTE9HXCJdKSAhPT0gbnVsbCB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImRpYWxvZ1wiLCB0cnVlKSAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIEJlZ2luaW5nIGZvcm1DYWNoZSB3b3JrXG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZm9ybUNhY2hlIDoge1xuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzOiBhbnlbXSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHM6IGFueVtdLFxuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZDogc3RyaW5nW11cbiAgICAgICAgfSA9IENhY2hlVXRpbC5nZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tRU5URVJJTkcgRk9STSBDQUNIRVwiKVxuICAgICAgICAgICAgZm9ybUNhY2hlID0ge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2RlczogW10sXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQ6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc1RlbXAgPSBvd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICAgICAgJ2FzaWRlLFtyb2xlPVwiY29tcGxlbWVudGFyeVwiXSwgZm9vdGVyLFtyb2xlPVwiY29udGVudGluZm9cIl0sIGhlYWRlcixbcm9sZT1cImJhbm5lclwiXSwgbWFpbixbcm9sZT1cIm1haW5cIl0sIG5hdixbcm9sZT1cIm5hdmlnYXRpb25cIl0sIGZvcm0sW3JvbGU9XCJmb3JtXCJdLCBzZWN0aW9uLFtyb2xlPVwicmVnaW9uXCJdLFtyb2xlPVwic2VhcmNoXCJdJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXMgPSBBcnJheS5mcm9tKG5hdmlnYXRpb25Ob2Rlc1RlbXApO1xuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMgPSBbXTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kIDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAgICAgLy8gVGhpcyBibG9jayBvZiBjb2RlIGZpbHRlcnMgb3V0IGFueSBuYXYgZWxlbWVudHMgdGhhdCBhcmUgdW5kZXIgYSBkaWFsb2cuIEFzIHRob3NlIGFyZSBub3Qgb25lcyB3ZSB3YW50IHRvIHRlc3QgYWdhaW5zdCBhcyB3ZSBjb25zaWRlciBkaWFsb2dzIGFyZSBzZXBhcmF0ZSBsb2NhdGlvbnMgZnJvbSB0aGUgcmVzdCBvZiB0aGUgbWFpbiBwYWdlLlxuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8qKmxldCBhID0gbmF2aWdhdGlvbk5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCBkaWFsb2dOb2RlRm91bmRGbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYSA9IGEucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLnRhZ05hbWUgPT0gXCJESUFMT0dcIiB8fCBhLmdldEF0dHJpYnV0ZSgncm9sZScpID09IFwiZGlhbG9nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2dOb2RlRm91bmRGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWRpYWxvZ05vZGVGb3VuZEZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzV2l0aG91dERpYWxvZ3MucHVzaChuYXZpZ2F0aW9uTm9kZXNbaV0pXG4gICAgICAgICAgICAgICAgfSovXG5cbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgbm9kZSB0aGF0IGlzIEFUIGhpZGRlbiBvciBpbiBhIGRpYWxvZ1xuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChuYXZpZ2F0aW9uTm9kZXNbaV0pIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IobmF2aWdhdGlvbk5vZGVzW2ldLCBbXCJESUFMT0dcIl0pICE9PSBudWxsIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobmF2aWdhdGlvbk5vZGVzW2ldLCBcImRpYWxvZ1wiLCB0cnVlKSAhPT0gbnVsbCkgXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzLnB1c2gobmF2aWdhdGlvbk5vZGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXMgPSBuYXZpZ2F0aW9uTm9kZXNXaXRob3V0RGlhbG9ncztcblxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgbGV0IGVscyA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBhID0gbmF2aWdhdGlvbk5vZGVzW2ldLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGEpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxzLnB1c2goYSk7XG4gICAgICAgICAgICAgICAgICAgIGEgPSBhLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgcGFyZW50cyBvZiB0aGUgbGFuZG1hcmsgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBuZWFyZXN0IGxhbmRtYXJrIHBhcmVudCBiYXNlZCBvbiB0aGUgdGFnTmFtZSBvciB0aGUgcm9sZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ05hbWVUcmlnZ2VyID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJBU0lERVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJGT09URVJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRk9STVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJIRUFERVJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTUFJTlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJOQVZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU0VDVElPTlwiLFxuICAgICAgICAgICAgICAgICAgICBdLmluY2x1ZGVzKGVsc1tqXS50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGVOYW1lVHJpZ2dlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxzW2pdLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lVHJpZ2dlciA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmb3JtXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJiYW5uZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hdmlnYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJlZ2lvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic2VhcmNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBdLmluY2x1ZGVzKGVsc1tqXS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpKTsgLy8gVE9ETyB3ZSBhcmUgbm90IGNvdmVyaW5nIHRoZSBjYXNlIHdoZXJlIGEgZWxlbWVuZW50IHdpdGggbXVsdGlwbGUgcm9sZXMuIGUuZy4sIHJvbGUgPSBcImZvcm0gYmFubmVyXCIuIFRoaXMgaXMgYSBpbXByb3ZtZW50IHdlIG1pZ2h0IHdhbnQgdG8gYWRkIGluIHRoZSBmdXR1cmUuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ05hbWVUcmlnZ2VyIHx8IHJvbGVOYW1lVHJpZ2dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVhcmVzdCBwYXJlbnQtbGFuZG1hcmsgZm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMucHVzaChlbHNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGVscy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG5vZGUgaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGZpbGUgc28gaXQgZG9lcyBub3QgaGF2ZSBhIHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKG5hdmlnYXRpb25Ob2Rlc1tpXSk7XG4gICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbGFuZG1hcmsgbm9kZXNcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAvKipBUklBTWFwcGVyLmNvbXB1dGVOYW1lKG5hdmlnYXRpb25Ob2Rlc1tpXSkqL1xuICAgICAgICAgICAgICAgICAgICBwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDAgPyBwYWlyLm5hbWUudHJpbSgpIDogXCJcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBwYXJlbnRzIG9mIHRoZSBsYW5kbWFyayBub2RlcyB0byBmaW5kIGR1cGxpY2F0ZXNcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBwYXNzXzBfZmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gY29tcGFyZSBhZ2FpbnN0IG91cnNlbGZzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IGZvY3VzIG9uIHRoZSBjYXNlIHdoZXJlIHRoZSBwYXJlbnQgbGFuZG1hcmsgaXMgbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2ldID09PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2pdID09PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGxvb2tpbmcgYXQgdHdvIHJvb3Qgbm9kZXMsIHNvIHdlIHNob3VsZCBjb21wYXJlIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tpXSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgaGF2ZSB0aGUgc2FtZSByb2xlIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaGF2ZSB0aGUgc2FtZSAoY29tcHV0ZWQpIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7IC8vIEZhaWwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgJiYgc2FtZSBub2RlIHJvbGVzIEJVVCBkaWZmZXJlbnQgY29tcHV0ZWQgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCBhIFBhc3NfMC4gQnV0IHdlIG5lZWQgdG8gY2hlY2sgYWxsIG5vZGVzIHRvIHNlZSBpZiBhbm90aGVyIG9uZSBmYWlscy4gU28gc2V0IGEgZmxhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc18wX2ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzIGJ1dCBkaWZmZXJlbnQgbm9kZSByb2xlcyAvLyBOb3QgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tqXSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBsb29raW5nIGF0IGEgc2luZ2xlIHJvb3Qgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlmIHN0YXRlbWVudCBmb2N1cyBvbiB0aGUgY2FzZSB3aGVyZSB0aGUgcGFyZW50IGxhbmRtYXJrIGlzIE5PVCBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWwuc2FtZU5vZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0aGUgc2FtZSBwYXJlbnQtbGFuZG1hcmsgQU5EXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tpXSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgaGF2ZSB0aGUgc2FtZSByb2xlIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaGF2ZSB0aGUgc2FtZSAoY29tcHV0ZWQpIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7IC8vIEZhaWwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgJiYgc2FtZSBub2RlIHJvbGVzIEJVVCBkaWZmZXJlbnQgY29tcHV0ZWQgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCBhIFBhc3NfMC4gQnV0IHdlIG5lZWQgdG8gY2hlY2sgYWxsIG5vZGVzIHRvIHNlZSBpZiBhbm90aGVyIG9uZSBmYWlscy4gU28gc2V0IGEgZmxhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc18wX2ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzIGJ1dCBkaWZmZXJlbnQgbm9kZSByb2xlcyAvLyBOb3QgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlmZmVyZW50IHBhcmVudHMgLy8gTm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NfMF9mbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJwYXNzXCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwibnVsbFwiKTsgLy8gVGhpcyBpcyBub3QgdGhlIGtleXdvcmQgbnVsbCBvbiBwdXJwb3NlLiBJdCBpcyBhIHNwYWNlaG9sZGVyIGluIHRoZSBhcnJheSBzbyBpbmRleGVzIG1hdGNoIHVwLlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzID1cbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscztcbiAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXMgPSBuYXZpZ2F0aW9uTm9kZXM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzUGFyZW50cyA9IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZCA9IG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQ7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBmb3JtQ2FjaGVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gQWRkIHZhbGlkYXRpb24gdGhhdCBhbGwgMyBhcnJheXMgYXJlIHRoZSBzYW1lIGxlbmd0aFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCItLS0tLS0tLS0tLS0tRW5kIGZvcm1DYWNoZVwiKVxuICAgICAgICB9IC8vIEVuZCBmb3JtQ2FjaGVcblxuICAgICAgICBsZXQgaW5kZXhUb0NoZWNrID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmlzU2FtZU5vZGUoZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICBpbmRleFRvQ2hlY2sgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleFRvQ2hlY2sgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmRbaW5kZXhUb0NoZWNrXSA9PT0gXCJwYXNzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIixcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNbaW5kZXhUb0NoZWNrXVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmRbaW5kZXhUb0NoZWNrXSA9PT0gXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzW2luZGV4VG9DaGVja11cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2luZGV4VG9DaGVja10sXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX21haW5fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6bWFpblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVNYWluc1JlcXVpcmVMYWJlbF9JbXBsaWNpdF8yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9tYWluX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJtYWluXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBtdXN0IGhhdmUgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3Nlc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29udGV4dExhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICBsZXQgcGFyZW50RG9jUm9sZSA9IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgIFwiZG9jdW1lbnRcIixcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IG1haW5zID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1haW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAobWFpbnNbaV0gPT09IHJ1bGVDb250ZXh0KSBjb250aW51ZTtcbiAgICAgICAgICAgIHJlc3VsdCA9IFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgbGV0IHRoaXNQYXJlbnREb2NSb2xlID0gQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShcbiAgICAgICAgICAgICAgICBtYWluc1tpXSxcbiAgICAgICAgICAgICAgICBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0aGlzUGFyZW50RG9jUm9sZSA9PT0gcGFyZW50RG9jUm9sZSkge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5nZXRBcmlhTGFiZWwobWFpbnNbaV0pID09PSBjb250ZXh0TGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9tYWluX2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZU1haW5zVmlzaWJsZUxhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX21haW5fbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJtYWluXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSB2aXNpYmxlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJtYWluXFxcIiByb2xlIHNob3VsZCBoYXZlIGEgdW5pcXVlIHZpc2libGUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy9jYWxsIGdldEVsZW1lbnRzQnlSb2xlSGlkZGVuIHdpdGggY29uc2lkZXJJbXBsaWNpdCBmbGFnIGFzIHRydWVcbiAgICAgICAgLy9zbyB0aGF0IHRoZSBtZXRob2QgcmV0dXJzIDxtYWluPiBlbGVtZW50c1xuICAgICAgICBsZXQgbGFuZG1hcmtzID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IEFyaWFVdGlsLmhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGxhbmRtYXJrcyk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6bmF2aWdhdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVOYXZpZ2F0aW9uTGFuZG1hcmtzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJuYXZpZ2F0aW9uXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJuYXZpZ2F0aW9uXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwibmF2aWdhdGlvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwibmF2aWdhdGlvblwiLCB0cnVlKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7IFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9ICAgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX3BhcmVudF9yZXF1aXJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3BhcmVudF9yZXF1aXJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfUmVxdWlyZWRQYXJlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3BhcmVudF9yZXF1aXJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfcGFyZW50X3JlcXVpcmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIGFuIGltcGxpY2l0IG9yIGV4cGxpY2l0IHJvbGUgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGEgdmFsaWQgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBpcyBub3QgY29udGFpbmVkIGluIG9yIG93bmVkIGJ5IGFuIGVsZW1lbnQgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyByb2xlczogXFxcInsxfVxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IENoZWNrIEZhaWwgM1xuICAgIGFjdDogXCJmZjg5YzlcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKEFyaWFVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkgfHwgVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICBsZXQgcm9sZU5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGNvbnRhaW5lclJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCB0ZXN0ZWRDb250YWluZXIgPSAwO1xuXG4gICAgICAgIGxldCBhbmNlc3RvclJvbGVzID0gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5tYXAoaW5mbyA9PiBpbmZvLnJvbGUpO1xuICAgICAgICBsZXQgcGFyZW50Um9sZSA9IGFuY2VzdG9yUm9sZXNbYW5jZXN0b3JSb2xlcy5sZW5ndGggLSAyXTtcbiAgICAgICAgbGV0IGNvdW50ID0gMjtcbiAgICAgICAgd2hpbGUgKHBhcmVudFJvbGUgPT09ICdub25lJykge1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIHBhcmVudFJvbGUgPSBhbmNlc3RvclJvbGVzW2FuY2VzdG9yUm9sZXMubGVuZ3RoIC0gY291bnRdO1xuXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8qKmZvciAobGV0IGogPSAwLCBsZW5ndGggPSByb2xlcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0uY29udGFpbmVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0ZXN0ZWRDb250YWluZXIrKztcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb250YWluZXJSb2xlcyA9IGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5jb250YWluZXI7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNvbnRhaW5lcnNMZW5ndGggPSBjb250YWluZXJSb2xlcy5sZW5ndGg7ICFwYXNzZWQgJiYgaSA8IGNvbnRhaW5lcnNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXJlbnRSb2xlID09PSBjb250YWluZXJSb2xlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXNzZWQgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgICAgICAqL1xuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVdICYmIGRlc2lnblBhdHRlcm5zW3JvbGVdLmNvbnRhaW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgICB0ZXN0ZWRDb250YWluZXIrKztcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29udGFpbmVyUm9sZXMgPSBkZXNpZ25QYXR0ZXJuc1tyb2xlXS5jb250YWluZXI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgY29udGFpbmVyc0xlbmd0aCA9IGNvbnRhaW5lclJvbGVzLmxlbmd0aDsgIXBhc3NlZCAmJiBpIDwgY29udGFpbmVyc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZSA9PT0gY29udGFpbmVyUm9sZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFzc2VkID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChjb250YWluZXJSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMl0pO1xuICAgICAgICBpZiAodGVzdGVkQ29udGFpbmVyID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpyZWdpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlUmVnaW9uc1VuaXF1ZUxhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJyZWdpb25cIik7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsOyBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yZWdpb25fbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6cmVnaW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9SZWdpb25MYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICAgICAgLy8gXCJGYWlsXzJcIjogXCJGYWlsXzJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF8yXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhIGxhYmVsXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMlwiOiBcIkVsZW1lbnQgd2l0aCBcXFwicmVnaW9uXFxcIiByb2xlIGlzIG5vdCBsYWJlbGVkIHdpdGggJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcm9sZV9hbGxvd2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcm9sZV9hbGxvd2VkXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRSb2xlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYXJpYV9yb2xlX2FsbG93ZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudHMgbXVzdCBoYXZlIGEgdmFsaWQgJ3JvbGUnIHBlciBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIHJvbGUgJ3swfScgZGVmaW5lZCBvbiB0aGUgZWxlbWVudCBpcyBub3QgdmFsaWQgcGVyIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlNvbWUgb2YgdGhlIHJvbGVzLCAnezB9JywgZGVmaW5lZCBvbiB0aGUgZWxlbWVudCBhcmUgbm90IHZhbGlkIHBlciBBUklBIHNwZWNpZmljYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCI0LjEuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogUmVjaGVja1xuICAgIGFjdDogXCI2NzRiMTBcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcm9sZVN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChyb2xlU3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpbnZhbGlkUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYShydWxlQ29udGV4dCk7XG5cbiAgICAgICAgaWYgKCFpbnZhbGlkUm9sZXMgfHwgaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcm9sZXMgPSByb2xlU3RyLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0gcm9sZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIixcIildKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIixcIildKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFRhYmxlVXRpbCB9IGZyb20gXCIuLi91dGlsL1RhYmxlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yb2xlX3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkFuIGV4cGxpY2l0bHktYXNzaWduZWQgQVJJQSByb2xlIGlzIG5vdCByZWR1bmRhbnQgd2l0aCB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcIlRoZSBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBcXFwiezB9XFxcIiBpcyByZWR1bmRhbnQgd2l0aCB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVudCA8ezF9PlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGV4cGxpY2l0bHktYXNzaWduZWQgQVJJQSByb2xlIHNob3VsZCBub3QgYmUgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBlbGVtTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBhcmlhUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICBpZiAoIWFyaWFSb2xlcyB8fCBhcmlhUm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIGxldCByb2xlX2RlZmluZWQgPSBBcmlhVXRpbC5hcmVSb2xlc0RlZmluZWQoYXJpYVJvbGVzKTtcbiAgICAgICAgaWYgKCFyb2xlX2RlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiBpdCdzIGFscmVhZHkgZmFpbGVkIGluIHRoZSBwYXJlbnQgcmVsYXRpb24sIHRoZW4gc2tpcCB0aGlzIGNoZWNrXG4gICAgICAgIC8vIGNvbW1lbnQgb3V0IHRvIHJlcG9ydCB0aGUgcmVkdW5kYW50IHJvbGUgZm9yIHRhYmxlIGVsZW1lbnQ6IHRyLCB0ZCAmIHRoXG4gICAgICAgIC8qKmlmIChbXCJ0ZFwiLCBcInRoXCIsIFwidHJcIl0uaW5jbHVkZXMoZWxlbU5hbWUpKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZSA9IFRhYmxlVXRpbC5pc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgaWYgKHBhcmVudFJvbGUgIT09IG51bGwgJiYgcGFyZW50Um9sZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9Ki9cblxuICAgICAgICBsZXQgaW1wbGljaXRSb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghaW1wbGljaXRSb2xlcyB8fCBpbXBsaWNpdFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuXG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhUm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghaW1wbGljaXRSb2xlcy5pbmNsdWRlcyhhcmlhUm9sZXNbaV0pKSAgXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgIGVsc2UgICAgIFxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9yZWR1bmRhbnRcIiwgW2FyaWFSb2xlc1tpXSwgZWxlbU5hbWVdKSk7XG4gICAgICAgIH0gIFxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApICBcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIHJldHVybiBudWxsOyAgICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpzZWFyY2hcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlU2VhcmNoTGFuZG1hcmtzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJzZWFyY2hcXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInNlYXJjaFxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInNlYXJjaFxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBkZXByZWNhdGVkIHRoZSBydWxlIG9uIDAxLzI3LzIwMjVcbiAgICAgKiBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLCovXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW10sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwic2VhcmNoXCIsIHRydWUpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yb2xlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcm9sZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX3NlbWFudGljc19yb2xlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBBUklBIHJvbGUgJ3swfScgaXMgbm90IHZhbGlkIGZvciB0aGUgZWxlbWVudCA8ezF9PlwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgQVJJQSByb2xlICd7MH0nIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT4gYW5kIG1heSBiZSBpZ25vcmVkIGJ5IHRoZSBicm93c2VyIHNpbmNlIHRoZSBlbGVtZW50IGlzIGZvY3VzYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFSSUEgcm9sZXMgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhleSBhcmUgYXNzaWduZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBvbmx5IGNoZWsgZWxlbWVudCAoMSkgYW5kIGZyYWdtZW50IG5vZGVzICgxMSlcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIC8vIHRoZSBpbnZhbGlkIHJvbGUgY2FzZTogaGFuZGxlZCBieSBhcmlhX3JvbGVfYWxsb3dlZC4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIGNvbnN0IHVuZGVmaW5lZFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAodW5kZWZpbmVkUm9sZXMgJiYgdW5kZWZpbmVkUm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRSb2xlcyA9IEFyaWFVdGlsLmdldERlcHJlY2F0ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZFJvbGVzICYmIGRlcHJlY2F0ZWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gZGVwZW5kZW5jeSBjaGVjazogaWYgaXQncyBhbHJlYWR5IGZhaWxlZCwgdGhlbiBza2lwXG4gICAgICAgIGlmIChbXCJ0ZFwiLCBcInRoXCIsIFwidHJcIl0uaW5jbHVkZXModGFnTmFtZSkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRSb2xlID0gQ29tbW9uVXRpbC5pc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgaWYgKHBhcmVudFJvbGUgIT09IG51bGwgJiYgcGFyZW50Um9sZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRvbVJvbGVzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWRvbVJvbGVzIHx8IGRvbVJvbGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gY2hlY2sgdGhlICdnZW5lcmljJyByb2xlIGZpcnN0XG4gICAgICAgIGlmIChkb21Sb2xlcy5pbmNsdWRlcygnZ2VuZXJpYycpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtcImdlbmVyaWNcIiwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgbGV0IGludmFsaWRSb2xlcyA9IEFyaWFVdGlsLmdldEludmFsaWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChpbnZhbGlkUm9sZXMgPT09IG51bGwgfHwgaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFtkb21Sb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcblxuICAgICAgICBpZiAoaW52YWxpZFJvbGVzLmluY2x1ZGVzKFwicHJlc2VudGF0aW9uXCIpIHx8IGludmFsaWRSb2xlcy5pbmNsdWRlcyhcIm5vbmVcIikgJiYgQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZG9tUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbZG9tUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbi8vIFRoaXMgcnVsZSBpcyBpbiB0aGUgc2FtZSBmaWxlIGJlY2F1c2UgdGhlcmUgaXMgYSBkZXBlbmRlbmN5IHRoYXQgYXJpYV9yb2xlX3ZhbGlkIHJ1bnMgZmlyc3QsXG4vLyBhbmQgdGhlIGluZm8gaXMgcGFzc2VkIGJ5IGNhY2hlLCBidXQgdGhlcmUgaXNuJ3QgYSBkZXBlbmRlbmN5IGluIHRoZSBGYWlsXzIgc2NlbmFyaW8sIHNvIHJlZ3VsYXJcbi8vIGRlcGVuZGVuY3kgY2Fubm90IGJlIHVzZWRcbmV4cG9ydCBjb25zdCBhcmlhX2F0dHJpYnV0ZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICAvLyBUaGUgdGhlIEFSSUEgcm9sZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiLCBcImFyaWFfcm9sZV92YWxpZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFSSUEgYXR0cmlidXRlcyBzaG91bGQgYmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50IGFuZCBBUklBIHJvbGUgdG8gd2hpY2ggdGhleSBhcmUgYXNzaWduZWRcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIkFSSUEgYXR0cmlidXRlcyBhcmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50IGFuZCBBUklBIHJvbGVcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT4gd2l0aCBBUklBIHJvbGUgXFxcInsyfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT4gd2l0aCBpbXBsaWNpdCBBUklBIHJvbGUgXFxcInsyfVxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sIC8vcmVtb3ZlZCBtYXBwaW5nIHRvIDQuMS4yIGZyb20gaGVyZSBhbmQgaGVscFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtcIjVjMDFlYVwiLCB7IFwiNDZjYTdmXCI6IHsgXCJQYXNzXCI6IFwicGFzc1wiLCBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIjogXCJmYWlsXCIsIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcImZhaWxcIn19XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBvbmx5IGNoZWsgZWxlbWVudCAoMSlcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gaWdub3JlIGlmIG5vIGFyaWEgYXR0cmlidXRlXG4gICAgICAgIGxldCBhcmlhQXR0cmlidXRlczpzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoYXJpYUF0dHJpYnV0ZXMgPT09IG51bGwgfHwgYXJpYUF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgICAgIGxldCByb2xlczogc3RyaW5nW10gPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBpbnZhbGlkIHJvbGUgY2FzZTogaGFuZGxlZCBieSBScHRfQXJpYV9WYWxpZFJvbGUuIElnbm9yZSB0byBhdm9pZCBkdXBsaWNhdGVkIHJlcG9ydFxuICAgICAgICAgICAgaWYgKCFBcmlhVXRpbC5hcmVSb2xlc0RlZmluZWQocm9sZXMpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9ubyBleHBsaWNpdCByb2xlIGRlZmluZWRcbiAgICAgICAgICAgIHJvbGVzID0gIEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBleHBsaWNpdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGZhaWxlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWZhaWxlZEF0dHJpYnV0ZXMgfHwgZmFpbGVkQXR0cmlidXRlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIsIFthcmlhQXR0cmlidXRlcy5qb2luKFwiLCBcIiksIHRhZ05hbWUsIHJvbGVzLmpvaW4oXCIsIFwiKV0pO1xuXG4gICAgICAgIGlmIChyb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAoZXhwbGljaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiLCBbZmFpbGVkQXR0cmlidXRlcy5qb2luKFwiLCBcIiksIHRhZ05hbWUsIHJvbGVzLmpvaW4oXCIsIFwiKV0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiLCBbZmFpbGVkQXR0cmlidXRlcy5qb2luKFwiLCBcIiksIHRhZ05hbWUsIFwibm9uZVwiXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOnRvb2xiYXJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlVG9vbGJhclVuaXF1ZUxhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJ0b29sYmFyXFxcIiByb2xlcyBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInRvb2xiYXJcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSwgLy91cGRhdGVkIG1hcHBpbmcgdG8gbWF0Y2ggb3RoZXIgbGFuZG1hcmsgcmVnaW9ucyBydWxlc1xuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcInRvb2xiYXJcIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IEFyaWFVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV93aWRnZXRfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9XaWRnZXRMYWJlbHNfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3dpZGdldF9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkludGVyYWN0aXZlIGNvbXBvbmVudCBtdXN0IGhhdmUgYSBwcm9ncmFtbWF0aWNhbGx5IGFzc29jaWF0ZWQgbmFtZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbnRlcmFjdGl2ZSBjb21wb25lbnQgd2l0aCBBUklBIHJvbGUgJ3swfScgZG9lcyBub3QgaGF2ZSBhIHByb2dyYW1tYXRpY2FsbHkgYXNzb2NpYXRlZCBuYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIm02YjFxM1wiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8qIHJlbW92ZWQgdGhlIHJvbGUgY2hlY2sgcm9sZT0gcHJlc2VudGF0aW9uIGFuZCByb2xlPW5vbmUgc2luY2UgdGhlc2UgMiByb2xlcyBhcmUgbm90IGluIHRoZSBsaXN0IG9mIHdpZGdldCB0eXBlIHJvbGVzICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpICYmXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJoaWRkZW5cIikgfHxcbiAgICAgICAgICAgIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpICYmXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInNlYXJjaGJveFwiKVxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBkaWFnbm9zZSB0aGF0IGEgY29tYm9ib3ggaW5wdXQgdGV4dGJveCBoYXMgYSBsYWJlbChnaXRodWIgaXNzdWUgIzExMDQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtUm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBIYW5kbGVkIGJ5IGlucHV0X2xhYmVsX2V4aXN0c1xuICAgICAgICBsZXQgc2tpcFJvbGVzID0gW1xuICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgIFwiY2hlY2tib3hcIixcbiAgICAgICAgICAgIFwiY29tYm9ib3hcIixcbiAgICAgICAgICAgIFwibGlzdGJveFwiLFxuICAgICAgICAgICAgXCJtZW51aXRlbWNoZWNrYm94XCIsXG4gICAgICAgICAgICBcIm1lbnVpdGVtcmFkaW9cIixcbiAgICAgICAgICAgIFwicmFkaW9cIixcbiAgICAgICAgICAgIFwic2VhcmNoYm94XCIsXG4gICAgICAgICAgICBcInNsaWRlclwiLFxuICAgICAgICAgICAgXCJzcGluYnV0dG9uXCIsXG4gICAgICAgICAgICBcInN3aXRjaFwiLFxuICAgICAgICAgICAgXCJ0ZXh0Ym94XCIsXG4gICAgICAgICAgICBcInByb2dyZXNzYmFyXCIsXG4gICAgICAgICAgICBcImxpbmtcIixcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHNraXBSb2xlcy5pbmNsdWRlcyhlbGVtUm9sZSkpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0YWdOYW1lID09PSBcIm91dHB1dFwiIHx8XG4gICAgICAgICAgICAodGFnTmFtZSA9PT0gXCJpbnB1dFwiICYmXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJmaWxlXCIpXG4gICAgICAgICkge1xuICAgICAgICB9XG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgLy8gRm9ybS9pbnB1dCBlbGVtZW50cyBhcmUgY2hlY2tlZCBieSBHNDEsIHdlIHNraXAgdGhlbSBmcm9tIHRoaXMgcnVsZS4gR2l0aHViIGlzc3VlIDQ0OVxuICAgICAgICAgICAgbGV0IHNraXBFbGVtZW50cyA9IFtcbiAgICAgICAgICAgICAgICBcImlucHV0XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiLFxuICAgICAgICAgICAgICAgIFwic2VsZWN0XCIsXG4gICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICBcImRhdGFsaXN0XCIsXG4gICAgICAgICAgICAgICAgXCJvcHRncm91cFwiLFxuICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJrZXlnZW5cIixcbiAgICAgICAgICAgICAgICBcIm91dHB1dFwiLFxuICAgICAgICAgICAgICAgIFwicHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgICBcIm1ldGVyXCIsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNraXBFbGVtZW50cy5pbmRleE9mKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpICE9XG4gICAgICAgICAgICAgICAgLTFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXZvaWQgZGlhZ25vc2luZyB0aGUgcG9wdXAgbGlzdCBvZiBhIGNvbWJvYm94LlxuICAgICAgICBsZXQgcm9sZXNUb0NoZWNrID0gW1wibGlzdGJveFwiLCBcInRyZWVcIiwgXCJncmlkXCIsIFwiZGlhbG9nXCJdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvbGVzVG9DaGVjay5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgcm9sZXNUb0NoZWNrW2pdKSkge1xuICAgICAgICAgICAgICAgIGxldCBjb21ib2JveGVzID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgXCJjb21ib2JveFwiLFxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbWJvYm94ZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ID0gY29tYm9ib3hlc1trXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFfb3ducyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJvYm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhcmlhLW93bnNcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJpYV9vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ducyA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhX293bnMudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duc1tpXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHByb2hpYml0ZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICAvL2dldCBhdHRyaWJ1dGUgcm9sZXMgYXMgd2VsbCBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICBsZXQgbnVtV2lkZ2V0c1Rlc3RlZCA9IDA7XG4gICAgICAgIGxldCBpbnRlcmFjdGl2ZVJvbGVUeXBlcyA9IFtcIndpZGdldFwiLCBcImxpdmVSZWdpb25cIiwgXCJ3aW5kb3dcIl07XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByb2xlcy5sZW5ndGg7IHBhc3NlZCAmJiBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBwYXR0ZXJuID0gZGVzaWduUGF0dGVybnNbcm9sZXNbaV1dO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcGF0dGVybiAmJlxuICAgICAgICAgICAgICAgIHBhdHRlcm4ubmFtZVJlcXVpcmVkICYmXG4gICAgICAgICAgICAgICAgcGF0dGVybi5yb2xlVHlwZSAmJlxuICAgICAgICAgICAgICAgIGludGVyYWN0aXZlUm9sZVR5cGVzLmluY2x1ZGVzKHBhdHRlcm4ucm9sZVR5cGUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICArK251bVdpZGdldHNUZXN0ZWQ7XG5cbiAgICAgICAgICAgICAgICAvLyBBbGwgd2lkZ2V0cyBtYXkgaGF2ZSBhbiBhdXRob3Igc3VwcGxpZWQgYWNjZXNzaWJsZSBuYW1lLlxuICAgICAgICAgICAgICAgIC8vIFRpdGxlIGlzIGxlZ2FsLCBidXQgZG9uJ3QgYWR2ZXJ0aXNlIGl0cyB1c2UgaW4gZG9jdW1lbnRhdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBFbmNvdXJhZ2UgdXNlIG9mIGFyaWEtbGFiZWwsIGFyaWEtbGFiZWxsZWRieSBvciBodG1sIGxhYmVsIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKTtcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXBhc3NlZCAmJlxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLm5hbWVGcm9tICYmXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm4ubmFtZUZyb20uaW5kZXhPZihcImNvbnRlbnRzXCIpID49IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGlmIHdpZGdldCdzIGFjY2Vzc2libGUgbmFtZSBpcyBzdXBwbGllZCBieSBlbGVtZW50J3MgaW5uZXIgdGV4dFxuICAgICAgICAgICAgICAgICAgICAvLyBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRPckFsdChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQgaGFzIGltcGxpY2l0IGxhYmVsLCBsaWtlIDxsYWJlbD48aW5wdXQgLi4uLj5hYmMgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbXBsaWNpdExhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFwYXNzZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgRE9NVXRpbC5jbGVhbldoaXRlc3BhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLm5hbWVGcm9tLmluZGV4T2YoXCJwcm9oaWJpdGVkXCIpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvaGliaXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG51bVdpZGdldHNUZXN0ZWQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbZWxlbVJvbGVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vVE9ET1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYgKHByb2hpYml0ZWQpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFzY2lpYXJ0X2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXNjaWlhcnRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnByZSwgZG9tOmxpc3RpbmcsIGRvbTp4bXAsIGRvbTpwbGFpbnRleHRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9QcmVfQVNDSUlBcnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXNjaWlhcnRfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiYXNjaWlhcnRfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXNjaWlhcnRfYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgQVNDSUkgYXJ0IGhhcyBhIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBU0NJSSBhcnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIERlY2lzaW9uIGluIHBsYW5uaW5nIDkvNy8yMyB0aGF0IHRoaXMgcnVsZSBjYXVzZXMgbW9yZSByZXZpZXdzIHRoYXQgd2Ugc2VlIGFjdHVhbCBwcm9ibGVtcyBpbiBjb250ZW50LCBzbyB0dXJuIHRoZXNlIHJ1bGVzIG9mZlxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgICovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvLyBGaXggZm9yIElEV0Igd3JpdGVycy4gRG9uJ3QgdHJpZ2dlciBpZiBjb250ZW50IGlzIGluIGEgY29kZSBlbGVtZW50LiAgVGhlIGNvZGUgZWxlbWVudCBpcyBzZWFyY2hlZCBmb3JcbiAgICAgICAgLy8gaW4gdmFyaW91cyBwbGFjZXMgYmVjYXVzZSBvZiB0aGUgd2VpcmQgd2F5IHZhcmlvdXMgYnJvd3NlcnMgcmVuZGVyIDxjb2RlPjxwcmU+PC9wcmU+PC9jb2RlLiAgRmlyZWZveCxcbiAgICAgICAgLy8gSHRtbFVuaXQgYW5kIENocm9tZSBhbGwgcmVuZGVyIGRpZmZlcmVudGx5LiAgRmlyZWZveDogPGNvZGU+PC9jb2RlPjxwcmU+PC9wcmU+ICBIdG1sVW5pdDogPC9jb2RlPjxwcmU+PGNvZGU+PC9jb2RlPjwvcHJlPlxuICAgICAgICAvLyBTZWUgdW5pdCB0ZXN0IENvZGVFbGVtZW50QWJvdmVQcmVFbGVtZW50Lmh0bWwuICBEb24ndCBrbm93IGhvdyBSUFQgcmVuZGVycywgc28gY292ZXIgYWxsIHRoZSBiYXNlcy5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJwcmVcIikge1xuICAgICAgICAgICAgaWYgKChydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmcgJiYgcnVsZUNvbnRleHQucHJldmlvdXNTaWJsaW5nLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJjb2RlXCIpIHx8XG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjb2RlXCIpLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImNvZGVcIikpIHtcblxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgdHh0VmFsdWUgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICBsZXQgbGFzdENoYXJhY3RlciA9IFwiXCI7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSB0ZXh0IGNvbnRlbnRcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgcGFzc2VkICYmIChpZHggPCB0eHRWYWx1ZS5sZW5ndGgpOyArK2lkeCkge1xuICAgICAgICAgICAgbGV0IGNoU3RyID0gdHh0VmFsdWUuc3Vic3RyKGlkeCwgMSk7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBhbHBoYW51bWVyaWMgb3IgcHVuY3R1YXRpb25cbiAgICAgICAgICAgIGlmICgvW1xcdyFAIyQlJlxcKigpLiw/XFxbXFxde308Pj1cIjpcXC9cXFxcLV0vLnRlc3QoY2hTdHIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRGV0ZWN0IHNhbWUgY2hhcmFjdGVyIHNlcXVlbmNlXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RDaGFyYWN0ZXIgPT0gY2hTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgKyAxOztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9cXHMvLnRlc3QoY2hTdHIpKSB7XG4gICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgPSBub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ICsgMTtcbiAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RDaGFyYWN0ZXIgPSBjaFN0cjtcblxuICAgICAgICAgICAgLy8gTWFrZSB0aGUgZGVjaXNpb25cbiAgICAgICAgICAgIGlmIChub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ID49IDUgfHwgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA+PSA0KSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBibGlua19jc3NfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImJsaW5rX2Nzc19yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOipbc3R5bGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxpbmtfQ1NTVHJpZ2dlcjFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBibGlua19jc3NfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGJsaW5rX2Nzc19yZXZpZXcuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBibGlua19jc3NfcmV2aWV3Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkRvIG5vdCB1c2UgdGhlIFxcXCJibGlua1xcXCIgdmFsdWUgb2YgdGhlICd0ZXh0LWRlY29yYXRpb24nIHByb3BlcnR5IGZvciBsb25nZXIgdGhhbiBmaXZlIHNlY29uZHNcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJDaGVjayB0aGUgXFxcImJsaW5rXFxcIiB2YWx1ZSBvZiB0aGUgQ1NTICd0ZXh0LWRlY29yYXRpb24nIHByb3BlcnR5IGlzIG5vdCB1c2VkIGZvciBtb3JlIHRoYW4gdGhhbiBmaXZlIHNlY29uZHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjIuMi4yXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdGV4dFZhbHVlID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKCdzdHlsZScpKSB7XG4gICAgICAgICAgICB0ZXh0VmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdGV4dFZhbHVlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcInRleHQtZGVjb3JhdGlvbjpibGlua1wiKSA9PSAtMTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgYmxpbmtfZWxlbV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImJsaW5rX2VsZW1fZGVwcmVjYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQmxpbmtfQWx3YXlzVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBibGlua19lbGVtX2RlcHJlY2F0ZWQuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYmxpbmtfZWxlbV9kZXByZWNhdGVkLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbnRlbnQgdGhhdCBibGlua3MgcGVyc2lzdGVudGx5IG11c3Qgbm90IGJlIHVzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29udGVudCBmb3VuZCB0aGF0IGJsaW5rcyBwZXJzaXN0ZW50bHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjIuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGJsb2NrcXVvdGVfY2l0ZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYmxvY2txdW90ZV9jaXRlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJsb2NrcXVvdGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9CbG9ja3F1b3RlX0hhc0NpdGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYmxvY2txdW90ZV9jaXRlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiYmxvY2txdW90ZV9jaXRlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYmxvY2txdW90ZV9jaXRlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgPGJsb2NrcXVvdGU+IHNob3VsZCBoYXZlIGEgJ2NpdGUnIGF0dHJpYnV0ZSBhbmQgbm90IGJlIHVzZWQgZm9yIGluZGVudGF0aW9uIG9ubHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJVc2UgPGJsb2NrcXVvdGU+IG9ubHkgZm9yIHF1b3RhdGlvbnMsIG5vdCBpbmRlbnRhdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJjaXRlXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IGNpdGVFbGVtcyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJjaXRlXCIpO1xuICAgICAgICAgICAgcGFzc2VkID0gY2l0ZUVsZW1zICE9IG51bGwgJiYgY2l0ZUVsZW1zLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmNhbnZhc1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19DYW52YXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGFjY2Vzc2liaWxpdHkgb2YgdGhlIDxjYW52YXM+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGNhbnZhcz4gZWxlbWVudCBtYXkgbm90IGJlIGFjY2Vzc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCIsIFwiMi4xLjFcIiwgXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuaW5uZXJIVE1MLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgY2FwdGlvbl90cmFja19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY2FwdGlvbl90cmFja19leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTp2aWRlb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19WaWRlb19IYXNOb1RyYWNrXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJjYXB0aW9uX3RyYWNrX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY2FwdGlvbl90cmFja19leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGNhcHRpb25zIGFyZSBhdmFpbGFibGUgZm9yIGFueSBtZWFuaW5nZnVsIGF1ZGlvIG9yIHByb3ZpZGUgYSBjYXB0aW9uIHRyYWNrIGZvciB0aGUgPHZpZGVvPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8dmlkZW8+IGVsZW1lbnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZSBmb3IgYW55IG1lYW5pbmdmdWwgYXVkaW8gY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4yLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTFZpZGVvRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGlnbm9yZSBkZWNvcmF0aXZlIHZpZGVvIGlmIHVzZXIgdXNlcyBhcmlhLWhpZGRlblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cmFja3MgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyYWNrXCIpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgdHJhY2tzW2ldLmdldEF0dHJpYnV0ZShcImtpbmRcIikgPT09ICdjYXB0aW9ucyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2tzIGZvciBhZGRpdGlvbiBvZiBkeW5hbWljIHRyYWNrc1xuICAgICAgICBpZiAocnVsZUNvbnRleHQudGV4dFRyYWNrcyAmJiBydWxlQ29udGV4dC50ZXh0VHJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVsZUNvbnRleHQudGV4dFRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCBydWxlQ29udGV4dC50ZXh0VHJhY2tzW2ldLmtpbmQgPT09ICdjYXB0aW9ucyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX21pc3NpbmdcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm90X2luX3BvcHVwXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2FjdGl2ZV9yb2xlX2ludmFsaWRcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCInYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyB1c2VkIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgY29tYm9ib3hcIixcbiAgICAgICAgICAgIFwiRmFpbF9taXNzaW5nXCI6IFwiVGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiBkb2VzIG5vdCBleGlzdFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF9pbl9wb3B1cFwiOiBcIlRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgXFxcInswfVxcXCIgZG9lcyBub3QgZXhpc3Qgd2l0aGluIHRoZSBwb3B1cCByZWZlcmVuY2VkIGJ5ICdpZCcgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfcm9sZV9pbnZhbGlkXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIHJlZmVyZW5jZXMgYW4gZWxlbWVudCB3aXRoIHRoZSByb2xlcyBcXFwiezF9XFxcIiwgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZSBvZiAnb3B0aW9uJywgJ2dyaWRjZWxsJywgJ3JvdycsIG9yICd0cmVlaXRlbSdcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfbm90X3NlbGVjdGVkXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIHJlZmVyZW5jZXMgYW4gZWxlbWVudCB0aGF0IGRvZXMgbm90IGhhdmUgJ2FyaWEtc2VsZWN0ZWQnIHNldCB0byB0cnVlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgbXVzdCBiZSB1c2VkIHRvIGRlZmluZSBmb2N1cyB3aXRoaW4gdGhlIGNvbWJvYm94IHBvcHVwLCBleGNlcHQgd2hlbiB1c2luZyBhIGRpYWxvZyBwb3B1cFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGNhY2hlZEVsZW0gPSBjYWNoZVtjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoXTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cEVsZW1lbnQsIHBvcHVwSWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBUaGlzIHJ1bGUgb25seSBhcHBsaWVzIGlmIHRoZSBhY3RpdmVkZXNjZW5kYW50IGlzIHNwZWNpZmllZFxuICAgICAgICBsZXQgYWN0aXZlSWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgIGlmICghYWN0aXZlSWQgfHwgYWN0aXZlSWQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWN0aXZlRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBhY3RpdmVJZCk7XG4gICAgICAgIGlmICghYWN0aXZlRWxlbSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9taXNzaW5nXCIsIFthY3RpdmVJZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgLy8gZXhhbWluZSB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKHBvcHVwRWxlbWVudCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKCFmb3VuZCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gcG9wdXBFbGVtZW50ICYmIG53Lm5vZGUgIT0gcG9wdXBFbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcImlkXCIpID09PSBhY3RpdmVJZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gW107XG5cbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZVBhc3MoXCJGYWlsX25vdF9pbl9wb3B1cFwiLCBbYWN0aXZlSWQsIHBvcHVwSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWN0aXZlUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhhY3RpdmVFbGVtLCB0cnVlKTtcbiAgICAgICAgbGV0IHZhbGlkUm9sZXMgPSBbXCJvcHRpb25cIiwgXCJncmlkY2VsbFwiLCBcInJvd1wiLCBcInRyZWVpdGVtXCJdLmZpbHRlcigodmFsaWRSb2xlKSA9PiBhY3RpdmVSb2xlcy5pbmNsdWRlcyh2YWxpZFJvbGUpKTtcbiAgICAgICAgaWYgKHZhbGlkUm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfYWN0aXZlX3JvbGVfaW52YWxpZFwiLCBbYWN0aXZlSWQsIGFjdGl2ZVJvbGVzLmpvaW4oXCIsXCIpXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGl2ZUVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1zZWxlY3RlZFwiKSAhPT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9hY3RpdmVfbm90X3NlbGVjdGVkXCIsIFthY3RpdmVJZF0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJjb21ib2JveF9hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbmxpbmVcIjogXCJGYWlsX2lubGluZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiVGhlIGNvbWJvYm94IGRvZXMgbm90IHVzZSAnYXJpYS1hdXRvY29tcGxldGUnIHZhbHVlICdcXFwiaW5saW5lXFxcIicgbm9yIGRvZXMgaXQgaGF2ZSAnYXJpYS1hdXRvY29tcGxldGUnIGRlZmluZWQgd2l0aGluIHRoZSBwb3B1cFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgY29tYm9ib3ggaGFzIHRoZSAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBpbmNvcnJlY3RseSBzZXQgb24gYW4gZWxlbWVudCB3aXRoaW4gdGhlIHBvcHVwIHJlZmVyZW5jZWQgYnkgXFxcInswfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbmxpbmVcIjogXCJUaGUgY29tYm9ib3ggZG9lcyBub3Qgc3VwcG9ydCBhbiAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgdG8gJ1xcXCJpbmxpbmVcXFwiJyBcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGNvbWJvYm94IHRoYXQgc3VwcG9ydHMgYXV0b2NvbXBsZXRpb24gYmVoYXZpb3IgbXVzdCBoYXZlIHRoZSAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBvbmx5IG9uIGl0cyB0ZXh0IGlucHV0IGVsZW1lbnQgd2l0aCBhIHZhbGlkIHZhbHVlOyBhIHZhbHVlIG9mICdcXFwiaW5saW5lXFxcIicgaXMgbm90IHN1cHBvcnRlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgY2FjaGVkRWxlbSA9IGNhY2hlW2NvbnRleHRbXCJkb21cIl0ucm9sZVBhdGhdO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwSWQsIHBvcHVwRWxlbWVudCB9ID0gY2FjaGVkRWxlbTtcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIikgPT09IFwiaW5saW5lXCIpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9pbmxpbmVcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7IFxuICAgICAgICAvLyBleGFtaW5lIHRoZSBjaGlsZHJlblxuICAgICAgICBpZiAocG9wdXBFbGVtZW50ICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAvLyBpZiBwb3B1cEVsZW1lbnQgaXRzZWxmIGhhcyBcImFyaWEtYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIHBhc3NlZCA9ICFwb3B1cEVsZW1lbnQuaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIik7XG4gICAgICAgICAgICAvLyBpZiBhbnkgY2hpbGQgb2YgcG9wdXBFbGVtZW50IGhhcyBcImFyaWEtYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgcG9wdXBFbGVtZW50LmNoaWxkcmVuICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobncuYkVuZFRhZyAmJiBudy5ub2RlID09PSBwb3B1cEVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3BvcHVwSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZnVuY3Rpb24gcGF0dGVybkRldGVjdChlbGVtOiBFbGVtZW50KTogU3RyaW5nIHtcbiAgICAvLyBjaGVjayAnZXhwbGljaXQnIHJvbGUgY29tYm9ib3ggYW5kIHRoYXQgaXQgaXMgbm90IDxzZWxlY3Q+LiBcbiAgICBpZiAoZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2VsZWN0XCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpICE9PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgcmV0dXJuIFwiaW1wbGljaXRcIjtcbiAgICB9IGVsc2UgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiXG4gICAgICAgICYmICghZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJ0ZXh0XCIpXG4gICAgICAgICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpICYmICFlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikpIHtcbiAgICAgICAgLy8gTG9va3MgbGlrZSB0aGlzIGlzIGFuIEFSSUEgMS4wIHBhdHRlcm4sIHdoaWNoIHRoZSBBUklBIDEuMiBzcGVjIHNheXMgdG8gY29udGludWUgdG8gYWxsb3dcbiAgICAgICAgcmV0dXJuIFwiMS4wXCI7XG4gICAgfSBlbHNlIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiaW5wdXRcIlxuICAgICAgICAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSAmJiAhZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgIC8vIExvb2tzIGxpa2UgdGhpcyBpcyBhbiBBUklBIDEuMSBwYXR0ZXJuLCB3aGljaCB0aGUgQVJJQSAxLjIgc3BlYyBzYXlzIGlzIG5vdyBpbnZhbGlkXG4gICAgICAgIHJldHVybiBcIjEuMVwiO1xuICAgIH1cbiAgICAvLyBBc3N1bWUgdGhleSdyZSB0cnlpbmcgdG8gZG8gdGhlIGxhdGVzdCwgMS4yIHBhdHRlcm5cbiAgICByZXR1cm4gXCIxLjJcIjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2Rlc2lnbl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9kZXNpZ25fdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImNvbWJvYm94X3ZlcnNpb25cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMFwiOiBcIlBhc3NfMS4wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4xXCI6IFwiRmFpbF8xLjFcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJcIjogXCJQYXNzXzEuMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMVwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMFwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBpcyBkZXRlY3RlZCBhcyBBUklBIDEuMCwgd2hpY2ggaXMgYWxsb3dlZCBieSBBUklBIDEuMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMVwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBpcyBkZXRlY3RlZCBhcyBBUklBIDEuMSwgd2hpY2ggaXMgbm90IGFsbG93ZWQgYnkgQVJJQSAxLjJcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gaXMgZGV0ZWN0ZWQgYXMgQVJJQSAxLjJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gbXVzdCBiZSB2YWxpZCBmb3IgQVJJQSAxLjJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF0dGVybiA9IHBhdHRlcm5EZXRlY3QocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIFdlIGRvbid0IGFzc2VzcyBuYXRpdmUgc2VsZWN0IGVsZW1lbnRzIGhlcmVcbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IFwiaW1wbGljaXRcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGV4cGFuZGVkID0gKEFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1leHBhbmRlZFwiKSB8fCBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgIGxldCBlZGl0YWJsZSA9IHRhZ05hbWUgPT09IFwiaW5wdXRcIiAmJiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgfHwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIik7XG5cbiAgICAgICAgbGV0IGtleSA9IGNvbnRleHRbXCJkb21cIl0ucm9sZVBhdGg7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGxldCBjYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY2FjaGVba2V5XSA9IHtcbiAgICAgICAgICAgICAgICBcImlucHV0RWxlbWVudFwiOiBlZGl0YWJsZSA/IHJ1bGVDb250ZXh0IDogbnVsbCxcbiAgICAgICAgICAgICAgICBcInBhdHRlcm5cIjogcGF0dGVybixcbiAgICAgICAgICAgICAgICBcImV4cGFuZGVkXCI6IGV4cGFuZGVkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwgY2FjaGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8geHBhdGg/XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzEuMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMlwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50c1wiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF90YWJiYWJsZVwiOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfdGFiYmFibGVfY2hpbGRcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJET00gZm9jdXMgaXMgYWxsb3dlZCBvbmx5IG9uIHRoZSBjb21ib2JveCBlbGVtZW50IGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm90X3RhYmJhYmxlXCI6IFwiVGhlIGNvbWJvYm94IGVsZW1lbnQgZG9lcyBub3QgYWxsb3cgRE9NIGZvY3VzIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfdGFiYmFibGVfY2hpbGRcIjogXCJUaGUgcG9wdXAgb2YgdGhlIGNvbWJvYm94IGhhcyBET00gZm9jdXMgb3IgaGFzICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIGRlZmluZWQsIHdoaWNoIGlzIG5vdCBhbGxvd2VkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGFiYmFibGUgZm9jdXMgZm9yIHRoZSBjb21ib2JveCBtdXN0IGJlIGFsbG93ZWQgb25seSBvbiB0aGUgdGV4dCBpbnB1dCwgZXhjZXB0IHdoZW4gdXNpbmcgYSBkaWFsb2cgcG9wdXBcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgY2FjaGVkRWxlbSA9IGNhY2hlW2NvbnRleHRbXCJkb21cIl0ucm9sZVBhdGhdO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgZXhwYW5kZWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBwb3B1cFJvbGUgPSBBcmlhVXRpbC5nZXRSb2xlcyhwb3B1cEVsZW1lbnQsIHRydWUpWzBdO1xuXG4gICAgICAgIGxldCByZXRWYWwgPSBbXVxuICAgICAgICBpZiAoIUNvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9ub3RfdGFiYmFibGVcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBtYWtlcyBzZW5zZSB0byBjaGVjayB0aGUgcG9wdXAgd2hlbiBleHBhbmRlZFxuICAgICAgICAvLyB0aGlzIGRvZXMgbm90IGFwcGx5IHRvIGRpYWxvZ3MsIHJldHVybiBwYXNzIHNpbmNlIHRoZSBtYWluIGVsZW1lbnQgd2FzIGZvY3VzYWJsZSBhYm92ZVxuICAgICAgICBpZiAoZXhwYW5kZWQgPT09IGZhbHNlIHx8IHBvcHVwUm9sZSA9PT0gXCJkaWFsb2dcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGV4YW1pbmUgdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChwb3B1cEVsZW1lbnQgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAvLyBpZiBwb3B1cEVsZW1lbnQgaXRzZWxmIGhhcyBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXG4gICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHBvcHVwRWxlbWVudCkgJiYgIUFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocG9wdXBFbGVtZW50LCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTs7XG4gICAgICAgICAgICAvLyBpZiBhbnkgY2hpbGQgb2YgcG9wdXBFbGVtZW50IGhhcyBcImFyaWEtYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgcG9wdXBFbGVtZW50LmNoaWxkcmVuICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhQXJpYVV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShudy5ub2RlLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudy5iRW5kVGFnICYmIG53Lm5vZGUgPT09IHBvcHVwRWxlbWVudC5sYXN0RWxlbWVudENoaWxkKSBicmVhazsgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImNvbWJvYm94X2hhc3BvcHVwXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIjogXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIjogXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiVGhlICdhcmlhLWNvbnRyb2xzJyAoQVJJQSAxLjIpIG9yICdhcmlhLW93bnMnIChBUklBIDEuMCkgYXBwcm9wcmlhdGVseSByZWZlcmVuY2VzIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiOiBcIlRoZSAncm9sZScgdmFsdWUgXFxcInswfVxcXCIgb2YgdGhlIHBvcHVwIGVsZW1lbnQgXFxcInsxfVxcXCIgc2hvdWxkIGJlIG9uZSBvZiBcXFwibGlzdGJveFxcXCIsIFxcXCJncmlkXFxcIiwgXFxcInRyZWVcXFwiIG9yIFxcXCJkaWFsb2dcXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwiOiBcIlRoZSB2YWx1ZSBvZiB0aGUgY29tYm9ib3ggJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCBtYXRjaCB0aGUgJ3JvbGUnIHZhbHVlIG9mIHRoZSBwb3B1cCBlbGVtZW50IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGNvbWJvYm94IGF0dHJpYnV0ZSAnYXJpYS1oYXNwb3B1cCcgdmFsdWUgbXVzdCBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHJvbGUgb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSAnYXJpYS1jb250cm9scycgKEFSSUEgMS4yKSBvciAnYXJpYS1vd25zJyAoQVJJQSAxLjApXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBjb25zdCBjYWNoZWRFbGVtID0gY2FjaGVbY2FjaGVLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgcG9wdXBJZCB9ID0gY2FjaGVkRWxlbTtcbiAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgY29tYm9ib3ggaXMgcHJvYmFibHkgY29sbGFwc2VkLiBBIHJlZmVyZW5jZSBlcnJvciBpc1xuICAgICAgICAvLyBkZXRlY3RlZCBpbiBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcbiAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDaGVjayB0aGF0IHBvcHVwIHJvbGUgaXMgbGlzdGJveCwgZ3JpZCwgdHJlZSwgb3IgZGlhbG9nIGFuZCB0aGF0IGl0IG1hdGNoZXMgdGhlIGNvbWJvYm94XG4gICAgICAgIGxldCBwb3B1cFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocG9wdXBFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgbGV0IHZhbGlkUm9sZXMgPSBbXCJsaXN0Ym94XCIsIFwiZ3JpZFwiLCBcInRyZWVcIiwgXCJkaWFsb2dcIl0uZmlsdGVyKCh2YWxpZFJvbGUpID0+IHBvcHVwUm9sZXMuaW5jbHVkZXModmFsaWRSb2xlKSk7XG4gICAgICAgIGlmICh2YWxpZFJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIiwgW3BvcHVwUm9sZXMuam9pbihcIixcIiksIHBvcHVwSWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBwb3B1cFJvbGUgPSB2YWxpZFJvbGVzWzBdO1xuICAgICAgICAgICAgbGV0IGhhc3BvcHVwVmFsID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSB8fCBcImxpc3Rib3hcIjtcbiAgICAgICAgICAgIC8vIFBvcHVwIHJvbGUgbXVzdCBtYXRjaCBhcmlhLWhhc3BvcHVwIHVubGVzcyBwb3B1cFJvbGUgaXMgbGlzdGJveCwgdGhlbiBhcmlhLWhhc3BvcHVwIHNob3VsZCBub3QgYmUgZGVmaW5lZCAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChoYXNwb3B1cFZhbCAhPT0gcG9wdXBSb2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvcHVwUm9sZSAhPT0gXCJsaXN0Ym94XCIgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIiwgW2hhc3BvcHVwVmFsLCBwb3B1cFJvbGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZTogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X2Rlc2lnbl92YWxpZFwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2V4cGFuZGVkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfY29sbGFwc2VkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfZXhwYW5kZWRcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMl9jb2xsYXBzZWRcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMl9taXNzaW5nX2NvbnRyb2xzXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMl9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfZXhwYW5kZWRfaGlkZGVuXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdhcmlhLWNvbnRyb2xzJyAoZm9yIEFSSUEgMS4yKSBvciB0aGUgJ2FyaWEtb3ducycgKGZvciBBUklBIDEuMCkgYXR0cmlidXRlIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBtdXN0IHJlZmVyZW5jZSBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfZXhwYW5kZWRcIjogXCJUaGUgY29tYm9ib3ggcG9wdXAgcmVmZXJlbmNlZCBieSAnYXJpYS1vd25zJyAoQVJJQSAxLjApIGV4aXN0cyBhbmQgaXMgdmlzaWJsZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMF9jb2xsYXBzZWRcIjogXCJUaGUgY29tYm9ib3ggcG9wdXAgaW4gaXRzIGNvbGxhcHNlZCBzdGF0ZSBkb2VzIG5vdCByZWZlcmVuY2UgYW55IHZpc2libGUgcG9wdXAgYXMgcmVxdWlyZWRcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfZXhwYW5kZWRcIjogXCJUaGUgY29tYm9ib3ggcG9wdXAgcmVmZXJlbmNlZCBieSAnYXJpYS1jb250cm9scycgKEFSSUEgMS4yKSBleGlzdHMgYW5kIGlzIHZpc2libGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfY29sbGFwc2VkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIGluIGl0cyBjb2xsYXBzZWQgc3RhdGUgZG9lcyBub3QgcmVmZXJlbmNlIGFueSB2aXNpYmxlIHBvcHVwIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX21pc3Npbmdfb3duc1wiOiBcIlRoZSAnYXJpYS1vd25zJyBhdHRyaWJ1dGUgb2YgdGhlIGV4cGFuZGVkIGNvbWJvYm94IGlzIG1pc3NpbmdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiOiBcIlRoZSAnYXJpYS1jb250cm9scycgYXR0cmlidXRlIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBpcyBtaXNzaW5nXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiVGhlICdhcmlhLW93bnMnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggZG9lcyBub3QgcmVmZXJlbmNlIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMl9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcIlRoZSAnYXJpYS1jb250cm9scycgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBkb2VzIG5vdCByZWZlcmVuY2UgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfZXhwYW5kZWRfaGlkZGVuXCI6IFwiVGhlIGNvbWJvYm94ICdhcmlhLWV4cGFuZGVkJyBhdHRyaWJ1dGUgaXMgdHJ1ZSwgYnV0IHRoZSBjb21ib2JveCBwb3B1cCBpcyBub3QgdmlzaWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCI6IFwiVGhlIGNvbWJvYm94ICdhcmlhLWV4cGFuZGVkJyBhdHRyaWJ1dGUgaXMgZmFsc2UsIGJ1dCB0aGUgY29tYm9ib3ggcG9wdXAgaXMgdmlzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCI0ZThhYjZcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMF9leHBhbmRlZFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfY29sbGFwc2VkXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMl9leHBhbmRlZFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfY29sbGFwc2VkXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfZXhwYW5kZWRfaGlkZGVuXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBjYWNoZUtleSA9IGNvbnRleHRbXCJkb21cIl0ucm9sZVBhdGg7XG4gICAgICAgIGNvbnN0IGNhY2hlZEVsZW0gPSBjYWNoZVtjYWNoZUtleV07XG4gICAgICAgIGlmICghY2FjaGVkRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgcGF0dGVybiwgZXhwYW5kZWQgfSA9IGNhY2hlZEVsZW07XG5cbiAgICAgICAgbGV0IHBvcHVwSWQ7XG4gICAgICAgIGxldCBwb3B1cEVsZW1lbnQ7XG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9wdXBJZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcbiAgICAgICAgICAgIHBvcHVwRWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBwb3B1cElkKTtcbiAgICAgICAgICAgIGlmICghcG9wdXBFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMF9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiLCBbcG9wdXBJZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT09IFwiMS4yXCIpIHtcbiAgICAgICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcHVwSWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpO1xuICAgICAgICAgICAgcG9wdXBFbGVtZW50ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIHBvcHVwSWQpO1xuICAgICAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4yX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCIsIFtwb3B1cElkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGhhdmUgYW4gZWxlbWVudCwgc3RpY2sgaXQgaW4gdGhlIGNhY2hlIGFuZCB0aGVuIGNoZWNrIGl0cyByb2xlXG4gICAgICAgIGNhY2hlZEVsZW0ucG9wdXBJZCA9IHBvcHVwSWQ7XG4gICAgICAgIGNhY2hlZEVsZW0ucG9wdXBFbGVtZW50ID0gcG9wdXBFbGVtZW50O1xuXG5cbiAgICAgICAgaWYgKGV4cGFuZGVkICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9jb21ib2JveF9leHBhbmRlZF9oaWRkZW5cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoIWV4cGFuZGVkICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IFwiMS4wXCIpIHtcbiAgICAgICAgICAgIGlmIChleHBhbmRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMS4wX2V4cGFuZGVkXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMF9jb2xsYXBzZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMl9leHBhbmRlZFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjJfY29sbGFwc2VkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGRlYnVnX3BhdGhzOiBSdWxlID0ge1xuICAgIGlkOiBcImRlYnVnX3BhdGhzXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiREVCVUdcIl0sXG4gICAgICAgIG51bTogXCIxXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBydWxlQ29udGV4dC5zZXRBdHRyaWJ1dGUoXCJkb21QYXRoXCIsIGNvbnRleHRbXCJkb21cIl0ucm9sZVBhdGgpO1xuICAgICAgICBydWxlQ29udGV4dC5zZXRBdHRyaWJ1dGUoXCJhcmlhUGF0aFwiLCBjb250ZXh0W1wiYXJpYVwiXS5yb2xlUGF0aCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZGV0ZWN0b3JfdGFiYmFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZGV0ZWN0b3JfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJFWFRFTlNJT05TXCJdLFxuICAgICAgICBudW06IFwiMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LklORk9STUFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGllckNvbnRleHQgPSBjb250ZXh0SGllcmFyY2hpZXMuYXJpYVtjb250ZXh0SGllcmFyY2hpZXMuYXJpYS5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFtdLCBbe1xuICAgICAgICAgICAgbmFtZTogaGllckNvbnRleHQuYXR0cmlidXRlcy5uYW1lLFxuICAgICAgICAgICAgcm9sZTogaGllckNvbnRleHQucm9sZSxcbiAgICAgICAgICAgIHRhYmluZGV4OiBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBcIjBcIilcbiAgICAgICAgfV0pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZGlyX2F0dHJpYnV0ZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJkaXJfYXR0cmlidXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KltkaXJdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0VsZW1fRGlyVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJkaXJfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkludmFsaWQgdmFsdWUgdXNlZCBmb3IgdGhlICdkaXInIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidkaXInIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIFxcXCJsdHJcXFwiLCBcXFwicnRsXFxcIiwgb3IgXFxcImF1dG9cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBkaXJTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkaXJcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGRpclN0ciA9PSBcImx0clwiIHx8IGRpclN0ciA9PSBcInJ0bFwiIHx8IGRpclN0ciA9PSBcImF1dG9cIjtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTphW2hyZWZdLGRvbTphcmVhW2hyZWZdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX01lZGlhX0RvY3VtZW50VHJpZ2dlcjJcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgZmlsZSBkb3dubG9hZCBtZWNoYW5pc20gZG9lcyBub3QgY2F1c2UgYSBrZXlib2FyZCB0cmFwXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRmlsZSBkb3dubG9hZCBtZWNoYW5pc21zIHNob3VsZCBiZSBrZXlib2FyZC1vcGVyYWJsZSBhbmQgcHJlc2VydmUgcGFnZSBmb2N1cyBsb2NhdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBocmVmID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dChocmVmKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFbXCIuZG9jeFwiLCBcIi5kb2NcIiwgXCIucGRmXCIsIFwiLm9kdFwiXS5pbmNsdWRlcyhleHQpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlUG90ZW50aWFsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJkcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206KltkcmFnZ2FibGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgLy8gXCJwYXNzX2FsdGVybmF0aXZlXCI6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfdW5kcmFnZ2FibGVcIjogXCJkcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2FsdGVybmF0aXZlXCI6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBkcmFnZ2FibGUgZWxlbWVudCBtdXN0IGhhdmUgYSBcXFwic2luZ2xlIHBvaW50ZXJcXFwiIGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICAvLyBcInBhc3NfYWx0ZXJuYXRpdmVcIjogXCJUaGUgZHJhZ2dhYmxlIGVsZW1lbnQgXFxcInswfVxcXCIgaGFzIGEgXFxcInNpbmdsZSBwb2ludGVyXFxcIiBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJwYXNzX3VuZHJhZ2dhYmxlXCI6IFwiVGhlIGVsZW1lbnQgXFxcInswfVxcXCIgaXMgbm90IGRyYWdnYWJsZVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfYWx0ZXJuYXRpdmVcIjogXCJFbnN1cmUgdGhlIGRyYWdnYWJsZSBlbGVtZW50IFxcXCJ7MH1cXFwiIGhhcyBhIFxcXCJzaW5nbGUgcG9pbnRlclxcXCIgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjUuN1wiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7IFxuICAgICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBjZXJ0YWluIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJwcmVcIiwgXCJjb2RlXCIsIFwic2NyaXB0XCIsIFwibWV0YVwiXSkgIT09IG51bGwgXG4gICAgICAgICAgICB8fCBub2RlTmFtZSA9PT0gXCJib2R5XCIgfHwgbm9kZU5hbWUgPT09IFwiaHRtbFwiIClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImRyYWdnYWJsZVwiKSA9PT0gJ3RydWUnKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2FsdGVybmF0aXZlXCIsIFtub2RlTmFtZV0pO1xuICAgICAgICBlbHNlIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIikgPT09ICdmYWxzZScpIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc191bmRyYWdnYWJsZVwiLCBbbm9kZU5hbWVdKTtcbiAgICAgICAgZWxzZSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthY2Nlc3NrZXldXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FjY2Vzc2tleV9OZWVkTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBhbiBhc3NpZ25lZCAnYWNjZXNza2V5JyBhdHRyaWJ1dGUgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIGFuIGFzc2lnbmVkICdhY2Nlc3NrZXknIGF0dHJpYnV0ZSBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCIzLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvL3NraXAgaWYgdGhlIGVsZW1lbnQgaXMgdGFiYmFibGUsIGl0J3MgY292ZXJlZCBieSBvdGhlciBydWxlc1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIC8vc2tpcCB0aGUgbmF0aXZlIGVsZW1lbnQsIG1vc3RseSB0ZXh0IGVsZW1lbnRzXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgbGV0IHBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXVxuICAgICAgICBpZiAoIXBhdHRlcm5zIHx8ICFwYXR0ZXJucy5uYW1lRnJvbSkgXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gaWdub3JlIGlmIGFjY2Vzc2JsZSBuYW1lIGlzIHJlcXVpcmVkIChjaGVja2VkIGluIG90aGVyIHJ1bGVzKSBvciBwcm9oaWJpdGVkICh0ZXh0IGVsZW1lbnQpICAgIFxuICAgICAgICBpZiAocGF0dGVybnMubmFtZVJlcXVpcmVkIHx8ICFwYXR0ZXJucy5uYW1lRnJvbSB8fCBwYXR0ZXJucy5uYW1lRnJvbS5pbmNsdWRlcyhcInByb2hpYml0ZWRcIikpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NwZWNpYWwgY2FzZTogbGVnZW5kLCBhcyBhIGNoaWxkIG9mIGEgZmllbGRzZXQsIGRlbGVnYXRlIHRoZSBhY2Nlc3NrZXkgY29tbWFuZCB0byB0aGUgZmllbGQgb2YgdGhlIGZpZWxkc2V0IHdoaWNoIGlzIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXMgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50ICYmIHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZpZWxkc2V0JylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBjaGVjayBpZiBhY2Nlc3NpYmxlIG5hbWUgZXhpc3RzXG4gICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAvL2lmIChBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYWNjZXNza2V5XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0VsZW1fVW5pcXVlQWNjZXNzS2V5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCInYWNjZXNza2V5JyBhdHRyaWJ1dGUgdmFsdWUgb24gdGhlIGVsZW1lbnQgaXMgbm90IHVuaXF1ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhY2Nlc3NrZXknIGF0dHJpYnV0ZSB2YWx1ZXMgb24gZWFjaCBlbGVtZW50IG11c3QgYmUgdW5pcXVlIGZvciB0aGUgcGFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiSFRNTFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBtYXAgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWVcIiwge30pO1xuICBcbiAgICAgICAgbGV0IGtleSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFjY2Vzc2tleVwiKTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gIShrZXkgaW4gbWFwKTtcbiAgICAgICAgbWFwW2tleV0gPSB0cnVlO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5jb25zdCBERVBSRUNBVEVEX0VMRU1FTlRTID0gW1xuICAgIC8qKiBvcmlnaW5hbCAqL1xuICAgIFwiYXBwbGV0XCIsIFwiYmFzZWZvbnRcIiwgXCJjZW50ZXJcIiwgXCJkaXJcIiwgXCJmb250XCIsIFwiaXNpbmRleFwiLCBcImxpc3RpbmdcIixcbiAgICBcInBsYWludGV4dFwiLCBcInNwYWNlclwiLCBcInNcIiwgXCJzdHJpa2VcIiwgXCJ1XCIsIFwieG1wXCIsXG4gICAgLyoqIGFkZGVkIGZyb20gaHR0cHM6Ly9kZXYudzMub3JnL2h0bWw1L3BmLXN1bW1hcnkvb2Jzb2xldGUuaHRtbCAqL1xuICAgIFwiYWNyb255bVwiLCBcImZyYW1lXCIsIFwiZnJhbWVzZXRcIiwgXCJub2ZyYW1lc1wiLCBcIm5vZW1iZWRcIiwgXCJiaWdcIiwgXCJibGlua1wiLCBcIm1hcnF1ZWVcIiwgXCJ0dFwiLFxuXG5dXG5cbmNvbnN0IERFUFJFQ0FURURfSFRNTF9HTE9CQUxfQVRUUklCVVRFUyA9IFtcbiAgICAvKiogb3JpZ2luYWwgKi9cbiAgICBcImFsaWduXCIsIFwibGlua1wiLCBcImFyY2hpdmVcIiwgXCJiYWNrZ3JvdW5kXCIsIFwiYmdjb2xvclwiLCBcImNsZWFyXCIsIFwiY29kZVwiLCBcImNvbG9yXCIsXG4gICAgXCJjb21wYWN0XCIsIFwiZmFjZVwiLCBcImhzcGFjZVwiLCBcImxhbmd1YWdlXCIsIFwibGlua1wiLCBcIm5vc2hhZGVcIiwgXCJub3dyYXBcIiwgXCJvYmplY3RcIixcbiAgICBcInByb21wdFwiLCBcInN0YXJ0XCIsIFwidGV4dFwiLCBcInZlcnNpb25cIiwgXCJ2bGlua1wiLCBcInZzcGFjZVwiXG5dXG5cbmNvbnN0IERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTID0ge1xuICAgIC8qKiBvcmlnaW5hbCAqL1xuICAgIFwidGRcIjogW1wiaGVpZ2h0XCIsIFwid2lkdGhcIiwgXCJhYmJyXCIsIFwiYXhpc1wiLCBcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwiaGVpZ2h0XCIsIFwibm93cmFwXCIsIFwidmFsaWduXCIsIFwid2lkdGhcIiwgXCJhbGlnblwiLCBcImJnY29sb3JcIl0sXG4gICAgXCJ0aFwiOiBbXCJoZWlnaHRcIiwgXCJ3aWR0aFwiLCBcImFiYnJcIiwgXCJheGlzXCIsIFwiY2hhcm9mZlwiLCBcImhlaWdodFwiLCBcImJnY29sb3JcIiwgXCJhbGlnblwiLCBcIm5vd3JhcFwiLCBcImNoYXJcIiwgXCJ2YWxpZ25cIiwgXCJ3aWR0aFwiXSxcbiAgICBcImxpXCI6IFtcInR5cGVcIiwgXCJ2YWx1ZVwiLCBcInR5cGVcIl0sXG4gICAgXCJ1bFwiOiBbXCJ0eXBlXCIsIFwiY29tcGFjdFwiXSxcbiAgICBcInByZVwiOiBbXCJ3aWR0aFwiXSxcblxuICAgIC8qKiBhZGRlZCBmcm9tIGh0dHBzOi8vZGV2LnczLm9yZy9odG1sNS9wZi1zdW1tYXJ5L29ic29sZXRlLmh0bWwgKi9cbiAgICBcIm1ldGFcIjogW1wiaHR0cC1lcXVpdlwiXSxcbiAgICBcImFcIjogW1wiY2hhcnNldFwiLCBcImNvb3Jkc1wiLCBcInNoYXBlXCIsIFwicmV2XCIsIFwic2NoZW1lXCJdLFxuICAgIFwibGlua1wiOiBbXCJyZXZcIiwgXCJjaGFyc2V0XCIsIFwidGFyZ2V0XCJdLFxuICAgIFwiaW1nXCI6IFtcIm5hbWVcIiwgXCJsb25nZGVzY1wiLCBcImFsaWduXCIsIFwiaHNwYWNlXCIsIFwidnNwYWNlXCIsIFwiYm9yZGVyXCJdLFxuICAgIFwiYXJlYVwiOiBbXCJub2hyZWZcIl0sXG4gICAgXCJoZWFkXCI6IFtcInByb2ZpbGVcIl0sXG4gICAgXCJodG1sXCI6IFtcInZlcnNpb25cIl0sXG4gICAgXCJpZnJhbWVcIjogW1wibG9uZ2Rlc2NcIiwgXCJhbGlnblwiLCBcImZyYW1lYm9yZGVyXCIsIFwibWFyZ2luaGVpZ2h0XCIsIFwibWFyZ2lud2lkdGhcIiwgXCJzY3JvbGxpbmdcIl0sXG4gICAgXCJvYmplY3RcIjogW1wiYXJjaGl2ZVwiLCBcImNvZGVcIiwgXCJjb2RlYmFzZVwiLCBcImNvZGV0eXBlXCIsIFwiZGVjbGFyZVwiLCBcInN0YW5kYnlcIiwgXCJhbGlnblwiLCBcImhzcGFjZVwiLCBcInZzcGFjZVwiLCBcImJvcmRlclwiXSxcbiAgICBcInBhcmFtXCI6IFtcInR5cGVcIiwgXCJ2YWx1ZXR5cGVcIl0sXG4gICAgXCJzY3JpcHRcIjogW1wibGFuZ3VhZ2VcIl0sXG4gICAgXCJib2R5XCI6IFtcImFsaW5rXCIsIFwiYmFja2dyb3VuZFwiLCBcImJnY29sb3JcIiwgXCJsaW5rXCIsIFwidGV4dFwiLCBcInZsaW5rXCJdLFxuICAgIFwiYnJcIjogW1wiY2xlYXJcIl0sXG4gICAgXCJjYXB0aW9uXCI6IFtcImFsaWduXCJdLFxuICAgIFwiY29sXCI6IFtcImFsaWduXCIsIFwiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJ2YWxpZ25cIiwgXCJ3aWR0aFwiXSxcbiAgICBcImRpdlwiOiBbXCJhbGlnblwiXSxcbiAgICBcImRsXCI6IFtcImNvbXBhY3RcIl0sXG4gICAgXCJoclwiOiBbXCJhbGlnblwiLCBcIm5vc2hhZGVcIiwgXCJzaXplXCIsIFwid2lkdGhcIiwgXCJhbGlnblwiXSxcbiAgICBcImgyXCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDNcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoNFwiOiBbXCJhbGlnblwiXSxcbiAgICBcImg1XCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDZcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJpbnB1dFwiOiBbXCJhbGlnblwiLCBcInVzZW1hcFwiXSxcbiAgICBcImxlZ2VuZFwiOiBbXCJhbGlnblwiXSxcbiAgICBcIm1lbnVcIjogW1wiY29tcGFjdFwiXSxcbiAgICBcIm9sXCI6IFtcImNvbXBhY3RcIiwgXCJ0eXBlXCIsIFwidHlwZVwiXSxcbiAgICBcInBcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJ0YWJsZVwiOiBbXCJiZ2NvbG9yXCIsIFwiY2VsbHBhZGRpbmdcIiwgXCJjZWxsc3BhY2luZ1wiLCBcImZyYW1lXCIsIFwicnVsZXNcIiwgXCJ3aWR0aFwiLCBcImFsaWduXCJdLFxuICAgIFwidGJvZHlcIjogW1wiYWxpZ25cIiwgXCJjaGFyXCIsIFwidmFsaWduXCIsIFwiY2hhcm9mZlwiXSxcbiAgICBcInRmb290XCI6IFtcImFsaWduXCIsIFwiY2hhcm9mZlwiLCBcImNoYXJcIiwgXCJ2YWxpZ25cIl0sXG4gICAgXCJ0aGVhZFwiOiBbXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcInZhbGlnblwiLCBcImFsaWduXCJdLFxuICAgIFwidHJcIjogW1wiYWxpZ25cIiwgXCJiZ2NvbG9yXCIsIFwiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJ2YWxpZ25cIl1cbn1cblxuZnVuY3Rpb24gYXJyYXlUb0NvbnRleHRTdHIob2JqLCB0eXBlKSB7XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIG9iaikge1xuICAgICAgICBpZiAoc3RyICE9PSAnJyAmJiAhc3RyLmVuZHNXaXRoKCcsICcpKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ0hUTUxfRUxFTUVOVFMnKVxuICAgICAgICAgICAgc3RyICs9ICdkb206JyArIHByb3A7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdIVE1MX0FUVFJJQlVURVMnKVxuICAgICAgICAgICAgc3RyICs9ICdkb206KlsnICsgcHJvcCArIFwiXVwiO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBvYmpUb0NvbnRleHRTdHIob2JqLCB0eXBlOiBzdHJpbmcpIHtcbiAgICBsZXQgc3RyID0gXCJcIjtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gb2JqKSB7XG4gICAgICAgIGlmIChzdHIgIT09ICcnICYmICFzdHIuZW5kc1dpdGgoJywgJykpIHN0ciArPSBcIiwgXCI7XG4gICAgICAgIGlmICh0eXBlID09PSAnSFRNTF9FTEVNRU5UX0FUVFJJQlVURVMnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb2JqW3Byb3BdIGFzIFN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0ciAhPT0gJycgJiYgIXN0ci5lbmRzV2l0aChcIiwgXCIpKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICAgICAgICAgIHN0ciArPSAnZG9tOicgKyBwcm9wICsgJ1snICsgaXRlbSArICddJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFwcGxldCwgZG9tOmJhc2Vmb250LCBkb206Y2VudGVyLCBkb206ZGlyLCBkb206Zm9udCwgZG9tOmlzaW5kZXgsIGRvbTpsaXN0aW5nLCBkb206bWVudSwgZG9tOnBsYWludGV4dCwgZG9tOnNwYWNlciwgZG9tOnMsIGRvbTpzdHJpa2UsIGRvbTp1LCBkb206eG1wLCBkb206YWNyb255bSwgZG9tOmZyYW1lLCBkb206ZnJhbWVzZXQsIGRvbTpub2ZyYW1lcywgZG9tOm5vZW1iZWQsIGRvbTpiaWcsIGRvbTpibGluaywgZG9tOm1hcnF1ZWUsIGRvbTp0dE5hTmRvbToqW2FsaWduXSwgZG9tOipbbGlua10sIGRvbToqW2FyY2hpdmVdLCBkb206KltiYWNrZ3JvdW5kXSwgZG9tOipbYmdjb2xvcl0sIGRvbToqW2NsZWFyXSwgZG9tOipbY29kZV0sIGRvbToqW2NvbG9yXSwgZG9tOipbY29tcGFjdF0sIGRvbToqW2ZhY2VdLCBkb206Kltoc3BhY2VdLCBkb206KltsYW5ndWFnZV0sIGRvbToqW2xpbmtdLCBkb206Kltub3NoYWRlXSwgZG9tOipbbm93cmFwXSwgZG9tOipbb2JqZWN0XSwgZG9tOipbcHJvbXB0XSwgZG9tOipbc3RhcnRdLCBkb206Klt0ZXh0XSwgZG9tOipbdmVyc2lvbl0sIGRvbToqW3ZsaW5rXSwgZG9tOipbdnNwYWNlXU5hTmRvbTp0ZFtoZWlnaHRdLCBkb206dGRbd2lkdGhdLCBkb206dGRbYWJicl0sIGRvbTp0ZFtheGlzXSwgZG9tOnRkW2NoYXJdLCBkb206dGRbY2hhcm9mZl0sIGRvbTp0ZFtoZWlnaHRdLCBkb206dGRbbm93cmFwXSwgZG9tOnRkW3ZhbGlnbl0sIGRvbTp0ZFt3aWR0aF0sIGRvbTp0ZFthbGlnbl0sIGRvbTp0ZFtiZ2NvbG9yXSwgZG9tOnRoW2hlaWdodF0sIGRvbTp0aFt3aWR0aF0sIGRvbTp0aFthYmJyXSwgZG9tOnRoW2F4aXNdLCBkb206dGhbY2hhcm9mZl0sIGRvbTp0aFtoZWlnaHRdLCBkb206dGhbYmdjb2xvcl0sIGRvbTp0aFthbGlnbl0sIGRvbTp0aFtub3dyYXBdLCBkb206dGhbY2hhcl0sIGRvbTp0aFt2YWxpZ25dLCBkb206dGhbd2lkdGhdLCBkb206bGlbdHlwZV0sIGRvbTpsaVt2YWx1ZV0sIGRvbTpsaVt0eXBlXSwgZG9tOnVsW3R5cGVdLCBkb206dWxbY29tcGFjdF0sIGRvbTpwcmVbd2lkdGhdLCBkb206bWV0YVtodHRwLWVxdWl2XSwgZG9tOmFbY2hhcnNldF0sIGRvbTphW2Nvb3Jkc10sIGRvbTphW3NoYXBlXSwgZG9tOmFbcmV2XSwgZG9tOmFbc2NoZW1lXSwgZG9tOmxpbmtbcmV2XSwgZG9tOmxpbmtbY2hhcnNldF0sIGRvbTpsaW5rW3RhcmdldF0sIGRvbTppbWdbbmFtZV0sIGRvbTppbWdbbG9uZ2Rlc2NdLCBkb206aW1nW2FsaWduXSwgZG9tOmltZ1toc3BhY2VdLCBkb206aW1nW3ZzcGFjZV0sIGRvbTppbWdbYm9yZGVyXSwgZG9tOmFyZWFbbm9ocmVmXSwgZG9tOmhlYWRbcHJvZmlsZV0sIGRvbTpodG1sW3ZlcnNpb25dLCBkb206aWZyYW1lW2xvbmdkZXNjXSwgZG9tOmlmcmFtZVthbGlnbl0sIGRvbTppZnJhbWVbZnJhbWVib3JkZXJdLCBkb206aWZyYW1lW21hcmdpbmhlaWdodF0sIGRvbTppZnJhbWVbbWFyZ2lud2lkdGhdLCBkb206aWZyYW1lW3Njcm9sbGluZ10sIGRvbTpvYmplY3RbYXJjaGl2ZV0sIGRvbTpvYmplY3RbY29kZV0sIGRvbTpvYmplY3RbY29kZWJhc2VdLCBkb206b2JqZWN0W2NvZGV0eXBlXSwgZG9tOm9iamVjdFtkZWNsYXJlXSwgZG9tOm9iamVjdFtzdGFuZGJ5XSwgZG9tOm9iamVjdFthbGlnbl0sIGRvbTpvYmplY3RbaHNwYWNlXSwgZG9tOm9iamVjdFt2c3BhY2VdLCBkb206b2JqZWN0W2JvcmRlcl0sIGRvbTpwYXJhbVt0eXBlXSwgZG9tOnBhcmFtW3ZhbHVldHlwZV0sIGRvbTpzY3JpcHRbbGFuZ3VhZ2VdLCBkb206Ym9keVthbGlua10sIGRvbTpib2R5W2JhY2tncm91bmRdLCBkb206Ym9keVtiZ2NvbG9yXSwgZG9tOmJvZHlbbGlua10sIGRvbTpib2R5W3RleHRdLCBkb206Ym9keVt2bGlua10sIGRvbTpicltjbGVhcl0sIGRvbTpjYXB0aW9uW2FsaWduXSwgZG9tOmNvbFthbGlnbl0sIGRvbTpjb2xbY2hhcl0sIGRvbTpjb2xbY2hhcm9mZl0sIGRvbTpjb2xbdmFsaWduXSwgZG9tOmNvbFt3aWR0aF0sIGRvbTpkaXZbYWxpZ25dLCBkb206ZGxbY29tcGFjdF0sIGRvbTpoclthbGlnbl0sIGRvbTpocltub3NoYWRlXSwgZG9tOmhyW3NpemVdLCBkb206aHJbd2lkdGhdLCBkb206aHJbYWxpZ25dLCBkb206aDJbYWxpZ25dLCBkb206aDNbYWxpZ25dLCBkb206aDRbYWxpZ25dLCBkb206aDVbYWxpZ25dLCBkb206aDZbYWxpZ25dLCBkb206aW5wdXRbYWxpZ25dLCBkb206aW5wdXRbdXNlbWFwXSwgZG9tOmxlZ2VuZFthbGlnbl0sIGRvbTptZW51W2NvbXBhY3RdLCBkb206b2xbY29tcGFjdF0sIGRvbTpvbFt0eXBlXSwgZG9tOm9sW3R5cGVdLCBkb206cFthbGlnbl0sIGRvbTp0YWJsZVtiZ2NvbG9yXSwgZG9tOnRhYmxlW2NlbGxwYWRkaW5nXSwgZG9tOnRhYmxlW2NlbGxzcGFjaW5nXSwgZG9tOnRhYmxlW2ZyYW1lXSwgZG9tOnRhYmxlW3J1bGVzXSwgZG9tOnRhYmxlW3dpZHRoXSwgZG9tOnRhYmxlW2FsaWduXSwgZG9tOnRib2R5W2FsaWduXSwgZG9tOnRib2R5W2NoYXJdLCBkb206dGJvZHlbdmFsaWduXSwgZG9tOnRib2R5W2NoYXJvZmZdLCBkb206dGZvb3RbYWxpZ25dLCBkb206dGZvb3RbY2hhcm9mZl0sIGRvbTp0Zm9vdFtjaGFyXSwgZG9tOnRmb290W3ZhbGlnbl0sIGRvbTp0aGVhZFtjaGFyXSwgZG9tOnRoZWFkW2NoYXJvZmZdLCBkb206dGhlYWRbdmFsaWduXSwgZG9tOnRoZWFkW2FsaWduXSwgZG9tOnRyW2FsaWduXSwgZG9tOnRyW2JnY29sb3JdLCBkb206dHJbY2hhcl0sIGRvbTp0cltjaGFyb2ZmXSwgZG9tOnRyW3ZhbGlnbl1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbVwiOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2F0dHJcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbGVtX2F0dHJcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IGlzIGRlcHJlY2F0ZWQgaW4gSFRNTCA1XCIsXG4gICAgICAgICAgICBcImZhaWxfYXR0clwiOiBcIlRoZSBIVE1MIGF0dHJpYnV0ZShzKSBcXFwiezB9XFxcIiBpcyBkZXByZWNhdGVkIGluIEhUTUwgNVwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1fYXR0clwiOiBcIlRoZSBIVE1MIGF0dHJpYnV0ZShzKSBcXFwiezB9XFxcIiBpcyBkZXByZWNhdGVkIGZvciB0aGUgPHsxfT4gZWxlbWVudCBpbiBIVE1MIDVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2Ugb2Ygb2Jzb2xldGUgZmVhdHVyZXMgaWYgcG9zc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiSFRNTFwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvLyBIVE1MVW5pdCBhdXRvIGFkZHMgYSB0Ym9keVthbGlnbj1sZWZ0XSB0byB0YWJsZXMgaWYgdGJvZHkgaXMgbWlzc2luZyFcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwidGJvZHlcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbGlnblwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgd2ViY29tcG9uZW50IGVsZW1lbnQsIEhUTUwgZG9lc24ndCBkZWZpbmUgd2hhdCdzIGRlcHJlY2F0ZWRcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhIGRlcHJlY2F0ZWQgZWxlbWVudFxuICAgICAgICBpZiAoREVQUkVDQVRFRF9FTEVNRU5UUy5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZWxlbVwiLCBbbm9kZU5hbWVdKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhIGRlcHJlY2F0ZWQgSFRNTCBnbG9iYWwgYXR0cmlidXRlXG4gICAgICAgIGNvbnN0IGF0dHJzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlTmFtZXMoKTtcbiAgICAgICAgbGV0IHZpb2xhdGlvbnMgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJzKSB7XG4gICAgICAgICAgICBpZiAoREVQUkVDQVRFRF9IVE1MX0dMT0JBTF9BVFRSSUJVVEVTLmluY2x1ZGVzKGF0dHIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT09ICcnKSB2aW9sYXRpb25zICs9ICcsICc7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucyArPSBhdHRyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9hdHRyXCIsIFt2aW9sYXRpb25zXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBpdCdzIGEgZGVwcmVjYXRlZCBIVE1MIGVsZW1lbnQgJiBhdHRyaWJ1dGVcbiAgICAgICAgdmlvbGF0aW9ucyA9ICcnO1xuICAgICAgICBpZiAobm9kZU5hbWUgaW4gREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBhdHRycykge1xuICAgICAgICAgICAgICAgIGlmIChERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFU1tub2RlTmFtZV0gJiYgREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVNbbm9kZU5hbWVdLmluY2x1ZGVzKGF0dHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykgdmlvbGF0aW9ucyArPSAnLCAnO1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zICs9IGF0dHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9lbGVtX2F0dHJcIiwgW3Zpb2xhdGlvbnMsIG5vZGVOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2lkX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2lkX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbaWRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRWxlbV9VbmlxdWVJZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwicG90ZW50aWFsX2VtcHR5XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBvdGVudGlhbF9pbl91c2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2VtcHR5XCI6IFwiZWxlbWVudF9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfaW5fdXNlXCI6IFwiZWxlbWVudF9pZF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnQgJ2lkJyBhdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZW1wdHlcIjogXCJUaGUgPHswfT4gZWxlbWVudCBoYXMgdGhlIGlkIFxcXCJ7MX1cXFwiIHRoYXQgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2luX3VzZVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IGhhcyB0aGUgaWQgXFxcInsxfVxcXCIgdGhhdCBpcyBhbHJlYWR5IGluIHVzZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiSFRNTFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiM2VhMGM4XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2VtcHR5XCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfaW5fdXNlXCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCBpZCBpcyBlbXB0eSB3ZSBzaG91bGQgdHJpZ2dlciBhIHZpb2xhdGlvbiByaWdodCBhd2F5IHdpdGggb3V0IGNoZWNraW5nIFxuICAgICAgICAvLyBmb3IgdW5pcXVlbmVzcy5cbiAgICAgICAgaWYgKGlkID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChmYWxzZSwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2VtcHR5XCIsIFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBpZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgaWQpO1xuICAgICAgICBsZXQgcGFzc2VkID0gZWxlbWVudCA9PT0gcnVsZUNvbnRleHQ7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9pbl91c2VcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgZVJ1bGVDb25maWRlbmNlIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBMYW5nVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sYW5nXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmNvbnN0IHZhbGlkYXRlTGFuZyA9IChjb250ZXh0OiBSdWxlQ29udGV4dCk6IG51bWJlciA9PiB7XG4gICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8gSXQncyBva2F5IHRvIGhhdmUgYSBsYW5nPVwiXCIgaWYgbm90IG9uIGh0bWxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYW5nU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKTtcbiAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5pc0JjcDQ3KGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInhtbDpsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgb2theSB0byBoYXZlIGEgbGFuZz1cIlwiIGlmIG5vdCBvbiBodG1sXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUxhbmdVdGlsLmlzQmNwNDcobGFuZ1N0cikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGNvbnN0IGh0bWxfbGFuZ192YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJodG1sX2xhbmdfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpodG1sW2xhbmddLCBkb206aHRtbFt4bWw6bGFuZ11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImh0bWxfbGFuZ192YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkxhbmcgaGFzIGEgdmFsaWQgcHJpbWFyeSBsYW5nIGFuZCBjb25mb3JtcyB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgaW5jbHVkZSBhIHZhbGlkIHByaW1hcnkgbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiU3BlY2lmaWVkICd4bWw6bGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBjb25mb3JtIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBkZWZhdWx0IGh1bWFuIGxhbmd1YWdlIG9mIHRoZSBwYWdlIG11c3QgYmUgdmFsaWQgYW5kIHNwZWNpZmllZCBpbiBhY2NvcmRhbmNlIHdpdGggQkNQIDQ3XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcImI1YzNmOFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmYwNTFhXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9LFxuICAgICAgICAvLyBUT0RPOiBBQ1Q6IE1pc21hdGNoIGJlY2F1c2UgdGhleSBkb24ndCBjaGVjayB0aGUgaHRtbCBlbGVtZW50IGluIHRoZSBzYW1lIHJ1bGVcbiAgICAgICAgLy8gXCJkZTQ2ZTRcIjoge1xuICAgICAgICAvLyAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8yXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgLy8gfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGxldCByZWFzb25Db2RlID0gdmFsaWRhdGVMYW5nKGNvbnRleHQpO1xuICAgICAgICAvLyBUaGlzIGlzIGRvbmUgaGVyZSBpbnN0ZWFkIG9mIGluIHZhbGlkYXRlTGFuZyBzbyB0aGF0IHRoZSBnZW5IZWxwIGNvZGUgd2lsbCBwaWNrIGl0IHVwXG4gICAgICAgIGxldCByZXRBcnIgPSBbXG4gICAgICAgICAgICBSdWxlUGFzcyhcIlBhc3NfMFwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8xXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzJcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfM1wiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF80XCIpXG4gICAgICAgIF1cbiAgICAgICAgcmV0dXJuIHJldEFycltyZWFzb25Db2RlXTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2xhbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9sYW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KltsYW5nXSwgZG9tOipbeG1sOmxhbmddXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJMYW5nIGhhcyBhIHZhbGlkIHByaW1hcnkgbGFuZyBhbmQgY29uZm9ybXMgdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgY2hhbmdlIGluIGxhbmd1YWdlIG9mIHNwZWNpZmljIGNvbnRlbnQgbXVzdCBiZSB2YWxpZCBhbmQgc3BlY2lmaWVkIGluIGFjY29yZGFuY2Ugd2l0aCBCQ1AgNDdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgLy8gXCJiNWMzZjhcIjoge1xuICAgICAgICAvLyAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8yXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBcImJmMDUxYVwiOiB7XG4gICAgICAgIC8vICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gVE9ETzogQUNUOiBNaXNtYXRjaCBiZWNhdXNlIHRoZXkgZG9uJ3QgY2hlY2sgdGhlIGh0bWwgZWxlbWVudCBpbiB0aGUgc2FtZSBydWxlXG4gICAgICAgIFwiZGU0NmU0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBJZiBpdCdzIHRoZSBIVE1MIG5vZGUsIHRoYXQncyBoYW5kbGVkIGJ5IGh0bWxfbGFuZ192YWxpZFxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaHRtbFwiKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHJlYXNvbkNvZGUgPSB2YWxpZGF0ZUxhbmcoY29udGV4dCk7XG4gICAgICAgIC8vIFRoaXMgaXMgZG9uZSBoZXJlIGluc3RlYWQgb2YgaW4gdmFsaWRhdGVMYW5nIHNvIHRoYXQgdGhlIGdlbkhlbHAgY29kZSB3aWxsIHBpY2sgaXQgdXBcbiAgICAgICAgbGV0IHJldEFyciA9IFtcbiAgICAgICAgICAgIFJ1bGVQYXNzKFwiUGFzc18wXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzFcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfMlwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8zXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzRcIilcbiAgICAgICAgXVxuICAgICAgICBsZXQgcmV0VmFsID0gcmV0QXJyW3JlYXNvbkNvZGVdO1xuICAgICAgICBpZiAocmV0VmFsLnZhbHVlWzFdICE9PSBlUnVsZUNvbmZpZGVuY2UuUEFTUykge1xuICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlcmUncyBhY3R1YWxseSBjb250ZW50IG9mIHRoaXMgZWxlbWVudCAtIHNraXAgc3VidHJlZXMgdGhhdCBoYXZlIG90aGVyIGxhbmcgYXR0cmlidXRlc1xuICAgICAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5maXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihydWxlQ29udGV4dCwgZmFsc2UsIHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBudy5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50KSB8fCBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImxhbmdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gaGFzQ29udGVudCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApLyoqQVJJQU1hcHBlci5jb21wdXRlTmFtZShlbGVtZW50KS50cmltKCkubGVuZ3RoID4gMCovO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IGhhc0NvbnRlbnQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbncubm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25kYmxjbGlja10sIGRvbToqW29ubW91c2Vtb3ZlXSwgZG9tOipbb25tb3VzZWRvd25dLCBkb206Kltvbm1vdXNldXBdLCBkb206Kltvbm1vdXNlb3Zlcl0sIGRvbToqW29ubW91c2VvdXRdLCBkb206KltvbmNsaWNrXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VsZW1fRXZlbnRNb3VzZUFuZEtleVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIHRoZSA8ezB9PiBlbGVtZW50IHdpdGggbW91c2UgZXZlbnQgaGFuZGxlcihzKSAnezF9JyBoYXMgYSBjb3JyZXNwb25kaW5nIGtleWJvYXJkIGhhbmRsZXIocylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgaW50ZXJhY3RpdmUgY29udGVudCB3aXRoIG1vdXNlIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBlcXVpdmFsZW50IGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSB8fFxuICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmRibGNsaWNrXCIpICYmXG4gICAgICAgICAgICAgICAgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlZG93blwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNldXBcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2VvdmVyXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uYmx1clwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uY2xpY2tcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSB8fFxuICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImJ1dHRvblwiKSk7XG5cbiAgICAgICAgbGV0IGZhaWxlZE1vdXNlRXZlbnRzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvL3N0b3JlIGFuZCBkaXNwbGF5IGV2ZW50IG5hbWUgYW5kIG5vZGUgbmFtZSBpbiB0aGUgdG9rZW5zXG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25kYmxjbGlja1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmRibGNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2Vtb3ZlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vkb3duXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZWRvd25cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZXVwXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXVwXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2V1cFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3ZlclwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25mb2N1c1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNlb3ZlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmJsdXJcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZW91dFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEobm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJidXR0b25cIikpXG4gICAgICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiLCBbbm9kZU5hbWUsIGZhaWxlZE1vdXNlRXZlbnRzLmpvaW4oXCIsIFwiKV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENTU1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvY2tlZFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCIsXG4gICAgICAgICAgICBcImZhaWxfbG9ja2VkXCI6IFwiVGhlIGVsZW1lbnQgPHswfT4gaXMgcmVzdHJpY3RlZCB0byBlaXRoZXIgbGFuZHNjYXBlIG9yIHBvcnRyYWl0IG9yaWVudGF0aW9uIHVzaW5nIENTUyB0cmFuc2Zvcm0gcHJvcGVydHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyBzaG91bGQgbm90IGJlIHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuNFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbJ2IzM2VmZiddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCBpbnZpc2libGUgZWxlbWVudFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wic2NyaXB0XCIsIFwibWV0YVwiLCBcInRpdGxlXCJdKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIFNraXAgZWxlbWVudHMgdGhhdCBoYXZlIG5vIG1lYW5pbmdmdWwgdmlzaWJsZSBjb250ZW50IChubyB0ZXh0LCBubyBpbWcgd2l0aCBhbHQpLlxuICAgICAgICAvLyBPcmllbnRhdGlvbiBsb2NrIG9uIGEgcHVyZWx5IGRlY29yYXRpdmUgb3IgZW1wdHkgZWxlbWVudCBpcyBub3QgYSBXQ0FHIHZpb2xhdGlvblxuICAgICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbnRlbnQgd2hvc2Ugb3JpZW50YXRpb24gbWF0dGVycyB0byB0aGUgdXNlci5cbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBjYWNoZSB0aGUgb3JpZW50YXRpb24gcmVzdWx0IGZvciBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCkgYXMgYW55O1xuICAgICAgICBsZXQgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJSUFRVdGlsX01FRElBX09SSUVOVEFUSU9OX1RSQU5TRlJPTVwiLCBudWxsKTtcbiAgICAgICAgaWYgKCFvcmllbnRhdGlvblRyYW5zZm9ybXMpIHtcbiAgICAgICAgICAgIG9yaWVudGF0aW9uVHJhbnNmb3JtcyA9IENTU1V0aWwuZ2V0TWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybShkb2MpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRVdGlsX01FRElBX09SSUVOVEFUSU9OX1RSQU5TRlJPTVwiLCBvcmllbnRhdGlvblRyYW5zZm9ybXMpO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gZmluZCBpZiB0aGUgZWxlbWVudCBtYXRjaGVzIG9yaWVudGF0aW9uIHNlbGVjdG9yKHMpXG4gICAgICAgIGxldCBtZWRpYV90cmFuc2Zvcm1zID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKG9yaWVudGF0aW9uVHJhbnNmb3JtcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV0pLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV1bdGFnXSkubGVuZ3RoID4gMCAmJiBDU1NVdGlsLnNlbGVjdG9yTWF0Y2hlc0VsZW0ocnVsZUNvbnRleHQsIHRhZykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10udHJhbnNmb3JtKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3Jtcy5wdXNoKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10udHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3Jtcy5wdXNoKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10pO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBubyBtYXRjaCwgdGhlIGVsZW1lbnQgaXMgbm90IGluIG1lZGlhIG9yaWVudGF0aW9uIHRyYW5zZm9ybVxuICAgICAgICBpZiAobWVkaWFfdHJhbnNmb3Jtcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtZWRpYV90cmFuc2Zvcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWVkaWFfdHJhbnNmb3JtID0gbWVkaWFfdHJhbnNmb3Jtc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVkaWFfdHJhbnNmb3JtID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICBmb3IodmFyIGtleSBpbiBtZWRpYV90cmFuc2Zvcm0pXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhX3RyYW5zZm9ybSA9IGtleSArXCIoXCIgKyBtZWRpYV90cmFuc2Zvcm1ba2V5XSArXCIpXCI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjb250YWluc1JvdGF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICBbJ3JvdGF0ZScsICdyb3RhdGUzZCcsICdyb3RhdGVaJywgJ21hdHJpeCcsICdtYXRyaXgzZCddLmZvckVhY2gocm90YXRpb24gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtZWRpYV90cmFuc2Zvcm0uaW5jbHVkZXMocm90YXRpb24pKSBjb250YWluc1JvdGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gbm8gcm90YXRpb24gdHJhbnNmb3JtLCBza2lwXG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUm90YXRpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgZGVncmVlID0gQ1NTVXRpbC5nZXRSb3RhdGlvbkRlZ3JlZShtZWRpYV90cmFuc2Zvcm0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBubyBvciAzNjBuIGRlZ3JlZSByb3RhdGlvbiBcbiAgICAgICAgICAgIGlmIChkZWdyZWUgPT09IDApIHsgXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogY2FsY3VsYXRlIHRoZSBvcmlnaW5hbCBwYWdlIHJvdGF0aW9uIHRyYW5zZm9ybWF0aW9uLCBleGFtcGxlXG4gICAgICAgICAgICAgKiAgaHRtbCB7IHRyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7IH1cbiAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBkZWZpbmVkU3R5bGUgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQsIFtcInRyYW5zZm9ybVwiXSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqIGNvbXBlbnNhdGUgdGhlIG1lZGlhIG9yaWVudGF0aW9uIHdpdGggdGhlIHBhZ2Ugb3JpZW50YXRpb25cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKGRlZmluZWRTdHlsZVsndHJhbnNmb3JtJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlX2RlZ3JlZSA9IENTU1V0aWwuZ2V0Um90YXRpb25EZWdyZWUoZGVmaW5lZFN0eWxlWyd0cmFuc2Zvcm0nXSk7XG4gICAgICAgICAgICAgICAgLy8gcm90YXRlIGlzIGFkZGl0aXZlXG4gICAgICAgICAgICAgICAgZGVncmVlICs9IHBhZ2VfZGVncmVlO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gMTgwwrAgcm90YXRpb24gaXMgYSB2ZXJ0aWNhbCBmbGlwIOKAlCBpdCBkb2VzIG5vdCBzd2FwIHBvcnRyYWl0IGFuZCBsYW5kc2NhcGUsXG4gICAgICAgICAgICAvLyBzbyBpdCBkb2VzIG5vdCBsb2NrIG9yaWVudGF0aW9uIGluIHRoZSBXQ0FHIDEuMy40IHNlbnNlLlxuICAgICAgICAgICAgLy8gMzYwwrAgKGZ1bGwgdHVybikgaXMgYWxzbyBub3QgYSBsb2NrIChhbHJlYWR5IG5vcm1hbGlzZWQgdG8gMCBhYm92ZSkuXG4gICAgICAgICAgICAvLyBBbGxvdyAxwrAgZmxvYXRpbmctcG9pbnQgdG9sZXJhbmNlIGFyb3VuZCBib3RoIDDCsCBhbmQgMTgwwrAuXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpc2VkID0gZGVncmVlICUgMTgwO1xuICAgICAgICAgICAgaWYgKG5vcm1hbGlzZWQgPD0gMSB8fCBub3JtYWxpc2VkID49IDE3OSlcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9sb2NrZWRcIiwgW25vZGVOYW1lXSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMCkgIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7IFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc190YWJiYWJsZVwiOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfaW50ZXJhY3RpdmVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcm9sbGFibGUgZWxlbWVudHMgc2hvdWxkIGJlIHRhYmJhYmxlIG9yIGNvbnRhaW4gdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwYXNzX3RhYmJhYmxlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2ludGVyYWN0aXZlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBoYXMgdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJUaGUgc2Nyb2xsYWJsZSBlbGVtZW50IDx7MH0+IHdpdGggbm9uLWludGVyYWN0aXZlIGNvbnRlbnQgaXMgbm90IHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogZGVwcmVjYXRlZCBvbiA2LzEwLzIwMjUgZHVlIHRvIEJyb3dzZXIgc3VwcG9ydCBmb3IgYXV0by1mb2N1cyBvZiBhIHNjcm9sbGFibGUgZWxlbWVudCBcbiAgICAgKiBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLCovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW1wiMHNzdzlrXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImlmcmFtZVwiLCBcInN2Z1wiLCBcInNjcmlwdFwiLCBcIm1ldGFcIiwgXCJzdHlsZVwiXSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgaWYgbm8gdmlzaWJsZSBjb250ZW50XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50J3MgbmF2aWdhdGlvbiBpcyBjb250cm9sbGVkIG9yIG93bmVkIGJ5IGFub3RoZXIgZWxlbWVudFxuICAgICAgICBpZiAoQXJpYVV0aWwuaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHNjcm9sbGFibGUgb3IgY29udGVudCB3aXRob3V0aW5nIG5lZWRpbmcgYSBzY3JvbGxcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzRWxlbWVudFNjcm9sbGFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gcGFzcyBpZiBlbGVtZW50IGlzIHRhYmJhYmxlXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc190YWJiYWJsZVwiKTtcblxuICAgICAgICAvLyBjaGVjayBpZiBlbGVtZW50IGNvbnRlbnQgaXMgdGFiYmFibGVcbiAgICAgICAgY29uc3QgY291bnQgPSBDb21tb25VdGlsLmdldFRhYmJhYmxlQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY291bnQgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19pbnRlcmFjdGl2ZVwiKTtcblxuICAgICAgICAvLyBpZ25vcmUgaW4gRmlyZWZveCBpZiBubyB0YWJpbmRleCBhdCBhbGwgKG5vdCB0ZXN0ZWQgaW4gZW1iZWRkZWQgb3IgYW55IHNpbXVsYXRvcilcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJGaXJlZm94XCIpID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX3Njcm9sbGFibGVcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKTsgICAgXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OlwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX3JvbGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3ZhbGlkX3JvbGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBoYXMgYSB3aWRnZXQgcm9sZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfcm9sZVwiOiBcIlRoZSB0YWJiYWJsZSBlbGVtZW50J3Mgcm9sZSAnezB9JyBpcyBub3QgYSB3aWRnZXQgcm9sZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3ZhbGlkX3JvbGVcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyB0YWJiYWJsZSBieSBkZWZhdWx0IHdpdGggb3Igd2l0aG91dCB0YWJpbmRleCwgbGV0IHRoZSBvdGhlciBydWxlcyAoc3VjaCBhcyB3aWRnZXRfdGFiYmFibGVfc2luZ2xlKSB0byBoYW5kbGUgaXRcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIENvbW1vblV0aWwudGFiVGFnTWFwICkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gQ29tbW9uVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAodmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlOiBubyB0YWJpbmRleCBvciB0YWJpbmRleCA8IDBcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50J3MgbmF2aWdhdGlvbiBpcyBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgc3VjaCBhcyBjb21ib2JveFxuICAgICAgICBpZiAoQXJpYVV0aWwuaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc0VsZW1lbnRTY3JvbGxhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgICBcblxuICAgICAgICAvLyBlbGVtZW50cyB3aG9zZSByb2xlcyBhbGxvdyBubyBkZXNjZW5kYW50cyB0aGF0IGFyZSBpbnRlcmFjdGl2ZSBvciB3aXRoIGEgdGFiaW5kZXggPj0gMCBcbiAgICAgICAgLy8gdGhpcyBjYXNlIHNob3VsZCBiZSBoYW5kbGVkIGluIHdpZGdldF90YWJiYWJsZV9zaW5nbGUgYW5kIGFyaWFfY2hpbGRfdGFiYmFibGVcbiAgICAgICAgY29uc3Qgcm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGQgPVtcImJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiaW1nXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInN3aXRjaFwiLCBcInRhYlwiXTtcblxuICAgICAgICBjb25zdCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYXJlbnRfcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQgYXMgRWxlbWVudCk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIHBhcmVudCByb2xlIGlzIGluIHJvbGVzX25vX2ludGVyYWN0aXZlX2NoaWxkXG4gICAgICAgIGlmIChyb2xlc19ub19pbnRlcmFjdGl2ZV9jaGlsZC5pbmNsdWRlcyhwYXJlbnRfcm9sZSkpXG4gICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXJvbGUpIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub192YWxpZF9yb2xlXCIpOyBcbiAgICAgICAgLy8gaWdub3JlICdhcHBsaWNhdGlvbicgcm9sZSB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIGZvY3VzYWJsZSBlbGVtZW50cyB0aGF0IGRvIG5vdCBmb2xsb3cgYSBzdGFuZGFyZCBpbnRlcmFjdGlvbiBwYXR0ZXJuIHN1cHBvcnRlZCBieSBhIHdpZGdldCByb2xlOmh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIzL1BSLVdBSS1BUklBLTEuMi0yMDIzMDMyOC8jYXBwbGljYXRpb24gXG4gICAgICAgIGlmIChyb2xlID09PSBcImFwcGxpY2F0aW9uXCIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2U6IHRhYmluZGV4ID49IDAgdG8gZXhhbWluZSB3aGV0aGVyIGEgd2lkZ2V0IHJvbGUgaXMgc2V0dXAgb3Igbm90IFxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgcm9sZXMgaXMgYSB3aWRnZXQgdHlwZVxuICAgICAgICAvLyBSb3cgaXMgd2VpcmQuIEl0J3Mgc3RydWN0dXJlLCBidXQgY2FuIGFsc28gYmUgd2lkZ2V0XG4gICAgICAgIC8vIEZvY3VzYWJsZSBzZXBhcmF0b3JzIGFyZSB3aWRnZXRzXG4gICAgICAgIGlmIChyb2xlID09PSBcInJvd1wiIHx8IHJvbGUgPT09IFwic2VwYXJhdG9yXCIgfHwgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLnJvbGVUeXBlID09PSAnd2lkZ2V0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRfcm9sZVwiLCBbcm9sZV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgQ29sb3JVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29sb3JVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX29ic2N1cmVkXCI6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIGFuIGVsZW1lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGlzIG5vdCBlbnRpcmVseSBjb3ZlcmVkIGJ5IG90aGVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IGlzIG5vdCBlbnRpcmVseSBjb3ZlcmVkIGJ5IG90aGVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX29ic2N1cmVkXCI6IFwiQ29uZmlybSB0aGF0IHdoZW4gdGhlIGVsZW1lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGlzIG5vdCBjb3ZlcmVkIG9yLCBpZiBjb3ZlcmVkIGJ5IHVzZXIgYWN0aW9uLCBjYW4gYmUgdW5jb3ZlcmVkIHdpdGhvdXQgbW92aW5nIGZvY3VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMi40LjExXCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vIEVhcmx5IGV4aXQ6IGNoZWNrIHZpc2liaWxpdHkgYW5kIHRhYmJhYmlsaXR5IGZpcnN0XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgIFxuICAgICAgICAvLyBFYXJseSBleGl0OiBpZ25vcmUgY2VydGFpbiBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pICE9PSBudWxsXG4gICAgICAgICAgICB8fCBub2RlTmFtZSA9PT0gXCJib2R5XCIgfHwgbm9kZU5hbWUgPT09IFwiaHRtbFwiKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIGlmICghd2luKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIFJldXNlIHNpbmdsZSBET01NYXBwZXIgaW5zdGFuY2VcbiAgICAgICAgY29uc3QgbWFwcGVyOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVhcmx5IGV4aXQ6IGJvdW5kcyBub3QgYXZhaWxhYmxlIG9yIGVsZW1lbnQgaGFzIG5vIGRpbWVuc2lvbnNcbiAgICAgICAgaWYgKCFib3VuZHMgfHwgYm91bmRzLmhlaWdodCA9PT0gMCB8fCBib3VuZHMud2lkdGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFjU3R5bGUpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gUGFyc2Ugei1pbmRleCBvbmNlIGFuZCBjYWNoZVxuICAgICAgICBjb25zdCB6aW5kZXggPSBwYXJzZUludChjU3R5bGUuekluZGV4ID09PSAnYXV0bycgfHwgIWNTdHlsZS56SW5kZXggPyAnMCcgOiBjU3R5bGUuekluZGV4KTtcbiAgICAgICAgXG4gICAgICAgIC8vIE1vcmUgc3BlY2lmaWMgc2VsZWN0b3IgdG8gcmVkdWNlIGl0ZXJhdGlvblxuICAgICAgICBjb25zdCBlbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdib2R5ICo6bm90KHNjcmlwdCk6bm90KHN0eWxlKTpub3QobWV0YSk6bm90KGxpbmspJyk7XG4gICAgICAgIGlmICghZWxlbXMgfHwgZWxlbXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICBcbiAgICAgICAgbGV0IGJlZm9yZSA9IHRydWU7XG4gICAgICAgIGNvbnN0IGJvdW5kc1JpZ2h0ID0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGg7XG4gICAgICAgIGNvbnN0IGJvdW5kc0JvdHRvbSA9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0O1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG9ic2N1cmluZyBlbGVtZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gZWxlbXNbaV07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBhcmUgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICAgICAgICAgKiBJZiB0d28gZWxlbWVudHMgb3ZlcmxhcCBhbmQgei1pbmRleCBhcmUgbm90IGRlZmluZWQsIHRoZW4gdGhlIG5vZGVcbiAgICAgICAgICAgICAqIHJlbmRlcmVkIGVhcmxpZXIgd2lsbCBiZSBvdmVybGFpZCBieSB0aGUgbm9kZSByZW5kZXJlZCBsYXRlci5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLy8gVXNlIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHRvIGNoZWNrIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcHNcbiAgICAgICAgICAgIC8vIE5vdGU6IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHJldHVybnMgMCB3aGVuIGNvbXBhcmluZyBhIG5vZGUgdG8gaXRzZWxmXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHJ1bGVDb250ZXh0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsZW0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkgKDE2KTogZWxlbSBpcyBjb250YWluZWQgYnkgcnVsZUNvbnRleHRcbiAgICAgICAgICAgIC8vIEFsc28gaGFuZGxlIHNlbGYtY29tcGFyaXNvbiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IDAgfHwgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG5leHQgbm9kZSBpbiBlbGVtcyB3aWxsIGJlIGFmdGVyIHRoZSB0YXJnZXQgbm9kZSAocnVsZUNvbnRleHQpXG4gICAgICAgICAgICAgICAgYmVmb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TICg4KTogZWxlbSBjb250YWlucyBydWxlQ29udGV4dFxuICAgICAgICAgICAgLy8gU2tpcCBpZiBlbGVtZW50IGNvbnRhaW5zIHJ1bGVDb250ZXh0IG9yIGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKGVsZW0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTa2lwIGlmIG5vIGJvdW5kcyBvciB6ZXJvIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIGlmICghYm5kcyB8fCBibmRzLmhlaWdodCA9PT0gMCB8fCBibmRzLndpZHRoID09PSAwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBRdWljayBib3VuZHMgY2hlY2s6IGRvZXMgZWxlbSBjb21wbGV0ZWx5IGNvdmVyIHJ1bGVDb250ZXh0P1xuICAgICAgICAgICAgaWYgKGJuZHMudG9wID4gYm91bmRzLnRvcCB8fCBibmRzLmxlZnQgPiBib3VuZHMubGVmdClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYm5kc1JpZ2h0ID0gYm5kcy5sZWZ0ICsgYm5kcy53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGJuZHNCb3R0b20gPSBibmRzLnRvcCArIGJuZHMuaGVpZ2h0O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoYm5kc1JpZ2h0IDwgYm91bmRzUmlnaHQgfHwgYm5kc0JvdHRvbSA8IGJvdW5kc0JvdHRvbSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2hlY2sgei1pbmRleCB0byBkZXRlcm1pbmUgaWYgZWxlbSBvYnNjdXJlcyBydWxlQ29udGV4dFxuICAgICAgICAgICAgY29uc3QgelN0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBpZiAoIXpTdHlsZSkgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGVsZW1aaW5kZXggPSBwYXJzZUludCh6U3R5bGUuekluZGV4ID09PSAnYXV0bycgfHwgIXpTdHlsZS56SW5kZXggfHwgaXNOYU4oTnVtYmVyKHpTdHlsZS56SW5kZXgpKSA/ICcwJyA6IHpTdHlsZS56SW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBiZWZvcmUgcnVsZUNvbnRleHQgaW4gRE9NIG9yZGVyLCBlbGVtIG11c3QgaGF2ZSBoaWdoZXIgei1pbmRleCB0byBvYnNjdXJlXG4gICAgICAgICAgICAvLyBJZiBhZnRlciBydWxlQ29udGV4dCBpbiBET00gb3JkZXIsIGVsZW0gY2FuIG9ic2N1cmUgd2l0aCBlcXVhbCBvciBoaWdoZXIgei1pbmRleFxuICAgICAgICAgICAgaWYgKChiZWZvcmUgJiYgZWxlbVppbmRleCA+IHppbmRleCkgfHwgKCFiZWZvcmUgJiYgZWxlbVppbmRleCA+PSB6aW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZWxlbWVudCBoYXMgb3BhcXVlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICBsZXQgaGFzT3BhcXVlQmFja2dyb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh6U3R5bGUuYmFja2dyb3VuZCAmJiB6U3R5bGUuYmFja2dyb3VuZCAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnQ29sb3IgPSBDb2xvclV0aWwuQ29sb3IoelN0eWxlLmJhY2tncm91bmQpO1xuICAgICAgICAgICAgICAgICAgICBoYXNPcGFxdWVCYWNrZ3JvdW5kID0gYmdDb2xvciAmJiAoYmdDb2xvci5hbHBoYSA9PT0gdW5kZWZpbmVkIHx8IGJnQ29sb3IuYWxwaGEgPiAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPcGFxdWVCYWNrZ3JvdW5kICYmIHpTdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdDb2xvciA9IENvbG9yVXRpbC5Db2xvcih6U3R5bGUuYmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzT3BhcXVlQmFja2dyb3VuZCA9IGJnQ29sb3IgJiYgKGJnQ29sb3IuYWxwaGEgPT09IHVuZGVmaW5lZCB8fCBiZ0NvbG9yLmFscGhhID4gMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaGFzIG5vIGNvbnRlbnQgYW5kIG5vIG9wYXF1ZSBiYWNrZ3JvdW5kLCBza2lwIGl0XG4gICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtKSAmJiAhaGFzT3BhcXVlQmFja2dyb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb2JzY3VyZWRcIiwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X3RhYmJhYmxlX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3Zpc2libGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgdGFiYmFibGUgZWxlbWVudCBzaG91bGQgYmUgdmlzaWJsZSBvbiB0aGUgc2NyZWVuIHdoZW4gaXQgaGFzIGtleWJvYXJkIGZvY3VzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBpcyB2aXNpYmxlIG9uIHRoZSBzY3JlZW5cIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3Zpc2libGVcIjogXCJDb25maXJtIHRoZSBlbGVtZW50IHNob3VsZCBiZSB0YWJiYWJsZSBhbmQgaWYgc28sIGl0IGJlY29tZXMgdmlzaWJsZSB3aGVuIGl0IGhhcyBrZXlib2FyZCBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuNC43XCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IG1hcHBlciA6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgYWxsIG5lZWRlZCBzdHlsZXMgaW4gYSBzaW5nbGUgcGFzcyB0aHJvdWdoIHN0eWxlc2hlZXRzXG4gICAgICAgIGNvbnN0IGFsbFN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKHJ1bGVDb250ZXh0LCBbXCJwb3NpdGlvblwiLCBcImNsaXBcIl0sIFtcIlwiLCBcIjpmb2N1c1wiXSk7XG4gICAgICAgIGNvbnN0IGRlZmluZWRfc3R5bGVzID0gYWxsU3R5bGVzW1wiXCJdO1xuICAgICAgICBjb25zdCBvbmZvY3VzX3N0eWxlcyA9IGFsbFN0eWxlc1tcIjpmb2N1c1wiXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKGJvdW5kc1snaGVpZ2h0J10gPT09IDAgfHwgYm91bmRzWyd3aWR0aCddID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdmlzaWJsZVwiLCBbXSk7XG5cbiAgICAgICAgaWYgKGRlZmluZWRfc3R5bGVzWydwb3NpdGlvbiddPT09J2Fic29sdXRlJyAmJiBkZWZpbmVkX3N0eWxlc1snY2xpcCddICYmIGRlZmluZWRfc3R5bGVzWydjbGlwJ10ucmVwbGFjZUFsbCgnICcsICcnKT09PSdyZWN0KDBweCwwcHgsMHB4LDBweCknXG4gICAgICAgICAgICAmJiAhb25mb2N1c19zdHlsZXNbJ2NsaXAnXSkge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBub3RlIHRoYXQgQSB1c2VyIGNhbiBzZWxlY3QgYSBjaGVja2JveCBhbmQgcmFkaW8gYnV0dG9uIGJ5IHNlbGVjdGluZyB0aGUgYnV0dG9uIG9yIHRoZSBsYWJlbCB0ZXh0LlxuICAgICAgICAgICAgICogV2hlbiBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbiBpcyBjbGlwcGVkIHRvIDAgc2l6ZSwgaXQgaXMgc3RpbGwgYXZhaWxhYmxlIHRvIGEga2V5Ym9hcmQgb3IgYSBzY3JlZW4gcmVhZGVyLlxuICAgICAgICAgICAgICogVGhlIHJ1bGUgc2hvdWxkIGJlIHBhc3NlZCBpZiB0aGUgbGFiZWwgdGV4dCBleGlzdHMgYW5kIHRoZSBidXR0b24gb24tZm9jdXMgc3R5bGUgaXMgZGVmaW5lZCBieSB0aGUgdXNlcixcbiAgICAgICAgICAgICAqIHdoaWNoIGxpa2VseSBpbmN1cnMgdGhlIGNoYW5nZXMgb2YgdGhlIGxhYmVsIHN0eWxlLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgndHlwZScpPT09J2NoZWNrYm94JyB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKT09PSdyYWRpbycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobGFiZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCBhZGRpdGlvbmFsIHBzZXVkby1jbGFzcyBzdHlsZXMgKHJldXNlIG9uZm9jdXNfc3R5bGVzIGZyb20gbGluZSA2MClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvU3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzTXVsdGlwbGUocnVsZUNvbnRleHQsIG51bGwsIFtcIjpmb2N1cy12aXNpYmxlXCIsIFwiOmZvY3VzLXdpdGhpblwiLCBcIjpjaGVja2VkXCIsIFwiOmZvY3VzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNfdmlzaWJsZV9zdHlsZXMgPSBwc2V1ZG9TdHlsZXNbXCI6Zm9jdXMtdmlzaWJsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNfd2l0aGluX3N0eWxlcyA9IHBzZXVkb1N0eWxlc1tcIjpmb2N1cy13aXRoaW5cIl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRfc3R5bGVzID0gcHNldWRvU3R5bGVzW1wiOmNoZWNrZWRcIl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uZm9jdXNfc3R5bGVzID0gcHNldWRvU3R5bGVzW1wiOmZvY3VzXCJdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbmZvY3VzX3N0eWxlcyB8fCBmb2N1c192aXNpYmxlX3N0eWxlcyB8fCBmb2N1c193aXRoaW5fc3R5bGVzIHx8IGNoZWNrZWRfc3R5bGVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3VuZHNbJ3RvcCddID49IDAgJiYgYm91bmRzWydsZWZ0J10gPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkZWZhdWx0X3N0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgbGV0IHRvcCA9IGJvdW5kc1sndG9wJ107XG4gICAgICAgIGxldCBsZWZ0ID0gYm91bmRzWydsZWZ0J107XG4gICAgICAgXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvbmZvY3VzX3N0eWxlcykubGVuZ3RoID09PSAwICkge1xuICAgICAgICAgICAgLy8gbm8gb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2UsIGJ1dCBjb3VsZCBiZSBjaGFuZ2VkIGZyb20ganNcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gd2l0aCBvbmZvY3VzIHBvc2l0aW9uIGNoYW5nZVxuICAgICAgICAgICAgdmFyIHBvc2l0aW9ucyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ3RvcCddICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbnMuaW5jbHVkZXMob25mb2N1c19zdHlsZXNbJ3Bvc2l0aW9uJ10pIHx8ICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ3Bvc2l0aW9uJ10gPT09ICd1bmRlZmluZWQnICYmIHBvc2l0aW9ucy5pbmNsdWRlcyhkZWZhdWx0X3N0eWxlc1sncG9zaXRpb24nXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IG9uZm9jdXNfc3R5bGVzWyd0b3AnXS5yZXBsYWNlKC9cXEQvZywnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBvc2l0aW9uIGlzIHVuZGVmaW5lZCBhbmQgdGhlIHBhcmVudCdzIHBvc2l0aW9uIGlzICdyZWxhdGl2ZSdcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydsZWZ0J10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9ucy5pbmNsdWRlcyhvbmZvY3VzX3N0eWxlc1sncG9zaXRpb24nXSkgfHwgKHR5cGVvZiBvbmZvY3VzX3N0eWxlc1sncG9zaXRpb24nXSA9PT0gJ3VuZGVmaW5lZCcgJiYgcG9zaXRpb25zLmluY2x1ZGVzKGRlZmF1bHRfc3R5bGVzWydwb3NpdGlvbiddKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG9uZm9jdXNfc3R5bGVzWydsZWZ0J10ucmVwbGFjZSgvXFxEL2csJycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBpcyB1bmRlZmluZWQgYW5kIHRoZSBwYXJlbnQncyBwb3NpdGlvbiBpcyAncmVsYXRpdmUnXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBOdW1iZXIuTUlOX1ZBTFVFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRvcCA+PSAwICYmIGxlZnQgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVtYmVkX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZW1iZWRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmVtYmVkXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRW1iZWRfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSA8ZW1iZWQ+IGVsZW1lbnQgaGFzIGFsdGVybmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm92aWRlIGFsdGVybmF0aXZlIGNvbnRlbnQgZm9yIDxlbWJlZD4gZWxlbWVudHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVtb3RpY29uc19hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImVtb3RpY29uc19hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RleHRfRW1vdGljb25zXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVtb3RpY29uc19hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbW90aWNvbnNfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZW1vdGljb25zX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGVtb3RpY29ucyBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVtb3RpY29ucyBtdXN0IGhhdmUgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZWlyIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBEZWNpc2lvbiBpbiBwbGFubmluZyA5LzcvMjMgdGhhdCB0aGlzIHJ1bGUgY2F1c2VzIG1vcmUgcmV2aWV3cyB0aGF0IHdlIHNlZSBhY3R1YWwgcHJvYmxlbXMgaW4gY29udGVudCwgc28gdHVybiB0aGVzZSBydWxlcyBvZmZcbiAgICBcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgZW1vdGljb25zOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIjotKVwiLCBcIjopXCIsIFwiOm8pXCIsIFwiOl1cIiwgXCI6M1wiLCBcIjpjKVwiLCBcIjo+XCIsIFwiPV1cIiwgXCI4KVwiLCBcIj0pXCIsIFwiOkRcIiwgXCJDOlwiLFxuICAgICAgICAgICAgICAgICAgICBcIjotRFwiLCBcIjpEXCIsIFwiOERcIiwgXCJYRFwiLCBcIj1EXCIsIFwiPTNcIiwgXCI8PTNcIiwgXCI8PThcIiwgXCItLSEtLVwiLCBcIjotKFwiLCBcIjooXCIsIFwiOmNcIiwgXCI6PFwiLCBcIjpbXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiRDpcIiwgXCJEOFwiLCBcIkQ7XCIsIFwiRD1cIiwgXCJEWFwiLCBcInYudlwiLCBcIjotOVwiLCBcIjstKVwiLCBcIjspXCIsIFwiKilcIiwgXCI7XVwiLCBcIjtEXCIsIFwiOi1QXCIsIFwiOlBcIixcbiAgICAgICAgICAgICAgICAgICAgXCI6LXBcIiwgXCI6cFwiLCBcIj1wXCIsIFwiOi3DnlwiLCBcIjrDnlwiLCBcIjotYlwiLCBcIjpiXCIsIFwiOi1PXCIsIFwiOk9cIiwgXCJPX09cIiwgXCJvX29cIiwgXCI4T1wiLCBcIk93T1wiLCBcIk8tT1wiLFxuICAgICAgICAgICAgICAgICAgICBcIjBfb1wiLCBcIk9fb1wiLCBcIk8zT1wiLCBcIm8wb8KgO29fbztcIiwgXCJvLi4ub1wiLCBcIjB3MFwiLCBcIjotL1wiLCBcIjovXCIsIFwiOlxcXFxcIiwgXCI9L1wiLCBcIj1cXFxcXCIsIFwiOlNcIiwgXCI6fFwiLFxuICAgICAgICAgICAgICAgICAgICBcImQ6LSlcIiwgXCJxQi0pXCIsIFwiOil+XCIsIFwiOi0pPi4uLi5cIiwgXCI6LVhcIiwgXCI6WFwiLCBcIjotI1wiLCBcIjojXCIsIFwiTzotKVwiLCBcIjA6M1wiLCBcIk86KVwiLCBcIjonKFwiLCBcIjsqKFwiLFxuICAgICAgICAgICAgICAgICAgICBcIlRfVFwiLCBcIlRUX1RUXCIsIFwiVC5UXCIsIFwiOi0qXCIsIFwiOipcIiwgXCJebylcIiwgXCI+OilcIiwgXCI+OylcIiwgXCI+Oi0pXCIsIFwiQilcIiwgXCJCLSlcIiwgXCI4KVwiLCBcIjgtKVwiLFxuICAgICAgICAgICAgICAgICAgICBcIl4+Lj5eXCIsIFwiXjwuPF5cIiwgXCJePl8+XlwiLCBcIl48XzxeXCIsIFwiRDo8XCIsIFwiPjooXCIsIFwiRC06PFwiLCBcIj46LShcIiwgXCI6LUBbMV1cIiwgXCI7KFwiLCBcImBfwrRcIiwgXCJEPFwiLFxuICAgICAgICAgICAgICAgICAgICBcIjwzXCIsIFwiPDMzM1wiLCBcIj1eX149XCIsIFwiPT4uPj1cIiwgXCI9PF88PVwiLCBcIj0+Ljw9XCIsIFwiXFxcXCwsL1wiLCBcIlxcXFxtL1wiLCBcIlxcXFxtL1xcXFw+LjwvXFxcXG0vXCIsIFwiXFxcXG8vXCIsIFwiXFxcXG8gby9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvL1xcXFxvXCIsIFwiOiZcIiwgXCI6dVwiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZW1vdGljb25zID0gdmFsaWRhdGVQYXJhbXMuZW1vdGljb25zLnZhbHVlO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHRlc3RUZXh0ID0gXCJcIjtcblxuICAgICAgICBsZXQgd2Fsa05vZGU6IE5vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICB0ZXN0VGV4dCArPSBcIiBcIiArIHdhbGtOb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdFRleHQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBwYXNzZWQgJiYgaiA8IGVtb3RpY29ucy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGxldCBlbW90SWR4ID0gdGVzdFRleHQuaW5kZXhPZihlbW90aWNvbnNbal0pO1xuICAgICAgICAgICAgICAgIGxldCBlTG5ndGggPSBlbW90aWNvbnNbal0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgZW1vdElkeCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQYXNzZXMgaWY6IHRoZSBlbW90aWNvbiBpcyBub3QgcHJlY2VkZWQgYnkgd2hpdGVzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIGVtb3RpY29uIGlzIG5vdCBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIHVubGVzcyBpdCdzIHB1bmN0dWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAvLyBvciBpdCdzIGluIGEgcHJlLCBjb2RlLCBvciBzY3JpcHRcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIChlbW90SWR4ID4gMCAmJiAhL1xccy8udGVzdCh0ZXN0VGV4dC5zdWJzdHJpbmcoZW1vdElkeCAtIDEsIGVtb3RJZHgpKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChlbW90SWR4IDwgdGVzdFRleHQubGVuZ3RoIC0gZUxuZ3RoICYmICEvXFxzLy50ZXN0KHRlc3RUZXh0LnN1YnN0cmluZyhlbW90SWR4ICsgZUxuZ3RoLCBlbW90SWR4ICsgZUxuZ3RoICsgMSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIS9bLiwhJ1wiP10vLnRlc3QodGVzdFRleHQuc3Vic3RyaW5nKGVtb3RJZHggKyBlTG5ndGgsIGVtb3RJZHggKyBlTG5ndGggKyAxKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IHVzYWdlIG9mICg6IHN0dWZmIDopIHNpbmNlIHRoaXMgaXMgYSBjb21tZW50IGluIHNvbWUgbGFuZ3VhZ2VzXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKGVtb3RpY29uc1tqXSA9PSBcIjopXCIgfHwgZW1vdGljb25zW2pdID09IFwiKDpcIikgJiYgL1xcKFxcOi4qXFw6XFwpLy50ZXN0KHRlc3RUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKGVtb3RpY29uc1tqXSA9PSBcIjspXCIgfHwgZW1vdGljb25zW2pdID09IFwiKDtcIikgJiYgL1xcKFxcOy4qXFw7XFwpLy50ZXN0KHRlc3RUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIGVtb3RJZHggPSB0ZXN0VGV4dC5pbmRleE9mKGVtb3RpY29uc1tqXSwgZW1vdElkeCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdCwgcHJlLCBjb2RlXG4gICAgICAgICAgICBsZXQgY2hlY2tBbmNlc3RvciA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInByZVwiLCBcImNvZGVcIiwgXCJzY3JpcHRcIiwgXCJib2R5XCJdKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNoZWNrQW5jZXN0b3IgPT0gbnVsbCB8fCBjaGVja0FuY2VzdG9yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gXCJib2R5XCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlcnJvcl9tZXNzYWdlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJlcnJvcl9tZXNzYWdlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1pbnZhbGlkPXRydWVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfRXJyb3JNZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJlcnJvcl9tZXNzYWdlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDdXN0b20gZXJyb3IgbWVzc2FnZSBoYXMgaW52YWxpZCByZWZlcmVuY2UgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJDdXN0b20gZXJyb3IgbWVzc2FnZSBpcyBub3QgdmlzaWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgbXVzdCByZWZlcmVuY2UgYSB2YWxpZCAnaWQnIHZhbHVlIGFuZCB3aGVuIHRyaWdnZXJlZCB0aGUgbWVzc2FnZSBtdXN0IGJlIGFwcHJvcHJpYXRlbHkgZXhwb3NlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGFyaWFfZXJyTXNnSWQgPSBBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXJyb3JtZXNzYWdlXCIpO1xuXG4gICAgICAgIC8vIElmIGFyaWEtZXJyb3JtZXNzYWdlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBPVVRfT0ZfU0NPUEVcbiAgICAgICAgaWYgKCFhcmlhX2Vyck1zZ0lkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtc2dfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGFyaWFfZXJyTXNnSWQpO1xuXG4gICAgICAgIC8vIFBPRjA6IEludmFsaWQgaWQgcmVmZXJlbmNlXG4gICAgICAgIGlmICghbXNnX2VsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMTogUmVmZXJlbmNlZCBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG1zZ19lbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZmllbGRzZXRfbGFiZWxfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JvdXBcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImdyb3VwX3dpdGhJbnB1dHNfaGFzTmFtZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcIlBhc3NfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJmaWVsZHNldF9sYWJlbF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiR3JvdXAvRmllbGRzZXQgXFxcInswfVxcXCIgd2l0aCBhbiBpbnB1dCBoYXMgYSB1bmlxdWUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJHcm91cC9GaWVsZHNldCBkb2VzIG5vdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJHcm91cC9GaWVsZHNldCBcXFwiezB9XFxcIiBoYXMgYSBkdXBsaWNhdGUgbmFtZSB0byBhbm90aGVyIGdyb3VwXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiR3JvdXBzIHdpdGggbmVzdGVkIGlucHV0cyBtdXN0IGhhdmUgdW5pcXVlIGFjY2Vzc2libGUgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiLCBcIjMuMy4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZm9ybUNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibGFuZG1hcmtfZ3JvdXBfaW5wdXRcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICBmb3JtQ2FjaGUgPSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0czogW10sXG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzVGVtcCA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAnZmllbGRzZXQsW3JvbGU9XCJncm91cFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzID0gQXJyYXkuZnJvbShhbGxHcm91cHNUZW1wKTtcbiAgICAgICAgICAgIGxldCBncm91cHNXaXRoSW5wdXRzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGdyb3VwIG5vZGVzXG4gICAgICAgICAgICAgICAgaWYgKGFsbEdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0cy5wdXNoKGFsbEdyb3Vwc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShncm91cHNXaXRoSW5wdXRzW2ldKTtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAvKipBUklBTWFwcGVyLmNvbXB1dGVOYW1lKGdyb3Vwc1dpdGhJbnB1dHNbaV0pKi9cbiAgICAgICAgICAgICAgICAgICAgcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwID8gcGFpci5uYW1lLnRyaW0oKSA6IFwiXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHMgPSBncm91cHNXaXRoSW5wdXRzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzO1xuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJsYW5kbWFya19ncm91cF9pbnB1dFwiLGZvcm1DYWNoZSk7ICAgIFxuICAgICAgICB9XG4gICAgICAgIC8vIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzOiBcIiArZWxlbWVudC5pZClcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsczogXCIgK2Zvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsczogXCIgK2Zvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMubGVuZ3RoKVxuXG4gICAgICAgIGxldCBydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZyA9IGZhbHNlO1xuICAgICAgICBsZXQgY29tcHV0ZWROYW1lID0gXCJcIjtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0cykge1xuICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhdmUgYW55IGdyb3VwcyB3aXRoIGlucHV0cy4gVGhlcmVmb3JlIHdlIHNob3VsZCBza2lwIHRoaXMgcnVsZSB0cmlnZ2VyLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaXNTYW1lTm9kZShmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c1tpXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIG91ciBydWxlQ29udGV4dCBpbiB0aGUgY2FjaGVcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PSBcIlwiIHx8XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IG51bGxcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGYWlsXzFcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZm91bmRTYW1lTmFtZUZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGogPCBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaisrXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9IC8vIFdlIGRvIG5vdCB3YW50IHRvIGNvbXBhcmUgYWdhaW5zdCBvdXJzZWxmc1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU2FtZU5hbWVGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZm91bmRTYW1lTmFtZUZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGYWlsXzJcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0sXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wdXRlZE5hbWUgPSBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcnVsZUNvbnRleHRGb3VuZEluZ3JvdXBzV2l0aElucHV0c0ZsYWcpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibnVsbCByZXR1cm5cIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUGFzc18xXCIpXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMVwiLCBbY29tcHV0ZWROYW1lXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmaWVsZHNldF9sZWdlbmRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206ZmllbGRzZXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9GaWVsZHNldF9IYXNMZWdlbmRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSA8bGVnZW5kPlwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCI8ZmllbGRzZXQ+IGVsZW1lbnQgaGFzIG1vcmUgdGhhbiBvbmUgPGxlZ2VuZD5cIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IDxsZWdlbmQ+IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiIDxmaWVsZHNldD4gZWxlbWVudHMgc2hvdWxkIGhhdmUgYSBzaW5nbGUsIG5vbi1lbXB0eSA8bGVnZW5kPiBhcyBhIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSwgIC8vaHR0cHM6Ly93d3cudzMub3JnL1dBSS9XQ0FHMjIvVGVjaG5pcXVlcy9odG1sL0g3MVxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAvL3NraXAgaWYgdGhlIGZpZWxkc2V0IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYSBsZWdlbmQgaXMgaGlkZGVuLCB3ZSBzaG91bGQgc3RpbGwgdHJpZ2dlciBhIHZpb2xhdGlvbnMgZm9yIHRoaXNcbiAgICAgICAgbGV0IGxlZ2VuZHMgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4ocnVsZUNvbnRleHQsIFwibGVnZW5kXCIsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgaWYgKGxlZ2VuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgTk8gTGVnZW5kXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSBpZiAobGVnZW5kcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgbW9yZSB0aGFuIG9uZSBsZWdlbmRcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChDb21tb25VdGlsLmdldElubmVyVGV4dChsZWdlbmRzWzBdKS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgbGVnZW5kIGJ1dCBsZWdlbmQgaXMgZW1wdHlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmaWd1cmVfbGFiZWxfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImZpZ3VyZV9sYWJlbF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpmaWd1cmVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfRmlndXJlX2xhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZmlndXJlX2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPGZpZ3VyZT4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIDxmaWd1cmU+IGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQuIHRoaXMgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzIHJ1bGVzXG4gICAgICAgIGxldCByb2xlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtcbiAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9sZXQgcGFzc2VkID0gQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcGFzc2VkID0gcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9mb250X2NvbG9yOiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1fZm9udF9jb2xvclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9Gb250X0NvbG9ySW5Gb3JtXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fZm9udF9jb2xvci5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZm9ybV9mb250X2NvbG9yLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2ZvbnRfY29sb3IuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNoZWNrIGNvbG9yIGlzIG5vdCB1c2VkIGFzIHRoZSBvbmx5IHZpc3VhbCBtZWFucyB0byBjb252ZXkgd2hpY2ggZmllbGRzIGFyZSByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbWJpbmUgY29sb3IgYW5kIGRlc2NyaXB0aXZlIG1hcmt1cCB0byBpbmRpY2F0ZSByZXF1aXJlZCBmb3JtIGZpZWxkc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmb250cyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9udFwiKTtcbiAgICAgICAgaWYgKGZvbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhZm9udHNbaV0uaGFzQXR0cmlidXRlKFwiY29sb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1faW50ZXJhY3Rpb25fcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206Zm9ybVt0YXJnZXRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRm9ybV9UYXJnZXRBbmRUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX2ludGVyYWN0aW9uX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGludGVyYWN0aW5nIHdpdGggY29udGVudCB3aWxsIG5vdCBvcGVuIHBvcC11cCB3aW5kb3dzIG9yIGNoYW5nZSB0aGUgYWN0aXZlIHdpbmRvdyB3aXRob3V0IGluZm9ybWluZyB0aGUgdXNlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZXIgc2hvdWxkIGJlIGluZm9ybWVkIGluIGFkdmFuY2Ugd2hlbiBpbnRlcmFjdGluZyB3aXRoIGNvbnRlbnQgY2F1c2VzIGEgY2hhbmdlIG9mIGNvbnRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBwYXJhbVdpblRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wibmV3IHdpbmRvd1wiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdFN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRTdHIgPT09IFwiX3BhcmVudFwiIHx8IHRTdHIgPT09IFwiX3NlbGZcIiB8fCB0U3RyID09PSBcIl90b3BcIiB8fCBDb21tb25VdGlsLmdldEZyYW1lQnlOYW1lKHJ1bGVDb250ZXh0LCB0U3RyKSAhPSBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gTmFtZSBpcyBub3QgcGFydCBvZiB0aGlzIGZyYW1lc2V0IOKAkyBtdXN0IGhhdmUgcG90ZW50aWFsIHRvIGNyZWF0ZSBuZXcgd2luZG93P1xuICAgICAgICAgICAgLy8gU2VlIGlmIGEgbmV3IHdpbmRvdyBpcyBtZW50aW9uZWRcbiAgICAgICAgICAgIGxldCB0ZXh0U3RyID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKVxuICAgICAgICAgICAgICAgIHRleHRTdHIgKz0gXCIgXCIgKyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCB2YWxpZGF0ZVBhcmFtcy5wYXJhbVdpblRleHQudmFsdWUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgaWYgKHRleHRTdHIuaW5kZXhPZih2YWxpZGF0ZVBhcmFtcy5wYXJhbVdpblRleHQudmFsdWVbaV0pICE9IC0xKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbTpsYWJlbFtmb3JdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGFiZWxfVW5pcXVlRm9yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGb3JtIGNvbnRyb2wgaGFzIG1vcmUgdGhhbiBvbmUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGb3JtIGNvbnRyb2xzIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgbGV0IGxhYmVsSWRzID0gQ2FjaGVVdGlsLmdldENhY2hlKEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KSwgXCJSUFRfTGFiZWxfU2luZ2xlXCIsIHt9KVxuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhKGlkIGluIGxhYmVsSWRzKTtcbiAgICAgICAgbGFiZWxJZHNbaWRdID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1fc3VibWl0X2J1dHRvbl9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Gb3JtX0hhc1N1Ym1pdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlIDxmb3JtPiBlbGVtZW50IGhhcyBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Zm9ybT4gZWxlbWVudCBzaG91bGQgaGF2ZSBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIHN1Ym1pdCBidXR0b25zIGFyZSB1c3VhbGx5IGF0IHRoZSBib3R0b20gLSB3YWxrIGJhY2t3YXJkc1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiBudy5wcmV2Tm9kZSgpICYmIG53Lm5vZGUgIT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW53LmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHR5cGUgPT09IFwic3VibWl0XCIgfHwgdHlwZSA9PT0gXCJpbWFnZVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImJ1dHRvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN1Ym1pdFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IEFyaWFVdGlsLmhhc1JvbGUobncubm9kZSwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBmb3JtX3N1Ym1pdF9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0W29uY2hhbmdlXSwgZG9tOmlucHV0W29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0Zvcm1fQ2hhbmdlRW1wdHlcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9zdWJtaXRfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZvcm1fc3VibWl0X3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgZm9ybSBkb2VzIG5vdCBzdWJtaXQgYXV0b21hdGljYWxseSB3aXRob3V0IHdhcm5pbmdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGZvcm0gc2hvdWxkIG5vdCBiZSBzdWJtaXR0ZWQgYXV0b21hdGljYWxseSB3aXRob3V0IHdhcm5pbmcgdGhlIHVzZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSwqL1xuICAgIC8vZGVwcmVjYXRlIHRoZSBydWxlIG9uIEp1biAxMCwgMjAyNFxuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmNoYW5nZVwiKS50cmltKCkubGVuZ3RoID09PSAwO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZnJhbWVfc3JjX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImZyYW1lX3NyY192YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZyYW1lLCBkb206aWZyYW1lXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0ZyYW1lX1NyY0h0bWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZyYW1lX3NyY192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZnJhbWVfc3JjX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmcmFtZV9zcmNfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSA8ZnJhbWU+IGNvbnRlbnQgaXMgYWNjZXNzaWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGZyYW1lPiBjb250YWluaW5nIG5vbi1IVE1MIGNvbnRlbnQgbXVzdCBiZSBtYWRlIGFjY2Vzc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwic3JjXCIpICYmXG4gICAgICAgICAgICBDb21tb25VdGlsLmlzSHRtbEV4dChDb21tb25VdGlsLmdldEZpbGVFeHQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpKSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZyYW1lX3RpdGxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJmcmFtZV90aXRsZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpmcmFtZSwgZG9tOmlmcmFtZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ZyYW1lX0hhc1RpdGxlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbmxpbmUgZnJhbWVzIG11c3QgaGF2ZSBhIHVuaXF1ZSwgbm9uLWVtcHR5ICd0aXRsZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIklubGluZSBmcmFtZSBkb2VzIG5vdCBoYXZlIGEgJ3RpdGxlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgLypDaGFuZ2UgbWFwcGluZyB0byA0LjEuMiBmcm9tIDIuNC4xIHR5cG8/ICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBcImNhZTc2MFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZC4gdGhpcyBjYXNlIHdpbGwgYmUgY292ZXJlZCBpbiB0aGUgYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMgcnVsZXNcbiAgICAgICAgbGV0IHJvbGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICBpZiAocm9sZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAobmFtZV9wYWlyICYmIG5hbWVfcGFpci5uYW1lICYmIG5hbWVfcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGhlYWRpbmdfY29udGVudF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmgxLCBkb206aDIsIGRvbTpoMywgZG9tOmg0LCBkb206aDUsIGRvbTpoNlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0hlYWRlcl9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImhlYWRpbmdfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImhlYWRpbmdfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJIZWFkaW5nIGVsZW1lbnQgaGFzIGRlc2NyaXB0aXZlIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSGVhZGluZyBlbGVtZW50IGhhcyBubyBkZXNjcmlwdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSGVhZGluZyBlbGVtZW50cyBtdXN0IHByb3ZpZGUgZGVzY3JpcHRpdmUgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjZcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID1Db21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBoZWFkaW5nX21hcmt1cF9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aDEsIGRvbTpoMiwgZG9tOmgzLCBkb206aDQsIGRvbTpoNSwgZG9tOmg2XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0hlYWRlcnNfRmV3V29yZHNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJoZWFkaW5nX21hcmt1cF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImhlYWRpbmdfbWFya3VwX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIGhlYWRpbmcgZWxlbWVudCBpcyBhIGdlbnVpbmUgaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkhlYWRpbmcgZWxlbWVudHMgbXVzdCBub3QgYmUgdXNlZCBmb3IgcHJlc2VudGF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGhlYWRpbmdMZW5ndGhUaHJlc2g6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMjAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgaGVhZGluZ0xlbmd0aFRocmVzaCA9IHZhbGlkYXRlUGFyYW1zLmhlYWRpbmdMZW5ndGhUaHJlc2gudmFsdWU7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLndvcmRDb3VudChDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkpIDw9IGhlYWRpbmdMZW5ndGhUaHJlc2g7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBbmNlc3RvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3JcIjtcbmltcG9ydCB7IExhbmdVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xhbmdcIjtcblxuZXhwb3J0IGNvbnN0IGh0bWxfbGFuZ19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9IdG1sX0hhc0xhbmdcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIkZhaWxfNFwiLFxuICAgICAgICAgICAgXCJGYWlsXzVcIjogXCJGYWlsXzVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQb3RlbnRpYWxfNVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBvdGVudGlhbF82XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzZcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSBtdXN0IGlkZW50aWZ5IHRoZSBkZWZhdWx0IGxhbmd1YWdlIG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgJ2xhbmcnIGF0dHJpYnV0ZVwiLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFnZSBsYW5ndWFnZSBkZXRlY3RlZCBhcyBcXFwiezB9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCwgYnV0IGhhcyBuZWl0aGVyICdsYW5nJyBub3IgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwsIGJ1dCBkb2VzIG5vdCBoYXZlIGFuICd4bWw6bGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgSFRNTCwgYnV0IGRvZXMgbm90IGhhdmUgYSAnbGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlBhZ2UgZGV0ZWN0ZWQgd2l0aCAnbGFuZycgYW5kICd4bWw6bGFuZycgYXR0cmlidXRlcyBhbmQgcHJpbWFyeSBsYW5ndWFnZXMgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiUGFnZSBkZXRlY3RlZCB3aXRoICdsYW5nJyBhbmQgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCB3aXRoIG9ubHkgYSAnbGFuZycgYXR0cmlidXRlLiBDb25maXJtIHRoYXQgcGFnZSBpcyBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sIG1pbWUgdHlwZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwgMS4wIHdpdGggb25seSBhbiAneG1sOmxhbmcnIGF0dHJpYnV0ZS4gQ29uZmlybSB0aGF0IHBhZ2UgaXMgb25seSBkZWxpdmVyZWQgdmlhIHhtbCBtaW1lIHR5cGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIzLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF82XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCI1YjdhZTBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUaGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgaW5zaWRlIGEgcHJlc2VudGF0aW9uYWwgZnJhbWVcbiAgICAgICAgaWYgKEFuY2VzdG9yVXRpbC5pc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaGllcykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBkb2N0eXBlU3RyaW5nID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlID8gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlLnB1YmxpY0lkIDogXCJcIjtcbiAgICAgICAgaWYgKCFkb2N0eXBlU3RyaW5nKSBkb2N0eXBlU3RyaW5nID0gXCJcIjtcbiAgICAgICAgbGV0IGxhbmcgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpO1xuICAgICAgICBsZXQgbGFuZ1hNTCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuXG4gICAgICAgIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmICFkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKFwiMS4wXCIpKSB7XG4gICAgICAgICAgICBpZiAoIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCAhPSAxLjAgKG11c3QgaGF2ZSB4bWw6bGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmdYTUxdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmIGRvY3R5cGVTdHJpbmcuaW5jbHVkZXMoXCIxLjBcIikpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBYSFRNTCAxLjBcbiAgICAgICAgICAgIC8vIElmIG5laXRoZXIgaXMgcHJvdmlkZWQsIGl0J3MgYSBmYWlsdXJlXG4gICAgICAgICAgICBpZiAoIWxhbmcgJiYgIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbm8gbGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyAmJiBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhbmcgIT09IGxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmcpIHx8ICFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgRWxlbV9MYW5nX1ZhbGlkIGhhbmRsZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUxhbmdVdGlsLm1hdGNoUHJpbWFyeUxhbmcobGFuZywgbGFuZ1hNTCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZywgYnV0IHRoZXkgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNFwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNVwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIixbbGFuZ10pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gWEhUTUwgYW5kIG9ubHkgbGFuZyAob2theSBpZiBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzVcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBvbmx5IHhtbDpsYW5nIChva2F5IGlmIG9ubHkgZGVsaXZlcmVkIHZpYSB4bWwgbWltZSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWxhbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgJiYgbGFuZ1hNTCkge1xuICAgICAgICAgICAgICAgIC8vIEhUTUw1IHBvbHlnbG90IGRvY3VtZW50c1xuICAgICAgICAgICAgICAgIGlmIChsYW5nICE9PSBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nKSB8fCAhTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nWE1MKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IEVsZW1fTGFuZ19WYWxpZCBoYW5kbGUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5tYXRjaFByaW1hcnlMYW5nKGxhbmcsIGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcsIGJ1dCB0aGV5IGRvbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzRcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzVcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG4gICAgXG5leHBvcnQgY29uc3QgaHRtbF9za2lwbmF2X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJodG1sX3NraXBuYXZfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0h0bWxfU2tpcE5hdlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfc2tpcG5hdl9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgaHRtbF9za2lwbmF2X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGh0bWxfc2tpcG5hdl9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJvdmlkZSBhIHdheSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZXJlIGlzIGEgd2F5IHRvIGJ5cGFzcyBibG9ja3Mgb2YgY29udGVudCB0aGF0IGFyZSByZXBlYXRlZCBvbiBtdWx0aXBsZSBXZWIgcGFnZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjQuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBmcmFtZXMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiZnJhbWVcIik7XG4gICAgICAgIGxldCBoZWFkZXJzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImgxXCIpO1xuXG4gICAgICAgIGlmICgoZnJhbWVzICE9IG51bGwgJiYgZnJhbWVzLmxlbmd0aCA+IDApIHx8IChoZWFkZXJzICE9IG51bGwgJiYgaGVhZGVycy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgLy8gSWYgZnJhbWVzIG9yIGhlYWRpbmdzIGFyZSB1c2VkLCBwYXNzXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTG9vayBmb3Igc2tpcCBhbmNob3JzXG4gICAgICAgICAgICBsZXQgYW5jaG9ycyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJhXCIpO1xuICAgICAgICAgICAgbGV0IHRhcmdldHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7ICFwYXNzZWQgJiYgaWR4IDwgYW5jaG9ycy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcnNbaWR4XS5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBocmVmID0gYW5jaG9yc1tpZHhdLmhyZWY7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaHJlZiAhPT0gdHlwZW9mIFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocmVmLmJhc2VWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gaHJlZi5iYXNlVmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgdG1wTG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKChydWxlQ29udGV4dC5vd25lckRvY3VtZW50IGFzIGFueSkubG9jYXRpb25Gcm9tREFQKSAhPSBcInVuZGVmaW5lZFwiICYmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50IGFzIGFueSkubG9jYXRpb25Gcm9tREFQICE9IG51bGwpIHsgLy8gREFQIHNldHMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcExvY2F0aW9uID0gKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5sb2NhdGlvbkZyb21EQVA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHNlcnZlciBzY2FuIGhhcyB0aGUgbG9jYXRpb24gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB0bXBMb2NhdGlvbiA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQubG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvY0hyZWYgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG1wTG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0hyZWYgPSB0bXBMb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpeCB3ZWlyZCBidWdzIHdpdGggaG93IHZhcmlvdXMgcGFyc2VycyByZXBvcnQgb24gZmlsZTogdXJsJ3M6XG4gICAgICAgICAgICAgICAgICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoXCJmaWxlOi8vL1wiKSkgaHJlZiA9IFwiZmlsZTovXCIgKyBocmVmLnN1YnN0cmluZyhcImZpbGU6Ly8vXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0hyZWYuc3RhcnRzV2l0aChcImZpbGU6Ly8vXCIpKSBkb2NIcmVmID0gXCJmaWxlOi9cIiArIGRvY0hyZWYuc3Vic3RyaW5nKFwiZmlsZTovLy9cIi5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChocmVmLmNoYXJBdCgwKSA9PSBcIiNcIiB8fCBocmVmLnN0YXJ0c1dpdGgoZG9jSHJlZiArIFwiI1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IENvbW1vblV0aWwuZ2V0RmlsZUFuY2hvcihocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgdGFyZ2V0KSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0c1t0YXJnZXRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaG9yc1tpZHhdLmhhc0F0dHJpYnV0ZShcIm5hbWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIGZvcndhcmQganVtcGluZyB0YXJnZXRzXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gYW5jaG9yc1tpZHhdLmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoXCIjXCIpICE9IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IENvbW1vblV0aWwuZ2V0RmlsZUFuY2hvcihuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbmFtZSBpbiB0YXJnZXRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTU1hcHBlclwiO1xuXG5leHBvcnQgY29uc3QgaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlmcmFtZVwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJZnJhbWUgd2l0aCBpbnRlcmFjdGl2ZSBjb250ZW50IHNob3VsZCBub3QgYmUgZXhjbHVkZWQgZnJvbSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBpZnJhbWUgd2l0aCBpbnRlcmFjdGl2ZSBjb250ZW50IGlzIG5vdCBleGNsdWRlZCBmcm9tIHRoZSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiVGhlIDxpZnJhbWU+IHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBpcyBleGNsdWRlZCBmcm9tIHRhYiBvcmRlciB1c2luZyB0YWJpbmRleFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuMS4xXCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCJha243Ym5cIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBjb25zdCBtYXBwZXIgOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgaWZyYW1lIGlzIHRvbyBzbWFsbCB0byBiZSB2aXNpYmxlIG9uIHNjcmVlblxuICAgICAgICBpZiAoTWF0aC5tYXgoYm91bmRzWydoZWlnaHQnXSwgYm91bmRzWyd3aWR0aCddKSA8IDMwIHx8IE1hdGgubWluKGJvdW5kc1snaGVpZ2h0J10sIGJvdW5kc1snd2lkdGgnXSkgPCAxNSkgIFxuICAgICAgICAgICByZXR1cm4gbnVsbDsgXG5cbiAgICAgICAgLy8gcGFzcyBpZnJhbWUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdGFiaW5kZXggYXR0cmlidXRlIHZhbHVlIHRoYXQgaXMgYSBuZWdhdGl2ZSBudW1iZXJcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgLy8gY2hlY2sgaWZyYW1lIGNvbnRlbnRcbiAgICAgICAgY29uc3QgaWZyYW1FbGVtID0gcnVsZUNvbnRleHQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIGlmICghaWZyYW1FbGVtIHx8ICFpZnJhbUVsZW0uY29udGVudERvY3VtZW50IHx8ICFpZnJhbUVsZW0uY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIElmIHRoZSBpZnJhbWUgaXMgYmxvY2tlZCBieSBhbiBvcGVuIG1vZGFsIGRpYWxvZyBpdCBpcyBlZmZlY3RpdmVseSBpbmVydCDigJQgaW5hcHBsaWNhYmxlXG4gICAgICAgIGNvbnN0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ3MgPSBBcnJheS5mcm9tKGRvYy5xdWVyeVNlbGVjdG9yQWxsKFwiZGlhbG9nXCIpKTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrZWRCeU1vZGFsID0gZGlhbG9ncy5zb21lKGQgPT4gZC5tYXRjaGVzKFwiOm1vZGFsXCIpICYmICFkLmNvbnRhaW5zKHJ1bGVDb250ZXh0KSk7XG4gICAgICAgICAgICBpZiAoYmxvY2tlZEJ5TW9kYWwpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnQgPSBDb21tb25VdGlsLmdldFRhYmJhYmxlQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY291bnQgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbnZhbGlkXCIpO1xuXG4gICAgICAgIHJldHVybiBudWxsOyAgICBcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0V4cGxpY2l0TGFiZWxJbWFnZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJQYXNzXzFcIixcbiAgICAgICAgICAgIFwiUGFzc18yXCI6IFwiUGFzc18yXCIsXG4gICAgICAgICAgICBcIkZhaWxcIjogXCJGYWlsXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkltYWdlIGJ1dHRvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0IHVzaW5nIHRoZSAnYWx0JyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiSW1hZ2UgYnV0dG9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHRleHQgdXNpbmcgYW4gQVJJQSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJJbWFnZSBidXR0b24gcHJvdmlkZXMgYWx0ZXJuYXRpdmUgdGV4dCB1c2luZyB0aGUgJ3RpdGxlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiRmFpbFwiOiBcIlRoZSA8aW5wdXQ+IGVsZW1lbnQgb2YgdHlwZSBcXFwiaW1hZ2VcXFwiIGhhcyBubyB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCBvZiB0eXBlIFxcXCJpbWFnZVxcXCIgc2hvdWxkIGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjU5Nzk2ZlwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvV0FJL1dDQUcyMi9UZWNobmlxdWVzL2ZhaWx1cmVzL0Y2NVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgfHwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpICE9IFwiaW1hZ2VcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1hZ2VtYXBfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJpbWFnZW1hcF9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW3VzZW1hcF0sIGRvbTppbWdbaXNtYXBdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0ltZ19Vc2VtYXBBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWFnZW1hcF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkltYWdlIG1hcCBvciBjaGlsZCA8YXJlYT4gaGFzIG5vIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBpbWFnZSBtYXAgYW5kIGVhY2ggPGFyZWE+IGVsZW1lbnQgaW4gYW4gaW1hZ2UgbWFwIG11c3QgaGF2ZSB0ZXh0IGFsdGVybmF0aXZlKHMpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKSB8fFxuICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJpc21hcFwiKSAmJiAhQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ1c2VtYXBcIikpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfYWx0X2JhY2tncm91bmQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9iYWNrZ3JvdW5kXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19CYWNrZ3JvdW5kSW1nX0hhc1RleHRPclRpdGxlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19hbHRfYmFja2dyb3VuZC5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiaW1nX2FsdF9iYWNrZ3JvdW5kLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X2JhY2tncm91bmQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBpbXBvcnRhbnQgYmFja2dyb3VuZCBpbWFnZSBpbmZvcm1hdGlvbiBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlIGluIHN5c3RlbSBoaWdoIGNvbnRyYXN0IG1vZGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJCYWNrZ3JvdW5kIGltYWdlcyB0aGF0IGNvbnZleSBpbXBvcnRhbnQgaW5mb3JtYXRpb24gbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZSB0aGF0IGRlc2NyaWJlcyB0aGUgaW1hZ2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IHN0eWxlID0gZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoc3R5bGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBiYWNrZ3JvdW5kSW1ncyA9IHN0eWxlLmJhY2tncm91bmRJbWFnZTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGJhY2tncm91bmRJbWdzICE9IG51bGwgJiYgYmFja2dyb3VuZEltZ3MgIT0gXCJcIiAmJiBiYWNrZ3JvdW5kSW1ncyAhPSAnbm9uZScgJiYgYmFja2dyb3VuZEltZ3MgIT0gJ2luaGVyaXQnKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaW5uZXJIVE1MICE9IG51bGwgJiYgcnVsZUNvbnRleHQuaW5uZXJIVE1MLnRyaW0oKS5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJyk7XG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoICE9IDApXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2FsdF9kZWNvcmF0aXZlOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfZGVjb3JhdGl2ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW1nX1ByZXNlbnRhdGlvbkltZ0hhc05vbk51bGxBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfZGVjb3JhdGl2ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkltYWdlIGRlc2lnbmF0ZWQgYXMgZGVjb3JhdGl2ZSBoYXMgbm9uLW51bGwgJ2FsdCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW1hZ2UgZGVzaWduYXRlZCBhcyBkZWNvcmF0aXZlIG11c3QgaGF2ZSAnYWx0PVxcXCJcXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJwcmVzZW50YXRpb25cIikgfHwgQXJpYVV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJub25lXCIpKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikubGVuZ3RoID09IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nLCBkb206YXJlYSwgZG9tOmlucHV0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSW1nX0FsdENvbW1vbk1pc3VzZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfYWx0X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaW1nX2FsdF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgZmlsZSBuYW1lIHNlcnZlcyBhcyBhIGdvb2QgaW5saW5lIHJlcGxhY2VtZW50IGZvciB0aGUgaW1hZ2VcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCInYWx0JyBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBhIGdvb2QgaW5saW5lIHJlcGxhY2VtZW50IGZvciB0aGUgaW1hZ2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgYmFkVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJzaG9ydCBkZXNjcmlwdGlvblwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAvLyBBbHQgdGV4dCBjaGVjayBhcmUgZWxzZXdoZXJlIChTZWUgNDEsIDI0MCwgNDU1KVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCk7XG4gICAgICAgICAgICBpZiAoYWx0VGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJhZFRleHQgPSB2YWxpZGF0ZVBhcmFtcy5iYWRUZXh0LnZhbHVlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGJhZFRleHQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gYWx0VGV4dC5pbmRleE9mKGJhZFRleHRbaV0pID09IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzcmMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoKG5vZGVOYW1lID09IFwiYXJlYVwiKSA/IFwiaHJlZlwiIDogXCJzcmNcIik7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IGl0IHRvIHBhc3MgaWYgdGhlcmUncyBubyBzcmMgLSBjYW4ndCBkZXRlcm1pbmUgdGhlc2UuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbCBpZiB0aGUgYWx0IG1hdGNoZXMgdGhlIHNyYyBleGFjdGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIGZhaWwgaWYgdGhlIGFsdCBoYXMgYSAuIGluIGl0IGFuZCBlaXRoZXIgdGhlIHNyYyBpcyBpbiB0aGUgYWx0IG9yIHRoZSBhbHQgaXMgaW4gdGhlIHNyY1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gc3JjLnRyaW0oKSAhPSBhbHRUZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsdFRleHQuaW5kZXhPZihcIi5cIikgPT0gLTEgfHwgKGFsdFRleHQuaW5kZXhPZihzcmMpID09IC0xICYmIHNyYy5pbmRleE9mKGFsdFRleHQpID09IC0xKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2FsdF9udWxsOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfbnVsbFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW1nX1RpdGxlRW1wdHlXaGVuQWx0TnVsbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9kZWNvcmF0aXZlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9kZWNvcmF0aXZlXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2FyaWFfb3ZlcnJpZGVcIjogXCJpbWdfYWx0X251bGwuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfbnVsbC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJOZWl0aGVyICdhcmlhJyBub3IgJ3RpdGxlJyBhdHRyaWJ1dGVzIGFyZSB1c2VkIGZvciB0aGUgZGVjb3JhdGl2ZSBpbWFnZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2RlY29yYXRpdmVcIjogXCJUaGUgaW1hZ2UgJ2FsdCcgYXR0cmlidXRlIGlzIGVtcHR5LCBidXQgdGhlICd0aXRsZScgYXR0cmlidXRlIGlzIG5vdCBlbXB0eVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfYXJpYV9vdmVycmlkZVwiOiBcIlRoZSBpbWFnZSAnYWx0JyBhdHRyaWJ1dGUgaXMgZW1wdHksIGJ1dCB0aGUgJ2FyaWEnIGxhYmVsIGlzIG5vdCBlbXB0eSBhbmQgb3ZlcnJpZGVzIHRoZSAnYWx0JyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIHRoZSBpbnRlbnQgaXMgdG8gbWFyayBhbiBpbWFnZSBhcyBkZWNvcmF0aXZlIHdpdGggYW4gZW1wdHkgJ2FsdCcgYXR0cmlidXRlLCB0aGUgJ2FyaWEnIG9yICd0aXRsZScgYXR0cmlidXRlcyBzaG91bGQgbm90IGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJmYWlsX2RlY29yYXRpdmVcIl1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSxcbiAgICAgICAgcmVhc29uQ29kZXM6IFtcInBvdGVudGlhbF9hcmlhX292ZXJyaWRlXCJdXG4gICAgfVxuICAgIF0sXG4gICAgYWN0OiBbe1wiNDZjYTdmXCI6IHtcInBvdGVudGlhbF9hcmlhX292ZXJyaWRlXCI6IFwiZmFpbFwifX1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgaGF2ZSBhIHRpdGxlLCBidXQgYWx0IGlzIGVtcHR5XG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2FyaWFfb3ZlcnJpZGVcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9kZWNvcmF0aXZlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2FsdF9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9yZWR1bmRhbnRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19MaW5rVGV4dE5vdFJlZHVuZGFudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTGluayB0ZXh0IGlzIHJlcGVhdGVkIGluIGFuIGltYWdlICdhbHQnIHZhbHVlIHdpdGhpbiB0aGUgc2FtZSBsaW5rXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkxpbmsgdGV4dCBvZiBwcmV2aW91cyBsaW5rIGlzIHJlcGVhdGVkIGluIGltYWdlICdhbHQnIHZhbHVlIG9mIGEgbGlua1wiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJJbWFnZSAnYWx0JyB2YWx1ZSB3aXRoaW4gYSBsaW5rIGlzIHJlcGVhdGVkIGluIGxpbmsgdGV4dCBvZiB0aGUgbGluayBhZnRlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSB0ZXh0IGFsdGVybmF0aXZlIGZvciBhbiBpbWFnZSB3aXRoaW4gYSBsaW5rIHNob3VsZCBub3QgcmVwZWF0IHRoZSBsaW5rIHRleHQgb3IgYWRqYWNlbnQgbGluayB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiLCBcIjIuNC40XCJdLCAvL21hdGNoIGhlbHAgcmVmZXJlbmNlc1xuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBhTm9kZSA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiYVwiKTtcbiAgICAgICAgLy9JZiBub3QgaW4gYW4gYW5jaG9yLCBPdXQgb2YgU2NvcGVcbiAgICAgICAgaWYgKGFOb2RlID09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBhbHRUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoYWx0VGV4dC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgLy8gSWYgYWx0IHRleHQgaXMgZW1wdHksIHRoZXJlJ3Mgbm8gdGV4dCB0byBiZSByZWR1bmRhbnQgLSBsZXQgYV90ZXh0X3B1cnBvc2VcbiAgICAgICAgICAgIC8vIHRyaWdnZXIgaW4gdGhhdCBjYXNlLlxuICAgICAgICAgICAgLy8gU28gT3V0IG9mIFNjb3BlIGZvciB0aGlzIHJ1bGVcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbm5lclRleHQgPSBhTm9kZS5pbm5lclRleHQ7XG4gICAgICAgIGxldCBsaW5rVGV4dCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKGlubmVyVGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsaW5rVGV4dCA9IGlubmVyVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlua1RleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGFsdFRleHQgPT0gbGlua1RleHQpIHtcbiAgICAgICAgICAgICAgICAvLyBUZXh0IGluIGxpbmtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vYWx0IGlzIG5vbi16ZXJvLCBidXQgbm8gbGluayB0ZXh0IC0gZW5zdXJlIGFkamFjZW50IGxpbmsgdGV4dCBpc24ndCByZWR1bmRhbnRcbiAgICAgICAgICAgIGxldCB3YWxrID0gbmV3IERPTVdhbGtlcihhTm9kZSk7XG4gICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGsucHJldk5vZGUoKSkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBhbmQgbm9kZU5hbWVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGsubm9kZTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKChub2RlTmFtZSA9PSBcIiN0ZXh0XCIgJiYgbm9kZS5ub2RlVmFsdWUubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKG5vZGVOYW1lID09IFwiaW1nXCIgJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFsdFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENvbXBseSB3aXRoIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBTZXR0aW5nIGlmIHRoZSBhIGVsZW1lbnQgc2hvdWxkIGJlIGNoZWNrZWQgb3Igbm90XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiYVwiICYmICFDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dCBiZWZvcmUgaW1hZ2UgbGlua1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCB8fCBub2RlLnRleHRDb250ZW50IHx8IFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9IGFsdFRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrID0gbmV3IERPTVdhbGtlcihhTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGsubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBhbmQgbm9kZU5hbWVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGsubm9kZTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwiI3RleHRcIiAmJiBub2RlLm5vZGVWYWx1ZS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAobm9kZU5hbWUgPT0gXCJpbWdcIiAmJiBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tcGx5IHdpdGggdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcgaWYgdGhlIGEgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCBvciBub3RcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlTmFtZSA9PSBcImFcIiAmJiAhQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChub2RlIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT0gYWx0VGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIFRleHQgYWZ0ZXIgaW1hZ2UgbGlua1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX2FsdFwiOiBcImZhaWxfYmxhbmtfYWx0XCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiZmFpbF9ub19hbHRcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua190aXRsZVwiOiBcImZhaWxfYmxhbmtfdGl0bGVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua19hbHRcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hbHRcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua190aXRsZVwiOiBcImltZ19hbHRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGltYWdlIGhhcyBhbiBhY2Nlc3NpYmxlIG5hbWUgb3IgaXMgY29ycmVjdGx5IG1hcmtlZCBhcyBkZWNvcmF0aXZlIG9yIHJlZHVuZGFudFwiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX2FsdFwiOiBcIkltYWdlICdhbHQnIGF0dHJpYnV0ZSB2YWx1ZSBjb25zaXN0cyBvbmx5IG9mIGJsYW5rIHNwYWNlKHMpXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiVGhlIGltYWdlIGhhcyBuZWl0aGVyIGFuIGFjY2Vzc2libGUgbmFtZSBub3IgaXMgbWFya2VkIGFzIGRlY29yYXRpdmUgb3IgcmVkdW5kYW50XCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJUaGUgaW1hZ2UgZG9lcyBub3QgaGF2ZSBhbiAnYWx0JyBhdHRyaWJ1dGUgb3IgQVJJQSBsYWJlbCwgYW5kIHRoZSAndGl0bGUnIGF0dHJpYnV0ZSB2YWx1ZSBjb25zaXN0cyBvbmx5IG9mIGJsYW5rIHNwYWNlKHMpXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW1hZ2VzIG11c3QgaGF2ZSBhY2Nlc3NpYmxlIG5hbWVzIHVubGVzcyB0aGV5IGFyZSBkZWNvcmF0aXZlIG9yIHJlZHVuZGFudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCIyM2EyYThcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBJZiBub3QgdmlzaWJsZSB0byB0aGUgc2NyZWVuIHJlYWRlciwgb3IgY2FuIGJlIGlnbm9yZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBBY2NOYW1lVXRpbC5pc0FjY2Vzc2libGVOYW1lSWdub3JhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGltZyBoYXMgbm9uLWVtcHR5IGFyaWEgbGFiZWxcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWx0ID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpIDogbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGNoZWNrIHRpdGxlIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoYWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyB0aGUgaW1nIGhhcyBubyBhbHQgb3IgYXR0cmlidXRlLCBleGFtaW5lIHRoZSB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIikgOiBudWxsO1xuICAgICAgICAgICAgaWYgKHRpdGxlID09PSBudWxsIHx8IHRpdGxlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIG5vIHRpdGxlIG9yIHRpdGxlIGlzIGVtcHR5LCBleGFtaW5lIGFsdCBmdXJ0aGVyXG4gICAgICAgICAgICAgICAgaWYgKGFsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gJ3ByZXNlbnRhdGlvbicgfHwgcm9sZSA9PT0gJ25vbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fYWx0XCIpO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgaWYgKGFsdC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7IFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aXRsZSBjb250YWlucyBibGFuayBzcGFjZSBvbmx5ICh0aXRsZT1cIiAgXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYmxhbmtfdGl0bGVcIik7IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB0aXRsZSBjb250YWlucyBzb21lIHRleHQgKHRpdGxlPVwic29tZSB0ZXh0XCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhbHQubGVuZ3RoID09PSAwIHx8IGFsdC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpbWcgaGFzIGVtcHR5IGFsdCAoYWx0PVwiXCIpIG9yIG5vbi1lbXB0eSBhbHQgKGFsdD1cInNvbWUgdGV4dFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7IFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBhbHQgY29udGFpbnMgYmxhbmsgc3BhY2Ugb25seSAoYWx0PVwiIFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYmxhbmtfYWx0XCIpOyBcbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH0gICAgICAgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfaXNtYXBfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19pc21hcF9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbaXNtYXBdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSW1nX1VzZW1hcFZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19pc21hcF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImltZ19pc21hcF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19pc21hcF9taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlNlcnZlci1zaWRlIGltYWdlIG1hcCBob3Qtc3BvdHMgZG8gbm90IGhhdmUgZHVwbGljYXRlIHRleHQgbGlua3NcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTZXJ2ZXItc2lkZSBpbWFnZSBtYXAgaG90LXNwb3RzIG11c3QgaGF2ZSBkdXBsaWNhdGUgdGV4dCBsaW5rc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ1c2VtYXBcIikpIHtcbiAgICAgICAgICAgIGxldCB1c2VtYXAgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ1c2VtYXBcIik7XG4gICAgICAgICAgICB1c2VtYXAgPSB1c2VtYXAudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBsZXQgaWR4ID0gdXNlbWFwLmluZGV4T2YoXCIjXCIpO1xuICAgICAgICAgICAgaWYgKGlkeCAhPSAtMSlcbiAgICAgICAgICAgICAgICB1c2VtYXAgPSB1c2VtYXAuc3Vic3RyKGlkeCArIDEpO1xuXG4gICAgICAgICAgICBpZiAodXNlbWFwLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFwcyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJtYXBcIik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IG1hcHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbWFwc1tpXS5oYXNBdHRyaWJ1dGUoXCJuYW1lXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBzW2ldLmdldEF0dHJpYnV0ZShcIm5hbWVcIikudG9Mb3dlckNhc2UoKSA9PSB1c2VtYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2xvbmdkZXNjX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2xvbmdkZXNjXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ltZ19Mb25nRGVzY3JpcHRpb24yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBmaWxlIGRlc2lnbmF0ZWQgYnkgdGhlICdsb25nZGVzYycgYXR0cmlidXRlIGNvbnRhaW5zIHZhbGlkIEhUTUwgY29udGVudCAoZmlsZSBleHRlbnNpb24gbm90IHJlY29nbml6ZWQpXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiIFRoZSAnbG9uZ2Rlc2MnIGF0dHJpYnV0ZSBtdXN0IHJlZmVyZW5jZSBIVE1MIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGxvbmdkZXNjID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibG9uZ2Rlc2NcIik7XG4gICAgICAgIC8vIGlmIChsb25nZGVzYyBpcyBiYWQgVVJMKSBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICBsZXQgZXh0ID0gQ29tbW9uVXRpbC5nZXRGaWxlRXh0KGxvbmdkZXNjKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGV4dC5sZW5ndGggIT0gMCAmJiBDb21tb25VdGlsLmlzSHRtbEV4dChleHQpXG4gICAgICAgICAgICB8fCBsb25nZGVzYy5zdGFydHNXaXRoKFwiI1wiKVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcImh0dHA6Ly9cIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcImRhdGE6XCIpO1xuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBcIm5wbSBydW4gcHJlYnVpbGRcIi4gRG8gbm90IGVkaXRcblxuZXhwb3J0ICogZnJvbSBcIi4vYV90YXJnZXRfd2FybmluZ1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hX3RleHRfcHVycG9zZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcHBsZXRfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJlYV9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2FsbG93ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3RcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3JlcXVpcmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Jhbm5lcl9zaW5nbGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jaGlsZF90YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NoaWxkX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29udGVudF9pbl9sYW5kbWFya1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX3NpbmdsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZ3JhcGhpY19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2hpZGRlbl9ub250YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2lkX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2ltZ19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9tYWluX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX21haW5fbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfcGFyZW50X3JlcXVpcmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JlZ2lvbl9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JvbGVfYWxsb3dlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JvbGVfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3NlbWFudGljc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfd2lkZ2V0X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FzY2lpYXJ0X2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxpbmtfY3NzX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9ibGlua19lbGVtX2RlcHJlY2F0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxvY2txdW90ZV9jaXRlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9jYW52YXNfY29udGVudF9kZXNjcmliZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY2FwdGlvbl90cmFja19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2Rlc2lnbl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9jb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfaGFzcG9wdXBfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RlYnVnX3BhdGhzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RldGVjdG9yX3RhYmJhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Rpcl9hdHRyaWJ1dGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9pZF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9sYW5nX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfdGFiYmFibGVfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbWJlZF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Vtb3RpY29uc19hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yX21lc3NhZ2VfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpZWxkc2V0X2xhYmVsX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpZWxkc2V0X2xlZ2VuZF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9maWd1cmVfbGFiZWxfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvcm1fZm9udF9jb2xvclwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2ludGVyYWN0aW9uX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvcm1fc3VibWl0X3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mcmFtZV9zcmNfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZnJhbWVfdGl0bGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2hlYWRpbmdfY29udGVudF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaGVhZGluZ19tYXJrdXBfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2h0bWxfbGFuZ19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaHRtbF9za2lwbmF2X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1hZ2VidXR0b25fYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWFnZW1hcF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfYmFja2dyb3VuZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X2RlY29yYXRpdmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9udWxsXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2lzbWFwX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfbG9uZ2Rlc2NfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2F1dG9jb21wbGV0ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9jaGVja2JveGVzX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfZmllbGRzX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfaGFzcG9wdXBfY29uZmxpY3RcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfYWZ0ZXJcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfYmVmb3JlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X29uY2hhbmdlX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xhYmVsX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xhYmVsX25hbWVfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9yZWZfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9jaGlsZHJlbl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9saXN0X21hcmt1cF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyXCJcbmV4cG9ydCAqIGZyb20gXCIuL21hcnF1ZWVfZWxlbV9hdm9pZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hbHRfYnJpZWZcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hdWRpb190cmFuc2NyaWJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL21lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9saXZlX2NhcHRpb25lZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV90cmFja19hdmFpbGFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV9yZWRpcmVjdF9vcHRpb25hbFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZXRhX3JlZnJlc2hfZGVsYXlcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV92aWV3cG9ydF96b29tYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9ub2VtYmVkX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL29iamVjdF90ZXh0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wYWdlX3RpdGxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wYWdlX3RpdGxlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NjcmlwdF9mb2N1c19ibHVyX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfb25jbGlja19hdm9pZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfb25jbGlja19taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X3NlbGVjdF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2VsZWN0X29wdGlvbnNfZ3JvdXBlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9za2lwX21haW5fZGVzY3JpYmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NraXBfbWFpbl9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfY29sb3JfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2ZvY3VzX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfaG92ZXJfcGVyc2lzdGVudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV92aWV3cG9ydF9yZXNpemFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3ZnX2dyYXBoaWNzX2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2FyaWFfZGVzY2VuZGFudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfY2FwdGlvbl9lbXB0eVwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9jYXB0aW9uX25lc3RlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9oZWFkZXJzX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9oZWFkZXJzX3JlZl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfbGF5b3V0X2xpbmVhcml6ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfc2NvcGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfc3RydWN0dXJlX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9zdW1tYXJ5X3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfYmxvY2tfaGVhZGluZ1wiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9xdW90ZWRfY29ycmVjdGx5XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfc2Vuc29yeV9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9zcGFjaW5nX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfd2hpdGVzcGFjZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi93aWRnZXRfdGFiYmFibGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3dpZGdldF90YWJiYWJsZV9zaW5nbGVcIiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbYXV0b2NvbXBsZXRlXSwgZG9tOnRleHRhcmVhW2F1dG9jb21wbGV0ZV0sIGRvbTpzZWxlY3RbYXV0b2NvbXBsZXRlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX0lucHV0X0F1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9pbmFwcHJvcHJpYXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxfaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJGYWlsX2F0dHJpYnV0ZV9pbmNvcnJlY3RcIjogXCJmYWlsX2luY29ycmVjdFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5hcHByb3ByaWF0ZVwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5jb3JyZWN0XCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgbXVzdCBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGlucHV0IGZvcm0gZmllbGRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUncyB0b2tlbihzKSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGlucHV0IGZvcm0gZmllbGRcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbmFwcHJvcHJpYXRlXCI6IFwiVGhlICdhdXRvY29tcGxldGUnIGF0dHJpYnV0ZSdzIHRva2VuKHMpIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUncyB0b2tlbihzKSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBhbiBpbnB1dCBmb3JtIGZpZWxkIG9mIGFueSB0eXBlXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5jb3JyZWN0XCI6IFwiVGhlICdhdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBoYXMgYW4gaW5jb3JyZWN0IHZhbHVlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuNVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiNzNmMmMyXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbmFwcHJvcHJpYXRlXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5jb3JyZWN0XCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IGF1dG9jb21wbGV0ZUF0dHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgbGV0IHRva2VucyA9IGF1dG9jb21wbGV0ZUF0dHIuc3BsaXQoL1xccysvKTtcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDAgfHwgYXV0b2NvbXBsZXRlQXR0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FjaGUgPSB7XG4gICAgICAgICAgICBcInRva2Vuc09uT2ZmXCI6IFtcIm9uXCIsIFwib2ZmXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbk9wdGlvbmFsU2VjdGlvblwiOiBcInNlY3Rpb24tXCIsXG4gICAgICAgICAgICBcInRva2Vuc09wdGlvbmFsUHVycG9zZVwiOiBbXCJzaGlwcGluZ1wiLCBcImJpbGxpbmdcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9wYXNzd29yZFwiOiBbXCJuZXctcGFzc3dvcmRcIiwgXCJjdXJyZW50LXBhc3N3b3JkXCIsIFwib25lLXRpbWUtY29kZVwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX211bHRpbGluZVwiOiBbXCJzdHJlZXQtYWRkcmVzc1wiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX21vbnRoXCI6IFtcImNjLWV4cFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX251bWVyaWNcIjogW1wiY2MtZXhwLW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHAteWVhclwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tYW1vdW50XCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LWRheVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS15ZWFyXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZVwiOiBbXCJiZGF5XCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfdXJsXCI6IFtcInVybFwiLCBcInBob3RvXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfdGV4dFwiOiBbXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJnaXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJuaWNrbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwidXNlcm5hbWVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvbi10aXRsZVwiLFxuICAgICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUxXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsNFwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJwb3N0YWwtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1mYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1jc2NcIixcbiAgICAgICAgICAgICAgICBcImNjLXR5cGVcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWN1cnJlbmN5XCIsXG4gICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIFwic2V4XCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsXCI6IFtcIm5hbWVcIixcbiAgICAgICAgICAgICAgICBcImhvbm9yaWZpYy1wcmVmaXhcIixcbiAgICAgICAgICAgICAgICBcImdpdmVuLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiZmFtaWx5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImhvbm9yaWZpYy1zdWZmaXhcIixcbiAgICAgICAgICAgICAgICBcIm5pY2tuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJ1c2VybmFtZVwiLFxuICAgICAgICAgICAgICAgIFwibmV3LXBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgXCJjdXJyZW50LXBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb24tdGl0bGVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIFwic3RyZWV0LWFkZHJlc3NcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTFcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTJcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWw0XCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsM1wiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDJcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwxXCIsXG4gICAgICAgICAgICAgICAgXCJjb3VudHJ5XCIsXG4gICAgICAgICAgICAgICAgXCJjb3VudHJ5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcInBvc3RhbC1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1naXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1hZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1udW1iZXJcIixcbiAgICAgICAgICAgICAgICBcImNjLWV4cFwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwLW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHAteWVhclwiLFxuICAgICAgICAgICAgICAgIFwiY2MtY3NjXCIsXG4gICAgICAgICAgICAgICAgXCJjYy10eXBlXCIsXG4gICAgICAgICAgICAgICAgXCJ0cmFuc2FjdGlvbi1jdXJyZW5jeVwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tYW1vdW50XCIsXG4gICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1kYXlcIixcbiAgICAgICAgICAgICAgICBcImJkYXktbW9udGhcIixcbiAgICAgICAgICAgICAgICBcImJkYXkteWVhclwiLFxuICAgICAgICAgICAgICAgIFwic2V4XCIsXG4gICAgICAgICAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgICAgICAgICBcInBob3RvXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNPcHRpb25hbEdyb3VwMlwiOiBbXCJob21lXCIsXG4gICAgICAgICAgICAgICAgXCJ3b3JrXCIsXG4gICAgICAgICAgICAgICAgXCJtb2JpbGVcIixcbiAgICAgICAgICAgICAgICBcImZheFwiLFxuICAgICAgICAgICAgICAgIFwicGFnZXJcIl0sXG5cbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3RlbFwiOiBbXCJ0ZWxcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl9lbWFpbFwiOiBbXCJlbWFpbFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3VybFwiOiBbXCJpbXBwXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDJfdGV4dFwiOiBbXCJ0ZWwtY291bnRyeS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbmF0aW9uYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1hcmVhLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWV4dGVuc2lvblwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbFwiOiBbXCJ0ZWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1jb3VudHJ5LWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1uYXRpb25hbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWFyZWEtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWwtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWwtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtZXh0ZW5zaW9uXCIsXG4gICAgICAgICAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICAgICAgICAgIFwiaW1wcFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zT3B0aW9uR3JvdXAxX3dlYmF1dGhuXCI6IFtcIndlYmF1dGhuXCJdICAgIFxuICAgICAgICB9XG4gICAgICAgIGxldCB2YWxpZF92YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGNhY2hlKVxuICAgICAgICAgICAgdmFsaWRfdmFsdWVzPXZhbGlkX3ZhbHVlcy5jb25jYXQoY2FjaGVba2V5XSk7XG4gICAgICAgIFxuICAgICAgICBsZXQgZm91bmRNYW5kYXRvcnlUb2tlbiA9IGZhbHNlO1xuICAgICAgICBsZXQgZm91bmRSZWNvZ25pemVkVG9rZW4gPSB0cnVlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRva2Vucy5ldmVyeShyID0+IHZhbGlkX3ZhbHVlcy5pbmNsdWRlcyhyKSB8fCByLnN0YXJ0c1dpdGgoY2FjaGVbJ3Rva2VuT3B0aW9uYWxTZWN0aW9uJ10pKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW5jb3JyZWN0XCIpO1xuICAgICAgICBcbiAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKSA6IFwidGV4dFwiO1xuICAgICAgICBcbiAgICAgICAgbGV0IHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IFtdO1xuICAgICAgICBsZXQgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gW107XG4gICAgICAgIGxldCB0b2tlbnNPcHRpb25hbEdyb3VwID0gW107XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgfHwgbm9kZU5hbWUgPT09IFwic2VsZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIGFjY2VwdCBhbGwgdG9rZW5zXG4gICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsO1xuICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbDtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiKVxuICAgICAgICAgICAgICAgIHRva2Vuc09wdGlvbmFsR3JvdXAgPSBjYWNoZS50b2tlbnNPcHRpb25Hcm91cDFfd2ViYXV0aG47XG5cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICB0b2tlbnNPcHRpb25hbEdyb3VwID0gY2FjaGUudG9rZW5zT3B0aW9uR3JvdXAxX3dlYmF1dGhuO1xuICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSB2YXJpb3VzICdpbnB1dCcgdHlwZXNcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuXG4gICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBjaGVjayBmb3IgaW5wdXQgdHlwZT1oaWRkZW4gZm9yIG5vdyBiYXNlZCBvbiBzY3J1bSBkaXNjdXNzaW9uXG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICBjYXNlIFwiaGlkZGVuXCI6XG4gICAgICAgICAgICAgICAgICAgIC8vIGFjY2VwdCBhbGwgdG9rZW5zXG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9hbGw7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJzZWFyY2hcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3RleHQuY29uY2F0KGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9wYXNzd29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV91cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfbnVtZXJpYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9tb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9kYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInBhc3N3b3JkXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9wYXNzd29yZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInVybFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfdXJsO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfdXJsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2VtYWlsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwidGVsXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl90ZWw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX251bWVyaWM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtb250aFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfbW9udGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9kYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCB0eXBlIGZvciB0aGlzIHJ1bGUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgY2hlY2sgZm9yIGlucHV0IHR5cGU9aGlkZGVuIGZvciBub3cgYmFzZWQgb24gc2NydW0gZGlzY3Vzc2lvblxuICAgICAgICBsZXQgYXV0b2ZpbGxNYW50bGUgPSAvKiAobm9kZU5hbWU9PT1cImlucHV0XCIgJiYgdHlwZT09PVwiaGlkZGVuXCIpID8gXCJhbmNob3JcIiA6ICovIFwiZXhwZWN0YXRpb25cIjtcblxuICAgICAgICBpZiAoYXV0b2ZpbGxNYW50bGUgPT09IFwiZXhwZWN0YXRpb25cIikge1xuICAgICAgICAgICAgLy8gY2hlY2sgb258b2ZmIGZvciBleHBlY3RhdGlvbiBtYW50bGUuXG4gICAgICAgICAgICBpZiAodG9rZW5zLmluY2x1ZGVzKFwib25cIikgfHwgdG9rZW5zLmluY2x1ZGVzKFwib2ZmXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gb258b2ZmIHNob3VsZCBiZSB0aGUgb25seSB0b2tlblxuICAgICAgICAgICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbnZhbGlkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGRldGFpbCBhdXRvZmlsbCB0b2tlbnNcbiAgICAgICAgbGV0IGN1cnJJbmRleCA9IDA7XG4gICAgICAgIGxldCBjdXJyUmVjb2duaXplZEluZGV4ID0gMDtcblxuICAgICAgICAvLyBjaGVjayBvcHRpb25hbCAnc2VjdGlvbi0qJyB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vuc1tjdXJySW5kZXhdLnN0YXJ0c1dpdGgoY2FjaGUudG9rZW5PcHRpb25hbFNlY3Rpb24pICYmXG4gICAgICAgICAgICB0b2tlbnNbY3VyckluZGV4XS5sZW5ndGggPiA4KSB7XG4gICAgICAgICAgICBjdXJySW5kZXgrKzsgLy8gY29uc3VtZSB0b2tlblxuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgJ3NoaXBwaW5nfGJpbGxpbmcnIHRva2Vuc1xuICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IGN1cnJJbmRleCAmJlxuICAgICAgICAgICAgY2FjaGUudG9rZW5zT3B0aW9uYWxQdXJwb3NlLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgY3VyckluZGV4Kys7IC8vIGNvbnN1bWUgIHRva2VuXG4gICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBlaXRoZXIgbWFuZGF0b3J5IGdyb3VwIDEgb3IgMiB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXgpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIG1hbmRhdG9yeSBncm91cCAxXG4gICAgICAgICAgICBpZiAodG9rZW5zTWFuZGF0b3J5R3JvdXAxLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGZvdW5kTWFuZGF0b3J5VG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGN1cnJJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBvcHRpb25hbCB0b2tlbnMgZm9yIGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zT3B0aW9uYWxHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMlxuICAgICAgICAgICAgICAgIGlmICh0b2tlbnNNYW5kYXRvcnlHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kTWFuZGF0b3J5VG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBlaXRoZXIgbWFuZGF0b3J5IGdyb3VwIDEgb3IgMiB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJyUmVjb2duaXplZEluZGV4KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMVxuICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9hbGwuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGZvdW5kUmVjb2duaXplZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9wdGlvbmFsIHRva2VucyBmb3IgZ3JvdXAgMlxuICAgICAgICAgICAgICAgIGlmIChjYWNoZS50b2tlbnNPcHRpb25hbEdyb3VwMi5pbmNsdWRlcyh0b2tlbnNbY3VyclJlY29nbml6ZWRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbC5pbmNsdWRlcyh0b2tlbnNbY3VyclJlY29nbml6ZWRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kUmVjb2duaXplZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXggKyBjdXJyUmVjb2duaXplZEluZGV4KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBvcHRpb25hbCB0b2tlbnMgd2ViYXV0aG5cbiAgICAgICAgICAgIGlmICh0b2tlbnNPcHRpb25hbEdyb3VwLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXggKyBjdXJyUmVjb2duaXplZEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXggJiYgdG9rZW5zT3B0aW9uYWxHcm91cC5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpXG4gICAgICAgICAgICB8fCAodG9rZW5zLmxlbmd0aCA+IGN1cnJSZWNvZ25pemVkSW5kZXggJiYgdG9rZW5zT3B0aW9uYWxHcm91cC5pbmNsdWRlcyh0b2tlbnNbY3VyclJlY29nbml6ZWRJbmRleF0pKSkge1xuICAgICAgICAgICAgY3VyckluZGV4Kys7XG4gICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IHBhc3MgaWYgd2UgaGF2ZSBzZWVuIGVpdGhlciBvZiB0aGUgbWFuZGF0b3J5IGdyb3VwcyBhbmQgYWxsIHRva2VucyBoYXZlIGJlZW4gY29uc3VtZWRcbiAgICAgICAgaWYgKGZvdW5kTWFuZGF0b3J5VG9rZW4gJiYgdG9rZW5zLmxlbmd0aCA9PT0gY3VyckluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvdW5kUmVjb2duaXplZFRva2VuICYmIHRva2Vucy5sZW5ndGggPT09IGN1cnJSZWNvZ25pemVkSW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW5jb3JyZWN0XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbmFwcHJvcHJpYXRlXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZDogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFt0eXBlPXJhZGlvXSwgZG9tOmlucHV0W3R5cGU9Y2hlY2tib3hdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfUmFkaW9DaGtJbkZpZWxkU2V0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc19Mb25lTm9ncm91cFwiOiBcInBhc3NfbG9uZW5vZ3JvdXBcIixcbiAgICAgICAgICAgIFwiUGFzc19Hcm91cGVkXCI6IFwicGFzc19ncm91cGVkXCIsXG4gICAgICAgICAgICBcIlBhc3NfUmFkaW9Ob05hbWVcIjogXCJwYXNzX3JhZGlvTm9OYW1lXCIsXG4gICAgICAgICAgICBcIkZhaWxfQ29udHJvbE5hbWVNaXNtYXRjaFwiOiBcImZhaWxfY29udHJvbG5hbWVtaXNtYXRjaFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdEdyb3VwZWRPdGhlckdyb3VwZWRcIjogXCJmYWlsX25vdGdyb3VwZWRvdGhlcmdyb3VwZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJOb3RHcm91cGVkXCI6IFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90U2FtZUdyb3VwXCI6IFwiZmFpbF9ub3RzYW1lZ3JvdXBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX0xvbmVDaGVja2JveFwiOiBcInBvdGVudGlhbF9sb25lY2hlY2tib3hcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX1VubmFtZWRDaGVja2JveFwiOiBcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfbG9uZW5vZ3JvdXBcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX2dyb3VwZWRcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX3JhZGlvbm9uYW1lXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb250cm9sbmFtZW1pc21hdGNoXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3Rncm91cGVkb3RoZXJncm91cGVkXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3RzYW1lZ3JvdXBcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbG9uZWNoZWNrYm94XCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3VubmFtZWRjaGVja2JveFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUmVsYXRlZCBzZXRzIG9mIHJhZGlvIGJ1dHRvbnMgb3IgY2hlY2tib3hlcyBzaG91bGQgYmUgcHJvZ3JhbW1hdGljYWxseSBncm91cGVkXCIsXG4gICAgICAgICAgICBcInBhc3NfbG9uZW5vZ3JvdXBcIjogXCJ7MH0gZ3JvdXBpbmcgbm90IHJlcXVpcmVkIGZvciBhIGNvbnRyb2wgb2YgdGhpcyB0eXBlXCIsXG4gICAgICAgICAgICBcInBhc3NfZ3JvdXBlZFwiOiBcInswfSBpbnB1dCBpcyBncm91cGVkIHdpdGggb3RoZXIgcmVsYXRlZCBjb250cm9scyB3aXRoIHRoZSBzYW1lIG5hbWVcIixcbiAgICAgICAgICAgIFwicGFzc19yYWRpb25vbmFtZVwiOiBcIlJhZGlvIGlucHV0IGlzIG5vdCBncm91cGVkLCBidXQgcGFzc2VzIGJlY2F1c2UgaXQgaGFzIG5vIG5hbWUgdG8gZ3JvdXAgd2l0aCBvdGhlciByYWRpbyBpbnB1dHNcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb250cm9sbmFtZW1pc21hdGNoXCI6IFwiezB9IGlucHV0IGZvdW5kIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUsIFxcXCJ7Mn1cXFwiIGFzIGEgezF9IGlucHV0XCIsXG4gICAgICAgICAgICBcImZhaWxfbm90Z3JvdXBlZG90aGVyZ3JvdXBlZFwiOiBcInswfSBpbnB1dCBpcyBub3QgaW4gdGhlIGdyb3VwIHdpdGggYW5vdGhlciB7MH0gd2l0aCB0aGUgbmFtZSBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJmYWlsX25vdGdyb3VwZWRvdGhlcm5vdGdyb3VwZWRcIjogXCJ7MH0gaW5wdXQgYW5kIG90aGVycyB3aXRoIHRoZSBuYW1lIFxcXCJ7MX1cXFwiIGFyZSBub3QgZ3JvdXBlZCB0b2dldGhlclwiLFxuICAgICAgICAgICAgXCJmYWlsX25vdHNhbWVncm91cFwiOiBcInswfSBpbnB1dCBpcyBpbiBhIGRpZmZlcmVudCBncm91cCB0aGFuIGFub3RoZXIgezB9IHdpdGggdGhlIG5hbWUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xvbmVjaGVja2JveFwiOiBcIlZlcmlmeSB0aGF0IHRoaXMgdW5ncm91cGVkIGNoZWNrYm94IGlucHV0IGlzIG5vdCByZWxhdGVkIHRvIG90aGVyIGNoZWNrYm94ZXNcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3VubmFtZWRjaGVja2JveFwiOiBcIlZlcmlmeSB0aGF0IHRoaXMgdW4tbmFtZWQsIHVuZ3JvdXBlZCBjaGVja2JveCBpbnB1dCBpcyBub3QgcmVsYXRlZCB0byBvdGhlciBjaGVja2JveGVzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGdldEdyb3VwID0gKGU6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGUsIFwiZmllbGRzZXRcIilcbiAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwicmFkaW9ncm91cFwiKVxuICAgICAgICAgICAgICAgIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJncm91cFwiKVxuICAgICAgICAgICAgICAgIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJncmlkXCIpXG4gICAgICAgICAgICAgICAgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShlLCBcInRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKCFyZXRWYWwpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGUsIFwidGFibGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHJldFZhbCAmJiAhVGFibGVVdGlsLmlzRGF0YVRhYmxlKHJldFZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzIGFyZSBpbiBzY29wZVxuICAgICAgICBsZXQgY3R4VHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIERldGVybWluZSB3aGljaCBmb3JtIHdlJ3JlIGluIChpZiBhbnkpIHRvIGRldGVybWluZSBvdXIgc2NvcGVcbiAgICAgICAgbGV0IGN0eEZvcm0gPSBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImZvcm1cIilcbiAgICAgICAgICAgIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiaHRtbFwiKVxuICAgICAgICAgICAgfHwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gR2V0IGRhdGEgYWJvdXQgYWxsIG9mIHRoZSB2aXNpYmxlIGNoZWNrYm94ZXMgYW5kIHJhZGlvcyBpbiB0aGUgc2NvcGUgb2YgdGhpcyBmb3JtXG4gICAgICAgIC8vIGFuZCBjYWNoZSBpdCBmb3IgYWxsIG9mIHRoZSBvdGhlciBpbnB1dHMgaW4gdGhpcyBzY29wZVxuICAgICAgICBsZXQgZm9ybUNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKGN0eEZvcm0sIFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWZvcm1DYWNoZSkge1xuICAgICAgICAgICAgZm9ybUNhY2hlID0ge1xuICAgICAgICAgICAgICAgIGNoZWNrYm94QnlOYW1lOiB7fSxcbiAgICAgICAgICAgICAgICByYWRpb3NCeU5hbWU6IHt9LFxuICAgICAgICAgICAgICAgIG5hbWVUb0dyb3VwOiB7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG51bUNoZWNrYm94ZXM6IDAsXG4gICAgICAgICAgICAgICAgbnVtUmFkaW9zOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSBjaGVja2JveGVzIGluIHRoZSBmb3JtIG9yIGJvZHkgKGJ1dCBub3QgbmVzdGVkIGluIHNvbWV0aGluZyBlbHNlIGFuZCBub3QgaGlkZGVuKVxuICAgICAgICAgICAgLy8gQW5kIGdldCBhIG1hcHBpbmcgb2YgdGhlc2UgY2hlY2tib3hlcyB0b1xuICAgICAgICAgICAgbGV0IGNXYWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGN0eEZvcm0sIGZhbHNlLCBjdHhGb3JtLCB0cnVlKTtcbiAgICAgICAgICAgIGxldCBjaGVja2JveFEgPSBbXTtcbiAgICAgICAgICAgIGxldCByYWRpb3NRID0gW107XG4gICAgICAgICAgICB3aGlsZSAoY1dhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjV2Fsa2VyLmJFbmRUYWdcbiAgICAgICAgICAgICAgICAgICAgJiYgY1dhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxXG4gICAgICAgICAgICAgICAgICAgICYmIGNXYWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGNXYWxrZXIubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSAoY1dhbGtlci5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94US5wdXNoKGNXYWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByYWRpb3NRLnB1c2goY1dhbGtlci5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGxldCBjaGVja2JveFEgPSBjdHhGb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFt0eXBlPWNoZWNrYm94XVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNoZWNrYm94US5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSBjaGVja2JveFFbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoY2IsIFwiZm9ybVwiKVxuICAgICAgICAgICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImh0bWxcIilcbiAgICAgICAgICAgICAgICAgICAgfHwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpID09PSBjdHhGb3JtXG4gICAgICAgICAgICAgICAgICAgICYmICFDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY2IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjYi5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIChmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbbmFtZV0gPSBmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbbmFtZV0gfHwgW10pLnB1c2goY2IpO1xuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmFtZVRvR3JvdXBbbmFtZV0gPSBmb3JtQ2FjaGUubmFtZVRvR3JvdXBbbmFtZV0gfHwgZ2V0R3JvdXAoY2IpO1xuICAgICAgICAgICAgICAgICAgICArK2Zvcm1DYWNoZS5udW1DaGVja2JveGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHJhZGlvcyBpbiB0aGUgZm9ybSBvciBib2R5IChidXQgbm90IG5lc3RlZCBpbiBzb21ldGhpbmcgZWxzZSBhbmQgbm90IGhpZGRlbilcbiAgICAgICAgICAgIC8vIGxldCByYWRpb3NRID0gY3R4Rm9ybS5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbdHlwZT1yYWRpb11cIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCByYWRpb3NRLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gcmFkaW9zUVtpZHhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhZEN0eCA9IChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHIsIFwiZm9ybVwiKVxuICAgICAgICAgICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImh0bWxcIilcbiAgICAgICAgICAgICAgICAgICAgfHwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChyYWRDdHggPT09IGN0eEZvcm1cbiAgICAgICAgICAgICAgICAgICAgJiYgIUNvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gci5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIChmb3JtQ2FjaGUucmFkaW9zQnlOYW1lW25hbWVdID0gZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtuYW1lXSB8fCBbXSkucHVzaChyKTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdID0gZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdIHx8IGdldEdyb3VwKHIpO1xuICAgICAgICAgICAgICAgICAgICArK2Zvcm1DYWNoZS5udW1SYWRpb3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGN0eEZvcm0sIFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsIGZvcm1DYWNoZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLy8vLy8vLy8vLy8vIENhbGN1bGF0ZWQgZXZlcnl0aGluZywgbm93IGNoZWNrIHRoZSB2YXJpb3VzIGNhc2VzXG5cbiAgICAgICAgY29uc3QgY3R4TmFtZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgIGNvbnN0IGN0eEdyb3VwID0gZ2V0R3JvdXAocnVsZUNvbnRleHQpO1xuICAgICAgICBjdHhUeXBlID0gY3R4VHlwZSA9PT0gXCJyYWRpb1wiID8gXCJSYWRpb1wiIDogXCJDaGVja2JveFwiO1xuXG4gICAgICAgIGlmICghY3R4TmFtZSB8fCBjdHhOYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBwcm9jZXNzIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIGlzIG5vdCBuYW1lZFxuICAgICAgICAgICAgaWYgKGN0eFR5cGUgPT09IFwiUmFkaW9cIikge1xuICAgICAgICAgICAgICAgIC8vIFJhZGlvcyB3aXRob3V0IG5hbWVzIGRvbid0IGFjdCBsaWtlIGdyb3Vwcywgc28gZG9uJ3QgZW5mb3JjZSBncm91cGluZ1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX3JhZGlvbm9uYW1lXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19ncm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIGFuIHVubmFtZWQgY2hlY2tib3hcbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbXCJcIl0gfHwgW10pLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3VubmFtZWRjaGVja2JveFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19sb25lbm9ncm91cFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19ncm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ29uc2lkZXJpbmcgYSBuYW1lZCBjaGVja2JveFxuICAgICAgICAgICAgY29uc3QgbnVtUmFkaW9zV2l0aE5hbWUgPSAoZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtjdHhOYW1lXSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID0gKGZvcm1DYWNoZS5jaGVja2JveEJ5TmFtZVtjdHhOYW1lXSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgLy8gQ2FwaXRhbGl6ZSB0aGUgaW5wdXQgdHlwZSBmb3IgbWVzc2FnZXNcbiAgICAgICAgICAgIGlmIChudW1SYWRpb3NXaXRoTmFtZSA+IDAgJiYgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBuYW1pbmcgbWlzbWF0Y2ggYmV0d2VlbiBkaWZmZXJlbnQgY29udHJvbHNcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2NvbnRyb2xuYW1lbWlzbWF0Y2hcIiwgW2N0eFR5cGUsIGN0eFR5cGUgPT09IFwiY2hlY2tib3hcIiA/IFwicmFkaW9cIiA6IFwiY2hlY2tib3hcIiwgY3R4TmFtZV0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHhUeXBlID09PSBcIlJhZGlvXCIgJiYgKGZvcm1DYWNoZS5udW1SYWRpb3MgPT09IDEgfHwgbnVtUmFkaW9zV2l0aE5hbWUgPT09IDEpXG4gICAgICAgICAgICAgICAgfHwgY3R4VHlwZSA9PT0gXCJDaGVja2JveFwiICYmIGZvcm1DYWNoZS5udW1DaGVja2JveGVzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGxvbmUgY29udHJvbCAoZWl0aGVyIG9ubHkgY29udHJvbCBvZiB0aGlzIHR5cGUgb24gdGhlIHBhZ2UsIG9yIGEgcmFkaW8gYnV0dG9uIHdpdGhvdXQgYW55IG90aGVycyBieSB0aGF0IG5hbWUpXG4gICAgICAgICAgICAgICAgLy8gV2UgcGFzcyB0aGlzIGNvbnRyb2wgaW4gYWxsIGNhc2VzXG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfbG9uZW5vZ3JvdXBcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2dyb3VwZWRcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0eFR5cGUgPT09IFwiQ2hlY2tib3hcIiAmJiBmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcyA+IDEgJiYgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBvbmx5IG9uZSBjaGVja2JveCB3aXRoIHRoaXMgbmFtZSwgYnV0IHRoZXJlIGFyZSBvdGhlciBjaGVja2JveGVzIGluIHRoZSBmb3JtLlxuICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBncm91cGVkLCBhc2sgdGhlbSB0byBleGFtaW5lIGl0XG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xvbmVjaGVja2JveFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugc2hhcmUgYSBuYW1lIHdpdGggYW5vdGhlciBzaW1pbGFyIGNvbnRyb2wuIEFyZSB3ZSBncm91cGVkIHRvZ2V0aGVyP1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybUNhY2hlLm5hbWVUb0dyb3VwW2N0eE5hbWVdICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgZ3JvdXBlZCwgYnV0IHNvbWUgY29udHJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgaW4gYSBncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub3Rncm91cGVkb3RoZXJncm91cGVkXCIsIFtjdHhUeXBlLCBjdHhOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb25lIG9mIHVzIGFyZSBncm91cGVkXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vdGdyb3VwZWRvdGhlcm5vdGdyb3VwZWRcIiwgW2N0eFR5cGUsIGN0eE5hbWVdKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtQ2FjaGUubmFtZVRvR3JvdXBbY3R4TmFtZV0gIT09IGN0eEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBpbiB0aGUgbWFpbiBncm91cCB3aXRoIHRoZSBvdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub3RzYW1lZ3JvdXBcIiwgW2N0eFR5cGUsIGN0eE5hbWVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBhbGwgZ3JvdXBlZCB1cCFcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19ncm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfZmllbGRzX2dyb3VwZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfZmllbGRzX2dyb3VwZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dCwgZG9tOnRleHRhcmVhLCBkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfSW5GaWVsZFNldFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9maWVsZHNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaW5wdXRfZmllbGRzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2ZpZWxkc19ncm91cGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJVc2UgdGhlIDxmaWVsZHNldD4gZWxlbWVudCB0byBncm91cCBsb2dpY2FsbHkgcmVsYXRlZCBpbnB1dCBlbGVtZW50c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkdyb3VwcyBvZiBsb2dpY2FsbHkgcmVsYXRlZCBpbnB1dCBlbGVtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIHdpdGhpbiBhIDxmaWVsZHNldD4gZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGZvciBvdGhlciBpbnB1dCB0eXBlcyBvciBpZiB3ZSdyZSBpbiBhIGZpZWxkc2V0XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJmaWxlXCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImZpZWxkc2V0XCIpICE9IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG5cbiAgICAgICAgLy8gTm8gZmllbGRzZXQgLSBzZWUgaWYgdGhpcyBpbnB1dCBpcyBhbGwgYnkgaXRzZWxmIC0gbm8gbmVlZCB0byBncm91cCBzaW5nbGUgaW5wdXRzXG4gICAgICAgIGxldCBwYXJlbnQgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJmb3JtXCIsIFwiYm9keVwiXSk7XG4gICAgICAgIGxldCBjaGVja1R5cGVzID0gW1wiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiXTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY2hlY2tUeXBlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IGNvbnRyb2xzID0gcGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGNoZWNrVHlwZXNbaV0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IHBhc3NlZCAmJiBqIDwgY29udHJvbHMubGVuZ3RoOyArK2opIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY29udHJvbHNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0ZXh0YXJlYXMgYW5kIHNlbGVjdHMgd2lsbCBiZSBjYWxsZWQgdHlwZT0ndGV4dCdcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGNvbnRyb2xzW2pdLmhhc0F0dHJpYnV0ZShcInR5cGVcIikgPyBjb250cm9sc1tqXS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCkgOiBcInRleHRcIjtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGZhaWwgaWYgdGhpcyBpcyBhbm90aGVyIGNvbnRyb2wgaW4gdGhlIGZvcm0gYW5kIGl0cyB0eXBlIGlzIGFub3RoZXIgdGV4dC1saWtlIGlucHV0XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gY29udHJvbHNbal0gPT0gcnVsZUNvbnRleHQgfHwgKHR5cGUgIT0gXCJ0ZXh0XCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIgJiYgdHlwZSAhPSBcImZpbGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9oYXNwb3B1cF9jb25mbGljdDogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0W2xpc3RdW2FyaWEtaGFzcG9wdXBdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJpbnB1dF9oYXNwb3B1cF9pbnZhbGlkXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfdHlwZV9taXN1c2VcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJwb3RlbnRpYWxfbWlzdXNlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCI6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbWlzdXNlXCI6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbGlzdF9ub3RleGlzdFwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX2xpc3RfdHlwZVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX2xpc3RfZWxlbVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCI8aW5wdXQ+IGVsZW1lbnQgd2l0aCBhICdsaXN0JyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCB1c2UgYW4gZXhwbGljaXQgJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCB3aXRoIGEgJ2xpc3QnIGF0dHJpYnV0ZSBkb2VzIG5vdCB1c2UgYW4gZXhwbGljaXQgJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfdHlwZV9taXN1c2VcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IHdpdGggdHlwZSBcXFwiezB9XFxcIiBhbmQgJ2xpc3QnIGF0dHJpYnV0ZSB1c2VzIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX21pc3VzZVwiOiBcIlRoZSA8aW5wdXQ+IGVsZW1lbnQgd2l0aCBhIG1pc3Npbmcgb3IgaW52YWxpZCB0eXBlIGFuZCAnbGlzdCcgYXR0cmlidXRlIHVzZXMgYW4gZXhwbGljaXQgJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbGlzdF9ub3RleGlzdFwiOiBcIlRoZSBsaXN0IGF0dHJpYnV0ZSBmb3IgdGhlIDxpbnB1dD4gZWxlbWVudCBpcyBpbnZhbGlkXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X3R5cGVcIjogXCJUaGUgbGlzdCBhdHRyaWJ1dGUgZm9yIHRoZSA8aW5wdXQ+IGVsZW1lbnQgd2l0aCB0aGUgdHlwZSBcXFwiezB9XFxcIiBpcyBpbnZhbGlkXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X2VsZW1cIjogXCJUaGUgbGlzdCBhdHRyaWJ1dGUgZm9yIHRoZSA8aW5wdXQ+IGVsZW1lbnQgZG9lcyBub3QgcmVmZXJlbmNlIGEgZGF0YWxpc3QgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgaWYgdGhlIGZpZWxkc2V0IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIC8vIGxldCBcImFyaWFfcm9sZV92YWxpZFwiIHRvIGhhbmRsZSBpbnZhbGlkIHJvbGUuIE9ubHkgYWxsb3dlZCByb2xlIGlzIGNvbWJvYm94IHdoaWNoIGlzIGltcGxpY2l0LiBcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDAgJiYgIXJvbGVzLmluY2x1ZGVzKCdjb21ib2JveCcpKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgICAgICAgIFxuXG4gICAgICAgIC8vdHJpZ2dlcmluZyBpbnB1dCB0eXBlczogdGV4dCwgc2VhcmNoLCB0ZWwsIHVybCwgZW1haWwsIG9yIG1pc3Npbmcgb3IgaW52YWxpZCBcbiAgICAgICAgbGV0IHllc1R5cGVzID0gW1widGV4dFwiLCBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsIFwiZGF0ZVwiLCBcIm1vbnRoXCIsIFwid2Vla1wiLCBcInRpbWVcIiwgXCJkYXRldGltZS1sb2NhbFwiLCBcIm51bWJlclwiLCBcInJhbmdlXCIsIFwiY29sb3JcIl07XG4gICAgICAgIGxldCBub1R5cGVzID0gW1wiZmlsZVwiLCBcInBhc3N3b3JkXCIsIFwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLCBcInN1Ym1pdFwiLCBcInJlc2V0XCIsIFwiaW1hZ2VcIiwgXCJoaWRkZW5cIiwgXCJidXR0b25cIl07XG5cbiAgICAgICAgbGV0IGF0dHJWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgIC8vbWlzc2luZyBpbnB1dCB0eXBlIGZvciBsaXN0IGJ1dCB3aXRoIGFyaWFfaGFzX3BvcHVwXG4gICAgICAgIGlmICghYXR0clZhbHVlIHx8IGF0dHJWYWx1ZS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbWlzdXNlXCIpO1xuXG4gICAgICAgIGF0dHJWYWx1ZSA9IGF0dHJWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy9pbnZhbGlkIGlucHV0IHR5cGVzIGZvciBsaXN0IGJ1dCB3aXRoIGFyaWFfaGFzX3BvcHVwXG4gICAgICAgIGlmICgheWVzVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSAmJiAhbm9UeXBlcy5pbmNsdWRlcyhhdHRyVmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbWlzdXNlXCIpO1xuXG4gICAgICAgIC8vIHRoZSBsaXN0IGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB3cm9uZyBpbnB1dCB0eXBlXG4gICAgICAgIGlmIChhdHRyVmFsdWUgJiYgbm9UeXBlcy5pbmNsdWRlcyhhdHRyVmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbnZhbGlkX2xpc3RfdHlwZVwiKTtcblxuICAgICAgICBsZXQgbGlzdCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxpc3RcIik7XG4gICAgICAgIC8vIHRoZSBsaXN0IGF0dHJpYnV0ZSBpcyBibGFua1xuICAgICAgICBpZiAoIWxpc3QgfHwgbGlzdC50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbGlzdF9ub3RleGlzdFwiKTtcblxuICAgICAgICBsZXQgbGlzdEVsZW0gPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxpc3QpO1xuICAgICAgICAvLyB0aGUgbGlzdCBlbGVtZW50IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgaWYgKCFsaXN0RWxlbSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcInBvdGVudGlhbF9saXN0X25vdGV4aXN0XCIpO1xuXG4gICAgICAgIC8vIHRoZSBsaXN0IGVsZW1lbnQgaXMgbm90IGEgZGF0YWxpc3QgZWxlbWVudFxuICAgICAgICBpZiAobGlzdEVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ2RhdGFsaXN0JylcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZF9saXN0X2VsZW1cIik7XG5cbiAgICAgICAgLy8gdmFsaWQgaW5wdXQgdHlwZXMgZm9yIGxpc3QgYnV0IHdpdGggYXJpYV9oYXNfcG9wdXAgICAgXG4gICAgICAgIGlmICh5ZXNUeXBlcy5pbmNsdWRlcyhhdHRyVmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdHlwZV9taXN1c2VcIiwgW2F0dHJWYWx1ZV0pO1xuICAgICAgICBcbiAgICAgICAgLy8gc2hvdWxkbid0IGdldCBoZXJlIFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfbGFiZWxfYWZ0ZXI6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfbGFiZWxfYWZ0ZXJcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0xhYmVsQWZ0ZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9hZnRlci5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImlucHV0X2xhYmVsX2FmdGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9sYWJlbF9hZnRlci5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbiBpcyBuZXN0ZWQgaW4gbGFiZWwsIHNvIGxhYmVsIGlzIG5vdCBhZnRlciB0aGUgaW5wdXQgY29udHJvbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJMYWJlbCB0ZXh0IGlzIGxvY2F0ZWQgYmVmb3JlIGl0cyBhc3NvY2lhdGVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ2hlY2tib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyBtdXN0IGhhdmUgYSBsYWJlbCBhZnRlciB0aGUgaW5wdXQgY29udHJvbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSlcbiAgICAgICAgICAgIHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0eXBlICE9IFwiY2hlY2tib3hcIiAmJiB0eXBlICE9IFwicmFkaW9cIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgb25seSB0aGUgbm9uLWhpZGRlbiBsYWJlbHMgZm9yIGVsZW1lbnRcbiAgICAgICAgbGV0IGxhYmVsRWxlbSA9IENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgaWYgKGxhYmVsRWxlbSA9PT0gbnVsbCB8fCAhQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgLy8gRHVlIHRvIGRlcGVuZGVuY3ksIGxhYmVsIG11c3QgYmUgZG9uZSB2aWEgdGl0bGUgLSB0aGlzIHJ1bGUgZG9lc24ndCBhcHBseVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlID0gQ29tbW9uVXRpbC5jb21wYXJlTm9kZU9yZGVyKGxhYmVsRWxlbSwgcnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAodmFsdWUgPT09IC0yKSB7XG4gICAgICAgICAgICAvLyBpbnB1dCBuZXN0ZWQgaW4gbGFiZWxcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IHdhbGtOb2RlID0gbmV3IERPTVdhbGtlcihsYWJlbEVsZW0pO1xuICAgICAgICAgICAgd2Fsa05vZGUubm9kZSA9IHJ1bGVDb250ZXh0O1xuICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgd2Fsa05vZGUubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgod2Fsa05vZGUubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcIiN0ZXh0XCIgJiYgd2Fsa05vZGUubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHx8ICh3YWxrTm9kZS5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3BhblwiICYmIHdhbGtOb2RlLm5vZGUudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gSW5wdXQgbmVzdGVkIGluIGxhYmVsIGFuZCB0ZXh0IGJlZm9yZSBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gbGFiZWwgaXMgYmVmb3JlIGlucHV0XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfbGFiZWxfYmVmb3JlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX2JlZm9yZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0LCBkb206dGV4dGFyZWEsIGRvbTpzZWxlY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9MYWJlbEJlZm9yZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX2JlZm9yZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRleHQgaW5wdXQgaXMgbmVzdGVkIGluIGxhYmVsIHN1Y2ggdGhhdCBpbnB1dCBwcmVjZWRlcyB0aGUgbGFiZWwgdGV4dFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJMYWJlbCB0ZXh0IGlzIGxvY2F0ZWQgYWZ0ZXIgaXRzIGFzc29jaWF0ZWQgdGV4dCBpbnB1dCBvciA8c2VsZWN0PiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGV4dCBpbnB1dHMgYW5kIDxzZWxlY3Q+IGVsZW1lbnRzIG11c3QgaGF2ZSBhIGxhYmVsIGJlZm9yZSB0aGUgaW5wdXQgY29udHJvbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbnB1dFwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGUgIT0gXCJ0ZXh0XCIgJiYgdHlwZSAhPSBcImZpbGVcIiAmJiB0eXBlICE9IFwicGFzc3dvcmRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IG9ubHkgdGhlIG5vbi1oaWRkZW4gbGFiZWxzIGZvciBlbGVtZW50XG4gICAgICAgIGxldCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAobGFiZWxFbGVtID09IG51bGwgfHwgIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGxhYmVsRWxlbSkpIHtcbiAgICAgICAgICAgIC8vIER1ZSB0byBkZXBlbmRlbmN5LCBsYWJlbCBtdXN0IGJlIGRvbmUgdmlhIHRpdGxlIC0gdGhpcyBydWxlIGRvZXNuJ3QgYXBwbHlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlID0gQ29tbW9uVXRpbC5jb21wYXJlTm9kZU9yZGVyKGxhYmVsRWxlbSwgcnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAodmFsdWUgPT09IC0yKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgaWYgbm8gbGFiZWwgb3IgdGhlIGNvbnRlbnQgZm9yIHRoZSBsYWJlbCBpcyBvbmx5IGZyb20gdGhlIG5lc3RlZCBpbnB1dCBjb250cm9sIFxuICAgICAgICAgICAgbGV0IHRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmIENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCkgPT09IHRleHQudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gRHVlIHRvIGRlcGVuZGVuY3ksIGxhYmVsIG11c3QgYmUgZG9uZSB2aWEgdGl0bGUgLSB0aGlzIHJ1bGUgZG9lc24ndCBhcHBseVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbnB1dCBuZXN0ZWQgaW4gbGFiZWxcbiAgICAgICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCB3YWxrTm9kZSA9IHJ1bGVDb250ZXh0LnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gKCh3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiI3RleHRcIiAmJiB3YWxrTm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHx8ICh3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwic3BhblwiICYmIHdhbGtOb2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIElucHV0IG5lc3RlZCBpbiBsYWJlbCBhbmQgdGV4dCBhZnRlciBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIGxhYmVsIGlzIGFmdGVyIGlucHV0XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhdmVuJ3QgcmV0dXJuZWQgeWV0LCB0aGVuIEkgcGFzc1xuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9sYWJlbF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6Y2hlY2tib3gsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOnJhZGlvLGFyaWE6c2VhcmNoYm94LGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnN3aXRjaCxhcmlhOnRleHRib3gsYXJpYTpwcm9ncmVzc2Jhcixkb206aW5wdXRbdHlwZT1maWxlXSxkb206b3V0cHV0LGRvbTptZXRlcixkb206aW5wdXRbdHlwZT1wYXNzd29yZF1cIixcbiAgICAvL2RlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3JlZHVuZGFudFwiLCBcImFyaWFfcm9sZV92YWxpZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9FeHBsaWNpdExhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfbGFiZWxfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRm9ybSBjb250cm9sIGVsZW1lbnQgPHswfT4gaGFzIG5vIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRm9ybSBjb250cm9sIHdpdGggXFxcInswfVxcXCIgcm9sZSBoYXMgbm8gYXNzb2NpYXRlZCBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZm9ybSBjb250cm9sIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgLyogcmVtb3ZlIDEuMS4xIG1hcHBpbmcsIGtlZXAgNC4xLjIgKi9cbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBodHRwczovL2dpdGh1Yi5jb20vSUJNYS9lcXVhbC1hY2Nlc3MvaXNzdWVzLzc1NlxuICAgIGFjdDogW1wiOTdhNGUxXCIsIFwiZTA4NmU1XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgaW5wdXQgdHlwZVxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImJ1dHRvblwiIHx8IEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJidXR0b25cIikpIHtcbiAgICAgICAgICAgIHR5cGUgPSBcImJ1dHRvbmVsZW1cIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJpbnB1dFwiICYmIHR5cGUgPT0gXCJcIikge1xuICAgICAgICAgICAgdHlwZSA9IFwidGV4dFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZWQgYnkgaW5wdXRfbGFiZWxfZXhpc3RzSW1hZ2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4vKiogXG4gICAgICAgIGxldCBQT0YgPSAtMTtcbiAgICAgICAgbGV0IHRleHRUeXBlcyA9IENvbW1vblV0aWwuaW5wdXRfdGV4dF90eXBlcztcbiAgICAgICAgbGV0IGJ1dHRvblR5cGVzID0gQ29tbW9uVXRpbC5mb3JtX2J1dHRvbl90eXBlczsgIFxuICAgICAgIFxuICAgICAgICBsZXQgYnV0dG9uVHlwZXNXaXRoRGVmYXVsdHMgPSBbXCJyZXNldFwiLCBcInN1Ym1pdFwiXTsgLy8gJ3N1Ym1pdCcgYW5kICdyZXNldCcgaGF2ZSB2aXNpYmxlIGRlZmF1bHRzLlxuICAgICAgICBpZiAodGV4dFR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSB7IC8vIElmIHR5cGUgaXMgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudHMsIGluIHRoZSBjYXNlIHRoYXQgYSBsYWJlbCBpcyBoaWRkZW4gdGhlbiBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgICAgICAgLy8gTm90ZTogbGFiZWxbZm9yXSBkb2VzIG5vdCB3b3JrIGZvciBBUklBIGRlZmluZWQgaW5wdXRzXG4gICAgICAgICAgICBsZXQgbGFiZWxFbGVtID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSA/IG51bGwgOiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICBsZXQgaGFzTGFiZWxFbGVtQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGxhYmVsRWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpIHx8IFwiXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFiZWxFbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxsZWRCeUVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChsYWJlbEVsZW0sIGxhYmVsRWxlbS5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsbGVkQnlFbGVtICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsbGVkQnlFbGVtLCBsYWJlbEVsZW0pICYmIENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KGxhYmVsbGVkQnlFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzTGFiZWxFbGVtQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXNzZWQgPSAoISFsYWJlbEVsZW0gJiYgaGFzTGFiZWxFbGVtQ29udGVudCkgfHxcbiAgICAgICAgICAgICAgICAoIWxhYmVsRWxlbSAmJiBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwicGxhY2Vob2xkZXJcIikpIHx8XG4gICAgICAgICAgICAgICAgQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMCB8fCBDb21tb25VdGlsLmhhc0ltcGxpY2l0TGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMuaW5kZXhPZih0eXBlKTtcbiAgICAgICAgICAgIFxuICAgICAgICB9IGVsc2UgaWYgKGJ1dHRvblR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSB7IC8vIElmIHR5cGUgaXMgYSBidXR0b25cbiAgICAgICAgICAgIGlmIChidXR0b25UeXBlc1dpdGhEZWZhdWx0cy5pbmRleE9mKHR5cGUpICE9PSAtMSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICAvLyAnc3VibWl0JyBhbmQgJ3Jlc2V0JyBoYXZlIHZpc2libGUgZGVmYXVsdHMgc28gcGFzcyBpZiB0aGVyZSBpcyBubyAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidmFsdWVcIikgfHwgQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmluZGV4T2YodHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImJ1dHRvbmVsZW1cIikge1xuICAgICAgICAgICAgLy8gSWYgSSBhbSBhbiBpbWFnZSBhbmQgSSBoYXZlIGFsdCB0ZXh0IC0gYWNjZXNzaWJpbGl0eS13ZWItZW5naW5lIzI2OVxuICAgICAgICAgICAgbGV0IGJBbHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgaWYgKGFsdC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJBbHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBiQWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpIHx8IEFyaWFVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgYkFsdCB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5sZW5ndGggKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBhIG5hdGl2ZSBidXR0b24gaXMgbGFiZWxsZWRcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmhhc0ltcGxpY2l0TGFiZWwocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbCAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbCkpXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7ICAgIFxuICAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBScHRfQXJpYV9WYWxpZElkUmVmIGRldGVybWluZXMgaWYgdGhlIGFyaWEtbGFiZWxsZWRieSBpZCBwb2ludHMgdG8gYSB2YWxpZCBlbGVtZW50XG4gICAgICAgIGlmICghcGFzc2VkICYmIChidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSkpIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSA9PSBcImRpaml0T2ZmU2NyZWVuXCIgJiYgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpLmhhc0F0dHJpYnV0ZShcIndpZGdldGlkXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgZGlqaXQgYnV0dG9uc1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElkID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpLmdldEF0dHJpYnV0ZShcIndpZGdldGlkXCIpICsgXCJfbGFiZWxcIjtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgbGFiZWxJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWwpO1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIEkgZmFpbGVkIGFib3ZlIGFsc29cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgNCArIGJ1dHRvblR5cGVzLmluZGV4T2YodHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJvcHRncm91cFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxhYmVsXCIpO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBub2RlTmFtZSA9PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICAvLyBJcyBhIG5vbi1lbXB0eSB2YWx1ZSBhdHRyaWJ1dGUgYWxzbyBlbm91Z2ggZm9yIGFuIG9wdGlvbiBlbGVtZW50P1xuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsYWJlbFwiKSB8fCBydWxlQ29udGV4dC5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5sZW5ndGggKyAzO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgaWYgKCFwYXNzZWQpXG4gICAgICAgICAgICBwYXNzZWQgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPiAwIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBhcmlhIHJvbGUgdG8gZmlndXJlIG91dCBpZiB0aGUgYWNjZXNzaWJsZSBuYW1lIGNhbiBiZSBmcm9tIGNvbnRlbnQgXG4gICAgICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIC8vd2hlbiBtdWx0aXBsZSByb2xlcyBzcGVjaWZpZWQsIG9ubHkgdGhlIGZpcnN0IHZhbGlkIHJvbGUgKGd1YXJhbnRlZWQgYnkgZGVwZW5kZW5jaWVzKSBpcyBhcHBsaWVkLCBhbmQgdGhlIG90aGVycyBqdXN0IGFzIGZhbGxiYWNrc1xuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV0gJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXS5uYW1lRnJvbSAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbMF1dLm5hbWVGcm9tLmluY2x1ZGVzKFwiY29udGVudHNcIikpXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICB9XG4qL1xuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgcGFzc2VkID0gcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfbGFiZWxfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpjaGVja2JveCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnVpdGVtY2hlY2tib3gsYXJpYTptZW51aXRlbXJhZGlvLGFyaWE6cmFkaW8sYXJpYTpzZWFyY2hib3gsYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6c3dpdGNoLGFyaWE6dGV4dGJveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiaW5wdXRfbGFiZWxfZXhpc3RzXCJdLCBcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9WaXNpYmxlTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX25vX2xhYmVsXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9wbGFjZWhvbGRlcl9vbmx5XCI6IFwicG90ZW50aWFsX3BsYWNlaG9sZGVyX29ubHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaW5wdXRfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9wbGFjZWhvbGRlcl9vbmx5XCI6IFwiaW5wdXRfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ub19sYWJlbFwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGlucHV0IGVsZW1lbnQgaGFzIGFuIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiOiBcIlRoZSDigJhwbGFjZWhvbGRlcuKAmSBpcyB0aGUgb25seSB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ub19sYWJlbFwiOiBcIlRoZSBpbnB1dCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gaW5wdXQgZWxlbWVudCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCB2aXNpYmxlIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjUuM1wiLCBcIjMuMy4yXCJdLCAvL21hcCB0byBib3RoIHJlcXVpcmVtZW50cyBpbiBoZWxwXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlmIGEgY29udHJvbCBpcyBpbiBhIHRhYmxlIGNlbGwsIHRoZSBjb2wgaGVhZGVycyBjYW4gYWN0IGFzIHZpc2libGUgbGFiZWwsIHdoaWNoIGlzIGNoZWNrZWQgaW4gdGFibGUgaGVhZGluZyBydWxlXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gY3VzdG9tIHdpZGdldCBzdWJtaXNzaW9uIGlzIG5vdCBpbiBzY29wZSBmb3IgdGhpcyBzdWNjZXNzIGNyaXRlcmlhIChJQk1hL2VxdWFsLWFjY2VzcyMyMDQpIGlmIGl0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggZGF0YSBlbnRyeVxuICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChyb2xlICYmIHJvbGUgPT09IFwiYnV0dG9uXCIgJiYgbm9kZU5hbWUgIT09ICdpbnB1dCcgJiYgbm9kZU5hbWUgIT09ICdidXR0b24nKSB7ICAgIFxuICAgICAgICAgICAgLy8gbGlrZWx5IGEgY3VzdG9tIHdpZGdldCwgc2tpcCBpZiBub3QgYXNzb2NpYXRlZCB3aXRoIGRhdGEgZW50cnlcbiAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJmb3JtXCIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gaW4gYSBjb21ib2JveCwgb25seSBsb29rIGF0IHRoZSBpbnB1dCB0ZXh0Ym94LlxuICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSAmJlxuICAgICAgICAgICAgIShBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSB8fCBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwic2VhcmNoYm94XCIpIHx8XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCAobm9kZU5hbWUgPT09IFwic2VsZWN0XCIgJiYgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGF2b2lkIGRpYWdub3NpbmcgdGhlIHBvcHVwIGxpc3Qgb2YgYSBjb21ib2JveC5cbiAgICAgICAgbGV0IHJvbGVzVG9DaGVjayA9IFtcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlc1RvQ2hlY2subGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIHJvbGVzVG9DaGVja1tqXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tYm9ib3hlcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4ocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbWJvYm94ZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ID0gY29tYm9ib3hlc1trXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFfb3ducyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudEF0dHJpYnV0ZShjb21ib2JveCwgXCJhcmlhLW93bnNcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmlhX293bnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25zID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGFyaWFfb3ducy50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBvd25zW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWQgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIC8vIGNoZWNrIHZpc2libGUgbGFiZWwgZm9yIGlucHV0IG9yIGJ1dHRvblxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgfHwgbm9kZU5hbWUgPT09ICdidXR0b24nKSB7XG4gICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwICYmIChwYWlyLm5hbWVGcm9tID09PSAnbGFiZWwnIHx8IHBhaXIubmFtZUZyb20gPT09ICdpbnRlcm5hbCcgfHwgcGFpci5uYW1lRnJvbSA9PT0gJ2FsdCcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBhbiBhbHRlcm5hdGl2ZSB0b29sdGlwIGV4aXN0cyB0aGF0IGNhbiBiZSBtYWRlIHZpc2libGUgdGhyb3VnaCBtb3VzZW92ZXJcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCAmJiAocGFpci5uYW1lRnJvbSA9PT0gJ3RleHQnIHx8IHBhaXIubmFtZUZyb20gPT09ICd0aXRsZScpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICAvLyBjaGVjayBpZiBhbnkgdmlzaWJsZSB0ZXh0IGZyb20gdGhlIGNvbnRyb2wuIFxuICAgICAgICAvLyBub3RlIHRoYXQgKDEpIHRoZSB0ZXh0IGRvZXNu4oCZdCBuZWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udHJvbCB0byBmb3JtIGEgcmVsYXRpb25zaGlwXG4gICAgICAgIC8vICAoMikgdGhlIHRleHQgZG9lc24ndCBuZWVkIHRvIGZvbGxvdyBhY2Nlc3NpYmxlIG5hbWUgcmVxdWlyZW1lbnQgKGUuZy4gbmFtZUZyb20pXG4gICAgICAgIGNvbnN0IHRleHQgPSBDb21tb25VdGlsLmdldE9uU2NyZWVuSW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHRleHQgJiYgdGV4dC5sZW5ndGggIT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICBcbiAgICAgICAgLy8gY2hlY2sgaWYgYW55IGRlc2NlbmRhbnQgd2l0aCBhbiBhbHRlcm5hdGl2ZSB0b29sdGlwIHRoYXQgY2FuIGJlIG1hZGUgdmlzaWJsZSB0aHJvdWdoIG1vdXNlb3ZlclxuICAgICAgICAvLyBvbmx5IGNvbnNpZGVyIGltZyBhbmQgc3ZnLCBhbmQgb3RoZXIgdGV4dCBjb250ZW50IG9mIHRoZSBkZXNjZW5kYW50IGlzIGNvdmVyZWQgaW4gdGhlIGlzSW5uZXJUZXh0IGFib3ZlICBcbiAgICAgICAgbGV0IGRlc2NlbmRhbnRzID0gQXJpYVV0aWwuZ2V0QWxsRGVzY2VuZGFudHNXaXRoUm9sZXMocnVsZUNvbnRleHQsIFtcImltZ1wiLCBcImdyYXBoaWNzLWRvY3VtZW50XCIsIFwiZ3JhcGhpY3Mtb2JqZWN0XCIsIFwiZ3JhcGhpY3Mtc3ltYm9sXCJdLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChkZXNjZW5kYW50cyAmJiBkZXNjZW5kYW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkPTA7IGQgPCBkZXNjZW5kYW50cy5sZW5ndGg7IGQrKykge1xuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGRlc2NlbmRhbnRzW2RdLCBcInRpdGxlXCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZGVzY2VuZGFudHNbZF0sIFwiYWx0XCIpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB2aXNpYmxlIGxhYmVsIHBvaW50ZWQgdG8gYnkgdGhlIGFyaWEtbGFiZWxsZWRieSBhdHRyaWJ1dGUuXG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbGV0IHRoZUxhYmVsID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICAgICAgICAgICAgbGV0IGxhYmVsVmFsdWVzID0gdGhlTGFiZWwuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGFiZWxWYWx1ZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudEJ5SWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgbGFiZWxWYWx1ZXNbal0pO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50QnlJZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShlbGVtZW50QnlJZCwgcnVsZUNvbnRleHQpICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50QnlJZCkgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4oZWxlbWVudEJ5SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgobm9kZU5hbWUgPT09IFwib3B0Z3JvdXBcIiB8fCBub2RlTmFtZSA9PSBcIm9wdGlvblwiKSAmJiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwICYmIChwYWlyLm5hbWVGcm9tID09PSAnbGFiZWwnIHx8IHBhaXIubmFtZUZyb20gPT09ICdjb250ZW50JykpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyByZWZlcmVuY2VkIGJ5IGEgY29tYm9ib3guIElmIHNvLCB0aGUgbGFiZWwgYmVsb25ncyB0byB0aGUgY29tYm9ib3hcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGlmIChpZCAmJiBpZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihgKlthcmlhLWNvbnRyb2xzPScke2lkfSddW3JvbGU9J2NvbWJvYm94J11gKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYSBwbGFjZWhvbGRlciBleGlzdHMgZXZlbiB0aG91Z2ggYSBwbGFjZWhvbGRlciB0ZXh0IGlzIG5vdCBzdWZmaWNpZW50IGFzIGEgdmlzaWJsZSB0ZXh0XG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInBsYWNlaG9sZGVyXCIpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiKTtcblxuICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9ub19sYWJlbFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfb25jaGFuZ2VfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X29uY2hhbmdlX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0W29uY2hhbmdlXSwgZG9tOnRleHRhcmVhW29uY2hhbmdlXSwgZG9tOnNlbGVjdFtvbmNoYW5nZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9IYXNPbmNoYW5nZVwiOiB7XG4gICAgICAgICAgICAvLyBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfd2FybmluZ1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImlucHV0X29uY2hhbmdlX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF93YXJuaW5nXCI6IFwiaW5wdXRfb25jaGFuZ2VfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZXJzIG11c3QgYmUgYWR2aXNlZCBpZiwgZHVlIHRvIGEgY2hhbmdlIG9mIGVsZW1lbnQgdmFsdWUsIGEgZm9ybSBhdXRvbWF0aWNhbGx5IHN1Ym1pdHMsIGEgbmV3IHdpbmRvdyBvcGVucywgb3IgYSBjaGFuZ2UgaW4gZm9jdXMgb2NjdXJzXCIsXG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJUaGUgdXNlciBpcyBhZHZpc2VkIG9mIHRoZSBhdXRvbWF0aWMgZm9ybSBzdWJtaXNzaW9uLCBuZXcgd2luZG93IG9wZW5pbmcsIG9yIGZvY3VzIGNoYW5nZVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfd2FybmluZ1wiOiBcIkNvbmZpcm0gdGhhdCB0aGUgdXNlciBpcyBhZHZpc2VkIGlmLCBkdWUgdG8gYSBjaGFuZ2Ugb2YgZWxlbWVudCB2YWx1ZSwgYSBmb3JtIGF1dG9tYXRpY2FsbHkgc3VibWl0cywgYSBuZXcgd2luZG93IG9wZW5zLCBvciBhIGNoYW5nZSBpbiBmb2N1cyBvY2N1cnNcIiAgICBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcImhpZGRlblwiIHx8IHR5cGUgPT09IFwic3VibWl0XCIgfHwgdHlwZSA9PT0gXCJpbWFnZVwiIHx8IHR5cGUgPT09IFwiYnV0dG9uXCIgfHwgdHlwZSA9PT0gXCJyZXNldFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfd2FybmluZ1wiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0W3BsYWNlaG9sZGVyXSwgZG9tOnRleHRhcmVhW3BsYWNlaG9sZGVyXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19JbnB1dF9QbGFjZWhvbGRlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiUG90ZW50aWFsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkhUTUw1IHBsYWNlaG9sZGVyIGlzIHRoZSBvbmx5IHZpc2libGUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJBZGRpdGlvbmFsIHZpc2libGUgbGFiZWwgcmVmZXJlbmNlZCBieSAnYXJpYS1sYWJlbGxlZGJ5JyBpcyBub3QgdmFsaWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIVE1MNSAncGxhY2Vob2xkZXInIGF0dHJpYnV0ZSBtdXN0IG5vdCBiZSB1c2VkIGFzIGEgdmlzaWJsZSBsYWJlbCByZXBsYWNlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIG1lcmdlIHRoZSBydWxlIGludG8gaW5wdXRfbGFiZWxfdmlzaWJsZVxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgICovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJoaWRkZW5cIiB8fCB0eXBlID09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaGlkZGVuXCIpKSB7XG4gICAgICAgICAgICBsZXQgaGlkZGVuID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaGlkZGVuXCIpO1xuICAgICAgICAgICAgaWYgKGhpZGRlbiA9PSBcIlwiIHx8IGhpZGRlbi50b0xvd2VyQ2FzZSgpID09IFwiaGlkZGVuXCIpIHsgLy8gd2hlbiBoaWRkZW4gaXMgZW1wdHkgaW4gdGhlIGVsZW1lbnQsIFwiXCIgaXMgcmV0dXJuZWQsIHNhbWUgYXMgaXQgaGFzIGEgdmFsdWUgb2YgXCJcIi5cbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICAgICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGxldCByZWZJZHMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikudHJpbSgpLnNwbGl0KC9cXHMrLyk7IC8vIHNlcGFyYXRlZCBieSBvbmUgb3IgbW9yZSB3aGl0ZSBzcGFjZXNcbiAgICAgICAgICAgIGlmICghcmVmSWRzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBsYWJlbF9jb250ZW50X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJsYWJlbF9jb250ZW50X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxhYmVsXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0xhYmVsX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzX1JlZ3VsYXJcIjogXCJQYXNzX1JlZ3VsYXJcIixcbiAgICAgICAgICAgIFwiUGFzc19BcmlhTGFiZWxcIjogXCJQYXNzX0FyaWFMYWJlbFwiLFxuICAgICAgICAgICAgXCJQYXNzX0xhYmVsbGVkQnlcIjogXCJQYXNzX0xhYmVsbGVkQnlcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc19SZWd1bGFyXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzX0FyaWFMYWJlbFwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc19MYWJlbGxlZEJ5XCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzX1JlZ3VsYXJcIjogXCI8bGFiZWw+IGVsZW1lbnQgaGFzIGFjY2Vzc2libGUgbmFtZSB3aXRoIGlubmVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiUGFzc19BcmlhTGFiZWxcIjogXCI8bGFiZWw+IGVsZW1lbnQgaGFzIGFjY2Vzc2libGUgbmFtZSB2aWEgJ2FyaWEtbGFiZWwnXCIsXG4gICAgICAgICAgICBcIlBhc3NfTGFiZWxsZWRCeVwiOiBcIjxsYWJlbD4gZWxlbWVudCBoYXMgYWNjZXNzaWJsZSBuYW1lIHZpYSAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPGxhYmVsPiBlbGVtZW50IGRvZXMgbm90IGhhdmUgZGVzY3JpcHRpdmUgdGV4dCB0aGF0IGlkZW50aWZpZXMgdGhlIGV4cGVjdGVkIGlucHV0XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8bGFiZWw+IGVsZW1lbnQgbXVzdCBoYXZlIG5vbi1lbXB0eSBkZXNjcmlwdGl2ZSB0ZXh0IHRoYXQgaWRlbnRpZmllcyB0aGUgcHVycG9zZSBvZiB0aGUgaW50ZXJhY3RpdmUgY29tcG9uZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX1JlZ3VsYXJcIik7XG5cbiAgICAgICAgfSBlbHNlIGlmICgocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fCBcIlwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19BcmlhTGFiZWxcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JykpO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbEVsZW0sIHJ1bGVDb250ZXh0KSAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudChsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19MYWJlbGxlZEJ5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjb25zdCBsYWJlbF9uYW1lX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGFiZWxfbmFtZV92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmNoZWNrYm94LGFyaWE6Z3JpZGNlbGwsYXJpYTpsaW5rLGFyaWE6bWVudWl0ZW0sYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOm9wdGlvbixhcmlhOnJhZGlvLGFyaWE6c3dpdGNoLGFyaWE6dGFiLGFyaWE6dHJlZWl0ZW0sZG9tOmlucHV0LGRvbTp0ZXh0YXJlYSxkb206c2VsZWN0LGRvbTpvdXRwdXQsZG9tOm1ldGVyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjFfTGFiZWxfQWNjZXNzaWJsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImxhYmVsX25hbWVfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImxhYmVsX25hbWVfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGFiZWxfbmFtZV92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiQWNjZXNzaWJsZSBuYW1lIG1hdGNoZXMgb3IgY29udGFpbnMgdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJBY2Nlc3NpYmxlIG5hbWUgZG9lcyBub3QgbWF0Y2ggb3IgY29udGFpbiB0aGUgdmlzaWJsZSBsYWJlbCB0ZXh0XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWNjZXNzaWJsZSBuYW1lIG11c3QgbWF0Y2ggb3IgY29udGFpbiB0aGUgdmlzaWJsZSBsYWJlbCB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi41LjNcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogUmV2aWV3IGh0dHBzOi8vZ2l0aHViLmNvbS9hY3QtcnVsZXMvYWN0LXJ1bGVzLmdpdGh1Yi5pby9pc3N1ZXMvMTYxOFxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9XQUkvV0NBRzIxL1RlY2huaXF1ZXMvYXJpYS9BUklBMjRcbiAgICBhY3Q6IFwiMmVlOGI4XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFzcyBpZiB0aGUgdmlzaWJsZSB0ZXh0IHVzZXMgTWF0ZXJpYWwgSWNvbiBmb250XG4gICAgICAgIGlmIChDU1NVdGlsLmlzTWF0ZXJpYWxJY29uRm9udChydWxlQ29udGV4dCkpIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgbGV0IGlzSW5wdXRCdXR0b24gPSBmYWxzZTtcbiAgICAgICAgLy9sZXQgYnV0dG9uVHlwZXMgPSBbXCJidXR0b25cIiwgXCJyZXNldFwiLCBcInN1Ym1pdFwiXTsgLy9cImltYWdlXCJcbiAgICAgICAgbGV0IGlucHV0VHlwZSA9IG51bGw7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGlucHV0VHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmZvcm1fYnV0dG9uX3R5cGVzLmluZGV4T2YoaW5wdXRUeXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpc0lucHV0QnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aGVMYWJlbEJ5ID0gQXJpYVV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsbGVkYnlcIik7XG4gICAgICAgIGlmICh0aGVMYWJlbEJ5ICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihydWxlQ29udGV4dCwgdGhlTGFiZWxCeSkgJiYgIWlzSW5wdXRCdXR0b24pIHtcbiAgICAgICAgICAgIC8vIHNraXAgdGhlIGNoZWNrcyBpZiBpdCBoYXMgYW4gYXJpYS1sYWJlbGxlZGJ5IHNpbmNlIGl0IHRha2VzIHByZWNlZGVuY2UuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdGhlTGFiZWwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoZUxhYmVsQnkgJiYgIUNvbW1vblV0aWwuaXNJZFJlZmVyVG9TZWxmKHJ1bGVDb250ZXh0LCB0aGVMYWJlbEJ5KSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbFZhbHVlcyA9IHRoZUxhYmVsQnkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxhYmVsVmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50QnlJZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBsYWJlbFZhbHVlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50QnlJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGFiZWwgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChlbGVtZW50QnlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhlTGFiZWwgPSBBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhlTGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHRleHQgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoaXNJbnB1dEJ1dHRvbikge1xuICAgICAgICAgICAgICAgIC8qIE5vdGU6IERpc2FibGUgdGhlIGFsdCBjaGVjayBpbiBpbWFnZXMgdW50aWwgd2UgZ2V0IGNvbmZpcm1hdGlvblxuICAgICAgICAgICAgICAgIGlmIChpbnB1dFR5cGU9PT1cImltYWdlXCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpKXtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlICdhbHQnIGF0dHJpYnV0ZSBhcyB2aXNpYmxlIHRleHRcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICB9ZWxzZSBcbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgJ3ZhbHVlJyBhdHRyaWJ1dGUgYXMgdmlzaWJsZSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRUeXBlID09PSBcInN1Ym1pdFwiLyp8fGlucHV0VHlwZT09PVwiaW1hZ2VcIiovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gXCJzdWJtaXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dFR5cGUgPT09IFwicmVzZXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFwicmVzZXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBhIDxsYWJlbD4gZWxlbWVudFxuICAgICAgICAgICAgICAgIGxldCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibGFiZWxcIiAvKiYmIFJQVFV0aWwuaXNGaXJzdEZvcm1FbGVtZW50KHBhcmVudE5vZGUsIHJ1bGVDb250ZXh0KSovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50Q2xvbmUgPSBwYXJlbnROb2RlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2x1ZGUgYWxsIGZvcm0gZWxlbWVudHMgZnJvbSB0aGUgbGFiZWwgc2luY2UgdGhleSBtaWdodCBhbHNvIGhhdmUgaW5uZXIgY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBsYWJlbEVsZW0gPyBsYWJlbEVsZW0gOiBydWxlQ29udGV4dDtcblxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50c1RvU2tpcENvbnRlbnRDaGVjayA9IFtcIm1ldGVyXCIsIFwib3V0cHV0XCIsIFwicHJvZ3Jlc3NcIiwgXCJzZWxlY3RcIiwgXCJ0ZXh0YXJlYVwiXTtcbiAgICAgICAgICAgICAgICBpZiAoIWxhYmVsRWxlbSAmJiBlbGVtZW50c1RvU2tpcENvbnRlbnRDaGVjay5pbmRleE9mKG5vZGVOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFwiXCI7IC8vIHNraXAgY29udGVudCBjaGVjayBmb3Igc29tZSBlbGVtZW50c1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdmlzaWJsZSB0ZXh0IG9ubHlcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IENvbW1vblV0aWwuZ2V0T25TY3JlZW5Jbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLyogTm90ZTogRGlzYWJsZSB0aGlzIGFsdCBjaGVjayBpbiBpbWFnZXMgZm9yIG5vdyB1bnRpbCB3ZSBnZXQgY29uZmlybWF0aW9uXG4gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlIGFsdCBhdHRyaWJ1dGUgb2YgYW4gaW1hZ2Ugd2hpY2ggaXMgY29uc2lkZXJlZCB2aXNpYmxlIHRleHQuXG4gICAgICAgICAgICAgICAgbGV0IGhhc0ltZ0FsdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbncgPSBSUFRVdGlsLm5ldyBOb2RlV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIWhhc0ltZ0FsdCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCAmJiBudy5ub2RlICE9IGVsZW1lbnQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ltZ0FsdCA9IChudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbWdcIiAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwiYWx0XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNJbWdBbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dCA/IHRleHQgKyBudy5ub2RlLmdldEF0dHJpYnV0ZShcImFsdFwiKSA6IG53Lm5vZGUuZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBub25hbHBoYW51bWVyaWMgPSAvW15hLXpBLVowLTldL2c7XG5cbiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2Uobm9uYWxwaGFudW1lcmljLCBcIiBcIik7IC8vIG9ubHkgY29uc2lkZXIgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIGxldCBub3JtYWxpemVkVGV4dCA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyh0ZXh0KS50b0xvd2VyQ2FzZSgpOyAvLyBMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGFuZCBkaWZmZXJlbmNlIGluIGNhc2Ugc2Vuc2l0aXZpdHkgc2hvdWxkIGJlIGlnbm9yZWQuXG5cbiAgICAgICAgICAgIHRoZUxhYmVsID0gdGhlTGFiZWwucmVwbGFjZShub25hbHBoYW51bWVyaWMsIFwiIFwiKTsgLy8gb25seSBjb25zaWRlciBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWRMYWJlbCA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyh0aGVMYWJlbCkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRUZXh0Lmxlbmd0aCA+IDEpIHsgLy8gc2tpcCBub24tdGV4dCBjb250ZW50LiBlLmcuLCA8YnV0dG9uIGFyaWEtbGFiZWw9XCJjbG9zZVwiPlg8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICBsZXQgbG9jYXRpb24gPSBub3JtYWxpemVkTGFiZWwuaW5kZXhPZihub3JtYWxpemVkVGV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBdm9pZCBtYXRjaGluZyBwYXJ0aWFsIHdvcmRzLmUuZy4sIHRleHQgXCJuYW1lXCIgc2hvdWxkIG5vdCBtYXRjaCAnc3VybmFtZScgb3IgJ25hbWVzJ1xuICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA+PSAwICYmIG5vcm1hbGl6ZWRMYWJlbC5sZW5ndGggPiBub3JtYWxpemVkVGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxldHRlcnMgPSAvXlswLTlhLXpBLVpdKyQvO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGxvY2F0aW9uICsgbm9ybWFsaXplZFRleHQubGVuZ3RoKSA8IG5vcm1hbGl6ZWRMYWJlbC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoZUNoYXIgPSBub3JtYWxpemVkTGFiZWwuY2hhckF0KGxvY2F0aW9uICsgbm9ybWFsaXplZFRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGVDaGFyLm1hdGNoKGxldHRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiBsb2NhdGlvbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGJlZ2lubmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoZUNoYXIgPSBub3JtYWxpemVkTGFiZWwuY2hhckF0KGxvY2F0aW9uIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhlQ2hhci5tYXRjaChsZXR0ZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PT0gLTEpIHsgLy8gY2hlY2sgdGhhdCB2aXNpYmxlIHRleHQgY29udGVudCBvZiB0aGUgdGFyZ2V0IGlzIGNvbnRhaW5lZCB3aXRoaW4gaXRzIGFjY2Vzc2libGUgbmFtZS5cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbGFiZWxfcmVmX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImxhYmVsX3JlZl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxhYmVsW2Zvcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9MYWJlbF9SZWZWYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9pbnZhbGlkXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsYWJlbF9yZWZfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlICdmb3InIGF0dHJpYnV0ZSBmb3IgYSBsYWJlbCByZWZlcmVuY2VhIGEgdW5pcXVlIG5vbi1lbXB0eSAnaWQnIGF0dHJpYnV0ZSBvZiBhIHZhbGlkIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiVGhlIHZhbHVlIFxcXCJ7MH1cXFwiIG9mIHRoZSAnZm9yJyBhdHRyaWJ1dGUgaXMgbm90IHRoZSAnaWQnIG9mIGEgdmFsaWQgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnZm9yJyBhdHRyaWJ1dGUgZm9yIGEgbGFiZWwgc2hvdWxkIHJlZmVyZW5jZSBhIG5vbi1lbXB0eSwgdW5pcXVlICdpZCcgYXR0cmlidXRlIG9mIGEgdmFsaWQgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZm9yXCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCB0YXJnZXQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgaWQpO1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgaWYgYm90aCBsYWJlbCBhbmQgY29udHJvbCBhcmUgaW52aXNpYmxlXG4gICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZSh0YXJnZXQpICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gaGFuZGxlcyBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghdGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBGYWlsIGlmIHdlJ3JlIHBvaW50aW5nIGF0IHNvbWV0aGluZyB0aGF0IGlzIGxhYmVsbGVkIGJ5IGFub3RoZXIgbWVjaGFuaXNtXG4gICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gbm9kZU5hbWUgPT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09IFwic2VsZWN0XCIgfHwgbm9kZU5hbWUgPT0gXCJ0ZXh0YXJlYVwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwiYnV0dG9uXCIgfHwgbm9kZU5hbWUgPT0gXCJkYXRhbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwib3B0Z3JvdXBcIiB8fCBub2RlTmFtZSA9PSBcIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwia2V5Z2VuXCIgfHwgbm9kZU5hbWUgPT0gXCJvdXRwdXRcIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcInByb2dyZXNzXCIgfHwgbm9kZU5hbWUgPT0gXCJtZXRlclwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwiZmllbGRzZXRcIiB8fCBub2RlTmFtZSA9PSBcImxlZ2VuZFwiO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgdGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0eXBlID09IFwidGV4dFwiIHx8IHR5cGUgPT0gXCJwYXNzd29yZFwiIHx8IHR5cGUgPT0gXCJmaWxlXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJjaGVja2JveFwiIHx8IHR5cGUgPT0gXCJyYWRpb1wiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiaGlkZGVuXCIgfHwgdHlwZSA9PSBcInNlYXJjaFwiIHx8IHR5cGUgPT0gXCJ0ZWxcIiB8fCB0eXBlID09IFwidXJsXCIgfHwgdHlwZSA9PSBcImVtYWlsXCIgfHwgIC8vSFRNTCA1XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiZGF0ZVwiIHx8IHR5cGUgPT0gXCJudW1iZXJcIiB8fCB0eXBlID09IFwicmFuZ2VcIiB8fCB0eXBlID09IFwiaW1hZ2VcIiB8fCAvL0hUTUwgNVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcInRpbWVcIiB8fCB0eXBlID09IFwiY29sb3JcIiB8fCAgLy8gSFRNTCA1XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiZGF0ZXRpbWUtbG9jYWxcIiB8fCB0eXBlID09IFwibW9udGhcIiB8fCB0eXBlID09IFwid2Vla1wiOyAvL0hUTUw1LjFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBvbmUgbW9yZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIHRhcmdldCBlbGVtZW50IGlzIE5PVCBoaWRkZW4sIGluIHRoZSBjYXNlIHRoZSB0YXJnZXQgaXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBmbGFnIGEgdmlvbGF0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBpcy5cbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZSh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFRva2VuOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChpZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW5dKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZFwiLCByZXRUb2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjb25zdCBsaXN0X2NoaWxkcmVuX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3RfY2hpbGRyZW5fdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JvdXBcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfTGlzdF9Hcm91cF9MaXN0SXRlbVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImxpc3RfY2hpbGRyZW5fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTGlzdCBjb21wb25lbnQgd2l0aCBcXFwiZ3JvdXBcXFwiIHJvbGUgaGFzIGNoaWxkcmVuIHRoYXQgYXJlIG5vdCA8bGlzdGl0ZW0+IGVsZW1lbnRzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTGlzdCBjb21wb25lbnQgd2l0aCBcXFwiZ3JvdXBcXFwiIHJvbGUgbXVzdCBsaW1pdCBjaGlsZHJlbiB0byA8bGlzdGl0ZW0+IGVsZW1lbnRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhwYXJlbnQsIFwibGlzdFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcnVsZUNvbnRleHQuY2hpbGRyZW47XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwibGlzdGl0ZW1cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuLy8gTWF0Y2hlcyB1bm9yZGVyZWQgbGlzdCBpdGVtIHByZWZpeGVzOiDigKIsIOKXpiwg4paqLCDilrgsIOKWuiwg4pyTLCDinJcsIOKcpiwg4oCTLCDigJQsICosIC0sIG9cbmNvbnN0IFVOT1JERVJFRF9CVUxMRVRfUEFUVEVSTiA9IC9eWyBcXHRdKlvigKLil6bilqrilrjilrrinJPinJfinKZcXC3igJPigJQqb11bIFxcdF0rXFxTLztcblxuLy8gTWF0Y2hlcyBvcmRlcmVkIGxpc3QgaXRlbSBwcmVmaXhlczogMS4gMSkgKDEpIGEuIGEpIChhKSBBLiBBKSBpLiBpaS4gaWlpLiBldGMuXG5jb25zdCBPUkRFUkVEX0lURU1fUEFUVEVSTiA9IC9eWyBcXHRdKig/OlxcKD9cXGQrWy4pXVxcKT98XFwoP1thLXpBLVpdWy4pXVxcKT98XFwoPyg/Oml7MSwzfXxpdnx2aXswLDN9fGl4fHhpezAsM318eGl2fHh2KVsuKV1cXCk/KVsgXFx0XStcXFMvaTtcblxuY29uc3QgTElTVF9JVEVNX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFxuICAgIFVOT1JERVJFRF9CVUxMRVRfUEFUVEVSTi5zb3VyY2UgKyBcInxcIiArIE9SREVSRURfSVRFTV9QQVRURVJOLnNvdXJjZSxcbiAgICBcImlcIlxuKTtcblxuLy8gQmxvY2stbGV2ZWwgZWxlbWVudHMgdGhhdCBhY3QgYXMgYm91bmRhcmllcyBiZXR3ZWVuIGluZGVwZW5kZW50IGNvbnRlbnQgZ3JvdXBzXG5jb25zdCBCTE9DS19FTEVNRU5UUyA9IG5ldyBTZXQoW1xuICAgIFwiYmxvY2txdW90ZVwiLCBcImNlbnRlclwiLCBcImRpclwiLCBcImRpdlwiLCBcImZvcm1cIixcbiAgICBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIiwgXCJoNlwiLFxuICAgIFwiaHJcIiwgXCJiclwiLCBcIm1lbnVcIiwgXCJwXCIsIFwicHJlXCIsIFwidGFibGVcIixcbiAgICBcInNlY3Rpb25cIiwgXCJhcnRpY2xlXCIsIFwiYXNpZGVcIiwgXCJuYXZcIiwgXCJoZWFkZXJcIiwgXCJmb290ZXJcIixcbiAgICBcImZpZ3VyZVwiLCBcImZpZ2NhcHRpb25cIiwgXCJkZXRhaWxzXCIsIFwic3VtbWFyeVwiLCBcImRpYWxvZ1wiLFxuICAgIFwic2NyaXB0XCIsIFwic3R5bGVcIiwgXCJsYWJlbFwiLFxuICAgIFwidWxcIiwgXCJvbFwiLCBcImRsXCIsIFwibGlcIiwgXCJkdFwiLCBcImRkXCJcbl0pO1xuXG4vLyBJbmxpbmUgZWxlbWVudHMgd2hvc2UgdGV4dCBjb250ZW50IGlzIHRyZWF0ZWQgYXMgcGFydCBvZiB0aGUgc3Vycm91bmRpbmcgdGV4dCBydW5cbmNvbnN0IElOTElORV9FTEVNRU5UUyA9IG5ldyBTZXQoW1xuICAgIFwiYVwiLCBcImFiYnJcIiwgXCJhY3JvbnltXCIsIFwiYlwiLCBcImJkb1wiLCBcImJpZ1wiLCBcImJyXCIsIFwiYnV0dG9uXCIsIFwiY2l0ZVwiLFxuICAgIFwiY29kZVwiLCBcImRmblwiLCBcImVtXCIsIFwiaVwiLCBcImltZ1wiLCBcImlucHV0XCIsIFwia2JkXCIsIFwibGFiZWxcIiwgXCJtYXBcIixcbiAgICBcIm9iamVjdFwiLCBcIm91dHB1dFwiLCBcInFcIiwgXCJzYW1wXCIsIFwic2VsZWN0XCIsIFwic21hbGxcIiwgXCJzcGFuXCIsXG4gICAgXCJzdHJvbmdcIiwgXCJzdWJcIiwgXCJzdXBcIiwgXCJ0ZXh0YXJlYVwiLCBcInRpbWVcIiwgXCJ0dFwiLCBcInVcIiwgXCJ2YXJcIlxuXSk7XG5cbi8vIFJldHVybnMgdGhlIGNvbWJpbmVkIHRleHQgb2YgYSBub2RlIGFuZCBpdHMgaW5saW5lIGRlc2NlbmRhbnRzLCBub3JtYWxpc2VkIHRvIHNpbmdsZSBzcGFjZXNcbmZ1bmN0aW9uIGdldFNoYWxsb3dUZXh0KG5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICBub2RlLmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgdGV4dCArPSBjaGlsZC5ub2RlVmFsdWUgPz8gXCJcIjtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IChjaGlsZCBhcyBFbGVtZW50KS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKElOTElORV9FTEVNRU5UUy5oYXModGFnKSkge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gZ2V0U2hhbGxvd1RleHQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFxzKy9nLCBcIiBcIik7XG59XG5cbi8vIFJldHVybnMgdHJpbW1lZCBub24tZW1wdHkgbGluZXMgZnJvbSBhIG5vZGUsIHNwbGl0dGluZyBvbiBuZXdsaW5lcyBhbmQgPGJyPiBib3VuZGFyaWVzXG5mdW5jdGlvbiBnZXRMaW5lc0Zyb21Ob2RlKG5vZGU6IE5vZGUpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmdW5jdGlvbiB3YWxrKG46IE5vZGUpIHtcbiAgICAgICAgaWYgKG4ubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAobi5ub2RlVmFsdWUgPz8gXCJcIikuc3BsaXQoL1xccj9cXG4vKS5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSBwLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodHJpbW1lZC5sZW5ndGggPiAwKSBsaW5lcy5wdXNoKHRyaW1tZWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBuIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodGFnID09PSBcImJyXCIpIHtcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKFwiXFx4MDBcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEJMT0NLX0VMRU1FTlRTLmhhcyh0YWcpKSByZXR1cm47XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFNraXAgZWxlbWVudHMgd2l0aCBsaXN0LXJlbGF0ZWQgb3Igd2lkZ2V0IHJvbGVzXG4gICAgICAgICAgICBjb25zdCByb2xlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzV2l0aFR5cGVzKGVsZW0sIFtcIndpZGdldFwiXSk7XG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFxuICAgICAgICAgICAgICAgICAgICBbXCJjYXB0aW9uXCIsIFwiY29kZVwiLCBcImNvbHVtbmhlYWRlclwiLCBcImZpZ3VyZVwiLCBcImxpc3RcIiwgXCJsaXN0aXRlbVwiLCBcIm1hdGhcIiwgXCJtZXRlclwiLCBcInJvd2hlYWRlclwiXSxcbiAgICAgICAgICAgICAgICAgICAgcm9sZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChyb2xlcy5sZW5ndGggPiAwKSByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIG4uY2hpbGROb2Rlcy5mb3JFYWNoKHdhbGspO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2Fsayhub2RlKTtcbiAgICByZXR1cm4gbGluZXMuZmlsdGVyKGwgPT4gbCAhPT0gXCJcXHgwMFwiKTtcbn1cblxuLy8gUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29uc2VjdXRpdmUgbGlzdC1pdGVtLWxpa2UgbGluZXMgZm91bmQgYW1vbmdcbi8vIHRoZSBkaXJlY3QgY2hpbGRyZW4gb2YgcGFyZW50LCB0cmVhdGluZyA8YnI+IGFuZCB3aGl0ZXNwYWNlLW9ubHkgdGV4dCBhcyBzZXBhcmF0b3JzXG5mdW5jdGlvbiBtYXhDb25zZWN1dGl2ZUxpc3RJdGVtcyhwYXJlbnQ6IEVsZW1lbnQpOiBudW1iZXIge1xuICAgIGxldCBtYXhSdW4gPSAwO1xuICAgIGxldCBjdXJyZW50UnVuID0gMDtcbiAgICBsZXQgY3VycmVudExpbmVUZXh0ID0gXCJcIjsgIC8vIGFjY3VtdWxhdGUgdGV4dCBhY3Jvc3MgaW5saW5lIHNpYmxpbmdzIHVudGlsIDxicj5cblxuICAgIHBhcmVudC5jaGlsZE5vZGVzLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhZyA9IGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKHRhZyA9PT0gXCJiclwiKSB7XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSBhY2N1bXVsYXRlZCBsaW5lXG4gICAgICAgICAgICBjb25zdCB0cmltbWVkID0gY3VycmVudExpbmVUZXh0LnRyaW0oKTtcbiAgICAgICAgICAgIGlmICh0cmltbWVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoTElTVF9JVEVNX1BBVFRFUk4udGVzdCh0cmltbWVkKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXhSdW4gPSBNYXRoLm1heChtYXhSdW4sICsrY3VycmVudFJ1bik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhdyA9IGNoaWxkLm5vZGVWYWx1ZSA/PyBcIlwiO1xuICAgICAgICAgICAgaWYgKHJhdy50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgZW1iZWRkZWQgbmV3bGluZXMsIGZsdXNoIG9uIGVhY2hcbiAgICAgICAgICAgIGNvbnN0IHNlZ3MgPSByYXcuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgICAgICAgIHNlZ3MuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSBjdXJyZW50TGluZVRleHQudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJpbW1lZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTElTVF9JVEVNX1BBVFRFUk4udGVzdCh0cmltbWVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ1biA9IE1hdGgubWF4KG1heFJ1biwgKytjdXJyZW50UnVuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ICs9IHNlZztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IGNoaWxkIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoQkxPQ0tfRUxFTUVOVFMuaGFzKHRhZykpIHtcbiAgICAgICAgICAgICAgICAvLyBmbHVzaCBjdXJyZW50IGxpbmUgYmVmb3JlIGJsb2NrIGJvdW5kYXJ5XG4gICAgICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IGN1cnJlbnRMaW5lVGV4dC50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRyaW1tZWQubGVuZ3RoID4gMCAmJiBMSVNUX0lURU1fUEFUVEVSTi50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heFJ1biA9IE1hdGgubWF4KG1heFJ1biwgKytjdXJyZW50UnVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gMDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSU5MSU5FX0VMRU1FTlRTLmhhcyh0YWcpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ICs9IGdldFNoYWxsb3dUZXh0KGVsZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gMDtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZVRleHQgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBmbHVzaCBhbnkgcmVtYWluaW5nIGxpbmUgYXQgZW5kIG9mIGNvbnRhaW5lclxuICAgIGNvbnN0IHRyaW1tZWQgPSBjdXJyZW50TGluZVRleHQudHJpbSgpO1xuICAgIGlmICh0cmltbWVkLmxlbmd0aCA+IDAgJiYgTElTVF9JVEVNX1BBVFRFUk4udGVzdCh0cmltbWVkKSkge1xuICAgICAgICBtYXhSdW4gPSBNYXRoLm1heChtYXhSdW4sICsrY3VycmVudFJ1bik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1heFJ1bjtcbn1cblxuLy8gUmV0dXJucyB0cnVlIGlmIDIrIGNvbnNlY3V0aXZlIDxicj4tc2VwYXJhdGVkIGxpbmVzIHdpdGhpbiBlbGVtZW50IG1hdGNoIHRoZSBsaXN0LWl0ZW0gcGF0dGVyblxuZnVuY3Rpb24gaGFzQnJTZXBhcmF0ZWRMaXN0TGluZXMoZWxlbWVudDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGxldCBydW4gPSAwO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBnZXRMaW5lc0Zyb21Ob2RlKGVsZW1lbnQpKSB7XG4gICAgICAgIGlmIChMSVNUX0lURU1fUEFUVEVSTi50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICBpZiAoKytydW4gPj0gMikgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW4gPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IGxpc3RfbWFya3VwX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJsaXN0X21hcmt1cF9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGlzdF9Vc2VNYXJrdXBcIjoge1xuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3RcIjogXCJsaXN0X21hcmt1cF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxpc3RfbWFya3VwX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBvdGVudGlhbF9saXN0XCI6IFwiVmVyaWZ5IHRoaXMgaXMgYSBsaXN0IGFuZCBpZiBzbywgbW9kaWZ5IHRvIHVzZSBwcm9wZXIgSFRNTCBlbGVtZW50cyBmb3IgdGhlIGxpc3RcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm9wZXIgSFRNTCBlbGVtZW50cyBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgYSBsaXN0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkgfHwgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmNsdWRlcyhub2RlTmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiXSkgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wic2NyaXB0XCIsIFwic3R5bGVcIiwgXCJsYWJlbFwiXSkgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBPbmx5IGNoZWNrIGJsb2NrLWxldmVsIGFuZCB0YWJsZS1jZWxsIGVsZW1lbnRzIGZpcnN0IOKAlFxuICAgICAgICAvLyB0ZC90aCBtdXN0IGJlIGNoZWNrZWQgYmVmb3JlIHRoZSBhbmNlc3RvciByb2xlIGNoZWNrIHNpbmNlXG4gICAgICAgIC8vIHRhYmxlL3Jvdy9jZWxsIEFSSUEgcm9sZXMgd291bGQgb3RoZXJ3aXNlIGNhdXNlIGFuIGVhcmx5IGV4aXRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInRkXCIgfHwgbm9kZU5hbWUgPT09IFwidGhcIikge1xuICAgICAgICAgICAgaWYgKG1heENvbnNlY3V0aXZlTGlzdEl0ZW1zKHJ1bGVDb250ZXh0KSA+PSAyKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3RcIik7XG4gICAgICAgICAgICBpZiAoaGFzQnJTZXBhcmF0ZWRMaXN0TGluZXMocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3RcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgZWxlbWVudHMgdGhhdCBhbHJlYWR5IGhhdmUgc2VtYW50aWMgbGlzdCwgd2lkZ2V0LCBvciBzdHJ1Y3R1cmFsIHJvbGVzXG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNXaXRoVHlwZXMocnVsZUNvbnRleHQsIFtcIndpZGdldFwiXSk7XG4gICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChcbiAgICAgICAgICAgIFtcImNhcHRpb25cIiwgXCJjb2RlXCIsIFwiY29sdW1uaGVhZGVyXCIsIFwiZmlndXJlXCIsIFwibGlzdFwiLCBcImxpc3RpdGVtXCIsIFwibWF0aFwiLCBcIm1ldGVyXCIsIFwicm93aGVhZGVyXCJdLFxuICAgICAgICAgICAgcm9sZXNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGVzKHJ1bGVDb250ZXh0LCByb2xlcykgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBPbmx5IGNoZWNrIGJsb2NrLWxldmVsIGVsZW1lbnRzIHRvIGF2b2lkIGR1cGxpY2F0ZSByZXBvcnRzXG4gICAgICAgIGlmICghQkxPQ0tfRUxFTUVOVFMuaGFzKG5vZGVOYW1lKSAmJiBub2RlTmFtZSAhPT0gXCJib2R5XCIgJiYgbm9kZU5hbWUgIT09IFwibGlcIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChbXCJ1bFwiLCBcIm9sXCIsIFwiZGxcIiwgXCJtZW51XCJdLmluY2x1ZGVzKG5vZGVOYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChtYXhDb25zZWN1dGl2ZUxpc3RJdGVtcyhydWxlQ29udGV4dCkgPj0gMilcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3RcIik7XG5cbiAgICAgICAgaWYgKGhhc0JyU2VwYXJhdGVkTGlzdExpbmVzKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3RcIik7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyOiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3Rfc3RydWN0dXJlX3Byb3BlclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmRsLCBkb206dWwsIGRvbTpvbCwgZG9tOmRpciwgZG9tOm1lbnUsIGRvbTpsaSwgZG9tOmRkLCBkb206ZHRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MaXN0X01pc3VzZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsaXN0X3N0cnVjdHVyZV9wcm9wZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImxpc3Rfc3RydWN0dXJlX3Byb3Blci5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJMaXN0IGVsZW1lbnQgaXMgbWlzc2luZyBvciBpbXByb3Blcmx5IHN0cnVjdHVyZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJMaXN0IGVsZW1lbnRzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGxpc3RzIG9mIHJlbGF0ZWQgaXRlbXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEdldCBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgcnVsZUNvbnRleHRcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcnVsZUNvbnRleHQuY2hpbGRyZW5cblxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJkbFwiKSB7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IHdhbGtDaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gY2hpbGRyZW5zIHNldCBhcyBwYXNzZWQsIHNpbmNlIGRsIGVsZW1lbnRzIGNhbiBoYXZlXG4gICAgICAgICAgICAvLyB6ZXJvIG9yIG1vcmUgb2Y6IG9uZSBvciBtb3JlIGR0IGVsZW1lbnRzLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkZCBlbGVtZW50c1xuICAgICAgICAgICAgaWYgKCFydWxlQ29udGV4dC5jaGlsZHJlbiB8fCBydWxlQ29udGV4dC5jaGlsZHJlbi5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa0NoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhbGtDaGlsZHJlbi5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSB3YWxrQ2hpbGRyZW4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hpbGUgd2Fsa2luZyB0aHJvdWdoIHRoZSBlbGVtZW50cyB1bmRlciBkbCwgaWYgd2UgZmluZCBhIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudGF0aW9uYWwgZWxlbWVudCB3ZSBtb3ZlIHRvIHRoZSBuZXh0IGVsZW1lbnQgYXMgcHJlc2VudGF0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGFyZSBhbGxvd2VkIHVuZGVyIGxpc3QgZWxlbWVudHMgYXMgdGhleSBhcmUgb25seSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdHRpbmcgdGV4dCBub2Rlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc1ByZXNlbnRhdGlvbmFsRWxlbWVudCh3YWxrQ2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHNldCB0byBwYXNzIGlmIHdlIGZpbmQgZGQgb3IgZHQgZWxlbWVudCwgaW4gdGhlIGNhc2Ugb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGVsZW1lbnQgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIHdlIHdpbGwgY2F0Y2ggaXQgaGVyZS4gaS5lLiBpbWcgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBub2RlTmFtZSA9PSBcImRkXCIgfHwgbm9kZU5hbWUgPT0gXCJkdFwiO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgZGVwZW5kaW5nIG9uIHdoaWNoIGlzIGZvdW5kIGZpcnN0IGFuZCBsYXN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPT0gXCJcIikgZmlyc3QgPSBub2RlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBub2RlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGRyZW4gPSB3YWxrQ2hpbGRyZW4ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgd2UgaGF2ZSBmb3VuZCBkdCBhbmQgZGQgZWxlbWVudHMgdW5kZXIgZGwgd2UgcGFzcyByaWdodCBhd2F5LlxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gZHQgb3IgZGQgZWxlbWVudCwgYnV0IGJ1bmNoIG9mIHByZXNlbnRhdGlvbmFsIGVsZW1lbnRzIHdlIG1hcmsgdGhpcyBhcyBhXG4gICAgICAgICAgICAgICAgLy8gcGFzcy4gSW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBhcmUgb3RoZXIgZWxlbWVudHMsIHN1Y2ggYXMgaW1nIHdlIHdpbGwgc3RpbGwgdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAocGFzc2VkICYmIGZpcnN0ID09IFwiZHRcIiAmJiBsYXN0ID09IFwiZGRcIikgfHwgKHBhc3NlZCAmJiBwcmVzZW50YXRpb25hbEZvdW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcImxpXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInVsXCIsIFwib2xcIiwgXCJkaXJcIiwgXCJtZW51XCJdKSAhPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFwiZGRcIiB8fCBub2RlTmFtZSA9PSBcImR0XCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiZGxcIikgIT0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB3YWxrQ2hpbGRyZW4gPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgICAgICAvLyBaZXJvIG9yIG1vcmUgbGkgZWxlbWVudHMgYXJlIHBlcm1pdHRlZCBpbnNpZGUgb2YgPG9sPiwgPHVsPiBvciA8bWVudT4gZWxlbWVudHMgbm93IGFzIHBlciB0aGUgaHRtbDUgc3BlYy4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlXG4gICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGFyZSB6ZXJvIGVsZW1lbnRzIHVuZGVyIHRoZSA8b2w+LCA8dWw+IG9yIDxtZW51Pi5cbiAgICAgICAgICAgIGlmICgobm9kZU5hbWUgPT0gXCJ1bFwiIHx8IG5vZGVOYW1lID09IFwib2xcIiB8fCBub2RlTmFtZSA9PSBcIm1lbnVcIikgJiYgKCFydWxlQ29udGV4dC5jaGlsZHJlbiB8fCBydWxlQ29udGV4dC5jaGlsZHJlbi5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbGlGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGtDaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoaWxlIHdhbGtpbmcgdGhyb3VnaCB0aGUgbGlzdCBlbGVtZW50cywgaWYgd2UgZmluZCBhIFxuICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZW50YXRpb25hbCBlbGVtZW50IHdlIHNraXAgY2hlY2tpbmcgYXMgcHJlc2VudGF0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgYXJlIGFsbG93ZWQgdW5kZXIgbGlzdCBlbGVtZW50cyBhcyB0aGV5IGFyZSBvbmx5IGZvclxuICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXR0aW5nIHRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc1ByZXNlbnRhdGlvbmFsRWxlbWVudCh3YWxrQ2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25hbEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpZiB0aGUgbm9kZSB0eXBlIGlzIGFueXRoaW5nIGJ1dCAxLCBvciBpbiB0aGUgY2FzZSB0aGF0IGl0IGlzIGEgbGkgZWxlbWVudC4gRm9yIGFueSBvdGhlciBub2RlIFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIGJlIGNhdWdodCBoZXJlIHRoYXQgZWxlbWVudCBpcyBub3QgYWxsb3dlZCB1bmRlciBsaXN0IG5vZGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZ1cnRoZXJtb3JlIGluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBlbGVtZW50IHdpdGggdGhlIHBhcmVudCBiZWluZyB1bC9vbCBkb24ndCBmbGFnIGEgdmlvbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHdhbGtDaGlsZHJlbi5ub2RlVHlwZSAhPSAxIHx8IHdhbGtDaGlsZHJlbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwibGlcIiB8fCAod2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJ0ZW1wbGF0ZVwiICYmIChub2RlTmFtZSA9PSBcInVsXCIgfHwgbm9kZU5hbWUgPT0gXCJvbFwiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGxpIGZvdW5kIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgZWxlbWVudCAobm9kZVR5cGU9MSkgaXMgYW4gbGkgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBsaUZvdW5kID0gbGlGb3VuZCB8fCAod2Fsa0NoaWxkcmVuLm5vZGVUeXBlID09IDEgJiYgd2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJsaVwiKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGl0IGhhcyBwYXNzZWQgYW5kIGFsc28gbGkgZWxlbWVudCBpcyBmb3VuZCB1bmRlciBsaXN0IG5vZGUsIHdlIHBhc3MgcmlnaHQgYXdheS5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIGxpIGVsZW1lbnQsIGJ1dCBidW5jaCBvZiBwcmVzZW50YXRpb25hbCBlbGVtZW50cyB3ZSBtYXJrIHRoaXMgYXMgYVxuICAgICAgICAgICAgICAgIC8vIHBhc3MuIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgYXJlIG90aGVyIGVsZW1lbnRzLCBzdWNoIGFzIGltZyB3ZSB3aWxsIHN0aWxsIHRyaWdnZXIgYSB2aW9sYXRpb24uXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gKHBhc3NlZCAmJiBsaUZvdW5kKSB8fCAocGFzc2VkICYmIHByZXNlbnRhdGlvbmFsRm91bmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IG1hcnF1ZWVfZWxlbV9hdm9pZDogUnVsZSA9IHtcbiAgICBpZDogXCJtYXJxdWVlX2VsZW1fYXZvaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTptYXJxdWVlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWFycXVlZV9UcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwibWFycXVlZV9lbGVtX2F2b2lkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtYXJxdWVlX2VsZW1fYXZvaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJTY3JvbGxpbmcgY29udGVudCBmb3VuZCB0aGF0IHVzZXMgdGhlIG9ic29sZXRlIDxtYXJxdWVlPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxtYXJxdWVlPiBlbGVtZW50IGlzIG9ic29sZXRlIGFuZCBzaG91bGQgbm90IGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9hbHRfYnJpZWY6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYWx0X2JyaWVmXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2FsdF0sIGRvbTphcHBsZXRbYWx0XSwgZG9tOmFyZWFbYWx0XSwgZG9tOmVtYmVkW2FsdF0sIGRvbTppbnB1dFt0eXBlXVthbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfQWx0QnJpZWZcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYWx0X2JyaWVmLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJtZWRpYV9hbHRfYnJpZWYuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2FsdF9icmllZi5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVGV4dCBhbHRlcm5hdGl2ZSBpcyBtb3JlIHRoYW4gMTUwIGNoYXJhY3RlcnNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbHRlcm5hdGl2ZSB0ZXh0IGluICdhbHQnIGF0dHJpYnV0ZSBzaG91bGQgYmUgYnJpZWYgKDwxNTAgY2hhcmFjdGVycylcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBtYXhBbHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTUwLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgYWx0TGVuZ3RoID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKS5sZW5ndGg7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhbHRMZW5ndGggPD0gdmFsaWRhdGVQYXJhbXMubWF4QWx0LnZhbHVlO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1lZGlhX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFyZWFbYWx0XSwgZG9tOmVtYmVkW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9BdWRpb1ZpZGVvQWx0RmlsZW5hbWVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiRmlsZW5hbWUgdXNlZCBhcyBsYWJlbCBmb3IgZW1iZWRkZWQgYXVkaW8gb3IgdmlkZW9cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdWRpbyBvciB2aWRlbyBvbiB0aGUgcGFnZSBtdXN0IGhhdmUgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZSBtZWRpYSBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB1cmkgPSBcIlwiO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImFyZWFcIikge1xuICAgICAgICAgICAgdXJpID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXJpID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB1cmkgPSBcIlwiO1xuICAgICAgICBsZXQgZXh0ID0gQ29tbW9uVXRpbC5nZXRGaWxlRXh0KHVyaSk7XG4gICAgICAgIGxldCBpc0F1ZFZpZCA9IGV4dC5sZW5ndGggIT0gMCAmJiAoQ29tbW9uVXRpbC5pc0F1ZGlvRXh0KGV4dCkgfHwgQ29tbW9uVXRpbC5pc1ZpZGVvRXh0KGV4dCkpO1xuICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFpc0F1ZFZpZCB8fCAoYWx0VGV4dC5sZW5ndGggPiAwICYmIGFsdFRleHQuaW5kZXhPZihleHQpID09IC0xKTtcblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfYXVkaW9fdHJhbnNjcmliZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYXVkaW9fdHJhbnNjcmliZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpiZ3NvdW5kLCBkb206YVtocmVmXSwgZG9tOmFyZWFbaHJlZl0sIGRvbTplbWJlZCwgZG9tOm9iamVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX0F1ZGlvVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfYXVkaW9fdHJhbnNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJQcm92aWRlIHRyYW5zY3JpcHRzIGZvciBhdWRpbyBmaWxlc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkF1ZGlvIGluZm9ybWF0aW9uIHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBpbiB0ZXh0IGZvcm1cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGxldCB0aGlzTm9kZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aGlzTm9kZSA9PSBcImJnc291bmRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc0F1ZGlvT2JqRW1iZWRMaW5rKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDsgLy8gT3V0IG9mIFNjb3BlXG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpwYXJhbVtuYW1lPWF1dG9wbGF5XSwgZG9tOnBhcmFtW25hbWU9YXV0b3N0YXJ0XSwgZG9tOmVtYmVkW2ZsYXNodmFyc10sIGRvbTplbWJlZFtzcmNdLCBkb206KlthdXRvc3RhcnQ9dHJ1ZV0sIGRvbToqW2F1dG9zdGFydD0xXSwgZG9tOmJnc291bmRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9FbWJlZF9BdXRvU3RhcnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZXJlIGlzIGEgbWVjaGFuaXNtIHRvIHBhdXNlIG9yIHN0b3AgYW5kIGNvbnRyb2wgdGhlIHZvbHVtZSBmb3IgdGhlIGF1ZGlvIHRoYXQgcGxheXMgYXV0b21hdGljYWxseVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk1lY2hhbmlzbSBtdXN0IGJlIGF2YWlsYWJsZSB0byBwYXVzZSBvciBzdG9wIGFuZCBjb250cm9sIHRoZSB2b2x1bWUgb2YgdGhlIGF1ZGlvIHRoYXQgcGxheXMgYXV0b21hdGljYWxseVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiYmdzb3VuZFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcInBhcmFtXCIpIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSlcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidmFsdWVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNvbnRlbnQuaW5kZXhPZihcIjA7XCIpID09IDAgfHxcbiAgICAgICAgICAgICAgICAhKGNvbnRlbnQuaW5kZXhPZihcInRydWVcIikgIT0gLTEgfHwgY29udGVudC5pbmRleE9mKFwiMVwiKSAhPSAtMSk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJlbWJlZFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImZsYXNodmFyc1wiKSkge1xuICAgICAgICAgICAgICAgIGxldCBzdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJmbGFzaHZhcnNcIik7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9dHJ1ZVwiKSA9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBzdHIuaW5kZXhPZihcImF1dG9zdGFydD0xXCIpID09IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJzcmNcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PXRydWVcIikgPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9MVwiKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImF1dG9zdGFydFwiKSkge1xuICAgICAgICAgICAgbGV0IHZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImF1dG9zdGFydFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcGFzc2VkID0gdmFsICE9ICd0cnVlJyAmJiB2YWwgIT0gJzEnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206YXVkaW8sIGRvbTp2aWRlb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BdWRpb19WaWRlb19UcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBtZWRpYSB1c2luZyA8YXVkaW8+IGFuZC9vciA8dmlkZW8+IGVsZW1lbnRzIGhhdmUga2V5Ym9hcmQgYWNjZXNzaWJsZSBjb250cm9sc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk1lZGlhIHVzaW5nIDxhdWRpbz4gYW5kL29yIDx2aWRlbz4gZWxlbWVudHMgbXVzdCBoYXZlIGtleWJvYXJkIGFjY2Vzc2libGUgY29udHJvbHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImF1ZGlvXCIgfHwgbm9kZU5hbWUgPT09IFwidmlkZW9cIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfbGl2ZV9jYXB0aW9uZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfbGl2ZV9jYXB0aW9uZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTplbWJlZCwgZG9tOm9iamVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX1ZpZGVvT2JqZWN0VHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfbGl2ZV9jYXB0aW9uZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2xpdmVfY2FwdGlvbmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgY2FwdGlvbnMgYXJlIHByb3ZpZGVkIGZvciBsaXZlIG1lZGlhIChzdHJlYW1pbmcgdmlkZW8gd2l0aCBhdWRpbylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJMaXZlIG1lZGlhIChzdHJlYW1pbmcgdmlkZW8gd2l0aCBhdWRpbykgc2hvdWxkIGhhdmUgY2FwdGlvbnMgZm9yIGF1ZGlvIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFDb21tb25VdGlsLmlzVmlkZW9PYmpFbWJlZExpbmsocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfdHJhY2tfYXZhaWxhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFbaHJlZl0sIGRvbTphcmVhW2hyZWZdLCBkb206YXBwbGV0LCBkb206ZW1iZWQsIGRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9WaWRlb1JlZmVyZW5jZVRyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfdHJhY2tfYXZhaWxhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgYXZhaWxhYmlsaXR5IG9mIGEgdXNlci1zZWxlY3RhYmxlIGF1ZGlvIHRyYWNrIHdpdGggZGVzY3JpcHRpb24gb2YgdmlzdWFsIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcmUtcmVjb3JkZWQgbWVkaWEgc2hvdWxkIGhhdmUgYW4gYXVkaW8gdHJhY2sgdGhhdCBkZXNjcmliZXMgdmlzdWFsIGluZm9ybWF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuM1wiLCBcIjEuMi41XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImFwcGxldFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhc3NlZCA9ICFDb21tb25VdGlsLmlzVmlkZW9PYmpFbWJlZExpbmsocnVsZUNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZXRhX3JlZGlyZWN0X29wdGlvbmFsOiBSdWxlID0ge1xuICAgIGlkOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWxcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW2h0dHAtZXF1aXZdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfTWV0YV9SZWRpcmVjdFplcm9cIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwiZmFpbF9sb25ncmVmcmVzaFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbC5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSBzaG91bGQgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aXRob3V0IHdhcm5pbmcgb3Igb3B0aW9uIHRvIHR1cm4gaXQgb2ZmIG9yIGFkanVzdCB0aGUgdGltZSBsaW1pdFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcIkNoZWNrIHBhZ2UgZG9lcyBub3QgYXV0b21hdGljYWxseSByZWZyZXNoIHdpdGhvdXQgd2FybmluZyBvciBvcHRpb25zXCIsXG4gICAgICAgICAgICBcImZhaWxfbG9uZ3JlZnJlc2hcIjogXCJDaGVjayBwYWdlIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aXRob3V0IHdhcm5pbmcgb3Igb3B0aW9uc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGRlcHJlY2F0ZSBXQ0FHIEFBQVxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4yLjRcIiwgXCIzLjIuNVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjIuNFwiLCBcIjMuMi41XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIC8vIFJlbW92ZWQgQUNUIGJpc3o1OCBBQUFcbiAgICAvKiphY3Q6IFt7IFxuICAgICAgICBcImJjNjU5YVwiIDoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwicGFzc1wiXG4gICAgICAgIH1cbiAgICB9XSwqL1xuICAgIGFjdDogWyBcImJpc3o1OFwiXSwgIC8vIGZhaWwgZXZlbiBpZiBhIHBhZ2UgaXMgcmVkaXJlY3RlZCBhZnRlciBtb3JlIHRoYW4gMjAgaG91cnMgKDcyMDApXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJodHRwLWVxdWl2XCIpLnRvTG93ZXJDYXNlKCkgIT09ICdyZWZyZXNoJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2MpIHJldHVybjtcblxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgcnVsZSBhbHJlYWR5IHBhc3NlZCBvciBmYWlsZWQ6IG9ubHkgdGhlIGZpcnN0IG9uZSB0cmlkZGVycyBpZiBtdWx0aXBsZVxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsX2RvbmVcIiwgZmFsc2UpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuXG4gICAgICAgIGxldCBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIWNvbnRlbnQgfHwgY29udGVudC50cmltKCkubGVuZ3RoID09PTApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgdGltZTpudW1iZXIgPSAtMTtcbiAgICAgICAgaWYgKGNvbnRlbnQubWF0Y2goL15cXGQrJC8pKSBcbiAgICAgICAgICAgIHRpbWUgPSBwYXJzZUludChjb250ZW50KTtcbiAgICAgICAgZWxzZSBpZiAoY29udGVudC5tYXRjaCgvXlxcZCs7LykpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBjb250ZW50LmluZGV4T2YoXCI7XCIpO1xuICAgICAgICAgICAgdGltZSA9IHBhcnNlSW50KGNvbnRlbnQuc3Vic3RyaW5nKDAsIHBvcykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEludmFsaWQgY29udGVudCBmaWVsZFxuICAgICAgICBpZiAodGltZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsX2RvbmVcIiwgdHJ1ZSk7XG4gICAgICAgIGlmICh0aW1lID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgZWxzZSBpZiAodGltZSA8IDcyMDAxKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbFwiKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbG9uZ3JlZnJlc2hcIik7ICAgIFxuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1ldGFfcmVmcmVzaF9kZWxheTogUnVsZSA9IHtcbiAgICBpZDogXCJtZXRhX3JlZnJlc2hfZGVsYXlcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW2h0dHAtZXF1aXZdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWV0YV9SZWZyZXNoXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9yZWZyZXNoXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZXRhX3JlZnJlc2hfZGVsYXkuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwibWV0YV9yZWZyZXNoX2RlbGF5Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3JlZnJlc2hcIjogXCJtZXRhX3JlZnJlc2hfZGVsYXkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2VzIHNob3VsZCBub3QgcmVmcmVzaCBhdXRvbWF0aWNhbGx5XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJQYWdlcyBkbyBub3QgcmVmcmVzaCBhdXRvbWF0aWNhbGx5XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9yZWZyZXNoXCI6IFwiVmVyaWZ5IHBhZ2UgaXMgbm90IGJlaW5nIGNhdXNlZCB0byByZWZyZXNoIGF1dG9tYXRpY2FsbHlcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICAvL2FjdDogWyBcImJpc3o1OFwiLCBcImJjNjU5YVwiIF0sXG4gICAgYWN0OiBbIFwiYmM2NTlhXCIgXSwgIC8vIHBhc3MgaWYgYSBwYWdlIGlzIHJlZGlyZWN0ZWQgYWZ0ZXIgbW9yZSB0aGFuIDIwIGhvdXJzICg3MjAwKVxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJodHRwLWVxdWl2XCIpLnRvTG93ZXJDYXNlKCkgIT09ICdyZWZyZXNoJylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykgcmV0dXJuO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBydWxlIGFscmVhZHkgcGFzc2VkOiB0aGUgZmlyc3Qgb25lIHRha2VzIHByaW9yaXR5XG4gICAgICAgIGlmIChDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIm1ldGFfcmVmcmVzaF9kZWxheV9kb25lXCIsIGZhbHNlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIWNvbnRlbnQgfHwgY29udGVudC50cmltKCkubGVuZ3RoID09PTApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgdGltZTpudW1iZXIgPSAtMTtcbiAgICAgICAgaWYgKGNvbnRlbnQubWF0Y2goL15cXGQrJC8pKSBcbiAgICAgICAgICAgIHRpbWUgPSBwYXJzZUludChjb250ZW50KTtcbiAgICAgICAgZWxzZSBpZiAoY29udGVudC5tYXRjaCgvXlxcZCs7LykpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBjb250ZW50LmluZGV4T2YoXCI7XCIpO1xuICAgICAgICAgICAgdGltZSA9IHBhcnNlSW50KGNvbnRlbnQuc3Vic3RyaW5nKDAsIHBvcykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEludmFsaWQgY29udGVudCBmaWVsZFxuICAgICAgICBpZiAodGltZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJtZXRhX3JlZnJlc2hfZGVsYXlfZG9uZVwiLCB0cnVlKTtcbiAgICAgICAgaWYgKHRpbWUgPT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfcmVmcmVzaFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IG1ldGFfdmlld3BvcnRfem9vbWFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWV0YV92aWV3cG9ydF96b29tYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOm1ldGFbbmFtZV1bY29udGVudF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIm1ldGFfdmlld3BvcnRfem9vbVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfem9vbWFibGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwibWV0YV92aWV3cG9ydF96b29tYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF96b29tYWJsZVwiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgc2hvdWxkIG5vdCBwcmV2ZW50IHRoZSBicm93c2VyIHpvb21pbmcgdGhlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgZG9lcyBub3QgcHJldmVudCB0aGUgYnJvd3NlciB6b29taW5nIHRoZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF96b29tYWJsZVwiOiBcIkNvbmZpcm0gdGhlICdtZXRhW25hbWU9dmlld3BvcnRdJyB3aXRoIFxcXCJ7MH1cXFwiIGNhbiBiZSB6b29tZWQgYnkgdXNlclwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjRcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiYjRmMGMzXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3pvb21hYmxlXCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpLnRvTG93ZXJDYXNlKCkgIT09ICd2aWV3cG9ydCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gbmVpdGhlciBtYXhpbXVtLXNjYWxlIG5vciB1c2VyLXNjYWxhYmxlIChkZWZhdWx0IHllcylcbiAgICAgICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudHJpbSgpID09PSAnJyB8fCAoIWNvbnRlbnQuaW5jbHVkZXMoJ21heGltdW0tc2NhbGUnKSAmJiAhY29udGVudC5pbmNsdWRlcygndXNlci1zY2FsYWJsZScpKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCB1c2VyX21zZyA9IG51bGw7XG4gICAgICAgIGxldCBtYXhfbXNnID0gbnVsbDtcbiAgICAgICAgY29uc3QgcHJvcHMgPSBjb250ZW50LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgbGV0IHVzZXJfc2NhbGVfdmFsdWUgPSAneWVzJztcbiAgICAgICAgbGV0IG1heGltdW1fc2NhbGVfdmFsdWUgPSAnMi4wJztcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCBwaWVjZXMgPSBwcm9wLnRyaW0oKS5zcGxpdCgnPScpO1xuICAgICAgICAgICAgaWYgKHBpZWNlcy5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wLmluY2x1ZGVzKCd1c2VyLXNjYWxhYmxlJykpIHtcbiAgICAgICAgICAgICAgICB1c2VyX21zZyA9IHByb3A7XG4gICAgICAgICAgICAgICAgdXNlcl9zY2FsZV92YWx1ZSA9IHBpZWNlc1sxXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXJfc2NhbGVfdmFsdWUuc3RhcnRzV2l0aChcIidcIikgfHwgdXNlcl9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJfc2NhbGVfdmFsdWUgPSB1c2VyX3NjYWxlX3ZhbHVlLnN1YnN0cmluZygxLCB1c2VyX3NjYWxlX3ZhbHVlLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcC5pbmNsdWRlcygnbWF4aW11bS1zY2FsZScpKSB7XG4gICAgICAgICAgICAgICAgbWF4X21zZyA9IHByb3A7XG4gICAgICAgICAgICAgICAgbWF4aW11bV9zY2FsZV92YWx1ZSA9IHBpZWNlc1sxXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKG1heGltdW1fc2NhbGVfdmFsdWUuc3RhcnRzV2l0aChcIidcIikgfHwgbWF4aW11bV9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heGltdW1fc2NhbGVfdmFsdWUgPSBtYXhpbXVtX3NjYWxlX3ZhbHVlLnN1YnN0cmluZygxLCBtYXhpbXVtX3NjYWxlX3ZhbHVlLmxlbmd0aCAtIDEpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWUgPSBOdW1iZXIodXNlcl9zY2FsZV92YWx1ZSk7XG4gICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPj0gMSB8fCB2YWx1ZSA8PSAtMSkgdXNlcl9zY2FsZV92YWx1ZSA9ICd5ZXMnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1heGltdW1fc2NhbGUgPSAyLjA7XG4gICAgICAgIHZhbHVlID0gTnVtYmVyKG1heGltdW1fc2NhbGVfdmFsdWUpO1xuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkgbWF4aW11bV9zY2FsZSA9IDIuMDtcbiAgICAgICAgICAgIGVsc2UgbWF4aW11bV9zY2FsZSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG1heGltdW1fc2NhbGVfdmFsdWUgPT09ICd5ZXMnKSBtYXhpbXVtX3NjYWxlID0gMS4wO1xuICAgICAgICAgICAgZWxzZSBtYXhpbXVtX3NjYWxlID0gMC4xO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXNlci1zY2FsYWJsZSBpcyBub3Qgc2V0IHRvICd5ZXMnLCBpZ25vcmUgbWF4aW11bV9zY2FsZVxuICAgICAgICBpZiAodXNlcl9zY2FsZV92YWx1ZSAhPT0gJ3llcycpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3pvb21hYmxlXCIsIFt1c2VyX21zZ10pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVzZXItc2NhbGFibGUgaXMgJ3llcycsIGJ1dCBtYXhpbXVtX3NjYWxlIGlzIHRvbyBzbWFsbFxuICAgICAgICBpZiAobWF4aW11bV9zY2FsZSA8IDIuMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfem9vbWFibGVcIiwgW21heF9tc2ddKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBub2VtYmVkX2NvbnRlbnRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpub2VtYmVkXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX05vZW1iZWRfSGFzQ29udGVudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQWRkIGRlc2NyaXB0aXZlIHRleHQgdG8gdGhlIDxub2VtYmVkPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPG5vZW1iZWQ+IGVsZW1lbnRzIHNob3VsZCBjb250YWluIGRlc2NyaXB0aXZlIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBvYmplY3RfdGV4dF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwib2JqZWN0X3RleHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206b2JqZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfT2JqZWN0X0hhc1RleHRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIjogXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm9iamVjdF90ZXh0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJvYmplY3RfdGV4dF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIjogXCJvYmplY3RfdGV4dF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxvYmplY3Q+IGVsZW1lbnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZSBmb3IgdGhlIGNvbnRlbnQgcmVuZGVyZWQgYnkgdGhlIG9iamVjdFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiPG9iamVjdD4gZWxlbWVudCBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiOiBcIkFuIDxvYmplY3Q+IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiOGZjM2I2XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gRGV0ZWN0IGlmIHRoaXMgb2JqZWN0IGlzIG9mIHR5cGUgdGV4dCwgYnkgY2hlY2tpbmcgdGhlIG9iamVjdCB0eXBlIGluIHRoZSBjYXNlIGl0IGlzIHRleHQgdGhlbiBkbyBub3QgdHJpZ2dlciB0aGlzIHJ1bGVcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgJiYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikpLmluZGV4T2YoXCJ0ZXh0XCIpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZDogaW5jbHVkaW5nICdwcmVzZW50YXRpb24nLCAnbm9uZScsICdhcHBsaWNhdGlvbicsICdkb2N1bWVudCcgb3IgJ2ltZydcbiAgICAgICAgLy8gdGhpcyBjYXNlIHdpbGwgYmUgY292ZXJlZCBpbiBvdGhlciBydWxlc1xuICAgICAgICBsZXQgcm9sZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIik7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBlciBBQ1QsIGlnbm9yZSBlbWJlZGRlZCBIVE1MIGZpbGVzXG4gICAgICAgIGxldCBkYXRhID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZGF0YVwiKTtcbiAgICAgICAgbGV0IGV4dCA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09IHR5cGVvZiBcIlwiID8gZGF0YS5zdWJzdHJpbmcoZGF0YS5sYXN0SW5kZXhPZihcIi5cIikpIDogXCJcIjtcbiAgICAgICAgaWYgKGV4dCA9PT0gXCIuaHRtbFwiIHx8IGV4dCA9PT0gXCIuaHRtXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcGFzc2VkID0gcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAvL2xldCBwYXNzZWQgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBbmNlc3RvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3JcIjtcblxuZXhwb3J0IGNvbnN0IHBhZ2VfdGl0bGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcInBhZ2VfdGl0bGVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0RvY19IYXNUaXRsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHBhZ2Ugc2hvdWxkIGhhdmUgYSB0aXRsZSB0aGF0IGNvcnJlY3RseSBpZGVudGlmaWVzIHRoZSBzdWJqZWN0IG9mIHRoZSBwYWdlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk1pc3NpbmcgPGhlYWQ+IGVsZW1lbnQgc28gdGhlcmUgY2FuIGJlIG5vIDx0aXRsZT4gZWxlbWVudCBwcmVzZW50XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIk1pc3NpbmcgPHRpdGxlPiBlbGVtZW50IGluIDxoZWFkPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlRoZSA8dGl0bGU+IGVsZW1lbnQgaXMgZW1wdHkgKG5vIGlubmVySFRNTClcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiMjc3OWE1XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUaGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgaW5zaWRlIGEgcHJlc2VudGF0aW9uYWwgZnJhbWVcbiAgICAgICAgaWYgKEFuY2VzdG9yVXRpbC5pc0ZyYW1lKGNvbnRleHRIaWVyYXJjaGllcykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIE5vZGU7XG4gICAgICAgIC8vIEZpcnN0LCBmaW5kIHRoZSBoZWFkIGVsZW1lbnRcbiAgICAgICAgbGV0IGZpbmRIZWFkID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgZmluZFRpdGxlID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKGZpbmRIZWFkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChmaW5kSGVhZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaGVhZFwiKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZmluZEhlYWQgPSBmaW5kSGVhZC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICBsZXQgcG9zc2libGVUaXRsZXMgPSAocnVsZUNvbnRleHQgYXMgRWxlbWVudCkucXVlcnlTZWxlY3RvckFsbChcInRpdGxlXCIpO1xuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBwb3NzaWJsZVRpdGxlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuZ2V0QW5jZXN0b3IocG9zc2libGVUaXRsZXNbaWR4XSwgW1wic3ZnXCJdKSkge1xuICAgICAgICAgICAgICAgIGZpbmRUaXRsZSA9IHBvc3NpYmxlVGl0bGVzW2lkeF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbmRIZWFkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIWZpbmRUaXRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaW5kVGl0bGUgPT09IG51bGwpIHsgLy8gZG9uJ3QgaGF2ZSB0aXRsZSBzZWNvbmQgUG9GXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB3ZSBnZXQgaGVyZSB3ZSBoYXZlIDxoZWFkPiBhbmQgPHRpdGxlPlxuXG4gICAgICAgIGlmIChmaW5kVGl0bGUgIT0gbnVsbCAmJiBDb21tb25VdGlsLmdldElubmVyVGV4dChmaW5kVGl0bGUpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7IC8vIDx0aXRsZT4gaGFzIG5vIGlubmVySFRNTCB0aGlyZCBQb0ZcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHBhZ2VfdGl0bGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwicGFnZV90aXRsZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmhlYWQgZG9tOnRpdGxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGl0bGVfVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiUG90ZW50aWFsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhZ2VfdGl0bGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzFcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF8xXCI6IFwiUGFnZSA8dGl0bGU+IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiVmVyaWZ5IHRoYXQgdXNpbmcgdGhlIGZpbGVuYW1lIGFzIHRoZSBwYWdlIDx0aXRsZT4gdmFsdWUgaXMgZGVzY3JpcHRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlIDx0aXRsZT4gc2hvdWxkIGJlIGEgZGVzY3JpcHRpdmUgdGl0bGUsIHJhdGhlciB0aGFuIGEgZmlsZW5hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgbGV0IHRpdGxlU3RyID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpLnRyaW0oKTtcblxuICAgICAgICAvLyBhbGxvdyAuY29tLCAubmV0IGFuZCAub3JnXG4gICAgICAgIGxldCB0aXRsZVN0ckxvd2VyY2FzZSA9IHRpdGxlU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aXRsZVN0ckxvd2VyY2FzZS5pbmNsdWRlcyhcIi5jb21cIikgfHwgdGl0bGVTdHJMb3dlcmNhc2UuaW5jbHVkZXMoXCIubmV0XCIpIHx8IHRpdGxlU3RyTG93ZXJjYXNlLmluY2x1ZGVzKFwiLm9yZ1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFt0aXRsZVN0cl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpdGxlU3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBjb3ZlcmVkIGJ5IHBhZ2VfdGl0bGVfZXhpc3RzXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsvL1J1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBhc3NlZCA9ICEvXlxcUypcXC5bYS16QS1aXXsxLDR9KD8hLil8Xmh0dHBzPzpcXC9cXC9cXFMqL2kudGVzdCh0aXRsZVN0cik7XG5cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFt0aXRsZVN0cl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206KltvbmZvY3VzXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1NjcmlwdF9Gb2N1c0JsdXJzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSBzY3JpcHQgZG9lcyBub3QgcmVtb3ZlIGZvY3VzIGZyb20gY29udGVudCB0aGF0IG5vcm1hbGx5IHJlY2VpdmVzIGZvY3VzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2NyaXB0aW5nIG11c3Qgbm90IHJlbW92ZSBmb2N1cyBmcm9tIGNvbnRlbnQgdGhhdCBub3JtYWxseSByZWNlaXZlcyBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIiwgXCIyLjQuN1wiLCBcIjMuMi4xXCJdLCAvL21hdGNoIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gaGVscFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmZvY3VzXCIpLmluZGV4T2YoXCIuYmx1cihcIikgPT0gLTE7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRfb25jbGlja19hdm9pZDogUnVsZSA9IHtcbiAgICBpZDogXCJzY3JpcHRfb25jbGlja19hdm9pZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25jbGlja11cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcInNjcmlwdF9vbmNsaWNrX21pc3VzZVwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TY3JpcHRfT25jbGlja0hUTUwyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9vbmNsaWNrX2F2b2lkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfb25jbGlja19hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X29uY2xpY2tfYXZvaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0ICdvbmNsaWNrJyBldmVudHMgYXJlIG5vdCB1c2VkIGluIHNjcmlwdCB0byBlbXVsYXRlIGEgbGlua1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcmlwdHMgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGVtdWxhdGUgbGlua3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLCAvL2hlbHAgYW5kIG1hdGNoIG1hcHBpbmcgdG8gMi4xLjEgb25seSBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIHRoaXMgZm9yIFNWRyBlbGVtZW50IGZvciBub3cgdW50aWwgYSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUgKGJ5IFJpY2gpXG4gICAgICAgIC8vIHRvIHN1cHBvcnQgU1ZHIGF0IGEgcG9pbnQgd2hlbiB0aGUgU1ZHIGExMXkgc3BlYyBpcyByZWFkeS5cbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwic3ZnXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBhcmlhLXJvbGUgc3BlY2lmaWVkLCBkb24ndCB0cmlnZ2VyIHRoaXMuXG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInJvbGVcIikpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IG5vZGVOYW1lID09IFwiYVwiIHx8IG5vZGVOYW1lID09IFwiYXJlYVwiIHx8IG5vZGVOYW1lID09IFwiaW5wdXRcIjtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHNjcmlwdF9vbmNsaWNrX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJzY3JpcHRfb25jbGlja19taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU2NyaXB0X09uY2xpY2tIVE1MMVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfb25jbGlja19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNjcmlwdF9vbmNsaWNrX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3NzaWJsZSB1c2Ugb2YgYSBzY3JpcHQgdG8gZW11bGF0ZSBhIGxpbmtcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTY3JpcHRzIHNob3VsZCBub3QgYmUgdXNlZCB0byBlbXVsYXRlIGxpbmtzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSwgLy9oZWxwIGFuZCBtYXRjaCBtYXBwaW5nIHRvIDIuMS4xIG9ubHkgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBmYWlsU3Vic3RyaW5nOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIi5hc3BcIiwgXCIuYXNweFwiLCBcIi5jZm1cIiwgXCIuY2ZtbFwiLCBcIi5jZ2lcIiwgXCIuaHRtXCIsIFwiLmh0bWxcIiwgXCIuc2h0bVwiLFxuICAgICAgICAgICAgICAgICAgICBcIi5zaHRtbFwiLCBcIi5waHBcIiwgXCIucGxcIiwgXCIucHlcIiwgXCIuc2h0bVwiLCBcIi5zaHRtbFwiLCBcIi54aHRtbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImxvY2F0aW9uLmhyZWZcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXJpYS1yb2xlIHNwZWNpZmllZCwgZG9uJ3QgdHJpZ2dlciB0aGlzLlxuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJyb2xlXCIpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGEgb3IgYXJlYSwgZG9uJ3QgdHJpZ2dlciBpZiB0aGVyZSdzIGFuIGhyZWYuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKG5vZGVOYW1lID09IFwiYVwiIHx8IG5vZGVOYW1lID09IFwiYXJlYVwiKSAmJiBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImhyZWZcIikpO1xuXG4gICAgICAgIC8vIElmIHRoZSBndWFyZHMgZmFpbGVkLCBjaGVjayB0byBzZWUgaWYgdGhleSdyZSBsb29raW5nIGF0IGxpbmtzXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBsZXQgZmFpbFN1YnN0cmluZyA9IHZhbGlkYXRlUGFyYW1zLmZhaWxTdWJzdHJpbmcudmFsdWU7O1xuICAgICAgICAgICAgbGV0IG9uY2xpY2sgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgZmFpbFN1YnN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IG9uY2xpY2suaW5kZXhPZihmYWlsU3Vic3RyaW5nW2ldKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IHNjcmlwdF9zZWxlY3RfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU2VsZWN0X05vQ2hhbmdlQWN0aW9uXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfc2VsZWN0X3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X3NlbGVjdF9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IG5vIGNoYW5nZSBvZiBjb250ZXh0IG9yIGFjdGlvbiBvY2N1cnMgd2hlbiBzZWxlY3Rpb24gb3B0aW9ucyBpbiB0aGlzIGNvbXBvbmVudCByZWNlaXZlIGZvY3VzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTm8gY2hhbmdlcyBvZiBjb250ZXh0IHNob3VsZCBvY2N1ciB3aGVuIGEgc2VsZWN0aW9uIHZhbHVlIHJlY2VpdmVzIGZvY3VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25jaGFuZ2VcIikgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIik7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzZWxlY3Rfb3B0aW9uc19ncm91cGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInNlbGVjdF9vcHRpb25zX2dyb3VwZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpzZWxlY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9TZWxlY3RfSGFzT3B0R3JvdXBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiR3JvdXAgb2YgcmVsYXRlZCBvcHRpb25zIG1heSBuZWVkIDxvcHRncm91cD5cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJHcm91cHMgb2YgcmVsYXRlZCBvcHRpb25zIHdpdGhpbiBhIHNlbGVjdGlvbiBsaXN0IHNob3VsZCBiZSBncm91cGVkIHdpdGggPG9wdGdyb3VwPlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgcGFyYW1OdW1PcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDEwLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlcyB3aGVyZSBvcHRncm91cCBpcyBoaWRkZW4sIHdoaWNoIHNob3VsZCB0cmlnZ2VyIGEgdmlvbGF0aW9uc1xuICAgICAgICAvLyBidXQgaW4gdGhlIGNhc2UgdGhhdCBDaGVjayBoaWRkZW4gb3B0aW9uIGlzIHNldCB0aGVuIHNob3VsZCBub3QgdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0Q2hpbGRCeVRhZ0hpZGRlbihydWxlQ29udGV4dCwgXCJvcHRncm91cFwiLCBmYWxzZSwgdHJ1ZSkubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHJ1bGVDb250ZXh0LCBcIm9wdGlvblwiLCBmYWxzZSwgdHJ1ZSkubGVuZ3RoIDw9XG4gICAgICAgICAgICB2YWxpZGF0ZVBhcmFtcy5wYXJhbU51bU9wdGlvbnMudmFsdWU7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBza2lwX21haW5fZGVzY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcInNraXBfbWFpbl9kZXNjcmliZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJza2lwX21haW5fZXhpc3RzXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0JvZHlfRmlyc3RBQ29udGFpbnNTa2lwVGV4dF9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgaWYgdGhpcyBoeXBlcmxpbmsgc2tpcHMgY29udGVudCwgdGhlIGRlc2NyaXB0aW9uIGNvbW11bmljYXRlcyB3aGVyZSBpdCBsaW5rcyB0b1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBkZXNjcmlwdGlvbiBvZiBhIGh5cGVybGluayB1c2VkIHRvIHNraXAgY29udGVudCBtdXN0IGNvbW11bmljYXRlIHdoZXJlIGl0IGxpbmtzIHRvXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgcGFyYW1Ta2lwVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJza2lwXCIsIFwianVtcFwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBHZXQgdGhlIGFuY2hvcnMgb24gdGhlIHBhZ2VcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGxhbmRtYXJrcyBmaXJzdFxuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4ocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgW1wiYXBwbGljYXRpb25cIiwgXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIixcbiAgICAgICAgICAgICAgICBcImZvcm1cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcInNlYXJjaFwiXG4gICAgICAgICAgICBdLCB0cnVlLCB0cnVlKS5sZW5ndGggPiAwKTtcbiAgICAgICAgfVxuICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHsgLy8gTm8gbGFuZG1hcmtzLCBjaGVjayBmb3Igc2tpcCBsaW5rc1xuICAgICAgICAgICAgbGV0IGxpbmtzID0gZG9jLmxpbmtzO1xuICAgICAgICAgICAgLy8gU2tpcCBsaW5rIHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lIG9uIHRoZSBwYWdlIHdpdGggYW4gaHJlZiBhdHRyaWJ1dGUgKGkuZS4sIGxpbmtzWzBdKVxuICAgICAgICAgICAgLy8gYWxzbyBpZiB0aGUgZmlyc3QgbGluayBpcyBoaWRkZW4gdGhlbiB3ZSBzaG91bGQgYWxzbyB0cmlnZ2VyIGEgdmlvbGF0aW9uLlxuICAgICAgICAgICAgaWYgKGxpbmtzICYmIGxpbmtzLmxlbmd0aCA+IDAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGxpbmtzWzBdKSkge1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0VGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGRvYy5saW5rc1swXSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgdmFsaWRhdGVQYXJhbXMucGFyYW1Ta2lwVGV4dC52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0ZXN0VGV4dC5pbmRleE9mKHZhbGlkYXRlUGFyYW1zLnBhcmFtU2tpcFRleHQudmFsdWVbaV0pICE9IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQW5jZXN0b3JVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBza2lwX21haW5fZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcInNraXBfbWFpbl9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQm9keV9GaXJzdEFTa2lwc19OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNraXBfbWFpbl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIHBhZ2UgZG9lcyBub3QgcHJvdmlkZSBhIHdheSB0byBxdWlja2x5IG5hdmlnYXRlIHRvIHRoZSBtYWluIGNvbnRlbnQgKEFSSUEgXFxcIm1haW5cXFwiIGxhbmRtYXJrIG9yIGEgc2tpcCBsaW5rKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2VzIG11c3QgcHJvdmlkZSBhIHdheSB0byBza2lwIGRpcmVjdGx5IHRvIHRoZSBtYWluIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGluc2lkZSBhIHByZXNlbnRhdGlvbmFsIGZyYW1lXG4gICAgICAgIGlmIChBbmNlc3RvclV0aWwuaXNQcmVzZW50YXRpb25GcmFtZShjb250ZXh0SGllcmFyY2hpZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBHZXQgdGhlIGFuY2hvcnMgb24gdGhlIHBhZ2VcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGxhbmRtYXJrcyBmaXJzdFxuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4ocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgW1wiYXBwbGljYXRpb25cIiwgXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIixcbiAgICAgICAgICAgICAgICBcImZvcm1cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcInNlYXJjaFwiXG4gICAgICAgICAgICBdLCB0cnVlLCB0cnVlKS5sZW5ndGggPiAwKTtcbiAgICAgICAgfVxuICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHsgLy8gTm8gbGFuZG1hcmtzLCBjaGVjayBmb3Igc2tpcCBsaW5rc1xuICAgICAgICAgICAgbGV0IGFuY2hvcnMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiYVwiKTtcblxuICAgICAgICAgICAgLy8gU2tpcCBhbmNob3Igc2hvdWxkIGJlIHRoZSBmaXJzdCBvbmUgb24gdGhlIHBhZ2Ugd2l0aCBhbiBocmVmIGF0dHJpYnV0ZVxuICAgICAgICAgICAgbGV0IHRlc3RBbmNob3IgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbmNob3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoYW5jaG9yc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdEFuY2hvciA9IGFuY2hvcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHVsbCBvdXQgdGhlIHRhcmdldCBpZFxuICAgICAgICAgICAgbGV0IHRhcmdldElkID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0ZXN0QW5jaG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgaHJlZlN0ciA9IHRlc3RBbmNob3IuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgaWR4ID0gaHJlZlN0ci5pbmRleE9mKFwiI1wiKTtcbiAgICAgICAgICAgICAgICBpZiAoaWR4ICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldElkID0gaHJlZlN0ci5zdWJzdHJpbmcoaWR4ICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGFuIGVsZW1lbnQgaWQgb3IgbmFtZWQgYW5jaG9yIG9uIHRoZSBwYWdlIHdpdGggdGhpc1xuICAgICAgICAgICAgLy8gdGFyZ2V0IGlkLlxuXG4gICAgICAgICAgICBpZiAodGFyZ2V0SWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGRvYy5nZXRFbGVtZW50QnlJZCh0YXJnZXRJZCkgIT0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yc1tpXS5oYXNBdHRyaWJ1dGUoXCJuYW1lXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzW2ldLmdldEF0dHJpYnV0ZShcIm5hbWVcIikgPT0gdGFyZ2V0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmVcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOipbc3R5bGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU3R5bGVfQmFja2dyb3VuZEltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGUgQ1NTIGJhY2tncm91bmQgaW1hZ2UgZG9lcyBub3QgY29udmV5IGltcG9ydGFudCBpbmZvcm1hdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkltYWdlcyBpbmNsdWRlZCBieSB1c2luZyBDU1MgYWxvbmUgbXVzdCBub3QgY29udmV5IGltcG9ydGFudCBpbmZvcm1hdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicmVsXCIpICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZXNoZWV0XCIpIHtcbiAgICAgICAgICAgIC8vIEV4dGVybmFsIHN0eWxlc2hlZXQgLSB0cmlnZ2VyXG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLnRyaWdnZXJPbmNlKHJ1bGVDb250ZXh0LCBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZVwiLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCAmJiBub2RlTmFtZSA9PT0gXCJzdHlsZVwiIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBsZXQgc3R5bGVUZXh0O1xuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpXG4gICAgICAgICAgICAgICAgc3R5bGVUZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHN0eWxlVGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgICAgICAgbGV0IGJnTWF0Y2hlcyA9IHN0eWxlVGV4dC5tYXRjaCgvYmFja2dyb3VuZDpbXjtdKi9nKTtcbiAgICAgICAgICAgIGlmIChiZ01hdGNoZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBiZ01hdGNoZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGJnTWF0Y2hlc1tpXS5pbmRleE9mKFwidXJsKFwiKSA9PT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG4vKipcbiAqIERlc2NyaXB0aW9uOiBUcmlnZ2VyIGlmIDpiZWZvcmUgYW5kIDphZnRlciBhcmUgdXNlZCBpbiBDU1MgKEludGVybmFsIGFuZCBFeHRlcm5hbCkgd2l0aCBjb250ZW50XG4gKiBPcmlnaW46IFdDQUcgMi4wIEY4N1xuICovXG5leHBvcnQgY29uc3Qgc3R5bGVfYmVmb3JlX2FmdGVyX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbTpsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU3R5bGVfQmVmb3JlQWZ0ZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXcuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkRvIG5vdCB1c2UgQ1NTICc6OmJlZm9yZScgYW5kICc6OmFmdGVyJyBwc2V1ZG8tZWxlbWVudHMgdG8gaW5zZXJ0IG5vbi1kZWNvcmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlICc6OmJlZm9yZScgYW5kICc6OmFmdGVyJyBwc2V1ZG8tZWxlbWVudHMgZG8gbm90IGluc2VydCBub24tZGVjb3JhdGl2ZSBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIC8vIFR1cm4gb2ZmIHRoZSBydWxlIGR1ZSB0byB0aGUgb2Jzb2xldGUgcmVxdWlyZW1lbnRcbiAgICAgICAgLy9pZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBpZDogW10sXG4gICAgICAgIG51bTogXCIxLjMuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgLy9jaGVjayBJbnRlcm5hbCBzdHlsZXMgICAgICAgIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICBsZXQgY3NzID0gQ1NTVXRpbC5nZXRDU1NTdHlsZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjc3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGJhZCBDU1NcbiAgICAgICAgICAgICAgICBpZiAoY3NzW2ldLnNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChjc3NbaV0uc2VsZWN0b3IuaW5kZXhPZihcIjpiZWZvcmVcIikgPT09IC0xICYmIGNzc1tpXS5zZWxlY3Rvci5pbmRleE9mKFwiOmFmdGVyXCIpID09PSAtMSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICEoXCJjb250ZW50XCIgaW4gY3NzW2ldLnZhbHVlcykgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpLmxlbmd0aCA9PT0gMCB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwiXFxcIlxcXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcIlxcJ1xcJ1wiIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJub25lXCIgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcImF0dHIoeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcImF0dHIoeSlcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIHNwZWNpYWwgcnVsZXMgaW4gdGhlIHN0eWxlc2hlZXRzXG4gICAgICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHBhc3NlZCAmJiBzdHlsZVJ1bGVJbmRleCA8IHN0eWxlUnVsZXMubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIEBtZWRpYSBydWxlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2hlY2sgJ2lmIChzdHlsZVJ1bGUgaW5zdGFuY2VvZiBDU1NNZWRpYVJ1bGUpJyBkb2Vzbid0IHdvcmsgd2hlbiBydW4gaW4gS2FybWEoYnV0IHdvcmtzIGluIERBUCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBsZXQncyBhY2Nlc3MgdGhlIHR5cGUgZGlyZWN0bHkgYXMgYSB3b3JrYXJvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVJbXBvcnRSdWxlOiBDU1NJbXBvcnRSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZS50eXBlICYmIHN0eWxlUnVsZS50eXBlID09PSA0IC8qIENTU1J1bGUuTUVESUFfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZU1lZGlhUnVsZSA9IHN0eWxlUnVsZSBhcyBDU1NNZWRpYVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhUnVsZXMgPSBzdHlsZU1lZGlhUnVsZS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbVJ1bGUgPSBtZWRpYVJ1bGVzW3JJbmRleF0gYXMgYW55OyAvLyBzZWxlY3RvclRleHQgbm90IHJlY29nbml6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IG1SdWxlLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydCBydWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVSdWxlLnR5cGUgJiYgc3R5bGVSdWxlLnR5cGUgPT09IDMgLyogQ1NTUnVsZS5JTVBPUlRfUlVMRSAqLyAmJiAoc3R5bGVJbXBvcnRSdWxlID0gc3R5bGVSdWxlIGFzIENTU0ltcG9ydFJ1bGUpLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHBhc3NlZCAmJiBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0ZWRSdWxlID0gcnVsZXNbckluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIEBtZWRpYSBydWxlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUudHlwZSAmJiBpbXBvcnRlZFJ1bGUudHlwZSA9PT0gNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVkaWFSdWxlcyA9IChpbXBvcnRlZFJ1bGUgYXMgQ1NTTWVkaWFSdWxlKS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBtSW5kZXggPSAwOyBtSW5kZXggPCBtZWRpYVJ1bGVzLmxlbmd0aDsgbUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtUnVsZSA9IG1lZGlhUnVsZXNbbUluZGV4XSBhcyBhbnk7IC8vIHNlbGVjdG9yVGV4dCBub3QgcmVjb2duaXplZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiBtUnVsZS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gbVJ1bGUuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuaW5kZXhPZihcIjpiZWZvcmVcIikgIT09IC0xIHx8IHJ1bGUuaW5kZXhPZihcIjphZnRlclwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBtUnVsZS5zdHlsZVsnY29udGVudCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKSAhPT0gXCJcXFwiXFxcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiXFwnXFwnXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHgpXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHkpXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChpbXBvcnRlZFJ1bGUgYXMgYW55KS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgKGltcG9ydGVkUnVsZSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSAoaW1wb3J0ZWRSdWxlIGFzIGFueSkuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdXBwb3J0IGJvdGggc2luZ2xlIGNvbG9uICg6KSBhbmQgZG91YmxlIGNvbG9uICg6OikgcHNldWRvICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuaW5kZXhPZihcIjpiZWZvcmVcIikgIT09IC0xIHx8IHJ1bGUuaW5kZXhPZihcIjphZnRlclwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAoaW1wb3J0ZWRSdWxlIGFzIGFueSkuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGV4dGVybmFsIHN0eWxlcyBcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibGlua1wiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicmVsXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVzaGVldFwiICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIikudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xuXG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVGcm9tTGluayA9IHJ1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIEBtZWRpYSBydWxlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVGcm9tTGluay50eXBlICYmIHJ1bGVGcm9tTGluay50eXBlID09PSA0IC8qIENTU1J1bGUuTUVESUFfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhUnVsZXMgPSAocnVsZUZyb21MaW5rIGFzIENTU01lZGlhUnVsZSkuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG1JbmRleCA9IDA7IHBhc3NlZCAmJiBtSW5kZXggPCBtZWRpYVJ1bGVzLmxlbmd0aDsgbUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1SdWxlID0gbWVkaWFSdWxlc1ttSW5kZXhdIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiBtUnVsZS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVTZWxUeHQgPSBtUnVsZS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlU2VsVHh0LmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlU2VsVHh0LmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBtUnVsZS5zdHlsZVsnY29udGVudCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiXFwnXFwnXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHkpXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChydWxlc1tySW5kZXhdIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIChydWxlc1tySW5kZXhdIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gKHJ1bGVzW3JJbmRleF0gYXMgYW55KS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBib3RoIHNpbmdsZSBjb2xvbiAoOikgYW5kIGRvdWJsZSBjb2xvbiAoOjopIHBzZXVkbyAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuaW5kZXhPZihcIjpiZWZvcmVcIikgIT09IC0xIHx8IHJ1bGUuaW5kZXhPZihcIjphZnRlclwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IChydWxlc1tySW5kZXhdIGFzIGFueSkuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2NvbG9yX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9jb2xvcl9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOipbc3R5bGVdLCBkb206Zm9udFtjb2xvcl0sIGRvbTpsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU3R5bGVfQ29sb3JTZW1hbnRpY3MxXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfY29sb3JfbWlzdXNlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX2NvbG9yX21pc3VzZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX2NvbG9yX21pc3VzZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJDb21iaW5lIGNvbG9yIGFuZCBkZXNjcmlwdGl2ZSBtYXJrdXAgdG8gY29udmV5IGluZm9ybWF0aW9uXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IGNvbG9yIGlzIG5vdCB1c2VkIGFzIHRoZSBvbmx5IHZpc3VhbCBtZWFucyBvZiBjb252ZXlpbmcgaW5mb3JtYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjEuNC4xXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgc3R5bGVUZXh0ID0gXCJcIjtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgLy8gY2hlY2sgaW1wb3J0XG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlSW1wb3J0UnVsZTogQ1NTSW1wb3J0UnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlLnR5cGUgJiYgc3R5bGVSdWxlLnR5cGUgPT09IDMgLyogQ1NTUnVsZS5JTVBPUlRfUlVMRSAqLyAmJiAoc3R5bGVJbXBvcnRSdWxlID0gc3R5bGVSdWxlIGFzIENTU0ltcG9ydFJ1bGUpLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydFJ1bGVzID0gc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgPyBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA6IHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBySW5kZXggPCBpbXBvcnRSdWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaVJ1bGUgPSBpbXBvcnRSdWxlc1tySW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVUZXh0ICs9IGlSdWxlLmNzc1RleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJzdHlsZVwiKSkge1xuICAgICAgICAgICAgc3R5bGVUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIgJiYgLy9jaGVjayBleHRlcm5hbCBzdHlsZXNcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicmVsXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVzaGVldFwiICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpLnRyaW0oKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVUZXh0ICs9IHJ1bGVzW3JJbmRleF0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIERlZmVjdCAxMDIyOiBGaW5kIHVzZXMgb2YgJ2NvbG9yJyBhbmQgJypiYWNrZ3JvdW5kKicgb25seVxuICAgICAgICBsZXQgaXNCZ1VzZWQgPSBzdHlsZVRleHQubWF0Y2goL1xcYmJhY2tncm91bmRcXGIvaSk7XG5cbiAgICAgICAgbGV0IHRoZUNvbG9yU3R5bGVUb0NoZWNrID0gc3R5bGVUZXh0LnJlcGxhY2UoLy1jb2xvci9nLCBcIlwiKTtcbiAgICAgICAgbGV0IGlzQ29sb3JVc2VkID0gdGhlQ29sb3JTdHlsZVRvQ2hlY2subWF0Y2goL1xcYmNvbG9yXFxiL2kpO1xuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjb2xvclwiKSB8fCBpc0NvbG9yVXNlZCB8fCBpc0JnVXNlZCkge1xuICAgICAgICAgICAgbGV0IGdvb2RUYWdOYW1lcyA9IHtcbiAgICAgICAgICAgICAgICBcImVtXCI6IFwiXCIsIFwic3Ryb25nXCI6IFwiXCIsIFwiY2l0ZVwiOiBcIlwiLCBcImRmblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwiY29kZVwiOiBcIlwiLCBcInNhbXBcIjogXCJcIiwgXCJrYmRcIjogXCJcIiwgXCJ2YXJcIjogXCJcIiwgXCJhYmJyXCI6IFwiXCIsIFwiYWNyb255bVwiOiBcIlwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb2xvciB1c2VkIO+/vSBhcmUgdGhlcmUgc2VtYW50aWNzIGludm9sdmVkP1xuICAgICAgICAgICAgcGFzc2VkID0gbm9kZU5hbWUgaW4gZ29vZFRhZ05hbWVzIHx8XG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgZ29vZFRhZ05hbWVzKSAhPT0gbnVsbDtcbiAgICAgICAgICAgIGlmICghcGFzc2VkICYmIHJ1bGVDb250ZXh0Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIGluIGdvb2RUYWdOYW1lcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJpZ2dlciBvbmx5IG9uY2VcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCB0cmlnZ2VyZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJzdHlsZV9jb2xvcl9taXN1c2VcIiwgZmFsc2UpO1xuICAgICAgICAgICAgcGFzc2VkID0gdHJpZ2dlcmVkO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwic3R5bGVfY29sb3JfbWlzdXNlXCIsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ29sb3JVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29sb3JVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzdHlsZV9mb2N1c192aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2ZvY3VzX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU3R5bGVfSGluZGVyRm9jdXMxXCI6IHtcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfZm9jdXNfdmlzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCI6IGBzdHlsZV9mb2N1c192aXNpYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJwYXNzX2ZvY3VzX3Zpc2libGVcIjogYHN0eWxlX2ZvY3VzX3Zpc2libGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBzaG91bGQgYmUgdmlzaWJsZSB3aGVuIGRlZmF1bHQgYm9yZGVyIG9yIG91dGxpbmUgaXMgbW9kaWZpZWQgYnkgQ1NTXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiOiBcIkNoZWNrIHRoZSBrZXlib2FyZCBmb2N1cyBpbmRpY2F0b3IgaXMgdmlzaWJsZSB3aGVuIHVzaW5nIENTUyBkZWNsYXJhdGlvbiBmb3IgJ2JvcmRlcicgb3IgJ291dGxpbmUnXCIsXG4gICAgICAgICAgICBcInBhc3NfZm9jdXNfdmlzaWJsZVwiOiBcIlRoZSBrZXlib2FyZCBmb2N1cyBpbmRpY2F0b3IgaXMgdmlzaWJsZSBvciBpcyBub3QgY2hhbmdlZCBmcm9tIHRoZSBicm93c2VyIGRlZmF1bHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjIuNC43XCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHNraXBOb2Rlczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJ0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGVja1BhcmFtczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJib3JkZXJcIiwgXCJib3JkZXItd2lkdGhcIiwgXCJib3JkZXItc3R5bGVcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci10b3Atd2lkdGhcIiwgXCJib3JkZXItcmlnaHQtd2lkdGhcIiwgXCJib3JkZXItYm90dG9tLXdpZHRoXCIsIFwiYm9yZGVyLWxlZnQtd2lkdGhcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci10b3AtY29sb3JcIiwgXCJib3JkZXItcmlnaHQtY29sb3JcIiwgXCJib3JkZXItYm90dG9tLWNvbG9yXCIsIFwiYm9yZGVyLWxlZnQtY29sb3JcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci10b3Atc3R5bGVcIiwgXCJib3JkZXItcmlnaHQtc3R5bGVcIiwgXCJib3JkZXItYm90dG9tLXN0eWxlXCIsIFwiYm9yZGVyLWxlZnQtc3R5bGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwib3V0bGluZVwiLCBcIm91dGxpbmUtd2lkdGhcIiwgXCJvdXRsaW5lLWNvbG9yXCIsIFwib3V0bGluZS1zdHlsZVwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpIHx8IHZhbGlkYXRlUGFyYW1zLnNraXBOb2Rlcy52YWx1ZS5pbmNsdWRlcyhydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2V0IGFsbCBzdHlsZXMgaW4gYSBzaW5nbGUgcGFzcyB0aHJvdWdoIHN0eWxlc2hlZXRzXG4gICAgICAgIGNvbnN0IGFsbFN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKHJ1bGVDb250ZXh0LCBudWxsLCBbXCJcIiwgXCI6Zm9jdXNcIiwgXCI6Zm9jdXMtdmlzaWJsZVwiLCBcIjpmb2N1cy13aXRoaW5cIl0pO1xuICAgICAgICBsZXQgbm9ybWFsU3R5bGVzID0gYWxsU3R5bGVzW1wiXCJdOyAvLyBjb25zaWRlciBib3RoIHVzZXItZGVmaW5lZCBhbmQgYnJvd3NlciBkZWZhdWx0XG4gICAgICAgIGxldCBmb2N1c1N0eWxlcyA9IFtdXG4gICAgICAgIGZvY3VzU3R5bGVzLnB1c2goYWxsU3R5bGVzW1wiOmZvY3VzXCJdKTtcbiAgICAgICAgZm9jdXNTdHlsZXMucHVzaChhbGxTdHlsZXNbXCI6Zm9jdXMtdmlzaWJsZVwiXSk7XG4gICAgICAgIGZvY3VzU3R5bGVzLnB1c2goYWxsU3R5bGVzW1wiOmZvY3VzLXdpdGhpblwiXSk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZiBmb2N1cyBzdHlsZSBpcyBkZWZpbmVkXG4gICAgICAgIGxldCBzdHlsZU9iaiA9IGZvY3VzU3R5bGVzWzBdO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc3R5bGVPYmopLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vcGFzcyBpZiBvdXRsaW5lIGlzIG5vdCBkZWZpbmVkIGF0IGFsbCwgYnJvd3NlciB3aWxsIG92ZXJyaWRlIFxuICAgICAgICAgICAgaWYgKCgoIW5vcm1hbFN0eWxlc1tcIm91dGxpbmUtd2lkdGhcIl0gJiYgIW5vcm1hbFN0eWxlc1tcIm91dGxpbmUtc3R5bGVcIl0pXG4gICAgICAgICAgICAgICAgfHwgKG5vcm1hbFN0eWxlc1tcIm91dGxpbmUtd2lkdGhcIl0gPT09ICcwcHgnIHx8IG5vcm1hbFN0eWxlc1tcIm91dGxpbmUtc3R5bGVcIl0gPT09ICdub25lJykpXG4gICAgICAgICAgICAgICAgJiYgKCFzdHlsZU9ialtcIm91dGxpbmUtc3R5bGVcIl0gfHwgc3R5bGVPYmpbXCJvdXRsaW5lLXN0eWxlXCJdICE9PSAnbm9uZScpKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZm9jdXNfdmlzaWJsZVwiKTsgICAgICAgXG5cbiAgICAgICAgICAgIGxldCBub25lU3R5bGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBudW1PdGhlclN0eWxlID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGZvY3VzU3R5bGUgaW4gc3R5bGVPYmopIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVQYXJhbXMuY2hlY2tQYXJhbXMudmFsdWUuaW5jbHVkZXMoZm9jdXNTdHlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIGZhaWx1cmUgY2FzZTogIFxuICAgICAgICAgICAgICAgICAgICAgKiAgMS4gZm9jdXMgb3V0bGluZSBvciBib3JkZXIgc3R5bGUgaXMgbm9uZSBhbmQgbm8gb3RoZXIgc3R5bGUgKGNvbG9yIG9yIHdpZHRoKSBkZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAqICAyLiBmb2N1cyBvdXRsaW5lIG9yIGJvcmRlciBzdHlsZSBpcyBzYW1lIHdpdGggdGhlIG5vcm1hbFxuICAgICAgICAgICAgICAgICAgICAgKiAgMy4gc2l6ZSBpbiBmb2N1cyBpcyBzYW1lIG9yIHNtYWxsZXIgdGhhbiBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAqICA0LiBjb2xvciBjb250cmFzdCBpbiBmb2N1cyBpcyBiZXR0ZXIgIFxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvY3VzU3R5bGVWYWx1ZSA9IHN0eWxlT2JqW2ZvY3VzU3R5bGVdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsU3R5bGVWYWx1ZSA9IG5vcm1hbFN0eWxlc1tmb2N1c1N0eWxlXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGUuaW5jbHVkZXMoXCJzdHlsZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gXCJub25lXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmVTdHlsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmVTdHlsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsU3R5bGVWYWx1ZSAmJiBmb2N1c1N0eWxlVmFsdWUgIT09IFwibm9uZVwiICYmIGZvY3VzU3R5bGVWYWx1ZSA9PT0gbm9ybWFsU3R5bGVWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9jdXNTdHlsZS5pbmNsdWRlcyhcIndpZHRoXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW1PdGhlclN0eWxlKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJveGltYXRpb24gb2YgdGhlIHdpZHRoIHN0eWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSAnaW5pdGlhbCcpIGZvY3VzU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSAndGhpbicpIGZvY3VzU3R5bGVWYWx1ZSA9ICcxcHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSAnbWVkaXVtJykgZm9jdXNTdHlsZVZhbHVlID0gJzJweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmb2N1c1N0eWxlVmFsdWUgPT09ICd0aGljaycpIGZvY3VzU3R5bGVWYWx1ZSA9ICczcHgnOyAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbFN0eWxlVmFsdWUgPT09ICdpbml0aWFsJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vcm1hbFN0eWxlVmFsdWUgPT09ICd0aGluJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICcxcHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vcm1hbFN0eWxlVmFsdWUgPT09ICdtZWRpdW0nKSBub3JtYWxTdHlsZVZhbHVlID0gJzJweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm9ybWFsU3R5bGVWYWx1ZSA9PT0gJ3RoaWNrJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICczcHgnOyAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c1N0eWxlVmFsdWUgPSBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShmb2N1c1N0eWxlVmFsdWUsIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbFN0eWxlVmFsdWUgPSBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShub3JtYWxTdHlsZVZhbHVlLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNTdHlsZVZhbHVlID09IDAgfHwgZm9jdXNTdHlsZVZhbHVlIDw9IG5vcm1hbFN0eWxlVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvY3VzU3R5bGUuaW5jbHVkZXMoXCJjb2xvclwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3RoZXJTdHlsZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGVsZW1lbnQgYmcgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2xvckNvbWJvID0gQ29sb3JVdGlsLkNvbG9yQ29tYm8ocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yQ29tYm8gPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJnID0gY29sb3JDb21iby5iZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmcpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3Byb3hpbWF0aW9uIG9mIHRoZSB3aWR0aCBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ2luaXRpYWwnKSBmb2N1c1N0eWxlVmFsdWUgPSAnYmxhY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbFN0eWxlVmFsdWUgJiYgbm9ybWFsU3R5bGVWYWx1ZSA9PT0gJ2luaXRpYWwnKSBub3JtYWxTdHlsZVZhbHVlID0gJ2JsYWNrJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYm9yZGVyL291dGxpbmUgY29sb3IgYXMgZmcgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c1N0eWxlVmFsdWUgPSBDb2xvclV0aWwuQ29sb3IoZm9jdXNTdHlsZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbFN0eWxlVmFsdWUgPSBDb2xvclV0aWwuQ29sb3Iobm9ybWFsU3R5bGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSBudWxsIHx8IG5vcm1hbFN0eWxlVmFsdWUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2dldCB0aGUgYm9yZGVyL291dGxpbmUgY29sb3IgY29udHJhc3QgcmF0aW9zXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9jdXNSYXRpbyA9IGZvY3VzU3R5bGVWYWx1ZS5jb250cmFzdFJhdGlvKGJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxSYXRpbyA9IG5vcm1hbFN0eWxlVmFsdWUuY29udHJhc3RSYXRpbyhiZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNSYXRpbyA8IDMuMCB8fCBmb2N1c1JhdGlvIDw9IG5vcm1hbFJhdGlvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9vdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3RoZXJTdHlsZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbFN0eWxlVmFsdWUgIT0gbnVsbCAmJiBmb2N1c1N0eWxlVmFsdWUgPT09IG5vcm1hbFN0eWxlVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB3YXJuIGlmIGEgYm9yZGVyL291dGxpbmUgZm9jdXMgc3R5bGUgaXMgJ25vbmUnIGFuZCBub2Ugb3RoZXIgKGNvbG9yIGFuZC9vciB3aWR0aCkgaXMgZGVmaW5lZCBcbiAgICAgICAgICAgIGlmIChub25lU3R5bGUgJiYgbnVtT3RoZXJTdHlsZSA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vIGZvY3VzIHN0eWxlIGRlZmluZWQgXG4gICAgICAgICAgICAvLyB3YXJuIGlmIG5vcm1hbCBzdHlsZSBpcyBkZWZpbmVkIGFuZCBpcyBub3QgXCJub25lXCJcbiAgICAgICAgICAgIGZvciAobGV0IG5vcm1hbFN0eWxlIGluIG5vcm1hbFN0eWxlcykge1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZVBhcmFtcy5jaGVja1BhcmFtcy52YWx1ZS5pbmNsdWRlcyhub3JtYWxTdHlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vcm1hbFN0eWxlVmFsdWUgPSBub3JtYWxTdHlsZXNbbm9ybWFsU3R5bGVdO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaWYgYm9yZGVyIG9yIG91dGxpbmUgc3R5bGUgaXMgXCJub25lXCIgXG4gICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlICE9PSAnbm9uZScpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiKTtcbiAgICAgICAgICAgICAgICB9ICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSAgIFxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2ZvY3VzX3Zpc2libGVcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOmxpbmssIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX1RyaWdnZXIyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIkNvbmZpcm0gV2luZG93cyBoaWdoIGNvbnRyYXN0IG1vZGUgaXMgc3VwcG9ydGVkIHdoZW4gdXNpbmcgQ1NTIHRvIGluY2x1ZGUsIHBvc2l0aW9uIG9yIGFsdGVyIG5vbi1kZWNvcmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaW5kb3dzIGhpZ2ggY29udHJhc3QgbW9kZSBtdXN0IGJlIHN1cHBvcnRlZCB3aGVuIHVzaW5nIENTUyB0byBpbmNsdWRlLCBwb3NpdGlvbiBvciBhbHRlciBub24tZGVjb3JhdGl2ZSBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiLCBcIjEuMy4yXCIsIFwiMS40LjExXCJdLCAgLy9vdGhlciBcInN0eWxlXCIgcnVsZXMgZm9yIGZvY3VzLCBob3ZlciwgYW5kIGNvbG9yXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlkXCI6IFtcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIiwgXCIxLjMuMlwiLCBcIjEuNC4xMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIgJiZcbiAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicmVsXCIpIHx8IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpICE9PSBcInN0eWxlc2hlZXRcIikpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJzdHlsZVwiICYmIG5vZGVOYW1lICE9PSBcImxpbmtcIiAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3R5bGVcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIikudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgbGV0IHRyaWdnZXJlZCA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsIGZhbHNlKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRyaWdnZXJlZDtcbiAgICAgICAgLy8gICAgICAgIFBhY2thZ2VzLmphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4odHJpZ2dlcmVkKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGVcIiwgdHJ1ZSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3R5bGVfaG92ZXJfcGVyc2lzdGVudDogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXSwgZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwiUGFzc18xXCI6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfM1wiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0aGUgaG92ZXI6IHBzZXVkby1jbGFzcyBpcyBub3QgdXNlZCB0byBkaXNwbGF5IGNvbnRlbnRcIixcbiAgICAgICAgICAgIC8vIFwiUGFzc18xXCI6IFwiY29udGVudCBkaXNwbGF5ZWQgdmlhIHRoZSA6aG92ZXIgcHNldWRvLWNsYXNzIGlzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSB0cmlnZ2VyIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18yXCI6IFwiY29udGVudCBkaXNwbGF5ZWQgdmlhIHRoZSA6aG92ZXIgcHNldWRvLWNsYXNzIGlzIHRoZSBhZGphY2VudCBzaWJsaW5nIG9mIHRoZSB0cmlnZ2VyIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJDb25maXJtIHRoZSBwb2ludGVyIGNhbiBiZSBwb3NpdGlvbmVkIG92ZXIgdGhlIGRpc3BsYXllZCBlbGVtZW50LCBub3QganVzdCB0aGUgdHJpZ2dlclwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIkNvbmZpcm0gdGhlIHBvaW50ZXIgY2FuIGJlIHBvc2l0aW9uZWQgb3ZlciBhbGwgdGhlIGluZm9ybWF0aW9uIGRpc3BsYXllZCBvbiBob3ZlclwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfM1wiOiBcIkNvbmZpcm0gdGhlIG1hcmdpbiBzdHlsZSBhdHRyaWJ1dGUgaGFzIG5vdCBwcmV2ZW50ZWQgdGhlIHBvaW50ZXIgZnJvbSBob3ZlcmluZyBvdmVyIHRoZSBkaXNwbGF5ZWQgZWxlbWVudCwgbm90IGp1c3QgdGhlIHRyaWdnZXJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgcG9pbnRlciBzaG91bGQgYmUgYWJsZSB0byBtb3ZlIG92ZXIgY29udGVudCBkaXNwbGF5ZWQgb24gaG92ZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjQuMTNcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgbGV0IHBhc3MwID0gZmFsc2U7XG4gICAgICAgIGxldCBwYXNzMSA9IGZhbHNlO1xuICAgICAgICBsZXQgcGFzczIgPSBmYWxzZTsgLy8gbmV2ZXIgaGFwcGVuXG4gICAgICAgIGxldCBwb3RlbnRpYWwxID0gZmFsc2U7XG4gICAgICAgIGxldCBwb3RlbnRpYWwyID0gZmFsc2U7XG4gICAgICAgIGxldCBwb3RlbnRpYWwzID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHN0eWxlVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlJVTEUgUlVOICoqKioqKioqKioqKioqKioqKlwiKTtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgLy8gY2hlY2sgaW1wb3J0XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoID0gXCIrcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7ICsrc0luZGV4KSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzLmxlbmd0aCA9IFwiK3N0eWxlUnVsZXMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgc3R5bGVSdWxlSW5kZXggPCBzdHlsZVJ1bGVzLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKioqKioqKlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKiogRk9SIExPT1Agc3R5bGVSdWxlSW5kZXggPSBcIitzdHlsZVJ1bGVJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kSG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG92ZXJFbGVtZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c0NvbWJpbmF0b3IgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGlsZGVDb21iaW5hdG9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheVZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyQ29tYmluYXRvckVsZW1lbnRIb3ZlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0aW5nRWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0aW5nSG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkamFjZW50UGx1c1NpYmxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRqYWNlbnRUaWxkZU11bHRpcGxlU2libGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZVRleHQgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlc1tcIitzdHlsZVJ1bGVJbmRleCtcIl0gPSBcIitydWxlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gQ2hlY2sgZm9yIDpob3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlVGV4dC5tYXRjaCgvOmhvdmVyL2cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSG92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjEuIGZvdW5kIDpob3ZlciA9IFwiKyBmb3VuZEhvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gR2V0IGhvdmVyIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJFbGVtZW50ID0gcnVsZVRleHQuc3BsaXQoXCI6XCIpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjIuIGZvdW5kIGVsZW1lbnQgdGhhdCBnb2VzIHdpdGggOmhvdmVyID0gXCIraG92ZXJFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjEuIE5vIGhvdmVyIG9uIGNzcyBlbGVtZW50IHNvIHNraXAgdGhpcyBydWxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWYgbm8gOmhvdmVyIHNraXAgdGhpcyBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDNhLiBDaGVjayBmb3IgY3NzIGNvbWJpbmF0b3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDRhLiBpZiBzbyBkbyB3ZSBoYXZlIGFuIGFmdGVyIGNvbWJpbmF0b3IgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbHVzVGVtcFN0ciA9IHJ1bGVUZXh0LnN1YnN0cmluZyhydWxlVGV4dC5pbmRleE9mKFwiK1wiKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdXNUZW1wU3RyID0gcGx1c1RlbXBTdHIudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlVGV4dC5tYXRjaCgvOmhvdmVyIFxcKy9nKSB8fCBydWxlVGV4dC5tYXRjaCgvOmhvdmVyXFwrL2cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdXNDb21iaW5hdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIzYS4gRm91bmQgcGx1c0NvbWJpbmF0b3IgPSBcIisgcGx1c0NvbWJpbmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gcGx1c1RlbXBTdHIuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjRhLiBGb3VuZCBwbHVzIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIithZnRlckNvbWJpbmF0b3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzYi4gQ2hlY2sgZm9yIGNzcyBjb21iaW5hdG9yICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0Yi4gaWYgc28gZG8gd2UgaGF2ZSBhbiBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3ZlciBcXH4vZykgfHwgcnVsZVRleHQubWF0Y2goLzpob3Zlclxcfi9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIm1hdGNoID0gXCIrcnVsZVRleHQubWF0Y2goXCI6aG92ZXIgXFx+XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZGVDb21iaW5hdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIzYi4gRm91bmQgdGlsZGVDb21iaW5hdG9yID0gXCIrIHRpbGRlQ29tYmluYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbHVzVGVtcFN0ciA9IHJ1bGVUZXh0LnN1YnN0cmluZyhydWxlVGV4dC5pbmRleE9mKFwiflwiKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzVGVtcFN0ciA9IHBsdXNUZW1wU3RyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IHBsdXNUZW1wU3RyLnNwbGl0KFwiIFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI0Yi4gRm91bmQgdGlsZGUgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGx1c0NvbWJpbmF0b3IgJiYgIXRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOTyBwbHVzQ29tYmluYXRvciBvciB0aWxkZUNvbWJpbmF0b3Igc28gc2tpcCB0aGlzIHJ1bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzQ29tYmluYXRvciBvciB0aWxkZUNvbWJpbmF0b3Igc28gUEFTU1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFJFUE9SVCBQQVNTIDAgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpOyAvLyBKQ0g6IHNob3VsZCB3ZSBoYXZlIGEgTi9BIHBhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTbyBub3cgd2UgaGF2ZSBhIGNzcyBlbGVtZW50IHdpdGggaG92ZXIgLSBlbGVtZW50OmhvdmVyIHNvIHdlIGhhdmUgcHJvYmxlbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjaGVja1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS4gQ2hlY2sgaWYgdGhlIGFmdGVyIGNvbWJpbmF0b3IgZWxlbWVudCBoYXMgZGlzcGxheTogcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2LiBDaGVjayBpZiBkaXNwbGF5IHByb3BlcnR5IGlzIG5vdCBub25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyQ29tYmluYXRvckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGluZGV4IG9mIGRpc3BsYXk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGx1c1RlbXBTdHIgPSBcIitwbHVzVGVtcFN0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHBsdXNUZW1wU3RyLmluZGV4T2YoXCJkaXNwbGF5OlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjUuIEZvdW5kIGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdXNUZW1wU3RyLnNsaWNlKGluZGV4ICsgOCkudHJpbSgpLnNwbGl0KFwiIFwiKVswXSAhPT0gXCJub25lO1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI2LiBGb3VuZCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheVZhbHVlIG5vdCBub25lID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSA9PT0gbm9uZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAwIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGJhZCBjc3Mgc28gaXQgd29uJ3QgaGFwcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5IHNvIHNraXAgdGhpcyBydWxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGJhZCBjc3Mgc28gaXQgd29uJ3QgaGFwcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHZlcmlmaWVkIHRoYXQgd2UgaGF2ZSBhIGNzcyBlbGVtZW50IHdpdGggYSBob3ZlciBvZiB0aGUgZm9ybWF0IHNwYW46aG92ZXIgKyBkaXYgeyBkaXNwbGF5OiBibG9jazsgfSB3aXRoIGFsbCB0aGUgcHJvcGVyIHByb3BlcnRpZXMgYW5kIHZhbHVlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB2ZXJpZmllZCB0aGF0IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGEgaG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIG9mIHRoZSBmb3JtYXQgc3Bhbjpob3ZlciArIGRpdiB7IGRpc3BsYXk6IGJsb2NrOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICB3aXRoIGFsbCB0aGUgcHJvcGVyIHByb3BlcnRpZXMgYW5kIHZhbHVlc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzMiA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZXMyLmxlbmd0aCA9IFwiK3N0eWxlUnVsZXMyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGVSdWxlSW5kZXgyID0gMDsgc3R5bGVSdWxlSW5kZXgyIDwgc3R5bGVSdWxlczIubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleDIrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBydWxlIGZvciBhZnRlckNvbWluYXRvckVsZW1lbnQ6aG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmluZCBhZnRlckNvbWJpbmF0b3JFbGVtZW50OmhvdmVyIHNlZSBpZiBydWxlIGhhcyBwcm9wZXJ0eSBkaXNwbGF5OiB2YWx1ZSB3aGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSAhPSBub25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKioqKioqKlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqKioqKioqIDJuZCBGT1Igc3R5bGVSdWxlSW5kZXgyID0gXCIrc3R5bGVSdWxlSW5kZXgyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVUZXh0MiA9IHN0eWxlUnVsZXNbc3R5bGVSdWxlSW5kZXgyXS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJ1bGVUZXh0MiA9IFwiLCBydWxlVGV4dDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIithZnRlckNvbWJpbmF0b3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWxsIHN1cHBvcnRpbmcgZWxlbWVudHMgZm9yIG1hcmdpbiBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBmaW5kIG1hcmdpbiBTVE9QIGFuZCBSRVBPUlQgRVJST1JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0V4U3RyaW5nID0gYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCArIFwiIHtcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyaW1SdWxlVGV4dDIgPSBydWxlVGV4dDIudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnSW5kZXggPSB0cmltUnVsZVRleHQyLmluZGV4T2YocmVnRXhTdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudFByb3BlcnRpZXMgPSB0cmltUnVsZVRleHQyLnNsaWNlKHJlZ0luZGV4KS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoIWFmdGVyQ29tYmluYXRvckVsZW1lbnRQcm9wZXJ0aWVzLm1hdGNoKC9tYXJnaW4vZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmltUnVsZVRleHQyLm1hdGNoKC9tYXJnaW4vZykpIHsgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5vIG1hcmdpbiBwcm9ibGVtIHNvIGNvbnRpbnVlIG9uLi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gd2UgaGF2ZSBhIHN1cHBvcnRpbmcgZWxlbWVudCBjc3MgZGVmaW5pdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50ID0gcnVsZVRleHQyLnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPSBzdXBwb3J0aW5nSG92ZXJFbGVtZW50LnNwbGl0KFwiIFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VwcG9ydGluZ0hvdmVyRWxlbWVudCA9IFwiK3N1cHBvcnRpbmdIb3ZlckVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5FRUQgVE8gQ0hFQ0sgRk9SIGFmdGVyQ29taW5hdG9yRWxlbWVudDpob3ZlciBpbiBPTkUgU1RFUFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGluZ0hvdmVyRWxlbWVudCA9PT0gYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCAmJiBydWxlVGV4dDIubWF0Y2goLzpob3Zlci9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNy4gRm91bmQgc3VwcG9ydGluZyBob3ZlciBlbGVtZW50IHNhbWUgYXMgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDcuIEZvdW5kIHN1cHBvcnRpbmcgaG92ZXIgZWxlbWVudCBzYW1lIGFzIGFmdGVyQ29tYmluYXRvckVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nRWxlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBzdXBwb3J0aW5nIGVsZW1lbnQgaGF2ZSBob3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiOC4gU3VwcG9ydGluZyBlbGVtZW50IGhhcyBob3ZlciBhbHNvID0gXCIrIGZvdW5kSG92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDguIFN1cHBvcnRpbmcgZWxlbWVudCBoYXMgaG92ZXIgYWxzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gcnVsZVRleHQyLmluZGV4T2YoXCJkaXNwbGF5OlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImluZGV4ID0gXCIraW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA5LiBGb3VuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjkuIEZvdW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPSBcIitzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdXNUZW1wU3RyLnNsaWNlKGluZGV4ICsgOCkudHJpbSgpLnNwbGl0KFwiIFwiKVswXSAhPT0gXCJub25lO1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMC4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjEwLiBGb3VuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlIG5vdCBub25lID0gXCIrc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgbGlzdCBvZiBob3ZlciBlbGVtZW50cyBhbmQgbmV4dCBzaWJsaW5nIGZvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgKyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBBREpBQ0VOVCBzaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG92ZXJFbGVtZW50ICE9PSBcIlwiICYmIHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdmVyRWxlbWVudExpc3QgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudExpc3QubGVuZ3RoID0gXCIraG92ZXJFbGVtZW50TGlzdC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaG92ZXJFbGVtZW50TGlzdFswXS50YWdOYW1lID0gXCIraG92ZXJFbGVtZW50TGlzdFswXS50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgYWRqYWNlbnQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQWRqYWNlbnQgc2libGluZyA9IFwiK2hvdmVyRWxlbWVudExpc3RbMF0ubmV4dEVsZW1lbnRTaWJsaW5nLnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWZ0ZXJDb21iaW5hdG9yRWxlbWVudC50b1VwcGVyQ2FzZSgpID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudC50b1VwcGVyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50LnRvVXBwZXJDYXNlKCkgPT09IGhvdmVyRWxlbWVudExpc3RbMF0ubmV4dEVsZW1lbnRTaWJsaW5nLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMWEuIEhvdmVyIHdpdGggcGx1cyBoYXMgYWRqYWNlbnQgc2libGluZy5cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTFhLiBIb3ZlciB3aXRoIHBsdXMgaGFzIGFkamFjZW50IHNpYmxpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkamFjZW50UGx1c1NpYmxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdmVyaWZpZWQgYSBzdXBwb3J0aW5nIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgY3NzIHJ1bGUgdGhhdCBjb250YWlucyBob3ZlciBhbmQgZGlzcGxheSBwcm9wZXJ0eSB0aGF0IGlzIG5vdCBlcXVhbCB0byBub25lIGFuZCBoYXMgYSBob3ZlciBlbGVtZW50IGluIHRoZSBib2R5IHdpdGggYW4gYWRqYWNlbnQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUkVQT1JUIFBBU1MgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzMCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1c0NvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjExYS4gTWFpbiBob3ZlciB3aXRoICsgY29tYmluYXRvciBoYXMgbm8gYWRqYWNlbnQgc2libGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBvdGVudGlhbDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWwxID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGxpc3Qgb2YgaG92ZXIgZWxlbWVudHMgYW5kIGRldGVybWluZSBpZiB0aGVyZSBhcmUgMiBvciBtb3JlIGFkamFjZW50IHNpYmxpbmdzIGZvciB+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgfiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBBREpBQ0VOVCBzaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG92ZXJFbGVtZW50ICE9PSBcIlwiICYmIHRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaG92ZXJFbGVtZW50LnRvVXBwZXJDYXNlKCkgPSBcIitob3ZlckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdmVyRWxlbWVudExpc3QgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJFbGVtZW50LnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudExpc3QubGVuZ3RoID0gXCIraG92ZXJFbGVtZW50TGlzdC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciB0d28gb3IgbW9yZSBhZGphY2VudCBzaWJsaW5nc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaWJsaW5ncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaWJsaW5nID0gaG92ZXJFbGVtZW50TGlzdFswXS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInNpYmxpbmcudGFnTmFtZSA9IFwiK3NpYmxpbmcudGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nLnRhZ05hbWUgPT09IGFmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoKHNpYmxpbmcgPSBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaWJsaW5nQ291bnQgPSBzaWJsaW5ncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzaWJsaW5nQ291bnQgPSBcIitzaWJsaW5nQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpDSCBUT0RPOiB3aGF0IGlmIHNpYmxpbmcgY291bnQgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nQ291bnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMWIuIEhvdmVyIHdpdGggdGlsZGUgYW5kIG9uZSBhZGphY2VudCBzaWJsaW5nXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFRpbGRlTXVsdGlwbGVTaWJsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFJFUE9SVCBQQVNTIDIgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2libGluZ0NvdW50ID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk1haW4gaG92ZXIgd2l0aCB+IGNvbWJpbmF0b3IgaGFzIHR3byBvciBtb3JlIHNpYmxpbmdzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBvdGVudGlhbDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDIgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1c0NvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlIGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHBsdXMgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RlIGF0IGxlYXN0IG9uZSBvZiB0aGUgcnVsZXMgbXVzdCBoYXZlIGEgZGlzcGxheSBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1c0NvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAxIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgaXMgc3RpbGwgZmFsc2UgPT4gcG90ZW50aWFsMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHRpbGRlIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RlIGF0IGxlYXN0IG9uZSBvZiB0aGUgcnVsZXMgbXVzdCBoYXZlIGEgc3VwcG9ydGluZ0VsZW1lbnQ6aG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1c0NvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdFbGVtZW50IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VwcG9ydGluZ0VsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHBsdXMgc3VwcG9ydGluZ0VsZW1lbnQ6aG92ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0VsZW1lbnQgaXMgc3RpbGwgZmFsc2UgPT4gcG90ZW50aWFsMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlSW5kZXgyID0gXCIrc3R5bGVSdWxlSW5kZXgyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZXMyLmxlbmd0aCA9IFwiK3N0eWxlUnVsZXMyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdXBwb3J0aW5nRWxlbWVudCA9IFwiK3N1cHBvcnRpbmdIb3Zlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXIgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gdGlsZGUgc3VwcG9ydGluZ0VsZW1lbnQ6aG92ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDIgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRoZXJlIGlzIGEgbWFyZ2luIGluIHRoZSBzdXBwb3J0aW5nIGVsZW1lbnRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBvdGVudGlhbDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAzIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsMyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfM1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaWxlbmNlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwYXNzMCA9IFwiK3Bhc3MwKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwYXNzMSA9IFwiK3Bhc3MxKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwYXNzMiA9IFwiK3Bhc3MyKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwb3RlbnRpYWwxID0gXCIrcG90ZW50aWFsMSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicG90ZW50aWFsMiA9IFwiK3BvdGVudGlhbDIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBvdGVudGlhbDMgPSBcIitwb3RlbnRpYWwzKTtcbiAgICAgICAgaWYgKHBhc3MwKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIC8vIGlmIChwYXNzMSkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18yXCIpOyAvLyBEb2Vzbid0IHRyaWdnZXJcbiAgICAgICAgLy8gaWYgKHBhc3MyKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzNcIik7IC8vIERvZXNuJ3QgdHJpZ2dlclxuICAgICAgICBpZiAocG90ZW50aWFsMSkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgaWYgKHBvdGVudGlhbDIpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgIGlmIChwb3RlbnRpYWwzKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8zXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG4vKipcbiAqIERlc2NyaXB0aW9uOiBUcmlnZ2VyIHdoZW4gdmlld3BvcnQgdW5pdHMgYXJlIHVzZWQgZm9yIGZvbnQgc2l6ZS5cbiAqIE9yaWdpbjogVmFyaW91c1xuICovXG5leHBvcnQgY29uc3Qgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxpbmssIGRvbTpzdHlsZSwgZG9tOipbc3R5bGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjFfU3R5bGVfVmlld3BvcnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBzdHlsZV92aWV3cG9ydF9yZXNpemFibGUuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRleHQgbXVzdCBzY2FsZSB1cCB0byAyMDAlIHdpdGhvdXQgbG9zcyBvZiBjb250ZW50IG9yIGZ1bmN0aW9uYWxpdHlcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0ZXh0IHNpemVkIHVzaW5nIHZpZXdwb3J0IHVuaXRzIGNhbiBiZSByZXNpemVkIHVwIHRvIDIwMCVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIxLjQuNFwiLCBcIjEuNC4xMFwiXSwgLy8gbWF0Y2ggaGVscCBmb3IgYm90aCBcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHRoZVBhdHRlcm4gPSAvXFxkKyh2d3x2aHx2bWlufHZtYXgpL2dpO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXRcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgcGFzc2VkICYmIHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUudHlwZSAmJiBydWxlLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gcnVsZSBhcyBDU1NTdHlsZVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gc3R5bGVSdWxlLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbXBvcnQgcnVsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocnVsZS50eXBlICYmIHJ1bGUudHlwZSA9PT0gMyAvKiBDU1NSdWxlLklNUE9SVF9SVUxFICovICYmIChydWxlIGFzIENTU0ltcG9ydFJ1bGUpLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRSdWxlID0gcnVsZSBhcyBDU1NJbXBvcnRSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gaW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzID8gaW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzIDogaW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydGVkUnVsZSA9IHJ1bGVzW3JJbmRleF0gYXMgYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUudHlwZSAmJiBpbXBvcnRlZFJ1bGUudHlwZSA9PT0gMSAvKiBDU1NSdWxlLlNUWUxFX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUuc3R5bGVbJ2ZvbnRTaXplJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9udFNpemUgPSBpbXBvcnRlZFJ1bGUuc3R5bGVbJ2ZvbnRTaXplJ10udHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZvbnRTaXplLm1hdGNoKHRoZVBhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb250U2l6ZS5sZW5ndGggJiYgZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZUZyb21MaW5rID0gcnVsZXNbckluZGV4XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHJ1bGVzIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUZyb21MaW5rLnR5cGUgJiYgcnVsZUZyb21MaW5rLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUZyb21MaW5rLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gcnVsZUZyb21MaW5rLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc3R5bGVWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgICAgIGlmIChzdHlsZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlUGF0dGVybiA9IC9mb250LXNpemU6XFxzKlxcZCsodnd8dmh8dm1pbnx2bWF4KS9naTtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBzdHlsZVZhbHVlLm1hdGNoKHN0eWxlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzdmdfZ3JhcGhpY3NfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3ZnX2dyYXBoaWNzX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206c3ZnXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdmdfZ3JhcGhpY3NfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwic3ZnX2dyYXBoaWNzX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBcInN2Z19ncmFwaGljc19sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBub24tZGVjb3JhdGl2ZSBTVkcgZWxlbWVudCBtdXN0IGhhdmUgYW4gYWNjZXNzaWJsZSBuYW1lXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgU1ZHIGVsZW1lbnQgaGFzIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2FjY19uYW1lXCI6IFwiVGhlIFNWRyBlbGVtZW50IGhhcyBubyBhY2Nlc3NpYmxlIG5hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiN2Q2NzM0XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHJ1bGVDb250ZXh0KSB8fCBBY2NOYW1lVXRpbC5pc0FjY2Vzc2libGVOYW1lSWdub3JhYmxlKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKG5hbWVfcGFpciAmJiBuYW1lX3BhaXIubmFtZSAmJiBuYW1lX3BhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYWNjX25hbWVcIilcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlRmFpbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2FyaWFfZGVzY2VuZGFudHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50c1wiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTp0YWJsZSBkb206dHJbcm9sZV0sIGFyaWE6dGFibGUgZG9tOnRoW3JvbGVdLCBhcmlhOnRhYmxlIGRvbTp0ZFtyb2xlXSwgYXJpYTpncmlkIGRvbTp0cltyb2xlXSwgYXJpYTpncmlkIGRvbTp0aFtyb2xlXSwgYXJpYTpncmlkIGRvbTp0ZFtyb2xlXSwgYXJpYTp0cmVlZ3JpZCBkb206dHJbcm9sZV0sIGFyaWE6dHJlZWdyaWQgZG9tOnRoW3JvbGVdLCBhcmlhOnRyZWVncmlkIGRvbTp0ZFtyb2xlXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50cy5odG1sXCIsXG4gICAgICAgICAgICBcImV4cGxpY2l0X3JvbGVcIjogXCJ0YWJsZV9hcmlhX2Rlc2NlbmRhbnRzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUYWJsZSBzdHJ1Y3R1cmUgZWxlbWVudHMgY2Fubm90IHNwZWNpZnkgYW4gZXhwbGljaXQgJ3JvbGUnIHdpdGhpbiB0YWJsZSBjb250YWluZXJzXCIsXG4gICAgICAgICAgICBcImV4cGxpY2l0X3JvbGVcIjogXCJBbiBleHBsaWNpdCBBUklBICdyb2xlJyBpcyBub3QgdmFsaWQgZm9yIDx7MH0+IGVsZW1lbnQgd2l0aGluIGFuIEFSSUEgcm9sZSAnezF9JyBwZXIgdGhlIEFSSUEgaW4gSFRNTCBzcGVjaWZpY2F0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50OyBcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBDb21tb25VdGlsLmlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgIC8vIGNhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgaWYgKHBhcmVudFJvbGUgPT09IG51bGwgfHwgcGFyZW50Um9sZS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gaWdub3JlIHRoZSByZWR1bmRhbmN5IGNhc2VzOiByZXBvcnRlZCBpbiB0aGUgYXJpYV9yb2xlX3JlZHVuZGFudCBydWxlXG4gICAgICAgIGNvbnN0IGltcGxpY2l0Um9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBjb25zdCBleHBsaWNpdFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTs7XG4gICAgICAgIGlmIChpbXBsaWNpdFJvbGVzICYmIGltcGxpY2l0Um9sZXMubGVuZ3RoID4gMCAmJiBleHBsaWNpdFJvbGVzICYmIGV4cGxpY2l0Um9sZXMubGVuZ3RoID4gMCBcbiAgICAgICAgICAgICYmIGV4cGxpY2l0Um9sZXMuc29tZShpdGVtID0+IGltcGxpY2l0Um9sZXMuaW5jbHVkZXMoaXRlbSkpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImV4cGxpY2l0X3JvbGVcIiwgW2NvbnRleHRbXCJkb21cIl0ubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwYXJlbnRSb2xlWzBdLnJvbGVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfY2FwdGlvbl9lbXB0eTogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9jYXB0aW9uX2VtcHR5XCIsXG4gICAgY29udGV4dDogXCJkb206Y2FwdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9DYXB0aW9uX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9jYXB0aW9uX2VtcHR5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8dGFibGU+IGVsZW1lbnQgaGFzIGFuIGVtcHR5IDxjYXB0aW9uPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Y2FwdGlvbj4gZWxlbWVudCBmb3IgYSA8dGFibGU+IGVsZW1lbnQgbXVzdCBjb250YWluIGRlc2NyaXB0aXZlIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfY2FwdGlvbl9uZXN0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfY2FwdGlvbl9uZXN0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpjYXB0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0NhcHRpb25fSW5UYWJsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfY2FwdGlvbl9uZXN0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiPGNhcHRpb24+IGVsZW1lbnQgaXMgbm90IG5lc3RlZCBpbnNpZGUgYSA8dGFibGU+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGNhcHRpb24+IGVsZW1lbnQgbXVzdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBhc3NvY2lhdGVkIDx0YWJsZT4gZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKSAhPSBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9oZWFkZXJzX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGFibGVfRGF0YUhlYWRpbmdzQXJpYVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfaGVhZGVyc19leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGFibGUgaGFzIG5vIGhlYWRlcnMgaWRlbnRpZmllZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkRhdGEgdGFibGUgbXVzdCBpZGVudGlmeSBoZWFkZXJzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MVGFibGVFbGVtZW50O1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIHRoZXJlIGFyZSBubyByb3dzLCB0aGUgcnVsZSBkb2VzIG5vdCBhcHBseS5cbiAgICAgICAgbGV0IHJvd3MgPSBydWxlQ29udGV4dC5yb3dzO1xuICAgICAgICBpZiAoIVRhYmxlVXRpbC5pc0RhdGFUYWJsZShydWxlQ29udGV4dCkgfHwgcm93cyA9PT0gbnVsbCB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSBUYWJsZVV0aWwudGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9oZWFkZXJzX3JlZl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRkW2hlYWRlcnNdLCBkb206dGhbaGVhZGVyc11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkICdpZCcgaW4gdGhpcyBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiByZWZlcnMgdG8gaXRzZWxmXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyIHRvIGEgY2VsbCBpbiB0aGUgc2FtZSB0YWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlciB0byBhIGNlbGwgaW5kaWNhdGVkIHdpdGggPHRoPiBvciBhIHJvbGUgb2YgXFxcImNvbHVtbmhlYWRlclxcXCIgb3IgXFxcInJvd2hlYWRlclxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSBzaG91bGQgcmVmZXIgdG8gYSB2YWxpZCBjZWxsIGluIHRoZSBzYW1lIHRhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXCJhMjVmNDVcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhcmVudFRhYmxlID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKTtcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50VGFibGUpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIGEgc2ltcGxlIHRhYmxlIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5LlxuICAgICAgICBpZiAocGFyZW50VGFibGUgPT0gbnVsbCB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBhcmVudFRhYmxlKSB8fCAhW1widGFibGVcIiwgXCJncmlkXCJdLmluY2x1ZGVzKHBhcmVudFJvbGUpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCB2YWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIik7XG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgaWRzID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xuICAgICAgICBsZXQgaW52YWxpZEhlYWRlclZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgc2FtZU5vZGVIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IHNhbWVUYWJsZUhlYWRlclZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBpZCA9IGlkc1tpXTtcbiAgICAgICAgICAgIGlmIChpZC50cmltKCkgPT09ICcnKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICAgICAgaWYgKCFlbGVtKVxuICAgICAgICAgICAgICAgIGludmFsaWRIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIGlmIChET01VdGlsLnNhbWVOb2RlKGVsZW0sIHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBzYW1lTm9kZUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCFET01VdGlsLmlzSW5TYW1lVGFibGUoZWxlbSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHNhbWVUYWJsZUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbU5hbWUgIT09ICd0aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhlbGVtLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyb2xlcy5pbmNsdWRlcygnY29sdW1uaGVhZGVyJykgJiYgIXJvbGVzLmluY2x1ZGVzKCdyb3doZWFkZXInKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRFbGVtSGVhZGVyVmFsdWVzLnB1c2goaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgIGlmIChpbnZhbGlkSGVhZGVyVmFsdWVzLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtpbnZhbGlkSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG4gICAgICAgIGlmIChzYW1lTm9kZUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfMlwiLCBbc2FtZU5vZGVIZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcbiAgICAgICAgaWYgKHNhbWVUYWJsZUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfM1wiLCBbc2FtZVRhYmxlSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG4gICAgICAgIGlmIChpbnZhbGlkRWxlbUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfNFwiLCBbaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcblxuICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2hlYWRlcnNfcmVsYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0ZCwgZG9tOnRoXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX1RhYmxlX0RhdGFDZWxsUmVsYXRpb25zaGlwc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfaGVhZGVyc19yZWxhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29tcGxleCB0YWJsZSBkb2VzIG5vdCBoYXZlIGhlYWRlcnMgZm9yIGVhY2ggY2VsbCBwcm9wZXJseSBkZWZpbmVkIHdpdGggJ2hlYWRlcicgb3IgJ3Njb3BlJ1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkZvciBhIGNvbXBsZXggZGF0YSB0YWJsZSwgYWxsIDx0aD4gYW5kIDx0ZD4gZWxlbWVudHMgbXVzdCBiZSByZWxhdGVkIHZpYSAnaGVhZGVyJyBvciAnc2NvcGUnIGF0dHJpYnV0ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXJlbnRUYWJsZSA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwidGFibGVcIik7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBsYXlvdXQgdGFibGUgb3IgYSBzaW1wbGUgdGFibGUgdGhlIHJ1bGUgZG9lcyBub3QgYXBwbHkuXG4gICAgICAgIGlmIChwYXJlbnRUYWJsZSA9PSBudWxsIHx8ICFUYWJsZVV0aWwuaXNDb21wbGV4RGF0YVRhYmxlKHBhcmVudFRhYmxlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIElmIHRoaXMgdGFibGUgaGFzbid0IGJlZW4gcHJlcHJvY2Vzc2VkLCBwcm9jZXNzIGl0LlxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQnVpbGQgYSBncmlkIHRoYXQncyBhY3R1YWxseSB1c2FibGUgKHJvd3NwYW4gYW5kIGNvbHNwYW4gZWxlbWVudHMgYXJlIGR1cGxpY2F0ZWQpXG4gICAgICAgICAgICAvLyBUaGlzIGJ1aWxkcyBhIHJlYWwgMmQgdGFibGUgYXJyYXkuXG4gICAgICAgICAgICBsZXQgZ3JpZCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRUYWJsZS5yb3dzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvdyA9IHBhcmVudFRhYmxlLnJvd3NbaV07XG4gICAgICAgICAgICAgICAgaWYgKCFncmlkW2ldKSBncmlkW2ldID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3cuY2VsbHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbal07XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShjZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBpICsgXCI6XCIgKyBqKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aWR0aCkgd2lkdGggPSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoZWlnaHQpIGhlaWdodCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBnWCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChncmlkW2ldW2dYXSkgZ1ggKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZWlnaHQ7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncmlkW2kgKyBrXSkgZ3JpZFtpICsga10gPSBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCB3aWR0aDsgKytsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFtpICsga11bZ1ggKyBsXSA9IGNlbGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdGFibGUgZ3JpZCBhbmQgcmVjb3JkIGhlYWRlcnMgdGhhdCBwb2ludCB0byBjZWxscyBhbmRcbiAgICAgICAgICAgIC8vIGNlbGxzIHRoYXQgYXJlIHBvaW50ZWQgdG8gYnkgaGVhZGVyc1xuICAgICAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICBsZXQgbG9va3VwID0ge31cbiAgICAgICAgICAgIGxldCBzY29wZWRDb2xzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyaWQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm93U2NvcGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBncmlkW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmlkQ2VsbCA9IGdyaWRbaV1bal07XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmlkTm9kZU5hbWUgPSBncmlkQ2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZE5vZGVOYW1lID09IFwidGhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWRDZWxsLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTY29wZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXhpcyBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBub3QgZW5vdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJheGlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChncmlkQ2VsbC5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PSBcInJvd2dyb3VwXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGF4aXMgYXR0cmlidXRlLCBpdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NvcGUgaXMgbm90IGVub3VnaC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiYXhpc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW0NhY2hlVXRpbC5nZXRDYWNoZShncmlkQ2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwic2NvcGVcIikgPT0gXCJjb2xcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZENvbHNbal0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXhpcyBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBub3QgZW5vdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJheGlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVycyBjYW4gcmVmZXIgdG8gb3RoZXIgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGhlYWRFbGVtLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyaWROb2RlTmFtZSA9PSBcInRkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dTY29wZWQgfHwgc2NvcGVkQ29sc1tqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFtDYWNoZVV0aWwuZ2V0Q2FjaGUoZ3JpZENlbGwsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW0NhY2hlVXRpbC5nZXRDYWNoZShoZWFkRWxlbSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbG9va3VwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByY0luZm8gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgdEluZm8gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcmNJbmZvICYmIHRJbmZvICYmIHJjSW5mbyBpbiB0SW5mbztcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiByY0luZm8gPT09IFwiMDowXCIgJiZcbiAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHRlc3QgaWYgaXQncyB0aGUgdXBwZXItbGVmdCBjZWxsIGFuZCBpdCdzIGVtcHR5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSB0YWJsZSBoYXMgbm8gdGgncywgaXQgbWF5IGp1c3QgYmUgdGhhdCB0aGlzIHdhcyBzdXBwb3NlZCB0byBiZSBhIGxheW91dFxuICAgICAgICAvLyB0YWJsZSwgd2hpY2ggaW50cm9kdWNlcyBhIGxvdCBvZiBub2lzZS4gIEluIHRoYXQgY2FzZSwgb25seSB0cmlnZ2VyIHRoaXMgZXJyb3JcbiAgICAgICAgLy8gb25jZSBwZXIgdGFibGUuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHBhcmVudFRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhcIikubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGlmIChDYWNoZVV0aWwuZ2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkX1RyaWdPbmNlXCIsIGZhbHNlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRfVHJpZ09uY2VcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9sYXlvdXRfbGluZWFyaXplZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGFibGVfTGF5b3V0VHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGFibGVfbGF5b3V0X2xpbmVhcml6ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2xheW91dF9saW5lYXJpemVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGFibGUgaXMgbm90IGJlaW5nIHVzZWQgdG8gZm9ybWF0IHRleHQgY29udGVudCBpbiBjb2x1bW5zIHVubGVzcyB0aGUgdGFibGUgY2FuIGJlIGxpbmVhcml6ZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2luZyB0YWJsZXMgdG8gZm9ybWF0IHRleHQgZG9jdW1lbnRzIGluIGNvbHVtbnMgdW5sZXNzIHRoZSB0YWJsZSBjYW4gYmUgbGluZWFyaXplZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gIVRhYmxlVXRpbC5pc0xheW91dFRhYmxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX3Njb3BlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3Njb3BlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206dGRbc2NvcGVdLCBkb206dGhbc2NvcGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfU2NvcGVfVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfc2NvcGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInRhYmxlX3Njb3BlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlZhbHVlIHByb3ZpZGVkIGlzIGludmFsaWQgZm9yIHRoZSAnc2NvcGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ3Njb3BlJyBhdHRyaWJ1dGUgc2hvdWxkIG9ubHkgYmUgdXNlZCBvbiBhIDx0aD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlZhbHVlIGZvciAnc2NvcGUnIGF0dHJpYnV0ZSBtdXN0IGJlIFxcXCJyb3dcXFwiLCBcXFwiY29sXFxcIiwgXFxcInJvd2dyb3VwXFxcIiwgb3IgXFxcImNvbGdyb3VwXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICd0ZCcpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG5cbiAgICAgICAgLy9vbmx5IGNvbnRpbnVlIGZvciAndGgnXG4gICAgICAgIGxldCBzY29wZVZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gL14ocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkkLy50ZXN0KHNjb3BlVmFsKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RhYmxlX1N0cnVjdHVyZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgd2l0aCBcXFwicHJlc2VudGF0aW9uXFxcIiByb2xlIG9yIFxcXCJub25lXFxcIiByb2xlIGhhcyBzdHJ1Y3R1cmFsIGVsZW1lbnQocykgYW5kL29yIGF0dHJpYnV0ZShzKSAnezF9J1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmxlIGVsZW1lbnRzIHdpdGggJ3JvbGU9XFxcInByZXNlbnRhdGlvblxcXCIgb3IgJ3JvbGU9XFxcIm5vbmVcXFwiIHNob3VsZCBub3QgaGF2ZSBzdHJ1Y3R1cmFsIGVsZW1lbnRzIG9yIGF0dHJpYnV0ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmIChUYWJsZVV0aWwuaXNEYXRhVGFibGUocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmlzTm9kZUluR3JpZChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBlcnJvck5vZGVzID0gW107XG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInN1bW1hcnlcIikpXG4gICAgICAgICAgICBlcnJvck5vZGVzLnB1c2gocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBjYXB0aW9uRWxlbXMgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNhcHRpb25cIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FwdGlvbkVsZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihjYXB0aW9uRWxlbXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY2FwdGlvbkVsZW1zW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGVycm9yTm9kZXNcbiAgICAgICAgICAgICAgICBlcnJvck5vZGVzLnB1c2goY2FwdGlvbkVsZW1zW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aE5vZGVzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0aFwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcih0aE5vZGVzW2ldLCBcInRhYmxlXCIpID09IHJ1bGVDb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHRoTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgZXJyb3JOb2Rlc1xuICAgICAgICAgICAgICAgIGVycm9yTm9kZXMucHVzaCh0aE5vZGVzW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdGROb2RlcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCh0ZE5vZGVzW2ldLmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpIHx8IHRkTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkgJiZcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHRkTm9kZXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4odGROb2Rlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBlcnJvck5vZGVzXG4gICAgICAgICAgICAgICAgZXJyb3JOb2Rlcy5wdXNoKHRkTm9kZXNbaV0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBhY3R1YWxseSBtYWtpbmcgdXNlIG9mIHRoZXNlcyBlcnJvck5vZGVzIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHBhc3NlZCBhbG9uZyB3aXRoXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGlvblJlc3VsdCwgd2UgZG8gbm90IG5lZWQgdG8ga2VlcCBsb29waW5nIG92ZXIgYW5kIGdldHRpbmcgZXZlcnkgc2luZ2xlIHZpb2xhdGluZyBub2RlIHVuZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJ1bGUgY29udGV4dC4gVGhpcyBjYW4gYmUgYSBmdXR1cmUgZW5oYW5jZW5tZW50IHdoZXJlIHdlIGFjdHVhbGx5IG1ha2UgdXNlIG9mIHRoZSBlcnJvciBub2RlcyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCBhbG9uZy4gQWRkaW5nIHRoaXMgYnJlYWsgdG8gc3BlZWQgdXAgcGVyZm9ybWFuY2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICBicmVhazsgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8ga2VlcCBhZGRpbmcgdGhlIGVycm9yIG5vZGVzLCBzdG9wIGFmdGVyIGZpbmRpbmcgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBub2RlIG5hbWUgZm9yIHRoZSBydWxlIGNvbnRleHQgZWxlbWVudCBpbiB0aGlzIGNhc2UgaXQgd2lsbCBhbHdheXMgYmUgdGFibGVcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50VG9rZW4gPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhIG5ldyBhcnJheSB3aGljaCB3aWxsIGNvbnRhbiBvbmx5IHRoZSBlbGVtZW50IHRhZyBmb3IgdGhlIHZpb2xhdGlvbiBlbGVtZW50c1xuICAgICAgICBsZXQgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBzZWVuIGhhc2ggdGhhdCB3aWxsIGtlZXAgdHJhc2sgb2YgYWxsIHRoZSBlbGVtZW50cyB0aGF0IHdlcmUgYWxyZWFkeSBhZGRlZCB0byB0aGUgdG9rZW4gYXJyYXksIHRvIG1ha2Ugc3VyZVxuICAgICAgICAvLyB3ZSBkbyBub3QgZHVwbGljYXRlIGFueSBvZiB0aGUgZWxlbWVudHMuIER1cGxpY2F0ZSBlbGVtZW50IHRhZ3MgaW4gdGhlIHRva2VuIG1lc3NhZ2UgbG9va3MgYmFkIGFuZCBjb25mdXNpbmcuXG4gICAgICAgIGxldCBzZWVuID0ge307XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdmlvbGF0aW5nIHN0cnVjdHVyYWwgZWxlbWVudHMgYW5kIGV4dHJhY3QgdGhlIGVsZW1lbnQgdGFnIHRvIGJlIHVzZWQgYXMgYSB0b2tlblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9yTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBuYW1lICh0YWcgbmFtZSkgZm9yIHRoZSB2aW9sYXRpbmcgc3RydWN0dXJhbCBlbGVtZW50XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBlcnJvck5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBhZGQgdGhlIHZpb2xhdGluZyBlbGVtZW50IG9uY2VcbiAgICAgICAgICAgIGlmICghc2Vlbi5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgYWRkaW5nIHRoZSB0b2tlbiBhcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3ZSBuZWVkIHRvIGhhbmRsZVxuICAgICAgICAgICAgICAgIC8vIHRoZSBzdW1tYXJ5IGF0dHJpYnV0ZSBvbiB0aGUgcnVsZUNvbnRleHQgKHRhYmxlKS4gV2Ugb25seSBhZGQgc3VtbWFyeSBvbmNlLCBzYW1lIGFzXG4gICAgICAgICAgICAgICAgLy8gZm9yIGVsZW1lbnRzIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGluIHRoZSBtZXNzYWdlLiAoU3VtbWFyeSBzaG91bGQgbm90IGR1cGxpY2F0ZSwgYnV0IGp1c3QgaW4gY2FzZSlcbiAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmICFzZWVuLmhhc093blByb3BlcnR5W1wic3VtbWFyeVwiXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIHNlZW5bXCJzdW1tYXJ5XCJdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgbmV3IHZpb2xhdGluZyBlbGVtZW50IGFkZCBpdCB0byB0aGUgc3RydWN0dXJhbCBlbGVtZW50IHRva2VucyBhcnJheVxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsRWxlbWVudFRva2Vucy5wdXNoKFwic3VtbWFyeVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBzZWVuW25vZGVOYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIG5ldyB2aW9sYXRpbmcgZWxlbWVudCBhZGQgaXQgdG8gdGhlIHN0cnVjdHVyYWwgZWxlbWVudCB0b2tlbnMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMucHVzaChub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIHRoZSBhcnJheSBvZiBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZCBqb2luIHRoZW0gd2l0aCBhIGNvbW1hIGFuZCBhIHNwYWNlIHRvIG1ha2UgZ3JhbW1hdGljYWwgY29ycmVjdCBpblxuICAgICAgICAvLyB0aGUgbWVzc2FnZS5cbiAgICAgICAgbGV0IHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyID0gc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KGVycm9yTm9kZXMubGVuZ3RoID09IDAsIGVycm9yTm9kZXMsICcnLCAnJywgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zXSk7XG4gICAgICAgIGlmIChlcnJvck5vZGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyXSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfQ2FwU3VtbVJlZHVuZGFudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfc3VtbWFyeV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIHRhYmxlIHN1bW1hcnkgZHVwbGljYXRlcyB0aGUgY2FwdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSB0YWJsZSBzdW1tYXJ5IG11c3Qgbm90IGR1cGxpY2F0ZSB0aGUgY2FwdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcG9mSWQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgc3VtU3RyO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3VtbWFyeVwiKSkge1xuICAgICAgICAgICAgcG9mSWQgPSAwO1xuICAgICAgICAgICAgc3VtU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3VtbWFyeVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDE7XG4gICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGVJZHMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGxldCBzdW1tYXJ5Tm9kZUNvbmNhdCA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1bW1hcnlOb2RlSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1bW1hcnlOb2RlSWQgPSBzdW1tYXJ5Tm9kZUlkc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoc3VtbWFyeU5vZGVJZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgc3VtbWFyeU5vZGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdW1tYXJ5Tm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShzdW1tYXJ5Tm9kZSxydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlOb2RlQ29uY2F0ICs9IFwiIFwiICsgQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoc3VtbWFyeU5vZGUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3VtU3RyID0gc3VtbWFyeU5vZGVDb25jYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdW1TdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNhcEVsZW1zID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjYXB0aW9uXCIpO1xuICAgICAgICAgICAgaWYgKGNhcEVsZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdW1TdHIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjYXBTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChjYXBFbGVtc1swXSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFzdW1TdHIuaW5jbHVkZXMoY2FwU3RyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZUZhaWwsIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG4gICAgXG4gICAgZXhwb3J0IGNvbnN0IHRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnQ6IFJ1bGUgPSB7XG4gICAgICAgIGlkOiBcInRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnRcIixcbiAgICAgICAgY29udGV4dDogXCJkb206KlwiLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgICAgICBoZWxwOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgICAgICBcImdyb3VwXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX3NwYWNpbmdcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc2l6ZWRcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3NfaW5saW5lXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX2RlZmF1bHRcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInZpb2xhdGlvbl9zcGFjaW5nXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJyZWNvbW1lbmRhdGlvbl9pbmxpbmVcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBvdGVudGlhbF9vdmVybGFwXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgdGFyZ2V0IG11c3QgYmUgc3VmZmljaWVudGx5IHNpemVkIG9yIHNwYWNlZCBmcm9tIG90aGVyIHRhcmdldHNcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc3BhY2luZ1wiOiBcIlRoZSB0YXJnZXQncyBzcGFjaW5nIGZyb20gb3RoZXIgdGFyZ2V0cyBpcyBzdWZmaWNpZW50XCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX3NpemVkXCI6IFwiVGhlIHRhcmdldOKAmXMgc2l6ZSBpcyBtb3JlIHRoYW4gMjQgQ1NTIHBpeGVsc1wiLFxuICAgICAgICAgICAgICAgIFwicGFzc19pbmxpbmVcIjogXCJUaGUgdGFyZ2V0IGlzIGluIGEgc2VudGVuY2Ugb3IgaXRzIHNpemUgaXMgb3RoZXJ3aXNlIGNvbnN0cmFpbmVkIGJ5IHRoZSBsaW5lLWhlaWdodCBvZiBub24tdGFyZ2V0IHRleHRcIixcbiAgICAgICAgICAgICAgICBcInBhc3NfZGVmYXVsdFwiOiBcIlRoZSB0YXJnZXQncyBzaXplIGlzIGRldGVybWluZWQgYnkgdGhlIHVzZXIgYWdlbnQgYW5kIGlzIG5vdCBtb2RpZmllZCBieSB0aGUgYXV0aG9yXCIsXG4gICAgICAgICAgICAgICAgXCJ2aW9sYXRpb25fc3BhY2luZ1wiOiBcIlVuZGVyc2l6ZWQgdGFyZ2V0IFxcXCJ7MH1cXFwiIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBzcGFjaW5nIG9mIDEyIENTUyBwaXhlbHMgZnJvbSBhbm90aGVyIHRhcmdldCBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgICAgIFwicmVjb21tZW5kYXRpb25faW5saW5lXCI6IFwiQ29uZmlybSB0aGUgaW5saW5lIHRhcmdldCBcXFwiezB9XFxcIiBpcyBzdWZmaWNpZW50bHkgc3BhY2VkIGZyb20gYW5vdGhlciBpbmxpbmUgdGFyZ2V0IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3ZlcmxhcFwiOiBcIkVuc3VyZSB0aGUgb3ZlcmxhcHBlZCB0YXJnZXQgXFxcInswfVxcXCIgbWVldHMgYSBtaW5pbXVtIHRhcmdldCBzaXplIG9yIGhhcyBzdWZmaWNpZW50IHNwYWNpbmcgZnJvbSB0aGUgb3ZlcmxhcHBpbmcgdGFyZ2V0IFxcXCJ7MX1cXFwiXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcnVsZXNldHM6IFt7XG4gICAgICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgICAgbnVtOiBbXCIyLjUuOFwiXSxcbiAgICAgICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUsXG4gICAgICAgICAgICByZWFzb25Db2RlczogW1wicGFzc19zcGFjaW5nXCIsXCJwYXNzX3NpemVkXCIsIFwicGFzc19pbmxpbmVcIixcInBhc3NfZGVmYXVsdFwiLCBcInZpb2xhdGlvbl9zcGFjaW5nXCIsIFwicG90ZW50aWFsX292ZXJsYXBcIl1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgICAgIG51bTogW1wiMi41LjhcIl0sXG4gICAgICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUsXG4gICAgICAgICAgICByZWFzb25Db2RlczogW1wicmVjb21tZW5kYXRpb25faW5saW5lXCJdXG4gICAgICAgIH1dLFxuICAgICAgICBhY3Q6IFtdLFxuICAgICAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBtYXBwZXIgOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhydWxlQ29udGV4dCk7IC8vY29udGV4dFtcImRvbVwiXS5ib3VuZHM7ICAgIFxuICAgICAgICAgICAgaWYgKCFib3VuZHMpIFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBpZ25vcmUgaGlkZGVuLCBub24tdGFyZ2V0XG4gICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuaXNUYXJnZXQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBpZiAoYm91bmRzLmhlaWdodCA+PSAyNCAmJiBib3VuZHMud2lkdGggPj0gMjQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19zaXplZFwiKTsgXG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlubGluZSBlbGVtZW50OiB3aXRob3V0IHRleHQgaW4gdGhlIHNhbWUgbGluZVxuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gQ1NTVXRpbC5nZXRJbmxpbmVTdGF0dXMocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAoc3RhdHVzLmlubGluZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnZpb2xhdGlvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfaW5saW5lXCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IGlubGluZSBlbGVtZW50IGlzIHRvbyBjbG9zZSBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25faW5saW5lXCIsIFtub2RlTmFtZSwgc3RhdHVzLnZpb2xhdGlvbl0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmlvbGF0aW9uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19kZWZhdWx0XCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IGlubGluZSBlbGVtZW50IGlzIHRvbyBjbG9zZSBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25faW5saW5lXCIsIFtub2RlTmFtZSwgc3RhdHVzLnZpb2xhdGlvbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGJyb3dzZXIgZGVmYXVsdFxuICAgICAgICAgICAgICAgIGlmIChDU1NVdGlsLmlzVGFyZ2V0QnJvd3NlckRlZmF1bHQocnVsZUNvbnRleHQpKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19kZWZhdWx0XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChjU3R5bGUgPT09IG51bGwpIFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgemluZGV4ID0gY1N0eWxlLnpJbmRleDsgICBcbiAgICAgICAgICAgIGlmICghemluZGV4IHx8IGlzTmFOKE51bWJlcih6aW5kZXgpKSlcbiAgICAgICAgICAgICAgICB6aW5kZXggPSBcIjBcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHRhcmdldCBlbGVtZW50c1xuICAgICAgICAgICAgbGV0IHRhcmdldEVsZW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYy5kb2N1bWVudEVsZW1lbnQsIFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudDo6dGFyZ2V0c1wiLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRFbGVtcyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHRhcmdldEVsZW1zID0gW107XG4gICAgICAgICAgICAgICAgLy9zZWxlY3QgYWxsIGVsZW1lbnRzIGV4Y2VwdCBpdHNlbGYgYW5kIGRlc2NlbmRhbnRzXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1zID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgKjpub3Qoc2NyaXB0KTpub3Qoc3R5bGUpJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZWxlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1zW2ldIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc1RhcmdldChlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RWxlbXMucHVzaChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLmRvY3VtZW50RWxlbWVudCwgXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Ojp0YXJnZXRzXCIsIHRhcmdldEVsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0YXJnZXRFbGVtcyB8fCB0YXJnZXRFbGVtcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBtaW5YID0gMjQ7XG4gICAgICAgICAgICBsZXQgbWluWSA9IDI0O1xuICAgICAgICAgICAgbGV0IGFkamFjZW50WCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgYWRqYWNlbnRZID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBjaGVja2VkID0gW107IC8vY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgc28gdGhlaXIgZGVzY2VuZGFudHMgZG9uJ3QgbmVlZCB0byBiZSBjaGVja2VkIGFnYWluXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0YXJnZXRFbGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB0YXJnZXRFbGVtc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiAgdGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBpcyBpbiBkb2N1bWVudCBvcmRlclxuICAgICAgICAgICAgICAgICAqICBpZiB0d28gZWxlbWVudHMgb3ZlcmxhcCBhbmQgei1pbmRleCBhcmUgbm90IGRlZmluZWQsIHRoZW4gdGhlIG5vZGUgcmVuZGVyZWQgZWFybGllciB3aWxsIGJlIG92ZXJsYWlkIGJ5IHRoZSBub2RlIHJlbmRlcmVkIGxhdGVyXG4gICAgICAgICAgICAgICAgICogIGZpbHRlciBvdXQgdGhlIGVsZW1lbnRzIHRoYXTigJlyZSBkZXNjZW5kYW50IG9yIGFuY2VzdG9ycyBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQsIG5vciBkZXNjZW5kYW50IG9mIHRoZSB0YXJnZXQgZWxlbWVudCdzIHNpYmxpbmdzXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgLy8gVXNlIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHRvIGNoZWNrIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcHNcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiByZXR1cm5zIDAgd2hlbiBjb21wYXJpbmcgYSBub2RlIHRvIGl0c2VsZlxuICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcnVsZUNvbnRleHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZICgxNik6IGVsZW0gaXMgY29udGFpbmVkIGJ5IHJ1bGVDb250ZXh0XG4gICAgICAgICAgICAgICAgLy8gQWxzbyBoYW5kbGUgc2VsZi1jb21wYXJpc29uIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IDAgfHwgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgbm9kZSBpbiBlbGVtcyB3aWxsIGJlIGFmdGVyIHRoZSB0YXJnZXQgbm9kZSAocnVsZUNvbnRleHQpLlxuICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TICg4KTogZWxlbSBjb250YWlucyBydWxlQ29udGV4dFxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhc2NlbmRhbnRzIG9mIHRoZSBlbGVtZW50LCBvciBpdHNlbGYgb3IgaXRzIGFzY2VuZGFudCBhbHJlYWR5IGNoZWNrZWRcbiAgICAgICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykgfHwgY2hlY2tlZC5zb21lKGl0ZW0gPT4gaXRlbS5jb250YWlucyhlbGVtKSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKGVsZW0pO1xuICAgICAgICAgICAgICAgIGlmICghYm5kcykgY29udGludWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IHpTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbSk7IFxuICAgICAgICAgICAgICAgIGxldCB6X2luZGV4ID0gJzAnO1xuICAgICAgICAgICAgICAgIGlmICh6U3R5bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgel9pbmRleCA9IHpTdHlsZS56SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmICghel9pbmRleCB8fCBpc05hTihOdW1iZXIoel9pbmRleCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgel9pbmRleCA9IFwiMFwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNhc2UgMjogdGhlIGVsZW1lbnQgb3ZlcmxhcHMgdGhlIHRhcmdldCBlbnRpcmVseVxuICAgICAgICAgICAgICAgIC8vIG5vdGUgd2hlbiBhIGxpbmsgaXMgaW5saW5lIHdpdGggb3RoZXIgdGFyZ2V0LCBpZiB0aGUgbGluayB0ZXh0IHdyYXBzIGluIGFub3RoZXIgbGluZSBpbiBhIGdpdmVuIHZpZXdwb3J0LCAgXG4gICAgICAgICAgICAgICAgLy8gdGhlIGJvdW5kcyBvZiB0aGUgbGluayBtYXkgY292ZXIgYW5kIHRoZSBlbnRpcmUgdHdvIGxpbmVzLCBjYXVzaW5nIHRoZSBvdGhlciB0YWdldHMgdG8gYmUgb3ZlcmxhcHBlZCwgc2VlIHR3byBsaW5rcyBpbiB0aGUgdGVzdCBjYXNlOiBlbGVtZW50X2lubGluZS5odG1sIFxuICAgICAgICAgICAgICAgIGlmIChibmRzLnRvcCA8PSBib3VuZHMudG9wICYmIGJuZHMubGVmdCA8PSBib3VuZHMubGVmdCAmJiBibmRzLnRvcCArIGJuZHMuaGVpZ2h0ID49IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IFxuICAgICAgICAgICAgICAgICAgICAmJiBibmRzLmxlZnQgKyBibmRzLndpZHRoID49IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YXJnZXQgb24gdG9wICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID8gcGFyc2VJbnQoemluZGV4KSA8IHBhcnNlSW50KHpfaW5kZXgpOiBwYXJzZUludCh6aW5kZXgpIDw9IHBhcnNlSW50KHpfaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFyZ2V0IGlzIGVudGlyZWx5IGNvdmVyZWQ6IHRhYmJhYmxlIHRhcmdldCBoYW5kbGVkIGJ5IGVsZW1lbnRfdGFiYmFibGVfdW5vYnNjdXJlZCBhbmQgdGFiaW5kZXg9LTEgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb3ZlcmxhcFwiLCBbbm9kZU5hbWUsIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY2FzZSAzOiBpZiB0aGUgdGFyZ2V0IG92ZXJsYXBzIHRoZSBlbGVtZW50IGVudGlyZWx5XG4gICAgICAgICAgICAgICAgaWYgKGJvdW5kcy50b3AgPD0gYm5kcy50b3AgJiYgYm91bmRzLmxlZnQgPD0gYm5kcy5sZWZ0ICYmIGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0ID49IGJuZHMudG9wICsgYm5kcy5oZWlnaHQgXG4gICAgICAgICAgICAgICAgICAgICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoID49IGJuZHMubGVmdCArIGJuZHMud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgb24gdG9wICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID8gcGFyc2VJbnQoemluZGV4KSA8IHBhcnNlSW50KHpfaW5kZXgpOiBwYXJzZUludCh6aW5kZXgpIDw9IHBhcnNlSW50KHpfaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdmVybGFwXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgLy8gdGhlIHRhcmdldCBvbiB0b3BcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcInZpb2xhdGlvbl9zcGFjaW5nXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7ICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY2FzZSA0OiB0aGUgZWxlbWVudCBvdmVybGFwcyBwYXJ0aWFsbHkgd2l0aCB0aGUgdGFyZ2V0XG4gICAgICAgICAgICAgICAgaWYgKCgoKGJvdW5kcy50b3AgPj0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCA8PSBibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSB8fCAoYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPD0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPj0gYm5kcy50b3AgK2JuZHMuaGVpZ2h0KSlcbiAgICAgICAgICAgICAgICAgICAgICYmICgoYm91bmRzLmxlZnQgPiBibmRzLmxlZnQgJiYgYm91bmRzLmxlZnQgPCBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm5kcy5sZWZ0ID4gYm91bmRzLmxlZnQgJiYgYm5kcy5sZWZ0IDwgYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGgpKSkgXG4gICAgICAgICAgICAgICAgICAgICB8fCAoKChib3VuZHMudG9wID4gYm5kcy50b3AgJiYgYm91bmRzLnRvcCA8IGJuZHMudG9wICsgYm5kcy5oZWlnaHQpIHx8IChibmRzLnRvcCA+IGJvdW5kcy50b3AgJiYgYm5kcy50b3AgPCBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCkpXG4gICAgICAgICAgICAgICAgICAgICAmJiAoKGJvdW5kcy5sZWZ0ID49IGJuZHMubGVmdCAmJiBib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggPj0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIDw9IGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG1vcmUgY2hlY2sgdG8gdHVybiB0byB2aW9sYXRpb24gIFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb3ZlcmxhcFwiLCBbbm9kZU5hbWUsIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pOyBcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG5vIG92ZXJsYXAgd2l0aCB0aGUgZWxlbSwgdGhvdWdoIG1heSBvdmVybGFwIHdpdGhlIG90aGVyIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXNYID0gMjQ7IFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlzWSA9IDI0OyAgIFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWxlbWVudCBpcyBpbiB0aGUgaG9yaXpvbnRhbGx5IHNhbWUgcm93IHdpdGggdGhlIHRhcmdldFxuICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoIDwgMjQgJiYgKChib3VuZHMudG9wID49IGJuZHMudG9wICYmIGJvdW5kcy50b3AgPD0gYm5kcy50b3AgKyBibmRzLmhlaWdodCkgfHwgKGJvdW5kcy50b3AgPD0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPiBibmRzLnRvcCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzWCA9IE1hdGgubWluKCBNYXRoLmFicyhib3VuZHMubGVmdCAtIGJuZHMubGVmdCksIE1hdGguYWJzKGJvdW5kcy5sZWZ0IC0gKGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSwgIE1hdGguYWJzKGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC0gKGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSwgTWF0aC5hYnMoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLSBibmRzLmxlZnQpKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IGlzIGluIHRoZSB2ZXJ0aWNhbGx5IHNhbWUgY29sdW1uIHdpdGggdGhlIHRhcmdldCAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvdW5kcy5oZWlnaHQgPCAyNCAmJiAoKGJvdW5kcy5sZWZ0ID49IGJuZHMubGVmdCAmJiBib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm91bmRzLmxlZnQgPD0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoID4gYm5kcy5sZWZ0KSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNZID0gTWF0aC5taW4oTWF0aC5hYnMoYm91bmRzLnRvcCAtIGJuZHMudG9wKSwgTWF0aC5hYnMoYm91bmRzLnRvcCAtIChibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSksICBNYXRoLmFicyhib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAtIChibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSksIE1hdGguYWJzKGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC0gYm5kcy50b3ApKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXNYIDwgbWluWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluWCA9IGRpc1g7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFggPSBlbGVtO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoZGlzWSA8IG1pblkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pblkgPSBkaXNZOyAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnRZID0gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja2VkLnB1c2goZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGNhc2UgNTogbm8gb3ZlcmxhcCArIGluc3VmZmljaWVudCB0YXJnZXQgc2l6ZS4gY2hlY2sgc3BhY2luZyAgICBcbiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aC8yKSArIG1pblggPCAxMiB8fCBNYXRoLnJvdW5kKGJvdW5kcy5oZWlnaHQvMikgKyBtaW5ZIDwgMTIpIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5yb3VuZChib3VuZHMud2lkdGgvMikgKyBtaW5YIDwgTWF0aC5yb3VuZChib3VuZHMuaGVpZ2h0LzIpICsgbWluWSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwidmlvbGF0aW9uX3NwYWNpbmdcIiwgW25vZGVOYW1lLCBhZGphY2VudFgubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pOyBcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJ2aW9sYXRpb25fc3BhY2luZ1wiLCBbbm9kZU5hbWUsIGFkamFjZW50WS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19zcGFjaW5nXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X2Jsb2NrX2hlYWRpbmc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9ibG9ja19oZWFkaW5nXCIsXG4gICAgY29udGV4dDogXCJkb206cCwgZG9tOmRpdiwgZG9tOmJyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxvY2tfU2hvdWxkQmVIZWFkaW5nXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9oZWFkaW5nXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwidGV4dF9ibG9ja19oZWFkaW5nLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2hlYWRpbmdcIjogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfYmxvY2tfaGVhZGluZy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJIZWFkaW5nIHRleHQgdXNlcyBhIGhlYWRpbmcgZWxlbWVudCBvciByb2xlXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9oZWFkaW5nXCI6IFwiQ29uZmlybSB0aGlzIHRleHQgJ3swfScgaXMgdXNlZCBhcyBhIGhlYWRpbmcgYW5kIGlmIHNvLCBtb2RpZnkgdG8gdXNlIGEgaGVhZGluZyBlbGVtZW50IG9yIHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIZWFkaW5nIHRleHQgc2hvdWxkIHVzZSBhIGhlYWRpbmcgZWxlbWVudCBvciByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInNjcmlwdFwiXSkgIT09IG51bGwpIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBudW1Xb3Jkczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAxMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgYm9keUZvbnQgPSAwO1xuICAgICAgICBsZXQgYm9keSA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpO1xuICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgYm9keVN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShib2R5WzBdKTtcbiAgICAgICAgICAgIGlmIChib2R5U3R5bGUpIGJvZHlGb250ID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoYm9keVN0eWxlWydmb250LXNpemUnXSwgYm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG51bVdvcmRzID0gdmFsaWRhdGVQYXJhbXMubnVtV29yZHMudmFsdWU7XG4gICAgICAgIGxldCB3b3Jkc1NlZW4gPSAwO1xuICAgICAgICBsZXQgd29yZFN0cjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGVtcGhhc2l6ZWRUZXh0ID0gZmFsc2U7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQpO253Lm5leHROb2RlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiZcbiAgICAgICAgICAgIG53Lm5leHROb2RlKCkgJiYgXG4gICAgICAgICAgICBudy5ub2RlICE9PSBydWxlQ29udGV4dCAmJlxuICAgICAgICAgICAgbncubm9kZSAhPT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocnVsZUNvbnRleHQpICYmXG4gICAgICAgICAgICAhW1wiYnJcIiwgXCJkaXZcIiwgXCJwXCJdLmluY2x1ZGVzKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIC8vIERvbid0IHJlcG9ydCB0d2ljZVxuICAgICAgICB7ICAgXG4gICAgICAgICAgICBpZiAobncubm9kZSA9PT0gcnVsZUNvbnRleHQgfHwgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgbndOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDMpIHsgXG4gICAgICAgICAgICAgICAgLy8gZm9yIHRleHQgY2hpbGRcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDAgJiYgbncubm9kZS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGl0J3Mgc3R5bGUgaWYgdGhlIHRhcmdldCBlbGVtZW50IGNvbnRhaW5zIHRleHQsIGUuZy4sIDxwPiBmYWtlIGhlYWRpbmc8L3A+IFxuICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG53Lm5vZGUucGFyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSAmJiAoc3R5bGVbJ2ZvbnQtd2VpZ2h0J10gPT09ICdib2xkJyB8fCBzdHlsZVsnZm9udC13ZWlnaHQnXSA+PSA3MDBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAoc3R5bGVbJ2ZvbnQtc2l6ZSddICYmIHN0eWxlWydmb250LXNpemUnXS5pbmNsdWRlcyhcImxhcmdlXCIpKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdHlsZVsnZm9udC1zaXplJ10gJiYgYm9keUZvbnQgIT09IDAgJiYgQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVbJ2ZvbnQtc2l6ZSddLG53Lm5vZGUucGFyZW50RWxlbWVudCkgID4gYm9keUZvbnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdjID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRTdHIucHVzaChuZXh0U3RyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZHNTZWVuICs9IHdjO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgbm9kZSBiZWNhdXNlIGl0J3MgZW1waGFzaXplZFxuICAgICAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm9kZSBjb250YWluIHJlZ3VsYXIgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBlbGVtZW50IGNoaWxkXG4gICAgICAgICAgICAgICAgaWYgKG53TmFtZSA9PT0gXCJiXCIgfHwgbndOYW1lID09PSBcInN0cm9uZ1wiIHx8IG53TmFtZSA9PT0gXCJ1XCIgfHwgbndOYW1lID09PSBcImZvbnRcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgY29udGFpbnMgZW1waGFzaXMgY2hpbGQsIGUuZy4sIDxwPjxzdHJvbmc+ZmFrZSBoZWFkaW5nPC9zdHJvbmc+PC9wPiBcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChudy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAod2MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JkU3RyLnB1c2gobmV4dFN0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3Jkc1NlZW4gKz0gd2M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBub2RlIGJlY2F1c2UgaXQncyBlbXBoYXNpemVkXG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZWxlbWVudCB3aGljaCBoYXMgYSByb2xlIGV4Y2VwdCAnZ2VuZXJpYycsICdwYXJhZ3JhcGgnIG9yICdzdHJvbmcnXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhcHBsZXQgZWxlbWVudCB0aGF0IGlzIGRlcHJlY2F0ZWQgYW55d2F5XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAocm9sZSAhPT0gbnVsbCAmJiByb2xlICE9PSAnZ2VuZXJpYycgJiYgcm9sZSAhPT0gJ3BhcmFncmFwaCcgJiYgcm9sZSAhPT0gJ3N0cm9uZycpIHx8IG53TmFtZSA9PT0gXCJhcHBsZXRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdvcmRzU2VlbiA9PSAwKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAvL2lnbm9yZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCDigJw64oCdICDigJws4oCdICDigJwt4oCdICDigJw74oCdIG9yIOKAnC7igJ0gXG4gICAgICAgIGlmICghcGFzc2VkKSBwYXNzZWQgPSAvWzosO1xcLVxcLl0kLy50ZXN0KHdvcmRTdHIuam9pbihcIiBcIikudHJpbSgpKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfaGVhZGluZ1wiLCBbd29yZFN0ci5qb2luKFwiIFwiKV0pO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENvbG9yVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbG9yVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50OiBSdWxlID0ge1xuICAgIGlkOiBcInRleHRfY29udHJhc3Rfc3VmZmljaWVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfQ29sb3JfQ29udHJhc3RfV0NBRzJBQVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9jb250cmFzdFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJJQk1BX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFfUFZcIjoge1xuICAgICAgICAgICAgXCJwYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX2dyYXBoaWNfYmFja2dyb3VuZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYHRleHRfY29udHJhc3Rfc3VmZmljaWVudC5odG1sYCxcbiAgICAgICAgICAgIFwiZmFpbF9jb250cmFzdFwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfc2FtZV9jb2xvclwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZ3JhcGhpY19iYWNrZ3JvdW5kXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0X3NoYWRvd1wiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb250cmFzdCByYXRpbyBvZiB0ZXh0IHdpdGggaXRzIGJhY2tncm91bmQgbXVzdCBtZWV0IFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgY29udHJhc3QgcmF0aW8gb2YgdGV4dCB3aXRoIGl0cyBiYWNrZ3JvdW5kIG1lZXRzIFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJhc3RcIjogXCJUZXh0IGNvbnRyYXN0IG9mIHswfSB3aXRoIGl0cyBiYWNrZ3JvdW5kIGlzIGxlc3MgdGhhbiB0aGUgV0NBRyBBQSBtaW5pbXVtIHJlcXVpcmVtZW50cyBmb3IgdGV4dCBvZiBzaXplIHsxfXB4IGFuZCB3ZWlnaHQgb2YgezJ9XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCI6IFwiVGhlIGZvcmVncm91bmQgdGV4dCBhbmQgaXRzIGJhY2tncm91bmQgY29sb3IgYXJlIGJvdGggZGV0ZWN0ZWQgYXMgezN9LiBWZXJpZnkgdGhlIHRleHQgbWVldHMgdGhlIFdDQUcgQUEgcmVxdWlyZW1lbnRzIGZvciBtaW5pbXVtIGNvbnRyYXN0XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IGFnYWluc3QgdGhlIGxpZ2h0ZXN0IGFuZCB0aGUgZGFya2VzdCBjb2xvcnMgb2YgdGhlIGJhY2tncm91bmQgbWVldHMgdGhlIFdDQUcgQUEgbWluaW11bSByZXF1aXJlbWVudHMgZm9yIHRleHQgb2Ygc2l6ZSB7MX1weCBhbmQgd2VpZ2h0IG9mIHsyfVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfdGV4dF9zaGFkb3dcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IHdpdGggc2hhZG93IG1lZXRzIHRoZSBXQ0FHIEFBIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0ZXh0IG9mIHNpemUgezF9cHggYW5kIHdlaWdodCBvZiB7Mn1cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjEuNC4zXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbJ2FmdzRmNyddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBhdm9pZCBkaWFnbm9zaW5nIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vVE9ETyA/IHNob3VsZCBvbmx5IGNvbnNpZGVyIG5hdGl2ZSBkaXNhYmxlZCwgaWdub3JlIGFyaWEtZGlzYWJsZWRcbiAgICAgICAgLy9za2lwIGRpc2FibGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9za2lwIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzdmdcIiwgXCJzY3JpcHRcIiwgXCJtZXRhXCIsIFwic3R5bGVcIl0pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBsZXQgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgICAgICBpZiAoIXdpbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHQuXG4gICAgICAgIGxldCBjaGlsZFN0ciA9IENvbW1vblV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpIHx8IChDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpICYmIENvbW1vblV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQuc2hhZG93Um9vdCkgPT09ICcnKSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT0gMCApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgdGV4dCBkb2VzIG5vdCBjb252ZXkgYW55dGhpbmcgaW4gaHVtYW4gbGFuZ3VhZ2VcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqICgxKSBpZ25vcmUgbm9uLWFscGhhbnVtZXJpYyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gQVNDSTogXihhLXpBLVpcXGRcXHMpXG4gICAgICAgICAgICAgKiAoMikgaWdub3JlIG5vbi1wcmludGFibGUgdW5pY29kZSBjaGFyYWN0ZXJzOiBcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRlxuICAgICAgICAgICAgICogIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzcwMTE3L3doYXQtaXMtdGhlLXJhbmdlLW9mLXVuaWNvZGUtcHJpbnRhYmxlLWNoYXJhY3RlcnNcbiAgICAgICAgICAgICAqICgzKSBmb3Igbm93IG5vdCBjb25zaWRlciB1bmljb2RlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IGFyZSBkaWZmZXJlbnQgaW4gZGlmZmVyZW50IGxhbmd1YWdlc1xuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC8vbGV0IHJlZ2V4ID0gL1teKGEtekEtWlxcZFxccylcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRl0rL2c7XG4gICAgICAgICAgICBsZXQgcmVnZXggPSAvW14oYS16QS1aXFxkXFxzKVxcXihcXHU0ZTAwLVxcdTlmZmZcXHUzNDAwLVxcdTRkYmYpXFx1MDAwMC1cXHUwMDA4XFx1MDAwQi1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXFx1MjA1Ri1cXHUyMDZGXFx1MzAwMFxcdUZFRkZdKy9nO1xuICAgICAgICAgICAgY2hpbGRTdHIgPSBjaGlsZFN0ci50cmltKCkucmVwbGFjZShyZWdleCwgJycpO1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbSA9IHJ1bGVDb250ZXh0O1xuICAgICAgICAvLyB0aGUgY2hpbGQgZWxlbWVudHMgKHJhdGhlciB0aGFuIHNoYWRvdyByb290KSBvZiBhIHNoYWRvdyBob3N0IGlzIGVpdGhlciByZS1hc3NpZ25lZCB0byB0aGUgc2hhZG93IHNsb3QgaWYgdGhlIHNsb3QgZXhpc3RzIFxuICAgICAgICAvLyBvciBub3QgZGlzcGxheWVkLCBzbyBzaG91bGRuJ3QgYmUgY2hlY2tlZCBmcm9tIHRoZSBsaWdodCBET00sIHJhdGhlciBpdCBzaG91bGQgYmUgY2hlY2tlZCBhcyByZWFzc2dpbmdlZCBzbG90IGVsZW1lbnQocykgaW4gdGhlIHNoYWRvdyBET00uXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAvLyBpZiBpdCdzIGRpcmVjdCB0ZXh0IG9mIGEgc2hhZG93IGhvc3RcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbm9kZT1ydWxlQ29udGV4dC5maXJzdENoaWxkOyBub2RlOyBub2RlPW5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGU9PTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgbXVsdGlwbGUgdGV4dHMgZXhpc3QsIG9ubHkgbmVlZCB0byBjaGVjayBvbmUgXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtID0gKG5vZGUgYXMgVGV4dCkuYXNzaWduZWRTbG90O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH0gICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgc3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEpDSCBjbGlwIElORk86XG4gICAgICAgIC8vICAgICAgVGhlIGNsaXAgcHJvcGVydHkgbGV0cyB5b3Ugc3BlY2lmeSBhIHJlY3RhbmdsZSB0byBjbGlwIGFuIGFic29sdXRlbHkgcG9zaXRpb25lZCBlbGVtZW50LiBcbiAgICAgICAgLy8gICAgICBUaGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBhcyBmb3VyIGNvb3JkaW5hdGVzLCBhbGwgZnJvbSB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNsaXBwZWQuXG4gICAgICAgIC8vICAgICAgUHJvcGVydHkgdmFsdWVzOlxuICAgICAgICAvLyAgICAgICAgICBub25lICAgICAgICBUaGlzIGlzIGRlZmF1bHQuIE5vIGNsaXBwaW5nIGlzIGRvbmVcbiAgICAgICAgLy8gICAgICAgICAgYXV0byAgICAgICAgTm8gY2xpcHBpbmcgd2lsbCBiZSBkb25lXG4gICAgICAgIC8vICAgICAgICAgIHNoYXBlICAgICAgIFRoZSBvbmx5IHZhbGlkIHZhbHVlIGlzOiByZWN0ICh0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQpXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGUuZy4sIGNsaXA6IHJlY3QoMTBweCwgMjBweCwgMzBweCwgNDBweCk7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IHRoZSBmb3VyIHZhbHVlcyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgbWFyZ2luL3BhZGRpbmdcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIHJlY3QgdmFsdWVzIGFyZSBwb3NpdGl2ZSBwaXhlbCB2YWx1ZXMsIGUuZy4sIDEwcHgsIGV0Yy5cbiAgICAgICAgLy8gICAgICAgICAgbWFyZ2luLWJveCAgVXNlcyB0aGUgbWFyZ2luIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBib3JkZXItYm94ICBVc2VzIHRoZSBib3JkZXIgYm94IGFzIHRoZSByZWZlcmVuY2UgYm94XG4gICAgICAgIC8vICAgICAgICAgIHBhZGRpbmctYm94IFVzZXMgdGhlIHBhZGRpbmcgYm94IGFzIHRoZSByZWZlcmVuY2UgYm94XG4gICAgICAgIC8vICAgICAgICAgIGNvbnRlbnQtYm94XG4gICAgICAgIC8vICAgICAgICAgIGZpbGwtYm94XG4gICAgICAgIC8vICAgICAgICAgIHN0cm9rZS1ib3hcbiAgICAgICAgLy8gICAgICBOT1RFOiB0aGUgQ1NTIGNsaXAgcHJvcGVydHkgaXMgZGVwcmVjYXRlZFxuICAgICAgICAvLyAgICAgIEFsc286IGNsaXAgb25seSB3b3JrcyBpZiB0aGUgZWxlbWVudCBpcyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYW5kIGNhbiBvbmx5IGRvIHJlY3RhbmdsZXNcbiAgICAgICAgLy8gY2hlY2sgaWYgZWxlbWVudCB2aXNpYmxlXG4gICAgICAgIGxldCB2aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKHN0eWxlLndpZHRoICE9PSBcIjBcIiAmJlxuICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ICE9PSBcIjBcIiAmJlxuICAgICAgICAgICAgc3R5bGUub3BhY2l0eSAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJlxuICAgICAgICAgICAgc3R5bGUudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicgJiZcbiAgICAgICAgICAgIHN0eWxlLm92ZXJmbG93ICE9PSAnaGlkZGVuJyAmJlxuICAgICAgICAgICAgLy8gbGVmdCBhbmQgcmlnaHQgd29yayB3aXRoIGFsbCBhYnNvbHV0ZSB1bml0c1xuICAgICAgICAgICAgKHN0eWxlLmxlZnQgPT09IFwiYXV0b1wiIHx8IChzdHlsZS5wb3NpdGlvbiA9PT0gJ2Fic29sdXRlJyAmJiBwYXJzZUludChzdHlsZS5sZWZ0LnJlcGxhY2UoL1teMC05ListXS8sICcnKSkgPiAwKSkgJiZcbiAgICAgICAgICAgIChzdHlsZS5sZWZ0ID09PSBcImF1dG9cIiB8fCAoc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZScgJiYgcGFyc2VJbnQoc3R5bGUudG9wLnJlcGxhY2UoL1teMC05ListXS8sICcnKSkgPiAwKSkpIHtcbiAgICAgICAgICAgIHZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJlbGVtZW50IElTIHZpc2libGVcIik7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkNIRUNLIENPTE9SIENPTlRSQVNUIHVubGVzcyB0byBzbWFsbFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZWxlbWVudCBOT1QgdmlzaWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRE8gTk9UIENIRUNLIENPTE9SIENPTlRSQVNUXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBjbGlwSGVpZ2h0ID0gLTE7XG4gICAgICAgIGlmIChzdHlsZS5jbGlwICE9PSBcImF1dG9cIikge1xuICAgICAgICAgICAgbGV0IGNsaXBTdHJpbmcgPSBzdHlsZS5jbGlwLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoY2xpcFN0cmluZy5pbmNsdWRlcyhcInJlY3RcIikpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVCcmFja2V0cyA9IC9cXCgoLiopXFwpL2c7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RPZlRleHQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSByZUJyYWNrZXRzLmV4ZWMoY2xpcFN0cmluZyk7XG4gICAgICAgICAgICAgICAgdmFyIGZvdW5kQXJyID0gZm91bmRbMV0uc3BsaXQoJywgJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3VuZEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImZvdW5kQXJyW1wiLGksXCJdID0gXCIsZm91bmRBcnJbaV0pO1xuICAgICAgICAgICAgICAgICAgICBsaXN0T2ZUZXh0LnB1c2goZm91bmRBcnJbaV0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImxpc3RPZlRleHQgPSBcIixsaXN0T2ZUZXh0KTtcbiAgICAgICAgICAgIGNsaXBIZWlnaHQgPSBwYXJzZUludChsaXN0T2ZUZXh0WzBdLnJlcGxhY2UoL3B4L2csICcnKSkgLSBwYXJzZUludChsaXN0T2ZUZXh0WzJdLnJlcGxhY2UoL3B4L2csICcnKSk7XG4gICAgICAgICAgICBjbGlwSGVpZ2h0ID0gTWF0aC5hYnMoY2xpcEhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBKQ0ggY2xpcC1wYXRoIElORk86XG4gICAgICAgIC8vICAgICAgRXhjZWxsZW50IGFydGljbGUgb24gY2xpcC1wYXRoOiBodHRwczovL2lzaGFkZWVkLmNvbS9hcnRpY2xlL2NsaXAtcGF0aC9cbiAgICAgICAgLy8gICAgICBjbGlwLXBhdGggaXMgYSB0b3RhbGx5IGRpZmZlcmVudCBhbmltYWwgd2l0aCBtYW55LCBtYW55IGRpZmZlcmVudCB2YXJpYXRpb25zXG4gICAgICAgIC8vICAgICAgVGhlIGdvYWwgd2FzIGZvciBpdCB0byBub3QgYmUgYXMgbGltaXRlZCBhcyBjbGlwXG4gICAgICAgIC8vICAgICAgVGhlIHN5bnRheCBpcyBtb3JlIGNvbXBsaWNhdGVkIChhcyBpdCBkb2VzIG1vcmUpIGFuZCBpdCBpcyBkaWZmZXJlbnQgZnJvbSBjbGlwLFxuICAgICAgICAvLyAgICAgIGUuZy4sIHRoZSBhYm92ZSBjbGlwIHJlY3RhbmdsZSB3b3VsZCBiZSBjbGlwLXBhdGg6IGluc2V0KDEwcHggMjBweCAzMHB4IDQwcHgpO1xuICAgICAgICAvLyAgICAgIE5vdGU6IHRoZXJlIGFyZSBubyBjb21tYXNcbiAgICAgICAgLy8gICAgICBBbHNvLCBpdCBjYW4gdGFrZSBzaW5nbGUgdmFsdWVzIHRvIG1ha2UgYWxsIHNpZGVzIHRoZSBzYW1lLCBvciAyIHZhbHVlcyAodmVydC9ob3JpKS5cbiAgICAgICAgLy8gICAgICBvciAzIHZhbHVlcyAodG9wL2hvcmkvYm90dG9tKVxuICAgICAgICAvLyAgICAgIEFuZCBwZXJjZW50YWdlcyBjYW4gd29ya3MgYXMgd2VsbCBhcyBweFxuICAgICAgICAvLyAgICAgIFxuICAgICAgICAvLyAgICAgIEFsdGhvdWdoIHRoZXJlIGFyZSBmaXZlIGRpZmZlcmVudCBzaGFwZXM6IGluc2V0ICh0ZXJtIHVzZWQgZm9yIHJlY3RhbmdsZSksIGNpcmNsZSxcbiAgICAgICAgLy8gICAgICAgICAgZWxsaXBzZSwgcG9seWdvbiwgcGF0aCAtIHdlIHdpbGwgb25seSBjb25jZXJuIG91cnNlbHZlcyB3aXRoIGluc2V0XG4gICAgICAgIC8vICAgICAgVGhlcmUgYXJlIDcgYm94IHZhbHVlczogbWFyZ2luLWJveCwgYm9yZGVyLWJveCwgcGFkZGluZy1ib3gsIGNvbnRlbnQtYm94LCBmaWxsLWJveCwgc3Ryb2tlLWJveCwgdmlldy1ib3hcbiAgICAgICAgLy8gICAgICBCb3ggYW5kIHNoYXBlIHZhbHVlcyBtYXkgYmUgY29tYmluZWQ6IGNsaXAtcGF0aDogcGFkZGluZy1ib3ggY2lyY2xlKDUwcHggYXQgMCAxMDBweCk7XG4gICAgICAgIC8vICAgICAgTk9URTogdGhlIGJveCB2YWx1ZXMgYXJlIE5PVCBpbnR1aXRpdmUsIHNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TaGFwZXMvRnJvbV9ib3hfdmFsdWVzI21hcmdpbi1ib3hcbiAgICAgICAgLy8gICAgICBcbiAgICAgICAgLy8gICAgICBTbyB0aGUga2V5IHF1ZXN0aW9uIGlzIHdoYXQgYW1vdW50IG9mIGVmZm9ydCBkbyB3ZSB3YW50IHRvIGludmVzdCBpbnRvIGNsaXAtcGF0aFxuICAgICAgICAvLyBcblxuICAgICAgICAvLyBKQ0ggZG9uJ3QgZG8gY2xpcC1wYXRoIG5vdyBcbiAgICAgICAgbGV0IGNsaXBQYXRoSGVpZ2h0ID0gLTE7XG4gICAgICAgIC8vIGlmIChzdHlsZS5jbGlwUGF0aCAhPT0gXCJhdXRvXCIpIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwic3R5bGUuY2xpcFBhdGggPSBcIixzdHlsZS5jbGlwUGF0aCk7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcInN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nID0gXCIsc3R5bGUuY2xpcFBhdGgudG9TdHJpbmcoKSk7XG4gICAgICAgIC8vICAgICBsZXQgY2xpcFN0cmluZyA9IHN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nKCk7XG4gICAgICAgIC8vICAgICBpZiAoY2xpcFN0cmluZy5pbmNsdWRlcyhcImluc2V0XCIpKSB7XG4gICAgICAgIC8vICAgICAgICAgdmFyIHJlQnJhY2tldHMgPSAvXFwoKC4qKVxcKS9nO1xuICAgICAgICAvLyAgICAgICB2YXIgbGlzdE9mVGV4dCA9IFtdO1xuICAgICAgICAvLyAgICAgICB2YXIgZm91bmQgPSByZUJyYWNrZXRzLmV4ZWMoY2xpcFN0cmluZyk7XG4gICAgICAgIC8vICAgICAgIHZhciBmb3VuZEFyciA9IGZvdW5kWzFdLnNwbGl0KCcgJyk7XG4gICAgICAgIC8vICAgICAgIGZvciAobGV0IGk9MDsgaTxmb3VuZEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFwiZm91bmRBcnJbXCIsaSxcIl0gPSBcIixmb3VuZEFycltpXSk7XG4gICAgICAgIC8vICAgICAgICAgbGlzdE9mVGV4dC5wdXNoKGZvdW5kQXJyW2ldKTtcbiAgICAgICAgLy8gICAgICAgfTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwibGlzdE9mVGV4dCA9IFwiLGxpc3RPZlRleHQpO1xuICAgICAgICAvLyBjbGlwUGF0aEhlaWdodCA9IHBhcnNlSW50KGxpc3RPZlRleHRbMF0ucmVwbGFjZSgvcHgvZywgJycpKSAtIHBhcnNlSW50KGxpc3RPZlRleHRbMl0ucmVwbGFjZSgvcHgvZywgJycpKTtcbiAgICAgICAgLy8gY2xpcFBhdGhIZWlnaHQgPSBNYXRoLmFicyhjbGlwSGVpZ2h0KTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNsaXBQYXRoSGVpZ2h0ID0gXCIsIGNsaXBQYXRoSGVpZ2h0KTtcblxuICAgICAgICAvLyBpZiAoc3R5bGUucG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiAmJiBzdHlsZS5jbGlwID09PSBcInJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KVwiICYmIHN0eWxlLm92ZXJmbG93ICE9PSBcInZpc2libGVcIikge1xuICAgICAgICAvLyBKQ0ggYXJiaXRyYXJpbHkgdXNlIGxlc3MgdGhhdCA3cHggZm9yIGNsaXBIZWlnaHRcbiAgICAgICAgaWYgKHN0eWxlLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIgJiYgY2xpcEhlaWdodCA8IDcgJiYgY2xpcEhlaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRE8gTk9UIENIRUNLIENPTE9SIENPTlRSQVNUIGJlY2F1c2UgdG9vIHNtYWxsXCIpO1xuICAgICAgICAgICAgLy8gQ29ybmVyIGNhc2Ugd2hlcmUgaXRlbSBpcyBoaWRkZW4gKGFjY2Vzc2liaWxpdHkgaGlkaW5nIHRlY2huaXF1ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBGaXJzdCBkZXRlcm1pbmUgdGhlIGNvbG9yIGNvbnRyYXN0IHJhdGlvXG4gICAgICAgIGxldCBjb2xvckNvbWJvID0gQ29sb3JVdGlsLkNvbG9yQ29tYm8oZWxlbSk7XG4gICAgICAgIGlmIChjb2xvckNvbWJvID09PSBudWxsKSB7XG4gICAgICAgICAgICAvL3NvbWUgZXhjZXB0aW9uIG9jY3VycmVkLCBvciBub3QgYWJsZSB0byBnZXQgY29sb3IgY29tYm8gZm9yIHNvbWUgcmVhc29uXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInVuYWJsZSB0byBnZXQgY29sb3IgY29tYm8gZm9yIGVsZW1lbnQ6IFwiICsgZWxlbS5ub2RlTmFtZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZnID0gY29sb3JDb21iby5mZztcbiAgICAgICAgbGV0IGJnID0gY29sb3JDb21iby5iZztcbiAgICAgICAgbGV0IHJhdGlvID0gZmcuY29udHJhc3RSYXRpbyhiZyk7XG4gICAgICAgIGxldCB3ZWlnaHQgPSBDU1NVdGlsLmdldFdlaWdodE51bWJlcihzdHlsZS5mb250V2VpZ2h0KTtcbiAgICAgICAgbGV0IHNpemUgPSBDU1NVdGlsLmdldEZvbnRJblBpeGVscyhzdHlsZS5mb250U2l6ZSwgZWxlbSk7XG4gICAgICAgIGxldCBpc0xhcmdlU2NhbGUgPSBzaXplID49IDI0IHx8IHNpemUgPj0gMTguNiAmJiB3ZWlnaHQgPj0gNzAwO1xuICAgICAgICBcbiAgICAgICAgaWYgKENTU1V0aWwuY29udGFpbnNDS0ooY2hpbGRTdHIpKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC1ydWxlcy5naXRodWIuaW8vcHVsbC8yMTIxL2ZpbGVzXG4gICAgICAgICAgICAvLyBmb3IgQ0pLLCAyMiBwdCBvciAxOCBwdCB3aXRoIGZvbnQtd2VpZ2h0ID49IDcwMCwgMXB0ID0gMS4zMzMgcHhcbiAgICAgICAgICAgIGlzTGFyZ2VTY2FsZSA9IHNpemUgPj0gMjkuMyB8fCBzaXplID49IDI0ICYmIHdlaWdodCA+PSA3MDA7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSByYXRpbyA+PSA0LjUgfHwgKHJhdGlvID49IDMgJiYgaXNMYXJnZVNjYWxlKTtcbiAgICAgICAgbGV0IGhhc0JhY2tncm91bmQgPSBjb2xvckNvbWJvLmhhc0JHSW1hZ2UgfHwgY29sb3JDb21iby5oYXNHcmFkaWVudDtcbiAgICAgICAgbGV0IHRleHRTaGFkb3cgPSBjb2xvckNvbWJvLnRleHRTaGFkb3c7XG4gICAgICAgIGxldCBpc0Rpc2FibGVkID0gQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChlbGVtKTtcbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBsZXQgY29udHJvbCA9IENvbW1vblV0aWwuZ2V0Q29udHJvbE9mTGFiZWwoZWxlbSk7XG4gICAgICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQgPSBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKGNvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoIWlzRGlzYWJsZWQgJiYgbm9kZU5hbWUgPT09ICdsYWJlbCcgJiYgQ29tbW9uVXRpbC5pc0Rpc2FibGVkQnlGaXJzdENoaWxkRm9ybUVsZW1lbnQoZWxlbSkpIHtcbiAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIENvbW1vblV0aWwuaXNEaXNhYmxlZEJ5UmVmZXJyaW5nRWxlbWVudChlbGVtKSkge1xuICAgICAgICAgICAgaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKipzZXRDYWNoZShydWxlQ29udGV4dCwgXCJFWFRfQ29sb3JfQ29udHJhc3RfV0NBRzJBQVwiLCB7XG4gICAgICAgICAgICBcInJhdGlvXCI6IHJhdGlvLFxuICAgICAgICAgICAgXCJpc0xhcmdlU2NhbGVcIjogaXNMYXJnZVNjYWxlLFxuICAgICAgICAgICAgXCJ3ZWlnaHRcIjogd2VpZ2h0LFxuICAgICAgICAgICAgXCJzaXplXCI6IHNpemUsXG4gICAgICAgICAgICBcImhhc0JhY2tncm91bmRcIjogaGFzQmFja2dyb3VuZCxcbiAgICAgICAgICAgIFwiaXNEaXNhYmxlZFwiOiBpc0Rpc2FibGVkXG4gICAgICAgIH0pOyovXG4gICAgICAgIFxuICAgICAgICAvLyBJZiBlbGVtZW50IG9yIHBhcmVudCBpcyBkaXNhYmxlZCwgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IChidXQgbWF5IGJlIDM6MSBpbiBmdXR1cmUpXG4gICAgICAgIGlmICghcGFzc2VkICYmIGlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGlmIChoYXNCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBwb3RlbnRpYWwgc2luY2UgYSB0ZXh0IG9uIGFuIGltYWdlIG9yIGdyYWRpZW50IG1heSBiZSBzdGlsbCB2aWV3YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSB0ZXh0IGxvY2F0aW9uIG9uIHRoZSBncmFkaWVudCBvciBpbWFnZVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2dyYXBoaWNfYmFja2dyb3VuZFwiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0XSk7O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBwb3RlbnRpYWwgc2luY2UgYSB0ZXh0IHdpdGggc2hhZG93IG1heSBiZSBzdGlsbCB2aWV3YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSBzaGFkb3cgZWZmZmVjdHNcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF90ZXh0X3NoYWRvd1wiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0XSk7O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZmcudG9IZXgoKSA9PT0gYmcudG9IZXgoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9zYW1lX2NvbG9yXCIsIFtyYXRpby50b0ZpeGVkKDIpLCBzaXplLCB3ZWlnaHQsIGZnLnRvSGV4KCksIGJnLnRvSGV4KCksIGNvbG9yQ29tYm8uaGFzQkdJbWFnZSwgY29sb3JDb21iby5oYXNHcmFkaWVudF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfY29udHJhc3RcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3F1b3RlZF9jb3JyZWN0bHk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5XCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRleHRfcXVvdGVkX2NvcnJlY3RseS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3F1b3RlZF9jb3JyZWN0bHkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIklmIHRoZSBmb2xsb3dpbmcgdGV4dCBpcyBhIHF1b3RhdGlvbiwgbWFyayBpdCBhcyBhIDxxPiBvciA8YmxvY2txdW90ZT4gZWxlbWVudDogezB9XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUXVvdGF0aW9ucyBzaG91bGQgYmUgbWFya2VkIHdpdGggPHE+IG9yIDxibG9ja3F1b3RlPiBlbGVtZW50c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBpZ25vcmUgdGhlIGNoZWNrIGlmIHRoZSBub2RlIGlzIGhpZGRlblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIGJvZHlcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIG1pbldvcmRzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDMsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluV29yZHMgPSB2YWxpZGF0ZVBhcmFtcy5taW5Xb3Jkcy52YWx1ZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0ID0gbnVsbDtcbiAgICAgICAgLy8gaWdub3JlIHRoZSBjaGVjayBmb3IgdGhlIHRleHQgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50c1xuICAgICAgICBjb25zdCBpZ25vcmVkID0gW1wiYmxvY2txdW90ZVwiLCBcInFcIiwgXCJzY3JpcHRcIiwgXCJzdHlsZVwiLCBcInByZVwiLCBcImNvZGVcIiwgXCJydWJ5XCIsIFwic2FtcFwiXTtcbiAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gQ29tcGx5IHRvIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHdpbGwgYmUgZG9uZSBieSBkZWZhdWx0IGFzIHRoaXMgcnVsZSB0cmlnZ2VycyBvbiBlYWNoIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIGFuZCBmb3IgZWFjaCBlbGVtZW50IGl0IG9ubHkgY2hlY2tzIHRoYXQgc2luZ2xlIGVsZW1lbnRzIHRleHQgbm9kZXMgYW5kIG5vdGhpbmcgZWxzZS4gU28gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmVcbiAgICAgICAgICAgIC8vIGNvdmVyZWQgb24gdGhlaXIgb3duLiBDdXJyZW50bHkgZm9yIHRoaXMgcnVsZSBieSBkZWZhdWx0IENoZWNrIEhpZGRlbiBDb250ZW50IHdpbGwgd29yaywgYXMgd2UgYXJlIGRvaW5nXG4gICAgICAgICAgICAvLyBhIG5vZGUgd2FsayBvbmx5IG9uIHNpYmxpbmdzIHNvIGl0IHdvdWxkIG5vdCBnZXQgdGV4dCBub2RlcyBmcm9tIG90aGVyIHNpYmxpbmdzIGF0IGFsbC5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIGluIHRoZSBmdXR1cmUgc29tZXRoaW5nIGNobmdlcywganVzdCBuZWVkIHRvIGFkZCAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSB0byB0aGUgYmVsb3dcbiAgICAgICAgICAgIC8vIGlmLlxuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIC8vIERvIHRoZSByZWdleCB0ZXN0cyBmaXJzdCAtIHNob3VsZCBiZSBmYXN0XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYXBvc3Ryb3BoZSdzXG4gICAgICAgICAgICAgICAgdHh0VmFsID0gdHh0VmFsLnJlcGxhY2UoLyhcXFMpJyhcXFMpL2csIFwiJDEkMlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgZGJsUXVvdGVzID0gdHh0VmFsLm1hdGNoKC8oXCJbXlwiXStcIikvZyk7XG4gICAgICAgICAgICAgICAgbGV0IHNuZ2xRdW90ZXMgPSB0eHRWYWwubWF0Y2goLygnW14nXSsnKS9nKTtcbiAgICAgICAgICAgICAgICAvLyBXYWxrIHRoZSBwYXJlbnRzIC0gb25seSBjb250aW51ZSB0ZXN0aW5nIGlmIHdlIGZvdW5kIGEgcXVvdGUsIGJ1dFxuICAgICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBhbHJlYWR5IG1hcmtlZCB1cFxuICAgICAgICAgICAgICAgIC8vIEFsc28gc2tpcCBpZiB3ZSdyZSBpbiBhIHNjcmlwdCAtIHRoZXJlJ3MgbG90cyBvZiBxdW90ZXMgdXNlZCBpbiBzY3JpcHRzXG4gICAgICAgICAgICAgICAgaWYgKChkYmxRdW90ZXMgIT09IG51bGwgfHwgc25nbFF1b3RlcyAhPT0gbnVsbCkgJiZcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcih3YWxrTm9kZSwgaWdub3JlZCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRibFF1b3RlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBkYmxRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC53b3JkQ291bnQoZGJsUXVvdGVzW2ldKSA8IG1pbldvcmRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzbmdsUXVvdGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHNuZ2xRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC53b3JkQ291bnQoc25nbFF1b3Rlc1tpXSkgPCBtaW5Xb3JkcztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgbGluZWZlZWQgaW5zaWRlIHRoZSBxdW90ZVxuICAgICAgICAgICAgICAgICAgICAvLyB2aW9sYXRlZHRleHQgPSB0eHRWYWwucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIixcImdcIiksXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYmxRdW90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHNuZ2xRdW90ZXMuam9pbihcIiwgXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFxyP1xcXFxufFxcXFxyXCIsIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc25nbFF1b3RlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmpvaW4oXCIsIFwiKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcXFxccj9cXFxcbnxcXFxcclwiLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmNvbmNhdChzbmdsUXVvdGVzKS5qb2luKFwiLCBcIikucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIiwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSB2aW9sYXRlZHRleHQgaXMgbG9uZ2VyIHRoYW4gNjkgY2hhcnMsIG9ubHkga2VlcCB0aGUgZmlyc3QgMzIsIHRoZSBcIiAuLi4gXCIsIGFuZCB0aGUgbGFzdCAzMiBjaGFycyBcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgdmlvbGF0ZWR0ZXh0Lmxlbmd0aCAmJiB2aW9sYXRlZHRleHQubGVuZ3RoID4gNjkpIHtcbiAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHZpb2xhdGVkdGV4dC5zdWJzdHJpbmcoMCwgMzIpICsgXCIgLi4uIFwiICsgdmlvbGF0ZWR0ZXh0LnN1YnN0cmluZyh2aW9sYXRlZHRleHQubGVuZ3RoIC0gMzIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFt2aW9sYXRlZHRleHRdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfc2Vuc29yeV9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9zZW5zb3J5X21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJvZHksIGRvbTpib2R5IGRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGV4dF9TZW5zb3J5UmVmZXJlbmNlXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9wb3NpdGlvbiwgcG90ZW50aWFsX290aGVyXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9wb3NpdGlvblwiOiBcInRleHRfc2Vuc29yeV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3RoZXJcIjogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIkluc3RydWN0aW9ucyBhcmUgbWVhbmluZ2Z1bCB3aXRob3V0IHJlbHlpbmcgc29sZWx5IG9uIHNoYXBlLCBzaXplLCBvciBsb2NhdGlvbiB3b3Jkc1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcG9zaXRpb25cIjogXCJDb25maXJtIHRoZSB3b3JkKHMpICd7MH0nIG9mIHRoZSB1c2VyIGluc3RydWN0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBsb2dpY2FsIHJhdGhlciB0aGFuIHZpc3VhbCBwb3NpdGlvblwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3RoZXJcIjogXCJDb25maXJtIHRoZSB1c2VyIGluc3RydWN0aW9uIGlzIHN0aWxsIHVuZGVyc3RhbmRhYmxlIHdpdGhvdXQgdGhlIHdvcmQocykgJ3swfSdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbnN0cnVjdGlvbnMgc2hvdWxkIGJlIG1lYW5pbmdmdWwgd2l0aG91dCByZWx5aW5nIHNvbGVseSBvbiBzaGFwZSwgc2l6ZSwgb3IgbG9jYXRpb24gd29yZHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGVOYW1lIG9mIHRoZSBjb250ZXh0IG5vZGVcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluY2x1ZGVzKG5vZGVOYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIHNjcmlwdCwgbGluaywgbGFiZWwgYW5kIHRoZWlyIGNoaWxkIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzY3JpcHRcIiwgXCJhXCIsICdsYWJlbCddKSAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIFxuICAgICAgICAvLyBpZ25vcmUgdGV4dCBvbiBsYW5kbWFyayByb2xlcywgYnV0IG5vdCBvbiB0aGVpciBjaGlsZHJlbiAoZS5nLiwgc2VjdGlvbiwgbWFpbilcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICBsZXQgbG1Sb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzV2l0aFR5cGVzKHJ1bGVDb250ZXh0LCBbXCJsYW5kbWFya1wiXSk7XG4gICAgICAgICAgICBpZiAobG1Sb2xlcyAmJiBsbVJvbGVzLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9ICAgIFxuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGFsbCB3aWRnZXRzIGFuZCBoZWFkaW5ncywgYW5kIHRoZWlyIGNoaWxkcmVuLCBhbmQgY2VydGFpbiBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNXaXRoVHlwZXMocnVsZUNvbnRleHQsIFtcIndpZGdldFwiLCBcImhlYWRpbmdcIl0pO1xuICAgICAgICAvLyBhZGQgc29tZSBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFtcImNhcHRpb25cIiwgXCJjZWxsXCIsIFwiY29kZVwiLCBcImNvbHVtbmhlYWRlclwiLCBcImRlZmluaXRpb25cIiwgXCJmaWd1cmVcIiwgXCJsaXN0XCIsIFwibGlzdGl0ZW1cIiwgXCJtYXRoXCIsIFwibWV0ZXJcIiwgXCJyb3dcIiwgXCJyb3dncm91cFwiLCBcInJvd2hlYWRlclwiLCBcInRlcm1cIl0sIHJvbGVzKTtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGVzKHJ1bGVDb250ZXh0LCByb2xlcykgIT09IG51bGwpIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHZpb2xhdGVkUG9zaXRpb25UZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IHZpb2xhdGVkT3RoZXJUZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdHh0VmFsID0gXCJcIjsgXG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFxuICAgICAgICAgICAgLy8gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmUgY292ZXJlZCBvbiB0aGVpciBvd24uIFxuICAgICAgICAgICAgLy8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChzcGFjZSwgbmV3bGluZSwgdGFiKSBiZXR3ZWVuIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIGEgbm9kZSB0b28uXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT09IFwiI3RleHRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eHQgPSB3YWxrTm9kZS5ub2RlVmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmICh0eHQubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgdHh0VmFsICs9ICh0eHRWYWwubGVuZ3RoID4gMCA/IFwiLCBcIiArIHR4dCA6IHR4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAodHh0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAvLyBmaXJzdCB0byByZW1vdmUgZWFjaCBleGVtcHQgd29yZCB3aXRoIGEgc2luZ2xlIHNwYWNlIGluIHRoZSB0ZXh0XG4gICAgICAgICAgICBsZXQgZXhlbXB0UmVnZXggPSBnZXRSZWdleChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImV4ZW1wdFRleHRcIik7XG4gICAgICAgICAgICB0eHRWYWwgPSB0eHRWYWwucmVwbGFjZShleGVtcHRSZWdleCwgXCIgXCIpO1xuXG4gICAgICAgICAgICB2aW9sYXRlZFBvc2l0aW9uVGV4dCA9IGdldFZpb2xhdGVkVGV4dChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInBvc2l0aW9uVGV4dFwiLCB0eHRWYWwpO1xuICAgICAgICAgICAgdmlvbGF0ZWRPdGhlclRleHQgPSBnZXRWaW9sYXRlZFRleHQocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJvdGhlclRleHRcIiwgdHh0VmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXQgPSBbXTsgXG4gICAgICAgIGlmICh2aW9sYXRlZFBvc2l0aW9uVGV4dCkgcmV0LnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9wb3NpdGlvblwiLCBbdmlvbGF0ZWRQb3NpdGlvblRleHRdKSk7XG4gICAgICAgIGlmICh2aW9sYXRlZE90aGVyVGV4dCkgcmV0LnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdGhlclwiLCBbdmlvbGF0ZWRPdGhlclRleHRdKSk7XG4gICAgICAgIHJldHVybiByZXQubGVuZ3RoID09IDAgPyBudWxsIDogcmV0O1xuICAgIH1cbn1cblxuY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgcG9zaXRpb25UZXh0OiB7XG4gICAgICAgIHZhbHVlOiBbXCJ0b3AtbGVmdFwiLCBcInRvcC1yaWdodFwiLCBcImJvdHRvbS1yaWdodFwiLCBcImJvdHRvbS1sZWZ0XCIsXG4gICAgICAgICAgICBcInRvcC10by1ib3R0b21cIiwgXCJsZWZ0LXRvLXJpZ2h0XCIsIFwiYm90dG9tLXRvLXRvcFwiLCBcInJpZ2h0LXRvLWxlZnRcIixcbiAgICAgICAgICAgIFwicmlnaHRcIiwgXCJsZWZ0XCIsIFwiYWJvdmVcIiwgXCJiZWxvd1wiLCBcInRvcFwiLCBcImJvdHRvbVwiLFxuICAgICAgICAgICAgXCJ1cHBlclwiLCBcImxvd2VyXCIsIFwiY29ybmVyXCIsIFwiYmVzaWRlXCJcbiAgICAgICAgXSxcbiAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgfSxcbiAgICBvdGhlclRleHQ6IHtcbiAgICAgICAgdmFsdWU6IFtcInJvdW5kXCIsIFwic3F1YXJlXCIsIFwic2hhcGVcIiwgXCJyZWN0YW5nbGVcIiwgXCJ0cmlhbmdsZVwiLFxuICAgICAgICAgICAgXCJzaXplXCIsIFwibGFyZ2VcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImJpZ1wiLCBcImh1Z2VcIiwgXCJ0aW55XCIsIFwiZXh0cmFcIixcbiAgICAgICAgICAgIFwibGFyZ2VyXCIsIFwic21hbGxlclwiLCBcImJpZ2dlclwiLCBcImxpdHRsZVwiLCBcImxhcmdlc3RcIiwgXCJzbWFsbGVzdFwiLCBcImJpZ2dlc3RcIlxuICAgICAgICBdLFxuICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICB9LFxuICAgIGV4ZW1wdFRleHQ6IHtcbiAgICAgICAgdmFsdWU6IFtcInJpZ2h0LWNsaWNrXCIsIFwibGVmdC1jbGlja1wiLCBcInJpZ2h0LWNsaWNraW5nXCIsIFwicmlnaHQtY2xpY2tzXCIsIFxuICAgICAgICAgICBcImxlZnQtY2xpY2tpbmdcIiwgXCJsZWZ0LWNsaWNrc1wiLCBcInNxdWFyZSByb290XCIsIFwicmlnaHQgbm93XCIsIFwib2ZmIHRoZSB0b3BcIiAgIC8vYXBwZW5kIGFzIG5lZWRlZFxuICAgICAgICBdLFxuICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICB9ICAgIFxufVxuXG5mdW5jdGlvbiBnZXRSZWdleChkb2MsIHR5cGUpIHtcbiAgICBpZiAoIXZhbGlkYXRlUGFyYW1zW3R5cGVdKSByZXR1cm4gXCJcIjtcbiAgICBsZXQgc2Vuc29yeVJlZ2V4ID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgdHlwZSArIFwiX3NlbnNvcnlfbWlzdXNlXCIsIG51bGwpO1xuICAgIGlmIChzZW5zb3J5UmVnZXggPT0gbnVsbCkge1xuICAgICAgICBsZXQgc2Vuc29yeVRleHQgPSB2YWxpZGF0ZVBhcmFtc1t0eXBlXS52YWx1ZTtcbiAgICAgICAgbGV0IHJlZ2V4U3RyID0gXCIoXFxzXFxzK3xcIiArIHNlbnNvcnlUZXh0WzBdO1xuICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHNlbnNvcnlUZXh0Lmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBsZXQgd29yZHMgPSBzZW5zb3J5VGV4dFtqXS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgcmVnZXhTdHIgKz0gXCJ8XCIgKyB3b3Jkc1swXTtcbiAgICAgICAgICAgIGlmICh3b3Jkcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDE7IGMgPCB3b3Jkcy5sZW5ndGg7ICsrYylcbiAgICAgICAgICAgICAgICAgICAgcmVnZXhTdHIgKz0gXCIgK1wiICsgd29yZHNbY107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZWdleFN0ciArPSBcIilcXFxcV1wiO1xuICAgICAgICByZWdleFN0ciArPSBcIilcIjtcbiAgICAgICAgc2Vuc29yeVJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFN0ciwgXCJnaVwiKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgdHlwZSArXCJfc2Vuc29yeV9taXN1c2VcIiwgc2Vuc29yeVJlZ2V4KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbnNvcnlSZWdleDtcbn1cblxuZnVuY3Rpb24gZ2V0VmlvbGF0ZWRUZXh0KGRvYywgdHlwZSwgdHh0VmFsKSB7XG4gICAgaWYgKCF0eHRWYWwpIHJldHVybiBcIlwiO1xuICAgIGxldCBzZW5zb3J5VGV4dEFyciA9IHZhbGlkYXRlUGFyYW1zW3R5cGVdLnZhbHVlXG4gICAgbGV0IGhhc2ggPSB7fSwgcmVzdWx0ID0gW107XG4gICAgXG4gICAgLy8gc3BsaXQgdGhlIHN0cmluZyBpbnRvIHdvcmRzXG4gICAgbGV0IGNvdW50cyA9IHR4dFZhbC5zcGxpdCgvXFxzKy8pLnJlZHVjZShmdW5jdGlvbiAobWFwLCB3b3JkKSB7XG4gICAgICAgIGxldCB3b3JkV29UcmFpbGluZ1B1bmMgPSB3b3JkLnJlcGxhY2UoL1suPyE6OygpJ1wiLGBcXF1dKyQvLCBcIlwiKTtcbiAgICAgICAgbGV0IGxjV29yZFdvUHVuYyA9IHdvcmQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLj8hOjsoKSdcIixgXFxdXS9nLCBcIlwiKTtcblxuICAgICAgICBmb3IgKGxldCBjb3VudGVyID0gMDsgY291bnRlciA8IHNlbnNvcnlUZXh0QXJyLmxlbmd0aDsgY291bnRlcisrKSB7XG4gICAgICAgICAgICBsZXQgYSA9IGxjV29yZFdvUHVuYy5pbmRleE9mKHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHNlbnNvcnlXb3JkTGVuID0gc2Vuc29yeVRleHRBcnJbY291bnRlcl0ubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9IGxjV29yZFdvUHVuYy5jaGFyQXQoc2Vuc29yeVdvcmRMZW4gKyBhKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHdvcmQgZG9lcyBub3QgY29udGFpbnMgc3Vic3RyaW5nIG9mIHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdXG4gICAgICAgICAgICAvLyBwcm9jZWVkIHRvIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIGZvciBuZXh0IHNlbnNvcnlUZXh0LlxuICAgICAgICAgICAgaWYgKGEgPCAwKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgICAgIC8vY2hlY2sgdGhlIGZvbGxvd2luZyBhbmQgcHJvY2VlZGluZyBwdW5jdHVhdGlvbnNcbiAgICAgICAgICAgIC8vbGV0IGlzUHVuY2ZvbGxvd2luZyA9ICgoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXC0nKSB8fFxuICAgICAgICAgICAgbGV0IGlzUHVuY2ZvbGxvd2luZyA9IChcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXC4nKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcPycpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcIScpIHx8XG4gICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw7JykgfHxcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCknKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcJycpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXCInKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJy5cXGAnKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXF0nKSk7XG5cbiAgICAgICAgICAgIGxldCBpc1B1bmNQcmVjZWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChhID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID0gbGNXb3JkV29QdW5jLmNoYXJBdChhIC0gMSk7XG4gICAgICAgICAgICAgICAgaXNQdW5jUHJlY2VkaW5nID0gKChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXC0nKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwuJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcPycpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCEnKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcOycpIHx8XG4gICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwpJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcJycpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXFwiJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICcuXFxgJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFxdJykpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoKGxjV29yZFdvUHVuYy5sZW5ndGggPT0gc2Vuc29yeVdvcmRMZW4pIHx8IChpc1B1bmNmb2xsb3dpbmcgPT0gdHJ1ZSkgfHwgKGlzUHVuY1ByZWNlZGluZyA9PSB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc2guaGFzT3duUHJvcGVydHkod29yZFdvVHJhaWxpbmdQdW5jKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNoW3dvcmRXb1RyYWlsaW5nUHVuY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh3b3JkV29UcmFpbGluZ1B1bmMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyID0gc2Vuc29yeVRleHRBcnIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdID0gKG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdIHx8IDApICsgMTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCIsIFwiKTtcbn0gIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsLCBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5cbi8vIE1vZHVsZS1sZXZlbCBjb25zdGFudHNcbmNvbnN0IFNUWUxFX1ZBTFVFX1JFR0VYID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbmNvbnN0IE1JTl9XT1JEX1NQQUNJTkdfUkFUSU8gPSAwLjE2O1xuY29uc3QgTUlOX0xFVFRFUl9TUEFDSU5HX1JBVElPID0gMC4xMjtcbmNvbnN0IE1JTl9MSU5FX0hFSUdIVF9SQVRJTyA9IDEuNTtcbmNvbnN0IElNUE9SVEFOVF9TVUZGSVggPSBcIiFpbXBvcnRhbnRcIjtcbmNvbnN0IElNUE9SVEFOVF9TVUZGSVhfTEVOR1RIID0gSU1QT1JUQU5UX1NVRkZJWC5sZW5ndGggKyAxOyAvLyArMSBmb3IgdGhlIHNwYWNlIGJlZm9yZSAhaW1wb3J0YW50XG5cbi8qKlxuICogUmVzb2x2ZXMgaW5oZXJpdGVkIG9yIHVuc2V0IHN0eWxlIHZhbHVlcyBieSB0cmF2ZXJzaW5nIHVwIHRoZSBET00gdHJlZVxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byByZXNvbHZlIHRoZSBzdHlsZSBmb3JcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBDU1MgcHJvcGVydHkgbmFtZVxuICogQHBhcmFtIGN1cnJlbnRWYWx1ZSAtIFRoZSBjdXJyZW50IHN0eWxlIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgc3R5bGUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUluaGVyaXRlZFN0eWxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwcm9wZXJ0eTogc3RyaW5nLCBjdXJyZW50VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCdpbmhlcml0JykgfHwgY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3IgPSBDU1NVdGlsLmdldEFuY2VzdG9yV2l0aFN0eWxlcyhcbiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudCxcbiAgICAgICAgICAgIHtbcHJvcGVydHldOiBbXCIqXCJdfSxcbiAgICAgICAgICAgIFsnaW5oZXJpdCcsICd1bnNldCddXG4gICAgICAgICk7XG4gICAgICAgIGlmIChhbmNlc3RvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhhbmNlc3RvciwgW3Byb3BlcnR5XSlbcHJvcGVydHldO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCd1bnNldCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJpbml0aWFsXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSAhaW1wb3J0YW50IHN1ZmZpeCBmcm9tIGEgc3R5bGUgdmFsdWVcbiAqIEBwYXJhbSBzdHlsZVZhbHVlIC0gVGhlIHN0eWxlIHZhbHVlIHBvdGVudGlhbGx5IGNvbnRhaW5pbmcgIWltcG9ydGFudFxuICogQHJldHVybnMgVGhlIHN0eWxlIHZhbHVlIHdpdGhvdXQgIWltcG9ydGFudFxuICovXG5mdW5jdGlvbiByZW1vdmVJbXBvcnRhbnRTdWZmaXgoc3R5bGVWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3R5bGVWYWx1ZS5zdWJzdHJpbmcoMCwgc3R5bGVWYWx1ZS5sZW5ndGggLSBJTVBPUlRBTlRfU1VGRklYX0xFTkdUSCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3BhY2luZyBwcm9wZXJ0eSB2aW9sYXRlcyBhY2Nlc3NpYmlsaXR5IHJlcXVpcmVtZW50c1xuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgSFRNTCBlbGVtZW50IGJlaW5nIGNoZWNrZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBDU1MgcHJvcGVydHkgbmFtZSAod29yZC1zcGFjaW5nLCBsZXR0ZXItc3BhY2luZywgbGluZS1oZWlnaHQpXG4gKiBAcGFyYW0gc3R5bGVWYWx1ZSAtIFRoZSBjdXJyZW50IHN0eWxlIHZhbHVlXG4gKiBAcGFyYW0gZm9udFNpemUgLSBUaGUgY29tcHV0ZWQgZm9udCBzaXplIGluIHBpeGVsc1xuICogQHBhcmFtIG1pblJhdGlvIC0gVGhlIG1pbmltdW0gcmF0aW8gdGhyZXNob2xkXG4gKiBAcGFyYW0gYWxsb3dVbml0bGVzcyAtIFdoZXRoZXIgdW5pdGxlc3MgdmFsdWVzIGFyZSBhbGxvd2VkIChmb3IgbGluZS1oZWlnaHQpXG4gKiBAcmV0dXJucyBSdWxlUmVzdWx0IGluZGljYXRpbmcgcGFzcyBvciBmYWlsXG4gKi9cbmZ1bmN0aW9uIGNoZWNrU3BhY2luZ1Byb3BlcnR5KFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgc3R5bGVWYWx1ZTogc3RyaW5nLFxuICAgIGZvbnRTaXplOiBudW1iZXIsXG4gICAgbWluUmF0aW86IG51bWJlcixcbiAgICBhbGxvd1VuaXRsZXNzOiBib29sZWFuID0gZmFsc2Vcbik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmICFpbXBvcnRhbnQgaXMgdXNlZFxuICAgIGlmIChlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkocHJvcGVydHkpICE9PSAnaW1wb3J0YW50Jykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgIWltcG9ydGFudCBzdWZmaXhcbiAgICBjb25zdCBjbGVhblZhbHVlID0gcmVtb3ZlSW1wb3J0YW50U3VmZml4KHN0eWxlVmFsdWUpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGluaXRpYWwgb3Igbm9ybWFsIHZhbHVlcyAoY29tcHV0ZWQgc3BhY2UgaXMgMClcbiAgICBpZiAoY2xlYW5WYWx1ZSA9PT0gJ2luaXRpYWwnIHx8IGNsZWFuVmFsdWUgPT09ICdub3JtYWwnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB0aGUgbnVtZXJpYyB2YWx1ZVxuICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQoY2xlYW5WYWx1ZSk7XG4gICAgaWYgKGlzTmFOKG51bWVyaWNWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gTWF0Y2ggdmFsdWUgYW5kIHVuaXRcbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IGNsZWFuVmFsdWUudHJpbSgpLm1hdGNoKFNUWUxFX1ZBTFVFX1JFR0VYKTtcbiAgICBpZiAoIXBhcnNlZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHZhbHVlLCB1bml0XSA9IHBhcnNlZFZhbHVlO1xuXG4gICAgLy8gSGFuZGxlIHVuaXRsZXNzIHZhbHVlcyAob25seSBmb3IgbGluZS1oZWlnaHQpXG4gICAgaWYgKHVuaXQgPT09ICcnKSB7XG4gICAgICAgIGlmIChhbGxvd1VuaXRsZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSkgPCBtaW5SYXRpbyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3Igb3RoZXIgcHJvcGVydGllcywgemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgaXMgaWdub3JlZFxuICAgICAgICBpZiAocGFyc2VGbG9hdCh2YWx1ZSkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpZiBubyB1bml0IGFuZCBub24temVybyAoZXJyb3IgY2FzZSwgaW5hcHBsaWNhYmxlKVxuICAgIGlmICh1bml0ID09PSAnJyAmJiBwYXJzZUZsb2F0KHZhbHVlKSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHRvIHBpeGVscyBhbmQgY2hlY2sgcmF0aW9cbiAgICBjb25zdCBwaXhlbHMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHModW5pdCwgdmFsdWUsIGVsZW1lbnQpO1xuICAgIGlmIChwaXhlbHMgIT09IG51bGwgJiYgcGl4ZWxzIC8gZm9udFNpemUgPCBtaW5SYXRpbykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3NwYWNpbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9zcGFjaW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3dvcmRfc3BhY2luZ19zdHlsZVwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGluZV9oZWlnaHRfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiQ1NTICFpbXBvcnRhbnQgaXMgbm90IHVzZWQgaW4gaW5saW5lIHN0eWxlIHRvIGNvbnRyb2wgbGV0dGVyIG9yIHdvcmQgc3BhY2luZyBvciBsaW5lIGhlaWdodFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUgc3R5bGUgdG8gY29udHJvbCBsZXR0ZXIgb3Igd29yZCBzcGFjaW5nIG9yIGxpbmUgaGVpZ2h0XCIsXG4gICAgICAgICAgICBcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIjogXCJDU1MgIWltcG9ydGFudCBzaG91bGQgbm90IGJlIHVzZWQgaW4gaW5saW5lIOKAmGxldHRlci1zcGFjaW5n4oCZIHN0eWxlXCIsXG4gICAgICAgICAgICBcImZhaWxfd29yZF9zcGFjaW5nX3N0eWxlXCI6IFwiQ1NTICFpbXBvcnRhbnQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGlubGluZSDigJh3b3JkLXNwYWNpbmfigJkgc3R5bGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9saW5lX2hlaWdodF9zdHlsZVwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUg4oCYbGluZS1oZWlnaHTigJkgc3R5bGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgXCJudW1cIjogW1wiMS40LjEyXCJdLFxuICAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OlsnOWU0NWVjJywgJzI0YWZjMicsICc3OGZkMzInXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHRcbiAgICAgICAgbGV0IGNoaWxkU3RyID0gXCJcIjtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IHJ1bGVDb250ZXh0LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT09IDMpIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICAgICAgY2hpbGRTdHIgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgb2ZmIHNjcmVlblxuICAgICAgICBjb25zdCBtYXBwZXI6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWJvdW5kcyB8fCBib3VuZHNbJ3RvcCddIDwgMCB8fCBib3VuZHNbJ2xlZnQnXSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBub24tSFRNTCBlbGVtZW50cyAoZS5nLiwgU1ZHKVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJzdmdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9udCBzaXplIGFsd2F5cyByZXNvbHZlZCB0byAncHgnXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJykpO1xuXG4gICAgICAgIC8vIEVhcmx5IGV4aXQgb3B0aW1pemF0aW9uOiBDaGVjayBpZiBjb21wdXRlZCBzdHlsZXMgYWxyZWFkeSBwYXNzXG4gICAgICAgIC8vIElmIGFsbCB0aHJlZSBwcm9wZXJ0aWVzIGhhdmUgcGFzc2luZyB2YWx1ZXMsIHdlIGNhbiBza2lwIHRoZSBleHBlbnNpdmUgZ2V0RGVmaW5lZFN0eWxlcyBjYWxsXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkV29yZFNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3dvcmQtc3BhY2luZycpO1xuICAgICAgICBjb25zdCBjb21wdXRlZExldHRlclNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2xldHRlci1zcGFjaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkTGluZUhlaWdodCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnbGluZS1oZWlnaHQnKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBjb21wdXRlZCB2YWx1ZXMgcGFzcyB0aGUgcmVxdWlyZW1lbnRzXG4gICAgICAgIGxldCB3b3JkU3BhY2luZ1Bhc3NlcyA9IHRydWU7XG4gICAgICAgIGxldCBsZXR0ZXJTcGFjaW5nUGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGxpbmVIZWlnaHRQYXNzZXMgPSB0cnVlO1xuXG4gICAgICAgIC8vIENoZWNrIHdvcmQtc3BhY2luZyAoaWdub3JlIDBweCB3aGljaCByZXByZXNlbnRzIGRlZmF1bHQvbm9ybWFsKVxuICAgICAgICBpZiAoY29tcHV0ZWRXb3JkU3BhY2luZykge1xuICAgICAgICAgICAgY29uc3Qgd29yZFZhbHVlID0gcGFyc2VGbG9hdChjb21wdXRlZFdvcmRTcGFjaW5nKTtcbiAgICAgICAgICAgIGlmICghaXNOYU4od29yZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdvcmRQaXhlbHMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMoJ3B4Jywgd29yZFZhbHVlLnRvU3RyaW5nKCksIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAod29yZFBpeGVscyAhPT0gbnVsbCAmJiB3b3JkUGl4ZWxzIC8gZm9udFNpemUgPCBNSU5fV09SRF9TUEFDSU5HX1JBVElPKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRTcGFjaW5nUGFzc2VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGV0dGVyLXNwYWNpbmcgKGlnbm9yZSAwcHggd2hpY2ggcmVwcmVzZW50cyBkZWZhdWx0L25vcm1hbClcbiAgICAgICAgaWYgKGNvbXB1dGVkTGV0dGVyU3BhY2luZykge1xuICAgICAgICAgICAgY29uc3QgbGV0dGVyVmFsdWUgPSBwYXJzZUZsb2F0KGNvbXB1dGVkTGV0dGVyU3BhY2luZyk7XG4gICAgICAgICAgICBpZiAoIWlzTmFOKGxldHRlclZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxldHRlclBpeGVscyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscygncHgnLCBsZXR0ZXJWYWx1ZS50b1N0cmluZygpLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxldHRlclBpeGVscyAhPT0gbnVsbCAmJiBsZXR0ZXJQaXhlbHMgLyBmb250U2l6ZSA8IE1JTl9MRVRURVJfU1BBQ0lOR19SQVRJTykge1xuICAgICAgICAgICAgICAgICAgICBsZXR0ZXJTcGFjaW5nUGFzc2VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGluZS1oZWlnaHRcbiAgICAgICAgaWYgKGNvbXB1dGVkTGluZUhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgbGluZVZhbHVlID0gcGFyc2VGbG9hdChjb21wdXRlZExpbmVIZWlnaHQpO1xuICAgICAgICAgICAgaWYgKCFpc05hTihsaW5lVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gTGluZSBoZWlnaHQgY2FuIGJlIHVuaXRsZXNzIG9yIGluIHBpeGVsc1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY29tcHV0ZWRMaW5lSGVpZ2h0Lm1hdGNoKFNUWUxFX1ZBTFVFX1JFR0VYKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgWywgdmFsdWUsIHVuaXRdID0gbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bml0ID09PSAnJyB8fCB1bml0ID09PSAncHgnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXRpbyA9IHVuaXQgPT09ICcnID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiBwYXJzZUZsb2F0KHZhbHVlKSAvIGZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGlvIDwgTUlOX0xJTkVfSEVJR0hUX1JBVElPKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodFBhc3NlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgYWxsIGNvbXB1dGVkIHZhbHVlcyBwYXNzLCB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGdldERlZmluZWRTdHlsZXMgY2hlY2tcbiAgICAgICAgaWYgKHdvcmRTcGFjaW5nUGFzc2VzICYmIGxldHRlclNwYWNpbmdQYXNzZXMgJiYgbGluZUhlaWdodFBhc3Nlcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgZGVmaW5lZCBzdHlsZXMgdG8gY2hlY2sgZm9yICFpbXBvcnRhbnQgZGVjbGFyYXRpb25zXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgW1wid29yZC1zcGFjaW5nXCIsIFwibGV0dGVyLXNwYWNpbmdcIiwgXCJsaW5lLWhlaWdodFwiXSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzdHlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHRzOiBSdWxlUmVzdWx0W10gPSBbXTtcblxuICAgICAgICAvLyBDaGVjayB3b3JkLXNwYWNpbmdcbiAgICAgICAgbGV0IHdvcmRTdHlsZSA9IHN0eWxlc1snd29yZC1zcGFjaW5nJ107XG4gICAgICAgIGlmICh3b3JkU3R5bGUpIHtcbiAgICAgICAgICAgIHdvcmRTdHlsZSA9IHJlc29sdmVJbmhlcml0ZWRTdHlsZShydWxlQ29udGV4dCwgJ3dvcmQtc3BhY2luZycsIHdvcmRTdHlsZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGVja1NwYWNpbmdQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICAnd29yZC1zcGFjaW5nJyxcbiAgICAgICAgICAgICAgICB3b3JkU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX1dPUkRfU1BBQ0lOR19SQVRJT1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlRmFpbCgnZmFpbF93b3JkX3NwYWNpbmdfc3R5bGUnKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBsZXR0ZXItc3BhY2luZ1xuICAgICAgICBsZXQgbGV0dGVyU3R5bGUgPSBzdHlsZXNbJ2xldHRlci1zcGFjaW5nJ107XG4gICAgICAgIGlmIChsZXR0ZXJTdHlsZSkge1xuICAgICAgICAgICAgbGV0dGVyU3R5bGUgPSByZXNvbHZlSW5oZXJpdGVkU3R5bGUocnVsZUNvbnRleHQsICdsZXR0ZXItc3BhY2luZycsIGxldHRlclN0eWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrU3BhY2luZ1Byb3BlcnR5KFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LFxuICAgICAgICAgICAgICAgICdsZXR0ZXItc3BhY2luZycsXG4gICAgICAgICAgICAgICAgbGV0dGVyU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX0xFVFRFUl9TUEFDSU5HX1JBVElPXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVGYWlsKCdmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGluZS1oZWlnaHQgKG9ubHkgaWYgbm8gc2Nyb2xsYWJsZSBhbmNlc3RvcilcbiAgICAgICAgbGV0IGxpbmVTdHlsZSA9IHN0eWxlc1snbGluZS1oZWlnaHQnXTtcbiAgICAgICAgY29uc3Qgb3ZlcmZsb3dTdHlsZXMgPSB7XG4gICAgICAgICAgICBcIm92ZXJmbG93XCI6IFsnYXV0bycsICdzY3JvbGwnXSxcbiAgICAgICAgICAgIFwib3ZlcmZsb3cteFwiOiBbJ2F1dG8nLCAnc2Nyb2xsJ10sXG4gICAgICAgICAgICBcIm92ZXJmbG93LXlcIjogWydhdXRvJywgJ3Njcm9sbCddXG4gICAgICAgIH07XG4gICAgICAgIGlmIChsaW5lU3R5bGUgJiYgQ1NTVXRpbC5nZXRBbmNlc3RvcldpdGhTdHlsZXMocnVsZUNvbnRleHQsIG92ZXJmbG93U3R5bGVzKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGluZVN0eWxlID0gcmVzb2x2ZUluaGVyaXRlZFN0eWxlKHJ1bGVDb250ZXh0LCAnbGluZS1oZWlnaHQnLCBsaW5lU3R5bGUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hlY2tTcGFjaW5nUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgJ2xpbmUtaGVpZ2h0JyxcbiAgICAgICAgICAgICAgICBsaW5lU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX0xJTkVfSEVJR0hUX1JBVElPLFxuICAgICAgICAgICAgICAgIHRydWUgLy8gQWxsb3cgdW5pdGxlc3MgdmFsdWVzIGZvciBsaW5lLWhlaWdodFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlRmFpbCgnZmFpbF9saW5lX2hlaWdodF9zdHlsZScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA+IDAgPyByZXN1bHRzIDogbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfd2hpdGVzcGFjZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInRleHRfd2hpdGVzcGFjZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0XCI6IFwidGV4dF93aGl0ZXNwYWNlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3RleHRcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjcmVhdGUgc3BhY2UgYmV0d2VlbiB0aGUgbGV0dGVycyBvZiBhIHdvcmRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjb250cm9sIHNwYWNpbmcgd2l0aGluIGEgd29yZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0XG4gICAgICAgIGxldCBjaGVja0FuY2VzdG9yID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiLCBcInNjcmlwdFwiLCBcImNvZGVcIl0pO1xuICAgICAgICBpZiAoY2hlY2tBbmNlc3RvciA9PSBudWxsIHx8IGNoZWNrQW5jZXN0b3Iubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcImJvZHlcIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICEoLyhefFxccylbYS16QS1aXSBbYS16QS1aXSBbYS16QS1aXSgkfFxccykvLnRlc3QodHh0VmFsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdGV4dFwiKTtcblxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgd2lkZ2V0X3RhYmJhYmxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmxpbmssYXJpYTpzcGluYnV0dG9uLGFyaWE6dGFibGlzdCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnUsYXJpYTpyYWRpb2dyb3VwLGFyaWE6dHJlZSxhcmlhOm1lbnViYXIsIGFyaWE6Z3JpZCwgYXJpYTp0cmVlZ3JpZCwgYXJpYTpjaGVja2JveCxhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b24sYXJpYTp0ZXh0Ym94LGFyaWE6c2Nyb2xsYmFyLGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSUJNQV9Gb2N1c19UYWJiYWJsZVwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJmYWlsX25vX3RhYmJhYmxlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJDb21wb25lbnQgd2l0aCBcXFwiezB9XFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSB0YWJiYWJsZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tcG9uZW50IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdGFiYmFibGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGEgcHJlc2VudGF0aW9uYWwgY2hpbGQgb2YgYW4gZWxlbWVudFxuICAgICAgICBpZiAoQXJpYVV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAvLyBDb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0IHJvbGVzLiBUaGV5IGFjdCBhcyBjb250YWluZXJzIHRoYXQgbWFuYWdlIG90aGVyLCBjb250YWluZWQgd2lkZ2V0cy5cbiAgICAgICAgbGV0IHJvbGVDb250YWluZXJzID0gW1wiY29tYm9ib3hcIiwgXCJncmlkXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0cmVlXCIsIFwidHJlZWdyaWRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlQ29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHJvbGUsIHRydWUpICE9IG51bGwpIFxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBkZXNjZW5kYW50IG9mIGEgY29tcG9zaXRlIHdpZGdldCBhbHJlYWR5IGV4YW1pbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm9kZSBoYXMgY2hpbGRyZW4sIGxvb2sgZm9yIHRhYiBzdG9wcyBpbiB0aGUgY2hpbGRyZW5cbiAgICAgICAgLy8gc2tpcCB0aGUgY291bnQgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoY291bnQgPCAxICYmICFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDEgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50ID49IDE7XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlUG90ZW50aWFsKFwiZmFpbF9ub190YWJiYWJsZVwiLCBbcm9sZV0pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHdpZGdldF90YWJiYWJsZV9zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpsaW5rLGFyaWE6bWVudWl0ZW0sYXJpYTpzcGluYnV0dG9uLGFyaWE6dGFibGlzdCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnUsYXJpYTpyYWRpb2dyb3VwLGFyaWE6dHJlZSxhcmlhOmNoZWNrYm94LGFyaWE6b3B0aW9uLGFyaWE6cmFkaW8sYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6dGV4dGJveCxhcmlhOmNvbHVtbmhlYWRlcixhcmlhOnJvd2hlYWRlcixhcmlhOnNsaWRlcixhcmlhOnRhYlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSUJNQV9Gb2N1c19NdWx0aVRhYlwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiOiBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ3aWRnZXRfdGFiYmFibGVfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJDb21wb25lbnRzIHdpdGggYSB3aWRnZXQgcm9sZSBzaG91bGQgaGF2ZSBubyBtb3JlIHRoYW4gb25lIHRhYmJhYmxlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwiQ29tcG9uZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBoYXMgbW9yZSB0aGFuIG9uZSB0YWJiYWJsZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tcG9uZW50cyB3aXRoIGEgd2lkZ2V0IHJvbGUgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiBvbmUgdGFiYmFibGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIiwgXCIyLjQuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKEFyaWFVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICArK2NvdW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIC8vc2tpcCB0aGUgY291bnQgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBsZXQgbmFtZSA9IFtdO1xuICAgICAgICBpZiAoY291bnQgPCAyICYmICFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDIgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmFkaW8gaW5wdXRzIHdpdGggdGhlIHNhbWUgbmFtZSBuYXRpdmVseSBhcmUgb25seSBvbmUgdGFiIHN0b3BcbiAgICAgICAgICAgICAgICAgICAgLyoqaWYgKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAobncubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSAncmFkaW8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VyTmFtZSA9IChudy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5pbmNsdWRlcyhjdXJOYW1lKSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5wdXNoKGN1ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9Ki9cbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50IDwgMjtcbiAgICAgICAgaWYgKCFwYXNzZWQpXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLCBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiKTtcbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbXVsdGlwbGVfdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIFRoaXMgZmlsZSBjb21lcyBmcm9tIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hY3QtcnVsZXMvYWN0LXRvb2xzL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG5pbXBvcnQgKiBhcyBTQ1VSTHMgZnJvbSBcIi4vc2MtdXJscy5qc29uXCJcbmltcG9ydCB7IEd1aWRlbGluZSwgZUd1aWRlbGluZUNhdGVnb3J5LCBlR3VpZGVsaW5lVHlwZSB9IGZyb20gXCIuL2FwaS9JR3VpZGVsaW5lXCI7XG5jb25zdCBTQ3MgPSBbXTtcbmZvciAoY29uc3Qga2V5IGluIFNDVVJMcykge1xuICAgIFNDcy5wdXNoKFNDVVJMc1trZXldKTtcbn1cblxuY29uc3Qgc3VtbWFyaWVzID0ge1xuICAgIFwiMS4xLjFcIjogXCJBbGwgbm9uLXRleHQgY29udGVudCB0aGF0IGlzIHByZXNlbnRlZCB0byB0aGUgdXNlciBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgc2VydmVzIHRoZSBlcXVpdmFsZW50IHB1cnBvc2UuXCIsXG4gICAgXCIxLjIuMVwiOiBcIkZvciBwcmVyZWNvcmRlZCBhdWRpby1vbmx5IG9yIHZpZGVvLW9ubHkgbWVkaWEsIGFuIGFsdGVybmF0aXZlIHByb3ZpZGVzIGVxdWl2YWxlbnQgaW5mb3JtYXRpb24uXCIsXG4gICAgXCIxLjIuMlwiOiBcIkNhcHRpb25zIGFyZSBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjNcIjogXCJBbiBhbHRlcm5hdGl2ZSBmb3IgdGltZS1iYXNlZCBtZWRpYSBvciBhdWRpbyBkZXNjcmlwdGlvbiBvZiB0aGUgcHJlcmVjb3JkZWQgdmlkZW8gY29udGVudCBpcyBwcm92aWRlZCBmb3Igc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjRcIjogXCJDYXB0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBsaXZlIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjVcIjogXCJBdWRpbyBkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIHZpZGVvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4zLjFcIjogXCJJbmZvcm1hdGlvbiwgc3RydWN0dXJlLCBhbmQgcmVsYXRpb25zaGlwcyBjb252ZXllZCB0aHJvdWdoIHByZXNlbnRhdGlvbiBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIG9yIGFyZSBhdmFpbGFibGUgaW4gdGV4dC5cIixcbiAgICBcIjEuMy4yXCI6IFwiV2hlbiB0aGUgc2VxdWVuY2UgaW4gd2hpY2ggY29udGVudCBpcyBwcmVzZW50ZWQgYWZmZWN0cyBpdHMgbWVhbmluZywgYSBjb3JyZWN0IHJlYWRpbmcgc2VxdWVuY2UgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZC5cIixcbiAgICBcIjEuMy4zXCI6IFwiSW5zdHJ1Y3Rpb25zIHByb3ZpZGVkIGZvciB1bmRlcnN0YW5kaW5nIGFuZCBvcGVyYXRpbmcgY29udGVudCBkbyBub3QgcmVseSBzb2xlbHkgb24gc2Vuc29yeSBjaGFyYWN0ZXJpc3RpY3Mgb2YgY29tcG9uZW50cyBzdWNoIGFzIHNoYXBlLCBzaXplLCB2aXN1YWwgbG9jYXRpb24sIG9yaWVudGF0aW9uLCBvciBzb3VuZC5cIixcbiAgICBcIjEuMy40XCI6IFwiQ29udGVudCBkb2VzIG5vdCByZXN0cmljdCBpdHMgdmlldyBhbmQgb3BlcmF0aW9uIHRvIGEgc2luZ2xlIGRpc3BsYXkgb3JpZW50YXRpb24sIHN1Y2ggYXMgcG9ydHJhaXQgb3IgbGFuZHNjYXBlLlwiLFxuICAgIFwiMS4zLjVcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGlucHV0IGZpZWxkIHRoYXQgY29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZCB3aGVuIHRoZSBmaWVsZCBzZXJ2ZXMgYSBjb21tb24gcHVycG9zZS5cIixcbiAgICBcIjEuNC4xXCI6IFwiQ29sb3IgaXMgbm90IHVzZWQgYXMgdGhlIG9ubHkgdmlzdWFsIG1lYW5zIG9mIGNvbnZleWluZyBpbmZvcm1hdGlvbiwgaW5kaWNhdGluZyBhbiBhY3Rpb24sIHByb21wdGluZyBhIHJlc3BvbnNlLCBvciBkaXN0aW5ndWlzaGluZyBhIHZpc3VhbCBlbGVtZW50LlwiLFxuICAgIFwiMS40LjJcIjogXCJJZiBhbnkgYXVkaW8gcGxheXMgYXV0b21hdGljYWxseSBmb3IgbW9yZSB0aGFuIDMgc2Vjb25kcywgZWl0aGVyIGEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBwYXVzZSBvciBzdG9wIHRoZSBhdWRpbywgb3IgYSBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIHRvIGNvbnRyb2wgYXVkaW8gdm9sdW1lIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgb3ZlcmFsbCBzeXN0ZW0gdm9sdW1lIGxldmVsLlwiLFxuICAgIFwiMS40LjNcIjogXCJUaGUgdmlzdWFsIHByZXNlbnRhdGlvbiBvZiB0ZXh0IGFuZCBpbWFnZXMgb2YgdGV4dCBoYXMgYSBjb250cmFzdCByYXRpbyBvZiBhdCBsZWFzdCA0LjU6MSwgd2l0aCBhIDM6MSByYXRpbyBmb3IgbGFyZ2Utc2NhbGUgdGV4dC5cIixcbiAgICBcIjEuNC40XCI6IFwiVGV4dCBjYW4gYmUgcmVzaXplZCB3aXRob3V0IGFzc2lzdGl2ZSB0ZWNobm9sb2d5IHVwIHRvIDIwMCBwZXJjZW50IHdpdGhvdXQgbG9zcyBvZiBjb250ZW50IG9yIGZ1bmN0aW9uYWxpdHkuXCIsXG4gICAgXCIxLjQuNVwiOiBcIklmIHRoZSB0ZWNobm9sb2dpZXMgYmVpbmcgdXNlZCBjYW4gYWNoaWV2ZSB0aGUgdmlzdWFsIHByZXNlbnRhdGlvbiwgdGV4dCBzaG91bGQgbm90IGJlIHVzZWQgdG8gY29udmV5IGluZm9ybWF0aW9uIHJhdGhlciB0aGFuIGltYWdlcyBvZiB0ZXh0LlwiLFxuICAgIFwiMS40LjEwXCI6IFwiQ29udGVudCBjYW4gcmVmbG93IHdpdGhvdXQgbG9zcyBvZiBpbmZvcm1hdGlvbiBvciBmdW5jdGlvbmFsaXR5LCBhbmQgd2l0aG91dCByZXF1aXJpbmcgc2Nyb2xsaW5nIGluIHR3byBkaW1lbnNpb25zLlwiLFxuICAgIFwiMS40LjExXCI6IFwiVGhlIHBhcnRzIG9mIGdyYXBoaWNhbCBvYmplY3RzIHJlcXVpcmVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRlbnQsIGFuZCB0aGUgdmlzdWFsIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGlkZW50aWZ5IFVJIGNvbXBvbmVudHMgYW5kIHN0YXRlcywgaGF2ZSBhIGNvbnRyYXN0IHJhdGlvIG9mIGF0IGxlYXN0IDM6MSBhZ2FpbnN0IGFkamFjZW50IGNvbG9ycy5cIixcbiAgICBcIjEuNC4xMlwiOiBcIk5vIGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5IG9jY3VycyB3aGVuIHVzZXJzIGNoYW5nZSBsZXR0ZXIsIHdvcmQgYW5kIHBhcmFncmFwaCBzcGFjaW5nLCBhcyB3ZWxsIGFzIGxpbmUgaGVpZ2h0LlwiLFxuICAgIFwiMS40LjEzXCI6IFwiV2hlcmUgaG92ZXIgb3IgZm9jdXMgYWN0aW9ucyBjYXVzZSBhZGRpdGlvbmFsIGNvbnRlbnQgdG8gYmVjb21lIHZpc2libGUgYW5kIGhpZGRlbiwgdGhlIGFkZGl0aW9uYWwgY29udGVudCBpcyBkaXNtaXNzYWJsZSwgaG92ZXJhYmxlIGFuZCBwZXJzaXN0ZW50LlwiLFxuICAgIFwiMi4xLjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgY29udGVudCBpcyBvcGVyYWJsZSB0aHJvdWdoIGEga2V5Ym9hcmQgaW50ZXJmYWNlIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpZmljIHRpbWluZ3MgZm9yIGluZGl2aWR1YWwga2V5c3Ryb2tlcy5cIixcbiAgICBcIjIuMS4yXCI6IFwiSWYga2V5Ym9hcmQgZm9jdXMgY2FuIGJlIG1vdmVkIHRvIGEgY29tcG9uZW50IHVzaW5nIGEga2V5Ym9hcmQgaW50ZXJmYWNlLCB0aGVuIGZvY3VzIGNhbiBiZSBtb3ZlZCBhd2F5IGZyb20gdGhhdCBjb21wb25lbnQgdXNpbmcgb25seSBhIGtleWJvYXJkIGludGVyZmFjZSwgYW5kLCBpZiBpdCByZXF1aXJlcyBtb3JlIHRoYW4gdW5tb2RpZmllZCBhcnJvdyBvciB0YWIga2V5cyBvciBvdGhlciBzdGFuZGFyZCBleGl0IG1ldGhvZHMsIHRoZSB1c2VyIGlzIGFkdmlzZWQgb2YgdGhlIG1ldGhvZCBmb3IgbW92aW5nIGZvY3VzIGF3YXkuXCIsXG4gICAgXCIyLjEuNFwiOiBcIklmIGEga2V5Ym9hcmQgc2hvcnRjdXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgb25seSBsZXR0ZXIsIHB1bmN0dWF0aW9uLCBudW1iZXIgb3Igc3ltYm9sIGNoYXJhY3RlcnMsIHRoZW4gdGhlIHNob3J0Y3V0IGNhbiBiZSB0dXJuZWQgb2ZmLCByZW1hcHBlZCBvciBhY3RpdmF0ZWQgb25seSBvbiBmb2N1cy5cIixcbiAgICBcIjIuMi4xXCI6IFwiRm9yIGVhY2ggdGltZSBsaW1pdCB0aGF0IGlzIHNldCBieSB0aGUgY29udGVudCwgdGhlIHVzZXIgY2FuIHR1cm4gb2ZmLCBhZGp1c3QsIG9yIGV4dGVuZCB0aGUgbGltaXQuXCIsXG4gICAgXCIyLjIuMlwiOiBcIkZvciBtb3ZpbmcsIGJsaW5raW5nLCBzY3JvbGxpbmcsIG9yIGF1dG8tdXBkYXRpbmcgaW5mb3JtYXRpb24sIHRoZSB1c2VyIGNhbiBwYXVzZSwgc3RvcCwgaGlkZSBvciBhZGp1c3QgdGhlIGluZm9ybWF0aW9uLlwiLFxuICAgIFwiMi4zLjFcIjogXCJDb250ZW50IGRvZXMgbm90IGNvbnRhaW4gYW55dGhpbmcgdGhhdCBmbGFzaGVzIG1vcmUgdGhhbiB0aHJlZSB0aW1lcyBpbiBhbnkgb25lIHNlY29uZCBwZXJpb2QsIG9yIHRoZSBmbGFzaCBpcyBiZWxvdyB0aGUgZ2VuZXJhbCBmbGFzaCBhbmQgcmVkIGZsYXNoIHRocmVzaG9sZHMuXCIsXG4gICAgXCIyLjQuMVwiOiBcIkEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzLlwiLFxuICAgIFwiMi40LjJcIjogXCJXZWIgcGFnZXMsIG5vbi13ZWIgZG9jdW1lbnRzLCBhbmQgc29mdHdhcmUgaGF2ZSB0aXRsZXMgdGhhdCBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjNcIjogXCJJZiBjb250ZW50IGNhbiBiZSBuYXZpZ2F0ZWQgc2VxdWVudGlhbGx5IGFuZCB0aGUgbmF2aWdhdGlvbiBzZXF1ZW5jZXMgYWZmZWN0IG1lYW5pbmcgb3Igb3BlcmF0aW9uLCBmb2N1c2FibGUgY29tcG9uZW50cyByZWNlaXZlIGZvY3VzIGluIGFuIG9yZGVyIHRoYXQgcHJlc2VydmVzIG1lYW5pbmcgYW5kIG9wZXJhYmlsaXR5LlwiLFxuICAgIFwiMi40LjRcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGxpbmsgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgbGluayB0ZXh0IGFsb25lIG9yIGZyb20gdGhlIGxpbmsgdGV4dCB0b2dldGhlciB3aXRoIGl0cyBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgbGluayBjb250ZW50LlwiLFxuICAgIFwiMi40LjVcIjogXCJNb3JlIHRoYW4gb25lIHdheSBpcyBhdmFpbGFibGUgdG8gbG9jYXRlIGEgV2ViIHBhZ2Ugd2l0aGluIGEgc2V0IG9mIFdlYiBwYWdlcywgZXhjZXB0IHdoZXJlIHRoZSBXZWIgUGFnZSBpcyB0aGUgcmVzdWx0IG9mLCBvciBhIHN0ZXAgaW4sIGEgcHJvY2Vzcy5cIixcbiAgICBcIjIuNC42XCI6IFwiSGVhZGluZ3MgYW5kIGxhYmVscyBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjdcIjogXCJBbnkga2V5Ym9hcmQgb3BlcmFibGUgdXNlciBpbnRlcmZhY2UgaGFzIGEgbW9kZSBvZiBvcGVyYXRpb24gd2hlcmUgdGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBpcyB2aXNpYmxlLlwiLFxuICAgIFwiMi40LjExXCI6IFwiV2hlbiBhbiBlbGVtZW50IHJlY2VpdmVzIGZvY3VzLCBpdCBpcyBub3QgZW50aXJlbHkgY292ZXJlZCBieSBvdGhlciBjb250ZW50LlwiLFxuICAgIFwiMi41LjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSB0aGF0IHVzZXMgbXVsdGlwb2ludCBvciBwYXRoLWJhc2VkIGdlc3R1cmVzIGZvciBvcGVyYXRpb24gY2FuIGJlIG9wZXJhdGVkIHdpdGggYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGEgcGF0aC1iYXNlZCBnZXN0dXJlLlwiLFxuICAgIFwiMi41LjJcIjogXCJGb3IgZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBvcGVyYXRlZCB1c2luZyBhIHNpbmdsZSBwb2ludGVyLCBjb21wbGV0aW9uIG9mIHRoZSBmdW5jdGlvbiBpcyBvbiB0aGUgdXAtZXZlbnQgd2l0aCBhbiBhYmlsaXR5IHRvIGFib3J0LCB1bmRvIG9yIHJldmVyc2UgdGhlIG91dGNvbWUuXCIsXG4gICAgXCIyLjUuM1wiOiBcIkZvciB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzIHdpdGggbGFiZWxzIHRoYXQgaW5jbHVkZSB0ZXh0IG9yIGltYWdlcyBvZiB0ZXh0LCB0aGUgYWNjZXNzaWJsZSBuYW1lIGNvbnRhaW5zIHRoZSB0ZXh0IHRoYXQgaXMgcHJlc2VudGVkIHZpc3VhbGx5LlwiLFxuICAgIFwiMi41LjRcIjogXCJGdW5jdGlvbmFsaXR5IHRoYXQgY2FuIGJlIG9wZXJhdGVkIGJ5IG1vdGlvbiBjYW4gYWxzbyBiZSBvcGVyYXRlZCBieSB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzLCBhbmQgdGhlIG1vdGlvbiB0cmlnZ2VyIGNhbiBiZSBkaXNhYmxlZC5cIixcbiAgICBcIjIuNS44XCI6IFwiVGhlIHNpemUgb2YgdGhlIHRhcmdldCBmb3IgcG9pbnRlciBpbnB1dHMgaXMgYXQgbGVhc3QgMjQgYnkgMjQgQ1NTIHBpeGVscy5cIixcbiAgICBcIjIuNS43XCI6IFwiQWxsIGZ1bmN0aW9uYWxpdHkgdGhhdCB1c2VzIGEgZHJhZ2dpbmcgbW92ZW1lbnQgZm9yIG9wZXJhdGlvbiBjYW4gYmUgYWNoaWV2ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGRyYWdnaW5nLlwiLFxuICAgIFwiMy4xLjFcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiBXZWIgcGFnZXMsIG5vbi1XZWIgZG9jdW1lbnRzLCBvciBzb2Z0d2FyZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4xLjJcIjogXCJUaGUgaHVtYW4gbGFuZ3VhZ2Ugb2YgZWFjaCBwYXNzYWdlIG9yIHBocmFzZSBpbiB0aGUgY29udGVudCBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4yLjFcIjogXCJXaGVuIGFueSBjb21wb25lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGRvZXMgbm90IGluaXRpYXRlIGEgY2hhbmdlIG9mIGNvbnRleHQuXCIsXG4gICAgXCIzLjIuMlwiOiBcIkNoYW5naW5nIHRoZSBzZXR0aW5nIG9mIGFueSB1c2VyIGludGVyZmFjZSBjb21wb25lbnQgZG9lcyBub3QgYXV0b21hdGljYWxseSBjYXVzZSBhIGNoYW5nZSBvZiBjb250ZXh0IHVubGVzcyB0aGUgdXNlciBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBiZWhhdmlvciBiZWZvcmUgdXNpbmcgdGhlIGNvbXBvbmVudC5cIixcbiAgICBcIjMuMi4zXCI6IFwiTmF2aWdhdGlvbmFsIG1lY2hhbmlzbXMgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzIHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgb2NjdXIgaW4gdGhlIHNhbWUgcmVsYXRpdmUgb3JkZXIgZWFjaCB0aW1lIHRoZXkgYXJlIHJlcGVhdGVkLCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4yLjRcIjogXCJDb21wb25lbnRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgYXJlIGlkZW50aWZpZWQgY29uc2lzdGVudGx5LlwiLFxuICAgIFwiMy4yLjZcIjogXCJNYWtlIGl0IGVhc2llciB0byBmaW5kIGhlbHAgYW5kIHN1cHBvcnQuIElmIGEgV2ViIHBhZ2UgY29udGFpbnMgaGVscCBtZWNoYW5pc21zIHRoZXkgb2NjdXIgaW4gdGhlIHNhbWUgb3JkZXIgcmVsYXRpdmUgdG8gb3RoZXIgcGFnZSBjb250ZW50LCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4zLjFcIjogXCJJZiBhbiBpbnB1dCBlcnJvciBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLCB0aGUgaXRlbSB0aGF0IGlzIGluIGVycm9yIGlzIGlkZW50aWZpZWQgYW5kIHRoZSBlcnJvciBpcyBkZXNjcmliZWQgdG8gdGhlIHVzZXIgaW4gdGV4dC5cIixcbiAgICBcIjMuMy4yXCI6IFwiTGFiZWxzIG9yIGluc3RydWN0aW9ucyBhcmUgcHJvdmlkZWQgd2hlbiBjb250ZW50IHJlcXVpcmVzIHVzZXIgaW5wdXQuXCIsXG4gICAgXCIzLjMuM1wiOiBcIklmIGFuIGlucHV0IGVycm9yIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYW5kIHN1Z2dlc3Rpb25zIGZvciBjb3JyZWN0aW9uIGFyZSBrbm93biwgdGhlbiB0aGUgc3VnZ2VzdGlvbnMgYXJlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLCB1bmxlc3MgaXQgd291bGQgamVvcGFyZGl6ZSB0aGUgc2VjdXJpdHkgb3IgcHVycG9zZSBvZiB0aGUgY29udGVudC5cIixcbiAgICBcIjMuMy40XCI6IFwiRm9yIGNvbnRlbnQgdGhhdCBjYXVzZSBsZWdhbCBjb21taXRtZW50cyBvciBmaW5hbmNpYWwgdHJhbnNhY3Rpb25zIGZvciB0aGUgdXNlciB0byBvY2N1ciwgdGhhdCBtb2RpZnkgb3IgZGVsZXRlIHVzZXItY29udHJvbGxhYmxlIGRhdGEgaW4gZGF0YSBzdG9yYWdlIHN5c3RlbXMsIG9yIHRoYXQgc3VibWl0IHVzZXIgdGVzdCByZXNwb25zZXMsIHRoZSB1c2VyIGNhbiByZXZlcnNlLCBjb3JyZWN0LCBvciBjb25maXJtIHRoZSBhY3Rpb24uXCIsXG4gICAgXCIzLjMuN1wiOiBcIk1ha2UgaXQgZWFzaWVyIGZvciB1c2VycyB0byBjb21wbGV0ZSBtdWx0aS1zdGVwIHByb2Nlc3Nlcy4gRG9uJ3QgYXNrIGZvciB0aGUgc2FtZSBpbmZvcm1hdGlvbiB0d2ljZSBpbiB0aGUgc2FtZSBzZXNzaW9uLlwiLFxuICAgIFwiMy4zLjhcIjogXCJNYWtlIGxvZ2lucyBwb3NzaWJsZSB3aXRoIGxlc3MgbWVudGFsIGVmZm9ydC4gRG9uJ3QgbWFrZSBwZW9wbGUgc29sdmUsIHJlY2FsbCwgb3IgdHJhbnNjcmliZSBzb21ldGhpbmcgdG8gbG9nIGluLlwiLFxuICAgIFwiNC4xLjFcIjogXCIoT2Jzb2xldGUgYW5kIHJlbW92ZWQpIFRoaXMgcmVxdWlyZW1lbnQgd2FzIG9yaWdpbmFsbHkgYWRvcHRlZCB0byBhZGRyZXNzIHByb2JsZW1zIHRoYXQgYXNzaXN0aXZlIHRlY2hub2xvZ3kgKEFUKSBoYWQgZGlyZWN0bHkgcGFyc2luZyBIVE1MLiBBVCBubyBsb25nZXIgaGFzIGFueSBuZWVkIHRvIGRpcmVjdGx5IHBhcnNlIEhUTUwuIENvbnNlcXVlbnRseSwgdGhlc2UgcHJvYmxlbXMgZWl0aGVyIG5vIGxvbmdlciBleGlzdCBvciBhcmUgYWRkcmVzc2VkIGJ5IG90aGVyIHJlcXVpcmVtZW50cy5cIiwgXG4gICAgXCI0LjEuMlwiOiBcIkZvciBhbGwgdXNlciBpbnRlcmZhY2UgY29tcG9uZW50cyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGZvcm0gZWxlbWVudHMsIGxpbmtzIGFuZCBjb21wb25lbnRzIGdlbmVyYXRlZCBieSBzY3JpcHRzKSwgdGhlIG5hbWUgYW5kIHJvbGUgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZDsgc3RhdGVzLCBwcm9wZXJ0aWVzLCBhbmQgdmFsdWVzIHRoYXQgY2FuIGJlIHNldCBieSB0aGUgdXNlciBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBzZXQ7IGFuZCBub3RpZmljYXRpb24gb2YgY2hhbmdlcyB0byB0aGVzZSBpdGVtcyBpcyBhdmFpbGFibGUgdG8gdXNlciBhZ2VudHMsIGluY2x1ZGluZyBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLlwiLFxuICAgIFwiNC4xLjNcIjogXCJJbiBjb250ZW50IGltcGxlbWVudGVkIHVzaW5nIG1hcmt1cCBsYW5ndWFnZXMsIHN0YXR1cyBtZXNzYWdlcyBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIHRocm91Z2ggcm9sZSBvciBwcm9wZXJ0aWVzIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgYnkgYXNzaXN0aXZlIHRlY2hub2xvZ2llcyB3aXRob3V0IHJlY2VpdmluZyBmb2N1cy5cIixcbiAgICBcIkhUTUxcIjogXCJUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGlzc3VlcyB0aGF0IGNhdXNlIGFjY2Vzc2liaWxpdHkgaXNzdWVzIG1heSBiZSBjb3ZlcmVkIGJ5IG90aGVyIHJ1bGVzIGFuZCB3aWxsIGJlIHJlcG9ydGVkIHVuZGVyIHRob3NlIGFjY2Vzc2liaWxpdHkgcmVxdWlyZW1lbnRzLiBIb3dldmVyLCBzb21lIG5vbi1jb25mb3JtaW5nIEhUTUwgc3BlY2lmaWNhdGlvbiBpc3N1ZXMgYXJlIHN0aWxsIHJlcG9ydGVkLlwiLFxuICAgIFwiQVJJQVwiOiBcIlRoZSBBUklBIHNwZWNpZmljYXRpb24gaXNzdWVzIHRoYXQgY2F1c2UgYWNjZXNzaWJpbGl0eSBpc3N1ZXMgbWF5IGJlIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXMgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgdW5kZXIgdGhvc2UgYWNjZXNzaWJpbGl0eSByZXF1aXJlbWVudHMuIEhvd2V2ZXIsIHNvbWUgbm9uLWNvbmZvcm1pbmcgQVJJQSBzcGVjaWZpY2F0aW9uIGlzc3VlcyBhcmUgc3RpbGwgcmVwb3J0ZWQuXCIsXG59ICAgICBcblxuZXhwb3J0IGNvbnN0IGExMXlSdWxlc2V0czogR3VpZGVsaW5lW10gPSBbXG4gICAgLy8ge1xuICAgIC8vICAgICBpZDogXCJERUJVR1wiLFxuICAgIC8vICAgICBuYW1lOiBcIkRFQlVHIFJ1bGVzXCIsXG4gICAgLy8gICAgIGNhdGVnb3J5OiBlUnVsZUNhdGVnb3J5LkFDQ0VTU0lCSUxJVFksXG4gICAgLy8gICAgIGRlc2NyaXB0aW9uOiBcIlJ1bGVzIGZvciBkZWJ1Z2dpbmdcIixcbiAgICAvLyAgICAgY2hlY2twb2ludHM6IFt7XG4gICAgLy8gICAgICAgICBudW06IFwiMVwiLFxuICAgIC8vICAgICAgICAgbmFtZTogXCJEZWJ1ZyBDUCAxXCIsXG4gICAgLy8gICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgIC8vICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRGVidWdcIlxuICAgIC8vICAgICB9XVxuICAgIC8vIH0sXG4gICAge1xuICAgICAgICBpZDogXCJFWFRFTlNJT05TXCIsXG4gICAgICAgIG5hbWU6IFwiRXh0ZW5zaW9uIFJ1bGVzXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIGVuYWJsaW5nIHRoZSBicm93c2VyIGV4dGVuc2lvbnNcIixcbiAgICAgICAgdHlwZTogZUd1aWRlbGluZVR5cGUuRVhURU5TSU9OLFxuICAgICAgICBjaGVja3BvaW50czogW3tcbiAgICAgICAgICAgIG51bTogXCIxXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBDUCAxXCIsXG4gICAgICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRXh0ZW5zaW9uXCJcbiAgICAgICAgfV1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiSUJNX0FjY2Vzc2liaWxpdHlcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSA3LjNcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjAsIDIuMSwgMi4yIEEgYW5kIEFBIHBsdXMgYWRkaXRpb25hbCBJQk0gc3VwcGxlbWVudGFsIHJlcXVpcmVtZW50cy5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIiB8fCBzYy5sZXZlbCA9PT0gXCJOQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiTkFcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkOiBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSBuZXh0XCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wLCAyLjEsIDIuMiBBIGFuZCBBQSBwbHVzIGFkZGl0aW9uYWwgSUJNIHN1cHBsZW1lbnRhbCByZXF1aXJlbWVudHMuXCIsXG4gICAgICAgIC8vIFRoaXMgcnVsZXNldCBoYXMgYWxsIDIuMCBhbmQgMi4xIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIgfHwgc2MubGV2ZWwgPT09IFwiTkFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMlwiIHx8IHNjLndjYWdUeXBlID09PSBcIk5BXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMlwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4yIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjIgQSAmIEFBLiBUaGlzIGlzIHRoZSBjdXJyZW50IFczQyByZWNvbW1lbmRhdGlvbiAoc3BlY2lmaWNhdGlvbikuIENvbnRlbnQgdGhhdCBjb25mb3JtcyB0byBXQ0FHIDIuMiBhbHNvIGNvbmZvcm1zIHRvIFdDQUcgMi4xLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgYW5kIDIuMSBjaGVja3BvaW50cyB0aGF0IGFyZSBBIG9yIEFBXG4gICAgICAgIGNoZWNrcG9pbnRzOiBTQ3NcbiAgICAgICAgICAgIC5maWx0ZXIoc2MgPT4gKHNjLmxldmVsID09PSBcIkFcIiB8fCBzYy5sZXZlbCA9PT0gXCJBQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMVwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4xIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjEgQSAmIEFBLiBDb250ZW50IHRoYXQgY29uZm9ybXMgdG8gV0NBRyAyLjEgYWxzbyBjb25mb3JtcyB0byBXQ0FHIDIuMC5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiKSlcbiAgICAgICAgICAgIC5tYXAoc2MgPT4gKHtcbiAgICAgICAgICAgICAgICBudW06IHNjLm51bSxcbiAgICAgICAgICAgICAgICBzY0lkOiBzYy5zY0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHNjLmhhbmRsZSxcbiAgICAgICAgICAgICAgICB3Y2FnTGV2ZWw6IHNjLmxldmVsLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcmllc1tzYy5udW1dXG4gICAgICAgICAgICB9KSlcbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiV0NBR18yXzBcIixcbiAgICAgICAgbmFtZTogXCJXQ0FHIDIuMCAoQSwgQUEpXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wIEEgJiBBQS4gUmVmZXJlbmNlZCBieSBVUyBTZWN0aW9uIDUwOCwgYnV0IG5vdCB0aGUgbGF0ZXN0IFczQyByZWNvbW1lbmRhdGlvbi5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIpICYmIChzYy53Y2FnVHlwZSA9PT0gXCIyLjBcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfVxuXVxuIiwiXG5pbXBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBTUlJlbmRlcmVyIH0gZnJvbSBcIi4vU1JSZW5kZXJlclwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUsIE5hdmlnYXRpb25SZXN1bHQsIFJlbmRlclJlc3VsdCB9IGZyb20gXCIuL1NSVHlwZXNcIjtcbmltcG9ydCB7IFNSTmF2aWdhdG9yIH0gZnJvbSBcIi4vU1JOYXZpZ2F0b3JcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgU1JVdGlsIH0gZnJvbSBcIi4vU1JVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG4vKipcbiAqIFNSQ29udHJvbGxlciBjbGFzcyBmb3IgbWFuYWdpbmcgc2NyZWVuIHJlYWRlciBzaW11bGF0aW9uXG4gKiBNYWludGFpbnMgYSBwb2ludCBvZiByZWdhcmQgYW5kIHByb3ZpZGVzIG5hdmlnYXRpb24gZnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBTUkNvbnRyb2xsZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgc2luZ2xldG9uO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udHJvbGxlcihjdHJsRG9jOiBIVE1MRG9jdW1lbnQgPSBkb2N1bWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuc2luZ2xldG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNpbmdsZXRvbiA9IG5ldyBTUkNvbnRyb2xsZXIoY3RybERvYy5ib2R5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b24gYXMgU1JDb250cm9sbGVyO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY3VycmVudCBwb2ludCBvZiByZWdhcmQgKi9cbiAgICBwcml2YXRlIHBvaW50T2ZSZWdhcmQ6IFNSQ3Vyc29yO1xuICAgIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgICBwcml2YXRlIGxpdmVMaXN0ZW5lcnM6IEFycmF5PChyZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPj4gPSBbXTtcbiAgICBwcml2YXRlIGN0cmxEb2M7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUkNvbnRyb2xsZXJcbiAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCB0byBzdGFydCBmcm9tIChkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5KVxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByb290RWxlbWVudDogTm9kZSA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgdGhpcy5jdHJsRG9jID0gcm9vdEVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgdGhpcy5zZXRQb2ludE9mUmVnYXJkKHJvb3RFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXR1cE11dGF0aW9uVHJhY2tpbmcoKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGBbV0FSTklOR10gVGhlIFNSQ29udHJvbGxlciBpcyBhIG5ldyBmZWF0dXJlIHRoYXQgaXMgbm90IHlldCBcInN0YWJsZVwiLiBXaGF0IHRoaXMgbWVhbnM6XG4qIEFQSSBzdWJqZWN0IHRvIGNoYW5nZSwgZXZlbiBiZXR3ZWVuIG1pbm9yIHZlcnNpb25zIG9mIHRoZSBjaGVja2VyXG4qIFJlc3VsdHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGtub3duIGlzc3VlcywgYnV0IG1ha2luZyB0aGlzIGF2YWlsYWJsZSBmb3IgZWFybHkgZXhwZXJpbWVudGF0aW9uIC8gZmVlZGJhY2suYCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBmaW5kQWxsU2hhZG93Um9vdHMocm9vdDogRG9jdW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgTm9kZSA9IGRvY3VtZW50KTogTm9kZVtdIHtcbiAgICAgICAgY29uc3Qgc2hhZG93Um9vdHM6IE5vZGVbXSA9IFtdO1xuXG4gICAgICAgIC8vIEdldCBhbGwgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgcm9vdFxuICAgICAgICBjb25zdCB3YWxrZXIgPSB0aGlzLmN0cmxEb2MuY3JlYXRlVHJlZVdhbGtlcihcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGw7XG4gICAgICAgIHdoaWxlIChub2RlID0gd2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZWxlbWVudCBoYXMgYW4gb3BlbiBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIHNoYWRvd1Jvb3RzLnB1c2goZWxlbWVudC5zaGFkb3dSb290KTtcblxuICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNlYXJjaCBpbnNpZGUgdGhpcyBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFNoYWRvd1Jvb3RzID0gdGhpcy5maW5kQWxsU2hhZG93Um9vdHMoZWxlbWVudC5zaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICBzaGFkb3dSb290cy5wdXNoKC4uLm5lc3RlZFNoYWRvd1Jvb3RzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFkb3dSb290cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgbXV0YXRpb24gdHJhY2tpbmdcbiAgICAgKiBcbiAgICAgKiBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgcG9pbnQgb2YgcmVnYXJkIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCB3ZSBuZWVkIHRvIGdldCB1cCB0byB0aGUgbmVhcmVzdCBwYXJlbnQgdGhhdCdzIG5vdCBiZWluZyByZW1vdmVkXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cE11dGF0aW9uVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbXlUaGlzID0gdGhpcztcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgcG9yTm9kZSA9IG15VGhpcy5wb2ludE9mUmVnYXJkLmdldE5vZGUoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVtb3ZhbE11dGF0aW9uIG9mIG11dGF0aW9ucy5maWx0ZXIobXV0YXRpb24gPT4gbXV0YXRpb24ucmVtb3ZlZE5vZGVzPy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIHJlbW92YWxNdXRhdGlvbi5yZW1vdmVkTm9kZXMuZm9yRWFjaCgocmVtb3ZlZE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZWROb2RlLmlzU2FtZU5vZGUocG9yTm9kZSkgfHwgcmVtb3ZlZE5vZGUuY29udGFpbnMocG9yTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIkFkanVzdGluZyBQb1IgZHVlIHRvIERPTSBtdXRhdGlvbiByZW1vdmluZyBQb1JcIik7Ly8sIHJlbW92YWxNdXRhdGlvbi50YXJnZXQsIHJlbW92ZWROb2RlLCBwb3JOb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9yTm9kZSA9IHJlbW92YWxNdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZXRQb2ludE9mUmVnYXJkKHBvck5vZGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIG11dGF0aW9uLmFkZGVkTm9kZXMuZm9yRWFjaChhZGRlZE5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG9ic2VydmF0aW9uIG9mIG5ldyBzaGFkb3cgcm9vdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxSb290cyA9IHRoaXMuZmluZEFsbFNoYWRvd1Jvb3RzKGFkZGVkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgYWxsUm9vdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHJvb3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBtdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUubm9kZVR5cGUgPT09IDEgPyBub2RlIGFzIEhUTUxFbGVtZW50IDogbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChlbGVtIFxuICAgICAgICAgICAgICAgICAgICAmJiAhZWxlbS5jbG9zZXN0KGBbYXJpYS1idXN5PVwidHJ1ZVwiXWApXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1idXN5XCIpICE9PSBcInRydWVcIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgbGl2ZSByZWdpb24gY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpdmVSZWdpb25FbGVtID0gXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudCBpdHNlbGYgaXMgYSBsaXZlIHJlZ2lvbiBjb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicG9saXRlXCIsIFwiYXNzZXJ0aXZlXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1saXZlXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiT1VUUFVUXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgW1wic3RhdHVzXCIsIFwibG9nXCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJhbGVydFwiLCBcInRpbWVyXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiYgZWxlbSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPciBnZXQgdGhlIG5lYXJlc3QgYW5jZXN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW0uY2xvc2VzdChgW2FyaWEtbGl2ZT1cInBvbGl0ZVwiXSxbYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCJdLG91dHB1dCxbcm9sZT1cInN0YXR1c1wiXSxbcm9sZT1cImxvZ1wiXSxbcm9sZT1cInByb2dyZXNzYmFyXCJdLFtyb2xlPVwiYWxlcnRcIl0sW3JvbGU9XCJ0aW1lclwiXWApO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBpc011dGF0aW9uUmVsZXZhbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlbGV2YW5jZSA9IFtcImFkZGl0aW9uc1wiLCBcInRleHRcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXZlUmVnaW9uRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoYXQga2luZHMgb2YgY2hhbmdlcyBhcmUgJ3JlbGV2YW50J1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsZXZhbnRFbGVtID0gZWxlbS5jbG9zZXN0KFwiW2FyaWEtcmVsZXZhbnRdXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGV2YW50RWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IHJlbGV2YW50RWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXJlbGV2YW50XCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwibG9nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFuY2UgPSBbXCJhZGRpdGlvbnNcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGl2ZVJlZ2lvbkVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1yZWxldmFudFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcmVsZXZhbnRcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGV2YW5jZS5pbmNsdWRlcyhcImFsbFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IFtcImFkZGl0aW9uc1wiLCBcInJlbW92YWxzXCIsIFwidGV4dFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTXV0YXRpb25SZWxldmFudCA9IChtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDMgJiYgcmVsZXZhbmNlLmluY2x1ZGVzKFwidGV4dFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwICYmIHJlbGV2YW5jZS5pbmNsdWRlcyhcImFkZGl0aW9uc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDAgJiYgcmVsZXZhbmNlLmluY2x1ZGVzKFwicmVtb3ZhbHNcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXZlUmVnaW9uRWxlbSAmJiBpc011dGF0aW9uUmVsZXZhbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQXRvbWljID0gbGl2ZVJlZ2lvbkVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1hdG9taWNcIikgPT09IFwidHJ1ZVwiIHx8IFtcImFsZXJ0XCIsIFwic3RhdHVzXCIsIFwidGltZXJcIiwgXCJtYXJxdWVlXCJdLmluY2x1ZGVzKGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgd2hvbGUgcmVnaW9uIGlmIGF0b21pY1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0F0b21pYyAmJiBtdXRhdGlvbi50eXBlID09PSBcImNoYXJhY3RlckRhdGFcIiAmJiBtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDMgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG11dGF0aW9uLnRhcmdldC5wYXJlbnRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGl2ZUxpc3RlbmVyIG9mIHRoaXMubGl2ZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlTGlzdGVuZXIobXV0YXRpb24udGFyZ2V0Lm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZVRhcmdldCA9IGlzQXRvbWljID8gbGl2ZVJlZ2lvbkVsZW0gOiBtdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsaXZlVGFyZ2V0IGFzIGFueSkubGl2ZUFubm91bmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCgobGl2ZVRhcmdldCBhcyBhbnkpLmxpdmVBbm5vdW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXZlVGFyZ2V0IGFzIGFueSkubGl2ZUFubm91bmNlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc1JlbW92YWwgPSAocmVsZXZhbmNlLmluY2x1ZGVzKFwicmVtb3ZhbHNcIikgJiYgbXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdG9taWMgfHwgaXNSZW1vdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZUN1cnNvciA9IG5ldyBTUkN1cnNvcihsaXZlVGFyZ2V0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZUN1cnNvckVuZCA9IG5ldyBTUkN1cnNvcihsaXZlVGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVDdXJzb3JFbmQubmV4dCgoKSA9PiB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCgoaXNSZW1vdmFsP1wiW3JlbW92ZWRdIFwiOlwiXCIpK1NSUmVuZGVyZXIucmVuZGVyUmFuZ2UoXCJpdGVtXCIsIGxpdmVDdXJzb3IsIGxpdmVDdXJzb3JFbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxldmFuY2UuaW5jbHVkZXMoXCJhZGRpdGlvbnNcIikgJiYgbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goYWRkZWROb2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHJlbmRlciB0aGUgYWRkaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdmVDdXJzb3IgPSBuZXcgU1JDdXJzb3IoYWRkZWROb2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdmVDdXJzb3JFbmQgPSBuZXcgU1JDdXJzb3IoYWRkZWROb2RlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlQ3Vyc29yRW5kLm5leHQoKCkgPT4gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFNSUmVuZGVyZXIucmVuZGVyUmFuZ2UoXCJpdGVtXCIsIGxpdmVDdXJzb3IsIGxpdmVDdXJzb3JFbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGl2ZUxpc3RlbmVyIG9mIHRoaXMubGl2ZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUxpc3RlbmVyKHJlc3VsdHMuam9pbihcIlxcblwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBOZWVkIHRvIG9ic2VydmUgYWxsIG9mIHRoZSBzaGFkb3cgcm9vdHNcbiAgICAgICAgbGV0IGFsbFJvb3RzID0gdGhpcy5maW5kQWxsU2hhZG93Um9vdHModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGFsbFJvb3RzLnB1c2godGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGZvciAoY29uc3Qgcm9vdCBvZiBhbGxSb290cykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShyb290LCB7XG4gICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTGl2ZUxpc3RlbmVyKGxpc3RlbmVyOiAocmVzdWx0OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICAgICAgdGhpcy5saXZlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVMaXZlTGlzdGVuZXIocmVtb3ZlTGlzdGVuZXI6IChyZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgICAgICB0aGlzLmxpdmVMaXN0ZW5lcnMgPSB0aGlzLmxpdmVMaXN0ZW5lcnMuZmlsdGVyKGxpc3RlbmVyID0+IGxpc3RlbmVyICE9PSByZW1vdmVMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHBvaW50IG9mIHJlZ2FyZFxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IFNSQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgcG9pbnQgb2YgcmVnYXJkXG4gICAgICovXG4gICAgcHVibGljIGdldFBvaW50T2ZSZWdhcmQoKTogU1JDdXJzb3Ige1xuICAgICAgICByZXR1cm4gdGhpcy5wb2ludE9mUmVnYXJkO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBvaW50IG9mIHJlZ2FyZCB0byBhIHNwZWNpZmljIERPTSBub2RlXG4gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gc2V0IGFzIHRoZSBwb2ludCBvZiByZWdhcmRcbiAgICAgKiBAcmV0dXJucyBOYXZpZ2F0aW9uUmVzdWx0IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIHNldFBvaW50T2ZSZWdhcmQobm9kZTogTm9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKFwic2V0UG9pbnRPZlJlZ2FyZFwiKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucG9pbnRPZlJlZ2FyZCA9IG5ldyBTUkN1cnNvcihub2RlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVXBkYXRlIGNvbnRhaW5lciBzdGF0ZVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhcImZvY3VzXCIsIHRoaXMucG9pbnRPZlJlZ2FyZCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSB0aGlzLnBvaW50T2ZSZWdhcmQuZ2V0Um9sZSgpO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMucG9pbnRPZlJlZ2FyZC5nZXROYW1lSW5mbygpPy5uYW1lO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiBTUlJlbmRlcmVyLnJlbmRlckN1cnJlbnQoXCJmb2N1c1wiLCB0aGlzLnBvaW50T2ZSZWdhcmQsIGNvbnRhaW5lckNoYW5nZXMpLFxuICAgICAgICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBzZXQgcG9pbnQgb2YgcmVnYXJkOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogSnVtcCB0byB0aGUgbmV4dCBlbGVtZW50IGJ5IHRoZSBzcGVjaWZpZWQgbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdG8gdXNlXG4gICAgICogQHJldHVybnMgTmF2aWdhdGlvblJlc3VsdCBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZVxuICAgICAqL1xuICAgIHB1YmxpYyBqdW1wTmV4dChtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBDYWNoZVV0aWwuY2xlYXJDYWNoZXModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9sZFBvaW50T2ZSZWdhcmQgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cChcImp1bXBOZXh0XCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGJDb250aW51ZSA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmV4dEp1bXAgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgICAgIGxldCByZW5kZXJpbmdSZXN1bHQ7XG4gICAgICAgICAgICB3aGlsZSAoYkNvbnRpbnVlICYmIG5leHRKdW1wKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEp1bXAgPSBuZXh0SnVtcC5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIG5leHRKdW1wID0gU1JOYXZpZ2F0b3IuanVtcE5leHQobW9kZSwgbmV4dEp1bXApO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0SnVtcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCBuZXh0SnVtcCwgbGFzdEp1bXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgIVNSTmF2aWdhdG9yLmdldFN0YXJ0RnVuYyhtb2RlKShuZXh0SnVtcC5nZXRSb2xlKCksICFuZXh0SnVtcC5pc0VuZFRhZygpLCBuZXh0SnVtcC5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBuZXh0SnVtcCwgY29udGFpbmVyQ2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGxhbmRpbmcgcG9pbnQgaXMgZW1wdHksIHVubGVzcyBpdCdzIGNlcnRhaW4gbmF2IG1vZGVzIChlLmcuLCByZWdpb24pXG4gICAgICAgICAgICAgICAgICAgIGJDb250aW51ZSA9IHJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIVtcInJlZ2lvblwiXS5pbmNsdWRlcyhtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHRKdW1wKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcG9pbnQgb2YgcmVnYXJkXG4gICAgICAgICAgICAgICAgdGhpcy5wb2ludE9mUmVnYXJkID0gb2xkUG9pbnRPZlJlZ2FyZDtcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudFJlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBvbGRQb2ludE9mUmVnYXJkLCB7IGxlYXZpbmc6IFtdLCBlbnRlcmluZzogW119KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogb2xkUG9pbnRPZlJlZ2FyZC5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTm8gbmV4dCAke21vZGV9LiAke2N1cnJlbnRSZXN1bHQ/Lm1lc3NhZ2UgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBuZXh0SnVtcDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldE5hbWVJbmZvKCk/Lm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGNvbnRhaW5lciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJOZXcgUE9SOlwiLCB0aGlzLnBvaW50T2ZSZWdhcmQuZ2V0Tm9kZSgpLCByZW5kZXJpbmdSZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgcm9sZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBvaW50IG9mIHJlZ2FyZFxuICAgICAgICAgICAgdGhpcy5wb2ludE9mUmVnYXJkID0gb2xkUG9pbnRPZlJlZ2FyZDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIGVuZDogb2xkUG9pbnRPZlJlZ2FyZC5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTmF2aWdhdGlvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIEp1bXAgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgYnkgdGhlIHNwZWNpZmllZCBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB0byB1c2VcbiAgICAgKiBAcmV0dXJucyBOYXZpZ2F0aW9uUmVzdWx0IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIGp1bXBQcmV2aW91cyhtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBDYWNoZVV0aWwuY2xlYXJDYWNoZXModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9sZFBvaW50T2ZSZWdhcmQgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBwcmV2SnVtcCA9IHRoaXMucG9pbnRPZlJlZ2FyZC5jbG9uZSgpO1xuICAgICAgICAgICAgbGV0IHJlbmRlcmluZ1Jlc3VsdDtcbiAgICAgICAgICAgIHdoaWxlIChiQ29udGludWUgJiYgcHJldkp1bXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0SnVtcCA9IHByZXZKdW1wLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgcHJldkp1bXAgPSBTUk5hdmlnYXRvci5qdW1wUHJldmlvdXMobW9kZSwgcHJldkp1bXApO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2SnVtcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCBwcmV2SnVtcCwgbGFzdEp1bXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgIVNSTmF2aWdhdG9yLmdldFN0YXJ0RnVuYyhtb2RlKShwcmV2SnVtcC5nZXRSb2xlKCksICFwcmV2SnVtcC5pc0VuZFRhZygpLCBwcmV2SnVtcC5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBwcmV2SnVtcCwgY29udGFpbmVyQ2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGxhbmRpbmcgcG9pbnQgaXMgZW1wdHksIHVubGVzcyBpdCdzIGNlcnRhaW4gbmF2IG1vZGVzIChlLmcuLCByZWdpb24pXG4gICAgICAgICAgICAgICAgICAgIGJDb250aW51ZSA9IHJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIVtcInJlZ2lvblwiXS5pbmNsdWRlcyhtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcHJldkp1bXApIHtcbiAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwb2ludCBvZiByZWdhcmRcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBvbGRQb2ludE9mUmVnYXJkO1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UmVzdWx0ID0gU1JSZW5kZXJlci5yZW5kZXJDdXJyZW50KG1vZGUsIG9sZFBvaW50T2ZSZWdhcmQsIHsgbGVhdmluZzogW10sIGVudGVyaW5nOiBbXX0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG9sZFBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBObyBwcmV2aW91cyAke21vZGV9LiAke2N1cnJlbnRSZXN1bHQ/Lm1lc3NhZ2UgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBwcmV2SnVtcDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldE5hbWVJbmZvKCk/Lm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gLy8gQ2hlY2sgZm9yIGNvbnRhaW5lciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCB0aGlzLnBvaW50T2ZSZWdhcmQsIG9sZFBvaW50T2ZSZWdhcmQpO1xuICAgICAgICAgICAgICAgIC8vIGxldCBzID0gU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCB0aGlzLnBvaW50T2ZSZWdhcmQpO1xuICAgICAgICAgICAgICAgIC8vIGlmIChjb250YWluZXJDaGFuZ2VzLmVudGVyaW5nW2NvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcubGVuZ3RoLTFdICE9PSBzKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcucHVzaChzKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcG9pbnQgb2YgcmVnYXJkXG4gICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBvbGRQb2ludE9mUmVnYXJkO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG9sZFBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBOYXZpZ2F0aW9uIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHRoZSBkaWZmZXJlbnQgaW4gY29udGFpbmVycyBiZXR3ZWVuIHRoZSB0d28gbm9kZXNcbiAgICAgKiBAcGFyYW0gbmV3V2Fsa2VyIFRoZSBuZXcgbm9kZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvXG4gICAgICogQHBhcmFtIG9sZFdhbGtlciBUaGUgcHJldmlvdXMgbm9kZSB3ZSB3ZXJlIGF0XG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY29udGFpbmVyIGNoYW5nZSBtZXNzYWdlc1xuICAgICAqL1xuICAgIC8qKlxuICAgICAqIFdhbGsgdXAgZnJvbSBhIG5vZGUgaW4gYW4gaWZyYW1lIHN1YmRvY3VtZW50IHRvIGZpbmQgdGhlIGhvc3QgPGlmcmFtZT4gZWxlbWVudFxuICAgICAqIGluIHRoZSBuZWFyZXN0IGFuY2VzdG9yIGRvY3VtZW50LiAgUmV0dXJucyBudWxsIGlmIHRoZSBub2RlIGlzIG5vdCBpbiBhIHN1YmRvY3VtZW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGhvc3RJZnJhbWUobm9kZTogTm9kZSk6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGRvYyA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2MgfHwgZG9jID09PSBkb2N1bWVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIGNvbnRlbnRXaW5kb3cuZnJhbWVFbGVtZW50IGlzIHRoZSA8aWZyYW1lPiBpbiB0aGUgcGFyZW50IGRvY3VtZW50XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gRE9NVXRpbC5nZXRBbmNlc3Rvcihub2RlLCBbXCJpZnJhbWVcIl0pIGFzIEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGlmZkNvbnRhaW5lcnMobW9kZTogTmF2aWdhdGlvbk1vZGUgfCBcImZvY3VzXCIsIG5ld1dhbGtlcjogU1JDdXJzb3IsIG9sZFdhbGtlcj86IFNSQ3Vyc29yKTogeyBsZWF2aW5nOiBzdHJpbmdbXSwgZW50ZXJpbmc6IHN0cmluZ1tdIH0ge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIi09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LVwiKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJBKVwiLCBvbGRXYWxrZXI/LmdldE5vZGUoKS5ub2RlTmFtZSwgbmV3V2Fsa2VyLmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgIGxldCBsZWF2aW5nOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgZW50ZXJpbmc6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEb2MgPSBuZXdXYWxrZXI/LmdldE5vZGUoKS5vd25lckRvY3VtZW50ID8/IGRvY3VtZW50O1xuICAgICAgICAgICAgY29uc3Qgb2xkRG9jID0gb2xkV2Fsa2VyPy5nZXROb2RlKCkub3duZXJEb2N1bWVudCA/PyBkb2N1bWVudDtcblxuICAgICAgICAgICAgLy8g4pSA4pSAIENyb3NzLWRvY3VtZW50IGlmcmFtZSBib3VuZGFyeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIG5hdmlnYXRpb24gY3Jvc3NlcyBpbnRvIG9yIG91dCBvZiBhbiA8aWZyYW1lPiBzdWJkb2N1bWVudFxuICAgICAgICAgICAgLy8gdGhlIG5vcm1hbCBjb21tb25QYXJlbnQgd2FsayBjYW5ub3Qgc3BhbiBkb2N1bWVudCBib3VuZGFyaWVzLlxuICAgICAgICAgICAgLy8gV2UgZGV0ZWN0IHRoaXMgYW5kIG1hbnVhbGx5IGluamVjdCB0aGUgY29udGFpbmVyLWVudGVyL2V4aXQgZm9yIHRoZVxuICAgICAgICAgICAgLy8gPGlmcmFtZT4gZWxlbWVudCBpdHNlbGYuXG4gICAgICAgICAgICBpZiAobmV3RG9jICE9PSBvbGREb2MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdJZnJhbWUgPSBTUkNvbnRyb2xsZXIuaG9zdElmcmFtZShuZXdXYWxrZXIuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRJZnJhbWUgPSBTUkNvbnRyb2xsZXIuaG9zdElmcmFtZShvbGRXYWxrZXI/LmdldE5vZGUoKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobmV3SWZyYW1lICYmICFvbGRJZnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW50ZXJpbmcgYW4gaWZyYW1lIHN1YmRvY3VtZW50IOKAlCBlbWl0IHRoZSBmcmFtZSBjb250YWluZXItZW50ZXIuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZUN1cnNvciA9IG5ldyBTUkN1cnNvcihuZXdJZnJhbWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50ZXIgPSBTUlJlbmRlcmVyLnJlbmRlckVudGVyKG1vZGUsIGlmcmFtZUN1cnNvciwgb2xkV2Fsa2VyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudGVyICYmIGVudGVyLnRyaW0oKSkgZW50ZXJpbmcucHVzaChlbnRlci50cmltKCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5ld0lmcmFtZSAmJiBvbGRJZnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTGVhdmluZyBhbiBpZnJhbWUgc3ViZG9jdW1lbnQg4oCUIGVtaXQgdGhlIGZyYW1lIGNvbnRhaW5lci1leGl0LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWVDdXJzb3IgPSBuZXcgU1JDdXJzb3Iob2xkSWZyYW1lLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVhdmUgPSBTUlJlbmRlcmVyLnJlbmRlckxlYXZlKG1vZGUgYXMgTmF2aWdhdGlvbk1vZGUsIGlmcmFtZUN1cnNvciwgb2xkV2Fsa2VyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlYXZlICYmIGxlYXZlLnRyaW0oKSkgbGVhdmluZy5wdXNoKGxlYXZlLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdJZnJhbWUgJiYgb2xkSWZyYW1lICYmIG5ld0lmcmFtZSAhPT0gb2xkSWZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmluZyBiZXR3ZWVuIHR3byBkaWZmZXJlbnQgaWZyYW1lcyDigJQgZXhpdCBvbGQsIGVudGVyIG5ldy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkQ3Vyc29yID0gbmV3IFNSQ3Vyc29yKG9sZElmcmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlYXZlID0gU1JSZW5kZXJlci5yZW5kZXJMZWF2ZShtb2RlIGFzIE5hdmlnYXRpb25Nb2RlLCBvbGRDdXJzb3IsIG9sZFdhbGtlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWF2ZSAmJiBsZWF2ZS50cmltKCkpIGxlYXZpbmcucHVzaChsZWF2ZS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDdXJzb3IgPSBuZXcgU1JDdXJzb3IobmV3SWZyYW1lLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudGVyID0gU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCBuZXdDdXJzb3IsIG9sZFdhbGtlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRlciAmJiBlbnRlci50cmltKCkpIGVudGVyaW5nLnB1c2goZW50ZXIudHJpbSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWZ0ZXIgaW5qZWN0aW5nIGlmcmFtZSBib3VuZGFyeSBhbm5vdW5jZW1lbnRzLCBhbHNvIHJ1biB0aGUgbm9ybWFsXG4gICAgICAgICAgICAgICAgLy8gd2l0aGluLWRvY3VtZW50IGRpZmZDb250YWluZXJzIGZvciBlYWNoIHNpZGUgaW5kZXBlbmRlbnRseSBzbyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gbGFuZG1hcmtzIGluc2lkZSB0aGUgaWZyYW1lIGFyZSBhbm5vdW5jZWQgY29ycmVjdGx5LlxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxlYXZpbmcsIGVudGVyaW5nIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIOKUgOKUgCBTYW1lLWRvY3VtZW50IHBhdGggKG9yaWdpbmFsIGxvZ2ljKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgICAgICAgIGNvbnN0IGRvY1Jvb3QgPSBuZXdXYWxrZXIgP1xuICAgICAgICAgICAgICAgIChuZXdXYWxrZXIuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQuYm9keSB8fCBuZXdXYWxrZXIuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA6XG4gICAgICAgICAgICAgICAgb2xkV2Fsa2VyID9cbiAgICAgICAgICAgICAgICAgICAgKG9sZFdhbGtlci5nZXROb2RlKCkub3duZXJEb2N1bWVudC5ib2R5IHx8IG9sZFdhbGtlci5nZXROb2RlKCkub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIDpcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGxldCB3YWxrTmV3ID0gbmV3V2Fsa2VyID8gbmV3V2Fsa2VyLmNsb25lKCkgOiAobmV3IFNSQ3Vyc29yKGRvY1Jvb3QpKTtcbiAgICAgICAgICAgIGxldCB3YWxrT2xkID0gb2xkV2Fsa2VyID8gb2xkV2Fsa2VyLmNsb25lKCkgOiAobmV3IFNSQ3Vyc29yKGRvY1Jvb3QpKTtcbiAgICAgICAgICAgIGlmICghd2Fsa05ldy5nZXROb2RlKCkuaXNTYW1lTm9kZSh3YWxrT2xkLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tbW9uUGFyZW50ID0gU1JDb250cm9sbGVyLmNvbW1vblBhcmVudCh3YWxrTmV3LCB3YWxrT2xkKTtcbiAgICAgICAgICAgICAgICBpZiAoY29tbW9uUGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiQilcIiwgY29tbW9uUGFyZW50LmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa05ldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiRW50ZXJpbmc6XCIsIHdhbGtOZXcuZ2V0Tm9kZSgpLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nLnB1c2goU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCB3YWxrTmV3LCB3YWxrT2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrTmV3LnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVudGVyaW5nLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgZW50ZXJpbmcgPSBlbnRlcmluZy5maWx0ZXIocyA9PiBzICYmIHMudHJpbSgpLmxlbmd0aCA+IDApLm1hcChzID0+IHMudHJpbSgpKTs7XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbW1vblBhcmVudC5jb250YWlucyh3YWxrT2xkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJMZWF2aW5nOlwiLCB3YWxrT2xkLmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nLnB1c2goU1JSZW5kZXJlci5yZW5kZXJMZWF2ZShtb2RlLCB3YWxrT2xkLCB3YWxrT2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrT2xkLnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxlYXZpbmcgPSBsZWF2aW5nLmZpbHRlcihzID0+IHMgJiYgcy50cmltKCkubGVuZ3RoID4gMCkubWFwKHMgPT4gcy50cmltKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2cobGVhdmluZywgZW50ZXJpbmcpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWF2aW5nLFxuICAgICAgICAgICAgZW50ZXJpbmdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb21tb25QYXJlbnQod2Fsa2VyT25lOiBTUkN1cnNvciwgd2Fsa2VyVHdvOiBTUkN1cnNvcik6IFNSQ3Vyc29yIHtcbiAgICAgICAgaWYgKHdhbGtlck9uZS5jb250YWlucyh3YWxrZXJUd28pKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fsa2VyT25lLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSBpZiAod2Fsa2VyVHdvLmNvbnRhaW5zKHdhbGtlck9uZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3YWxrZXJUd28uY2xvbmUoKTsgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29tbW9uUGFyZW50OiBTUkN1cnNvciA9IHdhbGtlck9uZS5jbG9uZSgpO1xuICAgICAgICAgICAgd2hpbGUgKCFjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa2VyVHdvKSAmJiBjb21tb25QYXJlbnQucGFyZW50KCkpO1xuICAgICAgICAgICAgaWYgKCFjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa2VyT25lKSB8fCAhY29tbW9uUGFyZW50LmNvbnRhaW5zKHdhbGtlclR3bykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gY29tbW9uUGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJBbGwobW9kZTogTmF2aWdhdGlvbk1vZGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBjdHJsID0gU1JDb250cm9sbGVyLmdldENvbnRyb2xsZXIoKTtcbiAgICAgICAgbGV0IGRpYWxvZ3MgPSBjdHJsLmN0cmxEb2MuYm9keS5xdWVyeVNlbGVjdG9yQWxsKFwiZGlhbG9nLFtyb2xlPSdkaWFsb2cnXVwiKTtcbiAgICAgICAgZGlhbG9ncy5mb3JFYWNoKGRpYWxvZyA9PiB7XG4gICAgICAgICAgICBpZiAoU1JVdGlsLmlzTW9kYWxEaWFsb2dFbGVtZW50KGRpYWxvZykpIHtcbiAgICAgICAgICAgICAgICBjdHJsLnNldFBvaW50T2ZSZWdhcmQoZGlhbG9nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgbGV0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgaW5pdGlhbCBpdGVtIGZpcnN0IChpZiB0aGVyZSBpcyBvbmUpXG4gICAgICAgIGxldCBzdGFydGVyTXNnID0gU1JSZW5kZXJlci5yZW5kZXJDdXJyZW50KG1vZGUsIGN0cmwuZ2V0UG9pbnRPZlJlZ2FyZCgpLCB7ZW50ZXJpbmc6IFtdLCBsZWF2aW5nOiBbXX0pO1xuICAgICAgICBpZiAoc3RhcnRlck1zZykge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHN0YXJ0ZXJNc2cubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKGJDb250aW51ZSkge1xuICAgICAgICAgICAgbGV0IG5leHRWYWwgPSBjdHJsLmp1bXBOZXh0KG1vZGUpO1xuICAgICAgICAgICAgaWYgKG5leHRWYWwuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChuZXh0VmFsLnJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJBbGxEZXRhaWwoZG9jOiBIVE1MRG9jdW1lbnQsIG1vZGU6IE5hdmlnYXRpb25Nb2RlKTogUmVuZGVyUmVzdWx0W10ge1xuICAgICAgICBsZXQgY3RybCA9IFNSQ29udHJvbGxlci5nZXRDb250cm9sbGVyKGRvYyk7XG4gICAgICAgIGN0cmwuc2V0UG9pbnRPZlJlZ2FyZChkb2MuYm9keSk7XG4gICAgICAgIGxldCBkaWFsb2dzID0gZG9jLmJvZHkucXVlcnlTZWxlY3RvckFsbChcImRpYWxvZyxbcm9sZT0nZGlhbG9nJ11cIik7XG4gICAgICAgIGRpYWxvZ3MuZm9yRWFjaChkaWFsb2cgPT4ge1xuICAgICAgICAgICAgaWYgKFNSVXRpbC5pc01vZGFsRGlhbG9nRWxlbWVudChkaWFsb2cpKSB7XG4gICAgICAgICAgICAgICAgY3RybC5zZXRQb2ludE9mUmVnYXJkKGRpYWxvZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGxldCByZXN1bHRzOiBSZW5kZXJSZXN1bHRbXSA9IFtdO1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGluaXRpYWwgaXRlbSBmaXJzdCAoaWYgdGhlcmUgaXMgb25lKVxuICAgICAgICBsZXQgc3RhcnRlck1zZyA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBjdHJsLmdldFBvaW50T2ZSZWdhcmQoKSwge2VudGVyaW5nOiBbXSwgbGVhdmluZzogW119KTtcbiAgICAgICAgaWYgKHN0YXJ0ZXJNc2cpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChzdGFydGVyTXNnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiQ29udGludWUgPSB0cnVlO1xuICAgICAgICB3aGlsZSAoYkNvbnRpbnVlKSB7XG4gICAgICAgICAgICBsZXQgbmV4dFZhbCA9IGN0cmwuanVtcE5leHQobW9kZSk7XG4gICAgICAgICAgICBpZiAobmV4dFZhbC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgLy8gbW9kZSA9PT0gXCJpdGVtXCIgJiYgY29uc29sZS5sb2cobmV4dFZhbCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKG5leHRWYWwucmVuZGVyaW5nUmVzdWx0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJTdHJ1Y3R1cmUoZG9jOiBIVE1MRG9jdW1lbnQpOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiB7XG4gICAgICAgIGNvbnN0IG1vZGVzOiBOYXZpZ2F0aW9uTW9kZVtdID0gWyBcInJlZ2lvblwiLCBcImhlYWRpbmdcIiwgXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCIsIFwiaW1hZ2VcIiBdO1xuICAgICAgICBsZXQgZGV0YWlscyA9IG1vZGVzLm1hcChtb2RlTGFiZWwgPT4gU1JDb250cm9sbGVyLnJlbmRlckFsbERldGFpbChkb2MsIG1vZGVMYWJlbCkpO1xuICAgICAgICBsZXQgcmV0VmFsOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiA9IFtdO1xuICAgICAgICB3aGlsZSAoZGV0YWlscy5zb21lKGRldGFpbCA9PiBkZXRhaWwubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZGV0YWlsc1swXVswXT8uc3RhcnQ7XG4gICAgICAgICAgICBtb2Rlcy5mb3JFYWNoKChtb2RlLCBpZHgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1tpZHhdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8IFNSQ3Vyc29yLmNvbXBhcmUoZGV0YWlsc1tpZHhdWzBdLnN0YXJ0LCBuZXh0KSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBkZXRhaWxzW2lkeF1bMF0uc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGV0IG5leHRJdGVtOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgICAgICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIG1vZGVzLmZvckVhY2goKG1vZGUsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIG5leHRJdGVtW21vZGVdID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1tpZHhdLmxlbmd0aCA+IDAgJiYgU1JDdXJzb3IuY29tcGFyZShkZXRhaWxzW2lkeF1bMF0uc3RhcnQsIG5leHQpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRJdGVtW21vZGVdID0gZGV0YWlsc1tpZHhdLnNoaWZ0KCkubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgaGFzVmFsdWUgPSBuZXh0SXRlbVttb2RlXSAhPT0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGhhc1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5leHQuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gZWxlbSAmJiBTUlV0aWwuZ2V0VW5pcXVlU2VsZWN0b3IoZWxlbSk7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBlbGVtZW50J3Mgb3duIGRvY3VtZW50IGZvciBxdWVyeVNlbGVjdG9yIHNvIHRoYXQgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAvLyBpbnNpZGUgaWZyYW1lIHN1YmRvY3VtZW50cyByZXNvbHZlIGNvcnJlY3RseS5cbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtRG9jID0gZWxlbT8ub3duZXJEb2N1bWVudCA/PyBkb2M7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yICYmIGVsZW1Eb2MucXVlcnlTZWxlY3RvcihzZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZW0uc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0VmFsLnB1c2gobmV4dEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufSIsImltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBY2Nlc3NpYmxlTmFtZVJlc3VsdCwgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFNSVXRpbCB9IGZyb20gXCIuL1NSVXRpbFwiO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHR5cGUgZm9yIG1hdGNoaW5nIG5vZGVzIGR1cmluZyBjdXJzb3IgbmF2aWdhdGlvblxuICogQHBhcmFtIHJvbGUgLSBUaGUgQVJJQSByb2xlIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAqIEBwYXJhbSBiU3RhcnRUYWcgLSBXaGV0aGVyIHRoaXMgaXMgYSBzdGFydCB0YWcgKHRydWUpIG9yIGVuZCB0YWcgKGZhbHNlKVxuICogQHBhcmFtIG5vZGUgLSBUaGUgRE9NIG5vZGUgYmVpbmcgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNyaXRlcmlhLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IHR5cGUgU1JDdXJzb3JNYXRjaEZ1bmMgPSAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IGJvb2xlYW47XG5cbmV4cG9ydCB0eXBlIFNSQ3Vyc29yU2tpcEZ1bmMgPSAoY3Vyc29yOiBTUkN1cnNvcikgPT4geyBza2lwQ3VycmVudDogYm9vbGVhbiwgc2tpcENoaWxkcmVuOiBib29sZWFufSB8IG51bGw7XG5cbi8qKlxuICogU1JDdXJzb3IgKFNjcmVlbiBSZWFkZXIgQ3Vyc29yKSBjbGFzc1xuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBjdXJzb3ItbGlrZSBpbnRlcmZhY2UgZm9yIG5hdmlnYXRpbmcgdGhlIERPTSBpbiBhIHdheSB0aGF0XG4gKiBzaW11bGF0ZXMgaG93IHNjcmVlbiByZWFkZXJzIHByb2Nlc3MgYW5kIG5hdmlnYXRlIGNvbnRlbnQuIEl0IHRyYWNrczpcbiAqIC0gVGhlIGN1cnJlbnQgbm9kZSBwb3NpdGlvblxuICogLSBXaGV0aGVyIGl0J3MgYXQgYSBzdGFydCBvciBlbmQgdGFnXG4gKiAtIFRoZSBBUklBIHJvbGUgb2YgdGhlIGN1cnJlbnQgbm9kZVxuICogLSBUaGUgYWNjZXNzaWJsZSBuYW1lIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAqL1xuZXhwb3J0IGNsYXNzIFNSQ3Vyc29yIHtcbiAgICAvKiogVGhlIEFSSUEgcm9sZSBvZiB0aGUgY3VycmVudCBub2RlICovXG4gICAgcHJpdmF0ZSByb2xlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb21wdXRlZCBhY2Nlc3NpYmxlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbm9kZSAqL1xuICAgIHByaXZhdGUgbmFtZTogQWNjZXNzaWJsZU5hbWVSZXN1bHQ7XG4gICAgLyoqIFRoZSB1bmRlcmx5aW5nIERPTSB3YWxrZXIgdGhhdCBoYW5kbGVzIG5vZGUgdHJhdmVyc2FsICovXG4gICAgcHJpdmF0ZSB3YWxrZXI6IERPTVdhbGtlcjtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBhdCBhIHRleHQgbm9kZSBpbnNpZGUgYSBwcmVmb3JtYXR0ZWQgc2VnbWVudFxuICAgICAqIChlLmcuIDxwcmU+KSwgdGhpcyBpbmRleCBpZGVudGlmaWVzIHdoaWNoIG5ld2xpbmUtZGVsaW1pdGVkIGxpbmUgaXMgdGhlXG4gICAgICogY3VycmVudCByZWFkaW5nIHBvc2l0aW9uLiAgdW5kZWZpbmVkIG1lYW5zIFwibm90IGluIGEgcHJlZm9ybWF0dGVkIGNvbnRleHRcIi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlTGluZUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUkN1cnNvciBwb3NpdGlvbmVkIGF0IHRoZSBzcGVjaWZpZWQgZWxlbWVudFxuICAgICAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIERPTSBub2RlIHRvIHBvc2l0aW9uIHRoZSBjdXJzb3IgYXRcbiAgICAgKiBAcGFyYW0gYkVuZCAtIFdoZXRoZXIgdG8gcG9zaXRpb24gYXQgdGhlIGVuZCB0YWcgKHRydWUpIG9yIHN0YXJ0IHRhZyAoZmFsc2UpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZWxlbWVudCA6IE5vZGUsIGJFbmQ/IDogYm9vbGVhbikge1xuICAgICAgICAvLyBVc2UgRE9NV2Fsa2VyIHdpdGggY29uc2lkZXJIaWRkZW49ZmFsc2UgdG8gcHJvY2VzcyBhbGwgY29udGVudCAoaW5jbHVkaW5nIGhpZGRlbiBlbGVtZW50cylcbiAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHNjcmVlbiByZWFkZXIgc2ltdWxhdGlvbiB3aGljaCBuZWVkcyB0byBzZWUgYWxsIGNvbnRlbnRcbiAgICAgICAgdGhpcy53YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQsIGJFbmQsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBjdXJzb3IgYXQgdGhlIHNhbWUgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBTUkN1cnNvciBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIHBvc2l0aW9uIGFuZCBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgY2xvbmUoKSA6IFNSQ3Vyc29yIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IG5ldyBTUkN1cnNvcih0aGlzLndhbGtlci5ub2RlLCB0aGlzLndhbGtlci5iRW5kVGFnKTtcbiAgICAgICAgcmV0VmFsLnJvbGUgPSB0aGlzLnJvbGU7XG4gICAgICAgIHJldFZhbC5uYW1lID0gdGhpcy5uYW1lO1xuICAgICAgICByZXRWYWwucHJlTGluZUluZGV4ID0gdGhpcy5wcmVMaW5lSW5kZXg7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgcm9sZSBhbmQgYWNjZXNzaWJsZSBuYW1lIHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbm9kZVxuICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjdXJzb3IgcG9zaXRpb24gY2hhbmdlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWZyZXNoTmFtZSgpIHtcbiAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIEVsZW1lbnQgbm9kZVxuICAgICAgICAgICAgdGhpcy5yb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIC8vIFRleHQgbm9kZVxuICAgICAgICAgICAgdGhpcy5yb2xlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB7IG5hbWU6IHRoaXMud2Fsa2VyLm5vZGUudGV4dENvbnRlbnQsIG5hbWVGcm9tOiBcInRleHRcIiB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXIgbm9kZSB0eXBlc1xuICAgICAgICAgICAgdGhpcy5yb2xlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgY3JpdGVyaWFcbiAgICAgKiBAcGFyYW0gbWF0Y2hpbmdGdW5jIC0gRnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGEgbm9kZSBtYXRjaGVzIHRoZSBzZWFyY2ggY3JpdGVyaWFcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgbm9kZSB3YXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHB1YmxpYyBuZXh0KG1hdGNoaW5nRnVuYzogU1JDdXJzb3JNYXRjaEZ1bmMsIHNraXBGdW5jPzogU1JDdXJzb3JTa2lwRnVuYykgOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTtcblxuICAgICAgICAvLyBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBsZXQgZm91bmROZXh0ID0gZmFsc2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBza2lwIGluZm8gZm9yIHRoZSBjdXJyZW50IHNwb3RcbiAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKGBuZXh0IGZ1bmN0aW9uYCk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHRoaXMuaXNFbmRUYWcoKT9cIi9cIjpcIlwiLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgIGxldCB7IHNraXBDdXJyZW50LCBza2lwQ2hpbGRyZW4gfSA9IChza2lwRnVuYyAmJiBza2lwRnVuYyh0aGlzKSkgfHwgeyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJza2lwQ3VycmVudDpcIiwgc2tpcEN1cnJlbnQsIFwic2tpcENoaWxkcmVuOlwiLCBza2lwQ2hpbGRyZW4pO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIE1vdmUgYXMgYXBwcm9wcmlhdGUgZnJvbSB0aGUgY3VycmVudCBzcG90XG4gICAgICAgICAgICBpZiAoc2tpcENoaWxkcmVuICYmICF0aGlzLndhbGtlci5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53YWxrZXIuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLndhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2tpcCBpbmZvIGZvciB0aGUgbmV3IHNwb3RcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHRoaXMuaXNFbmRUYWcoKT9cIi9cIjpcIlwiLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgICAgICAoeyBza2lwQ3VycmVudCwgc2tpcENoaWxkcmVuIH0gPSAoc2tpcEZ1bmMgJiYgc2tpcEZ1bmModGhpcykpIHx8IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH0pO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJza2lwQ3VycmVudDpcIiwgc2tpcEN1cnJlbnQsIFwic2tpcENoaWxkcmVuOlwiLCBza2lwQ2hpbGRyZW4pO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgcm9sZSBiYXNlZCBvbiBub2RlIHR5cGVcbiAgICAgICAgICAgIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoU1JVdGlsLmlzTW9kYWxEaWFsb2dFbGVtZW50KHRoaXMuZ2V0Tm9kZSgpKSAmJiB0aGlzLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFza2lwQ3VycmVudCkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBtYXRjaGVzIG91ciBjcml0ZXJpYVxuICAgICAgICAgICAgICAgIGZvdW5kTmV4dCA9IG1hdGNoaW5nRnVuYyh0aGlzLnJvbGUsICF0aGlzLndhbGtlci5iRW5kVGFnLCB0aGlzLndhbGtlci5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoIWZvdW5kTmV4dCk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiZm91bmROZXh0OlwiLCBmb3VuZE5leHQsIHRoaXMuaXNFbmRUYWcoKT9cIi9cIjpcIlwiLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUuZ3JvdXBFbmQoKTtcblxuICAgICAgICBpZiAoZm91bmROZXh0KSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hOYW1lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSZXNldCBwcm9wZXJ0aWVzIGlmIG5vIG1hdGNoIHdhcyBmb3VuZFxuICAgICAgICAgICAgdGhpcy5yb2xlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZE5leHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgbm9kZSB0aGF0IG1hdGNoZXMgdGhlIHByb3ZpZGVkIGNyaXRlcmlhXG4gICAgICogQHBhcmFtIG1hdGNoaW5nRnVuYyAtIEZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyBpZiBhIG5vZGUgbWF0Y2hlcyB0aGUgc2VhcmNoIGNyaXRlcmlhXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIG5vZGUgd2FzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmlvdXMobWF0Y2hpbmdGdW5jOiBTUkN1cnNvck1hdGNoRnVuYywgc2tpcEZ1bmM/OiBTUkN1cnNvclNraXBGdW5jKSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBsZXQgZm91bmRQcmV2aW91cyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc2tpcCBpbmZvIGZvciB0aGUgY3VycmVudCBzcG90XG4gICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cChgcHJldmlvdXMgZnVuY3Rpb25gKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2codGhpcy5pc0VuZFRhZygpLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgIGxldCB7IHNraXBDdXJyZW50LCBza2lwQ2hpbGRyZW4gfSA9IChza2lwRnVuYyAmJiBza2lwRnVuYyh0aGlzKSkgfHwgeyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbik7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIE1vdmUgYXMgYXBwcm9wcmlhdGUgZnJvbSB0aGUgY3VycmVudCBzcG90XG4gICAgICAgICAgICBpZiAoc2tpcENoaWxkcmVuICYmIHRoaXMud2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIlNraXBwaW5nIG5vZGVcIilcbiAgICAgICAgICAgICAgICB0aGlzLndhbGtlci5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLndhbGtlci5wcmV2Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2tpcCBpbmZvIGZvciB0aGUgbmV3IHNwb3RcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHRoaXMuaXNFbmRUYWcoKSwgdGhpcy5nZXROb2RlKCkpO1xuICAgICAgICAgICAgKHsgc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbiB9ID0gKHNraXBGdW5jICYmIHNraXBGdW5jKHRoaXMpKSB8fCB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHNraXBDdXJyZW50LCBza2lwQ2hpbGRyZW4pO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgcm9sZSBiYXNlZCBvbiBub2RlIHR5cGVcbiAgICAgICAgICAgIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoU1JVdGlsLmlzTW9kYWxEaWFsb2dFbGVtZW50KHRoaXMuZ2V0Tm9kZSgpKSAmJiAhdGhpcy5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXNraXBDdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIG1hdGNoZXMgb3VyIGNyaXRlcmlhXG4gICAgICAgICAgICAgICAgZm91bmRQcmV2aW91cyA9IG1hdGNoaW5nRnVuYyh0aGlzLnJvbGUsICF0aGlzLndhbGtlci5iRW5kVGFnLCB0aGlzLndhbGtlci5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoIWZvdW5kUHJldmlvdXMpO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyh0aGlzLmlzRW5kVGFnKCksIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICBpZiAoZm91bmRQcmV2aW91cykge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVzZXQgcHJvcGVydGllcyBpZiBubyBtYXRjaCB3YXMgZm91bmRcbiAgICAgICAgICAgIHRoaXMucm9sZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm91bmRQcmV2aW91cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgY3VycmVudCBub2RlXG4gICAgICogQHBhcmFtIGVuZFRhZyAtIFdoZXRoZXIgdG8gcG9zaXRpb24gYXQgdGhlIGVuZCB0YWcgKHRydWUpIG9yIHN0YXJ0IHRhZyAoZmFsc2UpXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgbW92ZWQgdG8gcGFyZW50LCBmYWxzZSBpZiBubyBwYXJlbnQgZXhpc3RzXG4gICAgICovXG4gICAgcHVibGljIHBhcmVudChlbmRUYWc/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy53YWxrZXIubm9kZS5wYXJlbnROb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMud2Fsa2VyLm5vZGUgPSB0aGlzLndhbGtlci5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIHRoaXMud2Fsa2VyLmJFbmRUYWcgPSBlbmRUYWcgPT09IHRydWU7XG4gICAgICAgIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy53YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgdGhpcy5yb2xlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB7IG5hbWU6IHRoaXMud2Fsa2VyLm5vZGUudGV4dENvbnRlbnQsIG5hbWVGcm9tOiBcInRleHRcIiB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb2xlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdXAgdGhlIERPTSB0cmVlIHVudGlsIGZpbmRpbmcgYSBub2RlIHdpdGggYSBtYXRjaGluZyByb2xlIG9yIGVsZW1lbnQgbmFtZVxuICAgICAqIEBwYXJhbSByb2xlcyAtIEFycmF5IG9mIEFSSUEgcm9sZXMgdG8gbWF0Y2hcbiAgICAgKiBAcGFyYW0gZWxlbXMgLSBPcHRpb25hbCBhcnJheSBvZiBlbGVtZW50IG5hbWVzIHRvIG1hdGNoXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIG5vZGUgd2FzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlKHJvbGVzOiBzdHJpbmdbXSwgZWxlbXM/OiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCB1cHBFbGVtcyA9IGVsZW1zID8gZWxlbXMubWFwKGVsZW0gPT4gZWxlbS50b1VwcGVyQ2FzZSgpKSA6IFtdO1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gKHdhbGtlcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB3YWxrZXIuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJvbGVzLmluY2x1ZGVzKHRoaXMuZ2V0Um9sZSgpKVxuICAgICAgICAgICAgfHwgKGVsZW0gJiYgIWVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiB1cHBFbGVtcy5pbmNsdWRlcyhlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoIW1hdGNoZXModGhpcykgJiYgdGhpcy5wYXJlbnQoKSk7XG4gICAgICAgIHJldHVybiBtYXRjaGVzKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY3Vyc29yIGFuZCBtb3ZlcyBpdCB1cCB0aGUgRE9NIHRyZWUgdW50aWwgZmluZGluZyBhIG5vZGUgd2l0aCBhIG1hdGNoaW5nIHJvbGUgb3IgZWxlbWVudCBuYW1lXG4gICAgICogQHBhcmFtIHJvbGVzIC0gQXJyYXkgb2YgQVJJQSByb2xlcyB0byBtYXRjaFxuICAgICAqIEBwYXJhbSBlbGVtcyAtIE9wdGlvbmFsIGFycmF5IG9mIGVsZW1lbnQgbmFtZXMgdG8gbWF0Y2hcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBjdXJzb3IgYXQgdGhlIG1hdGNoaW5nIG5vZGUsIG9yIG51bGwgaWYgbm8gbWF0Y2ggZm91bmRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUocm9sZXM6IHN0cmluZ1tdLCBlbGVtcz86IHN0cmluZ1tdKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIGlmIChyZXRWYWwuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlKHJvbGVzLCBlbGVtcykpIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRPclBhcmVudFRhYmJhYmxlQ2xvbmUoKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHdoaWxlIChyZXRWYWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSByZXRWYWwuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgaWYgKHJldFZhbC5pc1N0YXJ0VGFnKCkgJiYgZWxlbSAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZXRWYWwucGFyZW50KGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIEFSSUEgcm9sZSBvZiB0aGUgY3VycmVudCBub2RlXG4gICAgICogQHJldHVybnMgVGhlIEFSSUEgcm9sZSBhcyBhIHN0cmluZywgb3IgdW5kZWZpbmVkIGlmIG5vdCBhdmFpbGFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Um9sZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5yb2xlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFjY2Vzc2libGUgbmFtZSBpbmZvIGZvciB0aGUgY3VycmVudCBub2RlXG4gICAgICogQHJldHVybnMgVGhlIEFjY2Vzc2libGVOYW1lUmVzdWx0IG9iamVjdCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBhdmFpbGFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmFtZUluZm8oKTogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYWNjZXNzaWJsZSBuYW1lIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICAvLyBIYW5kbGUgb25lLW9mZiBxdWlya3MgaW4gdGhlIG5hbWUgY2FsY3VsYXRpb25cbiAgICAgICAgY29uc3QgbmFtZUluZm8gPSB0aGlzLmdldE5hbWVJbmZvKCk7XG4gICAgICAgIGlmIChuYW1lSW5mbyAmJiBuYW1lSW5mby5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gbmFtZUluZm8ubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtID0gdGhpcy5nZXRFbGVtZW50KCk7XG4gICAgICAgIGlmIChlbGVtKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGVtLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxFbGVtLmlubmVyVGV4dCB8fCBsYWJlbEVsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGN1cnNvciBpcyBhdCBhbiBlbmQgdGFnIG9yIHN0YXJ0IHRhZ1xuICAgICAqIEBwYXJhbSB2YWwgLSBUcnVlIGZvciBlbmQgdGFnLCBmYWxzZSBmb3Igc3RhcnQgdGFnXG4gICAgICovXG4gICAgcHVibGljIHNldEVuZFRhZyh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy53YWxrZXIuYkVuZFRhZyA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBET00gbm9kZSBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBET00gbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53YWxrZXIubm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IG5vZGUgYXMgYW4gSFRNTEVsZW1lbnQgaWYgaXQgaXMgYW4gZWxlbWVudCBub2RlXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgbm9kZSBhcyBIVE1MRWxlbWVudCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBhbiBlbGVtZW50XG4gICAgICovXG4gICAgcHVibGljIGdldEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy53YWxrZXIubm9kZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzLndhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJlbnRFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMud2Fsa2VyLm5vZGUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcmV0VmFsID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXRWYWwud2Fsa2VyLm5vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChyZXRWYWwud2Fsa2VyLm5vZGUpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQgYXQgYW4gZW5kIHRhZ1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYXQgYW4gZW5kIHRhZywgZmFsc2UgaWYgYXQgYSBzdGFydCB0YWdcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFbmRUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhbGtlci5iRW5kVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQgYXQgYW4gZW5kIHRhZ1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYXQgYW4gZW5kIHRhZywgZmFsc2UgaWYgYXQgYSBzdGFydCB0YWdcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdGFydFRhZygpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLndhbGtlci5iRW5kVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBhcmVzIHRoZSBkb2N1bWVudCBwb3NpdGlvbiBvZiB0d28gY3Vyc29yc1xuICAgICAqIEBwYXJhbSBvbmUgLSBGaXJzdCBjdXJzb3IgdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSB0d28gLSBTZWNvbmQgY3Vyc29yIHRvIGNvbXBhcmVcbiAgICAgKiBAcmV0dXJucyAwIGlmIGVxdWFsLCAtMSBpZiBvbmUgaXMgYmVmb3JlIHR3bywgMSBpZiBvbmUgaXMgYWZ0ZXIgdHdvXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjb21wYXJlKG9uZTogU1JDdXJzb3IgfCBudWxsLCB0d286IFNSQ3Vyc29yIHwgbnVsbCkge1xuICAgICAgICBjb25zdCBub2RlT25lID0gb25lPy53YWxrZXI/Lm5vZGU7XG4gICAgICAgIGNvbnN0IG5vZGVUd28gPSB0d28/LndhbGtlcj8ubm9kZTtcbiAgICAgICAgaWYgKCFub2RlT25lICYmICFub2RlVHdvKSByZXR1cm4gMDtcbiAgICAgICAgaWYgKCFub2RlT25lKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKCFub2RlVHdvKSByZXR1cm4gLTE7XG5cbiAgICAgICAgLy8gV2hlbiBib3RoIGN1cnNvcnMgYXJlIGF0IHRoZSBzYW1lIDxwcmU+IGVsZW1lbnQgYW5kIGF0IGxlYXN0IG9uZSBoYXMgYVxuICAgICAgICAvLyBwcmVMaW5lSW5kZXgsIHVzZSBsaW5lIGluZGV4IG9yZGVyaW5nIHNvIHZpcnR1YWwgcGVyLWxpbmUgc3RvcHMgYXJlIHNlcXVlbmNlZFxuICAgICAgICAvLyBjb3JyZWN0bHkuICBwcmVMaW5lSW5kZXg9dW5kZWZpbmVkIG1lYW5zIHRoZSBibG9jay1lbnRlciBzdG9wLCB3aGljaCBjb21lc1xuICAgICAgICAvLyBiZWZvcmUgYWxsIG51bWJlcmVkIGxpbmVzICh1bmRlZmluZWQgPCAwIDwgMSA8IDIg4oCmKS5cbiAgICAgICAgaWYgKG5vZGVPbmUgPT09IG5vZGVUd28gJiYgIW9uZS53YWxrZXIuYkVuZFRhZyAmJiAhdHdvLndhbGtlci5iRW5kVGFnKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lT25lVW5kZWZpbmVkID0gb25lLnByZUxpbmVJbmRleCA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbGluZVR3b1VuZGVmaW5lZCA9IHR3by5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghbGluZU9uZVVuZGVmaW5lZCB8fCAhbGluZVR3b1VuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIEF0IGxlYXN0IG9uZSBjdXJzb3IgaGFzIGEgbGluZSBpbmRleFxuICAgICAgICAgICAgICAgIGlmIChsaW5lT25lVW5kZWZpbmVkKSByZXR1cm4gLTE7ICAvLyB1bmRlZmluZWQgKGJsb2NrLWVudGVyKSBzb3J0cyBiZWZvcmUgYWxsIGxpbmVzXG4gICAgICAgICAgICAgICAgaWYgKGxpbmVUd29VbmRlZmluZWQpIHJldHVybiAxOyAgIC8vIHR3byBpcyBibG9jay1lbnRlcjsgb25lIChhIG51bWJlcmVkIGxpbmUpIGlzIGFmdGVyXG4gICAgICAgICAgICAgICAgaWYgKG9uZS5wcmVMaW5lSW5kZXggIT09IHR3by5wcmVMaW5lSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uZS5wcmVMaW5lSW5kZXggPCB0d28ucHJlTGluZUluZGV4ID8gLTEgOiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IGRvY1Bvc2l0aW9uID0gbm9kZU9uZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlVHdvKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEhhbmRsZSBkaXNjb25uZWN0ZWQgbm9kZXMgKGRpZmZlcmVudCBkb2N1bWVudHMgb3Igc2hhZG93IERPTXMpXG4gICAgICAgIGlmIChkb2NQb3NpdGlvbiAmIDB4MSkge1xuICAgICAgICAgICAgLy8gTm9kZXMgYXJlIGRpc2Nvbm5lY3RlZCAtIHRoZXkncmUgaW4gZGlmZmVyZW50IHRyZWVzIChpZnJhbWUgb3Igc2hhZG93IERPTSlcbiAgICAgICAgICAgIC8vIEJ1aWxkIGFuY2VzdG9yIGNoYWlucyB1c2luZyBET01XYWxrZXIucGFyZW50Tm9kZSAoaGFuZGxlcyBzaGFkb3cgRE9NICYgaWZyYW1lcylcbiAgICAgICAgICAgIGxldCBhbmNlc3RvcnNPbmU6IE5vZGVbXSA9IFtub2RlT25lXTtcbiAgICAgICAgICAgIGxldCBhbmNlc3RvcnNUd286IE5vZGVbXSA9IFtub2RlVHdvXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IGN1cnJlbnQ6IE5vZGUgfCBudWxsID0gbm9kZU9uZTtcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgICBhbmNlc3RvcnNPbmUucHVzaChjdXJyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY3VycmVudCA9IG5vZGVUd287XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgICAgYW5jZXN0b3JzVHdvLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFJldmVyc2Ugc28gcm9vdCBpcyBmaXJzdFxuICAgICAgICAgICAgYW5jZXN0b3JzT25lLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGFuY2VzdG9yc1R3by5yZXZlcnNlKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEZpbmQgd2hlcmUgdGhlIHBhdGhzIGRpdmVyZ2VcbiAgICAgICAgICAgIGxldCBjb21tb25EZXB0aCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoY29tbW9uRGVwdGggPCBhbmNlc3RvcnNPbmUubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgY29tbW9uRGVwdGggPCBhbmNlc3RvcnNUd28ubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgYW5jZXN0b3JzT25lW2NvbW1vbkRlcHRoXSA9PT0gYW5jZXN0b3JzVHdvW2NvbW1vbkRlcHRoXSkge1xuICAgICAgICAgICAgICAgIGNvbW1vbkRlcHRoKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIElmIG9uZSBwYXRoIGlzIGEgcHJlZml4IG9mIHRoZSBvdGhlciwgaGFuZGxlIGNvbnRhaW5tZW50XG4gICAgICAgICAgICBpZiAoY29tbW9uRGVwdGggPT09IGFuY2VzdG9yc09uZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBub2RlT25lIGlzIGFuIGFuY2VzdG9yIG9mIG5vZGVUd29cbiAgICAgICAgICAgICAgICByZXR1cm4gb25lLndhbGtlci5iRW5kVGFnID8gMSA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbW1vbkRlcHRoID09PSBhbmNlc3RvcnNUd28ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gbm9kZVR3byBpcyBhbiBhbmNlc3RvciBvZiBub2RlT25lXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR3by53YWxrZXIuYkVuZFRhZyA/IC0xIDogMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ29tcGFyZSB0aGUgbm9kZXMgd2hlcmUgcGF0aHMgZGl2ZXJnZVxuICAgICAgICAgICAgaWYgKGNvbW1vbkRlcHRoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZE9uZSA9IGFuY2VzdG9yc09uZVtjb21tb25EZXB0aF07XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkVHdvID0gYW5jZXN0b3JzVHdvW2NvbW1vbkRlcHRoXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRQb3NpdGlvbiA9IGNoaWxkT25lLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGNoaWxkVHdvKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRQb3NpdGlvbiAmIDB4MikgcmV0dXJuIDE7ICAvLyBjaGlsZFR3byBwcmVjZWRlcyBjaGlsZE9uZVxuICAgICAgICAgICAgICAgIGlmIChjaGlsZFBvc2l0aW9uICYgMHg0KSByZXR1cm4gLTE7IC8vIGNoaWxkT25lIHByZWNlZGVzIGNoaWxkVHdvXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE5vIGNvbW1vbiBhbmNlc3RvciBmb3VuZCAtIHNob3VsZG4ndCBoYXBwZW4gaW4gYSB3ZWxsLWZvcm1lZCBkb2N1bWVudFxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChkb2NQb3NpdGlvbiAmIDB4OCkge1xuICAgICAgICAgICAgLy8gb25lIGlzIGNvbnRhaW5lZCB3aXRoaW4gdHdvXG4gICAgICAgICAgICAvLyBpZiB0d28gaXMgYW4gZW5kIHRhZywgb25lIGlzIGJlZm9yZSwgb3RoZXJ3aXNlLCBvbmUgaXMgYWZ0ZXJcbiAgICAgICAgICAgIHJldHVybiB0d28ud2Fsa2VyLmJFbmRUYWcgPyAtMSA6IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9jUG9zaXRpb24gJiAweDEwKSB7XG4gICAgICAgICAgICAvLyB0d28gaXMgY29udGFpbmVkIHdpdGhpbiBvbmVcbiAgICAgICAgICAgIC8vIGlmIG9uZSBpcyBhbiBlbmQgdGFnLCBvbmUgaXMgYWZ0ZXIsIG90aGVyd2lzZSwgb25lIGlzIGJlZm9yZVxuICAgICAgICAgICAgcmV0dXJuIG9uZS53YWxrZXIuYkVuZFRhZyA/IDEgOiAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChkb2NQb3NpdGlvbiAmIDB4Mikge1xuICAgICAgICAgICAgLy8gdHdvIHByZWNlZGVzIG9uZSBpbiB0aGUgZG9jdW1lbnRcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9IGVsc2UgaWYgKGRvY1Bvc2l0aW9uICYgMHg0KSB7XG4gICAgICAgICAgICAvLyBvbmUgcHJlY2VkZXMgdHdvIGluIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIGN1cnNvcidzIG5vZGUgY29udGFpbnMgYW5vdGhlciBjdXJzb3IncyBub2RlXG4gICAgICogQHBhcmFtIG90aGVyIC0gVGhlIG90aGVyIGN1cnNvciB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBjdXJzb3IgY29udGFpbnMgKGlzIGEgcGFyZW50L2FuY2VzdG9yIG9mKSB0aGUgb3RoZXIgY3Vyc29yJ3Mgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBjb250YWlucyhvdGhlcjogU1JDdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZSgpLmNvbnRhaW5zKG90aGVyLmdldE5vZGUoKSlcbiAgICAgICAgICAgICYmICF0aGlzLmlzU2FtZU5vZGUob3RoZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIGN1cnNvciBwb2ludHMgdG8gdGhlIHNhbWUgbm9kZSBhcyBhbm90aGVyIGN1cnNvclxuICAgICAqIEBwYXJhbSBvdGhlciAtIFRoZSBvdGhlciBjdXJzb3IgdG8gY29tcGFyZSB3aXRoXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBib3RoIGN1cnNvcnMgcG9pbnQgdG8gdGhlIHNhbWUgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1NhbWVOb2RlKG90aGVyOiBTUkN1cnNvcikge1xuICAgICAgICBpZiAoIW90aGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE5vZGUoKS5pc1NhbWVOb2RlKG90aGVyLmdldE5vZGUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIGEgbm9uLWVtcHR5IGFjY2Vzc2libGUgbmFtZVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaGFzIGEgbm9uLWVtcHR5IGFjY2Vzc2libGUgbmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNOb25FbXB0eU5hbWUoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5nZXROYW1lSW5mbygpPy5uYW1lIHx8IFwiXCIpLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIH1cblxufSIsImltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uTW9kZSB9IGZyb20gXCIuL1NSVHlwZXNcIjtcbmltcG9ydCB7IFNSQ3Vyc29yLCBTUkN1cnNvck1hdGNoRnVuYywgU1JDdXJzb3JTa2lwRnVuYyB9IGZyb20gXCIuL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcblxuZXhwb3J0IG5hbWVzcGFjZSBTUk5hdmlnYXRvciB7XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIGlmIGEgbm9kZSBpcyBhIGJsb2NrLWxldmVsIGVsZW1lbnQgYmFzZWQgb24gaXRzIGRpc3BsYXkgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0gbm9kZSBUaGUgRE9NIG5vZGUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIGlzIGEgYmxvY2stbGV2ZWwgZWxlbWVudCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNCbG9ja0VsZW1lbnQobm9kZTogTm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoW1wiYnJcIiwgXCJpZnJhbWVcIl0uaW5jbHVkZXMobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBteXdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgICAgY29uc3QgZGlzcCA9IG15d2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSk/LmRpc3BsYXk7XG4gICAgICAgIGlmIChkaXNwICYmIGRpc3Auc3RhcnRzV2l0aChcInRhYmxlXCIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGRpc3AgPT09IFwiYmxvY2tcIiAmJiBlbGVtLnN0eWxlLmRpc3BsYXkgIT09IFwiYmxvY2tcIikge1xuICAgICAgICAgICAgLy8gSXMgdGhpcyBibG9jayBiZWNhdXNlIGl0J3MgYSBmbGV4IGVsZW0/XG4gICAgICAgICAgICBpZiAoZWxlbS5wYXJlbnRFbGVtZW50ICYmIG15d2luLmdldENvbXB1dGVkU3R5bGUoZWxlbS5wYXJlbnRFbGVtZW50KS5kaXNwbGF5ID09PSBcImZsZXhcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0sIHRydWUpID09PSBcImxpbmtcIikge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBuZXcgRE9NV2Fsa2VyKG5vZGUsIGZhbHNlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgICAgIHRlbXAucHJldk5vZGUoKTtcbiAgICAgICAgICAgIGlmICghaXNCbG9ja0VsZW1lbnQodGVtcC5ub2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXCJibG9ja1wiLCBcImZsZXhcIiwgXCJncmlkXCIsIFwibGlzdC1pdGVtXCJdLmluY2x1ZGVzKGRpc3ApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3QgYWxsIGxvZ2ljYWwgbGluZXMgZnJvbSBhIDxwcmU+IGVsZW1lbnQgYnkgd2Fsa2luZyBpdHMgZW50aXJlIHN1YnRyZWVcbiAgICAgKiAodmlhIERPTVdhbGtlciwgc2hhZG93LURPTSBzYWZlKSBhbmQgY29uY2F0ZW5hdGluZyB0ZXh0IG5vZGUgY29udGVudCwgc3BsaXR0aW5nXG4gICAgICogb24gbmV3bGluZXMuICBPbmx5IGlubGluZS1jb250ZXh0IG5vZGVzIGFyZSBpbmNsdWRlZCDigJQgYW55IGRlc2NlbmRhbnQgYmxvY2tcbiAgICAgKiBlbGVtZW50IHdvdWxkIGJlIHVudXN1YWwgaW5zaWRlIDxwcmU+IGFuZCBpcyBpZ25vcmVkLlxuICAgICAqXG4gICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCwgbm9uLWVtcHR5IGxpbmVzLlxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmVMaW5lcyhwcmVFbGVtOiBIVE1MRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgLy8gQ29uY2F0ZW5hdGUgYWxsIHRleHQgaW5zaWRlIHRoZSA8cHJlPiwgcHJlc2VydmluZyBpbmxpbmUgc3RydWN0dXJlXG4gICAgICAgIGxldCBmdWxsVGV4dCA9IHByZUVsZW0udGV4dENvbnRlbnQgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgcmF3TGluZXMgPSBmdWxsVGV4dC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgLy8gVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBibGFuayBsaW5lc1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICB3aGlsZSAoc3RhcnQgPCByYXdMaW5lcy5sZW5ndGggJiYgcmF3TGluZXNbc3RhcnRdLnRyaW0oKSA9PT0gXCJcIikgc3RhcnQrKztcbiAgICAgICAgbGV0IGVuZCA9IHJhd0xpbmVzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChlbmQgPj0gc3RhcnQgJiYgcmF3TGluZXNbZW5kXS50cmltKCkgPT09IFwiXCIpIGVuZC0tO1xuICAgICAgICByZXR1cm4gcmF3TGluZXMuc2xpY2Uoc3RhcnQsIGVuZCArIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGEgPHByZT4gZWxlbWVudCAodGhlIGl0ZW0tbGV2ZWwgY3Vyc29yIHBvc2l0aW9uIGZvclxuICAgICAqIHByZWZvcm1hdHRlZCBsaW5lcyB1c2VzIHRoZSA8cHJlPiBlbGVtZW50IGl0c2VsZiB3aXRoIHByZUxpbmVJbmRleCBzZXQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUHJlRWxlbWVudChub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAxICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlBSRVwiO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEV4cGxpY2l0VGFiaW5kZXgobm9kZTogTm9kZSk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB0YWJpbmRleFZhbHVlID0gcGFyc2VJbnQoZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSwgMTApO1xuICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHRhYmluZGV4VmFsdWUpID8gbnVsbCA6IHRhYmluZGV4VmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNQb3NpdGl2ZVRhYkZvY3VzKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGV4cGxpY2l0VGFiaW5kZXggPSBnZXRFeHBsaWNpdFRhYmluZGV4KGVsZW0pO1xuICAgICAgICByZXR1cm4gZXhwbGljaXRUYWJpbmRleCAhPT0gbnVsbCAmJiBleHBsaWNpdFRhYmluZGV4ID4gMCAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlbSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEZWZhdWx0T3JaZXJvVGFiRm9jdXMobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgZXhwbGljaXRUYWJpbmRleCA9IGdldEV4cGxpY2l0VGFiaW5kZXgoZWxlbSk7XG4gICAgICAgIHJldHVybiAoZXhwbGljaXRUYWJpbmRleCA9PT0gbnVsbCB8fCBleHBsaWNpdFRhYmluZGV4ID09PSAwKSAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlbSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VGFiRm9jdXNTdGFydEZ1bmMoaW5jbHVkZVBvc2l0aXZlVGFiaW5kZXg6IGJvb2xlYW4gPSB0cnVlKTogU1JDdXJzb3JNYXRjaEZ1bmMge1xuICAgICAgICByZXR1cm4gKF9yb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCEobm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSAxICYmIGJTdGFydFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobm9kZSkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gaW5jbHVkZVBvc2l0aXZlVGFiaW5kZXggfHwgaXNEZWZhdWx0T3JaZXJvVGFiRm9jdXMobm9kZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sbGVjdCBhbGwgdGFiYmFibGUgZWxlbWVudHMgaW4gdGFiIG9yZGVyIChwb3NpdGl2ZSB0YWJpbmRleCBmaXJzdCwgdGhlbiBkb2N1bWVudCBvcmRlcilcbiAgICAgKiBAcGFyYW0gbWF0Y2hGdW5jIEZ1bmN0aW9uIHRvIG1hdGNoIHRhYmJhYmxlIGVsZW1lbnRzXG4gICAgICogQHBhcmFtIHJvb3ROb2RlIE9wdGlvbmFsIHJvb3Qgbm9kZSB0byBzdGFydCBjb2xsZWN0aW9uIGZyb20gKGRlZmF1bHRzIHRvIGRvY3VtZW50IGJvZHkpXG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY3Vyc29ycyBwb2ludGluZyB0byB0YWJiYWJsZSBlbGVtZW50cyBpbiB0YWIgb3JkZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb2xsZWN0VGFiRm9jdXNDdXJzb3JzKG1hdGNoRnVuYzogU1JDdXJzb3JNYXRjaEZ1bmMsIHJvb3ROb2RlPzogTm9kZSk6IFNSQ3Vyc29yW10ge1xuICAgICAgICBjb25zdCByb290ID0gKHJvb3ROb2RlPy5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50KS5ib2R5IHx8IHJvb3ROb2RlO1xuICAgICAgICBpZiAoIXJvb3QpIHJldHVybiBbXTtcbiAgICAgICAgbGV0IHdhbGtlciA9IG5ldyBTUkN1cnNvcihyb290LCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IHNraXBGdW5jID0gZ2V0U2tpcEZ1bmMoXCJ0YWJfZm9jdXNcIik7XG4gICAgICAgIGxldCBwb3NpdGl2ZVJlc3VsdHM6IFNSQ3Vyc29yW10gPSBbXTtcbiAgICAgICAgbGV0IG5vcm1hbFJlc3VsdHM6IFNSQ3Vyc29yW10gPSBbXTtcblxuICAgICAgICBjb25zdCBhZGRDdXJzb3IgPSAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgaWYgKCFtYXRjaEZ1bmMoY3Vyc29yLmdldFJvbGUoKSwgIWN1cnNvci5pc0VuZFRhZygpLCBjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGlzUG9zaXRpdmVUYWJGb2N1cyhjdXJzb3IuZ2V0Tm9kZSgpKSkge1xuICAgICAgICAgICAgICAgIHBvc2l0aXZlUmVzdWx0cy5wdXNoKGN1cnNvci5jbG9uZSgpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNEZWZhdWx0T3JaZXJvVGFiRm9jdXMoY3Vyc29yLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgICAgICBub3JtYWxSZXN1bHRzLnB1c2goY3Vyc29yLmNsb25lKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGFkZEN1cnNvcih3YWxrZXIpO1xuICAgICAgICB3aGlsZSAod2Fsa2VyLm5leHQoKCkgPT4gdHJ1ZSwgc2tpcEZ1bmMpKSB7XG4gICAgICAgICAgICBhZGRDdXJzb3Iod2Fsa2VyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvc2l0aXZlUmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhRWxlbSA9IGEuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgYkVsZW0gPSBiLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGFUYWJpbmRleCA9IGdldEV4cGxpY2l0VGFiaW5kZXgoYUVsZW0pIHx8IDA7XG4gICAgICAgICAgICBjb25zdCBiVGFiaW5kZXggPSBnZXRFeHBsaWNpdFRhYmluZGV4KGJFbGVtKSB8fCAwO1xuICAgICAgICAgICAgaWYgKGFUYWJpbmRleCAhPT0gYlRhYmluZGV4KSByZXR1cm4gYlRhYmluZGV4IC0gYVRhYmluZGV4O1xuICAgICAgICAgICAgcmV0dXJuIFNSQ3Vyc29yLmNvbXBhcmUoYSwgYik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwb3NpdGl2ZVJlc3VsdHMuY29uY2F0KG5vcm1hbFJlc3VsdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIGluZGV4IG9mIGEgY3Vyc29yIGluIGFuIGFycmF5IG9mIHRhYiBmb2N1cyBjdXJzb3JzXG4gICAgICogQHBhcmFtIGN1cnNvcnMgQXJyYXkgb2YgY3Vyc29ycyB0byBzZWFyY2hcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIFRoZSBjdXJzb3IgdG8gZmluZFxuICAgICAqIEByZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgY3Vyc29yLCBvciAtMSBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kVGFiRm9jdXNJbmRleChjdXJzb3JzOiBTUkN1cnNvcltdLCB3YWxrZXI6IFNSQ3Vyc29yKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGN1cnNvcnMuZmluZEluZGV4KGN1cnNvciA9PiBTUkN1cnNvci5jb21wYXJlKGN1cnNvciwgd2Fsa2VyKSA9PT0gMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtYXRjaCBmdW5jdGlvbiBmb3IgaWRlbnRpZnlpbmcgc3RhcnQgcG9zaXRpb25zIGluIGEgZ2l2ZW4gbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSAoZS5nLiwgXCJsaW5rXCIsIFwiaGVhZGluZ1wiLCBcImJ1dHRvblwiLCBldGMuKVxuICAgICAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBtYXRjaGVzIGVsZW1lbnRzIGFwcHJvcHJpYXRlIGZvciB0aGUgbmF2aWdhdGlvbiBtb2RlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXJ0RnVuYyhtb2RlOiBOYXZpZ2F0aW9uTW9kZSkgOiBTUkN1cnNvck1hdGNoRnVuYyB7XG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgICAgY2FzZSBcImxpbmtcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwibGlua1wiKTtcbiAgICAgICAgICAgIGNhc2UgXCJ0YWJfZm9jdXNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VGFiRm9jdXNTdGFydEZ1bmMoZmFsc2UpO1xuICAgICAgICAgICAgY2FzZSBcImhlYWRpbmdcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoMVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmFyaWFMZXZlbCA9PT0gXCIxXCIpO1xuICAgICAgICAgICAgY2FzZSBcImgyXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImhlYWRpbmdcIiAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuYXJpYUxldmVsID09PSBcIjJcIik7XG4gICAgICAgICAgICBjYXNlIFwiaDNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5hcmlhTGV2ZWwgPT09IFwiM1wiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoNFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmFyaWFMZXZlbCA9PT0gXCI0XCIpO1xuICAgICAgICAgICAgY2FzZSBcImg1XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImhlYWRpbmdcIiAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuYXJpYUxldmVsID09PSBcIjVcIik7XG4gICAgICAgICAgICBjYXNlIFwiaDZcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5hcmlhTGV2ZWwgPT09IFwiNlwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJpbWFnZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgW1wiaW1nXCIsIFwiZ3JhcGhpY3MtZG9jdW1lbnRcIl0uaW5jbHVkZXMocm9sZSkpO1xuICAgICAgICAgICAgY2FzZSBcInJhZGlvXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcInJhZGlvXCIpO1xuICAgICAgICAgICAgY2FzZSBcImJ1dHRvblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJidXR0b25cIik7XG4gICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiY2hlY2tib3hcIik7XG4gICAgICAgICAgICBjYXNlIFwiY29tYm9cIjogICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImNvbWJvYm94XCIpO1xuICAgICAgICAgICAgY2FzZSBcImxpc3RcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwibGlzdFwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0aXRlbVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJsaXN0aXRlbVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJhcnRpY2xlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImFydGljbGVcIik7XG4gICAgICAgICAgICBjYXNlIFwidGFibGVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwidGFibGVcIik7XG4gICAgICAgICAgICBjYXNlIFwicGFyYWdyYXBoXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChfcm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiUFwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJkb21cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gdHJ1ZTtcbiAgICAgICAgICAgIGNhc2UgXCJpdGVtXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChjdXJzb3I6IFNSQ3Vyc29yIHwgYW55LCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiU3RhcnRUYWcpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gPGlmcmFtZT4gY29udGVudCBpcyBpbmxpbmVkIGJ5IHRoZSBJRlJBTUUgU1JfUlVMRSBpbnRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgYmxvY2sncyByZW5kZXJpbmcg4oCUIHRoZSBpZnJhbWUgaXRzZWxmIGlzIG5vdCBhbiBpdGVtIHN0b3AuXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgPHByZT4gZWxlbWVudCB3aXRoIHByZUxpbmVJbmRleCBzZXQgaXMgYSB2aXJ0dWFsIHBlci1saW5lIGl0ZW0uXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbml0aWFsIGVuY291bnRlciAocHJlTGluZUluZGV4IHVuZGVmaW5lZCkgaXMgYWxzbyBhIG1hdGNoIHNvXG4gICAgICAgICAgICAgICAgICAgIC8vIGp1bXBOZXh0IGNhbiBzZXQgcHJlTGluZUluZGV4PTAgb24gaXQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ByZUVsZW1lbnQobm9kZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNCbG9ja0VsZW1lbnQobm9kZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gbmV3IERPTVdhbGtlcihub2RlLCAhYlN0YXJ0VGFnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAucHJldk5vZGUoKSAmJiB0ZW1wLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0Jsb2NrRWxlbWVudCh0ZW1wLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicmVnaW9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJTdGFydFRhZykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoW1wibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJmb3JtXCIsIFwiYmFubmVyXCIsIFwic2VhcmNoXCIsIFwiY29udGVudGluZm9cIl0uaW5jbHVkZXMocm9sZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSAhPT0gXCJyZWdpb25cIiB8fCBub2RlPy5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUobm9kZSBhcyBIVE1MRWxlbWVudCk/Lm5hbWU/LnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FzZSBcImZvcm1jb250cm9sXCI6XG4gICAgICAgICAgICBjYXNlIFwiZWRpdGJveFwiOlxuICAgICAgICAgICAgY2FzZSBcImdyYXBoaWNcIjpcbiAgICAgICAgICAgIGNhc2UgXCJmcmFtZVwiOlxuICAgICAgICAgICAgY2FzZSBcImRpdmlzaW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwidGFiY29udHJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcInNlcGFyYXRvclwiOlxuICAgICAgICAgICAgY2FzZSBcImNsaWNrYWJsZVwiOlxuICAgICAgICAgICAgY2FzZSBcIm1vdXNlb3ZlclwiOlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVF9JTVBMRU1FTlRFRFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGlzIHdpdGhpbiBhIFNoYWRvdyBET01cbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgaW4gYSBTaGFkb3cgRE9NLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBjb25zdCBpc0luU2hhZG93RE9NID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIHJldHVybiByb290IGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgc2tpcCBiZWhhdmlvciBmb3IgaXRlbSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBIYW5kbGVzIGNvbXBsZXggdmlzaWJpbGl0eSBydWxlcyBpbmNsdWRpbmcgaGlkZGVuIGNvbnRlbnQgaW4gaGVhZGluZ3MvbGlua3NcbiAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBPYmplY3QgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHNraXAgY3VycmVudCBub2RlIGFuZC9vciBpdHMgY2hpbGRyZW4sIG9yIG51bGwgZm9yIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgKi9cbiAgICBjb25zdCBTS0lQX0lURU1fQkVIQVZJT1IgPSAoY3Vyc29yOiBTUkN1cnNvcikgOiB7IHNraXBDdXJyZW50OiBib29sZWFuLCBza2lwQ2hpbGRyZW46IGJvb2xlYW59IHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUuZ3JvdXAoXCJTS0lQX0lURU1fQkVIQVZJT1JcIik7XG4gICAgICAgIGxldCByZXRWYWw6IHsgc2tpcEN1cnJlbnQ6IGJvb2xlYW4sIHNraXBDaGlsZHJlbjogYm9vbGVhbn0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVUeXBlID0gY3Vyc29yLmdldE5vZGUoKS5ub2RlVHlwZTtcbiAgICAgICAgICAgIGxldCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclN0YXJ0ID0gY3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICBjdXJzb3JTdGFydC5zZXRFbmRUYWcoZmFsc2UpO1xuXG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhub2RlVHlwZSk7XG4gICAgICAgICAgICAvLyBTa2lwIENEQVRBIGFuZCBjb21tZW50cyBjb21wbGV0ZWx5XG4gICAgICAgICAgICBpZiAoWzQsIDhdLmluY2x1ZGVzKG5vZGVUeXBlKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgLy8gT25seSBwcm9jZXNzIGVsZW1lbnRzIGFuZCB0ZXh0XG4gICAgICAgICAgICBpZiAoIVsxLDNdLmluY2x1ZGVzKG5vZGVUeXBlKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcblxuICAgICAgICAgICAgLy8gRm9yIHRleHQgZWxlbWVudHMsIENvbnNpZGVyIHdpdGggcmVsYXRpb24gdG8gdGhlaXIgcGFyZW50IGVsZW1lbnRcbiAgICAgICAgICAgIGlmIChub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIGVsZW0gPSBjdXJzb3IuZ2V0Tm9kZSgpLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gcmV0VmFsID0gVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkgPyB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH0gOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgKCFlbGVtKSBjb25zb2xlLmxvZyhjdXJzb3IuZ2V0Tm9kZSgpKTtcblxuICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbiBlbGVtZW50XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSB3aXRoaW4gdGhlIGJvZHkgZWxlbWVudCAob3Igc2hhZG93IERPTSwgb3IgYW4gaWZyYW1lIHN1YmRvY3VtZW50KVxuICAgICAgICAgICAgaWYgKCFlbGVtLmNsb3Nlc3QoXCJib2R5XCIpICYmICFpc0luU2hhZG93RE9NKGVsZW0pKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UncmUgbm90IGluIGEgc2NyaXB0IG9yIHN0eWxlXG4gICAgICAgICAgICBpZiAoZWxlbS5jbG9zZXN0KFwic2NyaXB0LHN0eWxlXCIpKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG5cbiAgICAgICAgICAgIC8vIEZvciB0ZXh0IG5vZGVzLCB3ZSBuZWVkIHRvIGNoZWNrIHZpc2liaWxpdHkgaW4gY29udGV4dCBvZiBwYXJlbnQgaGVhZGluZy9saW5rXG4gICAgICAgICAgICAvLyBTbyB3ZSdsbCBoYW5kbGUgdGV4dCBub2RlIHZpc2liaWxpdHkgY2hlY2tzIGJlbG93IHdpdGggdGhlIGVsZW1lbnQgdmlzaWJpbGl0eSBjaGVja3NcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2tpcCB0aGluZ3MgaGlkZGVuIGZyb20gdGhlIEFULCBVTkxFU1Mgd2UncmUgaW5zaWRlIGEgaGVhZGluZyBvciBsaW5rXG4gICAgICAgICAgICAvLyAoaGVhZGluZ3MgYW5kIGxpbmtzIHNob3VsZCBpbmNsdWRlIHRoZWlyIGZ1bGwgYWNjZXNzaWJsZSBuYW1lLCBpbmNsdWRpbmcgaGlkZGVuIHBhcnRzKVxuICAgICAgICAgICAgLy8gQlVUIG9ubHkgaWYgdGhlIGhlYWRpbmcvbGluayB1c2VzIG5hbWVGcm9tPVwiY29udGVudFwiIChub3QgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnkpXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRIZWFkaW5nT3JMaW5rID0gY3Vyc29yU3RhcnQuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiaGVhZGluZ1wiLCBcImxpbmtcIl0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IGlmIGN1cnJlbnQgZWxlbWVudCBpdHNlbGYgaXMgYSBoZWFkaW5nIG9yIGxpbmsgQU5EIHdlJ3JlIE5PVCBpbnNpZGUgYW5vdGhlciBoZWFkaW5nL2xpbmssXG4gICAgICAgICAgICAvLyBhcHBseSBub3JtYWwgc2tpcCBydWxlc1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSk7XG4gICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRIZWFkaW5nT3JMaW5rID0gY3VycmVudFJvbGUgPT09IFwiaGVhZGluZ1wiIHx8IGN1cnJlbnRSb2xlID09PSBcImxpbmtcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFwYXJlbnRIZWFkaW5nT3JMaW5rKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90IGluc2lkZSBhbnkgaGVhZGluZy9saW5rIC0gYXBwbHkgbm9ybWFsIHNraXAgcnVsZXNcbiAgICAgICAgICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkpIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IG5vZGVUeXBlID09PSAxIH07XG4gICAgICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbSkpIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IG5vZGVUeXBlID09PSAxIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJlbnQgaGVhZGluZy9saW5rIHVzZXMgYXJpYS1sYWJlbCBvciBhcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRFbGVtID0gcGFyZW50SGVhZGluZ09yTGluay5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZUluZm8gPSBwYXJlbnRIZWFkaW5nT3JMaW5rLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gSWYgbmFtZUZyb20gaXMgTk9UIFwiY29udGVudFwiIG9yIFwidGV4dFwiLCBza2lwIGFsbCBjb250ZW50IChpdCdzIHVzaW5nIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5KVxuICAgICAgICAgICAgICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBhcmVudCB1c2VzIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5IC0gc2tpcCBhbGwgY29udGVudCBpbmNsdWRpbmcgbmVzdGVkIGhlYWRpbmdzL2xpbmtzXG4gICAgICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDdXJyZW50SGVhZGluZ09yTGluaykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGVsZW1lbnQgaXMgYSBoZWFkaW5nL2xpbmsgaW5zaWRlIGFub3RoZXIgaGVhZGluZy9saW5rIHdpdGggY29udGVudC1iYXNlZCBuYW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgaXQgLSBsZXQgaXQgdGhyb3VnaCBzbyBpdHMgY29udGVudCBjYW4gYmUgcmVhZFxuICAgICAgICAgICAgICAgICAgICAvLyAoVGhlIGxvZ2ljIGF0IGxpbmUgMTgzIHdpbGwgaGFuZGxlIHdoZXRoZXIgdG8gc2tpcCBpdHMgY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZUZyb20gaXMgXCJjb250ZW50XCIsIHNvIGluY2x1ZGUgaGlkZGVuIGNvbnRlbnQgYnV0IHNraXAgaGlkZGVuIGltYWdlcy9ncmFwaGljc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJvbGUgPT09IFwiaW1nXCIgfHwgcm9sZSA9PT0gXCJncmFwaGljcy1kb2N1bWVudFwiKSAmJiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgb3RoZXIgaGlkZGVuIGNvbnRlbnQgLSBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGFjY2Vzc2libGUgbmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiQk9EWVwiKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcblxuICAgICAgICAgICAgLy8gU2tpcCBsYWJlbHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGNvbnRyb2xzIC0gdGhleSdsbCBiZSByZWFkIHdpdGggdGhlIHJlbGF0ZWQgaW5wdXQuXG4gICAgICAgICAgICAvLyBLZWVwIGNoaWxkcmVuIHNvIGludGVyYWN0aXZlIGNvbnRlbnQgKGUuZy4gbGlua3MpIGluc2lkZSB0aGUgbGFiZWwgc3RpbGwgYXBwZWFycyBpblxuICAgICAgICAgICAgLy8gcmVhZGluZy90YWIgb3JkZXIuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkxBQkVMXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVsZW0uaGFzQXR0cmlidXRlKFwiZm9yXCIpXG4gICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpKVxuICAgICAgICAgICAgICAgICAgICAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtLmdldEF0dHJpYnV0ZShcImZvclwiKSkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbnRyb2wgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBbcm9sZT0nY2hlY2tib3gnXSwgW3JvbGU9J2NvbWJvYm94J10sIFtyb2xlPSdsaXN0Ym94J10sIFtyb2xlPSdtZW51aXRlbWNoZWNrYm94J10sIFtyb2xlPSdtZW51aXRlbXJhZGlvJ10sIFtyb2xlPSdyYWRpbyddLCBbcm9sZT0nc2VhcmNoYm94J10sIFtyb2xlPSdzbGlkZXInXSwgW3JvbGU9J3NwaW5idXR0b24nXSwgW3JvbGU9J3N3aXRjaCddLCBbcm9sZT0ndGV4dGJveCddXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGVkQ29udHJvbCAmJiAobmVzdGVkQ29udHJvbCBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBBIDxsYWJlbD4gd2l0aCBubyBgZm9yYCBhbmQgbm8gbmVzdGVkIGNvbnRyb2wsIHVzZWQgcHVyZWx5IGFzIGFuIGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgYnkgYW5vdGhlciBlbGVtZW50LCBzaG91bGQgYmUgc3VwcHJlc3NlZCDigJQgaXQgd2lsbCBiZSByZWFkIGFzIHBhcnQgb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpZGdldCdzIGFjY2Vzc2libGUgbmFtZSBhbm5vdW5jZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFthcmlhLWxhYmVsbGVkYnl+PVwiJHtpZH1cIl1gKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2tpcCBub24taW50ZXJhY3RpdmUgY29udGVudCB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiBhIGZvci1saW5rZWQgbGFiZWwuXG4gICAgICAgICAgICAvLyBTdWNoIGNvbnRlbnQgaXMgYWxyZWFkeSBzdXJmYWNlZCBhcyBwYXJ0IG9mIHRoZSBhc3NvY2lhdGVkIGNvbnRyb2wncyBhbm5vdW5jZW1lbnQuXG4gICAgICAgICAgICAvLyBJbnRlcmFjdGl2ZSBkZXNjZW5kYW50cyAobGlua3MsIGJ1dHRvbnMsIGV0Yy4pIGFyZSBhbGxvd2VkIHRocm91Z2guXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWxGb3IgPSBlbGVtLmNsb3Nlc3QoXCJsYWJlbFtmb3JdXCIpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbEZvclRhcmdldCA9IGxhYmVsRm9yICYmIGxhYmVsRm9yLmdldEF0dHJpYnV0ZShcImZvclwiKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsRm9yXG4gICAgICAgICAgICAgICAgICAgICYmIGxhYmVsRm9yVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsYWJlbEZvclRhcmdldCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAmJiAhZWxlbS5jbG9zZXN0KFwiYVtocmVmXSwgW3JvbGU9J2xpbmsnXSwgYnV0dG9uLCBbcm9sZT0nYnV0dG9uJ11cIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogbm9kZVR5cGUgPT09IDEgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBjdXJzb3JTdGFydC5nZXRSb2xlKCk7XG5cbiAgICAgICAgICAgIC8vIEEgZGl2L3NwYW4gY29tYm9ib3ggKHJvbGU9XCJjb21ib2JveFwiIG9uIGEgbm9uLWlucHV0LCBub24tc2VsZWN0IGVsZW1lbnQpIGFubm91bmNlc1xuICAgICAgICAgICAgLy8gaXRzIHZhbHVlIGRpcmVjdGx5IGZyb20gdGV4dCBjb250ZW50IG9yIHRoZSBjb250cm9sbGVkIGxpc3Rib3gsIHNvIHNraXAgaXRzIGNoaWxkcmVuXG4gICAgICAgICAgICAvLyB0byBhdm9pZCBkb3VibGUtYW5ub3VuY2luZyB0aGUgaW5uZXIgdGV4dC5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcImNvbWJvYm94XCJcbiAgICAgICAgICAgICAgICAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09IFwiU0VMRUNUXCJcbiAgICAgICAgICAgICAgICAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09IFwiSU5QVVRcIlxuICAgICAgICAgICAgICAgICYmICFjdXJzb3IuaXNFbmRUYWcoKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiwgcmVhZCB0aGUgZWxlbWVudCwgc2tpcCB0aGUgY2hpbGRyZW5cbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNraXAgY2hpbGRyZW4gb2YgaGVhZGluZ3MvbGlua3MgdGhhdCBkb24ndCB1c2UgY29udGVudC1iYXNlZCBuYW1lc1xuICAgICAgICAgICAgLy8gVU5MRVNTIHdlJ3JlIGluc2lkZSBhbm90aGVyIGhlYWRpbmcvbGluayB0aGF0IERPRVMgdXNlIGNvbnRlbnQtYmFzZWQgbmFtZXNcbiAgICAgICAgICAgIGlmIChbXCJsaW5rXCIsIFwiaGVhZGluZ1wiXS5pbmNsdWRlcyhyb2xlKSAmJiAoIWN1cnNvclN0YXJ0LmdldE5hbWUoKSB8fCAoIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKGN1cnNvclN0YXJ0LmdldE5hbWVJbmZvKCkubmFtZUZyb20pKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbnNpZGUgYSBwYXJlbnQgaGVhZGluZy9saW5rIHdpdGggY29udGVudC1iYXNlZCBuYW1lXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEhlYWRpbmdPckxpbmsgJiYgcGFyZW50SGVhZGluZ09yTGluay5nZXROYW1lSW5mbygpICYmIFtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKHBhcmVudEhlYWRpbmdPckxpbmsuZ2V0TmFtZUluZm8oKS5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc2tpcCBjaGlsZHJlbiAtIHdlJ3JlIG5lc3RlZCBpbnNpZGUgYSBjb250ZW50LWJhc2VkIGhlYWRpbmcvbGlua1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkxFR0VORFwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGN1cnNvci5nZXROb2RlKCkpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnRklFTERTRVQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZWdlbmQgaXMgd2l0aGluIGEgZmllbGRzZXQsIHN1cHByZXNzIG91dHB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtICYmIGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJNU1VQXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA8c3VtbWFyeT4gaXMgYSBzZWxmLWFubm91bmNpbmcgZGlzY2xvc3VyZSBidXR0b24g4oCUIGl0cyBjaGlsZHJlblxuICAgICAgICAgICAgLy8gYXJlIGZvbGRlZCBpbnRvIHRoZSBbXCJsYWJlbFwiLCBidXR0b24sIGNvbGxhcHNlZF0gYW5ub3VuY2VtZW50LFxuICAgICAgICAgICAgLy8gc28gc2tpcCB0cmF2ZXJzYWwgaW50byB0aGVtLlxuICAgICAgICAgICAgaWYgKCFjdXJzb3IuaXNFbmRUYWcoKSAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU1VNTUFSWVwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGV0YWlsc1BhcmVudCA9IGVsZW0ucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1BhcmVudCAmJiBkZXRhaWxzUGFyZW50Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiREVUQUlMU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTa2lwIG5vbi1zdW1tYXJ5IGNoaWxkcmVuIG9mIGEgY2xvc2VkIDxkZXRhaWxzPiBlbGVtZW50LlxuICAgICAgICAgICAgLy8gQnJvd3NlcnMgaGlkZSB0aG9zZSBjaGlsZHJlbiB2aWEgVUEgc3R5bGVzaGVldCAoZGlzcGxheTpub25lKSwgc29cbiAgICAgICAgICAgIC8vIHRoZXkgbXVzdCBub3QgYXBwZWFyIGFzIHJlYWRpbmcgc3RvcHMgd2hlbiB0aGUgd2lkZ2V0IGlzIGNvbGxhcHNlZC5cbiAgICAgICAgICAgIC8vIEV4ZW1wdCB0aGUgPGRldGFpbHM+IGVsZW1lbnQgaXRzZWxmIGFuZCA8c3VtbWFyeT4gKGFsd2F5cyB2aXNpYmxlKS5cbiAgICAgICAgICAgIGlmICghY3Vyc29yLmlzRW5kVGFnKClcbiAgICAgICAgICAgICAgICAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09IFwiREVUQUlMU1wiXG4gICAgICAgICAgICAgICAgJiYgIWVsZW0uY2xvc2VzdChcInN1bW1hcnlcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHNBbmNlc3RvciA9IGVsZW0uY2xvc2VzdChcImRldGFpbHNcIik7XG4gICAgICAgICAgICAgICAgaWYgKGRldGFpbHNBbmNlc3RvciAmJiAhZGV0YWlsc0FuY2VzdG9yLmhhc0F0dHJpYnV0ZShcIm9wZW5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW0uY2xvc2VzdChcIi5pYm1hLXNyLW92ZXJsYXlcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNraXAgcG9wdXAgZWxlbWVudHMgKGxpc3Rib3gsIHRyZWUsIGdyaWQsIGRpYWxvZykgdGhhdCBhcmUgb3duZWQgYnkgYSBjb21ib2JveFxuICAgICAgICAgICAgLy8gdmlhIGFyaWEtY29udHJvbHMuIEluIGEgcmVhbCBTUiB0aGVzZSBhcmUgb25seSByZWFjaGFibGUgdmlhIGFyaWEtYWN0aXZlZGVzY2VuZGFudCxcbiAgICAgICAgICAgIC8vIG5vdCBieSBET00gdHJhdmVyc2FsLCBzbyB0aGV5IHNob3VsZCBub3QgYXBwZWFyIGFzIHJlYWRpbmcgc3RvcHMuXG4gICAgICAgICAgICBpZiAobm9kZVR5cGUgPT09IDEgJiYgIWN1cnNvci5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFthcmlhLWNvbnRyb2xzfj1cIiR7aWR9XCJdYCkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3duZXIgJiYgQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG93bmVyKSA9PT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSBudWxsO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJTS0lQX0lURU0gcmV0VmFsOlwiLCByZXRWYWwpO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHNraXAgYmVoYXZpb3IgZm9yIG5lc3RlZCBuYXZpZ2F0aW9uIG1vZGVzIChsaW5rLCBoZWFkaW5nLCBpbWFnZSwgZXRjLilcbiAgICAgKiBTaW1wbGVyIHRoYW4gU0tJUF9JVEVNX0JFSEFWSU9SIGFzIGl0IGRvZXNuJ3QgbmVlZCBjb21wbGV4IGhlYWRpbmcvbGluayBjb250ZW50IHJ1bGVzXG4gICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICogQHJldHVybnMgT2JqZWN0IGluZGljYXRpbmcgd2hldGhlciB0byBza2lwIGN1cnJlbnQgbm9kZSBhbmQvb3IgaXRzIGNoaWxkcmVuLCBvciBudWxsIGZvciBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICovXG4gICAgY29uc3QgU0tJUF9ORVNURURfQkVIQVZJT1IgPSAoY3Vyc29yOiBTUkN1cnNvcikgOiB7IHNraXBDdXJyZW50OiBib29sZWFuLCBza2lwQ2hpbGRyZW46IGJvb2xlYW59IHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGVUeXBlID0gY3Vyc29yLmdldE5vZGUoKS5ub2RlVHlwZTtcbiAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgIC8vIE9ubHkgdmlzaXQgZWxlbWVudHMgYW5kIHRleHQgbm9kZXNcbiAgICAgICAgaWYgKG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSAzKSByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICBpZiAobm9kZVR5cGUgPT09IDMpIHJldHVybiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSA/IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfSA6IG51bGw7XG4gICAgICAgIC8vIFdlIGhhdmUgYW4gZWxlbWVudFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkpIHJldHVybiB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgLy8gU2tpcCB0aGUgaW5uZXIgZG9jdW1lbnQgb2YgYW4gPGlmcmFtZT4g4oCUIHNjcmVlbiByZWFkZXJzIHJlbmRlciB0aGVcbiAgICAgICAgLy8gYWNjZXNzaWJsZSBuYW1lIGFzIHRoZSB0YWJfZm9jdXMgbGFiZWw7IHRoZSBzdWJkb2N1bWVudCBib2R5IHNob3VsZFxuICAgICAgICAvLyBub3QgY29udHJpYnV0ZSBhZGRpdGlvbmFsIHJlYWRpbmcgc3RvcHMgZHVyaW5nIHJlbmRlclJhbmdlIHRyYXZlcnNhbC5cbiAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIiAmJiAhY3Vyc29yLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2tpcCBsYWJlbCBmb3JzIC0gdGhleSdsbCBiZSByZWFkIHdpdGggdGhlIHJlbGF0ZWQgaW5wdXQuXG4gICAgICAgIC8vIEtlZXAgY2hpbGRyZW4gc28gaW50ZXJhY3RpdmUgY29udGVudCAoZS5nLiBsaW5rcykgaW5zaWRlIHRoZSBsYWJlbCBzdGlsbCBhcHBlYXJzIGluXG4gICAgICAgIC8vIHJlYWRpbmcvdGFiIG9yZGVyLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiTEFCRUxcIlxuICAgICAgICAgICAgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJmb3JcIilcbiAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpKVxuICAgICAgICAgICAgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbS5nZXRBdHRyaWJ1dGUoXCJmb3JcIikpLmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09IFwiaGlkZGVuXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBub24taW50ZXJhY3RpdmUgY29udGVudCB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiBhIGZvci1saW5rZWQgbGFiZWwuXG4gICAgICAgIC8vIFN1Y2ggY29udGVudCBpcyBhbHJlYWR5IHN1cmZhY2VkIGFzIHBhcnQgb2YgdGhlIGFzc29jaWF0ZWQgY29udHJvbCdzIGFubm91bmNlbWVudC5cbiAgICAgICAgLy8gSW50ZXJhY3RpdmUgZGVzY2VuZGFudHMgKGxpbmtzLCBidXR0b25zLCBldGMuKSBhcmUgYWxsb3dlZCB0aHJvdWdoLlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbEZvciA9IGVsZW0uY2xvc2VzdChcImxhYmVsW2Zvcl1cIikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgY29uc3QgbGFiZWxGb3JUYXJnZXQgPSBsYWJlbEZvciAmJiBsYWJlbEZvci5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbGFiZWxGb3JcbiAgICAgICAgICAgICAgICAmJiBsYWJlbEZvclRhcmdldFxuICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KVxuICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpICE9PSBcImhpZGRlblwiXG4gICAgICAgICAgICAgICAgJiYgIWVsZW0uY2xvc2VzdChcImFbaHJlZl0sIFtyb2xlPSdsaW5rJ10sIGJ1dHRvbiwgW3JvbGU9J2J1dHRvbiddXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBub2RlVHlwZSA9PT0gMSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm9sZSA9IGN1cnNvci5nZXRSb2xlKCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiwgcmVhZCB0aGUgZWxlbWVudCwgc2tpcCB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKEFyaWFVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0gJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIk1TVVBcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmNsb3Nlc3QoXCIuaWJtYS1zci1vdmVybGF5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBza2lwIGZ1bmN0aW9uIGZvciBhIGdpdmVuIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBub2RlcyB0byBza2lwIGR1cmluZyBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFNraXBGdW5jKG1vZGU6IE5hdmlnYXRpb25Nb2RlKSA6IFNSQ3Vyc29yU2tpcEZ1bmMge1xuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJyZWdpb25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJpdGVtXCI6IFxuICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX0lURU1fQkVIQVZJT1I7XG4gICAgICAgICAgICBjYXNlIFwibGlua1wiOiBcbiAgICAgICAgICAgIGNhc2UgXCJ0YWJfZm9jdXNcIjogXG4gICAgICAgICAgICBjYXNlIFwiaGVhZGluZ1wiOlxuICAgICAgICAgICAgY2FzZSBcImgxXCI6XG4gICAgICAgICAgICBjYXNlIFwiaDJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoM1wiOlxuICAgICAgICAgICAgY2FzZSBcImg0XCI6XG4gICAgICAgICAgICBjYXNlIFwiaDVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoNlwiOlxuICAgICAgICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNLSVBfTkVTVEVEX0JFSEFWSU9SO1xuICAgICAgICAgICAgY2FzZSBcInJhZGlvXCI6XG4gICAgICAgICAgICBjYXNlIFwiYnV0dG9uXCI6XG4gICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjb21ib1wiOiAgICAgICBcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0XCI6XG4gICAgICAgICAgICBjYXNlIFwibGlzdGl0ZW1cIjpcbiAgICAgICAgICAgIGNhc2UgXCJhcnRpY2xlXCI6XG4gICAgICAgICAgICBjYXNlIFwidGFibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJwYXJhZ3JhcGhcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkb21cIjpcbiAgICAgICAgICAgIGNhc2UgXCJmb3JtY29udHJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcImVkaXRib3hcIjpcbiAgICAgICAgICAgIGNhc2UgXCJncmFwaGljXCI6XG4gICAgICAgICAgICBjYXNlIFwiZnJhbWVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkaXZpc2lvblwiOlxuICAgICAgICAgICAgY2FzZSBcInRhYmNvbnRyb2xcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzZXBhcmF0b3JcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjbGlja2FibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJtb3VzZW92ZXJcIjpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1RfSU1QTEVNRU5URURcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBcbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9yIHRoZSBwcmV2aW91cyBtYXRjaGluZyBlbGVtZW50IGlmIGN1cnJlbnQgZG9lc24ndCBtYXRjaFxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBIGN1cnNvciBhdCB0aGUgY3VycmVudCBvciBwcmV2aW91cyBtYXRjaGluZyBwb3NpdGlvblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBqdW1wQ3VycmVudChtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgd2Fsa2VyOiBTUkN1cnNvcikgOiBTUkN1cnNvciB7XG4gICAgICAgIGNvbnN0IG1hdGNoRnVuYyA9IG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgPyBnZXRUYWJGb2N1c1N0YXJ0RnVuYyh0cnVlKSA6IGdldFN0YXJ0RnVuYyhtb2RlKTtcbiAgICAgICAgaWYgKG1hdGNoRnVuYyh3YWxrZXIuZ2V0Um9sZSgpLCAhd2Fsa2VyLmlzRW5kVGFnKCksIHdhbGtlci5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ganVtcFByZXZpb3VzKG1vZGUsIHdhbGtlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSnVtcCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgYW5kIHJldHVybiBhbGwgaW50ZXJtZWRpYXRlIGl0ZW0gcG9zaXRpb25zXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSB3YWxrZXIgVGhlIGN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIGN1cnNvcnMgcmVwcmVzZW50aW5nIHBvc2l0aW9ucyBmcm9tIGN1cnJlbnQgdG8gZW5kXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGp1bXBDdXJyZW50RW5kKG1vZGU6IE5hdmlnYXRpb25Nb2RlLCB3YWxrZXI6IFNSQ3Vyc29yKSA6IFNSQ3Vyc29yW10ge1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIpIHtcbiAgICAgICAgICAgIC8vIEZvciBhbnkgPHByZT4gaXRlbSAoYmxvY2stZW50ZXIgc3RvcCBvciBwZXItbGluZSBzdG9wKSwgdGhlIHJlbmRlciByYW5nZVxuICAgICAgICAgICAgLy8gbXVzdCBlbmQgYXQgdGhlIG5leHQgdmlydHVhbCBsaW5lIGN1cnNvciAoc2FtZSA8cHJlPiBub2RlLCBuZXh0IGluZGV4KSBzb1xuICAgICAgICAgICAgLy8gdGhhdCByZW5kZXJSYW5nZSBuZXZlciB3YWxrcyBpbnRvIDxwcmU+J3MgY2hpbGRyZW4uXG4gICAgICAgICAgICBpZiAoaXNQcmVFbGVtZW50KHdhbGtlci5nZXROb2RlKCkpICYmICF3YWxrZXIuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gZ2V0UHJlTGluZXMod2Fsa2VyLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dElkeCA9IHdhbGtlci5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZCA/IDAgOiB3YWxrZXIucHJlTGluZUluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICAvLyBVc2UgbmV4dElkeCBhcyB0aGUgZW5kIHNlbnRpbmVsIOKAlCBldmVuIGlmIGl0IGVxdWFscyBsaW5lcy5sZW5ndGggKHBhc3RcbiAgICAgICAgICAgICAgICAvLyB0aGUgbGFzdCBsaW5lKSwgY29tcGFyZSgpIHdpbGwgc3RpbGwgY29ycmVjdGx5IHN0b3AgcmVuZGVyUmFuZ2UgYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gYW55IGNoaWxkIG5vZGUgYmVjYXVzZSBjaGlsZHJlbiBhcmUgY29udGFpbmVkIHdpdGhpbiA8cHJlPi5cbiAgICAgICAgICAgICAgICBjb25zdCBlbmRDdXJzb3IgPSB3YWxrZXIuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICBlbmRDdXJzb3IucHJlTGluZUluZGV4ID0gbmV4dElkeDtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2VuZEN1cnNvcl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtRW5kID0ganVtcE5leHQobW9kZSwgd2Fsa2VyKTtcbiAgICAgICAgICAgIHJldHVybiBpdGVtRW5kID8gW2l0ZW1FbmRdIDogW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lSW5mbyA9IHdhbGtlci5nZXROYW1lSW5mbygpO1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgaWYgKG5hbWVJbmZvICYmICFbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAvLyBOYW1lIGlzIGp1c3QgZnJvbSB0aGUgaXRlbSBpdHNlbGZcbiAgICAgICAgICAgICAgICByZXRWYWwubmV4dCgoKSA9PiB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTmFtZSBpcyBmcm9tIHRoZSBjb250ZW50XG4gICAgICAgICAgICAgICAgcmV0VmFsLnNldEVuZFRhZyh0cnVlKTtcbiAgICAgICAgICAgICAgICByZXRWYWwubmV4dCgoKSA9PiB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZW5kQ3Vyc29yczogU1JDdXJzb3JbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IGl0ZW1FbmQgPSBqdW1wTmV4dChcIml0ZW1cIiwgd2Fsa2VyKTtcbiAgICAgICAgICAgIHdoaWxlIChpdGVtRW5kICYmIFNSQ3Vyc29yLmNvbXBhcmUoaXRlbUVuZCwgcmV0VmFsKSA8IDApIHtcbiAgICAgICAgICAgICAgICBlbmRDdXJzb3JzLnB1c2goaXRlbUVuZCk7XG4gICAgICAgICAgICAgICAgaXRlbUVuZCA9IGp1bXBOZXh0KFwiaXRlbVwiLCBpdGVtRW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZEN1cnNvcnMucHVzaChyZXRWYWwpO1xuICAgICAgICAgICAgcmV0dXJuIG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgd2Fsa2VyLmdldFJvbGUoKSA9PT0gXCJsaW5rXCIgPyBbZW5kQ3Vyc29yc1tlbmRDdXJzb3JzLmxlbmd0aCAtIDFdXSA6IGVuZEN1cnNvcnM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHRoZSBuZXh0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBIGN1cnNvciBhdCB0aGUgbmV4dCBtYXRjaGluZyBwb3NpdGlvbiwgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGp1bXBOZXh0KG1vZGU6IE5hdmlnYXRpb25Nb2RlLCB3YWxrZXI6IFNSQ3Vyc29yKSA6IFNSQ3Vyc29yIHtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cChcIlNSTmF2aWdhdG9yOjpqdW1wTmV4dFwiLCB3YWxrZXIuaXNFbmRUYWcoKT9cIi9cIjpcIlwiLCB3YWxrZXIuZ2V0Tm9kZSgpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFiRm9jdXNNYXRjaEZ1bmMgPSBnZXRUYWJGb2N1c1N0YXJ0RnVuYyh0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJGb2N1c0N1cnNvcnMgPSBjb2xsZWN0VGFiRm9jdXNDdXJzb3JzKHRhYkZvY3VzTWF0Y2hGdW5jLCB3YWxrZXIuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICAgICBpZiAodGFiRm9jdXNDdXJzb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGFiRm9jdXNDdXJzb3JzLm1hcChjID0+IGMuZ2V0Tm9kZSgpKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciA9IHdhbGtlci5nZXRDdXJyZW50T3JQYXJlbnRUYWJiYWJsZUNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJGb2N1c0N1cnNvciA9IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciAmJiBmaW5kVGFiRm9jdXNJbmRleCh0YWJGb2N1c0N1cnNvcnMsIGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvcikgPj0gMCA/IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciA6IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBmaW5kVGFiRm9jdXNJbmRleCh0YWJGb2N1c0N1cnNvcnMsIGN1cnJlbnRUYWJGb2N1c0N1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCArIDEgPCB0YWJGb2N1c0N1cnNvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYkZvY3VzQ3Vyc29yc1tjdXJyZW50SW5kZXggKyAxXS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYkZvY3VzQ3Vyc29yc1swXS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwiaXRlbVwiICYmIGlzUHJlRWxlbWVudCh3YWxrZXIuZ2V0Tm9kZSgpKSAmJiAhd2Fsa2VyLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGdldFByZUxpbmVzKHdhbGtlci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHdhbGtlci5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGUgYmxvY2stZW50ZXIgc3RvcCDigJQganVtcCB0byB0aGUgZmlyc3QgbGluZSBpdGVtXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV0VmFsID0gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucHJlTGluZUluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRW1wdHkgPHByZT4g4oCUIGZhbGwgdGhyb3VnaCB0byBET00gdHJhdmVyc2FsIHBhc3QgPC9wcmU+XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXQgYSBsaW5lIGl0ZW0g4oCUIGFkdmFuY2UgdG8gdGhlIG5leHQgbGluZSBvciBwYXN0IDwvcHJlPlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGluZUlkeCA9IHdhbGtlci5wcmVMaW5lSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGluZUlkeCArIDEgPCBsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXRWYWwgPSB3YWxrZXIuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5wcmVMaW5lSW5kZXggPSBjdXJyZW50TGluZUlkeCArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbCBsaW5lcyBleGhhdXN0ZWQg4oCUIG1vdmUgcGFzdCA8L3ByZT4gdG8gdGhlIG5leHQgRE9NIGl0ZW0uXG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBsYW5kIG9uIHRoZSBibG9jay1lbnRlciBzdG9wIChwcmVMaW5lSW5kZXg9dW5kZWZpbmVkKSBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVyIGdldHMgYSBjaGFuY2UgdG8gcmVuZGVyIHRoZSBjb250YWluZXItZW50ZXIgYW5ub3VuY2VtZW50IGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNpbmcgdG8gdGhlIGZpcnN0IGxpbmUuXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRWYWwgPSB3YWxrZXIuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnNldEVuZFRhZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hGdW5jID0gZ2V0U3RhcnRGdW5jKG1vZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBza2lwRnVuYyA9IGdldFNraXBGdW5jKG1vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0VmFsLm5leHQobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1ByZUVsZW1lbnQocmV0VmFsLmdldE5vZGUoKSkgJiYgIXJldFZhbC5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnByZUxpbmVJbmRleCA9IHVuZGVmaW5lZDsgLy8gYmxvY2stZW50ZXIgc3RvcFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCByZXRWYWwgPSB3YWxrZXIuY2xvbmUoKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoRnVuYyA9IGdldFN0YXJ0RnVuYyhtb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IHNraXBGdW5jID0gZ2V0U2tpcEZ1bmMobW9kZSk7XG4gICAgICAgICAgICBpZiAocmV0VmFsLm5leHQobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgICAgICAvLyBMYW5kaW5nIG9uIDxwcmU+IHZpYSBET00gdHJhdmVyc2FsIGFsd2F5cyBzdGFydHMgYXQgdGhlIGJsb2NrLWVudGVyIHN0b3BcbiAgICAgICAgICAgICAgICAvLyAocHJlTGluZUluZGV4PXVuZGVmaW5lZCkuICBUaGUgcGVyLWxpbmUgaXRlbXMgYXJlIHJldHVybmVkIG9uIHN1YnNlcXVlbnRcbiAgICAgICAgICAgICAgICAvLyBjYWxscyB2aWEgdGhlIGlzUHJlRWxlbWVudCBlYXJseS1yZXR1cm4gYWJvdmUuXG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwiaXRlbVwiICYmIGlzUHJlRWxlbWVudChyZXRWYWwuZ2V0Tm9kZSgpKSAmJiAhcmV0VmFsLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnByZUxpbmVJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJTUk5hdmlnYXRvcjo6anVtcE5leHQgcmVzdWx0XCIsIHJldFZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gc2NyZWVuIHJlYWRlciBuYXZpZ2F0aW9uIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbW9kZS5cbiAgICAgKlxuICAgICAqIEZvciB0YWJfZm9jdXMgbW9kZSwgdGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBtb3ZlIHRvIHRoZSBwcmV2aW91cyB0YWJiYWJsZSBlbGVtZW50IGJ5OlxuICAgICAqIDEuIEZpcnN0IHRyeWluZyB0byBtb3ZlIGJhY2t3YXJkIHVzaW5nIHRoZSBtb2RlJ3MgbWF0Y2ggYW5kIHNraXAgZnVuY3Rpb25zXG4gICAgICogMi4gSWYgdGhhdCBmYWlscywgY29sbGVjdGluZyBhbGwgdGFiIGZvY3VzIGN1cnNvcnMgYW5kIGZpbmRpbmcgdGhlIHByZXZpb3VzIG9uZSBpbiB0aGUgdGFiIG9yZGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBuYXZpZ2F0aW9uIG1vZGUgKGUuZy4sIFwidGFiX2ZvY3VzXCIpIHRoYXQgZGV0ZXJtaW5lcyBob3cgdG8gbmF2aWdhdGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gVGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBzY3JlZW4gcmVhZGVyIG5hdmlnYXRpb25cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBjdXJzb3IgcG9zaXRpb25lZCBhdCB0aGUgcHJldmlvdXMgZWxlbWVudCwgb3IgbnVsbCBpZiBubyBwcmV2aW91cyBlbGVtZW50IGV4aXN0c1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBqdW1wUHJldmlvdXMobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IpIDogU1JDdXJzb3Ige1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIikge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hGdW5jID0gZ2V0U3RhcnRGdW5jKG1vZGUpO1xuICAgICAgICAgICAgY29uc3Qgc2tpcEZ1bmMgPSBnZXRTa2lwRnVuYyhtb2RlKTtcbiAgICAgICAgICAgIGlmIChyZXRWYWwucHJldmlvdXMobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWJGb2N1c01hdGNoRnVuYyA9IGdldFRhYkZvY3VzU3RhcnRGdW5jKHRydWUpO1xuICAgICAgICAgICAgY29uc3QgdGFiRm9jdXNDdXJzb3JzID0gY29sbGVjdFRhYkZvY3VzQ3Vyc29ycyh0YWJGb2N1c01hdGNoRnVuYywgd2Fsa2VyLmdldE5vZGUoKSk7XG4gICAgICAgICAgICBpZiAodGFiRm9jdXNDdXJzb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VGFiRm9jdXNQYXJlbnRDdXJzb3IgPSB3YWxrZXIuZ2V0Q3VycmVudE9yUGFyZW50VGFiYmFibGVDbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJGb2N1c0N1cnNvciA9IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciAmJiBmaW5kVGFiRm9jdXNJbmRleCh0YWJGb2N1c0N1cnNvcnMsIGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvcikgPj0gMCA/IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciA6IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZpbmRUYWJGb2N1c0luZGV4KHRhYkZvY3VzQ3Vyc29ycywgY3VycmVudFRhYkZvY3VzQ3Vyc29yKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiRm9jdXNDdXJzb3JzW2N1cnJlbnRJbmRleCAtIDFdLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgaXNQcmVFbGVtZW50KHdhbGtlci5nZXROb2RlKCkpICYmICF3YWxrZXIuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgaWYgKHdhbGtlci5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIEF0IHRoZSBibG9jay1lbnRlciBzdG9wIOKAlCBnbyB0byB0aGUgcHJldmlvdXMgRE9NIGl0ZW0gKGJlZm9yZSA8cHJlPilcbiAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gbm9ybWFsIHByZXZpb3VzKCkgdHJhdmVyc2FsIGJlbG93XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdhbGtlci5wcmVMaW5lSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGUgZmlyc3QgbGluZSDigJQgc3RlcCBiYWNrIHRvIHRoZSBibG9jay1lbnRlciBzdG9wXG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIHJldFZhbC5wcmVMaW5lSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU3RlcCBiYWNrIG9uZSBsaW5lXG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIHJldFZhbC5wcmVMaW5lSW5kZXggPSB3YWxrZXIucHJlTGluZUluZGV4IC0gMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICBjb25zdCBtYXRjaEZ1bmMgPSBnZXRTdGFydEZ1bmMobW9kZSk7XG4gICAgICAgIGNvbnN0IHNraXBGdW5jID0gZ2V0U2tpcEZ1bmMobW9kZSk7XG4gICAgICAgIGlmIChyZXRWYWwucHJldmlvdXMobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGp1c3QgbGFuZGVkIG9uIGEgPHByZT4gZWxlbWVudCwgcG9zaXRpb24gYXQgaXRzIGxhc3QgbGluZVxuICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwiaXRlbVwiICYmIGlzUHJlRWxlbWVudChyZXRWYWwuZ2V0Tm9kZSgpKSAmJiAhcmV0VmFsLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGdldFByZUxpbmVzKHJldFZhbC5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJldFZhbC5wcmVMaW5lSW5kZXggPSBsaW5lcy5sZW5ndGggPiAwID8gbGluZXMubGVuZ3RoIC0gMSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIiwiaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgU1JOYXZpZ2F0b3IgfSBmcm9tIFwiLi9TUk5hdmlnYXRvclwiO1xuaW1wb3J0IHsgQ29udGFpbmVyQ2hhbmdlcywgTmF2aWdhdGlvbk1vZGUsIFJlbmRlclJlc3VsdCB9IGZyb20gXCIuL1NSVHlwZXNcIjtcbmltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4vU1JDdXJzb3JcIjtcbmltcG9ydCB7IFNSX1JVTEVTLCBDT05UQUlORVJfRU5URVJfUlVMRVMsIENPTlRBSU5FUl9FWElUX1JVTEVTIH0gZnJvbSBcIi4vcmVuZGVyX3J1bGVzXCI7XG5pbXBvcnQgeyBnZXRMaW5rQW5ub3VuY2VtZW50IH0gZnJvbSBcIi4vcmVuZGVyX3J1bGVzL2NvbW1vblwiO1xuXG4vKipcbiAqIFNSUmVuZGVyZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIHNpbXVsYXRpbmcgaG93IHNjcmVlbiByZWFkZXJzXG4gKiBhbm5vdW5jZSBjb250ZW50IHRvIHVzZXJzLiBJdCBjb250YWlucyBydWxlcyBmb3IgcmVuZGVyaW5nIGRpZmZlcmVudCB0eXBlcyBvZlxuICogZWxlbWVudHMgYW5kIEFSSUEgcm9sZXMgaW4gdmFyaW91cyBuYXZpZ2F0aW9uIG1vZGVzLlxuICpcbiAqIFRoZSByZW5kZXJlciB1c2VzIGEgcnVsZS1iYXNlZCBzeXN0ZW0gdG8gZGV0ZXJtaW5lIHdoYXQgdGV4dCBzaG91bGQgYmUgYW5ub3VuY2VkXG4gKiB3aGVuIG5hdmlnYXRpbmcgdG8sIHdpdGhpbiwgb3IgYXdheSBmcm9tIGVsZW1lbnRzIGJhc2VkIG9uIHRoZWlyIHJvbGVzIGFuZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIFNSUmVuZGVyZXIge1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgYW5ub3VuY2VtZW50IHRleHQgd2hlbiBlbnRlcmluZyBhbiBlbGVtZW50XG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGxvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBydWxlIGJhc2VkIG9uIHRoZSBlbGVtZW50J3Mgcm9sZSBvciB0YWcgbmFtZVxuICAgICAqIGFuZCBhcHBsaWVzIGl0IHRvIGdlbmVyYXRlIHRoZSBhbm5vdW5jZW1lbnQgdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIC0gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIHdhbGtlciAtIEN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBvbGRXYWxrZXIgLSBPcHRpb25hbCBjdXJzb3IgYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uXG4gICAgICogQHJldHVybnMgQW5ub3VuY2VtZW50IHRleHQgZm9yIGVudGVyaW5nIHRoZSBlbGVtZW50LCBvciBudWxsIGlmIG5vIHJ1bGUgYXBwbGllc1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiByZW5kZXJFbnRlcihtb2RlOiBOYXZpZ2F0aW9uTW9kZSB8IFwiZm9jdXNcIiwgd2Fsa2VyOiBTUkN1cnNvciwgb2xkV2Fsa2VyPzogU1JDdXJzb3IpOiBzdHJpbmcgfCBudWxsIHsgICAgICAgIFxuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgQ09OVEFJTkVSX0VOVEVSX1JVTEVTKSB7XG4gICAgICAgICAgICBsZXQgcyA9IHJ1bGUudGVzdChtb2RlLCB3YWxrZXIsIG9sZFdhbGtlcik7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhtb2RlLCB3YWxrZXIsIHJ1bGUsIHMpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzICE9PSBcInVuZGVmaW5lZFwiICYmIHMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIGFubm91bmNlbWVudCB0ZXh0IHdoZW4gbGVhdmluZyBhbiBlbGVtZW50XG4gICAgICpcbiAgICAgKiBTaW1pbGFyIHRvIHJlbmRlckVudGVyLCBidXQgYXBwbGllcyBydWxlcyBmb3IgbGVhdmluZyBlbGVtZW50cyBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgLSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gQ3Vyc29yIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICogQHBhcmFtIG9sZFdhbGtlciAtIE9wdGlvbmFsIGN1cnNvciBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBbm5vdW5jZW1lbnQgdGV4dCBmb3IgbGVhdmluZyB0aGUgZWxlbWVudCwgb3IgbnVsbCBpZiBubyBydWxlIGFwcGxpZXNcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gcmVuZGVyTGVhdmUobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IsIG9sZFdhbGtlcj86IFNSQ3Vyc29yKTogc3RyaW5nIHwgbnVsbCAge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgQ09OVEFJTkVSX0VYSVRfUlVMRVMpIHtcbiAgICAgICAgICAgIGxldCBzID0gcnVsZS50ZXN0KG1vZGUsIHdhbGtlciwgb2xkV2Fsa2VyKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgY3VycmVudCBlbGVtZW50IGFuZCBhbnkgY29udGFpbmVyIGNoYW5nZXNcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY29tYmluZXMgYW5ub3VuY2VtZW50cyBmb3I6XG4gICAgICogLSBDb250YWluZXJzIGJlaW5nIGxlZnRcbiAgICAgKiAtIENvbnRhaW5lcnMgYmVpbmcgZW50ZXJlZFxuICAgICAqIC0gVGhlIGN1cnJlbnQgZWxlbWVudCBpdHNlbGZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIC0gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIHdhbGtlciAtIEN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBjb250YWluZXJDaGFuZ2VzIC0gSW5mb3JtYXRpb24gYWJvdXQgY29udGFpbmVycyBiZWluZyBlbnRlcmVkIG9yIGxlZnRcbiAgICAgKiBAcmV0dXJucyBDb21iaW5lZCBhbm5vdW5jZW1lbnQgdGV4dFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiByZW5kZXJDdXJyZW50KG1vZGU6IE5hdmlnYXRpb25Nb2RlLCB3YWxrZXI6IFNSQ3Vyc29yLCBjb250YWluZXJDaGFuZ2VzOiBDb250YWluZXJDaGFuZ2VzKTogUmVuZGVyUmVzdWx0IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7Ly9tb2RlID09PSBcInRhYl9mb2N1c1wiICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZml4dHVyZVwiKT8uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgPT09IFwidG9tdGVzdFwiO1xuICAgICAgICBsZXQgc3RhcnRPZlJlbmRlciA9IFNSTmF2aWdhdG9yLmp1bXBDdXJyZW50KG1vZGUsIHdhbGtlcik7XG4gICAgICAgIGlmICghc3RhcnRPZlJlbmRlcikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGVuZE9mUmVuZGVycyA9IFNSTmF2aWdhdG9yLmp1bXBDdXJyZW50RW5kKG1vZGUsIHN0YXJ0T2ZSZW5kZXIpO1xuICAgICAgICBpZiAoIWVuZE9mUmVuZGVycyB8fCBlbmRPZlJlbmRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBlbmRPZlJlbmRlcnMgPSBbbnVsbF07XG4gICAgICAgIH1cbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJBQUFBXCIsIHN0YXJ0T2ZSZW5kZXIuaXNTdGFydFRhZygpLCBzdGFydE9mUmVuZGVyLmdldE5vZGUoKSk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiQkJCQlwiLCBlbmRPZlJlbmRlcnMubWFwKHZhbCA9PiB2YWwgJiYgdmFsLmlzU3RhcnRUYWcoKSksIGVuZE9mUmVuZGVycy5tYXAodmFsID0+IHZhbCAmJiB2YWwuZ2V0Tm9kZSgpKSk7XG5cbiAgICAgICAgbGV0IGVuZE9mUmVuZGVyID0gZW5kT2ZSZW5kZXJzW2VuZE9mUmVuZGVycy5sZW5ndGggLSAxXTtcbiAgICAgICAgbGV0IHJlbmRlclN0ciA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGNhbmRpZGF0ZUVuZCBvZiBlbmRPZlJlbmRlcnMpIHtcbiAgICAgICAgICAgIGxldCBjYW5kaWRhdGVSZW5kZXJTdHIgPSBTUlJlbmRlcmVyLnJlbmRlclJhbmdlKG1vZGUsIHN0YXJ0T2ZSZW5kZXIsIGNhbmRpZGF0ZUVuZCk7XG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlUmVuZGVyU3RyLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZW5kT2ZSZW5kZXIgPSBjYW5kaWRhdGVFbmQ7XG4gICAgICAgICAgICAgICAgcmVuZGVyU3RyID0gY2FuZGlkYXRlUmVuZGVyU3RyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZW5kZXJTdHIgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJlbmRlclN0ciA9IFNSUmVuZGVyZXIucmVuZGVyUmFuZ2UobW9kZSwgc3RhcnRPZlJlbmRlciwgZW5kT2ZSZW5kZXIpO1xuICAgICAgICB9XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiQ0NDQ1wiLCByZW5kZXJTdHIpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0T2ZSZW5kZXIsXG4gICAgICAgICAgICBlbmQ6IGVuZE9mUmVuZGVyLFxuICAgICAgICAgICAgbWVzc2FnZTogKGNvbnRhaW5lckNoYW5nZXMubGVhdmluZyB8fCBbXSkuY29uY2F0KGNvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcgfHwgW10pLmNvbmNhdChbcmVuZGVyU3RyXSkuam9pbihcIiBcIikucmVwbGFjZSgvXFxzKy9nLCBcIiBcIilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSByYW5nZSBvZiBlbGVtZW50cyBiZXR3ZWVuIHR3byBjdXJzb3JzXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgRE9NIGZyb20gc3RhcnRPZlJlbmRlciB0byBlbmRPZlJlbmRlcixcbiAgICAgKiBhcHBseWluZyByZW5kZXJpbmcgcnVsZXMgdG8gZWFjaCBlbGVtZW50IGFuZCBjb21iaW5pbmcgdGhlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBzdGFydE9mUmVuZGVyIC0gQ3Vyc29yIGF0IHRoZSBzdGFydCBvZiB0aGUgcmFuZ2VcbiAgICAgKiBAcGFyYW0gZW5kT2ZSZW5kZXIgLSBDdXJzb3IgYXQgdGhlIGVuZCBvZiB0aGUgcmFuZ2VcbiAgICAgKiBAcmV0dXJucyBDb21iaW5lZCBhbm5vdW5jZW1lbnQgdGV4dCBmb3IgdGhlIGVudGlyZSByYW5nZVxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiByZW5kZXJSYW5nZShtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgc3RhcnRPZlJlbmRlcjogU1JDdXJzb3IsIGVuZE9mUmVuZGVyOiBTUkN1cnNvcikgOiBzdHJpbmcge1xuICAgICAgICBsZXQgaXRlcldhbGtlciA9IHN0YXJ0T2ZSZW5kZXIuY2xvbmUoKTtcbiAgICAgICAgbGV0IGVsZW1TdHJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgbGV0IGN1cnJlbnRMaW5rOiBOb2RlID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKGJDb250aW51ZSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IGl0ZXJXYWxrZXIuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGl0ZXJXYWxrZXIuZ2V0Tm9kZSgpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuICAgICAgICAgICAgbGV0IHJlbmRlclN0cnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBsZXQgbGlua1BhcmVudCA9IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobm9kZSwgXCJsaW5rXCIsIHRydWUpO1xuICAgICAgICAgICAgaWYgKGxpbmtQYXJlbnQgJiYgIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKG5ldyBTUkN1cnNvcihsaW5rUGFyZW50KS5nZXROYW1lSW5mbygpPy5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBjb25zaWRlciBsaW5rcyB0aGF0IGFubm91bmNlIHRoZW1zZWx2ZXNcbiAgICAgICAgICAgICAgICBsaW5rUGFyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBTUl9SVUxFUykge1xuICAgICAgICAgICAgICAgIGxldCBzID0gcnVsZS50ZXN0KG1vZGUsIGl0ZXJXYWxrZXIpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzICE9PSBudWxsICYmIHMudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVUeXBlID09PSAxICYmICFpdGVyV2Fsa2VyLmlzRW5kVGFnKCkgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIpID09PSBcIm1lbnVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcyA9IFwiW3N1Yk1lbnVdIFwiK3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGxpbmtzXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBpbiBsaW5rIG1vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGluayAmJiAoIWxpbmtQYXJlbnQgfHwgKGxpbmtQYXJlbnQgJiYgY3VycmVudExpbmsgIT09IGxpbmtQYXJlbnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGFkZGVkIGEgc3RyaW5nIHdpdGhpbiBhIGxpbmsgKGN1cnJlbnRMaW5rKSwgYnV0IG5vdyB3ZSd2ZSBsZWZ0IHRoZSBsaW5rIG9yIG1vdmVkIHRvIGEgbmV3IGxpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gYCR7c30gJHtnZXRMaW5rQW5ub3VuY2VtZW50KG5ldyBTUkN1cnNvcihjdXJyZW50TGluaywgZmFsc2UpKX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmtQYXJlbnQgJiYgKCFjdXJyZW50TGluayB8fCAoY3VycmVudExpbmsgIT09IGxpbmtQYXJlbnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGluIGEgbGluaywgYW5kIHdlIGhhdmVuJ3QgYW5ub3VuY2VkIHRoaXMgbGluaywgb3Igd2UndmUgbW92ZWQgdG8gYSBuZXcgbGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBgJHtnZXRMaW5rQW5ub3VuY2VtZW50KG5ldyBTUkN1cnNvcihsaW5rUGFyZW50LCBmYWxzZSkpfSAke3N9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gXG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocyAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudExpbmsgPSBsaW5rUGFyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVN0cnMucHVzaChzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtU3Rycy5wdXNoKHJlbmRlclN0cnMuZmlsdGVyKHMgPT4gcy50cmltKCkubGVuZ3RoID4gMCkuam9pbihcIiBcIikpXG4gICAgICAgICAgICBiQ29udGludWUgPSBpdGVyV2Fsa2VyLm5leHQoKCkgPT4gdHJ1ZSwgU1JOYXZpZ2F0b3IuZ2V0U2tpcEZ1bmMobW9kZSkpICYmIFNSQ3Vyc29yLmNvbXBhcmUoaXRlcldhbGtlciwgZW5kT2ZSZW5kZXIpIDwgMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiBjdXJyZW50TGluaykge1xuICAgICAgICAgICAgZWxlbVN0cnMucHVzaChgJHtnZXRMaW5rQW5ub3VuY2VtZW50KG5ldyBTUkN1cnNvcihjdXJyZW50TGluaywgZmFsc2UpKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VmFsID0gZWxlbVN0cnMuZmlsdGVyKHMgPT4gcy50cmltKCkubGVuZ3RoID4gMCkuam9pbihcIiBcIik7XG4gICAgICAgIHJldFZhbCA9IHJldFZhbC5yZXBsYWNlKC8sIFxcdTAwMDEoW15cXHUwMDAyXSspXFx1MDAwMi9nLCAobWF0Y2gsIGRlc2NyaWJlZEJ5VGV4dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcXVvdGVkVGV4dCA9IGBcIiR7ZGVzY3JpYmVkQnlUZXh0fVwiYDtcbiAgICAgICAgICAgIGNvbnN0IHVubWFya2VkUmV0VmFsID0gcmV0VmFsLnJlcGxhY2UobWF0Y2gsIFwiXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHVubWFya2VkUmV0VmFsLmluY2x1ZGVzKHF1b3RlZFRleHQpIHx8IHVubWFya2VkUmV0VmFsLmluY2x1ZGVzKGRlc2NyaWJlZEJ5VGV4dCkgPyBcIlwiIDogYCwgJHtxdW90ZWRUZXh0fWA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXRWYWwgPSByZXRWYWwucmVwbGFjZSgvW1xcdTAwMDFcXHUwMDAyXS9nLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbn1cblxuIiwiaW1wb3J0IHsgU1JDdXJzb3IgfSBmcm9tIFwiLi9TUkN1cnNvclwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUgfSBmcm9tIFwiLi9TUlR5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBTUlJlbmRlcmVyUnVsZSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBydWxlRGVmaW5pdGlvbjoge1xuICAgICAgICBtb2RlczogTmF2aWdhdGlvbk1vZGVbXSxcbiAgICAgICAgcm9sZXM6IHN0cmluZ1tdLFxuICAgICAgICBlbGVtczogc3RyaW5nW10sXG4gICAgICAgIHRlc3RzOiBBcnJheTwoY3Vyc29yOiBTUkN1cnNvciwgb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBOYXZpZ2F0aW9uTW9kZSkgPT4gc3RyaW5nIHwgbnVsbD5cbiAgICB9KSB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgdGVzdChtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgY3Vyc29yOiBTUkN1cnNvciwgb2xkQ3Vyc29yPzogU1JDdXJzb3IpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMucnVsZURlZmluaXRpb24ubW9kZXMuaW5jbHVkZXMobW9kZSlcbiAgICAgICAgICAgICYmIChcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bGVEZWZpbml0aW9uLnJvbGVzLmluY2x1ZGVzKGN1cnNvci5nZXRSb2xlKCkpXG4gICAgICAgICAgICAgICAgfHwgdGhpcy5ydWxlRGVmaW5pdGlvbi5lbGVtcy5pbmNsdWRlcyhjdXJzb3IuZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0ZXN0IG9mIHRoaXMucnVsZURlZmluaXRpb24udGVzdHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgcyA9IHRlc3QoY3Vyc29yLCBvbGRDdXJzb3IsIG1vZGUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsImltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4vU1JDdXJzb3JcIjtcblxuLyoqXG4gKiBUYWJsZVV0aWwgbmFtZXNwYWNlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBIVE1MIHRhYmxlcyBpbiB0aGUgYWNjZXNzaWJpbGl0eSBzaW11bGF0b3IuXG4gKiBUaGVzZSBmdW5jdGlvbnMgaGVscCBkZXRlcm1pbmUgY2VsbCBwb3NpdGlvbnMsIHJlbGF0aW9uc2hpcHMsIGFuZCBleHRyYWN0IGhlYWRlciBpbmZvcm1hdGlvblxuICogdG8gc2ltdWxhdGUgaG93IHNjcmVlbiByZWFkZXJzIHdvdWxkIGFubm91bmNlIHRhYmxlIG5hdmlnYXRpb24uXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgU1JUYWJsZVV0aWwge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSB0YWJsZSBjZWxsIHdpdGggaXRzIHBvc2l0aW9uIGFuZCBzcGFubmluZyBpbmZvcm1hdGlvblxuICAgICAqIEBwcm9wZXJ0eSByb3dJbmRleFN0YXJ0IC0gVGhlIHN0YXJ0aW5nIHJvdyBpbmRleCAoMC1iYXNlZClcbiAgICAgKiBAcHJvcGVydHkgY29sSW5kZXhTdGFydCAtIFRoZSBzdGFydGluZyBjb2x1bW4gaW5kZXggKDAtYmFzZWQpXG4gICAgICogQHByb3BlcnR5IHJvd3NwYW4gLSBOdW1iZXIgb2Ygcm93cyB0aGlzIGNlbGwgc3BhbnNcbiAgICAgKiBAcHJvcGVydHkgY29sc3BhbiAtIE51bWJlciBvZiBjb2x1bW5zIHRoaXMgY2VsbCBzcGFuc1xuICAgICAqIEBwcm9wZXJ0eSBjZWxsQ3Vyc29yIC0gU1JDdXJzb3IgcG9pbnRpbmcgdG8gdGhpcyBjZWxsXG4gICAgICovXG4gICAgZXhwb3J0IHR5cGUgQ2VsbE1vZGVsID0geyByb3dJbmRleFN0YXJ0OiBudW1iZXIsIGNvbEluZGV4U3RhcnQ6IG51bWJlciwgcm93c3BhbjogbnVtYmVyLCBjb2xzcGFuOiBudW1iZXIsIGNlbGxDdXJzb3I6IFNSQ3Vyc29yIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgcm93IGluIGEgdGFibGUgYXMgYW4gYXJyYXkgb2YgY2VsbCBtb2RlbHNcbiAgICAgKi9cbiAgICBleHBvcnQgdHlwZSBSb3dNb2RlbCA9IENlbGxNb2RlbFtdO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb21wbGV0ZSB0YWJsZSBhcyBhbiBhcnJheSBvZiByb3dzXG4gICAgICovXG4gICAgZXhwb3J0IHR5cGUgVGFibGVNb2RlbCA9IFJvd01vZGVsW107XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJzb3IgaXMgcG9pbnRpbmcgdG8gYSBjZWxsIGVsZW1lbnQgKFREIG9yIFRIKVxuICAgICAqIG9yIGhhcyBhIGNlbGwtcmVsYXRlZCBBUklBIHJvbGVcbiAgICAgKiBAcGFyYW0gY3Vyc29yIC0gVGhlIFNSQ3Vyc29yIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY3Vyc29yIGlzIG9uIGEgY2VsbCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ3Vyc29yQ2VsbFJvbGUoY3Vyc29yOiBTUkN1cnNvcikge1xuICAgICAgICBpZiAoIWN1cnNvci5nZXRFbGVtZW50KCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKFtcImNlbGxcIiwgXCJyb3doZWFkZXJcIiwgXCJjb2x1bW5oZWFkZXJcIl0uaW5jbHVkZXMoY3Vyc29yLmdldFJvbGUoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhY3Vyc29yLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIFtcIlRIXCIsIFwiVERcIl0uaW5jbHVkZXMoY3Vyc29yLmdldEVsZW1lbnQoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgY3Vyc29yIHBvaW50aW5nIHRvIHRoZSBjdXJyZW50IGNlbGwgb3IgdGhlIHBhcmVudCBjZWxsIGlmIHRoZSBjdXJzb3JcbiAgICAgKiBpcyBpbnNpZGUgYSBjZWxsJ3MgY29udGVudFxuICAgICAqIEBwYXJhbSBjdXJzb3IgLSBUaGUgU1JDdXJzb3IgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBTUkN1cnNvciBwb2ludGluZyB0byB0aGUgY2VsbCBvciBudWxsIGlmIG5vdCBpbiBhIGNlbGxcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudE9yUGFyZW50Q2VsbEN1cnNvcihjdXJzb3I6IFNSQ3Vyc29yKSA6IFNSQ3Vyc29yIHtcbiAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJjZWxsXCIsIFwicm93aGVhZGVyXCIsIFwiY29sdW1uaGVhZGVyXCJdLCBbXCJURFwiLFwiVEhcIl0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY29sc3BhbiBvZiBhIGNlbGwgYXQgYSBnaXZlbiBsb2NhdGlvblxuICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0byBnZXQgdGhlIGNvbHNwYW4gZnJvbVxuICAgICAqIEByZXR1cm5zIFRoZSBjb2xzcGFuIG9mIHRoZSBjZWxsIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbiBvciAwIGlmIG5vdCBpbiBhIGNvbHVtblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDb2xTcGFuKGN1cnNvcjogU1JDdXJzb3IpOiBudW1iZXIge1xuICAgICAgICBpZiAoIWlzQ3Vyc29yQ2VsbFJvbGUoY3Vyc29yKSkgcmV0dXJuIDA7XG4gICAgICAgIGxldCBjb2xTcGFuID0gY3Vyc29yLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpO1xuICAgICAgICBpZiAoY29sU3Bhbikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGNvbFNwYW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcm93c3BhbiBvZiBhIGNlbGwgYXQgYSBnaXZlbiBsb2NhdGlvblxuICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0byBnZXQgdGhlIHJvd3NwYW4gZnJvbVxuICAgICAqIEByZXR1cm5zIFRoZSByb3dzcGFuIG9mIHRoZSBjZWxsIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbiBvciAwIGlmIG5vdCBpbiBhIGNvbHVtblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRSb3dTcGFuKGN1cnNvcjogU1JDdXJzb3IpOiBudW1iZXIge1xuICAgICAgICBpZiAoIWlzQ3Vyc29yQ2VsbFJvbGUoY3Vyc29yKSkgcmV0dXJuIDA7XG4gICAgICAgIGxldCByb3dTcGFuID0gY3Vyc29yLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpO1xuICAgICAgICBpZiAocm93U3Bhbikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHJvd1NwYW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhIGNvbXBsZXRlIG1vZGVsIG9mIGEgdGFibGUncyBzdHJ1Y3R1cmUsIGFjY291bnRpbmcgZm9yIHJvd3NwYW4gYW5kIGNvbHNwYW5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSBlbnRpcmUgdGFibGUgYW5kIGNyZWF0ZXMgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHNcbiAgICAgKiB0aGUgbG9naWNhbCBncmlkIG9mIGNlbGxzLCBwcm9wZXJseSBoYW5kbGluZyBjZWxscyB0aGF0IHNwYW4gbXVsdGlwbGUgcm93cyBvciBjb2x1bW5zLlxuICAgICAqIFRoZSByZXN1bHRpbmcgbW9kZWwgbWFrZXMgaXQgZWFzaWVyIHRvIGRldGVybWluZSBjZWxsIHJlbGF0aW9uc2hpcHMgYW5kIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpblRhYmxlQ3Vyc29yIC0gQSBjdXJzb3Igd2l0aGluIHRoZSB0YWJsZVxuICAgICAqIEByZXR1cm5zIEEgVGFibGVNb2RlbCByZXByZXNlbnRpbmcgdGhlIGNvbXBsZXRlIHRhYmxlIHN0cnVjdHVyZSwgb3IgbnVsbCBpZiBub3QgaW4gYSB0YWJsZVxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZU1vZGVsKGluVGFibGVDdXJzb3I6IFNSQ3Vyc29yKTogVGFibGVNb2RlbCB7XG4gICAgICAgIC8vIEdldCBhIGN1cnNvciBwb2ludGluZyB0byB0aGUgdGFibGUgZWxlbWVudFxuICAgICAgICBsZXQgdGFibGVDdXJzb3IgPSBpblRhYmxlQ3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcInRhYmxlXCJdKTtcbiAgICAgICAgaWYgKCF0YWJsZUN1cnNvcikgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB3YWxrVGFibGVDdXJzb3IgPSB0YWJsZUN1cnNvci5jbG9uZSgpO1xuXG4gICAgICAgIGxldCByZXRWYWw6IFRhYmxlTW9kZWwgPSBbXTsgIC8vIFRoZSBjb21wbGV0ZSB0YWJsZSBtb2RlbCB3ZSdyZSBidWlsZGluZ1xuICAgICAgICBsZXQgY3VyUm93OiBSb3dNb2RlbCA9IFtdOyAgICAvLyBUaGUgY3VycmVudCByb3cgYmVpbmcgcHJvY2Vzc2VkXG4gICAgICAgIGxldCBwcmV2Um93OiBSb3dNb2RlbDsgICAgICAgIC8vIFRoZSBwcmV2aW91cyByb3cgKG5lZWRlZCBmb3Igcm93c3BhbiBoYW5kbGluZylcbiAgICAgICAgXG4gICAgICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgdGFibGUncyBET00gc3RydWN0dXJlXG4gICAgICAgIHdoaWxlICh3YWxrVGFibGVDdXJzb3IubmV4dCgoKSA9PiB0cnVlKSAmJiAhd2Fsa1RhYmxlQ3Vyc29yLmdldE5vZGUoKS5pc1NhbWVOb2RlKHRhYmxlQ3Vyc29yLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgIGlmICh3YWxrVGFibGVDdXJzb3IuaXNFbmRUYWcoKSAmJiB3YWxrVGFibGVDdXJzb3IuZ2V0Um9sZSgpID09PSBcInJvd1wiKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSByb3csIHB1c2ggd2hhdCB3ZSBoYXZlIGFuZCByZXNldFxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGN1clJvdyk7XG4gICAgICAgICAgICAgICAgcHJldlJvdyA9IGN1clJvdztcbiAgICAgICAgICAgICAgICBjdXJSb3cgPSBbXTtcblxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBjZWxscyB3aXRoIHJvd3NwYW4gZnJvbSBwcmV2aW91cyByb3dzIHRoYXQgYWZmZWN0IHRoaXMgcm93XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNlbGxzIHNwYW5uaW5nIG11bHRpcGxlIHJvd3MgYXJlIHByb3Blcmx5IHJlcHJlc2VudGVkIGluIHRoZSBtb2RlbFxuICAgICAgICAgICAgICAgIHdoaWxlIChwcmV2Um93ICYmIGN1clJvdy5sZW5ndGggPCBwcmV2Um93Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICgocHJldlJvd1tjdXJSb3cubGVuZ3RoXS5yb3dJbmRleFN0YXJ0ICsgcHJldlJvd1tjdXJSb3cubGVuZ3RoXS5yb3dzcGFuIC0gMSkgPj0gcmV0VmFsLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyUm93LnB1c2gocHJldlJvd1tjdXJSb3cubGVuZ3RoXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBQcm9jZXNzIGVhY2ggY2VsbCBpbiB0aGUgcm93XG4gICAgICAgICAgICBpZiAoIXdhbGtUYWJsZUN1cnNvci5pc0VuZFRhZygpICYmIGlzQ3Vyc29yQ2VsbFJvbGUod2Fsa1RhYmxlQ3Vyc29yKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHNwYW4gPSBnZXRDb2xTcGFuKHdhbGtUYWJsZUN1cnNvcik7XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY2VsbCBtb2RlbCB3aXRoIHBvc2l0aW9uIGFuZCBzcGFubmluZyBpbmZvcm1hdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxJbmZvOiBDZWxsTW9kZWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4U3RhcnQ6IHJldFZhbC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGNvbEluZGV4U3RhcnQ6IGN1clJvdy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHJvd3NwYW46IGdldFJvd1NwYW4od2Fsa1RhYmxlQ3Vyc29yKSxcbiAgICAgICAgICAgICAgICAgICAgY29sc3BhbixcbiAgICAgICAgICAgICAgICAgICAgY2VsbEN1cnNvcjogd2Fsa1RhYmxlQ3Vyc29yLmNsb25lKClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEZvciBjZWxscyB3aXRoIGNvbHNwYW4sIGFkZCB0aGUgc2FtZSBjZWxsIGluZm8gdG8gbXVsdGlwbGUgY29sdW1uc1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8Y29sc3BhbjsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyUm93LnB1c2goY2VsbEluZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBDb250aW51ZSBoYW5kbGluZyBjZWxscyB3aXRoIHJvd3NwYW4gZnJvbSBwcmV2aW91cyByb3dzXG4gICAgICAgICAgICAgICAgd2hpbGUgKHByZXZSb3cgJiYgY3VyUm93Lmxlbmd0aCA8IHByZXZSb3cubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgICAgKChwcmV2Um93W2N1clJvdy5sZW5ndGhdLnJvd0luZGV4U3RhcnQgKyBwcmV2Um93W2N1clJvdy5sZW5ndGhdLnJvd3NwYW4gLSAxKSA+PSByZXRWYWwubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJSb3cucHVzaChwcmV2Um93W2N1clJvdy5sZW5ndGhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjZWxsIG1vZGVsIGZvciBhIHNwZWNpZmljIGNlbGwgaW4gdGhlIHRhYmxlXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBDZWxsTW9kZWwgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHNwZWNpZmljIGNlbGwsXG4gICAgICogd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgaXRzIHBvc2l0aW9uIGFuZCBzcGFubmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbkNlbGxDdXJzb3IgLSBBIGN1cnNvciBwb2ludGluZyB0byBhIGNlbGwgb3IgaXRzIGNvbnRlbnRzXG4gICAgICogQHBhcmFtIHRhYmxlTW9kZWwgLSBPcHRpb25hbCBwcmUtYnVpbHQgdGFibGUgbW9kZWwgKHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWQpXG4gICAgICogQHJldHVybnMgVGhlIENlbGxNb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBjZWxsLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDZWxsTW9kZWwoaW5DZWxsQ3Vyc29yOiBTUkN1cnNvciwgdGFibGVNb2RlbD86IFRhYmxlTW9kZWwpIDogQ2VsbE1vZGVsIHtcbiAgICAgICAgbGV0IGNlbGxDdXJzb3IgPSBnZXRDdXJyZW50T3JQYXJlbnRDZWxsQ3Vyc29yKGluQ2VsbEN1cnNvcik7XG4gICAgICAgIGlmICghdGFibGVNb2RlbCkge1xuICAgICAgICAgICAgdGFibGVNb2RlbCA9IGdldFRhYmxlTW9kZWwoaW5DZWxsQ3Vyc29yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZWFyY2ggdGhyb3VnaCB0aGUgdGFibGUgbW9kZWwgdG8gZmluZCB0aGUgbWF0Y2hpbmcgY2VsbFxuICAgICAgICBmb3IgKGxldCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgdGFibGVNb2RlbC5sZW5ndGg7ICsrcm93SW5kZXgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCB0YWJsZU1vZGVsW3Jvd0luZGV4XS5sZW5ndGg7ICsrY29sSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFibGVNb2RlbFtyb3dJbmRleF1bY29sSW5kZXhdLmNlbGxDdXJzb3IuaXNTYW1lTm9kZShjZWxsQ3Vyc29yKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGVNb2RlbFtyb3dJbmRleF1bY29sSW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjZWxsIHNwYW5zIGEgc3BlY2lmaWMgY29sdW1uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2VsbE1vZGVsIC0gVGhlIGNlbGwgbW9kZWwgdG8gY2hlY2tcbiAgICAgKiBAcGFyYW0gY29sSWR4IC0gVGhlIGNvbHVtbiBpbmRleCB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNlbGwgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW5cbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gY2VsbE1vZGVsQ29udGFpbnNDb2x1bW4oY2VsbE1vZGVsOiBDZWxsTW9kZWwsIGNvbElkeDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBjb2xJZHggPj0gY2VsbE1vZGVsLmNvbEluZGV4U3RhcnQgJiYgY29sSWR4IDwgY2VsbE1vZGVsLmNvbEluZGV4U3RhcnQrY2VsbE1vZGVsLmNvbHNwYW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgY2VsbCBzcGFucyBhIHNwZWNpZmljIHJvd1xuICAgICAqXG4gICAgICogQHBhcmFtIGNlbGxNb2RlbCAtIFRoZSBjZWxsIG1vZGVsIHRvIGNoZWNrXG4gICAgICogQHBhcmFtIHJvd0lkeCAtIFRoZSByb3cgaW5kZXggdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjZWxsIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcm93XG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNlbGxNb2RlbENvbnRhaW5zUm93KGNlbGxNb2RlbDogQ2VsbE1vZGVsLCByb3dJZHg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gcm93SWR4ID49IGNlbGxNb2RlbC5yb3dJbmRleFN0YXJ0ICYmIHJvd0lkeCA8IGNlbGxNb2RlbC5yb3dJbmRleFN0YXJ0K2NlbGxNb2RlbC5yb3dzcGFuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvdyBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGxcbiAgICAgKiBGaXJzdCBjaGVja3MgZm9yIGV4cGxpY2l0IGhlYWRlcnMgYXR0cmlidXRlLCB0aGVuIGxvb2tzIGZvciByb3cgaGVhZGVycyBpbiB0aGUgc2FtZSByb3dcbiAgICAgKiBAcGFyYW0gY3Vyc29yIC0gVGhlIFNSQ3Vyc29yIHBvaW50aW5nIHRvIGEgY2VsbFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbmNhdGVuYXRlZCBoZWFkZXIgbmFtZXNcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Um93SGVhZGVycyhjdXJzb3I6IFNSQ3Vyc29yKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbHVtbiBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGxcbiAgICAgKiBGaXJzdCBjaGVja3MgZm9yIGV4cGxpY2l0IGhlYWRlcnMgYXR0cmlidXRlLCB0aGVuIGxvb2tzIGZvciBjb2x1bW4gaGVhZGVycyBpbiB0aGUgc2FtZSBjb2x1bW5cbiAgICAgKiBAcGFyYW0gY3Vyc29yIC0gVGhlIFNSQ3Vyc29yIHBvaW50aW5nIHRvIGEgY2VsbFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbmNhdGVuYXRlZCBoZWFkZXIgbmFtZXNcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Q29sdW1uSGVhZGVyc0ZvckN1cnNvcihpbkNlbGxDdXJzb3I6IFNSQ3Vyc29yLCB0YWJsZU1vZGVsPzogVGFibGVNb2RlbCkge1xuICAgICAgICBpZiAoIXRhYmxlTW9kZWwpIHtcbiAgICAgICAgICAgIHRhYmxlTW9kZWwgPSBnZXRUYWJsZU1vZGVsKGluQ2VsbEN1cnNvcik7XG4gICAgICAgICAgICBpZiAoIXRhYmxlTW9kZWwpIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbGxNb2RlbCA9IGdldENlbGxNb2RlbChpbkNlbGxDdXJzb3IsIHRhYmxlTW9kZWwpO1xuICAgICAgICBpZiAoIWNlbGxNb2RlbCkgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgY29uc3QgY2VsbEN1cnNvciA9IGNlbGxNb2RlbC5jZWxsQ3Vyc29yO1xuICAgICAgICBpZiAoIWNlbGxDdXJzb3IpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IGNlbGxFbGVtID0gY2VsbEN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgIGlmICghY2VsbEVsZW0pIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IGNvbERhdGFzOiBBcnJheTx7XG4gICAgICAgICAgICBwb3RlbnRpYWxDb2xIZWFkZXJzOiBTUkN1cnNvcltdLFxuICAgICAgICAgICAgZXhpc3RzRGF0YUNlbGw6IGJvb2xlYW4sXG4gICAgICAgICAgICBjb2xJZHg6IG51bWJlclxuICAgICAgICB9PiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBjb2xJZHggPSBjZWxsTW9kZWwuY29sSW5kZXhTdGFydDsgY29sSWR4IDwgY2VsbE1vZGVsLmNvbEluZGV4U3RhcnQrY2VsbE1vZGVsLmNvbHNwYW47ICsrY29sSWR4KSB7XG4gICAgICAgICAgICBjb2xEYXRhcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwb3RlbnRpYWxDb2xIZWFkZXJzOiBbXSxcbiAgICAgICAgICAgICAgICBleGlzdHNEYXRhQ2VsbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29sSWR4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcG90ZW50aWFsSGVhZGVyczogU1JDdXJzb3JbXSA9IFtdO1xuICAgICAgICBpZiAoY2VsbEVsZW0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycyA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIilcbiAgICAgICAgICAgICAgICAvLyBTcGxpdCB0aGUgaGVhZGVyIGF0dHJpYnV0ZSBpbnRvIGlkc1xuICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIilcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGUgZm9yIGVhY2ggaWRcbiAgICAgICAgICAgICAgICAubWFwKGlkID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlcbiAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIGJhZCBtYXBwaW5nc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiAhIW5vZGUpXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydCB0byBTUkN1cnNvcnMgdG8gdGhhdCB3ZSBjYW4gZ2V0IGFjY2Vzc2libGUgbmFtZXNcbiAgICAgICAgICAgICAgICAubWFwKG5vZGUgPT4gbmV3IFNSQ3Vyc29yKG5vZGUpKVxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBoZWFkZXJzIHRoYXQgYXJlbid0IGluIHRoZSBzYW1lIGNvbHVtbiAoaWdub3JlIGNvbHVtbiBoZWFkZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoY3Vyc29yID0+IGNvbERhdGFzLnNvbWUoY29sRGF0YSA9PiBjZWxsTW9kZWxDb250YWluc0NvbHVtbihTUlRhYmxlVXRpbC5nZXRDZWxsTW9kZWwoY3Vyc29yLCB0YWJsZU1vZGVsKSwgY29sRGF0YS5jb2xJZHgpKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgY2VsbHMgaW4gdGhpcyBjb2x1bW5cbiAgICAgICAgICAgIC8vIE5vdGUgLSBpZiBldmVyeXRoaW5nIGluIHRoaXMgY29sdW1uIGlzIGVtcHR5IG9yIGEgaGVhZGVyIGNlbGwsIHRoaXMgaXMgcHJvYmFibHkgbm90IGEgaGVhZGluZ1xuICAgICAgICAgICAgZm9yIChsZXQgcm93SWR4PTA7IHJvd0lkeCA8IHRhYmxlTW9kZWwubGVuZ3RoOyArK3Jvd0lkeCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29sRGF0YSBvZiBjb2xEYXRhcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xJZHggPSBjb2xEYXRhLmNvbElkeDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tJbmZvID0gdGFibGVNb2RlbFtyb3dJZHhdW2NvbElkeF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrQ3Vyc29yID0gY2hlY2tJbmZvLmNlbGxDdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrQ3Vyc29yRWxlbSA9IGNoZWNrQ3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyByb3cvY29sIGlzbid0IGZvdW5kLCBvciBpcyB0aGUgc2FtZSBjdXJzb3IgYXMgb3VyIG9yaWdpbmFsIGNlbGwgbW9kZWwsIG9yIGFscmVhZHkgaW4gb3VyIGxpc3QsIHNraXAsIGJ1dCBjaGVjayBpZiBpdCdzIGEgZGF0YSBjZWxsXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tJbmZvIHx8ICFjaGVja0N1cnNvciB8fCBjaGVja0N1cnNvci5pc1NhbWVOb2RlKGNlbGxDdXJzb3IpIHx8IHBvdGVudGlhbEhlYWRlcnMuc29tZShjID0+IGNoZWNrQ3Vyc29yLmlzU2FtZU5vZGUoYykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhLmV4aXN0c0RhdGFDZWxsID0gY29sRGF0YS5leGlzdHNEYXRhQ2VsbCB8fCAoaXNEYXRhQ2VsbChjaGVja0N1cnNvcikgJiYgKGNoZWNrQ3Vyc29yLmhhc05vbkVtcHR5TmFtZSgpIHx8IGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBjaGVja0N1cnNvci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDdXJzb3IuZ2V0Um9sZSgpID09PSBcImNvbHVtbmhlYWRlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhLnBvdGVudGlhbENvbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2hlY2tDdXJzb3JFbGVtLmhhc0F0dHJpYnV0ZShcInJvbGVcIikgJiYgY2hlY2tDdXJzb3JFbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVEhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ3Vyc29yRWxlbS5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PT0gXCJjb2xcIiB8fCBjaGVja0N1cnNvckVsZW0uZ2V0QXR0cmlidXRlKFwic2NvcGVcIikgPT09IFwiYXhpc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2hlY2tDdXJzb3JFbGVtLmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpICYmIGNoZWNrQ3Vyc29yLmhhc05vbkVtcHR5TmFtZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YS5leGlzdHNEYXRhQ2VsbCA9IGNvbERhdGEuZXhpc3RzRGF0YUNlbGwgfHwgKGlzRGF0YUNlbGwoY2hlY2tDdXJzb3IpICYmIChjaGVja0N1cnNvci5oYXNOb25FbXB0eU5hbWUoKSB8fCBjb2xEYXRhLnBvdGVudGlhbENvbEhlYWRlcnMubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBjb2xEYXRhIG9mIGNvbERhdGFzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb2xEYXRhLmV4aXN0c0RhdGFDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMgPSBwb3RlbnRpYWxIZWFkZXJzLmZpbHRlcihvbmUgPT4gY29sRGF0YXMuc29tZShjb2xEYXRhID0+IGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5zb21lKHR3byA9PiB0d28uaXNTYW1lTm9kZShvbmUpKSkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvdGVudGlhbEhlYWRlcnNcbiAgICAgICAgICAgIC8vIEFuZCB0aGVuIHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGhlYWRlcnNcbiAgICAgICAgICAgIC5tYXAoY3Vyc29yID0+IGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lIHx8IFwiXCIpXG4gICAgICAgICAgICAubWFwKHMgPT4gcy50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKHMgPT4gcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByb3cgaGVhZGVycyBhc3NvY2lhdGVkIHdpdGggYSBjZWxsXG4gICAgICogRmlyc3QgY2hlY2tzIGZvciBleHBsaWNpdCBoZWFkZXJzIGF0dHJpYnV0ZSwgdGhlbiBsb29rcyBmb3Igcm93IGhlYWRlcnMgaW4gdGhlIHNhbWUgcm93XG4gICAgICogQHBhcmFtIGN1cnNvciAtIFRoZSBTUkN1cnNvciBwb2ludGluZyB0byBhIGNlbGxcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBjb25jYXRlbmF0ZWQgaGVhZGVyIG5hbWVzXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFJvd0hlYWRlcnNGb3JDdXJzb3IoaW5DZWxsQ3Vyc29yOiBTUkN1cnNvciwgdGFibGVNb2RlbD86IFRhYmxlTW9kZWwpIHtcbiAgICAgICAgaWYgKCF0YWJsZU1vZGVsKSB7XG4gICAgICAgICAgICB0YWJsZU1vZGVsID0gZ2V0VGFibGVNb2RlbChpbkNlbGxDdXJzb3IpO1xuICAgICAgICAgICAgaWYgKCF0YWJsZU1vZGVsKSByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjZWxsTW9kZWwgPSBnZXRDZWxsTW9kZWwoaW5DZWxsQ3Vyc29yLCB0YWJsZU1vZGVsKTtcbiAgICAgICAgaWYgKCFjZWxsTW9kZWwpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IGNlbGxDdXJzb3IgPSBjZWxsTW9kZWwuY2VsbEN1cnNvcjtcbiAgICAgICAgaWYgKCFjZWxsQ3Vyc29yKSByZXR1cm4gXCJcIjtcblxuICAgICAgICBjb25zdCBjZWxsRWxlbSA9IGNlbGxDdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICBpZiAoIWNlbGxFbGVtKSByZXR1cm4gXCJcIjtcblxuICAgICAgICBjb25zdCByb3dEYXRhczogQXJyYXk8e1xuICAgICAgICAgICAgcG90ZW50aWFsUm93SGVhZGVyczogU1JDdXJzb3JbXSxcbiAgICAgICAgICAgIGV4aXN0c0RhdGFDZWxsOiBib29sZWFuLFxuICAgICAgICAgICAgcm93SWR4OiBudW1iZXJcbiAgICAgICAgfT4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcm93SWR4ID0gY2VsbE1vZGVsLnJvd0luZGV4U3RhcnQ7IHJvd0lkeCA8IGNlbGxNb2RlbC5yb3dJbmRleFN0YXJ0K2NlbGxNb2RlbC5yb3dzcGFuOyArK3Jvd0lkeCkge1xuICAgICAgICAgICAgcm93RGF0YXMucHVzaCh7XG4gICAgICAgICAgICAgICAgcG90ZW50aWFsUm93SGVhZGVyczogW10sXG4gICAgICAgICAgICAgICAgZXhpc3RzRGF0YUNlbGw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJvd0lkeFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcG90ZW50aWFsSGVhZGVyczogU1JDdXJzb3JbXSA9IFtdO1xuICAgICAgICBpZiAoY2VsbEVsZW0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycyA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIilcbiAgICAgICAgICAgICAgICAvLyBTcGxpdCB0aGUgaGVhZGVyIGF0dHJpYnV0ZSBpbnRvIGlkc1xuICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIilcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGUgZm9yIGVhY2ggaWRcbiAgICAgICAgICAgICAgICAubWFwKGlkID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlcbiAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIGJhZCBtYXBwaW5nc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiAhIW5vZGUpXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydCB0byBTUkN1cnNvcnMgdG8gdGhhdCB3ZSBjYW4gZ2V0IGFjY2Vzc2libGUgbmFtZXNcbiAgICAgICAgICAgICAgICAubWFwKG5vZGUgPT4gbmV3IFNSQ3Vyc29yKG5vZGUpKVxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBoZWFkZXJzIHRoYXQgYXJlbid0IGluIHRoZSBzYW1lIHJvdyAoaWdub3JlIGNvbHVtbiBoZWFkZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoY3Vyc29yID0+IHJvd0RhdGFzLnNvbWUocm93RGF0YSA9PiBjZWxsTW9kZWxDb250YWluc1JvdyhTUlRhYmxlVXRpbC5nZXRDZWxsTW9kZWwoY3Vyc29yLCB0YWJsZU1vZGVsKSwgcm93RGF0YS5yb3dJZHgpKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgY2VsbHMgaW4gdGhlIHJvd3NcbiAgICAgICAgICAgIC8vIE5vdGUgLSBpZiBldmVyeXRoaW5nIGluIHRoZSByb3cgaXMgZW1wdHkgb3IgYSBoZWFkZXIgY2VsbCwgdGhpcyBpcyBwcm9iYWJseSBub3QgYSBoZWFkaW5nXG4gICAgICAgICAgICBsZXQgbG9uZ2VzdFJvdyA9IHJvd0RhdGFzLnJlZHVjZSgocHJldiwgY3VyKSA9PiBNYXRoLm1heChwcmV2LCB0YWJsZU1vZGVsW2N1ci5yb3dJZHhdLmxlbmd0aCksIDApO1xuICAgICAgICAgICAgZm9yIChsZXQgY29sSWR4PTA7IGNvbElkeCA8IGxvbmdlc3RSb3c7ICsrY29sSWR4KSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByb3dEYXRhIG9mIHJvd0RhdGFzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd0lkeCA9IHJvd0RhdGEucm93SWR4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sSWR4ID49IHRhYmxlTW9kZWxbcm93SWR4XS5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZm8gPSB0YWJsZU1vZGVsW3Jvd0lkeF1bY29sSWR4XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJzb3IgPSBjaGVja0luZm8uY2VsbEN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJzb3JFbGVtID0gY2hlY2tDdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHJvdy9jb2wgaXNuJ3QgZm91bmQsIG9yIGlzIHRoZSBzYW1lIGN1cnNvciBhcyBvdXIgb3JpZ2luYWwgY2VsbCBtb2RlbCwgb3IgYWxyZWFkeSBpbiBvdXIgbGlzdCwgc2tpcCwgYnV0IGNoZWNrIGlmIGl0J3MgYSBkYXRhIGNlbGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0luZm8gfHwgIWNoZWNrQ3Vyc29yIHx8IGNoZWNrQ3Vyc29yLmlzU2FtZU5vZGUoY2VsbEN1cnNvcikgfHwgcG90ZW50aWFsSGVhZGVycy5zb21lKGMgPT4gY2hlY2tDdXJzb3IuaXNTYW1lTm9kZShjKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGEuZXhpc3RzRGF0YUNlbGwgPSByb3dEYXRhLmV4aXN0c0RhdGFDZWxsIHx8IChpc0RhdGFDZWxsKGNoZWNrQ3Vyc29yKSAmJiAoY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkgfHwgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGNoZWNrQ3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0N1cnNvci5nZXRSb2xlKCkgPT09IFwicm93aGVhZGVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGEucG90ZW50aWFsUm93SGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja0N1cnNvckVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBjaGVja0N1cnNvckVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJUSFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDdXJzb3JFbGVtLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09PSBcInJvd1wiIHx8IGNoZWNrQ3Vyc29yRWxlbS5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PT0gXCJheGlzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja0N1cnNvckVsZW0uaGFzQXR0cmlidXRlKFwic2NvcGVcIikgJiYgY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhLmV4aXN0c0RhdGFDZWxsID0gcm93RGF0YS5leGlzdHNEYXRhQ2VsbCB8fCAoaXNEYXRhQ2VsbChjaGVja0N1cnNvcikgJiYgKGNoZWNrQ3Vyc29yLmhhc05vbkVtcHR5TmFtZSgpIHx8IHJvd0RhdGEucG90ZW50aWFsUm93SGVhZGVycy5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJvd0RhdGEgb2Ygcm93RGF0YXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJvd0RhdGEuZXhpc3RzRGF0YUNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycyA9IHBvdGVudGlhbEhlYWRlcnMuZmlsdGVyKG9uZSA9PiByb3dEYXRhcy5zb21lKHJvd0RhdGEgPT4gcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLnNvbWUodHdvID0+IHR3by5pc1NhbWVOb2RlKG9uZSkpKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG90ZW50aWFsSGVhZGVyc1xuICAgICAgICAgICAgLy8gQW5kIHRoZW4gcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgaGVhZGVyc1xuICAgICAgICAgICAgLm1hcChjdXJzb3IgPT4gY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgfHwgXCJcIilcbiAgICAgICAgICAgIC5tYXAocyA9PiBzLnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIocyA9PiBzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBjZWxsIGlzIGEgZGF0YSBjZWxsIChub3QgYSBoZWFkZXIgY2VsbClcbiAgICAgKlxuICAgICAqIEEgZGF0YSBjZWxsIGlzIG9uZSB3aXRoIGVpdGhlcjpcbiAgICAgKiAtIEFuIGV4cGxpY2l0IEFSSUEgcm9sZSBvZiBcImNlbGxcIlxuICAgICAqIC0gQSBURCBlbGVtZW50IHdpdGhvdXQgYW4gb3ZlcnJpZGluZyByb2xlIGF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIGNoZWNrQ3Vyc29yIC0gVGhlIGN1cnNvciB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGN1cnNvciBwb2ludHMgdG8gYSBkYXRhIGNlbGxcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gaXNEYXRhQ2VsbChjaGVja0N1cnNvcjogU1JDdXJzb3IpIHtcbiAgICAgICAgY29uc3QgY2hlY2tDdXJzb3JFbGVtID0gY2hlY2tDdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICBpZiAoIWNoZWNrQ3Vyc29yRWxlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gY2hlY2tDdXJzb3IuZ2V0Um9sZSgpID09PSBcImNlbGxcIiB8fCAoIWNoZWNrQ3Vyc29yRWxlbS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIGNoZWNrQ3Vyc29yRWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlREXCIpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgbmFtZXNwYWNlIFNSVXRpbCB7XG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzTW9kYWxEaWFsb2dFbGVtZW50KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiByb2xlID09PSBcImRpYWxvZ1wiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1tb2RhbFwiKSA9PT0gXCJ0cnVlXCIgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIENTUyBzZWxlY3RvciBmb3IgYSBzcGVjaWZpYyBIVE1MIGVsZW1lbnRcbiAgICAgKiBUaGUgc2VsZWN0b3IgaXMgYnVpbHQgdXNpbmcgYSBjb21iaW5hdGlvbiBvZjpcbiAgICAgKiAxLiBFbGVtZW50IHRhZyBuYW1lXG4gICAgICogMi4gSUQgKGlmIGF2YWlsYWJsZSlcbiAgICAgKiAzLiBDbGFzc2VzIChpZiBhdmFpbGFibGUpXG4gICAgICogNC4gQXR0cmlidXRlcyAoaWYgbmVlZGVkKVxuICAgICAqIDUuIG50aC1jaGlsZCBzZWxlY3RvcnMgZm9yIHBvc2l0aW9uIGluIHBhcmVudFxuICAgICAqIFxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gZ2VuZXJhdGUgYSBzZWxlY3RvciBmb3JcbiAgICAgKiBAcGFyYW0gb3B0aW1pemVkIElmIHRydWUsIGNyZWF0ZXMgYSBzaG9ydGVyIGJ1dCBwb3NzaWJseSBsZXNzIHJvYnVzdCBzZWxlY3RvclxuICAgICAqIEByZXR1cm4gQSBDU1Mgc2VsZWN0b3Igc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZWxlbWVudFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRVbmlxdWVTZWxlY3RvcihlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW1pemVkOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYW4gSUQsIHRoYXQncyB0aGUgbW9zdCBkaXJlY3Qgd2F5IHRvIHNlbGVjdCBpdFxuICAgICAgICBpZiAoZWxlbWVudC5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIGAjJHtDU1MuZXNjYXBlKGVsZW1lbnQuaWQpfWA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHdlJ3JlIGF0IHRoZSByb290IG9yIGRvY3VtZW50IGVsZW1lbnQsIHJldHVybiB0aGUgdGFnIG5hbWVcbiAgICAgICAgaWYgKGVsZW1lbnQuaXNTYW1lTm9kZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHx8IGVsZW1lbnQuaXNTYW1lTm9kZShkb2N1bWVudC5ib2R5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBTdGFydCBidWlsZGluZyB0aGUgc2VsZWN0b3Igd2l0aCB0aGUgdGFnIG5hbWVcbiAgICAgICAgbGV0IHNlbGVjdG9yID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBBZGQgY2xhc3NlcyBpZiBhdmFpbGFibGUgYW5kIHdlJ3JlIG5vdCBvcHRpbWl6aW5nIGZvciBicmV2aXR5XG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5sZW5ndGggJiYgIW9wdGltaXplZCkge1xuICAgICAgICAgICAgLy8gVGFrZSB1cCB0byAzIGNsYXNzZXMgdG8gYXZvaWQgb3Zlcmx5IHNwZWNpZmljIHNlbGVjdG9yc1xuICAgICAgICAgICAgY29uc3QgY2xhc3NlcyA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpLnNsaWNlKDAsIDMpO1xuICAgICAgICAgICAgc2VsZWN0b3IgKz0gY2xhc3Nlcy5tYXAoY2xzID0+IGAuJHtDU1MuZXNjYXBlKGNscyl9YCkuam9pbignJyk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEFkZCBkaXN0aW5ndWlzaGluZyBhdHRyaWJ1dGVzIGlmIG5lZWRlZCBhbmQgbm90IG9wdGltaXppbmdcbiAgICAgICAgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIGFkZGluZyByb2xlLCBhcmlhLWxhYmVsLCBvciBvdGhlciBkaXN0aW5jdGl2ZSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3JvbGUnKSkge1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yICs9IGBbcm9sZT1cIiR7Q1NTLmVzY2FwZShlbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpIHx8ICcnKX1cIl1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSB8fCAnJztcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwubGVuZ3RoIDw9IDIwKSB7IC8vIEF2b2lkIG92ZXJseSBsb25nIHNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciArPSBgW2FyaWEtbGFiZWw9XCIke0NTUy5lc2NhcGUobGFiZWwpfVwiXWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGb3IgaW5wdXRzLCBhZGQgdHlwZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndHlwZScpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3IgKz0gYFt0eXBlPVwiJHtDU1MuZXNjYXBlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0eXBlJykgfHwgJycpfVwiXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBwYXJlbnQgbm9kZSwgZGV0ZXJtaW5lIHBvc2l0aW9uIGFtb25nIHNpYmxpbmdzXG4gICAgICAgIGlmIChlbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIEZpbmQgYWxsIHNpYmxpbmdzIHdpdGggdGhlIHNhbWUgdGFnXG4gICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IEFycmF5LmZyb20oZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQudGFnTmFtZSA9PT0gZWxlbWVudC50YWdOYW1lKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIHNpYmxpbmcgd2l0aCB0aGUgc2FtZSB0YWcsIGFkZCBudGgtY2hpbGRcbiAgICAgICAgICAgIGlmIChzaWJsaW5ncy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzaWJsaW5ncy5pbmRleE9mKGVsZW1lbnQpICsgMTtcbiAgICAgICAgICAgICAgICBzZWxlY3RvciArPSBgOm50aC1vZi10eXBlKCR7aW5kZXh9KWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBhdCB0aGUgcm9vdCwgcmVjdXJzaXZlbHkgYnVpbGQgdGhlIHBhcmVudCBzZWxlY3RvclxuICAgICAgICAgICAgLy8gYnV0IHVzZSBvcHRpbWl6ZWQgc2VsZWN0b3JzIGZvciBhbmNlc3RvcnMgdG8ga2VlcCB0aGUgb3ZlcmFsbCBzZWxlY3RvciBtYW5hZ2VhYmxlXG4gICAgICAgICAgICByZXR1cm4gYCR7Z2V0VW5pcXVlU2VsZWN0b3IoZWxlbWVudC5wYXJlbnRFbGVtZW50LCB0cnVlKX0gPiAke3NlbGVjdG9yfWA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICB9XG59IiwiaW1wb3J0IHsgU1JDb250cm9sbGVyIH0gZnJvbSBcIi4vU1JDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uTW9kZSwgTmF2aWdhdGlvblJlc3VsdCB9IGZyb20gXCIuL1NSVHlwZXNcIjtcblxuLyoqXG4gKiBTUk92ZXJsYXkgY2xhc3MgZm9yIGNyZWF0aW5nIGEgVUkgd2lkZ2V0IHRvIGNvbnRyb2wgc2NyZWVuIHJlYWRlciBzaW11bGF0aW9uXG4gKiBQcm92aWRlcyBidXR0b25zIGZvciBuYXZpZ2F0aW9uIGFuZCBkaXNwbGF5cyByZXN1bHRzXG4gKi9cbmV4cG9ydCBjbGFzcyBTUk92ZXJsYXkge1xuICAgIC8qKiBUaGUgY29udGFpbmVyIGVsZW1lbnQgZm9yIHRoZSBvdmVybGF5ICovXG4gICAgcHJpdmF0ZSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIC8qKiBUaGUgcmVzdWx0cyBkaXNwbGF5IGVsZW1lbnQgKi9cbiAgICBwcml2YXRlIHJlc3VsdHNEaXNwbGF5OiBIVE1MRWxlbWVudDtcbiAgICAvKiogTmF2aWdhdGlvbiBtb2RlcyBhdmFpbGFibGUgaW4gdGhlIFVJICovXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uTW9kZXM6IHsgbW9kZTogTmF2aWdhdGlvbk1vZGUsIGxhYmVsOiBzdHJpbmcgfVtdID0gW1xuICAgICAgICB7IG1vZGU6IFwiaXRlbVwiLCBsYWJlbDogXCJJdGVtXCIgfSxcbiAgICAgICAgeyBtb2RlOiBcInRhYl9mb2N1c1wiLCBsYWJlbDogXCJUYWJiYWJsZVwiIH0sXG4gICAgICAgIHsgbW9kZTogXCJoZWFkaW5nXCIsIGxhYmVsOiBcIkhlYWRpbmdcIiB9LFxuICAgICAgICB7IG1vZGU6IFwicmVnaW9uXCIsIGxhYmVsOiBcIlJlZ2lvblwiIH1cbiAgICBdO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUk92ZXJsYXlcbiAgICAgKiBAcGFyYW0gY29udHJvbGxlciBUaGUgU1JDb250cm9sbGVyIGluc3RhbmNlIHRvIHVzZSBmb3IgbmF2aWdhdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3JWaWV3ZXI6IFNSVmlld2VyKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlT3ZlcmxheSgpO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBjcmVhdGVET01FbGVtZW50KGVsZW1OYW1lOiBzdHJpbmcsIGF0dHJzOiB7IFthdHRyOiBzdHJpbmddOiBzdHJpbmd9LCBzdHlsZXM6IFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4pIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHRoaXMuc3JWaWV3ZXIudmlld2VyRG9jLmNyZWF0ZUVsZW1lbnQoZWxlbU5hbWUpO1xuICAgICAgICBpZiAoYXR0cnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsW2tleV0gPSBhdHRyc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdHlsZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHN0eWxlcykge1xuICAgICAgICAgICAgICAgIHJldFZhbC5zdHlsZVtrZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBvdmVybGF5IFVJIGVsZW1lbnRzIGFuZCBhZGRzIHRoZW0gdG8gdGhlIERPTVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgLy8gQ3JlYXRlIG1haW4gY29udGFpbmVyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJpYm1hLXNyLW92ZXJsYXlcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgIGJvdHRvbTogJzAnLFxuICAgICAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC44KScsXG4gICAgICAgICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgIHBhZGRpbmc6ICcxMHB4JyxcbiAgICAgICAgICAgIHpJbmRleDogJzEwMDAwJyxcbiAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICAgICAgZ2FwOiAnMTBweCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNvbnRyb2xzIGNvbnRhaW5lclxuICAgICAgICBjb25zdCBjb250cm9sc0NvbnRhaW5lciA9IHRoaXMuY3JlYXRlRE9NRWxlbWVudChcImRpdlwiLCB7fSwgeyBcbiAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLCBmbGV4V3JhcDogXCJ3cmFwXCIsIGdhcDogXCIxMHB4XCJ9KTtcblxuICAgICAgICAvLyBDcmVhdGUgbmF2aWdhdGlvbiBtb2RlIGdyb3Vwc1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25Nb2Rlcy5mb3JFYWNoKG5hdk1vZGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgbW9kZUdyb3VwID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdkaXYnLCB7fSwge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGdhcDogJzVweCcsXG4gICAgICAgICAgICAgICAgbWFyZ2luOiAnMCAxMHB4J1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG1vZGVHcm91cC5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ3NwYW4nLCB7XG4gICAgICAgICAgICAgICAgdGV4dENvbnRlbnQ6IG5hdk1vZGUubGFiZWwgKyBcIjpcIlxuICAgICAgICAgICAgfSwge30pKTtcblxuICAgICAgICAgICAgLy8gUHJldmlvdXMgYnV0dG9uXG4gICAgICAgICAgICBjb25zdCBwcmV2QnV0dG9uID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdidXR0b24nLCB7XG4gICAgICAgICAgICAgICAgdGV4dENvbnRlbnQ6ICfil4AgUHJldidcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnNXB4IDEwcHgnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyM0NDQnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAnd2hpdGUnLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJldkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc3JWaWV3ZXIubmF2aWdhdGVQcmV2aW91cyhuYXZNb2RlLm1vZGUpKTtcbiAgICAgICAgICAgIG1vZGVHcm91cC5hcHBlbmRDaGlsZChwcmV2QnV0dG9uKTtcblxuICAgICAgICAgICAgLy8gTmV4dCBidXR0b25cbiAgICAgICAgICAgIGNvbnN0IG5leHRCdXR0b24gPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0Q29udGVudDogJ05leHQg4pa2J1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICc1cHggMTBweCcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzQ0NCcsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXh0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zclZpZXdlci5uYXZpZ2F0ZU5leHQobmF2TW9kZS5tb2RlKSk7XG4gICAgICAgICAgICBtb2RlR3JvdXAuYXBwZW5kQ2hpbGQobmV4dEJ1dHRvbik7XG5cbiAgICAgICAgICAgIGNvbnRyb2xzQ29udGFpbmVyLmFwcGVuZENoaWxkKG1vZGVHcm91cCk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgb3RoZXJCdXR0b25Hcm91cCA9IHRoaXMuY3JlYXRlRE9NRWxlbWVudCgnZGl2Jywge30sIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICBnYXA6ICc1cHgnLFxuICAgICAgICAgICAgbWFyZ2luOiAnMCAxMHB4J1xuICAgICAgICB9KVxuICAgICAgICAvLyBTaG93IGFsbCBidXR0b25cbiAgICAgICAgY29uc3Qgc2hvd0FsbEJ1dHRvbiA9IHRoaXMuY3JlYXRlRE9NRWxlbWVudCgnYnV0dG9uJywge1xuICAgICAgICAgICAgdGV4dENvbnRlbnQ6ICdTaG93IGFsbCdcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4JyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyM0NDQnLFxuICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICB9KTtcbiAgICAgICAgc2hvd0FsbEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc3JWaWV3ZXIuc2hvd0FsbCh0cnVlKSk7XG4gICAgICAgIG90aGVyQnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQoc2hvd0FsbEJ1dHRvbik7XG5cbiAgICAgICAgLy8gVG9nZ2xlIFNwZWVjaCBCdXR0b25cbiAgICAgICAgY29uc3QgdG9nZ2xlU3BlZWNoID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdidXR0b24nLCB7XG4gICAgICAgICAgICB0ZXh0Q29udGVudDogJ1RvZ2dsZSBzcGVlY2gnXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHBhZGRpbmc6ICc1cHggMTBweCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjNDQ0JyxcbiAgICAgICAgICAgIGNvbG9yOiAnd2hpdGUnLFxuICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgICAgfSk7XG4gICAgICAgIHRvZ2dsZVNwZWVjaC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc3JWaWV3ZXIudG9nZ2xlU3BlZWNoKCkpO1xuICAgICAgICBvdGhlckJ1dHRvbkdyb3VwLmFwcGVuZENoaWxkKHRvZ2dsZVNwZWVjaCk7XG4gICAgICAgIGNvbnRyb2xzQ29udGFpbmVyLmFwcGVuZENoaWxkKG90aGVyQnV0dG9uR3JvdXApO1xuXG5cbiAgICAgICAgLy8gQ3JlYXRlIHJlc3VsdHMgZGlzcGxheVxuICAgICAgICB0aGlzLnJlc3VsdHNEaXNwbGF5ID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdkaXYnLCB7XG4gICAgICAgICAgICB0ZXh0Q29udGVudDogJ1NjcmVlbiByZWFkZXIgc2ltdWxhdGlvbiByZXN1bHRzIHdpbGwgYXBwZWFyIGhlcmUuJ1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBwYWRkaW5nOiAnMTBweCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSknLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgICAgIG1pbkhlaWdodDogJzEwMHB4JyxcbiAgICAgICAgICAgIG1heEhlaWdodDogJzUwdmgnLFxuICAgICAgICAgICAgZm9udEZhbWlseTogJ21vbm9zcGFjZScsXG4gICAgICAgICAgICBvdmVyZmxvdzogJ2F1dG8nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCBlbGVtZW50cyB0byBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoY29udHJvbHNDb250YWluZXIpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnJlc3VsdHNEaXNwbGF5KTtcblxuICAgICAgICAvLyBBZGQgdG8gZG9jdW1lbnRcbiAgICAgICAgdGhpcy5zclZpZXdlci52aWV3ZXJEb2MuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheSB0aGUgbmF2aWdhdGlvbiByZXN1bHQgaW4gdGhlIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBuYXZpZ2F0aW9uIHJlc3VsdFxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdXNlZFxuICAgICAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIG5hdmlnYXRpb24gZGlyZWN0aW9uICgnbmV4dCcsICdwcmV2aW91cycsIG9yICdmb2N1cycpXG4gICAgICovXG4gICAgcHVibGljIGRpc3BsYXlSZXN1bHQocmVzdWx0OiBOYXZpZ2F0aW9uUmVzdWx0LCBtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgZGlyZWN0aW9uOiAnbmV4dCcgfCAncHJldmlvdXMnIHwgJ2ZvY3VzJyk6IHZvaWQge1xuICAgICAgICBsZXQgZGlzcGxheVRleHQgPSAnJztcbiAgICAgICAgXG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI/Pz9cIiwgcmVzdWx0KTtcbiAgICAgICAgICAgIGRpc3BsYXlUZXh0ID0gYCR7ZGlyZWN0aW9uLnRvVXBwZXJDYXNlKCl9ICR7bW9kZX06ICR7cmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaXNwbGF5VGV4dCA9IGAke2RpcmVjdGlvbi50b1VwcGVyQ2FzZSgpfSAke21vZGV9OiAke3Jlc3VsdC5yZW5kZXJpbmdSZXN1bHQubWVzc2FnZX1gO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5yZW5kZXJpbmdSZXN1bHQuZW5kPy5nZXRFbGVtZW50KCk/LnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgIHJlc3VsdC5yZW5kZXJpbmdSZXN1bHQuc3RhcnQ/LmdldEVsZW1lbnQoKT8uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgd2luZG93LnNjcm9sbEJ5KDAsIC0yMDApO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5yZXN1bHRzRGlzcGxheS5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB0aGlzLnJlc3VsdHNEaXNwbGF5LnRleHRDb250ZW50ID0gZGlzcGxheVRleHQ7XG4gICAgICAgIGxldCBpbnNwZWN0QnV0dG9uID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgIGlubmVyVGV4dDogXCJEZWJ1Z1wiXG4gICAgICAgIH0sIHtcbiAgICAgICAgfSk7XG4gICAgICAgIGluc3BlY3RCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5yZW5kZXJpbmdSZXN1bHQuc3RhcnQ/LmdldE5vZGUoKSwgcmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5lbmQ/LmdldE5vZGUoKSk7XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMucmVzdWx0c0Rpc3BsYXkuYXBwZW5kQ2hpbGQoaW5zcGVjdEJ1dHRvbilcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcGxheUFsbChyZXN1bHQ6IEFycmF5PHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwidGFibGVcIiwge30sIHt9KTtcbiAgICAgICAgY29uc3QgaGVhZGVyUm93ID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwidHJcIiwge30sIHt9KTtcbiAgICAgICAgY29uc3QgaGVhZGluZ0xhYmVscyA9IFtcIlJlZ2lvblwiLCBcIkhlYWRpbmdcIiwgXCJJdGVtXCIsIFwiVGFiYmFibGVcIl07XG4gICAgICAgIGNvbnN0IGhlYWRpbmdGaWVsZHMgPSBbXCJyZWdpb25cIiwgXCJoZWFkaW5nXCIsIFwiaXRlbVwiLCBcInRhYl9mb2N1c1wiXTtcbiAgICAgICAgZm9yIChjb25zdCBoZWFkaW5nTGFiZWwgb2YgaGVhZGluZ0xhYmVscykge1xuICAgICAgICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRE9NRWxlbWVudChcInRoXCIsIHtcbiAgICAgICAgICAgICAgICBzY29wZTogXCJjb2xcIixcbiAgICAgICAgICAgICAgICBpbm5lclRleHQ6IGhlYWRpbmdMYWJlbFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogXCJsZWZ0XCIsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogXCIuMjVyZW1cIixcbiAgICAgICAgICAgICAgICBtYXJnaW46IFwiMHJlbVwiLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBcIndoaXRlXCJcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKGhlYWRlclJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcmVzdWx0KSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhUm93ID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwidHJcIiwge30sIHt9KTtcbiAgICAgICAgICAgIGhlYWRpbmdGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhUm93LmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRE9NRWxlbWVudChcInRkXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJUZXh0OiBsaW5lW2ZpZWxkXVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogXCJ0b3BcIixcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBcInNvbGlkIHdoaXRlIDFweFwiLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIi4yNXJlbVwiLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IFwiMHJlbVwiLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCJ3aGl0ZVwiXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKGRhdGFSb3cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzdWx0c0Rpc3BsYXkuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgdGhpcy5yZXN1bHRzRGlzcGxheS5hcHBlbmRDaGlsZCh0YWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBvdmVybGF5IGZyb20gdGhlIERPTVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250YWluZXIgJiYgdGhpcy5jb250YWluZXIucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogU1JWaWV3ZXIgY2xhc3MgZm9yIG1hbmFnaW5nIHNjcmVlbiByZWFkZXIgc2ltdWxhdGlvbiB3aXRoIFVJIGNvbnRyb2xzXG4gKi9cbmV4cG9ydCBjbGFzcyBTUlZpZXdlciB7XG4gICAgLyoqIFRoZSBjb250cm9sbGVyIGluc3RhbmNlICovXG4gICAgcHJpdmF0ZSBjb250cm9sbGVyOiBTUkNvbnRyb2xsZXI7XG4gICAgLyoqIFRoZSBvdmVybGF5IFVJIGluc3RhbmNlICovXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBTUk92ZXJsYXk7XG4gICAgLyoqIEZsYWcgdG8gdHJhY2sgaWYgc3BlZWNoIGlzIGFjdGl2ZSAqL1xuICAgIHByaXZhdGUgaXNTdHJlYW1pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKiogRmxhZyB0byBzZXQgaWYgc2hvd2luZyBhbGwgKi9cbiAgICBwcml2YXRlIGlzU2hvd2luZ0FsbDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKiBGbGFnIHRvIHNldCBpZiBpdCBzaG91bGQgYmUgc3BlYWtpbmcgKi9cbiAgICBwcml2YXRlIHNwZWVjaEVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKiogS2V5Ym9hcmQgZXZlbnQgaGFuZGxlciAqL1xuICAgIHByaXZhdGUga2V5Ym9hcmRIYW5kbGVyOiAoZTogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZDtcbiAgICAvKiogRm9jdXMgZXZlbnQgaGFuZGxlciAqL1xuICAgIHByaXZhdGUgZm9jdXNIYW5kbGVyOiAoZTogRm9jdXNFdmVudCkgPT4gdm9pZDtcbiAgICB2aWV3ZXJEb2M6IEhUTUxEb2N1bWVudDtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU1JWaWV3ZXJcbiAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCB0byBzdGFydCBmcm9tIChkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5KVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJvb3RFbGVtZW50OiBOb2RlID0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICB0aGlzLnZpZXdlckRvYyA9IHJvb3RFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIC8vIENyZWF0ZSBjb250cm9sbGVyIGZvciB0aGUgZG9jdW1lbnQgYm9keVxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBTUkNvbnRyb2xsZXIuZ2V0Q29udHJvbGxlcih0aGlzLnZpZXdlckRvYyk7XG4gICAgICAgIFxuICAgICAgICAvLyBDcmVhdGUgb3ZlcmxheSBVSVxuICAgICAgICB0aGlzLm92ZXJsYXkgPSBuZXcgU1JPdmVybGF5KHRoaXMpO1xuICAgICAgICBcbiAgICAgICAgLy8gU2V0IHVwIGtleWJvYXJkIGhhbmRsZXJzXG4gICAgICAgIHRoaXMuc2V0dXBLZXlib2FyZEhhbmRsZXJzKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBTZXQgdXAgZm9jdXMgdHJhY2tpbmdcbiAgICAgICAgdGhpcy5zZXR1cEZvY3VzVHJhY2tpbmcoKTtcblxuICAgICAgICAvLyBTZXQgdXAgbXV0YXRpb24gdHJhY2tpbmdcbiAgICAgICAgdGhpcy5zZXR1cE11dGF0aW9uVHJhY2tpbmcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd0FsbChiRW5hYmxlQWxsTW9kZT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGJFbmFibGVBbGxNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmlzU2hvd2luZ0FsbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gU1JDb250cm9sbGVyLnJlbmRlclN0cnVjdHVyZSh0aGlzLnZpZXdlckRvYyk7XG4gICAgICAgIHRoaXMub3ZlcmxheS5kaXNwbGF5QWxsKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZVNwZWVjaCgpIHtcbiAgICAgICAgdGhpcy5zcGVlY2hFbmFibGVkID0gIXRoaXMuc3BlZWNoRW5hYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZSB0byB0aGUgbmV4dCBlbGVtZW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdG8gdXNlXG4gICAgICovXG4gICAgcHVibGljIG5hdmlnYXRlTmV4dChtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzU2hvd2luZ0FsbCA9IGZhbHNlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRyb2xsZXIuanVtcE5leHQobW9kZSk7XG4gICAgICAgIHRoaXMub3ZlcmxheS5kaXNwbGF5UmVzdWx0KHJlc3VsdCwgbW9kZSwgJ25leHQnKTtcbiAgICAgICAgdGhpcy5zcGVha1Jlc3VsdChyZXN1bHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlIHRvIHRoZSBwcmV2aW91cyBlbGVtZW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdG8gdXNlXG4gICAgICovXG4gICAgcHVibGljIG5hdmlnYXRlUHJldmlvdXMobW9kZTogTmF2aWdhdGlvbk1vZGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1Nob3dpbmdBbGwgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250cm9sbGVyLmp1bXBQcmV2aW91cyhtb2RlKTtcbiAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlSZXN1bHQocmVzdWx0LCBtb2RlLCAncHJldmlvdXMnKTtcbiAgICAgICAgdGhpcy5zcGVha1Jlc3VsdChyZXN1bHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB1cCBrZXlib2FyZCBldmVudCBoYW5kbGVycyBmb3Igc2NyZWVuIHJlYWRlciBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cEtleWJvYXJkSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRIYW5kbGVyID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIERvbid0IGNhcHR1cmUga2V5Ym9hcmQgZXZlbnRzIHdoZW4gZm9jdXMgaXMgaW4gZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgdGFyZ2V0LnRhZ05hbWUgPT09ICdURVhUQVJFQScgfHwgdGFyZ2V0LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBIYW5kbGUga2V5Ym9hcmQgc2hvcnRjdXRzXG4gICAgICAgICAgICBpZiAoZS5jdHJsS2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gQ3RybCBrZXkgc3RvcHMgc3BlZWNoXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wU3BlZWNoKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGUuYWx0S2V5IHx8IGUubWV0YUtleSkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZS5rZXkpO1xuICAgICAgICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2aW91cygnaXRlbScpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0cmVhbWluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgnaXRlbScpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUN1cnJlbnRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5zZXRQb2ludE9mUmVnYXJkKHRoaXMudmlld2VyRG9jLmFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdIJzpcbiAgICAgICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2aW91cygnaGVhZGluZycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZU5leHQoJ2hlYWRpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdSJzpcbiAgICAgICAgICAgICAgICBjYXNlICdyJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2aW91cygncmVnaW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgncmVnaW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2aW91cygndGFiX2ZvY3VzJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgndGFiX2ZvY3VzJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBBZGQgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgIHRoaXMudmlld2VyRG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWJvYXJkSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzcGVha1Jlc3VsdChyZXN1bHQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNwZWVjaEVuYWJsZWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgdXR0ZXJhbmNlID0gbmV3IFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZShyZXN1bHQucmVuZGVyaW5nUmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB1dHRlcmFuY2UucmF0ZSA9IDEuNTtcbiAgICAgICAgbGV0IG15VGhpcyA9IHRoaXM7XG4gICAgICAgIHV0dGVyYW5jZS5hZGRFdmVudExpc3RlbmVyKFwiZW5kXCIsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKG15VGhpcy5pc1N0cmVhbWluZykge1xuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCdpdGVtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzcGVlY2hTeW50aGVzaXMuY2FuY2VsKCk7XG4gICAgICAgIHNwZWVjaFN5bnRoZXNpcy5zcGVhayh1dHRlcmFuY2UpO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBTdG9wIHNwZWVjaCBvdXRwdXRcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0b3BTcGVlY2goKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gQ2FuY2VsIGFueSBhY3RpdmUgc3BlZWNoIHN5bnRoZXNpc1xuICAgICAgICBzcGVlY2hTeW50aGVzaXMuY2FuY2VsKCk7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFNldCB1cCBtdXRhdGlvbiB0cmFja2luZ1xuICAgICAqL1xuICAgIHByaXZhdGUgc2V0dXBNdXRhdGlvblRyYWNraW5nKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaXNTaG93aW5nQWxsLCBtdXRhdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2hvd2luZ0FsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHNpZGVPdmVybGF5ID0gbXV0YXRpb25zLmZpbHRlcihtdXRhdGlvbiA9PiBtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDEgXG4gICAgICAgICAgICAgICAgICAgICYmICEobXV0YXRpb24udGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiLmlibWEtc3Itb3ZlcmxheVwiKSlcbiAgICAgICAgICAgICAgICBpZiAob3V0c2lkZU92ZXJsYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk11dGF0aW9uc1wiLG91dHNpZGVPdmVybGF5KTtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbXlUaGlzID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgbXlUaGlzLnNob3dBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBteVRoaXMuc2hvd0FsbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnZpZXdlckRvYy5kb2N1bWVudEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMudmlld2VyRG9jLmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgIHN1YnRyZWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHVwIGZvY3VzIHRyYWNraW5nIHRvIHVwZGF0ZSB0aGUgcG9pbnQgb2YgcmVnYXJkIHdoZW4gZm9jdXMgY2hhbmdlc1xuICAgICAqL1xuICAgIHByaXZhdGUgc2V0dXBGb2N1c1RyYWNraW5nKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvY3VzSGFuZGxlciA9IChlOiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBTa2lwIGlmIHRoZSBmb2N1cyBpcyBvbiB0aGUgb3ZlcmxheSBpdHNlbGZcbiAgICAgICAgICAgIGlmIChlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmxheSAmJiB0YXJnZXQuY2xvc2VzdCgnLmlibWEtc3Itb3ZlcmxheScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChcImZvY3VzSGFuZGxlclwiKTtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHBvaW50IG9mIHJlZ2FyZCB0byB0aGUgbmV3bHkgZm9jdXNlZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250cm9sbGVyLnNldFBvaW50T2ZSZWdhcmQodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBBbm5vdW5jZSB0aGUgZm9jdXMgY2hhbmdlXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheS5kaXNwbGF5UmVzdWx0KHJlc3VsdCwgJ2ZvY3VzJywgJ2ZvY3VzJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlYWtSZXN1bHQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gQWRkIHRoZSBmb2N1cyBldmVudCBsaXN0ZW5lciB0byB0aGUgZG9jdW1lbnRcbiAgICAgICAgdGhpcy52aWV3ZXJEb2MuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMuZm9jdXNIYW5kbGVyKTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogQWN0aXZhdGUgKGNsaWNrKSB0aGUgZWxlbWVudCBhdCB0aGUgY3VycmVudCBwb2ludCBvZiByZWdhcmRcbiAgICAgKi9cbiAgICBwcml2YXRlIGFjdGl2YXRlQ3VycmVudEVsZW1lbnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gdGhpcy5jb250cm9sbGVyLmdldFBvaW50T2ZSZWdhcmQoKS5nZXRFbGVtZW50KCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIEFubm91bmNlIHRoYXQgd2UncmUgYWN0aXZhdGluZyB0aGUgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBBY3RpdmF0aW5nOiAke2N1cnJlbnRFbGVtZW50LnRleHRDb250ZW50IHx8IGN1cnJlbnRFbGVtZW50Lm5vZGVOYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmNvbnRyb2xsZXIuZ2V0UG9pbnRPZlJlZ2FyZCgpLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuY29udHJvbGxlci5nZXRQb2ludE9mUmVnYXJkKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlSZXN1bHQocmVzdWx0LCAnZm9jdXMnLCAnZm9jdXMnKTtcbiAgICAgICAgICAgIHRoaXMuc3BlYWtSZXN1bHQocmVzdWx0KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRm9jdXMgdGhlIGVsZW1lbnQgZmlyc3RcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5mb2N1cykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFNpbXVsYXRlIGEgY2xpY2sgb24gdGhlIGVsZW1lbnRcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyBUaGUgU1JDb250cm9sbGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgcHVibGljIGdldENvbnRyb2xsZXIoKTogU1JDb250cm9sbGVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSB2aWV3ZXIgYW5kIGNsZWFuIHVwIHJlc291cmNlc1xuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHRoaXMudmlld2VyRG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWJvYXJkSGFuZGxlcik7XG4gICAgICAgIHRoaXMudmlld2VyRG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCB0aGlzLmZvY3VzSGFuZGxlcik7XG4gICAgICAgIFxuICAgICAgICAvLyBTdG9wIGFueSBhY3RpdmUgc3BlZWNoXG4gICAgICAgIHRoaXMuc3RvcFNwZWVjaCgpO1xuICAgICAgICBcbiAgICAgICAgLy8gRGVzdHJveSBvdmVybGF5XG4gICAgICAgIHRoaXMub3ZlcmxheS5kZXN0cm95KCk7XG4gICAgfVxufSIsImltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4uL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBTUlJlbmRlcmVyUnVsZSB9IGZyb20gXCIuLi9TUlJlbmRlcmVyUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IE5hdmlnYXRpb25Nb2RlIH0gZnJvbSBcIi4uL1NSVHlwZXNcIjtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBuYW1lLCBzdXJyb3VuZGVkIGJ5IHRoZSBxdW90ZUNoYXJCZWZvcmUgYW5kIHF1b3RlQ2hhckFmdGVyIGFuZCBmb2xsb3dlZCBieSB0aGUgcGFkZGluZyBpZiB0aGUgbmFtZSBleGlzdHNcbiAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBmb3Igd2hpY2ggdG8gZmV0Y2ggdGhlIG5hbWVcbiAqIEBwYXJhbSBwYWRkaW5nIFN0cmluZyB0byBhZGQgYWZ0ZXIsIGlmIHRoZSBuYW1lIGV4aXN0c1xuICogQHBhcmFtIHF1b3RlQ2hhckJlZm9yZSBUaGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgbGVhZGluZyBxdW90ZSwgaWYgdGhlIG5hbWUgZXhpc3RzXG4gKiBAcGFyYW0gcXVvdGVDaGFyQmVmb3JlIFRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSB0cmFpbGluZyBxdW90ZSwgaWYgdGhlIG5hbWUgZXhpc3RzXG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcjogU1JDdXJzb3IsIHBhZGRpbmc/OiBzdHJpbmcsIHF1b3RlQ2hhckJlZm9yZT86IHN0cmluZywgcXVvdGVDaGFyQWZ0ZXI/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3Vyc29yLmdldE5hbWUoKSBcbiAgICAgICAgPyBgJHtxdW90ZU5hbWUoY3Vyc29yKX0ke3BhZGRpbmcgfHwgXCIsIFwifWBcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIFByb3ZpZGUgdGhlIG5hbWUsIHN1cnJvdW5kZWQgYnkgcXVvdGVzIGFuZCBwcmVjZWRlZCBieSB0aGUgcGFkZGluZyBpZiB0aGUgbmFtZSBleGlzdHNcbiAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBmb3Igd2hpY2ggdG8gZmV0Y2ggdGhlIG5hbWVcbiAqIEBwYXJhbSBwYWRkaW5nIFN0cmluZyB0byBhZGQgYmVmb3JlLCBpZiB0aGUgbmFtZSBleGlzdHMgKGRlZmF1bHRzIHRvIFwiLCBcIilcbiAqIEByZXR1cm5zIFRoZSBxdW90ZWQgbmFtZSB3aXRoIGxlYWRpbmcgcGFkZGluZywgb3IgZW1wdHkgc3RyaW5nIGlmIG5vIG5hbWUgZXhpc3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yOiBTUkN1cnNvciwgcGFkZGluZz86IHN0cmluZykge1xuICAgIHJldHVybiBjdXJzb3IuZ2V0TmFtZSgpXG4gICAgICAgID8gYCR7cGFkZGluZyB8fCBcIiwgXCJ9JHtxdW90ZU5hbWUoY3Vyc29yKX1gXG4gICAgICAgIDogXCJcIjtcbn1cblxuLyoqXG4gKiBQcm92aWRlIHRoZSBuYW1lIHN1cnJvdW5kZWQgYnkgcXVvdGUgY2hhcmFjdGVyc1xuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGZvciB3aGljaCB0byBmZXRjaCB0aGUgbmFtZVxuICogQHBhcmFtIHF1b3RlQ2hhckJlZm9yZSBUaGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgbGVhZGluZyBxdW90ZSAoZGVmYXVsdHMgdG8gXCIpXG4gKiBAcGFyYW0gcXVvdGVDaGFyQWZ0ZXIgVGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHRyYWlsaW5nIHF1b3RlIChkZWZhdWx0cyB0byBcIilcbiAqIEByZXR1cm5zIFRoZSBxdW90ZWQgbmFtZSwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vIG5hbWUgZXhpc3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZU5hbWUoY3Vyc29yOiBTUkN1cnNvciwgcXVvdGVDaGFyQmVmb3JlPzogc3RyaW5nLCBxdW90ZUNoYXJBZnRlcj86IHN0cmluZykge1xuICAgIHJldHVybiBjdXJzb3IuZ2V0TmFtZSgpXG4gICAgICAgID8gYCR7cXVvdGVDaGFyQmVmb3JlIHx8ICdcIid9JHtjdXJzb3IuZ2V0TmFtZSgpfSR7cXVvdGVDaGFyQWZ0ZXIgfHwgJ1wiJ31gXG4gICAgICAgIDogXCJcIjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHJvbGUgZGVzY3JpcHRpb24gZm9yIGFuIGVsZW1lbnQsIHVzaW5nIGFyaWEtcm9sZWRlc2NyaXB0aW9uIGlmIHByZXNlbnRcbiAqIEZhbGxzIGJhY2sgdG8gdGhlIHByb3ZpZGVkIGRlZmF1bHQgcm9sZSBuYW1lIGlmIGFyaWEtcm9sZWRlc2NyaXB0aW9uIGlzIG5vdCBzcGVjaWZpZWQgb3IgZW1wdHlcbiAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBwb3NpdGlvbmVkIGF0IHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gZGVmYXVsdFJvbGUgVGhlIGRlZmF1bHQgcm9sZSBuYW1lIHRvIHVzZSBpZiBhcmlhLXJvbGVkZXNjcmlwdGlvbiBpcyBub3QgcHJlc2VudFxuICogQHJldHVybnMgVGhlIHJvbGUgZGVzY3JpcHRpb24gKGVpdGhlciBjdXN0b20gb3IgZGVmYXVsdClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3I6IFNSQ3Vyc29yLCBkZWZhdWx0Um9sZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICBpZiAoIWVsZW0pIHJldHVybiBkZWZhdWx0Um9sZTtcbiAgICBcbiAgICBjb25zdCByb2xlRGVzY3JpcHRpb24gPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCIpO1xuICAgIGlmIChyb2xlRGVzY3JpcHRpb24gJiYgcm9sZURlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByb2xlRGVzY3JpcHRpb24udHJpbSgpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZGVmYXVsdFJvbGU7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIHNjcmVlbiByZWFkZXIgYW5ub3VuY2VtZW50IGZvciBhIGxpbmsgZWxlbWVudFxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHNhbWUtcGFnZSBsaW5rcyAoYW5jaG9ycykgYW5kIHJlZ3VsYXIgbGlua3NcbiAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBwb3NpdGlvbmVkIGF0IHRoZSBsaW5rIGVsZW1lbnRcbiAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgKGFmZmVjdHMgYW5ub3VuY2VtZW50IG9yZGVyKVxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBsaW5rIGFubm91bmNlbWVudCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmtBbm5vdW5jZW1lbnQoY3Vyc29yOiBTUkN1cnNvciwgbW9kZT86IE5hdmlnYXRpb25Nb2RlKTogc3RyaW5nIHtcbiAgICBsZXQgaHJlZjogc3RyaW5nID0gKChjdXJzb3IuZ2V0Tm9kZSgpIGFzIGFueSkuaHJlZikgfHwgXCJcIjtcbiAgICBsZXQgYW5ub3VuY2VTdHIgPSBcIlwiO1xuICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoZG9jdW1lbnQubG9jYXRpb24uaHJlZikgJiYgaHJlZi5jaGFyQXQoZG9jdW1lbnQubG9jYXRpb24uaHJlZi5sZW5ndGgpID09PSBcIiNcIikge1xuICAgICAgICBhbm5vdW5jZVN0ciA9IGBzYW1lIHBhZ2UgbGlua2A7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYW5ub3VuY2VTdHIgPSBgbGlua2A7XG4gICAgfVxuICAgIGxldCBuYW1lSW5mbyA9IGN1cnNvci5nZXROYW1lSW5mbygpO1xuICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHthbm5vdW5jZVN0cn1dYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7YW5ub3VuY2VTdHJ9JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYFske2Fubm91bmNlU3RyfV1gO1xufVxuXG4vKipcbiAqIEdldCB0aGUgZGVzY3JpcHRpb24gdGV4dCBmcm9tIGFyaWEtZGVzY3JpYmVkYnkgcmVmZXJlbmNlc1xuICogUmVzb2x2ZXMgYWxsIElEcyBpbiBhcmlhLWRlc2NyaWJlZGJ5IGFuZCBjb25jYXRlbmF0ZXMgdGhlaXIgdGV4dCBjb250ZW50XG4gKiBAcGFyYW0gZWxlbSBUaGUgZWxlbWVudCB3aXRoIGFyaWEtZGVzY3JpYmVkYnkgYXR0cmlidXRlXG4gKiBAcGFyYW0gbW9kZSBUaGUgbmF2aWdhdGlvbiBtb2RlIChyZXR1cm5zIGVtcHR5IHN0cmluZyBpbiBcIml0ZW1cIiBtb2RlKVxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkZXNjcmlwdGlvbiB0ZXh0IHdpdGggbGVhZGluZyBjb21tYSBhbmQgcXVvdGVzLCBvciBlbXB0eSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGVsZW06IEhUTUxFbGVtZW50LCBtb2RlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZXNjcmliZWRCeSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiKTtcbiAgICBpZiAoIWRlc2NyaWJlZEJ5KSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBkZXNjcmlwdGlvbkVsZW1zID0gZGVzY3JpYmVkQnlcbiAgICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgICAgLm1hcChpZCA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpXG4gICAgICAgIC5maWx0ZXIoZGVzY0VsZW0gPT4gISFkZXNjRWxlbSkgYXMgSFRNTEVsZW1lbnRbXTtcblxuICAgIGNvbnN0IGRlc2NyaXB0aW9uVGV4dCA9IGRlc2NyaXB0aW9uRWxlbXNcbiAgICAgICAgLm1hcChkZXNjRWxlbSA9PiBkZXNjRWxlbS50ZXh0Q29udGVudD8udHJpbSgpKVxuICAgICAgICAuZmlsdGVyKHRleHQgPT4gISF0ZXh0KVxuICAgICAgICAuam9pbihcIiBcIik7XG5cbiAgICBpZiAoIWRlc2NyaXB0aW9uVGV4dCB8fCBkZXNjcmlwdGlvblRleHQubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIpIHJldHVybiBgLCBcXHUwMDAxJHtkZXNjcmlwdGlvblRleHR9XFx1MDAwMmA7XG4gICAgcmV0dXJuIGAsIFwiJHtkZXNjcmlwdGlvblRleHR9XCJgO1xufVxuXG4vKipcbiAqIEdldCBzdGF0ZSBhbm5vdW5jZW1lbnRzIGZvciBkaXNhYmxlZCwgcmVhZG9ubHksIHJlcXVpcmVkLCBhbmQgaW52YWxpZCBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0gZWxlbSBUaGUgZWxlbWVudCB0byBjaGVjayBmb3Igc3RhdGUgYXR0cmlidXRlc1xuICogQHJldHVybnMgQSBzdHJpbmcgd2l0aCBzdGF0ZSBhbm5vdW5jZW1lbnRzIChlLmcuLCBcIiwgZGlzYWJsZWRcIiwgXCIsIHJlYWQgb25seVwiLCBcIiwgcmVxdWlyZWRcIiwgXCIsIGludmFsaWRcIilcbiAqL1xuZnVuY3Rpb24gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGVsZW06IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgICBsZXQgc3RhdGVzID0gXCJcIjtcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgZGlzYWJsZWQgc3RhdGUgKGJvdGggYXR0cmlidXRlIGFuZCBhcmlhLWRpc2FibGVkKVxuICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1kaXNhYmxlZFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgc3RhdGVzICs9IFwiLCBkaXNhYmxlZFwiO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcmVhZG9ubHkgc3RhdGUgKGJvdGggYXR0cmlidXRlIGFuZCBhcmlhLXJlYWRvbmx5KVxuICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInJlYWRvbmx5XCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1yZWFkb25seVwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgc3RhdGVzICs9IFwiLCByZWFkIG9ubHlcIjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHN0YXRlIChib3RoIGF0dHJpYnV0ZSBhbmQgYXJpYS1yZXF1aXJlZClcbiAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcmVxdWlyZWRcIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgIHN0YXRlcyArPSBcIiwgcmVxdWlyZWRcIjtcbiAgICAgICAgLy8gQSByZXF1aXJlZCA8c2VsZWN0PiB3aG9zZSBzZWxlY3RlZCB2YWx1ZSBpcyBcIlwiIGlzIGltcGxpY2l0bHkgaW52YWxpZCDigJRcbiAgICAgICAgLy8gSkFXUyBhbmQgTlZEQSBhbm5vdW5jZSBcImludmFsaWQgZW50cnlcIiBpbiB0aGlzIGNhc2UuXG4gICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0VMRUNUXCIgJiYgKGVsZW0gYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbGlkaXR5LnZhbHVlTWlzc2luZykge1xuICAgICAgICAgICAgc3RhdGVzICs9IFwiLCBpbnZhbGlkIGVudHJ5XCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBzdGF0ZSAoYXJpYS1pbnZhbGlkKVxuICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaW52YWxpZFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgc3RhdGVzICs9IFwiLCBpbnZhbGlkXCI7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzdGF0ZXM7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBsaXN0aXRlbSBjb250YWlucyBpbnRlcmFjdGl2ZS93aWRnZXQgZWxlbWVudHNcbiAqIFNjcmVlbiByZWFkZXJzIHR5cGljYWxseSBkb24ndCByZWFkIHRoZSBhY2Nlc3NpYmxlIG5hbWUgb2YgYSBsaXN0aXRlbSB3aGVuIGl0IGNvbnRhaW5zIGludGVyYWN0aXZlIGVsZW1lbnRzXG4gKiBVc2VzIERPTVdhbGtlciB0byBwcm9wZXJseSB0cmF2ZXJzZSBzaGFkb3cgRE9NIGFuZCBvdGhlciBjb21wbGV4IHN0cnVjdHVyZXNcbiAqL1xuZnVuY3Rpb24gbGlzdGl0ZW1Db250YWluc0ludGVyYWN0aXZlRWxlbWVudChjdXJzb3I6IFNSQ3Vyc29yKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgaWYgKCFlbGVtKSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgLy8gVXNlIERPTVdhbGtlciB0byB0cmF2ZXJzZSB0aGUgZW50aXJlIHN1YnRyZWUgaW5jbHVkaW5nIHNoYWRvdyBET01cbiAgICBjb25zdCB3YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGVsZW0sIGZhbHNlLCBlbGVtLCBmYWxzZSk7XG4gICAgXG4gICAgLy8gV2FsayB0aHJvdWdoIGFsbCBkZXNjZW5kYW50c1xuICAgIHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgICAvLyBPbmx5IGNoZWNrIGVsZW1lbnQgbm9kZXMgYXQgc3RhcnQgdGFnc1xuICAgICAgICBpZiAod2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgIXdhbGtlci5iRW5kVGFnKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHdhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChyb2xlICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucm9sZVR5cGUgPT09ICd3aWRnZXQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFuIGlmcmFtZSdzIGNvbnRlbnQgY2FuIGJlIGFjY2Vzc2VkIChub3QgY3Jvc3Mtb3JpZ2luKVxuICogQXR0ZW1wdHMgdG8gYWNjZXNzIHRoZSBpZnJhbWUncyBkb2N1bWVudCB0byBkZXRlcm1pbmUgaWYgaXQncyBhY2Nlc3NpYmxlXG4gKiBAcGFyYW0gaWZyYW1lIFRoZSBpZnJhbWUgZWxlbWVudCB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaWZyYW1lIGNvbnRlbnQgaXMgYWNjZXNzaWJsZSwgZmFsc2UgaWYgY3Jvc3Mtb3JpZ2luIG9yIGJsb2NrZWRcbiAqL1xuZnVuY3Rpb24gY2FuQWNjZXNzRnJhbWUoaWZyYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB0aHJvd3MgYSBET01FeGNlcHRpb24gZm9yIGNyb3NzLW9yaWdpbiBmcmFtZXNcbiAgICAgICAgY29uc3QgZG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgcmV0dXJuIGRvYyAhPT0gbnVsbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gaWYgKGUgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiYgZS5uYW1lID09PSAnU2VjdXJpdHlFcnJvcicpIHtcbiAgICAgICAgLy8gICAgIHJldHVybiBmYWxzZTsgLy8gQ3Jvc3Mtb3JpZ2luLCBhY2Nlc3MgYmxvY2tlZFxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIHRocm93IGU7IC8vIFJlLXRocm93IHVuZXhwZWN0ZWQgZXJyb3JzXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUlVMRVM6IFNSUmVuZGVyZXJSdWxlW10gPSBbXG4gICAgLy8gU2luZ2xlIHJvbGUgcnVsZXMgLSBhbHBoYWJldGljYWxseSBzb3J0ZWRcbiAgICBcbiAgICAvLyBCdXR0b24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJidXR0b25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJidXR0b25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbdG9nZ2xlICR7cm9sZURlc2N9LCBwcmVzc2VkJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX0ke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhlbGVtLCBtb2RlKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImJ1dHRvblwiKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXByZXNzZWRcIikgPT09IFwiZmFsc2VcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFt0b2dnbGUgJHtyb2xlRGVzY30sIG5vdCBwcmVzc2VkJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX0ke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhlbGVtLCBtb2RlKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBsZXQgZXhwYW5kU3RyID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgIGlmIChbXCJtZW51XCIsIFwidHJ1ZVwiXS5pbmNsdWRlcyhlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZFN0ciArPSBcIiwgbWVudVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZFN0ciArPSBgLCAke2VsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKSA9PT0gXCJ0cnVlXCIgPyBcImV4cGFuZGVkXCIgOiBcImNvbGxhcHNlZFwifWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4cGFuZFN0ciArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9JHtleHBhbmRTdHJ9JHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoZWxlbSwgbW9kZSl9XWA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHsgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gXCJcIjsgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDaGVja2JveCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiY2hlY2tib3hcIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImNoZWNrYm94XCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhdGVTdHIgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikgPT09IFwibWl4ZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTdHIgPSBcImhhbGYgY2hlY2tlZFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJDaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hlY2tlZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1jaGVja2VkXCIpID09PSBcInRydWVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoZWNrZWQgPSBlbGVtLmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0ciA9IGJDaGVja2VkID8gXCJjaGVja2VkXCIgOiBcIm5vdCBjaGVja2VkXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RhdGVTdHIgKz0gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3JvbGVEZXNjfSwgJHtzdGF0ZVN0cn0ke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV1gXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDZWxsLCBDb2x1bW5oZWFkZXIsIGFuZCBSb3doZWFkZXIgcm9sZXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcInJvd2hlYWRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYmxlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgY2VsbCBlbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbEVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGlmICghY2VsbEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjZWxsIGhhcyBhbnkgdmlzaWJsZSBjb250ZW50IGJ5IGNoZWNraW5nOlxuICAgICAgICAgICAgICAgIC8vIDEuIFRleHQgY29udGVudCAodHJpbW1lZClcbiAgICAgICAgICAgICAgICAvLyAyLiBDaGlsZCBlbGVtZW50cyB3aXRoIHJvbGVzIChidXR0b25zLCBsaW5rcywgZXRjLilcbiAgICAgICAgICAgICAgICAvLyAzLiBJbWFnZXMgd2l0aCBhbHQgdGV4dFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gY2VsbEVsZW0udGV4dENvbnRlbnQ/LnRyaW0oKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjaGlsZCBlbGVtZW50cyB3aXRoIGludGVyYWN0aXZlIHJvbGVzIG9yIGNvbnRlbnRcbiAgICAgICAgICAgICAgICBjb25zdCB3YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGNlbGxFbGVtLCBmYWxzZSwgY2VsbEVsZW0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBsZXQgaGFzQ29udGVudCA9IHRleHRDb250ZW50Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBlbGVtZW50cyB0aGF0IHdvdWxkIGhhdmUgY29udGVudCAoYnV0dG9ucywgbGlua3MsIGltYWdlcywgZXRjLilcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgIXdhbGtlci5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IHdhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGludGVyYWN0aXZlIGVsZW1lbnRzIG9yIGVsZW1lbnRzIHdpdGggYWNjZXNzaWJsZSBuYW1lc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb2xlICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBpbWFnZXMgd2l0aCBhbHQgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSU1HXCIgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY2VsbCBpcyBlbXB0eSwgcmV0dXJuIFwiW2JsYW5rXVwiXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIltibGFua11cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gbnVsbCB0byBsZXQgZGVmYXVsdCByZW5kZXJpbmcgY29udGludWVcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29tYm9ib3ggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImNvbWJvXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzRW5kVGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJjb21ibyBib3hcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gXCIsIGNvbGxhcHNlZFwiO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdEVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVFbGVtID0gc2VsZWN0RWxlbS5zZWxlY3RlZEluZGV4ID49IDAgPyBzZWxlY3RFbGVtLm9wdGlvbnNbc2VsZWN0RWxlbS5zZWxlY3RlZEluZGV4XSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZVN0ciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gbmV3IFNSQ3Vyc29yKHZhbHVlRWxlbSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHIgPSBxdW90ZU5hbWVQYWRCZWZvcmUodGVtcCwgXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfSR7c3RhdGV9JHt2YWx1ZVN0cn1dYDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJTlBVVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gYCwgJHtlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikgPT09IFwidHJ1ZVwiID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlICs9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9JHtzdGF0ZX0sIGhhcyBhdXRvIGNvbXBsZXRlLCBlZGl0YWJsZSwgb3BlbnMgbGlzdF1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gYCwgJHtlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikgPT09IFwidHJ1ZVwiID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBgLCBoYXMgYXV0byBjb21wbGV0ZWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgKz0gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGVsZW0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgY3VycmVudCB2YWx1ZSB0byBhbm5vdW5jZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gMS4gSWYgZXhwYW5kZWQgYW5kIGFyaWEtY29udHJvbHMgcG9pbnRzIHRvIGEgbGlzdGJveCwgdXNlIHRoZSBhcmlhLXNlbGVjdGVkIG9wdGlvbiB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC8vIDIuIE90aGVyd2lzZSB1c2UgdGhlIGNvbWJvYm94IGVsZW1lbnQncyBvd24gdGV4dCBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZVN0ciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xzSWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvcHVwID0gY29udHJvbHNJZCA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRyb2xzSWQpIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcHVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHBvcHVwLnF1ZXJ5U2VsZWN0b3IoXCJbcm9sZT0nb3B0aW9uJ11bYXJpYS1zZWxlY3RlZD0ndHJ1ZSddXCIpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyID0gYCwgXCIkeyhzZWxlY3RlZE9wdGlvbi50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCl9XCJgO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWVTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gKGVsZW0udGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHIgPSBgLCBcIiR7dGV4dENvbnRlbnR9XCJgO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9JHtzdGF0ZX0ke3ZhbHVlU3RyfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdGJveCByb2xlIC0gY292ZXJzIDxzZWxlY3Qgc2l6ZT4gLyA8c2VsZWN0IG11bHRpcGxlPlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJsaXN0Ym94XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiY29tYm9cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImxpc3QgYm94XCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGxldCBzdGF0ZSA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdEVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbnMgPSBBcnJheS5mcm9tKHNlbGVjdEVsZW0ub3B0aW9ucykuZmlsdGVyKG8gPT4gby5zZWxlY3RlZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlU3RyID0gc2VsZWN0ZWRPcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKG8gPT4gcXVvdGVOYW1lUGFkQmVmb3JlKG5ldyBTUkN1cnNvcihvLCBmYWxzZSksIFwiLCBcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgKz0gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY30ke3N0YXRlfSR7dmFsdWVTdHJ9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEFSSUEgbGlzdGJveCAobm9uLXNlbGVjdClcbiAgICAgICAgICAgICAgICBzdGF0ZSArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSAoZWxlbS50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVTdHIgPSB0ZXh0Q29udGVudCA/IGAsIFwiJHt0ZXh0Q29udGVudH1cImAgOiBcIlwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfSR7c3RhdGV9JHt2YWx1ZVN0cn1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRGVmYXVsdCByb2xlIChmYWxsYmFjaylcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZGVmYXVsdFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID9cbiAgICAgICAgICAgICAgICBgISE8JHtjdXJzb3IuZ2V0Um9sZSgpfT4keyhjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSArIFwiXCIpfSEhYCA6XG4gICAgICAgICAgICAgICAgYCEhPC8ke2N1cnNvci5nZXRSb2xlKCl9PiEhYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBEZWxldGlvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImRlbGV0aW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IChjdXJzb3IuaXNTdGFydFRhZygpICYmIGBbZGVsZXRlZF1gIHx8IFwiXCIpXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIERpYWxvZyByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImRpYWxvZ1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5pc0VuZFRhZygpID8gYFtFbmQgb2YgZGlhbG9nXWAgOiBgW1N0YXJ0IG9mIGRpYWxvZyR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29udGVudGVkaXRhYmxlIChlZGl0YWJsZSByZWdpb24pIC0gZWxlbWVudHMgd2l0aCBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgKG9yIFwiXCIpXG4gICAgLy8gTXVzdCBjb21lIGJlZm9yZSB0aGUgZ2VuZXJpYy9kb2N1bWVudCBydWxlIHNvIGl0IHRha2VzIHByZWNlZGVuY2UuXG4gICAgLy8gU2NyZWVuIHJlYWRlcnMgKEpBV1MvTlZEQSkgYW5ub3VuY2UgdGhlc2UgYXMgYW4gZWRpdGFibGUgc2VjdGlvbiB3aGVuIGVudGVyaW5nXG4gICAgLy8gYW5kIFwib3V0IG9mIHNlY3Rpb25cIiB3aGVuIGxlYXZpbmcuXG4gICAgLy8gV2UgdXNlIGEgYnJvYWQgZWxlbWVudCBsaXN0IChjb3ZlcmluZyB0aGUgbW9zdCBjb21tb24gaG9zdCBlbGVtZW50cykgcGx1c1xuICAgIC8vIFwiZ2VuZXJpY1wiIGFuZCBcInBhcmFncmFwaFwiIHJvbGVzIHNvIGJvdGggYmFyZSA8ZGl2PiBhbmQgbGFiZWxsZWQgdmFyaWFudHMgYXJlIGNhdWdodC5cbiAgICAvLyBUaGUgdGVzdCBmdW5jdGlvbiBhbHdheXMgY2hlY2tzIHRoZSBhdHRyaWJ1dGUgYW5kIGJhaWxzIG91dCB3aGVuOlxuICAgIC8vICAgLSB0aGUgYXR0cmlidXRlIGlzIGFic2VudCBvciBcImZhbHNlXCJcbiAgICAvLyAgIC0gYW4gZXhwbGljaXQgQVJJQSByb2xlIG92ZXJyaWRlcyB0aGUgc2VtYW50aWNzIChlLmcuIHJvbGU9XCJ0ZXh0Ym94XCIpXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImdlbmVyaWNcIiwgXCJwYXJhZ3JhcGhcIl0sXG4gICAgICAgIGVsZW1zOiBbXCJESVZcIiwgXCJTUEFOXCIsIFwiUFwiLCBcIlNFQ1RJT05cIiwgXCJBUlRJQ0xFXCIsIFwiSEVBREVSXCIsIFwiRk9PVEVSXCIsIFwiTUFJTlwiLCBcIkFTSURFXCIsIFwiTkFWXCIsIFwiTElcIiwgXCJURFwiLCBcIlRIXCIsIFwiUFJFXCIsIFwiQkxPQ0tRVU9URVwiLCBcIkZJR1VSRVwiLCBcIkZJR0NBUFRJT05cIiwgXCJERVRBSUxTXCIsIFwiU1VNTUFSWVwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBjZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjZSAhPT0gXCJ0cnVlXCIgJiYgY2UgIT09IFwiXCIpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIC8vIERlZmVyIHRvIHRoZSBleHBsaWNpdC1yb2xlIHJ1bGUgd2hlbiBhbiBhdXRob3IgcHJvdmlkZXMgYSBjb25jcmV0ZSBBUklBIHJvbGVcbiAgICAgICAgICAgICAgICAvLyAoZS5nLiByb2xlPVwidGV4dGJveFwiKSDigJQgdGhvc2Ugcm9sZXMgY2FycnkgcmljaGVyIHNlbWFudGljcyBhbmQgdGhlaXIgb3duIHJ1bGVzLlxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIC8vIDxwPiByZXRhaW5zIGl0cyBcInBhcmFncmFwaFwiIHNlbWFudGljcyBldmVuIHdoZW4gZWRpdGFibGUuXG4gICAgICAgICAgICAgICAgY29uc3QgaXNQYXJhZ3JhcGggPSBjdXJzb3IuZ2V0Um9sZSgpID09PSBcInBhcmFncmFwaFwiIHx8IGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJQXCI7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlID09PSBcIml0ZW1cIiA/IChpc1BhcmFncmFwaCA/IFwiW291dCBvZiBwYXJhZ3JhcGhdXCIgOiBcIltvdXQgb2Ygc2VjdGlvbl1cIikgOiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBhcmlhLXJlYWRvbmx5IGlzIG5vdCBhIHN1cHBvcnRlZCBzdGF0ZSBvbiBjb250ZW50ZWRpdGFibGUgZWxlbWVudHMg4oCUXG4gICAgICAgICAgICAgICAgLy8gc2NyZWVuIHJlYWRlcnMgKEpBV1MvTlZEQSkgaWdub3JlIGl0IGVudGlyZWx5LCBzbyB3ZSBleGNsdWRlIGl0IGhlcmUuXG4gICAgICAgICAgICAgICAgLy8gT25seSBkaXNhYmxlZCBpcyBtZWFuaW5nZnVsIChpdCBvdmVycmlkZXMgdGhlIGVkaXRhYmxlIHNlbWFudGljcykuXG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlQW5ub3VuY2VtZW50cyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZUFubm91bmNlbWVudHMgPSBcIiwgZGlzYWJsZWRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyV29yZCA9IGlzUGFyYWdyYXBoID8gXCJwYXJhZ3JhcGhcIiA6IFwic2VjdGlvblwiO1xuICAgICAgICAgICAgICAgIC8vIEluIHRhYl9mb2N1cyBtb2RlLCBvbmx5IGFwcGVuZCB0ZXh0Q29udGVudCB3aGVuIHRoZSBhY2Nlc3NpYmxlIG5hbWVcbiAgICAgICAgICAgICAgICAvLyBpcyBleHRyaW5zaWMgKGFyaWEtbGFiZWwgLyBhcmlhLWxhYmVsbGVkYnksIGkuZS4gbmFtZUZyb20g4omgIFwiY29udGVudFwiL1widGV4dFwiKS5cbiAgICAgICAgICAgICAgICAvLyBXaGVuIG5hbWVGcm9tIElTIFwiY29udGVudFwiLCBqdW1wQ3VycmVudEVuZCBhbHJlYWR5IHdhbGtzIGNoaWxkcmVuIHNvXG4gICAgICAgICAgICAgICAgLy8gYXBwZW5kaW5nIGFnYWluIHdvdWxkIGR1cGxpY2F0ZSB0aGUgdGV4dC5cbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lSW5mbyA9IGN1cnNvci5nZXROYW1lSW5mbygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVGcm9tQ29udGVudCA9ICFuYW1lSW5mbyB8fCBbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhbmFtZUZyb21Db250ZW50KSA/IGVsZW0udGV4dENvbnRlbnQ/LnRyaW0oKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFN1ZmZpeCA9IHRleHRDb250ZW50ID8gYCAke3RleHRDb250ZW50fWAgOiBcIlwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke2NvbnRhaW5lcldvcmR9LCBlZGl0YWJsZSR7c3RhdGVBbm5vdW5jZW1lbnRzfV0ke2NvbnRlbnRTdWZmaXh9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRG9jdW1lbnQgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJkb2N1bWVudFwiLCBcImdlbmVyaWNcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoKSA9PiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEdyYXBoaWNzIGRvY3VtZW50IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JhcGhpY3MtZG9jdW1lbnRcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJpbWFnZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgIWN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICYmIGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFubm91bmNlIHVubGFiZWxlZCBncmFwaGljcyB0aGF0IGFyZSBoaWRkZW4gaW5zaWRlIGxpbmtzIG9yIGhlYWRpbmdzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEhlYWRpbmdPckxpbmsgPSBjdXJzb3IuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiaGVhZGluZ1wiLCBcImxpbmtcIl0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SGVhZGluZ09yTGluayAmJiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjdXJzb3IuZ2V0RWxlbWVudCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW1VubGFiZWxlZCBncmFwaGljXVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgKGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lID09PSBcIlwiKSkgPyBcIlwiIDogbnVsbCxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSAmJiBgW2dyYXBoaWMke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gKSB8fCBudWxsLFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IChjdXJzb3IuaXNFbmRUYWcoKSkgPyBcIlwiIDogbnVsbFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBIZWFkaW5nIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yOiBTUkN1cnNvciwgbW9kZTogTmF2aWdhdGlvbk1vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiBjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgY3Vyc29yLmlzRW5kVGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGxldCBsZXZlbDogc3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmFyaWFMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFeHBsaWNpdCBhcmlhLWxldmVsIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IG5vZGUuYXJpYUxldmVsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ2hlYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJvbGU9XCJoZWFkaW5nXCIgd2l0aG91dCBhcmlhLWxldmVsIGRlZmF1bHRzIHRvIDJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAnMic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTmF0aXZlIGhlYWRpbmcgZWxlbWVudCAoaDEtaDYpLCBleHRyYWN0IG51bWJlciBmcm9tIHRhZyBuYW1lXG4gICAgICAgICAgICAgICAgICAgIGxldmVsID0gbm9kZS5ub2RlTmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IG5hbWVJbmZvID0gY3Vyc29yLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICAgICAgaWYgKCghbmFtZUluZm8gfHwgW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSAmJiAhKG5vZGUudGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW2hlYWRpbmcgbGV2ZWwgJHtsZXZlbH0ke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW2hlYWRpbmcgbGV2ZWwgJHtsZXZlbH1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIC0tIGluIGhlYWRpbmcgbW9kZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJoZWFkaW5nXCIsIFwiaDFcIiwgXCJoMlwiLCBcImgzXCIsIFwiaDRcIiwgXCJoNVwiLCBcImg2XCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxldmVsOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5hcmlhTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0IGFyaWEtbGV2ZWwgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IG5vZGUuYXJpYUxldmVsO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdoZWFkaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm9sZT1cImhlYWRpbmdcIiB3aXRob3V0IGFyaWEtbGV2ZWwgZGVmYXVsdHMgdG8gMlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAnMic7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXRpdmUgaGVhZGluZyBlbGVtZW50IChoMS1oNiksIGV4dHJhY3QgbnVtYmVyIGZyb20gdGFnIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gbm9kZS5ub2RlTmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZUluZm8gPSBjdXJzb3IuZ2V0TmFtZUluZm8oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghbmFtZUluZm8gfHwgW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSAmJiAhKG5vZGUudGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWhlYWRpbmcgbGV2ZWwgJHtsZXZlbH1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEltYWdlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiaW1nXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiaW1hZ2VcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICYmIGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhbm5vdW5jZSB1bmxhYmVsZWQgZ3JhcGhpY3MgdGhhdCBhcmUgaGlkZGVuIGluc2lkZSBsaW5rcyBvciBoZWFkaW5nc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZXNlIHdlcmUgb25seSBpbmNsdWRlZCBiZWNhdXNlIG9mIHRoZSBTS0lQX0lURU1fQkVIQVZJT1IgY2hhbmdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SGVhZGluZ09yTGluayA9IGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJoZWFkaW5nXCIsIFwibGlua1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SGVhZGluZ09yTGluayAmJiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjdXJzb3IuZ2V0RWxlbWVudCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW1VubGFiZWxlZCBncmFwaGljXVwiXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbZ3JhcGhpYyR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSW5zZXJ0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiaW5zZXJ0aW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IChjdXJzb3IuaXNTdGFydFRhZygpICYmIGBbaW5zZXJ0ZWRdYCB8fCBcIlwiKVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBMaW5rIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibGlua1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcImxpbmtcIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcjogU1JDdXJzb3IsIG1vZGU6IE5hdmlnYXRpb25Nb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldExpbmtBbm5vdW5jZW1lbnQoY3Vyc29yLCBtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIExpc3RpdGVtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibGlzdGl0ZW1cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc09yZGVyZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudExpc3RFbGVtOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBsZXQgd2Fsa1BhcmVudHMgPSBET01XYWxrZXIucGFyZW50Tm9kZShjdXJzb3IuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAodHlwZW9mIGlzT3JkZXJlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiB3YWxrUGFyZW50cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2Fsa1BhcmVudHMubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB3YWxrUGFyZW50cyBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpID09PSBcImxpc3RcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09yZGVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TGlzdEVsZW0gPSBlbGVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlVMXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09yZGVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRMaXN0RWxlbSA9IGVsZW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJPTFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPcmRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRMaXN0RWxlbSA9IGVsZW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2Fsa1BhcmVudHMgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrUGFyZW50cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGxpc3RpdGVtIGNvbnRhaW5zIGludGVyYWN0aXZlIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgLy8gU2NyZWVuIHJlYWRlcnMgZG9uJ3QgcmVhZCB0aGUgYWNjZXNzaWJsZSBuYW1lIHdoZW4gaW50ZXJhY3RpdmUgZWxlbWVudHMgYXJlIHByZXNlbnRcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNJbnRlcmFjdGl2ZUNvbnRlbnQgPSBsaXN0aXRlbUNvbnRhaW5zSW50ZXJhY3RpdmVFbGVtZW50KGN1cnNvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVRvVXNlID0gaGFzSW50ZXJhY3RpdmVDb250ZW50ID8gXCJcIiA6IChjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSB8fCBcIlwiKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgcmV0U3RyID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoIWlzT3JkZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiTElcIiAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKS5saXN0U3R5bGVUeXBlID09PSBcIm5vbmVcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gXCJMSVwiKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRTdHIgPSBjdXJzb3IuaXNTdGFydFRhZygpID8gYCR7bmFtZVRvVXNlfWAgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0U3RyID0gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGBbYnVsbGV0XSAke25hbWVUb1VzZX1gIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBvcmRlcmVkIGxpc3RzLCBjb3VudCBzaWJsaW5nIGxpc3RpdGVtcyBhbmQgYWNjb3VudCBmb3Igc3RhcnQgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IDE7IC8vIFN0YXJ0IGF0IDEgYnkgZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBzdGFydCBhdHRyaWJ1dGUgaWYgaXQgZXhpc3RzIG9uIHRoZSA8b2w+IGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudExpc3RFbGVtICYmIHBhcmVudExpc3RFbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdPTCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExpc3RFbGVtLmhhc0F0dHJpYnV0ZSgnc3RhcnQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHBhcnNlSW50KHBhcmVudExpc3RFbGVtLmdldEF0dHJpYnV0ZSgnc3RhcnQnKSB8fCAnMScsIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gaXNOYU4oc3RhcnRWYWx1ZSkgPyAxIDogc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgcHJldmlvdXMgc2libGluZyBsaXN0aXRlbXMgYXQgdGhlIHNhbWUgbGV2ZWwgdXNpbmcgRE9NV2Fsa2VyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpYmxpbmcgPSBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QoY3VycmVudEVsZW0pO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb3VudCBkaXJlY3Qgc2libGluZ3MgdGhhdCBhcmUgbGlzdGl0ZW1zIChlbGVtZW50IG5vZGVzIG9ubHkpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZy5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdFbGVtID0gc2libGluZyBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZ0VsZW0uZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdsaXN0aXRlbScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZ0VsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0xJJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmcgPSBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3Qoc2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHJldFN0ciA9IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgJHtjb3VudH0uICR7bmFtZVRvVXNlfWAgOiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0U3RyO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYXRoIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWF0aFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNFbmRUYWcoKSA/IGBbbWF0aCBjb250ZW50XWAgOiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIExpbmsgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJtZW51aXRlbVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGlzU3ViTWVudUNvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgKGxldCBjaGVja0NoaWxkcmVuPWN1cnNvci5nZXROb2RlKCkuZmlyc3RDaGlsZDsgIWlzU3ViTWVudUNvbnRhaW5lciAmJiBjaGVja0NoaWxkcmVuICE9PSBudWxsOyBjaGVja0NoaWxkcmVuID0gY2hlY2tDaGlsZHJlbi5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaXNTdWJNZW51Q29udGFpbmVyID0gY2hlY2tDaGlsZHJlbi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlVMXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGlzU3ViTWVudUNvbnRhaW5lcikgcmV0dXJuIFwiWz8/Pz9tZW51XVwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhwYW5kU3RyID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRTdHIgKz0gXCIsIHN1Yi1tZW51XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kU3RyICs9IGAsICR7ZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpID09PSBcInRydWVcIiA/IFwiZXhwYW5kZWRcIiA6IFwiY29sbGFwc2VkXCJ9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGBbbWVudSR7ZXhwYW5kU3RyfWA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lSW5mbyA9IGN1cnNvci5nZXROYW1lSW5mbygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZUluZm8gJiYgIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKG5hbWVJbmZvLm5hbWVGcm9tKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IHF1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBcIl1cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTWV0ZXIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJtZXRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtwcm9ncmVzcyBiYXIsICR7KChjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKX1dYCA6IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUHJvZ3Jlc3NiYXIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJwcm9ncmVzc2JhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtwcm9ncmVzcyBiYXIsICR7KChjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKX1dYCA6IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUmFkaW8gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJyYWRpb1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwicmFkaW8gYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYkNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFwiYXJpYS1jaGVja2VkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiQ2hlY2tlZCA9IGN1cnNvci5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFwiYXJpYS1jaGVja2VkXCIpID09PSBcInRydWVcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJDaGVja2VkID0gKGN1cnNvci5nZXROb2RlKCkgYXMgYW55KS5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGF0ZVN0ciA9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtyb2xlRGVzY30sICR7YkNoZWNrZWQgPyBcImNoZWNrZWRcIiA6IFwibm90IGNoZWNrZWRcIn0ke3N0YXRlU3RyfSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9JHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XWBcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFNlYXJjaGJveCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInNlYXJjaGJveFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9ZWRpdF1gIDogXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTZXBhcmF0b3Igcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzZXBhcmF0b3JcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgYFtzZXBhcmF0b3JdYCB8fCBcIlwiKVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTbGlkZXIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzbGlkZXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwic2xpZGVyXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBhcmlhLXZhbHVlbm93IGZpcnN0LCB0aGVuIGZhbGwgYmFjayB0byBuYXRpdmUgdmFsdWUgcHJvcGVydHlcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKVxuICAgICAgICAgICAgICAgICAgICA/IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKVxuICAgICAgICAgICAgICAgICAgICA6IChjdXJzb3IuZ2V0Tm9kZSgpIGFzIGFueSkudmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9LCAke3ZhbHVlfSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTcGluYnV0dG9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wic3BpbmJ1dHRvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzcGluYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfSwgZWRpdGFibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVGFiIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widGFiXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJ0YWJcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtyb2xlRGVzY30keyhjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXNlbGVjdGVkXCIpID09PSBcInRydWVcIiA/IFwiLCBzZWxlY3RlZFwiIDogXCJcIn0ke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWJsaXN0IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widGFibGlzdFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtncm91cCBzdGFydCR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbZ3JvdXAgZW5kJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRhYnBhbmVsIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widGFicGFuZWxcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbVGFiIHBhbmVsIHN0YXJ0JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtUYWIgcGFuZWwgZW5kJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRleHQgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0ZXh0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwibGlua1wiLCBcInRhYl9mb2N1c1wiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpIHx8ICFjdXJzb3IuZ2V0UGFyZW50RWxlbWVudCgpPy5nZXRFbGVtZW50KCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0UGFyZW50RWxlbWVudCgpPy5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pLnRleHREZWNvcmF0aW9uTGluZSA9PT0gXCJsaW5lLXRocm91Z2hcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtzdHJpa2V0aHJvdWdoXSAkeyhjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSArIFwiXCIpfSBbZW5kIHN0cmlrZXRocm91Z2hdYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAkeyhjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSArIFwiXCIpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIC0tIGluIGhlYWRpbmcgbW9kZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0ZXh0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVGV4dGJveCByb2xlXG4gICAgICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgICAgICByb2xlczogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlID09PSBcIml0ZW1cIiAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVEVYVEFSRUFcIiA/IFwiW291dCBvZiBlZGl0XVwiIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVzID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyArPSBgLCBwbGFjZWhvbGRlcjogJHtlbGVtLmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzTXVsdGlsaW5lID0gZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlRFWFRBUkVBXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW11bHRpbGluZVwiKSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaWJlZEJ5ID0gZ2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGVsZW0sIG1vZGUpO1xuICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNNdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gbW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiA/IGVsZW0udGV4dENvbnRlbnQ/LnRyaW0oKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50U3VmZml4ID0gdGV4dENvbnRlbnQgPyBgICR7dGV4dENvbnRlbnR9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9ZWRpdCwgbXVsdGlsaW5lJHthdHRyaWJ1dGVzfSR7ZGVzY3JpYmVkQnl9XSR7Y29udGVudFN1ZmZpeH1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1lZGl0JHthdHRyaWJ1dGVzfSR7ZGVzY3JpYmVkQnl9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KSxcblxuICAgIC8vIFRyZWVpdGVtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widHJlZWl0ZW1cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGFubm91bmNlbWVudCBzdHJpbmcgd2l0aG91dCB0aGUgbmFtZSAobGV0IGNvbnRlbnQgcmVuZGVyIHNlcGFyYXRlbHkpXG4gICAgICAgICAgICAgICAgbGV0IGFubm91bmNlbWVudCA9IGBbdHJlZXZpZXcgaXRlbWA7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIHNlbGVjdGVkIHN0YXRlIGlmIHByZXNlbnRcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXNlbGVjdGVkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgICAgICAgICBhbm5vdW5jZW1lbnQgKz0gXCIsIHNlbGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFkZCBleHBhbmRlZC9jb2xsYXBzZWQgc3RhdGUgaWYgcHJlc2VudFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VtZW50ICs9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKSA9PT0gXCJ0cnVlXCIgPyBcIiwgZXhwYW5kZWRcIiA6IFwiLCBjb2xsYXBzZWRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIGxldmVsIGlmIGV4cGxpY2l0bHkgc2V0IG9yIGNhbGN1bGF0ZSBmcm9tIG5lc3RpbmdcbiAgICAgICAgICAgICAgICBsZXQgbGV2ZWwgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGV2ZWxcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGFubm91bmNlbWVudCArPSBgLCBsZXZlbCAke2xldmVsfWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGxldmVsIGJ5IGNvdW50aW5nIHBhcmVudCB0cmVlaXRlbXMgb3IgZ3JvdXBzIHVzaW5nIERPTVdhbGtlciBmb3Igc2hhZG93IERPTSBzdXBwb3J0XG4gICAgICAgICAgICAgICAgICAgIGxldCBjYWxjdWxhdGVkTGV2ZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRSb2xlID09PSBcImdyb3VwXCIgfHwgcGFyZW50Um9sZSA9PT0gXCJ0cmVlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGdyb3VwIGlzIGluc2lkZSBhIHRyZWVpdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwUGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZ3JvdXBQYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBQYXJlbnRSb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGdyb3VwUGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwUGFyZW50Um9sZSA9PT0gXCJ0cmVlaXRlbVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkTGV2ZWwrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyb3VwUGFyZW50Um9sZSA9PT0gXCJ0cmVlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwUGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZ3JvdXBQYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGN1bGF0ZWRMZXZlbCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm91bmNlbWVudCArPSBgLCBsZXZlbCAke2NhbGN1bGF0ZWRMZXZlbH1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFkZCBwb3NpdGlvbiBpbmZvcm1hdGlvbiAoYXJpYS1wb3NpbnNldC9hcmlhLXNldHNpemUgb3IgY2FsY3VsYXRlKVxuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1wb3NpbnNldFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgc2V0U2l6ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1zZXRzaXplXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICghcG9zaXRpb24gfHwgIXNldFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGJ5IGNvdW50aW5nIHNpYmxpbmdzIHdpdGggc2FtZSByb2xlIHVzaW5nIERPTVdhbGtlciBmb3Igc2hhZG93IERPTSBzdXBwb3J0XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGNoaWxkcmVuIHRvIGNvdW50IHRyZWVpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdChwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxKSB7IC8vIEVsZW1lbnQgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEVsZW0gPSBjaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShjaGlsZEVsZW0pID09PSBcInRyZWVpdGVtXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRFbGVtID09PSBlbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gdG90YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvcy50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBzZXRTaXplID0gdG90YWwudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgYW5ub3VuY2VtZW50ICs9IGAsICR7cG9zaXRpb259IG9mICR7c2V0U2l6ZX1dIGA7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFubm91bmNlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSFRNTCBFbGVtZW50IHJ1bGVzXG5cbiAgICAvLyBQcmVmb3JtYXR0ZWQgdGV4dCBsaW5lIHJlbmRlcmluZzogd2hlbiBjdXJzb3IgaXMgYXQgYSA8cHJlPiBlbGVtZW50IHdpdGhcbiAgICAvLyBwcmVMaW5lSW5kZXggc2V0LCByZW5kZXIgb25seSB0aGF0IGxpbmUgb2YgdGhlIHByZSdzIHRleHQgY29udGVudC5cbiAgICAvLyBUaGlzIHJ1bGUgZmlyZXMgaW5zaWRlIHJlbmRlclJhbmdlIGZvciBwZXItbGluZSBpdGVtIHN0b3BzLlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIlBSRVwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7IC8vIGxldCBjb250YWluZXJfZW50ZXIgaGFuZGxlIGl0XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbFRleHQgPSAoY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudCkudGV4dENvbnRlbnQgPz8gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCByYXdMaW5lcyA9IGZ1bGxUZXh0LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHN0YXJ0IDwgcmF3TGluZXMubGVuZ3RoICYmIHJhd0xpbmVzW3N0YXJ0XS50cmltKCkgPT09IFwiXCIpIHN0YXJ0Kys7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IHJhd0xpbmVzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGVuZCA+PSBzdGFydCAmJiByYXdMaW5lc1tlbmRdLnRyaW0oKSA9PT0gXCJcIikgZW5kLS07XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSByYXdMaW5lcy5zbGljZShzdGFydCwgZW5kICsgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVzW2N1cnNvci5wcmVMaW5lSW5kZXhdID8/IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkJPRFlcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTdXBwcmVzcyBbU3RhcnQvRW5kIG9mIGRvY3VtZW50XSBmb3IgaWZyYW1lIHN1YmRvY3VtZW50IGJvZGllcy5cbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBpbm5lciBib2R5IGlzIGVudGVyZWQgZnJvbSBhbiA8aWZyYW1lPiwgZGlmZkNvbnRhaW5lcnMgZW1pdHNcbiAgICAgICAgICAgICAgICAvLyB0aGUgW1wibmFtZVwiLCBmcmFtZV0gY29udGFpbmVyLWVudGVyIGFubm91bmNlbWVudCBpbnN0ZWFkLiBTdXBwcmVzc2luZ1xuICAgICAgICAgICAgICAgIC8vIHRoZSBkb2N1bWVudCB0aXRsZSBhbm5vdW5jZW1lbnRzIGhlcmUgYXZvaWRzIGRvdWJsZS1hbm5vdW5jZW1lbnRzLlxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChib2R5Lm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50KSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVN0ciA9IGN1cnNvci5nZXROb2RlKCkub3duZXJEb2N1bWVudC50aXRsZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmlzRW5kVGFnKCkgPyBgW0VuZCBvZiBkb2N1bWVudCR7dGl0bGVTdHIudHJpbSgpLmxlbmd0aCA+IDAgPyBcIjogXCIgKyB0aXRsZVN0ci50cmltKCkgOiBcIlwifV1gIDogYFtTdGFydCBvZiBkb2N1bWVudCR7dGl0bGVTdHIudHJpbSgpLmxlbmd0aCA+IDAgPyBcIjogXCIgKyB0aXRsZVN0ci50cmltKCkgOiBcIlwifV1gXG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIElubGluZSBmcmFtZSAoPGlmcmFtZT4pIOKAlCB0YWJfZm9jdXMgbW9kZTogYW5ub3VuY2VzIHRoZSBmcmFtZSBhcyBhIHRhYiBzdG9wLlxuICAgIC8vIEEgdGl0bGVkIGlmcmFtZSBhbm5vdW5jZXMgaXRzIGFjY2Vzc2libGUgbmFtZTsgYW4gdW50aXRsZWQgb25lIGFubm91bmNlcyBqdXN0IFwiZnJhbWVcIi5cbiAgICAvLyAoVGhlIGl0ZW0tbW9kZSBhbm5vdW5jZW1lbnQgaXMgaGFuZGxlZCBieSBkaWZmQ29udGFpbmVycyBlbWl0dGluZyB0aGUgY29udGFpbmVyX2VudGVyXG4gICAgLy8gSUZSQU1FIHJ1bGUgd2hlbiBjcm9zc2luZyBpbnRvIHRoZSBzdWJkb2N1bWVudCDigJQgbm8gc2VwYXJhdGUgU1JfUlVMRSBuZWVkZWQgZm9yIGl0ZW0gbW9kZS4pXG4gICAgLy8gV2hlbiByb2xlPVwibm9uZVwiIG9yIHJvbGU9XCJwcmVzZW50YXRpb25cIiBpcyBzZXQsIHNjcmVlbiByZWFkZXJzIHRyZWF0IHRoZSBmcmFtZSBhcyBhXG4gICAgLy8gZ2VuZXJpYyBncm91cGluZyDigJQgYW5ub3VuY2UgXCJncm91cGluZ1wiIGluc3RlYWQgb2YgXCJmcmFtZVwiLlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIklGUkFNRVwiXSxcbiAgICAgICAgbW9kZXM6IFtcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcInJvbGVcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNQcmVzZW50YXRpb24gPSByb2xlID09PSBcIm5vbmVcIiB8fCByb2xlID09PSBcInByZXNlbnRhdGlvblwiO1xuICAgICAgICAgICAgICAgIC8vIEFuIHVudGl0bGVkIHByZXNlbnRhdGlvbmFsIGlmcmFtZSBwcm9kdWNlcyBubyBtZWFuaW5nZnVsIHRhYiBzdG9wIGxhYmVsIOKAlFxuICAgICAgICAgICAgICAgIC8vIHN1cHByZXNzIGl0IGVudGlyZWx5IHNvIGl0IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgdGFiX2ZvY3VzIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50YXRpb24gJiYgIWN1cnNvci5nZXROYW1lKCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gaXNQcmVzZW50YXRpb24gPyBcImdyb3VwaW5nXCIgOiBcImZyYW1lXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7bGFiZWx9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkJSXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdhbGsgPSBjdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2FsayB1bnRpbCB3ZSBoaXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZSwgZmluZCBhbm90aGVyIEJSLCBvciBmaW5kIHNvbWV0aGluZyB3aXRoIGEgbmFtZVxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAod2Fsay5wcmV2aW91cygoKSA9PiB0cnVlKSAmJiB3YWxrLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpICE9PSBcIkJSXCIgJiYgd2Fsay5nZXROYW1lSW5mbygpICYmIHdhbGsuZ2V0TmFtZUluZm8oKS5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2Fsay5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJCUlwiID8gXCJbYmxhbmtdXCIgOiBudWxsO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJETFwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJJTlBVVFwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcInBhc3N3b3JkXCIgJiYgYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9ZWRpdCwgcHJvdGVjdGVkJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XWApIHx8IG51bGwsXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTElucHV0RWxlbWVudCk/LnZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT09IFwiXCIgPyBcIk5vIGZpbGUgY2hvc2VuXCIgOiB2YWx1ZS5zdWJzdHJpbmcoXCJDOlxcXFxmYWtlcGF0aFxcXFxcIi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9YnV0dG9uJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XSBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7dmFsdWV9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImNvbG9yXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSAoTnVtYmVyKGAweCR7dmFsLnN1YnN0cmluZygxLCAzKX1gKSAqIDEwMC4wIC8gTnVtYmVyKFwiMHhmZlwiKSkudG9GaXhlZCgwKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZyA9IChOdW1iZXIoYDB4JHt2YWwuc3Vic3RyaW5nKDMsIDUpfWApICogMTAwLjAgLyBOdW1iZXIoXCIweGZmXCIpKS50b0ZpeGVkKDApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gKE51bWJlcihgMHgke3ZhbC5zdWJzdHJpbmcoNSl9YCkgKiAxMDAuMCAvIE51bWJlcihcIjB4ZmZcIikpLnRvRml4ZWQoMCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFske3J9JSByZWQgJHtnfSUgZ3JlZW4gJHtifSUgYmx1ZV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJtb250aFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gXCJcIiArIGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBcIlwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFtzcGluIGJ1dHRvbiwgJHttfV0gW3NwaW4gYnV0dG9uLCAke3l9XSBbbWVudSBidXR0b25dIFtzdWJNZW51XSBTaG93IG1vbnRoIHBpY2tlcmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImRhdGVcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRheSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gXCJcIiArIGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBcIlwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gXCJcIiArIChkYXRlLmdldERhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNsaWNrYWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV0gW3NwaW4gYnV0dG9uLCAke219XSAvIFtzcGluIGJ1dHRvbiwgJHtkYXl9XSAvIFtzcGluIGJ1dHRvbiwgJHt5fV0gW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyBkYXRlIHBpY2tlcmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImRhdGV0aW1lLWxvY2FsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7IC8vIDIwMjUtMDktMTJUMDQ6MjBcbiAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRheSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaG91ciA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWluID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbXBtID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUodmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBcIlwiICsgZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbSA9IFwiXCIgKyAoZGF0ZS5nZXRNb250aCgpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXkgPSBcIlwiICsgKGRhdGUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRlLmdldEhvdXJzKCkgPT09IDAgfHwgZGF0ZS5nZXRIb3VycygpID09PSAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIjEyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGUuZ2V0SG91cnMoKSA8IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciA9IFwiXCIgKyBkYXRlLmdldEhvdXJzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIlwiICsgKGRhdGUuZ2V0SG91cnMoKSAtIDEyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IFwiXCIgKyBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFtcG0gPSBkYXRlLmdldEhvdXJzKCkgPj0gMTIgPyBcInBtXCIgOiBcImFtXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNsaWNrYWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV0gW3NwaW4gYnV0dG9uLCAke219XSAvIFtzcGluIGJ1dHRvbiwgJHtkYXl9XSAvIFtzcGluIGJ1dHRvbiwgJHt5fV0gW3NwaW4gYnV0dG9uLCAke2hvdXJ9XSA6IFtzcGluIGJ1dHRvbiwgJHttaW59XSBbc3BpbiBidXR0b24sICR7YW1wbX1dICBbbWVudSBidXR0b25dIFtzdWJNZW51XSBTaG93IGxvY2FsIGRhdGUgYW5kIHRpbWUgcGlja2VyYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwidGltZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlOyAvLyAyMDI1LTA5LTEyVDA0OjIwXG4gICAgICAgICAgICAgICAgICAgIGxldCBob3VyID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtaW4gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFtcG0gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSB2YWwuc3BsaXQoXCI6XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdXJzID0gcGFyc2VJbnQoZGF0ZVswXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG91cnMgPT09IDAgfHwgaG91cnMgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciA9IFwiMTJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIlwiICsgaG91cnM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIlwiICsgKGhvdXJzIC0gMTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gZGF0ZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFtcG0gPSBob3VycyA+PSAxMiA/IFwicG1cIiA6IFwiYW1cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Z3JvdXBpbmcgY2xpY2thYmxlJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9IFtzcGluIGJ1dHRvbiwgJHtob3VyfV0gOiBbc3BpbiBidXR0b24sICR7bWlufV0gW3NwaW4gYnV0dG9uLCAke2FtcG19XSBbbWVudSBidXR0b25dIFtzdWJNZW51XSBTaG93IHRpbWUgcGlja2VyIFtvdXQgb2YgZ3JvdXBpbmddYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwid2Vla1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlOyAvLyAyMDI1LVczOFxuICAgICAgICAgICAgICAgICAgICBsZXQgeWVhciA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2VlayA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IHZhbC5zcGxpdCgvLVcvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSBkYXRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2VlayA9IGRhdGVbMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNsaWNrYWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV0gW3NwaW4gYnV0dG9uLCAke3dlZWt9XSwgW3NwaW4gYnV0dG9uLCAke3llYXJ9XSBbbWVudSBidXR0b25dIFtzdWJNZW51XSBTaG93IHdlZWsgcGlja2VyYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIgPyBcIlwiIDogbnVsbCxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBgISFbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWlucHV0ISFdJHtjdXJzb3IuZ2V0RWxlbWVudCgpLm91dGVySFRNTH1gKSB8fCBudWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkxJXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGlzdGl0ZW0gY29udGFpbnMgaW50ZXJhY3RpdmUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAvLyBTY3JlZW4gcmVhZGVycyBkb24ndCByZWFkIHRoZSBhY2Nlc3NpYmxlIG5hbWUgd2hlbiBpbnRlcmFjdGl2ZSBlbGVtZW50cyBhcmUgcHJlc2VudFxuICAgICAgICAgICAgICAgIGNvbnN0IGhhc0ludGVyYWN0aXZlQ29udGVudCA9IGxpc3RpdGVtQ29udGFpbnNJbnRlcmFjdGl2ZUVsZW1lbnQoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lVG9Vc2UgPSBoYXNJbnRlcmFjdGl2ZUNvbnRlbnQgPyBcIlwiIDogKGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lIHx8IFwiXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKS5saXN0U3R5bGVUeXBlID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGAke25hbWVUb1VzZX1gIDogXCJcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGBbYnVsbGV0XSAke25hbWVUb1VzZX1gIDogXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE1hdGhNTCBlbGVtZW50c1xuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIk1GUkFDXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtmcmFjdGlvbl1gIDogYFtlbmQgZnJhY3Rpb25dYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNUk9XXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBhbm5vdW5jZSBvdmVyIG9uIHRoZSBlbmQgdGFnXG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbGV0IGZyYWN0aW9uID0gY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtdLCBbXCJtZnJhY1wiXSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyYWN0aW9uICYmIGZyYWN0aW9uLmdldEVsZW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwibXJvd1wiKVswXT8uaXNTYW1lTm9kZShjdXJzb3IuZ2V0Tm9kZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJbb3Zlcl1cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIk1TUVJUXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtzcXVhcmUgcm9vdF1gIDogYFtlbmQgcm9vdF1gXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIk1TVVBcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzRW5kVGFnKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgbWkgPSBjdXJzb3IuZ2V0RWxlbWVudCgpLnF1ZXJ5U2VsZWN0b3IoXCJtaVwiKT8uaW5uZXJIVE1MIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgbW4gPSBjdXJzb3IuZ2V0RWxlbWVudCgpLnF1ZXJ5U2VsZWN0b3IoXCJtblwiKT8uaW5uZXJIVE1MIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKG1uID09PSBcIjJcIikgcmV0dXJuIGAke21pfSBbc3F1YXJlZF1gO1xuICAgICAgICAgICAgICAgIGlmIChtbiA9PT0gXCIzXCIpIHJldHVybiBgJHttaX0gW2N1YmVkXWA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke21pfSBbdG8gdGhlICR7bW59XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFN1bW1hcnkgZWxlbWVudCDigJQgdGhlIGRpc2Nsb3N1cmUgYnV0dG9uIGZvciBhIDxkZXRhaWxzPiB3aWRnZXQuXG4gICAgLy8gPHN1bW1hcnk+IGhhcyBpbXBsaWNpdFJvbGU6IG51bGwgaW4gQVJJQURlZmluaXRpb25zIHNvIG5vIHJvbGUtYmFzZWRcbiAgICAvLyBidXR0b24gcnVsZSBmaXJlcy4gIFdlIGFkZCBhbiBleHBsaWNpdCBlbGVtZW50IHJ1bGUgdGhhdCBhbm5vdW5jZXMgaXQgYXNcbiAgICAvLyBhIGJ1dHRvbiB3aXRoIHRoZSBjb2xsYXBzZWQgLyBleHBhbmRlZCBzdGF0ZSBmcm9tIHRoZSBwYXJlbnQgPGRldGFpbHM+LlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIlNVTU1BUllcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiYnV0dG9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGlmICghc3VtbWFyeUVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IDxzdW1tYXJ5PiB0aGF0IGlzIGEgZGlyZWN0IGNoaWxkIG9mIDxkZXRhaWxzPlxuICAgICAgICAgICAgICAgIC8vIGFjdHMgYXMgdGhlIGRpc2Nsb3N1cmUgYnV0dG9uLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHNQYXJlbnQgPSBzdW1tYXJ5RWxlbS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghZGV0YWlsc1BhcmVudCB8fCBkZXRhaWxzUGFyZW50Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09IFwiREVUQUlMU1wiKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFN1bW1hcnkgPSBBcnJheS5mcm9tKGRldGFpbHNQYXJlbnQuY2hpbGRyZW4pLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIGMgPT4gYy5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNVTU1BUllcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCFmaXJzdFN1bW1hcnkgfHwgIWZpcnN0U3VtbWFyeS5pc1NhbWVOb2RlKHN1bW1hcnlFbGVtKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGVTdHIgPSBkZXRhaWxzUGFyZW50Lmhhc0F0dHJpYnV0ZShcIm9wZW5cIikgPyBcImV4cGFuZGVkXCIgOiBcImNvbGxhcHNlZFwiO1xuICAgICAgICAgICAgICAgIC8vIDxzdW1tYXJ5PiBoYXMgaW1wbGljaXRSb2xlOiBudWxsIHNvIEFjY05hbWVVdGlsIG1heSBub3QgY29tcHV0ZSBhIG5hbWU7XG4gICAgICAgICAgICAgICAgLy8gcmVhZCBhcmlhLWxhYmVsIGZpcnN0LCB0aGVuIGZhbGwgYmFjayB0byB2aXNpYmxlIHRleHQgY29udGVudC5cbiAgICAgICAgICAgICAgICBjb25zdCBhcmlhTGFiZWwgPSBzdW1tYXJ5RWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpPy50cmltKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBzdW1tYXJ5RWxlbS50ZXh0Q29udGVudD8udHJpbSgpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBhcmlhTGFiZWwgfHwgdGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWxTdHIgPSBsYWJlbCA/IGBcIiR7bGFiZWx9XCIsIGAgOiBcIlwiO1xuICAgICAgICAgICAgICAgIC8vIERlc2NyaXB0aW9uOiBwcmVmZXIgZXhwbGljaXQgYXJpYS1kZXNjcmliZWRieTsgd2hlbiBhcmlhLWxhYmVsIGlzIHRoZVxuICAgICAgICAgICAgICAgIC8vIG5hbWUgc291cmNlLCB0aGUgc3VidHJlZSB0ZXh0IGJlY29tZXMgdGhlIGRlc2NyaXB0aW9uIChhY2NuYW1lLTEuMiDCpzQuMykuXG4gICAgICAgICAgICAgICAgbGV0IGRlc2NTdHIgPSBnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoc3VtbWFyeUVsZW0sIG1vZGUpO1xuICAgICAgICAgICAgICAgIGlmICghZGVzY1N0ciAmJiBhcmlhTGFiZWwgJiYgdGV4dENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY1N0ciA9IG1vZGUgPT09IFwiaXRlbVwiID8gYCwgXFx1MDAwMSR7dGV4dENvbnRlbnR9XFx1MDAwMmAgOiBgLCBcIiR7dGV4dENvbnRlbnR9XCJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYFske2xhYmVsU3RyfWJ1dHRvbiwgJHtzdGF0ZVN0cn0ke2Rlc2NTdHJ9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE11bHRpcGxlIHJvbGVzIHJ1bGVzIC0gcGxhY2VkIGF0IHRoZSBib3R0b21cbiAgICBcbiAgICAvLyBEZWZhdWx0IG1vZGUgcnVsZXMgLSBDb250YWluZXIgZWxlbWVudHMgKG11bHRpcGxlIHJvbGVzKVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJhcnRpY2xlXCIsIFwiYmFubmVyXCIsIFwiYmxvY2txdW90ZVwiLCBcImNhcHRpb25cIiwgXCJjZWxsXCIsIFwiY29kZVwiLCBcImNvbHVtbmhlYWRlclwiLFxuICAgICAgICAgICAgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIiwgXCJmaWd1cmVcIiwgXCJmb3JtXCIsIFwiZ3JvdXBcIiwgXCJsaXN0XCIsIFwibWFpblwiLFxuICAgICAgICAgICAgXCJtYXJrXCIsIFwibmF2aWdhdGlvblwiLCBcInJlZ2lvblwiLCBcInJvd1wiLCBcInJvd2hlYWRlclwiLCBcInNlYXJjaFwiLCBcInRhYmxlXCIsIFwidG9vbGJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIERlZmF1bHQgbW9kZSBydWxlcyAtIEVsZW1lbnRzIHRoYXQgc2NyZWVuIHJlYWRlcnMgdHlwaWNhbGx5IGlnbm9yZSAobXVsdGlwbGUgcm9sZXMpXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInBhcmFncmFwaFwiLCBcInJvd2dyb3VwXCIsIFwic3RhdHVzXCIsIFwic3Ryb25nXCIsIFwic3Vic2NyaXB0XCIsIFwic3VwZXJzY3JpcHRcIixcbiAgICAgICAgICAgIFwidGVybVwiLCBcInRpbWVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXVxuIiwiaW1wb3J0IHsgU1JSZW5kZXJlclJ1bGUgfSBmcm9tIFwiLi4vU1JSZW5kZXJlclJ1bGVcIjtcbmltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4uL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBTUlRhYmxlVXRpbCB9IGZyb20gXCIuLi9TUlRhYmxlVXRpbFwiO1xuaW1wb3J0IHsgcXVvdGVOYW1lUGFkQWZ0ZXIsIHF1b3RlTmFtZVBhZEJlZm9yZSwgZ2V0Um9sZURlc2NyaXB0aW9uIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi8uLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBhbm5vdW5jZW1lbnQgdGV4dCB3aGVuIGVudGVyaW5nIGEgdGFibGUgY2VsbFxuICovXG5mdW5jdGlvbiByZW5kZXJFbnRlclRhYmxlQ2VsbChuZXdDdXJzb3I6IFNSQ3Vyc29yLCBvbGRDdXJzb3I6IFNSQ3Vyc29yKSB7XG4gICAgLy8gV2Ugc2VlbSB0byBiZSBhdCB0aGUgbmV3bGluZSB0ZXh0IG5vZGUgYWZ0ZXIgdGhlIGNlbGxcbiAgICBpZiAob2xkQ3Vyc29yICYmIG9sZEN1cnNvci5nZXROb2RlKCk/Lm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgb2xkQ3Vyc29yID0gb2xkQ3Vyc29yLmNsb25lKCk7XG4gICAgICAgIG9sZEN1cnNvci5wcmV2aW91cygoKSA9PiB0cnVlKVxuICAgIH1cbiAgICBjb25zdCBuZXdUYWJsZU1vZGVsID0gU1JUYWJsZVV0aWwuZ2V0VGFibGVNb2RlbChuZXdDdXJzb3IpO1xuICAgIGNvbnN0IG9sZENlbGxJbmZvID0gU1JUYWJsZVV0aWwuZ2V0Q2VsbE1vZGVsKG9sZEN1cnNvciwgbmV3VGFibGVNb2RlbCk7XG4gICAgY29uc3QgbmV3Q2VsbEluZm8gPSBTUlRhYmxlVXRpbC5nZXRDZWxsTW9kZWwobmV3Q3Vyc29yLCBuZXdUYWJsZU1vZGVsKTtcbiAgICBpZiAoIW5ld0NlbGxJbmZvKSByZXR1cm4gXCJcIjtcbiAgICBsZXQgcmV0VmFsOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQW5ub3VuY2Ugcm93IGluZm9ybWF0aW9uIGlmIHdlJ3ZlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHJvdyBvciB0aGUgcm93c3BhbiBoYXMgY2hhbmdlZFxuICAgIGlmICghb2xkQ2VsbEluZm8gfHwgb2xkQ2VsbEluZm8ucm93SW5kZXhTdGFydCAhPT0gbmV3Q2VsbEluZm8ucm93SW5kZXhTdGFydCB8fCBvbGRDZWxsSW5mby5yb3dzcGFuICE9PSBuZXdDZWxsSW5mby5yb3dzcGFuKSB7XG4gICAgICAgIC8vIElmIGEgY2hhbmdlIGluIHJvdyBvciBhIGNoYW5nZSBpbiByb3dTcGFuXG4gICAgICAgIGxldCByb3dIZWFkZXJzID0gU1JUYWJsZVV0aWwuZ2V0Um93SGVhZGVyc0ZvckN1cnNvcihuZXdDdXJzb3IsIG5ld1RhYmxlTW9kZWwpO1xuICAgICAgICBsZXQgaGVhZGVySW5mb1N0ciA9IHJvd0hlYWRlcnMgJiYgcm93SGVhZGVycy50cmltKCkubGVuZ3RoID4gMCA/IGBcIiR7cm93SGVhZGVyc31cIiwgYCA6IFwiXCI7XG4gICAgICAgIHJldFZhbC5wdXNoKGBbJHtoZWFkZXJJbmZvU3RyfXJvdyAkeyhuZXdDZWxsSW5mby5yb3dJbmRleFN0YXJ0KzEpfSR7bmV3Q2VsbEluZm8ucm93c3BhbiA+IDEgPyBcIiB0aHJvdWdoIFwiICsgKG5ld0NlbGxJbmZvLnJvd0luZGV4U3RhcnQrbmV3Q2VsbEluZm8ucm93c3BhbikgOiBcIlwifV1gKTtcbiAgICB9XG5cbiAgICAvLyBBbm5vdW5jZSBjb2x1bW4gaW5mb3JtYXRpb24gaWYgd2UndmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgY29sdW1uIG9yIHRoZSBjb2xzcGFuIGhhcyBjaGFuZ2VkXG4gICAgaWYgKCFvbGRDZWxsSW5mbyB8fCBvbGRDZWxsSW5mby5jb2xJbmRleFN0YXJ0ICE9PSBuZXdDZWxsSW5mby5jb2xJbmRleFN0YXJ0IHx8IG9sZENlbGxJbmZvLmNvbHNwYW4gIT09IG5ld0NlbGxJbmZvLmNvbHNwYW4pIHtcbiAgICAgICAgLy8gSWYgYSBjaGFuZ2UgaW4gY29sdW1uIG9yIGEgY2hhbmdlIGluIGNvbHNwYW5cbiAgICAgICAgbGV0IGNvbHVtbkhlYWRlcnMgPSBTUlRhYmxlVXRpbC5nZXRDb2x1bW5IZWFkZXJzRm9yQ3Vyc29yKG5ld0N1cnNvciwgbmV3VGFibGVNb2RlbCk7XG4gICAgICAgIGxldCBoZWFkZXJJbmZvU3RyID0gY29sdW1uSGVhZGVycyAmJiBjb2x1bW5IZWFkZXJzLnRyaW0oKS5sZW5ndGggPiAwID8gYFwiJHtjb2x1bW5IZWFkZXJzfVwiLCBgIDogXCJcIjtcbiAgICAgICAgcmV0VmFsLnB1c2goYFske2hlYWRlckluZm9TdHJ9Y29sdW1uICR7KG5ld0NlbGxJbmZvLmNvbEluZGV4U3RhcnQrMSl9JHtuZXdDZWxsSW5mby5jb2xzcGFuID4gMSA/IFwiIHRocm91Z2ggXCIgKyAobmV3Q2VsbEluZm8uY29sSW5kZXhTdGFydCtuZXdDZWxsSW5mby5jb2xzcGFuKSA6IFwiXCJ9XWApO1xuICAgIH1cblxuICAgIHJldHVybiByZXRWYWwuam9pbihcIiBcIik7XG59XG5cbmV4cG9ydCBsZXQgUlVMRVM6IFNSUmVuZGVyZXJSdWxlW10gPSBbXG4gICAgLy8gU2luZ2xlIHJvbGUgcnVsZXMgLSBhbHBoYWJldGljYWxseSBzb3J0ZWRcblxuICAgIC8vIEFydGljbGUgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJhcnRpY2xlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiYXJ0aWNsZVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYXJ0aWNsZVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQmFubmVyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYmFubmVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJiYW5uZXIgcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBCbG9ja3F1b3RlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYmxvY2txdW90ZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbYmxvY2txdW90ZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDYXB0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2FwdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbY2FwdGlvbl1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDZWxsIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2VsbFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYmxlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgcmVuZGVyRW50ZXJUYWJsZUNlbGxcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29sdW1uaGVhZGVyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY29sdW1uaGVhZGVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICByZW5kZXJFbnRlclRhYmxlQ2VsbFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDb21wbGVtZW50YXJ5IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY29tcGxlbWVudGFyeVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Y29tcGxlbWVudGFyeSByZWdpb25dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29udGVudGluZm8gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjb250ZW50aW5mb1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Y29udGVudCBpbmZvIHJlZ2lvbl1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBGaWd1cmUgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJmaWd1cmVcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2ZpZ3VyZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBGb3JtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZm9ybVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcImZvcm1jb250cm9sXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW3NlY3Rpb25dXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWZvcm0gcmVnaW9uXWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEdyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiREVUQUlMU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNTdW1tYXJ5ID0gQXJyYXkuZnJvbShlbGVtLmNoaWxkcmVuKS5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgYyA9PiBjLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU1VNTUFSWVwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNTdW1tYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgPHN1bW1hcnk+IGNoaWxkIHNwZWFrcyBhcyB0aGUgZGlzY2xvc3VyZSBidXR0b247IHN1cHByZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29udGFpbmVyLWVudGVyIGFubm91bmNlbWVudCBlbnRpcmVseS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vIGV4cGxpY2l0IDxzdW1tYXJ5PjogaW4gYSByZWFsIGJyb3dzZXIgdGhlIFVBIGluamVjdHMgYSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIC8vIFwiRGV0YWlsc1wiIHN1bW1hcnkuICBqc2RvbSBkb2VzIG5vdCwgc28gd2UgYW5ub3VuY2UgdGhlIHdpZGdldCBoZXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgZmFsbGJhY2sgdXNpbmcgdGhlIHNhbWUgZGVmYXVsdCBsYWJlbCBhIHJlYWwgYnJvd3NlciB3b3VsZCB1c2UuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW1wiRGV0YWlsc1wiLCBidXR0b24sICR7ZWxlbS5oYXNBdHRyaWJ1dGUoXCJvcGVuXCIpID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcImNvbWJvYm94XCJdLCBbXCJzZWxlY3RcIl0pPy5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJTRUxFQ1RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbZ3JvdXBpbmcke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyAtLSB0YWJfZm9jdXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJERVRBSUxTXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc1N1bW1hcnkgPSBBcnJheS5mcm9tKGVsZW0uY2hpbGRyZW4pLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjID0+IGMubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJTVU1NQVJZXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1N1bW1hcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxzdW1tYXJ5PiBpcyB0aGUgdGFiIHN0b3AsIG5vdCA8ZGV0YWlscz4gaXRzZWxmLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gTm8gPHN1bW1hcnk+OiA8ZGV0YWlscz4gaXRzZWxmIGlzIGZvY3VzYWJsZSAoVUEgZGVmYXVsdCBiZWhhdmlvdXIpLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtcIkRldGFpbHNcIiwgYnV0dG9uLCAke2VsZW0uaGFzQXR0cmlidXRlKFwib3BlblwiKSA/IFwiZXhwYW5kZWRcIiA6IFwiY29sbGFwc2VkXCJ9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJjb21ib2JveFwiXSwgW1wic2VsZWN0XCJdKT8uZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0VMRUNUXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImxpc3RcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJsaXN0XCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjZW5kYW50TGlzdEl0ZW1zID0gZG9jdW1lbnQuZXZhbHVhdGUoXCIuLy9saSB8IC4vLypbQHJvbGU9J2xpc3RpdGVtJ11cIiwgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENvdW50IGl0ZW1zLCBleGNsdWRpbmcgdGhvc2UgaW4gb3RoZXIgbGlzdHMgb3Igd2l0aGluIHByZXNlbnRhdGlvbmFsIGNvbnRhaW5lcnNcbiAgICAgICAgICAgICAgICBsZXQgbnVtSXRlbXMgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzY2VuZGFudExpc3RJdGVtcy5zbmFwc2hvdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkZXNjZW5kYW50TGlzdEl0ZW1zLnNuYXBzaG90SXRlbShpKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIFdhbGsgdXAgYW5jZXN0b3JzIHRvIGNoZWNrIGZvciBib3RoIG5lc3RlZCBsaXN0cyBhbmQgcHJlc2VudGF0aW9uYWwgY29udGFpbmVyc1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNJbk90aGVyTGlzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGFzUHJlc2VudGF0aW9uYWxBbmNlc3RvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYW5jZXN0b3IgPSBpdGVtLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYW5jZXN0b3IgJiYgYW5jZXN0b3IgIT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGFuY2VzdG9yIGlzIGFub3RoZXIgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JSb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvclJvbGUgPT09IFwibGlzdFwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3Iubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJVTFwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3Iubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJPTFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbk90aGVyTGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGFuY2VzdG9yIGhhcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yUm9sZSAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbYW5jZXN0b3JSb2xlXT8ucHJlc2VudGF0aW9uYWxDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1ByZXNlbnRhdGlvbmFsQW5jZXN0b3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNJbk90aGVyTGlzdCAmJiAhaGFzUHJlc2VudGF0aW9uYWxBbmNlc3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtSXRlbXMrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAobnVtSXRlbXMgPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1saXN0IG9mICR7bnVtSXRlbXN9IGl0ZW1zXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE1haW4gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJtYWluXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1tYWluIHJlZ2lvbl1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBtZW51YmFyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWVudWJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImxpc3RcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vLypbQHJvbGU9J21lbnVpdGVtJ11cIiwgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXNJbk90aGVyTGlzdHMgPSBkb2N1bWVudC5ldmFsdWF0ZShcbiAgICAgICAgICAgICAgICAgICAgXCIuLy8qW0Byb2xlPSdtZW51YmFyJ10vLypbQHJvbGU9J21lbnVpdGVtJ118Li8vKltAcm9sZT0nbWVudSddLy8qW0Byb2xlPSdtZW51aXRlbSddXCIsXG4gICAgICAgICAgICAgICAgICAgIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBkZXNjZW5kYW50Q29udGFpbmVycyA9IGRvY3VtZW50LmV2YWx1YXRlKFwiLi8vKltAcm9sZT0nbWVudWl0ZW0nXS8qW0Byb2xlPSdtZW51J11cIiwgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGRlc2NlbmRhbnRDb250YWluZXJzMiA9IGRvY3VtZW50LmV2YWx1YXRlKFwiLi8vKltAcm9sZT0nbWVudWJhciddLy8qW0Byb2xlPSdtZW51aXRlbSddLypbQHJvbGU9J21lbnUnXXwuLy8qW0Byb2xlPSdtZW51J10vLypbQHJvbGU9J21lbnVpdGVtJ10vKltAcm9sZT0nbWVudSddXCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk1FTlVCQVJcIiwgY3Vyc29yLmlzRW5kVGFnKCk/XCIvXCI6XCJcIiwgY3Vyc29yLmdldE5vZGUoKSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGVzY2VuZGFudExpc3RJdGVtcywgZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cyk7Ly8sIGRlc2NlbmRhbnRDb250YWluZXJzLCBkZXNjZW5kYW50Q29udGFpbmVyczIpXG4gICAgICAgICAgICAgICAgbGV0IG51bUl0ZW1zID0gZGVzY2VuZGFudExpc3RJdGVtcy5zbmFwc2hvdExlbmd0aC1kZXNjZW5kYW50TGlzdEl0ZW1zSW5PdGhlckxpc3RzLnNuYXBzaG90TGVuZ3RoOy8vLWRlc2NlbmRhbnRDb250YWluZXJzLnNuYXBzaG90TGVuZ3RoK2Rlc2NlbmRhbnRDb250YWluZXJzMi5zbmFwc2hvdExlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobnVtSXRlbXMgPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1tZW51YmFyIHdpdGggJHtudW1JdGVtc30gaXRlbXNdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTmF2aWdhdGlvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcIm5hdmlnYXRpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm5hdmlnYXRpb24gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBSYWRpbyBncm91cCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJhZGlvZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbZ3JvdXBpbmcke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBSZWdpb24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJyZWdpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwicmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBSb3cgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJyb3dcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUm93aGVhZGVyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicm93aGVhZGVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICByZW5kZXJFbnRlclRhYmxlQ2VsbFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTZWFyY2ggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzZWFyY2hcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcInNlYXJjaCByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRhYmxlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widGFibGVcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRhYmxlV2Fsa2VyID0gY3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgdGFibGVcbiAgICAgICAgICAgICAgICB3aGlsZSAodGFibGVXYWxrZXIuZ2V0Um9sZSgpICE9PSBcInRhYmxlXCIgJiYgdGFibGVXYWxrZXIucHJldmlvdXMoKCkgPT4gdHJ1ZSkpO1xuICAgICAgICAgICAgICAgIC8vIFNldCBhbiBlbmQgdG8gdGhlIHRhYmxlXG4gICAgICAgICAgICAgICAgbGV0IHRhYmxlTm9kZSA9IHRhYmxlV2Fsa2VyLmdldE5vZGUoKTtcbiAgICAgICAgICAgICAgICBsZXQgcm93cyA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGNvbHMgPSAwO1xuICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjayB0aGF0IHRoZSB0YWJsZSBoYXMgY29udGVudFxuICAgICAgICAgICAgICAgIGlmICh0YWJsZVdhbGtlci5nZXROb2RlKCkuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RSb3dDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGFibGVXYWxrZXIubmV4dCgoKSA9PiB0cnVlKSAmJiAhdGFibGVXYWxrZXIuZ2V0Tm9kZSgpLmlzU2FtZU5vZGUodGFibGVOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZSA9IHRhYmxlV2Fsa2VyLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZVdhbGtlci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJyb3dcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3Jvd3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdFJvd0NvbXBsZXRlICYmIFtcImNlbGxcIiwgXCJyb3doZWFkZXJcIiwgXCJjb2x1bW5oZWFkZXJcIl0uaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB0YWJsZVdhbGtlci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzICs9IHBhcnNlSW50KGVsZW0uZ2V0QXR0cmlidXRlKFwiY29sc3BhblwiKSB8fCBcIjFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvbGUgPT09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJvd0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gYFt0YWJsZSB3aXRoICR7cm93c30gJHtyb3dzID09PSAxID8gXCJyb3dcIiA6IFwicm93c1wifSBhbmQgJHtjb2xzfSAke2NvbHMgPT09IDEgPyBcImNvbHVtblwiIDogXCJjb2x1bW5zXCJ9JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVG9vbGJhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRvb2xiYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfXRvb2xiYXJdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSFRNTCBFbGVtZW50IHJ1bGVzXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRExcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwibGlzdFwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudExpc3RJdGVtcyA9IGRvY3VtZW50LmV2YWx1YXRlKFwiLi8vZHRcIiwgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIGxldCBudW1JdGVtcyA9IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWRlZmluaXRpb24gbGlzdCBvZiAke251bUl0ZW1zfSB0ZXJtc11gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJGSUdDQVBUSU9OXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbY2FwdGlvbl1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNQVJLXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbaGlnaGxpZ2h0ZWRdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSW5saW5lIGZyYW1lICg8aWZyYW1lPilcbiAgICAvLyBPbmx5IGZpcmVzIGluIGl0ZW0gbW9kZSAod2hlcmUgaXQgcHJvZHVjZXMgdGhlIGNvbnRhaW5lci1lbnRlciBsYWJlbCBvbiB0aGUgcGFyZW50XG4gICAgLy8gYmxvY2sgc3RvcCkuIEluIHRhYl9mb2N1cyBtb2RlIHRoZSBpZnJhbWUgZWxlbWVudCBpdHNlbGYgaXMgdGhlIHN0b3AgYW5kIHRoZVxuICAgIC8vIElGUkFNRSBTUl9SVUxFIGluIGNvbW1vbi50cyBzdXBwbGllcyB0aGUgbGFiZWwgZGlyZWN0bHkg4oCUIG5vIGNvbnRhaW5lci1lbnRlciBuZWVkZWQuXG4gICAgLy8gV2hlbiByb2xlPVwibm9uZVwiIG9yIHJvbGU9XCJwcmVzZW50YXRpb25cIiBpcyBzZXQsIHNjcmVlbiByZWFkZXJzIHRyZWF0IHRoZSBmcmFtZVxuICAgIC8vIGFzIGEgZ2VuZXJpYyBncm91cGluZyDigJQgYW5ub3VuY2UgXCJncm91cGluZ1wiIGluc3RlYWQgb2YgXCJmcmFtZVwiLlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIklGUkFNRVwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1ByZXNlbnRhdGlvbiA9IHJvbGUgPT09IFwibm9uZVwiIHx8IHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgLy8gQW4gdW50aXRsZWQgcHJlc2VudGF0aW9uYWwgaWZyYW1lIGhhcyBubyBtZWFuaW5nZnVsIGdyb3VwaW5nIGxhYmVsIHRvXG4gICAgICAgICAgICAgICAgLy8gYW5ub3VuY2Ug4oCUIHN1cHByZXNzIHRoZSBjb250YWluZXItZW50ZXIgZW50aXJlbHkuXG4gICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudGF0aW9uICYmICFjdXJzb3IuZ2V0TmFtZSgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGlzUHJlc2VudGF0aW9uID8gXCJncm91cGluZ1wiIDogXCJmcmFtZVwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke2xhYmVsfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBQcmVmb3JtYXR0ZWQgdGV4dCAoPHByZT4pXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiUFJFXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1wcmVmb3JtYXR0ZWQgdGV4dF1gXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE11bHRpcGxlIHJvbGVzIHJ1bGVzIC0gcGxhY2VkIGF0IHRoZSBib3R0b21cblxuICAgIC8vIEhlYWRpbmcgbW9kZSBydWxlcyAtIGlnbm9yZSBjb250YWluZXIgZWxlbWVudHMgaW4gaGVhZGluZyBtb2RlIChtdWx0aXBsZSByb2xlcylcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcbiAgICAgICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImZpZ3VyZVwiLCBcImZvcm1cIiwgXCJncm91cFwiLCBcInJlZ2lvblwiLCBcbiAgICAgICAgICAgICAgICBcInJvd1wiLCBcInJvd2hlYWRlclwiLCBcInNlYXJjaFwiLCBcInRvb2xiYXJcIiwgXCJsaXN0XCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pXG5dO1xuIiwiaW1wb3J0IHsgU1JSZW5kZXJlclJ1bGUgfSBmcm9tIFwiLi4vU1JSZW5kZXJlclJ1bGVcIjtcbmltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4uL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBxdW90ZU5hbWVQYWRBZnRlciwgZ2V0Um9sZURlc2NyaXB0aW9uIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5cbmV4cG9ydCBsZXQgUlVMRVM6IFNSUmVuZGVyZXJSdWxlW10gPSBbXG4gICAgLy8gU2luZ2xlIHJvbGUgcnVsZXMgLSBhbHBoYWJldGljYWxseSBzb3J0ZWRcbiAgICBcbiAgICAvLyBBcnRpY2xlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImFydGljbGVcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJhbm5lciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJhbm5lclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImJhbm5lciByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJsb2NrcXVvdGUgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJibG9ja3F1b3RlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltvdXQgb2YgYmxvY2txdW90ZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDYXB0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2FwdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGNhcHRpb25dXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29tcGxlbWVudGFyeSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJjb21wbGVtZW50YXJ5IHJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFtvdXQgb2YgJHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29udGVudGluZm8gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjb250ZW50aW5mb1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImNvbnRlbnQgaW5mbyByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEZpZ3VyZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImZpZ3VyZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGZpZ3VyZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBGb3JtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZm9ybVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcImZvcm1jb250cm9sXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW291dCBvZiBzZWN0aW9uXVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiBmb3JtXWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEdyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIDxkZXRhaWxzPiB1c2VzIHRoZSBncm91cCByb2xlIGJ1dCBoYXMgaXRzIG93biBkaXNjbG9zdXJlIHdpZGdldCBzZW1hbnRpY3M7XG4gICAgICAgICAgICAgICAgLy8gU1JzIGRvIG5vdCBhbm5vdW5jZSBcIm91dCBvZiBncm91cGluZ1wiIHdoZW4gbGVhdmluZyBhIGRldGFpbHMgZWxlbWVudC5cbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkRFVEFJTFNcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcImNvbWJvYm94XCJdLCBbXCJzZWxlY3RcIl0pPy5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJTRUxFQ1RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiW291dCBvZiBncm91cGluZ11cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImxpc3RcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vL2xpIHwgLi8vKltAcm9sZT0nbGlzdGl0ZW0nXVwiLCBub2RlLCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cyA9IGRvY3VtZW50LmV2YWx1YXRlKFxuICAgICAgICAgICAgICAgICAgICBcIi4vL3VsLy9saXwuLy91bC8vKltAcm9sZT0nbGlzdGl0ZW0nXXwuLy9vbC8vbGl8Li8vb2wvLypbQHJvbGU9J2xpc3RpdGVtJ118Li8vKltAcm9sZT0nbGlzdCddLy9saXwuLy8qW0Byb2xlPSdsaXN0J10vLypbQHJvbGU9J2xpc3RpdGVtJ11cIixcbiAgICAgICAgICAgICAgICAgICAgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIGxldCBudW1JdGVtcyA9IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGgtZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cy5zbmFwc2hvdExlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobnVtSXRlbXMgPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1vdXQgb2YgbGlzdF1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYWluIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWFpblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm1haW4gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBtZW51YmFyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWVudWJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImxpc3RcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIG1lbnViYXJdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBOYXZpZ2F0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibmF2aWdhdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm5hdmlnYXRpb24gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyByYWRpb2dyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicmFkaW9ncm91cFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGdyb3VwaW5nXVwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFJlZ2lvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJlZ2lvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwicmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTZWFyY2ggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzZWFyY2hcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzZWFyY2ggcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWJsZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRhYmxlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltvdXQgb2YgdGFibGVdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVG9vbGJhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRvb2xiYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIHRvb2xiYXJdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBIVE1MIEVsZW1lbnQgcnVsZXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJBQkJSXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpID8gXG4gICAgICAgICAgICAgICAgYFske2N1cnNvci5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFwidGl0bGVcIil9XWAgOiBudWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkRMXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgZGVmaW5pdGlvbiBsaXN0XWBcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRklHQ0FQVElPTlwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIGNhcHRpb25dYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNQVJLXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgaGlnaGxpZ2h0ZWRdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBJbmxpbmUgZnJhbWUgKDxpZnJhbWU+KVxuICAgIC8vIFdoZW4gcm9sZT1cIm5vbmVcIiBvciByb2xlPVwicHJlc2VudGF0aW9uXCIgaXMgc2V0LCBzY3JlZW4gcmVhZGVycyB0cmVhdCB0aGUgZnJhbWVcbiAgICAvLyBhcyBhIGdlbmVyaWMgZ3JvdXBpbmcg4oCUIGFubm91bmNlIFwib3V0IG9mIGdyb3VwaW5nXCIgaW5zdGVhZCBvZiBcIm91dCBvZiBmcmFtZVwiLlxuICAgIC8vIEV4Y2VwdGlvbjogYW4gdW50aXRsZWQgcHJlc2VudGF0aW9uYWwgaWZyYW1lIHByb2R1Y2VzIG5vIGNvbnRhaW5lci1lbnRlciBsYWJlbCwgc29cbiAgICAvLyB0aGUgbWF0Y2hpbmcgY29udGFpbmVyLWV4aXQgbXVzdCBhbHNvIGJlIHN1cHByZXNzZWQgdG8gYXZvaWQgYSBzdHJheSBcIltvdXQgb2YgZ3JvdXBpbmddXCIuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiSUZSQU1FXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZSA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUHJlc2VudGF0aW9uID0gcm9sZSA9PT0gXCJub25lXCIgfHwgcm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIjtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50YXRpb24gJiYgIWN1cnNvci5nZXROYW1lKCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1ByZXNlbnRhdGlvbiA/IGBbb3V0IG9mIGdyb3VwaW5nXWAgOiBgW291dCBvZiBmcmFtZV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBQcmVmb3JtYXR0ZWQgdGV4dCAoPHByZT4pXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiUFJFXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgcHJlZm9ybWF0dGVkIHRleHRdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNdWx0aXBsZSByb2xlcyBydWxlcyAtIHBsYWNlZCBhdCB0aGUgYm90dG9tXG4gICAgXG4gICAgLy8gUmVnaW9uIG1vZGUgcnVsZXMgLSBpZ25vcmUgY29udGFpbmVyIGVsZW1lbnRzIGluIHJlZ2lvbiBhbmQgaGVhZGluZyBtb2RlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImdyb3VwXCIsIFwiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcbiAgICAgICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsIFwiZmlndXJlXCIsIFwiZm9ybVwiLCBcImxpc3RcIiwgXCJyZWdpb25cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcbiAgICAgICAgICAgICAgICBcInNlYXJjaFwiLCBcInRhYmxlXCIsIFwidG9vbGJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wicmVnaW9uXCIsIFwiaGVhZGluZ1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXTtcbiIsImltcG9ydCB7IFJVTEVTIGFzIFNSUnVsZXMgfSBmcm9tIFwiLi9jb21tb25cIjtcbmltcG9ydCB7IFJVTEVTIGFzIENvbnRhaW5lckVudGVyUnVsZXMgfSBmcm9tIFwiLi9jb250YWluZXJfZW50ZXJcIjtcbmltcG9ydCB7IFJVTEVTIGFzIENvbnRhaW5lckV4aXRSdWxlcyB9IGZyb20gXCIuL2NvbnRhaW50ZXJfZXhpdFwiO1xuZXhwb3J0IGxldCBTUl9SVUxFUyA9IFNSUnVsZXM7XG5leHBvcnQgbGV0IENPTlRBSU5FUl9FTlRFUl9SVUxFUyA9IENvbnRhaW5lckVudGVyUnVsZXM7XG5leHBvcnQgbGV0IENPTlRBSU5FUl9FWElUX1JVTEVTID0gQ29udGFpbmVyRXhpdFJ1bGVzO1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG50eXBlIEVsZW1DYWxjID0gKGVsZW06IEVsZW1lbnQpID0+IHN0cmluZztcbnR5cGUgTm9kZUNhbGMgPSAobm9kZTogTm9kZSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBBY2Nlc3NpYmxlTmFtZVJlc3VsdCA9IHtcbiAgICBuYW1lOiBzdHJpbmcsIFxuICAgIG5hbWVGcm9tOiBcImFyaWFMYWJlbFwiIHwgXCJ0aXRsZVwiIHwgXCJwbGFjZWhvbGRlclwiIHwgXCJsYWJlbFwiIFxuICAgICAgICB8IFwidmFsdWVcIiB8IFwiaW50ZXJuYWxcIiB8IFwiYWx0XCIgfCBcInRleHRcIiB8IFwibGVnZW5kXCIgXG4gICAgICAgIHwgXCJzdW1tYXJ5XCIgfCBcImZpZ2NhcHRpb25cIiB8IFwiY2FwdGlvblwiXG4gICAgICAgIHwgXCJzaGFkb3dcIiB8IFwic2xvdFwiIHwgXCJzaGFkb3ctaG9zdFwiIHwgXCJjb250ZW50LXNsb3RcIlxuICAgICAgICB8IFwiY29udGVudFwiXG4gICAgICAgIHwgXCJzdmdsaW5rVGl0bGVcIiB8IFwic3ZnVGl0bGVcIiB8IFwic3ZnVGV4dFwiIHwgXCJzdmdEZXNjXCJcbiAgICAgICAgfCBcImFyaWEtZGVzY3JpcHRpb25cIlxuICAgICAgICB8IHN0cmluZyAvLyBjc3MtKlxufVxuZXhwb3J0IGNsYXNzIEFjY05hbWVVdGlsIHtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgYWNjZXNzaWJsZSBuYW1lIGZvciBhbiBTVkcgZWxlbWVudCBhY2NvcmRpbmcgdG8gVzNDIHNwZWNpZmljYXRpb25cbiAgICAgKiBGb2xsb3dpbmcgdGhlIEFjY2Vzc2libGUgTmFtZSBhbmQgRGVzY3JpcHRpb24gQ29tcHV0YXRpb24gMS4xIGFsZ29yaXRobVxuICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9hY2NuYW1lLTEuMS9cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZWxlbSBUaGUgU1ZHIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyBUaGUgYWNjZXNzaWJsZSBuYW1lIHJlc3VsdCBvciBudWxsIGlmIG5vIGFjY2Vzc2libGUgbmFtZSBpcyBmb3VuZFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU1ZHRWxlbWVudFczQyhlbGVtOiBFbGVtZW50KTogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3N2ZycpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogQ2hlY2sgZm9yIGFyaWEtbGFiZWxsZWRieSAoYWxyZWFkeSBoYW5kbGVkIGJ5IG1haW4gY29tcHV0ZUFjY2Vzc2libGVOYW1lIGZ1bmN0aW9uKVxuICAgICAgICAvLyBTdGVwIDI6IENoZWNrIGZvciBhcmlhLWxhYmVsIChhbHJlYWR5IGhhbmRsZWQgYnkgbWFpbiBjb21wdXRlQWNjZXNzaWJsZU5hbWUgZnVuY3Rpb24pXG5cbiAgICAgICAgLy8gU3RlcCAzOiBDaGVjayBmb3IgdGl0bGUgZWxlbWVudFxuICAgICAgICBjb25zdCBzdmdUaXRsZXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiB0aXRsZVwiKTtcbiAgICAgICAgaWYgKHN2Z1RpdGxlcyAmJiBzdmdUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgc3ZnVGl0bGVzLmZvckVhY2goc3ZnVGl0bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdmdUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnVGl0bGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHN2Z1RpdGxlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHN2Z1RpdGxlLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gdGl0bGUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IFwibmFtZVwiOiB0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z1RpdGxlXCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNDogQ2hlY2sgZm9yIHRleHQgY29udGVudCBpbiBTVkcgdGV4dCBlbGVtZW50c1xuICAgICAgICBsZXQgdGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICBjb25zdCB0ZXh0RWxlbWVudHMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0ZXh0LCB0ZXh0UGF0aCwgdHNwYW5cIik7XG4gICAgICAgIGlmICh0ZXh0RWxlbWVudHMgJiYgdGV4dEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRleHRFbGVtZW50cy5mb3JFYWNoKHRleHRFbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHRleHRFbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbCh0ZXh0RWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRleHRFbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudCArPSBcIiBcIiArIGNvbnRlbnQudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHRDb250ZW50LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHRDb250ZW50LnRyaW0oKSksIFwibmFtZUZyb21cIjogXCJzdmdUZXh0XCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNTogQ2hlY2sgZm9yIHhsaW5rOnRpdGxlIGF0dHJpYnV0ZSBvbiBsaW5rcyB3aXRoaW4gU1ZHXG4gICAgICAgIGNvbnN0IGxpbmtzID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGxpbmtzW2ldO1xuICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChsaW5rKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChsaW5rKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhsaW5rVGl0bGUgPSBsaW5rLmdldEF0dHJpYnV0ZShcInhsaW5rOnRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIGlmICh4bGlua1RpdGxlICYmIHhsaW5rVGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHhsaW5rVGl0bGUpLCBcIm5hbWVGcm9tXCI6IFwic3ZnbGlua1RpdGxlXCIgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNjogQ2hlY2sgZm9yIGFyaWEtZGVzY3JpYmVkYnkgb3IgYXJpYS1kZXNjcmlwdGlvblxuICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSBBcmlhVXRpbC5nZXRBcmlhRGVzY3JpcHRpb24oZWxlbSk7XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGRlc2NyaXB0aW9uKSwgXCJuYW1lRnJvbVwiOiBcImFyaWEtZGVzY3JpcHRpb25cIiB9O1xuXG4gICAgICAgIC8vIFN0ZXAgNzogQ2hlY2sgZm9yIGRlc2MgZWxlbWVudFxuICAgICAgICBjb25zdCBkZXNjRWxlbWVudHMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiBkZXNjXCIpO1xuICAgICAgICBpZiAoZGVzY0VsZW1lbnRzICYmIGRlc2NFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgZGVzY1RleHQgPSBcIlwiO1xuICAgICAgICAgICAgZGVzY0VsZW1lbnRzLmZvckVhY2goZGVzY0VsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZGVzY0VsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGRlc2NFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY0VsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2MudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NUZXh0ICs9IFwiIFwiICsgZGVzYy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZGVzY1RleHQudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICByZXR1cm4geyBcIm5hbWVcIjogZGVzY1RleHQudHJpbSgpLCBcIm5hbWVGcm9tXCI6IFwic3ZnRGVzY1wiIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDg6IENoZWNrIGZvciB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmICh0aXRsZSAmJiB0aXRsZS50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IFwibmFtZVwiOiBDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0aXRsZSksIFwibmFtZUZyb21cIjogXCJ0aXRsZVwiIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBhY2Nlc3NpYmxlIG5hbWUgZm91bmRcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgYSBnaXZlbiBub2RlXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgbmFtZV9wYWlyID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAobmFtZV9wYWlyICE9PSB1bmRlZmluZWQpIHJldHVybiBuYW1lX3BhaXI7XG5cbiAgICAgICAgLy8gMS4gbmFtZSBmcm9tIGF1dGhvciwgb3IgZWxlbWVudHMgd2l0aG91dCBhIHJvbGUgYnV0IHdpdGggYXJpYS1sYWJlbGxlZGJ5IG9yIGFyaWEtbGFiZWwgXG4gICAgICAgIC8vICAgZ2V0IGFyaWEgbGFiZWwgZXZlbiBmb3IgdGhlIHJvbGUgd2hlcmUgdGhlIG5hbWUgaXMgcHJvaGliaXRlZCBvciBpcyAncHJlc2VudGF0aW9uJyBvciAnbm9uZSdcbiAgICAgICAgbGV0IGFjY05hbWUgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlbSk7XG4gICAgICAgIGlmIChhY2NOYW1lICYmIGFjY05hbWUudHJpbSgpICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhY2NOYW1lKSwgXCJuYW1lRnJvbVwiOiBcImFyaWFMYWJlbFwifSk7XG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGFjY05hbWUpLCBcIm5hbWVGcm9tXCI6IFwiYXJpYUxhYmVsXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gYWNjZXNzaWJsZSBuYW1lIG1hcHBpbmcgZm9yIG5hdGl2ZSBodG1sIGVsZW1lbnRzXG4gICAgICAgIG5hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvck5hdGl2ZUVsZW1lbnQoZWxlbSk7XG4gICAgICAgIGlmIChuYW1lX3BhaXIpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIkVMRU1FTlRfQUNDRVNTQkxFX05BTUVcIiwgbmFtZV9wYWlyKTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lX3BhaXI7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIDMuIG5hbWUgZnJvbSBuYXRpdmUgb3IgYXJpYSBhdHRyaWJ1dGVcbiAgICAgICAgLyoqbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRnJvbUF0dHJpYnV0ZShlbGVtKTtcbiAgICAgICAgaWYgKG5hbWVfcGFpcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCBuYW1lX3BhaXIpO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWVfcGFpcjtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLy8gNC4gbmFtZSBmcm9tIGNvbnRlbnQgZm9yIGN1c3RvbSBlbGVtZW50cyB3aXRoIGEgcm9sZVxuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICBpZiAoQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKSB7XG4gICAgICAgICAgICBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ29udGVudChlbGVtKTtcbiAgICAgICAgICAgIGlmIChuYW1lX3BhaXIpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIG5hbWVfcGFpcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVfcGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIG5hbWUgZnJvbSB0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBcInRpdGxlXCJcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidGl0bGVcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHRpdGxlICYmIHRpdGxlLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGl0bGUgPSBDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0aXRsZSk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCB7XCJuYW1lXCI6dGl0bGUsIFwibmFtZUZyb21cIjogXCJ0aXRsZVwifSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0aXRsZSwgXCJuYW1lRnJvbVwiOiBcInRpdGxlXCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyA2LiBuYW1lIGZyb20gdGhlIGF0dHJpYnV0ZSBcInBsYWNlaG9sZGVyXCJcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBDb21tb25VdGlsLmlucHV0X3R5cGVfd2l0aF9wbGFjZWhvbGRlci5pbmNsdWRlcyhlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikpKSkpIHtcbiAgICAgICAgICAgIGxldCBwbGFjZWhvbGRlciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIik7XG4gICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIgJiYgcGxhY2Vob2xkZXIudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlciA9IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHtcIm5hbWVcIjpwbGFjZWhvbGRlciwgXCJuYW1lRnJvbVwiOiBcInBsYWNlaG9sZGVyXCJ9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnBsYWNlaG9sZGVyLCBcIm5hbWVGcm9tXCI6IFwicGxhY2Vob2xkZXJcIn07XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgbmF0aXZlIGVsZW1lbnRzXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JOYXRpdmVFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBsYWJlbGxhYmxlIGZpZWxkc1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldEZvcm1GaWVsZExhYmVsKGVsZW0pO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlucHV0IHR5cGVzOiBidXR0b24sIHJlc2V0LCBzdWJtaXQsIGltYWdlXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSkgeyBcbiAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmZvcm1fYnV0dG9uX3R5cGVzLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB0eXBlczogYnV0dG9uLCByZXNldCwgc3VibWl0XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGZvciB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodmFsdWUpLCBcIm5hbWVGcm9tXCI6IFwidmFsdWVcIn07XG5cbiAgICAgICAgICAgICAgICAvLyBpbnB1dCAnc3VibWl0JyBhbmQgJ3Jlc2V0JyBoYXZlIHZpc2libGUgZGVmYXVsdHMgc28gcGFzcyBpZiB0aGVyZSBpcyBubyBleHBsaWNpdCAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6dHlwZSwgXCJuYW1lRnJvbVwiOiBcImludGVybmFsXCJ9O1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHR5cGUgPSAnaW1hZ2UnXG4gICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHRob3VnaCBIVE1MIDUgc3BlYyBpbmRpY2F0ZXMgXCJUaGUgZWxlbWVudCdzIFt2YWx1ZV0gYXR0cmlidXRlIG11c3QgYmUgb21pdHRlZFwiLCBDaHJvbWUgdXNlcyB0aGUgdmFsdWUuXG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBhY2Nlc3NpYmxlIG5hbWUgZm9yIHRoZSBhbHQgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgY29uc3QgYWx0ID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChhbHQgJiYgYWx0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoYWx0KSwgXCJuYW1lRnJvbVwiOiBcImFsdFwifTs7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGUgdmlzaWJsZSBkZWZhdWx0IHRleHQgZm9yIHR5cGUgXCJpbWFnZVwiIGlzIFwiU3VibWl0XCIgc2FtZSB3aXRoIHRoZSB0eXBlIFwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAvL3JldHVybiB7XCJuYW1lXCI6ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLCBcIm5hbWVGcm9tXCI6IFwiaW50ZXJuYWxcIn07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBidXR0b25cbiAgICAgICAgLy8gbm90ZSBidXR0b24gbWF5IGhhdmUgYSB2YWx1ZSBhdHRyaWJ1dGUsIGJ1dCBpdCdzIG5vdCBhIHZpc2libGUgdGV4dFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IHVzZSB0aGUgYnV0dG9uIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJ0ZXh0XCJ9O1xuXG4gICAgICAgICAgICAvLyBmb3IgaW1hZ2UgYnV0dG9uOiBnZXQgdGhlIGZpcnN0IGltYWdlIGlmIGV4aXN0c1xuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuICAgICAgICAgICAgaWYgKGltYWdlICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChpbWFnZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwoaW1hZ2UpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoaW1hZ2UpOyBcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGZvciBhIGJ1dHRvbiB3aXRoIGEgc3ZnIGltYWdlXG4gICAgICAgICAgICBjb25zdCBzdmcgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xuICAgICAgICAgICAgaWYgKHN2ZyAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChzdmcpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoc3ZnKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaWVsZHNldFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZmllbGRzZXRcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkc2V0IGVsZW1lbnQncyBmaXJzdCBjaGlsZCBpcyBhIGxlZ2VuZCBlbGVtZW50LCB0aGVuIHVzZSB0aGUgc3VidHJlZSBvZiB0aGUgbGVnZW5kXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoZmlyc3QgJiYgZmlyc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2xlZ2VuZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBsZWdlbmQgY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGZpcnN0IGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJsZWdlbmRcIn07IFxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBvdXRwdXRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcIm91dHB1dFwiKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgYXNzb2NpYXRlZCBsYWJlbCBlbGVtZW50IGV4aXN0cywgdXNlIGNvbmNhdGVuYXRlZCBhY2Nlc3NpYmxlIG5hbWUocykgZnJvbSBsYWJlbGxlZCBlbGVtZW50cy5cbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImZvclwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsSURzICYmIGxhYmVsSURzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsYWJlbElEcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IGVsZW0ub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChsYWJlbElEc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlbSkgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGxhYmVsTm9kZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwobGFiZWxOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgKz0gXCIgXCIgKyBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocGFpci5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGxhYmVsKSwgXCJuYW1lRnJvbVwiOiBcImxhYmVsXCJ9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdW1tYXJ5XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdW1tYXJ5XCIpIHtcbiAgICAgICAgICAgIC8vIHVzZSBzdW1tYXJ5IGVsZW1lbnQgc3VidHJlZVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChlbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwibGVnZW5kXCJ9OyAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGV0YWlsc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZGV0YWlsc1wiKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoZmlyc3QgJiYgZmlyc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKSB7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IGFjY2Vzc2libGUgbmFtZSBmcm9tIHN1bW1hcnlcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGZpcnN0KTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChwYWlyLm5hbWUudHJpbSgpKSwgXCJuYW1lRnJvbVwiOiBcInN1bW1hcnlcIn07IFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gc3VtbWFyeSBlbGVtZW50IGFzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBkZXRhaWxzIGVsZW1lbnQsIFxuICAgICAgICAgICAgLy8gdGhlIHVzZXIgYWdlbnQgc2hvdWxkIHByb3ZpZGUgb25lIHdpdGggYSBzdWJ0cmVlIGNvbnRhaW5pbmcgYSBsb2NhbGl6ZWQgc3RyaW5nIG9mIHRoZSB3b3JkIFwiZGV0YWlsc1wiLlxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpcImRldGFpbHNcIiwgXCJuYW1lRnJvbVwiOiBcImludGVybmFsXCJ9OyAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlndXJlXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJmaWd1cmVcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZ3VyZSBlbGVtZW50IGhhcyBhIGZpZ2NhcHRpb24gYXMgYSBjaGlsZFxuICAgICAgICAgICAgbGV0IGNhcHRpb24gPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4oZWxlbSwgXCJmaWdjYXB0aW9uXCIsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChjYXB0aW9uICYmIGNhcHRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGZpZ2NhcHRpb24gY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNhcHRpb25bMF0gYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcImZpZ2NhcHRpb25cIn07ICBcbiAgICAgICAgICAgIH0gICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW1nIGVsZW1lbnRzOiB1c2UgYXR0cmlidXRlIFwiYWx0XCJcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImltZ1wiKSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWx0ID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhbHQpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXJlYSBlbGVtZW50czogdXNlIGF0dHJpYnV0ZSBcImFsdFwiXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJhcmVhXCIpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBhbHQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoYWx0ICYmIGFsdC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhbHQpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGFibGUgZWxlbWVudFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwidGFibGVcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZ3VyZSBlbGVtZW50IGhhcyBhIGNhcHRpb24gYXMgdGhlIGZpcnN0IGNoaWxkXG4gICAgICAgICAgICBsZXQgY2FwdGlvbkVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGNhcHRpb25FbGVtICYmIGNhcHRpb25FbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjYXB0aW9uJykge1xuICAgICAgICAgICAgICAgIC8vIGNhcHRpb24gY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCBjYXB0aW9uID0gKGNhcHRpb25FbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKGNhcHRpb24gJiYgY2FwdGlvbi50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoY2FwdGlvbiksIFwibmFtZUZyb21cIjogXCJjYXB0aW9uXCJ9OyBcbiAgICAgICAgICAgIH0gICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGEgZWxlbWVudFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYVwiKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCB1c2UgdGhlIGxpbmsgdGV4dFxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChlbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcInRleHRcIn07XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAvL2ZvciBpbWFnZSBsaW5rOiBnZXQgdGhlIGltYWdlIG9yIHN2ZyBpZiBleGlzdHNcbiAgICAgICAgICAgIGNvbnN0IGltYWdlcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+IGltZywgOnNjb3BlID4gc3ZnXCIpO1xuICAgICAgICAgICAgaWYgKGltYWdlcyAmJiBpbWFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpbWFnZXMuZm9yRWFjaChpbWFnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoaW1hZ2UpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGltYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoaW1hZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBcIiBcIiArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnRleHQudHJpbSgpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3B0Z3JvdXBcbiAgICAgICAgLy8gbGFiZWwgcGFydGljaXBhdGUgaW4gYWNjZXNzaWJsZSBuYW1lIGNhbGN1bGF0aW9uOiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNhdHQtbGFiZWxcbiAgICAgICAgLy8gVGhlIGxhYmVsIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZC4gSXRzIHZhbHVlIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBncm91cFxuICAgICAgICAvLyB0aGUgdmFsdWUgaXMgZGlzYWJsZWQgaW4gdGhlIGludGVyZmFjZVxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwib3B0Z3JvdXBcIiB8fCBub2RlTmFtZSA9PT0gXCJvcHRpb25cIiB8fCBub2RlTmFtZSA9PT0gXCJ0cmFja1wiKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwibGFiZWxcIik7XG4gICAgICAgICAgICBpZiAobGFiZWwgJiYgbGFiZWwudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN2Z1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTVkdFbGVtZW50VzNDKGVsZW0pO1xuICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgbmF0aXZlIGVsZW1lbnRzXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTVkdFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgLy8gMS4gYSBkaXJlY3QgY2hpbGQgb3IgZGVzY2VuZGFudCB0aXRsZSBlbGVtZW50IFxuICAgICAgICBjb25zdCBzdmdUaXRsZXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiB0aXRsZVwiKTtcbiAgICAgICAgaWYgKHN2Z1RpdGxlcyAmJiBzdmdUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgc3ZnVGl0bGVzLmZvckVhY2goc3ZnVGl0bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdmdUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnVGl0bGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHN2Z1RpdGxlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHN2Z1RpdGxlLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gdGl0bGUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z1RpdGxlXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4geGxpbms6dGl0bGUgYXR0cmlidXRlIG9uIGEgbGlua1xuICAgICAgICBsZXQgbGlua1RpdGxlID0gZWxlbS5xdWVyeVNlbGVjdG9yKFwiYVwiKTtcbiAgICAgICAgaWYgKGxpbmtUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQobGlua1RpdGxlKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChsaW5rVGl0bGUpKSB7XG4gICAgICAgICAgICBsZXQgbGluayA9IGxpbmtUaXRsZS5nZXRBdHRyaWJ1dGUoXCJ4bGluazp0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmIChsaW5rICYmIGxpbmsudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGxpbmspLCBcIm5hbWVGcm9tXCI6IFwic3ZnbGlua1RpdGxlXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqIDMuIGZvciB0ZXh0IGNvbnRhaW5lciBlbGVtZW50cywgdGhlIHRleHQgY29udGVudC4gXG4gICAgICAgICAqIG5vdGUgdGhlIFNWRyB0ZXh0IGNvbnRlbnQgZWxlbWVudHMgYXJlOiDigJh0ZXh04oCZLCDigJh0ZXh0UGF0aOKAmSBhbmQg4oCYdHNwYW7igJkuXG4gICAgICAgICAqICBzdmcgZWxlbWVudCBjYW4gYmUgbmVzdGVkLiBPbmUgb2YgdGhlIHB1cnBvc2VzIGlzIHRvIHRvIGdyb3VwIFNWRyBzaGFwZXMgdG9nZXRoZXIgYXMgYSBjb2xsZWN0aW9uIGZvciByZXNwb25zaXZlIGRlc2lnbi5cbiAgICAgICAgICogXG4gICAgICAgICAqIHNlbGVjdCB0ZXh0IGNvbnRlbnQgZXhjbHVkZWQgdGhlIHRleHQgZnJvbSB0aGUgbmVzdGVkIHN2ZyBlbGVtZW50cyBhbmQgdGhlaXIgY2hpbGRyZW4gXG4gICAgICAgICAqLyBcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiAqXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdzdmcnICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IHZhbHVlO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwic3ZnVGV4dFwifTsgXG5cbiAgICAgICAgLy8gNC4gZnJvbSBhcmlhLWRlc2NyaWJlZGJ5IG9yIGFyaWEtZGVzY3JpcHRpb24gXG4gICAgICAgIGxldCBkZXNjYnkgPSBBcmlhVXRpbC5nZXRBcmlhRGVzY3JpcHRpb24oZWxlbSk7XG4gICAgICAgIGlmIChkZXNjYnkgJiYgZGVzY2J5LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChkZXNjYnkpLCBcIm5hbWVGcm9tXCI6IFwiYXJpYS1kZXNjcmlwdGlvblwifTtcblxuICAgICAgICAvLyA1LiBhIGRpcmVjdCBjaGlsZCBvciBkZXNjZW5kYW50IGRlc2MgZWxlbWVudFxuICAgICAgICBsZXQgZGVzY0VsZW1zID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlID4gZGVzY1wiKTtcbiAgICAgICAgaWYgKGRlc2NFbGVtcyAmJiBkZXNjRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgZGVzY0VsZW1zLmZvckVhY2goZGVzY0VsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZXNjRWxlbSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZGVzY0VsZW0pICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGRlc2NFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY0VsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2MudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gZGVzYy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z0Rlc2NcIn07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBjdXN0b20gZWxlbWVudHMgbWFya2VkIHdpdGggYXJpYVxuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRnJvbUNvbnRlbnQoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgLyoqIGZvciBhY2MgbmFtZSBmcm9tIGNvbnRlbnQsIHRoZSBjb250ZW50IGZyb20gQ1NTIHBzZXVkby1lbGVtZW50cyBcbiAgICAgICAgICogIDpiZWZvcmUgYW5kIDphZnRlciBwc2V1ZG8gZWxlbWVudHMgW0NTUzJdIGNhbiBwcm92aWRlIHRleHR1YWwgY29udGVudCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgY29udGVudCBtb2RlbC5cbiAgICAgICAgICogRm9yIDpiZWZvcmUgb3IgOmFmdGVyIHBzZXVkbyBlbGVtZW50cywgdXNlciBhZ2VudHMgbXVzdCBwcmVwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgYSBzcGFjZSwgXG4gICAgICAgICAqICAgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JDU1NQc2V1ZG9FbGVtZW50KGVsZW0sIFwiYmVmb3JlXCIpO1xuICAgICAgICBpZiAocGFpciAhPT0gbnVsbCAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG5cbiAgICAgICAgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvckNTU1BzZXVkb0VsZW1lbnQoZWxlbSwgXCJhZnRlclwiKTtcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBwYWlyO1xuXG4gICAgICAgIC8vICBzaGFkb3cgaG9zdFxuICAgICAgICBpZiAoZWxlbS5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU2hhZG93SG9zdChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwic2hhZG93XCJ9OztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gc2xvdCBlbGVtZW50XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzbG90XCIpIHtcbiAgICAgICAgICAgIHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTbG90RWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwic2xvdFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG90aGVyd2lzZTogZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBlbGVtZW50XG4gICAgICAgIHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ2hpbGRyZW4oZWxlbSk7XG4gICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOiBwYWlyLm5hbWUsIFwibmFtZUZyb21cIjogXCJjb250ZW50XCJ9O1xuXG4gICAgICAgIC8vIG5vIGFjY2Vzc2libGUgbmFtZSBleGlzdHNcbiAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZnJvbSBDU1MgZ2VuZXJhdGVkIGNvbnRlbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvckNTU1BzZXVkb0VsZW1lbnQoZWxlbTogRWxlbWVudCwgdHlwZTpzdHJpbmcpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29udGVudEVsZW0gPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLHR5cGUpO1xuICAgICAgICBpZiAoY29udGVudEVsZW0pIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gY29udGVudEVsZW0uY29udGVudDtcbiAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQgIT09IFwibm9uZVwiICYmIGNvbnRlbnQgIT09IFwibm9cIiAmJiBjb250ZW50ICE9PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOiBDb21tb25VdGlsLnRydW5jYXRlVGV4dChjb250ZW50KSwgXCJuYW1lRnJvbVwiOiBcImNzcy1cIit0eXBlfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBTTE9UIGVsZW1lbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvclNoYWRvd0hvc3QoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBlbGVtLnNoYWRvd1Jvb3Q7XG4gICAgICAgIGlmIChzaGFkb3dSb290KSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKTsgICBcbiAgICAgICAgICAgIC8vIGNoZWNrIHRleHQgZnJvbSBhbGwgdGhlIGNoaWxkcmVuIGVsZW1lbnRzXG4gICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogQ29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJzaGFkb3ctaG9zdFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBTTE9UIGVsZW1lbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvclNsb3RFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgLy9pZiBubyBhc3NpZ25lZE5vZGUsIGNoZWNrIGl0cyBvd24gdGV4dCBcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICBpZiAoIShlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpIHx8IChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgdGV4dCArPSBcIiBcIiArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgIH0gZWxzZSB7ICAgIFxuICAgICAgICAgICAgLy8gY2hlY2sgdGV4dCBmcm9tIGFsbCBhc3NpZ25lZCBub2Rlc1xuICAgICAgICAgICAgZm9yIChjb25zdCBzbG90Q2hpbGQgb2YgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShzbG90Q2hpbGQgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudC1zbG90XCJ9O1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZnJvbSBjaGlsZHJlbiBjb250ZW50XG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ2hpbGRyZW4oZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG5cbiAgICAgICAgLy9sZXQgd2Fsa0NoaWxkID0gZWxlbS5maXJzdENoaWxkO1xuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW0pO1xuICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBjaGlsZHJlbnMgb2YgdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSB0ZXh0XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGVsZW0gJiYgbncubm9kZSAhPT0gZWxlbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykgY29udGludWU7XG4gICAgICAgIC8vd2hpbGUgKHdhbGtDaGlsZCkgeyBcbiAgICAgICAgICAgIGNvbnN0IHdhbGtDaGlsZCA9IG53Lm5vZGU7IFxuICAgICAgICAgICAgaWYgKHdhbGtDaGlsZC5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgdGV4dCBub2RlLCBnZXQgdGhlIHBhcmVudG5vZGUgdG8gY2hlY2sgdmlzaWJpbGl0eVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHdhbGtDaGlsZC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocGFyZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChwYXJlbnQpICYmIHdhbGtDaGlsZC5ub2RlVmFsdWUgJiYgd2Fsa0NoaWxkLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgd2Fsa0NoaWxkLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdhbGtDaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQod2Fsa0NoaWxkIGFzIEhUTUxFbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbCh3YWxrQ2hpbGQgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZSh3YWxrQ2hpbGQgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyBwYWlyLm5hbWUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2tpcCBjaGlsZHJlbiBpZiB0aGlzIGVsZW1lbnQgb25seSBoYXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBpZiBhY2Nlc3NpYmxlIG5hbWUgY2FuIGJlIGlnbm9yZWQgZm9yIGltYWdlIG9yIHN2Z1xuICAgIHB1YmxpYyBzdGF0aWMgaXNBY2Nlc3NpYmxlTmFtZUlnbm9yYWJsZShlbGVtOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lICE9PSAnaW1nJyAmJiBub2RlTmFtZSAhPT0gJ3N2ZycpIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXJlbnQgPSBlbGVtLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgaXMgYSB3aWRnZXQgYW5kIGhhcyBhbiBhcmlhIGxhYmVsLCB0aGVuIGltYWdlL3N2ZyBsYWJlbCBpcyBub3QgbmVjZXNzYXJ5XG4gICAgICAgICAgICBpZiAoKEFyaWFVdGlsLmlzV2lkZ2V0KHBhcmVudCkgfHwgQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShwYXJlbnQpKSAmJiBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0gXG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zLCBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50IH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4vQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBBcmlhVXRpbCB7XG5cbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRhZ3Mgd2hpY2ggaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIHNpbmNlIHdlIGhhdmUgcnVsZXMgdHJpZ2dlcmluZ1xuICAgIHB1YmxpYyBzdGF0aWMgbmF2TGlua0tleXdvcmRzID0gWydzdGFydCcsICduZXh0JywgJ3ByZXYnLCAncHJldmlvdXMnLCAnY29udGVudHMnLCAnaW5kZXgnXVxuXG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBydWxlIGlkcyBmb3IgdGhlIHJ1bGVzIHRoYXQgaGF2ZSB0byBjaGVjayBmb3IgaGlkZGVuIGNvbnRlbnQgcmVnYXJkbGVzcyBvZiB0aGUgQ2hlY2sgSGlkZGVuXG4gICAgLy8gQ29udGVudCBTZXR0aW5nLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUgZW5naW5lIGlzIGFjdHVhbGx5IGRldGVybWluZSB3aGljaCBlbGVtZW50cyB0byBtYXNzIHRvIHRoZSBydWxlcywgaXQgd2lsbCBhbHdheXNcbiAgICAvLyBwYXNzIHRoZXNlcyBydWxlcyBubyBtYXR0ZXIgd2hhdCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZyBpcy5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVzVGhhdEhhdmVUb0NoZWNrSGlkZGVuID0gWydSUFRfRWxlbV9VbmlxdWVJZCddXG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGVBdEluZGV4KGVsZSwgaW5kZXgpIHtcbiAgICAgICAgbGV0IGF0dHJOYW1lID0gZWxlLmF0dHJpYnV0ZXNbaW5kZXhdLm5hbWU7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2ludHJvc3RhdGVzXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzID0ge1xuICAgICAgICBcImFsZXJ0XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwiYXNzZXJ0aXZlXCIsXG4gICAgICAgICAgICBcImFyaWEtYXRvbWljXCI6IFwidHJ1ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29tYm9ib3hcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibGlzdGJveFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGlzdGJveFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibG9nXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwicG9saXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51YmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1ldGVyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBcIjEwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBcImZhbHNlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwcm9ncmVzc2JhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNjcm9sbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXBhcmF0b3JcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzbGlkZXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGluYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIGhvdyB0byBlbmNvZGUgbWluL21heCAob3Igbm93IGluIDEuMiAtIFwiaGFzIG5vIHZhbHVlXCIpXG4gICAgICAgICAgICAvL1wiYXJpYS12YWx1ZW5vd1wiOiBcIjBcIiBUT0RPOiBhdCByaXNrOiBtYXliZSBkZWxldGUgYWZ0ZXIgQVJJQSAxLjIgcmVhY2hlcyBwcm9wb3NlZCByZWNcbiAgICAgICAgICAgIC8vIFByb2JhYmx5IGp1c3QgZGVsZXRlIHNwaW5idXR0b24gZnJvbSB0aGlzIGxpc3QgY29tcGxldGVseSBhbmQgbGV0IHVzZXIgYWdlbnRzIGhhbmRsZSBcImRlZmF1bHRzXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdGF0dXNcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIixcbiAgICAgICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJ0cnVlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IFwiZmFsc2VcIlxuICAgICAgICB9LFxuICAgICAgICBcInRhYmxpc3RcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidG9vbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0cmVlXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2FyaWEtYXRvbWljXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlR2xvYmFsRGVmYXVsdHMgPSB7XG4gICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IFwibm9uZVwiLFxuICAgICAgICBcImFyaWEtYnVzeVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWN1cnJlbnRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZHJvcGVmZmVjdFwiOiBcIm5vbmVcIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWdyYWJiZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWludmFsaWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiBcIm9mZlwiLFxuICAgICAgICBcImFyaWEtbW9kYWxcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1wcmVzc2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IFwiZmFsc2VcIixcbiAgICAgICAgLy9cImFyaWEtcmVsZXZhbnRcIjogXCJhZGRpdGlvbnMgdGV4dFwiLCBUT0RPOiBhcmUgbXVsdGlwbGUgdmFsdWVzIHN1cHBvcnRlZD9cbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXNvcnRcIjogXCJub25lXCJcbiAgICB9XG5cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNodG1sLWF0dHJpYnV0ZS1zdGF0ZS1hbmQtcHJvcGVydHktbWFwcGluZ3NcbiAgICBwdWJsaWMgc3RhdGljIGFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzID0ge1xuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIFwiZm9ybVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1lbnVpdGVtXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIipcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJpbmRldGVybWluYXRlXCIpKSByZXR1cm4gXCJtaXhlZFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmllbGRzZXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm9wdGdyb3VwXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3B0aW9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiB7XG4gICAgICAgICAgICBcImRldGFpbHNcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkaWFsb2dcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjoge1xuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSkgcmV0dXJuIFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgYXJpYSBhdHRyaWJ1dGUgbmFtZSBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZW0pIHtcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZXMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUgZnJvbSBkb21cbiAgICAgKiBAcGFyYW0gZWxlICBlbGVtZW50XG4gICAgICogQHJldHVybnMgdXNlciBkZWZpbmVkIGh0bWwgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRIdG1sQXR0cmlidXRlcyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgaXNBcmlhID0gYXR0ck5hbWUuc3Vic3RyaW5nKDAsIDUpID09PSAnYXJpYS0nO1xuICAgICAgICAgICAgICAgIGlmICghaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlcy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgYXJpYSBhdHRyaWJ1dGUgbmFtZS12YWx1ZSBwYWlyIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBhcmlhIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pIHtcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gJycpIGF0dHJWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGlzQXJpYSA9IGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJztcbiAgICAgICAgICAgICAgICBpZiAoaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlcy5wdXNoKHsgbmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgaHRtbCBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEh0bWxBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FyaWEpXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzLnB1c2goeyBuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBpbXBsaWNpdCBhcmlhIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZSwgYW4gaW5wdXQgd2l0aCBjaGVja2VkIGlzIGVxdWl2YWxlbnQgdG8gYXJpYS1jaGVja2VkPVwidHJ1ZVwiXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhQXR0cmlidXRlKGVsZSwgYXR0cmlidXRlTmFtZSkge1xuICAgICAgICAvLyBJZiB0aGUgYXR0cmlidXRlIGlzIGRlZmluZWQsIGl0IHRha2VzIHByZWNlZGVuY2VcbiAgICAgICAgbGV0IHJldFZhbCA9IGVsZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgICAgaWYgKGVsZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgJiYgcmV0VmFsLnRyaW0oKSA9PT0gXCJcIikgeyAvL1wiXCIgaXMgdHJlYXRlZCBhcyBmYWxzZSwgc28gd2UgbmVlZCByZXR1cm4gaXQgYmVmb3JlIHRoZSBiZWxvdyBjaGVja1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGVuIGRldGVybWluZSBpbXBsaWNpdCB2YWx1ZXMgZnJvbSBvdGhlciBhdHRyaWJ1dGVzXG4gICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICBsZXQgdGFnID0gZWxlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5ncykge1xuICAgICAgICAgICAgICAgIGlmICh0YWcgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV1bdGFnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocmV0VmFsKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCIqXCIgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV1bXCIqXCJdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgcm9sZS1iYXNlZCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChyb2xlIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVSb2xlRGVmYXVsdHMgJiYgYXR0cmlidXRlTmFtZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZVJvbGVEZWZhdWx0c1tyb2xlXVthdHRyaWJ1dGVOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RpbGwgbm90IGRlZmluZWQ/IENoZWNrIGdsb2JhbCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBhdHRyaWJ1dGVOYW1lIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVHbG9iYWxEZWZhdWx0cykge1xuICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUdsb2JhbERlZmF1bHRzW2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpIHtcbiAgICAgICAgbGV0IGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykge1xuICAgICAgICAgICAgLy8gVXNlciBhZ2VudHMgU0hPVUxEIHRyZWF0IHN0YXRlIGFuZCBwcm9wZXJ0eSBhdHRyaWJ1dGVzIHdpdGggYSB2YWx1ZSBvZiBcIlwiIHRoZSBzYW1lIGFzIHRoZXkgdHJlYXQgYW4gYWJzZW50IGF0dHJpYnV0ZS5cbiAgICAgICAgICAgIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpICYmIGVsZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV0FJLUFSSUHigJlzIHJvbGUgYXR0cmlidXRlIG1heSBoYXZlIGEgbGlzdCBvZiB2YWx1ZXMsIGJ1dCBvbmx5IHRoZSBmaXJzdCB2YWxpZCBhbmQgc3VwcG9ydGVkIFdBSS1BUklBIHJvbGUgaXMgdXNlZFxuICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS1pbXBsZW1lbnRhdGlvbi8jbWFwcGluZ19yb2xlX3RhYmxlXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZyB0aGUgcmVzb2xlZCByb2xlIGZvciBhbiBlbGVtZW50LlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiBzdHJpbmcgLSByZXNvbHZlZCByb2xlIGZvciB0aGUgZWxlbWVudDpcbiAgICAgKiAgICAgICBleHBsaWNpdCByb2xlOiByZXNvbGVkIGZyb20gdGhlIGxpc3Qgb2YgdmFsdWVzXG4gICAgICogICAgICAgaW1wbGljaXQgcm9sZTogaWYgbm90IGV4cGxpY2l0ZWx5IHNwZWNpZmllZCwgb3Igbm9uZSBvZiB0aGUgc3BlY2lmaWVkIHJvbGUgdmFsdWVzIGlzIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50XG4gICAgICogICAgICAgbnVsbDogaWYgbm9uZSBvZiB0aGUgc3BlY2lmaWVkIHJvbGUgdmFsdWVzIGlzIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50LCBuZWl0aGVyIGltcGxpY2l0IHJvbGUgZXhpc3RzXG4gICAgICogICAgICAgXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZXNvbHZlZFJvbGUoZWxlbTogRWxlbWVudCwgY29uc2lkZXJJbXBsaWNpdFJvbGVzOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByb2xlID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiUlBUVVRJTF9FTEVNRU5UX1JFU09MVkVEX1JPTEVcIiwgbnVsbCk7XG4gICAgICAgIGlmIChyb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMoZWxlbSk7IFxuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShlbGVtKTtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkUm9sZXMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYVJvbGVzKGVsZW0sIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgIGxldCBjb250YWluc0dlbmVyaWMgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwICYmIGFsbG93ZWRSb2xlcyAmJiBhbGxvd2VkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRSb2xlcy5pbmNsdWRlcyhcImFueVwiKSB8fCBhbGxvd2VkUm9sZXMuaW5jbHVkZXMocm9sZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFJvbGVzLmluY2x1ZGVzKFwiYW55XCIpICYmIHJvbGVzW2ldID09PSAnZ2VuZXJpYycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc0dlbmVyaWMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlID0gcm9sZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCByb2xlID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaXMgZm9jdXNhYmxlLCB0aGVuIHByZXNlbnRhdGlvbiByb2xlcyBhcmUgdG8gYmUgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzZXQgcnVsZSB0byBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNHZW5lcmljKSByb2xlID0gJ2dlbmVyaWMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gbnVsbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgcm9sZSA9IGltcGxpY2l0Um9sZSAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCA/IGltcGxpY2l0Um9sZVswXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlJQVFVUSUxfRUxFTUVOVF9SRVNPTFZFRF9ST0xFXCIsIHJvbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb2xlICE9PSB1bmRlZmluZWQgPyByb2xlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXRyaWV2aW5nIHVzZXIgZGVmaW5lZCBlbGVtZW50J3Mgcm9sZXMgZnJvbSBkb20uXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByb2xlcyAtIGxpc3Qgb2YgdXNlciBkZWZpbmVkIHJvbGVzIGluIHRoZSBlbGVtZW50IHJvbGUgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZFJvbGVzKGVsZTogRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldFJvbGVzKGVsZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgZWxlbWVudCdzIHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBmaW5kcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcm9sZXMgLSBsaXN0IG9mIGF0dHJpYnV0ZSByb2xlcyBhbmQgaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJvbGVzKGVsZTogRWxlbWVudCwgY29uc2lkZXJJbXBsaWNpdFJvbGVzOiBib29sZWFuKTogc3RyaW5nW10ge1xuICAgICAgICBsZXQgcm9sZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChlbGUgJiYgZWxlLmhhc0F0dHJpYnV0ZSAmJiBlbGUuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJSb2xlcyA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcm9sZXMucHVzaChhdHRyUm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdFJvbGUgIT09IG51bGwgJiYgaW1wbGljaXRSb2xlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvL2FkZCBpbXBsaWNpdCByb2xlcyB0byB0aGUgYXR0cmlidXRlcyByb2xlcy5cbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoaW1wbGljaXRSb2xlLCByb2xlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbWVudFxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGUgaW1wbGljaXQgcm9sZSBvciBbXSBpZiBkb2Vzbid0IGV4aXN0XG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEltcGxpY2l0Um9sZShlbGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICghZWxlIHx8IGVsZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBpbXBsaWNpdFJvbGVzOiBzdHJpbmdbXSA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkoZWxlKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmluY2x1ZGVzKFwiZ2VuZXJpY1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgJ2dlbmVyaWMnIHJvbGUgaXMgb25seSBhbGxvd2VkIGlmIGEgdmFsaWQgYXJpYSBhdHRyaWJ1dGUgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9tQXJpYUF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21BcmlhQXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbJ2dlbmVyaWMnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4ucmVxUHJvcHMgJiYgcGF0dGVybi5yZXFQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHBhdHRlcm4ucmVxUHJvcHMsIHJvbGVBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZClcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChBUklBRGVmaW5pdGlvbnMuZ2xvYmFsUHJvcGVydGllcywgcm9sZUF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcyAmJiBwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHBhdHRlcm4uZGVwcmVjYXRlZFByb3BzLCByb2xlQXR0cmlidXRlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlICdnZW5lcmljJyByb2xlIGlmIHJvbGVBdHRyaWJ1dGVzIGRvZXNuJ3QgY29udGFpbiBhbnkgb2YgZG9tQXJpYUF0dHJpYnV0ZXMgXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlQXR0cmlidXRlcy5sZW5ndGggPiAwICYmICFyb2xlQXR0cmlidXRlcy5zb21lKGF0dHIgPT4gZG9tQXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoYXR0cikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXQgPSBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoWydnZW5lcmljJ10sIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlLCBcIkFyaWFVdGlsX0ltcGxpY2l0Um9sZVwiLCBpbXBsaWNpdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1wbGljaXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZSwgXCJBcmlhVXRpbF9JbXBsaWNpdFJvbGVcIiwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZSwgXCJBcmlhVXRpbF9JbXBsaWNpdFJvbGVcIiwgW10pO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbXBsaWNpdFJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgb2YgdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlIC0gdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHByb3BlcnRpZXMgLSBsaXN0IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlLCBlbGUpIHtcbiAgICAgICAgaWYgKHJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSkge1xuICAgICAgICAgICAgbGV0IHJlcXVpcmVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yZXFQcm9wcztcbiAgICAgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2Ygc2VwYXJhdG9yXG4gICAgICAgICAgICBpZiAocm9sZS50b0xvd2VyQ2FzZSgpID09PSBcInNlcGFyYXRvclwiICYmIGVsZSAmJiBDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZSkpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiYXJpYS12YWx1ZW5vd1wiXSwgcmVxdWlyZWRBdHRyaWJ1dGVzIHx8IFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlZEF0dHJpYnV0ZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgaWYgYSBlbGVtZW50IGhhcyBnaXZlbiByb2xlLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlLlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byBmaW5kIGlmIGVsZW1lbnQgaGFzIHRoZXNlIHJvbGVzLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIHRoIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqXG4gICAgICogQ29uc2lkZXIgdG8gdXNlIGhhc1JvbGVJblNlbWFudGljcygpIGluc3RlYWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNSb2xlKGVsZSwgcm9sZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykgeyAgLy9Db25zaWRlciB0byB1c2UgaGFzUm9sZUluU2VtYW50aWNzKCkgaW5zdGVhZC5cbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vaWYgbm9uZSBvZiB0aGUgdGhlIGF0dHJpYnV0ZSByb2xlcyBtYXRjaGVkIHdpdGggZ2l2ZW4gcm9sZVxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIG1hdGNoZXMuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB3Um9sZXMgPSBbXTtcbiAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZSA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpbXBsaWNpdFJvbGUsIHdSb2xlcyk7XG4gICAgICAgICAgICAgICAgLy9pZiByb2xlIGlzIGFycmF5IGxvb3AgdGhydSBhbmQgc2VlIGlmIGFueSAgb2YgdGhlIGltcGxpY2l0IHJvbGUgcHJlc2VudCBpbiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCB3Um9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHdSb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gd1JvbGVzW2ldID09PSByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgcm9sZSwgaW5jbHVkaW5nIHRoZSBpbXBsaWVkIHJvbGUgaWYgcm9sZSBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlcGxhY2luZyB0aGUgaGFzUm9sZSBmdW5jdGlvblxuICAgICAqXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICogQHBhcm0ge2xpc3Qgb3Igc3RyaW5nfSByb2xlcyAtIExpc3Qgb3Igc2luZ2xlIHJvbGUgZm9yIHdoaWNoIHRvIGZpbmQgaWYgZWxlbWVudCBoYXMgdGhlc2Ugcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc1JvbGVJblNlbWFudGljcyhlbGUsIHJvbGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBsZXQgcm9sZVNwZWNpZmllZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gaW4gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVTcGVjaWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSA9PT0gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm9sZVNwZWNpZmllZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgaW1wbGljaXQgcm9sZXMgbWF0Y2hlcy5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICBsZXQgaW1wUm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgaWYgKGltcFJvbGVzICE9PSBudWxsICYmIGltcFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vaWYgcm9sZSBpcyBhcnJheSBsb29wIHRocnUgYW5kIHNlZSBpZiBhbnkgIG9mIHRoZSBpbXBsaWNpdCByb2xlIHByZXNlbnQgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IGltcFJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGltcFJvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgaW1wUm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gaW1wUm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBpZiBhIGVsZW1lbnQgaGFzIGdpdmVuIHJvbGUuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIHNwZWNpZmllZCByb2xlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNBbnlSb2xlKGVsZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZSAmJiBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICByZXRWYWwgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmICghcmV0VmFsICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgaW1wUm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBSb2xlcyAhPT0gbnVsbCAmJiBpbXBSb2xlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldFZhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc2VudGF0aW9uYWxFbGVtZW50KG5vZGUpIHtcbiAgICAgICAgLy8gRWxlbWVudHMgZXh0cmFjdGVkIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50I0lubGluZV90ZXh0X3NlbWFudGljcyxcbiAgICAgICAgLy8gaHR0cDovL2Rldi53My5vcmcvaHRtbDUvaHRtbC1hdXRob3IvI3RleHQtbGV2ZWwtc2VtYW50aWNzIGFuZCBodHRwczovL3dpa2kud2hhdHdnLm9yZy93aWtpL1ByZXNlbnRhdGlvbmFsX2VsZW1lbnRzX2FuZF9hdHRyaWJ1dGVzXG4gICAgICAgIGxldCBwcmVzZW50YXRpb25hbEVsZW1lbnRzID0gW1wiYWJiclwiLCBcImJcIiwgXCJiZGlcIiwgXCJiZG9cIiwgXCJiclwiLCBcImNpdGVcIiwgXCJjb2RlXCIsIFwiZGF0YVwiLCBcImRmblwiLFxuICAgICAgICAgICAgXCJlbVwiLCBcImlcIiwgXCJrYmRcIiwgXCJtYXJrXCIsIFwicVwiLCBcInJwXCIsIFwicnRcIiwgXCJydGNcIiwgXCJydWJ5XCIsIFwic1wiLFxuICAgICAgICAgICAgXCJzYW1wXCIsIFwic21hbGxcIiwgXCJzcGFuXCIsIFwic3Ryb25nXCIsIFwic3ViXCIsIFwic3VwXCIsIFwidGltZVwiLCBcInVcIixcbiAgICAgICAgICAgIFwidmFyXCIsIFwid2JyXCIsIFwiYVwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJiYXNlZm9udFwiLCBcImJpZ1wiLCBcImNlbnRlclwiLFxuICAgICAgICAgICAgXCJzdHJpa2VcIiwgXCJ0dFwiLCBcImZvbnRcIiwgXCJibGlua1wiLCBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIiwgXCJoNlwiLFxuICAgICAgICAgICAgXCJoclwiLCBcImJsb2NrcXVvdGVcIiwgXCJwXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHByZXNlbnRhdGlvbmFsRWxlbWVudHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGVsZW1lbnQgYW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSBUaGUgcm9sZSB0byBzZWFyY2ggZm9yIG9uIGFuIGVsZW1lbnQgdW5kZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGUoZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlTmFtZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50IGFuZCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge2FycmF5fSByb2xlcyAtIHRoZSByb2xlIG5hbWVzIHRvIHNlYXJjaCBmb3JcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGVzKGVsZW1lbnQsIHJvbGVOYW1lcykge1xuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgIXJvbGVOYW1lcyB8fCAhcm9sZU5hbWVzLmxlbmd0aCB8fCByb2xlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZSh3YWxrTm9kZSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcm9sZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVzLmluY2x1ZGVzKHJvbGUpIHx8XG4gICAgICAgICAgICAgICAgICAgIChyb2xlTmFtZXMuaW5jbHVkZXMoXCIqXCIpICYmICFbXCJwcmVzZW50YXRpb25cIiwgXCJub25lXCJdLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcm9sZXMgd2l0aCBnaXZlbiByb2xlIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHthcnJheX0gcm9sZVR5cGxlcyAtIHJvbGUgdHlwZXMsIHN1Y2ggYXMgJ3dpZGdldCcsICdzdHJ1Y3R1cmUnIGV0Yy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2FycmF5fSByb2xlcyAtIEEgcGFyZW50IG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXNXaXRoVHlwZXMoZWxlbWVudCwgdHlwZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhdHlwZXMgfHwgIXR5cGVzLmxlbmd0aCB8fCB0eXBlcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByb2xlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwicm9sZXNfd2l0aF9naXZlbl90eXBlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlcy5pbmNsdWRlcyh2YWx1ZS5yb2xlVHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIHJvbGVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJyb2xlc193aXRoX2dpdmVuX3R5cGVzXCIsIHJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSByb2xlcyB3aXRoIGdpdmVuIHJvbGUgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge2FycmF5fSByb2xlVHlwbGVzIC0gcm9sZSB0eXBlcywgc3VjaCBhcyAnd2lkZ2V0JywgJ3N0cnVjdHVyZScgZXRjLlxuICAgICAqXG4gICAgICogQHJldHVybiB7YXJyYXl9IHJvbGVzIC0gQSBwYXJlbnQgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1dpZGdldChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHdpZGdldCA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiaXNfZWxlbWVudF93aWRnZXRcIiwgbnVsbCk7XG4gICAgICAgIGlmICh3aWRnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7IFxuICAgICAgICAgICAgaWYgKHJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yb2xlVHlwZSA9PT0gJ3dpZGdldCcpXG4gICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJpc19lbGVtZW50X3dpZGdldFwiLCByZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2lkZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBpZiB0aGUgZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudC4gXG4gICAgICogSWYgYW4gYW5jZXN0b3Igb2YgYW4gZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgdGhlbiB0aGUgZWxlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYXMgb3duZWQgb3IgY29udHJvbGxlZC5cbiAgICAgKiBhbiBlbGVtZW50IGNhbiBiZSBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCB0aHJvdWdoIGFyaWEtb3ducyBvciBhcmlhLWNvbnRyb2xzXG4gICAgICogICB3aGVuIHRoZSBET00gaGllcmFyY2h5IGNhbm5vdCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcmVsYXRpb25zaGlwLlxuICAgICAqIGFyaWEtb3ducyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgY29udGV4dHVhbCByZWxhdGlvbnNoaXAgd2l0aCBhIG93bmluZyBwYXJlbnQgXG4gICAgICogYXJpYS1jb250cm9scyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYW4gZWxlbWVudCB3aXRoIHRoZSBjb250cm9sbGluZyBlbGVtZW50LlxuICAgICAqICBleGFtcGxlIGVsZW1lbnRzIHdpdGggcm9sZXM6IGNvbWJvYm94LCBzY3JvbGxiYXIsIHRhYiwgYnV0dG9uLCBsaXN0Ym94LCBtZW51LCBtZW51YmFyLCByYWRpb2dyb3VwLCB0cmVlLCB0cmVlZ3JpZFxuICAgICAqIFxuICAgICAqIHdoZW4gYW4gZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgaXRzIG5hdmlnYXRpb24gbWF5IGJlIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmVudCBcbiAgICAgKiAgdGhyb3VnaCBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRzIGF0dHJpYnV0ZSBvciByb3ZpbmcgdGFiaW5kZXhcbiAgICAgKiBcbiAgICAgKiBOb3RlIG5hdmlnYXRpb24gd2l0aCBuYXRpdmUgY29tYm9ib3ggKGlucHV0IHdpdGggYSBkYXRhbGlzdCkgaXMgaW4gbmF0aXZlIGZvY3VzIG5hdmlnYXRpb24sIG5vdCBjb25zaWRlcmVkIGhlcmUgICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGluc3BlY3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQoZWxlbWVudCA6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBsZXQgb3duZXJFbGVtczogRWxlbWVudFtdID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJBcmlhVXRpbF9OYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWRcIiwgbnVsbCk7XG4gICAgICAgIGlmIChvd25lckVsZW1zICE9PSBudWxsICYmIG93bmVyRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgb3duZXJFbGVtcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7XG4gICAgICAgIGlmICghcm9sZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKCFpZCB8fCBpZC50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHN+PScke2lkfSddLCAqW2FyaWEtb3duc349JyR7aWR9J11gKTtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY29udGFpbmVycyA9IFsnY29tYm9ib3gnLCAnc2Nyb2xsYmFyJywgJ2J1dHRvbicsICd0YWInLCAnbGlzdGJveCcsICdtZW51JywgJ21lbnViYXInLCAncmFkaW9ncm91cCcsICd0cmVlJywgJ3RyZWVncmlkJ107XG4gICAgICAgIGlmIChjb250YWluZXJzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICBpZiAob3duZXJFbGVtcyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBvd25lckVsZW1zID0gW107XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIG93bmVyRWxlbXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiQXJpYVV0aWxfTmF2aWdhdGlvbk93bmVkT3JDb250cm9sbGVkXCIsIG93bmVyRWxlbXMpOyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gICAgXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIG5vZGUgd2hpY2ggbWF0Y2hlcyB0aGUgcm9sZSBhbmQgaXMgYSBzaWJsaW5nIG9mIHRoZVxuICAgICAqIHByb3ZpZGVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGJ5IGRlZmF1bHQgd2lsbCBub3QgY29uc2lkZXIgQ2hlY2sgSGlkZGVuIFNldHRpbmcgYXQgYWxsLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldFNpYmxpbmdXaXRoUm9sZUhpZGRlblxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgc2libGluZyBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHNpYmxpbmcgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaWJsaW5nV2l0aFJvbGUoZWxlbWVudCwgcm9sZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbm9kZSB3aGljaCBtYXRjaGVzIHRoZSByb2xlIGFuZCBpcyBhIHNpYmxpbmcgb2YgdGhlXG4gICAgICogcHJvdmlkZWQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMgaW1wbGljaXQgcm9sZXMgZm9yIHRoZSBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgc2libGluZyBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0IC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBJbXBsaWNpdCByb2xlcyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IHdhbGtOb2RlIC0gQSBzaWJsaW5nIG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGU/KSB7XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGFyYXRpb25cbiAgICAgICAgbGV0IHdhbGtOb2RlID0gbnVsbDtcbiAgICAgICAgbGV0IGhhc1JvbGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGlmIGVsZW1lbnQgYW5kIHJvbGUgYXJlIGJvdGggcHJvdmlkZWRcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgcm9sZSkge1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIG5leHQgc2libGluZyBlbGVtZW50XG4gICAgICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyBvdmVyIHRoZSBuZXh0IHNpYmxpbmdzIHRvIGZpbmQgZWxlbWVudCB3aGljaCBtYXRjaGVzXG4gICAgICAgICAgICAvLyB0aGUgcHJvdmlkZWQgcm9sZS5cbiAgICAgICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCAmJiAhaGFzUm9sZSkge1xuXG4gICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIGhhcyB0aGUgcm9sZSB0aGF0IHdlIG5lZWQgdG8gY2hlY2sgZXhpc3RzXG4gICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBub3QgZm91bmQgYSBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgcm9sZSwgc3RhcnQgYSByZXZlcnNlIGxvb2sgdXBcbiAgICAgICAgICAgIGlmICghd2Fsa05vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBGZXRjaCB0aGUgcHJldmlvdXMgU2libGluZyBvZiB0aGlzIGVsZW1lbnRcbiAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgLy8gS2VlcCBsb29waW5nIG92ZXIgYWxsIHRoZSBwcmV2aW91cyBzaWJsaW5ncyB0byBzZWFyY2ggZm9yIGFuIGVsZW1lbnQgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyBtYXRjaGVzIHRoZSBwcm92aWRlZCByb2xlLlxuICAgICAgICAgICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCAmJiAhaGFzUm9sZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLnByZXZpb3VzU2libGluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSByb2xlIHRoYXQgd2UgbmVlZCB0byBjaGVjayBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaGFzUm9sZSA9IEFyaWFVdGlsLmhhc1JvbGUod2Fsa05vZGUsIHJvbGUsIGNvbnNpZGVySW1wbGljaXRSb2xlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYSBkZXNjZW5kYW50IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXREZXNjZW5kYW50V2l0aFJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gcGFyZW50IGVsZW1lbnQgZm9yIHdoaWNoIHdlIHdpbGwgYmUgY2hlY2tpbmcgZGVzY2VuZGFudHMgZm9yXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgZGVzY2VuZGFudCdzIGVsZW1lbnRzXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSByb2xlIHNwZWNpZmllZCAob25seSBvbmUpXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0RGVzY2VuZGFudFdpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGVOYW1lLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhIGRlc2NlbmRhbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9sZSwgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGRlc2NlbmRhbnQncyBlbGVtZW50c1xuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSByb2xlIHNwZWNpZmllZCAob25seSBvbmUpXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50ID0gbnVsbDtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHByb3ZpZGVkIGFuZCBjaGVjayBpZiB0aGUgcm9sZW5hbWUgcHJvdmlkZWQgZXhpc3RzXG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCAmJiBudy5ub2RlICE9IGVsZW1lbnQubmV4dFNpYmxpbmcpIHtcblxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMgPyBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mobncubm9kZSwgcm9sZU5hbWUpIDogQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCByb2xlTmFtZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudCA9IG53Lm5vZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzY2VuZGFudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCByb2xlcywgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmdbXX0gcm9sZU5hbWVzIC0gVGhlIHJvbGVzIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50J3MgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZVtdfSAtIGFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHJvbGVzIHNwZWNpZmllZFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxEZXNjZW5kYW50c1dpdGhSb2xlcyhlbGVtZW50LCByb2xlTmFtZXM6IHN0cmluZ1tdLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICBpZiAoIXJvbGVOYW1lcyB8fCByb2xlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IFtdO1xuXG4gICAgICAgIHJvbGVOYW1lcy5mb3JFYWNoKHJvbGVOYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBraWRzID0gQXJpYVV0aWwuZ2V0QWxsRGVzY2VuZGFudHNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpO1xuICAgICAgICAgICAgaWYgKGtpZHMgJiYga2lkcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzID0gZGVzY2VuZGFudHMuY29uY2F0KGtpZHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgQWxsIGRlc2NlbmRhbnQgZWxlbWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBkZXNjZW5kYW50cyBmb3JcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlTmFtZSAtIFRoZSByb2xlIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50J3MgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZVtdfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHJvbGUgc3BlY2lmaWVkXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbERlc2NlbmRhbnRzV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWU6IHN0cmluZywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IGRlc2NlbmRhbnRzID0gW107XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgZWxlbWVudCBwcm92aWRlZCBhbmQgY2hlY2sgaWYgdGhlIHJvbGVuYW1lIHByb3ZpZGVkIGV4aXN0c1xuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKG53Lm5vZGUsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChudy5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkaXJlY3QgY2hpbGRyZW4gaW4gQVQgdHJlZSB3aXRoIGEgcm9sZSAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlIHRoYXQgaGFzIGEgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREaXJlY3RBVENoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlcyA9IEFyaWFVdGlsLmdldFJlcXVpcmVkQ2hpbGRSb2xlcyhlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgbGV0IGRpcmVjdDogQXJyYXk8SFRNTEVsZW1lbnQ+ID0gW107XG4gICAgICAgIEFyaWFVdGlsLnJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdCk7XG4gICAgICAgIHJldHVybiBkaXJlY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVjdXJzaXZlbHkgYW55IGNoaWxkIHBhdGggdGlsbCBlaXRoZXIgbm8gY2hpbGQgb3IgYSBjaGlsZCB3aXRoIGEgcm9sZSBpcyBmb3VuZCAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdDogQXJyYXk8SFRNTEVsZW1lbnQ+KSB7XG4gICAgICAgIGxldCBjaGlsZHJlbjogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbiAhPT0gbnVsbCAmJiBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goZWxlbWVudC5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgXCJhcmlhLW93blwiIGF0dHJpYnV0ZSwgdGhlbiB0aGUgYXJpYS1vd25lZCBjaGlsZHJlbiBuZWVkIHRvIGJlIGluY2x1ZGVkIHRvb1xuICAgICAgICBsZXQgb3duZWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcbiAgICAgICAgaWYgKG93bmVkKSB7XG4gICAgICAgICAgICBsZXQgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgIGxldCBvd25lZElkcyA9IG93bmVkLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bmVkSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lZEVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQob3duZWRJZHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3duZWRFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG93bmVkRWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvL2lnbm9yZSBoaWRkZW4gYW5kIGludmlzaWJsZSBjaGlsZFxuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjaGlsZHJlbltpXSkgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGNoaWxkcmVuW2ldLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzID09PSBudWxsIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy9yZW1vdmUgJ25vbmUnIGFuZCAncHJlc2VudGF0aW9uJ1xuICAgICAgICAgICAgICAgICAgICByb2xlcyA9IHJvbGVzLmZpbHRlcihmdW5jdGlvbiAocm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGUgIT09IFwibm9uZVwiICYmIHJvbGUgIT09IFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSAnZ3JvdXAnIHJvbGUgaXMgYWxsb3dlZCBidXQgbm90IHJlcXVpcmVkIGZvciBzb21lIGVsZW1lbnRzIHNvIHJlbW92ZSBpdCBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVzLmluY2x1ZGVzKFwiZ3JvdXBcIikgJiYgcmVxdWlyZWRDaGlsZFJvbGVzICYmIHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmNsdWRlcygnZ3JvdXAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSByb2xlcy5maWx0ZXIoZnVuY3Rpb24gKHJvbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9sZSAhPT0gJ2dyb3VwJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0LnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZSB1bnRpbCBnZXQgYSByZXR1cm4gdmFsdWUsIFxuICAgICAgICAgICAgICAgICAgICBBcmlhVXRpbC5yZXRyaWV2ZURpcmVjdEFUQ2hpbGRyZW4oY2hpbGRyZW5baV0sIHJlcXVpcmVkQ2hpbGRSb2xlcywgZGlyZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBvciByZXF1aXJlZCBjaGlsZCByb2xlcyBmb3IgYSBnaXZlbiBlbGVtZW50IHdpdGggb25lIG1vcmUgcm9sZXMsXG4gICAgICogcmV0dXJuIG51bGwgaWYgdGhlIHJvbGUgaXMgJ25vbmUnIG9yICdwcmVzZW50YXRpb24nXG4gICAgICogQHBhcmFtIGVsZW1lbnQgXG4gICAgICogQHBhcmFtIGluY2x1ZGVJbXBsaWNpdCBpbmNsdWRlIGltcGxpY2l0IHJvbGVzIGlmIG5vIHJvbGUgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKGVsZW1lbnQsIGluY2x1ZGVJbXBsaWNpdDogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICgoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgJiYgaW5jbHVkZUltcGxpY2l0KSB7XG4gICAgICAgICAgICByb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGV4cGxpY2l0IG9yIGltcGxpY2l0IHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqICBcbiAgICAgICAgICogaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHIgPT4gcHJlc2VudGF0aW9uUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlczogc3RyaW5nW10gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0ucmVxQ2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZENoaWxkUm9sZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuLCByZXF1aXJlZENoaWxkUm9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1aXJlZENoaWxkUm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhbiBlbGVtZW50IHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgdGhlXG4gICAgICogcm9sZSB0aGF0IHdhcyBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXRBcmlhT3duc1dpdGhSb2xlSGlkZGVuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2sgZm9yIGFyaWEtb3duc1xuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGFyaWEtb3ducyBlbGVtZW50XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSBhcmlhLW93bnMgYW5kIGhhcyByb2xlIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXJpYU93bnNXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0QXJpYU93bnNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYW4gZWxlbWVudCByZWZlcmVuY2VkIGJ5IGFyaWEtb3ducyBhbmQgaGFzIHRoZVxuICAgICAqIHJvbGUgdGhhdCB3YXMgc3BlY2lmaWVkLiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgZWxlbWVudHMgd2l0aCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVjayBmb3IgYXJpYS1vd25zXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgYXJpYS1vd25zIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgcm9sZSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFyaWFPd25zV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykge1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgcmVmZXJlbmNlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgICBsZXQgcmVmZXJlbmNlZEVsZW1IYXNSb2xlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYXJpYS1vd25zIGlzIG5vdCBvbiB0aGUgZWxlbWVudCBqdXN0IGJyZWFrIG91dCBvZiB0aGlzIGZ1bmN0aW9uIHdpdGggbnVsbFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtb3duc1wiKSkge1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHJlZmVyZW5jZSBJRFxuICAgICAgICAgICAgbGV0IHJlZmVyZW5jZUlEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIik7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgZWxlbWVudCBmb3IgdGhlIHJlZmVyZW5jZSBJRFxuICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtZW50LCByZWZlcmVuY2VJRCk7XG4gICAgICAgICAgICAvL2lnbm9yZSBpZiB0aGUgYXJpYS1vd25zIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICAgICAgaWYgKERPTVV0aWwuc2FtZU5vZGUoZWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIHJlZmVyZW5jZWRFbGVtZW50ICE9IG51bGwgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHJlZmVyZW5jZWRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IEFyaWFVdGlsLmhhc1JvbGUocmVmZXJlbmNlZEVsZW1lbnQsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZlcmVuY2VkRWxlbUhhc1JvbGUgPyByZWZlcmVuY2VkRWxlbWVudCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIEFSSUEgbGFiZWxcbiAgICBwdWJsaWMgc3RhdGljIGhhc0FyaWFMYWJlbChlbGVtZW50KSB7XG5cbiAgICAgICAgLy8gUnB0X0FyaWFfVmFsaWRJZFJlZiBkZXRlcm1pbmVzIGlmIHRoZSBhcmlhLWxhYmVsbGVkYnkgaWQgcG9pbnRzIHRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhbiBhcnJheSBvZiBlbGVtZW50cywgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdW5pcXVlIEFSSUEgbGFiZWxzXG4gICAgcHVibGljIHN0YXRpYyBoYXNVbmlxdWVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgaXNHbG9iYWwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZG9jID0gZWxlbWVudHNbMF0ub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgdW5pcXVlQXJpYUxhYmVscyA9IG51bGw7XG5cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9IQVNfVU5JUVVFX0FSSUFfTEFCRUxTXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlxdWVBcmlhTGFiZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgIWhhc0R1cGxpY2F0ZUxhYmVscyAmJiBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXJpYUxhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGFyaWFMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW2FyaWFMYWJlbF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbE5vZGUsIGVsZW1lbnRzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSBub3JtYWxpemVkTGFiZWwgaW4gdW5pcXVlQXJpYUxhYmVscztcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVsc1tub3JtYWxpemVkTGFiZWxdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhcyBubyBsYWJlbCBhdCBhbGxcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0hBU19VTklRVUVfQVJJQV9MQUJFTFNcIiwgdW5pcXVlQXJpYUxhYmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFoYXNEdXBsaWNhdGVMYWJlbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRleHQgY29udGVudCBmcm9tIGFuIGVsZW1lbnQsIGV4Y2x1ZGluZyBzY3JpcHQgYW5kIHN0eWxlIGVsZW1lbnRzXG4gICAgICogVGhpcyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiB0aGF0IGRvZXNuJ3QgZ28gdGhyb3VnaCBmdWxsIGFjY2Vzc2libGUgbmFtZSBjb21wdXRhdGlvblxuICAgICAqIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB3aGVuIGNhbGxlZCBmcm9tIGdldEFyaWFMYWJlbFxuICAgICAqXG4gICAgICogTm90ZTogV2hlbiBhbiBlbGVtZW50IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1sYWJlbGxlZGJ5LCBpdHMgY29udGVudCBpcyBpbmNsdWRlZFxuICAgICAqIGV2ZW4gaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIChwZXIgQVJJQSBzcGVjKVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldFRleHRDb250ZW50RXhjbHVkaW5nU2NyaXB0cyhlbGVtOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gXCJcIjtcbiAgICAgICAgXG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGVsZW0gJiYgbncubm9kZSAhPT0gZWxlbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBudy5ub2RlO1xuICAgICAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogXCJcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2tpcCBzY3JpcHQgYW5kIHN0eWxlIGVsZW1lbnRzXG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdzY3JpcHQnIHx8IG5vZGVOYW1lID09PSAnc3R5bGUnKSB7XG4gICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7IC8vIFNraXAgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICAgICAgLy8gSW5jbHVkZSB0ZXh0IGV2ZW4gZnJvbSBoaWRkZW4gZWxlbWVudHMgd2hlbiByZWZlcmVuY2VkIGJ5IGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVWYWx1ZSAmJiBub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgbm9kZS5ub2RlVmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkgeyAvLyBFbGVtZW50IG5vZGVcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgaW1hZ2VzIC0gZ2V0IGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnaW1nJyAmJiAobm9kZSBhcyBFbGVtZW50KS5oYXNBdHRyaWJ1dGUoJ2FsdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyAobm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoJ2FsdCcpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7IC8vIFNraXAgY2hpbGRyZW4gb2YgaW1nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBpbnB1dCB3aXRoIHR5cGU9XCJpbWFnZVwiIC0gZ2V0IGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdpbWFnZScgJiYgKG5vZGUgYXMgRWxlbWVudCkuaGFzQXR0cmlidXRlKCdhbHQnKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdhbHQnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlOyAvLyBTa2lwIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdGV4dC50cmltKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhTGFiZWwoZWxlKSB7XG4gICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gbGFiZWxJRHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZSwgbGFiZWxJRCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbE5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxOb2RlLCBlbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugb3VyIGhlbHBlciB0byBnZXQgdGV4dCBjb250ZW50IHdpdGhvdXQgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gQXJpYVV0aWwuZ2V0VGV4dENvbnRlbnRFeGNsdWRpbmdTY3JpcHRzKGxhYmVsTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZExhYmVsLnRyaW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhRGVzY3JpcHRpb24oZWxlKSB7XG4gICAgICAgIGlmICghZWxlKSByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IG5vcm1hbGl6ZWRMYWJlbCA9IFwiXCI7XG4gICAgICAgIGxldCBkZXNjID0gZWxlLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGxhYmVsSURzID0gZGVzYy50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGxhYmVsSURzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZExhYmVsICs9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhsYWJlbCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZExhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVkTGFiZWwudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzYyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaXB0aW9uXCIpO1xuICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIGRlc2MudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbmRBcmlhTGFiZWxEdXBlcyhlbGVtZW50cykge1xuICAgICAgICBsZXQgZHVwZU1hcCA9IHt9XG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgZHVwZU1hcFtBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlKV0gPSAoZHVwZU1hcFtBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlKV0gfHwgMCkgKyAxO1xuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZHVwZU1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gYWNjZXNzaWJsZSBuYW1lcyBmb3IgYWxsIEFUIHZpc2libGUgbGFuZG1hcmsgZWxlbWVudHMgXG4gICAgICogQHBhcmFtIGRvYyBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhbmRtYXJrQWNjTmFtZXMoZG9jKSB7XG4gICAgICAgIGxldCBuYW1lTWFwID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9MYW5kbWFya19BY2NOYW1lc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKG5hbWVNYXAgJiYgbmFtZU1hcC5sZW5ndGggIT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIG5hbWVNYXA7XG5cbiAgICAgICAgbmFtZU1hcCA9IFtdO1xuICAgICAgICBsZXQgbGFuZG1hcmtFbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgJ2FzaWRlLFtyb2xlPVwiY29tcGxlbWVudGFyeVwiXSwgZm9vdGVyLFtyb2xlPVwiY29udGVudGluZm9cIl0sIGhlYWRlcixbcm9sZT1cImJhbm5lclwiXSwgbWFpbixbcm9sZT1cIm1haW5cIl0sIG5hdixbcm9sZT1cIm5hdmlnYXRpb25cIl0sIGZvcm0sW3JvbGU9XCJmb3JtXCJdLCBzZWN0aW9uLFtyb2xlPVwicmVnaW9uXCJdLCBhcnRpY2xlLFtyb2xlPVwiYXJ0aWNsZVwiXSwgW3JvbGU9XCJzZWFyY2hcIl0sW3JvbGU9XCJhcHBsaWNhdGlvblwiXSxbcm9sZT1cImRvY3VtZW50XCJdJ1xuICAgICAgICApO1xuXG4gICAgICAgIGlmIChsYW5kbWFya0VsZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJBcmlhVXRpbF9MYW5kbWFya19BY2NOYW1lc1wiLCBuYW1lTWFwKTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lTWFwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFuZG1hcmtFbGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtOiBFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgbm9kZSB0aGF0IGlzIEFUIGhpZGRlbiBvciBpbiBhIGRpYWxvZyB0aGF0IGlzIGNvbnNpZGVyZWQgYXMgYSBzZXBhcmF0ZSBsb2NhdGlvbiBmcm9tIHRoZSByZXN0IG9mIHRoZSBtYWluIHBhZ2VcbiAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkgJiYgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJESUFMT0dcIl0pID09PSBudWxsICYmIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZWxlbSwgXCJkaWFsb2dcIiwgdHJ1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhaXIubmFtZS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBuZWVzdGVkIGxhbmRtYXJrIHRvIGNhbGN1bGF0ZSB0aGUgYWNjZXNzaWJsZSBuYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JzID0gWy4uLmxhbmRtYXJrRWxlbXNdLmZpbHRlcigoZSkgPT4gZS5jb250YWlucyhlbGVtKSAmJiBlICE9PSBlbGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JzLmZvckVhY2goKGFuY2VzdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3Rvcl9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvcl9wYWlyICYmIGFuY2VzdG9yX3BhaXIubmFtZSAmJiBhbmNlc3Rvcl9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGFuY2VzdG9yX3BhaXIubmFtZS50cmltKCkgKyBcIiBcIiArIG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgIG5hbWVNYXAucHVzaCh7XCJlbGVtXCIgOiBlbGVtLCBcInJvbGVcIiA6IHJvbGUsIFwibmFtZVwiOiBuYW1lfSk7ICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0xhbmRtYXJrX0FjY05hbWVzXCIsIG5hbWVNYXApO1xuICAgICAgICByZXR1cm4gbmFtZU1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjaGVjayBpZiB0aGUgZ2l2ZW4gZWxlbWVudCB3aXRoIHRoZSBsYW5kbWFyayByb2x3IGlzIHVuaXF1ZVxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqIEBwYXJhbSByb2xlOiBhIHNwZWNpZmljIGxhbmRtYXJrIHJvbGUsIG9yIFwiYW55XCIgZm9yIGFsbCBsYW5kbWFyayByb2xlICBcbiAgICAgKiBAcGFyYW0gY29uc2lkZXJOb25lTGFiZWw6IGlmIGNvbnNpZGVyIHRoZSBsYW5kbWFya3Mgd2l0aG91dCBhIGxhYmVsXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0xhbmRtYXJrTmFtZVVuaXF1ZShlbGVtZW50LCByb2xlLCBjb25zaWRlck5vbmVMYWJlbDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IG5hbWVNYXAgPSBBcmlhVXRpbC5nZXRMYW5kbWFya0FjY05hbWVzKGVsZW1lbnQub3duZXJEb2N1bWVudCk7XG4gICAgICAgIGxldCBleGlzdCA9IG51bGw7XG4gICAgICAgIGlmIChyb2xlID09PSAnYW55JylcbiAgICAgICAgICAgIGV4aXN0ID0gbmFtZU1hcC5maW5kKGVudHJ5ID0+IGVudHJ5LmVsZW0gPT09IGVsZW1lbnQpOyAgICAgIFxuICAgICAgICBlbHNlICAgIFxuICAgICAgICAgICAgZXhpc3QgPSBuYW1lTWFwLmZpbmQoZW50cnkgPT4gZW50cnkuZWxlbSA9PT0gZWxlbWVudCAmJiBlbnRyeS5yb2xlID09PSByb2xlKTtcblxuICAgICAgICBpZiAoIWV4aXN0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBuYW1lID0gZXhpc3QubmFtZTtcbiAgICAgICAgaWYgKCFjb25zaWRlck5vbmVMYWJlbCAmJiBuYW1lID09PSAnJykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbmFtZU1hcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5hbWVNYXBbaV0uZWxlbSA9PT0gZWxlbWVudCkgY29udGludWU7ICAgICBcbiAgICAgICAgICAgIGlmIChuYW1lID09PSBuYW1lTWFwW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gJ2FueScpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVNYXBbaV0ucm9sZSA9PT0gcm9sZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IFxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgQVJJQSBsYWJlbHMgZ2xvYmFsbHlcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbHMoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmhhc1VuaXF1ZUFyaWFMYWJlbHNMb2NhbGx5KGVsZW1lbnRzLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhbiBhcnJheSBvZiBlbGVtZW50cywgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdW5pcXVlIEFSSUEgbGFiZWxzXG4gICAgcHVibGljIHN0YXRpYyBoYXNEdXBsaWNhdGVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgaXNHbG9iYWwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZG9jID0gZWxlbWVudHNbMF0ub3duZXJEb2N1bWVudDtcblxuICAgICAgICBsZXQgaGFzRHVwbGljYXRlTGFiZWxzID0gZmFsc2U7XG4gICAgICAgIGxldCB1bmlxdWVBcmlhTGFiZWxzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IG51bGw7XG4gICAgICAgIGxldCBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheSA9IG5ldyBBcnJheSgpO1xuXG4gICAgICAgIGlmIChpc0dsb2JhbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pcXVlQXJpYUxhYmVscyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhTGFiZWwgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gYXJpYUxhYmVsIGluIHVuaXF1ZUFyaWFMYWJlbHM7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHNbYXJpYUxhYmVsXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGFyaWFMYWJlbCBpbiBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5W2FyaWFMYWJlbF0gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVthcmlhTGFiZWxdLnB1c2goZWxlbWVudHNbaV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGxhYmVsSURzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGxhYmVsSURzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbE5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxOb2RlLCBlbGVtZW50c1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IG5vcm1hbGl6ZWRMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW25vcm1hbGl6ZWRMYWJlbF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShub3JtYWxpemVkTGFiZWwgaW4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVtub3JtYWxpemVkTGFiZWxdID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbbm9ybWFsaXplZExhYmVsXS5wdXNoKGVsZW1lbnRzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCB1bmlxdWVBcmlhTGFiZWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXk7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVscyBnbG9iYWxseVxuICAgIHB1YmxpYyBzdGF0aWMgaGFzRHVwbGljYXRlQXJpYUxhYmVscyhlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuaGFzRHVwbGljYXRlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZXNcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGVsZW1lbnRzKSB7XG5cbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgbGFiZWxSZWZzID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFoYXNEdXBsaWNhdGVMYWJlbHMgJiYgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihlbGVtZW50c1tpXSwgZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbFJlZiA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpO1xuICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGxhYmVsUmVmIGluIGxhYmVsUmVmcztcbiAgICAgICAgICAgICAgICBsYWJlbFJlZnNbbGFiZWxSZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWhhc0R1cGxpY2F0ZUxhYmVscztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXNvbHZpbmcgQVJJQSByZXF1aXJlbWVudHMgZm9yIGFuIEhUTUwgZWxlbWVudCBwZXIgQVJJQSBpbiBIVE1MXG4gICAgICogQHBhcmFtIHJ1bGVDb250ZXh0IHRoZSBIVE1MIGVsZW1lbnQgdG8gYmUgZXhhbWluZWRcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRhZ1Byb3BlcnR5OiBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50ID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0VsZW1lbnRBcmlhUHJvcGVydHlcIiwgbnVsbCk7XG4gICAgICAgIGlmICghdGFnUHJvcGVydHkpIHtcbiAgICAgICAgICAgIGxldCB0YWdOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBuYW1lID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdGFnUHJvcGVydHkgZXhpc3RzIGluIHRoZSBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgaGFzaC5cbiAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFt0YWdOYW1lXTtcblxuICAgICAgICAgICAgLy8gVGhlIHRhZyBuZWVkcyB0byBjaGVjayBzb21lIHNwZWNpYWwgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ID09PSBudWxsIHx8IHRhZ1Byb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbdGFnTmFtZV07XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7IC8vIHNwZWNpYWwgY2FzZXNcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1ocmVmXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIndpdGhvdXQtaHJlZlwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJlYVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ3aXRoLWhyZWZcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1ocmVmXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZjcyA9IENvbW1vblV0aWwuZ2V0Q2hpbGRCeVRhZyhydWxlQ29udGV4dCwgXCJmaWdjYXB0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmNzICE9PSBudWxsICYmIGZjcy5sZW5ndGggPiAwID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImNoaWxkLWZpZ2NhcHRpb25cIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tY2hpbGQtZmlnY2FwdGlvblwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmb290ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImhlYWRlclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiYXJ0aWNsZVwiLCB0cnVlKSAhPT0gbnVsbCB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcIm5hdmlnYXRpb25cIiwgdHJ1ZSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJyZWdpb25cIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJhcnRpY2xlXCIsIFwiYXNpZGVcIiwgXCJtYWluXCIsIFwibmF2XCIsIFwic2VjdGlvblwiXSkgIT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1zZWN0aW9uLWFydGljbGUtYXNpZGUtbWFpbi1uYXZcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoICE9PSAwIHx8IChhbHQgIT09IG51bGwgJiYgYWx0Lmxlbmd0aCA+IDApIHx8ICh0aXRsZSAhPT0gbnVsbCAmJiB0aXRsZS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWcgaGFzIG5vbi1lbXB0eSBhbHQgKGFsdD1cInNvbWUgdGV4dFwiIG9yIGFsdD1cIiAgXCIpIG9yIGFuIGFjY2Vzc2libGUgbmFtZSBpcyBwcm92aWRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aC1hY2NuYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWcgaGFzIGFuIGVtcHR5IGFsdCAoYWx0PVwiXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGhvdXQtYWNjbmFtZS1lbXB0eS1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGltZyBsYWNrcyBhbiBhbHQgYXR0cmlidXRlIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGhvdXQtYWNjbmFtZS1uby1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidHlwZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW3R5cGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSA9PT0gbnVsbCB8fCB0YWdQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLXByZXNzZWRcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hlY2tib3gtd2l0aC1hcmlhLXByZXNzZWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hlY2tib3gtd2l0aG91dC1hcmlhLXByZXNzZWRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZW1haWwtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImVtYWlsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VhcmNoXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInNlYXJjaC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wic2VhcmNoLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGVsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRlbC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGVsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInVybC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widXJsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVmYXVsdC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVmYXVsdC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHR5cGUgaXMgdGhlIHNhbWUgYXMgdHlwZT10ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxUYWdQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wibGlcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCwgXCJsaXN0XCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGlsZC1vZi1saXN0LXJvbGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLW9mLWxpc3Qtcm9sZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VjdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uYW1lID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGFiZWwgJiYgbGFiZWwudHJpbSgpLmxlbmd0aCA+IDApIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxUYWdQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wic2VsZWN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm11bHRpcGxlXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJzaXplXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNpemVcIikgPiAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJtdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJuby1tdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzdW1tYXJ5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVGFnUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcInN1bW1hcnlcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkZXRhaWxzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIERPTVV0aWwuc2FtZU5vZGUoWy4uLnJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtID0+IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKVswXSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJmaXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRib2R5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidHJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIsIHRydWUpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy10YWJsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJncmlkXCIsIHRydWUpIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLWdyaWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBDb21tb25VdGlsLmdldFNjb3BlRm9yVGgocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidGFibGVcIiwgdHJ1ZSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUgPT09ICdjb2x1bW4nKSB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLXRhYmxlLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtdGFibGUtcm93LXNjb3BlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImdyaWRcIiwgdHJ1ZSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJ0cmVlZ3JpZFwiLCB0cnVlKSAhPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlID09PSAnY29sdW1uJykgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRpdlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBydCA9IHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcnQgIT09IG51bGwgJiYgcHJ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkbCcgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hpbGQtZGxcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tY2hpbGQtZGxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wiZGVmYXVsdFwiXSBhcyBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50O1xuICAgICAgICAgICAgICAgIH0gLy9zd2l0Y2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiQXJpYVV0aWxfRWxlbWVudEFyaWFQcm9wZXJ0eVwiLCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgIHJldHVybiB0YWdQcm9wZXJ0eSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFSb2xlcyhydWxlQ29udGV4dCwgcHJvcGVydGllczogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCkge1xuICAgICAgICBsZXQgYWxsb3dlZFJvbGVzOiBzdHJpbmdbXSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJBcmlhVXRpbF9BbGxvd2VkQXJpYVJvbGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWFsbG93ZWRSb2xlcykge1xuICAgICAgICAgICAgYWxsb3dlZFJvbGVzID0gW107XG4gICAgICAgICAgICBsZXQgdGFnUHJvcGVydHk6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBwcm9wZXJ0aWVzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSwgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlcyAmJiBpbXBsaWNpdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0FsbG93ZWRBcmlhUm9sZXNcIiwgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZFJvbGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0LCByb2xlcywgcHJvcGVydGllcykge1xuICAgICAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0FsbG93ZWRBcmlhQXR0cmlidXRlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCBwZXJtaXR0ZWRSb2xlcyA9IFsuLi5yb2xlc107XG4gICAgICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgbGV0IHByb2hpYml0ZWRBdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICAvLyBFbGVtZW50IHdpdGggYSBkaXNhYmxlZCBhdHRyaWJ1dGUgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9kaXNhYmxlZC1lbGVtZW50cy5odG1sXG4gICAgICAgICAgICBpZiAoQVJJQURlZmluaXRpb25zLmVsZW1lbnRzQWxsb3dlZERpc2FibGVkLmluZGV4T2YodGFnTmFtZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgYXJpYS1kaXNhYmxlZCBhdHRyaWJ1dGUgb24gYW55IGVsZW1lbnQgdGhhdCBpcyBhbGxvd2VkIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgaW4gSFRNTDUuXG4gICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbShcImFyaWEtZGlzYWJsZWRcIiwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRWxlbWVudCB3aXRoIGEgcmVxdWlyZWQgYXR0cmlidXRlIGh0dHA6Ly93d3cudGhlLWFydC1vZi13ZWIuY29tL2h0bWwvaHRtbDUtZm9ybS12YWxpZGF0aW9uL1xuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWRSZXF1aXJlZC5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtcmVxdWlyZWQgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLXJlcXVpcmVkXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWRSZWFkT25seS5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtcmVhZG9ubHkgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgcmVhZG9ubHkgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLXJlYWRvbmx5XCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gcHJvcGVydGllcztcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgaW1wbGljaXQgcm9sZSBhbGxvd2VkIGF0dHJpYnV0ZXMgdG8gdGhlIGFsbG93ZWQgcm9sZSBsaXN0IGlmIHRoZXJlIGlzIG5vIHNwZWNpZmllZCByb2xlXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgYWxsb3cgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIChwZXJtaXR0ZWRSb2xlcyA9PT0gbnVsbCB8fCBwZXJtaXR0ZWRSb2xlcyA9PT0gdW5kZWZpbmVkIHx8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZVByb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3RhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnR5ICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydHkucHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gQXJpYVV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGVbaV0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9oaWJpdGVkUHJvcHMgPSByb2xlUHJvcGVydHkucHJvaGliaXRlZFByb3BzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkUHJvcHMgJiYgcHJvaGliaXRlZFByb3BzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9oaWJpdGVkUHJvcHMsIHByb2hpYml0ZWRBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBvZiBzZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlW2ldID09PSBcInNlcGFyYXRvclwiICYmIENvbW1vblV0aWwuaXNGb2N1c2FibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBnbG9iYWwgcHJvcGVydGllcyB0byB0aGUgdmFsaWQgYXR0cmlidXRlIGxpc3RcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxQcm9wZXJ0aWVzOyAvLyBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZGluZyB0aGUgb3RoZXIgcm9sZSB0byB0aGUgYWxsb3dlZCByb2xlcyBmb3IgdGhlIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdCh0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcywgcGVybWl0dGVkUm9sZXMpO1xuICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBzcGVjaWZpZWQgcm9sZSBwcm9wZXJ0aWVzIHRvIHRoZSBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGVybWl0dGVkUm9sZXMgIT09IG51bGwgJiYgaSA8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3Blcm1pdHRlZFJvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHByb3BlcnRpZXMgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBhbGxvdyBhdHRyaWJ1dGVzIGZyb20gdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdQcm9wZXJ0eSB8fCB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgfHwgIXRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgfHwgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydGllcy5wcm9wczsgLy8gYWxsb3dlZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IEFyaWFVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocGVybWl0dGVkUm9sZXNbaV0sIHJ1bGVDb250ZXh0KTsgLy8gcmVxdWlyZWQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvaGliaXRlZFByb3BzID0gcm9sZVByb3BlcnRpZXMucHJvaGliaXRlZFByb3BzO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvaGliaXRlZFByb3BzICYmIHByb2hpYml0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb2hpYml0ZWRQcm9wcywgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICBpZiAocGVybWl0dGVkUm9sZXNbaV0gPT09IFwic2VwYXJhdG9yXCIgJiYgQ29tbW9uVXRpbC5pc0ZvY3VzYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZ25vcmUgYXJpYS1sZXZlbCwgYXJpYS1zZXRzaXplIG9yIGFyaWEtcG9zaW5zZXQgaWYgXCJyb3dcIiBpcyBub3QgaW4gdHJlZWdyaWRcbiAgICAgICAgICAgIGlmIChwZXJtaXR0ZWRSb2xlcy5pbmNsdWRlcyhcInJvd1wiKSAmJiBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRyZWVncmlkXCIsIHRydWUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtbGV2ZWxcIikpID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtc2V0c2l6ZVwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPSBhbGxvd2VkQXR0cmlidXRlcy5pbmRleE9mKFwiYXJpYS1wb3NpbnNldFwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIGFsbG93ZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgYXR0cmlidXRlLXZhbHVlIHBhaXIgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHRhZ1Byb3BlcnR5Lm90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHIgPSB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlc1twXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gYXR0ci5zcGxpdChcIj1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKHBhaXJbMF0pID09PSBwYWlyWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQucHVzaChwYWlyWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkLnB1c2goYXR0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChhbGxvd2VkLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIHByb2hpYml0dGVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGF0dHJpYnV0ZS12YWx1ZSBwYWlyIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgIGxldCBkaXNhbGxvd2VkID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCB0YWdQcm9wZXJ0eS5vdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IGF0dHIuc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShwYWlyWzBdKSA9PT0gcGFpclsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvd2VkLnB1c2gocGFpclswXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWxsb3dlZC5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlzYWxsb3dlZC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGlzYWxsb3dlZCwgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9leGNsdWRlIHRoZSBwcm9oaWJpdGVkQXR0cmlidXRlcyBmcm9tIHRoZSBhbGxvd2VkQXR0cmlidXRlc1xuICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QocHJvaGliaXRlZEF0dHJpYnV0ZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgLy9leGNsdWRlIGFyaWEgYXR0cmlidXRlIGZvciBlbGVtZW50cyB3aXRob3V0IGltcGxpY2l0IHJvbGUgYW5kIHdpdGggJ05hbWluZyBQcm9oaWJpdGVkJ1xuICAgICAgICAgICAgaWYgKCghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSAmJiB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgJiYgdGFnUHJvcGVydHkucHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlKVxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiQXJpYVV0aWxfQWxsb3dlZEFyaWFBdHRyaWJ1dGVzXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZEF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhcmlhQXR0ciBcbiAgICAgKiBAcGFyYW0gaHRtbEF0dHJzIFxuICAgICAqIEB0eXBlOiBjb25mbGljdCBvciBvdmVybGFwcGluZ1xuICAgICAqIEByZXR1cm5zIGh0bWxBdHRyTmFtZSwgJ1Bhc3MnIG9yIG51bGxcbiAgICAgKiAgICAgICAgIGh0bWxBdHRyTmFtZSB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICAnUGFzcycgd2l0aCBubyBjb25mbGljdCB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICBvciBudWxsIHdoZXJlIGFyaWFBdHRyIHdvbid0IGNhdXNlIGNvbmZsaWN0XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb25mbGljdE9yT3ZlcmxhcHBpbmdIdG1sQXR0cmlidXRlKGFyaWFBdHRyLCBodG1sQXR0cnMsIHR5cGUpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICBsZXQgZXhpc3QgPSBBUklBRGVmaW5pdGlvbnMucmVsYXRlZEFyaWFIdG1sQXR0cmlidXRlc1thcmlhQXR0clsnbmFtZSddXTtcbiAgICAgICAgaWYgKGV4aXN0KSB7XG4gICAgICAgICAgICBpZiAoIWFyaWFBdHRyIHx8IGFyaWFBdHRyLmxlbmd0aCA9PSAwIHx8ICFodG1sQXR0cnMgfHwgaHRtbEF0dHJzLmxlbmd0aCA9PSAwKSByZXR1cm4gW107XG5cbiAgICAgICAgICAgIGxldCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IFtdO1xuICAgICAgICAgICAgbGV0IGNvbmNlcm5UeXBlcyA9IG51bGw7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2NvbmZsaWN0Jykge1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3QuY29uZmxpY3QgfHwgT2JqZWN0LmtleXMoZXhpc3QuY29uZmxpY3QpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uY2VyblR5cGVzID0gZXhpc3QuY29uZmxpY3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvdmVybGFwcGluZycpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0Lm92ZXJsYXBwaW5nIHx8IE9iamVjdC5rZXlzKGV4aXN0Lm92ZXJsYXBwaW5nKS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbmNlcm5UeXBlcyA9IGV4aXN0Lm92ZXJsYXBwaW5nO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGxldCBhcHBsaWNhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgZmFpbCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb25jZXJuVHlwZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VybkFyaWFWYWx1ZSA9IGNvbmNlcm5UeXBlc1trXS5hcmlhQXR0cmlidXRlVmFsdWU7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcm5IdG1sTmFtZXMgPSBjb25jZXJuVHlwZXNba10uaHRtbEF0dHJpYnV0ZU5hbWVzO1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXJuSHRtbFZhbHVlcyA9IGNvbmNlcm5UeXBlc1trXS5odG1sQXR0cmlidXRlVmFsdWVzO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBodG1sQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gY29uY2Vybkh0bWxOYW1lcy5pbmRleE9mKGh0bWxBdHRyc1tpXVsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbFZhbHVlc0luQ29uY2VybiA9IChjb25jZXJuSHRtbFZhbHVlcyA9PT0gbnVsbCB8fCBjb25jZXJuSHRtbFZhbHVlc1tpbmRleF0gPT09IG51bGwpID8gbnVsbCA6IGNvbmNlcm5IdG1sVmFsdWVzW2luZGV4XS5zcGxpdChcIixcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25jZXJuQXJpYVZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxWYWx1ZXNJbkNvbmNlcm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaHRtbFZhbHVlc0luQ29uY2Vybi5pbmNsdWRlcyhodG1sQXR0cnNbaV1bJ3ZhbHVlJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGh0bWxWYWx1ZXNJbkNvbmNlcm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uY2VybkFyaWFWYWx1ZSA9PT0gYXJpYUF0dHJbJ3ZhbHVlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uY2VybkFyaWFWYWx1ZSA9PT0gJ1ZBTFVFJyAmJiBodG1sVmFsdWVzSW5Db25jZXJuLmluY2x1ZGVzKCdWQUxVRScpICYmIGh0bWxWYWx1ZXNJbkNvbmNlcm5bMF0gIT09IGFyaWFBdHRyWyd2YWx1ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmNlcm5BcmlhVmFsdWUgPT09IGFyaWFBdHRyWyd2YWx1ZSddICYmIGh0bWxWYWx1ZXNJbkNvbmNlcm4uaW5jbHVkZXMoaHRtbEF0dHJzW2ldWyd2YWx1ZSddKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYXBwbGljYWJsZSAmJiAhZmFpbClcbiAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5wdXNoKHsgcmVzdWx0OiAnUGFzcycsICdhdHRyJzogJycgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBleGFtaW5lZEh0bWxBdHJOYW1lcztcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbSwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG5cbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyByb2xlcyAhPT0gbnVsbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByb2xlUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV07XG4gICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50aW9uYWwgPSByb2xlUHJvcGVydGllcy5wcmVzZW50YXRpb25hbENoaWxkcmVuO1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50aW9uYWwgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgd2Fsa05vZGU6IEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlKSB7XG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seSh3YWxrTm9kZSBhcyBIVE1MRWxlbWVudCkpIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAvL2FyaWEtb3duIGNhc2U6IGlmIHRoZSBlbGVtZW50IGlzIHJlZmVycmVkIGJ5IGFuIGFyaWEtd29uXG4gICAgICAgICAgICB3YWxrTm9kZSA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkod2Fsa05vZGUgYXMgSFRNTEVsZW1lbnQpIHx8IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyogXG4gKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIGEgdmFsaWQgQVJJQSByb2xlXG4gKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAqICAgICAgICAgdHJ1ZSBpZiB0aGUgcm9sZShzKSBhcmUgZGVmaW5lZCBpbiBBUklBXG4gKiAgICAgICAgIGZhbHNlIGlmIGFueSByb2xlIGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiovXG4gICAgcHVibGljIHN0YXRpYyBhcmVSb2xlc0RlZmluZWQocm9sZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcylcbiAgICAgICAgICAgIGlmICghKHJvbGUudG9Mb3dlckNhc2UoKSBpbiBkZXNpZ25QYXR0ZXJucykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFxuICAgICAqIGNoZWNrIGlmIGFueSBleHBsaWNpdCByb2xlIHNwZWNpZmllZCBmb3IgdGhlIGVsZW1lbnQgaXMgYSB2YWxpZCBBUklBIHJvbGVcbiAgICAgKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIHJvbGUocykgYXJlIGRlZmluZWQgaW4gQVJJQVxuICAgICAqICAgICAgICAgZmFsc2UgaWYgYW55IHJvbGUgaXMgbm90IGRlZmluZWQgaW4gQVJJQVxuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnZhbGlkUm9sZXMocnVsZUNvbnRleHQ6IEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRvbVJvbGVzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGlmICghZG9tUm9sZXMgfHwgZG9tUm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gY2hlY2sgdGhlICdnZW5lcmljJyByb2xlIGZpcnN0XG4gICAgICAgIGlmIChkb21Sb2xlcyAmJiBkb21Sb2xlcy5pbmNsdWRlcygnZ2VuZXJpYycpKVxuICAgICAgICAgICAgcmV0dXJuIFtcImdlbmVyaWNcIl07XG5cbiAgICAgICAgLy8gRmFpbGluZyByb2xlc1xuICAgICAgICBsZXQgZmFpbFJvbGVUb2tlbnMgPSBbXTtcbiAgICAgICAgLy8gUGFzc2luZyByb2xlc1xuICAgICAgICBsZXQgcGFzc1JvbGVUb2tlbnMgPSBbXTtcblxuICAgICAgICBsZXQgdGFnUHJvcGVydHkgPSBBcmlhVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGFsbG93ZWRSb2xlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgaWYgKCFhbGxvd2VkUm9sZXMgfHwgYWxsb3dlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBkb21Sb2xlcztcblxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gW107XG5cbiAgICAgICAgaWYgKGFsbG93ZWRSb2xlcy5pbmNsdWRlcygnYW55JykpXG4gICAgICAgICAgICByZXR1cm4gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21Sb2xlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghYWxsb3dlZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSAmJiAhaW52YWxpZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICBpbnZhbGlkUm9sZXMucHVzaChkb21Sb2xlc1tpXSk7XG5cbiAgICAgICAgcmV0dXJuIGludmFsaWRSb2xlcztcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAgICAgKiByZXR1cm46IGxpc3Qgb2Ygc3BlY2lmaWVkIHJvbGVzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICBsZXQgdW5kZWZpbmVkUm9sZXMgPSBbXTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIShyb2xlc1tpXSBpbiBkZXNpZ25QYXR0ZXJucykpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkUm9sZXMucHVzaChyb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRSb2xlcztcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBmaXJzdCBjaGVja3MgZXhwbGljaXQgcm9sZXMsIGlmIG5vIGV4cGxpY2l0IHJvbGUsIGl0IHdpbGwgY2hlY2sgdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgKiByZXR1cm46IG51bGwgaWYgYW55IGV4cGxpY2l0IHJvbGUgaXMgaW52YWxpZCwgXG4gICAgICogICAgICAgICBhIGxpc3Qgb2YgaW52YWxpZCBhdHRyaWJ1dGVzXG4gICAgICogICAgICAgICBlbXB0eSBsaXN0IGlmIGFsbCBhdHRyaWJ1dGVzIGFyZSB2YWxpZCwgb3Igbm8gYXJpYSBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEludmFsaWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dDogRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIC8vIGZvciBtdXRpcGxlIHJvbGVzLCBza2lwIGlmIGFueSByb2xlIGlzIGludmFsaWRcbiAgICAgICAgbGV0IGRlZmluZWQgPSBBcmlhVXRpbC5hcmVSb2xlc0RlZmluZWQocm9sZXMpO1xuICAgICAgICBpZiAoZGVmaW5lZCAhPT0gbnVsbCAmJiAhZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBhdHRycyA9IFtdO1xuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBhcmlhX2F0dHJzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBBdHRyaWJ1dGVzIGFsbG93ZWQgb24gdGhpcyBub2RlXG4gICAgICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcm9sZXMsIHRhZ1Byb3BlcnR5KTtcblxuICAgICAgICBpZiAoYXJpYV9hdHRycykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhX2F0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gYXJpYV9hdHRyc1tpXS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFsbG93ZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHJOYW1lKSAmJiAhYXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKVxuICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXR0cnM7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKGVsZW06IEVsZW1lbnQpIHtcblxuICAgICAgICBsZXQgYXJpYUF0dHJzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlTmFtZVZhbHVlUGFpcnMoZWxlbSk7XG4gICAgICAgIGxldCBodG1sQXR0cnMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEh0bWxBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGlmIChhcmlhQXR0cnMgJiYgYXJpYUF0dHJzLmxlbmd0aCA+IDAgJiYgaHRtbEF0dHJzICYmIGh0bWxBdHRycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gQXJpYVV0aWwuZ2V0Q29uZmxpY3RPck92ZXJsYXBwaW5nSHRtbEF0dHJpYnV0ZShhcmlhQXR0cnNbaV0sIGh0bWxBdHRycywgJ2NvbmZsaWN0Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGV4YW1pbmVkSHRtbEF0ck5hbWVzID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdGYWlsZWQnKSAvL2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyAnYXJpYUF0dHInOiBhcmlhQXR0cnNbaV1bJ25hbWUnXSwgJ2h0bWxBdHRyJzogaXRlbVsnYXR0ciddIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXByZWNhdGVkQXJpYVJvbGVzKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZ2xvYmFsRGVwcmVjYXRlZFJvbGVzID0gQVJJQURlZmluaXRpb25zLmdsb2JhbERlcHJlY2F0ZWRSb2xlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsRGVwcmVjYXRlZFJvbGVzLmluY2x1ZGVzKHJvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2gocm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlLWF0dHJpYnV0ZXNcbiAgICAgKiByZXR1cm46IGEgbGlzdCBvZiBkZXByZWNhdGVkIEFyaWEgcm9sZS1hdHRyaWJ1dGVzIHBhcmlzXG4gICAgICogICAgICAgICBmb3IgZ2xvYmFsIHRoZSByb2xlIGlzIG1hcmtlZCBhcyAnYW55J1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbWVudC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgYXJpYUF0dHJzID0gW107XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJylcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJzLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcmlhQXR0cnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBjb25zdCBnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxEZXByZWNhdGVkUHJvcGVydGllcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcy5pbmNsdWRlcyhhcmlhQXR0cnNbaV0pKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKHsgXCJyb2xlXCI6IFwiYW55XCIsIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tpXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVdpdGhEZXByZWNhdGVkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlOYW1lcyA9IHJvbGVXaXRoRGVwcmVjYXRlZEF0dHJpYnV0ZXNbJ2RlcHJlY2F0ZWRQcm9wcyddO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMgJiYgZGVwcmVjYXRlZEF0dHJpTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhcmlhQXR0cnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMuaW5jbHVkZXMoYXJpYUF0dHJzW2pdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyBcInJvbGVcIjogcm9sZXNbaV0sIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tqXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlSW5HcmlkKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobm9kZSwgXCJncmlkXCIpICE9IG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4vQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRE9NTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01NYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBCb3VuZHMgfSBmcm9tIFwiLi4vYXBpL0lCb3VuZHNcIjtcblxudHlwZSBQc2V1ZG9DbGFzcyA9XG4gICAgfCBcIjpob3ZlclwiXG4gICAgfCBcIjphY3RpdmVcIlxuICAgIHwgXCI6Zm9jdXNcIlxuICAgIHwgXCI6Zm9jdXMtdmlzaWJsZVwiXG4gICAgfCBcIjpmb2N1cy13aXRoaW5cIjtcblxuZXhwb3J0IGNsYXNzIENTU1V0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgc2VsZWN0b3JNYXRjaGVzRWxlbShlbGVtZW50OiBFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIEVhcmx5IHJldHVybiBmb3IgZW1wdHkgc2VsZWN0b3IgKGJlZm9yZSB0cnktY2F0Y2ggZm9yIHBlcmZvcm1hbmNlKVxuICAgICAgICBpZiAoIXNlbGVjdG9yIHx8IHNlbGVjdG9yLmxlbmd0aCA9PT0gMCB8fCBzZWxlY3Rvci50cmltKCkgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTW9kZXJuIHN0YW5kYXJkIG1ldGhvZFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm1hdGNoZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBWZW5kb3ItcHJlZml4ZWQgZmFsbGJhY2tzIChvbGRlciBicm93c2VycylcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiAoZWxlbWVudCBhcyBhbnkpLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS5tc01hdGNoZXNTZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkubXNNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBMZWdhY3kgbWV0aG9kIChkZXByZWNhdGVkIGJ1dCBrZXB0IGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZWxlbWVudCBhcyBhbnkpLm1hdGNoZXNTZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHVzZSBxdWVyeVNlbGVjdG9yQWxsIGFuZCBjaGVjayBpZiBlbGVtZW50IGlzIGluIHJlc3VsdHNcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fCAoZWxlbWVudCBhcyBhbnkpLmRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKCFkb2MpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIC8vIFVzZSBBcnJheS5mcm9tIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aCBtb2Rlcm4gZW5naW5lc1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obWF0Y2hlcykuaW5jbHVkZXMoZWxlbWVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gQmFkIHNlbGVjdG9yPyBEb2Vzbid0IG1hdGNoIHRoZW4uLi5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0eWxlIGNvbXB1dGVkIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gZWxlbVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtOiBIVE1MRWxlbWVudCwgcHNldWRvRWx0PzogUHNldWRvQ2xhc3MpIHtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuICAgICAgICBjb25zdCB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIHJldHVybiB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBwc2V1ZG9FbHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIGFuZCBjYWNoZSBhbGwgc3R5bGVzaGVldCBydWxlcyBhdCB0aGUgZG9jdW1lbnQgbGV2ZWxcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBhcnNlZCBydWxlIG9iamVjdHMgd2l0aCBzZWxlY3RvciBhbmQgc3R5bGUgaW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRQYXJzZWRTdHlsZXNoZWV0UnVsZXMob3duZXJEb2M6IERvY3VtZW50KTogQXJyYXk8e1xuICAgICAgICBmdWxsUnVsZVNlbGVjdG9yOiBzdHJpbmc7XG4gICAgICAgIGhhc1BzZXVkb0NsYXNzOiBib29sZWFuO1xuICAgICAgICBzZWxNYWluOiBzdHJpbmc7XG4gICAgICAgIHNlbFBzZXVkbzogc3RyaW5nO1xuICAgICAgICBzdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbjtcbiAgICB9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBjYWNoZWQgcGFyc2VkIHJ1bGVzIGZvciB0aGlzIGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGNhY2hlZFJ1bGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKG93bmVyRG9jLCBcIlJQVFV0aWxfUGFyc2VkU3R5bGVzaGVldFJ1bGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoY2FjaGVkUnVsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRSdWxlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZFJ1bGVzID0gW107XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgc3R5bGVzaGVldHMgYW5kIHJ1bGVzXG4gICAgICAgIGZvciAobGV0IHNzSW5kZXggPSAwOyBzc0luZGV4IDwgb3duZXJEb2Muc3R5bGVTaGVldHMubGVuZ3RoOyArK3NzSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gb3duZXJEb2Muc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSBzaGVldC5jc3NSdWxlc1tySW5kZXhdIGFzIENTU1N0eWxlUnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxSdWxlU2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsUnVsZVNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvTWF0Y2ggPSBmdWxsUnVsZVNlbGVjdG9yLm1hdGNoKC9eKC4qKSg6W2EtekEtWi1dKikkLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzUHNldWRvQ2xhc3MgPSAhIXBzZXVkb01hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbE1haW4gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzFdIDogZnVsbFJ1bGVTZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxQc2V1ZG8gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzJdIDogXCJcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUnVsZVNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQc2V1ZG9DbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsTWFpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsUHNldWRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogcnVsZS5zdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJDYW5ub3QgYWNjZXNzIHJ1bGVzXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICFlcnIudG9TdHJpbmcoKS5pbmNsdWRlcyhcIlNlY3VyaXR5RXJyb3I6XCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB0aGUgcGFyc2VkIHJ1bGVzIGF0IHRoZSBkb2N1bWVudCBsZXZlbFxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUob3duZXJEb2MsIFwiUlBUVXRpbF9QYXJzZWRTdHlsZXNoZWV0UnVsZXNcIiwgcGFyc2VkUnVsZXMpO1xuICAgICAgICByZXR1cm4gcGFyc2VkUnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJpdmF0ZSBoZWxwZXIgbWV0aG9kIHRvIGZpbGwgc3R5bGUgbWFwcyBmcm9tIGEgQ1NTU3R5bGVEZWNsYXJhdGlvblxuICAgICAqIEhhbmRsZXMgQ1NTIHByb3BlcnR5IHByaW9yaXRpZXMgYW5kIHRoZSBcImFsbFwiIHNob3J0aGFuZCBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGZpbGxTdHlsZShtYXBzOiBhbnlbXSwgc3R5bGU6IENTU1N0eWxlRGVjbGFyYXRpb24pOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgc3R5bGUubGVuZ3RoOyArK3NJbmRleCkge1xuICAgICAgICAgICAgaWYgKHN0eWxlW3NJbmRleF0gPT09IFwiYWxsXCIgJiYgc3R5bGVbc3R5bGVbc0luZGV4XV0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hcCBvZiBtYXBzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1hcFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBzdHlsZVtzSW5kZXhdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByaW9yaXR5ID0gc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eShrZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1hcCAmJiBtYXBba2V5XS5lbmRzV2l0aChcIiFpbXBvcnRhbnRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9PT0gXCJpbXBvcnRhbnRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBba2V5XS5zdGFydHNXaXRoKFwiaW5oZXJpdFwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBba2V5XS5zdGFydHNXaXRoKFwidW5zZXRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHN0eWxlW2tleV0gKyBcIiAhaW1wb3J0YW50XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVtrZXldICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJpb3JpdHkgPT09IFwiaW1wb3J0YW50XCIgPyBcIiAhaW1wb3J0YW50XCIgOiBcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcml2YXRlIGhlbHBlciBtZXRob2QgdGhhdCBjb25zb2xpZGF0ZXMgdGhlIGxvZ2ljIGZvciBnZXR0aW5nIGRlZmluZWQgc3R5bGVzXG4gICAgICogVXNlZCBieSBib3RoIGdldERlZmluZWRTdHlsZXMgYW5kIGdldERlZmluZWRTdHlsZXNNdWx0aXBsZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldERlZmluZWRTdHlsZXNJbnRlcm5hbChcbiAgICAgICAgZWxlbTogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByb3BzOiBzdHJpbmdbXSB8IG51bGwsXG4gICAgICAgIHBzZXVkb0NsYXNzZXM6IHN0cmluZ1tdXG4gICAgKTogeyBbcHNldWRvQ2xhc3M6IHN0cmluZ106IGFueSB9IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHt9O1xuICAgICAgICBjb25zdCBkZWZpbmVkU3R5bGVzTWFwID0ge307XG4gICAgICAgIGNvbnN0IGRlZmluZWRTdHlsZVBzZXVkb01hcCA9IHt9O1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgcmVzdWx0IG9iamVjdHMgZm9yIGFsbCBwc2V1ZG8tY2xhc3Nlc1xuICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgIGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdID0ge307XG4gICAgICAgICAgICBkZWZpbmVkU3R5bGVQc2V1ZG9NYXBbcHNldWRvQ2xhc3NdID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcHJlLXBhcnNlZCBzdHlsZXNoZWV0IHJ1bGVzIGZyb20gY2FjaGVcbiAgICAgICAgY29uc3QgcGFyc2VkUnVsZXMgPSBDU1NVdGlsLmdldFBhcnNlZFN0eWxlc2hlZXRSdWxlcyhlbGVtLm93bmVyRG9jdW1lbnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgb25jZSBpZiB3ZSBuZWVkIHRvIGhhbmRsZSA6Zm9jdXMgcHNldWRvLWNsYXNzXG4gICAgICAgIGNvbnN0IGhhc0ZvY3VzUHNldWRvID0gcHNldWRvQ2xhc3Nlcy5pbmNsdWRlcyhcIjpmb2N1c1wiKTtcblxuICAgICAgICAvLyBQcm9jZXNzIGVhY2ggY2FjaGVkIHJ1bGVcbiAgICAgICAgZm9yIChjb25zdCBwYXJzZWRSdWxlIG9mIHBhcnNlZFJ1bGVzKSB7XG4gICAgICAgICAgICBpZiAocHJvcHMgIT09IG51bGwgJiYgIXByb3BzLnNvbWUocHJvcCA9PiAhIXBhcnNlZFJ1bGUuc3R5bGVbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxQc2V1ZG8gPSBwYXJzZWRSdWxlLnNlbFBzZXVkbztcbiAgICAgICAgICAgIGNvbnN0IGhhc1BzZXVkb0NsYXNzID0gcGFyc2VkUnVsZS5oYXNQc2V1ZG9DbGFzcztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSGFuZGxlIDpmb2N1cy13aXRoaW4gcmVwbGFjZW1lbnQgb25jZSBwZXIgcnVsZSBpZiBuZWVkZWRcbiAgICAgICAgICAgIGxldCBzZWxNYWluID0gcGFyc2VkUnVsZS5zZWxNYWluO1xuICAgICAgICAgICAgaWYgKGhhc0ZvY3VzUHNldWRvICYmIHNlbFBzZXVkbyA9PT0gXCI6Zm9jdXNcIikge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBoYXMgZm9jdXMsIHJlbW92ZSBmb2N1cy13aXRoaW4gZnJvbSBwYXJlbnRzXG4gICAgICAgICAgICAgICAgc2VsTWFpbiA9IHNlbE1haW4ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgLyhbID5dW14rfiA+XSspOmZvY3VzLXdpdGhpbi9nLFxuICAgICAgICAgICAgICAgICAgICBcIiQxXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDYWNoZSBzZWxlY3RvciBtYXRjaGluZyByZXN1bHQgKG9ubHkgb25jZSBwZXIgcnVsZSwgbm90IHBlciBwc2V1ZG8tY2xhc3MpXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rvck1hdGNoZXMgPSBDU1NVdGlsLnNlbGVjdG9yTWF0Y2hlc0VsZW0oZWxlbSwgc2VsTWFpbik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VzcyBpZiBzZWxlY3RvciBtYXRjaGVzXG4gICAgICAgICAgICBpZiAoc2VsZWN0b3JNYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBmb3IgZWFjaCBwc2V1ZG8tY2xhc3NcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgbWFwIHJlZmVyZW5jZXMgdG8gYXZvaWQgcmVwZWF0ZWQgbG9va3Vwc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZU1hcCA9IGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwc2V1ZG9NYXAgPSBkZWZpbmVkU3R5bGVQc2V1ZG9NYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBvZiBub24tcHNldWRvIHNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1BzZXVkb0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbc3R5bGVNYXAsIHBzZXVkb01hcF0sIHBhcnNlZFJ1bGUuc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBmb3IgbWF0Y2hpbmcgcHNldWRvLWNsYXNzXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxQc2V1ZG8gPT09IHBzZXVkb0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbcHNldWRvTWFwXSwgcGFyc2VkUnVsZS5zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgZWxlbWVudCBzdHlsZXMgYW5kIGJ1aWxkIHJlc3VsdHMgaW4gb25lIHBhc3NcbiAgICAgICAgZm9yIChjb25zdCBwc2V1ZG9DbGFzcyBvZiBwc2V1ZG9DbGFzc2VzKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZU1hcCA9IGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgY29uc3QgcHNldWRvTWFwID0gZGVmaW5lZFN0eWxlUHNldWRvTWFwW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQWRkIGVsZW1lbnQncyBpbmxpbmUgc3R5bGVzXG4gICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbc3R5bGVNYXAsIHBzZXVkb01hcF0sIGVsZW0uc3R5bGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBCdWlsZCByZXN1bHRzXG4gICAgICAgICAgICBpZiAocHNldWRvQ2xhc3MgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3BzZXVkb0NsYXNzXSA9IHN0eWxlTWFwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgcHNldWRvLWNsYXNzZXMsIHJldHVybiBvbmx5IHN0eWxlcyB0aGF0IGRpZmZlciBmcm9tIGRlZmF1bHRcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmU3R5bGVzID0ge307XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHBzZXVkb01hcCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwc2V1ZG9NYXBba2V5XSAhPT0gc3R5bGVNYXBba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlN0eWxlc1trZXldID0gcHNldWRvTWFwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0c1twc2V1ZG9DbGFzc10gPSBkaWZmU3R5bGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnQgZm9yIG11bHRpcGxlIHBzZXVkby1jbGFzc2VzIGluIGEgc2luZ2xlIHBhc3NcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIGdldERlZmluZWRTdHlsZXMgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seVxuICAgICAqIGl0ZXJhdGVzIHRocm91Z2ggc3R5bGVzaGVldHMgb25jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgKGFsbG93cyB1cyB0byBza2lwIGVsZW0gbWF0Y2hpbmcgdW5uZWNlc3NhcmlseSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwc2V1ZG9DbGFzc2VzIC0gQXJyYXkgb2YgcHNldWRvLWNsYXNzZXMgdG8gcmV0cmlldmUuIFVzZSBcIlwiIGZvciBkZWZhdWx0IChubyBwc2V1ZG8tY2xhc3MpLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCBtYXBwaW5nIGVhY2ggcHNldWRvLWNsYXNzIHRvIGl0cyBkZWZpbmVkIHN0eWxlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKGVsZW06IEhUTUxFbGVtZW50LCBwcm9wczogc3RyaW5nW10gfCBudWxsLCBwc2V1ZG9DbGFzc2VzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByZXN1bHRzID0ge307XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNhY2hlIGtleSB0aGF0IGluY2x1ZGVzIHByb3BzIGZpbHRlclxuICAgICAgICAvLyBVc2UgXCJhbGxcIiBmb3IgbnVsbCBwcm9wcywgb3Igc29ydGVkIGNvbW1hLXNlcGFyYXRlZCBsaXN0IGZvciBzcGVjaWZpYyBwcm9wc1xuICAgICAgICBjb25zdCBwcm9wc0tleSA9IHByb3BzID09PSBudWxsID8gXCJhbGxcIiA6IHByb3BzLnNsaWNlKCkuc29ydCgpLmpvaW4oXCIsXCIpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QgLSBzZWUgaWYgd2UgaGF2ZSBhbGwgcmVxdWVzdGVkIHBzZXVkby1jbGFzc2VzIGNhY2hlZFxuICAgICAgICBsZXQgYWxsQ2FjaGVkU3R5bGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWFsbENhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgYWxsQ2FjaGVkU3R5bGVzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGNhY2hlIGJ1Y2tldCBmb3IgdGhpcyBwcm9wcyBmaWx0ZXJcbiAgICAgICAgbGV0IGNhY2hlZFN0eWxlcyA9IGFsbENhY2hlZFN0eWxlc1twcm9wc0tleV07XG4gICAgICAgIGxldCBtaXNzaW5nUHNldWRvQ2xhc3NlcyA9IFtdO1xuICAgICAgICBcbiAgICAgICAgaWYgKGNhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgd2hpY2ggcHNldWRvLWNsYXNzZXMgYXJlIGFscmVhZHkgY2FjaGVkXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkU3R5bGVzW3BzZXVkb0NsYXNzXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbcHNldWRvQ2xhc3NdID0gY2FjaGVkU3R5bGVzW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtaXNzaW5nUHNldWRvQ2xhc3Nlcy5wdXNoKHBzZXVkb0NsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIElmIGFsbCBhcmUgY2FjaGVkLCByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIGlmIChtaXNzaW5nUHNldWRvQ2xhc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFN0eWxlcyA9IHt9O1xuICAgICAgICAgICAgbWlzc2luZ1BzZXVkb0NsYXNzZXMgPSBwc2V1ZG9DbGFzc2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBwcm9jZXNzIG1pc3NpbmcgcHNldWRvLWNsYXNzZXMgdXNpbmcgdGhlIGludGVybmFsIGhlbHBlclxuICAgICAgICBpZiAobWlzc2luZ1BzZXVkb0NsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV3UmVzdWx0cyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc0ludGVybmFsKGVsZW0sIHByb3BzLCBtaXNzaW5nUHNldWRvQ2xhc3Nlcyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE1lcmdlIG5ldyByZXN1bHRzIHdpdGggY2FjaGVkIHJlc3VsdHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHNldWRvQ2xhc3Mgb2YgbWlzc2luZ1BzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3BzZXVkb0NsYXNzXSA9IG5ld1Jlc3VsdHNbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgIGNhY2hlZFN0eWxlc1twc2V1ZG9DbGFzc10gPSBuZXdSZXN1bHRzW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGNhY2hlIHdpdGggYWxsIHN0eWxlcyAoZXhpc3RpbmcgKyBuZXcpXG4gICAgICAgICAgICBhbGxDYWNoZWRTdHlsZXNbcHJvcHNLZXldID0gY2FjaGVkU3R5bGVzO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIGFsbENhY2hlZFN0eWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBjb21wdXRlZCBzdHlsZSBpbiB0aGF0IHRoZSBjb21wdXRlZCBzdHlsZSB3aWxsIHJldHVyblxuICAgICAqIHN0eWxlcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIGFnZW50LiBUaGlzIHdpbGwgb25seSByZXR1cm4gc3R5bGVzIGRlZmluZWQgYnkgdGhlXG4gICAgICogYXBwbGljYXRpb25cbiAgICAgKiBpZiByb3RhdGlvbiB0cmFuc2Zvcm0gaXMgdXNlZCwgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgdGhlIHJlc29sdmVkIG1hdHJpeFxuICAgICAqICB3aGlsZSB0aGUgZGVmaW5lZCBzdHlsZSByZXR1cm4gdGhlIHRyYW5zZm9ybSBmdW5jdGlvbihzKVxuICAgICAqIGZvciBleGFtcGxlLCBmb3IgJ3RyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7JywgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgJ21hdHJpeCgtMC4wNDM2MTk0LCAwLjk5OTA0OCwgLTAuOTk5MDQ4LCAtMC4wNDM2MTk0LCAwLCAwKSdcbiAgICAgKiAgYW5kIHRoZSBkZWZpbmVkIHN0eWxlIHJldHVybnMgJ3JvdGF0ZSgyLjVkZWcpJ1xuICAgICAqXG4gICAgICogY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgcHNldWRvQ2xhc3MgZnJvbSBQc2V1ZG9DbGFzcyB0byBzdHJpbmcgdG8gaW5jbHVkZSBib3RoIHBzZXVkbyBjbGFzc2VzIChlLmcuLCA6Zm9jdXMsIDpjaGVja2VkKVxuICAgICAqIGFuZCBwc2V1ZG8gZWxlbWVudHMgKGUuZy4sIDo6YmVmb3JlLCA6OmFmdGVyKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgKGFsbG93cyB1cyB0byBza2lwIGVsZW0gbWF0Y2hpbmcgdW5uZWNlc3NhcmlseSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3BzZXVkb0NsYXNzXSBJZiBzcGVjaWZpZWQsIHdpbGwgcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSBkaWZmZXJlbnRcbiAgICAgKiB0aGFuIHdoZW4gdGhlIHBzZXVkb0NsYXNzIGRvZXMgbm90IG1hdGNoLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVmaW5lZFN0eWxlcyhlbGVtOiBIVE1MRWxlbWVudCwgcHJvcHM6IHN0cmluZ1tdLCBwc2V1ZG9DbGFzcz86IHN0cmluZykge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIENyZWF0ZSBjYWNoZSBrZXkgdGhhdCBpbmNsdWRlcyBwcm9wcyBmaWx0ZXJcbiAgICAgICAgLy8gVXNlIFwiYWxsXCIgZm9yIG51bGwgcHJvcHMsIG9yIHNvcnRlZCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBmb3Igc3BlY2lmaWMgcHJvcHNcbiAgICAgICAgY29uc3QgcHJvcHNLZXkgPSBwcm9wcyA9PT0gbnVsbCA/IFwiYWxsXCIgOiBwcm9wcy5zbGljZSgpLnNvcnQoKS5qb2luKFwiLFwiKTtcbiAgICAgICAgY29uc3QgcHNldWRvS2V5ID0gcHNldWRvQ2xhc3MgfHwgXCJcIjtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0IC0gdXNlIHNoYXJlZCBjYWNoZSBzdHJ1Y3R1cmUgd2l0aCBnZXREZWZpbmVkU3R5bGVzTXVsdGlwbGVcbiAgICAgICAgbGV0IGFsbENhY2hlZFN0eWxlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFhbGxDYWNoZWRTdHlsZXMpIHtcbiAgICAgICAgICAgIGFsbENhY2hlZFN0eWxlcyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBjYWNoZSBidWNrZXQgZm9yIHRoaXMgcHJvcHMgZmlsdGVyXG4gICAgICAgIGxldCBjYWNoZWRTdHlsZXMgPSBhbGxDYWNoZWRTdHlsZXNbcHJvcHNLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgY2FjaGVkU3R5bGVzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChjYWNoZWRTdHlsZXNbcHNldWRvS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU3R5bGVzW3BzZXVkb0tleV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIGludGVybmFsIGhlbHBlciBtZXRob2Qgd2l0aCBhIHNpbmdsZSBwc2V1ZG8tY2xhc3NcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc0ludGVybmFsKGVsZW0sIHByb3BzLCBbcHNldWRvS2V5XSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbcHNldWRvS2V5XTtcbiAgICAgICAgXG4gICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgY2FjaGVkU3R5bGVzW3BzZXVkb0tleV0gPSByZXN1bHQ7XG4gICAgICAgIGFsbENhY2hlZFN0eWxlc1twcm9wc0tleV0gPSBjYWNoZWRTdHlsZXM7XG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCBhbGxDYWNoZWRTdHlsZXMpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtZWRpYSBxdWVyeSBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnRcbiAgICAgKiBHZXQgbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtcyBmcm9tIHN0eWxlc2hlZXRzIHdpdGggY2FjaGluZ1xuICAgICAqIFJldHVybnMgdHJhbnNmb3JtL3JvdGF0ZSBwcm9wZXJ0aWVzIGZvciBlbGVtZW50cyB3aXRoaW4gbWVkaWEgcXVlcmllc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtEb2N1bWVudH0gZG9jXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRNZWRpYU9yaWVudGF0aW9uVHJhbnNmb3JtKGRvYzogRG9jdW1lbnQpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGNhY2hlZCBtZWRpYSBvcmllbnRhdGlvbiB0cmFuc2Zvcm1zIGZvciB0aGlzIGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGNhY2hlZFRyYW5zZm9ybXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybXNcIiwgbnVsbCk7XG4gICAgICAgIGlmIChjYWNoZWRUcmFuc2Zvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVHJhbnNmb3JtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcmllbnRhdGlvblRyYW5zZm9ybXMgPSB7fVxuXG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHN0eWxlc2hlZXRzIGFuZCBydWxlc1xuICAgICAgICBmb3IgKGxldCBzc0luZGV4ID0gMDsgc3NJbmRleCA8IGRvYy5zdHlsZVNoZWV0cy5sZW5ndGg7ICsrc3NJbmRleCkge1xuICAgICAgICAgICAgY29uc3Qgc2hlZXQgPSBkb2Muc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoZWV0UnVsZSA9IHNoZWV0LmNzc1J1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8gPT09IHNoZWV0UnVsZS5NRURJQV9SVUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVsZSA9IHNoZWV0UnVsZSBhcyBDU1NNZWRpYVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUgJiYgcnVsZS5tZWRpYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUxpc3QgPSBydWxlLm1lZGlhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lZGlhTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZWRpYUxpc3QuaXRlbShpKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUtleSA9IG1lZGlhTGlzdC5pdGVtKGkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbV90cmFuc2Zvcm1zID0gb3JpZW50YXRpb25UcmFuc2Zvcm1zW21lZGlhS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxlbV90cmFuc2Zvcm1zKSBlbGVtX3RyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gcnVsZS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3R5bGVSdWxlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLyA9PT0gc3R5bGVSdWxlc1tqXS5TVFlMRV9SVUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbal0gYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHN0eWxlUnVsZS5zZWxlY3RvclRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHN0eWxlUnVsZS5zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgc3R5bGVzLmxlbmd0aDsgKytzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gc3R5bGVzW3NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleUxvd2VyID0ga2V5LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleUxvd2VyID09PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYWxsXCIgJiYgc3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3Jtc1trZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleUxvd2VyID09PSBcInJvdGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXNba2V5XSA9IHN0eWxlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0cmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90cmFuc2Zvcm1zW3NlbGVjdG9yXSA9IHRyYW5zZm9ybXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZWxlbV90cmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb25UcmFuc2Zvcm1zW21lZGlhS2V5XSA9IGVsZW1fdHJhbnNmb3JtcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiQ2Fubm90IGFjY2VzcyBydWxlc1wiKSAmJlxuICAgICAgICAgICAgICAgICAgICAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJTZWN1cml0eUVycm9yOlwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDYWNoZSB0aGUgbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtcyBhdCB0aGUgZG9jdW1lbnQgbGV2ZWxcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRVdGlsX01lZGlhT3JpZW50YXRpb25UcmFuc2Zvcm1zXCIsIG9yaWVudGF0aW9uVHJhbnNmb3Jtcyk7XG4gICAgICAgIHJldHVybiBvcmllbnRhdGlvblRyYW5zZm9ybXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29udmVydCBnaXZlbiByb3RhdGlvbiB0cmFuc2Zvcm0gZnVuY3Rpb25zIHRvIHRoZSBkZWdyZWUgdHJhbnNmb3JtZWQuXG4gICAgICogSWYgbXVsdGlwbGUgZnVuY3Rpb25zIGFyZSBnaXZlbiwgdGhlbiB0aGUgZnVuY3Rpb25zIGFyZSBhcHBsaWVkIGxpbmVhcmx5IGluIHRoZSBvcmRlci5cbiAgICAgKiAgIHJvdGF0aW9uX3RyYW5zZm9ybSBmdW5jdGlvbiBleGFtcGxlOiAgcm90YXRlKDQ1ZGVnKSwgcm90YXRlKDJ0dXJuKSwgcm90YXRlKDJyYWQpLCByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZyksXG4gICAgICogICAgICAgIHJvdGF0ZSgycmFkKSByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZylcbiAgICAgKiBAcGFyYW0gcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSb3RhdGlvbkRlZ3JlZShyb3RhdGlvbl90cmFuc2Zvcm0pIHtcbiAgICAgICAgbGV0IGRlZ3JlZSA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXJvdGF0aW9uX3RyYW5zZm9ybSkgcmV0dXJuIGRlZ3JlZTtcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0aGUgcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICAgICAgICByb3RhdGlvbl90cmFuc2Zvcm0gPSByb3RhdGlvbl90cmFuc2Zvcm0ucmVwbGFjZUFsbChcIiwgXCIsIFwiLFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybV9mdW5jdGlvbnMgPSByb3RhdGlvbl90cmFuc2Zvcm0uc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2Zvcm1fZnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtX2Z1bmN0aW9uID0gdHJhbnNmb3JtX2Z1bmN0aW9uc1tpXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbiA9PT0gXCJcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwicm90YXRlM2RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZTogcm90YXRlM2QoMSwgMSwgMSwgNDVkZWcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIoXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdHJpeCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3RhdGlvbiA9IHZhbHVlc1szXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdGF0aW9uKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJ0dXJuXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gNFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gbnVtICogMzYwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJyYWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSAobnVtICogMTgwKSAvIE1hdGguUEk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSArPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGVcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGVaXCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGU6IHJvdGF0ZSg0NWRlZyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm90YXRpb24gPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyb3RhdGlvbikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInR1cm5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSA0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSBudW0gKiAzNjA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uLmVuZHNXaXRoKFwicmFkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gKG51bSAqIDE4MCkgLyBNYXRoLlBJO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSArPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4M2RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSB0aHJlZSBFdWxlciBhbmdsZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ICE9PSAtMSAmJiByaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXRyaXggPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4KSB2YWx1ZXMgPSBtYXRyaXguc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpfYW5nbGUgPSBNYXRoLmF0YW4yKHZhbHVlc1s0XSwgdmFsdWVzWzVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyZWUgKz0gTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgoel9hbmdsZSAqIDE4MCkgLyBNYXRoLlBJKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgdGhyZWUgRXVsZXIgYW5nbGVzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0cml4ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6X2FuZ2xlID0gTWF0aC5hdGFuMih2YWx1ZXNbMV0sIHZhbHVlc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlICs9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHpfYW5nbGUgKiAxODApIC8gTWF0aC5QSSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAoZGVncmVlID49IDM2MCkgZGVncmVlIC09IDM2MDtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhbm5vdCByZXRyaWV2ZSByb3RhdGlvbiBkZWdyZWU6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVncmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgQ1NTIHN0eWxlIHN0cmluZyB2YWx1ZXMgdG8gcGl4ZWxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHN0eWxlIHZhbHVlIGluIHN0cmluZywgc3VjaCBhcyAzcmVtLCAyMzBweCBldGMuXG4gICAgICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRQaXhlbHNGcm9tU3R5bGUodmFsdWUsIGVsZW0pIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbiAgICAgICAgbGV0IHBhcnNlZCA9IHZhbHVlLnRyaW0oKS5tYXRjaChyZWdleCk7XG4gICAgICAgIGlmIChwYXJzZWQgPT09IG51bGwpIHJldHVybiAwO1xuICAgICAgICBpZiAocGFyc2VkWzJdID09PSBcIlwiIHx8IHBhcnNlZFsxXSA9PT0gMClcbiAgICAgICAgICAgIC8vbm8gemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBlcnJvciwgc28gaW1wbGljYWJsZVxuICAgICAgICAgICAgcmV0dXJuIDA7XG5cbiAgICAgICAgY29uc3QgcGl4ZWxzID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhcnNlZFsyXSwgcGFyc2VkWzFdLCBlbGVtKTtcbiAgICAgICAgcmV0dXJuIHBpeGVscyA9PT0gbnVsbCA/IHBpeGVscyA6IHBhcnNlRmxvYXQocGl4ZWxzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGFic29sdXRlIENTUyBudW1lcmljYWwgdmFsdWVzIHRvIHBpeGVscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1bml0VmFsdWUgaW4gc3RyaW5nXG4gICAgICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXQsIHVuaXRWYWx1ZSwgZWxlbSkge1xuICAgICAgICBpZiAodW5pdFZhbHVlID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgaWYgKCF1bml0KSB1bml0ID0gXCJweFwiO1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRVbml0cyA9IHtcbiAgICAgICAgICAgIC8vIGFic29sdXRlIHVuaXRcbiAgICAgICAgICAgIHB4OiAodmFsdWUpID0+IHZhbHVlLFxuICAgICAgICAgICAgY206ICh2YWx1ZSkgPT4gdmFsdWUgKiAzNy44LFxuICAgICAgICAgICAgbW06ICh2YWx1ZSkgPT4gdmFsdWUgKiAzLjc4LFxuICAgICAgICAgICAgcTogKHZhbHVlKSA9PiB2YWx1ZSAqIDAuOTUsXG4gICAgICAgICAgICBpbjogKHZhbHVlKSA9PiB2YWx1ZSAqIDk2LFxuICAgICAgICAgICAgcGM6ICh2YWx1ZSkgPT4gdmFsdWUgKiAxNixcbiAgICAgICAgICAgIHB0OiAodmFsdWUpID0+IHZhbHVlICogMS4zMyxcblxuICAgICAgICAgICAgLy8gcmVsYXRpdmUgdW5pdFxuICAgICAgICAgICAgcmVtOiAodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgdmFsdWUgKlxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBlbTogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgIHZhbHVlICpcbiAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoXCJmb250LXNpemVcIilcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgdnc6ICh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAodmFsdWUgLyAxMDApICogZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmlubmVyV2lkdGgsXG4gICAgICAgICAgICB2aDogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICh2YWx1ZSAvIDEwMCkgKiBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuaW5uZXJIZWlnaHQsXG4gICAgICAgICAgICBcIiVcIjogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICh2YWx1ZSAvIDEwMCkgKlxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBpZiAodW5pdCBpbiBzdXBwb3J0ZWRVbml0cykgcmV0dXJuIHN1cHBvcnRlZFVuaXRzW3VuaXRdKHVuaXRWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qXG4gICAgICogUmV0dXJucyBpZiB0aGUgZm9udCBmb3IgdmlzaWJsZSB0ZXh0IG9mIHRoZSBlbGVtZW50IGlzIGRlZmluZWQgYnkgbWF0ZXJpYWwgaWNvbnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTWF0ZXJpYWxJY29uRm9udChlbGVtOiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGUgZXhpc3RlbmNlIG1hdGVyaWFsIGljb25zIHVzaW5nIGZldGNoIGluIG5vZGUgMTgrXG4gICAgICAgIC8vIGZvciBub3cgKG5vZGUgMTYpIGp1c3QgZGVydGVybWluZSBpZiB0aGUgc3R5bGVzaGVldCBmb3IgdGhlICdNYXRlcmlhbCBJY29ucycgZXhpc3RzIHN0YXRpY2FsbHkuIG5vdGUgdGhhdCB0aGUgbG9hZGluZyBvZiB0aGUgZm9udCBzdHlsZXNoZWV0IG9jY3VycyBhdCBydW4gdGltZS5cbiAgICAgICAgLy9saXN0IG9mIGtub3duIG1hdGVyaWFsIGljb25zIGFuZCBzdHlsZXNoZWV0IGxpbmtcbiAgICAgICAgY29uc3Qga25vd25faWNvbnMgPSB7XG4gICAgICAgICAgICBcIk1hdGVyaWFsIEljb25zXCI6XG4gICAgICAgICAgICAgICAgXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2ljb24/ZmFtaWx5PU1hdGVyaWFsK0ljb25zXCIsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGtub3duX2Nzc19jbGFzc2VzID0ge1xuICAgICAgICAgICAgXCJtYXRlcmlhbC1pY29uc1wiOlxuICAgICAgICAgICAgICAgIFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG1hdGVyaWFsIGljb24gZm9udCBjYW4gYmUgZGVmaW5lZCBlaXRoZXIgYnkgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucycgb3IgYnkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiXG4gICAgICAgIGxldCBzdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMoZWxlbSwgW1wiZm9udC1mYW1pbHlcIl0pO1xuICAgICAgICBsZXQgZm9udEZhbWlseSA9IHN0eWxlc1tcImZvbnQtZmFtaWx5XCJdO1xuXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAvLyBmb250LWZhbWlseSBzcGVjaWZpZXMgYSBwcmlvcml0aXplZCBsaXN0IG9mIG9uZSBvciBtb3JlIGZvbnQgZmFtaWx5IG5hbWVzXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGZvbnRGYW1pbHkgJiZcbiAgICAgICAgICAgIGZvbnRGYW1pbHkuc3BsaXQoXCIsXCIpWzBdLnJlcGxhY2UoL1snXCJdKy9nLCBcIlwiKS50cmltKCkgaW4ga25vd25faWNvbnNcbiAgICAgICAgKVxuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gZWxlbS5jbGFzc0xpc3Q7XG4gICAgICAgICAgICBmb3IgKGxldCBjc3NfY2xhc3MgaW4ga25vd25fY3NzX2NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdC5jb250YWlucyhjc3NfY2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZm91bmQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzdHlsZXNoZWV0IGZvciB0aGUgJ01hdGVyaWFsIEljb25zJyBleGlzdHMgc3RhdGljYWxseVxuICAgICAgICBsZXQgc2hlZXRzID0gZWxlbS5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzO1xuICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IHNoZWV0cy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNoZWV0cyAmJlxuICAgICAgICAgICAgICAgIHNoZWV0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhrbm93bl9pY29ucykuaW5kZXhPZihzaGVldHNbc10uaHJlZikgPiAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0V2VpZ2h0TnVtYmVyKHN0eWxlVmFsKSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBsaWdodDogMTAwLFxuICAgICAgICAgICAgYm9sZDogNzAwLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmV0VmFsID0gcGFyc2VJbnQoc3R5bGVWYWwpO1xuICAgICAgICBpZiAocmV0VmFsKSByZXR1cm4gcmV0VmFsO1xuICAgICAgICBpZiAoc3R5bGVWYWwgaW4gbWFwKSByZXR1cm4gbWFwW3N0eWxlVmFsXTtcbiAgICAgICAgcmV0dXJuIDQwMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEZvbnRJblBpeGVscyhzdHlsZVZhbCwgZWxlbSkge1xuICAgICAgICBsZXQgbWFwID0ge1xuICAgICAgICAgICAgXCJ4eC1zbWFsbFwiOiAxNixcbiAgICAgICAgICAgIFwieC1zbWFsbFwiOiAxMCxcbiAgICAgICAgICAgIHNtYWxsOiAxMyxcbiAgICAgICAgICAgIG1lZGl1bTogMTYsXG4gICAgICAgICAgICBsYXJnZTogMTgsXG4gICAgICAgICAgICBcIngtbGFyZ2VcIjogMjQsXG4gICAgICAgICAgICBcInh4LWxhcmdlXCI6IDMyLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZUZsb2F0KHN0eWxlVmFsKTtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcFtzdHlsZVZhbF07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVuaXRzID0gc3R5bGVWYWwuc3Vic3RyaW5nKChcIlwiICsgdmFsdWUpLmxlbmd0aCk7XG4gICAgICAgIC8qKlxuICAgICAgICBpZiAodW5pdHMgPT09IFwiXCIgfHwgdW5pdHMgPT09IFwicHhcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikgcmV0dXJuIHZhbHVlICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCIlXCIpIHJldHVybiB2YWx1ZSAvIDEwMCAqIDE2O1xuICAgICAgICBpZiAodW5pdHMgPT09IFwicHRcIikgcmV0dXJuIHZhbHVlICogNCAvIDM7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAqL1xuICAgICAgICByZXR1cm4gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXRzLCB2YWx1ZSwgZWxlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDU1NTdHlsZShlbGVtZW50KSB7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoZWxlbWVudC5JQk1fQ1NTX1RIQikgcmV0dXJuIGVsZW1lbnQuSUJNX0NTU19USEI7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHN0eWxlVGV4dCA9PT0gdW5kZWZpbmVkIHx8IHN0eWxlVGV4dC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgICB9IGVsc2UgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoc3R5bGVUZXh0ID09PSBudWxsIHx8IHN0eWxlVGV4dC50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICAgIC8vcmVtb3ZlIGNvbW1lbnQgYmxvY2tzXG4gICAgICAgIGxldCByZSA9IC8oXFwvXFwqKyg/Oig/Oig/OlteXFwqXSkrKXwoPzpbXFwqXSsoPyFcXC8pKSlbKl0rXFwvKXxcXC9cXC8uKi9nO1xuICAgICAgICBsZXQgc3Vic3QgPSBcIiBcIjtcbiAgICAgICAgc3R5bGVUZXh0ID0gc3R5bGVUZXh0LnJlcGxhY2UocmUsIHN1YnN0KTtcbiAgICAgICAgLy8gRmluZCBhbGwgXCJrZXkgOiB2YWw7XCIgcGFpcnMgd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgICAgIGxldCByS2V5VmFscyA9IC9cXHMqKFteOlxcc10rKVxccyo6XFxzKihbXjskfV0rKVxccyooO3wkKS9nO1xuICAgICAgICAvLyBGaW5kIGFsbCBcInNlbGVjdG9yIHsgY3Nza2V5dmFscyB9IHdpdGggdmFyaW91cyB3aGl0ZXNwYWNlIGluYmV0d2VlblxuICAgICAgICBsZXQgclNlbGVjdG9ycyA9IC9cXHMqKFtee10qKXsoW159XSopfS9nO1xuICAgICAgICBpZiAoc3R5bGVUZXh0LmluZGV4T2YoXCJ7XCIpID09PSAtMSkge1xuICAgICAgICAgICAgbGV0IGtleVZhbHMgPSB7fTtcbiAgICAgICAgICAgIGxldCBtO1xuICAgICAgICAgICAgd2hpbGUgKChtID0gcktleVZhbHMuZXhlYyhzdHlsZVRleHQpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAga2V5VmFsc1ttWzFdXSA9IG1bMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczoga2V5VmFscyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGVsZW1lbnQuSUJNX0NTU19USEIgPSByZXRWYWw7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICBsZXQgbTI7XG4gICAgICAgICAgICB3aGlsZSAoKG0gPSByU2VsZWN0b3JzLmV4ZWMoc3R5bGVUZXh0KSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBrZXlWYWxzID0ge307XG4gICAgICAgICAgICAgICAgbGV0IHNlbEtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgbGV0IHNlbFZhbCA9IG1bMl07XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoKG0yID0gcktleVZhbHMuZXhlYyhzZWxWYWwpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHNbbTJbMV1dID0gbTJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbEtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBrZXlWYWxzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudC5JQk1fQ1NTX1RIQiA9IHJldFZhbDtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBhbiBcImlubGluZVwiIENTUyBkaXNwbGF5IHByb3BlcnR5IHRlbGxzIHRoZSBlbGVtZW50IHRvIGZpdCBpdHNlbGYgb24gdGhlIHNhbWUgbGluZS4gQW4gJ2lubGluZScgZWxlbWVudCdzIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGlnbm9yZWQuXG4gICAgICogc29tZSBlbGVtZW50IGhhcyBkZWZhdWx0IGlubGluZSBwcm9wZXJ0eSwgc3VjaCBhcyA8c3Bhbj4sIDxhPlxuICAgICAqIG1vc3QgZm9ybWF0dGluZyBlbGVtZW50cyBpbmhlcmVudCBpbmxpbmUgcHJvcGVydHksIHN1Y2ggYXMgPGVtPiwgPHN0cm9uZz4sIDxpPiwgPHNtYWxsPlxuICAgICAqIG90aGVyIGlubGluZSBlbGVtZW50czogPGFiYnI+IDxhY3JvbnltPiA8Yj4gPGJkbz4gPGJpZz4gPGJyPiA8Y2l0ZT4gPGNvZGU+IDxkZm4+IDxlbT4gPGk+IDxpbnB1dD4gPGtiZD4gPGxhYmVsPlxuICAgICAqIDxtYXA+IDxvYmplY3Q+IDxvdXRwdXQ+IDxxPiA8c2FtcD4gPHNjcmlwdD4gPHNlbGVjdD4gPHNtYWxsPiA8c3Bhbj4gPHN0cm9uZz4gPHN1Yj4gPHN1cD4gPHRleHRhcmVhPiA8dGltZT4gPHR0PiA8dmFyPlxuICAgICAqIGFuIFwiaW5saW5lLWJsb2NrXCIgZWxlbWVudCBzdGlsbCBwbGFjZSBlbGVtZW50IGluIHRoZSBzYW1lIGxpbmUgd2l0aG91dCBicmVha2luZyB0aGUgbGluZSwgYnV0IHRoZSBlbGVtZW50J3Mgd2lkdGggYW5kIGhlaWdodCBhcmUgYXBwbGllZC5cbiAgICAgKiBpbmxpbmUtYmxvY2sgZWxlbWVudHM6IGltZywgYnV0dG9uLCBzZWxlY3QsIG1ldGVyLCBwcm9ncmVzcywgbWFyZ3VlZSwgYWxzbyBpbiBDaHJvbWU6IHRleHRhcmVhLCBpbnB1dFxuICAgICAqIEEgYmxvY2stbGV2ZWwgZWxlbWVudCBhbHdheXMgc3RhcnRzIG9uIGEgbmV3IGxpbmUsIGFuZCB0aGUgYnJvd3NlcnMgYXV0b21hdGljYWxseSBhZGQgc29tZSBzcGFjZSAoYSBtYXJnaW4pIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGVsZW1lbnQuXG4gICAgICogYmxvY2stbGV2ZWwgZWxlbWVudHM6IDxhZGRyZXNzPiA8YXJ0aWNsZT4gPGFzaWRlPiA8YmxvY2txdW90ZT4gPGNhbnZhcz4gPGRkPiA8ZGl2PiA8ZGw+IDxkdD4gPGZpZWxkc2V0PiA8ZmlnY2FwdGlvbj4gPGZpZ3VyZT4gPGZvb3Rlcj4gPGZvcm0+XG4gICAgICogPGgxPi08aDY+IDxoZWFkZXI+IDxocj4gPGxpPiA8bWFpbj4gPG5hdj4gPG5vc2NyaXB0PiA8b2w+IDxwPiA8cHJlPiA8c2VjdGlvbj4gPHRhYmxlPiA8dGZvb3Q+IDx1bD4gPHZpZGVvPlxuICAgICAqXG4gICAgICogcmV0dXJuOiBpZiBpdCdzIGlubGluZSBlbGVtZW50IGFuZCB7IGlubGluZTogdHJ1ZSB8IGZhbHNlLCB0ZXh0OiB0cnVlIHwgZmFsc2UsIHZpb2xhdGlvbjogbnVsbCB8IHtub2RlfSB9XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbmxpbmVTdGF0dXMoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGVsZW1fc3R5bCA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgICAgIGlmICghZWxlbV9zdHlsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgc3RhdHVzID0geyBpbmxpbmU6IGZhbHNlLCB0ZXh0OiBmYWxzZSwgdmlvbGF0aW9uOiBudWxsIH07XG4gICAgICAgIGNvbnN0IHVkaXNwbGF5ID0gZWxlbV9zdHlsLmdldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5XCIpO1xuICAgICAgICAvLyBpbmxpbmUgZWxlbWVudCBvbmx5XG4gICAgICAgIGlmICh1ZGlzcGxheSAhPT0gXCJpbmxpbmVcIikgcmV0dXJuIHN0YXR1cztcblxuICAgICAgICBzdGF0dXMuaW5saW5lID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIHN0YXR1cztcblxuICAgICAgICBjb25zdCBtYXBwZXI6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpO1xuICAgICAgICBjb25zdCBkaXNwbGF5ID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7XG4gICAgICAgIC8vIGFuIGlubGluZSBlbGVtZW50IGlzIGluc2lkZSBhIGJsb2NrLiBub3RlIDxib2R5PiBpcyBhIGJsb2NrIGVsZW1lbnQgdG9vXG4gICAgICAgIGlmIChkaXNwbGF5ICE9PSBcImJsb2NrXCIgJiYgZGlzcGxheSAhPT0gXCJpbmxpbmUtYmxvY2tcIikge1xuICAgICAgICAgICAgLy9wYXJlbnQgaXMgaW5saW5lIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybnMgXCJ5ZXNcIlwiOiBpbmxpbmUgd2l0aCB0ZXh0LCBcIm5vXCI6IGlubGluZSB3aXRob3V0IHRleHQsIFxuICAgICAgICAgKiAgICAgICAgICBcInZpb2xhdGlvblwiOiBub3Qgc3BhY2luZyBlbm91Z2ggdG8gbmVpYm9yaW5nIGlubGluZSB0YXJnZXRcbiAgICAgICAgICogICAgICAgICAgXCJibG9ja1wiOiBibG9jayBlbGVtZW50LCAgXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBpc0lubGluZVdpdGhUZXh0KG5vZGU6IE5vZGUsIGJlZm9yZTogYm9vbGVhbikgOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgICAgIC8vIG5vdGUgYnJvd3NlcnMgaW5zZXJ0IFRleHQgbm9kZXMgdG8gcmVwcmVzZW50IHdoaXRlc3BhY2VzLlxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVZhbHVlICYmIG5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ5ZXNcIjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5vXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiA8YnI+IGlzIHN0eWxlZCAnaW5saW5lJyBieSBkZWZhdWx0LCBidXQgY2hhbmdlIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJiclwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBjU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY0Rpc3BsYXkgPSBjU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7XG4gICAgICAgICAgICAgICAgaWYgKGNEaXNwbGF5ID09PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFyZ2V0KG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoIDwgMjQpIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGhvcml6b250YWwgc3BhY2luZyBpcyBzdWZmaWNpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYmVmb3JlICYmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCAvIDIpICsgYm91bmRzLmxlZnQgLSBibmRzLmxlZnQgPCAyNCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghYmVmb3JlICYmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCAvIDIpICsgYm91bmRzLmxlZnQgLSAoYm5kcy5sZWZ0ICsgYm5kcy53aWR0aCkgPCAyNCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy52aW9sYXRpb24gPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcInZpb2xhdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJub1wiOyAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzSW5uZXJUZXh0T25seUVtcHR5KG5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwieWVzXCI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5vXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbiBpbmxpbmUgZWxlbWVudCBpcyBpbnNpZGUgYSBibG9jay4gbm90ZSA8Ym9keT4gaXMgYSBibG9jayBlbGVtZW50IHRvb1xuICAgICAgICAvLyBvbmUgb3IgbW9yZSBpbmxpbmUgZWxlbWVudHMgd2l0aCB0ZXh0IGluIHRoZSBzYW1lIGxpbmU6IDx0YXJnZXQ+LCB0ZXh0PHRhcmdldD4sIDx0YXJnZXQ+dGV4dCwgPGlubGluZT4rdGV4dDx0YXJnZXQ+LCA8dGFyZ2V0PjxpbmxpbmU+K3RleHQsIHRleHQ8dGFyZ2V0PjxpbmxpbmU+K1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBlbGVtZW50Lm5leHRTaWJsaW5nO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGxldCBpbmxpbmVUZXh0ID0gaXNJbmxpbmVXaXRoVGV4dCh3YWxrTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaW5saW5lVGV4dCA9PT0gXCJ5ZXNcIikge1xuICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0ID09PSBcImJsb2NrXCIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGxldCBpbmxpbmVUZXh0ID0gaXNJbmxpbmVXaXRoVGV4dCh3YWxrTm9kZSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGlubGluZVRleHQgPT09IFwieWVzXCIpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMudGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5saW5lVGV4dCA9PT0gXCJibG9ja1wiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGEgdGFyZ2V0IGlzIGVuIGVsZW1lbnQgdGhhdCBhY2NlcHQgYSBwb2ludGVyIGFjdGlvbiAoY2xpY2sgb3IgdG91Y2gpXG4gICAgICogYSB0YXJnZXQgaXMgYSBicm93c2VyIGRlZmF1bHQgaWYgaXQncyBhIG5hdGl2ZSB3aWRnZXQgKG5vIHVzZXIgZGVmaW5lZCByb2xlKSB3aXRob3V0IHVzZXIgc3R5bGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFyZ2V0QnJvd3NlckRlZmF1bHQoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyB1c2VyIGRlZmluZWQgd2lkZ2V0XG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIG5vIHVzZXIgc3R5bGUgdG8gc3BhY2UgY29udHJvbCBzaXplLCBpbmNsdWRpbmcgdXNlIG9mIGZvbnRcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzKGVsZW1lbnQsIFtcbiAgICAgICAgICAgIFwibGluZS1oZWlnaHRcIiwgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiLFwibWluLWhlaWdodFwiLCBcIm1pbi13aWR0aFwiLFxuICAgICAgICAgICAgXCJmb250LXNpemVcIixcIm1hcmdpbi10b3BcIixcIm1hcmdpbi1ib3R0b21cIiwgXCJtYXJnaW4tbGVmdFwiLCBcIm1hcmdpbi1yaWdodFwiXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdHlsZXNbXCJsaW5lLWhlaWdodFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wiaGVpZ2h0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJ3aWR0aFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWluLWhlaWdodFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWluLXdpZHRoXCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJmb250LXNpemVcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi10b3BcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi1ib3R0b21cIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi1sZWZ0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJtYXJnaW4tcmlnaHRcIl1cbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogc3RyaW5nIGNvbnRhaW5zIENKSyAoY2hpbmVzZSwgamFwYW5lc2VzLCBvciBrb3JlYSlcbiAgICAgKiByZXR1cm46IGJvb2xlYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zQ0tKKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRleHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DSktfVW5pZmllZF9JZGVvZ3JhcGhzICBodHRwczovL2F5YWthLnNobi5oay9oYW5yZWdleC9cbiAgICAgICAgbGV0IHJlZ2V4ID0gLyg/OltcXHU0ZTAwLVxcdTlmZmZcXHUzNDAwLVxcdTRkYmZdKSsvZztcblxuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHRleHQudHJpbSgpLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuICAgICAgICBpZiAocmVwbGFjZWQubGVuZ3RoID09PSB0ZXh0LnRyaW0oKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGFuY2VzdG9yIHdpdGggdGhlIGdpdmVuIHN0eWxlIHByb3BlcnRpZXMuXG4gICAgICogU2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgYW4gYW5jZXN0b3IgdGhhdCBoYXMgQUxMIHNwZWNpZmllZCBzdHlsZSBwcm9wZXJ0aWVzXG4gICAgICogd2l0aCB2YWx1ZXMgbWF0Y2hpbmcgdGhlIGNyaXRlcmlhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtlbGVtZW50fSBlbGVtIC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0eWxlUHJvcHMgLSBUaGUgc3R5bGUgcHJvcGVydGllcyBhbmQgdmFsdWVzIG9mIHRoZSBwYXJlbnQgdG8gc2VhcmNoIGZvci5cbiAgICAgKiAgICAgICAgIHN1Y2ggYXMge1wib3ZlcmZsb3dcIjpbJ2F1dG8nLCAnc2Nyb2xsJ10sIFwib3ZlcmZsb3cteFwiOlsnYXV0bycsICdzY3JvbGwnXX1cbiAgICAgKiAgICAgICAgICBvciB7XCJvdmVyZmxvd1wiOlsnKiddLCBcIm92ZXJmbG93LXhcIjpbJyonXX0sIFRoZSAnKicgZm9yIGFueSB2YWx1ZSB0byBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIHRoZSBzdHlsZSBwcm9wLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGV4Y2x1ZGVkVmFsdWVzIC0gc3R5bGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQuXG4gICAgICogQHJldHVybiB7RWxlbWVudHxudWxsfSAtIEFuIGFuY2VzdG9yIGVsZW1lbnQgdGhhdCBoYXMgYWxsIHRoZSBzcGVjaWZpZWQgc3R5bGUgcHJvcGVydGllcywgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICogQG1lbWJlck9mIENTU1V0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFN0eWxlcyhlbGVtLCBzdHlsZVByb3BzLCBleGNsdWRlZFZhbHVlcyA9IFtdKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNhY2hlIGtleSB0aGF0IGluY2x1ZGVzIHRoZSBzdHlsZSBwcm9wZXJ0aWVzIGJlaW5nIHNlYXJjaGVkIGZvclxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IFwiQXJpYVV0aWxfQW5jZXN0b3JXaXRoU3R5bGVzX1wiICsgSlNPTi5zdHJpbmdpZnkoc3R5bGVQcm9wcykgKyBcIl9cIiArIEpTT04uc3RyaW5naWZ5KGV4Y2x1ZGVkVmFsdWVzKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGNhY2hlZCByZXN1bHQgZm9yIHRoaXMgc3BlY2lmaWMgcXVlcnlcbiAgICAgICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIGNhY2hlS2V5LCBudWxsKTtcbiAgICAgICAgaWYgKGNhY2hlZFJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdCA9PT0gXCJOT1RfRk9VTkRcIiA/IG51bGwgOiBjYWNoZWRSZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFydCB3aXRoIHRoZSBlbGVtZW50IGl0c2VsZiAobm90IGp1c3QgcGFyZW50KSB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IGVsZW07XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gU2tpcCBpZiBub3QgYW4gSFRNTEVsZW1lbnQgKGUuZy4sIFNWR0VsZW1lbnQpXG4gICAgICAgICAgICAvLyBVc2Ugbm9kZVR5cGUgY2hlY2sgaW5zdGVhZCBvZiBpbnN0YW5jZW9mIHRvIHdvcmsgYWNyb3NzIGRpZmZlcmVudCBkb2N1bWVudCBjb250ZXh0c1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVUeXBlICE9PSAxIHx8IHdhbGtOb2RlLm5hbWVzcGFjZVVSSSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiKSB7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyh3YWxrTm9kZSwgT2JqZWN0LmtleXMoc3R5bGVQcm9wcykpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBBTlkgc3BlY2lmaWVkIHN0eWxlIHByb3BlcnR5IG1hdGNoZXMgdGhlIGNyaXRlcmlhIChPUiBsb2dpYylcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGVQcm9wIGluIHN0eWxlUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBzdHlsZXNbc3R5bGVQcm9wXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByb3BlcnR5IG5vdCBkZWZpbmVkIG9uIHRoaXMgZWxlbWVudCwgdHJ5IG5leHQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSAhaW1wb3J0YW50IHN1ZmZpeCBmb3IgY29tcGFyaXNvblxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZhbHVlIHNob3VsZCBiZSBleGNsdWRlZFxuICAgICAgICAgICAgICAgIGlmIChleGNsdWRlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZhbHVlIG1hdGNoZXMgdGhlIGNyaXRlcmlhXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRWYWx1ZXMgPSBzdHlsZVByb3BzW3N0eWxlUHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkVmFsdWVzLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQW55IHZhbHVlIGlzIGFjY2VwdGFibGUgKGp1c3QgY2hlY2tpbmcgZXhpc3RlbmNlKVxuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgY2FjaGVLZXksIHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0ZWRWYWx1ZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFZhbHVlIG1hdGNoZXMgb25lIG9mIHRoZSBhY2NlcHRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIGNhY2hlS2V5LCB3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBObyBtYXRjaGluZyBlbGVtZW50IG9yIGFuY2VzdG9yIGZvdW5kIC0gY2FjaGUgdGhpcyByZXN1bHQgdG8gYXZvaWQgcmUtc2VhcmNoaW5nXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBjYWNoZUtleSwgXCJOT1RfRk9VTkRcIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBhbiBhcnJheSBbdmFsdWUsIFVuaXRdIGZyb20gYSB2YWx1ZS11bml0IGNvbWJvIHN0cmluZ1xuICAgICAqIEBwYXJhbSB2YWx1ZVVuaXRDb21ibywgc3VjaCBhcyAyMHB4LCAycmVtIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VmFsdWVVbml0UGFpcih2YWx1ZVVuaXRDb21ibykge1xuICAgICAgICBpZiAoIXZhbHVlVW5pdENvbWJvKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZVVuaXRDb21ibykpIHJldHVybiBbXCJweFwiLCB2YWx1ZVVuaXRDb21ib107XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUludCh2YWx1ZVVuaXRDb21ibyk7XG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHZhbHVlVW5pdENvbWJvID0gdmFsdWVVbml0Q29tYm8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBtYXRjaCA9IHZhbHVlVW5pdENvbWJvLnRyaW0oKS5tYXRjaCgvKFthLXpdKykkLyk7XG4gICAgICAgIGxldCB1bml0ID0gJ3B4JztcbiAgICAgICAgaWYgKG1hdGNoKSB1bml0ID0gbWF0Y2hbMV07XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gW3VuaXQsIHZhbHVlXTtcbiAgICB9XG5cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlRG9jdW1lbnQgZXh0ZW5kcyBEb2N1bWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cblxuZXhwb3J0IGNsYXNzIENhY2hlVXRpbCB7XG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZ2xvYmFsIHZhcmlhYmxlXG4gICAgICAgICAqIHdpdGggaXRzIGluaXRpYWwgdmFsdWUgYXMgZ2l2ZW4gKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENhY2hlKGNhY2hlU3BvdDogRWxlbWVudCB8IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwga2V5TmFtZSwgaW5pdFZhbHVlKSB7XG4gICAgICAgIGlmICghY2FjaGVTcG90KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY2FjaGVPYmogPSAoY2FjaGVTcG90Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLyB8fCBjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLykgPyBjYWNoZVNwb3QgYXMgQ2FjaGVEb2N1bWVudCA6IGNhY2hlU3BvdCBhcyBDYWNoZUVsZW1lbnQ7XG4gICAgICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjYWNoZU9iai5hY2VDYWNoZSA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID0gaW5pdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Q2FjaGUoY2FjaGVTcG90OiBEb2N1bWVudCB8IEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgU2hhZG93Um9vdCwgZ2xvYmFsTmFtZSwgdmFsdWUpOiBhbnkge1xuICAgICAgICBpZiAoIWNhY2hlU3BvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgICAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2dsb2JhbE5hbWVdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFNldENhY2hlKGNhY2hlU3BvdDogRWxlbWVudCB8IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwga2V5TmFtZSwgaW5pdEZ1bmM6ICgpID0+IGFueSkge1xuICAgICAgICBpZiAoIWNhY2hlU3BvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgICAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGVba2V5TmFtZV0gPSBpbml0RnVuYygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJDYWNoZXMoY2FjaGVSb290OiBOb2RlKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IG51bU5vZGVzVmlzaXRlZCA9IDA7XG4gICAgICAgIGRlbGV0ZSAoY2FjaGVSb290Lm93bmVyRG9jdW1lbnQgYXMgQ2FjaGVEb2N1bWVudCkuYWNlQ2FjaGU7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoY2FjaGVSb290LCBmYWxzZSwgY2FjaGVSb290LCB0cnVlKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgKytudW1Ob2Rlc1Zpc2l0ZWQ7XG4gICAgICAgICAgICBkZWxldGUgKG53Lm5vZGUgYXMgQ2FjaGVFbGVtZW50KS5hY2VDYWNoZTtcbiAgICAgICAgICAgIG53Lm5vZGUub3duZXJEb2N1bWVudCAmJiBkZWxldGUgKG53Lm5vZGUub3duZXJEb2N1bWVudCBhcyBDYWNoZURvY3VtZW50KS5hY2VDYWNoZTtcbiAgICAgICAgfSB3aGlsZSAobncubmV4dE5vZGUoKSk7XG4gICAgICAgIGlmIChjYWNoZVJvb3QgIT09IGNhY2hlUm9vdC5vd25lckRvY3VtZW50Py5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSB3YWxrZXIgYXQgdGhlIGRvY3VtZW50RWxlbWVudCBvZiBjYWNoZVJvb3QncyBpbW1lZGlhdGUgZG9jdW1lbnQuXG4gICAgICAgICAgICAvLyBvd25lckRvY3VtZW50IGlzIGd1YXJhbnRlZWQgbm9uLW51bGwgaGVyZSBiZWNhdXNlIHRoZSBpZi1ndWFyZCBhYm92ZVxuICAgICAgICAgICAgLy8gY2hlY2tzIGNhY2hlUm9vdC5vd25lckRvY3VtZW50Py5kb2N1bWVudEVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgbndEb2MgPSBuZXcgRE9NV2Fsa2VyKGNhY2hlUm9vdC5vd25lckRvY3VtZW50IS5kb2N1bWVudEVsZW1lbnQsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICAgICAgLy8gY2FjaGVSb290IG1heSBiZSBpbnNpZGUgYSBzaGFkb3cgcm9vdCBvciBhbiBpZnJhbWUsIHdoaWNoIGFyZSB0aGVtc2VsdmVzXG4gICAgICAgICAgICAvLyBuZXN0ZWQgaW5zaWRlIGFuY2VzdG9yIGRvY3VtZW50cy4gV2FsayB1cCBmcm9tIGNhY2hlUm9vdCBhY3Jvc3MgYW55XG4gICAgICAgICAgICAvLyBmcmFtZS9zaGFkb3cgYm91bmRhcmllcyAoRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQgaGFuZGxlcyBvd25lckVsZW1lbnRcbiAgICAgICAgICAgIC8vIGxpbmtzIHNldCBieSB0aGUgd2Fsa2VyKSB0byBmaW5kIHRoZSBvdXRlcm1vc3QgYW5jZXN0b3IgZWxlbWVudCwgdGhlblxuICAgICAgICAgICAgLy8gcmVwb3NpdGlvbiB0aGUgd2Fsa2VyIHRoZXJlIHNvIHRoZSBzZWNvbmQgcGFzcyBjb3ZlcnMgZXZlcnkgY29udGFpbmluZ1xuICAgICAgICAgICAgLy8gZG9jdW1lbnQgYXMgd2VsbC5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVtcEVsZW06IEVsZW1lbnQgPSBud0RvYy5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEVsZW06IEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnRFbGVtID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQodGVtcEVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBFbGVtID0gcGFyZW50RWxlbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbndEb2Mubm9kZSA9IHRlbXBFbGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIC8vIE9uIHRoZSBzdGFydC10YWcgdmlzaXQgb2YgY2FjaGVSb290LCBza2lwIGl0cyBlbnRpcmUgc3VidHJlZSDigJRcbiAgICAgICAgICAgICAgICAvLyBpdCB3YXMgYWxyZWFkeSBjbGVhcmVkIGFuZCBjb3VudGVkIGluIHRoZSBmaXJzdCBwYXNzIGFib3ZlLlxuICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgYkVuZFRhZz10cnVlIG1ha2VzIHRoZSBuZXh0IG5leHROb2RlKCkgY2FsbCBlbWl0IGNhY2hlUm9vdCdzXG4gICAgICAgICAgICAgICAgLy8gZW5kLXRhZyBhbmQgdGhlbiBhZHZhbmNlIHRvIGl0cyBuZXh0IHNpYmxpbmcgd2l0aG91dCBkZXNjZW5kaW5nIGludG9cbiAgICAgICAgICAgICAgICAvLyBpdHMgY2hpbGRyZW4uXG4gICAgICAgICAgICAgICAgaWYgKCFud0RvYy5iRW5kVGFnICYmIERPTVV0aWwuc2FtZU5vZGUoY2FjaGVSb290LCBud0RvYy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBud0RvYy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSAobndEb2Mubm9kZSBhcyBhbnkpLmFjZUNhY2hlO1xuICAgICAgICAgICAgICAgIG53RG9jLm5vZGUub3duZXJEb2N1bWVudCAmJiBkZWxldGUgKG53RG9jLm5vZGUub3duZXJEb2N1bWVudCBhcyBhbnkpLmFjZUNhY2hlO1xuICAgICAgICAgICAgfSB3aGlsZSAobndEb2MubmV4dE5vZGUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVtTm9kZXNWaXNpdGVkO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4vQ1NTVXRpbFwiO1xuXG5leHBvcnQgY2xhc3MgQ2xpcFBhdGhVdGlsIHtcbiAgICBcbiAgICBwcml2YXRlIHN0YXRpYyBUSFJFU0hPTEQgOiBudW1iZXIgPSA1OyAgLy8gNXB4XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgdGhlIG5vZGUgdGhhdCBpcyB2aXN1YWxseSBoaWRkZW4gYnkgY3NzIGNsaXAtcGF0aDpcbiAgICAgKlxuICAgICAqIE5vdGUgMTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgdmlzdWFsbHkgaGlkZGVuIHRoZW4gdGhpc1xuICAgICAqICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRydWUgKG5vZGUgaXMgbm90IHZpc3VhbGx5IGhpZGRlbikuXG4gICAgICpcbiAgICAgKiBOb3RlIDI6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgY2xpcC1wYXRoLCB0aGUgY29udGVudCBpcyBub3QgY29uc2lkZXJlZCBoaWRkZW4gdG8gYW4gQVQuIFRleHQgaGlkZGVuIHdpdGggdGhlc2UgbWV0aG9kcyBcbiAgICAgKiAgICAgIGNhbiBzdGlsbCBiZSByZWVkYWJsZSBieSBzY3JlZW4gcmVhZGVycy4gXG4gICAgICogTm90ZSAzOiBpZiBhIGxpbmssIGZvcm0gY29udHJvbCwgb3Igb3RoZXIgZm9jdXNhYmxlIGVsZW1lbnQgaXMgZ2l2ZW4gdGhpcyBzdHlsZSwgdGhlIGVsZW1lbnQgd291bGQgYmUgZm9jdXNhYmxlIGJ1dCBub3QgdmlzaWJsZSwgXG4gICAgICogICAgICBrZXlib2FyZCB1c2VycyBtaWdodCBiZSBjb25mdXNlZC4gICAgXG4gICAgICogXG4gICAgICogQHBhcm0ge05vZGV9IG5vZGUgVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaWYgaXQgaXMgdmlzdWFsbHkgaGlkZGVuIG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIHRoZSBub2RlIGlzIHZpc3VhbGx5IGhpZGRlbiwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgVmlzVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlVmlzdWFsbHlIaWRkZW5CeUNsaXBQYXRoKG5vZGU6IE5vZGUpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBsZXQgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBoaWRkZW4gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoaGlkZGVuICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gaGlkZGVuO1xuICAgICAgICAgICAgXG4gICAgICAgIGNvbnN0IHN0eWxlID0gQ1NTVXRpbC5nZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KHN0eWxlLndpZHRoKTsgIC8vYWx3YXlzIGluIHB4XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHBhcnNlSW50KHN0eWxlLmhlaWdodCk7IC8vYWx3YXlzIGluIHB4XG5cbiAgICAgICAgbGV0IHBhdGggPSBzdHlsZVsnY2xpcC1wYXRoJ107IFxuICAgICAgICBpZiAoIXBhdGggfHwgcGF0aC50cmltKCkgPT09ICdub25lJyB8fCBwYXRoLnRyaW0oKSA9PT0gJycpICB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHBhdGggPSBwYXRoLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcgJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBpbmRleCA9IHBhdGguaW5kZXhPZihcImluc2V0KFwiKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgeyBcbiAgICAgICAgICAgIGxldCByb3VuZF9pbmRleCA9IHBhdGguaW5kZXhPZihcInJvdW5kXCIpO1xuICAgICAgICAgICAgbGV0IHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBpZiAocm91bmRfaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcm91bmRfaW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgLy8gV2hlbiBvbmUgdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCBhcHBsaWVzIHRoZSBzYW1lIGluc2V0IHRvIGFsbCBmb3VyIHNpZGVzXG4gICAgICAgICAgICBpZiAobnVtYmVycy5sZW5ndGggPT09IDEpICB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gQ2xpcFBhdGhVdGlsLmlzQ2xpcHBlZEJ5SW5zZXQoZWxlbSwgbnVtYmVyc1swXSwgbnVtYmVyc1swXSwgbnVtYmVyc1swXSwgbnVtYmVyc1swXSk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgcmV0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXaGVuIHR3byB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIGZpcnN0IHZhbHVlIGFwcGxpZXMgdG8gdGhlIHRvcCBhbmQgYm90dG9tLCB0aGUgc2Vjb25kIHRvIHRoZSBsZWZ0IGFuZCByaWdodC5cbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA9PT0gMikgeyBcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBDbGlwUGF0aFV0aWwuaXNDbGlwcGVkQnlJbnNldChlbGVtLCBudW1iZXJzWzBdLCBudW1iZXJzWzFdLCBudW1iZXJzWzBdLCBudW1iZXJzWzFdKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdoZW4gdGhyZWUgdmFsdWVzIGFyZSBzcGVjaWZpZWQsIHRoZSBmaXJzdCBhcHBsaWVzIHRvIHRoZSB0b3AsIHRoZSBzZWNvbmQgdG8gdGhlIHJpZ2h0IGFuZCBsZWZ0LCB0aGUgdGhpcmQgdG8gdGhlIGJvdHRvbS5cbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IENsaXBQYXRoVXRpbC5pc0NsaXBwZWRCeUluc2V0KGVsZW0sIG51bWJlcnNbMF0sIG51bWJlcnNbMV0sIG51bWJlcnNbMV0sIG51bWJlcnNbMl0pOyBcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7IFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXaGVuIGZvdXIgdmFsdWVzIGFyZSBzcGVjaWZpZWQsIHRoZSB2YWx1ZXMgYXBwbHkgdG8gdGhlIHRvcCwgcmlnaHQsIGJvdHRvbSwgYW5kIGxlZnQgaW4gdGhhdCBvcmRlciAoY2xvY2t3aXNlKS5cbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IENsaXBQYXRoVXRpbC5pc0NsaXBwZWRCeUluc2V0KGVsZW0sIG51bWJlcnNbMF0sIG51bWJlcnNbMV0sIG51bWJlcnNbMl0sIG51bWJlcnNbM10pOyBcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9ICAgICBcblxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpbmRleCA9IHBhdGguaW5kZXhPZihcInJlY3QoXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgcm91bmRfaW5kZXggPSBwYXRoLmluZGV4T2YoXCJyb3VuZFwiKTtcbiAgICAgICAgICAgIGxldCBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgaWYgKHJvdW5kX2luZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHJvdW5kX2luZGV4KTtcblxuICAgICAgICAgICAgbGV0IG51bWJlcnMgPSBzdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgZmlyc3QgKHRvcCkgYW5kIHRoaXJkIChib3R0b20pIHZhbHVlcyBhcmUgZGlzdGFuY2VzIGZyb20gdGhlIHRvcCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrLCBcbiAgICAgICAgICAgICAqIGFuZCB0aGUgc2Vjb25kIChyaWdodCkgYW5kIGZvdXJ0aCAobGVmdCkgdmFsdWVzIGFyZSBkaXN0YW5jZXMgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrLiBcbiAgICAgICAgICAgICAqIFRoZSBzZWNvbmQgKHJpZ2h0KSBhbmQgdGhpcmQgKGJvdHRvbSkgdmFsdWVzIGFyZSBjbGFtcGVkIGJ5IHRoZSBmb3VydGggKGxlZnQpIGFuZCBmaXJzdCAodG9wKSB2YWx1ZXMsIHJlc3BlY3RpdmVseSwgXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogSWYgYXV0byBpcyB1c2VkIGZvciB0aGUgZmlyc3QgKHRvcCkgb3IgZm91cnRoIChsZWZ0KSB2YWx1ZSwgdGhlIHZhbHVlIG9mIGF1dG8gaXMgMCwgXG4gICAgICAgICAgICAgKiBhbmQgaWYgdXNlZCBmb3IgdGhlIHNlY29uZCAocmlnaHQpIG9yIHRoaXJkIChib3R0b20pIHZhbHVlLCB0aGUgdmFsdWUgb2YgYXV0byBpcyAxMDAlLlxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdPT09J2F1dG8nKSBudW1iZXJzWzBdID0gJzBweCc7XG4gICAgICAgICAgICBpZiAobnVtYmVyc1szXT09PSdhdXRvJykgbnVtYmVyc1szXSA9ICcwcHgnO1xuICAgICAgICAgICAgaWYgKG51bWJlcnNbMV09PT0nYXV0bycpIG51bWJlcnNbMV0gPSAnMTAwJSc7XG4gICAgICAgICAgICBpZiAobnVtYmVyc1syXT09PSdhdXRvJykgbnVtYmVyc1syXSA9ICcxMDAlJztcblxuICAgICAgICAgICAgLy8gdG8gcHJldmVudCB0aGUgYm90dG9tIGVkZ2UgZnJvbSBjcm9zc2luZyBvdmVyIHRoZSB0b3AgZWRnZSBhbmQgcmlnaHQgZWRnZSBmcm9tIGNyb3NzaW5nIG92ZXIgdGhlIGxlZnQgZWRnZS4gXG4gICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgcmVjdCgxMHB4IDAgMCAyMHB4KSBpcyBjbGFtcGVkIHRvIHJlY3QoMTBweCAyMHB4IDEwcHggMjBweClcbiAgICAgICAgICAgIG51bWJlcnNbMl0gPSBNYXRoLm1heChudW1iZXJzWzBdLCBudW1iZXJzWzJdKTtcbiAgICAgICAgICAgIG51bWJlcnNbMV0gPSBNYXRoLm1heChudW1iZXJzWzFdLCBudW1iZXJzWzNdKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgdG9wID0gcGFyc2VJbnQobnVtYmVyc1swXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4odG9wKSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICB0b3AgPSB0b3AgKiBoZWlnaHQvMTAwO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIodG9wKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRvcCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAodG9wID49IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gcGFyc2VJbnQobnVtYmVyc1szXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4obGVmdCkpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobnVtYmVyc1szXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQgKiB3aWR0aC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihsZWZ0KTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxlZnQgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGVmdCA+PSB3aWR0aCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCByaWdodCA9IHBhcnNlSW50KG51bWJlcnNbMV0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHJpZ2h0KSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzFdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0ICogd2lkdGgvMTAwO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmlnaHQpO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmlnaHQgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBib3R0b20gPSBwYXJzZUludChudW1iZXJzWzJdKTtcbiAgICAgICAgICAgIGlmIChpc05hTihib3R0b20pKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMl0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIGJvdHRvbSA9IGJvdHRvbSAqIGhlaWdodC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihib3R0b20pO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm90dG9tID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoKGJvdHRvbSAtIHRvcCkgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCAgfHwgKHJpZ2h0IC0gbGVmdCkgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4T2YoXCJ4eXdoKFwiKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGV0IHJvdW5kX2luZGV4ID0gcGF0aC5pbmRleE9mKFwicm91bmRcIik7XG4gICAgICAgICAgICBsZXQgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCBwYXRoLmluZGV4T2YoXCIpXCIpKTtcbiAgICAgICAgICAgIGlmIChyb3VuZF9pbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCByb3VuZF9pbmRleCk7XG5cbiAgICAgICAgICAgIGxldCBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG5cbiAgICAgICAgICAgIGxldCB4ID0gcGFyc2VJbnQobnVtYmVyc1swXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4oeCkpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtYmVyc1swXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgeCA9IHggKiB3aWR0aC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih0b3ApO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh4ID49IHdpZHRoKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHkgPSBwYXJzZUludChudW1iZXJzWzFdKTtcbiAgICAgICAgICAgIGlmIChpc05hTih5KSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzFdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICB5ID0geSAqIGhlaWdodC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih5KTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNjcm9sbFkgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeSA+PSBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdyA9IHBhcnNlSW50KG51bWJlcnNbMl0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHcpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMl0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIHcgPSB3ICogd2lkdGgvMTAwO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIodyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3ID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHcgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgaCA9IHBhcnNlSW50KG51bWJlcnNbM10pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKGgpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbM10uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIGggPSBoICogaGVpZ2h0LzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGgpO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGggPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKFwiY2lyY2xlKFwiKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGV0IHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBsZXQgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgcmFkaXVzID0gcGFyc2VJbnQobnVtYmVyc1swXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4ocmFkaXVzKSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBzaG9ydCA9IHdpZHRoID4gaGVpZ2h0ID8gaGVpZ2h0IDogd2lkdGg7XG4gICAgICAgICAgICAgICAgcmFkaXVzID0gcmFkaXVzICogc2hvcnQvMTAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHJhZGl1cyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByYWRpdXMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyYWRpdXMgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICBcbiAgICAgICAgfSAgICBcbiAgICAgICAgXG4gICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKFwiZWxsaXBzZShcIik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgbGV0IG51bWJlcnMgPSBzdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcblxuICAgICAgICAgICAgLy8gZWxsaXBzZShjbG9zZXN0LXNpZGUgZmFydGhlc3Qtc2lkZSBhdCAzMCUgNDAlKTtcbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA+IDMgJiYgbnVtYmVyc1swXSA9PT0gJ2Nsb3Nlc3Qtc2lkZScgJiYgbnVtYmVyc1sxXSA9PT0gJ2ZhcnRoZXN0LXNpZGUnICYmIG51bWJlcnNbMl0gPT09ICdhdCcpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmFkaXVzID0gcGFyc2VJbnQobnVtYmVyc1szXSk7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXJzWzNdLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gd2lkdGggPiBoZWlnaHQgPyBoZWlnaHQgOiB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IHJhZGl1cyAqIHZhbHVlLzEwMDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmFkaXVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByYWRpdXMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGl1cyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlcnMubGVuZ3RoID09PSA1KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MzsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByYWRpdXMgPSBwYXJzZUludChudW1iZXJzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXJzW2ldLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IChpID09PSAzKSA/IHdpZHRoIDogaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IHJhZGl1cyAqIHZhbHVlLzEwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihyYWRpdXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGl1cyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfSAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZWxsaXBzZSg0MCUgNTAlIGF0IGxlZnQpO1xuICAgICAgICAgICAgbGV0IGF0X2luZGV4ID0gcGF0aC5pbmRleE9mKFwiYXRcIik7XG4gICAgICAgICAgICBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgaWYgKGF0X2luZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIGF0X2luZGV4KTtcblxuICAgICAgICAgICAgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByYWRpdXMgPSBwYXJzZUludChudW1iZXJzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyc1tpXS5lbmRzV2l0aChcIiVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gKGkgPT09IDApID8gd2lkdGggOiBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IHJhZGl1cyAqIHZhbHVlLzEwMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHJhZGl1cyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJhZGl1cyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcbiAgICAgICAgICAgXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCA9IHBhdGguaW5kZXhPZihcInBvbHlnb24oXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCBwYXRoLmluZGV4T2YoXCIpXCIpKTtcbiAgICAgICAgICAgIGxldCBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIHBvbHlnb24obm9uemVyb3xldmVub2RkLCAwJSAwJSwgNTAlIDUwJSwgMCUgMTAwJSlcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdID09PSAnbm9uemVybycgfHwgbnVtYmVyc1swXSA9PT0gJ2V2ZW5vZGQnKVxuICAgICAgICAgICAgICAgIG51bWJlcnMuc2hpZnQoKTtcblxuICAgICAgICAgICAgbGV0IHkgPSAwO1xuICAgICAgICAgICAgbGV0IHggPSAwO1xuICAgICAgICAgICAgbGV0IGNoYW5nZWRfeCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGNoYW5nZWRfeSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjb29yZGluYXRlcyA9IG51bWJlcnNbaV0udHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXMubGVuZ3RoICE9IDIgKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBjb29yZGluYXRlX3h5ID0gWzAsIDBdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPTA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gcGFyc2VJbnQoY29vcmRpbmF0ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzW2ldLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVfeHlbaV0gPSAoaSA9PT0gMCkgPyB2YWx1ZSAqIHdpZHRoLzEwMCA6IHZhbHVlICogaGVpZ2h0LzEwMDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGNvb3JkaW5hdGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFpcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZV94eVtpXSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB4ID0gY29vcmRpbmF0ZV94eVswXTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IGNvb3JkaW5hdGVfeHlbMV07XG4gICAgICAgICAgICAgICAgfSBcblxuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhjb29yZGluYXRlX3h5WzBdIC0geCkgPj0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkgXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRfeCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGNvb3JkaW5hdGVfeHlbMV0gLSB5KSA+PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSBcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZF95ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGFuZ2VkX3ggJiYgY2hhbmdlZF95KSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gIFxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAgICAgIFxuXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzQ2xpcHBlZEJ5SW5zZXQoZWxlbSwgdG9wLCByaWdodCA9ICcwcHgnLCBib3R0b20gPSAnMHB4JywgbGVmdCA9ICcwcHgnKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gQ1NTVXRpbC5nZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KHN0eWxlLndpZHRoKTsgIC8vYWx3YXlzIGluIHB4XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHBhcnNlSW50KHN0eWxlLmhlaWdodCk7IC8vYWx3YXlzIGluIHB4XG4gICAgICAgIFxuICAgICAgICAvLyB0b3BcbiAgICAgICAgbGV0IHRvcF92YWx1ZSA9IHBhcnNlSW50KHRvcCk7XG4gICAgICAgIGlmIChpc05hTih0b3BfdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRvcC5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICB0b3BfdmFsdWUgPSB0b3BfdmFsdWUgKiBoZWlnaHQvMTAwO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIodG9wKTtcbiAgICAgICAgICAgIGlmICghcGFpcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdG9wX3ZhbHVlID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pbnNldCBvdXRzaWRlIG9mIHRoZSBjb250YWluZXJcbiAgICAgICAgaWYgKHRvcF92YWx1ZSA+IGhlaWdodCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIHJpZ2h0XG4gICAgICAgIGxldCByaWdodF92YWx1ZSA9IHBhcnNlSW50KHJpZ2h0KTtcbiAgICAgICAgaWYgKGlzTmFOKHJpZ2h0X3ZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmIChyaWdodC5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICByaWdodF92YWx1ZSA9IHJpZ2h0X3ZhbHVlICogd2lkdGgvMTAwO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmlnaHQpO1xuICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByaWdodF92YWx1ZSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvL2luc2V0IG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICBpZiAocmlnaHRfdmFsdWUgPiB3aWR0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIGJvdHRvbVxuICAgICAgICBsZXQgYm90dG9tX3ZhbHVlID0gcGFyc2VJbnQoYm90dG9tKTtcbiAgICAgICAgaWYgKGlzTmFOKGJvdHRvbV92YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoYm90dG9tLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgIGJvdHRvbV92YWx1ZSA9IGJvdHRvbV92YWx1ZSAqIGhlaWdodC8xMDA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihib3R0b20pO1xuICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBib3R0b21fdmFsdWUgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9pbnNldCBvdXRzaWRlIG9mIHRoZSBjb250YWluZXJcbiAgICAgICAgaWYgKGJvdHRvbV92YWx1ZSA+IGhlaWdodCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIGxlZnRcbiAgICAgICAgbGV0IGxlZnRfdmFsdWUgPSBwYXJzZUludChsZWZ0KTtcbiAgICAgICAgaWYgKGlzTmFOKGxlZnRfdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKGxlZnQuZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgbGVmdF92YWx1ZSA9IGxlZnRfdmFsdWUgKiB3aWR0aC8xMDA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihsZWZ0KTtcbiAgICAgICAgICAgIGlmICghcGFpcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGVmdF92YWx1ZSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvL2luc2V0IG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICBpZiAobGVmdF92YWx1ZSA+IHdpZHRoKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKGhlaWdodCAtICh0b3BfdmFsdWUgKyBib3R0b21fdmFsdWUpIDw9IENsaXBQYXRoVXRpbC5USFJFU0hPTEQgIHx8IHdpZHRoIC0gKHJpZ2h0X3ZhbHVlICsgbGVmdF92YWx1ZSkgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY2xhc3MgQ29sb3JVdGlsIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgQ1NTQ29sb3JMb29rdXAgPSB7XG4gICAgICAgIFwiYWxpY2VibHVlXCI6IFwiI2YwZjhmZlwiLFxuICAgICAgICBcImFudGlxdWV3aGl0ZVwiOiBcIiNmYWViZDdcIixcbiAgICAgICAgXCJhcXVhXCI6IFwiIzAwZmZmZlwiLFxuICAgICAgICBcImFxdWFtYXJpbmVcIjogXCIjN2ZmZmQ0XCIsXG4gICAgICAgIFwiYXp1cmVcIjogXCIjZjBmZmZmXCIsXG4gICAgICAgIFwiYmVpZ2VcIjogXCIjZjVmNWRjXCIsXG4gICAgICAgIFwiYmlzcXVlXCI6IFwiI2ZmZTRjNFwiLFxuICAgICAgICBcImJsYWNrXCI6IFwiIzAwMDAwMFwiLFxuICAgICAgICBcImJsYW5jaGVkYWxtb25kXCI6IFwiI2ZmZWJjZFwiLFxuICAgICAgICBcImJsdWVcIjogXCIjMDAwMGZmXCIsXG4gICAgICAgIFwiYmx1ZXZpb2xldFwiOiBcIiM4YTJiZTJcIixcbiAgICAgICAgXCJicm93blwiOiBcIiNhNTJhMmFcIixcbiAgICAgICAgXCJidXJseXdvb2RcIjogXCIjZGViODg3XCIsXG4gICAgICAgIFwiY2FkZXRibHVlXCI6IFwiIzVmOWVhMFwiLFxuICAgICAgICBcImNoYXJ0cmV1c2VcIjogXCIjN2ZmZjAwXCIsXG4gICAgICAgIFwiY2hvY29sYXRlXCI6IFwiI2QyNjkxZVwiLFxuICAgICAgICBcImNvcmFsXCI6IFwiI2ZmN2Y1MFwiLFxuICAgICAgICBcImNvcm5mbG93ZXJibHVlXCI6IFwiIzY0OTVlZFwiLFxuICAgICAgICBcImNvcm5zaWxrXCI6IFwiI2ZmZjhkY1wiLFxuICAgICAgICBcImNyaW1zb25cIjogXCIjZGMxNDNjXCIsXG4gICAgICAgIFwiY3lhblwiOiBcIiMwMGZmZmZcIixcbiAgICAgICAgXCJkYXJrYmx1ZVwiOiBcIiMwMDAwOGJcIixcbiAgICAgICAgXCJkYXJrY3lhblwiOiBcIiMwMDhiOGJcIixcbiAgICAgICAgXCJkYXJrZ29sZGVucm9kXCI6IFwiI2I4ODYwYlwiLFxuICAgICAgICBcImRhcmtncmF5XCI6IFwiI2E5YTlhOVwiLFxuICAgICAgICBcImRhcmtncmVlblwiOiBcIiMwMDY0MDBcIixcbiAgICAgICAgXCJkYXJra2hha2lcIjogXCIjYmRiNzZiXCIsXG4gICAgICAgIFwiZGFya21hZ2VudGFcIjogXCIjOGIwMDhiXCIsXG4gICAgICAgIFwiZGFya29saXZlZ3JlZW5cIjogXCIjNTU2YjJmXCIsXG4gICAgICAgIFwiZGFya29yYW5nZVwiOiBcIiNmZjhjMDBcIixcbiAgICAgICAgXCJkYXJrb3JjaGlkXCI6IFwiIzk5MzJjY1wiLFxuICAgICAgICBcImRhcmtyZWRcIjogXCIjOGIwMDAwXCIsXG4gICAgICAgIFwiZGFya3NhbG1vblwiOiBcIiNlOTk2N2FcIixcbiAgICAgICAgXCJkYXJrc2VhZ3JlZW5cIjogXCIjOGZiYzhmXCIsXG4gICAgICAgIFwiZGFya3NsYXRlYmx1ZVwiOiBcIiM0ODNkOGJcIixcbiAgICAgICAgXCJkYXJrc2xhdGVncmF5XCI6IFwiIzJmNGY0ZlwiLFxuICAgICAgICBcImRhcmt0dXJxdW9pc2VcIjogXCIjMDBjZWQxXCIsXG4gICAgICAgIFwiZGFya3Zpb2xldFwiOiBcIiM5NDAwZDNcIixcbiAgICAgICAgXCJkZWVwcGlua1wiOiBcIiNmZjE0OTNcIixcbiAgICAgICAgXCJkZWVwc2t5Ymx1ZVwiOiBcIiMwMGJmZmZcIixcbiAgICAgICAgXCJkaW1ncmF5XCI6IFwiIzY5Njk2OVwiLFxuICAgICAgICBcImRvZGdlcmJsdWVcIjogXCIjMWU5MGZmXCIsXG4gICAgICAgIFwiZmlyZWJyaWNrXCI6IFwiI2IyMjIyMlwiLFxuICAgICAgICBcImZsb3JhbHdoaXRlXCI6IFwiI2ZmZmFmMFwiLFxuICAgICAgICBcImZvcmVzdGdyZWVuXCI6IFwiIzIyOGIyMlwiLFxuICAgICAgICBcImZ1Y2hzaWFcIjogXCIjZmYwMGZmXCIsXG4gICAgICAgIFwiZ2FpbnNib3JvXCI6IFwiI2RjZGNkY1wiLFxuICAgICAgICBcImdob3N0d2hpdGVcIjogXCIjZjhmOGZmXCIsXG4gICAgICAgIFwiZ29sZFwiOiBcIiNmZmQ3MDBcIixcbiAgICAgICAgXCJnb2xkZW5yb2RcIjogXCIjZGFhNTIwXCIsXG4gICAgICAgIFwiZ3JheVwiOiBcIiM4MDgwODBcIixcbiAgICAgICAgXCJncmVlblwiOiBcIiMwMDgwMDBcIixcbiAgICAgICAgXCJncmVlbnllbGxvd1wiOiBcIiNhZGZmMmZcIixcbiAgICAgICAgXCJob25leWRld1wiOiBcIiNmMGZmZjBcIixcbiAgICAgICAgXCJob3RwaW5rXCI6IFwiI2ZmNjliNFwiLFxuICAgICAgICBcImluZGlhbnJlZFwiOiBcIiNjZDVjNWNcIixcbiAgICAgICAgXCJpbmRpZ29cIjogXCIjNGIwMDgyXCIsXG4gICAgICAgIFwiaXZvcnlcIjogXCIjZmZmZmYwXCIsXG4gICAgICAgIFwia2hha2lcIjogXCIjZjBlNjhjXCIsXG4gICAgICAgIFwibGF2ZW5kZXJcIjogXCIjZTZlNmZhXCIsXG4gICAgICAgIFwibGF2ZW5kZXJibHVzaFwiOiBcIiNmZmYwZjVcIixcbiAgICAgICAgXCJsYXduZ3JlZW5cIjogXCIjN2NmYzAwXCIsXG4gICAgICAgIFwibGVtb25jaGlmZm9uXCI6IFwiI2ZmZmFjZFwiLFxuICAgICAgICBcImxpZ2h0Ymx1ZVwiOiBcIiNhZGQ4ZTZcIixcbiAgICAgICAgXCJsaWdodGNvcmFsXCI6IFwiI2YwODA4MFwiLFxuICAgICAgICBcImxpZ2h0Y3lhblwiOiBcIiNlMGZmZmZcIixcbiAgICAgICAgXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBcIiNmYWZhZDJcIixcbiAgICAgICAgXCJsaWdodGdyZXlcIjogXCIjZDNkM2QzXCIsXG4gICAgICAgIFwibGlnaHRncmVlblwiOiBcIiM5MGVlOTBcIixcbiAgICAgICAgXCJsaWdodHBpbmtcIjogXCIjZmZiNmMxXCIsXG4gICAgICAgIFwibGlnaHRzYWxtb25cIjogXCIjZmZhMDdhXCIsXG4gICAgICAgIFwibGlnaHRzZWFncmVlblwiOiBcIiMyMGIyYWFcIixcbiAgICAgICAgXCJsaWdodHNreWJsdWVcIjogXCIjODdjZWZhXCIsXG4gICAgICAgIFwibGlnaHRzbGF0ZWdyYXlcIjogXCIjNzc4ODk5XCIsXG4gICAgICAgIFwibGlnaHRzdGVlbGJsdWVcIjogXCIjYjBjNGRlXCIsXG4gICAgICAgIFwibGlnaHR5ZWxsb3dcIjogXCIjZmZmZmUwXCIsXG4gICAgICAgIFwibGltZVwiOiBcIiMwMGZmMDBcIixcbiAgICAgICAgXCJsaW1lZ3JlZW5cIjogXCIjMzJjZDMyXCIsXG4gICAgICAgIFwibGluZW5cIjogXCIjZmFmMGU2XCIsXG4gICAgICAgIFwibWFnZW50YVwiOiBcIiNmZjAwZmZcIixcbiAgICAgICAgXCJtYXJvb25cIjogXCIjODAwMDAwXCIsXG4gICAgICAgIFwibWVkaXVtYXF1YW1hcmluZVwiOiBcIiM2NmNkYWFcIixcbiAgICAgICAgXCJtZWRpdW1ibHVlXCI6IFwiIzAwMDBjZFwiLFxuICAgICAgICBcIm1lZGl1bW9yY2hpZFwiOiBcIiNiYTU1ZDNcIixcbiAgICAgICAgXCJtZWRpdW1wdXJwbGVcIjogXCIjOTM3MGQ4XCIsXG4gICAgICAgIFwibWVkaXVtc2VhZ3JlZW5cIjogXCIjM2NiMzcxXCIsXG4gICAgICAgIFwibWVkaXVtc2xhdGVibHVlXCI6IFwiIzdiNjhlZVwiLFxuICAgICAgICBcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFwiIzAwZmE5YVwiLFxuICAgICAgICBcIm1lZGl1bXR1cnF1b2lzZVwiOiBcIiM0OGQxY2NcIixcbiAgICAgICAgXCJtZWRpdW12aW9sZXRyZWRcIjogXCIjYzcxNTg1XCIsXG4gICAgICAgIFwibWlkbmlnaHRibHVlXCI6IFwiIzE5MTk3MFwiLFxuICAgICAgICBcIm1pbnRjcmVhbVwiOiBcIiNmNWZmZmFcIixcbiAgICAgICAgXCJtaXN0eXJvc2VcIjogXCIjZmZlNGUxXCIsXG4gICAgICAgIFwibW9jY2FzaW5cIjogXCIjZmZlNGI1XCIsXG4gICAgICAgIFwibmF2YWpvd2hpdGVcIjogXCIjZmZkZWFkXCIsXG4gICAgICAgIFwibmF2eVwiOiBcIiMwMDAwODBcIixcbiAgICAgICAgXCJvbGRsYWNlXCI6IFwiI2ZkZjVlNlwiLFxuICAgICAgICBcIm9saXZlXCI6IFwiIzgwODAwMFwiLFxuICAgICAgICBcIm9saXZlZHJhYlwiOiBcIiM2YjhlMjNcIixcbiAgICAgICAgXCJvcmFuZ2VcIjogXCIjZmZhNTAwXCIsXG4gICAgICAgIFwib3JhbmdlcmVkXCI6IFwiI2ZmNDUwMFwiLFxuICAgICAgICBcIm9yY2hpZFwiOiBcIiNkYTcwZDZcIixcbiAgICAgICAgXCJwYWxlZ29sZGVucm9kXCI6IFwiI2VlZThhYVwiLFxuICAgICAgICBcInBhbGVncmVlblwiOiBcIiM5OGZiOThcIixcbiAgICAgICAgXCJwYWxldHVycXVvaXNlXCI6IFwiI2FmZWVlZVwiLFxuICAgICAgICBcInBhbGV2aW9sZXRyZWRcIjogXCIjZDg3MDkzXCIsXG4gICAgICAgIFwicGFwYXlhd2hpcFwiOiBcIiNmZmVmZDVcIixcbiAgICAgICAgXCJwZWFjaHB1ZmZcIjogXCIjZmZkYWI5XCIsXG4gICAgICAgIFwicGVydVwiOiBcIiNjZDg1M2ZcIixcbiAgICAgICAgXCJwaW5rXCI6IFwiI2ZmYzBjYlwiLFxuICAgICAgICBcInBsdW1cIjogXCIjZGRhMGRkXCIsXG4gICAgICAgIFwicG93ZGVyYmx1ZVwiOiBcIiNiMGUwZTZcIixcbiAgICAgICAgXCJwdXJwbGVcIjogXCIjODAwMDgwXCIsXG4gICAgICAgIFwicmVkXCI6IFwiI2ZmMDAwMFwiLFxuICAgICAgICBcInJvc3licm93blwiOiBcIiNiYzhmOGZcIixcbiAgICAgICAgXCJyb3lhbGJsdWVcIjogXCIjNDE2OWUxXCIsXG4gICAgICAgIFwic2FkZGxlYnJvd25cIjogXCIjOGI0NTEzXCIsXG4gICAgICAgIFwic2FsbW9uXCI6IFwiI2ZhODA3MlwiLFxuICAgICAgICBcInNhbmR5YnJvd25cIjogXCIjZjRhNDYwXCIsXG4gICAgICAgIFwic2VhZ3JlZW5cIjogXCIjMmU4YjU3XCIsXG4gICAgICAgIFwic2Vhc2hlbGxcIjogXCIjZmZmNWVlXCIsXG4gICAgICAgIFwic2llbm5hXCI6IFwiI2EwNTIyZFwiLFxuICAgICAgICBcInNpbHZlclwiOiBcIiNjMGMwYzBcIixcbiAgICAgICAgXCJza3libHVlXCI6IFwiIzg3Y2VlYlwiLFxuICAgICAgICBcInNsYXRlYmx1ZVwiOiBcIiM2YTVhY2RcIixcbiAgICAgICAgXCJzbGF0ZWdyYXlcIjogXCIjNzA4MDkwXCIsXG4gICAgICAgIFwic25vd1wiOiBcIiNmZmZhZmFcIixcbiAgICAgICAgXCJzcHJpbmdncmVlblwiOiBcIiMwMGZmN2ZcIixcbiAgICAgICAgXCJzdGVlbGJsdWVcIjogXCIjNDY4MmI0XCIsXG4gICAgICAgIFwidGFuXCI6IFwiI2QyYjQ4Y1wiLFxuICAgICAgICBcInRlYWxcIjogXCIjMDA4MDgwXCIsXG4gICAgICAgIFwidGhpc3RsZVwiOiBcIiNkOGJmZDhcIixcbiAgICAgICAgXCJ0b21hdG9cIjogXCIjZmY2MzQ3XCIsXG4gICAgICAgIFwidHVycXVvaXNlXCI6IFwiIzQwZTBkMFwiLFxuICAgICAgICBcInZpb2xldFwiOiBcIiNlZTgyZWVcIixcbiAgICAgICAgXCJ3aGVhdFwiOiBcIiNmNWRlYjNcIixcbiAgICAgICAgXCJ3aGl0ZVwiOiBcIiNmZmZmZmZcIixcbiAgICAgICAgXCJ3aGl0ZXNtb2tlXCI6IFwiI2Y1ZjVmNVwiLFxuICAgICAgICBcInllbGxvd1wiOiBcIiNmZmZmMDBcIixcbiAgICAgICAgXCJ5ZWxsb3dncmVlblwiOiBcIiM5YWNkMzJcIixcbiAgICAgICAgXCJidXR0b250ZXh0XCI6IFwicmdiYSgwLCAwLCAwLCAwLjg0NylcIixcbiAgICAgICAgXCJidXR0b25mYWNlXCI6IFwiI2ZmZmZmZlwiLFxuICAgICAgICBcImdyYXl0ZXh0XCI6IFwicmdiYSgwLCAwLCAwLCAwLjI0NylcIlxuICAgIH1cblxuXG4gICAgLy8gUmV3cml0ZSB0aGUgY29sb3Igb2JqZWN0IHRvIGFjY291bnQgZm9yIGFscGhhXG4gICAgcHVibGljIHN0YXRpYyBDb2xvcihjc3NTdHlsZUNvbG9yKSB7XG4gICAgICAgIGlmICghY3NzU3R5bGVDb2xvcikgcmV0dXJuIG51bGw7XG4gICAgICAgIGNzc1N0eWxlQ29sb3IgPSBjc3NTdHlsZUNvbG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yID09PSBcInRyYW5zcGFyZW50XCIpIHJldHVybiBuZXcgQ29sb3JPYmooMjU1LCAyNTUsIDI1NSwgMCk7XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yIGluIENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cClcbiAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBDb2xvclV0aWwuQ1NTQ29sb3JMb29rdXBbY3NzU3R5bGVDb2xvcl07XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2IoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYlxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihtWzFdLCBtWzJdLCBtWzNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2JhKFwiKSkge1xuICAgICAgICAgICAgbGV0IHJnYlJlZ2V4ID0gL1xccypyZ2JhXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooLispXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjc3NTdHlsZUNvbG9yLmNoYXJBdCgwKSAhPSBcIiNcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGhyZWUtZGlnaXQgUkdCICgjcmdiKSBpcyBjb252ZXJ0ZWQgdG8gc2l4LWRpZ2l0IGZvcm0gKCNycmdnYmIpIGJ5IHJlcGxpY2F0aW5nIGRpZ2l0c1xuICAgICAgICAgICAgICAgIC8vIChodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWNvbG9yLTMvI3JnYi1jb2xvcilcbiAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gXCIjXCIgKyBjc3NTdHlsZUNvbG9yLmNoYXJBdCgxKS5yZXBlYXQoMikgK1xuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yLmNoYXJBdCgyKS5yZXBlYXQoMikgK1xuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yLmNoYXJBdCgzKS5yZXBlYXQoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdGhpc1JlZCA9IHBhcnNlSW50KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDEsIDMpLCAxNik7XG4gICAgICAgICAgICBsZXQgdGhpc0dyZWVuID0gcGFyc2VJbnQoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMywgNSksIDE2KTtcbiAgICAgICAgICAgIGxldCB0aGlzQmx1ZSA9IHBhcnNlSW50KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDUsIDcpLCAxNik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKHRoaXNSZWQsIHRoaXNHcmVlbiwgdGhpc0JsdWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vICAgIHJldHVybiBudWxsOyAvLyBVbnJlYWNoYWJsZVxuICAgIH07XG5cbiBwdWJsaWMgc3RhdGljIENvbG9yQ29tYm8ocnVsZUNvbnRleHQgOiBIVE1MRWxlbWVudCkge1xuICAgIHRyeSB7IFxuICAgICAgICB2YXIgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIGlmICghd2luKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhbmNlc3RvcnMgPSBbXTtcbiAgICAgICAgbGV0IHdhbGtOb2RlIDogRWxlbWVudCA9IHJ1bGVDb250ZXh0O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlVHlwZSA9PT0gMSkgXG4gICAgICAgICAgICAgICAgYW5jZXN0b3JzLnB1c2god2Fsa05vZGUpO1xuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHZhciByZXRWYWwgPSB7XG4gICAgICAgICAgICBcImhhc0dyYWRpZW50XCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJoYXNCR0ltYWdlXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJ0ZXh0U2hhZG93XCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJmZ1wiOiBudWxsLFxuICAgICAgICAgICAgXCJiZ1wiOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBzdGFydFxuICAgICAgICB2YXIgY1N0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICB2YXIgY29tcFN0eWxlQ29sb3IgPSBjU3R5bGUuY29sb3I7XG4gICAgICAgIGlmICghY29tcFN0eWxlQ29sb3IpXG4gICAgICAgICAgICBjb21wU3R5bGVDb2xvciA9IFwiYmxhY2tcIjtcbiAgICAgICAgdmFyIGZnID0gQ29sb3JVdGlsLkNvbG9yKGNvbXBTdHlsZUNvbG9yKTtcbiAgICAgICAgdmFyIHJlQ29sb3IgPSAvdHJhbnNwYXJlbnR8cmdiYT9cXChbXildK1xcKS9naTtcbiAgICAgICAgdmFyIGd1ZXNzR3JhZENvbG9yID0gZnVuY3Rpb24gKGdyYWRMaXN0LCBiZ0NvbG9yLCBmZ0NvbG9yKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgY29sb3IsIHJldHVybiB0aGF0XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBncmFkTGlzdC5sZW5ndGggPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBncmFkTGlzdDtcblxuICAgICAgICAgICAgICAgIHZhciBvdmVyYWxsV29yc3QgPSBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBvdmVyYWxsV29yc3RSYXRpbyA9IG51bGw7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaUdyYWQgPSAxOyBpR3JhZCA8IGdyYWRMaXN0Lmxlbmd0aDsgKytpR3JhZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29yc3RDb2xvciA9IGdyYWRMaXN0W2lHcmFkIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JzdFJhdGlvID0gZmdDb2xvci5jb250cmFzdFJhdGlvKGdyYWRMaXN0W2lHcmFkIC0gMV0pO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcCA9IC4xO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0ZXAgPiAuMDAwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlkeCArIHN0ZXAgPD0gMSAmJiB3b3JzdFJhdGlvID4gZmdDb2xvci5jb250cmFzdFJhdGlvKGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4ICsgc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0Q29sb3IgPSBncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCArIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdFJhdGlvID0gZmdDb2xvci5jb250cmFzdFJhdGlvKHdvcnN0Q29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IGlkeCArIHN0ZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IC0gc3RlcCA+PSAwICYmIHdvcnN0UmF0aW8gPiBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8oZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggLSBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RDb2xvciA9IGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4IC0gc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0UmF0aW8gPSBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8od29yc3RDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gaWR4IC0gc3RlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAgPSBzdGVwIC8gMTA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJhbGxXb3JzdFJhdGlvID09PSBudWxsIHx8IG92ZXJhbGxXb3JzdFJhdGlvID4gd29yc3RSYXRpbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbFdvcnN0UmF0aW8gPSB3b3JzdFJhdGlvO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbFdvcnN0ID0gd29yc3RDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3ZlcmFsbFdvcnN0OyAvLyByZXR1cm4gdGhlIGRhcmtlc3QgY29sb3JcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBiZ0NvbG9yO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBwcmlvclN0YWNrQkcgPSBDb2xvclV0aWwuQ29sb3IoXCJ3aGl0ZVwiKTtcbiAgICAgICAgdmFyIHRoaXNTdGFja09wYWNpdHkgPSBudWxsO1xuICAgICAgICB2YXIgdGhpc1N0YWNrQWxwaGEgPSBudWxsO1xuICAgICAgICB2YXIgdGhpc1N0YWNrQkcgPSBudWxsO1xuICAgICAgICAvLyBBbmNlc3RvcnMgcHJvY2Vzc2VkIGZyb20gdGhlIHRvcG1vc3QgcGFyZW50IHRvd2FyZCB0aGUgY2hpbGRcbiAgICAgICAgd2hpbGUgKGFuY2VzdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgcHJvY05leHQgPSBhbmNlc3RvcnMucG9wKCk7XG4gICAgICAgICAgICAvL3ZhciBwcm9jTmV4dCA9IGFuY2VzdG9ycy5zcGxpY2UoMCwgMSlbMF07XG4gICAgICAgICAgICAvLyBjU3R5bGUgaXMgdGhlIGNvbXB1dGVkIHN0eWxlIG9mIHRoaXMgbGF5ZXJcbiAgICAgICAgICAgIHZhciBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShwcm9jTmV4dCk7XG4gICAgICAgICAgICBpZiAoY1N0eWxlID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gdGhpc0JnQ29sb3IgaXMgdGhlIGNvbG9yIG9mIHRoaXMgbGF5ZXIgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgaXMgdHJhbnNwYXJlbnRcbiAgICAgICAgICAgIHZhciB0aGlzQmdDb2xvciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRDb2xvciAmJiBjU3R5bGUuYmFja2dyb3VuZENvbG9yICE9IFwidHJhbnNwYXJlbnRcIiAmJiBjU3R5bGUuYmFja2dyb3VuZENvbG9yICE9IFwicmdiYSgwLCAwLCAwLCAwKVwiKSB7XG4gICAgICAgICAgICAgICAgdGhpc0JnQ29sb3IgPSBDb2xvclV0aWwuQ29sb3IoY1N0eWxlLmJhY2tncm91bmRDb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGdyYWRpZW50IGludm9sdmVkLCBzZXQgdGhpc0JnQ29sb3IgdG8gdGhlIHdvcnN0IGNvbG9yIGNvbWJpbmF0aW9uIGF2YWlsYWJsZSBhZ2FpbnN0IHRoZSBmb3JlZ3JvdW5kXG4gICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRJbWFnZSAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YgJiYgY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mKFwiZ3JhZGllbnRcIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICB2YXIgZ3JhZENvbG9ycyA6IHN0cmluZ1tdID0gY1N0eWxlLmJhY2tncm91bmRJbWFnZS5tYXRjaChyZUNvbG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JhZENvbG9ycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JhZENvbG9yQ29tcCA6IENvbG9yT2JqW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFkQ29sb3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdyYWRDb2xvcnNbaV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZENvbG9ycy5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbG9yQ29tcCA9IENvbG9yVXRpbC5Db2xvcihncmFkQ29sb3JzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JDb21wLmFscGhhICE9PSB1bmRlZmluZWQgJiYgY29sb3JDb21wLmFscGhhIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaXggdGhlIGdyZGllbnQgYmcgY29sb3Igd2l0IHBhcmVudCBiZyBpZiBhbHBoYSA8IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBTdGFja0JnID0gdGhpc1N0YWNrQkcgfHwgcHJpb3JTdGFja0JHO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckNvbXAgPSBjb2xvckNvbXAuZ2V0T3ZlcmxheUNvbG9yKGNvbXBTdGFja0JnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZENvbG9yQ29tcC5wdXNoKGNvbG9yQ29tcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpc0JnQ29sb3IgPSBndWVzc0dyYWRDb2xvcihncmFkQ29sb3JDb21wLCB0aGlzU3RhY2tCRyB8fCBwcmlvclN0YWNrQkcsIGZnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEhhbmRsZSBub24tc29saWQgb3BhY2l0eVxuICAgICAgICAgICAgaWYgKHRoaXNTdGFja09wYWNpdHkgPT09IG51bGwgfHwgKGNTdHlsZS5vcGFjaXR5ICYmIGNTdHlsZS5vcGFjaXR5Lmxlbmd0aCA+IDAgJiYgcGFyc2VGbG9hdChjU3R5bGUub3BhY2l0eSkgPCAxKSkge1xuICAgICAgICAgICAgICAgIC8vIE5ldyBzdGFjaywgcmVzZXRcbiAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrQkcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBPdmVybGF5XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHLmFscGhhID0gdGhpc1N0YWNrT3BhY2l0eSAqIHRoaXNTdGFja0FscGhhO1xuICAgICAgICAgICAgICAgICAgICBwcmlvclN0YWNrQkcgPSB0aGlzU3RhY2tCRy5nZXRPdmVybGF5Q29sb3IocHJpb3JTdGFja0JHKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpc1N0YWNrT3BhY2l0eSA9IDEuMDtcbiAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjU3R5bGUub3BhY2l0eSAmJiBjU3R5bGUub3BhY2l0eS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja09wYWNpdHkgPSBwYXJzZUZsb2F0KGNTdHlsZS5vcGFjaXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNCZ0NvbG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSB0aGlzQmdDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSB0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzU3RhY2tCRy5hbHBoYTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNTdGFja09wYWNpdHkgPT09IDEuMCAmJiB0aGlzU3RhY2tBbHBoYSA9PT0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzQkdJbWFnZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0dyYWRpZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIYW5kbGUgc29saWQgY29sb3IgYmFja2dyb3VuZHMgYW5kIGdyYWRpZW50IGNvbG9yIGJhY2tncm91bmRzXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzQmdDb2xvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBzdGFjayBhbHJlYWR5IGhhcyBhIGJhY2tncm91bmQgY29sb3IsIGJsZW5kIGl0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNTdGFja0JHID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHID0gdGhpc0JnQ29sb3I7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gdGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1N0YWNrQkcuYWxwaGE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSB0aGlzQmdDb2xvci5nZXRPdmVybGF5Q29sb3IodGhpc1N0YWNrQkcpO1xuICAgICAgICAgICAgICAgICAgICAvL3RoaXNTdGFja0FscGhhID0gdGhpc0JnQ29sb3IuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gIzUyNjogSWYgdGhpc0JnQ29sb3IgaGFkIGFuIGFscGhhIHZhbHVlLCBpdCBtYXkgbm90IGV4cG9zZSB0aHJvdWdoIHRoaXNTdGFja0JHIGluIHRoZSBhYm92ZSBjb2RlXG4gICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3Qgd2lwZSBvdXQgdGhlIGdyYWRpZW50IGluZm8gaWYgdGhpcyBsYXllciB3YXMgdHJhbnNwYXJlbnRcbiAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrT3BhY2l0eSA9PT0gMS4wICYmIHRoaXNTdGFja0FscGhhID09PSAxLjAgJiYgKHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMCkgPT09IDEuMCAmJiAodGhpc0JnQ29sb3IuYWxwaGEgfHwgMS4wKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzQkdJbWFnZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzR3JhZGllbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRJbWFnZSAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlICE9IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZiAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YoXCJncmFkaWVudFwiKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzR3JhZGllbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNCR0ltYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXNTdGFja0JHICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZnID0gZmcuZ2V0T3ZlcmxheUNvbG9yKHRoaXNTdGFja0JHKTtcbiAgICAgICAgICAgIGRlbGV0ZSBmZy5hbHBoYTtcbiAgICAgICAgfVxuICAgICAgICBmZy5hbHBoYSA9IChmZy5hbHBoYSB8fCAxKSAqIHRoaXNTdGFja09wYWNpdHk7XG4gICAgICAgIGZnID0gZmcuZ2V0T3ZlcmxheUNvbG9yKHByaW9yU3RhY2tCRyk7XG4gICAgICAgIGlmICh0aGlzU3RhY2tCRyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzU3RhY2tCRy5hbHBoYSA9IHRoaXNTdGFja09wYWNpdHkgKiB0aGlzU3RhY2tBbHBoYTtcbiAgICAgICAgICAgIHByaW9yU3RhY2tCRyA9IHRoaXNTdGFja0JHLmdldE92ZXJsYXlDb2xvcihwcmlvclN0YWNrQkcpO1xuICAgICAgICB9XG4gICAgICAgIHJldFZhbC5mZyA9IGZnO1xuICAgICAgICByZXRWYWwuYmcgPSBwcmlvclN0YWNrQkc7XG5cbiAgICAgICAgaWYgKGNTdHlsZS50ZXh0U2hhZG93ICYmIGNTdHlsZS50ZXh0U2hhZG93ICE9PSAnbm9uZScpXG4gICAgICAgICAgICByZXRWYWwudGV4dFNoYWRvdyA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gc29tZXRoaW5nIGhhcHBlbmVkLCB0aGVuLi4uXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiB9O1xufVxuXG5leHBvcnQgY2xhc3MgQ29sb3JPYmoge1xuICAgIHJlZCA6IG51bWJlcjtcbiAgICBncmVlbiA6IG51bWJlcjtcbiAgICBibHVlIDogbnVtYmVyO1xuICAgIGFscGhhIDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocmVkIDogc3RyaW5nIHwgbnVtYmVyLCBncmVlbiA6IHN0cmluZyB8IG51bWJlciwgYmx1ZSA6IHN0cmluZyB8IG51bWJlciwgYWxwaGE/IDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGZ1bmN0aW9uIGZpeENvbXBvbmVudChjb21wIDogc3RyaW5nIHwgbnVtYmVyKSA6IG51bWJlciB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChjb21wKSAhPSB0eXBlb2YgKFwiXCIpKSByZXR1cm4gY29tcCBhcyBudW1iZXI7XG4gICAgICAgICAgICBsZXQgY29tcFN0ciA9IGNvbXAgYXMgc3RyaW5nO1xuICAgICAgICAgICAgY29tcFN0ciA9IGNvbXBTdHIudHJpbSgpO1xuICAgICAgICAgICAgaWYgKGNvbXBTdHJbY29tcFN0ci5sZW5ndGggLSAxXSAhPSBcIiVcIikgcmV0dXJuIHBhcnNlSW50KGNvbXBTdHIpO1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChjb21wU3RyLnN1YnN0cmluZygwLCBjb21wU3RyLmxlbmd0aCAtIDEpKSAqIDIuNTUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVkID0gZml4Q29tcG9uZW50KHJlZCk7XG4gICAgICAgIHRoaXMuZ3JlZW4gPSBmaXhDb21wb25lbnQoZ3JlZW4pO1xuICAgICAgICB0aGlzLmJsdWUgPSBmaXhDb21wb25lbnQoYmx1ZSk7XG4gICAgICAgIGlmICh0eXBlb2YgKGFscGhhKSAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmFscGhhID0gKHR5cGVvZiAoYWxwaGEpID09PSB0eXBlb2YgKFwiXCIpKSA/IHBhcnNlRmxvYXQoYWxwaGEgYXMgc3RyaW5nKSA6IGFscGhhIGFzIG51bWJlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvSGV4SGVscCh2YWx1ZSA6IG51bWJlcikgOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsID0gTWF0aC5yb3VuZCh2YWx1ZSkudG9TdHJpbmcoMTYpO1xuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBcIjBcIiArIHJldFZhbDtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9O1xuXG4gICAgdG9IZXgoKSA6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcIiNcIiArIHRoaXMudG9IZXhIZWxwKHRoaXMucmVkKSArIHRoaXMudG9IZXhIZWxwKHRoaXMuZ3JlZW4pICsgdGhpcy50b0hleEhlbHAodGhpcy5ibHVlKTtcbiAgICB9O1xuXG4gICAgY29udHJhc3RSYXRpbyhiZ0NvbG9yIDogQ29sb3JPYmopIHsgXG4gICAgICAgIGxldCBmZ0NvbG9yOiBDb2xvck9iaiA9IHRoaXM7XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFscGhhKSAhPSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgZmdDb2xvciA9IHRoaXMuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpO1xuICAgICAgICAgICAgIFxuICAgICAgICBsZXQgbHVtMSA9IGZnQ29sb3IucmVsYXRpdmVMdW1pbmFuY2UoKTtcbiAgICAgICAgaWYgKCFiZ0NvbG9yLnJlbGF0aXZlTHVtaW5hbmNlKSB7XG4gICAgICAgICAgICBsZXQgcyA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gYmdDb2xvcikge1xuICAgICAgICAgICAgICAgIHMgKz0ga2V5ICsgXCJcXG5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFsZXJ0KGJnQ29sb3IpO1xuICAgICAgICAgICAgYWxlcnQocyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGx1bTIgPSBiZ0NvbG9yLnJlbGF0aXZlTHVtaW5hbmNlKCk7XG4gICAgICAgIGxldCByYXRpbyA9IChsdW0xID4gbHVtMikgPyAobHVtMSArIC4wNSkgLyAobHVtMiArIC4wNSkgOiAobHVtMiArIC4wNSkgLyAobHVtMSArIC4wNSk7XG4gICAgICAgIHJldHVybiByYXRpbztcbiAgICB9O1xuXG4gICAgcmVsYXRpdmVMdW1pbmFuY2UoKSA6IG51bWJlciB7XG4gICAgICAgIGxldCBSID0gdGhpcy5yZWQgLyAyNTUuMDtcbiAgICAgICAgbGV0IEcgPSB0aGlzLmdyZWVuIC8gMjU1LjA7XG4gICAgICAgIGxldCBCID0gdGhpcy5ibHVlIC8gMjU1LjA7XG4gICAgICAgIFIgPSBSIDw9IC4wNDA0NSA/IFIgLyAxMi45MiA6IE1hdGgucG93KChSICsgLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICAgICAgRyA9IEcgPD0gLjA0MDQ1ID8gRyAvIDEyLjkyIDogTWF0aC5wb3coKEcgKyAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgICAgICBCID0gQiA8PSAuMDQwNDUgPyBCIC8gMTIuOTIgOiBNYXRoLnBvdygoQiArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICAgIHJldHVybiAwLjIxMjYgKiBSICsgMC43MTUyICogRyArIDAuMDcyMiAqIEI7XG4gICAgfTtcblxuICAgIG1peChjb2xvcjIgOiBDb2xvck9iaiwgcGVyY1RoaXMgOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hbHBoYSkgPT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIChjb2xvcjIuYWxwaGEpID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5yZWQgKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5yZWQsXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLmdyZWVuICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuZ3JlZW4sXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLmJsdWUgKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ibHVlXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFscGhhVGhpcyA9IHRoaXMuYWxwaGEgPyB0aGlzLmFscGhhIDogMTtcbiAgICAgICAgICAgIGxldCBhbHBoYU90aGVyID0gY29sb3IyLmFscGhhID8gY29sb3IyLmFscGhhIDogMTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmooXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLnJlZCArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLnJlZCxcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuZ3JlZW4gKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ncmVlbixcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuYmx1ZSArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmJsdWUsXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiBhbHBoYVRoaXMgKyAoMSAtIHBlcmNUaGlzKSAqIGFscGhhT3RoZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IgOiBDb2xvck9iaikge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFscGhhKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0aGlzLmFscGhhID49IDEpIHtcbiAgICAgICAgICAgIC8vIE5vIG1peGluZyByZXF1aXJlZCAtIGl0J3Mgb3BhcXVlXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hbHBoYSA8IDApIHtcbiAgICAgICAgICAgIC8vXHRcdEhhYWMuRXJyb3IubG9nRXJyb3IoXCJJbnZhbGlkIGFscGhhIHZhbHVlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAoYmdDb2xvci5hbHBoYSkgIT0gXCJ1bmRlZmluZWRcIiAmJiBiZ0NvbG9yLmFscGhhIDwgMSkge1xuICAgICAgICAgICAgLy9cdFx0SGFhYy5FcnJvci5sb2dFcnJvcihcIkNhbm5vdCBtaXggd2l0aCBhIGJhY2tncm91bmQgYWxwaGFcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VmFsID0gdGhpcy5taXgoYmdDb2xvciwgdGhpcy5hbHBoYSk7XG4gICAgICAgIGRlbGV0ZSByZXRWYWwuYWxwaGE7IFxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUNTU0NvbG9yKGNzc1N0eWxlQ29sb3IpIHtcbiAgICAgICAgbGV0IHRoaXNSZWQgPSAtMTtcbiAgICAgICAgbGV0IHRoaXNHcmVlbiA9IC0xO1xuICAgICAgICBsZXQgdGhpc0JsdWUgPSAtMTtcblxuICAgICAgICBjc3NTdHlsZUNvbG9yID0gY3NzU3R5bGVDb2xvci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiKFwiKSkge1xuICAgICAgICAgICAgbGV0IHJnYlJlZ2V4ID0gL1xccypyZ2JcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNSZWQgPSBtWzFdO1xuICAgICAgICAgICAgICAgIHRoaXNHcmVlbiA9IG1bMl07XG4gICAgICAgICAgICAgICAgdGhpc0JsdWUgPSBtWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYmEoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYmFcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKiguKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzUmVkID0gbVsxXTtcbiAgICAgICAgICAgICAgICB0aGlzR3JlZW4gPSBtWzJdO1xuICAgICAgICAgICAgICAgIHRoaXNCbHVlID0gbVszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLmNoYXJBdCgwKSAhPSBcIiNcIikge1xuICAgICAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yIGluIENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cClcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cFtjc3NTdHlsZUNvbG9yXTtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGZyb21IZXggPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxvb2t1cCA9IHtcbiAgICAgICAgICAgICAgICAgICAgXCJhXCI6IDEwLFxuICAgICAgICAgICAgICAgICAgICBcImJcIjogMTEsXG4gICAgICAgICAgICAgICAgICAgIFwiY1wiOiAxMixcbiAgICAgICAgICAgICAgICAgICAgXCJkXCI6IDEzLFxuICAgICAgICAgICAgICAgICAgICBcImVcIjogMTQsXG4gICAgICAgICAgICAgICAgICAgIFwiZlwiOiAxNVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsICogMTYgK1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQodmFsLmNoYXJBdChpKSBpbiBsb29rdXAgPyBsb29rdXBbdmFsLmNoYXJBdChpKV0gOiB2YWwuY2hhckF0KGkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJlZS1kaWdpdCBSR0IgKCNyZ2IpIGlzIGNvbnZlcnRlZCB0byBzaXgtZGlnaXQgZm9ybSAoI3JyZ2diYikgYnkgcmVwbGljYXRpbmcgZGlnaXRzXG4gICAgICAgICAgICAgICAgLy8gKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtY29sb3ItMy8jcmdiLWNvbG9yKVxuICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBcIiNcIiArIGNzc1N0eWxlQ29sb3IuY2hhckF0KDEpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDIpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDMpLnJlcGVhdCgyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXNSZWQgPSBmcm9tSGV4KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDEsIDMpKTtcbiAgICAgICAgICAgIHRoaXNHcmVlbiA9IGZyb21IZXgoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMywgNSkpO1xuICAgICAgICAgICAgdGhpc0JsdWUgPSBmcm9tSGV4KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDUsIDcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKHRoaXNSZWQsIHRoaXNHcmVlbiwgdGhpc0JsdWUpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4vVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuXG5leHBvcnQgY2xhc3MgQ29tbW9uVXRpbCB7XG5cbiAgICBwdWJsaWMgc3RhdGljIGlucHV0X3R5cGVfd2l0aF9wbGFjZWhvbGRlciA9IFtcInRleHRcIiwgXCJzZWFyY2hcIiwgXCJ0ZWxcIiwgXCJ1cmxcIiwgXCJlbWFpbFwiLCBcInBhc3N3b3JkXCIsIFwibnVtYmVyXCJdO1xuICAgIHB1YmxpYyBzdGF0aWMgaW5wdXRfdGV4dF90eXBlcyA9IFtcbiAgICAgICAgXCJ0ZXh0XCIsIFwiZmlsZVwiLCBcInBhc3N3b3JkXCIsXG4gICAgICAgIFwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLFxuICAgICAgICBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsICAvL0hUTUwgNS4gTm90ZTogdHlwZSA9IFwiaGlkZGVuXCIgZG9lc24ndCByZXF1aXJlIHRleHRcbiAgICAgICAgXCJkYXRlXCIsIFwibnVtYmVyXCIsIFwicmFuZ2VcIixcbiAgICAgICAgXCJ0aW1lXCIsIFwiY29sb3JcIlxuICAgIF07XG4gICAgcHVibGljIHN0YXRpYyBpbnB1dF90aW1lX3R5cGVzID0gW1xuICAgICAgICBcImRhdGVcIiwgXCJtb250aFwiLCBcIndlZWtcIiwgXCJ0aW1lXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgIF07XG4gICAgcHVibGljIHN0YXRpYyBpbnB1dF9vdGhlcl90eXBlcyA9IFtcbiAgICAgICAgXCJyYW5nZVwiLCBcImNvbG9yXCIsIFwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLCBcImZpbGVcIiwgXCJpbWFnZVwiXG4gICAgXTtcbiAgICBwdWJsaWMgc3RhdGljIGZvcm1fYnV0dG9uX3R5cGVzID0gW1xuICAgICAgICBcImJ1dHRvblwiLCBcInJlc2V0XCIsIFwic3VibWl0XCJcbiAgICBdO1xuXG4gICAgcHVibGljIHN0YXRpYyBmb3JtX2xhYmVsYWJsZV9lbGVtZW50cyA9IFtcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiLCBcImJ1dHRvblwiXTtcblxuICAgIHB1YmxpYyBzdGF0aWMgdGFiVGFnTWFwID0ge1xuICAgICAgICBcImJ1dHRvblwiOiBmdW5jdGlvbiAoZWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgcmV0dXJuICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcImlmcmFtZVwiOiB0cnVlLFxuICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwicmFkaW9cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7IC8vc2luZ2xlIHJhZGlvLCBubyBncm91cFxuICAgICAgICAgICAgICAgIGxldCBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBkb2MucXVlcnlTZWxlY3RvckFsbChcImlucHV0W3R5cGU9J3JhZGlvJ11bbmFtZT0nXCIgKyBuYW1lLnRyaW0oKSArXCInXVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAwIHx8IGdyb3VwLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRydWU7ICAvL3NpbmdsZSByYWRpbyB3aXRoIHRoZSBuYW1lLCBubyBvdGhlcnMgaW4gZ3JvdXBcblxuICAgICAgICAgICAgICAgIGxldCBjaGVja2VkID0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoZ3JvdXBbaV0gYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQgPSBncm91cFtpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9vbmx5IGxhc3Qgb25lIGFwcGxpZXMgaWYgbXVsdGlwbGUgcmFkaW9zIHdpdGggJ2NoZWNrZWQnIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShjaGVja2VkLCBlbGVtZW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90aGluZyBjaGVja2VkIHlldCwgcmV0dXJuIHRydWUgaWYgaXQncyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShncm91cFswXSwgZWxlbWVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSAgIFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgcmV0dXJuICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcInRleHRhcmVhXCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICAvKipcImRpdlwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpO1xuICAgICAgICB9LCovXG4gICAgICAgIFwiYVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgLy8geGxpbms6aHJlZj8/IHNlZSBzdmdcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJlYVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdWRpb1wiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udHJvbHNcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwidmlkZW9cIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRyb2xzXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcInN1bW1hcnlcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IHN1bW1hcnkgY2hpbGQgb2YgYSBkZXRhaWxzIGVsZW1lbnQgaXMgYXV0b21hdGljYWxseSBmb2N1c2FibGUgXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGVsZW1lbnQucGFyZW50RWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGV0YWlscydcbiAgICAgICAgICAgICAgICAmJiBET01VdGlsLnNhbWVOb2RlKFsuLi5lbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtID0+IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKVswXSwgZWxlbWVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGV0YWlsc1wiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgLy9kZXRhaWxzIGVsZW1lbnQgd2l0aG91dCBhIGRpcmVjdCBzdW1tYXJ5IGNoaWxkIGlzIGF1dG9tYXRpY2FsbHkgZm9jdXNhYmxlXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5jaGlsZHJlbiAmJiBbLi4uZWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKGVsZW0gPT4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc3VtbWFyeScpLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgd29yZENvdW50KHN0cik6IG51bWJlciB7XG4gICAgICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHN0ci5zcGxpdCgvXFxzKy9nKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90ZSB0aGF0IHRoaXMgb25seSBkZXRlY3RzIGlmIHRoZSBlbGVtZW50IGl0c2VsZiBpcyBpbiB0aGUgdGFiIG9yZGVyLlxuICAgICAqIEhvd2V2ZXIsIHRoaXMgZWxlbWVudCBtYXkgZGVsZWdhdGUgZm9jdXMgdG8gYW5vdGhlciBlbGVtZW50IHZpYSBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQuXG4gICAgICogQWxzbywgZm9jdXMgdmFyaWVzIGJ5IGJyb3dzZXIuLi4gc3RpY2tpbmcgdG8gdGhpbmdzIHRoYXQgYXJlIGZvY3VzYWJsZSBvbiBDaHJvbWUgYW5kIEZpcmVmb3guXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1RhYmJhYmxlKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gVXNpbmcgaHR0cHM6Ly9hbGx5anMuaW8vZGF0YS10YWJsZXMvZm9jdXNhYmxlLmh0bWxcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBleHBsaWNpdCBjYXNlcyBmaXJzdFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJpbmVydFwiKSB8fCBET01VdGlsLmdldEFuY2VzdG9yV2l0aEF0dHJpYnV0ZShlbGVtZW50LCBcImluZXJ0XCIsIFwiXCIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPj0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHBsaWNpdCBjYXNlcyBoYW5kbGVkIC0gbm93IHRoZSBpbXBsaWNpdFxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSBpbiBDb21tb25VdGlsLnRhYlRhZ01hcCkge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IENvbW1vblV0aWwudGFiVGFnTWFwW25vZGVOYW1lXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKGNlID09PSBcInRydWVcIiB8fCBjZSA9PT0gXCJcIikgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHRoZSBlbGUgbm9kZSBpcyBmb2N1c2FibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9jdXNhYmxlKGVsZSkge1xuICAgICAgICBpZiAoZWxlID09PSBcInVuZGVmaW5lZFwiIHx8IGVsZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IGRldGVjdHMgaWYgdGhlIGVsZW1lbnQgaXRzZWxmIGlzIGludGVyYWN0aXZlLCBidXQgbm90IG9uY2xpY2sgZXZlbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NsaWNrYWJsZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICAvLyBuYXRpdmUgZm9jdXNhYmxlIGVsZW1lbnRcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgaW4gQ29tbW9uVXRpbC50YWJUYWdNYXApIHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBDb21tb25VdGlsLnRhYlRhZ01hcFtub2RlTmFtZV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICAgIC8vY3VzdG9tIHdpZGdldFxuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmlzV2lkZ2V0KGVsZW1lbnQpICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgICAgIGlmICghY29udGV4dEhpZXJhcmNoaWVzKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5maWx0ZXIoaGllciA9PiBbXCJ0YWJsZVwiLCBcImdyaWRcIiwgXCJ0cmVlZ3JpZFwiXS5pbmNsdWRlcyhoaWVyLnJvbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRhYkluZGV4TEVaZXJvKGVsZW0pIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaGFzQXR0cmlidXRlKGVsZW0sIFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLm1hdGNoKC9eLT9cXGQrJC8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhYmluZGV4VmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFiaW5kZXhWYWx1ZSA9PT0gMCB8fCB0YWJpbmRleFZhbHVlID09PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IG51bWJlciBvZiB0YWJiYWJsZSBjaGlsZHJlblxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VGFiYmFibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgfHwgZWxlbWVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbm9ybWFsaXplU3BhY2luZyhzKSB7XG4gICAgICAgIGlmICghcykgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gcy50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgIH07XG5cbiAgICAvL1RPRE86IGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBlcXVpdmFsZW50cyBmb3Igcm9sZXM6IHJvdywgbGluaywgaGVhZGVyLCBidXR0b25cbiAgICAvLyBCdXQgaXQgbWF5IG5vdCBoYXZlIHRvLiBCdWcgcmVwb3J0cyBoYXZlIGJlZW4gYWJvdXQgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2tib3hlcy5cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEVxdWl2KG5vZGUsIGh0bWxFcXVpdikge1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxFcXVpdi5pbmRleE9mKFwiY2hlY2tib3hcIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHR5cGUgPT09IFwiY2hlY2tib3hcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChodG1sRXF1aXYuaW5kZXhPZihcInJhZGlvXCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB0eXBlID09PSBcInJhZGlvXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vbkV4aXN0YW50SURzKG5vZGUsIHRhcmdldGlkcykge1xuICAgICAgICBsZXQgcmV0dXJubm90Zm91bmRpZHMgPSAnJztcbiAgICAgICAgaWYgKENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyh0YXJnZXRpZHMpLmxlbmd0aCA8IDEpIHJldHVybiByZXR1cm5ub3Rmb3VuZGlkcztcblxuICAgICAgICBsZXQgdGFyZ2V0QXJyYXkgPSB0YXJnZXRpZHMuc3BsaXQoXCIgXCIpO1xuICAgICAgICBsZXQgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeHAgPSBcIi8vKltAaWQ9J1wiICsgdGFyZ2V0QXJyYXlbaV0gKyBcIiddXCI7XG4gICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQgPSBkb2MuZXZhbHVhdGUoeHAsIG5vZGUsIGRvYy5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICBsZXQgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICBpZiAoIXIpIHJldHVybm5vdGZvdW5kaWRzICs9IHRhcmdldEFycmF5W2ldICsgJywgJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJldHVybm5vdGZvdW5kaWRzKS5sZW5ndGggPj0gMilcbiAgICAgICAgICAgIHJldHVybm5vdGZvdW5kaWRzID0gcmV0dXJubm90Zm91bmRpZHMuc3Vic3RyaW5nKDAsIHJldHVybm5vdGZvdW5kaWRzLmxlbmd0aCAtIDIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm5ub3Rmb3VuZGlkcyA9ICcnO1xuICAgICAgICByZXR1cm4gcmV0dXJubm90Zm91bmRpZHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXREb2NFbGVtZW50c0J5VGFnKGVsZW0sIHRhZ05hbWUpIHtcbiAgICAgICAgbGV0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KGVsZW0pIGFzIGFueTtcbiAgICAgICAgdGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCB7fSk7XG4gICAgICAgIGlmICghKHRhZ05hbWUgaW4gY2FjaGUpKSB7XG4gICAgICAgICAgICBjYWNoZVt0YWdOYW1lXSA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCBjYWNoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlW3RhZ05hbWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldCBhIGxpc3Qgb2YgYWxsIHRoZSBjaGlsZCBlbGVtbnRzIHdoaWNoIG1hdGNoIHRoZSB0YWdcbiAgICAgKiBuYW1lIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldENoaWxkQnlUYWdIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBwYXJlbnRFbGVtIC0gVGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge3N0cmluZ30gdGFnTmFtZSAtIFRoZSB0YWcgdG8gc2VhcmNoIGZvciB1bmRlciB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbGVhbn0gaWdub3JlSGlkZGVuIC0gdHJ1ZSBpZiBoaWRkZW4gZWxlbWVudHMgd2l0aCB0aGUgdGFnIHNob3VsZCBpZ25vcmVkIGZyb20gdGhlIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgYWRkZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSB0YWcgdW5kZXIgdGhlIHBhcmVudCB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENoaWxkQnlUYWcocGFyZW50RWxlbSwgdGFnTmFtZSkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGNoaWxkIGVsZW1udHMgd2hpY2ggbWF0Y2ggdGhlIHRhZ1xuICAgICAqIG5hbWUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gcGFyZW50RWxlbSAtIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHRhZ05hbWUgLSBUaGUgdGFnIHRvIHNlYXJjaCBmb3IgdW5kZXIgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggdGhlIHRhZyBzaG91bGQgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgdGFnIHVuZGVyIHRoZSBwYXJlbnQgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGlnbm9yZUhpZGRlbiwgY29uc2lkZXJIaWRkZW5TZXR0aW5nKSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgbGV0IGNoaWxkID0gcGFyZW50RWxlbS5maXJzdENoaWxkO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBwYXJlbnQgdG8gYnVpbGQgYSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgdGhhdFxuICAgICAgICAvLyBtYXRjaCB0aGUgdGFnTmFtZSBwcm92aWRlZFxuICAgICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkge1xuXG4gICAgICAgICAgICAvLyBPbmx5IGluY2x1ZGUgdGhlIGNoaWxkcmVuIGludG8gdGhlIHJldHVybiBhcnJheSBpZiB0aGV5IG1hdGNoIHdpdGggdGFnbmFtZS5cbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGlnbm9yZWhpZGRlbiB3YXMgc2V0IHRvIHRydWUsIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGUgY2hlY2tcbiAgICAgICAgICAgICAgICAvLyBhbmQgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2lsYmxlIHdlIG1vcmUgdG8gdGhlc2VzIHRoZW4gbW92ZSB0byB0aGUgbmV4dCBub2RlLlxuICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gYSBjb3VwbGUgb2YgY2hlY2tzIHRvIGRldGVybWluZSBpZiBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGlnbm9yZWQgb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBXaGVuIGlnbm9yZUhpZGRlbiBpcyBzZXQgdG8gdHJ1ZSB1cGZyb250LCB0aGVuIHBlcmZvcm0gYSBpc05vZGVWaXNpYmxlXG4gICAgICAgICAgICAgICAgLy8gIDIuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAvLyAgMi4xLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgaWYgKChpZ25vcmVIaWRkZW4gfHwgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiAhQ29tbW9uVXRpbC5zaG91bGRDaGVja0hpZGRlbkNvbnRlbnQoY2hpbGQpKSkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUHVzaCB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnRcbiAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBtYXRjaCBnaXZlbiByb2xlcyhzKS5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIENoZWNrIEhpZGRlbiBTZXR0aW5nIGF0IGFsbC5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIGltcGxpY2l0IHJvbGVzLlxuICAgICAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogQXJpYVV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gcmV0dXJuIGVsZW1lbnRzIGJhc2VkIG9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgcm9sZShzKSB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRzQnlSb2xlKGRvYywgcm9sZXMpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbGlzdCBvZiBlbGVtZW50cyB0aGF0IG1hdGNoIGdpdmVuIHJvbGVzKHMpLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byByZXR1cm4gZWxlbWVudHMgYmFzZWQgb24uXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSByb2xlKHMpIHRoYXQgd2VyZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIFxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIHRvIGVsZW1lbnQgYXNzb2ljYXRpb24gaXMgYWxyZWFkeSBtYWRlLCBhbmQgYXZhaWxhYmxlIGluIHRoZSBnbG9iYWwgaGFzQXR0cmlidXRlXG4gICAgICAgIC8vIHdlIGNhbiBqdXN0IHVzZSB0aGF0IG9uZSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgbmV3IG9uZS5cbiAgICAgICAgbGV0IHJvbGVUb0VsZW1zID0gbnVsbDtcbiAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvbGVUb0VsZW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9HRVRFTEVNRU5UU0JZX1JPTEVcIiwgbnVsbCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBuZXcgcm9sZSB0byBlbGVtZW50LCB0aGlzIGlzIHdoZXJlIHdlIGxvb3AgdGhyb3VnaCBhbGwgdGhlIGVsZW1lbnRzIGFuZCBleHRyYWN0IGFsbCB0aGVcbiAgICAgICAgLy8gZWxlbWVudHMgYnNhZWQgb24gcm9sZXMuXG4gICAgICAgIGlmIChyb2xlVG9FbGVtcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0aGUgcm9sZVRvRWxlbXMgaGFzaFxuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSB7fTtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBib2R5IG9mIHRoZSBkb2NcbiAgICAgICAgICAgIGxldCByb290ID0gZG9jLmJvZHk7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyB1bnRpbCB3ZSBhcmUgYXQgdGhlIHZlcnkgcGFyZW50IG5vZGUgb2YgdGhlIGVudGlyZSBwYWdlLCBzbyB0aGF0IHdlIGNhbiBsb29wIHRocm91Z2hcbiAgICAgICAgICAgIC8vIGFsbCB0aGUgbm9kZXMuXG4gICAgICAgICAgICB3aGlsZSAoRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgICAgICByb290ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCdWlsZCBhIG5vZGV3YWx0ZXIgYmFzZWQgb2YgdGhlIHJvb3Qgbm9kZSwgdGhpcyBub2RlIHdhbHRlciB3aWxsIGJlIHVzZSBsb29wIG92ZXIgYWxsIHRoZSBub2Rlc1xuICAgICAgICAgICAgLy8gYW5kIGJ1aWxkIHRoZSByb2xlcyB0byBFbGVtZW50IGNvcmFsYXRpb25cbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocm9vdCk7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgdGhlIGVudGlyZSBkb2MvbGlzdCBvZiBub2RlcyB0byBidWlsZCB0aGUgcm9sZSB0byBlbGVtZW50IG1hcFxuICAgICAgICAgICAgLy8gTm90ZTogVGhpcyB3aWxsIGJ1aWxkIGFuIHJvbGVUb0VsZW1zIGhhc2ggd2hpY2ggaXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQuXG4gICAgICAgICAgICAvLyByb2xlVG9FbGVtcyA9IHtcbiAgICAgICAgICAgIC8vICAgIGRvY3VtZW50OiBbe2Rpdn0se2FiYnJ9LHt2YXJ9XSxcbiAgICAgICAgICAgIC8vICAgIG1haW46IFt7ZGl2fV0sXG4gICAgICAgICAgICAvLyAgICBuYXZpZ2F0aW9uOiBbe2Rpdn1dXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmICghbncuZWxlbSgpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNoZWNrIHRoZSBlbGVtZW50cyB3aGljaCBoYXZlIHRoZSByb2xlIGF0dHJpYnV0ZSBhc3NpY2lhdGVkIHRvIHRoZW1cbiAgICAgICAgICAgICAgICBpZiAoIW53LmJFbmRUYWcpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd1JvbGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlIG5vZGUgaGFzIHJvbGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICBpZiAobncuZWxlbSgpICYmIG53LmVsZW0oKS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGFsbCB0aGUgcm9sZXMgdGhhdCBhcmUgYXNzaWduZWQgdG8gdGhpcyBlbGVtZW50LCBjYW4gaGF2ZSBtdWx0aXBsZSByb2xlcyBvbiBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgc3BsaXQgYnkgc3BhY2UsIHNvIHdlIG5lZWQgdG8gZXh0cmFjdCBhbGwgb2YgdGhlbSBpbnRvIGFuIGFycmF5LlxuICAgICAgICAgICAgICAgICAgICAgICAgd1JvbGVzID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInJvbGVcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG53LmVsZW0oKSAmJiB3Um9sZXMubGVuZ3RoID09PSAwICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXRSb2xlID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKG53Lm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Um9sZXMgPSBpbXBsaWNpdFJvbGU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAod1JvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSByb2xlcyBhbmQgYXNzaWduZWQgdGhpcyBub2RlIHRvIGFsbCB0aGVzIHJvbGVzXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd1JvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIGtleSBpcyBub3QgYWxyZWFkeSBpbiB0aGUgcm9sZVRvRWxlbXMgaGFzaCwgY29uc3RydWN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBrZXkgYW5kIGFzc2lnbiBlbXB0eSBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHdSb2xlc1tpXSBpbiByb2xlVG9FbGVtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlVG9FbGVtc1t3Um9sZXNbaV1dID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgYXJyYXkgZm9yIHRoZSByb2xlXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlVG9FbGVtc1t3Um9sZXNbaV1dLnB1c2gobncubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgcm9sZVRvRWxlbXMgaGFzaCBtYXAgYXMgYSBnbG9iYWwgdmFyaWFibGVcbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCByb2xlVG9FbGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfR0VURUxFTUVOVFNCWV9ST0xFXCIsIHJvbGVUb0VsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlsaXplIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgdGhlIHByb3ZpZGVkIHJvbGUgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSxcbiAgICAgICAgLy8gZm9yIHRoaXMgY2FzZSB3ZSB0YWtlIHRoZSBzdHJpbmcgYW5kIHB1dCBpdCBpbnRvIGFuIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2YgKHJvbGVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSByb2xlcztcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICByb2xlcy5wdXNoKHJvbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSByb2xlcyB0aGF0IHdlcmUgcHJvdmlkZWQgYW5kIGZpbmQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgZm9yIHRoaXMgcm9sZXNcbiAgICAgICAgLy8gYW5kIGFkZCB0aGVtIHRvIHRoZSByZXR1cm4gdmFsdWUuXG4gICAgICAgIGlmIChyb2xlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIHJvbGVzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgcm9sZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGxldCBuZXh0Um9sZSA9IHJvbGVzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEZldGNoIHRoZSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgZm9yIHRoaXMgcm9sZVxuICAgICAgICAgICAgICAgIGxldCBjb3B5Um9sZXMgPSByb2xlVG9FbGVtc1tuZXh0Um9sZV07XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgZWxlbWVudHMgdG8gY29weSB0byBhbm90aGVyIGFycmF5LCB0aGVuIHBlcmZvcm0gdGhlIGNvcHlcbiAgICAgICAgICAgICAgICBpZiAoY29weVJvbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIGFyZSB0byBiZSBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3B5Um9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIGVsZW1lbnQgdG8gdGhlIHJldHVybiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNvcHlSb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBhIHRhcmdldCBpcyBlbiBlbGVtZW50IHRoYXQgYWNjZXB0IGEgcG9pbnRlciBhY3Rpb24gKGNsaWNrIG9yIHRvdWNoKVxuICAgICAgICAgKiBcbiAgICAgICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1RhcmdldChlbGVtZW50KSB7IFxuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5ub2RlVHlwZSAhPT0gMSBcbiAgICAgICAgICAgIHx8IFtcImh0bWxcIiwgXCJib2R5XCJdLmluY2x1ZGVzKGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgW1wic3ZnXCIsIFwicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIiwgJ2hlYWQnXSkgIT09IG51bGwgXG4gICAgICAgICAgICB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpIHx8IFZpc1V0aWwuaXNOb2RlVmlzdWFsbHlIaWRkZW4oZWxlbWVudCkgXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKGVsZW1lbnQpIHx8IFZpc1V0aWwuaXNFbGVtZW50T2Zmc2NyZWVuKGVsZW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNDbGlja2FibGUoZWxlbWVudCkpIFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtZW50KTtcbiAgICAgICAgaWYgKCFyb2xlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0X3JvbGVzID0gW1wibGlzdGl0ZW1cIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzd2l0Y2hcIiwgXCJ0cmVlaXRlbVwiXTtcbiAgICAgICAgaWYgKHRhcmdldF9yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgLy8gZmluZCB0aGUgcHJvcGVyIHBhcmVudCBlbGVtZW50c1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRfcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIC8vIGRhdGFsaXN0LCBmaWVsZHNldCwgb3B0Z3JvdXAsIGV0Yy4gbWF5IGJlIGp1c3QgdXNlZCBmb3IgZ3JvdXBpbmcgcHVycG9zZSwgc28gZ28gdXAgdG8gdGhlIHBhcmVudFxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfcm9sZSA9PT0gJ2dyb3VwJylcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgQ29tbW9uVXRpbC5pc1RhcmdldChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRGaWxlRXh0KHVybCkge1xuICAgICAgICBsZXQgbSA9IHVybC5tYXRjaCgvXFwuKChbXjs/I1xcLl18XiQpKykoWzs/I118JCkvKTtcbiAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIuXCIgKyBtWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbGVBbmNob3IodXJsKSB7XG4gICAgICAgIGxldCBtID0gdXJsLm1hdGNoKC8jKChbXjs/XFwuXXxeJCkrKShbOz9dfCQpLyk7XG4gICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIG1bMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tPYmpFbWJlZChub2RlLCBleHRUZXN0LCBtaW1lVGVzdCkge1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lICE9IFwib2JqZWN0XCIgJiYgbm9kZU5hbWUgIT0gXCJlbWJlZFwiICYmXG4gICAgICAgICAgICBub2RlTmFtZSAhPSBcImFcIiAmJiBub2RlTmFtZSAhPSBcImFyZWFcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIC8vIENoZWNrIG1pbWUgdHlwZVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCBtaW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcImNvZGV0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgbWltZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiY29kZXR5cGVcIik7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSBmaWxlbmFtZVxuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJlbWJlZFwiKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiYVwiIHx8IG5vZGVOYW1lID09PSBcImFyZWFcIikge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmhhc0F0dHJpYnV0ZShcImRhdGFcIikpIHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlbmFtZSA9PT0gbnVsbCkgZmlsZW5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dChmaWxlbmFtZSk7XG4gICAgICAgICAgICByZXRWYWwgPSBleHRUZXN0KGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgZmlsZW5hbWVzIGluIHRoZSBwYXJhbXNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgbm9kZU5hbWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgQ2hlY2sgSGlkZGVuIE9wdGlvbiBpcyBzZXQgdGhlbiBjb21wbHkgd2l0aCB0aGF0IHNldHRpbmdcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4obm9kZSwgXCJwYXJhbVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBwYXJhbXMgIT0gbnVsbCAmJiBpIDwgcGFyYW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcGFyYW1zW2ldLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIGV4dFRlc3QoQ29tbW9uVXRpbC5nZXRGaWxlRXh0KHBhcmFtc1tpXS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNBdWRpb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgQ29tbW9uVXRpbC5pc0F1ZGlvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImF1ZGlvXCIpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzQXVkaW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCBhdWRpb19leHRlbnNpb25zID0gW1wiLmFpZlwiLCBcIi5haWZjXCIsIFwiLmFpZmZcIiwgXCIuYWlyXCIsIFwiLmFzZlwiLCBcIi5hdVwiLCBcIi5jZGFcIixcbiAgICAgICAgICAgIFwiLmRzbVwiLCBcIi5kc3NcIiwgXCIuZHdkXCIsIFwiLmlmZlwiLCBcIi5rYXJcIiwgXCIubTFhXCIsIFwiLm1lZFwiLFxuICAgICAgICAgICAgXCIubXAyXCIsIFwiLm1wM1wiLCBcIi5tcGFcIiwgXCIucGNtXCIsIFwiLnJhXCIsIFwiLnJhbVwiLCBcIi5ybVwiLFxuICAgICAgICAgICAgXCIuc2FtXCIsIFwiLnNmXCIsIFwiLnNmMlwiLCBcIi5zbXBcIiwgXCIuc25kXCIsIFwiLnN2eFwiLCBcIi51bFwiLFxuICAgICAgICAgICAgXCIudm9jXCIsIFwiLndhdlwiLCBcIi53bWFcIiwgXCIud3ZlXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShleHQudG9Mb3dlckNhc2UoKSwgYXVkaW9fZXh0ZW5zaW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNWaWRlb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgQ29tbW9uVXRpbC5pc1ZpZGVvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcInZpZGVvXCIpIHx8XG4gICAgICAgICAgICAgICAgbWltZS5zdGFydHNXaXRoKFwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2hcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzVmlkZW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCB2aWRlb19leHRlbnNpb25zID0gW1wiLmFzZlwiLCBcIi5hdmlcIiwgXCIuZGl2eFwiLCBcIi5kdlwiLCBcIi5tMXZcIiwgXCIubTJwXCIsIFwiLm0ydlwiLCBcIi5tb292XCIsXG4gICAgICAgICAgICBcIi5tb3ZcIiwgXCIubXA0XCIsIFwiLm1wZWdcIiwgXCIubXBnXCIsIFwiLm1wdlwiLCBcIi5vZ21cIiwgXCIub21mXCIsIFwiLnF0XCIsXG4gICAgICAgICAgICBcIi5ybVwiLCBcIi5ydlwiLCBcIi5zbWlcIiwgXCIuc21pbFwiLCBcIi5zd2ZcIiwgXCIudm9iXCIsIFwiLndtdlwiLCBcIi5ybXZiXCIsXG4gICAgICAgICAgICBcIi5tdmJcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCB2aWRlb19leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0ltYWdlT2JqRW1iZWRMaW5rKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuY2hlY2tPYmpFbWJlZChub2RlLCBDb21tb25VdGlsLmlzSW1nRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImltYWdlXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGltYWdlX2V4dGVuc2lvbnMgPSBbXCIuYm1wXCIsIFwiLmdpZlwiLCBcIi5qcGdcIiwgXCIuanBlZ1wiLCBcIi5wY3hcIiwgXCIucG5nXCJdO1xuICAgICAgICBcbiAgICBwdWJsaWMgc3RhdGljIGlzSW1nRXh0KGV4dCkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBDb21tb25VdGlsLmltYWdlX2V4dGVuc2lvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEV4dChleHQpIHtcbiAgICAgICAgbGV0IGh0bWxfZXh0ZW5zaW9ucyA9IFtcIi5hc3BcIiwgXCIuYXNweFwiLCBcIi5jZm1cIiwgXCIuY2ZtbFwiLCBcIi5jZ2lcIiwgXCIuaHRtXCIsIFwiLmh0bWxcIiwgXCIuc2h0bVwiLFxuICAgICAgICAgICAgXCIuc2h0bWxcIiwgXCIucGhwXCIsIFwiLnBsXCIsIFwiLnB5XCIsIFwiLnNodG1cIiwgXCIuc2h0bWxcIiwgXCIueGh0bWxcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBodG1sX2V4dGVuc2lvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzVHJpZ2dlcmVkKGRvYywgaWQpIHtcbiAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIGlkLCBmYWxzZSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgdHJpZ2dlck9uY2UoZG9jLCBpZCwgcGFzc2VkKSB7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgdHJpZ2dlcmVkID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgaWQsIGZhbHNlKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgaWQsIHRydWUpO1xuICAgICAgICByZXR1cm4gdHJpZ2dlcmVkO1xuICAgIH1cblxuICAgIC8qIGRldGVybWluZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgZXhpc3RzIGluIHRoZSBnaXZlbiBhcnJheSAqL1xuICAgIHB1YmxpYyBzdGF0aWMgdmFsSW5BcnJheSh2YWx1ZSwgYXJyKSB7XG4gICAgICAgIGZvciAobGV0IGlkeCBpbiBhcnIpIHtcbiAgICAgICAgICAgIGlmIChhcnJbaWR4XSA9PT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gICAgICogQHBhcmFtIHRhZ05hbWVzIHN0cmluZywgYXJyYXksIG9yIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgdGFncyB0byBzZWFyY2ggZm9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcihlbGVtZW50LCB0YWdOYW1lcykge1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0aGlzVGFnID0gd2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRhZ05hbWVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzVGFnID09PSB0YWdOYW1lcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4IGluIHRhZ05hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdOYW1lc1tpZHhdID09PSB0aGlzVGFnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1RhZyBpbiB0YWdOYW1lcykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH1cblxuICAgIC8vIHJldHVybiB0cnVlIGlmIGVsZW1lbnQxIGFuZCBlbGVtZW50MiBhcmUgc2libGluZ3NcbiAgICBwdWJsaWMgc3RhdGljIGlzU2libGluZyhlbGVtZW50MSwgZWxlbWVudDIpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQxICYmIGVsZW1lbnQyKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudDEpICYmIERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKS5maXJzdENoaWxkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlID09PSBlbGVtZW50MikgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEZXNjZW5kYW50KHBhcmVudCwgY2hpbGQpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShjaGlsZCk7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9jaGVjayBpZiB0aGUgZmlyc3QgZm9ybSBjb250cm9sIGNoaWxkIGlzIGRpc2FibGVkXG4gICAgcHVibGljIHN0YXRpYyBpc0Rpc2FibGVkQnlGaXJzdENoaWxkRm9ybUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgZm9ybUVsZW1lbnRzID0gW1wiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiLCBcImtleWdlblwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJvdXRwdXRcIl07XG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm1FbGVtZW50cy5pbmNsdWRlcyhudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKG53Lm5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEaXNhYmxlZEJ5UmVmZXJyaW5nRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIGxldCBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGxldCBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCByb290ID0gZG9jLmJvZHk7XG4gICAgICAgIHdoaWxlIChET01XYWxrZXIucGFyZW50Tm9kZShyb290KSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlXG4gICAgICAgICAgICByb290ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihyb290KTtcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBlbGVtZW50IHdob3NlICdhcmlhLWRlc2NyaWJlZGJ5JyBlcXVhbHMgdG8gdGhlIGlkXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGxldCBBcmlhRGVzY3JpYmVkYnlJREFycmF5ID0gKG53LmVsZW0oKS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYURlc2NyaWJlZGJ5SURBcnJheS5pbmNsdWRlcyhpZCkgJiYgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBnZXQgZWxlbWVudCBjb250YWluaW5nIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbWlzbGVhZGluZy4gVXNlIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSBpbnN0ZWFkXG4gICAgICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5wdXRMYWJlbChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtlbGVtZW50fSBlbGVtZW50IC0gcmV0dXJuIHRoZSBlbGVtZW50IGZvciB0aGUgbGFiZWwsIG90aGVyd2lzZSBudWxsXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBsYWJlbCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIGNvbnRhaW5pbmcgbGFibGUgZWxlbWVudCBpcyBoaWRkZW4sIHdoZW4gdGhlIGlnbm9yZUhpZGRlbiBvcHRpb25cbiAgICAgKiBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggbGFiZWwgc2hvdWxkIGJlIGlnbm9yZWQgZnJvbSB0aGUgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiB0aGUgaGlkZGVuIGVsZW1lbnRzIHNob3VsZCBiZSBhZGRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7ZWxlbWVudH0gZWxlbWVudCAtIHJldHVybiB0aGUgZWxlbWVudCBmb3IgdGhlIGxhYmVsLCBvdGhlcndpc2UgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4oZWxlbWVudDogRWxlbWVudCwgaWdub3JlSGlkZGVuKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBnbG9iYWwgQXJpYVV0aWxfTEFCRUxTIGhhc2ggaXMgYXZhaWxhYmxlLCBhcyB0aGlzIHdpbGwgY29udGFpbiB0aGUgbGFiZWwgbm9kZXMgYmFzZWQgb25cbiAgICAgICAgLy8gZm9yIGF0dHJpYnV0ZS5cbiAgICAgICAgLy9pZiAoIWdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCxcIkFyaWFVdGlsX0xBQkVMU1wiLCBudWxsKSkge1xuICAgICAgICBsZXQgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICAgICAgaWYgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUoKHJvb3Qubm9kZVR5cGUgPT09IDExKSA/IDxTaGFkb3dSb290PnJvb3QgOiA8RG9jdW1lbnQ+cm9vdCwgXCJBcmlhVXRpbF9MQUJFTFNcIiwgbnVsbCkpIHtcbiAgICAgICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgICAgICBsZXQgaWRUb0xhYmVsID0ge31cblxuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgbGFiZWwgZWxlbWVudHMgaW4gdGhlIGVudGlyZSBkb2NcbiAgICAgICAgICAgIGxldCBsYWJlbE5vZGVzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYWJlbCBub2RlcywgaW4gdGhlIGNhc2UgdGhlIGxhYmVsIG5vZGUgaGFzIGEgZm9yIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgdGhhdCBhdHRyaWJ1dGUgYW5kIGFkZCB0aGlzIG5vZGUgdG8gdGhlIGhhc2ggaWYgaXQgaXMgdmlzaWJsZS5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFiZWxOb2Rlcy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiZm9yXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGlnbm9yZSBoaWRkZW4gaXMgc3BlY2lmaWVkIGFuZCB0aGUgbm9kZSBpcyBub3QgdmlzaWJsZSB3ZSBkbyBub3QgYWRkIGl0IHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBsYWJlbE5vZGVzIGhhc2guXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVIaWRkZW4gJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShsYWJlbE5vZGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZFRvTGFiZWxbbGFiZWxOb2Rlc1tpXS5nZXRBdHRyaWJ1dGUoXCJmb3JcIildID0gbGFiZWxOb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgYnVpbHQgaGFzaCB0byB0aGUgb3duZXJEb2N1bWVudCAoZG9jdW1lbnQpLCB0byBiZSB1c2VkIGxhdGVyIHRvIGZhc3QgcmV0cml2YWxcbiAgICAgICAgICAgIC8vc2V0Q2FjaGUoZWxlbWVudC5vd25lckRvY3VtZW50LCBcIkFyaWFVdGlsX0xBQkVMU1wiLCBpZFRvTGFiZWwpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSkgPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiQXJpYVV0aWxfTEFCRUxTXCIsIGlkVG9MYWJlbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgaGFzIGFuIGlkIGF0dHJpYnV0ZSwgZ2V0IHRoZSBjb3Jvc3BvbmRpbmcgbGFiZWwgZWxlbWVudFxuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIGlkIGF0dHJpYnV0ZVxuICAgICAgICAgICAgbGV0IGN0cmxJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcm9zcG9uZGluZyBsYWJlbCBlbGVtZW50LlxuICAgICAgICAgICAgLy8gTm90ZTogaW4gdGhlIGNhc2UgdGhhdCB0aGUgdGhlIGlkIGlzIG5vdCBmb3VuZCBpbiB0aGUgaGFzaCB0aGF0IG1lYW5zLCBpdCBkb2VzIG5vdCBleGlzdHMgb3IgaXMgaGlkZGVuXG4gICAgICAgICAgICBpZiAoY3RybElkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gZ2V0Q2FjaGUoZWxlbWVudC5nZXRSb290Tm9kZSgpLm93bmVyRG9jdW1lbnQsXCJBcmlhVXRpbF9MQUJFTFNcIix7fSlbY3RybElkXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLmdldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSkgPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiQXJpYVV0aWxfTEFCRUxTXCIsIHt9KVtjdHJsSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiBzcGVjaWZpZWQgZWxlbWVudCBhdHRyaWJ1dGUgaWYgcHJlc2VudCBlbHNlIHJldHVybiBudWxsICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50QXR0cmlidXRlKGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgLy9yZXR1cm4gKGVsZW1lbnQgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cikpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cikgOiBudWxsO1xuICAgICAgICBpZiAoIWF0dHIgfHwgIWVsZW1lbnQgfHwgIWVsZW1lbnQuaGFzQXR0cmlidXRlIHx8ICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGF0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cilcbiAgICAgICAgaWYgKCFBUklBRGVmaW5pdGlvbnMucmVmZXJlbmNlUHJvcGVydGllcy5pbmNsdWRlcyhhdHRyKSlcbiAgICAgICAgICAgIHJldHVybiBhdHJWYWx1ZTtcblxuICAgICAgICAvL2F0dHIgaXMgYSByZWZlcmVuY2UgdG8gb3RoZXIgZWxlbWVudHMocylcbiAgICAgICAgY29uc3QgdmFsdWVzID0gYXRyVmFsdWUuc3BsaXQoLyArL2cpO1xuICAgICAgICAvL2lnbm9yZSBpZiBub25lIG9mIHRoZSByZWZlcnJlZCBlbGVtZW50KHMpIGV4aXN0IG9yIGFsbCBwb2ludCB0byB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICAgICAgbGV0IGV4aXN0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGlkID0gMDsgdmFsdWVzIDwgdmFsdWVzLmxlbmd0aDsgKytpZCkge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJyZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2YWx1ZXNbaWRdKTtcbiAgICAgICAgICAgIGlmIChyZWZlcnJlZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShyZWZlcnJlZCwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4aXN0ID8gYXRyVmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIGVsZW1lbnQgaGFzIHZhbGlkIGltcGxpY2l0IGxhYmVsXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbXBsaWNpdExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgIC8vIFRlc3QgIGEpIGlmIHRoZSBwYXJlbnQgaXMgYSBsYWJlbCB3aGljaCBpcyB0aGUgaW1wbGljaXQgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYikgaWYgdGhlIGZvcm0gZWxlbWVudCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxhYmVsXG4gICAgICAgIC8vICAgICAgIGMpIGlmIHRoZSBmb3JtIGVsZW1lbnQgcmVxdWlyZXMgYW4gaW1wbGljaXQgb3IgZXhwbGljaXQgbGFiZWwgOiBcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXG4gICAgICAgIC8vICAgICAgIGQpIGZvcm0gZWxlbWVudHMgd2hpY2ggbWF5IGhhdmUgYSBsYWJlbDogYnV0dG9uXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCBlbGVtZW50IGFyZTpcbiAgICAgICAgLy8gXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImRhdGFsaXN0XCIoYWRkZWQgbGF0ZXIpLiBUaGVzZSB3ZXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIG1haW4gcnVsZSwgbWlnaHQgbmVlZCB0byByZWZhY3RvciB0aGUgY29kZSBsYXRlclxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICBwYXJlbnRDbG9uZSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgIHJldHVybiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihwYXJlbnRDbG9uZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGltcGxpY2l0IGxhYmVsIG9mIHRoZSBnaXZlbiBmb3JtIGZpZWxkXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbXBsaWNpdExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgIC8vIFRlc3QgIGEpIGlmIHRoZSBwYXJlbnQgaXMgYSBsYWJlbCB3aGljaCBpcyB0aGUgaW1wbGljaXQgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYikgaWYgdGhlIGZvcm0gZWxlbWVudCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxhYmVsXG4gICAgICAgIC8vICAgICAgIGMpIGlmIHRoZSBmb3JtIGVsZW1lbnQgcmVxdWlyZXMgYW4gaW1wbGljaXQgb3IgZXhwbGljaXQgbGFiZWwgOiBcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXG4gICAgICAgIC8vICAgICAgIGQpIGZvcm0gZWxlbWVudHMgd2hpY2ggbWF5IGhhdmUgYSBsYWJlbDogYnV0dG9uXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCBlbGVtZW50IGFyZTpcbiAgICAgICAgLy8gXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImRhdGFsaXN0XCIoYWRkZWQgbGF0ZXIpLiBUaGVzZSB3ZXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIG1haW4gcnVsZSwgbWlnaHQgbmVlZCB0byByZWZhY3RvciB0aGUgY29kZSBsYXRlclxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICBwYXJlbnRDbG9uZSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgcmV0dXJuIGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gJycgPyBsYWJlbC50cmltKCkgOiBudWxsO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgdGhlIGxhYmVsIGZvciBhIGZvcm0gZmllbGQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRleHQgLSByZXR1cm4gdGhlIGxhYmVsIHRleHQgb3IgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRGb3JtRmllbGRMYWJlbChlbGVtKSA6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAvLyBnZXQgdGhlIGxhYmVsIGZyb20gdGhlIGF0dHJpYnV0ZSBcImZvclwiIG9mIHRoZSBsYWJlbCBlbGVtZW50XG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgdmFsdWUgPSBcIlwiO1xuICAgICAgICBsZXQgbGFiZWwgPSBudWxsO1xuICAgICAgICBsZXQgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4oZWxlbSwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgIC8vIHZhbHVlIGRpcmVjdGx5IGZyb20gZWxlbWVudCB0ZXh0XG4gICAgICAgICAgICBsYWJlbCA9IGxhYmVsRWxlbS5pbm5lclRleHQ7IC8vIGlnbm9yZSBoaWRkZW4gdGV4dFxuICAgICAgICB9IGVsc2UgeyAgICBcbiAgICAgICAgICAgIC8qKiBpZiBpdCdzIG5vdCBsYWJlbCB3aXRoIGZvciBhdHRyaWJ1dGUsIHRoZW4gZmluZCBpbXBsaWNpdCBsYWJlbFxuICAgICAgICAgICAgICogY2FzZXMgZm9yIGV4cGxpY3QgbGFiZWw6IFxuICAgICAgICAgICAgICogICA8bGFiZWwgZm9yPSdteSc+PC9sYWJlbD48aW5wdXQgaWQ9J215Jy8+XG4gICAgICAgICAgICAgKiAgIDxsYWJlbCBmb3I9J215Jz48aW5wdXQgaWQ9J215Jy8+PC9sYWJlbD4gICBcbiAgICAgICAgICAgICAqIGNhc2VzIGZvciBpbXBsaWNpdCBsYWJlbDogXG4gICAgICAgICAgICAgKiAgICA8bGFiZWw+PGlucHV0IC8+PC9sYWJlbD5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBcImxhYmVsXCIpO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSAmJiBsYWJlbEVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQobGFiZWxFbGVtLCBlbGVtKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IGxhYmVsRWxlbS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgdGhlIHRleHQgZnJvbSB0aGUgZmlyc3QgZm9ybSBlbGVtZW50IHNpbmNlIHRoZXkgbWlnaHQgYWxzbyBcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGlubmVyIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIGlubmVyVGV4dFxuICAgICAgICAgICAgICAgIHBhcmVudENsb25lID0gQ29tbW9uVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgICAgIGxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG4gICAgICAgIFxuICAgICAgICAvLyB2YWx1ZSBmcm9tIGNoaWxkIGVsZW1lbnQgYXR0cmlidXRlXG4gICAgICAgIGxhYmVsID0gQ29tbW9uVXRpbC5nZXRMYWJlbFRleHRGcm9tQXR0cmlidXRlKGxhYmVsRWxlbSwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG5cbiAgICAgICAgLy8gd2lyZWQgY2FzZTogZ2V0IGFyaWEgbGFiZWwgZnJvbSBsYWJlbCBlbGVtZW50IGl0c2VsZiBqdXN0IGluIGNhc2UgKHRob3VnaCBuYW1lIHByb2hpYml0ZWQgZnJvbSBhcmlhIGluIGh0bWwpXG4gICAgICAgIGxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKGxhYmVsRWxlbSk7XG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjYWxjdWxhdGUgbGFiZWwgZnJvbSBlbWJlZGRlZCBjb250cm9sOiBodHRwczovL3czYy5naXRodWIuaW8vYWNjbmFtZS9cbiAgICAgKiBAcGFyYW0ge2VsZW1lbnR9IGxhYmVsRWxlbSBsYWJlbCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVIaWRkZW4gLSB0cnVlIGlmIGhpZGRlbiBlbGVtZW50cyB3aXRoIGxhYmVsIHNob3VsZCBiZSBpZ25vcmVkIGZyb20gdGhlIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgYWRkZWQgIFxuICAgICAqIEByZXR1cm5zIGxhYmVsIHRleHQgb3IgJydcbiAgICAgKiBcbiAgICAgKiBub3RlIHRoZSBhc3N1bXB0aW9uIGlzIHRoZSBsYWJlbEVsZW0gcmVmZXJzIGVpdGhlciB0byBhIGxhYmVsbGVkIGVsZW1lbnQgYnkgJ2ZvcicgYXR0cmlidXRlIFxuICAgICAqICBvciBpdHMgZmlyc3QgZm9ybSBmaWVsZCBpcyBsYWJiZWxsZWQgZWxlbWVudFxuICAgICAqLyBcbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsVGV4dEZyb21BdHRyaWJ1dGUobGFiZWxFbGVtOiBFbGVtZW50LCBpZ25vcmVIaWRkZW46IGJvb2xlYW4pIDogc3RyaW5nIHtcbiAgICAgICAgLy8gbGFiZWwgZWl0aGVyIHBvaW50cyB0byBhIGxhYmVsYWJsZSBlbGVtZW50IGJ5IGl0cyBmb3IgYXR0cmlidXRlIG9yIHRoZSBmaXJzdCBlbGVtZW50IGNoaWxkXG4gICAgICAgIC8vIGdldCB0aGUgbGFiZWxsZWQgZWxtZW50IGlmIGl0J3MgYW4gaW1wbGljaXQgbGFiZWxcbiAgICAgICAgbGV0IGxhYmVsZWRFbGVtID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGFiZWxFbGVtLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZDogRWxlbWVudCA9IGxhYmVsRWxlbS5jaGlsZHJlbi5pdGVtKGkpO1xuICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuZm9ybV9sYWJlbGFibGVfZWxlbWVudHMuaW5jbHVkZXMoY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbGVkRWxlbSA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGxhYmVsRWxlbSk7XG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgLy8gb25seSBjaGVjayBlbGVtZW50IGNoaWxkcmVuXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBudy5lbGVtKCk7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIGl0J3MgaGlkZGVuLCBvciBsYWJlbGxlZCBlbGVtZW50LCBvciBmaXJzdCBmb3JtIGVsZW1lbnQgaWYgbm90IGxhYmVsZWQgYnkgZm9yIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGlmICgoaWdub3JlSGlkZGVuICYmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSB8fCBWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGVsZW0pKSlcbiAgICAgICAgICAgICAgICAgICAgfHwgKGxhYmVsZWRFbGVtICYmIGxhYmVsZWRFbGVtLmNvbnRhaW5zKGVsZW0pKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgIC8vIHRleHRib3ggZXRjLiByZXR1cm4gaXRzIHRleHQgdmFsdWVcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJ0ZXh0Ym94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIG5hbWUudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb2xlID09PSBcImNvbWJvYm94XCIgfHwgcm9sZSA9PT0gXCJsaXN0Ym94XCIpIHsgXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb21ib2JveCBvciBsaXN0Ym94IHJvbGVzLCByZXR1cm4gdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGNob3NlbiBvcHRpb24uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb24gPSBlbGVtLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZWN0ZWRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgc2VsZWN0ZWRPcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShzZWxlY3RlZE9wdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFtcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiLCBcIm1ldGVyXCJdLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciByYW5nZSByb2xlIHR5cGUsIGluY2x1ZGluZyBcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiIHJvbGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcmlhLXZhbHVldGV4dCBwcm9wZXJ0eSBpcyBwcmVzZW50LCByZXR1cm4gaXRzIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBhcmlhLXZhbHVlbm93IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxseSB1c2UgbmF0aXZlIHZhbHVlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgYXJpYSBsYWJlbCBmcm9tIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSAhPT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dC50cmltKCk7ICAgIFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNGaXJzdEZvcm1FbGVtZW50KHBhcmVudE5vZGUsIGVsZW1lbnQpIHtcbiAgICAgICAgLy9sZXQgZm9ybUVsZW1lbnRzUmVxdWlyaW5nTGFiZWwgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXTtcbiAgICAgICAgaWYgKHBhcmVudE5vZGUuZmlyc3RDaGlsZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHBhcmVudE5vZGUpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmRleE9mKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudy5ub2RlID09PSBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBzaGFkb3cgaG9zdCBvciBkZXNjZW5kYW50IG9mIGEgc2hhZG93IGhvc3QsIGJ1dCBub3QgYSBkZXNjZWRhbnQgb2YgdGhlIHNoYWRvdyByb290IG9mIHRoZSBob3N0ICh0byBiZSBhc3NpZ25lZCB0byBzaGFkb3cgc2xvdCBvciBpZ25vcmVkKSAgXG4gICAgcHVibGljIHN0YXRpYyBpc1NoYWRvd0hvc3RFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgd2Fsa05vZGU6IEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5zaGFkb3dSb290KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvL2NoZWNrIGlmIGFuIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3cgdHJlZVxuICAgIHB1YmxpYyBzdGF0aWMgaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIGlmIChyb290LnRvU3RyaW5nKCkgPT09IFwiW29iamVjdCBTaGFkb3dSb290XVwiKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChlbGVtZW50KSB7XG4gICAgICAgIGxldCBmb3JtRWxlbWVudHMgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiZGF0YWxpc3RcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImtleWdlblwiLCBcIm91dHB1dFwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIl07XG4gICAgICAgIGxldCBjaGlsZE5vZGVzID0gZWxlbWVudC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtRWxlbWVudHMuaW5kZXhPZihjaGlsZE5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudCBcbiAgICAgICAgICogQHBhcmFtIGlkU3RyIFxuICAgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFueSBvbmUgKGlmIG11bHRpcGxlIElkcykgaWQgcG9pbnRzIHRvIGl0c2VsZlxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzSWRSZWZlclRvU2VsZihlbGVtZW50LCBpZFN0cjogU3RyaW5nKSB7XG4gICAgICAgIGlmICghaWRTdHIgfHwgaWRTdHIudHJpbSgpID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgaWRzID0gaWRTdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGlkcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgbGV0IHJlZmVycmVkTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnQsIGlkc1tqXSk7XG4gICAgICAgICAgICBpZiAocmVmZXJyZWROb2RlICYmIERPTVV0aWwuc2FtZU5vZGUocmVmZXJyZWROb2RlLCBlbGVtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIERldGVybWluZSB0aGUgbm9kZSBkZXB0aCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbm9kZURlcHRoKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRlcHRoID0gMDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9XG5cbiAgICAvKiBjb21wYXJlIG5vZGUgb3JkZXIgb2YgdGhlIDIgZ2l2ZW4gbm9kZXMgKi9cbiAgICAvKiByZXR1cm5zXG4gICAgICogICAwIGlmIHRoZSBub2RlcyBhcmUgZXF1YWxcbiAgICAgKiAgIDEgaWYgbm9kZSBiIGlzIGJlZm9yZSBub2RlIGFcbiAgICAgKiAgLTEgaWYgbm9kZSBhIGlzIGJlZm9yZSBub2RlIGJcbiAgICAgKiAgIDIgaWYgbm9kZSBhIGlzIG5lc3RlZCBpbiBub2RlIGJcbiAgICAgKiAgLTIgaWYgbm9kZSBiIGlzIG5lc3RlZCBpbiBub2RlIGFcbiAgICAgKiAgIG51bGwgaWYgZWl0aGVyIG5vZGUgaXMgbnVsbCBvciB0aGVpciBwYXJlbnQgbm9kZXMgYXJlIG5vdCBlcXVhbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZU5vZGVPcmRlcihub2RlQSwgbm9kZUIpIHtcbiAgICAgICAgaWYgKG5vZGVBID09PSBub2RlQikgcmV0dXJuIDA7XG5cbiAgICAgICAgbGV0IGFEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVBKTtcbiAgICAgICAgbGV0IGJEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVCKTtcbiAgICAgICAgaWYgKGJEZXB0aCA+IGFEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiRGVwdGggLSBhRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQiA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVCKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQiBuZXN0ZWQgaW4gTm9kZSBBXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0yO1xuICAgICAgICB9IGVsc2UgaWYgKGFEZXB0aCA+IGJEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwdGggLSBiRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQSBuZXN0ZWQgaW4gTm9kZSBCXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5vZGVBICE9IG51bGwgJiYgbm9kZUIgIT0gbnVsbCAmJiBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSB7XG4gICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIG5vZGVCID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlQSA9PT0gbnVsbCB8fCBub2RlQiA9PT0gbnVsbCB8fCBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGVCICE9IG51bGwgJiYgbm9kZUIgIT0gbm9kZUEpXG4gICAgICAgICAgICBub2RlQiA9IG5vZGVCLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKG5vZGVCID09PSBudWxsKSAvLyBub2RlQiBiZWZvcmUgbm9kZUFcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICBlbHNlIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbm90IGVtcHR5XG4gICAgICogIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgYXR0clN0cikge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0clN0cikgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0clN0cikudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZnJhbWUsIG51bGwgaWYgbm90IGZvdW5kICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRGcmFtZUJ5TmFtZShydWxlQ29udGV4dCwgZnJhbWVOYW1lKSB7XG4gICAgICAgIGxldCB3aW5kb3cgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICBsZXQgZnJhbWVMaXN0ID0gW3dpbmRvd107XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICB3aGlsZSAoaWR4IDwgZnJhbWVMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0ubmFtZSA9PT0gZnJhbWVOYW1lKSByZXR1cm4gZnJhbWVMaXN0W2lkeF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFtZUxpc3RbaWR4XS5mcmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBpdCdzIGEgcmVhbCBmcmFtZSBhbmQgYXZvaWQgcmVjdXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldICYmICFmcmFtZUxpc3QuaW5jbHVkZXMoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGlzdC5wdXNoKGZyYW1lTGlzdFtpZHhdLmZyYW1lc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgKytpZHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWZhdWx0TlNSZXNvbHZlcihwcmVmaXgpIHtcbiAgICAgICAgbGV0IHVyaTtcbiAgICAgICAgc3dpdGNoIChwcmVmaXgpIHtcbiAgICAgICAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3gyJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwyJztcbiAgICAgICAgICAgIGNhc2UgJ3gnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3hodG1sJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHVyaSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVyaTtcbiAgICB9XG5cbiAgICAvL2NoZWNraW5nIGlmIG9ubHkgdGhlIGlubmVyIHRleHQgaXMgZW1wdHkgb3Igbm90XG4gICAgcHVibGljIHN0YXRpYyBpc0lubmVyVGV4dE9ubHlFbXB0eShlbGVtZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW5uZXJUZXh0IG9mIHRoZSBlbGVtZW50XG4gICAgICAgIGxldCB0ZXh0ID0gZWxlbWVudC5pbm5lclRleHQ7XG5cbiAgICAgICAgaWYgKCh0ZXh0ID09PSB1bmRlZmluZWQgfHwgdGV4dCA9PT0gbnVsbCB8fCB0ZXh0LnRyaW0oKS5sZW5ndGggPT09IDApICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3Nsb3QnICYmIGVsZW1lbnQudGV4dENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy9pZ25vcmUgc2xvdCBiZWNhdXNlIGl0cyB0ZXh0IHdpbGwgYmUgZmlsbGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGNvbnRlbnQgaW4gdGhlIGxpZ2h0IERPTSBcbiAgICAgICAgICAgIC8vIGlubmVyVGV4dCBpcyBzb21ldGltZXMgJ3VuZGVmaW5lZCcgaW4gaGVhZGxlc3MgbW9kZSwgb3IgbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBpbnZpc2libGUgb3Igbm90IGVyeHBhbmRlZCBcbiAgICAgICAgICAgIC8vIHNvIHdlIHRyeSB0ZXh0Q29udGVudCBhcyBhIHdvcmthcm91bmRcbiAgICAgICAgICAgIHRleHQgPSBlbGVtZW50LnRleHRDb250ZW50XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gISh0ZXh0ICE9PSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiKSB7XG4gICAgICAgICAgICAvL1RPRE86IG5lZWQgdG8gY29uc2lkZSBpdHMgb3duIGNvbnRlbnQsIGEgc2xvdCBtYXkgaGF2ZSBpdHMgb3duIGNvbnRlbnQgb3IgYXNzaWduZWQgY29udGVudFxuICAgICAgICAgICAgZm9yIChjb25zdCBzbG90RWxlbSBvZiBlbGVtZW50LmFzc2lnbmVkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbCAmJiBDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkoc2xvdEVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpbSB0aGUgaW5uZXIgdGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiB0aGUgaW5uZXIgdGV4dCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5uZXJUZXh0KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICBpZiAocmV0VmFsID09PSB1bmRlZmluZWQgfHwgcmV0VmFsID09PSBudWxsIHx8IHJldFZhbC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICByZXRWYWwgPSBlbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBvbnNjcmVlbiBpbm5lclRleHQgb25seS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGFzIGlubmVyVGV4dCBpZiBubyBvZmZzY3JlZW4gY29udGVudCBleGlzdHNcbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGl0IGhhcyBpbm5lciB0ZXh0IG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtudWxsIHwgc3RyaW5nfSBudWxsIGlmIGVsZW1lbnQgaGFzIGVtcHR5IGlubmVyIHRleHQsIHRleHQgb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldE9uU2NyZWVuSW5uZXJUZXh0KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IDMpIHJldHVybiBlbGVtZW50Lm5vZGVWYWx1ZSgpO1xuXG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHRvIGdldCB0aGUgdGV4dFxuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9PSBlbGVtZW50ICYmIG53Lm5vZGUgIT09IGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKG53LmJFbmRUYWcpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5jbHVkZXMobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpIHx8IFZpc1V0aWwuaXNFbGVtZW50T2Zmc2NyZWVuKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpKSkgeyBcbiAgICAgICAgICAgICAgICAvKiogc3BlY2lhbCBjYXNlIGZvciBzdmcgPHRpdGxlPiBlbGVtZW50OiBcbiAgICAgICAgICAgICAgICAgKiAgICAgdGV4dCBpbiBhIDx0aXRsZT4gZWxlbWVudCBpcyBub3QgcmVuZGVyZWQgYXMgcGFydCBvZiB0aGUgZ3JhcGhpYywgYnV0IGJyb3dzZXJzIHVzdWFsbHkgZGlzcGxheSBpdCBhcyBhIHRvb2x0aXBcbiAgICAgICAgICAgICAgICAgKiAgICAgbm90ZSBzb21lIHN2ZyBlbGVtZW50cywgc3VjaCBhcyB0aXRsZSwgZGVzYywgaGF2ZSBhIGJvdW5kcyB7XCJsZWZ0XCI6MCxcInRvcFwiOjAsXCJoZWlnaHRcIjowLFwid2lkdGhcIjowfVxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RpdGxlJyAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKG53Lm5vZGUsIFwic3ZnXCIpKSBcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5uZXh0U2libGluZy5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZSAmJiBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZS50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIG53Lm5vZGUgPSBudy5ub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5vZGVWYWx1ZSAmJiBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0LnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJuIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGdpdmVuIG5vZGUgXG4gICAgICogIHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gaW5uZXJUZXh0IG9yIHRleHRDb250ZW50IHRoYXQgcmV0dXJuIHRleHQgY29udGVudCBvZiBhIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50c1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXROb2RlVGV4dChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT0gMykge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgZWxlbWVudHMgaW5uZXIgdGV4dCBpcyBlbXB0eSBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpdCBoYXMgaW5uZXIgdGV4dCBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gdHJ1ZSBpZiBlbGVtZW50IGhhcyBlbXB0eSBpbm5lciB0ZXh0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNJbm5lclRleHRFbXB0eShlbGVtZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW5uZXJUZXh0IG9mIHRoZSBlbGVtZW50XG4gICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG5cbiAgICAgICAgLy8gVHJpbSB0aGUgaW5uZXIgdGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gISh0ZXh0ICE9IG51bGwgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgdGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGVsZW1lbnQpO1xuICAgICAgICBsZXQgaGFzQ29udGVudCA9ICh0ZXh0ICE9PSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNDb250ZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluZSBpZiBhbiBlbGVtZW50IGhhcyBpbm5lciBjb250ZW50LlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMgY2FzZXMgd2hlcmUgaW5uZXIgdGV4dCBpcyBoaWRkZW4sIHdoaWNoIG5vdyB3aWxsXG4gICAgICogYmUgY2xhc3NpZmllZCBhcyBkb2VzIG5vdCBoYXZlIGhpZGRlbiBjb250ZW50LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaXQgaGFzIGlubmVyIHRleHQgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgZWxlbWVudCBoYXMgZW1wdHkgaW5uZXIgdGV4dCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbkh5cGVyTGluayhlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzdmdIYXNOYW1lKGVsZW1lbnQ6IFNWR0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsXCIpXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpXG4gICAgICAgICAgICB8fCAhIWVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IHRpdGxlXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzSW5uZXJDb250ZW50SGlkZGVuSHlwZXJMaW5rKGVsZW1lbnQsIGh5cGVybGlua19mbGFnKSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgY2hpbGRFbGVtZW50ID0gZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSBmYWxzZTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGlsZEVsZW1lbnQgaXMgbm90IG51bGwgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGVhY2ggb2YgdGhlIGVsZW1lbnRzXG4gICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgbm90IGFsbCBoaWRkZW4uXG4gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBub2Rld2FsdGVyIG9mIHRoZSBlbGVtZW50IG5vZGUsIHNvIHRoYXQgd2UgY2FuIGxvb3Agb3ZlciBpdCBhbmQgdmVyaWZ5XG4gICAgICAgICAgICAvLyB0aGF0IHRoZSBlbGVtZW50cyB1bmRlciB0aGUgZWxlbWVudCBhcmUgbm90IGNvbXBsZXRseSBoaWRkZW4uXG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbm9kZXMgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgbm9kZXMgb3Igd2UgaGF2ZSBkZXRlcm1pbmUgdGhhdCB0aGVyZSBpcyBjb250ZW50IHVuZGVyXG4gICAgICAgICAgICAvLyB0aGlzIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG53Lm5vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBhbiBpbWcgZWxlbWVudCBpcyBwcmVzZW50IHdpdGggYWx0IHRoZW4gd2UgY2FuIG1hcmsgdGhpcyBhcyBwYXNzXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGtlZXAgY2hlY2tpbmcgYWxsIHRoZSBvdGhlciBlbGVtZW50cy4gTWFrZSBzdXJlIHRoYXQgdGhpcyBpbWFnZSBlbGVtZW50IGlzIG5vdCBoaWRkZW4uXG4gICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiXG4gICAgICAgICAgICAgICAgICAgICYmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIENvbW1vblV0aWwuc3ZnSGFzTmFtZShub2RlIGFzIGFueSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBjaGVjayBpZiB0aGlzIG5vZGUgaXMgb2YgdHlwZSBlbGVtZW50LCB2aXNpYmxlXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBpbm5lclRleHQgb2YgdGhlIGVsZW1lbnQgaXMgZW1wdHkgb3Igbm90XG4gICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIGh5cGVybGlua19mbGFnID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShub2RlIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudCAmJiBjU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjU3R5bGUuYmFja2dyb3VuZEltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY1N0eWxlLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZikgfHwgY1N0eWxlLmNvbnRlbnQpICYmIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBpcyB0ZXh0IG5vZGUgYWZ0ZXIgYW4gZWxlbWVudCB1bmRlciB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugd2UgZGV0ZWN0IG5vZGV0eXBlIGFzIHRleHQgbm9kZSBhbmQgdGhlIHBhdGVudCBvZiB0aGUgdGV4dCBub2RlIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgZWxlbWVudCB3ZSBhcmUgY2hlY2tpbmcgaGFzIElubmVyIGNvbnRlbnQgZm9yIHRoZW4gZ2V0IHRoZSBpbm5lciBjb250ZW50IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgJiYgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9ICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBubyBjaGlsZCBlbGVtZW50cyB0aGVuIHdlIGNhbiBzaW1wbHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIG9ubHkgaW5uZXJ0ZXh0XG4gICAgICAgIC8vIHRoZSBpbWcgd2l0aCBhbHQgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFib3ZlIGlmLCBhcyBpbWcgaXMgY29uc2lkZXJzIGFzIGFuIGVsZW1lbnQuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dEVtcHR5KGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnRPckFsdChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYWx0XCIpO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlICghaGFzQ29udGVudCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAmJiAoQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCBcImJ1dHRvblwiLCB0cnVlKSB8fCBBcmlhVXRpbC5oYXNSb2xlKG53Lm5vZGUsIFwidGV4dGJveFwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgKEFyaWFVdGlsLmhhc0FyaWFMYWJlbChudy5ub2RlKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwidGl0bGVcIikgfHwgQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4obncuZWxlbSgpLCB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbTogc3RyaW5nLCBhcnI6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgICAgICBhcnIuaW5kZXhPZihpdGVtKSA9PT0gLTEgJiYgaXRlbSAhPT0gbnVsbCA/IGFyci5wdXNoKGl0ZW0pIDogZmFsc2U7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KGl0ZW1MaXN0OiBzdHJpbmdbXSwgYXJyOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGl0ZW1MaXN0ICE9PSBudWxsICYmIGkgPCBpdGVtTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJyID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbUxpc3RbaV0sIGFycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYXJyYXkgaXRlbXMgZnJvbSBhIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIGl0ZW1MaXN0IGl0ZW1zIHRvIGJlIHJlbW92ZWQgZnJvbSBhcnJcbiAgICAgKiBAcGFyYW0gYXJyIHRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVkdWNlQXJyYXlJdGVtTGlzdChpdGVtTGlzdDogc3RyaW5nW10sIGFycjogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmIChhcnIgJiYgYXJyLmxlbmd0aCA+IDAgJiYgaXRlbUxpc3QgJiYgaXRlbUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGFyci5maWx0ZXIoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFpdGVtTGlzdC5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFNjb3BlRm9yVGgoZWxlbWVudCkge1xuICAgICAgICAvKiogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3RhYnVsYXItZGF0YS5odG1sI2hlYWRlci1hbmQtZGF0YS1jZWxsLXNlbWFudGljc1xuICAgICAgICAgKiBBIGhlYWRlciBjZWxsIGFuY2hvcmVkIGF0IHRoZSBzbG90IHdpdGggY29vcmRpbmF0ZSAoeCwgeSkgd2l0aCB3aWR0aCB3aWR0aCBhbmQgaGVpZ2h0IGhlaWdodCBpcyBcbiAgICAgICAgICogc2FpZCB0byBiZSBhIGNvbHVtbiBoZWFkZXIgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgY29sdW1uIHN0YXRlLCBvclxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSBhdXRvIHN0YXRlLCBhbmQgdGhlcmUgYXJlIG5vIGRhdGEgY2VsbHMgaW4gYW55IG9mIFxuICAgICAgICAgKiAgIHRoZSBjZWxscyBjb3ZlcmluZyBzbG90cyB3aXRoIHktY29vcmRpbmF0ZXMgeSAuLiB5K2hlaWdodC0xLlxuICAgICAgICAgKiBBIGhlYWRlciBjZWxsIGFuY2hvcmVkIGF0IHRoZSBzbG90IHdpdGggY29vcmRpbmF0ZSAoeCwgeSkgd2l0aCB3aWR0aCB3aWR0aCBhbmQgaGVpZ2h0IGhlaWdodCBpc1xuICAgICAgICAgKiBzYWlkIHRvIGJlIGEgcm93IGhlYWRlciBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVlOlxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSByb3cgc3RhdGUsIG9yXG4gICAgICAgICAqICogVGhlIGNlbGwncyBzY29wZSBhdHRyaWJ1dGUgaXMgaW4gdGhlIGF1dG8gc3RhdGUsIHRoZSBjZWxsIGlzIG5vdCBhIGNvbHVtbiBoZWFkZXIsIGFuZCB0aGVyZSBhcmVcbiAgICAgICAgICogICBubyBkYXRhIGNlbGxzIGluIGFueSBvZiB0aGUgY2VsbHMgY292ZXJpbmcgc2xvdHMgd2l0aCB4LWNvb3JkaW5hdGVzIHggLi4geCt3aWR0aC0xLlxuICAgICAgICAgKi9cbiAgICAgICAgLy8gTm90ZTogYXV0byBpcyBkZWZhdWx0IHNjb3BlXG5cbiAgICAgICAgLy8gRWFzaWVzdCBhbnN3ZXIgaXMgaWYgc2NvcGUgaXMgc3BlY2lmaWVkXG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpKSB7XG4gICAgICAgICAgICBsZXQgc2NvcGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUgPT09IFwicm93XCIgfHwgc2NvcGUgPT09ICdyb3dncm91cCcpIHJldHVybiBcInJvd1wiO1xuICAgICAgICAgICAgaWYgKHNjb3BlID09PSBcImNvbFwiIHx8IHNjb3BlID09PSAnY29sZ3JvdXAnKSByZXR1cm4gXCJjb2x1bW5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNjb3BlIGlzIGF1dG8sIGRlZmF1bHQgKHdpdGhvdXQgYSBzY29wZSkgb3IgaW52YWxpZCB2YWx1ZS5cbiAgICAgICAgLy8gaWYgYWxsIHRoZSBzaWJsaW5nIGVsZW1lbnRzIGFyZSB0aCwgdGhlbiByZXR1cm4gXCJjb2x1bW5oZWFkZXJcIiBcbiAgICAgICAgdmFyIHNpYmxpbmdzID0gWy4uLmVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKG5vZGUgPT4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRoXCIpO1xuICAgICAgICBpZiAoc2libGluZ3MgPT09IG51bGwgfHwgc2libGluZ3MubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFwiY29sdW1uXCI7XG4gICAgICAgIGVsc2UgcmV0dXJuIFwicm93XCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb250cm9sT2ZMYWJlbChub2RlOiBOb2RlKSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgZWFzeSBjYXNlIG9mIGxhYmVsIC0+IGZvclxuICAgICAgICBjb25zdCBsYWJlbEFuY2VzdG9yID0gQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcihub2RlLCBcImxhYmVsXCIpO1xuICAgICAgICBpZiAobGFiZWxBbmNlc3RvciAmJiBsYWJlbEFuY2VzdG9yLmhhc0F0dHJpYnV0ZShcImZvclwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50VXRpbC5nZXRCeUlkKG5vZGUsIGxhYmVsQW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiZm9yXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBpZHMgb2YgcGFyZW50IG5vZGVzXG4gICAgICAgIGNvbnN0IGlkRGljdCA9IHt9O1xuICAgICAgICBsZXQgcGFyZW50V2FsayA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChwYXJlbnRXYWxrKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50V2Fsay5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGFyZW50V2FsayBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZERpY3RbYW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiaWRcIildID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnRXYWxrID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50V2Fsayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgbm8gYW5jZXN0b3IgSURzIGZvdW5kXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhpZERpY3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSBhcmlhLWxhYmVsbGVkYnkgYXR0cmlidXRlIGlmIG5vZGUgaXMgYW4gZWxlbWVudFxuICAgICAgICBjb25zdCBub2RlQXJpYUxhYmVsbGVkQnkgPSBub2RlLm5vZGVUeXBlID09PSAxID8gKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpIDogbnVsbDtcblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY29udHJvbHMgdGhhdCB1c2UgYXJpYS1sYWJlbGxlZGJ5IGFuZCBzZWUgaWYgYW55IG9mIHRoZW0gcmVmZXJlbmNlIG9uZSBvZiBteSBhbmNlc3RvciBpZHNcbiAgICAgICAgY29uc3QgaW5wdXRzVXNpbmdMYWJlbGxlZEJ5ID0gQ2FjaGVVdGlsLmdldFNldENhY2hlKFxuICAgICAgICAgICAgbm9kZS5vd25lckRvY3VtZW50LCBcbiAgICAgICAgICAgIFwiQ29tbW9uVXRpbDo6Z2V0Q29udHJvbE9mTGFiZWxcIiwgXG4gICAgICAgICAgICAoKSA9PiAgbm9kZS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2FyaWEtbGFiZWxsZWRieV1cIilcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBpbnB1dHNVc2luZ0xhYmVsbGVkQnkubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRVc2luZ0xhYmVsbGVkQnkgPSBpbnB1dHNVc2luZ0xhYmVsbGVkQnlbaWR4XTtcbiAgICAgICAgICAgIGNvbnN0IGFyaWFMYWJlbGxlZEJ5ID0gaW5wdXRVc2luZ0xhYmVsbGVkQnkuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICAgICAgICAgICAgY29uc3Qgc3AgPSBhcmlhTGFiZWxsZWRCeS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHNwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlkIGluIGlkRGljdCAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYobm9kZSwgbm9kZUFyaWFMYWJlbGxlZEJ5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRVc2luZ0xhYmVsbGVkQnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCB0aGUgY2FzZXMgd2hlcmUgd2UncmUgd2l0aGluIGFuIGFyaWEgbGFiZWxsZWRieVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiBkaXNhYmxlZCBvciBub3QuIEZvbGxvd2luZyBpcyBob3cgdGhlIGNoZWNrIGlzIHBlcmZvcm1lZDpcbiAgICAgKiAgICAxLiBDaGVjayBpZiB0aGUgY3VycmVudCBub2RlIGlzIGRpc2FibGVkIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIGF0dHJpYnV0ZSAtLT4gZGlzYWJsZWRcbiAgICAgKiAgICAgICAgIEFsc28gbmVlZHMgdG8gYmUgXCJidXR0b25cIiwgXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCIsIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIixcbiAgICAgKiAgICAgICAgIFwibWVudWl0ZW1cIiwgXCJmaWVsZHNldFwiIG5vZGVzIChpbiBhcnJheSBlbGVtZW50c0FsbG93ZWREaXNhYmxlZClcbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGFyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJcbiAgICAgKiAgICAyLiBDaGVjayBpZiBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgZGlzYWJsZWQgd2l0aCB0aGUgc2FtZVxuICAgICAqICAgICAgIG9wdGlvbnMgbGlzdGVkIGluIDEuXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSBkaXNhYmxlZCB0aGVuIHRoaXNcbiAgICAgKiAgICAgICAgICBmdW5jdGlvbiB3aWxsIHJldHVybiB0cnVlIChub2RlIGlzIGRpc2FibGVkKS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIGRpc2FibGVkIG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIHRoZSBub2RlIGlzIGRpc2FibGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlRGlzYWJsZWQobm9kZSkge1xuXG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0RJU0FCTEVEIHRvIGZhbHNlIGZvciBhbGwgdGhlIG5vZGVzLCBiZWZvcmUgdGhlIGNoZWNrIGFuZCB0aGlzIHdpbGwgYmUgY2hhbmdlZCB0b1xuICAgICAgICAvLyB0cnVlIHdoZW4gd2UgZGV0ZWN0IHRoYXQgdGhlIG5vZGUgaXMgZGlzYWJsZWQuIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuIE9ubHkgc2V0IGl0IHRvIGZhbHNlIGlmIHRoZSBzZXR0aW5nIGlzIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICAgIC8vIGFzIGlmIGl0IGlzIGRlZmluZWQgd2UgZG8gbm90IHduYXQgdG8gcmVzZXQgaXQuIEFzIGlmIGl0IGlzIHRydWUgdGhlbiB3ZSBzaG91bGQgbWFrZSB1c2Ugb2YgaXRcbiAgICAgICAgLy8gdG8gc3BlZWQgdXAgdGhlIGNoZWNrLlxuICAgICAgICBsZXQgUFRfTk9ERV9ESVNBQkxFRCA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlLCBcIlBUX05PREVfRElTQUJMRURcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBQVF9OT0RFX0RJU0FCTEVEICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gUFRfTk9ERV9ESVNBQkxFRDtcbiAgICAgICAgUFRfTk9ERV9ESVNBQkxFRCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENoZWNrIHRoZSBub2RlVHlwZSBvZiB0aGlzIG5vZGUsIGlmIHRoaXMgbm9kZSBpcyBhIHRleHQgbm9kZSB0aGVuXG4gICAgICAgIC8vIHdlIGdldCB0aGUgcGFyZW50bm9kZSBhbmQgc2V0IHRoYXQgYXMgdGhlIG5vZGUgYXMgYSB0ZXh0IG5vZGVzLFxuICAgICAgICAvLyBkaXNhYmxlZCBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xhcmF0aW9uXG4gICAgICAgIGxldCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGRpc2FibGVkIGVsZW1lbnQgcHJvcGVydHksIGRpc2FibGVkIGFuZCBhcmlhLWRpc2FibGVkIGF0dHJpYnV0ZSBhbmQgY2hlY2sgdGhhdCBpdCBpcyB0cnVlXG4gICAgICAgIGxldCBkaXNhYmxlZEF0dHJpYnV0ZSA9IG5vZGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIGxldCBkaXNhYmxlZFByb3BlcnR5Q3VzdG9tID0gUFRfTk9ERV9ESVNBQkxFRDtcbiAgICAgICAgbGV0IGFyaWFEaXNhYmxlZEF0dHJpYnV0ZSA9IG5vZGUuaGFzQXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJykgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpID09PSAndHJ1ZSc7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBub2RlIGhhcyBkaXNhYmxlZCBhdHRyaWJ1dGUgYW5kIHRoZSBub2RlIGFsbG93cyBkaXNhYmxlZCBhdHRyaWJ1dGUsIHRoZW4gcmV0dXJuIHRydWUuXG4gICAgICAgIC8vIERpc2FibGVkIGF0dHJpYnV0ZSBpcyBvbmx5IGFsbG93ZWQgb24gXCJidXR0b25cIiwgXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCIsIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIiwgXCJtZW51aXRlbVwiLCBcImZpZWxkc2V0XCJcbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYXJpYS1kaXNhYmxlZCBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiBhbHNvIHJldHVybiB0cnVlXG4gICAgICAgIGlmIChkaXNhYmxlZFByb3BlcnR5Q3VzdG9tIHx8IChkaXNhYmxlZEF0dHJpYnV0ZSAmJiBBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkRGlzYWJsZWQuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkgfHwgYXJpYURpc2FibGVkQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBQVF9OT0RFX0RJU0FCTEVEID0gdHJ1ZTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfRElTQUJMRURcIiwgUFRfTk9ERV9ESVNBQkxFRCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgcGFyZW50Tm9kZSBmb3IgdGhpcyBub2RlLCBiZWN1YXNlIHdlIGhhdmUgdG8gY2hlY2sgYWxsIHBhcmVudHMgdG8gbWFrZSBzdXJlIHRoZXkgZG8gbm90IGhhdmVcbiAgICAgICAgLy8gZGlzYWJsZWQgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcGFyZW50IG5vZGUgZXhpc3RzIGFuZCB0aGUgbm9kZXR5cGUgaXMgZWxlbWVudCAoMSksIHRoZW4gcnVuIHJlY3Vyc2l2ZSBjYWxsIHRvIHBlcmZvcm0gdGhlIGNoZWNrXG4gICAgICAgIC8vIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSB2ZXJ5IHBhcmVudCBub2RlLiBVc2UgcmVjdXJzaXZlIGNhbGwgaGVyZSBpbnN0ZWFkIG9mIGEgd2hpbGUgbG9vcCBzbyB0aGF0IHdlIGRvIG5vdFxuICAgICAgICAvLyBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgbG9naWMgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIGlzIGRpc2FibGVkIG9yIG5vdCBmb3IgYWxsIHRoZSBwYXJlbnRzIHN0YXJ0aW5nIHdpdGhcbiAgICAgICAgLy8gY2hpbGQgbm9kZS5cbiAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgIT0gbnVsbCAmJiBwYXJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5LCBhbmQgc2F2ZSB0aGUgcmVzdWx0cyBpbiBhbiB2YXJpYWJsZVxuICAgICAgICAgICAgbGV0IG5vZGVEaXNhYmxlZCA9IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIGJlIGRpc2FibGVkIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ESVNBQkxFRCB0byB0cnVlLlxuICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgbmV4dCB0aW1lLCB0byBxdWlja2x5IGRldGVybWluZSBpZiBub2RlIGlzIGRpc2FibGVkIG9yIG5vdC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZXh0cmEgcGVyY2F1dGlvbiwgdGhlIGlzTm9kZURpc2FibGVkIGZ1bmN0aW9uIGFscmVhZHkgc2V0cyB0aGlzLlxuICAgICAgICAgICAgaWYgKG5vZGVEaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIFBUX05PREVfRElTQUJMRUQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0RJU0FCTEVEXCIsIFBUX05PREVfRElTQUJMRUQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVEaXNhYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBmYWxzZSAobm9kZSBpcyBub3QgZGlzYWJsZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmUgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIGJlIGNoZWNrZWRcbiAgICAgKiBpbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gQSBub2RlIHNvIHRoYXQgdGhlIGRvY3VtZW50IGNhbiBiZSBhY2Nlc3NlZCB0byBjaGVjayBmb3IgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uIENhbiBiZSBkb2N1bWVudCBlbGVtZW50IG9yIGEgc2ltcGxlIG5vZGUgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBiZSBjaGVja2VkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2hvdWxkQ2hlY2tIaWRkZW5Db250ZW50KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIGlmIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQgZnJvbSBjaGVja2luZyBvciBub3QsIGJhc2VkXG4gICAgICogb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmdzIGFuZCBpZiB0aGUgbm9kZSBpcyB2aXNpYmxlIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gTm9kZSB0byBjaGVjayBpZiBpdCBpcyB2aXNpYmxlIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpIHtcbiAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2VcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlIHRvIGlkZW50aWZ5IHRoYXQgdGhlIG5vZGUgc2hvdWxkIG5vdCBiZSBzY2FubmVkL2FkZGVkIHRvIGFueSBoYXNoL2FycmF5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgaWYgKCFDb21tb25VdGlsLnNob3VsZENoZWNrSGlkZGVuQ29udGVudChub2RlKSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzZm9jdXNhYmxlQnlEZWZhdWx0KG5vZGUpIHtcbiAgICAgICAgdmFyIGZvY3VzYWJsZUVsZW1lbnRzID0gWydpbnB1dCcsICdzZWxlY3QnLCAnYnV0dG9uJywgJ3RleHRhcmVhJywgJ29wdGlvbicsICdhcmVhJ107XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYVwiICYmIENvbW1vblV0aWwuaGFzQXR0cmlidXRlKG5vZGUsICdocmVmJykpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFyZWFcIiAmJiBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZShub2RlLCAnaHJlZicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzLmluZGV4T2Yobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBhIG5vbi10YWJhYmxlIG5vZGUgaGFzIHZhbGlkIHRhYmFibGUgY29udGVudC5cbiAgICAgKiBJZiBpdCBpcyB0YWJhYmxlICh0aGUgdGFiaW5kZXggaXMgbm90IHNwZWljaWZpZWQgb3IgaXMgbm90IC0xKSwgcmV0dXJucyBmYWxzZTtcbiAgICAgKiBJZiBpdCBpcyBub24tdGFiYWJsZSwgYnV0IGEgY2hpbGQgaXMgdGFiYWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBlbGVtZW50IGNvbnRlbnQsIHJldHVybnMgZmFsc2U7XG4gICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHRydWUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBub25UYWJhYmxlQ2hpbGRDaGVjayhlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fFxuICAgICAgICAgICAgKHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpICE9IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBudy5lbGVtKCk7XG4gICAgICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwpIHsgLy8gVGV4dCBub2RlLiB1c3VhbGx5IGlzIGEgY2FydHJpZGdlIHJldHVybi5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGlsZC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAmJlxuICAgICAgICAgICAgICAgIChwYXJzZUludChjaGlsZC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgIT0gLTEpICYmXG4gICAgICAgICAgICAgICAgIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KGNoaWxkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhc0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgIHZhciBoYXNBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBoYXNBdHRyaWJ1dGUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmF0dHJpYnV0ZXMgJiYgZWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSkge1xuICAgICAgICAgICAgdmFyIGF0dHIgPSBlbGVtZW50LmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgaGFzQXR0cmlidXRlID0gYXR0ciAmJiBhdHRyLnNwZWNpZmllZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzQXR0cmlidXRlO1xuICAgIH1cblxuICAgIC8vIHRydW5jYXRlIHRoZSBnaXZlbiB0ZXh0IHRvIGEgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnNcbiAgICAvLyByZXR1cm4gdHJ1bmNhdGVkIHRleHQgdG8gMTUwIGNoYXJzLCBzYW1lIHdpdGggdGhlIG1lZGlhX2FsdF9icmllZiBydWxlXG4gICAgcHVibGljIHN0YXRpYyB0cnVuY2F0ZVRleHQodGV4dDogc3RyaW5nLCBsZW4gPSAxNTApIHtcbiAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDtcbiAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPiBsZW4pXG4gICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgbGVuLTEpICtcIi4uLlwiO1xuICAgICAgICByZXR1cm4gdGV4dDtcblxuICAgIH1cblxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4vQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi9Db21tb25VdGlsXCI7XG5pbXBvcnQge1J1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY2xhc3MgVGFibGVVdGlsIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEYXRhVGFibGUodGFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiAhKEFyaWFVdGlsLmhhc1JvbGUodGFibGVOb2RlLCBcIm5vbmVcIikgfHwgQXJpYVV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwicHJlc2VudGF0aW9uXCIpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgY29tcGxleCBkYXRhIHRhYmxlIGlzIGEgZGF0YSB0YWJsZSB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczpcbiAgICAgKlxuICAgICAqIGEgdGhlYWQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzXG4gICAgICogYSB0YWJsZSB3aXRoIG1vcmUgdGhhbiBvbmUgdGhlYWQgZWxlbWVudFxuICAgICAqIGEgdGFibGUgd2l0aCB0d28gb3IgbW9yZSB0ciBlbGVtZW50cyB0aGF0IGNvbnRhaW4gb25seSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGggb3IgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAqIGEgdHIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB0ZCBlbGVtZW50IGFuZCB0d28gb3IgbW9yZSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGFibGUgd2l0aCBoZWFkZXJzIG5vdCBsb2NhdGVkIGluIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uXG4gICAgICogYSB0ZCBlbGVtZW50IHdpdGggYSBoZWFkZXJzIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGNvbnRhaW5zIG1vcmUgdGhhbiB0d28gSURSRUZzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NvbXBsZXhEYXRhVGFibGUodGFibGUpIHtcblxuICAgICAgICBpZiAoXCJBcmlhVXRpbF9pc0NvbXBsZXhEYXRhVGFibGVcIiBpbiB0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICEhdGFibGUuQXJpYVV0aWxfaXNDb21wbGV4RGF0YVRhYmxlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzQ29tcGxleFRhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRhYmxlICYmIFRhYmxlVXRpbC5pc0RhdGFUYWJsZSh0YWJsZSkpIHtcblxuICAgICAgICAgICAgbGV0IHRoTm9kZXMgPSBudWxsLFxuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHRyTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyXCIpO1xuICAgICAgICAgICAgbGV0IHRyTm9kZUNvdW50ID0gdHJOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdGROb2RlQ291bnQgPSAwLFxuICAgICAgICAgICAgICAgIHRoTm9kZUNvdW50ID0gMCxcbiAgICAgICAgICAgICAgICB0ck5vZGVzSGF2aW5nT25seVRoTm9kZXMgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGkgPCB0ck5vZGVDb3VudDsgKytpKSB7XG5cbiAgICAgICAgICAgICAgICB0aE5vZGVzID0gdHJOb2Rlc1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoXCIpO1xuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSB0ck5vZGVzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgICAgICAgICAgdGhOb2RlQ291bnQgPSB0aE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0ZE5vZGVDb3VudCA9IHRkTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRkTm9kZUNvdW50ICE9PSAwKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0ciBlbGVtZW50IHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRkIGVsZW1lbnQgYW5kIHR3byBvciBtb3JlIHRoIGVsZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9IHRoTm9kZUNvdW50ID4gMTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRoIGVsZW1lbnQgd2l0aCBhIHJvd3NwYW4gb3IgY29sc3BhbiBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBqIDwgdGhOb2RlQ291bnQ7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHRoTm9kZXNbal0sIFwidGFibGVcIikgPT09IHRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRkIGVsZW1lbnQgd2l0aCBhIGhlYWRlcnMgYXR0cmlidXRlIHZhbHVlIHRoYXQgY29udGFpbnMgbW9yZSB0aGFuIHR3byBJRFJFRnNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBrIDwgdGROb2RlQ291bnQ7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZE5vZGVzW2tdLmhhc0F0dHJpYnV0ZShcImhlYWRlcnNcIikgJiYgQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHRkTm9kZXNba10uZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKSkuc3BsaXQoXCIgXCIpLmxlbmd0aCA+IDIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IodGROb2Rlc1trXSwgXCJ0YWJsZVwiKSA9PT0gdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzIHRoYXQgY29udGFpbiBvbmx5IHRoIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aE5vZGVDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzID09PSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHRoZWFkTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoZWFkXCIpO1xuICAgICAgICAgICAgICAgIGxldCB0aGVhZE5vZGVzTGVuZ3RoID0gdGhlYWROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhlYWROb2Rlc0xlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZSBoYXMgbW9yZSB0aGFuIG9uZSB0aGVhZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhlYWROb2Rlc0xlbmd0aCA+IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0aGVhZCBlbGVtZW50IHRoYXQgY29udGFpbnMgdHdvIG9yIG1vcmUgdHIgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aGVhZE5vZGVzWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIikubGVuZ3RoID4gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNDb21wbGV4VGFibGUgJiYgdHJOb2RlQ291bnQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBhIHRhYmxlIHdpdGggaGVhZGVycyBub3QgbG9jYXRlZCBpbiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtblxuICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhOb2RlQ291bnQgPiAwICYmICFUYWJsZVV0aWwudGFibGVIZWFkZXJFeGlzdHModGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRhYmxlLkFyaWFVdGlsX2lzQ29tcGxleERhdGFUYWJsZSA9IGlzQ29tcGxleFRhYmxlO1xuXG4gICAgICAgIHJldHVybiBpc0NvbXBsZXhUYWJsZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIHRhYmxlIGNlbGwgaXMgaGlkZGVuIG9yIGNvbnRhaW4gbm8gZGF0YTogPHRkPjwvdGQ+XG4gICAgcHVibGljIHN0YXRpYyBpc1RhYmxlQ2VsbEVtcHR5KGNlbGwpIHtcbiAgICAgICAgaWYgKCFjZWxsIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUoY2VsbCkgfHwgY2VsbC5pbm5lckhUTUwucmVwbGFjZSgvJm5ic3A7L2csJyAnKS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSByb3cgaXMgaGlkZGVuIG9yIGNvbnRhaW4gbm8gZGF0YTogPHRyIC8+IG9yIDx0cj48dGQ+PC90ZD48dGQ+PC90ZD48L3RyPiBcbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVSb3dFbXB0eShyb3cpIHtcbiAgICAgICAgaWYgKCFyb3cgfHwgIXJvdy5jZWxscyB8fCByb3cuY2VsbHMubGVuZ3RoID09PSAwIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUocm93KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7IC8vZW1wdHlcbiAgICAgICAgZm9yIChsZXQgYz0wOyBwYXNzZWQgJiYgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbY107XG4gICAgICAgICAgICBwYXNzZWQgPSBUYWJsZVV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKTsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBwYXNzZWQ7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSdzIGhlYWRlciBpcyBpbiB0aGUgZmlyc3Qgcm93IG9yIGNvbHVtblxuICAgIHB1YmxpYyBzdGF0aWMgdGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpIHtcblxuICAgICAgICBsZXQgcm93cyA9IHJ1bGVDb250ZXh0LnJvd3M7XG4gICAgICAgIGlmICghcm93cyB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIG5vdGUgdGhhdCB0YWJsZS5yb3dzIHJldHVybiBhbGwgYWxsIHRoZSByb3dzIGluIHRoZSB0YWJsZSwgXG4gICAgICAgIC8vIGluY2x1ZGluZyB0aGUgcm93cyBjb250YWluZWQgd2l0aGluIDx0aGVhZD4sIDx0Zm9vdD4sIGFuZCA8dGJvZHk+IGVsZW1lbnRzLiBcbiAgICAgICAgXG4gICAgICAgIC8vY2FzZSAxOiBoZWFkZXJzIGFyZSBpbiB0aGUgdmVyeSBmaXJzdCByb3cgd2l0aCBkYXRhIGluIHRib2R5IG9yIHRoZWFkLCBidXQgbm90IGluIHRmb290ICAgXG4gICAgICAgIC8vZ2V0IHRoZSBmaXJzdCByb3cgd2l0aCBkYXRhLCBpZ25vcmluZyB0aGUgcm93cyB3aXRoIG5vIGRhdGFcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmaXJzdFJvdyA9IHJvd3NbMF07XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBmaXJzdFJvdyA9IHJvd3Nbcl07XG4gICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHJvd3MgZnJvbSB0Zm9vdFxuICAgICAgICAgICAgaWYgKGZpcnN0Um93LnBhcmVudE5vZGUgJiYgZmlyc3RSb3cucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcGFzc2VkID0gVGFibGVVdGlsLmlzVGFibGVSb3dFbXB0eShmaXJzdFJvdyk7ICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvL3RhYmxlIGNvbnRhaW4gbm8gZGF0YTogIDx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiBcbiAgICAgICAgaWYgKHBhc3NlZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGxzIHdpdGggZGF0YSBpbiB0aGUgZmlyc3QgZGF0YSByb3cgYXJlIGFsbCBUSCdzXG4gICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCBmaXJzdFJvdy5jZWxscy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgbGV0IGNlbGwgPSBmaXJzdFJvdy5jZWxsc1tyXTtcbiAgICAgICAgICAgIHBhc3NlZCA9IFRhYmxlVXRpbC5pc1RhYmxlQ2VsbEVtcHR5KGNlbGwpIHx8IGNlbGwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RoJzsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBDYXNlIDI6IGhlYWRlcnMgYXJlIGluIHRoZSBmaXJzdCBjb2x1bW4gd2l0aCBkYXRhXG4gICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBmaXJzdCBjb2x1bW4gaGFzIGFsbCBUSCdzIG9yIGEgVEQgd2l0aG91dCBkYXRhIGluIHRoZSBmaXJzdCBjb2x1bW4uXG4gICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHJvd3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgcm93cyBmcm9tIHRmb290XG4gICAgICAgICAgICBpZiAocm93c1tpXS5wYXJlbnROb2RlICYmIHJvd3NbaV0ucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gSWYgbm8gY2VsbHMgaW4gdGhpcyByb3csIG9yIG5vIGRhdGEgYXQgYWxsLCB0aGF0J3Mgb2theSB0b28uXG4gICAgICAgICAgICBwYXNzZWQgPSAhcm93c1tpXS5jZWxscyB8fFxuICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgcm93c1tpXS5jZWxsc1swXS5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHNbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRkXCI7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAvL2Nhc2UgMzogYWxsIHRkIGRhdGEgY2VsbHMgaGF2ZSBoZWFkZXJzIGF0dHJpYnV0ZXMgdGhhdCBwb2ludCB0byB0aGUgaWQgb2YgYSB0aCBlbGVtZW50IGluIHRoZSBzYW1lIHRhYmxlLiBcbiAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGFibGVzLmh0bWwjYXR0cmlidXRlcy1jb21tb24tdG8tdGQtYW5kLXRoLWVsZW1lbnRzXG4gICAgICAgIHBhc3NlZCA9IHRydWU7IFxuICAgICAgICBsZXQgdGhJZHMgPSBbXTtcbiAgICAgICAgbGV0IHRkSGVhZGVycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByPTA7IHBhc3NlZCAmJiByIDwgcm93cy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgbGV0IHJvdyA9IHJvd3Nbcl07IFxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGxzIHdpdGggZGF0YSBpbiB0aGUgbGFzdCBkYXRhIHJvdyBhcmUgYWxsIFRIJ3NcbiAgICAgICAgICAgIGZvciAobGV0IGM9MDsgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93LmNlbGxzW2NdO1xuICAgICAgICAgICAgICAgIGlmIChUYWJsZVV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKSkgY29udGludWU7IFxuICAgICAgICAgICAgICAgIGlmIChjZWxsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0ZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsLmdldEF0dHJpYnV0ZSgnaGVhZGVycycpIHx8IGNlbGwuZ2V0QXR0cmlidXRlKCdoZWFkZXJzJykudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoY2VsbC5nZXRBdHRyaWJ1dGUoJ2hlYWRlcnMnKS50cmltKCkuc3BsaXQoXCIgXCIpLCB0ZEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGgnICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oY2VsbC5nZXRBdHRyaWJ1dGUoJ2lkJykudHJpbSgpLCB0aElkcyk7ICAgIFxuICAgICAgICAgICAgfSAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocGFzc2VkKSB7IC8vIGFsbCB0ZCBlbGVtZW50cyBoYXZlIGhlYWRlcnMsIHRvIGV4YW0gaWYgdGhlIGhlYWRlcnMgcG9pbnQgdG8gYSB0aCBpZFxuICAgICAgICAgICAgaWYgKHRoSWRzLmxlbmd0aCA+IDAgJiYgdGRIZWFkZXJzLmV2ZXJ5KGhlYWRlciA9PiB0aElkcy5pbmNsdWRlcyhoZWFkZXIpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTGF5b3V0VGFibGUodGFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5oYXNSb2xlKHRhYmxlTm9kZSwgXCJwcmVzZW50YXRpb25cIikgfHwgQXJpYVV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwibm9uZVwiKTtcbiAgICB9XG5cbi8qIFxuICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICogcmV0dXJuOiBhIGxpc3Qgb2YgQXJpYSBhbmQgSHRtbCBhdHRyaWJ1dGUgcGFpcnMgdGhhdCBhcmUgY29uZmxpY3RcbiovXG5wdWJsaWMgc3RhdGljIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgaWYgKCFjb250ZXh0SGllcmFyY2hpZXMpIHJldHVybiBudWxsO1xuICAgIFxuICAgIHJldHVybiBjb250ZXh0SGllcmFyY2hpZXNbXCJhcmlhXCJdLmZpbHRlcihoaWVyID0+IFtcInRhYmxlXCIsIFwiZ3JpZFwiLCBcInRyZWVncmlkXCJdLmluY2x1ZGVzKGhpZXIucm9sZSkpO1xufVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4vQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ2xpcFBhdGhVdGlsIH0gZnJvbSBcIi4vQ2xpcFBhdGhVdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXNVdGlsIHtcbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnQgdGFncyB3aGljaCBjYW4gbm90IGJlIGhpZGRlbiwgd2hlbiBoaWRkZW4gaXNcbiAgICAvLyBhZGRlZCB0byB0aGVzZXMgZWxlbWVudHMgaXQgZG9lcyBub3QgZG8gYW55dGhpbmcgYXQgYWxsLlxuICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAvLyAgICAgICAgICAgbWFrZSBhbiBjZXJ0aWFuIHBhcnRzIG9mIGFuIG1hcCBpbnRlcmFjdGl2ZS5cbiAgICAvLyAgcGFyYW0gLS0+IGVsZW1lbnQgY2FuIG9ubHkgYmUgcGFydCBvZiBvYmplY3QgZWxtZW50IGFuZCBpdCBjYW5ub3QgYmUgaGlkZGVuIGRpcmVjdGx5LCBpdFxuICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgIC8vICBhdWRpbyAtLT4gSWYgdGhpcyBlbGVtZW50IGlzIGhpZGRlbiBpdCB3aWxsIHN0aWxsIHBsYXkgdGhlIG11c2ljLCBzbyB3ZSBzaG91bGQgc3RpbGwgdHJpZ2dlclxuICAgIC8vICAgICAgICAgICAgdmlvbGF0aW9ucyBmb3IgdGhpcyBlbGVtZW50LlxuICAgIC8vIE5vdGU6IEFsbCBlbGVtZW50IHRhZ3MgdGhhdCBhcmUgYWRkZWQgaGVyZSBzaG91bGQgYmUgYWRkZWQgYXMgbG93ZXJjYXNlLCBhcyB3ZSBhcmUgdXNpbmcgaW5kZXhPZiB0byBkbyB0aGUgY2hlY2suXG4gICAgcHVibGljIHN0YXRpYyB1bmhpZGVhYmxlRWxlbWVudHMgPSBbJ2FyZWEnLCAncGFyYW0nLCAnYXVkaW8nXTtcblxuICAgIC8vIFRoaXMgbGlzdCBjb250YWlucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGFncyB3aGljaCBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgaGF2ZSBydWxlcyB0cmlnZ2VyaW5nXG4gICAgLy8gb24gdGhlc2VzIGVsZW1lbnRzIHdlIG5lZWQgdG8gbWFrZSB0aGVuIHZpc2libGUgYnkgZGVmYXVsdCBzbyB0aGF0IHRoZSBydWxlcyBjYW4gdHJpZ2dlciByZWdhcmRsZXNzIG9mIHRoZVxuICAgIC8vIENoZWNrIEhpZGRlbiBDb250ZW50IG9wdGlvbiBpbiB0aGUgdG9vbHMuXG4gICAgLy8gIHNjcmlwdCAtLT4gc2NyaXB0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0XG4gICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgLy8gICAgICAgICAgICBtYXJrIHRoaXMgZWxlbWVudCBhcyB2aXNpYmxlIGF0IGFsbCB0aW1lcy5cbiAgICAvLyAgc3R5bGUgLS0+IHN0eWxlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgdGhlIGFjdHVhbGx5IENTUyBzY3JpcHQgaXMgc3RpbGwgZXhlY3V0ZWQgc28gd2UgaGF2ZSB0b1xuICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgLy8gIGhlYWQgLS0+IGhlYWQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCBpdCB3aWxsIHN0aWxsIGJlaGF2ZSBjb3JyZWN0XG4gICAgLy8gIHRpdGxlIC0tPiB0aXRsZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgZGlzcGxheSB0aGUgdGl0bGUuIHJlbW92ZSB0aXRsZSBmcm9tIHRoZSBsaXN0IGJlY2F1c2UgYSB0aXRsZSBjYW4gYmUgYSBjaGlsZCBvZiBhIHN2ZyBlbGVtZW50IHRvb1xuICAgIC8vICBtZXRhIC0tPiBtZXRhIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgYmFzZSAtLT4gYmFzZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIG5vc2NyaXB0IC0tPiBub3NjcmlwdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIHRlbXBsYXRlIC0tPiB0ZW1wbGF0ZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYmVjYXVzZSB0aGV5IGFyZSBqdXN0IGEgbWVjaGFuaXNtIGZvciBob2xkaW5nIGNsaWVudC1zaWRlIGNvbnRlbnRcbiAgICAvLyAgICAgICAgICAgICAgIHRoYXQgaXMgbm90IHRvIGJlIHJlbmRlcmVkIHdoZW4gYSBwYWdlIGlzIGxvYWRlZC4gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50L3RlbXBsYXRlXG4gICAgLy8gIGRhdGFsaXN0IC0tPiBkYXRhbGlzdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCxcbiAgICBwdWJsaWMgc3RhdGljIGhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzID0gWydzY3JpcHQnLCAnbGluaycsICdzdHlsZScsICdoZWFkJywgJ21ldGEnLCAnYmFzZScsICdub3NjcmlwdCcsICd0ZW1wbGF0ZScsICdkYXRhbGlzdCddXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiB2aXNpYmxlIG9yIG5vdC4gRm9sbG93aW5nIGlzIGhvdyB0aGUgY2hlY2sgaXMgcGVyZm9ybWVkOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIENTUyAtLT4gZGlzbGF5OiBub25lXG4gICAgICogICAgICAgQ1NTIC0tPiB2aXNpYmlsaXR5OiBoaWRkZW5cbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGhpZGRlblxuICAgICAqICAgIDIuIENoZWNrIGlmIHRoZSBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgaGlkZGVuIHdpdGggdGhlIHNhbWVcbiAgICAgKiAgICAgICBvcHRpb25zIGxpc3RlZCBpbiAxLlxuICAgICAqXG4gICAgICogICAgTm90ZTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgaGlkZGVuIHRoZW4gdGhpc1xuICAgICAqICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIChub2RlIGlzIG5vdCB2aXNpYmxlKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgb3BhY2l0eTowIG9yIGZpbHRlcjpvcGFjaXR5KDAlKSwgb3Igc2ltaWxhciBTVkcgbWVjaGFuaXNtczogXG4gICAgICogICAgICBUaGV5IGFyZSBub3QgY29uc2lkZXJlZCBoaWRkZW4uIFRleHQgaGlkZGVuIHdpdGggdGhlc2UgbWV0aG9kcyBjYW4gc3RpbGwgYmUgc2VsZWN0ZWQgb3IgY29waWVkLCBcbiAgICAgKiAgICAgIGFuZCB1c2VyIGFnZW50cyBzdGlsbCBleHBvc2UgaXQgaW4gdGhlaXIgYWNjZXNzaWJpbGl0eSB0cmVlcy4gIFxuICAgICAqIFxuICAgICAqICAgIE5vdGU6IG5vZGVzIGhpZGRlbiBvZmYgc2NyZWVuIG9yIGJlaGluZCBhbm90aGVyIG9iamVjdDogdGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuLiBcbiAgICAgKiAgICAgIFRoZXkgYXJlIGV4cG9zZWQgaW4gdGhlIGFjY2Vzc2liaWxpdHkgdHJlZSBhbmQgdGhleSBjYW4gZXZlbiBuYW1lIG9uLXNjcmVlbiBvYmplY3RzLlxuICAgICAqIFxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIHZpc2libGUgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IGZhbHNlIGlmIHRoZSBub2RlIGlzIE5PVCB2aXNpYmxlLCB0cnVlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFZpc1V0aWxcbiAgICAgKi9cbiAgICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXNpYmxlKG5vZGVJbjogTm9kZSkgOiBib29sZWFuIHtcblxuICAgICAgICAvLyBDaGVjayB0aGUgbm9kZVR5cGUgaWYgdGhpcyBub2RlLCBpZiB0aGlzIG5vZGUgaXMgYSB0ZXh0IG5vZGUgdGhlblxuICAgICAgICAvLyB3ZSBnZXQgdGhlIHBhcmVudG5vZGUgYW5kIHNldCB0aGF0IGFzIHRoZSBub2RlIGFzIGEgdGV4dCBub2RlcyxcbiAgICAgICAgLy8gdmlzaWJpbGl0eSBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGVJbi5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZUluID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUluKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZSA9IG5vZGVJbiBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGFsbG93IG5vZGVUeXBlIGVsZW1lbnQsIGFuZCBUZXh0Tm9kZSBhbGwgb3RoZXIgbm9kZXNUeXBlc1xuICAgICAgICAvLyB3ZSBjYW4gcmV0dXJuIHRoZSB2aXNpYmlsaXR5IGFzIHZpc2libGUuXG4gICAgICAgIC8vIEZvbGxvd2luZyBub2RlcyB3aWxsIGJlIHJldHVybmVkIGFzIHZpc2FibGUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgY2FuIG5vdFxuICAgICAgICAvLyBhY3R1YWxseSBjaGFuZ2UgdGhlaXIgdmlzaWJpbGl0eS5cbiAgICAgICAgLy8gIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIC0tPiA3XG4gICAgICAgIC8vICBOb2RlLkNPTU1FTlRfTk9ERSAgICAgICAgICAgICAgICAtLT4gOFxuICAgICAgICAvLyAgOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gICAgICAgICAgICAgICAtLT4gOVxuICAgICAgICAvLyAgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgICAgICAgICAgLS0+IDEwXG4gICAgICAgIC8vICBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICAtLT4gMTFcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG93bmVyRG9jdW1lbnQgaXMgcHJlc2VudCBiZWZvcmUgbW92aW5nIGZvcndhcmRcbiAgICAgICAgLy8gaW4gZGV0ZWN0aW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LiBJbiB0aGUgY2FzZSB0aGF0IG93bmVyRG9jdW1lbnRcbiAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgdGhlbiB3ZSBzaW1wbHkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZSBieSBkZWZhdWx0LlxuICAgICAgICBpZiAoIW5vZGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsYXJhdGlvblxuICAgICAgICBsZXQgY29tcFN0eWxlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhpcyBub2RlIGlzIGEgc2NyaXB0LCBsaW5rIG9yIHN0eWxlIG5vZGUsIHJpZ2h0IGF3YXkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZVxuICAgICAgICAvLyBiZWNhdXNlIHNjcmlwdHMsIGxpbmtzIGFuZCBzdHlsZSBub2RlcyBjYW4gbm90IGJlIGhpZGRlbiBieSBIVE1MIGF0dHJpYnV0ZSBvciBDU1Mgb3IgYXJlIGhpZGRlbiBieSBkZWZhdWx0LiBCdXQgd2Ugd2FudCB0byBzY2FuXG4gICAgICAgIC8vIHRoZSBlbGVtZW50cyBldmVyeXRpbWUgYXMgdGhleSByZW5kZXIgY29udGVudCBzdGlsbCB3aGljaCBpcyBzdGlsbCB2aXNpYmxlIHRvIHVzZXJzLlxuICAgICAgICAvLyAgc2NyaXB0IC0tPiBzY3JpcHQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHRcbiAgICAgICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vICBzdHlsZSAtLT4gc3R5bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vIGRhdGFsaXN0IC0tPiBJbiB0aGUgcmVuZGVyaW5nLCB0aGUgZGF0YWxpc3QgZWxlbWVudCByZXByZXNlbnRzIG5vdGhpbmcgYW5kIGl0LCBhbG9uZyB3aXRoIGl0cyBjaGlsZHJlbiwgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgICAgaWYgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluZGV4T2Yobm9kZU5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FjaGVWYWwgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoY2FjaGVWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlVmFsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0hJRERFTiB0byBmYWxzZSBmb3IgYWxsIHRoZSBub2RlcywgYmVmb3JlIHRoZSBjaGVjayBhbmQgdGhpcyB3aWxsIGJlIGNoYW5nZWQgdG9cbiAgICAgICAgLy8gdHJ1ZSB3aGVuIHdlIGRldGVjdCB0aGF0IHRoZSBub2RlIGlzIGhpZGRlbi4gV2UgaGF2ZSB0byBzZXQgaXQgdG8gZmFsc2Ugc28gdGhhdCB3ZSBrbm93XG4gICAgICAgIC8vIHRoZSBydWxlcyBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gICAgICAgIGNhY2hlVmFsID0gQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBpcyB2aXNpYmxlLCB3ZSBjaGVjayBjb3VwbGUgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIGhpZGRlbiBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGFyZWEsIHBhcmFtIGFuZCBhdWRpbyBlbGVtZW50cyB3ZSBkbyBub3QgY2hlY2sgaWYgdGhleSBhcmUgaGlkZGVuIGFzIGl0IGRvZXMgbm90IGFwcGx5IHRvIHRoZW0uXG4gICAgICAgIC8vIENoZWNrIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgd2hpY2ggaXMgcGFydCBvZiB0aGUgcnVsZXMsIHRvIGNoZWNrIGlmIHRoaXMgZWxlbWVudCBpcyBhbGxvd2VkIHRvIGJlIGhpZGRlbiBvciBub3RcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGUgZWxlbWVudCBpcyBwYXJ0IG9mIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgdGhlbiB3ZSBkbyBub3QgcnVuIHRoZSBoaWRkZW4gY2hlY2sgb24gdGhpcyBlbGVtZW50LFxuICAgICAgICAvLyBhbmQgZ28gc3RyaWdodCB0byB0aGUgcGFyZW50IG5vZGUuXG4gICAgICAgIC8vIEFycmF5IGNoZWNrIGVsZW1lbnRzIGxpa2U6XG4gICAgICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gICAgICAgICAgIG1ha2UgYW4gY2VydGlhbiBwYXJ0cyBvZiBhbiBtYXAgaW50ZXJhY3RpdmUuXG4gICAgICAgIC8vICBwYXJhbSAtLT4gZWxlbWVudCBjYW4gb25seSBiZSBwYXJ0IG9mIG9iamVjdCBlbG1lbnQgYW5kIGl0IGNhbm5vdCBiZSBoaWRkZW4gZGlyZWN0bHksIGl0XG4gICAgICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgICAgICAvLyAgYXVkaW8gLS0+IElmIHRoaXMgZWxlbWVudCBpcyBoaWRkZW4gaXQgd2lsbCBzdGlsbCBwbGF5IHRoZSBtdXNpYywgc28gd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXJcbiAgICAgICAgLy8gICAgICAgICAgICB2aW9sYXRpb25zIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdW5oaWRlYWJsZUVsZW1lbnRzIGFycmF5IGlzIG5vdCBkZWZpbmVkIHRoZW4gd2UganVzdCBzY2FuIGFsbCBlbGVtZW50cyBhbmQgZG8gbm8gZmlsdGVyaW5nIGF0IGFsbC5cbiAgICAgICAgaWYgKFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSBudWxsIHx8IFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSB1bmRlZmluZWQgfHwgVmlzVXRpbC51bmhpZGVhYmxlRWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBkZWZhdWx0VmlldyBleGlzdHMgZm9yIHRoaXMgbm9kZSwgaWYgaXQgZG9lcyB0aGVuIHVzZSB0aGlzIHRvIHJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZVxuICAgICAgICAgICAgLy8gZnVuY3Rpb24gdG8gZ2V0IHRoZSBDU1Mgc3R5bGUgZm9yIHRoZSBub2RlLlxuICAgICAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldykge1xuICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZSBvbiB0aGlzIG5vZGUgdG8gZmV0Y2ggdGhlIENTUyBjb21wdWF0aW9uIG9mIHRoZSBub2RlXG4gICAgICAgICAgICAgICAgY29tcFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGRlZmF1bHRWaWV3IGRvZXMgbm90IGV4aXN0cyByZXR1cm4gdHJ1ZSB0byBpZGVudGlmeSB0aGF0IHRoaXNcbiAgICAgICAgICAgIC8vIG5vZGUgaXMgdmlzaWJsZSwgYmVjYXVzZSB3ZXJlIG5vdCBhYmxlIHRvIGRldGVjdCBpZiBpdCB3YXMgbm90LlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGhpZGRlbiBlbGVtZW50IHByb3BlcnR5IGFuZCBoaWRkZW4gYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgaGlkZGVuQXR0cmlidXRlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICAgICAgICBsZXQgaGlkZGVuUHJvcGVydHlDdXN0b20gPSBjYWNoZVZhbDtcbiAgICAgICAgICAgIC8vIFRvIGdldCB0aGUgaGlkZGVuIHByb3BlcnR5IHdlIG5lZWQgdG8gcGVyZm9ybSBhIHNwZWNpYWwgY2hlY2sgYXMgaW4gc29tZSBjYXNlcyB0aGUgaGlkZGVuIHByb3BlcnR5IHdpbGwgbm90IGJlXG4gICAgICAgICAgICAvLyBhIGJvb2xlYW4sIGZvciB0aGVzZXMgY2FzZXMgd2Ugc2V0IGl0IHRvIGZhbHNlIGFzIHdlIGFyZSBub3QgYWJsZSB0byBkZXRlcm1pbmUgdGhlIHRydWUgaGlkZGVuIGNvbmRpdGlvbi5cbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYmVjYXVzZSBmb3JtIGVsZW1lbnRzIGFyZSBhYmxlIHRvIHBlcmZvcm0gYW4gb3ZlcnJpZGUsIHNvIHdoZW4gd2UgaGF2ZSBpZD1cImhpZGRlblwiIGZvciBhbiBlbGVtZW50XG4gICAgICAgICAgICAvLyB3aGljaCBpcyB1bmRlciB0aGUgZm9ybSBlbGVtZW50IHRoZW4sIG5vZGUuaGlkZGVuIGdpdmVzIHRoZSBlbGVtZW50L2xpc3Qgb2YgZWxlbWVudHMgd2hpY2ggaGF2ZSBpZD1cImhpZGRlblwiLiBSZWZlciB0b1xuICAgICAgICAgICAgLy8gbW96aWxsYSBidWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNjczNTZcbiAgICAgICAgICAgIGxldCBoaWRkZW5Qcm9wZXJ0eSA9IHR5cGVvZiAobm9kZSBhcyBhbnkpLmhpZGRlbiA9PT0gXCJib29sZWFuXCIgPyAobm9kZSBhcyBhbnkpLmhpZGRlbiA6IGZhbHNlO1xuICAgICAgICAgICAgLy8gSWYgY29tcFN0eWxlIG9iamVjdCBpcyBlbXB0eSwgbm9kZSBkb2VzJ3QgaGF2ZSBoaWRkZW4gcHJvcGVydHksIG5vZGUgZG9lcyd0IGhhdmUgaGlkZGVuIGF0dHJpYnV0ZSBhbmQgZG9lcyd0IGhhdmUgY3VzdG9tIFBUXG4gICAgICAgICAgICAvLyBoaWRkZW4gcHJvcGVydHkgdGhlbiB3ZSBjYW4ganVzdCByZXR1cm4gdHJ1ZSAobm9kZSB2aXNpYmxlKSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgaWYgKCFjb21wU3R5bGUgJiZcbiAgICAgICAgICAgICAgICAhaGlkZGVuUHJvcGVydHkgJiYgLy8gdGhpcyBjb3ZlcnMgZmFsc2UsIG51bGwsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIChoaWRkZW5BdHRyaWJ1dGUgPT09IG51bGwgfHwgaGlkZGVuQXR0cmlidXRlID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAgICAgIWhpZGRlblByb3BlcnR5Q3VzdG9tIC8vIFRoaXMgY292ZXJzIGZhbHNlLCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjb21wU3R5bGUgaXMgZGVmaW5lZCB3ZSBjaGVjayB0aGUgZm9sbG93aW5nOlxuICAgICAgICAgICAgLy8gIENTUyBzdHlsZSBkaXNwbGF5IHNldCB0byBub25lXG4gICAgICAgICAgICAvLyAgQ1NTIHN0eWxlIHZpc2liaWxpdHkgc2V0IHRvIGhpZGRlblxuICAgICAgICAgICAgLy8gICAgTm90ZTogRm9yIHRoaXMgcHJvcGVydHkgc2luY2UgaXQgaXMgaW5oZXJpdGVkLCBuZWVkIHRvIHNraXAgdGhlIGNoZWNrIG9uIHBhcmVudHMgYXNcbiAgICAgICAgICAgIC8vICAgICAgICAgIHRoZSBwYXJlbnQgY2FuIGhhdmUgaGlkZGVuIGJ1dCB0aGUgY2hpbGQgY2FuIGJlIHZpc2libGUuIFNvIHdlIG9ubHkgY2hlY2sgdGhpcyBwcm9wZXJ0eVxuICAgICAgICAgICAgLy8gICAgICAgICAgb24gY2hpbGQgZWxlbWVudHMvZWxlbWVudHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAgICAvLyAgbm9kZSBoaWRkZW4gcHJvcGVydHkgc2V0IChub2RlLmhpZGRlbilcbiAgICAgICAgICAgIC8vICBub2RlIGF0dHJpYnV0ZSBoaWRkZW4gc2V0ICh0byBhbnkgdmFsdWUpXG4gICAgICAgICAgICAvLyAgbm9kZSBjdXN0b20gaGlkZGVuIHByb3BlcnR5IHNlciAobm9kZS5QVF9OT0RFX0hJRERFTilcbiAgICAgICAgICAgIC8vIElmIGFueSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgdHJ1ZSB0aGVuIHdlIHJldHVybiBmYWxzZSBhcyB0aGlzIGVsZW1lbnQgaXMgbm90IHZpc2libGVcbiAgICAgICAgICAgIGlmICgoY29tcFN0eWxlICE9PSBudWxsICYmICgoY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8XG4gICAgICAgICAgICAgICAgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJWaXNpYmlsaXR5X0NoZWNrX1BhcmVudFwiLCBudWxsKSAmJiBjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndmlzaWJpbGl0eScpID09PSAnaGlkZGVuJykpKSB8fFxuICAgICAgICAgICAgICAgIChjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpICE9PSAnYmxvY2snICAmJiAoaGlkZGVuUHJvcGVydHkgfHwgaGlkZGVuQXR0cmlidXRlICE9IG51bGwgfHwgaGlkZGVuUHJvcGVydHlDdXN0b20pKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXQgYSBjdXN0b20gZXhwYW5kb3MgcHJvcGVydHkgb24gdGhlIHRoZSBub2RlIHRvIGlkZW50aWZ5IHRoYXQgaXQgaXMgaGlkZGVuLCBzbyB0aGF0IHdlIGNhbiB1c2VzXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoaXMgaW4gdGhlIHJ1bGVzIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBpcyBoaWRkZW4gb3Igbm90LCBpZiB3ZSBuZWVkIHRvLlxuICAgICAgICAgICAgICAgIC8vIFVzZSBleHBhbmRvcyBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGEgaGFzaCBtYXAgd2hpY2ggc3RvcmVzIHRoZSBlbGVtZW50cywgYWRkaW5nL2NoZWNraW5nIGV4cGFuZG9zXG4gICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBpcyBhIGxvdCBmYXN0ZXIgcGVyZm9ybWFuY2Ugd2hpc2UuIEZvciBIYXNoIG1hcCB3ZSBuZWVkIHRvIHN0b3JlIGJhc2VkIG9uIHhwYXRoLCBhbmQgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgLy8geHBhdGggaXQgaXMgbW9yZSBwZXJmb3JtYW5jZSBpbXBhY3QuXG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgY29udGVudC12aXNpYmlsaXR5OiBpZiB0aGUgY29udGVudC12aXNpYmlsaXR5IGlzIGhpZGRlbiwgdGhlbiwgcmV0dXJuIGZhbHNlIGFzIHRoZSBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoVmlzVXRpbC5pc0NvbnRlbnRIaWRkZW4obm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBoaWRkZW4gYnkgY2xpcC1wYXRoXG4gICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IGNvbnRhaW5zIGZvY3VzYWJsZSBlbGVtZW50cywgc2ltaWxhcmx5IHRvIG9mZnNjcmVlbiBjb250ZW50XG4gICAgICAgICAgICBpZiAoQ2xpcFBhdGhVdGlsLmlzTm9kZVZpc3VhbGx5SGlkZGVuQnlDbGlwUGF0aChub2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgIC8vIHRoZSBoaWRkZW4gQ1NTLCBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUuIE9ubHkga2VlcCBjaGVja2luZyB1bnRpbCB3ZSBhcmUgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgcGFyZW50Tm9kZVxuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuXG4gICAgICAgIC8vIElmIHRoZSBwYXJlbnQgbm9kZSBleGlzdHMgYW5kIHRoZSBub2RldHlwZSBpcyBlbGVtZW50ICgxKSwgdGhlbiBydW4gcmVjdXJzaXZlIGNhbGwgdG8gcGVyZm9ybSB0aGUgY2hlY2tcbiAgICAgICAgLy8gYWxsIHRoZSB3YXkgdXAgdG8gdGhlIHZlcnkgcGFyZW50IG5vZGUuIFVzZSByZWN1cnNpdmUgY2FsbCBoZXJlIGluc3RlYWQgb2YgYSB3aGlsZSBsb29wIHNvIHRoYXQgd2UgZG8gbm90XG4gICAgICAgIC8vIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgaWYgdGhlIG5vZGUgaXMgdmlzaWJsZSBvciBub3QgZm9yIGFsbCB0aGUgcGFyZW50cyBzdGFydGluZyB3aXRoXG4gICAgICAgIC8vIGNoaWxkIG5vZGUuXG4gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwgJiYgcGFyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIGEgcGFyZW50IGVsZW1lbnQgZ29pbmcgdGhyb3VnaCB0aGUgaXNOb2RlVmlzaWJsZSBmdW5jdGlvbiB3ZSBoYXZlIHRvIG1hcmsgaXQgYXMgc3VjaFxuICAgICAgICAgICAgLy8gc28gdGhhdCBpbiB0aGUgZnVuY3Rpb24gd2UgY2FuIHNraXAgY2hlY2tpbmcgdmlzaWJpbGl0eTogaGlkZGVuIGZvciBwYXJlbnQgZWxlbWVudHMgc2luY2UgdmlzaWJpbGl0eTogaGlkZGVuXG4gICAgICAgICAgICAvLyBpcyBpbmhlcml0ZWQsIHdoaWNoIGFsbG93cyBhIGNoaWxkIHRvIGhhdmUgYSBkaWZmZXJlbnQgc2V0dGluZyB0aGVuIHRoZSBjaGlsZC4gVGhpcyBwcm9wZXJ0eSBvbmx5IG5lZWRzIHRvIGJlIGNoZWNrZWRcbiAgICAgICAgICAgIC8vIG9uY2UgZm9yIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcGFzc2VkIGRvd24gYW5kIHRoYXQgaXMgYWxsLiBJZ25vcmUgaXQgZm9yIGFsbCB0aGUgcGFyZW50cyB0aGF0IHdlIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRFbGVtZW50IGFzIEVsZW1lbnQsIFwiVmlzaWJpbGl0eV9DaGVja19QYXJlbnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHVwd2FyZHMgcmVjdXJzaXZlbHksIGFuZCBzYXZlIHRoZSByZXN1bHRzIGluIGFuIHZhcmlhYmxlXG4gICAgICAgICAgICBsZXQgbm9kZVZpc2libGUgPSBWaXNVdGlsLmlzTm9kZVZpc2libGUocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIG5vdCBiZSB2aXNpYmxlIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ISURERU4gdG8gdHJ1ZS5cbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIGluIHRoZSBydWxlcy5cbiAgICAgICAgICAgIC8vIGlmICghbm9kZVZpc2libGUpIHtcbiAgICAgICAgICAgIC8vICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIG5vZGVWaXNpYmxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB0cnVlIChub2RlIGlzIHZpc2libGUpXG4gICAgICAgIHJldHVybiBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHZpc3VhbGx5IGhpZGRlbiBieSBjbGlwcGluZyBvciBvcGFxOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuOlxuICAgICAqICAgICAgIENTUyAtLT4gY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpXG4gICAgICogICAgICAgQ1NTIC0tPiBvcGFjaXR5OiAwXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSB2aXN1YWxseSBoaWRkZW4gdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSAobm9kZSBpcyBub3QgdmlzdWFsbHkgaGlkZGVuKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpIG9yIG9wYWNpdHk6MCBvciBmaWx0ZXI6b3BhY2l0eSgwJSksIG9yIHNpbWlsYXIgU1ZHIG1lY2hhbmlzbXM6IFxuICAgICAqICAgICAgVGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuIHRvIGFuIEFULiBUZXh0IGhpZGRlbiB3aXRoIHRoZXNlIG1ldGhvZHMgY2FuIHN0aWxsIGJlIHNlbGVjdGVkIG9yIGNvcGllZCwgXG4gICAgICogICAgICBhbmQgdXNlciBhZ2VudHMgc3RpbGwgZXhwb3NlIGl0IGluIHRoZWlyIGFjY2Vzc2liaWxpdHkgdHJlZXMuICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyB2aXN1YWxseSBoaWRkZW4gb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgdGhlIG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBWaXNVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXN1YWxseUhpZGRlbihub2RlOiBOb2RlKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvLyBTZXQgUFRfTk9ERV9ISURERU4gdG8gZmFsc2UgZm9yIGFsbCB0aGUgbm9kZXMsIGJlZm9yZSB0aGUgY2hlY2sgYW5kIHRoaXMgd2lsbCBiZSBjaGFuZ2VkIHRvXG4gICAgICAgIC8vIHRydWUgd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgbm9kZSBpcyBoaWRkZW4uIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgcnVsZXMgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICAgICAgICBjb25zdCBoaWRkZW4gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTlwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoaGlkZGVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGRlZmluZWQgc3R5bGVzIG9ubHkgZ2l2ZSB0aGUgc3R5bGVzIHRoYXQgY2hhbmdlZFxuICAgICAgICAgICAgY29uc3QgY29tcF9zdHlsZXMgPSBDU1NVdGlsLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBpZiAoKGNvbXBfc3R5bGVzWydwb3NpdGlvbiddPT09J2Fic29sdXRlJyAmJiBjb21wX3N0eWxlc1snY2xpcCddICYmIChjb21wX3N0eWxlc1snY2xpcCddIGFzIGFueSkucmVwbGFjZUFsbCgnICcsICcnKT09PSdyZWN0KDBweCwwcHgsMHB4LDBweCknKVxuICAgICAgICAgICAgICAgIHx8IChjb21wX3N0eWxlc1snb3BhY2l0eSddICYmIHBhcnNlRmxvYXQoY29tcF9zdHlsZXNbJ29wYWNpdHknXSkgPCAwLjEpKSAge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgICAgICAvLyB0aGUgaGlkZGVuIENTUywgcHJvcGVydHkgb3IgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgIC8vIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgY29uc3QgaGlkID0gVmlzVXRpbC5pc05vZGVWaXN1YWxseUhpZGRlbihwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIGhpZCk7XG4gICAgICAgICAgICByZXR1cm4gaGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaWRkZW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIGhpZGRlbiBieSBDU1MgY29udGVudC12aXNpYmlsaXR5OmhpZGRlblxuICAgICAqIEF0IHRoaXMgdGltZSwgQ1NTIGNvbnRlbnQtdmlzaWJpbGl0eSBpcyBwYXJ0aWFsbHkgc3VwcG9ydGVkIGJ5IENocm9tZSAmIEVkZ2UsIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3hcbiAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gVEVNUE9SQVJJTFkgZm9sbG93cyB0aGUgQ2hyb21lIHRlc3QgcmVzdWx0czpcbiAgICAgKiAgIGlmIGNvbnRlbnQtdmlzaWJpbGl0eTpoaWRkZW5cbiAgICAgKiAgICAgIGlmIHRoZSBlbGVtZW50IGlzIGJsb2NrLWxldmVsIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgaGlkZGVuO1xuICAgICAqICAgICAgaWYgdGhlIGVsZW1lbnQgaXMgaW5saW5lIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgTk9UIGhpZGRlbjsgXG4gICAgICogXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQ29udGVudEhpZGRlbihub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgICBcblxuICAgICAgICBjb25zdCBzdHlsZSA9ICBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRlbnRfdmlzaWJpbGl0eSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJjb250ZW50LXZpc2liaWxpdHlcIik7XG4gICAgICAgIGlmIChjb250ZW50X3Zpc2liaWxpdHkgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgICAgIH0gXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKTsgXG4gICAgICAgIC8vIGlubGluZSBlbGVtZW50IG9ubHlcbiAgICAgICAgaWYgKGRpc3BsYXkgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9ICBcbiAgICAgICAgXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfQ29udGVudEhpZGRlblwiLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaXMgb2Zmc2NyZWVuIGJ5IENTUyBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0VsZW1lbnRPZmZzY3JlZW4obm9kZTogSFRNTEVsZW1lbnQpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbm9kZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSAsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgXG5cbiAgICAgICAgY29uc3QgbWFwcGVyIDogRE9NTWFwcGVyID0gbmV3IERPTU1hcHBlcigpO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhub2RlKTsgXG4gICAgICAgIGlmICghYm91bmRzKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCB0cnVlKTsgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGJvdW5kc1snaGVpZ2h0J10gPT09IDAgfHwgYm91bmRzWyd3aWR0aCddID09PSAwIHx8IChib3VuZHNbJ3RvcCddK2JvdW5kc1snaGVpZ2h0J10pIDw9IDAgfHwgKGJvdW5kc1snbGVmdCddK2JvdW5kc1snd2lkdGgnXSkgPD0gMCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBcblxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBvciBpdHMgYW5jZXN0b3IgaXMgbmF0aXZlbHkgaGlkZGVuIG9yIGFyaWEtaGlkZGVuID0gJ3RydWUnXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUhpZGRlbkZyb21BVChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlzID0gQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgIFxuXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgbGV0IGFuY2VzdG9yID0gRE9NVXRpbC5nZXRBbmNlc3RvcldpdGhBdHRyaWJ1dGUobm9kZSwgXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hpZGRlbkZyb21BVFwiLCBmYWxzZSk7ICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIG5hdGl2ZWx5IGhpZGRlbiBvciBhcmlhLWhpZGRlbiA9ICd0cnVlJ1xuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVQcmVzZW50YXRpb25hbChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG5vZGUpO1xuICAgICAgICBpZiAocm9sZSAmJiAocm9sZSA9PT0gJ25vbmUnIHx8IHJvbGUgPT09ICdwcmVzZW50YXRpb24nKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBzY3JvbGxhYmxlXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRWxlbWVudFNjcm9sbGFibGUoZWxlbTogSFRNTEVsZW1lbnQpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcbiAgICAgICAgaWYgKCFzdHlsZXMpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgeF9zY3JvbGwgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cteCcpO1xuICAgICAgICBsZXQgeV9zY3JvbGwgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cteScpO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiYmVmb3JlIG5vZGU9XCIrIGVsZW0ubm9kZU5hbWUgK1wiLCBpZD1cIitlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpICtcIiwgeF9zY3JvbGw9XCIreF9zY3JvbGwgKyBcIiwgeV9zY3JvbGw9XCIreV9zY3JvbGwpO1xuIFxuICAgICAgICAvLyBJZiBvdmVyZmxvdy15IGlzIGhpZGRlbiwgc2Nyb2xsLCBvciBhdXRvLCBhbmQgdGhlIG92ZXJmbG93LXggcHJvcGVydHkgaXMgdmlzaWJsZSAoZGVmYXVsdCksIHRoZSB2YWx1ZSB3aWxsIGJlIGltcGxpY2l0bHkgY29tcHV0ZWQgYXMgYXV0by5cbiAgICAgICAgaWYgKHhfc2Nyb2xsID09PSAndmlzaWJsZScgJiYgKHlfc2Nyb2xsID09PSAnaGlkZGVuJyB8fCB5X3Njcm9sbCA9PT0gJ3Njcm9sbCcgfHwgeV9zY3JvbGwgPT09ICdhdXRvJykpXG4gICAgICAgICAgICB4X3Njcm9sbCA9ICdhdXRvJztcblxuICAgICAgICAvLyBJZiBvdmVyZmxvdy14IGlzIGhpZGRlbiwgc2Nyb2xsLCBvciBhdXRvIGFuZCB0aGUgb3ZlcmZsb3cteSBwcm9wZXJ0eSBpcyB2aXNpYmxlIChkZWZhdWx0KSwgdGhlIHZhbHVlIHdpbGwgYmUgaW1wbGljaXRseSBjb21wdXRlZCBhcyBhdXRvLlxuICAgICAgICBpZiAoeV9zY3JvbGwgPT09ICd2aXNpYmxlJyAmJiAoeF9zY3JvbGwgPT09ICdoaWRkZW4nIHx8IHhfc2Nyb2xsID09PSAnc2Nyb2xsJyB8fCB4X3Njcm9sbCA9PT0gJ2F1dG8nKSlcbiAgICAgICAgICAgIHlfc2Nyb2xsID0gJ2F1dG8nO1xuXG4gICAgICAgIC8vIHNldHRpbmcgb3ZlcmZsb3cgdG8gY2xpcCBpbiBvbmUgZGlyZWN0aW9uIHdoZW4gaXQgaXNuJ3Qgc2V0IHRvIHZpc2libGUgb3IgY2xpcCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uIHJlc3VsdHMgaW4gdGhlIGNsaXAgdmFsdWUgYmVoYXZpbmcgYXMgaGlkZGVuLiBcbiAgICAgICAgaWYgKHhfc2Nyb2xsID09PSAnY2xpcCcgJiYgeV9zY3JvbGwgIT09ICd2aXNpYmxlJyAmJiB5X3Njcm9sbCAhPT0gJ2NsaXAnKVxuICAgICAgICAgICAgeF9zY3JvbGwgPSAnaGlkZGVuJztcbiAgICAgICAgaWYgKHlfc2Nyb2xsID09PSAnY2xpcCcgJiYgeF9zY3JvbGwgIT09ICd2aXNpYmxlJyAmJiB4X3Njcm9sbCAhPT0gJ2NsaXAnKVxuICAgICAgICAgICAgeV9zY3JvbGwgPSAnaGlkZGVuJztcblxuICAgICAgICAvLyBub3Qgc2Nyb2xsYWJsZTogbm8gc2Nyb2xsIGJhcnNcbiAgICAgICAgaWYgKCh4X3Njcm9sbCA9PT0gJ3Zpc2libGUnIHx8IHhfc2Nyb2xsID09PSAnaGlkZGVuJyB8fCB4X3Njcm9sbCA9PT0gJ2NsaXAnKVxuICAgICAgICAgICAgJiYgKHlfc2Nyb2xsID09PSAndmlzaWJsZScgfHwgeV9zY3JvbGwgPT09ICdoaWRkZW4nIHx8IHlfc2Nyb2xsID09PSAnY2xpcCcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIGZhbHNlIGlmIHRoZSBvdmVyYWxsIHNjcm9sbGFibGUgZWxlbWVudCAoY2xpZW50V2lkdGggKyBzY3JvbGxiYXJXaWR0aCBhbmQgY2xpZW50SGVpZ2h0ICsgc2Nyb2xsYmFySGVpZ2h0KSBpcyB0b28gc21hbGwgdG8gYmUgdmlzaWJsZSBvbiBzY3JlZW5cbiAgICAgICAgaWYgKE1hdGgubWF4KGVsZW0ub2Zmc2V0V2lkdGgsIGVsZW0ub2Zmc2V0SGVpZ2h0KSA8IDMwIHx8IE1hdGgubWluKGVsZW0ub2Zmc2V0V2lkdGgsIGVsZW0ub2Zmc2V0SGVpZ2h0KSA8IDE1KSAgXG4gICAgICAgICAgIHJldHVybiBmYWxzZTsgXG5cbiAgICAgICAgLy8gZmFsc2UgaWYgY29udGVudCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNjcm9sbGFibGUgY29udGFpbmVyOiBib3RoIHggYW5kIHkgc2Nyb2xsIGRpc3RhbmNlcyA8IGVsZW1lbnQncyBob3Jpem9udGFsL3ZlcnRpY2FsIHBhZGRpbmdcbiAgICAgICAgY29uc3QgcGFkZGluZ194ID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVzLnBhZGRpbmdMZWZ0LCBlbGVtKSArIENTU1V0aWwuZ2V0UGl4ZWxzRnJvbVN0eWxlKHN0eWxlcy5wYWRkaW5nUmlnaHQsIGVsZW0pO1xuICAgICAgICBjb25zdCBwYWRkaW5nX3kgPSBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1RvcCwgZWxlbSkgKyBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ0JvdHRvbSwgZWxlbSk7XG4gICAgICAgIGlmIChlbGVtLnNjcm9sbFdpZHRoIC0gIGVsZW0uY2xpZW50V2lkdGggPCAxICsgcGFkZGluZ194IFxuICAgICAgICAgICAgJiYgZWxlbS5zY3JvbGxIZWlnaHQgLSAgZWxlbS5jbGllbnRIZWlnaHQgPCAxKyBwYWRkaW5nX3kpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufSIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbmNvbnN0IF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0Y29uc3QgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdGNvbnN0IG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0aWYgKCEobW9kdWxlSWQgaW4gX193ZWJwYWNrX21vZHVsZXNfXykpIHtcblx0XHRkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0XHRjb25zdCBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIG1vZHVsZUlkICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vdjIvY29tbW9uL0NvbnRleHRcIlxuLy8gaW1wb3J0IHsgU2ltdWxhdG9yIH0gZnJvbSBcIi4vdjIvc2ltdWxhdG9yXCJcbmltcG9ydCB7IENoZWNrZXIgfSBmcm9tIFwiLi92NC9jaGVja2VyL0NoZWNrZXJcIlxuZXhwb3J0IHsgQ2hlY2tlciB9XG5leHBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5leHBvcnQgeyBDb25maWcgfSBmcm9tIFwiLi92Mi9jb25maWcvQ29uZmlnXCI7XG5leHBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5leHBvcnQgeyBTUkNvbnRyb2xsZXIgfSBmcm9tIFwiLi92NC9zaW11bGF0b3IvU1JDb250cm9sbGVyXCI7XG5leHBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL3Y0L3NpbXVsYXRvci9TUkN1cnNvclwiO1xuZXhwb3J0IHsgU1JWaWV3ZXIgfSBmcm9tIFwiLi92NC9zaW11bGF0b3IvU1JWaWV3ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRGVtbyh0aW1lb3V0PzogbnVtYmVyKSB7XG4gICAgaWYgKCF0aW1lb3V0KSB0aW1lb3V0ID0gMDtcbiAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKCk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgY2hlY2tlci5jaGVjayhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0Rlc2lnblwiXSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVwb3J0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXBvcnQpO1xuICAgICAgICAgICAgY29uc3QgdmFscyA9IHtcbiAgICAgICAgICAgICAgICBcIkZBSUxcIjogMCxcbiAgICAgICAgICAgICAgICBcIlBPVEVOVElBTFwiOiAxLFxuICAgICAgICAgICAgICAgIFwiTUFOVUFMXCI6IDIsXG4gICAgICAgICAgICAgICAgXCJQQVNTXCI6IDNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8cmVwb3J0LnJlc3VsdHMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXBvcnQucmVzdWx0c1tpZHhdLnZhbHVlWzFdID09PSBcIlBBU1NcIikge1xuICAgICAgICAgICAgICAgICAgICByZXBvcnQucmVzdWx0cy5zcGxpY2UoaWR4LS0sMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVwb3J0LnJlc3VsdHMuc29ydCgoYSxiKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGEuY2F0ZWdvcnkgIT0gYi5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jYXRlZ29yeS5sb2NhbGVDb21wYXJlKGIuY2F0ZWdvcnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYS5wYXRoW1wiYXJpYVwiXSA9PT0gYi5wYXRoW1wiYXJpYVwiXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsc1thLnZhbHVlWzFdXS12YWxzW2IudmFsdWVbMV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYS5wYXRoW1wiYXJpYVwiXS5sb2NhbGVDb21wYXJlKGIucGF0aFtcImFyaWFcIl0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGxldCBsYXN0UGF0aCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgY2F0ZWdvcnkgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVwb3J0LnJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IHJlc3VsdC5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYXRoID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IHJlc3VsdC5jYXRlZ29yeTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChyZXN1bHQuY2F0ZWdvcnkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucGF0aFtcImFyaWFcIl0gIT0gbGFzdFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdFBhdGggPSByZXN1bHQucGF0aFtcImFyaWFcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UGF0aCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChcInBhZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKGxhc3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQudmFsdWUsIHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfSk7XG4gICAgfSwgdGltZW91dCk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= +new ace.SRViewer(); \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.09.02/js/ace-sr.js b/rule-server/src/static/archives/2026.09.02/js/ace-sr.js new file mode 100644 index 000000000..4493879e3 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/js/ace-sr.js @@ -0,0 +1,3 @@ +/*! For license information please see ace.js.LICENSE.txt */ +var ace;(()=>{"use strict";var e={9910(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIADefinitions=void 0;var i=function(){function e(){}return e.nameFromContent=function(t){return t in e.designPatterns&&e.designPatterns[t].nameFrom&&e.designPatterns[t].nameFrom.includes("contents")},e.globalProperties=["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-details","aria-flowto","aria-hidden","aria-keyshortcuts","aria-label","aria-labelledby","aria-live","aria-owns","aria-relevant","aria-roledescription","aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"],e.referenceProperties=["aria-owns","aria-controls","aria-describedby","aria-labelledby","aria-flowto","aria-activedescendant"],e.globalDeprecatedRoles=["directory","doc-biblioentry","doc-endnote"],e.globalDeprecatedProperties=["aria-grabbed","aria-dropeffect"],e.propertyDataTypes={"aria-activedescendant":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-atomic":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-autocomplete":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["inline","list","both","none","undefined"]},"aria-busy":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-checked":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-colcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-controls":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-current":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["page","step","location","date","time","true","false","undefined"]},"aria-describedby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-details":{type:"http://www.w3.org/2001/XMLSchema#idrefs"},"aria-disabled":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-dropeffect":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["copy","move","link","execute","popup","none"]},"aria-errormessage":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-expanded":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-flowto":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!1},"aria-grabbed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-haspopup":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","menu","listbox","tree","grid","dialog"]},"aria-hidden":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-invalid":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","spelling","grammar","undefined"]},"aria-keyshortcuts":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-label":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-labelledby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-level":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-live":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["off","polite","assertive"]},"aria-modal":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiline":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiselectable":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-orientation":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["horizontal","vertical","undefined"]},"aria-owns":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-placeholder":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-posinset":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-pressed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-readonly":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-relevant":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["additions","removals","text","all"]},"aria-required":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-roledescription":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-rowcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-selected":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-setsize":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-sort":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["ascending","descending","other","none"]},"aria-valuemax":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuemin":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuenow":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuetext":{type:"http://www.w3.org/2001/XMLSchema#string"}},e.designPatterns={alert:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},alertdialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},application:{container:null,props:["aria-activedescendant","aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"]},article:{container:null,props:["aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},banner:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},blockquote:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},button:{container:null,props:["aria-expanded","aria-pressed"],reqProps:null,reqChildren:null,htmlEquiv:"button | input[@type='button']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},caption:{container:["figure","grid","table","treegrid"],props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},cell:{container:["row"],props:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},checkbox:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='checkbox']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},code:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},columnheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='col']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},combobox:{container:null,props:["aria-controls","aria-activedescendant","aria-autocomplete","aria-readonly","aria-required"],reqProps:["aria-expanded"],reqChildren:[],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"]},complementary:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},comment:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},contentinfo:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},definition:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},deletion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},dialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},directory:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecated:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"doc-abstract":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-acknowledgments":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-afterword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-appendix":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-backlink":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-biblioentry":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!0,nameFrom:["author"]},"doc-bibliography":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-biblioref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-chapter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-colophon":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-conclusion":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-cover":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0},"doc-credit":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-credits":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-dedication":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-endnote":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-endnotes":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-epigraph":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-epilogue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-errata":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-example":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-footnote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-foreword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossary":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-index":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-introduction":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-noteref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-notice":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-pagebreak":{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0},"doc-pagelist":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pagefooter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-pageheader":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-part":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-preface":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-prologue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pullquote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-qna":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-subtitle":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"]},"doc-tip":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-toc":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},document:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},emphasis:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},feed:{container:null,props:null,reqProps:null,reqChildren:["article"],htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},figure:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},form:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"form",roleType:"landmark",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},generic:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"div | span",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby","aria-roledescription"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"graphics-document":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"]},"graphics-object":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!1,nameFrom:["author"]},"graphics-symbol":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},grid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-readonly","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:"table",roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},gridcell:{container:["row"],props:["aria-colindex","aria-colspan","aria-disabled","aria-errormessage","aria-expanded","aria-haspopup","aria-invalid","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"widget",nameFrom:["author","contents"]},group:{container:null,props:["aria-activedescendant"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},heading:{container:null,props:null,reqProps:["aria-level"],reqChildren:null,htmlEquiv:"h1 | h2 | h3 | h4 | h5 | h6",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},img:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},image:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},insertion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},link:{container:null,props:["aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},list:{container:null,props:null,reqProps:null,reqChildren:["listitem"],htmlEquiv:"ol | ul",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},listbox:{container:null,props:["aria-activedescendant","aria-expanded","aria-multiselectable","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["group","option"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},listitem:{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},log:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},main:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},mark:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"mark",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},marquee:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},math:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!1,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},menu:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menubar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menuitem:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemcheckbox:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemradio:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},meter:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},navigation:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},none:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},note:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},option:{container:["group","listbox"],props:["aria-selected","aria-checked","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"option",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},paragraph:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},presentation:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},progressbar:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},radio:{container:null,props:["aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='radio']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},radiogroup:{container:null,props:["aria-activedescendant","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["radio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},region:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},row:{container:["grid","rowgroup","table","treegrid"],props:["aria-activedescendant","aria-colindex","aria-expanded","aria-level","aria-posinset","aria-rowindex","aria-selected","aria-setsize"],reqProps:null,reqChildren:["cell","columnheader","gridcell","rowheader"],htmlEquiv:"tr",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},rowgroup:{container:["grid","table","treegrid"],props:[],reqProps:null,reqChildren:["row"],htmlEquiv:"tbody | tfoot | thead",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},rowheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='row']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},scrollbar:{container:null,props:["aria-orientation","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-controls","aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},search:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},searchbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='search']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},separator:{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},slider:{container:null,props:["aria-orientation","aria-readonly","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},spinbutton:{container:null,props:["aria-activedescendant","aria-readonly","aria-required","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},status:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},strong:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},subscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},suggestion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},superscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},switch:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},tab:{container:["tablist"],props:["aria-expanded","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},table:{container:null,props:["aria-colcount","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup","caption"],htmlEquiv:"table",roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tablist:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation"],reqProps:null,reqChildren:["tab"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tabpanel:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},term:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"dfn",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},textbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='text']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},time:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},timer:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},toolbar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tooltip:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tree:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation","aria-required"],reqProps:null,reqChildren:["group","treeitem"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treegrid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-orientation","aria-readonly","aria-required","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treeitem:{container:["group","tree"],props:["aria-checked","aria-expanded","aria-level","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]}},e.elementsAllowedDisabled=["button","input","select","textarea","optgroup","option","fieldset"],e.elementsAllowedRequired=["select","textarea"],e.elementsAllowedReadOnly=["textarea"],e.documentConformanceRequirement={abbr:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},address:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},article:{implicitRole:["article"],validRoles:["application","document","feed","main","none","presentation","region"],globalAriaAttributesValid:!0},aside:{implicitRole:["complementary"],validRoles:["doc-dedication","doc-example","doc-footnote","doc-glossary","doc-pullquote","doc-tip","feed","none","note","presentation","region","search"],globalAriaAttributesValid:!0},audio:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},b:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},base:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},bdi:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},bdo:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},blockquote:{implicitRole:["blockquote"],validRoles:["any"],globalAriaAttributesValid:!0},body:{implicitRole:["generic"],validRoles:null,otherDisallowedAriaAttributes:["aria-hidden"],globalAriaAttributesValid:!0},br:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},canvas:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},caption:{implicitRole:["caption"],validRoles:null,globalAriaAttributesValid:!0,allowAttributesFromImplicitRole:!1},cite:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},code:{implicitRole:["code"],validRoles:["any"],globalAriaAttributesValid:!0},col:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},colgroup:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},data:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},datalist:{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},dd:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},del:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0},details:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},dfn:{implicitRole:["term"],validRoles:["any"],globalAriaAttributesValid:!0},dialog:{implicitRole:["dialog"],validRoles:["alertdialog"],globalAriaAttributesValid:!0},dl:{implicitRole:null,validRoles:["group","list","none","presentation"],globalAriaAttributesValid:!0},dt:{implicitRole:["term"],validRoles:["listitem"],globalAriaAttributesValid:!0},em:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},embed:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},fieldset:{implicitRole:["group"],validRoles:["none","presentation","radiogroup"],globalAriaAttributesValid:!0},figcaption:{implicitRole:null,validRoles:["group","none","presentation"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},form:{implicitRole:["form"],validRoles:["none","presentation","search"],globalAriaAttributesValid:!0},head:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},hgroup:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},h1:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h2:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h3:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h4:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h5:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h6:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},hr:{implicitRole:["separator"],validRoles:["doc-pagebreak","none","presentation"],globalAriaAttributesValid:!0},html:{implicitRole:["document"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},i:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},iframe:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},ins:{implicitRole:["insertion"],validRoles:["any"],globalAriaAttributesValid:!0},kbd:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},label:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},legend:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},link:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},main:{implicitRole:["main"],validRoles:null,globalAriaAttributesValid:!0},map:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},mark:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},math:{implicitRole:["math"],validRoles:null,globalAriaAttributesValid:!0},menu:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},meta:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},meter:{implicitRole:["meter"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"],allowAttributesFromImplicitRole:!1},nav:{implicitRole:["navigation"],validRoles:["doc-index","doc-pagelist","doc-toc","menu","menubar","tablist","none","presentation"],globalAriaAttributesValid:!0},noscript:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},object:{implicitRole:null,validRoles:["application","document","img"],globalAriaAttributesValid:!0},ol:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},optgroup:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},option:{implicitRole:["option"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-selected"]},output:{implicitRole:["status"],validRoles:["any"],globalAriaAttributesValid:!0},p:{implicitRole:["paragraph"],validRoles:["any"],globalAriaAttributesValid:!0},param:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},picture:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},pre:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},progress:{implicitRole:["progressbar"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax"]},q:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},rp:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},rt:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},ruby:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},s:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-label","aria-labelledby"]},samp:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},script:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},search:{implicitRole:["search"],validRoles:["search","form","group","none","presentation","region"],globalAriaAttributesValid:!0},slot:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},small:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},source:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},span:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},strong:{implicitRole:["strong"],validRoles:["any"],globalAriaAttributesValid:!0},style:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},sub:{implicitRole:["subscript"],validRoles:["any"],globalAriaAttributesValid:!0},sup:{implicitRole:["superscript"],validRoles:["any"],globalAriaAttributesValid:!0},svg:{implicitRole:["graphics-document"],validRoles:["any"],globalAriaAttributesValid:!0},table:{implicitRole:["table"],validRoles:["any"],globalAriaAttributesValid:!0},template:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},textarea:{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0},tfoot:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},thead:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},time:{implicitRole:["time"],validRoles:["any"],globalAriaAttributesValid:!0},title:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},track:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},u:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},ul:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},var:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},video:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},wbr:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]}},e.documentConformanceRequirementSpecialTags={a:{"with-href":{implicitRole:["link"],validRoles:["button","checkbox","doc-backlink","doc-biblioref","doc-glossref","doc-noteref","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab","treeitem"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-disabled=true"]},"without-href":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},area:{"with-href":{implicitRole:["link"],validRoles:null,globalAriaAttributesValid:!0},"without-href":{implicitRole:["generic"],validRoles:["button","link"],globalAriaAttributesValid:!0}},div:{"child-dl":{implicitRole:["generic"],validRoles:["presentation","none"],globalAriaAttributesValid:!0},"no-child-dl":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},figure:{"child-figcaption":{implicitRole:["figure"],validRoles:["doc-example"],globalAriaAttributesValid:!0},"no-child-figcaption":{implicitRole:["figure"],validRoles:["any"],globalAriaAttributesValid:!0}},footer:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["contentinfo"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0}},header:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["banner"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0}},img:{"img-with-accname":{implicitRole:["img"],validRoles:["button","checkbox","doc-cover","link","menuitem","menuitemcheckbox","menuitemradio","meter","option","progressbar","radio","scrollbar","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"img-without-accname-empty-alt":{implicitRole:["presentation","none"],validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]},"img-without-accname-no-alt":{implicitRole:["img"],validRoles:["presentation","none"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]}},input:{button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"checkbox-with-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch","button"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},"checkbox-without-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},color:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},date:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"datetime-local":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},file:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"]},hidden:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},image:{implicitRole:["button"],validRoles:["checkbox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},month:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},number:{implicitRole:["spinbutton"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},password:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},radio:{implicitRole:["radio"],validRoles:["menuitemradio"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},range:{implicitRole:["slider"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"]},reset:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"search-no-list":{implicitRole:["searchbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"search-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},submit:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"tel-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"tel-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"text-no-list":{implicitRole:["textbox"],validRoles:["combobox","searchbox","spinbutton"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"text-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},time:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"url-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"url-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},week:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"default-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"default-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0}},li:{"child-of-list-role":{implicitRole:["listitem"],validRoles:null,globalAriaAttributesValid:!0},"no-child-of-list-role":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},section:{"with-name":{implicitRole:["region"],validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0},"without-name":{implicitRole:null,validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0}},select:{"no-multiple-attr-size-gt1":{implicitRole:["combobox"],validRoles:["menu"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]},"multiple-attr-size-gt1":{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]}},summary:{"first-summary-of-detail":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-disabled","aria-haspopup"]},"no-first-summary-of-detail":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tbody:{"des-table":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-grid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},td:{"des-table":{implicitRole:["cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},th:{"des-table-row-scope":{implicitRole:["rowheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-table-column-scope":{implicitRole:["columnheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-row-scope":{implicitRole:["rowheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-column-scope":{implicitRole:["columnheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tr:{"des-table":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},default:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},e.relatedAriaHtmlAttributes={"aria-checked":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["checked"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["checked"],htmlAttributeValues:null}]},"aria-disabled":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["disabled"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["disabled"],htmlAttributeValues:null}]},"aria-hidden":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]},{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["until-found"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]}]},"aria-placeholder":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["placeholder"],htmlAttributeValues:null}]},"aria-valuemax":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["max"],htmlAttributeValues:null}]},"aria-valuemin":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["min"],htmlAttributeValues:null}]},"aria-readonly":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"false","false"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"true","true"]}]},"aria-required":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["required"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["required"],htmlAttributeValues:null}]},"aria-colspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["colspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["colspan"],htmlAttributeValues:null}]},"aria-rowspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["rowspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["rowspan"],htmlAttributeValues:null}]}},e.containers=[],e}();t.ARIADefinitions=i;var a=[];for(var n in i.designPatterns){var r=i.designPatterns[n].container;if(null!==r)for(var l=0,o=r;l<o.length;l++){var s=o[l];-1==a.indexOf(s)&&a.push(s)}}i.containers=a},9955(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAMapper=void 0;var r=i(9910),l=i(3103),o=i(1686),s=i(7139),u=i(7011),d=i(5279),c=i(1560),m=i(4566),p=i(3864),h=i(1950),g=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.childrenCanHaveRole=function(e,t){return!(t in r.ARIADefinitions.designPatterns&&r.ARIADefinitions.designPatterns[t].presentationalChildren)},t.prototype.getRole=function(e){return t.nodeToRole(e)},t.prototype.getNamespace=function(){return"aria"},t.prototype.getAttributes=function(e){var i={};if(1===e.nodeType){var a=m.CacheUtil.getCache(e,"ARIAMapper::getAttributes",void 0);if(void 0!==a)return a;for(var n=e,r=0;r<n.attributes.length;++r){var l=n.attributes[r],o=l.name.toLowerCase();o.startsWith("aria-")&&(i[o.substring(5)]=l.nodeValue)}var s=e.nodeName.toLowerCase();t.applyAttrRole(n,"global",i),t.applyAttrRole(n,s,i),m.CacheUtil.setCache(e,"ARIAMapper::getAttributes",i)}else if(3===e.nodeType){var u=t.textAttrValueCalculators;for(var d in u){var c=u[d](e);null!=c&&(i[d]=c)}}return i},t.applyAttrRole=function(e,i,a){var n=t.elemAttrValueCalculators;if(i in n)for(var r in n[i])if(!(r in a)){var l=n[i][r];null!=l&&("string"!=typeof l&&(l=l(e)),a[r]=l)}},t.getAriaOwnedBy=function(e){var t=d.FragmentUtil.getOwnerFragment(e);if(!m.CacheUtil.getCache(t,"ARIAMapper::precalcOwned",!1)){for(var i=t.querySelectorAll("[aria-owns]"),a=0;a<i.length;++a)for(var n=i[a],r=n.getAttribute("aria-owns").split(/ +/g),l=function(e){var i=t.getElementById(r[e]);if(i&&!o.DOMUtil.sameNode(n,i)){for(var a=[],l=i.querySelectorAll("[aria-owns]"),s=0;s<l.length;++s)for(var u=l[s].getAttribute("aria-owns").split(/ +/g),d=0;d<u.length;++d){var c=t.getElementById(u[d]);c&&a.push(c)}if(0===a.length)return m.CacheUtil.setCache(i,"aria-owned",n),"continue";for(var h=n,g=!1;null!==h;){if(a.some(function(e){return o.DOMUtil.sameNode(h,e)})){g=!0;break}h=p.DOMWalker.parentElement(h)}g||m.CacheUtil.setCache(i,"aria-owned",n)}},s=0;s<r.length;++s)l(s);m.CacheUtil.setCache(t,"ARIAMapper::precalcOwned",!0)}return m.CacheUtil.getCache(e,"aria-owned",null)},t.prototype.getNodeHierarchy=function(e){if(!e)return[];if(1!==e.nodeType){for(var i=(s=this.getNodeHierarchy(p.DOMWalker.parentElement(e))).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0},a=[],n=0,r=s;n<r.length;n++){var l=r[n];a.push(l)}return a.push({attributes:{},bounds:this.getBounds(e),namespace:this.getNamespace(),node:e,role:this.getRole(e)||null,rolePath:i.rolePath+"/"+(this.getRole(e)||null),roleCount:{},childrenCanHaveRole:i.childrenCanHaveRole}),a}var o=e;if(!(a=m.CacheUtil.getCache(o,"ARIAMapper::getNodeHierarchy",null))){var s,u=t.getAriaOwnedBy(o);for(u||(u=p.DOMWalker.parentElement(o));u&&1!==u.nodeType;)u=p.DOMWalker.parentElement(o);for(i=(s=u?this.getNodeHierarchy(u):[]).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0};null===i.role;)i=(s=(u=t.getAriaOwnedBy(u)||p.DOMWalker.parentElement(u))?this.getNodeHierarchy(u):[])[s.length-1];var d={attributes:1===o.nodeType?this.getAttributes(o):{},bounds:this.getBounds(o),namespace:this.getNamespace(),node:o,role:this.getRole(o)||null,rolePath:"",roleCount:{},childrenCanHaveRole:!0};i.childrenCanHaveRole?d.childrenCanHaveRole=i.childrenCanHaveRole&&this.childrenCanHaveRole(o,d.role):d.role=null,null!==d.role?(i.roleCount[d.role]=(i.roleCount[d.role]||0)+1,d.rolePath=i.rolePath+"/"+d.role+"["+i.roleCount[d.role]+"]"):d.rolePath=i.rolePath,a=[];for(var c=0,h=s;c<h.length;c++)l=h[c],a.push(l);a.push(d),m.CacheUtil.setCache(o,"ARIAMapper::getNodeHierarchy",a)}return a},t.prototype.reset=function(e){t.nameComputationId=0,this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var i,a=e;i=p.DOMWalker.parentNode(a);)a=i;var n=new c.ARIAWalker(a,!1,a);do{1===n.node.nodeType&&this.getNodeHierarchy(n.node)}while(n.nextNode())},t.prototype.openScope=function(e){null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e);for(var t=0;t<this.hierarchyResults.length;++t)this.hierarchyResults[t].role&&"/"===this.hierarchyResults[t].role[0]&&(this.hierarchyResults[t].role=this.hierarchyResults[t].role?this.hierarchyResults[t].role.substring(1):null);return this.hierarchyResults},t.prototype.pushHierarchy=function(e){var t,i=(t=this.getNodeHierarchy(e))[t.length-1];this.hierarchyRole.push(i.role),null!==i.role&&this.hierarchyPath.push(i),this.hierarchyResults=t},t.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}if(t.length>0){t[t.length-1].role="/"+t[t.length-1].role;var r=p.DOMWalker.parentElement(e);this.hierarchyResults=r?m.CacheUtil.getCache(r,"ARIAMapper::getNodeInfo",[]):[]}return t},t.nodeToRole=function(e){if(3===e.nodeType)return"text";if(1!==e.nodeType)return null;var t=e;if(!t||1!==t.nodeType)return null;if(t.hasAttribute("role")&&t.getAttribute("role").trim().length>0)for(var i=0,a=t.getAttribute("role").trim().split(" ");i<a.length;i++){var n=a[i];if("presentation"===n||"none"===n){if(!s.CommonUtil.isFocusable(t))return null}else if(n in r.ARIADefinitions.designPatterns)return n}var l=u.AriaUtil.getImplicitRole(t),o=l&&0!==l.length?l[0]:null;return"presentation"===o||"none"===o?null:o},t.elemAttrValueCalculators={global:{name:function(e){var t;return null===(t=h.AccNameUtil.computeAccessibleName(e))||void 0===t?void 0:t.name}},datalist:{multiselectable:function(e){var t=e.getAttribute("id");return t&&t.length>0?(e.ownerDocument.querySelector("input[list='"+t+"']"),""+(e.getAttribute("multiple")&&("true"==e.getAttribute("multiple")||""==e.getAttribute("multiple")))):null}},h1:{level:"1"},h2:{level:"2"},h3:{level:"3"},h4:{level:"4"},h5:{level:"5"},h6:{level:"6"},input:{checked:function(e){var t=e.getAttribute("type");return"checkbox"===t||"radio"===t?""+e.checked:null},setsize:function(e){return null},posinset:function(e){return null},owns:function(e){return null}},keygen:{multiselectable:"false"},li:{setsize:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::otherlis",function(){return t.querySelectorAll("ol li, ul li, menu li")});return""+(i.length-a.length)},posinset:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;for(var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=0,n=0;n<i.length;++n){var r=i[n];if(o.DOMUtil.sameNode(t,o.DOMUtil.getAncestor(r,["ol","ul","menu"])))return""+a;++a}return null}},menuitem:{checked:function(e){return""+!(!e.getAttribute("checked")||"true"!=e.getAttribute("checked")&&""!=e.getAttribute("checked"))}},option:{selected:function(e){return""+!(!e.getAttribute("selected")||"true"!=e.getAttribute("selected")&&""!=e.getAttribute("selected"))}},progress:{valuemax:function(e){return e.getAttribute("max")||"1"},valuemin:function(e){return"0"},valuenow:function(e){return e.getAttribute("value")}}},t.textAttrValueCalculators={name:function(e){return e.nodeValue}},t.nameComputationId=0,t}(l.CommonMapper);t.ARIAMapper=g},1560(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAWalker=void 0;var a=i(5279),n=i(9955),r=i(3946),l=i(3864),o=function(){function e(e,t,i){this.root=i||e,9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,this.bEndTag=null!=t&&1==t}return e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var e=!1;do{if(e=!1,this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var t=this.node.slotOwner,i=this.node.slotIndex+1;i<t.assignedNodes().length?(this.node=t.assignedNodes()[i],this.bEndTag=!1):(this.node=t,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(l.DOMWalker.nextSiblingNotOwnedBySlot(this.node))this.node=l.DOMWalker.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var o=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var s=o.indexOf(this.node.getAttribute("id"));s===o.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[s+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!0}}else{var u=this.node,d=this.node,c=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&r.VisUtil.isNodeVisible(u)&&u.contentDocument&&u.contentDocument.documentElement){var m=this.node;this.node=u.contentDocument.documentElement,this.node.ownerElement=m}else 1===this.node.nodeType&&r.VisUtil.isNodeVisible(d)&&d.shadowRoot&&d.shadowRoot.firstChild?(m=this.node,this.node=d.shadowRoot,this.node.ownerElement=m,l.DOMWalker.assignSlots(this.node)):1===this.node.nodeType&&"slot"===d.nodeName.toLowerCase()&&c.assignedNodes().length>0?this.node=c.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!l.DOMWalker.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=l.DOMWalker.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e.prototype.prevNode=function(){var e=!1;do{if(e=!1,this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&r.VisUtil.isNodeVisible(t)&&t.contentDocument&&t.contentDocument.documentElement){var o=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=o}else 1===this.node.nodeType&&r.VisUtil.isNodeVisible(i)&&i.shadowRoot&&i.shadowRoot.lastChild?(o=this.node,this.node=i.shadowRoot,this.node.ownerElement=o,l.DOMWalker.assignSlots(this.node)):1!==this.node.nodeType&&11!==this.node.nodeType||!l.DOMWalker.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=l.DOMWalker.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(l.DOMWalker.previousSiblingNotOwnedBySlot(this.node))this.node=l.DOMWalker.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var s=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var u=s.indexOf(this.node.getAttribute("id"));u===s.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[u+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e}();t.ARIAWalker=o},6858(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AncestorUtil=void 0;var i=function(){function e(){}return e.isPresentationFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase()&&("presentation"===i.getAttribute("role")||"true"===i.getAttribute("aria-hidden")))return!0}return!1},e.isFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase())return!0}return!1},e}();t.AncestorUtil=i},5279(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FragmentUtil=void 0;var i=function(){function e(){}return e.getOwnerFragment=function(e){for(var t=e;t.parentNode&&(t=t.parentNode);)if(11===t.nodeType)return t;return e.ownerDocument},e.getById=function(e,t){return this.getOwnerFragment(e).getElementById(t)},e.getAncestor=function(e,t){var i=e.dom.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e.getAncestorWithRole=function(e,t){var i=e.aria.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e}();t.FragmentUtil=i},1043(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LangUtil=void 0;var i=[["aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","aaa","aab","aac","aad","aae","aaf","aag","aah","aai","aak","aal","aam","aan","aao","aap","aaq","aas","aat","aau","aav","aaw","aax","aaz","aba","abb","abc","abd","abe","abf","abg","abh","abi","abj","abl","abm","abn","abo","abp","abq","abr","abs","abt","abu","abv","abw","abx","aby","abz","aca","acb","acd","ace","acf","ach","aci","ack","acl","acm","acn","acp","acq","acr","acs","act","acu","acv","acw","acx","acy","acz","ada","adb","add","ade","adf","adg","adh","adi","adj","adl","adn","ado","adp","adq","adr","ads","adt","adu","adw","adx","ady","adz","aea","aeb","aec","aed","aee","aek","ael","aem","aen","aeq","aer","aes","aeu","aew","aey","aez","afa","afb","afd","afe","afg","afh","afi","afk","afn","afo","afp","afs","aft","afu","afz","aga","agb","agc","agd","age","agf","agg","agh","agi","agj","agk","agl","agm","agn","ago","agp","agq","agr","ags","agt","agu","agv","agw","agx","agy","agz","aha","ahb","ahg","ahh","ahi","ahk","ahl","ahm","ahn","aho","ahp","ahr","ahs","aht","aia","aib","aic","aid","aie","aif","aig","aih","aii","aij","aik","ail","aim","ain","aio","aip","aiq","air","ais","ait","aiw","aix","aiy","aja","ajg","aji","ajn","ajp","ajt","aju","ajw","ajz","akb","akc","akd","ake","akf","akg","akh","aki","akj","akk","akl","akm","ako","akp","akq","akr","aks","akt","aku","akv","akw","akx","aky","akz","ala","alc","ald","ale","alf","alg","alh","ali","alj","alk","all","alm","aln","alo","alp","alq","alr","als","alt","alu","alv","alw","alx","aly","alz","ama","amb","amc","ame","amf","amg","ami","amj","amk","aml","amm","amn","amo","amp","amq","amr","ams","amt","amu","amv","amw","amx","amy","amz","ana","anb","anc","and","ane","anf","ang","anh","ani","anj","ank","anl","anm","ann","ano","anp","anq","anr","ans","ant","anu","anv","anw","anx","any","anz","aoa","aob","aoc","aod","aoe","aof","aog","aoh","aoi","aoj","aok","aol","aom","aon","aor","aos","aot","aou","aox","aoz","apa","apb","apc","apd","ape","apf","apg","aph","api","apj","apk","apl","apm","apn","apo","app","apq","apr","aps","apt","apu","apv","apw","apx","apy","apz","aqa","aqc","aqd","aqg","aqk","aql","aqm","aqn","aqp","aqr","aqt","aqz","arb","arc","ard","are","arh","ari","arj","ark","arl","arn","aro","arp","arq","arr","ars","art","aru","arv","arw","arx","ary","arz","asa","asb","asc","asd","ase","asf","asg","ash","asi","asj","ask","asl","asn","aso","asp","asq","asr","ass","ast","asu","asv","asw","asx","asy","asz","ata","atb","atc","atd","ate","atg","ath","ati","atj","atk","atl","atm","atn","ato","atp","atq","atr","ats","att","atu","atv","atw","atx","aty","atz","aua","aub","auc","aud","aue","auf","aug","auh","aui","auj","auk","aul","aum","aun","auo","aup","auq","aur","aus","aut","auu","auw","aux","auy","auz","avb","avd","avi","avk","avl","avm","avn","avo","avs","avt","avu","avv","awa","awb","awc","awd","awe","awg","awh","awi","awk","awm","awn","awo","awr","aws","awt","awu","awv","aww","awx","awy","axb","axe","axg","axk","axl","axm","axx","aya","ayb","ayc","ayd","aye","ayg","ayh","ayi","ayk","ayl","ayn","ayo","ayp","ayq","ayr","ays","ayt","ayu","ayx","ayy","ayz","aza","azb","azc","azd","azg","azj","azm","azn","azo","azt","azz"],["ba","be","bg","bh","bi","bm","bn","bo","br","bs","baa","bab","bac","bad","bae","baf","bag","bah","bai","baj","bal","ban","bao","bap","bar","bas","bat","bau","bav","baw","bax","bay","baz","bba","bbb","bbc","bbd","bbe","bbf","bbg","bbh","bbi","bbj","bbk","bbl","bbm","bbn","bbo","bbp","bbq","bbr","bbs","bbt","bbu","bbv","bbw","bbx","bby","bbz","bca","bcb","bcc","bcd","bce","bcf","bcg","bch","bci","bcj","bck","bcl","bcm","bcn","bco","bcp","bcq","bcr","bcs","bct","bcu","bcv","bcw","bcy","bcz","bda","bdb","bdc","bdd","bde","bdf","bdg","bdh","bdi","bdj","bdk","bdl","bdm","bdn","bdo","bdp","bdq","bdr","bds","bdt","bdu","bdv","bdw","bdx","bdy","bdz","bea","beb","bec","bed","bee","bef","beg","beh","bei","bej","bek","bem","beo","bep","beq","ber","bes","bet","beu","bev","bew","bex","bey","bez","bfa","bfb","bfc","bfd","bfe","bff","bfg","bfh","bfi","bfj","bfk","bfl","bfm","bfn","bfo","bfp","bfq","bfr","bfs","bft","bfu","bfw","bfx","bfy","bfz","bga","bgb","bgc","bgd","bge","bgf","bgg","bgi","bgj","bgk","bgl","bgm","bgn","bgo","bgp","bgq","bgr","bgs","bgt","bgu","bgv","bgw","bgx","bgy","bgz","bha","bhb","bhc","bhd","bhe","bhf","bhg","bhh","bhi","bhj","bhk","bhl","bhm","bhn","bho","bhp","bhq","bhr","bhs","bht","bhu","bhv","bhw","bhx","bhy","bhz","bia","bib","bic","bid","bie","bif","big","bij","bik","bil","bim","bin","bio","bip","biq","bir","bit","biu","biv","biw","bix","biy","biz","bja","bjb","bjc","bjd","bje","bjf","bjg","bjh","bji","bjj","bjk","bjl","bjm","bjn","bjo","bjp","bjq","bjr","bjs","bjt","bju","bjv","bjw","bjx","bjy","bjz","bka","bkb","bkc","bkd","bkf","bkg","bkh","bki","bkj","bkk","bkl","bkm","bkn","bko","bkp","bkq","bkr","bks","bkt","bku","bkv","bkw","bkx","bky","bkz","bla","blb","blc","bld","ble","blf","blg","blh","bli","blj","blk","bll","blm","bln","blo","blp","blq","blr","bls","blt","blv","blw","blx","bly","blz","bma","bmb","bmc","bmd","bme","bmf","bmg","bmh","bmi","bmj","bmk","bml","bmm","bmn","bmo","bmp","bmq","bmr","bms","bmt","bmu","bmv","bmw","bmx","bmy","bmz","bna","bnb","bnc","bnd","bne","bnf","bng","bni","bnj","bnk","bnl","bnm","bnn","bno","bnp","bnq","bnr","bns","bnt","bnu","bnv","bnw","bnx","bny","bnz","boa","bob","boe","bof","bog","boh","boi","boj","bok","bol","bom","bon","boo","bop","boq","bor","bot","bou","bov","bow","box","boy","boz","bpa","bpb","bpd","bpe","bpg","bph","bpi","bpj","bpk","bpl","bpm","bpn","bpo","bpp","bpq","bpr","bps","bpt","bpu","bpv","bpw","bpx","bpy","bpz","bqa","bqb","bqc","bqd","bqf","bqg","bqh","bqi","bqj","bqk","bql","bqm","bqn","bqo","bqp","bqq","bqr","bqs","bqt","bqu","bqv","bqw","bqx","bqy","bqz","bra","brb","brc","brd","brf","brg","brh","bri","brj","brk","brl","brm","brn","bro","brp","brq","brr","brs","brt","bru","brv","brw","brx","bry","brz","bsa","bsb","bsc","bse","bsf","bsg","bsh","bsi","bsj","bsk","bsl","bsm","bsn","bso","bsp","bsq","bsr","bss","bst","bsu","bsv","bsw","bsx","bsy","bta","btb","btc","btd","bte","btf","btg","bth","bti","btj","btk","btl","btm","btn","bto","btp","btq","btr","bts","btt","btu","btv","btw","btx","bty","btz","bua","bub","buc","bud","bue","buf","bug","buh","bui","buj","buk","bum","bun","buo","bup","buq","bus","but","buu","buv","buw","bux","buy","buz","bva","bvb","bvc","bvd","bve","bvf","bvg","bvh","bvi","bvj","bvk","bvl","bvm","bvn","bvo","bvp","bvq","bvr","bvt","bvu","bvv","bvw","bvx","bvy","bvz","bwa","bwb","bwc","bwd","bwe","bwf","bwg","bwh","bwi","bwj","bwk","bwl","bwm","bwn","bwo","bwp","bwq","bwr","bws","bwt","bwu","bww","bwx","bwy","bwz","bxa","bxb","bxc","bxd","bxe","bxf","bxg","bxh","bxi","bxj","bxk","bxl","bxm","bxn","bxo","bxp","bxq","bxr","bxs","bxu","bxv","bxw","bxx","bxz","bya","byb","byc","byd","bye","byf","byg","byh","byi","byj","byk","byl","bym","byn","byo","byp","byq","byr","bys","byt","byv","byw","byx","byy","byz","bza","bzb","bzc","bzd","bze","bzf","bzg","bzh","bzi","bzj","bzk","bzl","bzm","bzn","bzo","bzp","bzq","bzr","bzs","bzt","bzu","bzv","bzw","bzx","bzy","bzz"],["ca","ce","ch","co","cr","cs","cu","cv","cy","caa","cab","cac","cad","cae","caf","cag","cah","cai","caj","cak","cal","cam","can","cao","cap","caq","car","cas","cau","cav","caw","cax","cay","caz","cba","cbb","cbc","cbd","cbe","cbg","cbh","cbi","cbj","cbk","cbl","cbn","cbo","cbq","cbr","cbs","cbt","cbu","cbv","cbw","cby","cca","ccc","ccd","cce","ccg","cch","ccj","ccl","ccm","ccn","cco","ccp","ccq","ccr","ccs","cda","cdc","cdd","cde","cdf","cdg","cdh","cdi","cdj","cdm","cdn","cdo","cdr","cds","cdy","cdz","cea","ceb","ceg","cek","cel","cen","cet","cey","cfa","cfd","cfg","cfm","cga","cgc","cgg","cgk","chb","chc","chd","chf","chg","chh","chj","chk","chl","chm","chn","cho","chp","chq","chr","cht","chw","chx","chy","chz","cia","cib","cic","cid","cie","cih","cik","cim","cin","cip","cir","ciw","ciy","cja","cje","cjh","cji","cjk","cjm","cjn","cjo","cjp","cjr","cjs","cjv","cjy","cka","ckb","ckh","ckl","ckm","ckn","cko","ckq","ckr","cks","ckt","cku","ckv","ckx","cky","ckz","cla","clc","cld","cle","clh","cli","clj","clk","cll","clm","clo","clt","clu","clw","cly","cma","cmc","cme","cmg","cmi","cmk","cml","cmm","cmn","cmo","cmr","cms","cmt","cna","cnb","cnc","cng","cnh","cni","cnk","cnl","cno","cnp","cnr","cns","cnt","cnu","cnw","cnx","coa","cob","coc","cod","coe","cof","cog","coh","coj","cok","col","com","con","coo","cop","coq","cot","cou","cov","cow","cox","coy","coz","cpa","cpb","cpc","cpe","cpf","cpg","cpi","cpn","cpo","cpp","cps","cpu","cpx","cpy","cqd","cqu","cra","crb","crc","crd","crf","crg","crh","cri","crj","crk","crl","crm","crn","cro","crp","crq","crr","crs","crt","crv","crw","crx","cry","crz","csa","csb","csc","csd","cse","csf","csg","csh","csi","csj","csk","csl","csm","csn","cso","csp","csq","csr","css","cst","csu","csv","csw","csx","csy","csz","cta","ctc","ctd","cte","ctg","cth","ctl","ctm","ctn","cto","ctp","cts","ctt","ctu","cty","ctz","cua","cub","cuc","cug","cuh","cui","cuj","cuk","cul","cum","cuo","cup","cuq","cur","cus","cut","cuu","cuv","cuw","cux","cuy","cvg","cvn","cwa","cwb","cwd","cwe","cwg","cwt","cya","cyb","cyo","czh","czk","czn","czo","czt"],["da","de","dv","dz","daa","dac","dad","dae","daf","dag","dah","dai","daj","dak","dal","dam","dao","dap","daq","dar","das","dau","dav","daw","dax","day","daz","dba","dbb","dbd","dbe","dbf","dbg","dbi","dbj","dbl","dbm","dbn","dbo","dbp","dbq","dbr","dbt","dbu","dbv","dbw","dby","dcc","dcr","dda","ddd","dde","ddg","ddi","ddj","ddn","ddo","ddr","dds","ddw","dec","ded","dee","def","deg","deh","dei","dek","del","dem","den","dep","deq","der","des","dev","dez","dga","dgb","dgc","dgd","dge","dgg","dgh","dgi","dgk","dgl","dgn","dgo","dgr","dgs","dgt","dgu","dgw","dgx","dgz","dha","dhd","dhg","dhi","dhl","dhm","dhn","dho","dhr","dhs","dhu","dhv","dhw","dhx","dia","dib","dic","did","dif","dig","dih","dii","dij","dik","dil","dim","din","dio","dip","diq","dir","dis","dit","diu","diw","dix","diy","diz","dja","djb","djc","djd","dje","djf","dji","djj","djk","djl","djm","djn","djo","djr","dju","djw","dka","dkg","dkk","dkl","dkr","dks","dkx","dlg","dlk","dlm","dln","dma","dmb","dmc","dmd","dme","dmf","dmg","dmk","dml","dmm","dmn","dmo","dmr","dms","dmu","dmv","dmw","dmx","dmy","dna","dnd","dne","dng","dni","dnj","dnk","dnn","dno","dnr","dnt","dnu","dnv","dnw","dny","doa","dob","doc","doe","dof","doh","doi","dok","dol","don","doo","dop","doq","dor","dos","dot","dov","dow","dox","doy","doz","dpp","dra","drb","drc","drd","dre","drg","drh","dri","drl","drn","dro","drq","drr","drs","drt","dru","drw","dry","dsb","dse","dsh","dsi","dsl","dsn","dso","dsq","dta","dtb","dtd","dth","dti","dtk","dtm","dtn","dto","dtp","dtr","dts","dtt","dtu","dty","dua","dub","duc","dud","due","duf","dug","duh","dui","duj","duk","dul","dum","dun","duo","dup","duq","dur","dus","duu","duv","duw","dux","duy","duz","dva","dwa","dwk","dwl","dwr","dws","dwu","dww","dwy","dwz","dya","dyb","dyd","dyg","dyi","dym","dyn","dyo","dyu","dyy","dza","dzd","dze","dzg","dzl","dzn"],["ee","el","en","eo","es","et","eu","eaa","ebc","ebg","ebk","ebo","ebr","ebu","ecr","ecs","ecy","eee","efa","efe","efi","ega","egl","ego","egx","egy","ehs","ehu","eip","eit","eiv","eja","eka","ekc","eke","ekg","eki","ekk","ekl","ekm","eko","ekp","ekr","eky","ele","elh","eli","elk","elm","elo","elp","elu","elx","ema","emb","eme","emg","emi","emk","emm","emn","emo","emp","emq","ems","emu","emw","emx","emy","emz","ena","enb","enc","end","enf","enh","enl","enm","enn","eno","enq","enr","enu","env","enw","enx","eot","epi","era","erg","erh","eri","erk","ero","err","ers","ert","erw","ese","esg","esh","esi","esk","esl","esm","esn","eso","esq","ess","esu","esx","esy","etb","etc","eth","etn","eto","etr","ets","ett","etu","etx","etz","euq","eve","evh","evn","ewo","ext","eya","eyo","eza","eze"],["fa","ff","fi","fj","fo","fr","fy","faa","fab","fad","faf","fag","fah","fai","faj","fak","fal","fam","fan","fap","far","fat","fau","fax","fay","faz","fbl","fcs","fer","ffi","ffm","fgr","fia","fie","fif","fil","fip","fir","fit","fiu","fiw","fkk","fkv","fla","flh","fli","fll","fln","flr","fly","fmp","fmu","fnb","fng","fni","fod","foi","fom","fon","for","fos","fox","fpe","fqs","frc","frd","frk","frm","fro","frp","frq","frr","frs","frt","fse","fsl","fss","fub","fuc","fud","fue","fuf","fuh","fui","fuj","fum","fun","fuq","fur","fut","fuu","fuv","fuy","fvr","fwa","fwe"],["ga","gd","gl","gn","gu","gv","gaa","gab","gac","gad","gae","gaf","gag","gah","gai","gaj","gak","gal","gam","gan","gao","gap","gaq","gar","gas","gat","gau","gav","gaw","gax","gay","gaz","gba","gbb","gbc","gbd","gbe","gbf","gbg","gbh","gbi","gbj","gbk","gbl","gbm","gbn","gbo","gbp","gbq","gbr","gbs","gbu","gbv","gbw","gbx","gby","gbz","gcc","gcd","gce","gcf","gcl","gcn","gcr","gct","gda","gdb","gdc","gdd","gde","gdf","gdg","gdh","gdi","gdj","gdk","gdl","gdm","gdn","gdo","gdq","gdr","gds","gdt","gdu","gdx","gea","geb","gec","ged","gef","geg","geh","gei","gej","gek","gel","gem","geq","ges","gev","gew","gex","gey","gez","gfk","gft","gfx","gga","ggb","ggd","gge","ggg","ggk","ggl","ggn","ggo","ggr","ggt","ggu","ggw","gha","ghc","ghe","ghh","ghk","ghl","ghn","gho","ghr","ghs","ght","gia","gib","gic","gid","gie","gig","gih","gii","gil","gim","gin","gio","gip","giq","gir","gis","git","giu","giw","gix","giy","giz","gji","gjk","gjm","gjn","gjr","gju","gka","gkd","gke","gkn","gko","gkp","gku","glb","glc","gld","glh","gli","glj","glk","gll","glo","glr","glu","glw","gly","gma","gmb","gmd","gme","gmg","gmh","gml","gmm","gmn","gmq","gmr","gmu","gmv","gmw","gmx","gmy","gmz","gna","gnb","gnc","gnd","gne","gng","gnh","gni","gnj","gnk","gnl","gnm","gnn","gno","gnq","gnr","gnt","gnu","gnw","gnz","goa","gob","goc","god","goe","gof","gog","goh","goi","goj","gok","gol","gom","gon","goo","gop","goq","gor","gos","got","gou","gow","gox","goy","goz","gpa","gpe","gpn","gqa","gqi","gqn","gqr","gqu","gra","grb","grc","grd","grg","grh","gri","grj","grk","grm","gro","grq","grr","grs","grt","gru","grv","grw","grx","gry","grz","gse","gsg","gsl","gsm","gsn","gso","gsp","gss","gsw","gta","gti","gtu","gua","gub","guc","gud","gue","guf","gug","guh","gui","guk","gul","gum","gun","guo","gup","guq","gur","gus","gut","guu","guv","guw","gux","guz","gva","gvc","gve","gvf","gvj","gvl","gvm","gvn","gvo","gvp","gvr","gvs","gvy","gwa","gwb","gwc","gwd","gwe","gwf","gwg","gwi","gwj","gwm","gwn","gwr","gwt","gwu","gww","gwx","gxx","gya","gyb","gyd","gye","gyf","gyg","gyi","gyl","gym","gyn","gyo","gyr","gyy","gyz","gza","gzi","gzn"],["ha","he","hi","ho","hr","ht","hu","hy","hz","haa","hab","hac","had","hae","haf","hag","hah","hai","haj","hak","hal","ham","han","hao","hap","haq","har","has","hav","haw","hax","hay","haz","hba","hbb","hbn","hbo","hbu","hca","hch","hdn","hds","hdy","hea","hed","heg","heh","hei","hem","hgm","hgw","hhi","hhr","hhy","hia","hib","hid","hif","hig","hih","hii","hij","hik","hil","him","hio","hir","hit","hiw","hix","hji","hka","hke","hkh","hkk","hkn","hks","hla","hlb","hld","hle","hlt","hlu","hma","hmb","hmc","hmd","hme","hmf","hmg","hmh","hmi","hmj","hmk","hml","hmm","hmn","hmp","hmq","hmr","hms","hmt","hmu","hmv","hmw","hmx","hmy","hmz","hna","hnd","hne","hng","hnh","hni","hnj","hnn","hno","hns","hnu","hoa","hob","hoc","hod","hoe","hoh","hoi","hoj","hok","hol","hom","hoo","hop","hor","hos","hot","hov","how","hoy","hoz","hpo","hps","hra","hrc","hre","hrk","hrm","hro","hrp","hrr","hrt","hru","hrw","hrx","hrz","hsb","hsh","hsl","hsn","hss","hti","hto","hts","htu","htx","hub","huc","hud","hue","huf","hug","huh","hui","huj","huk","hul","hum","huo","hup","huq","hur","hus","hut","huu","huv","huw","hux","huy","huz","hvc","hve","hvk","hvn","hvv","hwa","hwc","hwo","hya","hyw","hyx"],["ia","id","ie","ig","ii","ik","in","io","is","it","iu","iw","iai","ian","iap","iar","iba","ibb","ibd","ibe","ibg","ibh","ibi","ibl","ibm","ibn","ibr","ibu","iby","ica","ich","icl","icr","ida","idb","idc","idd","ide","idi","idr","ids","idt","idu","ifa","ifb","ife","iff","ifk","ifm","ifu","ify","igb","ige","igg","igl","igm","ign","igo","igs","igw","ihb","ihi","ihp","ihw","iin","iir","ijc","ije","ijj","ijn","ijo","ijs","ike","iki","ikk","ikl","iko","ikp","ikr","iks","ikt","ikv","ikw","ikx","ikz","ila","ilb","ilg","ili","ilk","ill","ilm","ilo","ilp","ils","ilu","ilv","ilw","ima","ime","imi","iml","imn","imo","imr","ims","imy","inb","inc","ine","ing","inh","inj","inl","inm","inn","ino","inp","ins","int","inz","ior","iou","iow","ipi","ipo","iqu","iqw","ira","ire","irh","iri","irk","irn","iro","irr","iru","irx","iry","isa","isc","isd","ise","isg","ish","isi","isk","ism","isn","iso","isr","ist","isu","itb","itc","itd","ite","iti","itk","itl","itm","ito","itr","its","itt","itv","itw","itx","ity","itz","ium","ivb","ivv","iwk","iwm","iwo","iws","ixc","ixl","iya","iyo","iyx","izh","izi","izr","izz"],["ja","ji","jv","jw","jaa","jab","jac","jad","jae","jaf","jah","jaj","jak","jal","jam","jan","jao","jaq","jar","jas","jat","jau","jax","jay","jaz","jbe","jbi","jbj","jbk","jbm","jbn","jbo","jbr","jbt","jbu","jbw","jcs","jct","jda","jdg","jdt","jeb","jee","jeg","jeh","jei","jek","jel","jen","jer","jet","jeu","jgb","jge","jgk","jgo","jhi","jhs","jia","jib","jic","jid","jie","jig","jih","jii","jil","jim","jio","jiq","jit","jiu","jiv","jiy","jje","jjr","jka","jkm","jko","jkp","jkr","jks","jku","jle","jls","jma","jmb","jmc","jmd","jmi","jml","jmn","jmr","jms","jmw","jmx","jna","jnd","jng","jni","jnj","jnl","jns","job","jod","jog","jor","jos","jow","jpa","jpr","jpx","jqr","jra","jrb","jrr","jrt","jru","jsl","jua","jub","juc","jud","juh","jui","juk","jul","jum","jun","juo","jup","jur","jus","jut","juu","juw","juy","jvd","jvn","jwi","jya","jye","jyy"],["ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","kaa","kab","kac","kad","kae","kaf","kag","kah","kai","kaj","kak","kam","kao","kap","kaq","kar","kav","kaw","kax","kay","kba","kbb","kbc","kbd","kbe","kbf","kbg","kbh","kbi","kbj","kbk","kbl","kbm","kbn","kbo","kbp","kbq","kbr","kbs","kbt","kbu","kbv","kbw","kbx","kby","kbz","kca","kcb","kcc","kcd","kce","kcf","kcg","kch","kci","kcj","kck","kcl","kcm","kcn","kco","kcp","kcq","kcr","kcs","kct","kcu","kcv","kcw","kcx","kcy","kcz","kda","kdc","kdd","kde","kdf","kdg","kdh","kdi","kdj","kdk","kdl","kdm","kdn","kdo","kdp","kdq","kdr","kdt","kdu","kdv","kdw","kdx","kdy","kdz","kea","keb","kec","ked","kee","kef","keg","keh","kei","kej","kek","kel","kem","ken","keo","kep","keq","ker","kes","ket","keu","kev","kew","kex","key","kez","kfa","kfb","kfc","kfd","kfe","kff","kfg","kfh","kfi","kfj","kfk","kfl","kfm","kfn","kfo","kfp","kfq","kfr","kfs","kft","kfu","kfv","kfw","kfx","kfy","kfz","kga","kgb","kgc","kgd","kge","kgf","kgg","kgh","kgi","kgj","kgk","kgl","kgm","kgn","kgo","kgp","kgq","kgr","kgs","kgt","kgu","kgv","kgw","kgx","kgy","kha","lyg","khb","khc","khd","khe","khf","khg","khh","khi","khj","khk","khl","khn","kho","khp","khq","khr","khs","kht","khu","khv","khw","khx","khy","khz","kia","kib","kic","kid","kie","kif","kig","kih","kii","kij","kil","kim","kio","kip","kiq","kis","kit","kiu","kiv","kiw","kix","kiy","kiz","kja","kjb","kjc","kjd","kje","kjf","kjg","kjh","kji","kjj","kjk","kjl","kjm","kjn","kjo","kjp","kjq","kjr","kjs","kjt","kju","kjv","kjx","kjy","kjz","kka","kkb","kkc","kkd","kke","kkf","kkg","kkh","kki","kkj","kkk","kkl","kkm","kkn","kko","kkp","kkq","kkr","kks","kkt","kku","kkv","kkw","kkx","kky","kkz","kla","klb","klc","kld","kle","klf","klg","klh","kli","klj","klk","kll","klm","kln","klo","klp","klq","klr","kls","klt","klu","klv","klw","klx","kly","klz","kma","kmb","kmc","kmd","kme","kmf","kmg","kmh","kmi","kmj","kmk","kml","kmm","kmn","kmo","kmp","kmq","kmr","kms","kmt","kmu","kmv","kmw","kmx","kmy","kmz","kna","knb","knc","knd","kne","knf","kng","kni","knj","knk","knl","knm","knn","kno","knp","knq","knr","kns","knt","knu","knv","knw","knx","kny","knz","koa","koc","kod","koe","kof","kog","koh","koi","koj","kok","kol","koo","kop","koq","kos","kot","kou","kov","kow","kox","koy","koz","kpa","kpb","kpc","kpd","kpe","kpf","kpg","kph","kpi","kpj","kpk","kpl","kpm","kpn","kpo","kpp","kpq","kpr","kps","kpt","kpu","kpv","kpw","kpx","kpy","kpz","kqa","kqb","kqc","kqd","kqe","kqf","kqg","kqh","kqi","kqj","kqk","kql","kqm","kqn","kqo","kqp","kqq","kqr","kqs","kqt","kqu","kqv","kqw","kqx","kqy","kqz","kra","krb","krc","krd","kre","krf","krh","kri","krj","krk","krl","krm","krn","kro","krp","krr","krs","krt","kru","krv","krw","krx","kry","krz","ksa","ksb","ksc","ksd","kse","ksf","ksg","ksh","ksi","ksj","ksk","ksl","ksm","ksn","kso","ksp","ksq","ksr","kss","kst","ksu","ksv","ksw","ksx","ksy","ksz","kta","ktb","ktc","ktd","kte","ktf","ktg","kth","kti","ktj","ktk","ktl","ktm","ktn","kto","ktp","ktq","ktr","kts","ktt","ktu","ktv","ktw","ktx","kty","ktz","kub","kuc","kud","kue","kuf","kug","kuh","kui","kuj","kuk","kul","kum","kun","kuo","kup","kuq","kus","kut","kuu","kuv","kuw","kux","kuy","kuz","kva","kvb","kvc","kvd","kve","kvf","kvg","kvh","kvi","kvj","kvk","kvl","kvm","kvn","kvo","kvp","kvq","kvr","kvs","kvt","kvu","kvv","kvw","kvx","kvy","kvz","kwa","kwb","kwc","kwd","kwe","kwf","kwg","kwh","kwi","kwj","kwk","kwl","kwm","kwn","kwo","kwp","kwq","kwr","kws","kwt","kwu","kwv","kww","kwx","kwy","kwz","kxa","kxb","kxc","kxd","kxe","kxf","kxh","kxi","kxj","kxk","kxl","kxm","kxn","kxo","kxp","kxq","kxr","kxs","kxt","kxu","kxv","kxw","kxx","kxy","kxz","kya","kyb","kyc","kyd","kye","kyf","kyg","kyh","kyi","kyj","kyk","kyl","kym","kyn","kyo","kyp","kyq","kyr","kys","kyt","kyu","kyv","kyw","kyx","kyy","kyz","kza","kzb","kzc","kzd","kze","kzf","kzg","kzh","kzi","kzj","kzk","kzl","kzm","kzn","kzo","kzp","kzq","kzr","kzs","kzt","kzu","kzv","kzw","kzx","kzy","kzz"],["la","lb","lg","li","ln","lo","lt","lu","lv","laa","lab","lac","lad","lae","laf","lag","lah","lai","laj","lak","lal","lam","lan","lap","laq","lar","las","lau","law","lax","lay","laz","lba","lbb","lbc","lbe","lbf","lbg","lbi","lbj","lbk","lbl","lbm","lbn","lbo","lbq","lbr","lbs","lbt","lbu","lbv","lbw","lbx","lby","lbz","lcc","lcd","lce","lcf","lch","lcl","lcm","lcp","lcq","lcs","lda","ldb","ldd","ldg","ldh","ldi","ldj","ldk","ldl","ldm","ldn","ldo","ldp","ldq","lea","leb","lec","led","lee","lef","leg","leh","lei","lej","lek","lel","lem","len","leo","lep","leq","ler","les","let","leu","lev","lew","lex","ley","lez","lfa","lfn","lga","lgb","lgg","lgh","lgi","lgk","lgl","lgm","lgn","lgq","lgr","lgt","lgu","lgz","lha","lhh","lhi","lhl","lhm","lhn","lhp","lhs","lht","lhu","lia","lib","lic","lid","lie","lif","lig","lih","lii","lij","lik","lil","lio","lip","liq","lir","lis","liu","liv","liw","lix","liy","liz","lja","lje","lji","ljl","ljp","ljw","ljx","lka","lkb","lkc","lkd","lke","lkh","lki","lkj","lkl","lkm","lkn","lko","lkr","lks","lkt","lku","lky","lla","llb","llc","lld","lle","llf","llg","llh","lli","llj","llk","lll","llm","lln","llo","llp","llq","lls","llu","llx","lma","lmb","lmc","lmd","lme","lmf","lmg","lmh","lmi","lmj","lmk","lml","lmm","lmn","lmo","lmp","lmq","lmr","lmu","lmv","lmw","lmx","lmy","lmz","lna","lnb","lnd","lng","lnh","lni","lnj","lnl","lnm","lnn","lno","lns","lnu","lnw","lnz","loa","lob","loc","loe","lof","log","loh","loi","loj","lok","lol","lom","lon","loo","lop","loq","lor","los","lot","lou","lov","low","lox","loy","loz","lpa","lpe","lpn","lpo","lpx","lra","lrc","lre","lrg","lri","lrk","lrl","lrm","lrn","lro","lrr","lrt","lrv","lrz","lsa","lsb","lsd","lse","lsg","lsh","lsi","lsl","lsm","lsn","lso","lsp","lsr","lss","lst","lsv","lsy","ltc","ltg","lth","lti","ltn","lto","lts","ltu","lua","luc","lud","lue","luf","lui","luj","luk","lul","lum","lun","luo","lup","luq","lur","lus","lut","luu","luv","luw","luy","luz","lva","lvi","lvk","lvs","lvu","lwa","lwe","lwg","lwh","lwl","lwm","lwo","lws","lwt","lwu","lww","lxm","lya","lyg","lyn","lzh","lzl","lzn","lzz"],["mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","maa","mab","mad","mae","maf","mag","mai","maj","mak","mam","man","map","maq","mas","mat","mau","mav","maw","max","maz","mba","mbb","mbc","mbd","mbe","mbf","mbh","mbi","mbj","mbk","mbl","mbm","mbn","mbo","mbp","mbq","mbr","mbs","mbt","mbu","mbv","mbw","mbx","mby","mbz","mca","mcb","mcc","mcd","mce","mcf","mcg","mch","mci","mcj","mck","mcl","mcm","mcn","mco","mcp","mcq","mcr","mcs","mct","mcu","mcv","mcw","mcx","mcy","mcz","mda","mdb","mdc","mdd","mde","mdf","mdg","mdh","mdi","mdj","mdk","mdl","mdm","mdn","mdp","mdq","mdr","mds","mdt","mdu","mdv","mdw","mdx","mdy","mdz","mea","meb","mec","med","mee","mef","meg","meh","mei","mej","mek","mel","mem","men","meo","mep","meq","mer","mes","met","meu","mev","mew","mey","mez","mfa","mfb","mfc","mfd","mfe","mff","mfg","mfh","mfi","mfj","mfk","mfl","mfm","mfn","mfo","mfp","mfq","mfr","mfs","mft","mfu","mfv","mfw","mfx","mfy","mfz","mga","mgb","mgc","mgd","mge","mgf","mgg","mgh","mgi","mgj","mgk","mgl","mgm","mgn","mgo","mgp","mgq","mgr","mgs","mgt","mgu","mgv","mgw","mgx","mgy","mgz","mha","mhb","mhc","mhd","mhe","mhf","mhg","mhh","mhi","mhj","mhk","mhl","mhm","mhn","mho","mhp","mhq","mhr","mhs","mht","mhu","mhw","mhx","mhy","mhz","mia","mib","mic","mid","mie","mif","mig","mih","mii","mij","mik","mil","mim","min","mio","mip","miq","mir","mis","mit","miu","miw","mix","miy","miz","mja","mjb","mjc","mjd","mje","mjg","mjh","mji","mjj","mjk","mjl","mjm","mjn","mjo","mjp","mjq","mjr","mjs","mjt","mju","mjv","mjw","mjx","mjy","mjz","mka","mkb","mkc","mke","mkf","mkg","mkh","mki","mkj","mkk","mkl","mkm","mkn","mko","mkp","mkq","mkr","mks","mkt","mku","mkv","mkw","mkx","mky","mkz","mla","mlb","mlc","mld","mle","mlf","mlh","mli","mlj","mlk","mll","mlm","mln","mlo","mlp","mlq","mlr","mls","mlu","mlv","mlw","mlx","mlz","mma","mmb","mmc","mmd","mme","mmf","mmg","mmh","mmi","mmj","mmk","mml","mmm","mmn","mmo","mmp","mmq","mmr","mmt","mmu","mmv","mmw","mmx","mmy","mmz","mna","mnb","mnc","mnd","mne","mnf","mng","mnh","mni","mnj","mnk","mnl","mnm","mnn","mno","mnp","mnq","mnr","mns","mnt","mnu","mnv","mnw","mnx","mny","mnz","moa","moc","mod","moe","mof","mog","moh","moi","moj","mok","mom","moo","mop","moq","mor","mos","mot","mou","mov","mow","mox","moy","moz","mpa","mpb","mpc","mpd","mpe","mpg","mph","mpi","mpj","mpk","mpl","mpm","mpn","mpo","mpp","mpq","mpr","mps","mpt","mpu","mpv","mpw","mpx","mpy","mpz","mqa","mqb","mqc","mqe","mqf","mqg","mqh","mqi","mqj","mqk","mql","mqm","mqn","mqo","mqp","mqq","mqr","mqs","mqt","mqu","mqv","mqw","mqx","mqy","mqz","mra","mrb","mrc","mrd","mre","mrf","mrg","mrh","mrj","mrk","mrl","mrm","mrn","mro","mrp","mrq","mrr","mrs","mrt","mru","mrv","mrw","mrx","mry","mrz","msb","msc","msd","mse","msf","msg","msh","msi","msj","msk","msl","msm","msn","mso","msp","msq","msr","mss","mst","msu","msv","msw","msx","msy","msz","mta","mtb","mtc","mtd","mte","mtf","mtg","mth","mti","mtj","mtk","mtl","mtm","mtn","mto","mtp","mtq","mtr","mts","mtt","mtu","mtv","mtw","mtx","mty","mua","mub","muc","mud","mue","mug","muh","mui","muj","muk","mul","mum","mun","muo","mup","muq","mur","mus","mut","muu","muv","mux","muy","muz","mva","mvb","mvd","mve","mvf","mvg","mvh","mvi","mvk","mvl","mvm","mvn","mvo","mvp","mvq","mvr","mvs","mvt","mvu","mvv","mvw","mvx","mvy","mvz","mwa","mwb","mwc","mwd","mwe","mwf","mwg","mwh","mwi","mwj","mwk","mwl","mwm","mwn","mwo","mwp","mwq","mwr","mws","mwt","mwu","mwv","mww","mwx","mwy","mwz","mxa","mxb","mxc","mxd","mxe","mxf","mxg","mxh","mxi","mxj","mxk","mxl","mxm","mxn","mxo","mxp","mxq","mxr","mxs","mxt","mxu","mxv","mxw","mxx","mxy","mxz","myb","myc","myd","mye","myf","myg","myh","myi","myj","myk","myl","mym","myn","myo","myp","myq","myr","mys","myt","myu","myv","myw","myx","myy","myz","mza","mzb","mzc","mzd","mze","mzg","mzh","mzi","mzj","mzk","mzl","mzm","mzn","mzo","mzp","mzq","mzr","mzs","mzt","mzu","mzv","mzw","mzx","mzy","mzz"],["na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","naa","nab","nac","nad","nae","naf","nag","nah","nai","naj","nak","nal","nam","nan","nao","nap","naq","nar","nas","nat","naw","nax","nay","naz","nba","nbb","nbc","nbd","nbe","nbf","nbg","nbh","nbi","nbj","nbk","nbm","nbn","nbo","nbp","nbq","nbr","nbs","nbt","nbu","nbv","nbw","nbx","nby","nca","ncb","ncc","ncd","nce","ncf","ncg","nch","nci","ncj","nck","ncl","ncm","ncn","nco","ncp","ncq","ncr","ncs","nct","ncu","ncx","ncz","nda","ndb","ndc","ndd","ndf","ndg","ndh","ndi","ndj","ndk","ndl","ndm","ndn","ndp","ndq","ndr","nds","ndt","ndu","ndv","ndw","ndx","ndy","ndz","nea","neb","nec","ned","nee","nef","neg","neh","nei","nej","nek","nem","nen","neo","neq","ner","nes","net","neu","nev","new","nex","ney","nez","nfa","nfd","nfl","nfr","nfu","nga","ngb","ngc","ngd","nge","ngf","ngg","ngh","ngi","ngj","ngk","ngl","ngm","ngn","ngo","ngp","ngq","ngr","ngs","ngt","ngu","ngv","ngw","ngx","ngy","ngz","nha","nhb","nhc","nhd","nhe","nhf","nhg","nhh","nhi","nhk","nhm","nhn","nho","nhp","nhq","nhr","nht","nhu","nhv","nhw","nhx","nhy","nhz","nia","nib","nic","nid","nie","nif","nig","nih","nii","nij","nik","nil","nim","nin","nio","niq","nir","nis","nit","niu","niv","niw","nix","niy","niz","nja","njb","njd","njh","nji","njj","njl","njm","njn","njo","njr","njs","njt","nju","njx","njy","njz","nka","nkb","nkc","nkd","nke","nkf","nkg","nkh","nki","nkj","nkk","nkm","nkn","nko","nkp","nkq","nkr","nks","nkt","nku","nkv","nkw","nkx","nkz","nla","nlc","nle","nlg","nli","nlj","nlk","nll","nlm","nln","nlo","nlq","nlr","nlu","nlv","nlw","nlx","nly","nlz","nma","nmb","nmc","nmd","nme","nmf","nmg","nmh","nmi","nmj","nmk","nml","nmm","nmn","nmo","nmp","nmq","nmr","nms","nmt","nmu","nmv","nmw","nmx","nmy","nmz","nna","nnb","nnc","nnd","nne","nnf","nng","nnh","nni","nnj","nnk","nnl","nnm","nnn","nnp","nnq","nnr","nns","nnt","nnu","nnv","nnw","nnx","nny","nnz","noa","noc","nod","noe","nof","nog","noh","noi","noj","nok","nol","nom","non","noo","nop","noq","nos","not","nou","nov","now","noy","noz","npa","npb","npg","nph","npi","npl","npn","npo","nps","npu","npx","npy","nqg","nqk","nql","nqm","nqn","nqo","nqq","nqt","nqy","nra","nrb","nrc","nre","nrf","nrg","nri","nrk","nrl","nrm","nrn","nrp","nrr","nrt","nru","nrx","nrz","nsa","nsb","nsc","nsd","nse","nsf","nsg","nsh","nsi","nsk","nsl","nsm","nsn","nso","nsp","nsq","nsr","nss","nst","nsu","nsv","nsw","nsx","nsy","nsz","ntd","nte","ntg","nti","ntj","ntk","ntm","nto","ntp","ntr","nts","ntu","ntw","ntx","nty","ntz","nua","nub","nuc","nud","nue","nuf","nug","nuh","nui","nuj","nuk","nul","num","nun","nuo","nup","nuq","nur","nus","nut","nuu","nuv","nuw","nux","nuy","nuz","nvh","nvm","nvo","nwa","nwb","nwc","nwe","nwg","nwi","nwm","nwo","nwr","nwx","nwy","nxa","nxd","nxe","nxg","nxi","nxk","nxl","nxm","nxn","nxo","nxq","nxr","nxu","nxx","nyb","nyc","nyd","nye","nyf","nyg","nyh","nyi","nyj","nyk","nyl","nym","nyn","nyo","nyp","nyq","nyr","nys","nyt","nyu","nyv","nyw","nyx","nyy","nza","nzb","nzd","nzi","nzk","nzm","nzs","nzu","nzy","nzz"],["oc","oj","om","or","os","oaa","oac","oar","oav","obi","obk","obl","obm","obo","obr","obt","obu","oca","och","ocm","oco","ocu","oda","odk","odt","odu","ofo","ofs","ofu","ogb","ogc","oge","ogg","ogo","ogu","oht","ohu","oia","oin","ojb","ojc","ojg","ojp","ojs","ojv","ojw","oka","okb","okc","okd","oke","okg","okh","oki","okj","okk","okl","okm","okn","oko","okr","oks","oku","okv","okx","okz","ola","old","ole","olk","olm","olo","olr","olt","olu","oma","omb","omc","ome","omg","omi","omk","oml","omn","omo","omp","omq","omr","omt","omu","omv","omw","omx","omy","ona","onb","one","ong","oni","onj","onk","onn","ono","onp","onr","ons","ont","onu","onw","onx","ood","oog","oon","oor","oos","opa","opk","opm","opo","opt","opy","ora","orc","ore","org","orh","orn","oro","orr","ors","ort","oru","orv","orw","orx","ory","orz","osa","osc","osi","osn","oso","osp","ost","osu","osx","ota","otb","otd","ote","oti","otk","otl","otm","otn","oto","otq","otr","ots","ott","otu","otw","otx","oty","otz","oua","oub","oue","oui","oum","oun","ovd","owi","owl","oyb","oyd","oym","oyy","ozm"],["pa","pi","pl","ps","pt","paa","pab","pac","pad","pae","paf","pag","pah","pai","pak","pal","pam","pao","pap","paq","par","pas","pat","pau","pav","paw","pax","pay","paz","pbb","pbc","pbe","pbf","pbg","pbh","pbi","pbl","pbm","pbn","pbo","pbp","pbr","pbs","pbt","pbu","pbv","pby","pbz","pca","pcb","pcc","pcd","pce","pcf","pcg","pch","pci","pcj","pck","pcl","pcm","pcn","pcp","pcr","pcw","pda","pdc","pdi","pdn","pdo","pdt","pdu","pea","peb","ped","pee","pef","peg","peh","pei","pej","pek","pel","pem","peo","pep","peq","pes","pev","pex","pey","pez","pfa","pfe","pfl","pga","pgd","pgg","pgi","pgk","pgl","pgn","pgs","pgu","pgy","pgz","pha","phd","phg","phh","phi","phk","phl","phm","phn","pho","phq","phr","pht","phu","phv","phw","pia","pib","pic","pid","pie","pif","pig","pih","pii","pij","pil","pim","pin","pio","pip","pir","pis","pit","piu","piv","piw","pix","piy","piz","pjt","pka","pkb","pkc","pkg","pkh","pkn","pko","pkp","pkr","pks","pkt","pku","pla","plb","plc","pld","ple","plf","plg","plh","plj","plk","pll","pln","plo","plp","plq","plr","pls","plt","plu","plv","plw","ply","plz","pma","pmb","pmc","pmd","pme","pmf","pmh","pmi","pmj","pmk","pml","pmm","pmn","pmo","pmq","pmr","pms","pmt","pmu","pmw","pmx","pmy","pmz","pna","pnb","pnc","pnd","pne","png","pnh","pni","pnj","pnk","pnl","pnm","pnn","pno","pnp","pnq","pnr","pns","pnt","pnu","pnv","pnw","pnx","pny","pnz","poc","pod","poe","pof","pog","poh","poi","pok","pom","pon","poo","pop","poq","pos","pot","pov","pow","pox","poy","poz","ppa","ppe","ppi","ppk","ppl","ppm","ppn","ppo","ppp","ppq","ppr","pps","ppt","ppu","pqa","pqe","pqm","pqw","pra","prb","prc","prd","pre","prf","prg","prh","pri","prk","prl","prm","prn","pro","prp","prq","prr","prs","prt","pru","prw","prx","pry","prz","psa","psc","psd","pse","psg","psh","psi","psl","psm","psn","pso","psp","psq","psr","pss","pst","psu","psw","psy","pta","pth","pti","ptn","pto","ptp","ptq","ptr","ptt","ptu","ptv","ptw","pty","pua","pub","puc","pud","pue","puf","pug","pui","puj","puk","pum","puo","pup","puq","pur","put","puu","puw","pux","puy","puz","pwa","pwb","pwg","pwi","pwm","pwn","pwo","pwr","pww","pxm","pye","pym","pyn","pys","pyu","pyx","pyy","pzn"],["qu","qua","qub","quc","qud","quf","qug","quh","qui","quk","qul","qum","qun","qup","quq","qur","qus","quv","quw","qux","quy","quz","qva","qvc","qve","qvh","qvi","qvj","qvl","qvm","qvn","qvo","qvp","qvs","qvw","qvy","qvz","qwa","qwc","qwe","qwh","qwm","qws","qwt","qxa","qxc","qxh","qxl","qxn","qxo","qxp","qxq","qxr","qxs","qxt","qxu","qxw","qya","qyp"],["rm","rn","ro","ru","rw","raa","rab","rac","rad","raf","rag","rah","rai","raj","rak","ral","ram","ran","rao","rap","raq","rar","ras","rat","rau","rav","raw","rax","ray","raz","rbb","rbk","rbl","rbp","rcf","rdb","rea","reb","ree","reg","rei","rej","rel","rem","ren","rer","res","ret","rey","rga","rge","rgk","rgn","rgr","rgs","rgu","rhg","rhp","ria","rie","rif","ril","rim","rin","rir","rit","riu","rjg","rji","rjs","rka","rkb","rkh","rki","rkm","rkt","rkw","rma","rmb","rmc","rmd","rme","rmf","rmg","rmh","rmi","rmk","rml","rmm","rmn","rmo","rmp","rmq","rmr","rms","rmt","rmu","rmv","rmw","rmx","rmy","rmz","rna","rnd","rng","rnl","rnn","rnp","rnr","rnw","roa","rob","roc","rod","roe","rof","rog","rol","rom","roo","rop","ror","rou","row","rpn","rpt","rri","rro","rrt","rsb","rsi","rsl","rsm","rtc","rth","rtm","rts","rtw","rub","ruc","rue","ruf","rug","ruh","rui","ruk","ruo","rup","ruq","rut","ruu","ruy","ruz","rwa","rwk","rwl","rwm","rwo","rwr","rxd","rxw","ryn","rys","ryu","rzh"],["sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","saa","sab","sac","sad","sae","saf","sah","sai","saj","sak","sal","sam","sao","sap","saq","sar","sas","sat","sau","sav","saw","sax","say","saz","sba","sbb","sbc","sbd","sbe","sbf","sbg","sbh","sbi","sbj","sbk","sbl","sbm","sbn","sbo","sbp","sbq","sbr","sbs","sbt","sbu","sbv","sbw","sbx","sby","sbz","sca","scb","sce","scf","scg","sch","sci","sck","scl","scn","sco","scp","scq","scs","sct","scu","scv","scw","scx","sda","sdb","sdc","sde","sdf","sdg","sdh","sdj","sdk","sdl","sdm","sdn","sdo","sdp","sdq","sdr","sds","sdt","sdu","sdv","sdx","sdz","sea","seb","sec","sed","see","sef","seg","seh","sei","sej","sek","sel","sem","sen","seo","sep","seq","ser","ses","set","seu","sev","sew","sey","sez","sfb","sfe","sfm","sfs","sfw","sga","sgb","sgc","sgd","sge","sgg","sgh","sgi","sgj","sgk","sgl","sgm","sgn","sgo","sgp","sgr","sgs","sgt","sgu","sgw","sgx","sgy","sgz","sha","shb","shc","shd","she","shg","shh","shi","shj","shk","shl","shm","shn","sho","shp","shq","shr","shs","sht","shu","shv","shw","shx","shy","shz","sia","sib","sid","sie","sif","sig","sih","sii","sij","sik","sil","sim","sio","sip","siq","sir","sis","sit","siu","siv","siw","six","siy","siz","sja","sjb","sjd","sje","sjg","sjk","sjl","sjm","sjn","sjo","sjp","sjr","sjs","sjt","sju","sjw","ska","skb","skc","skd","ske","skf","skg","skh","ski","skj","skk","skm","skn","sko","skp","skq","skr","sks","skt","sku","skv","skw","skx","sky","skz","sla","slc","sld","sle","slf","slg","slh","sli","slj","sll","slm","sln","slp","slq","slr","sls","slt","slu","slw","slx","sly","slz","sma","smb","smc","smd","smf","smg","smh","smi","smj","smk","sml","smm","smn","smp","smq","smr","sms","smt","smu","smv","smw","smx","smy","smz","snb","snc","sne","snf","sng","snh","sni","snj","snk","snl","snm","snn","sno","snp","snq","snr","sns","snu","snv","snw","snx","sny","snz","soa","sob","soc","sod","soe","sog","soh","soi","soj","sok","sol","son","soo","sop","soq","sor","sos","sou","sov","sow","sox","soy","soz","spb","spc","spd","spe","spg","spi","spk","spl","spm","spn","spo","spp","spq","spr","sps","spt","spu","spv","spx","spy","sqa","sqh","sqj","sqk","sqm","sqn","sqo","sqq","sqr","sqs","sqt","squ","sqx","sra","srb","src","sre","srf","srg","srh","sri","srk","srl","srm","srn","sro","srq","srr","srs","srt","sru","srv","srw","srx","sry","srz","ssa","ssb","ssc","ssd","sse","ssf","ssg","ssh","ssi","ssj","ssk","ssl","ssm","ssn","sso","ssp","ssq","ssr","sss","sst","ssu","ssv","ssx","ssy","ssz","sta","stb","std","ste","stf","stg","sth","sti","stj","stk","stl","stm","stn","sto","stp","stq","str","sts","stt","stu","stv","stw","sty","sua","sub","suc","sue","sug","sui","suj","suk","sul","sum","suo","suq","sur","sus","sut","suv","suw","sux","suy","suz","sva","svb","svc","sve","svk","svm","svr","svs","svx","swb","swc","swf","swg","swh","swi","swj","swk","swl","swm","swn","swo","swp","swq","swr","sws","swt","swu","swv","sww","swx","swy","sxb","sxc","sxe","sxg","sxk","sxl","sxm","sxn","sxo","sxr","sxs","sxu","sxw","sya","syb","syc","syd","syi","syk","syl","sym","syn","syo","syr","sys","syw","syx","syy","sza","szb","szc","szd","sze","szg","szl","szn","szp","szs","szv","szw","szy"],["ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","taa","tab","tac","tad","tae","taf","tag","tai","taj","tak","tal","tan","tao","tap","taq","tar","tas","tau","tav","taw","tax","tay","taz","tba","tbb","tbc","tbd","tbe","tbf","tbg","tbh","tbi","tbj","tbk","tbl","tbm","tbn","tbo","tbp","tbq","tbr","tbs","tbt","tbu","tbv","tbw","tbx","tby","tbz","tca","tcb","tcc","tcd","tce","tcf","tcg","tch","tci","tck","tcl","tcm","tcn","tco","tcp","tcq","tcs","tct","tcu","tcw","tcx","tcy","tcz","tda","tdb","tdc","tdd","tde","tdf","tdg","tdh","tdi","tdj","tdk","tdl","tdm","tdn","tdo","tdq","tdr","tds","tdt","tdu","tdv","tdx","tdy","tea","teb","tec","ted","tee","tef","teg","teh","tei","tek","tem","ten","teo","tep","teq","ter","tes","tet","teu","tev","tew","tex","tey","tez","tfi","tfn","tfo","tfr","tft","tga","tgb","tgc","tgd","tge","tgf","tgg","tgh","tgi","tgj","tgn","tgo","tgp","tgq","tgr","tgs","tgt","tgu","tgv","tgw","tgx","tgy","tgz","thc","thd","the","thf","thh","thi","thk","thl","thm","thn","thp","thq","thr","ths","tht","thu","thv","thw","thx","thy","thz","tia","tic","tid","tie","tif","tig","tih","tii","tij","tik","til","tim","tin","tio","tip","tiq","tis","tit","tiu","tiv","tiw","tix","tiy","tiz","tja","tjg","tji","tjj","tjl","tjm","tjn","tjo","tjp","tjs","tju","tjw","tka","tkb","tkd","tke","tkf","tkg","tkk","tkl","tkm","tkn","tkp","tkq","tkr","tks","tkt","tku","tkv","tkw","tkx","tkz","tla","tlb","tlc","tld","tlf","tlg","tlh","tli","tlj","tlk","tll","tlm","tln","tlo","tlp","tlq","tlr","tls","tlt","tlu","tlv","tlw","tlx","tly","tma","tmb","tmc","tmd","tme","tmf","tmg","tmh","tmi","tmj","tmk","tml","tmm","tmn","tmo","tmp","tmq","tmr","tms","tmt","tmu","tmv","tmw","tmy","tmz","tna","tnb","tnc","tnd","tne","tnf","tng","tnh","tni","tnk","tnl","tnm","tnn","tno","tnp","tnq","tnr","tns","tnt","tnu","tnv","tnw","tnx","tny","tnz","tob","toc","tod","toe","tof","tog","toh","toi","toj","tol","tom","too","top","toq","tor","tos","tou","tov","tow","tox","toy","toz","tpa","tpc","tpe","tpf","tpg","tpi","tpj","tpk","tpl","tpm","tpn","tpo","tpp","tpq","tpr","tpt","tpu","tpv","tpw","tpx","tpy","tpz","tqb","tql","tqm","tqn","tqo","tqp","tqq","tqr","tqt","tqu","tqw","tra","trb","trc","trd","tre","trf","trg","trh","tri","trj","trk","trl","trm","trn","tro","trp","trq","trr","trs","trt","tru","trv","trw","trx","try","trz","tsa","tsb","tsc","tsd","tse","tsf","tsg","tsh","tsi","tsj","tsk","tsl","tsm","tsp","tsq","tsr","tss","tst","tsu","tsv","tsw","tsx","tsy","tsz","tta","ttb","ttc","ttd","tte","ttf","ttg","tth","tti","ttj","ttk","ttl","ttm","ttn","tto","ttp","ttq","ttr","tts","ttt","ttu","ttv","ttw","tty","ttz","tua","tub","tuc","tud","tue","tuf","tug","tuh","tui","tuj","tul","tum","tun","tuo","tup","tuq","tus","tut","tuu","tuv","tuw","tux","tuy","tuz","tva","tvd","tve","tvk","tvl","tvm","tvn","tvo","tvs","tvt","tvu","tvw","tvx","tvy","twa","twb","twc","twd","twe","twf","twg","twh","twl","twm","twn","two","twp","twq","twr","twt","twu","tww","twx","twy","txa","txb","txc","txe","txg","txh","txi","txj","txm","txn","txo","txq","txr","txs","txt","txu","txx","txy","tya","tye","tyh","tyi","tyj","tyl","tyn","typ","tyr","tys","tyt","tyu","tyv","tyx","tyy","tyz","tza","tzh","tzj","tzl","tzm","tzn","tzo","tzx"],["ug","uk","ur","uz","uam","uan","uar","uba","ubi","ubl","ubr","ubu","uby","uda","ude","udg","udi","udj","udl","udm","udu","ues","ufi","uga","ugb","uge","ugn","ugo","ugy","uha","uhn","uis","uiv","uji","uka","ukg","ukh","uki","ukk","ukl","ukp","ukq","uks","uku","ukv","ukw","uky","ula","ulb","ulc","ule","ulf","uli","ulk","ull","ulm","uln","ulu","ulw","uma","umb","umc","umd","umg","umi","umm","umn","umo","ump","umr","ums","umu","una","und","une","ung","uni","unk","unm","unn","unp","unr","unu","unx","unz","uok","upi","upv","ura","urb","urc","ure","urf","urg","urh","uri","urj","urk","url","urm","urn","uro","urp","urr","urt","uru","urv","urw","urx","ury","urz","usa","ush","usi","usk","usp","uss","usu","uta","ute","uth","utp","utr","utu","uum","uun","uur","uuu","uve","uvh","uvl","uwa","uya","uzn","uzs"],["ve","vi","vo","vaa","vae","vaf","vag","vah","vai","vaj","val","vam","van","vao","vap","var","vas","vau","vav","vay","vbb","vbk","vec","ved","vel","vem","veo","vep","ver","vgr","vgt","vic","vid","vif","vig","vil","vin","vis","vit","viv","vka","vki","vkj","vkk","vkl","vkm","vkn","vko","vkp","vkt","vku","vkz","vlp","vls","vma","vmb","vmc","vmd","vme","vmf","vmg","vmh","vmi","vmj","vmk","vml","vmm","vmp","vmq","vmr","vms","vmu","vmv","vmw","vmx","vmy","vmz","vnk","vnm","vnp","vor","vot","vra","vro","vrs","vrt","vsi","vsl","vsv","vto","vum","vun","vut","vwa"],["wa","wo","waa","wab","wac","wad","wae","waf","wag","wah","wai","waj","wak","wal","wam","wan","wao","wap","waq","war","was","wat","wau","wav","waw","wax","way","waz","wba","wbb","wbe","wbf","wbh","wbi","wbj","wbk","wbl","wbm","wbp","wbq","wbr","wbs","wbt","wbv","wbw","wca","wci","wdd","wdg","wdj","wdk","wdu","wdy","wea","wec","wed","weg","weh","wei","wem","wen","weo","wep","wer","wes","wet","weu","wew","wfg","wga","wgb","wgg","wgi","wgo","wgu","wgw","wgy","wha","whg","whk","whu","wib","wic","wie","wif","wig","wih","wii","wij","wik","wil","wim","win","wir","wit","wiu","wiv","wiw","wiy","wja","wji","wka","wkb","wkd","wkl","wkr","wku","wkw","wky","wla","wlc","wle","wlg","wlh","wli","wlk","wll","wlm","wlo","wlr","wls","wlu","wlv","wlw","wlx","wly","wma","wmb","wmc","wmd","wme","wmg","wmh","wmi","wmm","wmn","wmo","wms","wmt","wmw","wmx","wnb","wnc","wnd","wne","wng","wni","wnk","wnm","wnn","wno","wnp","wnu","wnw","wny","woa","wob","woc","wod","woe","wof","wog","woi","wok","wom","won","woo","wor","wos","wow","woy","wpc","wra","wrb","wrd","wrg","wrh","wri","wrk","wrl","wrm","wrn","wro","wrp","wrr","wrs","wru","wrv","wrw","wrx","wry","wrz","wsa","wsg","wsi","wsk","wsr","wss","wsu","wsv","wtf","wth","wti","wtk","wtm","wtw","wua","wub","wud","wuh","wul","wum","wun","wur","wut","wuu","wuv","wux","wuy","wwa","wwb","wwo","wwr","www","wxa","wxw","wya","wyb","wyi","wym","wyr","wyy"],["xh","xaa","xab","xac","xad","xae","xag","xai","xaj","xak","xal","xam","xan","xao","xap","xaq","xar","xas","xat","xau","xav","xaw","xay","xba","xbb","xbc","xbd","xbe","xbg","xbi","xbj","xbm","xbn","xbo","xbp","xbr","xbw","xbx","xby","xcb","xcc","xce","xcg","xch","xcl","xcm","xcn","xco","xcr","xct","xcu","xcv","xcw","xcy","xda","xdc","xdk","xdm","xdo","xdy","xeb","xed","xeg","xel","xem","xep","xer","xes","xet","xeu","xfa","xga","xgb","xgd","xgf","xgg","xgi","xgl","xgm","xgn","xgr","xgu","xgw","xha","xhc","xhd","xhe","xhr","xht","xhu","xhv","xia","xib","xii","xil","xin","xip","xir","xis","xiv","xiy","xjb","xjt","xka","xkb","xkc","xkd","xke","xkf","xkg","xkh","xki","xkj","xkk","xkl","xkn","xko","xkp","xkq","xkr","xks","xkt","xku","xkv","xkw","xkx","xky","xkz","xla","xlb","xlc","xld","xle","xlg","xli","xln","xlo","xlp","xls","xlu","xly","xma","xmb","xmc","xmd","xme","xmf","xmg","xmh","xmj","xmk","xml","xmm","xmn","xmo","xmp","xmq","xmr","xms","xmt","xmu","xmv","xmw","xmx","xmy","xmz","xna","xnb","xnd","xng","xnh","xni","xnj","xnk","xnm","xnn","xno","xnq","xnr","xns","xnt","xnu","xny","xnz","xoc","xod","xog","xoi","xok","xom","xon","xoo","xop","xor","xow","xpa","xpb","xpc","xpd","xpe","xpf","xpg","xph","xpi","xpj","xpk","xpl","xpm","xpn","xpo","xpp","xpq","xpr","xps","xpt","xpu","xpv","xpw","xpx","xpy","xpz","xqa","xqt","xra","xrb","xrd","xre","xrg","xri","xrm","xrn","xrq","xrr","xrt","xru","xrw","xsa","xsb","xsc","xsd","xse","xsh","xsi","xsj","xsl","xsm","xsn","xso","xsp","xsq","xsr","xss","xsu","xsv","xsy","xta","xtb","xtc","xtd","xte","xtg","xth","xti","xtj","xtl","xtm","xtn","xto","xtp","xtq","xtr","xts","xtt","xtu","xtv","xtw","xty","xtz","xua","xub","xud","xug","xuj","xul","xum","xun","xuo","xup","xur","xut","xuu","xve","xvi","xvn","xvo","xvs","xwa","xwc","xwd","xwe","xwg","xwj","xwk","xwl","xwo","xwr","xwt","xww","xxb","xxk","xxm","xxr","xxt","xya","xyb","xyj","xyk","xyl","xyt","xyy","xzh","xzm","xzp"],["yi","yo","yaa","yab","yac","yad","yae","yaf","yag","yah","yai","yaj","yak","yal","yam","yan","yao","yap","yaq","yar","yas","yat","yau","yav","yaw","yax","yay","yaz","yba","ybb","ybd","ybe","ybh","ybi","ybj","ybk","ybl","ybm","ybn","ybo","ybx","yby","ych","ycl","ycn","ycp","yda","ydd","yde","ydg","ydk","yds","yea","yec","yee","yei","yej","yel","yen","yer","yes","yet","yeu","yev","yey","yga","ygi","ygl","ygm","ygp","ygr","ygs","ygu","ygw","yha","yhd","yhl","yhs","yia","yif","yig","yih","yii","yij","yik","yil","yim","yin","yip","yiq","yir","yis","yit","yiu","yiv","yix","yiy","yiz","yka","ykg","yki","ykk","ykl","ykm","ykn","yko","ykr","ykt","yku","yky","yla","ylb","yle","ylg","yli","yll","ylm","yln","ylo","ylr","ylu","yly","yma","ymb","ymc","ymd","yme","ymg","ymh","ymi","ymk","yml","ymm","ymn","ymo","ymp","ymq","ymr","yms","ymt","ymx","ymz","yna","ynd","yne","yng","ynh","ynk","ynl","ynn","yno","ynq","yns","ynu","yob","yog","yoi","yok","yol","yom","yon","yos","yot","yox","yoy","ypa","ypb","ypg","yph","ypk","ypm","ypn","ypo","ypp","ypz","yra","yrb","yre","yri","yrk","yrl","yrm","yrn","yro","yrs","yrw","yry","ysc","ysd","ysg","ysl","ysm","ysn","yso","ysp","ysr","yss","ysy","yta","ytl","ytp","ytw","yty","yua","yub","yuc","yud","yue","yuf","yug","yui","yuj","yuk","yul","yum","yun","yup","yuq","yur","yut","yuu","yuw","yux","yuy","yuz","yva","yvt","ywa","ywg","ywl","ywn","ywq","ywr","ywt","ywu","yww","yxa","yxg","yxl","yxm","yxu","yxy","yyr","yyu","yyz","yzg","yzk"],["za","zh","zu","zaa","zab","zac","zad","zae","zaf","zag","zah","zai","zaj","zak","zal","zam","zao","zap","zaq","zar","zas","zat","zau","zav","zaw","zax","zay","zaz","zba","zbc","zbe","zbl","zbt","zbu","zbw","zca","zch","zdj","zea","zeg","zeh","zen","zga","zgb","zgh","zgm","zgn","zgr","zhb","zhd","zhi","zhn","zhw","zhx","zia","zib","zik","zil","zim","zin","zir","ziw","ziz","zka","zkb","zkd","zkg","zkh","zkk","zkn","zko","zkp","zkr","zkt","zku","zkv","zkz","zla","zle","zlj","zlm","zln","zlq","zls","zlw","zma","zmb","zmc","zmd","zme","zmf","zmg","zmh","zmi","zmj","zmk","zml","zmm","zmn","zmo","zmp","zmq","zmr","zms","zmt","zmu","zmv","zmw","zmx","zmy","zmz","zna","znd","zne","zng","znk","zns","zoc","zoh","zom","zoo","zoq","zor","zos","zpa","zpb","zpc","zpd","zpe","zpf","zpg","zph","zpi","zpj","zpk","zpl","zpm","zpn","zpo","zpp","zpq","zpr","zps","zpt","zpu","zpv","zpw","zpx","zpy","zpz","zqe","zra","zrg","zrn","zro","zrp","zrs","zsa","zsk","zsl","zsm","zsr","zsu","zte","ztg","ztl","ztm","ztn","ztp","ztq","zts","ztt","ztu","ztx","zty","zua","zuh","zum","zun","zuy","zwa","zxx","zyb","zyg","zyj","zyn","zyp","zza","zzj"]],a=function(){function e(){}return e.isBcp47=function(e){return/^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(e)},e.validPrimaryLang=function(e){var t=e.toLowerCase();return t.includes("-")&&(t=t.split("-")[0]),!!t.match(/[a-z]{2,3}/)&&(3===t.length&&"q"===t.charAt(0)&&t.charCodeAt(1)>=97&&t.charCodeAt(1)<=116&&t.charCodeAt(2)>=97&&t.charCodeAt(2),i[t.charCodeAt(0)-97].includes(t))},e.matchPrimaryLang=function(e,t){var i=e;i.includes("-")&&(i=i.split("-")[0]);var a=t;return a.includes("-")&&(a=a.split("-")[0]),i.toLowerCase()===a.toLowerCase()},e}();t.LangUtil=a},3103(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CommonMapper=void 0;var a=i(3864),n=function(){function e(){this.hierarchyRole=null,this.hierarchyPath=null,this.hierarchyResults=null}return e.prototype.getBounds=function(e){return null},e.prototype.reset=function(e){this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var t=[],i=a.DOMWalker.parentNode(e);i&&9!=i.nodeType;)t.push(i),i=a.DOMWalker.parentNode(i);for(var n=0,r=t=t.reverse();n<r.length;n++){for(var l=r[n],o=[],s=l.previousSibling;s;)o.push(s),s=s.previousSibling;for(var u=0,d=o=o.reverse();u<d.length;u++){var c=d[u];this.pushHierarchy(c),this.popHierarchy()}this.pushHierarchy(l)}},e.prototype.pushHierarchy=function(e){var t=this.getRole(e)||null;if(this.hierarchyRole.push(t),null!==t){var i=this.hierarchyPath[this.hierarchyPath.length-1];i.roleCount[t]=(i.roleCount[t]||0)+1,this.hierarchyPath.push({rolePath:i.rolePath+"/"+t+"["+i.roleCount[t]+"]",roleCount:{}})}var a={};1===e.nodeType&&(a=this.getAttributes(e)),this.hierarchyResults.push({node:e,namespace:this.getNamespace(),role:t,attributes:a,rolePath:this.hierarchyPath[this.hierarchyPath.length-1].rolePath,bounds:this.getBounds(e)})},e.prototype.popHierarchy=function(){null!==this.hierarchyRole.pop()&&this.hierarchyPath.pop(),this.hierarchyResults.pop()},e.prototype.openScope=function(e){return null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e),this.hierarchyResults},e.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}return t[t.length-1].role="/"+t[t.length-1].role,this.popHierarchy(),t},e}();t.CommonMapper=n},920(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Context=t.PartInfo=t.AttrInfo=void 0;var i=function(){function e(e,t,i,a){if(this.inclusive=e,this.attr=t,this.eq=i,this.value=a,!e&&void 0!==i&&i.length>0)throw new Error("Cannot have !attr"+i+" context");if(e&&void 0!==i&&i.length>0&&(void 0===a||0===a.length))throw new Error("Cannot have equivalence check without a value")}return e.prototype.matches=function(e){var t=this,i=e.attributes;if(t.attr in i){if(t.inclusive){if(t.eq){var a=i[t.attr];if("="===t.eq)return t.value===a;if("!="===t.eq)return t.value!==a;if("~"===t.eq)return t.value===a;if("!~"===t.eq)return t.value!==a;throw new Error("Context equivalence operator not supported")}return!0}return!1}return!t.inclusive},e}();t.AttrInfo=i;var a=function(){function e(e,t,i,a,n){if(this.inclusive=e,this.namespace=t,this.role=i,this.attrs=a,this.connector=n,"*"===i&&!e)throw new Error("!* context not supported")}return e.prototype.matches=function(e,t){var i=this,a=i.namespace in e&&e[i.namespace][t]&&(e[i.namespace][t].role===i.role||"none"!==e[i.namespace][t].role&&"*"===i.role);if(!a||"*"!==i.role||"dom"!==i.namespace||"#text"!==e[i.namespace][t].role&&"/#text"!==e[i.namespace][t].role||(a=!1),i.inclusive&&!a)return!1;if(!i.inclusive&&!a)return!0;for(var n=i.attrs,r=e[i.namespace][t],l=!0,o=0,s=n;o<s.length;o++){var u=s[o];l=l&&u.matches(r)}return i.inclusive||(l=!l),l},e}();t.PartInfo=a;var n=function(){function e(e){this.contextInfo=[];for(var t=[],n=0,r=e.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g);n<r.length;n++){for(var l=r[n].match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/),o=[],s=0,u=l[3].match(/\[([^\]]+)\]/g)||[];s<u.length;s++){var d=u[s].match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/);o.push(new i("!"!==d[1],d[2].toLowerCase(),d[3],d[4]))}l[2]=l[2].toLowerCase();var c=l[2].split(":"),m="!"!==l[1],p=c.shift(),h=c.join(":"),g=new a(m,p,h,o,l[l.length-1]);t.push(g)}this.contextInfo=t}return e.cleanContext=function(e){return(e=(e=(e=(e=(e=e.toLowerCase().trim()).replace(/ +!/g," !")).replace(/ +([>+~,])/g,"$1")).replace(/([>+~,]) +/g,"$1")).replace(/ +/g," ")).trim()},e.parse=function(t){for(var i=e.splitMultiple(e.cleanContext(t)),a=[],n=0;n<i.length;++n){var r=new e(i[n]);a.push(r)}return a},e.splitMultiple=function(e){var t=[];if(e)if(-1===e.indexOf(","))t.push(e);else for(var i=0,a=e.split(",");i<a.length;i++){var n=a[i];t.push(n)}return t},e}();t.Context=n},7301(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Engine=void 0;var a=i(3864),n=i(920),r=i(4516),l=i(7507),o=i(1686),s=i(4566),u=i(461),d=i(3946),c=function(){function e(e,t){this.rule=e,this.parsedInfo=t,this.ns=this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length-1].namespace,r.Config.DEBUG&&console.log("Added Rule:",e.id,JSON.stringify(this.parsedInfo))}return e.convertNodeToSnippet=function(e){var t="";t+="<"+e.nodeName.toLowerCase();var i=e.attributes;if(null!=i)for(var a=i.length-1;a>=0;a--)"data-namewalk"!==i[a].name&&(t+=" "+i[a].name+'="'+i[a].value+'"');return t+">"},e.convertNodeToSource=function(e,t){if(void 0===t&&(t=!1),!t||!e)return null;var i="ibm-a11y-debug",n=function(e){return e&&"end"!==e.toLowerCase()?{found:!0,stop:!1,source:e}:{found:!0,stop:!0}},r=function(e){if(!e)return{found:!1};var t=null;if(e.nodeType===Node.COMMENT_NODE)t=e.nodeValue;else if(e.nodeType===Node.ELEMENT_NODE)for(var a=e.firstChild;a;){if(a.nodeType!==Node.TEXT_NODE){if(a.nodeType===Node.COMMENT_NODE){t=a.nodeValue;break}break}if(a.nodeValue&&a.nodeValue.trim().length>0)break;a=a.nextSibling}if(null!==t){var r=t.trim();if(r===i||r.startsWith(i+":")||r.startsWith(i+" ")||r.startsWith(i+"\t")){var l=r.substring(14).trimStart(),o=l.startsWith(":")?l.substring(1).trim():l.trim();return n(o)}}return{found:!1}},l=function(e){if(e.nodeType!==Node.ELEMENT_NODE)return{found:!1};var t=e.getAttribute(i);return null===t?{found:!1}:n(t.trim())},o=l(e);return o.found?o.stop?null:o.source:function(e){for(var t=e;t;){for(var i=a.DOMWalker.previousSiblingNotOwnedBySlot(t);i;){var n=r(i);if(n.found)return n.stop?null:n.source;i=a.DOMWalker.previousSiblingNotOwnedBySlot(i)}var o=a.DOMWalker.parentNode(t);if(!o||o.nodeType===Node.DOCUMENT_NODE)return null;var s=l(o);if(s.found)return s.stop?null:s.source;t=o}return null}(e)},e.prototype.run=function(t,i,a,n){var r,l=(new Date).getTime();try{r=this.rule.run(i,a,n)}catch(e){var o=e;throw console.error("RULE EXCEPTION:",this.rule.id,i.dom.rolePath,o.stack),e}var s=(new Date).getTime();r||(r=[]),r instanceof Array||(r=[r]);for(var u=[],d=0,c=r;d<c.length;d++){var m=c[d],p=t.getMessage(this.rule.id,m.reasonId,m.messageArgs),h={};for(var g in i)h[g]=i[g].rolePath;var b=this.rule.id.replace(/^(.*)\$\$\d+$/,"$1");u.push({ruleId:b,value:m.value,node:i.dom.node,path:h,ruleTime:s-l,reasonId:m.reasonId,message:p,messageArgs:m.messageArgs,apiArgs:m.apiArgs,bounds:i.dom.bounds,snippet:e.convertNodeToSnippet(i.dom.node),source:e.convertNodeToSource(i.dom.node,t.isSourceMapEnabled())})}return u},e}(),m=function(){function e(){this.mappers={},this.ruleMap={},this.wrappedRuleMap={},this.nlsMap={},this.helpMap={},this.sourceMapEnabled=!1,this.inclRules={},this.exclRules={},this.addMapper(new l.DOMMapper)}return e.getLanguages=function(){var e="undefined"!=typeof process&&void 0===process.nodeType&&process.env,t="en-US";return e&&(t=(t=e.LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES)&&t.length>0?t.split(".")[0].replace(/_/g,"-"):"en-US"),"undefined"!=typeof navigator&&navigator.languages||[t]},e.prototype.run=function(e,t){if(null===e)return Promise.reject("null document");9===e.nodeType&&(e=e.documentElement),e.ownerDocument&&(e.ownerDocument.PT_CHECK_HIDDEN_CONTENT=!1);var i=s.CacheUtil.clearCaches(e),n=new a.DOMWalker(e,!1,e,!0),r={results:[],numExecuted:0,ruleTime:0,totalTime:0},l=(new Date).getTime();for(var c in this.mappers)this.mappers[c].reset(e);var m=0,p=-1;do{m++;var h=Math.floor(m/i*100);h>p&&(i>1e4&&console.log("Progress: ".concat(h,"% (").concat(m,"/").concat(i," nodes)")),p=h);var g={};for(var c in this.mappers)n.bEndTag?g[c]=this.mappers[c].closeScope(n.node):g[c]=this.mappers[c].openScope(n.node);if(11!==n.node.nodeType&&(d.VisUtil.isNodeVisible(n.node)||"meta"===n.node.nodeName.toLowerCase()||"style"===n.node.nodeName.toLowerCase()||"datalist"===n.node.nodeName.toLowerCase()||"param"===n.node.nodeName.toLowerCase()||!o.DOMUtil.getAncestor(n.node,["body"]))){var b={};for(var _ in g){var f=g[_],v=f[f.length-1];b[_]=v}for(var A={},w=0,y=this.getMatchingRules(g);w<y.length;w++){for(var C=y[w],k=!0,R=0,x=C.rule.dependencies||[];R<x.length;R++)A[x[R]]||(k=!1);if(k){var P=[];(new Date).getTime();try{P=C.run(this,b,t,g)}catch(e){}0===P.length&&(A[C.rule.id]=!0);for(var T=0,U=P;T<U.length;T++){var I=U[T];r.results.push(I),r.ruleTime+=I.ruleTime,r.numExecuted++,I.value[1]===u.eRuleConfidence.PASS&&(A[I.ruleId]=!0)}}}}}while(n.nextNode());return s.CacheUtil.clearCaches(e),r.totalTime=(new Date).getTime()-l,Promise.resolve(r)},e.prototype.enableRules=function(e){for(var t in this.ruleMap)this.ruleMap[t].enabled=!1;for(var i=0,a=e||[];i<a.length;i++)(t=a[i])in this.ruleMap?this.ruleMap[t].enabled=!0:console.warn("WARNING: Rule Id",t,"could not be enabled.")},e.prototype.getRule=function(e){return this.ruleMap[e]},e.prototype.getRulesIds=function(){var e=[];for(var t in this.ruleMap)e.push(t);return e},e.prototype.addRules=function(e){for(var t=0,i=e;t<i.length;t++){var a=i[t];this.addRule(a,!0)}this._sortRules()},e.prototype.addRule=function(e,t){var i=n.Context.parse(e.context),a=0,r=e.id;if(r in this.ruleMap)console.log("WARNING: Rule",r,"already added to engine. Ignoring...");else{this.ruleMap[r]=e;for(var l=0,o=i;l<o.length;l++){var s=o[l],u=r;a>=1&&(u=r+"$$"+a),++a;var d=new c(e,s);this.wrappedRuleMap[u]=d;var m=d.parsedInfo.contextInfo,p=m[m.length-1],h=p.namespace+":"+p.role;p.inclusive?(this.inclRules[h]=this.inclRules[h]||[],this.inclRules[h].push(d)):(this.exclRules[h]=this.exclRules[h]||[],this.exclRules[h].push(d))}t||this._sortRules()}},e.prototype.enableSourceMap=function(e){this.sourceMapEnabled=e},e.prototype.isSourceMapEnabled=function(){return this.sourceMapEnabled},e.prototype._sortRules=function(){for(var e in this.inclRules)this.inclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0});for(var e in this.exclRules)this.exclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0})},e.prototype.addNlsMap=function(e){for(var t in e)this.nlsMap[t]=e[t]},e.prototype.addHelpMap=function(e){for(var t in e)this.helpMap[t]=e[t]},e.prototype.getMessage=function(e,t,i){var a=e.indexOf("$$");if(a>=0&&(e=e.substring(0,a)),!(e in this.nlsMap))return e;var n=this.nlsMap[e][t||0];return n?n.replace(/\{(\d+)\}/g,function(e,t,a){return i[t]}):e+"_"+t},e.prototype.getHelp=function(e,t,i){return i||(i="latest"),"".concat(r.Config.helpRoot,"/").concat(i,"/doc").concat(this.getHelpRel(e,t))},e.prototype.getHelpRel=function(e,t){var i=e.indexOf("$$");return i>=0&&(e=e.substring(0,i)),e in this.helpMap?((t=t||0)in this.helpMap[e]?this.helpMap[e][t||0]:this.helpMap[e][0])||e+"_"+t:e},e.prototype.addMapper=function(e){this.mappers[e.getNamespace()]=e},e.match=function(e,t){var i=e.parsedInfo.contextInfo,a=i.length-1,n=i[a].namespace,r=t[n][t[n].length-1],l=r.node;if(!i[a].matches(t,t[n].length-1))return!1;if(1===i.length)return!0;if(r=t[n=i[0].namespace][t[n].length-1],--a,i.slice(0,i.length-1).some(function(e){return e.namespace!==n}))return console.error("[ERROR] Rule ".concat(e.rule.id," has inconsitent parent namespaces")),!1;for(var o=t[n].length-(r.node.isSameNode(l)?2:1);o>=0&&a>=0;){var s=i[a],u=i[a].matches(t,o);if(">"===s.connector){if(!u)return!1;--a,--o}else{if(" "!==s.connector)throw new Error("Context connector "+s.connector+" is not supported");if(s.inclusive)u&&--a,--o;else{if(!u)return!1;for(var d=!1,c=o-1;!d&&c>=0;--c)d=!i[a].matches(t,c);if(d)return!1;--a}}}return-1===a},e.prototype.getMatchingRules=function(t){var i=[];function a(a){for(var n=0,r=a;n<r.length;n++){var l=r[n];l.rule.enabled&&e.match(l,t)&&i.push(l)}}for(var n in t){var r=n+":"+(t[n].length>0?t[n][t[n].length-1].role:"none");for(var l in r in this.inclRules&&a(this.inclRules[r]),this.exclRules)l!==r&&a(this.exclRules[l]);r!==n+":none"&&(r.startsWith(n+":/")?n+":/*"in this.inclRules&&a(this.inclRules[n+":/*"]):n+":*"in this.inclRules&&a(this.inclRules[n+":*"]))}return this.sortDeps(i)},e.prototype.sortDeps=function(e){for(var t=[],i=0,a=e;i<a.length;i++){var n=a[i];t.push(n)}var r=[],l={},o=!1;do{o=!1;for(var s=0;s<t.length;++s){var u=t[s];if(!(u.rule.id in l)){var d=!0;if(u.rule.dependencies&&u.rule.dependencies.length>0)for(var c=0,m=u.rule.dependencies;c<m.length;c++)m[c]in l||(d=!1);d&&(o=!0,r.push(u),l[u.rule.id]=!0,t.splice(s--,1))}}}while(o);return r},e}();t.Engine=m},4516(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;var i=function(){function e(){}return e.DEBUG=!1,e.helpRoot="https://able.ibm.com/rules/archives",e}();t.Config=i},7507(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.DOMMapper=void 0;var r=i(3103),l=i(4566),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getRole=function(e){return e.nodeName.toLowerCase()},t.prototype.getNamespace=function(){return"dom"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=0;a<i.attributes.length;++a){var n=i.attributes[a];t[n.name.toLowerCase()]=n.nodeValue}return t},t.prototype.getBounds=function(e){if(1!==e.nodeType)return null;var t=l.CacheUtil.getCache(e,"DOMMapper_Bounds",void 0);if(void 0!==t)return t;var i=1;e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.devicePixelRatio&&(i=e.ownerDocument.defaultView.devicePixelRatio);var a=e.getBoundingClientRect();if(a){var n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,r=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,o={left:Math.ceil((a.left+n)*i),top:Math.ceil((a.top+r)*i),height:Math.ceil(a.height*i),width:Math.ceil(a.width*i)};return l.CacheUtil.setCache(e,"DOMMapper_Bounds",o),o}return null},t.prototype.getUnadjustedBounds=function(e){if(1!==e.nodeType)return null;var t=l.CacheUtil.getCache(e,"DOMMapper_UnadjustedBounds",void 0);if(void 0!==t)return t;var i=e.getBoundingClientRect();if(i){var a=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,r={left:Math.ceil(i.left+a),top:Math.ceil(i.top+n),height:Math.ceil(i.height),width:Math.ceil(i.width)};return l.CacheUtil.setCache(e,"DOMMapper_UnadjustedBounds",r),r}return null},t}(r.CommonMapper);t.DOMMapper=o},1686(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMUtil=void 0;var a=i(3864),n=function(){function e(){}return e.hasParent=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName);)i=a.DOMWalker.parentElement(i);return!!i},e.getAncestor=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName.toLowerCase());)i=a.DOMWalker.parentElement(i);return i},e.sameNode=function(e,t){return e===t||(e.isSameNode?e.isSameNode(t):!e.compareDocumentPosition||0===e.compareDocumentPosition(t))},e.cleanWhitespace=function(e){return e.replace(/[ \t\r\n]/g," ").replace(/ +/g," ")},e.cleanSpace=function(e){return e.replace(/ +/g," ")},e.isInSameTable=function(t,i){if(t&&i){var a=["table"],n=e.getAncestor(t,a),r=e.getAncestor(i,a);if(null!==n&&null!=r&&e.sameNode(n,r))return!0}return!1},e.shadowRootNode=function(e){for(var t=e;null!=t&&11!==t.nodeType;)t=t.parentNode;return t},e.objectCopyWithNodeRefs=function(e){if(!e)return e;if("object"!=typeof e)return"function"==typeof e?e:JSON.parse(JSON.stringify(e));if(e instanceof Node||e.nodeType)return e;var t=void 0;if("Array"===e.constructor.name){t=[];for(var i=0,a=e;i<a.length;i++){var n=a[i];t.push(this.objectCopyWithNodeRefs(n))}}else for(var r in t={},e)t[r]=this.objectCopyWithNodeRefs(e[r]);return t},e.getAncestorWithAttribute=function(e,t,i){for(var n=a.DOMWalker.parentNode(e);null!==n;){if(1===n.nodeType&&n.getAttribute(t)===i)return n;n=a.DOMWalker.parentNode(n)}return null},e}();t.DOMUtil=n},3864(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMWalker=void 0;var a=i(3946),n=function(){function e(e,t,i,a,n){this.DEBUGIDX=0,this.indent=0,this.DEBUG=!!n,this.root=i||(e&&e.ownerDocument?e.ownerDocument.documentElement:e),9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,9===this.node.nodeType&&(this.node=this.node.documentElement),this.bEndTag=null!=t&&1==t,this.considerHidden=a||!1}return e.prototype.elem=function(){return 1===this.node.nodeType&&this.node||null},e.parentNode=function(e){if(null===e)return null;var t=e.parentNode;return e.slotOwner?t=e.slotOwner:e.ownerElement?t=e.ownerElement:t&&11===t.nodeType&&(t=t.host?t.host:null),t},e.parentElement=function(t){var i=t;do{i=e.parentNode(i)}while(i&&1!==i.nodeType);return i},e.assignSlots=function(e){for(var t=e.querySelectorAll("slot"),i=0;i<t.length;++i)for(var a=t[i],n=a.assignedNodes(),r=0;r<n.length;++r)n[r].slotOwner=a,n[r].slotIndex=r},e.firstChildNotOwnedBySlot=function(e){for(var t=e.firstChild;t&&t.slotOwner;)t=t.nextSibling;return t},e.lastChildNotOwnedBySlot=function(e){for(var t=e.lastChild;t&&t.slotOwner;)t=t.previousSibling;return t},e.nextSiblingNotOwnedBySlot=function(e){for(var t=e.nextSibling;t&&t.slotOwner;)t=t.nextSibling;return t},e.previousSiblingNotOwnedBySlot=function(e){for(var t=e.previousSibling;t&&t.slotOwner;)t=t.previousSibling;return t},e.prototype.atRoot=function(){return!this.node.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var t=this,i=function(){for(var e="",i=0;i<t.indent;++i)e+=" ";return e},n=this.node.nodeName;if(!this.node)return this.bEndTag=!1,!1;do{if(this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var r=this.node.slotOwner,l=this.node.slotIndex+1;l<r.assignedNodes().length?(this.node=r.assignedNodes()[l],this.bEndTag=!1):(this.node=r,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(e.nextSiblingNotOwnedBySlot(this.node))this.node=e.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!0}}else{var o=this.node,s=this.node,u=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(o))&&o.contentDocument&&o.contentDocument.documentElement){var d=this.node;this.node=o.contentDocument.documentElement,this.node.ownerElement=d}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(s))&&s.shadowRoot&&s.shadowRoot.firstChild?(d=this.node,this.node=s.shadowRoot,this.node.ownerElement=d,e.assignSlots(this.node)):1===this.node.nodeType&&"slot"===s.nodeName.toLowerCase()&&u.assignedNodes().length>0?this.node=u.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!e.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=e.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return this.bEndTag&&(this.indent-=2),this.DEBUG&&console.log(i()+"<".concat(this.bEndTag?"/":"").concat(this.node.nodeName,"> (from ").concat(n,") ").concat(this.DEBUGIDX++)),this.DEBUG&&this.node.slotOwner&&console.log(i()+"slotOwner: ".concat(this.node.slotOwner.nodeName)),this.DEBUG&&this.node.slotIndex&&console.log(i()+"slotIndex: ".concat(this.node.slotIndex)),this.DEBUG&&this.node.ownerElement&&console.log(i()+"ownerElement: ".concat(this.node.ownerElement.nodeName)),this.bEndTag||(this.indent+=2),!0},e.prototype.prevNode=function(){do{if(this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(t))&&t.contentDocument&&t.contentDocument.documentElement){var n=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=n}else if(1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(i))&&i.shadowRoot&&i.shadowRoot.lastChild)n=this.node,this.node=i.shadowRoot,this.node.ownerElement=n,e.assignSlots(this.node);else if(1===this.node.nodeType&&"slot"===i.nodeName.toLowerCase()&&i.assignedNodes().length>0){var r=i;this.node=r.assignedNodes()[r.assignedNodes().length-1]}else 1!==this.node.nodeType&&11!==this.node.nodeType||!e.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=e.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(this.node.slotOwner){var l=this.node.slotOwner,o=this.node.slotIndex-1;o>=0?(this.node=l.assignedNodes()[o],this.bEndTag=!0):(this.node=l,this.bEndTag=!1)}else if(e.previousSiblingNotOwnedBySlot(this.node))this.node=e.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return!0},e}();t.DOMWalker=n},8601(e,t){var i,a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eGuidelineType=t.eGuidelineCategory=t.eToolkitLevel=void 0,(n=t.eToolkitLevel||(t.eToolkitLevel={})).LEVEL_ONE="1",n.LEVEL_TWO="2",n.LEVEL_THREE="3",n.LEVEL_FOUR="4",(a=t.eGuidelineCategory||(t.eGuidelineCategory={})).ACCESSIBILITY="Accessibility",a.DESIGN="Design",a.OTHER="Other",(i=t.eGuidelineType||(t.eGuidelineType={})).DEFAULT="default",i.EXTENSION="extension"},461(e,t,i){var a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eRulesetType=t.eRuleCategory=t.eToolkitLevel=t.RuleManual=t.RulePotential=t.RuleFail=t.RuleRender=t.RulePass=t.eRulePolicy=t.eRuleConfidence=void 0,function(e){e.PASS="PASS",e.FAIL="FAIL",e.POTENTIAL="POTENTIAL",e.MANUAL="MANUAL"}(a=t.eRuleConfidence||(t.eRuleConfidence={})),function(e){e.VIOLATION="VIOLATION",e.RECOMMENDATION="RECOMMENDATION",e.INFORMATION="INFORMATION"}(n=t.eRulePolicy||(t.eRulePolicy={})),t.RulePass=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleRender=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:0,messageArgs:t||[],apiArgs:i||[]}},t.RuleFail=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.FAIL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RulePotential=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.POTENTIAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleManual=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.MANUAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}};var r=i(8601);Object.defineProperty(t,"eToolkitLevel",{enumerable:!0,get:function(){return r.eToolkitLevel}});var l=i(8601);Object.defineProperty(t,"eRuleCategory",{enumerable:!0,get:function(){return l.eGuidelineCategory}});var o=i(8601);Object.defineProperty(t,"eRulesetType",{enumerable:!0,get:function(){return o.eGuidelineType}})},7412(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.Checker=void 0;var l=i(461),o=i(7301),s=i(9955),u=i(6160),d=r(i(591)),c=i(8601),m=[],p={},h={};!function(){var e=JSON.parse(JSON.stringify(o.Engine.getLanguages()));for(var t in e.push("en-US"),d){var i=d[t];m.push(i);for(var a=e.length-1;a>=0;--a){var n=e[a];if(n in i.messages&&(p[i.id]=i.messages[n],p[i.id][0]=p[i.id].group),n in i.help){for(var r in h[i.id]={},i.help[n])h[i.id][r]="/".concat(n,"/").concat(i.help[n][r]);p[i.id][0]=p[i.id].group}}for(var l=0,s=i.rulesets;l<s.length;l++)for(var c=s[l],g=0,b=u.a11yRulesets;g<b.length;g++){var _=b[g];if(("string"==typeof c.id?[c.id]:c.id).includes(_.id))for(var f=0,v=_.checkpoints;f<v.length;f++){var A=v[f];("string"==typeof c.num?[c.num]:c.num).includes(A.num)&&(A.rules=A.rules||[],A.rules.push({id:i.id,reasonCodes:c.reasonCodes,level:c.level,toolkitLevel:c.toolkitLevel}))}}}}();var g=function(){function e(){this.guidelines=[],this.rulesets=this.guidelines,this.rulesetIds=[],this.rulesetRules={},this.ruleLevels={},this.ruleReasonLevels={},this.ruleCategory={};var e=this.engine=new o.Engine;e.addMapper(new s.ARIAMapper),e.addRules(m),e.addNlsMap(p),e.addHelpMap(h);for(var t=0,i=u.a11yRulesets;t<i.length;t++){var a=i[t];this.addRuleset(a)}}return e.prototype.addGuideline=function(e){e.id in this.rulesetRules&&this.removeGuideline(e.id),this.guidelines.push(e),this.rulesetIds.push(e.id);for(var t=[],i=0,a=e.checkpoints;i<a.length;i++){var n=a[i];n.rules=n.rules||[];for(var r=0,l=n.rules;r<l.length;r++){var o=l[r];if(!1!==o.enabled){t.push(o.id),this.ruleReasonLevels[o.id]=this.ruleReasonLevels[o.id]||{},this.ruleReasonLevels[o.id][e.id]=this.ruleReasonLevels[o.id][e.id]||{};var s=o.reasonCodes?o.reasonCodes.join("--"):"None";this.ruleReasonLevels[o.id][e.id][s]=o.level,this.ruleCategory[o.id]=this.ruleCategory[o.id]||{},this.ruleCategory[o.id][e.id]=e.category}}}this.rulesetRules[e.id]=t},e.prototype.enableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,r=0,l=a.checkpoints;r<l.length;r++)for(var o=0,s=l[r].rules;o<s.length;o++){var u=s[o];!1===u.enabled&&(n=!0,delete u.enabled)}n&&this.addGuideline(a)}},e.prototype.disableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,r=0,l=a.checkpoints;r<l.length;r++)for(var o=0,s=l[r].rules;o<s.length;o++){var u=s[o];!1!==u.enabled&&(n=!0,u.enabled=!1)}n&&this.addGuideline(a)}},e.prototype.removeGuideline=function(e){e in this.rulesetRules&&(delete this.rulesetRules[e],this.rulesets=this.guidelines=this.guidelines.filter(function(t){return t.id!==e}),this.rulesetIds=this.getGuidelineIds())},e.prototype.getGuidelines=function(){return JSON.parse(JSON.stringify(this.guidelines))},e.prototype.getGuidelineIds=function(){return this.guidelines.map(function(e){return e.id})},e.prototype.addRuleset=function(e){this.addGuideline(e)},e.prototype.enableSourceMap=function(e){this.engine.enableSourceMap(e)},e.prototype.isSourceMapEnabled=function(){return this.engine.isSourceMapEnabled()},e.prototype.check=function(e,t){var i=[];if(t){"string"==typeof t&&(t=[t]);for(var a=0,n=t;a<n.length;a++){var r=n[a];r in this.rulesetRules&&(i=i.concat(this.rulesetRules[r]))}}else i=this.engine.getRulesIds();this.engine.enableRules(i);var l=this;return this.engine.run(e).then(function(e){e.nls={};for(var i=0,a=e.results;i<a.length;i++){var n=a[i];n.ruleId in p&&(e.nls[n.ruleId]=e.nls[n.ruleId]||{0:p[n.ruleId][0]},n.reasonId in p[n.ruleId]&&(e.nls[n.ruleId][n.reasonId]=p[n.ruleId][n.reasonId]));var r=n.reasonId?n.reasonId:"None";n.value[0]=l.getReasonLevel(t,n.ruleId,r),n.category=l.getCategory(t,n.ruleId),delete n.path.css}return e})},e.prototype.getLevel=function(e,t){if(!e)return l.eRulePolicy.INFORMATION;var i=this.ruleLevels[t],a=null;if(e){if(!(t in this.ruleLevels))throw new Error("Rule triggered for which we have no rule level information: "+t);for(var n=0,r=e;n<r.length;n++){var o=r[n];o in i&&(i[o]===l.eRulePolicy.VIOLATION?a=l.eRulePolicy.VIOLATION:i[o]===l.eRulePolicy.RECOMMENDATION&&null===a?a=l.eRulePolicy.RECOMMENDATION:null===a&&(a=l.eRulePolicy.INFORMATION))}}if(null===a)throw new Error("Rule triggered for which we have no rule level information: "+t);return a},e.prototype.getReasonLevel=function(e,t,i){if(!e)return l.eRulePolicy.INFORMATION;var a=this.ruleReasonLevels[t],n=null;if(e){if(!(t in this.ruleReasonLevels))throw new Error("Rule triggered for which we have no rule level information "+t);for(var r=function(e){if(e in a){var t=new RegExp("(^|--)".concat(i,"($|--)"));Object.keys(a[e]).forEach(function(i){var r=null;"None"===i?r=a[e].None:t.test(i)&&(r=a[e][i]),null!==r&&(r===l.eRulePolicy.VIOLATION?n=l.eRulePolicy.VIOLATION:r===l.eRulePolicy.RECOMMENDATION&&null===n?n=l.eRulePolicy.RECOMMENDATION:null===n&&(n=l.eRulePolicy.INFORMATION))}),null===n&&(n=l.eRulePolicy.INFORMATION)}},o=0,s=e;o<s.length;o++)r(s[o])}if(null===n)throw new Error("Rule triggered for which we have no rule level information: "+t);return n},e.prototype.getCategory=function(e,t){var i=this.ruleCategory[t];if(!(t in this.ruleCategory))return c.eGuidelineCategory.OTHER;e||(e=this.getGuidelineIds());for(var a=0,n=e;a<n.length;a++){var r=n[a];if(r in i)return i[r]}return c.eGuidelineCategory.OTHER},e}();t.Checker=g},2297(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_target_warning=void 0;var a=i(7139),n=i(3946),r=i(5279),l=i(461),o=i(461);t.a_target_warning={id:"a_target_warning",context:"dom:a[target],dom:area[target],dom:base[target]",refactor:{WCAG20_A_TargetAndText:{Pass_0:"pass",Potential_1:"potential_warn"}},help:{"en-US":{group:"a_target_warning.html",pass:"a_target_warning.html",potential_warn:"a_target_warning.html"}},messages:{"en-US":{group:"Users should be warned in advance if their input action will open a new window",pass:"The user is warned in advance that the input action opens a new window",potential_warn:"Inform the user when their input action will open a new window"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.2.2",level:o.eRulePolicy.RECOMMENDATION,toolkitLevel:o.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var o=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(o)&&!a.CommonUtil.isTabbable(o))return null;var s={paramWinText:{value:["new window","new tab"],type:"array"}},u=o.getAttribute("target"),d="_parent"==u||"_self"==u||"_top"==u||null!=a.CommonUtil.getFrameByName(o,u);if(!d){var c=a.CommonUtil.getInnerText(o);if(o.hasAttribute("title")&&(c+=" "+o.getAttribute("title")),o.hasAttribute("aria-describedby"))for(var m=0,p=o.getAttribute("aria-describedby").trim().split(/\s+/);m<p.length;m++){var h=p[m],g=r.FragmentUtil.getById(o,h);if(g){var b=a.CommonUtil.getInnerText(g);b&&b.trim().length>0&&(c+=" "+b)}}for(var _=0;!d&&_<s.paramWinText.value.length;++_)-1!=c.indexOf(s.paramWinText.value[_])&&(d=!0)}return d?(0,l.RulePass)("pass"):(0,l.RulePotential)("potential_warn")}}},4401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_text_purpose=void 0;var a=i(461),n=i(7139),r=i(3946),l=i(461),o=i(1950);t.a_text_purpose={id:"a_text_purpose",context:"aria:link,aria:doc-biblioref",refactor:{WCAG20_A_HasText:{Pass_0:"pass",Fail_1:"fail_acc_name"}},help:{"en-US":{group:"a_text_purpose.html",pass:"a_text_purpose.html",fail_acc_name:"a_text_purpose.html"}},messages:{"en-US":{group:"Hyperlinks must have an accessible name for their purpose",pass:"Hyperlink has a description of its purpose",fail_acc_name:"Hyperlink has no link text, label or image with a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["2.4.4","4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:"c487ae",run:function(e,t){var i=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(i)||n.CommonUtil.isNodeDisabled(i))return null;var l=o.AccNameUtil.computeAccessibleName(i);return l&&l.name&&l.name.trim().length>0||n.CommonUtil.nonTabableChildCheck(i)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},4546(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.applet_alt_exists=void 0;var a=i(7139),n=i(3946),r=i(461),l=i(461);t.applet_alt_exists={id:"applet_alt_exists",context:"dom:applet",refactor:{WCAG20_Applet_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"applet_alt_exists.html",Pass_0:"applet_alt_exists.html",Fail_1:"applet_alt_exists.html",Fail_2:"applet_alt_exists.html",Fail_3:"applet_alt_exists.html"}},messages:{"en-US":{group:"<applet> elements must provide an 'alt' attribute and an alternative description",Pass_0:"Rule Passed",Fail_1:"An <applet> element does not have an 'alt' attribute that provides a short text alternative",Fail_2:"The 'alt' attribute value for an <applet> element duplicates the 'code' attribute",Fail_3:"An <applet> element provides alternative text, but does not provide inner content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;if(a.CommonUtil.attributeNonEmpty(l,"alt")){var o=l.getAttribute("alt").trim();return l.hasAttribute("code")&&o==l.getAttribute("code").trim()?(0,r.RuleFail)("Fail_2"):a.CommonUtil.hasInnerContentHidden(l)?(0,r.RulePass)("Pass_0"):(0,r.RuleFail)("Fail_3")}return(0,r.RuleFail)("Fail_1")}}},9292(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.application_content_accessible=void 0;var a=i(7011),n=i(3946),r=i(461),l=i(461);t.application_content_accessible={id:"application_content_accessible",context:"aria:application",refactor:{HAAC_Application_Role_Text:{0:"HAAC_Application_Role_Text.html",Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{0:"application_content_accessible.html",Pass_0:"application_content_accessible.html",Potential_1:"application_content_accessible.html"}},messages:{"en-US":{group:'Non-decorative static text and image content within an element with "application" role must be accessible',Pass_0:"Rule Passed",Potential_1:'Verify that the non-decorative static text and image content within an element with "application" role are accessible'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.1.1","2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){for(var l=!0,o=e.dom.node.childNodes,s=0;l&&s<o.length;s++)1===o[s].nodeType?n.VisUtil.isNodeVisible(o[s])&&(l=a.AriaUtil.hasRoleInSemantics(o[s],"document")||a.AriaUtil.hasRoleInSemantics(o[s],"article")):3===o[s].nodeType&&(l=0===o[s].nodeValue.trim().length);return l?(0,r.RulePass)("Pass_0"):(0,r.RulePotential)("Potential_1")}}},9605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.area_alt_exists=void 0;var a=i(7139),n=i(3946),r=i(461),l=i(461);t.area_alt_exists={id:"area_alt_exists",context:"dom:area",refactor:{WCAG20_Area_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"area_alt_exists.html",Pass_0:"area_alt_exists.html",Fail_1:"area_alt_exists.html"}},messages:{"en-US":{group:"<area> elements in an image map must have a text alternative",Pass_0:"Rule Passed",Fail_1:"<area> element in an image map has no text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.VisUtil.isNodeHiddenFromAT(l)?null:a.CommonUtil.attributeNonEmpty(l,"alt")?(0,r.RulePass)("Pass_0"):(0,r.RuleFail)("Fail_1")}}},3987(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_accessiblename_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946),o=i(1950),s=i(9910);t.aria_accessiblename_exists={id:"aria_accessiblename_exists",context:"aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example",help:{"en-US":{pass:"aria_accessiblename_exists.html",fail_no_accessible_name:"aria_accessiblename_exists.html",fail_no_accessible_name_image:"aria_accessiblename_exists.html",group:"aria_accessiblename_exists.html"}},messages:{"en-US":{pass:"An accessible name is provided for the element",fail_no_accessible_name:'Element <{0}> with "{1}" role has no accessible name',fail_no_accessible_name_image:'Element <{0}> with "{1}" role has no accessible name',group:"Elements with certain roles should have accessible names"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name_image"]}],act:[{"23a2a8":{fail_no_accessible_name_image:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var u=n.nodeName.toLocaleLowerCase();if("svg"!==u&&"img"!==u){if("table"===u&&n.firstElementChild&&"caption"===n.firstElementChild.nodeName.toLowerCase()&&n.firstElementChild.textContent&&n.firstElementChild.textContent.trim().length>0)return(0,a.RulePass)("pass");var d=r.AriaUtil.getRolesUndefinedByAria(n);if(d&&d.length>0)return null;var c=r.AriaUtil.getDeprecatedAriaRoles(n);if(c&&c.length>0)return null;var m=r.AriaUtil.getDeprecatedAriaAttributes(n);if(m&&m.length>0)return null;var p=r.AriaUtil.getResolvedRole(n);if(!p||!s.ARIADefinitions.designPatterns[p]||!s.ARIADefinitions.designPatterns[p].nameRequired)return null;var h=o.AccNameUtil.computeAccessibleName(n);return h&&h.name&&0!==h.name.trim().length?(0,a.RulePass)("pass"):"img"===p||"image"===p?(0,a.RuleFail)("fail_no_accessible_name_image",[n.nodeName.toLowerCase(),p]):(0,a.RuleFail)("fail_no_accessible_name",[n.nodeName.toLowerCase(),p])}}}},8631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_tabindex_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.aria_activedescendant_tabindex_valid={id:"aria_activedescendant_tabindex_valid",context:"dom:*[aria-activedescendant]",refactor:{Rpt_Aria_InvalidTabindexForActivedescendant:{pass:"pass",Fail_1:"Fail_1"}},help:{"en-US":{pass:"aria_activedescendant_tabindex_valid.html",Fail_1:"aria_activedescendant_tabindex_valid.html",group:"aria_activedescendant_tabindex_valid.html"}},messages:{"en-US":{pass:"Rule Passed",Fail_1:"The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable",group:"Element using 'aria-activedescendant' property should be tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!1,o=n.nodeName.toLowerCase();if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if(r.CommonUtil.isNodeDisabled(n))return null;if(0!==n.getAttribute("aria-activedescendant").trim().length){(l=r.CommonUtil.isTabbable(n))||(l=r.CommonUtil.getTabbableChildren(n)>0);var s=new Array;s.push(o);var u=new Array;return u.push(n.getAttribute("aria-activedescendant").split(" ").join(", ")),l?(0,a.RulePass)("pass"):(0,a.RuleFail)("Fail_1",[s.toString(),u.toString()])}}}},8025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(3946),u=i(1686);t.aria_activedescendant_valid={id:"aria_activedescendant_valid",context:"dom:*[aria-activedescendant]",refactor:{HAAC_ActiveDescendantCheck:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"aria_activedescendant_valid.html",Fail_1:"aria_activedescendant_valid.html",Fail_2:"aria_activedescendant_valid.html",Fail_3:"aria_activedescendant_valid.html",group:"aria_activedescendant_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'aria-activedescendant' property is empty",Fail_2:"The 'aria-activedescendant' property references a hidden node",Fail_3:"Element is not a combobox, and the referenced active-descendant element is not a valid descendant",group:"The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.AriaUtil.hasRoleInSemantics(n,"combobox"))return null;var d=r.AriaUtil.getAriaAttribute(n,"aria-activedescendant");if(!d||""===d.trim())return(0,a.RuleFail)("Fail_1");var c=o.FragmentUtil.getById(n,d.trim());if(!c||u.DOMUtil.sameNode(d,n))return null;if(!s.VisUtil.isNodeVisible(c))return(0,a.RuleFail)("Fail_2");if(n.contains(c))return(0,a.RulePass)("Pass_0");var m=2;if(n.hasAttribute("aria-owns"))for(var p=l.CommonUtil.normalizeSpacing(n.getAttribute("aria-owns").trim()).split(" "),h=0;h<p.length;h++)if((v=o.FragmentUtil.getById(n,p[h]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0");if(r.AriaUtil.hasRoleInSemantics(n,"textbox")&&n.hasAttribute("aria-controls")){m=3;var g=l.CommonUtil.normalizeSpacing(n.getAttribute("aria-controls").trim()).split(" ");for(h=0;h<g.length;h++){var b=o.FragmentUtil.getById(n,g[h]);if(b&&!u.DOMUtil.sameNode(b,n)&&b.contains(c))return(0,a.RulePass)("Pass_0");if(b.hasAttribute("aria-owns"))for(var _=l.CommonUtil.normalizeSpacing(b.getAttribute("aria-owns").trim()).split(" "),f=0;f<_.length;f++){var v;if((v=o.FragmentUtil.getById(n,_[f]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0")}}}return 3==m?(0,a.RuleFail)("Fail_3"):null}}},1198(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_application_label_unique={id:"aria_application_label_unique",context:"aria:application",refactor:{Rpt_Aria_MultipleApplicationLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_application_label_unique.html",fail_label_not_unique:"aria_application_label_unique.html",group:"aria_application_label_unique.html"}},messages:{"en-US":{pass:'The element with "application" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "application" role do not have unique labels',group:'Each element with "application" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"application");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8001(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_labelled=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.aria_application_labelled={id:"aria_application_labelled",context:"aria:application",refactor:{Rpt_Aria_ApplicationLandmarkLabel:{Pass_0:"pass",Fail_1:"fail_no_label"}},help:{"en-US":{pass:"aria_application_labelled.html",fail_no_label:"aria_application_labelled.html",group:"aria_application_labelled.html"}},messages:{"en-US":{pass:'The element with "application" role has a label that describes its purpose',fail_no_label:'Element with "application" role does not have a label',group:'Each element with "application" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_label")}}},5778(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_article_label_unique=void 0;var a=i(461),n=i(461),r=i(3946),l=i(7011);t.aria_article_label_unique={id:"aria_article_label_unique",context:"aria:article",refactor:{Rpt_Aria_MultipleArticleRoles_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_article_label_unique.html",fail_label_not_unique:"aria_article_label_unique.html",group:"aria_article_label_unique.html"}},messages:{"en-US":{pass:'The element with "article" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "article" role do not have unique labels',group:'Each element with "article" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"article");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8118(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_allowed=void 0;var a=i(461),n=i(461),r=i(9910),l=i(7011);t.aria_attribute_allowed={id:"aria_attribute_allowed",context:"dom:*",refactor:{Rpt_Aria_ValidProperty:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_allowed.html",Pass_0:"aria_attribute_allowed.html",Fail_1:"aria_attribute_allowed.html"}},messages:{"en-US":{group:"ARIA attributes must be valid for the element's role",Pass_0:"Rule Passed",Fail_1:"The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"5f99a7",run:function(e,t,i){var n=e.dom.node,o=n.attributes;if(o){for(var s=r.ARIADefinitions.propertyDataTypes,u="",d=0,c=0,m=o.length;c<m;c++){var p=o[c].name;l.AriaUtil.isDefinedAriaAttribute(n,p)&&(d++,s[p]||(u=0==u.length?p:u+", "+p))}return 0==d?null:0!=u.length?(0,a.RuleFail)("Fail_1",[u,n.nodeName.toLowerCase()]):(0,a.RulePass)("Pass_0")}return null}}},2242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_conflict=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.aria_attribute_conflict={id:"aria_attribute_conflict",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{fail_conflict:"aria_attribute_conflict.html",group:"aria_attribute_conflict.html"}},messages:{"en-US":{fail_conflict:'The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"',group:"An ARIA attribute must not conflict with the corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.AriaUtil.getInvalidAriaAttributes(n);if(o&&o.length>0)return null;var s=[],u=r.AriaUtil.getUserDefinedAriaAttributes(n);if(!u||0===u.length)return null;for(var d=r.AriaUtil.getConflictAriaAndHtmlAttributes(n),c=0;c<d.length;c++)s.push((0,a.RuleFail)("fail_conflict",[d[c].ariaAttr,d[c].htmlAttr])),u.includes(d[c].ariaAttr)&&l.CommonUtil.reduceArrayItemList([d[c].ariaAttr],u);return s.length>0?s:null}}},3673(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_deprecated=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_attribute_deprecated={id:"aria_attribute_deprecated",context:"dom:*",help:{"en-US":{fail_aria_role:"aria_attribute_deprecated.html",fail_aria_attr:"aria_attribute_deprecated.html",fail_role_attr:"aria_attribute_deprecated.html",group:"aria_attribute_deprecated.html"}},messages:{"en-US":{fail_aria_role:'The ARIA role "{0}" is deprecated in the ARIA specification',fail_aria_attr:'The ARIA attributes "{0}" are deprecated in the ARIA specification',fail_role_attr:'The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification',group:"No deprecated ARIA role or attribute should be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=[],o=r.AriaUtil.getDeprecatedAriaRoles(n);if(o&&o.length>0)for(var s=0;s<o.length;s++)l.push((0,a.RuleFail)("fail_aria_role",[o[s]]));var u=r.AriaUtil.getDeprecatedAriaAttributes(n);if(u&&u.length>0)for(s=0;s<u.length;s++)"any"===u[s].role?l.push((0,a.RuleFail)("fail_aria_attr",[u[s].attribute])):l.push((0,a.RuleFail)("fail_role_attr",[u[s].attribute,u[s].role]));return l.length>0?l:null}}},5080(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3946);t.aria_attribute_exists={id:"aria_attribute_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_EmptyPropertyValue:{pass:"pass",fail_empty_attribute:"fail_empty_attribute"}},help:{"en-US":{pass:"aria_attribute_exists.html",fail_empty_attribute:"aria_attribute_exists.html",group:"aria_attribute_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_empty_attribute:"The element attribute(s): '{0}' value is empty",group:"When specifying a required ARIA attribute, the value must not be empty"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["6a7281"],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)){var u=new Array,d=o.ARIADefinitions.designPatterns,c=l.CommonUtil.hasAttribute,m=0,p=r.AriaUtil.getResolvedRole(n);if(p){if(d[p]&&null!=r.AriaUtil.getRoleRequiredProperties(p,n))for(var h=r.AriaUtil.getRoleRequiredProperties(p,n),g=0,b=h.length;g<b;g++)c(n,w=h[g])?(m++,0==l.CommonUtil.normalizeSpacing(n.getAttribute(h[g])).length&&u.push(h[g])):"aria-labelledby"==h[g]?"radiogroup"==p&&c(n,"aria-label")&&(m++,0==l.CommonUtil.normalizeSpacing(n.getAttribute("aria-label")).length&&u.push("aria-label")):"aria-valuenow"==h[g]&&"progressbar"==p&&c(n,"aria-valuetext")&&(m++,0==l.CommonUtil.normalizeSpacing(n.getAttribute("aria-valuetext")).length&&u.push("aria-valuetext"));if(d[p]){var _=r.AriaUtil.getElementAriaProperty(n),f=[];f.push(p);for(var v=r.AriaUtil.getAllowedAriaAttributes(n,f,_),A=(g=0,v.length);g<A;g++){var w;"aria-checked"!=(w=v[g])&&"aria-selected"!=w&&"aria-expanded"!=w&&"aria-orientation"!=w&&"aria-level"!=w||c(n,w)&&(m++,0!=l.CommonUtil.normalizeSpacing(n.getAttribute(w)).length||u.includes(w)||u.push(w))}}var y=new Array,C=0==u.length;return y.push(u.join(", ")),0==m?null:C?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_empty_attribute",y)}}}}},183(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_redundant=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_attribute_redundant={id:"aria_attribute_redundant",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{pass:"aria_attribute_redundant.html",fail_redundant:"aria_attribute_redundant.html",group:"aria_attribute_redundant.html"}},messages:{"en-US":{pass:"The ARIA attribute is not redundant with a corresponding HTML attribute",fail_redundant:'The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"',group:"An ARIA attribute should not be redundant with a corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.AriaUtil.getInvalidAriaAttributes(n);if(l&&l.length>0)return null;var o=r.AriaUtil.getConflictAriaAndHtmlAttributes(n);if(o&&o.length>0)return null;var s=n.attributes,u=[],d=[];if(s)for(var c=0;c<s.length;c++){var m=s[c].name.trim().toLowerCase(),p=n.getAttribute(m);""===p&&(p=null),"aria-"===m.substring(0,5)?u.push({name:m,value:p}):d.push({name:m,value:p})}var h=[],g=function(e){var t=r.AriaUtil.getConflictOrOverlappingHtmlAttribute(u[e],d,"overlapping");if(null===t)return"continue";t.forEach(function(t){"Pass"===t.result?h.push((0,a.RulePass)("pass")):"Failed"===t.result&&h.push((0,a.RuleFail)("fail_redundant",[u[e].name,t.attr]))})};for(c=0;c<u.length;c++)g(c);return h.length>0?h:null}}},6805(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_required=void 0;var a=i(9910),n=i(7011),r=i(7139),l=i(461),o=i(461);t.aria_attribute_required={id:"aria_attribute_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredProperties:{Pass_0:"pass",Fail_1:"fail_missing"}},help:{"en-US":{group:"aria_attribute_required.html",pass:"aria_attribute_required.html",fail_missing:"aria_attribute_required.html"}},messages:{"en-US":{group:"The required attributes for the element with a role must be defined",pass:"The required attributes for the element with the role are defined",fail_missing:"Element with '{0}' role does not have the required ARIA attribute(s): '{1}'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:"4e8ab6",run:function(e,t,i){var o=e.dom.node,s=new Array,u=new Array,d=a.ARIADefinitions.designPatterns,c=r.CommonUtil.hasAttribute,m=n.AriaUtil.getElementAriaProperty(o),p=n.AriaUtil.getResolvedRole(o);if(p){var h=n.AriaUtil.getRoleRequiredProperties(p,o);if(d[p]&&null!==h){for(var g=n.AriaUtil.getAllowedAriaAttributes(o,p,m),b=!1,_=0,f=h.length;_<f;_++)g.includes(h[_])&&(c(o,h[_])||("aria-labelledby"==h[_]?c(o,"aria-label")&&"radiogroup"==p||(s.push(h[_]),b=!0):"aria-valuenow"==h[_]?c(o,"aria-valuetext")&&"progressbar"==p||(s.push(h[_]),b=!0):"aria-controls"==h[_]&&"combobox"==p||(s.push(h[_]),b=!0)));1==b&&u.push(p)}if(0==u.length||0==s.length)return(0,l.RulePass)("pass");var v=new Array;return v.push(u.join(", ")),v.push(s.join(", ")),(0,l.RuleFail)("fail_missing",v)}}}},1886(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_value_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910);t.aria_attribute_value_valid={id:"aria_attribute_value_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{Rpt_Aria_ValidPropertyValue:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_value_valid.html",Pass_0:"aria_attribute_value_valid.html",Fail_1:"aria_attribute_value_valid.html"}},messages:{"en-US":{group:"ARIA property values must be valid",Pass_0:"Rule Passed",Fail_1:"The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"6a7281",run:function(e,t,i){var n=e.dom.node,s=new Array,u=new Array,d=new Array,c=o.ARIADefinitions.propertyDataTypes,m=n.attributes,p=0;if(m)for(var h=0,g=m.length;h<g;h++){var b=m[h].name;if(r.AriaUtil.isDefinedAriaAttribute(n,b)){var _=c[b],f=l.CommonUtil.normalizeSpacing(m[h].nodeValue);if(p++,_&&_.values){if(-1==_.values.indexOf(f))if(-1!=_.values.indexOf("undefined")&&0==f.length);else if("http://www.w3.org/2001/XMLSchema#nmtokens"===_.type){var v=m[h].nodeValue.trim().split(" ");if(v.length>1&&v.includes("all"))s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString());else for(var A={},w=0;w<v.length;w++)""==v[w]||_.values.includes(v[w])||(A.hasOwnProperty(b)||(A[b]=!0,u.push(b)),s.push(v[w]),d.push(_.values.toString()))}else s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString())}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#int"===_.type){var y=parseInt(f);(isNaN(y)||""+y!==f)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#decimal"==_.type){var C=parseFloat(f);isNaN(C)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#boolean"==_.type){var k=f.trim().toLowerCase();"true"!==k&&"false"!==k&&(s.push(f),u.push(b))}else _&&_.type&&"http://www.w3.org/2001/XMLSchema#string"==_.type||p--}}var R=new Array,x=0==u.length;return R.push(s.join(", ")),R.push(u.join(", ")),R.push(n.nodeName.toLowerCase()),0==p?null:x?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",R)}}},4078(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_banner_label_unique={id:"aria_banner_label_unique",context:"aria:banner",refactor:{Rpt_Aria_MultipleBannerLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_banner_label_unique.html",fail_label_not_unique:"aria_banner_label_unique.html",group:"aria_banner_label_unique.html"}},messages:{"en-US":{pass:'The element with "banner" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "banner" role do not have unique labels',group:'Each element with "banner" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"banner",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5750(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_single=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_banner_single={id:"aria_banner_single",context:"dom:*[role], dom:header",refactor:{Rpt_Aria_OneBannerInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_single.html",Fail_1:"aria_banner_single.html",group:"aria_banner_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role found on the page',group:'A page, document, or application should only have one element with "banner" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"banner")?null===r.AriaUtil.getSiblingWithRoleHidden(n,"banner",!0,!0)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},85(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_tabbable=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3946);t.aria_child_tabbable={id:"aria_child_tabbable",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingFocusableChild:{pass:"pass",fail_missing_child:"fail_missing_child"}},help:{"en-US":{pass:"aria_child_tabbable.html",fail_missing_child:"aria_child_tabbable.html",group:"aria_child_tabbable.html"}},messages:{"en-US":{pass:"Rule Passed",fail_missing_child:'None of the descendent elements with "{1}" role is tabbable',group:"UI component must have at least one tabbable descendant for keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||l.CommonUtil.isNodeDisabled(n)||r.AriaUtil.containsPresentationalChildrenOnly(n)||r.AriaUtil.shouldBePresentationalChild(n))){if(r.AriaUtil.hasRole(n,{list:!0,row:!0,rowgroup:!0,table:!0,grid:!0}))return null;if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if("datalist"===n.nodeName.toLowerCase())return null;if(r.AriaUtil.isNavigationOwnedOrControlled(n))return null;var u=r.AriaUtil.getResolvedRole(n),d=!0,c=n.ownerDocument,m=l.CommonUtil.hasAttribute,p=new Array,h="",g=!1;if(o.ARIADefinitions.containers.includes(u)&&"true"!=(m(n,"aria-disabled")?n.getAttribute("aria-disabled"):"")&&!m(n,"aria-activedescendant")&&!l.CommonUtil.isTabbable(n)){var b=o.ARIADefinitions.designPatterns[u].reqChildren;if(b){g=!0,d=!1;for(var _="descendant::*[",f=0;f<b.length;f++)_+="@role='"+b[f]+"' or ";_=_.substring(0,_.length-4)+"]";for(var v=c.evaluate(_,n,l.CommonUtil.defaultNSResolver,0,null),A=v.iterateNext();A&&!d;)if(l.CommonUtil.shouldNodeBeSkippedHidden(A))A=v.iterateNext();else{if(!(d=l.CommonUtil.isTabbable(A)))for(var w=c.evaluate("descendant::*",A,l.CommonUtil.defaultNSResolver,0,null),y=w.iterateNext();y&&!d;)l.CommonUtil.shouldNodeBeSkippedHidden(y)||(d=l.CommonUtil.isTabbable(A)),y=w.iterateNext();d||(p=A.getAttribute("role").trim().split(" "),h=A.nodeName.toLowerCase()),A=v.iterateNext()}}}var C=new Array,k=new Array;return h.length>0&&p.length>0?(C.push(h),k.push(p.join(", "))):d=!0,g?d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_missing_child",[C.toString(),k.toString()]):null}}}},514(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_child_valid={id:"aria_child_valid",context:"dom:*",dependencies:["aria_role_valid","aria_descendant_valid"],help:{"en-US":{group:"aria_child_valid.html",Pass:"aria_child_valid.html",Fail_no_child:"aria_child_valid.html",Fail_invalid_child:"aria_child_valid.html"}},messages:{"en-US":{group:"An element with an ARIA role must own a required child",Pass:"An element with an ARIA role owns a required child",Fail_no_child:'The element with role "{0}" does not own any child element with any of the following role(s): "{1}"',Fail_invalid_child:'The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["bc4a75"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)&&!r.AriaUtil.containsPresentationalChildrenOnly(n)){var s=r.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=r.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=["none","presentation"];if(s.some(function(e){return u.includes(e)}))return null;if(s.includes("combobox"))return null;var d=r.AriaUtil.getRequiredChildRoles(n,!0);if(d.includes("group")){var c=d.indexOf("group");c>-1&&d.splice(c,1)}if(0==d.length)return null;var m=r.AriaUtil.getDirectATChildren(n);if(!m||0==m.length){var p=n.getAttribute("aria-busy");return p&&"true"===p?null:((v=new Array).push(s.join(", ")),v.push(d.join(", ")),(0,a.RuleFail)("Fail_no_child",v))}for(var h=new Array,g=0;g<m.length;g++){var b=r.AriaUtil.getRoles(m[g],!1);b&&0!=b.length||(b=r.AriaUtil.getImplicitRole(m[g])),b&&b.length>0&&(b.some(function(e){return d.includes(e)})||h.push(b.join(", ")))}if(h.length>0){for(var _=[],f=0;f<h.length;f++){var v;(v=new Array).push(s.join(", ")),v.push(h[f]),v.push(d.join(", ")),_.push((0,a.RuleFail)("Fail_invalid_child",v))}return _}return(0,a.RulePass)("Pass")}}}},5310(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_complementary_label_unique={id:"aria_complementary_label_unique",context:"aria:complementary",refactor:{Rpt_Aria_MultipleComplementaryLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_complementary_label_unique.html",fail_label_not_unique:"aria_complementary_label_unique.html",group:"aria_complementary_label_unique.html"}},messages:{"en-US":{pass:'The element with "complementary" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "complementary" role do not have unique labels',group:'Each element with "complementary" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"complementary");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},9083(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_complementary_label_visible={id:"aria_complementary_label_visible",context:"dom:*[role], dom:aside",dependencies:["aria_complementary_labelled"],refactor:{Rpt_Aria_ComplementaryLandmarkLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_visible.html",Fail_1:"aria_complementary_label_visible.html",group:"aria_complementary_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a visible label',group:'Each element with "complementary" role should have a visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"complementary")?l.CommonUtil.attributeNonEmpty(n,"aria-labelledby")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},6049(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_labelled=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.aria_complementary_labelled={id:"aria_complementary_labelled",context:"aria:complementary",refactor:{Rpt_Aria_ComplementaryRequiredLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_labelled.html",Fail_1:"aria_complementary_labelled.html",group:"aria_complementary_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a label',group:'Each element with "complementary" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_content_in_landmark=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(4566),s=i(3864),u=i(3946),d=i(9196);t.aria_content_in_landmark={id:"aria_content_in_landmark",context:"dom:*",refactor:{Rpt_Aria_OrphanedContent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_content_in_landmark.html",Fail_1:"aria_content_in_landmark.html",group:"aria_content_in_landmark.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Content is not within a landmark element",group:"All content must reside within an element with a landmark role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=o.CacheUtil.getCache(e.dom.node.ownerDocument,"aria_content_in_landmark",null);if(!n){(n={landmarks:{value:["banner","complementary","contentinfo","form","main","navigation","region","search"],type:"array"},possibleOrphanedWidgets:{value:["button","combobox","checkbox","grid","heading","link","list","listbox","menu","menubar","progressbar","radio","tablist","textbox","toolbar","tree","treegrid"],type:"array"},possibleOrphanedElements:{value:["p","table","input","textarea","select","button","a","ol","ul","dl","h1","h2","h3","h4","h5","h6","embed","object","area"],type:"array"},noLandmarkedRoles:{value:["alert","alertdialog","dialog","tooltip"],type:"array"},mapLandmarks:{},mapPossibleOrphanedWidgets:{},mapPossibleOrphanedElements:{},mapNoLandmarkedRoles:{}}).mapLandmarks={};for(var c=0;c<n.landmarks.value.length;++c)n.mapLandmarks[n.landmarks.value[c]]=!0;for(n.mapPossibleOrphanedWidgets={},c=0;c<n.possibleOrphanedWidgets.value.length;++c)n.mapPossibleOrphanedWidgets[n.possibleOrphanedWidgets.value[c]]=!0;for(n.mapPossibleOrphanedElements={},c=0;c<n.possibleOrphanedElements.value.length;++c)n.mapPossibleOrphanedElements[n.possibleOrphanedElements.value[c]]=!0;for(n.mapNoLandmarkedRoles={},c=0;c<n.noLandmarkedRoles.value.length;++c)n.mapNoLandmarkedRoles[n.noLandmarkedRoles.value[c]]=!0;o.CacheUtil.setCache(e.dom.node.ownerDocument,"aria_content_in_landmark",n)}var m=e.dom.node,p=m.nodeName.toLowerCase();if(!u.VisUtil.isNodeVisible(m)||null!=u.VisUtil.hiddenByDefaultElements&&null!=u.VisUtil.hiddenByDefaultElements&&u.VisUtil.hiddenByDefaultElements.indexOf(p)>-1)return(0,a.RulePass)("Pass_0");if(!l.CommonUtil.hasInnerContentHidden(m)&&-1===["area","input","embed","button","textarea","select"].indexOf(p))return(0,a.RulePass)("Pass_0");if("table"==p&&d.TableUtil.isLayoutTable(m))return null;var h=!0,g=r.AriaUtil.hasRole(m,n.mapPossibleOrphanedWidgets,!0);"link"===p&&(g=!1);var b=p in n.mapPossibleOrphanedElements;if(!g&&!b)return null;if(!(h=i.aria.map(function(e){return e.role}).filter(function(e){return e in n.mapLandmarks}).length>0)){for(var _=s.DOMWalker.parentElement(m);!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=s.DOMWalker.parentElement(_);for(_=m.nextElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.nextElementSibling;for(_=m.previousElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.previousElementSibling;if(h)return null;if(o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent",!0),h=o.CacheUtil.getCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!1)||r.AriaUtil.hasRole(m,n.mapNoLandmarkedRoles,!0)||r.AriaUtil.getAncestorWithRole(m,n.mapNoLandmarkedRoles,!0))return o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!0),null}return h?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2759(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_contentinfo_label_unique={id:"aria_contentinfo_label_unique",context:"aria:contentinfo",refactor:{Rpt_Aria_MultipleContentinfoLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_contentinfo_label_unique.html",fail_label_not_unique:"aria_contentinfo_label_unique.html",group:"aria_contentinfo_label_unique.html"}},messages:{"en-US":{pass:'The element with "contentinfo" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "contentinfo" role do not have unique labels',group:'Each element with "contentinfo" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"contentinfo",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},3141(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_misuse=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_contentinfo_misuse={id:"aria_contentinfo_misuse",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_ContentinfoWithNoMain_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_misuse.html",Fail_1:"aria_contentinfo_misuse.html",group:"aria_contentinfo_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "contentinfo" role is present without an element with "main" role',group:'Each element with "contentinfo" role is only permitted with an element with "main" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"contentinfo")?l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0).length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},5131(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_single=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_contentinfo_single={id:"aria_contentinfo_single",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_single.html",Fail_1:"aria_contentinfo_single.html",group:"aria_contentinfo_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role found on the page',group:'A page, document, or application should only have one element with "contentinfo" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"contentinfo")?r.AriaUtil.getSiblingWithRoleHidden(n,"contentinfo",!0,!0)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0"):null}}},5167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_descendant_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_descendant_valid={id:"aria_descendant_valid",context:"dom:*",dependencies:["aria_role_valid"],help:{"en-US":{group:"aria_descendant_valid.html",pass:"aria_descendant_valid.html",potential_child_implicit_role:"aria_descendant_valid.html",recommendation_no_impact_role:"aria_descendant_valid.html",fail_child_explicit_role:"aria_descendant_valid.html"}},messages:{"en-US":{group:"Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements",pass:"The element contains valid descendants",potential_child_implicit_role:'The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers',recommendation_no_impact_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers',fail_child_explicit_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["pass","potential_child_implicit_role","fail_child_explicit_role"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["recommendation_no_impact_role"]}],act:["307n5z"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)&&r.AriaUtil.containsPresentationalChildrenOnly(n)){var s=r.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=r.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=r.AriaUtil.getDirectATChildren(n);if(!(u&&u.length>0))return(0,a.RulePass)("pass");for(var d=new Array,c=new Array,m=new Array,p=0;p<u.length;p++){var h=u[p].nodeName.toLowerCase();if("img"!==h&&"svg"!==h){var g=r.AriaUtil.getRoles(u[p],!1);g&&g.length>0?(g.includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),d.push(g.filter(function(e){return"code"!==e}).join(", "))):((g=r.AriaUtil.getImplicitRole(u[p])).includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),g&&g.length>0&&c.push(g.filter(function(e){return"code"!==e}).join(", ")))}}if(d.length>0){for(var b=[],_=0;_<d.length;_++)(f=new Array).push(s.join(", ")),f.push(d[_]),b.push((0,a.RuleFail)("fail_child_explicit_role",f));return b}if(c.length>0){for(b=[],_=0;_<c.length;_++)(f=new Array).push(s.join(", ")),f.push(c[_]),b.push((0,a.RulePotential)("potential_child_implicit_role",f));return b}if(m.length>0){for(b=[],_=0;_<m.length;_++){var f;(f=new Array).push(s.join(", ")),f.push(m[_]),b.push((0,a.RulePotential)("recommendation_no_impact_role",f))}return b}}}}},8115(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_document_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_document_label_unique={id:"aria_document_label_unique",context:"aria:document",refactor:{Rpt_Aria_MultipleDocumentRoles:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_document_label_unique.html",fail_label_not_unique:"aria_document_label_unique.html",group:"aria_document_label_unique.html"}},messages:{"en-US":{pass:'The element with "document" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "document" roles do not have unique labels',group:'Each element with "document" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"document",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_eventhandler_role_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.aria_eventhandler_role_valid={id:"aria_eventhandler_role_valid",context:"dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]",refactor:{Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_eventhandler_role_valid.html",Fail_1:"aria_eventhandler_role_valid.html",group:"aria_eventhandler_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <{0}> element with '{1}' does not have a valid ARIA role specified",group:"Elements with event handlers must have a valid ARIA role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.getAncestor(n,"svg"))return null;if(r.AriaUtil.hasAnyRole(n,!0))return(0,a.RulePass)("Pass_0");if(l.CommonUtil.isfocusableByDefault(n))return(0,a.RulePass)("Pass_0");var o=new Array;o.push(n.nodeName.toLowerCase());for(var s=new Array,u=["onblur","onfocus","onchange","onclick","ondblclick","onkeydown","onkeypress","onkeyup","onmousedown","onmouseup","onmousemove","onmouseout","onmouseover","onresize"],d=0;d<u.length;++d)n.hasAttribute(u[d])&&s.push(u[d]);var c=new Array;return c.push(s.join(", ")),(0,a.RuleFail)("Fail_1",[o.toString(),c.toString()])}}},5782(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_form_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_form_label_unique={id:"aria_form_label_unique",context:"aria:form",refactor:{Rpt_Aria_MultipleFormLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_form_label_unique.html",fail_label_not_unique:"aria_form_label_unique.html",group:"aria_form_label_unique.html"}},messages:{"en-US":{pass:'The element with "form" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "form" role do not have unique labels',group:'Each element with "form" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"form",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},6731(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_graphic_labelled=void 0;var a=i(461),n=i(7011),r=i(7139),l=i(3946);t.aria_graphic_labelled={id:"aria_graphic_labelled",context:"aria:graphics-document,aria:graphics-symbol",refactor:{HAAC_Aria_SvgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_graphic_labelled.html",Pass_0:"aria_graphic_labelled.html",Fail_1:"aria_graphic_labelled.html",Fail_2:"aria_graphic_labelled.html",Fail_3:"aria_graphic_labelled.html"}},messages:{"en-US":{group:"An element with a graphics role must have a non-empty label",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" graphics role has no label',Fail_2:'Element with "{0}" graphics role has no label or an empty label',Fail_3:"Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:[{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role")||!o.getAttribute("role").includes("graphics-"))return null;var s=n.AriaUtil.getAriaLabel(o).length>0;if(!s&&"svg"===o.nodeName.toLowerCase()){var u=o.querySelector("title");s=u&&r.CommonUtil.hasInnerContent(u)}return s||(s=r.CommonUtil.attributeNonEmpty(o,"title")),s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[o.getAttribute("role")])}}},390(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_hidden_nontabbable=void 0;var a=i(7139),n=i(461),r=i(461);t.aria_hidden_nontabbable={id:"aria_hidden_nontabbable",context:"dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*",refactor:{aria_hidden_focus_misuse:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_hidden_nontabbable.html",Pass_0:"aria_hidden_nontabbable.html",Fail_1:"aria_hidden_nontabbable.html"}},messages:{"en-US":{group:"A hidden element should not contain any tabbable elements",Pass_0:"Rule Passed",Fail_1:"Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.3.1","4.1.2"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:"6cfa84",run:function(e,t,i){var r=e.dom.node,l=r.nodeName.toLowerCase();return a.CommonUtil.isTabbable(r)?(0,n.RuleFail)("Fail_1",[l]):(0,n.RulePass)("Pass_0")}}},3900(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_id_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(9910),u=i(3946);t.aria_id_unique={id:"aria_id_unique",context:"dom:*",refactor:{Rpt_Aria_ValidIdRef:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_id_unique.html",Fail_1:"aria_id_unique.html",group:"aria_id_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid",group:"The ARIA property must reference a non-empty unique id of an existing element that is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["59796f","6a7281"],run:function(e,t,i){var n=e.dom.node,d=!0,c=new Array,m=(new Array,o.FragmentUtil.getOwnerFragment(n)),p=n.attributes,h=new Array,g=0;if(p)for(var b=0,_=p.length;b<_;b++){d=!0;var f=p[b].name;if(r.AriaUtil.isDefinedAriaAttribute(n,f)){var v=s.ARIADefinitions.propertyDataTypes[f];if(v&&v.type){var A="http://www.w3.org/2001/XMLSchema#idref"==v.type;if(A||"http://www.w3.org/2001/XMLSchema#idrefs"==v.type){g++;var w=l.CommonUtil.normalizeSpacing(p[b].nodeValue).length,y=p[b].nodeValue.split(" ");if(w<1)d=!1,h.push('"'+p[b].nodeValue+'"');else if(A&&w>=1&&y.length>1){d=!1;for(var C=0,k=y.length;C<k;++C)""!=y[C]&&h.push(y[C])}if(d&&w>=1)for(var R=0,x=y.length;R<x;++R)if(y[R].length>0){var P=m.getElementById(y[R]);if((d=null!=P)&&!v.hiddenIDRefSupported&&(d=u.VisUtil.isNodeVisible(P)),d)break;""!=y[R]&&h.push(y[R])}}}d||c.push(f)}}var T=0==c.length,U=new Array,I=new Array,E=new Array;return T||(I.push(c.join(", ")),E.push(n.nodeName.toLowerCase()),h.length>0&&U.push(h.join(", "))),0==g?null:T?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[U.toString(),I.toString(),E.toString()])}}},1218(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_img_labelled=void 0;var a=i(461),n=i(7011),r=i(7139),l=i(3946);t.aria_img_labelled={id:"aria_img_labelled",context:"aria:img, aria:image",refactor:{HAAC_Aria_ImgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_img_labelled.html",Pass_0:"aria_img_labelled.html",Fail_1:"aria_img_labelled.html",Fail_2:"aria_img_labelled.html",Fail_3:"aria_img_labelled.html"}},messages:{"en-US":{group:'An element with "img" role must have a non-empty label',Pass_0:"Rule Passed",Fail_1:'Element with "img" role has no label',Fail_2:'Element with "img" role has no label or an empty label',Fail_3:"Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:["23a2a8",{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role"))return null;var s=o.nodeName.toLocaleLowerCase();if("svg"!==s&&"img"!==s){var u=n.AriaUtil.getAriaLabel(o).length>0;if(!u&&"svg"===o.nodeName.toLowerCase()){var d=o.querySelector("title");u=d&&r.CommonUtil.hasInnerContent(d)}return u||(u=r.CommonUtil.attributeNonEmpty(o,"title")),u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2")}}}},6734(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_keyboard_handler_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3946);t.aria_keyboard_handler_exists={id:"aria_keyboard_handler_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingKeyboardHandler:{pass:"pass",potential_no_keyboard_access:"potential_no_keyboard_access"}},help:{"en-US":{pass:"aria_keyboard_handler_exists.html",potential_no_keyboard_access:"aria_keyboard_handler_exists.html",group:"aria_keyboard_handler_exists.html"}},messages:{"en-US":{pass:"Rule Passed",potential_no_keyboard_access:'Verify the <{0}> element with "{1}" role has keyboard access',group:"Interactive WAI_ARIA UI components must provide keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)){var u=!0,d=u,c=n.ownerDocument,m=o.ARIADefinitions.designPatterns,p=r.AriaUtil.getRoles(n,!1);if("datalist"===n.nodeName.toLowerCase()&&p&&p.includes("listbox"))return null;for(var h=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"],g=0,b=h;g<b.length;g++){var _=b[g];if(null!=r.AriaUtil.getAncestorWithRole(n,_,!0))return null}for(var f=l.CommonUtil.hasAttribute,v=new Array,A=0;A<p.length;++A){if(m[p[A]],h.indexOf(p[A])>=0&&!(f(n,"aria-disabled")&&n.getAttribute("aria-disabled")||(u=n.hasAttribute("onkeydown")||n.hasAttribute("onkeypress")||n.hasAttribute("onkeyup"))))if(f(n,"aria-activedescendant"))u=!0;else{var w,y=o.ARIADefinitions.designPatterns[p[A]].reqChildren;if(y)for(var C=0,k=y.length;C<k;C++)for(var R="*[contains(@role,'"+y[C]+"')]",x=c.evaluate(R,n,l.CommonUtil.defaultNSResolver,0,null),P=x.iterateNext();P;){if(!(u=P.hasAttribute("onkeydown")||P.hasAttribute("onkeypress")))for(var T="descendant::*",U=(w=c.evaluate(T,P,l.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)l.CommonUtil.shouldNodeBeSkippedHidden(U)||(u=l.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext();if(!u)break;P=x.iterateNext()}else for(T="descendant::*",U=(w=c.evaluate(T,n,l.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)if(l.CommonUtil.shouldNodeBeSkippedHidden(U))U=w.iterateNext();else{var I;(u=l.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext()}}u||v.push(p[A]),!u&&d&&(d=u)}var E=new Array;E.push(n.nodeName.toLowerCase());var N=new Array;N.push(v.join(", "));var L=n.getAttribute("id");return L&&L.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(L,"'][role='combobox']"))?null:d?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_no_keyboard_access",[E.toString(),N.toString()])}}}},9973(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_landmark_name_unique=void 0;var a=i(461),n=i(461),r=i(9955),l=i(1686),o=i(5279),s=i(4566),u=i(1950),d=i(3946),c=i(7139),m=i(7011);t.aria_landmark_name_unique={id:"aria_landmark_name_unique",context:"aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form",refactor:{landmark_name_unique:{Pass_0:"pass",Fail_0:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_landmark_name_unique.html",fail_label_not_unique:"aria_landmark_name_unique.html",group:"aria_landmark_name_unique.html"}},messages:{"en-US":{pass:"Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",fail_label_not_unique:'Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label',group:"Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(d.VisUtil.isNodeHiddenFromAT(n))return null;if(null!==c.CommonUtil.getAncestor(n,["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(n,"dialog",!0))return null;var p=o.FragmentUtil.getOwnerFragment(n),h=s.CacheUtil.getCache(n.ownerDocument,"aria_landmark_name_unique",null);if(!h){h={navigationNodes:[],navigationNodesComputedLabels:[],navigationNodesParents:[],navigationNodesMatchFound:[]};for(var g=p.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'),b=Array.from(g),_=[],f=[],v=[],A=0;A<b.length;A++)d.VisUtil.isNodeHiddenFromAT(b[A])||null!==c.CommonUtil.getAncestor(b[A],["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(b[A],"dialog",!0)||v.push(b[A]);for(b=v,A=0;A<b.length;A++){for(var w=[],y=b[A].parentElement;y;)w.push(y),y=y.parentElement;for(var C=0;C<w.length;C++){var k=["ASIDE","FOOTER","FORM","HEADER","MAIN","NAV","SECTION"].includes(w[C].tagName),R=!1;if(w[C].hasAttribute("role")&&(R=["complementary","contentinfo","form","banner","main","navigation","region","search"].includes(w[C].getAttribute("role"))),k||R){_.push(w[C]);break}if(C===w.length-1){_.push(null);break}}}var x=[];for(A=0;A<b.length;A++){var P=u.AccNameUtil.computeAccessibleName(b[A]);x.push(P&&P.name&&P.name.trim().length>0?P.name.trim():"")}for(A=0;A<_.length;A++){var T=!1,U=!1;for(C=0;C<_.length;C++)if(C!==A){if(null===_[A]&&null===_[C]){if(r.ARIAMapper.nodeToRole(b[A])===r.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}else if(null===_[A]||null===_[C])continue;if(l.DOMUtil.sameNode(_[A],_[C])&&r.ARIAMapper.nodeToRole(b[A])===r.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}T||(U?f.push("pass"):f.push("null"))}h.navigationNodesComputedLabels=x,h.navigationNodes=b,h.navigationNodesParents=_,h.navigationNodesMatchFound=f,s.CacheUtil.setCache(n.ownerDocument,"aria_landmark_name_unique",h)}var I=-1;for(A=0;A<h.navigationNodes.length;A++)n.isSameNode(h.navigationNodes[A])&&(I=A);return-1===I?null:"pass"===h.navigationNodesMatchFound[I]?(0,a.RulePass)("pass",[r.ARIAMapper.nodeToRole(h.navigationNodes[I])]):"fail_label_not_unique"===h.navigationNodesMatchFound[I]?(0,a.RuleFail)("fail_label_not_unique",[r.ARIAMapper.nodeToRole(h.navigationNodes[I]),h.navigationNodesComputedLabels[I]]):null}}},5711(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_main_label_unique={id:"aria_main_label_unique",context:"aria:main",refactor:{Rpt_Aria_MultipleMainsRequireLabel_Implicit_2:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_unique.html",Fail_1:"aria_main_label_unique.html",group:"aria_main_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique labels',group:'Each element with "main" role must have unique label that describes its purposes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;for(var s=r.AriaUtil.getAriaLabel(n),u=r.AriaUtil.getAncestorWithRole(n,"document",!0),d=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0),c=null,m=0;m<d.length;++m)if(d[m]!==n&&(c=(0,a.RulePass)("Pass_0"),r.AriaUtil.getAncestorWithRole(d[m],"document",!0)===u&&r.AriaUtil.getAriaLabel(d[m])===s)){c=(0,a.RuleFail)("Fail_1");break}return c}}},3384(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_main_label_visible={id:"aria_main_label_visible",context:"dom:body",refactor:{Rpt_Aria_MultipleMainsVisibleLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_visible.html",Fail_1:"aria_main_label_visible.html",group:"aria_main_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique visible labels',group:'Each element with "main" role should have a unique visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;var s=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0);return 0===s.length||1===s.length?null:r.AriaUtil.hasUniqueAriaLabelledby(s)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2762(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_navigation_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_navigation_label_unique={id:"aria_navigation_label_unique",context:"aria:navigation",refactor:{Rpt_Aria_MultipleNavigationLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_navigation_label_unique.html",fail_label_not_unique:"aria_navigation_label_unique.html",group:"aria_navigation_label_unique.html"}},messages:{"en-US":{pass:'The element with "navigation" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "navigation" role do not have unique labels',group:'Each element with "navigation" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"navigation",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5757(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_parent_required=void 0;var a=i(461),n=i(461),r=i(9910),l=i(7011),o=i(7139),s=i(3946);t.aria_parent_required={id:"aria_parent_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredParent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_parent_required.html",Pass_0:"aria_parent_required.html",Fail_1:"aria_parent_required.html"}},messages:{"en-US":{group:"Each element with an implicit or explicit role must be contained within a valid element",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"ff89c9",run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||o.CommonUtil.isNodeDisabled(n)||l.AriaUtil.shouldBePresentationalChild(n)||s.VisUtil.isNodePresentational(n))){for(var u=!0,d=r.ARIADefinitions.designPatterns,c=new Array,m=new Array,p=0,h=i.aria.map(function(e){return e.role}),g=h[h.length-2],b=2;"none"===g;)b++,g=h[h.length-b];var _=l.AriaUtil.getResolvedRole(n);if(d[_]&&null!=d[_].container){p++,u=!1;for(var f=0,v=(m=d[_].container).length;!u&&f<v&&!(u=g===m[f]);f++);0==u&&c.push(_)}var A=new Array;A.push(c.join(", "));var w=new Array;return w.push(m.join(", ")),0==p?null:u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[A.toString(),w.toString()])}}}},5232(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_region_label_unique={id:"aria_region_label_unique",context:"aria:region",refactor:{Rpt_Aria_MultipleRegionsUniqueLabel_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_region_label_unique.html",fail_label_not_unique:"aria_region_label_unique.html",group:"aria_region_label_unique.html"}},messages:{"en-US":{pass:'The element with "region" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "region" role do not have unique labels',group:'Each element with "region" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"region");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_labelled=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_region_labelled={id:"aria_region_labelled",context:"aria:region",refactor:{Rpt_Aria_RegionLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_labelled.html",Fail_1:"aria_region_labelled.html",group:"aria_region_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "region" role does not have a label',group:'Each element with "region" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasAriaLabel(n)||l.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_allowed=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_role_allowed={id:"aria_role_allowed",context:"dom:*[role]",refactor:{Rpt_Aria_ValidRole:{Pass_0:"Pass_0",Fail_2:"Fail_2",Potential_1:"Potential_1"}},help:{"en-US":{group:"aria_role_allowed.html",Pass_0:"aria_role_allowed.html",Fail_2:"aria_role_allowed.html",Potential_1:"aria_role_allowed.html"}},messages:{"en-US":{group:"Elements must have a valid 'role' per ARIA specification",Pass_0:"Rule Passed",Fail_2:"The role '{0}' defined on the element is not valid per ARIA specification",Potential_1:"Some of the roles, '{0}', defined on the element are not valid per ARIA specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"674b10",run:function(e,t,i){var n=e.dom.node,l=n.getAttribute("role").trim().toLowerCase();if(0===l.length)return null;if(n.hasAttribute("aria-hidden")&&"true"===n.getAttribute("aria-hidden").toLowerCase())return null;var o=r.AriaUtil.getRolesUndefinedByAria(n);if(!o||0===o.length)return(0,a.RulePass)("Pass_0");var s=l.split(/\s+/);return o.length===s.length?(0,a.RuleFail)("Fail_2",[o.join(",")]):o.length>0?(0,a.RulePotential)("Potential_1",[o.join(",")]):void 0}}},4863(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_redundant=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_role_redundant={id:"aria_role_redundant",context:"dom:*[role]",help:{"en-US":{pass:"aria_role_redundant.html",fail_redundant:"aria_role_redundant.html",group:"aria_role_redundant.html"}},messages:{"en-US":{pass:"An explicitly-assigned ARIA role is not redundant with the implicit role of the element",fail_redundant:'The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element <{1}>',group:"An explicitly-assigned ARIA role should not be redundant with the implicit role of the element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.tagName.toLowerCase(),o=r.AriaUtil.getRoles(n,!1);if(o&&0!==o.length){if(!r.AriaUtil.areRolesDefined(o))return null;var s=r.AriaUtil.getImplicitRole(n);if(!s||0===s.length)return(0,a.RulePass)("pass");for(var u=[],d=0;d<o.length;d++)s.includes(o[d])?u.push((0,a.RuleFail)("fail_redundant",[o[d],l])):u.push((0,a.RulePass)("pass"));return u.length>0?u:null}}}},1440(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_search_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_search_label_unique={id:"aria_search_label_unique",context:"aria:search",refactor:{Rpt_Aria_MultipleSearchLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_search_label_unique.html",fail_label_not_unique:"aria_search_label_unique.html",group:"aria_search_label_unique.html"}},messages:{"en-US":{pass:'The element with "search" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "search" role do not have unique labels',group:'Each element with "search" role must have a unique label that describes its purpose'}},rulesets:[{id:[],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"search",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1968(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_valid=t.aria_role_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.aria_role_valid={id:"aria_role_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{aria_semantics_role:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"aria_role_valid.html",Fail_1:"aria_role_valid.html",Fail_2:"aria_role_valid.html",group:"aria_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The ARIA role '{0}' is not valid for the element <{1}>",Fail_2:"The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable",group:"ARIA roles must be valid for the element to which they are assigned"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.tagName.toLowerCase();if(1!==n.nodeType)return null;var s=r.AriaUtil.getRolesUndefinedByAria(n);if(s&&s.length>0)return null;var u=r.AriaUtil.getDeprecatedAriaRoles(n);if(u&&u.length>0)return null;var d=r.AriaUtil.getDeprecatedAriaAttributes(n);if(d&&d.length>0)return null;if(["td","th","tr"].includes(o)){var c=l.CommonUtil.isTableDescendant(i);if(null!==c&&c.length>0)return null}var m=r.AriaUtil.getUserDefinedRoles(n);if(!m||0===m.length)return null;if(m.includes("generic"))return(0,a.RuleFail)("Fail_1",["generic",o]);var p=r.AriaUtil.getInvalidRoles(n);return null===p||0===p.length?(0,a.RulePass)("Pass_0",[m.join(", "),o]):p.includes("presentation")||p.includes("none")&&l.CommonUtil.isTabbable(n)?(0,a.RuleFail)("Fail_2",[p.join(", "),o]):p.length>0?(0,a.RuleFail)("Fail_1",[p.join(", "),o]):m.length>0?(0,a.RulePass)("Pass_0",[m.join(", "),o]):null}},t.aria_attribute_valid={id:"aria_attribute_valid",context:"dom:*",dependencies:["aria_attribute_deprecated","aria_role_valid"],refactor:{aria_attribute_allowed:{Pass:"Pass",Fail_invalid_role_attr:"Fail_invalid_role_attr",Fail_invalid_implicit_role_attr:"Fail_invalid_implicit_role_attr"}},help:{"en-US":{group:"aria_attribute_valid.html",Pass:"aria_attribute_valid.html",Fail_invalid_role_attr:"aria_attribute_valid.html",Fail_invalid_implicit_role_attr:"aria_attribute_valid.html"}},messages:{"en-US":{group:"ARIA attributes should be valid for the element and ARIA role to which they are assigned",Pass:"ARIA attributes are valid for the element and ARIA role",Fail_invalid_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with ARIA role "{2}"',Fail_invalid_implicit_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with implicit ARIA role "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["5c01ea",{"46ca7f":{Pass:"pass",Fail_invalid_role_attr:"fail",Fail_invalid_implicit_role_attr:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(1!==n.nodeType)return null;var l=r.AriaUtil.getUserDefinedAriaAttributes(n);if(null===l||0===l.length)return null;var o=r.AriaUtil.getUserDefinedRoles(n),s=!0;if(o&&o.length>0){if(!r.AriaUtil.areRolesDefined(o))return null}else o=r.AriaUtil.getImplicitRole(n),s=!1;var u=n.tagName.toLowerCase(),d=r.AriaUtil.getInvalidAriaAttributes(n);return d&&0!==d.length?o.length>0?s?(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_implicit_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,"none"]):(0,a.RulePass)("Pass",[l.join(", "),u,o.join(", ")])}}},1617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_toolbar_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(4566);t.aria_toolbar_label_unique={id:"aria_toolbar_label_unique",context:"aria:toolbar",refactor:{Rpt_Aria_MultipleToolbarUniqueLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_toolbar_label_unique.html",Fail_1:"aria_toolbar_label_unique.html",group:"aria_toolbar_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "toolbar" roles do not have unique labels',group:'Each element with "toolbar" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"toolbar",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(n.ownerDocument,"aria_toolbar_label_unique",null);u||(u=r.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(n.ownerDocument,"aria_toolbar_label_unique",u));var d=r.AriaUtil.getAriaLabel(n);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_widget_labelled=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9955),s=i(5279),u=i(9910),d=i(1686);t.aria_widget_labelled={id:"aria_widget_labelled",context:"dom:*",refactor:{Rpt_Aria_WidgetLabels_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_widget_labelled.html",Pass_0:"aria_widget_labelled.html",Fail_1:"aria_widget_labelled.html"}},messages:{"en-US":{group:"Interactive component must have a programmatically associated name",Pass_0:"Rule Passed",Fail_1:"Interactive component with ARIA role '{0}' does not have a programmatically associated name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"m6b1q3",run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")&&"hidden"===n.getAttribute("type")||r.AriaUtil.getAncestorWithRole(n,"combobox")&&!r.AriaUtil.hasRoleInSemantics(n,"textbox")&&!r.AriaUtil.hasRoleInSemantics(n,"searchbox"))return null;var c=o.ARIAMapper.nodeToRole(n),m=n.nodeName.toLowerCase();if(["button","checkbox","combobox","listbox","menuitemcheckbox","menuitemradio","radio","searchbox","slider","spinbutton","switch","textbox","progressbar","link"].includes(c))return null;if("output"===m||"input"===m&&n.getAttribute("type"),!n.hasAttribute("role")&&-1!=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"].indexOf(n.nodeName.toLowerCase()))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(r.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=l.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=l.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(s.FragmentUtil.getById(n,v[A])===n)return null}for(var w=!0,y=u.ARIADefinitions.designPatterns,C=r.AriaUtil.getRoles(n,!0),k=0,R=["widget","liveRegion","window"],x=(A=0,C.length);w&&A<x;++A){var P=y[C[A]];P&&P.nameRequired&&P.roleType&&R.includes(P.roleType)&&(++k,!(w=r.AriaUtil.hasAriaLabel(n)||l.CommonUtil.attributeNonEmpty(n,"title")||l.CommonUtil.getLabelForElementHidden(n,!0))&&P.nameFrom&&P.nameFrom.indexOf("contents")>=0&&(w=l.CommonUtil.hasInnerContentOrAlt(n)),w||(w=l.CommonUtil.hasImplicitLabel(n)),w||"img"!==n.tagName.toLowerCase()||n.hasAttribute("role")||!n.hasAttribute("alt")||(w=d.DOMUtil.cleanWhitespace(n.getAttribute("alt")).trim().length>0),P.nameFrom.indexOf("prohibited"))}return 0===k?null:w?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[c])}}},3370(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.asciiart_alt_exists=void 0;var a=i(461),n=i(7139);t.asciiart_alt_exists={id:"asciiart_alt_exists",context:"dom:pre, dom:listing, dom:xmp, dom:plaintext",refactor:{RPT_Pre_ASCIIArt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"asciiart_alt_exists.html",Potential_1:"asciiart_alt_exists.html",group:"asciiart_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that ASCII art has a text alternative",group:"ASCII art must have a text alternative"}},rulesets:[],act:[],run:function(e,t,i){var r=e.dom.node;if("pre"==r.nodeName.toLowerCase()&&(r.previousSibling&&"code"==r.previousSibling.nodeName.toLowerCase()||r.getElementsByTagName("code").length>0||n.CommonUtil.getAncestor(r,"code")))return(0,a.RulePass)("Pass_0");for(var l=!0,o=n.CommonUtil.getInnerText(r),s=0,u=0,d="",c=0;l&&c<o.length;++c){var m=o.substr(c,1);/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(m)?d==m?u+=1:u=0:(/\s/.test(m)||(s+=1),u=0),d=m,(s>=5||u>=4)&&(l=!1)}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},9272(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_css_review=void 0;var a=i(461),n=i(461),r=i(7139);t.blink_css_review={id:"blink_css_review",context:"dom:style, dom:*[style]",refactor:{RPT_Blink_CSSTrigger1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"blink_css_review.html",Pass_0:"blink_css_review.html",Potential_1:"blink_css_review.html"}},messages:{"en-US":{group:"Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds",Pass_0:"Rule Passed",Potential_1:"Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getInnerText(n);n.hasAttribute("style")&&(l=n.getAttribute("style"));var o=-1==l.toLowerCase().indexOf("text-decoration:blink");return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},7735(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_elem_deprecated=void 0;var a=i(461),n=i(461);t.blink_elem_deprecated={id:"blink_elem_deprecated",context:"dom:blink",refactor:{WCAG20_Blink_AlwaysTrigger:{Fail_1:"Fail_1"}},help:{"en-US":{group:"blink_elem_deprecated.html",Fail_1:"blink_elem_deprecated.html"}},messages:{"en-US":{group:"Content that blinks persistently must not be used",Fail_1:"Content found that blinks persistently"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){return(0,a.RuleFail)("Fail_1")}}},3923(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blockquote_cite_exists=void 0;var a=i(461),n=i(461),r=i(7139);t.blockquote_cite_exists={id:"blockquote_cite_exists",context:"dom:blockquote",refactor:{RPT_Blockquote_HasCite:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"blockquote_cite_exists.html",Potential_1:"blockquote_cite_exists.html",group:"blockquote_cite_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only",group:"Use <blockquote> only for quotations, not indentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.attributeNonEmpty(n,"cite");if(!l){var o=r.CommonUtil.getDocElementsByTag(n,"cite");l=null!=o&&o.length>0}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},7521(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.canvas_content_described=void 0;var a=i(461),n=i(461),r=i(3946);t.canvas_content_described={id:"canvas_content_described",context:"dom:canvas",refactor:{HAAC_Canvas:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"canvas_content_described.html",Manual_1:"canvas_content_described.html",group:"canvas_content_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify accessibility of the <canvas> element",group:"The <canvas> element may not be accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.1.1","4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.innerHTML.trim().length>0;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RuleManual)("Manual_1")}}},1852(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.caption_track_exists=void 0;var a=i(461),n=i(461);t.caption_track_exists={id:"caption_track_exists",context:"dom:video",refactor:{HAAC_Video_HasNoTrack:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"caption_track_exists.html",Potential_1:"caption_track_exists.html",group:"caption_track_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that captions are available for any meaningful audio or provide a caption track for the <video> element",group:"A <video> element must have a text alternative for any meaningful audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!1;if("true"===n.getAttribute("aria-hidden"))return null;for(var l=n.getElementsByTagName("track"),o=0;o<l.length;++o)r=r||"captions"===l[o].getAttribute("kind");if(n.textTracks&&n.textTracks.length>0)for(o=0;o<n.textTracks.length;o++)r=r||"captions"===n.textTracks[o].kind;return r?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},799(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_active_descendant=void 0;var a=i(461),n=i(461),r=i(7011),l=i(5279),o=i(3864),s=i(4566),u=i(3946);t.combobox_active_descendant={id:"combobox_active_descendant",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_active_descendant.html",Fail_missing:"combobox_active_descendant.html",Fail_not_in_popup:"combobox_active_descendant.html",Fail_active_role_invalid:"combobox_active_descendant.html",Fail_active_not_selected:"combobox_active_descendant.html",group:"combobox_active_descendant.html"}},messages:{"en-US":{Pass:"'aria-activedescendant' is used appropriately for this combobox",Fail_missing:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist",Fail_not_in_popup:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"",Fail_active_role_invalid:"The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'",Fail_active_not_selected:"The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true",group:"'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.popupId;if(!m)return null;var h=n.getAttribute("aria-activedescendant");if(!h||0===h.trim().length)return null;var g=l.FragmentUtil.getById(n,h);if(!g)return(0,a.RuleFail)("Fail_missing",[h]);var b=!1;if(m)for(var _=new o.DOMWalker(m);!b&&_.nextNode()&&_.node!=m&&_.node!=m.nextSibling;)1===_.node.nodeType&&u.VisUtil.isNodeVisible(_.node)&&(b=_.elem().getAttribute("id")===h);var f=[];b||f.push((0,a.RulePass)("Fail_not_in_popup",[h,p]));var v=r.AriaUtil.getRoles(g,!0);return 0===["option","gridcell","row","treeitem"].filter(function(e){return v.includes(e)}).length&&f.push((0,a.RuleFail)("Fail_active_role_invalid",[h,v.join(",")])),"true"!==g.getAttribute("aria-selected")&&f.push((0,a.RuleFail)("Fail_active_not_selected",[h])),0===f.length?(0,a.RulePass)("Pass"):f}}},4614(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_autocomplete_valid=void 0;var a=i(461),n=i(461),r=i(3864),l=i(4566),o=i(3946);t.combobox_autocomplete_valid={id:"combobox_autocomplete_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_autocomplete:{Pass:"Pass",Fail_1:"Fail_1",Fail_inline:"Fail_inline"}},help:{"en-US":{Pass:"combobox_autocomplete_valid.html",Fail_1:"combobox_autocomplete_valid.html",Fail_inline:"combobox_autocomplete_valid.html",group:"combobox_autocomplete_valid.html"}},messages:{"en-US":{Pass:"The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup",Fail_1:"The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"",Fail_inline:"The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ",group:"A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d=u.popupId,c=u.popupElement,m=[];"inline"===n.getAttribute("aria-autocomplete")&&m.push((0,a.RuleFail)("Fail_inline"));var p=!0;if(c&&o.VisUtil.isNodeVisible(c)&&(p=!c.hasAttribute("aria-autocomplete"))&&c.children&&c.children.length>0)for(var h=new r.DOMWalker(c);p&&h.nextNode()&&(1!==h.node.nodeType||!o.VisUtil.isNodeVisible(h.node)||(p=!h.elem().hasAttribute("aria-autocomplete"),!h.bEndTag||h.node!==c.lastElementChild)););return p||m.push((0,a.RuleFail)("Fail_1",[d])),m.length>0?m:(0,a.RulePass)("Pass")}}},5952(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_design_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=i(4566);t.combobox_design_valid={id:"combobox_design_valid",context:"aria:combobox",refactor:{combobox_version:{"Pass_1.0":"Pass_1.0","Fail_1.1":"Fail_1.1","Pass_1.2":"Pass_1.2"}},help:{"en-US":{"Pass_1.0":"combobox_design_valid.html","Fail_1.1":"combobox_design_valid.html","Pass_1.2":"combobox_design_valid.html",group:"combobox_design_valid.html"}},messages:{"en-US":{"Pass_1.0":"The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Fail_1.1":"The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Pass_1.2":"The combobox design pattern is detected as ARIA 1.2",group:"The combobox design pattern must be valid for ARIA 1.2"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;var u,d="select"===(u=n).tagName.toLowerCase()&&"combobox"!==u.getAttribute("role")?"implicit":"input"!==u.nodeName.toLowerCase()||u.hasAttribute("type")&&"text"!==u.getAttribute("type")||!u.hasAttribute("aria-owns")||u.hasAttribute("aria-controls")?"input"!==u.nodeName.toLowerCase()&&u.hasAttribute("aria-owns")&&!u.hasAttribute("aria-controls")?"1.1":"1.2":"1.0";if("implicit"===d)return null;var c=n.tagName.toLowerCase(),m="true"===(r.AriaUtil.getAriaAttribute(n,"aria-expanded")||"").trim().toLowerCase(),p="input"===c&&(!n.hasAttribute("type")||"text"===n.getAttribute("type").toLowerCase()),h=e.dom.rolePath;if(!h)return null;var g=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});return g?(g[h]={inputElement:p?n:null,pattern:d,expanded:m},s.CacheUtil.setCache(n.ownerDocument,"combobox",g),"1.0"===d?(0,a.RulePass)("Pass_1.0"):"1.1"===d?(0,a.RuleFail)("Fail_1.1"):"1.2"===d?(0,a.RulePass)("Pass_1.2"):void 0):null}}},5395(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_focusable_elements=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7011),o=i(7139),s=i(4566),u=i(3946);t.combobox_focusable_elements={id:"combobox_focusable_elements",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_focusable_elements.html",Fail_not_tabbable:"combobox_focusable_elements.html",Fail_tabbable_child:"combobox_focusable_elements.html",group:"combobox_focusable_elements.html"}},messages:{"en-US":{Pass:"DOM focus is allowed only on the combobox element as required",Fail_not_tabbable:"The combobox element does not allow DOM focus as required",Fail_tabbable_child:"The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed",group:"Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.expanded;if(!m)return null;var h=l.AriaUtil.getRoles(m,!0)[0],g=[];if(o.CommonUtil.isTabbable(n)||g.push((0,a.RuleFail)("Fail_not_tabbable")),!1===p||"dialog"===h)return(0,a.RulePass)("Pass");var b=!0;if(m&&u.VisUtil.isNodeVisible(m)&&(b=!o.CommonUtil.isTabbable(m)&&!l.AriaUtil.getAriaAttribute(m,"aria-activedescendant"))&&m.children&&m.children.length>0)for(var _=new r.DOMWalker(m);b&&_.nextNode()&&(1!==_.node.nodeType||!u.VisUtil.isNodeVisible(_.node)||(b=!o.CommonUtil.isTabbable(_.node)&&!l.AriaUtil.getAriaAttribute(_.node,"aria-activedescendant"),!_.bEndTag||_.node!==m.lastElementChild)););return b||g.push((0,a.RuleFail)("Fail_tabbable_child")),0===g.length?(0,a.RulePass)("Pass"):g}}},1992(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_haspopup_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(4566);t.combobox_haspopup_valid={id:"combobox_haspopup_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_haspopup:{Pass:"Pass",Fail_popup_role_invalid:"Fail_popup_role_invalid",Fail_combobox_popup_role_mismatch:"Fail_combobox_popup_role_mismatch"}},help:{"en-US":{Pass:"combobox_haspopup_valid.html",Fail_popup_role_invalid:"combobox_haspopup_valid.html",Fail_combobox_popup_role_mismatch:"combobox_haspopup_valid.html",group:"combobox_haspopup_valid.html"}},messages:{"en-US":{Pass:"The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value",Fail_popup_role_invalid:'The \'role\' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"',Fail_combobox_popup_role_mismatch:"The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"",group:"The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!o)return null;var s=o[e.dom.rolePath];if(!s)return null;var u=s.popupElement,d=s.popupId;if(!u)return null;var c=r.AriaUtil.getRoles(u,!0),m=["listbox","grid","tree","dialog"].filter(function(e){return c.includes(e)});if(0===m.length)return(0,a.RuleFail)("Fail_popup_role_invalid",[c.join(","),d]);var p=m[0],h=n.getAttribute("aria-haspopup")||"listbox";return h===p||"listbox"===p&&!n.hasAttribute("aria-haspopup")?(0,a.RulePass)("Pass"):(0,a.RuleFail)("Fail_combobox_popup_role_mismatch",[h,p])}}},7955(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_popup_reference=void 0;var a=i(461),n=i(461),r=i(5279),l=i(4566),o=i(3946);t.combobox_popup_reference={id:"combobox_popup_reference",context:"aria:combobox",dependencies:["combobox_design_valid"],help:{"en-US":{group:"combobox_popup_reference.html","Pass_1.0_expanded":"combobox_popup_reference.html","Pass_1.0_collapsed":"combobox_popup_reference.html","Pass_1.2_expanded":"combobox_popup_reference.html","Pass_1.2_collapsed":"combobox_popup_reference.html","Fail_1.0_missing_owns":"combobox_popup_reference.html","Fail_1.2_missing_controls":"combobox_popup_reference.html","Fail_1.0_popup_reference_missing":"combobox_popup_reference.html","Fail_1.2_popup_reference_missing":"combobox_popup_reference.html",Fail_combobox_expanded_hidden:"combobox_popup_reference.html",Fail_combobox_collapsed_visible:"combobox_popup_reference.html"}},messages:{"en-US":{group:"The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","Pass_1.0_expanded":"The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass_1.0_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Pass_1.2_expanded":"The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass_1.2_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Fail_1.0_missing_owns":"The 'aria-owns' attribute of the expanded combobox is missing","Fail_1.2_missing_controls":"The 'aria-controls' attribute of the expanded combobox is missing","Fail_1.0_popup_reference_missing":"The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value","Fail_1.2_popup_reference_missing":"The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",Fail_combobox_expanded_hidden:"The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible",Fail_combobox_collapsed_visible:"The combobox 'aria-expanded' attribute is false, but the combobox popup is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"4e8ab6":{"Pass_1.0_expanded":"fail","Pass_1.0_collapsed":"fail","Pass_1.2_expanded":"pass","Pass_1.2_collapsed":"pass","Fail_1.0_missing_owns":"inapplicable","Fail_1.2_missing_controls":"fail","Fail_1.0_popup_reference_missing":"inapplicable","Fail_1.2_popup_reference_missing":"fail",Fail_combobox_expanded_hidden:"inapplicable",Fail_combobox_collapsed_visible:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node,s=l.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d,c,m=u.pattern,p=u.expanded;if("1.0"===m){if(!n.hasAttribute("aria-owns"))return p?(0,a.RuleFail)("Fail_1.0_missing_owns"):null;if(d=n.getAttribute("aria-owns"),!(c=r.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.0_popup_reference_missing",[d]):null}else{if("1.2"!==m)return null;if(!n.hasAttribute("aria-controls"))return p?(0,a.RuleFail)("Fail_1.2_missing_controls"):null;if(d=n.getAttribute("aria-controls"),!(c=r.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.2_popup_reference_missing",[d]):null}return u.popupId=d,u.popupElement=c,p&&!o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_expanded_hidden"):!p&&o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_collapsed_visible"):"1.0"===m?p?(0,a.RulePass)("Pass_1.0_expanded"):(0,a.RulePass)("Pass_1.0_collapsed"):p?(0,a.RulePass)("Pass_1.2_expanded"):(0,a.RulePass)("Pass_1.2_collapsed")}}},9531(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.debug_paths=void 0;var a=i(461);t.debug_paths={id:"debug_paths",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["DEBUG"],num:"1",level:a.eRulePolicy.INFORMATION,toolkitLevel:a.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var a=e.dom.node;return a.setAttribute("domPath",e.dom.rolePath),a.setAttribute("ariaPath",e.aria.rolePath),null}}},891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.detector_tabbable=void 0;var a=i(7139),n=i(461),r=i(461);t.detector_tabbable={id:"detector_tabbable",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["EXTENSIONS"],num:"1",level:r.eRulePolicy.INFORMATION,toolkitLevel:r.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var r=e.dom.node;if(!a.CommonUtil.isTabbable(r))return null;var l=i.aria[i.aria.length-1];return(0,n.RulePass)("Pass_0",[],[{name:l.attributes.name,role:l.role,tabindex:parseInt(r.getAttribute("tabindex")||"0")}])}}},7446(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.dir_attribute_valid=void 0;var a=i(461),n=i(461);t.dir_attribute_valid={id:"dir_attribute_valid",context:"dom:*[dir]",refactor:{Valerie_Elem_DirValid:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"dir_attribute_valid.html",Fail_1:"dir_attribute_valid.html",group:"dir_attribute_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Invalid value used for the 'dir' attribute",group:'\'dir\' attribute value must be "ltr", "rtl", or "auto"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node.getAttribute("dir").toLowerCase();return"ltr"==n||"rtl"==n||"auto"==n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6137(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.download_keyboard_controllable=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.download_keyboard_controllable={id:"download_keyboard_controllable",context:"dom:a[href],dom:area[href]",refactor:{HAAC_Media_DocumentTrigger2:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"download_keyboard_controllable.html",group:"download_keyboard_controllable.html"}},messages:{"en-US":{Manual_1:"Verify that the file download mechanism does not cause a keyboard trap",group:"File download mechanisms should be keyboard-operable and preserve page focus location"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("href"),s=r.CommonUtil.getFileExt(o),u=![".docx",".doc",".pdf",".odt"].includes(s);return u?null:u?void 0:(0,a.RuleManual)("Manual_1")}}},6839(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.draggable_alternative_exists=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3946);t.draggable_alternative_exists={id:"draggable_alternative_exists",context:"dom:*[draggable]",dependencies:[],help:{"en-US":{group:"draggable_alternative_exists.html",pass_undraggable:"draggable_alternative_exists.html",potential_alternative:"draggable_alternative_exists.html"}},messages:{"en-US":{group:'A draggable element must have a "single pointer" alternative',pass_undraggable:'The element "{0}" is not draggable',potential_alternative:'Ensure the draggable element "{0}" has a "single pointer" alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.7"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!l.VisUtil.isNodeVisible(r))return null;var o=r.nodeName.toLocaleLowerCase();return null!==a.CommonUtil.getAncestor(r,["pre","code","script","meta"])||"body"===o||"html"===o?null:"true"===r.getAttribute("draggable")?(0,n.RulePotential)("potential_alternative",[o]):"false"===r.getAttribute("draggable")?(0,n.RulePass)("pass_undraggable",[o]):null}}},8135(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_labelled=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=i(9910),u=i(1950);t.element_accesskey_labelled={id:"element_accesskey_labelled",context:"dom:*[accesskey]",refactor:{HAAC_Accesskey_NeedLabel:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"element_accesskey_labelled.html",Potential_1:"element_accesskey_labelled.html",group:"element_accesskey_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"The element with an assigned 'accesskey' attribute does not have an associated label",group:"An element with an assigned 'accesskey' attribute must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeVisible(n)&&!l.CommonUtil.isNodeDisabled(n)&&!l.CommonUtil.isTabbable(n)){var d=r.AriaUtil.getRoles(n,!0);if(d&&0!==d.length){var c=s.ARIADefinitions.designPatterns[d[0]];if(c&&c.nameFrom&&!c.nameRequired&&c.nameFrom&&!c.nameFrom.includes("prohibited")&&(!n.parentElement||"fieldset"!==n.parentElement.nodeName.toLowerCase())){var m=u.AccNameUtil.computeAccessibleName(n);return m&&m.name&&m.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}}}}},507(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_unique=void 0;var a=i(461),n=i(461),r=i(4566);t.element_accesskey_unique={id:"element_accesskey_unique",context:"dom:*[accesskey]",refactor:{WCAG20_Elem_UniqueAccessKey:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"element_accesskey_unique.html",Fail_1:"element_accesskey_unique.html",group:"element_accesskey_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"'accesskey' attribute value on the element is not unique",group:"'accesskey' attribute values on each element must be unique for the page"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CacheUtil.getCache(n.ownerDocument,"element_accesskey_unique",{}),o=n.getAttribute("accesskey"),s=!(o in l);return l[o]=!0,s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_attribute_deprecated=void 0;var a=i(461),n=i(461),r=["applet","basefont","center","dir","font","isindex","listing","plaintext","spacer","s","strike","u","xmp","acronym","frame","frameset","noframes","noembed","big","blink","marquee","tt"],l=["align","link","archive","background","bgcolor","clear","code","color","compact","face","hspace","language","link","noshade","nowrap","object","prompt","start","text","version","vlink","vspace"],o={td:["height","width","abbr","axis","char","charoff","height","nowrap","valign","width","align","bgcolor"],th:["height","width","abbr","axis","charoff","height","bgcolor","align","nowrap","char","valign","width"],li:["type","value","type"],ul:["type","compact"],pre:["width"],meta:["http-equiv"],a:["charset","coords","shape","rev","scheme"],link:["rev","charset","target"],img:["name","longdesc","align","hspace","vspace","border"],area:["nohref"],head:["profile"],html:["version"],iframe:["longdesc","align","frameborder","marginheight","marginwidth","scrolling"],object:["archive","code","codebase","codetype","declare","standby","align","hspace","vspace","border"],param:["type","valuetype"],script:["language"],body:["alink","background","bgcolor","link","text","vlink"],br:["clear"],caption:["align"],col:["align","char","charoff","valign","width"],div:["align"],dl:["compact"],hr:["align","noshade","size","width","align"],h2:["align"],h3:["align"],h4:["align"],h5:["align"],h6:["align"],input:["align","usemap"],legend:["align"],menu:["compact"],ol:["compact","type","type"],p:["align"],table:["bgcolor","cellpadding","cellspacing","frame","rules","width","align"],tbody:["align","char","valign","charoff"],tfoot:["align","charoff","char","valign"],thead:["char","charoff","valign","align"],tr:["align","bgcolor","char","charoff","valign"]};t.element_attribute_deprecated={id:"element_attribute_deprecated",context:"dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]",help:{"en-US":{pass:"element_attribute_deprecated.html",fail_elem:"element_attribute_deprecated.html",fail_attr:"element_attribute_deprecated.html",fail_elem_attr:"element_attribute_deprecated.html",group:"element_attribute_deprecated.html"}},messages:{"en-US":{pass:"Rule Passed",fail_elem:"The <{0}> element is deprecated in HTML 5",fail_attr:'The HTML attribute(s) "{0}" is deprecated in HTML 5',fail_elem_attr:'The HTML attribute(s) "{0}" is deprecated for the <{1}> element in HTML 5',group:"Avoid use of obsolete features if possible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("tbody"===n.nodeName.toLowerCase()&&n.hasAttribute("align"))return(0,a.RulePass)("pass");if(n.nodeName.includes("-"))return null;var s=n.nodeName.toLowerCase();if(r.includes(s))return(0,a.RuleFail)("fail_elem",[s]);for(var u=n.getAttributeNames(),d="",c=0,m=u;c<m.length;c++){var p=m[c];l.includes(p)&&(""!==d&&(d+=", "),d+=p)}if(""!==d)return(0,a.RuleFail)("fail_attr",[d]);if(d="",s in o){for(var h=0,g=u;h<g.length;h++)p=g[h],o[s]&&o[s].includes(p)&&(""!==d&&(d+=", "),d+=p);if(""!==d)return(0,a.RuleFail)("fail_elem_attr",[d,s])}return(0,a.RulePass)("pass")}}},5173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_id_unique=void 0;var a=i(461),n=i(461),r=i(5279);t.element_id_unique={id:"element_id_unique",context:"dom:*[id]",refactor:{RPT_Elem_UniqueId:{Pass_0:"pass",Fail_1:"potential_empty",Fail_2:"potential_in_use"}},help:{"en-US":{group:"element_id_unique.html",pass:"element_id_unique.html",potential_empty:"element_id_unique.html",potential_in_use:"element_id_unique.html"}},messages:{"en-US":{group:"Element 'id' attribute values must be unique within a document",pass:"Rule Passed",potential_empty:'The <{0}> element has the id "{1}" that is empty',potential_in_use:'The <{0}> element has the id "{1}" that is already in use'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"3ea0c8":{pass:"pass",potential_empty:"pass",potential_in_use:"fail"}}],run:function(e,t,i){var n=e.dom.node,l=n.getAttribute("id");return""===l?(0,a.RulePotential)("potential_empty",[n.nodeName.toLowerCase(),l]):r.FragmentUtil.getById(n,l)===n?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_in_use",[n.nodeName.toLowerCase(),l])}}},6027(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_lang_valid=t.html_lang_valid=void 0;var a=i(461),n=i(461),r=i(1043),l=i(3946),o=i(3864),s=i(1950),u=function(e){var t=e.dom.node,i=t.nodeName.toLowerCase();if(t.hasAttribute("lang"))if("html"!==i&&""===t.getAttribute("lang"));else{var a=t.getAttribute("lang");if(!r.LangUtil.validPrimaryLang(a))return 1;if(!r.LangUtil.isBcp47(a))return 2}if(t.hasAttribute("xml:lang"))if("html"!==i&&""===t.getAttribute("xml:lang"));else{if(a=t.getAttribute("xml:lang"),!r.LangUtil.validPrimaryLang(a))return 3;if(!r.LangUtil.isBcp47(a))return 4}return 0};t.html_lang_valid={id:"html_lang_valid",context:"dom:html[lang], dom:html[xml:lang]",help:{"en-US":{Pass_0:"html_lang_valid.html",Fail_1:"html_lang_valid.html",Fail_2:"html_lang_valid.html",Fail_3:"html_lang_valid.html",Fail_4:"html_lang_valid.html",group:"html_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The default human language of the page must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"fail",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"inapplicable"},bf051a:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"fail",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=u(e);return[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][n]}},t.element_lang_valid={id:"element_lang_valid",context:"dom:*[lang], dom:*[xml:lang]",help:{"en-US":{Pass_0:"element_lang_valid.html",Fail_1:"element_lang_valid.html",Fail_2:"element_lang_valid.html",Fail_3:"element_lang_valid.html",Fail_4:"element_lang_valid.html",group:"element_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The change in language of specific content must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{de46e4:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"inapplicable",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node;if("html"===n.nodeName.toLowerCase())return null;var r=u(e),d=[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][r];if(d.value[1]!==a.eRuleConfidence.PASS){var c=!1;if(null!==n.firstChild)for(var m=new o.DOMWalker(n,!1,n,!0);!c&&m.nextNode();)if(1===m.node.nodeType){var p=m.node;if(!l.VisUtil.isNodeVisible(p)||p.hasAttribute("lang"))m.bEndTag=!0;else{var h=s.AccNameUtil.computeAccessibleName(p);c=c||"img"===p.nodeName.toLowerCase()&&h&&h.name&&h.name.trim().length>0}}else c=c||3===m.node.nodeType&&m.node.nodeValue.trim().length>0;if(!c)return null}return d}}},7515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_mouseevent_keyboard=void 0;var a=i(461),n=i(461);t.element_mouseevent_keyboard={id:"element_mouseevent_keyboard",context:"dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]",refactor:{RPT_Elem_EventMouseAndKey:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"element_mouseevent_keyboard.html",Manual_1:"element_mouseevent_keyboard.html",group:"element_mouseevent_keyboard.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)",group:"All interactive content with mouse event handlers must have equivalent keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase(),l=n.hasAttribute("href")||!n.hasAttribute("ondblclick")&&!n.hasAttribute("onmousemove")&&(!n.hasAttribute("onmousedown")||n.hasAttribute("onkeydown"))&&(!n.hasAttribute("onmouseup")||n.hasAttribute("onkeyup"))&&(!n.hasAttribute("onmouseover")||n.hasAttribute("onfocus"))&&(!n.hasAttribute("onmouseout")||n.hasAttribute("onblur"))&&(!n.hasAttribute("onclick")||n.hasAttribute("onkeypress")||"a"==r||"button"==r),o=new Array;return l||(n.hasAttribute("ondblclick")&&o.push("ondblclick"),n.hasAttribute("onmousemove")&&o.push("onmousemove"),n.hasAttribute("onmousedown")&&!n.hasAttribute("onkeydown")&&o.push("onmousedown"),n.hasAttribute("onmouseup")&&!n.hasAttribute("onkeyup")&&o.push("onmouseup"),n.hasAttribute("onmouseover")&&!n.hasAttribute("onfocus")&&o.push("onmouseover"),n.hasAttribute("onmouseout")&&!n.hasAttribute("onblur")&&o.push("onmouseout"),n.hasAttribute("onclick")&&!n.hasAttribute("onkeypress")&&"a"!=r&&"button"!=r&&o.push("onclick")),l?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1",[r,o.join(", ")])}}},1704(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_orientation_unlocked=void 0;var a=i(461),n=i(461),r=i(4919),l=i(3946),o=i(4566),s=i(5279),u=i(7139);t.element_orientation_unlocked={id:"element_orientation_unlocked",context:"dom:*",help:{"en-US":{pass:"element_orientation_unlocked.html",fail_locked:"element_orientation_unlocked.html",group:"element_orientation_unlocked.html"}},messages:{"en-US":{pass:"The element is not restricted to either landscape or portrait orientation using CSS transform property",fail_locked:"The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property",group:"Elements should not be restricted to either landscape or portrait orientation using CSS transform property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["b33eff"],run:function(e,t,i){var n=e.dom.node;if(!l.VisUtil.isNodeVisible(n))return null;if(u.CommonUtil.getAncestor(n,["script","meta","title"]))return null;if(!u.CommonUtil.hasInnerContent(n))return null;var d=n.nodeName.toLowerCase(),c=s.FragmentUtil.getOwnerFragment(n),m=o.CacheUtil.getCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",null);m||(m=r.CSSUtil.getMediaOrientationTransform(c),o.CacheUtil.setCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",m));var p=[];if(Object.keys(m).forEach(function(e){Object.keys(m[e]).forEach(function(t){Object.keys(m[e][t]).length>0&&r.CSSUtil.selectorMatchesElem(n,t)&&(m[e][t].transform?p.push(m[e][t].transform):p.push(m[e][t]))})}),0===p.length)return null;for(var h=[],g=function(e){var t=p[e];if("object"==typeof t)for(var i in t)t=i+"("+t[i]+")";var l=!1;if(["rotate","rotate3d","rotateZ","matrix","matrix3d"].forEach(function(e){t.includes(e)&&(l=!0)}),!l)return"continue";var o=r.CSSUtil.getRotationDegree(t);if(0===o)return h.push((0,a.RulePass)("pass")),"continue";var s=r.CSSUtil.getDefinedStyles(n,["transform"]);s.transform&&(o+=r.CSSUtil.getRotationDegree(s.transform));var u=o%180;u<=1||u>=179?h.push((0,a.RulePass)("pass")):h.push((0,a.RuleFail)("fail_locked",[d]))},b=0;b<p.length;b++)g(b);return h.length>0?h:null}}},5053(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_scrollable_tabbable=void 0;var a=i(7139),n=i(461),r=i(3946),l=i(7011);t.element_scrollable_tabbable={id:"element_scrollable_tabbable",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_scrollable_tabbable.html",pass_tabbable:"element_scrollable_tabbable.html",pass_interactive:"element_scrollable_tabbable.html",fail_scrollable:"element_scrollable_tabbable.html"}},messages:{"en-US":{group:"Scrollable elements should be tabbable or contain tabbable content",pass_tabbable:"The scrollable element is tabbable",pass_interactive:"The scrollable element has tabbable content",fail_scrollable:"The scrollable element <{0}> with non-interactive content is not tabbable"}},rulesets:[],act:["0ssw9k"],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeVisible(o)&&!a.CommonUtil.isNodeDisabled(o))return a.CommonUtil.getAncestor(o,["iframe","svg","script","meta","style"])?null:a.CommonUtil.hasInnerContent(o)?l.AriaUtil.isNavigationOwnedOrControlled(o)?null:r.VisUtil.isElementScrollable(o)?a.CommonUtil.isTabbable(o)?(0,n.RulePass)("pass_tabbable"):a.CommonUtil.getTabbableChildren(o)>0?(0,n.RulePass)("pass_interactive"):!o.hasAttribute("tabindex")&&navigator.userAgent.indexOf("Firefox")>-1?null:(0,n.RuleFail)("fail_scrollable",[o.nodeName.toLowerCase()]):null:null}}},4681(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_role_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3864),u=i(3946);t.element_tabbable_role_valid={id:"element_tabbable_role_valid",context:"dom:*",help:{"en-US":{pass:"element_tabbable_role_valid.html",fail_invalid_role:"element_tabbable_role_valid.html",fail_no_valid_role:"element_tabbable_role_valid.html",group:"element_tabbable_role_valid.html"}},messages:{"en-US":{pass:"The tabbable element has a widget role",fail_invalid_role:"The tabbable element's role '{0}' is not a widget role",fail_no_valid_role:"The tabbable element does not have a valid widget role",group:"A tabbable element must have a valid widget role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.isNodeDisabled(n)||u.VisUtil.isNodeHiddenFromAT(n))return null;var d=n.nodeName.toLowerCase();if(d in l.CommonUtil.tabTagMap){var c=l.CommonUtil.tabTagMap[d];if("function"==typeof c&&(c=c(n)),c)return null}if(!n.hasAttribute("tabindex")||parseInt(n.getAttribute("tabindex"))<0)return null;if(r.AriaUtil.isNavigationOwnedOrControlled(n))return null;if(u.VisUtil.isElementScrollable(n))return null;var m=s.DOMWalker.parentNode(n),p=r.AriaUtil.getResolvedRole(m);if(["button","checkbox","img","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab"].includes(p))return null;var h=r.AriaUtil.getResolvedRole(n);return h?"application"===h?null:"row"===h||"separator"===h||"widget"===o.ARIADefinitions.designPatterns[h].roleType?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid_role",[h]):(0,a.RuleFail)("fail_no_valid_role")}}},8050(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_unobscured=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3946),o=i(7507),s=i(3883);t.element_tabbable_unobscured={id:"element_tabbable_unobscured",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_unobscured.html",pass:"element_tabbable_unobscured.html",potential_obscured:"element_tabbable_unobscured.html"}},messages:{"en-US":{group:"When an element receives focus, it is not entirely covered by other content",pass:"The element is not entirely covered by other content",potential_obscured:"Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.4.11"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!l.VisUtil.isNodeVisible(r)||!a.CommonUtil.isTabbable(r))return null;var u=r.nodeName.toLocaleLowerCase();if(null!==a.CommonUtil.getAncestor(r,["pre","code","script","meta"])||"body"===u||"html"===u)return null;var d=r.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=new o.DOMMapper,p=m.getUnadjustedBounds(r);if(!p||0===p.height||0===p.width)return null;var h=c.getComputedStyle(r);if(!h)return null;var g=parseInt("auto"!==h.zIndex&&h.zIndex?h.zIndex:"0"),b=d.querySelectorAll("body *:not(script):not(style):not(meta):not(link)");if(!b||0===b.length)return null;for(var _=!0,f=p.left+p.width,v=p.top+p.height,A=0;A<b.length;A++){var w=b[A],y=r.compareDocumentPosition(w);if(0===y||y&Node.DOCUMENT_POSITION_CONTAINED_BY)_=!1;else if(!(y&Node.DOCUMENT_POSITION_CONTAINS)&&l.VisUtil.isNodeVisible(w)){var C=m.getUnadjustedBounds(w);if(C&&0!==C.height&&0!==C.width&&!(C.top>p.top||C.left>p.left)){var k=C.left+C.width,R=C.top+C.height;if(!(k<f||R<v)){var x=c.getComputedStyle(w);if(x){var P=parseInt("auto"===x.zIndex||!x.zIndex||isNaN(Number(x.zIndex))?"0":x.zIndex);if(_&&P>g||!_&&P>=g){var T,U=!1;if(x.background&&"none"!==x.background&&(U=(T=s.ColorUtil.Color(x.background))&&(void 0===T.alpha||T.alpha>0)),!U&&x.backgroundColor&&(U=(T=s.ColorUtil.Color(x.backgroundColor))&&(void 0===T.alpha||T.alpha>0)),!a.CommonUtil.hasInnerContentHidden(w)&&!U)continue;return(0,n.RulePotential)("potential_obscured",[])}}}}}}return(0,n.RulePass)("pass")}}},2644(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_visible=void 0;var a=i(7139),n=i(4919),r=i(461),l=i(461),o=i(7507);t.element_tabbable_visible={id:"element_tabbable_visible",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_visible.html",pass:"element_tabbable_visible.html",potential_visible:"element_tabbable_visible.html"}},messages:{"en-US":{group:"A tabbable element should be visible on the screen when it has keyboard focus",pass:"The tabbable element is visible on the screen",potential_visible:"Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.7"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!a.CommonUtil.isTabbable(l))return null;var s=l.nodeName.toLocaleLowerCase(),u=(new o.DOMMapper).getUnadjustedBounds(l);if(!u)return null;var d=n.CSSUtil.getDefinedStylesMultiple(l,["position","clip"],["",":focus"]),c=d[""],m=d[":focus"];if(0===u.height||0===u.width)return(0,r.RulePotential)("potential_visible",[]);if("absolute"===c.position&&c.clip&&"rect(0px,0px,0px,0px)"===c.clip.replaceAll(" ","")&&!m.clip){if("input"===s&&("checkbox"===l.getAttribute("type")||"radio"===l.getAttribute("type"))){var p=a.CommonUtil.getLabelForElement(l);if(p&&!a.CommonUtil.isInnerTextEmpty(p)){var h=n.CSSUtil.getDefinedStylesMultiple(l,null,[":focus-visible",":focus-within",":checked",":focus"]),g=h[":focus-visible"],b=h[":focus-within"],_=h[":checked"];if(h[":focus"]||g||b||_)return(0,r.RulePass)("pass")}}return(0,r.RulePotential)("potential_visible",[])}if(u.top>=0&&u.left>=0)return(0,r.RulePass)("pass");var f=getComputedStyle(l),v=u.top,A=u.left;if(0===Object.keys(m).length)return(0,r.RulePotential)("potential_visible",[]);var w=["absolute","fixed"];return void 0!==m.top&&(v=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.top.replace(/\D/g,""):Number.MIN_VALUE),void 0!==m.left&&(A=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.left.replace(/\D/g,""):Number.MIN_VALUE),v>=0&&A>=0?(0,r.RulePass)("pass"):(0,r.RulePotential)("potential_visible",[])}}},429(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.embed_alt_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.embed_alt_exists={id:"embed_alt_exists",context:"dom:embed",refactor:{RPT_Embed_HasAlt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_alt_exists.html",Potential_1:"embed_alt_exists.html",group:"embed_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element has alternative content",group:"Provide alternative content for <embed> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},4617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.emoticons_alt_exists=void 0;var a=i(461),n=i(7139);t.emoticons_alt_exists={id:"emoticons_alt_exists",context:"dom:*",refactor:{WCAG20_Text_Emoticons:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"emoticons_alt_exists.html",Potential_1:"emoticons_alt_exists.html",group:"emoticons_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that emoticons have a text alternative",group:"Emoticons must have a short text alternative that describes their purpose"}},rulesets:[],act:[],run:function(e,t,i){for(var r=e.dom.node,l=[":-)",":)",":o)",":]",":3",":c)",":>","=]","8)","=)",":D","C:",":-D",":D","8D","XD","=D","=3","<=3","<=8","--!--",":-(",":(",":c",":<",":[","D:","D8","D;","D=","DX","v.v",":-9",";-)",";)","*)",";]",";D",":-P",":P",":-p",":p","=p",":-Þ",":Þ",":-b",":b",":-O",":O","O_O","o_o","8O","OwO","O-O","0_o","O_o","O3O","o0o ;o_o;","o...o","0w0",":-/",":/",":\\","=/","=\\",":S",":|","d:-)","qB-)",":)~",":-)>....",":-X",":X",":-#",":#","O:-)","0:3","O:)",":'(",";*(","T_T","TT_TT","T.T",":-*",":*","^o)",">:)",">;)",">:-)","B)","B-)","8)","8-)","^>.>^","^<.<^","^>_>^","^<_<^","D:<",">:(","D-:<",">:-(",":-@[1]",";(","`_´","D<","<3","<333","=^_^=","=>.>=","=<_<=","=>.<=","\\,,/","\\m/","\\m/\\>.</\\m/","\\o/","\\o o/","o/\\o",":&",":u"],o=!0,s="",u=r.firstChild;u;)"#text"==u.nodeName&&(s+=" "+u.nodeValue),u=u.nextSibling;if(s.trim().length>0)for(var d=0;o&&d<l.length;++d)for(var c=s.indexOf(l[d]),m=l[d].length;o&&-1!=c;)o=(o=(o=c>0&&!/\s/.test(s.substring(c-1,c))||c<s.length-m&&!/\s/.test(s.substring(c+m,c+m+1))&&!/[.,!'"?]/.test(s.substring(c+m,c+m+1)))||(":)"==l[d]||"(:"==l[d])&&/\(\:.*\:\)/.test(s))||(";)"==l[d]||"(;"==l[d])&&/\(\;.*\;\)/.test(s),c=s.indexOf(l[d],c+1);if(!o){var p=n.CommonUtil.getAncestor(r,["pre","code","script","body"]);o=null==p||"body"!=p.nodeName.toLowerCase()}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},5460(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.error_message_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(5279),o=i(3946);t.error_message_exists={id:"error_message_exists",context:"dom:*[aria-invalid=true]",refactor:{HAAC_Aria_ErrorMessage:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"error_message_exists.html",Fail_1:"error_message_exists.html",Fail_2:"error_message_exists.html",group:"error_message_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Custom error message has invalid reference 'id' value",Fail_2:"Custom error message is not visible",group:"A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.AriaUtil.getAriaAttribute(n,"aria-errormessage");if(!s)return null;var u=l.FragmentUtil.getById(n,s);return u?o.VisUtil.isNodeVisible(u)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2"):(0,a.RuleFail)("Fail_1")}}},3399(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_label_valid=void 0;var a=i(461),n=i(461),r=i(5279),l=i(4566),o=i(7139),s=i(3946),u=i(1950);t.fieldset_label_valid={id:"fieldset_label_valid",context:"aria:group",refactor:{group_withInputs_hasName:{Pass_1:"Pass_1",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_1:"fieldset_label_valid.html",Fail_1:"fieldset_label_valid.html",Fail_2:"fieldset_label_valid.html",group:"fieldset_label_valid.html"}},messages:{"en-US":{Pass_1:'Group/Fieldset "{0}" with an input has a unique name',Fail_1:"Group/Fieldset does not have an accessible name",Fail_2:'Group/Fieldset "{0}" has a duplicate name to another group',group:"Groups with nested inputs must have unique accessible name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)){var d=r.FragmentUtil.getOwnerFragment(n),c=l.CacheUtil.getCache(n.ownerDocument,"landmark_group_input",null);if(!c){c={groupsWithInputs:[],groupsWithInputsComputedLabels:[]};for(var m=d.querySelectorAll('fieldset,[role="group"]'),p=Array.from(m),h=[],g=0;g<p.length;g++)p[g].querySelector("input")&&h.push(p[g]);var b=[];for(g=0;g<h.length;g++){var _=u.AccNameUtil.computeAccessibleName(h[g]);b.push(_&&_.name&&_.name.trim().length>0?_.name.trim():"")}c.groupsWithInputs=h,c.groupsWithInputsComputedLabels=b,l.CacheUtil.setCache(n.ownerDocument,"landmark_group_input",c)}var f=!1,v="";if(!c.groupsWithInputs)return null;for(g=0;g<c.groupsWithInputs.length;g++)if(n.isSameNode(c.groupsWithInputs[g])){if(f=!0,""===c.groupsWithInputsComputedLabels[g]||null===c.groupsWithInputsComputedLabels[g])return(0,a.RuleFail)("Fail_1");for(var A=!1,w=0;w<c.groupsWithInputsComputedLabels.length;w++)g!=w&&c.groupsWithInputsComputedLabels[g]===c.groupsWithInputsComputedLabels[w]&&(A=!0);if(A)return(0,a.RuleFail)("Fail_2",[c.groupsWithInputsComputedLabels[g]]);v=c.groupsWithInputsComputedLabels[g]}return f?(0,a.RulePass)("Pass_1",[v]):null}}}},3498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_legend_valid=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.fieldset_legend_valid={id:"fieldset_legend_valid",context:"dom:fieldset",refactor:{WCAG20_Fieldset_HasLegend:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"fieldset_legend_valid.html",Fail_1:"fieldset_legend_valid.html",Fail_2:"fieldset_legend_valid.html",Fail_3:"fieldset_legend_valid.html",group:"fieldset_legend_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<fieldset> element does not have a <legend>",Fail_2:"<fieldset> element has more than one <legend>",Fail_3:"<fieldset> element <legend> is empty",group:" <fieldset> elements should have a single, non-empty <legend> as a label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n)||r.CommonUtil.isNodeDisabled(n))return null;var o=r.CommonUtil.getChildByTagHidden(n,"legend",!0,!1);return 0===o.length?(0,a.RuleFail)("Fail_1"):o.length>1?(0,a.RuleFail)("Fail_2"):0===r.CommonUtil.getInnerText(o[0]).trim().length?(0,a.RuleFail)("Fail_3"):(0,a.RulePass)("Pass_0")}}},9629(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.figure_label_exists=void 0;var a=i(461),n=i(461),r=i(3946),l=i(1950);t.figure_label_exists={id:"figure_label_exists",context:"dom:figure",refactor:{HAAC_Figure_label:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"figure_label_exists.html",Fail_1:"figure_label_exists.html",group:"figure_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <figure> element does not have an associated label",group:"A <figure> element must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=l.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[])}}},733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_font_color=void 0;var a=i(461),n=i(461);t.form_font_color={id:"form_font_color",context:"dom:form",refactor:{RPT_Font_ColorInForm:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_font_color.html",Potential_1:"form_font_color.html",group:"form_font_color.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Check color is not used as the only visual means to convey which fields are required",group:"Combine color and descriptive markup to indicate required form fields"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!0,r=e.dom.node.getElementsByTagName("font");if(null!=r)for(var l=0;l<r.length;++l)n=!r[l].hasAttribute("color");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9797(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_interaction_review=void 0;var a=i(461),n=i(461),r=i(7139);t.form_interaction_review={id:"form_interaction_review",context:"dom:form[target]",refactor:{WCAG20_Form_TargetAndText:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_interaction_review.html",Potential_1:"form_interaction_review.html",group:"form_interaction_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that interacting with content will not open pop-up windows or change the active window without informing the user",group:"User should be informed in advance when interacting with content causes a change of context"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n={paramWinText:{value:["new window"],type:"array"}},l=e.dom.node,o=l.getAttribute("target"),s="_parent"===o||"_self"===o||"_top"===o||null!=r.CommonUtil.getFrameByName(l,o);if(!s){var u=r.CommonUtil.getInnerText(l);l.hasAttribute("title")&&(u+=" "+l.getAttribute("title"));for(var d=0;!s&&d<n.paramWinText.value.length;++d)-1!=u.indexOf(n.paramWinText.value[d])&&(s=!0)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},7156(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_label_unique=void 0;var a=i(461),n=i(461),r=i(5279),l=i(4566);t.form_label_unique={id:"form_label_unique",context:"dom:label[for]",refactor:{RPT_Label_UniqueFor:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"form_label_unique.html",Fail_1:"form_label_unique.html",group:"form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control has more than one label",group:"Form controls should have exactly one label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CacheUtil.getCache(r.FragmentUtil.getOwnerFragment(n),"RPT_Label_Single",{}),s=n.getAttribute("for"),u=!(s in o);return o[s]=!0,u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3062(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_button_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3864);t.form_submit_button_exists={id:"form_submit_button_exists",context:"dom:form",refactor:{WCAG20_Form_HasSubmit:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_button_exists.html",Potential_1:"form_submit_button_exists.html",group:"form_submit_button_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the <form> element has a submit button or an image button",group:"A <form> element should have a submit button or an image button"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1;if(n.firstChild)for(var s=new l.DOMWalker(n,!0);!o&&s.prevNode()&&s.node!=n;)if(!s.bEndTag){var u=s.node.nodeName.toLowerCase();if("input"===u){var d=s.elem().getAttribute("type");d&&(d=d.toLowerCase()),o="submit"===d||"image"===d}else"button"===u?o=s.elem().hasAttribute("type")&&"submit"===s.elem().getAttribute("type").toLowerCase():1===s.node.nodeType&&(o=r.AriaUtil.hasRole(s.node,"button"))}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3827(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_review=void 0;var a=i(461);t.form_submit_review={id:"form_submit_review",context:"dom:select[onchange], dom:input[onchange]",refactor:{RPT_Form_ChangeEmpty:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_review.html",Potential_1:"form_submit_review.html",group:"form_submit_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Confirm the form does not submit automatically without warning",group:"A form should not be submitted automatically without warning the user"}},rulesets:[],act:[],run:function(e,t,i){var n=0===e.dom.node.getAttribute("onchange").trim().length;return n?null:n?void 0:(0,a.RulePotential)("Potential_1")}}},5498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_src_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.frame_src_valid={id:"frame_src_valid",context:"dom:frame, dom:iframe",refactor:{Valerie_Frame_SrcHtml:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"frame_src_valid.html",Potential_1:"frame_src_valid.html",group:"frame_src_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify <frame> content is accessible",group:"A <frame> containing non-HTML content must be made accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.attributeNonEmpty(n,"src")&&r.CommonUtil.isHtmlExt(r.CommonUtil.getFileExt(n.getAttribute("src")));return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},510(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_title_exists=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.frame_title_exists={id:"frame_title_exists",context:"dom:frame, dom:iframe",refactor:{WCAG20_Frame_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"frame_title_exists.html",Pass_0:"frame_title_exists.html",Fail_1:"frame_title_exists.html"}},messages:{"en-US":{group:"Inline frames must have a unique, non-empty 'title' attribute",Pass_0:"Rule Passed",Fail_1:"Inline frame does not have a 'title' attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:"cae760",run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=r.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7722(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_content_exists=void 0;var a=i(461),n=i(461),r=i(7139);t.heading_content_exists={id:"heading_content_exists",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",refactor:{RPT_Header_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"heading_content_exists.html",Fail_1:"heading_content_exists.html",group:"heading_content_exists.html"}},messages:{"en-US":{Pass_0:"Heading element has descriptive text",Fail_1:"Heading element has no descriptive content",group:"Heading elements must provide descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.6"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4597(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_markup_misuse=void 0;var a=i(461),n=i(461),r=i(7139);t.heading_markup_misuse={id:"heading_markup_misuse",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",dependencies:["heading_content_exists"],refactor:{RPT_Headers_FewWords:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"heading_markup_misuse.html",Potential_1:"heading_markup_misuse.html",group:"heading_markup_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the heading element is a genuine heading",group:"Heading elements must not be used for presentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.wordCount(r.CommonUtil.getInnerText(n))<=20;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},2104(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_lang_exists=void 0;var a=i(461),n=i(461),r=i(6858),l=i(1043);t.html_lang_exists={id:"html_lang_exists",context:"dom:html",refactor:{WCAG20_Html_HasLang:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3",Fail_4:"Fail_4",Fail_5:"Fail_5",Potential_5:"Potential_5",Potential_6:"Potential_6"}},help:{"en-US":{group:"html_lang_exists.html",Pass_0:"html_lang_exists.html",Fail_1:"html_lang_exists.html",Fail_2:"html_lang_exists.html",Fail_3:"html_lang_exists.html",Fail_4:"html_lang_exists.html",Fail_5:"html_lang_exists.html",Potential_5:"html_lang_exists.html",Potential_6:"html_lang_exists.html"}},messages:{"en-US":{group:"Page must identify the default language of the document with a 'lang' attribute",Pass_0:'Page language detected as "{0}"',Fail_1:"Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes",Fail_2:"Page detected as XHTML, but does not have an 'xml:lang' attribute",Fail_3:"Page detected as HTML, but does not have a 'lang' attribute",Fail_4:"Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"",Fail_5:"Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"",Potential_5:"Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type",Potential_6:"Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.1.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"fail",Fail_4:"inapplicable",Fail_5:"inapplicable",Potential_5:"inapplicable",Potential_6:"inapplicable"},"5b7ae0":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"fail",Fail_5:"pass",Potential_5:"inapplicable",Potential_6:"inapplicable"}}],run:function(e,t,i){if(r.AncestorUtil.isPresentationFrame(i))return null;var n=e.dom.node,o=n.ownerDocument.doctype?n.ownerDocument.doctype.publicId:"";o||(o="");var s=n.getAttribute("lang"),u=n.getAttribute("xml:lang");return o.includes("XHTML")&&!o.includes("1.0")?u?(0,a.RulePass)("Pass_0",[u]):(0,a.RuleFail)("Fail_2"):o.includes("XHTML")&&o.includes("1.0")?s||u?s&&u?s!==u?l.LangUtil.validPrimaryLang(s)&&l.LangUtil.validPrimaryLang(u)?l.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):s?(0,a.RulePotential)("Potential_5"):(0,a.RulePotential)("Potential_6"):(0,a.RuleFail)("Fail_1"):s?s&&u&&s!==u?l.LangUtil.validPrimaryLang(s)&&l.LangUtil.validPrimaryLang(u)?l.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):(0,a.RuleFail)("Fail_3")}}},8260(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_skipnav_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(5279);t.html_skipnav_exists={id:"html_skipnav_exists",context:"dom:html",refactor:{RPT_Html_SkipNav:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"html_skipnav_exists.html",Pass_0:"html_skipnav_exists.html",Potential_1:"html_skipnav_exists.html"}},messages:{"en-US":{group:"Provide a way to bypass blocks of content that are repeated on multiple Web pages",Pass_0:"Rule Passed",Potential_1:"Verify there is a way to bypass blocks of content that are repeated on multiple Web pages"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1,s=r.CommonUtil.getDocElementsByTag(n,"frame"),u=r.CommonUtil.getDocElementsByTag(n,"h1");if(null!=s&&s.length>0||null!=u&&u.length>0)o=!0;else for(var d=r.CommonUtil.getDocElementsByTag(n,"a"),c={},m=0;!o&&m<d.length;++m)if(d[m].hasAttribute("href")){var p=d[m].href;"string"!=typeof p&&(p=p.baseVal?p.baseVal:"");var h,g="";if((h=void 0!==n.ownerDocument.locationFromDAP&&null!=n.ownerDocument.locationFromDAP?n.ownerDocument.locationFromDAP:n.ownerDocument.location)&&(g=h.href),p.startsWith("file:///")&&(p="file:/"+p.substring(8)),g.startsWith("file:///")&&(g="file:/"+g.substring(8)),"#"==p.charAt(0)||p.startsWith(g+"#")){var b=r.CommonUtil.getFileAnchor(p);null!=l.FragmentUtil.getById(n,b)?o=!0:c[b]=!0}}else if(d[m].hasAttribute("name")){var _=d[m].getAttribute("name");-1!=_.indexOf("#")&&(_=r.CommonUtil.getFileAnchor(_)),o=_ in c}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8920(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.iframe_interactive_tabbable=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3946),o=i(7507);t.iframe_interactive_tabbable={id:"iframe_interactive_tabbable",context:"dom:iframe",dependencies:[],help:{"en-US":{group:"iframe_interactive_tabbable.html",pass:"iframe_interactive_tabbable.html",fail_invalid:"iframe_interactive_tabbable.html"}},messages:{"en-US":{group:"Iframe with interactive content should not be excluded from tab order using tabindex",pass:"The iframe with interactive content is not excluded from the tab order using tabindex",fail_invalid:"The <iframe> with interactive content is excluded from tab order using tabindex"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:["akn7bn"],run:function(e,t,i){var r=e.dom.node;if(!l.VisUtil.isNodeHiddenFromAT(r)&&!a.CommonUtil.isNodeDisabled(r)){var s=(new o.DOMMapper).getUnadjustedBounds(r);if(!s)return null;if(Math.max(s.height,s.width)<30||Math.min(s.height,s.width)<15)return null;if(!r.hasAttribute("tabindex")||parseInt(r.getAttribute("tabindex"))>=0)return(0,n.RulePass)("pass");var u=r;if(!u||!u.contentDocument||!u.contentDocument.documentElement)return null;var d=r.ownerDocument;return d&&Array.from(d.querySelectorAll("dialog")).some(function(e){return e.matches(":modal")&&!e.contains(r)})?null:a.CommonUtil.getTabbableChildren(r)>0?(0,n.RuleFail)("fail_invalid"):null}}}},1237(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagebutton_alt_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.imagebutton_alt_exists={id:"imagebutton_alt_exists",context:"dom:input",refactor:{WCAG20_Input_ExplicitLabelImage:{Pass_0:"Pass_0",Pass_1:"Pass_1",Pass_2:"Pass_2",Fail:"Fail"}},help:{"en-US":{Pass_0:"imagebutton_alt_exists.html",Pass_1:"imagebutton_alt_exists.html",Pass_2:"imagebutton_alt_exists.html",Fail:"imagebutton_alt_exists.html",group:"imagebutton_alt_exists.html"}},messages:{"en-US":{Pass_0:"Image button provides alternative text using the 'alt' attribute",Pass_1:"Image button provides alternative text using an ARIA label",Pass_2:"Image button provides alternative text using the 'title' attribute",Fail:'The <input> element of type "image" has no text alternative',group:'The <input> element of type "image" should have a text alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"59796f",run:function(e,t,i){var n=e.dom.node;return n.hasAttribute("type")&&"image"==n.getAttribute("type").toLowerCase()?l.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):r.AriaUtil.hasAriaLabel(n)?(0,a.RulePass)("Pass_1"):n.hasAttribute("title")&&n.getAttribute("title").length>0?(0,a.RulePass)("Pass_2"):(0,a.RuleFail)("Fail"):null}}},4101(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagemap_alt_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.imagemap_alt_exists={id:"imagemap_alt_exists",context:"dom:img[usemap], dom:img[ismap]",refactor:{HAAC_Img_UsemapAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"imagemap_alt_exists.html",Fail_1:"imagemap_alt_exists.html",group:"imagemap_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image map or child <area> has no text alternative",group:"An image map and each <area> element in an image map must have text alternative(s)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.CommonUtil.attributeNonEmpty(n,"alt")||!n.hasAttribute("ismap")&&!r.CommonUtil.attributeNonEmpty(n,"usemap")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},275(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_background=void 0;var a=i(461),n=i(461),r=i(3946);t.img_alt_background={id:"img_alt_background",context:"dom:*",refactor:{HAAC_BackgroundImg_HasTextOrTitle:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"img_alt_background.html",Manual_1:"img_alt_background.html",group:"img_alt_background.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify important background image information has a text alternative in system high contrast mode",group:"Background images that convey important information must have a text alternative that describes the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.ownerDocument.defaultView.getComputedStyle(n);if(null==l)return(0,a.RulePass)("Pass_0");var o=l.backgroundImage,s=!0;if(null!=o&&""!=o&&"none"!=o&&"inherit"!=o)if(null!=n.innerHTML&&0!=n.innerHTML.trim().length)s=!1;else{var u=n.getAttribute("title");null!=u&&0!=u.length&&(s=!1)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RuleManual)("Manual_1")}}},7601(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_decorative=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.img_alt_decorative={id:"img_alt_decorative",context:"dom:img[alt]",refactor:{WCAG20_Img_PresentationImgHasNonNullAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"img_alt_decorative.html",Fail_1:"img_alt_decorative.html",group:"img_alt_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image designated as decorative has non-null 'alt' attribute",group:'Image designated as decorative must have \'alt=""'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=!0;return(r.AriaUtil.hasRole(n,"presentation")||r.AriaUtil.hasRole(n,"none"))&&(o=0==n.getAttribute("alt").length),o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7541(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_misuse=void 0;var a=i(461),n=i(461),r=i(3946);t.img_alt_misuse={id:"img_alt_misuse",context:"dom:img, dom:area, dom:input",refactor:{RPT_Img_AltCommonMisuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_alt_misuse.html",Potential_1:"img_alt_misuse.html",group:"img_alt_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file name serves as a good inline replacement for the image",group:"'alt' attribute value must be a good inline replacement for the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.nodeName.toLowerCase(),o=!0;if(n.hasAttribute("alt")){var s=n.getAttribute("alt").trim();if(s.length>0){for(var u=["short description"],d=0;o&&d<u.length;++d)o=-1==s.indexOf(u[d]);if(o){var c=n.getAttribute("area"==l?"href":"src");null!=c&&(o=c.trim()!=s&&(-1==s.indexOf(".")||-1==s.indexOf(c)&&-1==c.indexOf(s)))}}}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8274(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_null=void 0;var a=i(461),n=i(461),r=i(3946),l=i(7011),o=i(7139);t.img_alt_null={id:"img_alt_null",context:"dom:img[alt]",refactor:{WCAG20_Img_TitleEmptyWhenAltNull:{Pass_0:"pass",Fail_1:"fail_decorative"}},help:{"en-US":{pass:"img_alt_null.html",fail_decorative:"img_alt_null.html",potential_aria_override:"img_alt_null.html",group:"img_alt_null.html"}},messages:{"en-US":{pass:"Neither 'aria' nor 'title' attributes are used for the decorative image",fail_decorative:"The image 'alt' attribute is empty, but the 'title' attribute is not empty",potential_aria_override:"The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute",group:"When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_decorative"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["potential_aria_override"]}],act:[{"46ca7f":{potential_aria_override:"fail"}}],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)||n.getAttribute("alt").trim().length>0?null:l.AriaUtil.getAriaLabel(n).length>0?(0,a.RulePotential)("potential_aria_override"):o.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RuleFail)("fail_decorative"):(0,a.RulePass)("pass")}}},590(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_redundant=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7139);t.img_alt_redundant={id:"img_alt_redundant",context:"dom:img[alt]",refactor:{WCAG20_Img_LinkTextNotRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"img_alt_redundant.html",Fail_1:"img_alt_redundant.html",Fail_2:"img_alt_redundant.html",Fail_3:"img_alt_redundant.html",group:"img_alt_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Link text is repeated in an image 'alt' value within the same link",Fail_2:"Link text of previous link is repeated in image 'alt' value of a link",Fail_3:"Image 'alt' value within a link is repeated in link text of the link after",group:"The text alternative for an image within a link should not repeat the link text or adjacent link text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.4.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CommonUtil.getAncestor(n,"a");if(null==o)return null;var s=n.getAttribute("alt").trim().toLowerCase();if(0==s.length)return null;var u=o.innerText,d="";if(null!=u&&(d=u.trim().toLowerCase()),!(d.length>0)){for(var c=!0,m=new r.DOMWalker(o);c&&m.prevNode()&&!("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&l.CommonUtil.attributeNonEmpty(p,"alt"));)"a"!==h||l.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=(p.innerText||p.textContent||"").trim().toLowerCase()!=s);if(!c)return(0,a.RuleFail)("Fail_2");for(m=new r.DOMWalker(o,!0);c&&m.nextNode();){var p,h;if("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&l.CommonUtil.attributeNonEmpty(p,"alt"))break;"a"!=h||l.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=p.innerText.trim().toLowerCase()!=s)}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3")}return s==d?(0,a.RuleFail)("Fail_1"):void 0}}},8925(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946),o=i(1950);t.img_alt_valid={id:"img_alt_valid",context:"dom:img",refactor:{WCAG20_Img_HasAlt:{pass:"pass",fail_blank_alt:"fail_blank_alt",fail_no_alt:"fail_no_alt",fail_blank_title:"fail_blank_title"}},help:{"en-US":{pass:"img_alt_valid.html",fail_blank_alt:"img_alt_valid.html",fail_no_alt:"img_alt_valid.html",fail_blank_title:"img_alt_valid.html",group:"img_alt_valid.html"}},messages:{"en-US":{pass:"The image has an accessible name or is correctly marked as decorative or redundant",fail_blank_alt:"Image 'alt' attribute value consists only of blank space(s)",fail_no_alt:"The image has neither an accessible name nor is marked as decorative or redundant",fail_blank_title:"The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)",group:"Images must have accessible names unless they are decorative or redundant"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"23a2a8",run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n)||o.AccNameUtil.isAccessibleNameIgnorable(n))return null;if(0!==r.AriaUtil.getAriaLabel(n).trim().length)return(0,a.RulePass)("pass");var s=n.hasAttribute("alt")?n.getAttribute("alt"):null;if(null!==s)return 0===s.length||s.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_blank_alt");var u=n.hasAttribute("title")?n.getAttribute("title"):null;if(null!==u&&0!==u.length)return 0===u.trim().length?(0,a.RuleFail)("fail_blank_title"):(0,a.RulePass)("pass");if(null===s){var d=r.AriaUtil.getResolvedRole(n,!1);return"presentation"===d||"none"===d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_alt")}return 0===s.length?(0,a.RulePass)("pass"):void 0}}},9234(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_ismap_misuse=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.img_ismap_misuse={id:"img_ismap_misuse",context:"dom:img[ismap]",refactor:{RPT_Img_UsemapValid:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_ismap_misuse.html",Potential_1:"img_ismap_misuse.html",group:"img_ismap_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Server-side image map hot-spots do not have duplicate text links",group:"Server-side image map hot-spots must have duplicate text links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=!1;if(n.hasAttribute("usemap")){var s=n.getAttribute("usemap"),u=(s=s.trim().toLowerCase()).indexOf("#");if(-1!=u&&(s=s.substr(u+1)),s.length>0)for(var d=r.CommonUtil.getDocElementsByTag(n,"map"),c=0;!o&&c<d.length;++c)o=d[c].hasAttribute("name")&&d[c].getAttribute("name").toLowerCase()==s}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_longdesc_misuse=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.img_longdesc_misuse={id:"img_longdesc_misuse",context:"dom:img[longdesc]",refactor:{RPT_Img_LongDescription2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_longdesc_misuse.html",Potential_1:"img_longdesc_misuse.html",group:"img_longdesc_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)",group:" The 'longdesc' attribute must reference HTML content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("longdesc"),s=r.CommonUtil.getFileExt(o),u=0!=s.length&&r.CommonUtil.isHtmlExt(s)||o.startsWith("#")||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("data:");return u?(0,a.RulePass)("Pass_0"):u?void 0:(0,a.RulePotential)("Potential_1")}}},591(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||a(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),n(i(2297),t),n(i(4401),t),n(i(4546),t),n(i(9292),t),n(i(9605),t),n(i(3987),t),n(i(8631),t),n(i(8025),t),n(i(1198),t),n(i(8001),t),n(i(5778),t),n(i(8118),t),n(i(2242),t),n(i(3673),t),n(i(5080),t),n(i(183),t),n(i(6805),t),n(i(1886),t),n(i(4078),t),n(i(5750),t),n(i(85),t),n(i(514),t),n(i(5310),t),n(i(9083),t),n(i(6049),t),n(i(5099),t),n(i(2759),t),n(i(3141),t),n(i(5131),t),n(i(5167),t),n(i(8115),t),n(i(5733),t),n(i(5782),t),n(i(6731),t),n(i(390),t),n(i(3900),t),n(i(1218),t),n(i(6734),t),n(i(9973),t),n(i(5711),t),n(i(3384),t),n(i(2762),t),n(i(5757),t),n(i(5232),t),n(i(1891),t),n(i(6142),t),n(i(4863),t),n(i(1440),t),n(i(1968),t),n(i(1617),t),n(i(3475),t),n(i(3370),t),n(i(9272),t),n(i(7735),t),n(i(3923),t),n(i(7521),t),n(i(1852),t),n(i(799),t),n(i(4614),t),n(i(5952),t),n(i(5395),t),n(i(1992),t),n(i(7955),t),n(i(9531),t),n(i(891),t),n(i(7446),t),n(i(6137),t),n(i(6839),t),n(i(8135),t),n(i(507),t),n(i(3566),t),n(i(5173),t),n(i(6027),t),n(i(7515),t),n(i(1704),t),n(i(5053),t),n(i(4681),t),n(i(8050),t),n(i(2644),t),n(i(429),t),n(i(4617),t),n(i(5460),t),n(i(3399),t),n(i(3498),t),n(i(9629),t),n(i(733),t),n(i(9797),t),n(i(7156),t),n(i(3062),t),n(i(3827),t),n(i(5498),t),n(i(510),t),n(i(7722),t),n(i(4597),t),n(i(2104),t),n(i(8260),t),n(i(8920),t),n(i(1237),t),n(i(4101),t),n(i(275),t),n(i(7601),t),n(i(7541),t),n(i(8274),t),n(i(590),t),n(i(8925),t),n(i(9234),t),n(i(8617),t),n(i(1939),t),n(i(7726),t),n(i(3142),t),n(i(1353),t),n(i(2631),t),n(i(8550),t),n(i(8853),t),n(i(3180),t),n(i(1382),t),n(i(953),t),n(i(2222),t),n(i(4678),t),n(i(7578),t),n(i(9964),t),n(i(6401),t),n(i(1174),t),n(i(9907),t),n(i(6032),t),n(i(5622),t),n(i(2240),t),n(i(4019),t),n(i(361),t),n(i(5960),t),n(i(5515),t),n(i(8752),t),n(i(8834),t),n(i(1025),t),n(i(9116),t),n(i(435),t),n(i(6640),t),n(i(2068),t),n(i(7322),t),n(i(5702),t),n(i(1961),t),n(i(3022),t),n(i(375),t),n(i(4658),t),n(i(4605),t),n(i(5294),t),n(i(3506),t),n(i(7475),t),n(i(8064),t),n(i(7942),t),n(i(2219),t),n(i(1473),t),n(i(1912),t),n(i(6539),t),n(i(4),t),n(i(5334),t),n(i(2173),t),n(i(8349),t),n(i(8142),t),n(i(3980),t),n(i(4701),t),n(i(18),t),n(i(9314),t),n(i(1667),t),n(i(9599),t),n(i(4672),t),n(i(4353),t),n(i(7147),t),n(i(1419),t),n(i(855),t),n(i(3420),t),n(i(408),t)},1939(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_autocomplete_valid=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.input_autocomplete_valid={id:"input_autocomplete_valid",context:"dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]",refactor:{WCAG21_Input_Autocomplete:{Pass_0:"pass",Fail_1:"fail_inappropriate",Fail_2:"fail_invalid",Fail_attribute_incorrect:"fail_incorrect"}},help:{"en-US":{group:"input_autocomplete_valid.html",pass:"input_autocomplete_valid.html",fail_inappropriate:"input_autocomplete_valid.html",fail_invalid:"input_autocomplete_valid.html",fail_incorrect:"input_autocomplete_valid.html"}},messages:{"en-US":{group:"The 'autocomplete' attribute's token(s) must be appropriate for the input form field",pass:"The 'autocomplete' attribute's token(s) is appropriate for the input form field",fail_inappropriate:"The 'autocomplete' attribute's token(s) are not appropriate for the input form field",fail_invalid:"The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type",fail_incorrect:"The 'autocomplete' attribute has an incorrect value"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"73f2c2":{pass:"pass",fail_inappropriate:"fail",fail_invalid:"pass",fail_incorrect:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(!l.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;var o=n.getAttribute("autocomplete").trim().toLowerCase(),s=o.split(/\s+/);if(0===s.length||0===o.length)return null;var u={tokensOnOff:["on","off"],tokenOptionalSection:"section-",tokensOptionalPurpose:["shipping","billing"],tokensMandatoryGroup1_password:["new-password","current-password","one-time-code"],tokensMandatoryGroup1_multiline:["street-address"],tokensMandatoryGroup1_month:["cc-exp"],tokensMandatoryGroup1_numeric:["cc-exp-month","cc-exp-year","transaction-amount","bday-day","bday-month","bday-year"],tokensMandatoryGroup1_date:["bday"],tokensMandatoryGroup1_url:["url","photo"],tokensMandatoryGroup1_text:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","organization-title","organization","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-csc","cc-type","transaction-currency","language","sex"],tokensMandatoryGroup1_all:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","new-password","current-password","organization-title","organization","street-address","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc","cc-type","transaction-currency","transaction-amount","language","bday","bday-day","bday-month","bday-year","sex","url","photo"],tokensOptionalGroup2:["home","work","mobile","fax","pager"],tokensMandatoryGroup2_tel:["tel"],tokensMandatoryGroup2_email:["email"],tokensMandatoryGroup2_url:["impp"],tokensMandatoryGroup2_text:["tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension"],tokensMandatoryGroup2_all:["tel","tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension","email","impp"],tokensOptionGroup1_webauthn:["webauthn"]},d=[];for(var c in u)d=d.concat(u[c]);var m=!1,p=!0,h=n.nodeName.toLowerCase();if(!s.every(function(e){return d.includes(e)||e.startsWith(u.tokenOptionalSection)}))return(0,a.RuleFail)("fail_incorrect");var g=n.hasAttribute("type")?n.getAttribute("type").trim().toLowerCase():"text",b=[],_=[],f=[];if("textarea"===h||"select"===h)b=u.tokensMandatoryGroup1_all,_=u.tokensMandatoryGroup2_all,"textarea"===h&&(f=u.tokensOptionGroup1_webauthn);else{if("input"!==h)return null;switch(f=u.tokensOptionGroup1_webauthn,g){case"text":case"search":b=u.tokensMandatoryGroup1_text.concat(u.tokensMandatoryGroup1_password,u.tokensMandatoryGroup1_url,u.tokensMandatoryGroup1_numeric,u.tokensMandatoryGroup1_month,u.tokensMandatoryGroup1_date),_=u.tokensMandatoryGroup2_all;break;case"password":b=u.tokensMandatoryGroup1_password;break;case"url":b=u.tokensMandatoryGroup1_url,_=u.tokensMandatoryGroup2_url;break;case"email":_=u.tokensMandatoryGroup2_email;break;case"tel":_=u.tokensMandatoryGroup2_tel;break;case"number":b=u.tokensMandatoryGroup1_numeric;break;case"month":b=u.tokensMandatoryGroup1_month;break;case"date":b=u.tokensMandatoryGroup1_date;break;default:return null}}if(s.includes("on")||s.includes("off"))return 1===s.length?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid");var v=0,A=0;return s[v].startsWith(u.tokenOptionalSection)&&s[v].length>8&&(v++,A++),s.length>v&&u.tokensOptionalPurpose.includes(s[v])&&(v++,A++),s.length>v&&(b.includes(s[v])?(m=!0,v++):(u.tokensOptionalGroup2.includes(s[v])&&v++,_.includes(s[v])&&(m=!0,v++))),s.length>A&&(u.tokensMandatoryGroup1_all.includes(s[A])?(p=!0,A++):(u.tokensOptionalGroup2.includes(s[A])&&A++,u.tokensMandatoryGroup2_all.includes(s[A])&&(p=!0,A++))),s.length>v+A&&f.includes(s[v+A])&&v++,(s.length>v&&f.includes(s[v])||s.length>A&&f.includes(s[A]))&&(v++,A++),m&&s.length===v?(0,a.RulePass)("pass"):p&&s.length===A?(0,a.RuleFail)("fail_incorrect"):(0,a.RuleFail)("fail_inappropriate")}}},7726(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_checkboxes_grouped=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3864),s=i(4566),u=i(3946),d=i(9196);t.input_checkboxes_grouped={id:"input_checkboxes_grouped",context:"dom:input[type=radio], dom:input[type=checkbox]",refactor:{WCAG20_Input_RadioChkInFieldSet:{Pass_LoneNogroup:"pass_lonenogroup",Pass_Grouped:"pass_grouped",Pass_RadioNoName:"pass_radioNoName",Fail_ControlNameMismatch:"fail_controlnamemismatch",Fail_NotGroupedOtherGrouped:"fail_notgroupedothergrouped",Fail_NotGroupedOtherNotGrouped:"fail_notgroupedothernotgrouped",Fail_NotSameGroup:"fail_notsamegroup",Potential_LoneCheckbox:"potential_lonecheckbox",Potential_UnnamedCheckbox:"potential_unnamedcheckbox"}},help:{"en-US":{group:"input_checkboxes_grouped.html",pass_lonenogroup:"input_checkboxes_grouped.html",pass_grouped:"input_checkboxes_grouped.html",pass_radiononame:"input_checkboxes_grouped.html",fail_controlnamemismatch:"input_checkboxes_grouped.html",fail_notgroupedothergrouped:"input_checkboxes_grouped.html",fail_notgroupedothernotgrouped:"input_checkboxes_grouped.html",fail_notsamegroup:"input_checkboxes_grouped.html",potential_lonecheckbox:"input_checkboxes_grouped.html",potential_unnamedcheckbox:"input_checkboxes_grouped.html"}},messages:{"en-US":{group:"Related sets of radio buttons or checkboxes should be programmatically grouped",pass_lonenogroup:"{0} grouping not required for a control of this type",pass_grouped:"{0} input is grouped with other related controls with the same name",pass_radiononame:"Radio input is not grouped, but passes because it has no name to group with other radio inputs",fail_controlnamemismatch:'{0} input found that has the same name, "{2}" as a {1} input',fail_notgroupedothergrouped:'{0} input is not in the group with another {0} with the name "{1}"',fail_notgroupedothernotgrouped:'{0} input and others with the name "{1}" are not grouped together',fail_notsamegroup:'{0} input is in a different group than another {0} with the name "{1}"',potential_lonecheckbox:"Verify that this ungrouped checkbox input is not related to other checkboxes",potential_unnamedcheckbox:"Verify that this un-named, ungrouped checkbox input is not related to other checkboxes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(u.VisUtil.isNodeHiddenFromAT(n))return null;var c=function(e){var t=l.CommonUtil.getAncestor(e,"fieldset")||r.AriaUtil.getAncestorWithRole(e,"radiogroup")||r.AriaUtil.getAncestorWithRole(e,"group")||r.AriaUtil.getAncestorWithRole(e,"grid")||r.AriaUtil.getAncestorWithRole(e,"table");return t||(t=l.CommonUtil.getAncestor(e,"table"))&&!d.TableUtil.isDataTable(t)&&(t=null),t},m=n.getAttribute("type").toLowerCase(),p=r.AriaUtil.getAncestorWithRole(n,"form")||l.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement,h=s.CacheUtil.getCache(p,"input_checkboxes_grouped",null);if(!h){h={checkboxByName:{},radiosByName:{},nameToGroup:{},numCheckboxes:0,numRadios:0};for(var g=new o.DOMWalker(p,!1,p,!0),b=[],_=[];g.nextNode();)if(!g.bEndTag&&1===g.node.nodeType&&"input"===g.node.nodeName.toLowerCase()&&u.VisUtil.isNodeVisible(g.node)){var f=g.node.getAttribute("type");"checkbox"===f?b.push(g.node):"radio"===f&&_.push(g.node)}for(var v=0;v<b.length;++v){var A=b[v];if((r.AriaUtil.getAncestorWithRole(A,"form")||l.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!l.CommonUtil.shouldNodeBeSkippedHidden(A)){var w=A.getAttribute("name")||"";(h.checkboxByName[w]=h.checkboxByName[w]||[]).push(A),h.nameToGroup[w]=h.nameToGroup[w]||c(A),++h.numCheckboxes}}for(v=0;v<_.length;++v){var y=_[v];if((r.AriaUtil.getAncestorWithRole(y,"form")||l.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!l.CommonUtil.shouldNodeBeSkippedHidden(y)){var C=y.getAttribute("name")||"";(h.radiosByName[C]=h.radiosByName[C]||[]).push(y),h.nameToGroup[C]=h.nameToGroup[C]||c(y),++h.numRadios}}s.CacheUtil.setCache(p,"input_checkboxes_grouped",h)}var k=n.getAttribute("name"),R=c(n);if(m="radio"===m?"Radio":"Checkbox",k&&""!==k){var x=(h.radiosByName[k]||[]).length,P=(h.checkboxByName[k]||[]).length;return x>0&&P>0?(0,a.RuleFail)("fail_controlnamemismatch",[m,"checkbox"===m?"radio":"checkbox",k]):"Radio"===m&&(1===h.numRadios||1===x)||"Checkbox"===m&&1===h.numCheckboxes?null===R?(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m]):"Checkbox"===m&&h.numCheckboxes>1&&1===P?null===R?(0,a.RulePotential)("potential_lonecheckbox",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?null!==h.nameToGroup[k]?(0,a.RuleFail)("fail_notgroupedothergrouped",[m,k]):(0,a.RuleFail)("fail_notgroupedothernotgrouped",[m,k]):h.nameToGroup[k]!==R?(0,a.RuleFail)("fail_notsamegroup",[m,k]):(0,a.RulePass)("pass_grouped",[m])}return"Radio"===m?null===R?(0,a.RulePass)("pass_radiononame",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?(h.checkboxByName[""]||[]).length>1?(0,a.RulePotential)("potential_unnamedcheckbox",[m]):(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m])}}},3142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_fields_grouped=void 0;var a=i(461),n=i(461),r=i(7139);t.input_fields_grouped={id:"input_fields_grouped",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_InFieldSet:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"input_fields_grouped.html",Potential_1:"input_fields_grouped.html",group:"input_fields_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Use the <fieldset> element to group logically related input elements",group:"Groups of logically related input elements should be contained within a <fieldset> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")&&"text"!=(m=n.getAttribute("type").toLowerCase())&&"file"!=m&&"password"!=m)return(0,a.RulePass)("Pass_0");if(null!=r.CommonUtil.getAncestor(n,"fieldset"))return(0,a.RulePass)("Pass_0");for(var l=r.CommonUtil.getAncestor(n,["form","body"]),o=["input","textarea","select"],s=!0,u=0;s&&u<o.length;++u)for(var d=l.getElementsByTagName(o[u]),c=0;s&&c<d.length;++c)if(!r.CommonUtil.shouldNodeBeSkippedHidden(d[c])){var m=d[c].hasAttribute("type")?d[c].getAttribute("type").toLowerCase():"text";s=d[c]==n||"text"!=m&&"password"!=m&&"file"!=m}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},1353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_haspopup_conflict=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.input_haspopup_conflict={id:"input_haspopup_conflict",context:"dom:input[list][aria-haspopup]",refactor:{input_haspopup_invalid:{Potential_1:"potential_type_misuse",Potential_2:"potential_misuse"}},help:{"en-US":{group:"input_haspopup_conflict.html",potential_type_misuse:"input_haspopup_conflict.html",potential_misuse:"input_haspopup_conflict.html",potential_list_notexist:"input_haspopup_conflict.html",fail_invalid_list_type:"input_haspopup_conflict.html",fail_invalid_list_elem:"input_haspopup_conflict.html"}},messages:{"en-US":{group:"<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute",potential_type_misuse:"The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_misuse:"The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_list_notexist:"The list attribute for the <input> element is invalid",fail_invalid_list_type:'The list attribute for the <input> element with the type "{0}" is invalid',fail_invalid_list_elem:"The list attribute for the <input> element does not reference a datalist element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n)||l.CommonUtil.isNodeDisabled(n))return null;var s=r.AriaUtil.getUserDefinedRoles(n);if(s&&s.length>0&&!s.includes("combobox"))return null;var u=["text","search","tel","url","email","date","month","week","time","datetime-local","number","range","color"],d=["file","password","checkbox","radio","submit","reset","image","hidden","button"],c=n.getAttribute("type");if(!c||0===c.trim().length)return(0,a.RulePotential)("potential_misuse");if(c=c.trim().toLowerCase(),!u.includes(c)&&!d.includes(c))return(0,a.RulePotential)("potential_misuse");if(c&&d.includes(c))return(0,a.RuleFail)("fail_invalid_list_type");var m=n.getAttribute("list");if(!m||0===m.trim().length)return(0,a.RulePotential)("potential_list_notexist");var p=n.ownerDocument.getElementById(m);return p?"datalist"!==p.nodeName.toLowerCase()?(0,a.RuleFail)("fail_invalid_list_elem"):u.includes(c)?(0,a.RulePotential)("potential_type_misuse",[c]):void 0:(0,a.RuleFail)("potential_list_notexist")}}},2631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_after=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7139);t.input_label_after={id:"input_label_after",context:"dom:input",refactor:{WCAG20_Input_LabelAfter:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_after.html",Fail_1:"input_label_after.html",Fail_2:"input_label_after.html",group:"input_label_after.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Checkbox or radio button is nested in label, so label is not after the input control",Fail_2:"Label text is located before its associated checkbox or radio button element",group:"Checkboxes and radio buttons must have a label after the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o="";if(n.hasAttribute("type")&&(o=n.getAttribute("type").toLowerCase()),"checkbox"!=o&&"radio"!=o)return null;var s=l.CommonUtil.getLabelForElementHidden(n,!0);if(null===s||!l.CommonUtil.hasInnerContentHidden(s))return null;var u,d=l.CommonUtil.compareNodeOrder(s,n);if(-2===d){u=!1;var c=new r.DOMWalker(s);for(c.node=n;!u&&c.nextNode();)u="#text"===c.node.nodeName.toLowerCase()&&c.node.nodeValue.trim().length>0||"span"===c.node.nodeName.toLowerCase()&&c.node.textContent.trim().length>0;if(!u)return(0,a.RuleFail)("Fail_1")}else if(1!=d)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8550(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_before=void 0;var a=i(461),n=i(461),r=i(7139);t.input_label_before={id:"input_label_before",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_LabelBefore:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_before.html",Fail_1:"input_label_before.html",Fail_2:"input_label_before.html",group:"input_label_before.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Text input is nested in label such that input precedes the label text",Fail_2:"Label text is located after its associated text input or <select> element",group:"Text inputs and <select> elements must have a label before the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var l=n.getAttribute("type").toLowerCase();if("text"!=l&&"file"!=l&&"password"!=l)return null}var o=r.CommonUtil.getLabelForElementHidden(n,!0);if(null==o||!r.CommonUtil.hasInnerContentHidden(o))return null;var s=r.CommonUtil.compareNodeOrder(o,n);if(-2===s){var u=r.CommonUtil.getInnerText(n);if(u&&u.trim().length>0&&r.CommonUtil.getInnerText(n).trim()===u.trim())return null;for(var d=!1,c=n.previousSibling;!d&&null!==c;)d="#text"==c.nodeName.toLowerCase()&&c.nodeValue.trim().length>0||"span"==c.nodeName.toLowerCase()&&c.textContent.trim().length>0,c=c.previousSibling;if(!d)return(0,a.RuleFail)("Fail_1")}else if(-1!=s)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8853(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946),o=i(1950);t.input_label_exists={id:"input_label_exists",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]",refactor:{WCAG20_Input_ExplicitLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_exists.html",Fail_1:"input_label_exists.html",Fail_2:"input_label_exists.html",group:"input_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control element <{0}> has no associated label",Fail_2:'Form control with "{0}" role has no associated label',group:"Each form control must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["97a4e1","e086e5"],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var s=n.nodeName.toLowerCase();if("datalist"===s)return null;var u="text";if("input"==s&&n.hasAttribute("type")?u=n.getAttribute("type").toLowerCase():("button"===s||r.AriaUtil.hasRoleInSemantics(n,"button"))&&(u="buttonelem"),"input"==s&&""==u&&(u="text"),"image"===u)return null;var d=o.AccNameUtil.computeAccessibleName(n);return d&&d.name&&d.name.trim().length>0?(0,a.RulePass)("Pass_0"):n.hasAttribute("role")&&n.getAttribute("role").trim().length>0?(0,a.RuleFail)("Fail_2",n.getAttribute("role").split(" ")):(0,a.RuleFail)("Fail_1",[s])}}},3180(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(3946),u=i(1686),d=i(1950);t.input_label_visible={id:"input_label_visible",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox",dependencies:["input_label_exists"],refactor:{WCAG20_Input_VisibleLabel:{Pass_0:"pass",Potential_1:"potential_no_label",potential_placeholder_only:"potential_placeholder_only"}},help:{"en-US":{pass:"input_label_visible.html",potential_placeholder_only:"input_label_visible.html",potential_no_label:"input_label_visible.html",group:"input_label_visible.html"}},messages:{"en-US":{pass:"The input element has an associated visible label",potential_placeholder_only:"The ‘placeholder’ is the only visible label",potential_no_label:"The input element does not have an associated visible label",group:"An input element must have an associated visible label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.5.3","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if("datalist"===c)return null;if(!s.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;if(l.CommonUtil.getAncestor(n,"table"))return null;var m=r.AriaUtil.getResolvedRole(n);if(m&&"button"===m&&"input"!==c&&"button"!==c&&!l.CommonUtil.getAncestor(n,"form"))return null;if(r.AriaUtil.getAncestorWithRole(n,"combobox")&&!(r.AriaUtil.hasRoleInSemantics(n,"textbox")||r.AriaUtil.hasRoleInSemantics(n,"searchbox")||"input"===c||"select"===c&&r.AriaUtil.hasRoleInSemantics(n,"combobox")))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(r.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=l.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=l.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(o.FragmentUtil.getById(n,v[A])===n)return null}var w=d.AccNameUtil.computeAccessibleName(n);if(("input"===c||"button"===c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"internal"===w.nameFrom||"alt"===w.nameFrom))return(0,a.RulePass)("pass");if(w&&w.name&&w.name.trim().length>0&&("text"===w.nameFrom||"title"===w.nameFrom))return(0,a.RulePass)("pass");var y=l.CommonUtil.getOnScreenInnerText(n);if(y&&0!==y.length)return(0,a.RulePass)("pass");var C=r.AriaUtil.getAllDescendantsWithRoles(n,["img","graphics-document","graphics-object","graphics-symbol"],!1,!0);if(C&&C.length>0)for(var k=0;k<C.length;k++)if(l.CommonUtil.attributeNonEmpty(C[k],"title")||l.CommonUtil.attributeNonEmpty(C[k],"alt"))return(0,a.RulePass)("pass");if(l.CommonUtil.attributeNonEmpty(n,"aria-labelledby")){var R=n.getAttribute("aria-labelledby").split(/\s+/);for(h=0;h<R.length;++h){var x=o.FragmentUtil.getById(n,R[h]);if(x&&!u.DOMUtil.sameNode(x,n)&&s.VisUtil.isNodeVisible(x)&&l.CommonUtil.hasInnerContentHidden(x))return(0,a.RulePass)("pass")}}if(("optgroup"===c||"option"==c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"content"===w.nameFrom))return(0,a.RulePass)("pass");var P=n.getAttribute("id");return P&&P.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(P,"'][role='combobox']"))?null:l.CommonUtil.attributeNonEmpty(n,"placeholder")?(0,a.RulePotential)("potential_placeholder_only"):(0,a.RulePotential)("potential_no_label")}}},1382(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_onchange_review=void 0;var a=i(461),n=i(461);t.input_onchange_review={id:"input_onchange_review",context:"dom:input[onchange], dom:textarea[onchange], dom:select[onchange]",refactor:{WCAG20_Input_HasOnchange:{Potential_1:"potential_warning"}},help:{"en-US":{potential_warning:"input_onchange_review.html",group:"input_onchange_review.html"}},messages:{"en-US":{group:"Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs",potential_warning:"Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var r=n.getAttribute("type").toLowerCase();if("hidden"===r||"submit"===r||"image"===r||"button"===r||"reset"===r)return null}return(0,a.RulePotential)("potential_warning")}}},953(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_placeholder_label_visible=void 0;var a=i(461);t.input_placeholder_label_visible={id:"input_placeholder_label_visible",context:"dom:input[placeholder], dom:textarea[placeholder]",refactor:{HAAC_Input_Placeholder:{Pass_0:"Pass_0",Potential_1:"Potential_1",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"input_placeholder_label_visible.html",Potential_1:"input_placeholder_label_visible.html",Potential_2:"input_placeholder_label_visible.html",group:"input_placeholder_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"HTML5 placeholder is the only visible label",Potential_2:"Additional visible label referenced by 'aria-labelledby' is not valid",group:"HTML5 'placeholder' attribute must not be used as a visible label replacement"}},rulesets:[],act:[],run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")){var r=n.getAttribute("type").toLowerCase();if("hidden"==r||"button"==r)return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("hidden")){var l=n.getAttribute("hidden");if(""==l||"hidden"==l.toLowerCase())return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("aria-label"))return(0,a.RulePotential)("Potential_1");if(n.hasAttribute("aria-labelledby")&&n.hasAttribute("id")){var o=n.getAttribute("id").trim();return n.getAttribute("aria-labelledby").trim().split(/\s+/).includes(o)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0")}return(0,a.RulePass)("Pass_0")}}},2222(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_content_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(5279),o=i(1686);t.label_content_exists={id:"label_content_exists",context:"dom:label",refactor:{Valerie_Label_HasContent:{Pass_Regular:"Pass_Regular",Pass_AriaLabel:"Pass_AriaLabel",Pass_LabelledBy:"Pass_LabelledBy",Fail_1:"Fail_1"}},help:{"en-US":{Pass_Regular:"label_content_exists.html",Pass_AriaLabel:"label_content_exists.html",Pass_LabelledBy:"label_content_exists.html",Fail_1:"label_content_exists.html",group:"label_content_exists.html"}},messages:{"en-US":{Pass_Regular:"<label> element has accessible name with inner content",Pass_AriaLabel:"<label> element has accessible name via 'aria-label'",Pass_LabelledBy:"<label> element has accessible name via 'aria-labelledby'",Fail_1:"The <label> element does not have descriptive text that identifies the expected input",group:"A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.hasInnerContentHidden(n))return(0,a.RulePass)("Pass_Regular");if((n.getAttribute("aria-label")||"").trim().length>0)return(0,a.RulePass)("Pass_AriaLabel");if(n.hasAttribute("aria-labelledby")){var s=l.FragmentUtil.getById(n,n.getAttribute("aria-labelledby"));if(s&&!o.DOMUtil.sameNode(s,n)&&r.CommonUtil.hasInnerContent(s))return(0,a.RulePass)("Pass_LabelledBy")}return(0,a.RuleFail)("Fail_1")}}},4678(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_name_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(3946),u=i(4919),d=i(3864);t.label_name_visible={id:"label_name_visible",context:"aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter",refactor:{WCAG21_Label_Accessible:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"label_name_visible.html",Fail_1:"label_name_visible.html",group:"label_name_visible.html"}},messages:{"en-US":{Pass_0:"Accessible name matches or contains the visible label text",Fail_1:"Accessible name does not match or contain the visible label text",group:"Accessible name must match or contain the visible label text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["2.5.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:"2ee8b8",run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;if(u.CSSUtil.isMaterialIconFont(n))return(0,a.RulePass)("Pass_0");var c=!0,m=n.nodeName.toLowerCase(),p=!1,h=null;"input"===m&&n.hasAttribute("type")&&(h=n.getAttribute("type").toLowerCase(),-1!==l.CommonUtil.form_button_types.indexOf(h)&&(p=!0));var g=r.AriaUtil.getAriaAttribute(n,"aria-labelledby");if(!g||l.CommonUtil.isIdReferToSelf(n,g)||p){var b=null;if(g&&!l.CommonUtil.isIdReferToSelf(n,g))for(var _=g.split(/\s+/),f=0;f<_.length;++f){var v=o.FragmentUtil.getById(n,_[f]);if(v){b=l.CommonUtil.getInnerText(v);break}}else b=r.AriaUtil.getAriaAttribute(n,"aria-label");if(!b)return null;var A=null;if(p&&(n.hasAttribute("value")?A=n.getAttribute("value"):"submit"===h?A="submit":"reset"===h&&(A="reset")),!A){var w=l.CommonUtil.getLabelForElementHidden(n,!0);if(!w){var y=d.DOMWalker.parentNode(n);if("label"===y.nodeName.toLowerCase()){var C=y.cloneNode(!0);w=l.CommonUtil.removeAllFormElementsFromLabel(C)}}var k=w||n;A=w||-1===["meter","output","progress","select","textarea"].indexOf(m)?l.CommonUtil.getOnScreenInnerText(k):""}var R=/[^a-zA-Z0-9]/g;A=A.replace(R," ");var x=l.CommonUtil.normalizeSpacing(A).toLowerCase();b=b.replace(R," ");var P=l.CommonUtil.normalizeSpacing(b).toLowerCase();if(x.length>1){var T=P.indexOf(x);if(T>=0&&P.length>x.length){var U=/^[0-9a-zA-Z]+$/;T+x.length<P.length&&P.charAt(T+x.length).match(U)&&(c=!1),c&&T>0&&P.charAt(T-1).match(U)&&(c=!1)}-1===T&&(c=!1)}}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7578(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_ref_valid=void 0;var a=i(461),n=i(461),r=i(5279),l=i(3946);t.label_ref_valid={id:"label_ref_valid",context:"dom:label[for]",refactor:{WCAG20_Label_RefValid:{Pass_0:"pass",Fail_1:"fail_invalid"}},help:{"en-US":{pass:"label_ref_valid.html",fail_invalid:"label_ref_valid.html",group:"label_ref_valid.html"}},messages:{"en-US":{pass:"The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element",fail_invalid:"The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element",group:"The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.getAttribute("for"),s=!1,u=r.FragmentUtil.getById(n,o);if(u){if(!l.VisUtil.isNodeVisible(u)&&!l.VisUtil.isNodeVisible(n))return null;if(s=!0,!u.hasAttribute("role")){var d=u.nodeName.toLowerCase();if(s="input"==d||"select"==d||"textarea"==d||"button"==d||"datalist"==d||"optgroup"==d||"option"==d||"keygen"==d||"output"==d||"progress"==d||"meter"==d||"fieldset"==d||"legend"==d,"input"==u.nodeName.toLowerCase()&&u.hasAttribute("type")){var c=u.getAttribute("type").toLowerCase();s="text"==c||"password"==c||"file"==c||"checkbox"==c||"radio"==c||"hidden"==c||"search"==c||"tel"==c||"url"==c||"email"==c||"date"==c||"number"==c||"range"==c||"image"==c||"time"==c||"color"==c||"datetime-local"==c||"month"==c||"week"==c}}s&&!l.VisUtil.isNodeVisible(u)&&(s=!1)}var m=[];return s||m.push(o),s?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid",m)}}},9964(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_children_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3864);t.list_children_valid={id:"list_children_valid",context:"aria:group",refactor:{HAAC_List_Group_ListItem:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"list_children_valid.html",Fail_1:"list_children_valid.html",group:"list_children_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'List component with "group" role has children that are not <listitem> elements',group:'List component with "group" role must limit children to <listitem> elements'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.DOMWalker.parentElement(n);if(!r.AriaUtil.hasRoleInSemantics(o,"list"))return null;for(var s=!0,u=n.children,d=0;s&&d<u.length;d++)s=r.AriaUtil.hasRoleInSemantics(u[d],"listitem");return s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_markup_review=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=new RegExp(/^[ \t]*[•◦▪▸►✓✗✦\-–—*o][ \t]+\S/.source+"|"+/^[ \t]*(?:\(?\d+[.)]\)?|\(?[a-zA-Z][.)]\)?|\(?(?:i{1,3}|iv|vi{0,3}|ix|xi{0,3}|xiv|xv)[.)]\)?)[ \t]+\S/i.source,"i"),u=new Set(["blockquote","center","dir","div","form","h1","h2","h3","h4","h5","h6","hr","br","menu","p","pre","table","section","article","aside","nav","header","footer","figure","figcaption","details","summary","dialog","script","style","label","ul","ol","dl","li","dt","dd"]),d=new Set(["a","abbr","acronym","b","bdo","big","br","button","cite","code","dfn","em","i","img","input","kbd","label","map","object","output","q","samp","select","small","span","strong","sub","sup","textarea","time","tt","u","var"]);function c(e){var t="";return e.childNodes.forEach(function(e){var i;if(e.nodeType===Node.TEXT_NODE)t+=null!==(i=e.nodeValue)&&void 0!==i?i:"";else if(e.nodeType===Node.ELEMENT_NODE){var a=e.nodeName.toLowerCase();d.has(a)&&(t+=c(e))}}),t.replace(/\s+/g," ")}function m(e){var t=0,i=0,a="";e.childNodes.forEach(function(e){var n,r=e.nodeName.toLowerCase();if("br"===r){var l=a.trim();return l.length>0&&(s.test(l)?t=Math.max(t,++i):i=0),void(a="")}if(e.nodeType!==Node.TEXT_NODE){if(e.nodeType===Node.ELEMENT_NODE){var o=e;if(u.has(r)){var m=a.trim();return m.length>0&&s.test(m)&&(t=Math.max(t,++i)),a="",void(i=0)}d.has(r)?a+=c(o):(i=0,a="")}}else{var p=null!==(n=e.nodeValue)&&void 0!==n?n:"";if(0===p.trim().length)return;p.split(/\r?\n/).forEach(function(e,n){if(n>0){var r=a.trim();r.length>0&&(s.test(r)?t=Math.max(t,++i):i=0),a=""}a+=e})}});var n=a.trim();return n.length>0&&s.test(n)&&(t=Math.max(t,++i)),t}function p(e){for(var t=0,i=0,a=function(e){var t=[];return function e(i){var a;if(i.nodeType===Node.TEXT_NODE)(null!==(a=i.nodeValue)&&void 0!==a?a:"").split(/\r?\n/).forEach(function(e){var i=e.trim();i.length>0&&t.push(i)});else if(i.nodeType===Node.ELEMENT_NODE){var n=i,o=n.nodeName.toLowerCase();if("br"===o)return void t.push("\0");if(u.has(o))return;if(n.getAttribute("role")){var s=r.AriaUtil.getRolesWithTypes(n,["widget"]);if(l.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","rowheader"],s),s.length>0)return}i.childNodes.forEach(e)}}(e),t.filter(function(e){return"\0"!==e})}(e);i<a.length;i++){var n=a[i];if(s.test(n)){if(++t>=2)return!0}else t=0}return!1}t.list_markup_review={id:"list_markup_review",context:"dom:*",refactor:{RPT_List_UseMarkup:{Potential_1:"Potential_1"}},help:{"en-US":{potential_list:"list_markup_review.html",group:"list_markup_review.html"}},messages:{"en-US":{potential_list:"Verify this is a list and if so, modify to use proper HTML elements for the list",group:"Proper HTML elements should be used to create a list"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,s=n.nodeName.toLowerCase();if(l.CommonUtil.isNodeDisabled(n)||o.VisUtil.hiddenByDefaultElements.includes(s))return null;if(null===l.CommonUtil.getAncestor(n,["body"]))return null;if(null!==l.CommonUtil.getAncestor(n,["script","style","label"]))return null;if("td"===s||"th"===s)return m(n)>=2||p(n)?(0,a.RulePotential)("potential_list"):null;var d=r.AriaUtil.getRolesWithTypes(n,["widget"]);return l.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","rowheader"],d),null!==r.AriaUtil.getAncestorWithRoles(n,d)?null:u.has(s)||"body"===s||"li"===s?["ul","ol","dl","menu"].includes(s)?null:m(n)>=2||p(n)?(0,a.RulePotential)("potential_list"):null:null}}},1174(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_structure_proper=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.list_structure_proper={id:"list_structure_proper",context:"dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt",refactor:{RPT_List_Misuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"list_structure_proper.html",Potential_1:"list_structure_proper.html",group:"list_structure_proper.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"List element is missing or improperly structured",group:"List elements should only be used for lists of related items"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node,s=o.nodeName.toLowerCase();if(o.children,"dl"==s){var u="",d="",c=o.firstChild;n=!0;var m=!1;if(o.children&&0!=o.children.length){for(;n&&null!=c;){if(1==c.nodeType){var p=c.nodeName.toLowerCase();if(r.AriaUtil.isPresentationalElement(c)){m=!0,c=c.nextSibling;continue}n="dd"==p||"dt"==p,""==u&&(u=p),d=p}c=c.nextSibling}n=n&&"dt"==u&&"dd"==d||n&&m}else n=!0}else if("li"==s)n=null!=l.CommonUtil.getAncestor(o,["ul","ol","dir","menu"]);else if("dd"==s||"dt"==s)n=null!=l.CommonUtil.getAncestor(o,"dl");else if(c=o.firstChild,"ul"!=s&&"ol"!=s&&"menu"!=s||o.children&&0!=o.children.length){var h=!1;for(m=!1,n=!0;n&&null!=c;)r.AriaUtil.isPresentationalElement(c)?(m=!0,c=c.nextSibling):(n=1!=c.nodeType||"li"==c.nodeName.toLowerCase()||"template"==c.nodeName.toLowerCase()&&("ul"==s||"ol"==s),h=h||1==c.nodeType&&"li"==c.nodeName.toLowerCase(),c=c.nextSibling);n=n&&h||n&&m}else n=!0;return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9907(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.marquee_elem_avoid=void 0;var a=i(461),n=i(461);t.marquee_elem_avoid={id:"marquee_elem_avoid",context:"dom:marquee",refactor:{RPT_Marquee_Trigger:{Fail_1:"Fail_1"}},help:{"en-US":{Fail_1:"marquee_elem_avoid.html",group:"marquee_elem_avoid.html"}},messages:{"en-US":{Fail_1:"Scrolling content found that uses the obsolete <marquee> element",group:"The <marquee> element is obsolete and should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){return e.dom.node,(0,a.RuleFail)("Fail_1")}}},6032(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_brief=void 0;var a=i(461),n=i(461),r=i(3946);t.media_alt_brief={id:"media_alt_brief",context:"dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]",refactor:{RPT_Media_AltBrief:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_brief.html",Potential_1:"media_alt_brief.html",group:"media_alt_brief.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Text alternative is more than 150 characters",group:"Alternative text in 'alt' attribute should be brief (<150 characters)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.getAttribute("alt").trim().length<=150;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},5622(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.media_alt_exists={id:"media_alt_exists",context:"dom:area[alt], dom:embed[alt]",refactor:{RPT_Media_AudioVideoAltFilename:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_exists.html",Potential_1:"media_alt_exists.html",group:"media_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Filename used as label for embedded audio or video",group:"Audio or video on the page must have a short text alternative that describes the media content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o="";null==(o="area"==n.nodeName.toLowerCase()?n.getAttribute("href"):n.getAttribute("src"))&&(o="");var s=r.CommonUtil.getFileExt(o),u=0!=s.length&&(r.CommonUtil.isAudioExt(s)||r.CommonUtil.isVideoExt(s)),d=n.getAttribute("alt"),c=!u||d.length>0&&-1==d.indexOf(s);return c?(0,a.RulePass)("Pass_0"):c?void 0:(0,a.RulePotential)("Potential_1")}}},2240(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_audio_transcribed=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.media_audio_transcribed={id:"media_audio_transcribed",context:"dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object",refactor:{RPT_Media_AudioTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_audio_transcribed.html",group:"media_audio_transcribed.html"}},messages:{"en-US":{Manual_1:"Provide transcripts for audio files",group:"Audio information should also be available in text form"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(o)||(n="bgsound"!=o.nodeName.toLowerCase()&&!r.CommonUtil.isAudioObjEmbedLink(o))?null:n?void 0:(0,a.RuleManual)("Manual_1")}}},4019(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_autostart_controllable=void 0;var a=i(461),n=i(461);t.media_autostart_controllable={id:"media_autostart_controllable",context:"dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound",refactor:{RPT_Embed_AutoStart:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_autostart_controllable.html",Potential_1:"media_autostart_controllable.html",group:"media_autostart_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically",group:"Mechanism must be available to pause or stop and control the volume of the audio that plays automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n,r=e.dom.node,l=r.nodeName.toLowerCase();if("bgsound"==l)n=!1;else if("param"==l){var o="";r.hasAttribute("value")&&(o=r.getAttribute("value").toLowerCase()),n=0==o.indexOf("0;")||!(-1!=o.indexOf("true")||-1!=o.indexOf("1"))}else if("embed"==l){var s;n=!0,r.hasAttribute("flashvars")&&(n=-1==(s=r.getAttribute("flashvars")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1")),n&&r.hasAttribute("src")&&(n=-1==(s=r.getAttribute("src")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1"))}if(n&&r.hasAttribute("autostart")){var u=r.getAttribute("autostart").toLowerCase();n="true"!=u&&"1"!=u}return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},361(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_keyboard_controllable=void 0;var a=i(461),n=i(461),r=i(3946);t.media_keyboard_controllable={id:"media_keyboard_controllable",context:"dom:audio, dom:video",refactor:{HAAC_Audio_Video_Trigger:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"media_keyboard_controllable.html",Manual_1:"media_keyboard_controllable.html",group:"media_keyboard_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify media using <audio> and/or <video> elements have keyboard accessible controls",group:"Media using <audio> and/or <video> elements must have keyboard accessible controls"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=!0,o=n.nodeName.toLowerCase();return"audio"!=o&&"video"!==o||(l=!1),l?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1")}}},5960(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_live_captioned=void 0;var a=i(461),n=i(461),r=i(7139);t.media_live_captioned={id:"media_live_captioned",context:"dom:embed, dom:object",refactor:{RPT_Media_VideoObjectTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_live_captioned.html",group:"media_live_captioned.html"}},messages:{"en-US":{Manual_1:"Verify captions are provided for live media (streaming video with audio)",group:"Live media (streaming video with audio) should have captions for audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!r.CommonUtil.isVideoObjEmbedLink(n);return l?null:l?void 0:(0,a.RuleManual)("Manual_1")}}},5515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_track_available=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.media_track_available={id:"media_track_available",context:"dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object",refactor:{RPT_Media_VideoReferenceTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_track_available.html",group:"media_track_available.html"}},messages:{"en-US":{Manual_1:"Verify availability of a user-selectable audio track with description of visual content",group:"Pre-recorded media should have an audio track that describes visual information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.3","1.2.5"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o;return(o="applet"!=n.nodeName.toLowerCase()&&!r.CommonUtil.isVideoObjEmbedLink(n))?null:o?void 0:(0,a.RuleManual)("Manual_1")}}},8752(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_redirect_optional=void 0;var a=i(461),n=i(461),r=i(4566);t.meta_redirect_optional={id:"meta_redirect_optional",context:"dom:meta[http-equiv][content]",refactor:{WCAG20_Meta_RedirectZero:{pass:"pass",fail:"fail",fail_longrefresh:"fail_longrefresh"}},help:{"en-US":{group:"meta_redirect_optional.html",pass:"meta_redirect_optional.html",fail:"meta_redirect_optional.html",fail_longrefresh:"meta_redirect_optional.html"}},messages:{"en-US":{group:"Page should not automatically refresh without warning or option to turn it off or adjust the time limit",pass:"Rule Passed",fail:"Check page does not automatically refresh without warning or options",fail_longrefresh:"Check page does not automatically refresh without warning or options"}},rulesets:[{id:[],num:["2.2.4","3.2.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bisz58"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var l=n.ownerDocument;if(l){if(r.CacheUtil.getCache(l,"meta_redirect_optional_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(r.CacheUtil.setCache(l,"meta_redirect_optional_done",!0),0===s?(0,a.RulePass)("pass"):s<72001?(0,a.RuleFail)("fail"):(0,a.RuleFail)("fail_longrefresh"))}}}},8834(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_refresh_delay=void 0;var a=i(461),n=i(461),r=i(4566);t.meta_refresh_delay={id:"meta_refresh_delay",context:"dom:meta[http-equiv][content]",refactor:{RPT_Meta_Refresh:{Pass_0:"pass",Potential_1:"potential_refresh"}},help:{"en-US":{group:"meta_refresh_delay.html",pass:"meta_refresh_delay.html",potential_refresh:"meta_refresh_delay.html"}},messages:{"en-US":{group:"Pages should not refresh automatically",pass:"Pages do not refresh automatically",potential_refresh:"Verify page is not being caused to refresh automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bc659a"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var l=n.ownerDocument;if(l){if(r.CacheUtil.getCache(l,"meta_refresh_delay_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(r.CacheUtil.setCache(l,"meta_refresh_delay_done",!0),0===s?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_refresh"))}}}},1025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_viewport_zoomable=void 0;var a=i(461),n=i(461);t.meta_viewport_zoomable={id:"meta_viewport_zoomable",context:"dom:meta[name][content]",refactor:{meta_viewport_zoom:{Pass_0:"pass",Potential_1:"potential_zoomable"}},help:{"en-US":{group:"meta_viewport_zoomable.html",pass:"meta_viewport_zoomable.html",potential_zoomable:"meta_viewport_zoomable.html"}},messages:{"en-US":{group:"The 'meta[name=viewport]' should not prevent the browser zooming the content",pass:"The 'meta[name=viewport]' does not prevent the browser zooming the content",potential_zoomable:"Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{b4f0c3:{pass:"pass",potential_zoomable:"fail"}}],run:function(e,t,i){var n=e.dom.node;if("viewport"!==n.getAttribute("name").toLowerCase())return null;var r=n.getAttribute("content").toLowerCase();if(!r||""===r.trim()||!r.includes("maximum-scale")&&!r.includes("user-scalable"))return null;for(var l=null,o=null,s="yes",u="2.0",d=0,c=r.split(",");d<c.length;d++){var m=c[d],p=m.trim().split("=");p.length<2||(m.includes("user-scalable")?(l=m,((s=p[1].trim()).startsWith("'")||s.startsWith('"'))&&(s=s.substring(1,s.length-1))):m.includes("maximum-scale")&&(o=m,((u=p[1].trim()).startsWith("'")||u.startsWith('"'))&&(u=u.substring(1,u.length-1).trim())))}var h=Number(s);isNaN(h)||(h>=1||h<=-1)&&(s="yes");var g;return h=Number(u),g=isNaN(h)?"yes"===u?1:.1:h<0?2:h,"yes"!==s?(0,a.RulePotential)("potential_zoomable",[l]):g<2?(0,a.RulePotential)("potential_zoomable",[o]):(0,a.RulePass)("pass")}}},9116(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.noembed_content_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.noembed_content_exists={id:"noembed_content_exists",context:"dom:noembed",refactor:{Valerie_Noembed_HasContent:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"noembed_content_exists.html",Potential_1:"noembed_content_exists.html",group:"noembed_content_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Add descriptive text to the <noembed> element",group:"<noembed> elements should contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.CommonUtil.hasInnerContentHidden(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},435(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.object_text_exists=void 0;var a=i(461),n=i(461),r=i(3946),l=i(1950);t.object_text_exists={id:"object_text_exists",context:"dom:object",refactor:{WCAG20_Object_HasText:{pass:"pass",fail_no_text_alternative:"fail_no_text_alternative"}},help:{"en-US":{group:"object_text_exists.html",pass:"object_text_exists.html",fail_no_text_alternative:"object_text_exists.html"}},messages:{"en-US":{group:"<object> element must have a text alternative for the content rendered by the object",pass:"<object> element has a text alternative",fail_no_text_alternative:"An <object> element does not have a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"8fc3b6",run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;if(n.hasAttribute("type")&&-1!==n.getAttribute("type").indexOf("text"))return null;if(n.getAttribute("role"))return null;var o=n.getAttribute("data"),s=o&&"string"==typeof o?o.substring(o.lastIndexOf(".")):"";if(".html"===s||".htm"===s)return null;var u=l.AccNameUtil.computeAccessibleName(n);return u&&u.name&&u.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_text_alternative")}}},6640(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(6858);t.page_title_exists={id:"page_title_exists",context:"dom:html",refactor:{WCAG20_Doc_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"page_title_exists.html",Pass_0:"page_title_exists.html",Fail_1:"page_title_exists.html",Fail_2:"page_title_exists.html",Fail_3:"page_title_exists.html"}},messages:{"en-US":{group:"The page should have a title that correctly identifies the subject of the page",Pass_0:"Rule Passed",Fail_1:"Missing <head> element so there can be no <title> element present",Fail_2:"Missing <title> element in <head> element",Fail_3:"The <title> element is empty (no innerHTML)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"2779a5":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail",Fail_3:"fail"}}],run:function(e,t,i){if(l.AncestorUtil.isFrame(i))return null;for(var n=e.dom.node,o=n.firstChild,s=null;null!=o&&"head"!=o.nodeName.toLowerCase();)o=o.nextSibling;for(var u=n.querySelectorAll("title"),d=0;d<u.length;++d)if(!r.CommonUtil.getAncestor(u[d],["svg"])){s=u[d];break}return null!==o||s?null===s?(0,a.RuleFail)("Fail_2"):null!=s&&r.CommonUtil.getInnerText(s).trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3"):(0,a.RuleFail)("Fail_1")}}},2068(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.page_title_valid={id:"page_title_valid",context:"dom:head dom:title",refactor:{RPT_Title_Valid:{Pass_0:"Pass_0",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"page_title_valid.html",Potential_2:"page_title_valid.html",group:"page_title_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_2:"Verify that using the filename as the page <title> value is descriptive",group:"Page <title> should be a descriptive title, rather than a filename"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getInnerText(n).trim(),o=l.toLowerCase();return o.includes(".com")||o.includes(".net")||o.includes(".org")?(0,a.RulePass)("Pass_0",[l]):0===l.length?null:/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(l)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0",[l])}}},7322(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_focus_blur_review=void 0;var a=i(461),n=i(461);t.script_focus_blur_review={id:"script_focus_blur_review",context:"dom:*[onfocus]",refactor:{WCAG20_Script_FocusBlurs:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_focus_blur_review.html",Potential_1:"script_focus_blur_review.html",group:"script_focus_blur_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify script does not remove focus from content that normally receives focus",group:"Scripting must not remove focus from content that normally receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.7","3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=-1==e.dom.node.getAttribute("onfocus").indexOf(".blur(");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},5702(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_avoid=void 0;var a=i(461),n=i(461),r=i(7139);t.script_onclick_avoid={id:"script_onclick_avoid",context:"dom:*[onclick]",dependencies:["script_onclick_misuse"],refactor:{RPT_Script_OnclickHTML2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_avoid.html",Potential_1:"script_onclick_avoid.html",group:"script_onclick_avoid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that 'onclick' events are not used in script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.getAncestor(n,"svg"))return(0,a.RulePass)("Pass_0");if(r.CommonUtil.attributeNonEmpty(n,"role"))return(0,a.RulePass)("Pass_0");var l=n.nodeName.toLowerCase(),o="a"==l||"area"==l||"input"==l;return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},1961(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_misuse=void 0;var a=i(461),n=i(461),r=i(7139);t.script_onclick_misuse={id:"script_onclick_misuse",context:"dom:*[onclick]",refactor:{RPT_Script_OnclickHTML1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_misuse.html",Potential_1:"script_onclick_misuse.html",group:"script_onclick_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Possible use of a script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.attributeNonEmpty(n,"role"),o=n.nodeName.toLowerCase();if(!(l=l||("a"==o||"area"==o)&&r.CommonUtil.attributeNonEmpty(n,"href"))){var s=[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml","location.href"],u=n.getAttribute("onclick").toLowerCase();l=!0;for(var d=0;l&&d<s.length;++d)l=-1==u.indexOf(s[d])}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},3022(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_select_review=void 0;var a=i(461),n=i(461);t.script_select_review={id:"script_select_review",context:"dom:select",refactor:{WCAG20_Select_NoChangeAction:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_select_review.html",Potential_1:"script_select_review.html",group:"script_select_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that no change of context or action occurs when selection options in this component receive focus",group:"No changes of context should occur when a selection value receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!n.hasAttribute("onchange")&&!n.hasAttribute("onfocus");return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},375(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.select_options_grouped=void 0;var a=i(461),n=i(461),r=i(7139);t.select_options_grouped={id:"select_options_grouped",context:"dom:select",refactor:{WCAG20_Select_HasOptGroup:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"select_options_grouped.html",Potential_1:"select_options_grouped.html",group:"select_options_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Group of related options may need <optgroup>",group:"Groups of related options within a selection list should be grouped with <optgroup>"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getChildByTagHidden(n,"optgroup",!1,!0).length>0||r.CommonUtil.getChildByTagHidden(n,"option",!1,!0).length<=10;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},4658(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_described=void 0;var a=i(461),n=i(461),r=i(7139),l=i(4566),o=i(3946);t.skip_main_described={id:"skip_main_described",context:"dom:body",dependencies:["skip_main_exists"],refactor:{WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"skip_main_described.html",Potential_1:"skip_main_described.html",group:"skip_main_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that if this hyperlink skips content, the description communicates where it links to",group:"The description of a hyperlink used to skip content must communicate where it links to"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s={paramSkipText:{value:["skip","jump"],type:"[string]"}},u=e.dom.node,d=u.ownerDocument;if(null===l.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&l.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",r.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=l.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){var c=d.links;if(c&&c.length>0&&o.VisUtil.isNodeVisible(c[0]))for(var m=r.CommonUtil.getInnerText(d.links[0]).toLowerCase(),p=0;!n&&p<s.paramSkipText.value.length;++p)n=-1!=m.indexOf(s.paramSkipText.value[p]);else n=!1}return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},4605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(6858),o=i(4566),s=i(3946);t.skip_main_exists={id:"skip_main_exists",context:"dom:body",refactor:{WCAG20_Body_FirstASkips_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"skip_main_exists.html",Fail_1:"skip_main_exists.html",group:"skip_main_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)',group:"Pages must provide a way to skip directly to the main content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){if(l.AncestorUtil.isPresentationFrame(i))return null;var n,u=e.dom.node,d=u.ownerDocument;if(null===o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&o.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",r.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){for(var c=r.CommonUtil.getDocElementsByTag(u,"a"),m=null,p=0;p<c.length;++p)if(c[p].hasAttribute("href")&&s.VisUtil.isNodeVisible(c[p])){m=c[p];break}var h=null;if(null!=m){var g=m.getAttribute("href"),b=g.indexOf("#");-1!=b&&(h=g.substring(b+1))}if(null!=h)for(n=null!=d.getElementById(h),p=0;!n&&p<c.length;++p)!c[p].hasAttribute("href")&&c[p].hasAttribute("name")&&c[p].getAttribute("name")==h&&(n=!0)}return n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5294(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_background_decorative=void 0;var a=i(461),n=i(461),r=i(7139);t.style_background_decorative={id:"style_background_decorative",context:"dom:style, dom:*[style]",refactor:{RPT_Style_BackgroundImage:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"style_background_decorative.html",Potential_1:"style_background_decorative.html",group:"style_background_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the CSS background image does not convey important information",group:"Images included by using CSS alone must not convey important information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.nodeName.toLowerCase(),o=!0;if("link"===l&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&(o=r.CommonUtil.triggerOnce(n,"style_background_decorative",!1)),o&&"style"===l||n.hasAttribute("style")){var s=("style"===l?r.CommonUtil.getInnerText(n):n.getAttribute("style")).match(/background:[^;]*/g);if(null!==s)for(var u=0;o&&u<s.length;++u)o=-1===s[u].indexOf("url(")}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3506(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_before_after_review=void 0;var a=i(461),n=i(461),r=i(4919);t.style_before_after_review={id:"style_before_after_review",context:"dom:style, dom:link",refactor:{WCAG20_Style_BeforeAfter:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_before_after_review.html",Pass_0:"style_before_after_review.html",Potential_1:"style_before_after_review.html"}},messages:{"en-US":{group:"Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content",Pass_0:"Rule Passed",Potential_1:"Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content"}},rulesets:[{id:[],num:"1.3.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!0;if("style"===n.nodeName.toLowerCase()){for(var o=r.CSSUtil.getCSSStyle(n),s=0;l&&s<o.length;++s)o[s].selector&&(l=-1===o[s].selector.indexOf(":before")&&-1===o[s].selector.indexOf(":after")||!("content"in o[s].values)||0===o[s].values.content.trim().length||'""'===o[s].values.content.trim()||"''"===o[s].values.content.trim()||"none"===o[s].values.content.trim()||"attr(x)"===o[s].values.content.trim()||"attr(y)"===o[s].values.content.trim());if(l)for(var u=0;u<n.ownerDocument.styleSheets.length;u++)if((_=n.ownerDocument.styleSheets[u]).ownerNode===n)try{var d=_.cssRules?_.cssRules:_.rules;if(d)for(var c=0;l&&c<d.length;c++){var m=d[c],p=void 0;if(m.type&&4===m.type){if(v=m.cssRules)for(var h=0;l&&h<v.length;h++)null!==(w=v[h]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1))}else if(m.type&&3===m.type&&(p=m).styleSheet&&(f=p.styleSheet.cssRules?p.styleSheet.cssRules:p.styleSheet.rules))for(h=0;l&&h<f.length;h++){var g=f[h];if(g.type&&4===g.type){if(v=g.cssRules)for(var b=0;b<v.length;b++)null!==(w=v[b]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1))}else null!==g.selectorText&&void 0!==g.selectorText&&(-1===(C=g.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=g.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1))}}}catch(e){}}if("link"===n.nodeName.toLowerCase()&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&n.hasAttribute("href")&&0!==n.getAttribute("href").trim().length)for(u=0;u<n.ownerDocument.styleSheets.length;u++){var _;if((_=n.ownerDocument.styleSheets[u])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(h=0;l&&h<f.length;h++){var v,A=f[h];if(A.type&&4===A.type){if(v=A.cssRules)for(b=0;l&&b<v.length;b++){var w;if(null!==(w=v[b]).selectorText&&void 0!==w.selectorText){var y=w.selectorText.toLowerCase();-1===y.indexOf(":before")&&-1===y.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1)}}}else if(null!==f[h].selectorText&&void 0!==f[h].selectorText){var C,k;-1===(C=f[h].selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=f[h].style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1)}}}catch(e){}}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},7475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_color_misuse=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3864),o=i(4566);t.style_color_misuse={id:"style_color_misuse",context:"dom:style, dom:*[style], dom:font[color], dom:link",refactor:{RPT_Style_ColorSemantics1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_color_misuse.html",Pass_0:"style_color_misuse.html",Potential_1:"style_color_misuse.html"}},messages:{"en-US":{group:"Combine color and descriptive markup to convey information",Pass_0:"Rule Passed",Potential_1:"Verify color is not used as the only visual means of conveying information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var r=e.dom.node,s=r.nodeName.toLowerCase(),u="";if("style"===s){u=a.CommonUtil.getInnerText(r).toLowerCase();for(var d=0;d<r.ownerDocument.styleSheets.length;d++)if((_=r.ownerDocument.styleSheets[d])&&_.ownerNode===r)try{for(var c=_.cssRules?_.cssRules:_.rules,m=0;m<c.length;m++){var p=c[m],h=void 0;if(p.type&&3===p.type&&(h=p).styleSheet)for(var g=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules,b=0;b<g.length;b++)u+=g[b].cssText}}catch(e){}}else if(r.hasAttribute("style"))u=r.getAttribute("style").toLowerCase();else if("link"===s&&r.hasAttribute("rel")&&"stylesheet"===r.getAttribute("rel").toLowerCase()&&r.hasAttribute("href")&&0!==r.getAttribute("href").trim().length)for(d=0;d<r.ownerDocument.styleSheets.length;d++){var _;if((_=r.ownerDocument.styleSheets[d])&&_.ownerNode===r)try{var f=_.cssRules?_.cssRules:_.rules;for(b=0;b<f.length;b++)u+=f[b].cssText}catch(e){}}var v=!0,A=u.match(/\bbackground\b/i),w=u.replace(/-color/g,"").match(/\bcolor\b/i);if(r.hasAttribute("color")||w||A){var y={em:"",strong:"",cite:"",dfn:"",code:"",samp:"",kbd:"",var:"",abbr:"",acronym:""};if(!(v=s in y||null!==a.CommonUtil.getAncestor(r,y))&&r.hasChildNodes())for(var C=new l.DOMWalker(r);!v&&C.nextNode()&&C.node!==r;)v=C.node.nodeName.toLowerCase()in y}return v||(v=o.CacheUtil.getCache(r.ownerDocument,"style_color_misuse",!1),o.CacheUtil.setCache(r.ownerDocument,"style_color_misuse",!0)),v?(0,n.RulePass)("Pass_0"):v?void 0:(0,n.RulePotential)("Potential_1")}}},8064(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_focus_visible=void 0;var a=i(7139),n=i(461),r=i(461),l=i(4919),o=i(3883);t.style_focus_visible={id:"style_focus_visible",context:"dom:*",refactor:{RPT_Style_HinderFocus1:{Potential_1:"potential_focus_not_visible"}},help:{"en-US":{group:"style_focus_visible.html",potential_focus_not_visible:"style_focus_visible.html",pass_focus_visible:"style_focus_visible.html"}},messages:{"en-US":{group:"The keyboard focus indicator should be visible when default border or outline is modified by CSS",potential_focus_not_visible:"Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'",pass_focus_visible:"The keyboard focus indicator is visible or is not changed from the browser default"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.7",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r={skipNodes:{value:["table"],type:"[string]"},checkParams:{value:["border","border-width","border-style","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","outline","outline-width","outline-color","outline-style"],type:"[string]"}},s=e.dom.node;if(!a.CommonUtil.isTabbable(s)||r.skipNodes.value.includes(s.nodeName.toLowerCase()))return null;var u=l.CSSUtil.getDefinedStylesMultiple(s,null,["",":focus",":focus-visible",":focus-within"]),d=u[""],c=[];c.push(u[":focus"]),c.push(u[":focus-visible"]),c.push(u[":focus-within"]);var m=c[0];if(Object.keys(m).length>0){if(!((d["outline-width"]||d["outline-style"])&&"0px"!==d["outline-width"]&&"none"!==d["outline-style"]||m["outline-style"]&&"none"===m["outline-style"]))return(0,n.RulePass)("pass_focus_visible");var p=!1,h=0;for(var g in m)if(r.checkParams.value.includes(g)){var b=m[g],_=d[g];if(g.includes("style")){if(p="none"===b,_&&"none"!==b&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("width")){if(h++,"initial"===b?b="2px":"thin"===b?b="1px":"medium"===b?b="2px":"thick"===b&&(b="3px"),_&&("initial"===_?_="2px":"thin"===_?_="1px":"medium"===_?_="2px":"thick"===_&&(_="3px")),b=l.CSSUtil.getPixelsFromStyle(b,s),_=l.CSSUtil.getPixelsFromStyle(_,s),0==b||b<=_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("color")){h++;var f=o.ColorUtil.ColorCombo(s);if(null===f)continue;var v=f.bg;if(!v)continue;if("initial"===b&&(b="black"),_&&"initial"===_&&(_="black"),b=o.ColorUtil.Color(b),_=o.ColorUtil.Color(_),null===b||null===_)continue;var A=b.contrastRatio(v),w=_.contrastRatio(v);if(A<3||A<=w)return(0,n.RulePotential)("potential_focus_not_visible")}else if(h++,null!=_&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}if(p&&0===h)return(0,n.RulePotential)("potential_focus_not_visible")}else for(var y in d)if(r.checkParams.value.includes(y)&&"none"!==(_=d[y]))return(0,n.RulePotential)("potential_focus_not_visible");return(0,n.RulePass)("pass_focus_visible")}}},7942(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_highcontrast_visible=void 0;var a=i(461),n=i(461),r=i(4566);t.style_highcontrast_visible={id:"style_highcontrast_visible",context:"dom:style, dom:link, dom:*[style]",refactor:{RPT_Style_Trigger2:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"style_highcontrast_visible.html",Manual_1:"style_highcontrast_visible.html",group:"style_highcontrast_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content",group:"Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.nodeName.toLowerCase();if("link"===l&&(!n.hasAttribute("rel")||"stylesheet"!==n.getAttribute("rel").toLowerCase()))return(0,a.RulePass)("Pass_0");if("style"!==l&&"link"!==l&&n.hasAttribute("style")&&0===n.getAttribute("style").trim().length)return(0,a.RulePass)("Pass_0");var o=r.CacheUtil.getCache(n.ownerDocument,"style_highcontrast_visible",!1);return r.CacheUtil.setCache(n.ownerDocument,"style_highcontrast_visible",!0),o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RuleManual)("Manual_1")}}},2219(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_hover_persistent=void 0;var a=i(461),n=i(461),r=i(7139);t.style_hover_persistent={id:"style_hover_persistent",context:"dom:style, dom:*[style], dom:*",help:{"en-US":{Pass_0:"style_hover_persistent.html",Pass_2:"style_hover_persistent.html",Potential_1:"style_hover_persistent.html",Potential_2:"style_hover_persistent.html",Potential_3:"style_hover_persistent.html",group:"style_hover_persistent.html"}},messages:{"en-US":{Pass_0:"the hover: pseudo-class is not used to display content",Pass_2:"content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element",Potential_1:"Confirm the pointer can be positioned over the displayed element, not just the trigger",Potential_2:"Confirm the pointer can be positioned over all the information displayed on hover",Potential_3:"Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger",group:"The pointer should be able to move over content displayed on hover"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["1.4.13"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!1,l=!1,o=!1,s=e.dom.node;if("style"===s.nodeName.toLowerCase()){r.CommonUtil.getInnerText(s).toLowerCase();for(var u=0;u<s.ownerDocument.styleSheets.length;++u){var d=s.ownerDocument.styleSheets[u];if(d&&d.ownerNode===s)try{for(var c=d.cssRules?d.cssRules:d.rules,m=0;m<c.length;m++){var p="",h=!1,g=!1,b="",_=!1,f=!1,v=!1,A=(c[m],c[m].cssText);if(A.match(/:hover/g)){p=A.split(":")[0];var w=A.substring(A.indexOf("+")+1);if(w=w.trim(),(A.match(/:hover \+/g)||A.match(/:hover\+/g))&&(h=!0,b=w.split(" ")[0]),A.match(/:hover \~/g)||A.match(/:hover\~/g)){g=!0;var y=A.substring(A.indexOf("~")+1);b=(y=y.trim()).split(" ")[0]}if(!h&&!g)return(0,a.RulePass)("Pass_0");if(b&&(I=w.indexOf("display:"))&&"none;"!==w.slice(I+8).trim().split(" ")[0]&&d&&d.ownerNode===s)try{for(var C=d.cssRules?d.cssRules:d.rules,k=0;k<C.length;k++){var R=c[k].cssText,x=b+" {",P=R.trim(),T=P.indexOf(x);if(P.slice(T).trim(),P.match(/margin/g)){if(!o)return o=!0,(0,a.RulePotential)("Potential_3")}else{var U=R.split(":")[0];if((U=U.split(" ")[0])===b&&R.match(/:hover/g)){var I;if(_=!0,I=R.indexOf("display:"))if(f=!0,"none;"!==w.slice(I+8).trim().split(" ")[0]){if(v=!0,""!==p&&h){var E=s.ownerDocument.getElementsByTagName(p.toUpperCase());if(b.toUpperCase()===E[0].nextElementSibling.tagName){n=!0;continue}}else if(h){if(!l){l=!0;break}continue}if(""!==p&&g){E=s.ownerDocument.getElementsByTagName(p.toUpperCase());var N=[],L=E[0].nextElementSibling;do{if(L.tagName!==b.toUpperCase())break;N.push(L)}while(L=L.nextElementSibling);var S=N.length;if(1===S)return(0,a.RulePass)("Pass_2");if(S>1)return(0,a.RulePotential)("Potential_2")}}else{if(h){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}}else{if(h){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}}}else{if(h){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_2");continue}}}}}catch(e){}}}}catch(e){}}}return n?(0,a.RulePass)("Pass_0"):l?(0,a.RulePotential)("Potential_1"):o?(0,a.RulePotential)("Potential_3"):void 0}}},1473(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_viewport_resizable=void 0;var a=i(461),n=i(461);t.style_viewport_resizable={id:"style_viewport_resizable",context:"dom:link, dom:style, dom:*[style]",refactor:{WCAG21_Style_Viewport:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_viewport_resizable.html",Pass_0:"style_viewport_resizable.html",Potential_1:"style_viewport_resizable.html"}},messages:{"en-US":{group:"Text must scale up to 200% without loss of content or functionality",Pass_0:"Rule Passed",Potential_1:"Verify that text sized using viewport units can be resized up to 200%"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.4.4","1.4.10"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!0,l=/\d+(vw|vh|vmin|vmax)/gi,o=n.nodeName.toLowerCase();if("style"===o){for(var s=0;s<n.ownerDocument.styleSheets.length;s++)if((_=n.ownerDocument.styleSheets[s]).ownerNode===n)try{var u=_.cssRules?_.cssRules:_.rules;if(u)for(var d=0;r&&d<u.length;d++){var c=u[d];if(c.type&&1===c.type){var m=c;if(m.style.fontSize){var p=(v=m.style.fontSize.trim()).match(l);v.length&&p&&(r=!1)}}else if(c.type&&3===c.type&&c.styleSheet){var h=c;if(f=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules)for(var g=0;r&&g<f.length;g++){var b=f[g];b.type&&1===b.type&&b.style.fontSize&&(p=(v=b.style.fontSize.trim()).match(l),v.length&&p&&(r=!1))}}}}catch(e){}}else if("link"===o)for(s=0;s<n.ownerDocument.styleSheets.length;s++){var _;if((_=n.ownerDocument.styleSheets[s])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(g=0;r&&g<f.length;g++){var v,A=f[g];if(A.type&&1===A.type&&A.style.fontSize)p=(v=A.style.fontSize.trim()).match(l),v.length&&p&&(r=!1)}}catch(e){}}else{var w=n.getAttribute("style");w&&(p=w.match(/font-size:\s*\d+(vw|vh|vmin|vmax)/gi))&&(r=!1)}return r?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},1912(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.svg_graphics_labelled=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.svg_graphics_labelled={id:"svg_graphics_labelled",context:"dom:svg",help:{"en-US":{group:"svg_graphics_labelled.html",pass:"svg_graphics_labelled.html",fail_acc_name:"svg_graphics_labelled.html"}},messages:{"en-US":{group:"A non-decorative SVG element must have an accessible name",pass:"The SVG element has an accessible name",fail_acc_name:"The SVG element has no accessible name"}},rulesets:[{id:["IBM_Accessibility","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"7d6734":{pass:"pass",fail_acc_name:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n)||l.VisUtil.isNodePresentational(n)||r.AccNameUtil.isAccessibleNameIgnorable(n))return null;var o=r.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},6539(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_aria_descendants=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.table_aria_descendants={id:"table_aria_descendants",context:"aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]",help:{"en-US":{group:"table_aria_descendants.html",explicit_role:"table_aria_descendants.html"}},messages:{"en-US":{group:"Table structure elements cannot specify an explicit 'role' within table containers",explicit_role:"An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CommonUtil.isTableDescendant(i);if(null!==o&&0!==o.length){var s=r.AriaUtil.getImplicitRole(n),u=r.AriaUtil.getRoles(n,!1);if(!(s&&s.length>0&&u&&u.length>0&&u.some(function(e){return s.includes(e)})))return(0,a.RuleFail)("explicit_role",[e.dom.node.nodeName.toLowerCase(),o[0].role])}}}},4(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_empty=void 0;var a=i(461),n=i(461),r=i(7139);t.table_caption_empty={id:"table_caption_empty",context:"dom:caption",refactor:{Valerie_Caption_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_empty.html",Fail_1:"table_caption_empty.html",group:"table_caption_empty.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <table> element has an empty <caption> element",group:"A <caption> element for a <table> element must contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5334(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_nested=void 0;var a=i(461),n=i(461),r=i(7139);t.table_caption_nested={id:"table_caption_nested",context:"dom:caption",refactor:{Valerie_Caption_InTable:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_nested.html",Fail_1:"table_caption_nested.html",group:"table_caption_nested.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<caption> element is not nested inside a <table> element",group:"The <caption> element must be nested inside the associated <table> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return null!=r.CommonUtil.getAncestor(n,"table")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_exists=void 0;var a=i(461),n=i(461),r=i(9196);t.table_headers_exists={id:"table_headers_exists",context:"dom:table",refactor:{RPT_Table_DataHeadingsAria:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_exists.html",Fail_1:"table_headers_exists.html",group:"table_headers_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Table has no headers identified",group:"Data table must identify headers"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.rows;if(!r.TableUtil.isDataTable(n)||null===l||0===l.length)return null;var o=r.TableUtil.tableHeaderExists(n);return null!==o?o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):void 0}}},8349(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_ref_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(1686),s=i(3946),u=i(9955);t.table_headers_ref_valid={id:"table_headers_ref_valid",context:"dom:td[headers], dom:th[headers]",help:{"en-US":{Pass_0:"table_headers_ref_valid.html",Fail_1:"table_headers_ref_valid.html",Fail_2:"table_headers_ref_valid.html",Fail_3:"table_headers_ref_valid.html",Fail_4:"table_headers_ref_valid.html",group:"table_headers_ref_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document",Fail_2:"The 'headers' attribute value \"{0}\" refers to itself",Fail_3:"The 'headers' attribute value \"{0}\" does not refer to a cell in the same table",Fail_4:'The \'headers\' attribute value "{0}" does not refer to a cell indicated with <th> or a role of "columnheader" or "rowheader"',group:"The 'headers' attribute should refer to a valid cell in the same table"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["a25f45"],run:function(e,t,i){var n=e.dom.node,d=l.CommonUtil.getAncestor(n,"table"),c=u.ARIAMapper.nodeToRole(d);if(null==d||!s.VisUtil.isNodeVisible(d)||!["table","grid"].includes(c))return null;n.nodeName.toLowerCase();var m=n.ownerDocument,p=n.getAttribute("headers");if(!p)return null;for(var h=p.split(" "),g=[],b=[],_=[],f=[],v=0;v<h.length;v++){var A=h[v];if(""!==A.trim()){var w=m.getElementById(A);if(w)if(o.DOMUtil.sameNode(w,n))b.push(A);else if(o.DOMUtil.isInSameTable(w,n)){if("th"!==w.nodeName.toLowerCase()){var y=r.AriaUtil.getRoles(w,!0);y.includes("columnheader")||y.includes("rowheader")||f.push(A)}}else _.push(A);else g.push(A)}}var C=[];return 0!=g.length&&C.push((0,a.RuleFail)("Fail_1",[g.toString()])),0!=b.length&&C.push((0,a.RuleFail)("Fail_2",[b.toString()])),0!=_.length&&C.push((0,a.RuleFail)("Fail_3",[_.toString()])),0!=f.length&&C.push((0,a.RuleFail)("Fail_4",[f.toString()])),0==C.length?(0,a.RulePass)("Pass_0"):C}}},8142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_related=void 0;var a=i(461),n=i(461),r=i(7139),l=i(4566),o=i(9196);t.table_headers_related={id:"table_headers_related",context:"dom:td, dom:th",refactor:{Valerie_Table_DataCellRelationships:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_related.html",Fail_1:"table_headers_related.html",group:"table_headers_related.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Complex table does not have headers for each cell properly defined with 'header' or 'scope'",group:"For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.CommonUtil.getAncestor(n,"table");if(null==s||!o.TableUtil.isComplexDataTable(s))return null;if(null===l.CacheUtil.getCache(n,"table_headers_related",null)){for(var u=[],d=0;d<s.rows.length;++d){var c=s.rows[d];u[d]||(u[d]=[]);for(var m=0;m<c.cells.length;++m){var p=c.cells[m];l.CacheUtil.setCache(p,"table_headers_related",d+":"+m);var h=parseInt(p.getAttribute("colspan"));h||(h=1);var g=parseInt(p.getAttribute("rowspan"));g||(g=1);for(var b=0;u[d][b];)b+=1;for(var _=0;_<g;++_){u[d+_]||(u[d+_]=[]);for(var f=0;f<h;++f)u[d+_][b+f]=p}}}var v=n.ownerDocument,A={},w={};for(d=0;d<u.length;++d){var y=!1;for(m=0;m<u[d].length;++m){var C=u[d][m],k=C.nodeName.toLowerCase();if("th"==k){if("row"==C.getAttribute("scope")?(y=!0,r.CommonUtil.attributeNonEmpty(C,"axis")||(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0)):"rowgroup"==C.getAttribute("scope")?r.CommonUtil.attributeNonEmpty(C,"axis")||(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0):"col"==C.getAttribute("scope")&&(w[m]=!0,r.CommonUtil.attributeNonEmpty(C,"axis")||(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0)),r.CommonUtil.attributeNonEmpty(C,"headers")){var R=C.getAttribute("headers").split(" ");for(_=0;_<R.length;++_)(x=v.getElementById(R[_].trim()))&&r.CommonUtil.getAncestor(x,"table")==s&&(A[l.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}else if("td"==k)if(y||w[m])A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0;else if(r.CommonUtil.attributeNonEmpty(C,"headers"))for(R=C.getAttribute("headers").split(" "),_=0;_<R.length;++_){var x;(x=v.getElementById(R[_].trim()))&&r.CommonUtil.getAncestor(x,"table")==s&&(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0,A[l.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}}l.CacheUtil.setCache(s,"table_headers_related",A)}var P=l.CacheUtil.getCache(n,"table_headers_related",null),T=l.CacheUtil.getCache(s,"table_headers_related",null),U=P&&T&&P in T;return U||"0:0"!==P||0!=r.CommonUtil.getInnerText(n).trim().length?(U||0!=s.getElementsByTagName("th").length||(!0===l.CacheUtil.getCache(s,"table_headers_related_TrigOnce",!1)?U=!0:l.CacheUtil.setCache(s,"table_headers_related_TrigOnce",!0)),U?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")):null}}},3980(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_layout_linearized=void 0;var a=i(461),n=i(461),r=i(3946),l=i(9196);t.table_layout_linearized={id:"table_layout_linearized",context:"dom:table",refactor:{RPT_Table_LayoutTrigger:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"table_layout_linearized.html",Potential_1:"table_layout_linearized.html",group:"table_layout_linearized.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify table is not being used to format text content in columns unless the table can be linearized",group:"Avoid using tables to format text documents in columns unless the table can be linearized"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=!l.TableUtil.isLayoutTable(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},4701(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_scope_valid=void 0;var a=i(461),n=i(461);t.table_scope_valid={id:"table_scope_valid",context:"dom:td[scope], dom:th[scope]",refactor:{WCAG20_Table_Scope_Valid:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"table_scope_valid.html",Fail_1:"table_scope_valid.html",Fail_2:"table_scope_valid.html",group:"table_scope_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Value provided is invalid for the 'scope' attribute",Fail_2:"The 'scope' attribute should only be used on a <th> element",group:'Value for \'scope\' attribute must be "row", "col", "rowgroup", or "colgroup"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("td"===n.nodeName.toLowerCase())return(0,a.RuleFail)("Fail_2");var r=n.getAttribute("scope").trim().toLowerCase();return/^(row|col|rowgroup|colgroup)$/.test(r)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},18(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_structure_misuse=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=i(9196);t.table_structure_misuse={id:"table_structure_misuse",context:"dom:table",refactor:{WCAG20_Table_Structure:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_structure_misuse.html",Fail_1:"table_structure_misuse.html",group:"table_structure_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The <{0}> element with "presentation" role or "none" role has structural element(s) and/or attribute(s) \'{1}\'',group:'Table elements with \'role="presentation" or \'role="none" should not have structural elements or attributes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;if(s.TableUtil.isDataTable(n))return null;if(r.AriaUtil.isNodeInGrid(n))return null;var u=[];l.CommonUtil.attributeNonEmpty(n,"summary")&&u.push(n);for(var d=n.getElementsByTagName("caption"),c=0;c<d.length;++c)if(l.CommonUtil.getAncestor(d[c],"table")==n){if(l.CommonUtil.shouldNodeBeSkippedHidden(d[c]))continue;u.push(d[c]);break}var m=n.getElementsByTagName("th");for(c=0;c<m.length;++c)if(l.CommonUtil.getAncestor(m[c],"table")==n){if(l.CommonUtil.shouldNodeBeSkippedHidden(m[c]))continue;u.push(m[c]);break}var p=n.getElementsByTagName("td");for(c=0;c<p.length;++c)if((p[c].hasAttribute("scope")||p[c].hasAttribute("headers"))&&l.CommonUtil.getAncestor(p[c],"table")==n){if(l.CommonUtil.shouldNodeBeSkippedHidden(p[c]))continue;u.push(p[c]);break}var h=n.nodeName.toLowerCase(),g=new Array,b={};for(c=0;c<u.length;c++){var _=u[c].nodeName.toLowerCase();b.hasOwnProperty(_)||("table"!=_||b.hasOwnProperty.summary?(b[_]=!0,g.push(_)):(b.summary=!0,g.push("summary")))}var f=g.join(", ");return 0==u.length?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[h,f])}}},9314(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_summary_redundant=void 0;var a=i(461),n=i(461),r=i(7139),l=i(5279),o=i(1686);t.table_summary_redundant={id:"table_summary_redundant",context:"dom:table",refactor:{WCAG20_Table_CapSummRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_summary_redundant.html",Fail_1:"table_summary_redundant.html",group:"table_summary_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The table summary duplicates the caption",group:"The table summary must not duplicate the caption"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s=e.dom.node;if(s.hasAttribute("summary"))n=s.getAttribute("summary").trim().toLowerCase();else if(s.hasAttribute("aria-describedby")){for(var u=s.getAttribute("aria-describedby").split(" "),d="",c=0;c<u.length;c++){var m=u[c];if(m){var p=l.FragmentUtil.getById(s,m);p&&!o.DOMUtil.sameNode(p,s)&&(d+=" "+r.CommonUtil.getInnerText(p).trim().toLowerCase())}}n=d}if(!n)return null;var h=s.getElementsByTagName("caption");if(0===h.length)return null;if(n.length>0){var g=r.CommonUtil.getInnerText(h[0]).trim().toLowerCase();return n.includes(g)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0")}}}},1667(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.target_spacing_sufficient=void 0;var a=i(7139),n=i(461),r=i(461),l=i(7507),o=i(4919),s=i(4566);t.target_spacing_sufficient={id:"target_spacing_sufficient",context:"dom:*",dependencies:[],help:{"en-US":{group:"target_spacing_sufficient.html",pass_spacing:"target_spacing_sufficient.html",pass_sized:"target_spacing_sufficient.html",pass_inline:"target_spacing_sufficient.html",pass_default:"target_spacing_sufficient.html",violation_spacing:"target_spacing_sufficient.html",recommendation_inline:"target_spacing_sufficient.html",potential_overlap:"target_spacing_sufficient.html"}},messages:{"en-US":{group:"The target must be sufficiently sized or spaced from other targets",pass_spacing:"The target's spacing from other targets is sufficient",pass_sized:"The target’s size is more than 24 CSS pixels",pass_inline:"The target is in a sentence or its size is otherwise constrained by the line-height of non-target text",pass_default:"The target's size is determined by the user agent and is not modified by the author",violation_spacing:'Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"',recommendation_inline:'Confirm the inline target "{0}" is sufficiently spaced from another inline target "{1}"',potential_overlap:'Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE,reasonCodes:["pass_spacing","pass_sized","pass_inline","pass_default","violation_spacing","potential_overlap"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:r.eRulePolicy.RECOMMENDATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE,reasonCodes:["recommendation_inline"]}],act:[],run:function(e,t,i){var r=e.dom.node,u=r.nodeName.toLocaleLowerCase(),d=new l.DOMMapper,c=d.getUnadjustedBounds(r);if(!c)return null;if(!a.CommonUtil.isTarget(r))return null;if(c.height>=24&&c.width>=24)return(0,n.RulePass)("pass_sized");var m=o.CSSUtil.getInlineStatus(r);if(null===m)return null;if(m.inline)return m.text?null===m.violation?(0,n.RulePass)("pass_inline"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]):null===m.violation?(0,n.RulePass)("pass_default"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]);if(o.CSSUtil.isTargetBrowserDefault(r))return(0,n.RulePass)("pass_default");var p=r.ownerDocument;if(!p)return null;var h=getComputedStyle(r);if(null===h)return null;var g=h.zIndex;g&&!isNaN(Number(g))||(g="0");var b=s.CacheUtil.getCache(p.documentElement,"target_spacing_sufficient::targets",void 0);if(void 0===b){b=[];for(var _=p.querySelectorAll("body *:not(script):not(style)"),f=0;f<_.length;f++){var v=_[f];a.CommonUtil.isTarget(v)&&b.push(v)}s.CacheUtil.setCache(p.documentElement,"target_spacing_sufficient::targets",b)}if(b&&0!==b.length){var A=!0,w=24,y=24,C=null,k=null,R=[],x=function(e){var t=b[e],i=r.compareDocumentPosition(t);if(0===i||i&Node.DOCUMENT_POSITION_CONTAINED_BY)return A=!1,"continue";if(i&Node.DOCUMENT_POSITION_CONTAINS||R.some(function(e){return e.contains(t)}))return"continue";var a=d.getUnadjustedBounds(t);if(!a)return"continue";var l=getComputedStyle(t),o="0";if(l&&((o=l.zIndex)&&!isNaN(Number(o))||(o="0")),a.top<=c.top&&a.left<=c.left&&a.top+a.height>=c.top+c.height&&a.left+a.width>=c.left+c.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:null}:{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};if(c.top<=a.top&&c.left<=a.left&&c.top+c.height>=a.top+a.height&&c.left+c.width>=a.left+a.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])}:{value:(0,n.RuleFail)("violation_spacing",[u,t.nodeName.toLowerCase()])};if((c.top>=a.top&&c.top<=a.top+a.height||c.top+c.height<=a.top&&c.top+c.height>=a.top+a.height)&&(c.left>a.left&&c.left<a.left+a.width||a.left>c.left&&a.left<c.left+c.width)||(c.top>a.top&&c.top<a.top+a.height||a.top>c.top&&a.top<c.top+c.height)&&(c.left>=a.left&&c.left<=a.left+a.width||c.left+c.width>=a.left&&c.left+c.width<=a.left+a.width))return{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};var s=24,m=24;c.width<24&&(c.top>=a.top&&c.top<=a.top+a.height||c.top<=a.top&&c.top+c.height>a.top)&&(s=Math.min(Math.abs(c.left-a.left),Math.abs(c.left-(a.left+a.width)),Math.abs(c.left+c.width-(a.left+a.width)),Math.abs(c.left+c.width-a.left))),c.height<24&&(c.left>=a.left&&c.left<=a.left+a.width||c.left<=a.left&&c.left+c.width>a.left)&&(m=Math.min(Math.abs(c.top-a.top),Math.abs(c.top-(a.top+a.height)),Math.abs(c.top+c.height-(a.top+a.height)),Math.abs(c.top+c.height-a.top))),s<w&&(w=s,C=t),m<y&&(y=m,k=t),R.push(t)};for(f=0;f<b.length;f++){var P=x(f);if("object"==typeof P)return P.value}return Math.round(c.width/2)+w<12||Math.round(c.height/2)+y<12?Math.round(c.width/2)+w<Math.round(c.height/2)+y?(0,n.RuleFail)("violation_spacing",[u,C.nodeName.toLowerCase()]):(0,n.RuleFail)("violation_spacing",[u,k.nodeName.toLowerCase()]):(0,n.RulePass)("pass_spacing")}}}},9599(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_block_heading=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3864),s=i(4919),u=i(3946);t.text_block_heading={id:"text_block_heading",context:"dom:p, dom:div, dom:br",refactor:{RPT_Block_ShouldBeHeading:{Potential_1:"potential_heading"}},help:{"en-US":{potential_heading:"text_block_heading.html",group:"text_block_heading.html"}},messages:{"en-US":{potential_heading:"Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role",group:"Heading text should use a heading element or role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.isNodeDisabled(n)||!u.VisUtil.isNodeVisible(n))return null;if(null===l.CommonUtil.getAncestor(n,["body"])||null!==l.CommonUtil.getAncestor(n,["script"]))return null;var d=0,c=n.ownerDocument.getElementsByTagName("body");if(null!=c){var m=getComputedStyle(c[0]);m&&(d=s.CSSUtil.getPixelsFromStyle(m["font-size"],c))}var p=0,h=[],g=new o.DOMWalker(n);g.nextNode();for(var b=!1;!b&&g.nextNode()&&g.node!==n&&g.node!==o.DOMWalker.parentNode(n)&&!["br","div","p"].includes(g.node.nodeName.toLowerCase());)if(g.node!==n&&!l.CommonUtil.shouldNodeBeSkippedHidden(g.node)){var _=g.node.nodeName.toLowerCase();if(3===g.node.nodeType){if(g.node.nodeValue.trim().length>0&&g.node.parentElement){var f=getComputedStyle(g.node.parentElement);if(f&&("bold"===f["font-weight"]||f["font-weight"]>=700||f["font-size"]&&f["font-size"].includes("large")||f["font-size"]&&0!==d&&s.CSSUtil.getPixelsFromStyle(f["font-size"],g.node.parentElement)>d)){var v=g.node.nodeValue.trim();(A=l.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else b=!0}}else if(1===g.node.nodeType)if("b"===_||"strong"===_||"u"===_||"font"===_){var A;v=l.CommonUtil.getInnerText(g.node),(A=l.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else{var w=r.AriaUtil.getResolvedRole(g.node);b=null!==w&&"generic"!==w&&"paragraph"!==w&&"strong"!==w||"applet"===_}}return 0==p&&(b=!0),b||(b=/[:,;\-\.]$/.test(h.join(" ").trim())),b?null:(0,a.RulePotential)("potential_heading",[h.join(" ")])}}},4672(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_contrast_sufficient=void 0;var a=i(7139),n=i(3946),r=i(3883),l=i(461),o=i(461),s=i(4919);t.text_contrast_sufficient={id:"text_contrast_sufficient",context:"dom:*",refactor:{IBMA_Color_Contrast_WCAG2AA:{Pass_0:"pass",Fail_1:"fail_contrast",Potential_1:"potential_same_color"},IBMA_Color_Contrast_WCAG2AA_PV:{pass_0:"pass",potential_1:"potential_graphic_background"}},help:{"en-US":{group:"text_contrast_sufficient.html",pass:"text_contrast_sufficient.html",fail_contrast:"text_contrast_sufficient.html",potential_same_color:"text_contrast_sufficient.html",potential_graphic_background:"text_contrast_sufficient.html",potential_text_shadow:"text_contrast_sufficient.html"}},messages:{"en-US":{group:"The contrast ratio of text with its background must meet WCAG AA requirements",pass:"The contrast ratio of text with its background meets WCAG AA requirements",fail_contrast:"Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_same_color:"The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast",potential_graphic_background:"Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_text_shadow:"Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.3",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:["afw4f7"],run:function(e,t,i){var o=e.dom.node,u=o.nodeName.toLowerCase();if(!n.VisUtil.isNodeVisible(o)||null!=n.VisUtil.hiddenByDefaultElements&&null!=n.VisUtil.hiddenByDefaultElements&&n.VisUtil.hiddenByDefaultElements.indexOf(u)>-1)return null;if(a.CommonUtil.isNodeDisabled(o))return null;if(a.CommonUtil.getAncestor(o,["svg","script","meta","style"]))return null;var d=o.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=a.CommonUtil.getNodeText(o);if(!a.CommonUtil.isShadowHostElement(o)||a.CommonUtil.isShadowHostElement(o)&&""===a.CommonUtil.getNodeText(o.shadowRoot)){if(0==m.trim().length)return null;if(0===(m=m.trim().replace(/[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g,"")).trim().length)return null}var p=o;if(a.CommonUtil.isShadowHostElement(o)){if(o.shadowRoot)for(var h=o.firstChild;h;h=h.nextSibling)if(3==h.nodeType){p=h.assignedSlot;break}if(null===p)return}var g=c.getComputedStyle(p);if(!1==("0"!==g.width&&"0"!==g.height&&"0"!==g.opacity&&"none"!==g.display&&"hidden"!==g.visibility&&"hidden"!==g.overflow&&("auto"===g.left||"absolute"===g.position&&parseInt(g.left.replace(/[^0-9.+-]/,""))>0)&&("auto"===g.left||"absolute"===g.position&&parseInt(g.top.replace(/[^0-9.+-]/,""))>0)))return null;var b=-1;if("auto"!==g.clip){var _=g.clip.toString();if(_.includes("rect"))for(var f=[],v=/\((.*)\)/g.exec(_)[1].split(", "),A=0;A<v.length;A++)f.push(v[A]);b=parseInt(f[0].replace(/px/g,""))-parseInt(f[2].replace(/px/g,"")),b=Math.abs(b)}if("absolute"===g.position&&b<7&&-1!==b)return null;var w=r.ColorUtil.ColorCombo(p);if(null!==w){var y=w.fg,C=w.bg,k=y.contrastRatio(C),R=s.CSSUtil.getWeightNumber(g.fontWeight),x=s.CSSUtil.getFontInPixels(g.fontSize,p),P=x>=24||x>=18.6&&R>=700;s.CSSUtil.containsCKJ(m)&&(P=x>=29.3||x>=24&&R>=700);var T=k>=4.5||k>=3&&P,U=w.hasBGImage||w.hasGradient,I=w.textShadow,E=a.CommonUtil.isNodeDisabled(p);if(!E){var N=a.CommonUtil.getControlOfLabel(p);N&&(E=a.CommonUtil.isNodeDisabled(N))}return!E&&"label"===u&&a.CommonUtil.isDisabledByFirstChildFormElement(p)&&(E=!0),!E&&o.hasAttribute("id")&&a.CommonUtil.isDisabledByReferringElement(p)&&(E=!0),!T&&E&&(T=!0),T?(0,l.RulePass)("pass",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):U?(0,l.RulePotential)("potential_graphic_background",[k.toFixed(2),x,R]):I?(0,l.RulePotential)("potential_text_shadow",[k.toFixed(2),x,R]):y.toHex()===C.toHex()?(0,l.RulePotential)("potential_same_color",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):(0,l.RuleFail)("fail_contrast",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient])}console.log("unable to get color combo for element: "+p.nodeName)}}},4353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_quoted_correctly=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.text_quoted_correctly={id:"text_quoted_correctly",context:"dom:*",help:{"en-US":{Pass_0:"text_quoted_correctly.html",Potential_1:"text_quoted_correctly.html",group:"text_quoted_correctly.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}",group:"Quotations should be marked with <q> or <blockquote> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!l.VisUtil.isNodeVisible(n))return null;if(null===r.CommonUtil.getAncestor(n,["body"]))return null;for(var o=!0,s=n.firstChild,u=null,d=["blockquote","q","script","style","pre","code","ruby","samp"];o&&s;){if("#text"===s.nodeName){var c=s.nodeValue,m=(c=c.replace(/(\S)'(\S)/g,"$1$2")).match(/("[^"]+")/g),p=c.match(/('[^']+')/g);if((null!==m||null!==p)&&null===r.CommonUtil.getAncestor(s,d)){if(null!=m)for(var h=0;o&&h<m.length;++h)o=r.CommonUtil.wordCount(m[h])<3;if(null!=p)for(h=0;o&&h<p.length;++h)o=r.CommonUtil.wordCount(p[h])<3;u=null===m?p.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):null===p?m.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):m.concat(p).join(", ").replace(new RegExp("\\r?\\n|\\r","g"),"")}}s=s.nextSibling}return!o&&u.length&&u.length>69&&(u=u.substring(0,32)+" ... "+u.substring(u.length-32)),o?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1",[u])}}},7147(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_sensory_misuse=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(4566),s=i(3946);t.text_sensory_misuse={id:"text_sensory_misuse",context:"dom:body, dom:body dom:*",refactor:{RPT_Text_SensoryReference:{Potential_1:"potential_position, potential_other"}},help:{"en-US":{potential_position:"text_sensory_misuse.html",potential_other:"text_sensory_misuse.html",group:"text_sensory_misuse.html"}},messages:{"en-US":{potential_position:"Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position",potential_other:"Confirm the user instruction is still understandable without the word(s) '{0}'",group:"Instructions should be meaningful without relying solely on shape, size, or location words"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if(!s.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n)||s.VisUtil.hiddenByDefaultElements.includes(c))return null;if(null===l.CommonUtil.getAncestor(n,["body"]))return null;if(null!==l.CommonUtil.getAncestor(n,["script","a","label"]))return null;var m=r.AriaUtil.getResolvedRole(n);if(m){var p=r.AriaUtil.getRolesWithTypes(n,["landmark"]);if(p&&p.includes(m))return null}var h=r.AriaUtil.getRolesWithTypes(n,["widget","heading"]);if(l.CommonUtil.concatUniqueArrayItemList(["caption","cell","code","columnheader","definition","figure","list","listitem","math","meter","row","rowgroup","rowheader","term"],h),null!==r.AriaUtil.getAncestorWithRoles(n,h))return null;for(var g="",b="",_=n.firstChild,f="";_;){if("#text"===_.nodeName){var v=_.nodeValue.trim();v.length>0&&(f+=f.length>0?", "+v:v)}_=_.nextSibling}if(f.length>0){var A=function(e,t){if(!u[t])return"";var i=o.CacheUtil.getCache(e,t+"_sensory_misuse",null);if(null==i){for(var a=u[t].value,n="(ss+|"+a[0],r=1;r<a.length;++r){var l=a[r].trim().split(" ");if(n+="|"+l[0],l.length>1)for(var s=1;s<l.length;++s)n+=" +"+l[s]}n+=")",i=new RegExp(n,"gi"),o.CacheUtil.setCache(e,t+"_sensory_misuse",i)}return i}(n.ownerDocument,"exemptText");f=f.replace(A," "),g=d(n.ownerDocument,"positionText",f),b=d(n.ownerDocument,"otherText",f)}var w=[];return g&&w.push((0,a.RulePotential)("potential_position",[g])),b&&w.push((0,a.RulePotential)("potential_other",[b])),0==w.length?null:w}};var u={positionText:{value:["top-left","top-right","bottom-right","bottom-left","top-to-bottom","left-to-right","bottom-to-top","right-to-left","right","left","above","below","top","bottom","upper","lower","corner","beside"],type:"[string]"},otherText:{value:["round","square","shape","rectangle","triangle","size","large","small","medium","big","huge","tiny","extra","larger","smaller","bigger","little","largest","smallest","biggest"],type:"[string]"},exemptText:{value:["right-click","left-click","right-clicking","right-clicks","left-clicking","left-clicks","square root","right now","off the top"],type:"[string]"}};function d(e,t,i){if(!i)return"";var a=u[t].value,n={},r=[];return i.split(/\s+/).reduce(function(e,t){for(var i=t.replace(/[.?!:;()'",`\]]+$/,""),l=t.toLowerCase().replace(/[.?!:;()'",`\]]/g,""),o=0;o<a.length;o++){var s=l.indexOf(a[o]),u=a[o].length,d=l.charAt(u+s);if(!(s<0)){var c="."==d||"?"==d||"!"==d||":"==d||";"==d||"("==d||")"==d||"'"==d||'"'==d||","==d||".`"==d||"\\"==d||"]"==d,m=!1;if(s>0){var p=l.charAt(s-1);m="-"==p||"."==p||"?"==p||"!"==p||":"==p||";"==p||"("==p||")"==p||"'"==p||'"'==p||","==p||".`"==p||"\\"==p||"]"==p}l.length!=u&&1!=c&&1!=m||(n.hasOwnProperty(i)||(n[i]=!0,r.push(i)),o=a.length)}}return e[i]=(e[i]||0)+1,e},Object.create(null)),r.join(", ")}},1419(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_spacing_valid=void 0;var a=i(461),n=i(7139),r=i(3946),l=i(4919),o=i(7507),s=/(-?[\d.]+)([a-z%]*)/;function u(e,t,i){var a;if(i.startsWith("inherit")||i.startsWith("unset")){var n=l.CSSUtil.getAncestorWithStyles(e.parentElement,((a={})[t]=["*"],a),["inherit","unset"]);if(null!==n)return l.CSSUtil.getDefinedStyles(n,[t])[t];if(i.startsWith("unset"))return"initial"}return i}function d(e,t,i,a,n,r){if(void 0===r&&(r=!1),"important"!==e.style.getPropertyPriority(t))return!0;var o=function(e){return e.substring(0,e.length-11)}(i);if("initial"===o||"normal"===o)return!1;var u=parseFloat(o);if(isNaN(u))return!0;var d=o.trim().match(s);if(!d)return!0;var c=d[1],m=d[2];if(""===m){if(r)return!(parseFloat(c)<n);if(0===parseFloat(c))return null}if(""===m&&0!==parseFloat(c))return null;var p=l.CSSUtil.convertValue2Pixels(m,c,e);return!(null!==p&&p/a<n)}t.text_spacing_valid={id:"text_spacing_valid",context:"dom:*",help:{"en-US":{pass:"text_spacing_valid.html",group:"text_spacing_valid.html",fail_letter_spacing_style:"text_spacing_valid.html",fail_word_spacing_style:"text_spacing_valid.html",fail_line_height_style:"text_spacing_valid.html"}},messages:{"en-US":{pass:"CSS !important is not used in inline style to control letter or word spacing or line height",group:"CSS !important should not be used in inline style to control letter or word spacing or line height",fail_letter_spacing_style:"CSS !important should not be used in inline ‘letter-spacing’ style",fail_word_spacing_style:"CSS !important should not be used in inline ‘word-spacing’ style",fail_line_height_style:"CSS !important should not be used in inline ‘line-height’ style"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.12"],level:a.eRulePolicy.VIOLATION,toolkitLevel:a.eToolkitLevel.LEVEL_THREE}],act:["9e45ec","24afc2","78fd32"],run:function(e,t,i){for(var c=e.dom.node,m="",p=c.childNodes,h=0;h<p.length;++h)3===p[h].nodeType&&(m+=p[h].nodeValue);if(0===m.trim().length)return null;if(r.VisUtil.isNodeHiddenFromAT(c)||n.CommonUtil.isNodeDisabled(c))return null;var g=(new o.DOMMapper).getUnadjustedBounds(c);if(!g||g.top<0||g.left<0)return null;if(n.CommonUtil.getAncestor(c,"svg"))return null;var b=getComputedStyle(c),_=parseFloat(b.getPropertyValue("font-size")),f=b.getPropertyValue("word-spacing"),v=b.getPropertyValue("letter-spacing"),A=b.getPropertyValue("line-height"),w=!0,y=!0,C=!0;if(f){var k=parseFloat(f);if(!isNaN(k)){var R=l.CSSUtil.convertValue2Pixels("px",k.toString(),c);null!==R&&R/_<.16&&(w=!1)}}if(v){var x=parseFloat(v);if(!isNaN(x)){var P=l.CSSUtil.convertValue2Pixels("px",x.toString(),c);null!==P&&P/_<.12&&(y=!1)}}if(A){var T=parseFloat(A);if(!isNaN(T)){var U=A.match(s);if(U){var I=U[1],E=U[2];""!==E&&"px"!==E||(""===E?parseFloat(I):parseFloat(I)/_)<1.5&&(C=!1)}}}if(w&&y&&C)return null;var N=l.CSSUtil.getDefinedStyles(c,["word-spacing","letter-spacing","line-height"]);if(0===Object.keys(N).length)return null;var L=[],S=N["word-spacing"];if(S){var O=d(c,"word-spacing",S=u(c,"word-spacing",S),_,.16);L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_word_spacing_style"))}var q=N["letter-spacing"];q&&(O=d(c,"letter-spacing",q=u(c,"letter-spacing",q),_,.12),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_letter_spacing_style")));var M=N["line-height"];return M&&null===l.CSSUtil.getAncestorWithStyles(c,{overflow:["auto","scroll"],"overflow-x":["auto","scroll"],"overflow-y":["auto","scroll"]})&&(O=d(c,"line-height",M=u(c,"line-height",M),_,1.5,!0),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_line_height_style"))),L.length>0?L:null}}},855(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_whitespace_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.text_whitespace_valid={id:"text_whitespace_valid",context:"dom:*",help:{"en-US":{pass:"text_whitespace_valid.html",potential_text:"text_whitespace_valid.html",group:"text_whitespace_valid.html"}},messages:{"en-US":{pass:"Rule Passed",potential_text:"Space characters should not be used to create space between the letters of a word",group:"Space characters should not be used to control spacing within a word"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getAncestor(n,["body","script","code"]);if(null==l||"body"!=l.nodeName.toLowerCase())return null;for(var o=!0,s=n.firstChild;o&&s;){if("#text"==s.nodeName){var u=s.nodeValue;o=!/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(u)}s=s.nextSibling}return o?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_text")}}},3420(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9955),s=i(3864),u=i(3946);t.widget_tabbable_exists={id:"widget_tabbable_exists",context:"aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton",refactor:{IBMA_Focus_Tabbable:{pass:"pass",fail_no_tabbable:"fail_no_tabbable"}},help:{"en-US":{pass:"widget_tabbable_exists.html",fail_no_tabbable:"widget_tabbable_exists.html",group:"widget_tabbable_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_no_tabbable:'Component with "{0}" role does not have a tabbable element',group:"Component must have at least one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!u.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)&&!r.AriaUtil.shouldBePresentationalChild(n)){if("datalist"===n.nodeName.toLowerCase())return null;for(var d=0,c=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"];d<c.length;d++){var m=c[d];if(null!=r.AriaUtil.getAncestorWithRole(n,m,!0))return null}var p=o.ARIAMapper.nodeToRole(n),h=0;if(l.CommonUtil.isTabbable(n)&&++h,h<1&&!r.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var g=new s.DOMWalker(n);h<1&&g.nextNode()&&g.node!=n;)1==g.node.nodeType&&!g.bEndTag&&l.CommonUtil.isTabbable(g.node)&&++h;return h>=1?(0,a.RulePass)("pass"):(0,a.RulePotential)("fail_no_tabbable",[p])}}}},408(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_single=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7011),o=i(7139),s=i(9955),u=i(4566),d=i(3946);t.widget_tabbable_single={id:"widget_tabbable_single",context:"aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab",refactor:{IBMA_Focus_MultiTab:{pass:"pass",potential_multiple_tabbable:"potential_multiple_tabbable"}},help:{"en-US":{pass:"widget_tabbable_single.html",potential_multiple_tabbable:"widget_tabbable_single.html",group:"widget_tabbable_single.html"}},messages:{"en-US":{pass:"Components with a widget role should have no more than one tabbable element",potential_multiple_tabbable:'Component with "{0}" role has more than one tabbable element',group:"Components with a widget role must have no more than one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!d.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)&&!l.AriaUtil.shouldBePresentationalChild(n)){var c=s.ARIAMapper.nodeToRole(n),m=0;if(o.CommonUtil.isTabbable(n)&&++m,m<2&&!l.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var p=new r.DOMWalker(n);m<2&&p.nextNode()&&p.node!=n;)1==p.node.nodeType&&!p.bEndTag&&o.CommonUtil.isTabbable(p.node)&&++m;var h=m<2;return h||u.CacheUtil.setCache(n,"widget_tabbable_single","potential_multiple_tabbable"),h?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_multiple_tabbable",[c])}}}},6160(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.a11yRulesets=void 0;var l=r(i(8855)),o=i(8601),s=[];for(var u in l)s.push(l[u]);var d={"1.1.1":"All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.","1.2.1":"For prerecorded audio-only or video-only media, an alternative provides equivalent information.","1.2.2":"Captions are provided for all prerecorded audio content in synchronized media.","1.2.3":"An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.","1.2.4":"Captions are provided for all live audio content in synchronized media.","1.2.5":"Audio description is provided for all prerecorded video content in synchronized media.","1.3.1":"Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.","1.3.2":"When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.","1.3.3":"Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.","1.3.4":"Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.","1.3.5":"The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.","1.4.1":"Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.","1.4.2":"If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.","1.4.3":"The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.","1.4.4":"Text can be resized without assistive technology up to 200 percent without loss of content or functionality.","1.4.5":"If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.","1.4.10":"Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.","1.4.11":"The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.","1.4.12":"No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.","1.4.13":"Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.","2.1.1":"All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.","2.1.2":"If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.","2.1.4":"If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.","2.2.1":"For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.","2.2.2":"For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.","2.3.1":"Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.","2.4.1":"A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.","2.4.2":"Web pages, non-web documents, and software have titles that describe topic or purpose.","2.4.3":"If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.","2.4.4":"The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.","2.4.5":"More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.","2.4.6":"Headings and labels describe topic or purpose.","2.4.7":"Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.","2.4.11":"When an element receives focus, it is not entirely covered by other content.","2.5.1":"All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.","2.5.2":"For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.","2.5.3":"For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.","2.5.4":"Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.","2.5.8":"The size of the target for pointer inputs is at least 24 by 24 CSS pixels.","2.5.7":"All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.","3.1.1":"The default human language of Web pages, non-Web documents, or software can be programmatically determined.","3.1.2":"The human language of each passage or phrase in the content can be programmatically determined.","3.2.1":"When any component receives focus, it does not initiate a change of context.","3.2.2":"Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.","3.2.3":"Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.","3.2.4":"Components that have the same functionality within a set of Web pages are identified consistently.","3.2.6":"Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.","3.3.1":"If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.","3.3.2":"Labels or instructions are provided when content requires user input.","3.3.3":"If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.","3.3.4":"For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.","3.3.7":"Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.","3.3.8":"Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.","4.1.1":"(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.","4.1.2":"For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.","4.1.3":"In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",HTML:"The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.",ARIA:"The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported."};t.a11yRulesets=[{id:"EXTENSIONS",name:"Extension Rules",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for enabling the browser extensions",type:o.eGuidelineType.EXTENSION,checkpoints:[{num:"1",name:"Extension CP 1",wcagLevel:"A",summary:"Rules for Extension"}]},{id:"IBM_Accessibility",name:"IBM Accessibility 7.3",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"IBM_Accessibility_next",name:"IBM Accessibility next",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_2",name:"WCAG 2.2 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_1",name:"WCAG 2.1 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_0",name:"WCAG 2.0 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.",checkpoints:s.filter(function(e){return("A"===e.level||"AA"===e.level)&&"2.0"===e.wcagType}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})}]},5233(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRController=void 0;var a=i(8195),n=i(7014),r=i(248),l=i(4566),o=i(2165),s=i(3946),u=i(1686),d=function(){function e(e){void 0===e&&(e=document.body),this.rootElement=e,this.liveListeners=[],this.ctrlDoc=e.ownerDocument,this.setPointOfRegard(e),this.setupMutationTracking(),console.info('[WARNING] The SRController is a new feature that is not yet "stable". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback.')}return e.getController=function(t){return void 0===t&&(t=document),this.singleton||(this.singleton=new e(t.body)),this.singleton},e.prototype.disconnect=function(){this.mutationObserver&&this.mutationObserver.disconnect()},e.prototype.findAllShadowRoots=function(e){void 0===e&&(e=document);for(var t,i=[],a=this.ctrlDoc.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,null);t=a.nextNode();){var n=t;if(n.shadowRoot){i.push(n.shadowRoot);var r=this.findAllShadowRoots(n.shadowRoot);i.push.apply(i,r)}}return i},e.prototype.setupMutationTracking=function(){var e=this;this.mutationObserver&&this.mutationObserver.disconnect();var t=this,i=new MutationObserver(function(r){for(var l=t.pointOfRegard.getNode(),o=function(e){e.removedNodes.forEach(function(t){(t.isSameNode(l)||t.contains(l))&&(console.info("Adjusting PoR due to DOM mutation removing PoR"),l=e.target)})},u=0,d=r.filter(function(e){var t;return(null===(t=e.removedNodes)||void 0===t?void 0:t.length)>0});u<d.length;u++)o(d[u]);e.setPointOfRegard(l);for(var c=function(t){t.addedNodes&&t.addedNodes.forEach(function(t){for(var a=0,n=e.findAllShadowRoots(t);a<n.length;a++){var r=n[a];i.observe(r,{childList:!0,subtree:!0,characterData:!0})}});var r=t.target,l=1===r.nodeType?r:r.parentElement;if(l&&!l.closest('[aria-busy="true"]')&&"true"!==l.getAttribute("aria-busy")){var o=(["polite","assertive"].includes(l.getAttribute("aria-live"))||"OUTPUT"===l.nodeName.toUpperCase()||["status","log","progressbar","alert","timer"].includes(l.getAttribute("role")))&&l||l.closest('[aria-live="polite"],[aria-live="assertive"],output,[role="status"],[role="log"],[role="progressbar"],[role="alert"],[role="timer"]'),u=!1,d=["additions","text"];if(o){var c=l.closest("[aria-relevant]");c&&(d=c.getAttribute("aria-relevant").split(/ +/g)),"log"===o.getAttribute("role")&&(d=["additions"]),o.hasAttribute("aria-relevant")&&(d=o.getAttribute("aria-relevant").split(/ +/g)),d.includes("all")&&(d=["additions","removals","text"]),u=3===t.target.nodeType&&d.includes("text")||t.addedNodes.length>0&&d.includes("additions")||t.removedNodes.length>0&&d.includes("removals")}if(o&&u){var m="true"===o.getAttribute("aria-atomic")||["alert","status","timer","marquee"].includes(o.getAttribute("role"));if(m||"characterData"!==t.type||3!==t.target.nodeType||s.VisUtil.isNodeHiddenFromAT(t.target.parentElement)){var p=m?o:t.target;p.liveAnnounce&&clearTimeout(p.liveAnnounce),p.liveAnnounce=setTimeout(function(){var i=[],r=d.includes("removals")&&t.removedNodes.length>0;if(m||r){var l=new a.SRCursor(p,!1),o=new a.SRCursor(p,!0);o.next(function(){return!0}),i.push((r?"[removed] ":"")+n.SRRenderer.renderRange("item",l,o))}else d.includes("additions")&&t.addedNodes.length>0&&t.addedNodes.forEach(function(e){var t=new a.SRCursor(e,!1),r=new a.SRCursor(e,!0);r.next(function(){return!0}),i.push(n.SRRenderer.renderRange("item",t,r))});for(var s=0,u=e.liveListeners;s<u.length;s++)(0,u[s])(i.join("\n"))},100)}else for(var h=0,g=e.liveListeners;h<g.length;h++)(0,g[h])(t.target.nodeValue)}}},m=0,p=r;m<p.length;m++)c(p[m])}),r=this.findAllShadowRoots(this.ctrlDoc.documentElement);r.push(this.ctrlDoc.documentElement);for(var l=0,o=r;l<o.length;l++){var u=o[l];i.observe(u,{childList:!0,subtree:!0,characterData:!0})}},e.prototype.addLiveListener=function(e){this.liveListeners.push(e)},e.prototype.removeLiveListener=function(e){this.liveListeners=this.liveListeners.filter(function(t){return t!==e})},e.prototype.getPointOfRegard=function(){return this.pointOfRegard},e.prototype.setPointOfRegard=function(t){var i;try{this.pointOfRegard=new a.SRCursor(t);var r=e.diffContainers("focus",this.pointOfRegard),l=this.pointOfRegard.getRole(),o=null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name;return{success:!0,renderingResult:n.SRRenderer.renderCurrent("focus",this.pointOfRegard,r),role:l,name:o}}catch(e){return{success:!1,renderingResult:{start:this.pointOfRegard.clone(),end:this.pointOfRegard.clone(),message:"Failed to set point of regard: ".concat(e.message)}}}},e.prototype.jumpNext=function(t){var i;l.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=r.SRNavigator.jumpNext(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||r.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No next ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}finally{console.groupEnd()}},e.prototype.jumpPrevious=function(t){var i;l.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=r.SRNavigator.jumpPrevious(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||r.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No previous ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}},e.hostIframe=function(e){var t=e.ownerDocument;if(!t||t===document)return null;try{return u.DOMUtil.getAncestor(e,["iframe"])}catch(e){return null}},e.diffContainers=function(t,i,r){var l,o,s=[],u=[];try{if((null!==(l=null==i?void 0:i.getNode().ownerDocument)&&void 0!==l?l:document)!==(null!==(o=null==r?void 0:r.getNode().ownerDocument)&&void 0!==o?o:document)){var d=e.hostIframe(i.getNode()),c=e.hostIframe(null==r?void 0:r.getNode());if(d&&!c){var m=new a.SRCursor(d,!1);(g=n.SRRenderer.renderEnter(t,m,r))&&g.trim()&&u.push(g.trim())}else if(!d&&c)m=new a.SRCursor(c,!0),(p=n.SRRenderer.renderLeave(t,m,r))&&p.trim()&&s.push(p.trim());else if(d&&c&&d!==c){var p,h=new a.SRCursor(c,!0);(p=n.SRRenderer.renderLeave(t,h,r))&&p.trim()&&s.push(p.trim());var g,b=new a.SRCursor(d,!1);(g=n.SRRenderer.renderEnter(t,b,r))&&g.trim()&&u.push(g.trim())}return{leaving:s,entering:u}}var _=i?i.getNode().ownerDocument.body||i.getNode().ownerDocument.documentElement:r?r.getNode().ownerDocument.body||r.getNode().ownerDocument.documentElement:document.body||document.documentElement,f=i?i.clone():new a.SRCursor(_),v=r?r.clone():new a.SRCursor(_);if(!f.getNode().isSameNode(v.getNode())){var A=e.commonParent(f,v);if(A){for(;A.contains(f);)u.push(n.SRRenderer.renderEnter(t,f,v)),f.parent();for(u.reverse(),u=u.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()});A.contains(v);)s.push(n.SRRenderer.renderLeave(t,v,v)),v.parent();s=s.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()})}}}catch(e){console.error(e)}return{leaving:s,entering:u}},e.commonParent=function(e,t){if(e.contains(t))return e.clone();if(t.contains(e))return t.clone();for(var i=e.clone();!i.contains(t)&&i.parent(););return i.contains(e)&&i.contains(t)?i:null},e.renderAll=function(t){var i=e.getController();i.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&i.setPointOfRegard(e)});var a=[],r=n.SRRenderer.renderCurrent(t,i.getPointOfRegard(),{entering:[],leaving:[]});r&&a.push(r.message);for(var l=!0;l;){var s=i.jumpNext(t);s.success?a.push(s.renderingResult.message):l=!1}return a},e.renderAllDetail=function(t,i){var a=e.getController(t);a.setPointOfRegard(t.body),t.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&a.setPointOfRegard(e)});var r=[],l=n.SRRenderer.renderCurrent(i,a.getPointOfRegard(),{entering:[],leaving:[]});l&&r.push(l);for(var s=!0;s;){var u=a.jumpNext(i);u.success?r.push(u.renderingResult):s=!1}return r},e.renderStructure=function(t){for(var i,n,r=["region","heading","item","tab_focus","image"],l=r.map(function(i){return e.renderAllDetail(t,i)}),s=[],u=function(){var e=null===(i=l[0][0])||void 0===i?void 0:i.start;r.forEach(function(t,i){l[i].length>0&&(!e||a.SRCursor.compare(l[i][0].start,e)<0)&&(e=l[i][0].start)});var u={},d=!1;if(r.forEach(function(t,i){u[t]="",l[i].length>0&&0===a.SRCursor.compare(l[i][0].start,e)&&(u[t]=l[i].shift().message,d=""!==u[t])}),d){var c=e.getElement(),m=c&&o.SRUtil.getUniqueSelector(c),p=null!==(n=null==c?void 0:c.ownerDocument)&&void 0!==n?n:t;m&&p.querySelector(m)&&(u.selector=m),s.push(u)}};l.some(function(e){return e.length>0});)u();return s},e}();t.SRController=d},8195(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRCursor=void 0;var a=i(3864),n=i(1950),r=i(7011),l=i(7139),o=i(2165),s=function(){function e(e,t){this.walker=new a.DOMWalker(e,t,void 0,!1),e&&this.refreshName()}return e.prototype.clone=function(){var t=new e(this.walker.node,this.walker.bEndTag);return t.role=this.role,t.name=this.name,t.preLineIndex=this.preLineIndex,t},e.prototype.refreshName=function(){1===this.walker.node.nodeType?(this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0)},e.prototype.next=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},l=n.skipCurrent,s=n.skipChildren;do{if(s&&!this.walker.bEndTag)this.walker.bEndTag=!0;else if(!this.walker.nextNode())break;if(this.refreshName(),l=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&this.isEndTag())break;l||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.previous=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},l=n.skipCurrent,s=n.skipChildren;do{if(s&&this.walker.bEndTag)this.walker.bEndTag=!1;else if(!this.walker.prevNode())break;if(this.refreshName(),l=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&!this.isEndTag())break;l||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.parent=function(e){return!!this.walker.node.parentNode&&(this.walker.node=this.walker.node.parentNode,this.walker.bEndTag=!0===e,1===this.walker.node.nodeType?(this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0),!0)},e.prototype.getCurrentOrParentByRole=function(e,t){for(var i=this,a=t?t.map(function(e){return e.toUpperCase()}):[],n=function(t){var n=t.getElement();return e.includes(i.getRole())||n&&!n.hasAttribute("role")&&a.includes(n.nodeName.toUpperCase())};!n(this)&&this.parent(););return n(this)},e.prototype.getCurrentOrParentByRoleClone=function(e,t){var i=this.clone();return i.getCurrentOrParentByRole(e,t)?i:null},e.prototype.getCurrentOrParentTabbableClone=function(){for(var e=this.clone();e;){var t=e.getElement();if(e.isStartTag()&&t&&l.CommonUtil.isTabbable(t))return e;if(!e.parent(!1))break}return null},e.prototype.getRole=function(){return this.role},e.prototype.getNameInfo=function(){return this.name},e.prototype.getName=function(){var e=this.getNameInfo();if(e&&e.name)return e.name;var t=this.getElement();if(t){var i=l.CommonUtil.getLabelForElementHidden(t,!0);if(i)return i.innerText||i.textContent}},e.prototype.setEndTag=function(e){this.walker.bEndTag=e},e.prototype.getNode=function(){return this.walker.node},e.prototype.getElement=function(){if(this.walker.node&&1===this.walker.node.nodeType)return this.walker.node},e.prototype.getParentElement=function(){if(!this.walker.node)return null;var e=this.clone();return e.walker.node=a.DOMWalker.parentElement(e.walker.node),e},e.prototype.isEndTag=function(){return this.walker.bEndTag},e.prototype.isStartTag=function(){return!this.walker.bEndTag},e.compare=function(e,t){var i,n,r=null===(i=null==e?void 0:e.walker)||void 0===i?void 0:i.node,l=null===(n=null==t?void 0:t.walker)||void 0===n?void 0:n.node;if(!r&&!l)return 0;if(!r)return 1;if(!l)return-1;if(r===l&&!e.walker.bEndTag&&!t.walker.bEndTag){var o=void 0===e.preLineIndex,s=void 0===t.preLineIndex;if(!o||!s){if(o)return-1;if(s)return 1;if(e.preLineIndex!==t.preLineIndex)return e.preLineIndex<t.preLineIndex?-1:1}}var u=r.compareDocumentPosition(l);if(1&u){for(var d=[r],c=[l],m=r;m=a.DOMWalker.parentNode(m);)d.push(m);for(m=l;m=a.DOMWalker.parentNode(m);)c.push(m);d.reverse(),c.reverse();for(var p=0;p<d.length&&p<c.length&&d[p]===c[p];)p++;if(p===d.length)return e.walker.bEndTag?1:-1;if(p===c.length)return t.walker.bEndTag?-1:1;if(p>0){var h=d[p],g=c[p],b=h.compareDocumentPosition(g);if(2&b)return 1;if(4&b)return-1}return 0}return 8&u?t.walker.bEndTag?-1:1:16&u?e.walker.bEndTag?1:-1:2&u?1:4&u?-1:0},e.prototype.contains=function(e){return this.getNode().contains(e.getNode())&&!this.isSameNode(e)},e.prototype.isSameNode=function(e){return!!e&&this.getNode().isSameNode(e.getNode())},e.prototype.hasNonEmptyName=function(){var e;return((null===(e=this.getNameInfo())||void 0===e?void 0:e.name)||"").trim().length>0},e}();t.SRCursor=s},248(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRNavigator=void 0;var a=i(3864),n=i(1950),r=i(8195),l=i(7139),o=i(3946),s=i(7011);!function(e){function t(e){var i;if(1!==e.nodeType)return!1;if(["br","iframe"].includes(e.nodeName.toLowerCase()))return!0;var n=e,r=n.ownerDocument.defaultView,l=null===(i=r.getComputedStyle(n))||void 0===i?void 0:i.display;if(l&&l.startsWith("table"))return!0;if("block"===l&&"block"!==n.style.display&&n.parentElement&&"flex"===r.getComputedStyle(n.parentElement).display)return!1;if("link"===s.AriaUtil.getResolvedRole(n,!0)){var o=new a.DOMWalker(e,!1,void 0,!1);if(o.prevNode(),!t(o.node))return!0}return["block","flex","grid","list-item"].includes(l)}function i(e){for(var t,i=(null!==(t=e.textContent)&&void 0!==t?t:"").split("\n"),a=0;a<i.length&&""===i[a].trim();)a++;for(var n=i.length-1;n>=a&&""===i[n].trim();)n--;return i.slice(a,n+1)}function u(e){return 1===e.nodeType&&"PRE"===e.nodeName.toUpperCase()}function d(e){if(!e||1!==e.nodeType)return null;var t=e;if(!t.hasAttribute("tabindex"))return null;var i=parseInt(t.getAttribute("tabindex"),10);return Number.isNaN(i)?null:i}function c(e){if(!e||1!==e.nodeType)return!1;var t=e,i=d(t);return(null===i||0===i)&&l.CommonUtil.isTabbable(t)}function m(e){return void 0===e&&(e=!0),function(t,i,a){return!!(a&&1===a.nodeType&&i&&l.CommonUtil.isTabbable(a))&&(e||c(a))}}function p(e,t){var i=((null==t?void 0:t.ownerDocument)||document).body||t;if(!i)return[];var a=new r.SRCursor(i,!1),n=f("tab_focus"),o=[],s=[],u=function(t){e(t.getRole(),!t.isEndTag(),t.getNode())&&(function(e){if(!e||1!==e.nodeType)return!1;var t=e,i=d(t);return null!==i&&i>0&&l.CommonUtil.isTabbable(t)}(t.getNode())?o.push(t.clone()):c(t.getNode())&&s.push(t.clone()))};for(u(a);a.next(function(){return!0},n);)u(a);return o.sort(function(e,t){var i=e.getElement(),a=t.getElement(),n=d(i)||0,l=d(a)||0;return n!==l?l-n:r.SRCursor.compare(e,t)}),o.concat(s)}function h(e,t){return e.findIndex(function(e){return 0===r.SRCursor.compare(e,t)})}function g(e){switch(e){case"link":return function(e,t){return t&&"link"===e};case"tab_focus":return m(!1);case"heading":return function(e,t){return t&&"heading"===e};case"h1":return function(e,t,i){return t&&"heading"===e&&"1"===i.ariaLevel};case"h2":return function(e,t,i){return t&&"heading"===e&&"2"===i.ariaLevel};case"h3":return function(e,t,i){return t&&"heading"===e&&"3"===i.ariaLevel};case"h4":return function(e,t,i){return t&&"heading"===e&&"4"===i.ariaLevel};case"h5":return function(e,t,i){return t&&"heading"===e&&"5"===i.ariaLevel};case"h6":return function(e,t,i){return t&&"heading"===e&&"6"===i.ariaLevel};case"image":return function(e,t){return t&&["img","graphics-document"].includes(e)};case"radio":return function(e,t){return t&&"radio"===e};case"button":return function(e,t){return t&&"button"===e};case"checkbox":return function(e,t){return t&&"checkbox"===e};case"combo":return function(e,t){return t&&"combobox"===e};case"list":return function(e,t){return t&&"list"===e};case"listitem":return function(e,t){return t&&"listitem"===e};case"article":return function(e,t){return t&&"article"===e};case"table":return function(e,t){return t&&"table"===e};case"paragraph":return function(e,t,i){return t&&"P"===i.nodeName.toUpperCase()};case"dom":return function(){return!0};case"item":return function(e,i,n){if(!i)return!1;if(1===n.nodeType&&"IFRAME"===n.nodeName.toUpperCase())return!1;if(u(n))return!0;if(t(n))return!0;var r=new a.DOMWalker(n,!i);return!(!r.prevNode()||!r.bEndTag)&&t(r.node)};case"region":return function(e,t,i){var a,r;return!!t&&(!!["main","navigation","form","banner","search","contentinfo"].includes(e)||"region"===e&&1===(null==i?void 0:i.nodeType)&&!!(null===(r=null===(a=n.AccNameUtil.computeAccessibleName(i))||void 0===a?void 0:a.name)||void 0===r?void 0:r.trim()))};case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}e.getPreLines=i,e.getStartFunc=g;var b=function(e){var t;try{var i=e.getNode().nodeType,n=e.getElement(),r=e.clone();if(r.setEndTag(!1),[4,8].includes(i))return{skipCurrent:!0,skipChildren:!0};if(![1,3].includes(i))return{skipCurrent:!0,skipChildren:!1};if(3===i&&!(n=e.getNode().parentElement))return o.VisUtil.isNodeHiddenFromAT(n)?{skipCurrent:!0,skipChildren:!1}:null;if(!(n.closest("body")||(t=n,t.getRootNode()instanceof ShadowRoot)))return{skipCurrent:!0,skipChildren:!1};if(n.closest("script,style"))return{skipCurrent:!0,skipChildren:!0};var l=r.getCurrentOrParentByRoleClone(["heading","link"]),u=s.AriaUtil.getResolvedRole(n),d="heading"===u||"link"===u;if(l){l.getElement();var c=l.getNameInfo();if(c&&!["content","text"].includes(c.nameFrom)){if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:!0}}else if(d);else{var m=s.AriaUtil.getResolvedRole(n);if(("img"===m||"graphics-document"===m)&&o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0}}}else{if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:1===i};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:1===i}}if("BODY"===n.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!1};if("LABEL"===n.nodeName.toUpperCase()){if(n.hasAttribute("for")&&document.getElementById(n.getAttribute("for"))&&"hidden"!==document.getElementById(n.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var p=n.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']");if(p&&"hidden"!==p.getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};if((b=n.getAttribute("id"))&&document.querySelector('[aria-labelledby~="'.concat(b,'"]')))return{skipCurrent:!0,skipChildren:!1}}var h=n.closest("label[for]"),g=h&&h.getAttribute("for");if(h&&g&&document.getElementById(g)&&"hidden"!==document.getElementById(g).getAttribute("type")&&!n.closest("a[href], [role='link'], button, [role='button']"))return{skipCurrent:!0,skipChildren:1===i};var b,_=r.getRole();if("combobox"===_&&"SELECT"!==n.nodeName.toUpperCase()&&"INPUT"!==n.nodeName.toUpperCase()&&!e.isEndTag())return{skipCurrent:!1,skipChildren:!0};if(s.AriaUtil.containsPresentationalChildrenOnly(n))return{skipCurrent:!1,skipChildren:!0};if(["link","heading"].includes(_)&&(!r.getName()||!["content","text"].includes(r.getNameInfo().nameFrom))&&!(l&&l.getNameInfo()&&["content","text"].includes(l.getNameInfo().nameFrom)))return{skipCurrent:!1,skipChildren:!0};if("LEGEND"===n.nodeName.toUpperCase())for(var f=a.DOMWalker.parentElement(e.getNode());f;){if("FIELDSET"===f.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0};f=a.DOMWalker.parentElement(f)}if(n&&"MSUP"===n.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0};if(!e.isEndTag()&&"SUMMARY"===n.nodeName.toUpperCase()){var v=n.parentElement;if(v&&"DETAILS"===v.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0}}if(!e.isEndTag()&&"DETAILS"!==n.nodeName.toUpperCase()&&!n.closest("summary")){var A=n.closest("details");if(A&&!A.hasAttribute("open"))return{skipCurrent:!0,skipChildren:!0}}if(n.closest(".ibma-sr-overlay"))return{skipCurrent:!0,skipChildren:!0};if(1===i&&!e.isEndTag()&&(b=n.getAttribute("id"))){var w=document.querySelector('[aria-controls~="'.concat(b,'"]'));if(w&&"combobox"===s.AriaUtil.getResolvedRole(w))return{skipCurrent:!0,skipChildren:!0}}return null}finally{}},_=function(e){var t=e.getNode().nodeType,i=e.getElement();if(1!==t&&3!==t)return{skipCurrent:!0,skipChildren:!1};if(3===t)return o.VisUtil.isNodeHiddenFromAT(i)?{skipCurrent:!0,skipChildren:!1}:null;if(o.VisUtil.isNodeHiddenFromAT(i))return{skipCurrent:!0,skipChildren:!0};if("IFRAME"===i.nodeName.toUpperCase()&&!e.isEndTag())return{skipCurrent:!1,skipChildren:!0};if("LABEL"===i.nodeName.toUpperCase()&&i.hasAttribute("for")&&document.getElementById(i.getAttribute("for"))&&"hidden"!==document.getElementById(i.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var a=i.closest("label[for]"),n=a&&a.getAttribute("for");return a&&n&&document.getElementById(n)&&"hidden"!==document.getElementById(n).getAttribute("type")&&!i.closest("a[href], [role='link'], button, [role='button']")?{skipCurrent:!0,skipChildren:1===t}:(e.getRole(),s.AriaUtil.containsPresentationalChildrenOnly(i)?{skipCurrent:!1,skipChildren:!0}:i&&"MSUP"===i.nodeName.toUpperCase()||i.closest(".ibma-sr-overlay")?{skipCurrent:!0,skipChildren:!0}:null)};function f(e){switch(e){case"region":case"item":return b;case"link":case"tab_focus":case"heading":case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":case"image":return _;case"radio":case"button":case"checkbox":case"combo":case"list":case"listitem":case"article":case"table":case"paragraph":case"dom":case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}function v(e,t){try{if("tab_focus"===e){var a=p(m(!0),t.getNode());if(a.length>0){var n=t.getCurrentOrParentTabbableClone(),r=n&&h(a,n)>=0?n:t.clone(),l=h(a,r);return l>=0?l+1<a.length?a[l+1].clone():null:a[0].clone()}}if("item"===e&&u(t.getNode())&&!t.isEndTag()){var o=i(t.getNode());if(void 0!==t.preLineIndex){var s=t.preLineIndex;if(s+1<o.length){var d=t.clone();return d.preLineIndex=s+1,d}var c=t.clone();c.setEndTag(!0);var b=g(e),_=f(e);return c.next(b,_)?(u(c.getNode())&&!c.isEndTag()&&(c.preLineIndex=void 0),c):null}if(o.length>0){var v=t.clone();return v.preLineIndex=0,v}}var A=t.clone(),w=g(e),y=f(e);return A.next(w,y)?("item"===e&&u(A.getNode())&&!A.isEndTag()&&(A.preLineIndex=void 0),A):null}finally{console.groupEnd()}}function A(e,t){if("tab_focus"===e){var a=t.clone(),n=g(e),r=f(e);if(a.previous(n,r))return a;var l=p(m(!0),t.getNode());if(l.length>0){var o=t.getCurrentOrParentTabbableClone(),s=o&&h(l,o)>=0?o:t.clone(),d=h(l,s);if(d>0)return l[d-1].clone()}return null}if("item"===e&&u(t.getNode())&&!t.isEndTag()&&void 0!==t.preLineIndex){if(0===t.preLineIndex){var c=t.clone();return c.preLineIndex=void 0,c}var b=t.clone();return b.preLineIndex=t.preLineIndex-1,b}var _=t.clone(),v=g(e),A=f(e);if(_.previous(v,A)){if("item"===e&&u(_.getNode())&&!_.isEndTag()){var w=i(_.getNode());_.preLineIndex=w.length>0?w.length-1:void 0}return _}return null}e.getSkipFunc=f,e.jumpCurrent=function(e,t){return("tab_focus"===e?m(!0):g(e))(t.getRole(),!t.isEndTag(),t.getNode())?t.clone():A(e,t)},e.jumpCurrentEnd=function(e,t){if("item"===e){if(u(t.getNode())&&!t.isEndTag()){i(t.getNode());var a=void 0===t.preLineIndex?0:t.preLineIndex+1,n=t.clone();return n.preLineIndex=a,[n]}return(d=v(e,t))?[d]:[]}var l=t.getNameInfo(),o=t.clone();l&&!["content","text"].includes(l.nameFrom)||o.setEndTag(!0),o.next(function(){return!0});for(var s=[],d=v("item",t);d&&r.SRCursor.compare(d,o)<0;)s.push(d),d=v("item",d);return s.push(o),"tab_focus"===e&&"link"===t.getRole()?[s[s.length-1]]:s},e.jumpNext=v,e.jumpPrevious=A}(t.SRNavigator||(t.SRNavigator={}))},7014(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRenderer=void 0;var a,n=i(7011),r=i(248),l=i(8195),o=i(2151),s=i(7242);(a=t.SRRenderer||(t.SRRenderer={})).renderEnter=function(e,t,i){for(var a=0,n=o.CONTAINER_ENTER_RULES;a<n.length;a++){var r=n[a].test(e,t,i);if(null!=r)return r}return null},a.renderLeave=function(e,t,i){for(var a=0,n=o.CONTAINER_EXIT_RULES;a<n.length;a++){var r=n[a].test(e,t,i);if(null!=r)return r}return null},a.renderCurrent=function(e,t,i){var n=r.SRNavigator.jumpCurrent(e,t);if(!n)return null;var l=r.SRNavigator.jumpCurrentEnd(e,n);l&&0!==l.length||(l=[null]);for(var o=l[l.length-1],s="",u=0,d=l;u<d.length;u++){var c=d[u],m=a.renderRange(e,n,c);if(m.trim().length>0){o=c,s=m;break}}return""===s&&(s=a.renderRange(e,n,o)),{start:n,end:o,message:(i.leaving||[]).concat(i.entering||[]).concat([s]).join(" ").replace(/\s+/g," ")}},a.renderRange=function(e,t,i){for(var a,u=t.clone(),d=[],c=!0,m=null;c;){var p=u.getElement(),h=u.getNode(),g=h.nodeType,b=n.AriaUtil.getAncestorWithRole(h,"link",!0);b&&!["content","text"].includes(null===(a=new l.SRCursor(b).getNameInfo())||void 0===a?void 0:a.nameFrom)&&(b=null);for(var _=0,f=o.SR_RULES;_<f.length;_++){var v=f[_].test(e,u);if(null!=v&&v.trim().length>0){1!==g||u.isEndTag()||"menu"!==p.getAttribute("aria-haspopup")||(v="[subMenu] "+v),"tab_focus"===e?m&&(!b||b&&m!==b)&&(v="".concat(v," ").concat((0,s.getLinkAnnouncement)(new l.SRCursor(m,!1)))):!b||m&&m===b||(v="".concat((0,s.getLinkAnnouncement)(new l.SRCursor(b,!1))," ").concat(v)),""!==v&&(m=b,d.push(v));break}}d.push([].filter(function(e){return e.trim().length>0}).join(" ")),c=u.next(function(){return!0},r.SRNavigator.getSkipFunc(e))&&l.SRCursor.compare(u,i)<0}"tab_focus"===e&&m&&d.push("".concat((0,s.getLinkAnnouncement)(new l.SRCursor(m,!1))));var A=d.filter(function(e){return e.trim().length>0}).join(" ");return A=(A=A.replace(/, \u0001([^\u0002]+)\u0002/g,function(e,t){var i='"'.concat(t,'"'),a=A.replace(e,"");return a.includes(i)||a.includes(t)?"":", ".concat(i)})).replace(/[\u0001\u0002]/g,"")}},328(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRendererRule=void 0;var i=function(){function e(e){this.ruleDefinition=e}return e.prototype.test=function(e,t,i){if(this.ruleDefinition.modes.includes(e)&&(this.ruleDefinition.roles.includes(t.getRole())||this.ruleDefinition.elems.includes(t.getNode().nodeName.toUpperCase())))for(var a=0,n=this.ruleDefinition.tests;a<n.length;a++){var r=(0,n[a])(t,i,e);if("string"==typeof r)return r}return null},e}();t.SRRendererRule=i},369(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRTableUtil=void 0;var a=i(8195);!function(e){function t(e){return!!e.getElement()&&(!!["cell","rowheader","columnheader"].includes(e.getRole())||!e.getElement().hasAttribute("role")&&["TH","TD"].includes(e.getElement().nodeName.toUpperCase()))}function i(e){return e.getCurrentOrParentByRoleClone(["cell","rowheader","columnheader"],["TD","TH"])}function n(e){if(!t(e))return 0;var i=e.getElement().getAttribute("colspan");return i?parseInt(i):1}function r(e){if(!t(e))return 0;var i=e.getElement().getAttribute("rowspan");return i?parseInt(i):1}function l(e){var i=e.getCurrentOrParentByRoleClone(["table"]);if(!i)return null;for(var a,l=i.clone(),o=[],s=[];l.next(function(){return!0})&&!l.getNode().isSameNode(i.getNode());){if(l.isEndTag()&&"row"===l.getRole())for(o.push(s),a=s,s=[];a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length]);if(!l.isEndTag()&&t(l)){for(var u=n(l),d={rowIndexStart:o.length,colIndexStart:s.length,rowspan:r(l),colspan:u,cellCursor:l.clone()},c=0;c<u;++c)s.push(d);for(;a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length])}}return o}function o(e,t){var a=i(e);t||(t=l(e));for(var n=0;n<t.length;++n)for(var r=0;r<t[n].length;++r)if(t[n][r].cellCursor.isSameNode(a))return t[n][r];return null}function s(e,t){return t>=e.colIndexStart&&t<e.colIndexStart+e.colspan}function u(e,t){return t>=e.rowIndexStart&&t<e.rowIndexStart+e.rowspan}function d(e){var t=e.getElement();return!!t&&("cell"===e.getRole()||!t.hasAttribute("role")&&"TD"===t.nodeName.toUpperCase())}e.isCursorCellRole=t,e.getCurrentOrParentCellCursor=i,e.getColSpan=n,e.getRowSpan=r,e.getTableModel=l,e.getCellModel=o,e.cellModelContainsColumn=s,e.cellModelContainsRow=u,e.getRowHeaders=function(e){return""},e.getColumnHeadersForCursor=function(t,i){if(!i&&!(i=l(t)))return"";var n=o(t,i);if(!n)return"";var r=n.cellCursor;if(!r)return"";var u=r.getElement();if(!u)return"";for(var c=[],m=n.colIndexStart;m<n.colIndexStart+n.colspan;++m)c.push({potentialColHeaders:[],existsDataCell:!1,colIdx:m});var p=[];if(u.hasAttribute("headers"))p=u.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return s(e.getCellModel(t,i),a.colIdx)})});else{for(var h=0;h<i.length;++h)for(var g=function(e){var t=e.colIdx,a=i[h][t],n=a.cellCursor,l=n.getElement();if(!a||!n||n.isSameNode(r)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0),"continue";var o=n.clone();"columnheader"===n.getRole()?(p.push(o),e.potentialColHeaders.push(o)):l.hasAttribute("role")||"TH"!==l.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0):("col"===l.getAttribute("scope")||"axis"===l.getAttribute("scope")||!l.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialColHeaders.push(o))},b=0,_=c;b<_.length;b++)g(A=_[b]);for(var f=0,v=c;f<v.length;f++){var A;(A=v[f]).existsDataCell||(A.potentialColHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialColHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.getRowHeadersForCursor=function(t,i){if(!i&&!(i=l(t)))return"";var n=o(t,i);if(!n)return"";var r=n.cellCursor;if(!r)return"";var s=r.getElement();if(!s)return"";for(var c=[],m=n.rowIndexStart;m<n.rowIndexStart+n.rowspan;++m)c.push({potentialRowHeaders:[],existsDataCell:!1,rowIdx:m});var p=[];if(s.hasAttribute("headers"))p=s.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return u(e.getCellModel(t,i),a.rowIdx)})});else{for(var h=c.reduce(function(e,t){return Math.max(e,i[t.rowIdx].length)},0),g=0;g<h;++g)for(var b=function(e){var t=e.rowIdx;if(g>=i[t].length)return"continue";var a=i[t][g],n=a.cellCursor,l=n.getElement();if(!a||!n||n.isSameNode(r)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0),"continue";var o=n.clone();"rowheader"===n.getRole()?(p.push(o),e.potentialRowHeaders.push(o)):l.hasAttribute("role")||"TH"!==l.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0):("row"===l.getAttribute("scope")||"axis"===l.getAttribute("scope")||!l.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialRowHeaders.push(o))},_=0,f=c;_<f.length;_++)b(w=f[_]);for(var v=0,A=c;v<A.length;v++){var w;(w=A[v]).existsDataCell||(w.potentialRowHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialRowHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.isDataCell=d}(t.SRTableUtil||(t.SRTableUtil={}))},2165(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRUtil=void 0;var a,n=i(7011),r=i(3946);(a=t.SRUtil||(t.SRUtil={})).isModalDialogElement=function(e){if(1!==e.nodeType)return!1;var t=e;return"dialog"===n.AriaUtil.getResolvedRole(t,!0)&&"true"===t.getAttribute("aria-modal")&&r.VisUtil.isNodeVisible(e)},a.getUniqueSelector=function e(t,i){if(void 0===i&&(i=!1),t.id)return"#".concat(CSS.escape(t.id));if(t.isSameNode(document.documentElement)||t.isSameNode(document.body))return t.tagName.toLowerCase();var a=t.tagName.toLowerCase();if(t.classList.length&&!i&&(a+=Array.from(t.classList).slice(0,3).map(function(e){return".".concat(CSS.escape(e))}).join("")),!i){if(t.hasAttribute("role")&&(a+='[role="'.concat(CSS.escape(t.getAttribute("role")||""),'"]')),t.hasAttribute("aria-label")){var n=t.getAttribute("aria-label")||"";n.length<=20&&(a+='[aria-label="'.concat(CSS.escape(n),'"]'))}"input"===t.tagName.toLowerCase()&&t.hasAttribute("type")&&(a+='[type="'.concat(CSS.escape(t.getAttribute("type")||""),'"]'))}if(t.parentElement){var r=Array.from(t.parentElement.children).filter(function(e){return e.tagName===t.tagName});if(r.length>1){var l=r.indexOf(t)+1;a+=":nth-of-type(".concat(l,")")}return"".concat(e(t.parentElement,!0)," > ").concat(a)}return a}},8107(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRViewer=t.SROverlay=void 0;var a=i(5233),n=function(){function e(e){this.srViewer=e,this.navigationModes=[{mode:"item",label:"Item"},{mode:"tab_focus",label:"Tabbable"},{mode:"heading",label:"Heading"},{mode:"region",label:"Region"}],this.createOverlay()}return e.prototype.createDOMElement=function(e,t,i){var a=this.srViewer.viewerDoc.createElement(e);if(t)for(var n in t)a[n]=t[n];if(i)for(var n in i)a.style[n]=i[n];return a},e.prototype.createOverlay=function(){var e=this;this.container=this.createDOMElement("div",{className:"ibma-sr-overlay"},{position:"fixed",bottom:"0",left:"0",width:"100%",backgroundColor:"rgba(0, 0, 0, 0.8)",color:"white",padding:"10px",zIndex:"10000",display:"flex",flexDirection:"column",gap:"10px"});var t=this.createDOMElement("div",{},{display:"flex",flexWrap:"wrap",gap:"10px"});this.navigationModes.forEach(function(i){var a=e.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"});a.appendChild(e.createDOMElement("span",{textContent:i.label+":"},{}));var n=e.createDOMElement("button",{textContent:"◀ Prev"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.navigatePrevious(i.mode)}),a.appendChild(n);var r=e.createDOMElement("button",{textContent:"Next ▶"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});r.addEventListener("click",function(){return e.srViewer.navigateNext(i.mode)}),a.appendChild(r),t.appendChild(a)});var i=this.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"}),a=this.createDOMElement("button",{textContent:"Show all"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});a.addEventListener("click",function(){return e.srViewer.showAll(!0)}),i.appendChild(a);var n=this.createDOMElement("button",{textContent:"Toggle speech"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.toggleSpeech()}),i.appendChild(n),t.appendChild(i),this.resultsDisplay=this.createDOMElement("div",{textContent:"Screen reader simulation results will appear here."},{padding:"10px",backgroundColor:"rgba(255, 255, 255, 0.1)",borderRadius:"3px",minHeight:"100px",maxHeight:"50vh",fontFamily:"monospace",overflow:"auto"}),this.container.appendChild(t),this.container.appendChild(this.resultsDisplay),this.srViewer.viewerDoc.body.appendChild(this.container)},e.prototype.displayResult=function(e,t,i){var a,n,r,l,o="";e.success,o="".concat(i.toUpperCase()," ").concat(t,": ").concat(e.renderingResult.message),null===(n=null===(a=e.renderingResult.end)||void 0===a?void 0:a.getElement())||void 0===n||n.scrollIntoView(),null===(l=null===(r=e.renderingResult.start)||void 0===r?void 0:r.getElement())||void 0===l||l.scrollIntoView(),window.scrollBy(0,-200),this.resultsDisplay.innerHTML="",this.resultsDisplay.textContent=o;var s=this.createDOMElement("button",{innerText:"Debug"},{});s.addEventListener("click",function(){var t,i;console.log(null===(t=e.renderingResult.start)||void 0===t?void 0:t.getNode(),null===(i=e.renderingResult.end)||void 0===i?void 0:i.getNode())}),this.resultsDisplay.appendChild(s)},e.prototype.displayAll=function(e){for(var t=this,i=this.createDOMElement("table",{},{}),a=this.createDOMElement("tr",{},{}),n=["region","heading","item","tab_focus"],r=0,l=["Region","Heading","Item","Tabbable"];r<l.length;r++){var o=l[r];a.appendChild(this.createDOMElement("th",{scope:"col",innerText:o},{textAlign:"left",padding:".25rem",margin:"0rem",color:"white"})),i.appendChild(a)}for(var s=function(e){var a=u.createDOMElement("tr",{},{});n.forEach(function(i){a.appendChild(t.createDOMElement("td",{innerText:e[i]},{verticalAlign:"top",border:"solid white 1px",padding:".25rem",margin:"0rem",color:"white"}))}),i.appendChild(a)},u=this,d=0,c=e;d<c.length;d++)s(c[d]);this.resultsDisplay.innerHTML="",this.resultsDisplay.appendChild(i)},e.prototype.destroy=function(){this.container&&this.container.parentNode&&this.container.parentNode.removeChild(this.container)},e}();t.SROverlay=n;var r=function(){function e(e){void 0===e&&(e=document.body),this.isStreaming=!1,this.isShowingAll=!1,this.speechEnabled=!1,this.viewerDoc=e.ownerDocument,this.controller=a.SRController.getController(this.viewerDoc),this.overlay=new n(this),this.setupKeyboardHandlers(),this.setupFocusTracking(),this.setupMutationTracking()}return e.prototype.showAll=function(e){e&&(this.isShowingAll=!0);var t=a.SRController.renderStructure(this.viewerDoc);this.overlay.displayAll(t)},e.prototype.toggleSpeech=function(){this.speechEnabled=!this.speechEnabled},e.prototype.navigateNext=function(e){this.isShowingAll=!1;var t=this.controller.jumpNext(e);this.overlay.displayResult(t,e,"next"),this.speakResult(t)},e.prototype.navigatePrevious=function(e){this.isShowingAll=!1;var t=this.controller.jumpPrevious(e);this.overlay.displayResult(t,e,"previous"),this.speakResult(t)},e.prototype.setupKeyboardHandlers=function(){var e=this;this.keyboardHandler=function(t){var i=t.target;if("INPUT"!==i.tagName&&"TEXTAREA"!==i.tagName&&"SELECT"!==i.tagName)if(t.ctrlKey)e.stopSpeech();else if(!t.altKey&&!t.metaKey)switch(t.key){case"ArrowUp":t.preventDefault(),e.navigatePrevious("item");break;case" ":e.isStreaming=!0;case"ArrowDown":t.preventDefault(),e.navigateNext("item");break;case"Enter":t.preventDefault(),e.activateCurrentElement(),e.controller.setPointOfRegard(e.viewerDoc.activeElement);break;case"H":case"h":t.shiftKey?(t.preventDefault(),e.navigatePrevious("heading")):(t.preventDefault(),e.navigateNext("heading"));break;case"R":case"r":t.shiftKey?(t.preventDefault(),e.navigatePrevious("region")):(t.preventDefault(),e.navigateNext("region"));break;case"Tab":t.shiftKey?(t.preventDefault(),e.navigatePrevious("tab_focus")):(t.preventDefault(),e.navigateNext("tab_focus"))}},this.viewerDoc.addEventListener("keydown",this.keyboardHandler)},e.prototype.speakResult=function(e){var t=this;if(this.speechEnabled){var i=new SpeechSynthesisUtterance(e.renderingResult.message);i.rate=1.5;var a=this;i.addEventListener("end",function(e){a.isStreaming&&t.navigateNext("item")}),speechSynthesis.cancel(),speechSynthesis.speak(i)}},e.prototype.stopSpeech=function(){this.isStreaming=!1,speechSynthesis.cancel()},e.prototype.setupMutationTracking=function(){var e=this,t=new MutationObserver(function(i){if(e.isShowingAll&&i.filter(function(e){return 1===e.target.nodeType&&!e.target.closest(".ibma-sr-overlay")}).length>0){t.disconnect();var a=e;a.showAll(),setTimeout(function(){a.showAll(),t.observe(e.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},1e3)}});t.observe(this.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},e.prototype.setupFocusTracking=function(){var e=this;this.focusHandler=function(t){if(t.target instanceof HTMLElement){var i=t.target;if(e.overlay&&i.closest(".ibma-sr-overlay"))return;console.group("focusHandler");var a=e.controller.setPointOfRegard(i);a.success&&(e.overlay.displayResult(a,"focus","focus"),e.speakResult(a)),console.groupEnd()}},this.viewerDoc.addEventListener("focusin",this.focusHandler)},e.prototype.activateCurrentElement=function(){var e=this.controller.getPointOfRegard().getElement();if(e){var t={success:!0,renderingResult:{message:"Activating: ".concat(e.textContent||e.nodeName),start:this.controller.getPointOfRegard(),end:this.controller.getPointOfRegard()}};this.overlay.displayResult(t,"focus","focus"),this.speakResult(t),e.focus&&e.focus(),e.click()}},e.prototype.getController=function(){return this.controller},e.prototype.destroy=function(){this.viewerDoc.removeEventListener("keydown",this.keyboardHandler),this.viewerDoc.removeEventListener("focusin",this.focusHandler),this.stopSpeech(),this.overlay.destroy()},e}();t.SRViewer=r},7242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=t.getLinkAnnouncement=t.getRoleDescription=t.quoteName=t.quoteNamePadBefore=t.quoteNamePadAfter=void 0;var a=i(8195),n=i(328),r=i(7011),l=i(9910),o=i(3864),s=i(3946);function u(e,t,i,a){return e.getName()?"".concat(c(e)).concat(t||", "):""}function d(e,t){return e.getName()?"".concat(t||", ").concat(c(e)):""}function c(e,t,i){return e.getName()?"".concat(t||'"').concat(e.getName()).concat(i||'"'):""}function m(e,t){var i=e.getElement();if(!i)return t;var a=i.getAttribute("aria-roledescription");return a&&a.trim().length>0?a.trim():t}function p(e,t){var i,a=e.getNode().href||"";i=a.startsWith(document.location.href)&&"#"===a.charAt(document.location.href.length)?"same page link":"link";var n=e.getNameInfo();return n&&!["content","text"].includes(n.nameFrom)?"tab_focus"===t?"[".concat(u(e)).concat(i,"]"):"[".concat(i).concat(d(e),"]"):"[".concat(i,"]")}function h(e,t){var i=e.getAttribute("aria-describedby");if(!i)return"";var a=i.split(/\s+/).map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){var t;return null===(t=e.textContent)||void 0===t?void 0:t.trim()}).filter(function(e){return!!e}).join(" ");return a&&0!==a.length?"item"===t?", ".concat(a,""):', "'.concat(a,'"'):""}function g(e){var t="";return(e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled"))&&(t+=", disabled"),(e.hasAttribute("readonly")||"true"===e.getAttribute("aria-readonly"))&&(t+=", read only"),(e.hasAttribute("required")||"true"===e.getAttribute("aria-required"))&&(t+=", required","SELECT"===e.nodeName.toUpperCase()&&e.validity.valueMissing&&(t+=", invalid entry")),"true"===e.getAttribute("aria-invalid")&&(t+=", invalid"),t}function b(e){var t=e.getElement();if(!t)return!1;for(var i=new o.DOMWalker(t,!1,t,!1);i.nextNode();)if(1===i.node.nodeType&&!i.bEndTag){var a=r.AriaUtil.getResolvedRole(i.node);if(a&&l.ARIADefinitions.designPatterns[a]&&"widget"===l.ARIADefinitions.designPatterns[a].roleType)return!0}return!1}t.quoteNamePadAfter=u,t.quoteNamePadBefore=d,t.quoteName=c,t.getRoleDescription=m,t.getLinkAnnouncement=p,t.RULES=[new n.SRRendererRule({roles:["button"],elems:[],modes:["item","button","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"true"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"false"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", not pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isEndTag()){var a="",n=e.getElement(),r=m(e,"button");return["menu","true"].includes(n.getAttribute("aria-haspopup"))&&(a+=", menu"),n.hasAttribute("aria-expanded")&&(a+=", ".concat("true"===n.getAttribute("aria-expanded")?"expanded":"collapsed")),a+=g(n),"[".concat(u(e)).concat(r).concat(a).concat(h(n,i),"]")}},function(e){if(e.isEndTag())return""}]}),new n.SRRendererRule({roles:["checkbox"],elems:[],modes:["item","checkbox","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a=e.getNode(),n=m(e,"checkbox"),r="";return r="mixed"===a.getAttribute("aria-checked")?"half checked":(a.hasAttribute("aria-checked")?"true"===a.getAttribute("aria-checked"):a.checked)?"checked":"not checked",r+=g(e.getElement()),"[".concat(n,", ").concat(r).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["cell","columnheader","rowheader"],elems:[],modes:["item","table"],tests:[function(e){var t;if(!e.isStartTag())return null;var i=e.getElement();if(!i)return null;var a=(null===(t=i.textContent)||void 0===t?void 0:t.trim())||"",n=new o.DOMWalker(i,!1,i,!1),s=a.length>0;if(!s)for(;n.nextNode();)if(1===n.node.nodeType&&!n.bEndTag){var u=n.node,d=r.AriaUtil.getResolvedRole(u);if(d&&l.ARIADefinitions.designPatterns[d]){s=!0;break}if("IMG"===u.nodeName.toUpperCase()&&u.hasAttribute("alt")){s=!0;break}}return s?null:"[blank]"}]}),new n.SRRendererRule({roles:["combobox"],elems:[],modes:["item","combo","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=m(e,"combo box"),i=e.getElement(),n="";if("SELECT"===e.getNode().nodeName.toUpperCase()){n=", collapsed";var r=e.getElement(),l=r.selectedIndex>=0?r.options[r.selectedIndex]:null,o="";return l&&(o=d(new a.SRCursor(l,!1),", ")),n+=g(i),"[".concat(u(e)).concat(t).concat(n).concat(o,"]")}if("INPUT"===e.getNode().nodeName.toUpperCase())return i.hasAttribute("aria-expanded")&&(n=", ".concat("true"===i.getAttribute("aria-expanded")?"expanded":"collapsed")),n+=g(i),"[".concat(u(e)).concat(t).concat(n,", has auto complete, editable, opens list]");i.hasAttribute("aria-expanded")&&(n=", ".concat("true"===i.getAttribute("aria-expanded")?"expanded":"collapsed"),i.hasAttribute("aria-autocomplete")&&(n+=", has auto complete")),n+=g(i),o="";var s=i.getAttribute("aria-controls"),c=s?document.getElementById(s):null;if(c){var p=c.querySelector("[role='option'][aria-selected='true']");p&&(o=', "'.concat((p.textContent||"").trim(),'"'))}if(!o){var h=(i.textContent||"").trim();h&&(o=', "'.concat(h,'"'))}return"[".concat(u(e)).concat(t).concat(n).concat(o,"]")}]}),new n.SRRendererRule({roles:["listbox"],elems:[],modes:["item","combo","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=m(e,"list box"),i=e.getElement(),n="";if("SELECT"===e.getNode().nodeName.toUpperCase()){var r=e.getElement(),l=Array.from(r.options).filter(function(e){return e.selected}).map(function(e){return d(new a.SRCursor(e,!1),", ")}).join("");return n+=g(i),"[".concat(u(e)).concat(t).concat(n).concat(l,"]")}n+=g(i);var o=(i.textContent||"").trim(),s=o?', "'.concat(o,'"'):"";return"[".concat(u(e)).concat(t).concat(n).concat(s,"]")}]}),new n.SRRendererRule({roles:["default"],elems:[],modes:["item"],tests:[function(e){var t;return e.isStartTag()?"!!<".concat(e.getRole(),">").concat((null===(t=e.getNameInfo())||void 0===t?void 0:t.name)+"","!!"):"!!</".concat(e.getRole(),">!!")}]}),new n.SRRendererRule({roles:["deletion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[deleted]":""}]}),new n.SRRendererRule({roles:["dialog"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[End of dialog]":"[Start of dialog".concat(d(e))}]}),new n.SRRendererRule({roles:["generic","paragraph"],elems:["DIV","SPAN","P","SECTION","ARTICLE","HEADER","FOOTER","MAIN","ASIDE","NAV","LI","TD","TH","PRE","BLOCKQUOTE","FIGURE","FIGCAPTION","DETAILS","SUMMARY"],modes:["item","tab_focus"],tests:[function(e,t,i){var a,n=e.getElement();if(!n)return null;var r=n.getAttribute("contenteditable");if("true"!==r&&""!==r)return null;if(n.hasAttribute("role"))return null;var l="paragraph"===e.getRole()||"P"===n.nodeName.toUpperCase();if(e.isEndTag())return"item"===i?l?"[out of paragraph]":"[out of section]":"";var o="";(n.hasAttribute("disabled")||"true"===n.getAttribute("aria-disabled"))&&(o=", disabled");var s=l?"paragraph":"section",d=e.getNameInfo(),c=!d||["content","text"].includes(d.nameFrom),m="tab_focus"!==i||c?"":null===(a=n.textContent)||void 0===a?void 0:a.trim(),p=m?" ".concat(m):"";return"[".concat(u(e)).concat(s,", editable").concat(o,"]").concat(p)}]}),new n.SRRendererRule({roles:["document","generic"],elems:[],modes:["item"],tests:[function(){return""}]}),new n.SRRendererRule({roles:["graphics-document"],elems:[],modes:["item","image"],tests:[function(e){var t,i;return e.isStartTag()&&!(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&""!==(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]":null},function(e){var t;return e.isStartTag()&&""===(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)?"":null},function(e){var t;return e.isStartTag()&&(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&"[graphic".concat(d(e),"]")||null},function(e){return e.isEndTag()?"":null}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&e.isStartTag())return"";if("item"===i&&e.isEndTag())return"";var a,n=e.getElement();a=n.ariaLevel?n.ariaLevel:"heading"===n.getAttribute("role")?"2":n.nodeName.substring(1);var r=e.getNameInfo();return r&&!["content","text"].includes(r.nameFrom)||(n.textContent||"").trim()?r&&!["content","text"].includes(r.nameFrom)?"[heading level ".concat(a).concat(d(e),"]"):"[heading level ".concat(a,"]"):""}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["heading","h1","h2","h3","h4","h5","h6"],tests:[function(e){if(e.isStartTag()){var t,i=e.getNode();t=i.ariaLevel?i.ariaLevel:"heading"===i.getAttribute("role")?"2":i.nodeName.substring(1);var a=e.getNameInfo();return a&&!["content","text"].includes(a.nameFrom)||(i.textContent||"").trim()?"[".concat(u(e),"heading level ").concat(t,"]"):""}return""}]}),new n.SRRendererRule({roles:["img"],elems:[],modes:["item","image"],tests:[function(e){var t,i,a;return e.isEndTag()?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""===(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?""===(null===(a=e.getNameInfo())||void 0===a?void 0:a.name)?"":"[graphic".concat(d(e),"]"):e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]"}]}),new n.SRRendererRule({roles:["insertion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[inserted]":""}]}),new n.SRRendererRule({roles:["link"],elems:[],modes:["item","region","link","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&!["content","text"].includes(null===(a=e.getNameInfo())||void 0===a?void 0:a.nameFrom)?p(e,i):null}]}),new n.SRRendererRule({roles:["listitem"],elems:[],modes:["item"],tests:[function(e){for(var t,i,a,n=o.DOMWalker.parentNode(e.getNode());void 0===i&&n;)1===n.nodeType&&((p=n).hasAttribute("role")?"list"===p.getAttribute("role")&&(i=!1,a=p):"UL"===p.nodeName.toUpperCase()?(i=!1,a=p):"OL"===p.nodeName.toUpperCase()&&(i=!0,a=p)),n=o.DOMWalker.parentNode(n);var r=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",l="";if(i){var s=1;if(a&&"OL"===a.nodeName.toUpperCase()&&a.hasAttribute("start")){var u=parseInt(a.getAttribute("start")||"1",10);s=isNaN(u)?1:u}for(var d=e.getElement(),c=o.DOMWalker.previousSiblingNotOwnedBySlot(d);c;){if(1===c.nodeType){var m=c;"listitem"!==m.getAttribute("role")&&"LI"!==m.nodeName.toUpperCase()||s++}c=o.DOMWalker.previousSiblingNotOwnedBySlot(c)}l=e.isStartTag()?"".concat(s,". ").concat(r):""}else{var p;l="LI"===(p=e.getElement()).nodeName.toUpperCase()&&"none"===window.getComputedStyle(p).listStyleType||"LI"!==p.nodeName.toUpperCase()?e.isStartTag()?"".concat(r):"":e.isStartTag()?"[bullet] ".concat(r):""}return l}]}),new n.SRRendererRule({roles:["math"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[math content]":""}]}),new n.SRRendererRule({roles:["menuitem"],elems:[],modes:["item","tab_focus","region"],tests:[function(e){var t="";if(e.isStartTag()){var i="",a=e.getElement();"true"===a.getAttribute("aria-haspopup")&&(i+=", sub-menu"),a.hasAttribute("aria-expanded")&&(i+=", ".concat("true"===a.getAttribute("aria-expanded")?"expanded":"collapsed")),t="[menu".concat(i);var n=e.getNameInfo();n&&!["content","text"].includes(n.nameFrom)&&(t+=d(e)),t+="]"}return t}]}),new n.SRRendererRule({roles:["meter"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["progressbar"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["radio"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a,n=m(e,"radio button");a=e.getElement().hasAttribute("aria-checked")?"true"===e.getElement().getAttribute("aria-checked"):e.getNode().checked;var r=g(e.getElement());return"[".concat(n,", ").concat(a?"checked":"not checked").concat(r).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["searchbox"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[".concat(u(e),"edit]"):""}]}),new n.SRRendererRule({roles:["separator"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[separator]":""}]}),new n.SRRendererRule({roles:["slider"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"slider"),n=e.getElement(),r=n.hasAttribute("aria-valuenow")?n.getAttribute("aria-valuenow"):e.getNode().value;return"[".concat(u(e)).concat(a,", ").concat(r).concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["spinbutton"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"spinbutton");return"[".concat(u(e)).concat(a,", editable").concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["tab"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(!e.isStartTag())return"";var t=m(e,"tab");return"[".concat(t).concat("true"===e.getNode().getAttribute("aria-selected")?", selected":"").concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tablist"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[group start".concat(d(e),"]"):"[group end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tabpanel"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[Tab panel start".concat(d(e),"]"):"[Tab panel end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["item","link","tab_focus","region"],tests:[function(e){var t,i,a,n;if(e.isEndTag()||!(null===(t=e.getParentElement())||void 0===t?void 0:t.getElement()))return null;var r=null===(i=e.getParentElement())||void 0===i?void 0:i.getElement();return"line-through"===r.ownerDocument.defaultView.getComputedStyle(r).textDecorationLine?"[strikethrough] ".concat((null===(a=e.getNameInfo())||void 0===a?void 0:a.name)+""," [end strikethrough]"):"".concat((null===(n=e.getNameInfo())||void 0===n?void 0:n.name)+"")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["heading"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["textbox"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){var a,n=e.getElement();if(e.isEndTag())return"item"===i&&"TEXTAREA"===n.nodeName.toUpperCase()?"[out of edit]":"";if(!e.isStartTag())return"";var r="";n.hasAttribute("placeholder")&&n.getAttribute("placeholder").trim().length>0&&(r+=", placeholder: ".concat(n.getAttribute("placeholder"))),r+=g(n);var l="TEXTAREA"===n.nodeName.toUpperCase()||"true"===n.getAttribute("aria-multiline"),o=h(n,i);if(l){var s="tab_focus"===i?null===(a=n.textContent)||void 0===a?void 0:a.trim():"",d=s?" ".concat(s):"";return"[".concat(u(e),"edit, multiline").concat(r).concat(o,"]").concat(d)}return"[".concat(u(e),"edit").concat(r).concat(o,"]")}]}),new n.SRRendererRule({roles:["treeitem"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=e.getElement(),i="[treeview item";"true"===t.getAttribute("aria-selected")&&(i+=", selected"),t.hasAttribute("aria-expanded")&&(i+="true"===t.getAttribute("aria-expanded")?", expanded":", collapsed");var a=t.getAttribute("aria-level");if(a)i+=", level ".concat(a);else{for(var n=1,l=o.DOMWalker.parentElement(t);l;){var s=r.AriaUtil.getResolvedRole(l);if("group"===s||"tree"===s)for(var u=o.DOMWalker.parentElement(l);u;){var d=r.AriaUtil.getResolvedRole(u);if("treeitem"===d){n++;break}if("tree"===d)break;u=o.DOMWalker.parentElement(u)}l=o.DOMWalker.parentElement(l)}n>1&&(i+=", level ".concat(n))}var c=t.getAttribute("aria-posinset"),m=t.getAttribute("aria-setsize");if(!c||!m){var p=0,h=0,g=o.DOMWalker.parentElement(t);if(g)for(var b=o.DOMWalker.firstChildNotOwnedBySlot(g);b;){if(1===b.nodeType){var _=b;"treeitem"===r.AriaUtil.getResolvedRole(_)&&(h++,_===t&&(p=h))}b=b.nextSibling}c=p.toString(),m=h.toString()}return i+", ".concat(c," of ").concat(m,"] ")}]}),new n.SRRendererRule({roles:[],elems:["PRE"],modes:["item"],tests:[function(e){var t,i;if(e.isEndTag())return"";if(void 0===e.preLineIndex)return null;for(var a=(null!==(t=e.getNode().textContent)&&void 0!==t?t:"").split("\n"),n=0;n<a.length&&""===a[n].trim();)n++;for(var r=a.length-1;r>=n&&""===a[r].trim();)r--;return null!==(i=a.slice(n,r+1)[e.preLineIndex])&&void 0!==i?i:""}]}),new n.SRRendererRule({roles:[],elems:["BODY"],modes:["item","tab_focus"],tests:[function(e){if(e.getNode().ownerDocument!==document)return"";var t=e.getNode().ownerDocument.title;return e.isEndTag()?"[End of document".concat(t.trim().length>0?": "+t.trim():"","]"):"[Start of document".concat(t.trim().length>0?": "+t.trim():"","]")}]}),new n.SRRendererRule({roles:[],elems:["IFRAME"],modes:["tab_focus"],tests:[function(e){if(e.isEndTag())return null;var t=e.getElement().getAttribute("role"),i="none"===t||"presentation"===t;if(i&&!e.getName())return null;var a=i?"grouping":"frame";return"[".concat(u(e)).concat(a,"]")}]}),new n.SRRendererRule({roles:[],elems:["BR"],modes:["item"],tests:[function(e){try{for(var t=e.clone();t.previous(function(){return!0})&&"BR"!==t.getNode().nodeName.toUpperCase()&&t.getNameInfo()&&0===t.getNameInfo().name.trim().length;);return"BR"===t.getNode().nodeName.toUpperCase()?"[blank]":null}catch(e){console.error(e)}}]}),new n.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:[],elems:["INPUT"],modes:["item","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&"password"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))&&"[".concat(u(e),"edit, protected").concat(h(e.getElement(),i),"]")||null},function(e,t,i){var a,n;if(e.isStartTag()&&"file"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var r=(null===(n=e.getElement())||void 0===n?void 0:n.value)||"";return r=""===r?"No file chosen":r.substring(12),"[".concat(u(e),"button").concat(h(e.getElement(),i),"] [").concat(u(e)).concat(r,"]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"color"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r=(100*Number("0x".concat(n.substring(1,3)))/Number("0xff")).toFixed(0),l=(100*Number("0x".concat(n.substring(3,5)))/Number("0xff")).toFixed(0),o=(100*Number("0x".concat(n.substring(5)))/Number("0xff")).toFixed(0);return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [").concat(r,"% red ").concat(l,"% green ").concat(o,"% blue]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"month"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0";if(n.trim().length>0){var o=new Date(n);r=""+o.getFullYear(),l=""+(o.getMonth()+1)}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"] [spin button, ").concat(r,"] [menu button] [subMenu] Show month picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"date"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0",o="0";if(n.trim().length>0){var s=new Date(n);r=""+s.getFullYear(),l=""+(s.getMonth()+1),o=""+s.getDate()}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"] / [spin button, ").concat(o,"] / [spin button, ").concat(r,"] [menu button] [subMenu] Show date picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"datetime-local"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0",o="0",s="0",d="0",c="0";if(n.trim().length>0){var m=new Date(n);r=""+m.getFullYear(),l=""+(m.getMonth()+1),o=""+m.getDate(),s=0===m.getHours()||12===m.getHours()?"12":m.getHours()<12?""+m.getHours():""+(m.getHours()-12),d=""+m.getMinutes(),c=m.getHours()>=12?"pm":"am"}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"] / [spin button, ").concat(o,"] / [spin button, ").concat(r,"] [spin button, ").concat(s,"] : [spin button, ").concat(d,"] [spin button, ").concat(c,"] [menu button] [subMenu] Show local date and time picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"time"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0",o="0";if(n.trim().length>0){var s=n.split(":"),d=parseInt(s[0]);r=0===d||12===d?"12":d<12?""+d:""+(d-12),l=s[1],o=d>=12?"pm":"am"}return"[".concat(u(e),"grouping clickable").concat(h(e.getElement(),i)," [spin button, ").concat(r,"] : [spin button, ").concat(l,"] [spin button, ").concat(o,"] [menu button] [subMenu] Show time picker [out of grouping]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"week"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0";if(n.trim().length>0){var o=n.split(/-W/);r=o[0],l=o[1]}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"], [spin button, ").concat(r,"] [menu button] [subMenu] Show week picker")}return null},function(e){var t;return"hidden"===(null===(t=e.getElement())||void 0===t?void 0:t.getAttribute("type"))?"":null},function(e){return e.isStartTag()&&"!![".concat(u(e),"input!!]").concat(e.getElement().outerHTML)||null}]}),new n.SRRendererRule({roles:[],elems:["LI"],modes:["item"],tests:[function(e){var t,i=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",a=e.getElement();return"none"===window.getComputedStyle(a).listStyleType?e.isStartTag()?"".concat(i):"":e.isStartTag()?"[bullet] ".concat(i):""}]}),new n.SRRendererRule({roles:[],elems:["MFRAC"],modes:["item"],tests:[function(e){return e.isStartTag()?"[fraction]":"[end fraction]"}]}),new n.SRRendererRule({roles:[],elems:["MROW"],modes:["item"],tests:[function(e){var t;if(!e.isStartTag()){var i=e.getCurrentOrParentByRoleClone([],["mfrac"]);return i&&(null===(t=i.getElement().querySelectorAll("mrow")[0])||void 0===t?void 0:t.isSameNode(e.getNode()))?"[over]":void 0}}]}),new n.SRRendererRule({roles:[],elems:["MSQRT"],modes:["item"],tests:[function(e){return e.isStartTag()?"[square root]":"[end root]"}]}),new n.SRRendererRule({roles:[],elems:["MSUP"],modes:["item"],tests:[function(e){var t,i;if(!e.isEndTag()){var a=(null===(t=e.getElement().querySelector("mi"))||void 0===t?void 0:t.innerHTML)||"",n=(null===(i=e.getElement().querySelector("mn"))||void 0===i?void 0:i.innerHTML)||"";return"2"===n?"".concat(a," [squared]"):"3"===n?"".concat(a," [cubed]"):"".concat(a," [to the ").concat(n,"]")}}]}),new n.SRRendererRule({roles:[],elems:["SUMMARY"],modes:["item","button","tab_focus"],tests:[function(e,t,i){var a,n;if(e.isEndTag())return"";var r=e.getElement();if(!r)return null;var l=r.parentElement;if(!l||"DETAILS"!==l.nodeName.toUpperCase())return null;var o=Array.from(l.children).find(function(e){return"SUMMARY"===e.nodeName.toUpperCase()});if(!o||!o.isSameNode(r))return null;var s=l.hasAttribute("open")?"expanded":"collapsed",u=null===(a=r.getAttribute("aria-label"))||void 0===a?void 0:a.trim(),d=(null===(n=r.textContent)||void 0===n?void 0:n.trim())||"",c=u||d,m=c?'"'.concat(c,'", '):"",p=h(r,i);return!p&&u&&d&&(p="item"===i?", ".concat(d,""):', "'.concat(d,'"')),"[".concat(m,"button, ").concat(s).concat(p,"]")}]}),new n.SRRendererRule({roles:["article","banner","blockquote","caption","cell","code","columnheader","complementary","contentinfo","figure","form","group","list","main","mark","navigation","region","row","rowheader","search","table","toolbar"],elems:[],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["paragraph","rowgroup","status","strong","subscript","superscript","term","time","none","presentation"],elems:[],modes:["item"],tests:[function(e){return""}]})]},8485(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(369),r=i(7242),l=i(7011),o=i(9910),s=i(7139);function u(e,t){var i;t&&"#text"===(null===(i=t.getNode())||void 0===i?void 0:i.nodeName)&&(t=t.clone()).previous(function(){return!0});var a=n.SRTableUtil.getTableModel(e),r=n.SRTableUtil.getCellModel(t,a),l=n.SRTableUtil.getCellModel(e,a);if(!l)return"";var o=[];if(!r||r.rowIndexStart!==l.rowIndexStart||r.rowspan!==l.rowspan){var s=n.SRTableUtil.getRowHeadersForCursor(e,a),u=s&&s.trim().length>0?'"'.concat(s,'", '):"";o.push("[".concat(u,"row ").concat(l.rowIndexStart+1).concat(l.rowspan>1?" through "+(l.rowIndexStart+l.rowspan):"","]"))}if(!r||r.colIndexStart!==l.colIndexStart||r.colspan!==l.colspan){var d=n.SRTableUtil.getColumnHeadersForCursor(e,a);u=d&&d.trim().length>0?'"'.concat(d,'", '):"",o.push("[".concat(u,"column ").concat(l.colIndexStart+1).concat(l.colspan>1?" through "+(l.colIndexStart+l.colspan):"","]"))}return o.join(" ")}t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item","article","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"article");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"banner region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item","region"],tests:[function(e){return"[blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item","region"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:["cell"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["columnheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"complementary region]"):null}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"content info region]"):null}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[section]":"[".concat((0,r.quoteNamePadAfter)(e),"form region]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item","region"],tests:[function(e){var t;if("DETAILS"===e.getNode().nodeName.toUpperCase()){var i=e.getElement();return Array.from(i.children).some(function(e){return"SUMMARY"===e.nodeName.toUpperCase()})?"":'["Details", button, '.concat(i.hasAttribute("open")?"expanded":"collapsed","]")}return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"[grouping".concat((0,r.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["tab_focus"],tests:[function(e){var t;if("DETAILS"===e.getNode().nodeName.toUpperCase()){var i=e.getElement();return Array.from(i.children).some(function(e){return"SUMMARY"===e.nodeName.toUpperCase()})?null:'["Details", button, '.concat(i.hasAttribute("open")?"expanded":"collapsed","]")}return null===e.getNameInfo()?null:(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t||t.getNode().nodeName.toUpperCase(),"")}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item","list"],tests:[function(e){for(var t,i=e.getNode(),a=document.evaluate(".//li | .//*[@role='listitem']",i,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),n=0,s=0;s<a.snapshotLength;s++){for(var u=!1,d=!1,c=a.snapshotItem(s).parentElement;c&&c!==i;){var m=l.AriaUtil.getResolvedRole(c);if("list"===m||"UL"===c.nodeName.toUpperCase()||"OL"===c.nodeName.toUpperCase()){u=!0;break}if(m&&(null===(t=o.ARIADefinitions.designPatterns[m])||void 0===t?void 0:t.presentationalChildren)){d=!0;break}c=c.parentElement}u||d||n++}return 0===n?null:"[".concat((0,r.quoteNamePadAfter)(e),"list of ").concat(n," items]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"main region]"):null}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);console.log("MENUBAR",e.isEndTag()?"/":"",e.getNode()),console.log(i,a);var n=i.snapshotLength-a.snapshotLength;return 0===n?null:"[".concat((0,r.quoteNamePadAfter)(e),"menubar with ").concat(n," items]")}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"navigation region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return null===e.getNameInfo()?null:"[grouping".concat((0,r.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if(null===e.getNameInfo())return null;if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["row"],elems:[],modes:["item","table"],tests:[function(){return""}]}),new a.SRRendererRule({roles:["rowheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"search region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item","table"],tests:[function(e){for(var t=e.clone();"table"!==t.getRole()&&t.previous(function(){return!0}););var i=t.getNode(),a=0,n=0;if(t.getNode().firstChild)for(var l=!1;t.next(function(){return!0})&&!t.getNode().isSameNode(i);){var o=t.getRole();if(t.isStartTag()){if("row"===o)++a;else if(!l&&["cell","rowheader","columnheader"].includes(o)){var s=t.getNode();n+=parseInt(s.getAttribute("colspan")||"1")}}else"row"===o&&(l=!0)}return"[table with ".concat(a," ").concat(1===a?"row":"rows"," and ").concat(n," ").concat(1===n?"column":"columns").concat((0,r.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"toolbar]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//dt",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotLength;return"[".concat((0,r.quoteNamePadAfter)(e),"definition list of ").concat(i," terms]")}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[highlighted]"}]}),new a.SRRendererRule({roles:[],elems:["IFRAME"],modes:["item"],tests:[function(e){var t=e.getElement().getAttribute("role"),i="none"===t||"presentation"===t;if(i&&!e.getName())return null;var a=i?"grouping":"frame";return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:[],elems:["PRE"],modes:["item"],tests:[function(e){return"[".concat((0,r.quoteNamePadAfter)(e),"preformatted text]")}]}),new a.SRRendererRule({roles:["article","banner","blockquote","caption","cell","columnheader","complementary","contentinfo","figure","form","group","region","row","rowheader","search","toolbar","list","main","navigation","table"],elems:[],modes:["heading"],tests:[function(){return""}]})]},2099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(7242);t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"article");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"banner region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item"],tests:[function(e){return"[out of blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"complementary region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"content info region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[out of figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[out of section]":"[out of form]"}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item"],tests:[function(e){var t;return"DETAILS"===e.getNode().nodeName.toUpperCase()?"":null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"[out of grouping]"}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//li | .//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);return 0===i.snapshotLength-a.snapshotLength?null:"[".concat((0,n.quoteNamePadAfter)(e),"out of list]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"main region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){return"[out of menubar]"}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"navigation region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return"[out of grouping]"}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item"],tests:[function(e){if(null===e.getNameInfo())return null;var t=(0,n.getRoleDescription)(e,"region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"search region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item"],tests:[function(e){return"[out of table]"}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item"],tests:[function(e){return"[out of toolbar]"}]}),new a.SRRendererRule({roles:[],elems:["ABBR"],modes:["item"],tests:[function(e){return e.getElement().hasAttribute("title")?"[".concat(e.getElement().getAttribute("title"),"]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return"[out of definition list]"}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[out of highlighted]"}]}),new a.SRRendererRule({roles:[],elems:["IFRAME"],modes:["item"],tests:[function(e){var t=e.getElement().getAttribute("role"),i="none"===t||"presentation"===t;return i&&!e.getName()?null:i?"[out of grouping]":"[out of frame]"}]}),new a.SRRendererRule({roles:[],elems:["PRE"],modes:["item"],tests:[function(e){return"[out of preformatted text]"}]}),new a.SRRendererRule({roles:["group","article","banner","blockquote","caption","complementary","contentinfo","figure","form","list","region","main","navigation","search","table","toolbar"],elems:[],modes:["region","heading"],tests:[function(){return""}]})]},2151(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CONTAINER_EXIT_RULES=t.CONTAINER_ENTER_RULES=t.SR_RULES=void 0;var a=i(7242),n=i(8485),r=i(2099);t.SR_RULES=a.RULES,t.CONTAINER_ENTER_RULES=n.RULES,t.CONTAINER_EXIT_RULES=r.RULES},1950(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.AccNameUtil=void 0;var a=i(9910),n=i(7139),r=i(7011),l=i(3946),o=i(4566),s=i(3864),u=i(1686),d=function(){function e(){}return e.computeAccessibleNameForSVGElementW3C=function(e){if(!e||"svg"!==e.nodeName.toLowerCase())return null;var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a="",o=e.querySelectorAll("text, textPath, tspan");if(o&&o.length>0&&(o.forEach(function(e){if(!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(a+=" "+t.trim())}}),""!==a.trim()))return{name:n.CommonUtil.truncateText(a.trim()),nameFrom:"svgText"};for(var s=e.querySelectorAll("a"),u=0;u<s.length;u++){var d=s[u];if(!l.VisUtil.isNodeHiddenFromAT(d)&&!l.VisUtil.isNodePresentational(d)){var c=d.getAttribute("xlink:title");if(c&&""!==c.trim())return{name:n.CommonUtil.truncateText(c),nameFrom:"svglinkTitle"}}}var m=r.AriaUtil.getAriaDescription(e);if(m&&""!==m.trim())return{name:n.CommonUtil.truncateText(m),nameFrom:"aria-description"};var p=e.querySelectorAll(":scope > desc");if(p&&p.length>0){var h="";if(p.forEach(function(e){if(!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(h+=" "+t.trim())}}),""!==h.trim())return{name:h.trim(),nameFrom:"svgDesc"}}if(e.hasAttribute("title")){var g=e.getAttribute("title");if(g&&""!==g.trim())return{name:n.CommonUtil.truncateText(g),nameFrom:"title"}}return null},e.computeAccessibleName=function(t){if(!t)return null;var i=t.nodeName.toLowerCase(),l=o.CacheUtil.getCache(t,"ELEMENT_ACCESSBLE_NAME",void 0);if(void 0!==l)return l;var s=r.AriaUtil.getAriaLabel(t);if(s&&""!==s.trim())return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"}),{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"};if(l=e.computeAccessibleNameForNativeElement(t))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",l),l;var u=r.AriaUtil.getResolvedRole(t);if(a.ARIADefinitions.designPatterns[u]&&a.ARIADefinitions.designPatterns[u].nameFrom.includes("contents")&&(l=e.computeAccessibleNameFromContent(t)))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",l),l;if(t.hasAttribute("title")){var d=t.getAttribute("title").trim();if(d&&d.trim().length>0)return d=n.CommonUtil.truncateText(d),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:d,nameFrom:"title"}),{name:d,nameFrom:"title"}}if("textarea"===i||"input"===i&&(!t.hasAttribute("type")||n.CommonUtil.input_type_with_placeholder.includes(t.getAttribute("type")))){var c=t.getAttribute("placeholder");if(c&&c.trim().length>0)return c=n.CommonUtil.truncateText(c),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:c,nameFrom:"placeholder"}),{name:c,nameFrom:"placeholder"}}return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",null),null},e.computeAccessibleNameForNativeElement=function(t){var i,a,r=t.nodeName.toLowerCase();if(n.CommonUtil.form_labelable_elements.includes(r)&&(p=n.CommonUtil.getFormFieldLabel(t))&&""!==p.trim())return{name:n.CommonUtil.truncateText(p),nameFrom:"label"};if("input"===r&&t.hasAttribute("type"))if(n.CommonUtil.form_button_types.includes(t.getAttribute("type"))){var o=n.CommonUtil.getElementAttribute(t,"value");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"value"};var s=t.getAttribute("type");if("submit"===s||"reset"===s)return{name:s,nameFrom:"internal"}}else if("image"===t.getAttribute("type")&&(b=n.CommonUtil.getElementAttribute(t,"alt"))&&""!==b.trim())return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("button"===r){if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var d=t.querySelector("img");if(d&&!l.VisUtil.isNodeHiddenFromAT(d)&&!l.VisUtil.isNodePresentational(d)&&(a=e.computeAccessibleName(d))&&a.name&&a.name.trim().length>0)return a;var c=t.querySelector("svg");if(c&&!l.VisUtil.isNodeHiddenFromAT(c)&&!l.VisUtil.isNodePresentational(c)&&(a=e.computeAccessibleName(c))&&a.name&&a.name.trim().length>0)return a}if("fieldset"===r&&(i=t.firstElementChild)&&"legend"===i.nodeName.toLowerCase()&&(v=i.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("output"===r&&t.hasAttribute("for")){var m=t.getAttribute("for").trim().split(" ");if(m&&m.length>0){for(var p="",h=0;h<m.length;h++){var g=t.ownerDocument.getElementById(m[h]);!g||u.DOMUtil.sameNode(g,t)||l.VisUtil.isNodeHiddenFromAT(g)||l.VisUtil.isNodePresentational(g)||(a=e.computeAccessibleName(g))&&a.name&&a.name.trim().length>0&&(p+=" "+n.CommonUtil.normalizeSpacing(a.name))}if(p.trim().length>0)return{name:n.CommonUtil.truncateText(p),nameFrom:"label"}}}if("summary"===r&&(v=t.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("details"===r)return(i=t.firstElementChild)&&"summary"===i.nodeName.toLowerCase()&&(a=e.computeAccessibleName(i))&&a.name&&a.name.trim().length>0?{name:n.CommonUtil.truncateText(a.name.trim()),nameFrom:"summary"}:{name:"details",nameFrom:"internal"};if("figure"===r&&(_=n.CommonUtil.getChildByTagHidden(t,"figcaption",!0,!1))&&_.length>0&&(v=_[0].innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"figcaption"};if("img"===r&&t.hasAttribute("alt")){var b=t.getAttribute("alt");return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"}}if("area"===r&&t.hasAttribute("alt")&&(b=t.getAttribute("alt"))&&b.trim().length>0)return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("table"===r){var _,f=t.firstElementChild;if(f&&"caption"===f.nodeName.toLowerCase()&&(_=f.innerText)&&_.trim().length>0)return{name:n.CommonUtil.truncateText(_),nameFrom:"caption"}}if("a"===r){var v;if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var A=t.querySelectorAll(":scope > img, :scope > svg");if(A&&A.length>0){var w="";if(A.forEach(function(t){if(!l.VisUtil.isNodeHiddenFromAT(t)&&!l.VisUtil.isNodePresentational(t)){var i=e.computeAccessibleName(t);i&&i.name&&i.name.trim().length>0&&(w+=" "+i.name.trim())}}),""!==w.trim())return{name:w.trim(),nameFrom:"alt"}}}return("optgroup"===r||"option"===r||"track"===r)&&(p=t.getAttribute("label"))&&p.trim().length>0?{name:n.CommonUtil.truncateText(p),nameFrom:"label"}:"svg"===r&&(a=e.computeAccessibleNameForSVGElementW3C(t))&&a.name&&a.name.trim().length>0?a:null},e.computeAccessibleNameForSVGElement=function(e){var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a=e.querySelector("a");if(a&&!l.VisUtil.isNodeHiddenFromAT(a)&&!l.VisUtil.isNodePresentational(a)){var o=a.getAttribute("xlink:title");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"svglinkTitle"}}var s="";if(e.querySelectorAll(":scope > *").forEach(function(e){if("svg"!==e.nodeName.toLowerCase()&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=n.CommonUtil.getInnerText(e);t&&t.trim().length>0&&(s+=t)}}),""!==s.trim())return{name:n.CommonUtil.truncateText(s),nameFrom:"svgText"};var u=r.AriaUtil.getAriaDescription(e);if(u&&u.trim().length>0)return{name:n.CommonUtil.truncateText(u),nameFrom:"aria-description"};var d=e.querySelectorAll(":scope > desc");if(d&&d.length>0){var c="";if(d.forEach(function(e){if(e&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(c+=t.trim())}}),c&&""!==c.trim())return{name:c.trim(),nameFrom:"svgDesc"}}},e.computeAccessibleNameFromContent=function(t){var i=t.nodeName.toLowerCase(),a=(r.AriaUtil.getResolvedRole(t),e.computeAccessibleNameForCSSPseudoElement(t,"before"));return null!==a&&a.name&&a.name.trim().length>0||(a=e.computeAccessibleNameForCSSPseudoElement(t,"after"))&&a.name&&a.name.trim().length>0?a:t.shadowRoot&&(a=e.computeAccessibleNameForShadowHost(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"shadow"}:"slot"===i&&(a=e.computeAccessibleNameForSlotElement(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"slot"}:(a=e.computeAccessibleNameFromChildren(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"content"}:null},e.computeAccessibleNameForCSSPseudoElement=function(e,t){var i=e.ownerDocument.defaultView.getComputedStyle(e,t);if(i){var a=i.content;if(a&&"none"!==a&&"no"!==a&&"normal"!==a&&(a=a.replace(/^"/,"").replace(/"$/,"")).trim().length>0)return{name:n.CommonUtil.truncateText(a),nameFrom:"css-"+t}}return null},e.computeAccessibleNameForShadowHost=function(t){var i="",a=t.shadowRoot;return a&&a.querySelectorAll("*").forEach(function(t){var a=e.computeAccessibleName(t);a&&a.name&&a.name.trim().length>0&&(i+=" "+a.name.trim())}),i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"shadow-host"}:null},e.computeAccessibleNameForSlotElement=function(t){var i="";if(t.assignedNodes()&&0!==t.assignedNodes().length)for(var a=0,r=t.assignedNodes();a<r.length;a++){var l,o=r[a];(l=e.computeAccessibleName(o))&&l.name&&l.name.length>0&&(i+=" "+l.name.trim())}else(l=e.computeAccessibleName(t))&&l.name&&l.name.trim().length>0&&(i+=" "+l.name.trim());return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content-slot"}:null},e.computeAccessibleNameFromChildren=function(t){for(var i="",a=new s.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){var o=a.node;if(3===o.nodeType){var u=o.parentElement;!l.VisUtil.isNodeHiddenFromAT(u)&&!l.VisUtil.isNodePresentational(u)&&o.nodeValue&&o.nodeValue.trim().length>0&&(i+=" "+o.nodeValue.trim())}else if(1===o.nodeType&&!l.VisUtil.isNodeHiddenFromAT(o)&&!l.VisUtil.isNodePresentational(o)){var d=e.computeAccessibleName(o);d&&d.name&&d.name.length>0?(i+=" "+d.name.trim(),a.bEndTag=!0):r.AriaUtil.containsPresentationalChildrenOnly(a.node)&&(a.bEndTag=!0)}}return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content"}:null},e.isAccessibleNameIgnorable=function(e){if(!e)return!1;var t=e.nodeName.toLowerCase();if("img"!==t&&"svg"!==t)return!1;var i=e.parentElement;return!(!i||!r.AriaUtil.isWidget(i)&&!r.AriaUtil.containsPresentationalChildrenOnly(i)||!r.AriaUtil.hasAriaLabel(i))},e}();t.AccNameUtil=d},7011(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,r=t.length;n<r;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.AriaUtil=void 0;var n=i(4566),r=i(9910),l=i(9955),o=i(3864),s=i(3946),u=i(7139),d=i(1950),c=i(5279),m=i(1686),p=function(){function e(){}return e.isDefinedAriaAttributeAtIndex=function(t,i){var a=t.attributes[i].name;return e.isDefinedAriaAttribute(t,a)},e.getUserDefinedAriaAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)&&t.push(n)}return t},e.getUserDefinedHtmlAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)||t.push(n)}return t},e.getUserDefinedAriaAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),r=e.getAttribute(n);""===r&&(r=null),"aria-"===n.substring(0,5)&&t.push({name:n,value:r})}return t},e.getUserDefinedHtmlAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),r=e.getAttribute(n);""===r&&(r=null),"aria-"===n.substring(0,5)||t.push({name:n,value:r})}return t},e.getAriaAttribute=function(t,i){var a=t.getAttribute(i);if(t.hasAttribute(i)&&""===a.trim())return a;if(!a){var n=t.nodeName.toLowerCase();i in e.ariaAttributeImplicitMappings&&(n in e.ariaAttributeImplicitMappings[i]?"function"==typeof(a=e.ariaAttributeImplicitMappings[i][n])&&(a=a(t)):"*"in e.ariaAttributeImplicitMappings[i]&&"function"==typeof(a=e.ariaAttributeImplicitMappings[i]["*"])&&(a=a(t)))}if(!a){var r=l.ARIAMapper.nodeToRole(t);r in e.ariaAttributeRoleDefaults&&i in e.ariaAttributeRoleDefaults[r]&&"function"==typeof(a=e.ariaAttributeRoleDefaults[r][i])&&(a=a(t))}return!a&&i in e.ariaAttributeGlobalDefaults&&(a=e.ariaAttributeGlobalDefaults[i]),a},e.isDefinedAriaAttribute=function(e,t){var i=!1;return"aria-"===t.substring(0,5)&&(i=e.hasAttribute&&e.hasAttribute(t)&&e.getAttribute(t).length>0),i},e.getResolvedRole=function(t,i){if(void 0===i&&(i=!0),!t)return null;var a=n.CacheUtil.getCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",null);if(null===a){var r=e.getUserDefinedRoles(t),l=e.getElementAriaProperty(t),o=e.getAllowedAriaRoles(t,l),s=!1;if(r&&r.length>0&&o&&o.length>0){for(var d=0;d<r.length;d++)if(o.includes("any")||o.includes(r[d])){if(o.includes("any")&&"generic"===r[d]){s=!0;continue}if(("presentation"===(a=r[d])||"none"===a)&&u.CommonUtil.isFocusable(t)){a=null;continue}break}s&&(a="generic")}if(null===a&&i){var c=e.getImplicitRole(t);a=c&&c.length>0?c[0]:void 0}n.CacheUtil.setCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",a)}return void 0!==a?a:null},e.getUserDefinedRoles=function(t){return e.getRoles(t,!1)},e.getRoles=function(t,i){var a=[];if(t&&t.hasAttribute&&t.hasAttribute("role"))for(var n=u.CommonUtil.normalizeSpacing(t.getAttribute("role").trim()).split(" "),r=0;r<n.length;++r)a.push(n[r]);if(i){var l=e.getImplicitRole(t);null!==l&&l.length>0&&u.CommonUtil.concatUniqueArrayItemList(l,a)}return a},e.getImplicitRole=function(t){if(!t||1!==t.nodeType)return null;var i=n.CacheUtil.getCache(t,"AriaUtil_ImplicitRole",null);if(!i){var a=e.getElementAriaProperty(t);if(a&&a.implicitRole){if(a.implicitRole.includes("generic")){var l=e.getUserDefinedAriaAttributes(t);if(0===l.length)return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[];var o=[],s=r.ARIADefinitions.designPatterns.generic;if(s.reqProps&&s.reqProps.length>0&&u.CommonUtil.concatUniqueArrayItemList(s.reqProps,o),a.globalAriaAttributesValid&&u.CommonUtil.concatUniqueArrayItemList(r.ARIADefinitions.globalProperties,o),s.deprecatedProps&&s.deprecatedProps.length>0&&u.CommonUtil.reduceArrayItemList(s.deprecatedProps,o),o.length>0&&!o.some(function(e){return l.includes(e)})){var d=u.CommonUtil.reduceArrayItemList(["generic"],a.implicitRole);return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",d),d}}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",a.implicitRole),a.implicitRole}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[]}return i},e.getRoleRequiredProperties=function(e,t){if(null===e)return null;if(r.ARIADefinitions.designPatterns[e]){var i=r.ARIADefinitions.designPatterns[e].reqProps;return"separator"===e.toLowerCase()&&t&&u.CommonUtil.isFocusable(t)&&(i=u.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"],i||[])),i}return null},e.hasRole=function(t,i,a){var n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var r=t.getAttribute("role").trim().split(" "),l=0;!n&&l<r.length;++l)n=r[l]in i;else for(r=t.getAttribute("role").trim().split(" "),l=0;!n&&l<r.length;++l)n=r[l]===i;if(!n&&a){var o=[],s=e.getImplicitRole(t);if(null!==s&&s.length>0)if(u.CommonUtil.concatUniqueArrayItemList(s,o),"string"!=typeof i)for(l=0;!n&&l<o.length;++l)n=o[l]in i;else for(l=0;!n&&l<o.length;++l)n=o[l]===i}return n},e.hasRoleInSemantics=function(t,i){var a=!1,n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var r=t.getAttribute("role").trim().toLowerCase().split(/\s+/),l=0;!a&&l<r.length;++l)n=!0,a=r[l]in i;else for(r=t.getAttribute("role").trim().toLowerCase().split(/\s+/),l=0;!a&&l<r.length;++l)n=!0,a=r[l]===i;if(n)return a;var o=e.getImplicitRole(t);if(null!==o&&o.length>0)if("string"!=typeof i)for(l=0;!a&&l<o.length;++l)a=o[l]in i;else for(l=0;!a&&l<o.length;++l)a=o[l]===i;return a},e.hasAnyRole=function(t,i){var a=!1;if(t&&t.hasAttribute&&t.hasAttribute("role")&&(a=!0),!a&&i){var n=e.getImplicitRole(t);null!==n&&n.length>0&&(a=!0)}return a},e.isPresentationalElement=function(e){return u.CommonUtil.valInArray(e.nodeName.toLowerCase(),["abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","a","progress","meter","basefont","big","center","strike","tt","font","blink","h1","h2","h3","h4","h5","h6","hr","blockquote","p"])},e.getAncestorWithRole=function(t,i,a){for(var n=o.DOMWalker.parentNode(t);null!==n;){if(a){if(e.hasRoleInSemantics(n,i))break}else if(e.hasRole(n,i,!1))break;n=o.DOMWalker.parentNode(n)}return n},e.getAncestorWithRoles=function(t,i){if(!t||!i||!i.length||0===i.length)return null;for(var a=t;null!==a;){var n=e.getResolvedRole(a);if(null!==n&&(i.includes(n)||i.includes("*")&&!["presentation","none"].includes(n)))return a;a=o.DOMWalker.parentNode(a)}return null},e.getRolesWithTypes=function(e,t){if(!e||!t||!t.length||0===t.length)return null;var i=n.CacheUtil.getCache(e.ownerDocument,"roles_with_given_types",null);return i&&0!==i.length||(i=[],Object.entries(r.ARIADefinitions.designPatterns).forEach(function(e){var a=e[0],n=e[1];t.includes(n.roleType)&&i.push(a)}),n.CacheUtil.setCache(e.ownerDocument,"roles_with_given_types",i)),i},e.isWidget=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"is_element_widget",null);if(null===i){var a=!1,l=e.getResolvedRole(t);return l&&r.ARIADefinitions.designPatterns[l]&&"widget"===r.ARIADefinitions.designPatterns[l].roleType&&(a=!0),n.CacheUtil.setCache(t.ownerDocument,"is_element_widget",a),a}return i},e.isNavigationOwnedOrControlled=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",null);if(null!==i&&i.length>0&&u.CommonUtil.getAncestor(t,i))return!0;var a=e.getResolvedRole(t);if(!a)return!1;var r=t.getAttribute("id");return!(!r||0===r.trim().length)&&(!!t.ownerDocument.querySelector("*[aria-controls~='".concat(r,"'], *[aria-owns~='").concat(r,"']"))&&(!!["combobox","scrollbar","button","tab","listbox","menu","menubar","radiogroup","tree","treegrid"].includes(a)&&(null===i&&(i=[]),i.push(t),n.CacheUtil.setCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",i),!0)))},e.getSiblingWithRole=function(t,i){return e.getSiblingWithRoleHidden(t,i,!1)},e.getSiblingWithRoleHidden=function(t,i,a,n){var r=null,l=!1;if(t&&i){for(r=t.nextSibling;null!==r&&!l;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(r)||(l=n?e.hasRoleInSemantics(r,i):e.hasRole(r,i,!1)),r=r.nextSibling;if(!r)for(r=t.previousSibling;null!==r&&!l;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(r)||(l=e.hasRole(r,i,n)),r=r.previousSibling}return r},e.getDescendantWithRole=function(t,i){return e.getDescendantWithRoleHidden(t,i,!1)},e.getDescendantWithRoleHidden=function(t,i,a,n){for(var r=null,l=new o.DOMWalker(t);l.nextNode()&&l.node!=t&&l.node!=t.nextSibling;)if((!a||!u.CommonUtil.shouldNodeBeSkippedHidden(l.node))&&(n?e.hasRoleInSemantics(l.node,i):e.hasRole(l.node,i,!1))){r=l.node;break}return r},e.getAllDescendantsWithRoles=function(t,i,a,n){if(i&&0!==i.length){var r=[];return i.forEach(function(i){var l=e.getAllDescendantsWithRoleHidden(t,i,a,n);l&&l.length>0&&(r=r.concat(l))}),r}},e.getAllDescendantsWithRoleHidden=function(t,i,a,n){for(var r=[],l=new o.DOMWalker(t);l.nextNode()&&l.node!=t&&l.node!=t.nextSibling;)l.bEndTag||a&&u.CommonUtil.shouldNodeBeSkippedHidden(l.node)||e.hasRole(l.node,i,n)&&r.push(l.node);return r},e.getDirectATChildren=function(t){var i=e.getRequiredChildRoles(t,!0),a=[];return e.retrieveDirectATChildren(t,i,a),a},e.retrieveDirectATChildren=function(t,i,a){var n=[];if(null!==t.children&&t.children.length>0)for(var r=0;r<t.children.length;r++)n.push(t.children[r]);var l=t.getAttribute("aria-owns");if(l){var o=t.ownerDocument;if(o){var u=l.split(" ");for(r=0;r<u.length;r++){var d=o.getElementById(u[r]);d&&n.push(d)}}}if(n.length>0){for(r=0;r<n.length;r++)if(!s.VisUtil.isNodeHiddenFromAT(n[r])&&s.VisUtil.isNodeVisible(n[r])){var c=e.getRoles(n[r],!1);null!==c&&0!==c.length||(c=e.getImplicitRole(n[r])),c&&null!==c&&c.length>0&&(c=c.filter(function(e){return"none"!==e&&"presentation"!==e})).includes("group")&&i&&i.includes("group")&&(c=c.filter(function(e){return"group"!==e})),c&&null!==c&&c.length>0?a.push(n[r]):e.retrieveDirectATChildren(n[r],i,a)}return null}return null},e.getRequiredChildRoles=function(t,i){var a=e.getRoles(t,!1);if(a&&0!==a.length||!i||(a=e.getImplicitRole(t)),!a||0===a.length)return null;var n=["none","presentation"];if(a.some(function(e){return n.includes(e)}))return null;for(var l=r.ARIADefinitions.designPatterns,o=new Array,s=0;s<a.length;++s)l[a[s]]&&null!==l[a[s]].reqChildren&&(o=u.CommonUtil.concatUniqueArrayItemList(l[a[s]].reqChildren,o));return o},e.getAriaOwnsWithRole=function(t,i){return e.getAriaOwnsWithRoleHidden(t,i,!1)},e.getAriaOwnsWithRoleHidden=function(t,i,a,n){var r=null,l=!1;if(u.CommonUtil.attributeNonEmpty(t,"aria-owns")){var o=t.getAttribute("aria-owns");if(r=c.FragmentUtil.getById(t,o),m.DOMUtil.sameNode(t,r))return null;l=a&&null!=r&&u.CommonUtil.shouldNodeBeSkippedHidden(r)?null:e.hasRole(r,i,n)}return l?r:null},e.hasAriaLabel=function(e){return u.CommonUtil.attributeNonEmpty(e,"aria-label")||u.CommonUtil.attributeNonEmpty(e,"aria-labelledby")},e.hasUniqueAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,r=!1,l=null;i&&(l=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===l&&(l={});for(var o=0;!r&&o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();r=s in l,l[s]=!0}else if(t[o].hasAttribute("aria-labelledby")){var d=t[o].getAttribute("aria-labelledby"),p=c.FragmentUtil.getById(t[o],d),h="";p&&!m.DOMUtil.sameNode(p,t[o])&&(h=e.getTextContentExcludingScripts(p));var g=u.CommonUtil.normalizeSpacing(h).toLowerCase();r=g in l,l[g]=!0}else r=!0;return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",l),!r},e.getTextContentExcludingScripts=function(e){if(!e)return"";for(var t="",i=new o.DOMWalker(e);i.nextNode()&&i.node!==e&&i.node!==e.parentNode;)if(!i.bEndTag){var a=i.node,n=a.nodeName?a.nodeName.toLowerCase():"";"script"!==n&&"style"!==n?3===a.nodeType?a.nodeValue&&a.nodeValue.trim().length>0&&(t+=" "+a.nodeValue.trim()):1===a.nodeType&&("img"===n&&a.hasAttribute("alt")||"input"===n&&"image"===a.getAttribute("type")&&a.hasAttribute("alt"))&&(t+=" "+a.getAttribute("alt").trim(),i.bEndTag=!0):i.bEndTag=!0}return t.trim()},e.getAriaLabel=function(t){if(t.hasAttribute){if(t.hasAttribute("aria-labelledby")){for(var i=t.getAttribute("aria-labelledby").trim().split(" "),a="",n=0,r=i.length;n<r;++n){var l=i[n],o=c.FragmentUtil.getById(t,l);if(o&&!m.DOMUtil.sameNode(o,t)){var s=e.getTextContentExcludingScripts(o);a+=u.CommonUtil.normalizeSpacing(s)}}return a.trim()}if(t.hasAttribute("aria-label"))return u.CommonUtil.normalizeSpacing(t.getAttribute("aria-label")).trim()}return""},e.getAriaDescription=function(t){if(!t)return"";var i="",a=t.getAttribute("aria-labelledby");if(a&&a.trim().length>0){for(var n=a.trim().split(" "),r=0,l=n.length;r<l;++r){var o=n[r],s=c.FragmentUtil.getById(t,o);if(s&&!m.DOMUtil.sameNode(s,t)){var d=e.getTextContentExcludingScripts(s);d&&d.trim().length>0&&(i+=u.CommonUtil.normalizeSpacing(d).toLowerCase())}}if(i.trim().length>0)return i.trim()}return(a=t.getAttribute("aria-description"))&&a.trim().length>0?a.trim().toLowerCase():""},e.findAriaLabelDupes=function(t){var i={};return t.forEach(function(t){i[e.getAriaLabel(t)]=(i[e.getAriaLabel(t)]||0)+1}),i},e.getLandmarkAccNames=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_Landmark_AccNames",null);if(i&&0!==i.length)return i;i=[];var r=t.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]');return 0===r.length?(n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i):(r.forEach(function(t){if(!s.VisUtil.isNodeHiddenFromAT(t)&&null===u.CommonUtil.getAncestor(t,["DIALOG"])&&null===e.getAncestorWithRole(t,"dialog",!0)){var n="",l=d.AccNameUtil.computeAccessibleName(t);l&&l.name&&l.name.trim().length>0&&(n=l.name.trim());var o=a([],r,!0).filter(function(e){return e.contains(t)&&e!==t});o.length>1&&o.forEach(function(e){var t=d.AccNameUtil.computeAccessibleName(e);t&&t.name&&t.name.trim().length>0&&(n=t.name.trim()+" "+n)});var c=e.getResolvedRole(t);i.push({elem:t,role:c,name:n})}}),n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i)},e.isLandmarkNameUnique=function(t,i,a){void 0===a&&(a=!1);var n,r=e.getLandmarkAccNames(t.ownerDocument);if(!(n="any"===i?r.find(function(e){return e.elem===t}):r.find(function(e){return e.elem===t&&e.role===i})))return null;var l=n.name;if(!a&&""===l)return null;for(var o=0;o<r.length;o++)if(r[o].elem!==t&&l===r[o].name){if("any"===i)return!0;if(r[o].role===i)return!0}return!1},e.hasUniqueAriaLabels=function(t){return e.hasUniqueAriaLabelsLocally(t,!0)},e.hasDuplicateAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,r=null,l=new Array;i&&(r=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===r&&(r={});for(var o=0;o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();r[s]=!0,s in l||(l[s]=new Array),l[s].push(t[o].nodeName.toLowerCase())}else if(t[o].hasAttribute("aria-labelledby")){for(var d=t[o].getAttribute("aria-labelledby").trim().split(" "),p="",h=0,g=d.length;h<g;++h){var b=d[h],_=c.FragmentUtil.getById(t[o],b);if(_&&!m.DOMUtil.sameNode(_,t[o])){var f=e.getTextContentExcludingScripts(_);p+=u.CommonUtil.normalizeSpacing(f).toLowerCase()}}r[p]=!0,p in l||(l[p]=new Array),l[p].push(t[o].nodeName.toLowerCase())}return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",r),l},e.hasDuplicateAriaLabels=function(t){return e.hasDuplicateAriaLabelsLocally(t,!0)},e.hasUniqueAriaLabelledby=function(e){for(var t=!1,i={},a=0;!t&&a<e.length;++a)if(e[a].hasAttribute&&e[a].hasAttribute("aria-labelledby")&&!u.CommonUtil.isIdReferToSelf(e[a],e[a].getAttribute("aria-labelledby"))){var n=u.CommonUtil.normalizeSpacing(e[a].getAttribute("aria-labelledby"));t=n in i,i[n]=!0}else t=!0;return!t},e.getElementAriaProperty=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_ElementAriaProperty",null);if(!i){var l=null;if(t.tagName?l=t.tagName.toLowerCase():t.nodeName&&(l=t.nodeName.toLowerCase()),null==(i=r.ARIADefinitions.documentConformanceRequirement[l])){var o=r.ARIADefinitions.documentConformanceRequirementSpecialTags[l];switch(l){case"a":case"area":i=t.hasAttribute("href")?o["with-href"]:o["without-href"];break;case"figure":var s=u.CommonUtil.getChildByTag(t,"figcaption");i=null!==s&&s.length>0?o["child-figcaption"]:o["no-child-figcaption"];break;case"footer":case"header":i=null!==e.getAncestorWithRole(t,"article",!0)||null!==e.getAncestorWithRole(t,"complementary",!0)||null!==e.getAncestorWithRole(t,"navigation",!0)||null!==e.getAncestorWithRole(t,"region",!0)||null!==u.CommonUtil.getAncestor(t,["article","aside","main","nav","section"])?o["des-section-article-aside-main-nav"]:o.other;break;case"img":var d=t.hasAttribute("alt")?t.getAttribute("alt"):null,c=t.hasAttribute("title")?t.getAttribute("title"):null;i=0!==e.getAriaLabel(t).trim().length||null!==d&&d.length>0||null!==c&&c.length>0?o["img-with-accname"]:null!==d?o["img-without-accname-empty-alt"]:o["img-without-accname-no-alt"];break;case"input":if(u.CommonUtil.attributeNonEmpty(t,"type")){var p=t.getAttribute("type").trim().toLowerCase();if(null==(i=o[p]))switch(p){case"checkbox":i=u.CommonUtil.attributeNonEmpty(t,"aria-pressed")?o["checkbox-with-aria-pressed"]:o["checkbox-without-aria-pressed"];break;case"email":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["email-with-list"]:o["email-no-list"];break;case"search":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["search-with-list"]:o["search-no-list"];break;case"tel":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["tel-with-list"]:o["tel-no-list"];break;case"text":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"url":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["url-with-list"]:o["url-no-list"];break;default:i=u.CommonUtil.attributeNonEmpty(t,"list")?o["default-with-list"]:o["default-no-list"]}}else i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"li":o=r.ARIADefinitions.documentConformanceRequirementSpecialTags.li,i=t.parentElement&&e.hasRoleInSemantics(t.parentElement,"list")?o["child-of-list-role"]:o["no-child-of-list-role"];break;case"section":var h=e.getAriaLabel(t);i=h&&h.trim().length>0||u.CommonUtil.attributeNonEmpty(t,"title")?o["with-name"]:o["without-name"];break;case"select":o=r.ARIADefinitions.documentConformanceRequirementSpecialTags.select,i=t.hasAttribute("multiple")||u.CommonUtil.attributeNonEmpty(t,"size")&&t.getAttribute("size")>1?o["multiple-attr-size-gt1"]:o["no-multiple-attr-size-gt1"];break;case"summary":o=r.ARIADefinitions.documentConformanceRequirementSpecialTags.summary,i=t.parentElement&&"details"===t.parentElement.nodeName.toLowerCase()&&m.DOMUtil.sameNode(a([],t.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],t)?o["first-summary-of-detail"]:o["no-first-summary-of-detail"];break;case"tbody":case"td":case"tr":i=null!==e.getAncestorWithRole(t,"table",!0)?o["des-table"]:e.getAncestorWithRole(t,"grid",!0)||e.getAncestorWithRole(t,"treegrid",!0)?o["des-grid"]:o["des-other"];break;case"th":var g=u.CommonUtil.getScopeForTh(t);i=null!==e.getAncestorWithRole(t,"table",!0)?"column"===g?o["des-table-column-scope"]:o["des-table-row-scope"]:null!==e.getAncestorWithRole(t,"grid",!0)||null!==e.getAncestorWithRole(t,"treegrid",!0)?"column"===g?o["des-grid-treegrid-column-scope"]:o["des-grid-treegrid-row-scope"]:o["des-other"];break;case"div":var b=t.parentElement;i=null!==b&&"dl"===b.nodeName.toLowerCase()?o["child-dl"]:o["no-child-dl"];break;default:i=r.ARIADefinitions.documentConformanceRequirementSpecialTags.default}}}return n.CacheUtil.setCache(t,"AriaUtil_ElementAriaProperty",i),i||null},e.getAllowedAriaRoles=function(t,i){var a=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaRoles",null);if(!a){a=[];var r;if(null!=(r=null!=i?i:e.getElementAriaProperty(t))){null!==r.implicitRole&&u.CommonUtil.concatUniqueArrayItemList(r.implicitRole,a),null!==r.validRoles&&u.CommonUtil.concatUniqueArrayItemList(r.validRoles,a);var l=e.getImplicitRole(t);l&&l.length>0&&u.CommonUtil.concatUniqueArrayItemList(r.validRoles,a)}n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaRoles",a)}return a},e.getAllowedAriaAttributes=function(t,i,l){var o=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaAttributes",null);if(!o){o=[];var s=a([],i,!0),d=t.tagName.toLowerCase(),c=[];r.ARIADefinitions.elementsAllowedDisabled.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-disabled",o)),r.ARIADefinitions.elementsAllowedRequired.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-required",o)),r.ARIADefinitions.elementsAllowedReadOnly.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-readonly",o));var m=null;if(null!=(m=null!=l&&void 0!==l?l:e.getElementAriaProperty(t))){if(null!==m.implicitRole&&(null==s||0===s.length)&&void 0===m.allowAttributesFromImplicitRole)for(var p=0;p<m.implicitRole.length;p++){var h=r.ARIADefinitions.designPatterns[m.implicitRole[p]];if(null!=h){var g=h.props;u.CommonUtil.concatUniqueArrayItemList(g,o),g=e.getRoleRequiredProperties(m.implicitRole[p],t),u.CommonUtil.concatUniqueArrayItemList(g,o),(v=h.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===m.implicitRole[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuenow","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(m.globalAriaAttributesValid){var b=r.ARIADefinitions.globalProperties;u.CommonUtil.concatUniqueArrayItemList(b,o)}}for(m&&m.otherRolesForAttributes&&m.otherRolesForAttributes.length>0&&u.CommonUtil.concatUniqueArrayItemList(m.otherRolesForAttributes,s),p=0;null!==s&&p<s.length;p++){var _=r.ARIADefinitions.designPatterns[s[p]];if(null!=_){if(!m||null===m.implicitRole||!m.implicitRole.includes(s[p])||m.implicitRole.includes(s[p])&&void 0===m.allowAttributesFromImplicitRole){var f=_.props;u.CommonUtil.concatUniqueArrayItemList(f,o),f=e.getRoleRequiredProperties(s[p],t),u.CommonUtil.concatUniqueArrayItemList(f,o)}var v;(v=_.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===s[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(s.includes("row")&&null==e.getAncestorWithRole(t,"treegrid",!0)){var A=-1;(A=o.indexOf("aria-level"))>-1&&o.splice(A,1),(A=o.indexOf("aria-setsize"))>-1&&o.splice(A,1),(A=o.indexOf("aria-posinset"))>-1&&o.splice(A,1)}if(m&&m.otherAllowedAriaAttributes&&m.otherAllowedAriaAttributes.length>0){for(var w=[],y=0;y<m.otherAllowedAriaAttributes.length;y++)if((R=m.otherAllowedAriaAttributes[y]).includes("=")){var C=R.split("=");t.getAttribute(C[0])===C[1]&&w.push(C[0])}else w.push(R);w.length>0&&u.CommonUtil.concatUniqueArrayItemList(w,o)}if(m&&m.otherDisallowedAriaAttributes&&m.otherDisallowedAriaAttributes.length>0){var k=[];for(y=0;y<m.otherDisallowedAriaAttributes.length;y++){var R;(R=m.otherDisallowedAriaAttributes[y]).includes("=")?(C=R.split("="),t.getAttribute(C[0])===C[1]&&k.push(C[0])):k.push(R)}k.length>0&&u.CommonUtil.concatUniqueArrayItemList(k,c)}o=u.CommonUtil.reduceArrayItemList(c,o),i&&0!==i.length||null!==m.implicitRole||!m.prohibitedAriaAttributesWhenNoImplicitRole||(o=u.CommonUtil.reduceArrayItemList(m.prohibitedAriaAttributesWhenNoImplicitRole,o)),n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaAttributes",o)}return o},e.getConflictOrOverlappingHtmlAttribute=function(e,t,i){var a=r.ARIADefinitions.relatedAriaHtmlAttributes[e.name];if(a){if(!e||0==e.length||!t||0==t.length)return[];var n=[],l=null;if("conflict"===i){if(!a.conflict||0===Object.keys(a.conflict).length)return null;l=a.conflict}else{if("overlapping"!==i)return null;if(!a.overlapping||0===Object.keys(a.overlapping).length)return null;l=a.overlapping}for(var o=!1,s=!1,u=0;u<l.length;u++)for(var d=l[u].ariaAttributeValue,c=l[u].htmlAttributeNames,m=l[u].htmlAttributeValues,p=0;p<t.length;p++){var h=c.indexOf(t[p].name);if(-1!==h){o=!0;var g=null===m||null===m[h]?null:m[h].split(",");null===d?(null===g||g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0):null===g?d===e.value&&(n.push({result:"Failed",attr:t[p].name}),s=!0):("VALUE"===d&&g.includes("VALUE")&&g[0]!==e.value||d===e.value&&g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0)}}return o&&!s&&n.push({result:"Pass",attr:""}),n}return null},e.containsPresentationalChildrenOnly=function(t){var i=e.getRoles(t,!1);if(i&&0!==i.length||(i=e.getImplicitRole(t)),!i||0===i.length)return!1;for(var a=0;null!==i&&a<i.length;a++){var n=r.ARIADefinitions.designPatterns[i[a]];if(null!=n&&!0===n.presentationalChildren)return!0}return!1},e.shouldBePresentationalChild=function(t){for(var i=o.DOMWalker.parentElement(t);i;){if(e.containsPresentationalChildrenOnly(i))return!0;i=l.ARIAMapper.getAriaOwnedBy(i)||o.DOMWalker.parentElement(i)}return!1},e.areRolesDefined=function(e){if(!e||0===e.length)return null;for(var t=r.ARIADefinitions.designPatterns,i=0,a=e;i<a.length;i++)if(!(a[i].toLowerCase()in t))return!1;return!0},e.getInvalidRoles=function(t){var i=e.getUserDefinedRoles(t);if(!i||0===i.length)return null;if(i&&i.includes("generic"))return["generic"];var a=e.getElementAriaProperty(t),n=e.getAllowedAriaRoles(t,a);if(!n||0===n.length)return i;var r=[];if(n.includes("any"))return[];for(var l=0;l<i.length;l++)n.includes(i[l])||r.includes(i[l])||r.push(i[l]);return r},e.getRolesUndefinedByAria=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=r.ARIADefinitions.designPatterns,l=0;l<i.length;l++)i[l]in n||a.push(i[l]);return a},e.getInvalidAriaAttributes=function(t){var i=e.getUserDefinedRoles(t),a=e.areRolesDefined(i);if(null!==a&&!a)return null;var n=[];i&&0!=i.length||(i=e.getImplicitRole(t));var r=e.getUserDefinedAriaAttributes(t),l=e.getElementAriaProperty(t),o=e.getAllowedAriaAttributes(t,i,l);if(r)for(var s=0;s<r.length;s++){var u=r[s].trim().toLowerCase();o.includes(u)||n.includes(u)||n.push(u)}return n},e.getConflictAriaAndHtmlAttributes=function(t){var i=e.getUserDefinedAriaAttributeNameValuePairs(t),a=e.getUserDefinedHtmlAttributeNameValuePairs(t),n=[];if(i&&i.length>0&&a&&a.length>0)for(var r=function(t){var r=e.getConflictOrOverlappingHtmlAttribute(i[t],a,"conflict");if(null===r)return"continue";r.forEach(function(e){"Failed"===e.result&&n.push({ariaAttr:i[t].name,htmlAttr:e.attr})})},l=0;l<i.length;l++)r(l);return n},e.getDeprecatedAriaRoles=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=r.ARIADefinitions.globalDeprecatedRoles,l=0;l<i.length;l++)n.includes(i[l])&&a.push(i[l]);return a},e.getDeprecatedAriaAttributes=function(t){if(!t)return null;var i=t.attributes,a=[];if(i)for(var n=0;n<i.length;n++){var l=i[n].name;"aria-"===l.substring(0,5)&&a.push(l)}if(0===a.length)return[];var o=[],s=r.ARIADefinitions.globalDeprecatedProperties;for(n=0;n<a.length;n++)s.includes(a[n])&&o.push({role:"any",attribute:a[n]});var u=e.getRoles(t,!1);if(u&&u.length>0)for(n=0;n<u.length;n++){var d=r.ARIADefinitions.designPatterns[u[n]];if(d){var c=d.deprecatedProps;if(c&&c.length>0)for(var m=0;m<a.length;m++)c.includes(a[m])&&o.push({role:u[n],attribute:a[m]})}}return o},e.isNodeInGrid=function(t){return null!=e.getAncestorWithRole(t,"grid")},e.navLinkKeywords=["start","next","prev","previous","contents","index"],e.rulesThatHaveToCheckHidden=["RPT_Elem_UniqueId"],e.ariaAttributeRoleDefaults={alert:{"aria-live":"assertive","aria-atomic":"true"},combobox:{"aria-haspopup":"listbox"},listbox:{"aria-orientation":"vertical"},log:{"aria-live":"polite"},menu:{"aria-orientation":"vertical"},menubar:{"aria-orientation":"horizontal"},meter:{"aria-valuemin":"0","aria-valuemax":"100"},option:{"aria-selected":"false"},progressbar:{"aria-valuemin":"0","aria-valuemax":"100"},scrollbar:{"aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},separator:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},slider:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},spinbutton:{},status:{"aria-live":"polite","aria-atomic":"true"},tab:{"aria-selected":"false"},tablist:{"aria-orientation":"horizontal"},toolbar:{"aria-orientation":"horizontal"},tree:{"aria-orientation":"vertical"}},e.ariaAttributeGlobalDefaults={"aria-atomic":"false","aria-autocomplete":"none","aria-busy":"false","aria-checked":void 0,"aria-current":"false","aria-disabled":"false","aria-dropeffect":"none","aria-expanded":void 0,"aria-grabbed":void 0,"aria-haspopup":"false","aria-hidden":void 0,"aria-invalid":"false","aria-live":"off","aria-modal":"false","aria-multiline":"false","aria-multiselectable":"false","aria-orientation":void 0,"aria-pressed":void 0,"aria-readonly":"false","aria-required":"false","aria-selected":void 0,"aria-sort":"none"},e.ariaAttributeImplicitMappings={"aria-autocomplete":{form:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},input:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},select:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},textarea:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"}},"aria-checked":{input:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},menuitem:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},"*":function(e){if(e.hasAttribute("indeterminate"))return"mixed"}},"aria-disabled":{button:function(e){return e.hasAttribute("disabled")?"true":"false"},fieldset:function(e){return e.hasAttribute("disabled")?"true":"false"},input:function(e){return e.hasAttribute("disabled")?"true":"false"},optgroup:function(e){return e.hasAttribute("disabled")?"true":"false"},option:function(e){return e.hasAttribute("disabled")?"true":"false"},select:function(e){return e.hasAttribute("disabled")?"true":"false"},textarea:function(e){return e.hasAttribute("disabled")?"true":"false"}},"aria-expanded":{details:function(e){return e.getAttribute("open")},dialog:function(e){return e.getAttribute("open")}},"aria-multiselectable":{select:function(e){if(e.hasAttribute("multiple"))return"true"}},"aria-placeholder":{input:function(e){return e.getAttribute("placeholder")},textarea:function(e){return e.getAttribute("placeholder")}},"aria-required":{input:function(e){return e.getAttribute("required")},select:function(e){return e.getAttribute("required")},textarea:function(e){return e.getAttribute("required")}}},e}();t.AriaUtil=p},4919(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CSSUtil=void 0;var a=i(4566),n=i(7139),r=i(7011),l=i(7507),o=i(3864),s=function(){function e(){}return e.selectorMatchesElem=function(e,t){if(!t||0===t.length||""===t.trim())return!1;try{if("function"==typeof e.matches)return e.matches(t);if("function"==typeof e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if("function"==typeof e.msMatchesSelector)return e.msMatchesSelector(t);if("function"==typeof e.matchesSelector)return e.matchesSelector(t);var i=e.ownerDocument||e.document;if(!i)return!1;var a=i.querySelectorAll(t);return Array.from(a).includes(e)}catch(e){return!1}},e.getComputedStyle=function(e,t){return e?e.ownerDocument.defaultView.getComputedStyle(e,t):null},e.getParsedStylesheetRules=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_ParsedStylesheetRules",null);if(t)return t;for(var i=[],n=0;n<e.styleSheets.length;++n){var r=e.styleSheets[n];try{if(r&&r.cssRules)for(var l=0;l<r.cssRules.length;++l){var o=r.cssRules[l],s=o.selectorText;if(s){var u=s.match(/^(.*)(:[a-zA-Z-]*)$/),d=!!u,c=d?u[1]:s,m=d?u[2]:"";i.push({fullRuleSelector:s,hasPseudoClass:d,selMain:c,selPseudo:m,style:o.style})}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_ParsedStylesheetRules",i),i},e.fillStyle=function(e,t){for(var i=0;i<t.length;++i){if("all"===t[i]&&t[t[i]]){for(var a=0,n=e;a<n.length;a++){var r=n[a];for(var l in r)delete r[l]}break}l=t[i];for(var o=0,s=e;o<s.length;o++){r=s[o];var u=t.getPropertyPriority(l);if(l in r&&r[l].endsWith("!important")){if("important"!==u||r[l].startsWith("inherit")||r[l].startsWith("unset"))continue;r[l]=t[l]+" !important"}else r[l]=t[l]+("important"===u?" !important":"")}}},e.getDefinedStylesInternal=function(t,i,a){for(var n={},r={},l={},o=0,s=a;o<s.length;o++){var u=s[o];r[u]={},l[u]={}}for(var d=e.getParsedStylesheetRules(t.ownerDocument),c=a.includes(":focus"),m=function(n){if(null!==i&&!i.some(function(e){return!!n.style[e]}))return"continue";var o=n.selPseudo,s=n.hasPseudoClass,u=n.selMain;if(c&&":focus"===o&&(u=u.replace(/([ >][^+~ >]+):focus-within/g,"$1")),e.selectorMatchesElem(t,u))for(var d=0,m=a;d<m.length;d++){var p=m[d],h=r[p],g=l[p];s||e.fillStyle([h,g],n.style),o===p&&e.fillStyle([g],n.style)}},p=0,h=d;p<h.length;p++)m(h[p]);for(var g=0,b=a;g<b.length;g++){u=b[g];var _=r[u],f=l[u];if(e.fillStyle([_,f],t.style),""===u)n[u]=_;else{for(var v={},A=Object.keys(f),w=0;w<A.length;w++){var y=A[w];f[y]!==_[y]&&(v[y]=f[y])}n[u]=v}}return n},e.getDefinedStylesMultiple=function(t,i,n){if(!t)return null;var r={},l=null===i?"all":i.slice().sort().join(","),o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[l],u=[];if(s){for(var d=0,c=n;d<c.length;d++)void 0!==s[g=c[d]]?r[g]=s[g]:u.push(g);if(0===u.length)return r}else s={},u=n;if(u.length>0){for(var m=e.getDefinedStylesInternal(t,i,u),p=0,h=u;p<h.length;p++){var g;r[g=h[p]]=m[g],s[g]=m[g]}o[l]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o)}return r},e.getDefinedStyles=function(t,i,n){if(!t)return null;var r=null===i?"all":i.slice().sort().join(","),l=n||"",o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[r];if(s||(s={}),void 0!==s[l])return s[l];var u=e.getDefinedStylesInternal(t,i,[l])[l];return s[l]=u,o[r]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o),u},e.getMediaOrientationTransform=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_MediaOrientationTransforms",null);if(t)return t;for(var i={},n=0;n<e.styleSheets.length;++n){var r=e.styleSheets[n];try{if(r&&r.cssRules)for(var l=0;l<r.cssRules.length;++l){var o=r.cssRules[l];if(4===o.MEDIA_RULE){var s=o;if(s&&s.media)for(var u=s.media,d=0;d<u.length;d++)if(u.item(d)){var c=u.item(d).toLocaleLowerCase(),m=i[c];m||(m={});for(var p=s.cssRules,h=0;h<p.length;++h)if(1===p[h].STYLE_RULE){var g=p[h],b=g.selectorText;if(b){for(var _={},f=g.style,v=0;v<f.length;++v){var A=f[v],w=A.toLocaleLowerCase();if("transform"===w){if("all"===A&&f[A]){_={};break}_[A]=f[A]}else"rotate"===w&&(_[A]=f[A])}Object.keys(_).length>0&&(m[b]=_)}}Object.keys(m).length>0&&(i[c]=m)}}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_MediaOrientationTransforms",i),i},e.getRotationDegree=function(e){var t=0;try{if(!e)return t;for(var i=(e=e.replaceAll(", ",",")).split(" "),a=0;a<i.length;a++){var n=i[a].trim();if(""!==n)if(n.startsWith("rotate3d")){var r=n.indexOf("("),l=n.indexOf(")");if(-1!==r&&-1!==l){var o=n.substring(r+1,l),s=void 0;if(o&&(s=o.split(",")),s&&4===s.length){if(!(d=s[3]))continue;if((d=d.trim()).endsWith("turn")){var u=d.substring(0,d.length-4);u=parseFloat(u),isNaN(u)||(t=360*u)}else d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}}else if(n.startsWith("rotate")||n.startsWith("rotateZ")){if(r=n.indexOf("("),l=n.indexOf(")"),-1!==r&&-1!==l){var d;if(!(d=n.substring(r+1,l)))continue;(d=d.trim()).endsWith("turn")?(u=d.substring(0,d.length-4),u=parseFloat(u),isNaN(u)||(t=360*u)):d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}else if(n.startsWith("matrix3d")){if(r=n.indexOf("("),l=n.indexOf(")"),-1!==r&&-1!==l&&(o=n.substring(r+1,l),s=null,o&&(s=o.split(",")),null!==s)){var c=Math.atan2(s[4],s[5]);t+=Math.round(Math.round(180*c/Math.PI))}}else n.startsWith("matrix")&&(r=n.indexOf("("),l=n.indexOf(")"),-1!==r&&-1!==l&&(o=n.substring(r+1,l),s=null,o&&(s=o.split(",")),null!==s&&(c=Math.atan2(s[1],s[0]),t+=Math.round(Math.round(180*c/Math.PI)))))}for(;t>=360;)t-=360}catch(e){throw console.log("Cannot retrieve rotation degree: "+e),e}return t},e.getPixelsFromStyle=function(t,i){if(!t)return 0;var a=t.trim().match(/(-?[\d.]+)([a-z%]*)/);if(null===a)return 0;if(""===a[2]||0===a[1])return 0;var n=e.convertValue2Pixels(a[2],a[1],i);return null===n?n:parseFloat(n)},e.convertValue2Pixels=function(e,t,i){if(0===t)return 0;e||(e="px");var a={px:function(e){return e},cm:function(e){return 37.8*e},mm:function(e){return 3.78*e},q:function(e){return.95*e},in:function(e){return 96*e},pc:function(e){return 16*e},pt:function(e){return 1.33*e},rem:function(e){return e*parseFloat(getComputedStyle(i.ownerDocument.documentElement).getPropertyValue("font-size"))},em:function(e){return e*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))},vw:function(e){return e/100*i.ownerDocument.defaultView.innerWidth},vh:function(e){return e/100*i.ownerDocument.defaultView.innerHeight},"%":function(e){return e/100*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))}};return e in a?a[e](t):null},e.isMaterialIconFont=function(t){var i={"Material Icons":"https://fonts.googleapis.com/icon?family=Material+Icons"},a=e.getDefinedStyles(t,["font-family"])["font-family"],n=!1;if(a&&a.split(",")[0].replace(/['"]+/g,"").trim()in i&&(n=!0),!n){var r=t.classList;for(var l in{"material-icons":"https://fonts.googleapis.com/icon?family=Material+Icons"})if(r.contains(l)){n=!0;break}}if(!n)return!1;for(var o=!1,s=t.ownerDocument.styleSheets,u=0;u<s.length;u++)if(s&&s.length>0&&Object.values(i).indexOf(s[u].href)>-1){o=!0;break}return o},e.getWeightNumber=function(e){var t={light:100,bold:700};return parseInt(e)||(e in t?t[e]:400)},e.getFontInPixels=function(t,i){var a=parseFloat(t);if(!a)return{"xx-small":16,"x-small":10,small:13,medium:16,large:18,"x-large":24,"xx-large":32}[t];var n=t.substring((""+a).length);return e.convertValue2Pixels(n,a,i)},e.getCSSStyle=function(e){var t="";if(null===e)return[];if(e.IBM_CSS_THB)return e.IBM_CSS_THB;if("style"===e.nodeName.toLowerCase())void 0!==(t=e.innerText)&&""!==t.trim()||(t=e.textContent);else{if(!e.hasAttribute("style"))return[];t=e.getAttribute("style")}if(null===t||0===t.trim().length)return[];var i=/\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g,a=/\s*([^{]*){([^}]*)}/g;if(-1===(t=t.replace(/(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g," ")).indexOf("{")){for(var n={},r=void 0;null!=(r=i.exec(t));)n[r[1]]=r[2].trim().toLowerCase();var l=[{selector:null,values:n}];return e.IBM_CSS_THB=l,l}l=[],r=void 0;for(var o=void 0;null!=(r=a.exec(t));){n={};for(var s=r[1],u=r[2];null!=(o=i.exec(u));)n[o[1]]=o[2].trim().toLowerCase();l.push({selector:s,values:n})}return e.IBM_CSS_THB=l,l},e.getInlineStatus=function(e){if(!e)return null;var t=getComputedStyle(e);if(!t)return null;var i={inline:!1,text:!1,violation:null};if("inline"!==t.getPropertyValue("display"))return i;i.inline=!0;var a=e.parentElement;if(!a)return i;var r=new l.DOMMapper,o=r.getUnadjustedBounds(e),s=getComputedStyle(a).getPropertyValue("display");if("block"!==s&&"inline-block"!==s)return n.CommonUtil.isInnerTextOnlyEmpty(a)||(i.text=!0),i;function u(e,t){if(e.nodeType===Node.TEXT_NODE)return e.nodeValue&&e.nodeValue.trim().length>0?"yes":"no";if(e.nodeType===Node.ELEMENT_NODE){if("br"===e.nodeName.toLowerCase())return"block";if("inline"===getComputedStyle(e).getPropertyValue("display")){if(n.CommonUtil.isTarget(e)&&o.width<24){var a=r.getUnadjustedBounds(e);return t&&Math.round(o.width/2)+o.left-a.left<24||!t&&Math.round(o.width/2)+o.left-(a.left+a.width)<24?(i.violation=e.nodeName.toLowerCase(),"violation"):"no"}return n.CommonUtil.isInnerTextOnlyEmpty(e)?"no":"yes"}return"block"}return"block"}for(var d=e.nextSibling;d;){if("yes"===(c=u(d,!0))){i.text=!0;break}if("block"===c)break;d=d.nextSibling}for(d=e.previousSibling;d;){var c;if("yes"===(c=u(d,!1))){i.text=!0;break}if("block"===c)break;d=d.previousSibling}return i},e.isTargetBrowserDefault=function(t){if(!t)return!1;var i=r.AriaUtil.getRoles(t,!1);if(i&&i.length>0)return!1;var a=e.getDefinedStyles(t,["line-height","height","width","min-height","min-width","font-size","margin-top","margin-bottom","margin-left","margin-right"]);return!(a["line-height"]||a.height||a.width||a["min-height"]||a["min-width"]||a["font-size"]||a["margin-top"]||a["margin-bottom"]||a["margin-left"]||a["margin-right"])},e.containsCKJ=function(e){return!!e&&e.trim().replace(/(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g,"").length!==e.trim().length},e.getAncestorWithStyles=function(t,i,n){void 0===n&&(n=[]);var r="AriaUtil_AncestorWithStyles_"+JSON.stringify(i)+"_"+JSON.stringify(n),l=a.CacheUtil.getCache(t,r,null);if(null!==l)return"NOT_FOUND"===l?null:l;for(var s=t;null!==s;)if(1===s.nodeType&&"http://www.w3.org/2000/svg"!==s.namespaceURI){var u=e.getDefinedStyles(s,Object.keys(i));for(var d in i){var c=u[d];if(c&&(c=c.split(" ")[0],!n.includes(c))){var m=i[d];if(m.includes("*"))return a.CacheUtil.setCache(t,r,s),s;if(m.includes(c))return a.CacheUtil.setCache(t,r,s),s}}s=o.DOMWalker.parentElement(s)}else s=o.DOMWalker.parentElement(s);return a.CacheUtil.setCache(t,r,"NOT_FOUND"),null},e.getValueUnitPair=function(e){if(!e)return null;if(Number.isInteger(e))return["px",e];var t=parseInt(e);if(isNaN(t))return null;var i=(e=e.trim().toLowerCase()).trim().match(/([a-z]+)$/),a="px";return i&&(a=i[1]),[a,t]},e}();t.CSSUtil=s},4566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CacheUtil=void 0;var a=i(1686),n=i(3864),r=function(){function e(){}return e.getCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0===a.aceCache[t]&&(a.aceCache[t]=i),a.aceCache[t]}},e.setCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),a.aceCache[t]=i,i}},e.getSetCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0!==a.aceCache[t]&&void 0!==a.aceCache[t]||(a.aceCache[t]=i()),a.aceCache[t]}},e.clearCaches=function(e){var t,i=0;delete e.ownerDocument.aceCache;var r=new n.DOMWalker(e,!1,e,!0);do{++i,delete r.node.aceCache,r.node.ownerDocument&&delete r.node.ownerDocument.aceCache}while(r.nextNode());if(e!==(null===(t=e.ownerDocument)||void 0===t?void 0:t.documentElement)){for(var l=new n.DOMWalker(e.ownerDocument.documentElement,!1,void 0,!0),o=l.node,s=void 0;s=n.DOMWalker.parentElement(o);)o=s;l.node=o;do{l.bEndTag||!a.DOMUtil.sameNode(e,l.node)?(delete l.node.aceCache,l.node.ownerDocument&&delete l.node.ownerDocument.aceCache):l.bEndTag=!0}while(l.nextNode())}return i},e}();t.CacheUtil=r},167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ClipPathUtil=void 0;var a=i(4566),n=i(4919),r=function(){function e(){}return e.isNodeVisuallyHiddenByClipPath=function(t){if(!t||1!==t.nodeType)return!1;var i=t,r=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",void 0);if(void 0!==r)return r;var l=n.CSSUtil.getComputedStyle(i),o=parseInt(l.width),s=parseInt(l.height),u=l["clip-path"];if(!u||"none"===u.trim()||""===u.trim())return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var d=(u=u.trim().replace(/\s+/g," ").toLowerCase()).indexOf("inset(");if(-1!==d){var c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")"));if(-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),1===(f=m.trim().split(" ")).length){var p=e.isClippedByInset(i,f[0],f[0],f[0],f[0]);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(2===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[0],f[1]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(3===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[1],f[2]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(4===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[2],f[3]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(-1!==(d=u.indexOf("rect("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),"auto"===(f=m.trim().split(" "))[0]&&(f[0]="0px"),"auto"===f[3]&&(f[3]="0px"),"auto"===f[1]&&(f[1]="100%"),"auto"===f[2]&&(f[2]="100%"),f[2]=Math.max(f[0],f[2]),f[1]=Math.max(f[1],f[3]);var h=parseInt(f[0]);if(isNaN(h))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))h=h*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(h)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;h=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(h>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var g=parseInt(f[3]);if(isNaN(g))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))g=g*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(g)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;g=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(g>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var b=parseInt(f[1]);if(isNaN(b))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))b=b*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(b)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;b=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}var _=parseInt(f[2]);if(isNaN(_))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))_=_*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(_)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;_=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return _-h<=e.THRESHOLD||b-g<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("xywh("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c));var f=m.trim().split(" "),v=parseInt(f[0]);if(isNaN(v))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))v=v*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(top)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;v=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(v>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var A=parseInt(f[1]);if(isNaN(A))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))A=A*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(A)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;scrollY=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(A>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var w=parseInt(f[2]);if(isNaN(w))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))w=w*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(w)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;w=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(w<=e.THRESHOLD)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0;var y=parseInt(f[3]);if(isNaN(y))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))y=y*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(y)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;y=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return y<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("circle("))){f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ");var C=parseInt(f[0]);if(isNaN(C))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))C=C*(o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("ellipse("))){if((f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ")).length>3&&"closest-side"===f[0]&&"farthest-side"===f[1]&&"at"===f[2]){if(C=parseInt(f[3]),4===f.length){if(f[3].endsWith("%"))C=C*(N=o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(5===f.length)for(var k=3;k<f.length;k++){var R=parseInt(f[k]);if(f[k].endsWith("%"))R=R*(N=3===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(R)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;R=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return R<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}var x=u.indexOf("at");if(m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==x&&(m=u.substring(u.indexOf("(")+1,x)),2!==(f=m.trim().split(" ")).length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(k=0;k<f.length;k++){if(C=parseInt(f[k]),f[k].endsWith("%"))C=C*(N=0===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}if(-1!==(d=u.indexOf("polygon("))){"nonzero"!==(f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(","))[0]&&"evenodd"!==f[0]||f.shift(),A=0,v=0;var P=!1,T=!1;for(k=0;k<f.length;k++){var U=f[k].trim().split(" ");if(2!=U.length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(var I=[0,0],E=0;E<2;E++){var N=parseInt(U[E]);if(isNaN(N))return!1;if(U[E].endsWith("%"))I[E]=0===E?N*o/100:N*s/100;else{var L;if(!(L=n.CSSUtil.getValueUnitPair(U[E])))return!1;I[E]=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}}0===k&&(v=I[0],A=I[1]),Math.abs(I[0]-v)>=e.THRESHOLD&&(P=!0),Math.abs(I[1]-A)>=e.THRESHOLD&&(T=!0)}return P&&T?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1},e.isClippedByInset=function(t,i,a,r,l){void 0===a&&(a="0px"),void 0===r&&(r="0px"),void 0===l&&(l="0px");var o=n.CSSUtil.getComputedStyle(t),s=parseInt(o.width),u=parseInt(o.height),d=parseInt(i);if(isNaN(d))return!1;if(i.endsWith("%"))d=d*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(i)))return!1;d=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(d>u)return!1;var c=parseInt(a);if(isNaN(c))return!1;if(a.endsWith("%"))c=c*s/100;else{if(!(h=n.CSSUtil.getValueUnitPair(a)))return!1;c=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(c>s)return!1;var m=parseInt(r);if(isNaN(m))return!1;if(r.endsWith("%"))m=m*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(r)))return!1;m=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(m>u)return!1;var p=parseInt(l);if(isNaN(p))return!1;if(l.endsWith("%"))p=p*s/100;else{var h;if(!(h=n.CSSUtil.getValueUnitPair(l)))return!1;p=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}return!(p>s)&&(u-(d+m)<=e.THRESHOLD||s-(c+p)<=e.THRESHOLD)},e.THRESHOLD=5,e}();t.ClipPathUtil=r},3883(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ColorObj=t.ColorUtil=void 0;var a=i(3864),n=function(){function e(){}return e.Color=function(t){if(!t)return null;if("transparent"===(t=t.toLowerCase()))return new r(255,255,255,0);if(t in e.CSSColorLookup&&(t=e.CSSColorLookup[t]),t.startsWith("rgb(")){var i=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;return null===(a=t.match(i))?null:new r(a[1],a[2],a[3])}var a;if(t.startsWith("rgba("))return i=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(a=t.match(i))?null:new r(a[1],a[2],a[3],a[4]);if("#"!=t.charAt(0))return null;4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2));var n=parseInt(t.substring(1,3),16),l=parseInt(t.substring(3,5),16),o=parseInt(t.substring(5,7),16);return new r(n,l,o)},e.ColorCombo=function(t){try{var i=t.ownerDocument;if(!i)return null;var n=i.defaultView;if(!n)return null;for(var r=[],l=t;l;)1===l.nodeType&&r.push(l),l=a.DOMWalker.parentElement(l);var o={hasGradient:!1,hasBGImage:!1,textShadow:!1,fg:null,bg:null},s=(b=n.getComputedStyle(t)).color;s||(s="black");for(var u=e.Color(s),d=/transparent|rgba?\([^)]+\)/gi,c=function(e,t,i){try{if(void 0===e.length)return e;for(var a=null,n=null,r=1;r<e.length;++r){for(var l=e[r-1],o=i.contrastRatio(e[r-1]),s=.1,u=0;s>1e-4;){for(;u+s<=1&&o>i.contrastRatio(e[r].mix(e[r-1],u+s).getOverlayColor(t));)l=e[r].mix(e[r-1],u+s).getOverlayColor(t),o=i.contrastRatio(l),u+=s;for(;u-s>=0&&o>i.contrastRatio(e[r].mix(e[r-1],u-s).getOverlayColor(t));)l=e[r].mix(e[r-1],u-s).getOverlayColor(t),o=i.contrastRatio(l),u-=s;s/=10}(null===n||n>o)&&(n=o,a=l)}return a}catch(e){console.log(e)}return t},m=e.Color("white"),p=null,h=null,g=null;r.length>0;){var b,_=r.pop();if(null!==(b=n.getComputedStyle(_))){var f=null;if(b.backgroundColor&&"transparent"!=b.backgroundColor&&"rgba(0, 0, 0, 0)"!=b.backgroundColor&&(f=e.Color(b.backgroundColor)),b.backgroundImage&&b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")){var v=b.backgroundImage.match(d);if(v){for(var A=[],w=0;w<v.length;++w)if(v[w].length){var y=e.Color(v[w]);if(void 0!==y.alpha&&y.alpha<1){var C=g||m;y=y.getOverlayColor(C)}A.push(y)}else v.splice(w--,1);f=c(A,g||m,u)}}null===p||b.opacity&&b.opacity.length>0&&parseFloat(b.opacity)<1?(null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),p=1,h=null,g=null,b.opacity&&b.opacity.length>0&&(p=parseFloat(b.opacity)),null!=f&&(h=(g=f).alpha||1,delete g.alpha,1===p&&1===h&&(o.hasBGImage=!1,o.hasGradient=!1))):null!=f&&(null===g?(h=(g=f).alpha||1,delete g.alpha):h=(g=f.getOverlayColor(g)).alpha||1,1===p&&1===h&&1===(g.alpha||1)&&f.alpha),b.backgroundImage&&"none"!=b.backgroundImage&&(b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")?o.hasGradient=!0:o.hasBGImage=!0)}}return null!=g&&delete(u=u.getOverlayColor(g)).alpha,u.alpha=(u.alpha||1)*p,u=u.getOverlayColor(m),null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),o.fg=u,o.bg=m,b.textShadow&&"none"!==b.textShadow&&(o.textShadow=!0),o}catch(e){return null}},e.CSSColorLookup={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",buttontext:"rgba(0, 0, 0, 0.847)",buttonface:"#ffffff",graytext:"rgba(0, 0, 0, 0.247)"},e}();t.ColorUtil=n;var r=function(){function e(e,t,i,a){function n(e){if("string"!=typeof e)return e;var t=e;return"%"!=(t=t.trim())[t.length-1]?parseInt(t):Math.round(2.55*parseFloat(t.substring(0,t.length-1)))}this.red=n(e),this.green=n(t),this.blue=n(i),void 0!==a&&(this.alpha="string"==typeof a?parseFloat(a):a)}return e.prototype.toHexHelp=function(e){var t=Math.round(e).toString(16);return 1===t.length?"0"+t:t},e.prototype.toHex=function(){return"#"+this.toHexHelp(this.red)+this.toHexHelp(this.green)+this.toHexHelp(this.blue)},e.prototype.contrastRatio=function(e){var t=this;void 0!==this.alpha&&(t=this.getOverlayColor(e));var i=t.relativeLuminance();if(!e.relativeLuminance){var a="";for(var n in e)a+=n+"\n";alert(e),alert(a)}var r=e.relativeLuminance();return i>r?(i+.05)/(r+.05):(r+.05)/(i+.05)},e.prototype.relativeLuminance=function(){var e=this.red/255,t=this.green/255,i=this.blue/255;return.2126*(e=e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4))},e.prototype.mix=function(t,i){if(void 0===this.alpha&&void 0===t.alpha)return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue);var a=this.alpha?this.alpha:1,n=t.alpha?t.alpha:1;return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue,i*a+(1-i)*n)},e.prototype.getOverlayColor=function(e){if(void 0===this.alpha||this.alpha>=1)return this;if(this.alpha<0)return null;if(void 0!==e.alpha&&e.alpha<1)return null;var t=this.mix(e,this.alpha);return delete t.alpha,t},e.fromCSSColor=function(t){var i=-1,a=-1,r=-1;if((t=t.toLowerCase()).startsWith("rgb(")){var l=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;if(null===(o=t.match(l)))return null;i=o[1],a=o[2],r=o[3]}else if(t.startsWith("rgba(")){var o;if(l=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(o=t.match(l)))return null;i=o[1],a=o[2],r=o[3]}else{if("#"!=t.charAt(0)){if(!(t in n.CSSColorLookup))return null;t=n.CSSColorLookup[t]}var s=function(e){for(var t={a:10,b:11,c:12,d:13,e:14,f:15},i=0,a=0;a<e.length;++a)i=16*i+parseInt(e.charAt(a)in t?t[e.charAt(a)]:e.charAt(a));return i};4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2)),i=s(t.substring(1,3)),a=s(t.substring(3,5)),r=s(t.substring(5,7))}return new e(i,a,r)},e}();t.ColorObj=r},7139(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,r=t.length;n<r;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.CommonUtil=void 0;var n=i(9910),r=i(4566),l=i(7011),o=i(1950),s=i(3946),u=i(1686),d=i(3864),c=i(5279),m=function(){function e(){}return e.wordCount=function(e){return 0===(e=e.trim()).length?0:e.split(/\s+/g).length},e.isTabbable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;if(t.hasAttribute("inert")||u.DOMUtil.getAncestorWithAttribute(t,"inert",""))return!1;if(t.hasAttribute("tabindex"))return parseInt(t.getAttribute("tabindex"))>=0;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}var n=t.getAttribute("contenteditable");return"true"===n||""===n},e.isFocusable=function(t){return"undefined"!==t&&null!==t&&e.isTabbable(t)},e.isClickable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!(!l.AriaUtil.isWidget(t)||!t.hasAttribute("tabindex"))},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e.tabIndexLEZero=function(t){if(e.hasAttribute(t,"tabindex")&&t.getAttribute("tabindex").match(/^-?\d+$/)){var i=parseInt(t.getAttribute("tabindex"));return 0===i||-1===i}return!1},e.getTabbableChildren=function(t){var i=0;if(t.firstChild||"IFRAME"===t.nodeName.toUpperCase())for(var a=new d.DOMWalker(t);a.nextNode()&&a.node!=t;)1==a.node.nodeType&&!a.bEndTag&&e.isTabbable(a.node)&&++i;return i},e.normalizeSpacing=function(e){return e?e.trim().replace(/\s+/g," "):""},e.isHtmlEquiv=function(e,t){var i=!1;if(e&&"input"===e.nodeName.toLowerCase()){var a=e.getAttribute("type").toLowerCase();a&&(-1!=t.indexOf("checkbox")?i="checkbox"===a:-1!=t.indexOf("radio")&&(i="radio"===a))}return i},e.nonExistantIDs=function(t,i){var a="";if(e.normalizeSpacing(i).length<1)return a;for(var n=i.split(" "),r=t.ownerDocument,l=0;l<n.length;l++){var o="//*[@id='"+n[l]+"']";r.evaluate(o,t,r.defaultNSResolver,0,null).iterateNext()||(a+=n[l]+", ")}return e.normalizeSpacing(a).length>=2?a.substring(0,a.length-2):""},e.getDocElementsByTag=function(e,t){var i=c.FragmentUtil.getOwnerFragment(e);t=t.toLowerCase();var a=r.CacheUtil.getCache(i,"RPT_DOCELEMSBYTAG",{});return t in a||(a[t]=i.querySelectorAll(t),r.CacheUtil.setCache(i,"RPT_DOCELEMSBYTAG",a)),a[t]},e.getChildByTag=function(t,i){return e.getChildByTagHidden(t,i,!1,!1)},e.getChildByTagHidden=function(t,i,a,n){for(var r=[],l=t.firstChild;null!=l;){if(l.nodeName.toLowerCase()===i){if((a||n&&!e.shouldCheckHiddenContent(l))&&!s.VisUtil.isNodeVisible(l)){l=l.nextSibling;continue}r.push(l)}l=l.nextSibling}return r},e.getElementsByRole=function(t,i){return e.getElementsByRoleHidden(t,i,!1,!1)},e.getElementsByRoleHidden=function(t,i,a,n){var o=null;if(null===(o=n?r.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",null):r.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE",null))){o={};for(var s=t.body;null!==d.DOMWalker.parentNode(s);)s=d.DOMWalker.parentNode(s);for(var u=new d.DOMWalker(s);u.nextNode();)if(u.elem()&&!u.bEndTag){var c=[];if(u.elem()&&u.elem().hasAttribute("role")&&(c=u.elem().getAttribute("role").split(" ")),u.elem()&&0===c.length&&n){var m=l.AriaUtil.getImplicitRole(u.node);null!==m&&m.length>0&&(c=m)}if(0===c.length)continue;if(a&&e.shouldNodeBeSkippedHidden(u.node))continue;for(var p=0;p<c.length;++p)c[p]in o||(o[c[p]]=[]),o[c[p]].push(u.node)}n?r.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",o):r.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE",o)}var h=[];if("string"==typeof i){var g=i;(i=[]).push(g)}if(i.length)for(p=0;p<i.length;++p){var b=o[i[p]];if(b)for(var _=0;_<b.length;++_)h.push(b[_])}return h},e.isTarget=function(t){if(!t||1!==t.nodeType||["html","body"].includes(t.nodeName.toLowerCase())||null!==e.getAncestor(t,["svg","pre","code","script","meta","head"])||!s.VisUtil.isNodeVisible(t)||s.VisUtil.isNodeVisuallyHidden(t)||e.isNodeDisabled(t)||s.VisUtil.isElementOffscreen(t))return!1;if(e.isClickable(t))return!0;var i=l.AriaUtil.getResolvedRole(t);if(!i)return!1;if(["listitem","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","treeitem"].includes(i)){var a=t.parentElement;if(a&&"group"===l.AriaUtil.getResolvedRole(a)&&(a=a.parentElement),a&&e.isTarget(a))return!0}return!1},e.getFileExt=function(e){var t=e.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);return null!=t&&t.length>=2?"."+t[1]:""},e.getFileAnchor=function(e){var t=e.match(/#(([^;?\.]|^$)+)([;?]|$)/);return null!=t&&t.length>=2?t[1]:""},e.checkObjEmbed=function(t,i,a){var n=t.nodeName.toLowerCase();if("object"!=n&&"embed"!=n&&"a"!=n&&"area"!=n)return!1;var r=!1;if(!r&&t.hasAttribute("type")&&(r=a(t.getAttribute("type").toLowerCase())),!r&&t.hasAttribute("codetype")&&(r=a(t.getAttribute("codetype"))),!r){var l="";"embed"===n?l=t.getAttribute("src"):"a"===n||"area"===n?l=t.getAttribute("href"):t.hasAttribute("data")&&(l=t.getAttribute("data")),null===l&&(l=""),r=i(e.getFileExt(l))}if(!r&&"object"===n)for(var o=e.getChildByTagHidden(t,"param",!1,!0),s=0;!r&&null!=o&&s<o.length;++s)r=o[s].hasAttribute("value")&&i(e.getFileExt(o[s].getAttribute("value")));return r},e.isAudioObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isAudioExt,function(e){return e.startsWith("audio")})},e.isAudioExt=function(t){return e.valInArray(t.toLowerCase(),[".aif",".aifc",".aiff",".air",".asf",".au",".cda",".dsm",".dss",".dwd",".iff",".kar",".m1a",".med",".mp2",".mp3",".mpa",".pcm",".ra",".ram",".rm",".sam",".sf",".sf2",".smp",".snd",".svx",".ul",".voc",".wav",".wma",".wve"])},e.isVideoObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isVideoExt,function(e){return e.startsWith("video")||e.startsWith("application/x-shockwave-flash")})},e.isVideoExt=function(t){return e.valInArray(t.toLowerCase(),[".asf",".avi",".divx",".dv",".m1v",".m2p",".m2v",".moov",".mov",".mp4",".mpeg",".mpg",".mpv",".ogm",".omf",".qt",".rm",".rv",".smi",".smil",".swf",".vob",".wmv",".rmvb",".mvb"])},e.isImageObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isImgExt,function(e){return e.startsWith("image")})},e.isImgExt=function(t){return e.valInArray(t.toLowerCase(),e.image_extensions)},e.isHtmlExt=function(t){return e.valInArray(t.toLowerCase(),[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml"])},e.hasTriggered=function(e,t){return r.CacheUtil.getCache(e,t,!1)},e.triggerOnce=function(e,t,i){if(i)return!0;var a=r.CacheUtil.getCache(e,t,!1);return r.CacheUtil.setCache(e,t,!0),a},e.valInArray=function(e,t){for(var i in t)if(t[i]===e)return!0;return!1},e.getAncestor=function(e,t){for(var i=e;null!==i;){var a=i.nodeName.toLowerCase();if("string"==typeof t){if(a===t.toLowerCase())break}else if(t.length){for(var n in t)if(t[n]===a)return i}else if(a in t)break;i=d.DOMWalker.parentNode(i)}return i},e.isSibling=function(e,t){if(e&&t){var i=null;for(d.DOMWalker.parentNode(e)&&d.DOMWalker.parentNode(e).firstChild&&(i=d.DOMWalker.parentNode(e).firstChild);i;){if(i===t)return!0;i=i.nextSibling}}return!1},e.isDescendant=function(e,t){for(var i=d.DOMWalker.parentNode(t);null!=i;){if(i===e)return!0;i=d.DOMWalker.parentNode(i)}return!1},e.isDisabledByFirstChildFormElement=function(t){var i=["input","textarea","select","keygen","progress","meter","output"];if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(i.includes(a.node.nodeName.toLowerCase()))return!!e.isNodeDisabled(a.node);return!1},e.isDisabledByReferringElement=function(t){for(var i=t.getAttribute("id"),a=t.ownerDocument.body;null!==d.DOMWalker.parentNode(a);)a=d.DOMWalker.parentNode(a);for(var n=new d.DOMWalker(a);n.nextNode();)if(n.node&&1===n.node.nodeType&&n.elem()&&(n.elem().getAttribute("aria-describedby")||"").split(" ").includes(i)&&e.isNodeDisabled(n.node))return!0},e.getInputLabel=function(t){return e.getLabelForElement(t)},e.getLabelForElement=function(t){return e.getLabelForElementHidden(t,!1)},e.getLabelForElementHidden=function(t,i){var a=t.getRootNode();if(!r.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",null)){for(var n={},l=e.getDocElementsByTag(t,"label"),o=0;o<l.length;++o)if(l[o].hasAttribute("for")){if(i&&!s.VisUtil.isNodeVisible(l[o]))continue;n[l[o].getAttribute("for")]=l[o]}r.CacheUtil.setCache((a.nodeType,a),"AriaUtil_LABELS",n)}if(t.hasAttribute("id")){var u=t.getAttribute("id");if(u.trim().length>0)return r.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",{})[u]}return null},e.getElementAttribute=function(e,t){if(!(t&&e&&e.hasAttribute&&e.hasAttribute(t)))return null;var i=e.getAttribute(t);if(!n.ARIADefinitions.referenceProperties.includes(t))return i;for(var a=i.split(/ +/g),r=!1,l=0;a<a.length;++l){var o=document.getElementById(a[l]);if(o&&!u.DOMUtil.sameNode(o,e)){r=!0;break}}return r?i:null},e.hasImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);return a=e.removeAllFormElementsFromLabel(a),e.hasInnerContentHidden(a)}return!1},e.getImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);a=e.removeAllFormElementsFromLabel(a);var n=e.getInnerText(a);return n&&""!==n.trim()?n.trim():null}return null},e.getFormFieldLabel=function(t){var i="",a=null,n=e.getLabelForElementHidden(t,!0);if(n)a=n.innerText;else{if(!(n=e.getAncestor(t,"label"))||"label"!==n.tagName.toLowerCase()||!e.isFirstFormElement(n,t))return null;var r=n.cloneNode(!0);r=e.removeAllFormElementsFromLabel(r),a=e.getInnerText(r)}return a&&""!==a.trim()&&(i+=a.trim()),(a=e.getLabelTextFromAttribute(n,!0))&&""!==a.trim()&&(i+=a.trim()),(a=l.AriaUtil.getAriaLabel(n))&&""!==a.trim()&&(i+=a.trim()),i.trim()},e.getLabelTextFromAttribute=function(t,i){for(var a=null,n=0;n<t.children.length;n++){var r=t.children.item(n);if(e.form_labelable_elements.includes(r.nodeName.toLowerCase())){a=r;break}}for(var c=new d.DOMWalker(t),m="";c.nextNode()&&c.node!==t;)if(c.node&&1===c.node.nodeType&&c.elem()){var p=c.elem();if(i&&(s.VisUtil.isNodeHiddenFromAT(p)||s.VisUtil.isNodePresentational(p))||a&&a.contains(p))continue;var h=l.AriaUtil.getResolvedRole(p);if("textbox"===h){var g=p.getAttribute("value");g&&g.trim().length>0&&(m+=" "+g.trim())}else if("combobox"===h||"listbox"===h){var b=p.getAttribute("aria-activedescendant")||p.getAttribute("aria-selected")||p.getAttribute("aria-checked");if(b){var _=p.ownerDocument.getElementById(b);if(_&&!u.DOMUtil.sameNode(p,_)){var f=o.AccNameUtil.computeAccessibleName(_);f&&f.name&&(m+=" "+f.name.trim())}}}else if(["progressbar","scrollbar","slider","spinbutton","meter"].includes(h)){var v=p.getAttribute("aria-valuetext");v&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("aria-valuenow"))&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("value"))&&v.trim().length>0&&(m+=" "+v.trim())}var A=l.AriaUtil.getAriaLabel(p);A&&""!==A.trim()&&(m+=" "+A.trim())}return m.trim()},e.isFirstFormElement=function(t,i){if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(-1!==e.form_labelable_elements.indexOf(a.node.nodeName.toLowerCase()))return a.node===i;return!1},e.isShadowHostElement=function(t){if(e.isShadowElement(t))return!1;for(var i=t;i;){if(i.shadowRoot)return!0;i=d.DOMWalker.parentElement(i)}return!1},e.isShadowElement=function(e){return"[object ShadowRoot]"===e.getRootNode().toString()},e.removeAllFormElementsFromLabel=function(e){for(var t=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"],i=e.childNodes,a=0;a<i.length;a++)t.indexOf(i[a].nodeName.toLowerCase())>-1&&e.removeChild(i[a]);return e},e.isIdReferToSelf=function(e,t){if(!t||""===t.trim())return!1;for(var i=t.trim().split(" "),a=0,n=i.length;a<n;++a){var r=c.FragmentUtil.getById(e,i[a]);if(r&&u.DOMUtil.sameNode(r,e))return!0}return!1},e.nodeDepth=function(e){for(var t=0,i=e;null!==i;)i=d.DOMWalker.parentNode(i),t+=1;return t},e.compareNodeOrder=function(t,i){if(t===i)return 0;var a=e.nodeDepth(t),n=e.nodeDepth(i);if(n>a){for(var r=0;r<n-a;++r)i=d.DOMWalker.parentNode(i);if(t===i)return-2}else if(a>n){for(r=0;r<a-n;++r)t=d.DOMWalker.parentNode(t);if(t===i)return 2}for(;null!=t&&null!=i&&d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i);)t=d.DOMWalker.parentNode(t),i=d.DOMWalker.parentNode(i);if(null===t||null===i||d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i))return null;for(;null!=i&&i!=t;)i=i.previousSibling;return null===i?1:-1},e.attributeNonEmpty=function(e,t){return e.hasAttribute(t)&&e.getAttribute(t).trim().length>0},e.getFrameByName=function(e,t){for(var i=[e.ownerDocument.defaultView],a=0;a<i.length;){try{if(i[a].name===t)return i[a];for(var n=0;n<i[a].frames.length;++n)try{i[a].frames[n]&&!i.includes(i[a].frames[n])&&i.push(i[a].frames[n])}catch(e){}}catch(e){}++a}return null},e.defaultNSResolver=function(e){var t;switch(e){case"html":t="http://www.w3.org/1999/xhtml";case"x2":t="http://www.w3.org/TR/xhtml2";case"x":t="http://www.w3.org/1999/xhtml";case"xhtml":t="http://www.w3.org/1999/xhtml";default:t=null}return t},e.isInnerTextOnlyEmpty=function(t){var i=t.innerText;null!=i&&0!==i.trim().length||"slot"===t.nodeName.toLowerCase()||void 0===t.textContent||(i=t.textContent);var a=!(null!==i&&i.trim().length>0);if(1===t.nodeType&&"slot"===t.nodeName.toLowerCase())for(var n=0,r=t.assignedNodes();n<r.length;n++){var l=r[n];a=a&&e.isInnerTextEmpty(l)}return a},e.getInnerText=function(e){var t=e.innerText;return null!=t&&""!==t.trim()||(t=e.textContent),t},e.getOnScreenInnerText=function(t){if(!t)return null;if(3===t.nodeType)return t.nodeValue();for(var i="",a=new d.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){if(1===a.node.nodeType&&(s.VisUtil.hiddenByDefaultElements.includes(a.node.nodeName.toLowerCase())||!s.VisUtil.isNodeVisible(a.node)||s.VisUtil.isElementOffscreen(a.node))){if("title"===a.node.nodeName.toLowerCase()&&e.getAncestor(a.node,"svg"))continue;if(a.node.nextSibling){3===a.node.nextSibling.nodeType&&a.node.nextSibling.nodeValue&&""!==a.node.nextSibling.nodeValue.trim()&&(i+=" "+a.node.nextSibling.nodeValue.trim()),a.node=a.node.nextSibling;continue}break}3===a.node.nodeType&&a.node.nodeValue&&""!==a.node.nodeValue.trim()&&(i+=" "+a.node.nodeValue.trim())}return i.trim()},e.getNodeText=function(e){if(!e)return"";for(var t="",i=e.childNodes,a=0;a<i.length;++a)3==i[a].nodeType&&(t+=i[a].nodeValue);return t},e.isInnerTextEmpty=function(t){var i=e.getInnerText(t);return!(null!=i&&i.trim().length>0)},e.hasInnerContent=function(t){var i=e.getInnerText(t),a=null!==i&&i.trim().length>0;if(null!==t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode();)a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt");return a},e.hasInnerContentHidden=function(t){return e.hasInnerContentHiddenHyperLink(t,!1)},e.svgHasName=function(t){return e.attributeNonEmpty(t,"aria-label")||e.attributeNonEmpty(t,"aria-labelledby")||!!t.querySelector(":scope > title")},e.hasInnerContentHiddenHyperLink=function(t,i){if(!t)return!1;var a=!1;if(null!=t.firstElementChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;){var r=n.node;if(!((a="img"===r.nodeName.toLowerCase()&&(e.attributeNonEmpty(r,"alt")||e.attributeNonEmpty(r,"title"))&&!s.VisUtil.isNodeHiddenFromAT(r)&&!s.VisUtil.isNodePresentational(r)||"svg"===r.nodeName.toLowerCase()&&e.svgHasName(r))||1!==r.nodeType||s.VisUtil.isNodeHiddenFromAT(r)||s.VisUtil.isNodePresentational(r)||(a=!e.isInnerTextOnlyEmpty(r))||!0!==i)){a=e.attributeNonEmpty(r,"aria-label")||e.attributeNonEmpty(r,"aria-labelledby");var l=r.ownerDocument;if(l){var o=l.defaultView;if(o){var u=o.getComputedStyle(r);a||null==u||(a=(u.backgroundImage&&u.backgroundImage.indexOf||u.content)&&e.attributeNonEmpty(r,"alt"))}}}3===r.nodeType&&d.DOMWalker.parentElement(r)===t&&(a=!e.isInnerTextEmpty(r))}else a=!e.isInnerTextEmpty(t);return a},e.hasInnerContentOrAlt=function(t){var i=e.getInnerText(t),a=null!=i&&i.trim().length>0||e.attributeNonEmpty(t,"alt");if(null!=t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;)!(a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt"))&&(l.AriaUtil.hasRole(n.node,"button",!0)||l.AriaUtil.hasRole(n.node,"textbox"))&&(l.AriaUtil.hasAriaLabel(n.node)||e.attributeNonEmpty(n.node,"title")||e.getLabelForElementHidden(n.elem(),!0))&&(a=!0);return a},e.concatUniqueArrayItem=function(e,t){return-1===t.indexOf(e)&&null!==e&&t.push(e),t},e.concatUniqueArrayItemList=function(t,i){for(var a=0;null!==t&&a<t.length;a++)i=e.concatUniqueArrayItem(t[a],i);return i},e.reduceArrayItemList=function(e,t){return t&&t.length>0&&e&&e.length>0?t.filter(function(t){return!e.includes(t)}):t},e.getScopeForTh=function(e){if(e.hasAttribute("scope")){var t=e.getAttribute("scope").toLowerCase();if("row"===t||"rowgroup"===t)return"row";if("col"===t||"colgroup"===t)return"column"}var i=a([],e.parentElement.children,!0).filter(function(e){return 1===e.nodeType&&"th"!=e.tagName.toLowerCase()});return null===i||0===i.length?"column":"row"},e.getControlOfLabel=function(t){var i=e.getAncestor(t,"label");if(i&&i.hasAttribute("for"))return c.FragmentUtil.getById(t,i.getAttribute("for"));for(var a={},n=t;n;){if(1===n.nodeType){var l=n;l.hasAttribute("id")&&(a[l.getAttribute("id")]=!0)}n=d.DOMWalker.parentNode(n)}if(0===Object.keys(a).length)return null;for(var o=1===t.nodeType?t.getAttribute("aria-labelledby"):null,s=r.CacheUtil.getSetCache(t.ownerDocument,"CommonUtil::getControlOfLabel",function(){return t.ownerDocument.querySelectorAll("*[aria-labelledby]")}),u=0;u<s.length;++u)for(var m=s[u],p=0,h=m.getAttribute("aria-labelledby").split(" ");p<h.length;p++)if(h[p]in a&&!e.isIdReferToSelf(t,o))return m;return null},e.isNodeDisabled=function(t){var i=r.CacheUtil.getCache(t,"PT_NODE_DISABLED",void 0);if(void 0!==i)return i;i=!1,3===t.nodeType&&(t=d.DOMWalker.parentNode(t));var a=t.nodeName.toLowerCase(),l=t.hasAttribute("disabled"),o=i,s=t.hasAttribute("aria-disabled")&&"true"===t.getAttribute("aria-disabled");if(o||l&&n.ARIADefinitions.elementsAllowedDisabled.indexOf(a)>-1||s)return i=!0,r.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),!0;var u=d.DOMWalker.parentNode(t);if(null!=u&&1===u.nodeType){var c=e.isNodeDisabled(u);return c&&(i=!0),r.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),c}return!1},e.shouldCheckHiddenContent=function(e){return!1},e.shouldNodeBeSkippedHidden=function(t){return!e.shouldCheckHiddenContent(t)&&!s.VisUtil.isNodeVisible(t)},e.isfocusableByDefault=function(t){return!("a"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||!("area"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||-1!==["input","select","button","textarea","option","area"].indexOf(t.nodeName.toLowerCase())},e.nonTabableChildCheck=function(t){if(!t.hasAttribute("tabindex")||-1!=parseInt(t.getAttribute("tabindex")))return!1;for(var i=new d.DOMWalker(t);i.nextNode();){var a=i.elem();if(null!==a&&a.hasAttribute("tabindex")&&-1!=parseInt(a.getAttribute("tabindex"))&&!e.hasInnerContent(a))return!1}return!0},e.hasAttribute=function(e,t){var i=!1;if(e.hasAttribute)i=e.hasAttribute(t);else if(e.attributes&&e.attributes.getNamedItem){var a=e.attributes.getNamedItem(t);i=a&&a.specified}return i},e.truncateText=function(e,t){return void 0===t&&(t=150),e&&(e=e.trim()).length>t?e.substring(0,t-1)+"...":e},e.input_type_with_placeholder=["text","search","tel","url","email","password","number"],e.input_text_types=["text","file","password","checkbox","radio","search","tel","url","email","date","number","range","time","color"],e.input_time_types=["date","month","week","time","datetime-local"],e.input_other_types=["range","color","checkbox","radio","file","image"],e.form_button_types=["button","reset","submit"],e.form_labelable_elements=["input","textarea","select","keygen","progress","meter","output","button"],e.tabTagMap={button:function(e){return!e.hasAttribute("disabled")},iframe:!0,input:function(e){if(e.hasAttribute("disabled")||"hidden"===e.getAttribute("type"))return!1;if("radio"===e.getAttribute("type")){var t=e.getAttribute("name");if(!t||0===t.trim().length)return!0;var i=e.ownerDocument.querySelectorAll("input[type='radio'][name='"+t.trim()+"']");if(0===i.length||1===i.length)return!0;for(var a=null,n=0;n<i.length;n++)i[n].checked&&(a=i[n]);return null!==a?!!u.DOMUtil.sameNode(a,e):!!u.DOMUtil.sameNode(i[0],e)}return!0},select:function(e){return!e.hasAttribute("disabled")},textarea:function(e){return!e.hasAttribute("disabled")&&"hidden"!==e.getAttribute("type")},a:function(e){return e.hasAttribute("href")},area:function(e){return e.hasAttribute("href")},audio:function(e){return e.hasAttribute("controls")},video:function(e){return e.hasAttribute("controls")},summary:function(e){return e.parentElement&&"details"===e.parentElement.nodeName.toLowerCase()&&u.DOMUtil.sameNode(a([],e.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],e)},details:function(e){return e.children&&0===a([],e.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()}).length}},e.image_extensions=[".bmp",".gif",".jpg",".jpeg",".pcx",".png"],e}();t.CommonUtil=m},9196(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.TableUtil=void 0;var a=i(3946),n=i(7011),r=i(7139),l=function(){function e(){}return e.isDataTable=function(e){return!(n.AriaUtil.hasRole(e,"none")||n.AriaUtil.hasRole(e,"presentation"))},e.isComplexDataTable=function(t){if("AriaUtil_isComplexDataTable"in t)return!!t.AriaUtil_isComplexDataTable;var i=!1;if(t&&e.isDataTable(t)){for(var a=null,n=null,l=t.getElementsByTagName("tr"),o=l.length,s=0,u=0,d=0,c=0;!i&&c<o;++c)if(a=l[c].getElementsByTagName("th"),n=l[c].getElementsByTagName("td"),u=a.length,0!==(s=n.length)){i=u>1;for(var m=0;!i&&m<u;++m)i=(a[m].hasAttribute("rowspan")||a[m].hasAttribute("colspan"))&&r.CommonUtil.getAncestor(a[m],"table")===t;for(var p=0;!i&&p<s;++p)i=(n[p].hasAttribute("rowspan")||n[p].hasAttribute("colspan")||n[p].hasAttribute("headers")&&r.CommonUtil.normalizeSpacing(n[p].getAttribute("headers")).split(" ").length>2)&&r.CommonUtil.getAncestor(n[p],"table")===t}else u>0&&++d,i=2===d;if(!i){var h=t.getElementsByTagName("thead"),g=h.length;g>0&&((i=g>1)||(i=h[0].getElementsByTagName("tr").length>1))}i||0===o||(i=u>0&&!e.tableHeaderExists(t))}return t.AriaUtil_isComplexDataTable=i,i},e.isTableCellEmpty=function(e){return!e||!a.VisUtil.isNodeVisible(e)||0===e.innerHTML.replace(/&nbsp;/g," ").trim().length},e.isTableRowEmpty=function(t){if(!t||!t.cells||0===t.cells.length||!a.VisUtil.isNodeVisible(t))return!0;for(var i=!0,n=0;i&&n<t.cells.length;n++){var r=t.cells[n];i=e.isTableCellEmpty(r)}return i},e.tableHeaderExists=function(t){var i=t.rows;if(!i||0===i.length)return null;for(var a=!0,n=i[0],l=0;a&&l<i.length;l++)(n=i[l]).parentNode&&"tfoot"===n.parentNode.nodeName.toLowerCase()||(a=e.isTableRowEmpty(n));if(a)return null;for(a=!0,l=0;a&&l<n.cells.length;l++){var o=n.cells[l];a=e.isTableCellEmpty(o)||"th"===o.nodeName.toLowerCase()}if(a)return!0;a=!0;for(var s=0;a&&s<i.length;++s)i[s].parentNode&&"tfoot"===i[s].parentNode.nodeName.toLowerCase()||(a=!i[s].cells||0===i[s].cells.length||0===i[s].cells[0].innerHTML.trim().length||"td"!=i[s].cells[0].nodeName.toLowerCase());if(a)return!0;a=!0;var u=[],d=[];for(l=0;a&&l<i.length;l++)for(var c=i[l],m=0;m<c.cells.length;m++)o=c.cells[m],e.isTableCellEmpty(o)||("td"===o.nodeName.toLowerCase()?o.getAttribute("headers")&&0!==o.getAttribute("headers").trim().length?r.CommonUtil.concatUniqueArrayItemList(o.getAttribute("headers").trim().split(" "),d):a=!1:"th"===o.nodeName.toLowerCase()&&o.getAttribute("id")&&o.getAttribute("id").trim().length>0&&r.CommonUtil.concatUniqueArrayItem(o.getAttribute("id").trim(),u));return!!(a&&u.length>0&&d.every(function(e){return u.includes(e)}))},e.isLayoutTable=function(e){return n.AriaUtil.hasRole(e,"presentation")||n.AriaUtil.hasRole(e,"none")},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e}();t.TableUtil=l},3946(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.VisUtil=void 0;var a=i(4566),n=i(1686),r=i(3864),l=i(7507),o=i(7011),s=i(4919),u=i(167),d=function(){function e(){}return e.isNodeVisible=function(t){3===t.nodeType&&(t=r.DOMWalker.parentNode(t));var i,n=t;if(1!==n.nodeType)return!0;if(!n.ownerDocument)return!0;var l=n.nodeName.toLowerCase();if(null!=e.hiddenByDefaultElements&&null!=e.hiddenByDefaultElements&&e.hiddenByDefaultElements.indexOf(l)>-1)return!1;var o=a.CacheUtil.getCache(n,"PT_NODE_HIDDEN",void 0);if(void 0!==o)return o;if(o=a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1),null===e.unhideableElements||void 0===e.unhideableElements||-1===e.unhideableElements.indexOf(l)){if(!n.ownerDocument.defaultView)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);i=n.ownerDocument.defaultView.getComputedStyle(n,null);var s=n.getAttribute("hidden"),d=o,c="boolean"==typeof n.hidden&&n.hidden;if(!i&&!c&&null==s&&!d)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);if(null!==i&&("none"===i.getPropertyValue("display")||!a.CacheUtil.getCache(n,"Visibility_Check_Parent",null)&&"hidden"===i.getPropertyValue("visibility"))||"block"!==i.getPropertyValue("display")&&(c||null!=s||d))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(e.isContentHidden(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(u.ClipPathUtil.isNodeVisuallyHiddenByClipPath(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1)}var m=r.DOMWalker.parentNode(n);if(null!=m&&1===m.nodeType){a.CacheUtil.setCache(m,"Visibility_Check_Parent",!0);var p=e.isNodeVisible(m);return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",p)}return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0)},e.isNodeVisuallyHidden=function(t){if(!t||1!==t.nodeType)return!1;var i=t,n=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN",void 0);if(void 0===n){var l=s.CSSUtil.getComputedStyle(i);if("absolute"===l.position&&l.clip&&"rect(0px,0px,0px,0px)"===l.clip.replaceAll(" ","")||l.opacity&&parseFloat(l.opacity)<.1)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",!0),!0;var o=r.DOMWalker.parentElement(i);if(!o)return!1;var u=e.isNodeVisuallyHidden(o);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",u),u}return n},e.isContentHidden=function(e){if(!e)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_ContentHidden",void 0);if(void 0!==t)return t;var i=getComputedStyle(e);return i?"hidden"!==i.getPropertyValue("content-visibility")||"inline"===i.getPropertyValue("display")?(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1)},e.isElementOffscreen=function(e){if(!e)return!0;if(1!==e.nodeType)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_Offscreen",void 0);if(void 0!==t)return t;var i=(new l.DOMMapper).getUnadjustedBounds(e);return i?0===i.height||0===i.width||i.top+i.height<=0||i.left+i.width<=0?(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0)},e.isNodeHiddenFromAT=function(t){if(!t)return!1;var i=a.CacheUtil.getCache(t,"PT_NODE_HiddenFromAT",void 0);return void 0!==i?i:e.isNodeVisible(t)&&"true"!==t.getAttribute("aria-hidden")?n.DOMUtil.getAncestorWithAttribute(t,"aria-hidden","true")?(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!1),!1):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0)},e.isNodePresentational=function(e){var t=o.AriaUtil.getResolvedRole(e);return!(!t||"none"!==t&&"presentation"!==t)},e.isElementScrollable=function(e){if(!e)return!1;var t=s.CSSUtil.getComputedStyle(e);if(!t)return!1;var i=t.getPropertyValue("overflow-x"),a=t.getPropertyValue("overflow-y");if("visible"!==i||"hidden"!==a&&"scroll"!==a&&"auto"!==a||(i="auto"),"visible"!==a||"hidden"!==i&&"scroll"!==i&&"auto"!==i||(a="auto"),"clip"===i&&"visible"!==a&&"clip"!==a&&(i="hidden"),"clip"===a&&"visible"!==i&&"clip"!==i&&(a="hidden"),!("visible"!==i&&"hidden"!==i&&"clip"!==i||"visible"!==a&&"hidden"!==a&&"clip"!==a))return!1;if(Math.max(e.offsetWidth,e.offsetHeight)<30||Math.min(e.offsetWidth,e.offsetHeight)<15)return!1;var n=s.CSSUtil.getPixelsFromStyle(t.paddingLeft,e)+s.CSSUtil.getPixelsFromStyle(t.paddingRight,e),r=s.CSSUtil.getPixelsFromStyle(t.paddingTop,e)+s.CSSUtil.getPixelsFromStyle(t.paddingBottom,e);return!(e.scrollWidth-e.clientWidth<1+n&&e.scrollHeight-e.clientHeight<1+r)},e.unhideableElements=["area","param","audio"],e.hiddenByDefaultElements=["script","link","style","head","meta","base","noscript","template","datalist"],e}();t.VisUtil=d},8855(e){e.exports=JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}')}};const t={};function i(a){const n=t[a];if(void 0!==n)return n.exports;const r=t[a]={exports:{}};return e[a].call(r.exports,r,r.exports,i),r.exports}let a={};(()=>{let e=a;Object.defineProperty(e,"__esModule",{value:!0}),e.checkDemo=e.SRViewer=e.SRCursor=e.SRController=e.DOMWalker=e.Config=e.ARIAMapper=e.Checker=e.Context=void 0;var t=i(920);Object.defineProperty(e,"Context",{enumerable:!0,get:function(){return t.Context}});var n=i(7412);Object.defineProperty(e,"Checker",{enumerable:!0,get:function(){return n.Checker}});var r=i(9955);Object.defineProperty(e,"ARIAMapper",{enumerable:!0,get:function(){return r.ARIAMapper}});var l=i(4516);Object.defineProperty(e,"Config",{enumerable:!0,get:function(){return l.Config}});var o=i(3864);Object.defineProperty(e,"DOMWalker",{enumerable:!0,get:function(){return o.DOMWalker}});var s=i(5233);Object.defineProperty(e,"SRController",{enumerable:!0,get:function(){return s.SRController}});var u=i(8195);Object.defineProperty(e,"SRCursor",{enumerable:!0,get:function(){return u.SRCursor}});var d=i(8107);Object.defineProperty(e,"SRViewer",{enumerable:!0,get:function(){return d.SRViewer}}),e.checkDemo=function(e){e||(e=0);var t=new n.Checker;setTimeout(function(){t.check(document.documentElement,["IBM_Accessibility","IBM_Design"]).then(function(e){console.log(e);for(var t={FAIL:0,POTENTIAL:1,MANUAL:2,PASS:3},i=0;i<e.results.length;++i)"PASS"===e.results[i].value[1]&&e.results.splice(i--,1);e.results.sort(function(e,i){return e.category!=i.category?e.category.localeCompare(i.category):e.path.aria===i.path.aria?t[e.value[1]]-t[i.value[1]]:e.path.aria.localeCompare(i.path.aria)});for(var a=null,n=null,r=0,l=e.results;r<l.length;r++){var o=l[r];n!==o.category&&(null!==n&&(console.groupEnd(),console.groupEnd(),a=null),n=o.category,console.group(o.category)),o.path.aria!=a&&(null!==a&&console.groupEnd(),""===(a=o.path.aria)?console.group("page"):console.group(a)),console.log(o.value,o.message)}console.groupEnd(),console.groupEnd()})},e)}})(),ace=a})(); +new ace.SRViewer(); \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.09.02/js/ace-window-debug.js b/rule-server/src/static/archives/2026.09.02/js/ace-window-debug.js new file mode 100644 index 000000000..c52214c56 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/js/ace-window-debug.js @@ -0,0 +1,38617 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * 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. + */ +var ace; +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/v2/aria/ARIADefinitions.ts" +/*!****************************************!*\ + !*** ./src/v2/aria/ARIADefinitions.ts ***! + \****************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIADefinitions = void 0; +var ARIADefinitions = /** @class */ (function () { + function ARIADefinitions() { + } + ARIADefinitions.nameFromContent = function (role) { + return (role in ARIADefinitions.designPatterns) + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"); + }; + /* + * array of WAI-ARIA global states and properties + * @see https://www.w3.org/TR/wai-aria-1.2/#global_states + */ + ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby", + "aria-details", "aria-flowto", "aria-hidden", "aria-keyshortcuts", + "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription" + // the following are deprecated in ARIA 1.2, will indicate deprecation in individual role + , + 'aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid' + ]; + //properties contains id(s) that refer to other element(s) + ARIADefinitions.referenceProperties = ["aria-owns", "aria-controls", "aria-describedby", "aria-labelledby", "aria-flowto", "aria-activedescendant"]; + // deprecated roles + ARIADefinitions.globalDeprecatedRoles = [ + 'directory', 'doc-biblioentry', 'doc-endnote' + ]; + // the following are deprecated in ARIA 1.1 for all the roles + ARIADefinitions.globalDeprecatedProperties = [ + 'aria-grabbed', 'aria-dropeffect' + ]; + /* + * XSD data types for all WAI-ARIA properties + * along with valid values when the data type is NMTOKEN + * WAI-ARIA properties data types explaned: + * type: Used to identify the type of values allowed for the WAI-ARIA property + * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken + * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID + * true: refers to WAI-ARIA property supports hidden ID references + * false: refers to WAI-ARIA property does not support hidden ID references + * Default value will be set to false, if not specified. + */ + ARIADefinitions.propertyDataTypes = { + "aria-activedescendant": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-atomic": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-autocomplete": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty + }, + "aria-busy": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-checked": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-colcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-controls": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-current": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value + }, + "aria-describedby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-details": { + type: "http://www.w3.org/2001/XMLSchema#idrefs" + }, + "aria-disabled": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-dropeffect": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["copy", "move", "link", "execute", "popup", "none"] + }, + "aria-errormessage": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-expanded": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-flowto": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: false + }, + "aria-grabbed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-haspopup": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"] + }, + "aria-hidden": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-invalid": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value + }, + "aria-keyshortcuts": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-label": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-labelledby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-level": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-live": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["off", "polite", "assertive"] + }, + "aria-modal": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiline": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiselectable": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-orientation": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["horizontal", "vertical", "undefined"] + }, + "aria-owns": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-placeholder": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-posinset": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-pressed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-readonly": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-relevant": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["additions", "removals", "text", "all"] + }, + "aria-required": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-roledescription": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-rowcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-selected": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-setsize": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-sort": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["ascending", "descending", "other", "none"] + }, + "aria-valuemax": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuemin": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuenow": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuetext": { + type: "http://www.w3.org/2001/XMLSchema#string" + } + }; + /* + * design patterns for concrete WAI-ARIA roles + * legitimate keys for each role include: + * + * - container: appropriate container(s) for that role + * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above) + * - reqProps: required states or properties for this role + * - reqChildren: required children for this role + * - htmlEquiv: HTML equivalent for this role + * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization) + * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.) + * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.) + * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s) + */ + ARIADefinitions.designPatterns = { + "alert": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "alertdialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "application": { + container: null, + props: ["aria-activedescendant", "aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "article": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "banner": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "blockquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "button": { + container: null, + props: ["aria-expanded", "aria-pressed"], + reqProps: null, + reqChildren: null, + htmlEquiv: "button | input[@type='button']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "caption": { + container: ["figure", "grid", "table", "treegrid"], + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "cell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "checkbox": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='checkbox']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "code": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "columnheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='col']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "combobox": { + container: null, + props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-readonly", "aria-required"], + reqProps: ["aria-expanded"], + reqChildren: [], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "complementary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "comment": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "contentinfo": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "definition": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "deletion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "dialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "directory": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecated: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "doc-abstract": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-acknowledgments": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-afterword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-appendix": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-backlink": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-biblioentry": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-bibliography": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-biblioref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-chapter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-colophon": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-conclusion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-cover": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true + }, + "doc-credit": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-credits": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-dedication": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnote": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnotes": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-epigraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-epilogue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-errata": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-example": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-footnote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-foreword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-index": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-introduction": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-noteref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-notice": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagebreak": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "doc-pagelist": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagefooter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-pageheader": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-part": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-preface": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-prologue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pullquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-qna": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-subtitle": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"] + }, + "doc-tip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-toc": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "emphasis": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "feed": { + container: null, + props: null, + reqProps: null, + reqChildren: ["article"], + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "figure": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "form": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "form", + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "generic": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "div | span", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby", "aria-roledescription"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "graphics-document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"] + }, + "graphics-object": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: false, + nameFrom: ["author"] + }, + "graphics-symbol": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "grid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-readonly", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: "table", + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "gridcell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "widget", + nameFrom: ["author", "contents"] + }, + "group": { + container: null, + props: ["aria-activedescendant"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "heading": { + container: null, + props: null, + reqProps: ["aria-level"], + reqChildren: null, + htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "img": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "image": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "insertion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "link": { + container: null, + props: ["aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "list": { + container: null, + props: null, + reqProps: null, + reqChildren: ["listitem"], + htmlEquiv: "ol | ul", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "listbox": { + container: null, + props: ["aria-activedescendant", "aria-expanded", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["group", "option"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "listitem": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "log": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "main": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "mark": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "mark", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "marquee": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "math": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: false, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menu": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menubar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menuitem": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemcheckbox": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemradio": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "meter": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "navigation": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "none": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "note": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "option": { + container: ["group", "listbox"], + props: ["aria-selected", "aria-checked", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "option", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "paragraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "presentation": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "progressbar": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radio": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='radio']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radiogroup": { + container: null, + props: ["aria-activedescendant", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["radio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "region": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "row": { + container: ["grid", "rowgroup", "table", "treegrid"], + props: ["aria-activedescendant", "aria-colindex", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: ["cell", "columnheader", "gridcell", "rowheader"], + htmlEquiv: "tr", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowgroup": { + container: ["grid", "table", "treegrid"], + props: [], + reqProps: null, + reqChildren: ["row"], + htmlEquiv: "tbody | tfoot | thead", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='row']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "scrollbar": { + container: null, + props: ["aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-controls", "aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "search": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "searchbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='search']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "separator": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "slider": { + container: null, + props: ["aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "spinbutton": { + container: null, + props: ["aria-activedescendant", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "status": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "strong": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "subscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "suggestion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "superscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "switch": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "tab": { + container: ["tablist"], + props: ["aria-expanded", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "table": { + container: null, + props: ["aria-colcount", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup", "caption"], + htmlEquiv: "table", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tablist": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation"], + reqProps: null, + reqChildren: ["tab"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tabpanel": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "term": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "dfn", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "textbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='text']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "time": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "timer": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "toolbar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tooltip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tree": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation", "aria-required"], + reqProps: null, + reqChildren: ["group", "treeitem"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treegrid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treeitem": { + container: ["group", "tree"], + props: ["aria-checked", "aria-expanded", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + }; // end designPatterns + // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements + // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary + // https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled + /** note: + * if a <fieldset> is disabled, the descendant form controls are all disabled except <legend> + * If an <optgroup> is disabled, the select is still interactive (unless otherwise disabled), but none of the items in the option group are selectable. + * When an element has the disabled attribute applied, the :disabled pseudo-class also applies to it. + */ + ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element + ARIADefinitions.elementsAllowedRequired = ["select", "textarea"]; // remove 'input' and add to the individual element, becuase required is not supported on input@type="range", "color", "hidden" or any button types + ARIADefinitions.elementsAllowedReadOnly = ["textarea"]; // remove 'input' and add to the individual element, because readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types + /* https://www.w3.org/TR/html-aria/#docconformance + * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value + * documentConformanceRequirementSpecialTags contains those tags that require special considerations + */ + ARIADefinitions.documentConformanceRequirement = { + "abbr": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "address": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "article": { + implicitRole: ["article"], + validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"], + globalAriaAttributesValid: true + }, + "aside": { + implicitRole: ["complementary"], + validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-glossary", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"], + globalAriaAttributesValid: true + }, + "audio": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "b": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "base": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "bdi": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "bdo": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "blockquote": { + implicitRole: ["blockquote"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "body": { + implicitRole: ["generic"], + validRoles: null, + otherDisallowedAriaAttributes: ['aria-hidden'], + globalAriaAttributesValid: true + }, + "br": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "canvas": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "caption": { + implicitRole: ['caption'], + validRoles: null, + globalAriaAttributesValid: true, + allowAttributesFromImplicitRole: false + }, + "cite": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "code": { + implicitRole: ["code"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "col": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "colgroup": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "data": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "datalist": { + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "dd": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "del": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "details": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "dfn": { + implicitRole: ["term"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "dialog": { + implicitRole: ["dialog"], + validRoles: ["alertdialog"], + globalAriaAttributesValid: true + }, + "dl": { + implicitRole: null, + validRoles: ["group", "list", "none", "presentation"], + globalAriaAttributesValid: true + }, + "dt": { + implicitRole: ["term"], + validRoles: ["listitem"], + globalAriaAttributesValid: true + }, + "em": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "embed": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "fieldset": { + implicitRole: ["group"], + validRoles: ["none", "presentation", "radiogroup"], + globalAriaAttributesValid: true + }, + "figcaption": { + implicitRole: null, + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "form": { + implicitRole: ["form"], + validRoles: ["none", "presentation", "search"], + globalAriaAttributesValid: true + }, + "head": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "hgroup": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "h1": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h2": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h3": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h4": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h5": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h6": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "hr": { + implicitRole: ["separator"], + validRoles: ["doc-pagebreak", "none", "presentation"], + globalAriaAttributesValid: true + }, + "html": { + implicitRole: ["document"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "i": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "iframe": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "ins": { + implicitRole: ["insertion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "kbd": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "label": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "legend": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "link": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "main": { + implicitRole: ["main"], + validRoles: null, + globalAriaAttributesValid: true + }, + "map": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "mark": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "math": { + implicitRole: ["math"], + validRoles: null, + globalAriaAttributesValid: true + }, + "menu": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "meta": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "meter": { + implicitRole: ["meter"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ['aria-valuemax', 'aria-valuemin'], + allowAttributesFromImplicitRole: false + }, + "nav": { + implicitRole: ["navigation"], + validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist", "none", "presentation"], + globalAriaAttributesValid: true + }, + "noscript": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "object": { + implicitRole: null, + validRoles: ["application", "document", "img"], + globalAriaAttributesValid: true + }, + "ol": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "optgroup": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "option": { + implicitRole: ["option"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-selected"] + }, + "output": { + implicitRole: ["status"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "p": { + implicitRole: ["paragraph"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "param": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "picture": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "pre": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "progress": { + implicitRole: ["progressbar"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax"] + }, + "q": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rp": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rt": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "ruby": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "s": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-label", "aria-labelledby"] + }, + "samp": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "script": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "search": { + implicitRole: ['search'], + validRoles: ['search', 'form', 'group', 'none', 'presentation', 'region'], + globalAriaAttributesValid: true + }, + "slot": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "small": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "source": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "span": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "strong": { + implicitRole: ["strong"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "style": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "sub": { + implicitRole: ["subscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "sup": { + implicitRole: ["superscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "svg": { + implicitRole: ["graphics-document"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "table": { + implicitRole: ["table"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "template": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "textarea": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "tfoot": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "thead": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "time": { + implicitRole: ["time"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "title": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "track": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "u": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "ul": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "var": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "video": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "wbr": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + } + }; // end documentConformanceRequirement + ARIADefinitions.documentConformanceRequirementSpecialTags = { + "a": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-disabled=true"] + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "area": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["button", "link"], + globalAriaAttributesValid: true + } + }, + // TODO + // "autonomous custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."], + // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "div": { + "child-dl": { + implicitRole: ["generic"], + validRoles: ["presentation", "none"], + globalAriaAttributesValid: true + }, + "no-child-dl": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "figure": { + "child-figcaption": { + implicitRole: ["figure"], + validRoles: ['doc-example'], + globalAriaAttributesValid: true + }, + "no-child-figcaption": { + implicitRole: ["figure"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "footer": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["contentinfo"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + // TODO + // "form-associated custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise 'generic'."], + // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "header": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["banner"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + "img": { + "img-with-accname": { + implicitRole: ["img"], + //roleCondition: "when accessible name presents", + validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "meter", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "img-without-accname-empty-alt": { + implicitRole: ["presentation", "none"], + //roleCondition: "when no accessible name presents and alt=''", + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + }, + "img-without-accname-no-alt": { + implicitRole: ["img"], + //roleCondition: "when neither accessible name no alt presents", + validRoles: ["presentation", "none"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + } + }, + "input": { + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "checkbox-with-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is present", + validRoles: ["menuitemcheckbox", "option", "switch", "button"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "checkbox-without-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is not present", + validRoles: ["menuitemcheckbox", "option", "switch"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "color": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "date": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "datetime-local": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=email and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "file": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + }, + "hidden": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "image": { + implicitRole: ["button"], + validRoles: ["checkbox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "month": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "number": { + implicitRole: ["spinbutton"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + }, + "password": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "radio": { + implicitRole: ["radio"], + validRoles: ["menuitemradio"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "range": { + implicitRole: ["slider"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax", "aria-valuemin"] + }, + "reset": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "search-no-list": { + implicitRole: ["searchbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "search-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "submit": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "tel-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "tel-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "text-no-list": { + implicitRole: ["textbox"], + validRoles: ["combobox", "searchbox", "spinbutton"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "text-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + // otherDisallowedAriaAttributes: ["aria-haspopup"] // covered in a different rule + }, + "time": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "url-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "url-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "week": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "default-with-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "default-no-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + } + }, + "li": { + "child-of-list-role": { + implicitRole: ['listitem'], + validRoles: null, + globalAriaAttributesValid: true + }, + "no-child-of-list-role": { + implicitRole: ['generic'], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "section": { + "with-name": { + implicitRole: ["region"], + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + }, + "without-name": { + implicitRole: null, + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + } + }, + "select": { + "no-multiple-attr-size-gt1": { + //roleCondition: " with a multiple attribute or a size attribute having value greater than 1" + implicitRole: ["combobox"], + validRoles: ["menu"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + }, + "multiple-attr-size-gt1": { + //roleCondition: " with no multiple attribute and no size attribute having value greater than 1" + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + } + }, + "summary": { + "first-summary-of-detail": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-disabled", "aria-haspopup"] + }, + "no-first-summary-of-detail": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tbody": { + "des-table": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "td": { + "des-table": { + implicitRole: ["cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "th": { + "des-table-row-scope": { + implicitRole: ["rowheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-table-column-scope": { + implicitRole: ["columnheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-row-scope": { + implicitRole: ["rowheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-column-scope": { + implicitRole: ["columnheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tr": { + "des-table": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "default": { + implicitRole: null, + //roleCondition: "", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }; // end of documentConformanceRequirementSpecialTags + // map aria attribute to the corresponding native attribute, apply to any element applicable + // note this mapping is for the related attributes in the same element without checking the parent tree. + // refer to https://w3c.github.io/html-aria/ + ARIADefinitions.relatedAriaHtmlAttributes = { + "aria-checked": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }] + }, + "aria-disabled": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }] + }, + "aria-hidden": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }, + { + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["until-found"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }] + }, + "aria-placeholder": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["placeholder"], + htmlAttributeValues: null + }] + }, + "aria-valuemax": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["max"], + htmlAttributeValues: null + }] + //overlap case covered in the role definition: Authors SHOULD NOT use aria-valuemax on any element which allows the max attribute. Use the max attribute instead. + }, + "aria-valuemin": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["min"], + htmlAttributeValues: null + }] + ////overlap case covered in the role definition:Authors SHOULD NOT use aria-valuemin on any element which allows the min attribute. Use the min attribute instead. + }, + "aria-readonly": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "false", "false"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "true", "true"] + }] + }, + "aria-required": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }] + }, + "aria-colspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["colspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["colspan"], + htmlAttributeValues: null + }] + }, + "aria-rowspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: null + }] + }, + /** "aria-autocomplete": { + conflict: [{ + // conflict occurs if both exists, aria value is only for custom widget, rather than native + ariaAttributeValue: null, + htmlAttributeNames: ["autocomplete"], + htmlAttributeValues: null + }] + } */ + }; + ARIADefinitions.containers = []; + return ARIADefinitions; +}()); +exports.ARIADefinitions = ARIADefinitions; +; +var containerArray = []; +for (var roleDesign in ARIADefinitions.designPatterns) { + var containers = ARIADefinitions.designPatterns[roleDesign].container; + if (containers !== null) { + for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) { + var container = containers_1[_i]; + if (containerArray.indexOf(container) == -1) { + containerArray.push(container); + } + } + } +} +ARIADefinitions.containers = containerArray; + + +/***/ }, + +/***/ "./src/v2/aria/ARIAMapper.ts" +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAMapper.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAMapper = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ./ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../../v4/util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../v4/util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAWalker_1 = __webpack_require__(/*! ./ARIAWalker */ "./src/v2/aria/ARIAWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../../v4/util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var ARIAMapper = /** @class */ (function (_super) { + __extends(ARIAMapper, _super); + function ARIAMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + ARIAMapper.prototype.childrenCanHaveRole = function (node, role) { + // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = node as Element; + // if (elem.getAttribute("aria-hidden") === "true") { + // return false; + // } + // } + return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren); + }; + ARIAMapper.prototype.getRole = function (node) { + var role = ARIAMapper.nodeToRole(node); + return role; + }; + ARIAMapper.prototype.getNamespace = function () { + return "aria"; + }; + ARIAMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "ARIAMapper::getAttributes", undefined); + if (typeof cacheVal !== "undefined") + return cacheVal; + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + var name_1 = attrInfo.name.toLowerCase(); + if (name_1.startsWith("aria-")) { + retVal[name_1.substring(5)] = attrInfo.nodeValue; + } + } + // Optimize: Cache nodeName.toLowerCase() to avoid repeated calls + var nodeName = node.nodeName.toLowerCase(); + // Apply global attributes first + ARIAMapper.applyAttrRole(elem, "global", retVal); + // Apply element-specific attributes + ARIAMapper.applyAttrRole(elem, nodeName, retVal); + CacheUtil_1.CacheUtil.setCache(node, "ARIAMapper::getAttributes", retVal); + } + else if (node.nodeType === 3 /* Node.TEXT_NODE */) { + var calculators = ARIAMapper.textAttrValueCalculators; + for (var attr in calculators) { + var val = calculators[attr](node); + if (typeof val !== "undefined" && val !== null) { + retVal[attr] = val; + } + } + } + return retVal; + }; + // Optimize: Move applyAttrRole outside getAttributes to avoid function recreation + ARIAMapper.applyAttrRole = function (elem, nodeName, retVal) { + var calculators = ARIAMapper.elemAttrValueCalculators; + if (!(nodeName in calculators)) + return; + for (var attr in calculators[nodeName]) { + if (!(attr in retVal)) { + var value = calculators[nodeName][attr]; + if (typeof value !== "undefined" && value !== null) { + if (typeof value !== "string") { + value = value(elem); + } + retVal[attr] = value; + } + } + } + }; + ARIAMapper.getAriaOwnedBy = function (elem) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + if (!CacheUtil_1.CacheUtil.getCache(doc, "ARIAMapper::precalcOwned", false)) { + var owners = doc.querySelectorAll("[aria-owns]"); + for (var iOwner = 0; iOwner < owners.length; ++iOwner) { + var owner = owners[iOwner]; + var ownIds = owner.getAttribute("aria-owns").split(/ +/g); + var _loop_1 = function (iId) { + var owned = doc.getElementById(ownIds[iId]); + //ignore if the aria-owns point to the element itself + //if (owned && !DOMUtil.sameNode(owner, owned)) { + // CacheUtil.setCache(owned, "aria-owned", owner); + //} + /** + * circular hierarchy check: + * (1) the owned element is neither the same element with the owner nor any ascendant of the owner + * (2) any child with aria-owns cannot point to the owner or any ascendant of the owner + */ + if (owned && !DOMUtil_1.DOMUtil.sameNode(owner, owned)) { + // check if the owned with aria-owns that points to another element + var ownedNodes = []; + var sub_owners = owned.querySelectorAll("[aria-owns]"); + for (var i = 0; i < sub_owners.length; ++i) { + var sub_owner = sub_owners[i]; + var sub_ownIds = sub_owner.getAttribute("aria-owns").split(/ +/g); + for (var j = 0; j < sub_ownIds.length; ++j) { + var ownedNode = doc.getElementById(sub_ownIds[j]); + if (ownedNode) + ownedNodes.push(ownedNode); + } + } + if (ownedNodes.length === 0) { + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + return "continue"; + } + // check if any aria-owns points to the element itself or any of it's parent + var parent_1 = owner; + var circular = false; + while (parent_1 !== null) { + var found = ownedNodes.some(function (item) { return DOMUtil_1.DOMUtil.sameNode(parent_1, item); }); + if (!found) + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + else { + circular = true; + break; + } + } + if (!circular) + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + } + }; + for (var iId = 0; iId < ownIds.length; ++iId) { + _loop_1(iId); + } + } + CacheUtil_1.CacheUtil.setCache(doc, "ARIAMapper::precalcOwned", true); + } + return CacheUtil_1.CacheUtil.getCache(elem, "aria-owned", null); + }; + ARIAMapper.prototype.getNodeHierarchy = function (node) { + if (!node) + return []; + if (node.nodeType !== 1) { + var parentHierarchy = this.getNodeHierarchy(DOMWalker_1.DOMWalker.parentElement(node)); + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + var nodeHierarchy = []; + // Set hierarchy + for (var _i = 0, parentHierarchy_1 = parentHierarchy; _i < parentHierarchy_1.length; _i++) { + var item = parentHierarchy_1[_i]; + nodeHierarchy.push(item); + } + nodeHierarchy.push({ + attributes: {}, + bounds: this.getBounds(node), + namespace: this.getNamespace(), + node: node, + role: this.getRole(node) || null, + rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || null), + roleCount: {}, + childrenCanHaveRole: parentInfo.childrenCanHaveRole + }); + return nodeHierarchy; + } + else { + var elem = node; + var nodeHierarchy = CacheUtil_1.CacheUtil.getCache(elem, "ARIAMapper::getNodeHierarchy", null); + if (!nodeHierarchy) { + // This element hasn't been processed yet - but ::reset processes them all in the right order + // Get details about the correct parent first + var parent_2 = ARIAMapper.getAriaOwnedBy(elem); + if (!parent_2) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + while (parent_2 && parent_2.nodeType !== 1) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + var parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + while (parentInfo.role === null) { + parent_2 = ARIAMapper.getAriaOwnedBy(parent_2) || DOMWalker_1.DOMWalker.parentElement(parent_2); + parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + parentInfo = parentHierarchy[parentHierarchy.length - 1]; + } + // Set initial node info + var nodeInfo = { + attributes: elem.nodeType === 1 ? this.getAttributes(elem) : {}, + bounds: this.getBounds(elem), + namespace: this.getNamespace(), + node: elem, + role: this.getRole(elem) || null, + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + // Adjust role if we're within a presentational container + var presentationalContainer = !parentInfo.childrenCanHaveRole; + if (presentationalContainer) { + nodeInfo.role = null; + } + else { + nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole + && this.childrenCanHaveRole(elem, nodeInfo.role); + } + // Set the paths + if (nodeInfo.role !== null) { + parentInfo.roleCount[nodeInfo.role] = (parentInfo.roleCount[nodeInfo.role] || 0) + 1; + nodeInfo.rolePath = parentInfo.rolePath + "/" + nodeInfo.role + "[" + parentInfo.roleCount[nodeInfo.role] + "]"; + } + else { + nodeInfo.rolePath = parentInfo.rolePath; + } + // Set hierarchy + nodeHierarchy = []; + for (var _a = 0, parentHierarchy_2 = parentHierarchy; _a < parentHierarchy_2.length; _a++) { + var item = parentHierarchy_2[_a]; + nodeHierarchy.push(item); + } + nodeHierarchy.push(nodeInfo); + CacheUtil_1.CacheUtil.setCache(elem, "ARIAMapper::getNodeHierarchy", nodeHierarchy); + } + return nodeHierarchy; + } + }; + ARIAMapper.prototype.reset = function (node) { + ARIAMapper.nameComputationId = 0; + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + // Get to the topmost node + var goodNode = node; + var next; + while (next = DOMWalker_1.DOMWalker.parentNode(goodNode)) { + goodNode = next; + } + ; + // Walk the tree and set the hierarchies in the right order + var ariaWalker = new ARIAWalker_1.ARIAWalker(goodNode, false, goodNode); + do { + if (ariaWalker.node.nodeType === 1) { + this.getNodeHierarchy(ariaWalker.node); + } + } while (ariaWalker.nextNode()); + }; + ARIAMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + for (var idx = 0; idx < this.hierarchyResults.length; ++idx) { + if (this.hierarchyResults[idx].role && this.hierarchyResults[idx].role[0] === "/") { + this.hierarchyResults[idx].role = (this.hierarchyResults[idx].role ? this.hierarchyResults[idx].role.substring(1) : null); + } + } + return this.hierarchyResults; + }; + ARIAMapper.prototype.pushHierarchy = function (node) { + // If we're not an element, no special handling + var nodeHierarchy = []; + // Determine our node info + nodeHierarchy = this.getNodeHierarchy(node); + var nodeInfo = nodeHierarchy[nodeHierarchy.length - 1]; + this.hierarchyRole.push(nodeInfo.role); + if (nodeInfo.role !== null) { + this.hierarchyPath.push(nodeInfo); + } + this.hierarchyResults = nodeHierarchy; + }; + ARIAMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + if (retVal.length > 0) { + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + var parent_3 = DOMWalker_1.DOMWalker.parentElement(node); + this.hierarchyResults = parent_3 ? CacheUtil_1.CacheUtil.getCache(parent_3, "ARIAMapper::getNodeInfo", []) : []; + } + return retVal; + }; + /**public static computeName(cur: Node) : string { + ++ARIAMapper.nameComputationId; + return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false); + } + + public static computeNameHelp(walkId: number, cur: Node, labelledbyTraverse: boolean, walkTraverse: boolean) : string { + // 2g. None of the other content applies to text nodes, so just do this first + if (cur.nodeType === 3 ) return cur.nodeValue; + if (cur.nodeType === 11) return ""; + if (cur.nodeType !== 1 ) { + if (walkTraverse || labelledbyTraverse) return ""; + throw new Error ("Can only compute name on Element and Text " + cur.nodeType); + } + + const elem = cur as Element; + // We've been here before - prevent recursion + if (CacheUtil.getCache(elem, "data-namewalk", null) === ""+walkId) return ""; + CacheUtil.setCache(elem, "data-namewalk", ""+walkId); + // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element + + // 2a. Only show hidden content if it's referenced by a labelledby + if (!labelledbyTraverse && !VisUtil.isNodeVisible(cur)) { + return ""; + } + + // 2b. collect valid id references + if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) { + let labelledby = elem.getAttribute("aria-labelledby").split(" "); + let validElems = []; + for (const ref of labelledby) { + const refElem = FragmentUtil.getById(cur, ref); + if (refElem && !DOMUtil.sameNode(elem, refElem)) { + validElems.push(refElem); + } + } + if (validElems.length > 0) { + let accumulated = ""; + for (const elem of validElems) { + accumulated += " " + this.computeNameHelp(walkId, elem, true, false); + } + return accumulated.trim(); + } + } + + // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases + if (["section", "form"].includes(cur.nodeName.toLowerCase())) { + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse) { + return elem.getAttribute("aria-label").trim(); + } + } + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + return ""; + } + + // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label + const role = ARIAMapper.nodeToRole(cur); + let isEmbeddedControl = [ + "textbox", "button", "combobox", "listbox", + "progressbar", "scrollbar", "slider", "spinbutton" + ].includes(role); + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) { + return elem.getAttribute("aria-label").trim(); + } + } + + // 2d. + if (role !== "presentation" && role !== "none") { + if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) { + return DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim(); + } + + if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) { + let label = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id")+"']"); + if (label) { + if (label.hasAttribute("aria-label") || (label.hasAttribute("aria-labelledby") && !CommonUtil.isIdReferToSelf(cur, label.getAttribute("aria-labelledby")))) { + return this.computeNameHelp(walkId, label, false, false); + } else { + return label.textContent; + } + } + } + if (cur.nodeName.toLowerCase() === "fieldset") { + if( (<Element>cur).querySelector("legend")){ + let legend = (<Element>cur).querySelector("legend"); + return legend.innerText; + }else{ + return this.computeNameHelp(walkId, cur, false, false); + } + + } + + } + + // 2e. + if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) { + // If the embedded control has role textbox, return its value. + if (role === "textbox") { + if (elem.nodeName.toLowerCase() === "input") { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + } else { + walkTraverse = false; + } + } + + // If the embedded control has role button, return the text alternative of the button. + if (role === "button") { + if (elem.nodeName.toLowerCase() === "input") { + let type = elem.getAttribute("type").toLowerCase(); + if (["button", "submit", "reset"].includes(type)) { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + if (type === "submit") return "Submit"; + if (type === "reset") return "Reset"; + } + } else { + walkTraverse = false; + } + } + + // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option. + if (role === "combobox") { + if (elem.hasAttribute("aria-activedescendant")) { + let selected = FragmentUtil.getById(elem, "aria-activedescendant"); + if (selected && !DOMUtil.sameNode(elem, selected)) { + return ARIAMapper.computeNameHelp(walkId, selected, false, false); + } + } + } + + // If the embedded control has role range (e.g., a spinbutton or slider): + if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) { + // If the aria-valuetext property is present, return its value, + if (elem.hasAttribute("aria-valuetext")) return elem.getAttribute("aria-valuetext"); + // Otherwise, if the aria-valuenow property is present, return its value, + if (elem.hasAttribute("aria-valuenow")) return elem.getAttribute("aria-valuenow"); + // TODO: Otherwise, use the value as specified by a host language attribute. + } + } + + // 2f. 2h. + if (walkTraverse || ARIADefinitions.nameFromContent(role) || labelledbyTraverse) { + // 2fi. Set the accumulated text to the empty string. + let accumulated = ""; + // 2fii. Check for CSS generated textual content associated with the current node and + // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2] + // can provide textual content for elements that have a content model. + // For :before pseudo elements, User agents MUST prepend CSS textual content, without + // a space, to the textual content of the current node. + // For :after pseudo elements, User agents MUST append CSS textual content, without a + // space, to the textual content of the current node. + let before = null; + before = elem.ownerDocument.defaultView.getComputedStyle(elem,"before").content; + + if (before && before !== "none") { + before = before.replace(/^"/,"").replace(/"$/,""); + accumulated += before; + } + // 2fiii. For each child node of the current node: + // Set the current node to the child node. + // Compute the text alternative of the current node beginning with step 2. Set the result + // to that text alternative. + // Append the result to the accumulated text. + if (elem.nodeName.toUpperCase() === "SLOT") { + //if no assignedNode, check its own text + if (!(elem as HTMLSlotElement).assignedNodes() || (elem as HTMLSlotElement).assignedNodes().length === 0) { + let innerText = CommonUtil.getInnerText(elem); + if (innerText && innerText !== null && innerText.trim().length > 0) + accumulated += " " + innerText; + } else { + // check text from all assigned nodes + for (const slotChild of (elem as HTMLSlotElement).assignedNodes()) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + } + } + } else { + let walkChild = elem.firstChild; + while (walkChild) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + walkChild = walkChild.nextSibling; + } + } + + let after = null; + try { + after = elem.ownerDocument.defaultView.getComputedStyle(elem,"after").content; + } catch (e) {} + + if (after && after !== "none") { + after = after.replace(/^"/,"").replace(/"$/,""); + accumulated += after; + } + // 2fiv. Return the accumulated text. + accumulated = accumulated.replace(/\s+/g," ").trim(); + if (accumulated.trim().length > 0) { + return accumulated; + } + } + + // 2i. Otherwise, if the current node has a Tooltip attribute, return its value. + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + if (elem.tagName.toLowerCase() === "svg") { + let title = elem.querySelector("title"); + if (title) { + return title.textContent || title.innerText; + } + } + + return ""; + } + */ + /* if (role in ARIADefinitions.designPatterns + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) + { + name = elem.textContent; + } + if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) { + name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent; + } + if (elem.hasAttribute("aria-label")) { + name = elem.getAttribute("aria-label"); + } + if (elem.hasAttribute("aria-labelledby")) { + name = ""; + const ids = elem.getAttribute("aria-labelledby").split(" "); + for (const id of ids) { + name += FragmentUtil.getById(elem, id).textContent + " "; + } + name = name.trim(); + } + return name; + }*/ + ARIAMapper.nodeToRole = function (node) { + if (node.nodeType === 3 /* Node.TEXT_NODE */) { + return "text"; + } + else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + var elem = node; + if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + // TO DO: use AriaUtil.getResolvedRole(elem) to replace the code following, which uses only the valid roles for the element based on the aria fallback rule + //const role = AriaUtil.getResolvedRole(elem); + //return role === "presentation" || role === "none" ? null : role; + if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) { + var roleStr = elem.getAttribute("role").trim(); + var roles_2 = roleStr.split(" "); + for (var _i = 0, roles_1 = roles_2; _i < roles_1.length; _i++) { + var role_1 = roles_1[_i]; + if (role_1 === "presentation" || role_1 === "none") { + // If element is focusable, then presentation roles are to be ignored + if (!CommonUtil_1.CommonUtil.isFocusable(elem)) { + return null; + } + } + else if (role_1 in ARIADefinitions_1.ARIADefinitions.designPatterns) { + return role_1; + } + } + } + //return this.elemToImplicitRole(elem); + var roles = AriaUtil_1.AriaUtil.getImplicitRole(elem); + //console.log("node=" + node.nodeName +", role= " + (roles ? roles[0] : null) +", resolved=" + AriaUtil.getResolvedRole(elem)); + var role = !roles || roles.length === 0 ? null : roles[0]; + return role === "presentation" || role === "none" ? null : role; + //return AriaUtil.getResolvedRole(elem); + }; + //////////////////////////////////////////////////////////////////////////// + // Helper functions + //// + // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis + ARIAMapper.elemAttrValueCalculators = { + "global": { + "name": function (elem) { var _a; return (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem)) === null || _a === void 0 ? void 0 : _a.name; } //ARIAMapper.computeName + }, + "datalist": { + // set to "true" if the datalist's selection model allows multiple option elements to be + // selected at a time, and "false" otherwise + "multiselectable": function (elem) { + var id = elem.getAttribute("id"); + if (id && id.length > 0) { + var input = elem.ownerDocument.querySelector("input[list='" + id + "']"); + return "" + (elem.getAttribute("multiple") + && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == "")); + } + return null; + } + }, + "h1": { + "level": "1" + }, + "h2": { + "level": "2" + }, + "h3": { + "level": "3" + }, + "h4": { + "level": "4" + }, + "h5": { + "level": "5" + }, + "h6": { + "level": "6" + }, + "input": { + // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute + // is true, or "true" if the element's checkedness is true, or "false" otherwise + // - type="radio" state set to "true" if the element's checkedness is true, or "false" + // otherwise. + "checked": function (elem) { + var type = elem.getAttribute("type"); + if (type === "checkbox" || type === "radio") { + return "" + elem.checked; + } + return null; + } + // - type="radio" and not in menu reflecting number of type=radio input elements + // within the radio button group + , + "setsize": function (elem) { return null; // removed by dead control flow + } + // - type="radio" and not in menu value reflecting the elements position + // within the radio button group." + , + "posinset": function (elem) { return null; // removed by dead control flow + } + // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a + // suggestions source element) combobox role, with the aria-owns property set to the same + // value as the list attribute + , + "owns": function (elem) { return null; // removed by dead control flow + } + }, + "keygen": { + "multiselectable": "false" + }, + "li": { + // Number of li elements within the ol, ul, menu + "setsize": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var otherlis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::otherlis", function () { return parent.querySelectorAll("ol li, ul li, menu li"); }); + return "" + (lis.length - otherlis.length); + } + // Position of li element within the ol, ul, menu + , + "posinset": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var num = 0; + for (var idx = 0; idx < lis.length; ++idx) { + var li = lis[idx]; + if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) { + return "" + num; + } + ++num; + } + return null; + } + }, + "menuitem": { + // type = checkbox or radio, set to "true" if the checked attribute + // is present, and "false" otherwise + "checked": function (elem) { return "" + !!(elem.getAttribute("checked") + && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); } + }, + "option": { + // set to "true" if the element's selectedness is true, or "false" otherwise. + "selected": function (elem) { return "" + !!(elem.getAttribute("selected") + && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); } + }, + "progress": { + "valuemax": function (elem) { return elem.getAttribute("max") || "1"; }, + "valuemin": function (elem) { return "0"; }, + "valuenow": function (elem) { return elem.getAttribute("value"); } + } + }; + ARIAMapper.textAttrValueCalculators = { + "name": function (node) { return node.nodeValue; } + }; + ARIAMapper.nameComputationId = 0; + return ARIAMapper; +}(CommonMapper_1.CommonMapper)); +exports.ARIAMapper = ARIAMapper; + + +/***/ }, + +/***/ "./src/v2/aria/ARIAWalker.ts" +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAWalker.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAWalker = void 0; +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ./ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +/** + * Walks in an ARIA order + * + * See also ../dom/DOMWalker + */ +var ARIAWalker = /** @class */ (function () { + function ARIAWalker(element, bEnd, root) { + this.root = root || element; + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + // if (this.node.nodeType === 9) { + // this.node = (this.node as Document).documentElement + // } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + } + ARIAWalker.prototype.atRoot = function () { + if (this.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + ARIAWalker.prototype.nextNode = function () { + var skipOwned = false; + do { + skipOwned = false; + // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = true; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + ARIAWalker.prototype.prevNode = function () { + var skipOwned = false; + do { + skipOwned = false; + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + return ARIAWalker; +}()); +exports.ARIAWalker = ARIAWalker; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/ancestor.ts" +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/ancestor.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AncestorUtil = void 0; +var AncestorUtil = /** @class */ (function () { + function AncestorUtil() { + } + AncestorUtil.isPresentationFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 + && elem.nodeName.toLowerCase() === "iframe" + && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) { + return true; + } + } + } + return false; + }; + AncestorUtil.isFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") { + return true; + } + } + } + return false; + }; + return AncestorUtil; +}()); +exports.AncestorUtil = AncestorUtil; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/fragment.ts" +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/fragment.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FragmentUtil = void 0; +var FragmentUtil = /** @class */ (function () { + function FragmentUtil() { + } + FragmentUtil.getOwnerFragment = function (node) { + var n = node; + while (n.parentNode && (n = n.parentNode)) { + if (n.nodeType === 11) { + return n; + } + } + return node.ownerDocument; + }; + FragmentUtil.getById = function (node, id) { + return this.getOwnerFragment(node).getElementById(id); + }; + FragmentUtil.getAncestor = function (hierarchies, elemName) { + var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; }); + return matches.length > 0 && matches[0].node || null; + }; + FragmentUtil.getAncestorWithRole = function (hierarchies, role) { + var matches = hierarchies["aria"].filter(function (info) { return info.role === role; }); + return matches.length > 0 && matches[0].node || null; + }; + return FragmentUtil; +}()); +exports.FragmentUtil = FragmentUtil; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/lang.ts" +/*!***************************************************!*\ + !*** ./src/v2/checker/accessibility/util/lang.ts ***! + \***************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2021- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LangUtil = void 0; +// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry +var validPrimaryLangs = [ + ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"], + ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"], + ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"], + ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"], + ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"], + ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"], + ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"], + ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"], + ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"], + ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"], + ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"], + ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"], + ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"], + ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"], + ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"], + ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"], + ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"], + ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"], + ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"], + ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"], + ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"], + ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"], + ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"], + ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"], + ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"], + ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"] +]; +var LangUtil = /** @class */ (function () { + function LangUtil() { + } + /* Determine if given string is a valid BCP 47 string */ + LangUtil.isBcp47 = function (langStr) { + return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr); + }; + LangUtil.validPrimaryLang = function (langStr) { + var primary = langStr.toLowerCase(); + if (primary.includes("-")) { + primary = primary.split("-")[0]; + } + if (!primary.match(/[a-z]{2,3}/)) + return false; + // qaa..qtz + if (primary.length === 3 + && primary.charAt(0) === "q" + && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116 + && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) { + } + return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary); + }; + LangUtil.matchPrimaryLang = function (lang1, lang2) { + var primary1 = lang1; + if (primary1.includes("-")) { + primary1 = primary1.split("-")[0]; + } + var primary2 = lang2; + if (primary2.includes("-")) { + primary2 = primary2.split("-")[0]; + } + return primary1.toLowerCase() === primary2.toLowerCase(); + }; + return LangUtil; +}()); +exports.LangUtil = LangUtil; + + +/***/ }, + +/***/ "./src/v2/common/CommonMapper.ts" +/*!***************************************!*\ + !*** ./src/v2/common/CommonMapper.ts ***! + \***************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonMapper = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonMapper = /** @class */ (function () { + function CommonMapper() { + this.hierarchyRole = null; + this.hierarchyPath = null; + this.hierarchyResults = null; + } + CommonMapper.prototype.getBounds = function (node) { + return null; + }; + CommonMapper.prototype.reset = function (node) { + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + var ancestors = []; + var parent = DOMWalker_1.DOMWalker.parentNode(node); + while (parent && parent.nodeType != 9 /* Node.DOCUMENT_NODE */) { + ancestors.push(parent); + parent = DOMWalker_1.DOMWalker.parentNode(parent); + } + ancestors = ancestors.reverse(); + for (var _i = 0, ancestors_1 = ancestors; _i < ancestors_1.length; _i++) { + var ancestor = ancestors_1[_i]; + var siblings = []; + var sibling = ancestor.previousSibling; + while (sibling) { + siblings.push(sibling); + sibling = sibling.previousSibling; + } + siblings = siblings.reverse(); + for (var _a = 0, siblings_1 = siblings; _a < siblings_1.length; _a++) { + var sibling_1 = siblings_1[_a]; + this.pushHierarchy(sibling_1); + this.popHierarchy(); + } + this.pushHierarchy(ancestor); + } + }; + CommonMapper.prototype.pushHierarchy = function (node) { + var role = this.getRole(node) || null; + this.hierarchyRole.push(role); + if (role !== null) { + var parentPathInfo = this.hierarchyPath[this.hierarchyPath.length - 1]; + parentPathInfo.roleCount[role] = (parentPathInfo.roleCount[role] || 0) + 1; + this.hierarchyPath.push({ + "rolePath": parentPathInfo.rolePath + "/" + role + "[" + parentPathInfo.roleCount[role] + "]", + "roleCount": {} + }); + } + var attr = {}; + if (node.nodeType === 1) { + attr = this.getAttributes(node); + } + this.hierarchyResults.push({ + node: node, + namespace: this.getNamespace(), + role: role, + attributes: attr, + rolePath: this.hierarchyPath[this.hierarchyPath.length - 1].rolePath, + bounds: this.getBounds(node) + }); + }; + CommonMapper.prototype.popHierarchy = function () { + var role = this.hierarchyRole.pop(); + if (role !== null) { + this.hierarchyPath.pop(); + } + this.hierarchyResults.pop(); + }; + CommonMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + return this.hierarchyResults; + }; + CommonMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + this.popHierarchy(); + return retVal; + }; + return CommonMapper; +}()); +exports.CommonMapper = CommonMapper; + + +/***/ }, + +/***/ "./src/v2/common/Context.ts" +/*!**********************************!*\ + !*** ./src/v2/common/Context.ts ***! + \**********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = exports.PartInfo = exports.AttrInfo = void 0; +// Context that will cause this rule to execute. +// Context syntax: +// Triggers: +// aria:role - Triggers on element with ARIA role role +// aria:role[attribute] - Triggers on elements with the equivalent logical +// aria- attribute (e.g., button[disabled] will trigger on +// <button disabled> or <div role="button" aria-disabled="true">) +// role[attribute=value] - Similar to above, with case-sensitive match +// to value +// role[attribute~value] - Similar to above, with case-insensitive match +// dom:element - Triggers on an element with the specified name +// dom:element[attribute] - Triggers on a dom element with the specified attribute +// dom:*[attribute] - Triggers on all elements with the specified attribute +// Combining triggers: +// trigger1 trigger2 - Triggers on elements with trigger2 within an +// element with trigger1 +// !trigger1 trigger2 - Triggers on elements with trigger2 not within +// element with trigger1 +// trigger1>trigger2 - Triggers on elements with trigger2 with an +// an immediate parent with trigger1 +// trigger1+trigger2 - Triggers on elements with trigger2 with an +// immediate previous sibling with trigger1 +// trigger1~trigger2 - Triggers on elements with trigger2 with an +// some earlier sibling with trigger1 +// context,context - Triggers on elements with either context +var AttrInfo = /** @class */ (function () { + function AttrInfo(inclusive, attr, eq, value) { + this.inclusive = inclusive; + this.attr = attr; + this.eq = eq; + this.value = value; + if (!inclusive + && ((typeof eq) !== "undefined" && eq.length > 0)) { + throw new Error("Cannot have !attr" + eq + " context"); + } + if (inclusive && (typeof eq) !== "undefined" && eq.length > 0 && ((typeof value) === "undefined" || value.length === 0)) { + throw new Error("Cannot have equivalence check without a value"); + } + } + AttrInfo.prototype.matches = function (context) { + var ruleAttrPart = this; + var elemAttrs = context.attributes; + if (!(ruleAttrPart.attr in elemAttrs)) { + return !ruleAttrPart.inclusive; + } + else if (!ruleAttrPart.inclusive) { + return false; + } + else if (!ruleAttrPart.eq) { + // inclusive match and I have that attribute and no equivalence defined + return true; + } + else { + // inclusive match and I have that attribute and equivalence defined + var attrValue = elemAttrs[ruleAttrPart.attr]; + if (ruleAttrPart.eq === "=") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!=") { + return ruleAttrPart.value !== attrValue; + } + else if (ruleAttrPart.eq === "~") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!~") { + return ruleAttrPart.value !== attrValue; + } + else { + throw new Error("Context equivalence operator not supported"); + } + } + }; + return AttrInfo; +}()); +exports.AttrInfo = AttrInfo; +var PartInfo = /** @class */ (function () { + function PartInfo(inclusive, namespace, role, attrs, connector) { + this.inclusive = inclusive; + this.namespace = namespace; + this.role = role; + this.attrs = attrs; + this.connector = connector; + if (role === "*" && !inclusive) { + throw new Error("!* context not supported"); + } + } + PartInfo.prototype.matches = function (contextHier, hierLevel) { + var rulePart = this; + var ruleRoleMatch = (rulePart.namespace in contextHier) && contextHier[rulePart.namespace][hierLevel] + && (contextHier[rulePart.namespace][hierLevel].role === rulePart.role + || contextHier[rulePart.namespace][hierLevel].role !== "none" && rulePart.role === "*"); + if (ruleRoleMatch + && rulePart.role === "*" + && rulePart.namespace === "dom" + && (contextHier[rulePart.namespace][hierLevel].role === "#text" + || contextHier[rulePart.namespace][hierLevel].role === "/#text")) { + ruleRoleMatch = false; + } + if (rulePart.inclusive && !ruleRoleMatch) + return false; + if (!rulePart.inclusive && !ruleRoleMatch) + return true; + // Match the attributes + var ruleAttrs = rulePart.attrs; + var elemContext = contextHier[rulePart.namespace][hierLevel]; + var match = true; + for (var _i = 0, ruleAttrs_1 = ruleAttrs; _i < ruleAttrs_1.length; _i++) { + var ruleAttrPart = ruleAttrs_1[_i]; + match = match && ruleAttrPart.matches(elemContext); + } + if (!rulePart.inclusive) + match = !match; + return match; + }; + return PartInfo; +}()); +exports.PartInfo = PartInfo; +var Context = /** @class */ (function () { + function Context(context) { + this.contextInfo = []; + var contextHierMatches = context.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g); + var results = []; + for (var _i = 0, contextHierMatches_1 = contextHierMatches; _i < contextHierMatches_1.length; _i++) { + var part = contextHierMatches_1[_i]; + var parts = part.match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/); + var attrInfo = []; + for (var _a = 0, _b = parts[3].match(/\[([^\]]+)\]/g) || []; _a < _b.length; _a++) { + var attrPart = _b[_a]; + var attrParts = attrPart.match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/); + attrInfo.push(new AttrInfo(attrParts[1] !== "!", attrParts[2].toLowerCase(), attrParts[3], attrParts[4])); + } + parts[2] = parts[2].toLowerCase(); + var nsParts = parts[2].split(":"); + var incl = parts[1] !== "!"; + var ns = nsParts.shift(); + var role = nsParts.join(":"); + var partInfo = new PartInfo(incl, ns, role, attrInfo, parts[parts.length - 1]); + results.push(partInfo); + } + this.contextInfo = results; + } + Context.cleanContext = function (context) { + context = context.toLowerCase().trim(); + context = context.replace(/ +!/g, " !"); + context = context.replace(/ +([>+~,])/g, "$1"); + context = context.replace(/([>+~,]) +/g, "$1"); + context = context.replace(/ +/g, " "); + return context.trim(); + }; + Context.parse = function (context) { + var contexts = Context.splitMultiple(Context.cleanContext(context)); + var retVal = []; + for (var i = 0; i < contexts.length; ++i) { + var ctx = new Context(contexts[i]); + retVal.push(ctx); + } + return retVal; + }; + /** + * Handles initial processing of splitting on comma - context,context + * @param context + */ + Context.splitMultiple = function (context) { + var contexts = []; + if (context) { + if (context.indexOf(",") === -1) { + contexts.push(context); + } + else { + for (var _i = 0, _a = context.split(","); _i < _a.length; _i++) { + var c = _a[_i]; + contexts.push(c); + } + } + } + return contexts; + }; + return Context; +}()); +exports.Context = Context; + + +/***/ }, + +/***/ "./src/v2/common/Engine.ts" +/*!*********************************!*\ + !*** ./src/v2/common/Engine.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Engine = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var Context_1 = __webpack_require__(/*! ./Context */ "./src/v2/common/Context.ts"); +var Config_1 = __webpack_require__(/*! ../config/Config */ "./src/v2/config/Config.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../../v4/api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var WrappedRule = /** @class */ (function () { + function WrappedRule(rule, parsedInfo) { + this.rule = rule; + this.parsedInfo = parsedInfo; + this.ns = this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length - 1].namespace; + Config_1.Config.DEBUG && console.log("Added Rule:", rule.id, JSON.stringify(this.parsedInfo)); + } + /** + * This function is responsible converting the node into a snippet which can be added to report. + * + * Note: This function will take the node and extract the node name and the attributes and build the snippet based on this. + * + * TODO: Future, maybe we can extract more then just single line, add more info or even add closing tags etc... + * + * @param {HTMLElement} node - The html element to convert into element snippet with node name and attributes only. + * + * @return {String} nodeSnippet - return the element snippet of the element that was provided which only contains, + * nodename and attributes. i.e. <table id=\"layout_table1\" role=\"presentation\"> + * + * @memberOf this + */ + WrappedRule.convertNodeToSnippet = function (node) { + // Variable Decleration + var nodeSnippet = ''; + // Extract the node name and add it to the node snippet + nodeSnippet += '<' + node.nodeName.toLowerCase(); + // Extract all the node attributes as an array + var nodeAttributes = node.attributes; + // In the case there are attributes on this node + if (nodeAttributes !== null && typeof nodeAttributes !== 'undefined') { + // Loop over all theses attributes and add the name and value to the nodeSnippet which will be returned + for (var i = nodeAttributes.length - 1; i >= 0; i--) { + if (nodeAttributes[i].name === "data-namewalk") + continue; + // Add the attribute name and value. + nodeSnippet += ' ' + nodeAttributes[i].name + '="' + nodeAttributes[i].value + '"'; + } + } + // Close the node + nodeSnippet += '>'; + // Return the node snippet + return nodeSnippet; + }; + /** + * This function is responsible for finding the source location for a node, which can be added to a report. + * Supports debug directives in the following forms: + * 1. An attribute on the element itself: + * ibm-a11y-debug="file.ts:10:5" + * 2. A comment node preceding the element (as a sibling or ancestor sibling): + * <!-- ibm-a11y-debug: file.ts:10:5 --> + * 3. A wrapper element (e.g. div) whose first non-whitespace child is such a comment node. + * 4. An ancestor element that carries the ibm-a11y-debug attribute. + * + * Traversal: checks the node itself for an inline attribute, then scans previous siblings at + * each ancestor level upward (also checking each ancestor element's own inline attribute), + * stopping if a blank or 'end' marker is found. + * + * @param {Node} node - The DOM node to find source info for + * @return {string | null} - The source location string, or null if not found + * + * @memberOf this + */ + WrappedRule.convertNodeToSource = function (node, enabled) { + if (enabled === void 0) { enabled = false; } + //console.log("Source Map enabled:", enabled); + if (!enabled || !node) + return null; + var DEBUG_DIRECTIVE = "ibm-a11y-debug"; + /** + * Parses a source string into a DirectiveResult. + * The source is the final resolved value — after any ':' separator has already been stripped. + * A blank value or the exact word 'end' (case-insensitive) is a stop marker. + */ + var parseSource = function (source) { + if (!source || source.toLowerCase() === 'end') { + return { found: true, stop: true }; + } + return { found: true, stop: false, source: source }; + }; + /** + * Extracts the debug-directive comment value from a node. + * Handles: + * - A comment node directly + * - A wrapper element (e.g. <div>) whose first non-whitespace child is a comment node + * + * Returns { found: true, stop: true } if the directive is blank or exactly 'end', + * returns { found: true, stop: false, source } if a valid source is found, + * or returns { found: false } if no directive is present on this node. + */ + var extractDirective = function (elem) { + if (!elem) + return { found: false }; + var commentValue = null; + if (elem.nodeType === Node.COMMENT_NODE) { + // Direct comment node + commentValue = elem.nodeValue; + } + else if (elem.nodeType === Node.ELEMENT_NODE) { + // Element wrapper (e.g. <div><!-- ibm-a11y-debug: ... --></div>) + // Find the first non-whitespace child node + var child = elem.firstChild; + while (child) { + if (child.nodeType === Node.TEXT_NODE) { + // Skip pure whitespace text nodes + if (child.nodeValue && child.nodeValue.trim().length > 0) { + // Non-whitespace text before a comment — not a directive wrapper + break; + } + } + else if (child.nodeType === Node.COMMENT_NODE) { + commentValue = child.nodeValue; + break; + } + else { + // Any other node type before a comment — not a directive wrapper + break; + } + child = child.nextSibling; + } + } + if (commentValue !== null) { + var trimmed = commentValue.trim(); + // Match exactly "ibm-a11y-debug" followed by end-of-string, whitespace, or ':' + // This prevents "ibm-a11y-debug-extra" from being treated as a directive. + if (trimmed === DEBUG_DIRECTIVE || + trimmed.startsWith(DEBUG_DIRECTIVE + ':') || + trimmed.startsWith(DEBUG_DIRECTIVE + ' ') || + trimmed.startsWith(DEBUG_DIRECTIVE + '\t')) { + // Strip the directive name and optional leading whitespace + var afterDirective = trimmed.substring(DEBUG_DIRECTIVE.length).trimStart(); + // Strip a single leading ':' separator if present + // (e.g. "ibm-a11y-debug: file.ts:10:5" → afterDirective = ": file.ts:10:5") + var source = afterDirective.startsWith(':') + ? afterDirective.substring(1).trim() + : afterDirective.trim(); + return parseSource(source); + } + } + return { found: false }; + }; + /** + * Returns the ibm-a11y-debug attribute value from an element node as a DirectiveResult, + * or { found: false } if absent. Recognises the 'end' stop marker just like comment directives. + * The attribute value is the source directly (no ':' prefix), e.g. ibm-a11y-debug="file.ts:10:5". + */ + var getInlineAttr = function (n) { + if (n.nodeType !== Node.ELEMENT_NODE) + return { found: false }; + var val = n.getAttribute(DEBUG_DIRECTIVE); + if (val === null) + return { found: false }; + // Attribute value is the source directly — no ':' separator to strip + return parseSource(val.trim()); + }; + /** + * Traverses left (previous siblings) then upward (parent) to find source info. + * Does NOT check the starting element itself — only its preceding siblings and ancestors. + * This avoids misidentifying a content node as its own source directive. + * + * At each ancestor level the function also checks the ancestor element's own inline + * ibm-a11y-debug attribute, so that a parent element can annotate all its descendants. + * + * Sibling scanning stops at the first node that is recognised as a directive (found or stop). + * Non-directive nodes (real content elements, text nodes) are skipped so that a directive + * placed further back in the sibling list is still found even if content nodes intervene. + * However, traversal does NOT cross element boundaries when scanning siblings — only + * comment nodes and dedicated wrapper elements (whose sole first child is a comment) are + * treated as transparent. + * + * Shadow DOM traversal: uses DOMWalker.parentNode() to cross shadow boundaries correctly, + * including slotted content and nested Shadow DOM (shadow-in-shadow). When the parent + * chain reaches a ShadowRoot, DOMWalker.parentNode() automatically resolves it to the + * shadow host element in the outer DOM. A plain DocumentFragment with no host returns + * null from DOMWalker.parentNode(), stopping traversal. + * + * Sibling traversal uses DOMWalker.previousSiblingNotOwnedBySlot() to skip nodes that + * are assigned to slots (and therefore logically belong to a different part of the tree). + * + * Uses an iterative approach (rather than recursion) to safely handle deeply nested + * DOM structures without risk of stack overflow. + * + * @param elem - The node whose context we are searching + * @returns The source location string, or null if not found + */ + var findSource = function (elem) { + var current = elem; + while (current) { + // Scan previous siblings for a debug directive comment or wrapper element. + // Use previousSiblingNotOwnedBySlot to skip nodes assigned to slots, which + // logically belong to a different part of the composed tree. + // Only comment nodes and dedicated wrapper elements are considered directives; + // all other node types are skipped (they do not block further scanning). + var prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(current); + while (prev) { + var result = extractDirective(prev); + if (result.found) { + if (result.stop) + return null; + return result.source; + } + prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(prev); + } + // No directive found among siblings — move up to parent. + // Use DOMWalker.parentNode() instead of node.parentNode directly so that: + // 1. Shadow DOM boundaries are crossed automatically (ShadowRoot → host element), + // supporting both regular and nested Shadow DOM (shadow-in-shadow). + // 2. Slotted nodes are re-parented to their slot owner rather than their + // light-DOM parent, matching the composed (rendered) tree structure. + // 3. Nodes with an ownerElement (e.g. iframe document roots) are re-parented + // to their owner element. + var parent_1 = DOMWalker_1.DOMWalker.parentNode(current); + if (!parent_1 || parent_1.nodeType === Node.DOCUMENT_NODE) { + // Reached the top of the tree (or a plain DocumentFragment with no host) + // without finding a directive. + return null; + } + // Check the parent element's own inline attribute before continuing upward. + // This allows a containing element to annotate all its descendants. + // An 'end' inline attribute on the parent stops traversal entirely. + var parentAttrResult = getInlineAttr(parent_1); + if (parentAttrResult.found) { + if (parentAttrResult.stop) + return null; + return parentAttrResult.source; + } + current = parent_1; + } + return null; + }; + // First, check for an inline attribute directive on the element itself. + // An 'end' attribute on the element itself stops traversal (returns null). + var selfAttrResult = getInlineAttr(node); + if (selfAttrResult.found) { + if (selfAttrResult.stop) + return null; + return selfAttrResult.source; + } + // Then traverse the DOM to find a preceding comment directive or ancestor attribute + return findSource(node); + }; + WrappedRule.prototype.run = function (engine, context, options, contextHierarchies) { + var startTime = new Date().getTime(); + var results; + try { + results = this.rule.run(context, options, contextHierarchies); + } + catch (e) { + var err = e; + console.error("RULE EXCEPTION:", this.rule.id, context.dom.rolePath, err.stack); + throw e; + } + var endTime = new Date().getTime(); + if (!results) + results = []; + if (!(results instanceof Array)) { + results = [results]; + } + var retVal = []; + for (var _i = 0, results_1 = results; _i < results_1.length; _i++) { + var result = results_1[_i]; + var message = engine.getMessage(this.rule.id, result.reasonId, result.messageArgs); + var path = {}; + for (var ns in context) { + path[ns] = context[ns].rolePath; + } + var ruleId = this.rule.id.replace(/^(.*)\$\$\d+$/, "$1"); + retVal.push({ + ruleId: ruleId, + value: result.value, + node: context["dom"].node, + path: path, + ruleTime: endTime - startTime, + reasonId: result.reasonId, + message: message, + messageArgs: result.messageArgs, + apiArgs: result.apiArgs, + bounds: context["dom"].bounds, + snippet: WrappedRule.convertNodeToSnippet(context["dom"].node), + source: WrappedRule.convertNodeToSource(context["dom"].node, engine.isSourceMapEnabled()) + }); + } + return retVal; + }; + return WrappedRule; +}()); +var Engine = /** @class */ (function () { + function Engine() { + this.mappers = {}; + this.ruleMap = {}; + this.wrappedRuleMap = {}; + this.nlsMap = {}; + this.helpMap = {}; + this.sourceMapEnabled = false; + this.inclRules = {}; + this.exclRules = {}; + // Need a DOM Mapper as a minimum + this.addMapper(new DOMMapper_1.DOMMapper()); + } + Engine.getLanguages = function () { + var env = typeof process !== "undefined" && typeof process.nodeType === "undefined" && process.env; + // If all else fails, default to US English + var nodeLang = "en-US"; + if (env) { + nodeLang = env.LANG || env.LANGUAGE || env.LC_ALL || env.LC_MESSAGES; + if (nodeLang && nodeLang.length > 0) { + nodeLang = nodeLang.split(".")[0].replace(/_/g, "-"); + } + else { + nodeLang = "en-US"; + } + } + return typeof navigator !== "undefined" && navigator.languages || [nodeLang]; + }; + Engine.prototype.run = function (root, options) { + if (root === null) { + return Promise.reject("null document"); + } + if (root.nodeType === 9 /* Node.DOCUMENT_NODE */) { + root = root.documentElement; + } + root.ownerDocument && (root.ownerDocument.PT_CHECK_HIDDEN_CONTENT = false); + var numNodesVisited = CacheUtil_1.CacheUtil.clearCaches(root); + var walker = new DOMWalker_1.DOMWalker(root, false, root, true); + var retVal = { + results: [], + numExecuted: 0, + ruleTime: 0, + totalTime: 0 + }; + var start = new Date().getTime(); + // Reset the role mappers + for (var namespace in this.mappers) { + this.mappers[namespace].reset(root); + } + // Initialize the context detector + var currentNodeCount = 0; + var lastReportedPercent = -1; + do { + currentNodeCount++; + // Report progress at each percentage milestone + var currentPercent = Math.floor((currentNodeCount / numNodesVisited) * 100); + if (currentPercent > lastReportedPercent) { + if (numNodesVisited > 10000) { + // if (currentPercent > 6) break; + console.log("Progress: ".concat(currentPercent, "% (").concat(currentNodeCount, "/").concat(numNodesVisited, " nodes)")); + // const ruleTimes = retVal.results.reduce((prev, cur) => { + // prev[cur.ruleId] = (prev[cur.ruleId] || 0)+cur.ruleTime; + // return prev; + // }, {}); + // for (const ruleId in ruleTimes) { + // if (ruleTimes[ruleId] > 10000) { + // console.log(`${ruleId}: ${ruleTimes[ruleId]}`); + // } + // } + // console.groupEnd(); + } + lastReportedPercent = currentPercent; + } + // Get the context information from the rule mappers + var contextHierarchies = {}; + for (var namespace in this.mappers) { + if (!walker.bEndTag) { + contextHierarchies[namespace] = this.mappers[namespace].openScope(walker.node); + // if (namespace === "dom" && walker.node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = walker.node as Element; + // let id; + // if (elem.hasAttribute("id") && (id = elem.getAttribute("id").trim()).length > 0) { + // if (root.ownerDocument.getElementById(id) === elem) { + // contextHierarchies["dom"][contextHierarchies["dom"].length-1].rolePath = "//*[@id='"+id+"']"; + // } + // } + // } + } + else { + contextHierarchies[namespace] = this.mappers[namespace].closeScope(walker.node); + } + } + if (walker.node.nodeType !== 11 + && (VisUtil_1.VisUtil.isNodeVisible(walker.node) + // || walker.node.nodeName.toLowerCase() === "head" + || walker.node.nodeName.toLowerCase() === "meta" + || walker.node.nodeName.toLowerCase() === "style" + || walker.node.nodeName.toLowerCase() === "datalist" + || walker.node.nodeName.toLowerCase() === "param" + || !DOMUtil_1.DOMUtil.getAncestor(walker.node, ["body"]))) { + var context = {}; + for (var ns in contextHierarchies) { + var nsHier = contextHierarchies[ns]; + var lastHier = nsHier[nsHier.length - 1]; + context[ns] = lastHier; + } + var matchingRules = this.getMatchingRules(contextHierarchies); + var depMatch = {}; + for (var _i = 0, matchingRules_1 = matchingRules; _i < matchingRules_1.length; _i++) { + var matchingRule = matchingRules_1[_i]; + var fulfillsDependencies = true; + for (var _a = 0, _b = matchingRule.rule.dependencies || []; _a < _b.length; _a++) { + var dep = _b[_a]; + if (!depMatch[dep]) + fulfillsDependencies = false; + } + if (fulfillsDependencies) { + var results = []; + var start_1 = new Date().getTime(); + try { + results = matchingRule.run(this, context, options, contextHierarchies); + } + catch (err) { + // Wrapper shows error in console. Skip this rule as N/A + // We don't want to kill the engine + } + // If out of scope, it fulfills the dependency + if (results.length === 0) { + depMatch[matchingRule.rule.id] = true; + } + for (var _c = 0, results_2 = results; _c < results_2.length; _c++) { + var result = results_2[_c]; + retVal.results.push(result); + retVal.ruleTime += result.ruleTime; + retVal.numExecuted++; + if (result.value[1] === IRule_1.eRuleConfidence.PASS) { + depMatch[result.ruleId] = true; + } + } + } + } + } + } while (walker.nextNode()); + CacheUtil_1.CacheUtil.clearCaches(root); + retVal.totalTime = new Date().getTime() - start; + return Promise.resolve(retVal); + }; + Engine.prototype.enableRules = function (ruleIds) { + for (var ruleId in this.ruleMap) { + this.ruleMap[ruleId].enabled = false; + } + for (var _i = 0, _a = ruleIds || []; _i < _a.length; _i++) { + var ruleId = _a[_i]; + if (!(ruleId in this.ruleMap)) { + console.warn("WARNING: Rule Id", ruleId, "could not be enabled."); + } + else { + this.ruleMap[ruleId].enabled = true; + } + } + }; + Engine.prototype.getRule = function (ruleId) { + return this.ruleMap[ruleId]; + }; + Engine.prototype.getRulesIds = function () { + var retVal = []; + for (var ruleId in this.ruleMap) { + retVal.push(ruleId); + } + return retVal; + }; + Engine.prototype.addRules = function (rules) { + for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) { + var rule = rules_1[_i]; + this.addRule(rule, true); + } + this._sortRules(); + }; + Engine.prototype.addRule = function (rule, skipSort) { + var ctxs = Context_1.Context.parse(rule.context); + var idx = 0; + var ruleId = rule.id; + if (ruleId in this.ruleMap) { + console.log("WARNING: Rule", ruleId, "already added to engine. Ignoring..."); + return; + } + this.ruleMap[ruleId] = rule; + for (var _i = 0, ctxs_1 = ctxs; _i < ctxs_1.length; _i++) { + var ctx = ctxs_1[_i]; + var wrapId = ruleId; + if (idx >= 1) { + wrapId = ruleId + "$$" + idx; + } + ++idx; + var wrappedRule = new WrappedRule(rule, ctx); + this.wrappedRuleMap[wrapId] = wrappedRule; + var parts = wrappedRule.parsedInfo.contextInfo; + var lastPart = parts[parts.length - 1]; + var triggerRole = lastPart.namespace + ":" + lastPart.role; + if (lastPart.inclusive) { + this.inclRules[triggerRole] = this.inclRules[triggerRole] || []; + this.inclRules[triggerRole].push(wrappedRule); + } + else { + this.exclRules[triggerRole] = this.exclRules[triggerRole] || []; + this.exclRules[triggerRole].push(wrappedRule); + } + } + if (!skipSort) { + this._sortRules(); + } + }; + Engine.prototype.enableSourceMap = function (enable) { + this.sourceMapEnabled = enable; + }; + Engine.prototype.isSourceMapEnabled = function () { + return this.sourceMapEnabled; + }; + Engine.prototype._sortRules = function () { + for (var role in this.inclRules) { + this.inclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + for (var role in this.exclRules) { + this.exclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + }; + Engine.prototype.addNlsMap = function (map) { + for (var key in map) { + this.nlsMap[key] = map[key]; + } + }; + Engine.prototype.addHelpMap = function (map) { + for (var key in map) { + this.helpMap[key] = map[key]; + } + }; + Engine.prototype.getMessage = function (ruleId, ruleIdx, msgArgs) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.nlsMap)) + return ruleId; + var messageTemplate = this.nlsMap[ruleId][ruleIdx || 0]; + if (!messageTemplate) + return ruleId + "_" + ruleIdx; + return messageTemplate.replace(/\{(\d+)\}/g, function (matchedStr, matchedNum, matchedIndex) { return msgArgs[matchedNum]; }); + }; + Engine.prototype.getHelp = function (ruleId, reasonId, archiveId) { + if (!archiveId) { + // Set to the latest + archiveId = "latest"; + } + return "".concat(Config_1.Config.helpRoot, "/").concat(archiveId, "/doc").concat(this.getHelpRel(ruleId, reasonId)); + }; + Engine.prototype.getHelpRel = function (ruleId, ruleIdx) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.helpMap)) + return ruleId; + ruleIdx = ruleIdx || 0; + var helpStr = null; + if (ruleIdx in this.helpMap[ruleId]) { + helpStr = this.helpMap[ruleId][ruleIdx || 0]; + } + else { + helpStr = this.helpMap[ruleId][0]; + } + if (!helpStr) + return ruleId + "_" + ruleIdx; + return helpStr; + }; + Engine.prototype.addMapper = function (mapper) { + this.mappers[mapper.getNamespace()] = mapper; + }; + Engine.match = function (rule, contextHier) { + var ruleParts = rule.parsedInfo.contextInfo; + var partIdx = ruleParts.length - 1; + var curNS = ruleParts[partIdx].namespace; + var curHier = contextHier[curNS][contextHier[curNS].length - 1]; + var contextNode = curHier.node; + // If the end of the rule part doesn't match the end of the hierarchy, we don't have a match + if (!ruleParts[partIdx].matches(contextHier, contextHier[curNS].length - 1)) { + return false; + } + // If there was only one part, we have a match + if (ruleParts.length === 1) { + return true; + } + // Need to deal with parent parts. To walk the hierarchy, these need to be + // all in the same namespace. Confirm that is true. + curNS = ruleParts[0].namespace; + curHier = contextHier[curNS][contextHier[curNS].length - 1]; + --partIdx; + if (ruleParts.slice(0, ruleParts.length - 1).some(function (part) { return part.namespace !== curNS; })) { + console.error("[ERROR] Rule ".concat(rule.rule.id, " has inconsitent parent namespaces")); + return false; + } + // If the target node matches the end of the hierarchy, move up past it, otherwise, start at the end + var hierIdx = contextHier[curNS].length - (curHier.node.isSameNode(contextNode) ? 2 : 1); + while (hierIdx >= 0 && partIdx >= 0) { + var part = ruleParts[partIdx]; + var matchesPart = ruleParts[partIdx].matches(contextHier, hierIdx); + if (part.connector === ">") { + if (!matchesPart) { + // Direct parent check and doesn't match + return false; + } + else { + // Direct parent check and does match + --partIdx; + --hierIdx; + } + } + else if (part.connector === " ") { + if (part.inclusive) { + // inclusive ancestor match + if (matchesPart) { + --partIdx; + } + // If doesn't match, just move up the role hierarchy + --hierIdx; + } + else if (!matchesPart) { + // exclusive ancestor match and current matches + return false; + } + else { + // exclusive ancestor match and current doesn't match - check for other ancestors + var parentMatch = false; + for (var searchIdx = hierIdx - 1; !parentMatch && searchIdx >= 0; --searchIdx) { + parentMatch = !ruleParts[partIdx].matches(contextHier, searchIdx); + } + if (parentMatch) + return false; + else + --partIdx; + } + } + else { + throw new Error("Context connector " + part.connector + " is not supported"); + } + } + return partIdx === -1; + }; + Engine.prototype.getMatchingRules = function (ctxHier) { + var matches = []; + function addMatches(rules) { + for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) { + var rule = rules_2[_i]; + if (rule.rule.enabled && Engine.match(rule, ctxHier)) { + matches.push(rule); + } + } + } + for (var ns in ctxHier) { + var role = ns + ":" + (ctxHier[ns].length > 0 ? ctxHier[ns][ctxHier[ns].length - 1].role : "none"); + if (role in this.inclRules) { + addMatches(this.inclRules[role]); + } + for (var xRole in this.exclRules) { + if (xRole !== role) { + addMatches(this.exclRules[xRole]); + } + } + if (role !== ns + ":none") { + if (role.startsWith(ns + ":/")) { + if (ns + ":/*" in this.inclRules) { + addMatches(this.inclRules[ns + ":/*"]); + } + } + else { + if (ns + ":*" in this.inclRules) { + addMatches(this.inclRules[ns + ":*"]); + } + } + } + } + return this.sortDeps(matches); + }; + /** + * Sorts the rules in order to execute dependencies in the correct order + * @param inRules List of wrapped rules to sort + * @returns Sorted list of wrapped rules + */ + Engine.prototype.sortDeps = function (inRules) { + var depRules = []; + for (var _i = 0, inRules_1 = inRules; _i < inRules_1.length; _i++) { + var rule = inRules_1[_i]; + depRules.push(rule); + } + var retVal = []; + var idToRule = {}; + // Iterate through the rules. If that rule's dependencies can be met by rules already in the list, add it to the list + // Repeat until no changes are made to the satisfied list + // If a rule cannot be satisfied, it will never execute, so it can be dropped. + var change = false; + do { + change = false; + for (var idx = 0; idx < depRules.length; ++idx) { + var depRule = depRules[idx]; + if (depRule.rule.id in idToRule) + continue; + var allMatch = true; + if (depRule.rule.dependencies && depRule.rule.dependencies.length > 0) { + for (var _a = 0, _b = depRule.rule.dependencies; _a < _b.length; _a++) { + var depId = _b[_a]; + if (!(depId in idToRule)) { + allMatch = false; + } + } + } + // if (depRule.rule.prereqs && depRule.rule.prereqs.length > 0) { + // for (const depId of depRule.rule.prereqs) { + // if (!(depId in idToRule)) { + // allMatch = false; + // } + // } + // } + if (allMatch) { + change = true; + retVal.push(depRule); + idToRule[depRule.rule.id] = true; + depRules.splice(idx--, 1); + } + } + } while (change); + return retVal; + }; + return Engine; +}()); +exports.Engine = Engine; + + +/***/ }, + +/***/ "./src/v2/config/Config.ts" +/*!*********************************!*\ + !*** ./src/v2/config/Config.ts ***! + \*********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Config = void 0; +var Config = /** @class */ (function () { + function Config() { + } + Config.DEBUG = false; + Config.helpRoot = "https://able.ibm.com/rules/archives"; + return Config; +}()); +exports.Config = Config; + + +/***/ }, + +/***/ "./src/v2/dom/DOMMapper.ts" +/*!*********************************!*\ + !*** ./src/v2/dom/DOMMapper.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMMapper = void 0; +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMMapper = /** @class */ (function (_super) { + __extends(DOMMapper, _super); + function DOMMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + DOMMapper.prototype.getRole = function (node) { + return node.nodeName.toLowerCase(); + }; + DOMMapper.prototype.getNamespace = function () { + return "dom"; + }; + DOMMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + retVal[attrInfo.name.toLowerCase()] = attrInfo.nodeValue; + } + } + return retVal; + }; + /** + * get scaled bounds for screenshot etc. adjusted for devicePixelRatio and scroll + * @param node + * @returns + */ + DOMMapper.prototype.getBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_Bounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var adjustment = 1; + if (node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.devicePixelRatio) { + adjustment = node.ownerDocument.defaultView.devicePixelRatio; + } + var bounds = node.getBoundingClientRect(); + // Do a check whether bounds has value as we use different tool (htmlUnit, browser) to call this function + if (bounds) { + var scrollX_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil((bounds.left + scrollX_1) * adjustment), + "top": Math.ceil((bounds.top + scrollY_1) * adjustment), + "height": Math.ceil(bounds.height * adjustment), + "width": Math.ceil(bounds.width * adjustment) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_Bounds", ret); + return ret; + } + return null; + }; + /** + * get real CSS bounds in css pixels, adjusted for scroll only + * @param node + * @returns + */ + DOMMapper.prototype.getUnadjustedBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_UnadjustedBounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var bounds = node.getBoundingClientRect(); + // adjusted for scroll if any + if (bounds) { + var scrollX_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil(bounds.left + scrollX_2), + "top": Math.ceil(bounds.top + scrollY_2), + "height": Math.ceil(bounds.height), + "width": Math.ceil(bounds.width) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_UnadjustedBounds", ret); + return ret; + } + return null; + }; + return DOMMapper; +}(CommonMapper_1.CommonMapper)); +exports.DOMMapper = DOMMapper; + + +/***/ }, + +/***/ "./src/v2/dom/DOMUtil.ts" +/*!*******************************!*\ + !*** ./src/v2/dom/DOMUtil.ts ***! + \*******************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ./DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +/** + * Utility class providing helper methods for DOM manipulation and traversal operations. + * Used throughout the accessibility checker engine to navigate and analyze DOM structures. + */ +var DOMUtil = /** @class */ (function () { + function DOMUtil() { + } + /** + * Checks if a given node has an ancestor element with a node name matching any of the provided names. + * Traverses up the DOM tree from the given node until a match is found or the root is reached. + * + * @param node - The starting DOM node to check + * @param names - Array of node names (tag names) to search for in uppercase (e.g., ['TABLE', 'DIV']) + * @returns true if an ancestor with a matching name is found, false otherwise + */ + DOMUtil.hasParent = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName)) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return !!p; + }; + /** + * Retrieves the first ancestor element that matches any of the provided node names (case-insensitive). + * Similar to hasParent but returns the actual element reference and performs case-insensitive comparison. + * + * @param node - The starting DOM node + * @param names - Array of lowercase node names to search for (e.g., ['table', 'div']) + * @returns The matching ancestor element, or null if none found + */ + DOMUtil.getAncestor = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName.toLowerCase())) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return p; + }; + /** + * Determines if two nodes are the same node, with fallback strategies for different browser environments. + * Uses multiple comparison methods for cross-browser compatibility: + * 1. Strict equality (===) + * 2. isSameNode() method if available + * 3. compareDocumentPosition() (returns 0 if same node) + * 4. Returns true as last resort if no comparison method is available + * + * @param a - First node to compare + * @param b - Second node to compare + * @returns true if nodes are the same, false otherwise + */ + DOMUtil.sameNode = function (a, b) { + if (a === b) { + return true; + } + else if (a.isSameNode) { + return a.isSameNode(b); + } + else if (a.compareDocumentPosition) { + return a.compareDocumentPosition(b) === 0; + } + else { + // Not supported in this environment - try our best + return true; + } + }; + /** + * Normalizes whitespace in a string by replacing all whitespace characters + * (spaces, tabs, carriage returns, newlines) with single spaces and collapsing + * multiple consecutive spaces into one. + * + * @param s - The input string to clean + * @returns The cleaned string with normalized whitespace + * @example "Hello\n\t World" → "Hello World" + */ + DOMUtil.cleanWhitespace = function (s) { + var retVal = s.replace(/[ \t\r\n]/g, " ").replace(/ +/g, " "); + return retVal; + }; + /** + * Collapses multiple consecutive spaces into a single space. + * Unlike cleanWhitespace, only handles spaces, not other whitespace characters like tabs or newlines. + * + * @param s - The input string to clean + * @returns The string with collapsed spaces + */ + DOMUtil.cleanSpace = function (s) { + var retVal = s.replace(/ +/g, " "); + return retVal; + }; + /** + * Determines if two elements (typically table cells) belong to the same table element. + * Finds the table ancestor for each element and compares them using sameNode(). + * + * @param element1 - First element to check + * @param element2 - Second element to check + * @returns true if both elements share the same table ancestor, false otherwise + */ + DOMUtil.isInSameTable = function (element1, element2) { + if (element1 && element2) { + var parentName = ['table']; + var parent1 = DOMUtil.getAncestor(element1, parentName); + var parent2 = DOMUtil.getAncestor(element2, parentName); + if (parent1 !== null && parent2 != null && DOMUtil.sameNode(parent1, parent2)) + return true; + } + return false; + }; + /** + * Traverses up the DOM tree to find the shadow root (document fragment) that contains the given node. + * Important for handling Web Components and Shadow DOM structures in accessibility checking. + * + * @param node - The starting node + * @returns The shadow root node (nodeType 11 = DOCUMENT_FRAGMENT_NODE), or null if none found + */ + DOMUtil.shadowRootNode = function (node) { + var nd = node; + while (nd != null && nd.nodeType !== 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + nd = nd.parentNode; + return nd; + }; + /** + * Creates a deep copy of an object while preserving Node references (doesn't clone Node objects). + * Useful when copying data structures that contain DOM node references, as you typically want + * to preserve those references rather than attempting to clone the nodes themselves. + * + * Behavior: + * - Primitive values: Deep copied via JSON serialization + * - Functions: Returned as-is (reference) + * - Node objects: Returned as-is (reference, not cloned) + * - Arrays/Objects: Recursively copied with the same rules + * + * @param rhs - The object to copy (right-hand side) + * @returns A copy of the object with Node references preserved + */ + DOMUtil.objectCopyWithNodeRefs = function (rhs) { + if (!rhs) + return rhs; + if (typeof rhs !== "object") { + if (typeof rhs === "function") { + return rhs; + } + else { + return JSON.parse(JSON.stringify(rhs)); + } + } + else if (rhs instanceof Node || !!rhs.nodeType) { + return rhs; + } + else { + var retVal = void 0; + if (rhs.constructor.name === "Array") { + retVal = []; + for (var _i = 0, rhs_1 = rhs; _i < rhs_1.length; _i++) { + var item = rhs_1[_i]; + retVal.push(this.objectCopyWithNodeRefs(item)); + } + } + else { + retVal = {}; + for (var key in rhs) { + retVal[key] = this.objectCopyWithNodeRefs(rhs[key]); + } + } + return retVal; + } + }; + /** + * Finds the first ancestor element that has a specific attribute with a specific value. + * Traverses up the DOM tree from the given element until a matching ancestor is found. + * + * @param element - The starting element + * @param attrName - The attribute name to search for + * @param attrValue - The expected attribute value + * @returns The matching ancestor element, or null if none found + * @example Finding an ancestor with aria-hidden="true" or data-testid="container" + */ + DOMUtil.getAncestorWithAttribute = function (element, attrName, attrValue) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (walkNode.nodeType === 1 /* Node.ELEMENT_NODE */ && walkNode.getAttribute(attrName) === attrValue) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + return DOMUtil; +}()); +exports.DOMUtil = DOMUtil; + + +/***/ }, + +/***/ "./src/v2/dom/DOMWalker.ts" +/*!*********************************!*\ + !*** ./src/v2/dom/DOMWalker.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMWalker = void 0; +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * Walks in a DOM order + * + * Assumption that nodes of shadow DOMs call assignSlots on the shadow root before + * doing other processing in that tree. If you walk into a shadow root, the DOMWalker + * will do it automatically. + * + * See also ../aria/ARIAWalker + */ +var DOMWalker = /** @class */ (function () { + function DOMWalker(element, bEnd, root, considerHidden, DEBUG) { + this.DEBUGIDX = 0; + this.indent = 0; + this.DEBUG = !!DEBUG; + this.root = root || ((element && element.ownerDocument) ? element.ownerDocument.documentElement : element); + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + if (this.node.nodeType === 9) { + this.node = this.node.documentElement; + } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + this.considerHidden = considerHidden || false; + } + DOMWalker.prototype.elem = function () { + return this.node.nodeType === 1 && this.node || null; + }; + DOMWalker.parentNode = function (node) { + if (node === null) + return null; + var p = node.parentNode; + if (node.slotOwner) { + p = node.slotOwner; + } + else if (node.ownerElement) { + p = node.ownerElement; + } + else if (p && p.nodeType === 11) { + if (p.host) { + p = p.host; + } + else { + p = null; + } + } + return p; + }; + DOMWalker.parentElement = function (node) { + var elem = node; + do { + elem = DOMWalker.parentNode(elem); + } while (elem && elem.nodeType !== 1); + return elem; + }; + DOMWalker.assignSlots = function (root) { + var slots = root.querySelectorAll("slot"); + for (var iSlot = 0; iSlot < slots.length; ++iSlot) { + var processSlot = slots[iSlot]; + var assignedNodes = processSlot.assignedNodes(); + for (var iAssigned = 0; iAssigned < assignedNodes.length; ++iAssigned) { + assignedNodes[iAssigned].slotOwner = processSlot; + assignedNodes[iAssigned].slotIndex = iAssigned; + } + } + }; + DOMWalker.firstChildNotOwnedBySlot = function (node) { + var retVal = node.firstChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.lastChildNotOwnedBySlot = function (node) { + var retVal = node.lastChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.nextSiblingNotOwnedBySlot = function (node) { + var retVal = node.nextSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.previousSiblingNotOwnedBySlot = function (node) { + var retVal = node.previousSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.prototype.atRoot = function () { + if (this.node.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + DOMWalker.prototype.nextNode = function () { + var _this = this; + var indent = function () { + var s = ""; + for (var idx = 0; idx < _this.indent; ++idx) { + s += " "; + } + return s; + }; + var DBG = false; //this.DEBUGIDX >= 7 && this.DEBUGIDX <= 10; + var startName = this.node.nodeName; + if (!this.node) { + this.bEndTag = false; + return false; + } + do { + //console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + DBG && console.log("!!!Into Frame"); + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + DBG && console.log("!!!Into shadow root"); + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + DBG && console.log("!!!Into slot"); + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker.firstChildNotOwnedBySlot(this.node)) { + DBG && console.log("!!!First child"); + this.node = DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + DBG && console.log("!!!Flip to end tag"); + this.bEndTag = true; + } + } + else { + DBG && console.log("!!!1"); + if (this.atRoot()) { + DBG && console.log("!!!Done at root"); + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + DBG && console.log("!!!Next slot child"); + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + DBG && console.log("!!!Back up to slot owner"); + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + DBG && console.log("!!!Up to frame owner"); + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + DBG && console.log("!!!Next sibling"); + this.node = DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + } + else if (this.node.parentNode) { + DBG && console.log("!!!Parent"); + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + DBG && console.log("!!!Done with walk"); + return false; + } + } + if (DBG && ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"))) { + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++, " SKIPPED")); + } + } while ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + if (this.bEndTag) + this.indent -= 2; + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++)); + this.DEBUG && this.node.slotOwner && console.log(indent() + "slotOwner: ".concat(this.node.slotOwner.nodeName)); + this.DEBUG && this.node.slotIndex && console.log(indent() + "slotIndex: ".concat(this.node.slotIndex)); + this.DEBUG && this.node.ownerElement && console.log(indent() + "ownerElement: ".concat(this.node.ownerElement.nodeName)); + if (!this.bEndTag) + this.indent += 2; + return true; + }; + DOMWalker.prototype.prevNode = function () { + do { + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && elementNode.assignedNodes().length > 0) { + // Enter slot with assigned nodes - go to last assigned node + var slotElement = elementNode; + this.node = slotElement.assignedNodes()[slotElement.assignedNodes().length - 1]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var prevSlotIndex = this.node.slotIndex - 1; + if (prevSlotIndex >= 0) { + this.node = slotOwner.assignedNodes()[prevSlotIndex]; + this.bEndTag = true; + } + else { + this.node = slotOwner; + this.bEndTag = false; + } + } + else if (DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + } + else if (this.node.parentNode) { + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + return true; + }; + return DOMWalker; +}()); +exports.DOMWalker = DOMWalker; + + +/***/ }, + +/***/ "./src/v4/api/IGuideline.ts" +/*!**********************************!*\ + !*** ./src/v4/api/IGuideline.ts ***! + \**********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eGuidelineType = exports.eGuidelineCategory = exports.eToolkitLevel = void 0; +var eToolkitLevel; +(function (eToolkitLevel) { + eToolkitLevel["LEVEL_ONE"] = "1"; + eToolkitLevel["LEVEL_TWO"] = "2"; + eToolkitLevel["LEVEL_THREE"] = "3"; + eToolkitLevel["LEVEL_FOUR"] = "4"; +})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {})); +var eGuidelineCategory; +(function (eGuidelineCategory) { + eGuidelineCategory["ACCESSIBILITY"] = "Accessibility"; + eGuidelineCategory["DESIGN"] = "Design"; + eGuidelineCategory["OTHER"] = "Other"; +})(eGuidelineCategory = exports.eGuidelineCategory || (exports.eGuidelineCategory = {})); +var eGuidelineType; +(function (eGuidelineType) { + eGuidelineType["DEFAULT"] = "default"; + eGuidelineType["EXTENSION"] = "extension"; +})(eGuidelineType = exports.eGuidelineType || (exports.eGuidelineType = {})); + + +/***/ }, + +/***/ "./src/v4/api/IRule.ts" +/*!*****************************!*\ + !*** ./src/v4/api/IRule.ts ***! + \*****************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulePolicy = exports.eRuleConfidence = void 0; +var eRuleConfidence; +(function (eRuleConfidence) { + eRuleConfidence["PASS"] = "PASS"; + eRuleConfidence["FAIL"] = "FAIL"; + eRuleConfidence["POTENTIAL"] = "POTENTIAL"; + eRuleConfidence["MANUAL"] = "MANUAL"; +})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {})); +var eRulePolicy; +(function (eRulePolicy) { + eRulePolicy["VIOLATION"] = "VIOLATION"; + eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION"; + eRulePolicy["INFORMATION"] = "INFORMATION"; +})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {})); +function RulePass(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePass = RulePass; +function RuleRender(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: 0, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleRender = RuleRender; +function RuleFail(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleFail = RuleFail; +function RulePotential(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePotential = RulePotential; +function RuleManual(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleManual = RuleManual; +/** + * @deprecated See ./IGuideline + */ +var IGuideline_1 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eToolkitLevel", ({ enumerable: true, get: function () { return IGuideline_1.eToolkitLevel; } })); +/** + * @deprecated See ./IGuideline:eGuidelineCategory + */ +var IGuideline_2 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRuleCategory", ({ enumerable: true, get: function () { return IGuideline_2.eGuidelineCategory; } })); +/** + * @deprecated See ./IGuideline:eGuidelineType + */ +var IGuideline_3 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRulesetType", ({ enumerable: true, get: function () { return IGuideline_3.eGuidelineType; } })); + + +/***/ }, + +/***/ "./src/v4/checker/Checker.ts" +/*!***********************************!*\ + !*** ./src/v4/checker/Checker.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Checker = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var Engine_1 = __webpack_require__(/*! ../../v2/common/Engine */ "./src/v2/common/Engine.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var rulesets_1 = __webpack_require__(/*! ../rulesets */ "./src/v4/rulesets.ts"); +var checkRulesV4 = __importStar(__webpack_require__(/*! ../rules */ "./src/v4/rules/index.ts")); +var IGuideline_1 = __webpack_require__(/*! ../api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var checkRules = []; +var checkNls = {}; +var checkHelp = {}; +function _initialize() { + var langs = JSON.parse(JSON.stringify(Engine_1.Engine.getLanguages())); + // Default lang to en-US if nothing else specified is found + langs.push("en-US"); + // Process V4 rules into the V2 format + for (var rulename in checkRulesV4) { + // Convert rule + var v4Rule = checkRulesV4[rulename]; + checkRules.push(v4Rule); + // Go backwards because the first lang is the preferred, so + // earlier languages will override later languages + for (var idx = langs.length - 1; idx >= 0; --idx) { + var langId = langs[idx]; + if (langId in v4Rule.messages) { + checkNls[v4Rule.id] = v4Rule.messages[langId]; + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + if (langId in v4Rule.help) { + checkHelp[v4Rule.id] = {}; + for (var reasonId in v4Rule.help[langId]) { + checkHelp[v4Rule.id][reasonId] = "/".concat(langId, "/").concat(v4Rule.help[langId][reasonId]); + } + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + } + // Convert RS + for (var _i = 0, _a = v4Rule.rulesets; _i < _a.length; _i++) { + var rsSection = _a[_i]; + for (var _b = 0, _c = rulesets_1.a11yRulesets; _b < _c.length; _b++) { + var rs = _c[_b]; + var checkRsIds = typeof rsSection.id === "string" ? [rsSection.id] : rsSection.id; + if (checkRsIds.includes(rs.id)) { + for (var _d = 0, _e = rs.checkpoints; _d < _e.length; _d++) { + var cp = _e[_d]; + var checkCPIds = typeof rsSection.num === "string" ? [rsSection.num] : rsSection.num; + if (checkCPIds.includes(cp.num)) { + cp.rules = cp.rules || []; + cp.rules.push({ + id: v4Rule.id, + reasonCodes: rsSection.reasonCodes, + level: rsSection.level, + toolkitLevel: rsSection.toolkitLevel + }); + } + } + } + } + } + } +} +_initialize(); +var Checker = /** @class */ (function () { + function Checker() { + this.guidelines = []; + /** + * @deprecated Use getGuidelines(). + */ + this.rulesets = this.guidelines; + /** + * @deprecated Use getGuidelineIds(). + */ + this.rulesetIds = []; + this.rulesetRules = {}; + this.ruleLevels = {}; + this.ruleReasonLevels = {}; + this.ruleCategory = {}; + var engine = this.engine = new Engine_1.Engine(); + engine.addMapper(new ARIAMapper_1.ARIAMapper()); + engine.addRules(checkRules); + engine.addNlsMap(checkNls); + engine.addHelpMap(checkHelp); + for (var _i = 0, a11yRulesets_1 = rulesets_1.a11yRulesets; _i < a11yRulesets_1.length; _i++) { + var rs = a11yRulesets_1[_i]; + this.addRuleset(rs); + } + } + /** + * Adds a guideline to the engine. If the id already exists, the previous guideline will be replaced. + * @param guideline + */ + Checker.prototype.addGuideline = function (guideline) { + if (guideline.id in this.rulesetRules) { + this.removeGuideline(guideline.id); + } + this.guidelines.push(guideline); + this.rulesetIds.push(guideline.id); + var ruleIds = []; + for (var _i = 0, _a = guideline.checkpoints; _i < _a.length; _i++) { + var cp = _a[_i]; + cp.rules = cp.rules || []; + for (var _b = 0, _c = cp.rules; _b < _c.length; _b++) { + var rule = _c[_b]; + if (rule.enabled !== false) { + ruleIds.push(rule.id); + //this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {}; + //this.ruleLevels[rule.id][guideline.id] = rule.level; + this.ruleReasonLevels[rule.id] = this.ruleReasonLevels[rule.id] || {}; + this.ruleReasonLevels[rule.id][guideline.id] = this.ruleReasonLevels[rule.id][guideline.id] || {}; + var code = rule.reasonCodes ? rule.reasonCodes.join('--') : "None"; + this.ruleReasonLevels[rule.id][guideline.id][code] = rule.level; + this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {}; + this.ruleCategory[rule.id][guideline.id] = guideline.category; + } + } + } + this.rulesetRules[guideline.id] = ruleIds; + }; + /** + * Enable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.enableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled === false) { + updated = true; + delete rule.enabled; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Disable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.disableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled !== false) { + updated = true; + rule.enabled = false; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Remove a guideline from the engine + * + * Generally, there isn't a good reason to do this. Users should just not select the guideline as an option in check + * @param guidelineId + */ + Checker.prototype.removeGuideline = function (guidelineId) { + if (guidelineId in this.rulesetRules) { + delete this.rulesetRules[guidelineId]; + this.rulesets = this.guidelines = this.guidelines.filter(function (guideline) { return guideline.id !== guidelineId; }); + this.rulesetIds = this.getGuidelineIds(); + } + }; + /** + * Get the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelines = function () { + return JSON.parse(JSON.stringify(this.guidelines)); + }; + /** + * Get the ids of the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelineIds = function () { + return this.guidelines.map(function (guideline) { return guideline.id; }); + }; + /** + * + * @deprecated See addGuideline + */ + Checker.prototype.addRuleset = function (rs) { + this.addGuideline(rs); + }; + Checker.prototype.enableSourceMap = function (enable) { + this.engine.enableSourceMap(enable); + }; + Checker.prototype.isSourceMapEnabled = function () { + return this.engine.isSourceMapEnabled(); + }; + /** + * Perform a check of the specified node/document + * @param node DOMNode or Document on which to run the check + * @param guidelineIds Guideline ids to check with to specify which rules to run + * @returns + */ + Checker.prototype.check = function (node, guidelineIds) { + // Determine which rules to run + var ruleIds = []; + // Fix the input + if (!guidelineIds) { + ruleIds = this.engine.getRulesIds(); + } + else { + if (typeof guidelineIds === "string") { + guidelineIds = [guidelineIds]; + } + for (var _i = 0, guidelineIds_1 = guidelineIds; _i < guidelineIds_1.length; _i++) { + var rsId = guidelineIds_1[_i]; + if (rsId in this.rulesetRules) { + ruleIds = ruleIds.concat(this.rulesetRules[rsId]); + } + } + } + this.engine.enableRules(ruleIds); + // Add the report levels + var myThis = this; + return this.engine.run(node) + .then(function (report) { + report.nls = {}; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (result.ruleId in checkNls) { + report.nls[result.ruleId] = report.nls[result.ruleId] || { + 0: checkNls[result.ruleId][0] + }; + if (result.reasonId in checkNls[result.ruleId]) { + report.nls[result.ruleId][result.reasonId] = checkNls[result.ruleId][result.reasonId]; + } + } + //result.value[0] = myThis.getLevel(guidelineIds as string[], result.ruleId); + var code = result.reasonId ? result.reasonId : "None"; + result.value[0] = myThis.getReasonLevel(guidelineIds, result.ruleId, code); + result.category = myThis.getCategory(guidelineIds, result.ruleId); + delete result.path.css; + } + return report; + }); + }; + Checker.prototype.getLevel = function (rsIds, ruleId) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleLevels)) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) { + var rsId = rsIds_1[_i]; + if (rsId in rsInfo) { + if (rsInfo[rsId] === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (rsInfo[rsId] === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getReasonLevel = function (rsIds, ruleId, reasonCode) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleReasonLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleReasonLevels)) { + throw new Error("Rule triggered for which we have no rule level information " + ruleId); + } + var _loop_1 = function (rsId) { + if (rsId in rsInfo) { + var reCode_1 = new RegExp("(^|--)".concat(reasonCode, "($|--)")); + Object.keys(rsInfo[rsId]).forEach(function (code) { + var level = null; + if (code === 'None') + level = rsInfo[rsId]["None"]; + else if (reCode_1.test(code)) + level = rsInfo[rsId][code]; + if (level !== null) { + if (level === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (level === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }); + if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }; + for (var _i = 0, rsIds_2 = rsIds; _i < rsIds_2.length; _i++) { + var rsId = rsIds_2[_i]; + _loop_1(rsId); + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getCategory = function (rsIds, ruleId) { + var rsInfo = this.ruleCategory[ruleId]; + var retVal = ""; + if (!(ruleId in this.ruleCategory)) { + return IGuideline_1.eGuidelineCategory.OTHER; + } + if (!rsIds) { + rsIds = this.getGuidelineIds(); + } + for (var _i = 0, rsIds_3 = rsIds; _i < rsIds_3.length; _i++) { + var rsId = rsIds_3[_i]; + if (rsId in rsInfo) { + return rsInfo[rsId]; + } + } + return IGuideline_1.eGuidelineCategory.OTHER; + }; + return Checker; +}()); +exports.Checker = Checker; + + +/***/ }, + +/***/ "./src/v4/rules/a_target_warning.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/a_target_warning.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_target_warning = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.a_target_warning = { + id: "a_target_warning", + context: "dom:a[target],dom:area[target],dom:base[target]", + refactor: { + "WCAG20_A_TargetAndText": { + "Pass_0": "pass", + "Potential_1": "potential_warn" + } + }, + help: { + "en-US": { + "group": "a_target_warning.html", + "pass": "a_target_warning.html", + "potential_warn": "a_target_warning.html" + } + }, + messages: { + "en-US": { + "group": "Users should be warned in advance if their input action will open a new window", + "pass": "The user is warned in advance that the input action opens a new window", + "potential_warn": "Inform the user when their input action will open a new window" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.2.2", + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // skip the rule if it's AT hidden and not tabbable + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var params = { + paramWinText: { + value: ["new window", "new tab"], + type: "array" + } + }; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr == "_parent" || tStr == "_self" || tStr == "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + // Check aria-describedby for warning text + if (ruleContext.hasAttribute("aria-describedby")) { + var describedbyIds = ruleContext.getAttribute("aria-describedby").trim().split(/\s+/); + for (var _i = 0, describedbyIds_1 = describedbyIds; _i < describedbyIds_1.length; _i++) { + var id = describedbyIds_1[_i]; + var referencedElem = fragment_1.FragmentUtil.getById(ruleContext, id); + if (referencedElem) { + var describedText = CommonUtil_1.CommonUtil.getInnerText(referencedElem); + if (describedText && describedText.trim().length > 0) { + textStr += " " + describedText; + } + } + } + } + for (var i = 0; !passed && i < params.paramWinText.value.length; ++i) + if (textStr.indexOf(params.paramWinText.value[i]) != -1) + passed = true; + } + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_warn"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/a_text_purpose.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/a_text_purpose.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_text_purpose = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.a_text_purpose = { + id: "a_text_purpose", + // doc-biblioref is a link + context: "aria:link,aria:doc-biblioref", + refactor: { + "WCAG20_A_HasText": { + "Pass_0": "pass", + "Fail_1": "fail_acc_name" + } + }, + help: { + "en-US": { + "group": "a_text_purpose.html", + "pass": "a_text_purpose.html", + "fail_acc_name": "a_text_purpose.html" + } + }, + messages: { + "en-US": { + "group": "Hyperlinks must have an accessible name for their purpose", + "pass": "Hyperlink has a description of its purpose", + "fail_acc_name": "Hyperlink has no link text, label or image with a text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["2.4.4", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: "c487ae", + run: function (context, options) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Rule only passes if an element has inner content, + // in the case that there is only hidden content under the the element it is a violation + var accName_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = (accName_pair && accName_pair.name && accName_pair.name.trim().length > 0) + /**ARIAMapper.computeName(ruleContext).trim().length > 0*/ + || CommonUtil_1.CommonUtil.nonTabableChildCheck(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_acc_name"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/applet_alt_exists.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/applet_alt_exists.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.applet_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.applet_alt_exists = { + id: "applet_alt_exists", + context: "dom:applet", + refactor: { + "WCAG20_Applet_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "applet_alt_exists.html", + "Pass_0": "applet_alt_exists.html", + "Fail_1": "applet_alt_exists.html", + "Fail_2": "applet_alt_exists.html", + "Fail_3": "applet_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<applet> elements must provide an 'alt' attribute and an alternative description", + "Pass_0": "Rule Passed", + "Fail_1": "An <applet> element does not have an 'alt' attribute that provides a short text alternative", + "Fail_2": "The 'alt' attribute value for an <applet> element duplicates the 'code' attribute", + "Fail_3": "An <applet> element provides alternative text, but does not provide inner content" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + var alt = ruleContext.getAttribute("alt").trim(); + if (ruleContext.hasAttribute("code") && alt == ruleContext.getAttribute("code").trim()) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/application_content_accessible.ts" +/*!********************************************************!*\ + !*** ./src/v4/rules/application_content_accessible.ts ***! + \********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.application_content_accessible = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.application_content_accessible = { + id: "application_content_accessible", + context: "aria:application", + refactor: { + "HAAC_Application_Role_Text": { + 0: "HAAC_Application_Role_Text.html", + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + 0: "application_content_accessible.html", + "Pass_0": "application_content_accessible.html", + "Potential_1": "application_content_accessible.html" + } + }, + messages: { + "en-US": { + "group": "Non-decorative static text and image content within an element with \"application\" role must be accessible", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the non-decorative static text and image content within an element with \"application\" role are accessible" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.1.1", "2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var children = ruleContext.childNodes; + for (var i = 0; passed && i < children.length; i++) { + if (children[i].nodeType === 1) { + if (VisUtil_1.VisUtil.isNodeVisible(children[i])) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "document") || AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "article"); + } + } + else if (children[i].nodeType === 3) { + passed = children[i].nodeValue.trim().length === 0; + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/area_alt_exists.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/area_alt_exists.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.area_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.area_alt_exists = { + id: "area_alt_exists", + context: "dom:area", + refactor: { + "WCAG20_Area_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "area_alt_exists.html", + "Pass_0": "area_alt_exists.html", + "Fail_1": "area_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<area> elements in an image map must have a text alternative", + "Pass_0": "Rule Passed", + "Fail_1": "<area> element in an image map has no text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_accessiblename_exists.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_accessiblename_exists.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_accessiblename_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +exports.aria_accessiblename_exists = { + id: "aria_accessiblename_exists", + context: "aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example", + help: { + "en-US": { + "pass": "aria_accessiblename_exists.html", + "fail_no_accessible_name": "aria_accessiblename_exists.html", + "fail_no_accessible_name_image": "aria_accessiblename_exists.html", + "group": "aria_accessiblename_exists.html" + } + }, + messages: { + "en-US": { + "pass": "An accessible name is provided for the element", + "fail_no_accessible_name": "Element <{0}> with \"{1}\" role has no accessible name", + "fail_no_accessible_name_image": "Element <{0}> with \"{1}\" role has no accessible name", + "group": "Elements with certain roles should have accessible names" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name_image"] + }], + act: [{ "23a2a8": { "fail_no_accessible_name_image": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg element is handled in svg_graphics_labbelled rule and image rules + if (nodeName === 'svg' || nodeName === 'img') + return; + // when table element with a caption as first child + if (nodeName === 'table' + && ruleContext.firstElementChild && ruleContext.firstElementChild.nodeName.toLowerCase() === 'caption' + && ruleContext.firstElementChild.textContent && ruleContext.firstElementChild.textContent.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (invalidRoles && invalidRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role || !ARIADefinitions_1.ARIADefinitions.designPatterns[role] || !ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameRequired) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!name_pair || !name_pair.name || name_pair.name.trim().length === 0) { + if (role === 'img' || role === 'image') + return (0, IRule_1.RuleFail)("fail_no_accessible_name_image", [ruleContext.nodeName.toLowerCase(), role]); + return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), role]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts" +/*!**************************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_tabindex_valid.ts ***! + \**************************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_tabindex_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_activedescendant_tabindex_valid = { + id: "aria_activedescendant_tabindex_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "Rpt_Aria_InvalidTabindexForActivedescendant": { + "pass": "pass", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "pass": "aria_activedescendant_tabindex_valid.html", + "Fail_1": "aria_activedescendant_tabindex_valid.html", + "group": "aria_activedescendant_tabindex_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "Fail_1": "The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable", + "group": "Element using 'aria-activedescendant' property should be tabbable" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Rule not supported on mobile + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + // Handle the case where the element is hidden by a disabled HTML5 attribute or aria-disabled: + // 1. In the case that this element has a disabled attribute and the element supports it, we mark this rule as passed. + // 2. In the case that this element has an aria-disabled attribute then, we mark this rule as passed. + // For both of the cases above we do not need to perform any further checks, as the element is disabled in some form or another. + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + //ignore if the attribute 'aria-activedescendant' is blank + if (ruleContext.getAttribute("aria-activedescendant").trim().length === 0) + return; + // If the tabindex attribute is provided then verify that it is 0 or -1 + passed = CommonUtil_1.CommonUtil.isTabbable(ruleContext); + // pass if one of the children is tabbable. in this case, the tab will stop on the first tabbable element + if (!passed) + passed = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext) > 0; + // Build array for node token + var retToken1 = new Array(); + retToken1.push(nodeName); + // Build array for id referenced by aria-activedescendant + var retToken2 = new Array(); + retToken2.push(ruleContext.getAttribute("aria-activedescendant").split(" ").join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_activedescendant_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_activedescendant_valid = { + id: "aria_activedescendant_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "HAAC_ActiveDescendantCheck": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + // "Fail_4": "Fail_4" + } + }, + help: { + "en-US": { + "Pass_0": "aria_activedescendant_valid.html", + "Fail_1": "aria_activedescendant_valid.html", + "Fail_2": "aria_activedescendant_valid.html", + "Fail_3": "aria_activedescendant_valid.html", + // "Fail_4": "aria_activedescendant_valid.html", + "group": "aria_activedescendant_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'aria-activedescendant' property is empty", + "Fail_2": "The 'aria-activedescendant' property references a hidden node", + "Fail_3": "Element is not a combobox, and the referenced active-descendant element is not a valid descendant", + // "Fail_4": "Element is a combobox, and the referenced active-descendant element is not controlled by this component", + "group": "The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // combobox active descendants handled by 'combobox_active_descendant' + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")) { + return null; + } + var descendant_id = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-activedescendant"); + // POF1: The attribute is empty + if (!descendant_id || descendant_id.trim() === "") { + return (0, IRule_1.RuleFail)("Fail_1"); + } + var descendant = fragment_1.FragmentUtil.getById(ruleContext, descendant_id.trim()); + if (!descendant || DOMUtil_1.DOMUtil.sameNode(descendant_id, ruleContext)) { + // The referenced element doesn't exist. We let 1077 to trigger the error + return null; + } + if (!VisUtil_1.VisUtil.isNodeVisible(descendant)) { + // POF2: aria-activedescendant references a hidden node + return (0, IRule_1.RuleFail)("Fail_2"); + } + // 1. The value of aria-activedescendant refers to an element that is either a descendant of + // the element with DOM focus + if (ruleContext.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var pofId = 2; + // or is a logical descendant as indicated by the aria-owns attribute. + if (ruleContext.hasAttribute("aria-owns")) { + var owned_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-owns").trim()).split(" "); + for (var i = 0; i < owned_ids.length; i++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owned_ids[i]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + // 2. The element with DOM focus is a textbox with aria-controls referring to an element that + // supports aria-activedescendant, and the value of aria-activedescendant specified for the + // textbox refers to either a descendant of the element controlled by the textbox or is a logical + // descendant of that controlled element as indicated by the aria-owns attribute. + // + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") && ruleContext.hasAttribute("aria-controls")) { + pofId = 3; + var controlled_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-controls").trim()).split(" "); + for (var i = 0; i < controlled_ids.length; i++) { + var controlled_ele = fragment_1.FragmentUtil.getById(ruleContext, controlled_ids[i]); + if (controlled_ele && !DOMUtil_1.DOMUtil.sameNode(controlled_ele, ruleContext) && controlled_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + if (controlled_ele.hasAttribute("aria-owns")) { + var owns_ids = CommonUtil_1.CommonUtil.normalizeSpacing(controlled_ele.getAttribute("aria-owns").trim()).split(" "); + for (var j = 0; j < owns_ids.length; j++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owns_ids[j]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + } + } + // POF3: I'm not a combobox, and the referenced active-descendant is not a descendant and not owned by the element + // that referenced it. + if (pofId == 3) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_application_label_unique.ts" +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_application_label_unique.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_application_label_unique = { + id: "aria_application_label_unique", + context: "aria:application", + refactor: { + "Rpt_Aria_MultipleApplicationLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_application_label_unique.html", + "fail_label_not_unique": "aria_application_label_unique.html", + "group": "aria_application_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"application\" role do not have unique labels", + "group": "Each element with \"application\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "application"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_application_labelled.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_application_labelled.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_application_labelled = { + id: "aria_application_labelled", + context: "aria:application", + refactor: { + "Rpt_Aria_ApplicationLandmarkLabel": { + "Pass_0": "pass", + "Fail_1": "fail_no_label" + } + }, + help: { + "en-US": { + "pass": "aria_application_labelled.html", + "fail_no_label": "aria_application_labelled.html", + "group": "aria_application_labelled.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a label that describes its purpose", + "fail_no_label": "Element with \"application\" role does not have a label", + "group": "Each element with \"application\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!pair) { + return (0, IRule_1.RuleFail)("fail_no_label"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_article_label_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_article_label_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_article_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_article_label_unique = { + id: "aria_article_label_unique", + context: "aria:article", + refactor: { + "Rpt_Aria_MultipleArticleRoles_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_article_label_unique.html", + "fail_label_not_unique": "aria_article_label_unique.html", + "group": "aria_article_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"article\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"article\" role do not have unique labels", + "group": "Each element with \"article\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "article"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_allowed.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_attribute_allowed.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_allowed = { + id: "aria_attribute_allowed", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidProperty": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_allowed.html", + "Pass_0": "aria_attribute_allowed.html", + "Fail_1": "aria_attribute_allowed.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes must be valid for the element's role", + "Pass_0": "Rule Passed", + "Fail_1": "The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "5f99a7", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var contextAttributes = ruleContext.attributes; + // This gets all elements with attributes so we still have some + // Out of Scope since not all attributes are aria + if (contextAttributes) { + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var failedProperties = ""; + var testedProperties = 0; + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + testedProperties++; + // Now we just have aria attributes which can + // pass or fail based on whether there property is valid + var dataTypes = propertyDataTypes[attrName]; + if (!dataTypes) { // if property is not in valid property list + // create failedProperties comma sep list + if (failedProperties.length == 0) { + failedProperties = attrName; + } + else { + failedProperties = failedProperties + ", " + attrName; + } + } + } + } + if (testedProperties == 0) { + return null; + } + else if (failedProperties.length != 0) { + return (0, IRule_1.RuleFail)("Fail_1", [failedProperties, ruleContext.nodeName.toLowerCase()]); + } + else { + //return RulePass(1); + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + // JCH - passing is based on all attributes not just aria attributes + // leading to OVER COUNTING so moved pass up + //return RulePass(1); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_conflict.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_conflict.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_attribute_conflict = { + id: "aria_attribute_conflict", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + // "pass": "aria_attribute_conflict.html", + "fail_conflict": "aria_attribute_conflict.html", + "group": "aria_attribute_conflict.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA attribute is not conflict with the corresponding HTML attribute", + "fail_conflict": "The ARIA attribute \"{0}\" is in conflict with the corresponding HTML attribute \"{1}\"", + "group": "An ARIA attribute must not conflict with the corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + var ret = []; + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (!ariaAttributes || ariaAttributes.length === 0) + return null; + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + for (var i = 0; i < conflictAttributes.length; i++) { + ret.push((0, IRule_1.RuleFail)("fail_conflict", [conflictAttributes[i]['ariaAttr'], conflictAttributes[i]['htmlAttr']])); + if (ariaAttributes.includes(conflictAttributes[i]['ariaAttr'])) + CommonUtil_1.CommonUtil.reduceArrayItemList([conflictAttributes[i]['ariaAttr']], ariaAttributes); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_deprecated.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_attribute_deprecated.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_deprecated = { + id: "aria_attribute_deprecated", + context: "dom:*", + help: { + "en-US": { + // "pass": "aria_attribute_deprecated.html", + "fail_aria_role": "aria_attribute_deprecated.html", + "fail_aria_attr": "aria_attribute_deprecated.html", + "fail_role_attr": "aria_attribute_deprecated.html", + "group": "aria_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA roles and attribute are used per specification", + "fail_aria_role": "The ARIA role \"{0}\" is deprecated in the ARIA specification", + "fail_aria_attr": "The ARIA attributes \"{0}\" are deprecated in the ARIA specification", + "fail_role_attr": "The ARIA attributes \"{0}\" are deprecated for the role \"{1}\" in the ARIA specification", + "group": "No deprecated ARIA role or attribute should be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var ret = []; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) { + for (var i = 0; i < deprecatedRoles.length; i++) + ret.push((0, IRule_1.RuleFail)('fail_aria_role', [deprecatedRoles[i]])); + } + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) { + for (var i = 0; i < deprecatedAttributes.length; i++) { + // "role":"any", "attribute":ariaAttrs[i]} + if (deprecatedAttributes[i].role === 'any') + ret.push((0, IRule_1.RuleFail)('fail_aria_attr', [deprecatedAttributes[i].attribute])); + else + ret.push((0, IRule_1.RuleFail)('fail_role_attr', [deprecatedAttributes[i].attribute, deprecatedAttributes[i].role])); + } + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_exists.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_attribute_exists.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_attribute_exists = { + id: "aria_attribute_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_EmptyPropertyValue": { + "pass": "pass", + "fail_empty_attribute": "fail_empty_attribute" + } + }, + help: { + "en-US": { + "pass": "aria_attribute_exists.html", + "fail_empty_attribute": "aria_attribute_exists.html", + "group": "aria_attribute_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_empty_attribute": "The element attribute(s): '{0}' value is empty", + "group": "When specifying a required ARIA attribute, the value must not be empty" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return; + var attrNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedProperties = 0; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + if (designPatterns[role] && AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext) != null) { + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + for (var i = 0, length_1 = requiredRoleProps.length; i < length_1; i++) { + var attribute = requiredRoleProps[i]; + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(requiredRoleProps[i])); + if (nodeValue.length == 0) + attrNameArr.push(requiredRoleProps[i]); + } + else if (requiredRoleProps[i] == "aria-labelledby") { + if ((role == "radiogroup") && (hasAttribute(ruleContext, "aria-label"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-label")); + if (nodeValue.length == 0) + attrNameArr.push("aria-label"); + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((role == "progressbar") && (hasAttribute(ruleContext, "aria-valuetext"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-valuetext")); + if (nodeValue.length == 0) + attrNameArr.push("aria-valuetext"); + } + } + } + } + if (designPatterns[role]) { + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var permittedRoles = []; + permittedRoles.push(role); + var allowedAttributes = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, permittedRoles, tagProperty); + for (var i = 0, length_2 = allowedAttributes.length; i < length_2; i++) { + var attribute = allowedAttributes[i]; + if (attribute == "aria-checked" || attribute == "aria-selected" || + attribute == "aria-expanded" || attribute == "aria-orientation" || + attribute == "aria-level") { + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(attribute)); + if (nodeValue.length == 0 && !attrNameArr.includes(attribute)) { + attrNameArr.push(attribute); + } + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(attrNameArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedProperties == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_empty_attribute", retMsg); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_redundant.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_attribute_redundant.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_redundant = { + id: "aria_attribute_redundant", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + "pass": "aria_attribute_redundant.html", + "fail_redundant": "aria_attribute_redundant.html", + "group": "aria_attribute_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "The ARIA attribute is not redundant with a corresponding HTML attribute", + "fail_redundant": "The ARIA attribute \"{0}\" is redundant with the HTML attribute \"{1}\"", + "group": "An ARIA attribute should not be redundant with a corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + // if conflict already reported, ignore reporting overlap + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + if (conflictAttributes && conflictAttributes.length > 0) + return null; + var domAttributes = ruleContext.attributes; + var ariaAttrs = []; + var htmlAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = ruleContext.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push({ name: attrName, value: attrValue }); + else + htmlAttrs.push({ name: attrName, value: attrValue }); + } + } + var ret = []; + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil_1.AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'overlapping'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Pass') { //pass + ret.push((0, IRule_1.RulePass)("pass")); + } + else if (item['result'] === 'Failed') { //failed + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaAttrs[i]['name'], item['attr']])); + } + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_required.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_required.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_required = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_attribute_required = { + id: "aria_attribute_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredProperties": { + "Pass_0": "pass", + "Fail_1": "fail_missing" + } + }, + help: { + "en-US": { + "group": "aria_attribute_required.html", + "pass": "aria_attribute_required.html", + "fail_missing": "aria_attribute_required.html" + } + }, + messages: { + "en-US": { + "group": "The required attributes for the element with a role must be defined", + "pass": "The required attributes for the element with the role are defined", + "fail_missing": "Element with '{0}' role does not have the required ARIA attribute(s): '{1}'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "4e8ab6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var attrNameArr = new Array(); + var roleNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let implicitRole = ARIAMapper.elemToImplicitRole(ruleContext); + //let implicitRole = AriaUtil.getImplicitRole(ruleContext); + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedRoles = 0; + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + if (designPatterns[role] && requiredRoleProps !== null) { + var allowedRoleProps = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, role, tagProperty); + var roleMissingReqProp = false; + for (var i = 0, propertiesLength = requiredRoleProps.length; i < propertiesLength; i++) { + if (!allowedRoleProps.includes(requiredRoleProps[i])) + continue; + if (!hasAttribute(ruleContext, requiredRoleProps[i])) { + // If an aria-labelledby isn't present, an aria-label will meet the requirement. + if (requiredRoleProps[i] == "aria-labelledby") { + if ((!hasAttribute(ruleContext, "aria-label")) || (role != "radiogroup")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((!hasAttribute(ruleContext, "aria-valuetext")) || (role != "progressbar")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-controls" && role == "combobox") { + // Skip this check since aria-controls in the textbox of a combobox is already handled in rule HAAC_Combobox_Must_have_Text_Input + } + else { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + } + if (roleMissingReqProp == true) { + roleNameArr.push(role); + } + } + var passed = roleNameArr.length == 0 || attrNameArr.length == 0; // only aria attributes so NO OUT OF SCOPE + if (!passed) { + var retToken = new Array(); + retToken.push(roleNameArr.join(", ")); + retToken.push(attrNameArr.join(", ")); + return (0, IRule_1.RuleFail)("fail_missing", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_value_valid.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_attribute_value_valid.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_value_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +exports.aria_attribute_value_valid = { + id: "aria_attribute_value_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "Rpt_Aria_ValidPropertyValue": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_value_valid.html", + "Pass_0": "aria_attribute_value_valid.html", + "Fail_1": "aria_attribute_value_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA property values must be valid", + "Pass_0": "Rule Passed", + "Fail_1": "The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "6a7281", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var valueArr = new Array(); + var attrNameArr = new Array(); + var dataTypeArr = new Array(); + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var contextAttributes = ruleContext.attributes; + var testedPropertyValues = 0; + if (contextAttributes) { + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = propertyDataTypes[attrName]; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue); + testedPropertyValues++; + if (dataTypes && dataTypes.values) { + if (dataTypes.values.indexOf(nodeValue) == -1) { + if (dataTypes.values.indexOf('undefined') != -1 && nodeValue.length == 0) { + //translate 'undefined' to mean '' + } + else { + // aria-relevant is represented as a space delimited list of the following values: + // additions, removals, text; or a single catch-all value all. + if (dataTypes.type === "http://www.w3.org/2001/XMLSchema#nmtokens") { + var attrValues = contextAttributes[i].nodeValue.trim().split(" "); + // if the value all is specified, it cannot have any other value + if (attrValues.length > 1 && attrValues.includes("all")) { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + else { + var hash = {}; + for (var j = 0; j < attrValues.length; j++) { + // if the individual value is not in the list of allowed values + if (attrValues[j] != "" && !dataTypes.values.includes(attrValues[j])) { + if (!hash.hasOwnProperty(attrName)) { + hash[attrName] = true; + attrNameArr.push(attrName); + } + valueArr.push(attrValues[j]); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else if (dataTypes && dataTypes.type && dataTypes.type === "http://www.w3.org/2001/XMLSchema#int") { + var iVal = parseInt(nodeValue); + if (isNaN(iVal) || ("" + iVal !== nodeValue)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && dataTypes.type == "http://www.w3.org/2001/XMLSchema#decimal") { + var fVal = parseFloat(nodeValue); + if (isNaN(fVal)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#boolean")) { + var tmpV = nodeValue.trim().toLowerCase(); + if (tmpV !== "true" && tmpV !== "false") { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#string")) { + } + else { + testedPropertyValues--; + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(valueArr.join(", ")); + retMsg.push(attrNameArr.join(", ")); + retMsg.push(ruleContext.nodeName.toLowerCase()); + // retMsg.push (dataTypeArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedPropertyValues == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", retMsg); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_banner_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_banner_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_banner_label_unique = { + id: "aria_banner_label_unique", + context: "aria:banner", + refactor: { + "Rpt_Aria_MultipleBannerLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_banner_label_unique.html", + "fail_label_not_unique": "aria_banner_label_unique.html", + "group": "aria_banner_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"banner\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"banner\" role do not have unique labels", + "group": "Each element with \"banner\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "banner", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_banner_single.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/aria_banner_single.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_banner_single = { + id: "aria_banner_single", + context: "dom:*[role], dom:header", + refactor: { + "Rpt_Aria_OneBannerInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_banner_single.html", + "Fail_1": "aria_banner_single.html", + "group": "aria_banner_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"banner\" role found on the page", + "group": "A page, document, or application should only have one element with \"banner\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "banner")) { + return null; + } + var passed = AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "banner", true, true) === null; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_child_tabbable.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_child_tabbable.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_tabbable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_tabbable = { + id: "aria_child_tabbable", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingFocusableChild": { + "pass": "pass", + "fail_missing_child": "fail_missing_child" + } + }, + help: { + "en-US": { + "pass": "aria_child_tabbable.html", + "fail_missing_child": "aria_child_tabbable.html", + "group": "aria_child_tabbable.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_missing_child": "None of the descendent elements with \"{1}\" role is tabbable", + "group": "UI component must have at least one tabbable descendant for keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) || AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + // An ARIA list is not interactive + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, { "list": true, "row": true, "rowgroup": true, "table": true, "grid": true })) { + return null; + } + // Not a valid message for mobile because all elements are focusable in iOS when VoiceOver is enabled. + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + //ignore datalist element check since it will be part of a input element or hidden by default + if (ruleContext.nodeName.toLowerCase() === 'datalist') + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + var passed = true; + var doc = ruleContext.ownerDocument; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + var nodeName = ""; + var inScope = false; + if (ARIADefinitions_1.ARIADefinitions.containers.includes(role)) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (disabled != 'true' && !hasAttribute(ruleContext, 'aria-activedescendant') && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqChildren; + if (reqChildren) { + inScope = true; + passed = false; + var xp = "descendant::*["; + for (var i = 0; i < reqChildren.length; i++) { + xp += "@role='" + reqChildren[i] + "' or "; + } + xp = xp.substring(0, xp.length - 4) + ']'; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + r = xpathResult.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + // Required child is not focusable via tabindex. See if there is a grandchild that is focusable by default or by tabindex. + if (!passed) { + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + roleNameArr = r.getAttribute("role").trim().split(" "); + nodeName = r.nodeName.toLowerCase(); + } + r = xpathResult.iterateNext(); + } + } + } + } + // Variable Decleration + var retToken1 = new Array(); + var retToken2 = new Array(); + // In the case the arrays/strings are empty, that means that there is no violation so we can reset it back to passed, the reason for this + // is that we are setting passed=false while we perform a loop which causes violation to trigger even if there is no issues. Instead of + // updating the whole rule to switch from using passed in that way simply do the check at this point. + if (nodeName.length > 0 && roleNameArr.length > 0) { + retToken1.push(nodeName); + retToken2.push(roleNameArr.join(", ")); + } + else { + passed = true; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', passed == true ? [] : [retToken1, retToken2]); + if (!inScope) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_missing_child", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_child_valid.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/aria_child_valid.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_valid = { + id: "aria_child_valid", + //context: "dom:*[role]", + //dependencies: ["Rpt_Aria_ValidRole"], + context: "dom:*", + dependencies: ["aria_role_valid", "aria_descendant_valid"], + help: { + "en-US": { + "group": "aria_child_valid.html", + "Pass": "aria_child_valid.html", + "Fail_no_child": "aria_child_valid.html", + "Fail_invalid_child": "aria_child_valid.html" + } + }, + messages: { + "en-US": { + "group": "An element with an ARIA role must own a required child", + "Pass": "An element with an ARIA role owns a required child", + "Fail_no_child": "The element with role \"{0}\" does not own any child element with any of the following role(s): \"{1}\"", + "Fail_invalid_child": "The element with role \"{0}\" owns the child element with the role \"{1}\" that is not one of the allowed role(s): \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Verify mapping + act: ["bc4a75"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // ignore if the element contains none or presentation role + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + // For combobox, we have g1193 ... g1199 to check the values etc. + // We don't want to trigger 1152 again. So, we bypass it here. + if (roles.includes("combobox")) + return null; + var requiredChildRoles = AriaUtil_1.AriaUtil.getRequiredChildRoles(ruleContext, true); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (requiredChildRoles.includes('group')) { + var index = requiredChildRoles.indexOf('group'); + if (index > -1) + requiredChildRoles.splice(index, 1); + } + /** + * ignore if a role doesn't require a child with any specific role + * the reverse might be not true - parent will be checked in Rpt_Aria_RequiredParent_Native_Host_Sematics rule + */ + if (requiredChildRoles.length == 0) + return null; + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (!directATChildren || directATChildren.length == 0) { + // the element with at least one required role dosen't contain any accessible child + /** + * When a widget is missing required owned elements due to script execution or loading, + * authors MUST mark a containing element with 'aria-busy' equal to true. + */ + var busy = ruleContext.getAttribute("aria-busy"); + if (!busy || busy !== 'true') { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(requiredChildRoles.join(", ")); + return (0, IRule_1.RuleFail)("Fail_no_child", retToken); + } + // it's 'busy' loading, ignore it + return null; + } + var violateElemRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + // if explicit role doesn't exist, get the implicit one + if (!childRoles || childRoles.length == 0) + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + if (childRoles && childRoles.length > 0) { + /** + * when multiple roles are specified as required owned elements for a role, at least one instance of one required owned element is expected. + * the specification does not require an instance of each of the listed owned roles. + * therefore, the requirement is met if it has any one of the required roles. + */ + var found_1 = childRoles.some(function (r) { return requiredChildRoles.includes(r); }); + if (!found_1) + violateElemRoles.push(childRoles.join(", ")); + } + else { + // ignore the element since it's not semantic, shouldn't happen + } + } + if (violateElemRoles.length > 0) { + var retValues = []; + for (var i = 0; i < violateElemRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(violateElemRoles[i]); + retToken.push(requiredChildRoles.join(", ")); + retValues.push((0, IRule_1.RuleFail)("Fail_invalid_child", retToken)); + } + return retValues; + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_label_unique.ts" +/*!*********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_unique.ts ***! + \*********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_label_unique = { + id: "aria_complementary_label_unique", + context: "aria:complementary", + refactor: { + "Rpt_Aria_MultipleComplementaryLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_complementary_label_unique.html", + "fail_label_not_unique": "aria_complementary_label_unique.html", + "group": "aria_complementary_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"complementary\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"complementary\" role do not have unique labels", + "group": "Each element with \"complementary\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "complementary"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_label_visible.ts" +/*!**********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_visible.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_label_visible = { + id: "aria_complementary_label_visible", + context: "dom:*[role], dom:aside", + dependencies: ["aria_complementary_labelled"], + refactor: { + "Rpt_Aria_ComplementaryLandmarkLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_label_visible.html", + "Fail_1": "aria_complementary_label_visible.html", + "group": "aria_complementary_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a visible label", + "group": "Each element with \"complementary\" role should have a visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "complementary")) { + return null; + } + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby"); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_labelled.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_complementary_labelled.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_labelled = { + id: "aria_complementary_labelled", + context: "aria:complementary", + refactor: { + "Rpt_Aria_ComplementaryRequiredLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_labelled.html", + "Fail_1": "aria_complementary_labelled.html", + "group": "aria_complementary_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a label", + "group": "Each element with \"complementary\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_content_in_landmark.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_content_in_landmark.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_content_in_landmark = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.aria_content_in_landmark = { + id: "aria_content_in_landmark", + context: "dom:*", + refactor: { + "Rpt_Aria_OrphanedContent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_content_in_landmark.html", + "Fail_1": "aria_content_in_landmark.html", + "group": "aria_content_in_landmark.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Content is not within a landmark element", + "group": "All content must reside within an element with a landmark role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var params = CacheUtil_1.CacheUtil.getCache(context.dom.node.ownerDocument, "aria_content_in_landmark", null); + if (!params) { + params = { + landmarks: { + value: ["banner", "complementary", "contentinfo", "form", "main", "navigation", "region", "search"], + type: "array" + }, + possibleOrphanedWidgets: { + value: ["button", "combobox", "checkbox", "grid", "heading", "link", "list", + "listbox", "menu", "menubar", "progressbar", "radio", "tablist", "textbox", "toolbar", "tree", + "treegrid" + ], + type: "array" + }, + possibleOrphanedElements: { + value: ["p", "table", "input", "textarea", "select", "button", "a", "ol", "ul", "dl", "h1", "h2", "h3", "h4", "h5", + "h6", "embed", "object", "area" + ], + type: "array" + }, + noLandmarkedRoles: { + // These roles don't require landmarks + value: ["alert", "alertdialog", "dialog", "tooltip"], + type: "array" + }, + mapLandmarks: {}, + mapPossibleOrphanedWidgets: {}, + mapPossibleOrphanedElements: {}, + mapNoLandmarkedRoles: {} + }; + // Convert arrays to maps + params.mapLandmarks = {}; + for (var i = 0; i < params.landmarks.value.length; ++i) { + params.mapLandmarks[params.landmarks.value[i]] = true; + } + params.mapPossibleOrphanedWidgets = {}; + for (var i = 0; i < params.possibleOrphanedWidgets.value.length; ++i) { + params.mapPossibleOrphanedWidgets[params.possibleOrphanedWidgets.value[i]] = true; + } + params.mapPossibleOrphanedElements = {}; + for (var i = 0; i < params.possibleOrphanedElements.value.length; ++i) { + params.mapPossibleOrphanedElements[params.possibleOrphanedElements.value[i]] = true; + } + params.mapNoLandmarkedRoles = {}; + for (var i = 0; i < params.noLandmarkedRoles.value.length; ++i) { + params.mapNoLandmarkedRoles[params.noLandmarkedRoles.value[i]] = true; + } + CacheUtil_1.CacheUtil.setCache(context.dom.node.ownerDocument, "aria_content_in_landmark", params); + } + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || // avoid diagnosing g1157 for non-visible nodes + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var elemsWithoutContent = ["area", "input", "embed", "button", "textarea", "select"]; + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext) && //only trigger the rule on elements that have content + elemsWithoutContent.indexOf(nodeName) === -1) { // a few elems wihout content should not be skipped + return (0, IRule_1.RulePass)("Pass_0"); + } + // Short circuit for layout tables + if (nodeName == "table" && TableUtil_1.TableUtil.isLayoutTable(ruleContext)) { + return null; + } + // Check if it is a possible orphan + var passed = true; + var isPossibleOrphanedWidget = AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapPossibleOrphanedWidgets, true); + //exclude <link rel="stylesheet" href="xyz.css"> in the <head> and <body>(#608) + //having link in the head could cause lot of violaions + if (nodeName === 'link') { + isPossibleOrphanedWidget = false; + } + var isPossibleOrphanedElement = nodeName in params.mapPossibleOrphanedElements; + if (isPossibleOrphanedWidget || isPossibleOrphanedElement) { + // See if ancestor has landmark roles or implicit land mark roles + var parentRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + passed = parentRoles.filter(function (role) { return role in params.mapLandmarks; }).length > 0; + if (!passed) { + // Don't fail elements when a parent or sibling has failed - causes too many messages. + var walkElement = DOMWalker_1.DOMWalker.parentElement(ruleContext); + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = DOMWalker_1.DOMWalker.parentElement(walkElement); + } + walkElement = ruleContext.nextElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.nextElementSibling; + } + walkElement = ruleContext.previousElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.previousElementSibling; + } + if (!passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent", true); + // Don't trigger rule if element is a stand-alone widget + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", false) || + AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapNoLandmarkedRoles, true) || + AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, params.mapNoLandmarkedRoles, true); + if (passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", true); + return null; + } + } + else { + return null; + } + } + } + else { + return null; + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_label_unique.ts" +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_label_unique.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_label_unique = { + id: "aria_contentinfo_label_unique", + context: "aria:contentinfo", + refactor: { + "Rpt_Aria_MultipleContentinfoLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_contentinfo_label_unique.html", + "fail_label_not_unique": "aria_contentinfo_label_unique.html", + "group": "aria_contentinfo_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"contentinfo\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"contentinfo\" role do not have unique labels", + "group": "Each element with \"contentinfo\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "contentinfo", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_misuse.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_misuse.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_misuse = { + id: "aria_contentinfo_misuse", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_ContentinfoWithNoMain_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_misuse.html", + "Fail_1": "aria_contentinfo_misuse.html", + "group": "aria_contentinfo_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"contentinfo\" role is present without an element with \"main\" role", + "group": "Each element with \"contentinfo\" role is only permitted with an element with \"main\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //consider implicit role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + // Consider the Check Hidden Content setting that is set by the rules + var passed = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true).length > 0; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_single.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_single.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_single = { + id: "aria_contentinfo_single", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_single.html", + "Fail_1": "aria_contentinfo_single.html", + "group": "aria_contentinfo_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"contentinfo\" role found on the page", + "group": "A page, document, or application should only have one element with \"contentinfo\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //find out if <footer> element has siblings as <footer> has implicit contentinfo role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + var passed = !AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "contentinfo", true, true); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_descendant_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_descendant_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_descendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_descendant_valid = { + id: "aria_descendant_valid", + context: "dom:*", + dependencies: ["aria_role_valid"], + help: { + "en-US": { + "group": "aria_descendant_valid.html", + "pass": "aria_descendant_valid.html", + "potential_child_implicit_role": "aria_descendant_valid.html", + "recommendation_no_impact_role": "aria_descendant_valid.html", + "fail_child_explicit_role": "aria_descendant_valid.html" + } + }, + messages: { + "en-US": { + "group": "Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements", + "pass": "The element contains valid descendants", + "potential_child_implicit_role": "The element with role \"{0}\" contains descendants with implicit roles \"{1}\" which are ignored by browsers", + "recommendation_no_impact_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers", + "fail_child_explicit_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["pass", "potential_child_implicit_role", "fail_child_explicit_role"] + }, { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["recommendation_no_impact_role"] + }], + // TODO: ACT: Verify mapping + act: ["307n5z"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element doesn't require presentational children only + if (!AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // let tagName = ruleContext.tagName.toLowerCase(); + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (directATChildren && directATChildren.length > 0) { + // the element with at least one non-presentational children + var explicitRoles = new Array(); + var implicitRoles = new Array(); + var noImpactRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + // ignore <img> and <svg> + var tag = directATChildren[j].nodeName.toLowerCase(); + if (tag === 'img' || tag === 'svg') + continue; + // get explicit role if exists + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + if (childRoles && childRoles.length > 0) { + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + explicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + else { + // get implicit role if exists + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + if (childRoles && childRoles.length > 0) + implicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + } + if (explicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < explicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(explicitRoles[i]); + retValues.push((0, IRule_1.RuleFail)("fail_child_explicit_role", retToken)); + } + return retValues; + } + if (implicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < implicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(implicitRoles[i]); + retValues.push((0, IRule_1.RulePotential)("potential_child_implicit_role", retToken)); + } + return retValues; + } + if (noImpactRoles.length > 0) { + var retValues = []; + for (var i = 0; i < noImpactRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(noImpactRoles[i]); + retValues.push((0, IRule_1.RulePotential)("recommendation_no_impact_role", retToken)); + } + return retValues; + } + } + else + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_document_label_unique.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_document_label_unique.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_document_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_document_label_unique = { + id: "aria_document_label_unique", + context: "aria:document", + refactor: { + "Rpt_Aria_MultipleDocumentRoles": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_document_label_unique.html", + "fail_label_not_unique": "aria_document_label_unique.html", + "group": "aria_document_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"document\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"document\" roles do not have unique labels", + "group": "Each element with \"document\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "document", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_eventhandler_role_valid.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_eventhandler_role_valid.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_eventhandler_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_eventhandler_role_valid = { + id: "aria_eventhandler_role_valid", + context: "dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]", + refactor: { + "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_eventhandler_role_valid.html", + "Fail_1": "aria_eventhandler_role_valid.html", + "group": "aria_eventhandler_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with '{1}' does not have a valid ARIA role specified", + "group": "Elements with event handlers must have a valid ARIA role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + //this rule is passed if a element has attribut role + //also, passed of element has any implicit roles. + if (AriaUtil_1.AriaUtil.hasAnyRole(ruleContext, true)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //pass if this element is received focus by default + if (CommonUtil_1.CommonUtil.isfocusableByDefault(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //validate if this element has any of the given event handler's + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var eventArr = new Array(); + // From WCAG20_Script_UseW3CDomFunctions + //let events = ["onblur", "onfocus", "onchange", "onclick", "oncontextmenu", "ondblclick", "onkeydown", + // "onkeypress", "onkeyup", "onload", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + // "onmouseover", "onmousewheel", "onreset", "onpaste", "onresize", "onscroll", + // "onselect", "onsubmit", "onactivate", "ondeactivate", "onmouseenter", "onmouseleave"]; + var events = ["onblur", "onfocus", "onchange", "onclick", "ondblclick", "onkeydown", + "onkeypress", "onkeyup", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + "onmouseover", "onresize" + ]; + for (var i = 0; i < events.length; ++i) { + if (ruleContext.hasAttribute(events[i])) + eventArr.push(events[i]); + } + var retToken2 = new Array(); + retToken2.push(eventArr.join(", ")); + //return new ValidationResult(false, [ruleContext], '', '', [retToken1, retToken2]); + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_form_label_unique.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_form_label_unique.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_form_label_unique = { + id: "aria_form_label_unique", + context: "aria:form", + refactor: { + "Rpt_Aria_MultipleFormLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_form_label_unique.html", + "fail_label_not_unique": "aria_form_label_unique.html", + "group": "aria_form_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"form\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"form\" role do not have unique labels", + "group": "Each element with \"form\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "form", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_graphic_labelled.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_graphic_labelled.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_graphic_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_graphic_labelled = { + id: "aria_graphic_labelled", + context: "aria:graphics-document,aria:graphics-symbol", + refactor: { + "HAAC_Aria_SvgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_graphic_labelled.html", + "Pass_0": "aria_graphic_labelled.html", + "Fail_1": "aria_graphic_labelled.html", + "Fail_2": "aria_graphic_labelled.html", + "Fail_3": "aria_graphic_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with a graphics role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" graphics role has no label", + "Fail_2": "Element with \"{0}\" graphics role has no label or an empty label", + "Fail_3": "Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: [{ + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role") || !ruleContext.getAttribute("role").includes("graphics-")) + return null; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.getAttribute("role")]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_hidden_nontabbable.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_hidden_nontabbable.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_hidden_nontabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_hidden_nontabbable = { + id: "aria_hidden_nontabbable", + context: "dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*", + refactor: { + "aria_hidden_focus_misuse": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_hidden_nontabbable.html", + "Pass_0": "aria_hidden_nontabbable.html", + "Fail_1": "aria_hidden_nontabbable.html" + } + }, + messages: { + "en-US": { + "group": "A hidden element should not contain any tabbable elements", + "Pass_0": "Rule Passed", + "Fail_1": "Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.3.1", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Handle testcase with focus jumping away + act: "6cfa84", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_id_unique.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/aria_id_unique.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_id_unique = { + id: "aria_id_unique", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidIdRef": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_id_unique.html", + "Fail_1": "aria_id_unique.html", + "group": "aria_id_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid", + "group": "The ARIA property must reference a non-empty unique id of an existing element that is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: 6a7281 - Need a separate reason code when the property is not required. ACT says it's okay to be + // invalid when not required. I think we should still fail, but flag it as a different reason so that we can have a subset + // aligns with ACT. + act: ["59796f", "6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pass = true; + var attrNameArr = new Array(); + var nonExistantIDs = new Array(); + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var contextAttributes = ruleContext.attributes; + var idTokens = new Array(); + var testedReferences = 0; + if (contextAttributes) { + for (var i = 0, attrLength = contextAttributes.length; i < attrLength; i++) { + pass = true; + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes[attrName]; + if (dataTypes && dataTypes.type) { + var supportsOneIDRef = (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idref") ? true : false; + //If the data type supports one or more id refs do error checking + if (supportsOneIDRef || (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idrefs")) { + testedReferences++; + var nodeValueLength = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue).length; + var idArray = contextAttributes[i].nodeValue.split(" "); + // Check for an empty ID Ref + if (nodeValueLength < 1) { + pass = false; + idTokens.push("\"" + contextAttributes[i].nodeValue + "\""); + } + // check to see if too many IDRefs + else if (supportsOneIDRef) { + //If has too many IDRefs it is an error + if (nodeValueLength >= 1) { + if (idArray.length > 1) { + pass = false; + // Need to capture all the IDRefs for idTokens + for (var z = 0, length_1 = idArray.length; z < length_1; ++z) { + if (idArray[z] != "") { + idTokens.push(idArray[z]); + } + } + } + } + } + // check to see if id refs are invalid + if (pass && nodeValueLength >= 1) { + for (var j = 0, length_2 = idArray.length; j < length_2; ++j) { + if (idArray[j].length > 0) { // it is an empty string if spaces are one after the other + // Get the element by Id + var elementById = ownerDocument.getElementById(idArray[j]); + // Pass if the element exists + pass = elementById != null; + // If the element exists and this is an aria attribute that doesn't support hidden ID reference + // then perform a isNodeVisible check, in the case the node is not visible then we return + // false and true otherwise. + if (pass && !dataTypes.hiddenIDRefSupported) { + pass = VisUtil_1.VisUtil.isNodeVisible(elementById); + } + if (!pass) { + if (idArray[j] != "") { + idTokens.push(idArray[j]); + } + } + // Only one of the id references need to be valid to mark the rule as passed. + // Therefore if we find a single visible element then stop checking and mark as + // passed. + else { + break; + } + } + } + } + } + } + if (!pass) + attrNameArr.push(attrName); + } + } + } + var passed = attrNameArr.length == 0; + var retToken1 = new Array(); + var retToken2 = new Array(); + var retToken3 = new Array(); + if (!passed) { + retToken2.push(attrNameArr.join(", ")); + retToken3.push(ruleContext.nodeName.toLowerCase()); + if (idTokens.length > 0) { + retToken1.push(idTokens.join(", ")); + } + } + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : [retToken1, retToken2, retToken3]); + if (testedReferences == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString(), retToken3.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_img_labelled.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_img_labelled.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_img_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_img_labelled = { + id: "aria_img_labelled", + context: "aria:img, aria:image", + refactor: { + "HAAC_Aria_ImgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_img_labelled.html", + "Pass_0": "aria_img_labelled.html", + "Fail_1": "aria_img_labelled.html", + "Fail_2": "aria_img_labelled.html", + "Fail_3": "aria_img_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with \"img\" role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"img\" role has no label", + "Fail_2": "Element with \"img\" role has no label or an empty label", + "Fail_3": "Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: ["23a2a8", { + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role")) { + // If no role, this is implicit, and covered by WCAG20_Img_HasAlt + return null; + } + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg and img elements are handled in svg_graphics_labbelled and img_alt_valid rules + if (nodeName === 'svg' || nodeName === 'img') + return; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + /* JCH - Points of failure + * 0. Missing alt attr with value + * 1. Missing aria-label or aria-labelledby + * 2. Missing title attr with value + */ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_keyboard_handler_exists.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_keyboard_handler_exists.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_keyboard_handler_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_keyboard_handler_exists = { + id: "aria_keyboard_handler_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingKeyboardHandler": { + "pass": "pass", + "potential_no_keyboard_access": "potential_no_keyboard_access" + } + }, + help: { + "en-US": { + "pass": "aria_keyboard_handler_exists.html", + "potential_no_keyboard_access": "aria_keyboard_handler_exists.html", + "group": "aria_keyboard_handler_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_no_keyboard_access": "Verify the <{0}> element with \"{1}\" role has keyboard access", + "group": "Interactive WAI_ARIA UI components must provide keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var passed = true; + var savedPassed = passed; + var doc = ruleContext.ownerDocument; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/); + //only consider user specified role(s), rather than native containers + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + var nodeName = ruleContext.nodeName.toLowerCase(); + //if an explicit role is specified, the 'aria_role_redundant' rule should be triggered and addressed first, + // and the current rule should be ignored + if (nodeName === 'datalist' && roles && roles.includes("listbox")) + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + for (var j = 0; j < roles.length; ++j) { + var pattern = designPatterns[roles[j]]; + if (roleContainers.indexOf(roles[j]) >= 0) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (!disabled) { + // See if there is a keyboard event handler on the parent element. + passed = (ruleContext.hasAttribute("onkeydown") || ruleContext.hasAttribute("onkeypress") || ruleContext.hasAttribute("onkeyup")); + // No keyboard event handler found on parent. See if keyboard event handlers are on required child elements. + if (!passed) { + if (!hasAttribute(ruleContext, 'aria-activedescendant')) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren; + if (reqChildren) { /* SMF TODO menubar does not have any reqChildren */ + for (var i = 0, requiredChildrenLength = reqChildren.length; i < requiredChildrenLength; i++) { + var xp = "*[contains(@role,'" + reqChildren[i] + "')]"; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r) { + passed = (r.hasAttribute("onkeydown") || r.hasAttribute("onkeypress")); + if (!passed) { + // Child did not have a key handler. See if any of the grandchildren do. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + // All the required children (or any descendants of the required children) must have keypress/keydown + // If not, it is a failure, no need to keep checking any more. + break; + } + r = xpathResult.iterateNext(); + } + } + } + else { + // The current element failed the keydown/keypress, and it does not have required children, such as menubar. + // Let's check its descendants. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + } + else { + // Attribute 'aria-activedescendant' is specified. + passed = true; + } + } + } + } + if (!passed) { + roleNameArr.push(roles[j]); + } + if (!passed && savedPassed) { + savedPassed = passed; + } + } + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var retToken2 = new Array(); + retToken2.push(roleNameArr.join(", ")); + // Determine if this is referenced by a combobox. If so, leave it to the combobox rules to check + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + return savedPassed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_no_keyboard_access", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_landmark_name_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_landmark_name_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_landmark_name_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_landmark_name_unique = { + id: "aria_landmark_name_unique", + context: "aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form", + refactor: { + "landmark_name_unique": { + "Pass_0": "pass", + "Fail_0": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_landmark_name_unique.html", + "fail_label_not_unique": "aria_landmark_name_unique.html", + "group": "aria_landmark_name_unique.html" + } + }, + messages: { + "en-US": { + "pass": "Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'", + "fail_label_not_unique": "Multiple elements with \"{0}\" landmarks within the same parent region are not distinguished from one another because they have the same \"{1}\" label", + "group": "Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // TODO do I need to fiter out bad contentinfo nodes: The footer element is not a contentinfo landmark when it is a descendant of the following HTML5 sectioning elements: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Checking if this landmark is inside a dialog element. If it is we are going to skip checking it. + /**var copyOfRuleContext = ruleContext; + var parnetNodesOfRuleContext = []; + while (copyOfRuleContext) { + parnetNodesOfRuleContext.unshift(copyOfRuleContext); + copyOfRuleContext = copyOfRuleContext.parentElement; + } + parnetNodesOfRuleContext.forEach(elem => { + if (elem !== null) { + if (elem.tagName == "DIALOG" || elem.getAttribute('role') == "dialog") { + return null // Skipping checking landmarks that happen to be inside dialog elements + } + } + }) + */ + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "dialog", true) !== null) + return null; + // Begining formCache work + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_landmark_name_unique", null); + if (!formCache) { + // console.log("---------ENTERING FORM CACHE") + formCache = { + navigationNodes: [], + navigationNodesComputedLabels: [], + navigationNodesParents: [], + navigationNodesMatchFound: [] + }; + var navigationNodesTemp = ownerDocument.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'); + var navigationNodes = Array.from(navigationNodesTemp); + var navigationNodesParents = []; + var navigationNodesMatchFound = []; + // This block of code filters out any nav elements that are under a dialog. As those are not ones we want to test against as we consider dialogs are separate locations from the rest of the main page. + var navigationNodesWithoutDialogs = []; + for (var i = 0; i < navigationNodes.length; i++) { + /**let a = navigationNodes[i]; + + let dialogNodeFoundFlag = false; + while (a) { + a = a.parentElement; + if (a !== null) { + if (a.tagName == "DIALOG" || a.getAttribute('role') == "dialog") { + dialogNodeFoundFlag = true; + } + } + } + if (!dialogNodeFoundFlag) { + navigationNodesWithoutDialogs.push(navigationNodes[i]) + }*/ + // ignore node that is AT hidden or in a dialog + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(navigationNodes[i]) || CommonUtil_1.CommonUtil.getAncestor(navigationNodes[i], ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(navigationNodes[i], "dialog", true) !== null) + continue; + navigationNodesWithoutDialogs.push(navigationNodes[i]); + } + navigationNodes = navigationNodesWithoutDialogs; + for (var i = 0; i < navigationNodes.length; i++) { + // Loop over all the landmark nodes + var els = []; + var a = navigationNodes[i].parentElement; + while (a) { + els.push(a); + a = a.parentElement; + } + for (var j = 0; j < els.length; j++) { + // Loop over all the parents of the landmark nodes + // Find nearest landmark parent based on the tagName or the role attribute + var tagNameTrigger = [ + "ASIDE", + "FOOTER", + "FORM", + "HEADER", + "MAIN", + "NAV", + "SECTION", + ].includes(els[j].tagName); + var roleNameTrigger = false; + if (els[j].hasAttribute("role")) { + roleNameTrigger = [ + "complementary", + "contentinfo", + "form", + "banner", + "main", + "navigation", + "region", + "search", + ].includes(els[j].getAttribute("role")); // TODO we are not covering the case where a elemenent with multiple roles. e.g., role = "form banner". This is a improvment we might want to add in the future. + } + if (tagNameTrigger || roleNameTrigger) { + // Nearest parent-landmark found + navigationNodesParents.push(els[j]); + break; + } + if (j === els.length - 1) { + // This node is at the head of the file so it does not have a parent + navigationNodesParents.push(null); + break; + } + } + } + var navigationNodesComputedLabels = []; + for (var i = 0; i < navigationNodes.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(navigationNodes[i]); + // Loop over all the landmark nodes + navigationNodesComputedLabels.push( + /**ARIAMapper.computeName(navigationNodes[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + for (var i = 0; i < navigationNodesParents.length; i++) { + // Loop over all the parents of the landmark nodes to find duplicates + var matchFound = false; + var pass_0_flag = false; + for (var j = 0; j < navigationNodesParents.length; j++) { + if (j === i) { + // We do not want to compare against ourselfs + continue; + } + // This if statement focus on the case where the parent landmark is null + if (navigationNodesParents[i] === null && + navigationNodesParents[j] === null) { + // We are looking at two root nodes, so we should compare them. + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else if (navigationNodesParents[i] === null || + navigationNodesParents[j] === null) { + // We are looking at a single root node + continue; + } + // This if statement focus on the case where the parent landmark is NOT null + if (DOMUtil_1.DOMUtil.sameNode(navigationNodesParents[i], navigationNodesParents[j])) { + // We have the same parent-landmark AND + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else { + // Different parents // Not applicable + } + } + if (!matchFound) { + if (pass_0_flag) { + navigationNodesMatchFound.push("pass"); + } + else { + navigationNodesMatchFound.push("null"); // This is not the keyword null on purpose. It is a spaceholder in the array so indexes match up. + } + } + } + formCache.navigationNodesComputedLabels = + navigationNodesComputedLabels; + formCache.navigationNodes = navigationNodes; + formCache.navigationNodesParents = navigationNodesParents; + formCache.navigationNodesMatchFound = navigationNodesMatchFound; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_landmark_name_unique", formCache); + // TODO Add validation that all 3 arrays are the same length + // console.log("-------------End formCache") + } // End formCache + var indexToCheck = -1; + for (var i = 0; i < formCache.navigationNodes.length; i++) { + if (ruleContext.isSameNode(formCache.navigationNodes[i])) { + indexToCheck = i; + } + } + if (indexToCheck === -1) { + return null; + } + if (formCache.navigationNodesMatchFound[indexToCheck] === "pass") { + return (0, IRule_1.RulePass)("pass", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + ]); + } + else if (formCache.navigationNodesMatchFound[indexToCheck] === "fail_label_not_unique") { + return (0, IRule_1.RuleFail)("fail_label_not_unique", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + formCache.navigationNodesComputedLabels[indexToCheck], + ]); + } + else { + return null; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_main_label_unique.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_main_label_unique.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_main_label_unique = { + id: "aria_main_label_unique", + context: "aria:main", + refactor: { + "Rpt_Aria_MultipleMainsRequireLabel_Implicit_2": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_unique.html", + "Fail_1": "aria_main_label_unique.html", + "group": "aria_main_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique labels", + "group": "Each element with \"main\" role must have unique label that describes its purposes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var contextLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var parentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "document", true); + var mains = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + var result = null; + for (var i = 0; i < mains.length; ++i) { + if (mains[i] === ruleContext) + continue; + result = (0, IRule_1.RulePass)("Pass_0"); + var thisParentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(mains[i], "document", true); + if (thisParentDocRole === parentDocRole) { + if (AriaUtil_1.AriaUtil.getAriaLabel(mains[i]) === contextLabel) { + result = (0, IRule_1.RuleFail)("Fail_1"); + break; + } + } + } + return result; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_main_label_visible.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_main_label_visible.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_main_label_visible = { + id: "aria_main_label_visible", + context: "dom:body", + refactor: { + "Rpt_Aria_MultipleMainsVisibleLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_visible.html", + "Fail_1": "aria_main_label_visible.html", + "group": "aria_main_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique visible labels", + "group": "Each element with \"main\" role should have a unique visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Consider the Check Hidden Content setting that is set by the rules + //call getElementsByRoleHidden with considerImplicit flag as true + //so that the method returs <main> elements + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var passed = AriaUtil_1.AriaUtil.hasUniqueAriaLabelledby(landmarks); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_navigation_label_unique.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_navigation_label_unique.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_navigation_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_navigation_label_unique = { + id: "aria_navigation_label_unique", + context: "aria:navigation", + refactor: { + "Rpt_Aria_MultipleNavigationLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_navigation_label_unique.html", + "fail_label_not_unique": "aria_navigation_label_unique.html", + "group": "aria_navigation_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"navigation\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"navigation\" role do not have unique labels", + "group": "Each element with \"navigation\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "navigation", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_parent_required.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_parent_required.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_parent_required = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_parent_required = { + id: "aria_parent_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredParent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_parent_required.html", + "Pass_0": "aria_parent_required.html", + "Fail_1": "aria_parent_required.html" + } + }, + messages: { + "en-US": { + "group": "Each element with an implicit or explicit role must be contained within a valid element", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" role is not contained in or owned by an element with one of the following roles: \"{1}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Check Fail 3 + act: "ff89c9", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext)) + return; + var passed = true; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var roleNameArr = new Array(); + var containerRoles = new Array(); + var testedContainer = 0; + var ancestorRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + var parentRole = ancestorRoles[ancestorRoles.length - 2]; + var count = 2; + while (parentRole === 'none') { + count++; + parentRole = ancestorRoles[ancestorRoles.length - count]; + } + /**for (let j = 0, length = roles.length; j < length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[roles[j]].container; + for (let i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) break; + } + if (passed == false) { + roleNameArr.push(roles[j]); + } + } + } + */ + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (designPatterns[role] && designPatterns[role].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[role].container; + for (var i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) + break; + } + if (passed == false) { + roleNameArr.push(role); + } + } + var retToken1 = new Array(); + retToken1.push(roleNameArr.join(", ")); + var retToken2 = new Array(); + retToken2.push(containerRoles.join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (testedContainer == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_region_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_region_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_region_label_unique = { + id: "aria_region_label_unique", + context: "aria:region", + refactor: { + "Rpt_Aria_MultipleRegionsUniqueLabel_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_region_label_unique.html", + "fail_label_not_unique": "aria_region_label_unique.html", + "group": "aria_region_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"region\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"region\" role do not have unique labels", + "group": "Each element with \"region\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "region"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_region_labelled.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_region_labelled.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_region_labelled = { + id: "aria_region_labelled", + context: "aria:region", + refactor: { + "Rpt_Aria_RegionLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + // "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_region_labelled.html", + "Fail_1": "aria_region_labelled.html", + // "Fail_2": "aria_region_labelled.html", + "group": "aria_region_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"region\" role does not have a label", + // "Fail_2": "Element with \"region\" role is not labeled with 'aria-label' or 'aria-labelledby'", + "group": "Each element with \"region\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_role_allowed.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_role_allowed.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_role_allowed = { + id: "aria_role_allowed", + context: "dom:*[role]", + refactor: { + "Rpt_Aria_ValidRole": { + "Pass_0": "Pass_0", + "Fail_2": "Fail_2", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "aria_role_allowed.html", + "Pass_0": "aria_role_allowed.html", + "Fail_2": "aria_role_allowed.html", + "Potential_1": "aria_role_allowed.html" + } + }, + messages: { + "en-US": { + "group": "Elements must have a valid 'role' per ARIA specification", + "Pass_0": "Rule Passed", + "Fail_2": "The role '{0}' defined on the element is not valid per ARIA specification", + "Potential_1": "Some of the roles, '{0}', defined on the element are not valid per ARIA specification" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Recheck + act: "674b10", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var roleStr = ruleContext.getAttribute("role").trim().toLowerCase(); + if (roleStr.length === 0) { + return null; + } + if (ruleContext.hasAttribute("aria-hidden") && ruleContext.getAttribute("aria-hidden").toLowerCase() === "true") { + return null; + } + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (!invalidRoles || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + else { + var roles = roleStr.split(/\s+/); + if (invalidRoles.length === roles.length) { + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(",")]); + } + else if (invalidRoles.length > 0) { + return (0, IRule_1.RulePotential)("Potential_1", [invalidRoles.join(",")]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_role_redundant.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_role_redundant.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_role_redundant = { + id: "aria_role_redundant", + context: "dom:*[role]", + help: { + "en-US": { + "pass": "aria_role_redundant.html", + "fail_redundant": "aria_role_redundant.html", + "group": "aria_role_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "An explicitly-assigned ARIA role is not redundant with the implicit role of the element", + "fail_redundant": "The explicitly-assigned ARIA role \"{0}\" is redundant with the implicit role of the element <{1}>", + "group": "An explicitly-assigned ARIA role should not be redundant with the implicit role of the element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var elemName = ruleContext.tagName.toLowerCase(); + var ariaRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + if (!ariaRoles || ariaRoles.length === 0) + return; + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + var role_defined = AriaUtil_1.AriaUtil.areRolesDefined(ariaRoles); + if (!role_defined) + return null; + // dependency check: if it's already failed in the parent relation, then skip this check + // comment out to report the redundant role for table element: tr, td & th + /**if (["td", "th", "tr"].includes(elemName)) { + let parentRole = TableUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + }*/ + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + if (!implicitRoles || implicitRoles.length === 0) + return (0, IRule_1.RulePass)("pass"); + var ret = []; + for (var i = 0; i < ariaRoles.length; i++) { + if (!implicitRoles.includes(ariaRoles[i])) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaRoles[i], elemName])); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_search_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_search_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_search_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_search_label_unique = { + id: "aria_search_label_unique", + context: "aria:search", + refactor: { + "Rpt_Aria_MultipleSearchLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_search_label_unique.html", + "fail_label_not_unique": "aria_search_label_unique.html", + "group": "aria_search_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"search\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"search\" role do not have unique labels", + "group": "Each element with \"search\" role must have a unique label that describes its purpose" + } + }, + /** + * deprecated the rule on 01/27/2025 + * rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + rulesets: [{ + "id": [], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "search", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_semantics.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/aria_semantics.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_valid = exports.aria_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_role_valid = { + id: "aria_role_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "aria_semantics_role": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_role_valid.html", + "Fail_1": "aria_role_valid.html", + "Fail_2": "aria_role_valid.html", + "group": "aria_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The ARIA role '{0}' is not valid for the element <{1}>", + "Fail_2": "The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable", + "group": "ARIA roles must be valid for the element to which they are assigned" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var tagName = ruleContext.tagName.toLowerCase(); + // only chek element (1) and fragment nodes (11) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + //skip the rule + // the invalid role case: handled by aria_role_allowed. Ignore to avoid duplicated report + var undefinedRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (undefinedRoles && undefinedRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + // dependency check: if it's already failed, then skip + if (["td", "th", "tr"].includes(tagName)) { + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + } + var domRoles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles.includes('generic')) + return (0, IRule_1.RuleFail)("Fail_1", ["generic", tagName]); + var invalidRoles = AriaUtil_1.AriaUtil.getInvalidRoles(ruleContext); + if (invalidRoles === null || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + if (invalidRoles.includes("presentation") || invalidRoles.includes("none") && CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(", "), tagName]); + if (invalidRoles.length > 0) + return (0, IRule_1.RuleFail)("Fail_1", [invalidRoles.join(", "), tagName]); + if (domRoles.length > 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + return null; + } +}; +// This rule is in the same file because there is a dependency that aria_role_valid runs first, +// and the info is passed by cache, but there isn't a dependency in the Fail_2 scenario, so regular +// dependency cannot be used +exports.aria_attribute_valid = { + id: "aria_attribute_valid", + context: "dom:*", + // The the ARIA role is completely invalid, skip this check + dependencies: ["aria_attribute_deprecated", "aria_role_valid"], + refactor: { + "aria_attribute_allowed": { + "Pass": "Pass", + "Fail_invalid_role_attr": "Fail_invalid_role_attr", + "Fail_invalid_implicit_role_attr": "Fail_invalid_implicit_role_attr" + } + }, + help: { + "en-US": { + "group": "aria_attribute_valid.html", + "Pass": "aria_attribute_valid.html", + "Fail_invalid_role_attr": "aria_attribute_valid.html", + "Fail_invalid_implicit_role_attr": "aria_attribute_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes should be valid for the element and ARIA role to which they are assigned", + "Pass": "ARIA attributes are valid for the element and ARIA role", + "Fail_invalid_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with ARIA role \"{2}\"", + "Fail_invalid_implicit_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with implicit ARIA role \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["5c01ea", { "46ca7f": { "Pass": "pass", "Fail_invalid_role_attr": "fail", "Fail_invalid_implicit_role_attr": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // only chek element (1) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + // ignore if no aria attribute + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (ariaAttributes === null || ariaAttributes.length === 0) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + var explicit = true; + if (roles && roles.length > 0) { + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + if (!AriaUtil_1.AriaUtil.areRolesDefined(roles)) + return null; + } + else { + //no explicit role defined + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + explicit = false; + } + var tagName = ruleContext.tagName.toLowerCase(); + var failedAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (!failedAttributes || failedAttributes.length === 0) + return (0, IRule_1.RulePass)("Pass", [ariaAttributes.join(", "), tagName, roles.join(", ")]); + if (roles.length > 0) { + if (explicit) + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + else + return (0, IRule_1.RuleFail)("Fail_invalid_implicit_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + } + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, "none"]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_toolbar_label_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_toolbar_label_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_toolbar_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_toolbar_label_unique = { + id: "aria_toolbar_label_unique", + context: "aria:toolbar", + refactor: { + "Rpt_Aria_MultipleToolbarUniqueLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_toolbar_label_unique.html", + "Fail_1": "aria_toolbar_label_unique.html", + "group": "aria_toolbar_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"toolbar\" roles do not have unique labels", + "group": "Each element with \"toolbar\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "toolbar", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_widget_labelled.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_widget_labelled.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_widget_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_widget_labelled = { + id: "aria_widget_labelled", + context: "dom:*", + refactor: { + "Rpt_Aria_WidgetLabels_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_widget_labelled.html", + "Pass_0": "aria_widget_labelled.html", + "Fail_1": "aria_widget_labelled.html" + } + }, + messages: { + "en-US": { + "group": "Interactive component must have a programmatically associated name", + "Pass_0": "Rule Passed", + "Fail_1": "Interactive component with ARIA role '{0}' does not have a programmatically associated name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "m6b1q3", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + /* removed the role check role= presentation and role=none since these 2 roles are not in the list of widget type roles */ + if ((ruleContext.hasAttribute("type") && + ruleContext.getAttribute("type") === "hidden") || + (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || + AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox")))) { + // we need to diagnose that a combobox input textbox has a label(github issue #1104) + return null; + } + var elemRole = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var tagName = ruleContext.nodeName.toLowerCase(); + // Handled by input_label_exists + var skipRoles = [ + "button", + "checkbox", + "combobox", + "listbox", + "menuitemcheckbox", + "menuitemradio", + "radio", + "searchbox", + "slider", + "spinbutton", + "switch", + "textbox", + "progressbar", + "link", + ]; + if (skipRoles.includes(elemRole)) + return null; + if (tagName === "output" || + (tagName === "input" && + ruleContext.getAttribute("type") === "file")) { + } + if (!ruleContext.hasAttribute("role")) { + // Form/input elements are checked by G41, we skip them from this rule. Github issue 449 + var skipElements = [ + "input", + "textarea", + "select", + "button", + "datalist", + "optgroup", + "option", + "keygen", + "output", + "progress", + "meter", + ]; + if (skipElements.indexOf(ruleContext.nodeName.toLowerCase()) != + -1) { + return null; + } + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var passed = true; + var prohibited = false; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //get attribute roles as well as implicit roles. + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + var numWidgetsTested = 0; + var interactiveRoleTypes = ["widget", "liveRegion", "window"]; + for (var i = 0, length_1 = roles.length; passed && i < length_1; ++i) { + var pattern = designPatterns[roles[i]]; + if (pattern && + pattern.nameRequired && + pattern.roleType && + interactiveRoleTypes.includes(pattern.roleType)) { + ++numWidgetsTested; + // All widgets may have an author supplied accessible name. + // Title is legal, but don't advertise its use in documentation. + // Encourage use of aria-label, aria-labelledby or html label element. + passed = + AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title") || + CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!passed && + pattern.nameFrom && + pattern.nameFrom.indexOf("contents") >= 0) { + // See if widget's accessible name is supplied by element's inner text + // nameFrom: ["author", "contents"] + passed = CommonUtil_1.CommonUtil.hasInnerContentOrAlt(ruleContext); + } + if (!passed) { + // check if it has implicit label, like <label><input ....>abc </label> + passed = CommonUtil_1.CommonUtil.hasImplicitLabel(ruleContext); + } + if (!passed && + ruleContext.tagName.toLowerCase() === "img" && + !ruleContext.hasAttribute("role") && + ruleContext.hasAttribute("alt")) { + passed = + DOMUtil_1.DOMUtil.cleanWhitespace(ruleContext.getAttribute("alt")).trim().length > 0; + } + if (pattern.nameFrom.indexOf("prohibited") >= 0) { + prohibited = true; + } + } + } + if (numWidgetsTested === 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [elemRole]); + } + else { + //TODO + // if (prohibited) { + // return RuleFail("Fail_2"); + // } else { + return (0, IRule_1.RulePass)("Pass_0"); + // } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/asciiart_alt_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/asciiart_alt_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.asciiart_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.asciiart_alt_exists = { + id: "asciiart_alt_exists", + context: "dom:pre, dom:listing, dom:xmp, dom:plaintext", + refactor: { + "RPT_Pre_ASCIIArt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "asciiart_alt_exists.html", + "Potential_1": "asciiart_alt_exists.html", + "group": "asciiart_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that ASCII art has a text alternative", + "group": "ASCII art must have a text alternative" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Fix for IDWB writers. Don't trigger if content is in a code element. The code element is searched for + // in various places because of the weird way various browsers render <code><pre></pre></code. Firefox, + // HtmlUnit and Chrome all render differently. Firefox: <code></code><pre></pre> HtmlUnit: </code><pre><code></code></pre> + // See unit test CodeElementAbovePreElement.html. Don't know how RPT renders, so cover all the bases. + if (ruleContext.nodeName.toLowerCase() == "pre") { + if ((ruleContext.previousSibling && ruleContext.previousSibling.nodeName.toLowerCase() == "code") || + ruleContext.getElementsByTagName("code").length > 0 || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, "code")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + var passed = true; + var txtValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + var nonAlphaNumericNorSpaceCount = 0; + var alphNumSameCharacterCount = 0; + var lastCharacter = ""; + // Iterate through the text content + for (var idx = 0; passed && (idx < txtValue.length); ++idx) { + var chStr = txtValue.substr(idx, 1); + // Check if it is alphanumeric or punctuation + if (/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(chStr)) { + // Detect same character sequence + if (lastCharacter == chStr) { + alphNumSameCharacterCount = alphNumSameCharacterCount + 1; + ; + } + else { + alphNumSameCharacterCount = 0; + } + } + else if (/\s/.test(chStr)) { + alphNumSameCharacterCount = 0; + } + else { + nonAlphaNumericNorSpaceCount = nonAlphaNumericNorSpaceCount + 1; + alphNumSameCharacterCount = 0; + } + lastCharacter = chStr; + // Make the decision + if (nonAlphaNumericNorSpaceCount >= 5 || alphNumSameCharacterCount >= 4) { + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blink_css_review.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/blink_css_review.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_css_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blink_css_review = { + id: "blink_css_review", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Blink_CSSTrigger1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "blink_css_review.html", + "Pass_0": "blink_css_review.html", + "Potential_1": "blink_css_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds", + "Pass_0": "Rule Passed", + "Potential_1": "Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var textValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute('style')) { + textValue = ruleContext.getAttribute('style'); + } + var passed = textValue.toLowerCase().indexOf("text-decoration:blink") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blink_elem_deprecated.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/blink_elem_deprecated.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_elem_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.blink_elem_deprecated = { + id: "blink_elem_deprecated", + context: "dom:blink", + refactor: { + "WCAG20_Blink_AlwaysTrigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "blink_elem_deprecated.html", + "Fail_1": "blink_elem_deprecated.html" + } + }, + messages: { + "en-US": { + "group": "Content that blinks persistently must not be used", + "Fail_1": "Content found that blinks persistently" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + // const ruleContext = context["dom"].node as Element; + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blockquote_cite_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/blockquote_cite_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blockquote_cite_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blockquote_cite_exists = { + id: "blockquote_cite_exists", + context: "dom:blockquote", + refactor: { + "RPT_Blockquote_HasCite": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "blockquote_cite_exists.html", + "Potential_1": "blockquote_cite_exists.html", + "group": "blockquote_cite_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only", + "group": "Use <blockquote> only for quotations, not indentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "cite"); + if (!passed) { + var citeElems = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "cite"); + passed = citeElems != null && citeElems.length > 0; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/canvas_content_described.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/canvas_content_described.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.canvas_content_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.canvas_content_described = { + id: "canvas_content_described", + context: "dom:canvas", + refactor: { + "HAAC_Canvas": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "canvas_content_described.html", + "Manual_1": "canvas_content_described.html", + "group": "canvas_content_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify accessibility of the <canvas> element", + "group": "The <canvas> element may not be accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.1.1", "4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = ruleContext.innerHTML.trim().length > 0; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/caption_track_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/caption_track_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.caption_track_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.caption_track_exists = { + id: "caption_track_exists", + context: "dom:video", + refactor: { + "HAAC_Video_HasNoTrack": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "caption_track_exists.html", + "Potential_1": "caption_track_exists.html", + "group": "caption_track_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that captions are available for any meaningful audio or provide a caption track for the <video> element", + "group": "A <video> element must have a text alternative for any meaningful audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + // ignore decorative video if user uses aria-hidden + if (ruleContext.getAttribute("aria-hidden") === "true") { + return null; + } + var tracks = ruleContext.getElementsByTagName("track"); + for (var i = 0; i < tracks.length; ++i) { + passed = passed || tracks[i].getAttribute("kind") === 'captions'; + } + // checks for addition of dynamic tracks + if (ruleContext.textTracks && ruleContext.textTracks.length > 0) { + for (var i = 0; i < ruleContext.textTracks.length; i++) { + passed = passed || ruleContext.textTracks[i].kind === 'captions'; + } + } + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_active_descendant.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/combobox_active_descendant.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_active_descendant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_active_descendant = { + id: "combobox_active_descendant", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_active_descendant.html", + "Fail_missing": "combobox_active_descendant.html", + "Fail_not_in_popup": "combobox_active_descendant.html", + "Fail_active_role_invalid": "combobox_active_descendant.html", + "Fail_active_not_selected": "combobox_active_descendant.html", + "group": "combobox_active_descendant.html" + } + }, + messages: { + "en-US": { + "Pass": "'aria-activedescendant' is used appropriately for this combobox", + "Fail_missing": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist", + "Fail_not_in_popup": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"", + "Fail_active_role_invalid": "The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'", + "Fail_active_not_selected": "The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true", + "group": "'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // This rule only applies if the activedescendant is specified + var activeId = ruleContext.getAttribute("aria-activedescendant"); + if (!activeId || activeId.trim().length === 0) { + return null; + } + var activeElem = fragment_1.FragmentUtil.getById(ruleContext, activeId); + if (!activeElem) { + return (0, IRule_1.RuleFail)("Fail_missing", [activeId]); + } + var found = false; + // examine the children + if (popupElement) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (!found && nw.nextNode() && nw.node != popupElement && nw.node != popupElement.nextSibling) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + found = nw.elem().getAttribute("id") === activeId; + } + } + } + var retVal = []; + if (!found) { + retVal.push((0, IRule_1.RulePass)("Fail_not_in_popup", [activeId, popupId])); + } + var activeRoles = AriaUtil_1.AriaUtil.getRoles(activeElem, true); + var validRoles = ["option", "gridcell", "row", "treeitem"].filter(function (validRole) { return activeRoles.includes(validRole); }); + if (validRoles.length === 0) { + retVal.push((0, IRule_1.RuleFail)("Fail_active_role_invalid", [activeId, activeRoles.join(",")])); + } + if (activeElem.getAttribute("aria-selected") !== "true") { + retVal.push((0, IRule_1.RuleFail)("Fail_active_not_selected", [activeId])); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_autocomplete_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_autocomplete_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_autocomplete_valid = { + id: "combobox_autocomplete_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_autocomplete": { + "Pass": "Pass", + "Fail_1": "Fail_1", + "Fail_inline": "Fail_inline" + } + }, + help: { + "en-US": { + "Pass": "combobox_autocomplete_valid.html", + "Fail_1": "combobox_autocomplete_valid.html", + "Fail_inline": "combobox_autocomplete_valid.html", + "group": "combobox_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup", + "Fail_1": "The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"", + "Fail_inline": "The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ", + "group": "A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupId = cachedElem.popupId, popupElement = cachedElem.popupElement; + var retVal = []; + if (ruleContext.getAttribute("aria-autocomplete") === "inline") { + retVal.push((0, IRule_1.RuleFail)("Fail_inline")); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-autocomplete" + passed = !popupElement.hasAttribute("aria-autocomplete"); + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !nw.elem().hasAttribute("aria-autocomplete"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_1", [popupId])); + } + if (retVal.length > 0) { + return retVal; + } + else { + return (0, IRule_1.RulePass)("Pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_design_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/combobox_design_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_design_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +function patternDetect(elem) { + // check 'explicit' role combobox and that it is not <select>. + if (elem.tagName.toLowerCase() === "select" && elem.getAttribute("role") !== "combobox") { + return "implicit"; + } + else if (elem.nodeName.toLowerCase() === "input" + && (!elem.hasAttribute("type") || elem.getAttribute("type") === "text") + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.0 pattern, which the ARIA 1.2 spec says to continue to allow + return "1.0"; + } + else if (elem.nodeName.toLowerCase() !== "input" + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.1 pattern, which the ARIA 1.2 spec says is now invalid + return "1.1"; + } + // Assume they're trying to do the latest, 1.2 pattern + return "1.2"; +} +exports.combobox_design_valid = { + id: "combobox_design_valid", + context: "aria:combobox", + refactor: { + "combobox_version": { + "Pass_1.0": "Pass_1.0", + "Fail_1.1": "Fail_1.1", + "Pass_1.2": "Pass_1.2" + } + }, + help: { + "en-US": { + "Pass_1.0": "combobox_design_valid.html", + "Fail_1.1": "combobox_design_valid.html", + "Pass_1.2": "combobox_design_valid.html", + "group": "combobox_design_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1.0": "The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2", + "Fail_1.1": "The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2", + "Pass_1.2": "The combobox design pattern is detected as ARIA 1.2", + "group": "The combobox design pattern must be valid for ARIA 1.2" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var pattern = patternDetect(ruleContext); + // We don't assess native select elements here + if (pattern === "implicit") { + return null; + } + var tagName = ruleContext.tagName.toLowerCase(); + var expanded = (AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-expanded") || "").trim().toLowerCase() === "true"; + var editable = tagName === "input" && (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() === "text"); + var key = context["dom"].rolePath; + if (key) { + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + cache[key] = { + "inputElement": editable ? ruleContext : null, + "pattern": pattern, + "expanded": expanded + }; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "combobox", cache); + } + else { + // No xpath? + return null; + } + if (pattern === "1.0") { + return (0, IRule_1.RulePass)("Pass_1.0"); + } + else if (pattern === "1.1") { + return (0, IRule_1.RuleFail)("Fail_1.1"); + } + else if (pattern === "1.2") { + return (0, IRule_1.RulePass)("Pass_1.2"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_focusable_elements.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_focusable_elements.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_focusable_elements = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_focusable_elements = { + id: "combobox_focusable_elements", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_focusable_elements.html", + "Fail_not_tabbable": "combobox_focusable_elements.html", + "Fail_tabbable_child": "combobox_focusable_elements.html", + "group": "combobox_focusable_elements.html" + } + }, + messages: { + "en-US": { + "Pass": "DOM focus is allowed only on the combobox element as required", + "Fail_not_tabbable": "The combobox element does not allow DOM focus as required", + "Fail_tabbable_child": "The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed", + "group": "Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, expanded = cachedElem.expanded; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + var popupRole = AriaUtil_1.AriaUtil.getRoles(popupElement, true)[0]; + var retVal = []; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + retVal.push((0, IRule_1.RuleFail)("Fail_not_tabbable")); + } + // Only makes sense to check the popup when expanded + // this does not apply to dialogs, return pass since the main element was focusable above + if (expanded === false || popupRole === "dialog") { + return (0, IRule_1.RulePass)("Pass"); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-activedescendant" + passed = !CommonUtil_1.CommonUtil.isTabbable(popupElement) && !AriaUtil_1.AriaUtil.getAriaAttribute(popupElement, "aria-activedescendant"); + ; + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !CommonUtil_1.CommonUtil.isTabbable(nw.node) && + !AriaUtil_1.AriaUtil.getAriaAttribute(nw.node, "aria-activedescendant"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_tabbable_child")); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_haspopup_valid.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/combobox_haspopup_valid.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_haspopup_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.combobox_haspopup_valid = { + id: "combobox_haspopup_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_haspopup": { + "Pass": "Pass", + "Fail_popup_role_invalid": "Fail_popup_role_invalid", + "Fail_combobox_popup_role_mismatch": "Fail_combobox_popup_role_mismatch" + } + }, + help: { + "en-US": { + "Pass": "combobox_haspopup_valid.html", + "Fail_popup_role_invalid": "combobox_haspopup_valid.html", + "Fail_combobox_popup_role_mismatch": "combobox_haspopup_valid.html", + "group": "combobox_haspopup_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value", + "Fail_popup_role_invalid": "The 'role' value \"{0}\" of the popup element \"{1}\" should be one of \"listbox\", \"grid\", \"tree\" or \"dialog\"", + "Fail_combobox_popup_role_mismatch": "The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"", + "group": "The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // Check that popup role is listbox, grid, tree, or dialog and that it matches the combobox + var popupRoles = AriaUtil_1.AriaUtil.getRoles(popupElement, true); + var validRoles = ["listbox", "grid", "tree", "dialog"].filter(function (validRole) { return popupRoles.includes(validRole); }); + if (validRoles.length === 0) { + return (0, IRule_1.RuleFail)("Fail_popup_role_invalid", [popupRoles.join(","), popupId]); + } + else { + var popupRole = validRoles[0]; + var haspopupVal = ruleContext.getAttribute("aria-haspopup") || "listbox"; + // Popup role must match aria-haspopup unless popupRole is listbox, then aria-haspopup should not be defined + if (haspopupVal !== popupRole) { + if (popupRole !== "listbox" || ruleContext.hasAttribute("aria-haspopup")) { + return (0, IRule_1.RuleFail)("Fail_combobox_popup_role_mismatch", [haspopupVal, popupRole]); + } + } + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_popup_reference.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/combobox_popup_reference.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_popup_reference = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_popup_reference = { + id: "combobox_popup_reference", + context: "aria:combobox", + dependencies: ["combobox_design_valid"], + help: { + "en-US": { + "group": "combobox_popup_reference.html", + "Pass_1.0_expanded": "combobox_popup_reference.html", + "Pass_1.0_collapsed": "combobox_popup_reference.html", + "Pass_1.2_expanded": "combobox_popup_reference.html", + "Pass_1.2_collapsed": "combobox_popup_reference.html", + "Fail_1.0_missing_owns": "combobox_popup_reference.html", + "Fail_1.2_missing_controls": "combobox_popup_reference.html", + "Fail_1.0_popup_reference_missing": "combobox_popup_reference.html", + "Fail_1.2_popup_reference_missing": "combobox_popup_reference.html", + "Fail_combobox_expanded_hidden": "combobox_popup_reference.html", + "Fail_combobox_collapsed_visible": "combobox_popup_reference.html" + } + }, + messages: { + "en-US": { + "group": "The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value", + "Pass_1.0_expanded": "The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible", + "Pass_1.0_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Pass_1.2_expanded": "The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible", + "Pass_1.2_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Fail_1.0_missing_owns": "The 'aria-owns' attribute of the expanded combobox is missing", + "Fail_1.2_missing_controls": "The 'aria-controls' attribute of the expanded combobox is missing", + "Fail_1.0_popup_reference_missing": "The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_1.2_popup_reference_missing": "The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_combobox_expanded_hidden": "The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible", + "Fail_combobox_collapsed_visible": "The combobox 'aria-expanded' attribute is false, but the combobox popup is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "4e8ab6": { + "Pass_1.0_expanded": "fail", + "Pass_1.0_collapsed": "fail", + "Pass_1.2_expanded": "pass", + "Pass_1.2_collapsed": "pass", + "Fail_1.0_missing_owns": "inapplicable", + "Fail_1.2_missing_controls": "fail", + "Fail_1.0_popup_reference_missing": "inapplicable", + "Fail_1.2_popup_reference_missing": "fail", + "Fail_combobox_expanded_hidden": "inapplicable", + "Fail_combobox_collapsed_visible": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var pattern = cachedElem.pattern, expanded = cachedElem.expanded; + var popupId; + var popupElement; + if (pattern === "1.0") { + if (!ruleContext.hasAttribute("aria-owns")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_missing_owns"); + } + popupId = ruleContext.getAttribute("aria-owns"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_popup_reference_missing", [popupId]); + } + } + else if (pattern === "1.2") { + if (!ruleContext.hasAttribute("aria-controls")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_missing_controls"); + } + popupId = ruleContext.getAttribute("aria-controls"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_popup_reference_missing", [popupId]); + } + } + else { + return null; + } + // We have an element, stick it in the cache and then check its role + cachedElem.popupId = popupId; + cachedElem.popupElement = popupElement; + if (expanded && !VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_expanded_hidden"); + } + else if (!expanded && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_collapsed_visible"); + } + if (pattern === "1.0") { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.0_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.0_collapsed"); + } + } + else { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.2_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.2_collapsed"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/debug_paths.ts" +/*!*************************************!*\ + !*** ./src/v4/rules/debug_paths.ts ***! + \*************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.debug_paths = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.debug_paths = { + id: "debug_paths", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["DEBUG"], + num: "1", + level: IRule_1.eRulePolicy.INFORMATION, + toolkitLevel: IRule_1.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + ruleContext.setAttribute("domPath", context["dom"].rolePath); + ruleContext.setAttribute("ariaPath", context["aria"].rolePath); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/detector_tabbable.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/detector_tabbable.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.detector_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.detector_tabbable = { + id: "detector_tabbable", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["EXTENSIONS"], + num: "1", + level: IRule_2.eRulePolicy.INFORMATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return null; + } + var hierContext = contextHierarchies.aria[contextHierarchies.aria.length - 1]; + return (0, IRule_1.RulePass)("Pass_0", [], [{ + name: hierContext.attributes.name, + role: hierContext.role, + tabindex: parseInt(ruleContext.getAttribute("tabindex") || "0") + }]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/dir_attribute_valid.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/dir_attribute_valid.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.dir_attribute_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.dir_attribute_valid = { + id: "dir_attribute_valid", + context: "dom:*[dir]", + refactor: { + "Valerie_Elem_DirValid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "dir_attribute_valid.html", + "Fail_1": "dir_attribute_valid.html", + "group": "dir_attribute_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Invalid value used for the 'dir' attribute", + "group": "'dir' attribute value must be \"ltr\", \"rtl\", or \"auto\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var dirStr = ruleContext.getAttribute("dir").toLowerCase(); + var passed = dirStr == "ltr" || dirStr == "rtl" || dirStr == "auto"; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/download_keyboard_controllable.ts" +/*!********************************************************!*\ + !*** ./src/v4/rules/download_keyboard_controllable.ts ***! + \********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.download_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.download_keyboard_controllable = { + id: "download_keyboard_controllable", + context: "dom:a[href],dom:area[href]", + refactor: { + "HAAC_Media_DocumentTrigger2": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "download_keyboard_controllable.html", + "group": "download_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify that the file download mechanism does not cause a keyboard trap", + "group": "File download mechanisms should be keyboard-operable and preserve page focus location" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var href = ruleContext.getAttribute("href"); + var ext = CommonUtil_1.CommonUtil.getFileExt(href); + var passed = ![".docx", ".doc", ".pdf", ".odt"].includes(ext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/draggable_alternative_exists.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/draggable_alternative_exists.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.draggable_alternative_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.draggable_alternative_exists = { + id: "draggable_alternative_exists", + context: "dom:*[draggable]", + dependencies: [], + help: { + "en-US": { + "group": "draggable_alternative_exists.html", + // "pass_alternative": "draggable_alternative_exists.html", + "pass_undraggable": "draggable_alternative_exists.html", + "potential_alternative": "draggable_alternative_exists.html" + } + }, + messages: { + "en-US": { + "group": "A draggable element must have a \"single pointer\" alternative", + // "pass_alternative": "The draggable element \"{0}\" has a \"single pointer\" alternative", + "pass_undraggable": "The element \"{0}\" is not draggable", + "potential_alternative": "Ensure the draggable element \"{0}\" has a \"single pointer\" alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + //ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + if (ruleContext.getAttribute("draggable") === 'true') + return (0, IRule_1.RulePotential)("potential_alternative", [nodeName]); + else if (ruleContext.getAttribute("draggable") === 'false') + return (0, IRule_1.RulePass)("pass_undraggable", [nodeName]); + else + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_accesskey_labelled.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/element_accesskey_labelled.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.element_accesskey_labelled = { + id: "element_accesskey_labelled", + context: "dom:*[accesskey]", + refactor: { + "HAAC_Accesskey_NeedLabel": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_labelled.html", + "Potential_1": "element_accesskey_labelled.html", + "group": "element_accesskey_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "The element with an assigned 'accesskey' attribute does not have an associated label", + "group": "An element with an assigned 'accesskey' attribute must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip if the element is tabbable, it's covered by other rules + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + //skip the native element, mostly text elements + if (!roles || roles.length === 0) + return; + var patterns = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]]; + if (!patterns || !patterns.nameFrom) + return; + // ignore if accessble name is required (checked in other rules) or prohibited (text element) + if (patterns.nameRequired || !patterns.nameFrom || patterns.nameFrom.includes("prohibited")) + return; + //special case: legend, as a child of a fieldset, delegate the accesskey command to the field of the fieldset which is covered by other rules + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'fieldset') + return; + // check if accessible name exists + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair && pair.name && pair.name.trim().length > 0) + //if (ARIAMapper.computeName(ruleContext).trim().length > 0) + return (0, IRule_1.RulePass)("Pass_0"); + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_accesskey_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/element_accesskey_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.element_accesskey_unique = { + id: "element_accesskey_unique", + context: "dom:*[accesskey]", + refactor: { + "WCAG20_Elem_UniqueAccessKey": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_unique.html", + "Fail_1": "element_accesskey_unique.html", + "group": "element_accesskey_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "'accesskey' attribute value on the element is not unique", + "group": "'accesskey' attribute values on each element must be unique for the page" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var map = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "element_accesskey_unique", {}); + var key = ruleContext.getAttribute("accesskey"); + var passed = !(key in map); + map[key] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_attribute_deprecated.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/element_attribute_deprecated.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DEPRECATED_ELEMENTS = [ + /** original */ + "applet", "basefont", "center", "dir", "font", "isindex", "listing", + "plaintext", "spacer", "s", "strike", "u", "xmp", + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "acronym", "frame", "frameset", "noframes", "noembed", "big", "blink", "marquee", "tt", +]; +var DEPRECATED_HTML_GLOBAL_ATTRIBUTES = [ + /** original */ + "align", "link", "archive", "background", "bgcolor", "clear", "code", "color", + "compact", "face", "hspace", "language", "link", "noshade", "nowrap", "object", + "prompt", "start", "text", "version", "vlink", "vspace" +]; +var DEPRECATED_ELEMENT_ATTRIBUTES = { + /** original */ + "td": ["height", "width", "abbr", "axis", "char", "charoff", "height", "nowrap", "valign", "width", "align", "bgcolor"], + "th": ["height", "width", "abbr", "axis", "charoff", "height", "bgcolor", "align", "nowrap", "char", "valign", "width"], + "li": ["type", "value", "type"], + "ul": ["type", "compact"], + "pre": ["width"], + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "meta": ["http-equiv"], + "a": ["charset", "coords", "shape", "rev", "scheme"], + "link": ["rev", "charset", "target"], + "img": ["name", "longdesc", "align", "hspace", "vspace", "border"], + "area": ["nohref"], + "head": ["profile"], + "html": ["version"], + "iframe": ["longdesc", "align", "frameborder", "marginheight", "marginwidth", "scrolling"], + "object": ["archive", "code", "codebase", "codetype", "declare", "standby", "align", "hspace", "vspace", "border"], + "param": ["type", "valuetype"], + "script": ["language"], + "body": ["alink", "background", "bgcolor", "link", "text", "vlink"], + "br": ["clear"], + "caption": ["align"], + "col": ["align", "char", "charoff", "valign", "width"], + "div": ["align"], + "dl": ["compact"], + "hr": ["align", "noshade", "size", "width", "align"], + "h2": ["align"], + "h3": ["align"], + "h4": ["align"], + "h5": ["align"], + "h6": ["align"], + "input": ["align", "usemap"], + "legend": ["align"], + "menu": ["compact"], + "ol": ["compact", "type", "type"], + "p": ["align"], + "table": ["bgcolor", "cellpadding", "cellspacing", "frame", "rules", "width", "align"], + "tbody": ["align", "char", "valign", "charoff"], + "tfoot": ["align", "charoff", "char", "valign"], + "thead": ["char", "charoff", "valign", "align"], + "tr": ["align", "bgcolor", "char", "charoff", "valign"] +}; +function arrayToContextStr(obj, type) { + var str = ""; + for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) { + var prop = obj_1[_i]; + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENTS') + str += 'dom:' + prop; + else if (type === 'HTML_ATTRIBUTES') + str += 'dom:*[' + prop + "]"; + } + return str; +} +function objToContextStr(obj, type) { + var str = ""; + for (var prop in obj) { + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENT_ATTRIBUTES') { + for (var _i = 0, _a = obj[prop]; _i < _a.length; _i++) { + var item = _a[_i]; + if (str !== '' && !str.endsWith(", ")) + str += ", "; + str += 'dom:' + prop + '[' + item + ']'; + } + } + } + return str; +} +exports.element_attribute_deprecated = { + id: "element_attribute_deprecated", + context: "dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]", + help: { + "en-US": { + "pass": "element_attribute_deprecated.html", + "fail_elem": "element_attribute_deprecated.html", + "fail_attr": "element_attribute_deprecated.html", + "fail_elem_attr": "element_attribute_deprecated.html", + "group": "element_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_elem": "The <{0}> element is deprecated in HTML 5", + "fail_attr": "The HTML attribute(s) \"{0}\" is deprecated in HTML 5", + "fail_elem_attr": "The HTML attribute(s) \"{0}\" is deprecated for the <{1}> element in HTML 5", + "group": "Avoid use of obsolete features if possible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // HTMLUnit auto adds a tbody[align=left] to tables if tbody is missing! + if (ruleContext.nodeName.toLowerCase() === "tbody" && ruleContext.hasAttribute("align")) { + return (0, IRule_1.RulePass)("pass"); + } + if (ruleContext.nodeName.includes("-")) { + // This is a webcomponent element, HTML doesn't define what's deprecated + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + var ret = []; + // check if it's a deprecated element + if (DEPRECATED_ELEMENTS.includes(nodeName)) { + return (0, IRule_1.RuleFail)("fail_elem", [nodeName]); + } + // check if it's a deprecated HTML global attribute + var attrs = ruleContext.getAttributeNames(); + var violations = ''; + for (var _i = 0, attrs_1 = attrs; _i < attrs_1.length; _i++) { + var attr = attrs_1[_i]; + if (DEPRECATED_HTML_GLOBAL_ATTRIBUTES.includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_attr", [violations]); + } + // check if it's a deprecated HTML element & attribute + violations = ''; + if (nodeName in DEPRECATED_ELEMENT_ATTRIBUTES) { + for (var _a = 0, attrs_2 = attrs; _a < attrs_2.length; _a++) { + var attr = attrs_2[_a]; + if (DEPRECATED_ELEMENT_ATTRIBUTES[nodeName] && DEPRECATED_ELEMENT_ATTRIBUTES[nodeName].includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_elem_attr", [violations, nodeName]); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_id_unique.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/element_id_unique.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.element_id_unique = { + id: "element_id_unique", + context: "dom:*[id]", + refactor: { + "RPT_Elem_UniqueId": { + "Pass_0": "pass", + "Fail_1": "potential_empty", + "Fail_2": "potential_in_use" + } + }, + help: { + "en-US": { + "group": "element_id_unique.html", + "pass": "element_id_unique.html", + "potential_empty": "element_id_unique.html", + "potential_in_use": "element_id_unique.html" + } + }, + messages: { + "en-US": { + "group": "Element 'id' attribute values must be unique within a document", + "pass": "Rule Passed", + "potential_empty": "The <{0}> element has the id \"{1}\" that is empty", + "potential_in_use": "The <{0}> element has the id \"{1}\" that is already in use" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "3ea0c8": { + "pass": "pass", + "potential_empty": "pass", + "potential_in_use": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("id"); + // In the case that id is empty we should trigger a violation right away with out checking + // for uniqueness. + if (id === "") { + //return new ValidationResult(false, [ruleContext], '', '', [ruleContext.nodeName.toLowerCase(), id]); + return (0, IRule_1.RulePotential)("potential_empty", [ruleContext.nodeName.toLowerCase(), id]); + } + var element = fragment_1.FragmentUtil.getById(ruleContext, id); + var passed = element === ruleContext; + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [ruleContext.nodeName.toLowerCase(), id]); + if (!passed) { + return (0, IRule_1.RulePotential)("potential_in_use", [ruleContext.nodeName.toLowerCase(), id]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_lang_valid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/element_lang_valid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_lang_valid = exports.html_lang_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var validateLang = function (context) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (ruleContext.hasAttribute("lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 1; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 2; + } + } + } + if (ruleContext.hasAttribute("xml:lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("xml:lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("xml:lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 3; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 4; + } + } + } + return 0; +}; +exports.html_lang_valid = { + id: "html_lang_valid", + context: "dom:html[lang], dom:html[xml:lang]", + help: { + "en-US": { + "Pass_0": "html_lang_valid.html", + "Fail_1": "html_lang_valid.html", + "Fail_2": "html_lang_valid.html", + "Fail_3": "html_lang_valid.html", + "Fail_4": "html_lang_valid.html", + "group": "html_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The default human language of the page must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + }, + "bf051a": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "fail", + "Fail_4": "inapplicable" + }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + // "de46e4": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // } + }], + run: function (context, options, contextHierarchies) { + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + return retArr[reasonCode]; + } +}; +exports.element_lang_valid = { + id: "element_lang_valid", + context: "dom:*[lang], dom:*[xml:lang]", + help: { + "en-US": { + "Pass_0": "element_lang_valid.html", + "Fail_1": "element_lang_valid.html", + "Fail_2": "element_lang_valid.html", + "Fail_3": "element_lang_valid.html", + "Fail_4": "element_lang_valid.html", + "group": "element_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The change in language of specific content must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + // "b5c3f8": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "inapplicable", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // }, + // "bf051a": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "fail", + // "Fail_4": "inapplicable" + // }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + "de46e4": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // If it's the HTML node, that's handled by html_lang_valid + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "html") + return null; + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + var retVal = retArr[reasonCode]; + if (retVal.value[1] !== IRule_1.eRuleConfidence.PASS) { + // Ensure that there's actually content of this element - skip subtrees that have other lang attributes + var hasContent = false; + if (ruleContext.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(ruleContext, false, ruleContext, true); + while (!hasContent && nw.nextNode()) { + // Skip hidden + if (nw.node.nodeType === 1) { + var element = nw.node; + if (!VisUtil_1.VisUtil.isNodeVisible(element) || element.hasAttribute("lang")) { + nw.bEndTag = true; + } + else { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(element); + hasContent = hasContent + || element.nodeName.toLowerCase() === "img" && (pair && pair.name && pair.name.trim().length > 0) /**ARIAMapper.computeName(element).trim().length > 0*/; + } + } + else { + hasContent = hasContent + || nw.node.nodeType === 3 && nw.node.nodeValue.trim().length > 0; + } + } + } + if (!hasContent) + return null; + } + return retVal; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_mouseevent_keyboard.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_mouseevent_keyboard.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_mouseevent_keyboard = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.element_mouseevent_keyboard = { + id: "element_mouseevent_keyboard", + context: "dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]", + refactor: { + "RPT_Elem_EventMouseAndKey": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_mouseevent_keyboard.html", + "Manual_1": "element_mouseevent_keyboard.html", + "group": "element_mouseevent_keyboard.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)", + "group": "All interactive content with mouse event handlers must have equivalent keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = ruleContext.hasAttribute("href") || + (!ruleContext.hasAttribute("ondblclick") && + !ruleContext.hasAttribute("onmousemove") && + (!ruleContext.hasAttribute("onmousedown") || ruleContext.hasAttribute("onkeydown")) && + (!ruleContext.hasAttribute("onmouseup") || ruleContext.hasAttribute("onkeyup")) && + (!ruleContext.hasAttribute("onmouseover") || ruleContext.hasAttribute("onfocus")) && + (!ruleContext.hasAttribute("onmouseout") || ruleContext.hasAttribute("onblur")) && + (!ruleContext.hasAttribute("onclick") || ruleContext.hasAttribute("onkeypress") || + nodeName == "a" || nodeName == "button")); + var failedMouseEvents = new Array(); + if (!passed) { + //store and display event name and node name in the tokens + if (ruleContext.hasAttribute("ondblclick")) { + failedMouseEvents.push("ondblclick"); + } + if (ruleContext.hasAttribute("onmousemove")) { + failedMouseEvents.push("onmousemove"); + } + if (ruleContext.hasAttribute("onmousedown") && !ruleContext.hasAttribute("onkeydown")) { + failedMouseEvents.push("onmousedown"); + } + if (ruleContext.hasAttribute("onmouseup") && !ruleContext.hasAttribute("onkeyup")) { + failedMouseEvents.push("onmouseup"); + } + if (ruleContext.hasAttribute("onmouseover") && !ruleContext.hasAttribute("onfocus")) { + failedMouseEvents.push("onmouseover"); + } + if (ruleContext.hasAttribute("onmouseout") && !ruleContext.hasAttribute("onblur")) { + failedMouseEvents.push("onmouseout"); + } + if (ruleContext.hasAttribute("onclick") && !ruleContext.hasAttribute("onkeypress")) { + if (!(nodeName == "a" || nodeName == "button")) + failedMouseEvents.push("onclick"); + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1", [nodeName, failedMouseEvents.join(", ")]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_orientation_unlocked.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/element_orientation_unlocked.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_orientation_unlocked = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.element_orientation_unlocked = { + id: "element_orientation_unlocked", + context: "dom:*", + help: { + "en-US": { + "pass": "element_orientation_unlocked.html", + "fail_locked": "element_orientation_unlocked.html", + "group": "element_orientation_unlocked.html" + } + }, + messages: { + "en-US": { + "pass": "The element is not restricted to either landscape or portrait orientation using CSS transform property", + "fail_locked": "The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property", + "group": "Elements should not be restricted to either landscape or portrait orientation using CSS transform property" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ['b33eff'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip invisible element + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "meta", "title"])) + return null; + // Skip elements that have no meaningful visible content (no text, no img with alt). + // Orientation lock on a purely decorative or empty element is not a WCAG violation + // because there is no content whose orientation matters to the user. + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // cache the orientation result for all the elements in the page + var doc = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var orientationTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", null); + if (!orientationTransforms) { + orientationTransforms = CSSUtil_1.CSSUtil.getMediaOrientationTransform(doc); + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", orientationTransforms); + } + // find if the element matches orientation selector(s) + var media_transforms = []; + Object.keys(orientationTransforms).forEach(function (key) { + Object.keys(orientationTransforms[key]).forEach(function (tag) { + if (Object.keys(orientationTransforms[key][tag]).length > 0 && CSSUtil_1.CSSUtil.selectorMatchesElem(ruleContext, tag)) { + if (orientationTransforms[key][tag].transform) + media_transforms.push(orientationTransforms[key][tag].transform); + else + media_transforms.push(orientationTransforms[key][tag]); + } + }); + }); + // no match, the element is not in media orientation transform + if (media_transforms.length === 0) + return null; + var ret = []; + var _loop_1 = function (i) { + var media_transform = media_transforms[i]; + if (typeof media_transform === 'object') + for (var key in media_transform) + media_transform = key + "(" + media_transform[key] + ")"; + var containsRotation = false; + ['rotate', 'rotate3d', 'rotateZ', 'matrix', 'matrix3d'].forEach(function (rotation) { + if (media_transform.includes(rotation)) + containsRotation = true; + }); + // no rotation transform, skip + if (!containsRotation) + return "continue"; + var degree = CSSUtil_1.CSSUtil.getRotationDegree(media_transform); + // no or 360n degree rotation + if (degree === 0) { + ret.push((0, IRule_1.RulePass)("pass")); + return "continue"; + } + /** + * calculate the original page rotation transformation, example + * html { transform: rotate(2.5deg); } + */ + var definedStyle = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["transform"]); + /** + * compensate the media orientation with the page orientation + */ + if (definedStyle['transform']) { + var page_degree = CSSUtil_1.CSSUtil.getRotationDegree(definedStyle['transform']); + // rotate is additive + degree += page_degree; + } + // 180° rotation is a vertical flip — it does not swap portrait and landscape, + // so it does not lock orientation in the WCAG 1.3.4 sense. + // 360° (full turn) is also not a lock (already normalised to 0 above). + // Allow 1° floating-point tolerance around both 0° and 180°. + var normalised = degree % 180; + if (normalised <= 1 || normalised >= 179) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_locked", [nodeName])); + }; + for (var i = 0; i < media_transforms.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_scrollable_tabbable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_scrollable_tabbable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_scrollable_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.element_scrollable_tabbable = { + id: "element_scrollable_tabbable", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_scrollable_tabbable.html", + "pass_tabbable": "element_scrollable_tabbable.html", + "pass_interactive": "element_scrollable_tabbable.html", + "fail_scrollable": "element_scrollable_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Scrollable elements should be tabbable or contain tabbable content", + "pass_tabbable": "The scrollable element is tabbable", + "pass_interactive": "The scrollable element has tabbable content", + "fail_scrollable": "The scrollable element <{0}> with non-interactive content is not tabbable" + } + }, + /** + * deprecated on 6/10/2025 due to Browser support for auto-focus of a scrollable element + * rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: eRulePolicy.VIOLATION, + toolkitLevel: eToolkitLevel.LEVEL_ONE + }],*/ + rulesets: [], + act: ["0ssw9k"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["iframe", "svg", "script", "meta", "style"])) + return null; + //skip if no visible content + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + // ignore if the element's navigation is controlled or owned by another element + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is not scrollable or content withouting needing a scroll + if (!VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // pass if element is tabbable + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RulePass)("pass_tabbable"); + // check if element content is tabbable + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RulePass)("pass_interactive"); + // ignore in Firefox if no tabindex at all (not tested in embedded or any simulator) + if (!ruleContext.hasAttribute("tabindex") && navigator.userAgent.indexOf("Firefox") > -1) + return null; + return (0, IRule_1.RuleFail)("fail_scrollable", [ruleContext.nodeName.toLowerCase()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_role_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_role_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.element_tabbable_role_valid = { + id: "element_tabbable_role_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "element_tabbable_role_valid.html", + "fail_invalid_role": "element_tabbable_role_valid.html", + "fail_no_valid_role": "element_tabbable_role_valid.html", + "group": "element_tabbable_role_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The tabbable element has a widget role", + "fail_invalid_role": "The tabbable element's role '{0}' is not a widget role", + "fail_no_valid_role": "The tabbable element does not have a valid widget role", + "group": "A tabbable element must have a valid widget role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // if the element is tabbable by default with or without tabindex, let the other rules (such as widget_tabbable_single) to handle it + if (nodeName in CommonUtil_1.CommonUtil.tabTagMap) { + var value = CommonUtil_1.CommonUtil.tabTagMap[nodeName]; + if (typeof (value) === "function") { + value = value(ruleContext); + } + if (value) + return null; + } + // handle the case: no tabindex or tabindex < 0 + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) < 0) + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is scrollable + if (VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // elements whose roles allow no descendants that are interactive or with a tabindex >= 0 + // this case should be handled in widget_tabbable_single and aria_child_tabbable + var roles_no_interactive_child = ["button", "checkbox", "img", "link", "menuitem", "menuitemcheckbox", "menuitemradio", + "option", "radio", "switch", "tab"]; + var parent = DOMWalker_1.DOMWalker.parentNode(ruleContext); + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent); + // ignore if the parent role is in roles_no_interactive_child + if (roles_no_interactive_child.includes(parent_role)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return (0, IRule_1.RuleFail)("fail_no_valid_role"); + // ignore 'application' role that contains one or more focusable elements that do not follow a standard interaction pattern supported by a widget role:https://www.w3.org/TR/2023/PR-WAI-ARIA-1.2-20230328/#application + if (role === "application") + return null; + // handle the case: tabindex >= 0 to examine whether a widget role is setup or not + // pass if one of the roles is a widget type + // Row is weird. It's structure, but can also be widget + // Focusable separators are widgets + if (role === "row" || role === "separator" || ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return (0, IRule_1.RulePass)("pass"); + } + return (0, IRule_1.RuleFail)("fail_invalid_role", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_unobscured.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_unobscured.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_unobscured = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +exports.element_tabbable_unobscured = { + id: "element_tabbable_unobscured", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_unobscured.html", + "pass": "element_tabbable_unobscured.html", + "potential_obscured": "element_tabbable_unobscured.html" + } + }, + messages: { + "en-US": { + "group": "When an element receives focus, it is not entirely covered by other content", + "pass": "The element is not entirely covered by other content", + "potential_obscured": "Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.4.11"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Early exit: check visibility and tabbability first + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // Early exit: ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return null; + var win = doc.defaultView; + if (!win) + return null; + // Reuse single DOMMapper instance + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + // Early exit: bounds not available or element has no dimensions + if (!bounds || bounds.height === 0 || bounds.width === 0) + return null; + var cStyle = win.getComputedStyle(ruleContext); + if (!cStyle) + return null; + // Parse z-index once and cache + var zindex = parseInt(cStyle.zIndex === 'auto' || !cStyle.zIndex ? '0' : cStyle.zIndex); + // More specific selector to reduce iteration + var elems = doc.querySelectorAll('body *:not(script):not(style):not(meta):not(link)'); + if (!elems || elems.length === 0) + return null; + var before = true; + var boundsRight = bounds.left + bounds.width; + var boundsBottom = bounds.top + bounds.height; + // Check for obscuring elements + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + /** + * The nodes returned from querySelectorAll are in document order. + * If two elements overlap and z-index are not defined, then the node + * rendered earlier will be overlaid by the node rendered later. + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + // The next node in elems will be after the target node (ruleContext) + before = false; + continue; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // Skip if element contains ruleContext or is not visible + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || !VisUtil_1.VisUtil.isNodeVisible(elem)) + continue; + var bnds = mapper.getUnadjustedBounds(elem); + // Skip if no bounds or zero dimensions + if (!bnds || bnds.height === 0 || bnds.width === 0) + continue; + // Quick bounds check: does elem completely cover ruleContext? + if (bnds.top > bounds.top || bnds.left > bounds.left) + continue; + var bndsRight = bnds.left + bnds.width; + var bndsBottom = bnds.top + bnds.height; + if (bndsRight < boundsRight || bndsBottom < boundsBottom) + continue; + // Check z-index to determine if elem obscures ruleContext + var zStyle = win.getComputedStyle(elem); + if (!zStyle) + continue; + var elemZindex = parseInt(zStyle.zIndex === 'auto' || !zStyle.zIndex || isNaN(Number(zStyle.zIndex)) ? '0' : zStyle.zIndex); + // If before ruleContext in DOM order, elem must have higher z-index to obscure + // If after ruleContext in DOM order, elem can obscure with equal or higher z-index + if ((before && elemZindex > zindex) || (!before && elemZindex >= zindex)) { + // Check if element has opaque background + var hasOpaqueBackground = false; + if (zStyle.background && zStyle.background !== 'none') { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.background); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + if (!hasOpaqueBackground && zStyle.backgroundColor) { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.backgroundColor); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + // If element has no content and no opaque background, skip it + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(elem) && !hasOpaqueBackground) { + continue; + } + return (0, IRule_1.RulePotential)("potential_obscured", []); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_visible.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/element_tabbable_visible.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.element_tabbable_visible = { + id: "element_tabbable_visible", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_visible.html", + "pass": "element_tabbable_visible.html", + "potential_visible": "element_tabbable_visible.html" + } + }, + messages: { + "en-US": { + "group": "A tabbable element should be visible on the screen when it has keyboard focus", + "pass": "The tabbable element is visible on the screen", + "potential_visible": "Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.4.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // Get all needed styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, ["position", "clip"], ["", ":focus"]); + var defined_styles = allStyles[""]; + var onfocus_styles = allStyles[":focus"]; + if (bounds['height'] === 0 || bounds['width'] === 0) + return (0, IRule_1.RulePotential)("potential_visible", []); + if (defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)' + && !onfocus_styles['clip']) { + /** + * note that A user can select a checkbox and radio button by selecting the button or the label text. + * When a checkbox or radio button is clipped to 0 size, it is still available to a keyboard or a screen reader. + * The rule should be passed if the label text exists and the button on-focus style is defined by the user, + * which likely incurs the changes of the label style. + */ + if (nodeName === 'input' && (ruleContext.getAttribute('type') === 'checkbox' || ruleContext.getAttribute('type') === 'radio')) { + var label = CommonUtil_1.CommonUtil.getLabelForElement(ruleContext); + if (label && !CommonUtil_1.CommonUtil.isInnerTextEmpty(label)) { + // Get additional pseudo-class styles (reuse onfocus_styles from line 60) + var pseudoStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, [":focus-visible", ":focus-within", ":checked", ":focus"]); + var focus_visible_styles = pseudoStyles[":focus-visible"]; + var focus_within_styles = pseudoStyles[":focus-within"]; + var checked_styles = pseudoStyles[":checked"]; + var onfocus_styles_1 = pseudoStyles[":focus"]; + if (onfocus_styles_1 || focus_visible_styles || focus_within_styles || checked_styles) + return (0, IRule_1.RulePass)("pass"); + } + } + return (0, IRule_1.RulePotential)("potential_visible", []); + } + if (bounds['top'] >= 0 && bounds['left'] >= 0) + return (0, IRule_1.RulePass)("pass"); + var default_styles = getComputedStyle(ruleContext); + var top = bounds['top']; + var left = bounds['left']; + if (Object.keys(onfocus_styles).length === 0) { + // no onfocus position change, but could be changed from js + return (0, IRule_1.RulePotential)("potential_visible", []); + } + else { + // with onfocus position change + var positions = ['absolute', 'fixed']; + if (typeof onfocus_styles['top'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + top = onfocus_styles['top'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + top = Number.MIN_VALUE; + } + } + if (typeof onfocus_styles['left'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + left = onfocus_styles['left'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + left = Number.MIN_VALUE; + } + } + } + if (top >= 0 && left >= 0) + return (0, IRule_1.RulePass)("pass"); + else + return (0, IRule_1.RulePotential)("potential_visible", []); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/embed_alt_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/embed_alt_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.embed_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.embed_alt_exists = { + id: "embed_alt_exists", + context: "dom:embed", + refactor: { + "RPT_Embed_HasAlt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "embed_alt_exists.html", + "Potential_1": "embed_alt_exists.html", + "group": "embed_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the <embed> element has alternative content", + "group": "Provide alternative content for <embed> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt"); + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/emoticons_alt_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/emoticons_alt_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.emoticons_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.emoticons_alt_exists = { + id: "emoticons_alt_exists", + context: "dom:*", + refactor: { + "WCAG20_Text_Emoticons": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "emoticons_alt_exists.html", + "Potential_1": "emoticons_alt_exists.html", + "group": "emoticons_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that emoticons have a text alternative", + "group": "Emoticons must have a short text alternative that describes their purpose" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_TWO + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + emoticons: { + value: [":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":D", "C:", + ":-D", ":D", "8D", "XD", "=D", "=3", "<=3", "<=8", "--!--", ":-(", ":(", ":c", ":<", ":[", + "D:", "D8", "D;", "D=", "DX", "v.v", ":-9", ";-)", ";)", "*)", ";]", ";D", ":-P", ":P", + ":-p", ":p", "=p", ":-Þ", ":Þ", ":-b", ":b", ":-O", ":O", "O_O", "o_o", "8O", "OwO", "O-O", + "0_o", "O_o", "O3O", "o0o ;o_o;", "o...o", "0w0", ":-/", ":/", ":\\", "=/", "=\\", ":S", ":|", + "d:-)", "qB-)", ":)~", ":-)>....", ":-X", ":X", ":-#", ":#", "O:-)", "0:3", "O:)", ":'(", ";*(", + "T_T", "TT_TT", "T.T", ":-*", ":*", "^o)", ">:)", ">;)", ">:-)", "B)", "B-)", "8)", "8-)", + "^>.>^", "^<.<^", "^>_>^", "^<_<^", "D:<", ">:(", "D-:<", ">:-(", ":-@[1]", ";(", "`_´", "D<", + "<3", "<333", "=^_^=", "=>.>=", "=<_<=", "=>.<=", "\\,,/", "\\m/", "\\m/\\>.</\\m/", "\\o/", "\\o o/", + "o/\\o", ":&", ":u" + ], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + var emoticons = validateParams.emoticons.value; + var passed = true; + var testText = ""; + var walkNode = ruleContext.firstChild; + while (walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + testText += " " + walkNode.nodeValue; + } + walkNode = walkNode.nextSibling; + } + if (testText.trim().length > 0) { + for (var j = 0; passed && j < emoticons.length; ++j) { + var emotIdx = testText.indexOf(emoticons[j]); + var eLngth = emoticons[j].length; + while (passed && emotIdx != -1) { + // Passes if: the emoticon is not preceded by whitespace, + // or the emoticon is not followed by whitespace unless it's punctuation, + // or it's in a pre, code, or script + passed = + (emotIdx > 0 && !/\s/.test(testText.substring(emotIdx - 1, emotIdx))) || + (emotIdx < testText.length - eLngth && !/\s/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)) && + !/[.,!'"?]/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1))); + // Allow usage of (: stuff :) since this is a comment in some languages + passed = passed || ((emoticons[j] == ":)" || emoticons[j] == "(:") && /\(\:.*\:\)/.test(testText)); + passed = passed || ((emoticons[j] == ";)" || emoticons[j] == "(;") && /\(\;.*\;\)/.test(testText)); + emotIdx = testText.indexOf(emoticons[j], emotIdx + 1); + } + } + } + if (!passed) { + // Don't trigger if we're not in the body or if we're in a script, pre, code + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "body"]); + passed = checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body"; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/error_message_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/error_message_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.error_message_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.error_message_exists = { + id: "error_message_exists", + context: "dom:*[aria-invalid=true]", + refactor: { + "HAAC_Aria_ErrorMessage": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "error_message_exists.html", + "Fail_1": "error_message_exists.html", + "Fail_2": "error_message_exists.html", + "group": "error_message_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Custom error message has invalid reference 'id' value", + "Fail_2": "Custom error message is not visible", + "group": "A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aria_errMsgId = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-errormessage"); + // If aria-errormessage is not provided, then OUT_OF_SCOPE + if (!aria_errMsgId) { + return null; + } + var msg_ele = fragment_1.FragmentUtil.getById(ruleContext, aria_errMsgId); + // POF0: Invalid id reference + if (!msg_ele) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + // POF1: Referenced element is not visible + if (!VisUtil_1.VisUtil.isNodeVisible(msg_ele)) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/fieldset_label_valid.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/fieldset_label_valid.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_label_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.fieldset_label_valid = { + id: "fieldset_label_valid", + context: "aria:group", + refactor: { + "group_withInputs_hasName": { + "Pass_1": "Pass_1", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_1": "fieldset_label_valid.html", + "Fail_1": "fieldset_label_valid.html", + "Fail_2": "fieldset_label_valid.html", + "group": "fieldset_label_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1": "Group/Fieldset \"{0}\" with an input has a unique name", + "Fail_1": "Group/Fieldset does not have an accessible name", + "Fail_2": "Group/Fieldset \"{0}\" has a duplicate name to another group", + "group": "Groups with nested inputs must have unique accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "landmark_group_input", null); + if (!formCache) { + formCache = { + groupsWithInputs: [], + groupsWithInputsComputedLabels: [], + }; + var allGroupsTemp = ownerDocument.querySelectorAll('fieldset,[role="group"]'); + var allGroups = Array.from(allGroupsTemp); + var groupsWithInputs = []; + for (var i = 0; i < allGroups.length; i++) { + // Loop over all the group nodes + if (allGroups[i].querySelector("input")) { + groupsWithInputs.push(allGroups[i]); + } + } + var groupsWithInputsComputedLabels = []; + for (var i = 0; i < groupsWithInputs.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(groupsWithInputs[i]); + // Loop over all the landmark nodes + groupsWithInputsComputedLabels.push( + /**ARIAMapper.computeName(groupsWithInputs[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + formCache.groupsWithInputs = groupsWithInputs; + formCache.groupsWithInputsComputedLabels = + groupsWithInputsComputedLabels; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "landmark_group_input", formCache); + } + // formCache.groupsWithInputs.forEach(element => { + // console.log("formCache.groupsWithInputs: " +element.id) + // }); + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels) + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels.length) + var ruleContextFoundIngroupsWithInputsFlag = false; + var computedName = ""; + if (!formCache.groupsWithInputs) { + // We do not have any groups with inputs. Therefore we should skip this rule trigger. + return null; + } + for (var i = 0; i < formCache.groupsWithInputs.length; i++) { + if (ruleContext.isSameNode(formCache.groupsWithInputs[i])) { + // We have found our ruleContext in the cache + ruleContextFoundIngroupsWithInputsFlag = true; + if (formCache.groupsWithInputsComputedLabels[i] === "" || + formCache.groupsWithInputsComputedLabels[i] === null) { + // console.log("Fail_1") + return (0, IRule_1.RuleFail)("Fail_1"); + } + var foundSameNameFlag = false; + for (var j = 0; j < formCache.groupsWithInputsComputedLabels.length; j++) { + if (i == j) { + continue; + } // We do not want to compare against ourselfs + if (formCache.groupsWithInputsComputedLabels[i] === + formCache.groupsWithInputsComputedLabels[j]) { + foundSameNameFlag = true; + } + } + if (foundSameNameFlag) { + // console.log("Fail_2") + return (0, IRule_1.RuleFail)("Fail_2", [ + formCache.groupsWithInputsComputedLabels[i], + ]); + } + computedName = formCache.groupsWithInputsComputedLabels[i]; + } + } + if (!ruleContextFoundIngroupsWithInputsFlag) { + // console.log("null return") + return null; + } + // console.log("Pass_1") + return (0, IRule_1.RulePass)("Pass_1", [computedName]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/fieldset_legend_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/fieldset_legend_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_legend_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.fieldset_legend_valid = { + id: "fieldset_legend_valid", + context: "dom:fieldset", + refactor: { + "WCAG20_Fieldset_HasLegend": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "fieldset_legend_valid.html", + "Fail_1": "fieldset_legend_valid.html", + "Fail_2": "fieldset_legend_valid.html", + "Fail_3": "fieldset_legend_valid.html", + "group": "fieldset_legend_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<fieldset> element does not have a <legend>", + "Fail_2": "<fieldset> element has more than one <legend>", + "Fail_3": "<fieldset> element <legend> is empty", + "group": " <fieldset> elements should have a single, non-empty <legend> as a label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // In the case a legend is hidden, we should still trigger a violations for this + var legends = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "legend", true, false); + if (legends.length === 0) { + // Fieldset has NO Legend + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (legends.length > 1) { + // Fieldset has more than one legend + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (CommonUtil_1.CommonUtil.getInnerText(legends[0]).trim().length === 0) { + // Fieldset has legend but legend is empty + return (0, IRule_1.RuleFail)("Fail_3"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/figure_label_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/figure_label_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.figure_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.figure_label_exists = { + id: "figure_label_exists", + context: "dom:figure", + refactor: { + "HAAC_Figure_label": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "figure_label_exists.html", + "Fail_1": "figure_label_exists.html", + "group": "figure_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <figure> element does not have an associated label", + "group": "A <figure> element must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + //let passed = AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", []); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_font_color.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/form_font_color.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_font_color = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_font_color = { + id: "form_font_color", + context: "dom:form", + refactor: { + "RPT_Font_ColorInForm": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_font_color.html", + "Potential_1": "form_font_color.html", + "group": "form_font_color.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Check color is not used as the only visual means to convey which fields are required", + "group": "Combine color and descriptive markup to indicate required form fields" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var fonts = ruleContext.getElementsByTagName("font"); + if (fonts != null) { + for (var i = 0; i < fonts.length; ++i) { + passed = !fonts[i].hasAttribute("color"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_interaction_review.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/form_interaction_review.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_interaction_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.form_interaction_review = { + id: "form_interaction_review", + context: "dom:form[target]", + refactor: { + "WCAG20_Form_TargetAndText": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_interaction_review.html", + "Potential_1": "form_interaction_review.html", + "group": "form_interaction_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that interacting with content will not open pop-up windows or change the active window without informing the user", + "group": "User should be informed in advance when interacting with content causes a change of context" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramWinText: { + value: ["new window"], + type: "array" + } + }; + var ruleContext = context["dom"].node; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr === "_parent" || tStr === "_self" || tStr === "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + for (var i = 0; !passed && i < validateParams.paramWinText.value.length; ++i) + if (textStr.indexOf(validateParams.paramWinText.value[i]) != -1) + passed = true; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_label_unique.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/form_label_unique.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.form_label_unique = { + id: "form_label_unique", + context: "dom:label[for]", + refactor: { + "RPT_Label_UniqueFor": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_label_unique.html", + "Fail_1": "form_label_unique.html", + "group": "form_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control has more than one label", + "group": "Form controls should have exactly one label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + var labelIds = CacheUtil_1.CacheUtil.getCache(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "RPT_Label_Single", {}); + var id = ruleContext.getAttribute("for"); + var passed = !(id in labelIds); + labelIds[id] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_submit_button_exists.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/form_submit_button_exists.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_button_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.form_submit_button_exists = { + id: "form_submit_button_exists", + context: "dom:form", + refactor: { + "WCAG20_Form_HasSubmit": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_button_exists.html", + "Potential_1": "form_submit_button_exists.html", + "group": "form_submit_button_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the <form> element has a submit button or an image button", + "group": "A <form> element should have a submit button or an image button" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + if (ruleContext.firstChild) { + // submit buttons are usually at the bottom - walk backwards + var nw = new DOMWalker_1.DOMWalker(ruleContext, true); + while (!passed && nw.prevNode() && nw.node != ruleContext) { + if (!nw.bEndTag) { + var nodeName = nw.node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = nw.elem().getAttribute("type"); + if (type) { + type = type.toLowerCase(); + } + passed = type === "submit" || type === "image"; + } + else if (nodeName === "button") { + passed = nw.elem().hasAttribute("type") && nw.elem().getAttribute("type").toLowerCase() === "submit"; + } + else if (nw.node.nodeType === 1) { + passed = AriaUtil_1.AriaUtil.hasRole(nw.node, "button"); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_submit_review.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/form_submit_review.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_submit_review = { + id: "form_submit_review", + context: "dom:select[onchange], dom:input[onchange]", + refactor: { + "RPT_Form_ChangeEmpty": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_review.html", + "Potential_1": "form_submit_review.html", + "group": "form_submit_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Confirm the form does not submit automatically without warning", + "group": "A form should not be submitted automatically without warning the user" + } + }, + /** + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + //deprecate the rule on Jun 10, 2024 + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onchange").trim().length === 0; + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/frame_src_valid.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/frame_src_valid.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_src_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.frame_src_valid = { + id: "frame_src_valid", + context: "dom:frame, dom:iframe", + refactor: { + "Valerie_Frame_SrcHtml": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "frame_src_valid.html", + "Potential_1": "frame_src_valid.html", + "group": "frame_src_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify <frame> content is accessible", + "group": "A <frame> containing non-HTML content must be made accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "src") && + CommonUtil_1.CommonUtil.isHtmlExt(CommonUtil_1.CommonUtil.getFileExt(ruleContext.getAttribute("src"))); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/frame_title_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/frame_title_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.frame_title_exists = { + id: "frame_title_exists", + context: "dom:frame, dom:iframe", + refactor: { + "WCAG20_Frame_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "frame_title_exists.html", + "Pass_0": "frame_title_exists.html", + "Fail_1": "frame_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "Inline frames must have a unique, non-empty 'title' attribute", + "Pass_0": "Rule Passed", + "Fail_1": "Inline frame does not have a 'title' attribute", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: "cae760", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) { + //if (CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/heading_content_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/heading_content_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_content_exists = { + id: "heading_content_exists", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + refactor: { + "RPT_Header_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_content_exists.html", + "Fail_1": "heading_content_exists.html", + "group": "heading_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Heading element has descriptive text", + "Fail_1": "Heading element has no descriptive content", + "group": "Heading elements must provide descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.6"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/heading_markup_misuse.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/heading_markup_misuse.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_markup_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_markup_misuse = { + id: "heading_markup_misuse", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + dependencies: ["heading_content_exists"], + refactor: { + "RPT_Headers_FewWords": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_markup_misuse.html", + "Potential_1": "heading_markup_misuse.html", + "group": "heading_markup_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the heading element is a genuine heading", + "group": "Heading elements must not be used for presentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + headingLengthThresh: { + value: 20, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + var headingLengthThresh = validateParams.headingLengthThresh.value; + var passed = CommonUtil_1.CommonUtil.wordCount(CommonUtil_1.CommonUtil.getInnerText(ruleContext)) <= headingLengthThresh; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/html_lang_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/html_lang_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_lang_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +exports.html_lang_exists = { + id: "html_lang_exists", + context: "dom:html", + refactor: { + "WCAG20_Html_HasLang": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3", + "Fail_4": "Fail_4", + "Fail_5": "Fail_5", + "Potential_5": "Potential_5", + "Potential_6": "Potential_6" + } + }, + help: { + "en-US": { + "group": "html_lang_exists.html", + "Pass_0": "html_lang_exists.html", + "Fail_1": "html_lang_exists.html", + "Fail_2": "html_lang_exists.html", + "Fail_3": "html_lang_exists.html", + "Fail_4": "html_lang_exists.html", + "Fail_5": "html_lang_exists.html", + "Potential_5": "html_lang_exists.html", + "Potential_6": "html_lang_exists.html" + } + }, + messages: { + "en-US": { + "group": "Page must identify the default language of the document with a 'lang' attribute", + "Pass_0": "Page language detected as \"{0}\"", + "Fail_1": "Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes", + "Fail_2": "Page detected as XHTML, but does not have an 'xml:lang' attribute", + "Fail_3": "Page detected as HTML, but does not have a 'lang' attribute", + "Fail_4": "Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"", + "Fail_5": "Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"", + "Potential_5": "Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type", + "Potential_6": "Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "fail", + "Fail_4": "inapplicable", + "Fail_5": "inapplicable", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + }, + "5b7ae0": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "fail", + "Fail_5": "pass", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + var doctypeString = ruleContext.ownerDocument.doctype ? ruleContext.ownerDocument.doctype.publicId : ""; + if (!doctypeString) + doctypeString = ""; + var lang = ruleContext.getAttribute("lang"); + var langXML = ruleContext.getAttribute("xml:lang"); + if (doctypeString.includes('XHTML') && !doctypeString.includes("1.0")) { + if (!langXML) { + // XHTML != 1.0 (must have xml:lang + return (0, IRule_1.RuleFail)("Fail_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [langXML]); + } + } + else if (doctypeString.includes('XHTML') && doctypeString.includes("1.0")) { + // Handle XHTML 1.0 + // If neither is provided, it's a failure + if (!lang && !langXML) { + // XHTML and no lang + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (lang && langXML) { + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else if (lang) { + // XHTML and only lang (okay if only delivered via text/html) + return (0, IRule_1.RulePotential)("Potential_5"); + } + else { + // XHTML and only xml:lang (okay if only delivered via xml mime type) + return (0, IRule_1.RulePotential)("Potential_6"); + } + } + else { + if (!lang) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else if (lang && langXML) { + // HTML5 polyglot documents + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else { + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/html_skipnav_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/html_skipnav_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_skipnav_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.html_skipnav_exists = { + id: "html_skipnav_exists", + context: "dom:html", + refactor: { + "RPT_Html_SkipNav": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "html_skipnav_exists.html", + "Pass_0": "html_skipnav_exists.html", + "Potential_1": "html_skipnav_exists.html" + } + }, + messages: { + "en-US": { + "group": "Provide a way to bypass blocks of content that are repeated on multiple Web pages", + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a way to bypass blocks of content that are repeated on multiple Web pages" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var frames = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "frame"); + var headers = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "h1"); + if ((frames != null && frames.length > 0) || (headers != null && headers.length > 0)) { + // If frames or headings are used, pass + passed = true; + } + else { + // Look for skip anchors + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + var targets = {}; + for (var idx = 0; !passed && idx < anchors.length; ++idx) { + if (anchors[idx].hasAttribute("href")) { + var href = anchors[idx].href; + if (typeof href !== typeof "") { + if (href.baseVal) { + href = href.baseVal; + } + else { + href = ""; + } + } + var tmpLocation = void 0; + if (typeof (ruleContext.ownerDocument.locationFromDAP) != "undefined" && ruleContext.ownerDocument.locationFromDAP != null) { // DAP sets it + tmpLocation = ruleContext.ownerDocument.locationFromDAP; + } + else { // server scan has the location object + tmpLocation = ruleContext.ownerDocument.location; + } + var docHref = ""; + if (tmpLocation) { + docHref = tmpLocation.href; + } + // Fix weird bugs with how various parsers report on file: url's: + if (href.startsWith("file:///")) + href = "file:/" + href.substring("file:///".length); + if (docHref.startsWith("file:///")) + docHref = "file:/" + docHref.substring("file:///".length); + if (href.charAt(0) == "#" || href.startsWith(docHref + "#")) { + var target = CommonUtil_1.CommonUtil.getFileAnchor(href); + if (fragment_1.FragmentUtil.getById(ruleContext, target) != null) + passed = true; + else + targets[target] = true; + } + } + else if (anchors[idx].hasAttribute("name")) { + // Assume forward jumping targets + var name_1 = anchors[idx].getAttribute("name"); + if (name_1.indexOf("#") != -1) + name_1 = CommonUtil_1.CommonUtil.getFileAnchor(name_1); + passed = name_1 in targets; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/iframe_interactive_tabbable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/iframe_interactive_tabbable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.iframe_interactive_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.iframe_interactive_tabbable = { + id: "iframe_interactive_tabbable", + context: "dom:iframe", + dependencies: [], + help: { + "en-US": { + "group": "iframe_interactive_tabbable.html", + "pass": "iframe_interactive_tabbable.html", + "fail_invalid": "iframe_interactive_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Iframe with interactive content should not be excluded from tab order using tabindex", + "pass": "The iframe with interactive content is not excluded from the tab order using tabindex", + "fail_invalid": "The <iframe> with interactive content is excluded from tab order using tabindex" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["akn7bn"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // ignore if iframe is too small to be visible on screen + if (Math.max(bounds['height'], bounds['width']) < 30 || Math.min(bounds['height'], bounds['width']) < 15) + return null; + // pass iframe element does not have a tabindex attribute value that is a negative number + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) >= 0) + return (0, IRule_1.RulePass)("pass"); + // check iframe content + var iframElem = ruleContext; + if (!iframElem || !iframElem.contentDocument || !iframElem.contentDocument.documentElement) + return null; + // If the iframe is blocked by an open modal dialog it is effectively inert — inapplicable + var doc = ruleContext.ownerDocument; + if (doc) { + var dialogs = Array.from(doc.querySelectorAll("dialog")); + var blockedByModal = dialogs.some(function (d) { return d.matches(":modal") && !d.contains(ruleContext); }); + if (blockedByModal) + return null; + } + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RuleFail)("fail_invalid"); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/imagebutton_alt_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/imagebutton_alt_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagebutton_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.imagebutton_alt_exists = { + id: "imagebutton_alt_exists", + context: "dom:input", + refactor: { + "WCAG20_Input_ExplicitLabelImage": { + "Pass_0": "Pass_0", + "Pass_1": "Pass_1", + "Pass_2": "Pass_2", + "Fail": "Fail" + } + }, + help: { + "en-US": { + "Pass_0": "imagebutton_alt_exists.html", + "Pass_1": "imagebutton_alt_exists.html", + "Pass_2": "imagebutton_alt_exists.html", + "Fail": "imagebutton_alt_exists.html", + "group": "imagebutton_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Image button provides alternative text using the 'alt' attribute", + "Pass_1": "Image button provides alternative text using an ARIA label", + "Pass_2": "Image button provides alternative text using the 'title' attribute", + "Fail": "The <input> element of type \"image\" has no text alternative", + "group": "The <input> element of type \"image\" should have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "59796f", + run: function (context, options, contextHierarchies) { + // See https://www.w3.org/WAI/WCAG22/Techniques/failures/F65 + var ruleContext = context["dom"].node; + if (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() != "image") { + return null; + } + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_1"); + } + else if (ruleContext.hasAttribute("title") && ruleContext.getAttribute("title").length > 0) { + return (0, IRule_1.RulePass)("Pass_2"); + } + return (0, IRule_1.RuleFail)("Fail"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/imagemap_alt_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/imagemap_alt_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagemap_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.imagemap_alt_exists = { + id: "imagemap_alt_exists", + context: "dom:img[usemap], dom:img[ismap]", + refactor: { + "HAAC_Img_UsemapAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "imagemap_alt_exists.html", + "Fail_1": "imagemap_alt_exists.html", + "group": "imagemap_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image map or child <area> has no text alternative", + "group": "An image map and each <area> element in an image map must have text alternative(s)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt") || + (!ruleContext.hasAttribute("ismap") && !CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "usemap")); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_background.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_background.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_background = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_background = { + id: "img_alt_background", + context: "dom:*", + refactor: { + "HAAC_BackgroundImg_HasTextOrTitle": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_background.html", + "Manual_1": "img_alt_background.html", + "group": "img_alt_background.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify important background image information has a text alternative in system high contrast mode", + "group": "Background images that convey important information must have a text alternative that describes the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var doc = ruleContext.ownerDocument; + var style = doc.defaultView.getComputedStyle(ruleContext); + if (style == null) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var backgroundImgs = style.backgroundImage; + var passed = true; + if (backgroundImgs != null && backgroundImgs != "" && backgroundImgs != 'none' && backgroundImgs != 'inherit') { + if (ruleContext.innerHTML != null && ruleContext.innerHTML.trim().length != 0) { + passed = false; + } + else { + var title = ruleContext.getAttribute('title'); + if (title != null && title.length != 0) + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_decorative.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_decorative.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_decorative = { + id: "img_alt_decorative", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_PresentationImgHasNonNullAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_decorative.html", + "Fail_1": "img_alt_decorative.html", + "group": "img_alt_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image designated as decorative has non-null 'alt' attribute", + "group": "Image designated as decorative must have 'alt=\"\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, "presentation") || AriaUtil_1.AriaUtil.hasRole(ruleContext, "none")) { + passed = ruleContext.getAttribute("alt").length == 0; + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_misuse.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/img_alt_misuse.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_misuse = { + id: "img_alt_misuse", + context: "dom:img, dom:area, dom:input", + refactor: { + "RPT_Img_AltCommonMisuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_misuse.html", + "Potential_1": "img_alt_misuse.html", + "group": "img_alt_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file name serves as a good inline replacement for the image", + "group": "'alt' attribute value must be a good inline replacement for the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + badText: { + value: ["short description"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + // Alt text check are elsewhere (See 41, 240, 455) + if (ruleContext.hasAttribute("alt")) { + var altText = ruleContext.getAttribute("alt").trim(); + if (altText.length > 0) { + var badText = validateParams.badText.value; + for (var i = 0; passed && i < badText.length; ++i) { + passed = altText.indexOf(badText[i]) == -1; + } + if (passed) { + var src = ruleContext.getAttribute((nodeName == "area") ? "href" : "src"); + // Allow it to pass if there's no src - can't determine these. + if (src != null) { + // Fail if the alt matches the src exactly + // Also fail if the alt has a . in it and either the src is in the alt or the alt is in the src + passed = src.trim() != altText && + (altText.indexOf(".") == -1 || (altText.indexOf(src) == -1 && src.indexOf(altText) == -1)); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_null.ts" +/*!**************************************!*\ + !*** ./src/v4/rules/img_alt_null.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_null = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_null = { + id: "img_alt_null", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_TitleEmptyWhenAltNull": { + "Pass_0": "pass", + "Fail_1": "fail_decorative" + } + }, + help: { + "en-US": { + "pass": "img_alt_null.html", + "fail_decorative": "img_alt_null.html", + "potential_aria_override": "img_alt_null.html", + "group": "img_alt_null.html" + } + }, + messages: { + "en-US": { + "pass": "Neither 'aria' nor 'title' attributes are used for the decorative image", + "fail_decorative": "The image 'alt' attribute is empty, but the 'title' attribute is not empty", + "potential_aria_override": "The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute", + "group": "When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_decorative"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["potential_aria_override"] + } + ], + act: [{ "46ca7f": { "potential_aria_override": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (ruleContext.getAttribute("alt").trim().length > 0) { + return null; + } + // We have a title, but alt is empty + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0) { + return (0, IRule_1.RulePotential)("potential_aria_override"); + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RuleFail)("fail_decorative"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_redundant.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/img_alt_redundant.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_redundant = { + id: "img_alt_redundant", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_LinkTextNotRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_redundant.html", + "Fail_1": "img_alt_redundant.html", + "Fail_2": "img_alt_redundant.html", + "Fail_3": "img_alt_redundant.html", + "group": "img_alt_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Link text is repeated in an image 'alt' value within the same link", + "Fail_2": "Link text of previous link is repeated in image 'alt' value of a link", + "Fail_3": "Image 'alt' value within a link is repeated in link text of the link after", + "group": "The text alternative for an image within a link should not repeat the link text or adjacent link text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.4.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aNode = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "a"); + //If not in an anchor, Out of Scope + if (aNode == null) + return null; + var altText = ruleContext.getAttribute("alt").trim().toLowerCase(); + if (altText.length == 0) { + // If alt text is empty, there's no text to be redundant - let a_text_purpose + // trigger in that case. + // So Out of Scope for this rule + return null; + } + var innerText = aNode.innerText; + var linkText = ""; + if (innerText != null) { + linkText = innerText.trim().toLowerCase(); + } + if (linkText.length > 0) { + if (altText == linkText) { + // Text in link + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + var passed = true; + //alt is non-zero, but no link text - ensure adjacent link text isn't redundant + var walk = new DOMWalker_1.DOMWalker(aNode); + while (passed && walk.prevNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName === "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + // Text before image link + passed = (node.innerText || node.textContent || "").trim().toLowerCase() != altText; + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + walk = new DOMWalker_1.DOMWalker(aNode, true); + while (passed && walk.nextNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName == "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + passed = node.innerText.trim().toLowerCase() != altText; + } + } + if (!passed) { + // Text after image link + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_valid.ts" +/*!***************************************!*\ + !*** ./src/v4/rules/img_alt_valid.ts ***! + \***************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.img_alt_valid = { + id: "img_alt_valid", + context: "dom:img", + refactor: { + "WCAG20_Img_HasAlt": { + "pass": "pass", + "fail_blank_alt": "fail_blank_alt", + "fail_no_alt": "fail_no_alt", + "fail_blank_title": "fail_blank_title" + } + }, + help: { + "en-US": { + "pass": "img_alt_valid.html", + "fail_blank_alt": "img_alt_valid.html", + "fail_no_alt": "img_alt_valid.html", + "fail_blank_title": "img_alt_valid.html", + "group": "img_alt_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The image has an accessible name or is correctly marked as decorative or redundant", + "fail_blank_alt": "Image 'alt' attribute value consists only of blank space(s)", + "fail_no_alt": "The image has neither an accessible name nor is marked as decorative or redundant", + "fail_blank_title": "The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)", + "group": "Images must have accessible names unless they are decorative or redundant" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "23a2a8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If not visible to the screen reader, or can be ignored + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).trim().length !== 0) { + // the img has non-empty aria label + return (0, IRule_1.RulePass)("pass"); + } + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + // check title attribute + if (alt === null) { + // the img has no alt or attribute, examine the title attribute + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (title === null || title.length === 0) { + // no title or title is empty, examine alt further + if (alt === null) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext, false); + if (role === 'presentation' || role === 'none') + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_no_alt"); + } + if (alt.length === 0) + return (0, IRule_1.RulePass)("pass"); + } + else { + if (title.trim().length === 0) { + // title contains blank space only (title=" ") + return (0, IRule_1.RuleFail)("fail_blank_title"); + } + // title contains some text (title="some text") + return (0, IRule_1.RulePass)("pass"); + } + } + else { + if (alt.length === 0 || alt.trim().length > 0) { + // the img has empty alt (alt="") or non-empty alt (alt="some text") + return (0, IRule_1.RulePass)("pass"); + } + else { + // alt contains blank space only (alt=" ") + return (0, IRule_1.RuleFail)("fail_blank_alt"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_ismap_misuse.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/img_ismap_misuse.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_ismap_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_ismap_misuse = { + id: "img_ismap_misuse", + context: "dom:img[ismap]", + refactor: { + "RPT_Img_UsemapValid": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_ismap_misuse.html", + "Potential_1": "img_ismap_misuse.html", + "group": "img_ismap_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Server-side image map hot-spots do not have duplicate text links", + "group": "Server-side image map hot-spots must have duplicate text links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = false; + if (ruleContext.hasAttribute("usemap")) { + var usemap = ruleContext.getAttribute("usemap"); + usemap = usemap.trim().toLowerCase(); + var idx = usemap.indexOf("#"); + if (idx != -1) + usemap = usemap.substr(idx + 1); + if (usemap.length > 0) { + var maps = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "map"); + for (var i = 0; !passed && i < maps.length; ++i) { + passed = maps[i].hasAttribute("name") && + maps[i].getAttribute("name").toLowerCase() == usemap; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_longdesc_misuse.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/img_longdesc_misuse.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_longdesc_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_longdesc_misuse = { + id: "img_longdesc_misuse", + context: "dom:img[longdesc]", + refactor: { + "RPT_Img_LongDescription2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_longdesc_misuse.html", + "Potential_1": "img_longdesc_misuse.html", + "group": "img_longdesc_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)", + "group": " The 'longdesc' attribute must reference HTML content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var longdesc = ruleContext.getAttribute("longdesc"); + // if (longdesc is bad URL) passed = false; + var ext = CommonUtil_1.CommonUtil.getFileExt(longdesc); + var passed = ext.length != 0 && CommonUtil_1.CommonUtil.isHtmlExt(ext) + || longdesc.startsWith("#") + || longdesc.startsWith("http://") + || longdesc.startsWith("https://") + || longdesc.startsWith("data:"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/index.ts" +/*!*******************************!*\ + !*** ./src/v4/rules/index.ts ***! + \*******************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +// This file is automatically generated by "npm run prebuild". Do not edit +__exportStar(__webpack_require__(/*! ./a_target_warning */ "./src/v4/rules/a_target_warning.ts"), exports); +__exportStar(__webpack_require__(/*! ./a_text_purpose */ "./src/v4/rules/a_text_purpose.ts"), exports); +__exportStar(__webpack_require__(/*! ./applet_alt_exists */ "./src/v4/rules/applet_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./application_content_accessible */ "./src/v4/rules/application_content_accessible.ts"), exports); +__exportStar(__webpack_require__(/*! ./area_alt_exists */ "./src/v4/rules/area_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_accessiblename_exists */ "./src/v4/rules/aria_accessiblename_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_tabindex_valid */ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_valid */ "./src/v4/rules/aria_activedescendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_label_unique */ "./src/v4/rules/aria_application_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_labelled */ "./src/v4/rules/aria_application_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_article_label_unique */ "./src/v4/rules/aria_article_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_allowed */ "./src/v4/rules/aria_attribute_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_conflict */ "./src/v4/rules/aria_attribute_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_deprecated */ "./src/v4/rules/aria_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_exists */ "./src/v4/rules/aria_attribute_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_redundant */ "./src/v4/rules/aria_attribute_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_required */ "./src/v4/rules/aria_attribute_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_value_valid */ "./src/v4/rules/aria_attribute_value_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_label_unique */ "./src/v4/rules/aria_banner_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_single */ "./src/v4/rules/aria_banner_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_tabbable */ "./src/v4/rules/aria_child_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_valid */ "./src/v4/rules/aria_child_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_unique */ "./src/v4/rules/aria_complementary_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_visible */ "./src/v4/rules/aria_complementary_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_labelled */ "./src/v4/rules/aria_complementary_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_content_in_landmark */ "./src/v4/rules/aria_content_in_landmark.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_label_unique */ "./src/v4/rules/aria_contentinfo_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_misuse */ "./src/v4/rules/aria_contentinfo_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_single */ "./src/v4/rules/aria_contentinfo_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_descendant_valid */ "./src/v4/rules/aria_descendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_document_label_unique */ "./src/v4/rules/aria_document_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_eventhandler_role_valid */ "./src/v4/rules/aria_eventhandler_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_form_label_unique */ "./src/v4/rules/aria_form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_graphic_labelled */ "./src/v4/rules/aria_graphic_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_hidden_nontabbable */ "./src/v4/rules/aria_hidden_nontabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_id_unique */ "./src/v4/rules/aria_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_img_labelled */ "./src/v4/rules/aria_img_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_keyboard_handler_exists */ "./src/v4/rules/aria_keyboard_handler_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_landmark_name_unique */ "./src/v4/rules/aria_landmark_name_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_unique */ "./src/v4/rules/aria_main_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_visible */ "./src/v4/rules/aria_main_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_navigation_label_unique */ "./src/v4/rules/aria_navigation_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_parent_required */ "./src/v4/rules/aria_parent_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_label_unique */ "./src/v4/rules/aria_region_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_labelled */ "./src/v4/rules/aria_region_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_allowed */ "./src/v4/rules/aria_role_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_redundant */ "./src/v4/rules/aria_role_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_search_label_unique */ "./src/v4/rules/aria_search_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_semantics */ "./src/v4/rules/aria_semantics.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_toolbar_label_unique */ "./src/v4/rules/aria_toolbar_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_widget_labelled */ "./src/v4/rules/aria_widget_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./asciiart_alt_exists */ "./src/v4/rules/asciiart_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_css_review */ "./src/v4/rules/blink_css_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_elem_deprecated */ "./src/v4/rules/blink_elem_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./blockquote_cite_exists */ "./src/v4/rules/blockquote_cite_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./canvas_content_described */ "./src/v4/rules/canvas_content_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./caption_track_exists */ "./src/v4/rules/caption_track_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_active_descendant */ "./src/v4/rules/combobox_active_descendant.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_autocomplete_valid */ "./src/v4/rules/combobox_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_design_valid */ "./src/v4/rules/combobox_design_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_focusable_elements */ "./src/v4/rules/combobox_focusable_elements.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_haspopup_valid */ "./src/v4/rules/combobox_haspopup_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_popup_reference */ "./src/v4/rules/combobox_popup_reference.ts"), exports); +__exportStar(__webpack_require__(/*! ./debug_paths */ "./src/v4/rules/debug_paths.ts"), exports); +__exportStar(__webpack_require__(/*! ./detector_tabbable */ "./src/v4/rules/detector_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./dir_attribute_valid */ "./src/v4/rules/dir_attribute_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./download_keyboard_controllable */ "./src/v4/rules/download_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./draggable_alternative_exists */ "./src/v4/rules/draggable_alternative_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_labelled */ "./src/v4/rules/element_accesskey_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_unique */ "./src/v4/rules/element_accesskey_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_attribute_deprecated */ "./src/v4/rules/element_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_id_unique */ "./src/v4/rules/element_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_lang_valid */ "./src/v4/rules/element_lang_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_mouseevent_keyboard */ "./src/v4/rules/element_mouseevent_keyboard.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_orientation_unlocked */ "./src/v4/rules/element_orientation_unlocked.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_scrollable_tabbable */ "./src/v4/rules/element_scrollable_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_role_valid */ "./src/v4/rules/element_tabbable_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_unobscured */ "./src/v4/rules/element_tabbable_unobscured.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_visible */ "./src/v4/rules/element_tabbable_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./embed_alt_exists */ "./src/v4/rules/embed_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./emoticons_alt_exists */ "./src/v4/rules/emoticons_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./error_message_exists */ "./src/v4/rules/error_message_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_label_valid */ "./src/v4/rules/fieldset_label_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_legend_valid */ "./src/v4/rules/fieldset_legend_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./figure_label_exists */ "./src/v4/rules/figure_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_font_color */ "./src/v4/rules/form_font_color.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_interaction_review */ "./src/v4/rules/form_interaction_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_label_unique */ "./src/v4/rules/form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_button_exists */ "./src/v4/rules/form_submit_button_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_review */ "./src/v4/rules/form_submit_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_src_valid */ "./src/v4/rules/frame_src_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_title_exists */ "./src/v4/rules/frame_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_content_exists */ "./src/v4/rules/heading_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_markup_misuse */ "./src/v4/rules/heading_markup_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_lang_exists */ "./src/v4/rules/html_lang_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_skipnav_exists */ "./src/v4/rules/html_skipnav_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./iframe_interactive_tabbable */ "./src/v4/rules/iframe_interactive_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagebutton_alt_exists */ "./src/v4/rules/imagebutton_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagemap_alt_exists */ "./src/v4/rules/imagemap_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_background */ "./src/v4/rules/img_alt_background.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_decorative */ "./src/v4/rules/img_alt_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_misuse */ "./src/v4/rules/img_alt_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_null */ "./src/v4/rules/img_alt_null.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_redundant */ "./src/v4/rules/img_alt_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_valid */ "./src/v4/rules/img_alt_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_ismap_misuse */ "./src/v4/rules/img_ismap_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_longdesc_misuse */ "./src/v4/rules/img_longdesc_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_autocomplete_valid */ "./src/v4/rules/input_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_checkboxes_grouped */ "./src/v4/rules/input_checkboxes_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_fields_grouped */ "./src/v4/rules/input_fields_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_haspopup_conflict */ "./src/v4/rules/input_haspopup_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_after */ "./src/v4/rules/input_label_after.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_before */ "./src/v4/rules/input_label_before.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_exists */ "./src/v4/rules/input_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_visible */ "./src/v4/rules/input_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_onchange_review */ "./src/v4/rules/input_onchange_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_placeholder_label_visible */ "./src/v4/rules/input_placeholder_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_content_exists */ "./src/v4/rules/label_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_name_visible */ "./src/v4/rules/label_name_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_ref_valid */ "./src/v4/rules/label_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_children_valid */ "./src/v4/rules/list_children_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_markup_review */ "./src/v4/rules/list_markup_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_structure_proper */ "./src/v4/rules/list_structure_proper.ts"), exports); +__exportStar(__webpack_require__(/*! ./marquee_elem_avoid */ "./src/v4/rules/marquee_elem_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_brief */ "./src/v4/rules/media_alt_brief.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_exists */ "./src/v4/rules/media_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_audio_transcribed */ "./src/v4/rules/media_audio_transcribed.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_autostart_controllable */ "./src/v4/rules/media_autostart_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_keyboard_controllable */ "./src/v4/rules/media_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_live_captioned */ "./src/v4/rules/media_live_captioned.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_track_available */ "./src/v4/rules/media_track_available.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_redirect_optional */ "./src/v4/rules/meta_redirect_optional.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_refresh_delay */ "./src/v4/rules/meta_refresh_delay.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_viewport_zoomable */ "./src/v4/rules/meta_viewport_zoomable.ts"), exports); +__exportStar(__webpack_require__(/*! ./noembed_content_exists */ "./src/v4/rules/noembed_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./object_text_exists */ "./src/v4/rules/object_text_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_exists */ "./src/v4/rules/page_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_valid */ "./src/v4/rules/page_title_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_focus_blur_review */ "./src/v4/rules/script_focus_blur_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_avoid */ "./src/v4/rules/script_onclick_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_misuse */ "./src/v4/rules/script_onclick_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_select_review */ "./src/v4/rules/script_select_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./select_options_grouped */ "./src/v4/rules/select_options_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_described */ "./src/v4/rules/skip_main_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_exists */ "./src/v4/rules/skip_main_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_background_decorative */ "./src/v4/rules/style_background_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_before_after_review */ "./src/v4/rules/style_before_after_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_color_misuse */ "./src/v4/rules/style_color_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_focus_visible */ "./src/v4/rules/style_focus_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_highcontrast_visible */ "./src/v4/rules/style_highcontrast_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_hover_persistent */ "./src/v4/rules/style_hover_persistent.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_viewport_resizable */ "./src/v4/rules/style_viewport_resizable.ts"), exports); +__exportStar(__webpack_require__(/*! ./svg_graphics_labelled */ "./src/v4/rules/svg_graphics_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_aria_descendants */ "./src/v4/rules/table_aria_descendants.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_empty */ "./src/v4/rules/table_caption_empty.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_nested */ "./src/v4/rules/table_caption_nested.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_exists */ "./src/v4/rules/table_headers_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_ref_valid */ "./src/v4/rules/table_headers_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_related */ "./src/v4/rules/table_headers_related.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_layout_linearized */ "./src/v4/rules/table_layout_linearized.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_scope_valid */ "./src/v4/rules/table_scope_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_structure_misuse */ "./src/v4/rules/table_structure_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_summary_redundant */ "./src/v4/rules/table_summary_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./target_spacing_sufficient */ "./src/v4/rules/target_spacing_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_block_heading */ "./src/v4/rules/text_block_heading.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_contrast_sufficient */ "./src/v4/rules/text_contrast_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_quoted_correctly */ "./src/v4/rules/text_quoted_correctly.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_sensory_misuse */ "./src/v4/rules/text_sensory_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_spacing_valid */ "./src/v4/rules/text_spacing_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_whitespace_valid */ "./src/v4/rules/text_whitespace_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_exists */ "./src/v4/rules/widget_tabbable_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_single */ "./src/v4/rules/widget_tabbable_single.ts"), exports); + + +/***/ }, + +/***/ "./src/v4/rules/input_autocomplete_valid.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/input_autocomplete_valid.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_autocomplete_valid = { + id: "input_autocomplete_valid", + context: "dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]", + refactor: { + "WCAG21_Input_Autocomplete": { + "Pass_0": "pass", + "Fail_1": "fail_inappropriate", + "Fail_2": "fail_invalid", + "Fail_attribute_incorrect": "fail_incorrect" + } + }, + help: { + "en-US": { + "group": "input_autocomplete_valid.html", + "pass": "input_autocomplete_valid.html", + "fail_inappropriate": "input_autocomplete_valid.html", + "fail_invalid": "input_autocomplete_valid.html", + "fail_incorrect": "input_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "group": "The 'autocomplete' attribute's token(s) must be appropriate for the input form field", + "pass": "The 'autocomplete' attribute's token(s) is appropriate for the input form field", + "fail_inappropriate": "The 'autocomplete' attribute's token(s) are not appropriate for the input form field", + "fail_invalid": "The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type", + "fail_incorrect": "The 'autocomplete' attribute has an incorrect value" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "73f2c2": { + "pass": "pass", + "fail_inappropriate": "fail", + "fail_invalid": "pass", + "fail_incorrect": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var autocompleteAttr = ruleContext.getAttribute("autocomplete").trim().toLowerCase(); + var tokens = autocompleteAttr.split(/\s+/); + if (tokens.length === 0 || autocompleteAttr.length === 0) { + return null; + } + var cache = { + "tokensOnOff": ["on", "off"], + "tokenOptionalSection": "section-", + "tokensOptionalPurpose": ["shipping", "billing"], + "tokensMandatoryGroup1_password": ["new-password", "current-password", "one-time-code"], + "tokensMandatoryGroup1_multiline": ["street-address"], + "tokensMandatoryGroup1_month": ["cc-exp"], + "tokensMandatoryGroup1_numeric": ["cc-exp-month", + "cc-exp-year", + "transaction-amount", + "bday-day", + "bday-month", + "bday-year"], + "tokensMandatoryGroup1_date": ["bday"], + "tokensMandatoryGroup1_url": ["url", "photo"], + "tokensMandatoryGroup1_text": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "organization-title", + "organization", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-csc", + "cc-type", + "transaction-currency", + "language", + "sex"], + "tokensMandatoryGroup1_all": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "new-password", + "current-password", + "organization-title", + "organization", + "street-address", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-exp", + "cc-exp-month", + "cc-exp-year", + "cc-csc", + "cc-type", + "transaction-currency", + "transaction-amount", + "language", + "bday", + "bday-day", + "bday-month", + "bday-year", + "sex", + "url", + "photo"], + "tokensOptionalGroup2": ["home", + "work", + "mobile", + "fax", + "pager"], + "tokensMandatoryGroup2_tel": ["tel"], + "tokensMandatoryGroup2_email": ["email"], + "tokensMandatoryGroup2_url": ["impp"], + "tokensMandatoryGroup2_text": ["tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension"], + "tokensMandatoryGroup2_all": ["tel", + "tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension", + "email", + "impp"], + "tokensOptionGroup1_webauthn": ["webauthn"] + }; + var valid_values = []; + for (var key in cache) + valid_values = valid_values.concat(cache[key]); + var foundMandatoryToken = false; + var foundRecognizedToken = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!tokens.every(function (r) { return valid_values.includes(r) || r.startsWith(cache['tokenOptionalSection']); })) + return (0, IRule_1.RuleFail)("fail_incorrect"); + var type = ruleContext.hasAttribute("type") ? ruleContext.getAttribute("type").trim().toLowerCase() : "text"; + var tokensMandatoryGroup1 = []; + var tokensMandatoryGroup2 = []; + var tokensOptionalGroup = []; + if (nodeName === "textarea" || nodeName === "select") { + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + if (nodeName === "textarea") + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + } + else if (nodeName === "input") { + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + // handle the various 'input' types + switch (type) { + // Disable check for input type=hidden for now based on scrum discussion + /* + case "hidden": + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + */ + case "text": + case "search": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_text.concat(cache.tokensMandatoryGroup1_password, cache.tokensMandatoryGroup1_url, cache.tokensMandatoryGroup1_numeric, cache.tokensMandatoryGroup1_month, cache.tokensMandatoryGroup1_date); + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + case "password": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_password; + break; + case "url": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_url; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_url; + break; + case "email": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_email; + break; + case "tel": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_tel; + break; + case "number": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_numeric; + break; + case "month": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_month; + break; + case "date": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_date; + break; + default: + // unsupported type for this rule. + return null; + } + } + else { + // should never get here. + return null; + } + // Disable check for input type=hidden for now based on scrum discussion + var autofillMantle = /* (nodeName==="input" && type==="hidden") ? "anchor" : */ "expectation"; + if (autofillMantle === "expectation") { + // check on|off for expectation mantle. + if (tokens.includes("on") || tokens.includes("off")) { + // on|off should be the only token + if (tokens.length === 1) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_invalid"); + } + } + } + // check detail autofill tokens + var currIndex = 0; + var currRecognizedIndex = 0; + // check optional 'section-*' tokens + if (tokens[currIndex].startsWith(cache.tokenOptionalSection) && + tokens[currIndex].length > 8) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check optional 'shipping|billing' tokens + if (tokens.length > currIndex && + cache.tokensOptionalPurpose.includes(tokens[currIndex])) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currIndex) { + // check mandatory group 1 + if (tokensMandatoryGroup1.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currIndex])) { + currIndex++; + } + // check mandatory group 2 + if (tokensMandatoryGroup2.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + } + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currRecognizedIndex) { + // check mandatory group 1 + if (cache.tokensMandatoryGroup1_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currRecognizedIndex])) { + currRecognizedIndex++; + } + // check mandatory group 2 + if (cache.tokensMandatoryGroup2_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + } + } + if (tokens.length > currIndex + currRecognizedIndex) { + // check optional tokens webauthn + if (tokensOptionalGroup.includes(tokens[currIndex + currRecognizedIndex])) { + currIndex++; + } + } + if ((tokens.length > currIndex && tokensOptionalGroup.includes(tokens[currIndex])) + || (tokens.length > currRecognizedIndex && tokensOptionalGroup.includes(tokens[currRecognizedIndex]))) { + currIndex++; + currRecognizedIndex++; + } + // Only pass if we have seen either of the mandatory groups and all tokens have been consumed + if (foundMandatoryToken && tokens.length === currIndex) { + return (0, IRule_1.RulePass)("pass"); + } + else if (foundRecognizedToken && tokens.length === currRecognizedIndex) { + return (0, IRule_1.RuleFail)("fail_incorrect"); + } + else { + return (0, IRule_1.RuleFail)("fail_inappropriate"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_checkboxes_grouped.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/input_checkboxes_grouped.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_checkboxes_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.input_checkboxes_grouped = { + id: "input_checkboxes_grouped", + context: "dom:input[type=radio], dom:input[type=checkbox]", + refactor: { + "WCAG20_Input_RadioChkInFieldSet": { + "Pass_LoneNogroup": "pass_lonenogroup", + "Pass_Grouped": "pass_grouped", + "Pass_RadioNoName": "pass_radioNoName", + "Fail_ControlNameMismatch": "fail_controlnamemismatch", + "Fail_NotGroupedOtherGrouped": "fail_notgroupedothergrouped", + "Fail_NotGroupedOtherNotGrouped": "fail_notgroupedothernotgrouped", + "Fail_NotSameGroup": "fail_notsamegroup", + "Potential_LoneCheckbox": "potential_lonecheckbox", + "Potential_UnnamedCheckbox": "potential_unnamedcheckbox" + } + }, + help: { + "en-US": { + "group": "input_checkboxes_grouped.html", + "pass_lonenogroup": "input_checkboxes_grouped.html", + "pass_grouped": "input_checkboxes_grouped.html", + "pass_radiononame": "input_checkboxes_grouped.html", + "fail_controlnamemismatch": "input_checkboxes_grouped.html", + "fail_notgroupedothergrouped": "input_checkboxes_grouped.html", + "fail_notgroupedothernotgrouped": "input_checkboxes_grouped.html", + "fail_notsamegroup": "input_checkboxes_grouped.html", + "potential_lonecheckbox": "input_checkboxes_grouped.html", + "potential_unnamedcheckbox": "input_checkboxes_grouped.html" + } + }, + messages: { + "en-US": { + "group": "Related sets of radio buttons or checkboxes should be programmatically grouped", + "pass_lonenogroup": "{0} grouping not required for a control of this type", + "pass_grouped": "{0} input is grouped with other related controls with the same name", + "pass_radiononame": "Radio input is not grouped, but passes because it has no name to group with other radio inputs", + "fail_controlnamemismatch": "{0} input found that has the same name, \"{2}\" as a {1} input", + "fail_notgroupedothergrouped": "{0} input is not in the group with another {0} with the name \"{1}\"", + "fail_notgroupedothernotgrouped": "{0} input and others with the name \"{1}\" are not grouped together", + "fail_notsamegroup": "{0} input is in a different group than another {0} with the name \"{1}\"", + "potential_lonecheckbox": "Verify that this ungrouped checkbox input is not related to other checkboxes", + "potential_unnamedcheckbox": "Verify that this un-named, ungrouped checkbox input is not related to other checkboxes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var getGroup = function (e) { + var retVal = CommonUtil_1.CommonUtil.getAncestor(e, "fieldset") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "radiogroup") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "group") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "grid") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "table"); + if (!retVal) { + retVal = CommonUtil_1.CommonUtil.getAncestor(e, "table"); + if (retVal && !TableUtil_1.TableUtil.isDataTable(retVal)) { + retVal = null; + } + } + return retVal; + }; + // Only radio buttons and checkboxes are in scope + var ctxType = ruleContext.getAttribute("type").toLowerCase(); + // Determine which form we're in (if any) to determine our scope + var ctxForm = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement; + // Get data about all of the visible checkboxes and radios in the scope of this form + // and cache it for all of the other inputs in this scope + var formCache = CacheUtil_1.CacheUtil.getCache(ctxForm, "input_checkboxes_grouped", null); + if (!formCache) { + formCache = { + checkboxByName: {}, + radiosByName: {}, + nameToGroup: {}, + numCheckboxes: 0, + numRadios: 0 + }; + // Get all of the checkboxes in the form or body (but not nested in something else and not hidden) + // And get a mapping of these checkboxes to + var cWalker = new DOMWalker_1.DOMWalker(ctxForm, false, ctxForm, true); + var checkboxQ = []; + var radiosQ = []; + while (cWalker.nextNode()) { + if (!cWalker.bEndTag + && cWalker.node.nodeType === 1 + && cWalker.node.nodeName.toLowerCase() === "input" + && VisUtil_1.VisUtil.isNodeVisible(cWalker.node)) { + var type = cWalker.node.getAttribute("type"); + if (type === "checkbox") { + checkboxQ.push(cWalker.node); + } + else if (type === "radio") { + radiosQ.push(cWalker.node); + } + } + } + // let checkboxQ = ctxForm.querySelectorAll("input[type=checkbox]"); + for (var idx = 0; idx < checkboxQ.length; ++idx) { + var cb = checkboxQ[idx]; + if ((AriaUtil_1.AriaUtil.getAncestorWithRole(cb, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement) === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(cb)) { + var name_1 = cb.getAttribute("name") || ""; + (formCache.checkboxByName[name_1] = formCache.checkboxByName[name_1] || []).push(cb); + formCache.nameToGroup[name_1] = formCache.nameToGroup[name_1] || getGroup(cb); + ++formCache.numCheckboxes; + } + } + // Get all of the radios in the form or body (but not nested in something else and not hidden) + // let radiosQ = ctxForm.querySelectorAll("input[type=radio]"); + for (var idx = 0; idx < radiosQ.length; ++idx) { + var r = radiosQ[idx]; + var radCtx = (AriaUtil_1.AriaUtil.getAncestorWithRole(r, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement); + if (radCtx === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + var name_2 = r.getAttribute("name") || ""; + (formCache.radiosByName[name_2] = formCache.radiosByName[name_2] || []).push(r); + formCache.nameToGroup[name_2] = formCache.nameToGroup[name_2] || getGroup(r); + ++formCache.numRadios; + } + } + CacheUtil_1.CacheUtil.setCache(ctxForm, "input_checkboxes_grouped", formCache); + } + ///////////// Calculated everything, now check the various cases + var ctxName = ruleContext.getAttribute("name"); + var ctxGroup = getGroup(ruleContext); + ctxType = ctxType === "radio" ? "Radio" : "Checkbox"; + if (!ctxName || ctxName === "") { + // First process cases where the control is not named + if (ctxType === "Radio") { + // Radios without names don't act like groups, so don't enforce grouping + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_radiononame", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // Must be an unnamed checkbox + if (ctxGroup === null) { + if ((formCache.checkboxByName[""] || []).length > 1) { + return (0, IRule_1.RulePotential)("potential_unnamedcheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + else { + // Considering a named checkbox + var numRadiosWithName = (formCache.radiosByName[ctxName] || []).length; + var numCheckboxesWithName = (formCache.checkboxByName[ctxName] || []).length; + // Capitalize the input type for messages + if (numRadiosWithName > 0 && numCheckboxesWithName > 0) { + // We have a naming mismatch between different controls + return (0, IRule_1.RuleFail)("fail_controlnamemismatch", [ctxType, ctxType === "checkbox" ? "radio" : "checkbox", ctxName]); + } + else if (ctxType === "Radio" && (formCache.numRadios === 1 || numRadiosWithName === 1) + || ctxType === "Checkbox" && formCache.numCheckboxes === 1) { + // This is a lone control (either only control of this type on the page, or a radio button without any others by that name) + // We pass this control in all cases + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else if (ctxType === "Checkbox" && formCache.numCheckboxes > 1 && numCheckboxesWithName === 1) { + // We have only one checkbox with this name, but there are other checkboxes in the form. + // If we're not grouped, ask them to examine it + if (ctxGroup === null) { + return (0, IRule_1.RulePotential)("potential_lonecheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // We share a name with another similar control. Are we grouped together? + if (ctxGroup === null) { + if (formCache.nameToGroup[ctxName] !== null) { + // We're not grouped, but some control with the same name is in a group + return (0, IRule_1.RuleFail)("fail_notgroupedothergrouped", [ctxType, ctxName]); + } + else { + // None of us are grouped + return (0, IRule_1.RuleFail)("fail_notgroupedothernotgrouped", [ctxType, ctxName]); + } + } + else if (formCache.nameToGroup[ctxName] !== ctxGroup) { + // We're not in the main group with the others + return (0, IRule_1.RuleFail)("fail_notsamegroup", [ctxType, ctxName]); + } + else { + // We're all grouped up! + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_fields_grouped.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/input_fields_grouped.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_fields_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_fields_grouped = { + id: "input_fields_grouped", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_InFieldSet": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "input_fields_grouped.html", + "Potential_1": "input_fields_grouped.html", + "group": "input_fields_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Use the <fieldset> element to group logically related input elements", + "group": "Groups of logically related input elements should be contained within a <fieldset> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger for other input types or if we're in a fieldset + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") + return (0, IRule_1.RulePass)("Pass_0"); + } + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "fieldset") != null) + return (0, IRule_1.RulePass)("Pass_0"); + // No fieldset - see if this input is all by itself - no need to group single inputs + var parent = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["form", "body"]); + var checkTypes = ["input", "textarea", "select"]; + var passed = true; + for (var i = 0; passed && i < checkTypes.length; ++i) { + var controls = parent.getElementsByTagName(checkTypes[i]); + for (var j = 0; passed && j < controls.length; ++j) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(controls[j])) { + continue; + } + // Note that textareas and selects will be called type='text' + var type = controls[j].hasAttribute("type") ? controls[j].getAttribute("type").toLowerCase() : "text"; + // Only fail if this is another control in the form and its type is another text-like input + passed = controls[j] == ruleContext || (type != "text" && type != "password" && type != "file"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_haspopup_conflict.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/input_haspopup_conflict.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_haspopup_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_haspopup_conflict = { + id: "input_haspopup_conflict", + context: "dom:input[list][aria-haspopup]", + refactor: { + "input_haspopup_invalid": { + // "Pass": "pass", + "Potential_1": "potential_type_misuse", + "Potential_2": "potential_misuse" + } + }, + help: { + "en-US": { + "group": "input_haspopup_conflict.html", + // "pass": "input_haspopup_conflict.html", + "potential_type_misuse": "input_haspopup_conflict.html", + "potential_misuse": "input_haspopup_conflict.html", + "potential_list_notexist": "input_haspopup_conflict.html", + "fail_invalid_list_type": "input_haspopup_conflict.html", + "fail_invalid_list_elem": "input_haspopup_conflict.html" + } + }, + messages: { + "en-US": { + "group": "<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute", + // "pass": "The <input> element with a 'list' attribute does not use an explicit 'aria-haspopup' attribute", + "potential_type_misuse": "The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_misuse": "The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_list_notexist": "The list attribute for the <input> element is invalid", + "fail_invalid_list_type": "The list attribute for the <input> element with the type \"{0}\" is invalid", + "fail_invalid_list_elem": "The list attribute for the <input> element does not reference a datalist element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + // let "aria_role_valid" to handle invalid role. Only allowed role is combobox which is implicit. + if (roles && roles.length > 0 && !roles.includes('combobox')) + return null; + //triggering input types: text, search, tel, url, email, or missing or invalid + var yesTypes = ["text", "search", "tel", "url", "email", "date", "month", "week", "time", "datetime-local", "number", "range", "color"]; + var noTypes = ["file", "password", "checkbox", "radio", "submit", "reset", "image", "hidden", "button"]; + var attrValue = ruleContext.getAttribute("type"); + //missing input type for list but with aria_has_popup + if (!attrValue || attrValue.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_misuse"); + attrValue = attrValue.trim().toLowerCase(); + //invalid input types for list but with aria_has_popup + if (!yesTypes.includes(attrValue) && !noTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_misuse"); + // the list attribute is used for wrong input type + if (attrValue && noTypes.includes(attrValue)) + return (0, IRule_1.RuleFail)("fail_invalid_list_type"); + var list = ruleContext.getAttribute("list"); + // the list attribute is blank + if (!list || list.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_list_notexist"); + var listElem = ruleContext.ownerDocument.getElementById(list); + // the list element doesn't exist + if (!listElem) + return (0, IRule_1.RuleFail)("potential_list_notexist"); + // the list element is not a datalist element + if (listElem.nodeName.toLowerCase() !== 'datalist') + return (0, IRule_1.RuleFail)("fail_invalid_list_elem"); + // valid input types for list but with aria_has_popup + if (yesTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_type_misuse", [attrValue]); + // shouldn't get here + return; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_after.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/input_label_after.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_after = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_after = { + id: "input_label_after", + context: "dom:input", + refactor: { + "WCAG20_Input_LabelAfter": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_after.html", + "Fail_1": "input_label_after.html", + "Fail_2": "input_label_after.html", + "group": "input_label_after.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Checkbox or radio button is nested in label, so label is not after the input control", + "Fail_2": "Label text is located before its associated checkbox or radio button element", + "group": "Checkboxes and radio buttons must have a label after the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var type = ""; + if (ruleContext.hasAttribute("type")) + type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "checkbox" && type != "radio") { + return null; + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem === null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + var passed; + if (value === -2) { + // input nested in label + passed = false; + var walkNode = new DOMWalker_1.DOMWalker(labelElem); + walkNode.node = ruleContext; + while (!passed && walkNode.nextNode()) { + passed = ((walkNode.node.nodeName.toLowerCase() === "#text" && walkNode.node.nodeValue.trim().length > 0) + || (walkNode.node.nodeName.toLowerCase() === "span" && walkNode.node.textContent.trim().length > 0)); + } + if (!passed) { + // Input nested in label and text before input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != 1) { + // label is before input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_before.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_before.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_before = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_before = { + id: "input_label_before", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_LabelBefore": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_before.html", + "Fail_1": "input_label_before.html", + "Fail_2": "input_label_before.html", + "group": "input_label_before.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Text input is nested in label such that input precedes the label text", + "Fail_2": "Label text is located after its associated text input or <select> element", + "group": "Text inputs and <select> elements must have a label before the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") { + return null; + } + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem == null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + if (value === -2) { + // ignore if no label or the content for the label is only from the nested input control + var text = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (text && text.trim().length > 0 && CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim() === text.trim()) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + // input nested in label + var passed = false; + var walkNode = ruleContext.previousSibling; + while (!passed && walkNode !== null) { + passed = ((walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0) + || (walkNode.nodeName.toLowerCase() == "span" && walkNode.textContent.trim().length > 0)); + walkNode = walkNode.previousSibling; + } + if (!passed) { + // Input nested in label and text after input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != -1) { + // label is after input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + // Haven't returned yet, then I pass + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_exists = { + id: "input_label_exists", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]", + //dependencies: ["aria_role_redundant", "aria_role_valid"], + refactor: { + "WCAG20_Input_ExplicitLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_exists.html", + "Fail_1": "input_label_exists.html", + "Fail_2": "input_label_exists.html", + "group": "input_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control element <{0}> has no associated label", + "Fail_2": "Form control with \"{0}\" role has no associated label", + "group": "Each form control must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: https://github.com/IBMa/equal-access/issues/756 + act: ["97a4e1", "e086e5"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) { + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Determine the input type + var passed = true; + var type = "text"; + if (nodeName == "input" && ruleContext.hasAttribute("type")) { + type = ruleContext.getAttribute("type").toLowerCase(); + } + else if (nodeName === "button" || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "button")) { + type = "buttonelem"; + } + if (nodeName == "input" && type == "") { + type = "text"; + } + if (type === "image") { + // Handled by input_label_existsImage + return null; + } + /** + let POF = -1; + let textTypes = CommonUtil.input_text_types; + let buttonTypes = CommonUtil.form_button_types; + + let buttonTypesWithDefaults = ["reset", "submit"]; // 'submit' and 'reset' have visible defaults. + if (textTypes.indexOf(type) !== -1) { // If type is in the list + // Get only the non-hidden labels for elements, in the case that a label is hidden then it is a violation + // Note: label[for] does not work for ARIA defined inputs + let labelElem = ruleContext.hasAttribute("role") ? null : CommonUtil.getLabelForElementHidden(ruleContext, true); + let hasLabelElemContent = false; + if (labelElem) { + if (CommonUtil.hasInnerContentHidden(labelElem)) { + hasLabelElemContent = true; + } else if ((labelElem.getAttribute("aria-label") || "").trim().length > 0) { + hasLabelElemContent = true; + } else if (labelElem.hasAttribute("aria-labelledby")) { + let labelledByElem = FragmentUtil.getById(labelElem, labelElem.getAttribute('aria-labelledby')); + if (labelledByElem && !DOMUtil.sameNode(labelledByElem, labelElem) && CommonUtil.hasInnerContent(labelledByElem)) { + hasLabelElemContent = true; + } + } + } + passed = (!!labelElem && hasLabelElemContent) || + (!labelElem && CommonUtil.attributeNonEmpty(ruleContext, "title") || CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) || + AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.hasImplicitLabel(ruleContext); + if (!passed) POF = 2 + textTypes.indexOf(type); + + } else if (buttonTypes.indexOf(type) !== -1) { // If type is a button + if (buttonTypesWithDefaults.indexOf(type) !== -1 && !ruleContext.hasAttribute("value")) { + // 'submit' and 'reset' have visible defaults so pass if there is no 'value' attribute + passed = true; + } else { + passed = CommonUtil.attributeNonEmpty(ruleContext, "value") || AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.indexOf(type); + } + } else if (type == "buttonelem") { + // If I am an image and I have alt text - accessibility-web-engine#269 + let bAlt = false; + if (ruleContext.nodeName.toLowerCase() === "img" && ruleContext.hasAttribute("alt")) { + let alt = ruleContext.getAttribute("alt"); + if (alt.trim().length === 0) { + bAlt = false; + } else { + bAlt = true; + } + }; + passed = CommonUtil.hasInnerContentHidden(ruleContext) || AriaUtil.hasAriaLabel(ruleContext) || bAlt || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 1; + } + + //check if a native button is labelled + if (!passed && nodeName == "button") { + if (CommonUtil.hasImplicitLabel(ruleContext)) + passed = true; + else { + let label = CommonUtil.getLabelForElement(ruleContext); + if (label && CommonUtil.hasInnerContentHidden(label)) + passed = true; + } + } + + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + if (!passed && (buttonTypes.indexOf(type) !== -1)) { + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class") == "dijitOffScreen" && DOMWalker.parentElement(ruleContext).hasAttribute("widgetid")) { + // Special handling for dijit buttons + let labelId = DOMWalker.parentElement(ruleContext).getAttribute("widgetid") + "_label"; + let label = FragmentUtil.getById(ruleContext, labelId); + if (label != null) { + passed = CommonUtil.hasInnerContentHidden(label); + // This means I failed above also + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 4 + buttonTypes.indexOf(type); + } + } + } + + if (!passed && nodeName == "optgroup") { + passed = CommonUtil.attributeNonEmpty(ruleContext, "label"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 2; + } + if (!passed && nodeName == "option") { + // Is a non-empty value attribute also enough for an option element? + passed = CommonUtil.attributeNonEmpty(ruleContext, "label") || ruleContext.innerHTML.trim().length > 0; + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 3; + } + + if (!passed) + passed = AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) { + // check aria role to figure out if the accessible name can be from content + const roles = AriaUtil.getRoles(ruleContext, true); + //when multiple roles specified, only the first valid role (guaranteed by dependencies) is applied, and the others just as fallbacks + if (ARIADefinitions.designPatterns[roles[0]] && ARIADefinitions.designPatterns[roles[0]].nameFrom && ARIADefinitions.designPatterns[roles[0]].nameFrom.includes("contents")) + passed = CommonUtil.hasInnerContentHidden(ruleContext); + } + */ + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + passed = pair && pair.name && pair.name.trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (ruleContext.hasAttribute("role") && ruleContext.getAttribute("role").trim().length > 0) { + return (0, IRule_1.RuleFail)("Fail_2", ruleContext.getAttribute("role").split(" ")); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_visible.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/input_label_visible.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_visible = { + id: "input_label_visible", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox", + dependencies: ["input_label_exists"], + refactor: { + "WCAG20_Input_VisibleLabel": { + "Pass_0": "pass", + "Potential_1": "potential_no_label", + "potential_placeholder_only": "potential_placeholder_only" + } + }, + help: { + "en-US": { + "pass": "input_label_visible.html", + "potential_placeholder_only": "input_label_visible.html", + "potential_no_label": "input_label_visible.html", + "group": "input_label_visible.html" + } + }, + messages: { + "en-US": { + "pass": "The input element has an associated visible label", + "potential_placeholder_only": "The ‘placeholder’ is the only visible label", + "potential_no_label": "The input element does not have an associated visible label", + "group": "An input element must have an associated visible label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.5.3", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // if a control is in a table cell, the col headers can act as visible label, which is checked in table heading rule + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table")) + return null; + // custom widget submission is not in scope for this success criteria (IBMa/equal-access#204) if it is not associated with data entry + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role && role === "button" && nodeName !== 'input' && nodeName !== 'button') { + // likely a custom widget, skip if not associated with data entry + if (!CommonUtil_1.CommonUtil.getAncestor(ruleContext, "form")) + return null; + } + // when in a combobox, only look at the input textbox. + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox") || + nodeName === "input" || (nodeName === "select" && AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")))) { + return null; + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + // check visible label for input or button + if (nodeName === 'input' || nodeName === 'button') { + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'internal' || pair.nameFrom === 'alt')) + return (0, IRule_1.RulePass)("pass"); + } + // check if an alternative tooltip exists that can be made visible through mouseover + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'text' || pair.nameFrom === 'title')) + return (0, IRule_1.RulePass)("pass"); + // check if any visible text from the control. + // note that (1) the text doesn’t need to be associated with the control to form a relationship + // (2) the text doesn't need to follow accessible name requirement (e.g. nameFrom) + var text = CommonUtil_1.CommonUtil.getOnScreenInnerText(ruleContext); + if (text && text.length !== 0) + return (0, IRule_1.RulePass)("pass"); + // check if any descendant with an alternative tooltip that can be made visible through mouseover + // only consider img and svg, and other text content of the descendant is covered in the isInnerText above + var descendants = AriaUtil_1.AriaUtil.getAllDescendantsWithRoles(ruleContext, ["img", "graphics-document", "graphics-object", "graphics-symbol"], false, true); + if (descendants && descendants.length > 0) { + for (var d = 0; d < descendants.length; d++) { + if (CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "title") || CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "alt")) + return (0, IRule_1.RulePass)("pass"); + } + } + // check if there is a visible label pointed to by the aria-labelledby attribute. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby")) { + var theLabel = ruleContext.getAttribute("aria-labelledby"); + var labelValues = theLabel.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById && !DOMUtil_1.DOMUtil.sameNode(elementById, ruleContext) && VisUtil_1.VisUtil.isNodeVisible(elementById) && CommonUtil_1.CommonUtil.hasInnerContentHidden(elementById)) { + return (0, IRule_1.RulePass)("pass"); + } + } + } + if ((nodeName === "optgroup" || nodeName == "option") && (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'content'))) + return (0, IRule_1.RulePass)("pass"); + // Determine if this is referenced by a combobox. If so, the label belongs to the combobox + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + // check if a placeholder exists even though a placeholder text is not sufficient as a visible text + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) + return (0, IRule_1.RulePotential)("potential_placeholder_only"); + return (0, IRule_1.RulePotential)("potential_no_label"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_onchange_review.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/input_onchange_review.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_onchange_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_onchange_review = { + id: "input_onchange_review", + context: "dom:input[onchange], dom:textarea[onchange], dom:select[onchange]", + refactor: { + "WCAG20_Input_HasOnchange": { + // "Pass_0": "pass", + "Potential_1": "potential_warning" + } + }, + help: { + "en-US": { + // "pass": "input_onchange_review.html", + "potential_warning": "input_onchange_review.html", + "group": "input_onchange_review.html" + } + }, + messages: { + "en-US": { + "group": "Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs", + // "pass": "The user is advised of the automatic form submission, new window opening, or focus change", + "potential_warning": "Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type === "hidden" || type === "submit" || type === "image" || type === "button" || type === "reset") + return null; + } + return (0, IRule_1.RulePotential)("potential_warning"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_placeholder_label_visible.ts" +/*!*********************************************************!*\ + !*** ./src/v4/rules/input_placeholder_label_visible.ts ***! + \*********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_placeholder_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_placeholder_label_visible = { + id: "input_placeholder_label_visible", + context: "dom:input[placeholder], dom:textarea[placeholder]", + refactor: { + "HAAC_Input_Placeholder": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_placeholder_label_visible.html", + "Potential_1": "input_placeholder_label_visible.html", + "Potential_2": "input_placeholder_label_visible.html", + "group": "input_placeholder_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "HTML5 placeholder is the only visible label", + "Potential_2": "Additional visible label referenced by 'aria-labelledby' is not valid", + "group": "HTML5 'placeholder' attribute must not be used as a visible label replacement" + } + }, + /** + * merge the rule into input_label_visible + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type == "hidden" || type == "button") { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("hidden")) { + var hidden = ruleContext.getAttribute("hidden"); + if (hidden == "" || hidden.toLowerCase() == "hidden") { // when hidden is empty in the element, "" is returned, same as it has a value of "". + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("aria-label")) { + return (0, IRule_1.RulePotential)("Potential_1"); + } + if (ruleContext.hasAttribute("aria-labelledby") && ruleContext.hasAttribute("id")) { + var id = ruleContext.getAttribute("id").trim(); + var refIds = ruleContext.getAttribute("aria-labelledby").trim().split(/\s+/); // separated by one or more white spaces + if (!refIds.includes(id)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_content_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/label_content_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.label_content_exists = { + id: "label_content_exists", + context: "dom:label", + refactor: { + "Valerie_Label_HasContent": { + "Pass_Regular": "Pass_Regular", + "Pass_AriaLabel": "Pass_AriaLabel", + "Pass_LabelledBy": "Pass_LabelledBy", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_Regular": "label_content_exists.html", + "Pass_AriaLabel": "label_content_exists.html", + "Pass_LabelledBy": "label_content_exists.html", + "Fail_1": "label_content_exists.html", + "group": "label_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_Regular": "<label> element has accessible name with inner content", + "Pass_AriaLabel": "<label> element has accessible name via 'aria-label'", + "Pass_LabelledBy": "<label> element has accessible name via 'aria-labelledby'", + "Fail_1": "The <label> element does not have descriptive text that identifies the expected input", + "group": "A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_Regular"); + } + else if ((ruleContext.getAttribute("aria-label") || "").trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_AriaLabel"); + } + else if (ruleContext.hasAttribute("aria-labelledby")) { + var labelElem = fragment_1.FragmentUtil.getById(ruleContext, ruleContext.getAttribute('aria-labelledby')); + if (labelElem && !DOMUtil_1.DOMUtil.sameNode(labelElem, ruleContext) && CommonUtil_1.CommonUtil.hasInnerContent(labelElem)) { + return (0, IRule_1.RulePass)("Pass_LabelledBy"); + } + } + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_name_visible.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/label_name_visible.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_name_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.label_name_visible = { + id: "label_name_visible", + context: "aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter", + refactor: { + "WCAG21_Label_Accessible": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "label_name_visible.html", + "Fail_1": "label_name_visible.html", + "group": "label_name_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Accessible name matches or contains the visible label text", + "Fail_1": "Accessible name does not match or contain the visible label text", + "group": "Accessible name must match or contain the visible label text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["2.5.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Review https://github.com/act-rules/act-rules.github.io/issues/1618 + // https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA24 + act: "2ee8b8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // pass if the visible text uses Material Icon font + if (CSSUtil_1.CSSUtil.isMaterialIconFont(ruleContext)) + return (0, IRule_1.RulePass)("Pass_0"); + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + var isInputButton = false; + //let buttonTypes = ["button", "reset", "submit"]; //"image" + var inputType = null; + if (nodeName === "input" && ruleContext.hasAttribute("type")) { + inputType = ruleContext.getAttribute("type").toLowerCase(); + if (CommonUtil_1.CommonUtil.form_button_types.indexOf(inputType) !== -1) { + isInputButton = true; + } + } + var theLabelBy = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-labelledby"); + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy) && !isInputButton) { + // skip the checks if it has an aria-labelledby since it takes precedence. + } + else { + var theLabel = null; + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy)) { + var labelValues = theLabelBy.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById) { + theLabel = CommonUtil_1.CommonUtil.getInnerText(elementById); + break; + } + } + } + else { + theLabel = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-label"); + } + if (!theLabel) { + return null; + } + var text = null; + if (isInputButton) { + /* Note: Disable the alt check in images until we get confirmation + if (inputType==="image" && ruleContext.hasAttribute("alt")){ + // use 'alt' attribute as visible text + text = ruleContext.getAttribute("alt"); + }else + */ + if (ruleContext.hasAttribute("value")) { + // use 'value' attribute as visible text + text = ruleContext.getAttribute("value"); + } + else { + // use default value + if (inputType === "submit" /*||inputType==="image"*/) { + text = "submit"; + } + else if (inputType === "reset") { + text = "reset"; + } + } + } + if (!text) { + // look for a <label> element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!labelElem) { + var parentNode = DOMWalker_1.DOMWalker.parentNode(ruleContext); + if (parentNode.nodeName.toLowerCase() === "label" /*&& RPTUtil.isFirstFormElement(parentNode, ruleContext)*/) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + labelElem = CommonUtil_1.CommonUtil.removeAllFormElementsFromLabel(parentClone); + } + } + var element = labelElem ? labelElem : ruleContext; + var elementsToSkipContentCheck = ["meter", "output", "progress", "select", "textarea"]; + if (!labelElem && elementsToSkipContentCheck.indexOf(nodeName) !== -1) { + text = ""; // skip content check for some elements + } + else { + // get the visible text only + text = CommonUtil_1.CommonUtil.getOnScreenInnerText(element); + } + /* Note: Disable this alt check in images for now until we get confirmation + // Look for the alt attribute of an image which is considered visible text. + let hasImgAlt = false; + if (element.firstChild != null) { + let nw = RPTUtil.new NodeWalker(element); + while (!hasImgAlt && nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + hasImgAlt = (nw.node.nodeName.toLowerCase() == "img" && RPTUtil.attributeNonEmpty(nw.node, "alt")); + if (hasImgAlt) { + text = text ? text + nw.node.getAttribute("alt") : nw.node.getAttribute("alt"); + } + } + } + */ + } + var nonalphanumeric = /[^a-zA-Z0-9]/g; + text = text.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedText = CommonUtil_1.CommonUtil.normalizeSpacing(text).toLowerCase(); // Leading and trailing whitespace and difference in case sensitivity should be ignored. + theLabel = theLabel.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(theLabel).toLowerCase(); + if (normalizedText.length > 1) { // skip non-text content. e.g., <button aria-label="close">X</button> + var location_1 = normalizedLabel.indexOf(normalizedText); + // Avoid matching partial words.e.g., text "name" should not match 'surname' or 'names' + if (location_1 >= 0 && normalizedLabel.length > normalizedText.length) { + var letters = /^[0-9a-zA-Z]+$/; + if ((location_1 + normalizedText.length) < normalizedLabel.length) { + // check ending + var theChar = normalizedLabel.charAt(location_1 + normalizedText.length); + if (theChar.match(letters)) { + passed = false; + } + } + if (passed && location_1 > 0) { + // check beginning + var theChar = normalizedLabel.charAt(location_1 - 1); + if (theChar.match(letters)) { + passed = false; + } + } + } + if (location_1 === -1) { // check that visible text content of the target is contained within its accessible name. + passed = false; + } + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_ref_valid.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/label_ref_valid.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.label_ref_valid = { + id: "label_ref_valid", + context: "dom:label[for]", + refactor: { + "WCAG20_Label_RefValid": { + "Pass_0": "pass", + "Fail_1": "fail_invalid" + } + }, + help: { + "en-US": { + "pass": "label_ref_valid.html", + "fail_invalid": "label_ref_valid.html", + "group": "label_ref_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element", + "fail_invalid": "The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element", + "group": "The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("for"); + var passed = false; + var target = fragment_1.FragmentUtil.getById(ruleContext, id); + if (target) { + // ignore if both label and control are invisible + if (!VisUtil_1.VisUtil.isNodeVisible(target) && !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + passed = true; + // handles null and undefined + if (!target.hasAttribute("role")) { + // Fail if we're pointing at something that is labelled by another mechanism + var nodeName = target.nodeName.toLowerCase(); + passed = nodeName == "input" || nodeName == "select" || nodeName == "textarea" + || nodeName == "button" || nodeName == "datalist" + || nodeName == "optgroup" || nodeName == "option" + || nodeName == "keygen" || nodeName == "output" + || nodeName == "progress" || nodeName == "meter" + || nodeName == "fieldset" || nodeName == "legend"; + if (target.nodeName.toLowerCase() == "input" && target.hasAttribute("type")) { + var type = target.getAttribute("type").toLowerCase(); + passed = type == "text" || type == "password" || type == "file" || + type == "checkbox" || type == "radio" || + type == "hidden" || type == "search" || type == "tel" || type == "url" || type == "email" || //HTML 5 + type == "date" || type == "number" || type == "range" || type == "image" || //HTML 5 + type == "time" || type == "color" || // HTML 5 + type == "datetime-local" || type == "month" || type == "week"; //HTML5.1 + } + } + // Add one more check to make sure the target element is NOT hidden, in the case the target is hidden + // flag a violation regardless of what the Check Hidden Content setting is. + if (passed && !VisUtil_1.VisUtil.isNodeVisible(target)) { + passed = false; + } + } + var retToken = []; + if (!passed) { + retToken.push(id); + } + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken]); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_invalid", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_children_valid.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/list_children_valid.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_children_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.list_children_valid = { + id: "list_children_valid", + context: "aria:group", + refactor: { + "HAAC_List_Group_ListItem": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_children_valid.html", + "Fail_1": "list_children_valid.html", + "group": "list_children_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "List component with \"group\" role has children that are not <listitem> elements", + "group": "List component with \"group\" role must limit children to <listitem> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parent = DOMWalker_1.DOMWalker.parentElement(ruleContext); + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(parent, "list")) { + return null; + } + var passed = true; + var children = ruleContext.children; + for (var i = 0; passed && i < children.length; i++) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "listitem"); + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_markup_review.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/list_markup_review.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_markup_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +// Matches unordered list item prefixes: •, ◦, ▪, ▸, ►, ✓, ✗, ✦, –, —, *, -, o +var UNORDERED_BULLET_PATTERN = /^[ \t]*[•◦▪▸►✓✗✦\-–—*o][ \t]+\S/; +// Matches ordered list item prefixes: 1. 1) (1) a. a) (a) A. A) i. ii. iii. etc. +var ORDERED_ITEM_PATTERN = /^[ \t]*(?:\(?\d+[.)]\)?|\(?[a-zA-Z][.)]\)?|\(?(?:i{1,3}|iv|vi{0,3}|ix|xi{0,3}|xiv|xv)[.)]\)?)[ \t]+\S/i; +var LIST_ITEM_PATTERN = new RegExp(UNORDERED_BULLET_PATTERN.source + "|" + ORDERED_ITEM_PATTERN.source, "i"); +// Block-level elements that act as boundaries between independent content groups +var BLOCK_ELEMENTS = new Set([ + "blockquote", "center", "dir", "div", "form", + "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "br", "menu", "p", "pre", "table", + "section", "article", "aside", "nav", "header", "footer", + "figure", "figcaption", "details", "summary", "dialog", + "script", "style", "label", + "ul", "ol", "dl", "li", "dt", "dd" +]); +// Inline elements whose text content is treated as part of the surrounding text run +var INLINE_ELEMENTS = new Set([ + "a", "abbr", "acronym", "b", "bdo", "big", "br", "button", "cite", + "code", "dfn", "em", "i", "img", "input", "kbd", "label", "map", + "object", "output", "q", "samp", "select", "small", "span", + "strong", "sub", "sup", "textarea", "time", "tt", "u", "var" +]); +// Returns the combined text of a node and its inline descendants, normalised to single spaces +function getShallowText(node) { + var text = ""; + node.childNodes.forEach(function (child) { + var _a; + if (child.nodeType === Node.TEXT_NODE) { + text += (_a = child.nodeValue) !== null && _a !== void 0 ? _a : ""; + } + else if (child.nodeType === Node.ELEMENT_NODE) { + var tag = child.nodeName.toLowerCase(); + if (INLINE_ELEMENTS.has(tag)) { + text += getShallowText(child); + } + } + }); + return text.replace(/\s+/g, " "); +} +// Returns trimmed non-empty lines from a node, splitting on newlines and <br> boundaries +function getLinesFromNode(node) { + var lines = []; + function walk(n) { + var _a; + if (n.nodeType === Node.TEXT_NODE) { + ((_a = n.nodeValue) !== null && _a !== void 0 ? _a : "").split(/\r?\n/).forEach(function (p) { + var trimmed = p.trim(); + if (trimmed.length > 0) + lines.push(trimmed); + }); + } + else if (n.nodeType === Node.ELEMENT_NODE) { + var elem = n; + var tag = elem.nodeName.toLowerCase(); + if (tag === "br") { + lines.push("\x00"); + return; + } + if (BLOCK_ELEMENTS.has(tag)) + return; + // Skip elements with list-related or widget roles + var role = elem.getAttribute("role"); + if (role) { + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(elem, ["widget"]); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "rowheader"], roles); + if (roles.length > 0) + return; + } + n.childNodes.forEach(walk); + } + } + walk(node); + return lines.filter(function (l) { return l !== "\x00"; }); +} +// Returns the maximum number of consecutive list-item-like lines found among +// the direct children of parent, treating <br> and whitespace-only text as separators +function maxConsecutiveListItems(parent) { + var maxRun = 0; + var currentRun = 0; + var currentLineText = ""; // accumulate text across inline siblings until <br> + parent.childNodes.forEach(function (child) { + var _a; + var tag = child.nodeName.toLowerCase(); + if (tag === "br") { + // test the accumulated line + var trimmed_1 = currentLineText.trim(); + if (trimmed_1.length > 0) { + if (LIST_ITEM_PATTERN.test(trimmed_1)) { + maxRun = Math.max(maxRun, ++currentRun); + } + else { + currentRun = 0; + } + } + currentLineText = ""; + return; + } + if (child.nodeType === Node.TEXT_NODE) { + var raw = (_a = child.nodeValue) !== null && _a !== void 0 ? _a : ""; + if (raw.trim().length === 0) + return; + // if there are embedded newlines, flush on each + var segs = raw.split(/\r?\n/); + segs.forEach(function (seg, i) { + if (i > 0) { + var trimmed_2 = currentLineText.trim(); + if (trimmed_2.length > 0) { + if (LIST_ITEM_PATTERN.test(trimmed_2)) { + maxRun = Math.max(maxRun, ++currentRun); + } + else { + currentRun = 0; + } + } + currentLineText = ""; + } + currentLineText += seg; + }); + return; + } + if (child.nodeType === Node.ELEMENT_NODE) { + var elem = child; + if (BLOCK_ELEMENTS.has(tag)) { + // flush current line before block boundary + var trimmed_3 = currentLineText.trim(); + if (trimmed_3.length > 0 && LIST_ITEM_PATTERN.test(trimmed_3)) { + maxRun = Math.max(maxRun, ++currentRun); + } + currentLineText = ""; + currentRun = 0; + return; + } + if (INLINE_ELEMENTS.has(tag)) { + currentLineText += getShallowText(elem); + } + else { + currentRun = 0; + currentLineText = ""; + } + } + }); + // flush any remaining line at end of container + var trimmed = currentLineText.trim(); + if (trimmed.length > 0 && LIST_ITEM_PATTERN.test(trimmed)) { + maxRun = Math.max(maxRun, ++currentRun); + } + return maxRun; +} +// Returns true if 2+ consecutive <br>-separated lines within element match the list-item pattern +function hasBrSeparatedListLines(element) { + var run = 0; + for (var _i = 0, _a = getLinesFromNode(element); _i < _a.length; _i++) { + var line = _a[_i]; + if (LIST_ITEM_PATTERN.test(line)) { + if (++run >= 2) + return true; + } + else { + run = 0; + } + } + return false; +} +exports.list_markup_review = { + id: "list_markup_review", + context: "dom:*", + refactor: { + "RPT_List_UseMarkup": { + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "potential_list": "list_markup_review.html", + "group": "list_markup_review.html" + } + }, + messages: { + "en-US": { + "potential_list": "Verify this is a list and if so, modify to use proper HTML elements for the list", + "group": "Proper HTML elements should be used to create a list" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "style", "label"]) !== null) + return null; + // Only check block-level and table-cell elements first — + // td/th must be checked before the ancestor role check since + // table/row/cell ARIA roles would otherwise cause an early exit + if (nodeName === "td" || nodeName === "th") { + if (maxConsecutiveListItems(ruleContext) >= 2) + return (0, IRule_1.RulePotential)("potential_list"); + if (hasBrSeparatedListLines(ruleContext)) + return (0, IRule_1.RulePotential)("potential_list"); + return null; + } + // Skip elements that already have semantic list, widget, or structural roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget"]); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "rowheader"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + // Only check block-level elements to avoid duplicate reports + if (!BLOCK_ELEMENTS.has(nodeName) && nodeName !== "body" && nodeName !== "li") + return null; + if (["ul", "ol", "dl", "menu"].includes(nodeName)) + return null; + if (maxConsecutiveListItems(ruleContext) >= 2) + return (0, IRule_1.RulePotential)("potential_list"); + if (hasBrSeparatedListLines(ruleContext)) + return (0, IRule_1.RulePotential)("potential_list"); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_structure_proper.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/list_structure_proper.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_structure_proper = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.list_structure_proper = { + id: "list_structure_proper", + context: "dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt", + refactor: { + "RPT_List_Misuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_structure_proper.html", + "Potential_1": "list_structure_proper.html", + "group": "list_structure_proper.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "List element is missing or improperly structured", + "group": "List elements should only be used for lists of related items" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Get all the childrens of the ruleContext + var children = ruleContext.children; + if (nodeName == "dl") { + var first = ""; + var last = ""; + var walkChildren = ruleContext.firstChild; + passed = true; + var presentationalFound = false; + // If there are no childrens set as passed, since dl elements can have + // zero or more of: one or more dt elements, followed by one or more dd elements + if (!ruleContext.children || ruleContext.children.length == 0) { + passed = true; + } + else { + while (passed && walkChildren != null) { + if (walkChildren.nodeType == 1) { + var nodeName_1 = walkChildren.nodeName.toLowerCase(); + // While walking through the elements under dl, if we find a + // presentational element we move to the next element as presentational + // elements are allowed under list elements as they are only for + // formatting text nodes. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Only set to pass if we find dd or dt element, in the case of + // an element that is not supported we will catch it here. i.e. img + // element + passed = nodeName_1 == "dd" || nodeName_1 == "dt"; + // Set the first and last node depending on which is found first and last + if (first == "") + first = nodeName_1; + last = nodeName_1; + } + walkChildren = walkChildren.nextSibling; + } + // In the case that we have found dt and dd elements under dl we pass right away. + // In the case that there is no dt or dd element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && first == "dt" && last == "dd") || (passed && presentationalFound); + } + } + else if (nodeName == "li") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["ul", "ol", "dir", "menu"]) != null; + } + else if (nodeName == "dd" || nodeName == "dt") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "dl") != null; + } + else { + var walkChildren = ruleContext.firstChild; + // Zero or more li elements are permitted inside of <ol>, <ul> or <menu> elements now as per the html5 spec. This handles the case + // when there are zero elements under the <ol>, <ul> or <menu>. + if ((nodeName == "ul" || nodeName == "ol" || nodeName == "menu") && (!ruleContext.children || ruleContext.children.length == 0)) { + passed = true; + } + else { + var liFound = false; + var presentationalFound = false; + passed = true; + while (passed && walkChildren != null) { + // While walking through the list elements, if we find a + // presentational element we skip checking as presentational + // elements are allowed under list elements as they are only for + // formatting text. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Pass if the node type is anything but 1, or in the case that it is a li element. For any other node + // it will be caught here that element is not allowed under list node. + // Furthermore in the case that there is a template element with the parent being ul/ol don't flag a violation + passed = walkChildren.nodeType != 1 || walkChildren.nodeName.toLowerCase() == "li" || (walkChildren.nodeName.toLowerCase() == "template" && (nodeName == "ul" || nodeName == "ol")); + // Set li found to true if the current element (nodeType=1) is an li element + liFound = liFound || (walkChildren.nodeType == 1 && walkChildren.nodeName.toLowerCase() == "li"); + walkChildren = walkChildren.nextSibling; + } + // In the case that it has passed and also li element is found under list node, we pass right away. + // In the case that there is no li element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && liFound) || (passed && presentationalFound); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/marquee_elem_avoid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/marquee_elem_avoid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.marquee_elem_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.marquee_elem_avoid = { + id: "marquee_elem_avoid", + context: "dom:marquee", + refactor: { + "RPT_Marquee_Trigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Fail_1": "marquee_elem_avoid.html", + "group": "marquee_elem_avoid.html" + } + }, + messages: { + "en-US": { + "Fail_1": "Scrolling content found that uses the obsolete <marquee> element", + "group": "The <marquee> element is obsolete and should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_alt_brief.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/media_alt_brief.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_brief = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_brief = { + id: "media_alt_brief", + context: "dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]", + refactor: { + "RPT_Media_AltBrief": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_brief.html", + "Potential_1": "media_alt_brief.html", + "group": "media_alt_brief.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Text alternative is more than 150 characters", + "group": "Alternative text in 'alt' attribute should be brief (<150 characters)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + maxAlt: { + value: 150, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var altLength = ruleContext.getAttribute("alt").trim().length; + var passed = altLength <= validateParams.maxAlt.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_alt_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/media_alt_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_exists = { + id: "media_alt_exists", + context: "dom:area[alt], dom:embed[alt]", + refactor: { + "RPT_Media_AudioVideoAltFilename": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_exists.html", + "Potential_1": "media_alt_exists.html", + "group": "media_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Filename used as label for embedded audio or video", + "group": "Audio or video on the page must have a short text alternative that describes the media content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var uri = ""; + if (ruleContext.nodeName.toLowerCase() == "area") { + uri = ruleContext.getAttribute("href"); + } + else { + uri = ruleContext.getAttribute("src"); + } + if (uri == null) + uri = ""; + var ext = CommonUtil_1.CommonUtil.getFileExt(uri); + var isAudVid = ext.length != 0 && (CommonUtil_1.CommonUtil.isAudioExt(ext) || CommonUtil_1.CommonUtil.isVideoExt(ext)); + var altText = ruleContext.getAttribute("alt"); + var passed = !isAudVid || (altText.length > 0 && altText.indexOf(ext) == -1); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_audio_transcribed.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/media_audio_transcribed.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_audio_transcribed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_audio_transcribed = { + id: "media_audio_transcribed", + context: "dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object", + refactor: { + "RPT_Media_AudioTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_audio_transcribed.html", + "group": "media_audio_transcribed.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Provide transcripts for audio files", + "group": "Audio information should also be available in text form" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed; + var thisNode = ruleContext.nodeName.toLowerCase(); + if (thisNode == "bgsound") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isAudioObjEmbedLink(ruleContext); + } + if (passed) + return null; // Out of Scope + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_autostart_controllable.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/media_autostart_controllable.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_autostart_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.media_autostart_controllable = { + id: "media_autostart_controllable", + context: "dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound", + refactor: { + "RPT_Embed_AutoStart": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_autostart_controllable.html", + "Potential_1": "media_autostart_controllable.html", + "group": "media_autostart_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically", + "group": "Mechanism must be available to pause or stop and control the volume of the audio that plays automatically" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed; + if (nodeName == "bgsound") { + passed = false; + } + else if (nodeName == "param") { + var content = ""; + if (ruleContext.hasAttribute("value")) + content = ruleContext.getAttribute("value").toLowerCase(); + passed = content.indexOf("0;") == 0 || + !(content.indexOf("true") != -1 || content.indexOf("1") != -1); + } + else if (nodeName == "embed") { + passed = true; + if (ruleContext.hasAttribute("flashvars")) { + var str = ruleContext.getAttribute("flashvars"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + if (passed && ruleContext.hasAttribute("src")) { + var str = ruleContext.getAttribute("src"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + } + if (passed && ruleContext.hasAttribute("autostart")) { + var val = ruleContext.getAttribute("autostart").toLowerCase(); + passed = val != 'true' && val != '1'; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_keyboard_controllable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/media_keyboard_controllable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_keyboard_controllable = { + id: "media_keyboard_controllable", + context: "dom:audio, dom:video", + refactor: { + "HAAC_Audio_Video_Trigger": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_keyboard_controllable.html", + "Manual_1": "media_keyboard_controllable.html", + "group": "media_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify media using <audio> and/or <video> elements have keyboard accessible controls", + "group": "Media using <audio> and/or <video> elements must have keyboard accessible controls" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName == "audio" || nodeName === "video") { + passed = false; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_live_captioned.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/media_live_captioned.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_live_captioned = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.media_live_captioned = { + id: "media_live_captioned", + context: "dom:embed, dom:object", + refactor: { + "RPT_Media_VideoObjectTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_live_captioned.html", + "group": "media_live_captioned.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify captions are provided for live media (streaming video with audio)", + "group": "Live media (streaming video with audio) should have captions for audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_track_available.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/media_track_available.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_track_available = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_track_available = { + id: "media_track_available", + context: "dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object", + refactor: { + "RPT_Media_VideoReferenceTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_track_available.html", + "group": "media_track_available.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify availability of a user-selectable audio track with description of visual content", + "group": "Pre-recorded media should have an audio track that describes visual information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.3", "1.2.5"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName == "applet") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_redirect_optional.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/meta_redirect_optional.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_redirect_optional = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.meta_redirect_optional = { + id: "meta_redirect_optional", + context: "dom:meta[http-equiv][content]", + refactor: { + "WCAG20_Meta_RedirectZero": { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "fail_longrefresh" + } + }, + help: { + "en-US": { + "group": "meta_redirect_optional.html", + "pass": "meta_redirect_optional.html", + "fail": "meta_redirect_optional.html", + "fail_longrefresh": "meta_redirect_optional.html" + } + }, + messages: { + "en-US": { + "group": "Page should not automatically refresh without warning or option to turn it off or adjust the time limit", + "pass": "Rule Passed", + "fail": "Check page does not automatically refresh without warning or options", + "fail_longrefresh": "Check page does not automatically refresh without warning or options" + } + }, + /** + * deprecate WCAG AAA + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.4", "3.2.5"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }], + */ + rulesets: [{ + "id": [], + "num": ["2.2.4", "3.2.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + // Removed ACT bisz58 AAA + /**act: [{ + "bc659a" : { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "pass" + } + }],*/ + act: ["bisz58"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') { + return null; + } + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed or failed: only the first one tridders if multiple + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_redirect_optional_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_redirect_optional_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + else if (time < 72001) + return (0, IRule_1.RuleFail)("fail"); + return (0, IRule_1.RuleFail)("fail_longrefresh"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_refresh_delay.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/meta_refresh_delay.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_refresh_delay = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.meta_refresh_delay = { + id: "meta_refresh_delay", + context: "dom:meta[http-equiv][content]", + refactor: { + "RPT_Meta_Refresh": { + "Pass_0": "pass", + "Potential_1": "potential_refresh" + } + }, + help: { + "en-US": { + "group": "meta_refresh_delay.html", + "pass": "meta_refresh_delay.html", + "potential_refresh": "meta_refresh_delay.html" + } + }, + messages: { + "en-US": { + "group": "Pages should not refresh automatically", + "pass": "Pages do not refresh automatically", + "potential_refresh": "Verify page is not being caused to refresh automatically", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + //act: [ "bisz58", "bc659a" ], + act: ["bc659a"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed: the first one takes priority + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_refresh_delay_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_refresh_delay_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_refresh"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_viewport_zoomable.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/meta_viewport_zoomable.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_viewport_zoomable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.meta_viewport_zoomable = { + id: "meta_viewport_zoomable", + context: "dom:meta[name][content]", + refactor: { + "meta_viewport_zoom": { + "Pass_0": "pass", + "Potential_1": "potential_zoomable" + } + }, + help: { + "en-US": { + "group": "meta_viewport_zoomable.html", + "pass": "meta_viewport_zoomable.html", + "potential_zoomable": "meta_viewport_zoomable.html" + } + }, + messages: { + "en-US": { + "group": "The 'meta[name=viewport]' should not prevent the browser zooming the content", + "pass": "The 'meta[name=viewport]' does not prevent the browser zooming the content", + "potential_zoomable": "Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "b4f0c3": { + "pass": "pass", + "potential_zoomable": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("name").toLowerCase() !== 'viewport') + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + // neither maximum-scale nor user-scalable (default yes) + if (!content || content.trim() === '' || (!content.includes('maximum-scale') && !content.includes('user-scalable'))) + return null; + var user_msg = null; + var max_msg = null; + var props = content.split(","); + var user_scale_value = 'yes'; + var maximum_scale_value = '2.0'; + for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { + var prop = props_1[_i]; + var pieces = prop.trim().split('='); + if (pieces.length < 2) + continue; + if (prop.includes('user-scalable')) { + user_msg = prop; + user_scale_value = pieces[1].trim(); + if (user_scale_value.startsWith("'") || user_scale_value.startsWith('"')) { + user_scale_value = user_scale_value.substring(1, user_scale_value.length - 1); + } + } + else if (prop.includes('maximum-scale')) { + max_msg = prop; + maximum_scale_value = pieces[1].trim(); + if (maximum_scale_value.startsWith("'") || maximum_scale_value.startsWith('"')) { + maximum_scale_value = maximum_scale_value.substring(1, maximum_scale_value.length - 1).trim(); + } + } + } + var value = Number(user_scale_value); + if (!isNaN(value)) { + if (value >= 1 || value <= -1) + user_scale_value = 'yes'; + } + var maximum_scale = 2.0; + value = Number(maximum_scale_value); + if (!isNaN(value)) { + if (value < 0) + maximum_scale = 2.0; + else + maximum_scale = value; + } + else { + if (maximum_scale_value === 'yes') + maximum_scale = 1.0; + else + maximum_scale = 0.1; + } + // user-scalable is not set to 'yes', ignore maximum_scale + if (user_scale_value !== 'yes') { + return (0, IRule_1.RulePotential)("potential_zoomable", [user_msg]); + } + // user-scalable is 'yes', but maximum_scale is too small + if (maximum_scale < 2.0) { + return (0, IRule_1.RulePotential)("potential_zoomable", [max_msg]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/noembed_content_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/noembed_content_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.noembed_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.noembed_content_exists = { + id: "noembed_content_exists", + context: "dom:noembed", + refactor: { + "Valerie_Noembed_HasContent": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "noembed_content_exists.html", + "Potential_1": "noembed_content_exists.html", + "group": "noembed_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Add descriptive text to the <noembed> element", + "group": "<noembed> elements should contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/object_text_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/object_text_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.object_text_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.object_text_exists = { + id: "object_text_exists", + context: "dom:object", + refactor: { + "WCAG20_Object_HasText": { + "pass": "pass", + "fail_no_text_alternative": "fail_no_text_alternative" + } + }, + help: { + "en-US": { + "group": "object_text_exists.html", + "pass": "object_text_exists.html", + "fail_no_text_alternative": "object_text_exists.html" + } + }, + messages: { + "en-US": { + "group": "<object> element must have a text alternative for the content rendered by the object", + "pass": "<object> element has a text alternative", + "fail_no_text_alternative": "An <object> element does not have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "8fc3b6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Detect if this object is of type text, by checking the object type in the case it is text then do not trigger this rule + if (ruleContext.hasAttribute("type") && (ruleContext.getAttribute("type")).indexOf("text") !== -1) { + return null; + } + // ignore if an explicit role is specified: including 'presentation', 'none', 'application', 'document' or 'img' + // this case will be covered in other rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + // Per ACT, ignore embedded HTML files + var data = ruleContext.getAttribute("data"); + var ext = data && typeof data === typeof "" ? data.substring(data.lastIndexOf(".")) : ""; + if (ext === ".html" || ext === ".htm") { + return null; + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //let passed = ARIAMapper.computeName(ruleContext).trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_no_text_alternative"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/page_title_exists.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/page_title_exists.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +exports.page_title_exists = { + id: "page_title_exists", + context: "dom:html", + refactor: { + "WCAG20_Doc_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "page_title_exists.html", + "Pass_0": "page_title_exists.html", + "Fail_1": "page_title_exists.html", + "Fail_2": "page_title_exists.html", + "Fail_3": "page_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "The page should have a title that correctly identifies the subject of the page", + "Pass_0": "Rule Passed", + "Fail_1": "Missing <head> element so there can be no <title> element present", + "Fail_2": "Missing <title> element in <head> element", + "Fail_3": "The <title> element is empty (no innerHTML)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "2779a5": { + "Pass_0": "pass", + "Fail_1": "pass", + "Fail_2": "fail", + "Fail_3": "fail" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // First, find the head element + var findHead = ruleContext.firstChild; + var findTitle = null; + while (findHead != null) { + if (findHead.nodeName.toLowerCase() == "head") + break; + findHead = findHead.nextSibling; + } + var possibleTitles = ruleContext.querySelectorAll("title"); + for (var idx = 0; idx < possibleTitles.length; ++idx) { + if (!CommonUtil_1.CommonUtil.getAncestor(possibleTitles[idx], ["svg"])) { + findTitle = possibleTitles[idx]; + break; + } + } + if (findHead === null) { + if (!findTitle) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + if (findTitle === null) { // don't have title second PoF + return (0, IRule_1.RuleFail)("Fail_2"); + } + // if we get here we have <head> and <title> + if (findTitle != null && CommonUtil_1.CommonUtil.getInnerText(findTitle).trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { // <title> has no innerHTML third PoF + return (0, IRule_1.RuleFail)("Fail_3"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/page_title_valid.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/page_title_valid.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.page_title_valid = { + id: "page_title_valid", + context: "dom:head dom:title", + refactor: { + "RPT_Title_Valid": { + "Pass_0": "Pass_0", + // "Fail_1": "Fail_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "page_title_valid.html", + // "Fail_1": "page_title_valid.html", + "Potential_2": "page_title_valid.html", + "group": "page_title_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + // "Fail_1": "Page <title> is empty", + "Potential_2": "Verify that using the filename as the page <title> value is descriptive", + "group": "Page <title> should be a descriptive title, rather than a filename" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var titleStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim(); + // allow .com, .net and .org + var titleStrLowercase = titleStr.toLowerCase(); + if (titleStrLowercase.includes(".com") || titleStrLowercase.includes(".net") || titleStrLowercase.includes(".org")) { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + if (titleStr.length === 0) { + // This is covered by page_title_exists + return null; //RuleFail("Fail_1"); + } + else { + var passed = !/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(titleStr); + if (!passed) { + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_focus_blur_review.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/script_focus_blur_review.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_focus_blur_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_focus_blur_review = { + id: "script_focus_blur_review", + context: "dom:*[onfocus]", + refactor: { + "WCAG20_Script_FocusBlurs": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_focus_blur_review.html", + "Potential_1": "script_focus_blur_review.html", + "group": "script_focus_blur_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify script does not remove focus from content that normally receives focus", + "group": "Scripting must not remove focus from content that normally receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.7", "3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onfocus").indexOf(".blur(") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_onclick_avoid.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/script_onclick_avoid.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_avoid = { + id: "script_onclick_avoid", + context: "dom:*[onclick]", + dependencies: ["script_onclick_misuse"], + refactor: { + "RPT_Script_OnclickHTML2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_avoid.html", + "Potential_1": "script_onclick_avoid.html", + "group": "script_onclick_avoid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that 'onclick' events are not used in script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + // If there's an aria-role specified, don't trigger this. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role")) + return (0, IRule_1.RulePass)("Pass_0"); + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = nodeName == "a" || nodeName == "area" || nodeName == "input"; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_onclick_misuse.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/script_onclick_misuse.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_misuse = { + id: "script_onclick_misuse", + context: "dom:*[onclick]", + refactor: { + "RPT_Script_OnclickHTML1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_misuse.html", + "Potential_1": "script_onclick_misuse.html", + "group": "script_onclick_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Possible use of a script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + failSubstring: { + value: [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml", + "location.href"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // If there's an aria-role specified, don't trigger this. + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role"); + // If this is an a or area, don't trigger if there's an href. + var nodeName = ruleContext.nodeName.toLowerCase(); + passed = passed || ((nodeName == "a" || nodeName == "area") && CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href")); + // If the guards failed, check to see if they're looking at links + if (!passed) { + var failSubstring = validateParams.failSubstring.value; + ; + var onclick_1 = ruleContext.getAttribute("onclick").toLowerCase(); + passed = true; + for (var i = 0; passed && i < failSubstring.length; ++i) { + passed = onclick_1.indexOf(failSubstring[i]) == -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_select_review.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/script_select_review.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_select_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_select_review = { + id: "script_select_review", + context: "dom:select", + refactor: { + "WCAG20_Select_NoChangeAction": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_select_review.html", + "Potential_1": "script_select_review.html", + "group": "script_select_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that no change of context or action occurs when selection options in this component receive focus", + "group": "No changes of context should occur when a selection value receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !ruleContext.hasAttribute("onchange") && !ruleContext.hasAttribute("onfocus"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/select_options_grouped.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/select_options_grouped.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.select_options_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.select_options_grouped = { + id: "select_options_grouped", + context: "dom:select", + refactor: { + "WCAG20_Select_HasOptGroup": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "select_options_grouped.html", + "Potential_1": "select_options_grouped.html", + "group": "select_options_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Group of related options may need <optgroup>", + "group": "Groups of related options within a selection list should be grouped with <optgroup>" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramNumOptions: { + value: 10, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + // Handle the cases where optgroup is hidden, which should trigger a violations + // but in the case that Check hidden option is set then should not trigger a violation. + var passed = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "optgroup", false, true).length > 0 || + CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "option", false, true).length <= + validateParams.paramNumOptions.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/skip_main_described.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/skip_main_described.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_described = { + id: "skip_main_described", + context: "dom:body", + dependencies: ["skip_main_exists"], + refactor: { + "WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_described.html", + "Potential_1": "skip_main_described.html", + "group": "skip_main_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that if this hyperlink skips content, the description communicates where it links to", + "group": "The description of a hyperlink used to skip content must communicate where it links to" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramSkipText: { + value: ["skip", "jump"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var links = doc.links; + // Skip link should be the first one on the page with an href attribute (i.e., links[0]) + // also if the first link is hidden then we should also trigger a violation. + if (links && links.length > 0 && VisUtil_1.VisUtil.isNodeVisible(links[0])) { + var testText = CommonUtil_1.CommonUtil.getInnerText(doc.links[0]).toLowerCase(); + for (var i = 0; !passed && i < validateParams.paramSkipText.value.length; ++i) { + passed = testText.indexOf(validateParams.paramSkipText.value[i]) != -1; + } + } + else + passed = false; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/skip_main_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/skip_main_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_exists = { + id: "skip_main_exists", + context: "dom:body", + refactor: { + "WCAG20_Body_FirstASkips_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_exists.html", + "Fail_1": "skip_main_exists.html", + "group": "skip_main_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The page does not provide a way to quickly navigate to the main content (ARIA \"main\" landmark or a skip link)", + "group": "Pages must provide a way to skip directly to the main content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + // Skip anchor should be the first one on the page with an href attribute + var testAnchor = null; + for (var i = 0; i < anchors.length; ++i) { + if (anchors[i].hasAttribute("href") && VisUtil_1.VisUtil.isNodeVisible(anchors[i])) { + testAnchor = anchors[i]; + break; + } + } + // Pull out the target id + var targetId = null; + if (testAnchor != null) { + var hrefStr = testAnchor.getAttribute("href"); + var idx = hrefStr.indexOf("#"); + if (idx != -1) { + targetId = hrefStr.substring(idx + 1); + } + } + // Determine if there is an element id or named anchor on the page with this + // target id. + if (targetId != null) { + passed = doc.getElementById(targetId) != null; + for (var i = 0; !passed && i < anchors.length; ++i) { + if (!anchors[i].hasAttribute("href") && + anchors[i].hasAttribute("name") && + anchors[i].getAttribute("name") == targetId) { + passed = true; + } + } + } + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_background_decorative.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/style_background_decorative.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_background_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_background_decorative = { + id: "style_background_decorative", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Style_BackgroundImage": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_background_decorative.html", + "Potential_1": "style_background_decorative.html", + "group": "style_background_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the CSS background image does not convey important information", + "group": "Images included by using CSS alone must not convey important information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet") { + // External stylesheet - trigger + passed = CommonUtil_1.CommonUtil.triggerOnce(ruleContext, "style_background_decorative", false); + } + if (passed && nodeName === "style" || ruleContext.hasAttribute("style")) { + var styleText = void 0; + if (nodeName === "style") + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + else + styleText = ruleContext.getAttribute("style"); + var bgMatches = styleText.match(/background:[^;]*/g); + if (bgMatches !== null) { + for (var i = 0; passed && i < bgMatches.length; ++i) + passed = bgMatches[i].indexOf("url(") === -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_before_after_review.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/style_before_after_review.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_before_after_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +/** + * Description: Trigger if :before and :after are used in CSS (Internal and External) with content + * Origin: WCAG 2.0 F87 + */ +exports.style_before_after_review = { + id: "style_before_after_review", + context: "dom:style, dom:link", + refactor: { + "WCAG20_Style_BeforeAfter": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_before_after_review.html", + "Pass_0": "style_before_after_review.html", + "Potential_1": "style_before_after_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content", + "Pass_0": "Rule Passed", + "Potential_1": "Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content" + } + }, + rulesets: [{ + // Turn off the rule due to the obsolete requirement + //id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + id: [], + num: "1.3.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + //check Internal styles + if (ruleContext.nodeName.toLowerCase() === "style") { + var css = CSSUtil_1.CSSUtil.getCSSStyle(ruleContext); + for (var i = 0; passed && i < css.length; ++i) { + // Guard against bad CSS + if (css[i].selector) { + passed = (css[i].selector.indexOf(":before") === -1 && css[i].selector.indexOf(":after") === -1) || + !("content" in css[i].values) || css[i].values["content"].trim().length === 0 || css[i].values["content"].trim() === "\"\"" + || css[i].values["content"].trim() === "\'\'" || css[i].values["content"].trim() === "none" || css[i].values["content"].trim() === "attr(x)" + || css[i].values["content"].trim() === "attr(y)"; + } + } + // check special rules in the stylesheets + if (passed) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + // check @media rules + // + // The check 'if (styleRule instanceof CSSMediaRule)' doesn't work when run in Karma(but works in DAP) + // so let's access the type directly as a workaround + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var styleMediaRule = styleRule; + var mediaRules = styleMediaRule.cssRules; + if (mediaRules) { + for (var rIndex = 0; passed && rIndex < mediaRules.length; rIndex++) { + var mRule = mediaRules[rIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + // check import rules + else if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var rules = styleImportRule.styleSheet.cssRules ? + styleImportRule.styleSheet.cssRules : + styleImportRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + // check @media rules + if (importedRule.type && importedRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = importedRule.cssRules; + if (mediaRules) { + for (var mIndex = 0; mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (importedRule.selectorText !== null && importedRule.selectorText !== undefined) { + var rule = importedRule.selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = importedRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + } + //check external styles + if (ruleContext.nodeName.toLowerCase() === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check @media rules + if (ruleFromLink.type && ruleFromLink.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = ruleFromLink.cssRules; + if (mediaRules) { + for (var mIndex = 0; passed && mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var ruleSelTxt = mRule.selectorText.toLowerCase(); + if (ruleSelTxt.indexOf(":before") !== -1 || ruleSelTxt.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (rules[rIndex].selectorText !== null && rules[rIndex].selectorText !== undefined) { + var rule = rules[rIndex].selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = rules[rIndex].style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_color_misuse.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/style_color_misuse.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_color_misuse = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_color_misuse = { + id: "style_color_misuse", + context: "dom:style, dom:*[style], dom:font[color], dom:link", + refactor: { + "RPT_Style_ColorSemantics1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_color_misuse.html", + "Pass_0": "style_color_misuse.html", + "Potential_1": "style_color_misuse.html" + } + }, + messages: { + "en-US": { + "group": "Combine color and descriptive markup to convey information", + "Pass_0": "Rule Passed", + "Potential_1": "Verify color is not used as the only visual means of conveying information" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var importRules = styleImportRule.styleSheet.cssRules ? styleImportRule.styleSheet.cssRules : styleImportRule.styleSheet.rules; + for (var rIndex = 0; rIndex < importRules.length; rIndex++) { + var iRule = importRules[rIndex]; + styleText += iRule.cssText; + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + else if (ruleContext.hasAttribute("style")) { + styleText = ruleContext.getAttribute("style").toLowerCase(); + } + else if (nodeName === "link" && //check external styles + ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && + ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var rIndex = 0; rIndex < rules.length; rIndex++) { + styleText += rules[rIndex].cssText; + } + } + catch (e) { + // Silence css access issues + } + } + } + } + var passed = true; + // Defect 1022: Find uses of 'color' and '*background*' only + var isBgUsed = styleText.match(/\bbackground\b/i); + var theColorStyleToCheck = styleText.replace(/-color/g, ""); + var isColorUsed = theColorStyleToCheck.match(/\bcolor\b/i); + if (ruleContext.hasAttribute("color") || isColorUsed || isBgUsed) { + var goodTagNames = { + "em": "", "strong": "", "cite": "", "dfn": "", + "code": "", "samp": "", "kbd": "", "var": "", "abbr": "", "acronym": "" + }; + // Color used � are there semantics involved? + passed = nodeName in goodTagNames || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, goodTagNames) !== null; + if (!passed && ruleContext.hasChildNodes()) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (!passed && nw.nextNode() && nw.node !== ruleContext) { + passed = nw.node.nodeName.toLowerCase() in goodTagNames; + } + } + } + // Trigger only once + if (!passed) { + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_color_misuse", false); + passed = triggered; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_color_misuse", true); + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_focus_visible.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/style_focus_visible.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_focus_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +exports.style_focus_visible = { + id: "style_focus_visible", + context: "dom:*", + refactor: { + "RPT_Style_HinderFocus1": { + "Potential_1": "potential_focus_not_visible" + } + }, + help: { + "en-US": { + "group": "style_focus_visible.html", + "potential_focus_not_visible": "style_focus_visible.html", + "pass_focus_visible": "style_focus_visible.html" + } + }, + messages: { + "en-US": { + "group": "The keyboard focus indicator should be visible when default border or outline is modified by CSS", + "potential_focus_not_visible": "Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'", + "pass_focus_visible": "The keyboard focus indicator is visible or is not changed from the browser default" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.7", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + skipNodes: { + value: ["table"], + type: "[string]" + }, + checkParams: { + value: ["border", "border-width", "border-style", + "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", + "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", + "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", + "outline", "outline-width", "outline-color", "outline-style"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext) || validateParams.skipNodes.value.includes(ruleContext.nodeName.toLowerCase())) { + return null; + } + // Get all styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, ["", ":focus", ":focus-visible", ":focus-within"]); + var normalStyles = allStyles[""]; // consider both user-defined and browser default + var focusStyles = []; + focusStyles.push(allStyles[":focus"]); + focusStyles.push(allStyles[":focus-visible"]); + focusStyles.push(allStyles[":focus-within"]); + // if focus style is defined + var styleObj = focusStyles[0]; + if (Object.keys(styleObj).length > 0) { + //pass if outline is not defined at all, browser will override + if (((!normalStyles["outline-width"] && !normalStyles["outline-style"]) + || (normalStyles["outline-width"] === '0px' || normalStyles["outline-style"] === 'none')) + && (!styleObj["outline-style"] || styleObj["outline-style"] !== 'none')) + return (0, IRule_1.RulePass)("pass_focus_visible"); + var noneStyle = false; + var numOtherStyle = 0; + for (var focusStyle in styleObj) { + if (validateParams.checkParams.value.includes(focusStyle)) { + /** + * failure case: + * 1. focus outline or border style is none and no other style (color or width) defined + * 2. focus outline or border style is same with the normal + * 3. size in focus is same or smaller than default + * 4. color contrast in focus is better + */ + var focusStyleValue = styleObj[focusStyle]; + var normalStyleValue = normalStyles[focusStyle]; + if (focusStyle.includes("style")) { + if (focusStyleValue === "none") + noneStyle = true; + else + noneStyle = false; + if (normalStyleValue && focusStyleValue !== "none" && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("width")) { + numOtherStyle++; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thin') + focusStyleValue = '1px'; + else if (focusStyleValue === 'medium') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thick') + focusStyleValue = '3px'; + if (normalStyleValue) { + if (normalStyleValue === 'initial') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thin') + normalStyleValue = '1px'; + else if (normalStyleValue === 'medium') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thick') + normalStyleValue = '3px'; + } + focusStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(focusStyleValue, ruleContext); + normalStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(normalStyleValue, ruleContext); + if (focusStyleValue == 0 || focusStyleValue <= normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("color")) { + numOtherStyle++; + // get the element bg color + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(ruleContext); + if (colorCombo === null) + continue; + var bg = colorCombo.bg; + if (!bg) + continue; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = 'black'; + if (normalStyleValue && normalStyleValue === 'initial') + normalStyleValue = 'black'; + // get the border/outline color as fg colors + focusStyleValue = ColorUtil_1.ColorUtil.Color(focusStyleValue); + normalStyleValue = ColorUtil_1.ColorUtil.Color(normalStyleValue); + if (focusStyleValue === null || normalStyleValue === null) + continue; + //get the border/outline color contrast ratios + var focusRatio = focusStyleValue.contrastRatio(bg); + var normalRatio = normalStyleValue.contrastRatio(bg); + if (focusRatio < 3.0 || focusRatio <= normalRatio) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + //other + numOtherStyle++; + if (normalStyleValue != null && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + // warn if a border/outline focus style is 'none' and noe other (color and/or width) is defined + if (noneStyle && numOtherStyle === 0) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + // no focus style defined + // warn if normal style is defined and is not "none" + for (var normalStyle in normalStyles) { + if (validateParams.checkParams.value.includes(normalStyle)) { + var normalStyleValue = normalStyles[normalStyle]; + // ignore if border or outline style is "none" + if (normalStyleValue !== 'none') + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + return (0, IRule_1.RulePass)("pass_focus_visible"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_highcontrast_visible.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/style_highcontrast_visible.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_highcontrast_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_highcontrast_visible = { + id: "style_highcontrast_visible", + context: "dom:style, dom:link, dom:*[style]", + refactor: { + "RPT_Style_Trigger2": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_highcontrast_visible.html", + "Manual_1": "style_highcontrast_visible.html", + "group": "style_highcontrast_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content", + "group": "Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "link" && + (!ruleContext.hasAttribute("rel") || ruleContext.getAttribute("rel").toLowerCase() !== "stylesheet")) + return (0, IRule_1.RulePass)("Pass_0"); + if (nodeName !== "style" && nodeName !== "link" && + ruleContext.hasAttribute("style") && ruleContext.getAttribute("style").trim().length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_highcontrast_visible", false); + var passed = triggered; + // Packages.java.lang.System.out.println(triggered); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_highcontrast_visible", true); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_hover_persistent.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/style_hover_persistent.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_hover_persistent = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_hover_persistent = { + id: "style_hover_persistent", + context: "dom:style, dom:*[style], dom:*", + help: { + "en-US": { + "Pass_0": "style_hover_persistent.html", + // "Pass_1": "style_hover_persistent.html", + "Pass_2": "style_hover_persistent.html", + "Potential_1": "style_hover_persistent.html", + "Potential_2": "style_hover_persistent.html", + "Potential_3": "style_hover_persistent.html", + "group": "style_hover_persistent.html" + } + }, + messages: { + "en-US": { + "Pass_0": "the hover: pseudo-class is not used to display content", + // "Pass_1": "content displayed via the :hover pseudo-class is a direct child of the trigger element", + "Pass_2": "content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element", + "Potential_1": "Confirm the pointer can be positioned over the displayed element, not just the trigger", + "Potential_2": "Confirm the pointer can be positioned over all the information displayed on hover", + "Potential_3": "Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger", + "group": "The pointer should be able to move over content displayed on hover" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["1.4.13"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var pass0 = false; + var pass1 = false; + var pass2 = false; // never happen + var potential1 = false; + var potential2 = false; + var potential3 = false; + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + // console.log("RULE RUN ******************"); + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + // console.log("ruleContext.ownerDocument.styleSheets.length = "+ruleContext.ownerDocument.styleSheets.length); + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; ++sIndex) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules.length = "+styleRules.length); + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + // console.log("**********"); + // console.log("********** FOR LOOP styleRuleIndex = "+styleRuleIndex); + var foundHover = false; + var hoverElement = ""; + var plusCombinator = false; + var tildeCombinator = false; + var afterCombinatorElement = ""; + var afterCombinatorElementDisplay = false; + var afterCombinatorElementDisplayValue = false; + var afterCombinatorElementHover = false; + var supportingElement = false; + var supportingHover = false; + var supportingHoverElementDisplayProperty = false; + var supportingHoverElementDisplayValue = false; + var adjacentPlusSibling = false; + var adjacentTildeMultipleSibling = false; + var styleRule = styleRules[styleRuleIndex]; + var ruleText = styleRules[styleRuleIndex].cssText; + // console.log("styleRules["+styleRuleIndex+"] = "+ruleText); + // 1. Check for :hover + if (ruleText.match(/:hover/g)) { + foundHover = true; + // console.log("1. found :hover = "+ foundHover); + // 2. Get hover element + hoverElement = ruleText.split(":")[0]; + // console.log("2. found element that goes with :hover = "+hoverElement); + } + else { + // console.log("1. No hover on css element so skip this rule"); + continue; // if no :hover skip this rule + } + // 3a. Check for css combinator + + // 4a. if so do we have an after combinator element + var plusTempStr = ruleText.substring(ruleText.indexOf("+") + 1); + plusTempStr = plusTempStr.trim(); + if (ruleText.match(/:hover \+/g) || ruleText.match(/:hover\+/g)) { + plusCombinator = true; + // console.log("3a. Found plusCombinator = "+ plusCombinator); + afterCombinatorElement = plusTempStr.split(" ")[0]; + // console.log("4a. Found plus afterCombinatorElement = "+afterCombinatorElement); + } + // 3b. Check for css combinator + + // 4b. if so do we have an after combinator element + if (ruleText.match(/:hover \~/g) || ruleText.match(/:hover\~/g)) { + // console.log("match = "+ruleText.match(":hover \~")); + tildeCombinator = true; + // console.log("3b. Found tildeCombinator = "+ tildeCombinator); + var plusTempStr_1 = ruleText.substring(ruleText.indexOf("~") + 1); + plusTempStr_1 = plusTempStr_1.trim(); + afterCombinatorElement = plusTempStr_1.split(" ")[0]; + // console.log("4b. Found tilde afterCombinatorElement = "+afterCombinatorElement); + } + if (!plusCombinator && !tildeCombinator) { + // NO plusCombinator or tildeCombinator so skip this rule + // console.log("NO plusCombinator or tildeCombinator so PASS"); + // console.log("**** REPORT PASS 0 HERE"); + return (0, IRule_1.RulePass)("Pass_0"); // JCH: should we have a N/A pass + } + // So now we have a css element with hover - element:hover so we have problems + // to check + // 5. Check if the after combinator element has display: property + // 6. Check if display property is not none + if (afterCombinatorElement) { + // get index of display: + // console.log("plusTempStr = "+plusTempStr); + var index = plusTempStr.indexOf("display:"); + if (index) { + afterCombinatorElementDisplay = true; + // console.log("5. Found afterCombinatorElementDisplay = "+afterCombinatorElementDisplay); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + afterCombinatorElementDisplayValue = true; + // console.log("6. Found afterCombinatorElementDisplayValue not none = "+afterCombinatorElementDisplayValue); + } + else { + // console.log("afterCombinatorElementDisplayValue === none"); + // console.log("**** PUT POTENTIAL 0 HERE"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElementDisplay so skip this rule"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElement so skip this rule"); + continue; + } + if (afterCombinatorElementDisplayValue) + if (sheet && sheet.ownerNode === ruleContext) { + // console.log("**** At this point we have verified that we have a css element with a hover of the format span:hover + div { display: block; } with all the proper properties and values"); + // NOTE: At this point we have verified that we have a css element with a hover + // of the format span:hover + div { display: block; } + // with all the proper properties and values + try { + var styleRules2 = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules2.length = "+styleRules2.length); + for (var styleRuleIndex2 = 0; styleRuleIndex2 < styleRules2.length; styleRuleIndex2++) { + // Check rule for afterCominatorElement:hover + // If find afterCombinatorElement:hover see if rule has property display: value where + // value != none + // console.log("**********"); + // console.log("********** 2nd FOR styleRuleIndex2 = "+styleRuleIndex2); + var ruleText2 = styleRules[styleRuleIndex2].cssText; + // console.log("ruleText2 = ", ruleText2); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // Check all supporting elements for margin property + // If find margin STOP and REPORT ERROR + var regExString = afterCombinatorElement + " {"; + var trimRuleText2 = ruleText2.trim(); + var regIndex = trimRuleText2.indexOf(regExString); + var afterCombinatorElementProperties = trimRuleText2.slice(regIndex).trim(); + //if (!afterCombinatorElementProperties.match(/margin/g)) { + if (!trimRuleText2.match(/margin/g)) { + // console.log("No margin problem so continue on..."); + // do we have a supporting element css definitions + var supportingHoverElement = ruleText2.split(":")[0]; + supportingHoverElement = supportingHoverElement.split(" ")[0]; + // console.log("supportingHoverElement = "+supportingHoverElement); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // NEED TO CHECK FOR afterCominatorElement:hover in ONE STEP + if (supportingHoverElement === afterCombinatorElement && ruleText2.match(/:hover/g)) { + // console.log("7. Found supporting hover element same as afterCombinatorElement") + // 7. Found supporting hover element same as afterCombinatorElement + supportingElement = true; + // does supporting element have hover + // console.log("8. Supporting element has hover also = "+ foundHover); + // 8. Supporting element has hover also + supportingHover = true; + var index = ruleText2.indexOf("display:"); + // console.log("index = "+index); + if (index) { + // 9. Found supportingHoverElementDisplayProperty + supportingHoverElementDisplayProperty = true; + // console.log("9. Found supportingHoverElementDisplayProperty = "+supportingHoverElementDisplayProperty); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + // 10. Found supportingHoverElementDisplayValue not none + supportingHoverElementDisplayValue = true; + // console.log("10. Found supportingHoverElementDisplayValue not none = "+supportingHoverElementDisplayValue); + // Get list of hover elements and next sibling for + + // For + there must be at least one ADJACENT sibling + if (hoverElement !== "" && plusCombinator) { + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // console.log("hoverElementList[0].tagName = "+hoverElementList[0].tagName); + // Get adjacent sibling + // console.log("Adjacent sibling = "+hoverElementList[0].nextElementSibling.tagName); + // console.log("afterCombinatorElement.toUpperCase() = "+afterCombinatorElement.toUpperCase()); + if (afterCombinatorElement.toUpperCase() === hoverElementList[0].nextElementSibling.tagName) { + // console.log("11a. Hover with plus has adjacent sibling.") + // 11a. Hover with plus has adjacent sibling. + adjacentPlusSibling = true; + // At this point we have verified a supporting afterCombinatorElement css rule that contains hover and display property that is not equal to none and has a hover element in the body with an adjacent sibling + // console.log("**** REPORT PASS 1 HERE"); + pass0 = true; + continue; + } + } + else if (plusCombinator) { + // console.log("11a. Main hover with + combinator has no adjacent sibling"); + if (!potential1) { + // console.log("**** PUT POTENTIAL 1 HERE"); + potential1 = true; + break; + } + continue; + } + // Get list of hover elements and determine if there are 2 or more adjacent siblings for ~ + // For ~ there must be at least one ADJACENT sibling + if (hoverElement !== "" && tildeCombinator) { + // console.log("hoverElement.toUpperCase() = "+hoverElement.toUpperCase()); + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // Check for two or more adjacent siblings + var siblings = []; + var sibling = hoverElementList[0].nextElementSibling; + do { + // console.log("sibling.tagName = "+sibling.tagName); + if (sibling.tagName === afterCombinatorElement.toUpperCase()) { + siblings.push(sibling); + } + else { + break; + } + } while ((sibling = sibling.nextElementSibling)); + var siblingCount = siblings.length; + // console.log("siblingCount = "+siblingCount); + // JCH TODO: what if sibling count 0 + if (siblingCount === 1) { + // console.log("11b. Hover with tilde and one adjacent sibling"); + adjacentTildeMultipleSibling = true; + // console.log("**** REPORT PASS 2 HERE"); + return (0, IRule_1.RulePass)("Pass_2"); + } + else if (siblingCount > 1) { + // console.log("Main hover with ~ combinator has two or more siblings"); + if (!potential2) { + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + } + } + else if (plusCombinator) { + // supportingHoverElementDisplayValue + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a display property + } + else if (plusCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO tilde supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a supportingElement:hover + } + else if (plusCombinator) { + // if we make it to the last rule and supportingElement is still false => potential1 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO plus supportingElement:hover"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingElement is still false => potential2 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO tilde supportingElement:hover"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + continue; + } + } + } + else { + // console.log("There is a margin in the supporting element"); + if (!potential3) { + // console.log("**** PUT POTENTIAL 3 HERE"); + potential3 = true; + return (0, IRule_1.RulePotential)("Potential_3"); + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + // console.log("----------------------"); + // console.log("pass0 = "+pass0); + // console.log("pass1 = "+pass1); + // console.log("pass2 = "+pass2); + // console.log("potential1 = "+potential1); + // console.log("potential2 = "+potential2); + // console.log("potential3 = "+potential3); + if (pass0) + return (0, IRule_1.RulePass)("Pass_0"); + // if (pass1) return RulePass("Pass_2"); // Doesn't trigger + // if (pass2) return RulePass("Pass_3"); // Doesn't trigger + if (potential1) + return (0, IRule_1.RulePotential)("Potential_1"); + if (potential2) + return (0, IRule_1.RulePotential)("Potential_2"); + if (potential3) + return (0, IRule_1.RulePotential)("Potential_3"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_viewport_resizable.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/style_viewport_resizable.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_viewport_resizable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +/** + * Description: Trigger when viewport units are used for font size. + * Origin: Various + */ +exports.style_viewport_resizable = { + id: "style_viewport_resizable", + context: "dom:link, dom:style, dom:*[style]", + refactor: { + "WCAG21_Style_Viewport": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_viewport_resizable.html", + "Pass_0": "style_viewport_resizable.html", + "Potential_1": "style_viewport_resizable.html" + } + }, + messages: { + "en-US": { + "group": "Text must scale up to 200% without loss of content or functionality", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that text sized using viewport units can be resized up to 200%" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.4.4", "1.4.10"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var thePattern = /\d+(vw|vh|vmin|vmax)/gi; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "style") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var rule = styleRules[styleRuleIndex]; + if (rule.type && rule.type === 1 /* CSSRule.STYLE_RULE */) { + var styleRule = rule; + if (styleRule.style['fontSize']) { + var fontSize = styleRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + // check import rules + else if (rule.type && rule.type === 3 /* CSSRule.IMPORT_RULE */ && rule.styleSheet) { + var importRule = rule; + var rules = importRule.styleSheet.cssRules ? importRule.styleSheet.cssRules : importRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + if (importedRule.type && importedRule.type === 1 /* CSSRule.STYLE_RULE */) { + if (importedRule.style['fontSize']) { + var fontSize = importedRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else if (nodeName === "link") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check rules + if (ruleFromLink.type && ruleFromLink.type === 1 /* CSSRule.STYLE_RULE */) { + if (ruleFromLink.style['fontSize']) { + var fontSize = ruleFromLink.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else { + var styleValue = ruleContext.getAttribute('style'); + if (styleValue) { + var stylePattern = /font-size:\s*\d+(vw|vh|vmin|vmax)/gi; + var found = styleValue.match(stylePattern); + if (found) { + passed = false; + } + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/svg_graphics_labelled.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/svg_graphics_labelled.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.svg_graphics_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.svg_graphics_labelled = { + id: "svg_graphics_labelled", + context: "dom:svg", + help: { + "en-US": { + "group": "svg_graphics_labelled.html", + "pass": "svg_graphics_labelled.html", + "fail_acc_name": "svg_graphics_labelled.html" + } + }, + messages: { + "en-US": { + "group": "A non-decorative SVG element must have an accessible name", + "pass": "The SVG element has an accessible name", + "fail_acc_name": "The SVG element has no accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "7d6734": { + "pass": "pass", + "fail_acc_name": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_acc_name"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_aria_descendants.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/table_aria_descendants.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_aria_descendants = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_aria_descendants = { + id: "table_aria_descendants", + context: "aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]", + help: { + "en-US": { + "group": "table_aria_descendants.html", + "explicit_role": "table_aria_descendants.html" + } + }, + messages: { + "en-US": { + "group": "Table structure elements cannot specify an explicit 'role' within table containers", + "explicit_role": "An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + // cache the result + if (parentRole === null || parentRole.length === 0) + return; + // ignore the redundancy cases: reported in the aria_role_redundant rule + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + var explicitRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + ; + if (implicitRoles && implicitRoles.length > 0 && explicitRoles && explicitRoles.length > 0 + && explicitRoles.some(function (item) { return implicitRoles.includes(item); })) + return; + return (0, IRule_1.RuleFail)("explicit_role", [context["dom"].node.nodeName.toLowerCase(), parentRole[0].role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_caption_empty.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/table_caption_empty.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_empty = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_empty = { + id: "table_caption_empty", + context: "dom:caption", + refactor: { + "Valerie_Caption_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_empty.html", + "Fail_1": "table_caption_empty.html", + "group": "table_caption_empty.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <table> element has an empty <caption> element", + "group": "A <caption> element for a <table> element must contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_caption_nested.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/table_caption_nested.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_nested = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_nested = { + id: "table_caption_nested", + context: "dom:caption", + refactor: { + "Valerie_Caption_InTable": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_nested.html", + "Fail_1": "table_caption_nested.html", + "group": "table_caption_nested.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<caption> element is not nested inside a <table> element", + "group": "The <caption> element must be nested inside the associated <table> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table") != null; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/table_headers_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_exists = { + id: "table_headers_exists", + context: "dom:table", + refactor: { + "RPT_Table_DataHeadingsAria": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_exists.html", + "Fail_1": "table_headers_exists.html", + "group": "table_headers_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Table has no headers identified", + "group": "Data table must identify headers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If this is a layout table or there are no rows, the rule does not apply. + var rows = ruleContext.rows; + if (!TableUtil_1.TableUtil.isDataTable(ruleContext) || rows === null || rows.length === 0) + return null; + var passed = TableUtil_1.TableUtil.tableHeaderExists(ruleContext); + if (passed === null) + return; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_ref_valid.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_headers_ref_valid.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +exports.table_headers_ref_valid = { + id: "table_headers_ref_valid", + context: "dom:td[headers], dom:th[headers]", + help: { + "en-US": { + "Pass_0": "table_headers_ref_valid.html", + "Fail_1": "table_headers_ref_valid.html", + "Fail_2": "table_headers_ref_valid.html", + "Fail_3": "table_headers_ref_valid.html", + "Fail_4": "table_headers_ref_valid.html", + "group": "table_headers_ref_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document", + "Fail_2": "The 'headers' attribute value \"{0}\" refers to itself", + "Fail_3": "The 'headers' attribute value \"{0}\" does not refer to a cell in the same table", + "Fail_4": "The 'headers' attribute value \"{0}\" does not refer to a cell indicated with <th> or a role of \"columnheader\" or \"rowheader\"", + "group": "The 'headers' attribute should refer to a valid cell in the same table" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ["a25f45"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + var parentRole = ARIAMapper_1.ARIAMapper.nodeToRole(parentTable); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !VisUtil_1.VisUtil.isNodeVisible(parentTable) || !["table", "grid"].includes(parentRole)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var doc = ruleContext.ownerDocument; + var value = ruleContext.getAttribute("headers"); + if (!value) + return null; + var ids = value.split(" "); + var invalidHeaderValues = []; + var sameNodeHeaderValues = []; + var sameTableHeaderValues = []; + var invalidElemHeaderValues = []; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + if (id.trim() === '') + continue; + var elem = doc.getElementById(id); + if (!elem) + invalidHeaderValues.push(id); + else if (DOMUtil_1.DOMUtil.sameNode(elem, ruleContext)) + sameNodeHeaderValues.push(id); + else if (!DOMUtil_1.DOMUtil.isInSameTable(elem, ruleContext)) + sameTableHeaderValues.push(id); + else { + var elemName = elem.nodeName.toLowerCase(); + if (elemName !== 'th') { + var roles = AriaUtil_1.AriaUtil.getRoles(elem, true); + if (!roles.includes('columnheader') && !roles.includes('rowheader')) + invalidElemHeaderValues.push(id); + } + } + } + var results = []; + if (invalidHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_1", [invalidHeaderValues.toString()])); + if (sameNodeHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_2", [sameNodeHeaderValues.toString()])); + if (sameTableHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_3", [sameTableHeaderValues.toString()])); + if (invalidElemHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_4", [invalidElemHeaderValues.toString()])); + if (results.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return results; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_related.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/table_headers_related.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_related = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_related = { + id: "table_headers_related", + context: "dom:td, dom:th", + refactor: { + "Valerie_Table_DataCellRelationships": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_related.html", + "Fail_1": "table_headers_related.html", + "group": "table_headers_related.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Complex table does not have headers for each cell properly defined with 'header' or 'scope'", + "group": "For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !TableUtil_1.TableUtil.isComplexDataTable(parentTable)) + return null; + // If this table hasn't been preprocessed, process it. + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null) === null) { + // Build a grid that's actually usable (rowspan and colspan elements are duplicated) + // This builds a real 2d table array. + var grid = []; + for (var i = 0; i < parentTable.rows.length; ++i) { + var row = parentTable.rows[i]; + if (!grid[i]) + grid[i] = []; + for (var j = 0; j < row.cells.length; ++j) { + var cell = row.cells[j]; + CacheUtil_1.CacheUtil.setCache(cell, "table_headers_related", i + ":" + j); + var width = parseInt(cell.getAttribute("colspan")); + if (!width) + width = 1; + var height = parseInt(cell.getAttribute("rowspan")); + if (!height) + height = 1; + var gX = 0; + while (grid[i][gX]) + gX += 1; + for (var k = 0; k < height; ++k) { + if (!grid[i + k]) + grid[i + k] = []; + for (var l = 0; l < width; ++l) { + grid[i + k][gX + l] = cell; + } + } + } + } + // Iterate through the table grid and record headers that point to cells and + // cells that are pointed to by headers + var doc = ruleContext.ownerDocument; + var lookup = {}; + var scopedCols = {}; + for (var i = 0; i < grid.length; ++i) { + var rowScoped = false; + for (var j = 0; j < grid[i].length; ++j) { + var gridCell = grid[i][j]; + var gridNodeName = gridCell.nodeName.toLowerCase(); + if (gridNodeName == "th") { + if (gridCell.getAttribute("scope") == "row") { + rowScoped = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "rowgroup") { + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "col") { + scopedCols[j] = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + // Headers can refer to other headers + if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + else if (gridNodeName == "td") { + if (rowScoped || scopedCols[j]) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + } + } + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related", lookup); + } + var rcInfo = CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null); + var tInfo = CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related", null); + var passed = rcInfo && tInfo && rcInfo in tInfo; + if (!passed && rcInfo === "0:0" && + CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim().length == 0) { + // We don't test if it's the upper-left cell and it's empty + return null; + } + // If the table has no th's, it may just be that this was supposed to be a layout + // table, which introduces a lot of noise. In that case, only trigger this error + // once per table. + if (!passed && parentTable.getElementsByTagName("th").length == 0) { + if (CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related_TrigOnce", false) === true) { + passed = true; + } + else { + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related_TrigOnce", true); + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_layout_linearized.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_layout_linearized.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_layout_linearized = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_layout_linearized = { + id: "table_layout_linearized", + context: "dom:table", + refactor: { + "RPT_Table_LayoutTrigger": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_layout_linearized.html", + "Potential_1": "table_layout_linearized.html", + "group": "table_layout_linearized.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify table is not being used to format text content in columns unless the table can be linearized", + "group": "Avoid using tables to format text documents in columns unless the table can be linearized" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = !TableUtil_1.TableUtil.isLayoutTable(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_scope_valid.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/table_scope_valid.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_scope_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.table_scope_valid = { + id: "table_scope_valid", + context: "dom:td[scope], dom:th[scope]", + refactor: { + "WCAG20_Table_Scope_Valid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "table_scope_valid.html", + "Fail_1": "table_scope_valid.html", + "Fail_2": "table_scope_valid.html", + "group": "table_scope_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Value provided is invalid for the 'scope' attribute", + "Fail_2": "The 'scope' attribute should only be used on a <th> element", + "group": "Value for 'scope' attribute must be \"row\", \"col\", \"rowgroup\", or \"colgroup\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === 'td') + return (0, IRule_1.RuleFail)("Fail_2"); + //only continue for 'th' + var scopeVal = ruleContext.getAttribute("scope").trim().toLowerCase(); + var passed = /^(row|col|rowgroup|colgroup)$/.test(scopeVal); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_structure_misuse.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/table_structure_misuse.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_structure_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_structure_misuse = { + id: "table_structure_misuse", + context: "dom:table", + refactor: { + "WCAG20_Table_Structure": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_structure_misuse.html", + "Fail_1": "table_structure_misuse.html", + "group": "table_structure_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with \"presentation\" role or \"none\" role has structural element(s) and/or attribute(s) '{1}'", + "group": "Table elements with 'role=\"presentation\" or 'role=\"none\" should not have structural elements or attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - OUT OF SCOPE hidden in context + if (TableUtil_1.TableUtil.isDataTable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.isNodeInGrid(ruleContext)) + return null; + var errorNodes = []; + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "summary")) + errorNodes.push(ruleContext); + var captionElems = ruleContext.getElementsByTagName("caption"); + for (var i = 0; i < captionElems.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(captionElems[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(captionElems[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(captionElems[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var thNodes = ruleContext.getElementsByTagName("th"); + for (var i = 0; i < thNodes.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(thNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(thNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(thNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var tdNodes = ruleContext.getElementsByTagName("td"); + for (var i = 0; i < tdNodes.length; ++i) { + if ((tdNodes[i].hasAttribute("scope") || tdNodes[i].hasAttribute("headers")) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(tdNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(tdNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + // Get the node name for the rule context element in this case it will always be table + var currentElementToken = ruleContext.nodeName.toLowerCase(); + // Construct a new array which will contan only the element tag for the violation elements + var structuralElementTokens = new Array(); + // Construct a seen hash that will keep trask of all the elements that were already added to the token array, to make sure + // we do not duplicate any of the elements. Duplicate element tags in the token message looks bad and confusing. + var seen = {}; + // Loop through all the violating structural elements and extract the element tag to be used as a token + for (var i = 0; i < errorNodes.length; i++) { + // Get the node name (tag name) for the violating structural element + var nodeName = errorNodes[i].nodeName.toLowerCase(); + // Only need to add the violating element once + if (!seen.hasOwnProperty(nodeName)) { + // Since we are adding the token as elements and attributes we need to handle + // the summary attribute on the ruleContext (table). We only add summary once, same as + // for elements to avoid duplication in the message. (Summary should not duplicate, but just in case) + if (nodeName == "table" && !seen.hasOwnProperty["summary"]) { + // Mark this as a new attribute + seen["summary"] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push("summary"); + } + else { + // Mark this as a new element + seen[nodeName] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push(nodeName); + } + } + } + // We need to take the array of structural elements and join them with a comma and a space to make grammatical correct in + // the message. + var structuralElementTokensStr = structuralElementTokens.join(", "); + //return new ValidationResult(errorNodes.length == 0, errorNodes, '', '', [currentElementToken, structuralElementTokens]); + if (errorNodes.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [currentElementToken, structuralElementTokensStr]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_summary_redundant.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_summary_redundant.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_summary_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.table_summary_redundant = { + id: "table_summary_redundant", + context: "dom:table", + refactor: { + "WCAG20_Table_CapSummRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_summary_redundant.html", + "Fail_1": "table_summary_redundant.html", + "group": "table_summary_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The table summary duplicates the caption", + "group": "The table summary must not duplicate the caption" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pofId; + var passed = true; + var sumStr; + if (ruleContext.hasAttribute("summary")) { + pofId = 0; + sumStr = ruleContext.getAttribute("summary").trim().toLowerCase(); + } + else if (ruleContext.hasAttribute("aria-describedby")) { + pofId = 1; + var summaryNodeIds = ruleContext.getAttribute("aria-describedby").split(" "); + var summaryNodeConcat = ""; + for (var i = 0; i < summaryNodeIds.length; i++) { + var summaryNodeId = summaryNodeIds[i]; + if (summaryNodeId) { + var summaryNode = fragment_1.FragmentUtil.getById(ruleContext, summaryNodeId); + if (summaryNode && !DOMUtil_1.DOMUtil.sameNode(summaryNode, ruleContext)) { + summaryNodeConcat += " " + CommonUtil_1.CommonUtil.getInnerText(summaryNode).trim().toLowerCase(); + } + } + } + sumStr = summaryNodeConcat; + } + if (!sumStr) { + return null; + } + else { + var capElems = ruleContext.getElementsByTagName("caption"); + if (capElems.length === 0) { + return null; + } + else if (sumStr.length > 0) { + var capStr = CommonUtil_1.CommonUtil.getInnerText(capElems[0]).trim().toLowerCase(); + if (!sumStr.includes(capStr)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/target_spacing_sufficient.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/target_spacing_sufficient.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.target_spacing_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.target_spacing_sufficient = { + id: "target_spacing_sufficient", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "target_spacing_sufficient.html", + "pass_spacing": "target_spacing_sufficient.html", + "pass_sized": "target_spacing_sufficient.html", + "pass_inline": "target_spacing_sufficient.html", + "pass_default": "target_spacing_sufficient.html", + "violation_spacing": "target_spacing_sufficient.html", + "recommendation_inline": "target_spacing_sufficient.html", + "potential_overlap": "target_spacing_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The target must be sufficiently sized or spaced from other targets", + "pass_spacing": "The target's spacing from other targets is sufficient", + "pass_sized": "The target’s size is more than 24 CSS pixels", + "pass_inline": "The target is in a sentence or its size is otherwise constrained by the line-height of non-target text", + "pass_default": "The target's size is determined by the user agent and is not modified by the author", + "violation_spacing": "Undersized target \"{0}\" does not have sufficient spacing of 12 CSS pixels from another target \"{1}\"", + "recommendation_inline": "Confirm the inline target \"{0}\" is sufficiently spaced from another inline target \"{1}\"", + "potential_overlap": "Ensure the overlapped target \"{0}\" meets a minimum target size or has sufficient spacing from the overlapping target \"{1}\"" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["pass_spacing", "pass_sized", "pass_inline", "pass_default", "violation_spacing", "potential_overlap"] + }, + { + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["recommendation_inline"] + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); //context["dom"].bounds; + if (!bounds) + return null; + // ignore hidden, non-target + if (!CommonUtil_1.CommonUtil.isTarget(ruleContext)) + return null; + if (bounds.height >= 24 && bounds.width >= 24) + return (0, IRule_1.RulePass)("pass_sized"); + // check inline element: without text in the same line + var status = CSSUtil_1.CSSUtil.getInlineStatus(ruleContext); + if (status === null) + return null; + if (status.inline) { + if (status.text) { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_inline"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + else { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_default"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + } + else { + // ignore browser default + if (CSSUtil_1.CSSUtil.isTargetBrowserDefault(ruleContext)) + return (0, IRule_1.RulePass)("pass_default"); + } + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var cStyle = getComputedStyle(ruleContext); + if (cStyle === null) + return null; + var zindex = cStyle.zIndex; + if (!zindex || isNaN(Number(zindex))) + zindex = "0"; + // Get the list of target elements + var targetElems = CacheUtil_1.CacheUtil.getCache(doc.documentElement, "target_spacing_sufficient::targets", undefined); + if (typeof targetElems === "undefined") { + targetElems = []; + //select all elements except itself and descendants + var elems = doc.querySelectorAll('body *:not(script):not(style)'); + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + if (CommonUtil_1.CommonUtil.isTarget(elem)) { + targetElems.push(elem); + } + } + CacheUtil_1.CacheUtil.setCache(doc.documentElement, "target_spacing_sufficient::targets", targetElems); + } + if (!targetElems || targetElems.length === 0) + return; + var before = true; + var minX = 24; + var minY = 24; + var adjacentX = null; + var adjacentY = null; + var checked = []; //contains a list of elements that have been checked so their descendants don't need to be checked again + var _loop_1 = function (i) { + var elem = targetElems[i]; + /** + * the nodes returned from querySelectorAll is in document order + * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later + * filter out the elements that’re descendant or ancestors of the target element, nor descendant of the target element's siblings + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + //the next node in elems will be after the target node (ruleContext). + before = false; + return "continue"; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // ignore ascendants of the element, or itself or its ascendant already checked + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || checked.some(function (item) { return item.contains(elem); })) + return "continue"; + var bnds = mapper.getUnadjustedBounds(elem); + if (!bnds) + return "continue"; + var zStyle = getComputedStyle(elem); + var z_index = '0'; + if (zStyle) { + z_index = zStyle.zIndex; + if (!z_index || isNaN(Number(z_index))) + z_index = "0"; + } + // case 2: the element overlaps the target entirely + // note when a link is inline with other target, if the link text wraps in another line in a given viewport, + // the bounds of the link may cover and the entire two lines, causing the other tagets to be overlapped, see two links in the test case: element_inline.html + if (bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height + && bnds.left + bnds.width >= bounds.left + bounds.width) { + // if the target on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: null }; + } + else + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 3: if the target overlaps the element entirely + if (bounds.top <= bnds.top && bounds.left <= bnds.left && bounds.top + bounds.height >= bnds.top + bnds.height + && bounds.left + bounds.width >= bnds.left + bnds.width) { + // if the element on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else // the target on top + return { value: (0, IRule_1.RuleFail)("violation_spacing", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 4: the element overlaps partially with the target + if ((((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top + bounds.height <= bnds.top && bounds.top + bounds.height >= bnds.top + bnds.height)) + && ((bounds.left > bnds.left && bounds.left < bnds.left + bnds.width) || (bnds.left > bounds.left && bnds.left < bounds.left + bounds.width))) + || (((bounds.top > bnds.top && bounds.top < bnds.top + bnds.height) || (bnds.top > bounds.top && bnds.top < bounds.top + bounds.height)) + && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left + bounds.width >= bnds.left && bounds.left + bounds.width <= bnds.left + bnds.width)))) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else { // no overlap with the elem, though may overlap withe other elements + var disX = 24; + var disY = 24; + // the element is in the horizontally same row with the target + if (bounds.width < 24 && ((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top <= bnds.top && bounds.top + bounds.height > bnds.top))) + disX = Math.min(Math.abs(bounds.left - bnds.left), Math.abs(bounds.left - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - bnds.left)); + // the element is in the vertically same column with the target + if (bounds.height < 24 && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left <= bnds.left && bounds.left + bounds.width > bnds.left))) + disY = Math.min(Math.abs(bounds.top - bnds.top), Math.abs(bounds.top - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - bnds.top)); + if (disX < minX) { + minX = disX; + adjacentX = elem; + } + if (disY < minY) { + minY = disY; + adjacentY = elem; + } + } + checked.push(elem); + }; + for (var i = 0; i < targetElems.length; i++) { + var state_1 = _loop_1(i); + if (typeof state_1 === "object") + return state_1.value; + } + // case 5: no overlap + insufficient target size. check spacing + if (Math.round(bounds.width / 2) + minX < 12 || Math.round(bounds.height / 2) + minY < 12) { + if (Math.round(bounds.width / 2) + minX < Math.round(bounds.height / 2) + minY) + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentX.nodeName.toLowerCase()]); + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentY.nodeName.toLowerCase()]); + } + else + return (0, IRule_1.RulePass)("pass_spacing"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_block_heading.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/text_block_heading.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_block_heading = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_block_heading = { + id: "text_block_heading", + context: "dom:p, dom:div, dom:br", + refactor: { + "RPT_Block_ShouldBeHeading": { + // "Pass_0": "pass", + "Potential_1": "potential_heading" + } + }, + help: { + "en-US": { + // "pass": "text_block_heading.html", + "potential_heading": "text_block_heading.html", + "group": "text_block_heading.html" + } + }, + messages: { + "en-US": { + // "pass": "Heading text uses a heading element or role", + "potential_heading": "Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role", + "group": "Heading text should use a heading element or role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script"]) !== null) + return null; + var validateParams = { + numWords: { + value: 10, + type: "integer" + } + }; + var bodyFont = 0; + var body = ruleContext.ownerDocument.getElementsByTagName("body"); + if (body != null) { + var bodyStyle = getComputedStyle(body[0]); + if (bodyStyle) + bodyFont = CSSUtil_1.CSSUtil.getPixelsFromStyle(bodyStyle['font-size'], body); + } + var numWords = validateParams.numWords.value; + var wordsSeen = 0; + var wordStr = []; + var emphasizedText = false; + var nw = new DOMWalker_1.DOMWalker(ruleContext); + nw.nextNode(); + var passed = false; + while (!passed && + nw.nextNode() && + nw.node !== ruleContext && + nw.node !== DOMWalker_1.DOMWalker.parentNode(ruleContext) && + !["br", "div", "p"].includes(nw.node.nodeName.toLowerCase())) // Don't report twice + { + if (nw.node === ruleContext || CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) + continue; + var nwName = nw.node.nodeName.toLowerCase(); + if (nw.node.nodeType === 3) { + // for text child + if (nw.node.nodeValue.trim().length > 0 && nw.node.parentElement) { + // check it's style if the target element contains text, e.g., <p> fake heading</p> + var style = getComputedStyle(nw.node.parentElement); + if (style && (style['font-weight'] === 'bold' || style['font-weight'] >= 700 + || (style['font-size'] && style['font-size'].includes("large")) + || (style['font-size'] && bodyFont !== 0 && CSSUtil_1.CSSUtil.getPixelsFromStyle(style['font-size'], nw.node.parentElement) > bodyFont))) { + var nextStr = nw.node.nodeValue.trim(); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // the node contain regular text + passed = true; + } + } + } + else if (nw.node.nodeType === 1) { + // for element child + if (nwName === "b" || nwName === "strong" || nwName === "u" || nwName === "font") { + // if the target element contains emphasis child, e.g., <p><strong>fake heading</strong></p> + var nextStr = CommonUtil_1.CommonUtil.getInnerText(nw.node); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // ignore the element which has a role except 'generic', 'paragraph' or 'strong' + // ignore applet element that is deprecated anyway + var role = AriaUtil_1.AriaUtil.getResolvedRole(nw.node); + passed = (role !== null && role !== 'generic' && role !== 'paragraph' && role !== 'strong') || nwName === "applet"; + } + } + } + if (wordsSeen == 0) + passed = true; + //ignore if the string ends with “:” “,” “-” “;” or “.” + if (!passed) + passed = /[:,;\-\.]$/.test(wordStr.join(" ").trim()); + if (passed) { + return null; + } + else { + return (0, IRule_1.RulePotential)("potential_heading", [wordStr.join(" ")]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_contrast_sufficient.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/text_contrast_sufficient.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_contrast_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +exports.text_contrast_sufficient = { + id: "text_contrast_sufficient", + context: "dom:*", + refactor: { + "IBMA_Color_Contrast_WCAG2AA": { + "Pass_0": "pass", + "Fail_1": "fail_contrast", + "Potential_1": "potential_same_color" + }, + "IBMA_Color_Contrast_WCAG2AA_PV": { + "pass_0": "pass", + "potential_1": "potential_graphic_background" + } + }, + help: { + "en-US": { + "group": "text_contrast_sufficient.html", + "pass": "text_contrast_sufficient.html", + "fail_contrast": "text_contrast_sufficient.html", + "potential_same_color": "text_contrast_sufficient.html", + "potential_graphic_background": "text_contrast_sufficient.html", + "potential_text_shadow": "text_contrast_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The contrast ratio of text with its background must meet WCAG AA requirements", + "pass": "The contrast ratio of text with its background meets WCAG AA requirements", + "fail_contrast": "Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_same_color": "The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast", + "potential_graphic_background": "Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_text_shadow": "Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.3", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ['afw4f7'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + // avoid diagnosing elements that are not visible + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return null; + } + //TODO ? should only consider native disabled, ignore aria-disabled + //skip disabled element + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["svg", "script", "meta", "style"])) + return null; + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + // Ensure that this element has children with actual text. + var childStr = CommonUtil_1.CommonUtil.getNodeText(ruleContext); + if (!CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) || (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) && CommonUtil_1.CommonUtil.getNodeText(ruleContext.shadowRoot) === '')) { + if (childStr.trim().length == 0) + return null; + // ignore if the text does not convey anything in human language + /** + * (1) ignore non-alphanumeric or special characters in ASCI: ^(a-zA-Z\d\s) + * (2) ignore non-printable unicode characters: \u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF + * see https://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters + * (3) for now not consider unicode special characters that are different in different languages + */ + //let regex = /[^(a-zA-Z\d\s)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + var regex = /[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + childStr = childStr.trim().replace(regex, ''); + if (childStr.trim().length === 0) + return null; + } + var elem = ruleContext; + // the child elements (rather than shadow root) of a shadow host is either re-assigned to the shadow slot if the slot exists + // or not displayed, so shouldn't be checked from the light DOM, rather it should be checked as reassginged slot element(s) in the shadow DOM. + if (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext)) { + // if it's direct text of a shadow host + if (ruleContext.shadowRoot) { + for (var node = ruleContext.firstChild; node; node = node.nextSibling) { + if (node.nodeType == 3) { + //if multiple texts exist, only need to check one + elem = node.assignedSlot; + break; + } + } + } + if (elem === null) + return; + } + var style = win.getComputedStyle(elem); + // JCH clip INFO: + // The clip property lets you specify a rectangle to clip an absolutely positioned element. + // The rectangle specified as four coordinates, all from the top-left corner of the element to be clipped. + // Property values: + // none This is default. No clipping is done + // auto No clipping will be done + // shape The only valid value is: rect (top, right, bottom, left) + // e.g., clip: rect(10px, 20px, 30px, 40px); + // Note: the four values are in the same order as margin/padding + // The rect values are positive pixel values, e.g., 10px, etc. + // margin-box Uses the margin box as the reference box + // border-box Uses the border box as the reference box + // padding-box Uses the padding box as the reference box + // content-box + // fill-box + // stroke-box + // NOTE: the CSS clip property is deprecated + // Also: clip only works if the element is absolutely positioned and can only do rectangles + // check if element visible + var visible = true; + if (style.width !== "0" && + style.height !== "0" && + style.opacity !== "0" && + style.display !== 'none' && + style.visibility !== 'hidden' && + style.overflow !== 'hidden' && + // left and right work with all absolute units + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.left.replace(/[^0-9.+-]/, '')) > 0)) && + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.top.replace(/[^0-9.+-]/, '')) > 0))) { + visible = true; + // console.log("element IS visible"); + // console.log("CHECK COLOR CONTRAST unless to small"); + } + else { + visible = false; + // console.log("element NOT visible"); + } + if (visible === false) { + // console.log("DO NOT CHECK COLOR CONTRAST"); + return null; + } + var clipHeight = -1; + if (style.clip !== "auto") { + var clipString = style.clip.toString(); + if (clipString.includes("rect")) { + var reBrackets = /\((.*)\)/g; + var listOfText = []; + var found = reBrackets.exec(clipString); + var foundArr = found[1].split(', '); + for (var i = 0; i < foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + listOfText.push(foundArr[i]); + } + ; + } + // console.log("listOfText = ",listOfText); + clipHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + clipHeight = Math.abs(clipHeight); + } + // JCH clip-path INFO: + // Excellent article on clip-path: https://ishadeed.com/article/clip-path/ + // clip-path is a totally different animal with many, many different variations + // The goal was for it to not be as limited as clip + // The syntax is more complicated (as it does more) and it is different from clip, + // e.g., the above clip rectangle would be clip-path: inset(10px 20px 30px 40px); + // Note: there are no commas + // Also, it can take single values to make all sides the same, or 2 values (vert/hori). + // or 3 values (top/hori/bottom) + // And percentages can works as well as px + // + // Although there are five different shapes: inset (term used for rectangle), circle, + // ellipse, polygon, path - we will only concern ourselves with inset + // There are 7 box values: margin-box, border-box, padding-box, content-box, fill-box, stroke-box, view-box + // Box and shape values may be combined: clip-path: padding-box circle(50px at 0 100px); + // NOTE: the box values are NOT intuitive, see: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/From_box_values#margin-box + // + // So the key question is what amount of effort do we want to invest into clip-path + // + // JCH don't do clip-path now + var clipPathHeight = -1; + // if (style.clipPath !== "auto") { + // console.log("style.clipPath = ",style.clipPath); + // console.log("style.clipPath.toString = ",style.clipPath.toString()); + // let clipString = style.clipPath.toString(); + // if (clipString.includes("inset")) { + // var reBrackets = /\((.*)\)/g; + // var listOfText = []; + // var found = reBrackets.exec(clipString); + // var foundArr = found[1].split(' '); + // for (let i=0; i<foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + // listOfText.push(foundArr[i]); + // }; + // } + // console.log("listOfText = ",listOfText); + // clipPathHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + // clipPathHeight = Math.abs(clipHeight); + // } + // console.log("clipPathHeight = ", clipPathHeight); + // if (style.position === "absolute" && style.clip === "rect(0px, 0px, 0px, 0px)" && style.overflow !== "visible") { + // JCH arbitrarily use less that 7px for clipHeight + if (style.position === "absolute" && clipHeight < 7 && clipHeight !== -1) { + // console.log("DO NOT CHECK COLOR CONTRAST because too small"); + // Corner case where item is hidden (accessibility hiding technique) + return null; + } + // First determine the color contrast ratio + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(elem); + if (colorCombo === null) { + //some exception occurred, or not able to get color combo for some reason + console.log("unable to get color combo for element: " + elem.nodeName); + return; + } + var fg = colorCombo.fg; + var bg = colorCombo.bg; + var ratio = fg.contrastRatio(bg); + var weight = CSSUtil_1.CSSUtil.getWeightNumber(style.fontWeight); + var size = CSSUtil_1.CSSUtil.getFontInPixels(style.fontSize, elem); + var isLargeScale = size >= 24 || size >= 18.6 && weight >= 700; + if (CSSUtil_1.CSSUtil.containsCKJ(childStr)) { + // https://github.com/act-rules/act-rules.github.io/pull/2121/files + // for CJK, 22 pt or 18 pt with font-weight >= 700, 1pt = 1.333 px + isLargeScale = size >= 29.3 || size >= 24 && weight >= 700; + } + var passed = ratio >= 4.5 || (ratio >= 3 && isLargeScale); + var hasBackground = colorCombo.hasBGImage || colorCombo.hasGradient; + var textShadow = colorCombo.textShadow; + var isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(elem); + if (!isDisabled) { + var control = CommonUtil_1.CommonUtil.getControlOfLabel(elem); + if (control) { + isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(control); + } + } + if (!isDisabled && nodeName === 'label' && CommonUtil_1.CommonUtil.isDisabledByFirstChildFormElement(elem)) { + isDisabled = true; + } + if (!isDisabled && ruleContext.hasAttribute("id") && CommonUtil_1.CommonUtil.isDisabledByReferringElement(elem)) { + isDisabled = true; + } + /**setCache(ruleContext, "EXT_Color_Contrast_WCAG2AA", { + "ratio": ratio, + "isLargeScale": isLargeScale, + "weight": weight, + "size": size, + "hasBackground": hasBackground, + "isDisabled": isDisabled + });*/ + // If element or parent is disabled, this rule does not apply (but may be 3:1 in future) + if (!passed && isDisabled) { + passed = true; + } + if (!passed) { + if (hasBackground) { + // fire potential since a text on an image or gradient may be still viewable, depending on the text location on the gradient or image + return (0, IRule_1.RulePotential)("potential_graphic_background", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else if (textShadow) { + // fire potential since a text with shadow may be still viewable, depending on the shadow efffects + return (0, IRule_1.RulePotential)("potential_text_shadow", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else { + if (fg.toHex() === bg.toHex()) { + return (0, IRule_1.RulePotential)("potential_same_color", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + else { + return (0, IRule_1.RuleFail)("fail_contrast", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } + } + else { + return (0, IRule_1.RulePass)("pass", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_quoted_correctly.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/text_quoted_correctly.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_quoted_correctly = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_quoted_correctly = { + id: "text_quoted_correctly", + context: "dom:*", + help: { + "en-US": { + "Pass_0": "text_quoted_correctly.html", + "Potential_1": "text_quoted_correctly.html", + "group": "text_quoted_correctly.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}", + "group": "Quotations should be marked with <q> or <blockquote> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // ignore the check if the node is hidden + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if the element is not in the body + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + var validateParams = { + minWords: { + value: 3, + type: "integer" + } + }; + var minWords = validateParams.minWords.value; + var passed = true; + var walkNode = ruleContext.firstChild; + var violatedtext = null; + // ignore the check for the text of the following elements + var ignored = ["blockquote", "q", "script", "style", "pre", "code", "ruby", "samp"]; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName === "#text") { + var txtVal = walkNode.nodeValue; + // Do the regex tests first - should be fast + // Remove apostrophe's + txtVal = txtVal.replace(/(\S)'(\S)/g, "$1$2"); + var dblQuotes = txtVal.match(/("[^"]+")/g); + var snglQuotes = txtVal.match(/('[^']+')/g); + // Walk the parents - only continue testing if we found a quote, but + // we're not already marked up + // Also skip if we're in a script - there's lots of quotes used in scripts + if ((dblQuotes !== null || snglQuotes !== null) && + CommonUtil_1.CommonUtil.getAncestor(walkNode, ignored) === null) { + if (dblQuotes != null) { + for (var i = 0; passed && i < dblQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(dblQuotes[i]) < minWords; + } + if (snglQuotes != null) { + for (var i = 0; passed && i < snglQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(snglQuotes[i]) < minWords; + } + // Remove any linefeed inside the quote + // violatedtext = txtVal.replace(new RegExp("\\r?\\n|\\r","g"),""); + if (dblQuotes === null) { + violatedtext = snglQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else if (snglQuotes === null) { + violatedtext = dblQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else { + violatedtext = dblQuotes.concat(snglQuotes).join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + } + } + walkNode = walkNode.nextSibling; + } + //if the violatedtext is longer than 69 chars, only keep the first 32, the " ... ", and the last 32 chars + if (!passed && violatedtext.length && violatedtext.length > 69) { + violatedtext = violatedtext.substring(0, 32) + " ... " + violatedtext.substring(violatedtext.length - 32); + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_sensory_misuse.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/text_sensory_misuse.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_sensory_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_sensory_misuse = { + id: "text_sensory_misuse", + context: "dom:body, dom:body dom:*", + refactor: { + "RPT_Text_SensoryReference": { + // "Pass_0": "pass", + "Potential_1": "potential_position, potential_other" + } + }, + help: { + "en-US": { + // "pass": "text_sensory_misuse.html", + "potential_position": "text_sensory_misuse.html", + "potential_other": "text_sensory_misuse.html", + "group": "text_sensory_misuse.html" + } + }, + messages: { + "en-US": { + // "pass": "Instructions are meaningful without relying solely on shape, size, or location words", + "potential_position": "Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position", + "potential_other": "Confirm the user instruction is still understandable without the word(s) '{0}'", + "group": "Instructions should be meaningful without relying solely on shape, size, or location words" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, link, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "a", 'label']) !== null) + return null; + // ignore text on landmark roles, but not on their children (e.g., section, main) + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role) { + var lmRoles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["landmark"]); + if (lmRoles && lmRoles.includes(role)) + return null; + } + // ignore all widgets and headings, and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget", "heading"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "cell", "code", "columnheader", "definition", "figure", "list", "listitem", "math", "meter", "row", "rowgroup", "rowheader", "term"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var violatedPositionText = ""; + var violatedOtherText = ""; + var walkNode = ruleContext.firstChild; + var txtVal = ""; + while (walkNode) { + // for each element it only checks that single elements text nodes and nothing else. + // all inner elements will be covered on their own. + // whitespace characters (space, newline, tab) between elements are considered a node too. + if (walkNode.nodeName === "#text") { + var txt = walkNode.nodeValue.trim(); + if (txt.length > 0) + txtVal += (txtVal.length > 0 ? ", " + txt : txt); + } + walkNode = walkNode.nextSibling; + } + if (txtVal.length > 0) { + // first to remove each exempt word with a single space in the text + var exemptRegex = getRegex(ruleContext.ownerDocument, "exemptText"); + txtVal = txtVal.replace(exemptRegex, " "); + violatedPositionText = getViolatedText(ruleContext.ownerDocument, "positionText", txtVal); + violatedOtherText = getViolatedText(ruleContext.ownerDocument, "otherText", txtVal); + } + var ret = []; + if (violatedPositionText) + ret.push((0, IRule_1.RulePotential)("potential_position", [violatedPositionText])); + if (violatedOtherText) + ret.push((0, IRule_1.RulePotential)("potential_other", [violatedOtherText])); + return ret.length == 0 ? null : ret; + } +}; +var validateParams = { + positionText: { + value: ["top-left", "top-right", "bottom-right", "bottom-left", + "top-to-bottom", "left-to-right", "bottom-to-top", "right-to-left", + "right", "left", "above", "below", "top", "bottom", + "upper", "lower", "corner", "beside" + ], + type: "[string]" + }, + otherText: { + value: ["round", "square", "shape", "rectangle", "triangle", + "size", "large", "small", "medium", "big", "huge", "tiny", "extra", + "larger", "smaller", "bigger", "little", "largest", "smallest", "biggest" + ], + type: "[string]" + }, + exemptText: { + value: ["right-click", "left-click", "right-clicking", "right-clicks", + "left-clicking", "left-clicks", "square root", "right now", "off the top" //append as needed + ], + type: "[string]" + } +}; +function getRegex(doc, type) { + if (!validateParams[type]) + return ""; + var sensoryRegex = CacheUtil_1.CacheUtil.getCache(doc, type + "_sensory_misuse", null); + if (sensoryRegex == null) { + var sensoryText = validateParams[type].value; + var regexStr = "(\s\s+|" + sensoryText[0]; + for (var j = 1; j < sensoryText.length; ++j) { + var words = sensoryText[j].trim().split(" "); + regexStr += "|" + words[0]; + if (words.length > 1) { + for (var c = 1; c < words.length; ++c) + regexStr += " +" + words[c]; + } + } + //regexStr += ")\\W"; + regexStr += ")"; + sensoryRegex = new RegExp(regexStr, "gi"); + CacheUtil_1.CacheUtil.setCache(doc, type + "_sensory_misuse", sensoryRegex); + } + return sensoryRegex; +} +function getViolatedText(doc, type, txtVal) { + if (!txtVal) + return ""; + var sensoryTextArr = validateParams[type].value; + var hash = {}, result = []; + // split the string into words + var counts = txtVal.split(/\s+/).reduce(function (map, word) { + var wordWoTrailingPunc = word.replace(/[.?!:;()'",`\]]+$/, ""); + var lcWordWoPunc = word.toLowerCase().replace(/[.?!:;()'",`\]]/g, ""); + for (var counter = 0; counter < sensoryTextArr.length; counter++) { + var a = lcWordWoPunc.indexOf(sensoryTextArr[counter]); + var sensoryWordLen = sensoryTextArr[counter].length; + var charFollowSensoryText = lcWordWoPunc.charAt(sensoryWordLen + a); + // If the word does not contains substring of sensoryTextArr[counter] + // proceed to the next loop iteration for next sensoryText. + if (a < 0) { + continue; + } + //check the following and proceeding punctuations + //let isPuncfollowing = ((charFollowSensoryText == '\-') || + var isPuncfollowing = ((charFollowSensoryText == '\.') || + (charFollowSensoryText == '\?') || (charFollowSensoryText == '\!') || + (charFollowSensoryText == '\:') || (charFollowSensoryText == '\;') || + (charFollowSensoryText == '\(') || (charFollowSensoryText == '\)') || + (charFollowSensoryText == '\'') || (charFollowSensoryText == '\"') || + (charFollowSensoryText == '\,') || (charFollowSensoryText == '.\`') || + (charFollowSensoryText == '\\') || (charFollowSensoryText == '\]')); + var isPuncPreceding = false; + if (a > 0) { + var charPrecedeSensoryText = lcWordWoPunc.charAt(a - 1); + isPuncPreceding = ((charPrecedeSensoryText == '\-') || + (charPrecedeSensoryText == '\.') || + (charPrecedeSensoryText == '\?') || (charPrecedeSensoryText == '\!') || + (charPrecedeSensoryText == '\:') || (charPrecedeSensoryText == '\;') || + (charPrecedeSensoryText == '\(') || (charPrecedeSensoryText == '\)') || + (charPrecedeSensoryText == '\'') || (charPrecedeSensoryText == '\"') || + (charPrecedeSensoryText == '\,') || (charPrecedeSensoryText == '.\`') || + (charPrecedeSensoryText == '\\') || (charPrecedeSensoryText == '\]')); + } + if (((lcWordWoPunc.length == sensoryWordLen) || (isPuncfollowing == true) || (isPuncPreceding == true))) { + if (!hash.hasOwnProperty(wordWoTrailingPunc)) { + hash[wordWoTrailingPunc] = true; + result.push(wordWoTrailingPunc); + } + counter = sensoryTextArr.length; + } + } + map[wordWoTrailingPunc] = (map[wordWoTrailingPunc] || 0) + 1; + return map; + }, Object.create(null)); + return result.join(", "); +} + + +/***/ }, + +/***/ "./src/v4/rules/text_spacing_valid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/text_spacing_valid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_spacing_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +// Module-level constants +var STYLE_VALUE_REGEX = /(-?[\d.]+)([a-z%]*)/; +var MIN_WORD_SPACING_RATIO = 0.16; +var MIN_LETTER_SPACING_RATIO = 0.12; +var MIN_LINE_HEIGHT_RATIO = 1.5; +var IMPORTANT_SUFFIX = "!important"; +var IMPORTANT_SUFFIX_LENGTH = IMPORTANT_SUFFIX.length + 1; // +1 for the space before !important +/** + * Resolves inherited or unset style values by traversing up the DOM tree + * @param element - The element to resolve the style for + * @param property - The CSS property name + * @param currentValue - The current style value + * @returns The resolved style value + */ +function resolveInheritedStyle(element, property, currentValue) { + var _a; + if (currentValue.startsWith('inherit') || currentValue.startsWith('unset')) { + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(element.parentElement, (_a = {}, _a[property] = ["*"], _a), ['inherit', 'unset']); + if (ancestor !== null) { + return CSSUtil_1.CSSUtil.getDefinedStyles(ancestor, [property])[property]; + } + else if (currentValue.startsWith('unset')) { + return "initial"; + } + } + return currentValue; +} +/** + * Removes the !important suffix from a style value + * @param styleValue - The style value potentially containing !important + * @returns The style value without !important + */ +function removeImportantSuffix(styleValue) { + return styleValue.substring(0, styleValue.length - IMPORTANT_SUFFIX_LENGTH); +} +/** + * Checks if a spacing property violates accessibility requirements + * @param element - The HTML element being checked + * @param property - The CSS property name (word-spacing, letter-spacing, line-height) + * @param styleValue - The current style value + * @param fontSize - The computed font size in pixels + * @param minRatio - The minimum ratio threshold + * @param allowUnitless - Whether unitless values are allowed (for line-height) + * @returns RuleResult indicating pass or fail + */ +function checkSpacingProperty(element, property, styleValue, fontSize, minRatio, allowUnitless) { + if (allowUnitless === void 0) { allowUnitless = false; } + // Check if !important is used + if (element.style.getPropertyPriority(property) !== 'important') { + return true; + } + // Remove !important suffix + var cleanValue = removeImportantSuffix(styleValue); + // Check for initial or normal values (computed space is 0) + if (cleanValue === 'initial' || cleanValue === 'normal') { + return false; + } + // Parse the numeric value + var numericValue = parseFloat(cleanValue); + if (isNaN(numericValue)) { + return true; + } + // Match value and unit + var parsedValue = cleanValue.trim().match(STYLE_VALUE_REGEX); + if (!parsedValue) { + return true; + } + var value = parsedValue[1], unit = parsedValue[2]; + // Handle unitless values (only for line-height) + if (unit === '') { + if (allowUnitless) { + return parseFloat(value) < minRatio ? false : true; + } + // For other properties, zero value without unit is ignored + if (parseFloat(value) === 0) { + return null; + } + } + // Skip if no unit and non-zero (error case, inapplicable) + if (unit === '' && parseFloat(value) !== 0) { + return null; + } + // Convert to pixels and check ratio + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(unit, value, element); + if (pixels !== null && pixels / fontSize < minRatio) { + return false; + } + return true; +} +exports.text_spacing_valid = { + id: "text_spacing_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_spacing_valid.html", + "group": "text_spacing_valid.html", + "fail_letter_spacing_style": "text_spacing_valid.html", + "fail_word_spacing_style": "text_spacing_valid.html", + "fail_line_height_style": "text_spacing_valid.html" + } + }, + messages: { + "en-US": { + "pass": "CSS !important is not used in inline style to control letter or word spacing or line height", + "group": "CSS !important should not be used in inline style to control letter or word spacing or line height", + "fail_letter_spacing_style": "CSS !important should not be used in inline ‘letter-spacing’ style", + "fail_word_spacing_style": "CSS !important should not be used in inline ‘word-spacing’ style", + "fail_line_height_style": "CSS !important should not be used in inline ‘line-height’ style" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.12"], + "level": IRule_1.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_1.eToolkitLevel.LEVEL_THREE + }], + act: ['9e45ec', '24afc2', '78fd32'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Ensure that this element has children with actual text + var childStr = ""; + var childNodes = ruleContext.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType === 3) { // Text node + childStr += childNodes[i].nodeValue; + } + } + if (childStr.trim().length === 0) { + return null; + } + // Skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Skip the check if the element is off screen + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + if (!bounds || bounds['top'] < 0 || bounds['left'] < 0) { + return null; + } + // Skip non-HTML elements (e.g., SVG) + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + // Font size always resolved to 'px' + var computedStyle = getComputedStyle(ruleContext); + var fontSize = parseFloat(computedStyle.getPropertyValue('font-size')); + // Early exit optimization: Check if computed styles already pass + // If all three properties have passing values, we can skip the expensive getDefinedStyles call + var computedWordSpacing = computedStyle.getPropertyValue('word-spacing'); + var computedLetterSpacing = computedStyle.getPropertyValue('letter-spacing'); + var computedLineHeight = computedStyle.getPropertyValue('line-height'); + // Check if computed values pass the requirements + var wordSpacingPasses = true; + var letterSpacingPasses = true; + var lineHeightPasses = true; + // Check word-spacing (ignore 0px which represents default/normal) + if (computedWordSpacing) { + var wordValue = parseFloat(computedWordSpacing); + if (!isNaN(wordValue)) { + var wordPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', wordValue.toString(), ruleContext); + if (wordPixels !== null && wordPixels / fontSize < MIN_WORD_SPACING_RATIO) { + wordSpacingPasses = false; + } + } + } + // Check letter-spacing (ignore 0px which represents default/normal) + if (computedLetterSpacing) { + var letterValue = parseFloat(computedLetterSpacing); + if (!isNaN(letterValue)) { + var letterPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', letterValue.toString(), ruleContext); + if (letterPixels !== null && letterPixels / fontSize < MIN_LETTER_SPACING_RATIO) { + letterSpacingPasses = false; + } + } + } + // Check line-height + if (computedLineHeight) { + var lineValue = parseFloat(computedLineHeight); + if (!isNaN(lineValue)) { + // Line height can be unitless or in pixels + var match = computedLineHeight.match(STYLE_VALUE_REGEX); + if (match) { + var value = match[1], unit = match[2]; + if (unit === '' || unit === 'px') { + var ratio = unit === '' ? parseFloat(value) : parseFloat(value) / fontSize; + if (ratio < MIN_LINE_HEIGHT_RATIO) { + lineHeightPasses = false; + } + } + } + } + } + // If all computed values pass, we can skip the expensive getDefinedStyles check + if (wordSpacingPasses && letterSpacingPasses && lineHeightPasses) { + return null; + } + // Get defined styles to check for !important declarations + var styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["word-spacing", "letter-spacing", "line-height"]); + if (Object.keys(styles).length === 0) { + return null; + } + var results = []; + // Check word-spacing + var wordStyle = styles['word-spacing']; + if (wordStyle) { + wordStyle = resolveInheritedStyle(ruleContext, 'word-spacing', wordStyle); + var result = checkSpacingProperty(ruleContext, 'word-spacing', wordStyle, fontSize, MIN_WORD_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_word_spacing_style')); + } + // Check letter-spacing + var letterStyle = styles['letter-spacing']; + if (letterStyle) { + letterStyle = resolveInheritedStyle(ruleContext, 'letter-spacing', letterStyle); + var result = checkSpacingProperty(ruleContext, 'letter-spacing', letterStyle, fontSize, MIN_LETTER_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_letter_spacing_style')); + } + // Check line-height (only if no scrollable ancestor) + var lineStyle = styles['line-height']; + var overflowStyles = { + "overflow": ['auto', 'scroll'], + "overflow-x": ['auto', 'scroll'], + "overflow-y": ['auto', 'scroll'] + }; + if (lineStyle && CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext, overflowStyles) === null) { + lineStyle = resolveInheritedStyle(ruleContext, 'line-height', lineStyle); + var result = checkSpacingProperty(ruleContext, 'line-height', lineStyle, fontSize, MIN_LINE_HEIGHT_RATIO, true // Allow unitless values for line-height + ); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_line_height_style')); + } + return results.length > 0 ? results : null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_whitespace_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/text_whitespace_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_whitespace_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.text_whitespace_valid = { + id: "text_whitespace_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_whitespace_valid.html", + "potential_text": "text_whitespace_valid.html", + "group": "text_whitespace_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_text": "Space characters should not be used to create space between the letters of a word", + "group": "Space characters should not be used to control spacing within a word" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger if we're not in the body or if we're in a script + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body", "script", "code"]); + if (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body") + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + passed = !(/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(txtVal)); + } + walkNode = walkNode.nextSibling; + } + if (passed) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_text"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/widget_tabbable_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_exists = { + id: "widget_tabbable_exists", + context: "aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton", + refactor: { + "IBMA_Focus_Tabbable": { + "pass": "pass", + "fail_no_tabbable": "fail_no_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_exists.html", + "fail_no_tabbable": "widget_tabbable_exists.html", + "group": "widget_tabbable_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_no_tabbable": "Component with \"{0}\" role does not have a tabbable element", + "group": "Component must have at least one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role_1 = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role_1, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + // skip the count if the element requires presentational children only + if (count < 1 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 1 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + var passed = count >= 1; + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_no_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/widget_tabbable_single.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_single.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_single = { + id: "widget_tabbable_single", + context: "aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab", + refactor: { + "IBMA_Focus_MultiTab": { + "pass": "pass", + "potential_multiple_tabbable": "potential_multiple_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_single.html", + "potential_multiple_tabbable": "widget_tabbable_single.html", + "group": "widget_tabbable_single.html" + } + }, + messages: { + "en-US": { + "pass": "Components with a widget role should have no more than one tabbable element", + "potential_multiple_tabbable": "Component with \"{0}\" role has more than one tabbable element", + "group": "Components with a widget role must have no more than one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + //skip the count if the element requires presentational children only + var name = []; + if (count < 2 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 2 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + // Radio inputs with the same name natively are only one tab stop + /**if (nw.node.nodeName.toLowerCase() === 'input' && (nw.node as Element).getAttribute("type") === 'radio') { + let curName = (nw.node as Element).getAttribute("name"); + if (name.includes(curName)) + continue; + else + name.push(curName); + }*/ + ++count; + } + } + } + var passed = count < 2; + if (!passed) + CacheUtil_1.CacheUtil.setCache(ruleContext, "widget_tabbable_single", "potential_multiple_tabbable"); + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_multiple_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rulesets.ts" +/*!****************************!*\ + !*** ./src/v4/rulesets.ts ***! + \****************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a11yRulesets = void 0; +// This file comes from https://raw.githubusercontent.com/act-rules/act-tools/main/src/data/sc-urls.json +var SCURLs = __importStar(__webpack_require__(/*! ./sc-urls.json */ "./src/v4/sc-urls.json")); +var IGuideline_1 = __webpack_require__(/*! ./api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var SCs = []; +for (var key in SCURLs) { + SCs.push(SCURLs[key]); +} +var summaries = { + "1.1.1": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.", + "1.2.1": "For prerecorded audio-only or video-only media, an alternative provides equivalent information.", + "1.2.2": "Captions are provided for all prerecorded audio content in synchronized media.", + "1.2.3": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.", + "1.2.4": "Captions are provided for all live audio content in synchronized media.", + "1.2.5": "Audio description is provided for all prerecorded video content in synchronized media.", + "1.3.1": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.", + "1.3.2": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.", + "1.3.3": "Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.", + "1.3.4": "Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.", + "1.3.5": "The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.", + "1.4.1": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.", + "1.4.2": "If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.", + "1.4.3": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.", + "1.4.4": "Text can be resized without assistive technology up to 200 percent without loss of content or functionality.", + "1.4.5": "If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.", + "1.4.10": "Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.", + "1.4.11": "The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.", + "1.4.12": "No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.", + "1.4.13": "Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.", + "2.1.1": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.", + "2.1.2": "If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.", + "2.1.4": "If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.", + "2.2.1": "For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.", + "2.2.2": "For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.", + "2.3.1": "Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.", + "2.4.1": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.", + "2.4.2": "Web pages, non-web documents, and software have titles that describe topic or purpose.", + "2.4.3": "If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.", + "2.4.4": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.", + "2.4.5": "More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.", + "2.4.6": "Headings and labels describe topic or purpose.", + "2.4.7": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.", + "2.4.11": "When an element receives focus, it is not entirely covered by other content.", + "2.5.1": "All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.", + "2.5.2": "For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.", + "2.5.3": "For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.", + "2.5.4": "Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.", + "2.5.8": "The size of the target for pointer inputs is at least 24 by 24 CSS pixels.", + "2.5.7": "All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.", + "3.1.1": "The default human language of Web pages, non-Web documents, or software can be programmatically determined.", + "3.1.2": "The human language of each passage or phrase in the content can be programmatically determined.", + "3.2.1": "When any component receives focus, it does not initiate a change of context.", + "3.2.2": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.", + "3.2.3": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.", + "3.2.4": "Components that have the same functionality within a set of Web pages are identified consistently.", + "3.2.6": "Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.", + "3.3.1": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.", + "3.3.2": "Labels or instructions are provided when content requires user input.", + "3.3.3": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.", + "3.3.4": "For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.", + "3.3.7": "Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.", + "3.3.8": "Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.", + "4.1.1": "(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.", + "4.1.2": "For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.", + "4.1.3": "In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.", + "HTML": "The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.", + "ARIA": "The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.", +}; +exports.a11yRulesets = [ + // { + // id: "DEBUG", + // name: "DEBUG Rules", + // category: eRuleCategory.ACCESSIBILITY, + // description: "Rules for debugging", + // checkpoints: [{ + // num: "1", + // name: "Debug CP 1", + // wcagLevel: "A", + // summary: "Rules for Debug" + // }] + // }, + { + id: "EXTENSIONS", + name: "Extension Rules", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for enabling the browser extensions", + type: IGuideline_1.eGuidelineType.EXTENSION, + checkpoints: [{ + num: "1", + name: "Extension CP 1", + wcagLevel: "A", + summary: "Rules for Extension" + }] + }, + { + id: "IBM_Accessibility", + name: "IBM Accessibility 7.3", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "IBM_Accessibility_next", + name: "IBM Accessibility next", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_2", + name: "WCAG 2.2 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_1", + name: "WCAG 2.1 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_0", + name: "WCAG 2.0 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.", + // This ruleset has all 2.0 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + } +]; + + +/***/ }, + +/***/ "./src/v4/simulator/SRController.ts" +/*!******************************************!*\ + !*** ./src/v4/simulator/SRController.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRController = void 0; +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var SRRenderer_1 = __webpack_require__(/*! ./SRRenderer */ "./src/v4/simulator/SRRenderer.ts"); +var SRNavigator_1 = __webpack_require__(/*! ./SRNavigator */ "./src/v4/simulator/SRNavigator.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var SRUtil_1 = __webpack_require__(/*! ./SRUtil */ "./src/v4/simulator/SRUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +/** + * SRController class for managing screen reader simulation + * Maintains a point of regard and provides navigation functions + */ +var SRController = /** @class */ (function () { + /** + * Creates a new SRController + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRController(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + this.rootElement = rootElement; + this.liveListeners = []; + this.ctrlDoc = rootElement.ownerDocument; + this.setPointOfRegard(rootElement); + this.setupMutationTracking(); + console.info("[WARNING] The SRController is a new feature that is not yet \"stable\". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback."); + } + SRController.getController = function (ctrlDoc) { + if (ctrlDoc === void 0) { ctrlDoc = document; } + if (!this.singleton) { + this.singleton = new SRController(ctrlDoc.body); + } + return this.singleton; + }; + SRController.prototype.disconnect = function () { + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + }; + SRController.prototype.findAllShadowRoots = function (root) { + if (root === void 0) { root = document; } + var shadowRoots = []; + // Get all elements in the current root + var walker = this.ctrlDoc.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null); + var node; + while (node = walker.nextNode()) { + var element = node; + // Check if this element has an open shadow root + if (element.shadowRoot) { + shadowRoots.push(element.shadowRoot); + // Recursively search inside this shadow root + var nestedShadowRoots = this.findAllShadowRoots(element.shadowRoot); + shadowRoots.push.apply(shadowRoots, nestedShadowRoots); + } + } + return shadowRoots; + }; + /** + * Set up mutation tracking + * + * In the event that the point of regard is removed from the DOM, we need to get up to the nearest parent that's not being removed + */ + SRController.prototype.setupMutationTracking = function () { + var _this = this; + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + var myThis = this; + var observer = new MutationObserver(function (mutations) { + var porNode = myThis.pointOfRegard.getNode(); + var _loop_1 = function (removalMutation) { + removalMutation.removedNodes.forEach(function (removedNode) { + if (removedNode.isSameNode(porNode) || removedNode.contains(porNode)) { + console.info("Adjusting PoR due to DOM mutation removing PoR"); //, removalMutation.target, removedNode, porNode) + porNode = removalMutation.target; + } + }); + }; + for (var _i = 0, _a = mutations.filter(function (mutation) { var _a; return ((_a = mutation.removedNodes) === null || _a === void 0 ? void 0 : _a.length) > 0; }); _i < _a.length; _i++) { + var removalMutation = _a[_i]; + _loop_1(removalMutation); + } + ; + _this.setPointOfRegard(porNode); + var _loop_2 = function (mutation) { + if (mutation.addedNodes) { + mutation.addedNodes.forEach(function (addedNode) { + // Add observation of new shadow roots + var allRoots = _this.findAllShadowRoots(addedNode); + for (var _i = 0, allRoots_2 = allRoots; _i < allRoots_2.length; _i++) { + var root = allRoots_2[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }); + } + var node = mutation.target; + var elem = node.nodeType === 1 ? node : node.parentElement; + if (elem + && !elem.closest("[aria-busy=\"true\"]") + && elem.getAttribute("aria-busy") !== "true") { + // Identify the live region container + var liveRegionElem = + // The element itself is a live region container + ((["polite", "assertive"].includes(elem.getAttribute("aria-live")) + || elem.nodeName.toUpperCase() === "OUTPUT" + || ["status", "log", "progressbar", "alert", "timer"].includes(elem.getAttribute("role"))) && elem) + // Or get the nearest ancestor + || elem.closest("[aria-live=\"polite\"],[aria-live=\"assertive\"],output,[role=\"status\"],[role=\"log\"],[role=\"progressbar\"],[role=\"alert\"],[role=\"timer\"]"); + var isMutationRelevant = false; + var relevance_1 = ["additions", "text"]; + if (liveRegionElem) { + // Determine what kinds of changes are 'relevant' + var relevantElem = elem.closest("[aria-relevant]"); + if (relevantElem) { + relevance_1 = relevantElem.getAttribute("aria-relevant").split(/ +/g); + } + if (liveRegionElem.getAttribute("role") === "log") { + relevance_1 = ["additions"]; + } + if (liveRegionElem.hasAttribute("aria-relevant")) { + relevance_1 = liveRegionElem.getAttribute("aria-relevant").split(/ +/g); + } + if (relevance_1.includes("all")) { + relevance_1 = ["additions", "removals", "text"]; + } + isMutationRelevant = (mutation.target.nodeType === 3 && relevance_1.includes("text")) + || (mutation.addedNodes.length > 0 && relevance_1.includes("additions")) + || (mutation.removedNodes.length > 0 && relevance_1.includes("removals")); + } + if (liveRegionElem && isMutationRelevant) { + var isAtomic_1 = liveRegionElem.getAttribute("aria-atomic") === "true" || ["alert", "status", "timer", "marquee"].includes(liveRegionElem.getAttribute("role")); + // Read the whole region if atomic + if (!isAtomic_1 && mutation.type === "characterData" && mutation.target.nodeType === 3 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(mutation.target.parentElement)) { + for (var _c = 0, _d = _this.liveListeners; _c < _d.length; _c++) { + var liveListener = _d[_c]; + liveListener(mutation.target.nodeValue); + } + } + else { + var liveTarget_1 = isAtomic_1 ? liveRegionElem : mutation.target; + if (liveTarget_1.liveAnnounce) { + clearTimeout(liveTarget_1.liveAnnounce); + } + liveTarget_1.liveAnnounce = setTimeout(function () { + var results = []; + var isRemoval = (relevance_1.includes("removals") && mutation.removedNodes.length > 0); + if (isAtomic_1 || isRemoval) { + var liveCursor = new SRCursor_1.SRCursor(liveTarget_1, false); + var liveCursorEnd = new SRCursor_1.SRCursor(liveTarget_1, true); + liveCursorEnd.next(function () { return true; }); + results.push((isRemoval ? "[removed] " : "") + SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + } + else if (relevance_1.includes("additions") && mutation.addedNodes.length > 0) { + mutation.addedNodes.forEach(function (addedNode) { + // Just render the additions + var liveCursor = new SRCursor_1.SRCursor(addedNode, false); + var liveCursorEnd = new SRCursor_1.SRCursor(addedNode, true); + liveCursorEnd.next(function () { return true; }); + results.push(SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + }); + } + for (var _i = 0, _a = _this.liveListeners; _i < _a.length; _i++) { + var liveListener = _a[_i]; + liveListener(results.join("\n")); + } + }, 100); + } + } + } + }; + for (var _b = 0, mutations_1 = mutations; _b < mutations_1.length; _b++) { + var mutation = mutations_1[_b]; + _loop_2(mutation); + } + }); + // Need to observe all of the shadow roots + var allRoots = this.findAllShadowRoots(this.ctrlDoc.documentElement); + allRoots.push(this.ctrlDoc.documentElement); + for (var _i = 0, allRoots_1 = allRoots; _i < allRoots_1.length; _i++) { + var root = allRoots_1[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }; + SRController.prototype.addLiveListener = function (listener) { + this.liveListeners.push(listener); + }; + SRController.prototype.removeLiveListener = function (removeListener) { + this.liveListeners = this.liveListeners.filter(function (listener) { return listener !== removeListener; }); + }; + /** + * Get the current point of regard + * @returns The current SRCursor representing the point of regard + */ + SRController.prototype.getPointOfRegard = function () { + return this.pointOfRegard; + }; + /** + * Set the point of regard to a specific DOM node + * @param node The node to set as the point of regard + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.setPointOfRegard = function (node) { + var _a; + var DEBUG = false; + DEBUG && console.group("setPointOfRegard"); + try { + this.pointOfRegard = new SRCursor_1.SRCursor(node); + // Update container state + var containerChanges = SRController.diffContainers("focus", this.pointOfRegard); + var role = this.pointOfRegard.getRole(); + var name_1 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + return { + success: true, + renderingResult: SRRenderer_1.SRRenderer.renderCurrent("focus", this.pointOfRegard, containerChanges), + role: role, + name: name_1 + }; + } + catch (error) { + return { + success: false, + renderingResult: { + start: this.pointOfRegard.clone(), + end: this.pointOfRegard.clone(), + message: "Failed to set point of regard: ".concat(error.message) + } + }; + } + finally { + DEBUG && console.groupEnd(); + } + }; + /** + * Jump to the next element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpNext = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + var DEBUG = false; + DEBUG && console.group("jumpNext"); + try { + var bContinue = true; + var nextJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && nextJump) { + var lastJump = nextJump.clone(); + nextJump = SRNavigator_1.SRNavigator.jumpNext(mode, nextJump); + if (nextJump) { + var containerChanges = SRController.diffContainers(mode, nextJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(nextJump.getRole(), !nextJump.isEndTag(), nextJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, nextJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!nextJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No next ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = nextJump; + var role = this.pointOfRegard.getRole(); + var name_2 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // Check for container changes + DEBUG && console.log("New POR:", this.pointOfRegard.getNode(), renderingResult); + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_2 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + finally { + console.groupEnd(); + } + }; + /** + * Jump to the previous element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpPrevious = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + try { + var bContinue = true; + var prevJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && prevJump) { + var lastJump = prevJump.clone(); + prevJump = SRNavigator_1.SRNavigator.jumpPrevious(mode, prevJump); + if (prevJump) { + var containerChanges = SRController.diffContainers(mode, prevJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(prevJump.getRole(), !prevJump.isEndTag(), prevJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, prevJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!prevJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No previous ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = prevJump; + var role = this.pointOfRegard.getRole(); + var name_3 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // // Check for container changes + // const containerChanges = SRController.diffContainers(mode, this.pointOfRegard, oldPointOfRegard); + // let s = SRRenderer.renderEnter(mode, this.pointOfRegard); + // if (containerChanges.entering[containerChanges.entering.length-1] !== s) { + // containerChanges.entering.push(s); + // } + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_3 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + }; + /** + * Determine the different in containers between the two nodes + * @param newWalker The new node we're navigating to + * @param oldWalker The previous node we were at + * @returns Array of container change messages + */ + /** + * Walk up from a node in an iframe subdocument to find the host <iframe> element + * in the nearest ancestor document. Returns null if the node is not in a subdocument. + */ + SRController.hostIframe = function (node) { + var doc = node.ownerDocument; + if (!doc || doc === document) + return null; + // contentWindow.frameElement is the <iframe> in the parent document + try { + return DOMUtil_1.DOMUtil.getAncestor(node, ["iframe"]); + } + catch (_a) { + return null; + } + }; + SRController.diffContainers = function (mode, newWalker, oldWalker) { + var _a, _b; + var DEBUG = false; + DEBUG && console.log("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"); + DEBUG && console.log("A)", oldWalker === null || oldWalker === void 0 ? void 0 : oldWalker.getNode().nodeName, newWalker.getNode().nodeName); + var leaving = []; + var entering = []; + try { + var newDoc = (_a = newWalker === null || newWalker === void 0 ? void 0 : newWalker.getNode().ownerDocument) !== null && _a !== void 0 ? _a : document; + var oldDoc = (_b = oldWalker === null || oldWalker === void 0 ? void 0 : oldWalker.getNode().ownerDocument) !== null && _b !== void 0 ? _b : document; + // ── Cross-document iframe boundary ────────────────────────────────── + // When the navigation crosses into or out of an <iframe> subdocument + // the normal commonParent walk cannot span document boundaries. + // We detect this and manually inject the container-enter/exit for the + // <iframe> element itself. + if (newDoc !== oldDoc) { + var newIframe = SRController.hostIframe(newWalker.getNode()); + var oldIframe = SRController.hostIframe(oldWalker === null || oldWalker === void 0 ? void 0 : oldWalker.getNode()); + if (newIframe && !oldIframe) { + // Entering an iframe subdocument — emit the frame container-enter. + var iframeCursor = new SRCursor_1.SRCursor(newIframe, false); + var enter = SRRenderer_1.SRRenderer.renderEnter(mode, iframeCursor, oldWalker); + if (enter && enter.trim()) + entering.push(enter.trim()); + } + else if (!newIframe && oldIframe) { + // Leaving an iframe subdocument — emit the frame container-exit. + var iframeCursor = new SRCursor_1.SRCursor(oldIframe, true); + var leave = SRRenderer_1.SRRenderer.renderLeave(mode, iframeCursor, oldWalker); + if (leave && leave.trim()) + leaving.push(leave.trim()); + } + else if (newIframe && oldIframe && newIframe !== oldIframe) { + // Moving between two different iframes — exit old, enter new. + var oldCursor = new SRCursor_1.SRCursor(oldIframe, true); + var leave = SRRenderer_1.SRRenderer.renderLeave(mode, oldCursor, oldWalker); + if (leave && leave.trim()) + leaving.push(leave.trim()); + var newCursor = new SRCursor_1.SRCursor(newIframe, false); + var enter = SRRenderer_1.SRRenderer.renderEnter(mode, newCursor, oldWalker); + if (enter && enter.trim()) + entering.push(enter.trim()); + } + // After injecting iframe boundary announcements, also run the normal + // within-document diffContainers for each side independently so that + // landmarks inside the iframe are announced correctly. + return { leaving: leaving, entering: entering }; + } + // ── Same-document path (original logic) ───────────────────────────── + var docRoot = newWalker ? + (newWalker.getNode().ownerDocument.body || newWalker.getNode().ownerDocument.documentElement) : + oldWalker ? + (oldWalker.getNode().ownerDocument.body || oldWalker.getNode().ownerDocument.documentElement) : + document.body || document.documentElement; + var walkNew = newWalker ? newWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + var walkOld = oldWalker ? oldWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + if (!walkNew.getNode().isSameNode(walkOld.getNode())) { + var commonParent = SRController.commonParent(walkNew, walkOld); + if (commonParent) { + DEBUG && console.log("B)", commonParent.getNode().nodeName); + while (commonParent.contains(walkNew)) { + DEBUG && console.log("Entering:", walkNew.getNode().nodeName); + entering.push(SRRenderer_1.SRRenderer.renderEnter(mode, walkNew, walkOld)); + walkNew.parent(); + } + entering.reverse(); + entering = entering.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + ; + while (commonParent.contains(walkOld)) { + DEBUG && console.log("Leaving:", walkOld.getNode().nodeName); + leaving.push(SRRenderer_1.SRRenderer.renderLeave(mode, walkOld, walkOld)); + walkOld.parent(); + } + leaving = leaving.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + } + } + } + catch (err) { + console.error(err); + } + DEBUG && console.log(leaving, entering); + return { + leaving: leaving, + entering: entering + }; + }; + SRController.commonParent = function (walkerOne, walkerTwo) { + if (walkerOne.contains(walkerTwo)) { + return walkerOne.clone(); + } + else if (walkerTwo.contains(walkerOne)) { + return walkerTwo.clone(); + } + else { + var commonParent = walkerOne.clone(); + while (!commonParent.contains(walkerTwo) && commonParent.parent()) + ; + if (!commonParent.contains(walkerOne) || !commonParent.contains(walkerTwo)) { + return null; + } + return commonParent; + } + }; + SRController.renderAll = function (mode) { + var ctrl = SRController.getController(); + var dialogs = ctrl.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg.message); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + results.push(nextVal.renderingResult.message); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderAllDetail = function (doc, mode) { + var ctrl = SRController.getController(doc); + ctrl.setPointOfRegard(doc.body); + var dialogs = doc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + // mode === "item" && console.log(nextVal); + results.push(nextVal.renderingResult); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderStructure = function (doc) { + var _a, _b; + var modes = ["region", "heading", "item", "tab_focus", "image"]; + var details = modes.map(function (modeLabel) { return SRController.renderAllDetail(doc, modeLabel); }); + var retVal = []; + var _loop_3 = function () { + var next = (_a = details[0][0]) === null || _a === void 0 ? void 0 : _a.start; + modes.forEach(function (mode, idx) { + if (details[idx].length > 0) { + if (!next || SRCursor_1.SRCursor.compare(details[idx][0].start, next) < 0) { + next = details[idx][0].start; + } + } + }); + var nextItem = {}; + var hasValue = false; + modes.forEach(function (mode, idx) { + nextItem[mode] = ""; + if (details[idx].length > 0 && SRCursor_1.SRCursor.compare(details[idx][0].start, next) === 0) { + nextItem[mode] = details[idx].shift().message; + hasValue = nextItem[mode] !== ""; + } + }); + if (hasValue) { + var elem = next.getElement(); + var selector = elem && SRUtil_1.SRUtil.getUniqueSelector(elem); + // Use the element's own document for querySelector so that elements + // inside iframe subdocuments resolve correctly. + var elemDoc = (_b = elem === null || elem === void 0 ? void 0 : elem.ownerDocument) !== null && _b !== void 0 ? _b : doc; + if (selector && elemDoc.querySelector(selector)) { + nextItem.selector = selector; + } + retVal.push(nextItem); + } + }; + while (details.some(function (detail) { return detail.length > 0; })) { + _loop_3(); + } + return retVal; + }; + return SRController; +}()); +exports.SRController = SRController; + + +/***/ }, + +/***/ "./src/v4/simulator/SRCursor.ts" +/*!**************************************!*\ + !*** ./src/v4/simulator/SRCursor.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRCursor = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var SRUtil_1 = __webpack_require__(/*! ./SRUtil */ "./src/v4/simulator/SRUtil.ts"); +/** + * SRCursor (Screen Reader Cursor) class + * + * This class provides a cursor-like interface for navigating the DOM in a way that + * simulates how screen readers process and navigate content. It tracks: + * - The current node position + * - Whether it's at a start or end tag + * - The ARIA role of the current node + * - The accessible name of the current node + */ +var SRCursor = /** @class */ (function () { + /** + * Creates a new SRCursor positioned at the specified element + * @param element - The DOM node to position the cursor at + * @param bEnd - Whether to position at the end tag (true) or start tag (false) + */ + function SRCursor(element, bEnd) { + // Use DOMWalker with considerHidden=false to process all content (including hidden elements) + // This is important for screen reader simulation which needs to see all content + this.walker = new DOMWalker_1.DOMWalker(element, bEnd, undefined, false); + if (element) { + this.refreshName(); + } + } + /** + * Creates a copy of this cursor at the same position + * @returns A new SRCursor instance with the same position and properties + */ + SRCursor.prototype.clone = function () { + var retVal = new SRCursor(this.walker.node, this.walker.bEndTag); + retVal.role = this.role; + retVal.name = this.name; + retVal.preLineIndex = this.preLineIndex; + return retVal; + }; + /** + * Updates the role and accessible name properties based on the current node + * This is called whenever the cursor position changes + * @private + */ + SRCursor.prototype.refreshName = function () { + if (this.walker.node.nodeType === 1) { + // Element node + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + // Text node + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + // Other node types + this.role = undefined; + this.name = undefined; + } + }; + /** + * Moves the cursor to the next node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.next = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + // const DEBUG = false; + var foundNext = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("next function"); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && !this.walker.bEndTag) { + this.walker.bEndTag = true; + } + else if (!this.walker.nextNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundNext = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundNext); + DEBUG && console.log("foundNext:", foundNext, this.isEndTag() ? "/" : "", this.getNode()); + DEBUG && console.groupEnd(); + if (foundNext) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundNext; + }; + /** + * Moves the cursor to the previous node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.previous = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + var foundPrevious = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("previous function"); + DEBUG && console.log(this.isEndTag(), this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log(skipCurrent, skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && this.walker.bEndTag) { + DEBUG && console.log("Skipping node"); + this.walker.bEndTag = false; + } + else if (!this.walker.prevNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag(), this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log(skipCurrent, skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && !this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundPrevious = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundPrevious); + DEBUG && console.log(this.isEndTag(), this.getNode()); + DEBUG && console.groupEnd(); + if (foundPrevious) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundPrevious; + }; + /** + * Moves the cursor to the parent node of the current node + * @param endTag - Whether to position at the end tag (true) or start tag (false) + * @returns true if successfully moved to parent, false if no parent exists + */ + SRCursor.prototype.parent = function (endTag) { + if (!this.walker.node.parentNode) + return false; + this.walker.node = this.walker.node.parentNode; + this.walker.bEndTag = endTag === true; + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + this.role = undefined; + this.name = undefined; + } + return true; + }; + /** + * Moves the cursor up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.getCurrentOrParentByRole = function (roles, elems) { + var _this = this; + var uppElems = elems ? elems.map(function (elem) { return elem.toUpperCase(); }) : []; + var matches = function (walker) { + var elem = walker.getElement(); + return roles.includes(_this.getRole()) + || (elem && !elem.hasAttribute("role") && uppElems.includes(elem.nodeName.toUpperCase())); + }; + while (!matches(this) && this.parent()) + ; + return matches(this); + }; + /** + * Creates a new cursor and moves it up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns A new cursor at the matching node, or null if no match found + */ + SRCursor.prototype.getCurrentOrParentByRoleClone = function (roles, elems) { + var retVal = this.clone(); + if (retVal.getCurrentOrParentByRole(roles, elems)) { + return retVal; + } + return null; + }; + SRCursor.prototype.getCurrentOrParentTabbableClone = function () { + var retVal = this.clone(); + while (retVal) { + var elem = retVal.getElement(); + if (retVal.isStartTag() && elem && CommonUtil_1.CommonUtil.isTabbable(elem)) { + return retVal; + } + if (!retVal.parent(false)) { + break; + } + } + return null; + }; + /** + * Gets the ARIA role of the current node + * @returns The ARIA role as a string, or undefined if not available + */ + SRCursor.prototype.getRole = function () { + return this.role; + }; + /** + * Gets the accessible name info for the current node + * @returns The AccessibleNameResult object, or undefined if not available + */ + SRCursor.prototype.getNameInfo = function () { + return this.name; + }; + /** + * Get the accessible name of the current node + */ + SRCursor.prototype.getName = function () { + // Handle one-off quirks in the name calculation + var nameInfo = this.getNameInfo(); + if (nameInfo && nameInfo.name) { + return nameInfo.name; + } + var elem = this.getElement(); + if (elem) { + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + return labelElem.innerText || labelElem.textContent; + } + } + }; + /** + * Sets whether the cursor is at an end tag or start tag + * @param val - True for end tag, false for start tag + */ + SRCursor.prototype.setEndTag = function (val) { + this.walker.bEndTag = val; + }; + /** + * Gets the DOM node at the current cursor position + * @returns The current DOM node + */ + SRCursor.prototype.getNode = function () { + return this.walker.node; + }; + /** + * Gets the current node as an HTMLElement if it is an element node + * @returns The current node as HTMLElement, or undefined if not an element + */ + SRCursor.prototype.getElement = function () { + if (!this.walker.node) + return undefined; + if (this.walker.node.nodeType !== 1) + return undefined; + return this.walker.node; + }; + SRCursor.prototype.getParentElement = function () { + if (!this.walker.node) + return null; + var retVal = this.clone(); + retVal.walker.node = DOMWalker_1.DOMWalker.parentElement(retVal.walker.node); + return retVal; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isEndTag = function () { + return this.walker.bEndTag; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isStartTag = function () { + return !this.walker.bEndTag; + }; + /** + * Compares the document position of two cursors + * @param one - First cursor to compare + * @param two - Second cursor to compare + * @returns 0 if equal, -1 if one is before two, 1 if one is after two + */ + SRCursor.compare = function (one, two) { + var _a, _b; + var nodeOne = (_a = one === null || one === void 0 ? void 0 : one.walker) === null || _a === void 0 ? void 0 : _a.node; + var nodeTwo = (_b = two === null || two === void 0 ? void 0 : two.walker) === null || _b === void 0 ? void 0 : _b.node; + if (!nodeOne && !nodeTwo) + return 0; + if (!nodeOne) + return 1; + if (!nodeTwo) + return -1; + // When both cursors are at the same <pre> element and at least one has a + // preLineIndex, use line index ordering so virtual per-line stops are sequenced + // correctly. preLineIndex=undefined means the block-enter stop, which comes + // before all numbered lines (undefined < 0 < 1 < 2 …). + if (nodeOne === nodeTwo && !one.walker.bEndTag && !two.walker.bEndTag) { + var lineOneUndefined = one.preLineIndex === undefined; + var lineTwoUndefined = two.preLineIndex === undefined; + if (!lineOneUndefined || !lineTwoUndefined) { + // At least one cursor has a line index + if (lineOneUndefined) + return -1; // undefined (block-enter) sorts before all lines + if (lineTwoUndefined) + return 1; // two is block-enter; one (a numbered line) is after + if (one.preLineIndex !== two.preLineIndex) { + return one.preLineIndex < two.preLineIndex ? -1 : 1; + } + } + } + var docPosition = nodeOne.compareDocumentPosition(nodeTwo); + // Handle disconnected nodes (different documents or shadow DOMs) + if (docPosition & 0x1) { + // Nodes are disconnected - they're in different trees (iframe or shadow DOM) + // Build ancestor chains using DOMWalker.parentNode (handles shadow DOM & iframes) + var ancestorsOne = [nodeOne]; + var ancestorsTwo = [nodeTwo]; + var current = nodeOne; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsOne.push(current); + } + current = nodeTwo; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsTwo.push(current); + } + // Reverse so root is first + ancestorsOne.reverse(); + ancestorsTwo.reverse(); + // Find where the paths diverge + var commonDepth = 0; + while (commonDepth < ancestorsOne.length && + commonDepth < ancestorsTwo.length && + ancestorsOne[commonDepth] === ancestorsTwo[commonDepth]) { + commonDepth++; + } + // If one path is a prefix of the other, handle containment + if (commonDepth === ancestorsOne.length) { + // nodeOne is an ancestor of nodeTwo + return one.walker.bEndTag ? 1 : -1; + } + if (commonDepth === ancestorsTwo.length) { + // nodeTwo is an ancestor of nodeOne + return two.walker.bEndTag ? -1 : 1; + } + // Compare the nodes where paths diverge + if (commonDepth > 0) { + var childOne = ancestorsOne[commonDepth]; + var childTwo = ancestorsTwo[commonDepth]; + var childPosition = childOne.compareDocumentPosition(childTwo); + if (childPosition & 0x2) + return 1; // childTwo precedes childOne + if (childPosition & 0x4) + return -1; // childOne precedes childTwo + } + // No common ancestor found - shouldn't happen in a well-formed document + return 0; + } + if (docPosition & 0x8) { + // one is contained within two + // if two is an end tag, one is before, otherwise, one is after + return two.walker.bEndTag ? -1 : 1; + } + else if (docPosition & 0x10) { + // two is contained within one + // if one is an end tag, one is after, otherwise, one is before + return one.walker.bEndTag ? 1 : -1; + } + else if (docPosition & 0x2) { + // two precedes one in the document + return 1; + } + else if (docPosition & 0x4) { + // one precedes two in the document + return -1; + } + return 0; + }; + /** + * Checks if this cursor's node contains another cursor's node + * @param other - The other cursor to check + * @returns true if this cursor contains (is a parent/ancestor of) the other cursor's node + */ + SRCursor.prototype.contains = function (other) { + return this.getNode().contains(other.getNode()) + && !this.isSameNode(other); + }; + /** + * Checks if this cursor points to the same node as another cursor + * @param other - The other cursor to compare with + * @returns true if both cursors point to the same node + */ + SRCursor.prototype.isSameNode = function (other) { + if (!other) + return false; + return this.getNode().isSameNode(other.getNode()); + }; + /** + * Checks if the current node has a non-empty accessible name + * @returns true if the node has a non-empty accessible name + */ + SRCursor.prototype.hasNonEmptyName = function () { + var _a; + return (((_a = this.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || "").trim().length > 0; + }; + return SRCursor; +}()); +exports.SRCursor = SRCursor; + + +/***/ }, + +/***/ "./src/v4/simulator/SRNavigator.ts" +/*!*****************************************!*\ + !*** ./src/v4/simulator/SRNavigator.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRNavigator = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var SRNavigator; +(function (SRNavigator) { + /** + * Determine if a node is a block-level element based on its display property + * @param node The DOM node to check + * @returns true if the node is a block-level element, false otherwise + */ + function isBlockElement(node) { + var _a; + if (node.nodeType !== 1) + return false; + if (["br", "iframe"].includes(node.nodeName.toLowerCase())) + return true; + var elem = node; + var mywin = elem.ownerDocument.defaultView; + var disp = (_a = mywin.getComputedStyle(elem)) === null || _a === void 0 ? void 0 : _a.display; + if (disp && disp.startsWith("table")) + return true; + if (disp === "block" && elem.style.display !== "block") { + // Is this block because it's a flex elem? + if (elem.parentElement && mywin.getComputedStyle(elem.parentElement).display === "flex") { + return false; + } + } + if (AriaUtil_1.AriaUtil.getResolvedRole(elem, true) === "link") { + var temp = new DOMWalker_1.DOMWalker(node, false, undefined, false); + temp.prevNode(); + if (!isBlockElement(temp.node)) { + return true; + } + } + return ["block", "flex", "grid", "list-item"].includes(disp); + } + /** + * Collect all logical lines from a <pre> element by walking its entire subtree + * (via DOMWalker, shadow-DOM safe) and concatenating text node content, splitting + * on newlines. Only inline-context nodes are included — any descendant block + * element would be unusual inside <pre> and is ignored. + * + * Returns the trimmed, non-empty lines. + */ + function getPreLines(preElem) { + var _a; + // Concatenate all text inside the <pre>, preserving inline structure + var fullText = (_a = preElem.textContent) !== null && _a !== void 0 ? _a : ""; + var rawLines = fullText.split("\n"); + // Trim leading and trailing blank lines + var start = 0; + while (start < rawLines.length && rawLines[start].trim() === "") + start++; + var end = rawLines.length - 1; + while (end >= start && rawLines[end].trim() === "") + end--; + return rawLines.slice(start, end + 1); + } + SRNavigator.getPreLines = getPreLines; + /** + * Returns true if node is a <pre> element (the item-level cursor position for + * preformatted lines uses the <pre> element itself with preLineIndex set). + */ + function isPreElement(node) { + return node.nodeType === 1 && node.nodeName.toUpperCase() === "PRE"; + } + function getExplicitTabindex(node) { + if (!node || node.nodeType !== 1) + return null; + var elem = node; + if (!elem.hasAttribute("tabindex")) + return null; + var tabindexValue = parseInt(elem.getAttribute("tabindex"), 10); + return Number.isNaN(tabindexValue) ? null : tabindexValue; + } + function isPositiveTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return explicitTabindex !== null && explicitTabindex > 0 && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function isDefaultOrZeroTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return (explicitTabindex === null || explicitTabindex === 0) && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function getTabFocusStartFunc(includePositiveTabindex) { + if (includePositiveTabindex === void 0) { includePositiveTabindex = true; } + return function (_role, bStartTag, node) { + if (!(node && node.nodeType === 1 && bStartTag && CommonUtil_1.CommonUtil.isTabbable(node))) + return false; + return includePositiveTabindex || isDefaultOrZeroTabFocus(node); + }; + } + /** + * Collect all tabbable elements in tab order (positive tabindex first, then document order) + * @param matchFunc Function to match tabbable elements + * @param rootNode Optional root node to start collection from (defaults to document body) + * @returns Array of cursors pointing to tabbable elements in tab order + */ + function collectTabFocusCursors(matchFunc, rootNode) { + var root = ((rootNode === null || rootNode === void 0 ? void 0 : rootNode.ownerDocument) || document).body || rootNode; + if (!root) + return []; + var walker = new SRCursor_1.SRCursor(root, false); + var skipFunc = getSkipFunc("tab_focus"); + var positiveResults = []; + var normalResults = []; + var addCursor = function (cursor) { + if (!matchFunc(cursor.getRole(), !cursor.isEndTag(), cursor.getNode())) + return; + if (isPositiveTabFocus(cursor.getNode())) { + positiveResults.push(cursor.clone()); + } + else if (isDefaultOrZeroTabFocus(cursor.getNode())) { + normalResults.push(cursor.clone()); + } + }; + addCursor(walker); + while (walker.next(function () { return true; }, skipFunc)) { + addCursor(walker); + } + positiveResults.sort(function (a, b) { + var aElem = a.getElement(); + var bElem = b.getElement(); + var aTabindex = getExplicitTabindex(aElem) || 0; + var bTabindex = getExplicitTabindex(bElem) || 0; + if (aTabindex !== bTabindex) + return bTabindex - aTabindex; + return SRCursor_1.SRCursor.compare(a, b); + }); + return positiveResults.concat(normalResults); + } + /** + * Find the index of a cursor in an array of tab focus cursors + * @param cursors Array of cursors to search + * @param walker The cursor to find + * @returns The index of the cursor, or -1 if not found + */ + function findTabFocusIndex(cursors, walker) { + return cursors.findIndex(function (cursor) { return SRCursor_1.SRCursor.compare(cursor, walker) === 0; }); + } + /** + * Get the match function for identifying start positions in a given navigation mode + * @param mode The navigation mode (e.g., "link", "heading", "button", etc.) + * @returns A function that matches elements appropriate for the navigation mode + */ + function getStartFunc(mode) { + switch (mode) { + case "link": + return function (role, bStartTag) { return (bStartTag && role === "link"); }; + case "tab_focus": + return getTabFocusStartFunc(false); + case "heading": + return function (role, bStartTag) { return (bStartTag && role === "heading"); }; + case "h1": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "1"); }; + case "h2": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "2"); }; + case "h3": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "3"); }; + case "h4": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "4"); }; + case "h5": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "5"); }; + case "h6": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "6"); }; + case "image": + return function (role, bStartTag) { return (bStartTag && ["img", "graphics-document"].includes(role)); }; + case "radio": + return function (role, bStartTag) { return (bStartTag && role === "radio"); }; + case "button": + return function (role, bStartTag) { return (bStartTag && role === "button"); }; + case "checkbox": + return function (role, bStartTag) { return (bStartTag && role === "checkbox"); }; + case "combo": + return function (role, bStartTag) { return (bStartTag && role === "combobox"); }; + case "list": + return function (role, bStartTag) { return (bStartTag && role === "list"); }; + case "listitem": + return function (role, bStartTag) { return (bStartTag && role === "listitem"); }; + case "article": + return function (role, bStartTag) { return (bStartTag && role === "article"); }; + case "table": + return function (role, bStartTag) { return (bStartTag && role === "table"); }; + case "paragraph": + return function (_role, bStartTag, node) { return (bStartTag && node.nodeName.toUpperCase() === "P"); }; + case "dom": + return function () { return true; }; + case "item": + return function (cursor, bStartTag, node) { + if (!bStartTag) + return false; + // <iframe> content is inlined by the IFRAME SR_RULE into the + // parent block's rendering — the iframe itself is not an item stop. + if (node.nodeType === 1 && node.nodeName.toUpperCase() === "IFRAME") + return false; + // A <pre> element with preLineIndex set is a virtual per-line item. + // The initial encounter (preLineIndex undefined) is also a match so + // jumpNext can set preLineIndex=0 on it. + if (isPreElement(node)) + return true; + if (isBlockElement(node)) + return true; + var temp = new DOMWalker_1.DOMWalker(node, !bStartTag); + if (temp.prevNode() && temp.bEndTag) { + return isBlockElement(temp.node); + } + return false; + }; + case "region": + return function (role, bStartTag, node) { + var _a, _b; + if (!bStartTag) + return false; + if (["main", "navigation", "form", "banner", "search", "contentinfo"].includes(role)) + return true; + if (role !== "region" || (node === null || node === void 0 ? void 0 : node.nodeType) !== 1) + return false; + return !!((_b = (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(node)) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.trim()); + }; + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getStartFunc = getStartFunc; + /** + * Check if an element is within a Shadow DOM + * @param element The element to check + * @returns true if the element is in a Shadow DOM, false otherwise + */ + var isInShadowDOM = function (element) { + var root = element.getRootNode(); + return root instanceof ShadowRoot; + }; + /** + * Determine skip behavior for item navigation mode + * Handles complex visibility rules including hidden content in headings/links + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_ITEM_BEHAVIOR = function (cursor) { + var DEBUG = false; + DEBUG && console.group("SKIP_ITEM_BEHAVIOR"); + var retVal = null; + try { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + var cursorStart = cursor.clone(); + cursorStart.setEndTag(false); + DEBUG && console.log(nodeType); + // Skip CDATA and comments completely + if ([4, 8].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: true }; + // Only process elements and text + if (![1, 3].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: false }; + // For text elements, Consider with relation to their parent element + if (nodeType === 3) { + elem = cursor.getNode().parentElement; + if (!elem) + return retVal = VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + } + // if (!elem) console.log(cursor.getNode()); + // We have an element + // Make sure we're within the body element (or shadow DOM, or an iframe subdocument) + if (!elem.closest("body") && !isInShadowDOM(elem)) + return retVal = { skipCurrent: true, skipChildren: false }; + // Make sure we're not in a script or style + if (elem.closest("script,style")) + return retVal = { skipCurrent: true, skipChildren: true }; + // For text nodes, we need to check visibility in context of parent heading/link + // So we'll handle text node visibility checks below with the element visibility checks + // Skip things hidden from the AT, UNLESS we're inside a heading or link + // (headings and links should include their full accessible name, including hidden parts) + // BUT only if the heading/link uses nameFrom="content" (not aria-label/aria-labelledby) + var parentHeadingOrLink = cursorStart.getCurrentOrParentByRoleClone(["heading", "link"]); + // Special case: if current element itself is a heading or link AND we're NOT inside another heading/link, + // apply normal skip rules + var currentRole = AriaUtil_1.AriaUtil.getResolvedRole(elem); + var isCurrentHeadingOrLink = currentRole === "heading" || currentRole === "link"; + if (!parentHeadingOrLink) { + // Not inside any heading/link - apply normal skip rules + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + else { + // Check if the parent heading/link uses aria-label or aria-labelledby + var parentElem = parentHeadingOrLink.getElement(); + var nameInfo = parentHeadingOrLink.getNameInfo(); + // If nameFrom is NOT "content" or "text", skip all content (it's using aria-label/aria-labelledby) + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Parent uses aria-label/aria-labelledby - skip all content including nested headings/links + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + } + else if (isCurrentHeadingOrLink) { + // Current element is a heading/link inside another heading/link with content-based name + // Don't skip it - let it through so its content can be read + // (The logic at line 183 will handle whether to skip its children) + } + else { + // nameFrom is "content", so include hidden content but skip hidden images/graphics + var role_1 = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if ((role_1 === "img" || role_1 === "graphics-document") && VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + // Don't skip other hidden content - it should be included in the accessible name + } + } + if (elem.nodeName.toUpperCase() === "BODY") + return retVal = { skipCurrent: false, skipChildren: false }; + // Skip labels that are associated with controls - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL") { + if (elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + else { + var nestedControl = elem.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']"); + if (nestedControl && nestedControl.getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + // A <label> with no `for` and no nested control, used purely as an aria-labelledby + // target by another element, should be suppressed — it will be read as part of the + // widget's accessible name announcement. + var id = elem.getAttribute("id"); + if (id && document.querySelector("[aria-labelledby~=\"".concat(id, "\"]"))) { + return retVal = { skipCurrent: true, skipChildren: false }; + } + } + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursorStart.getRole(); + // A div/span combobox (role="combobox" on a non-input, non-select element) announces + // its value directly from text content or the controlled listbox, so skip its children + // to avoid double-announcing the inner text. + if (role === "combobox" + && elem.nodeName.toUpperCase() !== "SELECT" + && elem.nodeName.toUpperCase() !== "INPUT" + && !cursor.isEndTag()) { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // Skip children of headings/links that don't use content-based names + // UNLESS we're inside another heading/link that DOES use content-based names + if (["link", "heading"].includes(role) && (!cursorStart.getName() || (!["content", "text"].includes(cursorStart.getNameInfo().nameFrom)))) { + // Check if we're inside a parent heading/link with content-based name + if (parentHeadingOrLink && parentHeadingOrLink.getNameInfo() && ["content", "text"].includes(parentHeadingOrLink.getNameInfo().nameFrom)) { + // Don't skip children - we're nested inside a content-based heading/link + } + else { + return retVal = { skipCurrent: false, skipChildren: true }; + } + } + if (elem.nodeName.toUpperCase() === "LEGEND") { + var parent_1 = DOMWalker_1.DOMWalker.parentElement(cursor.getNode()); + while (parent_1) { + if (parent_1.nodeName.toUpperCase() === 'FIELDSET') { + // Legend is within a fieldset, suppress output + return retVal = { skipCurrent: false, skipChildren: true }; + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // <summary> is a self-announcing disclosure button — its children + // are folded into the ["label", button, collapsed] announcement, + // so skip traversal into them. + if (!cursor.isEndTag() && elem.nodeName.toUpperCase() === "SUMMARY") { + var detailsParent = elem.parentElement; + if (detailsParent && detailsParent.nodeName.toUpperCase() === "DETAILS") { + return retVal = { skipCurrent: false, skipChildren: true }; + } + } + // Skip non-summary children of a closed <details> element. + // Browsers hide those children via UA stylesheet (display:none), so + // they must not appear as reading stops when the widget is collapsed. + // Exempt the <details> element itself and <summary> (always visible). + if (!cursor.isEndTag() + && elem.nodeName.toUpperCase() !== "DETAILS" + && !elem.closest("summary")) { + var detailsAncestor = elem.closest("details"); + if (detailsAncestor && !detailsAncestor.hasAttribute("open")) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + } + if (elem.closest(".ibma-sr-overlay")) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + // Skip popup elements (listbox, tree, grid, dialog) that are owned by a combobox + // via aria-controls. In a real SR these are only reachable via aria-activedescendant, + // not by DOM traversal, so they should not appear as reading stops. + if (nodeType === 1 && !cursor.isEndTag()) { + var id = elem.getAttribute("id"); + if (id) { + var owner = document.querySelector("[aria-controls~=\"".concat(id, "\"]")); + if (owner && AriaUtil_1.AriaUtil.getResolvedRole(owner) === "combobox") { + return retVal = { skipCurrent: true, skipChildren: true }; + } + } + } + return retVal = null; + } + finally { + DEBUG && console.log("SKIP_ITEM retVal:", retVal); + DEBUG && console.groupEnd(); + } + }; + /** + * Determine skip behavior for nested navigation modes (link, heading, image, etc.) + * Simpler than SKIP_ITEM_BEHAVIOR as it doesn't need complex heading/link content rules + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_NESTED_BEHAVIOR = function (cursor) { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + // Only visit elements and text nodes + if (nodeType !== 1 && nodeType !== 3) + return { skipCurrent: true, skipChildren: false }; + if (nodeType === 3) + return VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + // We have an element + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return { skipCurrent: true, skipChildren: true }; + // Skip the inner document of an <iframe> — screen readers render the + // accessible name as the tab_focus label; the subdocument body should + // not contribute additional reading stops during renderRange traversal. + if (elem.nodeName.toUpperCase() === "IFRAME" && !cursor.isEndTag()) { + return { skipCurrent: false, skipChildren: true }; + } + // Skip label fors - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL" + && elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return { skipCurrent: true, skipChildren: false }; + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursor.getRole(); + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return { skipCurrent: false, skipChildren: true }; + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return { skipCurrent: true, skipChildren: true }; + } + if (elem.closest(".ibma-sr-overlay")) { + return { skipCurrent: true, skipChildren: true }; + } + return null; + }; + /** + * Get the skip function for a given navigation mode + * @param mode The navigation mode + * @returns A function that determines which nodes to skip during navigation + */ + function getSkipFunc(mode) { + switch (mode) { + case "region": + case "item": + return SKIP_ITEM_BEHAVIOR; + case "link": + case "tab_focus": + case "heading": + case "h1": + case "h2": + case "h3": + case "h4": + case "h5": + case "h6": + case "image": + return SKIP_NESTED_BEHAVIOR; + case "radio": + case "button": + case "checkbox": + case "combo": + case "list": + case "listitem": + case "article": + case "table": + case "paragraph": + case "dom": + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getSkipFunc = getSkipFunc; + /** + * Jump to the current position or the previous matching element if current doesn't match + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the current or previous matching position + */ + function jumpCurrent(mode, walker) { + var matchFunc = mode === "tab_focus" ? getTabFocusStartFunc(true) : getStartFunc(mode); + if (matchFunc(walker.getRole(), !walker.isEndTag(), walker.getNode())) { + return walker.clone(); + } + else { + return jumpPrevious(mode, walker); + } + } + SRNavigator.jumpCurrent = jumpCurrent; + /** + * Jump to the end of the current element and return all intermediate item positions + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns Array of cursors representing positions from current to end + */ + function jumpCurrentEnd(mode, walker) { + if (mode === "item") { + // For any <pre> item (block-enter stop or per-line stop), the render range + // must end at the next virtual line cursor (same <pre> node, next index) so + // that renderRange never walks into <pre>'s children. + if (isPreElement(walker.getNode()) && !walker.isEndTag()) { + var lines = getPreLines(walker.getNode()); + var nextIdx = walker.preLineIndex === undefined ? 0 : walker.preLineIndex + 1; + // Use nextIdx as the end sentinel — even if it equals lines.length (past + // the last line), compare() will still correctly stop renderRange before + // any child node because children are contained within <pre>. + var endCursor = walker.clone(); + endCursor.preLineIndex = nextIdx; + return [endCursor]; + } + var itemEnd = jumpNext(mode, walker); + return itemEnd ? [itemEnd] : []; + } + else { + var nameInfo = walker.getNameInfo(); + var retVal = walker.clone(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Name is just from the item itself + retVal.next(function () { return true; }); + } + else { + // Name is from the content + retVal.setEndTag(true); + retVal.next(function () { return true; }); + } + var endCursors = []; + var itemEnd = jumpNext("item", walker); + while (itemEnd && SRCursor_1.SRCursor.compare(itemEnd, retVal) < 0) { + endCursors.push(itemEnd); + itemEnd = jumpNext("item", itemEnd); + } + endCursors.push(retVal); + return mode === "tab_focus" && walker.getRole() === "link" ? [endCursors[endCursors.length - 1]] : endCursors; + } + } + SRNavigator.jumpCurrentEnd = jumpCurrentEnd; + /** + * Jump to the next matching element in the given navigation mode + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the next matching position, or null if none found + */ + function jumpNext(mode, walker) { + var DEBUG = false; + DEBUG && console.group("SRNavigator::jumpNext", walker.isEndTag() ? "/" : "", walker.getNode()); + try { + if (mode === "tab_focus") { + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + // console.log(tabFocusCursors.map(c => c.getNode())); + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex >= 0) { + if (currentIndex + 1 < tabFocusCursors.length) { + return tabFocusCursors[currentIndex + 1].clone(); + } + return null; + } + return tabFocusCursors[0].clone(); + } + } + if (mode === "item" && isPreElement(walker.getNode()) && !walker.isEndTag()) { + var lines = getPreLines(walker.getNode()); + if (walker.preLineIndex === undefined) { + // At the block-enter stop — jump to the first line item + if (lines.length > 0) { + var retVal_1 = walker.clone(); + retVal_1.preLineIndex = 0; + return retVal_1; + } + // Empty <pre> — fall through to DOM traversal past </pre> + } + else { + // At a line item — advance to the next line or past </pre> + var currentLineIdx = walker.preLineIndex; + if (currentLineIdx + 1 < lines.length) { + var retVal_2 = walker.clone(); + retVal_2.preLineIndex = currentLineIdx + 1; + return retVal_2; + } + // All lines exhausted — move past </pre> to the next DOM item. + // Always land on the block-enter stop (preLineIndex=undefined) so the + // caller gets a chance to render the container-enter announcement before + // advancing to the first line. + var retVal_3 = walker.clone(); + retVal_3.setEndTag(true); + var matchFunc_1 = getStartFunc(mode); + var skipFunc_1 = getSkipFunc(mode); + if (retVal_3.next(matchFunc_1, skipFunc_1)) { + if (isPreElement(retVal_3.getNode()) && !retVal_3.isEndTag()) { + retVal_3.preLineIndex = undefined; // block-enter stop + } + return retVal_3; + } + return null; + } + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.next(matchFunc, skipFunc)) { + // Landing on <pre> via DOM traversal always starts at the block-enter stop + // (preLineIndex=undefined). The per-line items are returned on subsequent + // calls via the isPreElement early-return above. + if (mode === "item" && isPreElement(retVal.getNode()) && !retVal.isEndTag()) { + retVal.preLineIndex = undefined; + } + DEBUG && console.log("SRNavigator::jumpNext result", retVal); + return retVal; + } + else { + return null; + } + } + finally { + console.groupEnd(); + } + } + SRNavigator.jumpNext = jumpNext; + /** + * Navigates to the previous element in screen reader navigation based on the specified mode. + * + * For tab_focus mode, this function attempts to move to the previous tabbable element by: + * 1. First trying to move backward using the mode's match and skip functions + * 2. If that fails, collecting all tab focus cursors and finding the previous one in the tab order + * + * @param mode - The navigation mode (e.g., "tab_focus") that determines how to navigate + * @param walker - The current cursor position in the screen reader navigation + * @returns A new cursor positioned at the previous element, or null if no previous element exists + */ + function jumpPrevious(mode, walker) { + if (mode === "tab_focus") { + var retVal_4 = walker.clone(); + var matchFunc_2 = getStartFunc(mode); + var skipFunc_2 = getSkipFunc(mode); + if (retVal_4.previous(matchFunc_2, skipFunc_2)) { + return retVal_4; + } + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex > 0) { + return tabFocusCursors[currentIndex - 1].clone(); + } + } + return null; + } + if (mode === "item" && isPreElement(walker.getNode()) && !walker.isEndTag()) { + if (walker.preLineIndex === undefined) { + // At the block-enter stop — go to the previous DOM item (before <pre>) + // fall through to normal previous() traversal below + } + else if (walker.preLineIndex === 0) { + // At the first line — step back to the block-enter stop + var retVal_5 = walker.clone(); + retVal_5.preLineIndex = undefined; + return retVal_5; + } + else { + // Step back one line + var retVal_6 = walker.clone(); + retVal_6.preLineIndex = walker.preLineIndex - 1; + return retVal_6; + } + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.previous(matchFunc, skipFunc)) { + // If we just landed on a <pre> element, position at its last line + if (mode === "item" && isPreElement(retVal.getNode()) && !retVal.isEndTag()) { + var lines = getPreLines(retVal.getNode()); + retVal.preLineIndex = lines.length > 0 ? lines.length - 1 : undefined; + } + return retVal; + } + else { + return null; + } + } + SRNavigator.jumpPrevious = jumpPrevious; +})(SRNavigator = exports.SRNavigator || (exports.SRNavigator = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRRenderer.ts" +/*!****************************************!*\ + !*** ./src/v4/simulator/SRRenderer.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRenderer = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var SRNavigator_1 = __webpack_require__(/*! ./SRNavigator */ "./src/v4/simulator/SRNavigator.ts"); +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var render_rules_1 = __webpack_require__(/*! ./render_rules */ "./src/v4/simulator/render_rules/index.ts"); +var common_1 = __webpack_require__(/*! ./render_rules/common */ "./src/v4/simulator/render_rules/common.ts"); +/** + * SRRenderer namespace provides functionality for simulating how screen readers + * announce content to users. It contains rules for rendering different types of + * elements and ARIA roles in various navigation modes. + * + * The renderer uses a rule-based system to determine what text should be announced + * when navigating to, within, or away from elements based on their roles and properties. + */ +var SRRenderer; +(function (SRRenderer) { + /** + * Generates the announcement text when entering an element + * + * This function looks up the appropriate rule based on the element's role or tag name + * and applies it to generate the announcement text. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for entering the element, or null if no rule applies + */ + function renderEnter(mode, walker, oldWalker) { + var DEBUG = false; + for (var _i = 0, CONTAINER_ENTER_RULES_1 = render_rules_1.CONTAINER_ENTER_RULES; _i < CONTAINER_ENTER_RULES_1.length; _i++) { + var rule = CONTAINER_ENTER_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + DEBUG && console.log(mode, walker, rule, s); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderEnter = renderEnter; + /** + * Generates the announcement text when leaving an element + * + * Similar to renderEnter, but applies rules for leaving elements instead. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for leaving the element, or null if no rule applies + */ + function renderLeave(mode, walker, oldWalker) { + for (var _i = 0, CONTAINER_EXIT_RULES_1 = render_rules_1.CONTAINER_EXIT_RULES; _i < CONTAINER_EXIT_RULES_1.length; _i++) { + var rule = CONTAINER_EXIT_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderLeave = renderLeave; + /** + * Renders the current element and any container changes + * + * This function combines announcements for: + * - Containers being left + * - Containers being entered + * - The current element itself + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param containerChanges - Information about containers being entered or left + * @returns Combined announcement text + */ + function renderCurrent(mode, walker, containerChanges) { + var DEBUG = false; //mode === "tab_focus" && document.getElementById("fixture")?.getAttribute("class") === "tomtest"; + var startOfRender = SRNavigator_1.SRNavigator.jumpCurrent(mode, walker); + if (!startOfRender) + return null; + var endOfRenders = SRNavigator_1.SRNavigator.jumpCurrentEnd(mode, startOfRender); + if (!endOfRenders || endOfRenders.length === 0) { + endOfRenders = [null]; + } + DEBUG && console.log("AAAA", startOfRender.isStartTag(), startOfRender.getNode()); + DEBUG && console.log("BBBB", endOfRenders.map(function (val) { return val && val.isStartTag(); }), endOfRenders.map(function (val) { return val && val.getNode(); })); + var endOfRender = endOfRenders[endOfRenders.length - 1]; + var renderStr = ""; + for (var _i = 0, endOfRenders_1 = endOfRenders; _i < endOfRenders_1.length; _i++) { + var candidateEnd = endOfRenders_1[_i]; + var candidateRenderStr = SRRenderer.renderRange(mode, startOfRender, candidateEnd); + if (candidateRenderStr.trim().length > 0) { + endOfRender = candidateEnd; + renderStr = candidateRenderStr; + break; + } + } + if (renderStr === "") { + renderStr = SRRenderer.renderRange(mode, startOfRender, endOfRender); + } + DEBUG && console.log("CCCC", renderStr); + return { + start: startOfRender, + end: endOfRender, + message: (containerChanges.leaving || []).concat(containerChanges.entering || []).concat([renderStr]).join(" ").replace(/\s+/g, " ") + }; + } + SRRenderer.renderCurrent = renderCurrent; + /** + * Renders a range of elements between two cursors + * + * This function traverses the DOM from startOfRender to endOfRender, + * applying rendering rules to each element and combining the results. + * + * @param mode - The current navigation mode + * @param startOfRender - Cursor at the start of the range + * @param endOfRender - Cursor at the end of the range + * @returns Combined announcement text for the entire range + */ + function renderRange(mode, startOfRender, endOfRender) { + var _a; + var iterWalker = startOfRender.clone(); + var elemStrs = []; + var bContinue = true; + var currentLink = null; + while (bContinue) { + var elem = iterWalker.getElement(); + var node = iterWalker.getNode(); + var nodeType = node.nodeType; + var renderStrs = []; + var linkParent = AriaUtil_1.AriaUtil.getAncestorWithRole(node, "link", true); + if (linkParent && !["content", "text"].includes((_a = new SRCursor_1.SRCursor(linkParent).getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + // We don't consider links that announce themselves + linkParent = null; + } + for (var _i = 0, SR_RULES_1 = render_rules_1.SR_RULES; _i < SR_RULES_1.length; _i++) { + var rule = SR_RULES_1[_i]; + var s = rule.test(mode, iterWalker); + if (typeof s !== "undefined" && s !== null && s.trim().length > 0) { + if (nodeType === 1 && !iterWalker.isEndTag() && elem.getAttribute("aria-haspopup") === "menu") { + s = "[subMenu] " + s; + } + // Handle links + if (mode === "tab_focus") { + // We're in link mode + if (currentLink && (!linkParent || (linkParent && currentLink !== linkParent))) { + // We've added a string within a link (currentLink), but now we've left the link or moved to a new link + s = "".concat(s, " ").concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false))); + } + } + else { + if (linkParent && (!currentLink || (currentLink !== linkParent))) { + // We're in a link, and we haven't announced this link, or we've moved to a new link + s = "".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(linkParent, false)), " ").concat(s); + } + } + if (s !== "") { + currentLink = linkParent; + elemStrs.push(s); + } + break; + } + } + elemStrs.push(renderStrs.filter(function (s) { return s.trim().length > 0; }).join(" ")); + bContinue = iterWalker.next(function () { return true; }, SRNavigator_1.SRNavigator.getSkipFunc(mode)) && SRCursor_1.SRCursor.compare(iterWalker, endOfRender) < 0; + } + if (mode === "tab_focus" && currentLink) { + elemStrs.push("".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false)))); + } + var retVal = elemStrs.filter(function (s) { return s.trim().length > 0; }).join(" "); + retVal = retVal.replace(/, \u0001([^\u0002]+)\u0002/g, function (match, describedByText) { + var quotedText = "\"".concat(describedByText, "\""); + var unmarkedRetVal = retVal.replace(match, ""); + return unmarkedRetVal.includes(quotedText) || unmarkedRetVal.includes(describedByText) ? "" : ", ".concat(quotedText); + }); + retVal = retVal.replace(/[\u0001\u0002]/g, ""); + return retVal; + } + SRRenderer.renderRange = renderRange; +})(SRRenderer = exports.SRRenderer || (exports.SRRenderer = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRRendererRule.ts" +/*!********************************************!*\ + !*** ./src/v4/simulator/SRRendererRule.ts ***! + \********************************************/ +(__unused_webpack_module, exports) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRendererRule = void 0; +var SRRendererRule = /** @class */ (function () { + function SRRendererRule(ruleDefinition) { + this.ruleDefinition = ruleDefinition; + } + SRRendererRule.prototype.test = function (mode, cursor, oldCursor) { + if (this.ruleDefinition.modes.includes(mode) + && (this.ruleDefinition.roles.includes(cursor.getRole()) + || this.ruleDefinition.elems.includes(cursor.getNode().nodeName.toUpperCase()))) { + for (var _i = 0, _a = this.ruleDefinition.tests; _i < _a.length; _i++) { + var test_1 = _a[_i]; + var s = test_1(cursor, oldCursor, mode); + if (typeof s === "string") + return s; + } + } + return null; + }; + return SRRendererRule; +}()); +exports.SRRendererRule = SRRendererRule; + + +/***/ }, + +/***/ "./src/v4/simulator/SRTableUtil.ts" +/*!*****************************************!*\ + !*** ./src/v4/simulator/SRTableUtil.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRTableUtil = void 0; +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +/** + * TableUtil namespace provides utility functions for handling HTML tables in the accessibility simulator. + * These functions help determine cell positions, relationships, and extract header information + * to simulate how screen readers would announce table navigation. + */ +var SRTableUtil; +(function (SRTableUtil) { + /** + * Determines if the cursor is pointing to a cell element (TD or TH) + * or has a cell-related ARIA role + * @param cursor - The SRCursor to check + * @returns true if the cursor is on a cell, false otherwise + */ + function isCursorCellRole(cursor) { + if (!cursor.getElement()) + return false; + if (["cell", "rowheader", "columnheader"].includes(cursor.getRole())) { + return true; + } + return !cursor.getElement().hasAttribute("role") && ["TH", "TD"].includes(cursor.getElement().nodeName.toUpperCase()); + } + SRTableUtil.isCursorCellRole = isCursorCellRole; + /** + * Gets a cursor pointing to the current cell or the parent cell if the cursor + * is inside a cell's content + * @param cursor - The SRCursor to check + * @returns A new SRCursor pointing to the cell or null if not in a cell + */ + function getCurrentOrParentCellCursor(cursor) { + return cursor.getCurrentOrParentByRoleClone(["cell", "rowheader", "columnheader"], ["TD", "TH"]); + } + SRTableUtil.getCurrentOrParentCellCursor = getCurrentOrParentCellCursor; + /** + * Get the colspan of a cell at a given location + * @param cursor The cursor to get the colspan from + * @returns The colspan of the cell at the cursor's location or 0 if not in a column + */ + function getColSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var colSpan = cursor.getElement().getAttribute("colspan"); + if (colSpan) { + return parseInt(colSpan); + } + return 1; + } + SRTableUtil.getColSpan = getColSpan; + /** + * Get the rowspan of a cell at a given location + * @param cursor The cursor to get the rowspan from + * @returns The rowspan of the cell at the cursor's location or 0 if not in a column + */ + function getRowSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var rowSpan = cursor.getElement().getAttribute("rowspan"); + if (rowSpan) { + return parseInt(rowSpan); + } + return 1; + } + SRTableUtil.getRowSpan = getRowSpan; + /** + * Builds a complete model of a table's structure, accounting for rowspan and colspan + * + * This function traverses the entire table and creates a data structure that represents + * the logical grid of cells, properly handling cells that span multiple rows or columns. + * The resulting model makes it easier to determine cell relationships and positions. + * + * @param inTableCursor - A cursor within the table + * @returns A TableModel representing the complete table structure, or null if not in a table + */ + function getTableModel(inTableCursor) { + // Get a cursor pointing to the table element + var tableCursor = inTableCursor.getCurrentOrParentByRoleClone(["table"]); + if (!tableCursor) + return null; + var walkTableCursor = tableCursor.clone(); + var retVal = []; // The complete table model we're building + var curRow = []; // The current row being processed + var prevRow; // The previous row (needed for rowspan handling) + // Walk through the table's DOM structure + while (walkTableCursor.next(function () { return true; }) && !walkTableCursor.getNode().isSameNode(tableCursor.getNode())) { + if (walkTableCursor.isEndTag() && walkTableCursor.getRole() === "row") { + // Reached the end of the row, push what we have and reset + retVal.push(curRow); + prevRow = curRow; + curRow = []; + // Handle cells with rowspan from previous rows that affect this row + // This ensures cells spanning multiple rows are properly represented in the model + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + // Process each cell in the row + if (!walkTableCursor.isEndTag() && isCursorCellRole(walkTableCursor)) { + var colspan = getColSpan(walkTableCursor); + // Create a cell model with position and spanning information + var cellInfo = { + rowIndexStart: retVal.length, + colIndexStart: curRow.length, + rowspan: getRowSpan(walkTableCursor), + colspan: colspan, + cellCursor: walkTableCursor.clone() + }; + // For cells with colspan, add the same cell info to multiple columns + for (var idx = 0; idx < colspan; ++idx) { + curRow.push(cellInfo); + } + // Continue handling cells with rowspan from previous rows + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + } + return retVal; + } + SRTableUtil.getTableModel = getTableModel; + /** + * Gets the cell model for a specific cell in the table + * + * This function finds the CellModel object that represents a specific cell, + * which contains information about its position and spanning. + * + * @param inCellCursor - A cursor pointing to a cell or its contents + * @param tableModel - Optional pre-built table model (will be created if not provided) + * @returns The CellModel for the specified cell, or null if not found + */ + function getCellModel(inCellCursor, tableModel) { + var cellCursor = getCurrentOrParentCellCursor(inCellCursor); + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + } + // Search through the table model to find the matching cell + for (var rowIndex = 0; rowIndex < tableModel.length; ++rowIndex) { + for (var colIndex = 0; colIndex < tableModel[rowIndex].length; ++colIndex) { + if (tableModel[rowIndex][colIndex].cellCursor.isSameNode(cellCursor)) { + return tableModel[rowIndex][colIndex]; + } + } + } + return null; + } + SRTableUtil.getCellModel = getCellModel; + /** + * Checks if a cell spans a specific column + * + * @param cellModel - The cell model to check + * @param colIdx - The column index to check + * @returns True if the cell contains the specified column + */ + function cellModelContainsColumn(cellModel, colIdx) { + return colIdx >= cellModel.colIndexStart && colIdx < cellModel.colIndexStart + cellModel.colspan; + } + SRTableUtil.cellModelContainsColumn = cellModelContainsColumn; + /** + * Checks if a cell spans a specific row + * + * @param cellModel - The cell model to check + * @param rowIdx - The row index to check + * @returns True if the cell contains the specified row + */ + function cellModelContainsRow(cellModel, rowIdx) { + return rowIdx >= cellModel.rowIndexStart && rowIdx < cellModel.rowIndexStart + cellModel.rowspan; + } + SRTableUtil.cellModelContainsRow = cellModelContainsRow; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeaders(cursor) { + return ""; + } + SRTableUtil.getRowHeaders = getRowHeaders; + /** + * Gets the column headers associated with a cell + * First checks for explicit headers attribute, then looks for column headers in the same column + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getColumnHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var colDatas = []; + for (var colIdx = cellModel.colIndexStart; colIdx < cellModel.colIndexStart + cellModel.colspan; ++colIdx) { + colDatas.push({ + potentialColHeaders: [], + existsDataCell: false, + colIdx: colIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same column (ignore column headers) + .filter(function (cursor) { return colDatas.some(function (colData) { return cellModelContainsColumn(SRTableUtil.getCellModel(cursor, tableModel), colData.colIdx); }); }); + } + else { + // Get all cells in this column + // Note - if everything in this column is empty or a header cell, this is probably not a heading + for (var rowIdx = 0; rowIdx < tableModel.length; ++rowIdx) { + var _loop_1 = function (colData) { + var colIdx = colData.colIdx; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "columnheader") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "col" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + } + else { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + } + }; + for (var _i = 0, colDatas_1 = colDatas; _i < colDatas_1.length; _i++) { + var colData = colDatas_1[_i]; + _loop_1(colData); + } + } + for (var _a = 0, colDatas_2 = colDatas; _a < colDatas_2.length; _a++) { + var colData = colDatas_2[_a]; + if (!colData.existsDataCell) { + colData.potentialColHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return colDatas.some(function (colData) { return colData.potentialColHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getColumnHeadersForCursor = getColumnHeadersForCursor; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var rowDatas = []; + for (var rowIdx = cellModel.rowIndexStart; rowIdx < cellModel.rowIndexStart + cellModel.rowspan; ++rowIdx) { + rowDatas.push({ + potentialRowHeaders: [], + existsDataCell: false, + rowIdx: rowIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same row (ignore column headers) + .filter(function (cursor) { return rowDatas.some(function (rowData) { return cellModelContainsRow(SRTableUtil.getCellModel(cursor, tableModel), rowData.rowIdx); }); }); + } + else { + // Get all cells in the rows + // Note - if everything in the row is empty or a header cell, this is probably not a heading + var longestRow = rowDatas.reduce(function (prev, cur) { return Math.max(prev, tableModel[cur.rowIdx].length); }, 0); + for (var colIdx = 0; colIdx < longestRow; ++colIdx) { + var _loop_2 = function (rowData) { + var rowIdx = rowData.rowIdx; + if (colIdx >= tableModel[rowIdx].length) + return "continue"; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "rowheader") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "row" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + } + else { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + } + }; + for (var _i = 0, rowDatas_1 = rowDatas; _i < rowDatas_1.length; _i++) { + var rowData = rowDatas_1[_i]; + _loop_2(rowData); + } + } + for (var _a = 0, rowDatas_2 = rowDatas; _a < rowDatas_2.length; _a++) { + var rowData = rowDatas_2[_a]; + if (!rowData.existsDataCell) { + rowData.potentialRowHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return rowDatas.some(function (rowData) { return rowData.potentialRowHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getRowHeadersForCursor = getRowHeadersForCursor; + /** + * Determines if a cell is a data cell (not a header cell) + * + * A data cell is one with either: + * - An explicit ARIA role of "cell" + * - A TD element without an overriding role attribute + * + * @param checkCursor - The cursor to check + * @returns True if the cursor points to a data cell + */ + function isDataCell(checkCursor) { + var checkCursorElem = checkCursor.getElement(); + if (!checkCursorElem) + return false; + return checkCursor.getRole() === "cell" || (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TD"); + } + SRTableUtil.isDataCell = isDataCell; +})(SRTableUtil = exports.SRTableUtil || (exports.SRTableUtil = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRUtil.ts" +/*!************************************!*\ + !*** ./src/v4/simulator/SRUtil.ts ***! + \************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRUtil = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var SRUtil; +(function (SRUtil) { + function isModalDialogElement(node) { + if (node.nodeType !== 1) + return false; + var elem = node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem, true); + return role === "dialog" && elem.getAttribute("aria-modal") === "true" && VisUtil_1.VisUtil.isNodeVisible(node); + } + SRUtil.isModalDialogElement = isModalDialogElement; + /** + * Generates a unique CSS selector for a specific HTML element + * The selector is built using a combination of: + * 1. Element tag name + * 2. ID (if available) + * 3. Classes (if available) + * 4. Attributes (if needed) + * 5. nth-child selectors for position in parent + * + * @param element The HTML element to generate a selector for + * @param optimized If true, creates a shorter but possibly less robust selector + * @return A CSS selector string that uniquely identifies the element + */ + function getUniqueSelector(element, optimized) { + if (optimized === void 0) { optimized = false; } + // If the element has an ID, that's the most direct way to select it + if (element.id) { + return "#".concat(CSS.escape(element.id)); + } + // If we're at the root or document element, return the tag name + if (element.isSameNode(document.documentElement) || element.isSameNode(document.body)) { + return element.tagName.toLowerCase(); + } + // Start building the selector with the tag name + var selector = element.tagName.toLowerCase(); + // Add classes if available and we're not optimizing for brevity + if (element.classList.length && !optimized) { + // Take up to 3 classes to avoid overly specific selectors + var classes = Array.from(element.classList).slice(0, 3); + selector += classes.map(function (cls) { return ".".concat(CSS.escape(cls)); }).join(''); + } + // Add distinguishing attributes if needed and not optimizing + if (!optimized) { + // Consider adding role, aria-label, or other distinctive attributes + if (element.hasAttribute('role')) { + selector += "[role=\"".concat(CSS.escape(element.getAttribute('role') || ''), "\"]"); + } + if (element.hasAttribute('aria-label')) { + var label = element.getAttribute('aria-label') || ''; + if (label.length <= 20) { // Avoid overly long selectors + selector += "[aria-label=\"".concat(CSS.escape(label), "\"]"); + } + } + // For inputs, add type attribute + if (element.tagName.toLowerCase() === 'input' && element.hasAttribute('type')) { + selector += "[type=\"".concat(CSS.escape(element.getAttribute('type') || ''), "\"]"); + } + } + // If we have a parent node, determine position among siblings + if (element.parentElement) { + // Find all siblings with the same tag + var siblings = Array.from(element.parentElement.children) + .filter(function (child) { return child.tagName === element.tagName; }); + // If there's more than one sibling with the same tag, add nth-child + if (siblings.length > 1) { + var index = siblings.indexOf(element) + 1; + selector += ":nth-of-type(".concat(index, ")"); + } + // If we're not at the root, recursively build the parent selector + // but use optimized selectors for ancestors to keep the overall selector manageable + return "".concat(getUniqueSelector(element.parentElement, true), " > ").concat(selector); + } + return selector; + } + SRUtil.getUniqueSelector = getUniqueSelector; +})(SRUtil = exports.SRUtil || (exports.SRUtil = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRViewer.ts" +/*!**************************************!*\ + !*** ./src/v4/simulator/SRViewer.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRViewer = exports.SROverlay = void 0; +var SRController_1 = __webpack_require__(/*! ./SRController */ "./src/v4/simulator/SRController.ts"); +/** + * SROverlay class for creating a UI widget to control screen reader simulation + * Provides buttons for navigation and displays results + */ +var SROverlay = /** @class */ (function () { + /** + * Creates a new SROverlay + * @param controller The SRController instance to use for navigation + */ + function SROverlay(srViewer) { + this.srViewer = srViewer; + /** Navigation modes available in the UI */ + this.navigationModes = [ + { mode: "item", label: "Item" }, + { mode: "tab_focus", label: "Tabbable" }, + { mode: "heading", label: "Heading" }, + { mode: "region", label: "Region" } + ]; + this.createOverlay(); + } + SROverlay.prototype.createDOMElement = function (elemName, attrs, styles) { + var retVal = this.srViewer.viewerDoc.createElement(elemName); + if (attrs) { + for (var key in attrs) { + retVal[key] = attrs[key]; + } + } + if (styles) { + for (var key in styles) { + retVal.style[key] = styles[key]; + } + } + return retVal; + }; + /** + * Creates the overlay UI elements and adds them to the DOM + */ + SROverlay.prototype.createOverlay = function () { + var _this = this; + // Create main container + this.container = this.createDOMElement("div", { + className: "ibma-sr-overlay" + }, { + position: 'fixed', + bottom: '0', + left: '0', + width: '100%', + backgroundColor: 'rgba(0, 0, 0, 0.8)', + color: 'white', + padding: '10px', + zIndex: '10000', + display: 'flex', + flexDirection: 'column', + gap: '10px' + }); + // Create controls container + var controlsContainer = this.createDOMElement("div", {}, { + display: "flex", flexWrap: "wrap", gap: "10px" + }); + // Create navigation mode groups + this.navigationModes.forEach(function (navMode) { + var modeGroup = _this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + modeGroup.appendChild(_this.createDOMElement('span', { + textContent: navMode.label + ":" + }, {})); + // Previous button + var prevButton = _this.createDOMElement('button', { + textContent: '◀ Prev' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + prevButton.addEventListener('click', function () { return _this.srViewer.navigatePrevious(navMode.mode); }); + modeGroup.appendChild(prevButton); + // Next button + var nextButton = _this.createDOMElement('button', { + textContent: 'Next ▶' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + nextButton.addEventListener('click', function () { return _this.srViewer.navigateNext(navMode.mode); }); + modeGroup.appendChild(nextButton); + controlsContainer.appendChild(modeGroup); + }); + var otherButtonGroup = this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + // Show all button + var showAllButton = this.createDOMElement('button', { + textContent: 'Show all' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + showAllButton.addEventListener('click', function () { return _this.srViewer.showAll(true); }); + otherButtonGroup.appendChild(showAllButton); + // Toggle Speech Button + var toggleSpeech = this.createDOMElement('button', { + textContent: 'Toggle speech' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + toggleSpeech.addEventListener('click', function () { return _this.srViewer.toggleSpeech(); }); + otherButtonGroup.appendChild(toggleSpeech); + controlsContainer.appendChild(otherButtonGroup); + // Create results display + this.resultsDisplay = this.createDOMElement('div', { + textContent: 'Screen reader simulation results will appear here.' + }, { + padding: '10px', + backgroundColor: 'rgba(255, 255, 255, 0.1)', + borderRadius: '3px', + minHeight: '100px', + maxHeight: '50vh', + fontFamily: 'monospace', + overflow: 'auto' + }); + // Add elements to container + this.container.appendChild(controlsContainer); + this.container.appendChild(this.resultsDisplay); + // Add to document + this.srViewer.viewerDoc.body.appendChild(this.container); + }; + /** + * Display the navigation result in the overlay + * @param result The navigation result + * @param mode The navigation mode used + * @param direction The navigation direction ('next', 'previous', or 'focus') + */ + SROverlay.prototype.displayResult = function (result, mode, direction) { + var _a, _b, _c, _d; + var displayText = ''; + if (result.success) { + // console.log("???", result); + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + else { + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + (_b = (_a = result.renderingResult.end) === null || _a === void 0 ? void 0 : _a.getElement()) === null || _b === void 0 ? void 0 : _b.scrollIntoView(); + (_d = (_c = result.renderingResult.start) === null || _c === void 0 ? void 0 : _c.getElement()) === null || _d === void 0 ? void 0 : _d.scrollIntoView(); + window.scrollBy(0, -200); + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.textContent = displayText; + var inspectButton = this.createDOMElement("button", { + innerText: "Debug" + }, {}); + inspectButton.addEventListener("click", function () { + var _a, _b; + console.log((_a = result.renderingResult.start) === null || _a === void 0 ? void 0 : _a.getNode(), (_b = result.renderingResult.end) === null || _b === void 0 ? void 0 : _b.getNode()); + }); + this.resultsDisplay.appendChild(inspectButton); + }; + SROverlay.prototype.displayAll = function (result) { + var _this = this; + var table = this.createDOMElement("table", {}, {}); + var headerRow = this.createDOMElement("tr", {}, {}); + var headingLabels = ["Region", "Heading", "Item", "Tabbable"]; + var headingFields = ["region", "heading", "item", "tab_focus"]; + for (var _i = 0, headingLabels_1 = headingLabels; _i < headingLabels_1.length; _i++) { + var headingLabel = headingLabels_1[_i]; + headerRow.appendChild(this.createDOMElement("th", { + scope: "col", + innerText: headingLabel + }, { + textAlign: "left", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + table.appendChild(headerRow); + } + var _loop_1 = function (line) { + var dataRow = this_1.createDOMElement("tr", {}, {}); + headingFields.forEach(function (field) { + dataRow.appendChild(_this.createDOMElement("td", { + innerText: line[field] + }, { + verticalAlign: "top", + border: "solid white 1px", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + }); + table.appendChild(dataRow); + }; + var this_1 = this; + for (var _a = 0, result_1 = result; _a < result_1.length; _a++) { + var line = result_1[_a]; + _loop_1(line); + } + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.appendChild(table); + }; + /** + * Remove the overlay from the DOM + */ + SROverlay.prototype.destroy = function () { + if (this.container && this.container.parentNode) { + this.container.parentNode.removeChild(this.container); + } + }; + return SROverlay; +}()); +exports.SROverlay = SROverlay; +/** + * SRViewer class for managing screen reader simulation with UI controls + */ +var SRViewer = /** @class */ (function () { + /** + * Creates a new SRViewer + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRViewer(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + /** Flag to track if speech is active */ + this.isStreaming = false; + /** Flag to set if showing all */ + this.isShowingAll = false; + /** Flag to set if it should be speaking */ + this.speechEnabled = false; + this.viewerDoc = rootElement.ownerDocument; + // Create controller for the document body + this.controller = SRController_1.SRController.getController(this.viewerDoc); + // Create overlay UI + this.overlay = new SROverlay(this); + // Set up keyboard handlers + this.setupKeyboardHandlers(); + // Set up focus tracking + this.setupFocusTracking(); + // Set up mutation tracking + this.setupMutationTracking(); + } + SRViewer.prototype.showAll = function (bEnableAllMode) { + if (bEnableAllMode) { + this.isShowingAll = true; + } + var result = SRController_1.SRController.renderStructure(this.viewerDoc); + this.overlay.displayAll(result); + }; + SRViewer.prototype.toggleSpeech = function () { + this.speechEnabled = !this.speechEnabled; + }; + /** + * Navigate to the next element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigateNext = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpNext(mode); + this.overlay.displayResult(result, mode, 'next'); + this.speakResult(result); + }; + /** + * Navigate to the previous element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigatePrevious = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpPrevious(mode); + this.overlay.displayResult(result, mode, 'previous'); + this.speakResult(result); + }; + /** + * Set up keyboard event handlers for screen reader navigation + */ + SRViewer.prototype.setupKeyboardHandlers = function () { + var _this = this; + this.keyboardHandler = function (e) { + // Don't capture keyboard events when focus is in form controls + var target = e.target; + if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') { + return; + } + // Handle keyboard shortcuts + if (e.ctrlKey) { + // Ctrl key stops speech + _this.stopSpeech(); + return; + } + if (e.altKey || e.metaKey) + return; + // console.log(e.key); + switch (e.key) { + case 'ArrowUp': + e.preventDefault(); + _this.navigatePrevious('item'); + break; + case ' ': + _this.isStreaming = true; + case 'ArrowDown': + e.preventDefault(); + _this.navigateNext('item'); + break; + case 'Enter': + e.preventDefault(); + _this.activateCurrentElement(); + _this.controller.setPointOfRegard(_this.viewerDoc.activeElement); + break; + case 'H': + case 'h': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('heading'); + } + else { + e.preventDefault(); + _this.navigateNext('heading'); + } + break; + case 'R': + case 'r': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('region'); + } + else { + e.preventDefault(); + _this.navigateNext('region'); + } + break; + case 'Tab': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('tab_focus'); + } + else { + e.preventDefault(); + _this.navigateNext('tab_focus'); + } + break; + } + }; + // Add the event listener + this.viewerDoc.addEventListener('keydown', this.keyboardHandler); + }; + SRViewer.prototype.speakResult = function (result) { + var _this = this; + if (!this.speechEnabled) + return; + var utterance = new SpeechSynthesisUtterance(result.renderingResult.message); + utterance.rate = 1.5; + var myThis = this; + utterance.addEventListener("end", function (event) { + if (myThis.isStreaming) { + _this.navigateNext('item'); + } + }); + speechSynthesis.cancel(); + speechSynthesis.speak(utterance); + }; + /** + * Stop speech output + */ + SRViewer.prototype.stopSpeech = function () { + this.isStreaming = false; + // Cancel any active speech synthesis + speechSynthesis.cancel(); + }; + /** + * Set up mutation tracking + */ + SRViewer.prototype.setupMutationTracking = function () { + var _this = this; + var observer = new MutationObserver(function (mutations) { + // console.log(this.isShowingAll, mutations.length); + if (_this.isShowingAll) { + var outsideOverlay = mutations.filter(function (mutation) { return mutation.target.nodeType === 1 + && !mutation.target.closest(".ibma-sr-overlay"); }); + if (outsideOverlay.length > 0) { + // console.log("Mutations",outsideOverlay); + observer.disconnect(); + var myThis_1 = _this; + myThis_1.showAll(); + setTimeout(function () { + myThis_1.showAll(); + observer.observe(_this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }, 1000); + } + } + }); + observer.observe(this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }; + /** + * Set up focus tracking to update the point of regard when focus changes + */ + SRViewer.prototype.setupFocusTracking = function () { + var _this = this; + this.focusHandler = function (e) { + // Skip if the focus is on the overlay itself + if (e.target instanceof HTMLElement) { + var target = e.target; + if (_this.overlay && target.closest('.ibma-sr-overlay')) { + return; + } + console.group("focusHandler"); + // Update the point of regard to the newly focused element + var result = _this.controller.setPointOfRegard(target); + // Announce the focus change + if (result.success) { + _this.overlay.displayResult(result, 'focus', 'focus'); + _this.speakResult(result); + } + console.groupEnd(); + } + }; + // Add the focus event listener to the document + this.viewerDoc.addEventListener('focusin', this.focusHandler); + }; + /** + * Activate (click) the element at the current point of regard + */ + SRViewer.prototype.activateCurrentElement = function () { + var currentElement = this.controller.getPointOfRegard().getElement(); + if (currentElement) { + // Announce that we're activating the element + var result = { + success: true, + renderingResult: { + message: "Activating: ".concat(currentElement.textContent || currentElement.nodeName), + start: this.controller.getPointOfRegard(), + end: this.controller.getPointOfRegard() + } + }; + this.overlay.displayResult(result, 'focus', 'focus'); + this.speakResult(result); + // Focus the element first + if (currentElement.focus) { + currentElement.focus(); + } + // Simulate a click on the element + currentElement.click(); + } + }; + /** + * Get the controller instance + * @returns The SRController instance + */ + SRViewer.prototype.getController = function () { + return this.controller; + }; + /** + * Destroy the viewer and clean up resources + */ + SRViewer.prototype.destroy = function () { + // Remove event listeners + this.viewerDoc.removeEventListener('keydown', this.keyboardHandler); + this.viewerDoc.removeEventListener('focusin', this.focusHandler); + // Stop any active speech + this.stopSpeech(); + // Destroy overlay + this.overlay.destroy(); + }; + return SRViewer; +}()); +exports.SRViewer = SRViewer; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/common.ts" +/*!*************************************************!*\ + !*** ./src/v4/simulator/render_rules/common.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = exports.getLinkAnnouncement = exports.getRoleDescription = exports.quoteName = exports.quoteNamePadBefore = exports.quoteNamePadAfter = void 0; +var SRCursor_1 = __webpack_require__(/*! ../SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * Provide the name, surrounded by the quoteCharBefore and quoteCharAfter and followed by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add after, if the name exists + * @param quoteCharBefore The string to use as the leading quote, if the name exists + * @param quoteCharBefore The string to use as the trailing quote, if the name exists + * @returns + */ +function quoteNamePadAfter(cursor, padding, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteName(cursor)).concat(padding || ", ") + : ""; +} +exports.quoteNamePadAfter = quoteNamePadAfter; +/** + * Provide the name, surrounded by quotes and preceded by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add before, if the name exists (defaults to ", ") + * @returns The quoted name with leading padding, or empty string if no name exists + */ +function quoteNamePadBefore(cursor, padding) { + return cursor.getName() + ? "".concat(padding || ", ").concat(quoteName(cursor)) + : ""; +} +exports.quoteNamePadBefore = quoteNamePadBefore; +/** + * Provide the name surrounded by quote characters + * @param cursor The cursor for which to fetch the name + * @param quoteCharBefore The string to use as the leading quote (defaults to ") + * @param quoteCharAfter The string to use as the trailing quote (defaults to ") + * @returns The quoted name, or empty string if no name exists + */ +function quoteName(cursor, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteCharBefore || '"').concat(cursor.getName()).concat(quoteCharAfter || '"') + : ""; +} +exports.quoteName = quoteName; +/** + * Get the role description for an element, using aria-roledescription if present + * Falls back to the provided default role name if aria-roledescription is not specified or empty + * @param cursor The cursor positioned at the element + * @param defaultRole The default role name to use if aria-roledescription is not present + * @returns The role description (either custom or default) + */ +function getRoleDescription(cursor, defaultRole) { + var elem = cursor.getElement(); + if (!elem) + return defaultRole; + var roleDescription = elem.getAttribute("aria-roledescription"); + if (roleDescription && roleDescription.trim().length > 0) { + return roleDescription.trim(); + } + return defaultRole; +} +exports.getRoleDescription = getRoleDescription; +/** + * Generate the screen reader announcement for a link element + * Distinguishes between same-page links (anchors) and regular links + * @param cursor The cursor positioned at the link element + * @param mode The navigation mode (affects announcement order) + * @returns The formatted link announcement string + */ +function getLinkAnnouncement(cursor, mode) { + var href = (cursor.getNode().href) || ""; + var announceStr = ""; + if (href.startsWith(document.location.href) && href.charAt(document.location.href.length) === "#") { + announceStr = "same page link"; + } + else { + announceStr = "link"; + } + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + if (mode === "tab_focus") { + return "[".concat(quoteNamePadAfter(cursor)).concat(announceStr, "]"); + } + else { + return "[".concat(announceStr).concat(quoteNamePadBefore(cursor), "]"); + } + } + return "[".concat(announceStr, "]"); +} +exports.getLinkAnnouncement = getLinkAnnouncement; +/** + * Get the description text from aria-describedby references + * Resolves all IDs in aria-describedby and concatenates their text content + * @param elem The element with aria-describedby attribute + * @param mode The navigation mode (returns empty string in "item" mode) + * @returns The formatted description text with leading comma and quotes, or empty string + */ +function getDescribedByAnnouncements(elem, mode) { + var describedBy = elem.getAttribute("aria-describedby"); + if (!describedBy) + return ""; + var descriptionElems = describedBy + .split(/\s+/) + .map(function (id) { return document.getElementById(id); }) + .filter(function (descElem) { return !!descElem; }); + var descriptionText = descriptionElems + .map(function (descElem) { var _a; return (_a = descElem.textContent) === null || _a === void 0 ? void 0 : _a.trim(); }) + .filter(function (text) { return !!text; }) + .join(" "); + if (!descriptionText || descriptionText.length === 0) + return ""; + if (mode === "item") + return ", \u0001".concat(descriptionText, "\u0002"); + return ", \"".concat(descriptionText, "\""); +} +/** + * Get state announcements for disabled, readonly, required, and invalid attributes + * @param elem The element to check for state attributes + * @returns A string with state announcements (e.g., ", disabled", ", read only", ", required", ", invalid") + */ +function getStateAnnouncements(elem) { + var states = ""; + // Check for disabled state (both attribute and aria-disabled) + if (elem.hasAttribute("disabled") || elem.getAttribute("aria-disabled") === "true") { + states += ", disabled"; + } + // Check for readonly state (both attribute and aria-readonly) + if (elem.hasAttribute("readonly") || elem.getAttribute("aria-readonly") === "true") { + states += ", read only"; + } + // Check for required state (both attribute and aria-required) + if (elem.hasAttribute("required") || elem.getAttribute("aria-required") === "true") { + states += ", required"; + // A required <select> whose selected value is "" is implicitly invalid — + // JAWS and NVDA announce "invalid entry" in this case. + if (elem.nodeName.toUpperCase() === "SELECT" && elem.validity.valueMissing) { + states += ", invalid entry"; + } + } + // Check for invalid state (aria-invalid) + if (elem.getAttribute("aria-invalid") === "true") { + states += ", invalid"; + } + return states; +} +/** + * Check if a listitem contains interactive/widget elements + * Screen readers typically don't read the accessible name of a listitem when it contains interactive elements + * Uses DOMWalker to properly traverse shadow DOM and other complex structures + */ +function listitemContainsInteractiveElement(cursor) { + var elem = cursor.getElement(); + if (!elem) + return false; + // Use DOMWalker to traverse the entire subtree including shadow DOM + var walker = new DOMWalker_1.DOMWalker(elem, false, elem, false); + // Walk through all descendants + while (walker.nextNode()) { + // Only check element nodes at start tags + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(walker.node); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return true; + } + } + } + return false; +} +/** + * Check if an iframe's content can be accessed (not cross-origin) + * Attempts to access the iframe's document to determine if it's accessible + * @param iframe The iframe element to check + * @returns true if the iframe content is accessible, false if cross-origin or blocked + */ +function canAccessFrame(iframe) { + try { + // This throws a DOMException for cross-origin frames + var doc = iframe.contentDocument || iframe.contentWindow.document; + return doc !== null; + } + catch (e) { + return false; + // if (e instanceof DOMException && e.name === 'SecurityError') { + // return false; // Cross-origin, access blocked + // } + // throw e; // Re-throw unexpected errors + } +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Button role + new SRRendererRule_1.SRRendererRule({ + roles: ["button"], + elems: [], + modes: ["item", "button", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "true") { + return "[toggle ".concat(roleDesc, ", pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "false") { + return "[toggle ".concat(roleDesc, ", not pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (cursor.isEndTag()) + return undefined; + var expandStr = ""; + var elem = cursor.getElement(); + var roleDesc = getRoleDescription(cursor, "button"); + if (["menu", "true"].includes(elem.getAttribute("aria-haspopup"))) { + expandStr += ", menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + expandStr += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(expandStr).concat(getDescribedByAnnouncements(elem, mode), "]"); + }, + function (cursor) { if (cursor.isEndTag()) + return ""; } + ] + }), + // Checkbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["checkbox"], + elems: [], + modes: ["item", "checkbox", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "checkbox"); + var stateStr = ""; + if (elem.getAttribute("aria-checked") === "mixed") { + stateStr = "half checked"; + } + else { + var bChecked = false; + if (elem.hasAttribute("aria-checked")) { + bChecked = elem.getAttribute("aria-checked") === "true"; + } + else { + bChecked = elem.checked; + } + stateStr = bChecked ? "checked" : "not checked"; + } + stateStr += getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Cell, Columnheader, and Rowheader roles + new SRRendererRule_1.SRRendererRule({ + roles: ["cell", "columnheader", "rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var _a; + if (!cursor.isStartTag()) + return null; + // Get the cell element + var cellElem = cursor.getElement(); + if (!cellElem) + return null; + // Check if the cell has any visible content by checking: + // 1. Text content (trimmed) + // 2. Child elements with roles (buttons, links, etc.) + // 3. Images with alt text + var textContent = ((_a = cellElem.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || ""; + // Check for child elements with interactive roles or content + var walker = new DOMWalker_1.DOMWalker(cellElem, false, cellElem, false); + var hasContent = textContent.length > 0; + if (!hasContent) { + // Check for elements that would have content (buttons, links, images, etc.) + while (walker.nextNode()) { + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var elem = walker.node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // Check for interactive elements or elements with accessible names + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + hasContent = true; + break; + } + // Check for images with alt text + if (elem.nodeName.toUpperCase() === "IMG" && elem.hasAttribute("alt")) { + hasContent = true; + break; + } + } + } + } + // If the cell is empty, return "[blank]" + if (!hasContent) { + return "[blank]"; + } + // Otherwise, return null to let default rendering continue + return null; + } + ] + }), + // Combobox role + new SRRendererRule_1.SRRendererRule({ + roles: ["combobox"], + elems: [], + modes: ["item", "combo", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "combo box"); + var elem = cursor.getElement(); + var state = ""; + if (cursor.getNode().nodeName.toUpperCase() === "SELECT") { + state = ", collapsed"; + var selectElem = cursor.getElement(); + var valueElem = selectElem.selectedIndex >= 0 ? selectElem.options[selectElem.selectedIndex] : null; + var valueStr = ""; + if (valueElem) { + var temp = new SRCursor_1.SRCursor(valueElem, false); + valueStr = quoteNamePadBefore(temp, ", "); + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + else if (cursor.getNode().nodeName.toUpperCase() === "INPUT") { + if (elem.hasAttribute("aria-expanded")) { + state = ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state, ", has auto complete, editable, opens list]"); + } + else { + if (elem.hasAttribute("aria-expanded")) { + state = ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + if (elem.hasAttribute("aria-autocomplete")) { + state += ", has auto complete"; + } + } + state += getStateAnnouncements(elem); + // Determine the current value to announce: + // 1. If expanded and aria-controls points to a listbox, use the aria-selected option text + // 2. Otherwise use the combobox element's own text content + var valueStr = ""; + var controlsId = elem.getAttribute("aria-controls"); + var popup = controlsId ? document.getElementById(controlsId) : null; + if (popup) { + var selectedOption = popup.querySelector("[role='option'][aria-selected='true']"); + if (selectedOption) { + valueStr = ", \"".concat((selectedOption.textContent || "").trim(), "\""); + } + } + if (!valueStr) { + var textContent = (elem.textContent || "").trim(); + if (textContent) { + valueStr = ", \"".concat(textContent, "\""); + } + } + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + } + ] + }), + // Listbox role - covers <select size> / <select multiple> + new SRRendererRule_1.SRRendererRule({ + roles: ["listbox"], + elems: [], + modes: ["item", "combo", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "list box"); + var elem = cursor.getElement(); + var state = ""; + if (cursor.getNode().nodeName.toUpperCase() === "SELECT") { + var selectElem = cursor.getElement(); + var selectedOptions = Array.from(selectElem.options).filter(function (o) { return o.selected; }); + var valueStr_1 = selectedOptions + .map(function (o) { return quoteNamePadBefore(new SRCursor_1.SRCursor(o, false), ", "); }) + .join(""); + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr_1, "]"); + } + // ARIA listbox (non-select) + state += getStateAnnouncements(elem); + var textContent = (elem.textContent || "").trim(); + var valueStr = textContent ? ", \"".concat(textContent, "\"") : ""; + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + ] + }), + // Default role (fallback) + new SRRendererRule_1.SRRendererRule({ + roles: ["default"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + return cursor.isStartTag() ? + "!!<".concat(cursor.getRole(), ">").concat((((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) + ""), "!!") : + "!!</".concat(cursor.getRole(), ">!!"); + } + ] + }), + // Deletion role + new SRRendererRule_1.SRRendererRule({ + roles: ["deletion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[deleted]" || ""); } + ] + }), + // Dialog role + new SRRendererRule_1.SRRendererRule({ + roles: ["dialog"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + return cursor.isEndTag() ? "[End of dialog]" : "[Start of dialog".concat(quoteNamePadBefore(cursor)); + } + ] + }), + // Contenteditable (editable region) - elements with contenteditable="true" (or "") + // Must come before the generic/document rule so it takes precedence. + // Screen readers (JAWS/NVDA) announce these as an editable section when entering + // and "out of section" when leaving. + // We use a broad element list (covering the most common host elements) plus + // "generic" and "paragraph" roles so both bare <div> and labelled variants are caught. + // The test function always checks the attribute and bails out when: + // - the attribute is absent or "false" + // - an explicit ARIA role overrides the semantics (e.g. role="textbox") + new SRRendererRule_1.SRRendererRule({ + roles: ["generic", "paragraph"], + elems: ["DIV", "SPAN", "P", "SECTION", "ARTICLE", "HEADER", "FOOTER", "MAIN", "ASIDE", "NAV", "LI", "TD", "TH", "PRE", "BLOCKQUOTE", "FIGURE", "FIGCAPTION", "DETAILS", "SUMMARY"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + var elem = cursor.getElement(); + if (!elem) + return null; + var ce = elem.getAttribute("contenteditable"); + if (ce !== "true" && ce !== "") + return null; + // Defer to the explicit-role rule when an author provides a concrete ARIA role + // (e.g. role="textbox") — those roles carry richer semantics and their own rules. + if (elem.hasAttribute("role")) + return null; + // <p> retains its "paragraph" semantics even when editable. + var isParagraph = cursor.getRole() === "paragraph" || elem.nodeName.toUpperCase() === "P"; + if (cursor.isEndTag()) { + return mode === "item" ? (isParagraph ? "[out of paragraph]" : "[out of section]") : ""; + } + // aria-readonly is not a supported state on contenteditable elements — + // screen readers (JAWS/NVDA) ignore it entirely, so we exclude it here. + // Only disabled is meaningful (it overrides the editable semantics). + var stateAnnouncements = ""; + if (elem.hasAttribute("disabled") || elem.getAttribute("aria-disabled") === "true") { + stateAnnouncements = ", disabled"; + } + var containerWord = isParagraph ? "paragraph" : "section"; + // In tab_focus mode, only append textContent when the accessible name + // is extrinsic (aria-label / aria-labelledby, i.e. nameFrom ≠ "content"/"text"). + // When nameFrom IS "content", jumpCurrentEnd already walks children so + // appending again would duplicate the text. + var nameInfo = cursor.getNameInfo(); + var nameFromContent = !nameInfo || ["content", "text"].includes(nameInfo.nameFrom); + var textContent = (mode === "tab_focus" && !nameFromContent) ? (_a = elem.textContent) === null || _a === void 0 ? void 0 : _a.trim() : ""; + var contentSuffix = textContent ? " ".concat(textContent) : ""; + return "[".concat(quoteNamePadAfter(cursor)).concat(containerWord, ", editable").concat(stateAnnouncements, "]").concat(contentSuffix); + } + ] + }), + // Document role + new SRRendererRule_1.SRRendererRule({ + roles: ["document", "generic"], + elems: [], + modes: ["item"], + tests: [ + function () { return ""; } + ] + }), + // Graphics document role + new SRRendererRule_1.SRRendererRule({ + roles: ["graphics-document"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isStartTag() && !((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + return null; + }, + function (cursor) { var _a; return (cursor.isStartTag() && (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) === "")) ? "" : null; }, + function (cursor) { var _a; return (cursor.isStartTag() && ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && "[graphic".concat(quoteNamePadBefore(cursor), "]")) || null; }, + function (cursor) { return (cursor.isEndTag()) ? "" : null; } + ] + }), + // Heading role + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && cursor.isStartTag()) + return ""; + if (mode === "item" && cursor.isEndTag()) + return ""; + var level; + var node = cursor.getElement(); + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + return "[heading level ".concat(level).concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[heading level ".concat(level, "]"); + } + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["heading", "h1", "h2", "h3", "h4", "h5", "h6"], + tests: [ + function (cursor) { + if (cursor.isStartTag()) { + var node = cursor.getNode(); + var level = void 0; + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + return "[".concat(quoteNamePadAfter(cursor), "heading level ").concat(level, "]"); + } + return ""; + } + ] + }), + // Image role + new SRRendererRule_1.SRRendererRule({ + roles: ["img"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b, _c; + if (cursor.isEndTag()) { + return ""; + } + else { + if (!((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + // (these were only included because of the SKIP_ITEM_BEHAVIOR change) + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + else if (((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) === "") { + return ""; + } + else { + return "[graphic".concat(quoteNamePadBefore(cursor), "]"); + } + } + } + ] + }), + // Insertion role + new SRRendererRule_1.SRRendererRule({ + roles: ["insertion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[inserted]" || ""); } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["link"], + elems: [], + modes: ["item", "region", "link", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && !["content", "text"].includes((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + return getLinkAnnouncement(cursor, mode); + } + return null; + } + ] + }), + // Listitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["listitem"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + var isOrdered; + var parentListElem; + var walkParents = DOMWalker_1.DOMWalker.parentNode(cursor.getNode()); + while (typeof isOrdered === "undefined" && walkParents) { + if (walkParents.nodeType === 1) { + var elem = walkParents; + if (elem.hasAttribute("role")) { + if (elem.getAttribute("role") === "list") { + isOrdered = false; + parentListElem = elem; + } + } + else if (elem.nodeName.toUpperCase() === "UL") { + isOrdered = false; + parentListElem = elem; + } + else if (elem.nodeName.toUpperCase() === "OL") { + isOrdered = true; + parentListElem = elem; + } + } + walkParents = DOMWalker_1.DOMWalker.parentNode(walkParents); + } + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var retStr = ""; + if (!isOrdered) { + var elem = cursor.getElement(); + if ((elem.nodeName.toUpperCase() === "LI" && window.getComputedStyle(elem).listStyleType === "none") + || elem.nodeName.toUpperCase() !== "LI") { + retStr = cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + retStr = cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + else { + // For ordered lists, count sibling listitems and account for start attribute + var count = 1; // Start at 1 by default + // Get the start attribute if it exists on the <ol> element + if (parentListElem && parentListElem.nodeName.toUpperCase() === 'OL' && + parentListElem.hasAttribute('start')) { + var startValue = parseInt(parentListElem.getAttribute('start') || '1', 10); + count = isNaN(startValue) ? 1 : startValue; + } + // Count previous sibling listitems at the same level using DOMWalker + var currentElem = cursor.getElement(); + var sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(currentElem); + while (sibling) { + // Only count direct siblings that are listitems (element nodes only) + if (sibling.nodeType === 1) { + var siblingElem = sibling; + if (siblingElem.getAttribute('role') === 'listitem' || + siblingElem.nodeName.toUpperCase() === 'LI') { + count++; + } + } + sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(sibling); + } + retStr = cursor.isStartTag() ? "".concat(count, ". ").concat(nameToUse) : ""; + } + return retStr; + } + ] + }), + // Math role + new SRRendererRule_1.SRRendererRule({ + roles: ["math"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isEndTag() ? "[math content]" : ""; } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["menuitem"], + elems: [], + modes: ["item", "tab_focus", "region"], + tests: [ + function (cursor) { + var retVal = ""; + if (cursor.isStartTag()) { + // let isSubMenuContainer = false; + // for (let checkChildren=cursor.getNode().firstChild; !isSubMenuContainer && checkChildren !== null; checkChildren = checkChildren.nextSibling) { + // isSubMenuContainer = checkChildren.nodeName.toUpperCase() === "UL"; + // } + // if (isSubMenuContainer) return "[????menu]"; + var expandStr = ""; + var elem = cursor.getElement(); + if (elem.getAttribute("aria-haspopup") === "true") { + expandStr += ", sub-menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + retVal = "[menu".concat(expandStr); + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + retVal += quoteNamePadBefore(cursor); + } + retVal += "]"; + } + return retVal; + } + ] + }), + // Meter role + new SRRendererRule_1.SRRendererRule({ + roles: ["meter"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Progressbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["progressbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Radio role + new SRRendererRule_1.SRRendererRule({ + roles: ["radio"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var roleDesc = getRoleDescription(cursor, "radio button"); + var bChecked = false; + if (cursor.getElement().hasAttribute("aria-checked")) { + bChecked = cursor.getElement().getAttribute("aria-checked") === "true"; + } + else { + bChecked = cursor.getNode().checked; + } + var stateStr = getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(bChecked ? "checked" : "not checked").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Searchbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["searchbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[".concat(quoteNamePadAfter(cursor), "edit]") : ""; } + ] + }), + // Separator role + new SRRendererRule_1.SRRendererRule({ + roles: ["separator"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[separator]" || ""); } + ] + }), + // Slider role + new SRRendererRule_1.SRRendererRule({ + roles: ["slider"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "slider"); + var elem = cursor.getElement(); + // Check for aria-valuenow first, then fall back to native value property + var value = elem.hasAttribute("aria-valuenow") + ? elem.getAttribute("aria-valuenow") + : cursor.getNode().value; + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", ").concat(value).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Spinbutton role + new SRRendererRule_1.SRRendererRule({ + roles: ["spinbutton"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "spinbutton"); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", editable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Tab role + new SRRendererRule_1.SRRendererRule({ + roles: ["tab"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "tab"); + return "[".concat(roleDesc).concat(cursor.getNode().getAttribute("aria-selected") === "true" ? ", selected" : "").concat(quoteNamePadBefore(cursor), "]"); + } + ] + }), + // Tablist role + new SRRendererRule_1.SRRendererRule({ + roles: ["tablist"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[group start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[group end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Tabpanel role + new SRRendererRule_1.SRRendererRule({ + roles: ["tabpanel"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[Tab panel start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[Tab panel end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Text role + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["item", "link", "tab_focus", "region"], + tests: [ + function (cursor) { + var _a, _b, _c, _d; + if (cursor.isEndTag() || !((_a = cursor.getParentElement()) === null || _a === void 0 ? void 0 : _a.getElement())) + return null; + var elem = (_b = cursor.getParentElement()) === null || _b === void 0 ? void 0 : _b.getElement(); + if (elem.ownerDocument.defaultView.getComputedStyle(elem).textDecorationLine === "line-through") { + return "[strikethrough] ".concat((((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) + ""), " [end strikethrough]"); + } + return "".concat((((_d = cursor.getNameInfo()) === null || _d === void 0 ? void 0 : _d.name) + "")); + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["heading"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Textbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["textbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + var elem = cursor.getElement(); + if (cursor.isEndTag()) { + return mode === "item" && elem.nodeName.toUpperCase() === "TEXTAREA" ? "[out of edit]" : ""; + } + if (!cursor.isStartTag()) { + return ""; + } + var attributes = ""; + if (elem.hasAttribute("placeholder") && elem.getAttribute("placeholder").trim().length > 0) { + attributes += ", placeholder: ".concat(elem.getAttribute("placeholder")); + } + attributes += getStateAnnouncements(elem); + var isMultiline = elem.nodeName.toUpperCase() === "TEXTAREA" || elem.getAttribute("aria-multiline") === "true"; + var describedBy = getDescribedByAnnouncements(elem, mode); + if (isMultiline) { + var textContent = mode === "tab_focus" ? (_a = elem.textContent) === null || _a === void 0 ? void 0 : _a.trim() : ""; + var contentSuffix = textContent ? " ".concat(textContent) : ""; + return "[".concat(quoteNamePadAfter(cursor), "edit, multiline").concat(attributes).concat(describedBy, "]").concat(contentSuffix); + } + return "[".concat(quoteNamePadAfter(cursor), "edit").concat(attributes).concat(describedBy, "]"); + } + ] + }), + // Treeitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["treeitem"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var elem = cursor.getElement(); + // Build the announcement string without the name (let content render separately) + var announcement = "[treeview item"; + // Add selected state if present + if (elem.getAttribute("aria-selected") === "true") { + announcement += ", selected"; + } + // Add expanded/collapsed state if present + if (elem.hasAttribute("aria-expanded")) { + announcement += elem.getAttribute("aria-expanded") === "true" ? ", expanded" : ", collapsed"; + } + // Add level if explicitly set or calculate from nesting + var level = elem.getAttribute("aria-level"); + if (level) { + announcement += ", level ".concat(level); + } + else { + // Calculate level by counting parent treeitems or groups using DOMWalker for shadow DOM support + var calculatedLevel = 1; + var parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + while (parent_1) { + var parentRole = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + if (parentRole === "group" || parentRole === "tree") { + // Check if this group is inside a treeitem + var groupParent = DOMWalker_1.DOMWalker.parentElement(parent_1); + while (groupParent) { + var groupParentRole = AriaUtil_1.AriaUtil.getResolvedRole(groupParent); + if (groupParentRole === "treeitem") { + calculatedLevel++; + break; + } + else if (groupParentRole === "tree") { + break; + } + groupParent = DOMWalker_1.DOMWalker.parentElement(groupParent); + } + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + if (calculatedLevel > 1) { + announcement += ", level ".concat(calculatedLevel); + } + } + // Add position information (aria-posinset/aria-setsize or calculate) + var position = elem.getAttribute("aria-posinset"); + var setSize = elem.getAttribute("aria-setsize"); + if (!position || !setSize) { + // Calculate position by counting siblings with same role using DOMWalker for shadow DOM support + var pos = 0; + var total = 0; + var parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + if (parent_2) { + // Iterate through children to count treeitems + var child = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(parent_2); + while (child) { + if (child.nodeType === 1) { // Element node + var childElem = child; + if (AriaUtil_1.AriaUtil.getResolvedRole(childElem) === "treeitem") { + total++; + if (childElem === elem) { + pos = total; + } + } + } + child = child.nextSibling; + } + } + position = pos.toString(); + setSize = total.toString(); + } + announcement += ", ".concat(position, " of ").concat(setSize, "] "); + return announcement; + } + ] + }), + // HTML Element rules + // Preformatted text line rendering: when cursor is at a <pre> element with + // preLineIndex set, render only that line of the pre's text content. + // This rule fires inside renderRange for per-line item stops. + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["PRE"], + modes: ["item"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isEndTag()) + return ""; + if (cursor.preLineIndex === undefined) + return null; // let container_enter handle it + var fullText = (_a = cursor.getNode().textContent) !== null && _a !== void 0 ? _a : ""; + var rawLines = fullText.split("\n"); + var start = 0; + while (start < rawLines.length && rawLines[start].trim() === "") + start++; + var end = rawLines.length - 1; + while (end >= start && rawLines[end].trim() === "") + end--; + var lines = rawLines.slice(start, end + 1); + return (_b = lines[cursor.preLineIndex]) !== null && _b !== void 0 ? _b : ""; + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BODY"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + // Suppress [Start/End of document] for iframe subdocument bodies. + // When the inner body is entered from an <iframe>, diffContainers emits + // the ["name", frame] container-enter announcement instead. Suppressing + // the document title announcements here avoids double-announcements. + var body = cursor.getNode(); + if (body.ownerDocument !== document) + return ""; + var titleStr = cursor.getNode().ownerDocument.title; + return cursor.isEndTag() ? "[End of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]") : "[Start of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]"); + } + ] + }), + // Inline frame (<iframe>) — tab_focus mode: announces the frame as a tab stop. + // A titled iframe announces its accessible name; an untitled one announces just "frame". + // (The item-mode announcement is handled by diffContainers emitting the container_enter + // IFRAME rule when crossing into the subdocument — no separate SR_RULE needed for item mode.) + // When role="none" or role="presentation" is set, screen readers treat the frame as a + // generic grouping — announce "grouping" instead of "frame". + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return null; + var role = cursor.getElement().getAttribute("role"); + var isPresentation = role === "none" || role === "presentation"; + // An untitled presentational iframe produces no meaningful tab stop label — + // suppress it entirely so it does not appear in the tab_focus column. + if (isPresentation && !cursor.getName()) + return null; + var label = isPresentation ? "grouping" : "frame"; + return "[".concat(quoteNamePadAfter(cursor)).concat(label, "]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BR"], + modes: ["item"], + tests: [ + function (cursor) { + try { + var walk = cursor.clone(); + // Walk until we hit the beginning of the page, find another BR, or find something with a name + while (walk.previous(function () { return true; }) && walk.getNode().nodeName.toUpperCase() !== "BR" && walk.getNameInfo() && walk.getNameInfo().name.trim().length === 0) + ; + return walk.getNode().nodeName.toUpperCase() === "BR" ? "[blank]" : null; + } + catch (err) { + console.error(err); + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["INPUT"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { var _a; return (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "password" && "[".concat(quoteNamePadAfter(cursor), "edit, protected").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]")) || null; }, + function (cursor, _oldCursor, mode) { + var _a, _b; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "file") { + var value = ((_b = cursor.getElement()) === null || _b === void 0 ? void 0 : _b.value) || ""; + value = value === "" ? "No file chosen" : value.substring("C:\\fakepath\\".length); + return "[".concat(quoteNamePadAfter(cursor), "button").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(quoteNamePadAfter(cursor)).concat(value, "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "color") { + var val = cursor.getElement().value; + var r = (Number("0x".concat(val.substring(1, 3))) * 100.0 / Number("0xff")).toFixed(0); + var g = (Number("0x".concat(val.substring(3, 5))) * 100.0 / Number("0xff")).toFixed(0); + var b = (Number("0x".concat(val.substring(5))) * 100.0 / Number("0xff")).toFixed(0); + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(r, "% red ").concat(g, "% green ").concat(b, "% blue]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "month") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] [spin button, ").concat(y, "] [menu button] [subMenu] Show month picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "date") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + var day = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [menu button] [subMenu] Show date picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "datetime-local") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var y = "0"; + var m = "0"; + var day = "0"; + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + if (date.getHours() === 0 || date.getHours() === 12) { + hour = "12"; + } + else if (date.getHours() < 12) { + hour = "" + date.getHours(); + } + else { + hour = "" + (date.getHours() - 12); + } + min = "" + date.getMinutes(); + ampm = date.getHours() >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show local date and time picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "time") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = val.split(":"); + var hours = parseInt(date[0]); + if (hours === 0 || hours === 12) { + hour = "12"; + } + else if (hours < 12) { + hour = "" + hours; + } + else { + hour = "" + (hours - 12); + } + min = date[1]; + ampm = hours >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "grouping clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), " [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show time picker [out of grouping]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "week") { + var val = cursor.getElement().value; // 2025-W38 + var year = "0"; + var week = "0"; + if (val.trim().length > 0) { + var date = val.split(/-W/); + year = date[0]; + week = date[1]; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(week, "], [spin button, ").concat(year, "] [menu button] [subMenu] Show week picker"); + } + return null; + }, + function (cursor) { var _a; return ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "hidden" ? "" : null; }, + function (cursor) { return (cursor.isStartTag() && "!![".concat(quoteNamePadAfter(cursor), "input!!]").concat(cursor.getElement().outerHTML)) || null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["LI"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var elem = cursor.getElement(); + if (window.getComputedStyle(elem).listStyleType === "none") { + return cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + return cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + ] + }), + // MathML elements + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MFRAC"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[fraction]" : "[end fraction]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MROW"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Only announce over on the end tag + if (cursor.isStartTag()) + return undefined; + var fraction = cursor.getCurrentOrParentByRoleClone([], ["mfrac"]); + if (fraction && ((_a = fraction.getElement().querySelectorAll("mrow")[0]) === null || _a === void 0 ? void 0 : _a.isSameNode(cursor.getNode()))) { + return "[over]"; + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSQRT"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[square root]" : "[end root]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSUP"], + modes: ["item"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isEndTag()) + return undefined; + var mi = ((_a = cursor.getElement().querySelector("mi")) === null || _a === void 0 ? void 0 : _a.innerHTML) || ""; + var mn = ((_b = cursor.getElement().querySelector("mn")) === null || _b === void 0 ? void 0 : _b.innerHTML) || ""; + if (mn === "2") + return "".concat(mi, " [squared]"); + if (mn === "3") + return "".concat(mi, " [cubed]"); + return "".concat(mi, " [to the ").concat(mn, "]"); + } + ] + }), + // Summary element — the disclosure button for a <details> widget. + // <summary> has implicitRole: null in ARIADefinitions so no role-based + // button rule fires. We add an explicit element rule that announces it as + // a button with the collapsed / expanded state from the parent <details>. + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["SUMMARY"], + modes: ["item", "button", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a, _b; + if (cursor.isEndTag()) + return ""; + var summaryElem = cursor.getElement(); + if (!summaryElem) + return null; + // Only the first <summary> that is a direct child of <details> + // acts as the disclosure button. + var detailsParent = summaryElem.parentElement; + if (!detailsParent || detailsParent.nodeName.toUpperCase() !== "DETAILS") + return null; + var firstSummary = Array.from(detailsParent.children).find(function (c) { return c.nodeName.toUpperCase() === "SUMMARY"; }); + if (!firstSummary || !firstSummary.isSameNode(summaryElem)) + return null; + var stateStr = detailsParent.hasAttribute("open") ? "expanded" : "collapsed"; + // <summary> has implicitRole: null so AccNameUtil may not compute a name; + // read aria-label first, then fall back to visible text content. + var ariaLabel = (_a = summaryElem.getAttribute("aria-label")) === null || _a === void 0 ? void 0 : _a.trim(); + var textContent = ((_b = summaryElem.textContent) === null || _b === void 0 ? void 0 : _b.trim()) || ""; + var label = ariaLabel || textContent; + var labelStr = label ? "\"".concat(label, "\", ") : ""; + // Description: prefer explicit aria-describedby; when aria-label is the + // name source, the subtree text becomes the description (accname-1.2 §4.3). + var descStr = getDescribedByAnnouncements(summaryElem, mode); + if (!descStr && ariaLabel && textContent) { + descStr = mode === "item" ? ", \u0001".concat(textContent, "\u0002") : ", \"".concat(textContent, "\""); + } + return "[".concat(labelStr, "button, ").concat(stateStr).concat(descStr, "]"); + } + ] + }), + // Multiple roles rules - placed at the bottom + // Default mode rules - Container elements (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "code", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "list", "main", + "mark", "navigation", "region", "row", "rowheader", "search", "table", "toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Default mode rules - Elements that screen readers typically ignore (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["paragraph", "rowgroup", "status", "strong", "subscript", "superscript", + "term", "time", "none", "presentation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/container_enter.ts" +/*!**********************************************************!*\ + !*** ./src/v4/simulator/render_rules/container_enter.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var SRTableUtil_1 = __webpack_require__(/*! ../SRTableUtil */ "./src/v4/simulator/SRTableUtil.ts"); +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +/** + * Generates the announcement text when entering a table cell + */ +function renderEnterTableCell(newCursor, oldCursor) { + var _a; + // We seem to be at the newline text node after the cell + if (oldCursor && ((_a = oldCursor.getNode()) === null || _a === void 0 ? void 0 : _a.nodeName) === "#text") { + oldCursor = oldCursor.clone(); + oldCursor.previous(function () { return true; }); + } + var newTableModel = SRTableUtil_1.SRTableUtil.getTableModel(newCursor); + var oldCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(oldCursor, newTableModel); + var newCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(newCursor, newTableModel); + if (!newCellInfo) + return ""; + var retVal = []; + // Announce row information if we've moved to a different row or the rowspan has changed + if (!oldCellInfo || oldCellInfo.rowIndexStart !== newCellInfo.rowIndexStart || oldCellInfo.rowspan !== newCellInfo.rowspan) { + // If a change in row or a change in rowSpan + var rowHeaders = SRTableUtil_1.SRTableUtil.getRowHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = rowHeaders && rowHeaders.trim().length > 0 ? "\"".concat(rowHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "row ").concat((newCellInfo.rowIndexStart + 1)).concat(newCellInfo.rowspan > 1 ? " through " + (newCellInfo.rowIndexStart + newCellInfo.rowspan) : "", "]")); + } + // Announce column information if we've moved to a different column or the colspan has changed + if (!oldCellInfo || oldCellInfo.colIndexStart !== newCellInfo.colIndexStart || oldCellInfo.colspan !== newCellInfo.colspan) { + // If a change in column or a change in colspan + var columnHeaders = SRTableUtil_1.SRTableUtil.getColumnHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = columnHeaders && columnHeaders.trim().length > 0 ? "\"".concat(columnHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "column ").concat((newCellInfo.colIndexStart + 1)).concat(newCellInfo.colspan > 1 ? " through " + (newCellInfo.colIndexStart + newCellInfo.colspan) : "", "]")); + } + return retVal.join(" "); +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item", "article", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + // Cell role + new SRRendererRule_1.SRRendererRule({ + roles: ["cell"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Columnheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["columnheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "complementary region]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "content info region]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[section]"; + } + else { + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "form region]"); + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item", "region"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + var elem = cursor.getElement(); + var hasSummary = Array.from(elem.children).some(function (c) { return c.nodeName.toUpperCase() === "SUMMARY"; }); + if (hasSummary) { + // The <summary> child speaks as the disclosure button; suppress + // the container-enter announcement entirely. + return ""; + } + // No explicit <summary>: in a real browser the UA injects a default + // "Details" summary. jsdom does not, so we announce the widget here + // as a fallback using the same default label a real browser would use. + return "[\"Details\", button, ".concat(elem.hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // -- tab_focus + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["tab_focus"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + var elem = cursor.getElement(); + var hasSummary = Array.from(elem.children).some(function (c) { return c.nodeName.toUpperCase() === "SUMMARY"; }); + if (hasSummary) { + // <summary> is the tab stop, not <details> itself. + return null; + } + // No <summary>: <details> itself is focusable (UA default behaviour). + return "[\"Details\", button, ".concat(elem.hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + return ""; + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var _a; + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // Count items, excluding those in other lists or within presentational containers + var numItems = 0; + for (var i = 0; i < descendantListItems.snapshotLength; i++) { + var item = descendantListItems.snapshotItem(i); + // Walk up ancestors to check for both nested lists and presentational containers + var isInOtherList = false; + var hasPresentationalAncestor = false; + var ancestor = item.parentElement; + while (ancestor && ancestor !== node) { + // Check if ancestor is another list + var ancestorRole = AriaUtil_1.AriaUtil.getResolvedRole(ancestor); + if (ancestorRole === "list" || + ancestor.nodeName.toUpperCase() === "UL" || + ancestor.nodeName.toUpperCase() === "OL") { + isInOtherList = true; + break; + } + // Check if ancestor has presentational children + if (ancestorRole && ((_a = ARIADefinitions_1.ARIADefinitions.designPatterns[ancestorRole]) === null || _a === void 0 ? void 0 : _a.presentationalChildren)) { + hasPresentationalAncestor = true; + break; + } + ancestor = ancestor.parentElement; + } + if (!isInOtherList && !hasPresentationalAncestor) { + numItems++; + } + } + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "list of ").concat(numItems, " items]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "main region]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers = document.evaluate(".//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers2 = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']/*[@role='menu']|.//*[@role='menu']//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + console.log("MENUBAR", cursor.isEndTag() ? "/" : "", cursor.getNode()); + console.log(descendantListItems, descendantListItemsInOtherLists); //, descendantContainers, descendantContainers2) + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; //-descendantContainers.snapshotLength+descendantContainers2.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "menubar with ").concat(numItems, " items]"); + } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Radio group role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.getNameInfo() === null) + return null; + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Row role + new SRRendererRule_1.SRRendererRule({ + roles: ["row"], + elems: [], + modes: ["item", "table"], + tests: [ + function () { return ""; } + ] + }), + // Rowheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var tableWalker = cursor.clone(); + // Get to the start of the table + while (tableWalker.getRole() !== "table" && tableWalker.previous(function () { return true; })) + ; + // Set an end to the table + var tableNode = tableWalker.getNode(); + var rows = 0; + var cols = 0; + // Sanity check that the table has content + if (tableWalker.getNode().firstChild) { + var firstRowComplete = false; + while (tableWalker.next(function () { return true; }) && !tableWalker.getNode().isSameNode(tableNode)) { + var role = tableWalker.getRole(); + if (tableWalker.isStartTag()) { + if (role === "row") { + ++rows; + } + else { + if (!firstRowComplete && ["cell", "rowheader", "columnheader"].includes(role)) { + var elem = tableWalker.getNode(); + cols += parseInt(elem.getAttribute("colspan") || "1"); + } + } + } + else if (role === "row") { + firstRowComplete = true; + } + } + } + return "[table with ".concat(rows, " ").concat(rows === 1 ? "row" : "rows", " and ").concat(cols, " ").concat(cols === 1 ? "column" : "columns").concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "toolbar]"); + } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//dt", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "definition list of ").concat(numItems, " terms]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[highlighted]"; } + ] + }), + // Inline frame (<iframe>) + // Only fires in item mode (where it produces the container-enter label on the parent + // block stop). In tab_focus mode the iframe element itself is the stop and the + // IFRAME SR_RULE in common.ts supplies the label directly — no container-enter needed. + // When role="none" or role="presentation" is set, screen readers treat the frame + // as a generic grouping — announce "grouping" instead of "frame". + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["item"], + tests: [ + function (cursor) { + var role = cursor.getElement().getAttribute("role"); + var isPresentation = role === "none" || role === "presentation"; + // An untitled presentational iframe has no meaningful grouping label to + // announce — suppress the container-enter entirely. + if (isPresentation && !cursor.getName()) + return null; + var label = isPresentation ? "grouping" : "frame"; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(label, "]"); + } + ] + }), + // Preformatted text (<pre>) + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["PRE"], + modes: ["item"], + tests: [ + function (cursor) { return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "preformatted text]"); } + ] + }), + // Multiple roles rules - placed at the bottom + // Heading mode rules - ignore container elements in heading mode (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "region", + "row", "rowheader", "search", "toolbar", "list", "main", "navigation", "table"], + elems: [], + modes: ["heading"], + tests: [ + function () { return ""; } + ] + }) +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/containter_exit.ts" +/*!**********************************************************!*\ + !*** ./src/v4/simulator/render_rules/containter_exit.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "complementary region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "content info region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[out of figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[out of section]"; + } + else { + return "[out of form]"; + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // <details> uses the group role but has its own disclosure widget semantics; + // SRs do not announce "out of grouping" when leaving a details element. + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + return ""; + } + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + return "[out of grouping]"; + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "out of list]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "main region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (_cursor) { return "[out of menubar]"; } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // radiogroup role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (_cursor) { return "[out of grouping]"; } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of table]"; } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of toolbar]"; } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["ABBR"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.getElement().hasAttribute("title") ? + "[".concat(cursor.getElement().getAttribute("title"), "]") : null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of definition list]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of highlighted]"; } + ] + }), + // Inline frame (<iframe>) + // When role="none" or role="presentation" is set, screen readers treat the frame + // as a generic grouping — announce "out of grouping" instead of "out of frame". + // Exception: an untitled presentational iframe produces no container-enter label, so + // the matching container-exit must also be suppressed to avoid a stray "[out of grouping]". + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["item"], + tests: [ + function (cursor) { + var role = cursor.getElement().getAttribute("role"); + var isPresentation = role === "none" || role === "presentation"; + if (isPresentation && !cursor.getName()) + return null; + return isPresentation ? "[out of grouping]" : "[out of frame]"; + } + ] + }), + // Preformatted text (<pre>) + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["PRE"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of preformatted text]"; } + ] + }), + // Multiple roles rules - placed at the bottom + // Region mode rules - ignore container elements in region and heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["group", "article", "banner", "blockquote", "caption", "complementary", + "contentinfo", "figure", "form", "list", "region", "main", "navigation", + "search", "table", "toolbar"], + elems: [], + modes: ["region", "heading"], + tests: [ + function () { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/index.ts" +/*!************************************************!*\ + !*** ./src/v4/simulator/render_rules/index.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CONTAINER_EXIT_RULES = exports.CONTAINER_ENTER_RULES = exports.SR_RULES = void 0; +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +var container_enter_1 = __webpack_require__(/*! ./container_enter */ "./src/v4/simulator/render_rules/container_enter.ts"); +var containter_exit_1 = __webpack_require__(/*! ./containter_exit */ "./src/v4/simulator/render_rules/containter_exit.ts"); +exports.SR_RULES = common_1.RULES; +exports.CONTAINER_ENTER_RULES = container_enter_1.RULES; +exports.CONTAINER_EXIT_RULES = containter_exit_1.RULES; + + +/***/ }, + +/***/ "./src/v4/util/AccNameUtil.ts" +/*!************************************!*\ + !*** ./src/v4/util/AccNameUtil.ts ***! + \************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AccNameUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil = /** @class */ (function () { + function AccNameUtil() { + } + /** + * Computes the accessible name for an SVG element according to W3C specification + * Following the Accessible Name and Description Computation 1.1 algorithm + * https://www.w3.org/TR/accname-1.1/ + * + * @param elem The SVG element + * @returns The accessible name result or null if no accessible name is found + */ + AccNameUtil.computeAccessibleNameForSVGElementW3C = function (elem) { + if (!elem || elem.nodeName.toLowerCase() !== 'svg') + return null; + // Step 1: Check for aria-labelledby (already handled by main computeAccessibleName function) + // Step 2: Check for aria-label (already handled by main computeAccessibleName function) + // Step 3: Check for title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_1 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_1 += title.trim(); + } + }); + if (text_1 && text_1.trim() !== '') + return { "name": text_1.trim(), "nameFrom": "svgTitle" }; + } + // Step 4: Check for text content in SVG text elements + var textContent = ""; + var textElements = elem.querySelectorAll("text, textPath, tspan"); + if (textElements && textElements.length > 0) { + textElements.forEach(function (textElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(textElement) && !VisUtil_1.VisUtil.isNodePresentational(textElement)) { + var content = textElement.textContent; + if (content && content.trim() !== '') + textContent += " " + content.trim(); + } + }); + if (textContent.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(textContent.trim()), "nameFrom": "svgText" }; + } + // Step 5: Check for xlink:title attribute on links within SVG + var links = elem.querySelectorAll("a"); + for (var i = 0; i < links.length; i++) { + var link = links[i]; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(link) && !VisUtil_1.VisUtil.isNodePresentational(link)) { + var xlinkTitle = link.getAttribute("xlink:title"); + if (xlinkTitle && xlinkTitle.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(xlinkTitle), "nameFrom": "svglinkTitle" }; + } + } + // Step 6: Check for aria-describedby or aria-description + var description = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (description && description.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(description), "nameFrom": "aria-description" }; + // Step 7: Check for desc element + var descElements = elem.querySelectorAll(":scope > desc"); + if (descElements && descElements.length > 0) { + var descText_1 = ""; + descElements.forEach(function (descElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(descElement) && !VisUtil_1.VisUtil.isNodePresentational(descElement)) { + var desc = descElement.textContent; + if (desc && desc.trim() !== '') + descText_1 += " " + desc.trim(); + } + }); + if (descText_1.trim() !== '') + return { "name": descText_1.trim(), "nameFrom": "svgDesc" }; + } + // Step 8: Check for title attribute + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title"); + if (title && title.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(title), "nameFrom": "title" }; + } + // No accessible name found + return null; + }; + // calculate accessible name for a given node + AccNameUtil.computeAccessibleName = function (elem) { + if (!elem) + return null; + var nodeName = elem.nodeName.toLowerCase(); + var name_pair = CacheUtil_1.CacheUtil.getCache(elem, "ELEMENT_ACCESSBLE_NAME", undefined); + if (name_pair !== undefined) + return name_pair; + // 1. name from author, or elements without a role but with aria-labelledby or aria-label + // get aria label even for the role where the name is prohibited or is 'presentation' or 'none' + var accName = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (accName && accName.trim() !== "") { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }); + return { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }; + } + // 2. accessible name mapping for native html elements + name_pair = AccNameUtil.computeAccessibleNameForNativeElement(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + // 3. name from native or aria attribute + /**name_pair = AccNameUtil.computeAccessibleNameFromAttribute(elem); + if (name_pair) { + CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + }*/ + // 4. name from content for custom elements with a role + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) { + name_pair = AccNameUtil.computeAccessibleNameFromContent(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + } + // 5. name from the global attribute "title" + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title").trim(); + if (title && title.trim().length > 0) { + title = CommonUtil_1.CommonUtil.truncateText(title); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": title, "nameFrom": "title" }); + return { "name": title, "nameFrom": "title" }; + } + } + // 6. name from the attribute "placeholder" + if (nodeName === 'textarea' || (nodeName === 'input' && (!elem.hasAttribute("type") || CommonUtil_1.CommonUtil.input_type_with_placeholder.includes(elem.getAttribute("type"))))) { + var placeholder = elem.getAttribute("placeholder"); + if (placeholder && placeholder.trim().length > 0) { + placeholder = CommonUtil_1.CommonUtil.truncateText(placeholder); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": placeholder, "nameFrom": "placeholder" }); + return { "name": placeholder, "nameFrom": "placeholder" }; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", null); + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForNativeElement = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + // labellable fields + if (CommonUtil_1.CommonUtil.form_labelable_elements.includes(nodeName)) { + // Get only the non-hidden labels for element + var label = CommonUtil_1.CommonUtil.getFormFieldLabel(elem); + if (label && label.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // input types: button, reset, submit, image + if (nodeName === "input" && elem.hasAttribute("type")) { + if (CommonUtil_1.CommonUtil.form_button_types.includes(elem.getAttribute("type"))) { + // input types: button, reset, submit + // Get the "value" attribute for the element + var value = CommonUtil_1.CommonUtil.getElementAttribute(elem, "value"); + if (value && value.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(value), "nameFrom": "value" }; + // input 'submit' and 'reset' have visible defaults so pass if there is no explicit 'value' attribute + var type = elem.getAttribute("type"); + if (type === 'submit' || type === 'reset') + return { "name": type, "nameFrom": "internal" }; + } + else if (elem.getAttribute("type") === 'image') { + // input type = 'image' + // note that though HTML 5 spec indicates "The element's [value] attribute must be omitted", Chrome uses the value. + // Get the accessible name for the alt attribute + var alt = CommonUtil_1.CommonUtil.getElementAttribute(elem, "alt"); + if (alt && alt.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + ; + // the visible default text for type "image" is "Submit" same with the type "submit" + //return {"name":elem.getAttribute("type"), "nameFrom": "internal"}; + } + } + // button + // note button may have a value attribute, but it's not a visible text + if (nodeName === "button") { + // first use the button text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + // for image button: get the first image if exists + var image = elem.querySelector('img'); + if (image && !VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + // for a button with a svg image + var svg = elem.querySelector('svg'); + if (svg && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svg) && !VisUtil_1.VisUtil.isNodePresentational(svg)) { + var pair = AccNameUtil.computeAccessibleName(svg); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + } + // fieldset + if (nodeName === "fieldset") { + // if the fieldset element's first child is a legend element, then use the subtree of the legend + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'legend') { + // legend can be mixed text + var text = first.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + } + // output + if (nodeName === "output") { + // if the associated label element exists, use concatenated accessible name(s) from labelled elements. + if (elem.hasAttribute("for")) { + var labelIDs = elem.getAttribute("for").trim().split(" "); + if (labelIDs && labelIDs.length > 0) { + var label = ""; + for (var j = 0; j < labelIDs.length; j++) { + var labelNode = elem.ownerDocument.getElementById(labelIDs[j]); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elem) && !VisUtil_1.VisUtil.isNodeHiddenFromAT(labelNode) && !VisUtil_1.VisUtil.isNodePresentational(labelNode)) { + var pair = AccNameUtil.computeAccessibleName(labelNode); + if (pair && pair.name && pair.name.trim().length > 0) + label += " " + CommonUtil_1.CommonUtil.normalizeSpacing(pair.name); + } + } + if (label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + } + } + // summary + if (nodeName === "summary") { + // use summary element subtree + var text = elem.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + // details + if (nodeName === "details") { + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'summary') { + // get accessible name from summary + var pair = AccNameUtil.computeAccessibleName(first); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(pair.name.trim()), "nameFrom": "summary" }; + } + // If no summary element as a direct child of the details element, + // the user agent should provide one with a subtree containing a localized string of the word "details". + return { "name": "details", "nameFrom": "internal" }; + } + // figure + if (nodeName === "figure") { + // if the figure element has a figcaption as a child + var caption = CommonUtil_1.CommonUtil.getChildByTagHidden(elem, "figcaption", true, false); + if (caption && caption.length > 0) { + // figcaption can be mixed text + var text = caption[0].innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "figcaption" }; + } + } + // img elements: use attribute "alt" + if (nodeName === "img") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // area elements: use attribute "alt" + if (nodeName === "area") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + if (alt && alt.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // table element + if (nodeName === "table") { + // if the figure element has a caption as the first child + var captionElem = elem.firstElementChild; + if (captionElem && captionElem.nodeName.toLowerCase() === 'caption') { + // caption can be mixed text + var caption = captionElem.innerText; + if (caption && caption.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(caption), "nameFrom": "caption" }; + } + } + // a element + if (nodeName === "a") { + // first use the link text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + //for image link: get the image or svg if exists + var images = elem.querySelectorAll(":scope > img, :scope > svg"); + if (images && images.length > 0) { + var text_2 = ""; + images.forEach(function (image) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + text_2 += " " + pair.name.trim(); + } + }); + if (text_2.trim() !== '') + return { "name": text_2.trim(), "nameFrom": "alt" }; + } + } + // optgroup + // label participate in accessible name calculation: https://www.w3.org/TR/html-aam-1.0/#att-label + // The label attribute must be specified. Its value gives the name of the group + // the value is disabled in the interface + if (nodeName === "optgroup" || nodeName === "option" || nodeName === "track") { + var label = elem.getAttribute("label"); + if (label && label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // svg + if (nodeName === "svg") { + var pair = AccNameUtil.computeAccessibleNameForSVGElementW3C(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForSVGElement = function (elem) { + // 1. a direct child or descendant title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_3 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_3 += title.trim(); + } + }); + if (text_3 && text_3.trim() !== '') + return { "name": text_3.trim(), "nameFrom": "svgTitle" }; + } + // 2. xlink:title attribute on a link + var linkTitle = elem.querySelector("a"); + if (linkTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(linkTitle) && !VisUtil_1.VisUtil.isNodePresentational(linkTitle)) { + var link = linkTitle.getAttribute("xlink:title"); + if (link && link.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(link), "nameFrom": "svglinkTitle" }; + } + /** 3. for text container elements, the text content. + * note the SVG text content elements are: ‘text’, ‘textPath’ and ‘tspan’. + * svg element can be nested. One of the purposes is to to group SVG shapes together as a collection for responsive design. + * + * select text content excluded the text from the nested svg elements and their children + */ + var text = ""; + elem.querySelectorAll(":scope > *").forEach(function (element) { + if (element.nodeName.toLowerCase() !== 'svg' && !VisUtil_1.VisUtil.isNodeHiddenFromAT(element) && !VisUtil_1.VisUtil.isNodePresentational(element)) { + var value = CommonUtil_1.CommonUtil.getInnerText(element); + if (value && value.trim().length > 0) + text += value; + } + }); + if (text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "svgText" }; + // 4. from aria-describedby or aria-description + var descby = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (descby && descby.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(descby), "nameFrom": "aria-description" }; + // 5. a direct child or descendant desc element + var descElems = elem.querySelectorAll(":scope > desc"); + if (descElems && descElems.length > 0) { + var text_4 = ""; + descElems.forEach(function (descElem) { + if (descElem && !VisUtil_1.VisUtil.isNodeHiddenFromAT(descElem) && !VisUtil_1.VisUtil.isNodePresentational(descElem)) { + var desc = descElem.textContent; + if (desc && desc.trim() !== '') + text_4 += desc.trim(); + } + }); + if (text_4 && text_4.trim() !== '') + return { "name": text_4.trim(), "nameFrom": "svgDesc" }; + } + }; + // calculate accessible name for custom elements marked with aria + AccNameUtil.computeAccessibleNameFromContent = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + /** for acc name from content, the content from CSS pseudo-elements + * :before and :after pseudo elements [CSS2] can provide textual content for elements that have a content model. + * For :before or :after pseudo elements, user agents must prepend CSS textual content, without a space, + * to the textual content of the current node. + */ + var pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "before"); + if (pair !== null && pair.name && pair.name.trim().length > 0) + return pair; + pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "after"); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + // shadow host + if (elem.shadowRoot) { + pair = AccNameUtil.computeAccessibleNameForShadowHost(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "shadow" }; + ; + } + // slot element + if (nodeName === "slot") { + pair = AccNameUtil.computeAccessibleNameForSlotElement(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "slot" }; + } + // otherwise: get the value from the element + pair = AccNameUtil.computeAccessibleNameFromChildren(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "content" }; + // no accessible name exists + return null; + }; + // calculate accessible name from CSS generated content + AccNameUtil.computeAccessibleNameForCSSPseudoElement = function (elem, type) { + var contentElem = elem.ownerDocument.defaultView.getComputedStyle(elem, type); + if (contentElem) { + var content = contentElem.content; + if (content && content !== "none" && content !== "no" && content !== "normal") { + content = content.replace(/^"/, "").replace(/"$/, ""); + if (content.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(content), "nameFrom": "css-" + type }; + } + } + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForShadowHost = function (elem) { + var text = ""; + var shadowRoot = elem.shadowRoot; + if (shadowRoot) { + var children = shadowRoot.querySelectorAll('*'); + // check text from all the children elements + children.forEach(function (child) { + var pair = AccNameUtil.computeAccessibleName(child); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + }); + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "shadow-host" }; + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForSlotElement = function (elem) { + //if no assignedNode, check its own text + var text = ""; + if (!elem.assignedNodes() || elem.assignedNodes().length === 0) { + var pair = AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + } + else { + // check text from all assigned nodes + for (var _i = 0, _a = elem.assignedNodes(); _i < _a.length; _i++) { + var slotChild = _a[_i]; + var pair = AccNameUtil.computeAccessibleName(slotChild); + if (pair && pair.name && pair.name.length > 0) + text += " " + pair.name.trim(); + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content-slot" }; + return null; + }; + // calculate accessible name from children content + AccNameUtil.computeAccessibleNameFromChildren = function (elem) { + var text = ""; + //let walkChild = elem.firstChild; + var nw = new DOMWalker_1.DOMWalker(elem); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + //while (walkChild) { + var walkChild = nw.node; + if (walkChild.nodeType === 3) { + // for the text node, get the parentnode to check visibility + var parent_1 = walkChild.parentElement; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(parent_1) && !VisUtil_1.VisUtil.isNodePresentational(parent_1) && walkChild.nodeValue && walkChild.nodeValue.trim().length > 0) { + text += " " + walkChild.nodeValue.trim(); + } + } + else if (walkChild.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(walkChild) && !VisUtil_1.VisUtil.isNodePresentational(walkChild)) { + var pair = AccNameUtil.computeAccessibleName(walkChild); + if (pair && pair.name && pair.name.length > 0) { + text += " " + pair.name.trim(); + nw.bEndTag = true; + } + // Skip children if this element only has presentational children + else if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(nw.node)) { + nw.bEndTag = true; + } + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content" }; + return null; + }; + // if accessible name can be ignored for image or svg + AccNameUtil.isAccessibleNameIgnorable = function (elem) { + if (!elem) + return false; + var nodeName = elem.nodeName.toLowerCase(); + if (nodeName !== 'img' && nodeName !== 'svg') + return false; + var parent = elem.parentElement; + if (parent) { + // if the parent is a widget and has an aria label, then image/svg label is not necessary + if ((AriaUtil_1.AriaUtil.isWidget(parent) || AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(parent)) && AriaUtil_1.AriaUtil.hasAriaLabel(parent)) + return true; + } + return false; + }; + return AccNameUtil; +}()); +exports.AccNameUtil = AccNameUtil; + + +/***/ }, + +/***/ "./src/v4/util/AriaUtil.ts" +/*!*********************************!*\ + !*** ./src/v4/util/AriaUtil.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AriaUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ./AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AriaUtil = /** @class */ (function () { + function AriaUtil() { + } + AriaUtil.isDefinedAriaAttributeAtIndex = function (ele, index) { + var attrName = ele.attributes[index].name; + return AriaUtil.isDefinedAriaAttribute(ele, attrName); + }; + /** + * this method returns user-defined aria attribute name from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributes = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push(attrName); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributes = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push(attrName); + } + } + return htmlAttributes; + }; + /** + * this method returns user-defined aria attribute name-value pair from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributeNameValuePairs = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push({ name: attrName, value: attrValue }); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name-value pair from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributeNameValuePairs = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push({ name: attrName, value: attrValue }); + } + } + return htmlAttributes; + }; + /** + * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true" + */ + AriaUtil.getAriaAttribute = function (ele, attributeName) { + // If the attribute is defined, it takes precedence + var retVal = ele.getAttribute(attributeName); + if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check + return retVal; + } + // Then determine implicit values from other attributes + if (!retVal) { + var tag = ele.nodeName.toLowerCase(); + if (attributeName in AriaUtil.ariaAttributeImplicitMappings) { + if (tag in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName][tag]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + else if ("*" in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName]["*"]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + } + // Check role-based defaults + if (!retVal) { + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele); + if (role in AriaUtil.ariaAttributeRoleDefaults && attributeName in AriaUtil.ariaAttributeRoleDefaults[role]) { + retVal = AriaUtil.ariaAttributeRoleDefaults[role][attributeName]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + // Still not defined? Check global defaults + if (!retVal && attributeName in AriaUtil.ariaAttributeGlobalDefaults) { + retVal = AriaUtil.ariaAttributeGlobalDefaults[attributeName]; + } + return retVal; + }; + AriaUtil.isDefinedAriaAttribute = function (ele, attrName) { + var isDefinedAriaAttribute = false; + if (attrName.substring(0, 5) === 'aria-') { + // User agents SHOULD treat state and property attributes with a value of "" the same as they treat an absent attribute. + isDefinedAriaAttribute = ele.hasAttribute && ele.hasAttribute(attrName) && ele.getAttribute(attrName).length > 0; + } + return isDefinedAriaAttribute; + }; + /** + * WAI-ARIA’s role attribute may have a list of values, but only the first valid and supported WAI-ARIA role is used + * https://www.w3.org/TR/wai-aria-implementation/#mapping_role_table + * This function is responsible for retrieving the resoled role for an element. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return string - resolved role for the element: + * explicit role: resoled from the list of values + * implicit role: if not explicitely specified, or none of the specified role values is allowed for the element + * null: if none of the specified role values is allowed for the element, neither implicit role exists + * + * @memberOf AriaUtil + */ + AriaUtil.getResolvedRole = function (elem, considerImplicitRoles) { + if (considerImplicitRoles === void 0) { considerImplicitRoles = true; } + if (!elem) + return null; + var role = CacheUtil_1.CacheUtil.getCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", null); + if (role === null) { + var roles = AriaUtil.getUserDefinedRoles(elem); + var tagProperty = AriaUtil.getElementAriaProperty(elem); + var allowedRoles = AriaUtil.getAllowedAriaRoles(elem, tagProperty); + var containsGeneric = false; + if (roles && roles.length > 0 && allowedRoles && allowedRoles.length > 0) { + for (var i = 0; i < roles.length; i++) { + if (allowedRoles.includes("any") || allowedRoles.includes(roles[i])) { + if (allowedRoles.includes("any") && roles[i] === 'generic') { + containsGeneric = true; + continue; + } + role = roles[i]; + if (role === "presentation" || role === "none") { + // If element is focusable, then presentation roles are to be ignored + if (CommonUtil_1.CommonUtil.isFocusable(elem)) { + //reset rule to null + role = null; + continue; + } + } + break; + } + } + if (containsGeneric) + role = 'generic'; + } + if (role === null && considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(elem); + role = implicitRole && implicitRole.length > 0 ? implicitRole[0] : undefined; + } + CacheUtil_1.CacheUtil.setCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", role); + } + return role !== undefined ? role : null; + }; + /** + * This function is responsible for retrieving user defined element's roles from dom. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} roles - list of user defined roles in the element role attribute. + * + * @memberOf AriaUtil + */ + AriaUtil.getUserDefinedRoles = function (ele) { + return AriaUtil.getRoles(ele, false); + }; + /** + * This function is responsible for retrieving element's roles. + * This function also finds implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} roles - list of attribute roles and implicit roles. + * + * @memberOf AriaUtil + */ + AriaUtil.getRoles = function (ele, considerImplicitRoles) { + var roles = []; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + var attrRoles = CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("role").trim()).split(" "); + for (var i = 0; i < attrRoles.length; ++i) { + roles.push(attrRoles[i]); + } + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + //add implicit roles to the attributes roles. + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, roles); + } + } + return roles; + }; + /** + * Returns the implicit role of the elemement + * @parm {HTMLElement} ele - element for which to find role. + * + * @return the implicit role or [] if doesn't exist + * + * @memberOf AriaUtil + */ + AriaUtil.getImplicitRole = function (ele) { + if (!ele || ele.nodeType !== 1) + return null; + var implicitRoles = CacheUtil_1.CacheUtil.getCache(ele, "AriaUtil_ImplicitRole", null); + if (!implicitRoles) { + var tagProperty = AriaUtil.getElementAriaProperty(ele); + // check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole) { + if (tagProperty.implicitRole.includes("generic")) { + // the 'generic' role is only allowed if a valid aria attribute exists. + var domAriaAttributes_1 = AriaUtil.getUserDefinedAriaAttributes(ele); + if (domAriaAttributes_1.length === 0) { + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + var roleAttributes = []; + var pattern = ARIADefinitions_1.ARIADefinitions.designPatterns['generic']; + if (pattern.reqProps && pattern.reqProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(pattern.reqProps, roleAttributes); + if (tagProperty.globalAriaAttributesValid) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(ARIADefinitions_1.ARIADefinitions.globalProperties, roleAttributes); + if (pattern.deprecatedProps && pattern.deprecatedProps.length > 0) + CommonUtil_1.CommonUtil.reduceArrayItemList(pattern.deprecatedProps, roleAttributes); + // remove 'generic' role if roleAttributes doesn't contain any of domAriaAttributes + if (roleAttributes.length > 0 && !roleAttributes.some(function (attr) { return domAriaAttributes_1.includes(attr); })) { + var implicit = CommonUtil_1.CommonUtil.reduceArrayItemList(['generic'], tagProperty.implicitRole); + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", implicit); + return implicit; + } + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", tagProperty.implicitRole); + return tagProperty.implicitRole; + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + return implicitRoles; + }; + /** + * Returns the required properties of the role + * @parm {string} role - the role + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} properties - list of properties that are required by the role + * + * @memberOf AriaUtil + */ + AriaUtil.getRoleRequiredProperties = function (role, ele) { + if (role === null) { + return null; + } + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + var requiredAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqProps; + // handle special case of separator + if (role.toLowerCase() === "separator" && ele && CommonUtil_1.CommonUtil.isFocusable(ele)) { + requiredAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []); + } + return requiredAttributes; + } + else { + return null; + } + }; + /** + * This function is responsible for finding if a element has given role. + * This function aslo finds if element has given roles as implicit role. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - true or false based on if th element has the specified role. + * + * @memberOf AriaUtil + * + * Consider to use hasRoleInSemantics() instead. + */ + AriaUtil.hasRole = function (ele, role, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] === role; + } + } + } + //if none of the the attribute roles matched with given role + //check if implicit roles matches. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + var wRoles = []; + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, wRoles); + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] === role; + } + } + } + } + return retVal; + }; + /** + * Checks if the element has the role, including the implied role if role is not explicitly specified. + * + * This function is replacing the hasRole function + * + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * + * @return {List} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasRoleInSemantics = function (ele, role) { + var retVal = false; + var roleSpecified = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] === role; + } + } + } + if (roleSpecified) { + return retVal; + } + //check if implicit roles matches. + //Note: element can have multiple implicit roles + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) { + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] === role; + } + } + } + return retVal; + }; + /** + * This function is responsible for finding if a element has given role. + * This function also checks if element has given roles as implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {bool} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasAnyRole = function (ele, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + retVal = true; + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) + retVal = true; + } + return retVal; + }; + AriaUtil.isPresentationalElement = function (node) { + // Elements extracted from https://developer.mozilla.org/en/docs/Web/HTML/Element#Inline_text_semantics, + // http://dev.w3.org/html5/html-author/#text-level-semantics and https://wiki.whatwg.org/wiki/Presentational_elements_and_attributes + var presentationalElements = ["abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn", + "em", "i", "kbd", "mark", "q", "rp", "rt", "rtc", "ruby", "s", + "samp", "small", "span", "strong", "sub", "sup", "time", "u", + "var", "wbr", "a", "progress", "meter", "basefont", "big", "center", + "strike", "tt", "font", "blink", "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "blockquote", "p" + ]; + return CommonUtil_1.CommonUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements); + }; + /** + * return the ancestor of the given element and role. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (considerImplicitRoles) { + if (AriaUtil.hasRoleInSemantics(walkNode, roleName)) { + break; + } + } + else { + if (AriaUtil.hasRole(walkNode, roleName, false)) { + break; + } + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + /** + * return the ancestor of the given element and roles. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roles - the role names to search for + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRoles = function (element, roleNames) { + if (!element || !roleNames || !roleNames.length || roleNames.length === 0) + return null; + var walkNode = element; + while (walkNode !== null) { + var role = AriaUtil.getResolvedRole(walkNode); + if (role !== null && + (roleNames.includes(role) || + (roleNames.includes("*") && !["presentation", "none"].includes(role)))) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getRolesWithTypes = function (element, types) { + if (!element || !types || !types.length || types.length === 0) + return null; + var roles = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "roles_with_given_types", null); + if (!roles || roles.length === 0) { + roles = []; + Object.entries(ARIADefinitions_1.ARIADefinitions.designPatterns).forEach(function (_a) { + var key = _a[0], value = _a[1]; + if (types.includes(value.roleType)) + roles.push(key); + }); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "roles_with_given_types", roles); + } + return roles; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.isWidget = function (element) { + if (!element) + return false; + var widget = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "is_element_widget", null); + if (widget === null) { + var ret = false; + var role = AriaUtil.getResolvedRole(element); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') + ret = true; + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "is_element_widget", ret); + return ret; + } + return widget; + }; + /** + * return if the element is owned or controlled by another element. + * If an ancestor of an element is owned or controlled by another element, then the element is also considered as owned or controlled. + * an element can be owned or controlled by another element through aria-owns or aria-controls + * when the DOM hierarchy cannot be used to represent the relationship. + * aria-owns attribute is used to define contextual relationship with a owning parent + * aria-controls attribute is used to associate an element with the controlling element. + * example elements with roles: combobox, scrollbar, tab, button, listbox, menu, menubar, radiogroup, tree, treegrid + * + * when an element is owned or controlled by another element, its navigation may be controlled by the parent + * through aria-activedescendants attribute or roving tabindex + * + * Note navigation with native combobox (input with a datalist) is in native focus navigation, not considered here + * + * @parm {element} element - The element to inspect + * @return {boolean} + * + * @memberOf AriaUtil + */ + AriaUtil.isNavigationOwnedOrControlled = function (element) { + if (!element) + return false; + var ownerElems = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", null); + if (ownerElems !== null && ownerElems.length > 0) { + if (CommonUtil_1.CommonUtil.getAncestor(element, ownerElems)) + return true; + } + var role = AriaUtil.getResolvedRole(element); + if (!role) + return false; + var id = element.getAttribute("id"); + if (!id || id.trim().length === 0) + return false; + var elem = element.ownerDocument.querySelector("*[aria-controls~='".concat(id, "'], *[aria-owns~='").concat(id, "']")); + if (!elem) + return false; + var containers = ['combobox', 'scrollbar', 'button', 'tab', 'listbox', 'menu', 'menubar', 'radiogroup', 'tree', 'treegrid']; + if (containers.includes(role)) { + if (ownerElems === null) + ownerElems = []; + ownerElems.push(element); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", ownerElems); + return true; + } + return false; + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function by default will not consider Check Hidden Setting at all. + * + * Note: This is a wrapper function to: AriaUtil.getSiblingWithRoleHidden + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRole = function (element, role) { + return AriaUtil.getSiblingWithRoleHidden(element, role, false); + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function also considers implicit roles for the elements. + * + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicit - true or false based on if Implicit roles should be considered. + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRoleHidden = function (element, role, considerHiddenSetting, considerImplicitRole) { + // Variable Declaration + var walkNode = null; + var hasRole = false; + // Only perform the check if element and role are both provided + if (element && role) { + // Fetch the next sibling element + walkNode = element.nextSibling; + // Keep looping over the next siblings to find element which matches + // the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.nextSibling; + continue; + } + // Check if this node has the role that we need to check exists + if (considerImplicitRole) { + hasRole = AriaUtil.hasRoleInSemantics(walkNode, role); + } + else { + hasRole = AriaUtil.hasRole(walkNode, role, false); + } + // Move on to the next node + walkNode = walkNode.nextSibling; + } + // If we still have not found a node that matches the role, start a reverse look up + if (!walkNode) { + // Fetch the previous Sibling of this element + walkNode = element.previousSibling; + // Keep looping over all the previous siblings to search for an element which + // matches the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.previousSibling; + continue; + } + // Check if this node has the role that we need to check exists + hasRole = AriaUtil.hasRole(walkNode, role, considerImplicitRole); + // Move on to the next node + walkNode = walkNode.previousSibling; + } + } + } + return walkNode; + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getDescendantWithRoleHidden + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRole = function (element, roleName) { + return AriaUtil.getDescendantWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendant = null; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (considerImplicitRoles ? AriaUtil.hasRoleInSemantics(nw.node, roleName) : AriaUtil.hasRole(nw.node, roleName, false)) { + descendant = nw.node; + break; + } + } + return descendant; + }; + /** + * This function is responsible for getting All descendant elements with the specified roles, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string[]} roleNames - The roles to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - all descendant elements that match the roles specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoles = function (element, roleNames, considerHiddenSetting, considerImplicitRoles) { + if (!roleNames || roleNames.length === 0) + return; + // Variable Decleration + var descendants = []; + roleNames.forEach(function (roleName) { + var kids = AriaUtil.getAllDescendantsWithRoleHidden(element, roleName, considerHiddenSetting, considerImplicitRoles); + if (kids && kids.length > 0) + descendants = descendants.concat(kids); + }); + return descendants; + }; + /** + * This function is responsible for getting All descendant elements with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - The descendant elements that match the role specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendants = []; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + if (nw.bEndTag) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (AriaUtil.hasRole(nw.node, roleName, considerImplicitRoles)) { + descendants.push(nw.node); + } + } + return descendants; + }; + /** + * This function is responsible for getting All direct children in AT tree with a role (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree that has a role + * + * @memberOf AriaUtil + */ + AriaUtil.getDirectATChildren = function (element) { + var requiredChildRoles = AriaUtil.getRequiredChildRoles(element, true); + var direct = []; + AriaUtil.retrieveDirectATChildren(element, requiredChildRoles, direct); + return direct; + }; + /** + * This function is responsible for recursively any child path till either no child or a child with a role is found (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree + * + * @memberOf AriaUtil + */ + AriaUtil.retrieveDirectATChildren = function (element, requiredChildRoles, direct) { + var children = []; + if (element.children !== null && element.children.length > 0) { + for (var i = 0; i < element.children.length; i++) { + children.push(element.children[i]); + } + } + // if the element contains "aria-own" attribute, then the aria-owned children need to be included too + var owned = element.getAttribute("aria-owns"); + if (owned) { + var doc = element.ownerDocument; + if (doc) { + var ownedIds = owned.split(" "); + for (var i = 0; i < ownedIds.length; i++) { + var ownedElem = doc.getElementById(ownedIds[i]); + if (ownedElem) { + children.push(ownedElem); + } + } + } + } + if (children.length > 0) { + for (var i = 0; i < children.length; i++) { + //ignore hidden and invisible child + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(children[i]) || !VisUtil_1.VisUtil.isNodeVisible(children[i])) + continue; + var roles = AriaUtil.getRoles(children[i], false); + if (roles === null || roles.length === 0) { + roles = AriaUtil.getImplicitRole(children[i]); + } + if (roles && roles !== null && roles.length > 0) { + //remove 'none' and 'presentation' + roles = roles.filter(function (role) { + return role !== "none" && role !== "presentation"; + }); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (roles.includes("group") && requiredChildRoles && requiredChildRoles.includes('group')) { + roles = roles.filter(function (role) { + return role !== 'group'; + }); + } + } + if (roles && roles !== null && roles.length > 0) { + direct.push(children[i]); + } + else { + // recursive until get a return value, + AriaUtil.retrieveDirectATChildren(children[i], requiredChildRoles, direct); + } + } + return null; + } + else + return null; + }; + /** + * this function returns null or required child roles for a given element with one more roles, + * return null if the role is 'none' or 'presentation' + * @param element + * @param includeImplicit include implicit roles if no role is explicitly provided + * @returns + */ + AriaUtil.getRequiredChildRoles = function (element, includeImplicit) { + var roles = AriaUtil.getRoles(element, false); + // if explicit role doesn't exist, get the implicit one + if ((!roles || roles.length === 0) && includeImplicit) { + roles = AriaUtil.getImplicitRole(element); + } + /** + * ignore if the element doesn't have any explicit or implicit role + */ + if (!roles || roles.length === 0) { + return null; + } + /** + * ignore if the element contains none or presentation role + */ + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var requiredChildRoles = new Array(); + for (var j = 0; j < roles.length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].reqChildren !== null) { + requiredChildRoles = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(designPatterns[roles[j]].reqChildren, requiredChildRoles); + } + } + return requiredChildRoles; + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getAriaOwnsWithRoleHidden + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRole = function (element, roleName) { + return AriaUtil.getAriaOwnsWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. This function aslo finds elements with implicit roles. + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var referencedElement = null; + var referencedElemHasRole = false; + // In the case aria-owns is not on the element just break out of this function with null + if (CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-owns")) { + // Get the reference ID + var referenceID = element.getAttribute("aria-owns"); + // Get the element for the reference ID + referencedElement = fragment_1.FragmentUtil.getById(element, referenceID); + //ignore if the aria-owns point to the element itself + if (DOMUtil_1.DOMUtil.sameNode(element, referencedElement)) + return null; + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if (considerHiddenSetting && referencedElement != null && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(referencedElement)) { + referencedElemHasRole = null; + } + else { + referencedElemHasRole = AriaUtil.hasRole(referencedElement, roleName, considerImplicitRoles); + } + } + return referencedElemHasRole ? referencedElement : null; + }; + // Return true if the element has an ARIA label + AriaUtil.hasAriaLabel = function (element) { + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + return CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-label") || CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-labelledby"); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelID = elements[i].getAttribute("aria-labelledby"); + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = ""; + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + label = AriaUtil.getTextContentExcludingScripts(labelNode); + } + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + } + else { + // Has no label at all + hasDuplicateLabels = true; + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return !hasDuplicateLabels; + }; + /** + * Get text content from an element, excluding script and style elements + * This is a simplified version that doesn't go through full accessible name computation + * to avoid circular dependencies when called from getAriaLabel + * + * Note: When an element is referenced by aria-labelledby, its content is included + * even if the element is hidden (per ARIA spec) + */ + AriaUtil.getTextContentExcludingScripts = function (elem) { + if (!elem) + return ""; + var text = ""; + var nw = new DOMWalker_1.DOMWalker(elem); + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + var node = nw.node; + var nodeName = node.nodeName ? node.nodeName.toLowerCase() : ""; + // Skip script and style elements + if (nodeName === 'script' || nodeName === 'style') { + nw.bEndTag = true; // Skip children + continue; + } + if (node.nodeType === 3) { // Text node + // Include text even from hidden elements when referenced by aria-labelledby + if (node.nodeValue && node.nodeValue.trim().length > 0) { + text += " " + node.nodeValue.trim(); + } + } + else if (node.nodeType === 1) { // Element node + // Handle images - get alt text + if (nodeName === 'img' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children of img + } + // Handle input with type="image" - get alt text + else if (nodeName === 'input' && node.getAttribute('type') === 'image' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children + } + } + } + return text.trim(); + }; + AriaUtil.getAriaLabel = function (ele) { + if (ele.hasAttribute) { + if (ele.hasAttribute("aria-labelledby")) { + var labelIDs = ele.getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_1 = labelIDs.length; j < length_1; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + // Use our helper to get text content without circular dependency + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label); + } + } + return normalizedLabel.trim(); + } + else if (ele.hasAttribute("aria-label")) { + return CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("aria-label")).trim(); + } + } + return ""; + }; + AriaUtil.getAriaDescription = function (ele) { + if (!ele) + return ""; + var normalizedLabel = ""; + var desc = ele.getAttribute("aria-labelledby"); + if (desc && desc.trim().length > 0) { + var labelIDs = desc.trim().split(" "); + for (var j = 0, length_2 = labelIDs.length; j < length_2; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + if (label && label.trim().length > 0) + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + if (normalizedLabel.trim().length > 0) + return normalizedLabel.trim(); + } + desc = ele.getAttribute("aria-description"); + if (desc && desc.trim().length > 0) + return desc.trim().toLowerCase(); + return ""; + }; + AriaUtil.findAriaLabelDupes = function (elements) { + var dupeMap = {}; + elements.forEach(function (ele) { + dupeMap[AriaUtil.getAriaLabel(ele)] = (dupeMap[AriaUtil.getAriaLabel(ele)] || 0) + 1; + }); + return dupeMap; + }; + /** + * return accessible names for all AT visible landmark elements + * @param doc + * @returns + */ + AriaUtil.getLandmarkAccNames = function (doc) { + var nameMap = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_Landmark_AccNames", null); + if (nameMap && nameMap.length !== 0) + return nameMap; + nameMap = []; + var landmarkElems = doc.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]'); + if (landmarkElems.length === 0) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + } + landmarkElems.forEach(function (elem) { + // ignore node that is AT hidden or in a dialog that is considered as a separate location from the rest of the main page + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) && CommonUtil_1.CommonUtil.getAncestor(elem, ["DIALOG"]) === null && AriaUtil.getAncestorWithRole(elem, "dialog", true) === null) { + var name_1 = ""; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + name_1 = pair.name.trim(); + // check neested landmark to calculate the accessible name + var ancestors = __spreadArray([], landmarkElems, true).filter(function (e) { return e.contains(elem) && e !== elem; }); + if (ancestors.length > 1) { + ancestors.forEach(function (ancestor) { + var ancestor_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ancestor); + if (ancestor_pair && ancestor_pair.name && ancestor_pair.name.trim().length > 0) + name_1 = ancestor_pair.name.trim() + " " + name_1; + }); + } + var role = AriaUtil.getResolvedRole(elem); + nameMap.push({ "elem": elem, "role": role, "name": name_1 }); + } + }); + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + }; + /** + * check if the given element with the landmark rolw is unique + * @param element + * @param role: a specific landmark role, or "any" for all landmark role + * @param considerNoneLabel: if consider the landmarks without a label + * @returns + */ + AriaUtil.isLandmarkNameUnique = function (element, role, considerNoneLabel) { + if (considerNoneLabel === void 0) { considerNoneLabel = false; } + var nameMap = AriaUtil.getLandmarkAccNames(element.ownerDocument); + var exist = null; + if (role === 'any') + exist = nameMap.find(function (entry) { return entry.elem === element; }); + else + exist = nameMap.find(function (entry) { return entry.elem === element && entry.role === role; }); + if (!exist) + return null; + var name = exist.name; + if (!considerNoneLabel && name === '') + return null; + for (var i = 0; i < nameMap.length; i++) { + if (nameMap[i].elem === element) + continue; + if (name === nameMap[i].name) { + if (role === 'any') + return true; + else if (nameMap[i].role === role) + return true; + } + } + return false; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasUniqueAriaLabels = function (elements) { + return AriaUtil.hasUniqueAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasDuplicateAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + var duplicateLabelNameArray = new Array(); + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + if (!(ariaLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[ariaLabel] = new Array(); + } + duplicateLabelNameArray[ariaLabel].push(elements[i].nodeName.toLowerCase()); + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelIDs = elements[i].getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_3 = labelIDs.length; j < length_3; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + if (!(normalizedLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[normalizedLabel] = new Array(); + } + duplicateLabelNameArray[normalizedLabel].push(elements[i].nodeName.toLowerCase()); + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return duplicateLabelNameArray; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasDuplicateAriaLabels = function (elements) { + return AriaUtil.hasDuplicateAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique aria-labelledby attributes + AriaUtil.hasUniqueAriaLabelledby = function (elements) { + var hasDuplicateLabels = false; + var labelRefs = {}; + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute && elements[i].hasAttribute("aria-labelledby") && !CommonUtil_1.CommonUtil.isIdReferToSelf(elements[i], elements[i].getAttribute("aria-labelledby"))) { + var labelRef = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby")); + hasDuplicateLabels = labelRef in labelRefs; + labelRefs[labelRef] = true; + } + else { + hasDuplicateLabels = true; + } + } + return !hasDuplicateLabels; + }; + /** + * this function is responsible for resolving ARIA requirements for an HTML element per ARIA in HTML + * @param ruleContext the HTML element to be examined + * @returns + */ + AriaUtil.getElementAriaProperty = function (ruleContext) { + var tagProperty = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_ElementAriaProperty", null); + if (!tagProperty) { + var tagName = null; + var name_2 = null; + if (ruleContext.tagName) { + tagName = ruleContext.tagName.toLowerCase(); + } + else if (ruleContext.nodeName) { + tagName = ruleContext.nodeName.toLowerCase(); + } + // check if the tagProperty exists in the documentConformanceRequirement hash. + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirement[tagName]; + // The tag needs to check some special attributes + if (tagProperty === null || tagProperty === undefined) { + var specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags[tagName]; + switch (tagName) { // special cases + case "a": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "area": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "figure": { + var fcs = CommonUtil_1.CommonUtil.getChildByTag(ruleContext, "figcaption"); + fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"]; + break; + } + case "footer": + case "header": + if (AriaUtil.getAncestorWithRole(ruleContext, "article", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "complementary", true) !== null + || AriaUtil.getAncestorWithRole(ruleContext, "navigation", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "region", true) !== null + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["article", "aside", "main", "nav", "section"]) !== null) + tagProperty = specialTagProperties["des-section-article-aside-main-nav"]; + else + tagProperty = specialTagProperties["other"]; + break; + case "img": + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (AriaUtil.getAriaLabel(ruleContext).trim().length !== 0 || (alt !== null && alt.length > 0) || (title !== null && title.length > 0)) { + // If the img has non-empty alt (alt="some text" or alt=" ") or an accessible name is provided + tagProperty = specialTagProperties["img-with-accname"]; + } + else { + if (alt !== null) { + // If the img has an empty alt (alt="") + tagProperty = specialTagProperties["img-without-accname-empty-alt"]; + } + else { + // If the img lacks an alt attribute + tagProperty = specialTagProperties["img-without-accname-no-alt"]; + } + } + break; + case "input": + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "type")) { + var type = ruleContext.getAttribute("type").trim().toLowerCase(); + tagProperty = specialTagProperties[type]; + if (tagProperty === null || tagProperty === undefined) { + switch (type) { + case "checkbox": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"]; + break; + case "email": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"]; + break; + case "search": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"]; + break; + case "tel": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"]; + break; + case "text": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + break; + case "url": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"]; + break; + default: + // default + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["default-with-list"] : tagProperty = specialTagProperties["default-no-list"]; + break; + } + } + } + else { + // default type is the same as type=text + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + } + break; + case "li": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["li"]; + if (ruleContext.parentElement && AriaUtil.hasRoleInSemantics(ruleContext.parentElement, "list")) + tagProperty = specialTagProperties["child-of-list-role"]; + else + tagProperty = specialTagProperties["no-child-of-list-role"]; + break; + case "section": + //name = ARIAMapper.computeName(ruleContext); + //if (name && name.trim().length > 0) { + var label = AriaUtil.getAriaLabel(ruleContext); + if ((label && label.trim().length > 0) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + tagProperty = specialTagProperties["with-name"]; + } + else { + tagProperty = specialTagProperties["without-name"]; + } + break; + case "select": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"]; + if (ruleContext.hasAttribute("multiple") || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "size") && ruleContext.getAttribute("size") > 1) + tagProperty = specialTagProperties["multiple-attr-size-gt1"]; + else + tagProperty = specialTagProperties["no-multiple-attr-size-gt1"]; + break; + case "summary": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["summary"]; + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], ruleContext.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], ruleContext)) + tagProperty = specialTagProperties["first-summary-of-detail"]; + else + tagProperty = specialTagProperties["no-first-summary-of-detail"]; + break; + case "tbody": + case "td": + case "tr": + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + tagProperty = specialTagProperties["des-table"]; + } + else { + AriaUtil.getAncestorWithRole(ruleContext, "grid", true) || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"]; + } + break; + case "th": + var scope = CommonUtil_1.CommonUtil.getScopeForTh(ruleContext); + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-table-column-scope"]; + else + tagProperty = specialTagProperties["des-table-row-scope"]; + } + else if (AriaUtil.getAncestorWithRole(ruleContext, "grid", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-grid-treegrid-column-scope"]; + else + tagProperty = specialTagProperties["des-grid-treegrid-row-scope"]; + } + else + tagProperty = specialTagProperties["des-other"]; + break; + case "div": + var prt = ruleContext.parentElement; + prt !== null && prt.nodeName.toLowerCase() === 'dl' ? tagProperty = specialTagProperties["child-dl"] : tagProperty = specialTagProperties["no-child-dl"]; + break; + default: + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["default"]; + } //switch + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_ElementAriaProperty", tagProperty); + return tagProperty || null; + }; + AriaUtil.getAllowedAriaRoles = function (ruleContext, properties) { + var allowedRoles = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaRoles", null); + if (!allowedRoles) { + allowedRoles = []; + var tagProperty = null; + if (properties !== null && properties !== undefined) { + tagProperty = properties; + } + else { + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + } + if (tagProperty !== null && tagProperty !== undefined) { + if (tagProperty.implicitRole !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles); + } + if (tagProperty.validRoles !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + var implicitRoles = AriaUtil.getImplicitRole(ruleContext); + if (implicitRoles && implicitRoles.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaRoles", allowedRoles); + } + return allowedRoles; + }; + AriaUtil.getAllowedAriaAttributes = function (ruleContext, roles, properties) { + var allowedAttributes = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaAttributes", null); + if (!allowedAttributes) { + allowedAttributes = []; + var permittedRoles = __spreadArray([], roles, true); + var tagName = ruleContext.tagName.toLowerCase(); + var prohibitedAttributes = []; + // Element with a disabled attribute https://www.w3.org/TR/html5/disabled-elements.html + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(tagName) > -1) { + // Use the aria-disabled attribute on any element that is allowed the disabled attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-disabled", allowedAttributes); + } + // Element with a required attribute http://www.the-art-of-web.com/html/html5-form-validation/ + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedRequired.indexOf(tagName) > -1) { + // Use the aria-required attribute on any element that is allowed the required attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-required", allowedAttributes); + } + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedReadOnly.indexOf(tagName) > -1) { + // Use the aria-readonly attribute on any element that is allowed the readonly attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes); + } + var tagProperty = null; + if (properties != null && properties !== undefined) + tagProperty = properties; + else + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + if (tagProperty !== null && tagProperty !== undefined) { + // add the implicit role allowed attributes to the allowed role list if there is no specified role + // ignore if the element doesn't allow the attributes from the implicit roles + if (tagProperty.implicitRole !== null && + (permittedRoles === null || permittedRoles === undefined || permittedRoles.length === 0) + && tagProperty.allowAttributesFromImplicitRole === undefined) { + for (var i = 0; i < tagProperty.implicitRole.length; i++) { + var roleProperty = ARIADefinitions_1.ARIADefinitions.designPatterns[tagProperty.implicitRole[i]]; + if (roleProperty !== null && roleProperty !== undefined) { + var properties_1 = roleProperty.props; + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + properties_1 = AriaUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + var prohibitedProps = roleProperty.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case of separator + if (tagProperty.implicitRole[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuenow", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + } + // Adding the global properties to the valid attribute list + if (tagProperty.globalAriaAttributesValid) { + var properties_2 = ARIADefinitions_1.ARIADefinitions.globalProperties; // global properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_2, allowedAttributes); + } + } + // adding the other role to the allowed roles for the attributes + if (tagProperty && tagProperty.otherRolesForAttributes && tagProperty.otherRolesForAttributes.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.otherRolesForAttributes, permittedRoles); + // adding the specified role properties to the allowed attribute list + for (var i = 0; permittedRoles !== null && i < permittedRoles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[permittedRoles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + // ignore the properties if the element doesn't allow attributes from the implicit role + if (!tagProperty || tagProperty.implicitRole === null || !tagProperty.implicitRole.includes(permittedRoles[i]) || (tagProperty.implicitRole.includes(permittedRoles[i]) && tagProperty.allowAttributesFromImplicitRole === undefined)) { + var properties_3 = roleProperties.props; // allowed properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + properties_3 = AriaUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + } + var prohibitedProps = roleProperties.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case for separator + if (permittedRoles[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + // ignore aria-level, aria-setsize or aria-posinset if "row" is not in treegrid + if (permittedRoles.includes("row") && AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) == null) { + var index = -1; + if ((index = allowedAttributes.indexOf("aria-level")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-setsize")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-posinset")) > -1) + allowedAttributes.splice(index, 1); + } + // add the other allowed attributes for the element + if (tagProperty && tagProperty.otherAllowedAriaAttributes && tagProperty.otherAllowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var allowed = []; + for (var p = 0; p < tagProperty.otherAllowedAriaAttributes.length; p++) { + var attr = tagProperty.otherAllowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + allowed.push(pair[0]); + } + else + allowed.push(attr); + } + if (allowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(allowed, allowedAttributes); + } + // add the other prohibitted attributes for the element + if (tagProperty && tagProperty.otherDisallowedAriaAttributes && tagProperty.otherDisallowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var disallowed = []; + for (var p = 0; p < tagProperty.otherDisallowedAriaAttributes.length; p++) { + var attr = tagProperty.otherDisallowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + disallowed.push(pair[0]); + } + else + disallowed.push(attr); + } + if (disallowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(disallowed, prohibitedAttributes); + } + //exclude the prohibitedAttributes from the allowedAttributes + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(prohibitedAttributes, allowedAttributes); + //exclude aria attribute for elements without implicit role and with 'Naming Prohibited' + if ((!roles || roles.length === 0) && tagProperty.implicitRole === null && tagProperty.prohibitedAriaAttributesWhenNoImplicitRole) + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(tagProperty.prohibitedAriaAttributesWhenNoImplicitRole, allowedAttributes); + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaAttributes", allowedAttributes); + } + return allowedAttributes; + }; + /** + * + * @param ariaAttr + * @param htmlAttrs + * @type: conflict or overlapping + * @returns htmlAttrName, 'Pass' or null + * htmlAttrName that conflicts with the ariaAttr, + * 'Pass' with no conflict with the ariaAttr, + * or null where ariaAttr won't cause conflict + */ + AriaUtil.getConflictOrOverlappingHtmlAttribute = function (ariaAttr, htmlAttrs, type) { + var exist = ARIADefinitions_1.ARIADefinitions.relatedAriaHtmlAttributes[ariaAttr['name']]; + if (exist) { + if (!ariaAttr || ariaAttr.length == 0 || !htmlAttrs || htmlAttrs.length == 0) + return []; + var examinedHtmlAtrNames = []; + var concernTypes = null; + if (type === 'conflict') { + if (!exist.conflict || Object.keys(exist.conflict).length === 0) + return null; + concernTypes = exist.conflict; + } + else if (type === 'overlapping') { + if (!exist.overlapping || Object.keys(exist.overlapping).length === 0) + return null; + concernTypes = exist.overlapping; + } + else + return null; + var applicable = false; + var fail_1 = false; + for (var k = 0; k < concernTypes.length; k++) { + var concernAriaValue = concernTypes[k].ariaAttributeValue; + var concernHtmlNames = concernTypes[k].htmlAttributeNames; + var concernHtmlValues = concernTypes[k].htmlAttributeValues; + for (var i = 0; i < htmlAttrs.length; i++) { + var index = concernHtmlNames.indexOf(htmlAttrs[i]['name']); + if (index !== -1) { + applicable = true; + var htmlValuesInConcern = (concernHtmlValues === null || concernHtmlValues[index] === null) ? null : concernHtmlValues[index].split(","); + if (concernAriaValue === null) { + if (htmlValuesInConcern === null) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (htmlValuesInConcern === null) { + if (concernAriaValue === ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (concernAriaValue === 'VALUE' && htmlValuesInConcern.includes('VALUE') && htmlValuesInConcern[0] !== ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (concernAriaValue === ariaAttr['value'] && htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + } + } + if (applicable && !fail_1) + examinedHtmlAtrNames.push({ result: 'Pass', 'attr': '' }); + return examinedHtmlAtrNames; + } + else + return null; + }; + AriaUtil.containsPresentationalChildrenOnly = function (elem) { + var roles = AriaUtil.getRoles(elem, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil.getImplicitRole(elem); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return false; + for (var i = 0; roles !== null && i < roles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + var presentional = roleProperties.presentationalChildren; + if (presentional === true) + return true; + } + } + return false; + }; + AriaUtil.shouldBePresentationalChild = function (element) { + var walkNode = DOMWalker_1.DOMWalker.parentElement(element); + while (walkNode) { + if (AriaUtil.containsPresentationalChildrenOnly(walkNode)) + return true; + //aria-own case: if the element is referred by an aria-won + walkNode = ARIAMapper_1.ARIAMapper.getAriaOwnedBy(walkNode) || DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA +*/ + AriaUtil.areRolesDefined = function (roles) { + if (!roles || roles.length === 0) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) { + var role = roles_1[_i]; + if (!(role.toLowerCase() in designPatterns)) + return false; + } + return true; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA + */ + AriaUtil.getInvalidRoles = function (ruleContext) { + var domRoles = AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles && domRoles.includes('generic')) + return ["generic"]; + // Failing roles + var failRoleTokens = []; + // Passing roles + var passRoleTokens = []; + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + var allowedRoles = AriaUtil.getAllowedAriaRoles(ruleContext, tagProperty); + if (!allowedRoles || allowedRoles.length === 0) + return domRoles; + var invalidRoles = []; + if (allowedRoles.includes('any')) + return []; + for (var i = 0; i < domRoles.length; i++) + if (!allowedRoles.includes(domRoles[i]) && !invalidRoles.includes(domRoles[i])) + invalidRoles.push(domRoles[i]); + return invalidRoles; + }; + /* + * check if any explicit role specified for the element is not defined in ARIA + * return: list of specified roles not defined in ARIA + */ + AriaUtil.getRolesUndefinedByAria = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var undefinedRoles = []; + if (roles && roles.length > 0) { + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var i = 0; i < roles.length; i++) { + if (!(roles[i] in designPatterns)) { + undefinedRoles.push(roles[i]); + } + } + } + return undefinedRoles; + }; + /* + * this method first checks explicit roles, if no explicit role, it will check the implicit role + * return: null if any explicit role is invalid, + * a list of invalid attributes + * empty list if all attributes are valid, or no aria attributes are specified + */ + AriaUtil.getInvalidAriaAttributes = function (ruleContext) { + var roles = AriaUtil.getUserDefinedRoles(ruleContext); + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + // for mutiple roles, skip if any role is invalid + var defined = AriaUtil.areRolesDefined(roles); + if (defined !== null && !defined) + return null; + var attrs = []; + if (!roles || roles.length == 0) + roles = AriaUtil.getImplicitRole(ruleContext); + var aria_attrs = AriaUtil.getUserDefinedAriaAttributes(ruleContext); + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + // Attributes allowed on this node + var allowedAttributes = AriaUtil.getAllowedAriaAttributes(ruleContext, roles, tagProperty); + if (aria_attrs) { + for (var i = 0; i < aria_attrs.length; i++) { + var attrName = aria_attrs[i].trim().toLowerCase(); + if (!allowedAttributes.includes(attrName) && !attrs.includes(attrName)) + attrs.push(attrName); + } + } + return attrs; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + AriaUtil.getConflictAriaAndHtmlAttributes = function (elem) { + var ariaAttrs = AriaUtil.getUserDefinedAriaAttributeNameValuePairs(elem); + var htmlAttrs = AriaUtil.getUserDefinedHtmlAttributeNameValuePairs(elem); + var ret = []; + if (ariaAttrs && ariaAttrs.length > 0 && htmlAttrs && htmlAttrs.length > 0) { + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'conflict'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Failed') //failed + ret.push({ 'ariaAttr': ariaAttrs[i]['name'], 'htmlAttr': item['attr'] }); + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + } + return ret; + }; + /* + * get deprecated Aria roles + * return: a list of deprecated Aria roles + */ + AriaUtil.getDeprecatedAriaRoles = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var ret = []; + if (roles && roles.length > 0) { + var globalDeprecatedRoles = ARIADefinitions_1.ARIADefinitions.globalDeprecatedRoles; + for (var i = 0; i < roles.length; i++) { + if (globalDeprecatedRoles.includes(roles[i])) + ret.push(roles[i]); + } + } + return ret; + }; + /* + * get deprecated Aria role-attributes + * return: a list of deprecated Aria role-attributes paris + * for global the role is marked as 'any' + */ + AriaUtil.getDeprecatedAriaAttributes = function (element) { + if (!element) + return null; + var domAttributes = element.attributes; + var ariaAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push(attrName); + } + } + if (ariaAttrs.length === 0) + return []; + var ret = []; + var globalDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.globalDeprecatedProperties; + for (var i = 0; i < ariaAttrs.length; i++) { + if (globalDeprecatedAttributes.includes(ariaAttrs[i])) + ret.push({ "role": "any", "attribute": ariaAttrs[i] }); + } + var roles = AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) { + for (var i = 0; i < roles.length; i++) { + var roleWithDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleWithDeprecatedAttributes) { + var deprecatedAttriNames = roleWithDeprecatedAttributes['deprecatedProps']; + if (deprecatedAttriNames && deprecatedAttriNames.length > 0) { + for (var j = 0; j < ariaAttrs.length; j++) { + if (deprecatedAttriNames.includes(ariaAttrs[j])) + ret.push({ "role": roles[i], "attribute": ariaAttrs[j] }); + } + } + } + } + } + return ret; + }; + AriaUtil.isNodeInGrid = function (node) { + return AriaUtil.getAncestorWithRole(node, "grid") != null; + }; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + AriaUtil.navLinkKeywords = ['start', 'next', 'prev', 'previous', 'contents', 'index']; + // This list contains a list of rule ids for the rules that have to check for hidden content regardless of the Check Hidden + // Content Setting. This means that when the engine is actually determine which elements to mass to the rules, it will always + // pass theses rules no matter what the Check Hidden Content Setting is. + AriaUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId']; + // https://www.w3.org/TR/wai-aria-1.1/#introstates + AriaUtil.ariaAttributeRoleDefaults = { + "alert": { + "aria-live": "assertive", + "aria-atomic": "true" + }, + "combobox": { + "aria-haspopup": "listbox" + }, + "listbox": { + "aria-orientation": "vertical" + }, + "log": { + "aria-live": "polite" + }, + "menu": { + "aria-orientation": "vertical" + }, + "menubar": { + "aria-orientation": "horizontal" + }, + "meter": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "option": { + "aria-selected": "false" + }, + "progressbar": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "scrollbar": { + "aria-orientation": "vertical", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "separator": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "slider": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "spinbutton": { + // Not sure how to encode min/max (or now in 1.2 - "has no value") + //"aria-valuenow": "0" TODO: at risk: maybe delete after ARIA 1.2 reaches proposed rec + // Probably just delete spinbutton from this list completely and let user agents handle "defaults" + }, + "status": { + "aria-live": "polite", + "aria-atomic": "true" + }, + "tab": { + "aria-selected": "false" + }, + "tablist": { + "aria-orientation": "horizontal" + }, + "toolbar": { + "aria-orientation": "horizontal" + }, + "tree": { + "aria-orientation": "vertical" + } + }; + // https://www.w3.org/TR/wai-aria-1.1/#aria-atomic + AriaUtil.ariaAttributeGlobalDefaults = { + "aria-atomic": "false", + "aria-autocomplete": "none", + "aria-busy": "false", + "aria-checked": undefined, + "aria-current": "false", + "aria-disabled": "false", + "aria-dropeffect": "none", + "aria-expanded": undefined, + "aria-grabbed": undefined, + "aria-haspopup": "false", + "aria-hidden": undefined, + "aria-invalid": "false", + "aria-live": "off", + "aria-modal": "false", + "aria-multiline": "false", + "aria-multiselectable": "false", + "aria-orientation": undefined, + "aria-pressed": undefined, + "aria-readonly": "false", + //"aria-relevant": "additions text", TODO: are multiple values supported? + "aria-required": "false", + "aria-selected": undefined, + "aria-sort": "none" + }; + // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings + AriaUtil.ariaAttributeImplicitMappings = { + "aria-autocomplete": { + "form": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "input": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "select": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "textarea": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + } + }, + "aria-checked": { + "input": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "menuitem": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "*": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + }, + }, + "aria-disabled": { + "button": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "fieldset": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "input": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "optgroup": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "option": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "select": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "textarea": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + } + }, + "aria-expanded": { + "details": function (e) { + return e.getAttribute("open"); + }, + "dialog": function (e) { + return e.getAttribute("open"); + } + }, + "aria-multiselectable": { + "select": function (e) { + if (e.hasAttribute("multiple")) + return "true"; + return; + } + }, + "aria-placeholder": { + "input": function (e) { + return e.getAttribute("placeholder"); + }, + "textarea": function (e) { + return e.getAttribute("placeholder"); + } + }, + "aria-required": { + "input": function (e) { + return e.getAttribute("required"); + }, + "select": function (e) { + return e.getAttribute("required"); + }, + "textarea": function (e) { + return e.getAttribute("required"); + } + } + }; + return AriaUtil; +}()); +exports.AriaUtil = AriaUtil; + + +/***/ }, + +/***/ "./src/v4/util/CSSUtil.ts" +/*!********************************!*\ + !*** ./src/v4/util/CSSUtil.ts ***! + \********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CSSUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil = /** @class */ (function () { + function CSSUtil() { + } + CSSUtil.selectorMatchesElem = function (element, selector) { + // Early return for empty selector (before try-catch for performance) + if (!selector || selector.length === 0 || selector.trim() === "") + return false; + try { + // Modern standard method + if (typeof element.matches === "function") { + return element.matches(selector); + } + // Vendor-prefixed fallbacks (older browsers) + if (typeof element.webkitMatchesSelector === "function") { + return element.webkitMatchesSelector(selector); + } + if (typeof element.msMatchesSelector === "function") { + return element.msMatchesSelector(selector); + } + // Legacy method (deprecated but kept for compatibility) + if (typeof element.matchesSelector === "function") { + return element.matchesSelector(selector); + } + // Fallback: use querySelectorAll and check if element is in results + var doc = element.ownerDocument || element.document; + if (!doc) + return false; + var matches = doc.querySelectorAll(selector); + // Use Array.from for better performance with modern engines + return Array.from(matches).includes(element); + } + catch (err) { + // Bad selector? Doesn't match then... + return false; + } + }; + /** + * Returns the style computed for this element + * @param elem + */ + CSSUtil.getComputedStyle = function (elem, pseudoElt) { + if (!elem) + return null; + var doc = elem.ownerDocument; + var win = doc.defaultView; + return win.getComputedStyle(elem, pseudoElt); + }; + /** + * Parse and cache all stylesheet rules at the document level + * Returns an array of parsed rule objects with selector and style information + */ + CSSUtil.getParsedStylesheetRules = function (ownerDoc) { + // Check if we already have cached parsed rules for this document + var cachedRules = CacheUtil_1.CacheUtil.getCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", null); + if (cachedRules) { + return cachedRules; + } + var parsedRules = []; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < ownerDoc.styleSheets.length; ++ssIndex) { + var sheet = ownerDoc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var rule = sheet.cssRules[rIndex]; + var fullRuleSelector = rule.selectorText; + if (fullRuleSelector) { + var pseudoMatch = fullRuleSelector.match(/^(.*)(:[a-zA-Z-]*)$/); + var hasPseudoClass = !!pseudoMatch; + var selMain = hasPseudoClass ? pseudoMatch[1] : fullRuleSelector; + var selPseudo = hasPseudoClass ? pseudoMatch[2] : ""; + parsedRules.push({ + fullRuleSelector: fullRuleSelector, + hasPseudoClass: hasPseudoClass, + selMain: selMain, + selPseudo: selPseudo, + style: rule.style + }); + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the parsed rules at the document level + CacheUtil_1.CacheUtil.setCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", parsedRules); + return parsedRules; + }; + /** + * Private helper method to fill style maps from a CSSStyleDeclaration + * Handles CSS property priorities and the "all" shorthand property + */ + CSSUtil.fillStyle = function (maps, style) { + for (var sIndex = 0; sIndex < style.length; ++sIndex) { + if (style[sIndex] === "all" && style[style[sIndex]]) { + for (var _i = 0, maps_1 = maps; _i < maps_1.length; _i++) { + var map = maps_1[_i]; + for (var key in map) { + delete map[key]; + } + } + break; + } + else { + var key = style[sIndex]; + for (var _a = 0, maps_2 = maps; _a < maps_2.length; _a++) { + var map = maps_2[_a]; + var priority = style.getPropertyPriority(key); + if (key in map && map[key].endsWith("!important")) { + if (priority === "important" && + !map[key].startsWith("inherit") && + !map[key].startsWith("unset")) + map[key] = style[key] + " !important"; + else + continue; + } + else + map[key] = + style[key] + + (priority === "important" ? " !important" : ""); + } + } + } + }; + /** + * Private helper method that consolidates the logic for getting defined styles + * Used by both getDefinedStyles and getDefinedStylesMultiple + */ + CSSUtil.getDefinedStylesInternal = function (elem, props, pseudoClasses) { + var results = {}; + var definedStylesMap = {}; + var definedStylePseudoMap = {}; + // Initialize result objects for all pseudo-classes + for (var _i = 0, pseudoClasses_1 = pseudoClasses; _i < pseudoClasses_1.length; _i++) { + var pseudoClass = pseudoClasses_1[_i]; + definedStylesMap[pseudoClass] = {}; + definedStylePseudoMap[pseudoClass] = {}; + } + // Get pre-parsed stylesheet rules from cache + var parsedRules = CSSUtil.getParsedStylesheetRules(elem.ownerDocument); + // Check once if we need to handle :focus pseudo-class + var hasFocusPseudo = pseudoClasses.includes(":focus"); + var _loop_1 = function (parsedRule) { + if (props !== null && !props.some(function (prop) { return !!parsedRule.style[prop]; })) { + return "continue"; + } + var selPseudo = parsedRule.selPseudo; + var hasPseudoClass = parsedRule.hasPseudoClass; + // Handle :focus-within replacement once per rule if needed + var selMain = parsedRule.selMain; + if (hasFocusPseudo && selPseudo === ":focus") { + // If this element has focus, remove focus-within from parents + selMain = selMain.replace(/([ >][^+~ >]+):focus-within/g, "$1"); + } + // Cache selector matching result (only once per rule, not per pseudo-class) + var selectorMatches = CSSUtil.selectorMatchesElem(elem, selMain); + // Only process if selector matches + if (selectorMatches) { + // Process for each pseudo-class + for (var _c = 0, pseudoClasses_3 = pseudoClasses; _c < pseudoClasses_3.length; _c++) { + var pseudoClass = pseudoClasses_3[_c]; + // Cache map references to avoid repeated lookups + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Get styles of non-pseudo selectors + if (!hasPseudoClass) { + CSSUtil.fillStyle([styleMap, pseudoMap], parsedRule.style); + } + // Get styles for matching pseudo-class + if (selPseudo === pseudoClass) { + CSSUtil.fillStyle([pseudoMap], parsedRule.style); + } + } + } + }; + // Process each cached rule + for (var _a = 0, parsedRules_1 = parsedRules; _a < parsedRules_1.length; _a++) { + var parsedRule = parsedRules_1[_a]; + _loop_1(parsedRule); + } + // Handle element styles and build results in one pass + for (var _b = 0, pseudoClasses_2 = pseudoClasses; _b < pseudoClasses_2.length; _b++) { + var pseudoClass = pseudoClasses_2[_b]; + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Add element's inline styles + CSSUtil.fillStyle([styleMap, pseudoMap], elem.style); + // Build results + if (pseudoClass === "") { + results[pseudoClass] = styleMap; + } + else { + // For pseudo-classes, return only styles that differ from default + var diffStyles = {}; + var keys = Object.keys(pseudoMap); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (pseudoMap[key] !== styleMap[key]) { + diffStyles[key] = pseudoMap[key]; + } + } + results[pseudoClass] = diffStyles; + } + } + return results; + }; + /** + * Returns the style defined for this element for multiple pseudo-classes in a single pass + * + * This is more efficient than calling getDefinedStyles multiple times as it only + * iterates through stylesheets once. + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string[]} pseudoClasses - Array of pseudo-classes to retrieve. Use "" for default (no pseudo-class). + * @returns {Object} Object mapping each pseudo-class to its defined styles + */ + CSSUtil.getDefinedStylesMultiple = function (elem, props, pseudoClasses) { + if (!elem) + return null; + var results = {}; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + // Check cache first - see if we have all requested pseudo-classes cached + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + var missingPseudoClasses = []; + if (cachedStyles) { + // Check which pseudo-classes are already cached + for (var _i = 0, pseudoClasses_4 = pseudoClasses; _i < pseudoClasses_4.length; _i++) { + var pseudoClass = pseudoClasses_4[_i]; + if (cachedStyles[pseudoClass] !== undefined) { + results[pseudoClass] = cachedStyles[pseudoClass]; + } + else { + missingPseudoClasses.push(pseudoClass); + } + } + // If all are cached, return immediately + if (missingPseudoClasses.length === 0) { + return results; + } + } + else { + cachedStyles = {}; + missingPseudoClasses = pseudoClasses; + } + // Only process missing pseudo-classes using the internal helper + if (missingPseudoClasses.length > 0) { + var newResults = CSSUtil.getDefinedStylesInternal(elem, props, missingPseudoClasses); + // Merge new results with cached results + for (var _a = 0, missingPseudoClasses_1 = missingPseudoClasses; _a < missingPseudoClasses_1.length; _a++) { + var pseudoClass = missingPseudoClasses_1[_a]; + results[pseudoClass] = newResults[pseudoClass]; + cachedStyles[pseudoClass] = newResults[pseudoClass]; + } + // Update cache with all styles (existing + new) + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + } + return results; + }; + /** + * Returns the style defined for this element + * + * This differs from the computed style in that the computed style will return + * styles defined by the user agent. This will only return styles defined by the + * application + * if rotation transform is used, the computed style returns the resolved matrix + * while the defined style return the transform function(s) + * for example, for 'transform: rotate(2.5deg);', the computed style returns 'matrix(-0.0436194, 0.999048, -0.999048, -0.0436194, 0, 0)' + * and the defined style returns 'rotate(2.5deg)' + * + * change the type of the parameter pseudoClass from PseudoClass to string to include both pseudo classes (e.g., :focus, :checked) + * and pseudo elements (e.g., ::before, ::after). + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string} [pseudoClass] If specified, will return values that are different + * than when the pseudoClass does not match. + */ + CSSUtil.getDefinedStyles = function (elem, props, pseudoClass) { + if (!elem) + return null; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + var pseudoKey = pseudoClass || ""; + // Check cache first - use shared cache structure with getDefinedStylesMultiple + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + if (!cachedStyles) { + cachedStyles = {}; + } + if (cachedStyles[pseudoKey] !== undefined) { + return cachedStyles[pseudoKey]; + } + // Use the internal helper method with a single pseudo-class + var results = CSSUtil.getDefinedStylesInternal(elem, props, [pseudoKey]); + var result = results[pseudoKey]; + // Cache the result + cachedStyles[pseudoKey] = result; + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + return result; + }; + /** + * Returns the media query defined for the document + * Get media orientation transforms from stylesheets with caching + * Returns transform/rotate properties for elements within media queries + * + * @param {Document} doc + */ + CSSUtil.getMediaOrientationTransform = function (doc) { + // Check if we already have cached media orientation transforms for this document + var cachedTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MediaOrientationTransforms", null); + if (cachedTransforms) { + return cachedTransforms; + } + var orientationTransforms = {}; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < doc.styleSheets.length; ++ssIndex) { + var sheet = doc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var sheetRule = sheet.cssRules[rIndex]; + if (4 /* CSSRule.MEDIA_RULE */ === sheetRule.MEDIA_RULE) { + var rule = sheetRule; + if (rule && rule.media) { + var mediaList = rule.media; + for (var i = 0; i < mediaList.length; i++) { + if (!mediaList.item(i)) + continue; + var mediaKey = mediaList.item(i).toLocaleLowerCase(); + var elem_transforms = orientationTransforms[mediaKey]; + if (!elem_transforms) + elem_transforms = {}; + var styleRules = rule.cssRules; + for (var j = 0; j < styleRules.length; ++j) { + if (1 /* CSSRule.STYLE_RULE */ === styleRules[j].STYLE_RULE) { + var styleRule = styleRules[j]; + var selector = styleRule.selectorText; + if (selector) { + var transforms = {}; + var styles = styleRule.style; + for (var s = 0; s < styles.length; ++s) { + var key = styles[s]; + var keyLower = key.toLocaleLowerCase(); + if (keyLower === "transform") { + if (key === "all" && styles[key]) { + transforms = {}; + break; + } + else { + transforms[key] = styles[key]; + } + } + else if (keyLower === "rotate") { + transforms[key] = styles[key]; + } + } + if (Object.keys(transforms).length > 0) { + elem_transforms[selector] = transforms; + } + } + } + } + if (Object.keys(elem_transforms).length > 0) { + orientationTransforms[mediaKey] = elem_transforms; + } + } + } + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the media orientation transforms at the document level + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MediaOrientationTransforms", orientationTransforms); + return orientationTransforms; + }; + /** + * convert given rotation transform functions to the degree transformed. + * If multiple functions are given, then the functions are applied linearly in the order. + * rotation_transform function example: rotate(45deg), rotate(2turn), rotate(2rad), rotate3d(1, 1, 1, 45deg), + * rotate(2rad) rotate3d(1, 1, 1, 45deg) + * @param rotation_transform + */ + CSSUtil.getRotationDegree = function (rotation_transform) { + var degree = 0; + try { + if (!rotation_transform) + return degree; + // normalize the rotation_transform + rotation_transform = rotation_transform.replaceAll(", ", ","); + var transform_functions = rotation_transform.split(" "); + for (var i = 0; i < transform_functions.length; i++) { + var transform_function = transform_functions[i].trim(); + if (transform_function === "") + continue; + if (transform_function.startsWith("rotate3d")) { + // example: rotate3d(1, 1, 1, 45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = void 0; + if (matrix) + values = matrix.split(","); + if (values && values.length === 4) { + var rotation = values[3]; + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + } + else if (transform_function.startsWith("rotate") || + transform_function.startsWith("rotateZ")) { + // example: rotate(45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var rotation = transform_function.substring(left + 1, right); + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + else if (transform_function.startsWith("matrix3d")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[4], values[5]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + else if (transform_function.startsWith("matrix")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[1], values[0]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + } + while (degree >= 360) + degree -= 360; + } + catch (err) { + console.log("Cannot retrieve rotation degree: " + err); + throw err; + } + return degree; + }; + /** + * Convert CSS style string values to pixels. + * + * @param value style value in string, such as 3rem, 230px etc. + * @param target element. + * @return value in pixels + */ + CSSUtil.getPixelsFromStyle = function (value, elem) { + if (!value) + return 0; + var regex = /(-?[\d.]+)([a-z%]*)/; + var parsed = value.trim().match(regex); + if (parsed === null) + return 0; + if (parsed[2] === "" || parsed[1] === 0) + //no zero value without unit which is considered as error, so implicable + return 0; + var pixels = CSSUtil.convertValue2Pixels(parsed[2], parsed[1], elem); + return pixels === null ? pixels : parseFloat(pixels); + }; + /** + * Convert absolute CSS numerical values to pixels. + * + * @param unitValue in string + * @param target element. + * @return value in pixels + */ + CSSUtil.convertValue2Pixels = function (unit, unitValue, elem) { + if (unitValue === 0) + return 0; + if (!unit) + unit = "px"; + var supportedUnits = { + // absolute unit + px: function (value) { return value; }, + cm: function (value) { return value * 37.8; }, + mm: function (value) { return value * 3.78; }, + q: function (value) { return value * 0.95; }, + in: function (value) { return value * 96; }, + pc: function (value) { return value * 16; }, + pt: function (value) { return value * 1.33; }, + // relative unit + rem: function (value) { + return value * + parseFloat(getComputedStyle(elem.ownerDocument.documentElement).getPropertyValue("font-size")); + }, + em: function (value) { + return value * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + vw: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerWidth; + }, + vh: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerHeight; + }, + "%": function (value) { + return (value / 100) * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + }; + if (unit in supportedUnits) + return supportedUnits[unit](unitValue); + return null; + }; + /* + * Returns if the font for visible text of the element is defined by material icons + * + * @param {HTMLElement} elem + */ + CSSUtil.isMaterialIconFont = function (elem) { + // TODO: check the existence material icons using fetch in node 18+ + // for now (node 16) just dertermine if the stylesheet for the 'Material Icons' exists statically. note that the loading of the font stylesheet occurs at run time. + //list of known material icons and stylesheet link + var known_icons = { + "Material Icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + var known_css_classes = { + "material-icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + // material icon font can be defined either by font-family: 'Material Icons' or by class="material-icons" + var styles = CSSUtil.getDefinedStyles(elem, ["font-family"]); + var fontFamily = styles["font-family"]; + var found = false; + // font-family specifies a prioritized list of one or more font family names + if (fontFamily && + fontFamily.split(",")[0].replace(/['"]+/g, "").trim() in known_icons) + found = true; + if (!found) { + var list = elem.classList; + for (var css_class in known_css_classes) { + if (list.contains(css_class)) { + found = true; + break; + } + } + } + if (!found) + return false; + var passed = false; + // check if the stylesheet for the 'Material Icons' exists statically + var sheets = elem.ownerDocument.styleSheets; + for (var s = 0; s < sheets.length; s++) { + if (sheets && + sheets.length > 0 && + Object.values(known_icons).indexOf(sheets[s].href) > -1) { + passed = true; + break; + } + } + return passed; + }; + CSSUtil.getWeightNumber = function (styleVal) { + var map = { + light: 100, + bold: 700, + }; + var retVal = parseInt(styleVal); + if (retVal) + return retVal; + if (styleVal in map) + return map[styleVal]; + return 400; + }; + CSSUtil.getFontInPixels = function (styleVal, elem) { + var map = { + "xx-small": 16, + "x-small": 10, + small: 13, + medium: 16, + large: 18, + "x-large": 24, + "xx-large": 32, + }; + var value = parseFloat(styleVal); + if (!value) { + return map[styleVal]; + } + var units = styleVal.substring(("" + value).length); + /** + if (units === "" || units === "px") return value; + if (units === "em") return value * 16; + if (units === "%") return value / 100 * 16; + if (units === "pt") return value * 4 / 3; + return Math.round(value); + */ + return CSSUtil.convertValue2Pixels(units, value, elem); + }; + CSSUtil.getCSSStyle = function (element) { + var styleText = ""; + if (element === null) + return []; + if (element.IBM_CSS_THB) + return element.IBM_CSS_THB; + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === "style") { + styleText = element.innerText; + if (styleText === undefined || styleText.trim() === "") + styleText = element.textContent; + } + else if (element.hasAttribute("style")) { + styleText = element.getAttribute("style"); + } + else + return []; + if (styleText === null || styleText.trim().length === 0) + return []; + //remove comment blocks + var re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g; + var subst = " "; + styleText = styleText.replace(re, subst); + // Find all "key : val;" pairs with various whitespace inbetween + var rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g; + // Find all "selector { csskeyvals } with various whitespace inbetween + var rSelectors = /\s*([^{]*){([^}]*)}/g; + if (styleText.indexOf("{") === -1) { + var keyVals = {}; + var m = void 0; + while ((m = rKeyVals.exec(styleText)) != null) { + keyVals[m[1]] = m[2].trim().toLowerCase(); + } + var retVal = [ + { + selector: null, + values: keyVals, + }, + ]; + element.IBM_CSS_THB = retVal; + return retVal; + } + else { + var retVal = []; + var m = void 0; + var m2 = void 0; + while ((m = rSelectors.exec(styleText)) != null) { + var keyVals = {}; + var selKey = m[1]; + var selVal = m[2]; + while ((m2 = rKeyVals.exec(selVal)) != null) { + keyVals[m2[1]] = m2[2].trim().toLowerCase(); + } + retVal.push({ + selector: selKey, + values: keyVals, + }); + } + element.IBM_CSS_THB = retVal; + return retVal; + } + }; + /** + * an "inline" CSS display property tells the element to fit itself on the same line. An 'inline' element's width and height are ignored. + * some element has default inline property, such as <span>, <a> + * most formatting elements inherent inline property, such as <em>, <strong>, <i>, <small> + * other inline elements: <abbr> <acronym> <b> <bdo> <big> <br> <cite> <code> <dfn> <em> <i> <input> <kbd> <label> + * <map> <object> <output> <q> <samp> <script> <select> <small> <span> <strong> <sub> <sup> <textarea> <time> <tt> <var> + * an "inline-block" element still place element in the same line without breaking the line, but the element's width and height are applied. + * inline-block elements: img, button, select, meter, progress, marguee, also in Chrome: textarea, input + * A block-level element always starts on a new line, and the browsers automatically add some space (a margin) before and after the element. + * block-level elements: <address> <article> <aside> <blockquote> <canvas> <dd> <div> <dl> <dt> <fieldset> <figcaption> <figure> <footer> <form> + * <h1>-<h6> <header> <hr> <li> <main> <nav> <noscript> <ol> <p> <pre> <section> <table> <tfoot> <ul> <video> + * + * return: if it's inline element and { inline: true | false, text: true | false, violation: null | {node} } + */ + CSSUtil.getInlineStatus = function (element) { + if (!element) + return null; + var elem_styl = getComputedStyle(element); + if (!elem_styl) + return null; + var status = { inline: false, text: false, violation: null }; + var udisplay = elem_styl.getPropertyValue("display"); + // inline element only + if (udisplay !== "inline") + return status; + status.inline = true; + var parent = element.parentElement; + if (!parent) + return status; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(element); + var style = getComputedStyle(parent); + var display = style.getPropertyValue("display"); + // an inline element is inside a block. note <body> is a block element too + if (display !== "block" && display !== "inline-block") { + //parent is inline element + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(parent)) + status.text = true; + return status; + } + /** + * @returns "yes"": inline with text, "no": inline without text, + * "violation": not spacing enough to neiboring inline target + * "block": block element, + */ + function isInlineWithText(node, before) { + // note browsers insert Text nodes to represent whitespaces. + if (node.nodeType === Node.TEXT_NODE) { + if (node.nodeValue && node.nodeValue.trim().length > 0) + return "yes"; + else + return "no"; + } + else if (node.nodeType === Node.ELEMENT_NODE) { + // special case: <br> is styled 'inline' by default, but change the line + if (node.nodeName.toLowerCase() === "br") + return "block"; + var cStyle = getComputedStyle(node); + var cDisplay = cStyle.getPropertyValue("display"); + if (cDisplay === "inline") { + if (CommonUtil_1.CommonUtil.isTarget(node)) { + if (bounds.width < 24) { + // check if the horizontal spacing is sufficient + var bnds = mapper.getUnadjustedBounds(node); + if ((before && (Math.round(bounds.width / 2) + bounds.left - bnds.left < 24)) + || (!before && (Math.round(bounds.width / 2) + bounds.left - (bnds.left + bnds.width) < 24))) { + status.violation = node.nodeName.toLowerCase(); + return "violation"; + } + else + return "no"; + } + } + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(node)) + return "yes"; + return "no"; + } + else + return "block"; + } + else + return "block"; + } + // an inline element is inside a block. note <body> is a block element too + // one or more inline elements with text in the same line: <target>, text<target>, <target>text, <inline>+text<target>, <target><inline>+text, text<target><inline>+ + var walkNode = element.nextSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, true); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.nextSibling; + } + walkNode = element.previousSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, false); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.previousSibling; + } + return status; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * a target is a browser default if it's a native widget (no user defined role) without user style + */ + CSSUtil.isTargetBrowserDefault = function (element) { + if (!element) + return false; + // user defined widget + var roles = AriaUtil_1.AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) + return false; + // no user style to space control size, including use of font + var styles = CSSUtil.getDefinedStyles(element, [ + "line-height", "height", "width", "min-height", "min-width", + "font-size", "margin-top", "margin-bottom", "margin-left", "margin-right" + ]); + if (styles["line-height"] || + styles["height"] || + styles["width"] || + styles["min-height"] || + styles["min-width"] || + styles["font-size"] || + styles["margin-top"] || + styles["margin-bottom"] || + styles["margin-left"] || + styles["margin-right"]) + return false; + return true; + }; + /* + * string contains CJK (chinese, japaneses, or korea) + * return: boolean + */ + CSSUtil.containsCKJ = function (text) { + if (!text) + return false; + // https://en.wikipedia.org/wiki/CJK_Unified_Ideographs https://ayaka.shn.hk/hanregex/ + var regex = /(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g; + var replaced = text.trim().replace(regex, ""); + if (replaced.length === text.trim().length) + return false; + return true; + }; + /** + * Return the ancestor with the given style properties. + * Searches up the DOM tree to find an ancestor that has ALL specified style properties + * with values matching the criteria. + * + * @param {element} elem - The element to start the node walk on to find parent node + * @param {Object} styleProps - The style properties and values of the parent to search for. + * such as {"overflow":['auto', 'scroll'], "overflow-x":['auto', 'scroll']} + * or {"overflow":['*'], "overflow-x":['*']}, The '*' for any value to check the existence of the style prop. + * @param {Array} excludedValues - style values that should be ignored. + * @return {Element|null} - An ancestor element that has all the specified style properties, or null if none found + * @memberOf CSSUtil + */ + CSSUtil.getAncestorWithStyles = function (elem, styleProps, excludedValues) { + if (excludedValues === void 0) { excludedValues = []; } + // Create a cache key that includes the style properties being searched for + var cacheKey = "AriaUtil_AncestorWithStyles_" + JSON.stringify(styleProps) + "_" + JSON.stringify(excludedValues); + // Check if we already have a cached result for this specific query + var cachedResult = CacheUtil_1.CacheUtil.getCache(elem, cacheKey, null); + if (cachedResult !== null) { + return cachedResult === "NOT_FOUND" ? null : cachedResult; + } + // Start with the element itself (not just parent) to maintain backward compatibility + var walkNode = elem; + while (walkNode !== null) { + // Skip if not an HTMLElement (e.g., SVGElement) + // Use nodeType check instead of instanceof to work across different document contexts + if (walkNode.nodeType !== 1 || walkNode.namespaceURI === "http://www.w3.org/2000/svg") { + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + continue; + } + var styles = CSSUtil.getDefinedStyles(walkNode, Object.keys(styleProps)); + // Check if ANY specified style property matches the criteria (OR logic) + for (var styleProp in styleProps) { + var value = styles[styleProp]; + if (!value) { + // Property not defined on this element, try next property + continue; + } + // Remove !important suffix for comparison + value = value.split(" ")[0]; + // Check if value should be excluded + if (excludedValues.includes(value)) { + continue; + } + // Check if value matches the criteria + var acceptedValues = styleProps[styleProp]; + if (acceptedValues.includes('*')) { + // Any value is acceptable (just checking existence) + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + else if (acceptedValues.includes(value)) { + // Value matches one of the accepted values + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + } + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + // No matching element or ancestor found - cache this result to avoid re-searching + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, "NOT_FOUND"); + return null; + }; + /** + * return an array [value, Unit] from a value-unit combo string + * @param valueUnitCombo, such as 20px, 2rem + * @returns + */ + CSSUtil.getValueUnitPair = function (valueUnitCombo) { + if (!valueUnitCombo) + return null; + if (Number.isInteger(valueUnitCombo)) + return ["px", valueUnitCombo]; + var value = parseInt(valueUnitCombo); + if (isNaN(value)) + return null; + valueUnitCombo = valueUnitCombo.trim().toLowerCase(); + var match = valueUnitCombo.trim().match(/([a-z]+)$/); + var unit = 'px'; + if (match) + unit = match[1]; + return [unit, value]; + }; + return CSSUtil; +}()); +exports.CSSUtil = CSSUtil; + + +/***/ }, + +/***/ "./src/v4/util/CacheUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/CacheUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CacheUtil = void 0; +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil = /** @class */ (function () { + function CacheUtil() { + } + /* Return a pointer to the given global variable + * with its initial value as given */ + CacheUtil.getCache = function (cacheSpot, keyName, initValue) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined) { + cacheObj.aceCache[keyName] = initValue; + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.setCache = function (cacheSpot, globalName, value) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + cacheObj.aceCache[globalName] = value; + return value; + }; + CacheUtil.getSetCache = function (cacheSpot, keyName, initFunc) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined || typeof cacheObj.aceCache[keyName] === "undefined") { + cacheObj.aceCache[keyName] = initFunc(); + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.clearCaches = function (cacheRoot) { + var _a; + var numNodesVisited = 0; + delete cacheRoot.ownerDocument.aceCache; + var nw = new DOMWalker_1.DOMWalker(cacheRoot, false, cacheRoot, true); + do { + ++numNodesVisited; + delete nw.node.aceCache; + nw.node.ownerDocument && delete nw.node.ownerDocument.aceCache; + } while (nw.nextNode()); + if (cacheRoot !== ((_a = cacheRoot.ownerDocument) === null || _a === void 0 ? void 0 : _a.documentElement)) { + // Start the walker at the documentElement of cacheRoot's immediate document. + // ownerDocument is guaranteed non-null here because the if-guard above + // checks cacheRoot.ownerDocument?.documentElement. + var nwDoc = new DOMWalker_1.DOMWalker(cacheRoot.ownerDocument.documentElement, false, undefined, true); + // cacheRoot may be inside a shadow root or an iframe, which are themselves + // nested inside ancestor documents. Walk up from cacheRoot across any + // frame/shadow boundaries (DOMWalker.parentElement handles ownerElement + // links set by the walker) to find the outermost ancestor element, then + // reposition the walker there so the second pass covers every containing + // document as well. + { + var tempElem = nwDoc.node; + var parentElem = void 0; + while (parentElem = DOMWalker_1.DOMWalker.parentElement(tempElem)) { + tempElem = parentElem; + } + nwDoc.node = tempElem; + } + do { + // On the start-tag visit of cacheRoot, skip its entire subtree — + // it was already cleared and counted in the first pass above. + // Setting bEndTag=true makes the next nextNode() call emit cacheRoot's + // end-tag and then advance to its next sibling without descending into + // its children. + if (!nwDoc.bEndTag && DOMUtil_1.DOMUtil.sameNode(cacheRoot, nwDoc.node)) { + nwDoc.bEndTag = true; + continue; + } + delete nwDoc.node.aceCache; + nwDoc.node.ownerDocument && delete nwDoc.node.ownerDocument.aceCache; + } while (nwDoc.nextNode()); + } + return numNodesVisited; + }; + return CacheUtil; +}()); +exports.CacheUtil = CacheUtil; + + +/***/ }, + +/***/ "./src/v4/util/ClipPathUtil.ts" +/*!*************************************!*\ + !*** ./src/v4/util/ClipPathUtil.ts ***! + \*************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ClipPathUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ./CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ClipPathUtil = /** @class */ (function () { + function ClipPathUtil() { + } + /** + * This function is responsible for checking if the node that is visually hidden by css clip-path: + * + * Note 1: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note 2: nodes with CSS properties clip-path, the content is not considered hidden to an AT. Text hidden with these methods + * can still be reedable by screen readers. + * Note 3: if a link, form control, or other focusable element is given this style, the element would be focusable but not visible, + * keyboard users might be confused. + * + * @parm {Node} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + ClipPathUtil.isNodeVisuallyHiddenByClipPath = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", undefined); + if (hidden !== undefined) + return hidden; + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + var path = style['clip-path']; + if (!path || path.trim() === 'none' || path.trim() === '') { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + path = path.trim().replace(/\s+/g, ' ').toLowerCase(); + var index = path.indexOf("inset("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + // When one value is specified, it applies the same inset to all four sides + if (numbers.length === 1) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[0], numbers[0], numbers[0]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When two values are specified, the first value applies to the top and bottom, the second to the left and right. + if (numbers.length === 2) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[0], numbers[1]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When three values are specified, the first applies to the top, the second to the right and left, the third to the bottom. + if (numbers.length === 3) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[1], numbers[2]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When four values are specified, the values apply to the top, right, bottom, and left in that order (clockwise). + if (numbers.length === 4) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[2], numbers[3]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + } + index = path.indexOf("rect("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + /** + * The first (top) and third (bottom) values are distances from the top edge of the containing block, + * and the second (right) and fourth (left) values are distances from the left edge of the containing block. + * The second (right) and third (bottom) values are clamped by the fourth (left) and first (top) values, respectively, + * + * If auto is used for the first (top) or fourth (left) value, the value of auto is 0, + * and if used for the second (right) or third (bottom) value, the value of auto is 100%. + */ + if (numbers[0] === 'auto') + numbers[0] = '0px'; + if (numbers[3] === 'auto') + numbers[3] = '0px'; + if (numbers[1] === 'auto') + numbers[1] = '100%'; + if (numbers[2] === 'auto') + numbers[2] = '100%'; + // to prevent the bottom edge from crossing over the top edge and right edge from crossing over the left edge. + // for example, rect(10px 0 0 20px) is clamped to rect(10px 20px 10px 20px) + numbers[2] = Math.max(numbers[0], numbers[2]); + numbers[1] = Math.max(numbers[1], numbers[3]); + var top_1 = parseInt(numbers[0]); + if (isNaN(top_1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + top_1 = top_1 * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + top_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (top_1 >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var left = parseInt(numbers[3]); + if (isNaN(left)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + left = left * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + left = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (left >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var right = parseInt(numbers[1]); + if (isNaN(right)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + right = right * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + right = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + var bottom = parseInt(numbers[2]); + if (isNaN(bottom)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + bottom = bottom * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + bottom = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if ((bottom - top_1) <= ClipPathUtil.THRESHOLD || (right - left) <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("xywh("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + var x = parseInt(numbers[0]); + if (isNaN(x)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + x = x * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + x = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (x >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var y = parseInt(numbers[1]); + if (isNaN(y)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + y = y * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(y); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + scrollY = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (y >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var w = parseInt(numbers[2]); + if (isNaN(w)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + w = w * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(w); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + w = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (w <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + var h = parseInt(numbers[3]); + if (isNaN(h)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + h = h * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(h); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + h = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (h <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("circle("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + var radius = parseInt(numbers[0]); + if (isNaN(radius)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) { + var short = width > height ? height : width; + radius = radius * short / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("ellipse("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + // ellipse(closest-side farthest-side at 30% 40%); + if (numbers.length > 3 && numbers[0] === 'closest-side' && numbers[1] === 'farthest-side' && numbers[2] === 'at') { + var radius = parseInt(numbers[3]); + if (numbers.length === 4) { + if (numbers[3].endsWith("%")) { + var value = width > height ? height : width; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + else if (numbers.length === 5) { + for (var i = 3; i < numbers.length; i++) { + var radius_1 = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 3) ? width : height; + radius_1 = radius_1 * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius_1 <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + // ellipse(40% 50% at left); + var at_index = path.indexOf("at"); + str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (at_index !== -1) + str = path.substring(path.indexOf("(") + 1, at_index); + numbers = str.trim().split(" "); + if (numbers.length !== 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + for (var i = 0; i < numbers.length; i++) { + var radius = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 0) ? width : height; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("polygon("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(","); + // polygon(nonzero|evenodd, 0% 0%, 50% 50%, 0% 100%) + if (numbers[0] === 'nonzero' || numbers[0] === 'evenodd') + numbers.shift(); + var y = 0; + var x = 0; + var changed_x = false; + var changed_y = false; + for (var i = 0; i < numbers.length; i++) { + var coordinates = numbers[i].trim().split(" "); + if (coordinates.length != 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var coordinate_xy = [0, 0]; + for (var i_1 = 0; i_1 < 2; i_1++) { + var value = parseInt(coordinates[i_1]); + if (isNaN(value)) + return false; + if (coordinates[i_1].endsWith("%")) + coordinate_xy[i_1] = (i_1 === 0) ? value * width / 100 : value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(coordinates[i_1]); + if (!pair) + return false; + coordinate_xy[i_1] = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + } + if (i === 0) { + x = coordinate_xy[0]; + y = coordinate_xy[1]; + } + if (Math.abs(coordinate_xy[0] - x) >= ClipPathUtil.THRESHOLD) + changed_x = true; + if (Math.abs(coordinate_xy[1] - y) >= ClipPathUtil.THRESHOLD) + changed_y = true; + } + if (changed_x && changed_y) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + }; + ClipPathUtil.isClippedByInset = function (elem, top, right, bottom, left) { + if (right === void 0) { right = '0px'; } + if (bottom === void 0) { bottom = '0px'; } + if (left === void 0) { left = '0px'; } + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + // top + var top_value = parseInt(top); + if (isNaN(top_value)) + return false; + if (top.endsWith("%")) + top_value = top_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) + return false; + top_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (top_value > height) + return false; + // right + var right_value = parseInt(right); + if (isNaN(right_value)) + return false; + if (right.endsWith("%")) + right_value = right_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) + return false; + right_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (right_value > width) + return false; + // bottom + var bottom_value = parseInt(bottom); + if (isNaN(bottom_value)) + return false; + if (bottom.endsWith("%")) + bottom_value = bottom_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) + return false; + bottom_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (bottom_value > height) + return false; + // left + var left_value = parseInt(left); + if (isNaN(left_value)) + return false; + if (left.endsWith("%")) + left_value = left_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) + return false; + left_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (left_value > width) + return false; + if (height - (top_value + bottom_value) <= ClipPathUtil.THRESHOLD || width - (right_value + left_value) <= ClipPathUtil.THRESHOLD) + return true; + return false; + }; + ClipPathUtil.THRESHOLD = 5; // 5px + return ClipPathUtil; +}()); +exports.ClipPathUtil = ClipPathUtil; + + +/***/ }, + +/***/ "./src/v4/util/ColorUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/ColorUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ColorObj = exports.ColorUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var ColorUtil = /** @class */ (function () { + function ColorUtil() { + } + // Rewrite the color object to account for alpha + ColorUtil.Color = function (cssStyleColor) { + if (!cssStyleColor) + return null; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor === "transparent") + return new ColorObj(255, 255, 255, 0); + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3]); + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3], m[4]); + } + } + else if (cssStyleColor.charAt(0) != "#") { + return null; + } + else { + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + var thisRed = parseInt(cssStyleColor.substring(1, 3), 16); + var thisGreen = parseInt(cssStyleColor.substring(3, 5), 16); + var thisBlue = parseInt(cssStyleColor.substring(5, 7), 16); + return new ColorObj(thisRed, thisGreen, thisBlue); + } + // return null; // Unreachable + }; + ; + ColorUtil.ColorCombo = function (ruleContext) { + try { + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + var ancestors = []; + var walkNode = ruleContext; + while (walkNode) { + if (walkNode.nodeType === 1) + ancestors.push(walkNode); + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + var retVal = { + "hasGradient": false, + "hasBGImage": false, + "textShadow": false, + "fg": null, + "bg": null + }; + // start + var cStyle = win.getComputedStyle(ruleContext); + var compStyleColor = cStyle.color; + if (!compStyleColor) + compStyleColor = "black"; + var fg = ColorUtil.Color(compStyleColor); + var reColor = /transparent|rgba?\([^)]+\)/gi; + var guessGradColor = function (gradList, bgColor, fgColor) { + try { + // If there's only one color, return that + if (typeof gradList.length === "undefined") + return gradList; + var overallWorst = null; + var overallWorstRatio = null; + for (var iGrad = 1; iGrad < gradList.length; ++iGrad) { + var worstColor = gradList[iGrad - 1]; + var worstRatio = fgColor.contrastRatio(gradList[iGrad - 1]); + var step = .1; + var idx = 0; + while (step > .0001) { + while (idx + step <= 1 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx + step; + } + while (idx - step >= 0 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx - step; + } + step = step / 10; + } + if (overallWorstRatio === null || overallWorstRatio > worstRatio) { + overallWorstRatio = worstRatio; + overallWorst = worstColor; + } + } + return overallWorst; // return the darkest color + } + catch (e) { + console.log(e); + } + return bgColor; + }; + var priorStackBG = ColorUtil.Color("white"); + var thisStackOpacity = null; + var thisStackAlpha = null; + var thisStackBG = null; + // Ancestors processed from the topmost parent toward the child + while (ancestors.length > 0) { + var procNext = ancestors.pop(); + //var procNext = ancestors.splice(0, 1)[0]; + // cStyle is the computed style of this layer + var cStyle = win.getComputedStyle(procNext); + if (cStyle === null) + continue; + // thisBgColor is the color of this layer or null if the layer is transparent + var thisBgColor = null; + if (cStyle.backgroundColor && cStyle.backgroundColor != "transparent" && cStyle.backgroundColor != "rgba(0, 0, 0, 0)") { + thisBgColor = ColorUtil.Color(cStyle.backgroundColor); + } + // If there is a gradient involved, set thisBgColor to the worst color combination available against the foreground + if (cStyle.backgroundImage && cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + var gradColors = cStyle.backgroundImage.match(reColor); + if (gradColors) { + var gradColorComp = []; + for (var i = 0; i < gradColors.length; ++i) { + if (!gradColors[i].length) { + gradColors.splice(i--, 1); + } + else { + var colorComp = ColorUtil.Color(gradColors[i]); + if (colorComp.alpha !== undefined && colorComp.alpha < 1) { + // mix the grdient bg color wit parent bg if alpha < 1 + var compStackBg = thisStackBG || priorStackBG; + colorComp = colorComp.getOverlayColor(compStackBg); + } + gradColorComp.push(colorComp); + } + } + thisBgColor = guessGradColor(gradColorComp, thisStackBG || priorStackBG, fg); + } + } + // Handle non-solid opacity + if (thisStackOpacity === null || (cStyle.opacity && cStyle.opacity.length > 0 && parseFloat(cStyle.opacity) < 1)) { + // New stack, reset + if (thisStackBG != null) { + // Overlay + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + thisStackOpacity = 1.0; + thisStackAlpha = null; + thisStackBG = null; + if (cStyle.opacity && cStyle.opacity.length > 0) { + thisStackOpacity = parseFloat(cStyle.opacity); + } + if (thisBgColor != null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0) { + retVal.hasBGImage = false; + retVal.hasGradient = false; + } + } + } + // Handle solid color backgrounds and gradient color backgrounds + else if (thisBgColor != null) { + // If this stack already has a background color, blend it + if (thisStackBG === null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + } + else { + thisStackBG = thisBgColor.getOverlayColor(thisStackBG); + //thisStackAlpha = thisBgColor.alpha || 1.0; + thisStackAlpha = thisStackBG.alpha || 1.0; + } + // #526: If thisBgColor had an alpha value, it may not expose through thisStackBG in the above code + // We can't wipe out the gradient info if this layer was transparent + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0 && (thisStackBG.alpha || 1.0) === 1.0 && (thisBgColor.alpha || 1.0) === 0) // removed by dead control flow +{} + } + if (cStyle.backgroundImage && cStyle.backgroundImage != "none") { + if (cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + retVal.hasGradient = true; + } + else { + retVal.hasBGImage = true; + } + } + } + if (thisStackBG != null) { + fg = fg.getOverlayColor(thisStackBG); + delete fg.alpha; + } + fg.alpha = (fg.alpha || 1) * thisStackOpacity; + fg = fg.getOverlayColor(priorStackBG); + if (thisStackBG != null) { + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + retVal.fg = fg; + retVal.bg = priorStackBG; + if (cStyle.textShadow && cStyle.textShadow !== 'none') + retVal.textShadow = true; + return retVal; + } + catch (err) { + // something happened, then... + return null; + } + }; + ; + ColorUtil.CSSColorLookup = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", + "buttontext": "rgba(0, 0, 0, 0.847)", + "buttonface": "#ffffff", + "graytext": "rgba(0, 0, 0, 0.247)" + }; + return ColorUtil; +}()); +exports.ColorUtil = ColorUtil; +var ColorObj = /** @class */ (function () { + function ColorObj(red, green, blue, alpha) { + function fixComponent(comp) { + if (typeof (comp) != typeof ("")) + return comp; + var compStr = comp; + compStr = compStr.trim(); + if (compStr[compStr.length - 1] != "%") + return parseInt(compStr); + return Math.round(parseFloat(compStr.substring(0, compStr.length - 1)) * 2.55); + } + this.red = fixComponent(red); + this.green = fixComponent(green); + this.blue = fixComponent(blue); + if (typeof (alpha) != "undefined") { + this.alpha = (typeof (alpha) === typeof ("")) ? parseFloat(alpha) : alpha; + } + } + ColorObj.prototype.toHexHelp = function (value) { + var retVal = Math.round(value).toString(16); + if (retVal.length === 1) + return "0" + retVal; + return retVal; + }; + ; + ColorObj.prototype.toHex = function () { + return "#" + this.toHexHelp(this.red) + this.toHexHelp(this.green) + this.toHexHelp(this.blue); + }; + ; + ColorObj.prototype.contrastRatio = function (bgColor) { + var fgColor = this; + if (typeof (this.alpha) != "undefined") + fgColor = this.getOverlayColor(bgColor); + var lum1 = fgColor.relativeLuminance(); + if (!bgColor.relativeLuminance) { + var s = ""; + for (var key in bgColor) { + s += key + "\n"; + } + alert(bgColor); + alert(s); + } + var lum2 = bgColor.relativeLuminance(); + var ratio = (lum1 > lum2) ? (lum1 + .05) / (lum2 + .05) : (lum2 + .05) / (lum1 + .05); + return ratio; + }; + ; + ColorObj.prototype.relativeLuminance = function () { + var R = this.red / 255.0; + var G = this.green / 255.0; + var B = this.blue / 255.0; + R = R <= .04045 ? R / 12.92 : Math.pow((R + .055) / 1.055, 2.4); + G = G <= .04045 ? G / 12.92 : Math.pow((G + .055) / 1.055, 2.4); + B = B <= .04045 ? B / 12.92 : Math.pow((B + .055) / 1.055, 2.4); + return 0.2126 * R + 0.7152 * G + 0.0722 * B; + }; + ; + ColorObj.prototype.mix = function (color2, percThis) { + if (typeof (this.alpha) === "undefined" && typeof (color2.alpha) === "undefined") { + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue); + } + else { + var alphaThis = this.alpha ? this.alpha : 1; + var alphaOther = color2.alpha ? color2.alpha : 1; + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue, percThis * alphaThis + (1 - percThis) * alphaOther); + } + }; + ; + ColorObj.prototype.getOverlayColor = function (bgColor) { + if (typeof (this.alpha) === "undefined" || this.alpha >= 1) { + // No mixing required - it's opaque + return this; + } + if (this.alpha < 0) { + // Haac.Error.logError("Invalid alpha value"); + return null; + } + if (typeof (bgColor.alpha) != "undefined" && bgColor.alpha < 1) { + // Haac.Error.logError("Cannot mix with a background alpha"); + return null; + } + var retVal = this.mix(bgColor, this.alpha); + delete retVal.alpha; + return retVal; + }; + ColorObj.fromCSSColor = function (cssStyleColor) { + var thisRed = -1; + var thisGreen = -1; + var thisBlue = -1; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else { + if (cssStyleColor.charAt(0) != "#") { + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + else + return null; + } + var fromHex = function (val) { + var lookup = { + "a": 10, + "b": 11, + "c": 12, + "d": 13, + "e": 14, + "f": 15 + }; + var retVal = 0; + for (var i = 0; i < val.length; ++i) { + retVal = retVal * 16 + + parseInt(val.charAt(i) in lookup ? lookup[val.charAt(i)] : val.charAt(i)); + } + return retVal; + }; + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + thisRed = fromHex(cssStyleColor.substring(1, 3)); + thisGreen = fromHex(cssStyleColor.substring(3, 5)); + thisBlue = fromHex(cssStyleColor.substring(5, 7)); + } + return new ColorObj(thisRed, thisGreen, thisBlue); + }; + return ColorObj; +}()); +exports.ColorObj = ColorObj; + + +/***/ }, + +/***/ "./src/v4/util/CommonUtil.ts" +/*!***********************************!*\ + !*** ./src/v4/util/CommonUtil.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ./AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil = /** @class */ (function () { + function CommonUtil() { + } + CommonUtil.wordCount = function (str) { + str = str.trim(); + if (str.length === 0) + return 0; + return str.split(/\s+/g).length; + }; + /** + * Note that this only detects if the element itself is in the tab order. + * However, this element may delegate focus to another element via aria-activedescendant. + * Also, focus varies by browser... sticking to things that are focusable on Chrome and Firefox. + */ + CommonUtil.isTabbable = function (element) { + // Using https://allyjs.io/data-tables/focusable.html + // Handle the explicit cases first + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + if (element.hasAttribute("inert") || DOMUtil_1.DOMUtil.getAncestorWithAttribute(element, "inert", "")) + return false; + if (element.hasAttribute("tabindex")) { + return parseInt(element.getAttribute("tabindex")) >= 0; + } + // Explicit cases handled - now the implicit + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + var ce = element.getAttribute("contenteditable"); + if (ce === "true" || ce === "") + return true; + return false; + } + }; + /** + * Test if the ele node is focusable + */ + CommonUtil.isFocusable = function (ele) { + if (ele === "undefined" || ele === null) { + return false; + } + return CommonUtil.isTabbable(ele); + }; + /** + * Note that this only detects if the element itself is interactive, but not onclick event. + */ + CommonUtil.isClickable = function (element) { + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + // native focusable element + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + //custom widget + if (AriaUtil_1.AriaUtil.isWidget(element) && element.hasAttribute("tabindex")) { + return true; + } + } + return false; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + CommonUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + CommonUtil.tabIndexLEZero = function (elem) { + if (CommonUtil.hasAttribute(elem, "tabindex")) { + if (elem.getAttribute("tabindex").match(/^-?\d+$/)) { + var tabindexValue = parseInt(elem.getAttribute("tabindex")); + return tabindexValue === 0 || tabindexValue === -1; + } + } + return false; + }; + /** + * get number of tabbable children + * @param element + */ + CommonUtil.getTabbableChildren = function (element) { + var count = 0; + // If node has children, look for tab stops in the children + if (element.firstChild || element.nodeName.toUpperCase() === "IFRAME") { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode() && nw.node != element) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + return count; + }; + CommonUtil.normalizeSpacing = function (s) { + if (!s) + return ''; + return s.trim().replace(/\s+/g, ' '); + }; + ; + //TODO: function does not handle equivalents for roles: row, link, header, button + // But it may not have to. Bug reports have been about radio buttons and checkboxes. + CommonUtil.isHtmlEquiv = function (node, htmlEquiv) { + var retVal = false; + if (node) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = node.getAttribute("type").toLowerCase(); + if (type) { + if (htmlEquiv.indexOf("checkbox") != -1) { + retVal = type === "checkbox"; + } + else if (htmlEquiv.indexOf("radio") != -1) { + retVal = type === "radio"; + } + } + } + } + return retVal; + }; + CommonUtil.nonExistantIDs = function (node, targetids) { + var returnnotfoundids = ''; + if (CommonUtil.normalizeSpacing(targetids).length < 1) + return returnnotfoundids; + var targetArray = targetids.split(" "); + var doc = node.ownerDocument; + for (var i = 0; i < targetArray.length; i++) { + var xp = "//*[@id='" + targetArray[i] + "']"; + var xpathResult = doc.evaluate(xp, node, doc.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + if (!r) + returnnotfoundids += targetArray[i] + ', '; + } + if (CommonUtil.normalizeSpacing(returnnotfoundids).length >= 2) + returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2); + else + returnnotfoundids = ''; + return returnnotfoundids; + }; + CommonUtil.getDocElementsByTag = function (elem, tagName) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + tagName = tagName.toLowerCase(); + var cache = CacheUtil_1.CacheUtil.getCache(doc, "RPT_DOCELEMSBYTAG", {}); + if (!(tagName in cache)) { + cache[tagName] = doc.querySelectorAll(tagName); + CacheUtil_1.CacheUtil.setCache(doc, "RPT_DOCELEMSBYTAG", cache); + } + return cache[tagName]; + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * Note: This is a wrapper function to: AriaUtil.getChildByTagHidden + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTag = function (parentElem, tagName) { + return CommonUtil.getChildByTagHidden(parentElem, tagName, false, false); + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTagHidden = function (parentElem, tagName, ignoreHidden, considerHiddenSetting) { + // Variable Decleration + var retVal = []; + var child = parentElem.firstChild; + // Loop over all the child elements of the parent to build a list of all the elements that + // match the tagName provided + while (child != null) { + // Only include the children into the return array if they match with tagname. + if (child.nodeName.toLowerCase() === tagName) { + // In the case that ignorehidden was set to true, then perform a isNodeVisible check + // and in the case the node is not visilble we more to theses then move to the next node. + // Perform a couple of checks to determine if hidden elements should be ignored or not. + // 1. When ignoreHidden is set to true upfront, then perform a isNodeVisible + // 2. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2.1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if ((ignoreHidden || (considerHiddenSetting && !CommonUtil.shouldCheckHiddenContent(child))) && !VisUtil_1.VisUtil.isNodeVisible(child)) { + // Move on to the next element + child = child.nextSibling; + continue; + } + // Push the element + retVal.push(child); + } + // Move to the next sibling element + child = child.nextSibling; + } + return retVal; + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function by defauly will not consider Check Hidden Setting at all. + * This function by defauly will not consider implicit roles. + * Note: This is a wrapper function to: AriaUtil.getElementsByRoleHidden + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRole = function (doc, roles) { + return CommonUtil.getElementsByRoleHidden(doc, roles, false, false); + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function aslo finds elements with implicit roles. + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRoleHidden = function (doc, roles, considerHiddenSetting, considerImplicitRoles) { + // In the case that the role to element assoication is already made, and available in the global hasAttribute + // we can just use that one instead of building a new one. + var roleToElems = null; + if (considerImplicitRoles) { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", null); + } + else { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", null); + } + // Build the new role to element, this is where we loop through all the elements and extract all the + // elements bsaed on roles. + if (roleToElems === null) { + // Re-initialize the roleToElems hash + roleToElems = {}; + // Get the body of the doc + var root = doc.body; + // Keep looping until we are at the very parent node of the entire page, so that we can loop through + // all the nodes. + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + // Build a nodewalter based of the root node, this node walter will be use loop over all the nodes + // and build the roles to Element coralation + var nw = new DOMWalker_1.DOMWalker(root); + // Loop over the entire doc/list of nodes to build the role to element map + // Note: This will build an roleToElems hash which is in the following format. + // roleToElems = { + // document: [{div},{abbr},{var}], + // main: [{div}], + // navigation: [{div}] + // } + while (nw.nextNode()) { + if (!nw.elem()) + continue; + // Only check the elements which have the role attribute assiciated to them + if (!nw.bEndTag) { + var wRoles = []; + //check if the node has role attributes + if (nw.elem() && nw.elem().hasAttribute("role")) { + // Extract all the roles that are assigned to this element, can have multiple roles on one + // element split by space, so we need to extract all of them into an array. + wRoles = nw.elem().getAttribute("role").split(" "); + } + if (nw.elem() && wRoles.length === 0 && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil_1.AriaUtil.getImplicitRole(nw.node); + if (implicitRole !== null && implicitRole.length > 0) + wRoles = implicitRole; + } + if (wRoles.length === 0) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Loop through all the roles and assigned this node to all thes roles + for (var i = 0; i < wRoles.length; ++i) { + // In the case that the role key is not already in the roleToElems hash, construct the + // add the key and assign empty array. + if (!(wRoles[i] in roleToElems)) { + roleToElems[wRoles[i]] = []; + } + // Add the node to the array for the role + roleToElems[wRoles[i]].push(nw.node); + } + } + } + // Set the roleToElems hash map as a global variable + if (considerImplicitRoles) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems); + } + else { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", roleToElems); + } + } + // Initilize the return value + var retVal = []; + // Handle the cases where the provided role is a string and not an array, + // for this case we take the string and put it into an array + if (typeof (roles) === "string") { + var role = roles; + roles = []; + roles.push(role); + } + // Loop through the roles that were provided and find the list of elements for this roles + // and add them to the return value. + if (roles.length) { + // loop over all the roles + for (var i = 0; i < roles.length; ++i) { + // Extract the role from the array + var nextRole = roles[i]; + // Fetch the list of all the elements for this role + var copyRoles = roleToElems[nextRole]; + // If there are elements to copy to another array, then perform the copy + if (copyRoles) { + // Loop over all the elements which are to be copied + for (var j = 0; j < copyRoles.length; ++j) { + // Add this element to the return val + retVal.push(copyRoles[j]); + } + } + } + } + return retVal; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * + */ + CommonUtil.isTarget = function (element) { + if (!element || element.nodeType !== 1 + || ["html", "body"].includes(element.nodeName.toLowerCase()) + || CommonUtil.getAncestor(element, ["svg", "pre", "code", "script", "meta", 'head']) !== null + || !VisUtil_1.VisUtil.isNodeVisible(element) || VisUtil_1.VisUtil.isNodeVisuallyHidden(element) + || CommonUtil.isNodeDisabled(element) || VisUtil_1.VisUtil.isElementOffscreen(element)) + return false; + if (CommonUtil.isClickable(element)) + return true; + var role = AriaUtil_1.AriaUtil.getResolvedRole(element); + if (!role) + return false; + var target_roles = ["listitem", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "treeitem"]; + if (target_roles.includes(role)) { + // find the proper parent elements + var parent_1 = element.parentElement; + if (parent_1) { + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + // datalist, fieldset, optgroup, etc. may be just used for grouping purpose, so go up to the parent + if (parent_role === 'group') + parent_1 = parent_1.parentElement; + } + if (parent_1 && CommonUtil.isTarget(parent_1)) + return true; + } + return false; + }; + CommonUtil.getFileExt = function (url) { + var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/); + if (m != null && m.length >= 2) { + return "." + m[1]; + } + return ""; + }; + CommonUtil.getFileAnchor = function (url) { + var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/); + if (m != null && m.length >= 2) { + return m[1]; + } + return ""; + }; + CommonUtil.checkObjEmbed = function (node, extTest, mimeTest) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName != "object" && nodeName != "embed" && + nodeName != "a" && nodeName != "area") + return false; + var retVal = false; + // Check mime type + if (!retVal && node.hasAttribute("type")) { + var mime = node.getAttribute("type").toLowerCase(); + retVal = mimeTest(mime); + } + if (!retVal && node.hasAttribute("codetype")) { + var mime = node.getAttribute("codetype"); + retVal = mimeTest(mime); + } + // Check the filename + if (!retVal) { + var filename = ""; + if (nodeName === "embed") { + filename = node.getAttribute("src"); + } + else if (nodeName === "a" || nodeName === "area") { + filename = node.getAttribute("href"); + } + else if (node.hasAttribute("data")) { + filename = node.getAttribute("data"); + } + if (filename === null) + filename = ""; + var ext = CommonUtil.getFileExt(filename); + retVal = extTest(ext); + } + // Check for filenames in the params + if (!retVal && nodeName === "object") { + // In the case that Check Hidden Option is set then comply with that setting + var params = CommonUtil.getChildByTagHidden(node, "param", false, true); + for (var i = 0; !retVal && params != null && i < params.length; ++i) { + retVal = params[i].hasAttribute("value") && + extTest(CommonUtil.getFileExt(params[i].getAttribute("value"))); + } + } + return retVal; + }; + CommonUtil.isAudioObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isAudioExt, function (mime) { + return mime.startsWith("audio"); + }); + }; + CommonUtil.isAudioExt = function (ext) { + var audio_extensions = [".aif", ".aifc", ".aiff", ".air", ".asf", ".au", ".cda", + ".dsm", ".dss", ".dwd", ".iff", ".kar", ".m1a", ".med", + ".mp2", ".mp3", ".mpa", ".pcm", ".ra", ".ram", ".rm", + ".sam", ".sf", ".sf2", ".smp", ".snd", ".svx", ".ul", + ".voc", ".wav", ".wma", ".wve" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), audio_extensions); + }; + CommonUtil.isVideoObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isVideoExt, function (mime) { + return mime.startsWith("video") || + mime.startsWith("application/x-shockwave-flash"); + }); + }; + CommonUtil.isVideoExt = function (ext) { + var video_extensions = [".asf", ".avi", ".divx", ".dv", ".m1v", ".m2p", ".m2v", ".moov", + ".mov", ".mp4", ".mpeg", ".mpg", ".mpv", ".ogm", ".omf", ".qt", + ".rm", ".rv", ".smi", ".smil", ".swf", ".vob", ".wmv", ".rmvb", + ".mvb" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), video_extensions); + }; + CommonUtil.isImageObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isImgExt, function (mime) { + return mime.startsWith("image"); + }); + }; + CommonUtil.isImgExt = function (ext) { + return CommonUtil.valInArray(ext.toLowerCase(), CommonUtil.image_extensions); + }; + CommonUtil.isHtmlExt = function (ext) { + var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), html_extensions); + }; + CommonUtil.hasTriggered = function (doc, id) { + return CacheUtil_1.CacheUtil.getCache(doc, id, false); + }; + CommonUtil.triggerOnce = function (doc, id, passed) { + if (passed) + return true; + var triggered = CacheUtil_1.CacheUtil.getCache(doc, id, false); + CacheUtil_1.CacheUtil.setCache(doc, id, true); + return triggered; + }; + /* determine if the given value exists in the given array */ + CommonUtil.valInArray = function (value, arr) { + for (var idx in arr) { + if (arr[idx] === value) + return true; + } + return false; + }; + /** + * return the ancestor of the given element + * @param tagNames string, array, or dictionary containing the tags to search for + */ + CommonUtil.getAncestor = function (element, tagNames) { + var walkNode = element; + while (walkNode !== null) { + var thisTag = walkNode.nodeName.toLowerCase(); + if (typeof (tagNames) === "string") { + if (thisTag === tagNames.toLowerCase()) { + break; + } + } + else if (tagNames.length) { + for (var idx in tagNames) { + if (tagNames[idx] === thisTag) + return walkNode; + } + } + else if (thisTag in tagNames) { + break; + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + // return true if element1 and element2 are siblings + CommonUtil.isSibling = function (element1, element2) { + if (element1 && element2) { + var node = null; + if (DOMWalker_1.DOMWalker.parentNode(element1) && DOMWalker_1.DOMWalker.parentNode(element1).firstChild) { + node = DOMWalker_1.DOMWalker.parentNode(element1).firstChild; + } + while (node) { + if (node === element2) + return true; + node = node.nextSibling; + } + } + return false; + }; + CommonUtil.isDescendant = function (parent, child) { + var node = DOMWalker_1.DOMWalker.parentNode(child); + while (node != null) { + if (node === parent) { + return true; + } + node = DOMWalker_1.DOMWalker.parentNode(node); + } + return false; + }; + //check if the first form control child is disabled + CommonUtil.isDisabledByFirstChildFormElement = function (element) { + var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + if (formElements.includes(nw.node.nodeName.toLowerCase())) { + if (CommonUtil.isNodeDisabled(nw.node)) + return true; + return false; + } + } + } + return false; + }; + CommonUtil.isDisabledByReferringElement = function (element) { + var id = element.getAttribute("id"); + var doc = element.ownerDocument; + var root = doc.body; + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + var nw = new DOMWalker_1.DOMWalker(root); + while (nw.nextNode()) { + // check the element whose 'aria-describedby' equals to the id + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var AriaDescribedbyIDArray = (nw.elem().getAttribute("aria-describedby") || "").split(" "); + if (AriaDescribedbyIDArray.includes(id) && CommonUtil.isNodeDisabled(nw.node)) { + return true; + } + } + } + }; + /** get element containing label for the given element + * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead + */ + CommonUtil.getInputLabel = function (element) { + return CommonUtil.getLabelForElement(element); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * Note: This is a wrapper function to: AriaUtil.getLabelForElementHidden + * + * @parm {element} element - The element for which to get the label element for. + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElement = function (element) { + return CommonUtil.getLabelForElementHidden(element, false); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * This function will return null if the containing lable element is hidden, when the ignoreHidden option + * is set to true. + * + * @parm {element} element - The element for which to get the label element for. + * @parm {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElementHidden = function (element, ignoreHidden) { + // Check if the global AriaUtil_LABELS hash is available, as this will contain the label nodes based on + // for attribute. + //if (!getCache(element.ownerDocument,"AriaUtil_LABELS", null)) { + var root = element.getRootNode(); + if (!CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", null)) { + // Variable Decleration + var idToLabel = {}; + // Get all the label elements in the entire doc + var labelNodes = CommonUtil.getDocElementsByTag(element, "label"); + // Loop over all the label nodes, in the case the label node has a for attribute, + // extract that attribute and add this node to the hash if it is visible. + for (var i = 0; i < labelNodes.length; ++i) { + if (labelNodes[i].hasAttribute("for")) { + // If ignore hidden is specified and the node is not visible we do not add it to the + // labelNodes hash. + if (ignoreHidden && !VisUtil_1.VisUtil.isNodeVisible(labelNodes[i])) { + continue; + } + idToLabel[labelNodes[i].getAttribute("for")] = labelNodes[i]; + } + } + // Add the built hash to the ownerDocument (document), to be used later to fast retrival + //setCache(element.ownerDocument, "AriaUtil_LABELS", idToLabel); + CacheUtil_1.CacheUtil.setCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", idToLabel); + } + // If this element has an id attribute, get the corosponding label element + if (element.hasAttribute("id")) { + // Fetch the id attribute + var ctrlId = element.getAttribute("id"); + // Return the corosponding label element. + // Note: in the case that the the id is not found in the hash that means, it does not exists or is hidden + if (ctrlId.trim().length > 0) { + //return getCache(element.getRootNode().ownerDocument,"AriaUtil_LABELS",{})[ctrlId]; + return CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", {})[ctrlId]; + } + } + return null; + }; + /* Return specified element attribute if present else return null */ + CommonUtil.getElementAttribute = function (element, attr) { + //return (element && element.hasAttribute && element.hasAttribute(attr)) ? element.getAttribute(attr) : null; + if (!attr || !element || !element.hasAttribute || !element.hasAttribute(attr)) + return null; + var atrValue = element.getAttribute(attr); + if (!ARIADefinitions_1.ARIADefinitions.referenceProperties.includes(attr)) + return atrValue; + //attr is a reference to other elements(s) + var values = atrValue.split(/ +/g); + //ignore if none of the referred element(s) exist or all point to the element itself + var exist = false; + for (var id = 0; values < values.length; ++id) { + var referred = document.getElementById(values[id]); + if (referred && !DOMUtil_1.DOMUtil.sameNode(referred, element)) { + exist = true; + break; + } + } + return exist ? atrValue : null; + }; + // Return true if element has valid implicit label + CommonUtil.hasImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + return CommonUtil.hasInnerContentHidden(parentClone); + } + else { + return false; + } + }; + // Return the implicit label of the given form field + CommonUtil.getImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + var label = CommonUtil.getInnerText(parentClone); + return label && label.trim() !== '' ? label.trim() : null; + } + else + return null; + }; + /** + * This function is responsible for getting the label for a form field element. + * + * + * @parm {element} element - The element from which to get the label. + * + * @return {string} text - return the label text or null + * + * @memberOf AriaUtil + */ + CommonUtil.getFormFieldLabel = function (elem) { + // get the label from the attribute "for" of the label element + // Get only the non-hidden labels for element + var value = ""; + var label = null; + var labelElem = CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + // value directly from element text + label = labelElem.innerText; // ignore hidden text + } + else { + /** if it's not label with for attribute, then find implicit label + * cases for explict label: + * <label for='my'></label><input id='my'/> + * <label for='my'><input id='my'/></label> + * cases for implicit label: + * <label><input /></label> + */ + labelElem = CommonUtil.getAncestor(elem, "label"); + if (labelElem && labelElem.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(labelElem, elem)) { + var parentClone = labelElem.cloneNode(true); + // exclude all the text from the first form element since they might also + // have inner content that is part of innerText + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + label = CommonUtil.getInnerText(parentClone); + } + else + return null; + } + if (label && label.trim() !== "") + value += label.trim(); + // value from child element attribute + label = CommonUtil.getLabelTextFromAttribute(labelElem, true); + if (label && label.trim() !== "") + value += label.trim(); + // wired case: get aria label from label element itself just in case (though name prohibited from aria in html) + label = AriaUtil_1.AriaUtil.getAriaLabel(labelElem); + if (label && label.trim() !== "") + value += label.trim(); + return value.trim(); + }; + /** + * calculate label from embedded control: https://w3c.github.io/accname/ + * @param {element} labelElem label element + * @param {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * @returns label text or '' + * + * note the assumption is the labelElem refers either to a labelled element by 'for' attribute + * or its first form field is labbelled element + */ + CommonUtil.getLabelTextFromAttribute = function (labelElem, ignoreHidden) { + // label either points to a labelable element by its for attribute or the first element child + // get the labelled elment if it's an implicit label + var labeledElem = null; + for (var i = 0; i < labelElem.children.length; i++) { + var child = labelElem.children.item(i); + if (CommonUtil.form_labelable_elements.includes(child.nodeName.toLowerCase())) { + labeledElem = child; + break; + } + } + var nw = new DOMWalker_1.DOMWalker(labelElem); + var text = ''; + while (nw.nextNode() && nw.node !== labelElem) { + // only check element children + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var elem = nw.elem(); + // ignore if it's hidden, or labelled element, or first form element if not labeled by for attribute + if ((ignoreHidden && (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) || VisUtil_1.VisUtil.isNodePresentational(elem))) + || (labeledElem && labeledElem.contains(elem))) + continue; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // textbox etc. return its text value + if (role === "textbox") { + var name_1 = elem.getAttribute("value"); + if (name_1 && name_1.trim().length > 0) + text += ' ' + name_1.trim(); + } + else if (role === "combobox" || role === "listbox") { + // for combobox or listbox roles, return the text alternative of the chosen option. + var selectedId = elem.getAttribute("aria-activedescendant") || elem.getAttribute("aria-selected") || elem.getAttribute("aria-checked"); + if (selectedId) { + var selectedOption = elem.ownerDocument.getElementById(selectedId); + if (selectedOption && !DOMUtil_1.DOMUtil.sameNode(elem, selectedOption)) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(selectedOption); + if (pair && pair.name) + text += ' ' + pair.name.trim(); + } + } + } + else if (["progressbar", "scrollbar", "slider", "spinbutton", "meter"].includes(role)) { + // for range role type, including "progressbar", "scrollbar", "slider", "spinbutton" roles + // If the aria-valuetext property is present, return its value + var value_1 = elem.getAttribute("aria-valuetext"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // Otherwise, if the aria-valuenow property is present, return its value, + value_1 = elem.getAttribute("aria-valuenow"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // finally use native value attribute + value_1 = elem.getAttribute("value"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + } + // get aria label from the element + var value = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (value && value.trim() !== "") + text += ' ' + value.trim(); + } + } + return text.trim(); + }; + CommonUtil.isFirstFormElement = function (parentNode, element) { + //let formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (parentNode.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(parentNode); + while (nw.nextNode()) { + if (CommonUtil.form_labelable_elements.indexOf(nw.node.nodeName.toLowerCase()) !== -1) { + return nw.node === element; + } + } + } + return false; + }; + // check if the element is a shadow host or descendant of a shadow host, but not a descedant of the shadow root of the host (to be assigned to shadow slot or ignored) + CommonUtil.isShadowHostElement = function (element) { + if (CommonUtil.isShadowElement(element)) + return false; + var walkNode = element; + while (walkNode) { + if (walkNode.shadowRoot) + return true; + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + //check if an element is in a shadow tree + CommonUtil.isShadowElement = function (element) { + var root = element.getRootNode(); + if (root.toString() === "[object ShadowRoot]") + return true; + return false; + }; + CommonUtil.removeAllFormElementsFromLabel = function (element) { + var formElements = ["input", "textarea", "select", "button", "datalist", "optgroup", "option", "keygen", "output", "progress", "meter"]; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; i++) { + if (formElements.indexOf(childNodes[i].nodeName.toLowerCase()) > -1) { + element.removeChild(childNodes[i]); + } + } + return element; + }; + /** + * @param element + * @param idStr + * @returns true if any one (if multiple Ids) id points to itself + */ + CommonUtil.isIdReferToSelf = function (element, idStr) { + if (!idStr || idStr.trim() === '') + return false; + var ids = idStr.trim().split(" "); + for (var j = 0, length_1 = ids.length; j < length_1; ++j) { + var referredNode = fragment_1.FragmentUtil.getById(element, ids[j]); + if (referredNode && DOMUtil_1.DOMUtil.sameNode(referredNode, element)) + return true; + } + return false; + }; + /* Determine the node depth of the given element */ + CommonUtil.nodeDepth = function (element) { + var depth = 0; + var walkNode = element; + while (walkNode !== null) { + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + depth = depth + 1; + } + return depth; + }; + /* compare node order of the 2 given nodes */ + /* returns + * 0 if the nodes are equal + * 1 if node b is before node a + * -1 if node a is before node b + * 2 if node a is nested in node b + * -2 if node b is nested in node a + * null if either node is null or their parent nodes are not equal + */ + CommonUtil.compareNodeOrder = function (nodeA, nodeB) { + if (nodeA === nodeB) + return 0; + var aDepth = CommonUtil.nodeDepth(nodeA); + var bDepth = CommonUtil.nodeDepth(nodeB); + if (bDepth > aDepth) { + for (var i = 0; i < bDepth - aDepth; ++i) + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + if (nodeA === nodeB) // Node B nested in Node A + return -2; + } + else if (aDepth > bDepth) { + for (var i = 0; i < aDepth - bDepth; ++i) + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + if (nodeA === nodeB) // Node A nested in Node B + return 2; + } + while (nodeA != null && nodeB != null && DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) { + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + } + if (nodeA === null || nodeB === null || DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) + return null; + while (nodeB != null && nodeB != nodeA) + nodeB = nodeB.previousSibling; + if (nodeB === null) // nodeB before nodeA + return 1; + else + return -1; + }; + /** + * Determine if the given attribute of the given element is not empty + * @memberOf AriaUtil + */ + CommonUtil.attributeNonEmpty = function (element, attrStr) { + return element.hasAttribute(attrStr) && element.getAttribute(attrStr).trim().length > 0; + }; + /* Return a pointer to the given frame, null if not found */ + CommonUtil.getFrameByName = function (ruleContext, frameName) { + var window = ruleContext.ownerDocument.defaultView; + var frameList = [window]; + var idx = 0; + while (idx < frameList.length) { + try { + if (frameList[idx].name === frameName) + return frameList[idx]; + for (var i = 0; i < frameList[idx].frames.length; ++i) { + try { + // Ensure it's a real frame and avoid recursion + if (frameList[idx].frames[i] && !frameList.includes(frameList[idx].frames[i])) { + frameList.push(frameList[idx].frames[i]); + } + } + catch (e) { } + } + } + catch (e) { } + ++idx; + } + return null; + }; + CommonUtil.defaultNSResolver = function (prefix) { + var uri; + switch (prefix) { + case 'html': + uri = 'http://www.w3.org/1999/xhtml'; + case 'x2': + uri = 'http://www.w3.org/TR/xhtml2'; + case 'x': + uri = 'http://www.w3.org/1999/xhtml'; + case 'xhtml': + uri = 'http://www.w3.org/1999/xhtml'; + default: + uri = null; + } + return uri; + }; + //checking if only the inner text is empty or not + CommonUtil.isInnerTextOnlyEmpty = function (element) { + // Get the innerText of the element + var text = element.innerText; + if ((text === undefined || text === null || text.trim().length === 0) && element.nodeName.toLowerCase() !== 'slot' && element.textContent !== undefined) { + //ignore slot because its text will be filled by the corresponding content in the light DOM + // innerText is sometimes 'undefined' in headless mode, or null if the element is invisible or not erxpanded + // so we try textContent as a workaround + text = element.textContent; + } + var retVal = !(text !== null && text.trim().length > 0); + if (element.nodeType === 1 && element.nodeName.toLowerCase() === "slot") { + //TODO: need to conside its own content, a slot may have its own content or assigned content + for (var _i = 0, _a = element.assignedNodes(); _i < _a.length; _i++) { + var slotElem = _a[_i]; + retVal = retVal && CommonUtil.isInnerTextEmpty(slotElem); + } + } + // Trim the inner text and verify that it is not empty. + return retVal; + }; + /* Return the inner text of the given element */ + CommonUtil.getInnerText = function (element) { + var retVal = element.innerText; + if (retVal === undefined || retVal === null || retVal.trim() === "") + retVal = element.textContent; + return retVal; + }; + /** + * return onscreen innerText only. + * This function should return the same result as innerText if no offscreen content exists + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {null | string} null if element has empty inner text, text otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.getOnScreenInnerText = function (element) { + if (!element) + return null; + if (element.nodeType === 3) + return element.nodeValue(); + var text = ""; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== element && nw.node !== element.parentNode) { + if (nw.bEndTag) + continue; + if (nw.node.nodeType === 1 && (VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nw.node.nodeName.toLowerCase()) || !VisUtil_1.VisUtil.isNodeVisible(nw.node) || VisUtil_1.VisUtil.isElementOffscreen(nw.node))) { + /** special case for svg <title> element: + * text in a <title> element is not rendered as part of the graphic, but browsers usually display it as a tooltip + * note some svg elements, such as title, desc, have a bounds {"left":0,"top":0,"height":0,"width":0} + */ + if (nw.node.nodeName.toLowerCase() === 'title' && CommonUtil.getAncestor(nw.node, "svg")) + continue; + if (nw.node.nextSibling) { + if (nw.node.nextSibling.nodeType === 3 && nw.node.nextSibling.nodeValue && nw.node.nextSibling.nodeValue.trim() !== '') + text += ' ' + nw.node.nextSibling.nodeValue.trim(); + nw.node = nw.node.nextSibling; + continue; + } + else + break; + } + if (nw.node.nodeType === 3 && nw.node.nodeValue && nw.node.nodeValue.trim() !== '') { + text += ' ' + nw.node.nodeValue.trim(); + } + } + return text.trim(); + }; + /** Return the text content of the given node + * this is different than innerText or textContent that return text content of a node and its descendants + */ + CommonUtil.getNodeText = function (element) { + if (!element) + return ""; + var text = ""; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType == 3) { + text += childNodes[i].nodeValue; + } + } + return text; + }; + /** + * This function is responsible for checking if elements inner text is empty or not. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isInnerTextEmpty = function (element) { + // Get the innerText of the element + var text = CommonUtil.getInnerText(element); + // Trim the inner text and verify that it is not empty. + return !(text != null && text.trim().length > 0); + }; + CommonUtil.hasInnerContent = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text !== null && text.trim().length > 0); + if (element.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode()) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + } + } + return hasContent; + }; + /** + * This function is responsible for determine if an element has inner content. + * This function also considers cases where inner text is hidden, which now will + * be classified as does not have hidden content. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.hasInnerContentHidden = function (element) { + return CommonUtil.hasInnerContentHiddenHyperLink(element, false); + }; + CommonUtil.svgHasName = function (element) { + return CommonUtil.attributeNonEmpty(element, "aria-label") + || CommonUtil.attributeNonEmpty(element, "aria-labelledby") + || !!element.querySelector(":scope > title"); + }; + CommonUtil.hasInnerContentHiddenHyperLink = function (element, hyperlink_flag) { + if (!element) + return false; + // Variable Decleration + var childElement = element.firstElementChild; + var hasContent = false; + // In the case that the childElement is not null then we need to check each of the elements + // to make sure that the elements are not all hidden. + if (childElement != null) { + // Get the nodewalter of the element node, so that we can loop over it and verify + // that the elements under the element are not completly hidden. + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the nodes until there are no more nodes or we have determine that there is content under + // this parent element. + while (!hasContent && nw.nextNode() && nw.node != element) { + // Get the next node + var node = nw.node; + // In the case an img element is present with alt then we can mark this as pass + // otherwise keep checking all the other elements. Make sure that this image element is not hidden. + hasContent = (node.nodeName.toLowerCase() === "img" + && (CommonUtil.attributeNonEmpty(node, "alt") || CommonUtil.attributeNonEmpty(node, "title")) + && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) || (node.nodeName.toLowerCase() === "svg" + && CommonUtil.svgHasName(node)); + // Now we check if this node is of type element, visible + if (!hasContent && node.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextOnlyEmpty(node); + if (!hasContent && hyperlink_flag === true) { + hasContent = CommonUtil.attributeNonEmpty(node, "aria-label") || CommonUtil.attributeNonEmpty(node, "aria-labelledby"); + var doc = node.ownerDocument; + if (doc) { + var win = doc.defaultView; + if (win) { + var cStyle = win.getComputedStyle(node); + if (!hasContent && cStyle != null) { + // console.log(cStyle.backgroundImage); + // console.log(cStyle.content) + hasContent = ((cStyle.backgroundImage && cStyle.backgroundImage.indexOf) || cStyle.content) && CommonUtil.attributeNonEmpty(node, "alt"); + } + } + } + } + } + // Check for cases where there is text node after an element under the parent + // In the case we detect nodetype as text node and the patent of the text node is + // the same element we are checking has Inner content for then get the inner content of this + // text node. + if (node.nodeType === 3 && DOMWalker_1.DOMWalker.parentElement(node) === element) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(node); + } + } + } + // In the case there are no child elements then we can simply perform the check for only innertext + // the img with alt case will be covered in the above if, as img is considers as an element. + else { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(element); + } + return hasContent; + }; + CommonUtil.hasInnerContentOrAlt = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text != null && text.trim().length > 0) || CommonUtil.attributeNonEmpty(element, "alt"); + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode() && nw.node != element) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + if (!hasContent + && (AriaUtil_1.AriaUtil.hasRole(nw.node, "button", true) || AriaUtil_1.AriaUtil.hasRole(nw.node, "textbox")) + && (AriaUtil_1.AriaUtil.hasAriaLabel(nw.node) || CommonUtil.attributeNonEmpty(nw.node, "title") || CommonUtil.getLabelForElementHidden(nw.elem(), true))) { + hasContent = true; + } + } + } + return hasContent; + }; + CommonUtil.concatUniqueArrayItem = function (item, arr) { + arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false; + return arr; + }; + CommonUtil.concatUniqueArrayItemList = function (itemList, arr) { + for (var i = 0; itemList !== null && i < itemList.length; i++) { + arr = CommonUtil.concatUniqueArrayItem(itemList[i], arr); + } + return arr; + }; + /** + * remove array items from a given array + * @param itemList items to be removed from arr + * @param arr the array + * @returns + */ + CommonUtil.reduceArrayItemList = function (itemList, arr) { + if (arr && arr.length > 0 && itemList && itemList.length > 0) { + var result = arr.filter(function (value) { + return !itemList.includes(value); + }); + return result; + } + return arr; + }; + CommonUtil.getScopeForTh = function (element) { + /** https://www.w3.org/TR/html5/tabular-data.html#header-and-data-cell-semantics + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a column header if any of the following conditions are true: + * * The cell's scope attribute is in the column state, or + * * The cell's scope attribute is in the auto state, and there are no data cells in any of + * the cells covering slots with y-coordinates y .. y+height-1. + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a row header if any of the following conditions are true: + * * The cell's scope attribute is in the row state, or + * * The cell's scope attribute is in the auto state, the cell is not a column header, and there are + * no data cells in any of the cells covering slots with x-coordinates x .. x+width-1. + */ + // Note: auto is default scope + // Easiest answer is if scope is specified + if (element.hasAttribute("scope")) { + var scope = element.getAttribute("scope").toLowerCase(); + if (scope === "row" || scope === 'rowgroup') + return "row"; + if (scope === "col" || scope === 'colgroup') + return "column"; + } + // scope is auto, default (without a scope) or invalid value. + // if all the sibling elements are th, then return "columnheader" + var siblings = __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName.toLowerCase() != "th"; }); + if (siblings === null || siblings.length === 0) + return "column"; + else + return "row"; + }; + CommonUtil.getControlOfLabel = function (node) { + // Handle the easy case of label -> for + var labelAncestor = CommonUtil.getAncestor(node, "label"); + if (labelAncestor && labelAncestor.hasAttribute("for")) { + return fragment_1.FragmentUtil.getById(node, labelAncestor.getAttribute("for")); + } + // Create a dictionary containing ids of parent nodes + var idDict = {}; + var parentWalk = node; + while (parentWalk) { + if (parentWalk.nodeType === 1 /* Node.ELEMENT_NODE */) { + var ancestor = parentWalk; + if (ancestor.hasAttribute("id")) { + idDict[ancestor.getAttribute("id")] = true; + } + } + parentWalk = DOMWalker_1.DOMWalker.parentNode(parentWalk); + } + // Early return if no ancestor IDs found + if (Object.keys(idDict).length === 0) { + return null; + } + // Cache aria-labelledby attribute if node is an element + var nodeAriaLabelledBy = node.nodeType === 1 ? node.getAttribute("aria-labelledby") : null; + // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids + var inputsUsingLabelledBy = CacheUtil_1.CacheUtil.getSetCache(node.ownerDocument, "CommonUtil::getControlOfLabel", function () { return node.ownerDocument.querySelectorAll("*[aria-labelledby]"); }); + for (var idx = 0; idx < inputsUsingLabelledBy.length; ++idx) { + var inputUsingLabelledBy = inputsUsingLabelledBy[idx]; + var ariaLabelledBy = inputUsingLabelledBy.getAttribute("aria-labelledby"); + var sp = ariaLabelledBy.split(" "); + for (var _i = 0, sp_1 = sp; _i < sp_1.length; _i++) { + var id = sp_1[_i]; + if (id in idDict && !CommonUtil.isIdReferToSelf(node, nodeAriaLabelledBy)) { + return inputUsingLabelledBy; + } + } + } + // Find the cases where we're within an aria labelledby + return null; + }; + /** + * This function is responsible for checking if the node that is provied is + * disabled or not. Following is how the check is performed: + * 1. Check if the current node is disabled with the following options: + * attribute --> disabled + * Also needs to be "button", "input", "select", "textarea", "optgroup", "option", + * "menuitem", "fieldset" nodes (in array elementsAllowedDisabled) + * attribute --> aria-disabled="true" + * 2. Check if any of the current nodes parents are disabled with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are disabled then this + * function will return true (node is disabled). + * + * @parm {HTMLElement} node - The node which should be checked if it is disabled or not. + * @return {bool} true if the node is disabled, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isNodeDisabled = function (node) { + // Set PT_NODE_DISABLED to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is disabled. We have to set it to false so that we know + // the node has already been checked. Only set it to false if the setting is undefined or null + // as if it is defined we do not wnat to reset it. As if it is true then we should make use of it + // to speed up the check. + var PT_NODE_DISABLED = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_DISABLED", undefined); + if (typeof PT_NODE_DISABLED !== "undefined") + return PT_NODE_DISABLED; + PT_NODE_DISABLED = false; + // Check the nodeType of this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // disabled is directly related to the parent node. + if (node.nodeType === 3) { + node = DOMWalker_1.DOMWalker.parentNode(node); + } + // Variable Declaration + var nodeName = node.nodeName.toLowerCase(); + // Get the disabled element property, disabled and aria-disabled attribute and check that it is true + var disabledAttribute = node.hasAttribute("disabled"); + var disabledPropertyCustom = PT_NODE_DISABLED; + var ariaDisabledAttribute = node.hasAttribute('aria-disabled') && node.getAttribute("aria-disabled") === 'true'; + // If this node has disabled attribute and the node allows disabled attribute, then return true. + // Disabled attribute is only allowed on "button", "input", "select", "textarea", "optgroup", "option", "menuitem", "fieldset" + // In the case aria-disabled is set to true, then also return true + if (disabledPropertyCustom || (disabledAttribute && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(nodeName) > -1) || ariaDisabledAttribute) { + PT_NODE_DISABLED = true; + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // disabled attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is disabled or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // Check upwards recursively, and save the results in an variable + var nodeDisabled = CommonUtil.isNodeDisabled(parentElement); + // If the node is found to be disabled then add the custom PT_NODE_DISABLED to true. + // so that we can use this next time, to quickly determine if node is disabled or not. + // This is extra percaution, the isNodeDisabled function already sets this. + if (nodeDisabled) { + PT_NODE_DISABLED = true; + } + // Check upwards recursively + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return nodeDisabled; + } + // Return false (node is not disabled) + return false; + }; + /** + * This function is responsible for determine if hidden content should be checked + * in rules. + * + * @parm {element} node - A node so that the document can be accessed to check for the + * option. Can be document element or a simple node element. + * @return {bool} true if hidden content should be checked, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldCheckHiddenContent = function (node) { + return false; + }; + /** + * This function is responsible for determining if node should be skipped from checking or not, based + * on the Check Hidden Content settings and if the node is visible or not. + * + * @parm {element} node - Node to check if it is visible or not based on the Check Hidden Content + * setting. + * + * @return {bool} true if node should be skipped, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldNodeBeSkippedHidden = function (node) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we + // return true to identify that the node should not be scanned/added to any hash/array. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (!CommonUtil.shouldCheckHiddenContent(node) && !VisUtil_1.VisUtil.isNodeVisible(node)) { + return true; + } + return false; + }; + CommonUtil.isfocusableByDefault = function (node) { + var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area']; + if (node.nodeName.toLowerCase() === "a" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (node.nodeName.toLowerCase() === "area" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (focusableElements.indexOf(node.nodeName.toLowerCase()) !== -1) + return true; + return false; + }; + /** + * This function check if a non-tabable node has valid tabable content. + * If it is tabable (the tabindex is not speicified or is not -1), returns false; + * If it is non-tabable, but a child is tabable and does not have element content, returns false; + * Otherwise, returns true. + */ + CommonUtil.nonTabableChildCheck = function (element) { + if (!element.hasAttribute("tabindex") || + (parseInt(element.getAttribute("tabindex")) != -1)) { + return false; + } + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + var child = nw.elem(); + if (child === null) { // Text node. usually is a cartridge return. + continue; + } + if (child.hasAttribute("tabindex") && + (parseInt(child.getAttribute("tabindex")) != -1) && + !CommonUtil.hasInnerContent(child)) { + return false; + } + } + return true; + }; + CommonUtil.hasAttribute = function (element, attributeName) { + var hasAttribute = false; + if (element.hasAttribute) { + hasAttribute = element.hasAttribute(attributeName); + } + else if (element.attributes && element.attributes.getNamedItem) { + var attr = element.attributes.getNamedItem(attributeName); + hasAttribute = attr && attr.specified; + } + return hasAttribute; + }; + // truncate the given text to a given number of characters + // return truncated text to 150 chars, same with the media_alt_brief rule + CommonUtil.truncateText = function (text, len) { + if (len === void 0) { len = 150; } + if (!text) + return text; + text = text.trim(); + if (text.length > len) + return text.substring(0, len - 1) + "..."; + return text; + }; + CommonUtil.input_type_with_placeholder = ["text", "search", "tel", "url", "email", "password", "number"]; + CommonUtil.input_text_types = [ + "text", "file", "password", + "checkbox", "radio", + "search", "tel", "url", "email", + "date", "number", "range", + "time", "color" + ]; + CommonUtil.input_time_types = [ + "date", "month", "week", "time", "datetime-local" + ]; + CommonUtil.input_other_types = [ + "range", "color", "checkbox", "radio", "file", "image" + ]; + CommonUtil.form_button_types = [ + "button", "reset", "submit" + ]; + CommonUtil.form_labelable_elements = ["input", "textarea", "select", "keygen", "progress", "meter", "output", "button"]; + CommonUtil.tabTagMap = { + "button": function (element) { + return !element.hasAttribute("disabled"); + }, + "iframe": true, + "input": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + if (element.getAttribute("type") === "radio") { + var name_2 = element.getAttribute("name"); + if (!name_2 || name_2.trim().length === 0) + return true; //single radio, no group + var doc = element.ownerDocument; + var group = doc.querySelectorAll("input[type='radio'][name='" + name_2.trim() + "']"); + if (group.length === 0 || group.length === 1) + return true; //single radio with the name, no others in group + var checked = null; + for (var i = 0; i < group.length; i++) { + if (group[i].checked) + checked = group[i]; + } + //only last one applies if multiple radios with 'checked' attributes + if (checked !== null) { + if (DOMUtil_1.DOMUtil.sameNode(checked, element)) + return true; + return false; + } + else { + // if nothing checked yet, return true if it's the first element + if (DOMUtil_1.DOMUtil.sameNode(group[0], element)) + return true; + return false; + } + } + else + return true; + }, + "select": function (element) { + return !element.hasAttribute("disabled"); + }, + "textarea": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + return true; + }, + /**"div": function (element) { + return element.hasAttribute("contenteditable"); + },*/ + "a": function (element) { + // xlink:href?? see svg + return element.hasAttribute("href"); + }, + "area": function (element) { + return element.hasAttribute("href"); + }, + "audio": function (element) { + return element.hasAttribute("controls"); + }, + "video": function (element) { + return element.hasAttribute("controls"); + }, + "summary": function (element) { + // first summary child of a details element is automatically focusable + return element.parentElement && element.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], element.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], element); + }, + "details": function (element) { + //details element without a direct summary child is automatically focusable + return element.children && __spreadArray([], element.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; }).length === 0; + } + }; + CommonUtil.image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"]; + return CommonUtil; +}()); +exports.CommonUtil = CommonUtil; + + +/***/ }, + +/***/ "./src/v4/util/TableUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/TableUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableUtil = void 0; +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var TableUtil = /** @class */ (function () { + function TableUtil() { + } + TableUtil.isDataTable = function (tableNode) { + return !(AriaUtil_1.AriaUtil.hasRole(tableNode, "none") || AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation")); + }; + /* + * A complex data table is a data table with any of the following characteristics: + * + * a thead element that contains two or more tr elements + * a table with more than one thead element + * a table with two or more tr elements that contain only th elements + * a th or td element with a rowspan or colspan attribute + * a tr element that contains at least one td element and two or more th elements + * a table with headers not located in the first row or first column + * a td element with a headers attribute value that contains more than two IDREFs + */ + TableUtil.isComplexDataTable = function (table) { + if ("AriaUtil_isComplexDataTable" in table) { + return !!table.AriaUtil_isComplexDataTable; + } + var isComplexTable = false; + if (table && TableUtil.isDataTable(table)) { + var thNodes = null, tdNodes = null; + var trNodes = table.getElementsByTagName("tr"); + var trNodeCount = trNodes.length; + var tdNodeCount = 0, thNodeCount = 0, trNodesHavingOnlyThNodes = 0; + for (var i = 0; !isComplexTable && i < trNodeCount; ++i) { + thNodes = trNodes[i].getElementsByTagName("th"); + tdNodes = trNodes[i].getElementsByTagName("td"); + thNodeCount = thNodes.length; + tdNodeCount = tdNodes.length; + if (tdNodeCount !== 0) { + // a tr element that contains at least one td element and two or more th elements; + isComplexTable = thNodeCount > 1; + // a th element with a rowspan or colspan attribute + for (var j = 0; !isComplexTable && j < thNodeCount; ++j) { + isComplexTable = ((thNodes[j].hasAttribute("rowspan") || + thNodes[j].hasAttribute("colspan")) && + CommonUtil_1.CommonUtil.getAncestor(thNodes[j], "table") === table); + } + // a td element with a rowspan or colspan attribute + // a td element with a headers attribute value that contains more than two IDREFs + for (var k = 0; !isComplexTable && k < tdNodeCount; ++k) { + isComplexTable = ((tdNodes[k].hasAttribute("rowspan") || + tdNodes[k].hasAttribute("colspan") || + (tdNodes[k].hasAttribute("headers") && CommonUtil_1.CommonUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[k], "table") === table); + } + } + else { + // two or more tr elements that contain only th elements + if (thNodeCount > 0) { + ++trNodesHavingOnlyThNodes; + } + isComplexTable = trNodesHavingOnlyThNodes === 2; + } + } + if (!isComplexTable) { + var theadNodes = table.getElementsByTagName("thead"); + var theadNodesLength = theadNodes.length; + if (theadNodesLength > 0) { + // table has more than one thead element + isComplexTable = theadNodesLength > 1; + // a thead element that contains two or more tr elements + if (!isComplexTable) { + isComplexTable = theadNodes[0].getElementsByTagName("tr").length > 1; + } + } + } + if (!isComplexTable && trNodeCount !== 0) { + // a table with headers not located in the first row or first column + isComplexTable = thNodeCount > 0 && !TableUtil.tableHeaderExists(table); + } + } + table.AriaUtil_isComplexDataTable = isComplexTable; + return isComplexTable; + }; + // Return true if a table cell is hidden or contain no data: <td></td> + TableUtil.isTableCellEmpty = function (cell) { + if (!cell || !VisUtil_1.VisUtil.isNodeVisible(cell) || cell.innerHTML.replace(/&nbsp;/g, ' ').trim().length === 0) + return true; + return false; + }; + // Return true if a table row is hidden or contain no data: <tr /> or <tr><td></td><td></td></tr> + TableUtil.isTableRowEmpty = function (row) { + if (!row || !row.cells || row.cells.length === 0 || !VisUtil_1.VisUtil.isNodeVisible(row)) + return true; + var passed = true; //empty + for (var c = 0; passed && c < row.cells.length; c++) { + var cell = row.cells[c]; + passed = TableUtil.isTableCellEmpty(cell); + } + return passed; + }; + // Return true if a table's header is in the first row or column + TableUtil.tableHeaderExists = function (ruleContext) { + var rows = ruleContext.rows; + if (!rows || rows.length === 0) + return null; + // note that table.rows return all all the rows in the table, + // including the rows contained within <thead>, <tfoot>, and <tbody> elements. + //case 1: headers are in the very first row with data in tbody or thead, but not in tfoot + //get the first row with data, ignoring the rows with no data + var passed = true; + var firstRow = rows[0]; + for (var r = 0; passed && r < rows.length; r++) { + firstRow = rows[r]; + // ignore the rows from tfoot + if (firstRow.parentNode && firstRow.parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + passed = TableUtil.isTableRowEmpty(firstRow); + } + //table contain no data: <table><tr><td></td><td></td></tr></table> + if (passed) + return null; + // Check if the cells with data in the first data row are all TH's + passed = true; + for (var r = 0; passed && r < firstRow.cells.length; r++) { + var cell = firstRow.cells[r]; + passed = TableUtil.isTableCellEmpty(cell) || cell.nodeName.toLowerCase() === 'th'; + } + if (passed) + return true; + // Case 2: headers are in the first column with data + // Assume that the first column has all TH's or a TD without data in the first column. + passed = true; + for (var i = 0; passed && i < rows.length; ++i) { + // ignore the rows from tfoot + if (rows[i].parentNode && rows[i].parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + // If no cells in this row, or no data at all, that's okay too. + passed = !rows[i].cells || + rows[i].cells.length === 0 || + rows[i].cells[0].innerHTML.trim().length === 0 || + rows[i].cells[0].nodeName.toLowerCase() != "td"; + } + if (passed) + return true; + //case 3: all td data cells have headers attributes that point to the id of a th element in the same table. + // https://html.spec.whatwg.org/multipage/tables.html#attributes-common-to-td-and-th-elements + passed = true; + var thIds = []; + var tdHeaders = []; + for (var r = 0; passed && r < rows.length; r++) { + var row = rows[r]; + // Check if the cells with data in the last data row are all TH's + for (var c = 0; c < row.cells.length; c++) { + var cell = row.cells[c]; + if (TableUtil.isTableCellEmpty(cell)) + continue; + if (cell.nodeName.toLowerCase() === 'td') { + if (!cell.getAttribute('headers') || cell.getAttribute('headers').trim().length === 0) + passed = false; + else + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(cell.getAttribute('headers').trim().split(" "), tdHeaders); + } + else if (cell.nodeName.toLowerCase() === 'th' && cell.getAttribute('id') && cell.getAttribute('id').trim().length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItem(cell.getAttribute('id').trim(), thIds); + } + } + if (passed) { // all td elements have headers, to exam if the headers point to a th id + if (thIds.length > 0 && tdHeaders.every(function (header) { return thIds.includes(header); })) + return true; + } + return false; + }; + TableUtil.isLayoutTable = function (tableNode) { + return AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation") || AriaUtil_1.AriaUtil.hasRole(tableNode, "none"); + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + TableUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + return TableUtil; +}()); +exports.TableUtil = TableUtil; + + +/***/ }, + +/***/ "./src/v4/util/VisUtil.ts" +/*!********************************!*\ + !*** ./src/v4/util/VisUtil.ts ***! + \********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + 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. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VisUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ./CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ClipPathUtil_1 = __webpack_require__(/*! ./ClipPathUtil */ "./src/v4/util/ClipPathUtil.ts"); +var VisUtil = /** @class */ (function () { + function VisUtil() { + } + /** + * This function is responsible for checking if the node that is provied is + * visible or not. Following is how the check is performed: + * 1. Check if the current node is hidden with the following options: + * CSS --> dislay: none + * CSS --> visibility: hidden + * attribute --> hidden + * 2. Check if the any of the current nodes parents are hidden with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are hidden then this + * function will return false (node is not visible). + * + * Note: nodes with CSS properties opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * Note: nodes hidden off screen or behind another object: they are not considered hidden. + * They are exposed in the accessibility tree and they can even name on-screen objects. + * + * @parm {element} node The node which should be checked if it is visible or not. + * @return {bool} false if the node is NOT visible, true otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisible = function (nodeIn) { + // Check the nodeType if this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // visibility is directly related to the parent node. + if (nodeIn.nodeType === 3) { + nodeIn = DOMWalker_1.DOMWalker.parentNode(nodeIn); + } + var node = nodeIn; + // We should only allow nodeType element, and TextNode all other nodesTypes + // we can return the visibility as visible. + // Following nodes will be returned as visable by default, since we can not + // actually change their visibility. + // Node.PROCESSING_INSTRUCTION_NODE --> 7 + // Node.COMMENT_NODE --> 8 + // 9 /* Node.DOCUMENT_NODE */ --> 9 + // Node.DOCUMENT_TYPE_NODE --> 10 + // Node.DOCUMENT_FRAGMENT_NODE --> 11 + if (node.nodeType !== 1) { + return true; + } + // Make sure that the ownerDocument is present before moving forward + // in detecting if the node is visible or not. In the case that ownerDocument + // does not exist then we simply return node is visible by default. + if (!node.ownerDocument) { + return true; + } + // Variable Declaration + var compStyle; + var nodeName = node.nodeName.toLowerCase(); + // In the case this node is a script, link or style node, right away return node is visible + // because scripts, links and style nodes can not be hidden by HTML attribute or CSS or are hidden by default. But we want to scan + // the elements everytime as they render content still which is still visible to users. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // datalist --> In the rendering, the datalist element represents nothing and it, along with its children, should be hidden. + if (VisUtil.hiddenByDefaultElements != null && VisUtil.hiddenByDefaultElements != undefined && VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) { + //return true; + return false; + } + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined); + if (cacheVal !== undefined) { + return cacheVal; + } + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + cacheVal = CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + // Check if this node is visible, we check couple of CSS properties and hidden attribute. + // area, param and audio elements we do not check if they are hidden as it does not apply to them. + // Check the unhideableElements array which is part of the rules, to check if this element is allowed to be hidden or not + // in the case that the element is part of the unhideableElements array then we do not run the hidden check on this element, + // and go stright to the parent node. + // Array check elements like: + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // In the case that unhideableElements array is not defined then we just scan all elements and do no filtering at all. + if (VisUtil.unhideableElements === null || VisUtil.unhideableElements === undefined || VisUtil.unhideableElements.indexOf(nodeName) === -1) { + // Check if defaultView exists for this node, if it does then use this to run the getComputedStyle + // function to get the CSS style for the node. + if (node.ownerDocument.defaultView) { + // Run the getComputedStyle on this node to fetch the CSS compuation of the node + compStyle = node.ownerDocument.defaultView.getComputedStyle(node, null); + } + // In the case that defaultView does not exists return true to identify that this + // node is visible, because were not able to detect if it was not. + else { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // Get the hidden element property and hidden attribute + var hiddenAttribute = node.getAttribute("hidden"); + var hiddenPropertyCustom = cacheVal; + // To get the hidden property we need to perform a special check as in some cases the hidden property will not be + // a boolean, for theses cases we set it to false as we are not able to determine the true hidden condition. + // The reason for this is because form elements are able to perform an override, so when we have id="hidden" for an element + // which is under the form element then, node.hidden gives the element/list of elements which have id="hidden". Refer to + // mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1267356 + var hiddenProperty = typeof node.hidden === "boolean" ? node.hidden : false; + // If compStyle object is empty, node does't have hidden property, node does't have hidden attribute and does't have custom PT + // hidden property then we can just return true (node visible) at this point. + if (!compStyle && + !hiddenProperty && // this covers false, null, or undefined + (hiddenAttribute === null || hiddenAttribute === undefined) && + !hiddenPropertyCustom // This covers false, null or undefined + ) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // In the case that the compStyle is defined we check the following: + // CSS style display set to none + // CSS style visibility set to hidden + // Note: For this property since it is inherited, need to skip the check on parents as + // the parent can have hidden but the child can be visible. So we only check this property + // on child elements/elements that are passed to this function the first time. + // node hidden property set (node.hidden) + // node attribute hidden set (to any value) + // node custom hidden property ser (node.PT_NODE_HIDDEN) + // If any of the above conditions are true then we return false as this element is not visible + if ((compStyle !== null && ((compStyle.getPropertyValue('display') === 'none' || + (!CacheUtil_1.CacheUtil.getCache(node, "Visibility_Check_Parent", null) && compStyle.getPropertyValue('visibility') === 'hidden'))) || + (compStyle.getPropertyValue('display') !== 'block' && (hiddenProperty || hiddenAttribute != null || hiddenPropertyCustom)))) { + // Set a custom expandos property on the the node to identify that it is hidden, so that we can uses + // use this in the rules to determine if the node is hidden or not, if we need to. + // Use expandos property instead of a hash map which stores the elements, adding/checking expandos + // properties is a lot faster performance whise. For Hash map we need to store based on xpath, and to calculate + // xpath it is more performance impact. + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check content-visibility: if the content-visibility is hidden, then, return false as the element is not visible + if (VisUtil.isContentHidden(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check hidden by clip-path + // TODO: need to check if hidden content contains focusable elements, similarly to offscreen content + if (ClipPathUtil_1.ClipPathUtil.isNodeVisuallyHiddenByClipPath(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is visible or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // When we have a parent element going through the isNodeVisible function we have to mark it as such + // so that in the function we can skip checking visibility: hidden for parent elements since visibility: hidden + // is inherited, which allows a child to have a different setting then the child. This property only needs to be checked + // once for the first element that is passed down and that is all. Ignore it for all the parents that we iterate over. + CacheUtil_1.CacheUtil.setCache(parentElement, "Visibility_Check_Parent", true); + // Check upwards recursively, and save the results in an variable + var nodeVisible = VisUtil.isNodeVisible(parentElement); + // If the node is found to not be visible then add the custom PT_NODE_HIDDEN to true. + // so that we can use this in the rules. + // if (!nodeVisible) { + // CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + // } + // Check upwards recursively + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", nodeVisible); + } + // Return true (node is visible) + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + }; + /** + * This function is responsible for checking if the node that is visually hidden by clipping or opaq: + * 1. Check if the current node is visually hidden: + * CSS --> clip: rect(0px, 0px, 0px, 0px) + * CSS --> opacity: 0 + * + * Note: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note: nodes with CSS properties clip: rect(0px, 0px, 0px, 0px) or opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden to an AT. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * @parm {element} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisuallyHidden = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN", undefined); + if (hidden === undefined) { + // defined styles only give the styles that changed + var comp_styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if ((comp_styles['position'] === 'absolute' && comp_styles['clip'] && comp_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)') + || (comp_styles['opacity'] && parseFloat(comp_styles['opacity']) < 0.1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", true); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentElement(elem); + if (!parentElement) + return false; + // Check upwards recursively + var hid = VisUtil.isNodeVisuallyHidden(parentElement); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", hid); + return hid; + } + return hidden; + }; + /** + * return true if the node or its ancestor is hidden by CSS content-visibility:hidden + * At this time, CSS content-visibility is partially supported by Chrome & Edge, but not supported by Firefox + * The implementation TEMPORARILY follows the Chrome test results: + * if content-visibility:hidden + * if the element is block-level (default or specified by the user), then the element and its children are normally hidden; + * if the element is inline (default or specified by the user), then the element and its children are normally NOT hidden; + * + * @param node + */ + VisUtil.isContentHidden = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_ContentHidden", undefined); + if (vis !== undefined) + return vis; + var style = getComputedStyle(node); + if (!style) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var content_visibility = style.getPropertyValue("content-visibility"); + if (content_visibility !== 'hidden') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var display = style.getPropertyValue("display"); + // inline element only + if (display === 'inline') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", true); + return true; + }; + /** + * return true if the node is offscreen by CSS position + * @param node + */ + VisUtil.isElementOffscreen = function (node) { + if (!node) + return true; + if (node.nodeType !== 1) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_Offscreen", undefined); + if (vis !== undefined) + return vis; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(node); + if (!bounds) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + if (bounds['height'] === 0 || bounds['width'] === 0 || (bounds['top'] + bounds['height']) <= 0 || (bounds['left'] + bounds['width']) <= 0) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodeHiddenFromAT = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HiddenFromAT", undefined); + if (vis !== undefined) + return vis; + if (!VisUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + var ancestor = DOMUtil_1.DOMUtil.getAncestorWithAttribute(node, "aria-hidden", "true"); + if (ancestor) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodePresentational = function (node) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(node); + if (role && (role === 'none' || role === 'presentation')) + return true; + return false; + }; + /** + * return true if the element is scrollable + * @param node + */ + VisUtil.isElementScrollable = function (elem) { + if (!elem) + return false; + var styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if (!styles) + return false; + var x_scroll = styles.getPropertyValue('overflow-x'); + var y_scroll = styles.getPropertyValue('overflow-y'); + //console.log("before node="+ elem.nodeName +", id="+elem.getAttribute("id") +", x_scroll="+x_scroll + ", y_scroll="+y_scroll); + // If overflow-y is hidden, scroll, or auto, and the overflow-x property is visible (default), the value will be implicitly computed as auto. + if (x_scroll === 'visible' && (y_scroll === 'hidden' || y_scroll === 'scroll' || y_scroll === 'auto')) + x_scroll = 'auto'; + // If overflow-x is hidden, scroll, or auto and the overflow-y property is visible (default), the value will be implicitly computed as auto. + if (y_scroll === 'visible' && (x_scroll === 'hidden' || x_scroll === 'scroll' || x_scroll === 'auto')) + y_scroll = 'auto'; + // setting overflow to clip in one direction when it isn't set to visible or clip in the other direction results in the clip value behaving as hidden. + if (x_scroll === 'clip' && y_scroll !== 'visible' && y_scroll !== 'clip') + x_scroll = 'hidden'; + if (y_scroll === 'clip' && x_scroll !== 'visible' && x_scroll !== 'clip') + y_scroll = 'hidden'; + // not scrollable: no scroll bars + if ((x_scroll === 'visible' || x_scroll === 'hidden' || x_scroll === 'clip') + && (y_scroll === 'visible' || y_scroll === 'hidden' || y_scroll === 'clip')) + return false; + // false if the overall scrollable element (clientWidth + scrollbarWidth and clientHeight + scrollbarHeight) is too small to be visible on screen + if (Math.max(elem.offsetWidth, elem.offsetHeight) < 30 || Math.min(elem.offsetWidth, elem.offsetHeight) < 15) + return false; + // false if content is smaller than the scrollable container: both x and y scroll distances < element's horizontal/vertical padding + var padding_x = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingLeft, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingRight, elem); + var padding_y = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingTop, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingBottom, elem); + if (elem.scrollWidth - elem.clientWidth < 1 + padding_x + && elem.scrollHeight - elem.clientHeight < 1 + padding_y) + return false; + return true; + }; + // This list contains a list of element tags which can not be hidden, when hidden is + // added to theses elements it does not do anything at all. + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // Note: All element tags that are added here should be added as lowercase, as we are using indexOf to do the check. + VisUtil.unhideableElements = ['area', 'param', 'audio']; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + // on theses elements we need to make then visible by default so that the rules can trigger regardless of the + // Check Hidden Content option in the tools. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // head --> head elements have display: none by default, but it will still behave correct + // title --> title elements have display: none by default, but it will still display the title. remove title from the list because a title can be a child of a svg element too + // meta --> meta elements have display: none by default, but it will still perform the action that meta is suppose to + // base --> base elements have display: none by default, but it will still perform the action that meta is suppose to + // noscript --> noscript elements have display: none by default, but it will still perform the action that meta is suppose to + // template --> template elements have display: none by default, because they are just a mechanism for holding client-side content + // that is not to be rendered when a page is loaded. https://developer.mozilla.org/en/docs/Web/HTML/Element/template + // datalist --> datalist elements have display: none by default, + VisUtil.hiddenByDefaultElements = ['script', 'link', 'style', 'head', 'meta', 'base', 'noscript', 'template', 'datalist']; + return VisUtil; +}()); +exports.VisUtil = VisUtil; + + +/***/ }, + +/***/ "./src/v4/sc-urls.json" +/*!*****************************!*\ + !*** ./src/v4/sc-urls.json ***! + \*****************************/ +(module) { + +module.exports = /*#__PURE__*/JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}'); + +/***/ } + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ const __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ const cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ const module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ if (!(moduleId in __webpack_modules__)) { +/******/ delete __webpack_module_cache__[moduleId]; +/******/ const e = new Error("Cannot find module '" + moduleId + "'"); +/******/ e.code = 'MODULE_NOT_FOUND'; +/******/ throw e; +/******/ } +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +let __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +let exports = __webpack_exports__; +/*!**********************!*\ + !*** ./src/index.ts ***! + \**********************/ + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + 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. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkDemo = exports.SRViewer = exports.SRCursor = exports.SRController = exports.DOMWalker = exports.Config = exports.ARIAMapper = exports.Checker = exports.Context = void 0; +var Context_1 = __webpack_require__(/*! ./v2/common/Context */ "./src/v2/common/Context.ts"); +Object.defineProperty(exports, "Context", ({ enumerable: true, get: function () { return Context_1.Context; } })); +// import { Simulator } from "./v2/simulator" +var Checker_1 = __webpack_require__(/*! ./v4/checker/Checker */ "./src/v4/checker/Checker.ts"); +Object.defineProperty(exports, "Checker", ({ enumerable: true, get: function () { return Checker_1.Checker; } })); +var ARIAMapper_1 = __webpack_require__(/*! ./v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +Object.defineProperty(exports, "ARIAMapper", ({ enumerable: true, get: function () { return ARIAMapper_1.ARIAMapper; } })); +var Config_1 = __webpack_require__(/*! ./v2/config/Config */ "./src/v2/config/Config.ts"); +Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return Config_1.Config; } })); +var DOMWalker_1 = __webpack_require__(/*! ./v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +Object.defineProperty(exports, "DOMWalker", ({ enumerable: true, get: function () { return DOMWalker_1.DOMWalker; } })); +var SRController_1 = __webpack_require__(/*! ./v4/simulator/SRController */ "./src/v4/simulator/SRController.ts"); +Object.defineProperty(exports, "SRController", ({ enumerable: true, get: function () { return SRController_1.SRController; } })); +var SRCursor_1 = __webpack_require__(/*! ./v4/simulator/SRCursor */ "./src/v4/simulator/SRCursor.ts"); +Object.defineProperty(exports, "SRCursor", ({ enumerable: true, get: function () { return SRCursor_1.SRCursor; } })); +var SRViewer_1 = __webpack_require__(/*! ./v4/simulator/SRViewer */ "./src/v4/simulator/SRViewer.ts"); +Object.defineProperty(exports, "SRViewer", ({ enumerable: true, get: function () { return SRViewer_1.SRViewer; } })); +function checkDemo(timeout) { + if (!timeout) + timeout = 0; + var checker = new Checker_1.Checker(); + setTimeout(function () { + checker.check(document.documentElement, ["IBM_Accessibility", "IBM_Design"]) + .then(function (report) { + console.log(report); + var vals = { + "FAIL": 0, + "POTENTIAL": 1, + "MANUAL": 2, + "PASS": 3 + }; + for (var idx = 0; idx < report.results.length; ++idx) { + if (report.results[idx].value[1] === "PASS") { + report.results.splice(idx--, 1); + } + } + report.results.sort(function (a, b) { + if (a.category != b.category) { + return a.category.localeCompare(b.category); + } + if (a.path["aria"] === b.path["aria"]) { + return vals[a.value[1]] - vals[b.value[1]]; + } + return a.path["aria"].localeCompare(b.path["aria"]); + }); + var lastPath = null; + var category = null; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (category !== result.category) { + if (category !== null) { + console.groupEnd(); + console.groupEnd(); + lastPath = null; + } + category = result.category; + console.group(result.category); + } + if (result.path["aria"] != lastPath) { + if (lastPath !== null) { + console.groupEnd(); + } + lastPath = result.path["aria"]; + if (lastPath === "") { + console.group("page"); + } + else { + console.group(lastPath); + } + } + console.log(result.value, result.message); + } + console.groupEnd(); + console.groupEnd(); + }); + }, timeout); +} +exports.checkDemo = checkDemo; + +})(); + +ace = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzdtRyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFILENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM3aUUsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM1ekQsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDenhCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDM2pCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeGtFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ25xQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2xsQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzNUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDempFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN2MUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzK0YsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9pQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9uRSxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDblcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzOUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDN3BHLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4cUcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4eUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbmpCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2gzQyxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbjVELENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzE4QyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0NBQzdtQyxDQUFDO0FBR0Y7SUFBQTtJQXFDQSxDQUFDO0lBbkNHLHdEQUF3RDtJQUMxQyxnQkFBTyxHQUFyQixVQUFzQixPQUFlO1FBQ2pD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SSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7bUJBQ2xLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7bUJBQzNJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7dUJBQ3JJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0NBRXRLLHlCQUFhLEVBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLEVB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QUFRLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoQixDQUFDO0FBeERELDhCQXdEQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFEZWZpbml0aW9ucy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvYXJpYS9BUklBTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFXYWxrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29tbW9uL0NvbW1vbk1hcHBlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29tbW9uL0NvbnRleHQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NvbW1vbi9FbmdpbmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NvbmZpZy9Db25maWcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9ET01NYXBwZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9ET01VdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9kb20vRE9NV2Fsa2VyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9hcGkvSUd1aWRlbGluZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvYXBpL0lSdWxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9jaGVja2VyL0NoZWNrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FfdGFyZ2V0X3dhcm5pbmcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FfdGV4dF9wdXJwb3NlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcHBsZXRfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmVhX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2FsbG93ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2NvbmZsaWN0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYmFubmVyX3NpbmdsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jaGlsZF90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jaGlsZF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50X2luX2xhbmRtYXJrLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50aW5mb19taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29udGVudGluZm9fc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Rlc2NlbmRhbnRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2dyYXBoaWNfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfaGlkZGVuX25vbnRhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2lkX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9pbWdfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbWFpbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbWFpbl9sYWJlbF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3BhcmVudF9yZXF1aXJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JlZ2lvbl9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yb2xlX2FsbG93ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcm9sZV9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9zZW1hbnRpY3MudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfd2lkZ2V0X2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hc2NpaWFydF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ibGlua19jc3NfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ibGlua19lbGVtX2RlcHJlY2F0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Jsb2NrcXVvdGVfY2l0ZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NhbnZhc19jb250ZW50X2Rlc2NyaWJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY2FwdGlvbl90cmFja19leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2Rlc2lnbl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9oYXNwb3B1cF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kZWJ1Z19wYXRocy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZGV0ZWN0b3JfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Rpcl9hdHRyaWJ1dGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Rvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9pZF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfbGFuZ192YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3RhYmJhYmxlX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VtYmVkX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Vtb3RpY29uc19hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lcnJvcl9tZXNzYWdlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZmllbGRzZXRfbGFiZWxfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZpZWxkc2V0X2xlZ2VuZF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZmlndXJlX2xhYmVsX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9mb250X2NvbG9yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX2ludGVyYWN0aW9uX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fc3VibWl0X2J1dHRvbl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fc3VibWl0X3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZnJhbWVfc3JjX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mcmFtZV90aXRsZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2hlYWRpbmdfY29udGVudF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2hlYWRpbmdfbWFya3VwX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaHRtbF9sYW5nX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaHRtbF9za2lwbmF2X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWFnZW1hcF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X2JhY2tncm91bmQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfZGVjb3JhdGl2ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfbnVsbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19pc21hcF9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19sb25nZGVzY19taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2luZGV4LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9hdXRvY29tcGxldGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfZmllbGRzX2dyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2hhc3BvcHVwX2NvbmZsaWN0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF9hZnRlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfYmVmb3JlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X29uY2hhbmdlX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGFiZWxfY29udGVudF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xhYmVsX25hbWVfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGFiZWxfcmVmX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9saXN0X2NoaWxkcmVuX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9saXN0X21hcmt1cF9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xpc3Rfc3RydWN0dXJlX3Byb3Blci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWFycXVlZV9lbGVtX2F2b2lkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hbHRfYnJpZWYudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2xpdmVfY2FwdGlvbmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV90cmFja19hdmFpbGFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21ldGFfcmVkaXJlY3Rfb3B0aW9uYWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21ldGFfcmVmcmVzaF9kZWxheS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWV0YV92aWV3cG9ydF96b29tYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbm9lbWJlZF9jb250ZW50X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvb2JqZWN0X3RleHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9wYWdlX3RpdGxlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvcGFnZV90aXRsZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfb25jbGlja19hdm9pZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X29uY2xpY2tfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfc2VsZWN0X3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2VsZWN0X29wdGlvbnNfZ3JvdXBlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2tpcF9tYWluX2Rlc2NyaWJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2tpcF9tYWluX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9jb2xvcl9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2ZvY3VzX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9ob3Zlcl9wZXJzaXN0ZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV92aWV3cG9ydF9yZXNpemFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N2Z19ncmFwaGljc19sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfYXJpYV9kZXNjZW5kYW50cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfY2FwdGlvbl9lbXB0eS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfY2FwdGlvbl9uZXN0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2hlYWRlcnNfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9oZWFkZXJzX3JlZl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfaGVhZGVyc19yZWxhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9sYXlvdXRfbGluZWFyaXplZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc2NvcGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX3N0cnVjdHVyZV9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX3N1bW1hcnlfcmVkdW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X2Jsb2NrX2hlYWRpbmcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfY29udHJhc3Rfc3VmZmljaWVudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9xdW90ZWRfY29ycmVjdGx5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3NlbnNvcnlfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3NwYWNpbmdfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfd2hpdGVzcGFjZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvd2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvd2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXNldHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUkNvbnRyb2xsZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUkN1cnNvci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSTmF2aWdhdG9yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvU1JSZW5kZXJlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSUmVuZGVyZXJSdWxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvU1JUYWJsZVV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUlV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUlZpZXdlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL3JlbmRlcl9ydWxlcy9jb21tb24udHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9yZW5kZXJfcnVsZXMvY29udGFpbmVyX2VudGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvcmVuZGVyX3J1bGVzL2NvbnRhaW50ZXJfZXhpdC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL3JlbmRlcl9ydWxlcy9pbmRleC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9BY2NOYW1lVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9BcmlhVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9DU1NVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NhY2hlVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9DbGlwUGF0aFV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvQ29sb3JVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NvbW1vblV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvVGFibGVVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL1Zpc1V0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2FjZS8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qZ2xvYmFsIE9wZW5BamF4Ki9cbi8vIGFsbCByZWZlcmVuY2VzIHRvIFdBSS1BUklBIHNwZWNpZmljYXRpb24gaXMgdGhlIFdBSS1BUklBIDEuMlxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMi9cblxuZXhwb3J0IHR5cGUgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCA9IHtcbiAgICBpbXBsaWNpdFJvbGU6IHN0cmluZ1tdLFxuICAgIHZhbGlkUm9sZXM6IHN0cmluZ1tdLFxuICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGJvb2xlYW4sXG4gICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM/OiBzdHJpbmdbXSwgXG4gICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM/OiBzdHJpbmdbXSxcbiAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlcz86IHN0cmluZ1tdLCAvL3JvbGVzLCBvdGhlciB0aGFuIGltcGxpY2l0IGFuZCB2YWxpZCByb2xlcywgd2hvc2UgYXR0cmlidXRlcyBhcmUgYWxzbyBhbGxvd2VkXG4gICAgLy8gYSBmZXcgZWxlbWVudHMgKHN1Y2ggYXMgZGF0YWxpc3QsIGh0bWwsIGNhcHRpb24pIHRoYXQgaGF2ZSBhbiBpbXBsaWNpdCByb2xlIGJ1dCBkaXNhbGxvdyBzb21lIG9yIGFsbCBhdHRyaWJ1dGVzIGFsbG93ZWQgZm9yIHRoZSByb2xlLlxuICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU/OiBib29sZWFuLFxuICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZT86IHN0cmluZ1tdICAvL3NvbWUgZWxlbWVudHMgKHZhcixhYmJyIGV0Yy4pIGhhdmUgbm8gaW1wbGljaXQgcm9sZSBidXQgbmFtaW5nIHByb2hpYml0ZWQgICBcbn1cblxuZXhwb3J0IGNsYXNzIEFSSUFEZWZpbml0aW9ucyB7XG4gICAgc3RhdGljIG5hbWVGcm9tQ29udGVudChyb2xlOiBzdHJpbmcpIDogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAocm9sZSBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpIFxuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tIFxuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tLmluY2x1ZGVzKFwiY29udGVudHNcIik7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBhcnJheSBvZiBXQUktQVJJQSBnbG9iYWwgc3RhdGVzIGFuZCBwcm9wZXJ0aWVzXG4gICAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4yLyNnbG9iYWxfc3RhdGVzXG4gICAgICovXG4gICAgc3RhdGljIGdsb2JhbFByb3BlcnRpZXMgOiBzdHJpbmdbXSA9IFtcImFyaWEtYXRvbWljXCIsIFwiYXJpYS1idXN5XCIsIFwiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtY3VycmVudFwiLCBcImFyaWEtZGVzY3JpYmVkYnlcIiwgXG4gICAgICAgIFwiYXJpYS1kZXRhaWxzXCIsIFwiYXJpYS1mbG93dG9cIiwgXCJhcmlhLWhpZGRlblwiLCBcImFyaWEta2V5c2hvcnRjdXRzXCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiLCBcImFyaWEtbGl2ZVwiLCBcImFyaWEtb3duc1wiLCBcImFyaWEtcmVsZXZhbnRcIiwgXCJhcmlhLXJvbGVkZXNjcmlwdGlvblwiXG4gICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgYXJlIGRlcHJlY2F0ZWQgaW4gQVJJQSAxLjIsIHdpbGwgaW5kaWNhdGUgZGVwcmVjYXRpb24gaW4gaW5kaXZpZHVhbCByb2xlXG4gICAgICAgICwgJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXG4gICAgXTtcblxuICAgIC8vcHJvcGVydGllcyBjb250YWlucyBpZChzKSB0aGF0IHJlZmVyIHRvIG90aGVyIGVsZW1lbnQocylcbiAgICBzdGF0aWMgcmVmZXJlbmNlUHJvcGVydGllcyA6IHN0cmluZ1tdID0gW1wiYXJpYS1vd25zXCIsIFwiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtZGVzY3JpYmVkYnlcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIiwgXCJhcmlhLWZsb3d0b1wiLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXTtcblxuICAgIC8vIGRlcHJlY2F0ZWQgcm9sZXNcbiAgICBzdGF0aWMgZ2xvYmFsRGVwcmVjYXRlZFJvbGVzIDogc3RyaW5nW10gPSBbXG4gICAgICAgICdkaXJlY3RvcnknLCAnZG9jLWJpYmxpb2VudHJ5JywgJ2RvYy1lbmRub3RlJ1xuICAgIF07XG5cbiAgICAvLyB0aGUgZm9sbG93aW5nIGFyZSBkZXByZWNhdGVkIGluIEFSSUEgMS4xIGZvciBhbGwgdGhlIHJvbGVzXG4gICAgc3RhdGljIGdsb2JhbERlcHJlY2F0ZWRQcm9wZXJ0aWVzIDogc3RyaW5nW10gPSBbXG4gICAgICAgICdhcmlhLWdyYWJiZWQnLCAnYXJpYS1kcm9wZWZmZWN0J1xuICAgIF07XG4gICAgXG4gICAgLypcbiAgICAgKiBYU0QgZGF0YSB0eXBlcyBmb3IgYWxsIFdBSS1BUklBIHByb3BlcnRpZXNcbiAgICAgKiBhbG9uZyB3aXRoIHZhbGlkIHZhbHVlcyB3aGVuIHRoZSBkYXRhIHR5cGUgaXMgTk1UT0tFTlxuICAgICAqIFdBSS1BUklBIHByb3BlcnRpZXMgZGF0YSB0eXBlcyBleHBsYW5lZDpcbiAgICAgKiAgdHlwZTogVXNlZCB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiB2YWx1ZXMgYWxsb3dlZCBmb3IgdGhlIFdBSS1BUklBIHByb3BlcnR5XG4gICAgICogIHZhbHVlczogVXNlZCB0byBpZGVudGlmeSBzcGVjaWZpYyB2YWx1ZXMgb2YgYW4gV0FJLUFSSUEgcHJvcGVydHkgd2hlbiB0eXBlIGlzIG5tdG9rZW5cbiAgICAgKiAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IFVzZWQgdG8gaWRlbnRpZnkgaWYgdGhlIFdBSS1BUklBIHByb3BlcnR5IHN1cHBvcnRzIHJlZmVyZW5jaW5nIGhpZGRlbiBJRFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlOiByZWZlcnMgdG8gV0FJLUFSSUEgcHJvcGVydHkgc3VwcG9ydHMgaGlkZGVuIElEIHJlZmVyZW5jZXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U6IHJlZmVycyB0byBXQUktQVJJQSBwcm9wZXJ0eSBkb2VzIG5vdCBzdXBwb3J0IGhpZGRlbiBJRCByZWZlcmVuY2VzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlIHdpbGwgYmUgc2V0IHRvIGZhbHNlLCBpZiBub3Qgc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIHN0YXRpYyBwcm9wZXJ0eURhdGFUeXBlcyA6IHsgXG4gICAgICAgIFtwcm9wOiBzdHJpbmddIDogeyBcbiAgICAgICAgICAgIHR5cGU6IHN0cmluZywgXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZD86IGJvb2xlYW4sXG4gICAgICAgICAgICB2YWx1ZXM/OiBzdHJpbmdbXSBcbiAgICAgICAgfVxuICAgIH0gPSB7XG4gICAgICAgIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1hdG9taWNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWF1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiaW5saW5lXCIsIFwibGlzdFwiLCBcImJvdGhcIiwgXCJub25lXCIsIFwidW5kZWZpbmVkXCJdIC8vYWRkIHVuZGVmaW5lZCB0byBoYW5kbGUgdmFsdWUgZW1wdHlcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWJ1c3lcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcIm1peGVkXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jb2xjb3VudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jb2xpbmRleFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jb2xzcGFuXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbnRyb2xzXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY3VycmVudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wicGFnZVwiLCBcInN0ZXBcIiwgXCJsb2NhdGlvblwiLCBcImRhdGVcIiwgXCJ0aW1lXCIsIFwidHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdIC8vYWRkIHVuZGVmaW5lZCBmb3IgZW1wdHkgdmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGV0YWlsc1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kaXNhYmxlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZHJvcGVmZmVjdFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5zXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImNvcHlcIiwgXCJtb3ZlXCIsIFwibGlua1wiLCBcImV4ZWN1dGVcIiwgXCJwb3B1cFwiLCBcIm5vbmVcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWVycm9ybWVzc2FnZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZmxvd3RvXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWdyYWJiZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcIm1lbnVcIiwgXCJsaXN0Ym94XCIsIFwidHJlZVwiLCBcImdyaWRcIiwgXCJkaWFsb2dcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1pbnZhbGlkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJzcGVsbGluZ1wiLCBcImdyYW1tYXJcIiwgXCJ1bmRlZmluZWRcIl0gLy9hZGQgdW5kZWZpbmVkIGZvciBlbXB0eSB2YWx1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEta2V5c2hvcnRjdXRzXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxhYmVsbGVkYnlcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1sZXZlbFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1saXZlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJvZmZcIiwgXCJwb2xpdGVcIiwgXCJhc3NlcnRpdmVcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW1vZGFsXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tdWx0aWxpbmVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImhvcml6b250YWxcIiwgXCJ2ZXJ0aWNhbFwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtb3duc1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXBvc2luc2V0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXByZXNzZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcIm1peGVkXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZWFkb25seVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVsZXZhbnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2Vuc1wiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJhZGRpdGlvbnNcIiwgXCJyZW1vdmFsc1wiLCBcInRleHRcIiwgXCJhbGxcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb2xlZGVzY3JpcHRpb25cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93Y291bnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93aW5kZXhcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93c3BhblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1zZXRzaXplXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXNvcnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImFzY2VuZGluZ1wiLCBcImRlc2NlbmRpbmdcIiwgXCJvdGhlclwiLCBcIm5vbmVcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWVub3dcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVldGV4dFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGRlc2lnbiBwYXR0ZXJucyBmb3IgY29uY3JldGUgV0FJLUFSSUEgcm9sZXNcbiAgICAgKiBsZWdpdGltYXRlIGtleXMgZm9yIGVhY2ggcm9sZSBpbmNsdWRlOlxuICAgICAqXG4gICAgICogLSBjb250YWluZXI6IGFwcHJvcHJpYXRlIGNvbnRhaW5lcihzKSBmb3IgdGhhdCByb2xlXG4gICAgICogLSBwcm9wczogc3RhdGVzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvbGUgKGluIGFkZGl0aW9uIHRvIHRoZSBnbG9iYWwgc3RhdGVzIGFuZCBwcm9wZXJ0aWVzIGxpc3RlZCBhYm92ZSlcbiAgICAgKiAtIHJlcVByb3BzOiByZXF1aXJlZCBzdGF0ZXMgb3IgcHJvcGVydGllcyBmb3IgdGhpcyByb2xlXG4gICAgICogLSByZXFDaGlsZHJlbjogcmVxdWlyZWQgY2hpbGRyZW4gZm9yIHRoaXMgcm9sZVxuICAgICAqIC0gaHRtbEVxdWl2OiBIVE1MIGVxdWl2YWxlbnQgZm9yIHRoaXMgcm9sZVxuICAgICAqIC0gcm9sZVR5cGU6IG9uZSBvZiB3aWRnZXQsIHN0cnVjdHVyZSwgbGFuZG1hcmssIGxpdmVSZWdpb24sIHdpbmRvdyAoYXMgc2VlbiBpbiBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4yLyNyb2xlc19jYXRlZ29yaXphdGlvbilcbiAgICAgKiAtIG5hbWVSZXF1aXJlZDogZGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGFjY2Vzc2libGUgbmFtZSBpcyByZXF1aXJlZCBmb3IgYSB3aWRnZXQgKHNlZSBBUklBIHNwZWMuKVxuICAgICAqIC0gbmFtZUZyb206IGRldGVybWluZXMgaG93IGFuIGFjY2Vzc2libGUgbmFtZSBpcyBzdXBwbGllZCAoYXV0aG9yIG9yIGNvbnRlbnQgLSBzZWUgQVJJQSBzcGVjLilcbiAgICAgKiAtIGRlcHJlY2F0ZWQ6IGlmIHByZXNlbnQsIGluZGljYXRlcyB0aGF0IHRoZSByb2xlIGlzIGRlcHJlY2F0ZWQsIGFuZCBwcm92aWRlcyBhIGxpc3Qgb2YgYWx0ZXJuYXRpdmUgcm9sZShzKVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNpZ25QYXR0ZXJucyA6IHtcbiAgICAgICAgW3JvbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogc3RyaW5nW10sXG4gICAgICAgICAgICBwcm9wczogc3RyaW5nW10sXG4gICAgICAgICAgICByZXFQcm9wczogc3RyaW5nW10sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogc3RyaW5nW10sXG4gICAgICAgICAgICBodG1sRXF1aXY6IHN0cmluZyxcbiAgICAgICAgICAgIHJvbGVUeXBlPzogc3RyaW5nLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIG5hbWVGcm9tPzogc3RyaW5nW10sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuPzogYm9vbGVhbixcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ/OiBib29sZWFuLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzPzogc3RyaW5nW11cbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wcz86IHN0cmluZ1tdXG4gICAgICAgIH1cbiAgICB9ID0ge1xuICAgICAgICBcImFsZXJ0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImFsZXJ0ZGlhbG9nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW1vZGFsXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpbmRvd1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYXBwbGljYXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtZXhwYW5kZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIGNhbiBiZSBcIndpZGdldFwiXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYXJ0aWNsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYmFubmVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJsb2NrcXVvdGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJ1dHRvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcHJlc3NlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYnV0dG9uIHwgaW5wdXRbQHR5cGU9J2J1dHRvbiddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZmlndXJlXCIsIFwiZ3JpZFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNlbGxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjaGVja2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSdjaGVja2JveCddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29kZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbHVtbmhlYWRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInJvd1wiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGluZGV4XCIsIFwiYXJpYS1jb2xzcGFuXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiLCBcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLXNvcnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRoW0BzY29wZT0nY29sJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29tYm9ib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29udHJvbHNcIiwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIl0sIC8vIGFyaWEtY29udHJvbHMgaXNuJ3QgYWN0dWFsbHkgcmVxdWlyZWQgd2hlbiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29tcGxlbWVudGFyeVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb21tZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb250ZW50aW5mb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkZWZpbml0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZGVsZXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkaWFsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbW9kYWxcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2luZG93XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGlyZWN0b3J5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddICBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiZG9jLWFic3RyYWN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1hY2tub3dsZWRnbWVudHNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWFmdGVyd29yZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYXBwZW5kaXhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJhY2tsaW5rXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9lbnRyeVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYmlibGlvZ3JhcGh5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9yZWZcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNoYXB0ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNvbG9waG9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNvbmNsdXNpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNvdmVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbWdcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNyZWRpdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY3JlZGl0c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZGVkaWNhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZW5kbm90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVuZG5vdGVzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVwaWdyYXBoXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lcGlsb2d1ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZXJyYXRhXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1leGFtcGxlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1mb290bm90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZm9yZXdvcmRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWdsb3NzYXJ5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1nbG9zc3JlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtaW5kZXhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWludHJvZHVjdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2Mtbm90ZXJlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2Mtbm90aWNlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWJyZWFrXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCJdLCAvLyBhcmlhLWRpc2FibGVkLCBhcmlhLXZhbHVlbWF4LCBhcmlhLXZhbHVlbWluLCBhcmlhLXZhbHVldGV4dCBhcmUgdmFsaWQgaWYgZm9jdXNhYmxlLiBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIGNvZGUuXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCwgLy8gYXJpYS12YWx1ZW5vdyBpcyByZXF1aXJlZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIHdpZGdldCBpZiBmb2N1c2FibGVcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWxpc3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXBhZ2Vmb290ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlaGVhZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFydFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHJlZmFjZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHJvbG9ndWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXB1bGxxdW90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXFuYVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2Mtc3VidGl0bGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXRpcFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXRvY1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2N1bWVudFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImVtcGhhc2lzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZmVlZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImFydGljbGVcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZmlndXJlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmb3JtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJmb3JtXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ2VuZXJpY1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiZGl2IHwgc3BhblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiLCBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImdyYXBoaWNzLWRvY3VtZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZ3JhcGhpY3Mtb2JqZWN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImdyYXBoaWNzLXN5bWJvbFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJncmlkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWNvbGNvdW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCJdLCAvLyByb3dncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGFibGVcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImdyaWRjZWxsXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1lcnJvcm1lc3NhZ2VcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiLCBcImFyaWEtaW52YWxpZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiLCBcImFyaWEtc2VsZWN0ZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ3JvdXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImhlYWRpbmdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1sZXZlbFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImgxIHwgaDIgfCBoMyB8IGg0IHwgaDUgfCBoNlwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaW1nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbWdcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImltZ1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJpbnNlcnRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaW5rXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaXN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wibGlzdGl0ZW1cIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwib2wgfCB1bFwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpc3Rib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwib3B0aW9uXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibGlzdGl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJsaXN0XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbGV2ZWxcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJsaVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxvZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1haW5cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWFya1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibWFya1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtYXJxdWVlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1hdGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogZmFsc2UsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWJhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLCBcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1lbnVpdGVtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JvdXBcIiwgXCJtZW51XCIsIFwibWVudWJhclwiXSwgLy8gZ3JvdXAgb25seSBjb3VudHMgYXMgYSB2YWxpZCBjb250YWluZXIgaWYgaXQgaXMgY29udGFpbmVkIGluIGEgbWVudSBvciBtZW51YmFyXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcIm1lbnVpdGVtY2hlY2tib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1lbnVpdGVtcmFkaW9cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1ldGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibmF2aWdhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJub25lXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm5vdGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiXSwgLy8gZ3JvdXAgb25seSBjb3VudHMgYXMgYSB2YWxpZCBjb250YWluZXIgaWYgaXQgaXMgY29udGFpbmVkIGluIGEgbGlzdGJveFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLWNoZWNrZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsIC8vIFwiYXJpYS1zZWxlY3RlZFwiIGhhcyBhIGRlZmF1bHRcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcIm9wdGlvblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwYXJhZ3JhcGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwcmVzZW50YXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicHJvZ3Jlc3NiYXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmFkaW9cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jaGVja2VkXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW5wdXRbQHR5cGU9J3JhZGlvJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmFkaW9ncm91cFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicmFkaW9cIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJlZ2lvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyb3dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncmlkXCIsIFwicm93Z3JvdXBcIiwgXCJ0YWJsZVwiLCBcInRyZWVncmlkXCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImNlbGxcIiwgXCJjb2x1bW5oZWFkZXJcIiwgXCJncmlkY2VsbFwiLCBcInJvd2hlYWRlclwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0clwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJvd2dyb3VwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JpZFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogW10sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGJvZHkgfCB0Zm9vdCB8IHRoZWFkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicm93aGVhZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1yb3dzcGFuXCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc29ydFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGhbQHNjb3BlPSdyb3cnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcblxuICAgICAgICBcInNjcm9sbGJhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZWFyY2hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2VhcmNoYm94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtbXVsdGlsaW5lXCIsIFwiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0nc2VhcmNoJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2VwYXJhdG9yXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCJdLCAvLyBhcmlhLWRpc2FibGVkLCBhcmlhLXZhbHVlbWF4LCBhcmlhLXZhbHVlbWluLCBhcmlhLXZhbHVldGV4dCBhcmUgdmFsaWQgaWYgZm9jdXNhYmxlLiBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIGNvZGUuXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCwgLy8gYXJpYS12YWx1ZW5vdyBpcyByZXF1aXJlZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIHdpZGdldCBpZiBmb2N1c2FibGVcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzbGlkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLXZhbHVlbm93XCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzcGluYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdGF0dXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdHJvbmdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdWJzY3JpcHRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdWdnZXN0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic3VwZXJzY3JpcHRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzd2l0Y2hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJ0YWJsaXN0XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xjb3VudFwiLCBcImFyaWEtcm93Y291bnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIiwgXCJyb3dncm91cFwiLCBcImNhcHRpb25cIl0sIC8vIHJvd2dyb3VwIGFuZCBjYXB0aW9uIGFyZSBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGFibGVcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGFibGlzdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1widGFiXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLCBcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYnBhbmVsXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0ZXJtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJkZm5cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGV4dGJveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1hdXRvY29tcGxldGVcIiwgXCJhcmlhLW11bHRpbGluZVwiLCBcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW5wdXRbQHR5cGU9J3RleHQnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0aW1lXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGltZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0b29sYmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidG9vbHRpcFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIC8vIEFSSUEgMS4yIGhhcyB0aGlzIGFzIG5hbWVSZXF1aXJlZDogdHJ1ZSwgYnV0IEFSSUEgMS4zIHJlbW92ZWQgaXQgYmVjYXVzZSBpdCBtYWtlcyBubyBzZW5zZSB0byByZXF1aXJlIGEgbmFtZSBvbiBhIHRvb2x0aXAuXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidHJlZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwidHJlZWl0ZW1cIl0sIC8vIGdyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1jb2xjb3VudFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCJdLCAvLyByb3dncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidHJlZWl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jaGVja2VkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtbGV2ZWxcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICB9IC8vIGVuZCBkZXNpZ25QYXR0ZXJuc1xuXG4gICAgLy8gY29waWVkIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLW90aGVyLmh0bWwjZGlzYWJsZWQtZWxlbWVudHNcbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbnB1dC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9BdHRyaWJ1dGVzL2Rpc2FibGVkXG4gICAgLyoqIG5vdGU6XG4gICAgICAqIGlmIGEgPGZpZWxkc2V0PiBpcyBkaXNhYmxlZCwgdGhlIGRlc2NlbmRhbnQgZm9ybSBjb250cm9scyBhcmUgYWxsIGRpc2FibGVkIGV4Y2VwdCA8bGVnZW5kPlxuICAgICAgKiBJZiBhbiA8b3B0Z3JvdXA+IGlzIGRpc2FibGVkLCB0aGUgc2VsZWN0IGlzIHN0aWxsIGludGVyYWN0aXZlICh1bmxlc3Mgb3RoZXJ3aXNlIGRpc2FibGVkKSwgYnV0IG5vbmUgb2YgdGhlIGl0ZW1zIGluIHRoZSBvcHRpb24gZ3JvdXAgYXJlIHNlbGVjdGFibGUuXG4gICAgICAqIFdoZW4gYW4gZWxlbWVudCBoYXMgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBhcHBsaWVkLCB0aGUgOmRpc2FibGVkIHBzZXVkby1jbGFzcyBhbHNvIGFwcGxpZXMgdG8gaXQuIFxuICAgICAqL1xuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWREaXNhYmxlZCA9IFtcImJ1dHRvblwiLCBcImlucHV0XCIsIFwic2VsZWN0XCIsIFwidGV4dGFyZWFcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImZpZWxkc2V0XCJdOyAvLyBhbHNvIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudFxuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWRSZXF1aXJlZCA9IFtcInNlbGVjdFwiLCBcInRleHRhcmVhXCJdOyAvLyByZW1vdmUgJ2lucHV0JyBhbmQgYWRkIHRvIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnQsIGJlY3Vhc2UgcmVxdWlyZWQgaXMgbm90IHN1cHBvcnRlZCBvbiBpbnB1dEB0eXBlPVwicmFuZ2VcIiwgXCJjb2xvclwiLCBcImhpZGRlblwiIG9yIGFueSBidXR0b24gdHlwZXNcbiAgICBzdGF0aWMgZWxlbWVudHNBbGxvd2VkUmVhZE9ubHkgPSBbXCJ0ZXh0YXJlYVwiXTsgLy8gcmVtb3ZlICdpbnB1dCcgYW5kIGFkZCB0byB0aGUgaW5kaXZpZHVhbCBlbGVtZW50LCBiZWNhdXNlIHJlYWRvbmx5IGlzIG5vdCBzdXBwb3J0ZWQgb24gaW5wdXRAdHlwZT1cImNoZWNrYm94XCIsIFwicmFkaW9cIiwgXCJyYW5nZVwiLCBcImNvbG9yXCIsIFwiZmlsZVwiLCBoaWRkZW5cIiBvciBhbnkgYnV0dG9uIHR5cGVzXG5cblxuICAgIC8qIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFyaWEvI2RvY2NvbmZvcm1hbmNlXG4gICAgICAgICogZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50IGNvbnRhaW5zIHByb3BlcnRpZXMgb2YgdGhlIHRhZ3MgcmVsYXRlZCB0byByb2xlIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgYXR0cmlidXRlIHZhbHVlXG4gICAgICAgICogZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3MgY29udGFpbnMgdGhvc2UgdGFncyB0aGF0IHJlcXVpcmUgc3BlY2lhbCBjb25zaWRlcmF0aW9uc1xuICAgICAgICAqL1xuICAgIHN0YXRpYyBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQ6IHtcbiAgICAgICAgW3JvbGU6IHN0cmluZ106IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICB9ID0ge1xuICAgICAgICBcImFiYnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFkZHJlc3NcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcnRpY2xlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJmZWVkXCIsIFwibWFpblwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXNpZGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21wbGVtZW50YXJ5XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWRlZGljYXRpb25cIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb290bm90ZVwiLCBcImRvYy1nbG9zc2FyeVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtdGlwXCIsIFwiZmVlZFwiLCBcIm5vbmVcIiwgXCJub3RlXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmVnaW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImF1ZGlvXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJhc2VcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmRpXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJiZG9cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJsb2NrcXVvdGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJibG9ja3F1b3RlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJvZHlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbJ2FyaWEtaGlkZGVuJ10sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLFwic2VwYXJhdG9yXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2FudmFzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydjYXB0aW9uJ10sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY2l0ZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29kZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvZGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImNvbGdyb3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRhdGFsaXN0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdGJveFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkZWxldGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZXRhaWxzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRmblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRlcm1cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGlhbG9nXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZGlhbG9nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYWxlcnRkaWFsb2dcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgXCJkbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3RcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImR0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGVybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImxpc3RpdGVtXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImVtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJlbWJlZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWVsZHNldFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlnY2FwdGlvblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZm9ybVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImZvcm1cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImhlYWRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGdyb3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoMlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImgzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoNVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImg2XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaHJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzZXBhcmF0b3JcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtcGFnZWJyZWFrXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJodG1sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZG9jdW1lbnRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImlmcmFtZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJpbnNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbnNlcnRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwia2JkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJsYWJlbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxlZ2VuZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxpbmtcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWFpblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm1haW5cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm1hcFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXJrXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXRoXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibWF0aFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWVudVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm1ldGFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWV0ZXJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJtZXRlclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFsnYXJpYS12YWx1ZW1heCcsICdhcmlhLXZhbHVlbWluJ10sXG4gICAgICAgICAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm5hdlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm5hdmlnYXRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtaW5kZXhcIiwgXCJkb2MtcGFnZWxpc3RcIiwgXCJkb2MtdG9jXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJ0YWJsaXN0XCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJub3NjcmlwdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJvYmplY3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIiwgXCJkb2N1bWVudFwiLCBcImltZ1wiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJvbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9wdGdyb3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm9wdGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtc2VsZWN0ZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJvdXRwdXRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdGF0dXNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInBhcmFncmFwaFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJwYXJhbVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJwaWN0dXJlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlblwiXSBcbiAgICAgICAgfSxcbiAgICAgICAgXCJwcmVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInByb2dyZXNzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicHJvZ3Jlc3NiYXJcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXZhbHVlbWF4XCJdIFxuICAgICAgICB9LFxuICAgICAgICBcInFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInJwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJydFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwicnVieVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImRlbGV0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwic2FtcFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2NyaXB0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnc2VhcmNoJ10sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbJ3NlYXJjaCcsICdmb3JtJywgJ2dyb3VwJywgJ25vbmUnLCAncHJlc2VudGF0aW9uJywgJ3JlZ2lvbiddLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNsb3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic21hbGxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNvdXJjZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGFuXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdHJvbmdcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdHJvbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3R5bGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3ViXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3Vic2NyaXB0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN1cFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN1cGVyc2NyaXB0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN2Z1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyYXBoaWNzLWRvY3VtZW50XCJdLCAvLyBhcyBkZWZpbmVkIGJ5IFNWRyBBQU1cbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJsZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRhYmxlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRlbXBsYXRlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInRleHRhcmVhXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGZvb3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0aGVhZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRpbWVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0aW1lXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRpdGxlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInRyYWNrXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInVsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidmFyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ2aWRlb1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ3YnJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdXG4gICAgICAgIH1cbiAgICB9IC8vIGVuZCBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcblxuICAgIHN0YXRpYyBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnczoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXToge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXSA6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICAgICAgfSB8IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRcbiAgICB9ID0ge1xuICAgICAgICBcImFcIjoge1xuICAgICAgICAgICAgXCJ3aXRoLWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlua1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm9uLWVtcHR5IGhyZWYgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImRvYy1iYWNrbGlua1wiLCBcImRvYy1iaWJsaW9yZWZcIiwgXCJkb2MtZ2xvc3NyZWZcIiwgXCJkb2Mtbm90ZXJlZlwiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtZGlzYWJsZWQ9dHJ1ZVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2l0aG91dC1ocmVmXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGhyZWYgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmVhXCI6IHtcbiAgICAgICAgICAgIFwid2l0aC1ocmVmXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpbmtcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vbi1lbXB0eSBocmVmIGF0dHJpYnV0ZSBpcyBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gaHJlZiBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJsaW5rXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbi8vIFRPRE9cbi8vICAgICAgICBcImF1dG9ub21vdXMgY3VzdG9tIGVsZW1lbnRcIjoge1xuLy8gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIlJvbGUgZXhwb3NlZCBmcm9tIGF1dGhvciBkZWZpbmVkIEVsZW1lbnRJbnRlcm5hbHMuIE90aGVyd2lzZSBubyBjb3JyZXNwb25kaW5nIHJvbGUuXCJdLFxuLy8gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJJZiByb2xlIGRlZmluZWQgYnkgRWxlbWVudEludGVybmFsc1wiLCBcImFueSByb2xlXCIsIFwibm8gcm9sZSBPdGhlcndpc2VcIl0sXG4vLyAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbi8vICAgICAgICB9LFxuICAgICAgICBcImRpdlwiOiB7XG4gICAgICAgICAgICBcImNoaWxkLWRsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wicHJlc2VudGF0aW9uXCIsIFwibm9uZVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuby1jaGlsZC1kbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlndXJlXCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtZmlnY2FwdGlvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJmaWd1cmVcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogWydkb2MtZXhhbXBsZSddLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLWZpZ2NhcHRpb25cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZmlndXJlXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZm9vdGVyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXNlY3Rpb24tYXJ0aWNsZS1hc2lkZS1tYWluLW5hdlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWZvb3Rub3RlXCIsIFwiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbnRlbnRpbmZvXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBub3QgYSBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWZvb3Rub3RlXCIsIFwiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbi8vIFRPRE9cbi8vICAgICAgICBcImZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudFwiOiB7XG4vLyAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiUm9sZSBleHBvc2VkIGZyb20gYXV0aG9yIGRlZmluZWQgRWxlbWVudEludGVybmFscy4gT3RoZXJ3aXNlICdnZW5lcmljJy5cIl0sXG4vLyAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIklmIHJvbGUgZGVmaW5lZCBieSBFbGVtZW50SW50ZXJuYWxzXCIsIFwiZm9ybS1yZWxhdGVkIHJvbGVzOiBidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JvdXBcIiwgXCJsaXN0Ym94XCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJyYWRpb1wiLCBcInJhZGlvZ3JvdXBcIiwgXCJzZWFyY2hib3hcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCIsIFwic3dpdGNoXCIsIFwidGV4dGJveFwiLCBcIm5vIHJvbGUgT3RoZXJ3aXNlXCJdLFxuLy8gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4vLyAgICAgICAgfSxcblxuICAgICAgICBcImhlYWRlclwiOiB7XG4gICAgICAgICAgICBcImRlcy1zZWN0aW9uLWFydGljbGUtYXNpZGUtbWFpbi1uYXZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gZGVzY2VuZGFudCBvZiBhbiBhcnRpY2xlLCBhc2lkZSwgbWFpbiwgbmF2IG9yIHNlY3Rpb24gZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJiYW5uZXJcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vdCBhIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG4gICAgICAgIFwiaW1nXCI6IHtcbiAgICAgICAgICAgIFwiaW1nLXdpdGgtYWNjbmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbWdcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIndoZW4gYWNjZXNzaWJsZSBuYW1lIHByZXNlbnRzXCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYnV0dG9uXCIsIFwiY2hlY2tib3hcIiwgXCJkb2MtY292ZXJcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm1ldGVyXCIsIFwib3B0aW9uXCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJyYWRpb1wiLCBcInNjcm9sbGJhclwiLCBcInNlcGFyYXRvclwiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImltZy13aXRob3V0LWFjY25hbWUtZW1wdHktYWx0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInByZXNlbnRhdGlvblwiLCBcIm5vbmVcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIndoZW4gbm8gYWNjZXNzaWJsZSBuYW1lIHByZXNlbnRzIGFuZCBhbHQ9JydcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLCBcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW49dHJ1ZVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW1nLXdpdGhvdXQtYWNjbmFtZS1uby1hbHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaW1nXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCJ3aGVuIG5laXRoZXIgYWNjZXNzaWJsZSBuYW1lIG5vIGFsdCBwcmVzZW50c1wiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcInByZXNlbnRhdGlvblwiLCBcIm5vbmVcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsIFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlbj10cnVlXCJdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaW5wdXRcIjoge1xuICAgICAgICAgICAgXCJidXR0b25cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjaGVja2JveC13aXRoLWFyaWEtcHJlc3NlZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjaGVja2JveFwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggdHlwZT1jaGVja2JveCBhbmQgYXJpYS1wcmVzc2VkIGF0dHJpYnV0ZSBpcyBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudWl0ZW1jaGVja2JveFwiLCBcIm9wdGlvblwiLCBcInN3aXRjaFwiLCBcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNoZWNrYm94LXdpdGhvdXQtYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCB0eXBlPWNoZWNrYm94IGFuZCBhcmlhLXByZXNzZWQgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudWl0ZW1jaGVja2JveFwiLCBcIm9wdGlvblwiLCBcInN3aXRjaFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNvbG9yXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkYXRlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbWFpbC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIHR5cGU9ZW1haWwgYW5kIG5vIGxpc3QgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW1haWwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmlsZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImhpZGRlblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImltYWdlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1vbnRoXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJudW1iZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3BpbmJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInBhc3N3b3JkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInJhZGlvXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJhZGlvXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm1lbnVpdGVtcmFkaW9cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1jaGVja2VkXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJyYW5nZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzbGlkZXJcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVzZXRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWFyY2gtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzZWFyY2hib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlYXJjaC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzdWJtaXRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZWwtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZWwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY29tYm9ib3hcIiwgXCJzZWFyY2hib3hcIiwgXCJzcGluYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGFzcG9wdXBcIl0gIC8vIGNvdmVyZWQgaW4gYSBkaWZmZXJlbnQgcnVsZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidXJsLW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidXJsLXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndlZWtcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlZmF1bHQtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB3aXRoIGEgbWlzc2luZyBvciBpbnZhbGlkIHR5cGUsIHdpdGggYSBsaXN0IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZWZhdWx0LW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSwgd2l0aCBhIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImxpXCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtb2YtbGlzdC1yb2xlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnbGlzdGl0ZW0nXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLW9mLWxpc3Qtcm9sZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbJ2dlbmVyaWMnXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlY3Rpb25cIjoge1xuICAgICAgICAgICAgXCJ3aXRoLW5hbWVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicmVnaW9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFsZXJ0XCIsIFwiYWxlcnRkaWFsb2dcIiwgXCJhcHBsaWNhdGlvblwiLCBcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImRpYWxvZ1wiLCBcImRvYy1hYnN0cmFjdFwiLCBcImRvYy1hY2tub3dsZWRnbWVudHNcIiwgXCJkb2MtYWZ0ZXJ3b3JkXCIsIFwiZG9jLWFwcGVuZGl4XCIsIFwiZG9jLWJpYmxpb2dyYXBoeVwiLCBcImRvYy1jaGFwdGVyXCIsIFwiZG9jLWNvbG9waG9uXCIsIFwiZG9jLWNvbmNsdXNpb25cIiwgXCJkb2MtY3JlZGl0XCIsIFwiZG9jLWNyZWRpdHNcIiwgXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1lbmRub3Rlc1wiLCBcImRvYy1lcGlncmFwaFwiLCBcImRvYy1lcGlsb2d1ZVwiLCBcImRvYy1lcnJhdGFcIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb3Jld29yZFwiLCBcImRvYy1nbG9zc2FyeVwiLCBcImRvYy1pbmRleFwiLCBcImRvYy1pbnRyb2R1Y3Rpb25cIiwgXCJkb2Mtbm90aWNlXCIsIFwiZG9jLXBhZ2VsaXN0XCIsIFwiZG9jLXBhcnRcIiwgXCJkb2MtcHJlZmFjZVwiLCBcImRvYy1wcm9sb2d1ZVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtcW5hXCIsIFwiZG9jLXRvY1wiLCBcImRvY3VtZW50XCIsIFwiZmVlZFwiLCBcImdyb3VwXCIsIFwibG9nXCIsIFwibWFpblwiLCBcIm1hcnF1ZWVcIiwgXCJuYXZpZ2F0aW9uXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIiwgXCJzdGF0dXNcIiwgXCJ0YWJwYW5lbFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LW5hbWVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbGVydFwiLCBcImFsZXJ0ZGlhbG9nXCIsIFwiYXBwbGljYXRpb25cIiwgXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIiwgXCJkaWFsb2dcIiwgXCJkb2MtYWJzdHJhY3RcIiwgXCJkb2MtYWNrbm93bGVkZ21lbnRzXCIsIFwiZG9jLWFmdGVyd29yZFwiLCBcImRvYy1hcHBlbmRpeFwiLCBcImRvYy1iaWJsaW9ncmFwaHlcIiwgXCJkb2MtY2hhcHRlclwiLCBcImRvYy1jb2xvcGhvblwiLCBcImRvYy1jb25jbHVzaW9uXCIsIFwiZG9jLWNyZWRpdFwiLCBcImRvYy1jcmVkaXRzXCIsIFwiZG9jLWRlZGljYXRpb25cIiwgXCJkb2MtZW5kbm90ZXNcIiwgXCJkb2MtZXBpZ3JhcGhcIiwgXCJkb2MtZXBpbG9ndWVcIiwgXCJkb2MtZXJyYXRhXCIsIFwiZG9jLWV4YW1wbGVcIiwgXCJkb2MtZm9yZXdvcmRcIiwgXCJkb2MtZ2xvc3NhcnlcIiwgXCJkb2MtaW5kZXhcIiwgXCJkb2MtaW50cm9kdWN0aW9uXCIsIFwiZG9jLW5vdGljZVwiLCBcImRvYy1wYWdlbGlzdFwiLCBcImRvYy1wYXJ0XCIsIFwiZG9jLXByZWZhY2VcIiwgXCJkb2MtcHJvbG9ndWVcIiwgXCJkb2MtcHVsbHF1b3RlXCIsIFwiZG9jLXFuYVwiLCBcImRvYy10b2NcIiwgXCJkb2N1bWVudFwiLCBcImZlZWRcIiwgXCJncm91cFwiLCBcImxvZ1wiLCBcIm1haW5cIiwgXCJtYXJxdWVlXCIsIFwibmF2aWdhdGlvblwiLCBcIm5vbmVcIiwgXCJub3RlXCIsIFwicHJlc2VudGF0aW9uXCIsIFwic2VhcmNoXCIsIFwic3RhdHVzXCIsIFwidGFicGFuZWxcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlbGVjdFwiOiB7XG4gICAgICAgICAgICBcIm5vLW11bHRpcGxlLWF0dHItc2l6ZS1ndDFcIjoge1xuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCBhIG11bHRpcGxlIGF0dHJpYnV0ZSBvciBhIHNpemUgYXR0cmlidXRlIGhhdmluZyB2YWx1ZSBncmVhdGVyIHRoYW4gMVwiXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJtdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCI6IHtcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggbm8gbXVsdGlwbGUgYXR0cmlidXRlIGFuZCBubyBzaXplIGF0dHJpYnV0ZSBoYXZpbmcgdmFsdWUgZ3JlYXRlciB0aGFuIDFcIlxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCJdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3VtbWFyeVwiOiB7XG4gICAgICAgICAgICBcImZpcnN0LXN1bW1hcnktb2YtZGV0YWlsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRib2R5XCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRkXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGhcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGUtcm93LXNjb3BlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2hlYWRlclwiLCBcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtdGFibGUtY29sdW1uLXNjb3BlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbHVtbmhlYWRlclwiLCBcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93aGVhZGVyXCIsIFwiZ3JpZGNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtZ3JpZC10cmVlZ3JpZC1jb2x1bW4tc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29sdW1uaGVhZGVyXCIsIFwiZ3JpZGNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJkZWZhdWx0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCJcIixcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfVxuICAgIH0gLy8gZW5kIG9mIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzXG5cbiAgICAvLyBtYXAgYXJpYSBhdHRyaWJ1dGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbmF0aXZlIGF0dHJpYnV0ZSwgYXBwbHkgdG8gYW55IGVsZW1lbnQgYXBwbGljYWJsZVxuICAgIC8vIG5vdGUgdGhpcyBtYXBwaW5nIGlzIGZvciB0aGUgcmVsYXRlZCBhdHRyaWJ1dGVzIGluIHRoZSBzYW1lIGVsZW1lbnQgd2l0aG91dCBjaGVja2luZyB0aGUgcGFyZW50IHRyZWUuXG4gICAgLy8gcmVmZXIgdG8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2h0bWwtYXJpYS9cbiAgICBzdGF0aWMgcmVsYXRlZEFyaWFIdG1sQXR0cmlidXRlczoge1xuICAgICAgICBbYXJpYUF0dHI6IHN0cmluZ10gOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IHN0cmluZ1tdIHwgbnVsbFxuICAgICAgICAgICAgfVtdLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc/OiB7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IHN0cmluZ1tdIHwgbnVsbFxuICAgICAgICAgICAgfVtdXG4gICAgICAgIH0gXG4gICAgfSA9ICB7XG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY2hlY2tlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY2hlY2tlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiZGlzYWJsZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImRpc2FibGVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJoaWRkZW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW1wiaGlkZGVuLG51bGxcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImhpZGRlblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJ1bnRpbC1mb3VuZFwiXVxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImhpZGRlblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJoaWRkZW4sbnVsbFwiXVxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJwbGFjZWhvbGRlclwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcIm1heFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICAgICAgLy9vdmVybGFwIGNhc2UgY292ZXJlZCBpbiB0aGUgcm9sZSBkZWZpbml0aW9uOiBBdXRob3JzIFNIT1VMRCBOT1QgdXNlIGFyaWEtdmFsdWVtYXggb24gYW55IGVsZW1lbnQgd2hpY2ggYWxsb3dzIHRoZSBtYXggYXR0cmlidXRlLiBVc2UgdGhlIG1heCBhdHRyaWJ1dGUgaW5zdGVhZC4gXG4gICAgICAgIH0sICAgIFxuICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wibWluXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAvLy8vb3ZlcmxhcCBjYXNlIGNvdmVyZWQgaW4gdGhlIHJvbGUgZGVmaW5pdGlvbjpBdXRob3JzIFNIT1VMRCBOT1QgdXNlIGFyaWEtdmFsdWVtaW4gb24gYW55IGVsZW1lbnQgd2hpY2ggYWxsb3dzIHRoZSBtaW4gYXR0cmlidXRlLiBVc2UgdGhlIG1pbiBhdHRyaWJ1dGUgaW5zdGVhZC5cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS1yZWFkb25seVwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlYWRvbmx5XCIsIFwiY29udGVudGVkaXRhYmxlXCIsIFwiaXNjb250ZW50ZWRpdGFibGVcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW251bGwsIFwiZmFsc2VcIiwgXCJmYWxzZVwiXVxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlYWRvbmx5XCIsIFwiY29udGVudGVkaXRhYmxlXCIsIFwiaXNjb250ZW50ZWRpdGFibGVcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW251bGwsIFwidHJ1ZVwiLCBcInRydWVcIl1cbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZXF1aXJlZFwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIFwiYXJpYS1jb2xzcGFuXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIHZhbHVlcyBhcmUgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcIlZBTFVFXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjb2xzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcIlZBTFVFXCJdXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICAvLyBvdmVybGFwIG9jY3VycyBpZiBib3RoIGV4aXN0c1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImNvbHNwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd3NwYW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgLy8gY29uZmxpY3Qgb2NjdXJzIGlmIGJvdGggdmFsdWVzIGFyZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiVkFMVUVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJvd3NwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW1wiVkFMVUVcIl1cbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgXG4gICAgICAgICAgICAgICAgLy8gb3ZlcmxhcCBvY2N1cnMgaWYgYm90aCBleGlzdHMgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicm93c3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LFxuICAgICAgICAvKiogXCJhcmlhLWF1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICAvLyBjb25mbGljdCBvY2N1cnMgaWYgYm90aCBleGlzdHMsIGFyaWEgdmFsdWUgaXMgb25seSBmb3IgY3VzdG9tIHdpZGdldCwgcmF0aGVyIHRoYW4gbmF0aXZlXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiYXV0b2NvbXBsZXRlXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0gKi8gXG4gICAgfVxuXG4gICAgc3RhdGljIGNvbnRhaW5lcnMgPSBbXVxufTtcblxubGV0IGNvbnRhaW5lckFycmF5ID0gW107XG5cbmZvciAoY29uc3Qgcm9sZURlc2lnbiBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpIHtcbiAgICBjb25zdCBjb250YWluZXJzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVEZXNpZ25dLmNvbnRhaW5lcjtcbiAgICBpZiAoY29udGFpbmVycyAhPT0gbnVsbCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBjb250YWluZXJzKSB7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyQXJyYXkuaW5kZXhPZihjb250YWluZXIpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyQXJyYXkucHVzaChjb250YWluZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuQVJJQURlZmluaXRpb25zLmNvbnRhaW5lcnMgPSBjb250YWluZXJBcnJheTtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4vQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBDb21tb25NYXBwZXIgfSBmcm9tIFwiLi4vY29tbW9uL0NvbW1vbk1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgSU1hcFJlc3VsdCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgQVJJQVdhbGtlciB9IGZyb20gXCIuL0FSSUFXYWxrZXJcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQWNjTmFtZVV0aWxcIjtcblxudHlwZSBFbGVtQ2FsYyA9IChlbGVtOiBFbGVtZW50KSA9PiBzdHJpbmc7XG50eXBlIE5vZGVDYWxjID0gKG5vZGU6IE5vZGUpID0+IHN0cmluZztcblxuZXhwb3J0IGNsYXNzIEFSSUFNYXBwZXIgZXh0ZW5kcyBDb21tb25NYXBwZXIge1xuICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGUobm9kZTogTm9kZSwgcm9sZTogc3RyaW5nKSA6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAvLyAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gIShyb2xlIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucyAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucHJlc2VudGF0aW9uYWxDaGlsZHJlbik7XG4gICAgfVxuICAgIGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5vZGUpO1xuICAgICAgICByZXR1cm4gcm9sZTtcbiAgICB9XG4gICAgZ2V0TmFtZXNwYWNlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcImFyaWFcIlxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9IHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHt9O1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVWYWwgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSBhcyBIVE1MRWxlbWVudCwgXCJBUklBTWFwcGVyOjpnZXRBdHRyaWJ1dGVzXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhY2hlVmFsICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gY2FjaGVWYWw7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxlbGVtLmF0dHJpYnV0ZXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJJbmZvID0gZWxlbS5hdHRyaWJ1dGVzW2lkeF07XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGF0dHJJbmZvLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiYXJpYS1cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW25hbWUuc3Vic3RyaW5nKDUpXSA9IGF0dHJJbmZvLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9wdGltaXplOiBDYWNoZSBub2RlTmFtZS50b0xvd2VyQ2FzZSgpIHRvIGF2b2lkIHJlcGVhdGVkIGNhbGxzXG4gICAgICAgICAgICBjb25zdCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQXBwbHkgZ2xvYmFsIGF0dHJpYnV0ZXMgZmlyc3RcbiAgICAgICAgICAgIEFSSUFNYXBwZXIuYXBwbHlBdHRyUm9sZShlbGVtLCBcImdsb2JhbFwiLCByZXRWYWwpO1xuICAgICAgICAgICAgLy8gQXBwbHkgZWxlbWVudC1zcGVjaWZpYyBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBBUklBTWFwcGVyLmFwcGx5QXR0clJvbGUoZWxlbSwgbm9kZU5hbWUsIHJldFZhbCk7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSBhcyBIVE1MRWxlbWVudCwgXCJBUklBTWFwcGVyOjpnZXRBdHRyaWJ1dGVzXCIsIHJldFZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgY2FsY3VsYXRvcnMgPSBBUklBTWFwcGVyLnRleHRBdHRyVmFsdWVDYWxjdWxhdG9ycztcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBjYWxjdWxhdG9ycykge1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBjYWxjdWxhdG9yc1thdHRyXShub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW2F0dHJdID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8vIE9wdGltaXplOiBNb3ZlIGFwcGx5QXR0clJvbGUgb3V0c2lkZSBnZXRBdHRyaWJ1dGVzIHRvIGF2b2lkIGZ1bmN0aW9uIHJlY3JlYXRpb25cbiAgICBwcml2YXRlIHN0YXRpYyBhcHBseUF0dHJSb2xlKGVsZW06IEVsZW1lbnQsIG5vZGVOYW1lOiBzdHJpbmcsIHJldFZhbDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0b3JzID0gQVJJQU1hcHBlci5lbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnM7XG4gICAgICAgIGlmICghKG5vZGVOYW1lIGluIGNhbGN1bGF0b3JzKSkgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCBhdHRyIGluIGNhbGN1bGF0b3JzW25vZGVOYW1lXSkge1xuICAgICAgICAgICAgaWYgKCEoYXR0ciBpbiByZXRWYWwpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gY2FsY3VsYXRvcnNbbm9kZU5hbWVdW2F0dHJdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgYXMgRWxlbUNhbGMpKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbFthdHRyXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRBcmlhT3duZWRCeShlbGVtOiBIVE1MRWxlbWVudCkgOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChlbGVtKTtcbiAgICAgICAgaWYgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIkFSSUFNYXBwZXI6OnByZWNhbGNPd25lZFwiLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG93bmVycyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFwiW2FyaWEtb3duc11cIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpT3duZXIgPSAwOyBpT3duZXIgPCBvd25lcnMubGVuZ3RoOyArK2lPd25lcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG93bmVyID0gb3duZXJzW2lPd25lcl07XG4gICAgICAgICAgICAgICAgY29uc3Qgb3duSWRzID0gb3duZXIuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpSWQ9MDsgaUlkIDwgb3duSWRzLmxlbmd0aDsgKytpSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZWQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lJZF0pO1xuICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZSBpZiB0aGUgYXJpYS1vd25zIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICAgICAgICAgICAgICAvL2lmIChvd25lZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShvd25lciwgb3duZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgIENhY2hlVXRpbC5zZXRDYWNoZShvd25lZCwgXCJhcmlhLW93bmVkXCIsIG93bmVyKTtcbiAgICAgICAgICAgICAgICAgICAgLy99XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiAgY2lyY3VsYXIgaGllcmFyY2h5IGNoZWNrOlxuICAgICAgICAgICAgICAgICAgICAgKiAgKDEpIHRoZSBvd25lZCBlbGVtZW50IGlzIG5laXRoZXIgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHRoZSBvd25lciBub3IgYW55IGFzY2VuZGFudCBvZiB0aGUgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICogICgyKSBhbnkgY2hpbGQgd2l0aCBhcmlhLW93bnMgY2Fubm90IHBvaW50IHRvIHRoZSBvd25lciBvciBhbnkgYXNjZW5kYW50IG9mIHRoZSBvd25lclxuICAgICAgICAgICAgICAgICAgICAgKi8gXG4gICAgICAgICAgICAgICAgICAgIGlmIChvd25lZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShvd25lciwgb3duZWQpKSB7ICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgb3duZWQgd2l0aCBhcmlhLW93bnMgdGhhdCBwb2ludHMgdG8gYW5vdGhlciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWROb2RlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViX293bmVycyA9IG93bmVkLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbYXJpYS1vd25zXVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViX293bmVycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Yl9vd25lciA9IHN1Yl9vd25lcnNbaV07IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Yl9vd25JZHMgPSBzdWJfb3duZXIuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqPTA7IGogPCBzdWJfb3duSWRzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG93bmVkTm9kZSA9IGRvYy5nZXRFbGVtZW50QnlJZChzdWJfb3duSWRzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkTm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkTm9kZXMucHVzaChvd25lZE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUob3duZWQsIFwiYXJpYS1vd25lZFwiLCBvd25lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYW55IGFyaWEtb3ducyBwb2ludHMgdG8gdGhlIGVsZW1lbnQgaXRzZWxmIG9yIGFueSBvZiBpdCdzIHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudCA6IEVsZW1lbnQgPSBvd25lcjsgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaXJjdWxhciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gb3duZWROb2Rlcy5zb21lKGl0ZW0gPT4gRE9NVXRpbC5zYW1lTm9kZShwYXJlbnQsIGl0ZW0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY3VsYXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNpcmN1bGFyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShvd25lZCwgXCJhcmlhLW93bmVkXCIsIG93bmVyKTsgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFSSUFNYXBwZXI6OnByZWNhbGNPd25lZFwiLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiYXJpYS1vd25lZFwiLCBudWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5vZGVIaWVyYXJjaHkobm9kZTogTm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBbXTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRIaWVyYXJjaHkgPSB0aGlzLmdldE5vZGVIaWVyYXJjaHkoRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkpO1xuICAgICAgICAgICAgbGV0IHBhcmVudEluZm8gPSBwYXJlbnRIaWVyYXJjaHkubGVuZ3RoID4gMCA/IHBhcmVudEhpZXJhcmNoeVtwYXJlbnRIaWVyYXJjaHkubGVuZ3RoLTFdIDoge1xuICAgICAgICAgICAgICAgIHJvbGU6IFwiXCIsXG4gICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbkNhbkhhdmVSb2xlOiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IG5vZGVIaWVyYXJjaHkgPSBbXTtcbiAgICAgICAgICAgIC8vIFNldCBoaWVyYXJjaHlcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRIaWVyYXJjaHkpIHtcbiAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2goe1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgICAgICAgIGJvdW5kczogdGhpcy5nZXRCb3VuZHMobm9kZSksXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB0aGlzLmdldE5hbWVzcGFjZSgpLFxuICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgICAgcm9sZTogdGhpcy5nZXRSb2xlKG5vZGUpIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgcm9sZVBhdGg6IHBhcmVudEluZm8ucm9sZVBhdGgrXCIvXCIrKHRoaXMuZ2V0Um9sZShub2RlKSB8fCBudWxsKSxcbiAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHt9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHBhcmVudEluZm8uY2hpbGRyZW5DYW5IYXZlUm9sZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZUhpZXJhcmNoeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGxldCBub2RlSGllcmFyY2h5IDogQXJyYXk8e1xuICAgICAgICAgICAgICAgIHJvbGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogbnVtYmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IGJvb2xlYW5cbiAgICAgICAgICAgIH0+ID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUhpZXJhcmNoeVwiLCBudWxsKTtcbiAgICAgICAgICAgIGlmICghbm9kZUhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgZWxlbWVudCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0IC0gYnV0IDo6cmVzZXQgcHJvY2Vzc2VzIHRoZW0gYWxsIGluIHRoZSByaWdodCBvcmRlclxuXG4gICAgICAgICAgICAgICAgLy8gR2V0IGRldGFpbHMgYWJvdXQgdGhlIGNvcnJlY3QgcGFyZW50IGZpcnN0XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMSkgeyBcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRIaWVyYXJjaHkgPSBwYXJlbnQgPyB0aGlzLmdldE5vZGVIaWVyYXJjaHkocGFyZW50KSA6IFtdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJbmZvID0gcGFyZW50SGllcmFyY2h5Lmxlbmd0aCA+IDAgPyBwYXJlbnRIaWVyYXJjaHlbcGFyZW50SGllcmFyY2h5Lmxlbmd0aC0xXSA6IHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnRJbmZvLnJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeShwYXJlbnQpIHx8IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHBhcmVudCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEhpZXJhcmNoeSA9IHBhcmVudCA/IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShwYXJlbnQpIDogW107XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZm8gPSBwYXJlbnRIaWVyYXJjaHlbcGFyZW50SGllcmFyY2h5Lmxlbmd0aC0xXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCBub2RlIGluZm9cbiAgICAgICAgICAgICAgICBsZXQgbm9kZUluZm8gOiB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBib3VuZHM6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICByb2xlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGU6IHN0cmluZ106IG51bWJlclxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IGJvb2xlYW5cbiAgICAgICAgICAgICAgICB9ID0ge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBlbGVtLm5vZGVUeXBlID09PSAxID8gdGhpcy5nZXRBdHRyaWJ1dGVzKGVsZW0pOiB7fSwgICBcbiAgICAgICAgICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhlbGVtKSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB0aGlzLmdldE5hbWVzcGFjZSgpLFxuICAgICAgICAgICAgICAgICAgICBub2RlOiBlbGVtLFxuICAgICAgICAgICAgICAgICAgICByb2xlOiB0aGlzLmdldFJvbGUoZWxlbSkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGp1c3Qgcm9sZSBpZiB3ZSdyZSB3aXRoaW4gYSBwcmVzZW50YXRpb25hbCBjb250YWluZXJcbiAgICAgICAgICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxDb250YWluZXIgPSAhcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlO1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25hbENvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5yb2xlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlID0gcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlIFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5jaGlsZHJlbkNhbkhhdmVSb2xlKGVsZW0sIG5vZGVJbmZvLnJvbGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcGF0aHNcbiAgICAgICAgICAgICAgICBpZiAobm9kZUluZm8ucm9sZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmZvLnJvbGVDb3VudFtub2RlSW5mby5yb2xlXSA9IChwYXJlbnRJbmZvLnJvbGVDb3VudFtub2RlSW5mby5yb2xlXSB8fCAwKSArIDE7IFxuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5yb2xlUGF0aCA9IHBhcmVudEluZm8ucm9sZVBhdGgrXCIvXCIrbm9kZUluZm8ucm9sZStcIltcIitwYXJlbnRJbmZvLnJvbGVDb3VudFtub2RlSW5mby5yb2xlXStcIl1cIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5yb2xlUGF0aCA9IHBhcmVudEluZm8ucm9sZVBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTZXQgaGllcmFyY2h5XG4gICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeSA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudEhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaChub2RlSW5mbyk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUhpZXJhcmNoeVwiLCBub2RlSGllcmFyY2h5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlSGllcmFyY2h5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXQobm9kZTogTm9kZSkge1xuICAgICAgICBBUklBTWFwcGVyLm5hbWVDb21wdXRhdGlvbklkID0gMDtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IFtdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGggPSBbe1xuICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICByb2xlQ291bnQ6IHt9XG4gICAgICAgIH1dO1xuICAgICAgICAvLyBHZXQgdG8gdGhlIHRvcG1vc3Qgbm9kZVxuICAgICAgICBsZXQgZ29vZE5vZGUgPSBub2RlO1xuICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgd2hpbGUgKG5leHQgPSBET01XYWxrZXIucGFyZW50Tm9kZShnb29kTm9kZSkpIHtcbiAgICAgICAgICAgIGdvb2ROb2RlID0gbmV4dDtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gV2FsayB0aGUgdHJlZSBhbmQgc2V0IHRoZSBoaWVyYXJjaGllcyBpbiB0aGUgcmlnaHQgb3JkZXJcbiAgICAgICAgbGV0IGFyaWFXYWxrZXIgPSBuZXcgQVJJQVdhbGtlcihnb29kTm9kZSwgZmFsc2UsIGdvb2ROb2RlKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGFyaWFXYWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShhcmlhV2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChhcmlhV2Fsa2VyLm5leHROb2RlKCkpO1xuICAgIH1cblxuICAgIG9wZW5TY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5Um9sZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkobm9kZSlcbiAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDx0aGlzLmhpZXJhcmNoeVJlc3VsdHMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUgJiYgdGhpcy5oaWVyYXJjaHlSZXN1bHRzW2lkeF0ucm9sZVswXSA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlID0gKHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUgPyB0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlLnN1YnN0cmluZygxKSA6IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmhpZXJhcmNoeVJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVzaEhpZXJhcmNoeShub2RlOiBOb2RlKSB7XG4gICAgICAgIC8vIElmIHdlJ3JlIG5vdCBhbiBlbGVtZW50LCBubyBzcGVjaWFsIGhhbmRsaW5nXG4gICAgICAgIGxldCBub2RlSGllcmFyY2h5ID0gW11cbiAgICAgICAgLy8gRGV0ZXJtaW5lIG91ciBub2RlIGluZm9cbiAgICAgICAgbm9kZUhpZXJhcmNoeSA9IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShub2RlKTtcbiAgICAgICAgbGV0IG5vZGVJbmZvID0gbm9kZUhpZXJhcmNoeVtub2RlSGllcmFyY2h5Lmxlbmd0aC0xXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlLnB1c2gobm9kZUluZm8ucm9sZSk7XG4gICAgICAgIGlmIChub2RlSW5mby5yb2xlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGgucHVzaChub2RlSW5mbyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMgPSBub2RlSGllcmFyY2h5O1xuICAgIH1cblxuICAgIGNsb3NlU2NvcGUobm9kZTogTm9kZSk6IElNYXBSZXN1bHRbXSB7XG4gICAgICAgIGxldCByZXRWYWwgOiBJTWFwUmVzdWx0W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgdGhpcy5oaWVyYXJjaHlSZXN1bHRzKSB7XG4gICAgICAgICAgICAvLyBjb25zdCB0ZW1wID0gcmVzLm5vZGU7XG4gICAgICAgICAgICAvLyByZXMubm9kZSA9IG51bGw7XG4gICAgICAgICAgICAvLyBsZXQgY2xvbmVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgICAgIC8vIGNsb25lZC5ub2RlID0gcmVzLm5vZGUgPSB0ZW1wOyBcbiAgICAgICAgICAgIC8vIHJldFZhbC5wdXNoKGNsb25lZCk7XG4gICAgICAgICAgICByZXRWYWwucHVzaChyZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZSA9IFwiL1wiK3JldFZhbFtyZXRWYWwubGVuZ3RoLTFdLnJvbGVcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChub2RlKTtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IHBhcmVudCA/IENhY2hlVXRpbC5nZXRDYWNoZShwYXJlbnQgYXMgSFRNTEVsZW1lbnQsIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUluZm9cIiwgW10pIDogW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uc1xuICAgIC8vLy9cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFhbS0xLjAvI21hcHBpbmctaHRtbC10by1hY2Nlc3NpYmlsaXR5LWFwaXNcbiAgICBwdWJsaWMgc3RhdGljIGVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yczogeyBbbm9kZU5hbWU6c3RyaW5nXTogeyBbYXR0cjpzdHJpbmddOiBzdHJpbmcgfCBFbGVtQ2FsYyB9fSA9IHtcbiAgICAgICAgXCJnbG9iYWxcIjoge1xuICAgICAgICAgICAgXCJuYW1lXCI6IGVsZW0gPT4gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGVsZW0pPy5uYW1lICAvL0FSSUFNYXBwZXIuY29tcHV0ZU5hbWVcbiAgICAgICAgfVxuICAgICAgICAsIFwiZGF0YWxpc3RcIjoge1xuICAgICAgICAgICAgLy8gc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBkYXRhbGlzdCdzIHNlbGVjdGlvbiBtb2RlbCBhbGxvd3MgbXVsdGlwbGUgb3B0aW9uIGVsZW1lbnRzIHRvIGJlXG4gICAgICAgICAgICAvLyBzZWxlY3RlZCBhdCBhIHRpbWUsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICBcIm11bHRpc2VsZWN0YWJsZVwiOiBlbGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgICAgICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0ID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFtsaXN0PSdcIitpZCtcIiddXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisoZWxlbS5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpPT1cIlwiKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcImgxXCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCIxXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDJcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjJcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoM1wiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiM1wiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImg0XCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCI0XCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDVcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjVcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoNlwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiNlwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImlucHV0XCI6IHtcbiAgICAgICAgICAgIC8vIC0gdHlwZT1cImNoZWNrYm94XCIgc3RhdGUgc2V0IHRvIFwibWl4ZWRcIiBpZiB0aGUgZWxlbWVudCdzIGluZGV0ZXJtaW5hdGUgSURMIGF0dHJpYnV0ZVxuICAgICAgICAgICAgLy8gaXMgdHJ1ZSwgb3IgXCJ0cnVlXCIgaWYgdGhlIGVsZW1lbnQncyBjaGVja2VkbmVzcyBpcyB0cnVlLCBvciBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIHN0YXRlIHNldCB0byBcInRydWVcIiBpZiB0aGUgZWxlbWVudCdzIGNoZWNrZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIlxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLlxuICAgICAgICAgICAgXCJjaGVja2VkXCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiY2hlY2tib3hcIiB8fCB0eXBlID09PSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrKGVsZW0gYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIGFuZCBub3QgaW4gbWVudSByZWZsZWN0aW5nIG51bWJlciBvZiB0eXBlPXJhZGlvIGlucHV0IGVsZW1lbnRzIFxuICAgICAgICAgICAgLy8gd2l0aGluIHRoZSByYWRpbyBidXR0b24gZ3JvdXBcbiAgICAgICAgICAgICwgXCJzZXRzaXplXCI6IGVsZW0gPT4geyByZXR1cm4gbnVsbDsgdGhyb3cgbmV3IEVycm9yKFwiTk9UIElNUExFTUVOVEVEXCIpOyB9XG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIGFuZCBub3QgaW4gbWVudSB2YWx1ZSByZWZsZWN0aW5nIHRoZSBlbGVtZW50cyBwb3NpdGlvbiBcbiAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgcmFkaW8gYnV0dG9uIGdyb3VwLlwiXG4gICAgICAgICAgICAsIFwicG9zaW5zZXRcIjogZWxlbSA9PiB7IHJldHVybiBudWxsOyB0aHJvdyBuZXcgRXJyb3IoXCJOT1QgSU1QTEVNRU5URURcIik7IH1cbiAgICAgICAgICAgIC8vIGlucHV0ICh0eXBlIGF0dHJpYnV0ZSBpbiB0aGUgVGV4dCwgU2VhcmNoLCBUZWxlcGhvbmUsIFVSTCwgb3IgRS1tYWlsIHN0YXRlcyB3aXRoIGEgXG4gICAgICAgICAgICAvLyBzdWdnZXN0aW9ucyBzb3VyY2UgZWxlbWVudCkgY29tYm9ib3ggcm9sZSwgd2l0aCB0aGUgYXJpYS1vd25zIHByb3BlcnR5IHNldCB0byB0aGUgc2FtZVxuICAgICAgICAgICAgLy8gdmFsdWUgYXMgdGhlIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAsIFwib3duc1wiOiBlbGVtID0+IHsgcmV0dXJuIG51bGw7IHRocm93IG5ldyBFcnJvcihcIk5PVCBJTVBMRU1FTlRFRFwiKTsgfVxuICAgICAgICB9XG4gICAgICAgICwgXCJrZXlnZW5cIjoge1xuICAgICAgICAgICAgXCJtdWx0aXNlbGVjdGFibGVcIjogXCJmYWxzZVwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImxpXCI6IHtcbiAgICAgICAgICAgIC8vIE51bWJlciBvZiBsaSBlbGVtZW50cyB3aXRoaW4gdGhlIG9sLCB1bCwgbWVudVxuICAgICAgICAgICAgXCJzZXRzaXplXCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbSwgW1wib2xcIiwgXCJ1bFwiLCBcIm1lbnVcIl0pO1xuICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXMgPSBDYWNoZVV0aWwuZ2V0U2V0Q2FjaGUocGFyZW50LCBcImVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yczo6bGlzXCIsICgpID0+IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwibGlcIikpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVybGlzID0gQ2FjaGVVdGlsLmdldFNldENhY2hlKHBhcmVudCwgXCJlbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnM6Om90aGVybGlzXCIsICgpID0+IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwib2wgbGksIHVsIGxpLCBtZW51IGxpXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisobGlzLmxlbmd0aC1vdGhlcmxpcy5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUG9zaXRpb24gb2YgbGkgZWxlbWVudCB3aXRoaW4gdGhlIG9sLCB1bCwgbWVudVxuICAgICAgICAgICAgLCBcInBvc2luc2V0XCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbSwgW1wib2xcIiwgXCJ1bFwiLCBcIm1lbnVcIl0pXG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpcyA9IENhY2hlVXRpbC5nZXRTZXRDYWNoZShwYXJlbnQsIFwiZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzOjpsaXNcIiwgKCkgPT4gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaVwiKSk7XG4gICAgICAgICAgICAgICAgbGV0IG51bSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxsaXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaSA9IGxpc1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShwYXJlbnQsIERPTVV0aWwuZ2V0QW5jZXN0b3IobGksIFtcIm9sXCIsIFwidWxcIiwgXCJtZW51XCJdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiK251bTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICArK251bTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcIm1lbnVpdGVtXCI6IHtcbiAgICAgICAgICAgIC8vIHR5cGUgPSBjaGVja2JveCBvciByYWRpbywgc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSBcbiAgICAgICAgICAgIC8vIGlzIHByZXNlbnQsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICBcImNoZWNrZWRcIjogZWxlbSA9PiBcIlwiKyEhKGVsZW0uZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSBcbiAgICAgICAgICAgICAgICAmJiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIik9PVwiXCIpKVxuICAgICAgICB9XG4gICAgICAgICwgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgLy8gc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBlbGVtZW50J3Mgc2VsZWN0ZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIiBvdGhlcndpc2UuXG4gICAgICAgICAgICBcInNlbGVjdGVkXCI6IGVsZW0gPT4gXCJcIishIShlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpIFxuICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpPT1cIlwiKSlcbiAgICAgICAgfVxuICAgICAgICAsIFwicHJvZ3Jlc3NcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZW1heFwiOiBlbGVtID0+IGVsZW0uZ2V0QXR0cmlidXRlKFwibWF4XCIpIHx8IFwiMVwiXG4gICAgICAgICAgICAsIFwidmFsdWVtaW5cIjogZWxlbSA9PiBcIjBcIlxuICAgICAgICAgICAgLCBcInZhbHVlbm93XCI6IGVsZW0gPT4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHRleHRBdHRyVmFsdWVDYWxjdWxhdG9yczogeyBbYXR0cjpzdHJpbmddOiBOb2RlQ2FsYyB9ID0ge1xuICAgICAgICBcIm5hbWVcIjogbm9kZSA9PiBub2RlLm5vZGVWYWx1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG5hbWVDb21wdXRhdGlvbklkID0gMDtcbiAgICAvKipwdWJsaWMgc3RhdGljIGNvbXB1dGVOYW1lKGN1cjogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICArK0FSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQ7XG4gICAgICAgIHJldHVybiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscChBUklBTWFwcGVyLm5hbWVDb21wdXRhdGlvbklkLCBjdXIsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlTmFtZUhlbHAod2Fsa0lkOiBudW1iZXIsIGN1cjogTm9kZSwgbGFiZWxsZWRieVRyYXZlcnNlOiBib29sZWFuLCB3YWxrVHJhdmVyc2U6IGJvb2xlYW4pIDogc3RyaW5nIHtcbiAgICAgICAgLy8gMmcuIE5vbmUgb2YgdGhlIG90aGVyIGNvbnRlbnQgYXBwbGllcyB0byB0ZXh0IG5vZGVzLCBzbyBqdXN0IGRvIHRoaXMgZmlyc3RcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSA9PT0gMyApIHJldHVybiBjdXIubm9kZVZhbHVlO1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09PSAxMSkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgIT09IDEgKSB7XG4gICAgICAgICAgICBpZiAod2Fsa1RyYXZlcnNlIHx8IGxhYmVsbGVkYnlUcmF2ZXJzZSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IgKFwiQ2FuIG9ubHkgY29tcHV0ZSBuYW1lIG9uIEVsZW1lbnQgYW5kIFRleHQgXCIgKyBjdXIubm9kZVR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxlbSA9IGN1ciBhcyBFbGVtZW50O1xuICAgICAgICAvLyBXZSd2ZSBiZWVuIGhlcmUgYmVmb3JlIC0gcHJldmVudCByZWN1cnNpb25cbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcImRhdGEtbmFtZXdhbGtcIiwgbnVsbCkgPT09IFwiXCIrd2Fsa0lkKSByZXR1cm4gXCJcIjtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiZGF0YS1uYW1ld2Fsa1wiLCBcIlwiK3dhbGtJZCk7XG4gICAgICAgIC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNpbnB1dC10eXBlLXRleHQtaW5wdXQtdHlwZS1wYXNzd29yZC1pbnB1dC10eXBlLXNlYXJjaC1pbnB1dC10eXBlLXRlbC1pbnB1dC10eXBlLXVybC1hbmQtdGV4dGFyZWEtZWxlbWVudFxuXG4gICAgICAgIC8vIDJhLiBPbmx5IHNob3cgaGlkZGVuIGNvbnRlbnQgaWYgaXQncyByZWZlcmVuY2VkIGJ5IGEgbGFiZWxsZWRieVxuICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGN1cikpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmIuIGNvbGxlY3QgdmFsaWQgaWQgcmVmZXJlbmNlc1xuICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbGV0IGxhYmVsbGVkYnkgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBsZXQgdmFsaWRFbGVtcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWYgb2YgbGFiZWxsZWRieSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChjdXIsIHJlZik7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkVsZW0gJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgcmVmRWxlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRFbGVtcy5wdXNoKHJlZkVsZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWxpZEVsZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgYWNjdW11bGF0ZWQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbSBvZiB2YWxpZEVsZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IFwiIFwiICsgdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBlbGVtLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZC50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5jZSBub2RlVG9Sb2xlIGNhbGxzIGJhY2sgaGVyZSBmb3IgZm9ybSBhbmQgc2VjdGlvbiwgd2UgbmVlZCBzcGVjaWFsIGNhc2luZyBoZXJlIHRvIGhhbmRsZSB0aG9zZSB0d28gY2FzZXNcbiAgICAgICAgaWYgKFtcInNlY3Rpb25cIiwgXCJmb3JtXCJdLmluY2x1ZGVzKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBJJ20gbm90IGFuIGVtYmVkZGVkIGNvbnRyb2wgb3IgSSdtIG5vdCByZWN1cnNpbmcsIHJldHVybiB0aGUgYXJpYS1sYWJlbFxuICAgICAgICAgICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICF3YWxrVHJhdmVyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmMuIElmIGxhYmVsIG9yIHdhbGssIGFuZCB0aGlzIGlzIGEgY29udHJvbCwgc2tpcCB0byB0aGUgdmFsdWUsIG90aGVyd2lzZSBwcm92aWRlIHRoZSBsYWJlbFxuICAgICAgICBjb25zdCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKGN1cik7XG4gICAgICAgIGxldCBpc0VtYmVkZGVkQ29udHJvbCA9IFtcbiAgICAgICAgICAgIFwidGV4dGJveFwiLCBcImJ1dHRvblwiLCBcImNvbWJvYm94XCIsIFwibGlzdGJveFwiLCBcbiAgICAgICAgICAgIFwicHJvZ3Jlc3NiYXJcIiwgXCJzY3JvbGxiYXJcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCJcbiAgICAgICAgXS5pbmNsdWRlcyhyb2xlKTtcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIElmIEknbSBub3QgYW4gZW1iZWRkZWQgY29udHJvbCBvciBJJ20gbm90IHJlY3Vyc2luZywgcmV0dXJuIHRoZSBhcmlhLWxhYmVsXG4gICAgICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiAhd2Fsa1RyYXZlcnNlIHx8ICFpc0VtYmVkZGVkQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmQuIFxuICAgICAgICBpZiAocm9sZSAhPT0gXCJwcmVzZW50YXRpb25cIiAmJiByb2xlICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgaWYgKChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiB8fCBjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhcmVhXCIpICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERPTVV0aWwuY2xlYW5XaGl0ZXNwYWNlKGVsZW0uZ2V0QXR0cmlidXRlKFwiYWx0XCIpKS50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiaWRcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJsYWJlbFtmb3I9J1wiK2VsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikrXCInXVwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgfHwgKGxhYmVsLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYoY3VyLCBsYWJlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgbGFiZWwsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWwudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZmllbGRzZXRcIikge1xuICAgICAgICAgICAgICAgIGlmKCAoPEVsZW1lbnQ+Y3VyKS5xdWVyeVNlbGVjdG9yKFwibGVnZW5kXCIpKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZ2VuZCA9ICg8RWxlbWVudD5jdXIpLnF1ZXJ5U2VsZWN0b3IoXCJsZWdlbmRcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWdlbmQuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBjdXIsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyAyZS5cbiAgICAgICAgaWYgKCh3YWxrVHJhdmVyc2UgfHwgbGFiZWxsZWRieVRyYXZlcnNlKSAmJiBpc0VtYmVkZGVkQ29udHJvbCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGVtYmVkZGVkIGNvbnRyb2wgaGFzIHJvbGUgdGV4dGJveCwgcmV0dXJuIGl0cyB2YWx1ZS5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcInRleHRib3hcIikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa1RyYXZlcnNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSBidXR0b24sIHJldHVybiB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgYnV0dG9uLlxuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFtcImJ1dHRvblwiLCBcInN1Ym1pdFwiLCBcInJlc2V0XCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJzdWJtaXRcIikgcmV0dXJuIFwiU3VibWl0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJyZXNldFwiKSByZXR1cm4gXCJSZXNldFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa1RyYXZlcnNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUT0RPOiBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSBjb21ib2JveCBvciBsaXN0Ym94LCByZXR1cm4gdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGNob3NlbiBvcHRpb24uXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW0sIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQgJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgc2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVJJQU1hcHBlci5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBzZWxlY3RlZCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIGVtYmVkZGVkIGNvbnRyb2wgaGFzIHJvbGUgcmFuZ2UgKGUuZy4sIGEgc3BpbmJ1dHRvbiBvciBzbGlkZXIpOlxuICAgICAgICAgICAgaWYgKFtcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiXS5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcmlhLXZhbHVldGV4dCBwcm9wZXJ0eSBpcyBwcmVzZW50LCByZXR1cm4gaXRzIHZhbHVlLFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtdmFsdWV0ZXh0XCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKTtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBhcmlhLXZhbHVlbm93IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBPdGhlcndpc2UsIHVzZSB0aGUgdmFsdWUgYXMgc3BlY2lmaWVkIGJ5IGEgaG9zdCBsYW5ndWFnZSBhdHRyaWJ1dGUuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyZi4gMmguXG4gICAgICAgIGlmICh3YWxrVHJhdmVyc2UgfHwgQVJJQURlZmluaXRpb25zLm5hbWVGcm9tQ29udGVudChyb2xlKSB8fCBsYWJlbGxlZGJ5VHJhdmVyc2UpIHtcbiAgICAgICAgICAgIC8vIDJmaS4gU2V0IHRoZSBhY2N1bXVsYXRlZCB0ZXh0IHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgICAgICAgICBsZXQgYWNjdW11bGF0ZWQgPSBcIlwiO1xuICAgICAgICAgICAgLy8gMmZpaS4gQ2hlY2sgZm9yIENTUyBnZW5lcmF0ZWQgdGV4dHVhbCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBub2RlIGFuZCBcbiAgICAgICAgICAgIC8vIGluY2x1ZGUgaXQgaW4gdGhlIGFjY3VtdWxhdGVkIHRleHQuIFRoZSBDU1MgOmJlZm9yZSBhbmQgOmFmdGVyIHBzZXVkbyBlbGVtZW50cyBbQ1NTMl0gXG4gICAgICAgICAgICAvLyBjYW4gcHJvdmlkZSB0ZXh0dWFsIGNvbnRlbnQgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIGNvbnRlbnQgbW9kZWwuXG4gICAgICAgICAgICAvLyAgIEZvciA6YmVmb3JlIHBzZXVkbyBlbGVtZW50cywgVXNlciBhZ2VudHMgTVVTVCBwcmVwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgXG4gICAgICAgICAgICAvLyAgICAgYSBzcGFjZSwgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgICAgLy8gICBGb3IgOmFmdGVyIHBzZXVkbyBlbGVtZW50cywgVXNlciBhZ2VudHMgTVVTVCBhcHBlbmQgQ1NTIHRleHR1YWwgY29udGVudCwgd2l0aG91dCBhIFxuICAgICAgICAgICAgLy8gICAgIHNwYWNlLCB0byB0aGUgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gbnVsbDtcbiAgICAgICAgICAgIGJlZm9yZSA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sXCJiZWZvcmVcIikuY29udGVudDtcblxuICAgICAgICAgICAgaWYgKGJlZm9yZSAmJiBiZWZvcmUgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlID0gYmVmb3JlLnJlcGxhY2UoL15cIi8sXCJcIikucmVwbGFjZSgvXCIkLyxcIlwiKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBiZWZvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAyZmlpaS4gRm9yIGVhY2ggY2hpbGQgbm9kZSBvZiB0aGUgY3VycmVudCBub2RlOlxuICAgICAgICAgICAgLy8gICBTZXQgdGhlIGN1cnJlbnQgbm9kZSB0byB0aGUgY2hpbGQgbm9kZS5cbiAgICAgICAgICAgIC8vICAgQ29tcHV0ZSB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgY3VycmVudCBub2RlIGJlZ2lubmluZyB3aXRoIHN0ZXAgMi4gU2V0IHRoZSByZXN1bHQgXG4gICAgICAgICAgICAvLyAgICAgdG8gdGhhdCB0ZXh0IGFsdGVybmF0aXZlLlxuICAgICAgICAgICAgLy8gICBBcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUgYWNjdW11bGF0ZWQgdGV4dC5cbiAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0xPVFwiKSB7XG4gICAgICAgICAgICAgICAgLy9pZiBubyBhc3NpZ25lZE5vZGUsIGNoZWNrIGl0cyBvd24gdGV4dCBcbiAgICAgICAgICAgICAgICBpZiAoIShlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpIHx8IChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5uZXJUZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lclRleHQgJiYgaW5uZXJUZXh0ICE9PSBudWxsICYmIGlubmVyVGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9ICBcIiBcIiArIGlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGV4dCBmcm9tIGFsbCBhc3NpZ25lZCBub2Rlc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNsb3RDaGlsZCBvZiAoZWxlbSBhcyBIVE1MU2xvdEVsZW1lbnQpLmFzc2lnbmVkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRDaGlsZENvbnRlbnQgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIHNsb3RDaGlsZCwgbGFiZWxsZWRieVRyYXZlcnNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IFwiIFwiICsgbmV4dENoaWxkQ29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHdhbGtDaGlsZCA9IGVsZW0uZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB3aGlsZSAod2Fsa0NoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0Q2hpbGRDb250ZW50ID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCB3YWxrQ2hpbGQsIGxhYmVsbGVkYnlUcmF2ZXJzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IFwiIFwiICsgbmV4dENoaWxkQ29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkID0gd2Fsa0NoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGFmdGVyID0gbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLFwiYWZ0ZXJcIikuY29udGVudDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgICAgICAgIGlmIChhZnRlciAmJiBhZnRlciAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBhZnRlciA9IGFmdGVyLnJlcGxhY2UoL15cIi8sXCJcIikucmVwbGFjZSgvXCIkLyxcIlwiKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBhZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDJmaXYuIFJldHVybiB0aGUgYWNjdW11bGF0ZWQgdGV4dC5cbiAgICAgICAgICAgIGFjY3VtdWxhdGVkID0gYWNjdW11bGF0ZWQucmVwbGFjZSgvXFxzKy9nLFwiIFwiKS50cmltKCk7XG4gICAgICAgICAgICBpZiAoYWNjdW11bGF0ZWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyaS4gT3RoZXJ3aXNlLCBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBhIFRvb2x0aXAgYXR0cmlidXRlLCByZXR1cm4gaXRzIHZhbHVlLlxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aXRsZS50ZXh0Q29udGVudCB8fCB0aXRsZS5pbm5lclRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgKi9cbi8qICAgICAgICBpZiAocm9sZSBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbSBcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKSBcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSA9IGVsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiaWRcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbmFtZSA9IGVsZW0ub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibGFiZWxbZm9yPSdcIitlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpLnRyaW0oKStcIiddXCIpLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgIG5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICBuYW1lID0gXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICAgICAgbmFtZSArPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtLCBpZCkudGV4dENvbnRlbnQgKyBcIiBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9Ki9cblxuICAgIHB1YmxpYyBzdGF0aWMgbm9kZVRvUm9sZShub2RlIDogTm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIFwidGV4dFwiO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghZWxlbSB8fCBlbGVtLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPIERPOiB1c2UgQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pIHRvIHJlcGxhY2UgdGhlIGNvZGUgZm9sbG93aW5nLCB3aGljaCB1c2VzIG9ubHkgdGhlIHZhbGlkIHJvbGVzIGZvciB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgYXJpYSBmYWxsYmFjayBydWxlXG4gICAgICAgIC8vY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgLy9yZXR1cm4gcm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCByb2xlID09PSBcIm5vbmVcIiA/IG51bGwgOiByb2xlO1xuICAgICAgICBcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCByb2xlU3RyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGxldCByb2xlcyA9IHJvbGVTdHIuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgcm9sZSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZWxlbWVudCBpcyBmb2N1c2FibGUsIHRoZW4gcHJlc2VudGF0aW9uIHJvbGVzIGFyZSB0byBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5pc0ZvY3VzYWJsZShlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb2xlO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gdGhpcy5lbGVtVG9JbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZW0pO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwibm9kZT1cIiArIG5vZGUubm9kZU5hbWUgK1wiLCByb2xlPSBcIiArIChyb2xlcyA/IHJvbGVzWzBdIDogbnVsbCkgK1wiLCByZXNvbHZlZD1cIiArIEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKSk7XG4gICAgICAgIGNvbnN0IHJvbGUgPSAhcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PTAgPyBudWxsIDogcm9sZXNbMF07XG4gICAgICAgIHJldHVybiByb2xlID09PSBcInByZXNlbnRhdGlvblwiIHx8IHJvbGUgPT09IFwibm9uZVwiID8gbnVsbCA6IHJvbGU7XG4gICAgICAgIC8vcmV0dXJuIEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgXG4gICAgfVxufSBcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4vQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG5cbi8qKlxuICogV2Fsa3MgaW4gYW4gQVJJQSBvcmRlclxuICogXG4gKiBTZWUgYWxzbyAuLi9kb20vRE9NV2Fsa2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBBUklBV2Fsa2VyIHtcbiAgICByb290IDogTm9kZTtcbiAgICBub2RlIDogTm9kZTtcbiAgICBiRW5kVGFnOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudCA6IE5vZGUsIGJFbmQ/IDogYm9vbGVhbiwgcm9vdD8gOiBOb2RlKSB7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3QgfHwgZWxlbWVudDtcbiAgICAgICAgaWYgKHRoaXMucm9vdC5ub2RlVHlwZSA9PT0gOSkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gKHRoaXMucm9vdCBhcyBEb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudDtcbiAgICAgICAgLy8gaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gOSkge1xuICAgICAgICAvLyAgICAgdGhpcy5ub2RlID0gKHRoaXMubm9kZSBhcyBEb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5iRW5kVGFnID0gKGJFbmQgPT0gdW5kZWZpbmVkID8gZmFsc2UgOiBiRW5kID09IHRydWUpO1xuICAgIH1cblxuICAgIGF0Um9vdCgpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICgodGhpcyBhcyBhbnkpLm93bmVyRWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yb290ID09PSB0aGlzLm5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5pc1NhbWVOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmlzU2FtZU5vZGUodGhpcy5ub2RlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5ub2RlKSA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCAtIHRyeSBvdXIgYmVzdFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wYXJlbnROb2RlID09PSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmV4dE5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgc2tpcE93bmVkID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5ub2RlLm5vZGVOYW1lLCB0aGlzLmJFbmRUYWc/XCJFTkRcIjpcIlNUQVJUXCIsIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIGFueSkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBzbG90RWxlbWVudCA9ICh0aGlzLm5vZGUgYXMgSFRNTFNsb3RFbGVtZW50KVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290LmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50Tm9kZS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBET01XYWxrZXIuYXNzaWduU2xvdHModGhpcy5ub2RlIGFzIFNoYWRvd1Jvb3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICAgICAmJiBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKClbMF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICovKSBcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5maXJzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2xvdE93bmVyID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTbG90SW5kZXggPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4KzE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRTbG90SW5kZXggPCBzbG90T3duZXIuYXNzaWduZWROb2RlcygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKVtuZXh0U2xvdEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLm5leHRTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIubmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgc2tpcE93bmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG93bklkcyA9ICh0aGlzLm5vZGUucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgfHwgISh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpLmhhc0F0dHJpYnV0ZShcImlkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQodGhpcy5ub2RlKS5nZXRFbGVtZW50QnlJZChvd25JZHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gb3duSWRzLmluZGV4T2YoKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT09IG93bklkcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlOyAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyYWIgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudCh0aGlzLm5vZGUpLmdldEVsZW1lbnRCeUlkKG93bklkc1tpZHgrMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICAgICAgfHwgKHNraXBPd25lZCAmJiB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgISFBUklBTWFwcGVyLmdldEFyaWFPd25lZEJ5KHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByZXZOb2RlKCkgOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBza2lwT3duZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3RcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdC5sYXN0Q2hpbGQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgRE9NV2Fsa2VyLmFzc2lnblNsb3RzKHRoaXMubm9kZSBhcyBTaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSkgXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBza2lwT3duZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duSWRzID0gKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSB8fCAhKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudCh0aGlzLm5vZGUpLmdldEVsZW1lbnRCeUlkKG93bklkc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBvd25JZHMuaW5kZXhPZigodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gb3duSWRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7ICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JhYiBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lkeCsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEpXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICAgICB8fCAoc2tpcE93bmVkICYmIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhIUFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vLi4vLi4vYXBpL0lFbmdpbmVcIjtcblxuZXhwb3J0IGNsYXNzIEFuY2VzdG9yVXRpbCB7XG4gICAgcHVibGljIHN0YXRpYyBpc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaHk6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY29udGV4dEhpZXJhcmNoeSAmJiBjb250ZXh0SGllcmFyY2h5LmRvbSkge1xuICAgICAgICAgICAgLy8gU2tpcCBjdXJyZW50IG5vZGUgYmVjYXVzZSB3ZSB3YW50IGFuY2VzdHJ5XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9Y29udGV4dEhpZXJhcmNoeS5kb20ubGVuZ3RoLTI7IGlkeCA+PSAwOyAtLWlkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSAoY29udGV4dEhpZXJhcmNoeS5kb21baWR4XS5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlVHlwZSA9PT0gMSBcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlmcmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSA9PT0gXCJ0cnVlXCIpKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0ZyYW1lKGNvbnRleHRIaWVyYXJjaHk6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY29udGV4dEhpZXJhcmNoeSAmJiBjb250ZXh0SGllcmFyY2h5LmRvbSkge1xuICAgICAgICAgICAgLy8gU2tpcCBjdXJyZW50IG5vZGUgYmVjYXVzZSB3ZSB3YW50IGFuY2VzdHJ5XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9Y29udGV4dEhpZXJhcmNoeS5kb20ubGVuZ3RoLTI7IGlkeCA+PSAwOyAtLWlkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSAoY29udGV4dEhpZXJhcmNoeS5kb21baWR4XS5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaWZyYW1lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi8uLi8uLi9hcGkvSUVuZ2luZVwiO1xuXG5leHBvcnQgY2xhc3MgRnJhZ21lbnRVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIGdldE93bmVyRnJhZ21lbnQobm9kZTogTm9kZSkgOiBEb2N1bWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICAgICAgICBsZXQgbiA6IE5vZGUgPSBub2RlO1xuICAgICAgICB3aGlsZShuLnBhcmVudE5vZGUgJiYgKG4gPSBuLnBhcmVudE5vZGUpKXtcbiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlID09PSAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEJ5SWQobm9kZTogTm9kZSwgaWQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPd25lckZyYWdtZW50KG5vZGUpLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yKGhpZXJhcmNoaWVzOiBSdWxlQ29udGV4dEhpZXJhcmNoeSwgZWxlbU5hbWU6IHN0cmluZykge1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IGhpZXJhcmNoaWVzW1wiZG9tXCJdLmZpbHRlcihpbmZvID0+IGluZm8ucm9sZSA9PT0gZWxlbU5hbWUpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlcy5sZW5ndGggPiAwICYmIG1hdGNoZXNbMF0ubm9kZSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QW5jZXN0b3JXaXRoUm9sZShoaWVyYXJjaGllczogUnVsZUNvbnRleHRIaWVyYXJjaHksIHJvbGU6IHN0cmluZykge1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IGhpZXJhcmNoaWVzW1wiYXJpYVwiXS5maWx0ZXIoaW5mbyA9PiBpbmZvLnJvbGUgPT09IHJvbGUpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlcy5sZW5ndGggPiAwICYmIG1hdGNoZXNbMF0ubm9kZSB8fCBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjEtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIEZyb20gaHR0cHM6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbGFuZ3VhZ2Utc3VidGFnLXJlZ2lzdHJ5L2xhbmd1YWdlLXN1YnRhZy1yZWdpc3RyeVxuY29uc3QgdmFsaWRQcmltYXJ5TGFuZ3MgPSBbIC8vIFwicWFhLi5xdHpcIixcblsgXCJhYVwiLFwiYWJcIixcImFlXCIsXCJhZlwiLFwiYWtcIixcImFtXCIsXCJhblwiLFwiYXJcIixcImFzXCIsXCJhdlwiLFwiYXlcIixcImF6XCIsXCJhYWFcIixcImFhYlwiLFwiYWFjXCIsXCJhYWRcIixcImFhZVwiLFwiYWFmXCIsXCJhYWdcIixcImFhaFwiLFwiYWFpXCIsXCJhYWtcIixcImFhbFwiLFwiYWFtXCIsXCJhYW5cIixcImFhb1wiLFwiYWFwXCIsXCJhYXFcIixcImFhc1wiLFwiYWF0XCIsXCJhYXVcIixcImFhdlwiLFwiYWF3XCIsXCJhYXhcIixcImFhelwiLFwiYWJhXCIsXCJhYmJcIixcImFiY1wiLFwiYWJkXCIsXCJhYmVcIixcImFiZlwiLFwiYWJnXCIsXCJhYmhcIixcImFiaVwiLFwiYWJqXCIsXCJhYmxcIixcImFibVwiLFwiYWJuXCIsXCJhYm9cIixcImFicFwiLFwiYWJxXCIsXCJhYnJcIixcImFic1wiLFwiYWJ0XCIsXCJhYnVcIixcImFidlwiLFwiYWJ3XCIsXCJhYnhcIixcImFieVwiLFwiYWJ6XCIsXCJhY2FcIixcImFjYlwiLFwiYWNkXCIsXCJhY2VcIixcImFjZlwiLFwiYWNoXCIsXCJhY2lcIixcImFja1wiLFwiYWNsXCIsXCJhY21cIixcImFjblwiLFwiYWNwXCIsXCJhY3FcIixcImFjclwiLFwiYWNzXCIsXCJhY3RcIixcImFjdVwiLFwiYWN2XCIsXCJhY3dcIixcImFjeFwiLFwiYWN5XCIsXCJhY3pcIixcImFkYVwiLFwiYWRiXCIsXCJhZGRcIixcImFkZVwiLFwiYWRmXCIsXCJhZGdcIixcImFkaFwiLFwiYWRpXCIsXCJhZGpcIixcImFkbFwiLFwiYWRuXCIsXCJhZG9cIixcImFkcFwiLFwiYWRxXCIsXCJhZHJcIixcImFkc1wiLFwiYWR0XCIsXCJhZHVcIixcImFkd1wiLFwiYWR4XCIsXCJhZHlcIixcImFkelwiLFwiYWVhXCIsXCJhZWJcIixcImFlY1wiLFwiYWVkXCIsXCJhZWVcIixcImFla1wiLFwiYWVsXCIsXCJhZW1cIixcImFlblwiLFwiYWVxXCIsXCJhZXJcIixcImFlc1wiLFwiYWV1XCIsXCJhZXdcIixcImFleVwiLFwiYWV6XCIsXCJhZmFcIixcImFmYlwiLFwiYWZkXCIsXCJhZmVcIixcImFmZ1wiLFwiYWZoXCIsXCJhZmlcIixcImFma1wiLFwiYWZuXCIsXCJhZm9cIixcImFmcFwiLFwiYWZzXCIsXCJhZnRcIixcImFmdVwiLFwiYWZ6XCIsXCJhZ2FcIixcImFnYlwiLFwiYWdjXCIsXCJhZ2RcIixcImFnZVwiLFwiYWdmXCIsXCJhZ2dcIixcImFnaFwiLFwiYWdpXCIsXCJhZ2pcIixcImFna1wiLFwiYWdsXCIsXCJhZ21cIixcImFnblwiLFwiYWdvXCIsXCJhZ3BcIixcImFncVwiLFwiYWdyXCIsXCJhZ3NcIixcImFndFwiLFwiYWd1XCIsXCJhZ3ZcIixcImFnd1wiLFwiYWd4XCIsXCJhZ3lcIixcImFnelwiLFwiYWhhXCIsXCJhaGJcIixcImFoZ1wiLFwiYWhoXCIsXCJhaGlcIixcImFoa1wiLFwiYWhsXCIsXCJhaG1cIixcImFoblwiLFwiYWhvXCIsXCJhaHBcIixcImFoclwiLFwiYWhzXCIsXCJhaHRcIixcImFpYVwiLFwiYWliXCIsXCJhaWNcIixcImFpZFwiLFwiYWllXCIsXCJhaWZcIixcImFpZ1wiLFwiYWloXCIsXCJhaWlcIixcImFpalwiLFwiYWlrXCIsXCJhaWxcIixcImFpbVwiLFwiYWluXCIsXCJhaW9cIixcImFpcFwiLFwiYWlxXCIsXCJhaXJcIixcImFpc1wiLFwiYWl0XCIsXCJhaXdcIixcImFpeFwiLFwiYWl5XCIsXCJhamFcIixcImFqZ1wiLFwiYWppXCIsXCJham5cIixcImFqcFwiLFwiYWp0XCIsXCJhanVcIixcImFqd1wiLFwiYWp6XCIsXCJha2JcIixcImFrY1wiLFwiYWtkXCIsXCJha2VcIixcImFrZlwiLFwiYWtnXCIsXCJha2hcIixcImFraVwiLFwiYWtqXCIsXCJha2tcIixcImFrbFwiLFwiYWttXCIsXCJha29cIixcImFrcFwiLFwiYWtxXCIsXCJha3JcIixcImFrc1wiLFwiYWt0XCIsXCJha3VcIixcImFrdlwiLFwiYWt3XCIsXCJha3hcIixcImFreVwiLFwiYWt6XCIsXCJhbGFcIixcImFsY1wiLFwiYWxkXCIsXCJhbGVcIixcImFsZlwiLFwiYWxnXCIsXCJhbGhcIixcImFsaVwiLFwiYWxqXCIsXCJhbGtcIixcImFsbFwiLFwiYWxtXCIsXCJhbG5cIixcImFsb1wiLFwiYWxwXCIsXCJhbHFcIixcImFsclwiLFwiYWxzXCIsXCJhbHRcIixcImFsdVwiLFwiYWx2XCIsXCJhbHdcIixcImFseFwiLFwiYWx5XCIsXCJhbHpcIixcImFtYVwiLFwiYW1iXCIsXCJhbWNcIixcImFtZVwiLFwiYW1mXCIsXCJhbWdcIixcImFtaVwiLFwiYW1qXCIsXCJhbWtcIixcImFtbFwiLFwiYW1tXCIsXCJhbW5cIixcImFtb1wiLFwiYW1wXCIsXCJhbXFcIixcImFtclwiLFwiYW1zXCIsXCJhbXRcIixcImFtdVwiLFwiYW12XCIsXCJhbXdcIixcImFteFwiLFwiYW15XCIsXCJhbXpcIixcImFuYVwiLFwiYW5iXCIsXCJhbmNcIixcImFuZFwiLFwiYW5lXCIsXCJhbmZcIixcImFuZ1wiLFwiYW5oXCIsXCJhbmlcIixcImFualwiLFwiYW5rXCIsXCJhbmxcIixcImFubVwiLFwiYW5uXCIsXCJhbm9cIixcImFucFwiLFwiYW5xXCIsXCJhbnJcIixcImFuc1wiLFwiYW50XCIsXCJhbnVcIixcImFudlwiLFwiYW53XCIsXCJhbnhcIixcImFueVwiLFwiYW56XCIsXCJhb2FcIixcImFvYlwiLFwiYW9jXCIsXCJhb2RcIixcImFvZVwiLFwiYW9mXCIsXCJhb2dcIixcImFvaFwiLFwiYW9pXCIsXCJhb2pcIixcImFva1wiLFwiYW9sXCIsXCJhb21cIixcImFvblwiLFwiYW9yXCIsXCJhb3NcIixcImFvdFwiLFwiYW91XCIsXCJhb3hcIixcImFvelwiLFwiYXBhXCIsXCJhcGJcIixcImFwY1wiLFwiYXBkXCIsXCJhcGVcIixcImFwZlwiLFwiYXBnXCIsXCJhcGhcIixcImFwaVwiLFwiYXBqXCIsXCJhcGtcIixcImFwbFwiLFwiYXBtXCIsXCJhcG5cIixcImFwb1wiLFwiYXBwXCIsXCJhcHFcIixcImFwclwiLFwiYXBzXCIsXCJhcHRcIixcImFwdVwiLFwiYXB2XCIsXCJhcHdcIixcImFweFwiLFwiYXB5XCIsXCJhcHpcIixcImFxYVwiLFwiYXFjXCIsXCJhcWRcIixcImFxZ1wiLFwiYXFrXCIsXCJhcWxcIixcImFxbVwiLFwiYXFuXCIsXCJhcXBcIixcImFxclwiLFwiYXF0XCIsXCJhcXpcIixcImFyYlwiLFwiYXJjXCIsXCJhcmRcIixcImFyZVwiLFwiYXJoXCIsXCJhcmlcIixcImFyalwiLFwiYXJrXCIsXCJhcmxcIixcImFyblwiLFwiYXJvXCIsXCJhcnBcIixcImFycVwiLFwiYXJyXCIsXCJhcnNcIixcImFydFwiLFwiYXJ1XCIsXCJhcnZcIixcImFyd1wiLFwiYXJ4XCIsXCJhcnlcIixcImFyelwiLFwiYXNhXCIsXCJhc2JcIixcImFzY1wiLFwiYXNkXCIsXCJhc2VcIixcImFzZlwiLFwiYXNnXCIsXCJhc2hcIixcImFzaVwiLFwiYXNqXCIsXCJhc2tcIixcImFzbFwiLFwiYXNuXCIsXCJhc29cIixcImFzcFwiLFwiYXNxXCIsXCJhc3JcIixcImFzc1wiLFwiYXN0XCIsXCJhc3VcIixcImFzdlwiLFwiYXN3XCIsXCJhc3hcIixcImFzeVwiLFwiYXN6XCIsXCJhdGFcIixcImF0YlwiLFwiYXRjXCIsXCJhdGRcIixcImF0ZVwiLFwiYXRnXCIsXCJhdGhcIixcImF0aVwiLFwiYXRqXCIsXCJhdGtcIixcImF0bFwiLFwiYXRtXCIsXCJhdG5cIixcImF0b1wiLFwiYXRwXCIsXCJhdHFcIixcImF0clwiLFwiYXRzXCIsXCJhdHRcIixcImF0dVwiLFwiYXR2XCIsXCJhdHdcIixcImF0eFwiLFwiYXR5XCIsXCJhdHpcIixcImF1YVwiLFwiYXViXCIsXCJhdWNcIixcImF1ZFwiLFwiYXVlXCIsXCJhdWZcIixcImF1Z1wiLFwiYXVoXCIsXCJhdWlcIixcImF1alwiLFwiYXVrXCIsXCJhdWxcIixcImF1bVwiLFwiYXVuXCIsXCJhdW9cIixcImF1cFwiLFwiYXVxXCIsXCJhdXJcIixcImF1c1wiLFwiYXV0XCIsXCJhdXVcIixcImF1d1wiLFwiYXV4XCIsXCJhdXlcIixcImF1elwiLFwiYXZiXCIsXCJhdmRcIixcImF2aVwiLFwiYXZrXCIsXCJhdmxcIixcImF2bVwiLFwiYXZuXCIsXCJhdm9cIixcImF2c1wiLFwiYXZ0XCIsXCJhdnVcIixcImF2dlwiLFwiYXdhXCIsXCJhd2JcIixcImF3Y1wiLFwiYXdkXCIsXCJhd2VcIixcImF3Z1wiLFwiYXdoXCIsXCJhd2lcIixcImF3a1wiLFwiYXdtXCIsXCJhd25cIixcImF3b1wiLFwiYXdyXCIsXCJhd3NcIixcImF3dFwiLFwiYXd1XCIsXCJhd3ZcIixcImF3d1wiLFwiYXd4XCIsXCJhd3lcIixcImF4YlwiLFwiYXhlXCIsXCJheGdcIixcImF4a1wiLFwiYXhsXCIsXCJheG1cIixcImF4eFwiLFwiYXlhXCIsXCJheWJcIixcImF5Y1wiLFwiYXlkXCIsXCJheWVcIixcImF5Z1wiLFwiYXloXCIsXCJheWlcIixcImF5a1wiLFwiYXlsXCIsXCJheW5cIixcImF5b1wiLFwiYXlwXCIsXCJheXFcIixcImF5clwiLFwiYXlzXCIsXCJheXRcIixcImF5dVwiLFwiYXl4XCIsXCJheXlcIixcImF5elwiLFwiYXphXCIsXCJhemJcIixcImF6Y1wiLFwiYXpkXCIsXCJhemdcIixcImF6alwiLFwiYXptXCIsXCJhem5cIixcImF6b1wiLFwiYXp0XCIsXCJhenpcIl1cbixbIFwiYmFcIixcImJlXCIsXCJiZ1wiLFwiYmhcIixcImJpXCIsXCJibVwiLFwiYm5cIixcImJvXCIsXCJiclwiLFwiYnNcIixcImJhYVwiLFwiYmFiXCIsXCJiYWNcIixcImJhZFwiLFwiYmFlXCIsXCJiYWZcIixcImJhZ1wiLFwiYmFoXCIsXCJiYWlcIixcImJhalwiLFwiYmFsXCIsXCJiYW5cIixcImJhb1wiLFwiYmFwXCIsXCJiYXJcIixcImJhc1wiLFwiYmF0XCIsXCJiYXVcIixcImJhdlwiLFwiYmF3XCIsXCJiYXhcIixcImJheVwiLFwiYmF6XCIsXCJiYmFcIixcImJiYlwiLFwiYmJjXCIsXCJiYmRcIixcImJiZVwiLFwiYmJmXCIsXCJiYmdcIixcImJiaFwiLFwiYmJpXCIsXCJiYmpcIixcImJia1wiLFwiYmJsXCIsXCJiYm1cIixcImJiblwiLFwiYmJvXCIsXCJiYnBcIixcImJicVwiLFwiYmJyXCIsXCJiYnNcIixcImJidFwiLFwiYmJ1XCIsXCJiYnZcIixcImJid1wiLFwiYmJ4XCIsXCJiYnlcIixcImJielwiLFwiYmNhXCIsXCJiY2JcIixcImJjY1wiLFwiYmNkXCIsXCJiY2VcIixcImJjZlwiLFwiYmNnXCIsXCJiY2hcIixcImJjaVwiLFwiYmNqXCIsXCJiY2tcIixcImJjbFwiLFwiYmNtXCIsXCJiY25cIixcImJjb1wiLFwiYmNwXCIsXCJiY3FcIixcImJjclwiLFwiYmNzXCIsXCJiY3RcIixcImJjdVwiLFwiYmN2XCIsXCJiY3dcIixcImJjeVwiLFwiYmN6XCIsXCJiZGFcIixcImJkYlwiLFwiYmRjXCIsXCJiZGRcIixcImJkZVwiLFwiYmRmXCIsXCJiZGdcIixcImJkaFwiLFwiYmRpXCIsXCJiZGpcIixcImJka1wiLFwiYmRsXCIsXCJiZG1cIixcImJkblwiLFwiYmRvXCIsXCJiZHBcIixcImJkcVwiLFwiYmRyXCIsXCJiZHNcIixcImJkdFwiLFwiYmR1XCIsXCJiZHZcIixcImJkd1wiLFwiYmR4XCIsXCJiZHlcIixcImJkelwiLFwiYmVhXCIsXCJiZWJcIixcImJlY1wiLFwiYmVkXCIsXCJiZWVcIixcImJlZlwiLFwiYmVnXCIsXCJiZWhcIixcImJlaVwiLFwiYmVqXCIsXCJiZWtcIixcImJlbVwiLFwiYmVvXCIsXCJiZXBcIixcImJlcVwiLFwiYmVyXCIsXCJiZXNcIixcImJldFwiLFwiYmV1XCIsXCJiZXZcIixcImJld1wiLFwiYmV4XCIsXCJiZXlcIixcImJlelwiLFwiYmZhXCIsXCJiZmJcIixcImJmY1wiLFwiYmZkXCIsXCJiZmVcIixcImJmZlwiLFwiYmZnXCIsXCJiZmhcIixcImJmaVwiLFwiYmZqXCIsXCJiZmtcIixcImJmbFwiLFwiYmZtXCIsXCJiZm5cIixcImJmb1wiLFwiYmZwXCIsXCJiZnFcIixcImJmclwiLFwiYmZzXCIsXCJiZnRcIixcImJmdVwiLFwiYmZ3XCIsXCJiZnhcIixcImJmeVwiLFwiYmZ6XCIsXCJiZ2FcIixcImJnYlwiLFwiYmdjXCIsXCJiZ2RcIixcImJnZVwiLFwiYmdmXCIsXCJiZ2dcIixcImJnaVwiLFwiYmdqXCIsXCJiZ2tcIixcImJnbFwiLFwiYmdtXCIsXCJiZ25cIixcImJnb1wiLFwiYmdwXCIsXCJiZ3FcIixcImJnclwiLFwiYmdzXCIsXCJiZ3RcIixcImJndVwiLFwiYmd2XCIsXCJiZ3dcIixcImJneFwiLFwiYmd5XCIsXCJiZ3pcIixcImJoYVwiLFwiYmhiXCIsXCJiaGNcIixcImJoZFwiLFwiYmhlXCIsXCJiaGZcIixcImJoZ1wiLFwiYmhoXCIsXCJiaGlcIixcImJoalwiLFwiYmhrXCIsXCJiaGxcIixcImJobVwiLFwiYmhuXCIsXCJiaG9cIixcImJocFwiLFwiYmhxXCIsXCJiaHJcIixcImJoc1wiLFwiYmh0XCIsXCJiaHVcIixcImJodlwiLFwiYmh3XCIsXCJiaHhcIixcImJoeVwiLFwiYmh6XCIsXCJiaWFcIixcImJpYlwiLFwiYmljXCIsXCJiaWRcIixcImJpZVwiLFwiYmlmXCIsXCJiaWdcIixcImJpalwiLFwiYmlrXCIsXCJiaWxcIixcImJpbVwiLFwiYmluXCIsXCJiaW9cIixcImJpcFwiLFwiYmlxXCIsXCJiaXJcIixcImJpdFwiLFwiYml1XCIsXCJiaXZcIixcImJpd1wiLFwiYml4XCIsXCJiaXlcIixcImJpelwiLFwiYmphXCIsXCJiamJcIixcImJqY1wiLFwiYmpkXCIsXCJiamVcIixcImJqZlwiLFwiYmpnXCIsXCJiamhcIixcImJqaVwiLFwiYmpqXCIsXCJiamtcIixcImJqbFwiLFwiYmptXCIsXCJiam5cIixcImJqb1wiLFwiYmpwXCIsXCJianFcIixcImJqclwiLFwiYmpzXCIsXCJianRcIixcImJqdVwiLFwiYmp2XCIsXCJiandcIixcImJqeFwiLFwiYmp5XCIsXCJianpcIixcImJrYVwiLFwiYmtiXCIsXCJia2NcIixcImJrZFwiLFwiYmtmXCIsXCJia2dcIixcImJraFwiLFwiYmtpXCIsXCJia2pcIixcImJra1wiLFwiYmtsXCIsXCJia21cIixcImJrblwiLFwiYmtvXCIsXCJia3BcIixcImJrcVwiLFwiYmtyXCIsXCJia3NcIixcImJrdFwiLFwiYmt1XCIsXCJia3ZcIixcImJrd1wiLFwiYmt4XCIsXCJia3lcIixcImJrelwiLFwiYmxhXCIsXCJibGJcIixcImJsY1wiLFwiYmxkXCIsXCJibGVcIixcImJsZlwiLFwiYmxnXCIsXCJibGhcIixcImJsaVwiLFwiYmxqXCIsXCJibGtcIixcImJsbFwiLFwiYmxtXCIsXCJibG5cIixcImJsb1wiLFwiYmxwXCIsXCJibHFcIixcImJsclwiLFwiYmxzXCIsXCJibHRcIixcImJsdlwiLFwiYmx3XCIsXCJibHhcIixcImJseVwiLFwiYmx6XCIsXCJibWFcIixcImJtYlwiLFwiYm1jXCIsXCJibWRcIixcImJtZVwiLFwiYm1mXCIsXCJibWdcIixcImJtaFwiLFwiYm1pXCIsXCJibWpcIixcImJta1wiLFwiYm1sXCIsXCJibW1cIixcImJtblwiLFwiYm1vXCIsXCJibXBcIixcImJtcVwiLFwiYm1yXCIsXCJibXNcIixcImJtdFwiLFwiYm11XCIsXCJibXZcIixcImJtd1wiLFwiYm14XCIsXCJibXlcIixcImJtelwiLFwiYm5hXCIsXCJibmJcIixcImJuY1wiLFwiYm5kXCIsXCJibmVcIixcImJuZlwiLFwiYm5nXCIsXCJibmlcIixcImJualwiLFwiYm5rXCIsXCJibmxcIixcImJubVwiLFwiYm5uXCIsXCJibm9cIixcImJucFwiLFwiYm5xXCIsXCJibnJcIixcImJuc1wiLFwiYm50XCIsXCJibnVcIixcImJudlwiLFwiYm53XCIsXCJibnhcIixcImJueVwiLFwiYm56XCIsXCJib2FcIixcImJvYlwiLFwiYm9lXCIsXCJib2ZcIixcImJvZ1wiLFwiYm9oXCIsXCJib2lcIixcImJvalwiLFwiYm9rXCIsXCJib2xcIixcImJvbVwiLFwiYm9uXCIsXCJib29cIixcImJvcFwiLFwiYm9xXCIsXCJib3JcIixcImJvdFwiLFwiYm91XCIsXCJib3ZcIixcImJvd1wiLFwiYm94XCIsXCJib3lcIixcImJvelwiLFwiYnBhXCIsXCJicGJcIixcImJwZFwiLFwiYnBlXCIsXCJicGdcIixcImJwaFwiLFwiYnBpXCIsXCJicGpcIixcImJwa1wiLFwiYnBsXCIsXCJicG1cIixcImJwblwiLFwiYnBvXCIsXCJicHBcIixcImJwcVwiLFwiYnByXCIsXCJicHNcIixcImJwdFwiLFwiYnB1XCIsXCJicHZcIixcImJwd1wiLFwiYnB4XCIsXCJicHlcIixcImJwelwiLFwiYnFhXCIsXCJicWJcIixcImJxY1wiLFwiYnFkXCIsXCJicWZcIixcImJxZ1wiLFwiYnFoXCIsXCJicWlcIixcImJxalwiLFwiYnFrXCIsXCJicWxcIixcImJxbVwiLFwiYnFuXCIsXCJicW9cIixcImJxcFwiLFwiYnFxXCIsXCJicXJcIixcImJxc1wiLFwiYnF0XCIsXCJicXVcIixcImJxdlwiLFwiYnF3XCIsXCJicXhcIixcImJxeVwiLFwiYnF6XCIsXCJicmFcIixcImJyYlwiLFwiYnJjXCIsXCJicmRcIixcImJyZlwiLFwiYnJnXCIsXCJicmhcIixcImJyaVwiLFwiYnJqXCIsXCJicmtcIixcImJybFwiLFwiYnJtXCIsXCJicm5cIixcImJyb1wiLFwiYnJwXCIsXCJicnFcIixcImJyclwiLFwiYnJzXCIsXCJicnRcIixcImJydVwiLFwiYnJ2XCIsXCJicndcIixcImJyeFwiLFwiYnJ5XCIsXCJicnpcIixcImJzYVwiLFwiYnNiXCIsXCJic2NcIixcImJzZVwiLFwiYnNmXCIsXCJic2dcIixcImJzaFwiLFwiYnNpXCIsXCJic2pcIixcImJza1wiLFwiYnNsXCIsXCJic21cIixcImJzblwiLFwiYnNvXCIsXCJic3BcIixcImJzcVwiLFwiYnNyXCIsXCJic3NcIixcImJzdFwiLFwiYnN1XCIsXCJic3ZcIixcImJzd1wiLFwiYnN4XCIsXCJic3lcIixcImJ0YVwiLFwiYnRiXCIsXCJidGNcIixcImJ0ZFwiLFwiYnRlXCIsXCJidGZcIixcImJ0Z1wiLFwiYnRoXCIsXCJidGlcIixcImJ0alwiLFwiYnRrXCIsXCJidGxcIixcImJ0bVwiLFwiYnRuXCIsXCJidG9cIixcImJ0cFwiLFwiYnRxXCIsXCJidHJcIixcImJ0c1wiLFwiYnR0XCIsXCJidHVcIixcImJ0dlwiLFwiYnR3XCIsXCJidHhcIixcImJ0eVwiLFwiYnR6XCIsXCJidWFcIixcImJ1YlwiLFwiYnVjXCIsXCJidWRcIixcImJ1ZVwiLFwiYnVmXCIsXCJidWdcIixcImJ1aFwiLFwiYnVpXCIsXCJidWpcIixcImJ1a1wiLFwiYnVtXCIsXCJidW5cIixcImJ1b1wiLFwiYnVwXCIsXCJidXFcIixcImJ1c1wiLFwiYnV0XCIsXCJidXVcIixcImJ1dlwiLFwiYnV3XCIsXCJidXhcIixcImJ1eVwiLFwiYnV6XCIsXCJidmFcIixcImJ2YlwiLFwiYnZjXCIsXCJidmRcIixcImJ2ZVwiLFwiYnZmXCIsXCJidmdcIixcImJ2aFwiLFwiYnZpXCIsXCJidmpcIixcImJ2a1wiLFwiYnZsXCIsXCJidm1cIixcImJ2blwiLFwiYnZvXCIsXCJidnBcIixcImJ2cVwiLFwiYnZyXCIsXCJidnRcIixcImJ2dVwiLFwiYnZ2XCIsXCJidndcIixcImJ2eFwiLFwiYnZ5XCIsXCJidnpcIixcImJ3YVwiLFwiYndiXCIsXCJid2NcIixcImJ3ZFwiLFwiYndlXCIsXCJid2ZcIixcImJ3Z1wiLFwiYndoXCIsXCJid2lcIixcImJ3alwiLFwiYndrXCIsXCJid2xcIixcImJ3bVwiLFwiYnduXCIsXCJid29cIixcImJ3cFwiLFwiYndxXCIsXCJid3JcIixcImJ3c1wiLFwiYnd0XCIsXCJid3VcIixcImJ3d1wiLFwiYnd4XCIsXCJid3lcIixcImJ3elwiLFwiYnhhXCIsXCJieGJcIixcImJ4Y1wiLFwiYnhkXCIsXCJieGVcIixcImJ4ZlwiLFwiYnhnXCIsXCJieGhcIixcImJ4aVwiLFwiYnhqXCIsXCJieGtcIixcImJ4bFwiLFwiYnhtXCIsXCJieG5cIixcImJ4b1wiLFwiYnhwXCIsXCJieHFcIixcImJ4clwiLFwiYnhzXCIsXCJieHVcIixcImJ4dlwiLFwiYnh3XCIsXCJieHhcIixcImJ4elwiLFwiYnlhXCIsXCJieWJcIixcImJ5Y1wiLFwiYnlkXCIsXCJieWVcIixcImJ5ZlwiLFwiYnlnXCIsXCJieWhcIixcImJ5aVwiLFwiYnlqXCIsXCJieWtcIixcImJ5bFwiLFwiYnltXCIsXCJieW5cIixcImJ5b1wiLFwiYnlwXCIsXCJieXFcIixcImJ5clwiLFwiYnlzXCIsXCJieXRcIixcImJ5dlwiLFwiYnl3XCIsXCJieXhcIixcImJ5eVwiLFwiYnl6XCIsXCJiemFcIixcImJ6YlwiLFwiYnpjXCIsXCJiemRcIixcImJ6ZVwiLFwiYnpmXCIsXCJiemdcIixcImJ6aFwiLFwiYnppXCIsXCJiempcIixcImJ6a1wiLFwiYnpsXCIsXCJiem1cIixcImJ6blwiLFwiYnpvXCIsXCJienBcIixcImJ6cVwiLFwiYnpyXCIsXCJienNcIixcImJ6dFwiLFwiYnp1XCIsXCJienZcIixcImJ6d1wiLFwiYnp4XCIsXCJienlcIixcImJ6elwiXVxuLFsgXCJjYVwiLFwiY2VcIixcImNoXCIsXCJjb1wiLFwiY3JcIixcImNzXCIsXCJjdVwiLFwiY3ZcIixcImN5XCIsXCJjYWFcIixcImNhYlwiLFwiY2FjXCIsXCJjYWRcIixcImNhZVwiLFwiY2FmXCIsXCJjYWdcIixcImNhaFwiLFwiY2FpXCIsXCJjYWpcIixcImNha1wiLFwiY2FsXCIsXCJjYW1cIixcImNhblwiLFwiY2FvXCIsXCJjYXBcIixcImNhcVwiLFwiY2FyXCIsXCJjYXNcIixcImNhdVwiLFwiY2F2XCIsXCJjYXdcIixcImNheFwiLFwiY2F5XCIsXCJjYXpcIixcImNiYVwiLFwiY2JiXCIsXCJjYmNcIixcImNiZFwiLFwiY2JlXCIsXCJjYmdcIixcImNiaFwiLFwiY2JpXCIsXCJjYmpcIixcImNia1wiLFwiY2JsXCIsXCJjYm5cIixcImNib1wiLFwiY2JxXCIsXCJjYnJcIixcImNic1wiLFwiY2J0XCIsXCJjYnVcIixcImNidlwiLFwiY2J3XCIsXCJjYnlcIixcImNjYVwiLFwiY2NjXCIsXCJjY2RcIixcImNjZVwiLFwiY2NnXCIsXCJjY2hcIixcImNjalwiLFwiY2NsXCIsXCJjY21cIixcImNjblwiLFwiY2NvXCIsXCJjY3BcIixcImNjcVwiLFwiY2NyXCIsXCJjY3NcIixcImNkYVwiLFwiY2RjXCIsXCJjZGRcIixcImNkZVwiLFwiY2RmXCIsXCJjZGdcIixcImNkaFwiLFwiY2RpXCIsXCJjZGpcIixcImNkbVwiLFwiY2RuXCIsXCJjZG9cIixcImNkclwiLFwiY2RzXCIsXCJjZHlcIixcImNkelwiLFwiY2VhXCIsXCJjZWJcIixcImNlZ1wiLFwiY2VrXCIsXCJjZWxcIixcImNlblwiLFwiY2V0XCIsXCJjZXlcIixcImNmYVwiLFwiY2ZkXCIsXCJjZmdcIixcImNmbVwiLFwiY2dhXCIsXCJjZ2NcIixcImNnZ1wiLFwiY2drXCIsXCJjaGJcIixcImNoY1wiLFwiY2hkXCIsXCJjaGZcIixcImNoZ1wiLFwiY2hoXCIsXCJjaGpcIixcImNoa1wiLFwiY2hsXCIsXCJjaG1cIixcImNoblwiLFwiY2hvXCIsXCJjaHBcIixcImNocVwiLFwiY2hyXCIsXCJjaHRcIixcImNod1wiLFwiY2h4XCIsXCJjaHlcIixcImNoelwiLFwiY2lhXCIsXCJjaWJcIixcImNpY1wiLFwiY2lkXCIsXCJjaWVcIixcImNpaFwiLFwiY2lrXCIsXCJjaW1cIixcImNpblwiLFwiY2lwXCIsXCJjaXJcIixcImNpd1wiLFwiY2l5XCIsXCJjamFcIixcImNqZVwiLFwiY2poXCIsXCJjamlcIixcImNqa1wiLFwiY2ptXCIsXCJjam5cIixcImNqb1wiLFwiY2pwXCIsXCJjanJcIixcImNqc1wiLFwiY2p2XCIsXCJjanlcIixcImNrYVwiLFwiY2tiXCIsXCJja2hcIixcImNrbFwiLFwiY2ttXCIsXCJja25cIixcImNrb1wiLFwiY2txXCIsXCJja3JcIixcImNrc1wiLFwiY2t0XCIsXCJja3VcIixcImNrdlwiLFwiY2t4XCIsXCJja3lcIixcImNrelwiLFwiY2xhXCIsXCJjbGNcIixcImNsZFwiLFwiY2xlXCIsXCJjbGhcIixcImNsaVwiLFwiY2xqXCIsXCJjbGtcIixcImNsbFwiLFwiY2xtXCIsXCJjbG9cIixcImNsdFwiLFwiY2x1XCIsXCJjbHdcIixcImNseVwiLFwiY21hXCIsXCJjbWNcIixcImNtZVwiLFwiY21nXCIsXCJjbWlcIixcImNta1wiLFwiY21sXCIsXCJjbW1cIixcImNtblwiLFwiY21vXCIsXCJjbXJcIixcImNtc1wiLFwiY210XCIsXCJjbmFcIixcImNuYlwiLFwiY25jXCIsXCJjbmdcIixcImNuaFwiLFwiY25pXCIsXCJjbmtcIixcImNubFwiLFwiY25vXCIsXCJjbnBcIixcImNuclwiLFwiY25zXCIsXCJjbnRcIixcImNudVwiLFwiY253XCIsXCJjbnhcIixcImNvYVwiLFwiY29iXCIsXCJjb2NcIixcImNvZFwiLFwiY29lXCIsXCJjb2ZcIixcImNvZ1wiLFwiY29oXCIsXCJjb2pcIixcImNva1wiLFwiY29sXCIsXCJjb21cIixcImNvblwiLFwiY29vXCIsXCJjb3BcIixcImNvcVwiLFwiY290XCIsXCJjb3VcIixcImNvdlwiLFwiY293XCIsXCJjb3hcIixcImNveVwiLFwiY296XCIsXCJjcGFcIixcImNwYlwiLFwiY3BjXCIsXCJjcGVcIixcImNwZlwiLFwiY3BnXCIsXCJjcGlcIixcImNwblwiLFwiY3BvXCIsXCJjcHBcIixcImNwc1wiLFwiY3B1XCIsXCJjcHhcIixcImNweVwiLFwiY3FkXCIsXCJjcXVcIixcImNyYVwiLFwiY3JiXCIsXCJjcmNcIixcImNyZFwiLFwiY3JmXCIsXCJjcmdcIixcImNyaFwiLFwiY3JpXCIsXCJjcmpcIixcImNya1wiLFwiY3JsXCIsXCJjcm1cIixcImNyblwiLFwiY3JvXCIsXCJjcnBcIixcImNycVwiLFwiY3JyXCIsXCJjcnNcIixcImNydFwiLFwiY3J2XCIsXCJjcndcIixcImNyeFwiLFwiY3J5XCIsXCJjcnpcIixcImNzYVwiLFwiY3NiXCIsXCJjc2NcIixcImNzZFwiLFwiY3NlXCIsXCJjc2ZcIixcImNzZ1wiLFwiY3NoXCIsXCJjc2lcIixcImNzalwiLFwiY3NrXCIsXCJjc2xcIixcImNzbVwiLFwiY3NuXCIsXCJjc29cIixcImNzcFwiLFwiY3NxXCIsXCJjc3JcIixcImNzc1wiLFwiY3N0XCIsXCJjc3VcIixcImNzdlwiLFwiY3N3XCIsXCJjc3hcIixcImNzeVwiLFwiY3N6XCIsXCJjdGFcIixcImN0Y1wiLFwiY3RkXCIsXCJjdGVcIixcImN0Z1wiLFwiY3RoXCIsXCJjdGxcIixcImN0bVwiLFwiY3RuXCIsXCJjdG9cIixcImN0cFwiLFwiY3RzXCIsXCJjdHRcIixcImN0dVwiLFwiY3R5XCIsXCJjdHpcIixcImN1YVwiLFwiY3ViXCIsXCJjdWNcIixcImN1Z1wiLFwiY3VoXCIsXCJjdWlcIixcImN1alwiLFwiY3VrXCIsXCJjdWxcIixcImN1bVwiLFwiY3VvXCIsXCJjdXBcIixcImN1cVwiLFwiY3VyXCIsXCJjdXNcIixcImN1dFwiLFwiY3V1XCIsXCJjdXZcIixcImN1d1wiLFwiY3V4XCIsXCJjdXlcIixcImN2Z1wiLFwiY3ZuXCIsXCJjd2FcIixcImN3YlwiLFwiY3dkXCIsXCJjd2VcIixcImN3Z1wiLFwiY3d0XCIsXCJjeWFcIixcImN5YlwiLFwiY3lvXCIsXCJjemhcIixcImN6a1wiLFwiY3puXCIsXCJjem9cIixcImN6dFwiXVxuLFsgXCJkYVwiLFwiZGVcIixcImR2XCIsXCJkelwiLFwiZGFhXCIsXCJkYWNcIixcImRhZFwiLFwiZGFlXCIsXCJkYWZcIixcImRhZ1wiLFwiZGFoXCIsXCJkYWlcIixcImRhalwiLFwiZGFrXCIsXCJkYWxcIixcImRhbVwiLFwiZGFvXCIsXCJkYXBcIixcImRhcVwiLFwiZGFyXCIsXCJkYXNcIixcImRhdVwiLFwiZGF2XCIsXCJkYXdcIixcImRheFwiLFwiZGF5XCIsXCJkYXpcIixcImRiYVwiLFwiZGJiXCIsXCJkYmRcIixcImRiZVwiLFwiZGJmXCIsXCJkYmdcIixcImRiaVwiLFwiZGJqXCIsXCJkYmxcIixcImRibVwiLFwiZGJuXCIsXCJkYm9cIixcImRicFwiLFwiZGJxXCIsXCJkYnJcIixcImRidFwiLFwiZGJ1XCIsXCJkYnZcIixcImRid1wiLFwiZGJ5XCIsXCJkY2NcIixcImRjclwiLFwiZGRhXCIsXCJkZGRcIixcImRkZVwiLFwiZGRnXCIsXCJkZGlcIixcImRkalwiLFwiZGRuXCIsXCJkZG9cIixcImRkclwiLFwiZGRzXCIsXCJkZHdcIixcImRlY1wiLFwiZGVkXCIsXCJkZWVcIixcImRlZlwiLFwiZGVnXCIsXCJkZWhcIixcImRlaVwiLFwiZGVrXCIsXCJkZWxcIixcImRlbVwiLFwiZGVuXCIsXCJkZXBcIixcImRlcVwiLFwiZGVyXCIsXCJkZXNcIixcImRldlwiLFwiZGV6XCIsXCJkZ2FcIixcImRnYlwiLFwiZGdjXCIsXCJkZ2RcIixcImRnZVwiLFwiZGdnXCIsXCJkZ2hcIixcImRnaVwiLFwiZGdrXCIsXCJkZ2xcIixcImRnblwiLFwiZGdvXCIsXCJkZ3JcIixcImRnc1wiLFwiZGd0XCIsXCJkZ3VcIixcImRnd1wiLFwiZGd4XCIsXCJkZ3pcIixcImRoYVwiLFwiZGhkXCIsXCJkaGdcIixcImRoaVwiLFwiZGhsXCIsXCJkaG1cIixcImRoblwiLFwiZGhvXCIsXCJkaHJcIixcImRoc1wiLFwiZGh1XCIsXCJkaHZcIixcImRod1wiLFwiZGh4XCIsXCJkaWFcIixcImRpYlwiLFwiZGljXCIsXCJkaWRcIixcImRpZlwiLFwiZGlnXCIsXCJkaWhcIixcImRpaVwiLFwiZGlqXCIsXCJkaWtcIixcImRpbFwiLFwiZGltXCIsXCJkaW5cIixcImRpb1wiLFwiZGlwXCIsXCJkaXFcIixcImRpclwiLFwiZGlzXCIsXCJkaXRcIixcImRpdVwiLFwiZGl3XCIsXCJkaXhcIixcImRpeVwiLFwiZGl6XCIsXCJkamFcIixcImRqYlwiLFwiZGpjXCIsXCJkamRcIixcImRqZVwiLFwiZGpmXCIsXCJkamlcIixcImRqalwiLFwiZGprXCIsXCJkamxcIixcImRqbVwiLFwiZGpuXCIsXCJkam9cIixcImRqclwiLFwiZGp1XCIsXCJkandcIixcImRrYVwiLFwiZGtnXCIsXCJka2tcIixcImRrbFwiLFwiZGtyXCIsXCJka3NcIixcImRreFwiLFwiZGxnXCIsXCJkbGtcIixcImRsbVwiLFwiZGxuXCIsXCJkbWFcIixcImRtYlwiLFwiZG1jXCIsXCJkbWRcIixcImRtZVwiLFwiZG1mXCIsXCJkbWdcIixcImRta1wiLFwiZG1sXCIsXCJkbW1cIixcImRtblwiLFwiZG1vXCIsXCJkbXJcIixcImRtc1wiLFwiZG11XCIsXCJkbXZcIixcImRtd1wiLFwiZG14XCIsXCJkbXlcIixcImRuYVwiLFwiZG5kXCIsXCJkbmVcIixcImRuZ1wiLFwiZG5pXCIsXCJkbmpcIixcImRua1wiLFwiZG5uXCIsXCJkbm9cIixcImRuclwiLFwiZG50XCIsXCJkbnVcIixcImRudlwiLFwiZG53XCIsXCJkbnlcIixcImRvYVwiLFwiZG9iXCIsXCJkb2NcIixcImRvZVwiLFwiZG9mXCIsXCJkb2hcIixcImRvaVwiLFwiZG9rXCIsXCJkb2xcIixcImRvblwiLFwiZG9vXCIsXCJkb3BcIixcImRvcVwiLFwiZG9yXCIsXCJkb3NcIixcImRvdFwiLFwiZG92XCIsXCJkb3dcIixcImRveFwiLFwiZG95XCIsXCJkb3pcIixcImRwcFwiLFwiZHJhXCIsXCJkcmJcIixcImRyY1wiLFwiZHJkXCIsXCJkcmVcIixcImRyZ1wiLFwiZHJoXCIsXCJkcmlcIixcImRybFwiLFwiZHJuXCIsXCJkcm9cIixcImRycVwiLFwiZHJyXCIsXCJkcnNcIixcImRydFwiLFwiZHJ1XCIsXCJkcndcIixcImRyeVwiLFwiZHNiXCIsXCJkc2VcIixcImRzaFwiLFwiZHNpXCIsXCJkc2xcIixcImRzblwiLFwiZHNvXCIsXCJkc3FcIixcImR0YVwiLFwiZHRiXCIsXCJkdGRcIixcImR0aFwiLFwiZHRpXCIsXCJkdGtcIixcImR0bVwiLFwiZHRuXCIsXCJkdG9cIixcImR0cFwiLFwiZHRyXCIsXCJkdHNcIixcImR0dFwiLFwiZHR1XCIsXCJkdHlcIixcImR1YVwiLFwiZHViXCIsXCJkdWNcIixcImR1ZFwiLFwiZHVlXCIsXCJkdWZcIixcImR1Z1wiLFwiZHVoXCIsXCJkdWlcIixcImR1alwiLFwiZHVrXCIsXCJkdWxcIixcImR1bVwiLFwiZHVuXCIsXCJkdW9cIixcImR1cFwiLFwiZHVxXCIsXCJkdXJcIixcImR1c1wiLFwiZHV1XCIsXCJkdXZcIixcImR1d1wiLFwiZHV4XCIsXCJkdXlcIixcImR1elwiLFwiZHZhXCIsXCJkd2FcIixcImR3a1wiLFwiZHdsXCIsXCJkd3JcIixcImR3c1wiLFwiZHd1XCIsXCJkd3dcIixcImR3eVwiLFwiZHd6XCIsXCJkeWFcIixcImR5YlwiLFwiZHlkXCIsXCJkeWdcIixcImR5aVwiLFwiZHltXCIsXCJkeW5cIixcImR5b1wiLFwiZHl1XCIsXCJkeXlcIixcImR6YVwiLFwiZHpkXCIsXCJkemVcIixcImR6Z1wiLFwiZHpsXCIsXCJkem5cIl1cbixbIFwiZWVcIixcImVsXCIsXCJlblwiLFwiZW9cIixcImVzXCIsXCJldFwiLFwiZXVcIixcImVhYVwiLFwiZWJjXCIsXCJlYmdcIixcImVia1wiLFwiZWJvXCIsXCJlYnJcIixcImVidVwiLFwiZWNyXCIsXCJlY3NcIixcImVjeVwiLFwiZWVlXCIsXCJlZmFcIixcImVmZVwiLFwiZWZpXCIsXCJlZ2FcIixcImVnbFwiLFwiZWdvXCIsXCJlZ3hcIixcImVneVwiLFwiZWhzXCIsXCJlaHVcIixcImVpcFwiLFwiZWl0XCIsXCJlaXZcIixcImVqYVwiLFwiZWthXCIsXCJla2NcIixcImVrZVwiLFwiZWtnXCIsXCJla2lcIixcImVra1wiLFwiZWtsXCIsXCJla21cIixcImVrb1wiLFwiZWtwXCIsXCJla3JcIixcImVreVwiLFwiZWxlXCIsXCJlbGhcIixcImVsaVwiLFwiZWxrXCIsXCJlbG1cIixcImVsb1wiLFwiZWxwXCIsXCJlbHVcIixcImVseFwiLFwiZW1hXCIsXCJlbWJcIixcImVtZVwiLFwiZW1nXCIsXCJlbWlcIixcImVta1wiLFwiZW1tXCIsXCJlbW5cIixcImVtb1wiLFwiZW1wXCIsXCJlbXFcIixcImVtc1wiLFwiZW11XCIsXCJlbXdcIixcImVteFwiLFwiZW15XCIsXCJlbXpcIixcImVuYVwiLFwiZW5iXCIsXCJlbmNcIixcImVuZFwiLFwiZW5mXCIsXCJlbmhcIixcImVubFwiLFwiZW5tXCIsXCJlbm5cIixcImVub1wiLFwiZW5xXCIsXCJlbnJcIixcImVudVwiLFwiZW52XCIsXCJlbndcIixcImVueFwiLFwiZW90XCIsXCJlcGlcIixcImVyYVwiLFwiZXJnXCIsXCJlcmhcIixcImVyaVwiLFwiZXJrXCIsXCJlcm9cIixcImVyclwiLFwiZXJzXCIsXCJlcnRcIixcImVyd1wiLFwiZXNlXCIsXCJlc2dcIixcImVzaFwiLFwiZXNpXCIsXCJlc2tcIixcImVzbFwiLFwiZXNtXCIsXCJlc25cIixcImVzb1wiLFwiZXNxXCIsXCJlc3NcIixcImVzdVwiLFwiZXN4XCIsXCJlc3lcIixcImV0YlwiLFwiZXRjXCIsXCJldGhcIixcImV0blwiLFwiZXRvXCIsXCJldHJcIixcImV0c1wiLFwiZXR0XCIsXCJldHVcIixcImV0eFwiLFwiZXR6XCIsXCJldXFcIixcImV2ZVwiLFwiZXZoXCIsXCJldm5cIixcImV3b1wiLFwiZXh0XCIsXCJleWFcIixcImV5b1wiLFwiZXphXCIsXCJlemVcIl1cbixbIFwiZmFcIixcImZmXCIsXCJmaVwiLFwiZmpcIixcImZvXCIsXCJmclwiLFwiZnlcIixcImZhYVwiLFwiZmFiXCIsXCJmYWRcIixcImZhZlwiLFwiZmFnXCIsXCJmYWhcIixcImZhaVwiLFwiZmFqXCIsXCJmYWtcIixcImZhbFwiLFwiZmFtXCIsXCJmYW5cIixcImZhcFwiLFwiZmFyXCIsXCJmYXRcIixcImZhdVwiLFwiZmF4XCIsXCJmYXlcIixcImZhelwiLFwiZmJsXCIsXCJmY3NcIixcImZlclwiLFwiZmZpXCIsXCJmZm1cIixcImZnclwiLFwiZmlhXCIsXCJmaWVcIixcImZpZlwiLFwiZmlsXCIsXCJmaXBcIixcImZpclwiLFwiZml0XCIsXCJmaXVcIixcImZpd1wiLFwiZmtrXCIsXCJma3ZcIixcImZsYVwiLFwiZmxoXCIsXCJmbGlcIixcImZsbFwiLFwiZmxuXCIsXCJmbHJcIixcImZseVwiLFwiZm1wXCIsXCJmbXVcIixcImZuYlwiLFwiZm5nXCIsXCJmbmlcIixcImZvZFwiLFwiZm9pXCIsXCJmb21cIixcImZvblwiLFwiZm9yXCIsXCJmb3NcIixcImZveFwiLFwiZnBlXCIsXCJmcXNcIixcImZyY1wiLFwiZnJkXCIsXCJmcmtcIixcImZybVwiLFwiZnJvXCIsXCJmcnBcIixcImZycVwiLFwiZnJyXCIsXCJmcnNcIixcImZydFwiLFwiZnNlXCIsXCJmc2xcIixcImZzc1wiLFwiZnViXCIsXCJmdWNcIixcImZ1ZFwiLFwiZnVlXCIsXCJmdWZcIixcImZ1aFwiLFwiZnVpXCIsXCJmdWpcIixcImZ1bVwiLFwiZnVuXCIsXCJmdXFcIixcImZ1clwiLFwiZnV0XCIsXCJmdXVcIixcImZ1dlwiLFwiZnV5XCIsXCJmdnJcIixcImZ3YVwiLFwiZndlXCJdXG4sWyBcImdhXCIsXCJnZFwiLFwiZ2xcIixcImduXCIsXCJndVwiLFwiZ3ZcIixcImdhYVwiLFwiZ2FiXCIsXCJnYWNcIixcImdhZFwiLFwiZ2FlXCIsXCJnYWZcIixcImdhZ1wiLFwiZ2FoXCIsXCJnYWlcIixcImdhalwiLFwiZ2FrXCIsXCJnYWxcIixcImdhbVwiLFwiZ2FuXCIsXCJnYW9cIixcImdhcFwiLFwiZ2FxXCIsXCJnYXJcIixcImdhc1wiLFwiZ2F0XCIsXCJnYXVcIixcImdhdlwiLFwiZ2F3XCIsXCJnYXhcIixcImdheVwiLFwiZ2F6XCIsXCJnYmFcIixcImdiYlwiLFwiZ2JjXCIsXCJnYmRcIixcImdiZVwiLFwiZ2JmXCIsXCJnYmdcIixcImdiaFwiLFwiZ2JpXCIsXCJnYmpcIixcImdia1wiLFwiZ2JsXCIsXCJnYm1cIixcImdiblwiLFwiZ2JvXCIsXCJnYnBcIixcImdicVwiLFwiZ2JyXCIsXCJnYnNcIixcImdidVwiLFwiZ2J2XCIsXCJnYndcIixcImdieFwiLFwiZ2J5XCIsXCJnYnpcIixcImdjY1wiLFwiZ2NkXCIsXCJnY2VcIixcImdjZlwiLFwiZ2NsXCIsXCJnY25cIixcImdjclwiLFwiZ2N0XCIsXCJnZGFcIixcImdkYlwiLFwiZ2RjXCIsXCJnZGRcIixcImdkZVwiLFwiZ2RmXCIsXCJnZGdcIixcImdkaFwiLFwiZ2RpXCIsXCJnZGpcIixcImdka1wiLFwiZ2RsXCIsXCJnZG1cIixcImdkblwiLFwiZ2RvXCIsXCJnZHFcIixcImdkclwiLFwiZ2RzXCIsXCJnZHRcIixcImdkdVwiLFwiZ2R4XCIsXCJnZWFcIixcImdlYlwiLFwiZ2VjXCIsXCJnZWRcIixcImdlZlwiLFwiZ2VnXCIsXCJnZWhcIixcImdlaVwiLFwiZ2VqXCIsXCJnZWtcIixcImdlbFwiLFwiZ2VtXCIsXCJnZXFcIixcImdlc1wiLFwiZ2V2XCIsXCJnZXdcIixcImdleFwiLFwiZ2V5XCIsXCJnZXpcIixcImdma1wiLFwiZ2Z0XCIsXCJnZnhcIixcImdnYVwiLFwiZ2diXCIsXCJnZ2RcIixcImdnZVwiLFwiZ2dnXCIsXCJnZ2tcIixcImdnbFwiLFwiZ2duXCIsXCJnZ29cIixcImdnclwiLFwiZ2d0XCIsXCJnZ3VcIixcImdnd1wiLFwiZ2hhXCIsXCJnaGNcIixcImdoZVwiLFwiZ2hoXCIsXCJnaGtcIixcImdobFwiLFwiZ2huXCIsXCJnaG9cIixcImdoclwiLFwiZ2hzXCIsXCJnaHRcIixcImdpYVwiLFwiZ2liXCIsXCJnaWNcIixcImdpZFwiLFwiZ2llXCIsXCJnaWdcIixcImdpaFwiLFwiZ2lpXCIsXCJnaWxcIixcImdpbVwiLFwiZ2luXCIsXCJnaW9cIixcImdpcFwiLFwiZ2lxXCIsXCJnaXJcIixcImdpc1wiLFwiZ2l0XCIsXCJnaXVcIixcImdpd1wiLFwiZ2l4XCIsXCJnaXlcIixcImdpelwiLFwiZ2ppXCIsXCJnamtcIixcImdqbVwiLFwiZ2puXCIsXCJnanJcIixcImdqdVwiLFwiZ2thXCIsXCJna2RcIixcImdrZVwiLFwiZ2tuXCIsXCJna29cIixcImdrcFwiLFwiZ2t1XCIsXCJnbGJcIixcImdsY1wiLFwiZ2xkXCIsXCJnbGhcIixcImdsaVwiLFwiZ2xqXCIsXCJnbGtcIixcImdsbFwiLFwiZ2xvXCIsXCJnbHJcIixcImdsdVwiLFwiZ2x3XCIsXCJnbHlcIixcImdtYVwiLFwiZ21iXCIsXCJnbWRcIixcImdtZVwiLFwiZ21nXCIsXCJnbWhcIixcImdtbFwiLFwiZ21tXCIsXCJnbW5cIixcImdtcVwiLFwiZ21yXCIsXCJnbXVcIixcImdtdlwiLFwiZ213XCIsXCJnbXhcIixcImdteVwiLFwiZ216XCIsXCJnbmFcIixcImduYlwiLFwiZ25jXCIsXCJnbmRcIixcImduZVwiLFwiZ25nXCIsXCJnbmhcIixcImduaVwiLFwiZ25qXCIsXCJnbmtcIixcImdubFwiLFwiZ25tXCIsXCJnbm5cIixcImdub1wiLFwiZ25xXCIsXCJnbnJcIixcImdudFwiLFwiZ251XCIsXCJnbndcIixcImduelwiLFwiZ29hXCIsXCJnb2JcIixcImdvY1wiLFwiZ29kXCIsXCJnb2VcIixcImdvZlwiLFwiZ29nXCIsXCJnb2hcIixcImdvaVwiLFwiZ29qXCIsXCJnb2tcIixcImdvbFwiLFwiZ29tXCIsXCJnb25cIixcImdvb1wiLFwiZ29wXCIsXCJnb3FcIixcImdvclwiLFwiZ29zXCIsXCJnb3RcIixcImdvdVwiLFwiZ293XCIsXCJnb3hcIixcImdveVwiLFwiZ296XCIsXCJncGFcIixcImdwZVwiLFwiZ3BuXCIsXCJncWFcIixcImdxaVwiLFwiZ3FuXCIsXCJncXJcIixcImdxdVwiLFwiZ3JhXCIsXCJncmJcIixcImdyY1wiLFwiZ3JkXCIsXCJncmdcIixcImdyaFwiLFwiZ3JpXCIsXCJncmpcIixcImdya1wiLFwiZ3JtXCIsXCJncm9cIixcImdycVwiLFwiZ3JyXCIsXCJncnNcIixcImdydFwiLFwiZ3J1XCIsXCJncnZcIixcImdyd1wiLFwiZ3J4XCIsXCJncnlcIixcImdyelwiLFwiZ3NlXCIsXCJnc2dcIixcImdzbFwiLFwiZ3NtXCIsXCJnc25cIixcImdzb1wiLFwiZ3NwXCIsXCJnc3NcIixcImdzd1wiLFwiZ3RhXCIsXCJndGlcIixcImd0dVwiLFwiZ3VhXCIsXCJndWJcIixcImd1Y1wiLFwiZ3VkXCIsXCJndWVcIixcImd1ZlwiLFwiZ3VnXCIsXCJndWhcIixcImd1aVwiLFwiZ3VrXCIsXCJndWxcIixcImd1bVwiLFwiZ3VuXCIsXCJndW9cIixcImd1cFwiLFwiZ3VxXCIsXCJndXJcIixcImd1c1wiLFwiZ3V0XCIsXCJndXVcIixcImd1dlwiLFwiZ3V3XCIsXCJndXhcIixcImd1elwiLFwiZ3ZhXCIsXCJndmNcIixcImd2ZVwiLFwiZ3ZmXCIsXCJndmpcIixcImd2bFwiLFwiZ3ZtXCIsXCJndm5cIixcImd2b1wiLFwiZ3ZwXCIsXCJndnJcIixcImd2c1wiLFwiZ3Z5XCIsXCJnd2FcIixcImd3YlwiLFwiZ3djXCIsXCJnd2RcIixcImd3ZVwiLFwiZ3dmXCIsXCJnd2dcIixcImd3aVwiLFwiZ3dqXCIsXCJnd21cIixcImd3blwiLFwiZ3dyXCIsXCJnd3RcIixcImd3dVwiLFwiZ3d3XCIsXCJnd3hcIixcImd4eFwiLFwiZ3lhXCIsXCJneWJcIixcImd5ZFwiLFwiZ3llXCIsXCJneWZcIixcImd5Z1wiLFwiZ3lpXCIsXCJneWxcIixcImd5bVwiLFwiZ3luXCIsXCJneW9cIixcImd5clwiLFwiZ3l5XCIsXCJneXpcIixcImd6YVwiLFwiZ3ppXCIsXCJnem5cIl1cbixbIFwiaGFcIixcImhlXCIsXCJoaVwiLFwiaG9cIixcImhyXCIsXCJodFwiLFwiaHVcIixcImh5XCIsXCJoelwiLFwiaGFhXCIsXCJoYWJcIixcImhhY1wiLFwiaGFkXCIsXCJoYWVcIixcImhhZlwiLFwiaGFnXCIsXCJoYWhcIixcImhhaVwiLFwiaGFqXCIsXCJoYWtcIixcImhhbFwiLFwiaGFtXCIsXCJoYW5cIixcImhhb1wiLFwiaGFwXCIsXCJoYXFcIixcImhhclwiLFwiaGFzXCIsXCJoYXZcIixcImhhd1wiLFwiaGF4XCIsXCJoYXlcIixcImhhelwiLFwiaGJhXCIsXCJoYmJcIixcImhiblwiLFwiaGJvXCIsXCJoYnVcIixcImhjYVwiLFwiaGNoXCIsXCJoZG5cIixcImhkc1wiLFwiaGR5XCIsXCJoZWFcIixcImhlZFwiLFwiaGVnXCIsXCJoZWhcIixcImhlaVwiLFwiaGVtXCIsXCJoZ21cIixcImhnd1wiLFwiaGhpXCIsXCJoaHJcIixcImhoeVwiLFwiaGlhXCIsXCJoaWJcIixcImhpZFwiLFwiaGlmXCIsXCJoaWdcIixcImhpaFwiLFwiaGlpXCIsXCJoaWpcIixcImhpa1wiLFwiaGlsXCIsXCJoaW1cIixcImhpb1wiLFwiaGlyXCIsXCJoaXRcIixcImhpd1wiLFwiaGl4XCIsXCJoamlcIixcImhrYVwiLFwiaGtlXCIsXCJoa2hcIixcImhra1wiLFwiaGtuXCIsXCJoa3NcIixcImhsYVwiLFwiaGxiXCIsXCJobGRcIixcImhsZVwiLFwiaGx0XCIsXCJobHVcIixcImhtYVwiLFwiaG1iXCIsXCJobWNcIixcImhtZFwiLFwiaG1lXCIsXCJobWZcIixcImhtZ1wiLFwiaG1oXCIsXCJobWlcIixcImhtalwiLFwiaG1rXCIsXCJobWxcIixcImhtbVwiLFwiaG1uXCIsXCJobXBcIixcImhtcVwiLFwiaG1yXCIsXCJobXNcIixcImhtdFwiLFwiaG11XCIsXCJobXZcIixcImhtd1wiLFwiaG14XCIsXCJobXlcIixcImhtelwiLFwiaG5hXCIsXCJobmRcIixcImhuZVwiLFwiaG5nXCIsXCJobmhcIixcImhuaVwiLFwiaG5qXCIsXCJobm5cIixcImhub1wiLFwiaG5zXCIsXCJobnVcIixcImhvYVwiLFwiaG9iXCIsXCJob2NcIixcImhvZFwiLFwiaG9lXCIsXCJob2hcIixcImhvaVwiLFwiaG9qXCIsXCJob2tcIixcImhvbFwiLFwiaG9tXCIsXCJob29cIixcImhvcFwiLFwiaG9yXCIsXCJob3NcIixcImhvdFwiLFwiaG92XCIsXCJob3dcIixcImhveVwiLFwiaG96XCIsXCJocG9cIixcImhwc1wiLFwiaHJhXCIsXCJocmNcIixcImhyZVwiLFwiaHJrXCIsXCJocm1cIixcImhyb1wiLFwiaHJwXCIsXCJocnJcIixcImhydFwiLFwiaHJ1XCIsXCJocndcIixcImhyeFwiLFwiaHJ6XCIsXCJoc2JcIixcImhzaFwiLFwiaHNsXCIsXCJoc25cIixcImhzc1wiLFwiaHRpXCIsXCJodG9cIixcImh0c1wiLFwiaHR1XCIsXCJodHhcIixcImh1YlwiLFwiaHVjXCIsXCJodWRcIixcImh1ZVwiLFwiaHVmXCIsXCJodWdcIixcImh1aFwiLFwiaHVpXCIsXCJodWpcIixcImh1a1wiLFwiaHVsXCIsXCJodW1cIixcImh1b1wiLFwiaHVwXCIsXCJodXFcIixcImh1clwiLFwiaHVzXCIsXCJodXRcIixcImh1dVwiLFwiaHV2XCIsXCJodXdcIixcImh1eFwiLFwiaHV5XCIsXCJodXpcIixcImh2Y1wiLFwiaHZlXCIsXCJodmtcIixcImh2blwiLFwiaHZ2XCIsXCJod2FcIixcImh3Y1wiLFwiaHdvXCIsXCJoeWFcIixcImh5d1wiLFwiaHl4XCJdXG4sWyBcImlhXCIsXCJpZFwiLFwiaWVcIixcImlnXCIsXCJpaVwiLFwiaWtcIixcImluXCIsXCJpb1wiLFwiaXNcIixcIml0XCIsXCJpdVwiLFwiaXdcIixcImlhaVwiLFwiaWFuXCIsXCJpYXBcIixcImlhclwiLFwiaWJhXCIsXCJpYmJcIixcImliZFwiLFwiaWJlXCIsXCJpYmdcIixcImliaFwiLFwiaWJpXCIsXCJpYmxcIixcImlibVwiLFwiaWJuXCIsXCJpYnJcIixcImlidVwiLFwiaWJ5XCIsXCJpY2FcIixcImljaFwiLFwiaWNsXCIsXCJpY3JcIixcImlkYVwiLFwiaWRiXCIsXCJpZGNcIixcImlkZFwiLFwiaWRlXCIsXCJpZGlcIixcImlkclwiLFwiaWRzXCIsXCJpZHRcIixcImlkdVwiLFwiaWZhXCIsXCJpZmJcIixcImlmZVwiLFwiaWZmXCIsXCJpZmtcIixcImlmbVwiLFwiaWZ1XCIsXCJpZnlcIixcImlnYlwiLFwiaWdlXCIsXCJpZ2dcIixcImlnbFwiLFwiaWdtXCIsXCJpZ25cIixcImlnb1wiLFwiaWdzXCIsXCJpZ3dcIixcImloYlwiLFwiaWhpXCIsXCJpaHBcIixcImlod1wiLFwiaWluXCIsXCJpaXJcIixcImlqY1wiLFwiaWplXCIsXCJpampcIixcImlqblwiLFwiaWpvXCIsXCJpanNcIixcImlrZVwiLFwiaWtpXCIsXCJpa2tcIixcImlrbFwiLFwiaWtvXCIsXCJpa3BcIixcImlrclwiLFwiaWtzXCIsXCJpa3RcIixcImlrdlwiLFwiaWt3XCIsXCJpa3hcIixcImlrelwiLFwiaWxhXCIsXCJpbGJcIixcImlsZ1wiLFwiaWxpXCIsXCJpbGtcIixcImlsbFwiLFwiaWxtXCIsXCJpbG9cIixcImlscFwiLFwiaWxzXCIsXCJpbHVcIixcImlsdlwiLFwiaWx3XCIsXCJpbWFcIixcImltZVwiLFwiaW1pXCIsXCJpbWxcIixcImltblwiLFwiaW1vXCIsXCJpbXJcIixcImltc1wiLFwiaW15XCIsXCJpbmJcIixcImluY1wiLFwiaW5lXCIsXCJpbmdcIixcImluaFwiLFwiaW5qXCIsXCJpbmxcIixcImlubVwiLFwiaW5uXCIsXCJpbm9cIixcImlucFwiLFwiaW5zXCIsXCJpbnRcIixcImluelwiLFwiaW9yXCIsXCJpb3VcIixcImlvd1wiLFwiaXBpXCIsXCJpcG9cIixcImlxdVwiLFwiaXF3XCIsXCJpcmFcIixcImlyZVwiLFwiaXJoXCIsXCJpcmlcIixcImlya1wiLFwiaXJuXCIsXCJpcm9cIixcImlyclwiLFwiaXJ1XCIsXCJpcnhcIixcImlyeVwiLFwiaXNhXCIsXCJpc2NcIixcImlzZFwiLFwiaXNlXCIsXCJpc2dcIixcImlzaFwiLFwiaXNpXCIsXCJpc2tcIixcImlzbVwiLFwiaXNuXCIsXCJpc29cIixcImlzclwiLFwiaXN0XCIsXCJpc3VcIixcIml0YlwiLFwiaXRjXCIsXCJpdGRcIixcIml0ZVwiLFwiaXRpXCIsXCJpdGtcIixcIml0bFwiLFwiaXRtXCIsXCJpdG9cIixcIml0clwiLFwiaXRzXCIsXCJpdHRcIixcIml0dlwiLFwiaXR3XCIsXCJpdHhcIixcIml0eVwiLFwiaXR6XCIsXCJpdW1cIixcIml2YlwiLFwiaXZ2XCIsXCJpd2tcIixcIml3bVwiLFwiaXdvXCIsXCJpd3NcIixcIml4Y1wiLFwiaXhsXCIsXCJpeWFcIixcIml5b1wiLFwiaXl4XCIsXCJpemhcIixcIml6aVwiLFwiaXpyXCIsXCJpenpcIl1cbixbIFwiamFcIixcImppXCIsXCJqdlwiLFwiandcIixcImphYVwiLFwiamFiXCIsXCJqYWNcIixcImphZFwiLFwiamFlXCIsXCJqYWZcIixcImphaFwiLFwiamFqXCIsXCJqYWtcIixcImphbFwiLFwiamFtXCIsXCJqYW5cIixcImphb1wiLFwiamFxXCIsXCJqYXJcIixcImphc1wiLFwiamF0XCIsXCJqYXVcIixcImpheFwiLFwiamF5XCIsXCJqYXpcIixcImpiZVwiLFwiamJpXCIsXCJqYmpcIixcImpia1wiLFwiamJtXCIsXCJqYm5cIixcImpib1wiLFwiamJyXCIsXCJqYnRcIixcImpidVwiLFwiamJ3XCIsXCJqY3NcIixcImpjdFwiLFwiamRhXCIsXCJqZGdcIixcImpkdFwiLFwiamViXCIsXCJqZWVcIixcImplZ1wiLFwiamVoXCIsXCJqZWlcIixcImpla1wiLFwiamVsXCIsXCJqZW5cIixcImplclwiLFwiamV0XCIsXCJqZXVcIixcImpnYlwiLFwiamdlXCIsXCJqZ2tcIixcImpnb1wiLFwiamhpXCIsXCJqaHNcIixcImppYVwiLFwiamliXCIsXCJqaWNcIixcImppZFwiLFwiamllXCIsXCJqaWdcIixcImppaFwiLFwiamlpXCIsXCJqaWxcIixcImppbVwiLFwiamlvXCIsXCJqaXFcIixcImppdFwiLFwiaml1XCIsXCJqaXZcIixcImppeVwiLFwiamplXCIsXCJqanJcIixcImprYVwiLFwiamttXCIsXCJqa29cIixcImprcFwiLFwiamtyXCIsXCJqa3NcIixcImprdVwiLFwiamxlXCIsXCJqbHNcIixcImptYVwiLFwiam1iXCIsXCJqbWNcIixcImptZFwiLFwiam1pXCIsXCJqbWxcIixcImptblwiLFwiam1yXCIsXCJqbXNcIixcImptd1wiLFwiam14XCIsXCJqbmFcIixcImpuZFwiLFwiam5nXCIsXCJqbmlcIixcImpualwiLFwiam5sXCIsXCJqbnNcIixcImpvYlwiLFwiam9kXCIsXCJqb2dcIixcImpvclwiLFwiam9zXCIsXCJqb3dcIixcImpwYVwiLFwianByXCIsXCJqcHhcIixcImpxclwiLFwianJhXCIsXCJqcmJcIixcImpyclwiLFwianJ0XCIsXCJqcnVcIixcImpzbFwiLFwianVhXCIsXCJqdWJcIixcImp1Y1wiLFwianVkXCIsXCJqdWhcIixcImp1aVwiLFwianVrXCIsXCJqdWxcIixcImp1bVwiLFwianVuXCIsXCJqdW9cIixcImp1cFwiLFwianVyXCIsXCJqdXNcIixcImp1dFwiLFwianV1XCIsXCJqdXdcIixcImp1eVwiLFwianZkXCIsXCJqdm5cIixcImp3aVwiLFwianlhXCIsXCJqeWVcIixcImp5eVwiXVxuLFsgXCJrYVwiLFwia2dcIixcImtpXCIsXCJralwiLFwia2tcIixcImtsXCIsXCJrbVwiLFwia25cIixcImtvXCIsXCJrclwiLFwia3NcIixcImt1XCIsXCJrdlwiLFwia3dcIixcImt5XCIsXCJrYWFcIixcImthYlwiLFwia2FjXCIsXCJrYWRcIixcImthZVwiLFwia2FmXCIsXCJrYWdcIixcImthaFwiLFwia2FpXCIsXCJrYWpcIixcImtha1wiLFwia2FtXCIsXCJrYW9cIixcImthcFwiLFwia2FxXCIsXCJrYXJcIixcImthdlwiLFwia2F3XCIsXCJrYXhcIixcImtheVwiLFwia2JhXCIsXCJrYmJcIixcImtiY1wiLFwia2JkXCIsXCJrYmVcIixcImtiZlwiLFwia2JnXCIsXCJrYmhcIixcImtiaVwiLFwia2JqXCIsXCJrYmtcIixcImtibFwiLFwia2JtXCIsXCJrYm5cIixcImtib1wiLFwia2JwXCIsXCJrYnFcIixcImticlwiLFwia2JzXCIsXCJrYnRcIixcImtidVwiLFwia2J2XCIsXCJrYndcIixcImtieFwiLFwia2J5XCIsXCJrYnpcIixcImtjYVwiLFwia2NiXCIsXCJrY2NcIixcImtjZFwiLFwia2NlXCIsXCJrY2ZcIixcImtjZ1wiLFwia2NoXCIsXCJrY2lcIixcImtjalwiLFwia2NrXCIsXCJrY2xcIixcImtjbVwiLFwia2NuXCIsXCJrY29cIixcImtjcFwiLFwia2NxXCIsXCJrY3JcIixcImtjc1wiLFwia2N0XCIsXCJrY3VcIixcImtjdlwiLFwia2N3XCIsXCJrY3hcIixcImtjeVwiLFwia2N6XCIsXCJrZGFcIixcImtkY1wiLFwia2RkXCIsXCJrZGVcIixcImtkZlwiLFwia2RnXCIsXCJrZGhcIixcImtkaVwiLFwia2RqXCIsXCJrZGtcIixcImtkbFwiLFwia2RtXCIsXCJrZG5cIixcImtkb1wiLFwia2RwXCIsXCJrZHFcIixcImtkclwiLFwia2R0XCIsXCJrZHVcIixcImtkdlwiLFwia2R3XCIsXCJrZHhcIixcImtkeVwiLFwia2R6XCIsXCJrZWFcIixcImtlYlwiLFwia2VjXCIsXCJrZWRcIixcImtlZVwiLFwia2VmXCIsXCJrZWdcIixcImtlaFwiLFwia2VpXCIsXCJrZWpcIixcImtla1wiLFwia2VsXCIsXCJrZW1cIixcImtlblwiLFwia2VvXCIsXCJrZXBcIixcImtlcVwiLFwia2VyXCIsXCJrZXNcIixcImtldFwiLFwia2V1XCIsXCJrZXZcIixcImtld1wiLFwia2V4XCIsXCJrZXlcIixcImtlelwiLFwia2ZhXCIsXCJrZmJcIixcImtmY1wiLFwia2ZkXCIsXCJrZmVcIixcImtmZlwiLFwia2ZnXCIsXCJrZmhcIixcImtmaVwiLFwia2ZqXCIsXCJrZmtcIixcImtmbFwiLFwia2ZtXCIsXCJrZm5cIixcImtmb1wiLFwia2ZwXCIsXCJrZnFcIixcImtmclwiLFwia2ZzXCIsXCJrZnRcIixcImtmdVwiLFwia2Z2XCIsXCJrZndcIixcImtmeFwiLFwia2Z5XCIsXCJrZnpcIixcImtnYVwiLFwia2diXCIsXCJrZ2NcIixcImtnZFwiLFwia2dlXCIsXCJrZ2ZcIixcImtnZ1wiLFwia2doXCIsXCJrZ2lcIixcImtnalwiLFwia2drXCIsXCJrZ2xcIixcImtnbVwiLFwia2duXCIsXCJrZ29cIixcImtncFwiLFwia2dxXCIsXCJrZ3JcIixcImtnc1wiLFwia2d0XCIsXCJrZ3VcIixcImtndlwiLFwia2d3XCIsXCJrZ3hcIixcImtneVwiLFwia2hhXCIsXCJseWdcIixcImtoYlwiLFwia2hjXCIsXCJraGRcIixcImtoZVwiLFwia2hmXCIsXCJraGdcIixcImtoaFwiLFwia2hpXCIsXCJraGpcIixcImtoa1wiLFwia2hsXCIsXCJraG5cIixcImtob1wiLFwia2hwXCIsXCJraHFcIixcImtoclwiLFwia2hzXCIsXCJraHRcIixcImtodVwiLFwia2h2XCIsXCJraHdcIixcImtoeFwiLFwia2h5XCIsXCJraHpcIixcImtpYVwiLFwia2liXCIsXCJraWNcIixcImtpZFwiLFwia2llXCIsXCJraWZcIixcImtpZ1wiLFwia2loXCIsXCJraWlcIixcImtpalwiLFwia2lsXCIsXCJraW1cIixcImtpb1wiLFwia2lwXCIsXCJraXFcIixcImtpc1wiLFwia2l0XCIsXCJraXVcIixcImtpdlwiLFwia2l3XCIsXCJraXhcIixcImtpeVwiLFwia2l6XCIsXCJramFcIixcImtqYlwiLFwia2pjXCIsXCJramRcIixcImtqZVwiLFwia2pmXCIsXCJramdcIixcImtqaFwiLFwia2ppXCIsXCJrampcIixcImtqa1wiLFwia2psXCIsXCJram1cIixcImtqblwiLFwia2pvXCIsXCJranBcIixcImtqcVwiLFwia2pyXCIsXCJranNcIixcImtqdFwiLFwia2p1XCIsXCJranZcIixcImtqeFwiLFwia2p5XCIsXCJranpcIixcImtrYVwiLFwia2tiXCIsXCJra2NcIixcImtrZFwiLFwia2tlXCIsXCJra2ZcIixcImtrZ1wiLFwia2toXCIsXCJra2lcIixcImtralwiLFwia2trXCIsXCJra2xcIixcImtrbVwiLFwia2tuXCIsXCJra29cIixcImtrcFwiLFwia2txXCIsXCJra3JcIixcImtrc1wiLFwia2t0XCIsXCJra3VcIixcImtrdlwiLFwia2t3XCIsXCJra3hcIixcImtreVwiLFwia2t6XCIsXCJrbGFcIixcImtsYlwiLFwia2xjXCIsXCJrbGRcIixcImtsZVwiLFwia2xmXCIsXCJrbGdcIixcImtsaFwiLFwia2xpXCIsXCJrbGpcIixcImtsa1wiLFwia2xsXCIsXCJrbG1cIixcImtsblwiLFwia2xvXCIsXCJrbHBcIixcImtscVwiLFwia2xyXCIsXCJrbHNcIixcImtsdFwiLFwia2x1XCIsXCJrbHZcIixcImtsd1wiLFwia2x4XCIsXCJrbHlcIixcImtselwiLFwia21hXCIsXCJrbWJcIixcImttY1wiLFwia21kXCIsXCJrbWVcIixcImttZlwiLFwia21nXCIsXCJrbWhcIixcImttaVwiLFwia21qXCIsXCJrbWtcIixcImttbFwiLFwia21tXCIsXCJrbW5cIixcImttb1wiLFwia21wXCIsXCJrbXFcIixcImttclwiLFwia21zXCIsXCJrbXRcIixcImttdVwiLFwia212XCIsXCJrbXdcIixcImtteFwiLFwia215XCIsXCJrbXpcIixcImtuYVwiLFwia25iXCIsXCJrbmNcIixcImtuZFwiLFwia25lXCIsXCJrbmZcIixcImtuZ1wiLFwia25pXCIsXCJrbmpcIixcImtua1wiLFwia25sXCIsXCJrbm1cIixcImtublwiLFwia25vXCIsXCJrbnBcIixcImtucVwiLFwia25yXCIsXCJrbnNcIixcImtudFwiLFwia251XCIsXCJrbnZcIixcImtud1wiLFwia254XCIsXCJrbnlcIixcImtuelwiLFwia29hXCIsXCJrb2NcIixcImtvZFwiLFwia29lXCIsXCJrb2ZcIixcImtvZ1wiLFwia29oXCIsXCJrb2lcIixcImtvalwiLFwia29rXCIsXCJrb2xcIixcImtvb1wiLFwia29wXCIsXCJrb3FcIixcImtvc1wiLFwia290XCIsXCJrb3VcIixcImtvdlwiLFwia293XCIsXCJrb3hcIixcImtveVwiLFwia296XCIsXCJrcGFcIixcImtwYlwiLFwia3BjXCIsXCJrcGRcIixcImtwZVwiLFwia3BmXCIsXCJrcGdcIixcImtwaFwiLFwia3BpXCIsXCJrcGpcIixcImtwa1wiLFwia3BsXCIsXCJrcG1cIixcImtwblwiLFwia3BvXCIsXCJrcHBcIixcImtwcVwiLFwia3ByXCIsXCJrcHNcIixcImtwdFwiLFwia3B1XCIsXCJrcHZcIixcImtwd1wiLFwia3B4XCIsXCJrcHlcIixcImtwelwiLFwia3FhXCIsXCJrcWJcIixcImtxY1wiLFwia3FkXCIsXCJrcWVcIixcImtxZlwiLFwia3FnXCIsXCJrcWhcIixcImtxaVwiLFwia3FqXCIsXCJrcWtcIixcImtxbFwiLFwia3FtXCIsXCJrcW5cIixcImtxb1wiLFwia3FwXCIsXCJrcXFcIixcImtxclwiLFwia3FzXCIsXCJrcXRcIixcImtxdVwiLFwia3F2XCIsXCJrcXdcIixcImtxeFwiLFwia3F5XCIsXCJrcXpcIixcImtyYVwiLFwia3JiXCIsXCJrcmNcIixcImtyZFwiLFwia3JlXCIsXCJrcmZcIixcImtyaFwiLFwia3JpXCIsXCJrcmpcIixcImtya1wiLFwia3JsXCIsXCJrcm1cIixcImtyblwiLFwia3JvXCIsXCJrcnBcIixcImtyclwiLFwia3JzXCIsXCJrcnRcIixcImtydVwiLFwia3J2XCIsXCJrcndcIixcImtyeFwiLFwia3J5XCIsXCJrcnpcIixcImtzYVwiLFwia3NiXCIsXCJrc2NcIixcImtzZFwiLFwia3NlXCIsXCJrc2ZcIixcImtzZ1wiLFwia3NoXCIsXCJrc2lcIixcImtzalwiLFwia3NrXCIsXCJrc2xcIixcImtzbVwiLFwia3NuXCIsXCJrc29cIixcImtzcFwiLFwia3NxXCIsXCJrc3JcIixcImtzc1wiLFwia3N0XCIsXCJrc3VcIixcImtzdlwiLFwia3N3XCIsXCJrc3hcIixcImtzeVwiLFwia3N6XCIsXCJrdGFcIixcImt0YlwiLFwia3RjXCIsXCJrdGRcIixcImt0ZVwiLFwia3RmXCIsXCJrdGdcIixcImt0aFwiLFwia3RpXCIsXCJrdGpcIixcImt0a1wiLFwia3RsXCIsXCJrdG1cIixcImt0blwiLFwia3RvXCIsXCJrdHBcIixcImt0cVwiLFwia3RyXCIsXCJrdHNcIixcImt0dFwiLFwia3R1XCIsXCJrdHZcIixcImt0d1wiLFwia3R4XCIsXCJrdHlcIixcImt0elwiLFwia3ViXCIsXCJrdWNcIixcImt1ZFwiLFwia3VlXCIsXCJrdWZcIixcImt1Z1wiLFwia3VoXCIsXCJrdWlcIixcImt1alwiLFwia3VrXCIsXCJrdWxcIixcImt1bVwiLFwia3VuXCIsXCJrdW9cIixcImt1cFwiLFwia3VxXCIsXCJrdXNcIixcImt1dFwiLFwia3V1XCIsXCJrdXZcIixcImt1d1wiLFwia3V4XCIsXCJrdXlcIixcImt1elwiLFwia3ZhXCIsXCJrdmJcIixcImt2Y1wiLFwia3ZkXCIsXCJrdmVcIixcImt2ZlwiLFwia3ZnXCIsXCJrdmhcIixcImt2aVwiLFwia3ZqXCIsXCJrdmtcIixcImt2bFwiLFwia3ZtXCIsXCJrdm5cIixcImt2b1wiLFwia3ZwXCIsXCJrdnFcIixcImt2clwiLFwia3ZzXCIsXCJrdnRcIixcImt2dVwiLFwia3Z2XCIsXCJrdndcIixcImt2eFwiLFwia3Z5XCIsXCJrdnpcIixcImt3YVwiLFwia3diXCIsXCJrd2NcIixcImt3ZFwiLFwia3dlXCIsXCJrd2ZcIixcImt3Z1wiLFwia3doXCIsXCJrd2lcIixcImt3alwiLFwia3drXCIsXCJrd2xcIixcImt3bVwiLFwia3duXCIsXCJrd29cIixcImt3cFwiLFwia3dxXCIsXCJrd3JcIixcImt3c1wiLFwia3d0XCIsXCJrd3VcIixcImt3dlwiLFwia3d3XCIsXCJrd3hcIixcImt3eVwiLFwia3d6XCIsXCJreGFcIixcImt4YlwiLFwia3hjXCIsXCJreGRcIixcImt4ZVwiLFwia3hmXCIsXCJreGhcIixcImt4aVwiLFwia3hqXCIsXCJreGtcIixcImt4bFwiLFwia3htXCIsXCJreG5cIixcImt4b1wiLFwia3hwXCIsXCJreHFcIixcImt4clwiLFwia3hzXCIsXCJreHRcIixcImt4dVwiLFwia3h2XCIsXCJreHdcIixcImt4eFwiLFwia3h5XCIsXCJreHpcIixcImt5YVwiLFwia3liXCIsXCJreWNcIixcImt5ZFwiLFwia3llXCIsXCJreWZcIixcImt5Z1wiLFwia3loXCIsXCJreWlcIixcImt5alwiLFwia3lrXCIsXCJreWxcIixcImt5bVwiLFwia3luXCIsXCJreW9cIixcImt5cFwiLFwia3lxXCIsXCJreXJcIixcImt5c1wiLFwia3l0XCIsXCJreXVcIixcImt5dlwiLFwia3l3XCIsXCJreXhcIixcImt5eVwiLFwia3l6XCIsXCJremFcIixcImt6YlwiLFwia3pjXCIsXCJremRcIixcImt6ZVwiLFwia3pmXCIsXCJremdcIixcImt6aFwiLFwia3ppXCIsXCJrempcIixcImt6a1wiLFwia3psXCIsXCJrem1cIixcImt6blwiLFwia3pvXCIsXCJrenBcIixcImt6cVwiLFwia3pyXCIsXCJrenNcIixcImt6dFwiLFwia3p1XCIsXCJrenZcIixcImt6d1wiLFwia3p4XCIsXCJrenlcIixcImt6elwiXVxuLFsgXCJsYVwiLFwibGJcIixcImxnXCIsXCJsaVwiLFwibG5cIixcImxvXCIsXCJsdFwiLFwibHVcIixcImx2XCIsXCJsYWFcIixcImxhYlwiLFwibGFjXCIsXCJsYWRcIixcImxhZVwiLFwibGFmXCIsXCJsYWdcIixcImxhaFwiLFwibGFpXCIsXCJsYWpcIixcImxha1wiLFwibGFsXCIsXCJsYW1cIixcImxhblwiLFwibGFwXCIsXCJsYXFcIixcImxhclwiLFwibGFzXCIsXCJsYXVcIixcImxhd1wiLFwibGF4XCIsXCJsYXlcIixcImxhelwiLFwibGJhXCIsXCJsYmJcIixcImxiY1wiLFwibGJlXCIsXCJsYmZcIixcImxiZ1wiLFwibGJpXCIsXCJsYmpcIixcImxia1wiLFwibGJsXCIsXCJsYm1cIixcImxiblwiLFwibGJvXCIsXCJsYnFcIixcImxiclwiLFwibGJzXCIsXCJsYnRcIixcImxidVwiLFwibGJ2XCIsXCJsYndcIixcImxieFwiLFwibGJ5XCIsXCJsYnpcIixcImxjY1wiLFwibGNkXCIsXCJsY2VcIixcImxjZlwiLFwibGNoXCIsXCJsY2xcIixcImxjbVwiLFwibGNwXCIsXCJsY3FcIixcImxjc1wiLFwibGRhXCIsXCJsZGJcIixcImxkZFwiLFwibGRnXCIsXCJsZGhcIixcImxkaVwiLFwibGRqXCIsXCJsZGtcIixcImxkbFwiLFwibGRtXCIsXCJsZG5cIixcImxkb1wiLFwibGRwXCIsXCJsZHFcIixcImxlYVwiLFwibGViXCIsXCJsZWNcIixcImxlZFwiLFwibGVlXCIsXCJsZWZcIixcImxlZ1wiLFwibGVoXCIsXCJsZWlcIixcImxlalwiLFwibGVrXCIsXCJsZWxcIixcImxlbVwiLFwibGVuXCIsXCJsZW9cIixcImxlcFwiLFwibGVxXCIsXCJsZXJcIixcImxlc1wiLFwibGV0XCIsXCJsZXVcIixcImxldlwiLFwibGV3XCIsXCJsZXhcIixcImxleVwiLFwibGV6XCIsXCJsZmFcIixcImxmblwiLFwibGdhXCIsXCJsZ2JcIixcImxnZ1wiLFwibGdoXCIsXCJsZ2lcIixcImxna1wiLFwibGdsXCIsXCJsZ21cIixcImxnblwiLFwibGdxXCIsXCJsZ3JcIixcImxndFwiLFwibGd1XCIsXCJsZ3pcIixcImxoYVwiLFwibGhoXCIsXCJsaGlcIixcImxobFwiLFwibGhtXCIsXCJsaG5cIixcImxocFwiLFwibGhzXCIsXCJsaHRcIixcImxodVwiLFwibGlhXCIsXCJsaWJcIixcImxpY1wiLFwibGlkXCIsXCJsaWVcIixcImxpZlwiLFwibGlnXCIsXCJsaWhcIixcImxpaVwiLFwibGlqXCIsXCJsaWtcIixcImxpbFwiLFwibGlvXCIsXCJsaXBcIixcImxpcVwiLFwibGlyXCIsXCJsaXNcIixcImxpdVwiLFwibGl2XCIsXCJsaXdcIixcImxpeFwiLFwibGl5XCIsXCJsaXpcIixcImxqYVwiLFwibGplXCIsXCJsamlcIixcImxqbFwiLFwibGpwXCIsXCJsandcIixcImxqeFwiLFwibGthXCIsXCJsa2JcIixcImxrY1wiLFwibGtkXCIsXCJsa2VcIixcImxraFwiLFwibGtpXCIsXCJsa2pcIixcImxrbFwiLFwibGttXCIsXCJsa25cIixcImxrb1wiLFwibGtyXCIsXCJsa3NcIixcImxrdFwiLFwibGt1XCIsXCJsa3lcIixcImxsYVwiLFwibGxiXCIsXCJsbGNcIixcImxsZFwiLFwibGxlXCIsXCJsbGZcIixcImxsZ1wiLFwibGxoXCIsXCJsbGlcIixcImxsalwiLFwibGxrXCIsXCJsbGxcIixcImxsbVwiLFwibGxuXCIsXCJsbG9cIixcImxscFwiLFwibGxxXCIsXCJsbHNcIixcImxsdVwiLFwibGx4XCIsXCJsbWFcIixcImxtYlwiLFwibG1jXCIsXCJsbWRcIixcImxtZVwiLFwibG1mXCIsXCJsbWdcIixcImxtaFwiLFwibG1pXCIsXCJsbWpcIixcImxta1wiLFwibG1sXCIsXCJsbW1cIixcImxtblwiLFwibG1vXCIsXCJsbXBcIixcImxtcVwiLFwibG1yXCIsXCJsbXVcIixcImxtdlwiLFwibG13XCIsXCJsbXhcIixcImxteVwiLFwibG16XCIsXCJsbmFcIixcImxuYlwiLFwibG5kXCIsXCJsbmdcIixcImxuaFwiLFwibG5pXCIsXCJsbmpcIixcImxubFwiLFwibG5tXCIsXCJsbm5cIixcImxub1wiLFwibG5zXCIsXCJsbnVcIixcImxud1wiLFwibG56XCIsXCJsb2FcIixcImxvYlwiLFwibG9jXCIsXCJsb2VcIixcImxvZlwiLFwibG9nXCIsXCJsb2hcIixcImxvaVwiLFwibG9qXCIsXCJsb2tcIixcImxvbFwiLFwibG9tXCIsXCJsb25cIixcImxvb1wiLFwibG9wXCIsXCJsb3FcIixcImxvclwiLFwibG9zXCIsXCJsb3RcIixcImxvdVwiLFwibG92XCIsXCJsb3dcIixcImxveFwiLFwibG95XCIsXCJsb3pcIixcImxwYVwiLFwibHBlXCIsXCJscG5cIixcImxwb1wiLFwibHB4XCIsXCJscmFcIixcImxyY1wiLFwibHJlXCIsXCJscmdcIixcImxyaVwiLFwibHJrXCIsXCJscmxcIixcImxybVwiLFwibHJuXCIsXCJscm9cIixcImxyclwiLFwibHJ0XCIsXCJscnZcIixcImxyelwiLFwibHNhXCIsXCJsc2JcIixcImxzZFwiLFwibHNlXCIsXCJsc2dcIixcImxzaFwiLFwibHNpXCIsXCJsc2xcIixcImxzbVwiLFwibHNuXCIsXCJsc29cIixcImxzcFwiLFwibHNyXCIsXCJsc3NcIixcImxzdFwiLFwibHN2XCIsXCJsc3lcIixcImx0Y1wiLFwibHRnXCIsXCJsdGhcIixcImx0aVwiLFwibHRuXCIsXCJsdG9cIixcImx0c1wiLFwibHR1XCIsXCJsdWFcIixcImx1Y1wiLFwibHVkXCIsXCJsdWVcIixcImx1ZlwiLFwibHVpXCIsXCJsdWpcIixcImx1a1wiLFwibHVsXCIsXCJsdW1cIixcImx1blwiLFwibHVvXCIsXCJsdXBcIixcImx1cVwiLFwibHVyXCIsXCJsdXNcIixcImx1dFwiLFwibHV1XCIsXCJsdXZcIixcImx1d1wiLFwibHV5XCIsXCJsdXpcIixcImx2YVwiLFwibHZpXCIsXCJsdmtcIixcImx2c1wiLFwibHZ1XCIsXCJsd2FcIixcImx3ZVwiLFwibHdnXCIsXCJsd2hcIixcImx3bFwiLFwibHdtXCIsXCJsd29cIixcImx3c1wiLFwibHd0XCIsXCJsd3VcIixcImx3d1wiLFwibHhtXCIsXCJseWFcIixcImx5Z1wiLFwibHluXCIsXCJsemhcIixcImx6bFwiLFwibHpuXCIsXCJsenpcIl1cbixbIFwibWdcIixcIm1oXCIsXCJtaVwiLFwibWtcIixcIm1sXCIsXCJtblwiLFwibW9cIixcIm1yXCIsXCJtc1wiLFwibXRcIixcIm15XCIsXCJtYWFcIixcIm1hYlwiLFwibWFkXCIsXCJtYWVcIixcIm1hZlwiLFwibWFnXCIsXCJtYWlcIixcIm1halwiLFwibWFrXCIsXCJtYW1cIixcIm1hblwiLFwibWFwXCIsXCJtYXFcIixcIm1hc1wiLFwibWF0XCIsXCJtYXVcIixcIm1hdlwiLFwibWF3XCIsXCJtYXhcIixcIm1helwiLFwibWJhXCIsXCJtYmJcIixcIm1iY1wiLFwibWJkXCIsXCJtYmVcIixcIm1iZlwiLFwibWJoXCIsXCJtYmlcIixcIm1ialwiLFwibWJrXCIsXCJtYmxcIixcIm1ibVwiLFwibWJuXCIsXCJtYm9cIixcIm1icFwiLFwibWJxXCIsXCJtYnJcIixcIm1ic1wiLFwibWJ0XCIsXCJtYnVcIixcIm1idlwiLFwibWJ3XCIsXCJtYnhcIixcIm1ieVwiLFwibWJ6XCIsXCJtY2FcIixcIm1jYlwiLFwibWNjXCIsXCJtY2RcIixcIm1jZVwiLFwibWNmXCIsXCJtY2dcIixcIm1jaFwiLFwibWNpXCIsXCJtY2pcIixcIm1ja1wiLFwibWNsXCIsXCJtY21cIixcIm1jblwiLFwibWNvXCIsXCJtY3BcIixcIm1jcVwiLFwibWNyXCIsXCJtY3NcIixcIm1jdFwiLFwibWN1XCIsXCJtY3ZcIixcIm1jd1wiLFwibWN4XCIsXCJtY3lcIixcIm1jelwiLFwibWRhXCIsXCJtZGJcIixcIm1kY1wiLFwibWRkXCIsXCJtZGVcIixcIm1kZlwiLFwibWRnXCIsXCJtZGhcIixcIm1kaVwiLFwibWRqXCIsXCJtZGtcIixcIm1kbFwiLFwibWRtXCIsXCJtZG5cIixcIm1kcFwiLFwibWRxXCIsXCJtZHJcIixcIm1kc1wiLFwibWR0XCIsXCJtZHVcIixcIm1kdlwiLFwibWR3XCIsXCJtZHhcIixcIm1keVwiLFwibWR6XCIsXCJtZWFcIixcIm1lYlwiLFwibWVjXCIsXCJtZWRcIixcIm1lZVwiLFwibWVmXCIsXCJtZWdcIixcIm1laFwiLFwibWVpXCIsXCJtZWpcIixcIm1la1wiLFwibWVsXCIsXCJtZW1cIixcIm1lblwiLFwibWVvXCIsXCJtZXBcIixcIm1lcVwiLFwibWVyXCIsXCJtZXNcIixcIm1ldFwiLFwibWV1XCIsXCJtZXZcIixcIm1ld1wiLFwibWV5XCIsXCJtZXpcIixcIm1mYVwiLFwibWZiXCIsXCJtZmNcIixcIm1mZFwiLFwibWZlXCIsXCJtZmZcIixcIm1mZ1wiLFwibWZoXCIsXCJtZmlcIixcIm1malwiLFwibWZrXCIsXCJtZmxcIixcIm1mbVwiLFwibWZuXCIsXCJtZm9cIixcIm1mcFwiLFwibWZxXCIsXCJtZnJcIixcIm1mc1wiLFwibWZ0XCIsXCJtZnVcIixcIm1mdlwiLFwibWZ3XCIsXCJtZnhcIixcIm1meVwiLFwibWZ6XCIsXCJtZ2FcIixcIm1nYlwiLFwibWdjXCIsXCJtZ2RcIixcIm1nZVwiLFwibWdmXCIsXCJtZ2dcIixcIm1naFwiLFwibWdpXCIsXCJtZ2pcIixcIm1na1wiLFwibWdsXCIsXCJtZ21cIixcIm1nblwiLFwibWdvXCIsXCJtZ3BcIixcIm1ncVwiLFwibWdyXCIsXCJtZ3NcIixcIm1ndFwiLFwibWd1XCIsXCJtZ3ZcIixcIm1nd1wiLFwibWd4XCIsXCJtZ3lcIixcIm1nelwiLFwibWhhXCIsXCJtaGJcIixcIm1oY1wiLFwibWhkXCIsXCJtaGVcIixcIm1oZlwiLFwibWhnXCIsXCJtaGhcIixcIm1oaVwiLFwibWhqXCIsXCJtaGtcIixcIm1obFwiLFwibWhtXCIsXCJtaG5cIixcIm1ob1wiLFwibWhwXCIsXCJtaHFcIixcIm1oclwiLFwibWhzXCIsXCJtaHRcIixcIm1odVwiLFwibWh3XCIsXCJtaHhcIixcIm1oeVwiLFwibWh6XCIsXCJtaWFcIixcIm1pYlwiLFwibWljXCIsXCJtaWRcIixcIm1pZVwiLFwibWlmXCIsXCJtaWdcIixcIm1paFwiLFwibWlpXCIsXCJtaWpcIixcIm1pa1wiLFwibWlsXCIsXCJtaW1cIixcIm1pblwiLFwibWlvXCIsXCJtaXBcIixcIm1pcVwiLFwibWlyXCIsXCJtaXNcIixcIm1pdFwiLFwibWl1XCIsXCJtaXdcIixcIm1peFwiLFwibWl5XCIsXCJtaXpcIixcIm1qYVwiLFwibWpiXCIsXCJtamNcIixcIm1qZFwiLFwibWplXCIsXCJtamdcIixcIm1qaFwiLFwibWppXCIsXCJtampcIixcIm1qa1wiLFwibWpsXCIsXCJtam1cIixcIm1qblwiLFwibWpvXCIsXCJtanBcIixcIm1qcVwiLFwibWpyXCIsXCJtanNcIixcIm1qdFwiLFwibWp1XCIsXCJtanZcIixcIm1qd1wiLFwibWp4XCIsXCJtanlcIixcIm1qelwiLFwibWthXCIsXCJta2JcIixcIm1rY1wiLFwibWtlXCIsXCJta2ZcIixcIm1rZ1wiLFwibWtoXCIsXCJta2lcIixcIm1ralwiLFwibWtrXCIsXCJta2xcIixcIm1rbVwiLFwibWtuXCIsXCJta29cIixcIm1rcFwiLFwibWtxXCIsXCJta3JcIixcIm1rc1wiLFwibWt0XCIsXCJta3VcIixcIm1rdlwiLFwibWt3XCIsXCJta3hcIixcIm1reVwiLFwibWt6XCIsXCJtbGFcIixcIm1sYlwiLFwibWxjXCIsXCJtbGRcIixcIm1sZVwiLFwibWxmXCIsXCJtbGhcIixcIm1saVwiLFwibWxqXCIsXCJtbGtcIixcIm1sbFwiLFwibWxtXCIsXCJtbG5cIixcIm1sb1wiLFwibWxwXCIsXCJtbHFcIixcIm1sclwiLFwibWxzXCIsXCJtbHVcIixcIm1sdlwiLFwibWx3XCIsXCJtbHhcIixcIm1selwiLFwibW1hXCIsXCJtbWJcIixcIm1tY1wiLFwibW1kXCIsXCJtbWVcIixcIm1tZlwiLFwibW1nXCIsXCJtbWhcIixcIm1taVwiLFwibW1qXCIsXCJtbWtcIixcIm1tbFwiLFwibW1tXCIsXCJtbW5cIixcIm1tb1wiLFwibW1wXCIsXCJtbXFcIixcIm1tclwiLFwibW10XCIsXCJtbXVcIixcIm1tdlwiLFwibW13XCIsXCJtbXhcIixcIm1teVwiLFwibW16XCIsXCJtbmFcIixcIm1uYlwiLFwibW5jXCIsXCJtbmRcIixcIm1uZVwiLFwibW5mXCIsXCJtbmdcIixcIm1uaFwiLFwibW5pXCIsXCJtbmpcIixcIm1ua1wiLFwibW5sXCIsXCJtbm1cIixcIm1ublwiLFwibW5vXCIsXCJtbnBcIixcIm1ucVwiLFwibW5yXCIsXCJtbnNcIixcIm1udFwiLFwibW51XCIsXCJtbnZcIixcIm1ud1wiLFwibW54XCIsXCJtbnlcIixcIm1uelwiLFwibW9hXCIsXCJtb2NcIixcIm1vZFwiLFwibW9lXCIsXCJtb2ZcIixcIm1vZ1wiLFwibW9oXCIsXCJtb2lcIixcIm1valwiLFwibW9rXCIsXCJtb21cIixcIm1vb1wiLFwibW9wXCIsXCJtb3FcIixcIm1vclwiLFwibW9zXCIsXCJtb3RcIixcIm1vdVwiLFwibW92XCIsXCJtb3dcIixcIm1veFwiLFwibW95XCIsXCJtb3pcIixcIm1wYVwiLFwibXBiXCIsXCJtcGNcIixcIm1wZFwiLFwibXBlXCIsXCJtcGdcIixcIm1waFwiLFwibXBpXCIsXCJtcGpcIixcIm1wa1wiLFwibXBsXCIsXCJtcG1cIixcIm1wblwiLFwibXBvXCIsXCJtcHBcIixcIm1wcVwiLFwibXByXCIsXCJtcHNcIixcIm1wdFwiLFwibXB1XCIsXCJtcHZcIixcIm1wd1wiLFwibXB4XCIsXCJtcHlcIixcIm1welwiLFwibXFhXCIsXCJtcWJcIixcIm1xY1wiLFwibXFlXCIsXCJtcWZcIixcIm1xZ1wiLFwibXFoXCIsXCJtcWlcIixcIm1xalwiLFwibXFrXCIsXCJtcWxcIixcIm1xbVwiLFwibXFuXCIsXCJtcW9cIixcIm1xcFwiLFwibXFxXCIsXCJtcXJcIixcIm1xc1wiLFwibXF0XCIsXCJtcXVcIixcIm1xdlwiLFwibXF3XCIsXCJtcXhcIixcIm1xeVwiLFwibXF6XCIsXCJtcmFcIixcIm1yYlwiLFwibXJjXCIsXCJtcmRcIixcIm1yZVwiLFwibXJmXCIsXCJtcmdcIixcIm1yaFwiLFwibXJqXCIsXCJtcmtcIixcIm1ybFwiLFwibXJtXCIsXCJtcm5cIixcIm1yb1wiLFwibXJwXCIsXCJtcnFcIixcIm1yclwiLFwibXJzXCIsXCJtcnRcIixcIm1ydVwiLFwibXJ2XCIsXCJtcndcIixcIm1yeFwiLFwibXJ5XCIsXCJtcnpcIixcIm1zYlwiLFwibXNjXCIsXCJtc2RcIixcIm1zZVwiLFwibXNmXCIsXCJtc2dcIixcIm1zaFwiLFwibXNpXCIsXCJtc2pcIixcIm1za1wiLFwibXNsXCIsXCJtc21cIixcIm1zblwiLFwibXNvXCIsXCJtc3BcIixcIm1zcVwiLFwibXNyXCIsXCJtc3NcIixcIm1zdFwiLFwibXN1XCIsXCJtc3ZcIixcIm1zd1wiLFwibXN4XCIsXCJtc3lcIixcIm1zelwiLFwibXRhXCIsXCJtdGJcIixcIm10Y1wiLFwibXRkXCIsXCJtdGVcIixcIm10ZlwiLFwibXRnXCIsXCJtdGhcIixcIm10aVwiLFwibXRqXCIsXCJtdGtcIixcIm10bFwiLFwibXRtXCIsXCJtdG5cIixcIm10b1wiLFwibXRwXCIsXCJtdHFcIixcIm10clwiLFwibXRzXCIsXCJtdHRcIixcIm10dVwiLFwibXR2XCIsXCJtdHdcIixcIm10eFwiLFwibXR5XCIsXCJtdWFcIixcIm11YlwiLFwibXVjXCIsXCJtdWRcIixcIm11ZVwiLFwibXVnXCIsXCJtdWhcIixcIm11aVwiLFwibXVqXCIsXCJtdWtcIixcIm11bFwiLFwibXVtXCIsXCJtdW5cIixcIm11b1wiLFwibXVwXCIsXCJtdXFcIixcIm11clwiLFwibXVzXCIsXCJtdXRcIixcIm11dVwiLFwibXV2XCIsXCJtdXhcIixcIm11eVwiLFwibXV6XCIsXCJtdmFcIixcIm12YlwiLFwibXZkXCIsXCJtdmVcIixcIm12ZlwiLFwibXZnXCIsXCJtdmhcIixcIm12aVwiLFwibXZrXCIsXCJtdmxcIixcIm12bVwiLFwibXZuXCIsXCJtdm9cIixcIm12cFwiLFwibXZxXCIsXCJtdnJcIixcIm12c1wiLFwibXZ0XCIsXCJtdnVcIixcIm12dlwiLFwibXZ3XCIsXCJtdnhcIixcIm12eVwiLFwibXZ6XCIsXCJtd2FcIixcIm13YlwiLFwibXdjXCIsXCJtd2RcIixcIm13ZVwiLFwibXdmXCIsXCJtd2dcIixcIm13aFwiLFwibXdpXCIsXCJtd2pcIixcIm13a1wiLFwibXdsXCIsXCJtd21cIixcIm13blwiLFwibXdvXCIsXCJtd3BcIixcIm13cVwiLFwibXdyXCIsXCJtd3NcIixcIm13dFwiLFwibXd1XCIsXCJtd3ZcIixcIm13d1wiLFwibXd4XCIsXCJtd3lcIixcIm13elwiLFwibXhhXCIsXCJteGJcIixcIm14Y1wiLFwibXhkXCIsXCJteGVcIixcIm14ZlwiLFwibXhnXCIsXCJteGhcIixcIm14aVwiLFwibXhqXCIsXCJteGtcIixcIm14bFwiLFwibXhtXCIsXCJteG5cIixcIm14b1wiLFwibXhwXCIsXCJteHFcIixcIm14clwiLFwibXhzXCIsXCJteHRcIixcIm14dVwiLFwibXh2XCIsXCJteHdcIixcIm14eFwiLFwibXh5XCIsXCJteHpcIixcIm15YlwiLFwibXljXCIsXCJteWRcIixcIm15ZVwiLFwibXlmXCIsXCJteWdcIixcIm15aFwiLFwibXlpXCIsXCJteWpcIixcIm15a1wiLFwibXlsXCIsXCJteW1cIixcIm15blwiLFwibXlvXCIsXCJteXBcIixcIm15cVwiLFwibXlyXCIsXCJteXNcIixcIm15dFwiLFwibXl1XCIsXCJteXZcIixcIm15d1wiLFwibXl4XCIsXCJteXlcIixcIm15elwiLFwibXphXCIsXCJtemJcIixcIm16Y1wiLFwibXpkXCIsXCJtemVcIixcIm16Z1wiLFwibXpoXCIsXCJtemlcIixcIm16alwiLFwibXprXCIsXCJtemxcIixcIm16bVwiLFwibXpuXCIsXCJtem9cIixcIm16cFwiLFwibXpxXCIsXCJtenJcIixcIm16c1wiLFwibXp0XCIsXCJtenVcIixcIm16dlwiLFwibXp3XCIsXCJtenhcIixcIm16eVwiLFwibXp6XCJdXG4sWyBcIm5hXCIsXCJuYlwiLFwibmRcIixcIm5lXCIsXCJuZ1wiLFwibmxcIixcIm5uXCIsXCJub1wiLFwibnJcIixcIm52XCIsXCJueVwiLFwibmFhXCIsXCJuYWJcIixcIm5hY1wiLFwibmFkXCIsXCJuYWVcIixcIm5hZlwiLFwibmFnXCIsXCJuYWhcIixcIm5haVwiLFwibmFqXCIsXCJuYWtcIixcIm5hbFwiLFwibmFtXCIsXCJuYW5cIixcIm5hb1wiLFwibmFwXCIsXCJuYXFcIixcIm5hclwiLFwibmFzXCIsXCJuYXRcIixcIm5hd1wiLFwibmF4XCIsXCJuYXlcIixcIm5helwiLFwibmJhXCIsXCJuYmJcIixcIm5iY1wiLFwibmJkXCIsXCJuYmVcIixcIm5iZlwiLFwibmJnXCIsXCJuYmhcIixcIm5iaVwiLFwibmJqXCIsXCJuYmtcIixcIm5ibVwiLFwibmJuXCIsXCJuYm9cIixcIm5icFwiLFwibmJxXCIsXCJuYnJcIixcIm5ic1wiLFwibmJ0XCIsXCJuYnVcIixcIm5idlwiLFwibmJ3XCIsXCJuYnhcIixcIm5ieVwiLFwibmNhXCIsXCJuY2JcIixcIm5jY1wiLFwibmNkXCIsXCJuY2VcIixcIm5jZlwiLFwibmNnXCIsXCJuY2hcIixcIm5jaVwiLFwibmNqXCIsXCJuY2tcIixcIm5jbFwiLFwibmNtXCIsXCJuY25cIixcIm5jb1wiLFwibmNwXCIsXCJuY3FcIixcIm5jclwiLFwibmNzXCIsXCJuY3RcIixcIm5jdVwiLFwibmN4XCIsXCJuY3pcIixcIm5kYVwiLFwibmRiXCIsXCJuZGNcIixcIm5kZFwiLFwibmRmXCIsXCJuZGdcIixcIm5kaFwiLFwibmRpXCIsXCJuZGpcIixcIm5ka1wiLFwibmRsXCIsXCJuZG1cIixcIm5kblwiLFwibmRwXCIsXCJuZHFcIixcIm5kclwiLFwibmRzXCIsXCJuZHRcIixcIm5kdVwiLFwibmR2XCIsXCJuZHdcIixcIm5keFwiLFwibmR5XCIsXCJuZHpcIixcIm5lYVwiLFwibmViXCIsXCJuZWNcIixcIm5lZFwiLFwibmVlXCIsXCJuZWZcIixcIm5lZ1wiLFwibmVoXCIsXCJuZWlcIixcIm5lalwiLFwibmVrXCIsXCJuZW1cIixcIm5lblwiLFwibmVvXCIsXCJuZXFcIixcIm5lclwiLFwibmVzXCIsXCJuZXRcIixcIm5ldVwiLFwibmV2XCIsXCJuZXdcIixcIm5leFwiLFwibmV5XCIsXCJuZXpcIixcIm5mYVwiLFwibmZkXCIsXCJuZmxcIixcIm5mclwiLFwibmZ1XCIsXCJuZ2FcIixcIm5nYlwiLFwibmdjXCIsXCJuZ2RcIixcIm5nZVwiLFwibmdmXCIsXCJuZ2dcIixcIm5naFwiLFwibmdpXCIsXCJuZ2pcIixcIm5na1wiLFwibmdsXCIsXCJuZ21cIixcIm5nblwiLFwibmdvXCIsXCJuZ3BcIixcIm5ncVwiLFwibmdyXCIsXCJuZ3NcIixcIm5ndFwiLFwibmd1XCIsXCJuZ3ZcIixcIm5nd1wiLFwibmd4XCIsXCJuZ3lcIixcIm5nelwiLFwibmhhXCIsXCJuaGJcIixcIm5oY1wiLFwibmhkXCIsXCJuaGVcIixcIm5oZlwiLFwibmhnXCIsXCJuaGhcIixcIm5oaVwiLFwibmhrXCIsXCJuaG1cIixcIm5oblwiLFwibmhvXCIsXCJuaHBcIixcIm5ocVwiLFwibmhyXCIsXCJuaHRcIixcIm5odVwiLFwibmh2XCIsXCJuaHdcIixcIm5oeFwiLFwibmh5XCIsXCJuaHpcIixcIm5pYVwiLFwibmliXCIsXCJuaWNcIixcIm5pZFwiLFwibmllXCIsXCJuaWZcIixcIm5pZ1wiLFwibmloXCIsXCJuaWlcIixcIm5palwiLFwibmlrXCIsXCJuaWxcIixcIm5pbVwiLFwibmluXCIsXCJuaW9cIixcIm5pcVwiLFwibmlyXCIsXCJuaXNcIixcIm5pdFwiLFwibml1XCIsXCJuaXZcIixcIm5pd1wiLFwibml4XCIsXCJuaXlcIixcIm5pelwiLFwibmphXCIsXCJuamJcIixcIm5qZFwiLFwibmpoXCIsXCJuamlcIixcIm5qalwiLFwibmpsXCIsXCJuam1cIixcIm5qblwiLFwibmpvXCIsXCJuanJcIixcIm5qc1wiLFwibmp0XCIsXCJuanVcIixcIm5qeFwiLFwibmp5XCIsXCJuanpcIixcIm5rYVwiLFwibmtiXCIsXCJua2NcIixcIm5rZFwiLFwibmtlXCIsXCJua2ZcIixcIm5rZ1wiLFwibmtoXCIsXCJua2lcIixcIm5ralwiLFwibmtrXCIsXCJua21cIixcIm5rblwiLFwibmtvXCIsXCJua3BcIixcIm5rcVwiLFwibmtyXCIsXCJua3NcIixcIm5rdFwiLFwibmt1XCIsXCJua3ZcIixcIm5rd1wiLFwibmt4XCIsXCJua3pcIixcIm5sYVwiLFwibmxjXCIsXCJubGVcIixcIm5sZ1wiLFwibmxpXCIsXCJubGpcIixcIm5sa1wiLFwibmxsXCIsXCJubG1cIixcIm5sblwiLFwibmxvXCIsXCJubHFcIixcIm5sclwiLFwibmx1XCIsXCJubHZcIixcIm5sd1wiLFwibmx4XCIsXCJubHlcIixcIm5selwiLFwibm1hXCIsXCJubWJcIixcIm5tY1wiLFwibm1kXCIsXCJubWVcIixcIm5tZlwiLFwibm1nXCIsXCJubWhcIixcIm5taVwiLFwibm1qXCIsXCJubWtcIixcIm5tbFwiLFwibm1tXCIsXCJubW5cIixcIm5tb1wiLFwibm1wXCIsXCJubXFcIixcIm5tclwiLFwibm1zXCIsXCJubXRcIixcIm5tdVwiLFwibm12XCIsXCJubXdcIixcIm5teFwiLFwibm15XCIsXCJubXpcIixcIm5uYVwiLFwibm5iXCIsXCJubmNcIixcIm5uZFwiLFwibm5lXCIsXCJubmZcIixcIm5uZ1wiLFwibm5oXCIsXCJubmlcIixcIm5ualwiLFwibm5rXCIsXCJubmxcIixcIm5ubVwiLFwibm5uXCIsXCJubnBcIixcIm5ucVwiLFwibm5yXCIsXCJubnNcIixcIm5udFwiLFwibm51XCIsXCJubnZcIixcIm5ud1wiLFwibm54XCIsXCJubnlcIixcIm5uelwiLFwibm9hXCIsXCJub2NcIixcIm5vZFwiLFwibm9lXCIsXCJub2ZcIixcIm5vZ1wiLFwibm9oXCIsXCJub2lcIixcIm5valwiLFwibm9rXCIsXCJub2xcIixcIm5vbVwiLFwibm9uXCIsXCJub29cIixcIm5vcFwiLFwibm9xXCIsXCJub3NcIixcIm5vdFwiLFwibm91XCIsXCJub3ZcIixcIm5vd1wiLFwibm95XCIsXCJub3pcIixcIm5wYVwiLFwibnBiXCIsXCJucGdcIixcIm5waFwiLFwibnBpXCIsXCJucGxcIixcIm5wblwiLFwibnBvXCIsXCJucHNcIixcIm5wdVwiLFwibnB4XCIsXCJucHlcIixcIm5xZ1wiLFwibnFrXCIsXCJucWxcIixcIm5xbVwiLFwibnFuXCIsXCJucW9cIixcIm5xcVwiLFwibnF0XCIsXCJucXlcIixcIm5yYVwiLFwibnJiXCIsXCJucmNcIixcIm5yZVwiLFwibnJmXCIsXCJucmdcIixcIm5yaVwiLFwibnJrXCIsXCJucmxcIixcIm5ybVwiLFwibnJuXCIsXCJucnBcIixcIm5yclwiLFwibnJ0XCIsXCJucnVcIixcIm5yeFwiLFwibnJ6XCIsXCJuc2FcIixcIm5zYlwiLFwibnNjXCIsXCJuc2RcIixcIm5zZVwiLFwibnNmXCIsXCJuc2dcIixcIm5zaFwiLFwibnNpXCIsXCJuc2tcIixcIm5zbFwiLFwibnNtXCIsXCJuc25cIixcIm5zb1wiLFwibnNwXCIsXCJuc3FcIixcIm5zclwiLFwibnNzXCIsXCJuc3RcIixcIm5zdVwiLFwibnN2XCIsXCJuc3dcIixcIm5zeFwiLFwibnN5XCIsXCJuc3pcIixcIm50ZFwiLFwibnRlXCIsXCJudGdcIixcIm50aVwiLFwibnRqXCIsXCJudGtcIixcIm50bVwiLFwibnRvXCIsXCJudHBcIixcIm50clwiLFwibnRzXCIsXCJudHVcIixcIm50d1wiLFwibnR4XCIsXCJudHlcIixcIm50elwiLFwibnVhXCIsXCJudWJcIixcIm51Y1wiLFwibnVkXCIsXCJudWVcIixcIm51ZlwiLFwibnVnXCIsXCJudWhcIixcIm51aVwiLFwibnVqXCIsXCJudWtcIixcIm51bFwiLFwibnVtXCIsXCJudW5cIixcIm51b1wiLFwibnVwXCIsXCJudXFcIixcIm51clwiLFwibnVzXCIsXCJudXRcIixcIm51dVwiLFwibnV2XCIsXCJudXdcIixcIm51eFwiLFwibnV5XCIsXCJudXpcIixcIm52aFwiLFwibnZtXCIsXCJudm9cIixcIm53YVwiLFwibndiXCIsXCJud2NcIixcIm53ZVwiLFwibndnXCIsXCJud2lcIixcIm53bVwiLFwibndvXCIsXCJud3JcIixcIm53eFwiLFwibnd5XCIsXCJueGFcIixcIm54ZFwiLFwibnhlXCIsXCJueGdcIixcIm54aVwiLFwibnhrXCIsXCJueGxcIixcIm54bVwiLFwibnhuXCIsXCJueG9cIixcIm54cVwiLFwibnhyXCIsXCJueHVcIixcIm54eFwiLFwibnliXCIsXCJueWNcIixcIm55ZFwiLFwibnllXCIsXCJueWZcIixcIm55Z1wiLFwibnloXCIsXCJueWlcIixcIm55alwiLFwibnlrXCIsXCJueWxcIixcIm55bVwiLFwibnluXCIsXCJueW9cIixcIm55cFwiLFwibnlxXCIsXCJueXJcIixcIm55c1wiLFwibnl0XCIsXCJueXVcIixcIm55dlwiLFwibnl3XCIsXCJueXhcIixcIm55eVwiLFwibnphXCIsXCJuemJcIixcIm56ZFwiLFwibnppXCIsXCJuemtcIixcIm56bVwiLFwibnpzXCIsXCJuenVcIixcIm56eVwiLFwibnp6XCJdXG4sWyBcIm9jXCIsXCJvalwiLFwib21cIixcIm9yXCIsXCJvc1wiLFwib2FhXCIsXCJvYWNcIixcIm9hclwiLFwib2F2XCIsXCJvYmlcIixcIm9ia1wiLFwib2JsXCIsXCJvYm1cIixcIm9ib1wiLFwib2JyXCIsXCJvYnRcIixcIm9idVwiLFwib2NhXCIsXCJvY2hcIixcIm9jbVwiLFwib2NvXCIsXCJvY3VcIixcIm9kYVwiLFwib2RrXCIsXCJvZHRcIixcIm9kdVwiLFwib2ZvXCIsXCJvZnNcIixcIm9mdVwiLFwib2diXCIsXCJvZ2NcIixcIm9nZVwiLFwib2dnXCIsXCJvZ29cIixcIm9ndVwiLFwib2h0XCIsXCJvaHVcIixcIm9pYVwiLFwib2luXCIsXCJvamJcIixcIm9qY1wiLFwib2pnXCIsXCJvanBcIixcIm9qc1wiLFwib2p2XCIsXCJvandcIixcIm9rYVwiLFwib2tiXCIsXCJva2NcIixcIm9rZFwiLFwib2tlXCIsXCJva2dcIixcIm9raFwiLFwib2tpXCIsXCJva2pcIixcIm9ra1wiLFwib2tsXCIsXCJva21cIixcIm9rblwiLFwib2tvXCIsXCJva3JcIixcIm9rc1wiLFwib2t1XCIsXCJva3ZcIixcIm9reFwiLFwib2t6XCIsXCJvbGFcIixcIm9sZFwiLFwib2xlXCIsXCJvbGtcIixcIm9sbVwiLFwib2xvXCIsXCJvbHJcIixcIm9sdFwiLFwib2x1XCIsXCJvbWFcIixcIm9tYlwiLFwib21jXCIsXCJvbWVcIixcIm9tZ1wiLFwib21pXCIsXCJvbWtcIixcIm9tbFwiLFwib21uXCIsXCJvbW9cIixcIm9tcFwiLFwib21xXCIsXCJvbXJcIixcIm9tdFwiLFwib211XCIsXCJvbXZcIixcIm9td1wiLFwib214XCIsXCJvbXlcIixcIm9uYVwiLFwib25iXCIsXCJvbmVcIixcIm9uZ1wiLFwib25pXCIsXCJvbmpcIixcIm9ua1wiLFwib25uXCIsXCJvbm9cIixcIm9ucFwiLFwib25yXCIsXCJvbnNcIixcIm9udFwiLFwib251XCIsXCJvbndcIixcIm9ueFwiLFwib29kXCIsXCJvb2dcIixcIm9vblwiLFwib29yXCIsXCJvb3NcIixcIm9wYVwiLFwib3BrXCIsXCJvcG1cIixcIm9wb1wiLFwib3B0XCIsXCJvcHlcIixcIm9yYVwiLFwib3JjXCIsXCJvcmVcIixcIm9yZ1wiLFwib3JoXCIsXCJvcm5cIixcIm9yb1wiLFwib3JyXCIsXCJvcnNcIixcIm9ydFwiLFwib3J1XCIsXCJvcnZcIixcIm9yd1wiLFwib3J4XCIsXCJvcnlcIixcIm9yelwiLFwib3NhXCIsXCJvc2NcIixcIm9zaVwiLFwib3NuXCIsXCJvc29cIixcIm9zcFwiLFwib3N0XCIsXCJvc3VcIixcIm9zeFwiLFwib3RhXCIsXCJvdGJcIixcIm90ZFwiLFwib3RlXCIsXCJvdGlcIixcIm90a1wiLFwib3RsXCIsXCJvdG1cIixcIm90blwiLFwib3RvXCIsXCJvdHFcIixcIm90clwiLFwib3RzXCIsXCJvdHRcIixcIm90dVwiLFwib3R3XCIsXCJvdHhcIixcIm90eVwiLFwib3R6XCIsXCJvdWFcIixcIm91YlwiLFwib3VlXCIsXCJvdWlcIixcIm91bVwiLFwib3VuXCIsXCJvdmRcIixcIm93aVwiLFwib3dsXCIsXCJveWJcIixcIm95ZFwiLFwib3ltXCIsXCJveXlcIixcIm96bVwiXVxuLFsgXCJwYVwiLFwicGlcIixcInBsXCIsXCJwc1wiLFwicHRcIixcInBhYVwiLFwicGFiXCIsXCJwYWNcIixcInBhZFwiLFwicGFlXCIsXCJwYWZcIixcInBhZ1wiLFwicGFoXCIsXCJwYWlcIixcInBha1wiLFwicGFsXCIsXCJwYW1cIixcInBhb1wiLFwicGFwXCIsXCJwYXFcIixcInBhclwiLFwicGFzXCIsXCJwYXRcIixcInBhdVwiLFwicGF2XCIsXCJwYXdcIixcInBheFwiLFwicGF5XCIsXCJwYXpcIixcInBiYlwiLFwicGJjXCIsXCJwYmVcIixcInBiZlwiLFwicGJnXCIsXCJwYmhcIixcInBiaVwiLFwicGJsXCIsXCJwYm1cIixcInBiblwiLFwicGJvXCIsXCJwYnBcIixcInBiclwiLFwicGJzXCIsXCJwYnRcIixcInBidVwiLFwicGJ2XCIsXCJwYnlcIixcInBielwiLFwicGNhXCIsXCJwY2JcIixcInBjY1wiLFwicGNkXCIsXCJwY2VcIixcInBjZlwiLFwicGNnXCIsXCJwY2hcIixcInBjaVwiLFwicGNqXCIsXCJwY2tcIixcInBjbFwiLFwicGNtXCIsXCJwY25cIixcInBjcFwiLFwicGNyXCIsXCJwY3dcIixcInBkYVwiLFwicGRjXCIsXCJwZGlcIixcInBkblwiLFwicGRvXCIsXCJwZHRcIixcInBkdVwiLFwicGVhXCIsXCJwZWJcIixcInBlZFwiLFwicGVlXCIsXCJwZWZcIixcInBlZ1wiLFwicGVoXCIsXCJwZWlcIixcInBlalwiLFwicGVrXCIsXCJwZWxcIixcInBlbVwiLFwicGVvXCIsXCJwZXBcIixcInBlcVwiLFwicGVzXCIsXCJwZXZcIixcInBleFwiLFwicGV5XCIsXCJwZXpcIixcInBmYVwiLFwicGZlXCIsXCJwZmxcIixcInBnYVwiLFwicGdkXCIsXCJwZ2dcIixcInBnaVwiLFwicGdrXCIsXCJwZ2xcIixcInBnblwiLFwicGdzXCIsXCJwZ3VcIixcInBneVwiLFwicGd6XCIsXCJwaGFcIixcInBoZFwiLFwicGhnXCIsXCJwaGhcIixcInBoaVwiLFwicGhrXCIsXCJwaGxcIixcInBobVwiLFwicGhuXCIsXCJwaG9cIixcInBocVwiLFwicGhyXCIsXCJwaHRcIixcInBodVwiLFwicGh2XCIsXCJwaHdcIixcInBpYVwiLFwicGliXCIsXCJwaWNcIixcInBpZFwiLFwicGllXCIsXCJwaWZcIixcInBpZ1wiLFwicGloXCIsXCJwaWlcIixcInBpalwiLFwicGlsXCIsXCJwaW1cIixcInBpblwiLFwicGlvXCIsXCJwaXBcIixcInBpclwiLFwicGlzXCIsXCJwaXRcIixcInBpdVwiLFwicGl2XCIsXCJwaXdcIixcInBpeFwiLFwicGl5XCIsXCJwaXpcIixcInBqdFwiLFwicGthXCIsXCJwa2JcIixcInBrY1wiLFwicGtnXCIsXCJwa2hcIixcInBrblwiLFwicGtvXCIsXCJwa3BcIixcInBrclwiLFwicGtzXCIsXCJwa3RcIixcInBrdVwiLFwicGxhXCIsXCJwbGJcIixcInBsY1wiLFwicGxkXCIsXCJwbGVcIixcInBsZlwiLFwicGxnXCIsXCJwbGhcIixcInBsalwiLFwicGxrXCIsXCJwbGxcIixcInBsblwiLFwicGxvXCIsXCJwbHBcIixcInBscVwiLFwicGxyXCIsXCJwbHNcIixcInBsdFwiLFwicGx1XCIsXCJwbHZcIixcInBsd1wiLFwicGx5XCIsXCJwbHpcIixcInBtYVwiLFwicG1iXCIsXCJwbWNcIixcInBtZFwiLFwicG1lXCIsXCJwbWZcIixcInBtaFwiLFwicG1pXCIsXCJwbWpcIixcInBta1wiLFwicG1sXCIsXCJwbW1cIixcInBtblwiLFwicG1vXCIsXCJwbXFcIixcInBtclwiLFwicG1zXCIsXCJwbXRcIixcInBtdVwiLFwicG13XCIsXCJwbXhcIixcInBteVwiLFwicG16XCIsXCJwbmFcIixcInBuYlwiLFwicG5jXCIsXCJwbmRcIixcInBuZVwiLFwicG5nXCIsXCJwbmhcIixcInBuaVwiLFwicG5qXCIsXCJwbmtcIixcInBubFwiLFwicG5tXCIsXCJwbm5cIixcInBub1wiLFwicG5wXCIsXCJwbnFcIixcInBuclwiLFwicG5zXCIsXCJwbnRcIixcInBudVwiLFwicG52XCIsXCJwbndcIixcInBueFwiLFwicG55XCIsXCJwbnpcIixcInBvY1wiLFwicG9kXCIsXCJwb2VcIixcInBvZlwiLFwicG9nXCIsXCJwb2hcIixcInBvaVwiLFwicG9rXCIsXCJwb21cIixcInBvblwiLFwicG9vXCIsXCJwb3BcIixcInBvcVwiLFwicG9zXCIsXCJwb3RcIixcInBvdlwiLFwicG93XCIsXCJwb3hcIixcInBveVwiLFwicG96XCIsXCJwcGFcIixcInBwZVwiLFwicHBpXCIsXCJwcGtcIixcInBwbFwiLFwicHBtXCIsXCJwcG5cIixcInBwb1wiLFwicHBwXCIsXCJwcHFcIixcInBwclwiLFwicHBzXCIsXCJwcHRcIixcInBwdVwiLFwicHFhXCIsXCJwcWVcIixcInBxbVwiLFwicHF3XCIsXCJwcmFcIixcInByYlwiLFwicHJjXCIsXCJwcmRcIixcInByZVwiLFwicHJmXCIsXCJwcmdcIixcInByaFwiLFwicHJpXCIsXCJwcmtcIixcInBybFwiLFwicHJtXCIsXCJwcm5cIixcInByb1wiLFwicHJwXCIsXCJwcnFcIixcInByclwiLFwicHJzXCIsXCJwcnRcIixcInBydVwiLFwicHJ3XCIsXCJwcnhcIixcInByeVwiLFwicHJ6XCIsXCJwc2FcIixcInBzY1wiLFwicHNkXCIsXCJwc2VcIixcInBzZ1wiLFwicHNoXCIsXCJwc2lcIixcInBzbFwiLFwicHNtXCIsXCJwc25cIixcInBzb1wiLFwicHNwXCIsXCJwc3FcIixcInBzclwiLFwicHNzXCIsXCJwc3RcIixcInBzdVwiLFwicHN3XCIsXCJwc3lcIixcInB0YVwiLFwicHRoXCIsXCJwdGlcIixcInB0blwiLFwicHRvXCIsXCJwdHBcIixcInB0cVwiLFwicHRyXCIsXCJwdHRcIixcInB0dVwiLFwicHR2XCIsXCJwdHdcIixcInB0eVwiLFwicHVhXCIsXCJwdWJcIixcInB1Y1wiLFwicHVkXCIsXCJwdWVcIixcInB1ZlwiLFwicHVnXCIsXCJwdWlcIixcInB1alwiLFwicHVrXCIsXCJwdW1cIixcInB1b1wiLFwicHVwXCIsXCJwdXFcIixcInB1clwiLFwicHV0XCIsXCJwdXVcIixcInB1d1wiLFwicHV4XCIsXCJwdXlcIixcInB1elwiLFwicHdhXCIsXCJwd2JcIixcInB3Z1wiLFwicHdpXCIsXCJwd21cIixcInB3blwiLFwicHdvXCIsXCJwd3JcIixcInB3d1wiLFwicHhtXCIsXCJweWVcIixcInB5bVwiLFwicHluXCIsXCJweXNcIixcInB5dVwiLFwicHl4XCIsXCJweXlcIixcInB6blwiXVxuLFsgXCJxdVwiLFwicXVhXCIsXCJxdWJcIixcInF1Y1wiLFwicXVkXCIsXCJxdWZcIixcInF1Z1wiLFwicXVoXCIsXCJxdWlcIixcInF1a1wiLFwicXVsXCIsXCJxdW1cIixcInF1blwiLFwicXVwXCIsXCJxdXFcIixcInF1clwiLFwicXVzXCIsXCJxdXZcIixcInF1d1wiLFwicXV4XCIsXCJxdXlcIixcInF1elwiLFwicXZhXCIsXCJxdmNcIixcInF2ZVwiLFwicXZoXCIsXCJxdmlcIixcInF2alwiLFwicXZsXCIsXCJxdm1cIixcInF2blwiLFwicXZvXCIsXCJxdnBcIixcInF2c1wiLFwicXZ3XCIsXCJxdnlcIixcInF2elwiLFwicXdhXCIsXCJxd2NcIixcInF3ZVwiLFwicXdoXCIsXCJxd21cIixcInF3c1wiLFwicXd0XCIsXCJxeGFcIixcInF4Y1wiLFwicXhoXCIsXCJxeGxcIixcInF4blwiLFwicXhvXCIsXCJxeHBcIixcInF4cVwiLFwicXhyXCIsXCJxeHNcIixcInF4dFwiLFwicXh1XCIsXCJxeHdcIixcInF5YVwiLFwicXlwXCJdXG4sWyBcInJtXCIsXCJyblwiLFwicm9cIixcInJ1XCIsXCJyd1wiLFwicmFhXCIsXCJyYWJcIixcInJhY1wiLFwicmFkXCIsXCJyYWZcIixcInJhZ1wiLFwicmFoXCIsXCJyYWlcIixcInJhalwiLFwicmFrXCIsXCJyYWxcIixcInJhbVwiLFwicmFuXCIsXCJyYW9cIixcInJhcFwiLFwicmFxXCIsXCJyYXJcIixcInJhc1wiLFwicmF0XCIsXCJyYXVcIixcInJhdlwiLFwicmF3XCIsXCJyYXhcIixcInJheVwiLFwicmF6XCIsXCJyYmJcIixcInJia1wiLFwicmJsXCIsXCJyYnBcIixcInJjZlwiLFwicmRiXCIsXCJyZWFcIixcInJlYlwiLFwicmVlXCIsXCJyZWdcIixcInJlaVwiLFwicmVqXCIsXCJyZWxcIixcInJlbVwiLFwicmVuXCIsXCJyZXJcIixcInJlc1wiLFwicmV0XCIsXCJyZXlcIixcInJnYVwiLFwicmdlXCIsXCJyZ2tcIixcInJnblwiLFwicmdyXCIsXCJyZ3NcIixcInJndVwiLFwicmhnXCIsXCJyaHBcIixcInJpYVwiLFwicmllXCIsXCJyaWZcIixcInJpbFwiLFwicmltXCIsXCJyaW5cIixcInJpclwiLFwicml0XCIsXCJyaXVcIixcInJqZ1wiLFwicmppXCIsXCJyanNcIixcInJrYVwiLFwicmtiXCIsXCJya2hcIixcInJraVwiLFwicmttXCIsXCJya3RcIixcInJrd1wiLFwicm1hXCIsXCJybWJcIixcInJtY1wiLFwicm1kXCIsXCJybWVcIixcInJtZlwiLFwicm1nXCIsXCJybWhcIixcInJtaVwiLFwicm1rXCIsXCJybWxcIixcInJtbVwiLFwicm1uXCIsXCJybW9cIixcInJtcFwiLFwicm1xXCIsXCJybXJcIixcInJtc1wiLFwicm10XCIsXCJybXVcIixcInJtdlwiLFwicm13XCIsXCJybXhcIixcInJteVwiLFwicm16XCIsXCJybmFcIixcInJuZFwiLFwicm5nXCIsXCJybmxcIixcInJublwiLFwicm5wXCIsXCJybnJcIixcInJud1wiLFwicm9hXCIsXCJyb2JcIixcInJvY1wiLFwicm9kXCIsXCJyb2VcIixcInJvZlwiLFwicm9nXCIsXCJyb2xcIixcInJvbVwiLFwicm9vXCIsXCJyb3BcIixcInJvclwiLFwicm91XCIsXCJyb3dcIixcInJwblwiLFwicnB0XCIsXCJycmlcIixcInJyb1wiLFwicnJ0XCIsXCJyc2JcIixcInJzaVwiLFwicnNsXCIsXCJyc21cIixcInJ0Y1wiLFwicnRoXCIsXCJydG1cIixcInJ0c1wiLFwicnR3XCIsXCJydWJcIixcInJ1Y1wiLFwicnVlXCIsXCJydWZcIixcInJ1Z1wiLFwicnVoXCIsXCJydWlcIixcInJ1a1wiLFwicnVvXCIsXCJydXBcIixcInJ1cVwiLFwicnV0XCIsXCJydXVcIixcInJ1eVwiLFwicnV6XCIsXCJyd2FcIixcInJ3a1wiLFwicndsXCIsXCJyd21cIixcInJ3b1wiLFwicndyXCIsXCJyeGRcIixcInJ4d1wiLFwicnluXCIsXCJyeXNcIixcInJ5dVwiLFwicnpoXCJdXG4sWyBcInNhXCIsXCJzY1wiLFwic2RcIixcInNlXCIsXCJzZ1wiLFwic2hcIixcInNpXCIsXCJza1wiLFwic2xcIixcInNtXCIsXCJzblwiLFwic29cIixcInNxXCIsXCJzclwiLFwic3NcIixcInN0XCIsXCJzdVwiLFwic3ZcIixcInN3XCIsXCJzYWFcIixcInNhYlwiLFwic2FjXCIsXCJzYWRcIixcInNhZVwiLFwic2FmXCIsXCJzYWhcIixcInNhaVwiLFwic2FqXCIsXCJzYWtcIixcInNhbFwiLFwic2FtXCIsXCJzYW9cIixcInNhcFwiLFwic2FxXCIsXCJzYXJcIixcInNhc1wiLFwic2F0XCIsXCJzYXVcIixcInNhdlwiLFwic2F3XCIsXCJzYXhcIixcInNheVwiLFwic2F6XCIsXCJzYmFcIixcInNiYlwiLFwic2JjXCIsXCJzYmRcIixcInNiZVwiLFwic2JmXCIsXCJzYmdcIixcInNiaFwiLFwic2JpXCIsXCJzYmpcIixcInNia1wiLFwic2JsXCIsXCJzYm1cIixcInNiblwiLFwic2JvXCIsXCJzYnBcIixcInNicVwiLFwic2JyXCIsXCJzYnNcIixcInNidFwiLFwic2J1XCIsXCJzYnZcIixcInNid1wiLFwic2J4XCIsXCJzYnlcIixcInNielwiLFwic2NhXCIsXCJzY2JcIixcInNjZVwiLFwic2NmXCIsXCJzY2dcIixcInNjaFwiLFwic2NpXCIsXCJzY2tcIixcInNjbFwiLFwic2NuXCIsXCJzY29cIixcInNjcFwiLFwic2NxXCIsXCJzY3NcIixcInNjdFwiLFwic2N1XCIsXCJzY3ZcIixcInNjd1wiLFwic2N4XCIsXCJzZGFcIixcInNkYlwiLFwic2RjXCIsXCJzZGVcIixcInNkZlwiLFwic2RnXCIsXCJzZGhcIixcInNkalwiLFwic2RrXCIsXCJzZGxcIixcInNkbVwiLFwic2RuXCIsXCJzZG9cIixcInNkcFwiLFwic2RxXCIsXCJzZHJcIixcInNkc1wiLFwic2R0XCIsXCJzZHVcIixcInNkdlwiLFwic2R4XCIsXCJzZHpcIixcInNlYVwiLFwic2ViXCIsXCJzZWNcIixcInNlZFwiLFwic2VlXCIsXCJzZWZcIixcInNlZ1wiLFwic2VoXCIsXCJzZWlcIixcInNlalwiLFwic2VrXCIsXCJzZWxcIixcInNlbVwiLFwic2VuXCIsXCJzZW9cIixcInNlcFwiLFwic2VxXCIsXCJzZXJcIixcInNlc1wiLFwic2V0XCIsXCJzZXVcIixcInNldlwiLFwic2V3XCIsXCJzZXlcIixcInNlelwiLFwic2ZiXCIsXCJzZmVcIixcInNmbVwiLFwic2ZzXCIsXCJzZndcIixcInNnYVwiLFwic2diXCIsXCJzZ2NcIixcInNnZFwiLFwic2dlXCIsXCJzZ2dcIixcInNnaFwiLFwic2dpXCIsXCJzZ2pcIixcInNna1wiLFwic2dsXCIsXCJzZ21cIixcInNnblwiLFwic2dvXCIsXCJzZ3BcIixcInNnclwiLFwic2dzXCIsXCJzZ3RcIixcInNndVwiLFwic2d3XCIsXCJzZ3hcIixcInNneVwiLFwic2d6XCIsXCJzaGFcIixcInNoYlwiLFwic2hjXCIsXCJzaGRcIixcInNoZVwiLFwic2hnXCIsXCJzaGhcIixcInNoaVwiLFwic2hqXCIsXCJzaGtcIixcInNobFwiLFwic2htXCIsXCJzaG5cIixcInNob1wiLFwic2hwXCIsXCJzaHFcIixcInNoclwiLFwic2hzXCIsXCJzaHRcIixcInNodVwiLFwic2h2XCIsXCJzaHdcIixcInNoeFwiLFwic2h5XCIsXCJzaHpcIixcInNpYVwiLFwic2liXCIsXCJzaWRcIixcInNpZVwiLFwic2lmXCIsXCJzaWdcIixcInNpaFwiLFwic2lpXCIsXCJzaWpcIixcInNpa1wiLFwic2lsXCIsXCJzaW1cIixcInNpb1wiLFwic2lwXCIsXCJzaXFcIixcInNpclwiLFwic2lzXCIsXCJzaXRcIixcInNpdVwiLFwic2l2XCIsXCJzaXdcIixcInNpeFwiLFwic2l5XCIsXCJzaXpcIixcInNqYVwiLFwic2piXCIsXCJzamRcIixcInNqZVwiLFwic2pnXCIsXCJzamtcIixcInNqbFwiLFwic2ptXCIsXCJzam5cIixcInNqb1wiLFwic2pwXCIsXCJzanJcIixcInNqc1wiLFwic2p0XCIsXCJzanVcIixcInNqd1wiLFwic2thXCIsXCJza2JcIixcInNrY1wiLFwic2tkXCIsXCJza2VcIixcInNrZlwiLFwic2tnXCIsXCJza2hcIixcInNraVwiLFwic2tqXCIsXCJza2tcIixcInNrbVwiLFwic2tuXCIsXCJza29cIixcInNrcFwiLFwic2txXCIsXCJza3JcIixcInNrc1wiLFwic2t0XCIsXCJza3VcIixcInNrdlwiLFwic2t3XCIsXCJza3hcIixcInNreVwiLFwic2t6XCIsXCJzbGFcIixcInNsY1wiLFwic2xkXCIsXCJzbGVcIixcInNsZlwiLFwic2xnXCIsXCJzbGhcIixcInNsaVwiLFwic2xqXCIsXCJzbGxcIixcInNsbVwiLFwic2xuXCIsXCJzbHBcIixcInNscVwiLFwic2xyXCIsXCJzbHNcIixcInNsdFwiLFwic2x1XCIsXCJzbHdcIixcInNseFwiLFwic2x5XCIsXCJzbHpcIixcInNtYVwiLFwic21iXCIsXCJzbWNcIixcInNtZFwiLFwic21mXCIsXCJzbWdcIixcInNtaFwiLFwic21pXCIsXCJzbWpcIixcInNta1wiLFwic21sXCIsXCJzbW1cIixcInNtblwiLFwic21wXCIsXCJzbXFcIixcInNtclwiLFwic21zXCIsXCJzbXRcIixcInNtdVwiLFwic212XCIsXCJzbXdcIixcInNteFwiLFwic215XCIsXCJzbXpcIixcInNuYlwiLFwic25jXCIsXCJzbmVcIixcInNuZlwiLFwic25nXCIsXCJzbmhcIixcInNuaVwiLFwic25qXCIsXCJzbmtcIixcInNubFwiLFwic25tXCIsXCJzbm5cIixcInNub1wiLFwic25wXCIsXCJzbnFcIixcInNuclwiLFwic25zXCIsXCJzbnVcIixcInNudlwiLFwic253XCIsXCJzbnhcIixcInNueVwiLFwic256XCIsXCJzb2FcIixcInNvYlwiLFwic29jXCIsXCJzb2RcIixcInNvZVwiLFwic29nXCIsXCJzb2hcIixcInNvaVwiLFwic29qXCIsXCJzb2tcIixcInNvbFwiLFwic29uXCIsXCJzb29cIixcInNvcFwiLFwic29xXCIsXCJzb3JcIixcInNvc1wiLFwic291XCIsXCJzb3ZcIixcInNvd1wiLFwic294XCIsXCJzb3lcIixcInNvelwiLFwic3BiXCIsXCJzcGNcIixcInNwZFwiLFwic3BlXCIsXCJzcGdcIixcInNwaVwiLFwic3BrXCIsXCJzcGxcIixcInNwbVwiLFwic3BuXCIsXCJzcG9cIixcInNwcFwiLFwic3BxXCIsXCJzcHJcIixcInNwc1wiLFwic3B0XCIsXCJzcHVcIixcInNwdlwiLFwic3B4XCIsXCJzcHlcIixcInNxYVwiLFwic3FoXCIsXCJzcWpcIixcInNxa1wiLFwic3FtXCIsXCJzcW5cIixcInNxb1wiLFwic3FxXCIsXCJzcXJcIixcInNxc1wiLFwic3F0XCIsXCJzcXVcIixcInNxeFwiLFwic3JhXCIsXCJzcmJcIixcInNyY1wiLFwic3JlXCIsXCJzcmZcIixcInNyZ1wiLFwic3JoXCIsXCJzcmlcIixcInNya1wiLFwic3JsXCIsXCJzcm1cIixcInNyblwiLFwic3JvXCIsXCJzcnFcIixcInNyclwiLFwic3JzXCIsXCJzcnRcIixcInNydVwiLFwic3J2XCIsXCJzcndcIixcInNyeFwiLFwic3J5XCIsXCJzcnpcIixcInNzYVwiLFwic3NiXCIsXCJzc2NcIixcInNzZFwiLFwic3NlXCIsXCJzc2ZcIixcInNzZ1wiLFwic3NoXCIsXCJzc2lcIixcInNzalwiLFwic3NrXCIsXCJzc2xcIixcInNzbVwiLFwic3NuXCIsXCJzc29cIixcInNzcFwiLFwic3NxXCIsXCJzc3JcIixcInNzc1wiLFwic3N0XCIsXCJzc3VcIixcInNzdlwiLFwic3N4XCIsXCJzc3lcIixcInNzelwiLFwic3RhXCIsXCJzdGJcIixcInN0ZFwiLFwic3RlXCIsXCJzdGZcIixcInN0Z1wiLFwic3RoXCIsXCJzdGlcIixcInN0alwiLFwic3RrXCIsXCJzdGxcIixcInN0bVwiLFwic3RuXCIsXCJzdG9cIixcInN0cFwiLFwic3RxXCIsXCJzdHJcIixcInN0c1wiLFwic3R0XCIsXCJzdHVcIixcInN0dlwiLFwic3R3XCIsXCJzdHlcIixcInN1YVwiLFwic3ViXCIsXCJzdWNcIixcInN1ZVwiLFwic3VnXCIsXCJzdWlcIixcInN1alwiLFwic3VrXCIsXCJzdWxcIixcInN1bVwiLFwic3VvXCIsXCJzdXFcIixcInN1clwiLFwic3VzXCIsXCJzdXRcIixcInN1dlwiLFwic3V3XCIsXCJzdXhcIixcInN1eVwiLFwic3V6XCIsXCJzdmFcIixcInN2YlwiLFwic3ZjXCIsXCJzdmVcIixcInN2a1wiLFwic3ZtXCIsXCJzdnJcIixcInN2c1wiLFwic3Z4XCIsXCJzd2JcIixcInN3Y1wiLFwic3dmXCIsXCJzd2dcIixcInN3aFwiLFwic3dpXCIsXCJzd2pcIixcInN3a1wiLFwic3dsXCIsXCJzd21cIixcInN3blwiLFwic3dvXCIsXCJzd3BcIixcInN3cVwiLFwic3dyXCIsXCJzd3NcIixcInN3dFwiLFwic3d1XCIsXCJzd3ZcIixcInN3d1wiLFwic3d4XCIsXCJzd3lcIixcInN4YlwiLFwic3hjXCIsXCJzeGVcIixcInN4Z1wiLFwic3hrXCIsXCJzeGxcIixcInN4bVwiLFwic3huXCIsXCJzeG9cIixcInN4clwiLFwic3hzXCIsXCJzeHVcIixcInN4d1wiLFwic3lhXCIsXCJzeWJcIixcInN5Y1wiLFwic3lkXCIsXCJzeWlcIixcInN5a1wiLFwic3lsXCIsXCJzeW1cIixcInN5blwiLFwic3lvXCIsXCJzeXJcIixcInN5c1wiLFwic3l3XCIsXCJzeXhcIixcInN5eVwiLFwic3phXCIsXCJzemJcIixcInN6Y1wiLFwic3pkXCIsXCJzemVcIixcInN6Z1wiLFwic3psXCIsXCJzem5cIixcInN6cFwiLFwic3pzXCIsXCJzenZcIixcInN6d1wiLFwic3p5XCJdXG4sWyBcInRhXCIsXCJ0ZVwiLFwidGdcIixcInRoXCIsXCJ0aVwiLFwidGtcIixcInRsXCIsXCJ0blwiLFwidG9cIixcInRyXCIsXCJ0c1wiLFwidHRcIixcInR3XCIsXCJ0eVwiLFwidGFhXCIsXCJ0YWJcIixcInRhY1wiLFwidGFkXCIsXCJ0YWVcIixcInRhZlwiLFwidGFnXCIsXCJ0YWlcIixcInRhalwiLFwidGFrXCIsXCJ0YWxcIixcInRhblwiLFwidGFvXCIsXCJ0YXBcIixcInRhcVwiLFwidGFyXCIsXCJ0YXNcIixcInRhdVwiLFwidGF2XCIsXCJ0YXdcIixcInRheFwiLFwidGF5XCIsXCJ0YXpcIixcInRiYVwiLFwidGJiXCIsXCJ0YmNcIixcInRiZFwiLFwidGJlXCIsXCJ0YmZcIixcInRiZ1wiLFwidGJoXCIsXCJ0YmlcIixcInRialwiLFwidGJrXCIsXCJ0YmxcIixcInRibVwiLFwidGJuXCIsXCJ0Ym9cIixcInRicFwiLFwidGJxXCIsXCJ0YnJcIixcInRic1wiLFwidGJ0XCIsXCJ0YnVcIixcInRidlwiLFwidGJ3XCIsXCJ0YnhcIixcInRieVwiLFwidGJ6XCIsXCJ0Y2FcIixcInRjYlwiLFwidGNjXCIsXCJ0Y2RcIixcInRjZVwiLFwidGNmXCIsXCJ0Y2dcIixcInRjaFwiLFwidGNpXCIsXCJ0Y2tcIixcInRjbFwiLFwidGNtXCIsXCJ0Y25cIixcInRjb1wiLFwidGNwXCIsXCJ0Y3FcIixcInRjc1wiLFwidGN0XCIsXCJ0Y3VcIixcInRjd1wiLFwidGN4XCIsXCJ0Y3lcIixcInRjelwiLFwidGRhXCIsXCJ0ZGJcIixcInRkY1wiLFwidGRkXCIsXCJ0ZGVcIixcInRkZlwiLFwidGRnXCIsXCJ0ZGhcIixcInRkaVwiLFwidGRqXCIsXCJ0ZGtcIixcInRkbFwiLFwidGRtXCIsXCJ0ZG5cIixcInRkb1wiLFwidGRxXCIsXCJ0ZHJcIixcInRkc1wiLFwidGR0XCIsXCJ0ZHVcIixcInRkdlwiLFwidGR4XCIsXCJ0ZHlcIixcInRlYVwiLFwidGViXCIsXCJ0ZWNcIixcInRlZFwiLFwidGVlXCIsXCJ0ZWZcIixcInRlZ1wiLFwidGVoXCIsXCJ0ZWlcIixcInRla1wiLFwidGVtXCIsXCJ0ZW5cIixcInRlb1wiLFwidGVwXCIsXCJ0ZXFcIixcInRlclwiLFwidGVzXCIsXCJ0ZXRcIixcInRldVwiLFwidGV2XCIsXCJ0ZXdcIixcInRleFwiLFwidGV5XCIsXCJ0ZXpcIixcInRmaVwiLFwidGZuXCIsXCJ0Zm9cIixcInRmclwiLFwidGZ0XCIsXCJ0Z2FcIixcInRnYlwiLFwidGdjXCIsXCJ0Z2RcIixcInRnZVwiLFwidGdmXCIsXCJ0Z2dcIixcInRnaFwiLFwidGdpXCIsXCJ0Z2pcIixcInRnblwiLFwidGdvXCIsXCJ0Z3BcIixcInRncVwiLFwidGdyXCIsXCJ0Z3NcIixcInRndFwiLFwidGd1XCIsXCJ0Z3ZcIixcInRnd1wiLFwidGd4XCIsXCJ0Z3lcIixcInRnelwiLFwidGhjXCIsXCJ0aGRcIixcInRoZVwiLFwidGhmXCIsXCJ0aGhcIixcInRoaVwiLFwidGhrXCIsXCJ0aGxcIixcInRobVwiLFwidGhuXCIsXCJ0aHBcIixcInRocVwiLFwidGhyXCIsXCJ0aHNcIixcInRodFwiLFwidGh1XCIsXCJ0aHZcIixcInRod1wiLFwidGh4XCIsXCJ0aHlcIixcInRoelwiLFwidGlhXCIsXCJ0aWNcIixcInRpZFwiLFwidGllXCIsXCJ0aWZcIixcInRpZ1wiLFwidGloXCIsXCJ0aWlcIixcInRpalwiLFwidGlrXCIsXCJ0aWxcIixcInRpbVwiLFwidGluXCIsXCJ0aW9cIixcInRpcFwiLFwidGlxXCIsXCJ0aXNcIixcInRpdFwiLFwidGl1XCIsXCJ0aXZcIixcInRpd1wiLFwidGl4XCIsXCJ0aXlcIixcInRpelwiLFwidGphXCIsXCJ0amdcIixcInRqaVwiLFwidGpqXCIsXCJ0amxcIixcInRqbVwiLFwidGpuXCIsXCJ0am9cIixcInRqcFwiLFwidGpzXCIsXCJ0anVcIixcInRqd1wiLFwidGthXCIsXCJ0a2JcIixcInRrZFwiLFwidGtlXCIsXCJ0a2ZcIixcInRrZ1wiLFwidGtrXCIsXCJ0a2xcIixcInRrbVwiLFwidGtuXCIsXCJ0a3BcIixcInRrcVwiLFwidGtyXCIsXCJ0a3NcIixcInRrdFwiLFwidGt1XCIsXCJ0a3ZcIixcInRrd1wiLFwidGt4XCIsXCJ0a3pcIixcInRsYVwiLFwidGxiXCIsXCJ0bGNcIixcInRsZFwiLFwidGxmXCIsXCJ0bGdcIixcInRsaFwiLFwidGxpXCIsXCJ0bGpcIixcInRsa1wiLFwidGxsXCIsXCJ0bG1cIixcInRsblwiLFwidGxvXCIsXCJ0bHBcIixcInRscVwiLFwidGxyXCIsXCJ0bHNcIixcInRsdFwiLFwidGx1XCIsXCJ0bHZcIixcInRsd1wiLFwidGx4XCIsXCJ0bHlcIixcInRtYVwiLFwidG1iXCIsXCJ0bWNcIixcInRtZFwiLFwidG1lXCIsXCJ0bWZcIixcInRtZ1wiLFwidG1oXCIsXCJ0bWlcIixcInRtalwiLFwidG1rXCIsXCJ0bWxcIixcInRtbVwiLFwidG1uXCIsXCJ0bW9cIixcInRtcFwiLFwidG1xXCIsXCJ0bXJcIixcInRtc1wiLFwidG10XCIsXCJ0bXVcIixcInRtdlwiLFwidG13XCIsXCJ0bXlcIixcInRtelwiLFwidG5hXCIsXCJ0bmJcIixcInRuY1wiLFwidG5kXCIsXCJ0bmVcIixcInRuZlwiLFwidG5nXCIsXCJ0bmhcIixcInRuaVwiLFwidG5rXCIsXCJ0bmxcIixcInRubVwiLFwidG5uXCIsXCJ0bm9cIixcInRucFwiLFwidG5xXCIsXCJ0bnJcIixcInRuc1wiLFwidG50XCIsXCJ0bnVcIixcInRudlwiLFwidG53XCIsXCJ0bnhcIixcInRueVwiLFwidG56XCIsXCJ0b2JcIixcInRvY1wiLFwidG9kXCIsXCJ0b2VcIixcInRvZlwiLFwidG9nXCIsXCJ0b2hcIixcInRvaVwiLFwidG9qXCIsXCJ0b2xcIixcInRvbVwiLFwidG9vXCIsXCJ0b3BcIixcInRvcVwiLFwidG9yXCIsXCJ0b3NcIixcInRvdVwiLFwidG92XCIsXCJ0b3dcIixcInRveFwiLFwidG95XCIsXCJ0b3pcIixcInRwYVwiLFwidHBjXCIsXCJ0cGVcIixcInRwZlwiLFwidHBnXCIsXCJ0cGlcIixcInRwalwiLFwidHBrXCIsXCJ0cGxcIixcInRwbVwiLFwidHBuXCIsXCJ0cG9cIixcInRwcFwiLFwidHBxXCIsXCJ0cHJcIixcInRwdFwiLFwidHB1XCIsXCJ0cHZcIixcInRwd1wiLFwidHB4XCIsXCJ0cHlcIixcInRwelwiLFwidHFiXCIsXCJ0cWxcIixcInRxbVwiLFwidHFuXCIsXCJ0cW9cIixcInRxcFwiLFwidHFxXCIsXCJ0cXJcIixcInRxdFwiLFwidHF1XCIsXCJ0cXdcIixcInRyYVwiLFwidHJiXCIsXCJ0cmNcIixcInRyZFwiLFwidHJlXCIsXCJ0cmZcIixcInRyZ1wiLFwidHJoXCIsXCJ0cmlcIixcInRyalwiLFwidHJrXCIsXCJ0cmxcIixcInRybVwiLFwidHJuXCIsXCJ0cm9cIixcInRycFwiLFwidHJxXCIsXCJ0cnJcIixcInRyc1wiLFwidHJ0XCIsXCJ0cnVcIixcInRydlwiLFwidHJ3XCIsXCJ0cnhcIixcInRyeVwiLFwidHJ6XCIsXCJ0c2FcIixcInRzYlwiLFwidHNjXCIsXCJ0c2RcIixcInRzZVwiLFwidHNmXCIsXCJ0c2dcIixcInRzaFwiLFwidHNpXCIsXCJ0c2pcIixcInRza1wiLFwidHNsXCIsXCJ0c21cIixcInRzcFwiLFwidHNxXCIsXCJ0c3JcIixcInRzc1wiLFwidHN0XCIsXCJ0c3VcIixcInRzdlwiLFwidHN3XCIsXCJ0c3hcIixcInRzeVwiLFwidHN6XCIsXCJ0dGFcIixcInR0YlwiLFwidHRjXCIsXCJ0dGRcIixcInR0ZVwiLFwidHRmXCIsXCJ0dGdcIixcInR0aFwiLFwidHRpXCIsXCJ0dGpcIixcInR0a1wiLFwidHRsXCIsXCJ0dG1cIixcInR0blwiLFwidHRvXCIsXCJ0dHBcIixcInR0cVwiLFwidHRyXCIsXCJ0dHNcIixcInR0dFwiLFwidHR1XCIsXCJ0dHZcIixcInR0d1wiLFwidHR5XCIsXCJ0dHpcIixcInR1YVwiLFwidHViXCIsXCJ0dWNcIixcInR1ZFwiLFwidHVlXCIsXCJ0dWZcIixcInR1Z1wiLFwidHVoXCIsXCJ0dWlcIixcInR1alwiLFwidHVsXCIsXCJ0dW1cIixcInR1blwiLFwidHVvXCIsXCJ0dXBcIixcInR1cVwiLFwidHVzXCIsXCJ0dXRcIixcInR1dVwiLFwidHV2XCIsXCJ0dXdcIixcInR1eFwiLFwidHV5XCIsXCJ0dXpcIixcInR2YVwiLFwidHZkXCIsXCJ0dmVcIixcInR2a1wiLFwidHZsXCIsXCJ0dm1cIixcInR2blwiLFwidHZvXCIsXCJ0dnNcIixcInR2dFwiLFwidHZ1XCIsXCJ0dndcIixcInR2eFwiLFwidHZ5XCIsXCJ0d2FcIixcInR3YlwiLFwidHdjXCIsXCJ0d2RcIixcInR3ZVwiLFwidHdmXCIsXCJ0d2dcIixcInR3aFwiLFwidHdsXCIsXCJ0d21cIixcInR3blwiLFwidHdvXCIsXCJ0d3BcIixcInR3cVwiLFwidHdyXCIsXCJ0d3RcIixcInR3dVwiLFwidHd3XCIsXCJ0d3hcIixcInR3eVwiLFwidHhhXCIsXCJ0eGJcIixcInR4Y1wiLFwidHhlXCIsXCJ0eGdcIixcInR4aFwiLFwidHhpXCIsXCJ0eGpcIixcInR4bVwiLFwidHhuXCIsXCJ0eG9cIixcInR4cVwiLFwidHhyXCIsXCJ0eHNcIixcInR4dFwiLFwidHh1XCIsXCJ0eHhcIixcInR4eVwiLFwidHlhXCIsXCJ0eWVcIixcInR5aFwiLFwidHlpXCIsXCJ0eWpcIixcInR5bFwiLFwidHluXCIsXCJ0eXBcIixcInR5clwiLFwidHlzXCIsXCJ0eXRcIixcInR5dVwiLFwidHl2XCIsXCJ0eXhcIixcInR5eVwiLFwidHl6XCIsXCJ0emFcIixcInR6aFwiLFwidHpqXCIsXCJ0emxcIixcInR6bVwiLFwidHpuXCIsXCJ0em9cIixcInR6eFwiXVxuLFsgXCJ1Z1wiLFwidWtcIixcInVyXCIsXCJ1elwiLFwidWFtXCIsXCJ1YW5cIixcInVhclwiLFwidWJhXCIsXCJ1YmlcIixcInVibFwiLFwidWJyXCIsXCJ1YnVcIixcInVieVwiLFwidWRhXCIsXCJ1ZGVcIixcInVkZ1wiLFwidWRpXCIsXCJ1ZGpcIixcInVkbFwiLFwidWRtXCIsXCJ1ZHVcIixcInVlc1wiLFwidWZpXCIsXCJ1Z2FcIixcInVnYlwiLFwidWdlXCIsXCJ1Z25cIixcInVnb1wiLFwidWd5XCIsXCJ1aGFcIixcInVoblwiLFwidWlzXCIsXCJ1aXZcIixcInVqaVwiLFwidWthXCIsXCJ1a2dcIixcInVraFwiLFwidWtpXCIsXCJ1a2tcIixcInVrbFwiLFwidWtwXCIsXCJ1a3FcIixcInVrc1wiLFwidWt1XCIsXCJ1a3ZcIixcInVrd1wiLFwidWt5XCIsXCJ1bGFcIixcInVsYlwiLFwidWxjXCIsXCJ1bGVcIixcInVsZlwiLFwidWxpXCIsXCJ1bGtcIixcInVsbFwiLFwidWxtXCIsXCJ1bG5cIixcInVsdVwiLFwidWx3XCIsXCJ1bWFcIixcInVtYlwiLFwidW1jXCIsXCJ1bWRcIixcInVtZ1wiLFwidW1pXCIsXCJ1bW1cIixcInVtblwiLFwidW1vXCIsXCJ1bXBcIixcInVtclwiLFwidW1zXCIsXCJ1bXVcIixcInVuYVwiLFwidW5kXCIsXCJ1bmVcIixcInVuZ1wiLFwidW5pXCIsXCJ1bmtcIixcInVubVwiLFwidW5uXCIsXCJ1bnBcIixcInVuclwiLFwidW51XCIsXCJ1bnhcIixcInVuelwiLFwidW9rXCIsXCJ1cGlcIixcInVwdlwiLFwidXJhXCIsXCJ1cmJcIixcInVyY1wiLFwidXJlXCIsXCJ1cmZcIixcInVyZ1wiLFwidXJoXCIsXCJ1cmlcIixcInVyalwiLFwidXJrXCIsXCJ1cmxcIixcInVybVwiLFwidXJuXCIsXCJ1cm9cIixcInVycFwiLFwidXJyXCIsXCJ1cnRcIixcInVydVwiLFwidXJ2XCIsXCJ1cndcIixcInVyeFwiLFwidXJ5XCIsXCJ1cnpcIixcInVzYVwiLFwidXNoXCIsXCJ1c2lcIixcInVza1wiLFwidXNwXCIsXCJ1c3NcIixcInVzdVwiLFwidXRhXCIsXCJ1dGVcIixcInV0aFwiLFwidXRwXCIsXCJ1dHJcIixcInV0dVwiLFwidXVtXCIsXCJ1dW5cIixcInV1clwiLFwidXV1XCIsXCJ1dmVcIixcInV2aFwiLFwidXZsXCIsXCJ1d2FcIixcInV5YVwiLFwidXpuXCIsXCJ1enNcIl1cbixbIFwidmVcIixcInZpXCIsXCJ2b1wiLFwidmFhXCIsXCJ2YWVcIixcInZhZlwiLFwidmFnXCIsXCJ2YWhcIixcInZhaVwiLFwidmFqXCIsXCJ2YWxcIixcInZhbVwiLFwidmFuXCIsXCJ2YW9cIixcInZhcFwiLFwidmFyXCIsXCJ2YXNcIixcInZhdVwiLFwidmF2XCIsXCJ2YXlcIixcInZiYlwiLFwidmJrXCIsXCJ2ZWNcIixcInZlZFwiLFwidmVsXCIsXCJ2ZW1cIixcInZlb1wiLFwidmVwXCIsXCJ2ZXJcIixcInZnclwiLFwidmd0XCIsXCJ2aWNcIixcInZpZFwiLFwidmlmXCIsXCJ2aWdcIixcInZpbFwiLFwidmluXCIsXCJ2aXNcIixcInZpdFwiLFwidml2XCIsXCJ2a2FcIixcInZraVwiLFwidmtqXCIsXCJ2a2tcIixcInZrbFwiLFwidmttXCIsXCJ2a25cIixcInZrb1wiLFwidmtwXCIsXCJ2a3RcIixcInZrdVwiLFwidmt6XCIsXCJ2bHBcIixcInZsc1wiLFwidm1hXCIsXCJ2bWJcIixcInZtY1wiLFwidm1kXCIsXCJ2bWVcIixcInZtZlwiLFwidm1nXCIsXCJ2bWhcIixcInZtaVwiLFwidm1qXCIsXCJ2bWtcIixcInZtbFwiLFwidm1tXCIsXCJ2bXBcIixcInZtcVwiLFwidm1yXCIsXCJ2bXNcIixcInZtdVwiLFwidm12XCIsXCJ2bXdcIixcInZteFwiLFwidm15XCIsXCJ2bXpcIixcInZua1wiLFwidm5tXCIsXCJ2bnBcIixcInZvclwiLFwidm90XCIsXCJ2cmFcIixcInZyb1wiLFwidnJzXCIsXCJ2cnRcIixcInZzaVwiLFwidnNsXCIsXCJ2c3ZcIixcInZ0b1wiLFwidnVtXCIsXCJ2dW5cIixcInZ1dFwiLFwidndhXCJdXG4sWyBcIndhXCIsXCJ3b1wiLFwid2FhXCIsXCJ3YWJcIixcIndhY1wiLFwid2FkXCIsXCJ3YWVcIixcIndhZlwiLFwid2FnXCIsXCJ3YWhcIixcIndhaVwiLFwid2FqXCIsXCJ3YWtcIixcIndhbFwiLFwid2FtXCIsXCJ3YW5cIixcIndhb1wiLFwid2FwXCIsXCJ3YXFcIixcIndhclwiLFwid2FzXCIsXCJ3YXRcIixcIndhdVwiLFwid2F2XCIsXCJ3YXdcIixcIndheFwiLFwid2F5XCIsXCJ3YXpcIixcIndiYVwiLFwid2JiXCIsXCJ3YmVcIixcIndiZlwiLFwid2JoXCIsXCJ3YmlcIixcIndialwiLFwid2JrXCIsXCJ3YmxcIixcIndibVwiLFwid2JwXCIsXCJ3YnFcIixcIndiclwiLFwid2JzXCIsXCJ3YnRcIixcIndidlwiLFwid2J3XCIsXCJ3Y2FcIixcIndjaVwiLFwid2RkXCIsXCJ3ZGdcIixcIndkalwiLFwid2RrXCIsXCJ3ZHVcIixcIndkeVwiLFwid2VhXCIsXCJ3ZWNcIixcIndlZFwiLFwid2VnXCIsXCJ3ZWhcIixcIndlaVwiLFwid2VtXCIsXCJ3ZW5cIixcIndlb1wiLFwid2VwXCIsXCJ3ZXJcIixcIndlc1wiLFwid2V0XCIsXCJ3ZXVcIixcIndld1wiLFwid2ZnXCIsXCJ3Z2FcIixcIndnYlwiLFwid2dnXCIsXCJ3Z2lcIixcIndnb1wiLFwid2d1XCIsXCJ3Z3dcIixcIndneVwiLFwid2hhXCIsXCJ3aGdcIixcIndoa1wiLFwid2h1XCIsXCJ3aWJcIixcIndpY1wiLFwid2llXCIsXCJ3aWZcIixcIndpZ1wiLFwid2loXCIsXCJ3aWlcIixcIndpalwiLFwid2lrXCIsXCJ3aWxcIixcIndpbVwiLFwid2luXCIsXCJ3aXJcIixcIndpdFwiLFwid2l1XCIsXCJ3aXZcIixcIndpd1wiLFwid2l5XCIsXCJ3amFcIixcIndqaVwiLFwid2thXCIsXCJ3a2JcIixcIndrZFwiLFwid2tsXCIsXCJ3a3JcIixcIndrdVwiLFwid2t3XCIsXCJ3a3lcIixcIndsYVwiLFwid2xjXCIsXCJ3bGVcIixcIndsZ1wiLFwid2xoXCIsXCJ3bGlcIixcIndsa1wiLFwid2xsXCIsXCJ3bG1cIixcIndsb1wiLFwid2xyXCIsXCJ3bHNcIixcIndsdVwiLFwid2x2XCIsXCJ3bHdcIixcIndseFwiLFwid2x5XCIsXCJ3bWFcIixcIndtYlwiLFwid21jXCIsXCJ3bWRcIixcIndtZVwiLFwid21nXCIsXCJ3bWhcIixcIndtaVwiLFwid21tXCIsXCJ3bW5cIixcIndtb1wiLFwid21zXCIsXCJ3bXRcIixcIndtd1wiLFwid214XCIsXCJ3bmJcIixcInduY1wiLFwid25kXCIsXCJ3bmVcIixcInduZ1wiLFwid25pXCIsXCJ3bmtcIixcIndubVwiLFwid25uXCIsXCJ3bm9cIixcInducFwiLFwid251XCIsXCJ3bndcIixcIndueVwiLFwid29hXCIsXCJ3b2JcIixcIndvY1wiLFwid29kXCIsXCJ3b2VcIixcIndvZlwiLFwid29nXCIsXCJ3b2lcIixcIndva1wiLFwid29tXCIsXCJ3b25cIixcIndvb1wiLFwid29yXCIsXCJ3b3NcIixcIndvd1wiLFwid295XCIsXCJ3cGNcIixcIndyYVwiLFwid3JiXCIsXCJ3cmRcIixcIndyZ1wiLFwid3JoXCIsXCJ3cmlcIixcIndya1wiLFwid3JsXCIsXCJ3cm1cIixcIndyblwiLFwid3JvXCIsXCJ3cnBcIixcIndyclwiLFwid3JzXCIsXCJ3cnVcIixcIndydlwiLFwid3J3XCIsXCJ3cnhcIixcIndyeVwiLFwid3J6XCIsXCJ3c2FcIixcIndzZ1wiLFwid3NpXCIsXCJ3c2tcIixcIndzclwiLFwid3NzXCIsXCJ3c3VcIixcIndzdlwiLFwid3RmXCIsXCJ3dGhcIixcInd0aVwiLFwid3RrXCIsXCJ3dG1cIixcInd0d1wiLFwid3VhXCIsXCJ3dWJcIixcInd1ZFwiLFwid3VoXCIsXCJ3dWxcIixcInd1bVwiLFwid3VuXCIsXCJ3dXJcIixcInd1dFwiLFwid3V1XCIsXCJ3dXZcIixcInd1eFwiLFwid3V5XCIsXCJ3d2FcIixcInd3YlwiLFwid3dvXCIsXCJ3d3JcIixcInd3d1wiLFwid3hhXCIsXCJ3eHdcIixcInd5YVwiLFwid3liXCIsXCJ3eWlcIixcInd5bVwiLFwid3lyXCIsXCJ3eXlcIl1cbixbIFwieGhcIixcInhhYVwiLFwieGFiXCIsXCJ4YWNcIixcInhhZFwiLFwieGFlXCIsXCJ4YWdcIixcInhhaVwiLFwieGFqXCIsXCJ4YWtcIixcInhhbFwiLFwieGFtXCIsXCJ4YW5cIixcInhhb1wiLFwieGFwXCIsXCJ4YXFcIixcInhhclwiLFwieGFzXCIsXCJ4YXRcIixcInhhdVwiLFwieGF2XCIsXCJ4YXdcIixcInhheVwiLFwieGJhXCIsXCJ4YmJcIixcInhiY1wiLFwieGJkXCIsXCJ4YmVcIixcInhiZ1wiLFwieGJpXCIsXCJ4YmpcIixcInhibVwiLFwieGJuXCIsXCJ4Ym9cIixcInhicFwiLFwieGJyXCIsXCJ4YndcIixcInhieFwiLFwieGJ5XCIsXCJ4Y2JcIixcInhjY1wiLFwieGNlXCIsXCJ4Y2dcIixcInhjaFwiLFwieGNsXCIsXCJ4Y21cIixcInhjblwiLFwieGNvXCIsXCJ4Y3JcIixcInhjdFwiLFwieGN1XCIsXCJ4Y3ZcIixcInhjd1wiLFwieGN5XCIsXCJ4ZGFcIixcInhkY1wiLFwieGRrXCIsXCJ4ZG1cIixcInhkb1wiLFwieGR5XCIsXCJ4ZWJcIixcInhlZFwiLFwieGVnXCIsXCJ4ZWxcIixcInhlbVwiLFwieGVwXCIsXCJ4ZXJcIixcInhlc1wiLFwieGV0XCIsXCJ4ZXVcIixcInhmYVwiLFwieGdhXCIsXCJ4Z2JcIixcInhnZFwiLFwieGdmXCIsXCJ4Z2dcIixcInhnaVwiLFwieGdsXCIsXCJ4Z21cIixcInhnblwiLFwieGdyXCIsXCJ4Z3VcIixcInhnd1wiLFwieGhhXCIsXCJ4aGNcIixcInhoZFwiLFwieGhlXCIsXCJ4aHJcIixcInhodFwiLFwieGh1XCIsXCJ4aHZcIixcInhpYVwiLFwieGliXCIsXCJ4aWlcIixcInhpbFwiLFwieGluXCIsXCJ4aXBcIixcInhpclwiLFwieGlzXCIsXCJ4aXZcIixcInhpeVwiLFwieGpiXCIsXCJ4anRcIixcInhrYVwiLFwieGtiXCIsXCJ4a2NcIixcInhrZFwiLFwieGtlXCIsXCJ4a2ZcIixcInhrZ1wiLFwieGtoXCIsXCJ4a2lcIixcInhralwiLFwieGtrXCIsXCJ4a2xcIixcInhrblwiLFwieGtvXCIsXCJ4a3BcIixcInhrcVwiLFwieGtyXCIsXCJ4a3NcIixcInhrdFwiLFwieGt1XCIsXCJ4a3ZcIixcInhrd1wiLFwieGt4XCIsXCJ4a3lcIixcInhrelwiLFwieGxhXCIsXCJ4bGJcIixcInhsY1wiLFwieGxkXCIsXCJ4bGVcIixcInhsZ1wiLFwieGxpXCIsXCJ4bG5cIixcInhsb1wiLFwieGxwXCIsXCJ4bHNcIixcInhsdVwiLFwieGx5XCIsXCJ4bWFcIixcInhtYlwiLFwieG1jXCIsXCJ4bWRcIixcInhtZVwiLFwieG1mXCIsXCJ4bWdcIixcInhtaFwiLFwieG1qXCIsXCJ4bWtcIixcInhtbFwiLFwieG1tXCIsXCJ4bW5cIixcInhtb1wiLFwieG1wXCIsXCJ4bXFcIixcInhtclwiLFwieG1zXCIsXCJ4bXRcIixcInhtdVwiLFwieG12XCIsXCJ4bXdcIixcInhteFwiLFwieG15XCIsXCJ4bXpcIixcInhuYVwiLFwieG5iXCIsXCJ4bmRcIixcInhuZ1wiLFwieG5oXCIsXCJ4bmlcIixcInhualwiLFwieG5rXCIsXCJ4bm1cIixcInhublwiLFwieG5vXCIsXCJ4bnFcIixcInhuclwiLFwieG5zXCIsXCJ4bnRcIixcInhudVwiLFwieG55XCIsXCJ4bnpcIixcInhvY1wiLFwieG9kXCIsXCJ4b2dcIixcInhvaVwiLFwieG9rXCIsXCJ4b21cIixcInhvblwiLFwieG9vXCIsXCJ4b3BcIixcInhvclwiLFwieG93XCIsXCJ4cGFcIixcInhwYlwiLFwieHBjXCIsXCJ4cGRcIixcInhwZVwiLFwieHBmXCIsXCJ4cGdcIixcInhwaFwiLFwieHBpXCIsXCJ4cGpcIixcInhwa1wiLFwieHBsXCIsXCJ4cG1cIixcInhwblwiLFwieHBvXCIsXCJ4cHBcIixcInhwcVwiLFwieHByXCIsXCJ4cHNcIixcInhwdFwiLFwieHB1XCIsXCJ4cHZcIixcInhwd1wiLFwieHB4XCIsXCJ4cHlcIixcInhwelwiLFwieHFhXCIsXCJ4cXRcIixcInhyYVwiLFwieHJiXCIsXCJ4cmRcIixcInhyZVwiLFwieHJnXCIsXCJ4cmlcIixcInhybVwiLFwieHJuXCIsXCJ4cnFcIixcInhyclwiLFwieHJ0XCIsXCJ4cnVcIixcInhyd1wiLFwieHNhXCIsXCJ4c2JcIixcInhzY1wiLFwieHNkXCIsXCJ4c2VcIixcInhzaFwiLFwieHNpXCIsXCJ4c2pcIixcInhzbFwiLFwieHNtXCIsXCJ4c25cIixcInhzb1wiLFwieHNwXCIsXCJ4c3FcIixcInhzclwiLFwieHNzXCIsXCJ4c3VcIixcInhzdlwiLFwieHN5XCIsXCJ4dGFcIixcInh0YlwiLFwieHRjXCIsXCJ4dGRcIixcInh0ZVwiLFwieHRnXCIsXCJ4dGhcIixcInh0aVwiLFwieHRqXCIsXCJ4dGxcIixcInh0bVwiLFwieHRuXCIsXCJ4dG9cIixcInh0cFwiLFwieHRxXCIsXCJ4dHJcIixcInh0c1wiLFwieHR0XCIsXCJ4dHVcIixcInh0dlwiLFwieHR3XCIsXCJ4dHlcIixcInh0elwiLFwieHVhXCIsXCJ4dWJcIixcInh1ZFwiLFwieHVnXCIsXCJ4dWpcIixcInh1bFwiLFwieHVtXCIsXCJ4dW5cIixcInh1b1wiLFwieHVwXCIsXCJ4dXJcIixcInh1dFwiLFwieHV1XCIsXCJ4dmVcIixcInh2aVwiLFwieHZuXCIsXCJ4dm9cIixcInh2c1wiLFwieHdhXCIsXCJ4d2NcIixcInh3ZFwiLFwieHdlXCIsXCJ4d2dcIixcInh3alwiLFwieHdrXCIsXCJ4d2xcIixcInh3b1wiLFwieHdyXCIsXCJ4d3RcIixcInh3d1wiLFwieHhiXCIsXCJ4eGtcIixcInh4bVwiLFwieHhyXCIsXCJ4eHRcIixcInh5YVwiLFwieHliXCIsXCJ4eWpcIixcInh5a1wiLFwieHlsXCIsXCJ4eXRcIixcInh5eVwiLFwieHpoXCIsXCJ4em1cIixcInh6cFwiXVxuLFsgXCJ5aVwiLFwieW9cIixcInlhYVwiLFwieWFiXCIsXCJ5YWNcIixcInlhZFwiLFwieWFlXCIsXCJ5YWZcIixcInlhZ1wiLFwieWFoXCIsXCJ5YWlcIixcInlhalwiLFwieWFrXCIsXCJ5YWxcIixcInlhbVwiLFwieWFuXCIsXCJ5YW9cIixcInlhcFwiLFwieWFxXCIsXCJ5YXJcIixcInlhc1wiLFwieWF0XCIsXCJ5YXVcIixcInlhdlwiLFwieWF3XCIsXCJ5YXhcIixcInlheVwiLFwieWF6XCIsXCJ5YmFcIixcInliYlwiLFwieWJkXCIsXCJ5YmVcIixcInliaFwiLFwieWJpXCIsXCJ5YmpcIixcInlia1wiLFwieWJsXCIsXCJ5Ym1cIixcInliblwiLFwieWJvXCIsXCJ5YnhcIixcInlieVwiLFwieWNoXCIsXCJ5Y2xcIixcInljblwiLFwieWNwXCIsXCJ5ZGFcIixcInlkZFwiLFwieWRlXCIsXCJ5ZGdcIixcInlka1wiLFwieWRzXCIsXCJ5ZWFcIixcInllY1wiLFwieWVlXCIsXCJ5ZWlcIixcInllalwiLFwieWVsXCIsXCJ5ZW5cIixcInllclwiLFwieWVzXCIsXCJ5ZXRcIixcInlldVwiLFwieWV2XCIsXCJ5ZXlcIixcInlnYVwiLFwieWdpXCIsXCJ5Z2xcIixcInlnbVwiLFwieWdwXCIsXCJ5Z3JcIixcInlnc1wiLFwieWd1XCIsXCJ5Z3dcIixcInloYVwiLFwieWhkXCIsXCJ5aGxcIixcInloc1wiLFwieWlhXCIsXCJ5aWZcIixcInlpZ1wiLFwieWloXCIsXCJ5aWlcIixcInlpalwiLFwieWlrXCIsXCJ5aWxcIixcInlpbVwiLFwieWluXCIsXCJ5aXBcIixcInlpcVwiLFwieWlyXCIsXCJ5aXNcIixcInlpdFwiLFwieWl1XCIsXCJ5aXZcIixcInlpeFwiLFwieWl5XCIsXCJ5aXpcIixcInlrYVwiLFwieWtnXCIsXCJ5a2lcIixcInlra1wiLFwieWtsXCIsXCJ5a21cIixcInlrblwiLFwieWtvXCIsXCJ5a3JcIixcInlrdFwiLFwieWt1XCIsXCJ5a3lcIixcInlsYVwiLFwieWxiXCIsXCJ5bGVcIixcInlsZ1wiLFwieWxpXCIsXCJ5bGxcIixcInlsbVwiLFwieWxuXCIsXCJ5bG9cIixcInlsclwiLFwieWx1XCIsXCJ5bHlcIixcInltYVwiLFwieW1iXCIsXCJ5bWNcIixcInltZFwiLFwieW1lXCIsXCJ5bWdcIixcInltaFwiLFwieW1pXCIsXCJ5bWtcIixcInltbFwiLFwieW1tXCIsXCJ5bW5cIixcInltb1wiLFwieW1wXCIsXCJ5bXFcIixcInltclwiLFwieW1zXCIsXCJ5bXRcIixcInlteFwiLFwieW16XCIsXCJ5bmFcIixcInluZFwiLFwieW5lXCIsXCJ5bmdcIixcInluaFwiLFwieW5rXCIsXCJ5bmxcIixcInlublwiLFwieW5vXCIsXCJ5bnFcIixcInluc1wiLFwieW51XCIsXCJ5b2JcIixcInlvZ1wiLFwieW9pXCIsXCJ5b2tcIixcInlvbFwiLFwieW9tXCIsXCJ5b25cIixcInlvc1wiLFwieW90XCIsXCJ5b3hcIixcInlveVwiLFwieXBhXCIsXCJ5cGJcIixcInlwZ1wiLFwieXBoXCIsXCJ5cGtcIixcInlwbVwiLFwieXBuXCIsXCJ5cG9cIixcInlwcFwiLFwieXB6XCIsXCJ5cmFcIixcInlyYlwiLFwieXJlXCIsXCJ5cmlcIixcInlya1wiLFwieXJsXCIsXCJ5cm1cIixcInlyblwiLFwieXJvXCIsXCJ5cnNcIixcInlyd1wiLFwieXJ5XCIsXCJ5c2NcIixcInlzZFwiLFwieXNnXCIsXCJ5c2xcIixcInlzbVwiLFwieXNuXCIsXCJ5c29cIixcInlzcFwiLFwieXNyXCIsXCJ5c3NcIixcInlzeVwiLFwieXRhXCIsXCJ5dGxcIixcInl0cFwiLFwieXR3XCIsXCJ5dHlcIixcInl1YVwiLFwieXViXCIsXCJ5dWNcIixcInl1ZFwiLFwieXVlXCIsXCJ5dWZcIixcInl1Z1wiLFwieXVpXCIsXCJ5dWpcIixcInl1a1wiLFwieXVsXCIsXCJ5dW1cIixcInl1blwiLFwieXVwXCIsXCJ5dXFcIixcInl1clwiLFwieXV0XCIsXCJ5dXVcIixcInl1d1wiLFwieXV4XCIsXCJ5dXlcIixcInl1elwiLFwieXZhXCIsXCJ5dnRcIixcInl3YVwiLFwieXdnXCIsXCJ5d2xcIixcInl3blwiLFwieXdxXCIsXCJ5d3JcIixcInl3dFwiLFwieXd1XCIsXCJ5d3dcIixcInl4YVwiLFwieXhnXCIsXCJ5eGxcIixcInl4bVwiLFwieXh1XCIsXCJ5eHlcIixcInl5clwiLFwieXl1XCIsXCJ5eXpcIixcInl6Z1wiLFwieXprXCJdXG4sWyBcInphXCIsXCJ6aFwiLFwienVcIixcInphYVwiLFwiemFiXCIsXCJ6YWNcIixcInphZFwiLFwiemFlXCIsXCJ6YWZcIixcInphZ1wiLFwiemFoXCIsXCJ6YWlcIixcInphalwiLFwiemFrXCIsXCJ6YWxcIixcInphbVwiLFwiemFvXCIsXCJ6YXBcIixcInphcVwiLFwiemFyXCIsXCJ6YXNcIixcInphdFwiLFwiemF1XCIsXCJ6YXZcIixcInphd1wiLFwiemF4XCIsXCJ6YXlcIixcInphelwiLFwiemJhXCIsXCJ6YmNcIixcInpiZVwiLFwiemJsXCIsXCJ6YnRcIixcInpidVwiLFwiemJ3XCIsXCJ6Y2FcIixcInpjaFwiLFwiemRqXCIsXCJ6ZWFcIixcInplZ1wiLFwiemVoXCIsXCJ6ZW5cIixcInpnYVwiLFwiemdiXCIsXCJ6Z2hcIixcInpnbVwiLFwiemduXCIsXCJ6Z3JcIixcInpoYlwiLFwiemhkXCIsXCJ6aGlcIixcInpoblwiLFwiemh3XCIsXCJ6aHhcIixcInppYVwiLFwiemliXCIsXCJ6aWtcIixcInppbFwiLFwiemltXCIsXCJ6aW5cIixcInppclwiLFwieml3XCIsXCJ6aXpcIixcInprYVwiLFwiemtiXCIsXCJ6a2RcIixcInprZ1wiLFwiemtoXCIsXCJ6a2tcIixcInprblwiLFwiemtvXCIsXCJ6a3BcIixcInprclwiLFwiemt0XCIsXCJ6a3VcIixcInprdlwiLFwiemt6XCIsXCJ6bGFcIixcInpsZVwiLFwiemxqXCIsXCJ6bG1cIixcInpsblwiLFwiemxxXCIsXCJ6bHNcIixcInpsd1wiLFwiem1hXCIsXCJ6bWJcIixcInptY1wiLFwiem1kXCIsXCJ6bWVcIixcInptZlwiLFwiem1nXCIsXCJ6bWhcIixcInptaVwiLFwiem1qXCIsXCJ6bWtcIixcInptbFwiLFwiem1tXCIsXCJ6bW5cIixcInptb1wiLFwiem1wXCIsXCJ6bXFcIixcInptclwiLFwiem1zXCIsXCJ6bXRcIixcInptdVwiLFwiem12XCIsXCJ6bXdcIixcInpteFwiLFwiem15XCIsXCJ6bXpcIixcInpuYVwiLFwiem5kXCIsXCJ6bmVcIixcInpuZ1wiLFwiem5rXCIsXCJ6bnNcIixcInpvY1wiLFwiem9oXCIsXCJ6b21cIixcInpvb1wiLFwiem9xXCIsXCJ6b3JcIixcInpvc1wiLFwienBhXCIsXCJ6cGJcIixcInpwY1wiLFwienBkXCIsXCJ6cGVcIixcInpwZlwiLFwienBnXCIsXCJ6cGhcIixcInpwaVwiLFwienBqXCIsXCJ6cGtcIixcInpwbFwiLFwienBtXCIsXCJ6cG5cIixcInpwb1wiLFwienBwXCIsXCJ6cHFcIixcInpwclwiLFwienBzXCIsXCJ6cHRcIixcInpwdVwiLFwienB2XCIsXCJ6cHdcIixcInpweFwiLFwienB5XCIsXCJ6cHpcIixcInpxZVwiLFwienJhXCIsXCJ6cmdcIixcInpyblwiLFwienJvXCIsXCJ6cnBcIixcInpyc1wiLFwienNhXCIsXCJ6c2tcIixcInpzbFwiLFwienNtXCIsXCJ6c3JcIixcInpzdVwiLFwienRlXCIsXCJ6dGdcIixcInp0bFwiLFwienRtXCIsXCJ6dG5cIixcInp0cFwiLFwienRxXCIsXCJ6dHNcIixcInp0dFwiLFwienR1XCIsXCJ6dHhcIixcInp0eVwiLFwienVhXCIsXCJ6dWhcIixcInp1bVwiLFwienVuXCIsXCJ6dXlcIixcInp3YVwiLFwienh4XCIsXCJ6eWJcIixcInp5Z1wiLFwienlqXCIsXCJ6eW5cIixcInp5cFwiLFwienphXCIsXCJ6empcIl1cbl07XG5cblxuZXhwb3J0IGNsYXNzIExhbmdVdGlsIHtcblxuICAgIC8qIERldGVybWluZSBpZiBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBCQ1AgNDcgc3RyaW5nICovXG4gICAgcHVibGljIHN0YXRpYyBpc0JjcDQ3KGxhbmdTdHI6IHN0cmluZykgOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIC9eKChbYS16QS1aXXsyLDN9KC1bYS16QS1aXSgtW2EtekEtWl17M30pezAsMn0pP3xbYS16QS1aXXs0fXxbYS16QS1aXXs1LDh9KSgtW2EtekEtWl17NH0pPygtKFthLXpBLVpdezJ9fFswLTldezN9KSk/KC0oWzAtOWEtekEtWl17NSw4fXxbMC05XVthLXpBLVpdezN9KSkqKC1bMC05YS13eS16QS1XWS1aXSgtW2EtekEtWjAtOV17Miw4fSkrKSooLXgoLVthLXpBLVowLTldezEsOH0pKyk/fHgoLVthLXpBLVowLTldezEsOH0pK3woZW4tR0Itb2VkfGktYW1pfGktYm5ufGktZGVmYXVsdHxpLWVub2NoaWFufGktaGFrfGkta2xpbmdvbnxpLWx1eHxpLW1pbmdvfGktbmF2YWpvfGktcHdufGktdGFvfGktdGF5fGktdHN1fHNnbi1CRS1GUnxzZ24tQkUtTkx8c2duLUNILURFfGFydC1sb2piYW58Y2VsLWdhdWxpc2h8bm8tYm9rfG5vLW55bnx6aC1ndW95dXx6aC1oYWtrYXx6aC1taW58emgtbWluLW5hbnx6aC14aWFuZykpJC8udGVzdChsYW5nU3RyKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHByaW1hcnkgPSBsYW5nU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChwcmltYXJ5LmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgcHJpbWFyeSA9IHByaW1hcnkuc3BsaXQoXCItXCIpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwcmltYXJ5Lm1hdGNoKC9bYS16XXsyLDN9LykpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBxYWEuLnF0elxuICAgICAgICBpZiAocHJpbWFyeS5sZW5ndGggPT09IDMgXG4gICAgICAgICAgICAmJiBwcmltYXJ5LmNoYXJBdCgwKSA9PT0gXCJxXCJcbiAgICAgICAgICAgICYmIHByaW1hcnkuY2hhckNvZGVBdCgxKSA+PSA5NyAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMSkgPD0gMTE2XG4gICAgICAgICAgICAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMikgPj0gOTcgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDIpIDw9IDEyMikge1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZFByaW1hcnlMYW5nc1twcmltYXJ5LmNoYXJDb2RlQXQoMCktOTddLmluY2x1ZGVzKHByaW1hcnkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbWF0Y2hQcmltYXJ5TGFuZyhsYW5nMTogc3RyaW5nLCBsYW5nMjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBwcmltYXJ5MSA9IGxhbmcxO1xuICAgICAgICBpZiAocHJpbWFyeTEuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICBwcmltYXJ5MSA9IHByaW1hcnkxLnNwbGl0KFwiLVwiKVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcmltYXJ5MiA9IGxhbmcyO1xuICAgICAgICBpZiAocHJpbWFyeTIuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICBwcmltYXJ5MiA9IHByaW1hcnkyLnNwbGl0KFwiLVwiKVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmltYXJ5MS50b0xvd2VyQ2FzZSgpID09PSBwcmltYXJ5Mi50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IElNYXBwZXIsIElNYXBSZXN1bHQsIEJvdW5kcyB9IGZyb20gXCIuLi9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbW1vbk1hcHBlciBpbXBsZW1lbnRzIElNYXBwZXIge1xuICAgIGFic3RyYWN0IGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmc7XG4gICAgYWJzdHJhY3QgZ2V0TmFtZXNwYWNlKCkgOiBzdHJpbmc7XG4gICAgYWJzdHJhY3QgZ2V0QXR0cmlidXRlcyhub2RlOiBOb2RlKSA6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfTtcblxuICAgIHByb3RlY3RlZCBoaWVyYXJjaHlSb2xlIDogc3RyaW5nW10gPSBudWxsO1xuICAgIHByb3RlY3RlZCBoaWVyYXJjaHlQYXRoOiBBcnJheTx7XG4gICAgICAgIHJvbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgW3JvbGU6IHN0cmluZ106IG51bWJlclxuICAgICAgICB9XG4gICAgfT4gPSBudWxsO1xuICAgIHByb3RlY3RlZCBoaWVyYXJjaHlSZXN1bHRzOiBJTWFwUmVzdWx0W10gPSBudWxsO1xuXG4gICAgZ2V0Qm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmVzZXQobm9kZTogTm9kZSkge1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUgPSBbXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aCA9IFt7XG4gICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgIHJvbGVDb3VudDoge31cbiAgICAgICAgfV07XG5cbiAgICAgICAgbGV0IGFuY2VzdG9ycyA6IE5vZGVbXSA9IFtdO1xuICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9IDkgLyogTm9kZS5ET0NVTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICBhbmNlc3RvcnMucHVzaChwYXJlbnQpO1xuICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMucmV2ZXJzZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGFuY2VzdG9ycykge1xuICAgICAgICAgICAgbGV0IHNpYmxpbmdzID0gW107XG4gICAgICAgICAgICBsZXQgc2libGluZyA9IGFuY2VzdG9yLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIHdoaWxlIChzaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaWJsaW5ncyA9IHNpYmxpbmdzLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2libGluZyBvZiBzaWJsaW5ncykge1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcEhpZXJhcmNoeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wdXNoSGllcmFyY2h5KGFuY2VzdG9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBwdXNoSGllcmFyY2h5KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgbGV0IHJvbGUgOiBzdHJpbmcgPSB0aGlzLmdldFJvbGUobm9kZSkgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSb2xlLnB1c2gocm9sZSk7XG4gICAgICAgIGlmIChyb2xlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50UGF0aEluZm8gPSB0aGlzLmhpZXJhcmNoeVBhdGhbdGhpcy5oaWVyYXJjaHlQYXRoLmxlbmd0aC0xXTtcbiAgICAgICAgICAgIHBhcmVudFBhdGhJbmZvLnJvbGVDb3VudFtyb2xlXSA9IChwYXJlbnRQYXRoSW5mby5yb2xlQ291bnRbcm9sZV0gfHwgMCkgKyAxOyBcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wdXNoKHtcbiAgICAgICAgICAgICAgICBcInJvbGVQYXRoXCI6IHBhcmVudFBhdGhJbmZvLnJvbGVQYXRoK1wiL1wiK3JvbGUrXCJbXCIrcGFyZW50UGF0aEluZm8ucm9sZUNvdW50W3JvbGVdK1wiXVwiLFxuICAgICAgICAgICAgICAgIFwicm9sZUNvdW50XCI6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhdHRyID0ge31cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZXMobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZTogdGhpcy5nZXROYW1lc3BhY2UoKSxcbiAgICAgICAgICAgIHJvbGU6IHJvbGUsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyLFxuICAgICAgICAgICAgcm9sZVBhdGg6IHRoaXMuaGllcmFyY2h5UGF0aFt0aGlzLmhpZXJhcmNoeVBhdGgubGVuZ3RoLTFdLnJvbGVQYXRoLFxuICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhub2RlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBwb3BIaWVyYXJjaHkoKSB7XG4gICAgICAgIGxldCByb2xlID0gdGhpcy5oaWVyYXJjaHlSb2xlLnBvcCgpO1xuICAgICAgICBpZiAocm9sZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cy5wb3AoKTtcbiAgICB9XG5cbiAgICBvcGVuU2NvcGUobm9kZTogTm9kZSk6IElNYXBSZXN1bHRbXSB7XG4gICAgICAgIGlmICh0aGlzLmhpZXJhcmNoeVJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wdXNoSGllcmFyY2h5KG5vZGUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGllcmFyY2h5UmVzdWx0cztcbiAgICB9XG5cbiAgICBjbG9zZVNjb3BlKG5vZGU6IE5vZGUpOiBJTWFwUmVzdWx0W10ge1xuICAgICAgICBsZXQgcmV0VmFsIDogSU1hcFJlc3VsdFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHRoaXMuaGllcmFyY2h5UmVzdWx0cykge1xuICAgICAgICAgICAgLy8gY29uc3QgdGVtcCA9IHJlcy5ub2RlO1xuICAgICAgICAgICAgLy8gcmVzLm5vZGUgPSBudWxsO1xuICAgICAgICAgICAgLy8gbGV0IGNsb25lZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzKSk7XG4gICAgICAgICAgICAvLyBjbG9uZWQubm9kZSA9IHJlcy5ub2RlID0gdGVtcDsgXG4gICAgICAgICAgICAvLyByZXRWYWwucHVzaChjbG9uZWQpO1xuICAgICAgICAgICAgcmV0VmFsLnB1c2gocmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlID0gXCIvXCIrcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZVxuICAgICAgICB0aGlzLnBvcEhpZXJhcmNoeSgpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgSU1hcFJlc3VsdCB9IGZyb20gXCIuLi9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lFbmdpbmVcIjtcblxuLy8gQ29udGV4dCB0aGF0IHdpbGwgY2F1c2UgdGhpcyBydWxlIHRvIGV4ZWN1dGUuIFxuLy8gQ29udGV4dCBzeW50YXg6XG4vLyAgIFRyaWdnZXJzOlxuLy8gICAgIGFyaWE6cm9sZSAtIFRyaWdnZXJzIG9uIGVsZW1lbnQgd2l0aCBBUklBIHJvbGUgcm9sZVxuLy8gICAgIGFyaWE6cm9sZVthdHRyaWJ1dGVdIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0aGUgZXF1aXZhbGVudCBsb2dpY2FsIFxuLy8gICAgICAgYXJpYS0gYXR0cmlidXRlIChlLmcuLCBidXR0b25bZGlzYWJsZWRdIHdpbGwgdHJpZ2dlciBvbiBcbi8vICAgICAgIDxidXR0b24gZGlzYWJsZWQ+IG9yIDxkaXYgcm9sZT1cImJ1dHRvblwiIGFyaWEtZGlzYWJsZWQ9XCJ0cnVlXCI+KVxuLy8gICAgIHJvbGVbYXR0cmlidXRlPXZhbHVlXSAtIFNpbWlsYXIgdG8gYWJvdmUsIHdpdGggY2FzZS1zZW5zaXRpdmUgbWF0Y2hcbi8vICAgICAgIHRvIHZhbHVlXG4vLyAgICAgcm9sZVthdHRyaWJ1dGV+dmFsdWVdIC0gU2ltaWxhciB0byBhYm92ZSwgd2l0aCBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoXG4vLyAgICAgZG9tOmVsZW1lbnQgLSBUcmlnZ2VycyBvbiBhbiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lXG4vLyAgICAgZG9tOmVsZW1lbnRbYXR0cmlidXRlXSAtIFRyaWdnZXJzIG9uIGEgZG9tIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuLy8gICAgIGRvbToqW2F0dHJpYnV0ZV0gLSBUcmlnZ2VycyBvbiBhbGwgZWxlbWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuLy8gICBDb21iaW5pbmcgdHJpZ2dlcnM6XG4vLyAgICAgdHJpZ2dlcjEgdHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGhpbiBhbiBcbi8vICAgICAgIGVsZW1lbnQgd2l0aCB0cmlnZ2VyMVxuLy8gICAgICF0cmlnZ2VyMSB0cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgbm90IHdpdGhpblxuLy8gICAgICAgZWxlbWVudCB3aXRoIHRyaWdnZXIxXG4vLyAgICAgdHJpZ2dlcjE+dHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGggYW5cbi8vICAgICAgIGFuIGltbWVkaWF0ZSBwYXJlbnQgd2l0aCB0cmlnZ2VyMVxuLy8gICAgIHRyaWdnZXIxK3RyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiB3aXRoIGFuXG4vLyAgICAgICBpbW1lZGlhdGUgcHJldmlvdXMgc2libGluZyB3aXRoIHRyaWdnZXIxXG4vLyAgICAgdHJpZ2dlcjF+dHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGggYW5cbi8vICAgICAgIHNvbWUgZWFybGllciBzaWJsaW5nIHdpdGggdHJpZ2dlcjFcbi8vICAgICBjb250ZXh0LGNvbnRleHQgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIGVpdGhlciBjb250ZXh0XG5leHBvcnQgY2xhc3MgQXR0ckluZm8ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaW5jbHVzaXZlOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgYXR0cjogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgZXE/OiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyB2YWx1ZT86IHN0cmluZ1xuICAgICkge1xuICAgICAgICBpZiAoIWluY2x1c2l2ZSBcbiAgICAgICAgICAgICAgICAmJiAoKHR5cGVvZiBlcSkgIT09IFwidW5kZWZpbmVkXCIgJiYgZXEubGVuZ3RoID4gMCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBoYXZlICFhdHRyXCIrZXErXCIgY29udGV4dFwiKTsgICAgXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1c2l2ZSAmJiAodHlwZW9mIGVxKSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlcS5sZW5ndGggPiAwICYmICgodHlwZW9mIHZhbHVlKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB2YWx1ZS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaGF2ZSBlcXVpdmFsZW5jZSBjaGVjayB3aXRob3V0IGEgdmFsdWVcIik7ICAgIFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG1hdGNoZXMoY29udGV4dDogSU1hcFJlc3VsdCkge1xuICAgICAgICBjb25zdCBydWxlQXR0clBhcnQgPSB0aGlzOyBcbiAgICAgICAgY29uc3QgZWxlbUF0dHJzID0gY29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoIShydWxlQXR0clBhcnQuYXR0ciBpbiBlbGVtQXR0cnMpKSB7XG4gICAgICAgICAgICByZXR1cm4gIXJ1bGVBdHRyUGFydC5pbmNsdXNpdmVcbiAgICAgICAgfSBlbHNlIGlmICghcnVsZUF0dHJQYXJ0LmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKCFydWxlQXR0clBhcnQuZXEpIHtcbiAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBtYXRjaCBhbmQgSSBoYXZlIHRoYXQgYXR0cmlidXRlIGFuZCBubyBlcXVpdmFsZW5jZSBkZWZpbmVkXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBtYXRjaCBhbmQgSSBoYXZlIHRoYXQgYXR0cmlidXRlIGFuZCBlcXVpdmFsZW5jZSBkZWZpbmVkXG4gICAgICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSBlbGVtQXR0cnNbcnVsZUF0dHJQYXJ0LmF0dHJdO1xuICAgICAgICAgICAgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZUF0dHJQYXJ0LnZhbHVlID09PSBhdHRyVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCIhPVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSAhPT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiflwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSA9PT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiIX5cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlQXR0clBhcnQudmFsdWUgIT09IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBlcXVpdmFsZW5jZSBvcGVyYXRvciBub3Qgc3VwcG9ydGVkXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYXJ0SW5mbyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpbmNsdXNpdmU6IGJvb2xlYW4sIFxuICAgICAgICBwdWJsaWMgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByb2xlOiBzdHJpbmcsIFxuICAgICAgICBwdWJsaWMgYXR0cnM6IEF0dHJJbmZvW10sIFxuICAgICAgICBwdWJsaWMgY29ubmVjdG9yOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcIipcIiAmJiAhaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiISogY29udGV4dCBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hlcyggXG4gICAgICAgIGNvbnRleHRIaWVyOiBSdWxlQ29udGV4dEhpZXJhcmNoeSxcbiAgICAgICAgaGllckxldmVsOiBudW1iZXIpIDogYm9vbGVhbiBcbiAgICB7XG4gICAgICAgIGNvbnN0IHJ1bGVQYXJ0ID0gdGhpcztcbiAgICAgICAgbGV0IHJ1bGVSb2xlTWF0Y2ggPSAocnVsZVBhcnQubmFtZXNwYWNlIGluIGNvbnRleHRIaWVyKSAmJiBjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF1cbiAgICAgICAgICAgICYmIChjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF0ucm9sZSA9PT0gcnVsZVBhcnQucm9sZVxuICAgICAgICAgICAgICAgIHx8IGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlICE9PSBcIm5vbmVcIiAmJiBydWxlUGFydC5yb2xlID09PSBcIipcIik7XG4gICAgICAgIGlmIChydWxlUm9sZU1hdGNoIFxuICAgICAgICAgICAgJiYgcnVsZVBhcnQucm9sZSA9PT0gXCIqXCIgXG4gICAgICAgICAgICAmJiBydWxlUGFydC5uYW1lc3BhY2UgPT09IFwiZG9tXCIgXG4gICAgICAgICAgICAmJiAoY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdLnJvbGUgPT09IFwiI3RleHRcIlxuICAgICAgICAgICAgICAgIHx8IGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlID09PSBcIi8jdGV4dFwiKSkge1xuICAgICAgICAgICAgcnVsZVJvbGVNYXRjaCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlUGFydC5pbmNsdXNpdmUgJiYgIXJ1bGVSb2xlTWF0Y2gpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFydWxlUGFydC5pbmNsdXNpdmUgJiYgIXJ1bGVSb2xlTWF0Y2gpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIE1hdGNoIHRoZSBhdHRyaWJ1dGVzXG4gICAgICAgIGNvbnN0IHJ1bGVBdHRycyA9IHJ1bGVQYXJ0LmF0dHJzO1xuICAgICAgICBjb25zdCBlbGVtQ29udGV4dCA9IGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXTtcbiAgICAgICAgbGV0IG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlQXR0clBhcnQgb2YgcnVsZUF0dHJzKSB7XG4gICAgICAgICAgICBtYXRjaCA9IG1hdGNoICYmIHJ1bGVBdHRyUGFydC5tYXRjaGVzKGVsZW1Db250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bGVQYXJ0LmluY2x1c2l2ZSkgbWF0Y2ggPSAhbWF0Y2g7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIENvbnRleHQge1xuICAgIGNvbnRleHRJbmZvIDogUGFydEluZm9bXSA9IFtdXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGNvbnRleHRIaWVyTWF0Y2hlcyA6IHN0cmluZ1tdID0gY29udGV4dC5tYXRjaCgvIT9bL2EtekEtWjowLTkqXFwtX10rKFxcW1teXFxdXStcXF0pKlsgPit+XT8vZyk7XG4gICAgICAgIGxldCByZXN1bHRzIDogUGFydEluZm9bXSA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBjb250ZXh0SGllck1hdGNoZXMpIHtcbiAgICAgICAgICAgIGxldCBwYXJ0cyA9IHBhcnQubWF0Y2goLyghPykoWy9hLXpBLVo6MC05KlxcLV9dKykoKFxcW1teXFxdXStcXF0pKikoWyA+K35dPykvKTtcbiAgICAgICAgICAgIGxldCBhdHRySW5mbyA6IEF0dHJJbmZvW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0clBhcnQgb2YgcGFydHNbM10ubWF0Y2goL1xcWyhbXlxcXV0rKVxcXS9nKSB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyUGFydHMgPSBhdHRyUGFydC5tYXRjaCgvXFxbKCE/KShbYS16OkEtWipcXC1fXSspKCE/Wz1+XSk/KFteXFxdXSspP1xcXS8pO1xuICAgICAgICAgICAgICAgIGF0dHJJbmZvLnB1c2gobmV3IEF0dHJJbmZvKFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbMV0gIT09IFwiIVwiLFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbMl0udG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzNdLFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbNF1cbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnRzWzJdID0gcGFydHNbMl0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IG5zUGFydHMgPSBwYXJ0c1syXS5zcGxpdChcIjpcIik7XG4gICAgICAgICAgICBsZXQgaW5jbCA9IHBhcnRzWzFdICE9PSBcIiFcIjtcbiAgICAgICAgICAgIGNvbnN0IG5zID0gbnNQYXJ0cy5zaGlmdCgpO1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBuc1BhcnRzLmpvaW4oXCI6XCIpO1xuICAgICAgICAgICAgbGV0IHBhcnRJbmZvID0gbmV3IFBhcnRJbmZvKGluY2wsIG5zLCByb2xlLCBhdHRySW5mbywgcGFydHNbcGFydHMubGVuZ3RoLTFdKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChwYXJ0SW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250ZXh0SW5mbyA9IHJlc3VsdHM7XG4gICAgfVxuXG4gICAgc3RhdGljIGNsZWFuQ29udGV4dChjb250ZXh0OiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyArIS9nLCBcIiAhXCIpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8gKyhbPit+LF0pL2csIFwiJDFcIik7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyhbPit+LF0pICsvZywgXCIkMVwiKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvICsvZywgXCIgXCIpO1xuICAgICAgICByZXR1cm4gY29udGV4dC50cmltKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGNvbnRleHQ6IHN0cmluZykge1xuICAgICAgICBsZXQgY29udGV4dHMgPSBDb250ZXh0LnNwbGl0TXVsdGlwbGUoQ29udGV4dC5jbGVhbkNvbnRleHQoY29udGV4dCkpO1xuXG4gICAgICAgIGxldCByZXRWYWwgOiBDb250ZXh0W10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgY3R4ID0gbmV3IENvbnRleHQoY29udGV4dHNbaV0pO1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goY3R4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaW5pdGlhbCBwcm9jZXNzaW5nIG9mIHNwbGl0dGluZyBvbiBjb21tYSAtIGNvbnRleHQsY29udGV4dFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFxuICAgICAqL1xuICAgIHN0YXRpYyBzcGxpdE11bHRpcGxlKGNvbnRleHQ6IHN0cmluZykgOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBjb250ZXh0cyA9IFtdO1xuICAgICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuaW5kZXhPZihcIixcIikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbnRleHQuc3BsaXQoXCIsXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0cztcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gXCIuLi9jb25maWcvQ29uZmlnXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBJc3N1ZSwgUnVsZSwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlUmVzdWx0LCBlUnVsZUNvbmZpZGVuY2UgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBIZWxwTWFwLCBJRW5naW5lLCBObHNNYXAgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lFbmdpbmVcIjtcbmltcG9ydCB7IElNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lNYXBwZXJcIjtcbmltcG9ydCB7IFJlcG9ydCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSVJlcG9ydFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL1Zpc1V0aWxcIjtcblxuY2xhc3MgV3JhcHBlZFJ1bGUge1xuICAgIG5zOiBzdHJpbmc7XG4gICAgaWR4PzogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IgKHB1YmxpYyBydWxlOiBSdWxlLCBwdWJsaWMgcGFyc2VkSW5mbyA6IENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5ucyA9IHRoaXMucGFyc2VkSW5mby5jb250ZXh0SW5mb1t0aGlzLnBhcnNlZEluZm8uY29udGV4dEluZm8ubGVuZ3RoLTFdLm5hbWVzcGFjZTtcbiAgICAgICAgQ29uZmlnLkRFQlVHICYmIGNvbnNvbGUubG9nKFwiQWRkZWQgUnVsZTpcIiwgcnVsZS5pZCwgSlNPTi5zdHJpbmdpZnkodGhpcy5wYXJzZWRJbmZvKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBjb252ZXJ0aW5nIHRoZSBub2RlIGludG8gYSBzbmlwcGV0IHdoaWNoIGNhbiBiZSBhZGRlZCB0byByZXBvcnQuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgbm9kZSBhbmQgZXh0cmFjdCB0aGUgbm9kZSBuYW1lIGFuZCB0aGUgYXR0cmlidXRlcyBhbmQgYnVpbGQgdGhlIHNuaXBwZXQgYmFzZWQgb24gdGhpcy5cbiAgICAgKlxuICAgICAqIFRPRE86IEZ1dHVyZSwgbWF5YmUgd2UgY2FuIGV4dHJhY3QgbW9yZSB0aGVuIGp1c3Qgc2luZ2xlIGxpbmUsIGFkZCBtb3JlIGluZm8gb3IgZXZlbiBhZGQgY2xvc2luZyB0YWdzIGV0Yy4uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBodG1sIGVsZW1lbnQgdG8gY29udmVydCBpbnRvIGVsZW1lbnQgc25pcHBldCB3aXRoIG5vZGUgbmFtZSBhbmQgYXR0cmlidXRlcyBvbmx5LlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBub2RlU25pcHBldCAtIHJldHVybiB0aGUgZWxlbWVudCBzbmlwcGV0IG9mIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkIHdoaWNoIG9ubHkgY29udGFpbnMsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVuYW1lIGFuZCBhdHRyaWJ1dGVzLiBpLmUuIDx0YWJsZSBpZD1cXFwibGF5b3V0X3RhYmxlMVxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiB0aGlzXG4gICAgICovXG4gICAgc3RhdGljIGNvbnZlcnROb2RlVG9TbmlwcGV0KG5vZGUgOiBFbGVtZW50KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIHZhciBub2RlU25pcHBldCA9ICcnO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGUgbmFtZSBhbmQgYWRkIGl0IHRvIHRoZSBub2RlIHNuaXBwZXRcbiAgICAgICAgbm9kZVNuaXBwZXQgKz0gJzwnICsgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgYWxsIHRoZSBub2RlIGF0dHJpYnV0ZXMgYXMgYW4gYXJyYXlcbiAgICAgICAgdmFyIG5vZGVBdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBhdHRyaWJ1dGVzIG9uIHRoaXMgbm9kZVxuICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXMgIT09IG51bGwgJiYgdHlwZW9mIG5vZGVBdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJykge1xuXG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZXNlcyBhdHRyaWJ1dGVzIGFuZCBhZGQgdGhlIG5hbWUgYW5kIHZhbHVlIHRvIHRoZSBub2RlU25pcHBldCB3aGljaCB3aWxsIGJlIHJldHVybmVkXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbm9kZUF0dHJpYnV0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXNbaV0ubmFtZSA9PT0gXCJkYXRhLW5hbWV3YWxrXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIHZhbHVlLlxuICAgICAgICAgICAgICAgIG5vZGVTbmlwcGV0ICs9ICcgJyArIG5vZGVBdHRyaWJ1dGVzW2ldLm5hbWUgKyAnPVwiJyArIG5vZGVBdHRyaWJ1dGVzW2ldLnZhbHVlICsgJ1wiJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsb3NlIHRoZSBub2RlXG4gICAgICAgIG5vZGVTbmlwcGV0ICs9ICc+JztcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIG5vZGUgc25pcHBldFxuICAgICAgICByZXR1cm4gbm9kZVNuaXBwZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyB0aGUgc291cmNlIGxvY2F0aW9uIGZvciBhIG5vZGUsIHdoaWNoIGNhbiBiZSBhZGRlZCB0byBhIHJlcG9ydC5cbiAgICAgKiBTdXBwb3J0cyBkZWJ1ZyBkaXJlY3RpdmVzIGluIHRoZSBmb2xsb3dpbmcgZm9ybXM6XG4gICAgICogICAxLiBBbiBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgaXRzZWxmOlxuICAgICAqICAgICAgICBpYm0tYTExeS1kZWJ1Zz1cImZpbGUudHM6MTA6NVwiXG4gICAgICogICAyLiBBIGNvbW1lbnQgbm9kZSBwcmVjZWRpbmcgdGhlIGVsZW1lbnQgKGFzIGEgc2libGluZyBvciBhbmNlc3RvciBzaWJsaW5nKTpcbiAgICAgKiAgICAgICAgPCEtLSBpYm0tYTExeS1kZWJ1ZzogZmlsZS50czoxMDo1IC0tPlxuICAgICAqICAgMy4gQSB3cmFwcGVyIGVsZW1lbnQgKGUuZy4gZGl2KSB3aG9zZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGlsZCBpcyBzdWNoIGEgY29tbWVudCBub2RlLlxuICAgICAqICAgNC4gQW4gYW5jZXN0b3IgZWxlbWVudCB0aGF0IGNhcnJpZXMgdGhlIGlibS1hMTF5LWRlYnVnIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIFRyYXZlcnNhbDogY2hlY2tzIHRoZSBub2RlIGl0c2VsZiBmb3IgYW4gaW5saW5lIGF0dHJpYnV0ZSwgdGhlbiBzY2FucyBwcmV2aW91cyBzaWJsaW5ncyBhdFxuICAgICAqIGVhY2ggYW5jZXN0b3IgbGV2ZWwgdXB3YXJkIChhbHNvIGNoZWNraW5nIGVhY2ggYW5jZXN0b3IgZWxlbWVudCdzIG93biBpbmxpbmUgYXR0cmlidXRlKSxcbiAgICAgKiBzdG9wcGluZyBpZiBhIGJsYW5rIG9yICdlbmQnIG1hcmtlciBpcyBmb3VuZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBET00gbm9kZSB0byBmaW5kIHNvdXJjZSBpbmZvIGZvclxuICAgICAqIEByZXR1cm4ge3N0cmluZyB8IG51bGx9IC0gVGhlIHNvdXJjZSBsb2NhdGlvbiBzdHJpbmcsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgdGhpc1xuICAgICAqL1xuICAgIHN0YXRpYyBjb252ZXJ0Tm9kZVRvU291cmNlKG5vZGU6IE5vZGUsIGVuYWJsZWQ6IGJvb2xlYW49ZmFsc2UpOiBzdHJpbmcge1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiU291cmNlIE1hcCBlbmFibGVkOlwiLCBlbmFibGVkKTtcbiAgICAgICAgaWYgKCFlbmFibGVkIHx8ICFub2RlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IERFQlVHX0RJUkVDVElWRSA9IFwiaWJtLWExMXktZGVidWdcIjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVHlwZWQgcmVzdWx0IGZyb20gZXh0cmFjdERpcmVjdGl2ZSB0byBhdm9pZCBzZW50aW5lbCBzdHJpbmcgY29sbGlzaW9ucy5cbiAgICAgICAgICogICB7IGZvdW5kOiBmYWxzZSB9ICAgICAgICAgICAg4oCUIG5vIGRpcmVjdGl2ZSBvbiB0aGlzIG5vZGVcbiAgICAgICAgICogICB7IGZvdW5kOiB0cnVlLCBzdG9wOiB0cnVlIH0g4oCUIGRpcmVjdGl2ZSBpcyBhIHNjb3BlLWVuZCBtYXJrZXIgKGJsYW5rIG9yICdlbmQnKVxuICAgICAgICAgKiAgIHsgZm91bmQ6IHRydWUsIHN0b3A6IGZhbHNlLCBzb3VyY2U6IHN0cmluZyB9IOKAlCB2YWxpZCBzb3VyY2UgbG9jYXRpb25cbiAgICAgICAgICovXG4gICAgICAgIHR5cGUgRGlyZWN0aXZlUmVzdWx0ID1cbiAgICAgICAgICAgIHwgeyBmb3VuZDogZmFsc2UgfVxuICAgICAgICAgICAgfCB7IGZvdW5kOiB0cnVlOyBzdG9wOiB0cnVlIH1cbiAgICAgICAgICAgIHwgeyBmb3VuZDogdHJ1ZTsgc3RvcDogZmFsc2U7IHNvdXJjZTogc3RyaW5nIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhcnNlcyBhIHNvdXJjZSBzdHJpbmcgaW50byBhIERpcmVjdGl2ZVJlc3VsdC5cbiAgICAgICAgICogVGhlIHNvdXJjZSBpcyB0aGUgZmluYWwgcmVzb2x2ZWQgdmFsdWUg4oCUIGFmdGVyIGFueSAnOicgc2VwYXJhdG9yIGhhcyBhbHJlYWR5IGJlZW4gc3RyaXBwZWQuXG4gICAgICAgICAqIEEgYmxhbmsgdmFsdWUgb3IgdGhlIGV4YWN0IHdvcmQgJ2VuZCcgKGNhc2UtaW5zZW5zaXRpdmUpIGlzIGEgc3RvcCBtYXJrZXIuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBwYXJzZVNvdXJjZSA9IGZ1bmN0aW9uIChzb3VyY2U6IHN0cmluZyk6IERpcmVjdGl2ZVJlc3VsdCB7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UudG9Mb3dlckNhc2UoKSA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBmb3VuZDogdHJ1ZSwgc3RvcDogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZm91bmQ6IHRydWUsIHN0b3A6IGZhbHNlLCBzb3VyY2UgfTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRXh0cmFjdHMgdGhlIGRlYnVnLWRpcmVjdGl2ZSBjb21tZW50IHZhbHVlIGZyb20gYSBub2RlLlxuICAgICAgICAgKiBIYW5kbGVzOlxuICAgICAgICAgKiAgIC0gQSBjb21tZW50IG5vZGUgZGlyZWN0bHlcbiAgICAgICAgICogICAtIEEgd3JhcHBlciBlbGVtZW50IChlLmcuIDxkaXY+KSB3aG9zZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGlsZCBpcyBhIGNvbW1lbnQgbm9kZVxuICAgICAgICAgKlxuICAgICAgICAgKiBSZXR1cm5zIHsgZm91bmQ6IHRydWUsIHN0b3A6IHRydWUgfSBpZiB0aGUgZGlyZWN0aXZlIGlzIGJsYW5rIG9yIGV4YWN0bHkgJ2VuZCcsXG4gICAgICAgICAqIHJldHVybnMgeyBmb3VuZDogdHJ1ZSwgc3RvcDogZmFsc2UsIHNvdXJjZSB9IGlmIGEgdmFsaWQgc291cmNlIGlzIGZvdW5kLFxuICAgICAgICAgKiBvciByZXR1cm5zIHsgZm91bmQ6IGZhbHNlIH0gaWYgbm8gZGlyZWN0aXZlIGlzIHByZXNlbnQgb24gdGhpcyBub2RlLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZXh0cmFjdERpcmVjdGl2ZSA9IGZ1bmN0aW9uIChlbGVtOiBOb2RlIHwgbnVsbCk6IERpcmVjdGl2ZVJlc3VsdCB7XG4gICAgICAgICAgICBpZiAoIWVsZW0pIHJldHVybiB7IGZvdW5kOiBmYWxzZSB9O1xuXG4gICAgICAgICAgICBsZXQgY29tbWVudFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgLy8gRGlyZWN0IGNvbW1lbnQgbm9kZVxuICAgICAgICAgICAgICAgIGNvbW1lbnRWYWx1ZSA9IGVsZW0ubm9kZVZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgd3JhcHBlciAoZS5nLiA8ZGl2PjwhLS0gaWJtLWExMXktZGVidWc6IC4uLiAtLT48L2Rpdj4pXG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hpbGQgbm9kZVxuICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IGVsZW0uZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBwdXJlIHdoaXRlc3BhY2UgdGV4dCBub2Rlc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVWYWx1ZSAmJiBjaGlsZC5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb24td2hpdGVzcGFjZSB0ZXh0IGJlZm9yZSBhIGNvbW1lbnQg4oCUIG5vdCBhIGRpcmVjdGl2ZSB3cmFwcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50VmFsdWUgPSBjaGlsZC5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFueSBvdGhlciBub2RlIHR5cGUgYmVmb3JlIGEgY29tbWVudCDigJQgbm90IGEgZGlyZWN0aXZlIHdyYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29tbWVudFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IGNvbW1lbnRWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgLy8gTWF0Y2ggZXhhY3RseSBcImlibS1hMTF5LWRlYnVnXCIgZm9sbG93ZWQgYnkgZW5kLW9mLXN0cmluZywgd2hpdGVzcGFjZSwgb3IgJzonXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBcImlibS1hMTF5LWRlYnVnLWV4dHJhXCIgZnJvbSBiZWluZyB0cmVhdGVkIGFzIGEgZGlyZWN0aXZlLlxuICAgICAgICAgICAgICAgIGlmICh0cmltbWVkID09PSBERUJVR19ESVJFQ1RJVkUgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5zdGFydHNXaXRoKERFQlVHX0RJUkVDVElWRSArICc6JykgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5zdGFydHNXaXRoKERFQlVHX0RJUkVDVElWRSArICcgJykgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5zdGFydHNXaXRoKERFQlVHX0RJUkVDVElWRSArICdcXHQnKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdHJpcCB0aGUgZGlyZWN0aXZlIG5hbWUgYW5kIG9wdGlvbmFsIGxlYWRpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZnRlckRpcmVjdGl2ZSA9IHRyaW1tZWQuc3Vic3RyaW5nKERFQlVHX0RJUkVDVElWRS5sZW5ndGgpLnRyaW1TdGFydCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTdHJpcCBhIHNpbmdsZSBsZWFkaW5nICc6JyBzZXBhcmF0b3IgaWYgcHJlc2VudFxuICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBcImlibS1hMTF5LWRlYnVnOiBmaWxlLnRzOjEwOjVcIiDihpIgYWZ0ZXJEaXJlY3RpdmUgPSBcIjogZmlsZS50czoxMDo1XCIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGFmdGVyRGlyZWN0aXZlLnN0YXJ0c1dpdGgoJzonKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhZnRlckRpcmVjdGl2ZS5zdWJzdHJpbmcoMSkudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFmdGVyRGlyZWN0aXZlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlU291cmNlKHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geyBmb3VuZDogZmFsc2UgfTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgaWJtLWExMXktZGVidWcgYXR0cmlidXRlIHZhbHVlIGZyb20gYW4gZWxlbWVudCBub2RlIGFzIGEgRGlyZWN0aXZlUmVzdWx0LFxuICAgICAgICAgKiBvciB7IGZvdW5kOiBmYWxzZSB9IGlmIGFic2VudC4gUmVjb2duaXNlcyB0aGUgJ2VuZCcgc3RvcCBtYXJrZXIganVzdCBsaWtlIGNvbW1lbnQgZGlyZWN0aXZlcy5cbiAgICAgICAgICogVGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyB0aGUgc291cmNlIGRpcmVjdGx5IChubyAnOicgcHJlZml4KSwgZS5nLiBpYm0tYTExeS1kZWJ1Zz1cImZpbGUudHM6MTA6NVwiLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZ2V0SW5saW5lQXR0ciA9IGZ1bmN0aW9uIChuOiBOb2RlKTogRGlyZWN0aXZlUmVzdWx0IHtcbiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgcmV0dXJuIHsgZm91bmQ6IGZhbHNlIH07XG4gICAgICAgICAgICBjb25zdCB2YWwgPSAobiBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoREVCVUdfRElSRUNUSVZFKTtcbiAgICAgICAgICAgIGlmICh2YWwgPT09IG51bGwpIHJldHVybiB7IGZvdW5kOiBmYWxzZSB9O1xuICAgICAgICAgICAgLy8gQXR0cmlidXRlIHZhbHVlIGlzIHRoZSBzb3VyY2UgZGlyZWN0bHkg4oCUIG5vICc6JyBzZXBhcmF0b3IgdG8gc3RyaXBcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVNvdXJjZSh2YWwudHJpbSgpKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVHJhdmVyc2VzIGxlZnQgKHByZXZpb3VzIHNpYmxpbmdzKSB0aGVuIHVwd2FyZCAocGFyZW50KSB0byBmaW5kIHNvdXJjZSBpbmZvLlxuICAgICAgICAgKiBEb2VzIE5PVCBjaGVjayB0aGUgc3RhcnRpbmcgZWxlbWVudCBpdHNlbGYg4oCUIG9ubHkgaXRzIHByZWNlZGluZyBzaWJsaW5ncyBhbmQgYW5jZXN0b3JzLlxuICAgICAgICAgKiBUaGlzIGF2b2lkcyBtaXNpZGVudGlmeWluZyBhIGNvbnRlbnQgbm9kZSBhcyBpdHMgb3duIHNvdXJjZSBkaXJlY3RpdmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEF0IGVhY2ggYW5jZXN0b3IgbGV2ZWwgdGhlIGZ1bmN0aW9uIGFsc28gY2hlY2tzIHRoZSBhbmNlc3RvciBlbGVtZW50J3Mgb3duIGlubGluZVxuICAgICAgICAgKiBpYm0tYTExeS1kZWJ1ZyBhdHRyaWJ1dGUsIHNvIHRoYXQgYSBwYXJlbnQgZWxlbWVudCBjYW4gYW5ub3RhdGUgYWxsIGl0cyBkZXNjZW5kYW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogU2libGluZyBzY2FubmluZyBzdG9wcyBhdCB0aGUgZmlyc3Qgbm9kZSB0aGF0IGlzIHJlY29nbmlzZWQgYXMgYSBkaXJlY3RpdmUgKGZvdW5kIG9yIHN0b3ApLlxuICAgICAgICAgKiBOb24tZGlyZWN0aXZlIG5vZGVzIChyZWFsIGNvbnRlbnQgZWxlbWVudHMsIHRleHQgbm9kZXMpIGFyZSBza2lwcGVkIHNvIHRoYXQgYSBkaXJlY3RpdmVcbiAgICAgICAgICogcGxhY2VkIGZ1cnRoZXIgYmFjayBpbiB0aGUgc2libGluZyBsaXN0IGlzIHN0aWxsIGZvdW5kIGV2ZW4gaWYgY29udGVudCBub2RlcyBpbnRlcnZlbmUuXG4gICAgICAgICAqIEhvd2V2ZXIsIHRyYXZlcnNhbCBkb2VzIE5PVCBjcm9zcyBlbGVtZW50IGJvdW5kYXJpZXMgd2hlbiBzY2FubmluZyBzaWJsaW5ncyDigJQgb25seVxuICAgICAgICAgKiBjb21tZW50IG5vZGVzIGFuZCBkZWRpY2F0ZWQgd3JhcHBlciBlbGVtZW50cyAod2hvc2Ugc29sZSBmaXJzdCBjaGlsZCBpcyBhIGNvbW1lbnQpIGFyZVxuICAgICAgICAgKiB0cmVhdGVkIGFzIHRyYW5zcGFyZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBTaGFkb3cgRE9NIHRyYXZlcnNhbDogdXNlcyBET01XYWxrZXIucGFyZW50Tm9kZSgpIHRvIGNyb3NzIHNoYWRvdyBib3VuZGFyaWVzIGNvcnJlY3RseSxcbiAgICAgICAgICogaW5jbHVkaW5nIHNsb3R0ZWQgY29udGVudCBhbmQgbmVzdGVkIFNoYWRvdyBET00gKHNoYWRvdy1pbi1zaGFkb3cpLiBXaGVuIHRoZSBwYXJlbnRcbiAgICAgICAgICogY2hhaW4gcmVhY2hlcyBhIFNoYWRvd1Jvb3QsIERPTVdhbGtlci5wYXJlbnROb2RlKCkgYXV0b21hdGljYWxseSByZXNvbHZlcyBpdCB0byB0aGVcbiAgICAgICAgICogc2hhZG93IGhvc3QgZWxlbWVudCBpbiB0aGUgb3V0ZXIgRE9NLiBBIHBsYWluIERvY3VtZW50RnJhZ21lbnQgd2l0aCBubyBob3N0IHJldHVybnNcbiAgICAgICAgICogbnVsbCBmcm9tIERPTVdhbGtlci5wYXJlbnROb2RlKCksIHN0b3BwaW5nIHRyYXZlcnNhbC5cbiAgICAgICAgICpcbiAgICAgICAgICogU2libGluZyB0cmF2ZXJzYWwgdXNlcyBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QoKSB0byBza2lwIG5vZGVzIHRoYXRcbiAgICAgICAgICogYXJlIGFzc2lnbmVkIHRvIHNsb3RzIChhbmQgdGhlcmVmb3JlIGxvZ2ljYWxseSBiZWxvbmcgdG8gYSBkaWZmZXJlbnQgcGFydCBvZiB0aGUgdHJlZSkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFVzZXMgYW4gaXRlcmF0aXZlIGFwcHJvYWNoIChyYXRoZXIgdGhhbiByZWN1cnNpb24pIHRvIHNhZmVseSBoYW5kbGUgZGVlcGx5IG5lc3RlZFxuICAgICAgICAgKiBET00gc3RydWN0dXJlcyB3aXRob3V0IHJpc2sgb2Ygc3RhY2sgb3ZlcmZsb3cuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbGVtIC0gVGhlIG5vZGUgd2hvc2UgY29udGV4dCB3ZSBhcmUgc2VhcmNoaW5nXG4gICAgICAgICAqIEByZXR1cm5zIFRoZSBzb3VyY2UgbG9jYXRpb24gc3RyaW5nLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZmluZFNvdXJjZSA9IGZ1bmN0aW9uIChlbGVtOiBOb2RlIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBlbGVtO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBTY2FuIHByZXZpb3VzIHNpYmxpbmdzIGZvciBhIGRlYnVnIGRpcmVjdGl2ZSBjb21tZW50IG9yIHdyYXBwZXIgZWxlbWVudC5cbiAgICAgICAgICAgICAgICAvLyBVc2UgcHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QgdG8gc2tpcCBub2RlcyBhc3NpZ25lZCB0byBzbG90cywgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyBsb2dpY2FsbHkgYmVsb25nIHRvIGEgZGlmZmVyZW50IHBhcnQgb2YgdGhlIGNvbXBvc2VkIHRyZWUuXG4gICAgICAgICAgICAgICAgLy8gT25seSBjb21tZW50IG5vZGVzIGFuZCBkZWRpY2F0ZWQgd3JhcHBlciBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCBkaXJlY3RpdmVzO1xuICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciBub2RlIHR5cGVzIGFyZSBza2lwcGVkICh0aGV5IGRvIG5vdCBibG9jayBmdXJ0aGVyIHNjYW5uaW5nKS5cbiAgICAgICAgICAgICAgICBsZXQgcHJldiA9IERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJldikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBleHRyYWN0RGlyZWN0aXZlKHByZXYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0b3ApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgYXMgeyBmb3VuZDogdHJ1ZTsgc3RvcDogZmFsc2U7IHNvdXJjZTogc3RyaW5nIH0pLnNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHByZXYpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5vIGRpcmVjdGl2ZSBmb3VuZCBhbW9uZyBzaWJsaW5ncyDigJQgbW92ZSB1cCB0byBwYXJlbnQuXG4gICAgICAgICAgICAgICAgLy8gVXNlIERPTVdhbGtlci5wYXJlbnROb2RlKCkgaW5zdGVhZCBvZiBub2RlLnBhcmVudE5vZGUgZGlyZWN0bHkgc28gdGhhdDpcbiAgICAgICAgICAgICAgICAvLyAgIDEuIFNoYWRvdyBET00gYm91bmRhcmllcyBhcmUgY3Jvc3NlZCBhdXRvbWF0aWNhbGx5IChTaGFkb3dSb290IOKGkiBob3N0IGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgIC8vICAgICAgc3VwcG9ydGluZyBib3RoIHJlZ3VsYXIgYW5kIG5lc3RlZCBTaGFkb3cgRE9NIChzaGFkb3ctaW4tc2hhZG93KS5cbiAgICAgICAgICAgICAgICAvLyAgIDIuIFNsb3R0ZWQgbm9kZXMgYXJlIHJlLXBhcmVudGVkIHRvIHRoZWlyIHNsb3Qgb3duZXIgcmF0aGVyIHRoYW4gdGhlaXJcbiAgICAgICAgICAgICAgICAvLyAgICAgIGxpZ2h0LURPTSBwYXJlbnQsIG1hdGNoaW5nIHRoZSBjb21wb3NlZCAocmVuZGVyZWQpIHRyZWUgc3RydWN0dXJlLlxuICAgICAgICAgICAgICAgIC8vICAgMy4gTm9kZXMgd2l0aCBhbiBvd25lckVsZW1lbnQgKGUuZy4gaWZyYW1lIGRvY3VtZW50IHJvb3RzKSBhcmUgcmUtcGFyZW50ZWRcbiAgICAgICAgICAgICAgICAvLyAgICAgIHRvIHRoZWlyIG93bmVyIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoY3VycmVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZWFjaGVkIHRoZSB0b3Agb2YgdGhlIHRyZWUgKG9yIGEgcGxhaW4gRG9jdW1lbnRGcmFnbWVudCB3aXRoIG5vIGhvc3QpXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZmluZGluZyBhIGRpcmVjdGl2ZS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHBhcmVudCBlbGVtZW50J3Mgb3duIGlubGluZSBhdHRyaWJ1dGUgYmVmb3JlIGNvbnRpbnVpbmcgdXB3YXJkLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIGEgY29udGFpbmluZyBlbGVtZW50IHRvIGFubm90YXRlIGFsbCBpdHMgZGVzY2VuZGFudHMuXG4gICAgICAgICAgICAgICAgLy8gQW4gJ2VuZCcgaW5saW5lIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHN0b3BzIHRyYXZlcnNhbCBlbnRpcmVseS5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRBdHRyUmVzdWx0ID0gZ2V0SW5saW5lQXR0cihwYXJlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRBdHRyUmVzdWx0LmZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRBdHRyUmVzdWx0LnN0b3ApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHBhcmVudEF0dHJSZXN1bHQgYXMgeyBmb3VuZDogdHJ1ZTsgc3RvcDogZmFsc2U7IHNvdXJjZTogc3RyaW5nIH0pLnNvdXJjZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRmlyc3QsIGNoZWNrIGZvciBhbiBpbmxpbmUgYXR0cmlidXRlIGRpcmVjdGl2ZSBvbiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gICAgICAgIC8vIEFuICdlbmQnIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCBpdHNlbGYgc3RvcHMgdHJhdmVyc2FsIChyZXR1cm5zIG51bGwpLlxuICAgICAgICBjb25zdCBzZWxmQXR0clJlc3VsdCA9IGdldElubGluZUF0dHIobm9kZSk7XG4gICAgICAgIGlmIChzZWxmQXR0clJlc3VsdC5mb3VuZCkge1xuICAgICAgICAgICAgaWYgKHNlbGZBdHRyUmVzdWx0LnN0b3ApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIChzZWxmQXR0clJlc3VsdCBhcyB7IGZvdW5kOiB0cnVlOyBzdG9wOiBmYWxzZTsgc291cmNlOiBzdHJpbmcgfSkuc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlbiB0cmF2ZXJzZSB0aGUgRE9NIHRvIGZpbmQgYSBwcmVjZWRpbmcgY29tbWVudCBkaXJlY3RpdmUgb3IgYW5jZXN0b3IgYXR0cmlidXRlXG4gICAgICAgIHJldHVybiBmaW5kU291cmNlKG5vZGUpO1xuICAgIH1cblxuICAgIHJ1bihlbmdpbmU6IEVuZ2luZSwgY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogSXNzdWVbXSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBsZXQgcmVzdWx0czogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdHMgPSB0aGlzLnJ1bGUucnVuKGNvbnRleHQsIG9wdGlvbnMsIGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycjogRXJyb3IgPSBlO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlJVTEUgRVhDRVBUSU9OOlwiLHRoaXMucnVsZS5pZCwgY29udGV4dC5kb20ucm9sZVBhdGgsIGVyci5zdGFjayk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgaWYgKCFyZXN1bHRzKSByZXN1bHRzID0gW107XG5cbiAgICAgICAgaWYgKCEocmVzdWx0cyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IFtyZXN1bHRzXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VmFsIDogSXNzdWVbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZW5naW5lLmdldE1lc3NhZ2UodGhpcy5ydWxlLmlkLCByZXN1bHQucmVhc29uSWQsIHJlc3VsdC5tZXNzYWdlQXJncyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5zIGluIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBwYXRoW25zXSA9IGNvbnRleHRbbnNdLnJvbGVQYXRoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBydWxlSWQgPSB0aGlzLnJ1bGUuaWQucmVwbGFjZSgvXiguKilcXCRcXCRcXGQrJC8sIFwiJDFcIik7XG5cbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICBydWxlSWQ6IHJ1bGVJZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIG5vZGU6IGNvbnRleHRbXCJkb21cIl0ubm9kZSxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgICAgIHJ1bGVUaW1lOiBlbmRUaW1lLXN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICByZWFzb25JZDogcmVzdWx0LnJlYXNvbklkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUFyZ3M6IHJlc3VsdC5tZXNzYWdlQXJncyxcbiAgICAgICAgICAgICAgICBhcGlBcmdzOiByZXN1bHQuYXBpQXJncyxcbiAgICAgICAgICAgICAgICBib3VuZHM6IGNvbnRleHRbXCJkb21cIl0uYm91bmRzLFxuICAgICAgICAgICAgICAgIHNuaXBwZXQ6IFdyYXBwZWRSdWxlLmNvbnZlcnROb2RlVG9TbmlwcGV0KGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50KSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IFdyYXBwZWRSdWxlLmNvbnZlcnROb2RlVG9Tb3VyY2UoY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQsIGVuZ2luZS5pc1NvdXJjZU1hcEVuYWJsZWQoKSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmdpbmUgaW1wbGVtZW50cyBJRW5naW5lIHtcbiAgICBwdWJsaWMgc3RhdGljIGdldExhbmd1YWdlcygpIHtcbiAgICAgICAgY29uc3QgZW52ID0gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIChwcm9jZXNzIGFzIGFueSkubm9kZVR5cGUgPT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY7XG4gICAgICAgIC8vIElmIGFsbCBlbHNlIGZhaWxzLCBkZWZhdWx0IHRvIFVTIEVuZ2xpc2hcbiAgICAgICAgbGV0IG5vZGVMYW5nID0gXCJlbi1VU1wiO1xuICAgICAgICBpZiAoZW52KSB7XG4gICAgICAgICAgICBub2RlTGFuZyA9IGVudi5MQU5HIHx8IGVudi5MQU5HVUFHRSB8fCBlbnYuTENfQUxMIHx8IGVudi5MQ19NRVNTQUdFUztcbiAgICAgICAgICAgIGlmIChub2RlTGFuZyAmJiBub2RlTGFuZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZUxhbmcgPSBub2RlTGFuZy5zcGxpdChcIi5cIilbMF0ucmVwbGFjZSgvXy9nLFwiLVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZUxhbmcgPSBcImVuLVVTXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcyB8fCBbbm9kZUxhbmddO1xuICAgIH1cbiAgICBtYXBwZXJzIDogeyBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcHBlciB9ID0ge307XG4gICAgcnVsZU1hcCA6IHsgW2lkOiBzdHJpbmddOiBSdWxlIH0gPSB7fTtcbiAgICB3cmFwcGVkUnVsZU1hcCA6IHsgW2lkOiBzdHJpbmddOiBXcmFwcGVkUnVsZSB9ID0ge307XG4gICAgbmxzTWFwIDogTmxzTWFwID0ge31cbiAgICBoZWxwTWFwIDogSGVscE1hcCA9IHt9XG4gICAgc291cmNlTWFwRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBpbmNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgcHJpdmF0ZSBleGNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIE5lZWQgYSBET00gTWFwcGVyIGFzIGEgbWluaW11bVxuICAgICAgICB0aGlzLmFkZE1hcHBlcihuZXcgRE9NTWFwcGVyKCkpO1xuICAgIH1cblxuICAgIHJ1bihyb290OiBEb2N1bWVudCB8IE5vZGUsIG9wdGlvbnM/OiB7fSk6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJudWxsIGRvY3VtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb290Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcm9vdCA9IChyb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5vd25lckRvY3VtZW50ICYmICgocm9vdC5vd25lckRvY3VtZW50IGFzIGFueSkuUFRfQ0hFQ0tfSElEREVOX0NPTlRFTlQgPSBmYWxzZSk7XG4gICAgICAgIGNvbnN0IG51bU5vZGVzVmlzaXRlZCA9IENhY2hlVXRpbC5jbGVhckNhY2hlcyhyb290KTtcbiAgICAgICAgY29uc3Qgd2Fsa2VyID0gbmV3IERPTVdhbGtlcihyb290LCBmYWxzZSwgcm9vdCwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHJldFZhbCA6IFJlcG9ydCA9IHtcbiAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgbnVtRXhlY3V0ZWQ6IDAsXG4gICAgICAgICAgICBydWxlVGltZTogMCxcbiAgICAgICAgICAgIHRvdGFsVGltZTogMFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7ICAgICAgICBcbiAgICAgICAgLy8gUmVzZXQgdGhlIHJvbGUgbWFwcGVyc1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWVzcGFjZSBpbiB0aGlzLm1hcHBlcnMpIHtcbiAgICAgICAgICAgIHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLnJlc2V0KHJvb3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29udGV4dCBkZXRlY3RvclxuICAgICAgICBsZXQgY3VycmVudE5vZGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBsYXN0UmVwb3J0ZWRQZXJjZW50ID0gLTE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlQ291bnQrKztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gUmVwb3J0IHByb2dyZXNzIGF0IGVhY2ggcGVyY2VudGFnZSBtaWxlc3RvbmVcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQZXJjZW50ID0gTWF0aC5mbG9vcigoY3VycmVudE5vZGVDb3VudCAvIG51bU5vZGVzVmlzaXRlZCkgKiAxMDApO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQZXJjZW50ID4gbGFzdFJlcG9ydGVkUGVyY2VudCkge1xuICAgICAgICAgICAgICAgIGlmIChudW1Ob2Rlc1Zpc2l0ZWQgPiAxMDAwMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoY3VycmVudFBlcmNlbnQgPiA2KSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFByb2dyZXNzOiAke2N1cnJlbnRQZXJjZW50fSUgKCR7Y3VycmVudE5vZGVDb3VudH0vJHtudW1Ob2Rlc1Zpc2l0ZWR9IG5vZGVzKWApO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBydWxlVGltZXMgPSByZXRWYWwucmVzdWx0cy5yZWR1Y2UoKHByZXYsIGN1cikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgcHJldltjdXIucnVsZUlkXSA9IChwcmV2W2N1ci5ydWxlSWRdIHx8IDApK2N1ci5ydWxlVGltZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgICAgICAgICAvLyB9LCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciAoY29uc3QgcnVsZUlkIGluIHJ1bGVUaW1lcykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWYgKHJ1bGVUaW1lc1tydWxlSWRdID4gMTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhgJHtydWxlSWR9OiAke3J1bGVUaW1lc1tydWxlSWRdfWApO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFzdFJlcG9ydGVkUGVyY2VudCA9IGN1cnJlbnRQZXJjZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IHRoZSBjb250ZXh0IGluZm9ybWF0aW9uIGZyb20gdGhlIHJ1bGUgbWFwcGVyc1xuICAgICAgICAgICAgY29uc3QgY29udGV4dEhpZXJhcmNoaWVzIDogUnVsZUNvbnRleHRIaWVyYXJjaHkgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIGluIHRoaXMubWFwcGVycykge1xuICAgICAgICAgICAgICAgIGlmICghd2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dEhpZXJhcmNoaWVzW25hbWVzcGFjZV0gPSB0aGlzLm1hcHBlcnNbbmFtZXNwYWNlXS5vcGVuU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmFtZXNwYWNlID09PSBcImRvbVwiICYmIHdhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBlbGVtID0gd2Fsa2VyLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIChpZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHJvb3Qub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkgPT09IGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGV4dEhpZXJhcmNoaWVzW1wiZG9tXCJdW2NvbnRleHRIaWVyYXJjaGllc1tcImRvbVwiXS5sZW5ndGgtMV0ucm9sZVBhdGggPSBcIi8vKltAaWQ9J1wiK2lkK1wiJ11cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0SGllcmFyY2hpZXNbbmFtZXNwYWNlXSA9IHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLmNsb3NlU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHdhbGtlci5ub2RlLm5vZGVUeXBlICE9PSAxMSBcbiAgICAgICAgICAgICAgICAmJiAoVmlzVXRpbC5pc05vZGVWaXNpYmxlKHdhbGtlci5ub2RlKVxuICAgICAgICAgICAgICAgICAgICAvLyB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImhlYWRcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcIm1ldGFcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgd2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicGFyYW1cIlxuICAgICAgICAgICAgICAgICAgICB8fCAhRE9NVXRpbC5nZXRBbmNlc3Rvcih3YWxrZXIubm9kZSwgW1wiYm9keVwiXSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGV4dCA6IFJ1bGVDb250ZXh0ID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBucyBpbiBjb250ZXh0SGllcmFyY2hpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnNIaWVyID0gY29udGV4dEhpZXJhcmNoaWVzW25zXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdEhpZXIgPSBuc0hpZXJbbnNIaWVyLmxlbmd0aC0xXTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFtuc10gPSBsYXN0SGllcjsgXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoaW5nUnVsZXMgPSB0aGlzLmdldE1hdGNoaW5nUnVsZXMoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwTWF0Y2ggPSB7fVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2hpbmdSdWxlIG9mIG1hdGNoaW5nUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZ1bGZpbGxzRGVwZW5kZW5jaWVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgbWF0Y2hpbmdSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcE1hdGNoW2RlcF0pIGZ1bGZpbGxzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGZpbGxzRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA6IElzc3VlW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbWF0Y2hpbmdSdWxlLnJ1bih0aGlzLCBjb250ZXh0LCBvcHRpb25zLCBjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcHBlciBzaG93cyBlcnJvciBpbiBjb25zb2xlLiBTa2lwIHRoaXMgcnVsZSBhcyBOL0FcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGtpbGwgdGhlIGVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb3V0IG9mIHNjb3BlLCBpdCBmdWxmaWxscyB0aGUgZGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwTWF0Y2hbbWF0Y2hpbmdSdWxlLnJ1bGUuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnJ1bGVUaW1lICs9IHJlc3VsdC5ydWxlVGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwubnVtRXhlY3V0ZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnZhbHVlWzFdID09PSBlUnVsZUNvbmZpZGVuY2UuUEFTUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBNYXRjaFtyZXN1bHQucnVsZUlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSk7XG4gICAgICAgIENhY2hlVXRpbC5jbGVhckNhY2hlcyhyb290KTtcbiAgICAgICAgcmV0VmFsLnRvdGFsVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLXN0YXJ0O1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldFZhbCk7XG4gICAgfVxuXG4gICAgZW5hYmxlUnVsZXMocnVsZUlkczogc3RyaW5nW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bGVNYXBbcnVsZUlkXS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBydWxlSWQgb2YgcnVsZUlkcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZU1hcCkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJXQVJOSU5HOiBSdWxlIElkXCIscnVsZUlkLFwiY291bGQgbm90IGJlIGVuYWJsZWQuXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bGVNYXBbcnVsZUlkXS5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFJ1bGUocnVsZUlkOiBzdHJpbmcpOiBSdWxlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVsZU1hcFtydWxlSWRdO1xuICAgIH1cblxuICAgIGdldFJ1bGVzSWRzKCkgOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChydWxlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgYWRkUnVsZXMocnVsZXM6IFJ1bGVbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUnVsZShydWxlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb3J0UnVsZXMoKTtcbiAgICB9XG5cbiAgICBhZGRSdWxlKHJ1bGU6IFJ1bGUsIHNraXBTb3J0PzogYm9vbGVhbikge1xuICAgICAgICBsZXQgY3R4cyA6Q29udGV4dFtdID0gQ29udGV4dC5wYXJzZShydWxlLmNvbnRleHQpO1xuICAgICAgICBsZXQgaWR4ID0gMDtcbiAgICAgICAgY29uc3QgcnVsZUlkID0gcnVsZS5pZDtcbiAgICAgICAgaWYgKHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiV0FSTklORzogUnVsZVwiLHJ1bGVJZCxcImFscmVhZHkgYWRkZWQgdG8gZW5naW5lLiBJZ25vcmluZy4uLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJ1bGVNYXBbcnVsZUlkXSA9IHJ1bGU7XG4gICAgICAgIGZvciAoY29uc3QgY3R4IG9mIGN0eHMpIHtcbiAgICAgICAgICAgIGxldCB3cmFwSWQgPSBydWxlSWQ7XG4gICAgICAgICAgICBpZiAoaWR4ID49IDEpIHtcbiAgICAgICAgICAgICAgICB3cmFwSWQgPSBydWxlSWQrXCIkJFwiK2lkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICsraWR4O1xuICAgICAgICAgICAgbGV0IHdyYXBwZWRSdWxlID0gbmV3IFdyYXBwZWRSdWxlKHJ1bGUsY3R4KTtcbiAgICAgICAgICAgIHRoaXMud3JhcHBlZFJ1bGVNYXBbd3JhcElkXSA9IHdyYXBwZWRSdWxlO1xuICAgICAgICAgICAgbGV0IHBhcnRzID0gd3JhcHBlZFJ1bGUucGFyc2VkSW5mby5jb250ZXh0SW5mbztcbiAgICAgICAgICAgIGxldCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTtcbiAgICAgICAgICAgIGxldCB0cmlnZ2VyUm9sZSA9IGxhc3RQYXJ0Lm5hbWVzcGFjZStcIjpcIitsYXN0UGFydC5yb2xlO1xuICAgICAgICAgICAgaWYgKGxhc3RQYXJ0LmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXSA9IHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXSB8fCBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmluY2xSdWxlc1t0cmlnZ2VyUm9sZV0ucHVzaCh3cmFwcGVkUnVsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXSA9IHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXSB8fCBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmV4Y2xSdWxlc1t0cmlnZ2VyUm9sZV0ucHVzaCh3cmFwcGVkUnVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFza2lwU29ydCkge1xuICAgICAgICAgICAgdGhpcy5fc29ydFJ1bGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlbmFibGVTb3VyY2VNYXAoZW5hYmxlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc291cmNlTWFwRW5hYmxlZCA9IGVuYWJsZTtcbiAgICB9XG5cbiAgICBpc1NvdXJjZU1hcEVuYWJsZWQoKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VNYXBFbmFibGVkO1xuICAgIH1cbiAgICBcbiAgICBfc29ydFJ1bGVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJvbGUgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3JvbGVdLnNvcnQoKHJ1bGVBOiBXcmFwcGVkUnVsZSwgcnVsZUI6IFdyYXBwZWRSdWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQSA9IHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQiA9IHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgLy8gSWYgQiBkZXBlbmRzIG9uIEEsIHNvcnQgQSBiZWZvcmUgQlxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBCICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVBLnJ1bGUuaWQpKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgLy8gSWYgQSBkZXBlbmRzIG9uIEIsIHNvcnQgQiBiZWZvcmUgQVxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBBICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVCLnJ1bGUuaWQpKSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJvbGUgaW4gdGhpcy5leGNsUnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3JvbGVdLnNvcnQoKHJ1bGVBOiBXcmFwcGVkUnVsZSwgcnVsZUI6IFdyYXBwZWRSdWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQSA9IHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRGVwQiA9IHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgLy8gSWYgQiBkZXBlbmRzIG9uIEEsIHNvcnQgQSBiZWZvcmUgQlxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBCICYmIHJ1bGVCLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVBLnJ1bGUuaWQpKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgLy8gSWYgQSBkZXBlbmRzIG9uIEIsIHNvcnQgQiBiZWZvcmUgQVxuICAgICAgICAgICAgICAgIGlmIChoYXNEZXBBICYmIHJ1bGVBLnJ1bGUuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHJ1bGVCLnJ1bGUuaWQpKSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZE5sc01hcChtYXA6IE5sc01hcCkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtYXApIHtcbiAgICAgICAgICAgIHRoaXMubmxzTWFwW2tleV0gPSBtYXBba2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEhlbHBNYXAobWFwOiBIZWxwTWFwKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgdGhpcy5oZWxwTWFwW2tleV0gPSBtYXBba2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE1lc3NhZ2UocnVsZUlkOiBzdHJpbmcsIHJ1bGVJZHg6IG51bWJlciB8IHN0cmluZywgbXNnQXJncz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHNwbGl0dGVyID0gcnVsZUlkLmluZGV4T2YoXCIkJFwiKTtcbiAgICAgICAgaWYgKHNwbGl0dGVyID49IDApIHtcbiAgICAgICAgICAgIHJ1bGVJZCA9IHJ1bGVJZC5zdWJzdHJpbmcoMCxzcGxpdHRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMubmxzTWFwKSkgcmV0dXJuIHJ1bGVJZDtcbiAgICAgICAgbGV0IG1lc3NhZ2VUZW1wbGF0ZSA9IHRoaXMubmxzTWFwW3J1bGVJZF1bcnVsZUlkeCB8fCAwXTtcbiAgICAgICAgaWYgKCFtZXNzYWdlVGVtcGxhdGUpIHJldHVybiBydWxlSWQrXCJfXCIrcnVsZUlkeDtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VUZW1wbGF0ZS5yZXBsYWNlKC9cXHsoXFxkKylcXH0vZyxcbiAgICAgICAgICAgIChtYXRjaGVkU3RyLCBtYXRjaGVkTnVtLCBtYXRjaGVkSW5kZXgpID0+IG1zZ0FyZ3NbbWF0Y2hlZE51bV1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRIZWxwKHJ1bGVJZDogc3RyaW5nLCByZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBhcmNoaXZlSWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIWFyY2hpdmVJZCkge1xuICAgICAgICAgICAgLy8gU2V0IHRvIHRoZSBsYXRlc3RcbiAgICAgICAgICAgIGFyY2hpdmVJZCA9IFwibGF0ZXN0XCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke0NvbmZpZy5oZWxwUm9vdH0vJHthcmNoaXZlSWR9L2RvYyR7dGhpcy5nZXRIZWxwUmVsKHJ1bGVJZCwgcmVhc29uSWQpfWA7XG4gICAgfVxuXG4gICAgZ2V0SGVscFJlbChydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHNwbGl0dGVyID0gcnVsZUlkLmluZGV4T2YoXCIkJFwiKTtcbiAgICAgICAgaWYgKHNwbGl0dGVyID49IDApIHtcbiAgICAgICAgICAgIHJ1bGVJZCA9IHJ1bGVJZC5zdWJzdHJpbmcoMCxzcGxpdHRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMuaGVscE1hcCkpIHJldHVybiBydWxlSWQ7XG4gICAgICAgIHJ1bGVJZHggPSBydWxlSWR4IHx8IDA7XG4gICAgICAgIGxldCBoZWxwU3RyID0gbnVsbDtcbiAgICAgICAgaWYgKHJ1bGVJZHggaW4gdGhpcy5oZWxwTWFwW3J1bGVJZF0pIHtcbiAgICAgICAgICAgIGhlbHBTdHIgPSB0aGlzLmhlbHBNYXBbcnVsZUlkXVtydWxlSWR4IHx8IDBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVscFN0ciA9IHRoaXMuaGVscE1hcFtydWxlSWRdWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoZWxwU3RyKSByZXR1cm4gcnVsZUlkK1wiX1wiK3J1bGVJZHg7XG4gICAgICAgIHJldHVybiBoZWxwU3RyO1xuICAgIH1cblxuICAgIGFkZE1hcHBlcihtYXBwZXI6IElNYXBwZXIpIHtcbiAgICAgICAgdGhpcy5tYXBwZXJzW21hcHBlci5nZXROYW1lc3BhY2UoKV0gPSBtYXBwZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbWF0Y2gocnVsZTogV3JhcHBlZFJ1bGUsXG4gICAgICAgIGNvbnRleHRIaWVyOiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBib29sZWFuXG4gICAge1xuICAgICAgICBsZXQgcnVsZVBhcnRzID0gcnVsZS5wYXJzZWRJbmZvLmNvbnRleHRJbmZvO1xuICAgICAgICBsZXQgcGFydElkeCA9IHJ1bGVQYXJ0cy5sZW5ndGgtMTtcbiAgICAgICAgbGV0IGN1ck5TID0gcnVsZVBhcnRzW3BhcnRJZHhdLm5hbWVzcGFjZTtcbiAgICAgICAgbGV0IGN1ckhpZXIgPSBjb250ZXh0SGllcltjdXJOU11bY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aC0xXTtcbiAgICAgICAgY29uc3QgY29udGV4dE5vZGUgPSBjdXJIaWVyLm5vZGU7XG5cbiAgICAgICAgLy8gSWYgdGhlIGVuZCBvZiB0aGUgcnVsZSBwYXJ0IGRvZXNuJ3QgbWF0Y2ggdGhlIGVuZCBvZiB0aGUgaGllcmFyY2h5LCB3ZSBkb24ndCBoYXZlIGEgbWF0Y2hcbiAgICAgICAgaWYgKCFydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZXJlIHdhcyBvbmx5IG9uZSBwYXJ0LCB3ZSBoYXZlIGEgbWF0Y2hcbiAgICAgICAgaWYgKHJ1bGVQYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5lZWQgdG8gZGVhbCB3aXRoIHBhcmVudCBwYXJ0cy4gVG8gd2FsayB0aGUgaGllcmFyY2h5LCB0aGVzZSBuZWVkIHRvIGJlXG4gICAgICAgIC8vIGFsbCBpbiB0aGUgc2FtZSBuYW1lc3BhY2UuIENvbmZpcm0gdGhhdCBpcyB0cnVlLlxuICAgICAgICBjdXJOUyA9IHJ1bGVQYXJ0c1swXS5uYW1lc3BhY2U7XG4gICAgICAgIGN1ckhpZXIgPSBjb250ZXh0SGllcltjdXJOU11bY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aC0xXTtcbiAgICAgICAgLS1wYXJ0SWR4O1xuICAgICAgICBpZiAocnVsZVBhcnRzLnNsaWNlKDAsIHJ1bGVQYXJ0cy5sZW5ndGgtMSkuc29tZShwYXJ0ID0+IHBhcnQubmFtZXNwYWNlICE9PSBjdXJOUykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtFUlJPUl0gUnVsZSAke3J1bGUucnVsZS5pZH0gaGFzIGluY29uc2l0ZW50IHBhcmVudCBuYW1lc3BhY2VzYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBub2RlIG1hdGNoZXMgdGhlIGVuZCBvZiB0aGUgaGllcmFyY2h5LCBtb3ZlIHVwIHBhc3QgaXQsIG90aGVyd2lzZSwgc3RhcnQgYXQgdGhlIGVuZFxuICAgICAgICBsZXQgaGllcklkeCA9IGNvbnRleHRIaWVyW2N1ck5TXS5sZW5ndGggLSAoY3VySGllci5ub2RlLmlzU2FtZU5vZGUoY29udGV4dE5vZGUpID8gMiA6IDEpO1xuICAgICAgICB3aGlsZSAoaGllcklkeCA+PSAwICYmIHBhcnRJZHggPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFydCA9IHJ1bGVQYXJ0c1twYXJ0SWR4XTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXNQYXJ0ID0gcnVsZVBhcnRzW3BhcnRJZHhdLm1hdGNoZXMoY29udGV4dEhpZXIsIGhpZXJJZHgpO1xuICAgICAgICAgICAgaWYgKHBhcnQuY29ubmVjdG9yID09PSBcIj5cIikge1xuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0IHBhcmVudCBjaGVjayBhbmQgZG9lc24ndCBtYXRjaFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0IHBhcmVudCBjaGVjayBhbmQgZG9lcyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgICAgICAgICAgICAgIC0taGllcklkeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQuY29ubmVjdG9yID09PSBcIiBcIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdXNpdmUgYW5jZXN0b3IgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXNQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZG9lc24ndCBtYXRjaCwganVzdCBtb3ZlIHVwIHRoZSByb2xlIGhpZXJhcmNoeVxuICAgICAgICAgICAgICAgICAgICAtLWhpZXJJZHg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVzaXZlIGFuY2VzdG9yIG1hdGNoIGFuZCBjdXJyZW50IG1hdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4Y2x1c2l2ZSBhbmNlc3RvciBtYXRjaCBhbmQgY3VycmVudCBkb2Vzbid0IG1hdGNoIC0gY2hlY2sgZm9yIG90aGVyIGFuY2VzdG9yc1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50TWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc2VhcmNoSWR4ID0gaGllcklkeC0xOyAhcGFyZW50TWF0Y2ggJiYgc2VhcmNoSWR4ID49IDA7IC0tc2VhcmNoSWR4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNYXRjaCA9ICFydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgc2VhcmNoSWR4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50TWF0Y2gpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSAtLXBhcnRJZHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IGNvbm5lY3RvciBcIitwYXJ0LmNvbm5lY3RvcitcIiBpcyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0SWR4ID09PSAtMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1hdGNoaW5nUnVsZXMoY3R4SGllciA6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IFdyYXBwZWRSdWxlW10ge1xuICAgICAgICBsZXQgbWF0Y2hlcyA6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gYWRkTWF0Y2hlcyhydWxlczogV3JhcHBlZFJ1bGVbXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUucnVsZS5lbmFibGVkICYmIEVuZ2luZS5tYXRjaChydWxlLCBjdHhIaWVyKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2gocnVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbnMgaW4gY3R4SGllcikge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBucytcIjpcIisoY3R4SGllcltuc10ubGVuZ3RoID4gMCA/IGN0eEhpZXJbbnNdW2N0eEhpZXJbbnNdLmxlbmd0aC0xXS5yb2xlIDogXCJub25lXCIpO1xuICAgICAgICAgICAgaWYgKHJvbGUgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuaW5jbFJ1bGVzW3JvbGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgeFJvbGUgaW4gdGhpcy5leGNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoeFJvbGUgIT09IHJvbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkTWF0Y2hlcyh0aGlzLmV4Y2xSdWxlc1t4Um9sZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyb2xlICE9PSBucytcIjpub25lXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZS5zdGFydHNXaXRoKG5zK1wiOi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5zK1wiOi8qXCIgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbbnMrXCI6LypcIl0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnMrXCI6KlwiIGluIHRoaXMuaW5jbFJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuaW5jbFJ1bGVzW25zK1wiOipcIl0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERlcHMobWF0Y2hlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU29ydHMgdGhlIHJ1bGVzIGluIG9yZGVyIHRvIGV4ZWN1dGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb3JyZWN0IG9yZGVyXG4gICAgICogQHBhcmFtIGluUnVsZXMgTGlzdCBvZiB3cmFwcGVkIHJ1bGVzIHRvIHNvcnRcbiAgICAgKiBAcmV0dXJucyBTb3J0ZWQgbGlzdCBvZiB3cmFwcGVkIHJ1bGVzXG4gICAgICovXG4gICAgc29ydERlcHMoaW5SdWxlczogV3JhcHBlZFJ1bGVbXSkge1xuICAgICAgICBsZXQgZGVwUnVsZXM6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGluUnVsZXMpIHtcbiAgICAgICAgICAgIGRlcFJ1bGVzLnB1c2gocnVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCByZXRWYWwgOiBXcmFwcGVkUnVsZVtdID0gW107XG4gICAgICAgIGxldCBpZFRvUnVsZSA9IHt9O1xuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHJ1bGVzLiBJZiB0aGF0IHJ1bGUncyBkZXBlbmRlbmNpZXMgY2FuIGJlIG1ldCBieSBydWxlcyBhbHJlYWR5IGluIHRoZSBsaXN0LCBhZGQgaXQgdG8gdGhlIGxpc3RcbiAgICAgICAgLy8gUmVwZWF0IHVudGlsIG5vIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlIHNhdGlzZmllZCBsaXN0XG4gICAgICAgIC8vIElmIGEgcnVsZSBjYW5ub3QgYmUgc2F0aXNmaWVkLCBpdCB3aWxsIG5ldmVyIGV4ZWN1dGUsIHNvIGl0IGNhbiBiZSBkcm9wcGVkLlxuICAgICAgICBsZXQgY2hhbmdlID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxkZXBSdWxlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwUnVsZSA9IGRlcFJ1bGVzW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKGRlcFJ1bGUucnVsZS5pZCBpbiBpZFRvUnVsZSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IGFsbE1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwUnVsZS5ydWxlLmRlcGVuZGVuY2llcyAmJiBkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShkZXBJZCBpbiBpZFRvUnVsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIChkZXBSdWxlLnJ1bGUucHJlcmVxcyAmJiBkZXBSdWxlLnJ1bGUucHJlcmVxcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGZvciAoY29uc3QgZGVwSWQgb2YgZGVwUnVsZS5ydWxlLnByZXJlcXMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGlmICghKGRlcElkIGluIGlkVG9SdWxlKSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgaWYgKGFsbE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGRlcFJ1bGUpO1xuICAgICAgICAgICAgICAgICAgICBpZFRvUnVsZVtkZXBSdWxlLnJ1bGUuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVwUnVsZXMuc3BsaWNlKGlkeC0tLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGNoYW5nZSk7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZXhwb3J0IGNsYXNzIENvbmZpZyB7XG4gICAgc3RhdGljIERFQlVHID0gZmFsc2U7XG4gICAgc3RhdGljIGhlbHBSb290ID0gXCJodHRwczovL2FibGUuaWJtLmNvbS9ydWxlcy9hcmNoaXZlc1wiO1xufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uTWFwcGVyIH0gZnJvbSBcIi4uL2NvbW1vbi9Db21tb25NYXBwZXJcIjtcbmltcG9ydCB7IEJvdW5kcyB9IGZyb20gXCIuLi9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBET01NYXBwZXIgZXh0ZW5kcyBDb21tb25NYXBwZXIge1xuICAgIGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBnZXROYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiZG9tXCJcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlcyhub2RlOiBOb2RlKSA6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB7fTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGVsZW0uYXR0cmlidXRlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ckluZm8gPSBlbGVtLmF0dHJpYnV0ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICByZXRWYWxbYXR0ckluZm8ubmFtZS50b0xvd2VyQ2FzZSgpXSA9IGF0dHJJbmZvLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdldCBzY2FsZWQgYm91bmRzIGZvciBzY3JlZW5zaG90IGV0Yy4gYWRqdXN0ZWQgZm9yIGRldmljZVBpeGVsUmF0aW8gYW5kIHNjcm9sbFxuICAgICAqIEBwYXJhbSBub2RlIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGdldEJvdW5kcyhub2RlOiBOb2RlKSA6IEJvdW5kcyB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxIC8qTm9kZS5FTEVNRU5UX05PREUqLykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgY2FjaGVkQm91bmRzID0gQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUgYXMgRWxlbWVudCwgXCJET01NYXBwZXJfQm91bmRzXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0eXBlb2YgY2FjaGVkQm91bmRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQm91bmRzO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgYWRqdXN0bWVudCA9IDE7XG4gICAgICAgIGlmIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5kZXZpY2VQaXhlbFJhdGlvKSB7XG4gICAgICAgICAgICBhZGp1c3RtZW50ID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJvdW5kcyA9IChub2RlIGFzIEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIC8vIERvIGEgY2hlY2sgd2hldGhlciBib3VuZHMgaGFzIHZhbHVlIGFzIHdlIHVzZSBkaWZmZXJlbnQgdG9vbCAoaHRtbFVuaXQsIGJyb3dzZXIpIHRvIGNhbGwgdGhpcyBmdW5jdGlvblxuICAgICAgICBpZiAoYm91bmRzKSB7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsWCA9IG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuc2Nyb2xsWCB8fCAwO1xuICAgICAgICAgICAgbGV0IHNjcm9sbFkgPSBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LnNjcm9sbFkgfHwgMDtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IHtcbiAgICAgICAgICAgICAgICBcImxlZnRcIjogTWF0aC5jZWlsKChib3VuZHMubGVmdCArIHNjcm9sbFgpICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgXCJ0b3BcIjogTWF0aC5jZWlsKChib3VuZHMudG9wICsgc2Nyb2xsWSkgKiBhZGp1c3RtZW50KSxcbiAgICAgICAgICAgICAgICBcImhlaWdodFwiOiBNYXRoLmNlaWwoYm91bmRzLmhlaWdodCAqIGFkanVzdG1lbnQpLFxuICAgICAgICAgICAgICAgIFwid2lkdGhcIjogTWF0aC5jZWlsKGJvdW5kcy53aWR0aCAqIGFkanVzdG1lbnQpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUgYXMgRWxlbWVudCwgXCJET01NYXBwZXJfQm91bmRzXCIsIHJldCk7XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdldCByZWFsIENTUyBib3VuZHMgaW4gY3NzIHBpeGVscywgYWRqdXN0ZWQgZm9yIHNjcm9sbCBvbmx5XG4gICAgICogQHBhcmFtIG5vZGUgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2V0VW5hZGp1c3RlZEJvdW5kcyhub2RlOiBOb2RlKSA6IEJvdW5kcyB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxIC8qTm9kZS5FTEVNRU5UX05PREUqLykgcmV0dXJuIG51bGw7XG5cblxuICAgICAgICBjb25zdCBjYWNoZWRCb3VuZHMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSBhcyBFbGVtZW50LCBcIkRPTU1hcHBlcl9VbmFkanVzdGVkQm91bmRzXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0eXBlb2YgY2FjaGVkQm91bmRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQm91bmRzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm91bmRzID0gKG5vZGUgYXMgRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIC8vIGFkanVzdGVkIGZvciBzY3JvbGwgaWYgYW55XG4gICAgICAgIGlmIChib3VuZHMpIHtcbiAgICAgICAgICAgIGxldCBzY3JvbGxYID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxYIHx8IDA7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsWSA9IG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuc2Nyb2xsWSB8fCAwO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgIFwibGVmdFwiOiBNYXRoLmNlaWwoYm91bmRzLmxlZnQgKyBzY3JvbGxYKSxcbiAgICAgICAgICAgICAgICBcInRvcFwiOiBNYXRoLmNlaWwoYm91bmRzLnRvcCArIHNjcm9sbFkpLFxuICAgICAgICAgICAgICAgIFwiaGVpZ2h0XCI6IE1hdGguY2VpbChib3VuZHMuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICBcIndpZHRoXCI6IE1hdGguY2VpbChib3VuZHMud2lkdGgpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUgYXMgRWxlbWVudCwgXCJET01NYXBwZXJfVW5hZGp1c3RlZEJvdW5kc1wiLCByZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuL0RPTVdhbGtlclwiO1xuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgcHJvdmlkaW5nIGhlbHBlciBtZXRob2RzIGZvciBET00gbWFuaXB1bGF0aW9uIGFuZCB0cmF2ZXJzYWwgb3BlcmF0aW9ucy5cbiAqIFVzZWQgdGhyb3VnaG91dCB0aGUgYWNjZXNzaWJpbGl0eSBjaGVja2VyIGVuZ2luZSB0byBuYXZpZ2F0ZSBhbmQgYW5hbHl6ZSBET00gc3RydWN0dXJlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIERPTVV0aWwge1xuICAgIFxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGdpdmVuIG5vZGUgaGFzIGFuIGFuY2VzdG9yIGVsZW1lbnQgd2l0aCBhIG5vZGUgbmFtZSBtYXRjaGluZyBhbnkgb2YgdGhlIHByb3ZpZGVkIG5hbWVzLlxuICAgICAqIFRyYXZlcnNlcyB1cCB0aGUgRE9NIHRyZWUgZnJvbSB0aGUgZ2l2ZW4gbm9kZSB1bnRpbCBhIG1hdGNoIGlzIGZvdW5kIG9yIHRoZSByb290IGlzIHJlYWNoZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSAtIFRoZSBzdGFydGluZyBET00gbm9kZSB0byBjaGVja1xuICAgICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIG5vZGUgbmFtZXMgKHRhZyBuYW1lcykgdG8gc2VhcmNoIGZvciBpbiB1cHBlcmNhc2UgKGUuZy4sIFsnVEFCTEUnLCAnRElWJ10pXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhbiBhbmNlc3RvciB3aXRoIGEgbWF0Y2hpbmcgbmFtZSBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgc3RhdGljIGhhc1BhcmVudChub2RlOiBOb2RlLCBuYW1lczpzdHJpbmdbXSkge1xuICAgICAgICBsZXQgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICB3aGlsZSAocCAmJiAhbmFtZXMuaW5jbHVkZXMocC5ub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIHAgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgZmlyc3QgYW5jZXN0b3IgZWxlbWVudCB0aGF0IG1hdGNoZXMgYW55IG9mIHRoZSBwcm92aWRlZCBub2RlIG5hbWVzIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAgICAgKiBTaW1pbGFyIHRvIGhhc1BhcmVudCBidXQgcmV0dXJucyB0aGUgYWN0dWFsIGVsZW1lbnQgcmVmZXJlbmNlIGFuZCBwZXJmb3JtcyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSAtIFRoZSBzdGFydGluZyBET00gbm9kZVxuICAgICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIGxvd2VyY2FzZSBub2RlIG5hbWVzIHRvIHNlYXJjaCBmb3IgKGUuZy4sIFsndGFibGUnLCAnZGl2J10pXG4gICAgICogQHJldHVybnMgVGhlIG1hdGNoaW5nIGFuY2VzdG9yIGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZSBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRBbmNlc3Rvcihub2RlOiBOb2RlLCBuYW1lczpzdHJpbmdbXSkge1xuICAgICAgICBsZXQgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICB3aGlsZSAocCAmJiAhbmFtZXMuaW5jbHVkZXMocC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdHdvIG5vZGVzIGFyZSB0aGUgc2FtZSBub2RlLCB3aXRoIGZhbGxiYWNrIHN0cmF0ZWdpZXMgZm9yIGRpZmZlcmVudCBicm93c2VyIGVudmlyb25tZW50cy5cbiAgICAgKiBVc2VzIG11bHRpcGxlIGNvbXBhcmlzb24gbWV0aG9kcyBmb3IgY3Jvc3MtYnJvd3NlciBjb21wYXRpYmlsaXR5OlxuICAgICAqIDEuIFN0cmljdCBlcXVhbGl0eSAoPT09KVxuICAgICAqIDIuIGlzU2FtZU5vZGUoKSBtZXRob2QgaWYgYXZhaWxhYmxlXG4gICAgICogMy4gY29tcGFyZURvY3VtZW50UG9zaXRpb24oKSAocmV0dXJucyAwIGlmIHNhbWUgbm9kZSlcbiAgICAgKiA0LiBSZXR1cm5zIHRydWUgYXMgbGFzdCByZXNvcnQgaWYgbm8gY29tcGFyaXNvbiBtZXRob2QgaXMgYXZhaWxhYmxlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYSAtIEZpcnN0IG5vZGUgdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSBiIC0gU2Vjb25kIG5vZGUgdG8gY29tcGFyZVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgbm9kZXMgYXJlIHRoZSBzYW1lLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgc2FtZU5vZGUoYTogTm9kZSwgYjogTm9kZSkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGEuaXNTYW1lTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGEuaXNTYW1lTm9kZShiKTtcbiAgICAgICAgfSBlbHNlIGlmIChhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCAtIHRyeSBvdXIgYmVzdFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIHdoaXRlc3BhY2UgaW4gYSBzdHJpbmcgYnkgcmVwbGFjaW5nIGFsbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcbiAgICAgKiAoc3BhY2VzLCB0YWJzLCBjYXJyaWFnZSByZXR1cm5zLCBuZXdsaW5lcykgd2l0aCBzaW5nbGUgc3BhY2VzIGFuZCBjb2xsYXBzaW5nXG4gICAgICogbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIGludG8gb25lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHMgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGNsZWFuXG4gICAgICogQHJldHVybnMgVGhlIGNsZWFuZWQgc3RyaW5nIHdpdGggbm9ybWFsaXplZCB3aGl0ZXNwYWNlXG4gICAgICogQGV4YW1wbGUgXCJIZWxsb1xcblxcdCAgV29ybGRcIiDihpIgXCJIZWxsbyBXb3JsZFwiXG4gICAgICovXG4gICAgc3RhdGljIGNsZWFuV2hpdGVzcGFjZShzOiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHMucmVwbGFjZSgvWyBcXHRcXHJcXG5dL2csIFwiIFwiKS5yZXBsYWNlKC8gKy9nLFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZXMgbXVsdGlwbGUgY29uc2VjdXRpdmUgc3BhY2VzIGludG8gYSBzaW5nbGUgc3BhY2UuXG4gICAgICogVW5saWtlIGNsZWFuV2hpdGVzcGFjZSwgb25seSBoYW5kbGVzIHNwYWNlcywgbm90IG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBsaWtlIHRhYnMgb3IgbmV3bGluZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcyAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gY2xlYW5cbiAgICAgKiBAcmV0dXJucyBUaGUgc3RyaW5nIHdpdGggY29sbGFwc2VkIHNwYWNlc1xuICAgICAqL1xuICAgIHN0YXRpYyBjbGVhblNwYWNlKHM6IHN0cmluZykgOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsID0gcy5yZXBsYWNlKC8gKy9nLFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHR3byBlbGVtZW50cyAodHlwaWNhbGx5IHRhYmxlIGNlbGxzKSBiZWxvbmcgdG8gdGhlIHNhbWUgdGFibGUgZWxlbWVudC5cbiAgICAgKiBGaW5kcyB0aGUgdGFibGUgYW5jZXN0b3IgZm9yIGVhY2ggZWxlbWVudCBhbmQgY29tcGFyZXMgdGhlbSB1c2luZyBzYW1lTm9kZSgpLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQxIC0gRmlyc3QgZWxlbWVudCB0byBjaGVja1xuICAgICAqIEBwYXJhbSBlbGVtZW50MiAtIFNlY29uZCBlbGVtZW50IHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBib3RoIGVsZW1lbnRzIHNoYXJlIHRoZSBzYW1lIHRhYmxlIGFuY2VzdG9yLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNJblNhbWVUYWJsZShlbGVtZW50MSwgZWxlbWVudDIpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQxICYmIGVsZW1lbnQyKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnROYW1lID0gWyd0YWJsZSddO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50MT0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtZW50MSwgcGFyZW50TmFtZSk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQyPSBET01VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQyLCBwYXJlbnROYW1lKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQxICE9PSBudWxsICYmIHBhcmVudDIgIT0gbnVsbCAmJiBET01VdGlsLnNhbWVOb2RlKHBhcmVudDEsIHBhcmVudDIpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogVHJhdmVyc2VzIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIHRoZSBzaGFkb3cgcm9vdCAoZG9jdW1lbnQgZnJhZ21lbnQpIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIG5vZGUuXG4gICAgICogSW1wb3J0YW50IGZvciBoYW5kbGluZyBXZWIgQ29tcG9uZW50cyBhbmQgU2hhZG93IERPTSBzdHJ1Y3R1cmVzIGluIGFjY2Vzc2liaWxpdHkgY2hlY2tpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSAtIFRoZSBzdGFydGluZyBub2RlXG4gICAgICogQHJldHVybnMgVGhlIHNoYWRvdyByb290IG5vZGUgKG5vZGVUeXBlIDExID0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSksIG9yIG51bGwgaWYgbm9uZSBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBzaGFkb3dSb290Tm9kZShub2RlOiBOb2RlKSA6IE5vZGUgfCBudWxsIHtcbiAgICAgICAgbGV0IG5kID0gbm9kZTtcbiAgICAgICAgd2hpbGUgKG5kICE9IG51bGwgJiYgbmQubm9kZVR5cGUgIT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLylcbiAgICAgICAgICAgIG5kID0gbmQucGFyZW50Tm9kZTtcbiAgICAgICAgcmV0dXJuIG5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgYW4gb2JqZWN0IHdoaWxlIHByZXNlcnZpbmcgTm9kZSByZWZlcmVuY2VzIChkb2Vzbid0IGNsb25lIE5vZGUgb2JqZWN0cykuXG4gICAgICogVXNlZnVsIHdoZW4gY29weWluZyBkYXRhIHN0cnVjdHVyZXMgdGhhdCBjb250YWluIERPTSBub2RlIHJlZmVyZW5jZXMsIGFzIHlvdSB0eXBpY2FsbHkgd2FudFxuICAgICAqIHRvIHByZXNlcnZlIHRob3NlIHJlZmVyZW5jZXMgcmF0aGVyIHRoYW4gYXR0ZW1wdGluZyB0byBjbG9uZSB0aGUgbm9kZXMgdGhlbXNlbHZlcy5cbiAgICAgKlxuICAgICAqIEJlaGF2aW9yOlxuICAgICAqIC0gUHJpbWl0aXZlIHZhbHVlczogRGVlcCBjb3BpZWQgdmlhIEpTT04gc2VyaWFsaXphdGlvblxuICAgICAqIC0gRnVuY3Rpb25zOiBSZXR1cm5lZCBhcy1pcyAocmVmZXJlbmNlKVxuICAgICAqIC0gTm9kZSBvYmplY3RzOiBSZXR1cm5lZCBhcy1pcyAocmVmZXJlbmNlLCBub3QgY2xvbmVkKVxuICAgICAqIC0gQXJyYXlzL09iamVjdHM6IFJlY3Vyc2l2ZWx5IGNvcGllZCB3aXRoIHRoZSBzYW1lIHJ1bGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmhzIC0gVGhlIG9iamVjdCB0byBjb3B5IChyaWdodC1oYW5kIHNpZGUpXG4gICAgICogQHJldHVybnMgQSBjb3B5IG9mIHRoZSBvYmplY3Qgd2l0aCBOb2RlIHJlZmVyZW5jZXMgcHJlc2VydmVkXG4gICAgICovXG4gICAgc3RhdGljIG9iamVjdENvcHlXaXRoTm9kZVJlZnMocmhzOiBhbnkpIHtcbiAgICAgICAgaWYgKCFyaHMpIHJldHVybiByaHM7XG4gICAgICAgIGlmICh0eXBlb2YgcmhzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJocyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJocztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmhzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmhzIGluc3RhbmNlb2YgTm9kZSB8fCAhIXJocy5ub2RlVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJocztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXRWYWw7XG4gICAgICAgICAgICBpZiAocmhzLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiQXJyYXlcIikge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByaHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnB1c2godGhpcy5vYmplY3RDb3B5V2l0aE5vZGVSZWZzKGl0ZW0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJocykge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxba2V5XSA9IHRoaXMub2JqZWN0Q29weVdpdGhOb2RlUmVmcyhyaHNba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBmaXJzdCBhbmNlc3RvciBlbGVtZW50IHRoYXQgaGFzIGEgc3BlY2lmaWMgYXR0cmlidXRlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZS5cbiAgICAgKiBUcmF2ZXJzZXMgdXAgdGhlIERPTSB0cmVlIGZyb20gdGhlIGdpdmVuIGVsZW1lbnQgdW50aWwgYSBtYXRjaGluZyBhbmNlc3RvciBpcyBmb3VuZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIHN0YXJ0aW5nIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gYXR0ck5hbWUgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gc2VhcmNoIGZvclxuICAgICAqIEBwYXJhbSBhdHRyVmFsdWUgLSBUaGUgZXhwZWN0ZWQgYXR0cmlidXRlIHZhbHVlXG4gICAgICogQHJldHVybnMgVGhlIG1hdGNoaW5nIGFuY2VzdG9yIGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZSBmb3VuZFxuICAgICAqIEBleGFtcGxlIEZpbmRpbmcgYW4gYW5jZXN0b3Igd2l0aCBhcmlhLWhpZGRlbj1cInRydWVcIiBvciBkYXRhLXRlc3RpZD1cImNvbnRhaW5lclwiXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcldpdGhBdHRyaWJ1dGUoZWxlbWVudCwgYXR0ck5hbWUsIGF0dHJWYWx1ZSkge1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgKDxFbGVtZW50PndhbGtOb2RlKS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpID09PSBhdHRyVmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL1Zpc1V0aWxcIjtcbi8qKlxuICogV2Fsa3MgaW4gYSBET00gb3JkZXJcbiAqIFxuICogQXNzdW1wdGlvbiB0aGF0IG5vZGVzIG9mIHNoYWRvdyBET01zIGNhbGwgYXNzaWduU2xvdHMgb24gdGhlIHNoYWRvdyByb290IGJlZm9yZSBcbiAqIGRvaW5nIG90aGVyIHByb2Nlc3NpbmcgaW4gdGhhdCB0cmVlLiBJZiB5b3Ugd2FsayBpbnRvIGEgc2hhZG93IHJvb3QsIHRoZSBET01XYWxrZXJcbiAqIHdpbGwgZG8gaXQgYXV0b21hdGljYWxseS5cbiAqIFxuICogU2VlIGFsc28gLi4vYXJpYS9BUklBV2Fsa2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBET01XYWxrZXIge1xuICAgIHJvb3QgOiBOb2RlO1xuICAgIG5vZGUgOiBOb2RlO1xuICAgIGJFbmRUYWc6IGJvb2xlYW47XG4gICAgY29uc2lkZXJIaWRkZW46IGJvb2xlYW47XG4gICAgREVCVUc6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50IDogTm9kZSwgYkVuZD8gOiBib29sZWFuLCByb290PyA6IE5vZGUsIGNvbnNpZGVySGlkZGVuPyA6IGJvb2xlYW4sIERFQlVHPzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLkRFQlVHID0gISFERUJVRztcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdCB8fCAoKGVsZW1lbnQgJiYgZWxlbWVudC5vd25lckRvY3VtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6IGVsZW1lbnQpO1xuICAgICAgICBpZiAodGhpcy5yb290Lm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSAodGhpcy5yb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJFbmQgPT0gdHJ1ZSk7XG4gICAgICAgIHRoaXMuY29uc2lkZXJIaWRkZW4gPSBjb25zaWRlckhpZGRlbiB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBlbGVtKCkgOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmIHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCB8fCBudWxsO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgcGFyZW50Tm9kZShub2RlOiBOb2RlKSA6IE5vZGUgfCBudWxsIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcCA6IE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGlmICgobm9kZSBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgcCA9IChub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICB9IGVsc2UgaWYgKChub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICBwID0gKG5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAocCAmJiBwLm5vZGVUeXBlID09PSAxMSkge1xuICAgICAgICAgICAgaWYgKChwIGFzIFNoYWRvd1Jvb3QpLmhvc3QpIHtcbiAgICAgICAgICAgICAgICBwID0gKHAgYXMgU2hhZG93Um9vdCkuaG9zdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcmVudEVsZW1lbnQobm9kZTogTm9kZSkgOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGxldCBlbGVtIDogRWxlbWVudCA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgZG8geyBcbiAgICAgICAgICAgIGVsZW0gPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtKSBhcyBFbGVtZW50O1xuICAgICAgICB9IHdoaWxlIChlbGVtICYmIGVsZW0ubm9kZVR5cGUgIT09IDEpO1xuICAgICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXNzaWduU2xvdHMocm9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBsZXQgc2xvdHMgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuICAgICAgICBmb3IgKGxldCBpU2xvdD0wOyBpU2xvdDxzbG90cy5sZW5ndGg7ICsraVNsb3QpIHtcbiAgICAgICAgICAgIGxldCBwcm9jZXNzU2xvdCA9IHNsb3RzW2lTbG90XTtcbiAgICAgICAgICAgIGxldCBhc3NpZ25lZE5vZGVzID0gcHJvY2Vzc1Nsb3QuYXNzaWduZWROb2RlcygpO1xuICAgICAgICAgICAgZm9yIChsZXQgaUFzc2lnbmVkPTA7IGlBc3NpZ25lZDxhc3NpZ25lZE5vZGVzLmxlbmd0aDsgKytpQXNzaWduZWQpIHtcbiAgICAgICAgICAgICAgICAoYXNzaWduZWROb2Rlc1tpQXNzaWduZWRdIGFzIGFueSkuc2xvdE93bmVyID0gcHJvY2Vzc1Nsb3Q7XG4gICAgICAgICAgICAgICAgKGFzc2lnbmVkTm9kZXNbaUFzc2lnbmVkXSBhcyBhbnkpLnNsb3RJbmRleCA9IGlBc3NpZ25lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmaXJzdENoaWxkTm90T3duZWRCeVNsb3Qobm9kZTogTm9kZSkge1xuICAgICAgICBsZXQgcmV0VmFsID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHN0YXRpYyBsYXN0Q2hpbGROb3RPd25lZEJ5U2xvdChub2RlOiBOb2RlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBub2RlLmxhc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKHJldFZhbCAmJiAocmV0VmFsIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICByZXRWYWwgPSByZXRWYWwucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgc3RhdGljIG5leHRTaWJsaW5nTm90T3duZWRCeVNsb3Qobm9kZTpOb2RlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHN0YXRpYyBwcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdChub2RlOk5vZGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBhdFJvb3QoKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yb290ID09PSB0aGlzLm5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5pc1NhbWVOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmlzU2FtZU5vZGUodGhpcy5ub2RlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5ub2RlKSA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCAtIHRyeSBvdXIgYmVzdFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wYXJlbnROb2RlID09PSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgREVCVUdJRFggPSAwO1xuICAgIGluZGVudCA9IDA7XG4gICAgbmV4dE5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpbmRlbnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcyA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PHRoaXMuaW5kZW50OyArK2lkeCkge1xuICAgICAgICAgICAgICAgIHMgKz0gXCIgXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgREJHID0gZmFsc2U7Ly90aGlzLkRFQlVHSURYID49IDcgJiYgdGhpcy5ERUJVR0lEWCA8PSAxMDtcbiAgICAgICAgbGV0IHN0YXJ0TmFtZSA9IHRoaXMubm9kZS5ub2RlTmFtZTtcbiAgICAgICAgaWYgKCF0aGlzLm5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codGhpcy5ub2RlLm5vZGVOYW1lLCB0aGlzLmJFbmRUYWc/XCJFTkRcIjpcIlNUQVJUXCIsIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIGFueSkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBzbG90RWxlbWVudCA9ICh0aGlzLm5vZGUgYXMgSFRNTFNsb3RFbGVtZW50KVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmICh0aGlzLmNvbnNpZGVySGlkZGVuID8gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhSW50byBGcmFtZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5jb25zaWRlckhpZGRlbiA/IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSkgOiB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUludG8gc2hhZG93IHJvb3RcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVdhbGtlci5hc3NpZ25TbG90cyh0aGlzLm5vZGUgYXMgU2hhZG93Um9vdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzbG90XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFJbnRvIHNsb3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5maXJzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFGaXJzdCBjaGlsZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUZsaXAgdG8gZW5kIHRhZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhITFcIik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhRG9uZSBhdCByb290XCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFNsb3RJbmRleCA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXgrMTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFNsb3RJbmRleCA8IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFOZXh0IHNsb3QgY2hpbGRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXIuYXNzaWduZWROb2RlcygpW25leHRTbG90SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFCYWNrIHVwIHRvIHNsb3Qgb3duZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIVVwIHRvIGZyYW1lIG93bmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLm5leHRTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFOZXh0IHNpYmxpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5uZXh0U2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhUGFyZW50XCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFEb25lIHdpdGggd2Fsa1wiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChEQkcgJiYgKFxuICAgICAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgKVxuICAgICAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLkRFQlVHICYmIGNvbnNvbGUubG9nKGluZGVudCgpK2A8JHt0aGlzLmJFbmRUYWc/XCIvXCI6XCJcIn0ke3RoaXMubm9kZS5ub2RlTmFtZX0+IChmcm9tICR7c3RhcnROYW1lfSkgJHt0aGlzLkRFQlVHSURYKyt9IFNLSVBQRURgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAzIClcbiAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuYkVuZFRhZykgdGhpcy5pbmRlbnQgLT0gMjtcbiAgICAgICAgdGhpcy5ERUJVRyAmJiBjb25zb2xlLmxvZyhpbmRlbnQoKStgPCR7dGhpcy5iRW5kVGFnP1wiL1wiOlwiXCJ9JHt0aGlzLm5vZGUubm9kZU5hbWV9PiAoZnJvbSAke3N0YXJ0TmFtZX0pICR7dGhpcy5ERUJVR0lEWCsrfWApO1xuICAgICAgICB0aGlzLkRFQlVHICYmICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIgJiYgY29uc29sZS5sb2coaW5kZW50KCkrYHNsb3RPd25lcjogJHsodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyLm5vZGVOYW1lfWApO1xuICAgICAgICB0aGlzLkRFQlVHICYmICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXggJiYgY29uc29sZS5sb2coaW5kZW50KCkrYHNsb3RJbmRleDogJHsodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4fWApO1xuICAgICAgICB0aGlzLkRFQlVHICYmICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgJiYgY29uc29sZS5sb2coaW5kZW50KCkrYG93bmVyRWxlbWVudDogJHsodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50Lm5vZGVOYW1lfWApO1xuICAgICAgICBpZiAoIXRoaXMuYkVuZFRhZykgdGhpcy5pbmRlbnQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJldk5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlmcmFtZU5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxJRnJhbWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5jb25zaWRlckhpZGRlbiA/IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKSA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi9cbiAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMuY29uc2lkZXJIaWRkZW4gPyBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudE5vZGUpIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290Lmxhc3RDaGlsZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVdhbGtlci5hc3NpZ25TbG90cyh0aGlzLm5vZGUgYXMgU2hhZG93Um9vdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzbG90XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgKGVsZW1lbnROb2RlIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbnRlciBzbG90IHdpdGggYXNzaWduZWQgbm9kZXMgLSBnbyB0byBsYXN0IGFzc2lnbmVkIG5vZGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RFbGVtZW50ID0gZWxlbWVudE5vZGUgYXMgSFRNTFNsb3RFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKClbc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExKVxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIubGFzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIubGFzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0Um9vdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmV2U2xvdEluZGV4ID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2U2xvdEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKClbcHJldlNsb3RJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBlUnVsZVBvbGljeSB9IGZyb20gXCIuL0lSdWxlXCJcblxuZXhwb3J0IGVudW0gZVRvb2xraXRMZXZlbCB7XG4gICAgTEVWRUxfT05FID0gXCIxXCIsXG4gICAgTEVWRUxfVFdPID0gXCIyXCIsXG4gICAgTEVWRUxfVEhSRUUgPSBcIjNcIixcbiAgICBMRVZFTF9GT1VSID0gXCI0XCJcbn1cblxuZXhwb3J0IGVudW0gZUd1aWRlbGluZUNhdGVnb3J5IHtcbiAgICBBQ0NFU1NJQklMSVRZID0gXCJBY2Nlc3NpYmlsaXR5XCIsXG4gICAgREVTSUdOID0gXCJEZXNpZ25cIixcbiAgICBPVEhFUiA9IFwiT3RoZXJcIlxufVxuXG5leHBvcnQgZW51bSBlR3VpZGVsaW5lVHlwZSB7XG4gICAgREVGQVVMVCA9IFwiZGVmYXVsdFwiLFxuICAgIEVYVEVOU0lPTiA9IFwiZXh0ZW5zaW9uXCJcbn1cblxuZXhwb3J0IHR5cGUgQ2hlY2twb2ludCA9IHtcbiAgICBudW06IHN0cmluZyxcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FjdC1ydWxlcy9hY3QtdG9vbHMvYmxvYi9tYWluL3NyYy9kYXRhL3NjLXVybHMuanNvblxuICAgIHNjSWQ/OiBzdHJpbmcsXG4gICAgLy8gSkNIOiBhZGQgbmFtZSBvZiBjaGVja3BvaW50IGFuZCBzdW1tYXJ5IGRlc2NyaXB0aW9uXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHdjYWdMZXZlbDogc3RyaW5nLFxuICAgIHN1bW1hcnk6IHN0cmluZyxcbiAgICBydWxlcz86IEFycmF5PHsgXG4gICAgICAgIGlkOiBzdHJpbmcsIFxuICAgICAgICAvLyAob3B0aW9uYWwpIFJlYXNvbiBjb2RlcyB0aGF0IHRoaXMgcnVsZXNldCBtYXBwaW5nIGFwcGxpZXMgdG8sIFxuICAgICAgICAvLyBvciBhbGwgaWYgbm90IHNwZWNpZmllZFxuICAgICAgICByZWFzb25Db2Rlcz86IHN0cmluZ1tdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3ksIFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwsXG4gICAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgfT5cbn1cblxuZXhwb3J0IHR5cGUgR3VpZGVsaW5lID0ge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnksXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICB0eXBlPzogZUd1aWRlbGluZVR5cGUsXG4gICAgY2hlY2twb2ludHM6IEFycmF5PENoZWNrcG9pbnQ+XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGVHdWlkZWxpbmVDYXRlZ29yeSwgZUd1aWRlbGluZVR5cGUgfSBmcm9tIFwiLi9JR3VpZGVsaW5lXCI7XG5pbXBvcnQgeyBJTWFwUmVzdWx0IH0gZnJvbSBcIi4vSU1hcHBlclwiO1xuaW1wb3J0IHsgTmxzTWFwIGFzIE5sc01hcE5ldywgSGVscE1hcCBhcyBIZWxwTWFwTmV3LCBJRW5naW5lIGFzIElFbmdpbmVOZXcgfSBmcm9tIFwiLi9JRW5naW5lXCI7XG5pbXBvcnQgeyBSZXBvcnQgYXMgUmVwb3J0TmV3IH0gZnJvbSBcIi4vSVJlcG9ydFwiO1xuaW1wb3J0IHsgZVRvb2xraXRMZXZlbCBhcyBlVG9vbGtpdExldmVsTmV3IH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiXG5pbXBvcnQgeyBCb3VuZHMgfSBmcm9tIFwiLi9JQm91bmRzXCI7XG5cbmV4cG9ydCBlbnVtIGVSdWxlQ29uZmlkZW5jZSB7XG4gICAgUEFTUyA9IFwiUEFTU1wiLFxuICAgIEZBSUwgPSBcIkZBSUxcIixcbiAgICBQT1RFTlRJQUwgPSBcIlBPVEVOVElBTFwiLFxuICAgIE1BTlVBTCA9IFwiTUFOVUFMXCJcbn1cblxuZXhwb3J0IGVudW0gZVJ1bGVQb2xpY3kge1xuICAgIFZJT0xBVElPTiA9IFwiVklPTEFUSU9OXCIsXG4gICAgUkVDT01NRU5EQVRJT04gPSBcIlJFQ09NTUVOREFUSU9OXCIsXG4gICAgSU5GT1JNQVRJT04gPSBcIklORk9STUFUSU9OXCJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVQYXNzKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBBU1NdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVSZW5kZXIocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUEFTU10sXG4gICAgICAgIHJlYXNvbklkOiAwLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gUnVsZUZhaWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuRkFJTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVBvdGVudGlhbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QT1RFTlRJQUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVNYW51YWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuTUFOVUFMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVSZXN1bHQgPSB7XG4gICAgdmFsdWU6IFtlUnVsZVBvbGljeSwgZVJ1bGVDb25maWRlbmNlXSxcbiAgICByZWFzb25JZD86IG51bWJlciB8IHN0cmluZyxcbiAgICBtZXNzYWdlQXJncz86IHN0cmluZ1tdLFxuICAgIGFwaUFyZ3M/OiBhbnlbXVxufVxuXG5leHBvcnQgdHlwZSBJc3N1ZSA9IFJ1bGVSZXN1bHQgJiB7XG4gICAgcnVsZUlkOiBzdHJpbmcsXG5cbiAgICBub2RlOiBOb2RlLFxuICAgIC8vIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGNhdGVnb3J5PzogZUd1aWRlbGluZUNhdGVnb3J5LFxuICAgIHBhdGg6IHsgW25zOiBzdHJpbmddIDogc3RyaW5nIH0sXG5cbiAgICBydWxlVGltZTogbnVtYmVyLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBib3VuZHM/OiBCb3VuZHMsXG4gICAgc25pcHBldDogc3RyaW5nLFxuICAgIHNvdXJjZT86IHN0cmluZyxcbiAgICBsZXZlbD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBSdWxlQ29udGV4dEhpZXJhcmNoeSA9IHsgW25hbWVzcGFjZTogc3RyaW5nXSA6IElNYXBSZXN1bHRbXSB9O1xuXG5leHBvcnQgdHlwZSBSdWxlQ29udGV4dCA9IHtcbiAgICBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcFJlc3VsdFxufVxuXG5leHBvcnQgdHlwZSBSdWxlID0ge1xuICAgIC8vIFVuaXF1ZSBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhpcyBydWxlIChzaG91bGQgYmUgaHVtYW4gdW5kZXJzdGFuZGFibGUpXG4gICAgLy8gTkxTIGNvZGVzIGFuZCBoZWxwIHNvdXJjZXMgd2lsbCBiZSBiYXNlZCBvZmYgb2YgdGhpcyBpZFxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBydWxlc2V0czogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nIHwgc3RyaW5nW11cbiAgICAgICAgbnVtOiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3ksXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbE5ldyxcbiAgICAgICAgLy8gKG9wdGlvbmFsKSBSZWFzb24gY29kZXMgdGhhdCB0aGlzIHJ1bGVzZXQgbWFwcGluZyBhcHBsaWVzIHRvLCBcbiAgICAgICAgLy8gb3IgYWxsIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgcmVhc29uQ29kZXM/OiBzdHJpbmdbXVxuICAgIH0+XG5cbiAgICByZWZhY3Rvcj86IHtcbiAgICAgICAgW29sZFJ1bGVJZDogc3RyaW5nXToge1xuICAgICAgICAgICAgW29sZFJlYXNvbkNvZGU6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFtsb2NhbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaGVscDoge1xuICAgICAgICBbbG9jYWxlOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBcbiAgICAgKiBIb3cgdGhpcyBydWxlIG1hcHMgdG8gQUNUIHJ1bGVzLCBpZiBhbnkgKGh0dHBzOi8vYWN0LXJ1bGVzLmdpdGh1Yi5pby9ydWxlcy8pXG4gICAgICogXG4gICAgICogc3RyaW5nOiBGb3IgYSBzaW5nbGUgcnVsZSBtYXBwaW5nIHRoYXQgbWF0Y2hlcyBleGFjdGx5IHRvIHRoZSBydWxlIChQYXNzIC0+IHBhc3MsIFBvdGVudGlhbCAtPiBjYW50VGVsbCwgRmFpbCAtPiBmYWlsLCB1bmxpc3RlZCA9PiBpbmFwcGxpY2FibGUpXG4gICAgICogQXJyYXk8PjogQ3VzdG9tIG1hcHBpbmcgb2YgcnVsZSB0byBBQ1QgcmVzdWx0c1xuICAgICAqL1xuICAgIGFjdD86IHN0cmluZyB8IHN0cmluZ1tdIHwgQXJyYXk8c3RyaW5nIHwge1xuICAgICAgICBbYWN0UnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IFwicGFzc1wiIHwgXCJmYWlsXCIgfCBcImNhbnRUZWxsXCIgfCBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9PlxuXG4gICAgLy8gU2VlIHNyYy92Mi9jb21tb24vQ29udGV4dC50cyBmb3IgdmFsaWQgY29udGV4dHNcbiAgICBjb250ZXh0OiBzdHJpbmc7XG5cbiAgICAvLyBBcnJheSBvZiBydWxlcyB0aGF0IG11c3QgcGFzcyB0byBhbGxvdyB0aGlzIHZhbGlkYXRlIHRvIHJ1biAtIHRoZXkgbXVzdCBoYXZlIHRoZSBzYW1lIGNvbnRleHQgcHJvcGVydHlcbiAgICBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXVxuXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpID0+IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gfCBudWxsXG5cbiAgICBlbmFibGVkPzogYm9vbGVhblxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVEZXRhaWxzID0gSXNzdWU7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2VlIElFbmdpbmVcbiAqL1xuZXhwb3J0IHR5cGUgUmVwb3J0ID0gUmVwb3J0TmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSBJRW5naW5lXG4gKi9cbmV4cG9ydCB0eXBlIE5sc01hcCA9IE5sc01hcE5ldztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgSUVuZ2luZVxuICovXG5leHBvcnQgdHlwZSBIZWxwTWFwID0gSGVscE1hcE5ldztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JRW5naW5lXG4gKi9cbmV4cG9ydCB0eXBlIElFbmdpbmUgPSBJRW5naW5lTmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lHdWlkZWxpbmVcbiAqL1xuZXhwb3J0IHsgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JR3VpZGVsaW5lOmVHdWlkZWxpbmVDYXRlZ29yeVxuICovXG5leHBvcnQgeyBlR3VpZGVsaW5lQ2F0ZWdvcnkgYXMgZVJ1bGVDYXRlZ29yeSB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JR3VpZGVsaW5lOmVHdWlkZWxpbmVUeXBlXG4gKi9cbmV4cG9ydCB7IGVHdWlkZWxpbmVUeXBlIGFzIGVSdWxlc2V0VHlwZSB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSBhcyBSdWxlVjQsIGVSdWxlUG9saWN5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uLy4uL3YyL2NvbW1vbi9FbmdpbmVcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBhMTF5UnVsZXNldHMgfSBmcm9tIFwiLi4vcnVsZXNldHNcIjtcbmltcG9ydCAqIGFzIGNoZWNrUnVsZXNWNCBmcm9tIFwiLi4vcnVsZXNcIjtcbmltcG9ydCB7IEd1aWRlbGluZSwgZUd1aWRlbGluZUNhdGVnb3J5IH0gZnJvbSBcIi4uL2FwaS9JR3VpZGVsaW5lXCI7XG5pbXBvcnQgeyBJRW5naW5lIH0gZnJvbSBcIi4uL2FwaS9JRW5naW5lXCI7XG5pbXBvcnQgeyBSZXBvcnQgfSBmcm9tIFwiLi4vYXBpL0lSZXBvcnRcIjtcbmltcG9ydCB7IElDaGVja2VyIH0gZnJvbSBcIi4uL2FwaS9JQ2hlY2tlclwiO1xuXG5sZXQgY2hlY2tSdWxlcyA9IFtdO1xubGV0IGNoZWNrTmxzID0ge307XG5sZXQgY2hlY2tIZWxwID0ge307XG5cbmZ1bmN0aW9uIF9pbml0aWFsaXplKCkge1xuICAgIGNvbnN0IGxhbmdzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShFbmdpbmUuZ2V0TGFuZ3VhZ2VzKCkpKTtcbiAgICAvLyBEZWZhdWx0IGxhbmcgdG8gZW4tVVMgaWYgbm90aGluZyBlbHNlIHNwZWNpZmllZCBpcyBmb3VuZFxuICAgIGxhbmdzLnB1c2goXCJlbi1VU1wiKTtcbiAgICAvLyBQcm9jZXNzIFY0IHJ1bGVzIGludG8gdGhlIFYyIGZvcm1hdFxuICAgIGZvciAobGV0IHJ1bGVuYW1lIGluIGNoZWNrUnVsZXNWNCkge1xuICAgICAgICAvLyBDb252ZXJ0IHJ1bGVcbiAgICAgICAgbGV0IHY0UnVsZTogUnVsZVY0ID0gY2hlY2tSdWxlc1Y0W3J1bGVuYW1lXTtcbiAgICAgICAgY2hlY2tSdWxlcy5wdXNoKHY0UnVsZSk7XG4gICAgICAgIC8vIEdvIGJhY2t3YXJkcyBiZWNhdXNlIHRoZSBmaXJzdCBsYW5nIGlzIHRoZSBwcmVmZXJyZWQsIHNvXG4gICAgICAgIC8vIGVhcmxpZXIgbGFuZ3VhZ2VzIHdpbGwgb3ZlcnJpZGUgbGF0ZXIgbGFuZ3VhZ2VzXG4gICAgICAgIGZvciAobGV0IGlkeD1sYW5ncy5sZW5ndGgtMTsgaWR4ID49MDsgLS1pZHgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhbmdJZCA9IGxhbmdzW2lkeF07XG4gICAgICAgICAgICBpZiAobGFuZ0lkIGluIHY0UnVsZS5tZXNzYWdlcykge1xuICAgICAgICAgICAgICAgIGNoZWNrTmxzW3Y0UnVsZS5pZF0gPSB2NFJ1bGUubWVzc2FnZXNbbGFuZ0lkXTtcbiAgICAgICAgICAgICAgICBjaGVja05sc1t2NFJ1bGUuaWRdWzBdID0gY2hlY2tObHNbdjRSdWxlLmlkXS5ncm91cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsYW5nSWQgaW4gdjRSdWxlLmhlbHApIHtcbiAgICAgICAgICAgICAgICBjaGVja0hlbHBbdjRSdWxlLmlkXSA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVhc29uSWQgaW4gdjRSdWxlLmhlbHBbbGFuZ0lkXSkge1xuICAgICAgICAgICAgICAgICAgICBjaGVja0hlbHBbdjRSdWxlLmlkXVtyZWFzb25JZF0gPSBgLyR7bGFuZ0lkfS8ke3Y0UnVsZS5oZWxwW2xhbmdJZF1bcmVhc29uSWRdfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoZWNrTmxzW3Y0UnVsZS5pZF1bMF0gPSBjaGVja05sc1t2NFJ1bGUuaWRdLmdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENvbnZlcnQgUlNcbiAgICAgICAgZm9yIChjb25zdCByc1NlY3Rpb24gb2YgdjRSdWxlLnJ1bGVzZXRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzIG9mIGExMXlSdWxlc2V0cyBhcyBHdWlkZWxpbmVbXSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGVja1JzSWRzIDogc3RyaW5nW10gPSB0eXBlb2YgcnNTZWN0aW9uLmlkID09PSBcInN0cmluZ1wiID8gW3JzU2VjdGlvbi5pZF0gOiByc1NlY3Rpb24uaWQ7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrUnNJZHMuaW5jbHVkZXMocnMuaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgcnMuY2hlY2twb2ludHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGVja0NQSWRzIDogc3RyaW5nW10gPSB0eXBlb2YgcnNTZWN0aW9uLm51bSA9PT0gXCJzdHJpbmdcIiA/IFtyc1NlY3Rpb24ubnVtXSA6IHJzU2VjdGlvbi5udW07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDUElkcy5pbmNsdWRlcyhjcC5udW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AucnVsZXMgPSBjcC5ydWxlcyB8fCBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLnJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdjRSdWxlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb25Db2RlczogcnNTZWN0aW9uLnJlYXNvbkNvZGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogcnNTZWN0aW9uLmxldmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sa2l0TGV2ZWw6IHJzU2VjdGlvbi50b29sa2l0TGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuX2luaXRpYWxpemUoKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi4vYXBpL0lHdWlkZWxpbmVcbiAqL1xuZXhwb3J0IHR5cGUgUnVsZXNldCA9IEd1aWRlbGluZTtcblxuZXhwb3J0IGNsYXNzIENoZWNrZXIgaW1wbGVtZW50cyBJQ2hlY2tlciB7XG4gICAgcHJpdmF0ZSBndWlkZWxpbmVzOiBHdWlkZWxpbmVbXSA9IFtdO1xuXG4gICAgZW5naW5lOiBJRW5naW5lO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBnZXRHdWlkZWxpbmVzKCkuXG4gICAgICovXG4gICAgcnVsZXNldHM6IEd1aWRlbGluZVtdID0gdGhpcy5ndWlkZWxpbmVzO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBnZXRHdWlkZWxpbmVJZHMoKS5cbiAgICAgKi9cbiAgICBydWxlc2V0SWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHJ1bGVzZXRSdWxlczogeyBbcnNJZDogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgIHJ1bGVMZXZlbHMgOiB7IFtydWxlSWQ6IHN0cmluZ106IHsgW3JzSWQ6IHN0cmluZ10gOiBlUnVsZVBvbGljeSB9fSA9IHt9O1xuICAgIHJ1bGVSZWFzb25MZXZlbHMgOiB7IFtydWxlSWQ6IHN0cmluZ106IHsgW3JzSWQ6IHN0cmluZ10gOiB7W3JlYXNvbkNvZGVzOiBzdHJpbmddIDogZVJ1bGVQb2xpY3kgfX19ID0ge307XG4gICAgcnVsZUNhdGVnb3J5IDogeyBbcnVsZUlkOiBzdHJpbmddOiB7IFtyc0lkOiBzdHJpbmddIDogZUd1aWRlbGluZUNhdGVnb3J5IH19ID0ge307XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGxldCBlbmdpbmUgPSB0aGlzLmVuZ2luZSA9IG5ldyBFbmdpbmUoKTtcblxuICAgICAgICBlbmdpbmUuYWRkTWFwcGVyKG5ldyBBUklBTWFwcGVyKCkpO1xuXG4gICAgICAgIGVuZ2luZS5hZGRSdWxlcyhjaGVja1J1bGVzKTtcbiAgICAgICAgZW5naW5lLmFkZE5sc01hcChjaGVja05scyk7XG4gICAgICAgIGVuZ2luZS5hZGRIZWxwTWFwKGNoZWNrSGVscCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBycyBvZiBhMTF5UnVsZXNldHMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUnVsZXNldChycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZ3VpZGVsaW5lIHRvIHRoZSBlbmdpbmUuIElmIHRoZSBpZCBhbHJlYWR5IGV4aXN0cywgdGhlIHByZXZpb3VzIGd1aWRlbGluZSB3aWxsIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBndWlkZWxpbmUgXG4gICAgICovXG4gICAgYWRkR3VpZGVsaW5lKGd1aWRlbGluZTogR3VpZGVsaW5lKSB7XG4gICAgICAgIGlmIChndWlkZWxpbmUuaWQgaW4gdGhpcy5ydWxlc2V0UnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlR3VpZGVsaW5lKGd1aWRlbGluZS5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ndWlkZWxpbmVzLnB1c2goZ3VpZGVsaW5lKTtcbiAgICAgICAgdGhpcy5ydWxlc2V0SWRzLnB1c2goZ3VpZGVsaW5lLmlkKTtcbiAgICAgICAgY29uc3QgcnVsZUlkcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNwIG9mIGd1aWRlbGluZS5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgY3AucnVsZXMgPSBjcC5ydWxlcyB8fCBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBjcC5ydWxlcykge1xuICAgICAgICAgICAgICAgIGlmIChydWxlLmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGVJZHMucHVzaChydWxlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF0gPSB0aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5ydWxlTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF0gPSBydWxlLmxldmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVSZWFzb25MZXZlbHNbcnVsZS5pZF0gPSB0aGlzLnJ1bGVSZWFzb25MZXZlbHNbcnVsZS5pZF0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXVtndWlkZWxpbmUuaWRdID0gdGhpcy5ydWxlUmVhc29uTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBydWxlLnJlYXNvbkNvZGVzID8gcnVsZS5yZWFzb25Db2Rlcy5qb2luKCctLScpIDogXCJOb25lXCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXVtndWlkZWxpbmUuaWRdW2NvZGVdID0gcnVsZS5sZXZlbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZS5pZF0gPSB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZS5pZF1bZ3VpZGVsaW5lLmlkXSA9IGd1aWRlbGluZS5jYXRlZ29yeTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ydWxlc2V0UnVsZXNbZ3VpZGVsaW5lLmlkXSA9IHJ1bGVJZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGEgcnVsZSBmb3IgYWxsIGd1aWRlbGluZXNcbiAgICAgKiBAcGFyYW0gcnVsZUlkIFxuICAgICAqL1xuICAgIGVuYWJsZVJ1bGUocnVsZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgZm9yIChjb25zdCBndWlkZWxpbmUgb2YgdGhpcy5nZXRHdWlkZWxpbmVzKCkpIHtcbiAgICAgICAgICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNwIG9mIGd1aWRlbGluZS5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBjcC5ydWxlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5lbmFibGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcnVsZS5lbmFibGVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEd1aWRlbGluZShndWlkZWxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBhIHJ1bGUgZm9yIGFsbCBndWlkZWxpbmVzXG4gICAgICogQHBhcmFtIHJ1bGVJZCBcbiAgICAgKi9cbiAgICBkaXNhYmxlUnVsZShydWxlSWQ6IHN0cmluZykge1xuICAgICAgICBmb3IgKGNvbnN0IGd1aWRlbGluZSBvZiB0aGlzLmdldEd1aWRlbGluZXMoKSkge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgZ3VpZGVsaW5lLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNwLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEd1aWRlbGluZShndWlkZWxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZ3VpZGVsaW5lIGZyb20gdGhlIGVuZ2luZVxuICAgICAqIFxuICAgICAqIEdlbmVyYWxseSwgdGhlcmUgaXNuJ3QgYSBnb29kIHJlYXNvbiB0byBkbyB0aGlzLiBVc2VycyBzaG91bGQganVzdCBub3Qgc2VsZWN0IHRoZSBndWlkZWxpbmUgYXMgYW4gb3B0aW9uIGluIGNoZWNrXG4gICAgICogQHBhcmFtIGd1aWRlbGluZUlkXG4gICAgICovXG4gICAgcHJpdmF0ZSByZW1vdmVHdWlkZWxpbmUoZ3VpZGVsaW5lSWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoZ3VpZGVsaW5lSWQgaW4gdGhpcy5ydWxlc2V0UnVsZXMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJ1bGVzZXRSdWxlc1tndWlkZWxpbmVJZF07XG4gICAgICAgICAgICB0aGlzLnJ1bGVzZXRzID0gdGhpcy5ndWlkZWxpbmVzID0gdGhpcy5ndWlkZWxpbmVzLmZpbHRlcihndWlkZWxpbmUgPT4gZ3VpZGVsaW5lLmlkICE9PSBndWlkZWxpbmVJZCk7XG4gICAgICAgICAgICB0aGlzLnJ1bGVzZXRJZHMgPSB0aGlzLmdldEd1aWRlbGluZUlkcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBndWlkZWxpbmVzIGF2YWlsYWJsZSBpbiB0aGUgZW5naW5lXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2V0R3VpZGVsaW5lcygpIDogR3VpZGVsaW5lW10ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmd1aWRlbGluZXMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGlkcyBvZiB0aGUgZ3VpZGVsaW5lcyBhdmFpbGFibGUgaW4gdGhlIGVuZ2luZVxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGdldEd1aWRlbGluZUlkcygpIDogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlkZWxpbmVzLm1hcChndWlkZWxpbmUgPT4gZ3VpZGVsaW5lLmlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAZGVwcmVjYXRlZCBTZWUgYWRkR3VpZGVsaW5lXG4gICAgICovXG4gICAgYWRkUnVsZXNldChyczogUnVsZXNldCkge1xuICAgICAgICB0aGlzLmFkZEd1aWRlbGluZShycyk7XG4gICAgfVxuXG4gICAgZW5hYmxlU291cmNlTWFwKGVuYWJsZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmVuZ2luZS5lbmFibGVTb3VyY2VNYXAoZW5hYmxlKTtcbiAgICB9XG5cbiAgICBpc1NvdXJjZU1hcEVuYWJsZWQoKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUuaXNTb3VyY2VNYXBFbmFibGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybSBhIGNoZWNrIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS9kb2N1bWVudFxuICAgICAqIEBwYXJhbSBub2RlIERPTU5vZGUgb3IgRG9jdW1lbnQgb24gd2hpY2ggdG8gcnVuIHRoZSBjaGVja1xuICAgICAqIEBwYXJhbSBndWlkZWxpbmVJZHMgR3VpZGVsaW5lIGlkcyB0byBjaGVjayB3aXRoIHRvIHNwZWNpZnkgd2hpY2ggcnVsZXMgdG8gcnVuXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgY2hlY2sobm9kZTogTm9kZSB8IERvY3VtZW50LCBndWlkZWxpbmVJZHM/OiBzdHJpbmcgfCBzdHJpbmdbXSkgOiBQcm9taXNlPFJlcG9ydD4ge1xuICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggcnVsZXMgdG8gcnVuXG4gICAgICAgIGxldCBydWxlSWRzIDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAvLyBGaXggdGhlIGlucHV0XG4gICAgICAgIGlmICghZ3VpZGVsaW5lSWRzKSB7XG4gICAgICAgICAgICBydWxlSWRzID0gdGhpcy5lbmdpbmUuZ2V0UnVsZXNJZHMoKTtcbiAgICAgICAgfSBlbHNle1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBndWlkZWxpbmVJZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBndWlkZWxpbmVJZHMgPSBbZ3VpZGVsaW5lSWRzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCByc0lkIG9mIGd1aWRlbGluZUlkcykge1xuICAgICAgICAgICAgICAgIGlmIChyc0lkIGluIHRoaXMucnVsZXNldFJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGVJZHMgPSBydWxlSWRzLmNvbmNhdCh0aGlzLnJ1bGVzZXRSdWxlc1tyc0lkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9ICAgIFxuICAgICAgICB0aGlzLmVuZ2luZS5lbmFibGVSdWxlcyhydWxlSWRzKTtcbiAgICAgICAgLy8gQWRkIHRoZSByZXBvcnQgbGV2ZWxzXG4gICAgICAgIGxldCBteVRoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUucnVuKG5vZGUpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVwb3J0KSB7XG4gICAgICAgICAgICAgICAgcmVwb3J0Lm5scyA9IHt9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXBvcnQucmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJ1bGVJZCBpbiBjaGVja05scykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0Lm5sc1tyZXN1bHQucnVsZUlkXSA9IHJlcG9ydC5ubHNbcmVzdWx0LnJ1bGVJZF0gfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6IGNoZWNrTmxzW3Jlc3VsdC5ydWxlSWRdWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlYXNvbklkIGluIGNoZWNrTmxzW3Jlc3VsdC5ydWxlSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0Lm5sc1tyZXN1bHQucnVsZUlkXVtyZXN1bHQucmVhc29uSWRdID0gY2hlY2tObHNbcmVzdWx0LnJ1bGVJZF1bcmVzdWx0LnJlYXNvbklkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvL3Jlc3VsdC52YWx1ZVswXSA9IG15VGhpcy5nZXRMZXZlbChndWlkZWxpbmVJZHMgYXMgc3RyaW5nW10sIHJlc3VsdC5ydWxlSWQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29kZSA9IHJlc3VsdC5yZWFzb25JZD8gcmVzdWx0LnJlYXNvbklkIGFzIHN0cmluZyA6IFwiTm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudmFsdWVbMF0gPSBteVRoaXMuZ2V0UmVhc29uTGV2ZWwoZ3VpZGVsaW5lSWRzIGFzIHN0cmluZ1tdLCByZXN1bHQucnVsZUlkLCBjb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNhdGVnb3J5ID0gbXlUaGlzLmdldENhdGVnb3J5KGd1aWRlbGluZUlkcyBhcyBzdHJpbmdbXSwgcmVzdWx0LnJ1bGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQucGF0aC5jc3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXBvcnQ7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgIHByaXZhdGUgZ2V0TGV2ZWwocnNJZHM6IHN0cmluZ1tdLCBydWxlSWQ6IHN0cmluZykgOiBlUnVsZVBvbGljeSB7XG4gICAgICAgIGlmICghcnNJZHMpIHJldHVybiBlUnVsZVBvbGljeS5JTkZPUk1BVElPTjtcbiAgICAgICAgbGV0IHJzSW5mbyA9IHRoaXMucnVsZUxldmVsc1tydWxlSWRdO1xuICAgICAgICBsZXQgcmV0VmFsID0gbnVsbDtcbiAgICAgICAgaWYgKHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlTGV2ZWxzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bGUgdHJpZ2dlcmVkIGZvciB3aGljaCB3ZSBoYXZlIG5vIHJ1bGUgbGV2ZWwgaW5mb3JtYXRpb246IFwiK3J1bGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgcnNJZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnNJZCBpbiByc0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzSW5mb1tyc0lkXSA9PT0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5WSU9MQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnNJbmZvW3JzSWRdID09PSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiAmJiByZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVsZSB0cmlnZ2VyZWQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gcnVsZSBsZXZlbCBpbmZvcm1hdGlvbjogXCIrcnVsZUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVhc29uTGV2ZWwocnNJZHM6IHN0cmluZ1tdLCBydWxlSWQ6IHN0cmluZywgcmVhc29uQ29kZT86IHN0cmluZykgOiBlUnVsZVBvbGljeSB7XG4gICAgICAgIGlmICghcnNJZHMpIHJldHVybiBlUnVsZVBvbGljeS5JTkZPUk1BVElPTjsgXG4gICAgICAgIGxldCByc0luZm8gPSB0aGlzLnJ1bGVSZWFzb25MZXZlbHNbcnVsZUlkXTtcbiAgICAgICAgbGV0IHJldFZhbCA9IG51bGw7XG4gICAgICAgIGlmIChyc0lkcykge1xuICAgICAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZVJlYXNvbkxldmVscykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uIFwiK3J1bGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgcnNJZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnNJZCBpbiByc0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVDb2RlID0gbmV3IFJlZ0V4cChgKF58LS0pJHtyZWFzb25Db2RlfSgkfC0tKWApO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyc0luZm9bcnNJZF0pLmZvckVhY2goY29kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGV2ZWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09ICdOb25lJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IHJzSW5mb1tyc0lkXVtcIk5vbmVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZUNvZGUudGVzdChjb2RlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IHJzSW5mb1tyc0lkXVtjb2RlXTsgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PT0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LlZJT0xBVElPTjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsID09PSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiAmJiByZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT047IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LklORk9STUFUSU9OO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LklORk9STUFUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBcbiAgICAgICAgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVsZSB0cmlnZ2VyZWQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gcnVsZSBsZXZlbCBpbmZvcm1hdGlvbjogXCIrcnVsZUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2F0ZWdvcnkocnNJZHM6IHN0cmluZ1tdLCBydWxlSWQ/OiBzdHJpbmcpIDogZUd1aWRlbGluZUNhdGVnb3J5IHtcbiAgICAgICAgbGV0IHJzSW5mbyA9IHRoaXMucnVsZUNhdGVnb3J5W3J1bGVJZF07XG4gICAgICAgIGxldCByZXRWYWwgPSBcIlwiO1xuXG4gICAgICAgIGlmICghKHJ1bGVJZCBpbiB0aGlzLnJ1bGVDYXRlZ29yeSkpIHtcbiAgICAgICAgICAgIHJldHVybiBlR3VpZGVsaW5lQ2F0ZWdvcnkuT1RIRVI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyc0lkcykge1xuICAgICAgICAgICAgcnNJZHMgPSB0aGlzLmdldEd1aWRlbGluZUlkcygpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcnNJZCBvZiByc0lkcykge1xuICAgICAgICAgICAgaWYgKHJzSWQgaW4gcnNJbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJzSW5mb1tyc0lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZUd1aWRlbGluZUNhdGVnb3J5Lk9USEVSO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhX3RhcmdldF93YXJuaW5nOiBSdWxlID0ge1xuICAgIGlkOiBcImFfdGFyZ2V0X3dhcm5pbmdcIixcbiAgICBjb250ZXh0OiBcImRvbTphW3RhcmdldF0sZG9tOmFyZWFbdGFyZ2V0XSxkb206YmFzZVt0YXJnZXRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQV9UYXJnZXRBbmRUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF93YXJuXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFfdGFyZ2V0X3dhcm5pbmcuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYGFfdGFyZ2V0X3dhcm5pbmcuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF93YXJuXCI6IGBhX3RhcmdldF93YXJuaW5nLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZXJzIHNob3VsZCBiZSB3YXJuZWQgaW4gYWR2YW5jZSBpZiB0aGVpciBpbnB1dCBhY3Rpb24gd2lsbCBvcGVuIGEgbmV3IHdpbmRvd1wiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHVzZXIgaXMgd2FybmVkIGluIGFkdmFuY2UgdGhhdCB0aGUgaW5wdXQgYWN0aW9uIG9wZW5zIGEgbmV3IHdpbmRvd1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfd2FyblwiOiBcIkluZm9ybSB0aGUgdXNlciB3aGVuIHRoZWlyIGlucHV0IGFjdGlvbiB3aWxsIG9wZW4gYSBuZXcgd2luZG93XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMy4yLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBza2lwIHRoZSBydWxlIGlmIGl0J3MgQVQgaGlkZGVuIGFuZCBub3QgdGFiYmFibGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtV2luVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJuZXcgd2luZG93XCIsIFwibmV3IHRhYlwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0U3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdFN0ciA9PSBcIl9wYXJlbnRcIiB8fCB0U3RyID09IFwiX3NlbGZcIiB8fCB0U3RyID09IFwiX3RvcFwiIHx8IENvbW1vblV0aWwuZ2V0RnJhbWVCeU5hbWUocnVsZUNvbnRleHQsdFN0cikgIT0gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vIE5hbWUgaXMgbm90IHBhcnQgb2YgdGhpcyBmcmFtZXNldCDigJMgbXVzdCBoYXZlIHBvdGVudGlhbCB0byBjcmVhdGUgbmV3IHdpbmRvdz9cbiAgICAgICAgICAgIC8vIFNlZSBpZiBhIG5ldyB3aW5kb3cgaXMgbWVudGlvbmVkXG4gICAgICAgICAgICBsZXQgdGV4dFN0ciA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICB0ZXh0U3RyICs9IFwiIFwiICsgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENoZWNrIGFyaWEtZGVzY3JpYmVkYnkgZm9yIHdhcm5pbmcgdGV4dFxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVzY3JpYmVkYnlJZHMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGlkIG9mIGRlc2NyaWJlZGJ5SWRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWZlcmVuY2VkRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBpZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlc2NyaWJlZFRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChyZWZlcmVuY2VkRWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpYmVkVGV4dCAmJiBkZXNjcmliZWRUZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0ciArPSBcIiBcIiArIGRlc2NyaWJlZFRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCBwYXJhbXMucGFyYW1XaW5UZXh0LnZhbHVlLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGlmICh0ZXh0U3RyLmluZGV4T2YocGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZVtpXSkgIT0gLTEpIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfd2FyblwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcyB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhX3RleHRfcHVycG9zZTogUnVsZSA9IHtcbiAgICBpZDogXCJhX3RleHRfcHVycG9zZVwiLFxuICAgIC8vIGRvYy1iaWJsaW9yZWYgaXMgYSBsaW5rXG4gICAgY29udGV4dDogXCJhcmlhOmxpbmssYXJpYTpkb2MtYmlibGlvcmVmXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQV9IYXNUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2FjY19uYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgLFxuICAgICAgICAgICAgXCJwYXNzXCI6IGBhX3RleHRfcHVycG9zZS5odG1sYCxcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBgYV90ZXh0X3B1cnBvc2UuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSHlwZXJsaW5rcyBtdXN0IGhhdmUgYW4gYWNjZXNzaWJsZSBuYW1lIGZvciB0aGVpciBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJIeXBlcmxpbmsgaGFzIGEgZGVzY3JpcHRpb24gb2YgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBcIkh5cGVybGluayBoYXMgbm8gbGluayB0ZXh0LCBsYWJlbCBvciBpbWFnZSB3aXRoIGEgdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjQuNFwiLCBcIjQuMS4yXCJdLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogXCJjNDg3YWVcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFJ1bGUgb25seSBwYXNzZXMgaWYgYW4gZWxlbWVudCBoYXMgaW5uZXIgY29udGVudCxcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBvbmx5IGhpZGRlbiBjb250ZW50IHVuZGVyIHRoZSB0aGUgZWxlbWVudCBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgICBjb25zdCBhY2NOYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIChhY2NOYW1lX3BhaXIgJiYgYWNjTmFtZV9wYWlyLm5hbWUgJiYgYWNjTmFtZV9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgLyoqQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDAqL1xuICAgICAgICAgICAgfHwgQ29tbW9uVXRpbC5ub25UYWJhYmxlQ2hpbGRDaGVjayhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2FjY19uYW1lXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhcHBsZXRfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcHBsZXRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFwcGxldFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0FwcGxldF9IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGFwcGxldD4gZWxlbWVudHMgbXVzdCBwcm92aWRlIGFuICdhbHQnIGF0dHJpYnV0ZSBhbmQgYW4gYWx0ZXJuYXRpdmUgZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQW4gPGFwcGxldD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuICdhbHQnIGF0dHJpYnV0ZSB0aGF0IHByb3ZpZGVzIGEgc2hvcnQgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2FsdCcgYXR0cmlidXRlIHZhbHVlIGZvciBhbiA8YXBwbGV0PiBlbGVtZW50IGR1cGxpY2F0ZXMgdGhlICdjb2RlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiQW4gPGFwcGxldD4gZWxlbWVudCBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0LCBidXQgZG9lcyBub3QgcHJvdmlkZSBpbm5lciBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMS4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNvZGVcIikgJiYgYWx0ID09IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvZGVcIikudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FwcGxpY2F0aW9uX1JvbGVfVGV4dFwiOiB7XG4gICAgICAgICAgICAwOiBgSEFBQ19BcHBsaWNhdGlvbl9Sb2xlX1RleHQuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIDA6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIk5vbi1kZWNvcmF0aXZlIHN0YXRpYyB0ZXh0IGFuZCBpbWFnZSBjb250ZW50IHdpdGhpbiBhbiBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIG11c3QgYmUgYWNjZXNzaWJsZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBub24tZGVjb3JhdGl2ZSBzdGF0aWMgdGV4dCBhbmQgaW1hZ2UgY29udGVudCB3aXRoaW4gYW4gZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBhcmUgYWNjZXNzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIxLjEuMVwiLCBcIjIuMS4xXCJdLCAvL21hdGNoIGxpc3RpbmcgaW4gaGVscFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcnVsZUNvbnRleHQuY2hpbGROb2RlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZVZpc2libGUoY2hpbGRyZW5baV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhjaGlsZHJlbltpXSwgXCJkb2N1bWVudFwiKSB8fCBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwiYXJ0aWNsZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gY2hpbGRyZW5baV0ubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFyZWFfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmVhX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTphcmVhXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQXJlYV9IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyZWFfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmVhX2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJlYV9hbHRfZXhpc3RzLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxhcmVhPiBlbGVtZW50cyBpbiBhbiBpbWFnZSBtYXAgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCI8YXJlYT4gZWxlbWVudCBpbiBhbiBpbWFnZSBtYXAgaGFzIG5vIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMS4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbn1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb2x1bW5oZWFkZXIsIGFyaWE6aGVhZGluZywgYXJpYTpyb3doZWFkZXIsIGFyaWE6Z3JhcGhpY3MtZG9jdW1lbnQsYXJpYTpncmFwaGljcy1zeW1ib2wsIGFyaWE6aW1nLGFyaWE6aW1hZ2UsIGRvYy1iYWNrbGluaywgZG9jLWJpYmxpb2VudHJ5LCBkb2MtYmlibGlvcmVmLCBkb2MtZ2xvc3NyZWYsIGRvYy1ub3RlcmVmLCBkb2MtcGFnZWJyZWFrLCBkb2MtZXhhbXBsZVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lXCI6IFwiYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZV9pbWFnZVwiOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJBbiBhY2Nlc3NpYmxlIG5hbWUgaXMgcHJvdmlkZWQgZm9yIHRoZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lXCI6IFwiRWxlbWVudCA8ezB9PiB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaGFzIG5vIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZV9pbWFnZVwiOiBcIkVsZW1lbnQgPHswfT4gd2l0aCBcXFwiezF9XFxcIiByb2xlIGhhcyBubyBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyB3aXRoIGNlcnRhaW4gcm9sZXMgc2hvdWxkIGhhdmUgYWNjZXNzaWJsZSBuYW1lc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIl1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVfaW1hZ2VcIl1cbiAgICB9XSxcbiAgICBhY3Q6IFt7XCIyM2EyYThcIjogeyBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCI6IFwiZmFpbFwifX1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgLy8gc3ZnIGVsZW1lbnQgaXMgaGFuZGxlZCBpbiBzdmdfZ3JhcGhpY3NfbGFiYmVsbGVkIHJ1bGUgYW5kIGltYWdlIHJ1bGVzXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3N2ZycgfHwgbm9kZU5hbWUgPT09ICdpbWcnKSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvLyB3aGVuIHRhYmxlIGVsZW1lbnQgd2l0aCBhIGNhcHRpb24gYXMgZmlyc3QgY2hpbGRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAndGFibGUnIFxuICAgICAgICAgICAgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2NhcHRpb24nXG4gICAgICAgICAgICAmJiBydWxlQ29udGV4dC5maXJzdEVsZW1lbnRDaGlsZC50ZXh0Q29udGVudCAmJiBydWxlQ29udGV4dC5maXJzdEVsZW1lbnRDaGlsZC50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgY29uc3QgaW52YWxpZFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZFJvbGVzICYmIGludmFsaWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZFJvbGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkUm9sZXMgJiYgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldERlcHJlY2F0ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlidXRlcyAmJiBkZXByZWNhdGVkQXR0cmlidXRlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcm9sZSB8fCAhQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdIHx8ICFBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZVJlcXVpcmVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIW5hbWVfcGFpciB8fCAhbmFtZV9wYWlyLm5hbWUgfHwgbmFtZV9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHJvbGUgPT09ICdpbWcnIHx8IHJvbGUgPT09ICdpbWFnZScpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVfaW1hZ2VcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHJvbGVdKTsgXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcm9sZV0pO1xuICAgICAgICB9ICAgIFxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtYWN0aXZlZGVzY2VuZGFudF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0ludmFsaWRUYWJpbmRleEZvckFjdGl2ZWRlc2NlbmRhbnRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHswfT4gZWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBzZXQgdG8gXFxcInsxfVxcXCIgaXMgbm90IHRhYmJhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBzaG91bGQgYmUgdGFiYmFibGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBSdWxlIG5vdCBzdXBwb3J0ZWQgb24gbW9iaWxlXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKS5zdWJzdHJpbmcoMCwgMykgPT0gXCJtYmxcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIGJ5IGEgZGlzYWJsZWQgSFRNTDUgYXR0cmlidXRlIG9yIGFyaWEtZGlzYWJsZWQ6XG4gICAgICAgIC8vICAxLiBJbiB0aGUgY2FzZSB0aGF0IHRoaXMgZWxlbWVudCBoYXMgYSBkaXNhYmxlZCBhdHRyaWJ1dGUgYW5kIHRoZSBlbGVtZW50IHN1cHBvcnRzIGl0LCB3ZSBtYXJrIHRoaXMgcnVsZSBhcyBwYXNzZWQuXG4gICAgICAgIC8vICAyLiBJbiB0aGUgY2FzZSB0aGF0IHRoaXMgZWxlbWVudCBoYXMgYW4gYXJpYS1kaXNhYmxlZCBhdHRyaWJ1dGUgdGhlbiwgd2UgbWFyayB0aGlzIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAvLyBGb3IgYm90aCBvZiB0aGUgY2FzZXMgYWJvdmUgd2UgZG8gbm90IG5lZWQgdG8gcGVyZm9ybSBhbnkgZnVydGhlciBjaGVja3MsIGFzIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIGluIHNvbWUgZm9ybSBvciBhbm90aGVyLlxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGF0dHJpYnV0ZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyBibGFua1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gSWYgdGhlIHRhYmluZGV4IGF0dHJpYnV0ZSBpcyBwcm92aWRlZCB0aGVuIHZlcmlmeSB0aGF0IGl0IGlzIDAgb3IgLTFcbiAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgY2hpbGRyZW4gaXMgdGFiYmFibGUuIGluIHRoaXMgY2FzZSwgdGhlIHRhYiB3aWxsIHN0b3Agb24gdGhlIGZpcnN0IHRhYmJhYmxlIGVsZW1lbnRcbiAgICAgICAgaWYgKCFwYXNzZWQpIFxuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5nZXRUYWJiYWJsZUNoaWxkcmVuKHJ1bGVDb250ZXh0KSA+IDA7XG5cbiAgICAgICAgLy8gQnVpbGQgYXJyYXkgZm9yIG5vZGUgdG9rZW5cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjEucHVzaChub2RlTmFtZSk7XG5cbiAgICAgICAgLy8gQnVpbGQgYXJyYXkgZm9yIGlkIHJlZmVyZW5jZWQgYnkgYXJpYS1hY3RpdmVkZXNjZW5kYW50XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2gocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpLnNwbGl0KFwiIFwiKS5qb2luKFwiLCBcIikpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLWFjdGl2ZWRlc2NlbmRhbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FjdGl2ZURlc2NlbmRhbnRDaGVja1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgICAgICAvLyBcIkZhaWxfNFwiOiBcIkZhaWxfNFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfNFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIHByb3BlcnR5IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSByZWZlcmVuY2VzIGEgaGlkZGVuIG5vZGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRWxlbWVudCBpcyBub3QgYSBjb21ib2JveCwgYW5kIHRoZSByZWZlcmVuY2VkIGFjdGl2ZS1kZXNjZW5kYW50IGVsZW1lbnQgaXMgbm90IGEgdmFsaWQgZGVzY2VuZGFudFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzRcIjogXCJFbGVtZW50IGlzIGEgY29tYm9ib3gsIGFuZCB0aGUgcmVmZXJlbmNlZCBhY3RpdmUtZGVzY2VuZGFudCBlbGVtZW50IGlzIG5vdCBjb250cm9sbGVkIGJ5IHRoaXMgY29tcG9uZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIHByb3BlcnR5IG11c3QgcmVmZXJlbmNlIHRoZSAnaWQnIG9mIGEgbm9uLWVtcHR5LCBub24taGlkZGVuIGFjdGl2ZSBjaGlsZCBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gY29tYm9ib3ggYWN0aXZlIGRlc2NlbmRhbnRzIGhhbmRsZWQgYnkgJ2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50J1xuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZXNjZW5kYW50X2lkID0gQXJpYVV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgIC8vIFBPRjE6IFRoZSBhdHRyaWJ1dGUgaXMgZW1wdHlcbiAgICAgICAgaWYgKCFkZXNjZW5kYW50X2lkIHx8IGRlc2NlbmRhbnRfaWQudHJpbSgpID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVzY2VuZGFudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBkZXNjZW5kYW50X2lkLnRyaW0oKSk7XG4gICAgICAgIGlmICghZGVzY2VuZGFudCB8fCBET01VdGlsLnNhbWVOb2RlKGRlc2NlbmRhbnRfaWQsIHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgLy8gVGhlIHJlZmVyZW5jZWQgZWxlbWVudCBkb2Vzbid0IGV4aXN0LiBXZSBsZXQgMTA3NyB0byB0cmlnZ2VyIHRoZSBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgLy8gUE9GMjogYXJpYS1hY3RpdmVkZXNjZW5kYW50IHJlZmVyZW5jZXMgYSBoaWRkZW4gbm9kZVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMS4gVGhlIHZhbHVlIG9mIGFyaWEtYWN0aXZlZGVzY2VuZGFudCByZWZlcnMgdG8gYW4gZWxlbWVudCB0aGF0IGlzIGVpdGhlciBhIGRlc2NlbmRhbnQgb2YgXG4gICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggRE9NIGZvY3VzXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvZklkID0gMjtcblxuICAgICAgICAvLyBvciBpcyBhIGxvZ2ljYWwgZGVzY2VuZGFudCBhcyBpbmRpY2F0ZWQgYnkgdGhlIGFyaWEtb3ducyBhdHRyaWJ1dGUuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgIGxldCBvd25lZF9pZHMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnRyaW0oKSkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvd25lZF9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb3duZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIG93bmVkX2lkc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKG93bmVkX2VsZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShvd25lZF9lbGUsIHJ1bGVDb250ZXh0KSAmJiBvd25lZF9lbGUuY29udGFpbnMoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIFRoZSBlbGVtZW50IHdpdGggRE9NIGZvY3VzIGlzIGEgdGV4dGJveCB3aXRoIGFyaWEtY29udHJvbHMgcmVmZXJyaW5nIHRvIGFuIGVsZW1lbnQgdGhhdCBcbiAgICAgICAgLy8gIHN1cHBvcnRzIGFyaWEtYWN0aXZlZGVzY2VuZGFudCwgYW5kIHRoZSB2YWx1ZSBvZiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgc3BlY2lmaWVkIGZvciB0aGUgXG4gICAgICAgIC8vICB0ZXh0Ym94IHJlZmVycyB0byBlaXRoZXIgYSBkZXNjZW5kYW50IG9mIHRoZSBlbGVtZW50IGNvbnRyb2xsZWQgYnkgdGhlIHRleHRib3ggb3IgaXMgYSBsb2dpY2FsIFxuICAgICAgICAvLyAgZGVzY2VuZGFudCBvZiB0aGF0IGNvbnRyb2xsZWQgZWxlbWVudCBhcyBpbmRpY2F0ZWQgYnkgdGhlIGFyaWEtb3ducyBhdHRyaWJ1dGUuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDM7XG4gICAgICAgICAgICBsZXQgY29udHJvbGxlZF9pZHMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbGxlZF9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udHJvbGxlZF9lbGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgY29udHJvbGxlZF9pZHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVkX2VsZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShjb250cm9sbGVkX2VsZSwgcnVsZUNvbnRleHQpICYmIGNvbnRyb2xsZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZWRfZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duc19pZHMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udHJvbGxlZF9lbGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnRyaW0oKSkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG93bnNfaWRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIG93bnNfaWRzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZWRfZWxlLCBydWxlQ29udGV4dCkgJiYgb3duZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMzogSSdtIG5vdCBhIGNvbWJvYm94LCBhbmQgdGhlIHJlZmVyZW5jZWQgYWN0aXZlLWRlc2NlbmRhbnQgaXMgbm90IGEgZGVzY2VuZGFudCBhbmQgbm90IG93bmVkIGJ5IHRoZSBlbGVtZW50IFxuICAgICAgICAvLyB0aGF0IHJlZmVyZW5jZWQgaXQuXG4gICAgICAgIGlmIChwb2ZJZCA9PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUFwcGxpY2F0aW9uTGFuZG1hcmtzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwiYXBwbGljYXRpb25cIik7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXBwbGljYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0FwcGxpY2F0aW9uTGFuZG1hcmtMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9ub19sYWJlbFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2xhYmVsXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBoYXMgYSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2xhYmVsXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2xhYmVsXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXJ0aWNsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVBcnRpY2xlUm9sZXNfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImFydGljbGVcXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImFydGljbGVcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJhcnRpY2xlXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJhcnRpY2xlXCIpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9WYWxpZFByb3BlcnR5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyaWFfYXR0cmlidXRlX2FsbG93ZWQuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIGF0dHJpYnV0ZXMgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQncyByb2xlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBhdHRyaWJ1dGUocykgJ3swfScgcmVmZXJlbmNlZCBieSB0aGUgZWxlbWVudCA8ezF9PiBpcyBub3QgYSB2YWxpZCBBUklBIHN0YXRlIG9yIHByb3BlcnR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNWY5OWE3XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgXG4gICAgICAgIC8vIFRoaXMgZ2V0cyBhbGwgZWxlbWVudHMgd2l0aCBhdHRyaWJ1dGVzIHNvIHdlIHN0aWxsIGhhdmUgc29tZVxuICAgICAgICAvLyBPdXQgb2YgU2NvcGUgc2luY2Ugbm90IGFsbCBhdHRyaWJ1dGVzIGFyZSBhcmlhIFxuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgbGV0IHByb3BlcnR5RGF0YVR5cGVzID0gQVJJQURlZmluaXRpb25zLnByb3BlcnR5RGF0YVR5cGVzO1xuICAgICAgICAgICAgbGV0IGZhaWxlZFByb3BlcnRpZXMgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IHRlc3RlZFByb3BlcnRpZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGNvbnRleHRBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgLy8gTm93IHdlIGp1c3QgaGF2ZSBhcmlhIGF0dHJpYnV0ZXMgd2hpY2ggY2FuXG4gICAgICAgICAgICAgICAgICAgIC8vIHBhc3Mgb3IgZmFpbCBiYXNlZCBvbiB3aGV0aGVyIHRoZXJlIHByb3BlcnR5IGlzIHZhbGlkXG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVHlwZXMgPSBwcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YVR5cGVzKSB7IC8vIGlmIHByb3BlcnR5IGlzIG5vdCBpbiB2YWxpZCBwcm9wZXJ0eSBsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZmFpbGVkUHJvcGVydGllcyBjb21tYSBzZXAgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxlZFByb3BlcnRpZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRQcm9wZXJ0aWVzID0gYXR0ck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZFByb3BlcnRpZXMgPSBmYWlsZWRQcm9wZXJ0aWVzICsgXCIsIFwiICsgYXR0ck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGVzdGVkUHJvcGVydGllcyA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZhaWxlZFByb3BlcnRpZXMubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2ZhaWxlZFByb3BlcnRpZXMsIHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSkNIIC0gcGFzc2luZyBpcyBiYXNlZCBvbiBhbGwgYXR0cmlidXRlcyBub3QganVzdCBhcmlhIGF0dHJpYnV0ZXNcbiAgICAgICAgLy8gICAgICAgbGVhZGluZyB0byBPVkVSIENPVU5USU5HIHNvIG1vdmVkIHBhc3MgdXBcbiAgICAgICAgLy9yZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgfVxufVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3Q6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3RcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtcmVxdWlyZWRdLCBkb206KlthcmlhLWF1dG9jb21wbGV0ZV0sIGRvbToqW2FyaWEtcmVhZG9ubHldLCBkb206KlthcmlhLWRpc2FibGVkXSwgZG9tOipbYXJpYS1wbGFjZWhvbGRlcl1cIiBcbiAgICAgICAgICAgICsgXCIsIGRvbToqW2FyaWEtY2hlY2tlZF0sIGRvbToqW2FyaWEtaGlkZGVuXSwgZG9tOipbYXJpYS12YWx1ZW1heF0sIGRvbToqW2FyaWEtdmFsdWVtaW5dLCBkb206KlthcmlhLWNvbHNwYW5dXCJcbiAgICAgICAgICAgICsgXCIsIGRvbToqW2FyaWEtcm93c3Bhbl1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2NvbmZsaWN0XCI6IFwiYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBpcyBub3QgY29uZmxpY3Qgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBIVE1MIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2NvbmZsaWN0XCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIGlzIGluIGNvbmZsaWN0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBBUklBIGF0dHJpYnV0ZSBtdXN0IG5vdCBjb25mbGljdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy8gZGVwZW5kZW5jeSBjaGVjazogaWYgdGhlIEFSSUEgYXR0cmlidXRlIGlzIGNvbXBsZXRlbHkgaW52YWxpZCwgc2tpcCB0aGlzIGNoZWNrXG4gICAgICAgIGxldCBpbnZhbGlkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldEludmFsaWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChpbnZhbGlkQXR0cmlidXRlcyAmJiBpbnZhbGlkQXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGxldCBhcmlhQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWFyaWFBdHRyaWJ1dGVzIHx8IGFyaWFBdHRyaWJ1dGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGNvbmZsaWN0QXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25mbGljdEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9jb25mbGljdFwiLCBbY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydhcmlhQXR0ciddLCBjb25mbGljdEF0dHJpYnV0ZXNbaV1bJ2h0bWxBdHRyJ11dKSk7XG4gICAgICAgICAgICBpZiAoYXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydhcmlhQXR0ciddKSlcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoW2NvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXV0sIGFyaWFBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuXG4gICAgICAgIHJldHVybiBudWxsOyAgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfcm9sZVwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JvbGVfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiVGhlIEFSSUEgcm9sZXMgYW5kIGF0dHJpYnV0ZSBhcmUgdXNlZCBwZXIgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfcm9sZVwiOiBcIlRoZSBBUklBIHJvbGUgXFxcInswfVxcXCIgaXMgZGVwcmVjYXRlZCBpbiB0aGUgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcImZhaWxfYXJpYV9hdHRyXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlcyBcXFwiezB9XFxcIiBhcmUgZGVwcmVjYXRlZCBpbiB0aGUgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcImZhaWxfcm9sZV9hdHRyXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlcyBcXFwiezB9XFxcIiBhcmUgZGVwcmVjYXRlZCBmb3IgdGhlIHJvbGUgXFxcInsxfVxcXCIgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk5vIGRlcHJlY2F0ZWQgQVJJQSByb2xlIG9yIGF0dHJpYnV0ZSBzaG91bGQgYmUgdXNlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkUm9sZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYVJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRSb2xlcyAmJiBkZXByZWNhdGVkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXByZWNhdGVkUm9sZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoJ2ZhaWxfYXJpYV9yb2xlJywgW2RlcHJlY2F0ZWRSb2xlc1tpXV0pKTsgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXByZWNhdGVkQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIFwicm9sZVwiOlwiYW55XCIsIFwiYXR0cmlidXRlXCI6YXJpYUF0dHJzW2ldfVxuICAgICAgICAgICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5yb2xlID09PSAnYW55JylcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoJ2ZhaWxfYXJpYV9hdHRyJywgW2RlcHJlY2F0ZWRBdHRyaWJ1dGVzW2ldLmF0dHJpYnV0ZV0pKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX3JvbGVfYXR0cicsIFtkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5hdHRyaWJ1dGUsIGRlcHJlY2F0ZWRBdHRyaWJ1dGVzW2ldLnJvbGVdKSk7XG4gICAgICAgICAgICB9ICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfRW1wdHlQcm9wZXJ0eVZhbHVlXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIjogXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfZW1wdHlfYXR0cmlidXRlXCI6IFwiVGhlIGVsZW1lbnQgYXR0cmlidXRlKHMpOiAnezB9JyB2YWx1ZSBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIldoZW4gc3BlY2lmeWluZyBhIHJlcXVpcmVkIEFSSUEgYXR0cmlidXRlLCB0aGUgdmFsdWUgbXVzdCBub3QgYmUgZW1wdHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtcIjZhNzI4MVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IENvbW1vblV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBsZXQgdGVzdGVkUHJvcGVydGllcyA9IDA7XG5cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXJvbGUpIHJldHVybjtcbiAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFyaWFVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZSwgcnVsZUNvbnRleHQpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCByZXF1aXJlZFJvbGVQcm9wcyA9IEFyaWFVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJlcXVpcmVkUm9sZVByb3BzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9IHJlcXVpcmVkUm9sZVByb3BzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShyZXF1aXJlZFJvbGVQcm9wc1tpXSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlLmxlbmd0aCA9PSAwKSBhdHRyTmFtZUFyci5wdXNoKHJlcXVpcmVkUm9sZVByb3BzW2ldKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS1sYWJlbGxlZGJ5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChyb2xlID09IFwicmFkaW9ncm91cFwiKSAmJiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkgYXR0ck5hbWVBcnIucHVzaChcImFyaWEtbGFiZWxcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS12YWx1ZW5vd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocm9sZSA9PSBcInByb2dyZXNzYmFyXCIpICYmIChoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS12YWx1ZXRleHRcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtdmFsdWV0ZXh0XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDApIGF0dHJOYW1lQXJyLnB1c2goXCJhcmlhLXZhbHVldGV4dFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVdKSB7XG4gICAgICAgICAgICBsZXQgdGFnUHJvcGVydHkgPSBBcmlhVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGxldCBwZXJtaXR0ZWRSb2xlcyA9IFtdO1xuICAgICAgICAgICAgcGVybWl0dGVkUm9sZXMucHVzaChyb2xlKTtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcGVybWl0dGVkUm9sZXMsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBhbGxvd2VkQXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBhbGxvd2VkQXR0cmlidXRlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlID09IFwiYXJpYS1jaGVja2VkXCIgfHwgYXR0cmlidXRlID09IFwiYXJpYS1zZWxlY3RlZFwiIHx8XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9PSBcImFyaWEtZXhwYW5kZWRcIiB8fCBhdHRyaWJ1dGUgPT0gXCJhcmlhLW9yaWVudGF0aW9uXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlID09IFwiYXJpYS1sZXZlbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWUgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCAmJiAhYXR0ck5hbWVBcnIuaW5jbHVkZXMoYXR0cmlidXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRNc2cgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwO1xuICAgICAgICByZXRNc2cucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcmV0TXNnKTtcbiAgICAgICAgaWYgKHRlc3RlZFByb3BlcnRpZXMgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIiwgcmV0TXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLXJlcXVpcmVkXSwgZG9tOipbYXJpYS1hdXRvY29tcGxldGVdLCBkb206KlthcmlhLXJlYWRvbmx5XSwgZG9tOipbYXJpYS1kaXNhYmxlZF0sIGRvbToqW2FyaWEtcGxhY2Vob2xkZXJdXCIgXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLWNoZWNrZWRdLCBkb206KlthcmlhLWhpZGRlbl0sIGRvbToqW2FyaWEtdmFsdWVtYXhdLCBkb206KlthcmlhLXZhbHVlbWluXSwgZG9tOipbYXJpYS1jb2xzcGFuXVwiXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLXJvd3NwYW5dXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlIGlzIG5vdCByZWR1bmRhbnQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGUgXFxcInswfVxcXCIgaXMgcmVkdW5kYW50IHdpdGggdGhlIEhUTUwgYXR0cmlidXRlIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gQVJJQSBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBiZSByZWR1bmRhbnQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIHRoZSBBUklBIGF0dHJpYnV0ZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgICAgICBsZXQgaW52YWxpZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZEF0dHJpYnV0ZXMgJiYgaW52YWxpZEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlmIGNvbmZsaWN0IGFscmVhZHkgcmVwb3J0ZWQsIGlnbm9yZSByZXBvcnRpbmcgb3ZlcmxhcFxuICAgICAgICBsZXQgY29uZmxpY3RBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0Q29uZmxpY3RBcmlhQW5kSHRtbEF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY29uZmxpY3RBdHRyaWJ1dGVzICYmIGNvbmZsaWN0QXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgYXJpYUF0dHJzID0gW107XG4gICAgICAgIGxldCBodG1sQXR0cnMgPSBbXTtcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsgXG4gICAgICAgICAgICAgICAgbGV0IGF0dHJWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gJycpIGF0dHJWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykgXG4gICAgICAgICAgICAgICAgICAgIGFyaWFBdHRycy5wdXNoKHtuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZX0pO1xuICAgICAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRycy5wdXNoKHtuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gQXJpYVV0aWwuZ2V0Q29uZmxpY3RPck92ZXJsYXBwaW5nSHRtbEF0dHJpYnV0ZShhcmlhQXR0cnNbaV0sIGh0bWxBdHRycywgJ292ZXJsYXBwaW5nJyk7XG4gICAgICAgICAgICBpZiAoZXhhbWluZWRIdG1sQXRyTmFtZXMgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdQYXNzJykgeyAvL3Bhc3NcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW1bJ3Jlc3VsdCddID09PSAnRmFpbGVkJykgeyAvL2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfcmVkdW5kYW50XCIsIFthcmlhQXR0cnNbaV1bJ25hbWUnXSwgaXRlbVsnYXR0ciddXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pOyAgICBcbiAgICAgICAgfSAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1JlcXVpcmVkUHJvcGVydGllc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9taXNzaW5nXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkLmh0bWxgLFxuICAgICAgICAgICAgXCJwYXNzXCI6IGBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC5odG1sYCxcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nXCI6IGBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgcmVxdWlyZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnQgd2l0aCBhIHJvbGUgbXVzdCBiZSBkZWZpbmVkXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgcmVxdWlyZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnQgd2l0aCB0aGUgcm9sZSBhcmUgZGVmaW5lZFwiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdcIjogXCJFbGVtZW50IHdpdGggJ3swfScgcm9sZSBkb2VzIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBBUklBIGF0dHJpYnV0ZShzKTogJ3sxfSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCI0LjEuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI0ZThhYjZcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgYXR0ck5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgLy9sZXQgaW1wbGljaXRSb2xlID0gQVJJQU1hcHBlci5lbGVtVG9JbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICAvL2xldCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgaGFzQXR0cmlidXRlID0gQ29tbW9uVXRpbC5oYXNBdHRyaWJ1dGU7XG4gICAgICAgIGxldCB0ZXN0ZWRSb2xlcyA9IDA7XG5cbiAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFyb2xlKSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcmVxdWlyZWRSb2xlUHJvcHMgPSBBcmlhVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGUsIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVdICYmIHJlcXVpcmVkUm9sZVByb3BzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgYWxsb3dlZFJvbGVQcm9wcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcm9sZSwgdGFnUHJvcGVydHkpO1xuICAgICAgICAgICAgbGV0IHJvbGVNaXNzaW5nUmVxUHJvcCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHByb3BlcnRpZXNMZW5ndGggPSByZXF1aXJlZFJvbGVQcm9wcy5sZW5ndGg7IGkgPCBwcm9wZXJ0aWVzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFsbG93ZWRSb2xlUHJvcHMuaW5jbHVkZXMocmVxdWlyZWRSb2xlUHJvcHNbaV0pKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgcmVxdWlyZWRSb2xlUHJvcHNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIGFyaWEtbGFiZWxsZWRieSBpc24ndCBwcmVzZW50LCBhbiBhcmlhLWxhYmVsIHdpbGwgbWVldCB0aGUgcmVxdWlyZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtbGFiZWxsZWRieVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbFwiKSkgfHwgKHJvbGUgIT0gXCJyYWRpb2dyb3VwXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU1pc3NpbmdSZXFQcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtdmFsdWVub3dcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtdmFsdWV0ZXh0XCIpKSB8fCAocm9sZSAhPSBcInByb2dyZXNzYmFyXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU1pc3NpbmdSZXFQcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtY29udHJvbHNcIiAmJiByb2xlID09IFwiY29tYm9ib3hcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIGNoZWNrIHNpbmNlIGFyaWEtY29udHJvbHMgaW4gdGhlIHRleHRib3ggb2YgYSBjb21ib2JveCBpcyBhbHJlYWR5IGhhbmRsZWQgaW4gcnVsZSBIQUFDX0NvbWJvYm94X011c3RfaGF2ZV9UZXh0X0lucHV0XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKHJlcXVpcmVkUm9sZVByb3BzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm9sZU1pc3NpbmdSZXFQcm9wID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByb2xlTmFtZUFyci5wdXNoKHJvbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gcm9sZU5hbWVBcnIubGVuZ3RoID09IDAgfHwgYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7IC8vIG9ubHkgYXJpYSBhdHRyaWJ1dGVzIHNvIE5PIE9VVCBPRiBTQ09QRVxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICByZXRUb2tlbi5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX21pc3NpbmdcIiwgcmV0VG9rZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRQcm9wZXJ0eVZhbHVlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIHByb3BlcnR5IHZhbHVlcyBtdXN0IGJlIHZhbGlkXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSB2YWx1ZSBcXFwiezB9XFxcIiBzcGVjaWZpZWQgZm9yIGF0dHJpYnV0ZSAnezF9JyBvbiBlbGVtZW50IDx7Mn0+IGlzIG5vdCB2YWxpZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI2YTcyODFcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdmFsdWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkYXRhVHlwZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcHJvcGVydHlEYXRhVHlwZXMgPSBBUklBRGVmaW5pdGlvbnMucHJvcGVydHlEYXRhVHlwZXM7XG4gICAgICAgIGxldCBjb250ZXh0QXR0cmlidXRlcyA9IHJ1bGVDb250ZXh0LmF0dHJpYnV0ZXM7XG4gICAgICAgIGxldCB0ZXN0ZWRQcm9wZXJ0eVZhbHVlcyA9IDA7XG5cbiAgICAgICAgaWYgKGNvbnRleHRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gY29udGV4dEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlcyA9IHByb3BlcnR5RGF0YVR5cGVzW2F0dHJOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0eVZhbHVlcysrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMudmFsdWVzLmluZGV4T2Yobm9kZVZhbHVlKSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMudmFsdWVzLmluZGV4T2YoJ3VuZGVmaW5lZCcpICE9IC0xICYmIG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RyYW5zbGF0ZSAndW5kZWZpbmVkJyB0byBtZWFuICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJpYS1yZWxldmFudCBpcyByZXByZXNlbnRlZCBhcyBhIHNwYWNlIGRlbGltaXRlZCBsaXN0IG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkaXRpb25zLCByZW1vdmFscywgdGV4dDsgb3IgYSBzaW5nbGUgY2F0Y2gtYWxsIHZhbHVlIGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcy50eXBlID09PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5zXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWVzID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgYWxsIGlzIHNwZWNpZmllZCwgaXQgY2Fubm90IGhhdmUgYW55IG90aGVyIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0clZhbHVlcy5sZW5ndGggPiAxICYmIGF0dHJWYWx1ZXMuaW5jbHVkZXMoXCJhbGxcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZS5zcGxpdChcIiBcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc2ggPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJWYWx1ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGluZGl2aWR1YWwgdmFsdWUgaXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWVzW2pdICE9IFwiXCIgJiYgIWRhdGFUeXBlcy52YWx1ZXMuaW5jbHVkZXMoYXR0clZhbHVlc1tqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzaC5oYXNPd25Qcm9wZXJ0eShhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoW2F0dHJOYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKGF0dHJWYWx1ZXNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGVBcnIucHVzaChkYXRhVHlwZXMudmFsdWVzLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGVBcnIucHVzaChkYXRhVHlwZXMudmFsdWVzLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiBkYXRhVHlwZXMudHlwZSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlWYWwgPSBwYXJzZUludChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGlWYWwpIHx8IChcIlwiICsgaVZhbCAhPT0gbm9kZVZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2gobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmVmFsID0gcGFyc2VGbG9hdChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGZWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiAoZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG1wViA9IG5vZGVWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXBWICE9PSBcInRydWVcIiAmJiB0bXBWICE9PSBcImZhbHNlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlICYmIChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydHlWYWx1ZXMtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0TXNnID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhdHRyTmFtZUFyci5sZW5ndGggPT0gMDtcbiAgICAgICAgcmV0TXNnLnB1c2godmFsdWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgcmV0TXNnLnB1c2goYXR0ck5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgcmV0TXNnLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIC8vIHJldE1zZy5wdXNoIChkYXRhVHlwZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcmV0TXNnKTtcbiAgICAgICAgaWYgKHRlc3RlZFByb3BlcnR5VmFsdWVzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCByZXRNc2cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YmFubmVyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUJhbm5lckxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImJhbm5lclwiLCB0cnVlKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYmFubmVyX3NpbmdsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Jhbm5lcl9zaW5nbGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206aGVhZGVyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9PbmVCYW5uZXJJblNpYmxpbmdTZXRfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYmFubmVyX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImJhbm5lclxcXCIgcm9sZSBmb3VuZCBvbiB0aGUgcGFnZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgcGFnZSwgZG9jdW1lbnQsIG9yIGFwcGxpY2F0aW9uIHNob3VsZCBvbmx5IGhhdmUgb25lIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICghQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImJhbm5lclwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIEFyaWFVdGlsLmdldFNpYmxpbmdXaXRoUm9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICBcImJhbm5lclwiLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKSA9PT0gbnVsbDtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2NoaWxkX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY2hpbGRfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX01pc3NpbmdGb2N1c2FibGVDaGlsZFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ19jaGlsZFwiOiBcImZhaWxfbWlzc2luZ19jaGlsZFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfY2hpbGRfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJhcmlhX2NoaWxkX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NoaWxkX3RhYmJhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ19jaGlsZFwiOiBcIk5vbmUgb2YgdGhlIGRlc2NlbmRlbnQgZWxlbWVudHMgd2l0aCBcXFwiezF9XFxcIiByb2xlIGlzIHRhYmJhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVUkgY29tcG9uZW50IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdGFiYmFibGUgZGVzY2VuZGFudCBmb3Iga2V5Ym9hcmQgYWNjZXNzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCByZXF1aXJlcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmIChBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSB8fCBBcmlhVXRpbC5zaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIEFuIEFSSUEgbGlzdCBpcyBub3QgaW50ZXJhY3RpdmVcbiAgICAgICAgaWYgKEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHsgXCJsaXN0XCI6IHRydWUsIFwicm93XCI6IHRydWUsIFwicm93Z3JvdXBcIjogdHJ1ZSwgXCJ0YWJsZVwiOiB0cnVlLCBcImdyaWRcIjogdHJ1ZSB9KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3QgYSB2YWxpZCBtZXNzYWdlIGZvciBtb2JpbGUgYmVjYXVzZSBhbGwgZWxlbWVudHMgYXJlIGZvY3VzYWJsZSBpbiBpT1Mgd2hlbiBWb2ljZU92ZXIgaXMgZW5hYmxlZC5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNsYXNzXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNsYXNzXCIpLnN1YnN0cmluZygwLCAzKSA9PSBcIm1ibFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2RhdGFsaXN0JylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgZWxlbWVudCdzIG5hdmlnYXRpb24gaXMgY29udHJvbGxlZCBieSBhbm90aGVyIGVsZW1lbnQsIHN1Y2ggYXMgY29tYm9ib3hcbiAgICAgICAgaWYgKEFyaWFVdGlsLmlzTmF2aWdhdGlvbk93bmVkT3JDb250cm9sbGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgXG5cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IFwiXCI7XG4gICAgICAgIGxldCBpblNjb3BlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5jb250YWluZXJzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICBsZXQgZGlzYWJsZWQgPSBoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWRpc2FibGVkJykgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpIDogJyc7XG4gICAgICAgICAgICBpZiAoZGlzYWJsZWQgIT0gJ3RydWUnICYmICFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnKSAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIGxldCByZXFDaGlsZHJlbiA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yZXFDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICBpZiAocmVxQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgaW5TY29wZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeHAgPSBcImRlc2NlbmRhbnQ6OipbXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhwICs9IFwiQHJvbGU9J1wiICsgcmVxQ2hpbGRyZW5baV0gKyBcIicgb3IgXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeHAgPSB4cC5zdWJzdHJpbmcoMCwgeHAubGVuZ3RoIC0gNCkgKyAnXSc7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdCA9IGRvYy5ldmFsdWF0ZSh4cCwgcnVsZUNvbnRleHQsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcjogRWxlbWVudCA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIgJiYgIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgMS4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmlzVGFiYmFibGUocik7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVpcmVkIGNoaWxkIGlzIG5vdCBmb2N1c2FibGUgdmlhIHRhYmluZGV4LiBTZWUgaWYgdGhlcmUgaXMgYSBncmFuZGNoaWxkIHRoYXQgaXMgZm9jdXNhYmxlIGJ5IGRlZmF1bHQgb3IgYnkgdGFiaW5kZXguXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cDIgPSBcImRlc2NlbmRhbnQ6OipcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgciwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIgPSByLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGUgYXJyYXlzL3N0cmluZ3MgYXJlIGVtcHR5LCB0aGF0IG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gdmlvbGF0aW9uIHNvIHdlIGNhbiByZXNldCBpdCBiYWNrIHRvIHBhc3NlZCwgdGhlIHJlYXNvbiBmb3IgdGhpc1xuICAgICAgICAvLyBpcyB0aGF0IHdlIGFyZSBzZXR0aW5nIHBhc3NlZD1mYWxzZSB3aGlsZSB3ZSBwZXJmb3JtIGEgbG9vcCB3aGljaCBjYXVzZXMgdmlvbGF0aW9uIHRvIHRyaWdnZXIgZXZlbiBpZiB0aGVyZSBpcyBubyBpc3N1ZXMuIEluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXBkYXRpbmcgdGhlIHdob2xlIHJ1bGUgdG8gc3dpdGNoIGZyb20gdXNpbmcgcGFzc2VkIGluIHRoYXQgd2F5IHNpbXBseSBkbyB0aGUgY2hlY2sgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgaWYgKG5vZGVOYW1lLmxlbmd0aCA+IDAgJiYgcm9sZU5hbWVBcnIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0VG9rZW4xLnB1c2gobm9kZU5hbWUpO1xuICAgICAgICAgICAgcmV0VG9rZW4yLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgaWYgKCFpblNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX21pc3NpbmdfY2hpbGRcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jaGlsZF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NoaWxkX3ZhbGlkXCIsXG4gICAgLy9jb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgLy9kZXBlbmRlbmNpZXM6IFtcIlJwdF9BcmlhX1ZhbGlkUm9sZVwiXSxcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfdmFsaWRcIiwgXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vX2NoaWxkXCI6IFwiYXJpYV9jaGlsZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9jaGlsZFwiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhbiBBUklBIHJvbGUgbXVzdCBvd24gYSByZXF1aXJlZCBjaGlsZFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiQW4gZWxlbWVudCB3aXRoIGFuIEFSSUEgcm9sZSBvd25zIGEgcmVxdWlyZWQgY2hpbGRcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub19jaGlsZFwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBkb2VzIG5vdCBvd24gYW55IGNoaWxkIGVsZW1lbnQgd2l0aCBhbnkgb2YgdGhlIGZvbGxvd2luZyByb2xlKHMpOiBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfY2hpbGRcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgb3ducyB0aGUgY2hpbGQgZWxlbWVudCB3aXRoIHRoZSByb2xlIFxcXCJ7MX1cXFwiIHRoYXQgaXMgbm90IG9uZSBvZiB0aGUgYWxsb3dlZCByb2xlKHMpOiBcXFwiezJ9XFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBWZXJpZnkgbWFwcGluZ1xuICAgIGFjdDogW1wiYmM0YTc1XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJvbGVzID0gIEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGV4cGxpY2l0IG9yIGltcGxpY2l0IHJvbGUsIHNob3VsZG4ndCBoYXBwZW5cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgbm9uZSBvciBwcmVzZW50YXRpb24gcm9sZVxuICAgICAgICBsZXQgcHJlc2VudGF0aW9uUm9sZXMgPSBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdO1xuICAgICAgICBjb25zdCBmb3VuZCA9IHJvbGVzLnNvbWUocj0+IHByZXNlbnRhdGlvblJvbGVzLmluY2x1ZGVzKHIpKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyAgRm9yIGNvbWJvYm94LCB3ZSBoYXZlIGcxMTkzIC4uLiBnMTE5OSB0byBjaGVjayB0aGUgdmFsdWVzIGV0Yy5cbiAgICAgICAgLy8gIFdlIGRvbid0IHdhbnQgdG8gdHJpZ2dlciAxMTUyIGFnYWluLiBTbywgd2UgYnlwYXNzIGl0IGhlcmUuXG4gICAgICAgIGlmIChyb2xlcy5pbmNsdWRlcyhcImNvbWJvYm94XCIpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcmVxdWlyZWRDaGlsZFJvbGVzID0gQXJpYVV0aWwuZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgLy8gYSAnZ3JvdXAnIHJvbGUgaXMgYWxsb3dlZCBidXQgbm90IHJlcXVpcmVkIGZvciBzb21lIGVsZW1lbnRzIHNvIHJlbW92ZSBpdCBpZiBleGlzdHNcbiAgICAgICAgaWYgKHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmNsdWRlcygnZ3JvdXAnKSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gcmVxdWlyZWRDaGlsZFJvbGVzLmluZGV4T2YoJ2dyb3VwJyk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICByZXF1aXJlZENoaWxkUm9sZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLyoqICBcbiAgICAgICAgICogaWdub3JlIGlmIGEgcm9sZSBkb2Vzbid0IHJlcXVpcmUgYSBjaGlsZCB3aXRoIGFueSBzcGVjaWZpYyByb2xlXG4gICAgICAgICAqIHRoZSByZXZlcnNlIG1pZ2h0IGJlIG5vdCB0cnVlIC0gcGFyZW50IHdpbGwgYmUgY2hlY2tlZCBpbiBScHRfQXJpYV9SZXF1aXJlZFBhcmVudF9OYXRpdmVfSG9zdF9TZW1hdGljcyBydWxlXG4gICAgICAgICovXG4gICAgICAgICBpZiAocmVxdWlyZWRDaGlsZFJvbGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgY2hpbGRyZW4gZnJvbSBhY2Nlc3NpYmlsaXR5IHRyZWUsIFxuICAgICAgICAvLyBpbmNsdWRpbmcgb25lcyB3aXRoIGFyaWEtb3ducyAgICBcbiAgICAgICAgbGV0IGRpcmVjdEFUQ2hpbGRyZW4gPSBBcmlhVXRpbC5nZXREaXJlY3RBVENoaWxkcmVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZGlyZWN0QVRDaGlsZHJlbiB8fCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyB0aGUgZWxlbWVudCB3aXRoIGF0IGxlYXN0IG9uZSByZXF1aXJlZCByb2xlIGRvc2VuJ3QgY29udGFpbiBhbnkgYWNjZXNzaWJsZSBjaGlsZFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBXaGVuIGEgd2lkZ2V0IGlzIG1pc3NpbmcgcmVxdWlyZWQgb3duZWQgZWxlbWVudHMgZHVlIHRvIHNjcmlwdCBleGVjdXRpb24gb3IgbG9hZGluZywgXG4gICAgICAgICAgICAgKiBhdXRob3JzIE1VU1QgbWFyayBhIGNvbnRhaW5pbmcgZWxlbWVudCB3aXRoICdhcmlhLWJ1c3knIGVxdWFsIHRvIHRydWUuIFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgbGV0IGJ1c3kgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWJ1c3lcIik7XG4gICAgICAgICAgICAgaWYgKCFidXN5IHx8IGJ1c3kgIT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJlcXVpcmVkQ2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX25vX2NoaWxkXCIsIHJldFRva2VuKTtcbiAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgIC8vIGl0J3MgJ2J1c3knIGxvYWRpbmcsIGlnbm9yZSBpdCBcbiAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHZpb2xhdGVFbGVtUm9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhkaXJlY3RBVENoaWxkcmVuW2pdLCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgICAgICBpZiAoIWNoaWxkUm9sZXMgfHwgY2hpbGRSb2xlcy5sZW5ndGggPT0gMCkgXG4gICAgICAgICAgICAgICAgY2hpbGRSb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZGlyZWN0QVRDaGlsZHJlbltqXSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChjaGlsZFJvbGVzICYmIGNoaWxkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIHdoZW4gbXVsdGlwbGUgcm9sZXMgYXJlIHNwZWNpZmllZCBhcyByZXF1aXJlZCBvd25lZCBlbGVtZW50cyBmb3IgYSByb2xlLCBhdCBsZWFzdCBvbmUgaW5zdGFuY2Ugb2Ygb25lIHJlcXVpcmVkIG93bmVkIGVsZW1lbnQgaXMgZXhwZWN0ZWQuIFxuICAgICAgICAgICAgICAgICAqIHRoZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW4gaW5zdGFuY2Ugb2YgZWFjaCBvZiB0aGUgbGlzdGVkIG93bmVkIHJvbGVzLlxuICAgICAgICAgICAgICAgICAqIHRoZXJlZm9yZSwgdGhlIHJlcXVpcmVtZW50IGlzIG1ldCBpZiBpdCBoYXMgYW55IG9uZSBvZiB0aGUgcmVxdWlyZWQgcm9sZXMuXG4gICAgICAgICAgICAgICAgICovICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gY2hpbGRSb2xlcy5zb21lKHI9PiByZXF1aXJlZENoaWxkUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICAgICAgICAgIGlmICghZm91bmQpIFxuICAgICAgICAgICAgICAgICAgICB2aW9sYXRlRWxlbVJvbGVzLnB1c2goY2hpbGRSb2xlcy5qb2luKFwiLCBcIikpOyBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBlbGVtZW50IHNpbmNlIGl0J3Mgbm90IHNlbWFudGljLCBzaG91bGRuJ3QgaGFwcGVuIFxuICAgICAgICAgICAgfSAgICAgXG4gICAgICAgIH0gXG4gICAgICAgIFxuICAgICAgICBpZiAodmlvbGF0ZUVsZW1Sb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB2aW9sYXRlRWxlbVJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2godmlvbGF0ZUVsZW1Sb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyZXF1aXJlZENoaWxkUm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9jaGlsZFwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbXBsZW1lbnRhcnlcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQ29tcGxlbWVudGFyeUxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIik7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV0sIGRvbTphc2lkZVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfQ29tcGxlbWVudGFyeUxhbmRtYXJrTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIHNob3VsZCBoYXZlIGEgdmlzaWJsZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICghQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoXG4gICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCJcbiAgICAgICAgKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9Db21wbGVtZW50YXJ5UmVxdWlyZWRMYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIG11c3QgaGF2ZSBhIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChwYWlyKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFRhYmxlVXRpbCB9IGZyb20gXCIuLi91dGlsL1RhYmxlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb250ZW50X2luX2xhbmRtYXJrOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29udGVudCBpcyBub3Qgd2l0aGluIGEgbGFuZG1hcmsgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFsbCBjb250ZW50IG11c3QgcmVzaWRlIHdpdGhpbiBhbiBlbGVtZW50IHdpdGggYSBsYW5kbWFyayByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBsZXQgcGFyYW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGNvbnRleHQuZG9tLm5vZGUub3duZXJEb2N1bWVudCwgXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmtcIiwgbnVsbCk7XG4gICAgICAgIGlmICghcGFyYW1zKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgbGFuZG1hcmtzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIiwgXCJmb3JtXCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJyZWdpb25cIiwgXCJzZWFyY2hcIl0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcG9zc2libGVPcnBoYW5lZFdpZGdldHM6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtcImJ1dHRvblwiLCBcImNvbWJvYm94XCIsIFwiY2hlY2tib3hcIiwgXCJncmlkXCIsIFwiaGVhZGluZ1wiLCBcImxpbmtcIiwgXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcInByb2dyZXNzYmFyXCIsIFwicmFkaW9cIiwgXCJ0YWJsaXN0XCIsIFwidGV4dGJveFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInRyZWVncmlkXCJcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwb3NzaWJsZU9ycGhhbmVkRWxlbWVudHM6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtcInBcIiwgXCJ0YWJsZVwiLCBcImlucHV0XCIsIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJidXR0b25cIiwgXCJhXCIsIFwib2xcIiwgXCJ1bFwiLCBcImRsXCIsIFwiaDFcIiwgXCJoMlwiLCBcImgzXCIsIFwiaDRcIiwgXCJoNVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJoNlwiLCBcImVtYmVkXCIsIFwib2JqZWN0XCIsIFwiYXJlYVwiXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbm9MYW5kbWFya2VkUm9sZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2Ugcm9sZXMgZG9uJ3QgcmVxdWlyZSBsYW5kbWFya3NcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtcImFsZXJ0XCIsIFwiYWxlcnRkaWFsb2dcIiwgXCJkaWFsb2dcIiwgXCJ0b29sdGlwXCJdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1hcExhbmRtYXJrczoge30sXG4gICAgICAgICAgICAgICAgbWFwUG9zc2libGVPcnBoYW5lZFdpZGdldHM6IHt9LFxuICAgICAgICAgICAgICAgIG1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50czoge30sXG4gICAgICAgICAgICAgICAgbWFwTm9MYW5kbWFya2VkUm9sZXM6IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb252ZXJ0IGFycmF5cyB0byBtYXBzXG4gICAgICAgICAgICBwYXJhbXMubWFwTGFuZG1hcmtzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5sYW5kbWFya3MudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwTGFuZG1hcmtzW3BhcmFtcy5sYW5kbWFya3MudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzID0ge31cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLnBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzW3BhcmFtcy5wb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzID0ge31cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLnBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkRWxlbWVudHNbcGFyYW1zLnBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXJhbXMubWFwTm9MYW5kbWFya2VkUm9sZXMgPSB7fVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubm9MYW5kbWFya2VkUm9sZXMudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwTm9MYW5kbWFya2VkUm9sZXNbcGFyYW1zLm5vTGFuZG1hcmtlZFJvbGVzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShjb250ZXh0LmRvbS5ub2RlLm93bmVyRG9jdW1lbnQsIFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrXCIsIHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8ICAvLyBhdm9pZCBkaWFnbm9zaW5nIGcxMTU3IGZvciBub24tdmlzaWJsZSBub2Rlc1xuICAgICAgICAgICAgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsZW1zV2l0aG91dENvbnRlbnQgPSBbXCJhcmVhXCIsIFwiaW5wdXRcIiwgXCJlbWJlZFwiLCBcImJ1dHRvblwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCJdO1xuICAgICAgICBpZiAoIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSAmJiAvL29ubHkgdHJpZ2dlciB0aGUgcnVsZSBvbiBlbGVtZW50cyB0aGF0IGhhdmUgY29udGVudFxuICAgICAgICAgICAgZWxlbXNXaXRob3V0Q29udGVudC5pbmRleE9mKG5vZGVOYW1lKSA9PT0gLTEpIHsgLy8gYSBmZXcgZWxlbXMgd2lob3V0IGNvbnRlbnQgc2hvdWxkIG5vdCBiZSBza2lwcGVkXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaG9ydCBjaXJjdWl0IGZvciBsYXlvdXQgdGFibGVzXG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcInRhYmxlXCIgJiYgVGFibGVVdGlsLmlzTGF5b3V0VGFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGEgcG9zc2libGUgb3JwaGFuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgaXNQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0ID0gQXJpYVV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzLCB0cnVlKTtcbiAgICAgICAgLy9leGNsdWRlIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwieHl6LmNzc1wiPiBpbiB0aGUgPGhlYWQ+IGFuZCA8Ym9keT4oIzYwOClcbiAgICAgICAgLy9oYXZpbmcgbGluayBpbiB0aGUgaGVhZCBjb3VsZCBjYXVzZSBsb3Qgb2YgdmlvbGFpb25zICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnbGluaycpIHtcbiAgICAgICAgICAgIGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzUG9zc2libGVPcnBoYW5lZEVsZW1lbnQgPSBub2RlTmFtZSBpbiBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzO1xuICAgICAgICBpZiAoaXNQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0IHx8IGlzUG9zc2libGVPcnBoYW5lZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIFNlZSBpZiBhbmNlc3RvciBoYXMgbGFuZG1hcmsgcm9sZXMgb3IgaW1wbGljaXQgbGFuZCBtYXJrIHJvbGVzXG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZXMgPSBjb250ZXh0SGllcmFyY2hpZXNbXCJhcmlhXCJdLm1hcChpbmZvID0+IGluZm8ucm9sZSk7XG4gICAgICAgICAgICBwYXNzZWQgPSBwYXJlbnRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlIGluIHBhcmFtcy5tYXBMYW5kbWFya3MpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgZmFpbCBlbGVtZW50cyB3aGVuIGEgcGFyZW50IG9yIHNpYmxpbmcgaGFzIGZhaWxlZCAtIGNhdXNlcyB0b28gbWFueSBtZXNzYWdlcy5cbiAgICAgICAgICAgICAgICBsZXQgd2Fsa0VsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgd2Fsa0VsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUod2Fsa0VsZW1lbnQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gcnVsZUNvbnRleHQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gd2Fsa0VsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3YWxrRWxlbWVudCA9IHJ1bGVDb250ZXh0LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgd2Fsa0VsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUod2Fsa0VsZW1lbnQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSB3YWxrRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHRyaWdnZXIgcnVsZSBpZiBlbGVtZW50IGlzIGEgc3RhbmQtYWxvbmUgd2lkZ2V0XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRfTm9UcmlnZ2VyXCIsIGZhbHNlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzLCB0cnVlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50X05vVHJpZ2dlclwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbnRlbnRpbmZvXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUNvbnRlbnRpbmZvTGFuZG1hcmtzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwiY29udGVudGluZm9cIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudGluZm9fbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudGluZm9fbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmZvb3RlciwgZG9tOmFkZHJlc3NcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0NvbnRlbnRpbmZvV2l0aE5vTWFpbl9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudGluZm9fbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgaXMgcHJlc2VudCB3aXRob3V0IGFuIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBpcyBvbmx5IHBlcm1pdHRlZCB3aXRoIGFuIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vY29uc2lkZXIgaW1wbGljaXQgcm9sZVxuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb250ZW50aW5mb1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb250ZW50aW5mb19zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206Zm9vdGVyLCBkb206YWRkcmVzc1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVDb250ZW50aW5mb0luU2libGluZ1NldF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgZm91bmQgb24gdGhlIHBhZ2VcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHBhZ2UsIGRvY3VtZW50LCBvciBhcHBsaWNhdGlvbiBzaG91bGQgb25seSBoYXZlIG9uZSBlbGVtZW50IHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vZmluZCBvdXQgaWYgPGZvb3Rlcj4gZWxlbWVudCBoYXMgc2libGluZ3MgYXMgPGZvb3Rlcj4gaGFzIGltcGxpY2l0IGNvbnRlbnRpbmZvIHJvbGVcbiAgICAgICAgaWYgKCFBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiY29udGVudGluZm9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9ICFBcmlhVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgIFwiY29udGVudGluZm9cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZGVzY2VuZGFudF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2NoaWxkX2ltcGxpY2l0X3JvbGVcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJyZWNvbW1lbmRhdGlvbl9ub19pbXBhY3Rfcm9sZVwiOiBcImFyaWFfZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiOiBcImFyaWFfZGVzY2VuZGFudF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQnJvd3NlcnMgaWdub3JlIHRoZSBleHBsaWNpdCBhbmQgaW1wbGljaXQgQVJJQSByb2xlcyBvZiB0aGUgZGVzY2VuZGFudHMgb2YgY2VydGFpbiBlbGVtZW50c1wiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgY29udGFpbnMgdmFsaWQgZGVzY2VuZGFudHNcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2NoaWxkX2ltcGxpY2l0X3JvbGVcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgY29udGFpbnMgZGVzY2VuZGFudHMgd2l0aCBpbXBsaWNpdCByb2xlcyBcXFwiezF9XFxcIiB3aGljaCBhcmUgaWdub3JlZCBieSBicm93c2Vyc1wiLFxuICAgICAgICAgICAgXCJyZWNvbW1lbmRhdGlvbl9ub19pbXBhY3Rfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCIsXG4gICAgICAgICAgICBcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wicGFzc1wiLCBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCIsIFwiZmFpbF9jaGlsZF9leHBsaWNpdF9yb2xlXCJdXG4gICAgfSx7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJyZWNvbW1lbmRhdGlvbl9ub19pbXBhY3Rfcm9sZVwiXVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogVmVyaWZ5IG1hcHBpbmdcbiAgICBhY3Q6IFtcIjMwN241elwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgcmVxdWlyZSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmICghQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJvbGVzID0gIEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGV4cGxpY2l0IG9yIGltcGxpY2l0IHJvbGUsIHNob3VsZG4ndCBoYXBwZW5cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNoaWxkcmVuIGZyb20gYWNjZXNzaWJpbGl0eSB0cmVlLCBcbiAgICAgICAgLy8gaW5jbHVkaW5nIG9uZXMgd2l0aCBhcmlhLW93bnMgICAgXG4gICAgICAgIGxldCBkaXJlY3RBVENoaWxkcmVuID0gQXJpYVV0aWwuZ2V0RGlyZWN0QVRDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkaXJlY3RBVENoaWxkcmVuICYmIGRpcmVjdEFUQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXByZXNlbnRhdGlvbmFsIGNoaWxkcmVuXG4gICAgICAgICAgICBsZXQgZXhwbGljaXRSb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgIGxldCBub0ltcGFjdFJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqPTA7IGogPCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIDxpbWc+IGFuZCA8c3ZnPlxuICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IGRpcmVjdEFUQ2hpbGRyZW5bal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAodGFnID09PSAnaW1nJyB8fCB0YWcgPT09ICdzdmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBnZXQgZXhwbGljaXQgcm9sZSBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGRpcmVjdEFUQ2hpbGRyZW5bal0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdGUgY2FzZSBmb3Igcm9sZT1cImNvZGVcIlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcy5pbmNsdWRlcyhcImNvZGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vSW1wYWN0Um9sZXMucHVzaChjaGlsZFJvbGVzLmZpbHRlcihyb2xlID0+IHJvbGUgPT09IFwiY29kZVwiKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0Um9sZXMucHVzaChjaGlsZFJvbGVzLmZpbHRlcihyb2xlID0+IHJvbGUgIT09IFwiY29kZVwiKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbXBsaWNpdCByb2xlIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICBjaGlsZFJvbGVzID0gIEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShkaXJlY3RBVENoaWxkcmVuW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdGUgY2FzZSBmb3Igcm9sZT1cImNvZGVcIlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcy5pbmNsdWRlcyhcImNvZGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vSW1wYWN0Um9sZXMucHVzaChjaGlsZFJvbGVzLmZpbHRlcihyb2xlID0+IHJvbGUgPT09IFwiY29kZVwiKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZFJvbGVzICYmIGNoaWxkUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZXMucHVzaChjaGlsZFJvbGVzLmZpbHRlcihyb2xlID0+IHJvbGUgIT09IFwiY29kZVwiKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGV4cGxpY2l0Um9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBleHBsaWNpdFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2goZXhwbGljaXRSb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbHVlcy5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9jaGlsZF9leHBsaWNpdF9yb2xlXCIsIHJldFRva2VuKSk7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGltcGxpY2l0Um9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChpbXBsaWNpdFJvbGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsdWVzLnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCIsIHJldFRva2VuKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub0ltcGFjdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9JbXBhY3RSb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKG5vSW1wYWN0Um9sZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25fbm9faW1wYWN0X3JvbGVcIiwgcmV0VG9rZW4pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyAgICAgICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6ZG9jdW1lbnRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlRG9jdW1lbnRSb2xlc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiZG9jdW1lbnRcXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImRvY3VtZW50XFxcIiByb2xlcyBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImRvY3VtZW50XFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJkb2N1bWVudFwiLCB0cnVlKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7IFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25jbGlja10sZG9tOipbb25ibHVyXSwgZG9tOipbb25kYmxjbGlja10sIGRvbToqW29uZm9jdXNdLCBkb206KltvbmtleWRvd25dLGRvbToqW29ua2V5cHJlc3NdLCBkb206KltvbmtleXVwXSwgZG9tOipbb25tb3VzZWRvd25dLCBkb206Kltvbm1vdXNldXBdLCBkb206Kltvbm1vdXNlbW92ZV0sIGRvbToqW29ubW91c2VvdXRdLCBkb206Kltvbm1vdXNlb3Zlcl0sIGRvbToqW29ucmVzaXplXSwgZG9tOipbb25jaGFuZ2VdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9FdmVudEhhbmRsZXJNaXNzaW5nUm9sZV9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgd2l0aCAnezF9JyBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgQVJJQSByb2xlIHNwZWNpZmllZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIHdpdGggZXZlbnQgaGFuZGxlcnMgbXVzdCBoYXZlIGEgdmFsaWQgQVJJQSByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIHRoaXMgZm9yIFNWRyBlbGVtZW50IGZvciBub3cgdW50aWwgYSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUgKGJ5IFJpY2gpXG4gICAgICAgIC8vIHRvIHN1cHBvcnQgU1ZHIGF0IGEgcG9pbnQgd2hlbiB0aGUgU1ZHIGExMXkgc3BlYyBpcyByZWFkeS5cbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwic3ZnXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdGhpcyBydWxlIGlzIHBhc3NlZCBpZiBhIGVsZW1lbnQgaGFzIGF0dHJpYnV0IHJvbGUgXG4gICAgICAgIC8vYWxzbywgcGFzc2VkIG9mIGVsZW1lbnQgaGFzIGFueSBpbXBsaWNpdCByb2xlcy4gXG4gICAgICAgIGlmIChBcmlhVXRpbC5oYXNBbnlSb2xlKHJ1bGVDb250ZXh0LCB0cnVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9wYXNzIGlmIHRoaXMgZWxlbWVudCBpcyByZWNlaXZlZCBmb2N1cyBieSBkZWZhdWx0XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzZm9jdXNhYmxlQnlEZWZhdWx0KHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy92YWxpZGF0ZSBpZiB0aGlzIGVsZW1lbnQgaGFzIGFueSBvZiB0aGUgZ2l2ZW4gZXZlbnQgaGFuZGxlcidzXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGxldCBldmVudEFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICAvLyBGcm9tIFdDQUcyMF9TY3JpcHRfVXNlVzNDRG9tRnVuY3Rpb25zXG4gICAgICAgIC8vbGV0IGV2ZW50cyA9IFtcIm9uYmx1clwiLCBcIm9uZm9jdXNcIiwgXCJvbmNoYW5nZVwiLCBcIm9uY2xpY2tcIiwgXCJvbmNvbnRleHRtZW51XCIsIFwib25kYmxjbGlja1wiLCBcIm9ua2V5ZG93blwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbmtleXByZXNzXCIsIFwib25rZXl1cFwiLCBcIm9ubG9hZFwiLCBcIm9ubW91c2Vkb3duXCIsIFwib25tb3VzZXVwXCIsIFwib25tb3VzZW1vdmVcIiwgXCJvbm1vdXNlb3V0XCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICBcIm9ubW91c2VvdmVyXCIsIFwib25tb3VzZXdoZWVsXCIsIFwib25yZXNldFwiLCBcIm9ucGFzdGVcIiwgXCJvbnJlc2l6ZVwiLCBcIm9uc2Nyb2xsXCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICBcIm9uc2VsZWN0XCIsIFwib25zdWJtaXRcIiwgXCJvbmFjdGl2YXRlXCIsIFwib25kZWFjdGl2YXRlXCIsIFwib25tb3VzZWVudGVyXCIsIFwib25tb3VzZWxlYXZlXCJdO1xuICAgICAgICBsZXQgZXZlbnRzID0gW1wib25ibHVyXCIsIFwib25mb2N1c1wiLCBcIm9uY2hhbmdlXCIsIFwib25jbGlja1wiLCBcIm9uZGJsY2xpY2tcIiwgXCJvbmtleWRvd25cIixcbiAgICAgICAgICAgIFwib25rZXlwcmVzc1wiLCBcIm9ua2V5dXBcIiwgXCJvbm1vdXNlZG93blwiLCBcIm9ubW91c2V1cFwiLCBcIm9ubW91c2Vtb3ZlXCIsIFwib25tb3VzZW91dFwiLFxuICAgICAgICAgICAgXCJvbm1vdXNlb3ZlclwiLCBcIm9ucmVzaXplXCJcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoZXZlbnRzW2ldKSlcbiAgICAgICAgICAgICAgICBldmVudEFyci5wdXNoKGV2ZW50c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChldmVudEFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChmYWxzZSwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlRm9ybUxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiZm9ybVxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiZm9ybVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImZvcm1cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImZvcm1cIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsOyBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZ3JhcGhpY19sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JhcGhpY3MtZG9jdW1lbnQsYXJpYTpncmFwaGljcy1zeW1ib2xcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXJpYV9TdmdBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIGEgZ3JhcGhpY3Mgcm9sZSBtdXN0IGhhdmUgYSBub24tZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIGdyYXBoaWNzIHJvbGUgaGFzIG5vIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiezB9XFxcIiBncmFwaGljcyByb2xlIGhhcyBubyBsYWJlbCBvciBhbiBlbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgZ3JhcGhpY3Mgcm9sZSBtaXNzaW5nIG5vbi1lbXB0eSAnYXJpYS1sYWJlbCcgb3IgJ2FyaWEtbGFiZWxsZWRieSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW10sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjdkNjczNFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSB8fCAhcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS5pbmNsdWRlcyhcImdyYXBoaWNzLVwiKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLyogcmVtb3ZlZCB0aGUgcm9sZSBjaGVjayByb2xlPSBwcmVzZW50YXRpb24gc2luY2UgaWYgYW4gZWxlbWVudCBoYXMgcm9sZT1pbWcsIHRoZW4gdGhlcmUgbmVlZHMgdG8gYmUgYSBjaGVjayBmb3IgYWx0IGF0dHJpYnV0ZSByZWdhcmRsZXNzIG9mIHRoZSBwcmVzZWNuZSBvZiByb2xlPXByZXNlbnRhdGlvblxuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcInByZXNlbnRhdGlvblwiKSB8fCBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICB9Ki9cblxuICAgICAgICAvLyBJZiByb2xlID09PSBpbWcsIHlvdSBtdXN0IHVzZSBhbiBhcmlhIGxhYmVsXG4gICAgICAgIC8vY2hlY2sgYXR0cmlidXRlcyBhcmlhLWxhYmVsIGFuZCBhcmlhLWxhYmVsbGVkYnkgZm9yIG90aGVyIHRhZ3MgKGUuZy4sIDxkaXY+LCA8c3Bhbj4sIGV0YylcbiAgICAgICAgbGV0IHBhc3NlZCA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgICBsZXQgc3ZnVGl0bGUgPSBydWxlQ29udGV4dC5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIik7XG4gICAgICAgICAgICBwYXNzZWQgPSBzdmdUaXRsZSAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudChzdmdUaXRsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy9jaGVjayB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICAvLyBXZSBzaG91bGQgZ3VpZGUgcGVvcGxlIHRvIHVzZSBhbHQgb3IgbGFiZWwgLSB0aGlzIGlzIGp1c3QgYSBzZWNvbmRhcnkgYXBwcm9hY2ggdG8gc2lsZW5jZSB0aGUgcnVsZS5cbiAgICAgICAgICAgIC8vIFNvLCB3ZSBzaG91bGQga2VlcCB0aGUgUE9GIGZyb20gYWJvdmUuXG4gICAgICAgICAgICAvLyBpZiAoIXBhc3NlZCkgUE9GID0gXCJGYWlsXzNcIjtcbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpXSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfaGlkZGVuX25vbnRhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaGlkZGVuX25vbnRhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLWhpZGRlbj10cnVlXSwgZG9tOipbYXJpYS1oaWRkZW49dHJ1ZV0gZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImFyaWFfaGlkZGVuX2ZvY3VzX21pc3VzZVwiOiB7IFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfaGlkZGVuX25vbnRhYmJhYmxlLmh0bWxgLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGhpZGRlbiBlbGVtZW50IHNob3VsZCBub3QgY29udGFpbiBhbnkgdGFiYmFibGUgZWxlbWVudHNcIiwgXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgXFxcInswfVxcXCIgc2hvdWxkIG5vdCBiZSBmb2N1c2FibGUgd2l0aGluIHRoZSBzdWJ0cmVlIG9mIGFuIGVsZW1lbnQgd2l0aCBhbiAnYXJpYS1oaWRkZW4nIGF0dHJpYnV0ZSB3aXRoIHZhbHVlICd0cnVlJ1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIxLjMuMVwiLCBcIjQuMS4yXCJdLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogSGFuZGxlIHRlc3RjYXNlIHdpdGggZm9jdXMganVtcGluZyBhd2F5XG4gICAgYWN0OiBcIjZjZmE4NFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbm9kZU5hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9pZF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9pZF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9WYWxpZElkUmVmXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgJ2lkJyBcXFwiezB9XFxcIiBzcGVjaWZpZWQgZm9yIHRoZSBBUklBIHByb3BlcnR5ICd7MX0nIHZhbHVlIGlzIG5vdCB2YWxpZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBBUklBIHByb3BlcnR5IG11c3QgcmVmZXJlbmNlIGEgbm9uLWVtcHR5IHVuaXF1ZSBpZCBvZiBhbiBleGlzdGluZyBlbGVtZW50IHRoYXQgaXMgdmlzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogNmE3MjgxIC0gTmVlZCBhIHNlcGFyYXRlIHJlYXNvbiBjb2RlIHdoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCByZXF1aXJlZC4gQUNUIHNheXMgaXQncyBva2F5IHRvIGJlXG4gICAgLy8gaW52YWxpZCB3aGVuIG5vdCByZXF1aXJlZC4gSSB0aGluayB3ZSBzaG91bGQgc3RpbGwgZmFpbCwgYnV0IGZsYWcgaXQgYXMgYSBkaWZmZXJlbnQgcmVhc29uIHNvIHRoYXQgd2UgY2FuIGhhdmUgYSBzdWJzZXRcbiAgICAvLyBhbGlnbnMgd2l0aCBBQ1QuXG4gICAgYWN0OiBbXCI1OTc5NmZcIiwgXCI2YTcyODFcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3MgPSB0cnVlO1xuICAgICAgICBsZXQgYXR0ck5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IG5vbkV4aXN0YW50SURzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgY29udGV4dEF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgaWRUb2tlbnMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHRlc3RlZFJlZmVyZW5jZXMgPSAwO1xuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGF0dHJMZW5ndGggPSBjb250ZXh0QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBhdHRyTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlcyA9IEFSSUFEZWZpbml0aW9ucy5wcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0c09uZUlEUmVmID0gKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIikgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBkYXRhIHR5cGUgc3VwcG9ydHMgb25lIG9yIG1vcmUgaWQgcmVmcyBkbyBlcnJvciBjaGVja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRzT25lSURSZWYgfHwgKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUmVmZXJlbmNlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWVMZW5ndGggPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkQXJyYXkgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFuIGVtcHR5IElEIFJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWVMZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChcIlxcXCJcIiArIGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSArIFwiXFxcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRvbyBtYW55IElEUmVmc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1cHBvcnRzT25lSURSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBoYXMgdG9vIG1hbnkgSURSZWZzIGl0IGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWVMZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNhcHR1cmUgYWxsIHRoZSBJRFJlZnMgZm9yIGlkVG9rZW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IDAsIGxlbmd0aCA9IGlkQXJyYXkubGVuZ3RoOyB6IDwgbGVuZ3RoOyArK3opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbel0gIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChpZEFycmF5W3pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgaWQgcmVmcyBhcmUgaW52YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzICYmIG5vZGVWYWx1ZUxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBsZW5ndGggPSBpZEFycmF5Lmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRBcnJheVtqXS5sZW5ndGggPiAwKSB7IC8vIGl0IGlzIGFuIGVtcHR5IHN0cmluZyBpZiBzcGFjZXMgYXJlIG9uZSBhZnRlciB0aGUgb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnQgYnkgSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudEJ5SWQgPSBvd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkQXJyYXlbal0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpZiB0aGUgZWxlbWVudCBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZWxlbWVudEJ5SWQgIT0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGV4aXN0cyBhbmQgdGhpcyBpcyBhbiBhcmlhIGF0dHJpYnV0ZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBoaWRkZW4gSUQgcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBwZXJmb3JtIGEgaXNOb2RlVmlzaWJsZSBjaGVjaywgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2libGUgdGhlbiB3ZSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgJiYgIWRhdGFUeXBlcy5oaWRkZW5JRFJlZlN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnRCeUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbal0gIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChpZEFycmF5W2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IG9uZSBvZiB0aGUgaWQgcmVmZXJlbmNlcyBuZWVkIHRvIGJlIHZhbGlkIHRvIG1hcmsgdGhlIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSBpZiB3ZSBmaW5kIGEgc2luZ2xlIHZpc2libGUgZWxlbWVudCB0aGVuIHN0b3AgY2hlY2tpbmcgYW5kIG1hcmsgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3MpIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFzc2VkID0gYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7XG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcmV0VG9rZW4zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG5cbiAgICAgICAgICAgIHJldFRva2VuMi5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICByZXRUb2tlbjMucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmIChpZFRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4xLnB1c2goaWRUb2tlbnMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgYXR0ck5hbWVBcnIsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yLCByZXRUb2tlbjNdKTtcbiAgICAgICAgaWYgKHRlc3RlZFJlZmVyZW5jZXMgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCksIHJldFRva2VuMy50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2ltZ19sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2ltZ19sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTppbWcsIGFyaWE6aW1hZ2VcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXJpYV9JbWdBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBoYXMgbm8gbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgaGFzIG5vIGxhYmVsIG9yIGFuIGVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIG1pc3Npbmcgbm9uLWVtcHR5ICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtcIjIzYTJhOFwiLCB7XG4gICAgICAgIFwiN2Q2NzM0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIC8vIElmIG5vIHJvbGUsIHRoaXMgaXMgaW1wbGljaXQsIGFuZCBjb3ZlcmVkIGJ5IFdDQUcyMF9JbWdfSGFzQWx0XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIHN2ZyBhbmQgaW1nIGVsZW1lbnRzIGFyZSBoYW5kbGVkIGluIHN2Z19ncmFwaGljc19sYWJiZWxsZWQgYW5kIGltZ19hbHRfdmFsaWQgcnVsZXNcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnc3ZnJyB8fCBub2RlTmFtZSA9PT0gJ2ltZycpIHJldHVybjtcblxuICAgICAgICAvKiByZW1vdmVkIHRoZSByb2xlIGNoZWNrIHJvbGU9IHByZXNlbnRhdGlvbiBzaW5jZSBpZiBhbiBlbGVtZW50IGhhcyByb2xlPWltZywgdGhlbiB0aGVyZSBuZWVkcyB0byBiZSBhIGNoZWNrIGZvciBhbHQgYXR0cmlidXRlIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZXNlY25lIG9mIHJvbGU9cHJlc2VudGF0aW9uXG4gICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwicHJlc2VudGF0aW9uXCIpIHx8IFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJub25lXCIpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgICAgIH0qL1xuXG4gICAgICAgIC8qIEpDSCAtIFBvaW50cyBvZiBmYWlsdXJlXG4gICAgICAgICAqICAgIDAuIE1pc3NpbmcgYWx0IGF0dHIgd2l0aCB2YWx1ZVxuICAgICAgICAgKiAgICAxLiBNaXNzaW5nIGFyaWEtbGFiZWwgb3IgYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAqICAgIDIuIE1pc3NpbmcgdGl0bGUgYXR0ciB3aXRoIHZhbHVlXG4gICAgICAgICAqL1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgcm9sZSA9PT0gaW1nLCB5b3UgbXVzdCB1c2UgYW4gYXJpYSBsYWJlbFxuICAgICAgICAvL2NoZWNrIGF0dHJpYnV0ZXMgYXJpYS1sYWJlbCBhbmQgYXJpYS1sYWJlbGxlZGJ5IGZvciBvdGhlciB0YWdzIChlLmcuLCA8ZGl2PiwgPHNwYW4+LCBldGMpXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIikge1xuICAgICAgICAgICAgbGV0IHN2Z1RpdGxlID0gcnVsZUNvbnRleHQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpO1xuICAgICAgICAgICAgcGFzc2VkID0gc3ZnVGl0bGUgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQoc3ZnVGl0bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vY2hlY2sgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGd1aWRlIHBlb3BsZSB0byB1c2UgYWx0IG9yIGxhYmVsIC0gdGhpcyBpcyBqdXN0IGEgc2Vjb25kYXJ5IGFwcHJvYWNoIHRvIHNpbGVuY2UgdGhlIHJ1bGUuXG4gICAgICAgICAgICAvLyBTbywgd2Ugc2hvdWxkIGtlZXAgdGhlIFBPRiBmcm9tIGFib3ZlLlxuICAgICAgICAgICAgLy8gaWYgKCFwYXNzZWQpIFBPRiA9IFwiRmFpbF8zXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX01pc3NpbmdLZXlib2FyZEhhbmRsZXJcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCI6IFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCI6IFwiYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCI6IFwiVmVyaWZ5IHRoZSA8ezB9PiBlbGVtZW50IHdpdGggXFxcInsxfVxcXCIgcm9sZSBoYXMga2V5Ym9hcmQgYWNjZXNzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW50ZXJhY3RpdmUgV0FJX0FSSUEgVUkgY29tcG9uZW50cyBtdXN0IHByb3ZpZGUga2V5Ym9hcmQgYWNjZXNzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBzYXZlZFBhc3NlZCA9IHBhc3NlZDtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgLy9sZXQgcm9sZXMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIC8vb25seSBjb25zaWRlciB1c2VyIHNwZWNpZmllZCByb2xlKHMpLCByYXRoZXIgdGhhbiBuYXRpdmUgY29udGFpbmVyc1xuICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICBcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy9pZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZCwgdGhlICdhcmlhX3JvbGVfcmVkdW5kYW50JyBydWxlIHNob3VsZCBiZSB0cmlnZ2VyZWQgYW5kIGFkZHJlc3NlZCBmaXJzdCxcbiAgICAgICAgLy8gYW5kIHRoZSBjdXJyZW50IHJ1bGUgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnICYmIHJvbGVzICYmIHJvbGVzLmluY2x1ZGVzKFwibGlzdGJveFwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIC8vIENvbXBvc2l0ZSB1c2VyIGludGVyZmFjZSB3aWRnZXQgcm9sZXMuIFRoZXkgYWN0IGFzIGNvbnRhaW5lcnMgdGhhdCBtYW5hZ2Ugb3RoZXIsIGNvbnRhaW5lZCB3aWRnZXRzLlxuICAgICAgICBsZXQgcm9sZUNvbnRhaW5lcnMgPSBbXCJjb21ib2JveFwiLCBcImdyaWRcIiwgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRyZWVcIiwgXCJ0cmVlZ3JpZFwiXTtcbiAgICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVDb250YWluZXJzKSB7XG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgcm9sZSwgdHJ1ZSkgIT0gbnVsbCkgXG4gICAgICAgICAgICAgICAgLy8gaXQncyBhIGRlc2NlbmRhbnQgb2YgYSBjb21wb3NpdGUgd2lkZ2V0IGFscmVhZHkgZXhhbWluZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IENvbW1vblV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV07XG4gICAgICAgICAgICBpZiAocm9sZUNvbnRhaW5lcnMuaW5kZXhPZihyb2xlc1tqXSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGxldCBkaXNhYmxlZCA9IGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgJ2FyaWEtZGlzYWJsZWQnKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtZGlzYWJsZWRcIikgOiAnJztcbiAgICAgICAgICAgICAgICBpZiAoIWRpc2FibGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEga2V5Ym9hcmQgZXZlbnQgaGFuZGxlciBvbiB0aGUgcGFyZW50IGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXVwXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBObyBrZXlib2FyZCBldmVudCBoYW5kbGVyIGZvdW5kIG9uIHBhcmVudC4gU2VlIGlmIGtleWJvYXJkIGV2ZW50IGhhbmRsZXJzIGFyZSBvbiByZXF1aXJlZCBjaGlsZCBlbGVtZW50cy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVxQ2hpbGRyZW4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXFDaGlsZHJlbikgeyAvKiBTTUYgVE9ETyBtZW51YmFyIGRvZXMgbm90IGhhdmUgYW55IHJlcUNoaWxkcmVuICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCByZXF1aXJlZENoaWxkcmVuTGVuZ3RoID0gcmVxQ2hpbGRyZW4ubGVuZ3RoOyBpIDwgcmVxdWlyZWRDaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAgPSBcIipbY29udGFpbnMoQHJvbGUsJ1wiICsgcmVxQ2hpbGRyZW5baV0gKyBcIicpXVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0ID0gZG9jLmV2YWx1YXRlKHhwLCBydWxlQ29udGV4dCwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoci5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgci5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoaWxkIGRpZCBub3QgaGF2ZSBhIGtleSBoYW5kbGVyLiBTZWUgaWYgYW55IG9mIHRoZSBncmFuZGNoaWxkcmVuIGRvLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdDIgPSBkb2MuZXZhbHVhdGUoeHAyLCByLCBDb21tb25VdGlsLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIyOiBFbGVtZW50ID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHIyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyMi5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgcjIuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoaXMgYW4gYWN0aW9uIGxpbms/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiYVwiICYmIHIyLmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBocmVmID0gcjIuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGlvbiBsaW5rIG11c3Qgc3RhcnQgd2l0aCBcImphdmFzY3JpcHQ6XCIsIG11c3Qgbm90IGNvbnRhaW4gYSBcInZvaWRcIiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIG5hbWUgZm9sbG93aW5nIFwiamF2YXNjcmlwdDpcIiAoaS5lLiwgaHJlZi5sZW5ndGggPiAxMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChocmVmLnN0YXJ0c1dpdGgoXCJqYXZhc2NyaXB0OlwiKSAmJiBocmVmLmluZGV4T2YoXCJ2b2lkXCIpID09IC0xICYmIGhyZWYubGVuZ3RoID4gMTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIHRoZSByZXF1aXJlZCBjaGlsZHJlbiAob3IgYW55IGRlc2NlbmRhbnRzIG9mIHRoZSByZXF1aXJlZCBjaGlsZHJlbikgbXVzdCBoYXZlIGtleXByZXNzL2tleWRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90LCBpdCBpcyBhIGZhaWx1cmUsIG5vIG5lZWQgdG8ga2VlcCBjaGVja2luZyBhbnkgbW9yZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudCBlbGVtZW50IGZhaWxlZCB0aGUga2V5ZG93bi9rZXlwcmVzcywgYW5kIGl0IGRvZXMgbm90IGhhdmUgcmVxdWlyZWQgY2hpbGRyZW4sIHN1Y2ggYXMgbWVudWJhci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0J3MgY2hlY2sgaXRzIGRlc2NlbmRhbnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdDIgPSBkb2MuZXZhbHVhdGUoeHAyLCBydWxlQ29udGV4dCwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShyMikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoaXMgYW4gYWN0aW9uIGxpbms/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJhXCIgJiYgcjIuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHJlZiA9IHIyLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aW9uIGxpbmsgbXVzdCBzdGFydCB3aXRoIFwiamF2YXNjcmlwdDpcIiwgbXVzdCBub3QgY29udGFpbiBhIFwidm9pZFwiIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgYSBmdW5jdGlvbiBuYW1lIGZvbGxvd2luZyBcImphdmFzY3JpcHQ6XCIgKGkuZS4sIGhyZWYubGVuZ3RoID4gMTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChocmVmLnN0YXJ0c1dpdGgoXCJqYXZhc2NyaXB0OlwiKSAmJiBocmVmLmluZGV4T2YoXCJ2b2lkXCIpID09IC0xICYmIGhyZWYubGVuZ3RoID4gMTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0cmlidXRlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIGlzIHNwZWNpZmllZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICByb2xlTmFtZUFyci5wdXNoKHJvbGVzW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkICYmIHNhdmVkUGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgc2F2ZWRQYXNzZWQgPSBwYXNzZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgcmVmZXJlbmNlZCBieSBhIGNvbWJvYm94LiBJZiBzbywgbGVhdmUgaXQgdG8gdGhlIGNvbWJvYm94IHJ1bGVzIHRvIGNoZWNrXG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICBpZiAoaWQgJiYgaWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCpbYXJpYS1jb250cm9scz0nJHtpZH0nXVtyb2xlPSdjb21ib2JveCddYCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2F2ZWRQYXNzZWQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5LCBhcmlhOmJhbm5lciwgYXJpYTpjb250ZW50aW5mbywgYXJpYTptYWluLCBhcmlhOm5hdmlnYXRpb24sIGFyaWE6cmVnaW9uLCBhcmlhOnNlYXJjaCwgYXJpYTpmb3JtXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJsYW5kbWFya19uYW1lX3VuaXF1ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8wXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiezB9XFxcIiBsYW5kbWFya3Mgd2l0aGluIHRoZSBzYW1lIHBhcmVudCByZWdpb24gYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdW5pcXVlICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJ7MH1cXFwiIGxhbmRtYXJrcyB3aXRoaW4gdGhlIHNhbWUgcGFyZW50IHJlZ2lvbiBhcmUgbm90IGRpc3Rpbmd1aXNoZWQgZnJvbSBvbmUgYW5vdGhlciBiZWNhdXNlIHRoZXkgaGF2ZSB0aGUgc2FtZSBcXFwiezF9XFxcIiBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggbGFuZG1hcmsgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJ2FyaWEtbGFiZWxsZWRieScgb3IgJ2FyaWEtbGFiZWwnIG9yIGJlIG5lc3RlZCBpbiBhIGRpZmZlcmVudCBwYXJlbnQgcmVnaW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUT0RPIGRvIEkgbmVlZCB0byBmaXRlciBvdXQgYmFkIGNvbnRlbnRpbmZvIG5vZGVzOiBUaGUgZm9vdGVyIGVsZW1lbnQgaXMgbm90IGEgY29udGVudGluZm8gbGFuZG1hcmsgd2hlbiBpdCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIGZvbGxvd2luZyBIVE1MNSBzZWN0aW9uaW5nIGVsZW1lbnRzOiBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNy9OT1RFLXdhaS1hcmlhLXByYWN0aWNlcy0xLjEtMjAxNzEyMTQvZXhhbXBsZXMvbGFuZG1hcmtzL0hUTUw1Lmh0bWxcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVja2luZyBpZiB0aGlzIGxhbmRtYXJrIGlzIGluc2lkZSBhIGRpYWxvZyBlbGVtZW50LiBJZiBpdCBpcyB3ZSBhcmUgZ29pbmcgdG8gc2tpcCBjaGVja2luZyBpdC4gXG4gICAgICAgIC8qKnZhciBjb3B5T2ZSdWxlQ29udGV4dCA9IHJ1bGVDb250ZXh0O1xuICAgICAgICB2YXIgcGFybmV0Tm9kZXNPZlJ1bGVDb250ZXh0ID0gW107XG4gICAgICAgIHdoaWxlIChjb3B5T2ZSdWxlQ29udGV4dCkge1xuICAgICAgICAgICAgcGFybmV0Tm9kZXNPZlJ1bGVDb250ZXh0LnVuc2hpZnQoY29weU9mUnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgY29weU9mUnVsZUNvbnRleHQgPSBjb3B5T2ZSdWxlQ29udGV4dC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dC5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS50YWdOYW1lID09IFwiRElBTE9HXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PSBcImRpYWxvZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsIC8vIFNraXBwaW5nIGNoZWNraW5nIGxhbmRtYXJrcyB0aGF0IGhhcHBlbiB0byBiZSBpbnNpZGUgZGlhbG9nIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAqL1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiRElBTE9HXCJdKSAhPT0gbnVsbCB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImRpYWxvZ1wiLCB0cnVlKSAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIEJlZ2luaW5nIGZvcm1DYWNoZSB3b3JrXG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZm9ybUNhY2hlIDoge1xuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzOiBhbnlbXSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHM6IGFueVtdLFxuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZDogc3RyaW5nW11cbiAgICAgICAgfSA9IENhY2hlVXRpbC5nZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tRU5URVJJTkcgRk9STSBDQUNIRVwiKVxuICAgICAgICAgICAgZm9ybUNhY2hlID0ge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2RlczogW10sXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQ6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc1RlbXAgPSBvd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICAgICAgJ2FzaWRlLFtyb2xlPVwiY29tcGxlbWVudGFyeVwiXSwgZm9vdGVyLFtyb2xlPVwiY29udGVudGluZm9cIl0sIGhlYWRlcixbcm9sZT1cImJhbm5lclwiXSwgbWFpbixbcm9sZT1cIm1haW5cIl0sIG5hdixbcm9sZT1cIm5hdmlnYXRpb25cIl0sIGZvcm0sW3JvbGU9XCJmb3JtXCJdLCBzZWN0aW9uLFtyb2xlPVwicmVnaW9uXCJdLFtyb2xlPVwic2VhcmNoXCJdJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXMgPSBBcnJheS5mcm9tKG5hdmlnYXRpb25Ob2Rlc1RlbXApO1xuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMgPSBbXTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kIDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAgICAgLy8gVGhpcyBibG9jayBvZiBjb2RlIGZpbHRlcnMgb3V0IGFueSBuYXYgZWxlbWVudHMgdGhhdCBhcmUgdW5kZXIgYSBkaWFsb2cuIEFzIHRob3NlIGFyZSBub3Qgb25lcyB3ZSB3YW50IHRvIHRlc3QgYWdhaW5zdCBhcyB3ZSBjb25zaWRlciBkaWFsb2dzIGFyZSBzZXBhcmF0ZSBsb2NhdGlvbnMgZnJvbSB0aGUgcmVzdCBvZiB0aGUgbWFpbiBwYWdlLlxuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8qKmxldCBhID0gbmF2aWdhdGlvbk5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCBkaWFsb2dOb2RlRm91bmRGbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYSA9IGEucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLnRhZ05hbWUgPT0gXCJESUFMT0dcIiB8fCBhLmdldEF0dHJpYnV0ZSgncm9sZScpID09IFwiZGlhbG9nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2dOb2RlRm91bmRGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWRpYWxvZ05vZGVGb3VuZEZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzV2l0aG91dERpYWxvZ3MucHVzaChuYXZpZ2F0aW9uTm9kZXNbaV0pXG4gICAgICAgICAgICAgICAgfSovXG5cbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgbm9kZSB0aGF0IGlzIEFUIGhpZGRlbiBvciBpbiBhIGRpYWxvZ1xuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChuYXZpZ2F0aW9uTm9kZXNbaV0pIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IobmF2aWdhdGlvbk5vZGVzW2ldLCBbXCJESUFMT0dcIl0pICE9PSBudWxsIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobmF2aWdhdGlvbk5vZGVzW2ldLCBcImRpYWxvZ1wiLCB0cnVlKSAhPT0gbnVsbCkgXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzLnB1c2gobmF2aWdhdGlvbk5vZGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXMgPSBuYXZpZ2F0aW9uTm9kZXNXaXRob3V0RGlhbG9ncztcblxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgbGV0IGVscyA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBhID0gbmF2aWdhdGlvbk5vZGVzW2ldLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGEpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxzLnB1c2goYSk7XG4gICAgICAgICAgICAgICAgICAgIGEgPSBhLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgcGFyZW50cyBvZiB0aGUgbGFuZG1hcmsgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBuZWFyZXN0IGxhbmRtYXJrIHBhcmVudCBiYXNlZCBvbiB0aGUgdGFnTmFtZSBvciB0aGUgcm9sZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ05hbWVUcmlnZ2VyID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJBU0lERVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJGT09URVJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRk9STVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJIRUFERVJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTUFJTlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJOQVZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU0VDVElPTlwiLFxuICAgICAgICAgICAgICAgICAgICBdLmluY2x1ZGVzKGVsc1tqXS50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGVOYW1lVHJpZ2dlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxzW2pdLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lVHJpZ2dlciA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmb3JtXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJiYW5uZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hdmlnYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJlZ2lvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic2VhcmNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBdLmluY2x1ZGVzKGVsc1tqXS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpKTsgLy8gVE9ETyB3ZSBhcmUgbm90IGNvdmVyaW5nIHRoZSBjYXNlIHdoZXJlIGEgZWxlbWVuZW50IHdpdGggbXVsdGlwbGUgcm9sZXMuIGUuZy4sIHJvbGUgPSBcImZvcm0gYmFubmVyXCIuIFRoaXMgaXMgYSBpbXByb3ZtZW50IHdlIG1pZ2h0IHdhbnQgdG8gYWRkIGluIHRoZSBmdXR1cmUuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ05hbWVUcmlnZ2VyIHx8IHJvbGVOYW1lVHJpZ2dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVhcmVzdCBwYXJlbnQtbGFuZG1hcmsgZm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMucHVzaChlbHNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGVscy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG5vZGUgaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGZpbGUgc28gaXQgZG9lcyBub3QgaGF2ZSBhIHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKG5hdmlnYXRpb25Ob2Rlc1tpXSk7XG4gICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbGFuZG1hcmsgbm9kZXNcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAvKipBUklBTWFwcGVyLmNvbXB1dGVOYW1lKG5hdmlnYXRpb25Ob2Rlc1tpXSkqL1xuICAgICAgICAgICAgICAgICAgICBwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDAgPyBwYWlyLm5hbWUudHJpbSgpIDogXCJcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBwYXJlbnRzIG9mIHRoZSBsYW5kbWFyayBub2RlcyB0byBmaW5kIGR1cGxpY2F0ZXNcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBwYXNzXzBfZmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gY29tcGFyZSBhZ2FpbnN0IG91cnNlbGZzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IGZvY3VzIG9uIHRoZSBjYXNlIHdoZXJlIHRoZSBwYXJlbnQgbGFuZG1hcmsgaXMgbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2ldID09PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2pdID09PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGxvb2tpbmcgYXQgdHdvIHJvb3Qgbm9kZXMsIHNvIHdlIHNob3VsZCBjb21wYXJlIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tpXSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgaGF2ZSB0aGUgc2FtZSByb2xlIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaGF2ZSB0aGUgc2FtZSAoY29tcHV0ZWQpIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7IC8vIEZhaWwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgJiYgc2FtZSBub2RlIHJvbGVzIEJVVCBkaWZmZXJlbnQgY29tcHV0ZWQgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCBhIFBhc3NfMC4gQnV0IHdlIG5lZWQgdG8gY2hlY2sgYWxsIG5vZGVzIHRvIHNlZSBpZiBhbm90aGVyIG9uZSBmYWlscy4gU28gc2V0IGEgZmxhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc18wX2ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzIGJ1dCBkaWZmZXJlbnQgbm9kZSByb2xlcyAvLyBOb3QgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tqXSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBsb29raW5nIGF0IGEgc2luZ2xlIHJvb3Qgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlmIHN0YXRlbWVudCBmb2N1cyBvbiB0aGUgY2FzZSB3aGVyZSB0aGUgcGFyZW50IGxhbmRtYXJrIGlzIE5PVCBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWwuc2FtZU5vZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0aGUgc2FtZSBwYXJlbnQtbGFuZG1hcmsgQU5EXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tpXSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgaGF2ZSB0aGUgc2FtZSByb2xlIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaGF2ZSB0aGUgc2FtZSAoY29tcHV0ZWQpIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7IC8vIEZhaWwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgJiYgc2FtZSBub2RlIHJvbGVzIEJVVCBkaWZmZXJlbnQgY29tcHV0ZWQgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCBhIFBhc3NfMC4gQnV0IHdlIG5lZWQgdG8gY2hlY2sgYWxsIG5vZGVzIHRvIHNlZSBpZiBhbm90aGVyIG9uZSBmYWlscy4gU28gc2V0IGEgZmxhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc18wX2ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzIGJ1dCBkaWZmZXJlbnQgbm9kZSByb2xlcyAvLyBOb3QgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlmZmVyZW50IHBhcmVudHMgLy8gTm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NfMF9mbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJwYXNzXCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwibnVsbFwiKTsgLy8gVGhpcyBpcyBub3QgdGhlIGtleXdvcmQgbnVsbCBvbiBwdXJwb3NlLiBJdCBpcyBhIHNwYWNlaG9sZGVyIGluIHRoZSBhcnJheSBzbyBpbmRleGVzIG1hdGNoIHVwLlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzID1cbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscztcbiAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXMgPSBuYXZpZ2F0aW9uTm9kZXM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzUGFyZW50cyA9IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZCA9IG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQ7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBmb3JtQ2FjaGVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gQWRkIHZhbGlkYXRpb24gdGhhdCBhbGwgMyBhcnJheXMgYXJlIHRoZSBzYW1lIGxlbmd0aFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCItLS0tLS0tLS0tLS0tRW5kIGZvcm1DYWNoZVwiKVxuICAgICAgICB9IC8vIEVuZCBmb3JtQ2FjaGVcblxuICAgICAgICBsZXQgaW5kZXhUb0NoZWNrID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmlzU2FtZU5vZGUoZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICBpbmRleFRvQ2hlY2sgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleFRvQ2hlY2sgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmRbaW5kZXhUb0NoZWNrXSA9PT0gXCJwYXNzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIixcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNbaW5kZXhUb0NoZWNrXVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmRbaW5kZXhUb0NoZWNrXSA9PT0gXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzW2luZGV4VG9DaGVja11cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2luZGV4VG9DaGVja10sXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX21haW5fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6bWFpblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVNYWluc1JlcXVpcmVMYWJlbF9JbXBsaWNpdF8yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9tYWluX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJtYWluXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBtdXN0IGhhdmUgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3Nlc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29udGV4dExhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICBsZXQgcGFyZW50RG9jUm9sZSA9IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgIFwiZG9jdW1lbnRcIixcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IG1haW5zID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1haW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAobWFpbnNbaV0gPT09IHJ1bGVDb250ZXh0KSBjb250aW51ZTtcbiAgICAgICAgICAgIHJlc3VsdCA9IFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgbGV0IHRoaXNQYXJlbnREb2NSb2xlID0gQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShcbiAgICAgICAgICAgICAgICBtYWluc1tpXSxcbiAgICAgICAgICAgICAgICBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0aGlzUGFyZW50RG9jUm9sZSA9PT0gcGFyZW50RG9jUm9sZSkge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5nZXRBcmlhTGFiZWwobWFpbnNbaV0pID09PSBjb250ZXh0TGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9tYWluX2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZU1haW5zVmlzaWJsZUxhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX21haW5fbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJtYWluXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSB2aXNpYmxlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJtYWluXFxcIiByb2xlIHNob3VsZCBoYXZlIGEgdW5pcXVlIHZpc2libGUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy9jYWxsIGdldEVsZW1lbnRzQnlSb2xlSGlkZGVuIHdpdGggY29uc2lkZXJJbXBsaWNpdCBmbGFnIGFzIHRydWVcbiAgICAgICAgLy9zbyB0aGF0IHRoZSBtZXRob2QgcmV0dXJzIDxtYWluPiBlbGVtZW50c1xuICAgICAgICBsZXQgbGFuZG1hcmtzID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IEFyaWFVdGlsLmhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGxhbmRtYXJrcyk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6bmF2aWdhdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVOYXZpZ2F0aW9uTGFuZG1hcmtzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJuYXZpZ2F0aW9uXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJuYXZpZ2F0aW9uXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwibmF2aWdhdGlvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwibmF2aWdhdGlvblwiLCB0cnVlKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7IFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9ICAgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX3BhcmVudF9yZXF1aXJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3BhcmVudF9yZXF1aXJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfUmVxdWlyZWRQYXJlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3BhcmVudF9yZXF1aXJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfcGFyZW50X3JlcXVpcmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIGFuIGltcGxpY2l0IG9yIGV4cGxpY2l0IHJvbGUgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGEgdmFsaWQgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBpcyBub3QgY29udGFpbmVkIGluIG9yIG93bmVkIGJ5IGFuIGVsZW1lbnQgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyByb2xlczogXFxcInsxfVxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IENoZWNrIEZhaWwgM1xuICAgIGFjdDogXCJmZjg5YzlcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKEFyaWFVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkgfHwgVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICBsZXQgcm9sZU5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGNvbnRhaW5lclJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCB0ZXN0ZWRDb250YWluZXIgPSAwO1xuXG4gICAgICAgIGxldCBhbmNlc3RvclJvbGVzID0gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5tYXAoaW5mbyA9PiBpbmZvLnJvbGUpO1xuICAgICAgICBsZXQgcGFyZW50Um9sZSA9IGFuY2VzdG9yUm9sZXNbYW5jZXN0b3JSb2xlcy5sZW5ndGggLSAyXTtcbiAgICAgICAgbGV0IGNvdW50ID0gMjtcbiAgICAgICAgd2hpbGUgKHBhcmVudFJvbGUgPT09ICdub25lJykge1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIHBhcmVudFJvbGUgPSBhbmNlc3RvclJvbGVzW2FuY2VzdG9yUm9sZXMubGVuZ3RoIC0gY291bnRdO1xuXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8qKmZvciAobGV0IGogPSAwLCBsZW5ndGggPSByb2xlcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0uY29udGFpbmVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0ZXN0ZWRDb250YWluZXIrKztcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb250YWluZXJSb2xlcyA9IGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5jb250YWluZXI7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNvbnRhaW5lcnNMZW5ndGggPSBjb250YWluZXJSb2xlcy5sZW5ndGg7ICFwYXNzZWQgJiYgaSA8IGNvbnRhaW5lcnNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXJlbnRSb2xlID09PSBjb250YWluZXJSb2xlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXNzZWQgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgICAgICAqL1xuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVdICYmIGRlc2lnblBhdHRlcm5zW3JvbGVdLmNvbnRhaW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgICB0ZXN0ZWRDb250YWluZXIrKztcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29udGFpbmVyUm9sZXMgPSBkZXNpZ25QYXR0ZXJuc1tyb2xlXS5jb250YWluZXI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgY29udGFpbmVyc0xlbmd0aCA9IGNvbnRhaW5lclJvbGVzLmxlbmd0aDsgIXBhc3NlZCAmJiBpIDwgY29udGFpbmVyc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZSA9PT0gY29udGFpbmVyUm9sZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFzc2VkID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChjb250YWluZXJSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMl0pO1xuICAgICAgICBpZiAodGVzdGVkQ29udGFpbmVyID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpyZWdpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlUmVnaW9uc1VuaXF1ZUxhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJyZWdpb25cIik7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsOyBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yZWdpb25fbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6cmVnaW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9SZWdpb25MYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICAgICAgLy8gXCJGYWlsXzJcIjogXCJGYWlsXzJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF8yXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhIGxhYmVsXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMlwiOiBcIkVsZW1lbnQgd2l0aCBcXFwicmVnaW9uXFxcIiByb2xlIGlzIG5vdCBsYWJlbGVkIHdpdGggJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcm9sZV9hbGxvd2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcm9sZV9hbGxvd2VkXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRSb2xlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYXJpYV9yb2xlX2FsbG93ZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudHMgbXVzdCBoYXZlIGEgdmFsaWQgJ3JvbGUnIHBlciBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIHJvbGUgJ3swfScgZGVmaW5lZCBvbiB0aGUgZWxlbWVudCBpcyBub3QgdmFsaWQgcGVyIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlNvbWUgb2YgdGhlIHJvbGVzLCAnezB9JywgZGVmaW5lZCBvbiB0aGUgZWxlbWVudCBhcmUgbm90IHZhbGlkIHBlciBBUklBIHNwZWNpZmljYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCI0LjEuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogUmVjaGVja1xuICAgIGFjdDogXCI2NzRiMTBcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcm9sZVN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChyb2xlU3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpbnZhbGlkUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYShydWxlQ29udGV4dCk7XG5cbiAgICAgICAgaWYgKCFpbnZhbGlkUm9sZXMgfHwgaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcm9sZXMgPSByb2xlU3RyLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0gcm9sZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIixcIildKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIixcIildKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFRhYmxlVXRpbCB9IGZyb20gXCIuLi91dGlsL1RhYmxlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yb2xlX3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkFuIGV4cGxpY2l0bHktYXNzaWduZWQgQVJJQSByb2xlIGlzIG5vdCByZWR1bmRhbnQgd2l0aCB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcIlRoZSBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBcXFwiezB9XFxcIiBpcyByZWR1bmRhbnQgd2l0aCB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVudCA8ezF9PlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGV4cGxpY2l0bHktYXNzaWduZWQgQVJJQSByb2xlIHNob3VsZCBub3QgYmUgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBlbGVtTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBhcmlhUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICBpZiAoIWFyaWFSb2xlcyB8fCBhcmlhUm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIGxldCByb2xlX2RlZmluZWQgPSBBcmlhVXRpbC5hcmVSb2xlc0RlZmluZWQoYXJpYVJvbGVzKTtcbiAgICAgICAgaWYgKCFyb2xlX2RlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiBpdCdzIGFscmVhZHkgZmFpbGVkIGluIHRoZSBwYXJlbnQgcmVsYXRpb24sIHRoZW4gc2tpcCB0aGlzIGNoZWNrXG4gICAgICAgIC8vIGNvbW1lbnQgb3V0IHRvIHJlcG9ydCB0aGUgcmVkdW5kYW50IHJvbGUgZm9yIHRhYmxlIGVsZW1lbnQ6IHRyLCB0ZCAmIHRoXG4gICAgICAgIC8qKmlmIChbXCJ0ZFwiLCBcInRoXCIsIFwidHJcIl0uaW5jbHVkZXMoZWxlbU5hbWUpKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZSA9IFRhYmxlVXRpbC5pc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgaWYgKHBhcmVudFJvbGUgIT09IG51bGwgJiYgcGFyZW50Um9sZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9Ki9cblxuICAgICAgICBsZXQgaW1wbGljaXRSb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghaW1wbGljaXRSb2xlcyB8fCBpbXBsaWNpdFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuXG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhUm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghaW1wbGljaXRSb2xlcy5pbmNsdWRlcyhhcmlhUm9sZXNbaV0pKSAgXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgIGVsc2UgICAgIFxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9yZWR1bmRhbnRcIiwgW2FyaWFSb2xlc1tpXSwgZWxlbU5hbWVdKSk7XG4gICAgICAgIH0gIFxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApICBcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIHJldHVybiBudWxsOyAgICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpzZWFyY2hcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlU2VhcmNoTGFuZG1hcmtzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJzZWFyY2hcXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInNlYXJjaFxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInNlYXJjaFxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBkZXByZWNhdGVkIHRoZSBydWxlIG9uIDAxLzI3LzIwMjVcbiAgICAgKiBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLCovXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW10sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwic2VhcmNoXCIsIHRydWUpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yb2xlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcm9sZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX3NlbWFudGljc19yb2xlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBBUklBIHJvbGUgJ3swfScgaXMgbm90IHZhbGlkIGZvciB0aGUgZWxlbWVudCA8ezF9PlwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgQVJJQSByb2xlICd7MH0nIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT4gYW5kIG1heSBiZSBpZ25vcmVkIGJ5IHRoZSBicm93c2VyIHNpbmNlIHRoZSBlbGVtZW50IGlzIGZvY3VzYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFSSUEgcm9sZXMgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhleSBhcmUgYXNzaWduZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBvbmx5IGNoZWsgZWxlbWVudCAoMSkgYW5kIGZyYWdtZW50IG5vZGVzICgxMSlcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIC8vIHRoZSBpbnZhbGlkIHJvbGUgY2FzZTogaGFuZGxlZCBieSBhcmlhX3JvbGVfYWxsb3dlZC4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIGNvbnN0IHVuZGVmaW5lZFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAodW5kZWZpbmVkUm9sZXMgJiYgdW5kZWZpbmVkUm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRSb2xlcyA9IEFyaWFVdGlsLmdldERlcHJlY2F0ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZFJvbGVzICYmIGRlcHJlY2F0ZWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gZGVwZW5kZW5jeSBjaGVjazogaWYgaXQncyBhbHJlYWR5IGZhaWxlZCwgdGhlbiBza2lwXG4gICAgICAgIGlmIChbXCJ0ZFwiLCBcInRoXCIsIFwidHJcIl0uaW5jbHVkZXModGFnTmFtZSkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRSb2xlID0gQ29tbW9uVXRpbC5pc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgaWYgKHBhcmVudFJvbGUgIT09IG51bGwgJiYgcGFyZW50Um9sZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRvbVJvbGVzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWRvbVJvbGVzIHx8IGRvbVJvbGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gY2hlY2sgdGhlICdnZW5lcmljJyByb2xlIGZpcnN0XG4gICAgICAgIGlmIChkb21Sb2xlcy5pbmNsdWRlcygnZ2VuZXJpYycpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtcImdlbmVyaWNcIiwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgbGV0IGludmFsaWRSb2xlcyA9IEFyaWFVdGlsLmdldEludmFsaWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChpbnZhbGlkUm9sZXMgPT09IG51bGwgfHwgaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFtkb21Sb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcblxuICAgICAgICBpZiAoaW52YWxpZFJvbGVzLmluY2x1ZGVzKFwicHJlc2VudGF0aW9uXCIpIHx8IGludmFsaWRSb2xlcy5pbmNsdWRlcyhcIm5vbmVcIikgJiYgQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZG9tUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbZG9tUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbi8vIFRoaXMgcnVsZSBpcyBpbiB0aGUgc2FtZSBmaWxlIGJlY2F1c2UgdGhlcmUgaXMgYSBkZXBlbmRlbmN5IHRoYXQgYXJpYV9yb2xlX3ZhbGlkIHJ1bnMgZmlyc3QsXG4vLyBhbmQgdGhlIGluZm8gaXMgcGFzc2VkIGJ5IGNhY2hlLCBidXQgdGhlcmUgaXNuJ3QgYSBkZXBlbmRlbmN5IGluIHRoZSBGYWlsXzIgc2NlbmFyaW8sIHNvIHJlZ3VsYXJcbi8vIGRlcGVuZGVuY3kgY2Fubm90IGJlIHVzZWRcbmV4cG9ydCBjb25zdCBhcmlhX2F0dHJpYnV0ZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICAvLyBUaGUgdGhlIEFSSUEgcm9sZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiLCBcImFyaWFfcm9sZV92YWxpZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFSSUEgYXR0cmlidXRlcyBzaG91bGQgYmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50IGFuZCBBUklBIHJvbGUgdG8gd2hpY2ggdGhleSBhcmUgYXNzaWduZWRcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIkFSSUEgYXR0cmlidXRlcyBhcmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50IGFuZCBBUklBIHJvbGVcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT4gd2l0aCBBUklBIHJvbGUgXFxcInsyfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT4gd2l0aCBpbXBsaWNpdCBBUklBIHJvbGUgXFxcInsyfVxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sIC8vcmVtb3ZlZCBtYXBwaW5nIHRvIDQuMS4yIGZyb20gaGVyZSBhbmQgaGVscFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtcIjVjMDFlYVwiLCB7IFwiNDZjYTdmXCI6IHsgXCJQYXNzXCI6IFwicGFzc1wiLCBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIjogXCJmYWlsXCIsIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcImZhaWxcIn19XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBvbmx5IGNoZWsgZWxlbWVudCAoMSlcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gaWdub3JlIGlmIG5vIGFyaWEgYXR0cmlidXRlXG4gICAgICAgIGxldCBhcmlhQXR0cmlidXRlczpzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoYXJpYUF0dHJpYnV0ZXMgPT09IG51bGwgfHwgYXJpYUF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgICAgIGxldCByb2xlczogc3RyaW5nW10gPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBpbnZhbGlkIHJvbGUgY2FzZTogaGFuZGxlZCBieSBScHRfQXJpYV9WYWxpZFJvbGUuIElnbm9yZSB0byBhdm9pZCBkdXBsaWNhdGVkIHJlcG9ydFxuICAgICAgICAgICAgaWYgKCFBcmlhVXRpbC5hcmVSb2xlc0RlZmluZWQocm9sZXMpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9ubyBleHBsaWNpdCByb2xlIGRlZmluZWRcbiAgICAgICAgICAgIHJvbGVzID0gIEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBleHBsaWNpdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGZhaWxlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWZhaWxlZEF0dHJpYnV0ZXMgfHwgZmFpbGVkQXR0cmlidXRlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIsIFthcmlhQXR0cmlidXRlcy5qb2luKFwiLCBcIiksIHRhZ05hbWUsIHJvbGVzLmpvaW4oXCIsIFwiKV0pO1xuXG4gICAgICAgIGlmIChyb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAoZXhwbGljaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiLCBbZmFpbGVkQXR0cmlidXRlcy5qb2luKFwiLCBcIiksIHRhZ05hbWUsIHJvbGVzLmpvaW4oXCIsIFwiKV0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiLCBbZmFpbGVkQXR0cmlidXRlcy5qb2luKFwiLCBcIiksIHRhZ05hbWUsIFwibm9uZVwiXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOnRvb2xiYXJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlVG9vbGJhclVuaXF1ZUxhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJ0b29sYmFyXFxcIiByb2xlcyBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInRvb2xiYXJcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSwgLy91cGRhdGVkIG1hcHBpbmcgdG8gbWF0Y2ggb3RoZXIgbGFuZG1hcmsgcmVnaW9ucyBydWxlc1xuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcInRvb2xiYXJcIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IEFyaWFVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV93aWRnZXRfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9XaWRnZXRMYWJlbHNfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3dpZGdldF9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkludGVyYWN0aXZlIGNvbXBvbmVudCBtdXN0IGhhdmUgYSBwcm9ncmFtbWF0aWNhbGx5IGFzc29jaWF0ZWQgbmFtZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbnRlcmFjdGl2ZSBjb21wb25lbnQgd2l0aCBBUklBIHJvbGUgJ3swfScgZG9lcyBub3QgaGF2ZSBhIHByb2dyYW1tYXRpY2FsbHkgYXNzb2NpYXRlZCBuYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIm02YjFxM1wiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8qIHJlbW92ZWQgdGhlIHJvbGUgY2hlY2sgcm9sZT0gcHJlc2VudGF0aW9uIGFuZCByb2xlPW5vbmUgc2luY2UgdGhlc2UgMiByb2xlcyBhcmUgbm90IGluIHRoZSBsaXN0IG9mIHdpZGdldCB0eXBlIHJvbGVzICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpICYmXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJoaWRkZW5cIikgfHxcbiAgICAgICAgICAgIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpICYmXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInNlYXJjaGJveFwiKVxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBkaWFnbm9zZSB0aGF0IGEgY29tYm9ib3ggaW5wdXQgdGV4dGJveCBoYXMgYSBsYWJlbChnaXRodWIgaXNzdWUgIzExMDQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtUm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBIYW5kbGVkIGJ5IGlucHV0X2xhYmVsX2V4aXN0c1xuICAgICAgICBsZXQgc2tpcFJvbGVzID0gW1xuICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgIFwiY2hlY2tib3hcIixcbiAgICAgICAgICAgIFwiY29tYm9ib3hcIixcbiAgICAgICAgICAgIFwibGlzdGJveFwiLFxuICAgICAgICAgICAgXCJtZW51aXRlbWNoZWNrYm94XCIsXG4gICAgICAgICAgICBcIm1lbnVpdGVtcmFkaW9cIixcbiAgICAgICAgICAgIFwicmFkaW9cIixcbiAgICAgICAgICAgIFwic2VhcmNoYm94XCIsXG4gICAgICAgICAgICBcInNsaWRlclwiLFxuICAgICAgICAgICAgXCJzcGluYnV0dG9uXCIsXG4gICAgICAgICAgICBcInN3aXRjaFwiLFxuICAgICAgICAgICAgXCJ0ZXh0Ym94XCIsXG4gICAgICAgICAgICBcInByb2dyZXNzYmFyXCIsXG4gICAgICAgICAgICBcImxpbmtcIixcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHNraXBSb2xlcy5pbmNsdWRlcyhlbGVtUm9sZSkpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0YWdOYW1lID09PSBcIm91dHB1dFwiIHx8XG4gICAgICAgICAgICAodGFnTmFtZSA9PT0gXCJpbnB1dFwiICYmXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJmaWxlXCIpXG4gICAgICAgICkge1xuICAgICAgICB9XG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgLy8gRm9ybS9pbnB1dCBlbGVtZW50cyBhcmUgY2hlY2tlZCBieSBHNDEsIHdlIHNraXAgdGhlbSBmcm9tIHRoaXMgcnVsZS4gR2l0aHViIGlzc3VlIDQ0OVxuICAgICAgICAgICAgbGV0IHNraXBFbGVtZW50cyA9IFtcbiAgICAgICAgICAgICAgICBcImlucHV0XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiLFxuICAgICAgICAgICAgICAgIFwic2VsZWN0XCIsXG4gICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICBcImRhdGFsaXN0XCIsXG4gICAgICAgICAgICAgICAgXCJvcHRncm91cFwiLFxuICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJrZXlnZW5cIixcbiAgICAgICAgICAgICAgICBcIm91dHB1dFwiLFxuICAgICAgICAgICAgICAgIFwicHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgICBcIm1ldGVyXCIsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNraXBFbGVtZW50cy5pbmRleE9mKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpICE9XG4gICAgICAgICAgICAgICAgLTFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXZvaWQgZGlhZ25vc2luZyB0aGUgcG9wdXAgbGlzdCBvZiBhIGNvbWJvYm94LlxuICAgICAgICBsZXQgcm9sZXNUb0NoZWNrID0gW1wibGlzdGJveFwiLCBcInRyZWVcIiwgXCJncmlkXCIsIFwiZGlhbG9nXCJdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvbGVzVG9DaGVjay5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgcm9sZXNUb0NoZWNrW2pdKSkge1xuICAgICAgICAgICAgICAgIGxldCBjb21ib2JveGVzID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgXCJjb21ib2JveFwiLFxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbWJvYm94ZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ID0gY29tYm9ib3hlc1trXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFfb3ducyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJvYm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhcmlhLW93bnNcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJpYV9vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ducyA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhX293bnMudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duc1tpXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHByb2hpYml0ZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICAvL2dldCBhdHRyaWJ1dGUgcm9sZXMgYXMgd2VsbCBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICBsZXQgbnVtV2lkZ2V0c1Rlc3RlZCA9IDA7XG4gICAgICAgIGxldCBpbnRlcmFjdGl2ZVJvbGVUeXBlcyA9IFtcIndpZGdldFwiLCBcImxpdmVSZWdpb25cIiwgXCJ3aW5kb3dcIl07XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByb2xlcy5sZW5ndGg7IHBhc3NlZCAmJiBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBwYXR0ZXJuID0gZGVzaWduUGF0dGVybnNbcm9sZXNbaV1dO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcGF0dGVybiAmJlxuICAgICAgICAgICAgICAgIHBhdHRlcm4ubmFtZVJlcXVpcmVkICYmXG4gICAgICAgICAgICAgICAgcGF0dGVybi5yb2xlVHlwZSAmJlxuICAgICAgICAgICAgICAgIGludGVyYWN0aXZlUm9sZVR5cGVzLmluY2x1ZGVzKHBhdHRlcm4ucm9sZVR5cGUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICArK251bVdpZGdldHNUZXN0ZWQ7XG5cbiAgICAgICAgICAgICAgICAvLyBBbGwgd2lkZ2V0cyBtYXkgaGF2ZSBhbiBhdXRob3Igc3VwcGxpZWQgYWNjZXNzaWJsZSBuYW1lLlxuICAgICAgICAgICAgICAgIC8vIFRpdGxlIGlzIGxlZ2FsLCBidXQgZG9uJ3QgYWR2ZXJ0aXNlIGl0cyB1c2UgaW4gZG9jdW1lbnRhdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBFbmNvdXJhZ2UgdXNlIG9mIGFyaWEtbGFiZWwsIGFyaWEtbGFiZWxsZWRieSBvciBodG1sIGxhYmVsIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKTtcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXBhc3NlZCAmJlxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLm5hbWVGcm9tICYmXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm4ubmFtZUZyb20uaW5kZXhPZihcImNvbnRlbnRzXCIpID49IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGlmIHdpZGdldCdzIGFjY2Vzc2libGUgbmFtZSBpcyBzdXBwbGllZCBieSBlbGVtZW50J3MgaW5uZXIgdGV4dFxuICAgICAgICAgICAgICAgICAgICAvLyBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRPckFsdChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXQgaGFzIGltcGxpY2l0IGxhYmVsLCBsaWtlIDxsYWJlbD48aW5wdXQgLi4uLj5hYmMgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbXBsaWNpdExhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFwYXNzZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgRE9NVXRpbC5jbGVhbldoaXRlc3BhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLm5hbWVGcm9tLmluZGV4T2YoXCJwcm9oaWJpdGVkXCIpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvaGliaXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG51bVdpZGdldHNUZXN0ZWQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbZWxlbVJvbGVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vVE9ET1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYgKHByb2hpYml0ZWQpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFzY2lpYXJ0X2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXNjaWlhcnRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnByZSwgZG9tOmxpc3RpbmcsIGRvbTp4bXAsIGRvbTpwbGFpbnRleHRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9QcmVfQVNDSUlBcnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXNjaWlhcnRfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiYXNjaWlhcnRfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXNjaWlhcnRfYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgQVNDSUkgYXJ0IGhhcyBhIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBU0NJSSBhcnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIERlY2lzaW9uIGluIHBsYW5uaW5nIDkvNy8yMyB0aGF0IHRoaXMgcnVsZSBjYXVzZXMgbW9yZSByZXZpZXdzIHRoYXQgd2Ugc2VlIGFjdHVhbCBwcm9ibGVtcyBpbiBjb250ZW50LCBzbyB0dXJuIHRoZXNlIHJ1bGVzIG9mZlxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgICovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvLyBGaXggZm9yIElEV0Igd3JpdGVycy4gRG9uJ3QgdHJpZ2dlciBpZiBjb250ZW50IGlzIGluIGEgY29kZSBlbGVtZW50LiAgVGhlIGNvZGUgZWxlbWVudCBpcyBzZWFyY2hlZCBmb3JcbiAgICAgICAgLy8gaW4gdmFyaW91cyBwbGFjZXMgYmVjYXVzZSBvZiB0aGUgd2VpcmQgd2F5IHZhcmlvdXMgYnJvd3NlcnMgcmVuZGVyIDxjb2RlPjxwcmU+PC9wcmU+PC9jb2RlLiAgRmlyZWZveCxcbiAgICAgICAgLy8gSHRtbFVuaXQgYW5kIENocm9tZSBhbGwgcmVuZGVyIGRpZmZlcmVudGx5LiAgRmlyZWZveDogPGNvZGU+PC9jb2RlPjxwcmU+PC9wcmU+ICBIdG1sVW5pdDogPC9jb2RlPjxwcmU+PGNvZGU+PC9jb2RlPjwvcHJlPlxuICAgICAgICAvLyBTZWUgdW5pdCB0ZXN0IENvZGVFbGVtZW50QWJvdmVQcmVFbGVtZW50Lmh0bWwuICBEb24ndCBrbm93IGhvdyBSUFQgcmVuZGVycywgc28gY292ZXIgYWxsIHRoZSBiYXNlcy5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJwcmVcIikge1xuICAgICAgICAgICAgaWYgKChydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmcgJiYgcnVsZUNvbnRleHQucHJldmlvdXNTaWJsaW5nLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJjb2RlXCIpIHx8XG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjb2RlXCIpLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImNvZGVcIikpIHtcblxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgdHh0VmFsdWUgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICBsZXQgbGFzdENoYXJhY3RlciA9IFwiXCI7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSB0ZXh0IGNvbnRlbnRcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgcGFzc2VkICYmIChpZHggPCB0eHRWYWx1ZS5sZW5ndGgpOyArK2lkeCkge1xuICAgICAgICAgICAgbGV0IGNoU3RyID0gdHh0VmFsdWUuc3Vic3RyKGlkeCwgMSk7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBhbHBoYW51bWVyaWMgb3IgcHVuY3R1YXRpb25cbiAgICAgICAgICAgIGlmICgvW1xcdyFAIyQlJlxcKigpLiw/XFxbXFxde308Pj1cIjpcXC9cXFxcLV0vLnRlc3QoY2hTdHIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRGV0ZWN0IHNhbWUgY2hhcmFjdGVyIHNlcXVlbmNlXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RDaGFyYWN0ZXIgPT0gY2hTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgKyAxOztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9cXHMvLnRlc3QoY2hTdHIpKSB7XG4gICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgPSBub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ICsgMTtcbiAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RDaGFyYWN0ZXIgPSBjaFN0cjtcblxuICAgICAgICAgICAgLy8gTWFrZSB0aGUgZGVjaXNpb25cbiAgICAgICAgICAgIGlmIChub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ID49IDUgfHwgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA+PSA0KSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBibGlua19jc3NfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImJsaW5rX2Nzc19yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOipbc3R5bGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxpbmtfQ1NTVHJpZ2dlcjFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBibGlua19jc3NfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGJsaW5rX2Nzc19yZXZpZXcuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBibGlua19jc3NfcmV2aWV3Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkRvIG5vdCB1c2UgdGhlIFxcXCJibGlua1xcXCIgdmFsdWUgb2YgdGhlICd0ZXh0LWRlY29yYXRpb24nIHByb3BlcnR5IGZvciBsb25nZXIgdGhhbiBmaXZlIHNlY29uZHNcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJDaGVjayB0aGUgXFxcImJsaW5rXFxcIiB2YWx1ZSBvZiB0aGUgQ1NTICd0ZXh0LWRlY29yYXRpb24nIHByb3BlcnR5IGlzIG5vdCB1c2VkIGZvciBtb3JlIHRoYW4gdGhhbiBmaXZlIHNlY29uZHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjIuMi4yXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdGV4dFZhbHVlID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKCdzdHlsZScpKSB7XG4gICAgICAgICAgICB0ZXh0VmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdGV4dFZhbHVlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcInRleHQtZGVjb3JhdGlvbjpibGlua1wiKSA9PSAtMTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgYmxpbmtfZWxlbV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImJsaW5rX2VsZW1fZGVwcmVjYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQmxpbmtfQWx3YXlzVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBibGlua19lbGVtX2RlcHJlY2F0ZWQuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYmxpbmtfZWxlbV9kZXByZWNhdGVkLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbnRlbnQgdGhhdCBibGlua3MgcGVyc2lzdGVudGx5IG11c3Qgbm90IGJlIHVzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29udGVudCBmb3VuZCB0aGF0IGJsaW5rcyBwZXJzaXN0ZW50bHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjIuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGJsb2NrcXVvdGVfY2l0ZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYmxvY2txdW90ZV9jaXRlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJsb2NrcXVvdGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9CbG9ja3F1b3RlX0hhc0NpdGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYmxvY2txdW90ZV9jaXRlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiYmxvY2txdW90ZV9jaXRlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYmxvY2txdW90ZV9jaXRlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgPGJsb2NrcXVvdGU+IHNob3VsZCBoYXZlIGEgJ2NpdGUnIGF0dHJpYnV0ZSBhbmQgbm90IGJlIHVzZWQgZm9yIGluZGVudGF0aW9uIG9ubHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJVc2UgPGJsb2NrcXVvdGU+IG9ubHkgZm9yIHF1b3RhdGlvbnMsIG5vdCBpbmRlbnRhdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJjaXRlXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IGNpdGVFbGVtcyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJjaXRlXCIpO1xuICAgICAgICAgICAgcGFzc2VkID0gY2l0ZUVsZW1zICE9IG51bGwgJiYgY2l0ZUVsZW1zLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmNhbnZhc1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19DYW52YXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGFjY2Vzc2liaWxpdHkgb2YgdGhlIDxjYW52YXM+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGNhbnZhcz4gZWxlbWVudCBtYXkgbm90IGJlIGFjY2Vzc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCIsIFwiMi4xLjFcIiwgXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuaW5uZXJIVE1MLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgY2FwdGlvbl90cmFja19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY2FwdGlvbl90cmFja19leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTp2aWRlb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19WaWRlb19IYXNOb1RyYWNrXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJjYXB0aW9uX3RyYWNrX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY2FwdGlvbl90cmFja19leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGNhcHRpb25zIGFyZSBhdmFpbGFibGUgZm9yIGFueSBtZWFuaW5nZnVsIGF1ZGlvIG9yIHByb3ZpZGUgYSBjYXB0aW9uIHRyYWNrIGZvciB0aGUgPHZpZGVvPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8dmlkZW8+IGVsZW1lbnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZSBmb3IgYW55IG1lYW5pbmdmdWwgYXVkaW8gY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4yLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTFZpZGVvRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGlnbm9yZSBkZWNvcmF0aXZlIHZpZGVvIGlmIHVzZXIgdXNlcyBhcmlhLWhpZGRlblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cmFja3MgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyYWNrXCIpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgdHJhY2tzW2ldLmdldEF0dHJpYnV0ZShcImtpbmRcIikgPT09ICdjYXB0aW9ucyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2tzIGZvciBhZGRpdGlvbiBvZiBkeW5hbWljIHRyYWNrc1xuICAgICAgICBpZiAocnVsZUNvbnRleHQudGV4dFRyYWNrcyAmJiBydWxlQ29udGV4dC50ZXh0VHJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVsZUNvbnRleHQudGV4dFRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCBydWxlQ29udGV4dC50ZXh0VHJhY2tzW2ldLmtpbmQgPT09ICdjYXB0aW9ucyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX21pc3NpbmdcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm90X2luX3BvcHVwXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2FjdGl2ZV9yb2xlX2ludmFsaWRcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCInYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyB1c2VkIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgY29tYm9ib3hcIixcbiAgICAgICAgICAgIFwiRmFpbF9taXNzaW5nXCI6IFwiVGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiBkb2VzIG5vdCBleGlzdFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF9pbl9wb3B1cFwiOiBcIlRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgXFxcInswfVxcXCIgZG9lcyBub3QgZXhpc3Qgd2l0aGluIHRoZSBwb3B1cCByZWZlcmVuY2VkIGJ5ICdpZCcgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfcm9sZV9pbnZhbGlkXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIHJlZmVyZW5jZXMgYW4gZWxlbWVudCB3aXRoIHRoZSByb2xlcyBcXFwiezF9XFxcIiwgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZSBvZiAnb3B0aW9uJywgJ2dyaWRjZWxsJywgJ3JvdycsIG9yICd0cmVlaXRlbSdcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfbm90X3NlbGVjdGVkXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIHJlZmVyZW5jZXMgYW4gZWxlbWVudCB0aGF0IGRvZXMgbm90IGhhdmUgJ2FyaWEtc2VsZWN0ZWQnIHNldCB0byB0cnVlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgbXVzdCBiZSB1c2VkIHRvIGRlZmluZSBmb2N1cyB3aXRoaW4gdGhlIGNvbWJvYm94IHBvcHVwLCBleGNlcHQgd2hlbiB1c2luZyBhIGRpYWxvZyBwb3B1cFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGNhY2hlZEVsZW0gPSBjYWNoZVtjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoXTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cEVsZW1lbnQsIHBvcHVwSWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBUaGlzIHJ1bGUgb25seSBhcHBsaWVzIGlmIHRoZSBhY3RpdmVkZXNjZW5kYW50IGlzIHNwZWNpZmllZFxuICAgICAgICBsZXQgYWN0aXZlSWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgIGlmICghYWN0aXZlSWQgfHwgYWN0aXZlSWQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWN0aXZlRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBhY3RpdmVJZCk7XG4gICAgICAgIGlmICghYWN0aXZlRWxlbSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9taXNzaW5nXCIsIFthY3RpdmVJZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgLy8gZXhhbWluZSB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKHBvcHVwRWxlbWVudCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKCFmb3VuZCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gcG9wdXBFbGVtZW50ICYmIG53Lm5vZGUgIT0gcG9wdXBFbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcImlkXCIpID09PSBhY3RpdmVJZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gW107XG5cbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZVBhc3MoXCJGYWlsX25vdF9pbl9wb3B1cFwiLCBbYWN0aXZlSWQsIHBvcHVwSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWN0aXZlUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhhY3RpdmVFbGVtLCB0cnVlKTtcbiAgICAgICAgbGV0IHZhbGlkUm9sZXMgPSBbXCJvcHRpb25cIiwgXCJncmlkY2VsbFwiLCBcInJvd1wiLCBcInRyZWVpdGVtXCJdLmZpbHRlcigodmFsaWRSb2xlKSA9PiBhY3RpdmVSb2xlcy5pbmNsdWRlcyh2YWxpZFJvbGUpKTtcbiAgICAgICAgaWYgKHZhbGlkUm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfYWN0aXZlX3JvbGVfaW52YWxpZFwiLCBbYWN0aXZlSWQsIGFjdGl2ZVJvbGVzLmpvaW4oXCIsXCIpXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGl2ZUVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1zZWxlY3RlZFwiKSAhPT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9hY3RpdmVfbm90X3NlbGVjdGVkXCIsIFthY3RpdmVJZF0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJjb21ib2JveF9hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbmxpbmVcIjogXCJGYWlsX2lubGluZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiVGhlIGNvbWJvYm94IGRvZXMgbm90IHVzZSAnYXJpYS1hdXRvY29tcGxldGUnIHZhbHVlICdcXFwiaW5saW5lXFxcIicgbm9yIGRvZXMgaXQgaGF2ZSAnYXJpYS1hdXRvY29tcGxldGUnIGRlZmluZWQgd2l0aGluIHRoZSBwb3B1cFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgY29tYm9ib3ggaGFzIHRoZSAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBpbmNvcnJlY3RseSBzZXQgb24gYW4gZWxlbWVudCB3aXRoaW4gdGhlIHBvcHVwIHJlZmVyZW5jZWQgYnkgXFxcInswfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbmxpbmVcIjogXCJUaGUgY29tYm9ib3ggZG9lcyBub3Qgc3VwcG9ydCBhbiAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgdG8gJ1xcXCJpbmxpbmVcXFwiJyBcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGNvbWJvYm94IHRoYXQgc3VwcG9ydHMgYXV0b2NvbXBsZXRpb24gYmVoYXZpb3IgbXVzdCBoYXZlIHRoZSAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBvbmx5IG9uIGl0cyB0ZXh0IGlucHV0IGVsZW1lbnQgd2l0aCBhIHZhbGlkIHZhbHVlOyBhIHZhbHVlIG9mICdcXFwiaW5saW5lXFxcIicgaXMgbm90IHN1cHBvcnRlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgY2FjaGVkRWxlbSA9IGNhY2hlW2NvbnRleHRbXCJkb21cIl0ucm9sZVBhdGhdO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwSWQsIHBvcHVwRWxlbWVudCB9ID0gY2FjaGVkRWxlbTtcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIikgPT09IFwiaW5saW5lXCIpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9pbmxpbmVcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7IFxuICAgICAgICAvLyBleGFtaW5lIHRoZSBjaGlsZHJlblxuICAgICAgICBpZiAocG9wdXBFbGVtZW50ICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAvLyBpZiBwb3B1cEVsZW1lbnQgaXRzZWxmIGhhcyBcImFyaWEtYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIHBhc3NlZCA9ICFwb3B1cEVsZW1lbnQuaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIik7XG4gICAgICAgICAgICAvLyBpZiBhbnkgY2hpbGQgb2YgcG9wdXBFbGVtZW50IGhhcyBcImFyaWEtYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgcG9wdXBFbGVtZW50LmNoaWxkcmVuICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobncuYkVuZFRhZyAmJiBudy5ub2RlID09PSBwb3B1cEVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3BvcHVwSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZnVuY3Rpb24gcGF0dGVybkRldGVjdChlbGVtOiBFbGVtZW50KTogU3RyaW5nIHtcbiAgICAvLyBjaGVjayAnZXhwbGljaXQnIHJvbGUgY29tYm9ib3ggYW5kIHRoYXQgaXQgaXMgbm90IDxzZWxlY3Q+LiBcbiAgICBpZiAoZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2VsZWN0XCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpICE9PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgcmV0dXJuIFwiaW1wbGljaXRcIjtcbiAgICB9IGVsc2UgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiXG4gICAgICAgICYmICghZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJ0ZXh0XCIpXG4gICAgICAgICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpICYmICFlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikpIHtcbiAgICAgICAgLy8gTG9va3MgbGlrZSB0aGlzIGlzIGFuIEFSSUEgMS4wIHBhdHRlcm4sIHdoaWNoIHRoZSBBUklBIDEuMiBzcGVjIHNheXMgdG8gY29udGludWUgdG8gYWxsb3dcbiAgICAgICAgcmV0dXJuIFwiMS4wXCI7XG4gICAgfSBlbHNlIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiaW5wdXRcIlxuICAgICAgICAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSAmJiAhZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgIC8vIExvb2tzIGxpa2UgdGhpcyBpcyBhbiBBUklBIDEuMSBwYXR0ZXJuLCB3aGljaCB0aGUgQVJJQSAxLjIgc3BlYyBzYXlzIGlzIG5vdyBpbnZhbGlkXG4gICAgICAgIHJldHVybiBcIjEuMVwiO1xuICAgIH1cbiAgICAvLyBBc3N1bWUgdGhleSdyZSB0cnlpbmcgdG8gZG8gdGhlIGxhdGVzdCwgMS4yIHBhdHRlcm5cbiAgICByZXR1cm4gXCIxLjJcIjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2Rlc2lnbl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9kZXNpZ25fdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImNvbWJvYm94X3ZlcnNpb25cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMFwiOiBcIlBhc3NfMS4wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4xXCI6IFwiRmFpbF8xLjFcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJcIjogXCJQYXNzXzEuMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMVwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMFwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBpcyBkZXRlY3RlZCBhcyBBUklBIDEuMCwgd2hpY2ggaXMgYWxsb3dlZCBieSBBUklBIDEuMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMVwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBpcyBkZXRlY3RlZCBhcyBBUklBIDEuMSwgd2hpY2ggaXMgbm90IGFsbG93ZWQgYnkgQVJJQSAxLjJcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gaXMgZGV0ZWN0ZWQgYXMgQVJJQSAxLjJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gbXVzdCBiZSB2YWxpZCBmb3IgQVJJQSAxLjJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF0dGVybiA9IHBhdHRlcm5EZXRlY3QocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIFdlIGRvbid0IGFzc2VzcyBuYXRpdmUgc2VsZWN0IGVsZW1lbnRzIGhlcmVcbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IFwiaW1wbGljaXRcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGV4cGFuZGVkID0gKEFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1leHBhbmRlZFwiKSB8fCBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgIGxldCBlZGl0YWJsZSA9IHRhZ05hbWUgPT09IFwiaW5wdXRcIiAmJiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgfHwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIik7XG5cbiAgICAgICAgbGV0IGtleSA9IGNvbnRleHRbXCJkb21cIl0ucm9sZVBhdGg7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGxldCBjYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY2FjaGVba2V5XSA9IHtcbiAgICAgICAgICAgICAgICBcImlucHV0RWxlbWVudFwiOiBlZGl0YWJsZSA/IHJ1bGVDb250ZXh0IDogbnVsbCxcbiAgICAgICAgICAgICAgICBcInBhdHRlcm5cIjogcGF0dGVybixcbiAgICAgICAgICAgICAgICBcImV4cGFuZGVkXCI6IGV4cGFuZGVkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwgY2FjaGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8geHBhdGg/XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzEuMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMlwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50c1wiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF90YWJiYWJsZVwiOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfdGFiYmFibGVfY2hpbGRcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJET00gZm9jdXMgaXMgYWxsb3dlZCBvbmx5IG9uIHRoZSBjb21ib2JveCBlbGVtZW50IGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm90X3RhYmJhYmxlXCI6IFwiVGhlIGNvbWJvYm94IGVsZW1lbnQgZG9lcyBub3QgYWxsb3cgRE9NIGZvY3VzIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfdGFiYmFibGVfY2hpbGRcIjogXCJUaGUgcG9wdXAgb2YgdGhlIGNvbWJvYm94IGhhcyBET00gZm9jdXMgb3IgaGFzICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIGRlZmluZWQsIHdoaWNoIGlzIG5vdCBhbGxvd2VkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGFiYmFibGUgZm9jdXMgZm9yIHRoZSBjb21ib2JveCBtdXN0IGJlIGFsbG93ZWQgb25seSBvbiB0aGUgdGV4dCBpbnB1dCwgZXhjZXB0IHdoZW4gdXNpbmcgYSBkaWFsb2cgcG9wdXBcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgY2FjaGVkRWxlbSA9IGNhY2hlW2NvbnRleHRbXCJkb21cIl0ucm9sZVBhdGhdO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgZXhwYW5kZWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBwb3B1cFJvbGUgPSBBcmlhVXRpbC5nZXRSb2xlcyhwb3B1cEVsZW1lbnQsIHRydWUpWzBdO1xuXG4gICAgICAgIGxldCByZXRWYWwgPSBbXVxuICAgICAgICBpZiAoIUNvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9ub3RfdGFiYmFibGVcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBtYWtlcyBzZW5zZSB0byBjaGVjayB0aGUgcG9wdXAgd2hlbiBleHBhbmRlZFxuICAgICAgICAvLyB0aGlzIGRvZXMgbm90IGFwcGx5IHRvIGRpYWxvZ3MsIHJldHVybiBwYXNzIHNpbmNlIHRoZSBtYWluIGVsZW1lbnQgd2FzIGZvY3VzYWJsZSBhYm92ZVxuICAgICAgICBpZiAoZXhwYW5kZWQgPT09IGZhbHNlIHx8IHBvcHVwUm9sZSA9PT0gXCJkaWFsb2dcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGV4YW1pbmUgdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChwb3B1cEVsZW1lbnQgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAvLyBpZiBwb3B1cEVsZW1lbnQgaXRzZWxmIGhhcyBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXG4gICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHBvcHVwRWxlbWVudCkgJiYgIUFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocG9wdXBFbGVtZW50LCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTs7XG4gICAgICAgICAgICAvLyBpZiBhbnkgY2hpbGQgb2YgcG9wdXBFbGVtZW50IGhhcyBcImFyaWEtYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgcG9wdXBFbGVtZW50LmNoaWxkcmVuICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhQXJpYVV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShudy5ub2RlLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudy5iRW5kVGFnICYmIG53Lm5vZGUgPT09IHBvcHVwRWxlbWVudC5sYXN0RWxlbWVudENoaWxkKSBicmVhazsgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImNvbWJvYm94X2hhc3BvcHVwXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIjogXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIjogXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiVGhlICdhcmlhLWNvbnRyb2xzJyAoQVJJQSAxLjIpIG9yICdhcmlhLW93bnMnIChBUklBIDEuMCkgYXBwcm9wcmlhdGVseSByZWZlcmVuY2VzIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiOiBcIlRoZSAncm9sZScgdmFsdWUgXFxcInswfVxcXCIgb2YgdGhlIHBvcHVwIGVsZW1lbnQgXFxcInsxfVxcXCIgc2hvdWxkIGJlIG9uZSBvZiBcXFwibGlzdGJveFxcXCIsIFxcXCJncmlkXFxcIiwgXFxcInRyZWVcXFwiIG9yIFxcXCJkaWFsb2dcXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwiOiBcIlRoZSB2YWx1ZSBvZiB0aGUgY29tYm9ib3ggJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCBtYXRjaCB0aGUgJ3JvbGUnIHZhbHVlIG9mIHRoZSBwb3B1cCBlbGVtZW50IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGNvbWJvYm94IGF0dHJpYnV0ZSAnYXJpYS1oYXNwb3B1cCcgdmFsdWUgbXVzdCBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHJvbGUgb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSAnYXJpYS1jb250cm9scycgKEFSSUEgMS4yKSBvciAnYXJpYS1vd25zJyAoQVJJQSAxLjApXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBjb25zdCBjYWNoZWRFbGVtID0gY2FjaGVbY2FjaGVLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgcG9wdXBJZCB9ID0gY2FjaGVkRWxlbTtcbiAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgY29tYm9ib3ggaXMgcHJvYmFibHkgY29sbGFwc2VkLiBBIHJlZmVyZW5jZSBlcnJvciBpc1xuICAgICAgICAvLyBkZXRlY3RlZCBpbiBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcbiAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDaGVjayB0aGF0IHBvcHVwIHJvbGUgaXMgbGlzdGJveCwgZ3JpZCwgdHJlZSwgb3IgZGlhbG9nIGFuZCB0aGF0IGl0IG1hdGNoZXMgdGhlIGNvbWJvYm94XG4gICAgICAgIGxldCBwb3B1cFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocG9wdXBFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgbGV0IHZhbGlkUm9sZXMgPSBbXCJsaXN0Ym94XCIsIFwiZ3JpZFwiLCBcInRyZWVcIiwgXCJkaWFsb2dcIl0uZmlsdGVyKCh2YWxpZFJvbGUpID0+IHBvcHVwUm9sZXMuaW5jbHVkZXModmFsaWRSb2xlKSk7XG4gICAgICAgIGlmICh2YWxpZFJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIiwgW3BvcHVwUm9sZXMuam9pbihcIixcIiksIHBvcHVwSWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBwb3B1cFJvbGUgPSB2YWxpZFJvbGVzWzBdO1xuICAgICAgICAgICAgbGV0IGhhc3BvcHVwVmFsID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSB8fCBcImxpc3Rib3hcIjtcbiAgICAgICAgICAgIC8vIFBvcHVwIHJvbGUgbXVzdCBtYXRjaCBhcmlhLWhhc3BvcHVwIHVubGVzcyBwb3B1cFJvbGUgaXMgbGlzdGJveCwgdGhlbiBhcmlhLWhhc3BvcHVwIHNob3VsZCBub3QgYmUgZGVmaW5lZCAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChoYXNwb3B1cFZhbCAhPT0gcG9wdXBSb2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvcHVwUm9sZSAhPT0gXCJsaXN0Ym94XCIgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIiwgW2hhc3BvcHVwVmFsLCBwb3B1cFJvbGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZTogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X2Rlc2lnbl92YWxpZFwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2V4cGFuZGVkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfY29sbGFwc2VkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfZXhwYW5kZWRcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMl9jb2xsYXBzZWRcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMl9taXNzaW5nX2NvbnRyb2xzXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMl9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfZXhwYW5kZWRfaGlkZGVuXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdhcmlhLWNvbnRyb2xzJyAoZm9yIEFSSUEgMS4yKSBvciB0aGUgJ2FyaWEtb3ducycgKGZvciBBUklBIDEuMCkgYXR0cmlidXRlIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBtdXN0IHJlZmVyZW5jZSBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfZXhwYW5kZWRcIjogXCJUaGUgY29tYm9ib3ggcG9wdXAgcmVmZXJlbmNlZCBieSAnYXJpYS1vd25zJyAoQVJJQSAxLjApIGV4aXN0cyBhbmQgaXMgdmlzaWJsZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMF9jb2xsYXBzZWRcIjogXCJUaGUgY29tYm9ib3ggcG9wdXAgaW4gaXRzIGNvbGxhcHNlZCBzdGF0ZSBkb2VzIG5vdCByZWZlcmVuY2UgYW55IHZpc2libGUgcG9wdXAgYXMgcmVxdWlyZWRcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfZXhwYW5kZWRcIjogXCJUaGUgY29tYm9ib3ggcG9wdXAgcmVmZXJlbmNlZCBieSAnYXJpYS1jb250cm9scycgKEFSSUEgMS4yKSBleGlzdHMgYW5kIGlzIHZpc2libGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfY29sbGFwc2VkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIGluIGl0cyBjb2xsYXBzZWQgc3RhdGUgZG9lcyBub3QgcmVmZXJlbmNlIGFueSB2aXNpYmxlIHBvcHVwIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX21pc3Npbmdfb3duc1wiOiBcIlRoZSAnYXJpYS1vd25zJyBhdHRyaWJ1dGUgb2YgdGhlIGV4cGFuZGVkIGNvbWJvYm94IGlzIG1pc3NpbmdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiOiBcIlRoZSAnYXJpYS1jb250cm9scycgYXR0cmlidXRlIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBpcyBtaXNzaW5nXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiVGhlICdhcmlhLW93bnMnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggZG9lcyBub3QgcmVmZXJlbmNlIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMl9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcIlRoZSAnYXJpYS1jb250cm9scycgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBkb2VzIG5vdCByZWZlcmVuY2UgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfZXhwYW5kZWRfaGlkZGVuXCI6IFwiVGhlIGNvbWJvYm94ICdhcmlhLWV4cGFuZGVkJyBhdHRyaWJ1dGUgaXMgdHJ1ZSwgYnV0IHRoZSBjb21ib2JveCBwb3B1cCBpcyBub3QgdmlzaWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCI6IFwiVGhlIGNvbWJvYm94ICdhcmlhLWV4cGFuZGVkJyBhdHRyaWJ1dGUgaXMgZmFsc2UsIGJ1dCB0aGUgY29tYm9ib3ggcG9wdXAgaXMgdmlzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCI0ZThhYjZcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMF9leHBhbmRlZFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfY29sbGFwc2VkXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMl9leHBhbmRlZFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfY29sbGFwc2VkXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfZXhwYW5kZWRfaGlkZGVuXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBjYWNoZUtleSA9IGNvbnRleHRbXCJkb21cIl0ucm9sZVBhdGg7XG4gICAgICAgIGNvbnN0IGNhY2hlZEVsZW0gPSBjYWNoZVtjYWNoZUtleV07XG4gICAgICAgIGlmICghY2FjaGVkRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgcGF0dGVybiwgZXhwYW5kZWQgfSA9IGNhY2hlZEVsZW07XG5cbiAgICAgICAgbGV0IHBvcHVwSWQ7XG4gICAgICAgIGxldCBwb3B1cEVsZW1lbnQ7XG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9wdXBJZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcbiAgICAgICAgICAgIHBvcHVwRWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBwb3B1cElkKTtcbiAgICAgICAgICAgIGlmICghcG9wdXBFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMF9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiLCBbcG9wdXBJZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT09IFwiMS4yXCIpIHtcbiAgICAgICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcHVwSWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpO1xuICAgICAgICAgICAgcG9wdXBFbGVtZW50ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIHBvcHVwSWQpO1xuICAgICAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4yX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCIsIFtwb3B1cElkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGhhdmUgYW4gZWxlbWVudCwgc3RpY2sgaXQgaW4gdGhlIGNhY2hlIGFuZCB0aGVuIGNoZWNrIGl0cyByb2xlXG4gICAgICAgIGNhY2hlZEVsZW0ucG9wdXBJZCA9IHBvcHVwSWQ7XG4gICAgICAgIGNhY2hlZEVsZW0ucG9wdXBFbGVtZW50ID0gcG9wdXBFbGVtZW50O1xuXG5cbiAgICAgICAgaWYgKGV4cGFuZGVkICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9jb21ib2JveF9leHBhbmRlZF9oaWRkZW5cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoIWV4cGFuZGVkICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IFwiMS4wXCIpIHtcbiAgICAgICAgICAgIGlmIChleHBhbmRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMS4wX2V4cGFuZGVkXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMF9jb2xsYXBzZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMl9leHBhbmRlZFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjJfY29sbGFwc2VkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGRlYnVnX3BhdGhzOiBSdWxlID0ge1xuICAgIGlkOiBcImRlYnVnX3BhdGhzXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiREVCVUdcIl0sXG4gICAgICAgIG51bTogXCIxXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBydWxlQ29udGV4dC5zZXRBdHRyaWJ1dGUoXCJkb21QYXRoXCIsIGNvbnRleHRbXCJkb21cIl0ucm9sZVBhdGgpO1xuICAgICAgICBydWxlQ29udGV4dC5zZXRBdHRyaWJ1dGUoXCJhcmlhUGF0aFwiLCBjb250ZXh0W1wiYXJpYVwiXS5yb2xlUGF0aCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZGV0ZWN0b3JfdGFiYmFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZGV0ZWN0b3JfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJFWFRFTlNJT05TXCJdLFxuICAgICAgICBudW06IFwiMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LklORk9STUFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGllckNvbnRleHQgPSBjb250ZXh0SGllcmFyY2hpZXMuYXJpYVtjb250ZXh0SGllcmFyY2hpZXMuYXJpYS5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFtdLCBbe1xuICAgICAgICAgICAgbmFtZTogaGllckNvbnRleHQuYXR0cmlidXRlcy5uYW1lLFxuICAgICAgICAgICAgcm9sZTogaGllckNvbnRleHQucm9sZSxcbiAgICAgICAgICAgIHRhYmluZGV4OiBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBcIjBcIilcbiAgICAgICAgfV0pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZGlyX2F0dHJpYnV0ZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJkaXJfYXR0cmlidXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KltkaXJdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0VsZW1fRGlyVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJkaXJfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkludmFsaWQgdmFsdWUgdXNlZCBmb3IgdGhlICdkaXInIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidkaXInIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIFxcXCJsdHJcXFwiLCBcXFwicnRsXFxcIiwgb3IgXFxcImF1dG9cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBkaXJTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkaXJcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGRpclN0ciA9PSBcImx0clwiIHx8IGRpclN0ciA9PSBcInJ0bFwiIHx8IGRpclN0ciA9PSBcImF1dG9cIjtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTphW2hyZWZdLGRvbTphcmVhW2hyZWZdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX01lZGlhX0RvY3VtZW50VHJpZ2dlcjJcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgZmlsZSBkb3dubG9hZCBtZWNoYW5pc20gZG9lcyBub3QgY2F1c2UgYSBrZXlib2FyZCB0cmFwXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRmlsZSBkb3dubG9hZCBtZWNoYW5pc21zIHNob3VsZCBiZSBrZXlib2FyZC1vcGVyYWJsZSBhbmQgcHJlc2VydmUgcGFnZSBmb2N1cyBsb2NhdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBocmVmID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dChocmVmKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFbXCIuZG9jeFwiLCBcIi5kb2NcIiwgXCIucGRmXCIsIFwiLm9kdFwiXS5pbmNsdWRlcyhleHQpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlUG90ZW50aWFsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJkcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206KltkcmFnZ2FibGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgLy8gXCJwYXNzX2FsdGVybmF0aXZlXCI6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfdW5kcmFnZ2FibGVcIjogXCJkcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2FsdGVybmF0aXZlXCI6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBkcmFnZ2FibGUgZWxlbWVudCBtdXN0IGhhdmUgYSBcXFwic2luZ2xlIHBvaW50ZXJcXFwiIGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICAvLyBcInBhc3NfYWx0ZXJuYXRpdmVcIjogXCJUaGUgZHJhZ2dhYmxlIGVsZW1lbnQgXFxcInswfVxcXCIgaGFzIGEgXFxcInNpbmdsZSBwb2ludGVyXFxcIiBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJwYXNzX3VuZHJhZ2dhYmxlXCI6IFwiVGhlIGVsZW1lbnQgXFxcInswfVxcXCIgaXMgbm90IGRyYWdnYWJsZVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfYWx0ZXJuYXRpdmVcIjogXCJFbnN1cmUgdGhlIGRyYWdnYWJsZSBlbGVtZW50IFxcXCJ7MH1cXFwiIGhhcyBhIFxcXCJzaW5nbGUgcG9pbnRlclxcXCIgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjUuN1wiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7IFxuICAgICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBjZXJ0YWluIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJwcmVcIiwgXCJjb2RlXCIsIFwic2NyaXB0XCIsIFwibWV0YVwiXSkgIT09IG51bGwgXG4gICAgICAgICAgICB8fCBub2RlTmFtZSA9PT0gXCJib2R5XCIgfHwgbm9kZU5hbWUgPT09IFwiaHRtbFwiIClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImRyYWdnYWJsZVwiKSA9PT0gJ3RydWUnKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2FsdGVybmF0aXZlXCIsIFtub2RlTmFtZV0pO1xuICAgICAgICBlbHNlIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIikgPT09ICdmYWxzZScpIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc191bmRyYWdnYWJsZVwiLCBbbm9kZU5hbWVdKTtcbiAgICAgICAgZWxzZSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthY2Nlc3NrZXldXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FjY2Vzc2tleV9OZWVkTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBhbiBhc3NpZ25lZCAnYWNjZXNza2V5JyBhdHRyaWJ1dGUgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIGFuIGFzc2lnbmVkICdhY2Nlc3NrZXknIGF0dHJpYnV0ZSBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCIzLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvL3NraXAgaWYgdGhlIGVsZW1lbnQgaXMgdGFiYmFibGUsIGl0J3MgY292ZXJlZCBieSBvdGhlciBydWxlc1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIC8vc2tpcCB0aGUgbmF0aXZlIGVsZW1lbnQsIG1vc3RseSB0ZXh0IGVsZW1lbnRzXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgbGV0IHBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXVxuICAgICAgICBpZiAoIXBhdHRlcm5zIHx8ICFwYXR0ZXJucy5uYW1lRnJvbSkgXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gaWdub3JlIGlmIGFjY2Vzc2JsZSBuYW1lIGlzIHJlcXVpcmVkIChjaGVja2VkIGluIG90aGVyIHJ1bGVzKSBvciBwcm9oaWJpdGVkICh0ZXh0IGVsZW1lbnQpICAgIFxuICAgICAgICBpZiAocGF0dGVybnMubmFtZVJlcXVpcmVkIHx8ICFwYXR0ZXJucy5uYW1lRnJvbSB8fCBwYXR0ZXJucy5uYW1lRnJvbS5pbmNsdWRlcyhcInByb2hpYml0ZWRcIikpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NwZWNpYWwgY2FzZTogbGVnZW5kLCBhcyBhIGNoaWxkIG9mIGEgZmllbGRzZXQsIGRlbGVnYXRlIHRoZSBhY2Nlc3NrZXkgY29tbWFuZCB0byB0aGUgZmllbGQgb2YgdGhlIGZpZWxkc2V0IHdoaWNoIGlzIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXMgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50ICYmIHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZpZWxkc2V0JylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBjaGVjayBpZiBhY2Nlc3NpYmxlIG5hbWUgZXhpc3RzXG4gICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAvL2lmIChBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYWNjZXNza2V5XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0VsZW1fVW5pcXVlQWNjZXNzS2V5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCInYWNjZXNza2V5JyBhdHRyaWJ1dGUgdmFsdWUgb24gdGhlIGVsZW1lbnQgaXMgbm90IHVuaXF1ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhY2Nlc3NrZXknIGF0dHJpYnV0ZSB2YWx1ZXMgb24gZWFjaCBlbGVtZW50IG11c3QgYmUgdW5pcXVlIGZvciB0aGUgcGFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiSFRNTFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBtYXAgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWVcIiwge30pO1xuICBcbiAgICAgICAgbGV0IGtleSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFjY2Vzc2tleVwiKTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gIShrZXkgaW4gbWFwKTtcbiAgICAgICAgbWFwW2tleV0gPSB0cnVlO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5jb25zdCBERVBSRUNBVEVEX0VMRU1FTlRTID0gW1xuICAgIC8qKiBvcmlnaW5hbCAqL1xuICAgIFwiYXBwbGV0XCIsIFwiYmFzZWZvbnRcIiwgXCJjZW50ZXJcIiwgXCJkaXJcIiwgXCJmb250XCIsIFwiaXNpbmRleFwiLCBcImxpc3RpbmdcIixcbiAgICBcInBsYWludGV4dFwiLCBcInNwYWNlclwiLCBcInNcIiwgXCJzdHJpa2VcIiwgXCJ1XCIsIFwieG1wXCIsXG4gICAgLyoqIGFkZGVkIGZyb20gaHR0cHM6Ly9kZXYudzMub3JnL2h0bWw1L3BmLXN1bW1hcnkvb2Jzb2xldGUuaHRtbCAqL1xuICAgIFwiYWNyb255bVwiLCBcImZyYW1lXCIsIFwiZnJhbWVzZXRcIiwgXCJub2ZyYW1lc1wiLCBcIm5vZW1iZWRcIiwgXCJiaWdcIiwgXCJibGlua1wiLCBcIm1hcnF1ZWVcIiwgXCJ0dFwiLFxuXG5dXG5cbmNvbnN0IERFUFJFQ0FURURfSFRNTF9HTE9CQUxfQVRUUklCVVRFUyA9IFtcbiAgICAvKiogb3JpZ2luYWwgKi9cbiAgICBcImFsaWduXCIsIFwibGlua1wiLCBcImFyY2hpdmVcIiwgXCJiYWNrZ3JvdW5kXCIsIFwiYmdjb2xvclwiLCBcImNsZWFyXCIsIFwiY29kZVwiLCBcImNvbG9yXCIsXG4gICAgXCJjb21wYWN0XCIsIFwiZmFjZVwiLCBcImhzcGFjZVwiLCBcImxhbmd1YWdlXCIsIFwibGlua1wiLCBcIm5vc2hhZGVcIiwgXCJub3dyYXBcIiwgXCJvYmplY3RcIixcbiAgICBcInByb21wdFwiLCBcInN0YXJ0XCIsIFwidGV4dFwiLCBcInZlcnNpb25cIiwgXCJ2bGlua1wiLCBcInZzcGFjZVwiXG5dXG5cbmNvbnN0IERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTID0ge1xuICAgIC8qKiBvcmlnaW5hbCAqL1xuICAgIFwidGRcIjogW1wiaGVpZ2h0XCIsIFwid2lkdGhcIiwgXCJhYmJyXCIsIFwiYXhpc1wiLCBcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwiaGVpZ2h0XCIsIFwibm93cmFwXCIsIFwidmFsaWduXCIsIFwid2lkdGhcIiwgXCJhbGlnblwiLCBcImJnY29sb3JcIl0sXG4gICAgXCJ0aFwiOiBbXCJoZWlnaHRcIiwgXCJ3aWR0aFwiLCBcImFiYnJcIiwgXCJheGlzXCIsIFwiY2hhcm9mZlwiLCBcImhlaWdodFwiLCBcImJnY29sb3JcIiwgXCJhbGlnblwiLCBcIm5vd3JhcFwiLCBcImNoYXJcIiwgXCJ2YWxpZ25cIiwgXCJ3aWR0aFwiXSxcbiAgICBcImxpXCI6IFtcInR5cGVcIiwgXCJ2YWx1ZVwiLCBcInR5cGVcIl0sXG4gICAgXCJ1bFwiOiBbXCJ0eXBlXCIsIFwiY29tcGFjdFwiXSxcbiAgICBcInByZVwiOiBbXCJ3aWR0aFwiXSxcblxuICAgIC8qKiBhZGRlZCBmcm9tIGh0dHBzOi8vZGV2LnczLm9yZy9odG1sNS9wZi1zdW1tYXJ5L29ic29sZXRlLmh0bWwgKi9cbiAgICBcIm1ldGFcIjogW1wiaHR0cC1lcXVpdlwiXSxcbiAgICBcImFcIjogW1wiY2hhcnNldFwiLCBcImNvb3Jkc1wiLCBcInNoYXBlXCIsIFwicmV2XCIsIFwic2NoZW1lXCJdLFxuICAgIFwibGlua1wiOiBbXCJyZXZcIiwgXCJjaGFyc2V0XCIsIFwidGFyZ2V0XCJdLFxuICAgIFwiaW1nXCI6IFtcIm5hbWVcIiwgXCJsb25nZGVzY1wiLCBcImFsaWduXCIsIFwiaHNwYWNlXCIsIFwidnNwYWNlXCIsIFwiYm9yZGVyXCJdLFxuICAgIFwiYXJlYVwiOiBbXCJub2hyZWZcIl0sXG4gICAgXCJoZWFkXCI6IFtcInByb2ZpbGVcIl0sXG4gICAgXCJodG1sXCI6IFtcInZlcnNpb25cIl0sXG4gICAgXCJpZnJhbWVcIjogW1wibG9uZ2Rlc2NcIiwgXCJhbGlnblwiLCBcImZyYW1lYm9yZGVyXCIsIFwibWFyZ2luaGVpZ2h0XCIsIFwibWFyZ2lud2lkdGhcIiwgXCJzY3JvbGxpbmdcIl0sXG4gICAgXCJvYmplY3RcIjogW1wiYXJjaGl2ZVwiLCBcImNvZGVcIiwgXCJjb2RlYmFzZVwiLCBcImNvZGV0eXBlXCIsIFwiZGVjbGFyZVwiLCBcInN0YW5kYnlcIiwgXCJhbGlnblwiLCBcImhzcGFjZVwiLCBcInZzcGFjZVwiLCBcImJvcmRlclwiXSxcbiAgICBcInBhcmFtXCI6IFtcInR5cGVcIiwgXCJ2YWx1ZXR5cGVcIl0sXG4gICAgXCJzY3JpcHRcIjogW1wibGFuZ3VhZ2VcIl0sXG4gICAgXCJib2R5XCI6IFtcImFsaW5rXCIsIFwiYmFja2dyb3VuZFwiLCBcImJnY29sb3JcIiwgXCJsaW5rXCIsIFwidGV4dFwiLCBcInZsaW5rXCJdLFxuICAgIFwiYnJcIjogW1wiY2xlYXJcIl0sXG4gICAgXCJjYXB0aW9uXCI6IFtcImFsaWduXCJdLFxuICAgIFwiY29sXCI6IFtcImFsaWduXCIsIFwiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJ2YWxpZ25cIiwgXCJ3aWR0aFwiXSxcbiAgICBcImRpdlwiOiBbXCJhbGlnblwiXSxcbiAgICBcImRsXCI6IFtcImNvbXBhY3RcIl0sXG4gICAgXCJoclwiOiBbXCJhbGlnblwiLCBcIm5vc2hhZGVcIiwgXCJzaXplXCIsIFwid2lkdGhcIiwgXCJhbGlnblwiXSxcbiAgICBcImgyXCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDNcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoNFwiOiBbXCJhbGlnblwiXSxcbiAgICBcImg1XCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDZcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJpbnB1dFwiOiBbXCJhbGlnblwiLCBcInVzZW1hcFwiXSxcbiAgICBcImxlZ2VuZFwiOiBbXCJhbGlnblwiXSxcbiAgICBcIm1lbnVcIjogW1wiY29tcGFjdFwiXSxcbiAgICBcIm9sXCI6IFtcImNvbXBhY3RcIiwgXCJ0eXBlXCIsIFwidHlwZVwiXSxcbiAgICBcInBcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJ0YWJsZVwiOiBbXCJiZ2NvbG9yXCIsIFwiY2VsbHBhZGRpbmdcIiwgXCJjZWxsc3BhY2luZ1wiLCBcImZyYW1lXCIsIFwicnVsZXNcIiwgXCJ3aWR0aFwiLCBcImFsaWduXCJdLFxuICAgIFwidGJvZHlcIjogW1wiYWxpZ25cIiwgXCJjaGFyXCIsIFwidmFsaWduXCIsIFwiY2hhcm9mZlwiXSxcbiAgICBcInRmb290XCI6IFtcImFsaWduXCIsIFwiY2hhcm9mZlwiLCBcImNoYXJcIiwgXCJ2YWxpZ25cIl0sXG4gICAgXCJ0aGVhZFwiOiBbXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcInZhbGlnblwiLCBcImFsaWduXCJdLFxuICAgIFwidHJcIjogW1wiYWxpZ25cIiwgXCJiZ2NvbG9yXCIsIFwiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJ2YWxpZ25cIl1cbn1cblxuZnVuY3Rpb24gYXJyYXlUb0NvbnRleHRTdHIob2JqLCB0eXBlKSB7XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIG9iaikge1xuICAgICAgICBpZiAoc3RyICE9PSAnJyAmJiAhc3RyLmVuZHNXaXRoKCcsICcpKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ0hUTUxfRUxFTUVOVFMnKVxuICAgICAgICAgICAgc3RyICs9ICdkb206JyArIHByb3A7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdIVE1MX0FUVFJJQlVURVMnKVxuICAgICAgICAgICAgc3RyICs9ICdkb206KlsnICsgcHJvcCArIFwiXVwiO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBvYmpUb0NvbnRleHRTdHIob2JqLCB0eXBlOiBzdHJpbmcpIHtcbiAgICBsZXQgc3RyID0gXCJcIjtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gb2JqKSB7XG4gICAgICAgIGlmIChzdHIgIT09ICcnICYmICFzdHIuZW5kc1dpdGgoJywgJykpIHN0ciArPSBcIiwgXCI7XG4gICAgICAgIGlmICh0eXBlID09PSAnSFRNTF9FTEVNRU5UX0FUVFJJQlVURVMnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb2JqW3Byb3BdIGFzIFN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0ciAhPT0gJycgJiYgIXN0ci5lbmRzV2l0aChcIiwgXCIpKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICAgICAgICAgIHN0ciArPSAnZG9tOicgKyBwcm9wICsgJ1snICsgaXRlbSArICddJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFwcGxldCwgZG9tOmJhc2Vmb250LCBkb206Y2VudGVyLCBkb206ZGlyLCBkb206Zm9udCwgZG9tOmlzaW5kZXgsIGRvbTpsaXN0aW5nLCBkb206bWVudSwgZG9tOnBsYWludGV4dCwgZG9tOnNwYWNlciwgZG9tOnMsIGRvbTpzdHJpa2UsIGRvbTp1LCBkb206eG1wLCBkb206YWNyb255bSwgZG9tOmZyYW1lLCBkb206ZnJhbWVzZXQsIGRvbTpub2ZyYW1lcywgZG9tOm5vZW1iZWQsIGRvbTpiaWcsIGRvbTpibGluaywgZG9tOm1hcnF1ZWUsIGRvbTp0dE5hTmRvbToqW2FsaWduXSwgZG9tOipbbGlua10sIGRvbToqW2FyY2hpdmVdLCBkb206KltiYWNrZ3JvdW5kXSwgZG9tOipbYmdjb2xvcl0sIGRvbToqW2NsZWFyXSwgZG9tOipbY29kZV0sIGRvbToqW2NvbG9yXSwgZG9tOipbY29tcGFjdF0sIGRvbToqW2ZhY2VdLCBkb206Kltoc3BhY2VdLCBkb206KltsYW5ndWFnZV0sIGRvbToqW2xpbmtdLCBkb206Kltub3NoYWRlXSwgZG9tOipbbm93cmFwXSwgZG9tOipbb2JqZWN0XSwgZG9tOipbcHJvbXB0XSwgZG9tOipbc3RhcnRdLCBkb206Klt0ZXh0XSwgZG9tOipbdmVyc2lvbl0sIGRvbToqW3ZsaW5rXSwgZG9tOipbdnNwYWNlXU5hTmRvbTp0ZFtoZWlnaHRdLCBkb206dGRbd2lkdGhdLCBkb206dGRbYWJicl0sIGRvbTp0ZFtheGlzXSwgZG9tOnRkW2NoYXJdLCBkb206dGRbY2hhcm9mZl0sIGRvbTp0ZFtoZWlnaHRdLCBkb206dGRbbm93cmFwXSwgZG9tOnRkW3ZhbGlnbl0sIGRvbTp0ZFt3aWR0aF0sIGRvbTp0ZFthbGlnbl0sIGRvbTp0ZFtiZ2NvbG9yXSwgZG9tOnRoW2hlaWdodF0sIGRvbTp0aFt3aWR0aF0sIGRvbTp0aFthYmJyXSwgZG9tOnRoW2F4aXNdLCBkb206dGhbY2hhcm9mZl0sIGRvbTp0aFtoZWlnaHRdLCBkb206dGhbYmdjb2xvcl0sIGRvbTp0aFthbGlnbl0sIGRvbTp0aFtub3dyYXBdLCBkb206dGhbY2hhcl0sIGRvbTp0aFt2YWxpZ25dLCBkb206dGhbd2lkdGhdLCBkb206bGlbdHlwZV0sIGRvbTpsaVt2YWx1ZV0sIGRvbTpsaVt0eXBlXSwgZG9tOnVsW3R5cGVdLCBkb206dWxbY29tcGFjdF0sIGRvbTpwcmVbd2lkdGhdLCBkb206bWV0YVtodHRwLWVxdWl2XSwgZG9tOmFbY2hhcnNldF0sIGRvbTphW2Nvb3Jkc10sIGRvbTphW3NoYXBlXSwgZG9tOmFbcmV2XSwgZG9tOmFbc2NoZW1lXSwgZG9tOmxpbmtbcmV2XSwgZG9tOmxpbmtbY2hhcnNldF0sIGRvbTpsaW5rW3RhcmdldF0sIGRvbTppbWdbbmFtZV0sIGRvbTppbWdbbG9uZ2Rlc2NdLCBkb206aW1nW2FsaWduXSwgZG9tOmltZ1toc3BhY2VdLCBkb206aW1nW3ZzcGFjZV0sIGRvbTppbWdbYm9yZGVyXSwgZG9tOmFyZWFbbm9ocmVmXSwgZG9tOmhlYWRbcHJvZmlsZV0sIGRvbTpodG1sW3ZlcnNpb25dLCBkb206aWZyYW1lW2xvbmdkZXNjXSwgZG9tOmlmcmFtZVthbGlnbl0sIGRvbTppZnJhbWVbZnJhbWVib3JkZXJdLCBkb206aWZyYW1lW21hcmdpbmhlaWdodF0sIGRvbTppZnJhbWVbbWFyZ2lud2lkdGhdLCBkb206aWZyYW1lW3Njcm9sbGluZ10sIGRvbTpvYmplY3RbYXJjaGl2ZV0sIGRvbTpvYmplY3RbY29kZV0sIGRvbTpvYmplY3RbY29kZWJhc2VdLCBkb206b2JqZWN0W2NvZGV0eXBlXSwgZG9tOm9iamVjdFtkZWNsYXJlXSwgZG9tOm9iamVjdFtzdGFuZGJ5XSwgZG9tOm9iamVjdFthbGlnbl0sIGRvbTpvYmplY3RbaHNwYWNlXSwgZG9tOm9iamVjdFt2c3BhY2VdLCBkb206b2JqZWN0W2JvcmRlcl0sIGRvbTpwYXJhbVt0eXBlXSwgZG9tOnBhcmFtW3ZhbHVldHlwZV0sIGRvbTpzY3JpcHRbbGFuZ3VhZ2VdLCBkb206Ym9keVthbGlua10sIGRvbTpib2R5W2JhY2tncm91bmRdLCBkb206Ym9keVtiZ2NvbG9yXSwgZG9tOmJvZHlbbGlua10sIGRvbTpib2R5W3RleHRdLCBkb206Ym9keVt2bGlua10sIGRvbTpicltjbGVhcl0sIGRvbTpjYXB0aW9uW2FsaWduXSwgZG9tOmNvbFthbGlnbl0sIGRvbTpjb2xbY2hhcl0sIGRvbTpjb2xbY2hhcm9mZl0sIGRvbTpjb2xbdmFsaWduXSwgZG9tOmNvbFt3aWR0aF0sIGRvbTpkaXZbYWxpZ25dLCBkb206ZGxbY29tcGFjdF0sIGRvbTpoclthbGlnbl0sIGRvbTpocltub3NoYWRlXSwgZG9tOmhyW3NpemVdLCBkb206aHJbd2lkdGhdLCBkb206aHJbYWxpZ25dLCBkb206aDJbYWxpZ25dLCBkb206aDNbYWxpZ25dLCBkb206aDRbYWxpZ25dLCBkb206aDVbYWxpZ25dLCBkb206aDZbYWxpZ25dLCBkb206aW5wdXRbYWxpZ25dLCBkb206aW5wdXRbdXNlbWFwXSwgZG9tOmxlZ2VuZFthbGlnbl0sIGRvbTptZW51W2NvbXBhY3RdLCBkb206b2xbY29tcGFjdF0sIGRvbTpvbFt0eXBlXSwgZG9tOm9sW3R5cGVdLCBkb206cFthbGlnbl0sIGRvbTp0YWJsZVtiZ2NvbG9yXSwgZG9tOnRhYmxlW2NlbGxwYWRkaW5nXSwgZG9tOnRhYmxlW2NlbGxzcGFjaW5nXSwgZG9tOnRhYmxlW2ZyYW1lXSwgZG9tOnRhYmxlW3J1bGVzXSwgZG9tOnRhYmxlW3dpZHRoXSwgZG9tOnRhYmxlW2FsaWduXSwgZG9tOnRib2R5W2FsaWduXSwgZG9tOnRib2R5W2NoYXJdLCBkb206dGJvZHlbdmFsaWduXSwgZG9tOnRib2R5W2NoYXJvZmZdLCBkb206dGZvb3RbYWxpZ25dLCBkb206dGZvb3RbY2hhcm9mZl0sIGRvbTp0Zm9vdFtjaGFyXSwgZG9tOnRmb290W3ZhbGlnbl0sIGRvbTp0aGVhZFtjaGFyXSwgZG9tOnRoZWFkW2NoYXJvZmZdLCBkb206dGhlYWRbdmFsaWduXSwgZG9tOnRoZWFkW2FsaWduXSwgZG9tOnRyW2FsaWduXSwgZG9tOnRyW2JnY29sb3JdLCBkb206dHJbY2hhcl0sIGRvbTp0cltjaGFyb2ZmXSwgZG9tOnRyW3ZhbGlnbl1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbVwiOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2F0dHJcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbGVtX2F0dHJcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IGlzIGRlcHJlY2F0ZWQgaW4gSFRNTCA1XCIsXG4gICAgICAgICAgICBcImZhaWxfYXR0clwiOiBcIlRoZSBIVE1MIGF0dHJpYnV0ZShzKSBcXFwiezB9XFxcIiBpcyBkZXByZWNhdGVkIGluIEhUTUwgNVwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1fYXR0clwiOiBcIlRoZSBIVE1MIGF0dHJpYnV0ZShzKSBcXFwiezB9XFxcIiBpcyBkZXByZWNhdGVkIGZvciB0aGUgPHsxfT4gZWxlbWVudCBpbiBIVE1MIDVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2Ugb2Ygb2Jzb2xldGUgZmVhdHVyZXMgaWYgcG9zc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiSFRNTFwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvLyBIVE1MVW5pdCBhdXRvIGFkZHMgYSB0Ym9keVthbGlnbj1sZWZ0XSB0byB0YWJsZXMgaWYgdGJvZHkgaXMgbWlzc2luZyFcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwidGJvZHlcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbGlnblwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgd2ViY29tcG9uZW50IGVsZW1lbnQsIEhUTUwgZG9lc24ndCBkZWZpbmUgd2hhdCdzIGRlcHJlY2F0ZWRcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhIGRlcHJlY2F0ZWQgZWxlbWVudFxuICAgICAgICBpZiAoREVQUkVDQVRFRF9FTEVNRU5UUy5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZWxlbVwiLCBbbm9kZU5hbWVdKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhIGRlcHJlY2F0ZWQgSFRNTCBnbG9iYWwgYXR0cmlidXRlXG4gICAgICAgIGNvbnN0IGF0dHJzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlTmFtZXMoKTtcbiAgICAgICAgbGV0IHZpb2xhdGlvbnMgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJzKSB7XG4gICAgICAgICAgICBpZiAoREVQUkVDQVRFRF9IVE1MX0dMT0JBTF9BVFRSSUJVVEVTLmluY2x1ZGVzKGF0dHIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT09ICcnKSB2aW9sYXRpb25zICs9ICcsICc7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucyArPSBhdHRyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9hdHRyXCIsIFt2aW9sYXRpb25zXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBpdCdzIGEgZGVwcmVjYXRlZCBIVE1MIGVsZW1lbnQgJiBhdHRyaWJ1dGVcbiAgICAgICAgdmlvbGF0aW9ucyA9ICcnO1xuICAgICAgICBpZiAobm9kZU5hbWUgaW4gREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBhdHRycykge1xuICAgICAgICAgICAgICAgIGlmIChERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFU1tub2RlTmFtZV0gJiYgREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVNbbm9kZU5hbWVdLmluY2x1ZGVzKGF0dHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykgdmlvbGF0aW9ucyArPSAnLCAnO1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zICs9IGF0dHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9lbGVtX2F0dHJcIiwgW3Zpb2xhdGlvbnMsIG5vZGVOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2lkX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2lkX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbaWRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRWxlbV9VbmlxdWVJZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwicG90ZW50aWFsX2VtcHR5XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBvdGVudGlhbF9pbl91c2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2VtcHR5XCI6IFwiZWxlbWVudF9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfaW5fdXNlXCI6IFwiZWxlbWVudF9pZF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnQgJ2lkJyBhdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZW1wdHlcIjogXCJUaGUgPHswfT4gZWxlbWVudCBoYXMgdGhlIGlkIFxcXCJ7MX1cXFwiIHRoYXQgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2luX3VzZVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IGhhcyB0aGUgaWQgXFxcInsxfVxcXCIgdGhhdCBpcyBhbHJlYWR5IGluIHVzZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiSFRNTFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiM2VhMGM4XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2VtcHR5XCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfaW5fdXNlXCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCBpZCBpcyBlbXB0eSB3ZSBzaG91bGQgdHJpZ2dlciBhIHZpb2xhdGlvbiByaWdodCBhd2F5IHdpdGggb3V0IGNoZWNraW5nIFxuICAgICAgICAvLyBmb3IgdW5pcXVlbmVzcy5cbiAgICAgICAgaWYgKGlkID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChmYWxzZSwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2VtcHR5XCIsIFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBpZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgaWQpO1xuICAgICAgICBsZXQgcGFzc2VkID0gZWxlbWVudCA9PT0gcnVsZUNvbnRleHQ7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9pbl91c2VcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgZVJ1bGVDb25maWRlbmNlIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBMYW5nVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sYW5nXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmNvbnN0IHZhbGlkYXRlTGFuZyA9IChjb250ZXh0OiBSdWxlQ29udGV4dCk6IG51bWJlciA9PiB7XG4gICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8gSXQncyBva2F5IHRvIGhhdmUgYSBsYW5nPVwiXCIgaWYgbm90IG9uIGh0bWxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYW5nU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKTtcbiAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5pc0JjcDQ3KGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInhtbDpsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgb2theSB0byBoYXZlIGEgbGFuZz1cIlwiIGlmIG5vdCBvbiBodG1sXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUxhbmdVdGlsLmlzQmNwNDcobGFuZ1N0cikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGNvbnN0IGh0bWxfbGFuZ192YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJodG1sX2xhbmdfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpodG1sW2xhbmddLCBkb206aHRtbFt4bWw6bGFuZ11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImh0bWxfbGFuZ192YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkxhbmcgaGFzIGEgdmFsaWQgcHJpbWFyeSBsYW5nIGFuZCBjb25mb3JtcyB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgaW5jbHVkZSBhIHZhbGlkIHByaW1hcnkgbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiU3BlY2lmaWVkICd4bWw6bGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBjb25mb3JtIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBkZWZhdWx0IGh1bWFuIGxhbmd1YWdlIG9mIHRoZSBwYWdlIG11c3QgYmUgdmFsaWQgYW5kIHNwZWNpZmllZCBpbiBhY2NvcmRhbmNlIHdpdGggQkNQIDQ3XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcImI1YzNmOFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmYwNTFhXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9LFxuICAgICAgICAvLyBUT0RPOiBBQ1Q6IE1pc21hdGNoIGJlY2F1c2UgdGhleSBkb24ndCBjaGVjayB0aGUgaHRtbCBlbGVtZW50IGluIHRoZSBzYW1lIHJ1bGVcbiAgICAgICAgLy8gXCJkZTQ2ZTRcIjoge1xuICAgICAgICAvLyAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8yXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgLy8gfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGxldCByZWFzb25Db2RlID0gdmFsaWRhdGVMYW5nKGNvbnRleHQpO1xuICAgICAgICAvLyBUaGlzIGlzIGRvbmUgaGVyZSBpbnN0ZWFkIG9mIGluIHZhbGlkYXRlTGFuZyBzbyB0aGF0IHRoZSBnZW5IZWxwIGNvZGUgd2lsbCBwaWNrIGl0IHVwXG4gICAgICAgIGxldCByZXRBcnIgPSBbXG4gICAgICAgICAgICBSdWxlUGFzcyhcIlBhc3NfMFwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8xXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzJcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfM1wiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF80XCIpXG4gICAgICAgIF1cbiAgICAgICAgcmV0dXJuIHJldEFycltyZWFzb25Db2RlXTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2xhbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9sYW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KltsYW5nXSwgZG9tOipbeG1sOmxhbmddXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJMYW5nIGhhcyBhIHZhbGlkIHByaW1hcnkgbGFuZyBhbmQgY29uZm9ybXMgdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgY2hhbmdlIGluIGxhbmd1YWdlIG9mIHNwZWNpZmljIGNvbnRlbnQgbXVzdCBiZSB2YWxpZCBhbmQgc3BlY2lmaWVkIGluIGFjY29yZGFuY2Ugd2l0aCBCQ1AgNDdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgLy8gXCJiNWMzZjhcIjoge1xuICAgICAgICAvLyAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8yXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBcImJmMDUxYVwiOiB7XG4gICAgICAgIC8vICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gVE9ETzogQUNUOiBNaXNtYXRjaCBiZWNhdXNlIHRoZXkgZG9uJ3QgY2hlY2sgdGhlIGh0bWwgZWxlbWVudCBpbiB0aGUgc2FtZSBydWxlXG4gICAgICAgIFwiZGU0NmU0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBJZiBpdCdzIHRoZSBIVE1MIG5vZGUsIHRoYXQncyBoYW5kbGVkIGJ5IGh0bWxfbGFuZ192YWxpZFxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaHRtbFwiKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHJlYXNvbkNvZGUgPSB2YWxpZGF0ZUxhbmcoY29udGV4dCk7XG4gICAgICAgIC8vIFRoaXMgaXMgZG9uZSBoZXJlIGluc3RlYWQgb2YgaW4gdmFsaWRhdGVMYW5nIHNvIHRoYXQgdGhlIGdlbkhlbHAgY29kZSB3aWxsIHBpY2sgaXQgdXBcbiAgICAgICAgbGV0IHJldEFyciA9IFtcbiAgICAgICAgICAgIFJ1bGVQYXNzKFwiUGFzc18wXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzFcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfMlwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8zXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzRcIilcbiAgICAgICAgXVxuICAgICAgICBsZXQgcmV0VmFsID0gcmV0QXJyW3JlYXNvbkNvZGVdO1xuICAgICAgICBpZiAocmV0VmFsLnZhbHVlWzFdICE9PSBlUnVsZUNvbmZpZGVuY2UuUEFTUykge1xuICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlcmUncyBhY3R1YWxseSBjb250ZW50IG9mIHRoaXMgZWxlbWVudCAtIHNraXAgc3VidHJlZXMgdGhhdCBoYXZlIG90aGVyIGxhbmcgYXR0cmlidXRlc1xuICAgICAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5maXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihydWxlQ29udGV4dCwgZmFsc2UsIHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBudy5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50KSB8fCBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImxhbmdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gaGFzQ29udGVudCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApLyoqQVJJQU1hcHBlci5jb21wdXRlTmFtZShlbGVtZW50KS50cmltKCkubGVuZ3RoID4gMCovO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IGhhc0NvbnRlbnQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbncubm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25kYmxjbGlja10sIGRvbToqW29ubW91c2Vtb3ZlXSwgZG9tOipbb25tb3VzZWRvd25dLCBkb206Kltvbm1vdXNldXBdLCBkb206Kltvbm1vdXNlb3Zlcl0sIGRvbToqW29ubW91c2VvdXRdLCBkb206KltvbmNsaWNrXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VsZW1fRXZlbnRNb3VzZUFuZEtleVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIHRoZSA8ezB9PiBlbGVtZW50IHdpdGggbW91c2UgZXZlbnQgaGFuZGxlcihzKSAnezF9JyBoYXMgYSBjb3JyZXNwb25kaW5nIGtleWJvYXJkIGhhbmRsZXIocylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgaW50ZXJhY3RpdmUgY29udGVudCB3aXRoIG1vdXNlIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBlcXVpdmFsZW50IGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSB8fFxuICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmRibGNsaWNrXCIpICYmXG4gICAgICAgICAgICAgICAgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlZG93blwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNldXBcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2VvdmVyXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uYmx1clwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uY2xpY2tcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSB8fFxuICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImJ1dHRvblwiKSk7XG5cbiAgICAgICAgbGV0IGZhaWxlZE1vdXNlRXZlbnRzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvL3N0b3JlIGFuZCBkaXNwbGF5IGV2ZW50IG5hbWUgYW5kIG5vZGUgbmFtZSBpbiB0aGUgdG9rZW5zXG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25kYmxjbGlja1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmRibGNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2Vtb3ZlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vkb3duXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZWRvd25cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZXVwXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXVwXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2V1cFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3ZlclwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25mb2N1c1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNlb3ZlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmJsdXJcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZW91dFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEobm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJidXR0b25cIikpXG4gICAgICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiLCBbbm9kZU5hbWUsIGZhaWxlZE1vdXNlRXZlbnRzLmpvaW4oXCIsIFwiKV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENTU1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvY2tlZFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCIsXG4gICAgICAgICAgICBcImZhaWxfbG9ja2VkXCI6IFwiVGhlIGVsZW1lbnQgPHswfT4gaXMgcmVzdHJpY3RlZCB0byBlaXRoZXIgbGFuZHNjYXBlIG9yIHBvcnRyYWl0IG9yaWVudGF0aW9uIHVzaW5nIENTUyB0cmFuc2Zvcm0gcHJvcGVydHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyBzaG91bGQgbm90IGJlIHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuNFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbJ2IzM2VmZiddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCBpbnZpc2libGUgZWxlbWVudFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wic2NyaXB0XCIsIFwibWV0YVwiLCBcInRpdGxlXCJdKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIFNraXAgZWxlbWVudHMgdGhhdCBoYXZlIG5vIG1lYW5pbmdmdWwgdmlzaWJsZSBjb250ZW50IChubyB0ZXh0LCBubyBpbWcgd2l0aCBhbHQpLlxuICAgICAgICAvLyBPcmllbnRhdGlvbiBsb2NrIG9uIGEgcHVyZWx5IGRlY29yYXRpdmUgb3IgZW1wdHkgZWxlbWVudCBpcyBub3QgYSBXQ0FHIHZpb2xhdGlvblxuICAgICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbnRlbnQgd2hvc2Ugb3JpZW50YXRpb24gbWF0dGVycyB0byB0aGUgdXNlci5cbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBjYWNoZSB0aGUgb3JpZW50YXRpb24gcmVzdWx0IGZvciBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCkgYXMgYW55O1xuICAgICAgICBsZXQgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJSUFRVdGlsX01FRElBX09SSUVOVEFUSU9OX1RSQU5TRlJPTVwiLCBudWxsKTtcbiAgICAgICAgaWYgKCFvcmllbnRhdGlvblRyYW5zZm9ybXMpIHtcbiAgICAgICAgICAgIG9yaWVudGF0aW9uVHJhbnNmb3JtcyA9IENTU1V0aWwuZ2V0TWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybShkb2MpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRVdGlsX01FRElBX09SSUVOVEFUSU9OX1RSQU5TRlJPTVwiLCBvcmllbnRhdGlvblRyYW5zZm9ybXMpO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gZmluZCBpZiB0aGUgZWxlbWVudCBtYXRjaGVzIG9yaWVudGF0aW9uIHNlbGVjdG9yKHMpXG4gICAgICAgIGxldCBtZWRpYV90cmFuc2Zvcm1zID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKG9yaWVudGF0aW9uVHJhbnNmb3JtcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV0pLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV1bdGFnXSkubGVuZ3RoID4gMCAmJiBDU1NVdGlsLnNlbGVjdG9yTWF0Y2hlc0VsZW0ocnVsZUNvbnRleHQsIHRhZykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10udHJhbnNmb3JtKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3Jtcy5wdXNoKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10udHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3Jtcy5wdXNoKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10pO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBubyBtYXRjaCwgdGhlIGVsZW1lbnQgaXMgbm90IGluIG1lZGlhIG9yaWVudGF0aW9uIHRyYW5zZm9ybVxuICAgICAgICBpZiAobWVkaWFfdHJhbnNmb3Jtcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtZWRpYV90cmFuc2Zvcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWVkaWFfdHJhbnNmb3JtID0gbWVkaWFfdHJhbnNmb3Jtc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVkaWFfdHJhbnNmb3JtID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICBmb3IodmFyIGtleSBpbiBtZWRpYV90cmFuc2Zvcm0pXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhX3RyYW5zZm9ybSA9IGtleSArXCIoXCIgKyBtZWRpYV90cmFuc2Zvcm1ba2V5XSArXCIpXCI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjb250YWluc1JvdGF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICBbJ3JvdGF0ZScsICdyb3RhdGUzZCcsICdyb3RhdGVaJywgJ21hdHJpeCcsICdtYXRyaXgzZCddLmZvckVhY2gocm90YXRpb24gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtZWRpYV90cmFuc2Zvcm0uaW5jbHVkZXMocm90YXRpb24pKSBjb250YWluc1JvdGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gbm8gcm90YXRpb24gdHJhbnNmb3JtLCBza2lwXG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUm90YXRpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgZGVncmVlID0gQ1NTVXRpbC5nZXRSb3RhdGlvbkRlZ3JlZShtZWRpYV90cmFuc2Zvcm0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBubyBvciAzNjBuIGRlZ3JlZSByb3RhdGlvbiBcbiAgICAgICAgICAgIGlmIChkZWdyZWUgPT09IDApIHsgXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogY2FsY3VsYXRlIHRoZSBvcmlnaW5hbCBwYWdlIHJvdGF0aW9uIHRyYW5zZm9ybWF0aW9uLCBleGFtcGxlXG4gICAgICAgICAgICAgKiAgaHRtbCB7IHRyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7IH1cbiAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBkZWZpbmVkU3R5bGUgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQsIFtcInRyYW5zZm9ybVwiXSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqIGNvbXBlbnNhdGUgdGhlIG1lZGlhIG9yaWVudGF0aW9uIHdpdGggdGhlIHBhZ2Ugb3JpZW50YXRpb25cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKGRlZmluZWRTdHlsZVsndHJhbnNmb3JtJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlX2RlZ3JlZSA9IENTU1V0aWwuZ2V0Um90YXRpb25EZWdyZWUoZGVmaW5lZFN0eWxlWyd0cmFuc2Zvcm0nXSk7XG4gICAgICAgICAgICAgICAgLy8gcm90YXRlIGlzIGFkZGl0aXZlXG4gICAgICAgICAgICAgICAgZGVncmVlICs9IHBhZ2VfZGVncmVlO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gMTgwwrAgcm90YXRpb24gaXMgYSB2ZXJ0aWNhbCBmbGlwIOKAlCBpdCBkb2VzIG5vdCBzd2FwIHBvcnRyYWl0IGFuZCBsYW5kc2NhcGUsXG4gICAgICAgICAgICAvLyBzbyBpdCBkb2VzIG5vdCBsb2NrIG9yaWVudGF0aW9uIGluIHRoZSBXQ0FHIDEuMy40IHNlbnNlLlxuICAgICAgICAgICAgLy8gMzYwwrAgKGZ1bGwgdHVybikgaXMgYWxzbyBub3QgYSBsb2NrIChhbHJlYWR5IG5vcm1hbGlzZWQgdG8gMCBhYm92ZSkuXG4gICAgICAgICAgICAvLyBBbGxvdyAxwrAgZmxvYXRpbmctcG9pbnQgdG9sZXJhbmNlIGFyb3VuZCBib3RoIDDCsCBhbmQgMTgwwrAuXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpc2VkID0gZGVncmVlICUgMTgwO1xuICAgICAgICAgICAgaWYgKG5vcm1hbGlzZWQgPD0gMSB8fCBub3JtYWxpc2VkID49IDE3OSlcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9sb2NrZWRcIiwgW25vZGVOYW1lXSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMCkgIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7IFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc190YWJiYWJsZVwiOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfaW50ZXJhY3RpdmVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcm9sbGFibGUgZWxlbWVudHMgc2hvdWxkIGJlIHRhYmJhYmxlIG9yIGNvbnRhaW4gdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwYXNzX3RhYmJhYmxlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2ludGVyYWN0aXZlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBoYXMgdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJUaGUgc2Nyb2xsYWJsZSBlbGVtZW50IDx7MH0+IHdpdGggbm9uLWludGVyYWN0aXZlIGNvbnRlbnQgaXMgbm90IHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogZGVwcmVjYXRlZCBvbiA2LzEwLzIwMjUgZHVlIHRvIEJyb3dzZXIgc3VwcG9ydCBmb3IgYXV0by1mb2N1cyBvZiBhIHNjcm9sbGFibGUgZWxlbWVudCBcbiAgICAgKiBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLCovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW1wiMHNzdzlrXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImlmcmFtZVwiLCBcInN2Z1wiLCBcInNjcmlwdFwiLCBcIm1ldGFcIiwgXCJzdHlsZVwiXSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgaWYgbm8gdmlzaWJsZSBjb250ZW50XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50J3MgbmF2aWdhdGlvbiBpcyBjb250cm9sbGVkIG9yIG93bmVkIGJ5IGFub3RoZXIgZWxlbWVudFxuICAgICAgICBpZiAoQXJpYVV0aWwuaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHNjcm9sbGFibGUgb3IgY29udGVudCB3aXRob3V0aW5nIG5lZWRpbmcgYSBzY3JvbGxcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzRWxlbWVudFNjcm9sbGFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gcGFzcyBpZiBlbGVtZW50IGlzIHRhYmJhYmxlXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc190YWJiYWJsZVwiKTtcblxuICAgICAgICAvLyBjaGVjayBpZiBlbGVtZW50IGNvbnRlbnQgaXMgdGFiYmFibGVcbiAgICAgICAgY29uc3QgY291bnQgPSBDb21tb25VdGlsLmdldFRhYmJhYmxlQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY291bnQgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19pbnRlcmFjdGl2ZVwiKTtcblxuICAgICAgICAvLyBpZ25vcmUgaW4gRmlyZWZveCBpZiBubyB0YWJpbmRleCBhdCBhbGwgKG5vdCB0ZXN0ZWQgaW4gZW1iZWRkZWQgb3IgYW55IHNpbXVsYXRvcilcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJGaXJlZm94XCIpID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX3Njcm9sbGFibGVcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKTsgICAgXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OlwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX3JvbGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3ZhbGlkX3JvbGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBoYXMgYSB3aWRnZXQgcm9sZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfcm9sZVwiOiBcIlRoZSB0YWJiYWJsZSBlbGVtZW50J3Mgcm9sZSAnezB9JyBpcyBub3QgYSB3aWRnZXQgcm9sZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3ZhbGlkX3JvbGVcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyB0YWJiYWJsZSBieSBkZWZhdWx0IHdpdGggb3Igd2l0aG91dCB0YWJpbmRleCwgbGV0IHRoZSBvdGhlciBydWxlcyAoc3VjaCBhcyB3aWRnZXRfdGFiYmFibGVfc2luZ2xlKSB0byBoYW5kbGUgaXRcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIENvbW1vblV0aWwudGFiVGFnTWFwICkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gQ29tbW9uVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAodmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlOiBubyB0YWJpbmRleCBvciB0YWJpbmRleCA8IDBcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50J3MgbmF2aWdhdGlvbiBpcyBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgc3VjaCBhcyBjb21ib2JveFxuICAgICAgICBpZiAoQXJpYVV0aWwuaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc0VsZW1lbnRTY3JvbGxhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgICBcblxuICAgICAgICAvLyBlbGVtZW50cyB3aG9zZSByb2xlcyBhbGxvdyBubyBkZXNjZW5kYW50cyB0aGF0IGFyZSBpbnRlcmFjdGl2ZSBvciB3aXRoIGEgdGFiaW5kZXggPj0gMCBcbiAgICAgICAgLy8gdGhpcyBjYXNlIHNob3VsZCBiZSBoYW5kbGVkIGluIHdpZGdldF90YWJiYWJsZV9zaW5nbGUgYW5kIGFyaWFfY2hpbGRfdGFiYmFibGVcbiAgICAgICAgY29uc3Qgcm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGQgPVtcImJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiaW1nXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInN3aXRjaFwiLCBcInRhYlwiXTtcblxuICAgICAgICBjb25zdCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYXJlbnRfcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQgYXMgRWxlbWVudCk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIHBhcmVudCByb2xlIGlzIGluIHJvbGVzX25vX2ludGVyYWN0aXZlX2NoaWxkXG4gICAgICAgIGlmIChyb2xlc19ub19pbnRlcmFjdGl2ZV9jaGlsZC5pbmNsdWRlcyhwYXJlbnRfcm9sZSkpXG4gICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXJvbGUpIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub192YWxpZF9yb2xlXCIpOyBcbiAgICAgICAgLy8gaWdub3JlICdhcHBsaWNhdGlvbicgcm9sZSB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIGZvY3VzYWJsZSBlbGVtZW50cyB0aGF0IGRvIG5vdCBmb2xsb3cgYSBzdGFuZGFyZCBpbnRlcmFjdGlvbiBwYXR0ZXJuIHN1cHBvcnRlZCBieSBhIHdpZGdldCByb2xlOmh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIzL1BSLVdBSS1BUklBLTEuMi0yMDIzMDMyOC8jYXBwbGljYXRpb24gXG4gICAgICAgIGlmIChyb2xlID09PSBcImFwcGxpY2F0aW9uXCIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2U6IHRhYmluZGV4ID49IDAgdG8gZXhhbWluZSB3aGV0aGVyIGEgd2lkZ2V0IHJvbGUgaXMgc2V0dXAgb3Igbm90IFxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgcm9sZXMgaXMgYSB3aWRnZXQgdHlwZVxuICAgICAgICAvLyBSb3cgaXMgd2VpcmQuIEl0J3Mgc3RydWN0dXJlLCBidXQgY2FuIGFsc28gYmUgd2lkZ2V0XG4gICAgICAgIC8vIEZvY3VzYWJsZSBzZXBhcmF0b3JzIGFyZSB3aWRnZXRzXG4gICAgICAgIGlmIChyb2xlID09PSBcInJvd1wiIHx8IHJvbGUgPT09IFwic2VwYXJhdG9yXCIgfHwgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLnJvbGVUeXBlID09PSAnd2lkZ2V0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRfcm9sZVwiLCBbcm9sZV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgQ29sb3JVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29sb3JVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX29ic2N1cmVkXCI6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIGFuIGVsZW1lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGlzIG5vdCBlbnRpcmVseSBjb3ZlcmVkIGJ5IG90aGVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IGlzIG5vdCBlbnRpcmVseSBjb3ZlcmVkIGJ5IG90aGVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX29ic2N1cmVkXCI6IFwiQ29uZmlybSB0aGF0IHdoZW4gdGhlIGVsZW1lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGlzIG5vdCBjb3ZlcmVkIG9yLCBpZiBjb3ZlcmVkIGJ5IHVzZXIgYWN0aW9uLCBjYW4gYmUgdW5jb3ZlcmVkIHdpdGhvdXQgbW92aW5nIGZvY3VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMi40LjExXCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vIEVhcmx5IGV4aXQ6IGNoZWNrIHZpc2liaWxpdHkgYW5kIHRhYmJhYmlsaXR5IGZpcnN0XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgIFxuICAgICAgICAvLyBFYXJseSBleGl0OiBpZ25vcmUgY2VydGFpbiBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pICE9PSBudWxsXG4gICAgICAgICAgICB8fCBub2RlTmFtZSA9PT0gXCJib2R5XCIgfHwgbm9kZU5hbWUgPT09IFwiaHRtbFwiKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIGlmICghd2luKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIFJldXNlIHNpbmdsZSBET01NYXBwZXIgaW5zdGFuY2VcbiAgICAgICAgY29uc3QgbWFwcGVyOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVhcmx5IGV4aXQ6IGJvdW5kcyBub3QgYXZhaWxhYmxlIG9yIGVsZW1lbnQgaGFzIG5vIGRpbWVuc2lvbnNcbiAgICAgICAgaWYgKCFib3VuZHMgfHwgYm91bmRzLmhlaWdodCA9PT0gMCB8fCBib3VuZHMud2lkdGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFjU3R5bGUpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gUGFyc2Ugei1pbmRleCBvbmNlIGFuZCBjYWNoZVxuICAgICAgICBjb25zdCB6aW5kZXggPSBwYXJzZUludChjU3R5bGUuekluZGV4ID09PSAnYXV0bycgfHwgIWNTdHlsZS56SW5kZXggPyAnMCcgOiBjU3R5bGUuekluZGV4KTtcbiAgICAgICAgXG4gICAgICAgIC8vIE1vcmUgc3BlY2lmaWMgc2VsZWN0b3IgdG8gcmVkdWNlIGl0ZXJhdGlvblxuICAgICAgICBjb25zdCBlbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdib2R5ICo6bm90KHNjcmlwdCk6bm90KHN0eWxlKTpub3QobWV0YSk6bm90KGxpbmspJyk7XG4gICAgICAgIGlmICghZWxlbXMgfHwgZWxlbXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICBcbiAgICAgICAgbGV0IGJlZm9yZSA9IHRydWU7XG4gICAgICAgIGNvbnN0IGJvdW5kc1JpZ2h0ID0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGg7XG4gICAgICAgIGNvbnN0IGJvdW5kc0JvdHRvbSA9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0O1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG9ic2N1cmluZyBlbGVtZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gZWxlbXNbaV07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBhcmUgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICAgICAgICAgKiBJZiB0d28gZWxlbWVudHMgb3ZlcmxhcCBhbmQgei1pbmRleCBhcmUgbm90IGRlZmluZWQsIHRoZW4gdGhlIG5vZGVcbiAgICAgICAgICAgICAqIHJlbmRlcmVkIGVhcmxpZXIgd2lsbCBiZSBvdmVybGFpZCBieSB0aGUgbm9kZSByZW5kZXJlZCBsYXRlci5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLy8gVXNlIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHRvIGNoZWNrIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcHNcbiAgICAgICAgICAgIC8vIE5vdGU6IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHJldHVybnMgMCB3aGVuIGNvbXBhcmluZyBhIG5vZGUgdG8gaXRzZWxmXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHJ1bGVDb250ZXh0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsZW0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkgKDE2KTogZWxlbSBpcyBjb250YWluZWQgYnkgcnVsZUNvbnRleHRcbiAgICAgICAgICAgIC8vIEFsc28gaGFuZGxlIHNlbGYtY29tcGFyaXNvbiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IDAgfHwgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG5leHQgbm9kZSBpbiBlbGVtcyB3aWxsIGJlIGFmdGVyIHRoZSB0YXJnZXQgbm9kZSAocnVsZUNvbnRleHQpXG4gICAgICAgICAgICAgICAgYmVmb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TICg4KTogZWxlbSBjb250YWlucyBydWxlQ29udGV4dFxuICAgICAgICAgICAgLy8gU2tpcCBpZiBlbGVtZW50IGNvbnRhaW5zIHJ1bGVDb250ZXh0IG9yIGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKGVsZW0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTa2lwIGlmIG5vIGJvdW5kcyBvciB6ZXJvIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIGlmICghYm5kcyB8fCBibmRzLmhlaWdodCA9PT0gMCB8fCBibmRzLndpZHRoID09PSAwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBRdWljayBib3VuZHMgY2hlY2s6IGRvZXMgZWxlbSBjb21wbGV0ZWx5IGNvdmVyIHJ1bGVDb250ZXh0P1xuICAgICAgICAgICAgaWYgKGJuZHMudG9wID4gYm91bmRzLnRvcCB8fCBibmRzLmxlZnQgPiBib3VuZHMubGVmdClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYm5kc1JpZ2h0ID0gYm5kcy5sZWZ0ICsgYm5kcy53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGJuZHNCb3R0b20gPSBibmRzLnRvcCArIGJuZHMuaGVpZ2h0O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoYm5kc1JpZ2h0IDwgYm91bmRzUmlnaHQgfHwgYm5kc0JvdHRvbSA8IGJvdW5kc0JvdHRvbSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2hlY2sgei1pbmRleCB0byBkZXRlcm1pbmUgaWYgZWxlbSBvYnNjdXJlcyBydWxlQ29udGV4dFxuICAgICAgICAgICAgY29uc3QgelN0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBpZiAoIXpTdHlsZSkgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGVsZW1aaW5kZXggPSBwYXJzZUludCh6U3R5bGUuekluZGV4ID09PSAnYXV0bycgfHwgIXpTdHlsZS56SW5kZXggfHwgaXNOYU4oTnVtYmVyKHpTdHlsZS56SW5kZXgpKSA/ICcwJyA6IHpTdHlsZS56SW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBiZWZvcmUgcnVsZUNvbnRleHQgaW4gRE9NIG9yZGVyLCBlbGVtIG11c3QgaGF2ZSBoaWdoZXIgei1pbmRleCB0byBvYnNjdXJlXG4gICAgICAgICAgICAvLyBJZiBhZnRlciBydWxlQ29udGV4dCBpbiBET00gb3JkZXIsIGVsZW0gY2FuIG9ic2N1cmUgd2l0aCBlcXVhbCBvciBoaWdoZXIgei1pbmRleFxuICAgICAgICAgICAgaWYgKChiZWZvcmUgJiYgZWxlbVppbmRleCA+IHppbmRleCkgfHwgKCFiZWZvcmUgJiYgZWxlbVppbmRleCA+PSB6aW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZWxlbWVudCBoYXMgb3BhcXVlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICBsZXQgaGFzT3BhcXVlQmFja2dyb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh6U3R5bGUuYmFja2dyb3VuZCAmJiB6U3R5bGUuYmFja2dyb3VuZCAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnQ29sb3IgPSBDb2xvclV0aWwuQ29sb3IoelN0eWxlLmJhY2tncm91bmQpO1xuICAgICAgICAgICAgICAgICAgICBoYXNPcGFxdWVCYWNrZ3JvdW5kID0gYmdDb2xvciAmJiAoYmdDb2xvci5hbHBoYSA9PT0gdW5kZWZpbmVkIHx8IGJnQ29sb3IuYWxwaGEgPiAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPcGFxdWVCYWNrZ3JvdW5kICYmIHpTdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdDb2xvciA9IENvbG9yVXRpbC5Db2xvcih6U3R5bGUuYmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzT3BhcXVlQmFja2dyb3VuZCA9IGJnQ29sb3IgJiYgKGJnQ29sb3IuYWxwaGEgPT09IHVuZGVmaW5lZCB8fCBiZ0NvbG9yLmFscGhhID4gMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaGFzIG5vIGNvbnRlbnQgYW5kIG5vIG9wYXF1ZSBiYWNrZ3JvdW5kLCBza2lwIGl0XG4gICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtKSAmJiAhaGFzT3BhcXVlQmFja2dyb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb2JzY3VyZWRcIiwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X3RhYmJhYmxlX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3Zpc2libGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgdGFiYmFibGUgZWxlbWVudCBzaG91bGQgYmUgdmlzaWJsZSBvbiB0aGUgc2NyZWVuIHdoZW4gaXQgaGFzIGtleWJvYXJkIGZvY3VzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBpcyB2aXNpYmxlIG9uIHRoZSBzY3JlZW5cIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3Zpc2libGVcIjogXCJDb25maXJtIHRoZSBlbGVtZW50IHNob3VsZCBiZSB0YWJiYWJsZSBhbmQgaWYgc28sIGl0IGJlY29tZXMgdmlzaWJsZSB3aGVuIGl0IGhhcyBrZXlib2FyZCBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuNC43XCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IG1hcHBlciA6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgYWxsIG5lZWRlZCBzdHlsZXMgaW4gYSBzaW5nbGUgcGFzcyB0aHJvdWdoIHN0eWxlc2hlZXRzXG4gICAgICAgIGNvbnN0IGFsbFN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKHJ1bGVDb250ZXh0LCBbXCJwb3NpdGlvblwiLCBcImNsaXBcIl0sIFtcIlwiLCBcIjpmb2N1c1wiXSk7XG4gICAgICAgIGNvbnN0IGRlZmluZWRfc3R5bGVzID0gYWxsU3R5bGVzW1wiXCJdO1xuICAgICAgICBjb25zdCBvbmZvY3VzX3N0eWxlcyA9IGFsbFN0eWxlc1tcIjpmb2N1c1wiXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKGJvdW5kc1snaGVpZ2h0J10gPT09IDAgfHwgYm91bmRzWyd3aWR0aCddID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdmlzaWJsZVwiLCBbXSk7XG5cbiAgICAgICAgaWYgKGRlZmluZWRfc3R5bGVzWydwb3NpdGlvbiddPT09J2Fic29sdXRlJyAmJiBkZWZpbmVkX3N0eWxlc1snY2xpcCddICYmIGRlZmluZWRfc3R5bGVzWydjbGlwJ10ucmVwbGFjZUFsbCgnICcsICcnKT09PSdyZWN0KDBweCwwcHgsMHB4LDBweCknXG4gICAgICAgICAgICAmJiAhb25mb2N1c19zdHlsZXNbJ2NsaXAnXSkge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBub3RlIHRoYXQgQSB1c2VyIGNhbiBzZWxlY3QgYSBjaGVja2JveCBhbmQgcmFkaW8gYnV0dG9uIGJ5IHNlbGVjdGluZyB0aGUgYnV0dG9uIG9yIHRoZSBsYWJlbCB0ZXh0LlxuICAgICAgICAgICAgICogV2hlbiBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbiBpcyBjbGlwcGVkIHRvIDAgc2l6ZSwgaXQgaXMgc3RpbGwgYXZhaWxhYmxlIHRvIGEga2V5Ym9hcmQgb3IgYSBzY3JlZW4gcmVhZGVyLlxuICAgICAgICAgICAgICogVGhlIHJ1bGUgc2hvdWxkIGJlIHBhc3NlZCBpZiB0aGUgbGFiZWwgdGV4dCBleGlzdHMgYW5kIHRoZSBidXR0b24gb24tZm9jdXMgc3R5bGUgaXMgZGVmaW5lZCBieSB0aGUgdXNlcixcbiAgICAgICAgICAgICAqIHdoaWNoIGxpa2VseSBpbmN1cnMgdGhlIGNoYW5nZXMgb2YgdGhlIGxhYmVsIHN0eWxlLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgndHlwZScpPT09J2NoZWNrYm94JyB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKT09PSdyYWRpbycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobGFiZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCBhZGRpdGlvbmFsIHBzZXVkby1jbGFzcyBzdHlsZXMgKHJldXNlIG9uZm9jdXNfc3R5bGVzIGZyb20gbGluZSA2MClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvU3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzTXVsdGlwbGUocnVsZUNvbnRleHQsIG51bGwsIFtcIjpmb2N1cy12aXNpYmxlXCIsIFwiOmZvY3VzLXdpdGhpblwiLCBcIjpjaGVja2VkXCIsIFwiOmZvY3VzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNfdmlzaWJsZV9zdHlsZXMgPSBwc2V1ZG9TdHlsZXNbXCI6Zm9jdXMtdmlzaWJsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNfd2l0aGluX3N0eWxlcyA9IHBzZXVkb1N0eWxlc1tcIjpmb2N1cy13aXRoaW5cIl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRfc3R5bGVzID0gcHNldWRvU3R5bGVzW1wiOmNoZWNrZWRcIl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uZm9jdXNfc3R5bGVzID0gcHNldWRvU3R5bGVzW1wiOmZvY3VzXCJdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbmZvY3VzX3N0eWxlcyB8fCBmb2N1c192aXNpYmxlX3N0eWxlcyB8fCBmb2N1c193aXRoaW5fc3R5bGVzIHx8IGNoZWNrZWRfc3R5bGVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3VuZHNbJ3RvcCddID49IDAgJiYgYm91bmRzWydsZWZ0J10gPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkZWZhdWx0X3N0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgbGV0IHRvcCA9IGJvdW5kc1sndG9wJ107XG4gICAgICAgIGxldCBsZWZ0ID0gYm91bmRzWydsZWZ0J107XG4gICAgICAgXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvbmZvY3VzX3N0eWxlcykubGVuZ3RoID09PSAwICkge1xuICAgICAgICAgICAgLy8gbm8gb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2UsIGJ1dCBjb3VsZCBiZSBjaGFuZ2VkIGZyb20ganNcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gd2l0aCBvbmZvY3VzIHBvc2l0aW9uIGNoYW5nZVxuICAgICAgICAgICAgdmFyIHBvc2l0aW9ucyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ3RvcCddICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbnMuaW5jbHVkZXMob25mb2N1c19zdHlsZXNbJ3Bvc2l0aW9uJ10pIHx8ICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ3Bvc2l0aW9uJ10gPT09ICd1bmRlZmluZWQnICYmIHBvc2l0aW9ucy5pbmNsdWRlcyhkZWZhdWx0X3N0eWxlc1sncG9zaXRpb24nXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IG9uZm9jdXNfc3R5bGVzWyd0b3AnXS5yZXBsYWNlKC9cXEQvZywnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBvc2l0aW9uIGlzIHVuZGVmaW5lZCBhbmQgdGhlIHBhcmVudCdzIHBvc2l0aW9uIGlzICdyZWxhdGl2ZSdcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydsZWZ0J10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9ucy5pbmNsdWRlcyhvbmZvY3VzX3N0eWxlc1sncG9zaXRpb24nXSkgfHwgKHR5cGVvZiBvbmZvY3VzX3N0eWxlc1sncG9zaXRpb24nXSA9PT0gJ3VuZGVmaW5lZCcgJiYgcG9zaXRpb25zLmluY2x1ZGVzKGRlZmF1bHRfc3R5bGVzWydwb3NpdGlvbiddKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG9uZm9jdXNfc3R5bGVzWydsZWZ0J10ucmVwbGFjZSgvXFxEL2csJycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBpcyB1bmRlZmluZWQgYW5kIHRoZSBwYXJlbnQncyBwb3NpdGlvbiBpcyAncmVsYXRpdmUnXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBOdW1iZXIuTUlOX1ZBTFVFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRvcCA+PSAwICYmIGxlZnQgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVtYmVkX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZW1iZWRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmVtYmVkXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRW1iZWRfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSA8ZW1iZWQ+IGVsZW1lbnQgaGFzIGFsdGVybmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm92aWRlIGFsdGVybmF0aXZlIGNvbnRlbnQgZm9yIDxlbWJlZD4gZWxlbWVudHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVtb3RpY29uc19hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImVtb3RpY29uc19hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RleHRfRW1vdGljb25zXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVtb3RpY29uc19hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbW90aWNvbnNfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZW1vdGljb25zX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGVtb3RpY29ucyBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVtb3RpY29ucyBtdXN0IGhhdmUgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZWlyIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBEZWNpc2lvbiBpbiBwbGFubmluZyA5LzcvMjMgdGhhdCB0aGlzIHJ1bGUgY2F1c2VzIG1vcmUgcmV2aWV3cyB0aGF0IHdlIHNlZSBhY3R1YWwgcHJvYmxlbXMgaW4gY29udGVudCwgc28gdHVybiB0aGVzZSBydWxlcyBvZmZcbiAgICBcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgZW1vdGljb25zOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIjotKVwiLCBcIjopXCIsIFwiOm8pXCIsIFwiOl1cIiwgXCI6M1wiLCBcIjpjKVwiLCBcIjo+XCIsIFwiPV1cIiwgXCI4KVwiLCBcIj0pXCIsIFwiOkRcIiwgXCJDOlwiLFxuICAgICAgICAgICAgICAgICAgICBcIjotRFwiLCBcIjpEXCIsIFwiOERcIiwgXCJYRFwiLCBcIj1EXCIsIFwiPTNcIiwgXCI8PTNcIiwgXCI8PThcIiwgXCItLSEtLVwiLCBcIjotKFwiLCBcIjooXCIsIFwiOmNcIiwgXCI6PFwiLCBcIjpbXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiRDpcIiwgXCJEOFwiLCBcIkQ7XCIsIFwiRD1cIiwgXCJEWFwiLCBcInYudlwiLCBcIjotOVwiLCBcIjstKVwiLCBcIjspXCIsIFwiKilcIiwgXCI7XVwiLCBcIjtEXCIsIFwiOi1QXCIsIFwiOlBcIixcbiAgICAgICAgICAgICAgICAgICAgXCI6LXBcIiwgXCI6cFwiLCBcIj1wXCIsIFwiOi3DnlwiLCBcIjrDnlwiLCBcIjotYlwiLCBcIjpiXCIsIFwiOi1PXCIsIFwiOk9cIiwgXCJPX09cIiwgXCJvX29cIiwgXCI4T1wiLCBcIk93T1wiLCBcIk8tT1wiLFxuICAgICAgICAgICAgICAgICAgICBcIjBfb1wiLCBcIk9fb1wiLCBcIk8zT1wiLCBcIm8wb8KgO29fbztcIiwgXCJvLi4ub1wiLCBcIjB3MFwiLCBcIjotL1wiLCBcIjovXCIsIFwiOlxcXFxcIiwgXCI9L1wiLCBcIj1cXFxcXCIsIFwiOlNcIiwgXCI6fFwiLFxuICAgICAgICAgICAgICAgICAgICBcImQ6LSlcIiwgXCJxQi0pXCIsIFwiOil+XCIsIFwiOi0pPi4uLi5cIiwgXCI6LVhcIiwgXCI6WFwiLCBcIjotI1wiLCBcIjojXCIsIFwiTzotKVwiLCBcIjA6M1wiLCBcIk86KVwiLCBcIjonKFwiLCBcIjsqKFwiLFxuICAgICAgICAgICAgICAgICAgICBcIlRfVFwiLCBcIlRUX1RUXCIsIFwiVC5UXCIsIFwiOi0qXCIsIFwiOipcIiwgXCJebylcIiwgXCI+OilcIiwgXCI+OylcIiwgXCI+Oi0pXCIsIFwiQilcIiwgXCJCLSlcIiwgXCI4KVwiLCBcIjgtKVwiLFxuICAgICAgICAgICAgICAgICAgICBcIl4+Lj5eXCIsIFwiXjwuPF5cIiwgXCJePl8+XlwiLCBcIl48XzxeXCIsIFwiRDo8XCIsIFwiPjooXCIsIFwiRC06PFwiLCBcIj46LShcIiwgXCI6LUBbMV1cIiwgXCI7KFwiLCBcImBfwrRcIiwgXCJEPFwiLFxuICAgICAgICAgICAgICAgICAgICBcIjwzXCIsIFwiPDMzM1wiLCBcIj1eX149XCIsIFwiPT4uPj1cIiwgXCI9PF88PVwiLCBcIj0+Ljw9XCIsIFwiXFxcXCwsL1wiLCBcIlxcXFxtL1wiLCBcIlxcXFxtL1xcXFw+LjwvXFxcXG0vXCIsIFwiXFxcXG8vXCIsIFwiXFxcXG8gby9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvL1xcXFxvXCIsIFwiOiZcIiwgXCI6dVwiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZW1vdGljb25zID0gdmFsaWRhdGVQYXJhbXMuZW1vdGljb25zLnZhbHVlO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHRlc3RUZXh0ID0gXCJcIjtcblxuICAgICAgICBsZXQgd2Fsa05vZGU6IE5vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICB0ZXN0VGV4dCArPSBcIiBcIiArIHdhbGtOb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdFRleHQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBwYXNzZWQgJiYgaiA8IGVtb3RpY29ucy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGxldCBlbW90SWR4ID0gdGVzdFRleHQuaW5kZXhPZihlbW90aWNvbnNbal0pO1xuICAgICAgICAgICAgICAgIGxldCBlTG5ndGggPSBlbW90aWNvbnNbal0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgZW1vdElkeCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQYXNzZXMgaWY6IHRoZSBlbW90aWNvbiBpcyBub3QgcHJlY2VkZWQgYnkgd2hpdGVzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIGVtb3RpY29uIGlzIG5vdCBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIHVubGVzcyBpdCdzIHB1bmN0dWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAvLyBvciBpdCdzIGluIGEgcHJlLCBjb2RlLCBvciBzY3JpcHRcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIChlbW90SWR4ID4gMCAmJiAhL1xccy8udGVzdCh0ZXN0VGV4dC5zdWJzdHJpbmcoZW1vdElkeCAtIDEsIGVtb3RJZHgpKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChlbW90SWR4IDwgdGVzdFRleHQubGVuZ3RoIC0gZUxuZ3RoICYmICEvXFxzLy50ZXN0KHRlc3RUZXh0LnN1YnN0cmluZyhlbW90SWR4ICsgZUxuZ3RoLCBlbW90SWR4ICsgZUxuZ3RoICsgMSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIS9bLiwhJ1wiP10vLnRlc3QodGVzdFRleHQuc3Vic3RyaW5nKGVtb3RJZHggKyBlTG5ndGgsIGVtb3RJZHggKyBlTG5ndGggKyAxKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IHVzYWdlIG9mICg6IHN0dWZmIDopIHNpbmNlIHRoaXMgaXMgYSBjb21tZW50IGluIHNvbWUgbGFuZ3VhZ2VzXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKGVtb3RpY29uc1tqXSA9PSBcIjopXCIgfHwgZW1vdGljb25zW2pdID09IFwiKDpcIikgJiYgL1xcKFxcOi4qXFw6XFwpLy50ZXN0KHRlc3RUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKGVtb3RpY29uc1tqXSA9PSBcIjspXCIgfHwgZW1vdGljb25zW2pdID09IFwiKDtcIikgJiYgL1xcKFxcOy4qXFw7XFwpLy50ZXN0KHRlc3RUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIGVtb3RJZHggPSB0ZXN0VGV4dC5pbmRleE9mKGVtb3RpY29uc1tqXSwgZW1vdElkeCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdCwgcHJlLCBjb2RlXG4gICAgICAgICAgICBsZXQgY2hlY2tBbmNlc3RvciA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInByZVwiLCBcImNvZGVcIiwgXCJzY3JpcHRcIiwgXCJib2R5XCJdKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNoZWNrQW5jZXN0b3IgPT0gbnVsbCB8fCBjaGVja0FuY2VzdG9yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gXCJib2R5XCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlcnJvcl9tZXNzYWdlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJlcnJvcl9tZXNzYWdlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1pbnZhbGlkPXRydWVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfRXJyb3JNZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJlcnJvcl9tZXNzYWdlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDdXN0b20gZXJyb3IgbWVzc2FnZSBoYXMgaW52YWxpZCByZWZlcmVuY2UgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJDdXN0b20gZXJyb3IgbWVzc2FnZSBpcyBub3QgdmlzaWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgbXVzdCByZWZlcmVuY2UgYSB2YWxpZCAnaWQnIHZhbHVlIGFuZCB3aGVuIHRyaWdnZXJlZCB0aGUgbWVzc2FnZSBtdXN0IGJlIGFwcHJvcHJpYXRlbHkgZXhwb3NlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGFyaWFfZXJyTXNnSWQgPSBBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXJyb3JtZXNzYWdlXCIpO1xuXG4gICAgICAgIC8vIElmIGFyaWEtZXJyb3JtZXNzYWdlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBPVVRfT0ZfU0NPUEVcbiAgICAgICAgaWYgKCFhcmlhX2Vyck1zZ0lkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtc2dfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGFyaWFfZXJyTXNnSWQpO1xuXG4gICAgICAgIC8vIFBPRjA6IEludmFsaWQgaWQgcmVmZXJlbmNlXG4gICAgICAgIGlmICghbXNnX2VsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMTogUmVmZXJlbmNlZCBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG1zZ19lbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZmllbGRzZXRfbGFiZWxfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JvdXBcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImdyb3VwX3dpdGhJbnB1dHNfaGFzTmFtZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcIlBhc3NfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJmaWVsZHNldF9sYWJlbF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiR3JvdXAvRmllbGRzZXQgXFxcInswfVxcXCIgd2l0aCBhbiBpbnB1dCBoYXMgYSB1bmlxdWUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJHcm91cC9GaWVsZHNldCBkb2VzIG5vdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJHcm91cC9GaWVsZHNldCBcXFwiezB9XFxcIiBoYXMgYSBkdXBsaWNhdGUgbmFtZSB0byBhbm90aGVyIGdyb3VwXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiR3JvdXBzIHdpdGggbmVzdGVkIGlucHV0cyBtdXN0IGhhdmUgdW5pcXVlIGFjY2Vzc2libGUgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiLCBcIjMuMy4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZm9ybUNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibGFuZG1hcmtfZ3JvdXBfaW5wdXRcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICBmb3JtQ2FjaGUgPSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0czogW10sXG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzVGVtcCA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAnZmllbGRzZXQsW3JvbGU9XCJncm91cFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzID0gQXJyYXkuZnJvbShhbGxHcm91cHNUZW1wKTtcbiAgICAgICAgICAgIGxldCBncm91cHNXaXRoSW5wdXRzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGdyb3VwIG5vZGVzXG4gICAgICAgICAgICAgICAgaWYgKGFsbEdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0cy5wdXNoKGFsbEdyb3Vwc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShncm91cHNXaXRoSW5wdXRzW2ldKTtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAvKipBUklBTWFwcGVyLmNvbXB1dGVOYW1lKGdyb3Vwc1dpdGhJbnB1dHNbaV0pKi9cbiAgICAgICAgICAgICAgICAgICAgcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwID8gcGFpci5uYW1lLnRyaW0oKSA6IFwiXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHMgPSBncm91cHNXaXRoSW5wdXRzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzO1xuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJsYW5kbWFya19ncm91cF9pbnB1dFwiLGZvcm1DYWNoZSk7ICAgIFxuICAgICAgICB9XG4gICAgICAgIC8vIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzOiBcIiArZWxlbWVudC5pZClcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsczogXCIgK2Zvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsczogXCIgK2Zvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMubGVuZ3RoKVxuXG4gICAgICAgIGxldCBydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZyA9IGZhbHNlO1xuICAgICAgICBsZXQgY29tcHV0ZWROYW1lID0gXCJcIjtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0cykge1xuICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhdmUgYW55IGdyb3VwcyB3aXRoIGlucHV0cy4gVGhlcmVmb3JlIHdlIHNob3VsZCBza2lwIHRoaXMgcnVsZSB0cmlnZ2VyLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaXNTYW1lTm9kZShmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c1tpXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIG91ciBydWxlQ29udGV4dCBpbiB0aGUgY2FjaGVcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PSBcIlwiIHx8XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IG51bGxcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGYWlsXzFcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZm91bmRTYW1lTmFtZUZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGogPCBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaisrXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9IC8vIFdlIGRvIG5vdCB3YW50IHRvIGNvbXBhcmUgYWdhaW5zdCBvdXJzZWxmc1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU2FtZU5hbWVGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZm91bmRTYW1lTmFtZUZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGYWlsXzJcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0sXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wdXRlZE5hbWUgPSBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcnVsZUNvbnRleHRGb3VuZEluZ3JvdXBzV2l0aElucHV0c0ZsYWcpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibnVsbCByZXR1cm5cIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUGFzc18xXCIpXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMVwiLCBbY29tcHV0ZWROYW1lXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmaWVsZHNldF9sZWdlbmRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206ZmllbGRzZXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9GaWVsZHNldF9IYXNMZWdlbmRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSA8bGVnZW5kPlwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCI8ZmllbGRzZXQ+IGVsZW1lbnQgaGFzIG1vcmUgdGhhbiBvbmUgPGxlZ2VuZD5cIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IDxsZWdlbmQ+IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiIDxmaWVsZHNldD4gZWxlbWVudHMgc2hvdWxkIGhhdmUgYSBzaW5nbGUsIG5vbi1lbXB0eSA8bGVnZW5kPiBhcyBhIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSwgIC8vaHR0cHM6Ly93d3cudzMub3JnL1dBSS9XQ0FHMjIvVGVjaG5pcXVlcy9odG1sL0g3MVxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAvL3NraXAgaWYgdGhlIGZpZWxkc2V0IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYSBsZWdlbmQgaXMgaGlkZGVuLCB3ZSBzaG91bGQgc3RpbGwgdHJpZ2dlciBhIHZpb2xhdGlvbnMgZm9yIHRoaXNcbiAgICAgICAgbGV0IGxlZ2VuZHMgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4ocnVsZUNvbnRleHQsIFwibGVnZW5kXCIsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgaWYgKGxlZ2VuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgTk8gTGVnZW5kXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSBpZiAobGVnZW5kcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgbW9yZSB0aGFuIG9uZSBsZWdlbmRcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChDb21tb25VdGlsLmdldElubmVyVGV4dChsZWdlbmRzWzBdKS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgbGVnZW5kIGJ1dCBsZWdlbmQgaXMgZW1wdHlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmaWd1cmVfbGFiZWxfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImZpZ3VyZV9sYWJlbF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpmaWd1cmVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfRmlndXJlX2xhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZmlndXJlX2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPGZpZ3VyZT4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIDxmaWd1cmU+IGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQuIHRoaXMgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzIHJ1bGVzXG4gICAgICAgIGxldCByb2xlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtcbiAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9sZXQgcGFzc2VkID0gQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcGFzc2VkID0gcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9mb250X2NvbG9yOiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1fZm9udF9jb2xvclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9Gb250X0NvbG9ySW5Gb3JtXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fZm9udF9jb2xvci5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZm9ybV9mb250X2NvbG9yLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2ZvbnRfY29sb3IuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNoZWNrIGNvbG9yIGlzIG5vdCB1c2VkIGFzIHRoZSBvbmx5IHZpc3VhbCBtZWFucyB0byBjb252ZXkgd2hpY2ggZmllbGRzIGFyZSByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbWJpbmUgY29sb3IgYW5kIGRlc2NyaXB0aXZlIG1hcmt1cCB0byBpbmRpY2F0ZSByZXF1aXJlZCBmb3JtIGZpZWxkc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmb250cyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9udFwiKTtcbiAgICAgICAgaWYgKGZvbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhZm9udHNbaV0uaGFzQXR0cmlidXRlKFwiY29sb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1faW50ZXJhY3Rpb25fcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206Zm9ybVt0YXJnZXRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRm9ybV9UYXJnZXRBbmRUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX2ludGVyYWN0aW9uX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGludGVyYWN0aW5nIHdpdGggY29udGVudCB3aWxsIG5vdCBvcGVuIHBvcC11cCB3aW5kb3dzIG9yIGNoYW5nZSB0aGUgYWN0aXZlIHdpbmRvdyB3aXRob3V0IGluZm9ybWluZyB0aGUgdXNlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZXIgc2hvdWxkIGJlIGluZm9ybWVkIGluIGFkdmFuY2Ugd2hlbiBpbnRlcmFjdGluZyB3aXRoIGNvbnRlbnQgY2F1c2VzIGEgY2hhbmdlIG9mIGNvbnRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBwYXJhbVdpblRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wibmV3IHdpbmRvd1wiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdFN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRTdHIgPT09IFwiX3BhcmVudFwiIHx8IHRTdHIgPT09IFwiX3NlbGZcIiB8fCB0U3RyID09PSBcIl90b3BcIiB8fCBDb21tb25VdGlsLmdldEZyYW1lQnlOYW1lKHJ1bGVDb250ZXh0LCB0U3RyKSAhPSBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gTmFtZSBpcyBub3QgcGFydCBvZiB0aGlzIGZyYW1lc2V0IOKAkyBtdXN0IGhhdmUgcG90ZW50aWFsIHRvIGNyZWF0ZSBuZXcgd2luZG93P1xuICAgICAgICAgICAgLy8gU2VlIGlmIGEgbmV3IHdpbmRvdyBpcyBtZW50aW9uZWRcbiAgICAgICAgICAgIGxldCB0ZXh0U3RyID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKVxuICAgICAgICAgICAgICAgIHRleHRTdHIgKz0gXCIgXCIgKyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCB2YWxpZGF0ZVBhcmFtcy5wYXJhbVdpblRleHQudmFsdWUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgaWYgKHRleHRTdHIuaW5kZXhPZih2YWxpZGF0ZVBhcmFtcy5wYXJhbVdpblRleHQudmFsdWVbaV0pICE9IC0xKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbTpsYWJlbFtmb3JdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGFiZWxfVW5pcXVlRm9yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGb3JtIGNvbnRyb2wgaGFzIG1vcmUgdGhhbiBvbmUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGb3JtIGNvbnRyb2xzIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgbGV0IGxhYmVsSWRzID0gQ2FjaGVVdGlsLmdldENhY2hlKEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KSwgXCJSUFRfTGFiZWxfU2luZ2xlXCIsIHt9KVxuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhKGlkIGluIGxhYmVsSWRzKTtcbiAgICAgICAgbGFiZWxJZHNbaWRdID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1fc3VibWl0X2J1dHRvbl9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Gb3JtX0hhc1N1Ym1pdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlIDxmb3JtPiBlbGVtZW50IGhhcyBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Zm9ybT4gZWxlbWVudCBzaG91bGQgaGF2ZSBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIHN1Ym1pdCBidXR0b25zIGFyZSB1c3VhbGx5IGF0IHRoZSBib3R0b20gLSB3YWxrIGJhY2t3YXJkc1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiBudy5wcmV2Tm9kZSgpICYmIG53Lm5vZGUgIT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW53LmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHR5cGUgPT09IFwic3VibWl0XCIgfHwgdHlwZSA9PT0gXCJpbWFnZVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImJ1dHRvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN1Ym1pdFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IEFyaWFVdGlsLmhhc1JvbGUobncubm9kZSwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBmb3JtX3N1Ym1pdF9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0W29uY2hhbmdlXSwgZG9tOmlucHV0W29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0Zvcm1fQ2hhbmdlRW1wdHlcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9zdWJtaXRfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZvcm1fc3VibWl0X3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgZm9ybSBkb2VzIG5vdCBzdWJtaXQgYXV0b21hdGljYWxseSB3aXRob3V0IHdhcm5pbmdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGZvcm0gc2hvdWxkIG5vdCBiZSBzdWJtaXR0ZWQgYXV0b21hdGljYWxseSB3aXRob3V0IHdhcm5pbmcgdGhlIHVzZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSwqL1xuICAgIC8vZGVwcmVjYXRlIHRoZSBydWxlIG9uIEp1biAxMCwgMjAyNFxuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmNoYW5nZVwiKS50cmltKCkubGVuZ3RoID09PSAwO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZnJhbWVfc3JjX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImZyYW1lX3NyY192YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZyYW1lLCBkb206aWZyYW1lXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0ZyYW1lX1NyY0h0bWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZyYW1lX3NyY192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZnJhbWVfc3JjX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmcmFtZV9zcmNfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSA8ZnJhbWU+IGNvbnRlbnQgaXMgYWNjZXNzaWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGZyYW1lPiBjb250YWluaW5nIG5vbi1IVE1MIGNvbnRlbnQgbXVzdCBiZSBtYWRlIGFjY2Vzc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwic3JjXCIpICYmXG4gICAgICAgICAgICBDb21tb25VdGlsLmlzSHRtbEV4dChDb21tb25VdGlsLmdldEZpbGVFeHQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpKSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZyYW1lX3RpdGxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJmcmFtZV90aXRsZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpmcmFtZSwgZG9tOmlmcmFtZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ZyYW1lX0hhc1RpdGxlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbmxpbmUgZnJhbWVzIG11c3QgaGF2ZSBhIHVuaXF1ZSwgbm9uLWVtcHR5ICd0aXRsZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIklubGluZSBmcmFtZSBkb2VzIG5vdCBoYXZlIGEgJ3RpdGxlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgLypDaGFuZ2UgbWFwcGluZyB0byA0LjEuMiBmcm9tIDIuNC4xIHR5cG8/ICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBcImNhZTc2MFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZC4gdGhpcyBjYXNlIHdpbGwgYmUgY292ZXJlZCBpbiB0aGUgYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMgcnVsZXNcbiAgICAgICAgbGV0IHJvbGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICBpZiAocm9sZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAobmFtZV9wYWlyICYmIG5hbWVfcGFpci5uYW1lICYmIG5hbWVfcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGhlYWRpbmdfY29udGVudF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmgxLCBkb206aDIsIGRvbTpoMywgZG9tOmg0LCBkb206aDUsIGRvbTpoNlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0hlYWRlcl9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImhlYWRpbmdfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImhlYWRpbmdfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJIZWFkaW5nIGVsZW1lbnQgaGFzIGRlc2NyaXB0aXZlIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSGVhZGluZyBlbGVtZW50IGhhcyBubyBkZXNjcmlwdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSGVhZGluZyBlbGVtZW50cyBtdXN0IHByb3ZpZGUgZGVzY3JpcHRpdmUgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjZcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID1Db21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBoZWFkaW5nX21hcmt1cF9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aDEsIGRvbTpoMiwgZG9tOmgzLCBkb206aDQsIGRvbTpoNSwgZG9tOmg2XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0hlYWRlcnNfRmV3V29yZHNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJoZWFkaW5nX21hcmt1cF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImhlYWRpbmdfbWFya3VwX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIGhlYWRpbmcgZWxlbWVudCBpcyBhIGdlbnVpbmUgaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkhlYWRpbmcgZWxlbWVudHMgbXVzdCBub3QgYmUgdXNlZCBmb3IgcHJlc2VudGF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGhlYWRpbmdMZW5ndGhUaHJlc2g6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMjAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgaGVhZGluZ0xlbmd0aFRocmVzaCA9IHZhbGlkYXRlUGFyYW1zLmhlYWRpbmdMZW5ndGhUaHJlc2gudmFsdWU7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLndvcmRDb3VudChDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkpIDw9IGhlYWRpbmdMZW5ndGhUaHJlc2g7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBbmNlc3RvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3JcIjtcbmltcG9ydCB7IExhbmdVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xhbmdcIjtcblxuZXhwb3J0IGNvbnN0IGh0bWxfbGFuZ19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9IdG1sX0hhc0xhbmdcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIkZhaWxfNFwiLFxuICAgICAgICAgICAgXCJGYWlsXzVcIjogXCJGYWlsXzVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQb3RlbnRpYWxfNVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBvdGVudGlhbF82XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzZcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSBtdXN0IGlkZW50aWZ5IHRoZSBkZWZhdWx0IGxhbmd1YWdlIG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgJ2xhbmcnIGF0dHJpYnV0ZVwiLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFnZSBsYW5ndWFnZSBkZXRlY3RlZCBhcyBcXFwiezB9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCwgYnV0IGhhcyBuZWl0aGVyICdsYW5nJyBub3IgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwsIGJ1dCBkb2VzIG5vdCBoYXZlIGFuICd4bWw6bGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgSFRNTCwgYnV0IGRvZXMgbm90IGhhdmUgYSAnbGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlBhZ2UgZGV0ZWN0ZWQgd2l0aCAnbGFuZycgYW5kICd4bWw6bGFuZycgYXR0cmlidXRlcyBhbmQgcHJpbWFyeSBsYW5ndWFnZXMgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiUGFnZSBkZXRlY3RlZCB3aXRoICdsYW5nJyBhbmQgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCB3aXRoIG9ubHkgYSAnbGFuZycgYXR0cmlidXRlLiBDb25maXJtIHRoYXQgcGFnZSBpcyBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sIG1pbWUgdHlwZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwgMS4wIHdpdGggb25seSBhbiAneG1sOmxhbmcnIGF0dHJpYnV0ZS4gQ29uZmlybSB0aGF0IHBhZ2UgaXMgb25seSBkZWxpdmVyZWQgdmlhIHhtbCBtaW1lIHR5cGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIzLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF82XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCI1YjdhZTBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUaGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgaW5zaWRlIGEgcHJlc2VudGF0aW9uYWwgZnJhbWVcbiAgICAgICAgaWYgKEFuY2VzdG9yVXRpbC5pc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaGllcykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBkb2N0eXBlU3RyaW5nID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlID8gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlLnB1YmxpY0lkIDogXCJcIjtcbiAgICAgICAgaWYgKCFkb2N0eXBlU3RyaW5nKSBkb2N0eXBlU3RyaW5nID0gXCJcIjtcbiAgICAgICAgbGV0IGxhbmcgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpO1xuICAgICAgICBsZXQgbGFuZ1hNTCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuXG4gICAgICAgIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmICFkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKFwiMS4wXCIpKSB7XG4gICAgICAgICAgICBpZiAoIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCAhPSAxLjAgKG11c3QgaGF2ZSB4bWw6bGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmdYTUxdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmIGRvY3R5cGVTdHJpbmcuaW5jbHVkZXMoXCIxLjBcIikpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBYSFRNTCAxLjBcbiAgICAgICAgICAgIC8vIElmIG5laXRoZXIgaXMgcHJvdmlkZWQsIGl0J3MgYSBmYWlsdXJlXG4gICAgICAgICAgICBpZiAoIWxhbmcgJiYgIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbm8gbGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyAmJiBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhbmcgIT09IGxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmcpIHx8ICFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgRWxlbV9MYW5nX1ZhbGlkIGhhbmRsZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUxhbmdVdGlsLm1hdGNoUHJpbWFyeUxhbmcobGFuZywgbGFuZ1hNTCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZywgYnV0IHRoZXkgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNFwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNVwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIixbbGFuZ10pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gWEhUTUwgYW5kIG9ubHkgbGFuZyAob2theSBpZiBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzVcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBvbmx5IHhtbDpsYW5nIChva2F5IGlmIG9ubHkgZGVsaXZlcmVkIHZpYSB4bWwgbWltZSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWxhbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgJiYgbGFuZ1hNTCkge1xuICAgICAgICAgICAgICAgIC8vIEhUTUw1IHBvbHlnbG90IGRvY3VtZW50c1xuICAgICAgICAgICAgICAgIGlmIChsYW5nICE9PSBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nKSB8fCAhTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nWE1MKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IEVsZW1fTGFuZ19WYWxpZCBoYW5kbGUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5tYXRjaFByaW1hcnlMYW5nKGxhbmcsIGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcsIGJ1dCB0aGV5IGRvbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzRcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzVcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG4gICAgXG5leHBvcnQgY29uc3QgaHRtbF9za2lwbmF2X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJodG1sX3NraXBuYXZfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0h0bWxfU2tpcE5hdlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfc2tpcG5hdl9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgaHRtbF9za2lwbmF2X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGh0bWxfc2tpcG5hdl9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJvdmlkZSBhIHdheSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZXJlIGlzIGEgd2F5IHRvIGJ5cGFzcyBibG9ja3Mgb2YgY29udGVudCB0aGF0IGFyZSByZXBlYXRlZCBvbiBtdWx0aXBsZSBXZWIgcGFnZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjQuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBmcmFtZXMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiZnJhbWVcIik7XG4gICAgICAgIGxldCBoZWFkZXJzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImgxXCIpO1xuXG4gICAgICAgIGlmICgoZnJhbWVzICE9IG51bGwgJiYgZnJhbWVzLmxlbmd0aCA+IDApIHx8IChoZWFkZXJzICE9IG51bGwgJiYgaGVhZGVycy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgLy8gSWYgZnJhbWVzIG9yIGhlYWRpbmdzIGFyZSB1c2VkLCBwYXNzXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTG9vayBmb3Igc2tpcCBhbmNob3JzXG4gICAgICAgICAgICBsZXQgYW5jaG9ycyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJhXCIpO1xuICAgICAgICAgICAgbGV0IHRhcmdldHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7ICFwYXNzZWQgJiYgaWR4IDwgYW5jaG9ycy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcnNbaWR4XS5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBocmVmID0gYW5jaG9yc1tpZHhdLmhyZWY7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaHJlZiAhPT0gdHlwZW9mIFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocmVmLmJhc2VWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gaHJlZi5iYXNlVmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgdG1wTG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKChydWxlQ29udGV4dC5vd25lckRvY3VtZW50IGFzIGFueSkubG9jYXRpb25Gcm9tREFQKSAhPSBcInVuZGVmaW5lZFwiICYmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50IGFzIGFueSkubG9jYXRpb25Gcm9tREFQICE9IG51bGwpIHsgLy8gREFQIHNldHMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcExvY2F0aW9uID0gKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5sb2NhdGlvbkZyb21EQVA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHNlcnZlciBzY2FuIGhhcyB0aGUgbG9jYXRpb24gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB0bXBMb2NhdGlvbiA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQubG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvY0hyZWYgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG1wTG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0hyZWYgPSB0bXBMb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpeCB3ZWlyZCBidWdzIHdpdGggaG93IHZhcmlvdXMgcGFyc2VycyByZXBvcnQgb24gZmlsZTogdXJsJ3M6XG4gICAgICAgICAgICAgICAgICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoXCJmaWxlOi8vL1wiKSkgaHJlZiA9IFwiZmlsZTovXCIgKyBocmVmLnN1YnN0cmluZyhcImZpbGU6Ly8vXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0hyZWYuc3RhcnRzV2l0aChcImZpbGU6Ly8vXCIpKSBkb2NIcmVmID0gXCJmaWxlOi9cIiArIGRvY0hyZWYuc3Vic3RyaW5nKFwiZmlsZTovLy9cIi5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChocmVmLmNoYXJBdCgwKSA9PSBcIiNcIiB8fCBocmVmLnN0YXJ0c1dpdGgoZG9jSHJlZiArIFwiI1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IENvbW1vblV0aWwuZ2V0RmlsZUFuY2hvcihocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgdGFyZ2V0KSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0c1t0YXJnZXRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaG9yc1tpZHhdLmhhc0F0dHJpYnV0ZShcIm5hbWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIGZvcndhcmQganVtcGluZyB0YXJnZXRzXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gYW5jaG9yc1tpZHhdLmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoXCIjXCIpICE9IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IENvbW1vblV0aWwuZ2V0RmlsZUFuY2hvcihuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbmFtZSBpbiB0YXJnZXRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTU1hcHBlclwiO1xuXG5leHBvcnQgY29uc3QgaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlmcmFtZVwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJZnJhbWUgd2l0aCBpbnRlcmFjdGl2ZSBjb250ZW50IHNob3VsZCBub3QgYmUgZXhjbHVkZWQgZnJvbSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBpZnJhbWUgd2l0aCBpbnRlcmFjdGl2ZSBjb250ZW50IGlzIG5vdCBleGNsdWRlZCBmcm9tIHRoZSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiVGhlIDxpZnJhbWU+IHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBpcyBleGNsdWRlZCBmcm9tIHRhYiBvcmRlciB1c2luZyB0YWJpbmRleFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuMS4xXCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCJha243Ym5cIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBjb25zdCBtYXBwZXIgOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgaWZyYW1lIGlzIHRvbyBzbWFsbCB0byBiZSB2aXNpYmxlIG9uIHNjcmVlblxuICAgICAgICBpZiAoTWF0aC5tYXgoYm91bmRzWydoZWlnaHQnXSwgYm91bmRzWyd3aWR0aCddKSA8IDMwIHx8IE1hdGgubWluKGJvdW5kc1snaGVpZ2h0J10sIGJvdW5kc1snd2lkdGgnXSkgPCAxNSkgIFxuICAgICAgICAgICByZXR1cm4gbnVsbDsgXG5cbiAgICAgICAgLy8gcGFzcyBpZnJhbWUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdGFiaW5kZXggYXR0cmlidXRlIHZhbHVlIHRoYXQgaXMgYSBuZWdhdGl2ZSBudW1iZXJcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgLy8gY2hlY2sgaWZyYW1lIGNvbnRlbnRcbiAgICAgICAgY29uc3QgaWZyYW1FbGVtID0gcnVsZUNvbnRleHQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIGlmICghaWZyYW1FbGVtIHx8ICFpZnJhbUVsZW0uY29udGVudERvY3VtZW50IHx8ICFpZnJhbUVsZW0uY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIElmIHRoZSBpZnJhbWUgaXMgYmxvY2tlZCBieSBhbiBvcGVuIG1vZGFsIGRpYWxvZyBpdCBpcyBlZmZlY3RpdmVseSBpbmVydCDigJQgaW5hcHBsaWNhYmxlXG4gICAgICAgIGNvbnN0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ3MgPSBBcnJheS5mcm9tKGRvYy5xdWVyeVNlbGVjdG9yQWxsKFwiZGlhbG9nXCIpKTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrZWRCeU1vZGFsID0gZGlhbG9ncy5zb21lKGQgPT4gZC5tYXRjaGVzKFwiOm1vZGFsXCIpICYmICFkLmNvbnRhaW5zKHJ1bGVDb250ZXh0KSk7XG4gICAgICAgICAgICBpZiAoYmxvY2tlZEJ5TW9kYWwpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnQgPSBDb21tb25VdGlsLmdldFRhYmJhYmxlQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY291bnQgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbnZhbGlkXCIpO1xuXG4gICAgICAgIHJldHVybiBudWxsOyAgICBcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0V4cGxpY2l0TGFiZWxJbWFnZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJQYXNzXzFcIixcbiAgICAgICAgICAgIFwiUGFzc18yXCI6IFwiUGFzc18yXCIsXG4gICAgICAgICAgICBcIkZhaWxcIjogXCJGYWlsXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkltYWdlIGJ1dHRvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0IHVzaW5nIHRoZSAnYWx0JyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiSW1hZ2UgYnV0dG9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHRleHQgdXNpbmcgYW4gQVJJQSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJJbWFnZSBidXR0b24gcHJvdmlkZXMgYWx0ZXJuYXRpdmUgdGV4dCB1c2luZyB0aGUgJ3RpdGxlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiRmFpbFwiOiBcIlRoZSA8aW5wdXQ+IGVsZW1lbnQgb2YgdHlwZSBcXFwiaW1hZ2VcXFwiIGhhcyBubyB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCBvZiB0eXBlIFxcXCJpbWFnZVxcXCIgc2hvdWxkIGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjU5Nzk2ZlwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvV0FJL1dDQUcyMi9UZWNobmlxdWVzL2ZhaWx1cmVzL0Y2NVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgfHwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpICE9IFwiaW1hZ2VcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1hZ2VtYXBfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJpbWFnZW1hcF9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW3VzZW1hcF0sIGRvbTppbWdbaXNtYXBdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0ltZ19Vc2VtYXBBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWFnZW1hcF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkltYWdlIG1hcCBvciBjaGlsZCA8YXJlYT4gaGFzIG5vIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBpbWFnZSBtYXAgYW5kIGVhY2ggPGFyZWE+IGVsZW1lbnQgaW4gYW4gaW1hZ2UgbWFwIG11c3QgaGF2ZSB0ZXh0IGFsdGVybmF0aXZlKHMpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKSB8fFxuICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJpc21hcFwiKSAmJiAhQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ1c2VtYXBcIikpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfYWx0X2JhY2tncm91bmQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9iYWNrZ3JvdW5kXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19CYWNrZ3JvdW5kSW1nX0hhc1RleHRPclRpdGxlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19hbHRfYmFja2dyb3VuZC5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiaW1nX2FsdF9iYWNrZ3JvdW5kLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X2JhY2tncm91bmQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBpbXBvcnRhbnQgYmFja2dyb3VuZCBpbWFnZSBpbmZvcm1hdGlvbiBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlIGluIHN5c3RlbSBoaWdoIGNvbnRyYXN0IG1vZGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJCYWNrZ3JvdW5kIGltYWdlcyB0aGF0IGNvbnZleSBpbXBvcnRhbnQgaW5mb3JtYXRpb24gbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZSB0aGF0IGRlc2NyaWJlcyB0aGUgaW1hZ2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IHN0eWxlID0gZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoc3R5bGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBiYWNrZ3JvdW5kSW1ncyA9IHN0eWxlLmJhY2tncm91bmRJbWFnZTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGJhY2tncm91bmRJbWdzICE9IG51bGwgJiYgYmFja2dyb3VuZEltZ3MgIT0gXCJcIiAmJiBiYWNrZ3JvdW5kSW1ncyAhPSAnbm9uZScgJiYgYmFja2dyb3VuZEltZ3MgIT0gJ2luaGVyaXQnKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaW5uZXJIVE1MICE9IG51bGwgJiYgcnVsZUNvbnRleHQuaW5uZXJIVE1MLnRyaW0oKS5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJyk7XG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoICE9IDApXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2FsdF9kZWNvcmF0aXZlOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfZGVjb3JhdGl2ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW1nX1ByZXNlbnRhdGlvbkltZ0hhc05vbk51bGxBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfZGVjb3JhdGl2ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkltYWdlIGRlc2lnbmF0ZWQgYXMgZGVjb3JhdGl2ZSBoYXMgbm9uLW51bGwgJ2FsdCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW1hZ2UgZGVzaWduYXRlZCBhcyBkZWNvcmF0aXZlIG11c3QgaGF2ZSAnYWx0PVxcXCJcXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJwcmVzZW50YXRpb25cIikgfHwgQXJpYVV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJub25lXCIpKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikubGVuZ3RoID09IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nLCBkb206YXJlYSwgZG9tOmlucHV0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSW1nX0FsdENvbW1vbk1pc3VzZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfYWx0X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaW1nX2FsdF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgZmlsZSBuYW1lIHNlcnZlcyBhcyBhIGdvb2QgaW5saW5lIHJlcGxhY2VtZW50IGZvciB0aGUgaW1hZ2VcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCInYWx0JyBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBhIGdvb2QgaW5saW5lIHJlcGxhY2VtZW50IGZvciB0aGUgaW1hZ2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgYmFkVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJzaG9ydCBkZXNjcmlwdGlvblwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAvLyBBbHQgdGV4dCBjaGVjayBhcmUgZWxzZXdoZXJlIChTZWUgNDEsIDI0MCwgNDU1KVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCk7XG4gICAgICAgICAgICBpZiAoYWx0VGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJhZFRleHQgPSB2YWxpZGF0ZVBhcmFtcy5iYWRUZXh0LnZhbHVlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGJhZFRleHQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gYWx0VGV4dC5pbmRleE9mKGJhZFRleHRbaV0pID09IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzcmMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoKG5vZGVOYW1lID09IFwiYXJlYVwiKSA/IFwiaHJlZlwiIDogXCJzcmNcIik7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IGl0IHRvIHBhc3MgaWYgdGhlcmUncyBubyBzcmMgLSBjYW4ndCBkZXRlcm1pbmUgdGhlc2UuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbCBpZiB0aGUgYWx0IG1hdGNoZXMgdGhlIHNyYyBleGFjdGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIGZhaWwgaWYgdGhlIGFsdCBoYXMgYSAuIGluIGl0IGFuZCBlaXRoZXIgdGhlIHNyYyBpcyBpbiB0aGUgYWx0IG9yIHRoZSBhbHQgaXMgaW4gdGhlIHNyY1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gc3JjLnRyaW0oKSAhPSBhbHRUZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsdFRleHQuaW5kZXhPZihcIi5cIikgPT0gLTEgfHwgKGFsdFRleHQuaW5kZXhPZihzcmMpID09IC0xICYmIHNyYy5pbmRleE9mKGFsdFRleHQpID09IC0xKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2FsdF9udWxsOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfbnVsbFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW1nX1RpdGxlRW1wdHlXaGVuQWx0TnVsbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9kZWNvcmF0aXZlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9kZWNvcmF0aXZlXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2FyaWFfb3ZlcnJpZGVcIjogXCJpbWdfYWx0X251bGwuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfbnVsbC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJOZWl0aGVyICdhcmlhJyBub3IgJ3RpdGxlJyBhdHRyaWJ1dGVzIGFyZSB1c2VkIGZvciB0aGUgZGVjb3JhdGl2ZSBpbWFnZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2RlY29yYXRpdmVcIjogXCJUaGUgaW1hZ2UgJ2FsdCcgYXR0cmlidXRlIGlzIGVtcHR5LCBidXQgdGhlICd0aXRsZScgYXR0cmlidXRlIGlzIG5vdCBlbXB0eVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfYXJpYV9vdmVycmlkZVwiOiBcIlRoZSBpbWFnZSAnYWx0JyBhdHRyaWJ1dGUgaXMgZW1wdHksIGJ1dCB0aGUgJ2FyaWEnIGxhYmVsIGlzIG5vdCBlbXB0eSBhbmQgb3ZlcnJpZGVzIHRoZSAnYWx0JyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIHRoZSBpbnRlbnQgaXMgdG8gbWFyayBhbiBpbWFnZSBhcyBkZWNvcmF0aXZlIHdpdGggYW4gZW1wdHkgJ2FsdCcgYXR0cmlidXRlLCB0aGUgJ2FyaWEnIG9yICd0aXRsZScgYXR0cmlidXRlcyBzaG91bGQgbm90IGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJmYWlsX2RlY29yYXRpdmVcIl1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSxcbiAgICAgICAgcmVhc29uQ29kZXM6IFtcInBvdGVudGlhbF9hcmlhX292ZXJyaWRlXCJdXG4gICAgfVxuICAgIF0sXG4gICAgYWN0OiBbe1wiNDZjYTdmXCI6IHtcInBvdGVudGlhbF9hcmlhX292ZXJyaWRlXCI6IFwiZmFpbFwifX1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgaGF2ZSBhIHRpdGxlLCBidXQgYWx0IGlzIGVtcHR5XG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2FyaWFfb3ZlcnJpZGVcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9kZWNvcmF0aXZlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2FsdF9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9yZWR1bmRhbnRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19MaW5rVGV4dE5vdFJlZHVuZGFudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTGluayB0ZXh0IGlzIHJlcGVhdGVkIGluIGFuIGltYWdlICdhbHQnIHZhbHVlIHdpdGhpbiB0aGUgc2FtZSBsaW5rXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkxpbmsgdGV4dCBvZiBwcmV2aW91cyBsaW5rIGlzIHJlcGVhdGVkIGluIGltYWdlICdhbHQnIHZhbHVlIG9mIGEgbGlua1wiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJJbWFnZSAnYWx0JyB2YWx1ZSB3aXRoaW4gYSBsaW5rIGlzIHJlcGVhdGVkIGluIGxpbmsgdGV4dCBvZiB0aGUgbGluayBhZnRlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSB0ZXh0IGFsdGVybmF0aXZlIGZvciBhbiBpbWFnZSB3aXRoaW4gYSBsaW5rIHNob3VsZCBub3QgcmVwZWF0IHRoZSBsaW5rIHRleHQgb3IgYWRqYWNlbnQgbGluayB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiLCBcIjIuNC40XCJdLCAvL21hdGNoIGhlbHAgcmVmZXJlbmNlc1xuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBhTm9kZSA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiYVwiKTtcbiAgICAgICAgLy9JZiBub3QgaW4gYW4gYW5jaG9yLCBPdXQgb2YgU2NvcGVcbiAgICAgICAgaWYgKGFOb2RlID09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBhbHRUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoYWx0VGV4dC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgLy8gSWYgYWx0IHRleHQgaXMgZW1wdHksIHRoZXJlJ3Mgbm8gdGV4dCB0byBiZSByZWR1bmRhbnQgLSBsZXQgYV90ZXh0X3B1cnBvc2VcbiAgICAgICAgICAgIC8vIHRyaWdnZXIgaW4gdGhhdCBjYXNlLlxuICAgICAgICAgICAgLy8gU28gT3V0IG9mIFNjb3BlIGZvciB0aGlzIHJ1bGVcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbm5lclRleHQgPSBhTm9kZS5pbm5lclRleHQ7XG4gICAgICAgIGxldCBsaW5rVGV4dCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKGlubmVyVGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsaW5rVGV4dCA9IGlubmVyVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlua1RleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGFsdFRleHQgPT0gbGlua1RleHQpIHtcbiAgICAgICAgICAgICAgICAvLyBUZXh0IGluIGxpbmtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vYWx0IGlzIG5vbi16ZXJvLCBidXQgbm8gbGluayB0ZXh0IC0gZW5zdXJlIGFkamFjZW50IGxpbmsgdGV4dCBpc24ndCByZWR1bmRhbnRcbiAgICAgICAgICAgIGxldCB3YWxrID0gbmV3IERPTVdhbGtlcihhTm9kZSk7XG4gICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGsucHJldk5vZGUoKSkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBhbmQgbm9kZU5hbWVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGsubm9kZTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKChub2RlTmFtZSA9PSBcIiN0ZXh0XCIgJiYgbm9kZS5ub2RlVmFsdWUubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKG5vZGVOYW1lID09IFwiaW1nXCIgJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFsdFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENvbXBseSB3aXRoIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBTZXR0aW5nIGlmIHRoZSBhIGVsZW1lbnQgc2hvdWxkIGJlIGNoZWNrZWQgb3Igbm90XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiYVwiICYmICFDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dCBiZWZvcmUgaW1hZ2UgbGlua1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCB8fCBub2RlLnRleHRDb250ZW50IHx8IFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9IGFsdFRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrID0gbmV3IERPTVdhbGtlcihhTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGsubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBhbmQgbm9kZU5hbWVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGsubm9kZTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwiI3RleHRcIiAmJiBub2RlLm5vZGVWYWx1ZS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAobm9kZU5hbWUgPT0gXCJpbWdcIiAmJiBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tcGx5IHdpdGggdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcgaWYgdGhlIGEgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCBvciBub3RcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlTmFtZSA9PSBcImFcIiAmJiAhQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChub2RlIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT0gYWx0VGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIFRleHQgYWZ0ZXIgaW1hZ2UgbGlua1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX2FsdFwiOiBcImZhaWxfYmxhbmtfYWx0XCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiZmFpbF9ub19hbHRcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua190aXRsZVwiOiBcImZhaWxfYmxhbmtfdGl0bGVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua19hbHRcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hbHRcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua190aXRsZVwiOiBcImltZ19hbHRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGltYWdlIGhhcyBhbiBhY2Nlc3NpYmxlIG5hbWUgb3IgaXMgY29ycmVjdGx5IG1hcmtlZCBhcyBkZWNvcmF0aXZlIG9yIHJlZHVuZGFudFwiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX2FsdFwiOiBcIkltYWdlICdhbHQnIGF0dHJpYnV0ZSB2YWx1ZSBjb25zaXN0cyBvbmx5IG9mIGJsYW5rIHNwYWNlKHMpXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiVGhlIGltYWdlIGhhcyBuZWl0aGVyIGFuIGFjY2Vzc2libGUgbmFtZSBub3IgaXMgbWFya2VkIGFzIGRlY29yYXRpdmUgb3IgcmVkdW5kYW50XCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJUaGUgaW1hZ2UgZG9lcyBub3QgaGF2ZSBhbiAnYWx0JyBhdHRyaWJ1dGUgb3IgQVJJQSBsYWJlbCwgYW5kIHRoZSAndGl0bGUnIGF0dHJpYnV0ZSB2YWx1ZSBjb25zaXN0cyBvbmx5IG9mIGJsYW5rIHNwYWNlKHMpXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW1hZ2VzIG11c3QgaGF2ZSBhY2Nlc3NpYmxlIG5hbWVzIHVubGVzcyB0aGV5IGFyZSBkZWNvcmF0aXZlIG9yIHJlZHVuZGFudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCIyM2EyYThcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBJZiBub3QgdmlzaWJsZSB0byB0aGUgc2NyZWVuIHJlYWRlciwgb3IgY2FuIGJlIGlnbm9yZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBBY2NOYW1lVXRpbC5pc0FjY2Vzc2libGVOYW1lSWdub3JhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGltZyBoYXMgbm9uLWVtcHR5IGFyaWEgbGFiZWxcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWx0ID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpIDogbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGNoZWNrIHRpdGxlIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoYWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyB0aGUgaW1nIGhhcyBubyBhbHQgb3IgYXR0cmlidXRlLCBleGFtaW5lIHRoZSB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIikgOiBudWxsO1xuICAgICAgICAgICAgaWYgKHRpdGxlID09PSBudWxsIHx8IHRpdGxlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIG5vIHRpdGxlIG9yIHRpdGxlIGlzIGVtcHR5LCBleGFtaW5lIGFsdCBmdXJ0aGVyXG4gICAgICAgICAgICAgICAgaWYgKGFsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gJ3ByZXNlbnRhdGlvbicgfHwgcm9sZSA9PT0gJ25vbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fYWx0XCIpO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgaWYgKGFsdC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7IFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aXRsZSBjb250YWlucyBibGFuayBzcGFjZSBvbmx5ICh0aXRsZT1cIiAgXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYmxhbmtfdGl0bGVcIik7IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB0aXRsZSBjb250YWlucyBzb21lIHRleHQgKHRpdGxlPVwic29tZSB0ZXh0XCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhbHQubGVuZ3RoID09PSAwIHx8IGFsdC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpbWcgaGFzIGVtcHR5IGFsdCAoYWx0PVwiXCIpIG9yIG5vbi1lbXB0eSBhbHQgKGFsdD1cInNvbWUgdGV4dFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7IFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBhbHQgY29udGFpbnMgYmxhbmsgc3BhY2Ugb25seSAoYWx0PVwiIFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYmxhbmtfYWx0XCIpOyBcbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH0gICAgICAgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfaXNtYXBfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19pc21hcF9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbaXNtYXBdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfSW1nX1VzZW1hcFZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19pc21hcF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImltZ19pc21hcF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19pc21hcF9taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlNlcnZlci1zaWRlIGltYWdlIG1hcCBob3Qtc3BvdHMgZG8gbm90IGhhdmUgZHVwbGljYXRlIHRleHQgbGlua3NcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTZXJ2ZXItc2lkZSBpbWFnZSBtYXAgaG90LXNwb3RzIG11c3QgaGF2ZSBkdXBsaWNhdGUgdGV4dCBsaW5rc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ1c2VtYXBcIikpIHtcbiAgICAgICAgICAgIGxldCB1c2VtYXAgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ1c2VtYXBcIik7XG4gICAgICAgICAgICB1c2VtYXAgPSB1c2VtYXAudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBsZXQgaWR4ID0gdXNlbWFwLmluZGV4T2YoXCIjXCIpO1xuICAgICAgICAgICAgaWYgKGlkeCAhPSAtMSlcbiAgICAgICAgICAgICAgICB1c2VtYXAgPSB1c2VtYXAuc3Vic3RyKGlkeCArIDEpO1xuXG4gICAgICAgICAgICBpZiAodXNlbWFwLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFwcyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJtYXBcIik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IG1hcHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbWFwc1tpXS5oYXNBdHRyaWJ1dGUoXCJuYW1lXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBzW2ldLmdldEF0dHJpYnV0ZShcIm5hbWVcIikudG9Mb3dlckNhc2UoKSA9PSB1c2VtYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2xvbmdkZXNjX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2xvbmdkZXNjXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ltZ19Mb25nRGVzY3JpcHRpb24yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19sb25nZGVzY19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBmaWxlIGRlc2lnbmF0ZWQgYnkgdGhlICdsb25nZGVzYycgYXR0cmlidXRlIGNvbnRhaW5zIHZhbGlkIEhUTUwgY29udGVudCAoZmlsZSBleHRlbnNpb24gbm90IHJlY29nbml6ZWQpXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiIFRoZSAnbG9uZ2Rlc2MnIGF0dHJpYnV0ZSBtdXN0IHJlZmVyZW5jZSBIVE1MIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGxvbmdkZXNjID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibG9uZ2Rlc2NcIik7XG4gICAgICAgIC8vIGlmIChsb25nZGVzYyBpcyBiYWQgVVJMKSBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICBsZXQgZXh0ID0gQ29tbW9uVXRpbC5nZXRGaWxlRXh0KGxvbmdkZXNjKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGV4dC5sZW5ndGggIT0gMCAmJiBDb21tb25VdGlsLmlzSHRtbEV4dChleHQpXG4gICAgICAgICAgICB8fCBsb25nZGVzYy5zdGFydHNXaXRoKFwiI1wiKVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcImh0dHA6Ly9cIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcImRhdGE6XCIpO1xuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBcIm5wbSBydW4gcHJlYnVpbGRcIi4gRG8gbm90IGVkaXRcblxuZXhwb3J0ICogZnJvbSBcIi4vYV90YXJnZXRfd2FybmluZ1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hX3RleHRfcHVycG9zZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcHBsZXRfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJlYV9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2FsbG93ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3RcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3JlcXVpcmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Jhbm5lcl9zaW5nbGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jaGlsZF90YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NoaWxkX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29udGVudF9pbl9sYW5kbWFya1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRpbmZvX3NpbmdsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Rlc2NlbmRhbnRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZ3JhcGhpY19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2hpZGRlbl9ub250YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2lkX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2ltZ19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9tYWluX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX21haW5fbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfcGFyZW50X3JlcXVpcmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JlZ2lvbl9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JvbGVfYWxsb3dlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JvbGVfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3NlbWFudGljc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfd2lkZ2V0X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FzY2lpYXJ0X2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxpbmtfY3NzX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9ibGlua19lbGVtX2RlcHJlY2F0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxvY2txdW90ZV9jaXRlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9jYW52YXNfY29udGVudF9kZXNjcmliZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY2FwdGlvbl90cmFja19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2Rlc2lnbl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9jb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfaGFzcG9wdXBfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RlYnVnX3BhdGhzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RldGVjdG9yX3RhYmJhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Rpcl9hdHRyaWJ1dGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9pZF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9sYW5nX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfdGFiYmFibGVfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbWJlZF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Vtb3RpY29uc19hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yX21lc3NhZ2VfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpZWxkc2V0X2xhYmVsX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpZWxkc2V0X2xlZ2VuZF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9maWd1cmVfbGFiZWxfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvcm1fZm9udF9jb2xvclwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2ludGVyYWN0aW9uX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Zvcm1fc3VibWl0X3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mcmFtZV9zcmNfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZnJhbWVfdGl0bGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2hlYWRpbmdfY29udGVudF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaGVhZGluZ19tYXJrdXBfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2h0bWxfbGFuZ19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaHRtbF9za2lwbmF2X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1hZ2VidXR0b25fYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWFnZW1hcF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfYmFja2dyb3VuZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X2RlY29yYXRpdmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9udWxsXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfcmVkdW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2lzbWFwX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfbG9uZ2Rlc2NfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2F1dG9jb21wbGV0ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9jaGVja2JveGVzX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfZmllbGRzX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfaGFzcG9wdXBfY29uZmxpY3RcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfYWZ0ZXJcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfYmVmb3JlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X29uY2hhbmdlX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xhYmVsX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xhYmVsX25hbWVfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9yZWZfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9jaGlsZHJlbl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9saXN0X21hcmt1cF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyXCJcbmV4cG9ydCAqIGZyb20gXCIuL21hcnF1ZWVfZWxlbV9hdm9pZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hbHRfYnJpZWZcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hdWRpb190cmFuc2NyaWJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL21lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9saXZlX2NhcHRpb25lZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV90cmFja19hdmFpbGFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV9yZWRpcmVjdF9vcHRpb25hbFwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZXRhX3JlZnJlc2hfZGVsYXlcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV92aWV3cG9ydF96b29tYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9ub2VtYmVkX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL29iamVjdF90ZXh0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wYWdlX3RpdGxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9wYWdlX3RpdGxlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NjcmlwdF9mb2N1c19ibHVyX3Jldmlld1wiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfb25jbGlja19hdm9pZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfb25jbGlja19taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X3NlbGVjdF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2VsZWN0X29wdGlvbnNfZ3JvdXBlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9za2lwX21haW5fZGVzY3JpYmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NraXBfbWFpbl9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfY29sb3JfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2ZvY3VzX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfaG92ZXJfcGVyc2lzdGVudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV92aWV3cG9ydF9yZXNpemFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3ZnX2dyYXBoaWNzX2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2FyaWFfZGVzY2VuZGFudHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfY2FwdGlvbl9lbXB0eVwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9jYXB0aW9uX25lc3RlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9oZWFkZXJzX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9oZWFkZXJzX3JlZl92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfbGF5b3V0X2xpbmVhcml6ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfc2NvcGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfc3RydWN0dXJlX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9zdW1tYXJ5X3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfYmxvY2tfaGVhZGluZ1wiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9xdW90ZWRfY29ycmVjdGx5XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfc2Vuc29yeV9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9zcGFjaW5nX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfd2hpdGVzcGFjZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi93aWRnZXRfdGFiYmFibGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3dpZGdldF90YWJiYWJsZV9zaW5nbGVcIiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbYXV0b2NvbXBsZXRlXSwgZG9tOnRleHRhcmVhW2F1dG9jb21wbGV0ZV0sIGRvbTpzZWxlY3RbYXV0b2NvbXBsZXRlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX0lucHV0X0F1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9pbmFwcHJvcHJpYXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxfaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJGYWlsX2F0dHJpYnV0ZV9pbmNvcnJlY3RcIjogXCJmYWlsX2luY29ycmVjdFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5hcHByb3ByaWF0ZVwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5jb3JyZWN0XCI6IFwiaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgbXVzdCBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGlucHV0IGZvcm0gZmllbGRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUncyB0b2tlbihzKSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGlucHV0IGZvcm0gZmllbGRcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbmFwcHJvcHJpYXRlXCI6IFwiVGhlICdhdXRvY29tcGxldGUnIGF0dHJpYnV0ZSdzIHRva2VuKHMpIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUncyB0b2tlbihzKSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBhbiBpbnB1dCBmb3JtIGZpZWxkIG9mIGFueSB0eXBlXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5jb3JyZWN0XCI6IFwiVGhlICdhdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBoYXMgYW4gaW5jb3JyZWN0IHZhbHVlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuNVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiNzNmMmMyXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbmFwcHJvcHJpYXRlXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5jb3JyZWN0XCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IGF1dG9jb21wbGV0ZUF0dHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgbGV0IHRva2VucyA9IGF1dG9jb21wbGV0ZUF0dHIuc3BsaXQoL1xccysvKTtcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDAgfHwgYXV0b2NvbXBsZXRlQXR0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FjaGUgPSB7XG4gICAgICAgICAgICBcInRva2Vuc09uT2ZmXCI6IFtcIm9uXCIsIFwib2ZmXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbk9wdGlvbmFsU2VjdGlvblwiOiBcInNlY3Rpb24tXCIsXG4gICAgICAgICAgICBcInRva2Vuc09wdGlvbmFsUHVycG9zZVwiOiBbXCJzaGlwcGluZ1wiLCBcImJpbGxpbmdcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9wYXNzd29yZFwiOiBbXCJuZXctcGFzc3dvcmRcIiwgXCJjdXJyZW50LXBhc3N3b3JkXCIsIFwib25lLXRpbWUtY29kZVwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX211bHRpbGluZVwiOiBbXCJzdHJlZXQtYWRkcmVzc1wiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX21vbnRoXCI6IFtcImNjLWV4cFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX251bWVyaWNcIjogW1wiY2MtZXhwLW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHAteWVhclwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tYW1vdW50XCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LWRheVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS15ZWFyXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZVwiOiBbXCJiZGF5XCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfdXJsXCI6IFtcInVybFwiLCBcInBob3RvXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfdGV4dFwiOiBbXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJnaXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJuaWNrbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwidXNlcm5hbWVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvbi10aXRsZVwiLFxuICAgICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUxXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsNFwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJwb3N0YWwtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1mYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1jc2NcIixcbiAgICAgICAgICAgICAgICBcImNjLXR5cGVcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWN1cnJlbmN5XCIsXG4gICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIFwic2V4XCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsXCI6IFtcIm5hbWVcIixcbiAgICAgICAgICAgICAgICBcImhvbm9yaWZpYy1wcmVmaXhcIixcbiAgICAgICAgICAgICAgICBcImdpdmVuLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiZmFtaWx5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImhvbm9yaWZpYy1zdWZmaXhcIixcbiAgICAgICAgICAgICAgICBcIm5pY2tuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJ1c2VybmFtZVwiLFxuICAgICAgICAgICAgICAgIFwibmV3LXBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgXCJjdXJyZW50LXBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb24tdGl0bGVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIFwic3RyZWV0LWFkZHJlc3NcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTFcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTJcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGluZTNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWw0XCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsM1wiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDJcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwxXCIsXG4gICAgICAgICAgICAgICAgXCJjb3VudHJ5XCIsXG4gICAgICAgICAgICAgICAgXCJjb3VudHJ5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcInBvc3RhbC1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1naXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1hZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1udW1iZXJcIixcbiAgICAgICAgICAgICAgICBcImNjLWV4cFwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwLW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHAteWVhclwiLFxuICAgICAgICAgICAgICAgIFwiY2MtY3NjXCIsXG4gICAgICAgICAgICAgICAgXCJjYy10eXBlXCIsXG4gICAgICAgICAgICAgICAgXCJ0cmFuc2FjdGlvbi1jdXJyZW5jeVwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tYW1vdW50XCIsXG4gICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheVwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1kYXlcIixcbiAgICAgICAgICAgICAgICBcImJkYXktbW9udGhcIixcbiAgICAgICAgICAgICAgICBcImJkYXkteWVhclwiLFxuICAgICAgICAgICAgICAgIFwic2V4XCIsXG4gICAgICAgICAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgICAgICAgICBcInBob3RvXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNPcHRpb25hbEdyb3VwMlwiOiBbXCJob21lXCIsXG4gICAgICAgICAgICAgICAgXCJ3b3JrXCIsXG4gICAgICAgICAgICAgICAgXCJtb2JpbGVcIixcbiAgICAgICAgICAgICAgICBcImZheFwiLFxuICAgICAgICAgICAgICAgIFwicGFnZXJcIl0sXG5cbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3RlbFwiOiBbXCJ0ZWxcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl9lbWFpbFwiOiBbXCJlbWFpbFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3VybFwiOiBbXCJpbXBwXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDJfdGV4dFwiOiBbXCJ0ZWwtY291bnRyeS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbmF0aW9uYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1hcmVhLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWV4dGVuc2lvblwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbFwiOiBbXCJ0ZWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1jb3VudHJ5LWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1uYXRpb25hbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWFyZWEtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWwtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWwtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtZXh0ZW5zaW9uXCIsXG4gICAgICAgICAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICAgICAgICAgIFwiaW1wcFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zT3B0aW9uR3JvdXAxX3dlYmF1dGhuXCI6IFtcIndlYmF1dGhuXCJdICAgIFxuICAgICAgICB9XG4gICAgICAgIGxldCB2YWxpZF92YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGNhY2hlKVxuICAgICAgICAgICAgdmFsaWRfdmFsdWVzPXZhbGlkX3ZhbHVlcy5jb25jYXQoY2FjaGVba2V5XSk7XG4gICAgICAgIFxuICAgICAgICBsZXQgZm91bmRNYW5kYXRvcnlUb2tlbiA9IGZhbHNlO1xuICAgICAgICBsZXQgZm91bmRSZWNvZ25pemVkVG9rZW4gPSB0cnVlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRva2Vucy5ldmVyeShyID0+IHZhbGlkX3ZhbHVlcy5pbmNsdWRlcyhyKSB8fCByLnN0YXJ0c1dpdGgoY2FjaGVbJ3Rva2VuT3B0aW9uYWxTZWN0aW9uJ10pKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW5jb3JyZWN0XCIpO1xuICAgICAgICBcbiAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKSA6IFwidGV4dFwiO1xuICAgICAgICBcbiAgICAgICAgbGV0IHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IFtdO1xuICAgICAgICBsZXQgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gW107XG4gICAgICAgIGxldCB0b2tlbnNPcHRpb25hbEdyb3VwID0gW107XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgfHwgbm9kZU5hbWUgPT09IFwic2VsZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIGFjY2VwdCBhbGwgdG9rZW5zXG4gICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsO1xuICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbDtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiKVxuICAgICAgICAgICAgICAgIHRva2Vuc09wdGlvbmFsR3JvdXAgPSBjYWNoZS50b2tlbnNPcHRpb25Hcm91cDFfd2ViYXV0aG47XG5cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICB0b2tlbnNPcHRpb25hbEdyb3VwID0gY2FjaGUudG9rZW5zT3B0aW9uR3JvdXAxX3dlYmF1dGhuO1xuICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSB2YXJpb3VzICdpbnB1dCcgdHlwZXNcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuXG4gICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBjaGVjayBmb3IgaW5wdXQgdHlwZT1oaWRkZW4gZm9yIG5vdyBiYXNlZCBvbiBzY3J1bSBkaXNjdXNzaW9uXG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICBjYXNlIFwiaGlkZGVuXCI6XG4gICAgICAgICAgICAgICAgICAgIC8vIGFjY2VwdCBhbGwgdG9rZW5zXG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9hbGw7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJzZWFyY2hcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3RleHQuY29uY2F0KGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9wYXNzd29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV91cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfbnVtZXJpYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9tb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9kYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInBhc3N3b3JkXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9wYXNzd29yZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInVybFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfdXJsO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfdXJsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2VtYWlsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwidGVsXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl90ZWw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX251bWVyaWM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtb250aFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfbW9udGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9kYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCB0eXBlIGZvciB0aGlzIHJ1bGUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgY2hlY2sgZm9yIGlucHV0IHR5cGU9aGlkZGVuIGZvciBub3cgYmFzZWQgb24gc2NydW0gZGlzY3Vzc2lvblxuICAgICAgICBsZXQgYXV0b2ZpbGxNYW50bGUgPSAvKiAobm9kZU5hbWU9PT1cImlucHV0XCIgJiYgdHlwZT09PVwiaGlkZGVuXCIpID8gXCJhbmNob3JcIiA6ICovIFwiZXhwZWN0YXRpb25cIjtcblxuICAgICAgICBpZiAoYXV0b2ZpbGxNYW50bGUgPT09IFwiZXhwZWN0YXRpb25cIikge1xuICAgICAgICAgICAgLy8gY2hlY2sgb258b2ZmIGZvciBleHBlY3RhdGlvbiBtYW50bGUuXG4gICAgICAgICAgICBpZiAodG9rZW5zLmluY2x1ZGVzKFwib25cIikgfHwgdG9rZW5zLmluY2x1ZGVzKFwib2ZmXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gb258b2ZmIHNob3VsZCBiZSB0aGUgb25seSB0b2tlblxuICAgICAgICAgICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbnZhbGlkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGRldGFpbCBhdXRvZmlsbCB0b2tlbnNcbiAgICAgICAgbGV0IGN1cnJJbmRleCA9IDA7XG4gICAgICAgIGxldCBjdXJyUmVjb2duaXplZEluZGV4ID0gMDtcblxuICAgICAgICAvLyBjaGVjayBvcHRpb25hbCAnc2VjdGlvbi0qJyB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vuc1tjdXJySW5kZXhdLnN0YXJ0c1dpdGgoY2FjaGUudG9rZW5PcHRpb25hbFNlY3Rpb24pICYmXG4gICAgICAgICAgICB0b2tlbnNbY3VyckluZGV4XS5sZW5ndGggPiA4KSB7XG4gICAgICAgICAgICBjdXJySW5kZXgrKzsgLy8gY29uc3VtZSB0b2tlblxuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgJ3NoaXBwaW5nfGJpbGxpbmcnIHRva2Vuc1xuICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IGN1cnJJbmRleCAmJlxuICAgICAgICAgICAgY2FjaGUudG9rZW5zT3B0aW9uYWxQdXJwb3NlLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgY3VyckluZGV4Kys7IC8vIGNvbnN1bWUgIHRva2VuXG4gICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBlaXRoZXIgbWFuZGF0b3J5IGdyb3VwIDEgb3IgMiB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXgpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIG1hbmRhdG9yeSBncm91cCAxXG4gICAgICAgICAgICBpZiAodG9rZW5zTWFuZGF0b3J5R3JvdXAxLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGZvdW5kTWFuZGF0b3J5VG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGN1cnJJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBvcHRpb25hbCB0b2tlbnMgZm9yIGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zT3B0aW9uYWxHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMlxuICAgICAgICAgICAgICAgIGlmICh0b2tlbnNNYW5kYXRvcnlHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kTWFuZGF0b3J5VG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBlaXRoZXIgbWFuZGF0b3J5IGdyb3VwIDEgb3IgMiB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJyUmVjb2duaXplZEluZGV4KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMVxuICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9hbGwuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGZvdW5kUmVjb2duaXplZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIG9wdGlvbmFsIHRva2VucyBmb3IgZ3JvdXAgMlxuICAgICAgICAgICAgICAgIGlmIChjYWNoZS50b2tlbnNPcHRpb25hbEdyb3VwMi5pbmNsdWRlcyh0b2tlbnNbY3VyclJlY29nbml6ZWRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX2FsbC5pbmNsdWRlcyh0b2tlbnNbY3VyclJlY29nbml6ZWRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kUmVjb2duaXplZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXggKyBjdXJyUmVjb2duaXplZEluZGV4KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBvcHRpb25hbCB0b2tlbnMgd2ViYXV0aG5cbiAgICAgICAgICAgIGlmICh0b2tlbnNPcHRpb25hbEdyb3VwLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXggKyBjdXJyUmVjb2duaXplZEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXggJiYgdG9rZW5zT3B0aW9uYWxHcm91cC5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpXG4gICAgICAgICAgICB8fCAodG9rZW5zLmxlbmd0aCA+IGN1cnJSZWNvZ25pemVkSW5kZXggJiYgdG9rZW5zT3B0aW9uYWxHcm91cC5pbmNsdWRlcyh0b2tlbnNbY3VyclJlY29nbml6ZWRJbmRleF0pKSkge1xuICAgICAgICAgICAgY3VyckluZGV4Kys7XG4gICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IHBhc3MgaWYgd2UgaGF2ZSBzZWVuIGVpdGhlciBvZiB0aGUgbWFuZGF0b3J5IGdyb3VwcyBhbmQgYWxsIHRva2VucyBoYXZlIGJlZW4gY29uc3VtZWRcbiAgICAgICAgaWYgKGZvdW5kTWFuZGF0b3J5VG9rZW4gJiYgdG9rZW5zLmxlbmd0aCA9PT0gY3VyckluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvdW5kUmVjb2duaXplZFRva2VuICYmIHRva2Vucy5sZW5ndGggPT09IGN1cnJSZWNvZ25pemVkSW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW5jb3JyZWN0XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbmFwcHJvcHJpYXRlXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZDogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFt0eXBlPXJhZGlvXSwgZG9tOmlucHV0W3R5cGU9Y2hlY2tib3hdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfUmFkaW9DaGtJbkZpZWxkU2V0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc19Mb25lTm9ncm91cFwiOiBcInBhc3NfbG9uZW5vZ3JvdXBcIixcbiAgICAgICAgICAgIFwiUGFzc19Hcm91cGVkXCI6IFwicGFzc19ncm91cGVkXCIsXG4gICAgICAgICAgICBcIlBhc3NfUmFkaW9Ob05hbWVcIjogXCJwYXNzX3JhZGlvTm9OYW1lXCIsXG4gICAgICAgICAgICBcIkZhaWxfQ29udHJvbE5hbWVNaXNtYXRjaFwiOiBcImZhaWxfY29udHJvbG5hbWVtaXNtYXRjaFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdEdyb3VwZWRPdGhlckdyb3VwZWRcIjogXCJmYWlsX25vdGdyb3VwZWRvdGhlcmdyb3VwZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJOb3RHcm91cGVkXCI6IFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90U2FtZUdyb3VwXCI6IFwiZmFpbF9ub3RzYW1lZ3JvdXBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX0xvbmVDaGVja2JveFwiOiBcInBvdGVudGlhbF9sb25lY2hlY2tib3hcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsX1VubmFtZWRDaGVja2JveFwiOiBcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfbG9uZW5vZ3JvdXBcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX2dyb3VwZWRcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX3JhZGlvbm9uYW1lXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb250cm9sbmFtZW1pc21hdGNoXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3Rncm91cGVkb3RoZXJncm91cGVkXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3RzYW1lZ3JvdXBcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbG9uZWNoZWNrYm94XCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3VubmFtZWRjaGVja2JveFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUmVsYXRlZCBzZXRzIG9mIHJhZGlvIGJ1dHRvbnMgb3IgY2hlY2tib3hlcyBzaG91bGQgYmUgcHJvZ3JhbW1hdGljYWxseSBncm91cGVkXCIsXG4gICAgICAgICAgICBcInBhc3NfbG9uZW5vZ3JvdXBcIjogXCJ7MH0gZ3JvdXBpbmcgbm90IHJlcXVpcmVkIGZvciBhIGNvbnRyb2wgb2YgdGhpcyB0eXBlXCIsXG4gICAgICAgICAgICBcInBhc3NfZ3JvdXBlZFwiOiBcInswfSBpbnB1dCBpcyBncm91cGVkIHdpdGggb3RoZXIgcmVsYXRlZCBjb250cm9scyB3aXRoIHRoZSBzYW1lIG5hbWVcIixcbiAgICAgICAgICAgIFwicGFzc19yYWRpb25vbmFtZVwiOiBcIlJhZGlvIGlucHV0IGlzIG5vdCBncm91cGVkLCBidXQgcGFzc2VzIGJlY2F1c2UgaXQgaGFzIG5vIG5hbWUgdG8gZ3JvdXAgd2l0aCBvdGhlciByYWRpbyBpbnB1dHNcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb250cm9sbmFtZW1pc21hdGNoXCI6IFwiezB9IGlucHV0IGZvdW5kIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUsIFxcXCJ7Mn1cXFwiIGFzIGEgezF9IGlucHV0XCIsXG4gICAgICAgICAgICBcImZhaWxfbm90Z3JvdXBlZG90aGVyZ3JvdXBlZFwiOiBcInswfSBpbnB1dCBpcyBub3QgaW4gdGhlIGdyb3VwIHdpdGggYW5vdGhlciB7MH0gd2l0aCB0aGUgbmFtZSBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJmYWlsX25vdGdyb3VwZWRvdGhlcm5vdGdyb3VwZWRcIjogXCJ7MH0gaW5wdXQgYW5kIG90aGVycyB3aXRoIHRoZSBuYW1lIFxcXCJ7MX1cXFwiIGFyZSBub3QgZ3JvdXBlZCB0b2dldGhlclwiLFxuICAgICAgICAgICAgXCJmYWlsX25vdHNhbWVncm91cFwiOiBcInswfSBpbnB1dCBpcyBpbiBhIGRpZmZlcmVudCBncm91cCB0aGFuIGFub3RoZXIgezB9IHdpdGggdGhlIG5hbWUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xvbmVjaGVja2JveFwiOiBcIlZlcmlmeSB0aGF0IHRoaXMgdW5ncm91cGVkIGNoZWNrYm94IGlucHV0IGlzIG5vdCByZWxhdGVkIHRvIG90aGVyIGNoZWNrYm94ZXNcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3VubmFtZWRjaGVja2JveFwiOiBcIlZlcmlmeSB0aGF0IHRoaXMgdW4tbmFtZWQsIHVuZ3JvdXBlZCBjaGVja2JveCBpbnB1dCBpcyBub3QgcmVsYXRlZCB0byBvdGhlciBjaGVja2JveGVzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGdldEdyb3VwID0gKGU6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGUsIFwiZmllbGRzZXRcIilcbiAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwicmFkaW9ncm91cFwiKVxuICAgICAgICAgICAgICAgIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJncm91cFwiKVxuICAgICAgICAgICAgICAgIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJncmlkXCIpXG4gICAgICAgICAgICAgICAgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShlLCBcInRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKCFyZXRWYWwpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGUsIFwidGFibGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHJldFZhbCAmJiAhVGFibGVVdGlsLmlzRGF0YVRhYmxlKHJldFZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzIGFyZSBpbiBzY29wZVxuICAgICAgICBsZXQgY3R4VHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIERldGVybWluZSB3aGljaCBmb3JtIHdlJ3JlIGluIChpZiBhbnkpIHRvIGRldGVybWluZSBvdXIgc2NvcGVcbiAgICAgICAgbGV0IGN0eEZvcm0gPSBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImZvcm1cIilcbiAgICAgICAgICAgIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiaHRtbFwiKVxuICAgICAgICAgICAgfHwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gR2V0IGRhdGEgYWJvdXQgYWxsIG9mIHRoZSB2aXNpYmxlIGNoZWNrYm94ZXMgYW5kIHJhZGlvcyBpbiB0aGUgc2NvcGUgb2YgdGhpcyBmb3JtXG4gICAgICAgIC8vIGFuZCBjYWNoZSBpdCBmb3IgYWxsIG9mIHRoZSBvdGhlciBpbnB1dHMgaW4gdGhpcyBzY29wZVxuICAgICAgICBsZXQgZm9ybUNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKGN0eEZvcm0sIFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWZvcm1DYWNoZSkge1xuICAgICAgICAgICAgZm9ybUNhY2hlID0ge1xuICAgICAgICAgICAgICAgIGNoZWNrYm94QnlOYW1lOiB7fSxcbiAgICAgICAgICAgICAgICByYWRpb3NCeU5hbWU6IHt9LFxuICAgICAgICAgICAgICAgIG5hbWVUb0dyb3VwOiB7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG51bUNoZWNrYm94ZXM6IDAsXG4gICAgICAgICAgICAgICAgbnVtUmFkaW9zOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSBjaGVja2JveGVzIGluIHRoZSBmb3JtIG9yIGJvZHkgKGJ1dCBub3QgbmVzdGVkIGluIHNvbWV0aGluZyBlbHNlIGFuZCBub3QgaGlkZGVuKVxuICAgICAgICAgICAgLy8gQW5kIGdldCBhIG1hcHBpbmcgb2YgdGhlc2UgY2hlY2tib3hlcyB0b1xuICAgICAgICAgICAgbGV0IGNXYWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGN0eEZvcm0sIGZhbHNlLCBjdHhGb3JtLCB0cnVlKTtcbiAgICAgICAgICAgIGxldCBjaGVja2JveFEgPSBbXTtcbiAgICAgICAgICAgIGxldCByYWRpb3NRID0gW107XG4gICAgICAgICAgICB3aGlsZSAoY1dhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjV2Fsa2VyLmJFbmRUYWdcbiAgICAgICAgICAgICAgICAgICAgJiYgY1dhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxXG4gICAgICAgICAgICAgICAgICAgICYmIGNXYWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGNXYWxrZXIubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSAoY1dhbGtlci5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94US5wdXNoKGNXYWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByYWRpb3NRLnB1c2goY1dhbGtlci5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGxldCBjaGVja2JveFEgPSBjdHhGb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFt0eXBlPWNoZWNrYm94XVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNoZWNrYm94US5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSBjaGVja2JveFFbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoY2IsIFwiZm9ybVwiKVxuICAgICAgICAgICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImh0bWxcIilcbiAgICAgICAgICAgICAgICAgICAgfHwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpID09PSBjdHhGb3JtXG4gICAgICAgICAgICAgICAgICAgICYmICFDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY2IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjYi5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIChmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbbmFtZV0gPSBmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbbmFtZV0gfHwgW10pLnB1c2goY2IpO1xuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmFtZVRvR3JvdXBbbmFtZV0gPSBmb3JtQ2FjaGUubmFtZVRvR3JvdXBbbmFtZV0gfHwgZ2V0R3JvdXAoY2IpO1xuICAgICAgICAgICAgICAgICAgICArK2Zvcm1DYWNoZS5udW1DaGVja2JveGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHJhZGlvcyBpbiB0aGUgZm9ybSBvciBib2R5IChidXQgbm90IG5lc3RlZCBpbiBzb21ldGhpbmcgZWxzZSBhbmQgbm90IGhpZGRlbilcbiAgICAgICAgICAgIC8vIGxldCByYWRpb3NRID0gY3R4Rm9ybS5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbdHlwZT1yYWRpb11cIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCByYWRpb3NRLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gcmFkaW9zUVtpZHhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhZEN0eCA9IChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHIsIFwiZm9ybVwiKVxuICAgICAgICAgICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImh0bWxcIilcbiAgICAgICAgICAgICAgICAgICAgfHwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChyYWRDdHggPT09IGN0eEZvcm1cbiAgICAgICAgICAgICAgICAgICAgJiYgIUNvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gci5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIChmb3JtQ2FjaGUucmFkaW9zQnlOYW1lW25hbWVdID0gZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtuYW1lXSB8fCBbXSkucHVzaChyKTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdID0gZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdIHx8IGdldEdyb3VwKHIpO1xuICAgICAgICAgICAgICAgICAgICArK2Zvcm1DYWNoZS5udW1SYWRpb3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGN0eEZvcm0sIFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsIGZvcm1DYWNoZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLy8vLy8vLy8vLy8vIENhbGN1bGF0ZWQgZXZlcnl0aGluZywgbm93IGNoZWNrIHRoZSB2YXJpb3VzIGNhc2VzXG5cbiAgICAgICAgY29uc3QgY3R4TmFtZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgIGNvbnN0IGN0eEdyb3VwID0gZ2V0R3JvdXAocnVsZUNvbnRleHQpO1xuICAgICAgICBjdHhUeXBlID0gY3R4VHlwZSA9PT0gXCJyYWRpb1wiID8gXCJSYWRpb1wiIDogXCJDaGVja2JveFwiO1xuXG4gICAgICAgIGlmICghY3R4TmFtZSB8fCBjdHhOYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBwcm9jZXNzIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIGlzIG5vdCBuYW1lZFxuICAgICAgICAgICAgaWYgKGN0eFR5cGUgPT09IFwiUmFkaW9cIikge1xuICAgICAgICAgICAgICAgIC8vIFJhZGlvcyB3aXRob3V0IG5hbWVzIGRvbid0IGFjdCBsaWtlIGdyb3Vwcywgc28gZG9uJ3QgZW5mb3JjZSBncm91cGluZ1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX3JhZGlvbm9uYW1lXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19ncm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIGFuIHVubmFtZWQgY2hlY2tib3hcbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbXCJcIl0gfHwgW10pLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3VubmFtZWRjaGVja2JveFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19sb25lbm9ncm91cFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19ncm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ29uc2lkZXJpbmcgYSBuYW1lZCBjaGVja2JveFxuICAgICAgICAgICAgY29uc3QgbnVtUmFkaW9zV2l0aE5hbWUgPSAoZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtjdHhOYW1lXSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID0gKGZvcm1DYWNoZS5jaGVja2JveEJ5TmFtZVtjdHhOYW1lXSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgLy8gQ2FwaXRhbGl6ZSB0aGUgaW5wdXQgdHlwZSBmb3IgbWVzc2FnZXNcbiAgICAgICAgICAgIGlmIChudW1SYWRpb3NXaXRoTmFtZSA+IDAgJiYgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBuYW1pbmcgbWlzbWF0Y2ggYmV0d2VlbiBkaWZmZXJlbnQgY29udHJvbHNcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2NvbnRyb2xuYW1lbWlzbWF0Y2hcIiwgW2N0eFR5cGUsIGN0eFR5cGUgPT09IFwiY2hlY2tib3hcIiA/IFwicmFkaW9cIiA6IFwiY2hlY2tib3hcIiwgY3R4TmFtZV0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHhUeXBlID09PSBcIlJhZGlvXCIgJiYgKGZvcm1DYWNoZS5udW1SYWRpb3MgPT09IDEgfHwgbnVtUmFkaW9zV2l0aE5hbWUgPT09IDEpXG4gICAgICAgICAgICAgICAgfHwgY3R4VHlwZSA9PT0gXCJDaGVja2JveFwiICYmIGZvcm1DYWNoZS5udW1DaGVja2JveGVzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGxvbmUgY29udHJvbCAoZWl0aGVyIG9ubHkgY29udHJvbCBvZiB0aGlzIHR5cGUgb24gdGhlIHBhZ2UsIG9yIGEgcmFkaW8gYnV0dG9uIHdpdGhvdXQgYW55IG90aGVycyBieSB0aGF0IG5hbWUpXG4gICAgICAgICAgICAgICAgLy8gV2UgcGFzcyB0aGlzIGNvbnRyb2wgaW4gYWxsIGNhc2VzXG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfbG9uZW5vZ3JvdXBcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2dyb3VwZWRcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0eFR5cGUgPT09IFwiQ2hlY2tib3hcIiAmJiBmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcyA+IDEgJiYgbnVtQ2hlY2tib3hlc1dpdGhOYW1lID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBvbmx5IG9uZSBjaGVja2JveCB3aXRoIHRoaXMgbmFtZSwgYnV0IHRoZXJlIGFyZSBvdGhlciBjaGVja2JveGVzIGluIHRoZSBmb3JtLlxuICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBncm91cGVkLCBhc2sgdGhlbSB0byBleGFtaW5lIGl0XG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xvbmVjaGVja2JveFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugc2hhcmUgYSBuYW1lIHdpdGggYW5vdGhlciBzaW1pbGFyIGNvbnRyb2wuIEFyZSB3ZSBncm91cGVkIHRvZ2V0aGVyP1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybUNhY2hlLm5hbWVUb0dyb3VwW2N0eE5hbWVdICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgZ3JvdXBlZCwgYnV0IHNvbWUgY29udHJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgaW4gYSBncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub3Rncm91cGVkb3RoZXJncm91cGVkXCIsIFtjdHhUeXBlLCBjdHhOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb25lIG9mIHVzIGFyZSBncm91cGVkXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vdGdyb3VwZWRvdGhlcm5vdGdyb3VwZWRcIiwgW2N0eFR5cGUsIGN0eE5hbWVdKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtQ2FjaGUubmFtZVRvR3JvdXBbY3R4TmFtZV0gIT09IGN0eEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBpbiB0aGUgbWFpbiBncm91cCB3aXRoIHRoZSBvdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub3RzYW1lZ3JvdXBcIiwgW2N0eFR5cGUsIGN0eE5hbWVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBhbGwgZ3JvdXBlZCB1cCFcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19ncm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfZmllbGRzX2dyb3VwZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfZmllbGRzX2dyb3VwZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dCwgZG9tOnRleHRhcmVhLCBkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfSW5GaWVsZFNldFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9maWVsZHNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaW5wdXRfZmllbGRzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2ZpZWxkc19ncm91cGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJVc2UgdGhlIDxmaWVsZHNldD4gZWxlbWVudCB0byBncm91cCBsb2dpY2FsbHkgcmVsYXRlZCBpbnB1dCBlbGVtZW50c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkdyb3VwcyBvZiBsb2dpY2FsbHkgcmVsYXRlZCBpbnB1dCBlbGVtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIHdpdGhpbiBhIDxmaWVsZHNldD4gZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGZvciBvdGhlciBpbnB1dCB0eXBlcyBvciBpZiB3ZSdyZSBpbiBhIGZpZWxkc2V0XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJmaWxlXCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImZpZWxkc2V0XCIpICE9IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG5cbiAgICAgICAgLy8gTm8gZmllbGRzZXQgLSBzZWUgaWYgdGhpcyBpbnB1dCBpcyBhbGwgYnkgaXRzZWxmIC0gbm8gbmVlZCB0byBncm91cCBzaW5nbGUgaW5wdXRzXG4gICAgICAgIGxldCBwYXJlbnQgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJmb3JtXCIsIFwiYm9keVwiXSk7XG4gICAgICAgIGxldCBjaGVja1R5cGVzID0gW1wiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiXTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY2hlY2tUeXBlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IGNvbnRyb2xzID0gcGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGNoZWNrVHlwZXNbaV0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IHBhc3NlZCAmJiBqIDwgY29udHJvbHMubGVuZ3RoOyArK2opIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY29udHJvbHNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0ZXh0YXJlYXMgYW5kIHNlbGVjdHMgd2lsbCBiZSBjYWxsZWQgdHlwZT0ndGV4dCdcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGNvbnRyb2xzW2pdLmhhc0F0dHJpYnV0ZShcInR5cGVcIikgPyBjb250cm9sc1tqXS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCkgOiBcInRleHRcIjtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGZhaWwgaWYgdGhpcyBpcyBhbm90aGVyIGNvbnRyb2wgaW4gdGhlIGZvcm0gYW5kIGl0cyB0eXBlIGlzIGFub3RoZXIgdGV4dC1saWtlIGlucHV0XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gY29udHJvbHNbal0gPT0gcnVsZUNvbnRleHQgfHwgKHR5cGUgIT0gXCJ0ZXh0XCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIgJiYgdHlwZSAhPSBcImZpbGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9oYXNwb3B1cF9jb25mbGljdDogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0W2xpc3RdW2FyaWEtaGFzcG9wdXBdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJpbnB1dF9oYXNwb3B1cF9pbnZhbGlkXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfdHlwZV9taXN1c2VcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJwb3RlbnRpYWxfbWlzdXNlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCI6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbWlzdXNlXCI6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3QuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbGlzdF9ub3RleGlzdFwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX2xpc3RfdHlwZVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX2xpc3RfZWxlbVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCI8aW5wdXQ+IGVsZW1lbnQgd2l0aCBhICdsaXN0JyBhdHRyaWJ1dGUgc2hvdWxkIG5vdCB1c2UgYW4gZXhwbGljaXQgJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCB3aXRoIGEgJ2xpc3QnIGF0dHJpYnV0ZSBkb2VzIG5vdCB1c2UgYW4gZXhwbGljaXQgJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfdHlwZV9taXN1c2VcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IHdpdGggdHlwZSBcXFwiezB9XFxcIiBhbmQgJ2xpc3QnIGF0dHJpYnV0ZSB1c2VzIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX21pc3VzZVwiOiBcIlRoZSA8aW5wdXQ+IGVsZW1lbnQgd2l0aCBhIG1pc3Npbmcgb3IgaW52YWxpZCB0eXBlIGFuZCAnbGlzdCcgYXR0cmlidXRlIHVzZXMgYW4gZXhwbGljaXQgJ2FyaWEtaGFzcG9wdXAnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbGlzdF9ub3RleGlzdFwiOiBcIlRoZSBsaXN0IGF0dHJpYnV0ZSBmb3IgdGhlIDxpbnB1dD4gZWxlbWVudCBpcyBpbnZhbGlkXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X3R5cGVcIjogXCJUaGUgbGlzdCBhdHRyaWJ1dGUgZm9yIHRoZSA8aW5wdXQ+IGVsZW1lbnQgd2l0aCB0aGUgdHlwZSBcXFwiezB9XFxcIiBpcyBpbnZhbGlkXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X2VsZW1cIjogXCJUaGUgbGlzdCBhdHRyaWJ1dGUgZm9yIHRoZSA8aW5wdXQ+IGVsZW1lbnQgZG9lcyBub3QgcmVmZXJlbmNlIGEgZGF0YWxpc3QgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgaWYgdGhlIGZpZWxkc2V0IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIC8vIGxldCBcImFyaWFfcm9sZV92YWxpZFwiIHRvIGhhbmRsZSBpbnZhbGlkIHJvbGUuIE9ubHkgYWxsb3dlZCByb2xlIGlzIGNvbWJvYm94IHdoaWNoIGlzIGltcGxpY2l0LiBcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDAgJiYgIXJvbGVzLmluY2x1ZGVzKCdjb21ib2JveCcpKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgICAgICAgIFxuXG4gICAgICAgIC8vdHJpZ2dlcmluZyBpbnB1dCB0eXBlczogdGV4dCwgc2VhcmNoLCB0ZWwsIHVybCwgZW1haWwsIG9yIG1pc3Npbmcgb3IgaW52YWxpZCBcbiAgICAgICAgbGV0IHllc1R5cGVzID0gW1widGV4dFwiLCBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsIFwiZGF0ZVwiLCBcIm1vbnRoXCIsIFwid2Vla1wiLCBcInRpbWVcIiwgXCJkYXRldGltZS1sb2NhbFwiLCBcIm51bWJlclwiLCBcInJhbmdlXCIsIFwiY29sb3JcIl07XG4gICAgICAgIGxldCBub1R5cGVzID0gW1wiZmlsZVwiLCBcInBhc3N3b3JkXCIsIFwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLCBcInN1Ym1pdFwiLCBcInJlc2V0XCIsIFwiaW1hZ2VcIiwgXCJoaWRkZW5cIiwgXCJidXR0b25cIl07XG5cbiAgICAgICAgbGV0IGF0dHJWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgIC8vbWlzc2luZyBpbnB1dCB0eXBlIGZvciBsaXN0IGJ1dCB3aXRoIGFyaWFfaGFzX3BvcHVwXG4gICAgICAgIGlmICghYXR0clZhbHVlIHx8IGF0dHJWYWx1ZS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbWlzdXNlXCIpO1xuXG4gICAgICAgIGF0dHJWYWx1ZSA9IGF0dHJWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy9pbnZhbGlkIGlucHV0IHR5cGVzIGZvciBsaXN0IGJ1dCB3aXRoIGFyaWFfaGFzX3BvcHVwXG4gICAgICAgIGlmICgheWVzVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSAmJiAhbm9UeXBlcy5pbmNsdWRlcyhhdHRyVmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbWlzdXNlXCIpO1xuXG4gICAgICAgIC8vIHRoZSBsaXN0IGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB3cm9uZyBpbnB1dCB0eXBlXG4gICAgICAgIGlmIChhdHRyVmFsdWUgJiYgbm9UeXBlcy5pbmNsdWRlcyhhdHRyVmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbnZhbGlkX2xpc3RfdHlwZVwiKTtcblxuICAgICAgICBsZXQgbGlzdCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxpc3RcIik7XG4gICAgICAgIC8vIHRoZSBsaXN0IGF0dHJpYnV0ZSBpcyBibGFua1xuICAgICAgICBpZiAoIWxpc3QgfHwgbGlzdC50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbGlzdF9ub3RleGlzdFwiKTtcblxuICAgICAgICBsZXQgbGlzdEVsZW0gPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxpc3QpO1xuICAgICAgICAvLyB0aGUgbGlzdCBlbGVtZW50IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgaWYgKCFsaXN0RWxlbSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcInBvdGVudGlhbF9saXN0X25vdGV4aXN0XCIpO1xuXG4gICAgICAgIC8vIHRoZSBsaXN0IGVsZW1lbnQgaXMgbm90IGEgZGF0YWxpc3QgZWxlbWVudFxuICAgICAgICBpZiAobGlzdEVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ2RhdGFsaXN0JylcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZF9saXN0X2VsZW1cIik7XG5cbiAgICAgICAgLy8gdmFsaWQgaW5wdXQgdHlwZXMgZm9yIGxpc3QgYnV0IHdpdGggYXJpYV9oYXNfcG9wdXAgICAgXG4gICAgICAgIGlmICh5ZXNUeXBlcy5pbmNsdWRlcyhhdHRyVmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdHlwZV9taXN1c2VcIiwgW2F0dHJWYWx1ZV0pO1xuICAgICAgICBcbiAgICAgICAgLy8gc2hvdWxkbid0IGdldCBoZXJlIFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfbGFiZWxfYWZ0ZXI6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfbGFiZWxfYWZ0ZXJcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0xhYmVsQWZ0ZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9hZnRlci5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImlucHV0X2xhYmVsX2FmdGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9sYWJlbF9hZnRlci5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbiBpcyBuZXN0ZWQgaW4gbGFiZWwsIHNvIGxhYmVsIGlzIG5vdCBhZnRlciB0aGUgaW5wdXQgY29udHJvbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJMYWJlbCB0ZXh0IGlzIGxvY2F0ZWQgYmVmb3JlIGl0cyBhc3NvY2lhdGVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ2hlY2tib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyBtdXN0IGhhdmUgYSBsYWJlbCBhZnRlciB0aGUgaW5wdXQgY29udHJvbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSlcbiAgICAgICAgICAgIHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0eXBlICE9IFwiY2hlY2tib3hcIiAmJiB0eXBlICE9IFwicmFkaW9cIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgb25seSB0aGUgbm9uLWhpZGRlbiBsYWJlbHMgZm9yIGVsZW1lbnRcbiAgICAgICAgbGV0IGxhYmVsRWxlbSA9IENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgaWYgKGxhYmVsRWxlbSA9PT0gbnVsbCB8fCAhQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgLy8gRHVlIHRvIGRlcGVuZGVuY3ksIGxhYmVsIG11c3QgYmUgZG9uZSB2aWEgdGl0bGUgLSB0aGlzIHJ1bGUgZG9lc24ndCBhcHBseVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlID0gQ29tbW9uVXRpbC5jb21wYXJlTm9kZU9yZGVyKGxhYmVsRWxlbSwgcnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAodmFsdWUgPT09IC0yKSB7XG4gICAgICAgICAgICAvLyBpbnB1dCBuZXN0ZWQgaW4gbGFiZWxcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IHdhbGtOb2RlID0gbmV3IERPTVdhbGtlcihsYWJlbEVsZW0pO1xuICAgICAgICAgICAgd2Fsa05vZGUubm9kZSA9IHJ1bGVDb250ZXh0O1xuICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgd2Fsa05vZGUubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgod2Fsa05vZGUubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcIiN0ZXh0XCIgJiYgd2Fsa05vZGUubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHx8ICh3YWxrTm9kZS5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3BhblwiICYmIHdhbGtOb2RlLm5vZGUudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gSW5wdXQgbmVzdGVkIGluIGxhYmVsIGFuZCB0ZXh0IGJlZm9yZSBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gbGFiZWwgaXMgYmVmb3JlIGlucHV0XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfbGFiZWxfYmVmb3JlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX2JlZm9yZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0LCBkb206dGV4dGFyZWEsIGRvbTpzZWxlY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9MYWJlbEJlZm9yZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX2JlZm9yZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRleHQgaW5wdXQgaXMgbmVzdGVkIGluIGxhYmVsIHN1Y2ggdGhhdCBpbnB1dCBwcmVjZWRlcyB0aGUgbGFiZWwgdGV4dFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJMYWJlbCB0ZXh0IGlzIGxvY2F0ZWQgYWZ0ZXIgaXRzIGFzc29jaWF0ZWQgdGV4dCBpbnB1dCBvciA8c2VsZWN0PiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGV4dCBpbnB1dHMgYW5kIDxzZWxlY3Q+IGVsZW1lbnRzIG11c3QgaGF2ZSBhIGxhYmVsIGJlZm9yZSB0aGUgaW5wdXQgY29udHJvbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbnB1dFwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGUgIT0gXCJ0ZXh0XCIgJiYgdHlwZSAhPSBcImZpbGVcIiAmJiB0eXBlICE9IFwicGFzc3dvcmRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IG9ubHkgdGhlIG5vbi1oaWRkZW4gbGFiZWxzIGZvciBlbGVtZW50XG4gICAgICAgIGxldCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAobGFiZWxFbGVtID09IG51bGwgfHwgIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGxhYmVsRWxlbSkpIHtcbiAgICAgICAgICAgIC8vIER1ZSB0byBkZXBlbmRlbmN5LCBsYWJlbCBtdXN0IGJlIGRvbmUgdmlhIHRpdGxlIC0gdGhpcyBydWxlIGRvZXNuJ3QgYXBwbHlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlID0gQ29tbW9uVXRpbC5jb21wYXJlTm9kZU9yZGVyKGxhYmVsRWxlbSwgcnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAodmFsdWUgPT09IC0yKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgaWYgbm8gbGFiZWwgb3IgdGhlIGNvbnRlbnQgZm9yIHRoZSBsYWJlbCBpcyBvbmx5IGZyb20gdGhlIG5lc3RlZCBpbnB1dCBjb250cm9sIFxuICAgICAgICAgICAgbGV0IHRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmIENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCkgPT09IHRleHQudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gRHVlIHRvIGRlcGVuZGVuY3ksIGxhYmVsIG11c3QgYmUgZG9uZSB2aWEgdGl0bGUgLSB0aGlzIHJ1bGUgZG9lc24ndCBhcHBseVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbnB1dCBuZXN0ZWQgaW4gbGFiZWxcbiAgICAgICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCB3YWxrTm9kZSA9IHJ1bGVDb250ZXh0LnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gKCh3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiI3RleHRcIiAmJiB3YWxrTm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHx8ICh3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwic3BhblwiICYmIHdhbGtOb2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIElucHV0IG5lc3RlZCBpbiBsYWJlbCBhbmQgdGV4dCBhZnRlciBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIGxhYmVsIGlzIGFmdGVyIGlucHV0XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhdmVuJ3QgcmV0dXJuZWQgeWV0LCB0aGVuIEkgcGFzc1xuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9sYWJlbF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6Y2hlY2tib3gsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOnJhZGlvLGFyaWE6c2VhcmNoYm94LGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnN3aXRjaCxhcmlhOnRleHRib3gsYXJpYTpwcm9ncmVzc2Jhcixkb206aW5wdXRbdHlwZT1maWxlXSxkb206b3V0cHV0LGRvbTptZXRlcixkb206aW5wdXRbdHlwZT1wYXNzd29yZF1cIixcbiAgICAvL2RlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3JlZHVuZGFudFwiLCBcImFyaWFfcm9sZV92YWxpZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9FeHBsaWNpdExhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfbGFiZWxfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRm9ybSBjb250cm9sIGVsZW1lbnQgPHswfT4gaGFzIG5vIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRm9ybSBjb250cm9sIHdpdGggXFxcInswfVxcXCIgcm9sZSBoYXMgbm8gYXNzb2NpYXRlZCBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZm9ybSBjb250cm9sIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgLyogcmVtb3ZlIDEuMS4xIG1hcHBpbmcsIGtlZXAgNC4xLjIgKi9cbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBodHRwczovL2dpdGh1Yi5jb20vSUJNYS9lcXVhbC1hY2Nlc3MvaXNzdWVzLzc1NlxuICAgIGFjdDogW1wiOTdhNGUxXCIsIFwiZTA4NmU1XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgaW5wdXQgdHlwZVxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImJ1dHRvblwiIHx8IEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJidXR0b25cIikpIHtcbiAgICAgICAgICAgIHR5cGUgPSBcImJ1dHRvbmVsZW1cIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJpbnB1dFwiICYmIHR5cGUgPT0gXCJcIikge1xuICAgICAgICAgICAgdHlwZSA9IFwidGV4dFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZWQgYnkgaW5wdXRfbGFiZWxfZXhpc3RzSW1hZ2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4vKiogXG4gICAgICAgIGxldCBQT0YgPSAtMTtcbiAgICAgICAgbGV0IHRleHRUeXBlcyA9IENvbW1vblV0aWwuaW5wdXRfdGV4dF90eXBlcztcbiAgICAgICAgbGV0IGJ1dHRvblR5cGVzID0gQ29tbW9uVXRpbC5mb3JtX2J1dHRvbl90eXBlczsgIFxuICAgICAgIFxuICAgICAgICBsZXQgYnV0dG9uVHlwZXNXaXRoRGVmYXVsdHMgPSBbXCJyZXNldFwiLCBcInN1Ym1pdFwiXTsgLy8gJ3N1Ym1pdCcgYW5kICdyZXNldCcgaGF2ZSB2aXNpYmxlIGRlZmF1bHRzLlxuICAgICAgICBpZiAodGV4dFR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSB7IC8vIElmIHR5cGUgaXMgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudHMsIGluIHRoZSBjYXNlIHRoYXQgYSBsYWJlbCBpcyBoaWRkZW4gdGhlbiBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgICAgICAgLy8gTm90ZTogbGFiZWxbZm9yXSBkb2VzIG5vdCB3b3JrIGZvciBBUklBIGRlZmluZWQgaW5wdXRzXG4gICAgICAgICAgICBsZXQgbGFiZWxFbGVtID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSA/IG51bGwgOiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICBsZXQgaGFzTGFiZWxFbGVtQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGxhYmVsRWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpIHx8IFwiXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFiZWxFbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxsZWRCeUVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChsYWJlbEVsZW0sIGxhYmVsRWxlbS5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsbGVkQnlFbGVtICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsbGVkQnlFbGVtLCBsYWJlbEVsZW0pICYmIENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KGxhYmVsbGVkQnlFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzTGFiZWxFbGVtQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXNzZWQgPSAoISFsYWJlbEVsZW0gJiYgaGFzTGFiZWxFbGVtQ29udGVudCkgfHxcbiAgICAgICAgICAgICAgICAoIWxhYmVsRWxlbSAmJiBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwicGxhY2Vob2xkZXJcIikpIHx8XG4gICAgICAgICAgICAgICAgQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMCB8fCBDb21tb25VdGlsLmhhc0ltcGxpY2l0TGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMuaW5kZXhPZih0eXBlKTtcbiAgICAgICAgICAgIFxuICAgICAgICB9IGVsc2UgaWYgKGJ1dHRvblR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xKSB7IC8vIElmIHR5cGUgaXMgYSBidXR0b25cbiAgICAgICAgICAgIGlmIChidXR0b25UeXBlc1dpdGhEZWZhdWx0cy5pbmRleE9mKHR5cGUpICE9PSAtMSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICAvLyAnc3VibWl0JyBhbmQgJ3Jlc2V0JyBoYXZlIHZpc2libGUgZGVmYXVsdHMgc28gcGFzcyBpZiB0aGVyZSBpcyBubyAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidmFsdWVcIikgfHwgQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmluZGV4T2YodHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImJ1dHRvbmVsZW1cIikge1xuICAgICAgICAgICAgLy8gSWYgSSBhbSBhbiBpbWFnZSBhbmQgSSBoYXZlIGFsdCB0ZXh0IC0gYWNjZXNzaWJpbGl0eS13ZWItZW5naW5lIzI2OVxuICAgICAgICAgICAgbGV0IGJBbHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgaWYgKGFsdC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJBbHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBiQWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpIHx8IEFyaWFVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgYkFsdCB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5sZW5ndGggKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBhIG5hdGl2ZSBidXR0b24gaXMgbGFiZWxsZWRcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmhhc0ltcGxpY2l0TGFiZWwocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbCAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbCkpXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7ICAgIFxuICAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBScHRfQXJpYV9WYWxpZElkUmVmIGRldGVybWluZXMgaWYgdGhlIGFyaWEtbGFiZWxsZWRieSBpZCBwb2ludHMgdG8gYSB2YWxpZCBlbGVtZW50XG4gICAgICAgIGlmICghcGFzc2VkICYmIChidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSkpIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSA9PSBcImRpaml0T2ZmU2NyZWVuXCIgJiYgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpLmhhc0F0dHJpYnV0ZShcIndpZGdldGlkXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgZGlqaXQgYnV0dG9uc1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElkID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpLmdldEF0dHJpYnV0ZShcIndpZGdldGlkXCIpICsgXCJfbGFiZWxcIjtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgbGFiZWxJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWwpO1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIEkgZmFpbGVkIGFib3ZlIGFsc29cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgNCArIGJ1dHRvblR5cGVzLmluZGV4T2YodHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJvcHRncm91cFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxhYmVsXCIpO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBub2RlTmFtZSA9PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICAvLyBJcyBhIG5vbi1lbXB0eSB2YWx1ZSBhdHRyaWJ1dGUgYWxzbyBlbm91Z2ggZm9yIGFuIG9wdGlvbiBlbGVtZW50P1xuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsYWJlbFwiKSB8fCBydWxlQ29udGV4dC5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5sZW5ndGggKyAzO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgaWYgKCFwYXNzZWQpXG4gICAgICAgICAgICBwYXNzZWQgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPiAwIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBhcmlhIHJvbGUgdG8gZmlndXJlIG91dCBpZiB0aGUgYWNjZXNzaWJsZSBuYW1lIGNhbiBiZSBmcm9tIGNvbnRlbnQgXG4gICAgICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIC8vd2hlbiBtdWx0aXBsZSByb2xlcyBzcGVjaWZpZWQsIG9ubHkgdGhlIGZpcnN0IHZhbGlkIHJvbGUgKGd1YXJhbnRlZWQgYnkgZGVwZW5kZW5jaWVzKSBpcyBhcHBsaWVkLCBhbmQgdGhlIG90aGVycyBqdXN0IGFzIGZhbGxiYWNrc1xuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV0gJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXS5uYW1lRnJvbSAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbMF1dLm5hbWVGcm9tLmluY2x1ZGVzKFwiY29udGVudHNcIikpXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICB9XG4qL1xuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgcGFzc2VkID0gcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfbGFiZWxfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpjaGVja2JveCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnVpdGVtY2hlY2tib3gsYXJpYTptZW51aXRlbXJhZGlvLGFyaWE6cmFkaW8sYXJpYTpzZWFyY2hib3gsYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6c3dpdGNoLGFyaWE6dGV4dGJveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiaW5wdXRfbGFiZWxfZXhpc3RzXCJdLCBcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9WaXNpYmxlTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX25vX2xhYmVsXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9wbGFjZWhvbGRlcl9vbmx5XCI6IFwicG90ZW50aWFsX3BsYWNlaG9sZGVyX29ubHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaW5wdXRfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9wbGFjZWhvbGRlcl9vbmx5XCI6IFwiaW5wdXRfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ub19sYWJlbFwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGlucHV0IGVsZW1lbnQgaGFzIGFuIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiOiBcIlRoZSDigJhwbGFjZWhvbGRlcuKAmSBpcyB0aGUgb25seSB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ub19sYWJlbFwiOiBcIlRoZSBpbnB1dCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gaW5wdXQgZWxlbWVudCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCB2aXNpYmxlIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjUuM1wiLCBcIjMuMy4yXCJdLCAvL21hcCB0byBib3RoIHJlcXVpcmVtZW50cyBpbiBoZWxwXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlmIGEgY29udHJvbCBpcyBpbiBhIHRhYmxlIGNlbGwsIHRoZSBjb2wgaGVhZGVycyBjYW4gYWN0IGFzIHZpc2libGUgbGFiZWwsIHdoaWNoIGlzIGNoZWNrZWQgaW4gdGFibGUgaGVhZGluZyBydWxlXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gY3VzdG9tIHdpZGdldCBzdWJtaXNzaW9uIGlzIG5vdCBpbiBzY29wZSBmb3IgdGhpcyBzdWNjZXNzIGNyaXRlcmlhIChJQk1hL2VxdWFsLWFjY2VzcyMyMDQpIGlmIGl0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggZGF0YSBlbnRyeVxuICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChyb2xlICYmIHJvbGUgPT09IFwiYnV0dG9uXCIgJiYgbm9kZU5hbWUgIT09ICdpbnB1dCcgJiYgbm9kZU5hbWUgIT09ICdidXR0b24nKSB7ICAgIFxuICAgICAgICAgICAgLy8gbGlrZWx5IGEgY3VzdG9tIHdpZGdldCwgc2tpcCBpZiBub3QgYXNzb2NpYXRlZCB3aXRoIGRhdGEgZW50cnlcbiAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJmb3JtXCIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gaW4gYSBjb21ib2JveCwgb25seSBsb29rIGF0IHRoZSBpbnB1dCB0ZXh0Ym94LlxuICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSAmJlxuICAgICAgICAgICAgIShBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSB8fCBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwic2VhcmNoYm94XCIpIHx8XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCAobm9kZU5hbWUgPT09IFwic2VsZWN0XCIgJiYgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGF2b2lkIGRpYWdub3NpbmcgdGhlIHBvcHVwIGxpc3Qgb2YgYSBjb21ib2JveC5cbiAgICAgICAgbGV0IHJvbGVzVG9DaGVjayA9IFtcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlc1RvQ2hlY2subGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIHJvbGVzVG9DaGVja1tqXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tYm9ib3hlcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4ocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbWJvYm94ZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ID0gY29tYm9ib3hlc1trXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFfb3ducyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudEF0dHJpYnV0ZShjb21ib2JveCwgXCJhcmlhLW93bnNcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmlhX293bnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25zID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGFyaWFfb3ducy50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBvd25zW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWQgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIC8vIGNoZWNrIHZpc2libGUgbGFiZWwgZm9yIGlucHV0IG9yIGJ1dHRvblxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgfHwgbm9kZU5hbWUgPT09ICdidXR0b24nKSB7XG4gICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwICYmIChwYWlyLm5hbWVGcm9tID09PSAnbGFiZWwnIHx8IHBhaXIubmFtZUZyb20gPT09ICdpbnRlcm5hbCcgfHwgcGFpci5uYW1lRnJvbSA9PT0gJ2FsdCcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBhbiBhbHRlcm5hdGl2ZSB0b29sdGlwIGV4aXN0cyB0aGF0IGNhbiBiZSBtYWRlIHZpc2libGUgdGhyb3VnaCBtb3VzZW92ZXJcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCAmJiAocGFpci5uYW1lRnJvbSA9PT0gJ3RleHQnIHx8IHBhaXIubmFtZUZyb20gPT09ICd0aXRsZScpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICAvLyBjaGVjayBpZiBhbnkgdmlzaWJsZSB0ZXh0IGZyb20gdGhlIGNvbnRyb2wuIFxuICAgICAgICAvLyBub3RlIHRoYXQgKDEpIHRoZSB0ZXh0IGRvZXNu4oCZdCBuZWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udHJvbCB0byBmb3JtIGEgcmVsYXRpb25zaGlwXG4gICAgICAgIC8vICAoMikgdGhlIHRleHQgZG9lc24ndCBuZWVkIHRvIGZvbGxvdyBhY2Nlc3NpYmxlIG5hbWUgcmVxdWlyZW1lbnQgKGUuZy4gbmFtZUZyb20pXG4gICAgICAgIGNvbnN0IHRleHQgPSBDb21tb25VdGlsLmdldE9uU2NyZWVuSW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHRleHQgJiYgdGV4dC5sZW5ndGggIT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICBcbiAgICAgICAgLy8gY2hlY2sgaWYgYW55IGRlc2NlbmRhbnQgd2l0aCBhbiBhbHRlcm5hdGl2ZSB0b29sdGlwIHRoYXQgY2FuIGJlIG1hZGUgdmlzaWJsZSB0aHJvdWdoIG1vdXNlb3ZlclxuICAgICAgICAvLyBvbmx5IGNvbnNpZGVyIGltZyBhbmQgc3ZnLCBhbmQgb3RoZXIgdGV4dCBjb250ZW50IG9mIHRoZSBkZXNjZW5kYW50IGlzIGNvdmVyZWQgaW4gdGhlIGlzSW5uZXJUZXh0IGFib3ZlICBcbiAgICAgICAgbGV0IGRlc2NlbmRhbnRzID0gQXJpYVV0aWwuZ2V0QWxsRGVzY2VuZGFudHNXaXRoUm9sZXMocnVsZUNvbnRleHQsIFtcImltZ1wiLCBcImdyYXBoaWNzLWRvY3VtZW50XCIsIFwiZ3JhcGhpY3Mtb2JqZWN0XCIsIFwiZ3JhcGhpY3Mtc3ltYm9sXCJdLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChkZXNjZW5kYW50cyAmJiBkZXNjZW5kYW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkPTA7IGQgPCBkZXNjZW5kYW50cy5sZW5ndGg7IGQrKykge1xuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGRlc2NlbmRhbnRzW2RdLCBcInRpdGxlXCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZGVzY2VuZGFudHNbZF0sIFwiYWx0XCIpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB2aXNpYmxlIGxhYmVsIHBvaW50ZWQgdG8gYnkgdGhlIGFyaWEtbGFiZWxsZWRieSBhdHRyaWJ1dGUuXG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbGV0IHRoZUxhYmVsID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICAgICAgICAgICAgbGV0IGxhYmVsVmFsdWVzID0gdGhlTGFiZWwuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGFiZWxWYWx1ZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudEJ5SWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgbGFiZWxWYWx1ZXNbal0pO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50QnlJZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShlbGVtZW50QnlJZCwgcnVsZUNvbnRleHQpICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50QnlJZCkgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4oZWxlbWVudEJ5SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgobm9kZU5hbWUgPT09IFwib3B0Z3JvdXBcIiB8fCBub2RlTmFtZSA9PSBcIm9wdGlvblwiKSAmJiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwICYmIChwYWlyLm5hbWVGcm9tID09PSAnbGFiZWwnIHx8IHBhaXIubmFtZUZyb20gPT09ICdjb250ZW50JykpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyByZWZlcmVuY2VkIGJ5IGEgY29tYm9ib3guIElmIHNvLCB0aGUgbGFiZWwgYmVsb25ncyB0byB0aGUgY29tYm9ib3hcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGlmIChpZCAmJiBpZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihgKlthcmlhLWNvbnRyb2xzPScke2lkfSddW3JvbGU9J2NvbWJvYm94J11gKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYSBwbGFjZWhvbGRlciBleGlzdHMgZXZlbiB0aG91Z2ggYSBwbGFjZWhvbGRlciB0ZXh0IGlzIG5vdCBzdWZmaWNpZW50IGFzIGEgdmlzaWJsZSB0ZXh0XG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInBsYWNlaG9sZGVyXCIpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiKTtcblxuICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9ub19sYWJlbFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfb25jaGFuZ2VfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X29uY2hhbmdlX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0W29uY2hhbmdlXSwgZG9tOnRleHRhcmVhW29uY2hhbmdlXSwgZG9tOnNlbGVjdFtvbmNoYW5nZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9IYXNPbmNoYW5nZVwiOiB7XG4gICAgICAgICAgICAvLyBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfd2FybmluZ1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImlucHV0X29uY2hhbmdlX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF93YXJuaW5nXCI6IFwiaW5wdXRfb25jaGFuZ2VfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZXJzIG11c3QgYmUgYWR2aXNlZCBpZiwgZHVlIHRvIGEgY2hhbmdlIG9mIGVsZW1lbnQgdmFsdWUsIGEgZm9ybSBhdXRvbWF0aWNhbGx5IHN1Ym1pdHMsIGEgbmV3IHdpbmRvdyBvcGVucywgb3IgYSBjaGFuZ2UgaW4gZm9jdXMgb2NjdXJzXCIsXG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJUaGUgdXNlciBpcyBhZHZpc2VkIG9mIHRoZSBhdXRvbWF0aWMgZm9ybSBzdWJtaXNzaW9uLCBuZXcgd2luZG93IG9wZW5pbmcsIG9yIGZvY3VzIGNoYW5nZVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfd2FybmluZ1wiOiBcIkNvbmZpcm0gdGhhdCB0aGUgdXNlciBpcyBhZHZpc2VkIGlmLCBkdWUgdG8gYSBjaGFuZ2Ugb2YgZWxlbWVudCB2YWx1ZSwgYSBmb3JtIGF1dG9tYXRpY2FsbHkgc3VibWl0cywgYSBuZXcgd2luZG93IG9wZW5zLCBvciBhIGNoYW5nZSBpbiBmb2N1cyBvY2N1cnNcIiAgICBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcImhpZGRlblwiIHx8IHR5cGUgPT09IFwic3VibWl0XCIgfHwgdHlwZSA9PT0gXCJpbWFnZVwiIHx8IHR5cGUgPT09IFwiYnV0dG9uXCIgfHwgdHlwZSA9PT0gXCJyZXNldFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfd2FybmluZ1wiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0W3BsYWNlaG9sZGVyXSwgZG9tOnRleHRhcmVhW3BsYWNlaG9sZGVyXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19JbnB1dF9QbGFjZWhvbGRlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiUG90ZW50aWFsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkhUTUw1IHBsYWNlaG9sZGVyIGlzIHRoZSBvbmx5IHZpc2libGUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJBZGRpdGlvbmFsIHZpc2libGUgbGFiZWwgcmVmZXJlbmNlZCBieSAnYXJpYS1sYWJlbGxlZGJ5JyBpcyBub3QgdmFsaWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIVE1MNSAncGxhY2Vob2xkZXInIGF0dHJpYnV0ZSBtdXN0IG5vdCBiZSB1c2VkIGFzIGEgdmlzaWJsZSBsYWJlbCByZXBsYWNlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIG1lcmdlIHRoZSBydWxlIGludG8gaW5wdXRfbGFiZWxfdmlzaWJsZVxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgICovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJoaWRkZW5cIiB8fCB0eXBlID09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaGlkZGVuXCIpKSB7XG4gICAgICAgICAgICBsZXQgaGlkZGVuID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaGlkZGVuXCIpO1xuICAgICAgICAgICAgaWYgKGhpZGRlbiA9PSBcIlwiIHx8IGhpZGRlbi50b0xvd2VyQ2FzZSgpID09IFwiaGlkZGVuXCIpIHsgLy8gd2hlbiBoaWRkZW4gaXMgZW1wdHkgaW4gdGhlIGVsZW1lbnQsIFwiXCIgaXMgcmV0dXJuZWQsIHNhbWUgYXMgaXQgaGFzIGEgdmFsdWUgb2YgXCJcIi5cbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICAgICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGxldCByZWZJZHMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikudHJpbSgpLnNwbGl0KC9cXHMrLyk7IC8vIHNlcGFyYXRlZCBieSBvbmUgb3IgbW9yZSB3aGl0ZSBzcGFjZXNcbiAgICAgICAgICAgIGlmICghcmVmSWRzLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBsYWJlbF9jb250ZW50X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJsYWJlbF9jb250ZW50X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxhYmVsXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0xhYmVsX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzX1JlZ3VsYXJcIjogXCJQYXNzX1JlZ3VsYXJcIixcbiAgICAgICAgICAgIFwiUGFzc19BcmlhTGFiZWxcIjogXCJQYXNzX0FyaWFMYWJlbFwiLFxuICAgICAgICAgICAgXCJQYXNzX0xhYmVsbGVkQnlcIjogXCJQYXNzX0xhYmVsbGVkQnlcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc19SZWd1bGFyXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzX0FyaWFMYWJlbFwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc19MYWJlbGxlZEJ5XCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzX1JlZ3VsYXJcIjogXCI8bGFiZWw+IGVsZW1lbnQgaGFzIGFjY2Vzc2libGUgbmFtZSB3aXRoIGlubmVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiUGFzc19BcmlhTGFiZWxcIjogXCI8bGFiZWw+IGVsZW1lbnQgaGFzIGFjY2Vzc2libGUgbmFtZSB2aWEgJ2FyaWEtbGFiZWwnXCIsXG4gICAgICAgICAgICBcIlBhc3NfTGFiZWxsZWRCeVwiOiBcIjxsYWJlbD4gZWxlbWVudCBoYXMgYWNjZXNzaWJsZSBuYW1lIHZpYSAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPGxhYmVsPiBlbGVtZW50IGRvZXMgbm90IGhhdmUgZGVzY3JpcHRpdmUgdGV4dCB0aGF0IGlkZW50aWZpZXMgdGhlIGV4cGVjdGVkIGlucHV0XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8bGFiZWw+IGVsZW1lbnQgbXVzdCBoYXZlIG5vbi1lbXB0eSBkZXNjcmlwdGl2ZSB0ZXh0IHRoYXQgaWRlbnRpZmllcyB0aGUgcHVycG9zZSBvZiB0aGUgaW50ZXJhY3RpdmUgY29tcG9uZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX1JlZ3VsYXJcIik7XG5cbiAgICAgICAgfSBlbHNlIGlmICgocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fCBcIlwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19BcmlhTGFiZWxcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JykpO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbEVsZW0sIHJ1bGVDb250ZXh0KSAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudChsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19MYWJlbGxlZEJ5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjb25zdCBsYWJlbF9uYW1lX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGFiZWxfbmFtZV92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmNoZWNrYm94LGFyaWE6Z3JpZGNlbGwsYXJpYTpsaW5rLGFyaWE6bWVudWl0ZW0sYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOm9wdGlvbixhcmlhOnJhZGlvLGFyaWE6c3dpdGNoLGFyaWE6dGFiLGFyaWE6dHJlZWl0ZW0sZG9tOmlucHV0LGRvbTp0ZXh0YXJlYSxkb206c2VsZWN0LGRvbTpvdXRwdXQsZG9tOm1ldGVyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjFfTGFiZWxfQWNjZXNzaWJsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImxhYmVsX25hbWVfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImxhYmVsX25hbWVfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGFiZWxfbmFtZV92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiQWNjZXNzaWJsZSBuYW1lIG1hdGNoZXMgb3IgY29udGFpbnMgdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJBY2Nlc3NpYmxlIG5hbWUgZG9lcyBub3QgbWF0Y2ggb3IgY29udGFpbiB0aGUgdmlzaWJsZSBsYWJlbCB0ZXh0XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWNjZXNzaWJsZSBuYW1lIG11c3QgbWF0Y2ggb3IgY29udGFpbiB0aGUgdmlzaWJsZSBsYWJlbCB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi41LjNcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogUmV2aWV3IGh0dHBzOi8vZ2l0aHViLmNvbS9hY3QtcnVsZXMvYWN0LXJ1bGVzLmdpdGh1Yi5pby9pc3N1ZXMvMTYxOFxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9XQUkvV0NBRzIxL1RlY2huaXF1ZXMvYXJpYS9BUklBMjRcbiAgICBhY3Q6IFwiMmVlOGI4XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFzcyBpZiB0aGUgdmlzaWJsZSB0ZXh0IHVzZXMgTWF0ZXJpYWwgSWNvbiBmb250XG4gICAgICAgIGlmIChDU1NVdGlsLmlzTWF0ZXJpYWxJY29uRm9udChydWxlQ29udGV4dCkpIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgbGV0IGlzSW5wdXRCdXR0b24gPSBmYWxzZTtcbiAgICAgICAgLy9sZXQgYnV0dG9uVHlwZXMgPSBbXCJidXR0b25cIiwgXCJyZXNldFwiLCBcInN1Ym1pdFwiXTsgLy9cImltYWdlXCJcbiAgICAgICAgbGV0IGlucHV0VHlwZSA9IG51bGw7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGlucHV0VHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmZvcm1fYnV0dG9uX3R5cGVzLmluZGV4T2YoaW5wdXRUeXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpc0lucHV0QnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aGVMYWJlbEJ5ID0gQXJpYVV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsbGVkYnlcIik7XG4gICAgICAgIGlmICh0aGVMYWJlbEJ5ICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihydWxlQ29udGV4dCwgdGhlTGFiZWxCeSkgJiYgIWlzSW5wdXRCdXR0b24pIHtcbiAgICAgICAgICAgIC8vIHNraXAgdGhlIGNoZWNrcyBpZiBpdCBoYXMgYW4gYXJpYS1sYWJlbGxlZGJ5IHNpbmNlIGl0IHRha2VzIHByZWNlZGVuY2UuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdGhlTGFiZWwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoZUxhYmVsQnkgJiYgIUNvbW1vblV0aWwuaXNJZFJlZmVyVG9TZWxmKHJ1bGVDb250ZXh0LCB0aGVMYWJlbEJ5KSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbFZhbHVlcyA9IHRoZUxhYmVsQnkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxhYmVsVmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50QnlJZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBsYWJlbFZhbHVlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50QnlJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGFiZWwgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChlbGVtZW50QnlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhlTGFiZWwgPSBBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhlTGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHRleHQgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoaXNJbnB1dEJ1dHRvbikge1xuICAgICAgICAgICAgICAgIC8qIE5vdGU6IERpc2FibGUgdGhlIGFsdCBjaGVjayBpbiBpbWFnZXMgdW50aWwgd2UgZ2V0IGNvbmZpcm1hdGlvblxuICAgICAgICAgICAgICAgIGlmIChpbnB1dFR5cGU9PT1cImltYWdlXCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpKXtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlICdhbHQnIGF0dHJpYnV0ZSBhcyB2aXNpYmxlIHRleHRcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICB9ZWxzZSBcbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgJ3ZhbHVlJyBhdHRyaWJ1dGUgYXMgdmlzaWJsZSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRUeXBlID09PSBcInN1Ym1pdFwiLyp8fGlucHV0VHlwZT09PVwiaW1hZ2VcIiovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gXCJzdWJtaXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dFR5cGUgPT09IFwicmVzZXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFwicmVzZXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBhIDxsYWJlbD4gZWxlbWVudFxuICAgICAgICAgICAgICAgIGxldCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibGFiZWxcIiAvKiYmIFJQVFV0aWwuaXNGaXJzdEZvcm1FbGVtZW50KHBhcmVudE5vZGUsIHJ1bGVDb250ZXh0KSovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50Q2xvbmUgPSBwYXJlbnROb2RlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2x1ZGUgYWxsIGZvcm0gZWxlbWVudHMgZnJvbSB0aGUgbGFiZWwgc2luY2UgdGhleSBtaWdodCBhbHNvIGhhdmUgaW5uZXIgY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBsYWJlbEVsZW0gPyBsYWJlbEVsZW0gOiBydWxlQ29udGV4dDtcblxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50c1RvU2tpcENvbnRlbnRDaGVjayA9IFtcIm1ldGVyXCIsIFwib3V0cHV0XCIsIFwicHJvZ3Jlc3NcIiwgXCJzZWxlY3RcIiwgXCJ0ZXh0YXJlYVwiXTtcbiAgICAgICAgICAgICAgICBpZiAoIWxhYmVsRWxlbSAmJiBlbGVtZW50c1RvU2tpcENvbnRlbnRDaGVjay5pbmRleE9mKG5vZGVOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFwiXCI7IC8vIHNraXAgY29udGVudCBjaGVjayBmb3Igc29tZSBlbGVtZW50c1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdmlzaWJsZSB0ZXh0IG9ubHlcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IENvbW1vblV0aWwuZ2V0T25TY3JlZW5Jbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLyogTm90ZTogRGlzYWJsZSB0aGlzIGFsdCBjaGVjayBpbiBpbWFnZXMgZm9yIG5vdyB1bnRpbCB3ZSBnZXQgY29uZmlybWF0aW9uXG4gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlIGFsdCBhdHRyaWJ1dGUgb2YgYW4gaW1hZ2Ugd2hpY2ggaXMgY29uc2lkZXJlZCB2aXNpYmxlIHRleHQuXG4gICAgICAgICAgICAgICAgbGV0IGhhc0ltZ0FsdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbncgPSBSUFRVdGlsLm5ldyBOb2RlV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIWhhc0ltZ0FsdCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCAmJiBudy5ub2RlICE9IGVsZW1lbnQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ltZ0FsdCA9IChudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbWdcIiAmJiBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwiYWx0XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNJbWdBbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dCA/IHRleHQgKyBudy5ub2RlLmdldEF0dHJpYnV0ZShcImFsdFwiKSA6IG53Lm5vZGUuZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBub25hbHBoYW51bWVyaWMgPSAvW15hLXpBLVowLTldL2c7XG5cbiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2Uobm9uYWxwaGFudW1lcmljLCBcIiBcIik7IC8vIG9ubHkgY29uc2lkZXIgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIGxldCBub3JtYWxpemVkVGV4dCA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyh0ZXh0KS50b0xvd2VyQ2FzZSgpOyAvLyBMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGFuZCBkaWZmZXJlbmNlIGluIGNhc2Ugc2Vuc2l0aXZpdHkgc2hvdWxkIGJlIGlnbm9yZWQuXG5cbiAgICAgICAgICAgIHRoZUxhYmVsID0gdGhlTGFiZWwucmVwbGFjZShub25hbHBoYW51bWVyaWMsIFwiIFwiKTsgLy8gb25seSBjb25zaWRlciBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWRMYWJlbCA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyh0aGVMYWJlbCkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRUZXh0Lmxlbmd0aCA+IDEpIHsgLy8gc2tpcCBub24tdGV4dCBjb250ZW50LiBlLmcuLCA8YnV0dG9uIGFyaWEtbGFiZWw9XCJjbG9zZVwiPlg8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICBsZXQgbG9jYXRpb24gPSBub3JtYWxpemVkTGFiZWwuaW5kZXhPZihub3JtYWxpemVkVGV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBdm9pZCBtYXRjaGluZyBwYXJ0aWFsIHdvcmRzLmUuZy4sIHRleHQgXCJuYW1lXCIgc2hvdWxkIG5vdCBtYXRjaCAnc3VybmFtZScgb3IgJ25hbWVzJ1xuICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA+PSAwICYmIG5vcm1hbGl6ZWRMYWJlbC5sZW5ndGggPiBub3JtYWxpemVkVGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxldHRlcnMgPSAvXlswLTlhLXpBLVpdKyQvO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGxvY2F0aW9uICsgbm9ybWFsaXplZFRleHQubGVuZ3RoKSA8IG5vcm1hbGl6ZWRMYWJlbC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoZUNoYXIgPSBub3JtYWxpemVkTGFiZWwuY2hhckF0KGxvY2F0aW9uICsgbm9ybWFsaXplZFRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGVDaGFyLm1hdGNoKGxldHRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiBsb2NhdGlvbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGJlZ2lubmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoZUNoYXIgPSBub3JtYWxpemVkTGFiZWwuY2hhckF0KGxvY2F0aW9uIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhlQ2hhci5tYXRjaChsZXR0ZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PT0gLTEpIHsgLy8gY2hlY2sgdGhhdCB2aXNpYmxlIHRleHQgY29udGVudCBvZiB0aGUgdGFyZ2V0IGlzIGNvbnRhaW5lZCB3aXRoaW4gaXRzIGFjY2Vzc2libGUgbmFtZS5cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbGFiZWxfcmVmX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImxhYmVsX3JlZl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxhYmVsW2Zvcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9MYWJlbF9SZWZWYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9pbnZhbGlkXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsYWJlbF9yZWZfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlICdmb3InIGF0dHJpYnV0ZSBmb3IgYSBsYWJlbCByZWZlcmVuY2VhIGEgdW5pcXVlIG5vbi1lbXB0eSAnaWQnIGF0dHJpYnV0ZSBvZiBhIHZhbGlkIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiVGhlIHZhbHVlIFxcXCJ7MH1cXFwiIG9mIHRoZSAnZm9yJyBhdHRyaWJ1dGUgaXMgbm90IHRoZSAnaWQnIG9mIGEgdmFsaWQgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnZm9yJyBhdHRyaWJ1dGUgZm9yIGEgbGFiZWwgc2hvdWxkIHJlZmVyZW5jZSBhIG5vbi1lbXB0eSwgdW5pcXVlICdpZCcgYXR0cmlidXRlIG9mIGEgdmFsaWQgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZm9yXCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCB0YXJnZXQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgaWQpO1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgaWYgYm90aCBsYWJlbCBhbmQgY29udHJvbCBhcmUgaW52aXNpYmxlXG4gICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZSh0YXJnZXQpICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gaGFuZGxlcyBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghdGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBGYWlsIGlmIHdlJ3JlIHBvaW50aW5nIGF0IHNvbWV0aGluZyB0aGF0IGlzIGxhYmVsbGVkIGJ5IGFub3RoZXIgbWVjaGFuaXNtXG4gICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gbm9kZU5hbWUgPT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09IFwic2VsZWN0XCIgfHwgbm9kZU5hbWUgPT0gXCJ0ZXh0YXJlYVwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwiYnV0dG9uXCIgfHwgbm9kZU5hbWUgPT0gXCJkYXRhbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwib3B0Z3JvdXBcIiB8fCBub2RlTmFtZSA9PSBcIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwia2V5Z2VuXCIgfHwgbm9kZU5hbWUgPT0gXCJvdXRwdXRcIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcInByb2dyZXNzXCIgfHwgbm9kZU5hbWUgPT0gXCJtZXRlclwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwiZmllbGRzZXRcIiB8fCBub2RlTmFtZSA9PSBcImxlZ2VuZFwiO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgdGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0eXBlID09IFwidGV4dFwiIHx8IHR5cGUgPT0gXCJwYXNzd29yZFwiIHx8IHR5cGUgPT0gXCJmaWxlXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJjaGVja2JveFwiIHx8IHR5cGUgPT0gXCJyYWRpb1wiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiaGlkZGVuXCIgfHwgdHlwZSA9PSBcInNlYXJjaFwiIHx8IHR5cGUgPT0gXCJ0ZWxcIiB8fCB0eXBlID09IFwidXJsXCIgfHwgdHlwZSA9PSBcImVtYWlsXCIgfHwgIC8vSFRNTCA1XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiZGF0ZVwiIHx8IHR5cGUgPT0gXCJudW1iZXJcIiB8fCB0eXBlID09IFwicmFuZ2VcIiB8fCB0eXBlID09IFwiaW1hZ2VcIiB8fCAvL0hUTUwgNVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcInRpbWVcIiB8fCB0eXBlID09IFwiY29sb3JcIiB8fCAgLy8gSFRNTCA1XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiZGF0ZXRpbWUtbG9jYWxcIiB8fCB0eXBlID09IFwibW9udGhcIiB8fCB0eXBlID09IFwid2Vla1wiOyAvL0hUTUw1LjFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBvbmUgbW9yZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIHRhcmdldCBlbGVtZW50IGlzIE5PVCBoaWRkZW4sIGluIHRoZSBjYXNlIHRoZSB0YXJnZXQgaXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBmbGFnIGEgdmlvbGF0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBpcy5cbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZSh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFRva2VuOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChpZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW5dKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZFwiLCByZXRUb2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjb25zdCBsaXN0X2NoaWxkcmVuX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3RfY2hpbGRyZW5fdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JvdXBcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfTGlzdF9Hcm91cF9MaXN0SXRlbVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImxpc3RfY2hpbGRyZW5fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTGlzdCBjb21wb25lbnQgd2l0aCBcXFwiZ3JvdXBcXFwiIHJvbGUgaGFzIGNoaWxkcmVuIHRoYXQgYXJlIG5vdCA8bGlzdGl0ZW0+IGVsZW1lbnRzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTGlzdCBjb21wb25lbnQgd2l0aCBcXFwiZ3JvdXBcXFwiIHJvbGUgbXVzdCBsaW1pdCBjaGlsZHJlbiB0byA8bGlzdGl0ZW0+IGVsZW1lbnRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhwYXJlbnQsIFwibGlzdFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcnVsZUNvbnRleHQuY2hpbGRyZW47XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwibGlzdGl0ZW1cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuLy8gTWF0Y2hlcyB1bm9yZGVyZWQgbGlzdCBpdGVtIHByZWZpeGVzOiDigKIsIOKXpiwg4paqLCDilrgsIOKWuiwg4pyTLCDinJcsIOKcpiwg4oCTLCDigJQsICosIC0sIG9cbmNvbnN0IFVOT1JERVJFRF9CVUxMRVRfUEFUVEVSTiA9IC9eWyBcXHRdKlvigKLil6bilqrilrjilrrinJPinJfinKZcXC3igJPigJQqb11bIFxcdF0rXFxTLztcblxuLy8gTWF0Y2hlcyBvcmRlcmVkIGxpc3QgaXRlbSBwcmVmaXhlczogMS4gMSkgKDEpIGEuIGEpIChhKSBBLiBBKSBpLiBpaS4gaWlpLiBldGMuXG5jb25zdCBPUkRFUkVEX0lURU1fUEFUVEVSTiA9IC9eWyBcXHRdKig/OlxcKD9cXGQrWy4pXVxcKT98XFwoP1thLXpBLVpdWy4pXVxcKT98XFwoPyg/Oml7MSwzfXxpdnx2aXswLDN9fGl4fHhpezAsM318eGl2fHh2KVsuKV1cXCk/KVsgXFx0XStcXFMvaTtcblxuY29uc3QgTElTVF9JVEVNX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFxuICAgIFVOT1JERVJFRF9CVUxMRVRfUEFUVEVSTi5zb3VyY2UgKyBcInxcIiArIE9SREVSRURfSVRFTV9QQVRURVJOLnNvdXJjZSxcbiAgICBcImlcIlxuKTtcblxuLy8gQmxvY2stbGV2ZWwgZWxlbWVudHMgdGhhdCBhY3QgYXMgYm91bmRhcmllcyBiZXR3ZWVuIGluZGVwZW5kZW50IGNvbnRlbnQgZ3JvdXBzXG5jb25zdCBCTE9DS19FTEVNRU5UUyA9IG5ldyBTZXQoW1xuICAgIFwiYmxvY2txdW90ZVwiLCBcImNlbnRlclwiLCBcImRpclwiLCBcImRpdlwiLCBcImZvcm1cIixcbiAgICBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIiwgXCJoNlwiLFxuICAgIFwiaHJcIiwgXCJiclwiLCBcIm1lbnVcIiwgXCJwXCIsIFwicHJlXCIsIFwidGFibGVcIixcbiAgICBcInNlY3Rpb25cIiwgXCJhcnRpY2xlXCIsIFwiYXNpZGVcIiwgXCJuYXZcIiwgXCJoZWFkZXJcIiwgXCJmb290ZXJcIixcbiAgICBcImZpZ3VyZVwiLCBcImZpZ2NhcHRpb25cIiwgXCJkZXRhaWxzXCIsIFwic3VtbWFyeVwiLCBcImRpYWxvZ1wiLFxuICAgIFwic2NyaXB0XCIsIFwic3R5bGVcIiwgXCJsYWJlbFwiLFxuICAgIFwidWxcIiwgXCJvbFwiLCBcImRsXCIsIFwibGlcIiwgXCJkdFwiLCBcImRkXCJcbl0pO1xuXG4vLyBJbmxpbmUgZWxlbWVudHMgd2hvc2UgdGV4dCBjb250ZW50IGlzIHRyZWF0ZWQgYXMgcGFydCBvZiB0aGUgc3Vycm91bmRpbmcgdGV4dCBydW5cbmNvbnN0IElOTElORV9FTEVNRU5UUyA9IG5ldyBTZXQoW1xuICAgIFwiYVwiLCBcImFiYnJcIiwgXCJhY3JvbnltXCIsIFwiYlwiLCBcImJkb1wiLCBcImJpZ1wiLCBcImJyXCIsIFwiYnV0dG9uXCIsIFwiY2l0ZVwiLFxuICAgIFwiY29kZVwiLCBcImRmblwiLCBcImVtXCIsIFwiaVwiLCBcImltZ1wiLCBcImlucHV0XCIsIFwia2JkXCIsIFwibGFiZWxcIiwgXCJtYXBcIixcbiAgICBcIm9iamVjdFwiLCBcIm91dHB1dFwiLCBcInFcIiwgXCJzYW1wXCIsIFwic2VsZWN0XCIsIFwic21hbGxcIiwgXCJzcGFuXCIsXG4gICAgXCJzdHJvbmdcIiwgXCJzdWJcIiwgXCJzdXBcIiwgXCJ0ZXh0YXJlYVwiLCBcInRpbWVcIiwgXCJ0dFwiLCBcInVcIiwgXCJ2YXJcIlxuXSk7XG5cbi8vIFJldHVybnMgdGhlIGNvbWJpbmVkIHRleHQgb2YgYSBub2RlIGFuZCBpdHMgaW5saW5lIGRlc2NlbmRhbnRzLCBub3JtYWxpc2VkIHRvIHNpbmdsZSBzcGFjZXNcbmZ1bmN0aW9uIGdldFNoYWxsb3dUZXh0KG5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICBub2RlLmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgdGV4dCArPSBjaGlsZC5ub2RlVmFsdWUgPz8gXCJcIjtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IChjaGlsZCBhcyBFbGVtZW50KS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKElOTElORV9FTEVNRU5UUy5oYXModGFnKSkge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gZ2V0U2hhbGxvd1RleHQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFxzKy9nLCBcIiBcIik7XG59XG5cbi8vIFJldHVybnMgdHJpbW1lZCBub24tZW1wdHkgbGluZXMgZnJvbSBhIG5vZGUsIHNwbGl0dGluZyBvbiBuZXdsaW5lcyBhbmQgPGJyPiBib3VuZGFyaWVzXG5mdW5jdGlvbiBnZXRMaW5lc0Zyb21Ob2RlKG5vZGU6IE5vZGUpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmdW5jdGlvbiB3YWxrKG46IE5vZGUpIHtcbiAgICAgICAgaWYgKG4ubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAobi5ub2RlVmFsdWUgPz8gXCJcIikuc3BsaXQoL1xccj9cXG4vKS5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSBwLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodHJpbW1lZC5sZW5ndGggPiAwKSBsaW5lcy5wdXNoKHRyaW1tZWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBuIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodGFnID09PSBcImJyXCIpIHtcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKFwiXFx4MDBcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEJMT0NLX0VMRU1FTlRTLmhhcyh0YWcpKSByZXR1cm47XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFNraXAgZWxlbWVudHMgd2l0aCBsaXN0LXJlbGF0ZWQgb3Igd2lkZ2V0IHJvbGVzXG4gICAgICAgICAgICBjb25zdCByb2xlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzV2l0aFR5cGVzKGVsZW0sIFtcIndpZGdldFwiXSk7XG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFxuICAgICAgICAgICAgICAgICAgICBbXCJjYXB0aW9uXCIsIFwiY29kZVwiLCBcImNvbHVtbmhlYWRlclwiLCBcImZpZ3VyZVwiLCBcImxpc3RcIiwgXCJsaXN0aXRlbVwiLCBcIm1hdGhcIiwgXCJtZXRlclwiLCBcInJvd2hlYWRlclwiXSxcbiAgICAgICAgICAgICAgICAgICAgcm9sZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChyb2xlcy5sZW5ndGggPiAwKSByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIG4uY2hpbGROb2Rlcy5mb3JFYWNoKHdhbGspO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2Fsayhub2RlKTtcbiAgICByZXR1cm4gbGluZXMuZmlsdGVyKGwgPT4gbCAhPT0gXCJcXHgwMFwiKTtcbn1cblxuLy8gUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29uc2VjdXRpdmUgbGlzdC1pdGVtLWxpa2UgbGluZXMgZm91bmQgYW1vbmdcbi8vIHRoZSBkaXJlY3QgY2hpbGRyZW4gb2YgcGFyZW50LCB0cmVhdGluZyA8YnI+IGFuZCB3aGl0ZXNwYWNlLW9ubHkgdGV4dCBhcyBzZXBhcmF0b3JzXG5mdW5jdGlvbiBtYXhDb25zZWN1dGl2ZUxpc3RJdGVtcyhwYXJlbnQ6IEVsZW1lbnQpOiBudW1iZXIge1xuICAgIGxldCBtYXhSdW4gPSAwO1xuICAgIGxldCBjdXJyZW50UnVuID0gMDtcbiAgICBsZXQgY3VycmVudExpbmVUZXh0ID0gXCJcIjsgIC8vIGFjY3VtdWxhdGUgdGV4dCBhY3Jvc3MgaW5saW5lIHNpYmxpbmdzIHVudGlsIDxicj5cblxuICAgIHBhcmVudC5jaGlsZE5vZGVzLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhZyA9IGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKHRhZyA9PT0gXCJiclwiKSB7XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSBhY2N1bXVsYXRlZCBsaW5lXG4gICAgICAgICAgICBjb25zdCB0cmltbWVkID0gY3VycmVudExpbmVUZXh0LnRyaW0oKTtcbiAgICAgICAgICAgIGlmICh0cmltbWVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoTElTVF9JVEVNX1BBVFRFUk4udGVzdCh0cmltbWVkKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXhSdW4gPSBNYXRoLm1heChtYXhSdW4sICsrY3VycmVudFJ1bik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhdyA9IGNoaWxkLm5vZGVWYWx1ZSA/PyBcIlwiO1xuICAgICAgICAgICAgaWYgKHJhdy50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgZW1iZWRkZWQgbmV3bGluZXMsIGZsdXNoIG9uIGVhY2hcbiAgICAgICAgICAgIGNvbnN0IHNlZ3MgPSByYXcuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgICAgICAgIHNlZ3MuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSBjdXJyZW50TGluZVRleHQudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJpbW1lZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTElTVF9JVEVNX1BBVFRFUk4udGVzdCh0cmltbWVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ1biA9IE1hdGgubWF4KG1heFJ1biwgKytjdXJyZW50UnVuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ICs9IHNlZztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IGNoaWxkIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoQkxPQ0tfRUxFTUVOVFMuaGFzKHRhZykpIHtcbiAgICAgICAgICAgICAgICAvLyBmbHVzaCBjdXJyZW50IGxpbmUgYmVmb3JlIGJsb2NrIGJvdW5kYXJ5XG4gICAgICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IGN1cnJlbnRMaW5lVGV4dC50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRyaW1tZWQubGVuZ3RoID4gMCAmJiBMSVNUX0lURU1fUEFUVEVSTi50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heFJ1biA9IE1hdGgubWF4KG1heFJ1biwgKytjdXJyZW50UnVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gMDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSU5MSU5FX0VMRU1FTlRTLmhhcyh0YWcpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVUZXh0ICs9IGdldFNoYWxsb3dUZXh0KGVsZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gMDtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZVRleHQgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBmbHVzaCBhbnkgcmVtYWluaW5nIGxpbmUgYXQgZW5kIG9mIGNvbnRhaW5lclxuICAgIGNvbnN0IHRyaW1tZWQgPSBjdXJyZW50TGluZVRleHQudHJpbSgpO1xuICAgIGlmICh0cmltbWVkLmxlbmd0aCA+IDAgJiYgTElTVF9JVEVNX1BBVFRFUk4udGVzdCh0cmltbWVkKSkge1xuICAgICAgICBtYXhSdW4gPSBNYXRoLm1heChtYXhSdW4sICsrY3VycmVudFJ1bik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1heFJ1bjtcbn1cblxuLy8gUmV0dXJucyB0cnVlIGlmIDIrIGNvbnNlY3V0aXZlIDxicj4tc2VwYXJhdGVkIGxpbmVzIHdpdGhpbiBlbGVtZW50IG1hdGNoIHRoZSBsaXN0LWl0ZW0gcGF0dGVyblxuZnVuY3Rpb24gaGFzQnJTZXBhcmF0ZWRMaXN0TGluZXMoZWxlbWVudDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGxldCBydW4gPSAwO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBnZXRMaW5lc0Zyb21Ob2RlKGVsZW1lbnQpKSB7XG4gICAgICAgIGlmIChMSVNUX0lURU1fUEFUVEVSTi50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICBpZiAoKytydW4gPj0gMikgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW4gPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IGxpc3RfbWFya3VwX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJsaXN0X21hcmt1cF9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGlzdF9Vc2VNYXJrdXBcIjoge1xuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3RcIjogXCJsaXN0X21hcmt1cF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxpc3RfbWFya3VwX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBvdGVudGlhbF9saXN0XCI6IFwiVmVyaWZ5IHRoaXMgaXMgYSBsaXN0IGFuZCBpZiBzbywgbW9kaWZ5IHRvIHVzZSBwcm9wZXIgSFRNTCBlbGVtZW50cyBmb3IgdGhlIGxpc3RcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm9wZXIgSFRNTCBlbGVtZW50cyBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgYSBsaXN0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkgfHwgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmNsdWRlcyhub2RlTmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiXSkgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wic2NyaXB0XCIsIFwic3R5bGVcIiwgXCJsYWJlbFwiXSkgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBPbmx5IGNoZWNrIGJsb2NrLWxldmVsIGFuZCB0YWJsZS1jZWxsIGVsZW1lbnRzIGZpcnN0IOKAlFxuICAgICAgICAvLyB0ZC90aCBtdXN0IGJlIGNoZWNrZWQgYmVmb3JlIHRoZSBhbmNlc3RvciByb2xlIGNoZWNrIHNpbmNlXG4gICAgICAgIC8vIHRhYmxlL3Jvdy9jZWxsIEFSSUEgcm9sZXMgd291bGQgb3RoZXJ3aXNlIGNhdXNlIGFuIGVhcmx5IGV4aXRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInRkXCIgfHwgbm9kZU5hbWUgPT09IFwidGhcIikge1xuICAgICAgICAgICAgaWYgKG1heENvbnNlY3V0aXZlTGlzdEl0ZW1zKHJ1bGVDb250ZXh0KSA+PSAyKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3RcIik7XG4gICAgICAgICAgICBpZiAoaGFzQnJTZXBhcmF0ZWRMaXN0TGluZXMocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3RcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgZWxlbWVudHMgdGhhdCBhbHJlYWR5IGhhdmUgc2VtYW50aWMgbGlzdCwgd2lkZ2V0LCBvciBzdHJ1Y3R1cmFsIHJvbGVzXG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNXaXRoVHlwZXMocnVsZUNvbnRleHQsIFtcIndpZGdldFwiXSk7XG4gICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChcbiAgICAgICAgICAgIFtcImNhcHRpb25cIiwgXCJjb2RlXCIsIFwiY29sdW1uaGVhZGVyXCIsIFwiZmlndXJlXCIsIFwibGlzdFwiLCBcImxpc3RpdGVtXCIsIFwibWF0aFwiLCBcIm1ldGVyXCIsIFwicm93aGVhZGVyXCJdLFxuICAgICAgICAgICAgcm9sZXNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGVzKHJ1bGVDb250ZXh0LCByb2xlcykgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBPbmx5IGNoZWNrIGJsb2NrLWxldmVsIGVsZW1lbnRzIHRvIGF2b2lkIGR1cGxpY2F0ZSByZXBvcnRzXG4gICAgICAgIGlmICghQkxPQ0tfRUxFTUVOVFMuaGFzKG5vZGVOYW1lKSAmJiBub2RlTmFtZSAhPT0gXCJib2R5XCIgJiYgbm9kZU5hbWUgIT09IFwibGlcIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChbXCJ1bFwiLCBcIm9sXCIsIFwiZGxcIiwgXCJtZW51XCJdLmluY2x1ZGVzKG5vZGVOYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChtYXhDb25zZWN1dGl2ZUxpc3RJdGVtcyhydWxlQ29udGV4dCkgPj0gMilcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3RcIik7XG5cbiAgICAgICAgaWYgKGhhc0JyU2VwYXJhdGVkTGlzdExpbmVzKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3RcIik7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyOiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3Rfc3RydWN0dXJlX3Byb3BlclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmRsLCBkb206dWwsIGRvbTpvbCwgZG9tOmRpciwgZG9tOm1lbnUsIGRvbTpsaSwgZG9tOmRkLCBkb206ZHRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MaXN0X01pc3VzZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsaXN0X3N0cnVjdHVyZV9wcm9wZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImxpc3Rfc3RydWN0dXJlX3Byb3Blci5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJMaXN0IGVsZW1lbnQgaXMgbWlzc2luZyBvciBpbXByb3Blcmx5IHN0cnVjdHVyZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJMaXN0IGVsZW1lbnRzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGxpc3RzIG9mIHJlbGF0ZWQgaXRlbXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEdldCBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgcnVsZUNvbnRleHRcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcnVsZUNvbnRleHQuY2hpbGRyZW5cblxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJkbFwiKSB7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IHdhbGtDaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gY2hpbGRyZW5zIHNldCBhcyBwYXNzZWQsIHNpbmNlIGRsIGVsZW1lbnRzIGNhbiBoYXZlXG4gICAgICAgICAgICAvLyB6ZXJvIG9yIG1vcmUgb2Y6IG9uZSBvciBtb3JlIGR0IGVsZW1lbnRzLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkZCBlbGVtZW50c1xuICAgICAgICAgICAgaWYgKCFydWxlQ29udGV4dC5jaGlsZHJlbiB8fCBydWxlQ29udGV4dC5jaGlsZHJlbi5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa0NoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhbGtDaGlsZHJlbi5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSB3YWxrQ2hpbGRyZW4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hpbGUgd2Fsa2luZyB0aHJvdWdoIHRoZSBlbGVtZW50cyB1bmRlciBkbCwgaWYgd2UgZmluZCBhIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudGF0aW9uYWwgZWxlbWVudCB3ZSBtb3ZlIHRvIHRoZSBuZXh0IGVsZW1lbnQgYXMgcHJlc2VudGF0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGFyZSBhbGxvd2VkIHVuZGVyIGxpc3QgZWxlbWVudHMgYXMgdGhleSBhcmUgb25seSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdHRpbmcgdGV4dCBub2Rlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc1ByZXNlbnRhdGlvbmFsRWxlbWVudCh3YWxrQ2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHNldCB0byBwYXNzIGlmIHdlIGZpbmQgZGQgb3IgZHQgZWxlbWVudCwgaW4gdGhlIGNhc2Ugb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGVsZW1lbnQgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIHdlIHdpbGwgY2F0Y2ggaXQgaGVyZS4gaS5lLiBpbWcgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBub2RlTmFtZSA9PSBcImRkXCIgfHwgbm9kZU5hbWUgPT0gXCJkdFwiO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgZGVwZW5kaW5nIG9uIHdoaWNoIGlzIGZvdW5kIGZpcnN0IGFuZCBsYXN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPT0gXCJcIikgZmlyc3QgPSBub2RlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBub2RlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGRyZW4gPSB3YWxrQ2hpbGRyZW4ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgd2UgaGF2ZSBmb3VuZCBkdCBhbmQgZGQgZWxlbWVudHMgdW5kZXIgZGwgd2UgcGFzcyByaWdodCBhd2F5LlxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gZHQgb3IgZGQgZWxlbWVudCwgYnV0IGJ1bmNoIG9mIHByZXNlbnRhdGlvbmFsIGVsZW1lbnRzIHdlIG1hcmsgdGhpcyBhcyBhXG4gICAgICAgICAgICAgICAgLy8gcGFzcy4gSW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBhcmUgb3RoZXIgZWxlbWVudHMsIHN1Y2ggYXMgaW1nIHdlIHdpbGwgc3RpbGwgdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAocGFzc2VkICYmIGZpcnN0ID09IFwiZHRcIiAmJiBsYXN0ID09IFwiZGRcIikgfHwgKHBhc3NlZCAmJiBwcmVzZW50YXRpb25hbEZvdW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcImxpXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInVsXCIsIFwib2xcIiwgXCJkaXJcIiwgXCJtZW51XCJdKSAhPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFwiZGRcIiB8fCBub2RlTmFtZSA9PSBcImR0XCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiZGxcIikgIT0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB3YWxrQ2hpbGRyZW4gPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgICAgICAvLyBaZXJvIG9yIG1vcmUgbGkgZWxlbWVudHMgYXJlIHBlcm1pdHRlZCBpbnNpZGUgb2YgPG9sPiwgPHVsPiBvciA8bWVudT4gZWxlbWVudHMgbm93IGFzIHBlciB0aGUgaHRtbDUgc3BlYy4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlXG4gICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGFyZSB6ZXJvIGVsZW1lbnRzIHVuZGVyIHRoZSA8b2w+LCA8dWw+IG9yIDxtZW51Pi5cbiAgICAgICAgICAgIGlmICgobm9kZU5hbWUgPT0gXCJ1bFwiIHx8IG5vZGVOYW1lID09IFwib2xcIiB8fCBub2RlTmFtZSA9PSBcIm1lbnVcIikgJiYgKCFydWxlQ29udGV4dC5jaGlsZHJlbiB8fCBydWxlQ29udGV4dC5jaGlsZHJlbi5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbGlGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGtDaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoaWxlIHdhbGtpbmcgdGhyb3VnaCB0aGUgbGlzdCBlbGVtZW50cywgaWYgd2UgZmluZCBhIFxuICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZW50YXRpb25hbCBlbGVtZW50IHdlIHNraXAgY2hlY2tpbmcgYXMgcHJlc2VudGF0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgYXJlIGFsbG93ZWQgdW5kZXIgbGlzdCBlbGVtZW50cyBhcyB0aGV5IGFyZSBvbmx5IGZvclxuICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXR0aW5nIHRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc1ByZXNlbnRhdGlvbmFsRWxlbWVudCh3YWxrQ2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25hbEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpZiB0aGUgbm9kZSB0eXBlIGlzIGFueXRoaW5nIGJ1dCAxLCBvciBpbiB0aGUgY2FzZSB0aGF0IGl0IGlzIGEgbGkgZWxlbWVudC4gRm9yIGFueSBvdGhlciBub2RlIFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIGJlIGNhdWdodCBoZXJlIHRoYXQgZWxlbWVudCBpcyBub3QgYWxsb3dlZCB1bmRlciBsaXN0IG5vZGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZ1cnRoZXJtb3JlIGluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBlbGVtZW50IHdpdGggdGhlIHBhcmVudCBiZWluZyB1bC9vbCBkb24ndCBmbGFnIGEgdmlvbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHdhbGtDaGlsZHJlbi5ub2RlVHlwZSAhPSAxIHx8IHdhbGtDaGlsZHJlbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwibGlcIiB8fCAod2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJ0ZW1wbGF0ZVwiICYmIChub2RlTmFtZSA9PSBcInVsXCIgfHwgbm9kZU5hbWUgPT0gXCJvbFwiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGxpIGZvdW5kIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgZWxlbWVudCAobm9kZVR5cGU9MSkgaXMgYW4gbGkgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBsaUZvdW5kID0gbGlGb3VuZCB8fCAod2Fsa0NoaWxkcmVuLm5vZGVUeXBlID09IDEgJiYgd2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJsaVwiKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGl0IGhhcyBwYXNzZWQgYW5kIGFsc28gbGkgZWxlbWVudCBpcyBmb3VuZCB1bmRlciBsaXN0IG5vZGUsIHdlIHBhc3MgcmlnaHQgYXdheS5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIGxpIGVsZW1lbnQsIGJ1dCBidW5jaCBvZiBwcmVzZW50YXRpb25hbCBlbGVtZW50cyB3ZSBtYXJrIHRoaXMgYXMgYVxuICAgICAgICAgICAgICAgIC8vIHBhc3MuIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgYXJlIG90aGVyIGVsZW1lbnRzLCBzdWNoIGFzIGltZyB3ZSB3aWxsIHN0aWxsIHRyaWdnZXIgYSB2aW9sYXRpb24uXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gKHBhc3NlZCAmJiBsaUZvdW5kKSB8fCAocGFzc2VkICYmIHByZXNlbnRhdGlvbmFsRm91bmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IG1hcnF1ZWVfZWxlbV9hdm9pZDogUnVsZSA9IHtcbiAgICBpZDogXCJtYXJxdWVlX2VsZW1fYXZvaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTptYXJxdWVlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWFycXVlZV9UcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwibWFycXVlZV9lbGVtX2F2b2lkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtYXJxdWVlX2VsZW1fYXZvaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJTY3JvbGxpbmcgY29udGVudCBmb3VuZCB0aGF0IHVzZXMgdGhlIG9ic29sZXRlIDxtYXJxdWVlPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxtYXJxdWVlPiBlbGVtZW50IGlzIG9ic29sZXRlIGFuZCBzaG91bGQgbm90IGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9hbHRfYnJpZWY6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYWx0X2JyaWVmXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2FsdF0sIGRvbTphcHBsZXRbYWx0XSwgZG9tOmFyZWFbYWx0XSwgZG9tOmVtYmVkW2FsdF0sIGRvbTppbnB1dFt0eXBlXVthbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfQWx0QnJpZWZcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYWx0X2JyaWVmLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJtZWRpYV9hbHRfYnJpZWYuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2FsdF9icmllZi5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVGV4dCBhbHRlcm5hdGl2ZSBpcyBtb3JlIHRoYW4gMTUwIGNoYXJhY3RlcnNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbHRlcm5hdGl2ZSB0ZXh0IGluICdhbHQnIGF0dHJpYnV0ZSBzaG91bGQgYmUgYnJpZWYgKDwxNTAgY2hhcmFjdGVycylcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBtYXhBbHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTUwLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgYWx0TGVuZ3RoID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKS5sZW5ndGg7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhbHRMZW5ndGggPD0gdmFsaWRhdGVQYXJhbXMubWF4QWx0LnZhbHVlO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1lZGlhX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFyZWFbYWx0XSwgZG9tOmVtYmVkW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9BdWRpb1ZpZGVvQWx0RmlsZW5hbWVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiRmlsZW5hbWUgdXNlZCBhcyBsYWJlbCBmb3IgZW1iZWRkZWQgYXVkaW8gb3IgdmlkZW9cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdWRpbyBvciB2aWRlbyBvbiB0aGUgcGFnZSBtdXN0IGhhdmUgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZSBtZWRpYSBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB1cmkgPSBcIlwiO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImFyZWFcIikge1xuICAgICAgICAgICAgdXJpID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXJpID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB1cmkgPSBcIlwiO1xuICAgICAgICBsZXQgZXh0ID0gQ29tbW9uVXRpbC5nZXRGaWxlRXh0KHVyaSk7XG4gICAgICAgIGxldCBpc0F1ZFZpZCA9IGV4dC5sZW5ndGggIT0gMCAmJiAoQ29tbW9uVXRpbC5pc0F1ZGlvRXh0KGV4dCkgfHwgQ29tbW9uVXRpbC5pc1ZpZGVvRXh0KGV4dCkpO1xuICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFpc0F1ZFZpZCB8fCAoYWx0VGV4dC5sZW5ndGggPiAwICYmIGFsdFRleHQuaW5kZXhPZihleHQpID09IC0xKTtcblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfYXVkaW9fdHJhbnNjcmliZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYXVkaW9fdHJhbnNjcmliZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpiZ3NvdW5kLCBkb206YVtocmVmXSwgZG9tOmFyZWFbaHJlZl0sIGRvbTplbWJlZCwgZG9tOm9iamVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX0F1ZGlvVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfYXVkaW9fdHJhbnNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJQcm92aWRlIHRyYW5zY3JpcHRzIGZvciBhdWRpbyBmaWxlc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkF1ZGlvIGluZm9ybWF0aW9uIHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBpbiB0ZXh0IGZvcm1cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGxldCB0aGlzTm9kZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aGlzTm9kZSA9PSBcImJnc291bmRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc0F1ZGlvT2JqRW1iZWRMaW5rKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDsgLy8gT3V0IG9mIFNjb3BlXG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpwYXJhbVtuYW1lPWF1dG9wbGF5XSwgZG9tOnBhcmFtW25hbWU9YXV0b3N0YXJ0XSwgZG9tOmVtYmVkW2ZsYXNodmFyc10sIGRvbTplbWJlZFtzcmNdLCBkb206KlthdXRvc3RhcnQ9dHJ1ZV0sIGRvbToqW2F1dG9zdGFydD0xXSwgZG9tOmJnc291bmRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9FbWJlZF9BdXRvU3RhcnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZXJlIGlzIGEgbWVjaGFuaXNtIHRvIHBhdXNlIG9yIHN0b3AgYW5kIGNvbnRyb2wgdGhlIHZvbHVtZSBmb3IgdGhlIGF1ZGlvIHRoYXQgcGxheXMgYXV0b21hdGljYWxseVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk1lY2hhbmlzbSBtdXN0IGJlIGF2YWlsYWJsZSB0byBwYXVzZSBvciBzdG9wIGFuZCBjb250cm9sIHRoZSB2b2x1bWUgb2YgdGhlIGF1ZGlvIHRoYXQgcGxheXMgYXV0b21hdGljYWxseVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiYmdzb3VuZFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcInBhcmFtXCIpIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSlcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidmFsdWVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNvbnRlbnQuaW5kZXhPZihcIjA7XCIpID09IDAgfHxcbiAgICAgICAgICAgICAgICAhKGNvbnRlbnQuaW5kZXhPZihcInRydWVcIikgIT0gLTEgfHwgY29udGVudC5pbmRleE9mKFwiMVwiKSAhPSAtMSk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJlbWJlZFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImZsYXNodmFyc1wiKSkge1xuICAgICAgICAgICAgICAgIGxldCBzdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJmbGFzaHZhcnNcIik7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9dHJ1ZVwiKSA9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBzdHIuaW5kZXhPZihcImF1dG9zdGFydD0xXCIpID09IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJzcmNcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PXRydWVcIikgPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9MVwiKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImF1dG9zdGFydFwiKSkge1xuICAgICAgICAgICAgbGV0IHZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImF1dG9zdGFydFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcGFzc2VkID0gdmFsICE9ICd0cnVlJyAmJiB2YWwgIT0gJzEnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206YXVkaW8sIGRvbTp2aWRlb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BdWRpb19WaWRlb19UcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBtZWRpYSB1c2luZyA8YXVkaW8+IGFuZC9vciA8dmlkZW8+IGVsZW1lbnRzIGhhdmUga2V5Ym9hcmQgYWNjZXNzaWJsZSBjb250cm9sc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk1lZGlhIHVzaW5nIDxhdWRpbz4gYW5kL29yIDx2aWRlbz4gZWxlbWVudHMgbXVzdCBoYXZlIGtleWJvYXJkIGFjY2Vzc2libGUgY29udHJvbHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImF1ZGlvXCIgfHwgbm9kZU5hbWUgPT09IFwidmlkZW9cIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfbGl2ZV9jYXB0aW9uZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfbGl2ZV9jYXB0aW9uZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTplbWJlZCwgZG9tOm9iamVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX1ZpZGVvT2JqZWN0VHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfbGl2ZV9jYXB0aW9uZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2xpdmVfY2FwdGlvbmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgY2FwdGlvbnMgYXJlIHByb3ZpZGVkIGZvciBsaXZlIG1lZGlhIChzdHJlYW1pbmcgdmlkZW8gd2l0aCBhdWRpbylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJMaXZlIG1lZGlhIChzdHJlYW1pbmcgdmlkZW8gd2l0aCBhdWRpbykgc2hvdWxkIGhhdmUgY2FwdGlvbnMgZm9yIGF1ZGlvIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFDb21tb25VdGlsLmlzVmlkZW9PYmpFbWJlZExpbmsocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfdHJhY2tfYXZhaWxhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFbaHJlZl0sIGRvbTphcmVhW2hyZWZdLCBkb206YXBwbGV0LCBkb206ZW1iZWQsIGRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9WaWRlb1JlZmVyZW5jZVRyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfdHJhY2tfYXZhaWxhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgYXZhaWxhYmlsaXR5IG9mIGEgdXNlci1zZWxlY3RhYmxlIGF1ZGlvIHRyYWNrIHdpdGggZGVzY3JpcHRpb24gb2YgdmlzdWFsIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcmUtcmVjb3JkZWQgbWVkaWEgc2hvdWxkIGhhdmUgYW4gYXVkaW8gdHJhY2sgdGhhdCBkZXNjcmliZXMgdmlzdWFsIGluZm9ybWF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuM1wiLCBcIjEuMi41XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImFwcGxldFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhc3NlZCA9ICFDb21tb25VdGlsLmlzVmlkZW9PYmpFbWJlZExpbmsocnVsZUNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZXRhX3JlZGlyZWN0X29wdGlvbmFsOiBSdWxlID0ge1xuICAgIGlkOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWxcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW2h0dHAtZXF1aXZdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfTWV0YV9SZWRpcmVjdFplcm9cIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwiZmFpbF9sb25ncmVmcmVzaFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbC5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSBzaG91bGQgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aXRob3V0IHdhcm5pbmcgb3Igb3B0aW9uIHRvIHR1cm4gaXQgb2ZmIG9yIGFkanVzdCB0aGUgdGltZSBsaW1pdFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcIkNoZWNrIHBhZ2UgZG9lcyBub3QgYXV0b21hdGljYWxseSByZWZyZXNoIHdpdGhvdXQgd2FybmluZyBvciBvcHRpb25zXCIsXG4gICAgICAgICAgICBcImZhaWxfbG9uZ3JlZnJlc2hcIjogXCJDaGVjayBwYWdlIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aXRob3V0IHdhcm5pbmcgb3Igb3B0aW9uc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGRlcHJlY2F0ZSBXQ0FHIEFBQVxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4yLjRcIiwgXCIzLjIuNVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjIuNFwiLCBcIjMuMi41XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIC8vIFJlbW92ZWQgQUNUIGJpc3o1OCBBQUFcbiAgICAvKiphY3Q6IFt7IFxuICAgICAgICBcImJjNjU5YVwiIDoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwicGFzc1wiXG4gICAgICAgIH1cbiAgICB9XSwqL1xuICAgIGFjdDogWyBcImJpc3o1OFwiXSwgIC8vIGZhaWwgZXZlbiBpZiBhIHBhZ2UgaXMgcmVkaXJlY3RlZCBhZnRlciBtb3JlIHRoYW4gMjAgaG91cnMgKDcyMDApXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJodHRwLWVxdWl2XCIpLnRvTG93ZXJDYXNlKCkgIT09ICdyZWZyZXNoJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2MpIHJldHVybjtcblxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgcnVsZSBhbHJlYWR5IHBhc3NlZCBvciBmYWlsZWQ6IG9ubHkgdGhlIGZpcnN0IG9uZSB0cmlkZGVycyBpZiBtdWx0aXBsZVxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsX2RvbmVcIiwgZmFsc2UpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuXG4gICAgICAgIGxldCBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIWNvbnRlbnQgfHwgY29udGVudC50cmltKCkubGVuZ3RoID09PTApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgdGltZTpudW1iZXIgPSAtMTtcbiAgICAgICAgaWYgKGNvbnRlbnQubWF0Y2goL15cXGQrJC8pKSBcbiAgICAgICAgICAgIHRpbWUgPSBwYXJzZUludChjb250ZW50KTtcbiAgICAgICAgZWxzZSBpZiAoY29udGVudC5tYXRjaCgvXlxcZCs7LykpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBjb250ZW50LmluZGV4T2YoXCI7XCIpO1xuICAgICAgICAgICAgdGltZSA9IHBhcnNlSW50KGNvbnRlbnQuc3Vic3RyaW5nKDAsIHBvcykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEludmFsaWQgY29udGVudCBmaWVsZFxuICAgICAgICBpZiAodGltZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsX2RvbmVcIiwgdHJ1ZSk7XG4gICAgICAgIGlmICh0aW1lID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgZWxzZSBpZiAodGltZSA8IDcyMDAxKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbFwiKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbG9uZ3JlZnJlc2hcIik7ICAgIFxuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1ldGFfcmVmcmVzaF9kZWxheTogUnVsZSA9IHtcbiAgICBpZDogXCJtZXRhX3JlZnJlc2hfZGVsYXlcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW2h0dHAtZXF1aXZdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWV0YV9SZWZyZXNoXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9yZWZyZXNoXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZXRhX3JlZnJlc2hfZGVsYXkuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwibWV0YV9yZWZyZXNoX2RlbGF5Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3JlZnJlc2hcIjogXCJtZXRhX3JlZnJlc2hfZGVsYXkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2VzIHNob3VsZCBub3QgcmVmcmVzaCBhdXRvbWF0aWNhbGx5XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJQYWdlcyBkbyBub3QgcmVmcmVzaCBhdXRvbWF0aWNhbGx5XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9yZWZyZXNoXCI6IFwiVmVyaWZ5IHBhZ2UgaXMgbm90IGJlaW5nIGNhdXNlZCB0byByZWZyZXNoIGF1dG9tYXRpY2FsbHlcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICAvL2FjdDogWyBcImJpc3o1OFwiLCBcImJjNjU5YVwiIF0sXG4gICAgYWN0OiBbIFwiYmM2NTlhXCIgXSwgIC8vIHBhc3MgaWYgYSBwYWdlIGlzIHJlZGlyZWN0ZWQgYWZ0ZXIgbW9yZSB0aGFuIDIwIGhvdXJzICg3MjAwKVxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJodHRwLWVxdWl2XCIpLnRvTG93ZXJDYXNlKCkgIT09ICdyZWZyZXNoJylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykgcmV0dXJuO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBydWxlIGFscmVhZHkgcGFzc2VkOiB0aGUgZmlyc3Qgb25lIHRha2VzIHByaW9yaXR5XG4gICAgICAgIGlmIChDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIm1ldGFfcmVmcmVzaF9kZWxheV9kb25lXCIsIGZhbHNlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIWNvbnRlbnQgfHwgY29udGVudC50cmltKCkubGVuZ3RoID09PTApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgdGltZTpudW1iZXIgPSAtMTtcbiAgICAgICAgaWYgKGNvbnRlbnQubWF0Y2goL15cXGQrJC8pKSBcbiAgICAgICAgICAgIHRpbWUgPSBwYXJzZUludChjb250ZW50KTtcbiAgICAgICAgZWxzZSBpZiAoY29udGVudC5tYXRjaCgvXlxcZCs7LykpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBjb250ZW50LmluZGV4T2YoXCI7XCIpO1xuICAgICAgICAgICAgdGltZSA9IHBhcnNlSW50KGNvbnRlbnQuc3Vic3RyaW5nKDAsIHBvcykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEludmFsaWQgY29udGVudCBmaWVsZFxuICAgICAgICBpZiAodGltZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJtZXRhX3JlZnJlc2hfZGVsYXlfZG9uZVwiLCB0cnVlKTtcbiAgICAgICAgaWYgKHRpbWUgPT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfcmVmcmVzaFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IG1ldGFfdmlld3BvcnRfem9vbWFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWV0YV92aWV3cG9ydF96b29tYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOm1ldGFbbmFtZV1bY29udGVudF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIm1ldGFfdmlld3BvcnRfem9vbVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfem9vbWFibGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwibWV0YV92aWV3cG9ydF96b29tYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF96b29tYWJsZVwiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgc2hvdWxkIG5vdCBwcmV2ZW50IHRoZSBicm93c2VyIHpvb21pbmcgdGhlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgZG9lcyBub3QgcHJldmVudCB0aGUgYnJvd3NlciB6b29taW5nIHRoZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF96b29tYWJsZVwiOiBcIkNvbmZpcm0gdGhlICdtZXRhW25hbWU9dmlld3BvcnRdJyB3aXRoIFxcXCJ7MH1cXFwiIGNhbiBiZSB6b29tZWQgYnkgdXNlclwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjRcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiYjRmMGMzXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3pvb21hYmxlXCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpLnRvTG93ZXJDYXNlKCkgIT09ICd2aWV3cG9ydCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gbmVpdGhlciBtYXhpbXVtLXNjYWxlIG5vciB1c2VyLXNjYWxhYmxlIChkZWZhdWx0IHllcylcbiAgICAgICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudHJpbSgpID09PSAnJyB8fCAoIWNvbnRlbnQuaW5jbHVkZXMoJ21heGltdW0tc2NhbGUnKSAmJiAhY29udGVudC5pbmNsdWRlcygndXNlci1zY2FsYWJsZScpKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCB1c2VyX21zZyA9IG51bGw7XG4gICAgICAgIGxldCBtYXhfbXNnID0gbnVsbDtcbiAgICAgICAgY29uc3QgcHJvcHMgPSBjb250ZW50LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgbGV0IHVzZXJfc2NhbGVfdmFsdWUgPSAneWVzJztcbiAgICAgICAgbGV0IG1heGltdW1fc2NhbGVfdmFsdWUgPSAnMi4wJztcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCBwaWVjZXMgPSBwcm9wLnRyaW0oKS5zcGxpdCgnPScpO1xuICAgICAgICAgICAgaWYgKHBpZWNlcy5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wLmluY2x1ZGVzKCd1c2VyLXNjYWxhYmxlJykpIHtcbiAgICAgICAgICAgICAgICB1c2VyX21zZyA9IHByb3A7XG4gICAgICAgICAgICAgICAgdXNlcl9zY2FsZV92YWx1ZSA9IHBpZWNlc1sxXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXJfc2NhbGVfdmFsdWUuc3RhcnRzV2l0aChcIidcIikgfHwgdXNlcl9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJfc2NhbGVfdmFsdWUgPSB1c2VyX3NjYWxlX3ZhbHVlLnN1YnN0cmluZygxLCB1c2VyX3NjYWxlX3ZhbHVlLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcC5pbmNsdWRlcygnbWF4aW11bS1zY2FsZScpKSB7XG4gICAgICAgICAgICAgICAgbWF4X21zZyA9IHByb3A7XG4gICAgICAgICAgICAgICAgbWF4aW11bV9zY2FsZV92YWx1ZSA9IHBpZWNlc1sxXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKG1heGltdW1fc2NhbGVfdmFsdWUuc3RhcnRzV2l0aChcIidcIikgfHwgbWF4aW11bV9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heGltdW1fc2NhbGVfdmFsdWUgPSBtYXhpbXVtX3NjYWxlX3ZhbHVlLnN1YnN0cmluZygxLCBtYXhpbXVtX3NjYWxlX3ZhbHVlLmxlbmd0aCAtIDEpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWUgPSBOdW1iZXIodXNlcl9zY2FsZV92YWx1ZSk7XG4gICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPj0gMSB8fCB2YWx1ZSA8PSAtMSkgdXNlcl9zY2FsZV92YWx1ZSA9ICd5ZXMnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1heGltdW1fc2NhbGUgPSAyLjA7XG4gICAgICAgIHZhbHVlID0gTnVtYmVyKG1heGltdW1fc2NhbGVfdmFsdWUpO1xuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkgbWF4aW11bV9zY2FsZSA9IDIuMDtcbiAgICAgICAgICAgIGVsc2UgbWF4aW11bV9zY2FsZSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG1heGltdW1fc2NhbGVfdmFsdWUgPT09ICd5ZXMnKSBtYXhpbXVtX3NjYWxlID0gMS4wO1xuICAgICAgICAgICAgZWxzZSBtYXhpbXVtX3NjYWxlID0gMC4xO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXNlci1zY2FsYWJsZSBpcyBub3Qgc2V0IHRvICd5ZXMnLCBpZ25vcmUgbWF4aW11bV9zY2FsZVxuICAgICAgICBpZiAodXNlcl9zY2FsZV92YWx1ZSAhPT0gJ3llcycpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3pvb21hYmxlXCIsIFt1c2VyX21zZ10pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVzZXItc2NhbGFibGUgaXMgJ3llcycsIGJ1dCBtYXhpbXVtX3NjYWxlIGlzIHRvbyBzbWFsbFxuICAgICAgICBpZiAobWF4aW11bV9zY2FsZSA8IDIuMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfem9vbWFibGVcIiwgW21heF9tc2ddKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBub2VtYmVkX2NvbnRlbnRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpub2VtYmVkXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX05vZW1iZWRfSGFzQ29udGVudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQWRkIGRlc2NyaXB0aXZlIHRleHQgdG8gdGhlIDxub2VtYmVkPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPG5vZW1iZWQ+IGVsZW1lbnRzIHNob3VsZCBjb250YWluIGRlc2NyaXB0aXZlIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBvYmplY3RfdGV4dF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwib2JqZWN0X3RleHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206b2JqZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfT2JqZWN0X0hhc1RleHRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIjogXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm9iamVjdF90ZXh0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJvYmplY3RfdGV4dF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIjogXCJvYmplY3RfdGV4dF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxvYmplY3Q+IGVsZW1lbnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZSBmb3IgdGhlIGNvbnRlbnQgcmVuZGVyZWQgYnkgdGhlIG9iamVjdFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiPG9iamVjdD4gZWxlbWVudCBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiOiBcIkFuIDxvYmplY3Q+IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiOGZjM2I2XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gRGV0ZWN0IGlmIHRoaXMgb2JqZWN0IGlzIG9mIHR5cGUgdGV4dCwgYnkgY2hlY2tpbmcgdGhlIG9iamVjdCB0eXBlIGluIHRoZSBjYXNlIGl0IGlzIHRleHQgdGhlbiBkbyBub3QgdHJpZ2dlciB0aGlzIHJ1bGVcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgJiYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikpLmluZGV4T2YoXCJ0ZXh0XCIpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZDogaW5jbHVkaW5nICdwcmVzZW50YXRpb24nLCAnbm9uZScsICdhcHBsaWNhdGlvbicsICdkb2N1bWVudCcgb3IgJ2ltZydcbiAgICAgICAgLy8gdGhpcyBjYXNlIHdpbGwgYmUgY292ZXJlZCBpbiBvdGhlciBydWxlc1xuICAgICAgICBsZXQgcm9sZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIik7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBlciBBQ1QsIGlnbm9yZSBlbWJlZGRlZCBIVE1MIGZpbGVzXG4gICAgICAgIGxldCBkYXRhID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZGF0YVwiKTtcbiAgICAgICAgbGV0IGV4dCA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09IHR5cGVvZiBcIlwiID8gZGF0YS5zdWJzdHJpbmcoZGF0YS5sYXN0SW5kZXhPZihcIi5cIikpIDogXCJcIjtcbiAgICAgICAgaWYgKGV4dCA9PT0gXCIuaHRtbFwiIHx8IGV4dCA9PT0gXCIuaHRtXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcGFzc2VkID0gcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAvL2xldCBwYXNzZWQgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBbmNlc3RvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3JcIjtcblxuZXhwb3J0IGNvbnN0IHBhZ2VfdGl0bGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcInBhZ2VfdGl0bGVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0RvY19IYXNUaXRsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHBhZ2Ugc2hvdWxkIGhhdmUgYSB0aXRsZSB0aGF0IGNvcnJlY3RseSBpZGVudGlmaWVzIHRoZSBzdWJqZWN0IG9mIHRoZSBwYWdlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk1pc3NpbmcgPGhlYWQ+IGVsZW1lbnQgc28gdGhlcmUgY2FuIGJlIG5vIDx0aXRsZT4gZWxlbWVudCBwcmVzZW50XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIk1pc3NpbmcgPHRpdGxlPiBlbGVtZW50IGluIDxoZWFkPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlRoZSA8dGl0bGU+IGVsZW1lbnQgaXMgZW1wdHkgKG5vIGlubmVySFRNTClcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiMjc3OWE1XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUaGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgaW5zaWRlIGEgcHJlc2VudGF0aW9uYWwgZnJhbWVcbiAgICAgICAgaWYgKEFuY2VzdG9yVXRpbC5pc0ZyYW1lKGNvbnRleHRIaWVyYXJjaGllcykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIE5vZGU7XG4gICAgICAgIC8vIEZpcnN0LCBmaW5kIHRoZSBoZWFkIGVsZW1lbnRcbiAgICAgICAgbGV0IGZpbmRIZWFkID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgZmluZFRpdGxlID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKGZpbmRIZWFkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChmaW5kSGVhZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaGVhZFwiKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZmluZEhlYWQgPSBmaW5kSGVhZC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICBsZXQgcG9zc2libGVUaXRsZXMgPSAocnVsZUNvbnRleHQgYXMgRWxlbWVudCkucXVlcnlTZWxlY3RvckFsbChcInRpdGxlXCIpO1xuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBwb3NzaWJsZVRpdGxlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuZ2V0QW5jZXN0b3IocG9zc2libGVUaXRsZXNbaWR4XSwgW1wic3ZnXCJdKSkge1xuICAgICAgICAgICAgICAgIGZpbmRUaXRsZSA9IHBvc3NpYmxlVGl0bGVzW2lkeF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbmRIZWFkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIWZpbmRUaXRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaW5kVGl0bGUgPT09IG51bGwpIHsgLy8gZG9uJ3QgaGF2ZSB0aXRsZSBzZWNvbmQgUG9GXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB3ZSBnZXQgaGVyZSB3ZSBoYXZlIDxoZWFkPiBhbmQgPHRpdGxlPlxuXG4gICAgICAgIGlmIChmaW5kVGl0bGUgIT0gbnVsbCAmJiBDb21tb25VdGlsLmdldElubmVyVGV4dChmaW5kVGl0bGUpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7IC8vIDx0aXRsZT4gaGFzIG5vIGlubmVySFRNTCB0aGlyZCBQb0ZcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHBhZ2VfdGl0bGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwicGFnZV90aXRsZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmhlYWQgZG9tOnRpdGxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGl0bGVfVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiUG90ZW50aWFsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhZ2VfdGl0bGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzFcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF8xXCI6IFwiUGFnZSA8dGl0bGU+IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiVmVyaWZ5IHRoYXQgdXNpbmcgdGhlIGZpbGVuYW1lIGFzIHRoZSBwYWdlIDx0aXRsZT4gdmFsdWUgaXMgZGVzY3JpcHRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlIDx0aXRsZT4gc2hvdWxkIGJlIGEgZGVzY3JpcHRpdmUgdGl0bGUsIHJhdGhlciB0aGFuIGEgZmlsZW5hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgbGV0IHRpdGxlU3RyID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpLnRyaW0oKTtcblxuICAgICAgICAvLyBhbGxvdyAuY29tLCAubmV0IGFuZCAub3JnXG4gICAgICAgIGxldCB0aXRsZVN0ckxvd2VyY2FzZSA9IHRpdGxlU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aXRsZVN0ckxvd2VyY2FzZS5pbmNsdWRlcyhcIi5jb21cIikgfHwgdGl0bGVTdHJMb3dlcmNhc2UuaW5jbHVkZXMoXCIubmV0XCIpIHx8IHRpdGxlU3RyTG93ZXJjYXNlLmluY2x1ZGVzKFwiLm9yZ1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFt0aXRsZVN0cl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpdGxlU3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBjb3ZlcmVkIGJ5IHBhZ2VfdGl0bGVfZXhpc3RzXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsvL1J1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBhc3NlZCA9ICEvXlxcUypcXC5bYS16QS1aXXsxLDR9KD8hLil8Xmh0dHBzPzpcXC9cXC9cXFMqL2kudGVzdCh0aXRsZVN0cik7XG5cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFt0aXRsZVN0cl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206KltvbmZvY3VzXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1NjcmlwdF9Gb2N1c0JsdXJzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSBzY3JpcHQgZG9lcyBub3QgcmVtb3ZlIGZvY3VzIGZyb20gY29udGVudCB0aGF0IG5vcm1hbGx5IHJlY2VpdmVzIGZvY3VzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2NyaXB0aW5nIG11c3Qgbm90IHJlbW92ZSBmb2N1cyBmcm9tIGNvbnRlbnQgdGhhdCBub3JtYWxseSByZWNlaXZlcyBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIiwgXCIyLjQuN1wiLCBcIjMuMi4xXCJdLCAvL21hdGNoIHJlcXVpcmVtZW50cyBsaXN0ZWQgaW4gaGVscFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmZvY3VzXCIpLmluZGV4T2YoXCIuYmx1cihcIikgPT0gLTE7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRfb25jbGlja19hdm9pZDogUnVsZSA9IHtcbiAgICBpZDogXCJzY3JpcHRfb25jbGlja19hdm9pZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25jbGlja11cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcInNjcmlwdF9vbmNsaWNrX21pc3VzZVwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TY3JpcHRfT25jbGlja0hUTUwyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9vbmNsaWNrX2F2b2lkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfb25jbGlja19hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X29uY2xpY2tfYXZvaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0ICdvbmNsaWNrJyBldmVudHMgYXJlIG5vdCB1c2VkIGluIHNjcmlwdCB0byBlbXVsYXRlIGEgbGlua1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcmlwdHMgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGVtdWxhdGUgbGlua3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLCAvL2hlbHAgYW5kIG1hdGNoIG1hcHBpbmcgdG8gMi4xLjEgb25seSBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIHRoaXMgZm9yIFNWRyBlbGVtZW50IGZvciBub3cgdW50aWwgYSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUgKGJ5IFJpY2gpXG4gICAgICAgIC8vIHRvIHN1cHBvcnQgU1ZHIGF0IGEgcG9pbnQgd2hlbiB0aGUgU1ZHIGExMXkgc3BlYyBpcyByZWFkeS5cbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwic3ZnXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBhcmlhLXJvbGUgc3BlY2lmaWVkLCBkb24ndCB0cmlnZ2VyIHRoaXMuXG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInJvbGVcIikpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IG5vZGVOYW1lID09IFwiYVwiIHx8IG5vZGVOYW1lID09IFwiYXJlYVwiIHx8IG5vZGVOYW1lID09IFwiaW5wdXRcIjtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHNjcmlwdF9vbmNsaWNrX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJzY3JpcHRfb25jbGlja19taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU2NyaXB0X09uY2xpY2tIVE1MMVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfb25jbGlja19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNjcmlwdF9vbmNsaWNrX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3NzaWJsZSB1c2Ugb2YgYSBzY3JpcHQgdG8gZW11bGF0ZSBhIGxpbmtcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTY3JpcHRzIHNob3VsZCBub3QgYmUgdXNlZCB0byBlbXVsYXRlIGxpbmtzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSwgLy9oZWxwIGFuZCBtYXRjaCBtYXBwaW5nIHRvIDIuMS4xIG9ubHkgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBmYWlsU3Vic3RyaW5nOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIi5hc3BcIiwgXCIuYXNweFwiLCBcIi5jZm1cIiwgXCIuY2ZtbFwiLCBcIi5jZ2lcIiwgXCIuaHRtXCIsIFwiLmh0bWxcIiwgXCIuc2h0bVwiLFxuICAgICAgICAgICAgICAgICAgICBcIi5zaHRtbFwiLCBcIi5waHBcIiwgXCIucGxcIiwgXCIucHlcIiwgXCIuc2h0bVwiLCBcIi5zaHRtbFwiLCBcIi54aHRtbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImxvY2F0aW9uLmhyZWZcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXJpYS1yb2xlIHNwZWNpZmllZCwgZG9uJ3QgdHJpZ2dlciB0aGlzLlxuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJyb2xlXCIpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGEgb3IgYXJlYSwgZG9uJ3QgdHJpZ2dlciBpZiB0aGVyZSdzIGFuIGhyZWYuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKG5vZGVOYW1lID09IFwiYVwiIHx8IG5vZGVOYW1lID09IFwiYXJlYVwiKSAmJiBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImhyZWZcIikpO1xuXG4gICAgICAgIC8vIElmIHRoZSBndWFyZHMgZmFpbGVkLCBjaGVjayB0byBzZWUgaWYgdGhleSdyZSBsb29raW5nIGF0IGxpbmtzXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBsZXQgZmFpbFN1YnN0cmluZyA9IHZhbGlkYXRlUGFyYW1zLmZhaWxTdWJzdHJpbmcudmFsdWU7O1xuICAgICAgICAgICAgbGV0IG9uY2xpY2sgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgZmFpbFN1YnN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IG9uY2xpY2suaW5kZXhPZihmYWlsU3Vic3RyaW5nW2ldKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IHNjcmlwdF9zZWxlY3RfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU2VsZWN0X05vQ2hhbmdlQWN0aW9uXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfc2VsZWN0X3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X3NlbGVjdF9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IG5vIGNoYW5nZSBvZiBjb250ZXh0IG9yIGFjdGlvbiBvY2N1cnMgd2hlbiBzZWxlY3Rpb24gb3B0aW9ucyBpbiB0aGlzIGNvbXBvbmVudCByZWNlaXZlIGZvY3VzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTm8gY2hhbmdlcyBvZiBjb250ZXh0IHNob3VsZCBvY2N1ciB3aGVuIGEgc2VsZWN0aW9uIHZhbHVlIHJlY2VpdmVzIGZvY3VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25jaGFuZ2VcIikgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIik7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzZWxlY3Rfb3B0aW9uc19ncm91cGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInNlbGVjdF9vcHRpb25zX2dyb3VwZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpzZWxlY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9TZWxlY3RfSGFzT3B0R3JvdXBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiR3JvdXAgb2YgcmVsYXRlZCBvcHRpb25zIG1heSBuZWVkIDxvcHRncm91cD5cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJHcm91cHMgb2YgcmVsYXRlZCBvcHRpb25zIHdpdGhpbiBhIHNlbGVjdGlvbiBsaXN0IHNob3VsZCBiZSBncm91cGVkIHdpdGggPG9wdGdyb3VwPlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgcGFyYW1OdW1PcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDEwLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlcyB3aGVyZSBvcHRncm91cCBpcyBoaWRkZW4sIHdoaWNoIHNob3VsZCB0cmlnZ2VyIGEgdmlvbGF0aW9uc1xuICAgICAgICAvLyBidXQgaW4gdGhlIGNhc2UgdGhhdCBDaGVjayBoaWRkZW4gb3B0aW9uIGlzIHNldCB0aGVuIHNob3VsZCBub3QgdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0Q2hpbGRCeVRhZ0hpZGRlbihydWxlQ29udGV4dCwgXCJvcHRncm91cFwiLCBmYWxzZSwgdHJ1ZSkubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHJ1bGVDb250ZXh0LCBcIm9wdGlvblwiLCBmYWxzZSwgdHJ1ZSkubGVuZ3RoIDw9XG4gICAgICAgICAgICB2YWxpZGF0ZVBhcmFtcy5wYXJhbU51bU9wdGlvbnMudmFsdWU7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBza2lwX21haW5fZGVzY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcInNraXBfbWFpbl9kZXNjcmliZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJza2lwX21haW5fZXhpc3RzXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0JvZHlfRmlyc3RBQ29udGFpbnNTa2lwVGV4dF9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2tpcF9tYWluX2Rlc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgaWYgdGhpcyBoeXBlcmxpbmsgc2tpcHMgY29udGVudCwgdGhlIGRlc2NyaXB0aW9uIGNvbW11bmljYXRlcyB3aGVyZSBpdCBsaW5rcyB0b1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBkZXNjcmlwdGlvbiBvZiBhIGh5cGVybGluayB1c2VkIHRvIHNraXAgY29udGVudCBtdXN0IGNvbW11bmljYXRlIHdoZXJlIGl0IGxpbmtzIHRvXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgcGFyYW1Ta2lwVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJza2lwXCIsIFwianVtcFwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBHZXQgdGhlIGFuY2hvcnMgb24gdGhlIHBhZ2VcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGxhbmRtYXJrcyBmaXJzdFxuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4ocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgW1wiYXBwbGljYXRpb25cIiwgXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIixcbiAgICAgICAgICAgICAgICBcImZvcm1cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcInNlYXJjaFwiXG4gICAgICAgICAgICBdLCB0cnVlLCB0cnVlKS5sZW5ndGggPiAwKTtcbiAgICAgICAgfVxuICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHsgLy8gTm8gbGFuZG1hcmtzLCBjaGVjayBmb3Igc2tpcCBsaW5rc1xuICAgICAgICAgICAgbGV0IGxpbmtzID0gZG9jLmxpbmtzO1xuICAgICAgICAgICAgLy8gU2tpcCBsaW5rIHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lIG9uIHRoZSBwYWdlIHdpdGggYW4gaHJlZiBhdHRyaWJ1dGUgKGkuZS4sIGxpbmtzWzBdKVxuICAgICAgICAgICAgLy8gYWxzbyBpZiB0aGUgZmlyc3QgbGluayBpcyBoaWRkZW4gdGhlbiB3ZSBzaG91bGQgYWxzbyB0cmlnZ2VyIGEgdmlvbGF0aW9uLlxuICAgICAgICAgICAgaWYgKGxpbmtzICYmIGxpbmtzLmxlbmd0aCA+IDAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGxpbmtzWzBdKSkge1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0VGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGRvYy5saW5rc1swXSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgdmFsaWRhdGVQYXJhbXMucGFyYW1Ta2lwVGV4dC52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0ZXN0VGV4dC5pbmRleE9mKHZhbGlkYXRlUGFyYW1zLnBhcmFtU2tpcFRleHQudmFsdWVbaV0pICE9IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQW5jZXN0b3JVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBza2lwX21haW5fZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcInNraXBfbWFpbl9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQm9keV9GaXJzdEFTa2lwc19OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNraXBfbWFpbl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIHBhZ2UgZG9lcyBub3QgcHJvdmlkZSBhIHdheSB0byBxdWlja2x5IG5hdmlnYXRlIHRvIHRoZSBtYWluIGNvbnRlbnQgKEFSSUEgXFxcIm1haW5cXFwiIGxhbmRtYXJrIG9yIGEgc2tpcCBsaW5rKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2VzIG11c3QgcHJvdmlkZSBhIHdheSB0byBza2lwIGRpcmVjdGx5IHRvIHRoZSBtYWluIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGluc2lkZSBhIHByZXNlbnRhdGlvbmFsIGZyYW1lXG4gICAgICAgIGlmIChBbmNlc3RvclV0aWwuaXNQcmVzZW50YXRpb25GcmFtZShjb250ZXh0SGllcmFyY2hpZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBHZXQgdGhlIGFuY2hvcnMgb24gdGhlIHBhZ2VcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGxhbmRtYXJrcyBmaXJzdFxuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4ocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgW1wiYXBwbGljYXRpb25cIiwgXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIixcbiAgICAgICAgICAgICAgICBcImZvcm1cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcInNlYXJjaFwiXG4gICAgICAgICAgICBdLCB0cnVlLCB0cnVlKS5sZW5ndGggPiAwKTtcbiAgICAgICAgfVxuICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHsgLy8gTm8gbGFuZG1hcmtzLCBjaGVjayBmb3Igc2tpcCBsaW5rc1xuICAgICAgICAgICAgbGV0IGFuY2hvcnMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiYVwiKTtcblxuICAgICAgICAgICAgLy8gU2tpcCBhbmNob3Igc2hvdWxkIGJlIHRoZSBmaXJzdCBvbmUgb24gdGhlIHBhZ2Ugd2l0aCBhbiBocmVmIGF0dHJpYnV0ZVxuICAgICAgICAgICAgbGV0IHRlc3RBbmNob3IgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbmNob3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoYW5jaG9yc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdEFuY2hvciA9IGFuY2hvcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHVsbCBvdXQgdGhlIHRhcmdldCBpZFxuICAgICAgICAgICAgbGV0IHRhcmdldElkID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0ZXN0QW5jaG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgaHJlZlN0ciA9IHRlc3RBbmNob3IuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgaWR4ID0gaHJlZlN0ci5pbmRleE9mKFwiI1wiKTtcbiAgICAgICAgICAgICAgICBpZiAoaWR4ICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldElkID0gaHJlZlN0ci5zdWJzdHJpbmcoaWR4ICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGFuIGVsZW1lbnQgaWQgb3IgbmFtZWQgYW5jaG9yIG9uIHRoZSBwYWdlIHdpdGggdGhpc1xuICAgICAgICAgICAgLy8gdGFyZ2V0IGlkLlxuXG4gICAgICAgICAgICBpZiAodGFyZ2V0SWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGRvYy5nZXRFbGVtZW50QnlJZCh0YXJnZXRJZCkgIT0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yc1tpXS5oYXNBdHRyaWJ1dGUoXCJuYW1lXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzW2ldLmdldEF0dHJpYnV0ZShcIm5hbWVcIikgPT0gdGFyZ2V0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmVcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOipbc3R5bGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU3R5bGVfQmFja2dyb3VuZEltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGUgQ1NTIGJhY2tncm91bmQgaW1hZ2UgZG9lcyBub3QgY29udmV5IGltcG9ydGFudCBpbmZvcm1hdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkltYWdlcyBpbmNsdWRlZCBieSB1c2luZyBDU1MgYWxvbmUgbXVzdCBub3QgY29udmV5IGltcG9ydGFudCBpbmZvcm1hdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicmVsXCIpICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZXNoZWV0XCIpIHtcbiAgICAgICAgICAgIC8vIEV4dGVybmFsIHN0eWxlc2hlZXQgLSB0cmlnZ2VyXG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLnRyaWdnZXJPbmNlKHJ1bGVDb250ZXh0LCBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZVwiLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCAmJiBub2RlTmFtZSA9PT0gXCJzdHlsZVwiIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBsZXQgc3R5bGVUZXh0O1xuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpXG4gICAgICAgICAgICAgICAgc3R5bGVUZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHN0eWxlVGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgICAgICAgbGV0IGJnTWF0Y2hlcyA9IHN0eWxlVGV4dC5tYXRjaCgvYmFja2dyb3VuZDpbXjtdKi9nKTtcbiAgICAgICAgICAgIGlmIChiZ01hdGNoZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBiZ01hdGNoZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGJnTWF0Y2hlc1tpXS5pbmRleE9mKFwidXJsKFwiKSA9PT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG4vKipcbiAqIERlc2NyaXB0aW9uOiBUcmlnZ2VyIGlmIDpiZWZvcmUgYW5kIDphZnRlciBhcmUgdXNlZCBpbiBDU1MgKEludGVybmFsIGFuZCBFeHRlcm5hbCkgd2l0aCBjb250ZW50XG4gKiBPcmlnaW46IFdDQUcgMi4wIEY4N1xuICovXG5leHBvcnQgY29uc3Qgc3R5bGVfYmVmb3JlX2FmdGVyX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbTpsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU3R5bGVfQmVmb3JlQWZ0ZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXcuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkRvIG5vdCB1c2UgQ1NTICc6OmJlZm9yZScgYW5kICc6OmFmdGVyJyBwc2V1ZG8tZWxlbWVudHMgdG8gaW5zZXJ0IG5vbi1kZWNvcmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlICc6OmJlZm9yZScgYW5kICc6OmFmdGVyJyBwc2V1ZG8tZWxlbWVudHMgZG8gbm90IGluc2VydCBub24tZGVjb3JhdGl2ZSBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIC8vIFR1cm4gb2ZmIHRoZSBydWxlIGR1ZSB0byB0aGUgb2Jzb2xldGUgcmVxdWlyZW1lbnRcbiAgICAgICAgLy9pZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBpZDogW10sXG4gICAgICAgIG51bTogXCIxLjMuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgLy9jaGVjayBJbnRlcm5hbCBzdHlsZXMgICAgICAgIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICBsZXQgY3NzID0gQ1NTVXRpbC5nZXRDU1NTdHlsZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjc3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGJhZCBDU1NcbiAgICAgICAgICAgICAgICBpZiAoY3NzW2ldLnNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChjc3NbaV0uc2VsZWN0b3IuaW5kZXhPZihcIjpiZWZvcmVcIikgPT09IC0xICYmIGNzc1tpXS5zZWxlY3Rvci5pbmRleE9mKFwiOmFmdGVyXCIpID09PSAtMSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICEoXCJjb250ZW50XCIgaW4gY3NzW2ldLnZhbHVlcykgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpLmxlbmd0aCA9PT0gMCB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwiXFxcIlxcXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcIlxcJ1xcJ1wiIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJub25lXCIgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcImF0dHIoeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcImF0dHIoeSlcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIHNwZWNpYWwgcnVsZXMgaW4gdGhlIHN0eWxlc2hlZXRzXG4gICAgICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHBhc3NlZCAmJiBzdHlsZVJ1bGVJbmRleCA8IHN0eWxlUnVsZXMubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIEBtZWRpYSBydWxlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2hlY2sgJ2lmIChzdHlsZVJ1bGUgaW5zdGFuY2VvZiBDU1NNZWRpYVJ1bGUpJyBkb2Vzbid0IHdvcmsgd2hlbiBydW4gaW4gS2FybWEoYnV0IHdvcmtzIGluIERBUCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBsZXQncyBhY2Nlc3MgdGhlIHR5cGUgZGlyZWN0bHkgYXMgYSB3b3JrYXJvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVJbXBvcnRSdWxlOiBDU1NJbXBvcnRSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZS50eXBlICYmIHN0eWxlUnVsZS50eXBlID09PSA0IC8qIENTU1J1bGUuTUVESUFfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZU1lZGlhUnVsZSA9IHN0eWxlUnVsZSBhcyBDU1NNZWRpYVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhUnVsZXMgPSBzdHlsZU1lZGlhUnVsZS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbVJ1bGUgPSBtZWRpYVJ1bGVzW3JJbmRleF0gYXMgYW55OyAvLyBzZWxlY3RvclRleHQgbm90IHJlY29nbml6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IG1SdWxlLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydCBydWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVSdWxlLnR5cGUgJiYgc3R5bGVSdWxlLnR5cGUgPT09IDMgLyogQ1NTUnVsZS5JTVBPUlRfUlVMRSAqLyAmJiAoc3R5bGVJbXBvcnRSdWxlID0gc3R5bGVSdWxlIGFzIENTU0ltcG9ydFJ1bGUpLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHBhc3NlZCAmJiBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0ZWRSdWxlID0gcnVsZXNbckluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIEBtZWRpYSBydWxlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUudHlwZSAmJiBpbXBvcnRlZFJ1bGUudHlwZSA9PT0gNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVkaWFSdWxlcyA9IChpbXBvcnRlZFJ1bGUgYXMgQ1NTTWVkaWFSdWxlKS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBtSW5kZXggPSAwOyBtSW5kZXggPCBtZWRpYVJ1bGVzLmxlbmd0aDsgbUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtUnVsZSA9IG1lZGlhUnVsZXNbbUluZGV4XSBhcyBhbnk7IC8vIHNlbGVjdG9yVGV4dCBub3QgcmVjb2duaXplZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiBtUnVsZS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gbVJ1bGUuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuaW5kZXhPZihcIjpiZWZvcmVcIikgIT09IC0xIHx8IHJ1bGUuaW5kZXhPZihcIjphZnRlclwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBtUnVsZS5zdHlsZVsnY29udGVudCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKSAhPT0gXCJcXFwiXFxcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiXFwnXFwnXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHgpXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHkpXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChpbXBvcnRlZFJ1bGUgYXMgYW55KS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgKGltcG9ydGVkUnVsZSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSAoaW1wb3J0ZWRSdWxlIGFzIGFueSkuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdXBwb3J0IGJvdGggc2luZ2xlIGNvbG9uICg6KSBhbmQgZG91YmxlIGNvbG9uICg6OikgcHNldWRvICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuaW5kZXhPZihcIjpiZWZvcmVcIikgIT09IC0xIHx8IHJ1bGUuaW5kZXhPZihcIjphZnRlclwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAoaW1wb3J0ZWRSdWxlIGFzIGFueSkuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGV4dGVybmFsIHN0eWxlcyBcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibGlua1wiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicmVsXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVzaGVldFwiICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIikudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xuXG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVGcm9tTGluayA9IHJ1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIEBtZWRpYSBydWxlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVGcm9tTGluay50eXBlICYmIHJ1bGVGcm9tTGluay50eXBlID09PSA0IC8qIENTU1J1bGUuTUVESUFfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhUnVsZXMgPSAocnVsZUZyb21MaW5rIGFzIENTU01lZGlhUnVsZSkuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG1JbmRleCA9IDA7IHBhc3NlZCAmJiBtSW5kZXggPCBtZWRpYVJ1bGVzLmxlbmd0aDsgbUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1SdWxlID0gbWVkaWFSdWxlc1ttSW5kZXhdIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiBtUnVsZS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVTZWxUeHQgPSBtUnVsZS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlU2VsVHh0LmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlU2VsVHh0LmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBtUnVsZS5zdHlsZVsnY29udGVudCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiXFwnXFwnXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHkpXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChydWxlc1tySW5kZXhdIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIChydWxlc1tySW5kZXhdIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gKHJ1bGVzW3JJbmRleF0gYXMgYW55KS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBib3RoIHNpbmdsZSBjb2xvbiAoOikgYW5kIGRvdWJsZSBjb2xvbiAoOjopIHBzZXVkbyAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuaW5kZXhPZihcIjpiZWZvcmVcIikgIT09IC0xIHx8IHJ1bGUuaW5kZXhPZihcIjphZnRlclwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IChydWxlc1tySW5kZXhdIGFzIGFueSkuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2NvbG9yX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9jb2xvcl9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOipbc3R5bGVdLCBkb206Zm9udFtjb2xvcl0sIGRvbTpsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU3R5bGVfQ29sb3JTZW1hbnRpY3MxXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfY29sb3JfbWlzdXNlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX2NvbG9yX21pc3VzZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX2NvbG9yX21pc3VzZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJDb21iaW5lIGNvbG9yIGFuZCBkZXNjcmlwdGl2ZSBtYXJrdXAgdG8gY29udmV5IGluZm9ybWF0aW9uXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IGNvbG9yIGlzIG5vdCB1c2VkIGFzIHRoZSBvbmx5IHZpc3VhbCBtZWFucyBvZiBjb252ZXlpbmcgaW5mb3JtYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjEuNC4xXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgc3R5bGVUZXh0ID0gXCJcIjtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgLy8gY2hlY2sgaW1wb3J0XG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlSW1wb3J0UnVsZTogQ1NTSW1wb3J0UnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlLnR5cGUgJiYgc3R5bGVSdWxlLnR5cGUgPT09IDMgLyogQ1NTUnVsZS5JTVBPUlRfUlVMRSAqLyAmJiAoc3R5bGVJbXBvcnRSdWxlID0gc3R5bGVSdWxlIGFzIENTU0ltcG9ydFJ1bGUpLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydFJ1bGVzID0gc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgPyBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA6IHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBySW5kZXggPCBpbXBvcnRSdWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaVJ1bGUgPSBpbXBvcnRSdWxlc1tySW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVUZXh0ICs9IGlSdWxlLmNzc1RleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJzdHlsZVwiKSkge1xuICAgICAgICAgICAgc3R5bGVUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIgJiYgLy9jaGVjayBleHRlcm5hbCBzdHlsZXNcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicmVsXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVzaGVldFwiICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpLnRyaW0oKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVUZXh0ICs9IHJ1bGVzW3JJbmRleF0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIERlZmVjdCAxMDIyOiBGaW5kIHVzZXMgb2YgJ2NvbG9yJyBhbmQgJypiYWNrZ3JvdW5kKicgb25seVxuICAgICAgICBsZXQgaXNCZ1VzZWQgPSBzdHlsZVRleHQubWF0Y2goL1xcYmJhY2tncm91bmRcXGIvaSk7XG5cbiAgICAgICAgbGV0IHRoZUNvbG9yU3R5bGVUb0NoZWNrID0gc3R5bGVUZXh0LnJlcGxhY2UoLy1jb2xvci9nLCBcIlwiKTtcbiAgICAgICAgbGV0IGlzQ29sb3JVc2VkID0gdGhlQ29sb3JTdHlsZVRvQ2hlY2subWF0Y2goL1xcYmNvbG9yXFxiL2kpO1xuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjb2xvclwiKSB8fCBpc0NvbG9yVXNlZCB8fCBpc0JnVXNlZCkge1xuICAgICAgICAgICAgbGV0IGdvb2RUYWdOYW1lcyA9IHtcbiAgICAgICAgICAgICAgICBcImVtXCI6IFwiXCIsIFwic3Ryb25nXCI6IFwiXCIsIFwiY2l0ZVwiOiBcIlwiLCBcImRmblwiOiBcIlwiLFxuICAgICAgICAgICAgICAgIFwiY29kZVwiOiBcIlwiLCBcInNhbXBcIjogXCJcIiwgXCJrYmRcIjogXCJcIiwgXCJ2YXJcIjogXCJcIiwgXCJhYmJyXCI6IFwiXCIsIFwiYWNyb255bVwiOiBcIlwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb2xvciB1c2VkIO+/vSBhcmUgdGhlcmUgc2VtYW50aWNzIGludm9sdmVkP1xuICAgICAgICAgICAgcGFzc2VkID0gbm9kZU5hbWUgaW4gZ29vZFRhZ05hbWVzIHx8XG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgZ29vZFRhZ05hbWVzKSAhPT0gbnVsbDtcbiAgICAgICAgICAgIGlmICghcGFzc2VkICYmIHJ1bGVDb250ZXh0Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIGluIGdvb2RUYWdOYW1lcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJpZ2dlciBvbmx5IG9uY2VcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCB0cmlnZ2VyZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJzdHlsZV9jb2xvcl9taXN1c2VcIiwgZmFsc2UpO1xuICAgICAgICAgICAgcGFzc2VkID0gdHJpZ2dlcmVkO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwic3R5bGVfY29sb3JfbWlzdXNlXCIsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ29sb3JVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29sb3JVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzdHlsZV9mb2N1c192aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2ZvY3VzX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU3R5bGVfSGluZGVyRm9jdXMxXCI6IHtcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfZm9jdXNfdmlzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCI6IGBzdHlsZV9mb2N1c192aXNpYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJwYXNzX2ZvY3VzX3Zpc2libGVcIjogYHN0eWxlX2ZvY3VzX3Zpc2libGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBzaG91bGQgYmUgdmlzaWJsZSB3aGVuIGRlZmF1bHQgYm9yZGVyIG9yIG91dGxpbmUgaXMgbW9kaWZpZWQgYnkgQ1NTXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiOiBcIkNoZWNrIHRoZSBrZXlib2FyZCBmb2N1cyBpbmRpY2F0b3IgaXMgdmlzaWJsZSB3aGVuIHVzaW5nIENTUyBkZWNsYXJhdGlvbiBmb3IgJ2JvcmRlcicgb3IgJ291dGxpbmUnXCIsXG4gICAgICAgICAgICBcInBhc3NfZm9jdXNfdmlzaWJsZVwiOiBcIlRoZSBrZXlib2FyZCBmb2N1cyBpbmRpY2F0b3IgaXMgdmlzaWJsZSBvciBpcyBub3QgY2hhbmdlZCBmcm9tIHRoZSBicm93c2VyIGRlZmF1bHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjIuNC43XCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHNraXBOb2Rlczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJ0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGVja1BhcmFtczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJib3JkZXJcIiwgXCJib3JkZXItd2lkdGhcIiwgXCJib3JkZXItc3R5bGVcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci10b3Atd2lkdGhcIiwgXCJib3JkZXItcmlnaHQtd2lkdGhcIiwgXCJib3JkZXItYm90dG9tLXdpZHRoXCIsIFwiYm9yZGVyLWxlZnQtd2lkdGhcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci10b3AtY29sb3JcIiwgXCJib3JkZXItcmlnaHQtY29sb3JcIiwgXCJib3JkZXItYm90dG9tLWNvbG9yXCIsIFwiYm9yZGVyLWxlZnQtY29sb3JcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci10b3Atc3R5bGVcIiwgXCJib3JkZXItcmlnaHQtc3R5bGVcIiwgXCJib3JkZXItYm90dG9tLXN0eWxlXCIsIFwiYm9yZGVyLWxlZnQtc3R5bGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwib3V0bGluZVwiLCBcIm91dGxpbmUtd2lkdGhcIiwgXCJvdXRsaW5lLWNvbG9yXCIsIFwib3V0bGluZS1zdHlsZVwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpIHx8IHZhbGlkYXRlUGFyYW1zLnNraXBOb2Rlcy52YWx1ZS5pbmNsdWRlcyhydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2V0IGFsbCBzdHlsZXMgaW4gYSBzaW5nbGUgcGFzcyB0aHJvdWdoIHN0eWxlc2hlZXRzXG4gICAgICAgIGNvbnN0IGFsbFN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKHJ1bGVDb250ZXh0LCBudWxsLCBbXCJcIiwgXCI6Zm9jdXNcIiwgXCI6Zm9jdXMtdmlzaWJsZVwiLCBcIjpmb2N1cy13aXRoaW5cIl0pO1xuICAgICAgICBsZXQgbm9ybWFsU3R5bGVzID0gYWxsU3R5bGVzW1wiXCJdOyAvLyBjb25zaWRlciBib3RoIHVzZXItZGVmaW5lZCBhbmQgYnJvd3NlciBkZWZhdWx0XG4gICAgICAgIGxldCBmb2N1c1N0eWxlcyA9IFtdXG4gICAgICAgIGZvY3VzU3R5bGVzLnB1c2goYWxsU3R5bGVzW1wiOmZvY3VzXCJdKTtcbiAgICAgICAgZm9jdXNTdHlsZXMucHVzaChhbGxTdHlsZXNbXCI6Zm9jdXMtdmlzaWJsZVwiXSk7XG4gICAgICAgIGZvY3VzU3R5bGVzLnB1c2goYWxsU3R5bGVzW1wiOmZvY3VzLXdpdGhpblwiXSk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZiBmb2N1cyBzdHlsZSBpcyBkZWZpbmVkXG4gICAgICAgIGxldCBzdHlsZU9iaiA9IGZvY3VzU3R5bGVzWzBdO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc3R5bGVPYmopLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vcGFzcyBpZiBvdXRsaW5lIGlzIG5vdCBkZWZpbmVkIGF0IGFsbCwgYnJvd3NlciB3aWxsIG92ZXJyaWRlIFxuICAgICAgICAgICAgaWYgKCgoIW5vcm1hbFN0eWxlc1tcIm91dGxpbmUtd2lkdGhcIl0gJiYgIW5vcm1hbFN0eWxlc1tcIm91dGxpbmUtc3R5bGVcIl0pXG4gICAgICAgICAgICAgICAgfHwgKG5vcm1hbFN0eWxlc1tcIm91dGxpbmUtd2lkdGhcIl0gPT09ICcwcHgnIHx8IG5vcm1hbFN0eWxlc1tcIm91dGxpbmUtc3R5bGVcIl0gPT09ICdub25lJykpXG4gICAgICAgICAgICAgICAgJiYgKCFzdHlsZU9ialtcIm91dGxpbmUtc3R5bGVcIl0gfHwgc3R5bGVPYmpbXCJvdXRsaW5lLXN0eWxlXCJdICE9PSAnbm9uZScpKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZm9jdXNfdmlzaWJsZVwiKTsgICAgICAgXG5cbiAgICAgICAgICAgIGxldCBub25lU3R5bGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBudW1PdGhlclN0eWxlID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGZvY3VzU3R5bGUgaW4gc3R5bGVPYmopIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVQYXJhbXMuY2hlY2tQYXJhbXMudmFsdWUuaW5jbHVkZXMoZm9jdXNTdHlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIGZhaWx1cmUgY2FzZTogIFxuICAgICAgICAgICAgICAgICAgICAgKiAgMS4gZm9jdXMgb3V0bGluZSBvciBib3JkZXIgc3R5bGUgaXMgbm9uZSBhbmQgbm8gb3RoZXIgc3R5bGUgKGNvbG9yIG9yIHdpZHRoKSBkZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAqICAyLiBmb2N1cyBvdXRsaW5lIG9yIGJvcmRlciBzdHlsZSBpcyBzYW1lIHdpdGggdGhlIG5vcm1hbFxuICAgICAgICAgICAgICAgICAgICAgKiAgMy4gc2l6ZSBpbiBmb2N1cyBpcyBzYW1lIG9yIHNtYWxsZXIgdGhhbiBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAqICA0LiBjb2xvciBjb250cmFzdCBpbiBmb2N1cyBpcyBiZXR0ZXIgIFxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvY3VzU3R5bGVWYWx1ZSA9IHN0eWxlT2JqW2ZvY3VzU3R5bGVdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsU3R5bGVWYWx1ZSA9IG5vcm1hbFN0eWxlc1tmb2N1c1N0eWxlXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGUuaW5jbHVkZXMoXCJzdHlsZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gXCJub25lXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmVTdHlsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmVTdHlsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsU3R5bGVWYWx1ZSAmJiBmb2N1c1N0eWxlVmFsdWUgIT09IFwibm9uZVwiICYmIGZvY3VzU3R5bGVWYWx1ZSA9PT0gbm9ybWFsU3R5bGVWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9jdXNTdHlsZS5pbmNsdWRlcyhcIndpZHRoXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW1PdGhlclN0eWxlKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJveGltYXRpb24gb2YgdGhlIHdpZHRoIHN0eWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSAnaW5pdGlhbCcpIGZvY3VzU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSAndGhpbicpIGZvY3VzU3R5bGVWYWx1ZSA9ICcxcHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSAnbWVkaXVtJykgZm9jdXNTdHlsZVZhbHVlID0gJzJweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmb2N1c1N0eWxlVmFsdWUgPT09ICd0aGljaycpIGZvY3VzU3R5bGVWYWx1ZSA9ICczcHgnOyAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbFN0eWxlVmFsdWUgPT09ICdpbml0aWFsJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vcm1hbFN0eWxlVmFsdWUgPT09ICd0aGluJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICcxcHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vcm1hbFN0eWxlVmFsdWUgPT09ICdtZWRpdW0nKSBub3JtYWxTdHlsZVZhbHVlID0gJzJweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm9ybWFsU3R5bGVWYWx1ZSA9PT0gJ3RoaWNrJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICczcHgnOyAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c1N0eWxlVmFsdWUgPSBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShmb2N1c1N0eWxlVmFsdWUsIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbFN0eWxlVmFsdWUgPSBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShub3JtYWxTdHlsZVZhbHVlLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNTdHlsZVZhbHVlID09IDAgfHwgZm9jdXNTdHlsZVZhbHVlIDw9IG5vcm1hbFN0eWxlVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvY3VzU3R5bGUuaW5jbHVkZXMoXCJjb2xvclwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3RoZXJTdHlsZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGVsZW1lbnQgYmcgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2xvckNvbWJvID0gQ29sb3JVdGlsLkNvbG9yQ29tYm8ocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yQ29tYm8gPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJnID0gY29sb3JDb21iby5iZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmcpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3Byb3hpbWF0aW9uIG9mIHRoZSB3aWR0aCBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ2luaXRpYWwnKSBmb2N1c1N0eWxlVmFsdWUgPSAnYmxhY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbFN0eWxlVmFsdWUgJiYgbm9ybWFsU3R5bGVWYWx1ZSA9PT0gJ2luaXRpYWwnKSBub3JtYWxTdHlsZVZhbHVlID0gJ2JsYWNrJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYm9yZGVyL291dGxpbmUgY29sb3IgYXMgZmcgY29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c1N0eWxlVmFsdWUgPSBDb2xvclV0aWwuQ29sb3IoZm9jdXNTdHlsZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbFN0eWxlVmFsdWUgPSBDb2xvclV0aWwuQ29sb3Iobm9ybWFsU3R5bGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSBudWxsIHx8IG5vcm1hbFN0eWxlVmFsdWUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2dldCB0aGUgYm9yZGVyL291dGxpbmUgY29sb3IgY29udHJhc3QgcmF0aW9zXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9jdXNSYXRpbyA9IGZvY3VzU3R5bGVWYWx1ZS5jb250cmFzdFJhdGlvKGJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxSYXRpbyA9IG5vcm1hbFN0eWxlVmFsdWUuY29udHJhc3RSYXRpbyhiZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNSYXRpbyA8IDMuMCB8fCBmb2N1c1JhdGlvIDw9IG5vcm1hbFJhdGlvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9vdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3RoZXJTdHlsZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbFN0eWxlVmFsdWUgIT0gbnVsbCAmJiBmb2N1c1N0eWxlVmFsdWUgPT09IG5vcm1hbFN0eWxlVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB3YXJuIGlmIGEgYm9yZGVyL291dGxpbmUgZm9jdXMgc3R5bGUgaXMgJ25vbmUnIGFuZCBub2Ugb3RoZXIgKGNvbG9yIGFuZC9vciB3aWR0aCkgaXMgZGVmaW5lZCBcbiAgICAgICAgICAgIGlmIChub25lU3R5bGUgJiYgbnVtT3RoZXJTdHlsZSA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vIGZvY3VzIHN0eWxlIGRlZmluZWQgXG4gICAgICAgICAgICAvLyB3YXJuIGlmIG5vcm1hbCBzdHlsZSBpcyBkZWZpbmVkIGFuZCBpcyBub3QgXCJub25lXCJcbiAgICAgICAgICAgIGZvciAobGV0IG5vcm1hbFN0eWxlIGluIG5vcm1hbFN0eWxlcykge1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZVBhcmFtcy5jaGVja1BhcmFtcy52YWx1ZS5pbmNsdWRlcyhub3JtYWxTdHlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vcm1hbFN0eWxlVmFsdWUgPSBub3JtYWxTdHlsZXNbbm9ybWFsU3R5bGVdO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaWYgYm9yZGVyIG9yIG91dGxpbmUgc3R5bGUgaXMgXCJub25lXCIgXG4gICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlICE9PSAnbm9uZScpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiKTtcbiAgICAgICAgICAgICAgICB9ICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSAgIFxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2ZvY3VzX3Zpc2libGVcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOmxpbmssIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX1RyaWdnZXIyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIkNvbmZpcm0gV2luZG93cyBoaWdoIGNvbnRyYXN0IG1vZGUgaXMgc3VwcG9ydGVkIHdoZW4gdXNpbmcgQ1NTIHRvIGluY2x1ZGUsIHBvc2l0aW9uIG9yIGFsdGVyIG5vbi1kZWNvcmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaW5kb3dzIGhpZ2ggY29udHJhc3QgbW9kZSBtdXN0IGJlIHN1cHBvcnRlZCB3aGVuIHVzaW5nIENTUyB0byBpbmNsdWRlLCBwb3NpdGlvbiBvciBhbHRlciBub24tZGVjb3JhdGl2ZSBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiLCBcIjEuMy4yXCIsIFwiMS40LjExXCJdLCAgLy9vdGhlciBcInN0eWxlXCIgcnVsZXMgZm9yIGZvY3VzLCBob3ZlciwgYW5kIGNvbG9yXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlkXCI6IFtcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIiwgXCIxLjMuMlwiLCBcIjEuNC4xMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIgJiZcbiAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicmVsXCIpIHx8IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpICE9PSBcInN0eWxlc2hlZXRcIikpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJzdHlsZVwiICYmIG5vZGVOYW1lICE9PSBcImxpbmtcIiAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3R5bGVcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIikudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgbGV0IHRyaWdnZXJlZCA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsIGZhbHNlKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRyaWdnZXJlZDtcbiAgICAgICAgLy8gICAgICAgIFBhY2thZ2VzLmphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4odHJpZ2dlcmVkKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGVcIiwgdHJ1ZSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3R5bGVfaG92ZXJfcGVyc2lzdGVudDogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXSwgZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwiUGFzc18xXCI6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfM1wiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0aGUgaG92ZXI6IHBzZXVkby1jbGFzcyBpcyBub3QgdXNlZCB0byBkaXNwbGF5IGNvbnRlbnRcIixcbiAgICAgICAgICAgIC8vIFwiUGFzc18xXCI6IFwiY29udGVudCBkaXNwbGF5ZWQgdmlhIHRoZSA6aG92ZXIgcHNldWRvLWNsYXNzIGlzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSB0cmlnZ2VyIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18yXCI6IFwiY29udGVudCBkaXNwbGF5ZWQgdmlhIHRoZSA6aG92ZXIgcHNldWRvLWNsYXNzIGlzIHRoZSBhZGphY2VudCBzaWJsaW5nIG9mIHRoZSB0cmlnZ2VyIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJDb25maXJtIHRoZSBwb2ludGVyIGNhbiBiZSBwb3NpdGlvbmVkIG92ZXIgdGhlIGRpc3BsYXllZCBlbGVtZW50LCBub3QganVzdCB0aGUgdHJpZ2dlclwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIkNvbmZpcm0gdGhlIHBvaW50ZXIgY2FuIGJlIHBvc2l0aW9uZWQgb3ZlciBhbGwgdGhlIGluZm9ybWF0aW9uIGRpc3BsYXllZCBvbiBob3ZlclwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfM1wiOiBcIkNvbmZpcm0gdGhlIG1hcmdpbiBzdHlsZSBhdHRyaWJ1dGUgaGFzIG5vdCBwcmV2ZW50ZWQgdGhlIHBvaW50ZXIgZnJvbSBob3ZlcmluZyBvdmVyIHRoZSBkaXNwbGF5ZWQgZWxlbWVudCwgbm90IGp1c3QgdGhlIHRyaWdnZXJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgcG9pbnRlciBzaG91bGQgYmUgYWJsZSB0byBtb3ZlIG92ZXIgY29udGVudCBkaXNwbGF5ZWQgb24gaG92ZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjQuMTNcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgbGV0IHBhc3MwID0gZmFsc2U7XG4gICAgICAgIGxldCBwYXNzMSA9IGZhbHNlO1xuICAgICAgICBsZXQgcGFzczIgPSBmYWxzZTsgLy8gbmV2ZXIgaGFwcGVuXG4gICAgICAgIGxldCBwb3RlbnRpYWwxID0gZmFsc2U7XG4gICAgICAgIGxldCBwb3RlbnRpYWwyID0gZmFsc2U7XG4gICAgICAgIGxldCBwb3RlbnRpYWwzID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHN0eWxlVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlJVTEUgUlVOICoqKioqKioqKioqKioqKioqKlwiKTtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgLy8gY2hlY2sgaW1wb3J0XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoID0gXCIrcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7ICsrc0luZGV4KSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzLmxlbmd0aCA9IFwiK3N0eWxlUnVsZXMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgc3R5bGVSdWxlSW5kZXggPCBzdHlsZVJ1bGVzLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKioqKioqKlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKiogRk9SIExPT1Agc3R5bGVSdWxlSW5kZXggPSBcIitzdHlsZVJ1bGVJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kSG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG92ZXJFbGVtZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c0NvbWJpbmF0b3IgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGlsZGVDb21iaW5hdG9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheVZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyQ29tYmluYXRvckVsZW1lbnRIb3ZlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0aW5nRWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0aW5nSG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkamFjZW50UGx1c1NpYmxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRqYWNlbnRUaWxkZU11bHRpcGxlU2libGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZVRleHQgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlc1tcIitzdHlsZVJ1bGVJbmRleCtcIl0gPSBcIitydWxlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gQ2hlY2sgZm9yIDpob3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlVGV4dC5tYXRjaCgvOmhvdmVyL2cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSG92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjEuIGZvdW5kIDpob3ZlciA9IFwiKyBmb3VuZEhvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gR2V0IGhvdmVyIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJFbGVtZW50ID0gcnVsZVRleHQuc3BsaXQoXCI6XCIpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjIuIGZvdW5kIGVsZW1lbnQgdGhhdCBnb2VzIHdpdGggOmhvdmVyID0gXCIraG92ZXJFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjEuIE5vIGhvdmVyIG9uIGNzcyBlbGVtZW50IHNvIHNraXAgdGhpcyBydWxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWYgbm8gOmhvdmVyIHNraXAgdGhpcyBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDNhLiBDaGVjayBmb3IgY3NzIGNvbWJpbmF0b3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDRhLiBpZiBzbyBkbyB3ZSBoYXZlIGFuIGFmdGVyIGNvbWJpbmF0b3IgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbHVzVGVtcFN0ciA9IHJ1bGVUZXh0LnN1YnN0cmluZyhydWxlVGV4dC5pbmRleE9mKFwiK1wiKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdXNUZW1wU3RyID0gcGx1c1RlbXBTdHIudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlVGV4dC5tYXRjaCgvOmhvdmVyIFxcKy9nKSB8fCBydWxlVGV4dC5tYXRjaCgvOmhvdmVyXFwrL2cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdXNDb21iaW5hdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIzYS4gRm91bmQgcGx1c0NvbWJpbmF0b3IgPSBcIisgcGx1c0NvbWJpbmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gcGx1c1RlbXBTdHIuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjRhLiBGb3VuZCBwbHVzIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIithZnRlckNvbWJpbmF0b3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzYi4gQ2hlY2sgZm9yIGNzcyBjb21iaW5hdG9yICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0Yi4gaWYgc28gZG8gd2UgaGF2ZSBhbiBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3ZlciBcXH4vZykgfHwgcnVsZVRleHQubWF0Y2goLzpob3Zlclxcfi9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIm1hdGNoID0gXCIrcnVsZVRleHQubWF0Y2goXCI6aG92ZXIgXFx+XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZGVDb21iaW5hdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIzYi4gRm91bmQgdGlsZGVDb21iaW5hdG9yID0gXCIrIHRpbGRlQ29tYmluYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbHVzVGVtcFN0ciA9IHJ1bGVUZXh0LnN1YnN0cmluZyhydWxlVGV4dC5pbmRleE9mKFwiflwiKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzVGVtcFN0ciA9IHBsdXNUZW1wU3RyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IHBsdXNUZW1wU3RyLnNwbGl0KFwiIFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI0Yi4gRm91bmQgdGlsZGUgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGx1c0NvbWJpbmF0b3IgJiYgIXRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOTyBwbHVzQ29tYmluYXRvciBvciB0aWxkZUNvbWJpbmF0b3Igc28gc2tpcCB0aGlzIHJ1bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzQ29tYmluYXRvciBvciB0aWxkZUNvbWJpbmF0b3Igc28gUEFTU1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFJFUE9SVCBQQVNTIDAgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpOyAvLyBKQ0g6IHNob3VsZCB3ZSBoYXZlIGEgTi9BIHBhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTbyBub3cgd2UgaGF2ZSBhIGNzcyBlbGVtZW50IHdpdGggaG92ZXIgLSBlbGVtZW50OmhvdmVyIHNvIHdlIGhhdmUgcHJvYmxlbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBjaGVja1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS4gQ2hlY2sgaWYgdGhlIGFmdGVyIGNvbWJpbmF0b3IgZWxlbWVudCBoYXMgZGlzcGxheTogcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2LiBDaGVjayBpZiBkaXNwbGF5IHByb3BlcnR5IGlzIG5vdCBub25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyQ29tYmluYXRvckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGluZGV4IG9mIGRpc3BsYXk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGx1c1RlbXBTdHIgPSBcIitwbHVzVGVtcFN0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHBsdXNUZW1wU3RyLmluZGV4T2YoXCJkaXNwbGF5OlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjUuIEZvdW5kIGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdXNUZW1wU3RyLnNsaWNlKGluZGV4ICsgOCkudHJpbSgpLnNwbGl0KFwiIFwiKVswXSAhPT0gXCJub25lO1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI2LiBGb3VuZCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheVZhbHVlIG5vdCBub25lID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSA9PT0gbm9uZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAwIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGJhZCBjc3Mgc28gaXQgd29uJ3QgaGFwcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5IHNvIHNraXAgdGhpcyBydWxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGJhZCBjc3Mgc28gaXQgd29uJ3QgaGFwcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHZlcmlmaWVkIHRoYXQgd2UgaGF2ZSBhIGNzcyBlbGVtZW50IHdpdGggYSBob3ZlciBvZiB0aGUgZm9ybWF0IHNwYW46aG92ZXIgKyBkaXYgeyBkaXNwbGF5OiBibG9jazsgfSB3aXRoIGFsbCB0aGUgcHJvcGVyIHByb3BlcnRpZXMgYW5kIHZhbHVlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB2ZXJpZmllZCB0aGF0IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGEgaG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIG9mIHRoZSBmb3JtYXQgc3Bhbjpob3ZlciArIGRpdiB7IGRpc3BsYXk6IGJsb2NrOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICB3aXRoIGFsbCB0aGUgcHJvcGVyIHByb3BlcnRpZXMgYW5kIHZhbHVlc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzMiA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZXMyLmxlbmd0aCA9IFwiK3N0eWxlUnVsZXMyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGVSdWxlSW5kZXgyID0gMDsgc3R5bGVSdWxlSW5kZXgyIDwgc3R5bGVSdWxlczIubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleDIrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBydWxlIGZvciBhZnRlckNvbWluYXRvckVsZW1lbnQ6aG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmluZCBhZnRlckNvbWJpbmF0b3JFbGVtZW50OmhvdmVyIHNlZSBpZiBydWxlIGhhcyBwcm9wZXJ0eSBkaXNwbGF5OiB2YWx1ZSB3aGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSAhPSBub25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKioqKioqKlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqKioqKioqIDJuZCBGT1Igc3R5bGVSdWxlSW5kZXgyID0gXCIrc3R5bGVSdWxlSW5kZXgyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVUZXh0MiA9IHN0eWxlUnVsZXNbc3R5bGVSdWxlSW5kZXgyXS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJ1bGVUZXh0MiA9IFwiLCBydWxlVGV4dDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIithZnRlckNvbWJpbmF0b3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWxsIHN1cHBvcnRpbmcgZWxlbWVudHMgZm9yIG1hcmdpbiBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBmaW5kIG1hcmdpbiBTVE9QIGFuZCBSRVBPUlQgRVJST1JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0V4U3RyaW5nID0gYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCArIFwiIHtcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyaW1SdWxlVGV4dDIgPSBydWxlVGV4dDIudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnSW5kZXggPSB0cmltUnVsZVRleHQyLmluZGV4T2YocmVnRXhTdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudFByb3BlcnRpZXMgPSB0cmltUnVsZVRleHQyLnNsaWNlKHJlZ0luZGV4KS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoIWFmdGVyQ29tYmluYXRvckVsZW1lbnRQcm9wZXJ0aWVzLm1hdGNoKC9tYXJnaW4vZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmltUnVsZVRleHQyLm1hdGNoKC9tYXJnaW4vZykpIHsgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5vIG1hcmdpbiBwcm9ibGVtIHNvIGNvbnRpbnVlIG9uLi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gd2UgaGF2ZSBhIHN1cHBvcnRpbmcgZWxlbWVudCBjc3MgZGVmaW5pdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50ID0gcnVsZVRleHQyLnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPSBzdXBwb3J0aW5nSG92ZXJFbGVtZW50LnNwbGl0KFwiIFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VwcG9ydGluZ0hvdmVyRWxlbWVudCA9IFwiK3N1cHBvcnRpbmdIb3ZlckVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5FRUQgVE8gQ0hFQ0sgRk9SIGFmdGVyQ29taW5hdG9yRWxlbWVudDpob3ZlciBpbiBPTkUgU1RFUFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGluZ0hvdmVyRWxlbWVudCA9PT0gYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCAmJiBydWxlVGV4dDIubWF0Y2goLzpob3Zlci9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNy4gRm91bmQgc3VwcG9ydGluZyBob3ZlciBlbGVtZW50IHNhbWUgYXMgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDcuIEZvdW5kIHN1cHBvcnRpbmcgaG92ZXIgZWxlbWVudCBzYW1lIGFzIGFmdGVyQ29tYmluYXRvckVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nRWxlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBzdXBwb3J0aW5nIGVsZW1lbnQgaGF2ZSBob3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiOC4gU3VwcG9ydGluZyBlbGVtZW50IGhhcyBob3ZlciBhbHNvID0gXCIrIGZvdW5kSG92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDguIFN1cHBvcnRpbmcgZWxlbWVudCBoYXMgaG92ZXIgYWxzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gcnVsZVRleHQyLmluZGV4T2YoXCJkaXNwbGF5OlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImluZGV4ID0gXCIraW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA5LiBGb3VuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjkuIEZvdW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPSBcIitzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdXNUZW1wU3RyLnNsaWNlKGluZGV4ICsgOCkudHJpbSgpLnNwbGl0KFwiIFwiKVswXSAhPT0gXCJub25lO1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMC4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjEwLiBGb3VuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlIG5vdCBub25lID0gXCIrc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgbGlzdCBvZiBob3ZlciBlbGVtZW50cyBhbmQgbmV4dCBzaWJsaW5nIGZvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgKyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBBREpBQ0VOVCBzaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG92ZXJFbGVtZW50ICE9PSBcIlwiICYmIHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdmVyRWxlbWVudExpc3QgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudExpc3QubGVuZ3RoID0gXCIraG92ZXJFbGVtZW50TGlzdC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaG92ZXJFbGVtZW50TGlzdFswXS50YWdOYW1lID0gXCIraG92ZXJFbGVtZW50TGlzdFswXS50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgYWRqYWNlbnQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQWRqYWNlbnQgc2libGluZyA9IFwiK2hvdmVyRWxlbWVudExpc3RbMF0ubmV4dEVsZW1lbnRTaWJsaW5nLnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWZ0ZXJDb21iaW5hdG9yRWxlbWVudC50b1VwcGVyQ2FzZSgpID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudC50b1VwcGVyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50LnRvVXBwZXJDYXNlKCkgPT09IGhvdmVyRWxlbWVudExpc3RbMF0ubmV4dEVsZW1lbnRTaWJsaW5nLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMWEuIEhvdmVyIHdpdGggcGx1cyBoYXMgYWRqYWNlbnQgc2libGluZy5cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTFhLiBIb3ZlciB3aXRoIHBsdXMgaGFzIGFkamFjZW50IHNpYmxpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkamFjZW50UGx1c1NpYmxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdmVyaWZpZWQgYSBzdXBwb3J0aW5nIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgY3NzIHJ1bGUgdGhhdCBjb250YWlucyBob3ZlciBhbmQgZGlzcGxheSBwcm9wZXJ0eSB0aGF0IGlzIG5vdCBlcXVhbCB0byBub25lIGFuZCBoYXMgYSBob3ZlciBlbGVtZW50IGluIHRoZSBib2R5IHdpdGggYW4gYWRqYWNlbnQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUkVQT1JUIFBBU1MgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzMCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1c0NvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjExYS4gTWFpbiBob3ZlciB3aXRoICsgY29tYmluYXRvciBoYXMgbm8gYWRqYWNlbnQgc2libGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBvdGVudGlhbDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWwxID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGxpc3Qgb2YgaG92ZXIgZWxlbWVudHMgYW5kIGRldGVybWluZSBpZiB0aGVyZSBhcmUgMiBvciBtb3JlIGFkamFjZW50IHNpYmxpbmdzIGZvciB+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgfiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBBREpBQ0VOVCBzaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG92ZXJFbGVtZW50ICE9PSBcIlwiICYmIHRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaG92ZXJFbGVtZW50LnRvVXBwZXJDYXNlKCkgPSBcIitob3ZlckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdmVyRWxlbWVudExpc3QgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJFbGVtZW50LnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudExpc3QubGVuZ3RoID0gXCIraG92ZXJFbGVtZW50TGlzdC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciB0d28gb3IgbW9yZSBhZGphY2VudCBzaWJsaW5nc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaWJsaW5ncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaWJsaW5nID0gaG92ZXJFbGVtZW50TGlzdFswXS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInNpYmxpbmcudGFnTmFtZSA9IFwiK3NpYmxpbmcudGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nLnRhZ05hbWUgPT09IGFmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoKHNpYmxpbmcgPSBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaWJsaW5nQ291bnQgPSBzaWJsaW5ncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzaWJsaW5nQ291bnQgPSBcIitzaWJsaW5nQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpDSCBUT0RPOiB3aGF0IGlmIHNpYmxpbmcgY291bnQgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nQ291bnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMWIuIEhvdmVyIHdpdGggdGlsZGUgYW5kIG9uZSBhZGphY2VudCBzaWJsaW5nXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFRpbGRlTXVsdGlwbGVTaWJsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFJFUE9SVCBQQVNTIDIgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2libGluZ0NvdW50ID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk1haW4gaG92ZXIgd2l0aCB+IGNvbWJpbmF0b3IgaGFzIHR3byBvciBtb3JlIHNpYmxpbmdzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBvdGVudGlhbDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDIgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1c0NvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlIGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHBsdXMgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RlIGF0IGxlYXN0IG9uZSBvZiB0aGUgcnVsZXMgbXVzdCBoYXZlIGEgZGlzcGxheSBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1c0NvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAxIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgaXMgc3RpbGwgZmFsc2UgPT4gcG90ZW50aWFsMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHRpbGRlIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RlIGF0IGxlYXN0IG9uZSBvZiB0aGUgcnVsZXMgbXVzdCBoYXZlIGEgc3VwcG9ydGluZ0VsZW1lbnQ6aG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1c0NvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdFbGVtZW50IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VwcG9ydGluZ0VsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHBsdXMgc3VwcG9ydGluZ0VsZW1lbnQ6aG92ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRpbGRlQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0VsZW1lbnQgaXMgc3RpbGwgZmFsc2UgPT4gcG90ZW50aWFsMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlSW5kZXgyID0gXCIrc3R5bGVSdWxlSW5kZXgyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZXMyLmxlbmd0aCA9IFwiK3N0eWxlUnVsZXMyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdXBwb3J0aW5nRWxlbWVudCA9IFwiK3N1cHBvcnRpbmdIb3Zlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXIgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gdGlsZGUgc3VwcG9ydGluZ0VsZW1lbnQ6aG92ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDIgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRoZXJlIGlzIGEgbWFyZ2luIGluIHRoZSBzdXBwb3J0aW5nIGVsZW1lbnRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBvdGVudGlhbDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAzIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsMyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfM1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaWxlbmNlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVwiKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwYXNzMCA9IFwiK3Bhc3MwKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwYXNzMSA9IFwiK3Bhc3MxKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwYXNzMiA9IFwiK3Bhc3MyKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwb3RlbnRpYWwxID0gXCIrcG90ZW50aWFsMSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicG90ZW50aWFsMiA9IFwiK3BvdGVudGlhbDIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBvdGVudGlhbDMgPSBcIitwb3RlbnRpYWwzKTtcbiAgICAgICAgaWYgKHBhc3MwKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIC8vIGlmIChwYXNzMSkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18yXCIpOyAvLyBEb2Vzbid0IHRyaWdnZXJcbiAgICAgICAgLy8gaWYgKHBhc3MyKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzNcIik7IC8vIERvZXNuJ3QgdHJpZ2dlclxuICAgICAgICBpZiAocG90ZW50aWFsMSkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgaWYgKHBvdGVudGlhbDIpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgIGlmIChwb3RlbnRpYWwzKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8zXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG4vKipcbiAqIERlc2NyaXB0aW9uOiBUcmlnZ2VyIHdoZW4gdmlld3BvcnQgdW5pdHMgYXJlIHVzZWQgZm9yIGZvbnQgc2l6ZS5cbiAqIE9yaWdpbjogVmFyaW91c1xuICovXG5leHBvcnQgY29uc3Qgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxpbmssIGRvbTpzdHlsZSwgZG9tOipbc3R5bGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjFfU3R5bGVfVmlld3BvcnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBzdHlsZV92aWV3cG9ydF9yZXNpemFibGUuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRleHQgbXVzdCBzY2FsZSB1cCB0byAyMDAlIHdpdGhvdXQgbG9zcyBvZiBjb250ZW50IG9yIGZ1bmN0aW9uYWxpdHlcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0ZXh0IHNpemVkIHVzaW5nIHZpZXdwb3J0IHVuaXRzIGNhbiBiZSByZXNpemVkIHVwIHRvIDIwMCVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIxLjQuNFwiLCBcIjEuNC4xMFwiXSwgLy8gbWF0Y2ggaGVscCBmb3IgYm90aCBcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHRoZVBhdHRlcm4gPSAvXFxkKyh2d3x2aHx2bWlufHZtYXgpL2dpO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXRcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgcGFzc2VkICYmIHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUudHlwZSAmJiBydWxlLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gcnVsZSBhcyBDU1NTdHlsZVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gc3R5bGVSdWxlLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbXBvcnQgcnVsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocnVsZS50eXBlICYmIHJ1bGUudHlwZSA9PT0gMyAvKiBDU1NSdWxlLklNUE9SVF9SVUxFICovICYmIChydWxlIGFzIENTU0ltcG9ydFJ1bGUpLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRSdWxlID0gcnVsZSBhcyBDU1NJbXBvcnRSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gaW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzID8gaW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzIDogaW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydGVkUnVsZSA9IHJ1bGVzW3JJbmRleF0gYXMgYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUudHlwZSAmJiBpbXBvcnRlZFJ1bGUudHlwZSA9PT0gMSAvKiBDU1NSdWxlLlNUWUxFX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZFJ1bGUuc3R5bGVbJ2ZvbnRTaXplJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9udFNpemUgPSBpbXBvcnRlZFJ1bGUuc3R5bGVbJ2ZvbnRTaXplJ10udHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZvbnRTaXplLm1hdGNoKHRoZVBhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb250U2l6ZS5sZW5ndGggJiYgZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJsaW5rXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZUZyb21MaW5rID0gcnVsZXNbckluZGV4XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHJ1bGVzIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUZyb21MaW5rLnR5cGUgJiYgcnVsZUZyb21MaW5rLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUZyb21MaW5rLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gcnVsZUZyb21MaW5rLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc3R5bGVWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgICAgIGlmIChzdHlsZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlUGF0dGVybiA9IC9mb250LXNpemU6XFxzKlxcZCsodnd8dmh8dm1pbnx2bWF4KS9naTtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBzdHlsZVZhbHVlLm1hdGNoKHN0eWxlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzdmdfZ3JhcGhpY3NfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3ZnX2dyYXBoaWNzX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206c3ZnXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdmdfZ3JhcGhpY3NfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwic3ZnX2dyYXBoaWNzX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBcInN2Z19ncmFwaGljc19sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBub24tZGVjb3JhdGl2ZSBTVkcgZWxlbWVudCBtdXN0IGhhdmUgYW4gYWNjZXNzaWJsZSBuYW1lXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgU1ZHIGVsZW1lbnQgaGFzIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2FjY19uYW1lXCI6IFwiVGhlIFNWRyBlbGVtZW50IGhhcyBubyBhY2Nlc3NpYmxlIG5hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiN2Q2NzM0XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHJ1bGVDb250ZXh0KSB8fCBBY2NOYW1lVXRpbC5pc0FjY2Vzc2libGVOYW1lSWdub3JhYmxlKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKG5hbWVfcGFpciAmJiBuYW1lX3BhaXIubmFtZSAmJiBuYW1lX3BhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYWNjX25hbWVcIilcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlRmFpbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2FyaWFfZGVzY2VuZGFudHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50c1wiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTp0YWJsZSBkb206dHJbcm9sZV0sIGFyaWE6dGFibGUgZG9tOnRoW3JvbGVdLCBhcmlhOnRhYmxlIGRvbTp0ZFtyb2xlXSwgYXJpYTpncmlkIGRvbTp0cltyb2xlXSwgYXJpYTpncmlkIGRvbTp0aFtyb2xlXSwgYXJpYTpncmlkIGRvbTp0ZFtyb2xlXSwgYXJpYTp0cmVlZ3JpZCBkb206dHJbcm9sZV0sIGFyaWE6dHJlZWdyaWQgZG9tOnRoW3JvbGVdLCBhcmlhOnRyZWVncmlkIGRvbTp0ZFtyb2xlXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50cy5odG1sXCIsXG4gICAgICAgICAgICBcImV4cGxpY2l0X3JvbGVcIjogXCJ0YWJsZV9hcmlhX2Rlc2NlbmRhbnRzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUYWJsZSBzdHJ1Y3R1cmUgZWxlbWVudHMgY2Fubm90IHNwZWNpZnkgYW4gZXhwbGljaXQgJ3JvbGUnIHdpdGhpbiB0YWJsZSBjb250YWluZXJzXCIsXG4gICAgICAgICAgICBcImV4cGxpY2l0X3JvbGVcIjogXCJBbiBleHBsaWNpdCBBUklBICdyb2xlJyBpcyBub3QgdmFsaWQgZm9yIDx7MH0+IGVsZW1lbnQgd2l0aGluIGFuIEFSSUEgcm9sZSAnezF9JyBwZXIgdGhlIEFSSUEgaW4gSFRNTCBzcGVjaWZpY2F0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50OyBcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBDb21tb25VdGlsLmlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgIC8vIGNhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgaWYgKHBhcmVudFJvbGUgPT09IG51bGwgfHwgcGFyZW50Um9sZS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gaWdub3JlIHRoZSByZWR1bmRhbmN5IGNhc2VzOiByZXBvcnRlZCBpbiB0aGUgYXJpYV9yb2xlX3JlZHVuZGFudCBydWxlXG4gICAgICAgIGNvbnN0IGltcGxpY2l0Um9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBjb25zdCBleHBsaWNpdFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTs7XG4gICAgICAgIGlmIChpbXBsaWNpdFJvbGVzICYmIGltcGxpY2l0Um9sZXMubGVuZ3RoID4gMCAmJiBleHBsaWNpdFJvbGVzICYmIGV4cGxpY2l0Um9sZXMubGVuZ3RoID4gMCBcbiAgICAgICAgICAgICYmIGV4cGxpY2l0Um9sZXMuc29tZShpdGVtID0+IGltcGxpY2l0Um9sZXMuaW5jbHVkZXMoaXRlbSkpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImV4cGxpY2l0X3JvbGVcIiwgW2NvbnRleHRbXCJkb21cIl0ubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwYXJlbnRSb2xlWzBdLnJvbGVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfY2FwdGlvbl9lbXB0eTogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9jYXB0aW9uX2VtcHR5XCIsXG4gICAgY29udGV4dDogXCJkb206Y2FwdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9DYXB0aW9uX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9jYXB0aW9uX2VtcHR5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8dGFibGU+IGVsZW1lbnQgaGFzIGFuIGVtcHR5IDxjYXB0aW9uPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Y2FwdGlvbj4gZWxlbWVudCBmb3IgYSA8dGFibGU+IGVsZW1lbnQgbXVzdCBjb250YWluIGRlc2NyaXB0aXZlIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfY2FwdGlvbl9uZXN0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfY2FwdGlvbl9uZXN0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpjYXB0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0NhcHRpb25fSW5UYWJsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfY2FwdGlvbl9uZXN0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiPGNhcHRpb24+IGVsZW1lbnQgaXMgbm90IG5lc3RlZCBpbnNpZGUgYSA8dGFibGU+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGNhcHRpb24+IGVsZW1lbnQgbXVzdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBhc3NvY2lhdGVkIDx0YWJsZT4gZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKSAhPSBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9oZWFkZXJzX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGFibGVfRGF0YUhlYWRpbmdzQXJpYVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfaGVhZGVyc19leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGFibGUgaGFzIG5vIGhlYWRlcnMgaWRlbnRpZmllZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkRhdGEgdGFibGUgbXVzdCBpZGVudGlmeSBoZWFkZXJzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MVGFibGVFbGVtZW50O1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIHRoZXJlIGFyZSBubyByb3dzLCB0aGUgcnVsZSBkb2VzIG5vdCBhcHBseS5cbiAgICAgICAgbGV0IHJvd3MgPSBydWxlQ29udGV4dC5yb3dzO1xuICAgICAgICBpZiAoIVRhYmxlVXRpbC5pc0RhdGFUYWJsZShydWxlQ29udGV4dCkgfHwgcm93cyA9PT0gbnVsbCB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSBUYWJsZVV0aWwudGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9oZWFkZXJzX3JlZl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRkW2hlYWRlcnNdLCBkb206dGhbaGVhZGVyc11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkICdpZCcgaW4gdGhpcyBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiByZWZlcnMgdG8gaXRzZWxmXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyIHRvIGEgY2VsbCBpbiB0aGUgc2FtZSB0YWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlciB0byBhIGNlbGwgaW5kaWNhdGVkIHdpdGggPHRoPiBvciBhIHJvbGUgb2YgXFxcImNvbHVtbmhlYWRlclxcXCIgb3IgXFxcInJvd2hlYWRlclxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSBzaG91bGQgcmVmZXIgdG8gYSB2YWxpZCBjZWxsIGluIHRoZSBzYW1lIHRhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXCJhMjVmNDVcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhcmVudFRhYmxlID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKTtcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50VGFibGUpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIGEgc2ltcGxlIHRhYmxlIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5LlxuICAgICAgICBpZiAocGFyZW50VGFibGUgPT0gbnVsbCB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBhcmVudFRhYmxlKSB8fCAhW1widGFibGVcIiwgXCJncmlkXCJdLmluY2x1ZGVzKHBhcmVudFJvbGUpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCB2YWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIik7XG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgaWRzID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xuICAgICAgICBsZXQgaW52YWxpZEhlYWRlclZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgc2FtZU5vZGVIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IHNhbWVUYWJsZUhlYWRlclZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBpZCA9IGlkc1tpXTtcbiAgICAgICAgICAgIGlmIChpZC50cmltKCkgPT09ICcnKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICAgICAgaWYgKCFlbGVtKVxuICAgICAgICAgICAgICAgIGludmFsaWRIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIGlmIChET01VdGlsLnNhbWVOb2RlKGVsZW0sIHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBzYW1lTm9kZUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCFET01VdGlsLmlzSW5TYW1lVGFibGUoZWxlbSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHNhbWVUYWJsZUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbU5hbWUgIT09ICd0aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhlbGVtLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyb2xlcy5pbmNsdWRlcygnY29sdW1uaGVhZGVyJykgJiYgIXJvbGVzLmluY2x1ZGVzKCdyb3doZWFkZXInKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRFbGVtSGVhZGVyVmFsdWVzLnB1c2goaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgIGlmIChpbnZhbGlkSGVhZGVyVmFsdWVzLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtpbnZhbGlkSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG4gICAgICAgIGlmIChzYW1lTm9kZUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfMlwiLCBbc2FtZU5vZGVIZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcbiAgICAgICAgaWYgKHNhbWVUYWJsZUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfM1wiLCBbc2FtZVRhYmxlSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG4gICAgICAgIGlmIChpbnZhbGlkRWxlbUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfNFwiLCBbaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcblxuICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2hlYWRlcnNfcmVsYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0ZCwgZG9tOnRoXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX1RhYmxlX0RhdGFDZWxsUmVsYXRpb25zaGlwc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfaGVhZGVyc19yZWxhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29tcGxleCB0YWJsZSBkb2VzIG5vdCBoYXZlIGhlYWRlcnMgZm9yIGVhY2ggY2VsbCBwcm9wZXJseSBkZWZpbmVkIHdpdGggJ2hlYWRlcicgb3IgJ3Njb3BlJ1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkZvciBhIGNvbXBsZXggZGF0YSB0YWJsZSwgYWxsIDx0aD4gYW5kIDx0ZD4gZWxlbWVudHMgbXVzdCBiZSByZWxhdGVkIHZpYSAnaGVhZGVyJyBvciAnc2NvcGUnIGF0dHJpYnV0ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXJlbnRUYWJsZSA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwidGFibGVcIik7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBsYXlvdXQgdGFibGUgb3IgYSBzaW1wbGUgdGFibGUgdGhlIHJ1bGUgZG9lcyBub3QgYXBwbHkuXG4gICAgICAgIGlmIChwYXJlbnRUYWJsZSA9PSBudWxsIHx8ICFUYWJsZVV0aWwuaXNDb21wbGV4RGF0YVRhYmxlKHBhcmVudFRhYmxlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIElmIHRoaXMgdGFibGUgaGFzbid0IGJlZW4gcHJlcHJvY2Vzc2VkLCBwcm9jZXNzIGl0LlxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQnVpbGQgYSBncmlkIHRoYXQncyBhY3R1YWxseSB1c2FibGUgKHJvd3NwYW4gYW5kIGNvbHNwYW4gZWxlbWVudHMgYXJlIGR1cGxpY2F0ZWQpXG4gICAgICAgICAgICAvLyBUaGlzIGJ1aWxkcyBhIHJlYWwgMmQgdGFibGUgYXJyYXkuXG4gICAgICAgICAgICBsZXQgZ3JpZCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRUYWJsZS5yb3dzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvdyA9IHBhcmVudFRhYmxlLnJvd3NbaV07XG4gICAgICAgICAgICAgICAgaWYgKCFncmlkW2ldKSBncmlkW2ldID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3cuY2VsbHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbal07XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShjZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBpICsgXCI6XCIgKyBqKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aWR0aCkgd2lkdGggPSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoZWlnaHQpIGhlaWdodCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBnWCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChncmlkW2ldW2dYXSkgZ1ggKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZWlnaHQ7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncmlkW2kgKyBrXSkgZ3JpZFtpICsga10gPSBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCB3aWR0aDsgKytsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFtpICsga11bZ1ggKyBsXSA9IGNlbGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdGFibGUgZ3JpZCBhbmQgcmVjb3JkIGhlYWRlcnMgdGhhdCBwb2ludCB0byBjZWxscyBhbmRcbiAgICAgICAgICAgIC8vIGNlbGxzIHRoYXQgYXJlIHBvaW50ZWQgdG8gYnkgaGVhZGVyc1xuICAgICAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICBsZXQgbG9va3VwID0ge31cbiAgICAgICAgICAgIGxldCBzY29wZWRDb2xzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyaWQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm93U2NvcGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBncmlkW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmlkQ2VsbCA9IGdyaWRbaV1bal07XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmlkTm9kZU5hbWUgPSBncmlkQ2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZE5vZGVOYW1lID09IFwidGhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWRDZWxsLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTY29wZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXhpcyBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBub3QgZW5vdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJheGlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChncmlkQ2VsbC5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PSBcInJvd2dyb3VwXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGF4aXMgYXR0cmlidXRlLCBpdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NvcGUgaXMgbm90IGVub3VnaC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiYXhpc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW0NhY2hlVXRpbC5nZXRDYWNoZShncmlkQ2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwic2NvcGVcIikgPT0gXCJjb2xcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZENvbHNbal0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXhpcyBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBub3QgZW5vdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJheGlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVycyBjYW4gcmVmZXIgdG8gb3RoZXIgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGhlYWRFbGVtLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyaWROb2RlTmFtZSA9PSBcInRkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dTY29wZWQgfHwgc2NvcGVkQ29sc1tqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFtDYWNoZVV0aWwuZ2V0Q2FjaGUoZ3JpZENlbGwsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW0NhY2hlVXRpbC5nZXRDYWNoZShoZWFkRWxlbSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbG9va3VwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByY0luZm8gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgdEluZm8gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcmNJbmZvICYmIHRJbmZvICYmIHJjSW5mbyBpbiB0SW5mbztcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiByY0luZm8gPT09IFwiMDowXCIgJiZcbiAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHRlc3QgaWYgaXQncyB0aGUgdXBwZXItbGVmdCBjZWxsIGFuZCBpdCdzIGVtcHR5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSB0YWJsZSBoYXMgbm8gdGgncywgaXQgbWF5IGp1c3QgYmUgdGhhdCB0aGlzIHdhcyBzdXBwb3NlZCB0byBiZSBhIGxheW91dFxuICAgICAgICAvLyB0YWJsZSwgd2hpY2ggaW50cm9kdWNlcyBhIGxvdCBvZiBub2lzZS4gIEluIHRoYXQgY2FzZSwgb25seSB0cmlnZ2VyIHRoaXMgZXJyb3JcbiAgICAgICAgLy8gb25jZSBwZXIgdGFibGUuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHBhcmVudFRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhcIikubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGlmIChDYWNoZVV0aWwuZ2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkX1RyaWdPbmNlXCIsIGZhbHNlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRfVHJpZ09uY2VcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9sYXlvdXRfbGluZWFyaXplZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGFibGVfTGF5b3V0VHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGFibGVfbGF5b3V0X2xpbmVhcml6ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2xheW91dF9saW5lYXJpemVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGFibGUgaXMgbm90IGJlaW5nIHVzZWQgdG8gZm9ybWF0IHRleHQgY29udGVudCBpbiBjb2x1bW5zIHVubGVzcyB0aGUgdGFibGUgY2FuIGJlIGxpbmVhcml6ZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2luZyB0YWJsZXMgdG8gZm9ybWF0IHRleHQgZG9jdW1lbnRzIGluIGNvbHVtbnMgdW5sZXNzIHRoZSB0YWJsZSBjYW4gYmUgbGluZWFyaXplZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gIVRhYmxlVXRpbC5pc0xheW91dFRhYmxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX3Njb3BlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3Njb3BlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206dGRbc2NvcGVdLCBkb206dGhbc2NvcGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfU2NvcGVfVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfc2NvcGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInRhYmxlX3Njb3BlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlZhbHVlIHByb3ZpZGVkIGlzIGludmFsaWQgZm9yIHRoZSAnc2NvcGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ3Njb3BlJyBhdHRyaWJ1dGUgc2hvdWxkIG9ubHkgYmUgdXNlZCBvbiBhIDx0aD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlZhbHVlIGZvciAnc2NvcGUnIGF0dHJpYnV0ZSBtdXN0IGJlIFxcXCJyb3dcXFwiLCBcXFwiY29sXFxcIiwgXFxcInJvd2dyb3VwXFxcIiwgb3IgXFxcImNvbGdyb3VwXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICd0ZCcpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG5cbiAgICAgICAgLy9vbmx5IGNvbnRpbnVlIGZvciAndGgnXG4gICAgICAgIGxldCBzY29wZVZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gL14ocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkkLy50ZXN0KHNjb3BlVmFsKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RhYmxlX1N0cnVjdHVyZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgd2l0aCBcXFwicHJlc2VudGF0aW9uXFxcIiByb2xlIG9yIFxcXCJub25lXFxcIiByb2xlIGhhcyBzdHJ1Y3R1cmFsIGVsZW1lbnQocykgYW5kL29yIGF0dHJpYnV0ZShzKSAnezF9J1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmxlIGVsZW1lbnRzIHdpdGggJ3JvbGU9XFxcInByZXNlbnRhdGlvblxcXCIgb3IgJ3JvbGU9XFxcIm5vbmVcXFwiIHNob3VsZCBub3QgaGF2ZSBzdHJ1Y3R1cmFsIGVsZW1lbnRzIG9yIGF0dHJpYnV0ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmIChUYWJsZVV0aWwuaXNEYXRhVGFibGUocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmlzTm9kZUluR3JpZChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBlcnJvck5vZGVzID0gW107XG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInN1bW1hcnlcIikpXG4gICAgICAgICAgICBlcnJvck5vZGVzLnB1c2gocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBjYXB0aW9uRWxlbXMgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNhcHRpb25cIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FwdGlvbkVsZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihjYXB0aW9uRWxlbXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY2FwdGlvbkVsZW1zW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGVycm9yTm9kZXNcbiAgICAgICAgICAgICAgICBlcnJvck5vZGVzLnB1c2goY2FwdGlvbkVsZW1zW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aE5vZGVzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0aFwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcih0aE5vZGVzW2ldLCBcInRhYmxlXCIpID09IHJ1bGVDb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHRoTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgZXJyb3JOb2Rlc1xuICAgICAgICAgICAgICAgIGVycm9yTm9kZXMucHVzaCh0aE5vZGVzW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdGROb2RlcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCh0ZE5vZGVzW2ldLmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpIHx8IHRkTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkgJiZcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHRkTm9kZXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4odGROb2Rlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBlcnJvck5vZGVzXG4gICAgICAgICAgICAgICAgZXJyb3JOb2Rlcy5wdXNoKHRkTm9kZXNbaV0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBhY3R1YWxseSBtYWtpbmcgdXNlIG9mIHRoZXNlcyBlcnJvck5vZGVzIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHBhc3NlZCBhbG9uZyB3aXRoXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGlvblJlc3VsdCwgd2UgZG8gbm90IG5lZWQgdG8ga2VlcCBsb29waW5nIG92ZXIgYW5kIGdldHRpbmcgZXZlcnkgc2luZ2xlIHZpb2xhdGluZyBub2RlIHVuZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJ1bGUgY29udGV4dC4gVGhpcyBjYW4gYmUgYSBmdXR1cmUgZW5oYW5jZW5tZW50IHdoZXJlIHdlIGFjdHVhbGx5IG1ha2UgdXNlIG9mIHRoZSBlcnJvciBub2RlcyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCBhbG9uZy4gQWRkaW5nIHRoaXMgYnJlYWsgdG8gc3BlZWQgdXAgcGVyZm9ybWFuY2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICBicmVhazsgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8ga2VlcCBhZGRpbmcgdGhlIGVycm9yIG5vZGVzLCBzdG9wIGFmdGVyIGZpbmRpbmcgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBub2RlIG5hbWUgZm9yIHRoZSBydWxlIGNvbnRleHQgZWxlbWVudCBpbiB0aGlzIGNhc2UgaXQgd2lsbCBhbHdheXMgYmUgdGFibGVcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50VG9rZW4gPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhIG5ldyBhcnJheSB3aGljaCB3aWxsIGNvbnRhbiBvbmx5IHRoZSBlbGVtZW50IHRhZyBmb3IgdGhlIHZpb2xhdGlvbiBlbGVtZW50c1xuICAgICAgICBsZXQgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBzZWVuIGhhc2ggdGhhdCB3aWxsIGtlZXAgdHJhc2sgb2YgYWxsIHRoZSBlbGVtZW50cyB0aGF0IHdlcmUgYWxyZWFkeSBhZGRlZCB0byB0aGUgdG9rZW4gYXJyYXksIHRvIG1ha2Ugc3VyZVxuICAgICAgICAvLyB3ZSBkbyBub3QgZHVwbGljYXRlIGFueSBvZiB0aGUgZWxlbWVudHMuIER1cGxpY2F0ZSBlbGVtZW50IHRhZ3MgaW4gdGhlIHRva2VuIG1lc3NhZ2UgbG9va3MgYmFkIGFuZCBjb25mdXNpbmcuXG4gICAgICAgIGxldCBzZWVuID0ge307XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdmlvbGF0aW5nIHN0cnVjdHVyYWwgZWxlbWVudHMgYW5kIGV4dHJhY3QgdGhlIGVsZW1lbnQgdGFnIHRvIGJlIHVzZWQgYXMgYSB0b2tlblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9yTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBuYW1lICh0YWcgbmFtZSkgZm9yIHRoZSB2aW9sYXRpbmcgc3RydWN0dXJhbCBlbGVtZW50XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBlcnJvck5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBhZGQgdGhlIHZpb2xhdGluZyBlbGVtZW50IG9uY2VcbiAgICAgICAgICAgIGlmICghc2Vlbi5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgYWRkaW5nIHRoZSB0b2tlbiBhcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3ZSBuZWVkIHRvIGhhbmRsZVxuICAgICAgICAgICAgICAgIC8vIHRoZSBzdW1tYXJ5IGF0dHJpYnV0ZSBvbiB0aGUgcnVsZUNvbnRleHQgKHRhYmxlKS4gV2Ugb25seSBhZGQgc3VtbWFyeSBvbmNlLCBzYW1lIGFzXG4gICAgICAgICAgICAgICAgLy8gZm9yIGVsZW1lbnRzIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGluIHRoZSBtZXNzYWdlLiAoU3VtbWFyeSBzaG91bGQgbm90IGR1cGxpY2F0ZSwgYnV0IGp1c3QgaW4gY2FzZSlcbiAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmICFzZWVuLmhhc093blByb3BlcnR5W1wic3VtbWFyeVwiXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIHNlZW5bXCJzdW1tYXJ5XCJdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgbmV3IHZpb2xhdGluZyBlbGVtZW50IGFkZCBpdCB0byB0aGUgc3RydWN0dXJhbCBlbGVtZW50IHRva2VucyBhcnJheVxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsRWxlbWVudFRva2Vucy5wdXNoKFwic3VtbWFyeVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBzZWVuW25vZGVOYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIG5ldyB2aW9sYXRpbmcgZWxlbWVudCBhZGQgaXQgdG8gdGhlIHN0cnVjdHVyYWwgZWxlbWVudCB0b2tlbnMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMucHVzaChub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIHRoZSBhcnJheSBvZiBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZCBqb2luIHRoZW0gd2l0aCBhIGNvbW1hIGFuZCBhIHNwYWNlIHRvIG1ha2UgZ3JhbW1hdGljYWwgY29ycmVjdCBpblxuICAgICAgICAvLyB0aGUgbWVzc2FnZS5cbiAgICAgICAgbGV0IHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyID0gc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KGVycm9yTm9kZXMubGVuZ3RoID09IDAsIGVycm9yTm9kZXMsICcnLCAnJywgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zXSk7XG4gICAgICAgIGlmIChlcnJvck5vZGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyXSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfQ2FwU3VtbVJlZHVuZGFudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfc3VtbWFyeV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIHRhYmxlIHN1bW1hcnkgZHVwbGljYXRlcyB0aGUgY2FwdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSB0YWJsZSBzdW1tYXJ5IG11c3Qgbm90IGR1cGxpY2F0ZSB0aGUgY2FwdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcG9mSWQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgc3VtU3RyO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3VtbWFyeVwiKSkge1xuICAgICAgICAgICAgcG9mSWQgPSAwO1xuICAgICAgICAgICAgc3VtU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3VtbWFyeVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDE7XG4gICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGVJZHMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGxldCBzdW1tYXJ5Tm9kZUNvbmNhdCA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1bW1hcnlOb2RlSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1bW1hcnlOb2RlSWQgPSBzdW1tYXJ5Tm9kZUlkc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoc3VtbWFyeU5vZGVJZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgc3VtbWFyeU5vZGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdW1tYXJ5Tm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShzdW1tYXJ5Tm9kZSxydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlOb2RlQ29uY2F0ICs9IFwiIFwiICsgQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoc3VtbWFyeU5vZGUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3VtU3RyID0gc3VtbWFyeU5vZGVDb25jYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdW1TdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNhcEVsZW1zID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjYXB0aW9uXCIpO1xuICAgICAgICAgICAgaWYgKGNhcEVsZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdW1TdHIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjYXBTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChjYXBFbGVtc1swXSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFzdW1TdHIuaW5jbHVkZXMoY2FwU3RyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZUZhaWwsIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG4gICAgXG4gICAgZXhwb3J0IGNvbnN0IHRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnQ6IFJ1bGUgPSB7XG4gICAgICAgIGlkOiBcInRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnRcIixcbiAgICAgICAgY29udGV4dDogXCJkb206KlwiLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgICAgICBoZWxwOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgICAgICBcImdyb3VwXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX3NwYWNpbmdcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc2l6ZWRcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3NfaW5saW5lXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX2RlZmF1bHRcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInZpb2xhdGlvbl9zcGFjaW5nXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJyZWNvbW1lbmRhdGlvbl9pbmxpbmVcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBvdGVudGlhbF9vdmVybGFwXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgdGFyZ2V0IG11c3QgYmUgc3VmZmljaWVudGx5IHNpemVkIG9yIHNwYWNlZCBmcm9tIG90aGVyIHRhcmdldHNcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc3BhY2luZ1wiOiBcIlRoZSB0YXJnZXQncyBzcGFjaW5nIGZyb20gb3RoZXIgdGFyZ2V0cyBpcyBzdWZmaWNpZW50XCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX3NpemVkXCI6IFwiVGhlIHRhcmdldOKAmXMgc2l6ZSBpcyBtb3JlIHRoYW4gMjQgQ1NTIHBpeGVsc1wiLFxuICAgICAgICAgICAgICAgIFwicGFzc19pbmxpbmVcIjogXCJUaGUgdGFyZ2V0IGlzIGluIGEgc2VudGVuY2Ugb3IgaXRzIHNpemUgaXMgb3RoZXJ3aXNlIGNvbnN0cmFpbmVkIGJ5IHRoZSBsaW5lLWhlaWdodCBvZiBub24tdGFyZ2V0IHRleHRcIixcbiAgICAgICAgICAgICAgICBcInBhc3NfZGVmYXVsdFwiOiBcIlRoZSB0YXJnZXQncyBzaXplIGlzIGRldGVybWluZWQgYnkgdGhlIHVzZXIgYWdlbnQgYW5kIGlzIG5vdCBtb2RpZmllZCBieSB0aGUgYXV0aG9yXCIsXG4gICAgICAgICAgICAgICAgXCJ2aW9sYXRpb25fc3BhY2luZ1wiOiBcIlVuZGVyc2l6ZWQgdGFyZ2V0IFxcXCJ7MH1cXFwiIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBzcGFjaW5nIG9mIDEyIENTUyBwaXhlbHMgZnJvbSBhbm90aGVyIHRhcmdldCBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgICAgIFwicmVjb21tZW5kYXRpb25faW5saW5lXCI6IFwiQ29uZmlybSB0aGUgaW5saW5lIHRhcmdldCBcXFwiezB9XFxcIiBpcyBzdWZmaWNpZW50bHkgc3BhY2VkIGZyb20gYW5vdGhlciBpbmxpbmUgdGFyZ2V0IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3ZlcmxhcFwiOiBcIkVuc3VyZSB0aGUgb3ZlcmxhcHBlZCB0YXJnZXQgXFxcInswfVxcXCIgbWVldHMgYSBtaW5pbXVtIHRhcmdldCBzaXplIG9yIGhhcyBzdWZmaWNpZW50IHNwYWNpbmcgZnJvbSB0aGUgb3ZlcmxhcHBpbmcgdGFyZ2V0IFxcXCJ7MX1cXFwiXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcnVsZXNldHM6IFt7XG4gICAgICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgICAgbnVtOiBbXCIyLjUuOFwiXSxcbiAgICAgICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUsXG4gICAgICAgICAgICByZWFzb25Db2RlczogW1wicGFzc19zcGFjaW5nXCIsXCJwYXNzX3NpemVkXCIsIFwicGFzc19pbmxpbmVcIixcInBhc3NfZGVmYXVsdFwiLCBcInZpb2xhdGlvbl9zcGFjaW5nXCIsIFwicG90ZW50aWFsX292ZXJsYXBcIl1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgICAgIG51bTogW1wiMi41LjhcIl0sXG4gICAgICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUsXG4gICAgICAgICAgICByZWFzb25Db2RlczogW1wicmVjb21tZW5kYXRpb25faW5saW5lXCJdXG4gICAgICAgIH1dLFxuICAgICAgICBhY3Q6IFtdLFxuICAgICAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBtYXBwZXIgOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhydWxlQ29udGV4dCk7IC8vY29udGV4dFtcImRvbVwiXS5ib3VuZHM7ICAgIFxuICAgICAgICAgICAgaWYgKCFib3VuZHMpIFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBpZ25vcmUgaGlkZGVuLCBub24tdGFyZ2V0XG4gICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuaXNUYXJnZXQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBpZiAoYm91bmRzLmhlaWdodCA+PSAyNCAmJiBib3VuZHMud2lkdGggPj0gMjQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19zaXplZFwiKTsgXG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlubGluZSBlbGVtZW50OiB3aXRob3V0IHRleHQgaW4gdGhlIHNhbWUgbGluZVxuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gQ1NTVXRpbC5nZXRJbmxpbmVTdGF0dXMocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAoc3RhdHVzLmlubGluZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnZpb2xhdGlvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfaW5saW5lXCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IGlubGluZSBlbGVtZW50IGlzIHRvbyBjbG9zZSBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25faW5saW5lXCIsIFtub2RlTmFtZSwgc3RhdHVzLnZpb2xhdGlvbl0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmlvbGF0aW9uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19kZWZhdWx0XCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IGlubGluZSBlbGVtZW50IGlzIHRvbyBjbG9zZSBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25faW5saW5lXCIsIFtub2RlTmFtZSwgc3RhdHVzLnZpb2xhdGlvbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGJyb3dzZXIgZGVmYXVsdFxuICAgICAgICAgICAgICAgIGlmIChDU1NVdGlsLmlzVGFyZ2V0QnJvd3NlckRlZmF1bHQocnVsZUNvbnRleHQpKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19kZWZhdWx0XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChjU3R5bGUgPT09IG51bGwpIFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgemluZGV4ID0gY1N0eWxlLnpJbmRleDsgICBcbiAgICAgICAgICAgIGlmICghemluZGV4IHx8IGlzTmFOKE51bWJlcih6aW5kZXgpKSlcbiAgICAgICAgICAgICAgICB6aW5kZXggPSBcIjBcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHRhcmdldCBlbGVtZW50c1xuICAgICAgICAgICAgbGV0IHRhcmdldEVsZW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYy5kb2N1bWVudEVsZW1lbnQsIFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudDo6dGFyZ2V0c1wiLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRFbGVtcyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHRhcmdldEVsZW1zID0gW107XG4gICAgICAgICAgICAgICAgLy9zZWxlY3QgYWxsIGVsZW1lbnRzIGV4Y2VwdCBpdHNlbGYgYW5kIGRlc2NlbmRhbnRzXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1zID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgKjpub3Qoc2NyaXB0KTpub3Qoc3R5bGUpJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZWxlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1zW2ldIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc1RhcmdldChlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RWxlbXMucHVzaChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLmRvY3VtZW50RWxlbWVudCwgXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Ojp0YXJnZXRzXCIsIHRhcmdldEVsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0YXJnZXRFbGVtcyB8fCB0YXJnZXRFbGVtcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBtaW5YID0gMjQ7XG4gICAgICAgICAgICBsZXQgbWluWSA9IDI0O1xuICAgICAgICAgICAgbGV0IGFkamFjZW50WCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgYWRqYWNlbnRZID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBjaGVja2VkID0gW107IC8vY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgc28gdGhlaXIgZGVzY2VuZGFudHMgZG9uJ3QgbmVlZCB0byBiZSBjaGVja2VkIGFnYWluXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0YXJnZXRFbGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB0YXJnZXRFbGVtc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiAgdGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBpcyBpbiBkb2N1bWVudCBvcmRlclxuICAgICAgICAgICAgICAgICAqICBpZiB0d28gZWxlbWVudHMgb3ZlcmxhcCBhbmQgei1pbmRleCBhcmUgbm90IGRlZmluZWQsIHRoZW4gdGhlIG5vZGUgcmVuZGVyZWQgZWFybGllciB3aWxsIGJlIG92ZXJsYWlkIGJ5IHRoZSBub2RlIHJlbmRlcmVkIGxhdGVyXG4gICAgICAgICAgICAgICAgICogIGZpbHRlciBvdXQgdGhlIGVsZW1lbnRzIHRoYXTigJlyZSBkZXNjZW5kYW50IG9yIGFuY2VzdG9ycyBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQsIG5vciBkZXNjZW5kYW50IG9mIHRoZSB0YXJnZXQgZWxlbWVudCdzIHNpYmxpbmdzXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgLy8gVXNlIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHRvIGNoZWNrIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcHNcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiByZXR1cm5zIDAgd2hlbiBjb21wYXJpbmcgYSBub2RlIHRvIGl0c2VsZlxuICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcnVsZUNvbnRleHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZICgxNik6IGVsZW0gaXMgY29udGFpbmVkIGJ5IHJ1bGVDb250ZXh0XG4gICAgICAgICAgICAgICAgLy8gQWxzbyBoYW5kbGUgc2VsZi1jb21wYXJpc29uIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IDAgfHwgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgbm9kZSBpbiBlbGVtcyB3aWxsIGJlIGFmdGVyIHRoZSB0YXJnZXQgbm9kZSAocnVsZUNvbnRleHQpLlxuICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TICg4KTogZWxlbSBjb250YWlucyBydWxlQ29udGV4dFxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhc2NlbmRhbnRzIG9mIHRoZSBlbGVtZW50LCBvciBpdHNlbGYgb3IgaXRzIGFzY2VuZGFudCBhbHJlYWR5IGNoZWNrZWRcbiAgICAgICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykgfHwgY2hlY2tlZC5zb21lKGl0ZW0gPT4gaXRlbS5jb250YWlucyhlbGVtKSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKGVsZW0pO1xuICAgICAgICAgICAgICAgIGlmICghYm5kcykgY29udGludWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IHpTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbSk7IFxuICAgICAgICAgICAgICAgIGxldCB6X2luZGV4ID0gJzAnO1xuICAgICAgICAgICAgICAgIGlmICh6U3R5bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgel9pbmRleCA9IHpTdHlsZS56SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmICghel9pbmRleCB8fCBpc05hTihOdW1iZXIoel9pbmRleCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgel9pbmRleCA9IFwiMFwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNhc2UgMjogdGhlIGVsZW1lbnQgb3ZlcmxhcHMgdGhlIHRhcmdldCBlbnRpcmVseVxuICAgICAgICAgICAgICAgIC8vIG5vdGUgd2hlbiBhIGxpbmsgaXMgaW5saW5lIHdpdGggb3RoZXIgdGFyZ2V0LCBpZiB0aGUgbGluayB0ZXh0IHdyYXBzIGluIGFub3RoZXIgbGluZSBpbiBhIGdpdmVuIHZpZXdwb3J0LCAgXG4gICAgICAgICAgICAgICAgLy8gdGhlIGJvdW5kcyBvZiB0aGUgbGluayBtYXkgY292ZXIgYW5kIHRoZSBlbnRpcmUgdHdvIGxpbmVzLCBjYXVzaW5nIHRoZSBvdGhlciB0YWdldHMgdG8gYmUgb3ZlcmxhcHBlZCwgc2VlIHR3byBsaW5rcyBpbiB0aGUgdGVzdCBjYXNlOiBlbGVtZW50X2lubGluZS5odG1sIFxuICAgICAgICAgICAgICAgIGlmIChibmRzLnRvcCA8PSBib3VuZHMudG9wICYmIGJuZHMubGVmdCA8PSBib3VuZHMubGVmdCAmJiBibmRzLnRvcCArIGJuZHMuaGVpZ2h0ID49IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IFxuICAgICAgICAgICAgICAgICAgICAmJiBibmRzLmxlZnQgKyBibmRzLndpZHRoID49IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YXJnZXQgb24gdG9wICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID8gcGFyc2VJbnQoemluZGV4KSA8IHBhcnNlSW50KHpfaW5kZXgpOiBwYXJzZUludCh6aW5kZXgpIDw9IHBhcnNlSW50KHpfaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFyZ2V0IGlzIGVudGlyZWx5IGNvdmVyZWQ6IHRhYmJhYmxlIHRhcmdldCBoYW5kbGVkIGJ5IGVsZW1lbnRfdGFiYmFibGVfdW5vYnNjdXJlZCBhbmQgdGFiaW5kZXg9LTEgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb3ZlcmxhcFwiLCBbbm9kZU5hbWUsIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY2FzZSAzOiBpZiB0aGUgdGFyZ2V0IG92ZXJsYXBzIHRoZSBlbGVtZW50IGVudGlyZWx5XG4gICAgICAgICAgICAgICAgaWYgKGJvdW5kcy50b3AgPD0gYm5kcy50b3AgJiYgYm91bmRzLmxlZnQgPD0gYm5kcy5sZWZ0ICYmIGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0ID49IGJuZHMudG9wICsgYm5kcy5oZWlnaHQgXG4gICAgICAgICAgICAgICAgICAgICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoID49IGJuZHMubGVmdCArIGJuZHMud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgb24gdG9wICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID8gcGFyc2VJbnQoemluZGV4KSA8IHBhcnNlSW50KHpfaW5kZXgpOiBwYXJzZUludCh6aW5kZXgpIDw9IHBhcnNlSW50KHpfaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdmVybGFwXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgLy8gdGhlIHRhcmdldCBvbiB0b3BcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcInZpb2xhdGlvbl9zcGFjaW5nXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7ICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY2FzZSA0OiB0aGUgZWxlbWVudCBvdmVybGFwcyBwYXJ0aWFsbHkgd2l0aCB0aGUgdGFyZ2V0XG4gICAgICAgICAgICAgICAgaWYgKCgoKGJvdW5kcy50b3AgPj0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCA8PSBibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSB8fCAoYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPD0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPj0gYm5kcy50b3AgK2JuZHMuaGVpZ2h0KSlcbiAgICAgICAgICAgICAgICAgICAgICYmICgoYm91bmRzLmxlZnQgPiBibmRzLmxlZnQgJiYgYm91bmRzLmxlZnQgPCBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm5kcy5sZWZ0ID4gYm91bmRzLmxlZnQgJiYgYm5kcy5sZWZ0IDwgYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGgpKSkgXG4gICAgICAgICAgICAgICAgICAgICB8fCAoKChib3VuZHMudG9wID4gYm5kcy50b3AgJiYgYm91bmRzLnRvcCA8IGJuZHMudG9wICsgYm5kcy5oZWlnaHQpIHx8IChibmRzLnRvcCA+IGJvdW5kcy50b3AgJiYgYm5kcy50b3AgPCBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCkpXG4gICAgICAgICAgICAgICAgICAgICAmJiAoKGJvdW5kcy5sZWZ0ID49IGJuZHMubGVmdCAmJiBib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggPj0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIDw9IGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG1vcmUgY2hlY2sgdG8gdHVybiB0byB2aW9sYXRpb24gIFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb3ZlcmxhcFwiLCBbbm9kZU5hbWUsIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pOyBcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG5vIG92ZXJsYXAgd2l0aCB0aGUgZWxlbSwgdGhvdWdoIG1heSBvdmVybGFwIHdpdGhlIG90aGVyIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXNYID0gMjQ7IFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlzWSA9IDI0OyAgIFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWxlbWVudCBpcyBpbiB0aGUgaG9yaXpvbnRhbGx5IHNhbWUgcm93IHdpdGggdGhlIHRhcmdldFxuICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoIDwgMjQgJiYgKChib3VuZHMudG9wID49IGJuZHMudG9wICYmIGJvdW5kcy50b3AgPD0gYm5kcy50b3AgKyBibmRzLmhlaWdodCkgfHwgKGJvdW5kcy50b3AgPD0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPiBibmRzLnRvcCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzWCA9IE1hdGgubWluKCBNYXRoLmFicyhib3VuZHMubGVmdCAtIGJuZHMubGVmdCksIE1hdGguYWJzKGJvdW5kcy5sZWZ0IC0gKGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSwgIE1hdGguYWJzKGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC0gKGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSwgTWF0aC5hYnMoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLSBibmRzLmxlZnQpKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IGlzIGluIHRoZSB2ZXJ0aWNhbGx5IHNhbWUgY29sdW1uIHdpdGggdGhlIHRhcmdldCAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvdW5kcy5oZWlnaHQgPCAyNCAmJiAoKGJvdW5kcy5sZWZ0ID49IGJuZHMubGVmdCAmJiBib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm91bmRzLmxlZnQgPD0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoID4gYm5kcy5sZWZ0KSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNZID0gTWF0aC5taW4oTWF0aC5hYnMoYm91bmRzLnRvcCAtIGJuZHMudG9wKSwgTWF0aC5hYnMoYm91bmRzLnRvcCAtIChibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSksICBNYXRoLmFicyhib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAtIChibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSksIE1hdGguYWJzKGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC0gYm5kcy50b3ApKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXNYIDwgbWluWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluWCA9IGRpc1g7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFggPSBlbGVtO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoZGlzWSA8IG1pblkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pblkgPSBkaXNZOyAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnRZID0gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja2VkLnB1c2goZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGNhc2UgNTogbm8gb3ZlcmxhcCArIGluc3VmZmljaWVudCB0YXJnZXQgc2l6ZS4gY2hlY2sgc3BhY2luZyAgICBcbiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aC8yKSArIG1pblggPCAxMiB8fCBNYXRoLnJvdW5kKGJvdW5kcy5oZWlnaHQvMikgKyBtaW5ZIDwgMTIpIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5yb3VuZChib3VuZHMud2lkdGgvMikgKyBtaW5YIDwgTWF0aC5yb3VuZChib3VuZHMuaGVpZ2h0LzIpICsgbWluWSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwidmlvbGF0aW9uX3NwYWNpbmdcIiwgW25vZGVOYW1lLCBhZGphY2VudFgubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pOyBcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJ2aW9sYXRpb25fc3BhY2luZ1wiLCBbbm9kZU5hbWUsIGFkamFjZW50WS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19zcGFjaW5nXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X2Jsb2NrX2hlYWRpbmc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9ibG9ja19oZWFkaW5nXCIsXG4gICAgY29udGV4dDogXCJkb206cCwgZG9tOmRpdiwgZG9tOmJyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxvY2tfU2hvdWxkQmVIZWFkaW5nXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9oZWFkaW5nXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwidGV4dF9ibG9ja19oZWFkaW5nLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2hlYWRpbmdcIjogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfYmxvY2tfaGVhZGluZy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJIZWFkaW5nIHRleHQgdXNlcyBhIGhlYWRpbmcgZWxlbWVudCBvciByb2xlXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9oZWFkaW5nXCI6IFwiQ29uZmlybSB0aGlzIHRleHQgJ3swfScgaXMgdXNlZCBhcyBhIGhlYWRpbmcgYW5kIGlmIHNvLCBtb2RpZnkgdG8gdXNlIGEgaGVhZGluZyBlbGVtZW50IG9yIHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIZWFkaW5nIHRleHQgc2hvdWxkIHVzZSBhIGhlYWRpbmcgZWxlbWVudCBvciByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInNjcmlwdFwiXSkgIT09IG51bGwpIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBudW1Xb3Jkczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAxMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgYm9keUZvbnQgPSAwO1xuICAgICAgICBsZXQgYm9keSA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpO1xuICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgYm9keVN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShib2R5WzBdKTtcbiAgICAgICAgICAgIGlmIChib2R5U3R5bGUpIGJvZHlGb250ID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoYm9keVN0eWxlWydmb250LXNpemUnXSwgYm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG51bVdvcmRzID0gdmFsaWRhdGVQYXJhbXMubnVtV29yZHMudmFsdWU7XG4gICAgICAgIGxldCB3b3Jkc1NlZW4gPSAwO1xuICAgICAgICBsZXQgd29yZFN0cjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGVtcGhhc2l6ZWRUZXh0ID0gZmFsc2U7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQpO253Lm5leHROb2RlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiZcbiAgICAgICAgICAgIG53Lm5leHROb2RlKCkgJiYgXG4gICAgICAgICAgICBudy5ub2RlICE9PSBydWxlQ29udGV4dCAmJlxuICAgICAgICAgICAgbncubm9kZSAhPT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocnVsZUNvbnRleHQpICYmXG4gICAgICAgICAgICAhW1wiYnJcIiwgXCJkaXZcIiwgXCJwXCJdLmluY2x1ZGVzKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIC8vIERvbid0IHJlcG9ydCB0d2ljZVxuICAgICAgICB7ICAgXG4gICAgICAgICAgICBpZiAobncubm9kZSA9PT0gcnVsZUNvbnRleHQgfHwgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgbndOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDMpIHsgXG4gICAgICAgICAgICAgICAgLy8gZm9yIHRleHQgY2hpbGRcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDAgJiYgbncubm9kZS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGl0J3Mgc3R5bGUgaWYgdGhlIHRhcmdldCBlbGVtZW50IGNvbnRhaW5zIHRleHQsIGUuZy4sIDxwPiBmYWtlIGhlYWRpbmc8L3A+IFxuICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG53Lm5vZGUucGFyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSAmJiAoc3R5bGVbJ2ZvbnQtd2VpZ2h0J10gPT09ICdib2xkJyB8fCBzdHlsZVsnZm9udC13ZWlnaHQnXSA+PSA3MDBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAoc3R5bGVbJ2ZvbnQtc2l6ZSddICYmIHN0eWxlWydmb250LXNpemUnXS5pbmNsdWRlcyhcImxhcmdlXCIpKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdHlsZVsnZm9udC1zaXplJ10gJiYgYm9keUZvbnQgIT09IDAgJiYgQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVbJ2ZvbnQtc2l6ZSddLG53Lm5vZGUucGFyZW50RWxlbWVudCkgID4gYm9keUZvbnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdjID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRTdHIucHVzaChuZXh0U3RyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZHNTZWVuICs9IHdjO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgbm9kZSBiZWNhdXNlIGl0J3MgZW1waGFzaXplZFxuICAgICAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm9kZSBjb250YWluIHJlZ3VsYXIgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBlbGVtZW50IGNoaWxkXG4gICAgICAgICAgICAgICAgaWYgKG53TmFtZSA9PT0gXCJiXCIgfHwgbndOYW1lID09PSBcInN0cm9uZ1wiIHx8IG53TmFtZSA9PT0gXCJ1XCIgfHwgbndOYW1lID09PSBcImZvbnRcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgY29udGFpbnMgZW1waGFzaXMgY2hpbGQsIGUuZy4sIDxwPjxzdHJvbmc+ZmFrZSBoZWFkaW5nPC9zdHJvbmc+PC9wPiBcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChudy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAod2MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JkU3RyLnB1c2gobmV4dFN0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3Jkc1NlZW4gKz0gd2M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBub2RlIGJlY2F1c2UgaXQncyBlbXBoYXNpemVkXG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZWxlbWVudCB3aGljaCBoYXMgYSByb2xlIGV4Y2VwdCAnZ2VuZXJpYycsICdwYXJhZ3JhcGgnIG9yICdzdHJvbmcnXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhcHBsZXQgZWxlbWVudCB0aGF0IGlzIGRlcHJlY2F0ZWQgYW55d2F5XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAocm9sZSAhPT0gbnVsbCAmJiByb2xlICE9PSAnZ2VuZXJpYycgJiYgcm9sZSAhPT0gJ3BhcmFncmFwaCcgJiYgcm9sZSAhPT0gJ3N0cm9uZycpIHx8IG53TmFtZSA9PT0gXCJhcHBsZXRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdvcmRzU2VlbiA9PSAwKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAvL2lnbm9yZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCDigJw64oCdICDigJws4oCdICDigJwt4oCdICDigJw74oCdIG9yIOKAnC7igJ0gXG4gICAgICAgIGlmICghcGFzc2VkKSBwYXNzZWQgPSAvWzosO1xcLVxcLl0kLy50ZXN0KHdvcmRTdHIuam9pbihcIiBcIikudHJpbSgpKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfaGVhZGluZ1wiLCBbd29yZFN0ci5qb2luKFwiIFwiKV0pO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENvbG9yVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbG9yVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50OiBSdWxlID0ge1xuICAgIGlkOiBcInRleHRfY29udHJhc3Rfc3VmZmljaWVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfQ29sb3JfQ29udHJhc3RfV0NBRzJBQVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9jb250cmFzdFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJJQk1BX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFfUFZcIjoge1xuICAgICAgICAgICAgXCJwYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX2dyYXBoaWNfYmFja2dyb3VuZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYHRleHRfY29udHJhc3Rfc3VmZmljaWVudC5odG1sYCxcbiAgICAgICAgICAgIFwiZmFpbF9jb250cmFzdFwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfc2FtZV9jb2xvclwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZ3JhcGhpY19iYWNrZ3JvdW5kXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0X3NoYWRvd1wiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb250cmFzdCByYXRpbyBvZiB0ZXh0IHdpdGggaXRzIGJhY2tncm91bmQgbXVzdCBtZWV0IFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgY29udHJhc3QgcmF0aW8gb2YgdGV4dCB3aXRoIGl0cyBiYWNrZ3JvdW5kIG1lZXRzIFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJhc3RcIjogXCJUZXh0IGNvbnRyYXN0IG9mIHswfSB3aXRoIGl0cyBiYWNrZ3JvdW5kIGlzIGxlc3MgdGhhbiB0aGUgV0NBRyBBQSBtaW5pbXVtIHJlcXVpcmVtZW50cyBmb3IgdGV4dCBvZiBzaXplIHsxfXB4IGFuZCB3ZWlnaHQgb2YgezJ9XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCI6IFwiVGhlIGZvcmVncm91bmQgdGV4dCBhbmQgaXRzIGJhY2tncm91bmQgY29sb3IgYXJlIGJvdGggZGV0ZWN0ZWQgYXMgezN9LiBWZXJpZnkgdGhlIHRleHQgbWVldHMgdGhlIFdDQUcgQUEgcmVxdWlyZW1lbnRzIGZvciBtaW5pbXVtIGNvbnRyYXN0XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IGFnYWluc3QgdGhlIGxpZ2h0ZXN0IGFuZCB0aGUgZGFya2VzdCBjb2xvcnMgb2YgdGhlIGJhY2tncm91bmQgbWVldHMgdGhlIFdDQUcgQUEgbWluaW11bSByZXF1aXJlbWVudHMgZm9yIHRleHQgb2Ygc2l6ZSB7MX1weCBhbmQgd2VpZ2h0IG9mIHsyfVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfdGV4dF9zaGFkb3dcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IHdpdGggc2hhZG93IG1lZXRzIHRoZSBXQ0FHIEFBIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0ZXh0IG9mIHNpemUgezF9cHggYW5kIHdlaWdodCBvZiB7Mn1cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjEuNC4zXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbJ2FmdzRmNyddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBhdm9pZCBkaWFnbm9zaW5nIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vVE9ETyA/IHNob3VsZCBvbmx5IGNvbnNpZGVyIG5hdGl2ZSBkaXNhYmxlZCwgaWdub3JlIGFyaWEtZGlzYWJsZWRcbiAgICAgICAgLy9za2lwIGRpc2FibGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9za2lwIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzdmdcIiwgXCJzY3JpcHRcIiwgXCJtZXRhXCIsIFwic3R5bGVcIl0pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBsZXQgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgICAgICBpZiAoIXdpbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHQuXG4gICAgICAgIGxldCBjaGlsZFN0ciA9IENvbW1vblV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpIHx8IChDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpICYmIENvbW1vblV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQuc2hhZG93Um9vdCkgPT09ICcnKSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT0gMCApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgdGV4dCBkb2VzIG5vdCBjb252ZXkgYW55dGhpbmcgaW4gaHVtYW4gbGFuZ3VhZ2VcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqICgxKSBpZ25vcmUgbm9uLWFscGhhbnVtZXJpYyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gQVNDSTogXihhLXpBLVpcXGRcXHMpXG4gICAgICAgICAgICAgKiAoMikgaWdub3JlIG5vbi1wcmludGFibGUgdW5pY29kZSBjaGFyYWN0ZXJzOiBcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRlxuICAgICAgICAgICAgICogIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzcwMTE3L3doYXQtaXMtdGhlLXJhbmdlLW9mLXVuaWNvZGUtcHJpbnRhYmxlLWNoYXJhY3RlcnNcbiAgICAgICAgICAgICAqICgzKSBmb3Igbm93IG5vdCBjb25zaWRlciB1bmljb2RlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IGFyZSBkaWZmZXJlbnQgaW4gZGlmZmVyZW50IGxhbmd1YWdlc1xuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC8vbGV0IHJlZ2V4ID0gL1teKGEtekEtWlxcZFxccylcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRl0rL2c7XG4gICAgICAgICAgICBsZXQgcmVnZXggPSAvW14oYS16QS1aXFxkXFxzKVxcXihcXHU0ZTAwLVxcdTlmZmZcXHUzNDAwLVxcdTRkYmYpXFx1MDAwMC1cXHUwMDA4XFx1MDAwQi1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXFx1MjA1Ri1cXHUyMDZGXFx1MzAwMFxcdUZFRkZdKy9nO1xuICAgICAgICAgICAgY2hpbGRTdHIgPSBjaGlsZFN0ci50cmltKCkucmVwbGFjZShyZWdleCwgJycpO1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbSA9IHJ1bGVDb250ZXh0O1xuICAgICAgICAvLyB0aGUgY2hpbGQgZWxlbWVudHMgKHJhdGhlciB0aGFuIHNoYWRvdyByb290KSBvZiBhIHNoYWRvdyBob3N0IGlzIGVpdGhlciByZS1hc3NpZ25lZCB0byB0aGUgc2hhZG93IHNsb3QgaWYgdGhlIHNsb3QgZXhpc3RzIFxuICAgICAgICAvLyBvciBub3QgZGlzcGxheWVkLCBzbyBzaG91bGRuJ3QgYmUgY2hlY2tlZCBmcm9tIHRoZSBsaWdodCBET00sIHJhdGhlciBpdCBzaG91bGQgYmUgY2hlY2tlZCBhcyByZWFzc2dpbmdlZCBzbG90IGVsZW1lbnQocykgaW4gdGhlIHNoYWRvdyBET00uXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAvLyBpZiBpdCdzIGRpcmVjdCB0ZXh0IG9mIGEgc2hhZG93IGhvc3RcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbm9kZT1ydWxlQ29udGV4dC5maXJzdENoaWxkOyBub2RlOyBub2RlPW5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGU9PTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgbXVsdGlwbGUgdGV4dHMgZXhpc3QsIG9ubHkgbmVlZCB0byBjaGVjayBvbmUgXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtID0gKG5vZGUgYXMgVGV4dCkuYXNzaWduZWRTbG90O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH0gICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgc3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEpDSCBjbGlwIElORk86XG4gICAgICAgIC8vICAgICAgVGhlIGNsaXAgcHJvcGVydHkgbGV0cyB5b3Ugc3BlY2lmeSBhIHJlY3RhbmdsZSB0byBjbGlwIGFuIGFic29sdXRlbHkgcG9zaXRpb25lZCBlbGVtZW50LiBcbiAgICAgICAgLy8gICAgICBUaGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBhcyBmb3VyIGNvb3JkaW5hdGVzLCBhbGwgZnJvbSB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNsaXBwZWQuXG4gICAgICAgIC8vICAgICAgUHJvcGVydHkgdmFsdWVzOlxuICAgICAgICAvLyAgICAgICAgICBub25lICAgICAgICBUaGlzIGlzIGRlZmF1bHQuIE5vIGNsaXBwaW5nIGlzIGRvbmVcbiAgICAgICAgLy8gICAgICAgICAgYXV0byAgICAgICAgTm8gY2xpcHBpbmcgd2lsbCBiZSBkb25lXG4gICAgICAgIC8vICAgICAgICAgIHNoYXBlICAgICAgIFRoZSBvbmx5IHZhbGlkIHZhbHVlIGlzOiByZWN0ICh0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQpXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGUuZy4sIGNsaXA6IHJlY3QoMTBweCwgMjBweCwgMzBweCwgNDBweCk7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IHRoZSBmb3VyIHZhbHVlcyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgbWFyZ2luL3BhZGRpbmdcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIHJlY3QgdmFsdWVzIGFyZSBwb3NpdGl2ZSBwaXhlbCB2YWx1ZXMsIGUuZy4sIDEwcHgsIGV0Yy5cbiAgICAgICAgLy8gICAgICAgICAgbWFyZ2luLWJveCAgVXNlcyB0aGUgbWFyZ2luIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBib3JkZXItYm94ICBVc2VzIHRoZSBib3JkZXIgYm94IGFzIHRoZSByZWZlcmVuY2UgYm94XG4gICAgICAgIC8vICAgICAgICAgIHBhZGRpbmctYm94IFVzZXMgdGhlIHBhZGRpbmcgYm94IGFzIHRoZSByZWZlcmVuY2UgYm94XG4gICAgICAgIC8vICAgICAgICAgIGNvbnRlbnQtYm94XG4gICAgICAgIC8vICAgICAgICAgIGZpbGwtYm94XG4gICAgICAgIC8vICAgICAgICAgIHN0cm9rZS1ib3hcbiAgICAgICAgLy8gICAgICBOT1RFOiB0aGUgQ1NTIGNsaXAgcHJvcGVydHkgaXMgZGVwcmVjYXRlZFxuICAgICAgICAvLyAgICAgIEFsc286IGNsaXAgb25seSB3b3JrcyBpZiB0aGUgZWxlbWVudCBpcyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYW5kIGNhbiBvbmx5IGRvIHJlY3RhbmdsZXNcbiAgICAgICAgLy8gY2hlY2sgaWYgZWxlbWVudCB2aXNpYmxlXG4gICAgICAgIGxldCB2aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKHN0eWxlLndpZHRoICE9PSBcIjBcIiAmJlxuICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ICE9PSBcIjBcIiAmJlxuICAgICAgICAgICAgc3R5bGUub3BhY2l0eSAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJlxuICAgICAgICAgICAgc3R5bGUudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicgJiZcbiAgICAgICAgICAgIHN0eWxlLm92ZXJmbG93ICE9PSAnaGlkZGVuJyAmJlxuICAgICAgICAgICAgLy8gbGVmdCBhbmQgcmlnaHQgd29yayB3aXRoIGFsbCBhYnNvbHV0ZSB1bml0c1xuICAgICAgICAgICAgKHN0eWxlLmxlZnQgPT09IFwiYXV0b1wiIHx8IChzdHlsZS5wb3NpdGlvbiA9PT0gJ2Fic29sdXRlJyAmJiBwYXJzZUludChzdHlsZS5sZWZ0LnJlcGxhY2UoL1teMC05ListXS8sICcnKSkgPiAwKSkgJiZcbiAgICAgICAgICAgIChzdHlsZS5sZWZ0ID09PSBcImF1dG9cIiB8fCAoc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZScgJiYgcGFyc2VJbnQoc3R5bGUudG9wLnJlcGxhY2UoL1teMC05ListXS8sICcnKSkgPiAwKSkpIHtcbiAgICAgICAgICAgIHZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJlbGVtZW50IElTIHZpc2libGVcIik7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkNIRUNLIENPTE9SIENPTlRSQVNUIHVubGVzcyB0byBzbWFsbFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZWxlbWVudCBOT1QgdmlzaWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRE8gTk9UIENIRUNLIENPTE9SIENPTlRSQVNUXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBjbGlwSGVpZ2h0ID0gLTE7XG4gICAgICAgIGlmIChzdHlsZS5jbGlwICE9PSBcImF1dG9cIikge1xuICAgICAgICAgICAgbGV0IGNsaXBTdHJpbmcgPSBzdHlsZS5jbGlwLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoY2xpcFN0cmluZy5pbmNsdWRlcyhcInJlY3RcIikpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVCcmFja2V0cyA9IC9cXCgoLiopXFwpL2c7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RPZlRleHQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSByZUJyYWNrZXRzLmV4ZWMoY2xpcFN0cmluZyk7XG4gICAgICAgICAgICAgICAgdmFyIGZvdW5kQXJyID0gZm91bmRbMV0uc3BsaXQoJywgJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3VuZEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImZvdW5kQXJyW1wiLGksXCJdID0gXCIsZm91bmRBcnJbaV0pO1xuICAgICAgICAgICAgICAgICAgICBsaXN0T2ZUZXh0LnB1c2goZm91bmRBcnJbaV0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImxpc3RPZlRleHQgPSBcIixsaXN0T2ZUZXh0KTtcbiAgICAgICAgICAgIGNsaXBIZWlnaHQgPSBwYXJzZUludChsaXN0T2ZUZXh0WzBdLnJlcGxhY2UoL3B4L2csICcnKSkgLSBwYXJzZUludChsaXN0T2ZUZXh0WzJdLnJlcGxhY2UoL3B4L2csICcnKSk7XG4gICAgICAgICAgICBjbGlwSGVpZ2h0ID0gTWF0aC5hYnMoY2xpcEhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBKQ0ggY2xpcC1wYXRoIElORk86XG4gICAgICAgIC8vICAgICAgRXhjZWxsZW50IGFydGljbGUgb24gY2xpcC1wYXRoOiBodHRwczovL2lzaGFkZWVkLmNvbS9hcnRpY2xlL2NsaXAtcGF0aC9cbiAgICAgICAgLy8gICAgICBjbGlwLXBhdGggaXMgYSB0b3RhbGx5IGRpZmZlcmVudCBhbmltYWwgd2l0aCBtYW55LCBtYW55IGRpZmZlcmVudCB2YXJpYXRpb25zXG4gICAgICAgIC8vICAgICAgVGhlIGdvYWwgd2FzIGZvciBpdCB0byBub3QgYmUgYXMgbGltaXRlZCBhcyBjbGlwXG4gICAgICAgIC8vICAgICAgVGhlIHN5bnRheCBpcyBtb3JlIGNvbXBsaWNhdGVkIChhcyBpdCBkb2VzIG1vcmUpIGFuZCBpdCBpcyBkaWZmZXJlbnQgZnJvbSBjbGlwLFxuICAgICAgICAvLyAgICAgIGUuZy4sIHRoZSBhYm92ZSBjbGlwIHJlY3RhbmdsZSB3b3VsZCBiZSBjbGlwLXBhdGg6IGluc2V0KDEwcHggMjBweCAzMHB4IDQwcHgpO1xuICAgICAgICAvLyAgICAgIE5vdGU6IHRoZXJlIGFyZSBubyBjb21tYXNcbiAgICAgICAgLy8gICAgICBBbHNvLCBpdCBjYW4gdGFrZSBzaW5nbGUgdmFsdWVzIHRvIG1ha2UgYWxsIHNpZGVzIHRoZSBzYW1lLCBvciAyIHZhbHVlcyAodmVydC9ob3JpKS5cbiAgICAgICAgLy8gICAgICBvciAzIHZhbHVlcyAodG9wL2hvcmkvYm90dG9tKVxuICAgICAgICAvLyAgICAgIEFuZCBwZXJjZW50YWdlcyBjYW4gd29ya3MgYXMgd2VsbCBhcyBweFxuICAgICAgICAvLyAgICAgIFxuICAgICAgICAvLyAgICAgIEFsdGhvdWdoIHRoZXJlIGFyZSBmaXZlIGRpZmZlcmVudCBzaGFwZXM6IGluc2V0ICh0ZXJtIHVzZWQgZm9yIHJlY3RhbmdsZSksIGNpcmNsZSxcbiAgICAgICAgLy8gICAgICAgICAgZWxsaXBzZSwgcG9seWdvbiwgcGF0aCAtIHdlIHdpbGwgb25seSBjb25jZXJuIG91cnNlbHZlcyB3aXRoIGluc2V0XG4gICAgICAgIC8vICAgICAgVGhlcmUgYXJlIDcgYm94IHZhbHVlczogbWFyZ2luLWJveCwgYm9yZGVyLWJveCwgcGFkZGluZy1ib3gsIGNvbnRlbnQtYm94LCBmaWxsLWJveCwgc3Ryb2tlLWJveCwgdmlldy1ib3hcbiAgICAgICAgLy8gICAgICBCb3ggYW5kIHNoYXBlIHZhbHVlcyBtYXkgYmUgY29tYmluZWQ6IGNsaXAtcGF0aDogcGFkZGluZy1ib3ggY2lyY2xlKDUwcHggYXQgMCAxMDBweCk7XG4gICAgICAgIC8vICAgICAgTk9URTogdGhlIGJveCB2YWx1ZXMgYXJlIE5PVCBpbnR1aXRpdmUsIHNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TaGFwZXMvRnJvbV9ib3hfdmFsdWVzI21hcmdpbi1ib3hcbiAgICAgICAgLy8gICAgICBcbiAgICAgICAgLy8gICAgICBTbyB0aGUga2V5IHF1ZXN0aW9uIGlzIHdoYXQgYW1vdW50IG9mIGVmZm9ydCBkbyB3ZSB3YW50IHRvIGludmVzdCBpbnRvIGNsaXAtcGF0aFxuICAgICAgICAvLyBcblxuICAgICAgICAvLyBKQ0ggZG9uJ3QgZG8gY2xpcC1wYXRoIG5vdyBcbiAgICAgICAgbGV0IGNsaXBQYXRoSGVpZ2h0ID0gLTE7XG4gICAgICAgIC8vIGlmIChzdHlsZS5jbGlwUGF0aCAhPT0gXCJhdXRvXCIpIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwic3R5bGUuY2xpcFBhdGggPSBcIixzdHlsZS5jbGlwUGF0aCk7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcInN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nID0gXCIsc3R5bGUuY2xpcFBhdGgudG9TdHJpbmcoKSk7XG4gICAgICAgIC8vICAgICBsZXQgY2xpcFN0cmluZyA9IHN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nKCk7XG4gICAgICAgIC8vICAgICBpZiAoY2xpcFN0cmluZy5pbmNsdWRlcyhcImluc2V0XCIpKSB7XG4gICAgICAgIC8vICAgICAgICAgdmFyIHJlQnJhY2tldHMgPSAvXFwoKC4qKVxcKS9nO1xuICAgICAgICAvLyAgICAgICB2YXIgbGlzdE9mVGV4dCA9IFtdO1xuICAgICAgICAvLyAgICAgICB2YXIgZm91bmQgPSByZUJyYWNrZXRzLmV4ZWMoY2xpcFN0cmluZyk7XG4gICAgICAgIC8vICAgICAgIHZhciBmb3VuZEFyciA9IGZvdW5kWzFdLnNwbGl0KCcgJyk7XG4gICAgICAgIC8vICAgICAgIGZvciAobGV0IGk9MDsgaTxmb3VuZEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFwiZm91bmRBcnJbXCIsaSxcIl0gPSBcIixmb3VuZEFycltpXSk7XG4gICAgICAgIC8vICAgICAgICAgbGlzdE9mVGV4dC5wdXNoKGZvdW5kQXJyW2ldKTtcbiAgICAgICAgLy8gICAgICAgfTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwibGlzdE9mVGV4dCA9IFwiLGxpc3RPZlRleHQpO1xuICAgICAgICAvLyBjbGlwUGF0aEhlaWdodCA9IHBhcnNlSW50KGxpc3RPZlRleHRbMF0ucmVwbGFjZSgvcHgvZywgJycpKSAtIHBhcnNlSW50KGxpc3RPZlRleHRbMl0ucmVwbGFjZSgvcHgvZywgJycpKTtcbiAgICAgICAgLy8gY2xpcFBhdGhIZWlnaHQgPSBNYXRoLmFicyhjbGlwSGVpZ2h0KTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNsaXBQYXRoSGVpZ2h0ID0gXCIsIGNsaXBQYXRoSGVpZ2h0KTtcblxuICAgICAgICAvLyBpZiAoc3R5bGUucG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiAmJiBzdHlsZS5jbGlwID09PSBcInJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KVwiICYmIHN0eWxlLm92ZXJmbG93ICE9PSBcInZpc2libGVcIikge1xuICAgICAgICAvLyBKQ0ggYXJiaXRyYXJpbHkgdXNlIGxlc3MgdGhhdCA3cHggZm9yIGNsaXBIZWlnaHRcbiAgICAgICAgaWYgKHN0eWxlLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIgJiYgY2xpcEhlaWdodCA8IDcgJiYgY2xpcEhlaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRE8gTk9UIENIRUNLIENPTE9SIENPTlRSQVNUIGJlY2F1c2UgdG9vIHNtYWxsXCIpO1xuICAgICAgICAgICAgLy8gQ29ybmVyIGNhc2Ugd2hlcmUgaXRlbSBpcyBoaWRkZW4gKGFjY2Vzc2liaWxpdHkgaGlkaW5nIHRlY2huaXF1ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBGaXJzdCBkZXRlcm1pbmUgdGhlIGNvbG9yIGNvbnRyYXN0IHJhdGlvXG4gICAgICAgIGxldCBjb2xvckNvbWJvID0gQ29sb3JVdGlsLkNvbG9yQ29tYm8oZWxlbSk7XG4gICAgICAgIGlmIChjb2xvckNvbWJvID09PSBudWxsKSB7XG4gICAgICAgICAgICAvL3NvbWUgZXhjZXB0aW9uIG9jY3VycmVkLCBvciBub3QgYWJsZSB0byBnZXQgY29sb3IgY29tYm8gZm9yIHNvbWUgcmVhc29uXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInVuYWJsZSB0byBnZXQgY29sb3IgY29tYm8gZm9yIGVsZW1lbnQ6IFwiICsgZWxlbS5ub2RlTmFtZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZnID0gY29sb3JDb21iby5mZztcbiAgICAgICAgbGV0IGJnID0gY29sb3JDb21iby5iZztcbiAgICAgICAgbGV0IHJhdGlvID0gZmcuY29udHJhc3RSYXRpbyhiZyk7XG4gICAgICAgIGxldCB3ZWlnaHQgPSBDU1NVdGlsLmdldFdlaWdodE51bWJlcihzdHlsZS5mb250V2VpZ2h0KTtcbiAgICAgICAgbGV0IHNpemUgPSBDU1NVdGlsLmdldEZvbnRJblBpeGVscyhzdHlsZS5mb250U2l6ZSwgZWxlbSk7XG4gICAgICAgIGxldCBpc0xhcmdlU2NhbGUgPSBzaXplID49IDI0IHx8IHNpemUgPj0gMTguNiAmJiB3ZWlnaHQgPj0gNzAwO1xuICAgICAgICBcbiAgICAgICAgaWYgKENTU1V0aWwuY29udGFpbnNDS0ooY2hpbGRTdHIpKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC1ydWxlcy5naXRodWIuaW8vcHVsbC8yMTIxL2ZpbGVzXG4gICAgICAgICAgICAvLyBmb3IgQ0pLLCAyMiBwdCBvciAxOCBwdCB3aXRoIGZvbnQtd2VpZ2h0ID49IDcwMCwgMXB0ID0gMS4zMzMgcHhcbiAgICAgICAgICAgIGlzTGFyZ2VTY2FsZSA9IHNpemUgPj0gMjkuMyB8fCBzaXplID49IDI0ICYmIHdlaWdodCA+PSA3MDA7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSByYXRpbyA+PSA0LjUgfHwgKHJhdGlvID49IDMgJiYgaXNMYXJnZVNjYWxlKTtcbiAgICAgICAgbGV0IGhhc0JhY2tncm91bmQgPSBjb2xvckNvbWJvLmhhc0JHSW1hZ2UgfHwgY29sb3JDb21iby5oYXNHcmFkaWVudDtcbiAgICAgICAgbGV0IHRleHRTaGFkb3cgPSBjb2xvckNvbWJvLnRleHRTaGFkb3c7XG4gICAgICAgIGxldCBpc0Rpc2FibGVkID0gQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChlbGVtKTtcbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBsZXQgY29udHJvbCA9IENvbW1vblV0aWwuZ2V0Q29udHJvbE9mTGFiZWwoZWxlbSk7XG4gICAgICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQgPSBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKGNvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoIWlzRGlzYWJsZWQgJiYgbm9kZU5hbWUgPT09ICdsYWJlbCcgJiYgQ29tbW9uVXRpbC5pc0Rpc2FibGVkQnlGaXJzdENoaWxkRm9ybUVsZW1lbnQoZWxlbSkpIHtcbiAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIENvbW1vblV0aWwuaXNEaXNhYmxlZEJ5UmVmZXJyaW5nRWxlbWVudChlbGVtKSkge1xuICAgICAgICAgICAgaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKipzZXRDYWNoZShydWxlQ29udGV4dCwgXCJFWFRfQ29sb3JfQ29udHJhc3RfV0NBRzJBQVwiLCB7XG4gICAgICAgICAgICBcInJhdGlvXCI6IHJhdGlvLFxuICAgICAgICAgICAgXCJpc0xhcmdlU2NhbGVcIjogaXNMYXJnZVNjYWxlLFxuICAgICAgICAgICAgXCJ3ZWlnaHRcIjogd2VpZ2h0LFxuICAgICAgICAgICAgXCJzaXplXCI6IHNpemUsXG4gICAgICAgICAgICBcImhhc0JhY2tncm91bmRcIjogaGFzQmFja2dyb3VuZCxcbiAgICAgICAgICAgIFwiaXNEaXNhYmxlZFwiOiBpc0Rpc2FibGVkXG4gICAgICAgIH0pOyovXG4gICAgICAgIFxuICAgICAgICAvLyBJZiBlbGVtZW50IG9yIHBhcmVudCBpcyBkaXNhYmxlZCwgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IChidXQgbWF5IGJlIDM6MSBpbiBmdXR1cmUpXG4gICAgICAgIGlmICghcGFzc2VkICYmIGlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGlmIChoYXNCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBwb3RlbnRpYWwgc2luY2UgYSB0ZXh0IG9uIGFuIGltYWdlIG9yIGdyYWRpZW50IG1heSBiZSBzdGlsbCB2aWV3YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSB0ZXh0IGxvY2F0aW9uIG9uIHRoZSBncmFkaWVudCBvciBpbWFnZVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2dyYXBoaWNfYmFja2dyb3VuZFwiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0XSk7O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBwb3RlbnRpYWwgc2luY2UgYSB0ZXh0IHdpdGggc2hhZG93IG1heSBiZSBzdGlsbCB2aWV3YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSBzaGFkb3cgZWZmZmVjdHNcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF90ZXh0X3NoYWRvd1wiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0XSk7O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZmcudG9IZXgoKSA9PT0gYmcudG9IZXgoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9zYW1lX2NvbG9yXCIsIFtyYXRpby50b0ZpeGVkKDIpLCBzaXplLCB3ZWlnaHQsIGZnLnRvSGV4KCksIGJnLnRvSGV4KCksIGNvbG9yQ29tYm8uaGFzQkdJbWFnZSwgY29sb3JDb21iby5oYXNHcmFkaWVudF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfY29udHJhc3RcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3F1b3RlZF9jb3JyZWN0bHk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5XCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRleHRfcXVvdGVkX2NvcnJlY3RseS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3F1b3RlZF9jb3JyZWN0bHkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIklmIHRoZSBmb2xsb3dpbmcgdGV4dCBpcyBhIHF1b3RhdGlvbiwgbWFyayBpdCBhcyBhIDxxPiBvciA8YmxvY2txdW90ZT4gZWxlbWVudDogezB9XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUXVvdGF0aW9ucyBzaG91bGQgYmUgbWFya2VkIHdpdGggPHE+IG9yIDxibG9ja3F1b3RlPiBlbGVtZW50c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBpZ25vcmUgdGhlIGNoZWNrIGlmIHRoZSBub2RlIGlzIGhpZGRlblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIGJvZHlcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIG1pbldvcmRzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDMsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluV29yZHMgPSB2YWxpZGF0ZVBhcmFtcy5taW5Xb3Jkcy52YWx1ZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0ID0gbnVsbDtcbiAgICAgICAgLy8gaWdub3JlIHRoZSBjaGVjayBmb3IgdGhlIHRleHQgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50c1xuICAgICAgICBjb25zdCBpZ25vcmVkID0gW1wiYmxvY2txdW90ZVwiLCBcInFcIiwgXCJzY3JpcHRcIiwgXCJzdHlsZVwiLCBcInByZVwiLCBcImNvZGVcIiwgXCJydWJ5XCIsIFwic2FtcFwiXTtcbiAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gQ29tcGx5IHRvIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHdpbGwgYmUgZG9uZSBieSBkZWZhdWx0IGFzIHRoaXMgcnVsZSB0cmlnZ2VycyBvbiBlYWNoIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIGFuZCBmb3IgZWFjaCBlbGVtZW50IGl0IG9ubHkgY2hlY2tzIHRoYXQgc2luZ2xlIGVsZW1lbnRzIHRleHQgbm9kZXMgYW5kIG5vdGhpbmcgZWxzZS4gU28gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmVcbiAgICAgICAgICAgIC8vIGNvdmVyZWQgb24gdGhlaXIgb3duLiBDdXJyZW50bHkgZm9yIHRoaXMgcnVsZSBieSBkZWZhdWx0IENoZWNrIEhpZGRlbiBDb250ZW50IHdpbGwgd29yaywgYXMgd2UgYXJlIGRvaW5nXG4gICAgICAgICAgICAvLyBhIG5vZGUgd2FsayBvbmx5IG9uIHNpYmxpbmdzIHNvIGl0IHdvdWxkIG5vdCBnZXQgdGV4dCBub2RlcyBmcm9tIG90aGVyIHNpYmxpbmdzIGF0IGFsbC5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIGluIHRoZSBmdXR1cmUgc29tZXRoaW5nIGNobmdlcywganVzdCBuZWVkIHRvIGFkZCAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSB0byB0aGUgYmVsb3dcbiAgICAgICAgICAgIC8vIGlmLlxuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIC8vIERvIHRoZSByZWdleCB0ZXN0cyBmaXJzdCAtIHNob3VsZCBiZSBmYXN0XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYXBvc3Ryb3BoZSdzXG4gICAgICAgICAgICAgICAgdHh0VmFsID0gdHh0VmFsLnJlcGxhY2UoLyhcXFMpJyhcXFMpL2csIFwiJDEkMlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgZGJsUXVvdGVzID0gdHh0VmFsLm1hdGNoKC8oXCJbXlwiXStcIikvZyk7XG4gICAgICAgICAgICAgICAgbGV0IHNuZ2xRdW90ZXMgPSB0eHRWYWwubWF0Y2goLygnW14nXSsnKS9nKTtcbiAgICAgICAgICAgICAgICAvLyBXYWxrIHRoZSBwYXJlbnRzIC0gb25seSBjb250aW51ZSB0ZXN0aW5nIGlmIHdlIGZvdW5kIGEgcXVvdGUsIGJ1dFxuICAgICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBhbHJlYWR5IG1hcmtlZCB1cFxuICAgICAgICAgICAgICAgIC8vIEFsc28gc2tpcCBpZiB3ZSdyZSBpbiBhIHNjcmlwdCAtIHRoZXJlJ3MgbG90cyBvZiBxdW90ZXMgdXNlZCBpbiBzY3JpcHRzXG4gICAgICAgICAgICAgICAgaWYgKChkYmxRdW90ZXMgIT09IG51bGwgfHwgc25nbFF1b3RlcyAhPT0gbnVsbCkgJiZcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcih3YWxrTm9kZSwgaWdub3JlZCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRibFF1b3RlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBkYmxRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC53b3JkQ291bnQoZGJsUXVvdGVzW2ldKSA8IG1pbldvcmRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzbmdsUXVvdGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHNuZ2xRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC53b3JkQ291bnQoc25nbFF1b3Rlc1tpXSkgPCBtaW5Xb3JkcztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgbGluZWZlZWQgaW5zaWRlIHRoZSBxdW90ZVxuICAgICAgICAgICAgICAgICAgICAvLyB2aW9sYXRlZHRleHQgPSB0eHRWYWwucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIixcImdcIiksXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYmxRdW90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHNuZ2xRdW90ZXMuam9pbihcIiwgXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFxyP1xcXFxufFxcXFxyXCIsIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc25nbFF1b3RlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmpvaW4oXCIsIFwiKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcXFxccj9cXFxcbnxcXFxcclwiLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmNvbmNhdChzbmdsUXVvdGVzKS5qb2luKFwiLCBcIikucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIiwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSB2aW9sYXRlZHRleHQgaXMgbG9uZ2VyIHRoYW4gNjkgY2hhcnMsIG9ubHkga2VlcCB0aGUgZmlyc3QgMzIsIHRoZSBcIiAuLi4gXCIsIGFuZCB0aGUgbGFzdCAzMiBjaGFycyBcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgdmlvbGF0ZWR0ZXh0Lmxlbmd0aCAmJiB2aW9sYXRlZHRleHQubGVuZ3RoID4gNjkpIHtcbiAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHZpb2xhdGVkdGV4dC5zdWJzdHJpbmcoMCwgMzIpICsgXCIgLi4uIFwiICsgdmlvbGF0ZWR0ZXh0LnN1YnN0cmluZyh2aW9sYXRlZHRleHQubGVuZ3RoIC0gMzIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFt2aW9sYXRlZHRleHRdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfc2Vuc29yeV9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9zZW5zb3J5X21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJvZHksIGRvbTpib2R5IGRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGV4dF9TZW5zb3J5UmVmZXJlbmNlXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9wb3NpdGlvbiwgcG90ZW50aWFsX290aGVyXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9wb3NpdGlvblwiOiBcInRleHRfc2Vuc29yeV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3RoZXJcIjogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIkluc3RydWN0aW9ucyBhcmUgbWVhbmluZ2Z1bCB3aXRob3V0IHJlbHlpbmcgc29sZWx5IG9uIHNoYXBlLCBzaXplLCBvciBsb2NhdGlvbiB3b3Jkc1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcG9zaXRpb25cIjogXCJDb25maXJtIHRoZSB3b3JkKHMpICd7MH0nIG9mIHRoZSB1c2VyIGluc3RydWN0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBsb2dpY2FsIHJhdGhlciB0aGFuIHZpc3VhbCBwb3NpdGlvblwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3RoZXJcIjogXCJDb25maXJtIHRoZSB1c2VyIGluc3RydWN0aW9uIGlzIHN0aWxsIHVuZGVyc3RhbmRhYmxlIHdpdGhvdXQgdGhlIHdvcmQocykgJ3swfSdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbnN0cnVjdGlvbnMgc2hvdWxkIGJlIG1lYW5pbmdmdWwgd2l0aG91dCByZWx5aW5nIHNvbGVseSBvbiBzaGFwZSwgc2l6ZSwgb3IgbG9jYXRpb24gd29yZHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGVOYW1lIG9mIHRoZSBjb250ZXh0IG5vZGVcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluY2x1ZGVzKG5vZGVOYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIHNjcmlwdCwgbGluaywgbGFiZWwgYW5kIHRoZWlyIGNoaWxkIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzY3JpcHRcIiwgXCJhXCIsICdsYWJlbCddKSAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIFxuICAgICAgICAvLyBpZ25vcmUgdGV4dCBvbiBsYW5kbWFyayByb2xlcywgYnV0IG5vdCBvbiB0aGVpciBjaGlsZHJlbiAoZS5nLiwgc2VjdGlvbiwgbWFpbilcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICBsZXQgbG1Sb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzV2l0aFR5cGVzKHJ1bGVDb250ZXh0LCBbXCJsYW5kbWFya1wiXSk7XG4gICAgICAgICAgICBpZiAobG1Sb2xlcyAmJiBsbVJvbGVzLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9ICAgIFxuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGFsbCB3aWRnZXRzIGFuZCBoZWFkaW5ncywgYW5kIHRoZWlyIGNoaWxkcmVuLCBhbmQgY2VydGFpbiBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNXaXRoVHlwZXMocnVsZUNvbnRleHQsIFtcIndpZGdldFwiLCBcImhlYWRpbmdcIl0pO1xuICAgICAgICAvLyBhZGQgc29tZSBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFtcImNhcHRpb25cIiwgXCJjZWxsXCIsIFwiY29kZVwiLCBcImNvbHVtbmhlYWRlclwiLCBcImRlZmluaXRpb25cIiwgXCJmaWd1cmVcIiwgXCJsaXN0XCIsIFwibGlzdGl0ZW1cIiwgXCJtYXRoXCIsIFwibWV0ZXJcIiwgXCJyb3dcIiwgXCJyb3dncm91cFwiLCBcInJvd2hlYWRlclwiLCBcInRlcm1cIl0sIHJvbGVzKTtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGVzKHJ1bGVDb250ZXh0LCByb2xlcykgIT09IG51bGwpIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHZpb2xhdGVkUG9zaXRpb25UZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IHZpb2xhdGVkT3RoZXJUZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdHh0VmFsID0gXCJcIjsgXG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFxuICAgICAgICAgICAgLy8gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmUgY292ZXJlZCBvbiB0aGVpciBvd24uIFxuICAgICAgICAgICAgLy8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChzcGFjZSwgbmV3bGluZSwgdGFiKSBiZXR3ZWVuIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIGEgbm9kZSB0b28uXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT09IFwiI3RleHRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eHQgPSB3YWxrTm9kZS5ub2RlVmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmICh0eHQubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgdHh0VmFsICs9ICh0eHRWYWwubGVuZ3RoID4gMCA/IFwiLCBcIiArIHR4dCA6IHR4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAodHh0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAvLyBmaXJzdCB0byByZW1vdmUgZWFjaCBleGVtcHQgd29yZCB3aXRoIGEgc2luZ2xlIHNwYWNlIGluIHRoZSB0ZXh0XG4gICAgICAgICAgICBsZXQgZXhlbXB0UmVnZXggPSBnZXRSZWdleChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImV4ZW1wdFRleHRcIik7XG4gICAgICAgICAgICB0eHRWYWwgPSB0eHRWYWwucmVwbGFjZShleGVtcHRSZWdleCwgXCIgXCIpO1xuXG4gICAgICAgICAgICB2aW9sYXRlZFBvc2l0aW9uVGV4dCA9IGdldFZpb2xhdGVkVGV4dChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInBvc2l0aW9uVGV4dFwiLCB0eHRWYWwpO1xuICAgICAgICAgICAgdmlvbGF0ZWRPdGhlclRleHQgPSBnZXRWaW9sYXRlZFRleHQocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJvdGhlclRleHRcIiwgdHh0VmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXQgPSBbXTsgXG4gICAgICAgIGlmICh2aW9sYXRlZFBvc2l0aW9uVGV4dCkgcmV0LnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9wb3NpdGlvblwiLCBbdmlvbGF0ZWRQb3NpdGlvblRleHRdKSk7XG4gICAgICAgIGlmICh2aW9sYXRlZE90aGVyVGV4dCkgcmV0LnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdGhlclwiLCBbdmlvbGF0ZWRPdGhlclRleHRdKSk7XG4gICAgICAgIHJldHVybiByZXQubGVuZ3RoID09IDAgPyBudWxsIDogcmV0O1xuICAgIH1cbn1cblxuY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgcG9zaXRpb25UZXh0OiB7XG4gICAgICAgIHZhbHVlOiBbXCJ0b3AtbGVmdFwiLCBcInRvcC1yaWdodFwiLCBcImJvdHRvbS1yaWdodFwiLCBcImJvdHRvbS1sZWZ0XCIsXG4gICAgICAgICAgICBcInRvcC10by1ib3R0b21cIiwgXCJsZWZ0LXRvLXJpZ2h0XCIsIFwiYm90dG9tLXRvLXRvcFwiLCBcInJpZ2h0LXRvLWxlZnRcIixcbiAgICAgICAgICAgIFwicmlnaHRcIiwgXCJsZWZ0XCIsIFwiYWJvdmVcIiwgXCJiZWxvd1wiLCBcInRvcFwiLCBcImJvdHRvbVwiLFxuICAgICAgICAgICAgXCJ1cHBlclwiLCBcImxvd2VyXCIsIFwiY29ybmVyXCIsIFwiYmVzaWRlXCJcbiAgICAgICAgXSxcbiAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgfSxcbiAgICBvdGhlclRleHQ6IHtcbiAgICAgICAgdmFsdWU6IFtcInJvdW5kXCIsIFwic3F1YXJlXCIsIFwic2hhcGVcIiwgXCJyZWN0YW5nbGVcIiwgXCJ0cmlhbmdsZVwiLFxuICAgICAgICAgICAgXCJzaXplXCIsIFwibGFyZ2VcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImJpZ1wiLCBcImh1Z2VcIiwgXCJ0aW55XCIsIFwiZXh0cmFcIixcbiAgICAgICAgICAgIFwibGFyZ2VyXCIsIFwic21hbGxlclwiLCBcImJpZ2dlclwiLCBcImxpdHRsZVwiLCBcImxhcmdlc3RcIiwgXCJzbWFsbGVzdFwiLCBcImJpZ2dlc3RcIlxuICAgICAgICBdLFxuICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICB9LFxuICAgIGV4ZW1wdFRleHQ6IHtcbiAgICAgICAgdmFsdWU6IFtcInJpZ2h0LWNsaWNrXCIsIFwibGVmdC1jbGlja1wiLCBcInJpZ2h0LWNsaWNraW5nXCIsIFwicmlnaHQtY2xpY2tzXCIsIFxuICAgICAgICAgICBcImxlZnQtY2xpY2tpbmdcIiwgXCJsZWZ0LWNsaWNrc1wiLCBcInNxdWFyZSByb290XCIsIFwicmlnaHQgbm93XCIsIFwib2ZmIHRoZSB0b3BcIiAgIC8vYXBwZW5kIGFzIG5lZWRlZFxuICAgICAgICBdLFxuICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICB9ICAgIFxufVxuXG5mdW5jdGlvbiBnZXRSZWdleChkb2MsIHR5cGUpIHtcbiAgICBpZiAoIXZhbGlkYXRlUGFyYW1zW3R5cGVdKSByZXR1cm4gXCJcIjtcbiAgICBsZXQgc2Vuc29yeVJlZ2V4ID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgdHlwZSArIFwiX3NlbnNvcnlfbWlzdXNlXCIsIG51bGwpO1xuICAgIGlmIChzZW5zb3J5UmVnZXggPT0gbnVsbCkge1xuICAgICAgICBsZXQgc2Vuc29yeVRleHQgPSB2YWxpZGF0ZVBhcmFtc1t0eXBlXS52YWx1ZTtcbiAgICAgICAgbGV0IHJlZ2V4U3RyID0gXCIoXFxzXFxzK3xcIiArIHNlbnNvcnlUZXh0WzBdO1xuICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHNlbnNvcnlUZXh0Lmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBsZXQgd29yZHMgPSBzZW5zb3J5VGV4dFtqXS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgcmVnZXhTdHIgKz0gXCJ8XCIgKyB3b3Jkc1swXTtcbiAgICAgICAgICAgIGlmICh3b3Jkcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDE7IGMgPCB3b3Jkcy5sZW5ndGg7ICsrYylcbiAgICAgICAgICAgICAgICAgICAgcmVnZXhTdHIgKz0gXCIgK1wiICsgd29yZHNbY107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZWdleFN0ciArPSBcIilcXFxcV1wiO1xuICAgICAgICByZWdleFN0ciArPSBcIilcIjtcbiAgICAgICAgc2Vuc29yeVJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFN0ciwgXCJnaVwiKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgdHlwZSArXCJfc2Vuc29yeV9taXN1c2VcIiwgc2Vuc29yeVJlZ2V4KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbnNvcnlSZWdleDtcbn1cblxuZnVuY3Rpb24gZ2V0VmlvbGF0ZWRUZXh0KGRvYywgdHlwZSwgdHh0VmFsKSB7XG4gICAgaWYgKCF0eHRWYWwpIHJldHVybiBcIlwiO1xuICAgIGxldCBzZW5zb3J5VGV4dEFyciA9IHZhbGlkYXRlUGFyYW1zW3R5cGVdLnZhbHVlXG4gICAgbGV0IGhhc2ggPSB7fSwgcmVzdWx0ID0gW107XG4gICAgXG4gICAgLy8gc3BsaXQgdGhlIHN0cmluZyBpbnRvIHdvcmRzXG4gICAgbGV0IGNvdW50cyA9IHR4dFZhbC5zcGxpdCgvXFxzKy8pLnJlZHVjZShmdW5jdGlvbiAobWFwLCB3b3JkKSB7XG4gICAgICAgIGxldCB3b3JkV29UcmFpbGluZ1B1bmMgPSB3b3JkLnJlcGxhY2UoL1suPyE6OygpJ1wiLGBcXF1dKyQvLCBcIlwiKTtcbiAgICAgICAgbGV0IGxjV29yZFdvUHVuYyA9IHdvcmQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLj8hOjsoKSdcIixgXFxdXS9nLCBcIlwiKTtcblxuICAgICAgICBmb3IgKGxldCBjb3VudGVyID0gMDsgY291bnRlciA8IHNlbnNvcnlUZXh0QXJyLmxlbmd0aDsgY291bnRlcisrKSB7XG4gICAgICAgICAgICBsZXQgYSA9IGxjV29yZFdvUHVuYy5pbmRleE9mKHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHNlbnNvcnlXb3JkTGVuID0gc2Vuc29yeVRleHRBcnJbY291bnRlcl0ubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9IGxjV29yZFdvUHVuYy5jaGFyQXQoc2Vuc29yeVdvcmRMZW4gKyBhKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHdvcmQgZG9lcyBub3QgY29udGFpbnMgc3Vic3RyaW5nIG9mIHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdXG4gICAgICAgICAgICAvLyBwcm9jZWVkIHRvIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIGZvciBuZXh0IHNlbnNvcnlUZXh0LlxuICAgICAgICAgICAgaWYgKGEgPCAwKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgICAgIC8vY2hlY2sgdGhlIGZvbGxvd2luZyBhbmQgcHJvY2VlZGluZyBwdW5jdHVhdGlvbnNcbiAgICAgICAgICAgIC8vbGV0IGlzUHVuY2ZvbGxvd2luZyA9ICgoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXC0nKSB8fFxuICAgICAgICAgICAgbGV0IGlzUHVuY2ZvbGxvd2luZyA9IChcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXC4nKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcPycpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcIScpIHx8XG4gICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw7JykgfHxcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCknKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcJycpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXCInKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJy5cXGAnKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXF0nKSk7XG5cbiAgICAgICAgICAgIGxldCBpc1B1bmNQcmVjZWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChhID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID0gbGNXb3JkV29QdW5jLmNoYXJBdChhIC0gMSk7XG4gICAgICAgICAgICAgICAgaXNQdW5jUHJlY2VkaW5nID0gKChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXC0nKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwuJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcPycpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCEnKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcOycpIHx8XG4gICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwpJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcJycpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXFwiJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICcuXFxgJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFxdJykpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoKGxjV29yZFdvUHVuYy5sZW5ndGggPT0gc2Vuc29yeVdvcmRMZW4pIHx8IChpc1B1bmNmb2xsb3dpbmcgPT0gdHJ1ZSkgfHwgKGlzUHVuY1ByZWNlZGluZyA9PSB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc2guaGFzT3duUHJvcGVydHkod29yZFdvVHJhaWxpbmdQdW5jKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNoW3dvcmRXb1RyYWlsaW5nUHVuY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh3b3JkV29UcmFpbGluZ1B1bmMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyID0gc2Vuc29yeVRleHRBcnIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdID0gKG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdIHx8IDApICsgMTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCIsIFwiKTtcbn0gIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsLCBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5cbi8vIE1vZHVsZS1sZXZlbCBjb25zdGFudHNcbmNvbnN0IFNUWUxFX1ZBTFVFX1JFR0VYID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbmNvbnN0IE1JTl9XT1JEX1NQQUNJTkdfUkFUSU8gPSAwLjE2O1xuY29uc3QgTUlOX0xFVFRFUl9TUEFDSU5HX1JBVElPID0gMC4xMjtcbmNvbnN0IE1JTl9MSU5FX0hFSUdIVF9SQVRJTyA9IDEuNTtcbmNvbnN0IElNUE9SVEFOVF9TVUZGSVggPSBcIiFpbXBvcnRhbnRcIjtcbmNvbnN0IElNUE9SVEFOVF9TVUZGSVhfTEVOR1RIID0gSU1QT1JUQU5UX1NVRkZJWC5sZW5ndGggKyAxOyAvLyArMSBmb3IgdGhlIHNwYWNlIGJlZm9yZSAhaW1wb3J0YW50XG5cbi8qKlxuICogUmVzb2x2ZXMgaW5oZXJpdGVkIG9yIHVuc2V0IHN0eWxlIHZhbHVlcyBieSB0cmF2ZXJzaW5nIHVwIHRoZSBET00gdHJlZVxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byByZXNvbHZlIHRoZSBzdHlsZSBmb3JcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBDU1MgcHJvcGVydHkgbmFtZVxuICogQHBhcmFtIGN1cnJlbnRWYWx1ZSAtIFRoZSBjdXJyZW50IHN0eWxlIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgc3R5bGUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUluaGVyaXRlZFN0eWxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwcm9wZXJ0eTogc3RyaW5nLCBjdXJyZW50VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCdpbmhlcml0JykgfHwgY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3IgPSBDU1NVdGlsLmdldEFuY2VzdG9yV2l0aFN0eWxlcyhcbiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudCxcbiAgICAgICAgICAgIHtbcHJvcGVydHldOiBbXCIqXCJdfSxcbiAgICAgICAgICAgIFsnaW5oZXJpdCcsICd1bnNldCddXG4gICAgICAgICk7XG4gICAgICAgIGlmIChhbmNlc3RvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhhbmNlc3RvciwgW3Byb3BlcnR5XSlbcHJvcGVydHldO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCd1bnNldCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJpbml0aWFsXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSAhaW1wb3J0YW50IHN1ZmZpeCBmcm9tIGEgc3R5bGUgdmFsdWVcbiAqIEBwYXJhbSBzdHlsZVZhbHVlIC0gVGhlIHN0eWxlIHZhbHVlIHBvdGVudGlhbGx5IGNvbnRhaW5pbmcgIWltcG9ydGFudFxuICogQHJldHVybnMgVGhlIHN0eWxlIHZhbHVlIHdpdGhvdXQgIWltcG9ydGFudFxuICovXG5mdW5jdGlvbiByZW1vdmVJbXBvcnRhbnRTdWZmaXgoc3R5bGVWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3R5bGVWYWx1ZS5zdWJzdHJpbmcoMCwgc3R5bGVWYWx1ZS5sZW5ndGggLSBJTVBPUlRBTlRfU1VGRklYX0xFTkdUSCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3BhY2luZyBwcm9wZXJ0eSB2aW9sYXRlcyBhY2Nlc3NpYmlsaXR5IHJlcXVpcmVtZW50c1xuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgSFRNTCBlbGVtZW50IGJlaW5nIGNoZWNrZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBDU1MgcHJvcGVydHkgbmFtZSAod29yZC1zcGFjaW5nLCBsZXR0ZXItc3BhY2luZywgbGluZS1oZWlnaHQpXG4gKiBAcGFyYW0gc3R5bGVWYWx1ZSAtIFRoZSBjdXJyZW50IHN0eWxlIHZhbHVlXG4gKiBAcGFyYW0gZm9udFNpemUgLSBUaGUgY29tcHV0ZWQgZm9udCBzaXplIGluIHBpeGVsc1xuICogQHBhcmFtIG1pblJhdGlvIC0gVGhlIG1pbmltdW0gcmF0aW8gdGhyZXNob2xkXG4gKiBAcGFyYW0gYWxsb3dVbml0bGVzcyAtIFdoZXRoZXIgdW5pdGxlc3MgdmFsdWVzIGFyZSBhbGxvd2VkIChmb3IgbGluZS1oZWlnaHQpXG4gKiBAcmV0dXJucyBSdWxlUmVzdWx0IGluZGljYXRpbmcgcGFzcyBvciBmYWlsXG4gKi9cbmZ1bmN0aW9uIGNoZWNrU3BhY2luZ1Byb3BlcnR5KFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgc3R5bGVWYWx1ZTogc3RyaW5nLFxuICAgIGZvbnRTaXplOiBudW1iZXIsXG4gICAgbWluUmF0aW86IG51bWJlcixcbiAgICBhbGxvd1VuaXRsZXNzOiBib29sZWFuID0gZmFsc2Vcbik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmICFpbXBvcnRhbnQgaXMgdXNlZFxuICAgIGlmIChlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkocHJvcGVydHkpICE9PSAnaW1wb3J0YW50Jykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgIWltcG9ydGFudCBzdWZmaXhcbiAgICBjb25zdCBjbGVhblZhbHVlID0gcmVtb3ZlSW1wb3J0YW50U3VmZml4KHN0eWxlVmFsdWUpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGluaXRpYWwgb3Igbm9ybWFsIHZhbHVlcyAoY29tcHV0ZWQgc3BhY2UgaXMgMClcbiAgICBpZiAoY2xlYW5WYWx1ZSA9PT0gJ2luaXRpYWwnIHx8IGNsZWFuVmFsdWUgPT09ICdub3JtYWwnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB0aGUgbnVtZXJpYyB2YWx1ZVxuICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQoY2xlYW5WYWx1ZSk7XG4gICAgaWYgKGlzTmFOKG51bWVyaWNWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gTWF0Y2ggdmFsdWUgYW5kIHVuaXRcbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IGNsZWFuVmFsdWUudHJpbSgpLm1hdGNoKFNUWUxFX1ZBTFVFX1JFR0VYKTtcbiAgICBpZiAoIXBhcnNlZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHZhbHVlLCB1bml0XSA9IHBhcnNlZFZhbHVlO1xuXG4gICAgLy8gSGFuZGxlIHVuaXRsZXNzIHZhbHVlcyAob25seSBmb3IgbGluZS1oZWlnaHQpXG4gICAgaWYgKHVuaXQgPT09ICcnKSB7XG4gICAgICAgIGlmIChhbGxvd1VuaXRsZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSkgPCBtaW5SYXRpbyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3Igb3RoZXIgcHJvcGVydGllcywgemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgaXMgaWdub3JlZFxuICAgICAgICBpZiAocGFyc2VGbG9hdCh2YWx1ZSkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpZiBubyB1bml0IGFuZCBub24temVybyAoZXJyb3IgY2FzZSwgaW5hcHBsaWNhYmxlKVxuICAgIGlmICh1bml0ID09PSAnJyAmJiBwYXJzZUZsb2F0KHZhbHVlKSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHRvIHBpeGVscyBhbmQgY2hlY2sgcmF0aW9cbiAgICBjb25zdCBwaXhlbHMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHModW5pdCwgdmFsdWUsIGVsZW1lbnQpO1xuICAgIGlmIChwaXhlbHMgIT09IG51bGwgJiYgcGl4ZWxzIC8gZm9udFNpemUgPCBtaW5SYXRpbykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3NwYWNpbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9zcGFjaW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3dvcmRfc3BhY2luZ19zdHlsZVwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGluZV9oZWlnaHRfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiQ1NTICFpbXBvcnRhbnQgaXMgbm90IHVzZWQgaW4gaW5saW5lIHN0eWxlIHRvIGNvbnRyb2wgbGV0dGVyIG9yIHdvcmQgc3BhY2luZyBvciBsaW5lIGhlaWdodFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUgc3R5bGUgdG8gY29udHJvbCBsZXR0ZXIgb3Igd29yZCBzcGFjaW5nIG9yIGxpbmUgaGVpZ2h0XCIsXG4gICAgICAgICAgICBcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIjogXCJDU1MgIWltcG9ydGFudCBzaG91bGQgbm90IGJlIHVzZWQgaW4gaW5saW5lIOKAmGxldHRlci1zcGFjaW5n4oCZIHN0eWxlXCIsXG4gICAgICAgICAgICBcImZhaWxfd29yZF9zcGFjaW5nX3N0eWxlXCI6IFwiQ1NTICFpbXBvcnRhbnQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGlubGluZSDigJh3b3JkLXNwYWNpbmfigJkgc3R5bGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9saW5lX2hlaWdodF9zdHlsZVwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUg4oCYbGluZS1oZWlnaHTigJkgc3R5bGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgXCJudW1cIjogW1wiMS40LjEyXCJdLFxuICAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OlsnOWU0NWVjJywgJzI0YWZjMicsICc3OGZkMzInXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHRcbiAgICAgICAgbGV0IGNoaWxkU3RyID0gXCJcIjtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IHJ1bGVDb250ZXh0LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT09IDMpIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICAgICAgY2hpbGRTdHIgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgb2ZmIHNjcmVlblxuICAgICAgICBjb25zdCBtYXBwZXI6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWJvdW5kcyB8fCBib3VuZHNbJ3RvcCddIDwgMCB8fCBib3VuZHNbJ2xlZnQnXSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBub24tSFRNTCBlbGVtZW50cyAoZS5nLiwgU1ZHKVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJzdmdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9udCBzaXplIGFsd2F5cyByZXNvbHZlZCB0byAncHgnXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJykpO1xuXG4gICAgICAgIC8vIEVhcmx5IGV4aXQgb3B0aW1pemF0aW9uOiBDaGVjayBpZiBjb21wdXRlZCBzdHlsZXMgYWxyZWFkeSBwYXNzXG4gICAgICAgIC8vIElmIGFsbCB0aHJlZSBwcm9wZXJ0aWVzIGhhdmUgcGFzc2luZyB2YWx1ZXMsIHdlIGNhbiBza2lwIHRoZSBleHBlbnNpdmUgZ2V0RGVmaW5lZFN0eWxlcyBjYWxsXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkV29yZFNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3dvcmQtc3BhY2luZycpO1xuICAgICAgICBjb25zdCBjb21wdXRlZExldHRlclNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2xldHRlci1zcGFjaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkTGluZUhlaWdodCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnbGluZS1oZWlnaHQnKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBjb21wdXRlZCB2YWx1ZXMgcGFzcyB0aGUgcmVxdWlyZW1lbnRzXG4gICAgICAgIGxldCB3b3JkU3BhY2luZ1Bhc3NlcyA9IHRydWU7XG4gICAgICAgIGxldCBsZXR0ZXJTcGFjaW5nUGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGxpbmVIZWlnaHRQYXNzZXMgPSB0cnVlO1xuXG4gICAgICAgIC8vIENoZWNrIHdvcmQtc3BhY2luZyAoaWdub3JlIDBweCB3aGljaCByZXByZXNlbnRzIGRlZmF1bHQvbm9ybWFsKVxuICAgICAgICBpZiAoY29tcHV0ZWRXb3JkU3BhY2luZykge1xuICAgICAgICAgICAgY29uc3Qgd29yZFZhbHVlID0gcGFyc2VGbG9hdChjb21wdXRlZFdvcmRTcGFjaW5nKTtcbiAgICAgICAgICAgIGlmICghaXNOYU4od29yZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdvcmRQaXhlbHMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMoJ3B4Jywgd29yZFZhbHVlLnRvU3RyaW5nKCksIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAod29yZFBpeGVscyAhPT0gbnVsbCAmJiB3b3JkUGl4ZWxzIC8gZm9udFNpemUgPCBNSU5fV09SRF9TUEFDSU5HX1JBVElPKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRTcGFjaW5nUGFzc2VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGV0dGVyLXNwYWNpbmcgKGlnbm9yZSAwcHggd2hpY2ggcmVwcmVzZW50cyBkZWZhdWx0L25vcm1hbClcbiAgICAgICAgaWYgKGNvbXB1dGVkTGV0dGVyU3BhY2luZykge1xuICAgICAgICAgICAgY29uc3QgbGV0dGVyVmFsdWUgPSBwYXJzZUZsb2F0KGNvbXB1dGVkTGV0dGVyU3BhY2luZyk7XG4gICAgICAgICAgICBpZiAoIWlzTmFOKGxldHRlclZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxldHRlclBpeGVscyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscygncHgnLCBsZXR0ZXJWYWx1ZS50b1N0cmluZygpLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxldHRlclBpeGVscyAhPT0gbnVsbCAmJiBsZXR0ZXJQaXhlbHMgLyBmb250U2l6ZSA8IE1JTl9MRVRURVJfU1BBQ0lOR19SQVRJTykge1xuICAgICAgICAgICAgICAgICAgICBsZXR0ZXJTcGFjaW5nUGFzc2VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGluZS1oZWlnaHRcbiAgICAgICAgaWYgKGNvbXB1dGVkTGluZUhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgbGluZVZhbHVlID0gcGFyc2VGbG9hdChjb21wdXRlZExpbmVIZWlnaHQpO1xuICAgICAgICAgICAgaWYgKCFpc05hTihsaW5lVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gTGluZSBoZWlnaHQgY2FuIGJlIHVuaXRsZXNzIG9yIGluIHBpeGVsc1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY29tcHV0ZWRMaW5lSGVpZ2h0Lm1hdGNoKFNUWUxFX1ZBTFVFX1JFR0VYKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgWywgdmFsdWUsIHVuaXRdID0gbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bml0ID09PSAnJyB8fCB1bml0ID09PSAncHgnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXRpbyA9IHVuaXQgPT09ICcnID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiBwYXJzZUZsb2F0KHZhbHVlKSAvIGZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGlvIDwgTUlOX0xJTkVfSEVJR0hUX1JBVElPKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodFBhc3NlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgYWxsIGNvbXB1dGVkIHZhbHVlcyBwYXNzLCB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGdldERlZmluZWRTdHlsZXMgY2hlY2tcbiAgICAgICAgaWYgKHdvcmRTcGFjaW5nUGFzc2VzICYmIGxldHRlclNwYWNpbmdQYXNzZXMgJiYgbGluZUhlaWdodFBhc3Nlcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgZGVmaW5lZCBzdHlsZXMgdG8gY2hlY2sgZm9yICFpbXBvcnRhbnQgZGVjbGFyYXRpb25zXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgW1wid29yZC1zcGFjaW5nXCIsIFwibGV0dGVyLXNwYWNpbmdcIiwgXCJsaW5lLWhlaWdodFwiXSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzdHlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHRzOiBSdWxlUmVzdWx0W10gPSBbXTtcblxuICAgICAgICAvLyBDaGVjayB3b3JkLXNwYWNpbmdcbiAgICAgICAgbGV0IHdvcmRTdHlsZSA9IHN0eWxlc1snd29yZC1zcGFjaW5nJ107XG4gICAgICAgIGlmICh3b3JkU3R5bGUpIHtcbiAgICAgICAgICAgIHdvcmRTdHlsZSA9IHJlc29sdmVJbmhlcml0ZWRTdHlsZShydWxlQ29udGV4dCwgJ3dvcmQtc3BhY2luZycsIHdvcmRTdHlsZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGVja1NwYWNpbmdQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICAnd29yZC1zcGFjaW5nJyxcbiAgICAgICAgICAgICAgICB3b3JkU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX1dPUkRfU1BBQ0lOR19SQVRJT1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlRmFpbCgnZmFpbF93b3JkX3NwYWNpbmdfc3R5bGUnKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBsZXR0ZXItc3BhY2luZ1xuICAgICAgICBsZXQgbGV0dGVyU3R5bGUgPSBzdHlsZXNbJ2xldHRlci1zcGFjaW5nJ107XG4gICAgICAgIGlmIChsZXR0ZXJTdHlsZSkge1xuICAgICAgICAgICAgbGV0dGVyU3R5bGUgPSByZXNvbHZlSW5oZXJpdGVkU3R5bGUocnVsZUNvbnRleHQsICdsZXR0ZXItc3BhY2luZycsIGxldHRlclN0eWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrU3BhY2luZ1Byb3BlcnR5KFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LFxuICAgICAgICAgICAgICAgICdsZXR0ZXItc3BhY2luZycsXG4gICAgICAgICAgICAgICAgbGV0dGVyU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX0xFVFRFUl9TUEFDSU5HX1JBVElPXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVGYWlsKCdmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGluZS1oZWlnaHQgKG9ubHkgaWYgbm8gc2Nyb2xsYWJsZSBhbmNlc3RvcilcbiAgICAgICAgbGV0IGxpbmVTdHlsZSA9IHN0eWxlc1snbGluZS1oZWlnaHQnXTtcbiAgICAgICAgY29uc3Qgb3ZlcmZsb3dTdHlsZXMgPSB7XG4gICAgICAgICAgICBcIm92ZXJmbG93XCI6IFsnYXV0bycsICdzY3JvbGwnXSxcbiAgICAgICAgICAgIFwib3ZlcmZsb3cteFwiOiBbJ2F1dG8nLCAnc2Nyb2xsJ10sXG4gICAgICAgICAgICBcIm92ZXJmbG93LXlcIjogWydhdXRvJywgJ3Njcm9sbCddXG4gICAgICAgIH07XG4gICAgICAgIGlmIChsaW5lU3R5bGUgJiYgQ1NTVXRpbC5nZXRBbmNlc3RvcldpdGhTdHlsZXMocnVsZUNvbnRleHQsIG92ZXJmbG93U3R5bGVzKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGluZVN0eWxlID0gcmVzb2x2ZUluaGVyaXRlZFN0eWxlKHJ1bGVDb250ZXh0LCAnbGluZS1oZWlnaHQnLCBsaW5lU3R5bGUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hlY2tTcGFjaW5nUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgJ2xpbmUtaGVpZ2h0JyxcbiAgICAgICAgICAgICAgICBsaW5lU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX0xJTkVfSEVJR0hUX1JBVElPLFxuICAgICAgICAgICAgICAgIHRydWUgLy8gQWxsb3cgdW5pdGxlc3MgdmFsdWVzIGZvciBsaW5lLWhlaWdodFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlRmFpbCgnZmFpbF9saW5lX2hlaWdodF9zdHlsZScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA+IDAgPyByZXN1bHRzIDogbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfd2hpdGVzcGFjZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInRleHRfd2hpdGVzcGFjZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0XCI6IFwidGV4dF93aGl0ZXNwYWNlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3RleHRcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjcmVhdGUgc3BhY2UgYmV0d2VlbiB0aGUgbGV0dGVycyBvZiBhIHdvcmRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjb250cm9sIHNwYWNpbmcgd2l0aGluIGEgd29yZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0XG4gICAgICAgIGxldCBjaGVja0FuY2VzdG9yID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiLCBcInNjcmlwdFwiLCBcImNvZGVcIl0pO1xuICAgICAgICBpZiAoY2hlY2tBbmNlc3RvciA9PSBudWxsIHx8IGNoZWNrQW5jZXN0b3Iubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcImJvZHlcIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICEoLyhefFxccylbYS16QS1aXSBbYS16QS1aXSBbYS16QS1aXSgkfFxccykvLnRlc3QodHh0VmFsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdGV4dFwiKTtcblxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgd2lkZ2V0X3RhYmJhYmxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmxpbmssYXJpYTpzcGluYnV0dG9uLGFyaWE6dGFibGlzdCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnUsYXJpYTpyYWRpb2dyb3VwLGFyaWE6dHJlZSxhcmlhOm1lbnViYXIsIGFyaWE6Z3JpZCwgYXJpYTp0cmVlZ3JpZCwgYXJpYTpjaGVja2JveCxhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b24sYXJpYTp0ZXh0Ym94LGFyaWE6c2Nyb2xsYmFyLGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSUJNQV9Gb2N1c19UYWJiYWJsZVwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJmYWlsX25vX3RhYmJhYmxlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJDb21wb25lbnQgd2l0aCBcXFwiezB9XFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSB0YWJiYWJsZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tcG9uZW50IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdGFiYmFibGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGEgcHJlc2VudGF0aW9uYWwgY2hpbGQgb2YgYW4gZWxlbWVudFxuICAgICAgICBpZiAoQXJpYVV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAvLyBDb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0IHJvbGVzLiBUaGV5IGFjdCBhcyBjb250YWluZXJzIHRoYXQgbWFuYWdlIG90aGVyLCBjb250YWluZWQgd2lkZ2V0cy5cbiAgICAgICAgbGV0IHJvbGVDb250YWluZXJzID0gW1wiY29tYm9ib3hcIiwgXCJncmlkXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0cmVlXCIsIFwidHJlZWdyaWRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlQ29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHJvbGUsIHRydWUpICE9IG51bGwpIFxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBkZXNjZW5kYW50IG9mIGEgY29tcG9zaXRlIHdpZGdldCBhbHJlYWR5IGV4YW1pbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm9kZSBoYXMgY2hpbGRyZW4sIGxvb2sgZm9yIHRhYiBzdG9wcyBpbiB0aGUgY2hpbGRyZW5cbiAgICAgICAgLy8gc2tpcCB0aGUgY291bnQgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoY291bnQgPCAxICYmICFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDEgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50ID49IDE7XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlUG90ZW50aWFsKFwiZmFpbF9ub190YWJiYWJsZVwiLCBbcm9sZV0pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHdpZGdldF90YWJiYWJsZV9zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpsaW5rLGFyaWE6bWVudWl0ZW0sYXJpYTpzcGluYnV0dG9uLGFyaWE6dGFibGlzdCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnUsYXJpYTpyYWRpb2dyb3VwLGFyaWE6dHJlZSxhcmlhOmNoZWNrYm94LGFyaWE6b3B0aW9uLGFyaWE6cmFkaW8sYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6dGV4dGJveCxhcmlhOmNvbHVtbmhlYWRlcixhcmlhOnJvd2hlYWRlcixhcmlhOnNsaWRlcixhcmlhOnRhYlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSUJNQV9Gb2N1c19NdWx0aVRhYlwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiOiBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ3aWRnZXRfdGFiYmFibGVfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJDb21wb25lbnRzIHdpdGggYSB3aWRnZXQgcm9sZSBzaG91bGQgaGF2ZSBubyBtb3JlIHRoYW4gb25lIHRhYmJhYmxlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwiQ29tcG9uZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBoYXMgbW9yZSB0aGFuIG9uZSB0YWJiYWJsZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tcG9uZW50cyB3aXRoIGEgd2lkZ2V0IHJvbGUgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiBvbmUgdGFiYmFibGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIiwgXCIyLjQuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKEFyaWFVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICArK2NvdW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIC8vc2tpcCB0aGUgY291bnQgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBsZXQgbmFtZSA9IFtdO1xuICAgICAgICBpZiAoY291bnQgPCAyICYmICFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDIgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmFkaW8gaW5wdXRzIHdpdGggdGhlIHNhbWUgbmFtZSBuYXRpdmVseSBhcmUgb25seSBvbmUgdGFiIHN0b3BcbiAgICAgICAgICAgICAgICAgICAgLyoqaWYgKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAobncubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSAncmFkaW8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VyTmFtZSA9IChudy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5pbmNsdWRlcyhjdXJOYW1lKSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5wdXNoKGN1ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9Ki9cbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50IDwgMjtcbiAgICAgICAgaWYgKCFwYXNzZWQpXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLCBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiKTtcbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbXVsdGlwbGVfdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIFRoaXMgZmlsZSBjb21lcyBmcm9tIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hY3QtcnVsZXMvYWN0LXRvb2xzL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG5pbXBvcnQgKiBhcyBTQ1VSTHMgZnJvbSBcIi4vc2MtdXJscy5qc29uXCJcbmltcG9ydCB7IEd1aWRlbGluZSwgZUd1aWRlbGluZUNhdGVnb3J5LCBlR3VpZGVsaW5lVHlwZSB9IGZyb20gXCIuL2FwaS9JR3VpZGVsaW5lXCI7XG5jb25zdCBTQ3MgPSBbXTtcbmZvciAoY29uc3Qga2V5IGluIFNDVVJMcykge1xuICAgIFNDcy5wdXNoKFNDVVJMc1trZXldKTtcbn1cblxuY29uc3Qgc3VtbWFyaWVzID0ge1xuICAgIFwiMS4xLjFcIjogXCJBbGwgbm9uLXRleHQgY29udGVudCB0aGF0IGlzIHByZXNlbnRlZCB0byB0aGUgdXNlciBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgc2VydmVzIHRoZSBlcXVpdmFsZW50IHB1cnBvc2UuXCIsXG4gICAgXCIxLjIuMVwiOiBcIkZvciBwcmVyZWNvcmRlZCBhdWRpby1vbmx5IG9yIHZpZGVvLW9ubHkgbWVkaWEsIGFuIGFsdGVybmF0aXZlIHByb3ZpZGVzIGVxdWl2YWxlbnQgaW5mb3JtYXRpb24uXCIsXG4gICAgXCIxLjIuMlwiOiBcIkNhcHRpb25zIGFyZSBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjNcIjogXCJBbiBhbHRlcm5hdGl2ZSBmb3IgdGltZS1iYXNlZCBtZWRpYSBvciBhdWRpbyBkZXNjcmlwdGlvbiBvZiB0aGUgcHJlcmVjb3JkZWQgdmlkZW8gY29udGVudCBpcyBwcm92aWRlZCBmb3Igc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjRcIjogXCJDYXB0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBsaXZlIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjVcIjogXCJBdWRpbyBkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIHZpZGVvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4zLjFcIjogXCJJbmZvcm1hdGlvbiwgc3RydWN0dXJlLCBhbmQgcmVsYXRpb25zaGlwcyBjb252ZXllZCB0aHJvdWdoIHByZXNlbnRhdGlvbiBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIG9yIGFyZSBhdmFpbGFibGUgaW4gdGV4dC5cIixcbiAgICBcIjEuMy4yXCI6IFwiV2hlbiB0aGUgc2VxdWVuY2UgaW4gd2hpY2ggY29udGVudCBpcyBwcmVzZW50ZWQgYWZmZWN0cyBpdHMgbWVhbmluZywgYSBjb3JyZWN0IHJlYWRpbmcgc2VxdWVuY2UgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZC5cIixcbiAgICBcIjEuMy4zXCI6IFwiSW5zdHJ1Y3Rpb25zIHByb3ZpZGVkIGZvciB1bmRlcnN0YW5kaW5nIGFuZCBvcGVyYXRpbmcgY29udGVudCBkbyBub3QgcmVseSBzb2xlbHkgb24gc2Vuc29yeSBjaGFyYWN0ZXJpc3RpY3Mgb2YgY29tcG9uZW50cyBzdWNoIGFzIHNoYXBlLCBzaXplLCB2aXN1YWwgbG9jYXRpb24sIG9yaWVudGF0aW9uLCBvciBzb3VuZC5cIixcbiAgICBcIjEuMy40XCI6IFwiQ29udGVudCBkb2VzIG5vdCByZXN0cmljdCBpdHMgdmlldyBhbmQgb3BlcmF0aW9uIHRvIGEgc2luZ2xlIGRpc3BsYXkgb3JpZW50YXRpb24sIHN1Y2ggYXMgcG9ydHJhaXQgb3IgbGFuZHNjYXBlLlwiLFxuICAgIFwiMS4zLjVcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGlucHV0IGZpZWxkIHRoYXQgY29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZCB3aGVuIHRoZSBmaWVsZCBzZXJ2ZXMgYSBjb21tb24gcHVycG9zZS5cIixcbiAgICBcIjEuNC4xXCI6IFwiQ29sb3IgaXMgbm90IHVzZWQgYXMgdGhlIG9ubHkgdmlzdWFsIG1lYW5zIG9mIGNvbnZleWluZyBpbmZvcm1hdGlvbiwgaW5kaWNhdGluZyBhbiBhY3Rpb24sIHByb21wdGluZyBhIHJlc3BvbnNlLCBvciBkaXN0aW5ndWlzaGluZyBhIHZpc3VhbCBlbGVtZW50LlwiLFxuICAgIFwiMS40LjJcIjogXCJJZiBhbnkgYXVkaW8gcGxheXMgYXV0b21hdGljYWxseSBmb3IgbW9yZSB0aGFuIDMgc2Vjb25kcywgZWl0aGVyIGEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBwYXVzZSBvciBzdG9wIHRoZSBhdWRpbywgb3IgYSBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIHRvIGNvbnRyb2wgYXVkaW8gdm9sdW1lIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgb3ZlcmFsbCBzeXN0ZW0gdm9sdW1lIGxldmVsLlwiLFxuICAgIFwiMS40LjNcIjogXCJUaGUgdmlzdWFsIHByZXNlbnRhdGlvbiBvZiB0ZXh0IGFuZCBpbWFnZXMgb2YgdGV4dCBoYXMgYSBjb250cmFzdCByYXRpbyBvZiBhdCBsZWFzdCA0LjU6MSwgd2l0aCBhIDM6MSByYXRpbyBmb3IgbGFyZ2Utc2NhbGUgdGV4dC5cIixcbiAgICBcIjEuNC40XCI6IFwiVGV4dCBjYW4gYmUgcmVzaXplZCB3aXRob3V0IGFzc2lzdGl2ZSB0ZWNobm9sb2d5IHVwIHRvIDIwMCBwZXJjZW50IHdpdGhvdXQgbG9zcyBvZiBjb250ZW50IG9yIGZ1bmN0aW9uYWxpdHkuXCIsXG4gICAgXCIxLjQuNVwiOiBcIklmIHRoZSB0ZWNobm9sb2dpZXMgYmVpbmcgdXNlZCBjYW4gYWNoaWV2ZSB0aGUgdmlzdWFsIHByZXNlbnRhdGlvbiwgdGV4dCBzaG91bGQgbm90IGJlIHVzZWQgdG8gY29udmV5IGluZm9ybWF0aW9uIHJhdGhlciB0aGFuIGltYWdlcyBvZiB0ZXh0LlwiLFxuICAgIFwiMS40LjEwXCI6IFwiQ29udGVudCBjYW4gcmVmbG93IHdpdGhvdXQgbG9zcyBvZiBpbmZvcm1hdGlvbiBvciBmdW5jdGlvbmFsaXR5LCBhbmQgd2l0aG91dCByZXF1aXJpbmcgc2Nyb2xsaW5nIGluIHR3byBkaW1lbnNpb25zLlwiLFxuICAgIFwiMS40LjExXCI6IFwiVGhlIHBhcnRzIG9mIGdyYXBoaWNhbCBvYmplY3RzIHJlcXVpcmVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRlbnQsIGFuZCB0aGUgdmlzdWFsIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGlkZW50aWZ5IFVJIGNvbXBvbmVudHMgYW5kIHN0YXRlcywgaGF2ZSBhIGNvbnRyYXN0IHJhdGlvIG9mIGF0IGxlYXN0IDM6MSBhZ2FpbnN0IGFkamFjZW50IGNvbG9ycy5cIixcbiAgICBcIjEuNC4xMlwiOiBcIk5vIGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5IG9jY3VycyB3aGVuIHVzZXJzIGNoYW5nZSBsZXR0ZXIsIHdvcmQgYW5kIHBhcmFncmFwaCBzcGFjaW5nLCBhcyB3ZWxsIGFzIGxpbmUgaGVpZ2h0LlwiLFxuICAgIFwiMS40LjEzXCI6IFwiV2hlcmUgaG92ZXIgb3IgZm9jdXMgYWN0aW9ucyBjYXVzZSBhZGRpdGlvbmFsIGNvbnRlbnQgdG8gYmVjb21lIHZpc2libGUgYW5kIGhpZGRlbiwgdGhlIGFkZGl0aW9uYWwgY29udGVudCBpcyBkaXNtaXNzYWJsZSwgaG92ZXJhYmxlIGFuZCBwZXJzaXN0ZW50LlwiLFxuICAgIFwiMi4xLjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgY29udGVudCBpcyBvcGVyYWJsZSB0aHJvdWdoIGEga2V5Ym9hcmQgaW50ZXJmYWNlIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpZmljIHRpbWluZ3MgZm9yIGluZGl2aWR1YWwga2V5c3Ryb2tlcy5cIixcbiAgICBcIjIuMS4yXCI6IFwiSWYga2V5Ym9hcmQgZm9jdXMgY2FuIGJlIG1vdmVkIHRvIGEgY29tcG9uZW50IHVzaW5nIGEga2V5Ym9hcmQgaW50ZXJmYWNlLCB0aGVuIGZvY3VzIGNhbiBiZSBtb3ZlZCBhd2F5IGZyb20gdGhhdCBjb21wb25lbnQgdXNpbmcgb25seSBhIGtleWJvYXJkIGludGVyZmFjZSwgYW5kLCBpZiBpdCByZXF1aXJlcyBtb3JlIHRoYW4gdW5tb2RpZmllZCBhcnJvdyBvciB0YWIga2V5cyBvciBvdGhlciBzdGFuZGFyZCBleGl0IG1ldGhvZHMsIHRoZSB1c2VyIGlzIGFkdmlzZWQgb2YgdGhlIG1ldGhvZCBmb3IgbW92aW5nIGZvY3VzIGF3YXkuXCIsXG4gICAgXCIyLjEuNFwiOiBcIklmIGEga2V5Ym9hcmQgc2hvcnRjdXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgb25seSBsZXR0ZXIsIHB1bmN0dWF0aW9uLCBudW1iZXIgb3Igc3ltYm9sIGNoYXJhY3RlcnMsIHRoZW4gdGhlIHNob3J0Y3V0IGNhbiBiZSB0dXJuZWQgb2ZmLCByZW1hcHBlZCBvciBhY3RpdmF0ZWQgb25seSBvbiBmb2N1cy5cIixcbiAgICBcIjIuMi4xXCI6IFwiRm9yIGVhY2ggdGltZSBsaW1pdCB0aGF0IGlzIHNldCBieSB0aGUgY29udGVudCwgdGhlIHVzZXIgY2FuIHR1cm4gb2ZmLCBhZGp1c3QsIG9yIGV4dGVuZCB0aGUgbGltaXQuXCIsXG4gICAgXCIyLjIuMlwiOiBcIkZvciBtb3ZpbmcsIGJsaW5raW5nLCBzY3JvbGxpbmcsIG9yIGF1dG8tdXBkYXRpbmcgaW5mb3JtYXRpb24sIHRoZSB1c2VyIGNhbiBwYXVzZSwgc3RvcCwgaGlkZSBvciBhZGp1c3QgdGhlIGluZm9ybWF0aW9uLlwiLFxuICAgIFwiMi4zLjFcIjogXCJDb250ZW50IGRvZXMgbm90IGNvbnRhaW4gYW55dGhpbmcgdGhhdCBmbGFzaGVzIG1vcmUgdGhhbiB0aHJlZSB0aW1lcyBpbiBhbnkgb25lIHNlY29uZCBwZXJpb2QsIG9yIHRoZSBmbGFzaCBpcyBiZWxvdyB0aGUgZ2VuZXJhbCBmbGFzaCBhbmQgcmVkIGZsYXNoIHRocmVzaG9sZHMuXCIsXG4gICAgXCIyLjQuMVwiOiBcIkEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzLlwiLFxuICAgIFwiMi40LjJcIjogXCJXZWIgcGFnZXMsIG5vbi13ZWIgZG9jdW1lbnRzLCBhbmQgc29mdHdhcmUgaGF2ZSB0aXRsZXMgdGhhdCBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjNcIjogXCJJZiBjb250ZW50IGNhbiBiZSBuYXZpZ2F0ZWQgc2VxdWVudGlhbGx5IGFuZCB0aGUgbmF2aWdhdGlvbiBzZXF1ZW5jZXMgYWZmZWN0IG1lYW5pbmcgb3Igb3BlcmF0aW9uLCBmb2N1c2FibGUgY29tcG9uZW50cyByZWNlaXZlIGZvY3VzIGluIGFuIG9yZGVyIHRoYXQgcHJlc2VydmVzIG1lYW5pbmcgYW5kIG9wZXJhYmlsaXR5LlwiLFxuICAgIFwiMi40LjRcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGxpbmsgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgbGluayB0ZXh0IGFsb25lIG9yIGZyb20gdGhlIGxpbmsgdGV4dCB0b2dldGhlciB3aXRoIGl0cyBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgbGluayBjb250ZW50LlwiLFxuICAgIFwiMi40LjVcIjogXCJNb3JlIHRoYW4gb25lIHdheSBpcyBhdmFpbGFibGUgdG8gbG9jYXRlIGEgV2ViIHBhZ2Ugd2l0aGluIGEgc2V0IG9mIFdlYiBwYWdlcywgZXhjZXB0IHdoZXJlIHRoZSBXZWIgUGFnZSBpcyB0aGUgcmVzdWx0IG9mLCBvciBhIHN0ZXAgaW4sIGEgcHJvY2Vzcy5cIixcbiAgICBcIjIuNC42XCI6IFwiSGVhZGluZ3MgYW5kIGxhYmVscyBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjdcIjogXCJBbnkga2V5Ym9hcmQgb3BlcmFibGUgdXNlciBpbnRlcmZhY2UgaGFzIGEgbW9kZSBvZiBvcGVyYXRpb24gd2hlcmUgdGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBpcyB2aXNpYmxlLlwiLFxuICAgIFwiMi40LjExXCI6IFwiV2hlbiBhbiBlbGVtZW50IHJlY2VpdmVzIGZvY3VzLCBpdCBpcyBub3QgZW50aXJlbHkgY292ZXJlZCBieSBvdGhlciBjb250ZW50LlwiLFxuICAgIFwiMi41LjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSB0aGF0IHVzZXMgbXVsdGlwb2ludCBvciBwYXRoLWJhc2VkIGdlc3R1cmVzIGZvciBvcGVyYXRpb24gY2FuIGJlIG9wZXJhdGVkIHdpdGggYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGEgcGF0aC1iYXNlZCBnZXN0dXJlLlwiLFxuICAgIFwiMi41LjJcIjogXCJGb3IgZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBvcGVyYXRlZCB1c2luZyBhIHNpbmdsZSBwb2ludGVyLCBjb21wbGV0aW9uIG9mIHRoZSBmdW5jdGlvbiBpcyBvbiB0aGUgdXAtZXZlbnQgd2l0aCBhbiBhYmlsaXR5IHRvIGFib3J0LCB1bmRvIG9yIHJldmVyc2UgdGhlIG91dGNvbWUuXCIsXG4gICAgXCIyLjUuM1wiOiBcIkZvciB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzIHdpdGggbGFiZWxzIHRoYXQgaW5jbHVkZSB0ZXh0IG9yIGltYWdlcyBvZiB0ZXh0LCB0aGUgYWNjZXNzaWJsZSBuYW1lIGNvbnRhaW5zIHRoZSB0ZXh0IHRoYXQgaXMgcHJlc2VudGVkIHZpc3VhbGx5LlwiLFxuICAgIFwiMi41LjRcIjogXCJGdW5jdGlvbmFsaXR5IHRoYXQgY2FuIGJlIG9wZXJhdGVkIGJ5IG1vdGlvbiBjYW4gYWxzbyBiZSBvcGVyYXRlZCBieSB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzLCBhbmQgdGhlIG1vdGlvbiB0cmlnZ2VyIGNhbiBiZSBkaXNhYmxlZC5cIixcbiAgICBcIjIuNS44XCI6IFwiVGhlIHNpemUgb2YgdGhlIHRhcmdldCBmb3IgcG9pbnRlciBpbnB1dHMgaXMgYXQgbGVhc3QgMjQgYnkgMjQgQ1NTIHBpeGVscy5cIixcbiAgICBcIjIuNS43XCI6IFwiQWxsIGZ1bmN0aW9uYWxpdHkgdGhhdCB1c2VzIGEgZHJhZ2dpbmcgbW92ZW1lbnQgZm9yIG9wZXJhdGlvbiBjYW4gYmUgYWNoaWV2ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGRyYWdnaW5nLlwiLFxuICAgIFwiMy4xLjFcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiBXZWIgcGFnZXMsIG5vbi1XZWIgZG9jdW1lbnRzLCBvciBzb2Z0d2FyZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4xLjJcIjogXCJUaGUgaHVtYW4gbGFuZ3VhZ2Ugb2YgZWFjaCBwYXNzYWdlIG9yIHBocmFzZSBpbiB0aGUgY29udGVudCBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4yLjFcIjogXCJXaGVuIGFueSBjb21wb25lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGRvZXMgbm90IGluaXRpYXRlIGEgY2hhbmdlIG9mIGNvbnRleHQuXCIsXG4gICAgXCIzLjIuMlwiOiBcIkNoYW5naW5nIHRoZSBzZXR0aW5nIG9mIGFueSB1c2VyIGludGVyZmFjZSBjb21wb25lbnQgZG9lcyBub3QgYXV0b21hdGljYWxseSBjYXVzZSBhIGNoYW5nZSBvZiBjb250ZXh0IHVubGVzcyB0aGUgdXNlciBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBiZWhhdmlvciBiZWZvcmUgdXNpbmcgdGhlIGNvbXBvbmVudC5cIixcbiAgICBcIjMuMi4zXCI6IFwiTmF2aWdhdGlvbmFsIG1lY2hhbmlzbXMgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzIHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgb2NjdXIgaW4gdGhlIHNhbWUgcmVsYXRpdmUgb3JkZXIgZWFjaCB0aW1lIHRoZXkgYXJlIHJlcGVhdGVkLCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4yLjRcIjogXCJDb21wb25lbnRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgYXJlIGlkZW50aWZpZWQgY29uc2lzdGVudGx5LlwiLFxuICAgIFwiMy4yLjZcIjogXCJNYWtlIGl0IGVhc2llciB0byBmaW5kIGhlbHAgYW5kIHN1cHBvcnQuIElmIGEgV2ViIHBhZ2UgY29udGFpbnMgaGVscCBtZWNoYW5pc21zIHRoZXkgb2NjdXIgaW4gdGhlIHNhbWUgb3JkZXIgcmVsYXRpdmUgdG8gb3RoZXIgcGFnZSBjb250ZW50LCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4zLjFcIjogXCJJZiBhbiBpbnB1dCBlcnJvciBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLCB0aGUgaXRlbSB0aGF0IGlzIGluIGVycm9yIGlzIGlkZW50aWZpZWQgYW5kIHRoZSBlcnJvciBpcyBkZXNjcmliZWQgdG8gdGhlIHVzZXIgaW4gdGV4dC5cIixcbiAgICBcIjMuMy4yXCI6IFwiTGFiZWxzIG9yIGluc3RydWN0aW9ucyBhcmUgcHJvdmlkZWQgd2hlbiBjb250ZW50IHJlcXVpcmVzIHVzZXIgaW5wdXQuXCIsXG4gICAgXCIzLjMuM1wiOiBcIklmIGFuIGlucHV0IGVycm9yIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYW5kIHN1Z2dlc3Rpb25zIGZvciBjb3JyZWN0aW9uIGFyZSBrbm93biwgdGhlbiB0aGUgc3VnZ2VzdGlvbnMgYXJlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLCB1bmxlc3MgaXQgd291bGQgamVvcGFyZGl6ZSB0aGUgc2VjdXJpdHkgb3IgcHVycG9zZSBvZiB0aGUgY29udGVudC5cIixcbiAgICBcIjMuMy40XCI6IFwiRm9yIGNvbnRlbnQgdGhhdCBjYXVzZSBsZWdhbCBjb21taXRtZW50cyBvciBmaW5hbmNpYWwgdHJhbnNhY3Rpb25zIGZvciB0aGUgdXNlciB0byBvY2N1ciwgdGhhdCBtb2RpZnkgb3IgZGVsZXRlIHVzZXItY29udHJvbGxhYmxlIGRhdGEgaW4gZGF0YSBzdG9yYWdlIHN5c3RlbXMsIG9yIHRoYXQgc3VibWl0IHVzZXIgdGVzdCByZXNwb25zZXMsIHRoZSB1c2VyIGNhbiByZXZlcnNlLCBjb3JyZWN0LCBvciBjb25maXJtIHRoZSBhY3Rpb24uXCIsXG4gICAgXCIzLjMuN1wiOiBcIk1ha2UgaXQgZWFzaWVyIGZvciB1c2VycyB0byBjb21wbGV0ZSBtdWx0aS1zdGVwIHByb2Nlc3Nlcy4gRG9uJ3QgYXNrIGZvciB0aGUgc2FtZSBpbmZvcm1hdGlvbiB0d2ljZSBpbiB0aGUgc2FtZSBzZXNzaW9uLlwiLFxuICAgIFwiMy4zLjhcIjogXCJNYWtlIGxvZ2lucyBwb3NzaWJsZSB3aXRoIGxlc3MgbWVudGFsIGVmZm9ydC4gRG9uJ3QgbWFrZSBwZW9wbGUgc29sdmUsIHJlY2FsbCwgb3IgdHJhbnNjcmliZSBzb21ldGhpbmcgdG8gbG9nIGluLlwiLFxuICAgIFwiNC4xLjFcIjogXCIoT2Jzb2xldGUgYW5kIHJlbW92ZWQpIFRoaXMgcmVxdWlyZW1lbnQgd2FzIG9yaWdpbmFsbHkgYWRvcHRlZCB0byBhZGRyZXNzIHByb2JsZW1zIHRoYXQgYXNzaXN0aXZlIHRlY2hub2xvZ3kgKEFUKSBoYWQgZGlyZWN0bHkgcGFyc2luZyBIVE1MLiBBVCBubyBsb25nZXIgaGFzIGFueSBuZWVkIHRvIGRpcmVjdGx5IHBhcnNlIEhUTUwuIENvbnNlcXVlbnRseSwgdGhlc2UgcHJvYmxlbXMgZWl0aGVyIG5vIGxvbmdlciBleGlzdCBvciBhcmUgYWRkcmVzc2VkIGJ5IG90aGVyIHJlcXVpcmVtZW50cy5cIiwgXG4gICAgXCI0LjEuMlwiOiBcIkZvciBhbGwgdXNlciBpbnRlcmZhY2UgY29tcG9uZW50cyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGZvcm0gZWxlbWVudHMsIGxpbmtzIGFuZCBjb21wb25lbnRzIGdlbmVyYXRlZCBieSBzY3JpcHRzKSwgdGhlIG5hbWUgYW5kIHJvbGUgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZDsgc3RhdGVzLCBwcm9wZXJ0aWVzLCBhbmQgdmFsdWVzIHRoYXQgY2FuIGJlIHNldCBieSB0aGUgdXNlciBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBzZXQ7IGFuZCBub3RpZmljYXRpb24gb2YgY2hhbmdlcyB0byB0aGVzZSBpdGVtcyBpcyBhdmFpbGFibGUgdG8gdXNlciBhZ2VudHMsIGluY2x1ZGluZyBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLlwiLFxuICAgIFwiNC4xLjNcIjogXCJJbiBjb250ZW50IGltcGxlbWVudGVkIHVzaW5nIG1hcmt1cCBsYW5ndWFnZXMsIHN0YXR1cyBtZXNzYWdlcyBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIHRocm91Z2ggcm9sZSBvciBwcm9wZXJ0aWVzIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgYnkgYXNzaXN0aXZlIHRlY2hub2xvZ2llcyB3aXRob3V0IHJlY2VpdmluZyBmb2N1cy5cIixcbiAgICBcIkhUTUxcIjogXCJUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGlzc3VlcyB0aGF0IGNhdXNlIGFjY2Vzc2liaWxpdHkgaXNzdWVzIG1heSBiZSBjb3ZlcmVkIGJ5IG90aGVyIHJ1bGVzIGFuZCB3aWxsIGJlIHJlcG9ydGVkIHVuZGVyIHRob3NlIGFjY2Vzc2liaWxpdHkgcmVxdWlyZW1lbnRzLiBIb3dldmVyLCBzb21lIG5vbi1jb25mb3JtaW5nIEhUTUwgc3BlY2lmaWNhdGlvbiBpc3N1ZXMgYXJlIHN0aWxsIHJlcG9ydGVkLlwiLFxuICAgIFwiQVJJQVwiOiBcIlRoZSBBUklBIHNwZWNpZmljYXRpb24gaXNzdWVzIHRoYXQgY2F1c2UgYWNjZXNzaWJpbGl0eSBpc3N1ZXMgbWF5IGJlIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXMgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgdW5kZXIgdGhvc2UgYWNjZXNzaWJpbGl0eSByZXF1aXJlbWVudHMuIEhvd2V2ZXIsIHNvbWUgbm9uLWNvbmZvcm1pbmcgQVJJQSBzcGVjaWZpY2F0aW9uIGlzc3VlcyBhcmUgc3RpbGwgcmVwb3J0ZWQuXCIsXG59ICAgICBcblxuZXhwb3J0IGNvbnN0IGExMXlSdWxlc2V0czogR3VpZGVsaW5lW10gPSBbXG4gICAgLy8ge1xuICAgIC8vICAgICBpZDogXCJERUJVR1wiLFxuICAgIC8vICAgICBuYW1lOiBcIkRFQlVHIFJ1bGVzXCIsXG4gICAgLy8gICAgIGNhdGVnb3J5OiBlUnVsZUNhdGVnb3J5LkFDQ0VTU0lCSUxJVFksXG4gICAgLy8gICAgIGRlc2NyaXB0aW9uOiBcIlJ1bGVzIGZvciBkZWJ1Z2dpbmdcIixcbiAgICAvLyAgICAgY2hlY2twb2ludHM6IFt7XG4gICAgLy8gICAgICAgICBudW06IFwiMVwiLFxuICAgIC8vICAgICAgICAgbmFtZTogXCJEZWJ1ZyBDUCAxXCIsXG4gICAgLy8gICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgIC8vICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRGVidWdcIlxuICAgIC8vICAgICB9XVxuICAgIC8vIH0sXG4gICAge1xuICAgICAgICBpZDogXCJFWFRFTlNJT05TXCIsXG4gICAgICAgIG5hbWU6IFwiRXh0ZW5zaW9uIFJ1bGVzXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIGVuYWJsaW5nIHRoZSBicm93c2VyIGV4dGVuc2lvbnNcIixcbiAgICAgICAgdHlwZTogZUd1aWRlbGluZVR5cGUuRVhURU5TSU9OLFxuICAgICAgICBjaGVja3BvaW50czogW3tcbiAgICAgICAgICAgIG51bTogXCIxXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBDUCAxXCIsXG4gICAgICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRXh0ZW5zaW9uXCJcbiAgICAgICAgfV1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiSUJNX0FjY2Vzc2liaWxpdHlcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSA3LjNcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjAsIDIuMSwgMi4yIEEgYW5kIEFBIHBsdXMgYWRkaXRpb25hbCBJQk0gc3VwcGxlbWVudGFsIHJlcXVpcmVtZW50cy5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIiB8fCBzYy5sZXZlbCA9PT0gXCJOQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiTkFcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkOiBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSBuZXh0XCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wLCAyLjEsIDIuMiBBIGFuZCBBQSBwbHVzIGFkZGl0aW9uYWwgSUJNIHN1cHBsZW1lbnRhbCByZXF1aXJlbWVudHMuXCIsXG4gICAgICAgIC8vIFRoaXMgcnVsZXNldCBoYXMgYWxsIDIuMCBhbmQgMi4xIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIgfHwgc2MubGV2ZWwgPT09IFwiTkFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMlwiIHx8IHNjLndjYWdUeXBlID09PSBcIk5BXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMlwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4yIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjIgQSAmIEFBLiBUaGlzIGlzIHRoZSBjdXJyZW50IFczQyByZWNvbW1lbmRhdGlvbiAoc3BlY2lmaWNhdGlvbikuIENvbnRlbnQgdGhhdCBjb25mb3JtcyB0byBXQ0FHIDIuMiBhbHNvIGNvbmZvcm1zIHRvIFdDQUcgMi4xLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgYW5kIDIuMSBjaGVja3BvaW50cyB0aGF0IGFyZSBBIG9yIEFBXG4gICAgICAgIGNoZWNrcG9pbnRzOiBTQ3NcbiAgICAgICAgICAgIC5maWx0ZXIoc2MgPT4gKHNjLmxldmVsID09PSBcIkFcIiB8fCBzYy5sZXZlbCA9PT0gXCJBQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMVwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4xIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjEgQSAmIEFBLiBDb250ZW50IHRoYXQgY29uZm9ybXMgdG8gV0NBRyAyLjEgYWxzbyBjb25mb3JtcyB0byBXQ0FHIDIuMC5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiKSlcbiAgICAgICAgICAgIC5tYXAoc2MgPT4gKHtcbiAgICAgICAgICAgICAgICBudW06IHNjLm51bSxcbiAgICAgICAgICAgICAgICBzY0lkOiBzYy5zY0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHNjLmhhbmRsZSxcbiAgICAgICAgICAgICAgICB3Y2FnTGV2ZWw6IHNjLmxldmVsLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcmllc1tzYy5udW1dXG4gICAgICAgICAgICB9KSlcbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiV0NBR18yXzBcIixcbiAgICAgICAgbmFtZTogXCJXQ0FHIDIuMCAoQSwgQUEpXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wIEEgJiBBQS4gUmVmZXJlbmNlZCBieSBVUyBTZWN0aW9uIDUwOCwgYnV0IG5vdCB0aGUgbGF0ZXN0IFczQyByZWNvbW1lbmRhdGlvbi5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIpICYmIChzYy53Y2FnVHlwZSA9PT0gXCIyLjBcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfVxuXVxuIiwiXG5pbXBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBTUlJlbmRlcmVyIH0gZnJvbSBcIi4vU1JSZW5kZXJlclwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUsIE5hdmlnYXRpb25SZXN1bHQsIFJlbmRlclJlc3VsdCB9IGZyb20gXCIuL1NSVHlwZXNcIjtcbmltcG9ydCB7IFNSTmF2aWdhdG9yIH0gZnJvbSBcIi4vU1JOYXZpZ2F0b3JcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgU1JVdGlsIH0gZnJvbSBcIi4vU1JVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG4vKipcbiAqIFNSQ29udHJvbGxlciBjbGFzcyBmb3IgbWFuYWdpbmcgc2NyZWVuIHJlYWRlciBzaW11bGF0aW9uXG4gKiBNYWludGFpbnMgYSBwb2ludCBvZiByZWdhcmQgYW5kIHByb3ZpZGVzIG5hdmlnYXRpb24gZnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBTUkNvbnRyb2xsZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgc2luZ2xldG9uO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udHJvbGxlcihjdHJsRG9jOiBIVE1MRG9jdW1lbnQgPSBkb2N1bWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuc2luZ2xldG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNpbmdsZXRvbiA9IG5ldyBTUkNvbnRyb2xsZXIoY3RybERvYy5ib2R5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b24gYXMgU1JDb250cm9sbGVyO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY3VycmVudCBwb2ludCBvZiByZWdhcmQgKi9cbiAgICBwcml2YXRlIHBvaW50T2ZSZWdhcmQ6IFNSQ3Vyc29yO1xuICAgIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgICBwcml2YXRlIGxpdmVMaXN0ZW5lcnM6IEFycmF5PChyZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPj4gPSBbXTtcbiAgICBwcml2YXRlIGN0cmxEb2M7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUkNvbnRyb2xsZXJcbiAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCB0byBzdGFydCBmcm9tIChkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5KVxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByb290RWxlbWVudDogTm9kZSA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgdGhpcy5jdHJsRG9jID0gcm9vdEVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgdGhpcy5zZXRQb2ludE9mUmVnYXJkKHJvb3RFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXR1cE11dGF0aW9uVHJhY2tpbmcoKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGBbV0FSTklOR10gVGhlIFNSQ29udHJvbGxlciBpcyBhIG5ldyBmZWF0dXJlIHRoYXQgaXMgbm90IHlldCBcInN0YWJsZVwiLiBXaGF0IHRoaXMgbWVhbnM6XG4qIEFQSSBzdWJqZWN0IHRvIGNoYW5nZSwgZXZlbiBiZXR3ZWVuIG1pbm9yIHZlcnNpb25zIG9mIHRoZSBjaGVja2VyXG4qIFJlc3VsdHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGtub3duIGlzc3VlcywgYnV0IG1ha2luZyB0aGlzIGF2YWlsYWJsZSBmb3IgZWFybHkgZXhwZXJpbWVudGF0aW9uIC8gZmVlZGJhY2suYCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBmaW5kQWxsU2hhZG93Um9vdHMocm9vdDogRG9jdW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgTm9kZSA9IGRvY3VtZW50KTogTm9kZVtdIHtcbiAgICAgICAgY29uc3Qgc2hhZG93Um9vdHM6IE5vZGVbXSA9IFtdO1xuXG4gICAgICAgIC8vIEdldCBhbGwgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgcm9vdFxuICAgICAgICBjb25zdCB3YWxrZXIgPSB0aGlzLmN0cmxEb2MuY3JlYXRlVHJlZVdhbGtlcihcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGw7XG4gICAgICAgIHdoaWxlIChub2RlID0gd2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZWxlbWVudCBoYXMgYW4gb3BlbiBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIHNoYWRvd1Jvb3RzLnB1c2goZWxlbWVudC5zaGFkb3dSb290KTtcblxuICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNlYXJjaCBpbnNpZGUgdGhpcyBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFNoYWRvd1Jvb3RzID0gdGhpcy5maW5kQWxsU2hhZG93Um9vdHMoZWxlbWVudC5zaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICBzaGFkb3dSb290cy5wdXNoKC4uLm5lc3RlZFNoYWRvd1Jvb3RzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFkb3dSb290cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgbXV0YXRpb24gdHJhY2tpbmdcbiAgICAgKiBcbiAgICAgKiBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgcG9pbnQgb2YgcmVnYXJkIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCB3ZSBuZWVkIHRvIGdldCB1cCB0byB0aGUgbmVhcmVzdCBwYXJlbnQgdGhhdCdzIG5vdCBiZWluZyByZW1vdmVkXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cE11dGF0aW9uVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbXlUaGlzID0gdGhpcztcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgcG9yTm9kZSA9IG15VGhpcy5wb2ludE9mUmVnYXJkLmdldE5vZGUoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVtb3ZhbE11dGF0aW9uIG9mIG11dGF0aW9ucy5maWx0ZXIobXV0YXRpb24gPT4gbXV0YXRpb24ucmVtb3ZlZE5vZGVzPy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIHJlbW92YWxNdXRhdGlvbi5yZW1vdmVkTm9kZXMuZm9yRWFjaCgocmVtb3ZlZE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZWROb2RlLmlzU2FtZU5vZGUocG9yTm9kZSkgfHwgcmVtb3ZlZE5vZGUuY29udGFpbnMocG9yTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIkFkanVzdGluZyBQb1IgZHVlIHRvIERPTSBtdXRhdGlvbiByZW1vdmluZyBQb1JcIik7Ly8sIHJlbW92YWxNdXRhdGlvbi50YXJnZXQsIHJlbW92ZWROb2RlLCBwb3JOb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9yTm9kZSA9IHJlbW92YWxNdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZXRQb2ludE9mUmVnYXJkKHBvck5vZGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIG11dGF0aW9uLmFkZGVkTm9kZXMuZm9yRWFjaChhZGRlZE5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG9ic2VydmF0aW9uIG9mIG5ldyBzaGFkb3cgcm9vdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxSb290cyA9IHRoaXMuZmluZEFsbFNoYWRvd1Jvb3RzKGFkZGVkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgYWxsUm9vdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHJvb3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBtdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUubm9kZVR5cGUgPT09IDEgPyBub2RlIGFzIEhUTUxFbGVtZW50IDogbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChlbGVtIFxuICAgICAgICAgICAgICAgICAgICAmJiAhZWxlbS5jbG9zZXN0KGBbYXJpYS1idXN5PVwidHJ1ZVwiXWApXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1idXN5XCIpICE9PSBcInRydWVcIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgbGl2ZSByZWdpb24gY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpdmVSZWdpb25FbGVtID0gXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudCBpdHNlbGYgaXMgYSBsaXZlIHJlZ2lvbiBjb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicG9saXRlXCIsIFwiYXNzZXJ0aXZlXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1saXZlXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiT1VUUFVUXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgW1wic3RhdHVzXCIsIFwibG9nXCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJhbGVydFwiLCBcInRpbWVyXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiYgZWxlbSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPciBnZXQgdGhlIG5lYXJlc3QgYW5jZXN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW0uY2xvc2VzdChgW2FyaWEtbGl2ZT1cInBvbGl0ZVwiXSxbYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCJdLG91dHB1dCxbcm9sZT1cInN0YXR1c1wiXSxbcm9sZT1cImxvZ1wiXSxbcm9sZT1cInByb2dyZXNzYmFyXCJdLFtyb2xlPVwiYWxlcnRcIl0sW3JvbGU9XCJ0aW1lclwiXWApO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBpc011dGF0aW9uUmVsZXZhbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlbGV2YW5jZSA9IFtcImFkZGl0aW9uc1wiLCBcInRleHRcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXZlUmVnaW9uRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoYXQga2luZHMgb2YgY2hhbmdlcyBhcmUgJ3JlbGV2YW50J1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsZXZhbnRFbGVtID0gZWxlbS5jbG9zZXN0KFwiW2FyaWEtcmVsZXZhbnRdXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGV2YW50RWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IHJlbGV2YW50RWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXJlbGV2YW50XCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwibG9nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFuY2UgPSBbXCJhZGRpdGlvbnNcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGl2ZVJlZ2lvbkVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1yZWxldmFudFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcmVsZXZhbnRcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGV2YW5jZS5pbmNsdWRlcyhcImFsbFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IFtcImFkZGl0aW9uc1wiLCBcInJlbW92YWxzXCIsIFwidGV4dFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTXV0YXRpb25SZWxldmFudCA9IChtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDMgJiYgcmVsZXZhbmNlLmluY2x1ZGVzKFwidGV4dFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwICYmIHJlbGV2YW5jZS5pbmNsdWRlcyhcImFkZGl0aW9uc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDAgJiYgcmVsZXZhbmNlLmluY2x1ZGVzKFwicmVtb3ZhbHNcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXZlUmVnaW9uRWxlbSAmJiBpc011dGF0aW9uUmVsZXZhbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQXRvbWljID0gbGl2ZVJlZ2lvbkVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1hdG9taWNcIikgPT09IFwidHJ1ZVwiIHx8IFtcImFsZXJ0XCIsIFwic3RhdHVzXCIsIFwidGltZXJcIiwgXCJtYXJxdWVlXCJdLmluY2x1ZGVzKGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgd2hvbGUgcmVnaW9uIGlmIGF0b21pY1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0F0b21pYyAmJiBtdXRhdGlvbi50eXBlID09PSBcImNoYXJhY3RlckRhdGFcIiAmJiBtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDMgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG11dGF0aW9uLnRhcmdldC5wYXJlbnRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGl2ZUxpc3RlbmVyIG9mIHRoaXMubGl2ZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlTGlzdGVuZXIobXV0YXRpb24udGFyZ2V0Lm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZVRhcmdldCA9IGlzQXRvbWljID8gbGl2ZVJlZ2lvbkVsZW0gOiBtdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsaXZlVGFyZ2V0IGFzIGFueSkubGl2ZUFubm91bmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCgobGl2ZVRhcmdldCBhcyBhbnkpLmxpdmVBbm5vdW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXZlVGFyZ2V0IGFzIGFueSkubGl2ZUFubm91bmNlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc1JlbW92YWwgPSAocmVsZXZhbmNlLmluY2x1ZGVzKFwicmVtb3ZhbHNcIikgJiYgbXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdG9taWMgfHwgaXNSZW1vdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZUN1cnNvciA9IG5ldyBTUkN1cnNvcihsaXZlVGFyZ2V0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZUN1cnNvckVuZCA9IG5ldyBTUkN1cnNvcihsaXZlVGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVDdXJzb3JFbmQubmV4dCgoKSA9PiB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCgoaXNSZW1vdmFsP1wiW3JlbW92ZWRdIFwiOlwiXCIpK1NSUmVuZGVyZXIucmVuZGVyUmFuZ2UoXCJpdGVtXCIsIGxpdmVDdXJzb3IsIGxpdmVDdXJzb3JFbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxldmFuY2UuaW5jbHVkZXMoXCJhZGRpdGlvbnNcIikgJiYgbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goYWRkZWROb2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHJlbmRlciB0aGUgYWRkaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdmVDdXJzb3IgPSBuZXcgU1JDdXJzb3IoYWRkZWROb2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdmVDdXJzb3JFbmQgPSBuZXcgU1JDdXJzb3IoYWRkZWROb2RlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlQ3Vyc29yRW5kLm5leHQoKCkgPT4gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFNSUmVuZGVyZXIucmVuZGVyUmFuZ2UoXCJpdGVtXCIsIGxpdmVDdXJzb3IsIGxpdmVDdXJzb3JFbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGl2ZUxpc3RlbmVyIG9mIHRoaXMubGl2ZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUxpc3RlbmVyKHJlc3VsdHMuam9pbihcIlxcblwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBOZWVkIHRvIG9ic2VydmUgYWxsIG9mIHRoZSBzaGFkb3cgcm9vdHNcbiAgICAgICAgbGV0IGFsbFJvb3RzID0gdGhpcy5maW5kQWxsU2hhZG93Um9vdHModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGFsbFJvb3RzLnB1c2godGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGZvciAoY29uc3Qgcm9vdCBvZiBhbGxSb290cykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShyb290LCB7XG4gICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTGl2ZUxpc3RlbmVyKGxpc3RlbmVyOiAocmVzdWx0OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICAgICAgdGhpcy5saXZlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVMaXZlTGlzdGVuZXIocmVtb3ZlTGlzdGVuZXI6IChyZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgICAgICB0aGlzLmxpdmVMaXN0ZW5lcnMgPSB0aGlzLmxpdmVMaXN0ZW5lcnMuZmlsdGVyKGxpc3RlbmVyID0+IGxpc3RlbmVyICE9PSByZW1vdmVMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHBvaW50IG9mIHJlZ2FyZFxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IFNSQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgcG9pbnQgb2YgcmVnYXJkXG4gICAgICovXG4gICAgcHVibGljIGdldFBvaW50T2ZSZWdhcmQoKTogU1JDdXJzb3Ige1xuICAgICAgICByZXR1cm4gdGhpcy5wb2ludE9mUmVnYXJkO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBvaW50IG9mIHJlZ2FyZCB0byBhIHNwZWNpZmljIERPTSBub2RlXG4gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gc2V0IGFzIHRoZSBwb2ludCBvZiByZWdhcmRcbiAgICAgKiBAcmV0dXJucyBOYXZpZ2F0aW9uUmVzdWx0IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIHNldFBvaW50T2ZSZWdhcmQobm9kZTogTm9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKFwic2V0UG9pbnRPZlJlZ2FyZFwiKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucG9pbnRPZlJlZ2FyZCA9IG5ldyBTUkN1cnNvcihub2RlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVXBkYXRlIGNvbnRhaW5lciBzdGF0ZVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhcImZvY3VzXCIsIHRoaXMucG9pbnRPZlJlZ2FyZCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSB0aGlzLnBvaW50T2ZSZWdhcmQuZ2V0Um9sZSgpO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMucG9pbnRPZlJlZ2FyZC5nZXROYW1lSW5mbygpPy5uYW1lO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiBTUlJlbmRlcmVyLnJlbmRlckN1cnJlbnQoXCJmb2N1c1wiLCB0aGlzLnBvaW50T2ZSZWdhcmQsIGNvbnRhaW5lckNoYW5nZXMpLFxuICAgICAgICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBzZXQgcG9pbnQgb2YgcmVnYXJkOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogSnVtcCB0byB0aGUgbmV4dCBlbGVtZW50IGJ5IHRoZSBzcGVjaWZpZWQgbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdG8gdXNlXG4gICAgICogQHJldHVybnMgTmF2aWdhdGlvblJlc3VsdCBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZVxuICAgICAqL1xuICAgIHB1YmxpYyBqdW1wTmV4dChtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBDYWNoZVV0aWwuY2xlYXJDYWNoZXModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9sZFBvaW50T2ZSZWdhcmQgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cChcImp1bXBOZXh0XCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGJDb250aW51ZSA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmV4dEp1bXAgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgICAgIGxldCByZW5kZXJpbmdSZXN1bHQ7XG4gICAgICAgICAgICB3aGlsZSAoYkNvbnRpbnVlICYmIG5leHRKdW1wKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEp1bXAgPSBuZXh0SnVtcC5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIG5leHRKdW1wID0gU1JOYXZpZ2F0b3IuanVtcE5leHQobW9kZSwgbmV4dEp1bXApO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0SnVtcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCBuZXh0SnVtcCwgbGFzdEp1bXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgIVNSTmF2aWdhdG9yLmdldFN0YXJ0RnVuYyhtb2RlKShuZXh0SnVtcC5nZXRSb2xlKCksICFuZXh0SnVtcC5pc0VuZFRhZygpLCBuZXh0SnVtcC5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBuZXh0SnVtcCwgY29udGFpbmVyQ2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGxhbmRpbmcgcG9pbnQgaXMgZW1wdHksIHVubGVzcyBpdCdzIGNlcnRhaW4gbmF2IG1vZGVzIChlLmcuLCByZWdpb24pXG4gICAgICAgICAgICAgICAgICAgIGJDb250aW51ZSA9IHJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIVtcInJlZ2lvblwiXS5pbmNsdWRlcyhtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHRKdW1wKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcG9pbnQgb2YgcmVnYXJkXG4gICAgICAgICAgICAgICAgdGhpcy5wb2ludE9mUmVnYXJkID0gb2xkUG9pbnRPZlJlZ2FyZDtcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudFJlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBvbGRQb2ludE9mUmVnYXJkLCB7IGxlYXZpbmc6IFtdLCBlbnRlcmluZzogW119KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogb2xkUG9pbnRPZlJlZ2FyZC5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTm8gbmV4dCAke21vZGV9LiAke2N1cnJlbnRSZXN1bHQ/Lm1lc3NhZ2UgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBuZXh0SnVtcDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldE5hbWVJbmZvKCk/Lm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGNvbnRhaW5lciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJOZXcgUE9SOlwiLCB0aGlzLnBvaW50T2ZSZWdhcmQuZ2V0Tm9kZSgpLCByZW5kZXJpbmdSZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgcm9sZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBvaW50IG9mIHJlZ2FyZFxuICAgICAgICAgICAgdGhpcy5wb2ludE9mUmVnYXJkID0gb2xkUG9pbnRPZlJlZ2FyZDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIGVuZDogb2xkUG9pbnRPZlJlZ2FyZC5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTmF2aWdhdGlvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIEp1bXAgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgYnkgdGhlIHNwZWNpZmllZCBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB0byB1c2VcbiAgICAgKiBAcmV0dXJucyBOYXZpZ2F0aW9uUmVzdWx0IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIGp1bXBQcmV2aW91cyhtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBDYWNoZVV0aWwuY2xlYXJDYWNoZXModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9sZFBvaW50T2ZSZWdhcmQgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBwcmV2SnVtcCA9IHRoaXMucG9pbnRPZlJlZ2FyZC5jbG9uZSgpO1xuICAgICAgICAgICAgbGV0IHJlbmRlcmluZ1Jlc3VsdDtcbiAgICAgICAgICAgIHdoaWxlIChiQ29udGludWUgJiYgcHJldkp1bXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0SnVtcCA9IHByZXZKdW1wLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgcHJldkp1bXAgPSBTUk5hdmlnYXRvci5qdW1wUHJldmlvdXMobW9kZSwgcHJldkp1bXApO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2SnVtcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCBwcmV2SnVtcCwgbGFzdEp1bXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgIVNSTmF2aWdhdG9yLmdldFN0YXJ0RnVuYyhtb2RlKShwcmV2SnVtcC5nZXRSb2xlKCksICFwcmV2SnVtcC5pc0VuZFRhZygpLCBwcmV2SnVtcC5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBwcmV2SnVtcCwgY29udGFpbmVyQ2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGxhbmRpbmcgcG9pbnQgaXMgZW1wdHksIHVubGVzcyBpdCdzIGNlcnRhaW4gbmF2IG1vZGVzIChlLmcuLCByZWdpb24pXG4gICAgICAgICAgICAgICAgICAgIGJDb250aW51ZSA9IHJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIVtcInJlZ2lvblwiXS5pbmNsdWRlcyhtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcHJldkp1bXApIHtcbiAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwb2ludCBvZiByZWdhcmRcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBvbGRQb2ludE9mUmVnYXJkO1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UmVzdWx0ID0gU1JSZW5kZXJlci5yZW5kZXJDdXJyZW50KG1vZGUsIG9sZFBvaW50T2ZSZWdhcmQsIHsgbGVhdmluZzogW10sIGVudGVyaW5nOiBbXX0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG9sZFBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBObyBwcmV2aW91cyAke21vZGV9LiAke2N1cnJlbnRSZXN1bHQ/Lm1lc3NhZ2UgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBwcmV2SnVtcDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldE5hbWVJbmZvKCk/Lm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gLy8gQ2hlY2sgZm9yIGNvbnRhaW5lciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCB0aGlzLnBvaW50T2ZSZWdhcmQsIG9sZFBvaW50T2ZSZWdhcmQpO1xuICAgICAgICAgICAgICAgIC8vIGxldCBzID0gU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCB0aGlzLnBvaW50T2ZSZWdhcmQpO1xuICAgICAgICAgICAgICAgIC8vIGlmIChjb250YWluZXJDaGFuZ2VzLmVudGVyaW5nW2NvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcubGVuZ3RoLTFdICE9PSBzKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcucHVzaChzKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcG9pbnQgb2YgcmVnYXJkXG4gICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBvbGRQb2ludE9mUmVnYXJkO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG9sZFBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBOYXZpZ2F0aW9uIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHRoZSBkaWZmZXJlbnQgaW4gY29udGFpbmVycyBiZXR3ZWVuIHRoZSB0d28gbm9kZXNcbiAgICAgKiBAcGFyYW0gbmV3V2Fsa2VyIFRoZSBuZXcgbm9kZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvXG4gICAgICogQHBhcmFtIG9sZFdhbGtlciBUaGUgcHJldmlvdXMgbm9kZSB3ZSB3ZXJlIGF0XG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY29udGFpbmVyIGNoYW5nZSBtZXNzYWdlc1xuICAgICAqL1xuICAgIC8qKlxuICAgICAqIFdhbGsgdXAgZnJvbSBhIG5vZGUgaW4gYW4gaWZyYW1lIHN1YmRvY3VtZW50IHRvIGZpbmQgdGhlIGhvc3QgPGlmcmFtZT4gZWxlbWVudFxuICAgICAqIGluIHRoZSBuZWFyZXN0IGFuY2VzdG9yIGRvY3VtZW50LiAgUmV0dXJucyBudWxsIGlmIHRoZSBub2RlIGlzIG5vdCBpbiBhIHN1YmRvY3VtZW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGhvc3RJZnJhbWUobm9kZTogTm9kZSk6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGRvYyA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2MgfHwgZG9jID09PSBkb2N1bWVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIGNvbnRlbnRXaW5kb3cuZnJhbWVFbGVtZW50IGlzIHRoZSA8aWZyYW1lPiBpbiB0aGUgcGFyZW50IGRvY3VtZW50XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gRE9NVXRpbC5nZXRBbmNlc3Rvcihub2RlLCBbXCJpZnJhbWVcIl0pIGFzIEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGlmZkNvbnRhaW5lcnMobW9kZTogTmF2aWdhdGlvbk1vZGUgfCBcImZvY3VzXCIsIG5ld1dhbGtlcjogU1JDdXJzb3IsIG9sZFdhbGtlcj86IFNSQ3Vyc29yKTogeyBsZWF2aW5nOiBzdHJpbmdbXSwgZW50ZXJpbmc6IHN0cmluZ1tdIH0ge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIi09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LVwiKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJBKVwiLCBvbGRXYWxrZXI/LmdldE5vZGUoKS5ub2RlTmFtZSwgbmV3V2Fsa2VyLmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgIGxldCBsZWF2aW5nOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgZW50ZXJpbmc6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEb2MgPSBuZXdXYWxrZXI/LmdldE5vZGUoKS5vd25lckRvY3VtZW50ID8/IGRvY3VtZW50O1xuICAgICAgICAgICAgY29uc3Qgb2xkRG9jID0gb2xkV2Fsa2VyPy5nZXROb2RlKCkub3duZXJEb2N1bWVudCA/PyBkb2N1bWVudDtcblxuICAgICAgICAgICAgLy8g4pSA4pSAIENyb3NzLWRvY3VtZW50IGlmcmFtZSBib3VuZGFyeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIG5hdmlnYXRpb24gY3Jvc3NlcyBpbnRvIG9yIG91dCBvZiBhbiA8aWZyYW1lPiBzdWJkb2N1bWVudFxuICAgICAgICAgICAgLy8gdGhlIG5vcm1hbCBjb21tb25QYXJlbnQgd2FsayBjYW5ub3Qgc3BhbiBkb2N1bWVudCBib3VuZGFyaWVzLlxuICAgICAgICAgICAgLy8gV2UgZGV0ZWN0IHRoaXMgYW5kIG1hbnVhbGx5IGluamVjdCB0aGUgY29udGFpbmVyLWVudGVyL2V4aXQgZm9yIHRoZVxuICAgICAgICAgICAgLy8gPGlmcmFtZT4gZWxlbWVudCBpdHNlbGYuXG4gICAgICAgICAgICBpZiAobmV3RG9jICE9PSBvbGREb2MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdJZnJhbWUgPSBTUkNvbnRyb2xsZXIuaG9zdElmcmFtZShuZXdXYWxrZXIuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRJZnJhbWUgPSBTUkNvbnRyb2xsZXIuaG9zdElmcmFtZShvbGRXYWxrZXI/LmdldE5vZGUoKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobmV3SWZyYW1lICYmICFvbGRJZnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW50ZXJpbmcgYW4gaWZyYW1lIHN1YmRvY3VtZW50IOKAlCBlbWl0IHRoZSBmcmFtZSBjb250YWluZXItZW50ZXIuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZUN1cnNvciA9IG5ldyBTUkN1cnNvcihuZXdJZnJhbWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50ZXIgPSBTUlJlbmRlcmVyLnJlbmRlckVudGVyKG1vZGUsIGlmcmFtZUN1cnNvciwgb2xkV2Fsa2VyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudGVyICYmIGVudGVyLnRyaW0oKSkgZW50ZXJpbmcucHVzaChlbnRlci50cmltKCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5ld0lmcmFtZSAmJiBvbGRJZnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTGVhdmluZyBhbiBpZnJhbWUgc3ViZG9jdW1lbnQg4oCUIGVtaXQgdGhlIGZyYW1lIGNvbnRhaW5lci1leGl0LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWVDdXJzb3IgPSBuZXcgU1JDdXJzb3Iob2xkSWZyYW1lLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVhdmUgPSBTUlJlbmRlcmVyLnJlbmRlckxlYXZlKG1vZGUgYXMgTmF2aWdhdGlvbk1vZGUsIGlmcmFtZUN1cnNvciwgb2xkV2Fsa2VyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlYXZlICYmIGxlYXZlLnRyaW0oKSkgbGVhdmluZy5wdXNoKGxlYXZlLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdJZnJhbWUgJiYgb2xkSWZyYW1lICYmIG5ld0lmcmFtZSAhPT0gb2xkSWZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmluZyBiZXR3ZWVuIHR3byBkaWZmZXJlbnQgaWZyYW1lcyDigJQgZXhpdCBvbGQsIGVudGVyIG5ldy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkQ3Vyc29yID0gbmV3IFNSQ3Vyc29yKG9sZElmcmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlYXZlID0gU1JSZW5kZXJlci5yZW5kZXJMZWF2ZShtb2RlIGFzIE5hdmlnYXRpb25Nb2RlLCBvbGRDdXJzb3IsIG9sZFdhbGtlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWF2ZSAmJiBsZWF2ZS50cmltKCkpIGxlYXZpbmcucHVzaChsZWF2ZS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDdXJzb3IgPSBuZXcgU1JDdXJzb3IobmV3SWZyYW1lLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudGVyID0gU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCBuZXdDdXJzb3IsIG9sZFdhbGtlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRlciAmJiBlbnRlci50cmltKCkpIGVudGVyaW5nLnB1c2goZW50ZXIudHJpbSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWZ0ZXIgaW5qZWN0aW5nIGlmcmFtZSBib3VuZGFyeSBhbm5vdW5jZW1lbnRzLCBhbHNvIHJ1biB0aGUgbm9ybWFsXG4gICAgICAgICAgICAgICAgLy8gd2l0aGluLWRvY3VtZW50IGRpZmZDb250YWluZXJzIGZvciBlYWNoIHNpZGUgaW5kZXBlbmRlbnRseSBzbyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gbGFuZG1hcmtzIGluc2lkZSB0aGUgaWZyYW1lIGFyZSBhbm5vdW5jZWQgY29ycmVjdGx5LlxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxlYXZpbmcsIGVudGVyaW5nIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIOKUgOKUgCBTYW1lLWRvY3VtZW50IHBhdGggKG9yaWdpbmFsIGxvZ2ljKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgICAgICAgIGNvbnN0IGRvY1Jvb3QgPSBuZXdXYWxrZXIgP1xuICAgICAgICAgICAgICAgIChuZXdXYWxrZXIuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQuYm9keSB8fCBuZXdXYWxrZXIuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA6XG4gICAgICAgICAgICAgICAgb2xkV2Fsa2VyID9cbiAgICAgICAgICAgICAgICAgICAgKG9sZFdhbGtlci5nZXROb2RlKCkub3duZXJEb2N1bWVudC5ib2R5IHx8IG9sZFdhbGtlci5nZXROb2RlKCkub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIDpcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGxldCB3YWxrTmV3ID0gbmV3V2Fsa2VyID8gbmV3V2Fsa2VyLmNsb25lKCkgOiAobmV3IFNSQ3Vyc29yKGRvY1Jvb3QpKTtcbiAgICAgICAgICAgIGxldCB3YWxrT2xkID0gb2xkV2Fsa2VyID8gb2xkV2Fsa2VyLmNsb25lKCkgOiAobmV3IFNSQ3Vyc29yKGRvY1Jvb3QpKTtcbiAgICAgICAgICAgIGlmICghd2Fsa05ldy5nZXROb2RlKCkuaXNTYW1lTm9kZSh3YWxrT2xkLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tbW9uUGFyZW50ID0gU1JDb250cm9sbGVyLmNvbW1vblBhcmVudCh3YWxrTmV3LCB3YWxrT2xkKTtcbiAgICAgICAgICAgICAgICBpZiAoY29tbW9uUGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiQilcIiwgY29tbW9uUGFyZW50LmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa05ldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiRW50ZXJpbmc6XCIsIHdhbGtOZXcuZ2V0Tm9kZSgpLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nLnB1c2goU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCB3YWxrTmV3LCB3YWxrT2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrTmV3LnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVudGVyaW5nLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgZW50ZXJpbmcgPSBlbnRlcmluZy5maWx0ZXIocyA9PiBzICYmIHMudHJpbSgpLmxlbmd0aCA+IDApLm1hcChzID0+IHMudHJpbSgpKTs7XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbW1vblBhcmVudC5jb250YWlucyh3YWxrT2xkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJMZWF2aW5nOlwiLCB3YWxrT2xkLmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nLnB1c2goU1JSZW5kZXJlci5yZW5kZXJMZWF2ZShtb2RlLCB3YWxrT2xkLCB3YWxrT2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrT2xkLnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxlYXZpbmcgPSBsZWF2aW5nLmZpbHRlcihzID0+IHMgJiYgcy50cmltKCkubGVuZ3RoID4gMCkubWFwKHMgPT4gcy50cmltKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2cobGVhdmluZywgZW50ZXJpbmcpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWF2aW5nLFxuICAgICAgICAgICAgZW50ZXJpbmdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb21tb25QYXJlbnQod2Fsa2VyT25lOiBTUkN1cnNvciwgd2Fsa2VyVHdvOiBTUkN1cnNvcik6IFNSQ3Vyc29yIHtcbiAgICAgICAgaWYgKHdhbGtlck9uZS5jb250YWlucyh3YWxrZXJUd28pKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fsa2VyT25lLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSBpZiAod2Fsa2VyVHdvLmNvbnRhaW5zKHdhbGtlck9uZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3YWxrZXJUd28uY2xvbmUoKTsgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29tbW9uUGFyZW50OiBTUkN1cnNvciA9IHdhbGtlck9uZS5jbG9uZSgpO1xuICAgICAgICAgICAgd2hpbGUgKCFjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa2VyVHdvKSAmJiBjb21tb25QYXJlbnQucGFyZW50KCkpO1xuICAgICAgICAgICAgaWYgKCFjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa2VyT25lKSB8fCAhY29tbW9uUGFyZW50LmNvbnRhaW5zKHdhbGtlclR3bykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gY29tbW9uUGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJBbGwobW9kZTogTmF2aWdhdGlvbk1vZGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBjdHJsID0gU1JDb250cm9sbGVyLmdldENvbnRyb2xsZXIoKTtcbiAgICAgICAgbGV0IGRpYWxvZ3MgPSBjdHJsLmN0cmxEb2MuYm9keS5xdWVyeVNlbGVjdG9yQWxsKFwiZGlhbG9nLFtyb2xlPSdkaWFsb2cnXVwiKTtcbiAgICAgICAgZGlhbG9ncy5mb3JFYWNoKGRpYWxvZyA9PiB7XG4gICAgICAgICAgICBpZiAoU1JVdGlsLmlzTW9kYWxEaWFsb2dFbGVtZW50KGRpYWxvZykpIHtcbiAgICAgICAgICAgICAgICBjdHJsLnNldFBvaW50T2ZSZWdhcmQoZGlhbG9nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgbGV0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgaW5pdGlhbCBpdGVtIGZpcnN0IChpZiB0aGVyZSBpcyBvbmUpXG4gICAgICAgIGxldCBzdGFydGVyTXNnID0gU1JSZW5kZXJlci5yZW5kZXJDdXJyZW50KG1vZGUsIGN0cmwuZ2V0UG9pbnRPZlJlZ2FyZCgpLCB7ZW50ZXJpbmc6IFtdLCBsZWF2aW5nOiBbXX0pO1xuICAgICAgICBpZiAoc3RhcnRlck1zZykge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHN0YXJ0ZXJNc2cubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKGJDb250aW51ZSkge1xuICAgICAgICAgICAgbGV0IG5leHRWYWwgPSBjdHJsLmp1bXBOZXh0KG1vZGUpO1xuICAgICAgICAgICAgaWYgKG5leHRWYWwuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChuZXh0VmFsLnJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJBbGxEZXRhaWwoZG9jOiBIVE1MRG9jdW1lbnQsIG1vZGU6IE5hdmlnYXRpb25Nb2RlKTogUmVuZGVyUmVzdWx0W10ge1xuICAgICAgICBsZXQgY3RybCA9IFNSQ29udHJvbGxlci5nZXRDb250cm9sbGVyKGRvYyk7XG4gICAgICAgIGN0cmwuc2V0UG9pbnRPZlJlZ2FyZChkb2MuYm9keSk7XG4gICAgICAgIGxldCBkaWFsb2dzID0gZG9jLmJvZHkucXVlcnlTZWxlY3RvckFsbChcImRpYWxvZyxbcm9sZT0nZGlhbG9nJ11cIik7XG4gICAgICAgIGRpYWxvZ3MuZm9yRWFjaChkaWFsb2cgPT4ge1xuICAgICAgICAgICAgaWYgKFNSVXRpbC5pc01vZGFsRGlhbG9nRWxlbWVudChkaWFsb2cpKSB7XG4gICAgICAgICAgICAgICAgY3RybC5zZXRQb2ludE9mUmVnYXJkKGRpYWxvZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGxldCByZXN1bHRzOiBSZW5kZXJSZXN1bHRbXSA9IFtdO1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGluaXRpYWwgaXRlbSBmaXJzdCAoaWYgdGhlcmUgaXMgb25lKVxuICAgICAgICBsZXQgc3RhcnRlck1zZyA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBjdHJsLmdldFBvaW50T2ZSZWdhcmQoKSwge2VudGVyaW5nOiBbXSwgbGVhdmluZzogW119KTtcbiAgICAgICAgaWYgKHN0YXJ0ZXJNc2cpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChzdGFydGVyTXNnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiQ29udGludWUgPSB0cnVlO1xuICAgICAgICB3aGlsZSAoYkNvbnRpbnVlKSB7XG4gICAgICAgICAgICBsZXQgbmV4dFZhbCA9IGN0cmwuanVtcE5leHQobW9kZSk7XG4gICAgICAgICAgICBpZiAobmV4dFZhbC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgLy8gbW9kZSA9PT0gXCJpdGVtXCIgJiYgY29uc29sZS5sb2cobmV4dFZhbCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKG5leHRWYWwucmVuZGVyaW5nUmVzdWx0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJTdHJ1Y3R1cmUoZG9jOiBIVE1MRG9jdW1lbnQpOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiB7XG4gICAgICAgIGNvbnN0IG1vZGVzOiBOYXZpZ2F0aW9uTW9kZVtdID0gWyBcInJlZ2lvblwiLCBcImhlYWRpbmdcIiwgXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCIsIFwiaW1hZ2VcIiBdO1xuICAgICAgICBsZXQgZGV0YWlscyA9IG1vZGVzLm1hcChtb2RlTGFiZWwgPT4gU1JDb250cm9sbGVyLnJlbmRlckFsbERldGFpbChkb2MsIG1vZGVMYWJlbCkpO1xuICAgICAgICBsZXQgcmV0VmFsOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiA9IFtdO1xuICAgICAgICB3aGlsZSAoZGV0YWlscy5zb21lKGRldGFpbCA9PiBkZXRhaWwubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZGV0YWlsc1swXVswXT8uc3RhcnQ7XG4gICAgICAgICAgICBtb2Rlcy5mb3JFYWNoKChtb2RlLCBpZHgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1tpZHhdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8IFNSQ3Vyc29yLmNvbXBhcmUoZGV0YWlsc1tpZHhdWzBdLnN0YXJ0LCBuZXh0KSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBkZXRhaWxzW2lkeF1bMF0uc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGV0IG5leHRJdGVtOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgICAgICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIG1vZGVzLmZvckVhY2goKG1vZGUsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIG5leHRJdGVtW21vZGVdID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1tpZHhdLmxlbmd0aCA+IDAgJiYgU1JDdXJzb3IuY29tcGFyZShkZXRhaWxzW2lkeF1bMF0uc3RhcnQsIG5leHQpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRJdGVtW21vZGVdID0gZGV0YWlsc1tpZHhdLnNoaWZ0KCkubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgaGFzVmFsdWUgPSBuZXh0SXRlbVttb2RlXSAhPT0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGhhc1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5leHQuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gZWxlbSAmJiBTUlV0aWwuZ2V0VW5pcXVlU2VsZWN0b3IoZWxlbSk7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBlbGVtZW50J3Mgb3duIGRvY3VtZW50IGZvciBxdWVyeVNlbGVjdG9yIHNvIHRoYXQgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAvLyBpbnNpZGUgaWZyYW1lIHN1YmRvY3VtZW50cyByZXNvbHZlIGNvcnJlY3RseS5cbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtRG9jID0gZWxlbT8ub3duZXJEb2N1bWVudCA/PyBkb2M7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yICYmIGVsZW1Eb2MucXVlcnlTZWxlY3RvcihzZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZW0uc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0VmFsLnB1c2gobmV4dEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufSIsImltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBY2Nlc3NpYmxlTmFtZVJlc3VsdCwgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFNSVXRpbCB9IGZyb20gXCIuL1NSVXRpbFwiO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHR5cGUgZm9yIG1hdGNoaW5nIG5vZGVzIGR1cmluZyBjdXJzb3IgbmF2aWdhdGlvblxuICogQHBhcmFtIHJvbGUgLSBUaGUgQVJJQSByb2xlIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAqIEBwYXJhbSBiU3RhcnRUYWcgLSBXaGV0aGVyIHRoaXMgaXMgYSBzdGFydCB0YWcgKHRydWUpIG9yIGVuZCB0YWcgKGZhbHNlKVxuICogQHBhcmFtIG5vZGUgLSBUaGUgRE9NIG5vZGUgYmVpbmcgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNyaXRlcmlhLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IHR5cGUgU1JDdXJzb3JNYXRjaEZ1bmMgPSAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IGJvb2xlYW47XG5cbmV4cG9ydCB0eXBlIFNSQ3Vyc29yU2tpcEZ1bmMgPSAoY3Vyc29yOiBTUkN1cnNvcikgPT4geyBza2lwQ3VycmVudDogYm9vbGVhbiwgc2tpcENoaWxkcmVuOiBib29sZWFufSB8IG51bGw7XG5cbi8qKlxuICogU1JDdXJzb3IgKFNjcmVlbiBSZWFkZXIgQ3Vyc29yKSBjbGFzc1xuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBjdXJzb3ItbGlrZSBpbnRlcmZhY2UgZm9yIG5hdmlnYXRpbmcgdGhlIERPTSBpbiBhIHdheSB0aGF0XG4gKiBzaW11bGF0ZXMgaG93IHNjcmVlbiByZWFkZXJzIHByb2Nlc3MgYW5kIG5hdmlnYXRlIGNvbnRlbnQuIEl0IHRyYWNrczpcbiAqIC0gVGhlIGN1cnJlbnQgbm9kZSBwb3NpdGlvblxuICogLSBXaGV0aGVyIGl0J3MgYXQgYSBzdGFydCBvciBlbmQgdGFnXG4gKiAtIFRoZSBBUklBIHJvbGUgb2YgdGhlIGN1cnJlbnQgbm9kZVxuICogLSBUaGUgYWNjZXNzaWJsZSBuYW1lIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAqL1xuZXhwb3J0IGNsYXNzIFNSQ3Vyc29yIHtcbiAgICAvKiogVGhlIEFSSUEgcm9sZSBvZiB0aGUgY3VycmVudCBub2RlICovXG4gICAgcHJpdmF0ZSByb2xlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb21wdXRlZCBhY2Nlc3NpYmxlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbm9kZSAqL1xuICAgIHByaXZhdGUgbmFtZTogQWNjZXNzaWJsZU5hbWVSZXN1bHQ7XG4gICAgLyoqIFRoZSB1bmRlcmx5aW5nIERPTSB3YWxrZXIgdGhhdCBoYW5kbGVzIG5vZGUgdHJhdmVyc2FsICovXG4gICAgcHJpdmF0ZSB3YWxrZXI6IERPTVdhbGtlcjtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBhdCBhIHRleHQgbm9kZSBpbnNpZGUgYSBwcmVmb3JtYXR0ZWQgc2VnbWVudFxuICAgICAqIChlLmcuIDxwcmU+KSwgdGhpcyBpbmRleCBpZGVudGlmaWVzIHdoaWNoIG5ld2xpbmUtZGVsaW1pdGVkIGxpbmUgaXMgdGhlXG4gICAgICogY3VycmVudCByZWFkaW5nIHBvc2l0aW9uLiAgdW5kZWZpbmVkIG1lYW5zIFwibm90IGluIGEgcHJlZm9ybWF0dGVkIGNvbnRleHRcIi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlTGluZUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUkN1cnNvciBwb3NpdGlvbmVkIGF0IHRoZSBzcGVjaWZpZWQgZWxlbWVudFxuICAgICAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIERPTSBub2RlIHRvIHBvc2l0aW9uIHRoZSBjdXJzb3IgYXRcbiAgICAgKiBAcGFyYW0gYkVuZCAtIFdoZXRoZXIgdG8gcG9zaXRpb24gYXQgdGhlIGVuZCB0YWcgKHRydWUpIG9yIHN0YXJ0IHRhZyAoZmFsc2UpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZWxlbWVudCA6IE5vZGUsIGJFbmQ/IDogYm9vbGVhbikge1xuICAgICAgICAvLyBVc2UgRE9NV2Fsa2VyIHdpdGggY29uc2lkZXJIaWRkZW49ZmFsc2UgdG8gcHJvY2VzcyBhbGwgY29udGVudCAoaW5jbHVkaW5nIGhpZGRlbiBlbGVtZW50cylcbiAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHNjcmVlbiByZWFkZXIgc2ltdWxhdGlvbiB3aGljaCBuZWVkcyB0byBzZWUgYWxsIGNvbnRlbnRcbiAgICAgICAgdGhpcy53YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQsIGJFbmQsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBjdXJzb3IgYXQgdGhlIHNhbWUgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBTUkN1cnNvciBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIHBvc2l0aW9uIGFuZCBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgY2xvbmUoKSA6IFNSQ3Vyc29yIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IG5ldyBTUkN1cnNvcih0aGlzLndhbGtlci5ub2RlLCB0aGlzLndhbGtlci5iRW5kVGFnKTtcbiAgICAgICAgcmV0VmFsLnJvbGUgPSB0aGlzLnJvbGU7XG4gICAgICAgIHJldFZhbC5uYW1lID0gdGhpcy5uYW1lO1xuICAgICAgICByZXRWYWwucHJlTGluZUluZGV4ID0gdGhpcy5wcmVMaW5lSW5kZXg7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgcm9sZSBhbmQgYWNjZXNzaWJsZSBuYW1lIHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbm9kZVxuICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjdXJzb3IgcG9zaXRpb24gY2hhbmdlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWZyZXNoTmFtZSgpIHtcbiAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIEVsZW1lbnQgbm9kZVxuICAgICAgICAgICAgdGhpcy5yb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIC8vIFRleHQgbm9kZVxuICAgICAgICAgICAgdGhpcy5yb2xlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB7IG5hbWU6IHRoaXMud2Fsa2VyLm5vZGUudGV4dENvbnRlbnQsIG5hbWVGcm9tOiBcInRleHRcIiB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXIgbm9kZSB0eXBlc1xuICAgICAgICAgICAgdGhpcy5yb2xlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgY3JpdGVyaWFcbiAgICAgKiBAcGFyYW0gbWF0Y2hpbmdGdW5jIC0gRnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGEgbm9kZSBtYXRjaGVzIHRoZSBzZWFyY2ggY3JpdGVyaWFcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgbm9kZSB3YXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHB1YmxpYyBuZXh0KG1hdGNoaW5nRnVuYzogU1JDdXJzb3JNYXRjaEZ1bmMsIHNraXBGdW5jPzogU1JDdXJzb3JTa2lwRnVuYykgOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTtcblxuICAgICAgICAvLyBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBsZXQgZm91bmROZXh0ID0gZmFsc2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBza2lwIGluZm8gZm9yIHRoZSBjdXJyZW50IHNwb3RcbiAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKGBuZXh0IGZ1bmN0aW9uYCk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHRoaXMuaXNFbmRUYWcoKT9cIi9cIjpcIlwiLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgIGxldCB7IHNraXBDdXJyZW50LCBza2lwQ2hpbGRyZW4gfSA9IChza2lwRnVuYyAmJiBza2lwRnVuYyh0aGlzKSkgfHwgeyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJza2lwQ3VycmVudDpcIiwgc2tpcEN1cnJlbnQsIFwic2tpcENoaWxkcmVuOlwiLCBza2lwQ2hpbGRyZW4pO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIE1vdmUgYXMgYXBwcm9wcmlhdGUgZnJvbSB0aGUgY3VycmVudCBzcG90XG4gICAgICAgICAgICBpZiAoc2tpcENoaWxkcmVuICYmICF0aGlzLndhbGtlci5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53YWxrZXIuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLndhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2tpcCBpbmZvIGZvciB0aGUgbmV3IHNwb3RcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHRoaXMuaXNFbmRUYWcoKT9cIi9cIjpcIlwiLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgICAgICAoeyBza2lwQ3VycmVudCwgc2tpcENoaWxkcmVuIH0gPSAoc2tpcEZ1bmMgJiYgc2tpcEZ1bmModGhpcykpIHx8IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH0pO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJza2lwQ3VycmVudDpcIiwgc2tpcEN1cnJlbnQsIFwic2tpcENoaWxkcmVuOlwiLCBza2lwQ2hpbGRyZW4pO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgcm9sZSBiYXNlZCBvbiBub2RlIHR5cGVcbiAgICAgICAgICAgIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoU1JVdGlsLmlzTW9kYWxEaWFsb2dFbGVtZW50KHRoaXMuZ2V0Tm9kZSgpKSAmJiB0aGlzLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFza2lwQ3VycmVudCkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBtYXRjaGVzIG91ciBjcml0ZXJpYVxuICAgICAgICAgICAgICAgIGZvdW5kTmV4dCA9IG1hdGNoaW5nRnVuYyh0aGlzLnJvbGUsICF0aGlzLndhbGtlci5iRW5kVGFnLCB0aGlzLndhbGtlci5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoIWZvdW5kTmV4dCk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiZm91bmROZXh0OlwiLCBmb3VuZE5leHQsIHRoaXMuaXNFbmRUYWcoKT9cIi9cIjpcIlwiLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUuZ3JvdXBFbmQoKTtcblxuICAgICAgICBpZiAoZm91bmROZXh0KSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hOYW1lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSZXNldCBwcm9wZXJ0aWVzIGlmIG5vIG1hdGNoIHdhcyBmb3VuZFxuICAgICAgICAgICAgdGhpcy5yb2xlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZE5leHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgbm9kZSB0aGF0IG1hdGNoZXMgdGhlIHByb3ZpZGVkIGNyaXRlcmlhXG4gICAgICogQHBhcmFtIG1hdGNoaW5nRnVuYyAtIEZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyBpZiBhIG5vZGUgbWF0Y2hlcyB0aGUgc2VhcmNoIGNyaXRlcmlhXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIG5vZGUgd2FzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmlvdXMobWF0Y2hpbmdGdW5jOiBTUkN1cnNvck1hdGNoRnVuYywgc2tpcEZ1bmM/OiBTUkN1cnNvclNraXBGdW5jKSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBsZXQgZm91bmRQcmV2aW91cyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc2tpcCBpbmZvIGZvciB0aGUgY3VycmVudCBzcG90XG4gICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cChgcHJldmlvdXMgZnVuY3Rpb25gKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2codGhpcy5pc0VuZFRhZygpLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgIGxldCB7IHNraXBDdXJyZW50LCBza2lwQ2hpbGRyZW4gfSA9IChza2lwRnVuYyAmJiBza2lwRnVuYyh0aGlzKSkgfHwgeyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbik7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIE1vdmUgYXMgYXBwcm9wcmlhdGUgZnJvbSB0aGUgY3VycmVudCBzcG90XG4gICAgICAgICAgICBpZiAoc2tpcENoaWxkcmVuICYmIHRoaXMud2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIlNraXBwaW5nIG5vZGVcIilcbiAgICAgICAgICAgICAgICB0aGlzLndhbGtlci5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLndhbGtlci5wcmV2Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2tpcCBpbmZvIGZvciB0aGUgbmV3IHNwb3RcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHRoaXMuaXNFbmRUYWcoKSwgdGhpcy5nZXROb2RlKCkpO1xuICAgICAgICAgICAgKHsgc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbiB9ID0gKHNraXBGdW5jICYmIHNraXBGdW5jKHRoaXMpKSB8fCB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHNraXBDdXJyZW50LCBza2lwQ2hpbGRyZW4pO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgcm9sZSBiYXNlZCBvbiBub2RlIHR5cGVcbiAgICAgICAgICAgIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoU1JVdGlsLmlzTW9kYWxEaWFsb2dFbGVtZW50KHRoaXMuZ2V0Tm9kZSgpKSAmJiAhdGhpcy5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXNraXBDdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIG1hdGNoZXMgb3VyIGNyaXRlcmlhXG4gICAgICAgICAgICAgICAgZm91bmRQcmV2aW91cyA9IG1hdGNoaW5nRnVuYyh0aGlzLnJvbGUsICF0aGlzLndhbGtlci5iRW5kVGFnLCB0aGlzLndhbGtlci5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoIWZvdW5kUHJldmlvdXMpO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyh0aGlzLmlzRW5kVGFnKCksIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICBpZiAoZm91bmRQcmV2aW91cykge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVzZXQgcHJvcGVydGllcyBpZiBubyBtYXRjaCB3YXMgZm91bmRcbiAgICAgICAgICAgIHRoaXMucm9sZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm91bmRQcmV2aW91cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgY3VycmVudCBub2RlXG4gICAgICogQHBhcmFtIGVuZFRhZyAtIFdoZXRoZXIgdG8gcG9zaXRpb24gYXQgdGhlIGVuZCB0YWcgKHRydWUpIG9yIHN0YXJ0IHRhZyAoZmFsc2UpXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgbW92ZWQgdG8gcGFyZW50LCBmYWxzZSBpZiBubyBwYXJlbnQgZXhpc3RzXG4gICAgICovXG4gICAgcHVibGljIHBhcmVudChlbmRUYWc/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy53YWxrZXIubm9kZS5wYXJlbnROb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMud2Fsa2VyLm5vZGUgPSB0aGlzLndhbGtlci5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIHRoaXMud2Fsa2VyLmJFbmRUYWcgPSBlbmRUYWcgPT09IHRydWU7XG4gICAgICAgIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy53YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgdGhpcy5yb2xlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB7IG5hbWU6IHRoaXMud2Fsa2VyLm5vZGUudGV4dENvbnRlbnQsIG5hbWVGcm9tOiBcInRleHRcIiB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb2xlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdXAgdGhlIERPTSB0cmVlIHVudGlsIGZpbmRpbmcgYSBub2RlIHdpdGggYSBtYXRjaGluZyByb2xlIG9yIGVsZW1lbnQgbmFtZVxuICAgICAqIEBwYXJhbSByb2xlcyAtIEFycmF5IG9mIEFSSUEgcm9sZXMgdG8gbWF0Y2hcbiAgICAgKiBAcGFyYW0gZWxlbXMgLSBPcHRpb25hbCBhcnJheSBvZiBlbGVtZW50IG5hbWVzIHRvIG1hdGNoXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIG5vZGUgd2FzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlKHJvbGVzOiBzdHJpbmdbXSwgZWxlbXM/OiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCB1cHBFbGVtcyA9IGVsZW1zID8gZWxlbXMubWFwKGVsZW0gPT4gZWxlbS50b1VwcGVyQ2FzZSgpKSA6IFtdO1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gKHdhbGtlcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB3YWxrZXIuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJvbGVzLmluY2x1ZGVzKHRoaXMuZ2V0Um9sZSgpKVxuICAgICAgICAgICAgfHwgKGVsZW0gJiYgIWVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiB1cHBFbGVtcy5pbmNsdWRlcyhlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoIW1hdGNoZXModGhpcykgJiYgdGhpcy5wYXJlbnQoKSk7XG4gICAgICAgIHJldHVybiBtYXRjaGVzKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY3Vyc29yIGFuZCBtb3ZlcyBpdCB1cCB0aGUgRE9NIHRyZWUgdW50aWwgZmluZGluZyBhIG5vZGUgd2l0aCBhIG1hdGNoaW5nIHJvbGUgb3IgZWxlbWVudCBuYW1lXG4gICAgICogQHBhcmFtIHJvbGVzIC0gQXJyYXkgb2YgQVJJQSByb2xlcyB0byBtYXRjaFxuICAgICAqIEBwYXJhbSBlbGVtcyAtIE9wdGlvbmFsIGFycmF5IG9mIGVsZW1lbnQgbmFtZXMgdG8gbWF0Y2hcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBjdXJzb3IgYXQgdGhlIG1hdGNoaW5nIG5vZGUsIG9yIG51bGwgaWYgbm8gbWF0Y2ggZm91bmRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUocm9sZXM6IHN0cmluZ1tdLCBlbGVtcz86IHN0cmluZ1tdKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIGlmIChyZXRWYWwuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlKHJvbGVzLCBlbGVtcykpIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRPclBhcmVudFRhYmJhYmxlQ2xvbmUoKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHdoaWxlIChyZXRWYWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSByZXRWYWwuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgaWYgKHJldFZhbC5pc1N0YXJ0VGFnKCkgJiYgZWxlbSAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZXRWYWwucGFyZW50KGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIEFSSUEgcm9sZSBvZiB0aGUgY3VycmVudCBub2RlXG4gICAgICogQHJldHVybnMgVGhlIEFSSUEgcm9sZSBhcyBhIHN0cmluZywgb3IgdW5kZWZpbmVkIGlmIG5vdCBhdmFpbGFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Um9sZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5yb2xlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFjY2Vzc2libGUgbmFtZSBpbmZvIGZvciB0aGUgY3VycmVudCBub2RlXG4gICAgICogQHJldHVybnMgVGhlIEFjY2Vzc2libGVOYW1lUmVzdWx0IG9iamVjdCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBhdmFpbGFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmFtZUluZm8oKTogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYWNjZXNzaWJsZSBuYW1lIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICAvLyBIYW5kbGUgb25lLW9mZiBxdWlya3MgaW4gdGhlIG5hbWUgY2FsY3VsYXRpb25cbiAgICAgICAgY29uc3QgbmFtZUluZm8gPSB0aGlzLmdldE5hbWVJbmZvKCk7XG4gICAgICAgIGlmIChuYW1lSW5mbyAmJiBuYW1lSW5mby5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gbmFtZUluZm8ubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtID0gdGhpcy5nZXRFbGVtZW50KCk7XG4gICAgICAgIGlmIChlbGVtKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGVtLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxFbGVtLmlubmVyVGV4dCB8fCBsYWJlbEVsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGN1cnNvciBpcyBhdCBhbiBlbmQgdGFnIG9yIHN0YXJ0IHRhZ1xuICAgICAqIEBwYXJhbSB2YWwgLSBUcnVlIGZvciBlbmQgdGFnLCBmYWxzZSBmb3Igc3RhcnQgdGFnXG4gICAgICovXG4gICAgcHVibGljIHNldEVuZFRhZyh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy53YWxrZXIuYkVuZFRhZyA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBET00gbm9kZSBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBET00gbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53YWxrZXIubm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IG5vZGUgYXMgYW4gSFRNTEVsZW1lbnQgaWYgaXQgaXMgYW4gZWxlbWVudCBub2RlXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgbm9kZSBhcyBIVE1MRWxlbWVudCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBhbiBlbGVtZW50XG4gICAgICovXG4gICAgcHVibGljIGdldEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy53YWxrZXIubm9kZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzLndhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJlbnRFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMud2Fsa2VyLm5vZGUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcmV0VmFsID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXRWYWwud2Fsa2VyLm5vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChyZXRWYWwud2Fsa2VyLm5vZGUpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQgYXQgYW4gZW5kIHRhZ1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYXQgYW4gZW5kIHRhZywgZmFsc2UgaWYgYXQgYSBzdGFydCB0YWdcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFbmRUYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhbGtlci5iRW5kVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQgYXQgYW4gZW5kIHRhZ1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYXQgYW4gZW5kIHRhZywgZmFsc2UgaWYgYXQgYSBzdGFydCB0YWdcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdGFydFRhZygpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLndhbGtlci5iRW5kVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBhcmVzIHRoZSBkb2N1bWVudCBwb3NpdGlvbiBvZiB0d28gY3Vyc29yc1xuICAgICAqIEBwYXJhbSBvbmUgLSBGaXJzdCBjdXJzb3IgdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSB0d28gLSBTZWNvbmQgY3Vyc29yIHRvIGNvbXBhcmVcbiAgICAgKiBAcmV0dXJucyAwIGlmIGVxdWFsLCAtMSBpZiBvbmUgaXMgYmVmb3JlIHR3bywgMSBpZiBvbmUgaXMgYWZ0ZXIgdHdvXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjb21wYXJlKG9uZTogU1JDdXJzb3IgfCBudWxsLCB0d286IFNSQ3Vyc29yIHwgbnVsbCkge1xuICAgICAgICBjb25zdCBub2RlT25lID0gb25lPy53YWxrZXI/Lm5vZGU7XG4gICAgICAgIGNvbnN0IG5vZGVUd28gPSB0d28/LndhbGtlcj8ubm9kZTtcbiAgICAgICAgaWYgKCFub2RlT25lICYmICFub2RlVHdvKSByZXR1cm4gMDtcbiAgICAgICAgaWYgKCFub2RlT25lKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKCFub2RlVHdvKSByZXR1cm4gLTE7XG5cbiAgICAgICAgLy8gV2hlbiBib3RoIGN1cnNvcnMgYXJlIGF0IHRoZSBzYW1lIDxwcmU+IGVsZW1lbnQgYW5kIGF0IGxlYXN0IG9uZSBoYXMgYVxuICAgICAgICAvLyBwcmVMaW5lSW5kZXgsIHVzZSBsaW5lIGluZGV4IG9yZGVyaW5nIHNvIHZpcnR1YWwgcGVyLWxpbmUgc3RvcHMgYXJlIHNlcXVlbmNlZFxuICAgICAgICAvLyBjb3JyZWN0bHkuICBwcmVMaW5lSW5kZXg9dW5kZWZpbmVkIG1lYW5zIHRoZSBibG9jay1lbnRlciBzdG9wLCB3aGljaCBjb21lc1xuICAgICAgICAvLyBiZWZvcmUgYWxsIG51bWJlcmVkIGxpbmVzICh1bmRlZmluZWQgPCAwIDwgMSA8IDIg4oCmKS5cbiAgICAgICAgaWYgKG5vZGVPbmUgPT09IG5vZGVUd28gJiYgIW9uZS53YWxrZXIuYkVuZFRhZyAmJiAhdHdvLndhbGtlci5iRW5kVGFnKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lT25lVW5kZWZpbmVkID0gb25lLnByZUxpbmVJbmRleCA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbGluZVR3b1VuZGVmaW5lZCA9IHR3by5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghbGluZU9uZVVuZGVmaW5lZCB8fCAhbGluZVR3b1VuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIEF0IGxlYXN0IG9uZSBjdXJzb3IgaGFzIGEgbGluZSBpbmRleFxuICAgICAgICAgICAgICAgIGlmIChsaW5lT25lVW5kZWZpbmVkKSByZXR1cm4gLTE7ICAvLyB1bmRlZmluZWQgKGJsb2NrLWVudGVyKSBzb3J0cyBiZWZvcmUgYWxsIGxpbmVzXG4gICAgICAgICAgICAgICAgaWYgKGxpbmVUd29VbmRlZmluZWQpIHJldHVybiAxOyAgIC8vIHR3byBpcyBibG9jay1lbnRlcjsgb25lIChhIG51bWJlcmVkIGxpbmUpIGlzIGFmdGVyXG4gICAgICAgICAgICAgICAgaWYgKG9uZS5wcmVMaW5lSW5kZXggIT09IHR3by5wcmVMaW5lSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uZS5wcmVMaW5lSW5kZXggPCB0d28ucHJlTGluZUluZGV4ID8gLTEgOiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IGRvY1Bvc2l0aW9uID0gbm9kZU9uZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlVHdvKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEhhbmRsZSBkaXNjb25uZWN0ZWQgbm9kZXMgKGRpZmZlcmVudCBkb2N1bWVudHMgb3Igc2hhZG93IERPTXMpXG4gICAgICAgIGlmIChkb2NQb3NpdGlvbiAmIDB4MSkge1xuICAgICAgICAgICAgLy8gTm9kZXMgYXJlIGRpc2Nvbm5lY3RlZCAtIHRoZXkncmUgaW4gZGlmZmVyZW50IHRyZWVzIChpZnJhbWUgb3Igc2hhZG93IERPTSlcbiAgICAgICAgICAgIC8vIEJ1aWxkIGFuY2VzdG9yIGNoYWlucyB1c2luZyBET01XYWxrZXIucGFyZW50Tm9kZSAoaGFuZGxlcyBzaGFkb3cgRE9NICYgaWZyYW1lcylcbiAgICAgICAgICAgIGxldCBhbmNlc3RvcnNPbmU6IE5vZGVbXSA9IFtub2RlT25lXTtcbiAgICAgICAgICAgIGxldCBhbmNlc3RvcnNUd286IE5vZGVbXSA9IFtub2RlVHdvXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IGN1cnJlbnQ6IE5vZGUgfCBudWxsID0gbm9kZU9uZTtcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgICBhbmNlc3RvcnNPbmUucHVzaChjdXJyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY3VycmVudCA9IG5vZGVUd287XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgICAgYW5jZXN0b3JzVHdvLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFJldmVyc2Ugc28gcm9vdCBpcyBmaXJzdFxuICAgICAgICAgICAgYW5jZXN0b3JzT25lLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGFuY2VzdG9yc1R3by5yZXZlcnNlKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEZpbmQgd2hlcmUgdGhlIHBhdGhzIGRpdmVyZ2VcbiAgICAgICAgICAgIGxldCBjb21tb25EZXB0aCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoY29tbW9uRGVwdGggPCBhbmNlc3RvcnNPbmUubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgY29tbW9uRGVwdGggPCBhbmNlc3RvcnNUd28ubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgYW5jZXN0b3JzT25lW2NvbW1vbkRlcHRoXSA9PT0gYW5jZXN0b3JzVHdvW2NvbW1vbkRlcHRoXSkge1xuICAgICAgICAgICAgICAgIGNvbW1vbkRlcHRoKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIElmIG9uZSBwYXRoIGlzIGEgcHJlZml4IG9mIHRoZSBvdGhlciwgaGFuZGxlIGNvbnRhaW5tZW50XG4gICAgICAgICAgICBpZiAoY29tbW9uRGVwdGggPT09IGFuY2VzdG9yc09uZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBub2RlT25lIGlzIGFuIGFuY2VzdG9yIG9mIG5vZGVUd29cbiAgICAgICAgICAgICAgICByZXR1cm4gb25lLndhbGtlci5iRW5kVGFnID8gMSA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbW1vbkRlcHRoID09PSBhbmNlc3RvcnNUd28ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gbm9kZVR3byBpcyBhbiBhbmNlc3RvciBvZiBub2RlT25lXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR3by53YWxrZXIuYkVuZFRhZyA/IC0xIDogMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ29tcGFyZSB0aGUgbm9kZXMgd2hlcmUgcGF0aHMgZGl2ZXJnZVxuICAgICAgICAgICAgaWYgKGNvbW1vbkRlcHRoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZE9uZSA9IGFuY2VzdG9yc09uZVtjb21tb25EZXB0aF07XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkVHdvID0gYW5jZXN0b3JzVHdvW2NvbW1vbkRlcHRoXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRQb3NpdGlvbiA9IGNoaWxkT25lLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGNoaWxkVHdvKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRQb3NpdGlvbiAmIDB4MikgcmV0dXJuIDE7ICAvLyBjaGlsZFR3byBwcmVjZWRlcyBjaGlsZE9uZVxuICAgICAgICAgICAgICAgIGlmIChjaGlsZFBvc2l0aW9uICYgMHg0KSByZXR1cm4gLTE7IC8vIGNoaWxkT25lIHByZWNlZGVzIGNoaWxkVHdvXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE5vIGNvbW1vbiBhbmNlc3RvciBmb3VuZCAtIHNob3VsZG4ndCBoYXBwZW4gaW4gYSB3ZWxsLWZvcm1lZCBkb2N1bWVudFxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChkb2NQb3NpdGlvbiAmIDB4OCkge1xuICAgICAgICAgICAgLy8gb25lIGlzIGNvbnRhaW5lZCB3aXRoaW4gdHdvXG4gICAgICAgICAgICAvLyBpZiB0d28gaXMgYW4gZW5kIHRhZywgb25lIGlzIGJlZm9yZSwgb3RoZXJ3aXNlLCBvbmUgaXMgYWZ0ZXJcbiAgICAgICAgICAgIHJldHVybiB0d28ud2Fsa2VyLmJFbmRUYWcgPyAtMSA6IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9jUG9zaXRpb24gJiAweDEwKSB7XG4gICAgICAgICAgICAvLyB0d28gaXMgY29udGFpbmVkIHdpdGhpbiBvbmVcbiAgICAgICAgICAgIC8vIGlmIG9uZSBpcyBhbiBlbmQgdGFnLCBvbmUgaXMgYWZ0ZXIsIG90aGVyd2lzZSwgb25lIGlzIGJlZm9yZVxuICAgICAgICAgICAgcmV0dXJuIG9uZS53YWxrZXIuYkVuZFRhZyA/IDEgOiAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChkb2NQb3NpdGlvbiAmIDB4Mikge1xuICAgICAgICAgICAgLy8gdHdvIHByZWNlZGVzIG9uZSBpbiB0aGUgZG9jdW1lbnRcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9IGVsc2UgaWYgKGRvY1Bvc2l0aW9uICYgMHg0KSB7XG4gICAgICAgICAgICAvLyBvbmUgcHJlY2VkZXMgdHdvIGluIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIGN1cnNvcidzIG5vZGUgY29udGFpbnMgYW5vdGhlciBjdXJzb3IncyBub2RlXG4gICAgICogQHBhcmFtIG90aGVyIC0gVGhlIG90aGVyIGN1cnNvciB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBjdXJzb3IgY29udGFpbnMgKGlzIGEgcGFyZW50L2FuY2VzdG9yIG9mKSB0aGUgb3RoZXIgY3Vyc29yJ3Mgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBjb250YWlucyhvdGhlcjogU1JDdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZSgpLmNvbnRhaW5zKG90aGVyLmdldE5vZGUoKSlcbiAgICAgICAgICAgICYmICF0aGlzLmlzU2FtZU5vZGUob3RoZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIGN1cnNvciBwb2ludHMgdG8gdGhlIHNhbWUgbm9kZSBhcyBhbm90aGVyIGN1cnNvclxuICAgICAqIEBwYXJhbSBvdGhlciAtIFRoZSBvdGhlciBjdXJzb3IgdG8gY29tcGFyZSB3aXRoXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBib3RoIGN1cnNvcnMgcG9pbnQgdG8gdGhlIHNhbWUgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1NhbWVOb2RlKG90aGVyOiBTUkN1cnNvcikge1xuICAgICAgICBpZiAoIW90aGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE5vZGUoKS5pc1NhbWVOb2RlKG90aGVyLmdldE5vZGUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIGEgbm9uLWVtcHR5IGFjY2Vzc2libGUgbmFtZVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaGFzIGEgbm9uLWVtcHR5IGFjY2Vzc2libGUgbmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNOb25FbXB0eU5hbWUoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5nZXROYW1lSW5mbygpPy5uYW1lIHx8IFwiXCIpLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIH1cblxufSIsImltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uTW9kZSB9IGZyb20gXCIuL1NSVHlwZXNcIjtcbmltcG9ydCB7IFNSQ3Vyc29yLCBTUkN1cnNvck1hdGNoRnVuYywgU1JDdXJzb3JTa2lwRnVuYyB9IGZyb20gXCIuL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcblxuZXhwb3J0IG5hbWVzcGFjZSBTUk5hdmlnYXRvciB7XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIGlmIGEgbm9kZSBpcyBhIGJsb2NrLWxldmVsIGVsZW1lbnQgYmFzZWQgb24gaXRzIGRpc3BsYXkgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0gbm9kZSBUaGUgRE9NIG5vZGUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIGlzIGEgYmxvY2stbGV2ZWwgZWxlbWVudCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNCbG9ja0VsZW1lbnQobm9kZTogTm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoW1wiYnJcIiwgXCJpZnJhbWVcIl0uaW5jbHVkZXMobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBteXdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgICAgY29uc3QgZGlzcCA9IG15d2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSk/LmRpc3BsYXk7XG4gICAgICAgIGlmIChkaXNwICYmIGRpc3Auc3RhcnRzV2l0aChcInRhYmxlXCIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGRpc3AgPT09IFwiYmxvY2tcIiAmJiBlbGVtLnN0eWxlLmRpc3BsYXkgIT09IFwiYmxvY2tcIikge1xuICAgICAgICAgICAgLy8gSXMgdGhpcyBibG9jayBiZWNhdXNlIGl0J3MgYSBmbGV4IGVsZW0/XG4gICAgICAgICAgICBpZiAoZWxlbS5wYXJlbnRFbGVtZW50ICYmIG15d2luLmdldENvbXB1dGVkU3R5bGUoZWxlbS5wYXJlbnRFbGVtZW50KS5kaXNwbGF5ID09PSBcImZsZXhcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0sIHRydWUpID09PSBcImxpbmtcIikge1xuICAgICAgICAgICAgbGV0IHRlbXAgPSBuZXcgRE9NV2Fsa2VyKG5vZGUsIGZhbHNlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgICAgIHRlbXAucHJldk5vZGUoKTtcbiAgICAgICAgICAgIGlmICghaXNCbG9ja0VsZW1lbnQodGVtcC5ub2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXCJibG9ja1wiLCBcImZsZXhcIiwgXCJncmlkXCIsIFwibGlzdC1pdGVtXCJdLmluY2x1ZGVzKGRpc3ApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3QgYWxsIGxvZ2ljYWwgbGluZXMgZnJvbSBhIDxwcmU+IGVsZW1lbnQgYnkgd2Fsa2luZyBpdHMgZW50aXJlIHN1YnRyZWVcbiAgICAgKiAodmlhIERPTVdhbGtlciwgc2hhZG93LURPTSBzYWZlKSBhbmQgY29uY2F0ZW5hdGluZyB0ZXh0IG5vZGUgY29udGVudCwgc3BsaXR0aW5nXG4gICAgICogb24gbmV3bGluZXMuICBPbmx5IGlubGluZS1jb250ZXh0IG5vZGVzIGFyZSBpbmNsdWRlZCDigJQgYW55IGRlc2NlbmRhbnQgYmxvY2tcbiAgICAgKiBlbGVtZW50IHdvdWxkIGJlIHVudXN1YWwgaW5zaWRlIDxwcmU+IGFuZCBpcyBpZ25vcmVkLlxuICAgICAqXG4gICAgICogUmV0dXJucyB0aGUgdHJpbW1lZCwgbm9uLWVtcHR5IGxpbmVzLlxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmVMaW5lcyhwcmVFbGVtOiBIVE1MRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgLy8gQ29uY2F0ZW5hdGUgYWxsIHRleHQgaW5zaWRlIHRoZSA8cHJlPiwgcHJlc2VydmluZyBpbmxpbmUgc3RydWN0dXJlXG4gICAgICAgIGxldCBmdWxsVGV4dCA9IHByZUVsZW0udGV4dENvbnRlbnQgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgcmF3TGluZXMgPSBmdWxsVGV4dC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgLy8gVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBibGFuayBsaW5lc1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICB3aGlsZSAoc3RhcnQgPCByYXdMaW5lcy5sZW5ndGggJiYgcmF3TGluZXNbc3RhcnRdLnRyaW0oKSA9PT0gXCJcIikgc3RhcnQrKztcbiAgICAgICAgbGV0IGVuZCA9IHJhd0xpbmVzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChlbmQgPj0gc3RhcnQgJiYgcmF3TGluZXNbZW5kXS50cmltKCkgPT09IFwiXCIpIGVuZC0tO1xuICAgICAgICByZXR1cm4gcmF3TGluZXMuc2xpY2Uoc3RhcnQsIGVuZCArIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGEgPHByZT4gZWxlbWVudCAodGhlIGl0ZW0tbGV2ZWwgY3Vyc29yIHBvc2l0aW9uIGZvclxuICAgICAqIHByZWZvcm1hdHRlZCBsaW5lcyB1c2VzIHRoZSA8cHJlPiBlbGVtZW50IGl0c2VsZiB3aXRoIHByZUxpbmVJbmRleCBzZXQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUHJlRWxlbWVudChub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAxICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlBSRVwiO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEV4cGxpY2l0VGFiaW5kZXgobm9kZTogTm9kZSk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB0YWJpbmRleFZhbHVlID0gcGFyc2VJbnQoZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSwgMTApO1xuICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHRhYmluZGV4VmFsdWUpID8gbnVsbCA6IHRhYmluZGV4VmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNQb3NpdGl2ZVRhYkZvY3VzKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGV4cGxpY2l0VGFiaW5kZXggPSBnZXRFeHBsaWNpdFRhYmluZGV4KGVsZW0pO1xuICAgICAgICByZXR1cm4gZXhwbGljaXRUYWJpbmRleCAhPT0gbnVsbCAmJiBleHBsaWNpdFRhYmluZGV4ID4gMCAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlbSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEZWZhdWx0T3JaZXJvVGFiRm9jdXMobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgZXhwbGljaXRUYWJpbmRleCA9IGdldEV4cGxpY2l0VGFiaW5kZXgoZWxlbSk7XG4gICAgICAgIHJldHVybiAoZXhwbGljaXRUYWJpbmRleCA9PT0gbnVsbCB8fCBleHBsaWNpdFRhYmluZGV4ID09PSAwKSAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlbSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VGFiRm9jdXNTdGFydEZ1bmMoaW5jbHVkZVBvc2l0aXZlVGFiaW5kZXg6IGJvb2xlYW4gPSB0cnVlKTogU1JDdXJzb3JNYXRjaEZ1bmMge1xuICAgICAgICByZXR1cm4gKF9yb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCEobm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSAxICYmIGJTdGFydFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobm9kZSkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gaW5jbHVkZVBvc2l0aXZlVGFiaW5kZXggfHwgaXNEZWZhdWx0T3JaZXJvVGFiRm9jdXMobm9kZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sbGVjdCBhbGwgdGFiYmFibGUgZWxlbWVudHMgaW4gdGFiIG9yZGVyIChwb3NpdGl2ZSB0YWJpbmRleCBmaXJzdCwgdGhlbiBkb2N1bWVudCBvcmRlcilcbiAgICAgKiBAcGFyYW0gbWF0Y2hGdW5jIEZ1bmN0aW9uIHRvIG1hdGNoIHRhYmJhYmxlIGVsZW1lbnRzXG4gICAgICogQHBhcmFtIHJvb3ROb2RlIE9wdGlvbmFsIHJvb3Qgbm9kZSB0byBzdGFydCBjb2xsZWN0aW9uIGZyb20gKGRlZmF1bHRzIHRvIGRvY3VtZW50IGJvZHkpXG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY3Vyc29ycyBwb2ludGluZyB0byB0YWJiYWJsZSBlbGVtZW50cyBpbiB0YWIgb3JkZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb2xsZWN0VGFiRm9jdXNDdXJzb3JzKG1hdGNoRnVuYzogU1JDdXJzb3JNYXRjaEZ1bmMsIHJvb3ROb2RlPzogTm9kZSk6IFNSQ3Vyc29yW10ge1xuICAgICAgICBjb25zdCByb290ID0gKHJvb3ROb2RlPy5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50KS5ib2R5IHx8IHJvb3ROb2RlO1xuICAgICAgICBpZiAoIXJvb3QpIHJldHVybiBbXTtcbiAgICAgICAgbGV0IHdhbGtlciA9IG5ldyBTUkN1cnNvcihyb290LCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IHNraXBGdW5jID0gZ2V0U2tpcEZ1bmMoXCJ0YWJfZm9jdXNcIik7XG4gICAgICAgIGxldCBwb3NpdGl2ZVJlc3VsdHM6IFNSQ3Vyc29yW10gPSBbXTtcbiAgICAgICAgbGV0IG5vcm1hbFJlc3VsdHM6IFNSQ3Vyc29yW10gPSBbXTtcblxuICAgICAgICBjb25zdCBhZGRDdXJzb3IgPSAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgaWYgKCFtYXRjaEZ1bmMoY3Vyc29yLmdldFJvbGUoKSwgIWN1cnNvci5pc0VuZFRhZygpLCBjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGlzUG9zaXRpdmVUYWJGb2N1cyhjdXJzb3IuZ2V0Tm9kZSgpKSkge1xuICAgICAgICAgICAgICAgIHBvc2l0aXZlUmVzdWx0cy5wdXNoKGN1cnNvci5jbG9uZSgpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNEZWZhdWx0T3JaZXJvVGFiRm9jdXMoY3Vyc29yLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgICAgICBub3JtYWxSZXN1bHRzLnB1c2goY3Vyc29yLmNsb25lKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGFkZEN1cnNvcih3YWxrZXIpO1xuICAgICAgICB3aGlsZSAod2Fsa2VyLm5leHQoKCkgPT4gdHJ1ZSwgc2tpcEZ1bmMpKSB7XG4gICAgICAgICAgICBhZGRDdXJzb3Iod2Fsa2VyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvc2l0aXZlUmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhRWxlbSA9IGEuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgYkVsZW0gPSBiLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGFUYWJpbmRleCA9IGdldEV4cGxpY2l0VGFiaW5kZXgoYUVsZW0pIHx8IDA7XG4gICAgICAgICAgICBjb25zdCBiVGFiaW5kZXggPSBnZXRFeHBsaWNpdFRhYmluZGV4KGJFbGVtKSB8fCAwO1xuICAgICAgICAgICAgaWYgKGFUYWJpbmRleCAhPT0gYlRhYmluZGV4KSByZXR1cm4gYlRhYmluZGV4IC0gYVRhYmluZGV4O1xuICAgICAgICAgICAgcmV0dXJuIFNSQ3Vyc29yLmNvbXBhcmUoYSwgYik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwb3NpdGl2ZVJlc3VsdHMuY29uY2F0KG5vcm1hbFJlc3VsdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIGluZGV4IG9mIGEgY3Vyc29yIGluIGFuIGFycmF5IG9mIHRhYiBmb2N1cyBjdXJzb3JzXG4gICAgICogQHBhcmFtIGN1cnNvcnMgQXJyYXkgb2YgY3Vyc29ycyB0byBzZWFyY2hcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIFRoZSBjdXJzb3IgdG8gZmluZFxuICAgICAqIEByZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgY3Vyc29yLCBvciAtMSBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kVGFiRm9jdXNJbmRleChjdXJzb3JzOiBTUkN1cnNvcltdLCB3YWxrZXI6IFNSQ3Vyc29yKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGN1cnNvcnMuZmluZEluZGV4KGN1cnNvciA9PiBTUkN1cnNvci5jb21wYXJlKGN1cnNvciwgd2Fsa2VyKSA9PT0gMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtYXRjaCBmdW5jdGlvbiBmb3IgaWRlbnRpZnlpbmcgc3RhcnQgcG9zaXRpb25zIGluIGEgZ2l2ZW4gbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSAoZS5nLiwgXCJsaW5rXCIsIFwiaGVhZGluZ1wiLCBcImJ1dHRvblwiLCBldGMuKVxuICAgICAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBtYXRjaGVzIGVsZW1lbnRzIGFwcHJvcHJpYXRlIGZvciB0aGUgbmF2aWdhdGlvbiBtb2RlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXJ0RnVuYyhtb2RlOiBOYXZpZ2F0aW9uTW9kZSkgOiBTUkN1cnNvck1hdGNoRnVuYyB7XG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgICAgY2FzZSBcImxpbmtcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwibGlua1wiKTtcbiAgICAgICAgICAgIGNhc2UgXCJ0YWJfZm9jdXNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VGFiRm9jdXNTdGFydEZ1bmMoZmFsc2UpO1xuICAgICAgICAgICAgY2FzZSBcImhlYWRpbmdcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoMVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmFyaWFMZXZlbCA9PT0gXCIxXCIpO1xuICAgICAgICAgICAgY2FzZSBcImgyXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImhlYWRpbmdcIiAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuYXJpYUxldmVsID09PSBcIjJcIik7XG4gICAgICAgICAgICBjYXNlIFwiaDNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5hcmlhTGV2ZWwgPT09IFwiM1wiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoNFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmFyaWFMZXZlbCA9PT0gXCI0XCIpO1xuICAgICAgICAgICAgY2FzZSBcImg1XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImhlYWRpbmdcIiAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuYXJpYUxldmVsID09PSBcIjVcIik7XG4gICAgICAgICAgICBjYXNlIFwiaDZcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5hcmlhTGV2ZWwgPT09IFwiNlwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJpbWFnZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgW1wiaW1nXCIsIFwiZ3JhcGhpY3MtZG9jdW1lbnRcIl0uaW5jbHVkZXMocm9sZSkpO1xuICAgICAgICAgICAgY2FzZSBcInJhZGlvXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcInJhZGlvXCIpO1xuICAgICAgICAgICAgY2FzZSBcImJ1dHRvblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJidXR0b25cIik7XG4gICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiY2hlY2tib3hcIik7XG4gICAgICAgICAgICBjYXNlIFwiY29tYm9cIjogICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImNvbWJvYm94XCIpO1xuICAgICAgICAgICAgY2FzZSBcImxpc3RcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwibGlzdFwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0aXRlbVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJsaXN0aXRlbVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJhcnRpY2xlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImFydGljbGVcIik7XG4gICAgICAgICAgICBjYXNlIFwidGFibGVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwidGFibGVcIik7XG4gICAgICAgICAgICBjYXNlIFwicGFyYWdyYXBoXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChfcm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiUFwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJkb21cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gdHJ1ZTtcbiAgICAgICAgICAgIGNhc2UgXCJpdGVtXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChjdXJzb3I6IFNSQ3Vyc29yIHwgYW55LCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiU3RhcnRUYWcpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gPGlmcmFtZT4gY29udGVudCBpcyBpbmxpbmVkIGJ5IHRoZSBJRlJBTUUgU1JfUlVMRSBpbnRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgYmxvY2sncyByZW5kZXJpbmcg4oCUIHRoZSBpZnJhbWUgaXRzZWxmIGlzIG5vdCBhbiBpdGVtIHN0b3AuXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgPHByZT4gZWxlbWVudCB3aXRoIHByZUxpbmVJbmRleCBzZXQgaXMgYSB2aXJ0dWFsIHBlci1saW5lIGl0ZW0uXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbml0aWFsIGVuY291bnRlciAocHJlTGluZUluZGV4IHVuZGVmaW5lZCkgaXMgYWxzbyBhIG1hdGNoIHNvXG4gICAgICAgICAgICAgICAgICAgIC8vIGp1bXBOZXh0IGNhbiBzZXQgcHJlTGluZUluZGV4PTAgb24gaXQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ByZUVsZW1lbnQobm9kZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNCbG9ja0VsZW1lbnQobm9kZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gbmV3IERPTVdhbGtlcihub2RlLCAhYlN0YXJ0VGFnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAucHJldk5vZGUoKSAmJiB0ZW1wLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0Jsb2NrRWxlbWVudCh0ZW1wLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicmVnaW9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJTdGFydFRhZykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoW1wibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJmb3JtXCIsIFwiYmFubmVyXCIsIFwic2VhcmNoXCIsIFwiY29udGVudGluZm9cIl0uaW5jbHVkZXMocm9sZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSAhPT0gXCJyZWdpb25cIiB8fCBub2RlPy5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUobm9kZSBhcyBIVE1MRWxlbWVudCk/Lm5hbWU/LnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FzZSBcImZvcm1jb250cm9sXCI6XG4gICAgICAgICAgICBjYXNlIFwiZWRpdGJveFwiOlxuICAgICAgICAgICAgY2FzZSBcImdyYXBoaWNcIjpcbiAgICAgICAgICAgIGNhc2UgXCJmcmFtZVwiOlxuICAgICAgICAgICAgY2FzZSBcImRpdmlzaW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwidGFiY29udHJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcInNlcGFyYXRvclwiOlxuICAgICAgICAgICAgY2FzZSBcImNsaWNrYWJsZVwiOlxuICAgICAgICAgICAgY2FzZSBcIm1vdXNlb3ZlclwiOlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVF9JTVBMRU1FTlRFRFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGlzIHdpdGhpbiBhIFNoYWRvdyBET01cbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgaW4gYSBTaGFkb3cgRE9NLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBjb25zdCBpc0luU2hhZG93RE9NID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIHJldHVybiByb290IGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgc2tpcCBiZWhhdmlvciBmb3IgaXRlbSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBIYW5kbGVzIGNvbXBsZXggdmlzaWJpbGl0eSBydWxlcyBpbmNsdWRpbmcgaGlkZGVuIGNvbnRlbnQgaW4gaGVhZGluZ3MvbGlua3NcbiAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBPYmplY3QgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHNraXAgY3VycmVudCBub2RlIGFuZC9vciBpdHMgY2hpbGRyZW4sIG9yIG51bGwgZm9yIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgKi9cbiAgICBjb25zdCBTS0lQX0lURU1fQkVIQVZJT1IgPSAoY3Vyc29yOiBTUkN1cnNvcikgOiB7IHNraXBDdXJyZW50OiBib29sZWFuLCBza2lwQ2hpbGRyZW46IGJvb2xlYW59IHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUuZ3JvdXAoXCJTS0lQX0lURU1fQkVIQVZJT1JcIik7XG4gICAgICAgIGxldCByZXRWYWw6IHsgc2tpcEN1cnJlbnQ6IGJvb2xlYW4sIHNraXBDaGlsZHJlbjogYm9vbGVhbn0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVUeXBlID0gY3Vyc29yLmdldE5vZGUoKS5ub2RlVHlwZTtcbiAgICAgICAgICAgIGxldCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclN0YXJ0ID0gY3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICBjdXJzb3JTdGFydC5zZXRFbmRUYWcoZmFsc2UpO1xuXG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhub2RlVHlwZSk7XG4gICAgICAgICAgICAvLyBTa2lwIENEQVRBIGFuZCBjb21tZW50cyBjb21wbGV0ZWx5XG4gICAgICAgICAgICBpZiAoWzQsIDhdLmluY2x1ZGVzKG5vZGVUeXBlKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgLy8gT25seSBwcm9jZXNzIGVsZW1lbnRzIGFuZCB0ZXh0XG4gICAgICAgICAgICBpZiAoIVsxLDNdLmluY2x1ZGVzKG5vZGVUeXBlKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcblxuICAgICAgICAgICAgLy8gRm9yIHRleHQgZWxlbWVudHMsIENvbnNpZGVyIHdpdGggcmVsYXRpb24gdG8gdGhlaXIgcGFyZW50IGVsZW1lbnRcbiAgICAgICAgICAgIGlmIChub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIGVsZW0gPSBjdXJzb3IuZ2V0Tm9kZSgpLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gcmV0VmFsID0gVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkgPyB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH0gOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgKCFlbGVtKSBjb25zb2xlLmxvZyhjdXJzb3IuZ2V0Tm9kZSgpKTtcblxuICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbiBlbGVtZW50XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSB3aXRoaW4gdGhlIGJvZHkgZWxlbWVudCAob3Igc2hhZG93IERPTSwgb3IgYW4gaWZyYW1lIHN1YmRvY3VtZW50KVxuICAgICAgICAgICAgaWYgKCFlbGVtLmNsb3Nlc3QoXCJib2R5XCIpICYmICFpc0luU2hhZG93RE9NKGVsZW0pKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UncmUgbm90IGluIGEgc2NyaXB0IG9yIHN0eWxlXG4gICAgICAgICAgICBpZiAoZWxlbS5jbG9zZXN0KFwic2NyaXB0LHN0eWxlXCIpKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG5cbiAgICAgICAgICAgIC8vIEZvciB0ZXh0IG5vZGVzLCB3ZSBuZWVkIHRvIGNoZWNrIHZpc2liaWxpdHkgaW4gY29udGV4dCBvZiBwYXJlbnQgaGVhZGluZy9saW5rXG4gICAgICAgICAgICAvLyBTbyB3ZSdsbCBoYW5kbGUgdGV4dCBub2RlIHZpc2liaWxpdHkgY2hlY2tzIGJlbG93IHdpdGggdGhlIGVsZW1lbnQgdmlzaWJpbGl0eSBjaGVja3NcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2tpcCB0aGluZ3MgaGlkZGVuIGZyb20gdGhlIEFULCBVTkxFU1Mgd2UncmUgaW5zaWRlIGEgaGVhZGluZyBvciBsaW5rXG4gICAgICAgICAgICAvLyAoaGVhZGluZ3MgYW5kIGxpbmtzIHNob3VsZCBpbmNsdWRlIHRoZWlyIGZ1bGwgYWNjZXNzaWJsZSBuYW1lLCBpbmNsdWRpbmcgaGlkZGVuIHBhcnRzKVxuICAgICAgICAgICAgLy8gQlVUIG9ubHkgaWYgdGhlIGhlYWRpbmcvbGluayB1c2VzIG5hbWVGcm9tPVwiY29udGVudFwiIChub3QgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnkpXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRIZWFkaW5nT3JMaW5rID0gY3Vyc29yU3RhcnQuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiaGVhZGluZ1wiLCBcImxpbmtcIl0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IGlmIGN1cnJlbnQgZWxlbWVudCBpdHNlbGYgaXMgYSBoZWFkaW5nIG9yIGxpbmsgQU5EIHdlJ3JlIE5PVCBpbnNpZGUgYW5vdGhlciBoZWFkaW5nL2xpbmssXG4gICAgICAgICAgICAvLyBhcHBseSBub3JtYWwgc2tpcCBydWxlc1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSk7XG4gICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRIZWFkaW5nT3JMaW5rID0gY3VycmVudFJvbGUgPT09IFwiaGVhZGluZ1wiIHx8IGN1cnJlbnRSb2xlID09PSBcImxpbmtcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFwYXJlbnRIZWFkaW5nT3JMaW5rKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90IGluc2lkZSBhbnkgaGVhZGluZy9saW5rIC0gYXBwbHkgbm9ybWFsIHNraXAgcnVsZXNcbiAgICAgICAgICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkpIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IG5vZGVUeXBlID09PSAxIH07XG4gICAgICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbSkpIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IG5vZGVUeXBlID09PSAxIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJlbnQgaGVhZGluZy9saW5rIHVzZXMgYXJpYS1sYWJlbCBvciBhcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRFbGVtID0gcGFyZW50SGVhZGluZ09yTGluay5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZUluZm8gPSBwYXJlbnRIZWFkaW5nT3JMaW5rLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gSWYgbmFtZUZyb20gaXMgTk9UIFwiY29udGVudFwiIG9yIFwidGV4dFwiLCBza2lwIGFsbCBjb250ZW50IChpdCdzIHVzaW5nIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5KVxuICAgICAgICAgICAgICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBhcmVudCB1c2VzIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5IC0gc2tpcCBhbGwgY29udGVudCBpbmNsdWRpbmcgbmVzdGVkIGhlYWRpbmdzL2xpbmtzXG4gICAgICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDdXJyZW50SGVhZGluZ09yTGluaykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGVsZW1lbnQgaXMgYSBoZWFkaW5nL2xpbmsgaW5zaWRlIGFub3RoZXIgaGVhZGluZy9saW5rIHdpdGggY29udGVudC1iYXNlZCBuYW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgaXQgLSBsZXQgaXQgdGhyb3VnaCBzbyBpdHMgY29udGVudCBjYW4gYmUgcmVhZFxuICAgICAgICAgICAgICAgICAgICAvLyAoVGhlIGxvZ2ljIGF0IGxpbmUgMTgzIHdpbGwgaGFuZGxlIHdoZXRoZXIgdG8gc2tpcCBpdHMgY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZUZyb20gaXMgXCJjb250ZW50XCIsIHNvIGluY2x1ZGUgaGlkZGVuIGNvbnRlbnQgYnV0IHNraXAgaGlkZGVuIGltYWdlcy9ncmFwaGljc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJvbGUgPT09IFwiaW1nXCIgfHwgcm9sZSA9PT0gXCJncmFwaGljcy1kb2N1bWVudFwiKSAmJiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgb3RoZXIgaGlkZGVuIGNvbnRlbnQgLSBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGFjY2Vzc2libGUgbmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiQk9EWVwiKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcblxuICAgICAgICAgICAgLy8gU2tpcCBsYWJlbHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGNvbnRyb2xzIC0gdGhleSdsbCBiZSByZWFkIHdpdGggdGhlIHJlbGF0ZWQgaW5wdXQuXG4gICAgICAgICAgICAvLyBLZWVwIGNoaWxkcmVuIHNvIGludGVyYWN0aXZlIGNvbnRlbnQgKGUuZy4gbGlua3MpIGluc2lkZSB0aGUgbGFiZWwgc3RpbGwgYXBwZWFycyBpblxuICAgICAgICAgICAgLy8gcmVhZGluZy90YWIgb3JkZXIuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkxBQkVMXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVsZW0uaGFzQXR0cmlidXRlKFwiZm9yXCIpXG4gICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpKVxuICAgICAgICAgICAgICAgICAgICAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtLmdldEF0dHJpYnV0ZShcImZvclwiKSkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbnRyb2wgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBbcm9sZT0nY2hlY2tib3gnXSwgW3JvbGU9J2NvbWJvYm94J10sIFtyb2xlPSdsaXN0Ym94J10sIFtyb2xlPSdtZW51aXRlbWNoZWNrYm94J10sIFtyb2xlPSdtZW51aXRlbXJhZGlvJ10sIFtyb2xlPSdyYWRpbyddLCBbcm9sZT0nc2VhcmNoYm94J10sIFtyb2xlPSdzbGlkZXInXSwgW3JvbGU9J3NwaW5idXR0b24nXSwgW3JvbGU9J3N3aXRjaCddLCBbcm9sZT0ndGV4dGJveCddXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGVkQ29udHJvbCAmJiAobmVzdGVkQ29udHJvbCBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBBIDxsYWJlbD4gd2l0aCBubyBgZm9yYCBhbmQgbm8gbmVzdGVkIGNvbnRyb2wsIHVzZWQgcHVyZWx5IGFzIGFuIGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgYnkgYW5vdGhlciBlbGVtZW50LCBzaG91bGQgYmUgc3VwcHJlc3NlZCDigJQgaXQgd2lsbCBiZSByZWFkIGFzIHBhcnQgb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpZGdldCdzIGFjY2Vzc2libGUgbmFtZSBhbm5vdW5jZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFthcmlhLWxhYmVsbGVkYnl+PVwiJHtpZH1cIl1gKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2tpcCBub24taW50ZXJhY3RpdmUgY29udGVudCB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiBhIGZvci1saW5rZWQgbGFiZWwuXG4gICAgICAgICAgICAvLyBTdWNoIGNvbnRlbnQgaXMgYWxyZWFkeSBzdXJmYWNlZCBhcyBwYXJ0IG9mIHRoZSBhc3NvY2lhdGVkIGNvbnRyb2wncyBhbm5vdW5jZW1lbnQuXG4gICAgICAgICAgICAvLyBJbnRlcmFjdGl2ZSBkZXNjZW5kYW50cyAobGlua3MsIGJ1dHRvbnMsIGV0Yy4pIGFyZSBhbGxvd2VkIHRocm91Z2guXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWxGb3IgPSBlbGVtLmNsb3Nlc3QoXCJsYWJlbFtmb3JdXCIpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbEZvclRhcmdldCA9IGxhYmVsRm9yICYmIGxhYmVsRm9yLmdldEF0dHJpYnV0ZShcImZvclwiKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsRm9yXG4gICAgICAgICAgICAgICAgICAgICYmIGxhYmVsRm9yVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsYWJlbEZvclRhcmdldCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAmJiAhZWxlbS5jbG9zZXN0KFwiYVtocmVmXSwgW3JvbGU9J2xpbmsnXSwgYnV0dG9uLCBbcm9sZT0nYnV0dG9uJ11cIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogbm9kZVR5cGUgPT09IDEgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBjdXJzb3JTdGFydC5nZXRSb2xlKCk7XG5cbiAgICAgICAgICAgIC8vIEEgZGl2L3NwYW4gY29tYm9ib3ggKHJvbGU9XCJjb21ib2JveFwiIG9uIGEgbm9uLWlucHV0LCBub24tc2VsZWN0IGVsZW1lbnQpIGFubm91bmNlc1xuICAgICAgICAgICAgLy8gaXRzIHZhbHVlIGRpcmVjdGx5IGZyb20gdGV4dCBjb250ZW50IG9yIHRoZSBjb250cm9sbGVkIGxpc3Rib3gsIHNvIHNraXAgaXRzIGNoaWxkcmVuXG4gICAgICAgICAgICAvLyB0byBhdm9pZCBkb3VibGUtYW5ub3VuY2luZyB0aGUgaW5uZXIgdGV4dC5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcImNvbWJvYm94XCJcbiAgICAgICAgICAgICAgICAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09IFwiU0VMRUNUXCJcbiAgICAgICAgICAgICAgICAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09IFwiSU5QVVRcIlxuICAgICAgICAgICAgICAgICYmICFjdXJzb3IuaXNFbmRUYWcoKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiwgcmVhZCB0aGUgZWxlbWVudCwgc2tpcCB0aGUgY2hpbGRyZW5cbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNraXAgY2hpbGRyZW4gb2YgaGVhZGluZ3MvbGlua3MgdGhhdCBkb24ndCB1c2UgY29udGVudC1iYXNlZCBuYW1lc1xuICAgICAgICAgICAgLy8gVU5MRVNTIHdlJ3JlIGluc2lkZSBhbm90aGVyIGhlYWRpbmcvbGluayB0aGF0IERPRVMgdXNlIGNvbnRlbnQtYmFzZWQgbmFtZXNcbiAgICAgICAgICAgIGlmIChbXCJsaW5rXCIsIFwiaGVhZGluZ1wiXS5pbmNsdWRlcyhyb2xlKSAmJiAoIWN1cnNvclN0YXJ0LmdldE5hbWUoKSB8fCAoIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKGN1cnNvclN0YXJ0LmdldE5hbWVJbmZvKCkubmFtZUZyb20pKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbnNpZGUgYSBwYXJlbnQgaGVhZGluZy9saW5rIHdpdGggY29udGVudC1iYXNlZCBuYW1lXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEhlYWRpbmdPckxpbmsgJiYgcGFyZW50SGVhZGluZ09yTGluay5nZXROYW1lSW5mbygpICYmIFtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKHBhcmVudEhlYWRpbmdPckxpbmsuZ2V0TmFtZUluZm8oKS5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc2tpcCBjaGlsZHJlbiAtIHdlJ3JlIG5lc3RlZCBpbnNpZGUgYSBjb250ZW50LWJhc2VkIGhlYWRpbmcvbGlua1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkxFR0VORFwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGN1cnNvci5nZXROb2RlKCkpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnRklFTERTRVQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZWdlbmQgaXMgd2l0aGluIGEgZmllbGRzZXQsIHN1cHByZXNzIG91dHB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtICYmIGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJNU1VQXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA8c3VtbWFyeT4gaXMgYSBzZWxmLWFubm91bmNpbmcgZGlzY2xvc3VyZSBidXR0b24g4oCUIGl0cyBjaGlsZHJlblxuICAgICAgICAgICAgLy8gYXJlIGZvbGRlZCBpbnRvIHRoZSBbXCJsYWJlbFwiLCBidXR0b24sIGNvbGxhcHNlZF0gYW5ub3VuY2VtZW50LFxuICAgICAgICAgICAgLy8gc28gc2tpcCB0cmF2ZXJzYWwgaW50byB0aGVtLlxuICAgICAgICAgICAgaWYgKCFjdXJzb3IuaXNFbmRUYWcoKSAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU1VNTUFSWVwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGV0YWlsc1BhcmVudCA9IGVsZW0ucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1BhcmVudCAmJiBkZXRhaWxzUGFyZW50Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiREVUQUlMU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTa2lwIG5vbi1zdW1tYXJ5IGNoaWxkcmVuIG9mIGEgY2xvc2VkIDxkZXRhaWxzPiBlbGVtZW50LlxuICAgICAgICAgICAgLy8gQnJvd3NlcnMgaGlkZSB0aG9zZSBjaGlsZHJlbiB2aWEgVUEgc3R5bGVzaGVldCAoZGlzcGxheTpub25lKSwgc29cbiAgICAgICAgICAgIC8vIHRoZXkgbXVzdCBub3QgYXBwZWFyIGFzIHJlYWRpbmcgc3RvcHMgd2hlbiB0aGUgd2lkZ2V0IGlzIGNvbGxhcHNlZC5cbiAgICAgICAgICAgIC8vIEV4ZW1wdCB0aGUgPGRldGFpbHM+IGVsZW1lbnQgaXRzZWxmIGFuZCA8c3VtbWFyeT4gKGFsd2F5cyB2aXNpYmxlKS5cbiAgICAgICAgICAgIGlmICghY3Vyc29yLmlzRW5kVGFnKClcbiAgICAgICAgICAgICAgICAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09IFwiREVUQUlMU1wiXG4gICAgICAgICAgICAgICAgJiYgIWVsZW0uY2xvc2VzdChcInN1bW1hcnlcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHNBbmNlc3RvciA9IGVsZW0uY2xvc2VzdChcImRldGFpbHNcIik7XG4gICAgICAgICAgICAgICAgaWYgKGRldGFpbHNBbmNlc3RvciAmJiAhZGV0YWlsc0FuY2VzdG9yLmhhc0F0dHJpYnV0ZShcIm9wZW5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW0uY2xvc2VzdChcIi5pYm1hLXNyLW92ZXJsYXlcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNraXAgcG9wdXAgZWxlbWVudHMgKGxpc3Rib3gsIHRyZWUsIGdyaWQsIGRpYWxvZykgdGhhdCBhcmUgb3duZWQgYnkgYSBjb21ib2JveFxuICAgICAgICAgICAgLy8gdmlhIGFyaWEtY29udHJvbHMuIEluIGEgcmVhbCBTUiB0aGVzZSBhcmUgb25seSByZWFjaGFibGUgdmlhIGFyaWEtYWN0aXZlZGVzY2VuZGFudCxcbiAgICAgICAgICAgIC8vIG5vdCBieSBET00gdHJhdmVyc2FsLCBzbyB0aGV5IHNob3VsZCBub3QgYXBwZWFyIGFzIHJlYWRpbmcgc3RvcHMuXG4gICAgICAgICAgICBpZiAobm9kZVR5cGUgPT09IDEgJiYgIWN1cnNvci5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFthcmlhLWNvbnRyb2xzfj1cIiR7aWR9XCJdYCkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3duZXIgJiYgQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG93bmVyKSA9PT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSBudWxsO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJTS0lQX0lURU0gcmV0VmFsOlwiLCByZXRWYWwpO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHNraXAgYmVoYXZpb3IgZm9yIG5lc3RlZCBuYXZpZ2F0aW9uIG1vZGVzIChsaW5rLCBoZWFkaW5nLCBpbWFnZSwgZXRjLilcbiAgICAgKiBTaW1wbGVyIHRoYW4gU0tJUF9JVEVNX0JFSEFWSU9SIGFzIGl0IGRvZXNuJ3QgbmVlZCBjb21wbGV4IGhlYWRpbmcvbGluayBjb250ZW50IHJ1bGVzXG4gICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICogQHJldHVybnMgT2JqZWN0IGluZGljYXRpbmcgd2hldGhlciB0byBza2lwIGN1cnJlbnQgbm9kZSBhbmQvb3IgaXRzIGNoaWxkcmVuLCBvciBudWxsIGZvciBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICovXG4gICAgY29uc3QgU0tJUF9ORVNURURfQkVIQVZJT1IgPSAoY3Vyc29yOiBTUkN1cnNvcikgOiB7IHNraXBDdXJyZW50OiBib29sZWFuLCBza2lwQ2hpbGRyZW46IGJvb2xlYW59IHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGVUeXBlID0gY3Vyc29yLmdldE5vZGUoKS5ub2RlVHlwZTtcbiAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgIC8vIE9ubHkgdmlzaXQgZWxlbWVudHMgYW5kIHRleHQgbm9kZXNcbiAgICAgICAgaWYgKG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSAzKSByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICBpZiAobm9kZVR5cGUgPT09IDMpIHJldHVybiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSA/IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfSA6IG51bGw7XG4gICAgICAgIC8vIFdlIGhhdmUgYW4gZWxlbWVudFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkpIHJldHVybiB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgLy8gU2tpcCB0aGUgaW5uZXIgZG9jdW1lbnQgb2YgYW4gPGlmcmFtZT4g4oCUIHNjcmVlbiByZWFkZXJzIHJlbmRlciB0aGVcbiAgICAgICAgLy8gYWNjZXNzaWJsZSBuYW1lIGFzIHRoZSB0YWJfZm9jdXMgbGFiZWw7IHRoZSBzdWJkb2N1bWVudCBib2R5IHNob3VsZFxuICAgICAgICAvLyBub3QgY29udHJpYnV0ZSBhZGRpdGlvbmFsIHJlYWRpbmcgc3RvcHMgZHVyaW5nIHJlbmRlclJhbmdlIHRyYXZlcnNhbC5cbiAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIiAmJiAhY3Vyc29yLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2tpcCBsYWJlbCBmb3JzIC0gdGhleSdsbCBiZSByZWFkIHdpdGggdGhlIHJlbGF0ZWQgaW5wdXQuXG4gICAgICAgIC8vIEtlZXAgY2hpbGRyZW4gc28gaW50ZXJhY3RpdmUgY29udGVudCAoZS5nLiBsaW5rcykgaW5zaWRlIHRoZSBsYWJlbCBzdGlsbCBhcHBlYXJzIGluXG4gICAgICAgIC8vIHJlYWRpbmcvdGFiIG9yZGVyLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiTEFCRUxcIlxuICAgICAgICAgICAgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJmb3JcIilcbiAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpKVxuICAgICAgICAgICAgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbS5nZXRBdHRyaWJ1dGUoXCJmb3JcIikpLmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09IFwiaGlkZGVuXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBub24taW50ZXJhY3RpdmUgY29udGVudCB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiBhIGZvci1saW5rZWQgbGFiZWwuXG4gICAgICAgIC8vIFN1Y2ggY29udGVudCBpcyBhbHJlYWR5IHN1cmZhY2VkIGFzIHBhcnQgb2YgdGhlIGFzc29jaWF0ZWQgY29udHJvbCdzIGFubm91bmNlbWVudC5cbiAgICAgICAgLy8gSW50ZXJhY3RpdmUgZGVzY2VuZGFudHMgKGxpbmtzLCBidXR0b25zLCBldGMuKSBhcmUgYWxsb3dlZCB0aHJvdWdoLlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbEZvciA9IGVsZW0uY2xvc2VzdChcImxhYmVsW2Zvcl1cIikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgY29uc3QgbGFiZWxGb3JUYXJnZXQgPSBsYWJlbEZvciAmJiBsYWJlbEZvci5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbGFiZWxGb3JcbiAgICAgICAgICAgICAgICAmJiBsYWJlbEZvclRhcmdldFxuICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KVxuICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpICE9PSBcImhpZGRlblwiXG4gICAgICAgICAgICAgICAgJiYgIWVsZW0uY2xvc2VzdChcImFbaHJlZl0sIFtyb2xlPSdsaW5rJ10sIGJ1dHRvbiwgW3JvbGU9J2J1dHRvbiddXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBub2RlVHlwZSA9PT0gMSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm9sZSA9IGN1cnNvci5nZXRSb2xlKCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiwgcmVhZCB0aGUgZWxlbWVudCwgc2tpcCB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKEFyaWFVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0gJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIk1TVVBcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmNsb3Nlc3QoXCIuaWJtYS1zci1vdmVybGF5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBza2lwIGZ1bmN0aW9uIGZvciBhIGdpdmVuIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBub2RlcyB0byBza2lwIGR1cmluZyBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFNraXBGdW5jKG1vZGU6IE5hdmlnYXRpb25Nb2RlKSA6IFNSQ3Vyc29yU2tpcEZ1bmMge1xuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJyZWdpb25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJpdGVtXCI6IFxuICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX0lURU1fQkVIQVZJT1I7XG4gICAgICAgICAgICBjYXNlIFwibGlua1wiOiBcbiAgICAgICAgICAgIGNhc2UgXCJ0YWJfZm9jdXNcIjogXG4gICAgICAgICAgICBjYXNlIFwiaGVhZGluZ1wiOlxuICAgICAgICAgICAgY2FzZSBcImgxXCI6XG4gICAgICAgICAgICBjYXNlIFwiaDJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoM1wiOlxuICAgICAgICAgICAgY2FzZSBcImg0XCI6XG4gICAgICAgICAgICBjYXNlIFwiaDVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoNlwiOlxuICAgICAgICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNLSVBfTkVTVEVEX0JFSEFWSU9SO1xuICAgICAgICAgICAgY2FzZSBcInJhZGlvXCI6XG4gICAgICAgICAgICBjYXNlIFwiYnV0dG9uXCI6XG4gICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjb21ib1wiOiAgICAgICBcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0XCI6XG4gICAgICAgICAgICBjYXNlIFwibGlzdGl0ZW1cIjpcbiAgICAgICAgICAgIGNhc2UgXCJhcnRpY2xlXCI6XG4gICAgICAgICAgICBjYXNlIFwidGFibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJwYXJhZ3JhcGhcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkb21cIjpcbiAgICAgICAgICAgIGNhc2UgXCJmb3JtY29udHJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcImVkaXRib3hcIjpcbiAgICAgICAgICAgIGNhc2UgXCJncmFwaGljXCI6XG4gICAgICAgICAgICBjYXNlIFwiZnJhbWVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkaXZpc2lvblwiOlxuICAgICAgICAgICAgY2FzZSBcInRhYmNvbnRyb2xcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzZXBhcmF0b3JcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjbGlja2FibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJtb3VzZW92ZXJcIjpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1RfSU1QTEVNRU5URURcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBcbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9yIHRoZSBwcmV2aW91cyBtYXRjaGluZyBlbGVtZW50IGlmIGN1cnJlbnQgZG9lc24ndCBtYXRjaFxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBIGN1cnNvciBhdCB0aGUgY3VycmVudCBvciBwcmV2aW91cyBtYXRjaGluZyBwb3NpdGlvblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBqdW1wQ3VycmVudChtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgd2Fsa2VyOiBTUkN1cnNvcikgOiBTUkN1cnNvciB7XG4gICAgICAgIGNvbnN0IG1hdGNoRnVuYyA9IG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgPyBnZXRUYWJGb2N1c1N0YXJ0RnVuYyh0cnVlKSA6IGdldFN0YXJ0RnVuYyhtb2RlKTtcbiAgICAgICAgaWYgKG1hdGNoRnVuYyh3YWxrZXIuZ2V0Um9sZSgpLCAhd2Fsa2VyLmlzRW5kVGFnKCksIHdhbGtlci5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ganVtcFByZXZpb3VzKG1vZGUsIHdhbGtlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSnVtcCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgYW5kIHJldHVybiBhbGwgaW50ZXJtZWRpYXRlIGl0ZW0gcG9zaXRpb25zXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSB3YWxrZXIgVGhlIGN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIGN1cnNvcnMgcmVwcmVzZW50aW5nIHBvc2l0aW9ucyBmcm9tIGN1cnJlbnQgdG8gZW5kXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGp1bXBDdXJyZW50RW5kKG1vZGU6IE5hdmlnYXRpb25Nb2RlLCB3YWxrZXI6IFNSQ3Vyc29yKSA6IFNSQ3Vyc29yW10ge1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIpIHtcbiAgICAgICAgICAgIC8vIEZvciBhbnkgPHByZT4gaXRlbSAoYmxvY2stZW50ZXIgc3RvcCBvciBwZXItbGluZSBzdG9wKSwgdGhlIHJlbmRlciByYW5nZVxuICAgICAgICAgICAgLy8gbXVzdCBlbmQgYXQgdGhlIG5leHQgdmlydHVhbCBsaW5lIGN1cnNvciAoc2FtZSA8cHJlPiBub2RlLCBuZXh0IGluZGV4KSBzb1xuICAgICAgICAgICAgLy8gdGhhdCByZW5kZXJSYW5nZSBuZXZlciB3YWxrcyBpbnRvIDxwcmU+J3MgY2hpbGRyZW4uXG4gICAgICAgICAgICBpZiAoaXNQcmVFbGVtZW50KHdhbGtlci5nZXROb2RlKCkpICYmICF3YWxrZXIuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gZ2V0UHJlTGluZXMod2Fsa2VyLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dElkeCA9IHdhbGtlci5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZCA/IDAgOiB3YWxrZXIucHJlTGluZUluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICAvLyBVc2UgbmV4dElkeCBhcyB0aGUgZW5kIHNlbnRpbmVsIOKAlCBldmVuIGlmIGl0IGVxdWFscyBsaW5lcy5sZW5ndGggKHBhc3RcbiAgICAgICAgICAgICAgICAvLyB0aGUgbGFzdCBsaW5lKSwgY29tcGFyZSgpIHdpbGwgc3RpbGwgY29ycmVjdGx5IHN0b3AgcmVuZGVyUmFuZ2UgYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gYW55IGNoaWxkIG5vZGUgYmVjYXVzZSBjaGlsZHJlbiBhcmUgY29udGFpbmVkIHdpdGhpbiA8cHJlPi5cbiAgICAgICAgICAgICAgICBjb25zdCBlbmRDdXJzb3IgPSB3YWxrZXIuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICBlbmRDdXJzb3IucHJlTGluZUluZGV4ID0gbmV4dElkeDtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2VuZEN1cnNvcl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtRW5kID0ganVtcE5leHQobW9kZSwgd2Fsa2VyKTtcbiAgICAgICAgICAgIHJldHVybiBpdGVtRW5kID8gW2l0ZW1FbmRdIDogW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lSW5mbyA9IHdhbGtlci5nZXROYW1lSW5mbygpO1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgaWYgKG5hbWVJbmZvICYmICFbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAvLyBOYW1lIGlzIGp1c3QgZnJvbSB0aGUgaXRlbSBpdHNlbGZcbiAgICAgICAgICAgICAgICByZXRWYWwubmV4dCgoKSA9PiB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTmFtZSBpcyBmcm9tIHRoZSBjb250ZW50XG4gICAgICAgICAgICAgICAgcmV0VmFsLnNldEVuZFRhZyh0cnVlKTtcbiAgICAgICAgICAgICAgICByZXRWYWwubmV4dCgoKSA9PiB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZW5kQ3Vyc29yczogU1JDdXJzb3JbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IGl0ZW1FbmQgPSBqdW1wTmV4dChcIml0ZW1cIiwgd2Fsa2VyKTtcbiAgICAgICAgICAgIHdoaWxlIChpdGVtRW5kICYmIFNSQ3Vyc29yLmNvbXBhcmUoaXRlbUVuZCwgcmV0VmFsKSA8IDApIHtcbiAgICAgICAgICAgICAgICBlbmRDdXJzb3JzLnB1c2goaXRlbUVuZCk7XG4gICAgICAgICAgICAgICAgaXRlbUVuZCA9IGp1bXBOZXh0KFwiaXRlbVwiLCBpdGVtRW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZEN1cnNvcnMucHVzaChyZXRWYWwpO1xuICAgICAgICAgICAgcmV0dXJuIG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgd2Fsa2VyLmdldFJvbGUoKSA9PT0gXCJsaW5rXCIgPyBbZW5kQ3Vyc29yc1tlbmRDdXJzb3JzLmxlbmd0aCAtIDFdXSA6IGVuZEN1cnNvcnM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHRoZSBuZXh0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBIGN1cnNvciBhdCB0aGUgbmV4dCBtYXRjaGluZyBwb3NpdGlvbiwgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGp1bXBOZXh0KG1vZGU6IE5hdmlnYXRpb25Nb2RlLCB3YWxrZXI6IFNSQ3Vyc29yKSA6IFNSQ3Vyc29yIHtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cChcIlNSTmF2aWdhdG9yOjpqdW1wTmV4dFwiLCB3YWxrZXIuaXNFbmRUYWcoKT9cIi9cIjpcIlwiLCB3YWxrZXIuZ2V0Tm9kZSgpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFiRm9jdXNNYXRjaEZ1bmMgPSBnZXRUYWJGb2N1c1N0YXJ0RnVuYyh0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJGb2N1c0N1cnNvcnMgPSBjb2xsZWN0VGFiRm9jdXNDdXJzb3JzKHRhYkZvY3VzTWF0Y2hGdW5jLCB3YWxrZXIuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICAgICBpZiAodGFiRm9jdXNDdXJzb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGFiRm9jdXNDdXJzb3JzLm1hcChjID0+IGMuZ2V0Tm9kZSgpKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciA9IHdhbGtlci5nZXRDdXJyZW50T3JQYXJlbnRUYWJiYWJsZUNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJGb2N1c0N1cnNvciA9IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciAmJiBmaW5kVGFiRm9jdXNJbmRleCh0YWJGb2N1c0N1cnNvcnMsIGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvcikgPj0gMCA/IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciA6IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBmaW5kVGFiRm9jdXNJbmRleCh0YWJGb2N1c0N1cnNvcnMsIGN1cnJlbnRUYWJGb2N1c0N1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCArIDEgPCB0YWJGb2N1c0N1cnNvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYkZvY3VzQ3Vyc29yc1tjdXJyZW50SW5kZXggKyAxXS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYkZvY3VzQ3Vyc29yc1swXS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwiaXRlbVwiICYmIGlzUHJlRWxlbWVudCh3YWxrZXIuZ2V0Tm9kZSgpKSAmJiAhd2Fsa2VyLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGdldFByZUxpbmVzKHdhbGtlci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHdhbGtlci5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGUgYmxvY2stZW50ZXIgc3RvcCDigJQganVtcCB0byB0aGUgZmlyc3QgbGluZSBpdGVtXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV0VmFsID0gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucHJlTGluZUluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRW1wdHkgPHByZT4g4oCUIGZhbGwgdGhyb3VnaCB0byBET00gdHJhdmVyc2FsIHBhc3QgPC9wcmU+XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXQgYSBsaW5lIGl0ZW0g4oCUIGFkdmFuY2UgdG8gdGhlIG5leHQgbGluZSBvciBwYXN0IDwvcHJlPlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGluZUlkeCA9IHdhbGtlci5wcmVMaW5lSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGluZUlkeCArIDEgPCBsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXRWYWwgPSB3YWxrZXIuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5wcmVMaW5lSW5kZXggPSBjdXJyZW50TGluZUlkeCArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbCBsaW5lcyBleGhhdXN0ZWQg4oCUIG1vdmUgcGFzdCA8L3ByZT4gdG8gdGhlIG5leHQgRE9NIGl0ZW0uXG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBsYW5kIG9uIHRoZSBibG9jay1lbnRlciBzdG9wIChwcmVMaW5lSW5kZXg9dW5kZWZpbmVkKSBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVyIGdldHMgYSBjaGFuY2UgdG8gcmVuZGVyIHRoZSBjb250YWluZXItZW50ZXIgYW5ub3VuY2VtZW50IGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNpbmcgdG8gdGhlIGZpcnN0IGxpbmUuXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRWYWwgPSB3YWxrZXIuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnNldEVuZFRhZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hGdW5jID0gZ2V0U3RhcnRGdW5jKG1vZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBza2lwRnVuYyA9IGdldFNraXBGdW5jKG1vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0VmFsLm5leHQobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1ByZUVsZW1lbnQocmV0VmFsLmdldE5vZGUoKSkgJiYgIXJldFZhbC5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnByZUxpbmVJbmRleCA9IHVuZGVmaW5lZDsgLy8gYmxvY2stZW50ZXIgc3RvcFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCByZXRWYWwgPSB3YWxrZXIuY2xvbmUoKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoRnVuYyA9IGdldFN0YXJ0RnVuYyhtb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IHNraXBGdW5jID0gZ2V0U2tpcEZ1bmMobW9kZSk7XG4gICAgICAgICAgICBpZiAocmV0VmFsLm5leHQobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgICAgICAvLyBMYW5kaW5nIG9uIDxwcmU+IHZpYSBET00gdHJhdmVyc2FsIGFsd2F5cyBzdGFydHMgYXQgdGhlIGJsb2NrLWVudGVyIHN0b3BcbiAgICAgICAgICAgICAgICAvLyAocHJlTGluZUluZGV4PXVuZGVmaW5lZCkuICBUaGUgcGVyLWxpbmUgaXRlbXMgYXJlIHJldHVybmVkIG9uIHN1YnNlcXVlbnRcbiAgICAgICAgICAgICAgICAvLyBjYWxscyB2aWEgdGhlIGlzUHJlRWxlbWVudCBlYXJseS1yZXR1cm4gYWJvdmUuXG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwiaXRlbVwiICYmIGlzUHJlRWxlbWVudChyZXRWYWwuZ2V0Tm9kZSgpKSAmJiAhcmV0VmFsLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnByZUxpbmVJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJTUk5hdmlnYXRvcjo6anVtcE5leHQgcmVzdWx0XCIsIHJldFZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gc2NyZWVuIHJlYWRlciBuYXZpZ2F0aW9uIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbW9kZS5cbiAgICAgKlxuICAgICAqIEZvciB0YWJfZm9jdXMgbW9kZSwgdGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBtb3ZlIHRvIHRoZSBwcmV2aW91cyB0YWJiYWJsZSBlbGVtZW50IGJ5OlxuICAgICAqIDEuIEZpcnN0IHRyeWluZyB0byBtb3ZlIGJhY2t3YXJkIHVzaW5nIHRoZSBtb2RlJ3MgbWF0Y2ggYW5kIHNraXAgZnVuY3Rpb25zXG4gICAgICogMi4gSWYgdGhhdCBmYWlscywgY29sbGVjdGluZyBhbGwgdGFiIGZvY3VzIGN1cnNvcnMgYW5kIGZpbmRpbmcgdGhlIHByZXZpb3VzIG9uZSBpbiB0aGUgdGFiIG9yZGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBuYXZpZ2F0aW9uIG1vZGUgKGUuZy4sIFwidGFiX2ZvY3VzXCIpIHRoYXQgZGV0ZXJtaW5lcyBob3cgdG8gbmF2aWdhdGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gVGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBzY3JlZW4gcmVhZGVyIG5hdmlnYXRpb25cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBjdXJzb3IgcG9zaXRpb25lZCBhdCB0aGUgcHJldmlvdXMgZWxlbWVudCwgb3IgbnVsbCBpZiBubyBwcmV2aW91cyBlbGVtZW50IGV4aXN0c1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBqdW1wUHJldmlvdXMobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IpIDogU1JDdXJzb3Ige1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIikge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hGdW5jID0gZ2V0U3RhcnRGdW5jKG1vZGUpO1xuICAgICAgICAgICAgY29uc3Qgc2tpcEZ1bmMgPSBnZXRTa2lwRnVuYyhtb2RlKTtcbiAgICAgICAgICAgIGlmIChyZXRWYWwucHJldmlvdXMobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWJGb2N1c01hdGNoRnVuYyA9IGdldFRhYkZvY3VzU3RhcnRGdW5jKHRydWUpO1xuICAgICAgICAgICAgY29uc3QgdGFiRm9jdXNDdXJzb3JzID0gY29sbGVjdFRhYkZvY3VzQ3Vyc29ycyh0YWJGb2N1c01hdGNoRnVuYywgd2Fsa2VyLmdldE5vZGUoKSk7XG4gICAgICAgICAgICBpZiAodGFiRm9jdXNDdXJzb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VGFiRm9jdXNQYXJlbnRDdXJzb3IgPSB3YWxrZXIuZ2V0Q3VycmVudE9yUGFyZW50VGFiYmFibGVDbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJGb2N1c0N1cnNvciA9IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciAmJiBmaW5kVGFiRm9jdXNJbmRleCh0YWJGb2N1c0N1cnNvcnMsIGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvcikgPj0gMCA/IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciA6IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZpbmRUYWJGb2N1c0luZGV4KHRhYkZvY3VzQ3Vyc29ycywgY3VycmVudFRhYkZvY3VzQ3Vyc29yKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiRm9jdXNDdXJzb3JzW2N1cnJlbnRJbmRleCAtIDFdLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgaXNQcmVFbGVtZW50KHdhbGtlci5nZXROb2RlKCkpICYmICF3YWxrZXIuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgaWYgKHdhbGtlci5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIEF0IHRoZSBibG9jay1lbnRlciBzdG9wIOKAlCBnbyB0byB0aGUgcHJldmlvdXMgRE9NIGl0ZW0gKGJlZm9yZSA8cHJlPilcbiAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gbm9ybWFsIHByZXZpb3VzKCkgdHJhdmVyc2FsIGJlbG93XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdhbGtlci5wcmVMaW5lSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGUgZmlyc3QgbGluZSDigJQgc3RlcCBiYWNrIHRvIHRoZSBibG9jay1lbnRlciBzdG9wXG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIHJldFZhbC5wcmVMaW5lSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU3RlcCBiYWNrIG9uZSBsaW5lXG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIHJldFZhbC5wcmVMaW5lSW5kZXggPSB3YWxrZXIucHJlTGluZUluZGV4IC0gMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICBjb25zdCBtYXRjaEZ1bmMgPSBnZXRTdGFydEZ1bmMobW9kZSk7XG4gICAgICAgIGNvbnN0IHNraXBGdW5jID0gZ2V0U2tpcEZ1bmMobW9kZSk7XG4gICAgICAgIGlmIChyZXRWYWwucHJldmlvdXMobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGp1c3QgbGFuZGVkIG9uIGEgPHByZT4gZWxlbWVudCwgcG9zaXRpb24gYXQgaXRzIGxhc3QgbGluZVxuICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwiaXRlbVwiICYmIGlzUHJlRWxlbWVudChyZXRWYWwuZ2V0Tm9kZSgpKSAmJiAhcmV0VmFsLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGdldFByZUxpbmVzKHJldFZhbC5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJldFZhbC5wcmVMaW5lSW5kZXggPSBsaW5lcy5sZW5ndGggPiAwID8gbGluZXMubGVuZ3RoIC0gMSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIiwiaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgU1JOYXZpZ2F0b3IgfSBmcm9tIFwiLi9TUk5hdmlnYXRvclwiO1xuaW1wb3J0IHsgQ29udGFpbmVyQ2hhbmdlcywgTmF2aWdhdGlvbk1vZGUsIFJlbmRlclJlc3VsdCB9IGZyb20gXCIuL1NSVHlwZXNcIjtcbmltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4vU1JDdXJzb3JcIjtcbmltcG9ydCB7IFNSX1JVTEVTLCBDT05UQUlORVJfRU5URVJfUlVMRVMsIENPTlRBSU5FUl9FWElUX1JVTEVTIH0gZnJvbSBcIi4vcmVuZGVyX3J1bGVzXCI7XG5pbXBvcnQgeyBnZXRMaW5rQW5ub3VuY2VtZW50IH0gZnJvbSBcIi4vcmVuZGVyX3J1bGVzL2NvbW1vblwiO1xuXG4vKipcbiAqIFNSUmVuZGVyZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIHNpbXVsYXRpbmcgaG93IHNjcmVlbiByZWFkZXJzXG4gKiBhbm5vdW5jZSBjb250ZW50IHRvIHVzZXJzLiBJdCBjb250YWlucyBydWxlcyBmb3IgcmVuZGVyaW5nIGRpZmZlcmVudCB0eXBlcyBvZlxuICogZWxlbWVudHMgYW5kIEFSSUEgcm9sZXMgaW4gdmFyaW91cyBuYXZpZ2F0aW9uIG1vZGVzLlxuICpcbiAqIFRoZSByZW5kZXJlciB1c2VzIGEgcnVsZS1iYXNlZCBzeXN0ZW0gdG8gZGV0ZXJtaW5lIHdoYXQgdGV4dCBzaG91bGQgYmUgYW5ub3VuY2VkXG4gKiB3aGVuIG5hdmlnYXRpbmcgdG8sIHdpdGhpbiwgb3IgYXdheSBmcm9tIGVsZW1lbnRzIGJhc2VkIG9uIHRoZWlyIHJvbGVzIGFuZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIFNSUmVuZGVyZXIge1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgYW5ub3VuY2VtZW50IHRleHQgd2hlbiBlbnRlcmluZyBhbiBlbGVtZW50XG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGxvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBydWxlIGJhc2VkIG9uIHRoZSBlbGVtZW50J3Mgcm9sZSBvciB0YWcgbmFtZVxuICAgICAqIGFuZCBhcHBsaWVzIGl0IHRvIGdlbmVyYXRlIHRoZSBhbm5vdW5jZW1lbnQgdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIC0gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIHdhbGtlciAtIEN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBvbGRXYWxrZXIgLSBPcHRpb25hbCBjdXJzb3IgYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uXG4gICAgICogQHJldHVybnMgQW5ub3VuY2VtZW50IHRleHQgZm9yIGVudGVyaW5nIHRoZSBlbGVtZW50LCBvciBudWxsIGlmIG5vIHJ1bGUgYXBwbGllc1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiByZW5kZXJFbnRlcihtb2RlOiBOYXZpZ2F0aW9uTW9kZSB8IFwiZm9jdXNcIiwgd2Fsa2VyOiBTUkN1cnNvciwgb2xkV2Fsa2VyPzogU1JDdXJzb3IpOiBzdHJpbmcgfCBudWxsIHsgICAgICAgIFxuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgQ09OVEFJTkVSX0VOVEVSX1JVTEVTKSB7XG4gICAgICAgICAgICBsZXQgcyA9IHJ1bGUudGVzdChtb2RlLCB3YWxrZXIsIG9sZFdhbGtlcik7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhtb2RlLCB3YWxrZXIsIHJ1bGUsIHMpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzICE9PSBcInVuZGVmaW5lZFwiICYmIHMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIGFubm91bmNlbWVudCB0ZXh0IHdoZW4gbGVhdmluZyBhbiBlbGVtZW50XG4gICAgICpcbiAgICAgKiBTaW1pbGFyIHRvIHJlbmRlckVudGVyLCBidXQgYXBwbGllcyBydWxlcyBmb3IgbGVhdmluZyBlbGVtZW50cyBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgLSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gQ3Vyc29yIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICogQHBhcmFtIG9sZFdhbGtlciAtIE9wdGlvbmFsIGN1cnNvciBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBbm5vdW5jZW1lbnQgdGV4dCBmb3IgbGVhdmluZyB0aGUgZWxlbWVudCwgb3IgbnVsbCBpZiBubyBydWxlIGFwcGxpZXNcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gcmVuZGVyTGVhdmUobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IsIG9sZFdhbGtlcj86IFNSQ3Vyc29yKTogc3RyaW5nIHwgbnVsbCAge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgQ09OVEFJTkVSX0VYSVRfUlVMRVMpIHtcbiAgICAgICAgICAgIGxldCBzID0gcnVsZS50ZXN0KG1vZGUsIHdhbGtlciwgb2xkV2Fsa2VyKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgY3VycmVudCBlbGVtZW50IGFuZCBhbnkgY29udGFpbmVyIGNoYW5nZXNcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY29tYmluZXMgYW5ub3VuY2VtZW50cyBmb3I6XG4gICAgICogLSBDb250YWluZXJzIGJlaW5nIGxlZnRcbiAgICAgKiAtIENvbnRhaW5lcnMgYmVpbmcgZW50ZXJlZFxuICAgICAqIC0gVGhlIGN1cnJlbnQgZWxlbWVudCBpdHNlbGZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIC0gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIHdhbGtlciAtIEN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBjb250YWluZXJDaGFuZ2VzIC0gSW5mb3JtYXRpb24gYWJvdXQgY29udGFpbmVycyBiZWluZyBlbnRlcmVkIG9yIGxlZnRcbiAgICAgKiBAcmV0dXJucyBDb21iaW5lZCBhbm5vdW5jZW1lbnQgdGV4dFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiByZW5kZXJDdXJyZW50KG1vZGU6IE5hdmlnYXRpb25Nb2RlLCB3YWxrZXI6IFNSQ3Vyc29yLCBjb250YWluZXJDaGFuZ2VzOiBDb250YWluZXJDaGFuZ2VzKTogUmVuZGVyUmVzdWx0IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7Ly9tb2RlID09PSBcInRhYl9mb2N1c1wiICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZml4dHVyZVwiKT8uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgPT09IFwidG9tdGVzdFwiO1xuICAgICAgICBsZXQgc3RhcnRPZlJlbmRlciA9IFNSTmF2aWdhdG9yLmp1bXBDdXJyZW50KG1vZGUsIHdhbGtlcik7XG4gICAgICAgIGlmICghc3RhcnRPZlJlbmRlcikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGVuZE9mUmVuZGVycyA9IFNSTmF2aWdhdG9yLmp1bXBDdXJyZW50RW5kKG1vZGUsIHN0YXJ0T2ZSZW5kZXIpO1xuICAgICAgICBpZiAoIWVuZE9mUmVuZGVycyB8fCBlbmRPZlJlbmRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBlbmRPZlJlbmRlcnMgPSBbbnVsbF07XG4gICAgICAgIH1cbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJBQUFBXCIsIHN0YXJ0T2ZSZW5kZXIuaXNTdGFydFRhZygpLCBzdGFydE9mUmVuZGVyLmdldE5vZGUoKSk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiQkJCQlwiLCBlbmRPZlJlbmRlcnMubWFwKHZhbCA9PiB2YWwgJiYgdmFsLmlzU3RhcnRUYWcoKSksIGVuZE9mUmVuZGVycy5tYXAodmFsID0+IHZhbCAmJiB2YWwuZ2V0Tm9kZSgpKSk7XG5cbiAgICAgICAgbGV0IGVuZE9mUmVuZGVyID0gZW5kT2ZSZW5kZXJzW2VuZE9mUmVuZGVycy5sZW5ndGggLSAxXTtcbiAgICAgICAgbGV0IHJlbmRlclN0ciA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGNhbmRpZGF0ZUVuZCBvZiBlbmRPZlJlbmRlcnMpIHtcbiAgICAgICAgICAgIGxldCBjYW5kaWRhdGVSZW5kZXJTdHIgPSBTUlJlbmRlcmVyLnJlbmRlclJhbmdlKG1vZGUsIHN0YXJ0T2ZSZW5kZXIsIGNhbmRpZGF0ZUVuZCk7XG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlUmVuZGVyU3RyLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZW5kT2ZSZW5kZXIgPSBjYW5kaWRhdGVFbmQ7XG4gICAgICAgICAgICAgICAgcmVuZGVyU3RyID0gY2FuZGlkYXRlUmVuZGVyU3RyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZW5kZXJTdHIgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJlbmRlclN0ciA9IFNSUmVuZGVyZXIucmVuZGVyUmFuZ2UobW9kZSwgc3RhcnRPZlJlbmRlciwgZW5kT2ZSZW5kZXIpO1xuICAgICAgICB9XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiQ0NDQ1wiLCByZW5kZXJTdHIpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0T2ZSZW5kZXIsXG4gICAgICAgICAgICBlbmQ6IGVuZE9mUmVuZGVyLFxuICAgICAgICAgICAgbWVzc2FnZTogKGNvbnRhaW5lckNoYW5nZXMubGVhdmluZyB8fCBbXSkuY29uY2F0KGNvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcgfHwgW10pLmNvbmNhdChbcmVuZGVyU3RyXSkuam9pbihcIiBcIikucmVwbGFjZSgvXFxzKy9nLCBcIiBcIilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSByYW5nZSBvZiBlbGVtZW50cyBiZXR3ZWVuIHR3byBjdXJzb3JzXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgRE9NIGZyb20gc3RhcnRPZlJlbmRlciB0byBlbmRPZlJlbmRlcixcbiAgICAgKiBhcHBseWluZyByZW5kZXJpbmcgcnVsZXMgdG8gZWFjaCBlbGVtZW50IGFuZCBjb21iaW5pbmcgdGhlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBzdGFydE9mUmVuZGVyIC0gQ3Vyc29yIGF0IHRoZSBzdGFydCBvZiB0aGUgcmFuZ2VcbiAgICAgKiBAcGFyYW0gZW5kT2ZSZW5kZXIgLSBDdXJzb3IgYXQgdGhlIGVuZCBvZiB0aGUgcmFuZ2VcbiAgICAgKiBAcmV0dXJucyBDb21iaW5lZCBhbm5vdW5jZW1lbnQgdGV4dCBmb3IgdGhlIGVudGlyZSByYW5nZVxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiByZW5kZXJSYW5nZShtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgc3RhcnRPZlJlbmRlcjogU1JDdXJzb3IsIGVuZE9mUmVuZGVyOiBTUkN1cnNvcikgOiBzdHJpbmcge1xuICAgICAgICBsZXQgaXRlcldhbGtlciA9IHN0YXJ0T2ZSZW5kZXIuY2xvbmUoKTtcbiAgICAgICAgbGV0IGVsZW1TdHJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgbGV0IGN1cnJlbnRMaW5rOiBOb2RlID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKGJDb250aW51ZSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IGl0ZXJXYWxrZXIuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGl0ZXJXYWxrZXIuZ2V0Tm9kZSgpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuICAgICAgICAgICAgbGV0IHJlbmRlclN0cnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBsZXQgbGlua1BhcmVudCA9IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobm9kZSwgXCJsaW5rXCIsIHRydWUpO1xuICAgICAgICAgICAgaWYgKGxpbmtQYXJlbnQgJiYgIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKG5ldyBTUkN1cnNvcihsaW5rUGFyZW50KS5nZXROYW1lSW5mbygpPy5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBjb25zaWRlciBsaW5rcyB0aGF0IGFubm91bmNlIHRoZW1zZWx2ZXNcbiAgICAgICAgICAgICAgICBsaW5rUGFyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBTUl9SVUxFUykge1xuICAgICAgICAgICAgICAgIGxldCBzID0gcnVsZS50ZXN0KG1vZGUsIGl0ZXJXYWxrZXIpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzICE9PSBudWxsICYmIHMudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVUeXBlID09PSAxICYmICFpdGVyV2Fsa2VyLmlzRW5kVGFnKCkgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIpID09PSBcIm1lbnVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcyA9IFwiW3N1Yk1lbnVdIFwiK3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGxpbmtzXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBpbiBsaW5rIG1vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGluayAmJiAoIWxpbmtQYXJlbnQgfHwgKGxpbmtQYXJlbnQgJiYgY3VycmVudExpbmsgIT09IGxpbmtQYXJlbnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGFkZGVkIGEgc3RyaW5nIHdpdGhpbiBhIGxpbmsgKGN1cnJlbnRMaW5rKSwgYnV0IG5vdyB3ZSd2ZSBsZWZ0IHRoZSBsaW5rIG9yIG1vdmVkIHRvIGEgbmV3IGxpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gYCR7c30gJHtnZXRMaW5rQW5ub3VuY2VtZW50KG5ldyBTUkN1cnNvcihjdXJyZW50TGluaywgZmFsc2UpKX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmtQYXJlbnQgJiYgKCFjdXJyZW50TGluayB8fCAoY3VycmVudExpbmsgIT09IGxpbmtQYXJlbnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGluIGEgbGluaywgYW5kIHdlIGhhdmVuJ3QgYW5ub3VuY2VkIHRoaXMgbGluaywgb3Igd2UndmUgbW92ZWQgdG8gYSBuZXcgbGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBgJHtnZXRMaW5rQW5ub3VuY2VtZW50KG5ldyBTUkN1cnNvcihsaW5rUGFyZW50LCBmYWxzZSkpfSAke3N9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gXG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocyAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudExpbmsgPSBsaW5rUGFyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVN0cnMucHVzaChzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtU3Rycy5wdXNoKHJlbmRlclN0cnMuZmlsdGVyKHMgPT4gcy50cmltKCkubGVuZ3RoID4gMCkuam9pbihcIiBcIikpXG4gICAgICAgICAgICBiQ29udGludWUgPSBpdGVyV2Fsa2VyLm5leHQoKCkgPT4gdHJ1ZSwgU1JOYXZpZ2F0b3IuZ2V0U2tpcEZ1bmMobW9kZSkpICYmIFNSQ3Vyc29yLmNvbXBhcmUoaXRlcldhbGtlciwgZW5kT2ZSZW5kZXIpIDwgMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiBjdXJyZW50TGluaykge1xuICAgICAgICAgICAgZWxlbVN0cnMucHVzaChgJHtnZXRMaW5rQW5ub3VuY2VtZW50KG5ldyBTUkN1cnNvcihjdXJyZW50TGluaywgZmFsc2UpKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VmFsID0gZWxlbVN0cnMuZmlsdGVyKHMgPT4gcy50cmltKCkubGVuZ3RoID4gMCkuam9pbihcIiBcIik7XG4gICAgICAgIHJldFZhbCA9IHJldFZhbC5yZXBsYWNlKC8sIFxcdTAwMDEoW15cXHUwMDAyXSspXFx1MDAwMi9nLCAobWF0Y2gsIGRlc2NyaWJlZEJ5VGV4dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcXVvdGVkVGV4dCA9IGBcIiR7ZGVzY3JpYmVkQnlUZXh0fVwiYDtcbiAgICAgICAgICAgIGNvbnN0IHVubWFya2VkUmV0VmFsID0gcmV0VmFsLnJlcGxhY2UobWF0Y2gsIFwiXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHVubWFya2VkUmV0VmFsLmluY2x1ZGVzKHF1b3RlZFRleHQpIHx8IHVubWFya2VkUmV0VmFsLmluY2x1ZGVzKGRlc2NyaWJlZEJ5VGV4dCkgPyBcIlwiIDogYCwgJHtxdW90ZWRUZXh0fWA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXRWYWwgPSByZXRWYWwucmVwbGFjZSgvW1xcdTAwMDFcXHUwMDAyXS9nLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbn1cblxuIiwiaW1wb3J0IHsgU1JDdXJzb3IgfSBmcm9tIFwiLi9TUkN1cnNvclwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUgfSBmcm9tIFwiLi9TUlR5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBTUlJlbmRlcmVyUnVsZSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBydWxlRGVmaW5pdGlvbjoge1xuICAgICAgICBtb2RlczogTmF2aWdhdGlvbk1vZGVbXSxcbiAgICAgICAgcm9sZXM6IHN0cmluZ1tdLFxuICAgICAgICBlbGVtczogc3RyaW5nW10sXG4gICAgICAgIHRlc3RzOiBBcnJheTwoY3Vyc29yOiBTUkN1cnNvciwgb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBOYXZpZ2F0aW9uTW9kZSkgPT4gc3RyaW5nIHwgbnVsbD5cbiAgICB9KSB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgdGVzdChtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgY3Vyc29yOiBTUkN1cnNvciwgb2xkQ3Vyc29yPzogU1JDdXJzb3IpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMucnVsZURlZmluaXRpb24ubW9kZXMuaW5jbHVkZXMobW9kZSlcbiAgICAgICAgICAgICYmIChcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bGVEZWZpbml0aW9uLnJvbGVzLmluY2x1ZGVzKGN1cnNvci5nZXRSb2xlKCkpXG4gICAgICAgICAgICAgICAgfHwgdGhpcy5ydWxlRGVmaW5pdGlvbi5lbGVtcy5pbmNsdWRlcyhjdXJzb3IuZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0ZXN0IG9mIHRoaXMucnVsZURlZmluaXRpb24udGVzdHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgcyA9IHRlc3QoY3Vyc29yLCBvbGRDdXJzb3IsIG1vZGUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsImltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4vU1JDdXJzb3JcIjtcblxuLyoqXG4gKiBUYWJsZVV0aWwgbmFtZXNwYWNlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBIVE1MIHRhYmxlcyBpbiB0aGUgYWNjZXNzaWJpbGl0eSBzaW11bGF0b3IuXG4gKiBUaGVzZSBmdW5jdGlvbnMgaGVscCBkZXRlcm1pbmUgY2VsbCBwb3NpdGlvbnMsIHJlbGF0aW9uc2hpcHMsIGFuZCBleHRyYWN0IGhlYWRlciBpbmZvcm1hdGlvblxuICogdG8gc2ltdWxhdGUgaG93IHNjcmVlbiByZWFkZXJzIHdvdWxkIGFubm91bmNlIHRhYmxlIG5hdmlnYXRpb24uXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgU1JUYWJsZVV0aWwge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSB0YWJsZSBjZWxsIHdpdGggaXRzIHBvc2l0aW9uIGFuZCBzcGFubmluZyBpbmZvcm1hdGlvblxuICAgICAqIEBwcm9wZXJ0eSByb3dJbmRleFN0YXJ0IC0gVGhlIHN0YXJ0aW5nIHJvdyBpbmRleCAoMC1iYXNlZClcbiAgICAgKiBAcHJvcGVydHkgY29sSW5kZXhTdGFydCAtIFRoZSBzdGFydGluZyBjb2x1bW4gaW5kZXggKDAtYmFzZWQpXG4gICAgICogQHByb3BlcnR5IHJvd3NwYW4gLSBOdW1iZXIgb2Ygcm93cyB0aGlzIGNlbGwgc3BhbnNcbiAgICAgKiBAcHJvcGVydHkgY29sc3BhbiAtIE51bWJlciBvZiBjb2x1bW5zIHRoaXMgY2VsbCBzcGFuc1xuICAgICAqIEBwcm9wZXJ0eSBjZWxsQ3Vyc29yIC0gU1JDdXJzb3IgcG9pbnRpbmcgdG8gdGhpcyBjZWxsXG4gICAgICovXG4gICAgZXhwb3J0IHR5cGUgQ2VsbE1vZGVsID0geyByb3dJbmRleFN0YXJ0OiBudW1iZXIsIGNvbEluZGV4U3RhcnQ6IG51bWJlciwgcm93c3BhbjogbnVtYmVyLCBjb2xzcGFuOiBudW1iZXIsIGNlbGxDdXJzb3I6IFNSQ3Vyc29yIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgcm93IGluIGEgdGFibGUgYXMgYW4gYXJyYXkgb2YgY2VsbCBtb2RlbHNcbiAgICAgKi9cbiAgICBleHBvcnQgdHlwZSBSb3dNb2RlbCA9IENlbGxNb2RlbFtdO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBjb21wbGV0ZSB0YWJsZSBhcyBhbiBhcnJheSBvZiByb3dzXG4gICAgICovXG4gICAgZXhwb3J0IHR5cGUgVGFibGVNb2RlbCA9IFJvd01vZGVsW107XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJzb3IgaXMgcG9pbnRpbmcgdG8gYSBjZWxsIGVsZW1lbnQgKFREIG9yIFRIKVxuICAgICAqIG9yIGhhcyBhIGNlbGwtcmVsYXRlZCBBUklBIHJvbGVcbiAgICAgKiBAcGFyYW0gY3Vyc29yIC0gVGhlIFNSQ3Vyc29yIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY3Vyc29yIGlzIG9uIGEgY2VsbCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ3Vyc29yQ2VsbFJvbGUoY3Vyc29yOiBTUkN1cnNvcikge1xuICAgICAgICBpZiAoIWN1cnNvci5nZXRFbGVtZW50KCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKFtcImNlbGxcIiwgXCJyb3doZWFkZXJcIiwgXCJjb2x1bW5oZWFkZXJcIl0uaW5jbHVkZXMoY3Vyc29yLmdldFJvbGUoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhY3Vyc29yLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIFtcIlRIXCIsIFwiVERcIl0uaW5jbHVkZXMoY3Vyc29yLmdldEVsZW1lbnQoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgY3Vyc29yIHBvaW50aW5nIHRvIHRoZSBjdXJyZW50IGNlbGwgb3IgdGhlIHBhcmVudCBjZWxsIGlmIHRoZSBjdXJzb3JcbiAgICAgKiBpcyBpbnNpZGUgYSBjZWxsJ3MgY29udGVudFxuICAgICAqIEBwYXJhbSBjdXJzb3IgLSBUaGUgU1JDdXJzb3IgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBTUkN1cnNvciBwb2ludGluZyB0byB0aGUgY2VsbCBvciBudWxsIGlmIG5vdCBpbiBhIGNlbGxcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudE9yUGFyZW50Q2VsbEN1cnNvcihjdXJzb3I6IFNSQ3Vyc29yKSA6IFNSQ3Vyc29yIHtcbiAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJjZWxsXCIsIFwicm93aGVhZGVyXCIsIFwiY29sdW1uaGVhZGVyXCJdLCBbXCJURFwiLFwiVEhcIl0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY29sc3BhbiBvZiBhIGNlbGwgYXQgYSBnaXZlbiBsb2NhdGlvblxuICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0byBnZXQgdGhlIGNvbHNwYW4gZnJvbVxuICAgICAqIEByZXR1cm5zIFRoZSBjb2xzcGFuIG9mIHRoZSBjZWxsIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbiBvciAwIGlmIG5vdCBpbiBhIGNvbHVtblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDb2xTcGFuKGN1cnNvcjogU1JDdXJzb3IpOiBudW1iZXIge1xuICAgICAgICBpZiAoIWlzQ3Vyc29yQ2VsbFJvbGUoY3Vyc29yKSkgcmV0dXJuIDA7XG4gICAgICAgIGxldCBjb2xTcGFuID0gY3Vyc29yLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpO1xuICAgICAgICBpZiAoY29sU3Bhbikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGNvbFNwYW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcm93c3BhbiBvZiBhIGNlbGwgYXQgYSBnaXZlbiBsb2NhdGlvblxuICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0byBnZXQgdGhlIHJvd3NwYW4gZnJvbVxuICAgICAqIEByZXR1cm5zIFRoZSByb3dzcGFuIG9mIHRoZSBjZWxsIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbiBvciAwIGlmIG5vdCBpbiBhIGNvbHVtblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRSb3dTcGFuKGN1cnNvcjogU1JDdXJzb3IpOiBudW1iZXIge1xuICAgICAgICBpZiAoIWlzQ3Vyc29yQ2VsbFJvbGUoY3Vyc29yKSkgcmV0dXJuIDA7XG4gICAgICAgIGxldCByb3dTcGFuID0gY3Vyc29yLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpO1xuICAgICAgICBpZiAocm93U3Bhbikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHJvd1NwYW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhIGNvbXBsZXRlIG1vZGVsIG9mIGEgdGFibGUncyBzdHJ1Y3R1cmUsIGFjY291bnRpbmcgZm9yIHJvd3NwYW4gYW5kIGNvbHNwYW5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSBlbnRpcmUgdGFibGUgYW5kIGNyZWF0ZXMgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHNcbiAgICAgKiB0aGUgbG9naWNhbCBncmlkIG9mIGNlbGxzLCBwcm9wZXJseSBoYW5kbGluZyBjZWxscyB0aGF0IHNwYW4gbXVsdGlwbGUgcm93cyBvciBjb2x1bW5zLlxuICAgICAqIFRoZSByZXN1bHRpbmcgbW9kZWwgbWFrZXMgaXQgZWFzaWVyIHRvIGRldGVybWluZSBjZWxsIHJlbGF0aW9uc2hpcHMgYW5kIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpblRhYmxlQ3Vyc29yIC0gQSBjdXJzb3Igd2l0aGluIHRoZSB0YWJsZVxuICAgICAqIEByZXR1cm5zIEEgVGFibGVNb2RlbCByZXByZXNlbnRpbmcgdGhlIGNvbXBsZXRlIHRhYmxlIHN0cnVjdHVyZSwgb3IgbnVsbCBpZiBub3QgaW4gYSB0YWJsZVxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZU1vZGVsKGluVGFibGVDdXJzb3I6IFNSQ3Vyc29yKTogVGFibGVNb2RlbCB7XG4gICAgICAgIC8vIEdldCBhIGN1cnNvciBwb2ludGluZyB0byB0aGUgdGFibGUgZWxlbWVudFxuICAgICAgICBsZXQgdGFibGVDdXJzb3IgPSBpblRhYmxlQ3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcInRhYmxlXCJdKTtcbiAgICAgICAgaWYgKCF0YWJsZUN1cnNvcikgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB3YWxrVGFibGVDdXJzb3IgPSB0YWJsZUN1cnNvci5jbG9uZSgpO1xuXG4gICAgICAgIGxldCByZXRWYWw6IFRhYmxlTW9kZWwgPSBbXTsgIC8vIFRoZSBjb21wbGV0ZSB0YWJsZSBtb2RlbCB3ZSdyZSBidWlsZGluZ1xuICAgICAgICBsZXQgY3VyUm93OiBSb3dNb2RlbCA9IFtdOyAgICAvLyBUaGUgY3VycmVudCByb3cgYmVpbmcgcHJvY2Vzc2VkXG4gICAgICAgIGxldCBwcmV2Um93OiBSb3dNb2RlbDsgICAgICAgIC8vIFRoZSBwcmV2aW91cyByb3cgKG5lZWRlZCBmb3Igcm93c3BhbiBoYW5kbGluZylcbiAgICAgICAgXG4gICAgICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgdGFibGUncyBET00gc3RydWN0dXJlXG4gICAgICAgIHdoaWxlICh3YWxrVGFibGVDdXJzb3IubmV4dCgoKSA9PiB0cnVlKSAmJiAhd2Fsa1RhYmxlQ3Vyc29yLmdldE5vZGUoKS5pc1NhbWVOb2RlKHRhYmxlQ3Vyc29yLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgIGlmICh3YWxrVGFibGVDdXJzb3IuaXNFbmRUYWcoKSAmJiB3YWxrVGFibGVDdXJzb3IuZ2V0Um9sZSgpID09PSBcInJvd1wiKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSByb3csIHB1c2ggd2hhdCB3ZSBoYXZlIGFuZCByZXNldFxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGN1clJvdyk7XG4gICAgICAgICAgICAgICAgcHJldlJvdyA9IGN1clJvdztcbiAgICAgICAgICAgICAgICBjdXJSb3cgPSBbXTtcblxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBjZWxscyB3aXRoIHJvd3NwYW4gZnJvbSBwcmV2aW91cyByb3dzIHRoYXQgYWZmZWN0IHRoaXMgcm93XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNlbGxzIHNwYW5uaW5nIG11bHRpcGxlIHJvd3MgYXJlIHByb3Blcmx5IHJlcHJlc2VudGVkIGluIHRoZSBtb2RlbFxuICAgICAgICAgICAgICAgIHdoaWxlIChwcmV2Um93ICYmIGN1clJvdy5sZW5ndGggPCBwcmV2Um93Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICgocHJldlJvd1tjdXJSb3cubGVuZ3RoXS5yb3dJbmRleFN0YXJ0ICsgcHJldlJvd1tjdXJSb3cubGVuZ3RoXS5yb3dzcGFuIC0gMSkgPj0gcmV0VmFsLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyUm93LnB1c2gocHJldlJvd1tjdXJSb3cubGVuZ3RoXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBQcm9jZXNzIGVhY2ggY2VsbCBpbiB0aGUgcm93XG4gICAgICAgICAgICBpZiAoIXdhbGtUYWJsZUN1cnNvci5pc0VuZFRhZygpICYmIGlzQ3Vyc29yQ2VsbFJvbGUod2Fsa1RhYmxlQ3Vyc29yKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHNwYW4gPSBnZXRDb2xTcGFuKHdhbGtUYWJsZUN1cnNvcik7XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY2VsbCBtb2RlbCB3aXRoIHBvc2l0aW9uIGFuZCBzcGFubmluZyBpbmZvcm1hdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxJbmZvOiBDZWxsTW9kZWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4U3RhcnQ6IHJldFZhbC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGNvbEluZGV4U3RhcnQ6IGN1clJvdy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHJvd3NwYW46IGdldFJvd1NwYW4od2Fsa1RhYmxlQ3Vyc29yKSxcbiAgICAgICAgICAgICAgICAgICAgY29sc3BhbixcbiAgICAgICAgICAgICAgICAgICAgY2VsbEN1cnNvcjogd2Fsa1RhYmxlQ3Vyc29yLmNsb25lKClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEZvciBjZWxscyB3aXRoIGNvbHNwYW4sIGFkZCB0aGUgc2FtZSBjZWxsIGluZm8gdG8gbXVsdGlwbGUgY29sdW1uc1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8Y29sc3BhbjsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyUm93LnB1c2goY2VsbEluZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBDb250aW51ZSBoYW5kbGluZyBjZWxscyB3aXRoIHJvd3NwYW4gZnJvbSBwcmV2aW91cyByb3dzXG4gICAgICAgICAgICAgICAgd2hpbGUgKHByZXZSb3cgJiYgY3VyUm93Lmxlbmd0aCA8IHByZXZSb3cubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgICAgKChwcmV2Um93W2N1clJvdy5sZW5ndGhdLnJvd0luZGV4U3RhcnQgKyBwcmV2Um93W2N1clJvdy5sZW5ndGhdLnJvd3NwYW4gLSAxKSA+PSByZXRWYWwubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJSb3cucHVzaChwcmV2Um93W2N1clJvdy5sZW5ndGhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjZWxsIG1vZGVsIGZvciBhIHNwZWNpZmljIGNlbGwgaW4gdGhlIHRhYmxlXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBDZWxsTW9kZWwgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHNwZWNpZmljIGNlbGwsXG4gICAgICogd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgaXRzIHBvc2l0aW9uIGFuZCBzcGFubmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbkNlbGxDdXJzb3IgLSBBIGN1cnNvciBwb2ludGluZyB0byBhIGNlbGwgb3IgaXRzIGNvbnRlbnRzXG4gICAgICogQHBhcmFtIHRhYmxlTW9kZWwgLSBPcHRpb25hbCBwcmUtYnVpbHQgdGFibGUgbW9kZWwgKHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgcHJvdmlkZWQpXG4gICAgICogQHJldHVybnMgVGhlIENlbGxNb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBjZWxsLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDZWxsTW9kZWwoaW5DZWxsQ3Vyc29yOiBTUkN1cnNvciwgdGFibGVNb2RlbD86IFRhYmxlTW9kZWwpIDogQ2VsbE1vZGVsIHtcbiAgICAgICAgbGV0IGNlbGxDdXJzb3IgPSBnZXRDdXJyZW50T3JQYXJlbnRDZWxsQ3Vyc29yKGluQ2VsbEN1cnNvcik7XG4gICAgICAgIGlmICghdGFibGVNb2RlbCkge1xuICAgICAgICAgICAgdGFibGVNb2RlbCA9IGdldFRhYmxlTW9kZWwoaW5DZWxsQ3Vyc29yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZWFyY2ggdGhyb3VnaCB0aGUgdGFibGUgbW9kZWwgdG8gZmluZCB0aGUgbWF0Y2hpbmcgY2VsbFxuICAgICAgICBmb3IgKGxldCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgdGFibGVNb2RlbC5sZW5ndGg7ICsrcm93SW5kZXgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCB0YWJsZU1vZGVsW3Jvd0luZGV4XS5sZW5ndGg7ICsrY29sSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFibGVNb2RlbFtyb3dJbmRleF1bY29sSW5kZXhdLmNlbGxDdXJzb3IuaXNTYW1lTm9kZShjZWxsQ3Vyc29yKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGVNb2RlbFtyb3dJbmRleF1bY29sSW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjZWxsIHNwYW5zIGEgc3BlY2lmaWMgY29sdW1uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2VsbE1vZGVsIC0gVGhlIGNlbGwgbW9kZWwgdG8gY2hlY2tcbiAgICAgKiBAcGFyYW0gY29sSWR4IC0gVGhlIGNvbHVtbiBpbmRleCB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNlbGwgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW5cbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gY2VsbE1vZGVsQ29udGFpbnNDb2x1bW4oY2VsbE1vZGVsOiBDZWxsTW9kZWwsIGNvbElkeDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBjb2xJZHggPj0gY2VsbE1vZGVsLmNvbEluZGV4U3RhcnQgJiYgY29sSWR4IDwgY2VsbE1vZGVsLmNvbEluZGV4U3RhcnQrY2VsbE1vZGVsLmNvbHNwYW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgY2VsbCBzcGFucyBhIHNwZWNpZmljIHJvd1xuICAgICAqXG4gICAgICogQHBhcmFtIGNlbGxNb2RlbCAtIFRoZSBjZWxsIG1vZGVsIHRvIGNoZWNrXG4gICAgICogQHBhcmFtIHJvd0lkeCAtIFRoZSByb3cgaW5kZXggdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjZWxsIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcm93XG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNlbGxNb2RlbENvbnRhaW5zUm93KGNlbGxNb2RlbDogQ2VsbE1vZGVsLCByb3dJZHg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gcm93SWR4ID49IGNlbGxNb2RlbC5yb3dJbmRleFN0YXJ0ICYmIHJvd0lkeCA8IGNlbGxNb2RlbC5yb3dJbmRleFN0YXJ0K2NlbGxNb2RlbC5yb3dzcGFuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvdyBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGxcbiAgICAgKiBGaXJzdCBjaGVja3MgZm9yIGV4cGxpY2l0IGhlYWRlcnMgYXR0cmlidXRlLCB0aGVuIGxvb2tzIGZvciByb3cgaGVhZGVycyBpbiB0aGUgc2FtZSByb3dcbiAgICAgKiBAcGFyYW0gY3Vyc29yIC0gVGhlIFNSQ3Vyc29yIHBvaW50aW5nIHRvIGEgY2VsbFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbmNhdGVuYXRlZCBoZWFkZXIgbmFtZXNcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Um93SGVhZGVycyhjdXJzb3I6IFNSQ3Vyc29yKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbHVtbiBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGxcbiAgICAgKiBGaXJzdCBjaGVja3MgZm9yIGV4cGxpY2l0IGhlYWRlcnMgYXR0cmlidXRlLCB0aGVuIGxvb2tzIGZvciBjb2x1bW4gaGVhZGVycyBpbiB0aGUgc2FtZSBjb2x1bW5cbiAgICAgKiBAcGFyYW0gY3Vyc29yIC0gVGhlIFNSQ3Vyc29yIHBvaW50aW5nIHRvIGEgY2VsbFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbmNhdGVuYXRlZCBoZWFkZXIgbmFtZXNcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Q29sdW1uSGVhZGVyc0ZvckN1cnNvcihpbkNlbGxDdXJzb3I6IFNSQ3Vyc29yLCB0YWJsZU1vZGVsPzogVGFibGVNb2RlbCkge1xuICAgICAgICBpZiAoIXRhYmxlTW9kZWwpIHtcbiAgICAgICAgICAgIHRhYmxlTW9kZWwgPSBnZXRUYWJsZU1vZGVsKGluQ2VsbEN1cnNvcik7XG4gICAgICAgICAgICBpZiAoIXRhYmxlTW9kZWwpIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbGxNb2RlbCA9IGdldENlbGxNb2RlbChpbkNlbGxDdXJzb3IsIHRhYmxlTW9kZWwpO1xuICAgICAgICBpZiAoIWNlbGxNb2RlbCkgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgY29uc3QgY2VsbEN1cnNvciA9IGNlbGxNb2RlbC5jZWxsQ3Vyc29yO1xuICAgICAgICBpZiAoIWNlbGxDdXJzb3IpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IGNlbGxFbGVtID0gY2VsbEN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgIGlmICghY2VsbEVsZW0pIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IGNvbERhdGFzOiBBcnJheTx7XG4gICAgICAgICAgICBwb3RlbnRpYWxDb2xIZWFkZXJzOiBTUkN1cnNvcltdLFxuICAgICAgICAgICAgZXhpc3RzRGF0YUNlbGw6IGJvb2xlYW4sXG4gICAgICAgICAgICBjb2xJZHg6IG51bWJlclxuICAgICAgICB9PiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBjb2xJZHggPSBjZWxsTW9kZWwuY29sSW5kZXhTdGFydDsgY29sSWR4IDwgY2VsbE1vZGVsLmNvbEluZGV4U3RhcnQrY2VsbE1vZGVsLmNvbHNwYW47ICsrY29sSWR4KSB7XG4gICAgICAgICAgICBjb2xEYXRhcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwb3RlbnRpYWxDb2xIZWFkZXJzOiBbXSxcbiAgICAgICAgICAgICAgICBleGlzdHNEYXRhQ2VsbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29sSWR4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcG90ZW50aWFsSGVhZGVyczogU1JDdXJzb3JbXSA9IFtdO1xuICAgICAgICBpZiAoY2VsbEVsZW0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycyA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIilcbiAgICAgICAgICAgICAgICAvLyBTcGxpdCB0aGUgaGVhZGVyIGF0dHJpYnV0ZSBpbnRvIGlkc1xuICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIilcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGUgZm9yIGVhY2ggaWRcbiAgICAgICAgICAgICAgICAubWFwKGlkID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlcbiAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIGJhZCBtYXBwaW5nc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiAhIW5vZGUpXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydCB0byBTUkN1cnNvcnMgdG8gdGhhdCB3ZSBjYW4gZ2V0IGFjY2Vzc2libGUgbmFtZXNcbiAgICAgICAgICAgICAgICAubWFwKG5vZGUgPT4gbmV3IFNSQ3Vyc29yKG5vZGUpKVxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBoZWFkZXJzIHRoYXQgYXJlbid0IGluIHRoZSBzYW1lIGNvbHVtbiAoaWdub3JlIGNvbHVtbiBoZWFkZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoY3Vyc29yID0+IGNvbERhdGFzLnNvbWUoY29sRGF0YSA9PiBjZWxsTW9kZWxDb250YWluc0NvbHVtbihTUlRhYmxlVXRpbC5nZXRDZWxsTW9kZWwoY3Vyc29yLCB0YWJsZU1vZGVsKSwgY29sRGF0YS5jb2xJZHgpKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgY2VsbHMgaW4gdGhpcyBjb2x1bW5cbiAgICAgICAgICAgIC8vIE5vdGUgLSBpZiBldmVyeXRoaW5nIGluIHRoaXMgY29sdW1uIGlzIGVtcHR5IG9yIGEgaGVhZGVyIGNlbGwsIHRoaXMgaXMgcHJvYmFibHkgbm90IGEgaGVhZGluZ1xuICAgICAgICAgICAgZm9yIChsZXQgcm93SWR4PTA7IHJvd0lkeCA8IHRhYmxlTW9kZWwubGVuZ3RoOyArK3Jvd0lkeCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29sRGF0YSBvZiBjb2xEYXRhcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xJZHggPSBjb2xEYXRhLmNvbElkeDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tJbmZvID0gdGFibGVNb2RlbFtyb3dJZHhdW2NvbElkeF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrQ3Vyc29yID0gY2hlY2tJbmZvLmNlbGxDdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrQ3Vyc29yRWxlbSA9IGNoZWNrQ3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyByb3cvY29sIGlzbid0IGZvdW5kLCBvciBpcyB0aGUgc2FtZSBjdXJzb3IgYXMgb3VyIG9yaWdpbmFsIGNlbGwgbW9kZWwsIG9yIGFscmVhZHkgaW4gb3VyIGxpc3QsIHNraXAsIGJ1dCBjaGVjayBpZiBpdCdzIGEgZGF0YSBjZWxsXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tJbmZvIHx8ICFjaGVja0N1cnNvciB8fCBjaGVja0N1cnNvci5pc1NhbWVOb2RlKGNlbGxDdXJzb3IpIHx8IHBvdGVudGlhbEhlYWRlcnMuc29tZShjID0+IGNoZWNrQ3Vyc29yLmlzU2FtZU5vZGUoYykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhLmV4aXN0c0RhdGFDZWxsID0gY29sRGF0YS5leGlzdHNEYXRhQ2VsbCB8fCAoaXNEYXRhQ2VsbChjaGVja0N1cnNvcikgJiYgKGNoZWNrQ3Vyc29yLmhhc05vbkVtcHR5TmFtZSgpIHx8IGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBjaGVja0N1cnNvci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDdXJzb3IuZ2V0Um9sZSgpID09PSBcImNvbHVtbmhlYWRlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhLnBvdGVudGlhbENvbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2hlY2tDdXJzb3JFbGVtLmhhc0F0dHJpYnV0ZShcInJvbGVcIikgJiYgY2hlY2tDdXJzb3JFbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVEhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ3Vyc29yRWxlbS5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PT0gXCJjb2xcIiB8fCBjaGVja0N1cnNvckVsZW0uZ2V0QXR0cmlidXRlKFwic2NvcGVcIikgPT09IFwiYXhpc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2hlY2tDdXJzb3JFbGVtLmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpICYmIGNoZWNrQ3Vyc29yLmhhc05vbkVtcHR5TmFtZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YS5leGlzdHNEYXRhQ2VsbCA9IGNvbERhdGEuZXhpc3RzRGF0YUNlbGwgfHwgKGlzRGF0YUNlbGwoY2hlY2tDdXJzb3IpICYmIChjaGVja0N1cnNvci5oYXNOb25FbXB0eU5hbWUoKSB8fCBjb2xEYXRhLnBvdGVudGlhbENvbEhlYWRlcnMubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBjb2xEYXRhIG9mIGNvbERhdGFzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb2xEYXRhLmV4aXN0c0RhdGFDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMgPSBwb3RlbnRpYWxIZWFkZXJzLmZpbHRlcihvbmUgPT4gY29sRGF0YXMuc29tZShjb2xEYXRhID0+IGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5zb21lKHR3byA9PiB0d28uaXNTYW1lTm9kZShvbmUpKSkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvdGVudGlhbEhlYWRlcnNcbiAgICAgICAgICAgIC8vIEFuZCB0aGVuIHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGhlYWRlcnNcbiAgICAgICAgICAgIC5tYXAoY3Vyc29yID0+IGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lIHx8IFwiXCIpXG4gICAgICAgICAgICAubWFwKHMgPT4gcy50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKHMgPT4gcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByb3cgaGVhZGVycyBhc3NvY2lhdGVkIHdpdGggYSBjZWxsXG4gICAgICogRmlyc3QgY2hlY2tzIGZvciBleHBsaWNpdCBoZWFkZXJzIGF0dHJpYnV0ZSwgdGhlbiBsb29rcyBmb3Igcm93IGhlYWRlcnMgaW4gdGhlIHNhbWUgcm93XG4gICAgICogQHBhcmFtIGN1cnNvciAtIFRoZSBTUkN1cnNvciBwb2ludGluZyB0byBhIGNlbGxcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBjb25jYXRlbmF0ZWQgaGVhZGVyIG5hbWVzXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFJvd0hlYWRlcnNGb3JDdXJzb3IoaW5DZWxsQ3Vyc29yOiBTUkN1cnNvciwgdGFibGVNb2RlbD86IFRhYmxlTW9kZWwpIHtcbiAgICAgICAgaWYgKCF0YWJsZU1vZGVsKSB7XG4gICAgICAgICAgICB0YWJsZU1vZGVsID0gZ2V0VGFibGVNb2RlbChpbkNlbGxDdXJzb3IpO1xuICAgICAgICAgICAgaWYgKCF0YWJsZU1vZGVsKSByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjZWxsTW9kZWwgPSBnZXRDZWxsTW9kZWwoaW5DZWxsQ3Vyc29yLCB0YWJsZU1vZGVsKTtcbiAgICAgICAgaWYgKCFjZWxsTW9kZWwpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IGNlbGxDdXJzb3IgPSBjZWxsTW9kZWwuY2VsbEN1cnNvcjtcbiAgICAgICAgaWYgKCFjZWxsQ3Vyc29yKSByZXR1cm4gXCJcIjtcblxuICAgICAgICBjb25zdCBjZWxsRWxlbSA9IGNlbGxDdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICBpZiAoIWNlbGxFbGVtKSByZXR1cm4gXCJcIjtcblxuICAgICAgICBjb25zdCByb3dEYXRhczogQXJyYXk8e1xuICAgICAgICAgICAgcG90ZW50aWFsUm93SGVhZGVyczogU1JDdXJzb3JbXSxcbiAgICAgICAgICAgIGV4aXN0c0RhdGFDZWxsOiBib29sZWFuLFxuICAgICAgICAgICAgcm93SWR4OiBudW1iZXJcbiAgICAgICAgfT4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcm93SWR4ID0gY2VsbE1vZGVsLnJvd0luZGV4U3RhcnQ7IHJvd0lkeCA8IGNlbGxNb2RlbC5yb3dJbmRleFN0YXJ0K2NlbGxNb2RlbC5yb3dzcGFuOyArK3Jvd0lkeCkge1xuICAgICAgICAgICAgcm93RGF0YXMucHVzaCh7XG4gICAgICAgICAgICAgICAgcG90ZW50aWFsUm93SGVhZGVyczogW10sXG4gICAgICAgICAgICAgICAgZXhpc3RzRGF0YUNlbGw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJvd0lkeFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcG90ZW50aWFsSGVhZGVyczogU1JDdXJzb3JbXSA9IFtdO1xuICAgICAgICBpZiAoY2VsbEVsZW0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycyA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIilcbiAgICAgICAgICAgICAgICAvLyBTcGxpdCB0aGUgaGVhZGVyIGF0dHJpYnV0ZSBpbnRvIGlkc1xuICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIilcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGUgZm9yIGVhY2ggaWRcbiAgICAgICAgICAgICAgICAubWFwKGlkID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlcbiAgICAgICAgICAgICAgICAvLyBHZXQgcmlkIG9mIGJhZCBtYXBwaW5nc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIobm9kZSA9PiAhIW5vZGUpXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydCB0byBTUkN1cnNvcnMgdG8gdGhhdCB3ZSBjYW4gZ2V0IGFjY2Vzc2libGUgbmFtZXNcbiAgICAgICAgICAgICAgICAubWFwKG5vZGUgPT4gbmV3IFNSQ3Vyc29yKG5vZGUpKVxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBoZWFkZXJzIHRoYXQgYXJlbid0IGluIHRoZSBzYW1lIHJvdyAoaWdub3JlIGNvbHVtbiBoZWFkZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoY3Vyc29yID0+IHJvd0RhdGFzLnNvbWUocm93RGF0YSA9PiBjZWxsTW9kZWxDb250YWluc1JvdyhTUlRhYmxlVXRpbC5nZXRDZWxsTW9kZWwoY3Vyc29yLCB0YWJsZU1vZGVsKSwgcm93RGF0YS5yb3dJZHgpKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgY2VsbHMgaW4gdGhlIHJvd3NcbiAgICAgICAgICAgIC8vIE5vdGUgLSBpZiBldmVyeXRoaW5nIGluIHRoZSByb3cgaXMgZW1wdHkgb3IgYSBoZWFkZXIgY2VsbCwgdGhpcyBpcyBwcm9iYWJseSBub3QgYSBoZWFkaW5nXG4gICAgICAgICAgICBsZXQgbG9uZ2VzdFJvdyA9IHJvd0RhdGFzLnJlZHVjZSgocHJldiwgY3VyKSA9PiBNYXRoLm1heChwcmV2LCB0YWJsZU1vZGVsW2N1ci5yb3dJZHhdLmxlbmd0aCksIDApO1xuICAgICAgICAgICAgZm9yIChsZXQgY29sSWR4PTA7IGNvbElkeCA8IGxvbmdlc3RSb3c7ICsrY29sSWR4KSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByb3dEYXRhIG9mIHJvd0RhdGFzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd0lkeCA9IHJvd0RhdGEucm93SWR4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sSWR4ID49IHRhYmxlTW9kZWxbcm93SWR4XS5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZm8gPSB0YWJsZU1vZGVsW3Jvd0lkeF1bY29sSWR4XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJzb3IgPSBjaGVja0luZm8uY2VsbEN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJzb3JFbGVtID0gY2hlY2tDdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHJvdy9jb2wgaXNuJ3QgZm91bmQsIG9yIGlzIHRoZSBzYW1lIGN1cnNvciBhcyBvdXIgb3JpZ2luYWwgY2VsbCBtb2RlbCwgb3IgYWxyZWFkeSBpbiBvdXIgbGlzdCwgc2tpcCwgYnV0IGNoZWNrIGlmIGl0J3MgYSBkYXRhIGNlbGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0luZm8gfHwgIWNoZWNrQ3Vyc29yIHx8IGNoZWNrQ3Vyc29yLmlzU2FtZU5vZGUoY2VsbEN1cnNvcikgfHwgcG90ZW50aWFsSGVhZGVycy5zb21lKGMgPT4gY2hlY2tDdXJzb3IuaXNTYW1lTm9kZShjKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGEuZXhpc3RzRGF0YUNlbGwgPSByb3dEYXRhLmV4aXN0c0RhdGFDZWxsIHx8IChpc0RhdGFDZWxsKGNoZWNrQ3Vyc29yKSAmJiAoY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkgfHwgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGNoZWNrQ3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0N1cnNvci5nZXRSb2xlKCkgPT09IFwicm93aGVhZGVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGEucG90ZW50aWFsUm93SGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja0N1cnNvckVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBjaGVja0N1cnNvckVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJUSFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDdXJzb3JFbGVtLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09PSBcInJvd1wiIHx8IGNoZWNrQ3Vyc29yRWxlbS5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PT0gXCJheGlzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja0N1cnNvckVsZW0uaGFzQXR0cmlidXRlKFwic2NvcGVcIikgJiYgY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhLmV4aXN0c0RhdGFDZWxsID0gcm93RGF0YS5leGlzdHNEYXRhQ2VsbCB8fCAoaXNEYXRhQ2VsbChjaGVja0N1cnNvcikgJiYgKGNoZWNrQ3Vyc29yLmhhc05vbkVtcHR5TmFtZSgpIHx8IHJvd0RhdGEucG90ZW50aWFsUm93SGVhZGVycy5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJvd0RhdGEgb2Ygcm93RGF0YXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJvd0RhdGEuZXhpc3RzRGF0YUNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycyA9IHBvdGVudGlhbEhlYWRlcnMuZmlsdGVyKG9uZSA9PiByb3dEYXRhcy5zb21lKHJvd0RhdGEgPT4gcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLnNvbWUodHdvID0+IHR3by5pc1NhbWVOb2RlKG9uZSkpKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG90ZW50aWFsSGVhZGVyc1xuICAgICAgICAgICAgLy8gQW5kIHRoZW4gcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgaGVhZGVyc1xuICAgICAgICAgICAgLm1hcChjdXJzb3IgPT4gY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgfHwgXCJcIilcbiAgICAgICAgICAgIC5tYXAocyA9PiBzLnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIocyA9PiBzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBjZWxsIGlzIGEgZGF0YSBjZWxsIChub3QgYSBoZWFkZXIgY2VsbClcbiAgICAgKlxuICAgICAqIEEgZGF0YSBjZWxsIGlzIG9uZSB3aXRoIGVpdGhlcjpcbiAgICAgKiAtIEFuIGV4cGxpY2l0IEFSSUEgcm9sZSBvZiBcImNlbGxcIlxuICAgICAqIC0gQSBURCBlbGVtZW50IHdpdGhvdXQgYW4gb3ZlcnJpZGluZyByb2xlIGF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIGNoZWNrQ3Vyc29yIC0gVGhlIGN1cnNvciB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGN1cnNvciBwb2ludHMgdG8gYSBkYXRhIGNlbGxcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gaXNEYXRhQ2VsbChjaGVja0N1cnNvcjogU1JDdXJzb3IpIHtcbiAgICAgICAgY29uc3QgY2hlY2tDdXJzb3JFbGVtID0gY2hlY2tDdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICBpZiAoIWNoZWNrQ3Vyc29yRWxlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gY2hlY2tDdXJzb3IuZ2V0Um9sZSgpID09PSBcImNlbGxcIiB8fCAoIWNoZWNrQ3Vyc29yRWxlbS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIGNoZWNrQ3Vyc29yRWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlREXCIpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgbmFtZXNwYWNlIFNSVXRpbCB7XG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzTW9kYWxEaWFsb2dFbGVtZW50KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiByb2xlID09PSBcImRpYWxvZ1wiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1tb2RhbFwiKSA9PT0gXCJ0cnVlXCIgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIENTUyBzZWxlY3RvciBmb3IgYSBzcGVjaWZpYyBIVE1MIGVsZW1lbnRcbiAgICAgKiBUaGUgc2VsZWN0b3IgaXMgYnVpbHQgdXNpbmcgYSBjb21iaW5hdGlvbiBvZjpcbiAgICAgKiAxLiBFbGVtZW50IHRhZyBuYW1lXG4gICAgICogMi4gSUQgKGlmIGF2YWlsYWJsZSlcbiAgICAgKiAzLiBDbGFzc2VzIChpZiBhdmFpbGFibGUpXG4gICAgICogNC4gQXR0cmlidXRlcyAoaWYgbmVlZGVkKVxuICAgICAqIDUuIG50aC1jaGlsZCBzZWxlY3RvcnMgZm9yIHBvc2l0aW9uIGluIHBhcmVudFxuICAgICAqIFxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gZ2VuZXJhdGUgYSBzZWxlY3RvciBmb3JcbiAgICAgKiBAcGFyYW0gb3B0aW1pemVkIElmIHRydWUsIGNyZWF0ZXMgYSBzaG9ydGVyIGJ1dCBwb3NzaWJseSBsZXNzIHJvYnVzdCBzZWxlY3RvclxuICAgICAqIEByZXR1cm4gQSBDU1Mgc2VsZWN0b3Igc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZWxlbWVudFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRVbmlxdWVTZWxlY3RvcihlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW1pemVkOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYW4gSUQsIHRoYXQncyB0aGUgbW9zdCBkaXJlY3Qgd2F5IHRvIHNlbGVjdCBpdFxuICAgICAgICBpZiAoZWxlbWVudC5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIGAjJHtDU1MuZXNjYXBlKGVsZW1lbnQuaWQpfWA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHdlJ3JlIGF0IHRoZSByb290IG9yIGRvY3VtZW50IGVsZW1lbnQsIHJldHVybiB0aGUgdGFnIG5hbWVcbiAgICAgICAgaWYgKGVsZW1lbnQuaXNTYW1lTm9kZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHx8IGVsZW1lbnQuaXNTYW1lTm9kZShkb2N1bWVudC5ib2R5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBTdGFydCBidWlsZGluZyB0aGUgc2VsZWN0b3Igd2l0aCB0aGUgdGFnIG5hbWVcbiAgICAgICAgbGV0IHNlbGVjdG9yID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBBZGQgY2xhc3NlcyBpZiBhdmFpbGFibGUgYW5kIHdlJ3JlIG5vdCBvcHRpbWl6aW5nIGZvciBicmV2aXR5XG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5sZW5ndGggJiYgIW9wdGltaXplZCkge1xuICAgICAgICAgICAgLy8gVGFrZSB1cCB0byAzIGNsYXNzZXMgdG8gYXZvaWQgb3Zlcmx5IHNwZWNpZmljIHNlbGVjdG9yc1xuICAgICAgICAgICAgY29uc3QgY2xhc3NlcyA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpLnNsaWNlKDAsIDMpO1xuICAgICAgICAgICAgc2VsZWN0b3IgKz0gY2xhc3Nlcy5tYXAoY2xzID0+IGAuJHtDU1MuZXNjYXBlKGNscyl9YCkuam9pbignJyk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEFkZCBkaXN0aW5ndWlzaGluZyBhdHRyaWJ1dGVzIGlmIG5lZWRlZCBhbmQgbm90IG9wdGltaXppbmdcbiAgICAgICAgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIGFkZGluZyByb2xlLCBhcmlhLWxhYmVsLCBvciBvdGhlciBkaXN0aW5jdGl2ZSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3JvbGUnKSkge1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yICs9IGBbcm9sZT1cIiR7Q1NTLmVzY2FwZShlbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpIHx8ICcnKX1cIl1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSB8fCAnJztcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwubGVuZ3RoIDw9IDIwKSB7IC8vIEF2b2lkIG92ZXJseSBsb25nIHNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciArPSBgW2FyaWEtbGFiZWw9XCIke0NTUy5lc2NhcGUobGFiZWwpfVwiXWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGb3IgaW5wdXRzLCBhZGQgdHlwZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndHlwZScpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3IgKz0gYFt0eXBlPVwiJHtDU1MuZXNjYXBlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0eXBlJykgfHwgJycpfVwiXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBwYXJlbnQgbm9kZSwgZGV0ZXJtaW5lIHBvc2l0aW9uIGFtb25nIHNpYmxpbmdzXG4gICAgICAgIGlmIChlbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIEZpbmQgYWxsIHNpYmxpbmdzIHdpdGggdGhlIHNhbWUgdGFnXG4gICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IEFycmF5LmZyb20oZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQudGFnTmFtZSA9PT0gZWxlbWVudC50YWdOYW1lKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIHNpYmxpbmcgd2l0aCB0aGUgc2FtZSB0YWcsIGFkZCBudGgtY2hpbGRcbiAgICAgICAgICAgIGlmIChzaWJsaW5ncy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzaWJsaW5ncy5pbmRleE9mKGVsZW1lbnQpICsgMTtcbiAgICAgICAgICAgICAgICBzZWxlY3RvciArPSBgOm50aC1vZi10eXBlKCR7aW5kZXh9KWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBhdCB0aGUgcm9vdCwgcmVjdXJzaXZlbHkgYnVpbGQgdGhlIHBhcmVudCBzZWxlY3RvclxuICAgICAgICAgICAgLy8gYnV0IHVzZSBvcHRpbWl6ZWQgc2VsZWN0b3JzIGZvciBhbmNlc3RvcnMgdG8ga2VlcCB0aGUgb3ZlcmFsbCBzZWxlY3RvciBtYW5hZ2VhYmxlXG4gICAgICAgICAgICByZXR1cm4gYCR7Z2V0VW5pcXVlU2VsZWN0b3IoZWxlbWVudC5wYXJlbnRFbGVtZW50LCB0cnVlKX0gPiAke3NlbGVjdG9yfWA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICB9XG59IiwiaW1wb3J0IHsgU1JDb250cm9sbGVyIH0gZnJvbSBcIi4vU1JDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uTW9kZSwgTmF2aWdhdGlvblJlc3VsdCB9IGZyb20gXCIuL1NSVHlwZXNcIjtcblxuLyoqXG4gKiBTUk92ZXJsYXkgY2xhc3MgZm9yIGNyZWF0aW5nIGEgVUkgd2lkZ2V0IHRvIGNvbnRyb2wgc2NyZWVuIHJlYWRlciBzaW11bGF0aW9uXG4gKiBQcm92aWRlcyBidXR0b25zIGZvciBuYXZpZ2F0aW9uIGFuZCBkaXNwbGF5cyByZXN1bHRzXG4gKi9cbmV4cG9ydCBjbGFzcyBTUk92ZXJsYXkge1xuICAgIC8qKiBUaGUgY29udGFpbmVyIGVsZW1lbnQgZm9yIHRoZSBvdmVybGF5ICovXG4gICAgcHJpdmF0ZSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIC8qKiBUaGUgcmVzdWx0cyBkaXNwbGF5IGVsZW1lbnQgKi9cbiAgICBwcml2YXRlIHJlc3VsdHNEaXNwbGF5OiBIVE1MRWxlbWVudDtcbiAgICAvKiogTmF2aWdhdGlvbiBtb2RlcyBhdmFpbGFibGUgaW4gdGhlIFVJICovXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uTW9kZXM6IHsgbW9kZTogTmF2aWdhdGlvbk1vZGUsIGxhYmVsOiBzdHJpbmcgfVtdID0gW1xuICAgICAgICB7IG1vZGU6IFwiaXRlbVwiLCBsYWJlbDogXCJJdGVtXCIgfSxcbiAgICAgICAgeyBtb2RlOiBcInRhYl9mb2N1c1wiLCBsYWJlbDogXCJUYWJiYWJsZVwiIH0sXG4gICAgICAgIHsgbW9kZTogXCJoZWFkaW5nXCIsIGxhYmVsOiBcIkhlYWRpbmdcIiB9LFxuICAgICAgICB7IG1vZGU6IFwicmVnaW9uXCIsIGxhYmVsOiBcIlJlZ2lvblwiIH1cbiAgICBdO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUk92ZXJsYXlcbiAgICAgKiBAcGFyYW0gY29udHJvbGxlciBUaGUgU1JDb250cm9sbGVyIGluc3RhbmNlIHRvIHVzZSBmb3IgbmF2aWdhdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3JWaWV3ZXI6IFNSVmlld2VyKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlT3ZlcmxheSgpO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBjcmVhdGVET01FbGVtZW50KGVsZW1OYW1lOiBzdHJpbmcsIGF0dHJzOiB7IFthdHRyOiBzdHJpbmddOiBzdHJpbmd9LCBzdHlsZXM6IFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4pIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHRoaXMuc3JWaWV3ZXIudmlld2VyRG9jLmNyZWF0ZUVsZW1lbnQoZWxlbU5hbWUpO1xuICAgICAgICBpZiAoYXR0cnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsW2tleV0gPSBhdHRyc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdHlsZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHN0eWxlcykge1xuICAgICAgICAgICAgICAgIHJldFZhbC5zdHlsZVtrZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBvdmVybGF5IFVJIGVsZW1lbnRzIGFuZCBhZGRzIHRoZW0gdG8gdGhlIERPTVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgLy8gQ3JlYXRlIG1haW4gY29udGFpbmVyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJpYm1hLXNyLW92ZXJsYXlcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgIGJvdHRvbTogJzAnLFxuICAgICAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC44KScsXG4gICAgICAgICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgIHBhZGRpbmc6ICcxMHB4JyxcbiAgICAgICAgICAgIHpJbmRleDogJzEwMDAwJyxcbiAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICAgICAgZ2FwOiAnMTBweCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNvbnRyb2xzIGNvbnRhaW5lclxuICAgICAgICBjb25zdCBjb250cm9sc0NvbnRhaW5lciA9IHRoaXMuY3JlYXRlRE9NRWxlbWVudChcImRpdlwiLCB7fSwgeyBcbiAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLCBmbGV4V3JhcDogXCJ3cmFwXCIsIGdhcDogXCIxMHB4XCJ9KTtcblxuICAgICAgICAvLyBDcmVhdGUgbmF2aWdhdGlvbiBtb2RlIGdyb3Vwc1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25Nb2Rlcy5mb3JFYWNoKG5hdk1vZGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgbW9kZUdyb3VwID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdkaXYnLCB7fSwge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGdhcDogJzVweCcsXG4gICAgICAgICAgICAgICAgbWFyZ2luOiAnMCAxMHB4J1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG1vZGVHcm91cC5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ3NwYW4nLCB7XG4gICAgICAgICAgICAgICAgdGV4dENvbnRlbnQ6IG5hdk1vZGUubGFiZWwgKyBcIjpcIlxuICAgICAgICAgICAgfSwge30pKTtcblxuICAgICAgICAgICAgLy8gUHJldmlvdXMgYnV0dG9uXG4gICAgICAgICAgICBjb25zdCBwcmV2QnV0dG9uID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdidXR0b24nLCB7XG4gICAgICAgICAgICAgICAgdGV4dENvbnRlbnQ6ICfil4AgUHJldidcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnNXB4IDEwcHgnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyM0NDQnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAnd2hpdGUnLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJldkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc3JWaWV3ZXIubmF2aWdhdGVQcmV2aW91cyhuYXZNb2RlLm1vZGUpKTtcbiAgICAgICAgICAgIG1vZGVHcm91cC5hcHBlbmRDaGlsZChwcmV2QnV0dG9uKTtcblxuICAgICAgICAgICAgLy8gTmV4dCBidXR0b25cbiAgICAgICAgICAgIGNvbnN0IG5leHRCdXR0b24gPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0Q29udGVudDogJ05leHQg4pa2J1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICc1cHggMTBweCcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzQ0NCcsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXh0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zclZpZXdlci5uYXZpZ2F0ZU5leHQobmF2TW9kZS5tb2RlKSk7XG4gICAgICAgICAgICBtb2RlR3JvdXAuYXBwZW5kQ2hpbGQobmV4dEJ1dHRvbik7XG5cbiAgICAgICAgICAgIGNvbnRyb2xzQ29udGFpbmVyLmFwcGVuZENoaWxkKG1vZGVHcm91cCk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgb3RoZXJCdXR0b25Hcm91cCA9IHRoaXMuY3JlYXRlRE9NRWxlbWVudCgnZGl2Jywge30sIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICBnYXA6ICc1cHgnLFxuICAgICAgICAgICAgbWFyZ2luOiAnMCAxMHB4J1xuICAgICAgICB9KVxuICAgICAgICAvLyBTaG93IGFsbCBidXR0b25cbiAgICAgICAgY29uc3Qgc2hvd0FsbEJ1dHRvbiA9IHRoaXMuY3JlYXRlRE9NRWxlbWVudCgnYnV0dG9uJywge1xuICAgICAgICAgICAgdGV4dENvbnRlbnQ6ICdTaG93IGFsbCdcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4JyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyM0NDQnLFxuICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICB9KTtcbiAgICAgICAgc2hvd0FsbEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc3JWaWV3ZXIuc2hvd0FsbCh0cnVlKSk7XG4gICAgICAgIG90aGVyQnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQoc2hvd0FsbEJ1dHRvbik7XG5cbiAgICAgICAgLy8gVG9nZ2xlIFNwZWVjaCBCdXR0b25cbiAgICAgICAgY29uc3QgdG9nZ2xlU3BlZWNoID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdidXR0b24nLCB7XG4gICAgICAgICAgICB0ZXh0Q29udGVudDogJ1RvZ2dsZSBzcGVlY2gnXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHBhZGRpbmc6ICc1cHggMTBweCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjNDQ0JyxcbiAgICAgICAgICAgIGNvbG9yOiAnd2hpdGUnLFxuICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgICAgfSk7XG4gICAgICAgIHRvZ2dsZVNwZWVjaC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc3JWaWV3ZXIudG9nZ2xlU3BlZWNoKCkpO1xuICAgICAgICBvdGhlckJ1dHRvbkdyb3VwLmFwcGVuZENoaWxkKHRvZ2dsZVNwZWVjaCk7XG4gICAgICAgIGNvbnRyb2xzQ29udGFpbmVyLmFwcGVuZENoaWxkKG90aGVyQnV0dG9uR3JvdXApO1xuXG5cbiAgICAgICAgLy8gQ3JlYXRlIHJlc3VsdHMgZGlzcGxheVxuICAgICAgICB0aGlzLnJlc3VsdHNEaXNwbGF5ID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdkaXYnLCB7XG4gICAgICAgICAgICB0ZXh0Q29udGVudDogJ1NjcmVlbiByZWFkZXIgc2ltdWxhdGlvbiByZXN1bHRzIHdpbGwgYXBwZWFyIGhlcmUuJ1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBwYWRkaW5nOiAnMTBweCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSknLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgICAgIG1pbkhlaWdodDogJzEwMHB4JyxcbiAgICAgICAgICAgIG1heEhlaWdodDogJzUwdmgnLFxuICAgICAgICAgICAgZm9udEZhbWlseTogJ21vbm9zcGFjZScsXG4gICAgICAgICAgICBvdmVyZmxvdzogJ2F1dG8nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCBlbGVtZW50cyB0byBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoY29udHJvbHNDb250YWluZXIpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnJlc3VsdHNEaXNwbGF5KTtcblxuICAgICAgICAvLyBBZGQgdG8gZG9jdW1lbnRcbiAgICAgICAgdGhpcy5zclZpZXdlci52aWV3ZXJEb2MuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheSB0aGUgbmF2aWdhdGlvbiByZXN1bHQgaW4gdGhlIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBuYXZpZ2F0aW9uIHJlc3VsdFxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdXNlZFxuICAgICAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIG5hdmlnYXRpb24gZGlyZWN0aW9uICgnbmV4dCcsICdwcmV2aW91cycsIG9yICdmb2N1cycpXG4gICAgICovXG4gICAgcHVibGljIGRpc3BsYXlSZXN1bHQocmVzdWx0OiBOYXZpZ2F0aW9uUmVzdWx0LCBtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgZGlyZWN0aW9uOiAnbmV4dCcgfCAncHJldmlvdXMnIHwgJ2ZvY3VzJyk6IHZvaWQge1xuICAgICAgICBsZXQgZGlzcGxheVRleHQgPSAnJztcbiAgICAgICAgXG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI/Pz9cIiwgcmVzdWx0KTtcbiAgICAgICAgICAgIGRpc3BsYXlUZXh0ID0gYCR7ZGlyZWN0aW9uLnRvVXBwZXJDYXNlKCl9ICR7bW9kZX06ICR7cmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaXNwbGF5VGV4dCA9IGAke2RpcmVjdGlvbi50b1VwcGVyQ2FzZSgpfSAke21vZGV9OiAke3Jlc3VsdC5yZW5kZXJpbmdSZXN1bHQubWVzc2FnZX1gO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5yZW5kZXJpbmdSZXN1bHQuZW5kPy5nZXRFbGVtZW50KCk/LnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgIHJlc3VsdC5yZW5kZXJpbmdSZXN1bHQuc3RhcnQ/LmdldEVsZW1lbnQoKT8uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgd2luZG93LnNjcm9sbEJ5KDAsIC0yMDApO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5yZXN1bHRzRGlzcGxheS5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB0aGlzLnJlc3VsdHNEaXNwbGF5LnRleHRDb250ZW50ID0gZGlzcGxheVRleHQ7XG4gICAgICAgIGxldCBpbnNwZWN0QnV0dG9uID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgIGlubmVyVGV4dDogXCJEZWJ1Z1wiXG4gICAgICAgIH0sIHtcbiAgICAgICAgfSk7XG4gICAgICAgIGluc3BlY3RCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5yZW5kZXJpbmdSZXN1bHQuc3RhcnQ/LmdldE5vZGUoKSwgcmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5lbmQ/LmdldE5vZGUoKSk7XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMucmVzdWx0c0Rpc3BsYXkuYXBwZW5kQ2hpbGQoaW5zcGVjdEJ1dHRvbilcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcGxheUFsbChyZXN1bHQ6IEFycmF5PHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwidGFibGVcIiwge30sIHt9KTtcbiAgICAgICAgY29uc3QgaGVhZGVyUm93ID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwidHJcIiwge30sIHt9KTtcbiAgICAgICAgY29uc3QgaGVhZGluZ0xhYmVscyA9IFtcIlJlZ2lvblwiLCBcIkhlYWRpbmdcIiwgXCJJdGVtXCIsIFwiVGFiYmFibGVcIl07XG4gICAgICAgIGNvbnN0IGhlYWRpbmdGaWVsZHMgPSBbXCJyZWdpb25cIiwgXCJoZWFkaW5nXCIsIFwiaXRlbVwiLCBcInRhYl9mb2N1c1wiXTtcbiAgICAgICAgZm9yIChjb25zdCBoZWFkaW5nTGFiZWwgb2YgaGVhZGluZ0xhYmVscykge1xuICAgICAgICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRE9NRWxlbWVudChcInRoXCIsIHtcbiAgICAgICAgICAgICAgICBzY29wZTogXCJjb2xcIixcbiAgICAgICAgICAgICAgICBpbm5lclRleHQ6IGhlYWRpbmdMYWJlbFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogXCJsZWZ0XCIsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogXCIuMjVyZW1cIixcbiAgICAgICAgICAgICAgICBtYXJnaW46IFwiMHJlbVwiLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBcIndoaXRlXCJcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKGhlYWRlclJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcmVzdWx0KSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhUm93ID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwidHJcIiwge30sIHt9KTtcbiAgICAgICAgICAgIGhlYWRpbmdGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhUm93LmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRE9NRWxlbWVudChcInRkXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJUZXh0OiBsaW5lW2ZpZWxkXVxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogXCJ0b3BcIixcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBcInNvbGlkIHdoaXRlIDFweFwiLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIi4yNXJlbVwiLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IFwiMHJlbVwiLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCJ3aGl0ZVwiXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKGRhdGFSb3cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzdWx0c0Rpc3BsYXkuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgdGhpcy5yZXN1bHRzRGlzcGxheS5hcHBlbmRDaGlsZCh0YWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBvdmVybGF5IGZyb20gdGhlIERPTVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250YWluZXIgJiYgdGhpcy5jb250YWluZXIucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogU1JWaWV3ZXIgY2xhc3MgZm9yIG1hbmFnaW5nIHNjcmVlbiByZWFkZXIgc2ltdWxhdGlvbiB3aXRoIFVJIGNvbnRyb2xzXG4gKi9cbmV4cG9ydCBjbGFzcyBTUlZpZXdlciB7XG4gICAgLyoqIFRoZSBjb250cm9sbGVyIGluc3RhbmNlICovXG4gICAgcHJpdmF0ZSBjb250cm9sbGVyOiBTUkNvbnRyb2xsZXI7XG4gICAgLyoqIFRoZSBvdmVybGF5IFVJIGluc3RhbmNlICovXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBTUk92ZXJsYXk7XG4gICAgLyoqIEZsYWcgdG8gdHJhY2sgaWYgc3BlZWNoIGlzIGFjdGl2ZSAqL1xuICAgIHByaXZhdGUgaXNTdHJlYW1pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKiogRmxhZyB0byBzZXQgaWYgc2hvd2luZyBhbGwgKi9cbiAgICBwcml2YXRlIGlzU2hvd2luZ0FsbDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKiBGbGFnIHRvIHNldCBpZiBpdCBzaG91bGQgYmUgc3BlYWtpbmcgKi9cbiAgICBwcml2YXRlIHNwZWVjaEVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKiogS2V5Ym9hcmQgZXZlbnQgaGFuZGxlciAqL1xuICAgIHByaXZhdGUga2V5Ym9hcmRIYW5kbGVyOiAoZTogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZDtcbiAgICAvKiogRm9jdXMgZXZlbnQgaGFuZGxlciAqL1xuICAgIHByaXZhdGUgZm9jdXNIYW5kbGVyOiAoZTogRm9jdXNFdmVudCkgPT4gdm9pZDtcbiAgICB2aWV3ZXJEb2M6IEhUTUxEb2N1bWVudDtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU1JWaWV3ZXJcbiAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCB0byBzdGFydCBmcm9tIChkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5KVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJvb3RFbGVtZW50OiBOb2RlID0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICB0aGlzLnZpZXdlckRvYyA9IHJvb3RFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIC8vIENyZWF0ZSBjb250cm9sbGVyIGZvciB0aGUgZG9jdW1lbnQgYm9keVxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBTUkNvbnRyb2xsZXIuZ2V0Q29udHJvbGxlcih0aGlzLnZpZXdlckRvYyk7XG4gICAgICAgIFxuICAgICAgICAvLyBDcmVhdGUgb3ZlcmxheSBVSVxuICAgICAgICB0aGlzLm92ZXJsYXkgPSBuZXcgU1JPdmVybGF5KHRoaXMpO1xuICAgICAgICBcbiAgICAgICAgLy8gU2V0IHVwIGtleWJvYXJkIGhhbmRsZXJzXG4gICAgICAgIHRoaXMuc2V0dXBLZXlib2FyZEhhbmRsZXJzKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBTZXQgdXAgZm9jdXMgdHJhY2tpbmdcbiAgICAgICAgdGhpcy5zZXR1cEZvY3VzVHJhY2tpbmcoKTtcblxuICAgICAgICAvLyBTZXQgdXAgbXV0YXRpb24gdHJhY2tpbmdcbiAgICAgICAgdGhpcy5zZXR1cE11dGF0aW9uVHJhY2tpbmcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd0FsbChiRW5hYmxlQWxsTW9kZT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGJFbmFibGVBbGxNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmlzU2hvd2luZ0FsbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gU1JDb250cm9sbGVyLnJlbmRlclN0cnVjdHVyZSh0aGlzLnZpZXdlckRvYyk7XG4gICAgICAgIHRoaXMub3ZlcmxheS5kaXNwbGF5QWxsKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZVNwZWVjaCgpIHtcbiAgICAgICAgdGhpcy5zcGVlY2hFbmFibGVkID0gIXRoaXMuc3BlZWNoRW5hYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZSB0byB0aGUgbmV4dCBlbGVtZW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdG8gdXNlXG4gICAgICovXG4gICAgcHVibGljIG5hdmlnYXRlTmV4dChtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzU2hvd2luZ0FsbCA9IGZhbHNlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRyb2xsZXIuanVtcE5leHQobW9kZSk7XG4gICAgICAgIHRoaXMub3ZlcmxheS5kaXNwbGF5UmVzdWx0KHJlc3VsdCwgbW9kZSwgJ25leHQnKTtcbiAgICAgICAgdGhpcy5zcGVha1Jlc3VsdChyZXN1bHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlIHRvIHRoZSBwcmV2aW91cyBlbGVtZW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdG8gdXNlXG4gICAgICovXG4gICAgcHVibGljIG5hdmlnYXRlUHJldmlvdXMobW9kZTogTmF2aWdhdGlvbk1vZGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1Nob3dpbmdBbGwgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250cm9sbGVyLmp1bXBQcmV2aW91cyhtb2RlKTtcbiAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlSZXN1bHQocmVzdWx0LCBtb2RlLCAncHJldmlvdXMnKTtcbiAgICAgICAgdGhpcy5zcGVha1Jlc3VsdChyZXN1bHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB1cCBrZXlib2FyZCBldmVudCBoYW5kbGVycyBmb3Igc2NyZWVuIHJlYWRlciBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cEtleWJvYXJkSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRIYW5kbGVyID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIERvbid0IGNhcHR1cmUga2V5Ym9hcmQgZXZlbnRzIHdoZW4gZm9jdXMgaXMgaW4gZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgdGFyZ2V0LnRhZ05hbWUgPT09ICdURVhUQVJFQScgfHwgdGFyZ2V0LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBIYW5kbGUga2V5Ym9hcmQgc2hvcnRjdXRzXG4gICAgICAgICAgICBpZiAoZS5jdHJsS2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gQ3RybCBrZXkgc3RvcHMgc3BlZWNoXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wU3BlZWNoKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGUuYWx0S2V5IHx8IGUubWV0YUtleSkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZS5rZXkpO1xuICAgICAgICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2aW91cygnaXRlbScpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0cmVhbWluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgnaXRlbScpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUN1cnJlbnRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5zZXRQb2ludE9mUmVnYXJkKHRoaXMudmlld2VyRG9jLmFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdIJzpcbiAgICAgICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2aW91cygnaGVhZGluZycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZU5leHQoJ2hlYWRpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdSJzpcbiAgICAgICAgICAgICAgICBjYXNlICdyJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2aW91cygncmVnaW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgncmVnaW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2aW91cygndGFiX2ZvY3VzJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgndGFiX2ZvY3VzJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBBZGQgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgIHRoaXMudmlld2VyRG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWJvYXJkSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzcGVha1Jlc3VsdChyZXN1bHQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNwZWVjaEVuYWJsZWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgdXR0ZXJhbmNlID0gbmV3IFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZShyZXN1bHQucmVuZGVyaW5nUmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB1dHRlcmFuY2UucmF0ZSA9IDEuNTtcbiAgICAgICAgbGV0IG15VGhpcyA9IHRoaXM7XG4gICAgICAgIHV0dGVyYW5jZS5hZGRFdmVudExpc3RlbmVyKFwiZW5kXCIsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKG15VGhpcy5pc1N0cmVhbWluZykge1xuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCdpdGVtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzcGVlY2hTeW50aGVzaXMuY2FuY2VsKCk7XG4gICAgICAgIHNwZWVjaFN5bnRoZXNpcy5zcGVhayh1dHRlcmFuY2UpO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBTdG9wIHNwZWVjaCBvdXRwdXRcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0b3BTcGVlY2goKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gQ2FuY2VsIGFueSBhY3RpdmUgc3BlZWNoIHN5bnRoZXNpc1xuICAgICAgICBzcGVlY2hTeW50aGVzaXMuY2FuY2VsKCk7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFNldCB1cCBtdXRhdGlvbiB0cmFja2luZ1xuICAgICAqL1xuICAgIHByaXZhdGUgc2V0dXBNdXRhdGlvblRyYWNraW5nKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaXNTaG93aW5nQWxsLCBtdXRhdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2hvd2luZ0FsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHNpZGVPdmVybGF5ID0gbXV0YXRpb25zLmZpbHRlcihtdXRhdGlvbiA9PiBtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDEgXG4gICAgICAgICAgICAgICAgICAgICYmICEobXV0YXRpb24udGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiLmlibWEtc3Itb3ZlcmxheVwiKSlcbiAgICAgICAgICAgICAgICBpZiAob3V0c2lkZU92ZXJsYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk11dGF0aW9uc1wiLG91dHNpZGVPdmVybGF5KTtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbXlUaGlzID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgbXlUaGlzLnNob3dBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBteVRoaXMuc2hvd0FsbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnZpZXdlckRvYy5kb2N1bWVudEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMudmlld2VyRG9jLmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgIHN1YnRyZWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHVwIGZvY3VzIHRyYWNraW5nIHRvIHVwZGF0ZSB0aGUgcG9pbnQgb2YgcmVnYXJkIHdoZW4gZm9jdXMgY2hhbmdlc1xuICAgICAqL1xuICAgIHByaXZhdGUgc2V0dXBGb2N1c1RyYWNraW5nKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvY3VzSGFuZGxlciA9IChlOiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBTa2lwIGlmIHRoZSBmb2N1cyBpcyBvbiB0aGUgb3ZlcmxheSBpdHNlbGZcbiAgICAgICAgICAgIGlmIChlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmxheSAmJiB0YXJnZXQuY2xvc2VzdCgnLmlibWEtc3Itb3ZlcmxheScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChcImZvY3VzSGFuZGxlclwiKTtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHBvaW50IG9mIHJlZ2FyZCB0byB0aGUgbmV3bHkgZm9jdXNlZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250cm9sbGVyLnNldFBvaW50T2ZSZWdhcmQodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBBbm5vdW5jZSB0aGUgZm9jdXMgY2hhbmdlXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheS5kaXNwbGF5UmVzdWx0KHJlc3VsdCwgJ2ZvY3VzJywgJ2ZvY3VzJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlYWtSZXN1bHQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gQWRkIHRoZSBmb2N1cyBldmVudCBsaXN0ZW5lciB0byB0aGUgZG9jdW1lbnRcbiAgICAgICAgdGhpcy52aWV3ZXJEb2MuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMuZm9jdXNIYW5kbGVyKTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogQWN0aXZhdGUgKGNsaWNrKSB0aGUgZWxlbWVudCBhdCB0aGUgY3VycmVudCBwb2ludCBvZiByZWdhcmRcbiAgICAgKi9cbiAgICBwcml2YXRlIGFjdGl2YXRlQ3VycmVudEVsZW1lbnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gdGhpcy5jb250cm9sbGVyLmdldFBvaW50T2ZSZWdhcmQoKS5nZXRFbGVtZW50KCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIEFubm91bmNlIHRoYXQgd2UncmUgYWN0aXZhdGluZyB0aGUgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBBY3RpdmF0aW5nOiAke2N1cnJlbnRFbGVtZW50LnRleHRDb250ZW50IHx8IGN1cnJlbnRFbGVtZW50Lm5vZGVOYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmNvbnRyb2xsZXIuZ2V0UG9pbnRPZlJlZ2FyZCgpLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuY29udHJvbGxlci5nZXRQb2ludE9mUmVnYXJkKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlSZXN1bHQocmVzdWx0LCAnZm9jdXMnLCAnZm9jdXMnKTtcbiAgICAgICAgICAgIHRoaXMuc3BlYWtSZXN1bHQocmVzdWx0KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRm9jdXMgdGhlIGVsZW1lbnQgZmlyc3RcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5mb2N1cykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFNpbXVsYXRlIGEgY2xpY2sgb24gdGhlIGVsZW1lbnRcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyBUaGUgU1JDb250cm9sbGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgcHVibGljIGdldENvbnRyb2xsZXIoKTogU1JDb250cm9sbGVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSB2aWV3ZXIgYW5kIGNsZWFuIHVwIHJlc291cmNlc1xuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIHRoaXMudmlld2VyRG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWJvYXJkSGFuZGxlcik7XG4gICAgICAgIHRoaXMudmlld2VyRG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCB0aGlzLmZvY3VzSGFuZGxlcik7XG4gICAgICAgIFxuICAgICAgICAvLyBTdG9wIGFueSBhY3RpdmUgc3BlZWNoXG4gICAgICAgIHRoaXMuc3RvcFNwZWVjaCgpO1xuICAgICAgICBcbiAgICAgICAgLy8gRGVzdHJveSBvdmVybGF5XG4gICAgICAgIHRoaXMub3ZlcmxheS5kZXN0cm95KCk7XG4gICAgfVxufSIsImltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4uL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBTUlJlbmRlcmVyUnVsZSB9IGZyb20gXCIuLi9TUlJlbmRlcmVyUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IE5hdmlnYXRpb25Nb2RlIH0gZnJvbSBcIi4uL1NSVHlwZXNcIjtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBuYW1lLCBzdXJyb3VuZGVkIGJ5IHRoZSBxdW90ZUNoYXJCZWZvcmUgYW5kIHF1b3RlQ2hhckFmdGVyIGFuZCBmb2xsb3dlZCBieSB0aGUgcGFkZGluZyBpZiB0aGUgbmFtZSBleGlzdHNcbiAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBmb3Igd2hpY2ggdG8gZmV0Y2ggdGhlIG5hbWVcbiAqIEBwYXJhbSBwYWRkaW5nIFN0cmluZyB0byBhZGQgYWZ0ZXIsIGlmIHRoZSBuYW1lIGV4aXN0c1xuICogQHBhcmFtIHF1b3RlQ2hhckJlZm9yZSBUaGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgbGVhZGluZyBxdW90ZSwgaWYgdGhlIG5hbWUgZXhpc3RzXG4gKiBAcGFyYW0gcXVvdGVDaGFyQmVmb3JlIFRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSB0cmFpbGluZyBxdW90ZSwgaWYgdGhlIG5hbWUgZXhpc3RzXG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcjogU1JDdXJzb3IsIHBhZGRpbmc/OiBzdHJpbmcsIHF1b3RlQ2hhckJlZm9yZT86IHN0cmluZywgcXVvdGVDaGFyQWZ0ZXI/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3Vyc29yLmdldE5hbWUoKSBcbiAgICAgICAgPyBgJHtxdW90ZU5hbWUoY3Vyc29yKX0ke3BhZGRpbmcgfHwgXCIsIFwifWBcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIFByb3ZpZGUgdGhlIG5hbWUsIHN1cnJvdW5kZWQgYnkgcXVvdGVzIGFuZCBwcmVjZWRlZCBieSB0aGUgcGFkZGluZyBpZiB0aGUgbmFtZSBleGlzdHNcbiAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBmb3Igd2hpY2ggdG8gZmV0Y2ggdGhlIG5hbWVcbiAqIEBwYXJhbSBwYWRkaW5nIFN0cmluZyB0byBhZGQgYmVmb3JlLCBpZiB0aGUgbmFtZSBleGlzdHMgKGRlZmF1bHRzIHRvIFwiLCBcIilcbiAqIEByZXR1cm5zIFRoZSBxdW90ZWQgbmFtZSB3aXRoIGxlYWRpbmcgcGFkZGluZywgb3IgZW1wdHkgc3RyaW5nIGlmIG5vIG5hbWUgZXhpc3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yOiBTUkN1cnNvciwgcGFkZGluZz86IHN0cmluZykge1xuICAgIHJldHVybiBjdXJzb3IuZ2V0TmFtZSgpXG4gICAgICAgID8gYCR7cGFkZGluZyB8fCBcIiwgXCJ9JHtxdW90ZU5hbWUoY3Vyc29yKX1gXG4gICAgICAgIDogXCJcIjtcbn1cblxuLyoqXG4gKiBQcm92aWRlIHRoZSBuYW1lIHN1cnJvdW5kZWQgYnkgcXVvdGUgY2hhcmFjdGVyc1xuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGZvciB3aGljaCB0byBmZXRjaCB0aGUgbmFtZVxuICogQHBhcmFtIHF1b3RlQ2hhckJlZm9yZSBUaGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgbGVhZGluZyBxdW90ZSAoZGVmYXVsdHMgdG8gXCIpXG4gKiBAcGFyYW0gcXVvdGVDaGFyQWZ0ZXIgVGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHRyYWlsaW5nIHF1b3RlIChkZWZhdWx0cyB0byBcIilcbiAqIEByZXR1cm5zIFRoZSBxdW90ZWQgbmFtZSwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vIG5hbWUgZXhpc3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZU5hbWUoY3Vyc29yOiBTUkN1cnNvciwgcXVvdGVDaGFyQmVmb3JlPzogc3RyaW5nLCBxdW90ZUNoYXJBZnRlcj86IHN0cmluZykge1xuICAgIHJldHVybiBjdXJzb3IuZ2V0TmFtZSgpXG4gICAgICAgID8gYCR7cXVvdGVDaGFyQmVmb3JlIHx8ICdcIid9JHtjdXJzb3IuZ2V0TmFtZSgpfSR7cXVvdGVDaGFyQWZ0ZXIgfHwgJ1wiJ31gXG4gICAgICAgIDogXCJcIjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHJvbGUgZGVzY3JpcHRpb24gZm9yIGFuIGVsZW1lbnQsIHVzaW5nIGFyaWEtcm9sZWRlc2NyaXB0aW9uIGlmIHByZXNlbnRcbiAqIEZhbGxzIGJhY2sgdG8gdGhlIHByb3ZpZGVkIGRlZmF1bHQgcm9sZSBuYW1lIGlmIGFyaWEtcm9sZWRlc2NyaXB0aW9uIGlzIG5vdCBzcGVjaWZpZWQgb3IgZW1wdHlcbiAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBwb3NpdGlvbmVkIGF0IHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gZGVmYXVsdFJvbGUgVGhlIGRlZmF1bHQgcm9sZSBuYW1lIHRvIHVzZSBpZiBhcmlhLXJvbGVkZXNjcmlwdGlvbiBpcyBub3QgcHJlc2VudFxuICogQHJldHVybnMgVGhlIHJvbGUgZGVzY3JpcHRpb24gKGVpdGhlciBjdXN0b20gb3IgZGVmYXVsdClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3I6IFNSQ3Vyc29yLCBkZWZhdWx0Um9sZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICBpZiAoIWVsZW0pIHJldHVybiBkZWZhdWx0Um9sZTtcbiAgICBcbiAgICBjb25zdCByb2xlRGVzY3JpcHRpb24gPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCIpO1xuICAgIGlmIChyb2xlRGVzY3JpcHRpb24gJiYgcm9sZURlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByb2xlRGVzY3JpcHRpb24udHJpbSgpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZGVmYXVsdFJvbGU7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIHNjcmVlbiByZWFkZXIgYW5ub3VuY2VtZW50IGZvciBhIGxpbmsgZWxlbWVudFxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHNhbWUtcGFnZSBsaW5rcyAoYW5jaG9ycykgYW5kIHJlZ3VsYXIgbGlua3NcbiAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBwb3NpdGlvbmVkIGF0IHRoZSBsaW5rIGVsZW1lbnRcbiAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgKGFmZmVjdHMgYW5ub3VuY2VtZW50IG9yZGVyKVxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBsaW5rIGFubm91bmNlbWVudCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmtBbm5vdW5jZW1lbnQoY3Vyc29yOiBTUkN1cnNvciwgbW9kZT86IE5hdmlnYXRpb25Nb2RlKTogc3RyaW5nIHtcbiAgICBsZXQgaHJlZjogc3RyaW5nID0gKChjdXJzb3IuZ2V0Tm9kZSgpIGFzIGFueSkuaHJlZikgfHwgXCJcIjtcbiAgICBsZXQgYW5ub3VuY2VTdHIgPSBcIlwiO1xuICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoZG9jdW1lbnQubG9jYXRpb24uaHJlZikgJiYgaHJlZi5jaGFyQXQoZG9jdW1lbnQubG9jYXRpb24uaHJlZi5sZW5ndGgpID09PSBcIiNcIikge1xuICAgICAgICBhbm5vdW5jZVN0ciA9IGBzYW1lIHBhZ2UgbGlua2A7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYW5ub3VuY2VTdHIgPSBgbGlua2A7XG4gICAgfVxuICAgIGxldCBuYW1lSW5mbyA9IGN1cnNvci5nZXROYW1lSW5mbygpO1xuICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHthbm5vdW5jZVN0cn1dYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7YW5ub3VuY2VTdHJ9JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYFske2Fubm91bmNlU3RyfV1gO1xufVxuXG4vKipcbiAqIEdldCB0aGUgZGVzY3JpcHRpb24gdGV4dCBmcm9tIGFyaWEtZGVzY3JpYmVkYnkgcmVmZXJlbmNlc1xuICogUmVzb2x2ZXMgYWxsIElEcyBpbiBhcmlhLWRlc2NyaWJlZGJ5IGFuZCBjb25jYXRlbmF0ZXMgdGhlaXIgdGV4dCBjb250ZW50XG4gKiBAcGFyYW0gZWxlbSBUaGUgZWxlbWVudCB3aXRoIGFyaWEtZGVzY3JpYmVkYnkgYXR0cmlidXRlXG4gKiBAcGFyYW0gbW9kZSBUaGUgbmF2aWdhdGlvbiBtb2RlIChyZXR1cm5zIGVtcHR5IHN0cmluZyBpbiBcIml0ZW1cIiBtb2RlKVxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkZXNjcmlwdGlvbiB0ZXh0IHdpdGggbGVhZGluZyBjb21tYSBhbmQgcXVvdGVzLCBvciBlbXB0eSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGVsZW06IEhUTUxFbGVtZW50LCBtb2RlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkZXNjcmliZWRCeSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiKTtcbiAgICBpZiAoIWRlc2NyaWJlZEJ5KSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBkZXNjcmlwdGlvbkVsZW1zID0gZGVzY3JpYmVkQnlcbiAgICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgICAgLm1hcChpZCA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpXG4gICAgICAgIC5maWx0ZXIoZGVzY0VsZW0gPT4gISFkZXNjRWxlbSkgYXMgSFRNTEVsZW1lbnRbXTtcblxuICAgIGNvbnN0IGRlc2NyaXB0aW9uVGV4dCA9IGRlc2NyaXB0aW9uRWxlbXNcbiAgICAgICAgLm1hcChkZXNjRWxlbSA9PiBkZXNjRWxlbS50ZXh0Q29udGVudD8udHJpbSgpKVxuICAgICAgICAuZmlsdGVyKHRleHQgPT4gISF0ZXh0KVxuICAgICAgICAuam9pbihcIiBcIik7XG5cbiAgICBpZiAoIWRlc2NyaXB0aW9uVGV4dCB8fCBkZXNjcmlwdGlvblRleHQubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIpIHJldHVybiBgLCBcXHUwMDAxJHtkZXNjcmlwdGlvblRleHR9XFx1MDAwMmA7XG4gICAgcmV0dXJuIGAsIFwiJHtkZXNjcmlwdGlvblRleHR9XCJgO1xufVxuXG4vKipcbiAqIEdldCBzdGF0ZSBhbm5vdW5jZW1lbnRzIGZvciBkaXNhYmxlZCwgcmVhZG9ubHksIHJlcXVpcmVkLCBhbmQgaW52YWxpZCBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0gZWxlbSBUaGUgZWxlbWVudCB0byBjaGVjayBmb3Igc3RhdGUgYXR0cmlidXRlc1xuICogQHJldHVybnMgQSBzdHJpbmcgd2l0aCBzdGF0ZSBhbm5vdW5jZW1lbnRzIChlLmcuLCBcIiwgZGlzYWJsZWRcIiwgXCIsIHJlYWQgb25seVwiLCBcIiwgcmVxdWlyZWRcIiwgXCIsIGludmFsaWRcIilcbiAqL1xuZnVuY3Rpb24gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGVsZW06IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgICBsZXQgc3RhdGVzID0gXCJcIjtcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgZGlzYWJsZWQgc3RhdGUgKGJvdGggYXR0cmlidXRlIGFuZCBhcmlhLWRpc2FibGVkKVxuICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1kaXNhYmxlZFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgc3RhdGVzICs9IFwiLCBkaXNhYmxlZFwiO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcmVhZG9ubHkgc3RhdGUgKGJvdGggYXR0cmlidXRlIGFuZCBhcmlhLXJlYWRvbmx5KVxuICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInJlYWRvbmx5XCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1yZWFkb25seVwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgc3RhdGVzICs9IFwiLCByZWFkIG9ubHlcIjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHN0YXRlIChib3RoIGF0dHJpYnV0ZSBhbmQgYXJpYS1yZXF1aXJlZClcbiAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcmVxdWlyZWRcIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgIHN0YXRlcyArPSBcIiwgcmVxdWlyZWRcIjtcbiAgICAgICAgLy8gQSByZXF1aXJlZCA8c2VsZWN0PiB3aG9zZSBzZWxlY3RlZCB2YWx1ZSBpcyBcIlwiIGlzIGltcGxpY2l0bHkgaW52YWxpZCDigJRcbiAgICAgICAgLy8gSkFXUyBhbmQgTlZEQSBhbm5vdW5jZSBcImludmFsaWQgZW50cnlcIiBpbiB0aGlzIGNhc2UuXG4gICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0VMRUNUXCIgJiYgKGVsZW0gYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbGlkaXR5LnZhbHVlTWlzc2luZykge1xuICAgICAgICAgICAgc3RhdGVzICs9IFwiLCBpbnZhbGlkIGVudHJ5XCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBzdGF0ZSAoYXJpYS1pbnZhbGlkKVxuICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaW52YWxpZFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgc3RhdGVzICs9IFwiLCBpbnZhbGlkXCI7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzdGF0ZXM7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBsaXN0aXRlbSBjb250YWlucyBpbnRlcmFjdGl2ZS93aWRnZXQgZWxlbWVudHNcbiAqIFNjcmVlbiByZWFkZXJzIHR5cGljYWxseSBkb24ndCByZWFkIHRoZSBhY2Nlc3NpYmxlIG5hbWUgb2YgYSBsaXN0aXRlbSB3aGVuIGl0IGNvbnRhaW5zIGludGVyYWN0aXZlIGVsZW1lbnRzXG4gKiBVc2VzIERPTVdhbGtlciB0byBwcm9wZXJseSB0cmF2ZXJzZSBzaGFkb3cgRE9NIGFuZCBvdGhlciBjb21wbGV4IHN0cnVjdHVyZXNcbiAqL1xuZnVuY3Rpb24gbGlzdGl0ZW1Db250YWluc0ludGVyYWN0aXZlRWxlbWVudChjdXJzb3I6IFNSQ3Vyc29yKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgaWYgKCFlbGVtKSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgLy8gVXNlIERPTVdhbGtlciB0byB0cmF2ZXJzZSB0aGUgZW50aXJlIHN1YnRyZWUgaW5jbHVkaW5nIHNoYWRvdyBET01cbiAgICBjb25zdCB3YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGVsZW0sIGZhbHNlLCBlbGVtLCBmYWxzZSk7XG4gICAgXG4gICAgLy8gV2FsayB0aHJvdWdoIGFsbCBkZXNjZW5kYW50c1xuICAgIHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgICAvLyBPbmx5IGNoZWNrIGVsZW1lbnQgbm9kZXMgYXQgc3RhcnQgdGFnc1xuICAgICAgICBpZiAod2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgIXdhbGtlci5iRW5kVGFnKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHdhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChyb2xlICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucm9sZVR5cGUgPT09ICd3aWRnZXQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFuIGlmcmFtZSdzIGNvbnRlbnQgY2FuIGJlIGFjY2Vzc2VkIChub3QgY3Jvc3Mtb3JpZ2luKVxuICogQXR0ZW1wdHMgdG8gYWNjZXNzIHRoZSBpZnJhbWUncyBkb2N1bWVudCB0byBkZXRlcm1pbmUgaWYgaXQncyBhY2Nlc3NpYmxlXG4gKiBAcGFyYW0gaWZyYW1lIFRoZSBpZnJhbWUgZWxlbWVudCB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaWZyYW1lIGNvbnRlbnQgaXMgYWNjZXNzaWJsZSwgZmFsc2UgaWYgY3Jvc3Mtb3JpZ2luIG9yIGJsb2NrZWRcbiAqL1xuZnVuY3Rpb24gY2FuQWNjZXNzRnJhbWUoaWZyYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB0aHJvd3MgYSBET01FeGNlcHRpb24gZm9yIGNyb3NzLW9yaWdpbiBmcmFtZXNcbiAgICAgICAgY29uc3QgZG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgcmV0dXJuIGRvYyAhPT0gbnVsbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gaWYgKGUgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiYgZS5uYW1lID09PSAnU2VjdXJpdHlFcnJvcicpIHtcbiAgICAgICAgLy8gICAgIHJldHVybiBmYWxzZTsgLy8gQ3Jvc3Mtb3JpZ2luLCBhY2Nlc3MgYmxvY2tlZFxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIHRocm93IGU7IC8vIFJlLXRocm93IHVuZXhwZWN0ZWQgZXJyb3JzXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUlVMRVM6IFNSUmVuZGVyZXJSdWxlW10gPSBbXG4gICAgLy8gU2luZ2xlIHJvbGUgcnVsZXMgLSBhbHBoYWJldGljYWxseSBzb3J0ZWRcbiAgICBcbiAgICAvLyBCdXR0b24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJidXR0b25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJidXR0b25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbdG9nZ2xlICR7cm9sZURlc2N9LCBwcmVzc2VkJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX0ke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhlbGVtLCBtb2RlKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImJ1dHRvblwiKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXByZXNzZWRcIikgPT09IFwiZmFsc2VcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFt0b2dnbGUgJHtyb2xlRGVzY30sIG5vdCBwcmVzc2VkJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX0ke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhlbGVtLCBtb2RlKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBsZXQgZXhwYW5kU3RyID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgIGlmIChbXCJtZW51XCIsIFwidHJ1ZVwiXS5pbmNsdWRlcyhlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZFN0ciArPSBcIiwgbWVudVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZFN0ciArPSBgLCAke2VsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKSA9PT0gXCJ0cnVlXCIgPyBcImV4cGFuZGVkXCIgOiBcImNvbGxhcHNlZFwifWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4cGFuZFN0ciArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9JHtleHBhbmRTdHJ9JHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoZWxlbSwgbW9kZSl9XWA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHsgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gXCJcIjsgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDaGVja2JveCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiY2hlY2tib3hcIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImNoZWNrYm94XCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhdGVTdHIgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikgPT09IFwibWl4ZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTdHIgPSBcImhhbGYgY2hlY2tlZFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJDaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hlY2tlZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1jaGVja2VkXCIpID09PSBcInRydWVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoZWNrZWQgPSBlbGVtLmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0ciA9IGJDaGVja2VkID8gXCJjaGVja2VkXCIgOiBcIm5vdCBjaGVja2VkXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RhdGVTdHIgKz0gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3JvbGVEZXNjfSwgJHtzdGF0ZVN0cn0ke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV1gXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDZWxsLCBDb2x1bW5oZWFkZXIsIGFuZCBSb3doZWFkZXIgcm9sZXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcInJvd2hlYWRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYmxlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgY2VsbCBlbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbEVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGlmICghY2VsbEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjZWxsIGhhcyBhbnkgdmlzaWJsZSBjb250ZW50IGJ5IGNoZWNraW5nOlxuICAgICAgICAgICAgICAgIC8vIDEuIFRleHQgY29udGVudCAodHJpbW1lZClcbiAgICAgICAgICAgICAgICAvLyAyLiBDaGlsZCBlbGVtZW50cyB3aXRoIHJvbGVzIChidXR0b25zLCBsaW5rcywgZXRjLilcbiAgICAgICAgICAgICAgICAvLyAzLiBJbWFnZXMgd2l0aCBhbHQgdGV4dFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gY2VsbEVsZW0udGV4dENvbnRlbnQ/LnRyaW0oKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjaGlsZCBlbGVtZW50cyB3aXRoIGludGVyYWN0aXZlIHJvbGVzIG9yIGNvbnRlbnRcbiAgICAgICAgICAgICAgICBjb25zdCB3YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKGNlbGxFbGVtLCBmYWxzZSwgY2VsbEVsZW0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBsZXQgaGFzQ29udGVudCA9IHRleHRDb250ZW50Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBlbGVtZW50cyB0aGF0IHdvdWxkIGhhdmUgY29udGVudCAoYnV0dG9ucywgbGlua3MsIGltYWdlcywgZXRjLilcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgIXdhbGtlci5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IHdhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGludGVyYWN0aXZlIGVsZW1lbnRzIG9yIGVsZW1lbnRzIHdpdGggYWNjZXNzaWJsZSBuYW1lc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb2xlICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBpbWFnZXMgd2l0aCBhbHQgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSU1HXCIgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY2VsbCBpcyBlbXB0eSwgcmV0dXJuIFwiW2JsYW5rXVwiXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIltibGFua11cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gbnVsbCB0byBsZXQgZGVmYXVsdCByZW5kZXJpbmcgY29udGludWVcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29tYm9ib3ggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImNvbWJvXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzRW5kVGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJjb21ibyBib3hcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gXCIsIGNvbGxhcHNlZFwiO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdEVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVFbGVtID0gc2VsZWN0RWxlbS5zZWxlY3RlZEluZGV4ID49IDAgPyBzZWxlY3RFbGVtLm9wdGlvbnNbc2VsZWN0RWxlbS5zZWxlY3RlZEluZGV4XSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZVN0ciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gbmV3IFNSQ3Vyc29yKHZhbHVlRWxlbSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHIgPSBxdW90ZU5hbWVQYWRCZWZvcmUodGVtcCwgXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfSR7c3RhdGV9JHt2YWx1ZVN0cn1dYDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJTlBVVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gYCwgJHtlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikgPT09IFwidHJ1ZVwiID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlICs9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9JHtzdGF0ZX0sIGhhcyBhdXRvIGNvbXBsZXRlLCBlZGl0YWJsZSwgb3BlbnMgbGlzdF1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gYCwgJHtlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikgPT09IFwidHJ1ZVwiID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBgLCBoYXMgYXV0byBjb21wbGV0ZWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgKz0gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGVsZW0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgY3VycmVudCB2YWx1ZSB0byBhbm5vdW5jZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gMS4gSWYgZXhwYW5kZWQgYW5kIGFyaWEtY29udHJvbHMgcG9pbnRzIHRvIGEgbGlzdGJveCwgdXNlIHRoZSBhcmlhLXNlbGVjdGVkIG9wdGlvbiB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC8vIDIuIE90aGVyd2lzZSB1c2UgdGhlIGNvbWJvYm94IGVsZW1lbnQncyBvd24gdGV4dCBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZVN0ciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xzSWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvcHVwID0gY29udHJvbHNJZCA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRyb2xzSWQpIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcHVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHBvcHVwLnF1ZXJ5U2VsZWN0b3IoXCJbcm9sZT0nb3B0aW9uJ11bYXJpYS1zZWxlY3RlZD0ndHJ1ZSddXCIpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyID0gYCwgXCIkeyhzZWxlY3RlZE9wdGlvbi50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCl9XCJgO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWVTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gKGVsZW0udGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHIgPSBgLCBcIiR7dGV4dENvbnRlbnR9XCJgO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9JHtzdGF0ZX0ke3ZhbHVlU3RyfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdGJveCByb2xlIC0gY292ZXJzIDxzZWxlY3Qgc2l6ZT4gLyA8c2VsZWN0IG11bHRpcGxlPlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJsaXN0Ym94XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiY29tYm9cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImxpc3QgYm94XCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGxldCBzdGF0ZSA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdEVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbnMgPSBBcnJheS5mcm9tKHNlbGVjdEVsZW0ub3B0aW9ucykuZmlsdGVyKG8gPT4gby5zZWxlY3RlZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlU3RyID0gc2VsZWN0ZWRPcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKG8gPT4gcXVvdGVOYW1lUGFkQmVmb3JlKG5ldyBTUkN1cnNvcihvLCBmYWxzZSksIFwiLCBcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgKz0gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY30ke3N0YXRlfSR7dmFsdWVTdHJ9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEFSSUEgbGlzdGJveCAobm9uLXNlbGVjdClcbiAgICAgICAgICAgICAgICBzdGF0ZSArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSAoZWxlbS50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVTdHIgPSB0ZXh0Q29udGVudCA/IGAsIFwiJHt0ZXh0Q29udGVudH1cImAgOiBcIlwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfSR7c3RhdGV9JHt2YWx1ZVN0cn1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRGVmYXVsdCByb2xlIChmYWxsYmFjaylcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZGVmYXVsdFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID9cbiAgICAgICAgICAgICAgICBgISE8JHtjdXJzb3IuZ2V0Um9sZSgpfT4keyhjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSArIFwiXCIpfSEhYCA6XG4gICAgICAgICAgICAgICAgYCEhPC8ke2N1cnNvci5nZXRSb2xlKCl9PiEhYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBEZWxldGlvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImRlbGV0aW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IChjdXJzb3IuaXNTdGFydFRhZygpICYmIGBbZGVsZXRlZF1gIHx8IFwiXCIpXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIERpYWxvZyByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImRpYWxvZ1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5pc0VuZFRhZygpID8gYFtFbmQgb2YgZGlhbG9nXWAgOiBgW1N0YXJ0IG9mIGRpYWxvZyR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29udGVudGVkaXRhYmxlIChlZGl0YWJsZSByZWdpb24pIC0gZWxlbWVudHMgd2l0aCBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgKG9yIFwiXCIpXG4gICAgLy8gTXVzdCBjb21lIGJlZm9yZSB0aGUgZ2VuZXJpYy9kb2N1bWVudCBydWxlIHNvIGl0IHRha2VzIHByZWNlZGVuY2UuXG4gICAgLy8gU2NyZWVuIHJlYWRlcnMgKEpBV1MvTlZEQSkgYW5ub3VuY2UgdGhlc2UgYXMgYW4gZWRpdGFibGUgc2VjdGlvbiB3aGVuIGVudGVyaW5nXG4gICAgLy8gYW5kIFwib3V0IG9mIHNlY3Rpb25cIiB3aGVuIGxlYXZpbmcuXG4gICAgLy8gV2UgdXNlIGEgYnJvYWQgZWxlbWVudCBsaXN0IChjb3ZlcmluZyB0aGUgbW9zdCBjb21tb24gaG9zdCBlbGVtZW50cykgcGx1c1xuICAgIC8vIFwiZ2VuZXJpY1wiIGFuZCBcInBhcmFncmFwaFwiIHJvbGVzIHNvIGJvdGggYmFyZSA8ZGl2PiBhbmQgbGFiZWxsZWQgdmFyaWFudHMgYXJlIGNhdWdodC5cbiAgICAvLyBUaGUgdGVzdCBmdW5jdGlvbiBhbHdheXMgY2hlY2tzIHRoZSBhdHRyaWJ1dGUgYW5kIGJhaWxzIG91dCB3aGVuOlxuICAgIC8vICAgLSB0aGUgYXR0cmlidXRlIGlzIGFic2VudCBvciBcImZhbHNlXCJcbiAgICAvLyAgIC0gYW4gZXhwbGljaXQgQVJJQSByb2xlIG92ZXJyaWRlcyB0aGUgc2VtYW50aWNzIChlLmcuIHJvbGU9XCJ0ZXh0Ym94XCIpXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImdlbmVyaWNcIiwgXCJwYXJhZ3JhcGhcIl0sXG4gICAgICAgIGVsZW1zOiBbXCJESVZcIiwgXCJTUEFOXCIsIFwiUFwiLCBcIlNFQ1RJT05cIiwgXCJBUlRJQ0xFXCIsIFwiSEVBREVSXCIsIFwiRk9PVEVSXCIsIFwiTUFJTlwiLCBcIkFTSURFXCIsIFwiTkFWXCIsIFwiTElcIiwgXCJURFwiLCBcIlRIXCIsIFwiUFJFXCIsIFwiQkxPQ0tRVU9URVwiLCBcIkZJR1VSRVwiLCBcIkZJR0NBUFRJT05cIiwgXCJERVRBSUxTXCIsIFwiU1VNTUFSWVwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBjZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjZSAhPT0gXCJ0cnVlXCIgJiYgY2UgIT09IFwiXCIpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIC8vIERlZmVyIHRvIHRoZSBleHBsaWNpdC1yb2xlIHJ1bGUgd2hlbiBhbiBhdXRob3IgcHJvdmlkZXMgYSBjb25jcmV0ZSBBUklBIHJvbGVcbiAgICAgICAgICAgICAgICAvLyAoZS5nLiByb2xlPVwidGV4dGJveFwiKSDigJQgdGhvc2Ugcm9sZXMgY2FycnkgcmljaGVyIHNlbWFudGljcyBhbmQgdGhlaXIgb3duIHJ1bGVzLlxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIC8vIDxwPiByZXRhaW5zIGl0cyBcInBhcmFncmFwaFwiIHNlbWFudGljcyBldmVuIHdoZW4gZWRpdGFibGUuXG4gICAgICAgICAgICAgICAgY29uc3QgaXNQYXJhZ3JhcGggPSBjdXJzb3IuZ2V0Um9sZSgpID09PSBcInBhcmFncmFwaFwiIHx8IGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJQXCI7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlID09PSBcIml0ZW1cIiA/IChpc1BhcmFncmFwaCA/IFwiW291dCBvZiBwYXJhZ3JhcGhdXCIgOiBcIltvdXQgb2Ygc2VjdGlvbl1cIikgOiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBhcmlhLXJlYWRvbmx5IGlzIG5vdCBhIHN1cHBvcnRlZCBzdGF0ZSBvbiBjb250ZW50ZWRpdGFibGUgZWxlbWVudHMg4oCUXG4gICAgICAgICAgICAgICAgLy8gc2NyZWVuIHJlYWRlcnMgKEpBV1MvTlZEQSkgaWdub3JlIGl0IGVudGlyZWx5LCBzbyB3ZSBleGNsdWRlIGl0IGhlcmUuXG4gICAgICAgICAgICAgICAgLy8gT25seSBkaXNhYmxlZCBpcyBtZWFuaW5nZnVsIChpdCBvdmVycmlkZXMgdGhlIGVkaXRhYmxlIHNlbWFudGljcykuXG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlQW5ub3VuY2VtZW50cyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZUFubm91bmNlbWVudHMgPSBcIiwgZGlzYWJsZWRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyV29yZCA9IGlzUGFyYWdyYXBoID8gXCJwYXJhZ3JhcGhcIiA6IFwic2VjdGlvblwiO1xuICAgICAgICAgICAgICAgIC8vIEluIHRhYl9mb2N1cyBtb2RlLCBvbmx5IGFwcGVuZCB0ZXh0Q29udGVudCB3aGVuIHRoZSBhY2Nlc3NpYmxlIG5hbWVcbiAgICAgICAgICAgICAgICAvLyBpcyBleHRyaW5zaWMgKGFyaWEtbGFiZWwgLyBhcmlhLWxhYmVsbGVkYnksIGkuZS4gbmFtZUZyb20g4omgIFwiY29udGVudFwiL1widGV4dFwiKS5cbiAgICAgICAgICAgICAgICAvLyBXaGVuIG5hbWVGcm9tIElTIFwiY29udGVudFwiLCBqdW1wQ3VycmVudEVuZCBhbHJlYWR5IHdhbGtzIGNoaWxkcmVuIHNvXG4gICAgICAgICAgICAgICAgLy8gYXBwZW5kaW5nIGFnYWluIHdvdWxkIGR1cGxpY2F0ZSB0aGUgdGV4dC5cbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lSW5mbyA9IGN1cnNvci5nZXROYW1lSW5mbygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVGcm9tQ29udGVudCA9ICFuYW1lSW5mbyB8fCBbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhbmFtZUZyb21Db250ZW50KSA/IGVsZW0udGV4dENvbnRlbnQ/LnRyaW0oKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFN1ZmZpeCA9IHRleHRDb250ZW50ID8gYCAke3RleHRDb250ZW50fWAgOiBcIlwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke2NvbnRhaW5lcldvcmR9LCBlZGl0YWJsZSR7c3RhdGVBbm5vdW5jZW1lbnRzfV0ke2NvbnRlbnRTdWZmaXh9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRG9jdW1lbnQgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJkb2N1bWVudFwiLCBcImdlbmVyaWNcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoKSA9PiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEdyYXBoaWNzIGRvY3VtZW50IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JhcGhpY3MtZG9jdW1lbnRcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJpbWFnZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgIWN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICYmIGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFubm91bmNlIHVubGFiZWxlZCBncmFwaGljcyB0aGF0IGFyZSBoaWRkZW4gaW5zaWRlIGxpbmtzIG9yIGhlYWRpbmdzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEhlYWRpbmdPckxpbmsgPSBjdXJzb3IuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiaGVhZGluZ1wiLCBcImxpbmtcIl0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SGVhZGluZ09yTGluayAmJiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjdXJzb3IuZ2V0RWxlbWVudCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW1VubGFiZWxlZCBncmFwaGljXVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgKGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lID09PSBcIlwiKSkgPyBcIlwiIDogbnVsbCxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSAmJiBgW2dyYXBoaWMke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gKSB8fCBudWxsLFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IChjdXJzb3IuaXNFbmRUYWcoKSkgPyBcIlwiIDogbnVsbFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBIZWFkaW5nIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yOiBTUkN1cnNvciwgbW9kZTogTmF2aWdhdGlvbk1vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiBjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgY3Vyc29yLmlzRW5kVGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGxldCBsZXZlbDogc3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmFyaWFMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFeHBsaWNpdCBhcmlhLWxldmVsIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IG5vZGUuYXJpYUxldmVsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ2hlYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJvbGU9XCJoZWFkaW5nXCIgd2l0aG91dCBhcmlhLWxldmVsIGRlZmF1bHRzIHRvIDJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAnMic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTmF0aXZlIGhlYWRpbmcgZWxlbWVudCAoaDEtaDYpLCBleHRyYWN0IG51bWJlciBmcm9tIHRhZyBuYW1lXG4gICAgICAgICAgICAgICAgICAgIGxldmVsID0gbm9kZS5ub2RlTmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IG5hbWVJbmZvID0gY3Vyc29yLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICAgICAgaWYgKCghbmFtZUluZm8gfHwgW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSAmJiAhKG5vZGUudGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW2hlYWRpbmcgbGV2ZWwgJHtsZXZlbH0ke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW2hlYWRpbmcgbGV2ZWwgJHtsZXZlbH1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIC0tIGluIGhlYWRpbmcgbW9kZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJoZWFkaW5nXCIsIFwiaDFcIiwgXCJoMlwiLCBcImgzXCIsIFwiaDRcIiwgXCJoNVwiLCBcImg2XCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxldmVsOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5hcmlhTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0IGFyaWEtbGV2ZWwgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IG5vZGUuYXJpYUxldmVsO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdoZWFkaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm9sZT1cImhlYWRpbmdcIiB3aXRob3V0IGFyaWEtbGV2ZWwgZGVmYXVsdHMgdG8gMlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAnMic7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXRpdmUgaGVhZGluZyBlbGVtZW50IChoMS1oNiksIGV4dHJhY3QgbnVtYmVyIGZyb20gdGFnIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gbm9kZS5ub2RlTmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZUluZm8gPSBjdXJzb3IuZ2V0TmFtZUluZm8oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghbmFtZUluZm8gfHwgW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSAmJiAhKG5vZGUudGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWhlYWRpbmcgbGV2ZWwgJHtsZXZlbH1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEltYWdlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiaW1nXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiaW1hZ2VcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICYmIGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhbm5vdW5jZSB1bmxhYmVsZWQgZ3JhcGhpY3MgdGhhdCBhcmUgaGlkZGVuIGluc2lkZSBsaW5rcyBvciBoZWFkaW5nc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZXNlIHdlcmUgb25seSBpbmNsdWRlZCBiZWNhdXNlIG9mIHRoZSBTS0lQX0lURU1fQkVIQVZJT1IgY2hhbmdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SGVhZGluZ09yTGluayA9IGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJoZWFkaW5nXCIsIFwibGlua1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SGVhZGluZ09yTGluayAmJiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjdXJzb3IuZ2V0RWxlbWVudCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW1VubGFiZWxlZCBncmFwaGljXVwiXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbZ3JhcGhpYyR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSW5zZXJ0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiaW5zZXJ0aW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IChjdXJzb3IuaXNTdGFydFRhZygpICYmIGBbaW5zZXJ0ZWRdYCB8fCBcIlwiKVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBMaW5rIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibGlua1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcImxpbmtcIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcjogU1JDdXJzb3IsIG1vZGU6IE5hdmlnYXRpb25Nb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldExpbmtBbm5vdW5jZW1lbnQoY3Vyc29yLCBtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIExpc3RpdGVtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibGlzdGl0ZW1cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc09yZGVyZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudExpc3RFbGVtOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBsZXQgd2Fsa1BhcmVudHMgPSBET01XYWxrZXIucGFyZW50Tm9kZShjdXJzb3IuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAodHlwZW9mIGlzT3JkZXJlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiB3YWxrUGFyZW50cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2Fsa1BhcmVudHMubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB3YWxrUGFyZW50cyBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpID09PSBcImxpc3RcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09yZGVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TGlzdEVsZW0gPSBlbGVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlVMXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09yZGVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRMaXN0RWxlbSA9IGVsZW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJPTFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPcmRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRMaXN0RWxlbSA9IGVsZW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2Fsa1BhcmVudHMgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrUGFyZW50cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGxpc3RpdGVtIGNvbnRhaW5zIGludGVyYWN0aXZlIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgLy8gU2NyZWVuIHJlYWRlcnMgZG9uJ3QgcmVhZCB0aGUgYWNjZXNzaWJsZSBuYW1lIHdoZW4gaW50ZXJhY3RpdmUgZWxlbWVudHMgYXJlIHByZXNlbnRcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNJbnRlcmFjdGl2ZUNvbnRlbnQgPSBsaXN0aXRlbUNvbnRhaW5zSW50ZXJhY3RpdmVFbGVtZW50KGN1cnNvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVRvVXNlID0gaGFzSW50ZXJhY3RpdmVDb250ZW50ID8gXCJcIiA6IChjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSB8fCBcIlwiKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgcmV0U3RyID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoIWlzT3JkZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiTElcIiAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKS5saXN0U3R5bGVUeXBlID09PSBcIm5vbmVcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gXCJMSVwiKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRTdHIgPSBjdXJzb3IuaXNTdGFydFRhZygpID8gYCR7bmFtZVRvVXNlfWAgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0U3RyID0gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGBbYnVsbGV0XSAke25hbWVUb1VzZX1gIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBvcmRlcmVkIGxpc3RzLCBjb3VudCBzaWJsaW5nIGxpc3RpdGVtcyBhbmQgYWNjb3VudCBmb3Igc3RhcnQgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IDE7IC8vIFN0YXJ0IGF0IDEgYnkgZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBzdGFydCBhdHRyaWJ1dGUgaWYgaXQgZXhpc3RzIG9uIHRoZSA8b2w+IGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudExpc3RFbGVtICYmIHBhcmVudExpc3RFbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdPTCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExpc3RFbGVtLmhhc0F0dHJpYnV0ZSgnc3RhcnQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHBhcnNlSW50KHBhcmVudExpc3RFbGVtLmdldEF0dHJpYnV0ZSgnc3RhcnQnKSB8fCAnMScsIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gaXNOYU4oc3RhcnRWYWx1ZSkgPyAxIDogc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgcHJldmlvdXMgc2libGluZyBsaXN0aXRlbXMgYXQgdGhlIHNhbWUgbGV2ZWwgdXNpbmcgRE9NV2Fsa2VyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpYmxpbmcgPSBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QoY3VycmVudEVsZW0pO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb3VudCBkaXJlY3Qgc2libGluZ3MgdGhhdCBhcmUgbGlzdGl0ZW1zIChlbGVtZW50IG5vZGVzIG9ubHkpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZy5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdFbGVtID0gc2libGluZyBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZ0VsZW0uZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdsaXN0aXRlbScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZ0VsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0xJJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmcgPSBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3Qoc2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHJldFN0ciA9IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgJHtjb3VudH0uICR7bmFtZVRvVXNlfWAgOiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0U3RyO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYXRoIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWF0aFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNFbmRUYWcoKSA/IGBbbWF0aCBjb250ZW50XWAgOiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIExpbmsgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJtZW51aXRlbVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGlzU3ViTWVudUNvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgKGxldCBjaGVja0NoaWxkcmVuPWN1cnNvci5nZXROb2RlKCkuZmlyc3RDaGlsZDsgIWlzU3ViTWVudUNvbnRhaW5lciAmJiBjaGVja0NoaWxkcmVuICE9PSBudWxsOyBjaGVja0NoaWxkcmVuID0gY2hlY2tDaGlsZHJlbi5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaXNTdWJNZW51Q29udGFpbmVyID0gY2hlY2tDaGlsZHJlbi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlVMXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGlzU3ViTWVudUNvbnRhaW5lcikgcmV0dXJuIFwiWz8/Pz9tZW51XVwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhwYW5kU3RyID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRTdHIgKz0gXCIsIHN1Yi1tZW51XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kU3RyICs9IGAsICR7ZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpID09PSBcInRydWVcIiA/IFwiZXhwYW5kZWRcIiA6IFwiY29sbGFwc2VkXCJ9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGBbbWVudSR7ZXhwYW5kU3RyfWA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lSW5mbyA9IGN1cnNvci5nZXROYW1lSW5mbygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZUluZm8gJiYgIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKG5hbWVJbmZvLm5hbWVGcm9tKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IHF1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBcIl1cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTWV0ZXIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJtZXRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtwcm9ncmVzcyBiYXIsICR7KChjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKX1dYCA6IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUHJvZ3Jlc3NiYXIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJwcm9ncmVzc2JhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtwcm9ncmVzcyBiYXIsICR7KChjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKX1dYCA6IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUmFkaW8gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJyYWRpb1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwicmFkaW8gYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYkNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFwiYXJpYS1jaGVja2VkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiQ2hlY2tlZCA9IGN1cnNvci5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFwiYXJpYS1jaGVja2VkXCIpID09PSBcInRydWVcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJDaGVja2VkID0gKGN1cnNvci5nZXROb2RlKCkgYXMgYW55KS5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGF0ZVN0ciA9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtyb2xlRGVzY30sICR7YkNoZWNrZWQgPyBcImNoZWNrZWRcIiA6IFwibm90IGNoZWNrZWRcIn0ke3N0YXRlU3RyfSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9JHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XWBcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFNlYXJjaGJveCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInNlYXJjaGJveFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9ZWRpdF1gIDogXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTZXBhcmF0b3Igcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzZXBhcmF0b3JcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgYFtzZXBhcmF0b3JdYCB8fCBcIlwiKVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTbGlkZXIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzbGlkZXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwic2xpZGVyXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBhcmlhLXZhbHVlbm93IGZpcnN0LCB0aGVuIGZhbGwgYmFjayB0byBuYXRpdmUgdmFsdWUgcHJvcGVydHlcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKVxuICAgICAgICAgICAgICAgICAgICA/IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKVxuICAgICAgICAgICAgICAgICAgICA6IChjdXJzb3IuZ2V0Tm9kZSgpIGFzIGFueSkudmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9LCAke3ZhbHVlfSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTcGluYnV0dG9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wic3BpbmJ1dHRvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzcGluYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfSwgZWRpdGFibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVGFiIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widGFiXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJ0YWJcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtyb2xlRGVzY30keyhjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXNlbGVjdGVkXCIpID09PSBcInRydWVcIiA/IFwiLCBzZWxlY3RlZFwiIDogXCJcIn0ke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWJsaXN0IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widGFibGlzdFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtncm91cCBzdGFydCR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbZ3JvdXAgZW5kJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRhYnBhbmVsIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widGFicGFuZWxcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbVGFiIHBhbmVsIHN0YXJ0JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtUYWIgcGFuZWwgZW5kJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRleHQgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0ZXh0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwibGlua1wiLCBcInRhYl9mb2N1c1wiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpIHx8ICFjdXJzb3IuZ2V0UGFyZW50RWxlbWVudCgpPy5nZXRFbGVtZW50KCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0UGFyZW50RWxlbWVudCgpPy5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pLnRleHREZWNvcmF0aW9uTGluZSA9PT0gXCJsaW5lLXRocm91Z2hcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtzdHJpa2V0aHJvdWdoXSAkeyhjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSArIFwiXCIpfSBbZW5kIHN0cmlrZXRocm91Z2hdYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAkeyhjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSArIFwiXCIpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIC0tIGluIGhlYWRpbmcgbW9kZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0ZXh0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVGV4dGJveCByb2xlXG4gICAgICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgICAgICByb2xlczogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlID09PSBcIml0ZW1cIiAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVEVYVEFSRUFcIiA/IFwiW291dCBvZiBlZGl0XVwiIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVzID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyArPSBgLCBwbGFjZWhvbGRlcjogJHtlbGVtLmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzTXVsdGlsaW5lID0gZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlRFWFRBUkVBXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW11bHRpbGluZVwiKSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaWJlZEJ5ID0gZ2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGVsZW0sIG1vZGUpO1xuICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNNdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gbW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiA/IGVsZW0udGV4dENvbnRlbnQ/LnRyaW0oKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50U3VmZml4ID0gdGV4dENvbnRlbnQgPyBgICR7dGV4dENvbnRlbnR9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9ZWRpdCwgbXVsdGlsaW5lJHthdHRyaWJ1dGVzfSR7ZGVzY3JpYmVkQnl9XSR7Y29udGVudFN1ZmZpeH1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1lZGl0JHthdHRyaWJ1dGVzfSR7ZGVzY3JpYmVkQnl9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KSxcblxuICAgIC8vIFRyZWVpdGVtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widHJlZWl0ZW1cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGFubm91bmNlbWVudCBzdHJpbmcgd2l0aG91dCB0aGUgbmFtZSAobGV0IGNvbnRlbnQgcmVuZGVyIHNlcGFyYXRlbHkpXG4gICAgICAgICAgICAgICAgbGV0IGFubm91bmNlbWVudCA9IGBbdHJlZXZpZXcgaXRlbWA7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIHNlbGVjdGVkIHN0YXRlIGlmIHByZXNlbnRcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXNlbGVjdGVkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgICAgICAgICBhbm5vdW5jZW1lbnQgKz0gXCIsIHNlbGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFkZCBleHBhbmRlZC9jb2xsYXBzZWQgc3RhdGUgaWYgcHJlc2VudFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VtZW50ICs9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKSA9PT0gXCJ0cnVlXCIgPyBcIiwgZXhwYW5kZWRcIiA6IFwiLCBjb2xsYXBzZWRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIGxldmVsIGlmIGV4cGxpY2l0bHkgc2V0IG9yIGNhbGN1bGF0ZSBmcm9tIG5lc3RpbmdcbiAgICAgICAgICAgICAgICBsZXQgbGV2ZWwgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGV2ZWxcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGFubm91bmNlbWVudCArPSBgLCBsZXZlbCAke2xldmVsfWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGxldmVsIGJ5IGNvdW50aW5nIHBhcmVudCB0cmVlaXRlbXMgb3IgZ3JvdXBzIHVzaW5nIERPTVdhbGtlciBmb3Igc2hhZG93IERPTSBzdXBwb3J0XG4gICAgICAgICAgICAgICAgICAgIGxldCBjYWxjdWxhdGVkTGV2ZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRSb2xlID09PSBcImdyb3VwXCIgfHwgcGFyZW50Um9sZSA9PT0gXCJ0cmVlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGdyb3VwIGlzIGluc2lkZSBhIHRyZWVpdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwUGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZ3JvdXBQYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBQYXJlbnRSb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGdyb3VwUGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwUGFyZW50Um9sZSA9PT0gXCJ0cmVlaXRlbVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkTGV2ZWwrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyb3VwUGFyZW50Um9sZSA9PT0gXCJ0cmVlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwUGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZ3JvdXBQYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGN1bGF0ZWRMZXZlbCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm91bmNlbWVudCArPSBgLCBsZXZlbCAke2NhbGN1bGF0ZWRMZXZlbH1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFkZCBwb3NpdGlvbiBpbmZvcm1hdGlvbiAoYXJpYS1wb3NpbnNldC9hcmlhLXNldHNpemUgb3IgY2FsY3VsYXRlKVxuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1wb3NpbnNldFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgc2V0U2l6ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1zZXRzaXplXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICghcG9zaXRpb24gfHwgIXNldFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGJ5IGNvdW50aW5nIHNpYmxpbmdzIHdpdGggc2FtZSByb2xlIHVzaW5nIERPTVdhbGtlciBmb3Igc2hhZG93IERPTSBzdXBwb3J0XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGNoaWxkcmVuIHRvIGNvdW50IHRyZWVpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdChwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxKSB7IC8vIEVsZW1lbnQgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEVsZW0gPSBjaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShjaGlsZEVsZW0pID09PSBcInRyZWVpdGVtXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRFbGVtID09PSBlbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gdG90YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvcy50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBzZXRTaXplID0gdG90YWwudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgYW5ub3VuY2VtZW50ICs9IGAsICR7cG9zaXRpb259IG9mICR7c2V0U2l6ZX1dIGA7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFubm91bmNlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSFRNTCBFbGVtZW50IHJ1bGVzXG5cbiAgICAvLyBQcmVmb3JtYXR0ZWQgdGV4dCBsaW5lIHJlbmRlcmluZzogd2hlbiBjdXJzb3IgaXMgYXQgYSA8cHJlPiBlbGVtZW50IHdpdGhcbiAgICAvLyBwcmVMaW5lSW5kZXggc2V0LCByZW5kZXIgb25seSB0aGF0IGxpbmUgb2YgdGhlIHByZSdzIHRleHQgY29udGVudC5cbiAgICAvLyBUaGlzIHJ1bGUgZmlyZXMgaW5zaWRlIHJlbmRlclJhbmdlIGZvciBwZXItbGluZSBpdGVtIHN0b3BzLlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIlBSRVwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5wcmVMaW5lSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7IC8vIGxldCBjb250YWluZXJfZW50ZXIgaGFuZGxlIGl0XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbFRleHQgPSAoY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudCkudGV4dENvbnRlbnQgPz8gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCByYXdMaW5lcyA9IGZ1bGxUZXh0LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHN0YXJ0IDwgcmF3TGluZXMubGVuZ3RoICYmIHJhd0xpbmVzW3N0YXJ0XS50cmltKCkgPT09IFwiXCIpIHN0YXJ0Kys7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IHJhd0xpbmVzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGVuZCA+PSBzdGFydCAmJiByYXdMaW5lc1tlbmRdLnRyaW0oKSA9PT0gXCJcIikgZW5kLS07XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSByYXdMaW5lcy5zbGljZShzdGFydCwgZW5kICsgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVzW2N1cnNvci5wcmVMaW5lSW5kZXhdID8/IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkJPRFlcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTdXBwcmVzcyBbU3RhcnQvRW5kIG9mIGRvY3VtZW50XSBmb3IgaWZyYW1lIHN1YmRvY3VtZW50IGJvZGllcy5cbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBpbm5lciBib2R5IGlzIGVudGVyZWQgZnJvbSBhbiA8aWZyYW1lPiwgZGlmZkNvbnRhaW5lcnMgZW1pdHNcbiAgICAgICAgICAgICAgICAvLyB0aGUgW1wibmFtZVwiLCBmcmFtZV0gY29udGFpbmVyLWVudGVyIGFubm91bmNlbWVudCBpbnN0ZWFkLiBTdXBwcmVzc2luZ1xuICAgICAgICAgICAgICAgIC8vIHRoZSBkb2N1bWVudCB0aXRsZSBhbm5vdW5jZW1lbnRzIGhlcmUgYXZvaWRzIGRvdWJsZS1hbm5vdW5jZW1lbnRzLlxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChib2R5Lm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50KSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVN0ciA9IGN1cnNvci5nZXROb2RlKCkub3duZXJEb2N1bWVudC50aXRsZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmlzRW5kVGFnKCkgPyBgW0VuZCBvZiBkb2N1bWVudCR7dGl0bGVTdHIudHJpbSgpLmxlbmd0aCA+IDAgPyBcIjogXCIgKyB0aXRsZVN0ci50cmltKCkgOiBcIlwifV1gIDogYFtTdGFydCBvZiBkb2N1bWVudCR7dGl0bGVTdHIudHJpbSgpLmxlbmd0aCA+IDAgPyBcIjogXCIgKyB0aXRsZVN0ci50cmltKCkgOiBcIlwifV1gXG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIElubGluZSBmcmFtZSAoPGlmcmFtZT4pIOKAlCB0YWJfZm9jdXMgbW9kZTogYW5ub3VuY2VzIHRoZSBmcmFtZSBhcyBhIHRhYiBzdG9wLlxuICAgIC8vIEEgdGl0bGVkIGlmcmFtZSBhbm5vdW5jZXMgaXRzIGFjY2Vzc2libGUgbmFtZTsgYW4gdW50aXRsZWQgb25lIGFubm91bmNlcyBqdXN0IFwiZnJhbWVcIi5cbiAgICAvLyAoVGhlIGl0ZW0tbW9kZSBhbm5vdW5jZW1lbnQgaXMgaGFuZGxlZCBieSBkaWZmQ29udGFpbmVycyBlbWl0dGluZyB0aGUgY29udGFpbmVyX2VudGVyXG4gICAgLy8gSUZSQU1FIHJ1bGUgd2hlbiBjcm9zc2luZyBpbnRvIHRoZSBzdWJkb2N1bWVudCDigJQgbm8gc2VwYXJhdGUgU1JfUlVMRSBuZWVkZWQgZm9yIGl0ZW0gbW9kZS4pXG4gICAgLy8gV2hlbiByb2xlPVwibm9uZVwiIG9yIHJvbGU9XCJwcmVzZW50YXRpb25cIiBpcyBzZXQsIHNjcmVlbiByZWFkZXJzIHRyZWF0IHRoZSBmcmFtZSBhcyBhXG4gICAgLy8gZ2VuZXJpYyBncm91cGluZyDigJQgYW5ub3VuY2UgXCJncm91cGluZ1wiIGluc3RlYWQgb2YgXCJmcmFtZVwiLlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIklGUkFNRVwiXSxcbiAgICAgICAgbW9kZXM6IFtcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcInJvbGVcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNQcmVzZW50YXRpb24gPSByb2xlID09PSBcIm5vbmVcIiB8fCByb2xlID09PSBcInByZXNlbnRhdGlvblwiO1xuICAgICAgICAgICAgICAgIC8vIEFuIHVudGl0bGVkIHByZXNlbnRhdGlvbmFsIGlmcmFtZSBwcm9kdWNlcyBubyBtZWFuaW5nZnVsIHRhYiBzdG9wIGxhYmVsIOKAlFxuICAgICAgICAgICAgICAgIC8vIHN1cHByZXNzIGl0IGVudGlyZWx5IHNvIGl0IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgdGFiX2ZvY3VzIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50YXRpb24gJiYgIWN1cnNvci5nZXROYW1lKCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gaXNQcmVzZW50YXRpb24gPyBcImdyb3VwaW5nXCIgOiBcImZyYW1lXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7bGFiZWx9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkJSXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdhbGsgPSBjdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2FsayB1bnRpbCB3ZSBoaXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZSwgZmluZCBhbm90aGVyIEJSLCBvciBmaW5kIHNvbWV0aGluZyB3aXRoIGEgbmFtZVxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAod2Fsay5wcmV2aW91cygoKSA9PiB0cnVlKSAmJiB3YWxrLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpICE9PSBcIkJSXCIgJiYgd2Fsay5nZXROYW1lSW5mbygpICYmIHdhbGsuZ2V0TmFtZUluZm8oKS5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2Fsay5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJCUlwiID8gXCJbYmxhbmtdXCIgOiBudWxsO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJETFwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJJTlBVVFwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcInBhc3N3b3JkXCIgJiYgYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9ZWRpdCwgcHJvdGVjdGVkJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XWApIHx8IG51bGwsXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTElucHV0RWxlbWVudCk/LnZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT09IFwiXCIgPyBcIk5vIGZpbGUgY2hvc2VuXCIgOiB2YWx1ZS5zdWJzdHJpbmcoXCJDOlxcXFxmYWtlcGF0aFxcXFxcIi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9YnV0dG9uJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XSBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7dmFsdWV9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImNvbG9yXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSAoTnVtYmVyKGAweCR7dmFsLnN1YnN0cmluZygxLCAzKX1gKSAqIDEwMC4wIC8gTnVtYmVyKFwiMHhmZlwiKSkudG9GaXhlZCgwKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZyA9IChOdW1iZXIoYDB4JHt2YWwuc3Vic3RyaW5nKDMsIDUpfWApICogMTAwLjAgLyBOdW1iZXIoXCIweGZmXCIpKS50b0ZpeGVkKDApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gKE51bWJlcihgMHgke3ZhbC5zdWJzdHJpbmcoNSl9YCkgKiAxMDAuMCAvIE51bWJlcihcIjB4ZmZcIikpLnRvRml4ZWQoMCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFske3J9JSByZWQgJHtnfSUgZ3JlZW4gJHtifSUgYmx1ZV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJtb250aFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gXCJcIiArIGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBcIlwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFtzcGluIGJ1dHRvbiwgJHttfV0gW3NwaW4gYnV0dG9uLCAke3l9XSBbbWVudSBidXR0b25dIFtzdWJNZW51XSBTaG93IG1vbnRoIHBpY2tlcmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImRhdGVcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRheSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gXCJcIiArIGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBcIlwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gXCJcIiArIChkYXRlLmdldERhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNsaWNrYWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV0gW3NwaW4gYnV0dG9uLCAke219XSAvIFtzcGluIGJ1dHRvbiwgJHtkYXl9XSAvIFtzcGluIGJ1dHRvbiwgJHt5fV0gW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyBkYXRlIHBpY2tlcmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImRhdGV0aW1lLWxvY2FsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7IC8vIDIwMjUtMDktMTJUMDQ6MjBcbiAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRheSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaG91ciA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWluID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbXBtID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUodmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBcIlwiICsgZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbSA9IFwiXCIgKyAoZGF0ZS5nZXRNb250aCgpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXkgPSBcIlwiICsgKGRhdGUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRlLmdldEhvdXJzKCkgPT09IDAgfHwgZGF0ZS5nZXRIb3VycygpID09PSAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIjEyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGUuZ2V0SG91cnMoKSA8IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciA9IFwiXCIgKyBkYXRlLmdldEhvdXJzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIlwiICsgKGRhdGUuZ2V0SG91cnMoKSAtIDEyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IFwiXCIgKyBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFtcG0gPSBkYXRlLmdldEhvdXJzKCkgPj0gMTIgPyBcInBtXCIgOiBcImFtXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNsaWNrYWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV0gW3NwaW4gYnV0dG9uLCAke219XSAvIFtzcGluIGJ1dHRvbiwgJHtkYXl9XSAvIFtzcGluIGJ1dHRvbiwgJHt5fV0gW3NwaW4gYnV0dG9uLCAke2hvdXJ9XSA6IFtzcGluIGJ1dHRvbiwgJHttaW59XSBbc3BpbiBidXR0b24sICR7YW1wbX1dICBbbWVudSBidXR0b25dIFtzdWJNZW51XSBTaG93IGxvY2FsIGRhdGUgYW5kIHRpbWUgcGlja2VyYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwidGltZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlOyAvLyAyMDI1LTA5LTEyVDA0OjIwXG4gICAgICAgICAgICAgICAgICAgIGxldCBob3VyID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtaW4gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFtcG0gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSB2YWwuc3BsaXQoXCI6XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdXJzID0gcGFyc2VJbnQoZGF0ZVswXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG91cnMgPT09IDAgfHwgaG91cnMgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciA9IFwiMTJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIlwiICsgaG91cnM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIlwiICsgKGhvdXJzIC0gMTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gZGF0ZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFtcG0gPSBob3VycyA+PSAxMiA/IFwicG1cIiA6IFwiYW1cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Z3JvdXBpbmcgY2xpY2thYmxlJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9IFtzcGluIGJ1dHRvbiwgJHtob3VyfV0gOiBbc3BpbiBidXR0b24sICR7bWlufV0gW3NwaW4gYnV0dG9uLCAke2FtcG19XSBbbWVudSBidXR0b25dIFtzdWJNZW51XSBTaG93IHRpbWUgcGlja2VyIFtvdXQgb2YgZ3JvdXBpbmddYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwid2Vla1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlOyAvLyAyMDI1LVczOFxuICAgICAgICAgICAgICAgICAgICBsZXQgeWVhciA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2VlayA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IHZhbC5zcGxpdCgvLVcvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSBkYXRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2VlayA9IGRhdGVbMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNsaWNrYWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV0gW3NwaW4gYnV0dG9uLCAke3dlZWt9XSwgW3NwaW4gYnV0dG9uLCAke3llYXJ9XSBbbWVudSBidXR0b25dIFtzdWJNZW51XSBTaG93IHdlZWsgcGlja2VyYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIgPyBcIlwiIDogbnVsbCxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBgISFbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWlucHV0ISFdJHtjdXJzb3IuZ2V0RWxlbWVudCgpLm91dGVySFRNTH1gKSB8fCBudWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkxJXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGlzdGl0ZW0gY29udGFpbnMgaW50ZXJhY3RpdmUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAvLyBTY3JlZW4gcmVhZGVycyBkb24ndCByZWFkIHRoZSBhY2Nlc3NpYmxlIG5hbWUgd2hlbiBpbnRlcmFjdGl2ZSBlbGVtZW50cyBhcmUgcHJlc2VudFxuICAgICAgICAgICAgICAgIGNvbnN0IGhhc0ludGVyYWN0aXZlQ29udGVudCA9IGxpc3RpdGVtQ29udGFpbnNJbnRlcmFjdGl2ZUVsZW1lbnQoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lVG9Vc2UgPSBoYXNJbnRlcmFjdGl2ZUNvbnRlbnQgPyBcIlwiIDogKGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lIHx8IFwiXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKS5saXN0U3R5bGVUeXBlID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGAke25hbWVUb1VzZX1gIDogXCJcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGBbYnVsbGV0XSAke25hbWVUb1VzZX1gIDogXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE1hdGhNTCBlbGVtZW50c1xuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIk1GUkFDXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtmcmFjdGlvbl1gIDogYFtlbmQgZnJhY3Rpb25dYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNUk9XXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBhbm5vdW5jZSBvdmVyIG9uIHRoZSBlbmQgdGFnXG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbGV0IGZyYWN0aW9uID0gY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtdLCBbXCJtZnJhY1wiXSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyYWN0aW9uICYmIGZyYWN0aW9uLmdldEVsZW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwibXJvd1wiKVswXT8uaXNTYW1lTm9kZShjdXJzb3IuZ2V0Tm9kZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJbb3Zlcl1cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIk1TUVJUXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtzcXVhcmUgcm9vdF1gIDogYFtlbmQgcm9vdF1gXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIk1TVVBcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzRW5kVGFnKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgbWkgPSBjdXJzb3IuZ2V0RWxlbWVudCgpLnF1ZXJ5U2VsZWN0b3IoXCJtaVwiKT8uaW5uZXJIVE1MIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgbW4gPSBjdXJzb3IuZ2V0RWxlbWVudCgpLnF1ZXJ5U2VsZWN0b3IoXCJtblwiKT8uaW5uZXJIVE1MIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKG1uID09PSBcIjJcIikgcmV0dXJuIGAke21pfSBbc3F1YXJlZF1gO1xuICAgICAgICAgICAgICAgIGlmIChtbiA9PT0gXCIzXCIpIHJldHVybiBgJHttaX0gW2N1YmVkXWA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke21pfSBbdG8gdGhlICR7bW59XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFN1bW1hcnkgZWxlbWVudCDigJQgdGhlIGRpc2Nsb3N1cmUgYnV0dG9uIGZvciBhIDxkZXRhaWxzPiB3aWRnZXQuXG4gICAgLy8gPHN1bW1hcnk+IGhhcyBpbXBsaWNpdFJvbGU6IG51bGwgaW4gQVJJQURlZmluaXRpb25zIHNvIG5vIHJvbGUtYmFzZWRcbiAgICAvLyBidXR0b24gcnVsZSBmaXJlcy4gIFdlIGFkZCBhbiBleHBsaWNpdCBlbGVtZW50IHJ1bGUgdGhhdCBhbm5vdW5jZXMgaXQgYXNcbiAgICAvLyBhIGJ1dHRvbiB3aXRoIHRoZSBjb2xsYXBzZWQgLyBleHBhbmRlZCBzdGF0ZSBmcm9tIHRoZSBwYXJlbnQgPGRldGFpbHM+LlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIlNVTU1BUllcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiYnV0dG9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGlmICghc3VtbWFyeUVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IDxzdW1tYXJ5PiB0aGF0IGlzIGEgZGlyZWN0IGNoaWxkIG9mIDxkZXRhaWxzPlxuICAgICAgICAgICAgICAgIC8vIGFjdHMgYXMgdGhlIGRpc2Nsb3N1cmUgYnV0dG9uLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHNQYXJlbnQgPSBzdW1tYXJ5RWxlbS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghZGV0YWlsc1BhcmVudCB8fCBkZXRhaWxzUGFyZW50Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09IFwiREVUQUlMU1wiKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFN1bW1hcnkgPSBBcnJheS5mcm9tKGRldGFpbHNQYXJlbnQuY2hpbGRyZW4pLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIGMgPT4gYy5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNVTU1BUllcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCFmaXJzdFN1bW1hcnkgfHwgIWZpcnN0U3VtbWFyeS5pc1NhbWVOb2RlKHN1bW1hcnlFbGVtKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGVTdHIgPSBkZXRhaWxzUGFyZW50Lmhhc0F0dHJpYnV0ZShcIm9wZW5cIikgPyBcImV4cGFuZGVkXCIgOiBcImNvbGxhcHNlZFwiO1xuICAgICAgICAgICAgICAgIC8vIDxzdW1tYXJ5PiBoYXMgaW1wbGljaXRSb2xlOiBudWxsIHNvIEFjY05hbWVVdGlsIG1heSBub3QgY29tcHV0ZSBhIG5hbWU7XG4gICAgICAgICAgICAgICAgLy8gcmVhZCBhcmlhLWxhYmVsIGZpcnN0LCB0aGVuIGZhbGwgYmFjayB0byB2aXNpYmxlIHRleHQgY29udGVudC5cbiAgICAgICAgICAgICAgICBjb25zdCBhcmlhTGFiZWwgPSBzdW1tYXJ5RWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpPy50cmltKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBzdW1tYXJ5RWxlbS50ZXh0Q29udGVudD8udHJpbSgpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBhcmlhTGFiZWwgfHwgdGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWxTdHIgPSBsYWJlbCA/IGBcIiR7bGFiZWx9XCIsIGAgOiBcIlwiO1xuICAgICAgICAgICAgICAgIC8vIERlc2NyaXB0aW9uOiBwcmVmZXIgZXhwbGljaXQgYXJpYS1kZXNjcmliZWRieTsgd2hlbiBhcmlhLWxhYmVsIGlzIHRoZVxuICAgICAgICAgICAgICAgIC8vIG5hbWUgc291cmNlLCB0aGUgc3VidHJlZSB0ZXh0IGJlY29tZXMgdGhlIGRlc2NyaXB0aW9uIChhY2NuYW1lLTEuMiDCpzQuMykuXG4gICAgICAgICAgICAgICAgbGV0IGRlc2NTdHIgPSBnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoc3VtbWFyeUVsZW0sIG1vZGUpO1xuICAgICAgICAgICAgICAgIGlmICghZGVzY1N0ciAmJiBhcmlhTGFiZWwgJiYgdGV4dENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY1N0ciA9IG1vZGUgPT09IFwiaXRlbVwiID8gYCwgXFx1MDAwMSR7dGV4dENvbnRlbnR9XFx1MDAwMmAgOiBgLCBcIiR7dGV4dENvbnRlbnR9XCJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYFske2xhYmVsU3RyfWJ1dHRvbiwgJHtzdGF0ZVN0cn0ke2Rlc2NTdHJ9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE11bHRpcGxlIHJvbGVzIHJ1bGVzIC0gcGxhY2VkIGF0IHRoZSBib3R0b21cbiAgICBcbiAgICAvLyBEZWZhdWx0IG1vZGUgcnVsZXMgLSBDb250YWluZXIgZWxlbWVudHMgKG11bHRpcGxlIHJvbGVzKVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJhcnRpY2xlXCIsIFwiYmFubmVyXCIsIFwiYmxvY2txdW90ZVwiLCBcImNhcHRpb25cIiwgXCJjZWxsXCIsIFwiY29kZVwiLCBcImNvbHVtbmhlYWRlclwiLFxuICAgICAgICAgICAgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIiwgXCJmaWd1cmVcIiwgXCJmb3JtXCIsIFwiZ3JvdXBcIiwgXCJsaXN0XCIsIFwibWFpblwiLFxuICAgICAgICAgICAgXCJtYXJrXCIsIFwibmF2aWdhdGlvblwiLCBcInJlZ2lvblwiLCBcInJvd1wiLCBcInJvd2hlYWRlclwiLCBcInNlYXJjaFwiLCBcInRhYmxlXCIsIFwidG9vbGJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIERlZmF1bHQgbW9kZSBydWxlcyAtIEVsZW1lbnRzIHRoYXQgc2NyZWVuIHJlYWRlcnMgdHlwaWNhbGx5IGlnbm9yZSAobXVsdGlwbGUgcm9sZXMpXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInBhcmFncmFwaFwiLCBcInJvd2dyb3VwXCIsIFwic3RhdHVzXCIsIFwic3Ryb25nXCIsIFwic3Vic2NyaXB0XCIsIFwic3VwZXJzY3JpcHRcIixcbiAgICAgICAgICAgIFwidGVybVwiLCBcInRpbWVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXVxuIiwiaW1wb3J0IHsgU1JSZW5kZXJlclJ1bGUgfSBmcm9tIFwiLi4vU1JSZW5kZXJlclJ1bGVcIjtcbmltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4uL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBTUlRhYmxlVXRpbCB9IGZyb20gXCIuLi9TUlRhYmxlVXRpbFwiO1xuaW1wb3J0IHsgcXVvdGVOYW1lUGFkQWZ0ZXIsIHF1b3RlTmFtZVBhZEJlZm9yZSwgZ2V0Um9sZURlc2NyaXB0aW9uIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi8uLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBhbm5vdW5jZW1lbnQgdGV4dCB3aGVuIGVudGVyaW5nIGEgdGFibGUgY2VsbFxuICovXG5mdW5jdGlvbiByZW5kZXJFbnRlclRhYmxlQ2VsbChuZXdDdXJzb3I6IFNSQ3Vyc29yLCBvbGRDdXJzb3I6IFNSQ3Vyc29yKSB7XG4gICAgLy8gV2Ugc2VlbSB0byBiZSBhdCB0aGUgbmV3bGluZSB0ZXh0IG5vZGUgYWZ0ZXIgdGhlIGNlbGxcbiAgICBpZiAob2xkQ3Vyc29yICYmIG9sZEN1cnNvci5nZXROb2RlKCk/Lm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgb2xkQ3Vyc29yID0gb2xkQ3Vyc29yLmNsb25lKCk7XG4gICAgICAgIG9sZEN1cnNvci5wcmV2aW91cygoKSA9PiB0cnVlKVxuICAgIH1cbiAgICBjb25zdCBuZXdUYWJsZU1vZGVsID0gU1JUYWJsZVV0aWwuZ2V0VGFibGVNb2RlbChuZXdDdXJzb3IpO1xuICAgIGNvbnN0IG9sZENlbGxJbmZvID0gU1JUYWJsZVV0aWwuZ2V0Q2VsbE1vZGVsKG9sZEN1cnNvciwgbmV3VGFibGVNb2RlbCk7XG4gICAgY29uc3QgbmV3Q2VsbEluZm8gPSBTUlRhYmxlVXRpbC5nZXRDZWxsTW9kZWwobmV3Q3Vyc29yLCBuZXdUYWJsZU1vZGVsKTtcbiAgICBpZiAoIW5ld0NlbGxJbmZvKSByZXR1cm4gXCJcIjtcbiAgICBsZXQgcmV0VmFsOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQW5ub3VuY2Ugcm93IGluZm9ybWF0aW9uIGlmIHdlJ3ZlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHJvdyBvciB0aGUgcm93c3BhbiBoYXMgY2hhbmdlZFxuICAgIGlmICghb2xkQ2VsbEluZm8gfHwgb2xkQ2VsbEluZm8ucm93SW5kZXhTdGFydCAhPT0gbmV3Q2VsbEluZm8ucm93SW5kZXhTdGFydCB8fCBvbGRDZWxsSW5mby5yb3dzcGFuICE9PSBuZXdDZWxsSW5mby5yb3dzcGFuKSB7XG4gICAgICAgIC8vIElmIGEgY2hhbmdlIGluIHJvdyBvciBhIGNoYW5nZSBpbiByb3dTcGFuXG4gICAgICAgIGxldCByb3dIZWFkZXJzID0gU1JUYWJsZVV0aWwuZ2V0Um93SGVhZGVyc0ZvckN1cnNvcihuZXdDdXJzb3IsIG5ld1RhYmxlTW9kZWwpO1xuICAgICAgICBsZXQgaGVhZGVySW5mb1N0ciA9IHJvd0hlYWRlcnMgJiYgcm93SGVhZGVycy50cmltKCkubGVuZ3RoID4gMCA/IGBcIiR7cm93SGVhZGVyc31cIiwgYCA6IFwiXCI7XG4gICAgICAgIHJldFZhbC5wdXNoKGBbJHtoZWFkZXJJbmZvU3RyfXJvdyAkeyhuZXdDZWxsSW5mby5yb3dJbmRleFN0YXJ0KzEpfSR7bmV3Q2VsbEluZm8ucm93c3BhbiA+IDEgPyBcIiB0aHJvdWdoIFwiICsgKG5ld0NlbGxJbmZvLnJvd0luZGV4U3RhcnQrbmV3Q2VsbEluZm8ucm93c3BhbikgOiBcIlwifV1gKTtcbiAgICB9XG5cbiAgICAvLyBBbm5vdW5jZSBjb2x1bW4gaW5mb3JtYXRpb24gaWYgd2UndmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgY29sdW1uIG9yIHRoZSBjb2xzcGFuIGhhcyBjaGFuZ2VkXG4gICAgaWYgKCFvbGRDZWxsSW5mbyB8fCBvbGRDZWxsSW5mby5jb2xJbmRleFN0YXJ0ICE9PSBuZXdDZWxsSW5mby5jb2xJbmRleFN0YXJ0IHx8IG9sZENlbGxJbmZvLmNvbHNwYW4gIT09IG5ld0NlbGxJbmZvLmNvbHNwYW4pIHtcbiAgICAgICAgLy8gSWYgYSBjaGFuZ2UgaW4gY29sdW1uIG9yIGEgY2hhbmdlIGluIGNvbHNwYW5cbiAgICAgICAgbGV0IGNvbHVtbkhlYWRlcnMgPSBTUlRhYmxlVXRpbC5nZXRDb2x1bW5IZWFkZXJzRm9yQ3Vyc29yKG5ld0N1cnNvciwgbmV3VGFibGVNb2RlbCk7XG4gICAgICAgIGxldCBoZWFkZXJJbmZvU3RyID0gY29sdW1uSGVhZGVycyAmJiBjb2x1bW5IZWFkZXJzLnRyaW0oKS5sZW5ndGggPiAwID8gYFwiJHtjb2x1bW5IZWFkZXJzfVwiLCBgIDogXCJcIjtcbiAgICAgICAgcmV0VmFsLnB1c2goYFske2hlYWRlckluZm9TdHJ9Y29sdW1uICR7KG5ld0NlbGxJbmZvLmNvbEluZGV4U3RhcnQrMSl9JHtuZXdDZWxsSW5mby5jb2xzcGFuID4gMSA/IFwiIHRocm91Z2ggXCIgKyAobmV3Q2VsbEluZm8uY29sSW5kZXhTdGFydCtuZXdDZWxsSW5mby5jb2xzcGFuKSA6IFwiXCJ9XWApO1xuICAgIH1cblxuICAgIHJldHVybiByZXRWYWwuam9pbihcIiBcIik7XG59XG5cbmV4cG9ydCBsZXQgUlVMRVM6IFNSUmVuZGVyZXJSdWxlW10gPSBbXG4gICAgLy8gU2luZ2xlIHJvbGUgcnVsZXMgLSBhbHBoYWJldGljYWxseSBzb3J0ZWRcblxuICAgIC8vIEFydGljbGUgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJhcnRpY2xlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiYXJ0aWNsZVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYXJ0aWNsZVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQmFubmVyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYmFubmVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJiYW5uZXIgcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBCbG9ja3F1b3RlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYmxvY2txdW90ZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbYmxvY2txdW90ZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDYXB0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2FwdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbY2FwdGlvbl1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDZWxsIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2VsbFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYmxlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgcmVuZGVyRW50ZXJUYWJsZUNlbGxcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29sdW1uaGVhZGVyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY29sdW1uaGVhZGVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICByZW5kZXJFbnRlclRhYmxlQ2VsbFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDb21wbGVtZW50YXJ5IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY29tcGxlbWVudGFyeVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Y29tcGxlbWVudGFyeSByZWdpb25dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29udGVudGluZm8gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjb250ZW50aW5mb1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Y29udGVudCBpbmZvIHJlZ2lvbl1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBGaWd1cmUgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJmaWd1cmVcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2ZpZ3VyZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBGb3JtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZm9ybVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcImZvcm1jb250cm9sXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW3NlY3Rpb25dXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWZvcm0gcmVnaW9uXWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEdyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiREVUQUlMU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNTdW1tYXJ5ID0gQXJyYXkuZnJvbShlbGVtLmNoaWxkcmVuKS5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgYyA9PiBjLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU1VNTUFSWVwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNTdW1tYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgPHN1bW1hcnk+IGNoaWxkIHNwZWFrcyBhcyB0aGUgZGlzY2xvc3VyZSBidXR0b247IHN1cHByZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29udGFpbmVyLWVudGVyIGFubm91bmNlbWVudCBlbnRpcmVseS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vIGV4cGxpY2l0IDxzdW1tYXJ5PjogaW4gYSByZWFsIGJyb3dzZXIgdGhlIFVBIGluamVjdHMgYSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIC8vIFwiRGV0YWlsc1wiIHN1bW1hcnkuICBqc2RvbSBkb2VzIG5vdCwgc28gd2UgYW5ub3VuY2UgdGhlIHdpZGdldCBoZXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgZmFsbGJhY2sgdXNpbmcgdGhlIHNhbWUgZGVmYXVsdCBsYWJlbCBhIHJlYWwgYnJvd3NlciB3b3VsZCB1c2UuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW1wiRGV0YWlsc1wiLCBidXR0b24sICR7ZWxlbS5oYXNBdHRyaWJ1dGUoXCJvcGVuXCIpID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcImNvbWJvYm94XCJdLCBbXCJzZWxlY3RcIl0pPy5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJTRUxFQ1RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbZ3JvdXBpbmcke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyAtLSB0YWJfZm9jdXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJERVRBSUxTXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc1N1bW1hcnkgPSBBcnJheS5mcm9tKGVsZW0uY2hpbGRyZW4pLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjID0+IGMubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJTVU1NQVJZXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1N1bW1hcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxzdW1tYXJ5PiBpcyB0aGUgdGFiIHN0b3AsIG5vdCA8ZGV0YWlscz4gaXRzZWxmLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gTm8gPHN1bW1hcnk+OiA8ZGV0YWlscz4gaXRzZWxmIGlzIGZvY3VzYWJsZSAoVUEgZGVmYXVsdCBiZWhhdmlvdXIpLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtcIkRldGFpbHNcIiwgYnV0dG9uLCAke2VsZW0uaGFzQXR0cmlidXRlKFwib3BlblwiKSA/IFwiZXhwYW5kZWRcIiA6IFwiY29sbGFwc2VkXCJ9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJjb21ib2JveFwiXSwgW1wic2VsZWN0XCJdKT8uZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0VMRUNUXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImxpc3RcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJsaXN0XCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjZW5kYW50TGlzdEl0ZW1zID0gZG9jdW1lbnQuZXZhbHVhdGUoXCIuLy9saSB8IC4vLypbQHJvbGU9J2xpc3RpdGVtJ11cIiwgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENvdW50IGl0ZW1zLCBleGNsdWRpbmcgdGhvc2UgaW4gb3RoZXIgbGlzdHMgb3Igd2l0aGluIHByZXNlbnRhdGlvbmFsIGNvbnRhaW5lcnNcbiAgICAgICAgICAgICAgICBsZXQgbnVtSXRlbXMgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzY2VuZGFudExpc3RJdGVtcy5zbmFwc2hvdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkZXNjZW5kYW50TGlzdEl0ZW1zLnNuYXBzaG90SXRlbShpKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIFdhbGsgdXAgYW5jZXN0b3JzIHRvIGNoZWNrIGZvciBib3RoIG5lc3RlZCBsaXN0cyBhbmQgcHJlc2VudGF0aW9uYWwgY29udGFpbmVyc1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNJbk90aGVyTGlzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGFzUHJlc2VudGF0aW9uYWxBbmNlc3RvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYW5jZXN0b3IgPSBpdGVtLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYW5jZXN0b3IgJiYgYW5jZXN0b3IgIT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGFuY2VzdG9yIGlzIGFub3RoZXIgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JSb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvclJvbGUgPT09IFwibGlzdFwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3Iubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJVTFwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3Iubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJPTFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbk90aGVyTGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGFuY2VzdG9yIGhhcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yUm9sZSAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbYW5jZXN0b3JSb2xlXT8ucHJlc2VudGF0aW9uYWxDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1ByZXNlbnRhdGlvbmFsQW5jZXN0b3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNJbk90aGVyTGlzdCAmJiAhaGFzUHJlc2VudGF0aW9uYWxBbmNlc3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtSXRlbXMrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAobnVtSXRlbXMgPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1saXN0IG9mICR7bnVtSXRlbXN9IGl0ZW1zXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE1haW4gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJtYWluXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1tYWluIHJlZ2lvbl1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBtZW51YmFyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWVudWJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImxpc3RcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vLypbQHJvbGU9J21lbnVpdGVtJ11cIiwgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXNJbk90aGVyTGlzdHMgPSBkb2N1bWVudC5ldmFsdWF0ZShcbiAgICAgICAgICAgICAgICAgICAgXCIuLy8qW0Byb2xlPSdtZW51YmFyJ10vLypbQHJvbGU9J21lbnVpdGVtJ118Li8vKltAcm9sZT0nbWVudSddLy8qW0Byb2xlPSdtZW51aXRlbSddXCIsXG4gICAgICAgICAgICAgICAgICAgIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBkZXNjZW5kYW50Q29udGFpbmVycyA9IGRvY3VtZW50LmV2YWx1YXRlKFwiLi8vKltAcm9sZT0nbWVudWl0ZW0nXS8qW0Byb2xlPSdtZW51J11cIiwgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGRlc2NlbmRhbnRDb250YWluZXJzMiA9IGRvY3VtZW50LmV2YWx1YXRlKFwiLi8vKltAcm9sZT0nbWVudWJhciddLy8qW0Byb2xlPSdtZW51aXRlbSddLypbQHJvbGU9J21lbnUnXXwuLy8qW0Byb2xlPSdtZW51J10vLypbQHJvbGU9J21lbnVpdGVtJ10vKltAcm9sZT0nbWVudSddXCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk1FTlVCQVJcIiwgY3Vyc29yLmlzRW5kVGFnKCk/XCIvXCI6XCJcIiwgY3Vyc29yLmdldE5vZGUoKSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGVzY2VuZGFudExpc3RJdGVtcywgZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cyk7Ly8sIGRlc2NlbmRhbnRDb250YWluZXJzLCBkZXNjZW5kYW50Q29udGFpbmVyczIpXG4gICAgICAgICAgICAgICAgbGV0IG51bUl0ZW1zID0gZGVzY2VuZGFudExpc3RJdGVtcy5zbmFwc2hvdExlbmd0aC1kZXNjZW5kYW50TGlzdEl0ZW1zSW5PdGhlckxpc3RzLnNuYXBzaG90TGVuZ3RoOy8vLWRlc2NlbmRhbnRDb250YWluZXJzLnNuYXBzaG90TGVuZ3RoK2Rlc2NlbmRhbnRDb250YWluZXJzMi5zbmFwc2hvdExlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobnVtSXRlbXMgPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1tZW51YmFyIHdpdGggJHtudW1JdGVtc30gaXRlbXNdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTmF2aWdhdGlvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcIm5hdmlnYXRpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm5hdmlnYXRpb24gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBSYWRpbyBncm91cCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJhZGlvZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbZ3JvdXBpbmcke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBSZWdpb24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJyZWdpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwicmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBSb3cgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJyb3dcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUm93aGVhZGVyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicm93aGVhZGVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICByZW5kZXJFbnRlclRhYmxlQ2VsbFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTZWFyY2ggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzZWFyY2hcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcInNlYXJjaCByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRhYmxlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1widGFibGVcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRhYmxlV2Fsa2VyID0gY3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgdGFibGVcbiAgICAgICAgICAgICAgICB3aGlsZSAodGFibGVXYWxrZXIuZ2V0Um9sZSgpICE9PSBcInRhYmxlXCIgJiYgdGFibGVXYWxrZXIucHJldmlvdXMoKCkgPT4gdHJ1ZSkpO1xuICAgICAgICAgICAgICAgIC8vIFNldCBhbiBlbmQgdG8gdGhlIHRhYmxlXG4gICAgICAgICAgICAgICAgbGV0IHRhYmxlTm9kZSA9IHRhYmxlV2Fsa2VyLmdldE5vZGUoKTtcbiAgICAgICAgICAgICAgICBsZXQgcm93cyA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGNvbHMgPSAwO1xuICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjayB0aGF0IHRoZSB0YWJsZSBoYXMgY29udGVudFxuICAgICAgICAgICAgICAgIGlmICh0YWJsZVdhbGtlci5nZXROb2RlKCkuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RSb3dDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGFibGVXYWxrZXIubmV4dCgoKSA9PiB0cnVlKSAmJiAhdGFibGVXYWxrZXIuZ2V0Tm9kZSgpLmlzU2FtZU5vZGUodGFibGVOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZSA9IHRhYmxlV2Fsa2VyLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZVdhbGtlci5pc1N0YXJ0VGFnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJyb3dcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3Jvd3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdFJvd0NvbXBsZXRlICYmIFtcImNlbGxcIiwgXCJyb3doZWFkZXJcIiwgXCJjb2x1bW5oZWFkZXJcIl0uaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB0YWJsZVdhbGtlci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzICs9IHBhcnNlSW50KGVsZW0uZ2V0QXR0cmlidXRlKFwiY29sc3BhblwiKSB8fCBcIjFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvbGUgPT09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJvd0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gYFt0YWJsZSB3aXRoICR7cm93c30gJHtyb3dzID09PSAxID8gXCJyb3dcIiA6IFwicm93c1wifSBhbmQgJHtjb2xzfSAke2NvbHMgPT09IDEgPyBcImNvbHVtblwiIDogXCJjb2x1bW5zXCJ9JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVG9vbGJhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRvb2xiYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfXRvb2xiYXJdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSFRNTCBFbGVtZW50IHJ1bGVzXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRExcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwibGlzdFwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudExpc3RJdGVtcyA9IGRvY3VtZW50LmV2YWx1YXRlKFwiLi8vZHRcIiwgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIGxldCBudW1JdGVtcyA9IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWRlZmluaXRpb24gbGlzdCBvZiAke251bUl0ZW1zfSB0ZXJtc11gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJGSUdDQVBUSU9OXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbY2FwdGlvbl1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNQVJLXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbaGlnaGxpZ2h0ZWRdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSW5saW5lIGZyYW1lICg8aWZyYW1lPilcbiAgICAvLyBPbmx5IGZpcmVzIGluIGl0ZW0gbW9kZSAod2hlcmUgaXQgcHJvZHVjZXMgdGhlIGNvbnRhaW5lci1lbnRlciBsYWJlbCBvbiB0aGUgcGFyZW50XG4gICAgLy8gYmxvY2sgc3RvcCkuIEluIHRhYl9mb2N1cyBtb2RlIHRoZSBpZnJhbWUgZWxlbWVudCBpdHNlbGYgaXMgdGhlIHN0b3AgYW5kIHRoZVxuICAgIC8vIElGUkFNRSBTUl9SVUxFIGluIGNvbW1vbi50cyBzdXBwbGllcyB0aGUgbGFiZWwgZGlyZWN0bHkg4oCUIG5vIGNvbnRhaW5lci1lbnRlciBuZWVkZWQuXG4gICAgLy8gV2hlbiByb2xlPVwibm9uZVwiIG9yIHJvbGU9XCJwcmVzZW50YXRpb25cIiBpcyBzZXQsIHNjcmVlbiByZWFkZXJzIHRyZWF0IHRoZSBmcmFtZVxuICAgIC8vIGFzIGEgZ2VuZXJpYyBncm91cGluZyDigJQgYW5ub3VuY2UgXCJncm91cGluZ1wiIGluc3RlYWQgb2YgXCJmcmFtZVwiLlxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIklGUkFNRVwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1ByZXNlbnRhdGlvbiA9IHJvbGUgPT09IFwibm9uZVwiIHx8IHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgLy8gQW4gdW50aXRsZWQgcHJlc2VudGF0aW9uYWwgaWZyYW1lIGhhcyBubyBtZWFuaW5nZnVsIGdyb3VwaW5nIGxhYmVsIHRvXG4gICAgICAgICAgICAgICAgLy8gYW5ub3VuY2Ug4oCUIHN1cHByZXNzIHRoZSBjb250YWluZXItZW50ZXIgZW50aXJlbHkuXG4gICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudGF0aW9uICYmICFjdXJzb3IuZ2V0TmFtZSgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGlzUHJlc2VudGF0aW9uID8gXCJncm91cGluZ1wiIDogXCJmcmFtZVwiO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke2xhYmVsfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBQcmVmb3JtYXR0ZWQgdGV4dCAoPHByZT4pXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiUFJFXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1wcmVmb3JtYXR0ZWQgdGV4dF1gXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE11bHRpcGxlIHJvbGVzIHJ1bGVzIC0gcGxhY2VkIGF0IHRoZSBib3R0b21cblxuICAgIC8vIEhlYWRpbmcgbW9kZSBydWxlcyAtIGlnbm9yZSBjb250YWluZXIgZWxlbWVudHMgaW4gaGVhZGluZyBtb2RlIChtdWx0aXBsZSByb2xlcylcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcbiAgICAgICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImZpZ3VyZVwiLCBcImZvcm1cIiwgXCJncm91cFwiLCBcInJlZ2lvblwiLCBcbiAgICAgICAgICAgICAgICBcInJvd1wiLCBcInJvd2hlYWRlclwiLCBcInNlYXJjaFwiLCBcInRvb2xiYXJcIiwgXCJsaXN0XCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pXG5dO1xuIiwiaW1wb3J0IHsgU1JSZW5kZXJlclJ1bGUgfSBmcm9tIFwiLi4vU1JSZW5kZXJlclJ1bGVcIjtcbmltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4uL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBxdW90ZU5hbWVQYWRBZnRlciwgZ2V0Um9sZURlc2NyaXB0aW9uIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5cbmV4cG9ydCBsZXQgUlVMRVM6IFNSUmVuZGVyZXJSdWxlW10gPSBbXG4gICAgLy8gU2luZ2xlIHJvbGUgcnVsZXMgLSBhbHBoYWJldGljYWxseSBzb3J0ZWRcbiAgICBcbiAgICAvLyBBcnRpY2xlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImFydGljbGVcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJhbm5lciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJhbm5lclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImJhbm5lciByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJsb2NrcXVvdGUgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJibG9ja3F1b3RlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltvdXQgb2YgYmxvY2txdW90ZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDYXB0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2FwdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGNhcHRpb25dXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29tcGxlbWVudGFyeSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJjb21wbGVtZW50YXJ5IHJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFtvdXQgb2YgJHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29udGVudGluZm8gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjb250ZW50aW5mb1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImNvbnRlbnQgaW5mbyByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEZpZ3VyZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImZpZ3VyZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGZpZ3VyZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBGb3JtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZm9ybVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcImZvcm1jb250cm9sXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW291dCBvZiBzZWN0aW9uXVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiBmb3JtXWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEdyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIDxkZXRhaWxzPiB1c2VzIHRoZSBncm91cCByb2xlIGJ1dCBoYXMgaXRzIG93biBkaXNjbG9zdXJlIHdpZGdldCBzZW1hbnRpY3M7XG4gICAgICAgICAgICAgICAgLy8gU1JzIGRvIG5vdCBhbm5vdW5jZSBcIm91dCBvZiBncm91cGluZ1wiIHdoZW4gbGVhdmluZyBhIGRldGFpbHMgZWxlbWVudC5cbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkRFVEFJTFNcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcImNvbWJvYm94XCJdLCBbXCJzZWxlY3RcIl0pPy5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJTRUxFQ1RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiW291dCBvZiBncm91cGluZ11cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImxpc3RcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vL2xpIHwgLi8vKltAcm9sZT0nbGlzdGl0ZW0nXVwiLCBub2RlLCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cyA9IGRvY3VtZW50LmV2YWx1YXRlKFxuICAgICAgICAgICAgICAgICAgICBcIi4vL3VsLy9saXwuLy91bC8vKltAcm9sZT0nbGlzdGl0ZW0nXXwuLy9vbC8vbGl8Li8vb2wvLypbQHJvbGU9J2xpc3RpdGVtJ118Li8vKltAcm9sZT0nbGlzdCddLy9saXwuLy8qW0Byb2xlPSdsaXN0J10vLypbQHJvbGU9J2xpc3RpdGVtJ11cIixcbiAgICAgICAgICAgICAgICAgICAgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIGxldCBudW1JdGVtcyA9IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGgtZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cy5zbmFwc2hvdExlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobnVtSXRlbXMgPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1vdXQgb2YgbGlzdF1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYWluIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWFpblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm1haW4gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBtZW51YmFyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWVudWJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImxpc3RcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIG1lbnViYXJdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBOYXZpZ2F0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibmF2aWdhdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm5hdmlnYXRpb24gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyByYWRpb2dyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicmFkaW9ncm91cFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGdyb3VwaW5nXVwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFJlZ2lvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJlZ2lvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwicmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTZWFyY2ggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzZWFyY2hcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzZWFyY2ggcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWJsZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRhYmxlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltvdXQgb2YgdGFibGVdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVG9vbGJhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRvb2xiYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIHRvb2xiYXJdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBIVE1MIEVsZW1lbnQgcnVsZXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJBQkJSXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpID8gXG4gICAgICAgICAgICAgICAgYFske2N1cnNvci5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFwidGl0bGVcIil9XWAgOiBudWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkRMXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgZGVmaW5pdGlvbiBsaXN0XWBcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRklHQ0FQVElPTlwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIGNhcHRpb25dYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNQVJLXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgaGlnaGxpZ2h0ZWRdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBJbmxpbmUgZnJhbWUgKDxpZnJhbWU+KVxuICAgIC8vIFdoZW4gcm9sZT1cIm5vbmVcIiBvciByb2xlPVwicHJlc2VudGF0aW9uXCIgaXMgc2V0LCBzY3JlZW4gcmVhZGVycyB0cmVhdCB0aGUgZnJhbWVcbiAgICAvLyBhcyBhIGdlbmVyaWMgZ3JvdXBpbmcg4oCUIGFubm91bmNlIFwib3V0IG9mIGdyb3VwaW5nXCIgaW5zdGVhZCBvZiBcIm91dCBvZiBmcmFtZVwiLlxuICAgIC8vIEV4Y2VwdGlvbjogYW4gdW50aXRsZWQgcHJlc2VudGF0aW9uYWwgaWZyYW1lIHByb2R1Y2VzIG5vIGNvbnRhaW5lci1lbnRlciBsYWJlbCwgc29cbiAgICAvLyB0aGUgbWF0Y2hpbmcgY29udGFpbmVyLWV4aXQgbXVzdCBhbHNvIGJlIHN1cHByZXNzZWQgdG8gYXZvaWQgYSBzdHJheSBcIltvdXQgb2YgZ3JvdXBpbmddXCIuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiSUZSQU1FXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZSA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUHJlc2VudGF0aW9uID0gcm9sZSA9PT0gXCJub25lXCIgfHwgcm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIjtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50YXRpb24gJiYgIWN1cnNvci5nZXROYW1lKCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1ByZXNlbnRhdGlvbiA/IGBbb3V0IG9mIGdyb3VwaW5nXWAgOiBgW291dCBvZiBmcmFtZV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBQcmVmb3JtYXR0ZWQgdGV4dCAoPHByZT4pXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiUFJFXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgcHJlZm9ybWF0dGVkIHRleHRdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNdWx0aXBsZSByb2xlcyBydWxlcyAtIHBsYWNlZCBhdCB0aGUgYm90dG9tXG4gICAgXG4gICAgLy8gUmVnaW9uIG1vZGUgcnVsZXMgLSBpZ25vcmUgY29udGFpbmVyIGVsZW1lbnRzIGluIHJlZ2lvbiBhbmQgaGVhZGluZyBtb2RlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImdyb3VwXCIsIFwiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcbiAgICAgICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsIFwiZmlndXJlXCIsIFwiZm9ybVwiLCBcImxpc3RcIiwgXCJyZWdpb25cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcbiAgICAgICAgICAgICAgICBcInNlYXJjaFwiLCBcInRhYmxlXCIsIFwidG9vbGJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wicmVnaW9uXCIsIFwiaGVhZGluZ1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXTtcbiIsImltcG9ydCB7IFJVTEVTIGFzIFNSUnVsZXMgfSBmcm9tIFwiLi9jb21tb25cIjtcbmltcG9ydCB7IFJVTEVTIGFzIENvbnRhaW5lckVudGVyUnVsZXMgfSBmcm9tIFwiLi9jb250YWluZXJfZW50ZXJcIjtcbmltcG9ydCB7IFJVTEVTIGFzIENvbnRhaW5lckV4aXRSdWxlcyB9IGZyb20gXCIuL2NvbnRhaW50ZXJfZXhpdFwiO1xuZXhwb3J0IGxldCBTUl9SVUxFUyA9IFNSUnVsZXM7XG5leHBvcnQgbGV0IENPTlRBSU5FUl9FTlRFUl9SVUxFUyA9IENvbnRhaW5lckVudGVyUnVsZXM7XG5leHBvcnQgbGV0IENPTlRBSU5FUl9FWElUX1JVTEVTID0gQ29udGFpbmVyRXhpdFJ1bGVzO1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG50eXBlIEVsZW1DYWxjID0gKGVsZW06IEVsZW1lbnQpID0+IHN0cmluZztcbnR5cGUgTm9kZUNhbGMgPSAobm9kZTogTm9kZSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBBY2Nlc3NpYmxlTmFtZVJlc3VsdCA9IHtcbiAgICBuYW1lOiBzdHJpbmcsIFxuICAgIG5hbWVGcm9tOiBcImFyaWFMYWJlbFwiIHwgXCJ0aXRsZVwiIHwgXCJwbGFjZWhvbGRlclwiIHwgXCJsYWJlbFwiIFxuICAgICAgICB8IFwidmFsdWVcIiB8IFwiaW50ZXJuYWxcIiB8IFwiYWx0XCIgfCBcInRleHRcIiB8IFwibGVnZW5kXCIgXG4gICAgICAgIHwgXCJzdW1tYXJ5XCIgfCBcImZpZ2NhcHRpb25cIiB8IFwiY2FwdGlvblwiXG4gICAgICAgIHwgXCJzaGFkb3dcIiB8IFwic2xvdFwiIHwgXCJzaGFkb3ctaG9zdFwiIHwgXCJjb250ZW50LXNsb3RcIlxuICAgICAgICB8IFwiY29udGVudFwiXG4gICAgICAgIHwgXCJzdmdsaW5rVGl0bGVcIiB8IFwic3ZnVGl0bGVcIiB8IFwic3ZnVGV4dFwiIHwgXCJzdmdEZXNjXCJcbiAgICAgICAgfCBcImFyaWEtZGVzY3JpcHRpb25cIlxuICAgICAgICB8IHN0cmluZyAvLyBjc3MtKlxufVxuZXhwb3J0IGNsYXNzIEFjY05hbWVVdGlsIHtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgYWNjZXNzaWJsZSBuYW1lIGZvciBhbiBTVkcgZWxlbWVudCBhY2NvcmRpbmcgdG8gVzNDIHNwZWNpZmljYXRpb25cbiAgICAgKiBGb2xsb3dpbmcgdGhlIEFjY2Vzc2libGUgTmFtZSBhbmQgRGVzY3JpcHRpb24gQ29tcHV0YXRpb24gMS4xIGFsZ29yaXRobVxuICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9hY2NuYW1lLTEuMS9cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZWxlbSBUaGUgU1ZHIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyBUaGUgYWNjZXNzaWJsZSBuYW1lIHJlc3VsdCBvciBudWxsIGlmIG5vIGFjY2Vzc2libGUgbmFtZSBpcyBmb3VuZFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU1ZHRWxlbWVudFczQyhlbGVtOiBFbGVtZW50KTogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3N2ZycpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogQ2hlY2sgZm9yIGFyaWEtbGFiZWxsZWRieSAoYWxyZWFkeSBoYW5kbGVkIGJ5IG1haW4gY29tcHV0ZUFjY2Vzc2libGVOYW1lIGZ1bmN0aW9uKVxuICAgICAgICAvLyBTdGVwIDI6IENoZWNrIGZvciBhcmlhLWxhYmVsIChhbHJlYWR5IGhhbmRsZWQgYnkgbWFpbiBjb21wdXRlQWNjZXNzaWJsZU5hbWUgZnVuY3Rpb24pXG5cbiAgICAgICAgLy8gU3RlcCAzOiBDaGVjayBmb3IgdGl0bGUgZWxlbWVudFxuICAgICAgICBjb25zdCBzdmdUaXRsZXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiB0aXRsZVwiKTtcbiAgICAgICAgaWYgKHN2Z1RpdGxlcyAmJiBzdmdUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgc3ZnVGl0bGVzLmZvckVhY2goc3ZnVGl0bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdmdUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnVGl0bGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHN2Z1RpdGxlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHN2Z1RpdGxlLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gdGl0bGUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IFwibmFtZVwiOiB0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z1RpdGxlXCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNDogQ2hlY2sgZm9yIHRleHQgY29udGVudCBpbiBTVkcgdGV4dCBlbGVtZW50c1xuICAgICAgICBsZXQgdGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICBjb25zdCB0ZXh0RWxlbWVudHMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0ZXh0LCB0ZXh0UGF0aCwgdHNwYW5cIik7XG4gICAgICAgIGlmICh0ZXh0RWxlbWVudHMgJiYgdGV4dEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRleHRFbGVtZW50cy5mb3JFYWNoKHRleHRFbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHRleHRFbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbCh0ZXh0RWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRleHRFbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudCArPSBcIiBcIiArIGNvbnRlbnQudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHRDb250ZW50LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHRDb250ZW50LnRyaW0oKSksIFwibmFtZUZyb21cIjogXCJzdmdUZXh0XCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNTogQ2hlY2sgZm9yIHhsaW5rOnRpdGxlIGF0dHJpYnV0ZSBvbiBsaW5rcyB3aXRoaW4gU1ZHXG4gICAgICAgIGNvbnN0IGxpbmtzID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGxpbmtzW2ldO1xuICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChsaW5rKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChsaW5rKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhsaW5rVGl0bGUgPSBsaW5rLmdldEF0dHJpYnV0ZShcInhsaW5rOnRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIGlmICh4bGlua1RpdGxlICYmIHhsaW5rVGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHhsaW5rVGl0bGUpLCBcIm5hbWVGcm9tXCI6IFwic3ZnbGlua1RpdGxlXCIgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNjogQ2hlY2sgZm9yIGFyaWEtZGVzY3JpYmVkYnkgb3IgYXJpYS1kZXNjcmlwdGlvblxuICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSBBcmlhVXRpbC5nZXRBcmlhRGVzY3JpcHRpb24oZWxlbSk7XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGRlc2NyaXB0aW9uKSwgXCJuYW1lRnJvbVwiOiBcImFyaWEtZGVzY3JpcHRpb25cIiB9O1xuXG4gICAgICAgIC8vIFN0ZXAgNzogQ2hlY2sgZm9yIGRlc2MgZWxlbWVudFxuICAgICAgICBjb25zdCBkZXNjRWxlbWVudHMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiBkZXNjXCIpO1xuICAgICAgICBpZiAoZGVzY0VsZW1lbnRzICYmIGRlc2NFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgZGVzY1RleHQgPSBcIlwiO1xuICAgICAgICAgICAgZGVzY0VsZW1lbnRzLmZvckVhY2goZGVzY0VsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZGVzY0VsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGRlc2NFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY0VsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2MudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NUZXh0ICs9IFwiIFwiICsgZGVzYy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZGVzY1RleHQudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICByZXR1cm4geyBcIm5hbWVcIjogZGVzY1RleHQudHJpbSgpLCBcIm5hbWVGcm9tXCI6IFwic3ZnRGVzY1wiIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDg6IENoZWNrIGZvciB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmICh0aXRsZSAmJiB0aXRsZS50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IFwibmFtZVwiOiBDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0aXRsZSksIFwibmFtZUZyb21cIjogXCJ0aXRsZVwiIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBhY2Nlc3NpYmxlIG5hbWUgZm91bmRcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgYSBnaXZlbiBub2RlXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgbmFtZV9wYWlyID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAobmFtZV9wYWlyICE9PSB1bmRlZmluZWQpIHJldHVybiBuYW1lX3BhaXI7XG5cbiAgICAgICAgLy8gMS4gbmFtZSBmcm9tIGF1dGhvciwgb3IgZWxlbWVudHMgd2l0aG91dCBhIHJvbGUgYnV0IHdpdGggYXJpYS1sYWJlbGxlZGJ5IG9yIGFyaWEtbGFiZWwgXG4gICAgICAgIC8vICAgZ2V0IGFyaWEgbGFiZWwgZXZlbiBmb3IgdGhlIHJvbGUgd2hlcmUgdGhlIG5hbWUgaXMgcHJvaGliaXRlZCBvciBpcyAncHJlc2VudGF0aW9uJyBvciAnbm9uZSdcbiAgICAgICAgbGV0IGFjY05hbWUgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlbSk7XG4gICAgICAgIGlmIChhY2NOYW1lICYmIGFjY05hbWUudHJpbSgpICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhY2NOYW1lKSwgXCJuYW1lRnJvbVwiOiBcImFyaWFMYWJlbFwifSk7XG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGFjY05hbWUpLCBcIm5hbWVGcm9tXCI6IFwiYXJpYUxhYmVsXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gYWNjZXNzaWJsZSBuYW1lIG1hcHBpbmcgZm9yIG5hdGl2ZSBodG1sIGVsZW1lbnRzXG4gICAgICAgIG5hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvck5hdGl2ZUVsZW1lbnQoZWxlbSk7XG4gICAgICAgIGlmIChuYW1lX3BhaXIpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIkVMRU1FTlRfQUNDRVNTQkxFX05BTUVcIiwgbmFtZV9wYWlyKTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lX3BhaXI7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIDMuIG5hbWUgZnJvbSBuYXRpdmUgb3IgYXJpYSBhdHRyaWJ1dGVcbiAgICAgICAgLyoqbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRnJvbUF0dHJpYnV0ZShlbGVtKTtcbiAgICAgICAgaWYgKG5hbWVfcGFpcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCBuYW1lX3BhaXIpO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWVfcGFpcjtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLy8gNC4gbmFtZSBmcm9tIGNvbnRlbnQgZm9yIGN1c3RvbSBlbGVtZW50cyB3aXRoIGEgcm9sZVxuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICBpZiAoQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKSB7XG4gICAgICAgICAgICBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ29udGVudChlbGVtKTtcbiAgICAgICAgICAgIGlmIChuYW1lX3BhaXIpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIG5hbWVfcGFpcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVfcGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIG5hbWUgZnJvbSB0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBcInRpdGxlXCJcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidGl0bGVcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHRpdGxlICYmIHRpdGxlLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGl0bGUgPSBDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0aXRsZSk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCB7XCJuYW1lXCI6dGl0bGUsIFwibmFtZUZyb21cIjogXCJ0aXRsZVwifSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0aXRsZSwgXCJuYW1lRnJvbVwiOiBcInRpdGxlXCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyA2LiBuYW1lIGZyb20gdGhlIGF0dHJpYnV0ZSBcInBsYWNlaG9sZGVyXCJcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBDb21tb25VdGlsLmlucHV0X3R5cGVfd2l0aF9wbGFjZWhvbGRlci5pbmNsdWRlcyhlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikpKSkpIHtcbiAgICAgICAgICAgIGxldCBwbGFjZWhvbGRlciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIik7XG4gICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIgJiYgcGxhY2Vob2xkZXIudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlciA9IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHtcIm5hbWVcIjpwbGFjZWhvbGRlciwgXCJuYW1lRnJvbVwiOiBcInBsYWNlaG9sZGVyXCJ9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnBsYWNlaG9sZGVyLCBcIm5hbWVGcm9tXCI6IFwicGxhY2Vob2xkZXJcIn07XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgbmF0aXZlIGVsZW1lbnRzXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JOYXRpdmVFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBsYWJlbGxhYmxlIGZpZWxkc1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldEZvcm1GaWVsZExhYmVsKGVsZW0pO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlucHV0IHR5cGVzOiBidXR0b24sIHJlc2V0LCBzdWJtaXQsIGltYWdlXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSkgeyBcbiAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmZvcm1fYnV0dG9uX3R5cGVzLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB0eXBlczogYnV0dG9uLCByZXNldCwgc3VibWl0XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGZvciB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodmFsdWUpLCBcIm5hbWVGcm9tXCI6IFwidmFsdWVcIn07XG5cbiAgICAgICAgICAgICAgICAvLyBpbnB1dCAnc3VibWl0JyBhbmQgJ3Jlc2V0JyBoYXZlIHZpc2libGUgZGVmYXVsdHMgc28gcGFzcyBpZiB0aGVyZSBpcyBubyBleHBsaWNpdCAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6dHlwZSwgXCJuYW1lRnJvbVwiOiBcImludGVybmFsXCJ9O1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHR5cGUgPSAnaW1hZ2UnXG4gICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHRob3VnaCBIVE1MIDUgc3BlYyBpbmRpY2F0ZXMgXCJUaGUgZWxlbWVudCdzIFt2YWx1ZV0gYXR0cmlidXRlIG11c3QgYmUgb21pdHRlZFwiLCBDaHJvbWUgdXNlcyB0aGUgdmFsdWUuXG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBhY2Nlc3NpYmxlIG5hbWUgZm9yIHRoZSBhbHQgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgY29uc3QgYWx0ID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChhbHQgJiYgYWx0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoYWx0KSwgXCJuYW1lRnJvbVwiOiBcImFsdFwifTs7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGUgdmlzaWJsZSBkZWZhdWx0IHRleHQgZm9yIHR5cGUgXCJpbWFnZVwiIGlzIFwiU3VibWl0XCIgc2FtZSB3aXRoIHRoZSB0eXBlIFwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAvL3JldHVybiB7XCJuYW1lXCI6ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLCBcIm5hbWVGcm9tXCI6IFwiaW50ZXJuYWxcIn07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBidXR0b25cbiAgICAgICAgLy8gbm90ZSBidXR0b24gbWF5IGhhdmUgYSB2YWx1ZSBhdHRyaWJ1dGUsIGJ1dCBpdCdzIG5vdCBhIHZpc2libGUgdGV4dFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IHVzZSB0aGUgYnV0dG9uIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJ0ZXh0XCJ9O1xuXG4gICAgICAgICAgICAvLyBmb3IgaW1hZ2UgYnV0dG9uOiBnZXQgdGhlIGZpcnN0IGltYWdlIGlmIGV4aXN0c1xuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuICAgICAgICAgICAgaWYgKGltYWdlICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChpbWFnZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwoaW1hZ2UpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoaW1hZ2UpOyBcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGZvciBhIGJ1dHRvbiB3aXRoIGEgc3ZnIGltYWdlXG4gICAgICAgICAgICBjb25zdCBzdmcgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xuICAgICAgICAgICAgaWYgKHN2ZyAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChzdmcpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoc3ZnKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaWVsZHNldFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZmllbGRzZXRcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkc2V0IGVsZW1lbnQncyBmaXJzdCBjaGlsZCBpcyBhIGxlZ2VuZCBlbGVtZW50LCB0aGVuIHVzZSB0aGUgc3VidHJlZSBvZiB0aGUgbGVnZW5kXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoZmlyc3QgJiYgZmlyc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2xlZ2VuZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBsZWdlbmQgY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGZpcnN0IGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJsZWdlbmRcIn07IFxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBvdXRwdXRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcIm91dHB1dFwiKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgYXNzb2NpYXRlZCBsYWJlbCBlbGVtZW50IGV4aXN0cywgdXNlIGNvbmNhdGVuYXRlZCBhY2Nlc3NpYmxlIG5hbWUocykgZnJvbSBsYWJlbGxlZCBlbGVtZW50cy5cbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImZvclwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsSURzICYmIGxhYmVsSURzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsYWJlbElEcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IGVsZW0ub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChsYWJlbElEc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlbSkgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGxhYmVsTm9kZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwobGFiZWxOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgKz0gXCIgXCIgKyBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocGFpci5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGxhYmVsKSwgXCJuYW1lRnJvbVwiOiBcImxhYmVsXCJ9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdW1tYXJ5XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdW1tYXJ5XCIpIHtcbiAgICAgICAgICAgIC8vIHVzZSBzdW1tYXJ5IGVsZW1lbnQgc3VidHJlZVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChlbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwibGVnZW5kXCJ9OyAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGV0YWlsc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZGV0YWlsc1wiKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoZmlyc3QgJiYgZmlyc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKSB7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IGFjY2Vzc2libGUgbmFtZSBmcm9tIHN1bW1hcnlcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGZpcnN0KTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChwYWlyLm5hbWUudHJpbSgpKSwgXCJuYW1lRnJvbVwiOiBcInN1bW1hcnlcIn07IFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gc3VtbWFyeSBlbGVtZW50IGFzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBkZXRhaWxzIGVsZW1lbnQsIFxuICAgICAgICAgICAgLy8gdGhlIHVzZXIgYWdlbnQgc2hvdWxkIHByb3ZpZGUgb25lIHdpdGggYSBzdWJ0cmVlIGNvbnRhaW5pbmcgYSBsb2NhbGl6ZWQgc3RyaW5nIG9mIHRoZSB3b3JkIFwiZGV0YWlsc1wiLlxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpcImRldGFpbHNcIiwgXCJuYW1lRnJvbVwiOiBcImludGVybmFsXCJ9OyAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlndXJlXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJmaWd1cmVcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZ3VyZSBlbGVtZW50IGhhcyBhIGZpZ2NhcHRpb24gYXMgYSBjaGlsZFxuICAgICAgICAgICAgbGV0IGNhcHRpb24gPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4oZWxlbSwgXCJmaWdjYXB0aW9uXCIsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChjYXB0aW9uICYmIGNhcHRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGZpZ2NhcHRpb24gY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNhcHRpb25bMF0gYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcImZpZ2NhcHRpb25cIn07ICBcbiAgICAgICAgICAgIH0gICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW1nIGVsZW1lbnRzOiB1c2UgYXR0cmlidXRlIFwiYWx0XCJcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImltZ1wiKSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWx0ID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhbHQpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXJlYSBlbGVtZW50czogdXNlIGF0dHJpYnV0ZSBcImFsdFwiXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJhcmVhXCIpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBhbHQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoYWx0ICYmIGFsdC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhbHQpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGFibGUgZWxlbWVudFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwidGFibGVcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZ3VyZSBlbGVtZW50IGhhcyBhIGNhcHRpb24gYXMgdGhlIGZpcnN0IGNoaWxkXG4gICAgICAgICAgICBsZXQgY2FwdGlvbkVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGNhcHRpb25FbGVtICYmIGNhcHRpb25FbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjYXB0aW9uJykge1xuICAgICAgICAgICAgICAgIC8vIGNhcHRpb24gY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCBjYXB0aW9uID0gKGNhcHRpb25FbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKGNhcHRpb24gJiYgY2FwdGlvbi50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoY2FwdGlvbiksIFwibmFtZUZyb21cIjogXCJjYXB0aW9uXCJ9OyBcbiAgICAgICAgICAgIH0gICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGEgZWxlbWVudFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYVwiKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCB1c2UgdGhlIGxpbmsgdGV4dFxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChlbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcInRleHRcIn07XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAvL2ZvciBpbWFnZSBsaW5rOiBnZXQgdGhlIGltYWdlIG9yIHN2ZyBpZiBleGlzdHNcbiAgICAgICAgICAgIGNvbnN0IGltYWdlcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+IGltZywgOnNjb3BlID4gc3ZnXCIpO1xuICAgICAgICAgICAgaWYgKGltYWdlcyAmJiBpbWFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpbWFnZXMuZm9yRWFjaChpbWFnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoaW1hZ2UpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGltYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoaW1hZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBcIiBcIiArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnRleHQudHJpbSgpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3B0Z3JvdXBcbiAgICAgICAgLy8gbGFiZWwgcGFydGljaXBhdGUgaW4gYWNjZXNzaWJsZSBuYW1lIGNhbGN1bGF0aW9uOiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNhdHQtbGFiZWxcbiAgICAgICAgLy8gVGhlIGxhYmVsIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZC4gSXRzIHZhbHVlIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBncm91cFxuICAgICAgICAvLyB0aGUgdmFsdWUgaXMgZGlzYWJsZWQgaW4gdGhlIGludGVyZmFjZVxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwib3B0Z3JvdXBcIiB8fCBub2RlTmFtZSA9PT0gXCJvcHRpb25cIiB8fCBub2RlTmFtZSA9PT0gXCJ0cmFja1wiKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwibGFiZWxcIik7XG4gICAgICAgICAgICBpZiAobGFiZWwgJiYgbGFiZWwudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN2Z1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTVkdFbGVtZW50VzNDKGVsZW0pO1xuICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgbmF0aXZlIGVsZW1lbnRzXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTVkdFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgLy8gMS4gYSBkaXJlY3QgY2hpbGQgb3IgZGVzY2VuZGFudCB0aXRsZSBlbGVtZW50IFxuICAgICAgICBjb25zdCBzdmdUaXRsZXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiB0aXRsZVwiKTtcbiAgICAgICAgaWYgKHN2Z1RpdGxlcyAmJiBzdmdUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgc3ZnVGl0bGVzLmZvckVhY2goc3ZnVGl0bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdmdUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnVGl0bGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHN2Z1RpdGxlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHN2Z1RpdGxlLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gdGl0bGUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z1RpdGxlXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4geGxpbms6dGl0bGUgYXR0cmlidXRlIG9uIGEgbGlua1xuICAgICAgICBsZXQgbGlua1RpdGxlID0gZWxlbS5xdWVyeVNlbGVjdG9yKFwiYVwiKTtcbiAgICAgICAgaWYgKGxpbmtUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQobGlua1RpdGxlKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChsaW5rVGl0bGUpKSB7XG4gICAgICAgICAgICBsZXQgbGluayA9IGxpbmtUaXRsZS5nZXRBdHRyaWJ1dGUoXCJ4bGluazp0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmIChsaW5rICYmIGxpbmsudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGxpbmspLCBcIm5hbWVGcm9tXCI6IFwic3ZnbGlua1RpdGxlXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqIDMuIGZvciB0ZXh0IGNvbnRhaW5lciBlbGVtZW50cywgdGhlIHRleHQgY29udGVudC4gXG4gICAgICAgICAqIG5vdGUgdGhlIFNWRyB0ZXh0IGNvbnRlbnQgZWxlbWVudHMgYXJlOiDigJh0ZXh04oCZLCDigJh0ZXh0UGF0aOKAmSBhbmQg4oCYdHNwYW7igJkuXG4gICAgICAgICAqICBzdmcgZWxlbWVudCBjYW4gYmUgbmVzdGVkLiBPbmUgb2YgdGhlIHB1cnBvc2VzIGlzIHRvIHRvIGdyb3VwIFNWRyBzaGFwZXMgdG9nZXRoZXIgYXMgYSBjb2xsZWN0aW9uIGZvciByZXNwb25zaXZlIGRlc2lnbi5cbiAgICAgICAgICogXG4gICAgICAgICAqIHNlbGVjdCB0ZXh0IGNvbnRlbnQgZXhjbHVkZWQgdGhlIHRleHQgZnJvbSB0aGUgbmVzdGVkIHN2ZyBlbGVtZW50cyBhbmQgdGhlaXIgY2hpbGRyZW4gXG4gICAgICAgICAqLyBcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiAqXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdzdmcnICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IHZhbHVlO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwic3ZnVGV4dFwifTsgXG5cbiAgICAgICAgLy8gNC4gZnJvbSBhcmlhLWRlc2NyaWJlZGJ5IG9yIGFyaWEtZGVzY3JpcHRpb24gXG4gICAgICAgIGxldCBkZXNjYnkgPSBBcmlhVXRpbC5nZXRBcmlhRGVzY3JpcHRpb24oZWxlbSk7XG4gICAgICAgIGlmIChkZXNjYnkgJiYgZGVzY2J5LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChkZXNjYnkpLCBcIm5hbWVGcm9tXCI6IFwiYXJpYS1kZXNjcmlwdGlvblwifTtcblxuICAgICAgICAvLyA1LiBhIGRpcmVjdCBjaGlsZCBvciBkZXNjZW5kYW50IGRlc2MgZWxlbWVudFxuICAgICAgICBsZXQgZGVzY0VsZW1zID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlID4gZGVzY1wiKTtcbiAgICAgICAgaWYgKGRlc2NFbGVtcyAmJiBkZXNjRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgZGVzY0VsZW1zLmZvckVhY2goZGVzY0VsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZXNjRWxlbSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZGVzY0VsZW0pICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGRlc2NFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY0VsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2MudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gZGVzYy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z0Rlc2NcIn07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBjdXN0b20gZWxlbWVudHMgbWFya2VkIHdpdGggYXJpYVxuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRnJvbUNvbnRlbnQoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgLyoqIGZvciBhY2MgbmFtZSBmcm9tIGNvbnRlbnQsIHRoZSBjb250ZW50IGZyb20gQ1NTIHBzZXVkby1lbGVtZW50cyBcbiAgICAgICAgICogIDpiZWZvcmUgYW5kIDphZnRlciBwc2V1ZG8gZWxlbWVudHMgW0NTUzJdIGNhbiBwcm92aWRlIHRleHR1YWwgY29udGVudCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgY29udGVudCBtb2RlbC5cbiAgICAgICAgICogRm9yIDpiZWZvcmUgb3IgOmFmdGVyIHBzZXVkbyBlbGVtZW50cywgdXNlciBhZ2VudHMgbXVzdCBwcmVwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgYSBzcGFjZSwgXG4gICAgICAgICAqICAgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JDU1NQc2V1ZG9FbGVtZW50KGVsZW0sIFwiYmVmb3JlXCIpO1xuICAgICAgICBpZiAocGFpciAhPT0gbnVsbCAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG5cbiAgICAgICAgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvckNTU1BzZXVkb0VsZW1lbnQoZWxlbSwgXCJhZnRlclwiKTtcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBwYWlyO1xuXG4gICAgICAgIC8vICBzaGFkb3cgaG9zdFxuICAgICAgICBpZiAoZWxlbS5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU2hhZG93SG9zdChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwic2hhZG93XCJ9OztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gc2xvdCBlbGVtZW50XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzbG90XCIpIHtcbiAgICAgICAgICAgIHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTbG90RWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwic2xvdFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG90aGVyd2lzZTogZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBlbGVtZW50XG4gICAgICAgIHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ2hpbGRyZW4oZWxlbSk7XG4gICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOiBwYWlyLm5hbWUsIFwibmFtZUZyb21cIjogXCJjb250ZW50XCJ9O1xuXG4gICAgICAgIC8vIG5vIGFjY2Vzc2libGUgbmFtZSBleGlzdHNcbiAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZnJvbSBDU1MgZ2VuZXJhdGVkIGNvbnRlbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvckNTU1BzZXVkb0VsZW1lbnQoZWxlbTogRWxlbWVudCwgdHlwZTpzdHJpbmcpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29udGVudEVsZW0gPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLHR5cGUpO1xuICAgICAgICBpZiAoY29udGVudEVsZW0pIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gY29udGVudEVsZW0uY29udGVudDtcbiAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQgIT09IFwibm9uZVwiICYmIGNvbnRlbnQgIT09IFwibm9cIiAmJiBjb250ZW50ICE9PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOiBDb21tb25VdGlsLnRydW5jYXRlVGV4dChjb250ZW50KSwgXCJuYW1lRnJvbVwiOiBcImNzcy1cIit0eXBlfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBTTE9UIGVsZW1lbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvclNoYWRvd0hvc3QoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBlbGVtLnNoYWRvd1Jvb3Q7XG4gICAgICAgIGlmIChzaGFkb3dSb290KSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKTsgICBcbiAgICAgICAgICAgIC8vIGNoZWNrIHRleHQgZnJvbSBhbGwgdGhlIGNoaWxkcmVuIGVsZW1lbnRzXG4gICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogQ29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJzaGFkb3ctaG9zdFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBTTE9UIGVsZW1lbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvclNsb3RFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgLy9pZiBubyBhc3NpZ25lZE5vZGUsIGNoZWNrIGl0cyBvd24gdGV4dCBcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICBpZiAoIShlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpIHx8IChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgdGV4dCArPSBcIiBcIiArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgIH0gZWxzZSB7ICAgIFxuICAgICAgICAgICAgLy8gY2hlY2sgdGV4dCBmcm9tIGFsbCBhc3NpZ25lZCBub2Rlc1xuICAgICAgICAgICAgZm9yIChjb25zdCBzbG90Q2hpbGQgb2YgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShzbG90Q2hpbGQgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudC1zbG90XCJ9O1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZnJvbSBjaGlsZHJlbiBjb250ZW50XG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ2hpbGRyZW4oZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG5cbiAgICAgICAgLy9sZXQgd2Fsa0NoaWxkID0gZWxlbS5maXJzdENoaWxkO1xuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW0pO1xuICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBjaGlsZHJlbnMgb2YgdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSB0ZXh0XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGVsZW0gJiYgbncubm9kZSAhPT0gZWxlbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykgY29udGludWU7XG4gICAgICAgIC8vd2hpbGUgKHdhbGtDaGlsZCkgeyBcbiAgICAgICAgICAgIGNvbnN0IHdhbGtDaGlsZCA9IG53Lm5vZGU7IFxuICAgICAgICAgICAgaWYgKHdhbGtDaGlsZC5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgdGV4dCBub2RlLCBnZXQgdGhlIHBhcmVudG5vZGUgdG8gY2hlY2sgdmlzaWJpbGl0eVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHdhbGtDaGlsZC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocGFyZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChwYXJlbnQpICYmIHdhbGtDaGlsZC5ub2RlVmFsdWUgJiYgd2Fsa0NoaWxkLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgd2Fsa0NoaWxkLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdhbGtDaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQod2Fsa0NoaWxkIGFzIEhUTUxFbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbCh3YWxrQ2hpbGQgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZSh3YWxrQ2hpbGQgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyBwYWlyLm5hbWUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2tpcCBjaGlsZHJlbiBpZiB0aGlzIGVsZW1lbnQgb25seSBoYXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBpZiBhY2Nlc3NpYmxlIG5hbWUgY2FuIGJlIGlnbm9yZWQgZm9yIGltYWdlIG9yIHN2Z1xuICAgIHB1YmxpYyBzdGF0aWMgaXNBY2Nlc3NpYmxlTmFtZUlnbm9yYWJsZShlbGVtOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lICE9PSAnaW1nJyAmJiBub2RlTmFtZSAhPT0gJ3N2ZycpIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXJlbnQgPSBlbGVtLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgaXMgYSB3aWRnZXQgYW5kIGhhcyBhbiBhcmlhIGxhYmVsLCB0aGVuIGltYWdlL3N2ZyBsYWJlbCBpcyBub3QgbmVjZXNzYXJ5XG4gICAgICAgICAgICBpZiAoKEFyaWFVdGlsLmlzV2lkZ2V0KHBhcmVudCkgfHwgQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShwYXJlbnQpKSAmJiBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0gXG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zLCBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50IH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4vQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBBcmlhVXRpbCB7XG5cbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRhZ3Mgd2hpY2ggaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIHNpbmNlIHdlIGhhdmUgcnVsZXMgdHJpZ2dlcmluZ1xuICAgIHB1YmxpYyBzdGF0aWMgbmF2TGlua0tleXdvcmRzID0gWydzdGFydCcsICduZXh0JywgJ3ByZXYnLCAncHJldmlvdXMnLCAnY29udGVudHMnLCAnaW5kZXgnXVxuXG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBydWxlIGlkcyBmb3IgdGhlIHJ1bGVzIHRoYXQgaGF2ZSB0byBjaGVjayBmb3IgaGlkZGVuIGNvbnRlbnQgcmVnYXJkbGVzcyBvZiB0aGUgQ2hlY2sgSGlkZGVuXG4gICAgLy8gQ29udGVudCBTZXR0aW5nLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUgZW5naW5lIGlzIGFjdHVhbGx5IGRldGVybWluZSB3aGljaCBlbGVtZW50cyB0byBtYXNzIHRvIHRoZSBydWxlcywgaXQgd2lsbCBhbHdheXNcbiAgICAvLyBwYXNzIHRoZXNlcyBydWxlcyBubyBtYXR0ZXIgd2hhdCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZyBpcy5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVzVGhhdEhhdmVUb0NoZWNrSGlkZGVuID0gWydSUFRfRWxlbV9VbmlxdWVJZCddXG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGVBdEluZGV4KGVsZSwgaW5kZXgpIHtcbiAgICAgICAgbGV0IGF0dHJOYW1lID0gZWxlLmF0dHJpYnV0ZXNbaW5kZXhdLm5hbWU7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2ludHJvc3RhdGVzXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzID0ge1xuICAgICAgICBcImFsZXJ0XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwiYXNzZXJ0aXZlXCIsXG4gICAgICAgICAgICBcImFyaWEtYXRvbWljXCI6IFwidHJ1ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29tYm9ib3hcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibGlzdGJveFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGlzdGJveFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibG9nXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwicG9saXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51YmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1ldGVyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBcIjEwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBcImZhbHNlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwcm9ncmVzc2JhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNjcm9sbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXBhcmF0b3JcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzbGlkZXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGluYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIGhvdyB0byBlbmNvZGUgbWluL21heCAob3Igbm93IGluIDEuMiAtIFwiaGFzIG5vIHZhbHVlXCIpXG4gICAgICAgICAgICAvL1wiYXJpYS12YWx1ZW5vd1wiOiBcIjBcIiBUT0RPOiBhdCByaXNrOiBtYXliZSBkZWxldGUgYWZ0ZXIgQVJJQSAxLjIgcmVhY2hlcyBwcm9wb3NlZCByZWNcbiAgICAgICAgICAgIC8vIFByb2JhYmx5IGp1c3QgZGVsZXRlIHNwaW5idXR0b24gZnJvbSB0aGlzIGxpc3QgY29tcGxldGVseSBhbmQgbGV0IHVzZXIgYWdlbnRzIGhhbmRsZSBcImRlZmF1bHRzXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdGF0dXNcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIixcbiAgICAgICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJ0cnVlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IFwiZmFsc2VcIlxuICAgICAgICB9LFxuICAgICAgICBcInRhYmxpc3RcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidG9vbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0cmVlXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2FyaWEtYXRvbWljXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlR2xvYmFsRGVmYXVsdHMgPSB7XG4gICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IFwibm9uZVwiLFxuICAgICAgICBcImFyaWEtYnVzeVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWN1cnJlbnRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZHJvcGVmZmVjdFwiOiBcIm5vbmVcIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWdyYWJiZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWludmFsaWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiBcIm9mZlwiLFxuICAgICAgICBcImFyaWEtbW9kYWxcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1wcmVzc2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IFwiZmFsc2VcIixcbiAgICAgICAgLy9cImFyaWEtcmVsZXZhbnRcIjogXCJhZGRpdGlvbnMgdGV4dFwiLCBUT0RPOiBhcmUgbXVsdGlwbGUgdmFsdWVzIHN1cHBvcnRlZD9cbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXNvcnRcIjogXCJub25lXCJcbiAgICB9XG5cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNodG1sLWF0dHJpYnV0ZS1zdGF0ZS1hbmQtcHJvcGVydHktbWFwcGluZ3NcbiAgICBwdWJsaWMgc3RhdGljIGFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzID0ge1xuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIFwiZm9ybVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1lbnVpdGVtXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIipcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJpbmRldGVybWluYXRlXCIpKSByZXR1cm4gXCJtaXhlZFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmllbGRzZXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm9wdGdyb3VwXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3B0aW9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiB7XG4gICAgICAgICAgICBcImRldGFpbHNcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkaWFsb2dcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjoge1xuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSkgcmV0dXJuIFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgYXJpYSBhdHRyaWJ1dGUgbmFtZSBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZW0pIHtcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZXMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUgZnJvbSBkb21cbiAgICAgKiBAcGFyYW0gZWxlICBlbGVtZW50XG4gICAgICogQHJldHVybnMgdXNlciBkZWZpbmVkIGh0bWwgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRIdG1sQXR0cmlidXRlcyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgaXNBcmlhID0gYXR0ck5hbWUuc3Vic3RyaW5nKDAsIDUpID09PSAnYXJpYS0nO1xuICAgICAgICAgICAgICAgIGlmICghaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlcy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgYXJpYSBhdHRyaWJ1dGUgbmFtZS12YWx1ZSBwYWlyIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBhcmlhIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pIHtcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gJycpIGF0dHJWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGlzQXJpYSA9IGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJztcbiAgICAgICAgICAgICAgICBpZiAoaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlcy5wdXNoKHsgbmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgaHRtbCBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEh0bWxBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FyaWEpXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzLnB1c2goeyBuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBpbXBsaWNpdCBhcmlhIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZSwgYW4gaW5wdXQgd2l0aCBjaGVja2VkIGlzIGVxdWl2YWxlbnQgdG8gYXJpYS1jaGVja2VkPVwidHJ1ZVwiXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhQXR0cmlidXRlKGVsZSwgYXR0cmlidXRlTmFtZSkge1xuICAgICAgICAvLyBJZiB0aGUgYXR0cmlidXRlIGlzIGRlZmluZWQsIGl0IHRha2VzIHByZWNlZGVuY2VcbiAgICAgICAgbGV0IHJldFZhbCA9IGVsZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgICAgaWYgKGVsZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgJiYgcmV0VmFsLnRyaW0oKSA9PT0gXCJcIikgeyAvL1wiXCIgaXMgdHJlYXRlZCBhcyBmYWxzZSwgc28gd2UgbmVlZCByZXR1cm4gaXQgYmVmb3JlIHRoZSBiZWxvdyBjaGVja1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGVuIGRldGVybWluZSBpbXBsaWNpdCB2YWx1ZXMgZnJvbSBvdGhlciBhdHRyaWJ1dGVzXG4gICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICBsZXQgdGFnID0gZWxlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5ncykge1xuICAgICAgICAgICAgICAgIGlmICh0YWcgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV1bdGFnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocmV0VmFsKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCIqXCIgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV1bXCIqXCJdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgcm9sZS1iYXNlZCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChyb2xlIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVSb2xlRGVmYXVsdHMgJiYgYXR0cmlidXRlTmFtZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZVJvbGVEZWZhdWx0c1tyb2xlXVthdHRyaWJ1dGVOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RpbGwgbm90IGRlZmluZWQ/IENoZWNrIGdsb2JhbCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBhdHRyaWJ1dGVOYW1lIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVHbG9iYWxEZWZhdWx0cykge1xuICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUdsb2JhbERlZmF1bHRzW2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpIHtcbiAgICAgICAgbGV0IGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykge1xuICAgICAgICAgICAgLy8gVXNlciBhZ2VudHMgU0hPVUxEIHRyZWF0IHN0YXRlIGFuZCBwcm9wZXJ0eSBhdHRyaWJ1dGVzIHdpdGggYSB2YWx1ZSBvZiBcIlwiIHRoZSBzYW1lIGFzIHRoZXkgdHJlYXQgYW4gYWJzZW50IGF0dHJpYnV0ZS5cbiAgICAgICAgICAgIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpICYmIGVsZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV0FJLUFSSUHigJlzIHJvbGUgYXR0cmlidXRlIG1heSBoYXZlIGEgbGlzdCBvZiB2YWx1ZXMsIGJ1dCBvbmx5IHRoZSBmaXJzdCB2YWxpZCBhbmQgc3VwcG9ydGVkIFdBSS1BUklBIHJvbGUgaXMgdXNlZFxuICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS1pbXBsZW1lbnRhdGlvbi8jbWFwcGluZ19yb2xlX3RhYmxlXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZyB0aGUgcmVzb2xlZCByb2xlIGZvciBhbiBlbGVtZW50LlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiBzdHJpbmcgLSByZXNvbHZlZCByb2xlIGZvciB0aGUgZWxlbWVudDpcbiAgICAgKiAgICAgICBleHBsaWNpdCByb2xlOiByZXNvbGVkIGZyb20gdGhlIGxpc3Qgb2YgdmFsdWVzXG4gICAgICogICAgICAgaW1wbGljaXQgcm9sZTogaWYgbm90IGV4cGxpY2l0ZWx5IHNwZWNpZmllZCwgb3Igbm9uZSBvZiB0aGUgc3BlY2lmaWVkIHJvbGUgdmFsdWVzIGlzIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50XG4gICAgICogICAgICAgbnVsbDogaWYgbm9uZSBvZiB0aGUgc3BlY2lmaWVkIHJvbGUgdmFsdWVzIGlzIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50LCBuZWl0aGVyIGltcGxpY2l0IHJvbGUgZXhpc3RzXG4gICAgICogICAgICAgXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZXNvbHZlZFJvbGUoZWxlbTogRWxlbWVudCwgY29uc2lkZXJJbXBsaWNpdFJvbGVzOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByb2xlID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiUlBUVVRJTF9FTEVNRU5UX1JFU09MVkVEX1JPTEVcIiwgbnVsbCk7XG4gICAgICAgIGlmIChyb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMoZWxlbSk7IFxuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShlbGVtKTtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkUm9sZXMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYVJvbGVzKGVsZW0sIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgIGxldCBjb250YWluc0dlbmVyaWMgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwICYmIGFsbG93ZWRSb2xlcyAmJiBhbGxvd2VkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRSb2xlcy5pbmNsdWRlcyhcImFueVwiKSB8fCBhbGxvd2VkUm9sZXMuaW5jbHVkZXMocm9sZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFJvbGVzLmluY2x1ZGVzKFwiYW55XCIpICYmIHJvbGVzW2ldID09PSAnZ2VuZXJpYycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc0dlbmVyaWMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlID0gcm9sZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCByb2xlID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaXMgZm9jdXNhYmxlLCB0aGVuIHByZXNlbnRhdGlvbiByb2xlcyBhcmUgdG8gYmUgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzZXQgcnVsZSB0byBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNHZW5lcmljKSByb2xlID0gJ2dlbmVyaWMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gbnVsbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgcm9sZSA9IGltcGxpY2l0Um9sZSAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCA/IGltcGxpY2l0Um9sZVswXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlJQVFVUSUxfRUxFTUVOVF9SRVNPTFZFRF9ST0xFXCIsIHJvbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb2xlICE9PSB1bmRlZmluZWQgPyByb2xlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXRyaWV2aW5nIHVzZXIgZGVmaW5lZCBlbGVtZW50J3Mgcm9sZXMgZnJvbSBkb20uXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByb2xlcyAtIGxpc3Qgb2YgdXNlciBkZWZpbmVkIHJvbGVzIGluIHRoZSBlbGVtZW50IHJvbGUgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZFJvbGVzKGVsZTogRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldFJvbGVzKGVsZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgZWxlbWVudCdzIHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBmaW5kcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcm9sZXMgLSBsaXN0IG9mIGF0dHJpYnV0ZSByb2xlcyBhbmQgaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJvbGVzKGVsZTogRWxlbWVudCwgY29uc2lkZXJJbXBsaWNpdFJvbGVzOiBib29sZWFuKTogc3RyaW5nW10ge1xuICAgICAgICBsZXQgcm9sZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChlbGUgJiYgZWxlLmhhc0F0dHJpYnV0ZSAmJiBlbGUuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJSb2xlcyA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcm9sZXMucHVzaChhdHRyUm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdFJvbGUgIT09IG51bGwgJiYgaW1wbGljaXRSb2xlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvL2FkZCBpbXBsaWNpdCByb2xlcyB0byB0aGUgYXR0cmlidXRlcyByb2xlcy5cbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoaW1wbGljaXRSb2xlLCByb2xlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbWVudFxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGUgaW1wbGljaXQgcm9sZSBvciBbXSBpZiBkb2Vzbid0IGV4aXN0XG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEltcGxpY2l0Um9sZShlbGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICghZWxlIHx8IGVsZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBpbXBsaWNpdFJvbGVzOiBzdHJpbmdbXSA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkoZWxlKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmluY2x1ZGVzKFwiZ2VuZXJpY1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgJ2dlbmVyaWMnIHJvbGUgaXMgb25seSBhbGxvd2VkIGlmIGEgdmFsaWQgYXJpYSBhdHRyaWJ1dGUgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9tQXJpYUF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21BcmlhQXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbJ2dlbmVyaWMnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4ucmVxUHJvcHMgJiYgcGF0dGVybi5yZXFQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHBhdHRlcm4ucmVxUHJvcHMsIHJvbGVBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZClcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChBUklBRGVmaW5pdGlvbnMuZ2xvYmFsUHJvcGVydGllcywgcm9sZUF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcyAmJiBwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHBhdHRlcm4uZGVwcmVjYXRlZFByb3BzLCByb2xlQXR0cmlidXRlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlICdnZW5lcmljJyByb2xlIGlmIHJvbGVBdHRyaWJ1dGVzIGRvZXNuJ3QgY29udGFpbiBhbnkgb2YgZG9tQXJpYUF0dHJpYnV0ZXMgXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlQXR0cmlidXRlcy5sZW5ndGggPiAwICYmICFyb2xlQXR0cmlidXRlcy5zb21lKGF0dHIgPT4gZG9tQXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoYXR0cikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXQgPSBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoWydnZW5lcmljJ10sIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlLCBcIkFyaWFVdGlsX0ltcGxpY2l0Um9sZVwiLCBpbXBsaWNpdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1wbGljaXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZSwgXCJBcmlhVXRpbF9JbXBsaWNpdFJvbGVcIiwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZSwgXCJBcmlhVXRpbF9JbXBsaWNpdFJvbGVcIiwgW10pO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbXBsaWNpdFJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgb2YgdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlIC0gdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHByb3BlcnRpZXMgLSBsaXN0IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlLCBlbGUpIHtcbiAgICAgICAgaWYgKHJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSkge1xuICAgICAgICAgICAgbGV0IHJlcXVpcmVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yZXFQcm9wcztcbiAgICAgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2Ygc2VwYXJhdG9yXG4gICAgICAgICAgICBpZiAocm9sZS50b0xvd2VyQ2FzZSgpID09PSBcInNlcGFyYXRvclwiICYmIGVsZSAmJiBDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZSkpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiYXJpYS12YWx1ZW5vd1wiXSwgcmVxdWlyZWRBdHRyaWJ1dGVzIHx8IFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlZEF0dHJpYnV0ZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgaWYgYSBlbGVtZW50IGhhcyBnaXZlbiByb2xlLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlLlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byBmaW5kIGlmIGVsZW1lbnQgaGFzIHRoZXNlIHJvbGVzLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIHRoIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqXG4gICAgICogQ29uc2lkZXIgdG8gdXNlIGhhc1JvbGVJblNlbWFudGljcygpIGluc3RlYWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNSb2xlKGVsZSwgcm9sZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykgeyAgLy9Db25zaWRlciB0byB1c2UgaGFzUm9sZUluU2VtYW50aWNzKCkgaW5zdGVhZC5cbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vaWYgbm9uZSBvZiB0aGUgdGhlIGF0dHJpYnV0ZSByb2xlcyBtYXRjaGVkIHdpdGggZ2l2ZW4gcm9sZVxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIG1hdGNoZXMuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB3Um9sZXMgPSBbXTtcbiAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZSA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpbXBsaWNpdFJvbGUsIHdSb2xlcyk7XG4gICAgICAgICAgICAgICAgLy9pZiByb2xlIGlzIGFycmF5IGxvb3AgdGhydSBhbmQgc2VlIGlmIGFueSAgb2YgdGhlIGltcGxpY2l0IHJvbGUgcHJlc2VudCBpbiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCB3Um9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHdSb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gd1JvbGVzW2ldID09PSByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgcm9sZSwgaW5jbHVkaW5nIHRoZSBpbXBsaWVkIHJvbGUgaWYgcm9sZSBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlcGxhY2luZyB0aGUgaGFzUm9sZSBmdW5jdGlvblxuICAgICAqXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICogQHBhcm0ge2xpc3Qgb3Igc3RyaW5nfSByb2xlcyAtIExpc3Qgb3Igc2luZ2xlIHJvbGUgZm9yIHdoaWNoIHRvIGZpbmQgaWYgZWxlbWVudCBoYXMgdGhlc2Ugcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc1JvbGVJblNlbWFudGljcyhlbGUsIHJvbGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBsZXQgcm9sZVNwZWNpZmllZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gaW4gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVTcGVjaWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSA9PT0gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm9sZVNwZWNpZmllZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgaW1wbGljaXQgcm9sZXMgbWF0Y2hlcy5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICBsZXQgaW1wUm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgaWYgKGltcFJvbGVzICE9PSBudWxsICYmIGltcFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vaWYgcm9sZSBpcyBhcnJheSBsb29wIHRocnUgYW5kIHNlZSBpZiBhbnkgIG9mIHRoZSBpbXBsaWNpdCByb2xlIHByZXNlbnQgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IGltcFJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGltcFJvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgaW1wUm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gaW1wUm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBpZiBhIGVsZW1lbnQgaGFzIGdpdmVuIHJvbGUuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIHNwZWNpZmllZCByb2xlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNBbnlSb2xlKGVsZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZSAmJiBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICByZXRWYWwgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmICghcmV0VmFsICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgaW1wUm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBSb2xlcyAhPT0gbnVsbCAmJiBpbXBSb2xlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldFZhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc2VudGF0aW9uYWxFbGVtZW50KG5vZGUpIHtcbiAgICAgICAgLy8gRWxlbWVudHMgZXh0cmFjdGVkIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50I0lubGluZV90ZXh0X3NlbWFudGljcyxcbiAgICAgICAgLy8gaHR0cDovL2Rldi53My5vcmcvaHRtbDUvaHRtbC1hdXRob3IvI3RleHQtbGV2ZWwtc2VtYW50aWNzIGFuZCBodHRwczovL3dpa2kud2hhdHdnLm9yZy93aWtpL1ByZXNlbnRhdGlvbmFsX2VsZW1lbnRzX2FuZF9hdHRyaWJ1dGVzXG4gICAgICAgIGxldCBwcmVzZW50YXRpb25hbEVsZW1lbnRzID0gW1wiYWJiclwiLCBcImJcIiwgXCJiZGlcIiwgXCJiZG9cIiwgXCJiclwiLCBcImNpdGVcIiwgXCJjb2RlXCIsIFwiZGF0YVwiLCBcImRmblwiLFxuICAgICAgICAgICAgXCJlbVwiLCBcImlcIiwgXCJrYmRcIiwgXCJtYXJrXCIsIFwicVwiLCBcInJwXCIsIFwicnRcIiwgXCJydGNcIiwgXCJydWJ5XCIsIFwic1wiLFxuICAgICAgICAgICAgXCJzYW1wXCIsIFwic21hbGxcIiwgXCJzcGFuXCIsIFwic3Ryb25nXCIsIFwic3ViXCIsIFwic3VwXCIsIFwidGltZVwiLCBcInVcIixcbiAgICAgICAgICAgIFwidmFyXCIsIFwid2JyXCIsIFwiYVwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJiYXNlZm9udFwiLCBcImJpZ1wiLCBcImNlbnRlclwiLFxuICAgICAgICAgICAgXCJzdHJpa2VcIiwgXCJ0dFwiLCBcImZvbnRcIiwgXCJibGlua1wiLCBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIiwgXCJoNlwiLFxuICAgICAgICAgICAgXCJoclwiLCBcImJsb2NrcXVvdGVcIiwgXCJwXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHByZXNlbnRhdGlvbmFsRWxlbWVudHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGVsZW1lbnQgYW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSBUaGUgcm9sZSB0byBzZWFyY2ggZm9yIG9uIGFuIGVsZW1lbnQgdW5kZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGUoZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlTmFtZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50IGFuZCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge2FycmF5fSByb2xlcyAtIHRoZSByb2xlIG5hbWVzIHRvIHNlYXJjaCBmb3JcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGVzKGVsZW1lbnQsIHJvbGVOYW1lcykge1xuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgIXJvbGVOYW1lcyB8fCAhcm9sZU5hbWVzLmxlbmd0aCB8fCByb2xlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZSh3YWxrTm9kZSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcm9sZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVzLmluY2x1ZGVzKHJvbGUpIHx8XG4gICAgICAgICAgICAgICAgICAgIChyb2xlTmFtZXMuaW5jbHVkZXMoXCIqXCIpICYmICFbXCJwcmVzZW50YXRpb25cIiwgXCJub25lXCJdLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcm9sZXMgd2l0aCBnaXZlbiByb2xlIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHthcnJheX0gcm9sZVR5cGxlcyAtIHJvbGUgdHlwZXMsIHN1Y2ggYXMgJ3dpZGdldCcsICdzdHJ1Y3R1cmUnIGV0Yy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2FycmF5fSByb2xlcyAtIEEgcGFyZW50IG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXNXaXRoVHlwZXMoZWxlbWVudCwgdHlwZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhdHlwZXMgfHwgIXR5cGVzLmxlbmd0aCB8fCB0eXBlcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByb2xlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwicm9sZXNfd2l0aF9naXZlbl90eXBlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlcy5pbmNsdWRlcyh2YWx1ZS5yb2xlVHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIHJvbGVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJyb2xlc193aXRoX2dpdmVuX3R5cGVzXCIsIHJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSByb2xlcyB3aXRoIGdpdmVuIHJvbGUgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge2FycmF5fSByb2xlVHlwbGVzIC0gcm9sZSB0eXBlcywgc3VjaCBhcyAnd2lkZ2V0JywgJ3N0cnVjdHVyZScgZXRjLlxuICAgICAqXG4gICAgICogQHJldHVybiB7YXJyYXl9IHJvbGVzIC0gQSBwYXJlbnQgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1dpZGdldChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHdpZGdldCA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiaXNfZWxlbWVudF93aWRnZXRcIiwgbnVsbCk7XG4gICAgICAgIGlmICh3aWRnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7IFxuICAgICAgICAgICAgaWYgKHJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yb2xlVHlwZSA9PT0gJ3dpZGdldCcpXG4gICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJpc19lbGVtZW50X3dpZGdldFwiLCByZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2lkZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBpZiB0aGUgZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudC4gXG4gICAgICogSWYgYW4gYW5jZXN0b3Igb2YgYW4gZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgdGhlbiB0aGUgZWxlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYXMgb3duZWQgb3IgY29udHJvbGxlZC5cbiAgICAgKiBhbiBlbGVtZW50IGNhbiBiZSBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCB0aHJvdWdoIGFyaWEtb3ducyBvciBhcmlhLWNvbnRyb2xzXG4gICAgICogICB3aGVuIHRoZSBET00gaGllcmFyY2h5IGNhbm5vdCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcmVsYXRpb25zaGlwLlxuICAgICAqIGFyaWEtb3ducyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgY29udGV4dHVhbCByZWxhdGlvbnNoaXAgd2l0aCBhIG93bmluZyBwYXJlbnQgXG4gICAgICogYXJpYS1jb250cm9scyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYW4gZWxlbWVudCB3aXRoIHRoZSBjb250cm9sbGluZyBlbGVtZW50LlxuICAgICAqICBleGFtcGxlIGVsZW1lbnRzIHdpdGggcm9sZXM6IGNvbWJvYm94LCBzY3JvbGxiYXIsIHRhYiwgYnV0dG9uLCBsaXN0Ym94LCBtZW51LCBtZW51YmFyLCByYWRpb2dyb3VwLCB0cmVlLCB0cmVlZ3JpZFxuICAgICAqIFxuICAgICAqIHdoZW4gYW4gZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgaXRzIG5hdmlnYXRpb24gbWF5IGJlIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmVudCBcbiAgICAgKiAgdGhyb3VnaCBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRzIGF0dHJpYnV0ZSBvciByb3ZpbmcgdGFiaW5kZXhcbiAgICAgKiBcbiAgICAgKiBOb3RlIG5hdmlnYXRpb24gd2l0aCBuYXRpdmUgY29tYm9ib3ggKGlucHV0IHdpdGggYSBkYXRhbGlzdCkgaXMgaW4gbmF0aXZlIGZvY3VzIG5hdmlnYXRpb24sIG5vdCBjb25zaWRlcmVkIGhlcmUgICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGluc3BlY3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQoZWxlbWVudCA6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBsZXQgb3duZXJFbGVtczogRWxlbWVudFtdID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJBcmlhVXRpbF9OYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWRcIiwgbnVsbCk7XG4gICAgICAgIGlmIChvd25lckVsZW1zICE9PSBudWxsICYmIG93bmVyRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgb3duZXJFbGVtcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7XG4gICAgICAgIGlmICghcm9sZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKCFpZCB8fCBpZC50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHN+PScke2lkfSddLCAqW2FyaWEtb3duc349JyR7aWR9J11gKTtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY29udGFpbmVycyA9IFsnY29tYm9ib3gnLCAnc2Nyb2xsYmFyJywgJ2J1dHRvbicsICd0YWInLCAnbGlzdGJveCcsICdtZW51JywgJ21lbnViYXInLCAncmFkaW9ncm91cCcsICd0cmVlJywgJ3RyZWVncmlkJ107XG4gICAgICAgIGlmIChjb250YWluZXJzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICBpZiAob3duZXJFbGVtcyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBvd25lckVsZW1zID0gW107XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIG93bmVyRWxlbXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiQXJpYVV0aWxfTmF2aWdhdGlvbk93bmVkT3JDb250cm9sbGVkXCIsIG93bmVyRWxlbXMpOyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gICAgXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIG5vZGUgd2hpY2ggbWF0Y2hlcyB0aGUgcm9sZSBhbmQgaXMgYSBzaWJsaW5nIG9mIHRoZVxuICAgICAqIHByb3ZpZGVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGJ5IGRlZmF1bHQgd2lsbCBub3QgY29uc2lkZXIgQ2hlY2sgSGlkZGVuIFNldHRpbmcgYXQgYWxsLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldFNpYmxpbmdXaXRoUm9sZUhpZGRlblxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgc2libGluZyBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHNpYmxpbmcgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaWJsaW5nV2l0aFJvbGUoZWxlbWVudCwgcm9sZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbm9kZSB3aGljaCBtYXRjaGVzIHRoZSByb2xlIGFuZCBpcyBhIHNpYmxpbmcgb2YgdGhlXG4gICAgICogcHJvdmlkZWQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMgaW1wbGljaXQgcm9sZXMgZm9yIHRoZSBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgc2libGluZyBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0IC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBJbXBsaWNpdCByb2xlcyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IHdhbGtOb2RlIC0gQSBzaWJsaW5nIG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGU/KSB7XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGFyYXRpb25cbiAgICAgICAgbGV0IHdhbGtOb2RlID0gbnVsbDtcbiAgICAgICAgbGV0IGhhc1JvbGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGlmIGVsZW1lbnQgYW5kIHJvbGUgYXJlIGJvdGggcHJvdmlkZWRcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgcm9sZSkge1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIG5leHQgc2libGluZyBlbGVtZW50XG4gICAgICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyBvdmVyIHRoZSBuZXh0IHNpYmxpbmdzIHRvIGZpbmQgZWxlbWVudCB3aGljaCBtYXRjaGVzXG4gICAgICAgICAgICAvLyB0aGUgcHJvdmlkZWQgcm9sZS5cbiAgICAgICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCAmJiAhaGFzUm9sZSkge1xuXG4gICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIGhhcyB0aGUgcm9sZSB0aGF0IHdlIG5lZWQgdG8gY2hlY2sgZXhpc3RzXG4gICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBub3QgZm91bmQgYSBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgcm9sZSwgc3RhcnQgYSByZXZlcnNlIGxvb2sgdXBcbiAgICAgICAgICAgIGlmICghd2Fsa05vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBGZXRjaCB0aGUgcHJldmlvdXMgU2libGluZyBvZiB0aGlzIGVsZW1lbnRcbiAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgLy8gS2VlcCBsb29waW5nIG92ZXIgYWxsIHRoZSBwcmV2aW91cyBzaWJsaW5ncyB0byBzZWFyY2ggZm9yIGFuIGVsZW1lbnQgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyBtYXRjaGVzIHRoZSBwcm92aWRlZCByb2xlLlxuICAgICAgICAgICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCAmJiAhaGFzUm9sZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLnByZXZpb3VzU2libGluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSByb2xlIHRoYXQgd2UgbmVlZCB0byBjaGVjayBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaGFzUm9sZSA9IEFyaWFVdGlsLmhhc1JvbGUod2Fsa05vZGUsIHJvbGUsIGNvbnNpZGVySW1wbGljaXRSb2xlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYSBkZXNjZW5kYW50IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXREZXNjZW5kYW50V2l0aFJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gcGFyZW50IGVsZW1lbnQgZm9yIHdoaWNoIHdlIHdpbGwgYmUgY2hlY2tpbmcgZGVzY2VuZGFudHMgZm9yXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgZGVzY2VuZGFudCdzIGVsZW1lbnRzXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSByb2xlIHNwZWNpZmllZCAob25seSBvbmUpXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0RGVzY2VuZGFudFdpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGVOYW1lLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhIGRlc2NlbmRhbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9sZSwgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGRlc2NlbmRhbnQncyBlbGVtZW50c1xuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSByb2xlIHNwZWNpZmllZCAob25seSBvbmUpXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50ID0gbnVsbDtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHByb3ZpZGVkIGFuZCBjaGVjayBpZiB0aGUgcm9sZW5hbWUgcHJvdmlkZWQgZXhpc3RzXG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCAmJiBudy5ub2RlICE9IGVsZW1lbnQubmV4dFNpYmxpbmcpIHtcblxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMgPyBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mobncubm9kZSwgcm9sZU5hbWUpIDogQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCByb2xlTmFtZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudCA9IG53Lm5vZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzY2VuZGFudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCByb2xlcywgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmdbXX0gcm9sZU5hbWVzIC0gVGhlIHJvbGVzIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50J3MgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZVtdfSAtIGFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHJvbGVzIHNwZWNpZmllZFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxEZXNjZW5kYW50c1dpdGhSb2xlcyhlbGVtZW50LCByb2xlTmFtZXM6IHN0cmluZ1tdLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICBpZiAoIXJvbGVOYW1lcyB8fCByb2xlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IFtdO1xuXG4gICAgICAgIHJvbGVOYW1lcy5mb3JFYWNoKHJvbGVOYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBraWRzID0gQXJpYVV0aWwuZ2V0QWxsRGVzY2VuZGFudHNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpO1xuICAgICAgICAgICAgaWYgKGtpZHMgJiYga2lkcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzID0gZGVzY2VuZGFudHMuY29uY2F0KGtpZHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgQWxsIGRlc2NlbmRhbnQgZWxlbWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBkZXNjZW5kYW50cyBmb3JcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlTmFtZSAtIFRoZSByb2xlIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50J3MgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZVtdfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHJvbGUgc3BlY2lmaWVkXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbERlc2NlbmRhbnRzV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWU6IHN0cmluZywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IGRlc2NlbmRhbnRzID0gW107XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgZWxlbWVudCBwcm92aWRlZCBhbmQgY2hlY2sgaWYgdGhlIHJvbGVuYW1lIHByb3ZpZGVkIGV4aXN0c1xuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKG53Lm5vZGUsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChudy5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkaXJlY3QgY2hpbGRyZW4gaW4gQVQgdHJlZSB3aXRoIGEgcm9sZSAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlIHRoYXQgaGFzIGEgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREaXJlY3RBVENoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlcyA9IEFyaWFVdGlsLmdldFJlcXVpcmVkQ2hpbGRSb2xlcyhlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgbGV0IGRpcmVjdDogQXJyYXk8SFRNTEVsZW1lbnQ+ID0gW107XG4gICAgICAgIEFyaWFVdGlsLnJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdCk7XG4gICAgICAgIHJldHVybiBkaXJlY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVjdXJzaXZlbHkgYW55IGNoaWxkIHBhdGggdGlsbCBlaXRoZXIgbm8gY2hpbGQgb3IgYSBjaGlsZCB3aXRoIGEgcm9sZSBpcyBmb3VuZCAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdDogQXJyYXk8SFRNTEVsZW1lbnQ+KSB7XG4gICAgICAgIGxldCBjaGlsZHJlbjogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbiAhPT0gbnVsbCAmJiBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goZWxlbWVudC5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgXCJhcmlhLW93blwiIGF0dHJpYnV0ZSwgdGhlbiB0aGUgYXJpYS1vd25lZCBjaGlsZHJlbiBuZWVkIHRvIGJlIGluY2x1ZGVkIHRvb1xuICAgICAgICBsZXQgb3duZWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcbiAgICAgICAgaWYgKG93bmVkKSB7XG4gICAgICAgICAgICBsZXQgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgIGxldCBvd25lZElkcyA9IG93bmVkLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bmVkSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lZEVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQob3duZWRJZHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3duZWRFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG93bmVkRWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvL2lnbm9yZSBoaWRkZW4gYW5kIGludmlzaWJsZSBjaGlsZFxuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjaGlsZHJlbltpXSkgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGNoaWxkcmVuW2ldLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzID09PSBudWxsIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy9yZW1vdmUgJ25vbmUnIGFuZCAncHJlc2VudGF0aW9uJ1xuICAgICAgICAgICAgICAgICAgICByb2xlcyA9IHJvbGVzLmZpbHRlcihmdW5jdGlvbiAocm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGUgIT09IFwibm9uZVwiICYmIHJvbGUgIT09IFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSAnZ3JvdXAnIHJvbGUgaXMgYWxsb3dlZCBidXQgbm90IHJlcXVpcmVkIGZvciBzb21lIGVsZW1lbnRzIHNvIHJlbW92ZSBpdCBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVzLmluY2x1ZGVzKFwiZ3JvdXBcIikgJiYgcmVxdWlyZWRDaGlsZFJvbGVzICYmIHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmNsdWRlcygnZ3JvdXAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSByb2xlcy5maWx0ZXIoZnVuY3Rpb24gKHJvbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9sZSAhPT0gJ2dyb3VwJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0LnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZSB1bnRpbCBnZXQgYSByZXR1cm4gdmFsdWUsIFxuICAgICAgICAgICAgICAgICAgICBBcmlhVXRpbC5yZXRyaWV2ZURpcmVjdEFUQ2hpbGRyZW4oY2hpbGRyZW5baV0sIHJlcXVpcmVkQ2hpbGRSb2xlcywgZGlyZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBvciByZXF1aXJlZCBjaGlsZCByb2xlcyBmb3IgYSBnaXZlbiBlbGVtZW50IHdpdGggb25lIG1vcmUgcm9sZXMsXG4gICAgICogcmV0dXJuIG51bGwgaWYgdGhlIHJvbGUgaXMgJ25vbmUnIG9yICdwcmVzZW50YXRpb24nXG4gICAgICogQHBhcmFtIGVsZW1lbnQgXG4gICAgICogQHBhcmFtIGluY2x1ZGVJbXBsaWNpdCBpbmNsdWRlIGltcGxpY2l0IHJvbGVzIGlmIG5vIHJvbGUgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKGVsZW1lbnQsIGluY2x1ZGVJbXBsaWNpdDogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICgoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgJiYgaW5jbHVkZUltcGxpY2l0KSB7XG4gICAgICAgICAgICByb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGV4cGxpY2l0IG9yIGltcGxpY2l0IHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqICBcbiAgICAgICAgICogaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHIgPT4gcHJlc2VudGF0aW9uUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlczogc3RyaW5nW10gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0ucmVxQ2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZENoaWxkUm9sZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuLCByZXF1aXJlZENoaWxkUm9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1aXJlZENoaWxkUm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhbiBlbGVtZW50IHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgdGhlXG4gICAgICogcm9sZSB0aGF0IHdhcyBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXRBcmlhT3duc1dpdGhSb2xlSGlkZGVuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2sgZm9yIGFyaWEtb3duc1xuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGFyaWEtb3ducyBlbGVtZW50XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSBhcmlhLW93bnMgYW5kIGhhcyByb2xlIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXJpYU93bnNXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0QXJpYU93bnNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYW4gZWxlbWVudCByZWZlcmVuY2VkIGJ5IGFyaWEtb3ducyBhbmQgaGFzIHRoZVxuICAgICAqIHJvbGUgdGhhdCB3YXMgc3BlY2lmaWVkLiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgZWxlbWVudHMgd2l0aCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVjayBmb3IgYXJpYS1vd25zXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgYXJpYS1vd25zIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgcm9sZSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFyaWFPd25zV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykge1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgcmVmZXJlbmNlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgICBsZXQgcmVmZXJlbmNlZEVsZW1IYXNSb2xlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYXJpYS1vd25zIGlzIG5vdCBvbiB0aGUgZWxlbWVudCBqdXN0IGJyZWFrIG91dCBvZiB0aGlzIGZ1bmN0aW9uIHdpdGggbnVsbFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtb3duc1wiKSkge1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHJlZmVyZW5jZSBJRFxuICAgICAgICAgICAgbGV0IHJlZmVyZW5jZUlEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIik7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgZWxlbWVudCBmb3IgdGhlIHJlZmVyZW5jZSBJRFxuICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtZW50LCByZWZlcmVuY2VJRCk7XG4gICAgICAgICAgICAvL2lnbm9yZSBpZiB0aGUgYXJpYS1vd25zIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICAgICAgaWYgKERPTVV0aWwuc2FtZU5vZGUoZWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIHJlZmVyZW5jZWRFbGVtZW50ICE9IG51bGwgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHJlZmVyZW5jZWRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IEFyaWFVdGlsLmhhc1JvbGUocmVmZXJlbmNlZEVsZW1lbnQsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZlcmVuY2VkRWxlbUhhc1JvbGUgPyByZWZlcmVuY2VkRWxlbWVudCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIEFSSUEgbGFiZWxcbiAgICBwdWJsaWMgc3RhdGljIGhhc0FyaWFMYWJlbChlbGVtZW50KSB7XG5cbiAgICAgICAgLy8gUnB0X0FyaWFfVmFsaWRJZFJlZiBkZXRlcm1pbmVzIGlmIHRoZSBhcmlhLWxhYmVsbGVkYnkgaWQgcG9pbnRzIHRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhbiBhcnJheSBvZiBlbGVtZW50cywgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdW5pcXVlIEFSSUEgbGFiZWxzXG4gICAgcHVibGljIHN0YXRpYyBoYXNVbmlxdWVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgaXNHbG9iYWwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZG9jID0gZWxlbWVudHNbMF0ub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgdW5pcXVlQXJpYUxhYmVscyA9IG51bGw7XG5cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9IQVNfVU5JUVVFX0FSSUFfTEFCRUxTXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlxdWVBcmlhTGFiZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgIWhhc0R1cGxpY2F0ZUxhYmVscyAmJiBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXJpYUxhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGFyaWFMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW2FyaWFMYWJlbF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbE5vZGUsIGVsZW1lbnRzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSBub3JtYWxpemVkTGFiZWwgaW4gdW5pcXVlQXJpYUxhYmVscztcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVsc1tub3JtYWxpemVkTGFiZWxdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhcyBubyBsYWJlbCBhdCBhbGxcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0hBU19VTklRVUVfQVJJQV9MQUJFTFNcIiwgdW5pcXVlQXJpYUxhYmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFoYXNEdXBsaWNhdGVMYWJlbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRleHQgY29udGVudCBmcm9tIGFuIGVsZW1lbnQsIGV4Y2x1ZGluZyBzY3JpcHQgYW5kIHN0eWxlIGVsZW1lbnRzXG4gICAgICogVGhpcyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiB0aGF0IGRvZXNuJ3QgZ28gdGhyb3VnaCBmdWxsIGFjY2Vzc2libGUgbmFtZSBjb21wdXRhdGlvblxuICAgICAqIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB3aGVuIGNhbGxlZCBmcm9tIGdldEFyaWFMYWJlbFxuICAgICAqXG4gICAgICogTm90ZTogV2hlbiBhbiBlbGVtZW50IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1sYWJlbGxlZGJ5LCBpdHMgY29udGVudCBpcyBpbmNsdWRlZFxuICAgICAqIGV2ZW4gaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIChwZXIgQVJJQSBzcGVjKVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldFRleHRDb250ZW50RXhjbHVkaW5nU2NyaXB0cyhlbGVtOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gXCJcIjtcbiAgICAgICAgXG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGVsZW0gJiYgbncubm9kZSAhPT0gZWxlbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBudy5ub2RlO1xuICAgICAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogXCJcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2tpcCBzY3JpcHQgYW5kIHN0eWxlIGVsZW1lbnRzXG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdzY3JpcHQnIHx8IG5vZGVOYW1lID09PSAnc3R5bGUnKSB7XG4gICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7IC8vIFNraXAgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICAgICAgLy8gSW5jbHVkZSB0ZXh0IGV2ZW4gZnJvbSBoaWRkZW4gZWxlbWVudHMgd2hlbiByZWZlcmVuY2VkIGJ5IGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVWYWx1ZSAmJiBub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgbm9kZS5ub2RlVmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkgeyAvLyBFbGVtZW50IG5vZGVcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgaW1hZ2VzIC0gZ2V0IGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnaW1nJyAmJiAobm9kZSBhcyBFbGVtZW50KS5oYXNBdHRyaWJ1dGUoJ2FsdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyAobm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoJ2FsdCcpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7IC8vIFNraXAgY2hpbGRyZW4gb2YgaW1nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBpbnB1dCB3aXRoIHR5cGU9XCJpbWFnZVwiIC0gZ2V0IGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdpbWFnZScgJiYgKG5vZGUgYXMgRWxlbWVudCkuaGFzQXR0cmlidXRlKCdhbHQnKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdhbHQnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlOyAvLyBTa2lwIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdGV4dC50cmltKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhTGFiZWwoZWxlKSB7XG4gICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gbGFiZWxJRHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZSwgbGFiZWxJRCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbE5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxOb2RlLCBlbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugb3VyIGhlbHBlciB0byBnZXQgdGV4dCBjb250ZW50IHdpdGhvdXQgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gQXJpYVV0aWwuZ2V0VGV4dENvbnRlbnRFeGNsdWRpbmdTY3JpcHRzKGxhYmVsTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZExhYmVsLnRyaW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhRGVzY3JpcHRpb24oZWxlKSB7XG4gICAgICAgIGlmICghZWxlKSByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IG5vcm1hbGl6ZWRMYWJlbCA9IFwiXCI7XG4gICAgICAgIGxldCBkZXNjID0gZWxlLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGxhYmVsSURzID0gZGVzYy50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGxhYmVsSURzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZExhYmVsICs9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhsYWJlbCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZExhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVkTGFiZWwudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzYyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaXB0aW9uXCIpO1xuICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIGRlc2MudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbmRBcmlhTGFiZWxEdXBlcyhlbGVtZW50cykge1xuICAgICAgICBsZXQgZHVwZU1hcCA9IHt9XG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgZHVwZU1hcFtBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlKV0gPSAoZHVwZU1hcFtBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlKV0gfHwgMCkgKyAxO1xuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZHVwZU1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gYWNjZXNzaWJsZSBuYW1lcyBmb3IgYWxsIEFUIHZpc2libGUgbGFuZG1hcmsgZWxlbWVudHMgXG4gICAgICogQHBhcmFtIGRvYyBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhbmRtYXJrQWNjTmFtZXMoZG9jKSB7XG4gICAgICAgIGxldCBuYW1lTWFwID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9MYW5kbWFya19BY2NOYW1lc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKG5hbWVNYXAgJiYgbmFtZU1hcC5sZW5ndGggIT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIG5hbWVNYXA7XG5cbiAgICAgICAgbmFtZU1hcCA9IFtdO1xuICAgICAgICBsZXQgbGFuZG1hcmtFbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgJ2FzaWRlLFtyb2xlPVwiY29tcGxlbWVudGFyeVwiXSwgZm9vdGVyLFtyb2xlPVwiY29udGVudGluZm9cIl0sIGhlYWRlcixbcm9sZT1cImJhbm5lclwiXSwgbWFpbixbcm9sZT1cIm1haW5cIl0sIG5hdixbcm9sZT1cIm5hdmlnYXRpb25cIl0sIGZvcm0sW3JvbGU9XCJmb3JtXCJdLCBzZWN0aW9uLFtyb2xlPVwicmVnaW9uXCJdLCBhcnRpY2xlLFtyb2xlPVwiYXJ0aWNsZVwiXSwgW3JvbGU9XCJzZWFyY2hcIl0sW3JvbGU9XCJhcHBsaWNhdGlvblwiXSxbcm9sZT1cImRvY3VtZW50XCJdJ1xuICAgICAgICApO1xuXG4gICAgICAgIGlmIChsYW5kbWFya0VsZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJBcmlhVXRpbF9MYW5kbWFya19BY2NOYW1lc1wiLCBuYW1lTWFwKTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lTWFwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFuZG1hcmtFbGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtOiBFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgbm9kZSB0aGF0IGlzIEFUIGhpZGRlbiBvciBpbiBhIGRpYWxvZyB0aGF0IGlzIGNvbnNpZGVyZWQgYXMgYSBzZXBhcmF0ZSBsb2NhdGlvbiBmcm9tIHRoZSByZXN0IG9mIHRoZSBtYWluIHBhZ2VcbiAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkgJiYgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJESUFMT0dcIl0pID09PSBudWxsICYmIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZWxlbSwgXCJkaWFsb2dcIiwgdHJ1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhaXIubmFtZS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBuZWVzdGVkIGxhbmRtYXJrIHRvIGNhbGN1bGF0ZSB0aGUgYWNjZXNzaWJsZSBuYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JzID0gWy4uLmxhbmRtYXJrRWxlbXNdLmZpbHRlcigoZSkgPT4gZS5jb250YWlucyhlbGVtKSAmJiBlICE9PSBlbGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JzLmZvckVhY2goKGFuY2VzdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3Rvcl9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvcl9wYWlyICYmIGFuY2VzdG9yX3BhaXIubmFtZSAmJiBhbmNlc3Rvcl9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGFuY2VzdG9yX3BhaXIubmFtZS50cmltKCkgKyBcIiBcIiArIG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgIG5hbWVNYXAucHVzaCh7XCJlbGVtXCIgOiBlbGVtLCBcInJvbGVcIiA6IHJvbGUsIFwibmFtZVwiOiBuYW1lfSk7ICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0xhbmRtYXJrX0FjY05hbWVzXCIsIG5hbWVNYXApO1xuICAgICAgICByZXR1cm4gbmFtZU1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjaGVjayBpZiB0aGUgZ2l2ZW4gZWxlbWVudCB3aXRoIHRoZSBsYW5kbWFyayByb2x3IGlzIHVuaXF1ZVxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqIEBwYXJhbSByb2xlOiBhIHNwZWNpZmljIGxhbmRtYXJrIHJvbGUsIG9yIFwiYW55XCIgZm9yIGFsbCBsYW5kbWFyayByb2xlICBcbiAgICAgKiBAcGFyYW0gY29uc2lkZXJOb25lTGFiZWw6IGlmIGNvbnNpZGVyIHRoZSBsYW5kbWFya3Mgd2l0aG91dCBhIGxhYmVsXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0xhbmRtYXJrTmFtZVVuaXF1ZShlbGVtZW50LCByb2xlLCBjb25zaWRlck5vbmVMYWJlbDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IG5hbWVNYXAgPSBBcmlhVXRpbC5nZXRMYW5kbWFya0FjY05hbWVzKGVsZW1lbnQub3duZXJEb2N1bWVudCk7XG4gICAgICAgIGxldCBleGlzdCA9IG51bGw7XG4gICAgICAgIGlmIChyb2xlID09PSAnYW55JylcbiAgICAgICAgICAgIGV4aXN0ID0gbmFtZU1hcC5maW5kKGVudHJ5ID0+IGVudHJ5LmVsZW0gPT09IGVsZW1lbnQpOyAgICAgIFxuICAgICAgICBlbHNlICAgIFxuICAgICAgICAgICAgZXhpc3QgPSBuYW1lTWFwLmZpbmQoZW50cnkgPT4gZW50cnkuZWxlbSA9PT0gZWxlbWVudCAmJiBlbnRyeS5yb2xlID09PSByb2xlKTtcblxuICAgICAgICBpZiAoIWV4aXN0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBuYW1lID0gZXhpc3QubmFtZTtcbiAgICAgICAgaWYgKCFjb25zaWRlck5vbmVMYWJlbCAmJiBuYW1lID09PSAnJykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbmFtZU1hcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5hbWVNYXBbaV0uZWxlbSA9PT0gZWxlbWVudCkgY29udGludWU7ICAgICBcbiAgICAgICAgICAgIGlmIChuYW1lID09PSBuYW1lTWFwW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gJ2FueScpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVNYXBbaV0ucm9sZSA9PT0gcm9sZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IFxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgQVJJQSBsYWJlbHMgZ2xvYmFsbHlcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbHMoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmhhc1VuaXF1ZUFyaWFMYWJlbHNMb2NhbGx5KGVsZW1lbnRzLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhbiBhcnJheSBvZiBlbGVtZW50cywgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdW5pcXVlIEFSSUEgbGFiZWxzXG4gICAgcHVibGljIHN0YXRpYyBoYXNEdXBsaWNhdGVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgaXNHbG9iYWwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZG9jID0gZWxlbWVudHNbMF0ub3duZXJEb2N1bWVudDtcblxuICAgICAgICBsZXQgaGFzRHVwbGljYXRlTGFiZWxzID0gZmFsc2U7XG4gICAgICAgIGxldCB1bmlxdWVBcmlhTGFiZWxzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IG51bGw7XG4gICAgICAgIGxldCBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheSA9IG5ldyBBcnJheSgpO1xuXG4gICAgICAgIGlmIChpc0dsb2JhbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pcXVlQXJpYUxhYmVscyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhTGFiZWwgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gYXJpYUxhYmVsIGluIHVuaXF1ZUFyaWFMYWJlbHM7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHNbYXJpYUxhYmVsXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGFyaWFMYWJlbCBpbiBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5W2FyaWFMYWJlbF0gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVthcmlhTGFiZWxdLnB1c2goZWxlbWVudHNbaV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGxhYmVsSURzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGxhYmVsSURzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbE5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxOb2RlLCBlbGVtZW50c1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IG5vcm1hbGl6ZWRMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW25vcm1hbGl6ZWRMYWJlbF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShub3JtYWxpemVkTGFiZWwgaW4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVtub3JtYWxpemVkTGFiZWxdID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbbm9ybWFsaXplZExhYmVsXS5wdXNoKGVsZW1lbnRzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCB1bmlxdWVBcmlhTGFiZWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXk7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVscyBnbG9iYWxseVxuICAgIHB1YmxpYyBzdGF0aWMgaGFzRHVwbGljYXRlQXJpYUxhYmVscyhlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuaGFzRHVwbGljYXRlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZXNcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGVsZW1lbnRzKSB7XG5cbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgbGFiZWxSZWZzID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFoYXNEdXBsaWNhdGVMYWJlbHMgJiYgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihlbGVtZW50c1tpXSwgZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbFJlZiA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpO1xuICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGxhYmVsUmVmIGluIGxhYmVsUmVmcztcbiAgICAgICAgICAgICAgICBsYWJlbFJlZnNbbGFiZWxSZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWhhc0R1cGxpY2F0ZUxhYmVscztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXNvbHZpbmcgQVJJQSByZXF1aXJlbWVudHMgZm9yIGFuIEhUTUwgZWxlbWVudCBwZXIgQVJJQSBpbiBIVE1MXG4gICAgICogQHBhcmFtIHJ1bGVDb250ZXh0IHRoZSBIVE1MIGVsZW1lbnQgdG8gYmUgZXhhbWluZWRcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRhZ1Byb3BlcnR5OiBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50ID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0VsZW1lbnRBcmlhUHJvcGVydHlcIiwgbnVsbCk7XG4gICAgICAgIGlmICghdGFnUHJvcGVydHkpIHtcbiAgICAgICAgICAgIGxldCB0YWdOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBuYW1lID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdGFnUHJvcGVydHkgZXhpc3RzIGluIHRoZSBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgaGFzaC5cbiAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFt0YWdOYW1lXTtcblxuICAgICAgICAgICAgLy8gVGhlIHRhZyBuZWVkcyB0byBjaGVjayBzb21lIHNwZWNpYWwgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ID09PSBudWxsIHx8IHRhZ1Byb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbdGFnTmFtZV07XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7IC8vIHNwZWNpYWwgY2FzZXNcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1ocmVmXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIndpdGhvdXQtaHJlZlwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJlYVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ3aXRoLWhyZWZcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1ocmVmXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZjcyA9IENvbW1vblV0aWwuZ2V0Q2hpbGRCeVRhZyhydWxlQ29udGV4dCwgXCJmaWdjYXB0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmNzICE9PSBudWxsICYmIGZjcy5sZW5ndGggPiAwID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImNoaWxkLWZpZ2NhcHRpb25cIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tY2hpbGQtZmlnY2FwdGlvblwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmb290ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImhlYWRlclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiYXJ0aWNsZVwiLCB0cnVlKSAhPT0gbnVsbCB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcIm5hdmlnYXRpb25cIiwgdHJ1ZSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJyZWdpb25cIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJhcnRpY2xlXCIsIFwiYXNpZGVcIiwgXCJtYWluXCIsIFwibmF2XCIsIFwic2VjdGlvblwiXSkgIT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1zZWN0aW9uLWFydGljbGUtYXNpZGUtbWFpbi1uYXZcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoICE9PSAwIHx8IChhbHQgIT09IG51bGwgJiYgYWx0Lmxlbmd0aCA+IDApIHx8ICh0aXRsZSAhPT0gbnVsbCAmJiB0aXRsZS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWcgaGFzIG5vbi1lbXB0eSBhbHQgKGFsdD1cInNvbWUgdGV4dFwiIG9yIGFsdD1cIiAgXCIpIG9yIGFuIGFjY2Vzc2libGUgbmFtZSBpcyBwcm92aWRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aC1hY2NuYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWcgaGFzIGFuIGVtcHR5IGFsdCAoYWx0PVwiXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGhvdXQtYWNjbmFtZS1lbXB0eS1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGltZyBsYWNrcyBhbiBhbHQgYXR0cmlidXRlIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGhvdXQtYWNjbmFtZS1uby1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidHlwZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW3R5cGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSA9PT0gbnVsbCB8fCB0YWdQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLXByZXNzZWRcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hlY2tib3gtd2l0aC1hcmlhLXByZXNzZWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hlY2tib3gtd2l0aG91dC1hcmlhLXByZXNzZWRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZW1haWwtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImVtYWlsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VhcmNoXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInNlYXJjaC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wic2VhcmNoLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGVsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRlbC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGVsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInVybC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widXJsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVmYXVsdC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVmYXVsdC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHR5cGUgaXMgdGhlIHNhbWUgYXMgdHlwZT10ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxUYWdQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wibGlcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCwgXCJsaXN0XCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGlsZC1vZi1saXN0LXJvbGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLW9mLWxpc3Qtcm9sZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VjdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uYW1lID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGFiZWwgJiYgbGFiZWwudHJpbSgpLmxlbmd0aCA+IDApIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxUYWdQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wic2VsZWN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm11bHRpcGxlXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJzaXplXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNpemVcIikgPiAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJtdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJuby1tdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzdW1tYXJ5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVGFnUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcInN1bW1hcnlcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkZXRhaWxzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIERPTVV0aWwuc2FtZU5vZGUoWy4uLnJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtID0+IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKVswXSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJmaXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRib2R5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidHJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIsIHRydWUpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy10YWJsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJncmlkXCIsIHRydWUpIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLWdyaWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBDb21tb25VdGlsLmdldFNjb3BlRm9yVGgocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidGFibGVcIiwgdHJ1ZSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUgPT09ICdjb2x1bW4nKSB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLXRhYmxlLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtdGFibGUtcm93LXNjb3BlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImdyaWRcIiwgdHJ1ZSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJ0cmVlZ3JpZFwiLCB0cnVlKSAhPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlID09PSAnY29sdW1uJykgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRpdlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBydCA9IHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcnQgIT09IG51bGwgJiYgcHJ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkbCcgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hpbGQtZGxcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tY2hpbGQtZGxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wiZGVmYXVsdFwiXSBhcyBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50O1xuICAgICAgICAgICAgICAgIH0gLy9zd2l0Y2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiQXJpYVV0aWxfRWxlbWVudEFyaWFQcm9wZXJ0eVwiLCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgIHJldHVybiB0YWdQcm9wZXJ0eSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFSb2xlcyhydWxlQ29udGV4dCwgcHJvcGVydGllczogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCkge1xuICAgICAgICBsZXQgYWxsb3dlZFJvbGVzOiBzdHJpbmdbXSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJBcmlhVXRpbF9BbGxvd2VkQXJpYVJvbGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWFsbG93ZWRSb2xlcykge1xuICAgICAgICAgICAgYWxsb3dlZFJvbGVzID0gW107XG4gICAgICAgICAgICBsZXQgdGFnUHJvcGVydHk6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBwcm9wZXJ0aWVzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSwgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlcyAmJiBpbXBsaWNpdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0FsbG93ZWRBcmlhUm9sZXNcIiwgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZFJvbGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0LCByb2xlcywgcHJvcGVydGllcykge1xuICAgICAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0FsbG93ZWRBcmlhQXR0cmlidXRlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCBwZXJtaXR0ZWRSb2xlcyA9IFsuLi5yb2xlc107XG4gICAgICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgbGV0IHByb2hpYml0ZWRBdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICAvLyBFbGVtZW50IHdpdGggYSBkaXNhYmxlZCBhdHRyaWJ1dGUgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9kaXNhYmxlZC1lbGVtZW50cy5odG1sXG4gICAgICAgICAgICBpZiAoQVJJQURlZmluaXRpb25zLmVsZW1lbnRzQWxsb3dlZERpc2FibGVkLmluZGV4T2YodGFnTmFtZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgYXJpYS1kaXNhYmxlZCBhdHRyaWJ1dGUgb24gYW55IGVsZW1lbnQgdGhhdCBpcyBhbGxvd2VkIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgaW4gSFRNTDUuXG4gICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbShcImFyaWEtZGlzYWJsZWRcIiwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRWxlbWVudCB3aXRoIGEgcmVxdWlyZWQgYXR0cmlidXRlIGh0dHA6Ly93d3cudGhlLWFydC1vZi13ZWIuY29tL2h0bWwvaHRtbDUtZm9ybS12YWxpZGF0aW9uL1xuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWRSZXF1aXJlZC5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtcmVxdWlyZWQgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLXJlcXVpcmVkXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWRSZWFkT25seS5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtcmVhZG9ubHkgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgcmVhZG9ubHkgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLXJlYWRvbmx5XCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gcHJvcGVydGllcztcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgaW1wbGljaXQgcm9sZSBhbGxvd2VkIGF0dHJpYnV0ZXMgdG8gdGhlIGFsbG93ZWQgcm9sZSBsaXN0IGlmIHRoZXJlIGlzIG5vIHNwZWNpZmllZCByb2xlXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgYWxsb3cgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIChwZXJtaXR0ZWRSb2xlcyA9PT0gbnVsbCB8fCBwZXJtaXR0ZWRSb2xlcyA9PT0gdW5kZWZpbmVkIHx8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZVByb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3RhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnR5ICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydHkucHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gQXJpYVV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGVbaV0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9oaWJpdGVkUHJvcHMgPSByb2xlUHJvcGVydHkucHJvaGliaXRlZFByb3BzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkUHJvcHMgJiYgcHJvaGliaXRlZFByb3BzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9oaWJpdGVkUHJvcHMsIHByb2hpYml0ZWRBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBvZiBzZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlW2ldID09PSBcInNlcGFyYXRvclwiICYmIENvbW1vblV0aWwuaXNGb2N1c2FibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBnbG9iYWwgcHJvcGVydGllcyB0byB0aGUgdmFsaWQgYXR0cmlidXRlIGxpc3RcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxQcm9wZXJ0aWVzOyAvLyBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZGluZyB0aGUgb3RoZXIgcm9sZSB0byB0aGUgYWxsb3dlZCByb2xlcyBmb3IgdGhlIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdCh0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcywgcGVybWl0dGVkUm9sZXMpO1xuICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBzcGVjaWZpZWQgcm9sZSBwcm9wZXJ0aWVzIHRvIHRoZSBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGVybWl0dGVkUm9sZXMgIT09IG51bGwgJiYgaSA8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3Blcm1pdHRlZFJvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHByb3BlcnRpZXMgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBhbGxvdyBhdHRyaWJ1dGVzIGZyb20gdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdQcm9wZXJ0eSB8fCB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgfHwgIXRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgfHwgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydGllcy5wcm9wczsgLy8gYWxsb3dlZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IEFyaWFVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocGVybWl0dGVkUm9sZXNbaV0sIHJ1bGVDb250ZXh0KTsgLy8gcmVxdWlyZWQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvaGliaXRlZFByb3BzID0gcm9sZVByb3BlcnRpZXMucHJvaGliaXRlZFByb3BzO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvaGliaXRlZFByb3BzICYmIHByb2hpYml0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb2hpYml0ZWRQcm9wcywgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICBpZiAocGVybWl0dGVkUm9sZXNbaV0gPT09IFwic2VwYXJhdG9yXCIgJiYgQ29tbW9uVXRpbC5pc0ZvY3VzYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZ25vcmUgYXJpYS1sZXZlbCwgYXJpYS1zZXRzaXplIG9yIGFyaWEtcG9zaW5zZXQgaWYgXCJyb3dcIiBpcyBub3QgaW4gdHJlZWdyaWRcbiAgICAgICAgICAgIGlmIChwZXJtaXR0ZWRSb2xlcy5pbmNsdWRlcyhcInJvd1wiKSAmJiBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRyZWVncmlkXCIsIHRydWUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtbGV2ZWxcIikpID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtc2V0c2l6ZVwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPSBhbGxvd2VkQXR0cmlidXRlcy5pbmRleE9mKFwiYXJpYS1wb3NpbnNldFwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIGFsbG93ZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgYXR0cmlidXRlLXZhbHVlIHBhaXIgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHRhZ1Byb3BlcnR5Lm90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHIgPSB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlc1twXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gYXR0ci5zcGxpdChcIj1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKHBhaXJbMF0pID09PSBwYWlyWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQucHVzaChwYWlyWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkLnB1c2goYXR0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChhbGxvd2VkLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIHByb2hpYml0dGVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGF0dHJpYnV0ZS12YWx1ZSBwYWlyIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgIGxldCBkaXNhbGxvd2VkID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCB0YWdQcm9wZXJ0eS5vdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IGF0dHIuc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShwYWlyWzBdKSA9PT0gcGFpclsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvd2VkLnB1c2gocGFpclswXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWxsb3dlZC5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlzYWxsb3dlZC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGlzYWxsb3dlZCwgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9leGNsdWRlIHRoZSBwcm9oaWJpdGVkQXR0cmlidXRlcyBmcm9tIHRoZSBhbGxvd2VkQXR0cmlidXRlc1xuICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QocHJvaGliaXRlZEF0dHJpYnV0ZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgLy9leGNsdWRlIGFyaWEgYXR0cmlidXRlIGZvciBlbGVtZW50cyB3aXRob3V0IGltcGxpY2l0IHJvbGUgYW5kIHdpdGggJ05hbWluZyBQcm9oaWJpdGVkJ1xuICAgICAgICAgICAgaWYgKCghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSAmJiB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgJiYgdGFnUHJvcGVydHkucHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlKVxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiQXJpYVV0aWxfQWxsb3dlZEFyaWFBdHRyaWJ1dGVzXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZEF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhcmlhQXR0ciBcbiAgICAgKiBAcGFyYW0gaHRtbEF0dHJzIFxuICAgICAqIEB0eXBlOiBjb25mbGljdCBvciBvdmVybGFwcGluZ1xuICAgICAqIEByZXR1cm5zIGh0bWxBdHRyTmFtZSwgJ1Bhc3MnIG9yIG51bGxcbiAgICAgKiAgICAgICAgIGh0bWxBdHRyTmFtZSB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICAnUGFzcycgd2l0aCBubyBjb25mbGljdCB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICBvciBudWxsIHdoZXJlIGFyaWFBdHRyIHdvbid0IGNhdXNlIGNvbmZsaWN0XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb25mbGljdE9yT3ZlcmxhcHBpbmdIdG1sQXR0cmlidXRlKGFyaWFBdHRyLCBodG1sQXR0cnMsIHR5cGUpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICBsZXQgZXhpc3QgPSBBUklBRGVmaW5pdGlvbnMucmVsYXRlZEFyaWFIdG1sQXR0cmlidXRlc1thcmlhQXR0clsnbmFtZSddXTtcbiAgICAgICAgaWYgKGV4aXN0KSB7XG4gICAgICAgICAgICBpZiAoIWFyaWFBdHRyIHx8IGFyaWFBdHRyLmxlbmd0aCA9PSAwIHx8ICFodG1sQXR0cnMgfHwgaHRtbEF0dHJzLmxlbmd0aCA9PSAwKSByZXR1cm4gW107XG5cbiAgICAgICAgICAgIGxldCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IFtdO1xuICAgICAgICAgICAgbGV0IGNvbmNlcm5UeXBlcyA9IG51bGw7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2NvbmZsaWN0Jykge1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3QuY29uZmxpY3QgfHwgT2JqZWN0LmtleXMoZXhpc3QuY29uZmxpY3QpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uY2VyblR5cGVzID0gZXhpc3QuY29uZmxpY3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvdmVybGFwcGluZycpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0Lm92ZXJsYXBwaW5nIHx8IE9iamVjdC5rZXlzKGV4aXN0Lm92ZXJsYXBwaW5nKS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbmNlcm5UeXBlcyA9IGV4aXN0Lm92ZXJsYXBwaW5nO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGxldCBhcHBsaWNhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgZmFpbCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb25jZXJuVHlwZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VybkFyaWFWYWx1ZSA9IGNvbmNlcm5UeXBlc1trXS5hcmlhQXR0cmlidXRlVmFsdWU7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcm5IdG1sTmFtZXMgPSBjb25jZXJuVHlwZXNba10uaHRtbEF0dHJpYnV0ZU5hbWVzO1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXJuSHRtbFZhbHVlcyA9IGNvbmNlcm5UeXBlc1trXS5odG1sQXR0cmlidXRlVmFsdWVzO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBodG1sQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gY29uY2Vybkh0bWxOYW1lcy5pbmRleE9mKGh0bWxBdHRyc1tpXVsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbFZhbHVlc0luQ29uY2VybiA9IChjb25jZXJuSHRtbFZhbHVlcyA9PT0gbnVsbCB8fCBjb25jZXJuSHRtbFZhbHVlc1tpbmRleF0gPT09IG51bGwpID8gbnVsbCA6IGNvbmNlcm5IdG1sVmFsdWVzW2luZGV4XS5zcGxpdChcIixcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25jZXJuQXJpYVZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxWYWx1ZXNJbkNvbmNlcm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaHRtbFZhbHVlc0luQ29uY2Vybi5pbmNsdWRlcyhodG1sQXR0cnNbaV1bJ3ZhbHVlJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGh0bWxWYWx1ZXNJbkNvbmNlcm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uY2VybkFyaWFWYWx1ZSA9PT0gYXJpYUF0dHJbJ3ZhbHVlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uY2VybkFyaWFWYWx1ZSA9PT0gJ1ZBTFVFJyAmJiBodG1sVmFsdWVzSW5Db25jZXJuLmluY2x1ZGVzKCdWQUxVRScpICYmIGh0bWxWYWx1ZXNJbkNvbmNlcm5bMF0gIT09IGFyaWFBdHRyWyd2YWx1ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmNlcm5BcmlhVmFsdWUgPT09IGFyaWFBdHRyWyd2YWx1ZSddICYmIGh0bWxWYWx1ZXNJbkNvbmNlcm4uaW5jbHVkZXMoaHRtbEF0dHJzW2ldWyd2YWx1ZSddKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYXBwbGljYWJsZSAmJiAhZmFpbClcbiAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5wdXNoKHsgcmVzdWx0OiAnUGFzcycsICdhdHRyJzogJycgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBleGFtaW5lZEh0bWxBdHJOYW1lcztcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbSwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG5cbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyByb2xlcyAhPT0gbnVsbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByb2xlUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV07XG4gICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50aW9uYWwgPSByb2xlUHJvcGVydGllcy5wcmVzZW50YXRpb25hbENoaWxkcmVuO1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50aW9uYWwgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgd2Fsa05vZGU6IEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlKSB7XG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seSh3YWxrTm9kZSBhcyBIVE1MRWxlbWVudCkpIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAvL2FyaWEtb3duIGNhc2U6IGlmIHRoZSBlbGVtZW50IGlzIHJlZmVycmVkIGJ5IGFuIGFyaWEtd29uXG4gICAgICAgICAgICB3YWxrTm9kZSA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkod2Fsa05vZGUgYXMgSFRNTEVsZW1lbnQpIHx8IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyogXG4gKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIGEgdmFsaWQgQVJJQSByb2xlXG4gKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAqICAgICAgICAgdHJ1ZSBpZiB0aGUgcm9sZShzKSBhcmUgZGVmaW5lZCBpbiBBUklBXG4gKiAgICAgICAgIGZhbHNlIGlmIGFueSByb2xlIGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiovXG4gICAgcHVibGljIHN0YXRpYyBhcmVSb2xlc0RlZmluZWQocm9sZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcylcbiAgICAgICAgICAgIGlmICghKHJvbGUudG9Mb3dlckNhc2UoKSBpbiBkZXNpZ25QYXR0ZXJucykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFxuICAgICAqIGNoZWNrIGlmIGFueSBleHBsaWNpdCByb2xlIHNwZWNpZmllZCBmb3IgdGhlIGVsZW1lbnQgaXMgYSB2YWxpZCBBUklBIHJvbGVcbiAgICAgKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIHJvbGUocykgYXJlIGRlZmluZWQgaW4gQVJJQVxuICAgICAqICAgICAgICAgZmFsc2UgaWYgYW55IHJvbGUgaXMgbm90IGRlZmluZWQgaW4gQVJJQVxuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnZhbGlkUm9sZXMocnVsZUNvbnRleHQ6IEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRvbVJvbGVzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGlmICghZG9tUm9sZXMgfHwgZG9tUm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gY2hlY2sgdGhlICdnZW5lcmljJyByb2xlIGZpcnN0XG4gICAgICAgIGlmIChkb21Sb2xlcyAmJiBkb21Sb2xlcy5pbmNsdWRlcygnZ2VuZXJpYycpKVxuICAgICAgICAgICAgcmV0dXJuIFtcImdlbmVyaWNcIl07XG5cbiAgICAgICAgLy8gRmFpbGluZyByb2xlc1xuICAgICAgICBsZXQgZmFpbFJvbGVUb2tlbnMgPSBbXTtcbiAgICAgICAgLy8gUGFzc2luZyByb2xlc1xuICAgICAgICBsZXQgcGFzc1JvbGVUb2tlbnMgPSBbXTtcblxuICAgICAgICBsZXQgdGFnUHJvcGVydHkgPSBBcmlhVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGFsbG93ZWRSb2xlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgaWYgKCFhbGxvd2VkUm9sZXMgfHwgYWxsb3dlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBkb21Sb2xlcztcblxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gW107XG5cbiAgICAgICAgaWYgKGFsbG93ZWRSb2xlcy5pbmNsdWRlcygnYW55JykpXG4gICAgICAgICAgICByZXR1cm4gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21Sb2xlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghYWxsb3dlZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSAmJiAhaW52YWxpZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICBpbnZhbGlkUm9sZXMucHVzaChkb21Sb2xlc1tpXSk7XG5cbiAgICAgICAgcmV0dXJuIGludmFsaWRSb2xlcztcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAgICAgKiByZXR1cm46IGxpc3Qgb2Ygc3BlY2lmaWVkIHJvbGVzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICBsZXQgdW5kZWZpbmVkUm9sZXMgPSBbXTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIShyb2xlc1tpXSBpbiBkZXNpZ25QYXR0ZXJucykpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkUm9sZXMucHVzaChyb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRSb2xlcztcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBmaXJzdCBjaGVja3MgZXhwbGljaXQgcm9sZXMsIGlmIG5vIGV4cGxpY2l0IHJvbGUsIGl0IHdpbGwgY2hlY2sgdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgKiByZXR1cm46IG51bGwgaWYgYW55IGV4cGxpY2l0IHJvbGUgaXMgaW52YWxpZCwgXG4gICAgICogICAgICAgICBhIGxpc3Qgb2YgaW52YWxpZCBhdHRyaWJ1dGVzXG4gICAgICogICAgICAgICBlbXB0eSBsaXN0IGlmIGFsbCBhdHRyaWJ1dGVzIGFyZSB2YWxpZCwgb3Igbm8gYXJpYSBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEludmFsaWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dDogRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIC8vIGZvciBtdXRpcGxlIHJvbGVzLCBza2lwIGlmIGFueSByb2xlIGlzIGludmFsaWRcbiAgICAgICAgbGV0IGRlZmluZWQgPSBBcmlhVXRpbC5hcmVSb2xlc0RlZmluZWQocm9sZXMpO1xuICAgICAgICBpZiAoZGVmaW5lZCAhPT0gbnVsbCAmJiAhZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBhdHRycyA9IFtdO1xuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBhcmlhX2F0dHJzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBBdHRyaWJ1dGVzIGFsbG93ZWQgb24gdGhpcyBub2RlXG4gICAgICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcm9sZXMsIHRhZ1Byb3BlcnR5KTtcblxuICAgICAgICBpZiAoYXJpYV9hdHRycykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhX2F0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gYXJpYV9hdHRyc1tpXS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFsbG93ZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHJOYW1lKSAmJiAhYXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKVxuICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXR0cnM7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKGVsZW06IEVsZW1lbnQpIHtcblxuICAgICAgICBsZXQgYXJpYUF0dHJzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlTmFtZVZhbHVlUGFpcnMoZWxlbSk7XG4gICAgICAgIGxldCBodG1sQXR0cnMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEh0bWxBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGlmIChhcmlhQXR0cnMgJiYgYXJpYUF0dHJzLmxlbmd0aCA+IDAgJiYgaHRtbEF0dHJzICYmIGh0bWxBdHRycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gQXJpYVV0aWwuZ2V0Q29uZmxpY3RPck92ZXJsYXBwaW5nSHRtbEF0dHJpYnV0ZShhcmlhQXR0cnNbaV0sIGh0bWxBdHRycywgJ2NvbmZsaWN0Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGV4YW1pbmVkSHRtbEF0ck5hbWVzID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdGYWlsZWQnKSAvL2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyAnYXJpYUF0dHInOiBhcmlhQXR0cnNbaV1bJ25hbWUnXSwgJ2h0bWxBdHRyJzogaXRlbVsnYXR0ciddIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXByZWNhdGVkQXJpYVJvbGVzKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZ2xvYmFsRGVwcmVjYXRlZFJvbGVzID0gQVJJQURlZmluaXRpb25zLmdsb2JhbERlcHJlY2F0ZWRSb2xlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsRGVwcmVjYXRlZFJvbGVzLmluY2x1ZGVzKHJvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2gocm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlLWF0dHJpYnV0ZXNcbiAgICAgKiByZXR1cm46IGEgbGlzdCBvZiBkZXByZWNhdGVkIEFyaWEgcm9sZS1hdHRyaWJ1dGVzIHBhcmlzXG4gICAgICogICAgICAgICBmb3IgZ2xvYmFsIHRoZSByb2xlIGlzIG1hcmtlZCBhcyAnYW55J1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbWVudC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgYXJpYUF0dHJzID0gW107XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJylcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJzLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcmlhQXR0cnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBjb25zdCBnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxEZXByZWNhdGVkUHJvcGVydGllcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcy5pbmNsdWRlcyhhcmlhQXR0cnNbaV0pKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKHsgXCJyb2xlXCI6IFwiYW55XCIsIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tpXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVdpdGhEZXByZWNhdGVkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlOYW1lcyA9IHJvbGVXaXRoRGVwcmVjYXRlZEF0dHJpYnV0ZXNbJ2RlcHJlY2F0ZWRQcm9wcyddO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMgJiYgZGVwcmVjYXRlZEF0dHJpTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhcmlhQXR0cnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMuaW5jbHVkZXMoYXJpYUF0dHJzW2pdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyBcInJvbGVcIjogcm9sZXNbaV0sIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tqXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlSW5HcmlkKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobm9kZSwgXCJncmlkXCIpICE9IG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4vQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRE9NTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01NYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBCb3VuZHMgfSBmcm9tIFwiLi4vYXBpL0lCb3VuZHNcIjtcblxudHlwZSBQc2V1ZG9DbGFzcyA9XG4gICAgfCBcIjpob3ZlclwiXG4gICAgfCBcIjphY3RpdmVcIlxuICAgIHwgXCI6Zm9jdXNcIlxuICAgIHwgXCI6Zm9jdXMtdmlzaWJsZVwiXG4gICAgfCBcIjpmb2N1cy13aXRoaW5cIjtcblxuZXhwb3J0IGNsYXNzIENTU1V0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgc2VsZWN0b3JNYXRjaGVzRWxlbShlbGVtZW50OiBFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIEVhcmx5IHJldHVybiBmb3IgZW1wdHkgc2VsZWN0b3IgKGJlZm9yZSB0cnktY2F0Y2ggZm9yIHBlcmZvcm1hbmNlKVxuICAgICAgICBpZiAoIXNlbGVjdG9yIHx8IHNlbGVjdG9yLmxlbmd0aCA9PT0gMCB8fCBzZWxlY3Rvci50cmltKCkgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTW9kZXJuIHN0YW5kYXJkIG1ldGhvZFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm1hdGNoZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBWZW5kb3ItcHJlZml4ZWQgZmFsbGJhY2tzIChvbGRlciBicm93c2VycylcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiAoZWxlbWVudCBhcyBhbnkpLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS5tc01hdGNoZXNTZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkubXNNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBMZWdhY3kgbWV0aG9kIChkZXByZWNhdGVkIGJ1dCBrZXB0IGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZWxlbWVudCBhcyBhbnkpLm1hdGNoZXNTZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHVzZSBxdWVyeVNlbGVjdG9yQWxsIGFuZCBjaGVjayBpZiBlbGVtZW50IGlzIGluIHJlc3VsdHNcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fCAoZWxlbWVudCBhcyBhbnkpLmRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKCFkb2MpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIC8vIFVzZSBBcnJheS5mcm9tIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aCBtb2Rlcm4gZW5naW5lc1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obWF0Y2hlcykuaW5jbHVkZXMoZWxlbWVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gQmFkIHNlbGVjdG9yPyBEb2Vzbid0IG1hdGNoIHRoZW4uLi5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0eWxlIGNvbXB1dGVkIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gZWxlbVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtOiBIVE1MRWxlbWVudCwgcHNldWRvRWx0PzogUHNldWRvQ2xhc3MpIHtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuICAgICAgICBjb25zdCB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIHJldHVybiB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBwc2V1ZG9FbHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIGFuZCBjYWNoZSBhbGwgc3R5bGVzaGVldCBydWxlcyBhdCB0aGUgZG9jdW1lbnQgbGV2ZWxcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBhcnNlZCBydWxlIG9iamVjdHMgd2l0aCBzZWxlY3RvciBhbmQgc3R5bGUgaW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRQYXJzZWRTdHlsZXNoZWV0UnVsZXMob3duZXJEb2M6IERvY3VtZW50KTogQXJyYXk8e1xuICAgICAgICBmdWxsUnVsZVNlbGVjdG9yOiBzdHJpbmc7XG4gICAgICAgIGhhc1BzZXVkb0NsYXNzOiBib29sZWFuO1xuICAgICAgICBzZWxNYWluOiBzdHJpbmc7XG4gICAgICAgIHNlbFBzZXVkbzogc3RyaW5nO1xuICAgICAgICBzdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbjtcbiAgICB9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBjYWNoZWQgcGFyc2VkIHJ1bGVzIGZvciB0aGlzIGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGNhY2hlZFJ1bGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKG93bmVyRG9jLCBcIlJQVFV0aWxfUGFyc2VkU3R5bGVzaGVldFJ1bGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoY2FjaGVkUnVsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRSdWxlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZFJ1bGVzID0gW107XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgc3R5bGVzaGVldHMgYW5kIHJ1bGVzXG4gICAgICAgIGZvciAobGV0IHNzSW5kZXggPSAwOyBzc0luZGV4IDwgb3duZXJEb2Muc3R5bGVTaGVldHMubGVuZ3RoOyArK3NzSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gb3duZXJEb2Muc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSBzaGVldC5jc3NSdWxlc1tySW5kZXhdIGFzIENTU1N0eWxlUnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxSdWxlU2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsUnVsZVNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvTWF0Y2ggPSBmdWxsUnVsZVNlbGVjdG9yLm1hdGNoKC9eKC4qKSg6W2EtekEtWi1dKikkLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzUHNldWRvQ2xhc3MgPSAhIXBzZXVkb01hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbE1haW4gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzFdIDogZnVsbFJ1bGVTZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxQc2V1ZG8gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzJdIDogXCJcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUnVsZVNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQc2V1ZG9DbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsTWFpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsUHNldWRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogcnVsZS5zdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJDYW5ub3QgYWNjZXNzIHJ1bGVzXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICFlcnIudG9TdHJpbmcoKS5pbmNsdWRlcyhcIlNlY3VyaXR5RXJyb3I6XCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB0aGUgcGFyc2VkIHJ1bGVzIGF0IHRoZSBkb2N1bWVudCBsZXZlbFxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUob3duZXJEb2MsIFwiUlBUVXRpbF9QYXJzZWRTdHlsZXNoZWV0UnVsZXNcIiwgcGFyc2VkUnVsZXMpO1xuICAgICAgICByZXR1cm4gcGFyc2VkUnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJpdmF0ZSBoZWxwZXIgbWV0aG9kIHRvIGZpbGwgc3R5bGUgbWFwcyBmcm9tIGEgQ1NTU3R5bGVEZWNsYXJhdGlvblxuICAgICAqIEhhbmRsZXMgQ1NTIHByb3BlcnR5IHByaW9yaXRpZXMgYW5kIHRoZSBcImFsbFwiIHNob3J0aGFuZCBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGZpbGxTdHlsZShtYXBzOiBhbnlbXSwgc3R5bGU6IENTU1N0eWxlRGVjbGFyYXRpb24pOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgc3R5bGUubGVuZ3RoOyArK3NJbmRleCkge1xuICAgICAgICAgICAgaWYgKHN0eWxlW3NJbmRleF0gPT09IFwiYWxsXCIgJiYgc3R5bGVbc3R5bGVbc0luZGV4XV0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hcCBvZiBtYXBzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1hcFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBzdHlsZVtzSW5kZXhdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByaW9yaXR5ID0gc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eShrZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1hcCAmJiBtYXBba2V5XS5lbmRzV2l0aChcIiFpbXBvcnRhbnRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9PT0gXCJpbXBvcnRhbnRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBba2V5XS5zdGFydHNXaXRoKFwiaW5oZXJpdFwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBba2V5XS5zdGFydHNXaXRoKFwidW5zZXRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHN0eWxlW2tleV0gKyBcIiAhaW1wb3J0YW50XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVtrZXldICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJpb3JpdHkgPT09IFwiaW1wb3J0YW50XCIgPyBcIiAhaW1wb3J0YW50XCIgOiBcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcml2YXRlIGhlbHBlciBtZXRob2QgdGhhdCBjb25zb2xpZGF0ZXMgdGhlIGxvZ2ljIGZvciBnZXR0aW5nIGRlZmluZWQgc3R5bGVzXG4gICAgICogVXNlZCBieSBib3RoIGdldERlZmluZWRTdHlsZXMgYW5kIGdldERlZmluZWRTdHlsZXNNdWx0aXBsZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldERlZmluZWRTdHlsZXNJbnRlcm5hbChcbiAgICAgICAgZWxlbTogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByb3BzOiBzdHJpbmdbXSB8IG51bGwsXG4gICAgICAgIHBzZXVkb0NsYXNzZXM6IHN0cmluZ1tdXG4gICAgKTogeyBbcHNldWRvQ2xhc3M6IHN0cmluZ106IGFueSB9IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHt9O1xuICAgICAgICBjb25zdCBkZWZpbmVkU3R5bGVzTWFwID0ge307XG4gICAgICAgIGNvbnN0IGRlZmluZWRTdHlsZVBzZXVkb01hcCA9IHt9O1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgcmVzdWx0IG9iamVjdHMgZm9yIGFsbCBwc2V1ZG8tY2xhc3Nlc1xuICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgIGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdID0ge307XG4gICAgICAgICAgICBkZWZpbmVkU3R5bGVQc2V1ZG9NYXBbcHNldWRvQ2xhc3NdID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcHJlLXBhcnNlZCBzdHlsZXNoZWV0IHJ1bGVzIGZyb20gY2FjaGVcbiAgICAgICAgY29uc3QgcGFyc2VkUnVsZXMgPSBDU1NVdGlsLmdldFBhcnNlZFN0eWxlc2hlZXRSdWxlcyhlbGVtLm93bmVyRG9jdW1lbnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgb25jZSBpZiB3ZSBuZWVkIHRvIGhhbmRsZSA6Zm9jdXMgcHNldWRvLWNsYXNzXG4gICAgICAgIGNvbnN0IGhhc0ZvY3VzUHNldWRvID0gcHNldWRvQ2xhc3Nlcy5pbmNsdWRlcyhcIjpmb2N1c1wiKTtcblxuICAgICAgICAvLyBQcm9jZXNzIGVhY2ggY2FjaGVkIHJ1bGVcbiAgICAgICAgZm9yIChjb25zdCBwYXJzZWRSdWxlIG9mIHBhcnNlZFJ1bGVzKSB7XG4gICAgICAgICAgICBpZiAocHJvcHMgIT09IG51bGwgJiYgIXByb3BzLnNvbWUocHJvcCA9PiAhIXBhcnNlZFJ1bGUuc3R5bGVbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxQc2V1ZG8gPSBwYXJzZWRSdWxlLnNlbFBzZXVkbztcbiAgICAgICAgICAgIGNvbnN0IGhhc1BzZXVkb0NsYXNzID0gcGFyc2VkUnVsZS5oYXNQc2V1ZG9DbGFzcztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSGFuZGxlIDpmb2N1cy13aXRoaW4gcmVwbGFjZW1lbnQgb25jZSBwZXIgcnVsZSBpZiBuZWVkZWRcbiAgICAgICAgICAgIGxldCBzZWxNYWluID0gcGFyc2VkUnVsZS5zZWxNYWluO1xuICAgICAgICAgICAgaWYgKGhhc0ZvY3VzUHNldWRvICYmIHNlbFBzZXVkbyA9PT0gXCI6Zm9jdXNcIikge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBoYXMgZm9jdXMsIHJlbW92ZSBmb2N1cy13aXRoaW4gZnJvbSBwYXJlbnRzXG4gICAgICAgICAgICAgICAgc2VsTWFpbiA9IHNlbE1haW4ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgLyhbID5dW14rfiA+XSspOmZvY3VzLXdpdGhpbi9nLFxuICAgICAgICAgICAgICAgICAgICBcIiQxXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDYWNoZSBzZWxlY3RvciBtYXRjaGluZyByZXN1bHQgKG9ubHkgb25jZSBwZXIgcnVsZSwgbm90IHBlciBwc2V1ZG8tY2xhc3MpXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rvck1hdGNoZXMgPSBDU1NVdGlsLnNlbGVjdG9yTWF0Y2hlc0VsZW0oZWxlbSwgc2VsTWFpbik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VzcyBpZiBzZWxlY3RvciBtYXRjaGVzXG4gICAgICAgICAgICBpZiAoc2VsZWN0b3JNYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBmb3IgZWFjaCBwc2V1ZG8tY2xhc3NcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgbWFwIHJlZmVyZW5jZXMgdG8gYXZvaWQgcmVwZWF0ZWQgbG9va3Vwc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZU1hcCA9IGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwc2V1ZG9NYXAgPSBkZWZpbmVkU3R5bGVQc2V1ZG9NYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBvZiBub24tcHNldWRvIHNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1BzZXVkb0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbc3R5bGVNYXAsIHBzZXVkb01hcF0sIHBhcnNlZFJ1bGUuc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBmb3IgbWF0Y2hpbmcgcHNldWRvLWNsYXNzXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxQc2V1ZG8gPT09IHBzZXVkb0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbcHNldWRvTWFwXSwgcGFyc2VkUnVsZS5zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgZWxlbWVudCBzdHlsZXMgYW5kIGJ1aWxkIHJlc3VsdHMgaW4gb25lIHBhc3NcbiAgICAgICAgZm9yIChjb25zdCBwc2V1ZG9DbGFzcyBvZiBwc2V1ZG9DbGFzc2VzKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZU1hcCA9IGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgY29uc3QgcHNldWRvTWFwID0gZGVmaW5lZFN0eWxlUHNldWRvTWFwW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQWRkIGVsZW1lbnQncyBpbmxpbmUgc3R5bGVzXG4gICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbc3R5bGVNYXAsIHBzZXVkb01hcF0sIGVsZW0uc3R5bGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBCdWlsZCByZXN1bHRzXG4gICAgICAgICAgICBpZiAocHNldWRvQ2xhc3MgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3BzZXVkb0NsYXNzXSA9IHN0eWxlTWFwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgcHNldWRvLWNsYXNzZXMsIHJldHVybiBvbmx5IHN0eWxlcyB0aGF0IGRpZmZlciBmcm9tIGRlZmF1bHRcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmU3R5bGVzID0ge307XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHBzZXVkb01hcCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwc2V1ZG9NYXBba2V5XSAhPT0gc3R5bGVNYXBba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlN0eWxlc1trZXldID0gcHNldWRvTWFwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0c1twc2V1ZG9DbGFzc10gPSBkaWZmU3R5bGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnQgZm9yIG11bHRpcGxlIHBzZXVkby1jbGFzc2VzIGluIGEgc2luZ2xlIHBhc3NcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIGdldERlZmluZWRTdHlsZXMgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seVxuICAgICAqIGl0ZXJhdGVzIHRocm91Z2ggc3R5bGVzaGVldHMgb25jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgKGFsbG93cyB1cyB0byBza2lwIGVsZW0gbWF0Y2hpbmcgdW5uZWNlc3NhcmlseSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwc2V1ZG9DbGFzc2VzIC0gQXJyYXkgb2YgcHNldWRvLWNsYXNzZXMgdG8gcmV0cmlldmUuIFVzZSBcIlwiIGZvciBkZWZhdWx0IChubyBwc2V1ZG8tY2xhc3MpLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCBtYXBwaW5nIGVhY2ggcHNldWRvLWNsYXNzIHRvIGl0cyBkZWZpbmVkIHN0eWxlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKGVsZW06IEhUTUxFbGVtZW50LCBwcm9wczogc3RyaW5nW10gfCBudWxsLCBwc2V1ZG9DbGFzc2VzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByZXN1bHRzID0ge307XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNhY2hlIGtleSB0aGF0IGluY2x1ZGVzIHByb3BzIGZpbHRlclxuICAgICAgICAvLyBVc2UgXCJhbGxcIiBmb3IgbnVsbCBwcm9wcywgb3Igc29ydGVkIGNvbW1hLXNlcGFyYXRlZCBsaXN0IGZvciBzcGVjaWZpYyBwcm9wc1xuICAgICAgICBjb25zdCBwcm9wc0tleSA9IHByb3BzID09PSBudWxsID8gXCJhbGxcIiA6IHByb3BzLnNsaWNlKCkuc29ydCgpLmpvaW4oXCIsXCIpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QgLSBzZWUgaWYgd2UgaGF2ZSBhbGwgcmVxdWVzdGVkIHBzZXVkby1jbGFzc2VzIGNhY2hlZFxuICAgICAgICBsZXQgYWxsQ2FjaGVkU3R5bGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWFsbENhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgYWxsQ2FjaGVkU3R5bGVzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGNhY2hlIGJ1Y2tldCBmb3IgdGhpcyBwcm9wcyBmaWx0ZXJcbiAgICAgICAgbGV0IGNhY2hlZFN0eWxlcyA9IGFsbENhY2hlZFN0eWxlc1twcm9wc0tleV07XG4gICAgICAgIGxldCBtaXNzaW5nUHNldWRvQ2xhc3NlcyA9IFtdO1xuICAgICAgICBcbiAgICAgICAgaWYgKGNhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgd2hpY2ggcHNldWRvLWNsYXNzZXMgYXJlIGFscmVhZHkgY2FjaGVkXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkU3R5bGVzW3BzZXVkb0NsYXNzXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbcHNldWRvQ2xhc3NdID0gY2FjaGVkU3R5bGVzW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtaXNzaW5nUHNldWRvQ2xhc3Nlcy5wdXNoKHBzZXVkb0NsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIElmIGFsbCBhcmUgY2FjaGVkLCByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIGlmIChtaXNzaW5nUHNldWRvQ2xhc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFN0eWxlcyA9IHt9O1xuICAgICAgICAgICAgbWlzc2luZ1BzZXVkb0NsYXNzZXMgPSBwc2V1ZG9DbGFzc2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBwcm9jZXNzIG1pc3NpbmcgcHNldWRvLWNsYXNzZXMgdXNpbmcgdGhlIGludGVybmFsIGhlbHBlclxuICAgICAgICBpZiAobWlzc2luZ1BzZXVkb0NsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV3UmVzdWx0cyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc0ludGVybmFsKGVsZW0sIHByb3BzLCBtaXNzaW5nUHNldWRvQ2xhc3Nlcyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE1lcmdlIG5ldyByZXN1bHRzIHdpdGggY2FjaGVkIHJlc3VsdHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHNldWRvQ2xhc3Mgb2YgbWlzc2luZ1BzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3BzZXVkb0NsYXNzXSA9IG5ld1Jlc3VsdHNbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgIGNhY2hlZFN0eWxlc1twc2V1ZG9DbGFzc10gPSBuZXdSZXN1bHRzW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGNhY2hlIHdpdGggYWxsIHN0eWxlcyAoZXhpc3RpbmcgKyBuZXcpXG4gICAgICAgICAgICBhbGxDYWNoZWRTdHlsZXNbcHJvcHNLZXldID0gY2FjaGVkU3R5bGVzO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIGFsbENhY2hlZFN0eWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBjb21wdXRlZCBzdHlsZSBpbiB0aGF0IHRoZSBjb21wdXRlZCBzdHlsZSB3aWxsIHJldHVyblxuICAgICAqIHN0eWxlcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIGFnZW50LiBUaGlzIHdpbGwgb25seSByZXR1cm4gc3R5bGVzIGRlZmluZWQgYnkgdGhlXG4gICAgICogYXBwbGljYXRpb25cbiAgICAgKiBpZiByb3RhdGlvbiB0cmFuc2Zvcm0gaXMgdXNlZCwgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgdGhlIHJlc29sdmVkIG1hdHJpeFxuICAgICAqICB3aGlsZSB0aGUgZGVmaW5lZCBzdHlsZSByZXR1cm4gdGhlIHRyYW5zZm9ybSBmdW5jdGlvbihzKVxuICAgICAqIGZvciBleGFtcGxlLCBmb3IgJ3RyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7JywgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgJ21hdHJpeCgtMC4wNDM2MTk0LCAwLjk5OTA0OCwgLTAuOTk5MDQ4LCAtMC4wNDM2MTk0LCAwLCAwKSdcbiAgICAgKiAgYW5kIHRoZSBkZWZpbmVkIHN0eWxlIHJldHVybnMgJ3JvdGF0ZSgyLjVkZWcpJ1xuICAgICAqXG4gICAgICogY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgcHNldWRvQ2xhc3MgZnJvbSBQc2V1ZG9DbGFzcyB0byBzdHJpbmcgdG8gaW5jbHVkZSBib3RoIHBzZXVkbyBjbGFzc2VzIChlLmcuLCA6Zm9jdXMsIDpjaGVja2VkKVxuICAgICAqIGFuZCBwc2V1ZG8gZWxlbWVudHMgKGUuZy4sIDo6YmVmb3JlLCA6OmFmdGVyKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgKGFsbG93cyB1cyB0byBza2lwIGVsZW0gbWF0Y2hpbmcgdW5uZWNlc3NhcmlseSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3BzZXVkb0NsYXNzXSBJZiBzcGVjaWZpZWQsIHdpbGwgcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSBkaWZmZXJlbnRcbiAgICAgKiB0aGFuIHdoZW4gdGhlIHBzZXVkb0NsYXNzIGRvZXMgbm90IG1hdGNoLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVmaW5lZFN0eWxlcyhlbGVtOiBIVE1MRWxlbWVudCwgcHJvcHM6IHN0cmluZ1tdLCBwc2V1ZG9DbGFzcz86IHN0cmluZykge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIENyZWF0ZSBjYWNoZSBrZXkgdGhhdCBpbmNsdWRlcyBwcm9wcyBmaWx0ZXJcbiAgICAgICAgLy8gVXNlIFwiYWxsXCIgZm9yIG51bGwgcHJvcHMsIG9yIHNvcnRlZCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBmb3Igc3BlY2lmaWMgcHJvcHNcbiAgICAgICAgY29uc3QgcHJvcHNLZXkgPSBwcm9wcyA9PT0gbnVsbCA/IFwiYWxsXCIgOiBwcm9wcy5zbGljZSgpLnNvcnQoKS5qb2luKFwiLFwiKTtcbiAgICAgICAgY29uc3QgcHNldWRvS2V5ID0gcHNldWRvQ2xhc3MgfHwgXCJcIjtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0IC0gdXNlIHNoYXJlZCBjYWNoZSBzdHJ1Y3R1cmUgd2l0aCBnZXREZWZpbmVkU3R5bGVzTXVsdGlwbGVcbiAgICAgICAgbGV0IGFsbENhY2hlZFN0eWxlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFhbGxDYWNoZWRTdHlsZXMpIHtcbiAgICAgICAgICAgIGFsbENhY2hlZFN0eWxlcyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBjYWNoZSBidWNrZXQgZm9yIHRoaXMgcHJvcHMgZmlsdGVyXG4gICAgICAgIGxldCBjYWNoZWRTdHlsZXMgPSBhbGxDYWNoZWRTdHlsZXNbcHJvcHNLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgY2FjaGVkU3R5bGVzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChjYWNoZWRTdHlsZXNbcHNldWRvS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU3R5bGVzW3BzZXVkb0tleV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIGludGVybmFsIGhlbHBlciBtZXRob2Qgd2l0aCBhIHNpbmdsZSBwc2V1ZG8tY2xhc3NcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc0ludGVybmFsKGVsZW0sIHByb3BzLCBbcHNldWRvS2V5XSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbcHNldWRvS2V5XTtcbiAgICAgICAgXG4gICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgY2FjaGVkU3R5bGVzW3BzZXVkb0tleV0gPSByZXN1bHQ7XG4gICAgICAgIGFsbENhY2hlZFN0eWxlc1twcm9wc0tleV0gPSBjYWNoZWRTdHlsZXM7XG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCBhbGxDYWNoZWRTdHlsZXMpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtZWRpYSBxdWVyeSBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnRcbiAgICAgKiBHZXQgbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtcyBmcm9tIHN0eWxlc2hlZXRzIHdpdGggY2FjaGluZ1xuICAgICAqIFJldHVybnMgdHJhbnNmb3JtL3JvdGF0ZSBwcm9wZXJ0aWVzIGZvciBlbGVtZW50cyB3aXRoaW4gbWVkaWEgcXVlcmllc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtEb2N1bWVudH0gZG9jXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRNZWRpYU9yaWVudGF0aW9uVHJhbnNmb3JtKGRvYzogRG9jdW1lbnQpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGNhY2hlZCBtZWRpYSBvcmllbnRhdGlvbiB0cmFuc2Zvcm1zIGZvciB0aGlzIGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGNhY2hlZFRyYW5zZm9ybXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybXNcIiwgbnVsbCk7XG4gICAgICAgIGlmIChjYWNoZWRUcmFuc2Zvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVHJhbnNmb3JtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcmllbnRhdGlvblRyYW5zZm9ybXMgPSB7fVxuXG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHN0eWxlc2hlZXRzIGFuZCBydWxlc1xuICAgICAgICBmb3IgKGxldCBzc0luZGV4ID0gMDsgc3NJbmRleCA8IGRvYy5zdHlsZVNoZWV0cy5sZW5ndGg7ICsrc3NJbmRleCkge1xuICAgICAgICAgICAgY29uc3Qgc2hlZXQgPSBkb2Muc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoZWV0UnVsZSA9IHNoZWV0LmNzc1J1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8gPT09IHNoZWV0UnVsZS5NRURJQV9SVUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVsZSA9IHNoZWV0UnVsZSBhcyBDU1NNZWRpYVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUgJiYgcnVsZS5tZWRpYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUxpc3QgPSBydWxlLm1lZGlhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lZGlhTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZWRpYUxpc3QuaXRlbShpKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUtleSA9IG1lZGlhTGlzdC5pdGVtKGkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbV90cmFuc2Zvcm1zID0gb3JpZW50YXRpb25UcmFuc2Zvcm1zW21lZGlhS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxlbV90cmFuc2Zvcm1zKSBlbGVtX3RyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gcnVsZS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3R5bGVSdWxlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLyA9PT0gc3R5bGVSdWxlc1tqXS5TVFlMRV9SVUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbal0gYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHN0eWxlUnVsZS5zZWxlY3RvclRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHN0eWxlUnVsZS5zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgc3R5bGVzLmxlbmd0aDsgKytzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gc3R5bGVzW3NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleUxvd2VyID0ga2V5LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleUxvd2VyID09PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYWxsXCIgJiYgc3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3Jtc1trZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleUxvd2VyID09PSBcInJvdGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXNba2V5XSA9IHN0eWxlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0cmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90cmFuc2Zvcm1zW3NlbGVjdG9yXSA9IHRyYW5zZm9ybXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZWxlbV90cmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb25UcmFuc2Zvcm1zW21lZGlhS2V5XSA9IGVsZW1fdHJhbnNmb3JtcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiQ2Fubm90IGFjY2VzcyBydWxlc1wiKSAmJlxuICAgICAgICAgICAgICAgICAgICAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJTZWN1cml0eUVycm9yOlwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDYWNoZSB0aGUgbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtcyBhdCB0aGUgZG9jdW1lbnQgbGV2ZWxcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRVdGlsX01lZGlhT3JpZW50YXRpb25UcmFuc2Zvcm1zXCIsIG9yaWVudGF0aW9uVHJhbnNmb3Jtcyk7XG4gICAgICAgIHJldHVybiBvcmllbnRhdGlvblRyYW5zZm9ybXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29udmVydCBnaXZlbiByb3RhdGlvbiB0cmFuc2Zvcm0gZnVuY3Rpb25zIHRvIHRoZSBkZWdyZWUgdHJhbnNmb3JtZWQuXG4gICAgICogSWYgbXVsdGlwbGUgZnVuY3Rpb25zIGFyZSBnaXZlbiwgdGhlbiB0aGUgZnVuY3Rpb25zIGFyZSBhcHBsaWVkIGxpbmVhcmx5IGluIHRoZSBvcmRlci5cbiAgICAgKiAgIHJvdGF0aW9uX3RyYW5zZm9ybSBmdW5jdGlvbiBleGFtcGxlOiAgcm90YXRlKDQ1ZGVnKSwgcm90YXRlKDJ0dXJuKSwgcm90YXRlKDJyYWQpLCByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZyksXG4gICAgICogICAgICAgIHJvdGF0ZSgycmFkKSByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZylcbiAgICAgKiBAcGFyYW0gcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSb3RhdGlvbkRlZ3JlZShyb3RhdGlvbl90cmFuc2Zvcm0pIHtcbiAgICAgICAgbGV0IGRlZ3JlZSA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXJvdGF0aW9uX3RyYW5zZm9ybSkgcmV0dXJuIGRlZ3JlZTtcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0aGUgcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICAgICAgICByb3RhdGlvbl90cmFuc2Zvcm0gPSByb3RhdGlvbl90cmFuc2Zvcm0ucmVwbGFjZUFsbChcIiwgXCIsIFwiLFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybV9mdW5jdGlvbnMgPSByb3RhdGlvbl90cmFuc2Zvcm0uc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2Zvcm1fZnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtX2Z1bmN0aW9uID0gdHJhbnNmb3JtX2Z1bmN0aW9uc1tpXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbiA9PT0gXCJcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwicm90YXRlM2RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZTogcm90YXRlM2QoMSwgMSwgMSwgNDVkZWcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIoXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdHJpeCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3RhdGlvbiA9IHZhbHVlc1szXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdGF0aW9uKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJ0dXJuXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gNFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gbnVtICogMzYwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJyYWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSAobnVtICogMTgwKSAvIE1hdGguUEk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSArPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGVcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGVaXCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGU6IHJvdGF0ZSg0NWRlZyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm90YXRpb24gPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyb3RhdGlvbikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInR1cm5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSA0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSBudW0gKiAzNjA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uLmVuZHNXaXRoKFwicmFkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gKG51bSAqIDE4MCkgLyBNYXRoLlBJO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSArPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4M2RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSB0aHJlZSBFdWxlciBhbmdsZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ICE9PSAtMSAmJiByaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXRyaXggPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4KSB2YWx1ZXMgPSBtYXRyaXguc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpfYW5nbGUgPSBNYXRoLmF0YW4yKHZhbHVlc1s0XSwgdmFsdWVzWzVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyZWUgKz0gTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgoel9hbmdsZSAqIDE4MCkgLyBNYXRoLlBJKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgdGhyZWUgRXVsZXIgYW5nbGVzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0cml4ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6X2FuZ2xlID0gTWF0aC5hdGFuMih2YWx1ZXNbMV0sIHZhbHVlc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlICs9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHpfYW5nbGUgKiAxODApIC8gTWF0aC5QSSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAoZGVncmVlID49IDM2MCkgZGVncmVlIC09IDM2MDtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhbm5vdCByZXRyaWV2ZSByb3RhdGlvbiBkZWdyZWU6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVncmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgQ1NTIHN0eWxlIHN0cmluZyB2YWx1ZXMgdG8gcGl4ZWxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHN0eWxlIHZhbHVlIGluIHN0cmluZywgc3VjaCBhcyAzcmVtLCAyMzBweCBldGMuXG4gICAgICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRQaXhlbHNGcm9tU3R5bGUodmFsdWUsIGVsZW0pIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbiAgICAgICAgbGV0IHBhcnNlZCA9IHZhbHVlLnRyaW0oKS5tYXRjaChyZWdleCk7XG4gICAgICAgIGlmIChwYXJzZWQgPT09IG51bGwpIHJldHVybiAwO1xuICAgICAgICBpZiAocGFyc2VkWzJdID09PSBcIlwiIHx8IHBhcnNlZFsxXSA9PT0gMClcbiAgICAgICAgICAgIC8vbm8gemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBlcnJvciwgc28gaW1wbGljYWJsZVxuICAgICAgICAgICAgcmV0dXJuIDA7XG5cbiAgICAgICAgY29uc3QgcGl4ZWxzID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhcnNlZFsyXSwgcGFyc2VkWzFdLCBlbGVtKTtcbiAgICAgICAgcmV0dXJuIHBpeGVscyA9PT0gbnVsbCA/IHBpeGVscyA6IHBhcnNlRmxvYXQocGl4ZWxzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGFic29sdXRlIENTUyBudW1lcmljYWwgdmFsdWVzIHRvIHBpeGVscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1bml0VmFsdWUgaW4gc3RyaW5nXG4gICAgICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXQsIHVuaXRWYWx1ZSwgZWxlbSkge1xuICAgICAgICBpZiAodW5pdFZhbHVlID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgaWYgKCF1bml0KSB1bml0ID0gXCJweFwiO1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRVbml0cyA9IHtcbiAgICAgICAgICAgIC8vIGFic29sdXRlIHVuaXRcbiAgICAgICAgICAgIHB4OiAodmFsdWUpID0+IHZhbHVlLFxuICAgICAgICAgICAgY206ICh2YWx1ZSkgPT4gdmFsdWUgKiAzNy44LFxuICAgICAgICAgICAgbW06ICh2YWx1ZSkgPT4gdmFsdWUgKiAzLjc4LFxuICAgICAgICAgICAgcTogKHZhbHVlKSA9PiB2YWx1ZSAqIDAuOTUsXG4gICAgICAgICAgICBpbjogKHZhbHVlKSA9PiB2YWx1ZSAqIDk2LFxuICAgICAgICAgICAgcGM6ICh2YWx1ZSkgPT4gdmFsdWUgKiAxNixcbiAgICAgICAgICAgIHB0OiAodmFsdWUpID0+IHZhbHVlICogMS4zMyxcblxuICAgICAgICAgICAgLy8gcmVsYXRpdmUgdW5pdFxuICAgICAgICAgICAgcmVtOiAodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgdmFsdWUgKlxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBlbTogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgIHZhbHVlICpcbiAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoXCJmb250LXNpemVcIilcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgdnc6ICh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAodmFsdWUgLyAxMDApICogZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmlubmVyV2lkdGgsXG4gICAgICAgICAgICB2aDogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICh2YWx1ZSAvIDEwMCkgKiBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuaW5uZXJIZWlnaHQsXG4gICAgICAgICAgICBcIiVcIjogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICh2YWx1ZSAvIDEwMCkgKlxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBpZiAodW5pdCBpbiBzdXBwb3J0ZWRVbml0cykgcmV0dXJuIHN1cHBvcnRlZFVuaXRzW3VuaXRdKHVuaXRWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qXG4gICAgICogUmV0dXJucyBpZiB0aGUgZm9udCBmb3IgdmlzaWJsZSB0ZXh0IG9mIHRoZSBlbGVtZW50IGlzIGRlZmluZWQgYnkgbWF0ZXJpYWwgaWNvbnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTWF0ZXJpYWxJY29uRm9udChlbGVtOiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGUgZXhpc3RlbmNlIG1hdGVyaWFsIGljb25zIHVzaW5nIGZldGNoIGluIG5vZGUgMTgrXG4gICAgICAgIC8vIGZvciBub3cgKG5vZGUgMTYpIGp1c3QgZGVydGVybWluZSBpZiB0aGUgc3R5bGVzaGVldCBmb3IgdGhlICdNYXRlcmlhbCBJY29ucycgZXhpc3RzIHN0YXRpY2FsbHkuIG5vdGUgdGhhdCB0aGUgbG9hZGluZyBvZiB0aGUgZm9udCBzdHlsZXNoZWV0IG9jY3VycyBhdCBydW4gdGltZS5cbiAgICAgICAgLy9saXN0IG9mIGtub3duIG1hdGVyaWFsIGljb25zIGFuZCBzdHlsZXNoZWV0IGxpbmtcbiAgICAgICAgY29uc3Qga25vd25faWNvbnMgPSB7XG4gICAgICAgICAgICBcIk1hdGVyaWFsIEljb25zXCI6XG4gICAgICAgICAgICAgICAgXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2ljb24/ZmFtaWx5PU1hdGVyaWFsK0ljb25zXCIsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGtub3duX2Nzc19jbGFzc2VzID0ge1xuICAgICAgICAgICAgXCJtYXRlcmlhbC1pY29uc1wiOlxuICAgICAgICAgICAgICAgIFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG1hdGVyaWFsIGljb24gZm9udCBjYW4gYmUgZGVmaW5lZCBlaXRoZXIgYnkgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucycgb3IgYnkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiXG4gICAgICAgIGxldCBzdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMoZWxlbSwgW1wiZm9udC1mYW1pbHlcIl0pO1xuICAgICAgICBsZXQgZm9udEZhbWlseSA9IHN0eWxlc1tcImZvbnQtZmFtaWx5XCJdO1xuXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAvLyBmb250LWZhbWlseSBzcGVjaWZpZXMgYSBwcmlvcml0aXplZCBsaXN0IG9mIG9uZSBvciBtb3JlIGZvbnQgZmFtaWx5IG5hbWVzXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGZvbnRGYW1pbHkgJiZcbiAgICAgICAgICAgIGZvbnRGYW1pbHkuc3BsaXQoXCIsXCIpWzBdLnJlcGxhY2UoL1snXCJdKy9nLCBcIlwiKS50cmltKCkgaW4ga25vd25faWNvbnNcbiAgICAgICAgKVxuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gZWxlbS5jbGFzc0xpc3Q7XG4gICAgICAgICAgICBmb3IgKGxldCBjc3NfY2xhc3MgaW4ga25vd25fY3NzX2NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdC5jb250YWlucyhjc3NfY2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZm91bmQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzdHlsZXNoZWV0IGZvciB0aGUgJ01hdGVyaWFsIEljb25zJyBleGlzdHMgc3RhdGljYWxseVxuICAgICAgICBsZXQgc2hlZXRzID0gZWxlbS5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzO1xuICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IHNoZWV0cy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNoZWV0cyAmJlxuICAgICAgICAgICAgICAgIHNoZWV0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhrbm93bl9pY29ucykuaW5kZXhPZihzaGVldHNbc10uaHJlZikgPiAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0V2VpZ2h0TnVtYmVyKHN0eWxlVmFsKSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBsaWdodDogMTAwLFxuICAgICAgICAgICAgYm9sZDogNzAwLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmV0VmFsID0gcGFyc2VJbnQoc3R5bGVWYWwpO1xuICAgICAgICBpZiAocmV0VmFsKSByZXR1cm4gcmV0VmFsO1xuICAgICAgICBpZiAoc3R5bGVWYWwgaW4gbWFwKSByZXR1cm4gbWFwW3N0eWxlVmFsXTtcbiAgICAgICAgcmV0dXJuIDQwMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEZvbnRJblBpeGVscyhzdHlsZVZhbCwgZWxlbSkge1xuICAgICAgICBsZXQgbWFwID0ge1xuICAgICAgICAgICAgXCJ4eC1zbWFsbFwiOiAxNixcbiAgICAgICAgICAgIFwieC1zbWFsbFwiOiAxMCxcbiAgICAgICAgICAgIHNtYWxsOiAxMyxcbiAgICAgICAgICAgIG1lZGl1bTogMTYsXG4gICAgICAgICAgICBsYXJnZTogMTgsXG4gICAgICAgICAgICBcIngtbGFyZ2VcIjogMjQsXG4gICAgICAgICAgICBcInh4LWxhcmdlXCI6IDMyLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZUZsb2F0KHN0eWxlVmFsKTtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcFtzdHlsZVZhbF07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVuaXRzID0gc3R5bGVWYWwuc3Vic3RyaW5nKChcIlwiICsgdmFsdWUpLmxlbmd0aCk7XG4gICAgICAgIC8qKlxuICAgICAgICBpZiAodW5pdHMgPT09IFwiXCIgfHwgdW5pdHMgPT09IFwicHhcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikgcmV0dXJuIHZhbHVlICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCIlXCIpIHJldHVybiB2YWx1ZSAvIDEwMCAqIDE2O1xuICAgICAgICBpZiAodW5pdHMgPT09IFwicHRcIikgcmV0dXJuIHZhbHVlICogNCAvIDM7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAqL1xuICAgICAgICByZXR1cm4gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXRzLCB2YWx1ZSwgZWxlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDU1NTdHlsZShlbGVtZW50KSB7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoZWxlbWVudC5JQk1fQ1NTX1RIQikgcmV0dXJuIGVsZW1lbnQuSUJNX0NTU19USEI7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHN0eWxlVGV4dCA9PT0gdW5kZWZpbmVkIHx8IHN0eWxlVGV4dC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgICB9IGVsc2UgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoc3R5bGVUZXh0ID09PSBudWxsIHx8IHN0eWxlVGV4dC50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICAgIC8vcmVtb3ZlIGNvbW1lbnQgYmxvY2tzXG4gICAgICAgIGxldCByZSA9IC8oXFwvXFwqKyg/Oig/Oig/OlteXFwqXSkrKXwoPzpbXFwqXSsoPyFcXC8pKSlbKl0rXFwvKXxcXC9cXC8uKi9nO1xuICAgICAgICBsZXQgc3Vic3QgPSBcIiBcIjtcbiAgICAgICAgc3R5bGVUZXh0ID0gc3R5bGVUZXh0LnJlcGxhY2UocmUsIHN1YnN0KTtcbiAgICAgICAgLy8gRmluZCBhbGwgXCJrZXkgOiB2YWw7XCIgcGFpcnMgd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgICAgIGxldCByS2V5VmFscyA9IC9cXHMqKFteOlxcc10rKVxccyo6XFxzKihbXjskfV0rKVxccyooO3wkKS9nO1xuICAgICAgICAvLyBGaW5kIGFsbCBcInNlbGVjdG9yIHsgY3Nza2V5dmFscyB9IHdpdGggdmFyaW91cyB3aGl0ZXNwYWNlIGluYmV0d2VlblxuICAgICAgICBsZXQgclNlbGVjdG9ycyA9IC9cXHMqKFtee10qKXsoW159XSopfS9nO1xuICAgICAgICBpZiAoc3R5bGVUZXh0LmluZGV4T2YoXCJ7XCIpID09PSAtMSkge1xuICAgICAgICAgICAgbGV0IGtleVZhbHMgPSB7fTtcbiAgICAgICAgICAgIGxldCBtO1xuICAgICAgICAgICAgd2hpbGUgKChtID0gcktleVZhbHMuZXhlYyhzdHlsZVRleHQpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAga2V5VmFsc1ttWzFdXSA9IG1bMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczoga2V5VmFscyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGVsZW1lbnQuSUJNX0NTU19USEIgPSByZXRWYWw7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICBsZXQgbTI7XG4gICAgICAgICAgICB3aGlsZSAoKG0gPSByU2VsZWN0b3JzLmV4ZWMoc3R5bGVUZXh0KSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBrZXlWYWxzID0ge307XG4gICAgICAgICAgICAgICAgbGV0IHNlbEtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgbGV0IHNlbFZhbCA9IG1bMl07XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoKG0yID0gcktleVZhbHMuZXhlYyhzZWxWYWwpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHNbbTJbMV1dID0gbTJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbEtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBrZXlWYWxzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudC5JQk1fQ1NTX1RIQiA9IHJldFZhbDtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBhbiBcImlubGluZVwiIENTUyBkaXNwbGF5IHByb3BlcnR5IHRlbGxzIHRoZSBlbGVtZW50IHRvIGZpdCBpdHNlbGYgb24gdGhlIHNhbWUgbGluZS4gQW4gJ2lubGluZScgZWxlbWVudCdzIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGlnbm9yZWQuXG4gICAgICogc29tZSBlbGVtZW50IGhhcyBkZWZhdWx0IGlubGluZSBwcm9wZXJ0eSwgc3VjaCBhcyA8c3Bhbj4sIDxhPlxuICAgICAqIG1vc3QgZm9ybWF0dGluZyBlbGVtZW50cyBpbmhlcmVudCBpbmxpbmUgcHJvcGVydHksIHN1Y2ggYXMgPGVtPiwgPHN0cm9uZz4sIDxpPiwgPHNtYWxsPlxuICAgICAqIG90aGVyIGlubGluZSBlbGVtZW50czogPGFiYnI+IDxhY3JvbnltPiA8Yj4gPGJkbz4gPGJpZz4gPGJyPiA8Y2l0ZT4gPGNvZGU+IDxkZm4+IDxlbT4gPGk+IDxpbnB1dD4gPGtiZD4gPGxhYmVsPlxuICAgICAqIDxtYXA+IDxvYmplY3Q+IDxvdXRwdXQ+IDxxPiA8c2FtcD4gPHNjcmlwdD4gPHNlbGVjdD4gPHNtYWxsPiA8c3Bhbj4gPHN0cm9uZz4gPHN1Yj4gPHN1cD4gPHRleHRhcmVhPiA8dGltZT4gPHR0PiA8dmFyPlxuICAgICAqIGFuIFwiaW5saW5lLWJsb2NrXCIgZWxlbWVudCBzdGlsbCBwbGFjZSBlbGVtZW50IGluIHRoZSBzYW1lIGxpbmUgd2l0aG91dCBicmVha2luZyB0aGUgbGluZSwgYnV0IHRoZSBlbGVtZW50J3Mgd2lkdGggYW5kIGhlaWdodCBhcmUgYXBwbGllZC5cbiAgICAgKiBpbmxpbmUtYmxvY2sgZWxlbWVudHM6IGltZywgYnV0dG9uLCBzZWxlY3QsIG1ldGVyLCBwcm9ncmVzcywgbWFyZ3VlZSwgYWxzbyBpbiBDaHJvbWU6IHRleHRhcmVhLCBpbnB1dFxuICAgICAqIEEgYmxvY2stbGV2ZWwgZWxlbWVudCBhbHdheXMgc3RhcnRzIG9uIGEgbmV3IGxpbmUsIGFuZCB0aGUgYnJvd3NlcnMgYXV0b21hdGljYWxseSBhZGQgc29tZSBzcGFjZSAoYSBtYXJnaW4pIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGVsZW1lbnQuXG4gICAgICogYmxvY2stbGV2ZWwgZWxlbWVudHM6IDxhZGRyZXNzPiA8YXJ0aWNsZT4gPGFzaWRlPiA8YmxvY2txdW90ZT4gPGNhbnZhcz4gPGRkPiA8ZGl2PiA8ZGw+IDxkdD4gPGZpZWxkc2V0PiA8ZmlnY2FwdGlvbj4gPGZpZ3VyZT4gPGZvb3Rlcj4gPGZvcm0+XG4gICAgICogPGgxPi08aDY+IDxoZWFkZXI+IDxocj4gPGxpPiA8bWFpbj4gPG5hdj4gPG5vc2NyaXB0PiA8b2w+IDxwPiA8cHJlPiA8c2VjdGlvbj4gPHRhYmxlPiA8dGZvb3Q+IDx1bD4gPHZpZGVvPlxuICAgICAqXG4gICAgICogcmV0dXJuOiBpZiBpdCdzIGlubGluZSBlbGVtZW50IGFuZCB7IGlubGluZTogdHJ1ZSB8IGZhbHNlLCB0ZXh0OiB0cnVlIHwgZmFsc2UsIHZpb2xhdGlvbjogbnVsbCB8IHtub2RlfSB9XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbmxpbmVTdGF0dXMoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGVsZW1fc3R5bCA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgICAgIGlmICghZWxlbV9zdHlsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgc3RhdHVzID0geyBpbmxpbmU6IGZhbHNlLCB0ZXh0OiBmYWxzZSwgdmlvbGF0aW9uOiBudWxsIH07XG4gICAgICAgIGNvbnN0IHVkaXNwbGF5ID0gZWxlbV9zdHlsLmdldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5XCIpO1xuICAgICAgICAvLyBpbmxpbmUgZWxlbWVudCBvbmx5XG4gICAgICAgIGlmICh1ZGlzcGxheSAhPT0gXCJpbmxpbmVcIikgcmV0dXJuIHN0YXR1cztcblxuICAgICAgICBzdGF0dXMuaW5saW5lID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIHN0YXR1cztcblxuICAgICAgICBjb25zdCBtYXBwZXI6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpO1xuICAgICAgICBjb25zdCBkaXNwbGF5ID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7XG4gICAgICAgIC8vIGFuIGlubGluZSBlbGVtZW50IGlzIGluc2lkZSBhIGJsb2NrLiBub3RlIDxib2R5PiBpcyBhIGJsb2NrIGVsZW1lbnQgdG9vXG4gICAgICAgIGlmIChkaXNwbGF5ICE9PSBcImJsb2NrXCIgJiYgZGlzcGxheSAhPT0gXCJpbmxpbmUtYmxvY2tcIikge1xuICAgICAgICAgICAgLy9wYXJlbnQgaXMgaW5saW5lIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybnMgXCJ5ZXNcIlwiOiBpbmxpbmUgd2l0aCB0ZXh0LCBcIm5vXCI6IGlubGluZSB3aXRob3V0IHRleHQsIFxuICAgICAgICAgKiAgICAgICAgICBcInZpb2xhdGlvblwiOiBub3Qgc3BhY2luZyBlbm91Z2ggdG8gbmVpYm9yaW5nIGlubGluZSB0YXJnZXRcbiAgICAgICAgICogICAgICAgICAgXCJibG9ja1wiOiBibG9jayBlbGVtZW50LCAgXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBpc0lubGluZVdpdGhUZXh0KG5vZGU6IE5vZGUsIGJlZm9yZTogYm9vbGVhbikgOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgICAgIC8vIG5vdGUgYnJvd3NlcnMgaW5zZXJ0IFRleHQgbm9kZXMgdG8gcmVwcmVzZW50IHdoaXRlc3BhY2VzLlxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVZhbHVlICYmIG5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ5ZXNcIjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5vXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiA8YnI+IGlzIHN0eWxlZCAnaW5saW5lJyBieSBkZWZhdWx0LCBidXQgY2hhbmdlIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJiclwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBjU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY0Rpc3BsYXkgPSBjU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7XG4gICAgICAgICAgICAgICAgaWYgKGNEaXNwbGF5ID09PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFyZ2V0KG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoIDwgMjQpIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGhvcml6b250YWwgc3BhY2luZyBpcyBzdWZmaWNpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYmVmb3JlICYmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCAvIDIpICsgYm91bmRzLmxlZnQgLSBibmRzLmxlZnQgPCAyNCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghYmVmb3JlICYmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCAvIDIpICsgYm91bmRzLmxlZnQgLSAoYm5kcy5sZWZ0ICsgYm5kcy53aWR0aCkgPCAyNCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy52aW9sYXRpb24gPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcInZpb2xhdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJub1wiOyAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzSW5uZXJUZXh0T25seUVtcHR5KG5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwieWVzXCI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5vXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbiBpbmxpbmUgZWxlbWVudCBpcyBpbnNpZGUgYSBibG9jay4gbm90ZSA8Ym9keT4gaXMgYSBibG9jayBlbGVtZW50IHRvb1xuICAgICAgICAvLyBvbmUgb3IgbW9yZSBpbmxpbmUgZWxlbWVudHMgd2l0aCB0ZXh0IGluIHRoZSBzYW1lIGxpbmU6IDx0YXJnZXQ+LCB0ZXh0PHRhcmdldD4sIDx0YXJnZXQ+dGV4dCwgPGlubGluZT4rdGV4dDx0YXJnZXQ+LCA8dGFyZ2V0PjxpbmxpbmU+K3RleHQsIHRleHQ8dGFyZ2V0PjxpbmxpbmU+K1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBlbGVtZW50Lm5leHRTaWJsaW5nO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGxldCBpbmxpbmVUZXh0ID0gaXNJbmxpbmVXaXRoVGV4dCh3YWxrTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaW5saW5lVGV4dCA9PT0gXCJ5ZXNcIikge1xuICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0ID09PSBcImJsb2NrXCIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGxldCBpbmxpbmVUZXh0ID0gaXNJbmxpbmVXaXRoVGV4dCh3YWxrTm9kZSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGlubGluZVRleHQgPT09IFwieWVzXCIpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMudGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5saW5lVGV4dCA9PT0gXCJibG9ja1wiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGEgdGFyZ2V0IGlzIGVuIGVsZW1lbnQgdGhhdCBhY2NlcHQgYSBwb2ludGVyIGFjdGlvbiAoY2xpY2sgb3IgdG91Y2gpXG4gICAgICogYSB0YXJnZXQgaXMgYSBicm93c2VyIGRlZmF1bHQgaWYgaXQncyBhIG5hdGl2ZSB3aWRnZXQgKG5vIHVzZXIgZGVmaW5lZCByb2xlKSB3aXRob3V0IHVzZXIgc3R5bGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFyZ2V0QnJvd3NlckRlZmF1bHQoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyB1c2VyIGRlZmluZWQgd2lkZ2V0XG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIG5vIHVzZXIgc3R5bGUgdG8gc3BhY2UgY29udHJvbCBzaXplLCBpbmNsdWRpbmcgdXNlIG9mIGZvbnRcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzKGVsZW1lbnQsIFtcbiAgICAgICAgICAgIFwibGluZS1oZWlnaHRcIiwgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiLFwibWluLWhlaWdodFwiLCBcIm1pbi13aWR0aFwiLFxuICAgICAgICAgICAgXCJmb250LXNpemVcIixcIm1hcmdpbi10b3BcIixcIm1hcmdpbi1ib3R0b21cIiwgXCJtYXJnaW4tbGVmdFwiLCBcIm1hcmdpbi1yaWdodFwiXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdHlsZXNbXCJsaW5lLWhlaWdodFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wiaGVpZ2h0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJ3aWR0aFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWluLWhlaWdodFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWluLXdpZHRoXCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJmb250LXNpemVcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi10b3BcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi1ib3R0b21cIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi1sZWZ0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJtYXJnaW4tcmlnaHRcIl1cbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogc3RyaW5nIGNvbnRhaW5zIENKSyAoY2hpbmVzZSwgamFwYW5lc2VzLCBvciBrb3JlYSlcbiAgICAgKiByZXR1cm46IGJvb2xlYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zQ0tKKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRleHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DSktfVW5pZmllZF9JZGVvZ3JhcGhzICBodHRwczovL2F5YWthLnNobi5oay9oYW5yZWdleC9cbiAgICAgICAgbGV0IHJlZ2V4ID0gLyg/OltcXHU0ZTAwLVxcdTlmZmZcXHUzNDAwLVxcdTRkYmZdKSsvZztcblxuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHRleHQudHJpbSgpLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuICAgICAgICBpZiAocmVwbGFjZWQubGVuZ3RoID09PSB0ZXh0LnRyaW0oKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGFuY2VzdG9yIHdpdGggdGhlIGdpdmVuIHN0eWxlIHByb3BlcnRpZXMuXG4gICAgICogU2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgYW4gYW5jZXN0b3IgdGhhdCBoYXMgQUxMIHNwZWNpZmllZCBzdHlsZSBwcm9wZXJ0aWVzXG4gICAgICogd2l0aCB2YWx1ZXMgbWF0Y2hpbmcgdGhlIGNyaXRlcmlhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtlbGVtZW50fSBlbGVtIC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0eWxlUHJvcHMgLSBUaGUgc3R5bGUgcHJvcGVydGllcyBhbmQgdmFsdWVzIG9mIHRoZSBwYXJlbnQgdG8gc2VhcmNoIGZvci5cbiAgICAgKiAgICAgICAgIHN1Y2ggYXMge1wib3ZlcmZsb3dcIjpbJ2F1dG8nLCAnc2Nyb2xsJ10sIFwib3ZlcmZsb3cteFwiOlsnYXV0bycsICdzY3JvbGwnXX1cbiAgICAgKiAgICAgICAgICBvciB7XCJvdmVyZmxvd1wiOlsnKiddLCBcIm92ZXJmbG93LXhcIjpbJyonXX0sIFRoZSAnKicgZm9yIGFueSB2YWx1ZSB0byBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIHRoZSBzdHlsZSBwcm9wLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGV4Y2x1ZGVkVmFsdWVzIC0gc3R5bGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQuXG4gICAgICogQHJldHVybiB7RWxlbWVudHxudWxsfSAtIEFuIGFuY2VzdG9yIGVsZW1lbnQgdGhhdCBoYXMgYWxsIHRoZSBzcGVjaWZpZWQgc3R5bGUgcHJvcGVydGllcywgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICogQG1lbWJlck9mIENTU1V0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFN0eWxlcyhlbGVtLCBzdHlsZVByb3BzLCBleGNsdWRlZFZhbHVlcyA9IFtdKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNhY2hlIGtleSB0aGF0IGluY2x1ZGVzIHRoZSBzdHlsZSBwcm9wZXJ0aWVzIGJlaW5nIHNlYXJjaGVkIGZvclxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IFwiQXJpYVV0aWxfQW5jZXN0b3JXaXRoU3R5bGVzX1wiICsgSlNPTi5zdHJpbmdpZnkoc3R5bGVQcm9wcykgKyBcIl9cIiArIEpTT04uc3RyaW5naWZ5KGV4Y2x1ZGVkVmFsdWVzKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGNhY2hlZCByZXN1bHQgZm9yIHRoaXMgc3BlY2lmaWMgcXVlcnlcbiAgICAgICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIGNhY2hlS2V5LCBudWxsKTtcbiAgICAgICAgaWYgKGNhY2hlZFJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdCA9PT0gXCJOT1RfRk9VTkRcIiA/IG51bGwgOiBjYWNoZWRSZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFydCB3aXRoIHRoZSBlbGVtZW50IGl0c2VsZiAobm90IGp1c3QgcGFyZW50KSB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IGVsZW07XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gU2tpcCBpZiBub3QgYW4gSFRNTEVsZW1lbnQgKGUuZy4sIFNWR0VsZW1lbnQpXG4gICAgICAgICAgICAvLyBVc2Ugbm9kZVR5cGUgY2hlY2sgaW5zdGVhZCBvZiBpbnN0YW5jZW9mIHRvIHdvcmsgYWNyb3NzIGRpZmZlcmVudCBkb2N1bWVudCBjb250ZXh0c1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVUeXBlICE9PSAxIHx8IHdhbGtOb2RlLm5hbWVzcGFjZVVSSSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiKSB7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyh3YWxrTm9kZSwgT2JqZWN0LmtleXMoc3R5bGVQcm9wcykpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBBTlkgc3BlY2lmaWVkIHN0eWxlIHByb3BlcnR5IG1hdGNoZXMgdGhlIGNyaXRlcmlhIChPUiBsb2dpYylcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGVQcm9wIGluIHN0eWxlUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBzdHlsZXNbc3R5bGVQcm9wXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByb3BlcnR5IG5vdCBkZWZpbmVkIG9uIHRoaXMgZWxlbWVudCwgdHJ5IG5leHQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSAhaW1wb3J0YW50IHN1ZmZpeCBmb3IgY29tcGFyaXNvblxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZhbHVlIHNob3VsZCBiZSBleGNsdWRlZFxuICAgICAgICAgICAgICAgIGlmIChleGNsdWRlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZhbHVlIG1hdGNoZXMgdGhlIGNyaXRlcmlhXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRWYWx1ZXMgPSBzdHlsZVByb3BzW3N0eWxlUHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkVmFsdWVzLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQW55IHZhbHVlIGlzIGFjY2VwdGFibGUgKGp1c3QgY2hlY2tpbmcgZXhpc3RlbmNlKVxuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgY2FjaGVLZXksIHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0ZWRWYWx1ZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFZhbHVlIG1hdGNoZXMgb25lIG9mIHRoZSBhY2NlcHRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIGNhY2hlS2V5LCB3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBObyBtYXRjaGluZyBlbGVtZW50IG9yIGFuY2VzdG9yIGZvdW5kIC0gY2FjaGUgdGhpcyByZXN1bHQgdG8gYXZvaWQgcmUtc2VhcmNoaW5nXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBjYWNoZUtleSwgXCJOT1RfRk9VTkRcIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBhbiBhcnJheSBbdmFsdWUsIFVuaXRdIGZyb20gYSB2YWx1ZS11bml0IGNvbWJvIHN0cmluZ1xuICAgICAqIEBwYXJhbSB2YWx1ZVVuaXRDb21ibywgc3VjaCBhcyAyMHB4LCAycmVtIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VmFsdWVVbml0UGFpcih2YWx1ZVVuaXRDb21ibykge1xuICAgICAgICBpZiAoIXZhbHVlVW5pdENvbWJvKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZVVuaXRDb21ibykpIHJldHVybiBbXCJweFwiLCB2YWx1ZVVuaXRDb21ib107XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUludCh2YWx1ZVVuaXRDb21ibyk7XG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHZhbHVlVW5pdENvbWJvID0gdmFsdWVVbml0Q29tYm8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBtYXRjaCA9IHZhbHVlVW5pdENvbWJvLnRyaW0oKS5tYXRjaCgvKFthLXpdKykkLyk7XG4gICAgICAgIGxldCB1bml0ID0gJ3B4JztcbiAgICAgICAgaWYgKG1hdGNoKSB1bml0ID0gbWF0Y2hbMV07XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gW3VuaXQsIHZhbHVlXTtcbiAgICB9XG5cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlRG9jdW1lbnQgZXh0ZW5kcyBEb2N1bWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cblxuZXhwb3J0IGNsYXNzIENhY2hlVXRpbCB7XG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZ2xvYmFsIHZhcmlhYmxlXG4gICAgICAgICAqIHdpdGggaXRzIGluaXRpYWwgdmFsdWUgYXMgZ2l2ZW4gKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENhY2hlKGNhY2hlU3BvdDogRWxlbWVudCB8IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwga2V5TmFtZSwgaW5pdFZhbHVlKSB7XG4gICAgICAgIGlmICghY2FjaGVTcG90KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY2FjaGVPYmogPSAoY2FjaGVTcG90Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLyB8fCBjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLykgPyBjYWNoZVNwb3QgYXMgQ2FjaGVEb2N1bWVudCA6IGNhY2hlU3BvdCBhcyBDYWNoZUVsZW1lbnQ7XG4gICAgICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjYWNoZU9iai5hY2VDYWNoZSA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID0gaW5pdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Q2FjaGUoY2FjaGVTcG90OiBEb2N1bWVudCB8IEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgU2hhZG93Um9vdCwgZ2xvYmFsTmFtZSwgdmFsdWUpOiBhbnkge1xuICAgICAgICBpZiAoIWNhY2hlU3BvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgICAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2dsb2JhbE5hbWVdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFNldENhY2hlKGNhY2hlU3BvdDogRWxlbWVudCB8IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwga2V5TmFtZSwgaW5pdEZ1bmM6ICgpID0+IGFueSkge1xuICAgICAgICBpZiAoIWNhY2hlU3BvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgICAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGVba2V5TmFtZV0gPSBpbml0RnVuYygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJDYWNoZXMoY2FjaGVSb290OiBOb2RlKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IG51bU5vZGVzVmlzaXRlZCA9IDA7XG4gICAgICAgIGRlbGV0ZSAoY2FjaGVSb290Lm93bmVyRG9jdW1lbnQgYXMgQ2FjaGVEb2N1bWVudCkuYWNlQ2FjaGU7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoY2FjaGVSb290LCBmYWxzZSwgY2FjaGVSb290LCB0cnVlKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgKytudW1Ob2Rlc1Zpc2l0ZWQ7XG4gICAgICAgICAgICBkZWxldGUgKG53Lm5vZGUgYXMgQ2FjaGVFbGVtZW50KS5hY2VDYWNoZTtcbiAgICAgICAgICAgIG53Lm5vZGUub3duZXJEb2N1bWVudCAmJiBkZWxldGUgKG53Lm5vZGUub3duZXJEb2N1bWVudCBhcyBDYWNoZURvY3VtZW50KS5hY2VDYWNoZTtcbiAgICAgICAgfSB3aGlsZSAobncubmV4dE5vZGUoKSk7XG4gICAgICAgIGlmIChjYWNoZVJvb3QgIT09IGNhY2hlUm9vdC5vd25lckRvY3VtZW50Py5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSB3YWxrZXIgYXQgdGhlIGRvY3VtZW50RWxlbWVudCBvZiBjYWNoZVJvb3QncyBpbW1lZGlhdGUgZG9jdW1lbnQuXG4gICAgICAgICAgICAvLyBvd25lckRvY3VtZW50IGlzIGd1YXJhbnRlZWQgbm9uLW51bGwgaGVyZSBiZWNhdXNlIHRoZSBpZi1ndWFyZCBhYm92ZVxuICAgICAgICAgICAgLy8gY2hlY2tzIGNhY2hlUm9vdC5vd25lckRvY3VtZW50Py5kb2N1bWVudEVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgbndEb2MgPSBuZXcgRE9NV2Fsa2VyKGNhY2hlUm9vdC5vd25lckRvY3VtZW50IS5kb2N1bWVudEVsZW1lbnQsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICAgICAgLy8gY2FjaGVSb290IG1heSBiZSBpbnNpZGUgYSBzaGFkb3cgcm9vdCBvciBhbiBpZnJhbWUsIHdoaWNoIGFyZSB0aGVtc2VsdmVzXG4gICAgICAgICAgICAvLyBuZXN0ZWQgaW5zaWRlIGFuY2VzdG9yIGRvY3VtZW50cy4gV2FsayB1cCBmcm9tIGNhY2hlUm9vdCBhY3Jvc3MgYW55XG4gICAgICAgICAgICAvLyBmcmFtZS9zaGFkb3cgYm91bmRhcmllcyAoRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQgaGFuZGxlcyBvd25lckVsZW1lbnRcbiAgICAgICAgICAgIC8vIGxpbmtzIHNldCBieSB0aGUgd2Fsa2VyKSB0byBmaW5kIHRoZSBvdXRlcm1vc3QgYW5jZXN0b3IgZWxlbWVudCwgdGhlblxuICAgICAgICAgICAgLy8gcmVwb3NpdGlvbiB0aGUgd2Fsa2VyIHRoZXJlIHNvIHRoZSBzZWNvbmQgcGFzcyBjb3ZlcnMgZXZlcnkgY29udGFpbmluZ1xuICAgICAgICAgICAgLy8gZG9jdW1lbnQgYXMgd2VsbC5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVtcEVsZW06IEVsZW1lbnQgPSBud0RvYy5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEVsZW06IEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnRFbGVtID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQodGVtcEVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBFbGVtID0gcGFyZW50RWxlbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbndEb2Mubm9kZSA9IHRlbXBFbGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIC8vIE9uIHRoZSBzdGFydC10YWcgdmlzaXQgb2YgY2FjaGVSb290LCBza2lwIGl0cyBlbnRpcmUgc3VidHJlZSDigJRcbiAgICAgICAgICAgICAgICAvLyBpdCB3YXMgYWxyZWFkeSBjbGVhcmVkIGFuZCBjb3VudGVkIGluIHRoZSBmaXJzdCBwYXNzIGFib3ZlLlxuICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgYkVuZFRhZz10cnVlIG1ha2VzIHRoZSBuZXh0IG5leHROb2RlKCkgY2FsbCBlbWl0IGNhY2hlUm9vdCdzXG4gICAgICAgICAgICAgICAgLy8gZW5kLXRhZyBhbmQgdGhlbiBhZHZhbmNlIHRvIGl0cyBuZXh0IHNpYmxpbmcgd2l0aG91dCBkZXNjZW5kaW5nIGludG9cbiAgICAgICAgICAgICAgICAvLyBpdHMgY2hpbGRyZW4uXG4gICAgICAgICAgICAgICAgaWYgKCFud0RvYy5iRW5kVGFnICYmIERPTVV0aWwuc2FtZU5vZGUoY2FjaGVSb290LCBud0RvYy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBud0RvYy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSAobndEb2Mubm9kZSBhcyBhbnkpLmFjZUNhY2hlO1xuICAgICAgICAgICAgICAgIG53RG9jLm5vZGUub3duZXJEb2N1bWVudCAmJiBkZWxldGUgKG53RG9jLm5vZGUub3duZXJEb2N1bWVudCBhcyBhbnkpLmFjZUNhY2hlO1xuICAgICAgICAgICAgfSB3aGlsZSAobndEb2MubmV4dE5vZGUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVtTm9kZXNWaXNpdGVkO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4vQ1NTVXRpbFwiO1xuXG5leHBvcnQgY2xhc3MgQ2xpcFBhdGhVdGlsIHtcbiAgICBcbiAgICBwcml2YXRlIHN0YXRpYyBUSFJFU0hPTEQgOiBudW1iZXIgPSA1OyAgLy8gNXB4XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgdGhlIG5vZGUgdGhhdCBpcyB2aXN1YWxseSBoaWRkZW4gYnkgY3NzIGNsaXAtcGF0aDpcbiAgICAgKlxuICAgICAqIE5vdGUgMTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgdmlzdWFsbHkgaGlkZGVuIHRoZW4gdGhpc1xuICAgICAqICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRydWUgKG5vZGUgaXMgbm90IHZpc3VhbGx5IGhpZGRlbikuXG4gICAgICpcbiAgICAgKiBOb3RlIDI6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgY2xpcC1wYXRoLCB0aGUgY29udGVudCBpcyBub3QgY29uc2lkZXJlZCBoaWRkZW4gdG8gYW4gQVQuIFRleHQgaGlkZGVuIHdpdGggdGhlc2UgbWV0aG9kcyBcbiAgICAgKiAgICAgIGNhbiBzdGlsbCBiZSByZWVkYWJsZSBieSBzY3JlZW4gcmVhZGVycy4gXG4gICAgICogTm90ZSAzOiBpZiBhIGxpbmssIGZvcm0gY29udHJvbCwgb3Igb3RoZXIgZm9jdXNhYmxlIGVsZW1lbnQgaXMgZ2l2ZW4gdGhpcyBzdHlsZSwgdGhlIGVsZW1lbnQgd291bGQgYmUgZm9jdXNhYmxlIGJ1dCBub3QgdmlzaWJsZSwgXG4gICAgICogICAgICBrZXlib2FyZCB1c2VycyBtaWdodCBiZSBjb25mdXNlZC4gICAgXG4gICAgICogXG4gICAgICogQHBhcm0ge05vZGV9IG5vZGUgVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaWYgaXQgaXMgdmlzdWFsbHkgaGlkZGVuIG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIHRoZSBub2RlIGlzIHZpc3VhbGx5IGhpZGRlbiwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgVmlzVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlVmlzdWFsbHlIaWRkZW5CeUNsaXBQYXRoKG5vZGU6IE5vZGUpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBsZXQgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBoaWRkZW4gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoaGlkZGVuICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gaGlkZGVuO1xuICAgICAgICAgICAgXG4gICAgICAgIGNvbnN0IHN0eWxlID0gQ1NTVXRpbC5nZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KHN0eWxlLndpZHRoKTsgIC8vYWx3YXlzIGluIHB4XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHBhcnNlSW50KHN0eWxlLmhlaWdodCk7IC8vYWx3YXlzIGluIHB4XG5cbiAgICAgICAgbGV0IHBhdGggPSBzdHlsZVsnY2xpcC1wYXRoJ107IFxuICAgICAgICBpZiAoIXBhdGggfHwgcGF0aC50cmltKCkgPT09ICdub25lJyB8fCBwYXRoLnRyaW0oKSA9PT0gJycpICB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHBhdGggPSBwYXRoLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcgJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBpbmRleCA9IHBhdGguaW5kZXhPZihcImluc2V0KFwiKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgeyBcbiAgICAgICAgICAgIGxldCByb3VuZF9pbmRleCA9IHBhdGguaW5kZXhPZihcInJvdW5kXCIpO1xuICAgICAgICAgICAgbGV0IHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBpZiAocm91bmRfaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcm91bmRfaW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgLy8gV2hlbiBvbmUgdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCBhcHBsaWVzIHRoZSBzYW1lIGluc2V0IHRvIGFsbCBmb3VyIHNpZGVzXG4gICAgICAgICAgICBpZiAobnVtYmVycy5sZW5ndGggPT09IDEpICB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gQ2xpcFBhdGhVdGlsLmlzQ2xpcHBlZEJ5SW5zZXQoZWxlbSwgbnVtYmVyc1swXSwgbnVtYmVyc1swXSwgbnVtYmVyc1swXSwgbnVtYmVyc1swXSk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgcmV0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXaGVuIHR3byB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIGZpcnN0IHZhbHVlIGFwcGxpZXMgdG8gdGhlIHRvcCBhbmQgYm90dG9tLCB0aGUgc2Vjb25kIHRvIHRoZSBsZWZ0IGFuZCByaWdodC5cbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA9PT0gMikgeyBcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBDbGlwUGF0aFV0aWwuaXNDbGlwcGVkQnlJbnNldChlbGVtLCBudW1iZXJzWzBdLCBudW1iZXJzWzFdLCBudW1iZXJzWzBdLCBudW1iZXJzWzFdKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdoZW4gdGhyZWUgdmFsdWVzIGFyZSBzcGVjaWZpZWQsIHRoZSBmaXJzdCBhcHBsaWVzIHRvIHRoZSB0b3AsIHRoZSBzZWNvbmQgdG8gdGhlIHJpZ2h0IGFuZCBsZWZ0LCB0aGUgdGhpcmQgdG8gdGhlIGJvdHRvbS5cbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IENsaXBQYXRoVXRpbC5pc0NsaXBwZWRCeUluc2V0KGVsZW0sIG51bWJlcnNbMF0sIG51bWJlcnNbMV0sIG51bWJlcnNbMV0sIG51bWJlcnNbMl0pOyBcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7IFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXaGVuIGZvdXIgdmFsdWVzIGFyZSBzcGVjaWZpZWQsIHRoZSB2YWx1ZXMgYXBwbHkgdG8gdGhlIHRvcCwgcmlnaHQsIGJvdHRvbSwgYW5kIGxlZnQgaW4gdGhhdCBvcmRlciAoY2xvY2t3aXNlKS5cbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IENsaXBQYXRoVXRpbC5pc0NsaXBwZWRCeUluc2V0KGVsZW0sIG51bWJlcnNbMF0sIG51bWJlcnNbMV0sIG51bWJlcnNbMl0sIG51bWJlcnNbM10pOyBcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9ICAgICBcblxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpbmRleCA9IHBhdGguaW5kZXhPZihcInJlY3QoXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgcm91bmRfaW5kZXggPSBwYXRoLmluZGV4T2YoXCJyb3VuZFwiKTtcbiAgICAgICAgICAgIGxldCBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgaWYgKHJvdW5kX2luZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHJvdW5kX2luZGV4KTtcblxuICAgICAgICAgICAgbGV0IG51bWJlcnMgPSBzdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgZmlyc3QgKHRvcCkgYW5kIHRoaXJkIChib3R0b20pIHZhbHVlcyBhcmUgZGlzdGFuY2VzIGZyb20gdGhlIHRvcCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrLCBcbiAgICAgICAgICAgICAqIGFuZCB0aGUgc2Vjb25kIChyaWdodCkgYW5kIGZvdXJ0aCAobGVmdCkgdmFsdWVzIGFyZSBkaXN0YW5jZXMgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBjb250YWluaW5nIGJsb2NrLiBcbiAgICAgICAgICAgICAqIFRoZSBzZWNvbmQgKHJpZ2h0KSBhbmQgdGhpcmQgKGJvdHRvbSkgdmFsdWVzIGFyZSBjbGFtcGVkIGJ5IHRoZSBmb3VydGggKGxlZnQpIGFuZCBmaXJzdCAodG9wKSB2YWx1ZXMsIHJlc3BlY3RpdmVseSwgXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogSWYgYXV0byBpcyB1c2VkIGZvciB0aGUgZmlyc3QgKHRvcCkgb3IgZm91cnRoIChsZWZ0KSB2YWx1ZSwgdGhlIHZhbHVlIG9mIGF1dG8gaXMgMCwgXG4gICAgICAgICAgICAgKiBhbmQgaWYgdXNlZCBmb3IgdGhlIHNlY29uZCAocmlnaHQpIG9yIHRoaXJkIChib3R0b20pIHZhbHVlLCB0aGUgdmFsdWUgb2YgYXV0byBpcyAxMDAlLlxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdPT09J2F1dG8nKSBudW1iZXJzWzBdID0gJzBweCc7XG4gICAgICAgICAgICBpZiAobnVtYmVyc1szXT09PSdhdXRvJykgbnVtYmVyc1szXSA9ICcwcHgnO1xuICAgICAgICAgICAgaWYgKG51bWJlcnNbMV09PT0nYXV0bycpIG51bWJlcnNbMV0gPSAnMTAwJSc7XG4gICAgICAgICAgICBpZiAobnVtYmVyc1syXT09PSdhdXRvJykgbnVtYmVyc1syXSA9ICcxMDAlJztcblxuICAgICAgICAgICAgLy8gdG8gcHJldmVudCB0aGUgYm90dG9tIGVkZ2UgZnJvbSBjcm9zc2luZyBvdmVyIHRoZSB0b3AgZWRnZSBhbmQgcmlnaHQgZWRnZSBmcm9tIGNyb3NzaW5nIG92ZXIgdGhlIGxlZnQgZWRnZS4gXG4gICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgcmVjdCgxMHB4IDAgMCAyMHB4KSBpcyBjbGFtcGVkIHRvIHJlY3QoMTBweCAyMHB4IDEwcHggMjBweClcbiAgICAgICAgICAgIG51bWJlcnNbMl0gPSBNYXRoLm1heChudW1iZXJzWzBdLCBudW1iZXJzWzJdKTtcbiAgICAgICAgICAgIG51bWJlcnNbMV0gPSBNYXRoLm1heChudW1iZXJzWzFdLCBudW1iZXJzWzNdKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgdG9wID0gcGFyc2VJbnQobnVtYmVyc1swXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4odG9wKSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICB0b3AgPSB0b3AgKiBoZWlnaHQvMTAwO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIodG9wKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRvcCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAodG9wID49IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gcGFyc2VJbnQobnVtYmVyc1szXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4obGVmdCkpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobnVtYmVyc1szXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQgKiB3aWR0aC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihsZWZ0KTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxlZnQgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGVmdCA+PSB3aWR0aCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCByaWdodCA9IHBhcnNlSW50KG51bWJlcnNbMV0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHJpZ2h0KSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzFdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0ICogd2lkdGgvMTAwO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmlnaHQpO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmlnaHQgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBib3R0b20gPSBwYXJzZUludChudW1iZXJzWzJdKTtcbiAgICAgICAgICAgIGlmIChpc05hTihib3R0b20pKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMl0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIGJvdHRvbSA9IGJvdHRvbSAqIGhlaWdodC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihib3R0b20pO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm90dG9tID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoKGJvdHRvbSAtIHRvcCkgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCAgfHwgKHJpZ2h0IC0gbGVmdCkgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4T2YoXCJ4eXdoKFwiKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGV0IHJvdW5kX2luZGV4ID0gcGF0aC5pbmRleE9mKFwicm91bmRcIik7XG4gICAgICAgICAgICBsZXQgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCBwYXRoLmluZGV4T2YoXCIpXCIpKTtcbiAgICAgICAgICAgIGlmIChyb3VuZF9pbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCByb3VuZF9pbmRleCk7XG5cbiAgICAgICAgICAgIGxldCBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG5cbiAgICAgICAgICAgIGxldCB4ID0gcGFyc2VJbnQobnVtYmVyc1swXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4oeCkpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtYmVyc1swXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgeCA9IHggKiB3aWR0aC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih0b3ApO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh4ID49IHdpZHRoKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHkgPSBwYXJzZUludChudW1iZXJzWzFdKTtcbiAgICAgICAgICAgIGlmIChpc05hTih5KSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzFdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICB5ID0geSAqIGhlaWdodC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih5KTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNjcm9sbFkgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeSA+PSBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdyA9IHBhcnNlSW50KG51bWJlcnNbMl0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHcpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMl0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIHcgPSB3ICogd2lkdGgvMTAwO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIodyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3ID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHcgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgaCA9IHBhcnNlSW50KG51bWJlcnNbM10pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKGgpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbM10uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIGggPSBoICogaGVpZ2h0LzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGgpO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGggPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKFwiY2lyY2xlKFwiKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGV0IHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBsZXQgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgcmFkaXVzID0gcGFyc2VJbnQobnVtYmVyc1swXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4ocmFkaXVzKSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBzaG9ydCA9IHdpZHRoID4gaGVpZ2h0ID8gaGVpZ2h0IDogd2lkdGg7XG4gICAgICAgICAgICAgICAgcmFkaXVzID0gcmFkaXVzICogc2hvcnQvMTAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHJhZGl1cyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByYWRpdXMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyYWRpdXMgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICBcbiAgICAgICAgfSAgICBcbiAgICAgICAgXG4gICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKFwiZWxsaXBzZShcIik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgbGV0IG51bWJlcnMgPSBzdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcblxuICAgICAgICAgICAgLy8gZWxsaXBzZShjbG9zZXN0LXNpZGUgZmFydGhlc3Qtc2lkZSBhdCAzMCUgNDAlKTtcbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA+IDMgJiYgbnVtYmVyc1swXSA9PT0gJ2Nsb3Nlc3Qtc2lkZScgJiYgbnVtYmVyc1sxXSA9PT0gJ2ZhcnRoZXN0LXNpZGUnICYmIG51bWJlcnNbMl0gPT09ICdhdCcpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmFkaXVzID0gcGFyc2VJbnQobnVtYmVyc1szXSk7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXJzWzNdLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gd2lkdGggPiBoZWlnaHQgPyBoZWlnaHQgOiB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IHJhZGl1cyAqIHZhbHVlLzEwMDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmFkaXVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByYWRpdXMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGl1cyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlcnMubGVuZ3RoID09PSA1KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MzsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByYWRpdXMgPSBwYXJzZUludChudW1iZXJzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXJzW2ldLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IChpID09PSAzKSA/IHdpZHRoIDogaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IHJhZGl1cyAqIHZhbHVlLzEwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihyYWRpdXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGl1cyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfSAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZWxsaXBzZSg0MCUgNTAlIGF0IGxlZnQpO1xuICAgICAgICAgICAgbGV0IGF0X2luZGV4ID0gcGF0aC5pbmRleE9mKFwiYXRcIik7XG4gICAgICAgICAgICBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgaWYgKGF0X2luZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIGF0X2luZGV4KTtcblxuICAgICAgICAgICAgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByYWRpdXMgPSBwYXJzZUludChudW1iZXJzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyc1tpXS5lbmRzV2l0aChcIiVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gKGkgPT09IDApID8gd2lkdGggOiBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IHJhZGl1cyAqIHZhbHVlLzEwMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHJhZGl1cyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJhZGl1cyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcbiAgICAgICAgICAgXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCA9IHBhdGguaW5kZXhPZihcInBvbHlnb24oXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCBwYXRoLmluZGV4T2YoXCIpXCIpKTtcbiAgICAgICAgICAgIGxldCBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIHBvbHlnb24obm9uemVyb3xldmVub2RkLCAwJSAwJSwgNTAlIDUwJSwgMCUgMTAwJSlcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdID09PSAnbm9uemVybycgfHwgbnVtYmVyc1swXSA9PT0gJ2V2ZW5vZGQnKVxuICAgICAgICAgICAgICAgIG51bWJlcnMuc2hpZnQoKTtcblxuICAgICAgICAgICAgbGV0IHkgPSAwO1xuICAgICAgICAgICAgbGV0IHggPSAwO1xuICAgICAgICAgICAgbGV0IGNoYW5nZWRfeCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGNoYW5nZWRfeSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjb29yZGluYXRlcyA9IG51bWJlcnNbaV0udHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXMubGVuZ3RoICE9IDIgKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBjb29yZGluYXRlX3h5ID0gWzAsIDBdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPTA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gcGFyc2VJbnQoY29vcmRpbmF0ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzW2ldLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVfeHlbaV0gPSAoaSA9PT0gMCkgPyB2YWx1ZSAqIHdpZHRoLzEwMCA6IHZhbHVlICogaGVpZ2h0LzEwMDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGNvb3JkaW5hdGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFpcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZV94eVtpXSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB4ID0gY29vcmRpbmF0ZV94eVswXTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IGNvb3JkaW5hdGVfeHlbMV07XG4gICAgICAgICAgICAgICAgfSBcblxuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhjb29yZGluYXRlX3h5WzBdIC0geCkgPj0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkgXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRfeCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGNvb3JkaW5hdGVfeHlbMV0gLSB5KSA+PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSBcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZF95ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGFuZ2VkX3ggJiYgY2hhbmdlZF95KSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gIFxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAgICAgIFxuXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzQ2xpcHBlZEJ5SW5zZXQoZWxlbSwgdG9wLCByaWdodCA9ICcwcHgnLCBib3R0b20gPSAnMHB4JywgbGVmdCA9ICcwcHgnKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gQ1NTVXRpbC5nZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KHN0eWxlLndpZHRoKTsgIC8vYWx3YXlzIGluIHB4XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHBhcnNlSW50KHN0eWxlLmhlaWdodCk7IC8vYWx3YXlzIGluIHB4XG4gICAgICAgIFxuICAgICAgICAvLyB0b3BcbiAgICAgICAgbGV0IHRvcF92YWx1ZSA9IHBhcnNlSW50KHRvcCk7XG4gICAgICAgIGlmIChpc05hTih0b3BfdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRvcC5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICB0b3BfdmFsdWUgPSB0b3BfdmFsdWUgKiBoZWlnaHQvMTAwO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIodG9wKTtcbiAgICAgICAgICAgIGlmICghcGFpcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdG9wX3ZhbHVlID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pbnNldCBvdXRzaWRlIG9mIHRoZSBjb250YWluZXJcbiAgICAgICAgaWYgKHRvcF92YWx1ZSA+IGhlaWdodCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIHJpZ2h0XG4gICAgICAgIGxldCByaWdodF92YWx1ZSA9IHBhcnNlSW50KHJpZ2h0KTtcbiAgICAgICAgaWYgKGlzTmFOKHJpZ2h0X3ZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmIChyaWdodC5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICByaWdodF92YWx1ZSA9IHJpZ2h0X3ZhbHVlICogd2lkdGgvMTAwO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmlnaHQpO1xuICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByaWdodF92YWx1ZSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvL2luc2V0IG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICBpZiAocmlnaHRfdmFsdWUgPiB3aWR0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIGJvdHRvbVxuICAgICAgICBsZXQgYm90dG9tX3ZhbHVlID0gcGFyc2VJbnQoYm90dG9tKTtcbiAgICAgICAgaWYgKGlzTmFOKGJvdHRvbV92YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoYm90dG9tLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgIGJvdHRvbV92YWx1ZSA9IGJvdHRvbV92YWx1ZSAqIGhlaWdodC8xMDA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihib3R0b20pO1xuICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBib3R0b21fdmFsdWUgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9pbnNldCBvdXRzaWRlIG9mIHRoZSBjb250YWluZXJcbiAgICAgICAgaWYgKGJvdHRvbV92YWx1ZSA+IGhlaWdodCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIGxlZnRcbiAgICAgICAgbGV0IGxlZnRfdmFsdWUgPSBwYXJzZUludChsZWZ0KTtcbiAgICAgICAgaWYgKGlzTmFOKGxlZnRfdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKGxlZnQuZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgbGVmdF92YWx1ZSA9IGxlZnRfdmFsdWUgKiB3aWR0aC8xMDA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihsZWZ0KTtcbiAgICAgICAgICAgIGlmICghcGFpcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGVmdF92YWx1ZSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvL2luc2V0IG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICBpZiAobGVmdF92YWx1ZSA+IHdpZHRoKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKGhlaWdodCAtICh0b3BfdmFsdWUgKyBib3R0b21fdmFsdWUpIDw9IENsaXBQYXRoVXRpbC5USFJFU0hPTEQgIHx8IHdpZHRoIC0gKHJpZ2h0X3ZhbHVlICsgbGVmdF92YWx1ZSkgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCkgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY2xhc3MgQ29sb3JVdGlsIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgQ1NTQ29sb3JMb29rdXAgPSB7XG4gICAgICAgIFwiYWxpY2VibHVlXCI6IFwiI2YwZjhmZlwiLFxuICAgICAgICBcImFudGlxdWV3aGl0ZVwiOiBcIiNmYWViZDdcIixcbiAgICAgICAgXCJhcXVhXCI6IFwiIzAwZmZmZlwiLFxuICAgICAgICBcImFxdWFtYXJpbmVcIjogXCIjN2ZmZmQ0XCIsXG4gICAgICAgIFwiYXp1cmVcIjogXCIjZjBmZmZmXCIsXG4gICAgICAgIFwiYmVpZ2VcIjogXCIjZjVmNWRjXCIsXG4gICAgICAgIFwiYmlzcXVlXCI6IFwiI2ZmZTRjNFwiLFxuICAgICAgICBcImJsYWNrXCI6IFwiIzAwMDAwMFwiLFxuICAgICAgICBcImJsYW5jaGVkYWxtb25kXCI6IFwiI2ZmZWJjZFwiLFxuICAgICAgICBcImJsdWVcIjogXCIjMDAwMGZmXCIsXG4gICAgICAgIFwiYmx1ZXZpb2xldFwiOiBcIiM4YTJiZTJcIixcbiAgICAgICAgXCJicm93blwiOiBcIiNhNTJhMmFcIixcbiAgICAgICAgXCJidXJseXdvb2RcIjogXCIjZGViODg3XCIsXG4gICAgICAgIFwiY2FkZXRibHVlXCI6IFwiIzVmOWVhMFwiLFxuICAgICAgICBcImNoYXJ0cmV1c2VcIjogXCIjN2ZmZjAwXCIsXG4gICAgICAgIFwiY2hvY29sYXRlXCI6IFwiI2QyNjkxZVwiLFxuICAgICAgICBcImNvcmFsXCI6IFwiI2ZmN2Y1MFwiLFxuICAgICAgICBcImNvcm5mbG93ZXJibHVlXCI6IFwiIzY0OTVlZFwiLFxuICAgICAgICBcImNvcm5zaWxrXCI6IFwiI2ZmZjhkY1wiLFxuICAgICAgICBcImNyaW1zb25cIjogXCIjZGMxNDNjXCIsXG4gICAgICAgIFwiY3lhblwiOiBcIiMwMGZmZmZcIixcbiAgICAgICAgXCJkYXJrYmx1ZVwiOiBcIiMwMDAwOGJcIixcbiAgICAgICAgXCJkYXJrY3lhblwiOiBcIiMwMDhiOGJcIixcbiAgICAgICAgXCJkYXJrZ29sZGVucm9kXCI6IFwiI2I4ODYwYlwiLFxuICAgICAgICBcImRhcmtncmF5XCI6IFwiI2E5YTlhOVwiLFxuICAgICAgICBcImRhcmtncmVlblwiOiBcIiMwMDY0MDBcIixcbiAgICAgICAgXCJkYXJra2hha2lcIjogXCIjYmRiNzZiXCIsXG4gICAgICAgIFwiZGFya21hZ2VudGFcIjogXCIjOGIwMDhiXCIsXG4gICAgICAgIFwiZGFya29saXZlZ3JlZW5cIjogXCIjNTU2YjJmXCIsXG4gICAgICAgIFwiZGFya29yYW5nZVwiOiBcIiNmZjhjMDBcIixcbiAgICAgICAgXCJkYXJrb3JjaGlkXCI6IFwiIzk5MzJjY1wiLFxuICAgICAgICBcImRhcmtyZWRcIjogXCIjOGIwMDAwXCIsXG4gICAgICAgIFwiZGFya3NhbG1vblwiOiBcIiNlOTk2N2FcIixcbiAgICAgICAgXCJkYXJrc2VhZ3JlZW5cIjogXCIjOGZiYzhmXCIsXG4gICAgICAgIFwiZGFya3NsYXRlYmx1ZVwiOiBcIiM0ODNkOGJcIixcbiAgICAgICAgXCJkYXJrc2xhdGVncmF5XCI6IFwiIzJmNGY0ZlwiLFxuICAgICAgICBcImRhcmt0dXJxdW9pc2VcIjogXCIjMDBjZWQxXCIsXG4gICAgICAgIFwiZGFya3Zpb2xldFwiOiBcIiM5NDAwZDNcIixcbiAgICAgICAgXCJkZWVwcGlua1wiOiBcIiNmZjE0OTNcIixcbiAgICAgICAgXCJkZWVwc2t5Ymx1ZVwiOiBcIiMwMGJmZmZcIixcbiAgICAgICAgXCJkaW1ncmF5XCI6IFwiIzY5Njk2OVwiLFxuICAgICAgICBcImRvZGdlcmJsdWVcIjogXCIjMWU5MGZmXCIsXG4gICAgICAgIFwiZmlyZWJyaWNrXCI6IFwiI2IyMjIyMlwiLFxuICAgICAgICBcImZsb3JhbHdoaXRlXCI6IFwiI2ZmZmFmMFwiLFxuICAgICAgICBcImZvcmVzdGdyZWVuXCI6IFwiIzIyOGIyMlwiLFxuICAgICAgICBcImZ1Y2hzaWFcIjogXCIjZmYwMGZmXCIsXG4gICAgICAgIFwiZ2FpbnNib3JvXCI6IFwiI2RjZGNkY1wiLFxuICAgICAgICBcImdob3N0d2hpdGVcIjogXCIjZjhmOGZmXCIsXG4gICAgICAgIFwiZ29sZFwiOiBcIiNmZmQ3MDBcIixcbiAgICAgICAgXCJnb2xkZW5yb2RcIjogXCIjZGFhNTIwXCIsXG4gICAgICAgIFwiZ3JheVwiOiBcIiM4MDgwODBcIixcbiAgICAgICAgXCJncmVlblwiOiBcIiMwMDgwMDBcIixcbiAgICAgICAgXCJncmVlbnllbGxvd1wiOiBcIiNhZGZmMmZcIixcbiAgICAgICAgXCJob25leWRld1wiOiBcIiNmMGZmZjBcIixcbiAgICAgICAgXCJob3RwaW5rXCI6IFwiI2ZmNjliNFwiLFxuICAgICAgICBcImluZGlhbnJlZFwiOiBcIiNjZDVjNWNcIixcbiAgICAgICAgXCJpbmRpZ29cIjogXCIjNGIwMDgyXCIsXG4gICAgICAgIFwiaXZvcnlcIjogXCIjZmZmZmYwXCIsXG4gICAgICAgIFwia2hha2lcIjogXCIjZjBlNjhjXCIsXG4gICAgICAgIFwibGF2ZW5kZXJcIjogXCIjZTZlNmZhXCIsXG4gICAgICAgIFwibGF2ZW5kZXJibHVzaFwiOiBcIiNmZmYwZjVcIixcbiAgICAgICAgXCJsYXduZ3JlZW5cIjogXCIjN2NmYzAwXCIsXG4gICAgICAgIFwibGVtb25jaGlmZm9uXCI6IFwiI2ZmZmFjZFwiLFxuICAgICAgICBcImxpZ2h0Ymx1ZVwiOiBcIiNhZGQ4ZTZcIixcbiAgICAgICAgXCJsaWdodGNvcmFsXCI6IFwiI2YwODA4MFwiLFxuICAgICAgICBcImxpZ2h0Y3lhblwiOiBcIiNlMGZmZmZcIixcbiAgICAgICAgXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBcIiNmYWZhZDJcIixcbiAgICAgICAgXCJsaWdodGdyZXlcIjogXCIjZDNkM2QzXCIsXG4gICAgICAgIFwibGlnaHRncmVlblwiOiBcIiM5MGVlOTBcIixcbiAgICAgICAgXCJsaWdodHBpbmtcIjogXCIjZmZiNmMxXCIsXG4gICAgICAgIFwibGlnaHRzYWxtb25cIjogXCIjZmZhMDdhXCIsXG4gICAgICAgIFwibGlnaHRzZWFncmVlblwiOiBcIiMyMGIyYWFcIixcbiAgICAgICAgXCJsaWdodHNreWJsdWVcIjogXCIjODdjZWZhXCIsXG4gICAgICAgIFwibGlnaHRzbGF0ZWdyYXlcIjogXCIjNzc4ODk5XCIsXG4gICAgICAgIFwibGlnaHRzdGVlbGJsdWVcIjogXCIjYjBjNGRlXCIsXG4gICAgICAgIFwibGlnaHR5ZWxsb3dcIjogXCIjZmZmZmUwXCIsXG4gICAgICAgIFwibGltZVwiOiBcIiMwMGZmMDBcIixcbiAgICAgICAgXCJsaW1lZ3JlZW5cIjogXCIjMzJjZDMyXCIsXG4gICAgICAgIFwibGluZW5cIjogXCIjZmFmMGU2XCIsXG4gICAgICAgIFwibWFnZW50YVwiOiBcIiNmZjAwZmZcIixcbiAgICAgICAgXCJtYXJvb25cIjogXCIjODAwMDAwXCIsXG4gICAgICAgIFwibWVkaXVtYXF1YW1hcmluZVwiOiBcIiM2NmNkYWFcIixcbiAgICAgICAgXCJtZWRpdW1ibHVlXCI6IFwiIzAwMDBjZFwiLFxuICAgICAgICBcIm1lZGl1bW9yY2hpZFwiOiBcIiNiYTU1ZDNcIixcbiAgICAgICAgXCJtZWRpdW1wdXJwbGVcIjogXCIjOTM3MGQ4XCIsXG4gICAgICAgIFwibWVkaXVtc2VhZ3JlZW5cIjogXCIjM2NiMzcxXCIsXG4gICAgICAgIFwibWVkaXVtc2xhdGVibHVlXCI6IFwiIzdiNjhlZVwiLFxuICAgICAgICBcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFwiIzAwZmE5YVwiLFxuICAgICAgICBcIm1lZGl1bXR1cnF1b2lzZVwiOiBcIiM0OGQxY2NcIixcbiAgICAgICAgXCJtZWRpdW12aW9sZXRyZWRcIjogXCIjYzcxNTg1XCIsXG4gICAgICAgIFwibWlkbmlnaHRibHVlXCI6IFwiIzE5MTk3MFwiLFxuICAgICAgICBcIm1pbnRjcmVhbVwiOiBcIiNmNWZmZmFcIixcbiAgICAgICAgXCJtaXN0eXJvc2VcIjogXCIjZmZlNGUxXCIsXG4gICAgICAgIFwibW9jY2FzaW5cIjogXCIjZmZlNGI1XCIsXG4gICAgICAgIFwibmF2YWpvd2hpdGVcIjogXCIjZmZkZWFkXCIsXG4gICAgICAgIFwibmF2eVwiOiBcIiMwMDAwODBcIixcbiAgICAgICAgXCJvbGRsYWNlXCI6IFwiI2ZkZjVlNlwiLFxuICAgICAgICBcIm9saXZlXCI6IFwiIzgwODAwMFwiLFxuICAgICAgICBcIm9saXZlZHJhYlwiOiBcIiM2YjhlMjNcIixcbiAgICAgICAgXCJvcmFuZ2VcIjogXCIjZmZhNTAwXCIsXG4gICAgICAgIFwib3JhbmdlcmVkXCI6IFwiI2ZmNDUwMFwiLFxuICAgICAgICBcIm9yY2hpZFwiOiBcIiNkYTcwZDZcIixcbiAgICAgICAgXCJwYWxlZ29sZGVucm9kXCI6IFwiI2VlZThhYVwiLFxuICAgICAgICBcInBhbGVncmVlblwiOiBcIiM5OGZiOThcIixcbiAgICAgICAgXCJwYWxldHVycXVvaXNlXCI6IFwiI2FmZWVlZVwiLFxuICAgICAgICBcInBhbGV2aW9sZXRyZWRcIjogXCIjZDg3MDkzXCIsXG4gICAgICAgIFwicGFwYXlhd2hpcFwiOiBcIiNmZmVmZDVcIixcbiAgICAgICAgXCJwZWFjaHB1ZmZcIjogXCIjZmZkYWI5XCIsXG4gICAgICAgIFwicGVydVwiOiBcIiNjZDg1M2ZcIixcbiAgICAgICAgXCJwaW5rXCI6IFwiI2ZmYzBjYlwiLFxuICAgICAgICBcInBsdW1cIjogXCIjZGRhMGRkXCIsXG4gICAgICAgIFwicG93ZGVyYmx1ZVwiOiBcIiNiMGUwZTZcIixcbiAgICAgICAgXCJwdXJwbGVcIjogXCIjODAwMDgwXCIsXG4gICAgICAgIFwicmVkXCI6IFwiI2ZmMDAwMFwiLFxuICAgICAgICBcInJvc3licm93blwiOiBcIiNiYzhmOGZcIixcbiAgICAgICAgXCJyb3lhbGJsdWVcIjogXCIjNDE2OWUxXCIsXG4gICAgICAgIFwic2FkZGxlYnJvd25cIjogXCIjOGI0NTEzXCIsXG4gICAgICAgIFwic2FsbW9uXCI6IFwiI2ZhODA3MlwiLFxuICAgICAgICBcInNhbmR5YnJvd25cIjogXCIjZjRhNDYwXCIsXG4gICAgICAgIFwic2VhZ3JlZW5cIjogXCIjMmU4YjU3XCIsXG4gICAgICAgIFwic2Vhc2hlbGxcIjogXCIjZmZmNWVlXCIsXG4gICAgICAgIFwic2llbm5hXCI6IFwiI2EwNTIyZFwiLFxuICAgICAgICBcInNpbHZlclwiOiBcIiNjMGMwYzBcIixcbiAgICAgICAgXCJza3libHVlXCI6IFwiIzg3Y2VlYlwiLFxuICAgICAgICBcInNsYXRlYmx1ZVwiOiBcIiM2YTVhY2RcIixcbiAgICAgICAgXCJzbGF0ZWdyYXlcIjogXCIjNzA4MDkwXCIsXG4gICAgICAgIFwic25vd1wiOiBcIiNmZmZhZmFcIixcbiAgICAgICAgXCJzcHJpbmdncmVlblwiOiBcIiMwMGZmN2ZcIixcbiAgICAgICAgXCJzdGVlbGJsdWVcIjogXCIjNDY4MmI0XCIsXG4gICAgICAgIFwidGFuXCI6IFwiI2QyYjQ4Y1wiLFxuICAgICAgICBcInRlYWxcIjogXCIjMDA4MDgwXCIsXG4gICAgICAgIFwidGhpc3RsZVwiOiBcIiNkOGJmZDhcIixcbiAgICAgICAgXCJ0b21hdG9cIjogXCIjZmY2MzQ3XCIsXG4gICAgICAgIFwidHVycXVvaXNlXCI6IFwiIzQwZTBkMFwiLFxuICAgICAgICBcInZpb2xldFwiOiBcIiNlZTgyZWVcIixcbiAgICAgICAgXCJ3aGVhdFwiOiBcIiNmNWRlYjNcIixcbiAgICAgICAgXCJ3aGl0ZVwiOiBcIiNmZmZmZmZcIixcbiAgICAgICAgXCJ3aGl0ZXNtb2tlXCI6IFwiI2Y1ZjVmNVwiLFxuICAgICAgICBcInllbGxvd1wiOiBcIiNmZmZmMDBcIixcbiAgICAgICAgXCJ5ZWxsb3dncmVlblwiOiBcIiM5YWNkMzJcIixcbiAgICAgICAgXCJidXR0b250ZXh0XCI6IFwicmdiYSgwLCAwLCAwLCAwLjg0NylcIixcbiAgICAgICAgXCJidXR0b25mYWNlXCI6IFwiI2ZmZmZmZlwiLFxuICAgICAgICBcImdyYXl0ZXh0XCI6IFwicmdiYSgwLCAwLCAwLCAwLjI0NylcIlxuICAgIH1cblxuXG4gICAgLy8gUmV3cml0ZSB0aGUgY29sb3Igb2JqZWN0IHRvIGFjY291bnQgZm9yIGFscGhhXG4gICAgcHVibGljIHN0YXRpYyBDb2xvcihjc3NTdHlsZUNvbG9yKSB7XG4gICAgICAgIGlmICghY3NzU3R5bGVDb2xvcikgcmV0dXJuIG51bGw7XG4gICAgICAgIGNzc1N0eWxlQ29sb3IgPSBjc3NTdHlsZUNvbG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yID09PSBcInRyYW5zcGFyZW50XCIpIHJldHVybiBuZXcgQ29sb3JPYmooMjU1LCAyNTUsIDI1NSwgMCk7XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yIGluIENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cClcbiAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBDb2xvclV0aWwuQ1NTQ29sb3JMb29rdXBbY3NzU3R5bGVDb2xvcl07XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2IoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYlxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihtWzFdLCBtWzJdLCBtWzNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2JhKFwiKSkge1xuICAgICAgICAgICAgbGV0IHJnYlJlZ2V4ID0gL1xccypyZ2JhXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooLispXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjc3NTdHlsZUNvbG9yLmNoYXJBdCgwKSAhPSBcIiNcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGhyZWUtZGlnaXQgUkdCICgjcmdiKSBpcyBjb252ZXJ0ZWQgdG8gc2l4LWRpZ2l0IGZvcm0gKCNycmdnYmIpIGJ5IHJlcGxpY2F0aW5nIGRpZ2l0c1xuICAgICAgICAgICAgICAgIC8vIChodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWNvbG9yLTMvI3JnYi1jb2xvcilcbiAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gXCIjXCIgKyBjc3NTdHlsZUNvbG9yLmNoYXJBdCgxKS5yZXBlYXQoMikgK1xuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yLmNoYXJBdCgyKS5yZXBlYXQoMikgK1xuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yLmNoYXJBdCgzKS5yZXBlYXQoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdGhpc1JlZCA9IHBhcnNlSW50KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDEsIDMpLCAxNik7XG4gICAgICAgICAgICBsZXQgdGhpc0dyZWVuID0gcGFyc2VJbnQoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMywgNSksIDE2KTtcbiAgICAgICAgICAgIGxldCB0aGlzQmx1ZSA9IHBhcnNlSW50KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDUsIDcpLCAxNik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKHRoaXNSZWQsIHRoaXNHcmVlbiwgdGhpc0JsdWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vICAgIHJldHVybiBudWxsOyAvLyBVbnJlYWNoYWJsZVxuICAgIH07XG5cbiBwdWJsaWMgc3RhdGljIENvbG9yQ29tYm8ocnVsZUNvbnRleHQgOiBIVE1MRWxlbWVudCkge1xuICAgIHRyeSB7IFxuICAgICAgICB2YXIgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIGlmICghd2luKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhbmNlc3RvcnMgPSBbXTtcbiAgICAgICAgbGV0IHdhbGtOb2RlIDogRWxlbWVudCA9IHJ1bGVDb250ZXh0O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlVHlwZSA9PT0gMSkgXG4gICAgICAgICAgICAgICAgYW5jZXN0b3JzLnB1c2god2Fsa05vZGUpO1xuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHZhciByZXRWYWwgPSB7XG4gICAgICAgICAgICBcImhhc0dyYWRpZW50XCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJoYXNCR0ltYWdlXCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJ0ZXh0U2hhZG93XCI6IGZhbHNlLFxuICAgICAgICAgICAgXCJmZ1wiOiBudWxsLFxuICAgICAgICAgICAgXCJiZ1wiOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBzdGFydFxuICAgICAgICB2YXIgY1N0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICB2YXIgY29tcFN0eWxlQ29sb3IgPSBjU3R5bGUuY29sb3I7XG4gICAgICAgIGlmICghY29tcFN0eWxlQ29sb3IpXG4gICAgICAgICAgICBjb21wU3R5bGVDb2xvciA9IFwiYmxhY2tcIjtcbiAgICAgICAgdmFyIGZnID0gQ29sb3JVdGlsLkNvbG9yKGNvbXBTdHlsZUNvbG9yKTtcbiAgICAgICAgdmFyIHJlQ29sb3IgPSAvdHJhbnNwYXJlbnR8cmdiYT9cXChbXildK1xcKS9naTtcbiAgICAgICAgdmFyIGd1ZXNzR3JhZENvbG9yID0gZnVuY3Rpb24gKGdyYWRMaXN0LCBiZ0NvbG9yLCBmZ0NvbG9yKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgY29sb3IsIHJldHVybiB0aGF0XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBncmFkTGlzdC5sZW5ndGggPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBncmFkTGlzdDtcblxuICAgICAgICAgICAgICAgIHZhciBvdmVyYWxsV29yc3QgPSBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBvdmVyYWxsV29yc3RSYXRpbyA9IG51bGw7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaUdyYWQgPSAxOyBpR3JhZCA8IGdyYWRMaXN0Lmxlbmd0aDsgKytpR3JhZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29yc3RDb2xvciA9IGdyYWRMaXN0W2lHcmFkIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JzdFJhdGlvID0gZmdDb2xvci5jb250cmFzdFJhdGlvKGdyYWRMaXN0W2lHcmFkIC0gMV0pO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcCA9IC4xO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0ZXAgPiAuMDAwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlkeCArIHN0ZXAgPD0gMSAmJiB3b3JzdFJhdGlvID4gZmdDb2xvci5jb250cmFzdFJhdGlvKGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4ICsgc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0Q29sb3IgPSBncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCArIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdFJhdGlvID0gZmdDb2xvci5jb250cmFzdFJhdGlvKHdvcnN0Q29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IGlkeCArIHN0ZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IC0gc3RlcCA+PSAwICYmIHdvcnN0UmF0aW8gPiBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8oZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggLSBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RDb2xvciA9IGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4IC0gc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0UmF0aW8gPSBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8od29yc3RDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gaWR4IC0gc3RlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAgPSBzdGVwIC8gMTA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJhbGxXb3JzdFJhdGlvID09PSBudWxsIHx8IG92ZXJhbGxXb3JzdFJhdGlvID4gd29yc3RSYXRpbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbFdvcnN0UmF0aW8gPSB3b3JzdFJhdGlvO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbFdvcnN0ID0gd29yc3RDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3ZlcmFsbFdvcnN0OyAvLyByZXR1cm4gdGhlIGRhcmtlc3QgY29sb3JcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBiZ0NvbG9yO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBwcmlvclN0YWNrQkcgPSBDb2xvclV0aWwuQ29sb3IoXCJ3aGl0ZVwiKTtcbiAgICAgICAgdmFyIHRoaXNTdGFja09wYWNpdHkgPSBudWxsO1xuICAgICAgICB2YXIgdGhpc1N0YWNrQWxwaGEgPSBudWxsO1xuICAgICAgICB2YXIgdGhpc1N0YWNrQkcgPSBudWxsO1xuICAgICAgICAvLyBBbmNlc3RvcnMgcHJvY2Vzc2VkIGZyb20gdGhlIHRvcG1vc3QgcGFyZW50IHRvd2FyZCB0aGUgY2hpbGRcbiAgICAgICAgd2hpbGUgKGFuY2VzdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgcHJvY05leHQgPSBhbmNlc3RvcnMucG9wKCk7XG4gICAgICAgICAgICAvL3ZhciBwcm9jTmV4dCA9IGFuY2VzdG9ycy5zcGxpY2UoMCwgMSlbMF07XG4gICAgICAgICAgICAvLyBjU3R5bGUgaXMgdGhlIGNvbXB1dGVkIHN0eWxlIG9mIHRoaXMgbGF5ZXJcbiAgICAgICAgICAgIHZhciBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShwcm9jTmV4dCk7XG4gICAgICAgICAgICBpZiAoY1N0eWxlID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gdGhpc0JnQ29sb3IgaXMgdGhlIGNvbG9yIG9mIHRoaXMgbGF5ZXIgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgaXMgdHJhbnNwYXJlbnRcbiAgICAgICAgICAgIHZhciB0aGlzQmdDb2xvciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRDb2xvciAmJiBjU3R5bGUuYmFja2dyb3VuZENvbG9yICE9IFwidHJhbnNwYXJlbnRcIiAmJiBjU3R5bGUuYmFja2dyb3VuZENvbG9yICE9IFwicmdiYSgwLCAwLCAwLCAwKVwiKSB7XG4gICAgICAgICAgICAgICAgdGhpc0JnQ29sb3IgPSBDb2xvclV0aWwuQ29sb3IoY1N0eWxlLmJhY2tncm91bmRDb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGdyYWRpZW50IGludm9sdmVkLCBzZXQgdGhpc0JnQ29sb3IgdG8gdGhlIHdvcnN0IGNvbG9yIGNvbWJpbmF0aW9uIGF2YWlsYWJsZSBhZ2FpbnN0IHRoZSBmb3JlZ3JvdW5kXG4gICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRJbWFnZSAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YgJiYgY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mKFwiZ3JhZGllbnRcIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICB2YXIgZ3JhZENvbG9ycyA6IHN0cmluZ1tdID0gY1N0eWxlLmJhY2tncm91bmRJbWFnZS5tYXRjaChyZUNvbG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JhZENvbG9ycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JhZENvbG9yQ29tcCA6IENvbG9yT2JqW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFkQ29sb3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdyYWRDb2xvcnNbaV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZENvbG9ycy5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbG9yQ29tcCA9IENvbG9yVXRpbC5Db2xvcihncmFkQ29sb3JzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JDb21wLmFscGhhICE9PSB1bmRlZmluZWQgJiYgY29sb3JDb21wLmFscGhhIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaXggdGhlIGdyZGllbnQgYmcgY29sb3Igd2l0IHBhcmVudCBiZyBpZiBhbHBoYSA8IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBTdGFja0JnID0gdGhpc1N0YWNrQkcgfHwgcHJpb3JTdGFja0JHO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckNvbXAgPSBjb2xvckNvbXAuZ2V0T3ZlcmxheUNvbG9yKGNvbXBTdGFja0JnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZENvbG9yQ29tcC5wdXNoKGNvbG9yQ29tcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpc0JnQ29sb3IgPSBndWVzc0dyYWRDb2xvcihncmFkQ29sb3JDb21wLCB0aGlzU3RhY2tCRyB8fCBwcmlvclN0YWNrQkcsIGZnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEhhbmRsZSBub24tc29saWQgb3BhY2l0eVxuICAgICAgICAgICAgaWYgKHRoaXNTdGFja09wYWNpdHkgPT09IG51bGwgfHwgKGNTdHlsZS5vcGFjaXR5ICYmIGNTdHlsZS5vcGFjaXR5Lmxlbmd0aCA+IDAgJiYgcGFyc2VGbG9hdChjU3R5bGUub3BhY2l0eSkgPCAxKSkge1xuICAgICAgICAgICAgICAgIC8vIE5ldyBzdGFjaywgcmVzZXRcbiAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrQkcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBPdmVybGF5XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHLmFscGhhID0gdGhpc1N0YWNrT3BhY2l0eSAqIHRoaXNTdGFja0FscGhhO1xuICAgICAgICAgICAgICAgICAgICBwcmlvclN0YWNrQkcgPSB0aGlzU3RhY2tCRy5nZXRPdmVybGF5Q29sb3IocHJpb3JTdGFja0JHKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpc1N0YWNrT3BhY2l0eSA9IDEuMDtcbiAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjU3R5bGUub3BhY2l0eSAmJiBjU3R5bGUub3BhY2l0eS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja09wYWNpdHkgPSBwYXJzZUZsb2F0KGNTdHlsZS5vcGFjaXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNCZ0NvbG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSB0aGlzQmdDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSB0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzU3RhY2tCRy5hbHBoYTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNTdGFja09wYWNpdHkgPT09IDEuMCAmJiB0aGlzU3RhY2tBbHBoYSA9PT0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzQkdJbWFnZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0dyYWRpZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIYW5kbGUgc29saWQgY29sb3IgYmFja2dyb3VuZHMgYW5kIGdyYWRpZW50IGNvbG9yIGJhY2tncm91bmRzXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzQmdDb2xvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBzdGFjayBhbHJlYWR5IGhhcyBhIGJhY2tncm91bmQgY29sb3IsIGJsZW5kIGl0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNTdGFja0JHID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHID0gdGhpc0JnQ29sb3I7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gdGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1N0YWNrQkcuYWxwaGE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSB0aGlzQmdDb2xvci5nZXRPdmVybGF5Q29sb3IodGhpc1N0YWNrQkcpO1xuICAgICAgICAgICAgICAgICAgICAvL3RoaXNTdGFja0FscGhhID0gdGhpc0JnQ29sb3IuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gIzUyNjogSWYgdGhpc0JnQ29sb3IgaGFkIGFuIGFscGhhIHZhbHVlLCBpdCBtYXkgbm90IGV4cG9zZSB0aHJvdWdoIHRoaXNTdGFja0JHIGluIHRoZSBhYm92ZSBjb2RlXG4gICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3Qgd2lwZSBvdXQgdGhlIGdyYWRpZW50IGluZm8gaWYgdGhpcyBsYXllciB3YXMgdHJhbnNwYXJlbnRcbiAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrT3BhY2l0eSA9PT0gMS4wICYmIHRoaXNTdGFja0FscGhhID09PSAxLjAgJiYgKHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMCkgPT09IDEuMCAmJiAodGhpc0JnQ29sb3IuYWxwaGEgfHwgMS4wKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzQkdJbWFnZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzR3JhZGllbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRJbWFnZSAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlICE9IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZiAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YoXCJncmFkaWVudFwiKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzR3JhZGllbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNCR0ltYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXNTdGFja0JHICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZnID0gZmcuZ2V0T3ZlcmxheUNvbG9yKHRoaXNTdGFja0JHKTtcbiAgICAgICAgICAgIGRlbGV0ZSBmZy5hbHBoYTtcbiAgICAgICAgfVxuICAgICAgICBmZy5hbHBoYSA9IChmZy5hbHBoYSB8fCAxKSAqIHRoaXNTdGFja09wYWNpdHk7XG4gICAgICAgIGZnID0gZmcuZ2V0T3ZlcmxheUNvbG9yKHByaW9yU3RhY2tCRyk7XG4gICAgICAgIGlmICh0aGlzU3RhY2tCRyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzU3RhY2tCRy5hbHBoYSA9IHRoaXNTdGFja09wYWNpdHkgKiB0aGlzU3RhY2tBbHBoYTtcbiAgICAgICAgICAgIHByaW9yU3RhY2tCRyA9IHRoaXNTdGFja0JHLmdldE92ZXJsYXlDb2xvcihwcmlvclN0YWNrQkcpO1xuICAgICAgICB9XG4gICAgICAgIHJldFZhbC5mZyA9IGZnO1xuICAgICAgICByZXRWYWwuYmcgPSBwcmlvclN0YWNrQkc7XG5cbiAgICAgICAgaWYgKGNTdHlsZS50ZXh0U2hhZG93ICYmIGNTdHlsZS50ZXh0U2hhZG93ICE9PSAnbm9uZScpXG4gICAgICAgICAgICByZXRWYWwudGV4dFNoYWRvdyA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gc29tZXRoaW5nIGhhcHBlbmVkLCB0aGVuLi4uXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiB9O1xufVxuXG5leHBvcnQgY2xhc3MgQ29sb3JPYmoge1xuICAgIHJlZCA6IG51bWJlcjtcbiAgICBncmVlbiA6IG51bWJlcjtcbiAgICBibHVlIDogbnVtYmVyO1xuICAgIGFscGhhIDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocmVkIDogc3RyaW5nIHwgbnVtYmVyLCBncmVlbiA6IHN0cmluZyB8IG51bWJlciwgYmx1ZSA6IHN0cmluZyB8IG51bWJlciwgYWxwaGE/IDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGZ1bmN0aW9uIGZpeENvbXBvbmVudChjb21wIDogc3RyaW5nIHwgbnVtYmVyKSA6IG51bWJlciB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChjb21wKSAhPSB0eXBlb2YgKFwiXCIpKSByZXR1cm4gY29tcCBhcyBudW1iZXI7XG4gICAgICAgICAgICBsZXQgY29tcFN0ciA9IGNvbXAgYXMgc3RyaW5nO1xuICAgICAgICAgICAgY29tcFN0ciA9IGNvbXBTdHIudHJpbSgpO1xuICAgICAgICAgICAgaWYgKGNvbXBTdHJbY29tcFN0ci5sZW5ndGggLSAxXSAhPSBcIiVcIikgcmV0dXJuIHBhcnNlSW50KGNvbXBTdHIpO1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChjb21wU3RyLnN1YnN0cmluZygwLCBjb21wU3RyLmxlbmd0aCAtIDEpKSAqIDIuNTUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVkID0gZml4Q29tcG9uZW50KHJlZCk7XG4gICAgICAgIHRoaXMuZ3JlZW4gPSBmaXhDb21wb25lbnQoZ3JlZW4pO1xuICAgICAgICB0aGlzLmJsdWUgPSBmaXhDb21wb25lbnQoYmx1ZSk7XG4gICAgICAgIGlmICh0eXBlb2YgKGFscGhhKSAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmFscGhhID0gKHR5cGVvZiAoYWxwaGEpID09PSB0eXBlb2YgKFwiXCIpKSA/IHBhcnNlRmxvYXQoYWxwaGEgYXMgc3RyaW5nKSA6IGFscGhhIGFzIG51bWJlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvSGV4SGVscCh2YWx1ZSA6IG51bWJlcikgOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsID0gTWF0aC5yb3VuZCh2YWx1ZSkudG9TdHJpbmcoMTYpO1xuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBcIjBcIiArIHJldFZhbDtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9O1xuXG4gICAgdG9IZXgoKSA6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcIiNcIiArIHRoaXMudG9IZXhIZWxwKHRoaXMucmVkKSArIHRoaXMudG9IZXhIZWxwKHRoaXMuZ3JlZW4pICsgdGhpcy50b0hleEhlbHAodGhpcy5ibHVlKTtcbiAgICB9O1xuXG4gICAgY29udHJhc3RSYXRpbyhiZ0NvbG9yIDogQ29sb3JPYmopIHsgXG4gICAgICAgIGxldCBmZ0NvbG9yOiBDb2xvck9iaiA9IHRoaXM7XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFscGhhKSAhPSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgZmdDb2xvciA9IHRoaXMuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpO1xuICAgICAgICAgICAgIFxuICAgICAgICBsZXQgbHVtMSA9IGZnQ29sb3IucmVsYXRpdmVMdW1pbmFuY2UoKTtcbiAgICAgICAgaWYgKCFiZ0NvbG9yLnJlbGF0aXZlTHVtaW5hbmNlKSB7XG4gICAgICAgICAgICBsZXQgcyA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gYmdDb2xvcikge1xuICAgICAgICAgICAgICAgIHMgKz0ga2V5ICsgXCJcXG5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFsZXJ0KGJnQ29sb3IpO1xuICAgICAgICAgICAgYWxlcnQocyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGx1bTIgPSBiZ0NvbG9yLnJlbGF0aXZlTHVtaW5hbmNlKCk7XG4gICAgICAgIGxldCByYXRpbyA9IChsdW0xID4gbHVtMikgPyAobHVtMSArIC4wNSkgLyAobHVtMiArIC4wNSkgOiAobHVtMiArIC4wNSkgLyAobHVtMSArIC4wNSk7XG4gICAgICAgIHJldHVybiByYXRpbztcbiAgICB9O1xuXG4gICAgcmVsYXRpdmVMdW1pbmFuY2UoKSA6IG51bWJlciB7XG4gICAgICAgIGxldCBSID0gdGhpcy5yZWQgLyAyNTUuMDtcbiAgICAgICAgbGV0IEcgPSB0aGlzLmdyZWVuIC8gMjU1LjA7XG4gICAgICAgIGxldCBCID0gdGhpcy5ibHVlIC8gMjU1LjA7XG4gICAgICAgIFIgPSBSIDw9IC4wNDA0NSA/IFIgLyAxMi45MiA6IE1hdGgucG93KChSICsgLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICAgICAgRyA9IEcgPD0gLjA0MDQ1ID8gRyAvIDEyLjkyIDogTWF0aC5wb3coKEcgKyAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgICAgICBCID0gQiA8PSAuMDQwNDUgPyBCIC8gMTIuOTIgOiBNYXRoLnBvdygoQiArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICAgIHJldHVybiAwLjIxMjYgKiBSICsgMC43MTUyICogRyArIDAuMDcyMiAqIEI7XG4gICAgfTtcblxuICAgIG1peChjb2xvcjIgOiBDb2xvck9iaiwgcGVyY1RoaXMgOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hbHBoYSkgPT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIChjb2xvcjIuYWxwaGEpID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5yZWQgKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5yZWQsXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLmdyZWVuICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuZ3JlZW4sXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLmJsdWUgKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ibHVlXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFscGhhVGhpcyA9IHRoaXMuYWxwaGEgPyB0aGlzLmFscGhhIDogMTtcbiAgICAgICAgICAgIGxldCBhbHBoYU90aGVyID0gY29sb3IyLmFscGhhID8gY29sb3IyLmFscGhhIDogMTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmooXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLnJlZCArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLnJlZCxcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuZ3JlZW4gKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ncmVlbixcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuYmx1ZSArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmJsdWUsXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiBhbHBoYVRoaXMgKyAoMSAtIHBlcmNUaGlzKSAqIGFscGhhT3RoZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IgOiBDb2xvck9iaikge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFscGhhKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0aGlzLmFscGhhID49IDEpIHtcbiAgICAgICAgICAgIC8vIE5vIG1peGluZyByZXF1aXJlZCAtIGl0J3Mgb3BhcXVlXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hbHBoYSA8IDApIHtcbiAgICAgICAgICAgIC8vXHRcdEhhYWMuRXJyb3IubG9nRXJyb3IoXCJJbnZhbGlkIGFscGhhIHZhbHVlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAoYmdDb2xvci5hbHBoYSkgIT0gXCJ1bmRlZmluZWRcIiAmJiBiZ0NvbG9yLmFscGhhIDwgMSkge1xuICAgICAgICAgICAgLy9cdFx0SGFhYy5FcnJvci5sb2dFcnJvcihcIkNhbm5vdCBtaXggd2l0aCBhIGJhY2tncm91bmQgYWxwaGFcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VmFsID0gdGhpcy5taXgoYmdDb2xvciwgdGhpcy5hbHBoYSk7XG4gICAgICAgIGRlbGV0ZSByZXRWYWwuYWxwaGE7IFxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUNTU0NvbG9yKGNzc1N0eWxlQ29sb3IpIHtcbiAgICAgICAgbGV0IHRoaXNSZWQgPSAtMTtcbiAgICAgICAgbGV0IHRoaXNHcmVlbiA9IC0xO1xuICAgICAgICBsZXQgdGhpc0JsdWUgPSAtMTtcblxuICAgICAgICBjc3NTdHlsZUNvbG9yID0gY3NzU3R5bGVDb2xvci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiKFwiKSkge1xuICAgICAgICAgICAgbGV0IHJnYlJlZ2V4ID0gL1xccypyZ2JcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNSZWQgPSBtWzFdO1xuICAgICAgICAgICAgICAgIHRoaXNHcmVlbiA9IG1bMl07XG4gICAgICAgICAgICAgICAgdGhpc0JsdWUgPSBtWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYmEoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYmFcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKiguKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzUmVkID0gbVsxXTtcbiAgICAgICAgICAgICAgICB0aGlzR3JlZW4gPSBtWzJdO1xuICAgICAgICAgICAgICAgIHRoaXNCbHVlID0gbVszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLmNoYXJBdCgwKSAhPSBcIiNcIikge1xuICAgICAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yIGluIENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cClcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cFtjc3NTdHlsZUNvbG9yXTtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGZyb21IZXggPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxvb2t1cCA9IHtcbiAgICAgICAgICAgICAgICAgICAgXCJhXCI6IDEwLFxuICAgICAgICAgICAgICAgICAgICBcImJcIjogMTEsXG4gICAgICAgICAgICAgICAgICAgIFwiY1wiOiAxMixcbiAgICAgICAgICAgICAgICAgICAgXCJkXCI6IDEzLFxuICAgICAgICAgICAgICAgICAgICBcImVcIjogMTQsXG4gICAgICAgICAgICAgICAgICAgIFwiZlwiOiAxNVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsICogMTYgK1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQodmFsLmNoYXJBdChpKSBpbiBsb29rdXAgPyBsb29rdXBbdmFsLmNoYXJBdChpKV0gOiB2YWwuY2hhckF0KGkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJlZS1kaWdpdCBSR0IgKCNyZ2IpIGlzIGNvbnZlcnRlZCB0byBzaXgtZGlnaXQgZm9ybSAoI3JyZ2diYikgYnkgcmVwbGljYXRpbmcgZGlnaXRzXG4gICAgICAgICAgICAgICAgLy8gKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtY29sb3ItMy8jcmdiLWNvbG9yKVxuICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBcIiNcIiArIGNzc1N0eWxlQ29sb3IuY2hhckF0KDEpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDIpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDMpLnJlcGVhdCgyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXNSZWQgPSBmcm9tSGV4KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDEsIDMpKTtcbiAgICAgICAgICAgIHRoaXNHcmVlbiA9IGZyb21IZXgoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMywgNSkpO1xuICAgICAgICAgICAgdGhpc0JsdWUgPSBmcm9tSGV4KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDUsIDcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKHRoaXNSZWQsIHRoaXNHcmVlbiwgdGhpc0JsdWUpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4vVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuXG5leHBvcnQgY2xhc3MgQ29tbW9uVXRpbCB7XG5cbiAgICBwdWJsaWMgc3RhdGljIGlucHV0X3R5cGVfd2l0aF9wbGFjZWhvbGRlciA9IFtcInRleHRcIiwgXCJzZWFyY2hcIiwgXCJ0ZWxcIiwgXCJ1cmxcIiwgXCJlbWFpbFwiLCBcInBhc3N3b3JkXCIsIFwibnVtYmVyXCJdO1xuICAgIHB1YmxpYyBzdGF0aWMgaW5wdXRfdGV4dF90eXBlcyA9IFtcbiAgICAgICAgXCJ0ZXh0XCIsIFwiZmlsZVwiLCBcInBhc3N3b3JkXCIsXG4gICAgICAgIFwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLFxuICAgICAgICBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsICAvL0hUTUwgNS4gTm90ZTogdHlwZSA9IFwiaGlkZGVuXCIgZG9lc24ndCByZXF1aXJlIHRleHRcbiAgICAgICAgXCJkYXRlXCIsIFwibnVtYmVyXCIsIFwicmFuZ2VcIixcbiAgICAgICAgXCJ0aW1lXCIsIFwiY29sb3JcIlxuICAgIF07XG4gICAgcHVibGljIHN0YXRpYyBpbnB1dF90aW1lX3R5cGVzID0gW1xuICAgICAgICBcImRhdGVcIiwgXCJtb250aFwiLCBcIndlZWtcIiwgXCJ0aW1lXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgIF07XG4gICAgcHVibGljIHN0YXRpYyBpbnB1dF9vdGhlcl90eXBlcyA9IFtcbiAgICAgICAgXCJyYW5nZVwiLCBcImNvbG9yXCIsIFwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLCBcImZpbGVcIiwgXCJpbWFnZVwiXG4gICAgXTtcbiAgICBwdWJsaWMgc3RhdGljIGZvcm1fYnV0dG9uX3R5cGVzID0gW1xuICAgICAgICBcImJ1dHRvblwiLCBcInJlc2V0XCIsIFwic3VibWl0XCJcbiAgICBdO1xuXG4gICAgcHVibGljIHN0YXRpYyBmb3JtX2xhYmVsYWJsZV9lbGVtZW50cyA9IFtcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiLCBcImJ1dHRvblwiXTtcblxuICAgIHB1YmxpYyBzdGF0aWMgdGFiVGFnTWFwID0ge1xuICAgICAgICBcImJ1dHRvblwiOiBmdW5jdGlvbiAoZWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgcmV0dXJuICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcImlmcmFtZVwiOiB0cnVlLFxuICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwicmFkaW9cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7IC8vc2luZ2xlIHJhZGlvLCBubyBncm91cFxuICAgICAgICAgICAgICAgIGxldCBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBkb2MucXVlcnlTZWxlY3RvckFsbChcImlucHV0W3R5cGU9J3JhZGlvJ11bbmFtZT0nXCIgKyBuYW1lLnRyaW0oKSArXCInXVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAwIHx8IGdyb3VwLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRydWU7ICAvL3NpbmdsZSByYWRpbyB3aXRoIHRoZSBuYW1lLCBubyBvdGhlcnMgaW4gZ3JvdXBcblxuICAgICAgICAgICAgICAgIGxldCBjaGVja2VkID0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoZ3JvdXBbaV0gYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQgPSBncm91cFtpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9vbmx5IGxhc3Qgb25lIGFwcGxpZXMgaWYgbXVsdGlwbGUgcmFkaW9zIHdpdGggJ2NoZWNrZWQnIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShjaGVja2VkLCBlbGVtZW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90aGluZyBjaGVja2VkIHlldCwgcmV0dXJuIHRydWUgaWYgaXQncyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShncm91cFswXSwgZWxlbWVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSAgIFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgcmV0dXJuICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcInRleHRhcmVhXCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICAvKipcImRpdlwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpO1xuICAgICAgICB9LCovXG4gICAgICAgIFwiYVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgLy8geGxpbms6aHJlZj8/IHNlZSBzdmdcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJlYVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdWRpb1wiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udHJvbHNcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwidmlkZW9cIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRyb2xzXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcInN1bW1hcnlcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IHN1bW1hcnkgY2hpbGQgb2YgYSBkZXRhaWxzIGVsZW1lbnQgaXMgYXV0b21hdGljYWxseSBmb2N1c2FibGUgXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGVsZW1lbnQucGFyZW50RWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGV0YWlscydcbiAgICAgICAgICAgICAgICAmJiBET01VdGlsLnNhbWVOb2RlKFsuLi5lbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtID0+IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKVswXSwgZWxlbWVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGV0YWlsc1wiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgLy9kZXRhaWxzIGVsZW1lbnQgd2l0aG91dCBhIGRpcmVjdCBzdW1tYXJ5IGNoaWxkIGlzIGF1dG9tYXRpY2FsbHkgZm9jdXNhYmxlXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5jaGlsZHJlbiAmJiBbLi4uZWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKGVsZW0gPT4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc3VtbWFyeScpLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgd29yZENvdW50KHN0cik6IG51bWJlciB7XG4gICAgICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHN0ci5zcGxpdCgvXFxzKy9nKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90ZSB0aGF0IHRoaXMgb25seSBkZXRlY3RzIGlmIHRoZSBlbGVtZW50IGl0c2VsZiBpcyBpbiB0aGUgdGFiIG9yZGVyLlxuICAgICAqIEhvd2V2ZXIsIHRoaXMgZWxlbWVudCBtYXkgZGVsZWdhdGUgZm9jdXMgdG8gYW5vdGhlciBlbGVtZW50IHZpYSBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQuXG4gICAgICogQWxzbywgZm9jdXMgdmFyaWVzIGJ5IGJyb3dzZXIuLi4gc3RpY2tpbmcgdG8gdGhpbmdzIHRoYXQgYXJlIGZvY3VzYWJsZSBvbiBDaHJvbWUgYW5kIEZpcmVmb3guXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1RhYmJhYmxlKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gVXNpbmcgaHR0cHM6Ly9hbGx5anMuaW8vZGF0YS10YWJsZXMvZm9jdXNhYmxlLmh0bWxcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBleHBsaWNpdCBjYXNlcyBmaXJzdFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJpbmVydFwiKSB8fCBET01VdGlsLmdldEFuY2VzdG9yV2l0aEF0dHJpYnV0ZShlbGVtZW50LCBcImluZXJ0XCIsIFwiXCIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPj0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHBsaWNpdCBjYXNlcyBoYW5kbGVkIC0gbm93IHRoZSBpbXBsaWNpdFxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSBpbiBDb21tb25VdGlsLnRhYlRhZ01hcCkge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IENvbW1vblV0aWwudGFiVGFnTWFwW25vZGVOYW1lXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKGNlID09PSBcInRydWVcIiB8fCBjZSA9PT0gXCJcIikgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHRoZSBlbGUgbm9kZSBpcyBmb2N1c2FibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9jdXNhYmxlKGVsZSkge1xuICAgICAgICBpZiAoZWxlID09PSBcInVuZGVmaW5lZFwiIHx8IGVsZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IGRldGVjdHMgaWYgdGhlIGVsZW1lbnQgaXRzZWxmIGlzIGludGVyYWN0aXZlLCBidXQgbm90IG9uY2xpY2sgZXZlbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NsaWNrYWJsZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICAvLyBuYXRpdmUgZm9jdXNhYmxlIGVsZW1lbnRcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgaW4gQ29tbW9uVXRpbC50YWJUYWdNYXApIHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBDb21tb25VdGlsLnRhYlRhZ01hcFtub2RlTmFtZV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICAgIC8vY3VzdG9tIHdpZGdldFxuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmlzV2lkZ2V0KGVsZW1lbnQpICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgICAgIGlmICghY29udGV4dEhpZXJhcmNoaWVzKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5maWx0ZXIoaGllciA9PiBbXCJ0YWJsZVwiLCBcImdyaWRcIiwgXCJ0cmVlZ3JpZFwiXS5pbmNsdWRlcyhoaWVyLnJvbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRhYkluZGV4TEVaZXJvKGVsZW0pIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaGFzQXR0cmlidXRlKGVsZW0sIFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLm1hdGNoKC9eLT9cXGQrJC8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhYmluZGV4VmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFiaW5kZXhWYWx1ZSA9PT0gMCB8fCB0YWJpbmRleFZhbHVlID09PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IG51bWJlciBvZiB0YWJiYWJsZSBjaGlsZHJlblxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VGFiYmFibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgfHwgZWxlbWVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbm9ybWFsaXplU3BhY2luZyhzKSB7XG4gICAgICAgIGlmICghcykgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gcy50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgIH07XG5cbiAgICAvL1RPRE86IGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBlcXVpdmFsZW50cyBmb3Igcm9sZXM6IHJvdywgbGluaywgaGVhZGVyLCBidXR0b25cbiAgICAvLyBCdXQgaXQgbWF5IG5vdCBoYXZlIHRvLiBCdWcgcmVwb3J0cyBoYXZlIGJlZW4gYWJvdXQgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2tib3hlcy5cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEVxdWl2KG5vZGUsIGh0bWxFcXVpdikge1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxFcXVpdi5pbmRleE9mKFwiY2hlY2tib3hcIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHR5cGUgPT09IFwiY2hlY2tib3hcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChodG1sRXF1aXYuaW5kZXhPZihcInJhZGlvXCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB0eXBlID09PSBcInJhZGlvXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vbkV4aXN0YW50SURzKG5vZGUsIHRhcmdldGlkcykge1xuICAgICAgICBsZXQgcmV0dXJubm90Zm91bmRpZHMgPSAnJztcbiAgICAgICAgaWYgKENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyh0YXJnZXRpZHMpLmxlbmd0aCA8IDEpIHJldHVybiByZXR1cm5ub3Rmb3VuZGlkcztcblxuICAgICAgICBsZXQgdGFyZ2V0QXJyYXkgPSB0YXJnZXRpZHMuc3BsaXQoXCIgXCIpO1xuICAgICAgICBsZXQgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeHAgPSBcIi8vKltAaWQ9J1wiICsgdGFyZ2V0QXJyYXlbaV0gKyBcIiddXCI7XG4gICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQgPSBkb2MuZXZhbHVhdGUoeHAsIG5vZGUsIGRvYy5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICBsZXQgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICBpZiAoIXIpIHJldHVybm5vdGZvdW5kaWRzICs9IHRhcmdldEFycmF5W2ldICsgJywgJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJldHVybm5vdGZvdW5kaWRzKS5sZW5ndGggPj0gMilcbiAgICAgICAgICAgIHJldHVybm5vdGZvdW5kaWRzID0gcmV0dXJubm90Zm91bmRpZHMuc3Vic3RyaW5nKDAsIHJldHVybm5vdGZvdW5kaWRzLmxlbmd0aCAtIDIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm5ub3Rmb3VuZGlkcyA9ICcnO1xuICAgICAgICByZXR1cm4gcmV0dXJubm90Zm91bmRpZHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXREb2NFbGVtZW50c0J5VGFnKGVsZW0sIHRhZ05hbWUpIHtcbiAgICAgICAgbGV0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KGVsZW0pIGFzIGFueTtcbiAgICAgICAgdGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCB7fSk7XG4gICAgICAgIGlmICghKHRhZ05hbWUgaW4gY2FjaGUpKSB7XG4gICAgICAgICAgICBjYWNoZVt0YWdOYW1lXSA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCBjYWNoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlW3RhZ05hbWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldCBhIGxpc3Qgb2YgYWxsIHRoZSBjaGlsZCBlbGVtbnRzIHdoaWNoIG1hdGNoIHRoZSB0YWdcbiAgICAgKiBuYW1lIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldENoaWxkQnlUYWdIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBwYXJlbnRFbGVtIC0gVGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge3N0cmluZ30gdGFnTmFtZSAtIFRoZSB0YWcgdG8gc2VhcmNoIGZvciB1bmRlciB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbGVhbn0gaWdub3JlSGlkZGVuIC0gdHJ1ZSBpZiBoaWRkZW4gZWxlbWVudHMgd2l0aCB0aGUgdGFnIHNob3VsZCBpZ25vcmVkIGZyb20gdGhlIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgYWRkZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSB0YWcgdW5kZXIgdGhlIHBhcmVudCB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENoaWxkQnlUYWcocGFyZW50RWxlbSwgdGFnTmFtZSkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGNoaWxkIGVsZW1udHMgd2hpY2ggbWF0Y2ggdGhlIHRhZ1xuICAgICAqIG5hbWUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gcGFyZW50RWxlbSAtIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHRhZ05hbWUgLSBUaGUgdGFnIHRvIHNlYXJjaCBmb3IgdW5kZXIgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggdGhlIHRhZyBzaG91bGQgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgdGFnIHVuZGVyIHRoZSBwYXJlbnQgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGlnbm9yZUhpZGRlbiwgY29uc2lkZXJIaWRkZW5TZXR0aW5nKSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgbGV0IGNoaWxkID0gcGFyZW50RWxlbS5maXJzdENoaWxkO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBwYXJlbnQgdG8gYnVpbGQgYSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgdGhhdFxuICAgICAgICAvLyBtYXRjaCB0aGUgdGFnTmFtZSBwcm92aWRlZFxuICAgICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkge1xuXG4gICAgICAgICAgICAvLyBPbmx5IGluY2x1ZGUgdGhlIGNoaWxkcmVuIGludG8gdGhlIHJldHVybiBhcnJheSBpZiB0aGV5IG1hdGNoIHdpdGggdGFnbmFtZS5cbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGlnbm9yZWhpZGRlbiB3YXMgc2V0IHRvIHRydWUsIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGUgY2hlY2tcbiAgICAgICAgICAgICAgICAvLyBhbmQgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2lsYmxlIHdlIG1vcmUgdG8gdGhlc2VzIHRoZW4gbW92ZSB0byB0aGUgbmV4dCBub2RlLlxuICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gYSBjb3VwbGUgb2YgY2hlY2tzIHRvIGRldGVybWluZSBpZiBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGlnbm9yZWQgb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBXaGVuIGlnbm9yZUhpZGRlbiBpcyBzZXQgdG8gdHJ1ZSB1cGZyb250LCB0aGVuIHBlcmZvcm0gYSBpc05vZGVWaXNpYmxlXG4gICAgICAgICAgICAgICAgLy8gIDIuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAvLyAgMi4xLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgaWYgKChpZ25vcmVIaWRkZW4gfHwgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiAhQ29tbW9uVXRpbC5zaG91bGRDaGVja0hpZGRlbkNvbnRlbnQoY2hpbGQpKSkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUHVzaCB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnRcbiAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBtYXRjaCBnaXZlbiByb2xlcyhzKS5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIENoZWNrIEhpZGRlbiBTZXR0aW5nIGF0IGFsbC5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIGltcGxpY2l0IHJvbGVzLlxuICAgICAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogQXJpYVV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gcmV0dXJuIGVsZW1lbnRzIGJhc2VkIG9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgcm9sZShzKSB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRzQnlSb2xlKGRvYywgcm9sZXMpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbGlzdCBvZiBlbGVtZW50cyB0aGF0IG1hdGNoIGdpdmVuIHJvbGVzKHMpLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byByZXR1cm4gZWxlbWVudHMgYmFzZWQgb24uXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSByb2xlKHMpIHRoYXQgd2VyZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIFxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIHRvIGVsZW1lbnQgYXNzb2ljYXRpb24gaXMgYWxyZWFkeSBtYWRlLCBhbmQgYXZhaWxhYmxlIGluIHRoZSBnbG9iYWwgaGFzQXR0cmlidXRlXG4gICAgICAgIC8vIHdlIGNhbiBqdXN0IHVzZSB0aGF0IG9uZSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgbmV3IG9uZS5cbiAgICAgICAgbGV0IHJvbGVUb0VsZW1zID0gbnVsbDtcbiAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvbGVUb0VsZW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9HRVRFTEVNRU5UU0JZX1JPTEVcIiwgbnVsbCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBuZXcgcm9sZSB0byBlbGVtZW50LCB0aGlzIGlzIHdoZXJlIHdlIGxvb3AgdGhyb3VnaCBhbGwgdGhlIGVsZW1lbnRzIGFuZCBleHRyYWN0IGFsbCB0aGVcbiAgICAgICAgLy8gZWxlbWVudHMgYnNhZWQgb24gcm9sZXMuXG4gICAgICAgIGlmIChyb2xlVG9FbGVtcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0aGUgcm9sZVRvRWxlbXMgaGFzaFxuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSB7fTtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBib2R5IG9mIHRoZSBkb2NcbiAgICAgICAgICAgIGxldCByb290ID0gZG9jLmJvZHk7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyB1bnRpbCB3ZSBhcmUgYXQgdGhlIHZlcnkgcGFyZW50IG5vZGUgb2YgdGhlIGVudGlyZSBwYWdlLCBzbyB0aGF0IHdlIGNhbiBsb29wIHRocm91Z2hcbiAgICAgICAgICAgIC8vIGFsbCB0aGUgbm9kZXMuXG4gICAgICAgICAgICB3aGlsZSAoRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgICAgICByb290ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCdWlsZCBhIG5vZGV3YWx0ZXIgYmFzZWQgb2YgdGhlIHJvb3Qgbm9kZSwgdGhpcyBub2RlIHdhbHRlciB3aWxsIGJlIHVzZSBsb29wIG92ZXIgYWxsIHRoZSBub2Rlc1xuICAgICAgICAgICAgLy8gYW5kIGJ1aWxkIHRoZSByb2xlcyB0byBFbGVtZW50IGNvcmFsYXRpb25cbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocm9vdCk7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgdGhlIGVudGlyZSBkb2MvbGlzdCBvZiBub2RlcyB0byBidWlsZCB0aGUgcm9sZSB0byBlbGVtZW50IG1hcFxuICAgICAgICAgICAgLy8gTm90ZTogVGhpcyB3aWxsIGJ1aWxkIGFuIHJvbGVUb0VsZW1zIGhhc2ggd2hpY2ggaXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQuXG4gICAgICAgICAgICAvLyByb2xlVG9FbGVtcyA9IHtcbiAgICAgICAgICAgIC8vICAgIGRvY3VtZW50OiBbe2Rpdn0se2FiYnJ9LHt2YXJ9XSxcbiAgICAgICAgICAgIC8vICAgIG1haW46IFt7ZGl2fV0sXG4gICAgICAgICAgICAvLyAgICBuYXZpZ2F0aW9uOiBbe2Rpdn1dXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmICghbncuZWxlbSgpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNoZWNrIHRoZSBlbGVtZW50cyB3aGljaCBoYXZlIHRoZSByb2xlIGF0dHJpYnV0ZSBhc3NpY2lhdGVkIHRvIHRoZW1cbiAgICAgICAgICAgICAgICBpZiAoIW53LmJFbmRUYWcpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd1JvbGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlIG5vZGUgaGFzIHJvbGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICBpZiAobncuZWxlbSgpICYmIG53LmVsZW0oKS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGFsbCB0aGUgcm9sZXMgdGhhdCBhcmUgYXNzaWduZWQgdG8gdGhpcyBlbGVtZW50LCBjYW4gaGF2ZSBtdWx0aXBsZSByb2xlcyBvbiBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgc3BsaXQgYnkgc3BhY2UsIHNvIHdlIG5lZWQgdG8gZXh0cmFjdCBhbGwgb2YgdGhlbSBpbnRvIGFuIGFycmF5LlxuICAgICAgICAgICAgICAgICAgICAgICAgd1JvbGVzID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInJvbGVcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG53LmVsZW0oKSAmJiB3Um9sZXMubGVuZ3RoID09PSAwICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXRSb2xlID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKG53Lm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Um9sZXMgPSBpbXBsaWNpdFJvbGU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAod1JvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSByb2xlcyBhbmQgYXNzaWduZWQgdGhpcyBub2RlIHRvIGFsbCB0aGVzIHJvbGVzXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd1JvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIGtleSBpcyBub3QgYWxyZWFkeSBpbiB0aGUgcm9sZVRvRWxlbXMgaGFzaCwgY29uc3RydWN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBrZXkgYW5kIGFzc2lnbiBlbXB0eSBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHdSb2xlc1tpXSBpbiByb2xlVG9FbGVtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlVG9FbGVtc1t3Um9sZXNbaV1dID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgYXJyYXkgZm9yIHRoZSByb2xlXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlVG9FbGVtc1t3Um9sZXNbaV1dLnB1c2gobncubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgcm9sZVRvRWxlbXMgaGFzaCBtYXAgYXMgYSBnbG9iYWwgdmFyaWFibGVcbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCByb2xlVG9FbGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfR0VURUxFTUVOVFNCWV9ST0xFXCIsIHJvbGVUb0VsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlsaXplIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgdGhlIHByb3ZpZGVkIHJvbGUgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSxcbiAgICAgICAgLy8gZm9yIHRoaXMgY2FzZSB3ZSB0YWtlIHRoZSBzdHJpbmcgYW5kIHB1dCBpdCBpbnRvIGFuIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2YgKHJvbGVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSByb2xlcztcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICByb2xlcy5wdXNoKHJvbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSByb2xlcyB0aGF0IHdlcmUgcHJvdmlkZWQgYW5kIGZpbmQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgZm9yIHRoaXMgcm9sZXNcbiAgICAgICAgLy8gYW5kIGFkZCB0aGVtIHRvIHRoZSByZXR1cm4gdmFsdWUuXG4gICAgICAgIGlmIChyb2xlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIHJvbGVzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgcm9sZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGxldCBuZXh0Um9sZSA9IHJvbGVzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEZldGNoIHRoZSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgZm9yIHRoaXMgcm9sZVxuICAgICAgICAgICAgICAgIGxldCBjb3B5Um9sZXMgPSByb2xlVG9FbGVtc1tuZXh0Um9sZV07XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgZWxlbWVudHMgdG8gY29weSB0byBhbm90aGVyIGFycmF5LCB0aGVuIHBlcmZvcm0gdGhlIGNvcHlcbiAgICAgICAgICAgICAgICBpZiAoY29weVJvbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIGFyZSB0byBiZSBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3B5Um9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIGVsZW1lbnQgdG8gdGhlIHJldHVybiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNvcHlSb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBhIHRhcmdldCBpcyBlbiBlbGVtZW50IHRoYXQgYWNjZXB0IGEgcG9pbnRlciBhY3Rpb24gKGNsaWNrIG9yIHRvdWNoKVxuICAgICAgICAgKiBcbiAgICAgICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1RhcmdldChlbGVtZW50KSB7IFxuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5ub2RlVHlwZSAhPT0gMSBcbiAgICAgICAgICAgIHx8IFtcImh0bWxcIiwgXCJib2R5XCJdLmluY2x1ZGVzKGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgW1wic3ZnXCIsIFwicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIiwgJ2hlYWQnXSkgIT09IG51bGwgXG4gICAgICAgICAgICB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpIHx8IFZpc1V0aWwuaXNOb2RlVmlzdWFsbHlIaWRkZW4oZWxlbWVudCkgXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKGVsZW1lbnQpIHx8IFZpc1V0aWwuaXNFbGVtZW50T2Zmc2NyZWVuKGVsZW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNDbGlja2FibGUoZWxlbWVudCkpIFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtZW50KTtcbiAgICAgICAgaWYgKCFyb2xlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0X3JvbGVzID0gW1wibGlzdGl0ZW1cIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzd2l0Y2hcIiwgXCJ0cmVlaXRlbVwiXTtcbiAgICAgICAgaWYgKHRhcmdldF9yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgLy8gZmluZCB0aGUgcHJvcGVyIHBhcmVudCBlbGVtZW50c1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRfcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIC8vIGRhdGFsaXN0LCBmaWVsZHNldCwgb3B0Z3JvdXAsIGV0Yy4gbWF5IGJlIGp1c3QgdXNlZCBmb3IgZ3JvdXBpbmcgcHVycG9zZSwgc28gZ28gdXAgdG8gdGhlIHBhcmVudFxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfcm9sZSA9PT0gJ2dyb3VwJylcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgQ29tbW9uVXRpbC5pc1RhcmdldChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRGaWxlRXh0KHVybCkge1xuICAgICAgICBsZXQgbSA9IHVybC5tYXRjaCgvXFwuKChbXjs/I1xcLl18XiQpKykoWzs/I118JCkvKTtcbiAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIuXCIgKyBtWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbGVBbmNob3IodXJsKSB7XG4gICAgICAgIGxldCBtID0gdXJsLm1hdGNoKC8jKChbXjs/XFwuXXxeJCkrKShbOz9dfCQpLyk7XG4gICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIG1bMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tPYmpFbWJlZChub2RlLCBleHRUZXN0LCBtaW1lVGVzdCkge1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lICE9IFwib2JqZWN0XCIgJiYgbm9kZU5hbWUgIT0gXCJlbWJlZFwiICYmXG4gICAgICAgICAgICBub2RlTmFtZSAhPSBcImFcIiAmJiBub2RlTmFtZSAhPSBcImFyZWFcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIC8vIENoZWNrIG1pbWUgdHlwZVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCBtaW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcImNvZGV0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgbWltZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiY29kZXR5cGVcIik7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSBmaWxlbmFtZVxuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJlbWJlZFwiKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiYVwiIHx8IG5vZGVOYW1lID09PSBcImFyZWFcIikge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmhhc0F0dHJpYnV0ZShcImRhdGFcIikpIHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlbmFtZSA9PT0gbnVsbCkgZmlsZW5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dChmaWxlbmFtZSk7XG4gICAgICAgICAgICByZXRWYWwgPSBleHRUZXN0KGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgZmlsZW5hbWVzIGluIHRoZSBwYXJhbXNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgbm9kZU5hbWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgQ2hlY2sgSGlkZGVuIE9wdGlvbiBpcyBzZXQgdGhlbiBjb21wbHkgd2l0aCB0aGF0IHNldHRpbmdcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4obm9kZSwgXCJwYXJhbVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBwYXJhbXMgIT0gbnVsbCAmJiBpIDwgcGFyYW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcGFyYW1zW2ldLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIGV4dFRlc3QoQ29tbW9uVXRpbC5nZXRGaWxlRXh0KHBhcmFtc1tpXS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNBdWRpb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgQ29tbW9uVXRpbC5pc0F1ZGlvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImF1ZGlvXCIpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzQXVkaW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCBhdWRpb19leHRlbnNpb25zID0gW1wiLmFpZlwiLCBcIi5haWZjXCIsIFwiLmFpZmZcIiwgXCIuYWlyXCIsIFwiLmFzZlwiLCBcIi5hdVwiLCBcIi5jZGFcIixcbiAgICAgICAgICAgIFwiLmRzbVwiLCBcIi5kc3NcIiwgXCIuZHdkXCIsIFwiLmlmZlwiLCBcIi5rYXJcIiwgXCIubTFhXCIsIFwiLm1lZFwiLFxuICAgICAgICAgICAgXCIubXAyXCIsIFwiLm1wM1wiLCBcIi5tcGFcIiwgXCIucGNtXCIsIFwiLnJhXCIsIFwiLnJhbVwiLCBcIi5ybVwiLFxuICAgICAgICAgICAgXCIuc2FtXCIsIFwiLnNmXCIsIFwiLnNmMlwiLCBcIi5zbXBcIiwgXCIuc25kXCIsIFwiLnN2eFwiLCBcIi51bFwiLFxuICAgICAgICAgICAgXCIudm9jXCIsIFwiLndhdlwiLCBcIi53bWFcIiwgXCIud3ZlXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShleHQudG9Mb3dlckNhc2UoKSwgYXVkaW9fZXh0ZW5zaW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNWaWRlb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgQ29tbW9uVXRpbC5pc1ZpZGVvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcInZpZGVvXCIpIHx8XG4gICAgICAgICAgICAgICAgbWltZS5zdGFydHNXaXRoKFwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2hcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzVmlkZW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCB2aWRlb19leHRlbnNpb25zID0gW1wiLmFzZlwiLCBcIi5hdmlcIiwgXCIuZGl2eFwiLCBcIi5kdlwiLCBcIi5tMXZcIiwgXCIubTJwXCIsIFwiLm0ydlwiLCBcIi5tb292XCIsXG4gICAgICAgICAgICBcIi5tb3ZcIiwgXCIubXA0XCIsIFwiLm1wZWdcIiwgXCIubXBnXCIsIFwiLm1wdlwiLCBcIi5vZ21cIiwgXCIub21mXCIsIFwiLnF0XCIsXG4gICAgICAgICAgICBcIi5ybVwiLCBcIi5ydlwiLCBcIi5zbWlcIiwgXCIuc21pbFwiLCBcIi5zd2ZcIiwgXCIudm9iXCIsIFwiLndtdlwiLCBcIi5ybXZiXCIsXG4gICAgICAgICAgICBcIi5tdmJcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCB2aWRlb19leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0ltYWdlT2JqRW1iZWRMaW5rKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuY2hlY2tPYmpFbWJlZChub2RlLCBDb21tb25VdGlsLmlzSW1nRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImltYWdlXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGltYWdlX2V4dGVuc2lvbnMgPSBbXCIuYm1wXCIsIFwiLmdpZlwiLCBcIi5qcGdcIiwgXCIuanBlZ1wiLCBcIi5wY3hcIiwgXCIucG5nXCJdO1xuICAgICAgICBcbiAgICBwdWJsaWMgc3RhdGljIGlzSW1nRXh0KGV4dCkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBDb21tb25VdGlsLmltYWdlX2V4dGVuc2lvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEV4dChleHQpIHtcbiAgICAgICAgbGV0IGh0bWxfZXh0ZW5zaW9ucyA9IFtcIi5hc3BcIiwgXCIuYXNweFwiLCBcIi5jZm1cIiwgXCIuY2ZtbFwiLCBcIi5jZ2lcIiwgXCIuaHRtXCIsIFwiLmh0bWxcIiwgXCIuc2h0bVwiLFxuICAgICAgICAgICAgXCIuc2h0bWxcIiwgXCIucGhwXCIsIFwiLnBsXCIsIFwiLnB5XCIsIFwiLnNodG1cIiwgXCIuc2h0bWxcIiwgXCIueGh0bWxcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBodG1sX2V4dGVuc2lvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzVHJpZ2dlcmVkKGRvYywgaWQpIHtcbiAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIGlkLCBmYWxzZSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgdHJpZ2dlck9uY2UoZG9jLCBpZCwgcGFzc2VkKSB7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgdHJpZ2dlcmVkID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgaWQsIGZhbHNlKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgaWQsIHRydWUpO1xuICAgICAgICByZXR1cm4gdHJpZ2dlcmVkO1xuICAgIH1cblxuICAgIC8qIGRldGVybWluZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgZXhpc3RzIGluIHRoZSBnaXZlbiBhcnJheSAqL1xuICAgIHB1YmxpYyBzdGF0aWMgdmFsSW5BcnJheSh2YWx1ZSwgYXJyKSB7XG4gICAgICAgIGZvciAobGV0IGlkeCBpbiBhcnIpIHtcbiAgICAgICAgICAgIGlmIChhcnJbaWR4XSA9PT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gICAgICogQHBhcmFtIHRhZ05hbWVzIHN0cmluZywgYXJyYXksIG9yIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgdGFncyB0byBzZWFyY2ggZm9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcihlbGVtZW50LCB0YWdOYW1lcykge1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0aGlzVGFnID0gd2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRhZ05hbWVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzVGFnID09PSB0YWdOYW1lcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4IGluIHRhZ05hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdOYW1lc1tpZHhdID09PSB0aGlzVGFnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1RhZyBpbiB0YWdOYW1lcykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH1cblxuICAgIC8vIHJldHVybiB0cnVlIGlmIGVsZW1lbnQxIGFuZCBlbGVtZW50MiBhcmUgc2libGluZ3NcbiAgICBwdWJsaWMgc3RhdGljIGlzU2libGluZyhlbGVtZW50MSwgZWxlbWVudDIpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQxICYmIGVsZW1lbnQyKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudDEpICYmIERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKS5maXJzdENoaWxkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlID09PSBlbGVtZW50MikgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEZXNjZW5kYW50KHBhcmVudCwgY2hpbGQpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShjaGlsZCk7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9jaGVjayBpZiB0aGUgZmlyc3QgZm9ybSBjb250cm9sIGNoaWxkIGlzIGRpc2FibGVkXG4gICAgcHVibGljIHN0YXRpYyBpc0Rpc2FibGVkQnlGaXJzdENoaWxkRm9ybUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgZm9ybUVsZW1lbnRzID0gW1wiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiLCBcImtleWdlblwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJvdXRwdXRcIl07XG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm1FbGVtZW50cy5pbmNsdWRlcyhudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKG53Lm5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEaXNhYmxlZEJ5UmVmZXJyaW5nRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIGxldCBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGxldCBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCByb290ID0gZG9jLmJvZHk7XG4gICAgICAgIHdoaWxlIChET01XYWxrZXIucGFyZW50Tm9kZShyb290KSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlXG4gICAgICAgICAgICByb290ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihyb290KTtcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBlbGVtZW50IHdob3NlICdhcmlhLWRlc2NyaWJlZGJ5JyBlcXVhbHMgdG8gdGhlIGlkXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGxldCBBcmlhRGVzY3JpYmVkYnlJREFycmF5ID0gKG53LmVsZW0oKS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYURlc2NyaWJlZGJ5SURBcnJheS5pbmNsdWRlcyhpZCkgJiYgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBnZXQgZWxlbWVudCBjb250YWluaW5nIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbWlzbGVhZGluZy4gVXNlIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSBpbnN0ZWFkXG4gICAgICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5wdXRMYWJlbChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtlbGVtZW50fSBlbGVtZW50IC0gcmV0dXJuIHRoZSBlbGVtZW50IGZvciB0aGUgbGFiZWwsIG90aGVyd2lzZSBudWxsXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBsYWJlbCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIGNvbnRhaW5pbmcgbGFibGUgZWxlbWVudCBpcyBoaWRkZW4sIHdoZW4gdGhlIGlnbm9yZUhpZGRlbiBvcHRpb25cbiAgICAgKiBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggbGFiZWwgc2hvdWxkIGJlIGlnbm9yZWQgZnJvbSB0aGUgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiB0aGUgaGlkZGVuIGVsZW1lbnRzIHNob3VsZCBiZSBhZGRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7ZWxlbWVudH0gZWxlbWVudCAtIHJldHVybiB0aGUgZWxlbWVudCBmb3IgdGhlIGxhYmVsLCBvdGhlcndpc2UgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4oZWxlbWVudDogRWxlbWVudCwgaWdub3JlSGlkZGVuKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBnbG9iYWwgQXJpYVV0aWxfTEFCRUxTIGhhc2ggaXMgYXZhaWxhYmxlLCBhcyB0aGlzIHdpbGwgY29udGFpbiB0aGUgbGFiZWwgbm9kZXMgYmFzZWQgb25cbiAgICAgICAgLy8gZm9yIGF0dHJpYnV0ZS5cbiAgICAgICAgLy9pZiAoIWdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCxcIkFyaWFVdGlsX0xBQkVMU1wiLCBudWxsKSkge1xuICAgICAgICBsZXQgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICAgICAgaWYgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUoKHJvb3Qubm9kZVR5cGUgPT09IDExKSA/IDxTaGFkb3dSb290PnJvb3QgOiA8RG9jdW1lbnQ+cm9vdCwgXCJBcmlhVXRpbF9MQUJFTFNcIiwgbnVsbCkpIHtcbiAgICAgICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgICAgICBsZXQgaWRUb0xhYmVsID0ge31cblxuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgbGFiZWwgZWxlbWVudHMgaW4gdGhlIGVudGlyZSBkb2NcbiAgICAgICAgICAgIGxldCBsYWJlbE5vZGVzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYWJlbCBub2RlcywgaW4gdGhlIGNhc2UgdGhlIGxhYmVsIG5vZGUgaGFzIGEgZm9yIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgdGhhdCBhdHRyaWJ1dGUgYW5kIGFkZCB0aGlzIG5vZGUgdG8gdGhlIGhhc2ggaWYgaXQgaXMgdmlzaWJsZS5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFiZWxOb2Rlcy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiZm9yXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGlnbm9yZSBoaWRkZW4gaXMgc3BlY2lmaWVkIGFuZCB0aGUgbm9kZSBpcyBub3QgdmlzaWJsZSB3ZSBkbyBub3QgYWRkIGl0IHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBsYWJlbE5vZGVzIGhhc2guXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVIaWRkZW4gJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShsYWJlbE5vZGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZFRvTGFiZWxbbGFiZWxOb2Rlc1tpXS5nZXRBdHRyaWJ1dGUoXCJmb3JcIildID0gbGFiZWxOb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgYnVpbHQgaGFzaCB0byB0aGUgb3duZXJEb2N1bWVudCAoZG9jdW1lbnQpLCB0byBiZSB1c2VkIGxhdGVyIHRvIGZhc3QgcmV0cml2YWxcbiAgICAgICAgICAgIC8vc2V0Q2FjaGUoZWxlbWVudC5vd25lckRvY3VtZW50LCBcIkFyaWFVdGlsX0xBQkVMU1wiLCBpZFRvTGFiZWwpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSkgPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiQXJpYVV0aWxfTEFCRUxTXCIsIGlkVG9MYWJlbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgaGFzIGFuIGlkIGF0dHJpYnV0ZSwgZ2V0IHRoZSBjb3Jvc3BvbmRpbmcgbGFiZWwgZWxlbWVudFxuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIGlkIGF0dHJpYnV0ZVxuICAgICAgICAgICAgbGV0IGN0cmxJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcm9zcG9uZGluZyBsYWJlbCBlbGVtZW50LlxuICAgICAgICAgICAgLy8gTm90ZTogaW4gdGhlIGNhc2UgdGhhdCB0aGUgdGhlIGlkIGlzIG5vdCBmb3VuZCBpbiB0aGUgaGFzaCB0aGF0IG1lYW5zLCBpdCBkb2VzIG5vdCBleGlzdHMgb3IgaXMgaGlkZGVuXG4gICAgICAgICAgICBpZiAoY3RybElkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gZ2V0Q2FjaGUoZWxlbWVudC5nZXRSb290Tm9kZSgpLm93bmVyRG9jdW1lbnQsXCJBcmlhVXRpbF9MQUJFTFNcIix7fSlbY3RybElkXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLmdldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSkgPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiQXJpYVV0aWxfTEFCRUxTXCIsIHt9KVtjdHJsSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiBzcGVjaWZpZWQgZWxlbWVudCBhdHRyaWJ1dGUgaWYgcHJlc2VudCBlbHNlIHJldHVybiBudWxsICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50QXR0cmlidXRlKGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgLy9yZXR1cm4gKGVsZW1lbnQgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cikpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cikgOiBudWxsO1xuICAgICAgICBpZiAoIWF0dHIgfHwgIWVsZW1lbnQgfHwgIWVsZW1lbnQuaGFzQXR0cmlidXRlIHx8ICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGF0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cilcbiAgICAgICAgaWYgKCFBUklBRGVmaW5pdGlvbnMucmVmZXJlbmNlUHJvcGVydGllcy5pbmNsdWRlcyhhdHRyKSlcbiAgICAgICAgICAgIHJldHVybiBhdHJWYWx1ZTtcblxuICAgICAgICAvL2F0dHIgaXMgYSByZWZlcmVuY2UgdG8gb3RoZXIgZWxlbWVudHMocylcbiAgICAgICAgY29uc3QgdmFsdWVzID0gYXRyVmFsdWUuc3BsaXQoLyArL2cpO1xuICAgICAgICAvL2lnbm9yZSBpZiBub25lIG9mIHRoZSByZWZlcnJlZCBlbGVtZW50KHMpIGV4aXN0IG9yIGFsbCBwb2ludCB0byB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICAgICAgbGV0IGV4aXN0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGlkID0gMDsgdmFsdWVzIDwgdmFsdWVzLmxlbmd0aDsgKytpZCkge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJyZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2YWx1ZXNbaWRdKTtcbiAgICAgICAgICAgIGlmIChyZWZlcnJlZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShyZWZlcnJlZCwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4aXN0ID8gYXRyVmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIGVsZW1lbnQgaGFzIHZhbGlkIGltcGxpY2l0IGxhYmVsXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbXBsaWNpdExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgIC8vIFRlc3QgIGEpIGlmIHRoZSBwYXJlbnQgaXMgYSBsYWJlbCB3aGljaCBpcyB0aGUgaW1wbGljaXQgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYikgaWYgdGhlIGZvcm0gZWxlbWVudCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxhYmVsXG4gICAgICAgIC8vICAgICAgIGMpIGlmIHRoZSBmb3JtIGVsZW1lbnQgcmVxdWlyZXMgYW4gaW1wbGljaXQgb3IgZXhwbGljaXQgbGFiZWwgOiBcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXG4gICAgICAgIC8vICAgICAgIGQpIGZvcm0gZWxlbWVudHMgd2hpY2ggbWF5IGhhdmUgYSBsYWJlbDogYnV0dG9uXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCBlbGVtZW50IGFyZTpcbiAgICAgICAgLy8gXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImRhdGFsaXN0XCIoYWRkZWQgbGF0ZXIpLiBUaGVzZSB3ZXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIG1haW4gcnVsZSwgbWlnaHQgbmVlZCB0byByZWZhY3RvciB0aGUgY29kZSBsYXRlclxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICBwYXJlbnRDbG9uZSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgIHJldHVybiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihwYXJlbnRDbG9uZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGltcGxpY2l0IGxhYmVsIG9mIHRoZSBnaXZlbiBmb3JtIGZpZWxkXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbXBsaWNpdExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgIC8vIFRlc3QgIGEpIGlmIHRoZSBwYXJlbnQgaXMgYSBsYWJlbCB3aGljaCBpcyB0aGUgaW1wbGljaXQgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYikgaWYgdGhlIGZvcm0gZWxlbWVudCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxhYmVsXG4gICAgICAgIC8vICAgICAgIGMpIGlmIHRoZSBmb3JtIGVsZW1lbnQgcmVxdWlyZXMgYW4gaW1wbGljaXQgb3IgZXhwbGljaXQgbGFiZWwgOiBcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXG4gICAgICAgIC8vICAgICAgIGQpIGZvcm0gZWxlbWVudHMgd2hpY2ggbWF5IGhhdmUgYSBsYWJlbDogYnV0dG9uXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCBlbGVtZW50IGFyZTpcbiAgICAgICAgLy8gXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImRhdGFsaXN0XCIoYWRkZWQgbGF0ZXIpLiBUaGVzZSB3ZXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIG1haW4gcnVsZSwgbWlnaHQgbmVlZCB0byByZWZhY3RvciB0aGUgY29kZSBsYXRlclxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICBwYXJlbnRDbG9uZSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgcmV0dXJuIGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gJycgPyBsYWJlbC50cmltKCkgOiBudWxsO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgdGhlIGxhYmVsIGZvciBhIGZvcm0gZmllbGQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRleHQgLSByZXR1cm4gdGhlIGxhYmVsIHRleHQgb3IgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRGb3JtRmllbGRMYWJlbChlbGVtKSA6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAvLyBnZXQgdGhlIGxhYmVsIGZyb20gdGhlIGF0dHJpYnV0ZSBcImZvclwiIG9mIHRoZSBsYWJlbCBlbGVtZW50XG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgdmFsdWUgPSBcIlwiO1xuICAgICAgICBsZXQgbGFiZWwgPSBudWxsO1xuICAgICAgICBsZXQgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4oZWxlbSwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgIC8vIHZhbHVlIGRpcmVjdGx5IGZyb20gZWxlbWVudCB0ZXh0XG4gICAgICAgICAgICBsYWJlbCA9IGxhYmVsRWxlbS5pbm5lclRleHQ7IC8vIGlnbm9yZSBoaWRkZW4gdGV4dFxuICAgICAgICB9IGVsc2UgeyAgICBcbiAgICAgICAgICAgIC8qKiBpZiBpdCdzIG5vdCBsYWJlbCB3aXRoIGZvciBhdHRyaWJ1dGUsIHRoZW4gZmluZCBpbXBsaWNpdCBsYWJlbFxuICAgICAgICAgICAgICogY2FzZXMgZm9yIGV4cGxpY3QgbGFiZWw6IFxuICAgICAgICAgICAgICogICA8bGFiZWwgZm9yPSdteSc+PC9sYWJlbD48aW5wdXQgaWQ9J215Jy8+XG4gICAgICAgICAgICAgKiAgIDxsYWJlbCBmb3I9J215Jz48aW5wdXQgaWQ9J215Jy8+PC9sYWJlbD4gICBcbiAgICAgICAgICAgICAqIGNhc2VzIGZvciBpbXBsaWNpdCBsYWJlbDogXG4gICAgICAgICAgICAgKiAgICA8bGFiZWw+PGlucHV0IC8+PC9sYWJlbD5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBcImxhYmVsXCIpO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSAmJiBsYWJlbEVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQobGFiZWxFbGVtLCBlbGVtKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IGxhYmVsRWxlbS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgdGhlIHRleHQgZnJvbSB0aGUgZmlyc3QgZm9ybSBlbGVtZW50IHNpbmNlIHRoZXkgbWlnaHQgYWxzbyBcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGlubmVyIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIGlubmVyVGV4dFxuICAgICAgICAgICAgICAgIHBhcmVudENsb25lID0gQ29tbW9uVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgICAgIGxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG4gICAgICAgIFxuICAgICAgICAvLyB2YWx1ZSBmcm9tIGNoaWxkIGVsZW1lbnQgYXR0cmlidXRlXG4gICAgICAgIGxhYmVsID0gQ29tbW9uVXRpbC5nZXRMYWJlbFRleHRGcm9tQXR0cmlidXRlKGxhYmVsRWxlbSwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG5cbiAgICAgICAgLy8gd2lyZWQgY2FzZTogZ2V0IGFyaWEgbGFiZWwgZnJvbSBsYWJlbCBlbGVtZW50IGl0c2VsZiBqdXN0IGluIGNhc2UgKHRob3VnaCBuYW1lIHByb2hpYml0ZWQgZnJvbSBhcmlhIGluIGh0bWwpXG4gICAgICAgIGxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKGxhYmVsRWxlbSk7XG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjYWxjdWxhdGUgbGFiZWwgZnJvbSBlbWJlZGRlZCBjb250cm9sOiBodHRwczovL3czYy5naXRodWIuaW8vYWNjbmFtZS9cbiAgICAgKiBAcGFyYW0ge2VsZW1lbnR9IGxhYmVsRWxlbSBsYWJlbCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVIaWRkZW4gLSB0cnVlIGlmIGhpZGRlbiBlbGVtZW50cyB3aXRoIGxhYmVsIHNob3VsZCBiZSBpZ25vcmVkIGZyb20gdGhlIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgYWRkZWQgIFxuICAgICAqIEByZXR1cm5zIGxhYmVsIHRleHQgb3IgJydcbiAgICAgKiBcbiAgICAgKiBub3RlIHRoZSBhc3N1bXB0aW9uIGlzIHRoZSBsYWJlbEVsZW0gcmVmZXJzIGVpdGhlciB0byBhIGxhYmVsbGVkIGVsZW1lbnQgYnkgJ2ZvcicgYXR0cmlidXRlIFxuICAgICAqICBvciBpdHMgZmlyc3QgZm9ybSBmaWVsZCBpcyBsYWJiZWxsZWQgZWxlbWVudFxuICAgICAqLyBcbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsVGV4dEZyb21BdHRyaWJ1dGUobGFiZWxFbGVtOiBFbGVtZW50LCBpZ25vcmVIaWRkZW46IGJvb2xlYW4pIDogc3RyaW5nIHtcbiAgICAgICAgLy8gbGFiZWwgZWl0aGVyIHBvaW50cyB0byBhIGxhYmVsYWJsZSBlbGVtZW50IGJ5IGl0cyBmb3IgYXR0cmlidXRlIG9yIHRoZSBmaXJzdCBlbGVtZW50IGNoaWxkXG4gICAgICAgIC8vIGdldCB0aGUgbGFiZWxsZWQgZWxtZW50IGlmIGl0J3MgYW4gaW1wbGljaXQgbGFiZWxcbiAgICAgICAgbGV0IGxhYmVsZWRFbGVtID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGFiZWxFbGVtLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZDogRWxlbWVudCA9IGxhYmVsRWxlbS5jaGlsZHJlbi5pdGVtKGkpO1xuICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuZm9ybV9sYWJlbGFibGVfZWxlbWVudHMuaW5jbHVkZXMoY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbGVkRWxlbSA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGxhYmVsRWxlbSk7XG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgLy8gb25seSBjaGVjayBlbGVtZW50IGNoaWxkcmVuXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBudy5lbGVtKCk7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIGl0J3MgaGlkZGVuLCBvciBsYWJlbGxlZCBlbGVtZW50LCBvciBmaXJzdCBmb3JtIGVsZW1lbnQgaWYgbm90IGxhYmVsZWQgYnkgZm9yIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGlmICgoaWdub3JlSGlkZGVuICYmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSB8fCBWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGVsZW0pKSlcbiAgICAgICAgICAgICAgICAgICAgfHwgKGxhYmVsZWRFbGVtICYmIGxhYmVsZWRFbGVtLmNvbnRhaW5zKGVsZW0pKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgIC8vIHRleHRib3ggZXRjLiByZXR1cm4gaXRzIHRleHQgdmFsdWVcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJ0ZXh0Ym94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIG5hbWUudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb2xlID09PSBcImNvbWJvYm94XCIgfHwgcm9sZSA9PT0gXCJsaXN0Ym94XCIpIHsgXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb21ib2JveCBvciBsaXN0Ym94IHJvbGVzLCByZXR1cm4gdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGNob3NlbiBvcHRpb24uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb24gPSBlbGVtLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZWN0ZWRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgc2VsZWN0ZWRPcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShzZWxlY3RlZE9wdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFtcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiLCBcIm1ldGVyXCJdLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciByYW5nZSByb2xlIHR5cGUsIGluY2x1ZGluZyBcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiIHJvbGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcmlhLXZhbHVldGV4dCBwcm9wZXJ0eSBpcyBwcmVzZW50LCByZXR1cm4gaXRzIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBhcmlhLXZhbHVlbm93IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxseSB1c2UgbmF0aXZlIHZhbHVlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgYXJpYSBsYWJlbCBmcm9tIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSAhPT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dC50cmltKCk7ICAgIFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNGaXJzdEZvcm1FbGVtZW50KHBhcmVudE5vZGUsIGVsZW1lbnQpIHtcbiAgICAgICAgLy9sZXQgZm9ybUVsZW1lbnRzUmVxdWlyaW5nTGFiZWwgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXTtcbiAgICAgICAgaWYgKHBhcmVudE5vZGUuZmlyc3RDaGlsZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHBhcmVudE5vZGUpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmRleE9mKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudy5ub2RlID09PSBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBzaGFkb3cgaG9zdCBvciBkZXNjZW5kYW50IG9mIGEgc2hhZG93IGhvc3QsIGJ1dCBub3QgYSBkZXNjZWRhbnQgb2YgdGhlIHNoYWRvdyByb290IG9mIHRoZSBob3N0ICh0byBiZSBhc3NpZ25lZCB0byBzaGFkb3cgc2xvdCBvciBpZ25vcmVkKSAgXG4gICAgcHVibGljIHN0YXRpYyBpc1NoYWRvd0hvc3RFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgd2Fsa05vZGU6IEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5zaGFkb3dSb290KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvL2NoZWNrIGlmIGFuIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3cgdHJlZVxuICAgIHB1YmxpYyBzdGF0aWMgaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIGlmIChyb290LnRvU3RyaW5nKCkgPT09IFwiW29iamVjdCBTaGFkb3dSb290XVwiKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChlbGVtZW50KSB7XG4gICAgICAgIGxldCBmb3JtRWxlbWVudHMgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiZGF0YWxpc3RcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImtleWdlblwiLCBcIm91dHB1dFwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIl07XG4gICAgICAgIGxldCBjaGlsZE5vZGVzID0gZWxlbWVudC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtRWxlbWVudHMuaW5kZXhPZihjaGlsZE5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudCBcbiAgICAgICAgICogQHBhcmFtIGlkU3RyIFxuICAgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFueSBvbmUgKGlmIG11bHRpcGxlIElkcykgaWQgcG9pbnRzIHRvIGl0c2VsZlxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzSWRSZWZlclRvU2VsZihlbGVtZW50LCBpZFN0cjogU3RyaW5nKSB7XG4gICAgICAgIGlmICghaWRTdHIgfHwgaWRTdHIudHJpbSgpID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgaWRzID0gaWRTdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGlkcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgbGV0IHJlZmVycmVkTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnQsIGlkc1tqXSk7XG4gICAgICAgICAgICBpZiAocmVmZXJyZWROb2RlICYmIERPTVV0aWwuc2FtZU5vZGUocmVmZXJyZWROb2RlLCBlbGVtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIERldGVybWluZSB0aGUgbm9kZSBkZXB0aCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbm9kZURlcHRoKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRlcHRoID0gMDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9XG5cbiAgICAvKiBjb21wYXJlIG5vZGUgb3JkZXIgb2YgdGhlIDIgZ2l2ZW4gbm9kZXMgKi9cbiAgICAvKiByZXR1cm5zXG4gICAgICogICAwIGlmIHRoZSBub2RlcyBhcmUgZXF1YWxcbiAgICAgKiAgIDEgaWYgbm9kZSBiIGlzIGJlZm9yZSBub2RlIGFcbiAgICAgKiAgLTEgaWYgbm9kZSBhIGlzIGJlZm9yZSBub2RlIGJcbiAgICAgKiAgIDIgaWYgbm9kZSBhIGlzIG5lc3RlZCBpbiBub2RlIGJcbiAgICAgKiAgLTIgaWYgbm9kZSBiIGlzIG5lc3RlZCBpbiBub2RlIGFcbiAgICAgKiAgIG51bGwgaWYgZWl0aGVyIG5vZGUgaXMgbnVsbCBvciB0aGVpciBwYXJlbnQgbm9kZXMgYXJlIG5vdCBlcXVhbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZU5vZGVPcmRlcihub2RlQSwgbm9kZUIpIHtcbiAgICAgICAgaWYgKG5vZGVBID09PSBub2RlQikgcmV0dXJuIDA7XG5cbiAgICAgICAgbGV0IGFEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVBKTtcbiAgICAgICAgbGV0IGJEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVCKTtcbiAgICAgICAgaWYgKGJEZXB0aCA+IGFEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiRGVwdGggLSBhRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQiA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVCKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQiBuZXN0ZWQgaW4gTm9kZSBBXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0yO1xuICAgICAgICB9IGVsc2UgaWYgKGFEZXB0aCA+IGJEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwdGggLSBiRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQSBuZXN0ZWQgaW4gTm9kZSBCXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5vZGVBICE9IG51bGwgJiYgbm9kZUIgIT0gbnVsbCAmJiBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSB7XG4gICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIG5vZGVCID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlQSA9PT0gbnVsbCB8fCBub2RlQiA9PT0gbnVsbCB8fCBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGVCICE9IG51bGwgJiYgbm9kZUIgIT0gbm9kZUEpXG4gICAgICAgICAgICBub2RlQiA9IG5vZGVCLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKG5vZGVCID09PSBudWxsKSAvLyBub2RlQiBiZWZvcmUgbm9kZUFcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICBlbHNlIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbm90IGVtcHR5XG4gICAgICogIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgYXR0clN0cikge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0clN0cikgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0clN0cikudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZnJhbWUsIG51bGwgaWYgbm90IGZvdW5kICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRGcmFtZUJ5TmFtZShydWxlQ29udGV4dCwgZnJhbWVOYW1lKSB7XG4gICAgICAgIGxldCB3aW5kb3cgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICBsZXQgZnJhbWVMaXN0ID0gW3dpbmRvd107XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICB3aGlsZSAoaWR4IDwgZnJhbWVMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0ubmFtZSA9PT0gZnJhbWVOYW1lKSByZXR1cm4gZnJhbWVMaXN0W2lkeF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFtZUxpc3RbaWR4XS5mcmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBpdCdzIGEgcmVhbCBmcmFtZSBhbmQgYXZvaWQgcmVjdXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldICYmICFmcmFtZUxpc3QuaW5jbHVkZXMoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGlzdC5wdXNoKGZyYW1lTGlzdFtpZHhdLmZyYW1lc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgKytpZHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWZhdWx0TlNSZXNvbHZlcihwcmVmaXgpIHtcbiAgICAgICAgbGV0IHVyaTtcbiAgICAgICAgc3dpdGNoIChwcmVmaXgpIHtcbiAgICAgICAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3gyJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwyJztcbiAgICAgICAgICAgIGNhc2UgJ3gnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3hodG1sJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHVyaSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVyaTtcbiAgICB9XG5cbiAgICAvL2NoZWNraW5nIGlmIG9ubHkgdGhlIGlubmVyIHRleHQgaXMgZW1wdHkgb3Igbm90XG4gICAgcHVibGljIHN0YXRpYyBpc0lubmVyVGV4dE9ubHlFbXB0eShlbGVtZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW5uZXJUZXh0IG9mIHRoZSBlbGVtZW50XG4gICAgICAgIGxldCB0ZXh0ID0gZWxlbWVudC5pbm5lclRleHQ7XG5cbiAgICAgICAgaWYgKCh0ZXh0ID09PSB1bmRlZmluZWQgfHwgdGV4dCA9PT0gbnVsbCB8fCB0ZXh0LnRyaW0oKS5sZW5ndGggPT09IDApICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3Nsb3QnICYmIGVsZW1lbnQudGV4dENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy9pZ25vcmUgc2xvdCBiZWNhdXNlIGl0cyB0ZXh0IHdpbGwgYmUgZmlsbGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGNvbnRlbnQgaW4gdGhlIGxpZ2h0IERPTSBcbiAgICAgICAgICAgIC8vIGlubmVyVGV4dCBpcyBzb21ldGltZXMgJ3VuZGVmaW5lZCcgaW4gaGVhZGxlc3MgbW9kZSwgb3IgbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBpbnZpc2libGUgb3Igbm90IGVyeHBhbmRlZCBcbiAgICAgICAgICAgIC8vIHNvIHdlIHRyeSB0ZXh0Q29udGVudCBhcyBhIHdvcmthcm91bmRcbiAgICAgICAgICAgIHRleHQgPSBlbGVtZW50LnRleHRDb250ZW50XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gISh0ZXh0ICE9PSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiKSB7XG4gICAgICAgICAgICAvL1RPRE86IG5lZWQgdG8gY29uc2lkZSBpdHMgb3duIGNvbnRlbnQsIGEgc2xvdCBtYXkgaGF2ZSBpdHMgb3duIGNvbnRlbnQgb3IgYXNzaWduZWQgY29udGVudFxuICAgICAgICAgICAgZm9yIChjb25zdCBzbG90RWxlbSBvZiBlbGVtZW50LmFzc2lnbmVkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbCAmJiBDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkoc2xvdEVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpbSB0aGUgaW5uZXIgdGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiB0aGUgaW5uZXIgdGV4dCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5uZXJUZXh0KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICBpZiAocmV0VmFsID09PSB1bmRlZmluZWQgfHwgcmV0VmFsID09PSBudWxsIHx8IHJldFZhbC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICByZXRWYWwgPSBlbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBvbnNjcmVlbiBpbm5lclRleHQgb25seS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGFzIGlubmVyVGV4dCBpZiBubyBvZmZzY3JlZW4gY29udGVudCBleGlzdHNcbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGl0IGhhcyBpbm5lciB0ZXh0IG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtudWxsIHwgc3RyaW5nfSBudWxsIGlmIGVsZW1lbnQgaGFzIGVtcHR5IGlubmVyIHRleHQsIHRleHQgb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldE9uU2NyZWVuSW5uZXJUZXh0KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IDMpIHJldHVybiBlbGVtZW50Lm5vZGVWYWx1ZSgpO1xuXG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHRvIGdldCB0aGUgdGV4dFxuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9PSBlbGVtZW50ICYmIG53Lm5vZGUgIT09IGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKG53LmJFbmRUYWcpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5jbHVkZXMobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpIHx8IFZpc1V0aWwuaXNFbGVtZW50T2Zmc2NyZWVuKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpKSkgeyBcbiAgICAgICAgICAgICAgICAvKiogc3BlY2lhbCBjYXNlIGZvciBzdmcgPHRpdGxlPiBlbGVtZW50OiBcbiAgICAgICAgICAgICAgICAgKiAgICAgdGV4dCBpbiBhIDx0aXRsZT4gZWxlbWVudCBpcyBub3QgcmVuZGVyZWQgYXMgcGFydCBvZiB0aGUgZ3JhcGhpYywgYnV0IGJyb3dzZXJzIHVzdWFsbHkgZGlzcGxheSBpdCBhcyBhIHRvb2x0aXBcbiAgICAgICAgICAgICAgICAgKiAgICAgbm90ZSBzb21lIHN2ZyBlbGVtZW50cywgc3VjaCBhcyB0aXRsZSwgZGVzYywgaGF2ZSBhIGJvdW5kcyB7XCJsZWZ0XCI6MCxcInRvcFwiOjAsXCJoZWlnaHRcIjowLFwid2lkdGhcIjowfVxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RpdGxlJyAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKG53Lm5vZGUsIFwic3ZnXCIpKSBcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5uZXh0U2libGluZy5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZSAmJiBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZS50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIG53Lm5vZGUgPSBudy5ub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5vZGVWYWx1ZSAmJiBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0LnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJuIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGdpdmVuIG5vZGUgXG4gICAgICogIHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gaW5uZXJUZXh0IG9yIHRleHRDb250ZW50IHRoYXQgcmV0dXJuIHRleHQgY29udGVudCBvZiBhIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50c1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXROb2RlVGV4dChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT0gMykge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgZWxlbWVudHMgaW5uZXIgdGV4dCBpcyBlbXB0eSBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpdCBoYXMgaW5uZXIgdGV4dCBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gdHJ1ZSBpZiBlbGVtZW50IGhhcyBlbXB0eSBpbm5lciB0ZXh0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNJbm5lclRleHRFbXB0eShlbGVtZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW5uZXJUZXh0IG9mIHRoZSBlbGVtZW50XG4gICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG5cbiAgICAgICAgLy8gVHJpbSB0aGUgaW5uZXIgdGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gISh0ZXh0ICE9IG51bGwgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgdGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGVsZW1lbnQpO1xuICAgICAgICBsZXQgaGFzQ29udGVudCA9ICh0ZXh0ICE9PSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNDb250ZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluZSBpZiBhbiBlbGVtZW50IGhhcyBpbm5lciBjb250ZW50LlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMgY2FzZXMgd2hlcmUgaW5uZXIgdGV4dCBpcyBoaWRkZW4sIHdoaWNoIG5vdyB3aWxsXG4gICAgICogYmUgY2xhc3NpZmllZCBhcyBkb2VzIG5vdCBoYXZlIGhpZGRlbiBjb250ZW50LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaXQgaGFzIGlubmVyIHRleHQgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgZWxlbWVudCBoYXMgZW1wdHkgaW5uZXIgdGV4dCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbkh5cGVyTGluayhlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzdmdIYXNOYW1lKGVsZW1lbnQ6IFNWR0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsXCIpXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpXG4gICAgICAgICAgICB8fCAhIWVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IHRpdGxlXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzSW5uZXJDb250ZW50SGlkZGVuSHlwZXJMaW5rKGVsZW1lbnQsIGh5cGVybGlua19mbGFnKSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgY2hpbGRFbGVtZW50ID0gZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSBmYWxzZTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGlsZEVsZW1lbnQgaXMgbm90IG51bGwgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGVhY2ggb2YgdGhlIGVsZW1lbnRzXG4gICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgbm90IGFsbCBoaWRkZW4uXG4gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBub2Rld2FsdGVyIG9mIHRoZSBlbGVtZW50IG5vZGUsIHNvIHRoYXQgd2UgY2FuIGxvb3Agb3ZlciBpdCBhbmQgdmVyaWZ5XG4gICAgICAgICAgICAvLyB0aGF0IHRoZSBlbGVtZW50cyB1bmRlciB0aGUgZWxlbWVudCBhcmUgbm90IGNvbXBsZXRseSBoaWRkZW4uXG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbm9kZXMgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgbm9kZXMgb3Igd2UgaGF2ZSBkZXRlcm1pbmUgdGhhdCB0aGVyZSBpcyBjb250ZW50IHVuZGVyXG4gICAgICAgICAgICAvLyB0aGlzIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG53Lm5vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBhbiBpbWcgZWxlbWVudCBpcyBwcmVzZW50IHdpdGggYWx0IHRoZW4gd2UgY2FuIG1hcmsgdGhpcyBhcyBwYXNzXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGtlZXAgY2hlY2tpbmcgYWxsIHRoZSBvdGhlciBlbGVtZW50cy4gTWFrZSBzdXJlIHRoYXQgdGhpcyBpbWFnZSBlbGVtZW50IGlzIG5vdCBoaWRkZW4uXG4gICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiXG4gICAgICAgICAgICAgICAgICAgICYmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIENvbW1vblV0aWwuc3ZnSGFzTmFtZShub2RlIGFzIGFueSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBjaGVjayBpZiB0aGlzIG5vZGUgaXMgb2YgdHlwZSBlbGVtZW50LCB2aXNpYmxlXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBpbm5lclRleHQgb2YgdGhlIGVsZW1lbnQgaXMgZW1wdHkgb3Igbm90XG4gICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIGh5cGVybGlua19mbGFnID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShub2RlIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudCAmJiBjU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjU3R5bGUuYmFja2dyb3VuZEltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY1N0eWxlLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZikgfHwgY1N0eWxlLmNvbnRlbnQpICYmIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBpcyB0ZXh0IG5vZGUgYWZ0ZXIgYW4gZWxlbWVudCB1bmRlciB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugd2UgZGV0ZWN0IG5vZGV0eXBlIGFzIHRleHQgbm9kZSBhbmQgdGhlIHBhdGVudCBvZiB0aGUgdGV4dCBub2RlIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgZWxlbWVudCB3ZSBhcmUgY2hlY2tpbmcgaGFzIElubmVyIGNvbnRlbnQgZm9yIHRoZW4gZ2V0IHRoZSBpbm5lciBjb250ZW50IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgJiYgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9ICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBubyBjaGlsZCBlbGVtZW50cyB0aGVuIHdlIGNhbiBzaW1wbHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIG9ubHkgaW5uZXJ0ZXh0XG4gICAgICAgIC8vIHRoZSBpbWcgd2l0aCBhbHQgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFib3ZlIGlmLCBhcyBpbWcgaXMgY29uc2lkZXJzIGFzIGFuIGVsZW1lbnQuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dEVtcHR5KGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnRPckFsdChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYWx0XCIpO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlICghaGFzQ29udGVudCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAmJiAoQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCBcImJ1dHRvblwiLCB0cnVlKSB8fCBBcmlhVXRpbC5oYXNSb2xlKG53Lm5vZGUsIFwidGV4dGJveFwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgKEFyaWFVdGlsLmhhc0FyaWFMYWJlbChudy5ub2RlKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwidGl0bGVcIikgfHwgQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4obncuZWxlbSgpLCB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbTogc3RyaW5nLCBhcnI6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgICAgICBhcnIuaW5kZXhPZihpdGVtKSA9PT0gLTEgJiYgaXRlbSAhPT0gbnVsbCA/IGFyci5wdXNoKGl0ZW0pIDogZmFsc2U7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KGl0ZW1MaXN0OiBzdHJpbmdbXSwgYXJyOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGl0ZW1MaXN0ICE9PSBudWxsICYmIGkgPCBpdGVtTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJyID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbUxpc3RbaV0sIGFycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYXJyYXkgaXRlbXMgZnJvbSBhIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIGl0ZW1MaXN0IGl0ZW1zIHRvIGJlIHJlbW92ZWQgZnJvbSBhcnJcbiAgICAgKiBAcGFyYW0gYXJyIHRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVkdWNlQXJyYXlJdGVtTGlzdChpdGVtTGlzdDogc3RyaW5nW10sIGFycjogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmIChhcnIgJiYgYXJyLmxlbmd0aCA+IDAgJiYgaXRlbUxpc3QgJiYgaXRlbUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGFyci5maWx0ZXIoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFpdGVtTGlzdC5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFNjb3BlRm9yVGgoZWxlbWVudCkge1xuICAgICAgICAvKiogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3RhYnVsYXItZGF0YS5odG1sI2hlYWRlci1hbmQtZGF0YS1jZWxsLXNlbWFudGljc1xuICAgICAgICAgKiBBIGhlYWRlciBjZWxsIGFuY2hvcmVkIGF0IHRoZSBzbG90IHdpdGggY29vcmRpbmF0ZSAoeCwgeSkgd2l0aCB3aWR0aCB3aWR0aCBhbmQgaGVpZ2h0IGhlaWdodCBpcyBcbiAgICAgICAgICogc2FpZCB0byBiZSBhIGNvbHVtbiBoZWFkZXIgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgY29sdW1uIHN0YXRlLCBvclxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSBhdXRvIHN0YXRlLCBhbmQgdGhlcmUgYXJlIG5vIGRhdGEgY2VsbHMgaW4gYW55IG9mIFxuICAgICAgICAgKiAgIHRoZSBjZWxscyBjb3ZlcmluZyBzbG90cyB3aXRoIHktY29vcmRpbmF0ZXMgeSAuLiB5K2hlaWdodC0xLlxuICAgICAgICAgKiBBIGhlYWRlciBjZWxsIGFuY2hvcmVkIGF0IHRoZSBzbG90IHdpdGggY29vcmRpbmF0ZSAoeCwgeSkgd2l0aCB3aWR0aCB3aWR0aCBhbmQgaGVpZ2h0IGhlaWdodCBpc1xuICAgICAgICAgKiBzYWlkIHRvIGJlIGEgcm93IGhlYWRlciBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVlOlxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSByb3cgc3RhdGUsIG9yXG4gICAgICAgICAqICogVGhlIGNlbGwncyBzY29wZSBhdHRyaWJ1dGUgaXMgaW4gdGhlIGF1dG8gc3RhdGUsIHRoZSBjZWxsIGlzIG5vdCBhIGNvbHVtbiBoZWFkZXIsIGFuZCB0aGVyZSBhcmVcbiAgICAgICAgICogICBubyBkYXRhIGNlbGxzIGluIGFueSBvZiB0aGUgY2VsbHMgY292ZXJpbmcgc2xvdHMgd2l0aCB4LWNvb3JkaW5hdGVzIHggLi4geCt3aWR0aC0xLlxuICAgICAgICAgKi9cbiAgICAgICAgLy8gTm90ZTogYXV0byBpcyBkZWZhdWx0IHNjb3BlXG5cbiAgICAgICAgLy8gRWFzaWVzdCBhbnN3ZXIgaXMgaWYgc2NvcGUgaXMgc3BlY2lmaWVkXG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpKSB7XG4gICAgICAgICAgICBsZXQgc2NvcGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUgPT09IFwicm93XCIgfHwgc2NvcGUgPT09ICdyb3dncm91cCcpIHJldHVybiBcInJvd1wiO1xuICAgICAgICAgICAgaWYgKHNjb3BlID09PSBcImNvbFwiIHx8IHNjb3BlID09PSAnY29sZ3JvdXAnKSByZXR1cm4gXCJjb2x1bW5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNjb3BlIGlzIGF1dG8sIGRlZmF1bHQgKHdpdGhvdXQgYSBzY29wZSkgb3IgaW52YWxpZCB2YWx1ZS5cbiAgICAgICAgLy8gaWYgYWxsIHRoZSBzaWJsaW5nIGVsZW1lbnRzIGFyZSB0aCwgdGhlbiByZXR1cm4gXCJjb2x1bW5oZWFkZXJcIiBcbiAgICAgICAgdmFyIHNpYmxpbmdzID0gWy4uLmVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKG5vZGUgPT4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRoXCIpO1xuICAgICAgICBpZiAoc2libGluZ3MgPT09IG51bGwgfHwgc2libGluZ3MubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFwiY29sdW1uXCI7XG4gICAgICAgIGVsc2UgcmV0dXJuIFwicm93XCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb250cm9sT2ZMYWJlbChub2RlOiBOb2RlKSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgZWFzeSBjYXNlIG9mIGxhYmVsIC0+IGZvclxuICAgICAgICBjb25zdCBsYWJlbEFuY2VzdG9yID0gQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcihub2RlLCBcImxhYmVsXCIpO1xuICAgICAgICBpZiAobGFiZWxBbmNlc3RvciAmJiBsYWJlbEFuY2VzdG9yLmhhc0F0dHJpYnV0ZShcImZvclwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50VXRpbC5nZXRCeUlkKG5vZGUsIGxhYmVsQW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiZm9yXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBpZHMgb2YgcGFyZW50IG5vZGVzXG4gICAgICAgIGNvbnN0IGlkRGljdCA9IHt9O1xuICAgICAgICBsZXQgcGFyZW50V2FsayA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChwYXJlbnRXYWxrKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50V2Fsay5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGFyZW50V2FsayBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZERpY3RbYW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiaWRcIildID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnRXYWxrID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50V2Fsayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgbm8gYW5jZXN0b3IgSURzIGZvdW5kXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhpZERpY3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSBhcmlhLWxhYmVsbGVkYnkgYXR0cmlidXRlIGlmIG5vZGUgaXMgYW4gZWxlbWVudFxuICAgICAgICBjb25zdCBub2RlQXJpYUxhYmVsbGVkQnkgPSBub2RlLm5vZGVUeXBlID09PSAxID8gKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpIDogbnVsbDtcblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY29udHJvbHMgdGhhdCB1c2UgYXJpYS1sYWJlbGxlZGJ5IGFuZCBzZWUgaWYgYW55IG9mIHRoZW0gcmVmZXJlbmNlIG9uZSBvZiBteSBhbmNlc3RvciBpZHNcbiAgICAgICAgY29uc3QgaW5wdXRzVXNpbmdMYWJlbGxlZEJ5ID0gQ2FjaGVVdGlsLmdldFNldENhY2hlKFxuICAgICAgICAgICAgbm9kZS5vd25lckRvY3VtZW50LCBcbiAgICAgICAgICAgIFwiQ29tbW9uVXRpbDo6Z2V0Q29udHJvbE9mTGFiZWxcIiwgXG4gICAgICAgICAgICAoKSA9PiAgbm9kZS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2FyaWEtbGFiZWxsZWRieV1cIilcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBpbnB1dHNVc2luZ0xhYmVsbGVkQnkubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRVc2luZ0xhYmVsbGVkQnkgPSBpbnB1dHNVc2luZ0xhYmVsbGVkQnlbaWR4XTtcbiAgICAgICAgICAgIGNvbnN0IGFyaWFMYWJlbGxlZEJ5ID0gaW5wdXRVc2luZ0xhYmVsbGVkQnkuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICAgICAgICAgICAgY29uc3Qgc3AgPSBhcmlhTGFiZWxsZWRCeS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHNwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlkIGluIGlkRGljdCAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYobm9kZSwgbm9kZUFyaWFMYWJlbGxlZEJ5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRVc2luZ0xhYmVsbGVkQnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCB0aGUgY2FzZXMgd2hlcmUgd2UncmUgd2l0aGluIGFuIGFyaWEgbGFiZWxsZWRieVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiBkaXNhYmxlZCBvciBub3QuIEZvbGxvd2luZyBpcyBob3cgdGhlIGNoZWNrIGlzIHBlcmZvcm1lZDpcbiAgICAgKiAgICAxLiBDaGVjayBpZiB0aGUgY3VycmVudCBub2RlIGlzIGRpc2FibGVkIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIGF0dHJpYnV0ZSAtLT4gZGlzYWJsZWRcbiAgICAgKiAgICAgICAgIEFsc28gbmVlZHMgdG8gYmUgXCJidXR0b25cIiwgXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCIsIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIixcbiAgICAgKiAgICAgICAgIFwibWVudWl0ZW1cIiwgXCJmaWVsZHNldFwiIG5vZGVzIChpbiBhcnJheSBlbGVtZW50c0FsbG93ZWREaXNhYmxlZClcbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGFyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJcbiAgICAgKiAgICAyLiBDaGVjayBpZiBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgZGlzYWJsZWQgd2l0aCB0aGUgc2FtZVxuICAgICAqICAgICAgIG9wdGlvbnMgbGlzdGVkIGluIDEuXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSBkaXNhYmxlZCB0aGVuIHRoaXNcbiAgICAgKiAgICAgICAgICBmdW5jdGlvbiB3aWxsIHJldHVybiB0cnVlIChub2RlIGlzIGRpc2FibGVkKS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIGRpc2FibGVkIG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIHRoZSBub2RlIGlzIGRpc2FibGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlRGlzYWJsZWQobm9kZSkge1xuXG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0RJU0FCTEVEIHRvIGZhbHNlIGZvciBhbGwgdGhlIG5vZGVzLCBiZWZvcmUgdGhlIGNoZWNrIGFuZCB0aGlzIHdpbGwgYmUgY2hhbmdlZCB0b1xuICAgICAgICAvLyB0cnVlIHdoZW4gd2UgZGV0ZWN0IHRoYXQgdGhlIG5vZGUgaXMgZGlzYWJsZWQuIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuIE9ubHkgc2V0IGl0IHRvIGZhbHNlIGlmIHRoZSBzZXR0aW5nIGlzIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICAgIC8vIGFzIGlmIGl0IGlzIGRlZmluZWQgd2UgZG8gbm90IHduYXQgdG8gcmVzZXQgaXQuIEFzIGlmIGl0IGlzIHRydWUgdGhlbiB3ZSBzaG91bGQgbWFrZSB1c2Ugb2YgaXRcbiAgICAgICAgLy8gdG8gc3BlZWQgdXAgdGhlIGNoZWNrLlxuICAgICAgICBsZXQgUFRfTk9ERV9ESVNBQkxFRCA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlLCBcIlBUX05PREVfRElTQUJMRURcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBQVF9OT0RFX0RJU0FCTEVEICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gUFRfTk9ERV9ESVNBQkxFRDtcbiAgICAgICAgUFRfTk9ERV9ESVNBQkxFRCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENoZWNrIHRoZSBub2RlVHlwZSBvZiB0aGlzIG5vZGUsIGlmIHRoaXMgbm9kZSBpcyBhIHRleHQgbm9kZSB0aGVuXG4gICAgICAgIC8vIHdlIGdldCB0aGUgcGFyZW50bm9kZSBhbmQgc2V0IHRoYXQgYXMgdGhlIG5vZGUgYXMgYSB0ZXh0IG5vZGVzLFxuICAgICAgICAvLyBkaXNhYmxlZCBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xhcmF0aW9uXG4gICAgICAgIGxldCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGRpc2FibGVkIGVsZW1lbnQgcHJvcGVydHksIGRpc2FibGVkIGFuZCBhcmlhLWRpc2FibGVkIGF0dHJpYnV0ZSBhbmQgY2hlY2sgdGhhdCBpdCBpcyB0cnVlXG4gICAgICAgIGxldCBkaXNhYmxlZEF0dHJpYnV0ZSA9IG5vZGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIGxldCBkaXNhYmxlZFByb3BlcnR5Q3VzdG9tID0gUFRfTk9ERV9ESVNBQkxFRDtcbiAgICAgICAgbGV0IGFyaWFEaXNhYmxlZEF0dHJpYnV0ZSA9IG5vZGUuaGFzQXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJykgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpID09PSAndHJ1ZSc7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBub2RlIGhhcyBkaXNhYmxlZCBhdHRyaWJ1dGUgYW5kIHRoZSBub2RlIGFsbG93cyBkaXNhYmxlZCBhdHRyaWJ1dGUsIHRoZW4gcmV0dXJuIHRydWUuXG4gICAgICAgIC8vIERpc2FibGVkIGF0dHJpYnV0ZSBpcyBvbmx5IGFsbG93ZWQgb24gXCJidXR0b25cIiwgXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCIsIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIiwgXCJtZW51aXRlbVwiLCBcImZpZWxkc2V0XCJcbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYXJpYS1kaXNhYmxlZCBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiBhbHNvIHJldHVybiB0cnVlXG4gICAgICAgIGlmIChkaXNhYmxlZFByb3BlcnR5Q3VzdG9tIHx8IChkaXNhYmxlZEF0dHJpYnV0ZSAmJiBBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkRGlzYWJsZWQuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkgfHwgYXJpYURpc2FibGVkQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBQVF9OT0RFX0RJU0FCTEVEID0gdHJ1ZTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfRElTQUJMRURcIiwgUFRfTk9ERV9ESVNBQkxFRCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgcGFyZW50Tm9kZSBmb3IgdGhpcyBub2RlLCBiZWN1YXNlIHdlIGhhdmUgdG8gY2hlY2sgYWxsIHBhcmVudHMgdG8gbWFrZSBzdXJlIHRoZXkgZG8gbm90IGhhdmVcbiAgICAgICAgLy8gZGlzYWJsZWQgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcGFyZW50IG5vZGUgZXhpc3RzIGFuZCB0aGUgbm9kZXR5cGUgaXMgZWxlbWVudCAoMSksIHRoZW4gcnVuIHJlY3Vyc2l2ZSBjYWxsIHRvIHBlcmZvcm0gdGhlIGNoZWNrXG4gICAgICAgIC8vIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSB2ZXJ5IHBhcmVudCBub2RlLiBVc2UgcmVjdXJzaXZlIGNhbGwgaGVyZSBpbnN0ZWFkIG9mIGEgd2hpbGUgbG9vcCBzbyB0aGF0IHdlIGRvIG5vdFxuICAgICAgICAvLyBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgbG9naWMgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIGlzIGRpc2FibGVkIG9yIG5vdCBmb3IgYWxsIHRoZSBwYXJlbnRzIHN0YXJ0aW5nIHdpdGhcbiAgICAgICAgLy8gY2hpbGQgbm9kZS5cbiAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgIT0gbnVsbCAmJiBwYXJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5LCBhbmQgc2F2ZSB0aGUgcmVzdWx0cyBpbiBhbiB2YXJpYWJsZVxuICAgICAgICAgICAgbGV0IG5vZGVEaXNhYmxlZCA9IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIGJlIGRpc2FibGVkIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ESVNBQkxFRCB0byB0cnVlLlxuICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgbmV4dCB0aW1lLCB0byBxdWlja2x5IGRldGVybWluZSBpZiBub2RlIGlzIGRpc2FibGVkIG9yIG5vdC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZXh0cmEgcGVyY2F1dGlvbiwgdGhlIGlzTm9kZURpc2FibGVkIGZ1bmN0aW9uIGFscmVhZHkgc2V0cyB0aGlzLlxuICAgICAgICAgICAgaWYgKG5vZGVEaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIFBUX05PREVfRElTQUJMRUQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0RJU0FCTEVEXCIsIFBUX05PREVfRElTQUJMRUQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVEaXNhYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBmYWxzZSAobm9kZSBpcyBub3QgZGlzYWJsZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmUgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIGJlIGNoZWNrZWRcbiAgICAgKiBpbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gQSBub2RlIHNvIHRoYXQgdGhlIGRvY3VtZW50IGNhbiBiZSBhY2Nlc3NlZCB0byBjaGVjayBmb3IgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uIENhbiBiZSBkb2N1bWVudCBlbGVtZW50IG9yIGEgc2ltcGxlIG5vZGUgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBiZSBjaGVja2VkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2hvdWxkQ2hlY2tIaWRkZW5Db250ZW50KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIGlmIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQgZnJvbSBjaGVja2luZyBvciBub3QsIGJhc2VkXG4gICAgICogb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmdzIGFuZCBpZiB0aGUgbm9kZSBpcyB2aXNpYmxlIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gTm9kZSB0byBjaGVjayBpZiBpdCBpcyB2aXNpYmxlIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpIHtcbiAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2VcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlIHRvIGlkZW50aWZ5IHRoYXQgdGhlIG5vZGUgc2hvdWxkIG5vdCBiZSBzY2FubmVkL2FkZGVkIHRvIGFueSBoYXNoL2FycmF5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgaWYgKCFDb21tb25VdGlsLnNob3VsZENoZWNrSGlkZGVuQ29udGVudChub2RlKSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzZm9jdXNhYmxlQnlEZWZhdWx0KG5vZGUpIHtcbiAgICAgICAgdmFyIGZvY3VzYWJsZUVsZW1lbnRzID0gWydpbnB1dCcsICdzZWxlY3QnLCAnYnV0dG9uJywgJ3RleHRhcmVhJywgJ29wdGlvbicsICdhcmVhJ107XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYVwiICYmIENvbW1vblV0aWwuaGFzQXR0cmlidXRlKG5vZGUsICdocmVmJykpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFyZWFcIiAmJiBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZShub2RlLCAnaHJlZicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzLmluZGV4T2Yobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBhIG5vbi10YWJhYmxlIG5vZGUgaGFzIHZhbGlkIHRhYmFibGUgY29udGVudC5cbiAgICAgKiBJZiBpdCBpcyB0YWJhYmxlICh0aGUgdGFiaW5kZXggaXMgbm90IHNwZWljaWZpZWQgb3IgaXMgbm90IC0xKSwgcmV0dXJucyBmYWxzZTtcbiAgICAgKiBJZiBpdCBpcyBub24tdGFiYWJsZSwgYnV0IGEgY2hpbGQgaXMgdGFiYWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBlbGVtZW50IGNvbnRlbnQsIHJldHVybnMgZmFsc2U7XG4gICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHRydWUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBub25UYWJhYmxlQ2hpbGRDaGVjayhlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fFxuICAgICAgICAgICAgKHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpICE9IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBudy5lbGVtKCk7XG4gICAgICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwpIHsgLy8gVGV4dCBub2RlLiB1c3VhbGx5IGlzIGEgY2FydHJpZGdlIHJldHVybi5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGlsZC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAmJlxuICAgICAgICAgICAgICAgIChwYXJzZUludChjaGlsZC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgIT0gLTEpICYmXG4gICAgICAgICAgICAgICAgIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KGNoaWxkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhc0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgIHZhciBoYXNBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBoYXNBdHRyaWJ1dGUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmF0dHJpYnV0ZXMgJiYgZWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSkge1xuICAgICAgICAgICAgdmFyIGF0dHIgPSBlbGVtZW50LmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgaGFzQXR0cmlidXRlID0gYXR0ciAmJiBhdHRyLnNwZWNpZmllZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzQXR0cmlidXRlO1xuICAgIH1cblxuICAgIC8vIHRydW5jYXRlIHRoZSBnaXZlbiB0ZXh0IHRvIGEgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnNcbiAgICAvLyByZXR1cm4gdHJ1bmNhdGVkIHRleHQgdG8gMTUwIGNoYXJzLCBzYW1lIHdpdGggdGhlIG1lZGlhX2FsdF9icmllZiBydWxlXG4gICAgcHVibGljIHN0YXRpYyB0cnVuY2F0ZVRleHQodGV4dDogc3RyaW5nLCBsZW4gPSAxNTApIHtcbiAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDtcbiAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPiBsZW4pXG4gICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgbGVuLTEpICtcIi4uLlwiO1xuICAgICAgICByZXR1cm4gdGV4dDtcblxuICAgIH1cblxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4vQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi9Db21tb25VdGlsXCI7XG5pbXBvcnQge1J1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY2xhc3MgVGFibGVVdGlsIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEYXRhVGFibGUodGFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiAhKEFyaWFVdGlsLmhhc1JvbGUodGFibGVOb2RlLCBcIm5vbmVcIikgfHwgQXJpYVV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwicHJlc2VudGF0aW9uXCIpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgY29tcGxleCBkYXRhIHRhYmxlIGlzIGEgZGF0YSB0YWJsZSB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczpcbiAgICAgKlxuICAgICAqIGEgdGhlYWQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzXG4gICAgICogYSB0YWJsZSB3aXRoIG1vcmUgdGhhbiBvbmUgdGhlYWQgZWxlbWVudFxuICAgICAqIGEgdGFibGUgd2l0aCB0d28gb3IgbW9yZSB0ciBlbGVtZW50cyB0aGF0IGNvbnRhaW4gb25seSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGggb3IgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAqIGEgdHIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB0ZCBlbGVtZW50IGFuZCB0d28gb3IgbW9yZSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGFibGUgd2l0aCBoZWFkZXJzIG5vdCBsb2NhdGVkIGluIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uXG4gICAgICogYSB0ZCBlbGVtZW50IHdpdGggYSBoZWFkZXJzIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGNvbnRhaW5zIG1vcmUgdGhhbiB0d28gSURSRUZzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NvbXBsZXhEYXRhVGFibGUodGFibGUpIHtcblxuICAgICAgICBpZiAoXCJBcmlhVXRpbF9pc0NvbXBsZXhEYXRhVGFibGVcIiBpbiB0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICEhdGFibGUuQXJpYVV0aWxfaXNDb21wbGV4RGF0YVRhYmxlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzQ29tcGxleFRhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRhYmxlICYmIFRhYmxlVXRpbC5pc0RhdGFUYWJsZSh0YWJsZSkpIHtcblxuICAgICAgICAgICAgbGV0IHRoTm9kZXMgPSBudWxsLFxuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHRyTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyXCIpO1xuICAgICAgICAgICAgbGV0IHRyTm9kZUNvdW50ID0gdHJOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdGROb2RlQ291bnQgPSAwLFxuICAgICAgICAgICAgICAgIHRoTm9kZUNvdW50ID0gMCxcbiAgICAgICAgICAgICAgICB0ck5vZGVzSGF2aW5nT25seVRoTm9kZXMgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGkgPCB0ck5vZGVDb3VudDsgKytpKSB7XG5cbiAgICAgICAgICAgICAgICB0aE5vZGVzID0gdHJOb2Rlc1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoXCIpO1xuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSB0ck5vZGVzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgICAgICAgICAgdGhOb2RlQ291bnQgPSB0aE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0ZE5vZGVDb3VudCA9IHRkTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRkTm9kZUNvdW50ICE9PSAwKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0ciBlbGVtZW50IHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRkIGVsZW1lbnQgYW5kIHR3byBvciBtb3JlIHRoIGVsZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9IHRoTm9kZUNvdW50ID4gMTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRoIGVsZW1lbnQgd2l0aCBhIHJvd3NwYW4gb3IgY29sc3BhbiBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBqIDwgdGhOb2RlQ291bnQ7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHRoTm9kZXNbal0sIFwidGFibGVcIikgPT09IHRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRkIGVsZW1lbnQgd2l0aCBhIGhlYWRlcnMgYXR0cmlidXRlIHZhbHVlIHRoYXQgY29udGFpbnMgbW9yZSB0aGFuIHR3byBJRFJFRnNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBrIDwgdGROb2RlQ291bnQ7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZE5vZGVzW2tdLmhhc0F0dHJpYnV0ZShcImhlYWRlcnNcIikgJiYgQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHRkTm9kZXNba10uZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKSkuc3BsaXQoXCIgXCIpLmxlbmd0aCA+IDIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IodGROb2Rlc1trXSwgXCJ0YWJsZVwiKSA9PT0gdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzIHRoYXQgY29udGFpbiBvbmx5IHRoIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aE5vZGVDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzID09PSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHRoZWFkTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoZWFkXCIpO1xuICAgICAgICAgICAgICAgIGxldCB0aGVhZE5vZGVzTGVuZ3RoID0gdGhlYWROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhlYWROb2Rlc0xlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZSBoYXMgbW9yZSB0aGFuIG9uZSB0aGVhZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhlYWROb2Rlc0xlbmd0aCA+IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0aGVhZCBlbGVtZW50IHRoYXQgY29udGFpbnMgdHdvIG9yIG1vcmUgdHIgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aGVhZE5vZGVzWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIikubGVuZ3RoID4gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNDb21wbGV4VGFibGUgJiYgdHJOb2RlQ291bnQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBhIHRhYmxlIHdpdGggaGVhZGVycyBub3QgbG9jYXRlZCBpbiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtblxuICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhOb2RlQ291bnQgPiAwICYmICFUYWJsZVV0aWwudGFibGVIZWFkZXJFeGlzdHModGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRhYmxlLkFyaWFVdGlsX2lzQ29tcGxleERhdGFUYWJsZSA9IGlzQ29tcGxleFRhYmxlO1xuXG4gICAgICAgIHJldHVybiBpc0NvbXBsZXhUYWJsZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIHRhYmxlIGNlbGwgaXMgaGlkZGVuIG9yIGNvbnRhaW4gbm8gZGF0YTogPHRkPjwvdGQ+XG4gICAgcHVibGljIHN0YXRpYyBpc1RhYmxlQ2VsbEVtcHR5KGNlbGwpIHtcbiAgICAgICAgaWYgKCFjZWxsIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUoY2VsbCkgfHwgY2VsbC5pbm5lckhUTUwucmVwbGFjZSgvJm5ic3A7L2csJyAnKS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSByb3cgaXMgaGlkZGVuIG9yIGNvbnRhaW4gbm8gZGF0YTogPHRyIC8+IG9yIDx0cj48dGQ+PC90ZD48dGQ+PC90ZD48L3RyPiBcbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVSb3dFbXB0eShyb3cpIHtcbiAgICAgICAgaWYgKCFyb3cgfHwgIXJvdy5jZWxscyB8fCByb3cuY2VsbHMubGVuZ3RoID09PSAwIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUocm93KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7IC8vZW1wdHlcbiAgICAgICAgZm9yIChsZXQgYz0wOyBwYXNzZWQgJiYgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbY107XG4gICAgICAgICAgICBwYXNzZWQgPSBUYWJsZVV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKTsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBwYXNzZWQ7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSdzIGhlYWRlciBpcyBpbiB0aGUgZmlyc3Qgcm93IG9yIGNvbHVtblxuICAgIHB1YmxpYyBzdGF0aWMgdGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpIHtcblxuICAgICAgICBsZXQgcm93cyA9IHJ1bGVDb250ZXh0LnJvd3M7XG4gICAgICAgIGlmICghcm93cyB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIG5vdGUgdGhhdCB0YWJsZS5yb3dzIHJldHVybiBhbGwgYWxsIHRoZSByb3dzIGluIHRoZSB0YWJsZSwgXG4gICAgICAgIC8vIGluY2x1ZGluZyB0aGUgcm93cyBjb250YWluZWQgd2l0aGluIDx0aGVhZD4sIDx0Zm9vdD4sIGFuZCA8dGJvZHk+IGVsZW1lbnRzLiBcbiAgICAgICAgXG4gICAgICAgIC8vY2FzZSAxOiBoZWFkZXJzIGFyZSBpbiB0aGUgdmVyeSBmaXJzdCByb3cgd2l0aCBkYXRhIGluIHRib2R5IG9yIHRoZWFkLCBidXQgbm90IGluIHRmb290ICAgXG4gICAgICAgIC8vZ2V0IHRoZSBmaXJzdCByb3cgd2l0aCBkYXRhLCBpZ25vcmluZyB0aGUgcm93cyB3aXRoIG5vIGRhdGFcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmaXJzdFJvdyA9IHJvd3NbMF07XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBmaXJzdFJvdyA9IHJvd3Nbcl07XG4gICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHJvd3MgZnJvbSB0Zm9vdFxuICAgICAgICAgICAgaWYgKGZpcnN0Um93LnBhcmVudE5vZGUgJiYgZmlyc3RSb3cucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcGFzc2VkID0gVGFibGVVdGlsLmlzVGFibGVSb3dFbXB0eShmaXJzdFJvdyk7ICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvL3RhYmxlIGNvbnRhaW4gbm8gZGF0YTogIDx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiBcbiAgICAgICAgaWYgKHBhc3NlZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGxzIHdpdGggZGF0YSBpbiB0aGUgZmlyc3QgZGF0YSByb3cgYXJlIGFsbCBUSCdzXG4gICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCBmaXJzdFJvdy5jZWxscy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgbGV0IGNlbGwgPSBmaXJzdFJvdy5jZWxsc1tyXTtcbiAgICAgICAgICAgIHBhc3NlZCA9IFRhYmxlVXRpbC5pc1RhYmxlQ2VsbEVtcHR5KGNlbGwpIHx8IGNlbGwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RoJzsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBDYXNlIDI6IGhlYWRlcnMgYXJlIGluIHRoZSBmaXJzdCBjb2x1bW4gd2l0aCBkYXRhXG4gICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBmaXJzdCBjb2x1bW4gaGFzIGFsbCBUSCdzIG9yIGEgVEQgd2l0aG91dCBkYXRhIGluIHRoZSBmaXJzdCBjb2x1bW4uXG4gICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHJvd3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgcm93cyBmcm9tIHRmb290XG4gICAgICAgICAgICBpZiAocm93c1tpXS5wYXJlbnROb2RlICYmIHJvd3NbaV0ucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gSWYgbm8gY2VsbHMgaW4gdGhpcyByb3csIG9yIG5vIGRhdGEgYXQgYWxsLCB0aGF0J3Mgb2theSB0b28uXG4gICAgICAgICAgICBwYXNzZWQgPSAhcm93c1tpXS5jZWxscyB8fFxuICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgcm93c1tpXS5jZWxsc1swXS5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHNbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRkXCI7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAvL2Nhc2UgMzogYWxsIHRkIGRhdGEgY2VsbHMgaGF2ZSBoZWFkZXJzIGF0dHJpYnV0ZXMgdGhhdCBwb2ludCB0byB0aGUgaWQgb2YgYSB0aCBlbGVtZW50IGluIHRoZSBzYW1lIHRhYmxlLiBcbiAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGFibGVzLmh0bWwjYXR0cmlidXRlcy1jb21tb24tdG8tdGQtYW5kLXRoLWVsZW1lbnRzXG4gICAgICAgIHBhc3NlZCA9IHRydWU7IFxuICAgICAgICBsZXQgdGhJZHMgPSBbXTtcbiAgICAgICAgbGV0IHRkSGVhZGVycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByPTA7IHBhc3NlZCAmJiByIDwgcm93cy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgbGV0IHJvdyA9IHJvd3Nbcl07IFxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGxzIHdpdGggZGF0YSBpbiB0aGUgbGFzdCBkYXRhIHJvdyBhcmUgYWxsIFRIJ3NcbiAgICAgICAgICAgIGZvciAobGV0IGM9MDsgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93LmNlbGxzW2NdO1xuICAgICAgICAgICAgICAgIGlmIChUYWJsZVV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKSkgY29udGludWU7IFxuICAgICAgICAgICAgICAgIGlmIChjZWxsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0ZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsLmdldEF0dHJpYnV0ZSgnaGVhZGVycycpIHx8IGNlbGwuZ2V0QXR0cmlidXRlKCdoZWFkZXJzJykudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoY2VsbC5nZXRBdHRyaWJ1dGUoJ2hlYWRlcnMnKS50cmltKCkuc3BsaXQoXCIgXCIpLCB0ZEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGgnICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oY2VsbC5nZXRBdHRyaWJ1dGUoJ2lkJykudHJpbSgpLCB0aElkcyk7ICAgIFxuICAgICAgICAgICAgfSAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocGFzc2VkKSB7IC8vIGFsbCB0ZCBlbGVtZW50cyBoYXZlIGhlYWRlcnMsIHRvIGV4YW0gaWYgdGhlIGhlYWRlcnMgcG9pbnQgdG8gYSB0aCBpZFxuICAgICAgICAgICAgaWYgKHRoSWRzLmxlbmd0aCA+IDAgJiYgdGRIZWFkZXJzLmV2ZXJ5KGhlYWRlciA9PiB0aElkcy5pbmNsdWRlcyhoZWFkZXIpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTGF5b3V0VGFibGUodGFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5oYXNSb2xlKHRhYmxlTm9kZSwgXCJwcmVzZW50YXRpb25cIikgfHwgQXJpYVV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwibm9uZVwiKTtcbiAgICB9XG5cbi8qIFxuICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICogcmV0dXJuOiBhIGxpc3Qgb2YgQXJpYSBhbmQgSHRtbCBhdHRyaWJ1dGUgcGFpcnMgdGhhdCBhcmUgY29uZmxpY3RcbiovXG5wdWJsaWMgc3RhdGljIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgaWYgKCFjb250ZXh0SGllcmFyY2hpZXMpIHJldHVybiBudWxsO1xuICAgIFxuICAgIHJldHVybiBjb250ZXh0SGllcmFyY2hpZXNbXCJhcmlhXCJdLmZpbHRlcihoaWVyID0+IFtcInRhYmxlXCIsIFwiZ3JpZFwiLCBcInRyZWVncmlkXCJdLmluY2x1ZGVzKGhpZXIucm9sZSkpO1xufVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4vQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ2xpcFBhdGhVdGlsIH0gZnJvbSBcIi4vQ2xpcFBhdGhVdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXNVdGlsIHtcbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnQgdGFncyB3aGljaCBjYW4gbm90IGJlIGhpZGRlbiwgd2hlbiBoaWRkZW4gaXNcbiAgICAvLyBhZGRlZCB0byB0aGVzZXMgZWxlbWVudHMgaXQgZG9lcyBub3QgZG8gYW55dGhpbmcgYXQgYWxsLlxuICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAvLyAgICAgICAgICAgbWFrZSBhbiBjZXJ0aWFuIHBhcnRzIG9mIGFuIG1hcCBpbnRlcmFjdGl2ZS5cbiAgICAvLyAgcGFyYW0gLS0+IGVsZW1lbnQgY2FuIG9ubHkgYmUgcGFydCBvZiBvYmplY3QgZWxtZW50IGFuZCBpdCBjYW5ub3QgYmUgaGlkZGVuIGRpcmVjdGx5LCBpdFxuICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgIC8vICBhdWRpbyAtLT4gSWYgdGhpcyBlbGVtZW50IGlzIGhpZGRlbiBpdCB3aWxsIHN0aWxsIHBsYXkgdGhlIG11c2ljLCBzbyB3ZSBzaG91bGQgc3RpbGwgdHJpZ2dlclxuICAgIC8vICAgICAgICAgICAgdmlvbGF0aW9ucyBmb3IgdGhpcyBlbGVtZW50LlxuICAgIC8vIE5vdGU6IEFsbCBlbGVtZW50IHRhZ3MgdGhhdCBhcmUgYWRkZWQgaGVyZSBzaG91bGQgYmUgYWRkZWQgYXMgbG93ZXJjYXNlLCBhcyB3ZSBhcmUgdXNpbmcgaW5kZXhPZiB0byBkbyB0aGUgY2hlY2suXG4gICAgcHVibGljIHN0YXRpYyB1bmhpZGVhYmxlRWxlbWVudHMgPSBbJ2FyZWEnLCAncGFyYW0nLCAnYXVkaW8nXTtcblxuICAgIC8vIFRoaXMgbGlzdCBjb250YWlucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGFncyB3aGljaCBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgaGF2ZSBydWxlcyB0cmlnZ2VyaW5nXG4gICAgLy8gb24gdGhlc2VzIGVsZW1lbnRzIHdlIG5lZWQgdG8gbWFrZSB0aGVuIHZpc2libGUgYnkgZGVmYXVsdCBzbyB0aGF0IHRoZSBydWxlcyBjYW4gdHJpZ2dlciByZWdhcmRsZXNzIG9mIHRoZVxuICAgIC8vIENoZWNrIEhpZGRlbiBDb250ZW50IG9wdGlvbiBpbiB0aGUgdG9vbHMuXG4gICAgLy8gIHNjcmlwdCAtLT4gc2NyaXB0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0XG4gICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgLy8gICAgICAgICAgICBtYXJrIHRoaXMgZWxlbWVudCBhcyB2aXNpYmxlIGF0IGFsbCB0aW1lcy5cbiAgICAvLyAgc3R5bGUgLS0+IHN0eWxlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgdGhlIGFjdHVhbGx5IENTUyBzY3JpcHQgaXMgc3RpbGwgZXhlY3V0ZWQgc28gd2UgaGF2ZSB0b1xuICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgLy8gIGhlYWQgLS0+IGhlYWQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCBpdCB3aWxsIHN0aWxsIGJlaGF2ZSBjb3JyZWN0XG4gICAgLy8gIHRpdGxlIC0tPiB0aXRsZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgZGlzcGxheSB0aGUgdGl0bGUuIHJlbW92ZSB0aXRsZSBmcm9tIHRoZSBsaXN0IGJlY2F1c2UgYSB0aXRsZSBjYW4gYmUgYSBjaGlsZCBvZiBhIHN2ZyBlbGVtZW50IHRvb1xuICAgIC8vICBtZXRhIC0tPiBtZXRhIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgYmFzZSAtLT4gYmFzZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIG5vc2NyaXB0IC0tPiBub3NjcmlwdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIHRlbXBsYXRlIC0tPiB0ZW1wbGF0ZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYmVjYXVzZSB0aGV5IGFyZSBqdXN0IGEgbWVjaGFuaXNtIGZvciBob2xkaW5nIGNsaWVudC1zaWRlIGNvbnRlbnRcbiAgICAvLyAgICAgICAgICAgICAgIHRoYXQgaXMgbm90IHRvIGJlIHJlbmRlcmVkIHdoZW4gYSBwYWdlIGlzIGxvYWRlZC4gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50L3RlbXBsYXRlXG4gICAgLy8gIGRhdGFsaXN0IC0tPiBkYXRhbGlzdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCxcbiAgICBwdWJsaWMgc3RhdGljIGhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzID0gWydzY3JpcHQnLCAnbGluaycsICdzdHlsZScsICdoZWFkJywgJ21ldGEnLCAnYmFzZScsICdub3NjcmlwdCcsICd0ZW1wbGF0ZScsICdkYXRhbGlzdCddXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiB2aXNpYmxlIG9yIG5vdC4gRm9sbG93aW5nIGlzIGhvdyB0aGUgY2hlY2sgaXMgcGVyZm9ybWVkOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIENTUyAtLT4gZGlzbGF5OiBub25lXG4gICAgICogICAgICAgQ1NTIC0tPiB2aXNpYmlsaXR5OiBoaWRkZW5cbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGhpZGRlblxuICAgICAqICAgIDIuIENoZWNrIGlmIHRoZSBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgaGlkZGVuIHdpdGggdGhlIHNhbWVcbiAgICAgKiAgICAgICBvcHRpb25zIGxpc3RlZCBpbiAxLlxuICAgICAqXG4gICAgICogICAgTm90ZTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgaGlkZGVuIHRoZW4gdGhpc1xuICAgICAqICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIChub2RlIGlzIG5vdCB2aXNpYmxlKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgb3BhY2l0eTowIG9yIGZpbHRlcjpvcGFjaXR5KDAlKSwgb3Igc2ltaWxhciBTVkcgbWVjaGFuaXNtczogXG4gICAgICogICAgICBUaGV5IGFyZSBub3QgY29uc2lkZXJlZCBoaWRkZW4uIFRleHQgaGlkZGVuIHdpdGggdGhlc2UgbWV0aG9kcyBjYW4gc3RpbGwgYmUgc2VsZWN0ZWQgb3IgY29waWVkLCBcbiAgICAgKiAgICAgIGFuZCB1c2VyIGFnZW50cyBzdGlsbCBleHBvc2UgaXQgaW4gdGhlaXIgYWNjZXNzaWJpbGl0eSB0cmVlcy4gIFxuICAgICAqIFxuICAgICAqICAgIE5vdGU6IG5vZGVzIGhpZGRlbiBvZmYgc2NyZWVuIG9yIGJlaGluZCBhbm90aGVyIG9iamVjdDogdGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuLiBcbiAgICAgKiAgICAgIFRoZXkgYXJlIGV4cG9zZWQgaW4gdGhlIGFjY2Vzc2liaWxpdHkgdHJlZSBhbmQgdGhleSBjYW4gZXZlbiBuYW1lIG9uLXNjcmVlbiBvYmplY3RzLlxuICAgICAqIFxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIHZpc2libGUgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IGZhbHNlIGlmIHRoZSBub2RlIGlzIE5PVCB2aXNpYmxlLCB0cnVlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFZpc1V0aWxcbiAgICAgKi9cbiAgICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXNpYmxlKG5vZGVJbjogTm9kZSkgOiBib29sZWFuIHtcblxuICAgICAgICAvLyBDaGVjayB0aGUgbm9kZVR5cGUgaWYgdGhpcyBub2RlLCBpZiB0aGlzIG5vZGUgaXMgYSB0ZXh0IG5vZGUgdGhlblxuICAgICAgICAvLyB3ZSBnZXQgdGhlIHBhcmVudG5vZGUgYW5kIHNldCB0aGF0IGFzIHRoZSBub2RlIGFzIGEgdGV4dCBub2RlcyxcbiAgICAgICAgLy8gdmlzaWJpbGl0eSBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGVJbi5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZUluID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUluKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZSA9IG5vZGVJbiBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGFsbG93IG5vZGVUeXBlIGVsZW1lbnQsIGFuZCBUZXh0Tm9kZSBhbGwgb3RoZXIgbm9kZXNUeXBlc1xuICAgICAgICAvLyB3ZSBjYW4gcmV0dXJuIHRoZSB2aXNpYmlsaXR5IGFzIHZpc2libGUuXG4gICAgICAgIC8vIEZvbGxvd2luZyBub2RlcyB3aWxsIGJlIHJldHVybmVkIGFzIHZpc2FibGUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgY2FuIG5vdFxuICAgICAgICAvLyBhY3R1YWxseSBjaGFuZ2UgdGhlaXIgdmlzaWJpbGl0eS5cbiAgICAgICAgLy8gIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIC0tPiA3XG4gICAgICAgIC8vICBOb2RlLkNPTU1FTlRfTk9ERSAgICAgICAgICAgICAgICAtLT4gOFxuICAgICAgICAvLyAgOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gICAgICAgICAgICAgICAtLT4gOVxuICAgICAgICAvLyAgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgICAgICAgICAgLS0+IDEwXG4gICAgICAgIC8vICBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICAtLT4gMTFcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG93bmVyRG9jdW1lbnQgaXMgcHJlc2VudCBiZWZvcmUgbW92aW5nIGZvcndhcmRcbiAgICAgICAgLy8gaW4gZGV0ZWN0aW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LiBJbiB0aGUgY2FzZSB0aGF0IG93bmVyRG9jdW1lbnRcbiAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgdGhlbiB3ZSBzaW1wbHkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZSBieSBkZWZhdWx0LlxuICAgICAgICBpZiAoIW5vZGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsYXJhdGlvblxuICAgICAgICBsZXQgY29tcFN0eWxlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhpcyBub2RlIGlzIGEgc2NyaXB0LCBsaW5rIG9yIHN0eWxlIG5vZGUsIHJpZ2h0IGF3YXkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZVxuICAgICAgICAvLyBiZWNhdXNlIHNjcmlwdHMsIGxpbmtzIGFuZCBzdHlsZSBub2RlcyBjYW4gbm90IGJlIGhpZGRlbiBieSBIVE1MIGF0dHJpYnV0ZSBvciBDU1Mgb3IgYXJlIGhpZGRlbiBieSBkZWZhdWx0LiBCdXQgd2Ugd2FudCB0byBzY2FuXG4gICAgICAgIC8vIHRoZSBlbGVtZW50cyBldmVyeXRpbWUgYXMgdGhleSByZW5kZXIgY29udGVudCBzdGlsbCB3aGljaCBpcyBzdGlsbCB2aXNpYmxlIHRvIHVzZXJzLlxuICAgICAgICAvLyAgc2NyaXB0IC0tPiBzY3JpcHQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHRcbiAgICAgICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vICBzdHlsZSAtLT4gc3R5bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vIGRhdGFsaXN0IC0tPiBJbiB0aGUgcmVuZGVyaW5nLCB0aGUgZGF0YWxpc3QgZWxlbWVudCByZXByZXNlbnRzIG5vdGhpbmcgYW5kIGl0LCBhbG9uZyB3aXRoIGl0cyBjaGlsZHJlbiwgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgICAgaWYgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluZGV4T2Yobm9kZU5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FjaGVWYWwgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoY2FjaGVWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlVmFsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0hJRERFTiB0byBmYWxzZSBmb3IgYWxsIHRoZSBub2RlcywgYmVmb3JlIHRoZSBjaGVjayBhbmQgdGhpcyB3aWxsIGJlIGNoYW5nZWQgdG9cbiAgICAgICAgLy8gdHJ1ZSB3aGVuIHdlIGRldGVjdCB0aGF0IHRoZSBub2RlIGlzIGhpZGRlbi4gV2UgaGF2ZSB0byBzZXQgaXQgdG8gZmFsc2Ugc28gdGhhdCB3ZSBrbm93XG4gICAgICAgIC8vIHRoZSBydWxlcyBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gICAgICAgIGNhY2hlVmFsID0gQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBpcyB2aXNpYmxlLCB3ZSBjaGVjayBjb3VwbGUgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIGhpZGRlbiBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGFyZWEsIHBhcmFtIGFuZCBhdWRpbyBlbGVtZW50cyB3ZSBkbyBub3QgY2hlY2sgaWYgdGhleSBhcmUgaGlkZGVuIGFzIGl0IGRvZXMgbm90IGFwcGx5IHRvIHRoZW0uXG4gICAgICAgIC8vIENoZWNrIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgd2hpY2ggaXMgcGFydCBvZiB0aGUgcnVsZXMsIHRvIGNoZWNrIGlmIHRoaXMgZWxlbWVudCBpcyBhbGxvd2VkIHRvIGJlIGhpZGRlbiBvciBub3RcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGUgZWxlbWVudCBpcyBwYXJ0IG9mIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgdGhlbiB3ZSBkbyBub3QgcnVuIHRoZSBoaWRkZW4gY2hlY2sgb24gdGhpcyBlbGVtZW50LFxuICAgICAgICAvLyBhbmQgZ28gc3RyaWdodCB0byB0aGUgcGFyZW50IG5vZGUuXG4gICAgICAgIC8vIEFycmF5IGNoZWNrIGVsZW1lbnRzIGxpa2U6XG4gICAgICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gICAgICAgICAgIG1ha2UgYW4gY2VydGlhbiBwYXJ0cyBvZiBhbiBtYXAgaW50ZXJhY3RpdmUuXG4gICAgICAgIC8vICBwYXJhbSAtLT4gZWxlbWVudCBjYW4gb25seSBiZSBwYXJ0IG9mIG9iamVjdCBlbG1lbnQgYW5kIGl0IGNhbm5vdCBiZSBoaWRkZW4gZGlyZWN0bHksIGl0XG4gICAgICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgICAgICAvLyAgYXVkaW8gLS0+IElmIHRoaXMgZWxlbWVudCBpcyBoaWRkZW4gaXQgd2lsbCBzdGlsbCBwbGF5IHRoZSBtdXNpYywgc28gd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXJcbiAgICAgICAgLy8gICAgICAgICAgICB2aW9sYXRpb25zIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdW5oaWRlYWJsZUVsZW1lbnRzIGFycmF5IGlzIG5vdCBkZWZpbmVkIHRoZW4gd2UganVzdCBzY2FuIGFsbCBlbGVtZW50cyBhbmQgZG8gbm8gZmlsdGVyaW5nIGF0IGFsbC5cbiAgICAgICAgaWYgKFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSBudWxsIHx8IFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSB1bmRlZmluZWQgfHwgVmlzVXRpbC51bmhpZGVhYmxlRWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBkZWZhdWx0VmlldyBleGlzdHMgZm9yIHRoaXMgbm9kZSwgaWYgaXQgZG9lcyB0aGVuIHVzZSB0aGlzIHRvIHJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZVxuICAgICAgICAgICAgLy8gZnVuY3Rpb24gdG8gZ2V0IHRoZSBDU1Mgc3R5bGUgZm9yIHRoZSBub2RlLlxuICAgICAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldykge1xuICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZSBvbiB0aGlzIG5vZGUgdG8gZmV0Y2ggdGhlIENTUyBjb21wdWF0aW9uIG9mIHRoZSBub2RlXG4gICAgICAgICAgICAgICAgY29tcFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGRlZmF1bHRWaWV3IGRvZXMgbm90IGV4aXN0cyByZXR1cm4gdHJ1ZSB0byBpZGVudGlmeSB0aGF0IHRoaXNcbiAgICAgICAgICAgIC8vIG5vZGUgaXMgdmlzaWJsZSwgYmVjYXVzZSB3ZXJlIG5vdCBhYmxlIHRvIGRldGVjdCBpZiBpdCB3YXMgbm90LlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGhpZGRlbiBlbGVtZW50IHByb3BlcnR5IGFuZCBoaWRkZW4gYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgaGlkZGVuQXR0cmlidXRlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICAgICAgICBsZXQgaGlkZGVuUHJvcGVydHlDdXN0b20gPSBjYWNoZVZhbDtcbiAgICAgICAgICAgIC8vIFRvIGdldCB0aGUgaGlkZGVuIHByb3BlcnR5IHdlIG5lZWQgdG8gcGVyZm9ybSBhIHNwZWNpYWwgY2hlY2sgYXMgaW4gc29tZSBjYXNlcyB0aGUgaGlkZGVuIHByb3BlcnR5IHdpbGwgbm90IGJlXG4gICAgICAgICAgICAvLyBhIGJvb2xlYW4sIGZvciB0aGVzZXMgY2FzZXMgd2Ugc2V0IGl0IHRvIGZhbHNlIGFzIHdlIGFyZSBub3QgYWJsZSB0byBkZXRlcm1pbmUgdGhlIHRydWUgaGlkZGVuIGNvbmRpdGlvbi5cbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYmVjYXVzZSBmb3JtIGVsZW1lbnRzIGFyZSBhYmxlIHRvIHBlcmZvcm0gYW4gb3ZlcnJpZGUsIHNvIHdoZW4gd2UgaGF2ZSBpZD1cImhpZGRlblwiIGZvciBhbiBlbGVtZW50XG4gICAgICAgICAgICAvLyB3aGljaCBpcyB1bmRlciB0aGUgZm9ybSBlbGVtZW50IHRoZW4sIG5vZGUuaGlkZGVuIGdpdmVzIHRoZSBlbGVtZW50L2xpc3Qgb2YgZWxlbWVudHMgd2hpY2ggaGF2ZSBpZD1cImhpZGRlblwiLiBSZWZlciB0b1xuICAgICAgICAgICAgLy8gbW96aWxsYSBidWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNjczNTZcbiAgICAgICAgICAgIGxldCBoaWRkZW5Qcm9wZXJ0eSA9IHR5cGVvZiAobm9kZSBhcyBhbnkpLmhpZGRlbiA9PT0gXCJib29sZWFuXCIgPyAobm9kZSBhcyBhbnkpLmhpZGRlbiA6IGZhbHNlO1xuICAgICAgICAgICAgLy8gSWYgY29tcFN0eWxlIG9iamVjdCBpcyBlbXB0eSwgbm9kZSBkb2VzJ3QgaGF2ZSBoaWRkZW4gcHJvcGVydHksIG5vZGUgZG9lcyd0IGhhdmUgaGlkZGVuIGF0dHJpYnV0ZSBhbmQgZG9lcyd0IGhhdmUgY3VzdG9tIFBUXG4gICAgICAgICAgICAvLyBoaWRkZW4gcHJvcGVydHkgdGhlbiB3ZSBjYW4ganVzdCByZXR1cm4gdHJ1ZSAobm9kZSB2aXNpYmxlKSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgaWYgKCFjb21wU3R5bGUgJiZcbiAgICAgICAgICAgICAgICAhaGlkZGVuUHJvcGVydHkgJiYgLy8gdGhpcyBjb3ZlcnMgZmFsc2UsIG51bGwsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIChoaWRkZW5BdHRyaWJ1dGUgPT09IG51bGwgfHwgaGlkZGVuQXR0cmlidXRlID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAgICAgIWhpZGRlblByb3BlcnR5Q3VzdG9tIC8vIFRoaXMgY292ZXJzIGZhbHNlLCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjb21wU3R5bGUgaXMgZGVmaW5lZCB3ZSBjaGVjayB0aGUgZm9sbG93aW5nOlxuICAgICAgICAgICAgLy8gIENTUyBzdHlsZSBkaXNwbGF5IHNldCB0byBub25lXG4gICAgICAgICAgICAvLyAgQ1NTIHN0eWxlIHZpc2liaWxpdHkgc2V0IHRvIGhpZGRlblxuICAgICAgICAgICAgLy8gICAgTm90ZTogRm9yIHRoaXMgcHJvcGVydHkgc2luY2UgaXQgaXMgaW5oZXJpdGVkLCBuZWVkIHRvIHNraXAgdGhlIGNoZWNrIG9uIHBhcmVudHMgYXNcbiAgICAgICAgICAgIC8vICAgICAgICAgIHRoZSBwYXJlbnQgY2FuIGhhdmUgaGlkZGVuIGJ1dCB0aGUgY2hpbGQgY2FuIGJlIHZpc2libGUuIFNvIHdlIG9ubHkgY2hlY2sgdGhpcyBwcm9wZXJ0eVxuICAgICAgICAgICAgLy8gICAgICAgICAgb24gY2hpbGQgZWxlbWVudHMvZWxlbWVudHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAgICAvLyAgbm9kZSBoaWRkZW4gcHJvcGVydHkgc2V0IChub2RlLmhpZGRlbilcbiAgICAgICAgICAgIC8vICBub2RlIGF0dHJpYnV0ZSBoaWRkZW4gc2V0ICh0byBhbnkgdmFsdWUpXG4gICAgICAgICAgICAvLyAgbm9kZSBjdXN0b20gaGlkZGVuIHByb3BlcnR5IHNlciAobm9kZS5QVF9OT0RFX0hJRERFTilcbiAgICAgICAgICAgIC8vIElmIGFueSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgdHJ1ZSB0aGVuIHdlIHJldHVybiBmYWxzZSBhcyB0aGlzIGVsZW1lbnQgaXMgbm90IHZpc2libGVcbiAgICAgICAgICAgIGlmICgoY29tcFN0eWxlICE9PSBudWxsICYmICgoY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8XG4gICAgICAgICAgICAgICAgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJWaXNpYmlsaXR5X0NoZWNrX1BhcmVudFwiLCBudWxsKSAmJiBjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndmlzaWJpbGl0eScpID09PSAnaGlkZGVuJykpKSB8fFxuICAgICAgICAgICAgICAgIChjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpICE9PSAnYmxvY2snICAmJiAoaGlkZGVuUHJvcGVydHkgfHwgaGlkZGVuQXR0cmlidXRlICE9IG51bGwgfHwgaGlkZGVuUHJvcGVydHlDdXN0b20pKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXQgYSBjdXN0b20gZXhwYW5kb3MgcHJvcGVydHkgb24gdGhlIHRoZSBub2RlIHRvIGlkZW50aWZ5IHRoYXQgaXQgaXMgaGlkZGVuLCBzbyB0aGF0IHdlIGNhbiB1c2VzXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoaXMgaW4gdGhlIHJ1bGVzIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBpcyBoaWRkZW4gb3Igbm90LCBpZiB3ZSBuZWVkIHRvLlxuICAgICAgICAgICAgICAgIC8vIFVzZSBleHBhbmRvcyBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGEgaGFzaCBtYXAgd2hpY2ggc3RvcmVzIHRoZSBlbGVtZW50cywgYWRkaW5nL2NoZWNraW5nIGV4cGFuZG9zXG4gICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBpcyBhIGxvdCBmYXN0ZXIgcGVyZm9ybWFuY2Ugd2hpc2UuIEZvciBIYXNoIG1hcCB3ZSBuZWVkIHRvIHN0b3JlIGJhc2VkIG9uIHhwYXRoLCBhbmQgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgLy8geHBhdGggaXQgaXMgbW9yZSBwZXJmb3JtYW5jZSBpbXBhY3QuXG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgY29udGVudC12aXNpYmlsaXR5OiBpZiB0aGUgY29udGVudC12aXNpYmlsaXR5IGlzIGhpZGRlbiwgdGhlbiwgcmV0dXJuIGZhbHNlIGFzIHRoZSBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoVmlzVXRpbC5pc0NvbnRlbnRIaWRkZW4obm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBoaWRkZW4gYnkgY2xpcC1wYXRoXG4gICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IGNvbnRhaW5zIGZvY3VzYWJsZSBlbGVtZW50cywgc2ltaWxhcmx5IHRvIG9mZnNjcmVlbiBjb250ZW50XG4gICAgICAgICAgICBpZiAoQ2xpcFBhdGhVdGlsLmlzTm9kZVZpc3VhbGx5SGlkZGVuQnlDbGlwUGF0aChub2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgIC8vIHRoZSBoaWRkZW4gQ1NTLCBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUuIE9ubHkga2VlcCBjaGVja2luZyB1bnRpbCB3ZSBhcmUgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgcGFyZW50Tm9kZVxuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuXG4gICAgICAgIC8vIElmIHRoZSBwYXJlbnQgbm9kZSBleGlzdHMgYW5kIHRoZSBub2RldHlwZSBpcyBlbGVtZW50ICgxKSwgdGhlbiBydW4gcmVjdXJzaXZlIGNhbGwgdG8gcGVyZm9ybSB0aGUgY2hlY2tcbiAgICAgICAgLy8gYWxsIHRoZSB3YXkgdXAgdG8gdGhlIHZlcnkgcGFyZW50IG5vZGUuIFVzZSByZWN1cnNpdmUgY2FsbCBoZXJlIGluc3RlYWQgb2YgYSB3aGlsZSBsb29wIHNvIHRoYXQgd2UgZG8gbm90XG4gICAgICAgIC8vIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgaWYgdGhlIG5vZGUgaXMgdmlzaWJsZSBvciBub3QgZm9yIGFsbCB0aGUgcGFyZW50cyBzdGFydGluZyB3aXRoXG4gICAgICAgIC8vIGNoaWxkIG5vZGUuXG4gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwgJiYgcGFyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIGEgcGFyZW50IGVsZW1lbnQgZ29pbmcgdGhyb3VnaCB0aGUgaXNOb2RlVmlzaWJsZSBmdW5jdGlvbiB3ZSBoYXZlIHRvIG1hcmsgaXQgYXMgc3VjaFxuICAgICAgICAgICAgLy8gc28gdGhhdCBpbiB0aGUgZnVuY3Rpb24gd2UgY2FuIHNraXAgY2hlY2tpbmcgdmlzaWJpbGl0eTogaGlkZGVuIGZvciBwYXJlbnQgZWxlbWVudHMgc2luY2UgdmlzaWJpbGl0eTogaGlkZGVuXG4gICAgICAgICAgICAvLyBpcyBpbmhlcml0ZWQsIHdoaWNoIGFsbG93cyBhIGNoaWxkIHRvIGhhdmUgYSBkaWZmZXJlbnQgc2V0dGluZyB0aGVuIHRoZSBjaGlsZC4gVGhpcyBwcm9wZXJ0eSBvbmx5IG5lZWRzIHRvIGJlIGNoZWNrZWRcbiAgICAgICAgICAgIC8vIG9uY2UgZm9yIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcGFzc2VkIGRvd24gYW5kIHRoYXQgaXMgYWxsLiBJZ25vcmUgaXQgZm9yIGFsbCB0aGUgcGFyZW50cyB0aGF0IHdlIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRFbGVtZW50IGFzIEVsZW1lbnQsIFwiVmlzaWJpbGl0eV9DaGVja19QYXJlbnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHVwd2FyZHMgcmVjdXJzaXZlbHksIGFuZCBzYXZlIHRoZSByZXN1bHRzIGluIGFuIHZhcmlhYmxlXG4gICAgICAgICAgICBsZXQgbm9kZVZpc2libGUgPSBWaXNVdGlsLmlzTm9kZVZpc2libGUocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIG5vdCBiZSB2aXNpYmxlIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ISURERU4gdG8gdHJ1ZS5cbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIGluIHRoZSBydWxlcy5cbiAgICAgICAgICAgIC8vIGlmICghbm9kZVZpc2libGUpIHtcbiAgICAgICAgICAgIC8vICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIG5vZGVWaXNpYmxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB0cnVlIChub2RlIGlzIHZpc2libGUpXG4gICAgICAgIHJldHVybiBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHZpc3VhbGx5IGhpZGRlbiBieSBjbGlwcGluZyBvciBvcGFxOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuOlxuICAgICAqICAgICAgIENTUyAtLT4gY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpXG4gICAgICogICAgICAgQ1NTIC0tPiBvcGFjaXR5OiAwXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSB2aXN1YWxseSBoaWRkZW4gdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSAobm9kZSBpcyBub3QgdmlzdWFsbHkgaGlkZGVuKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpIG9yIG9wYWNpdHk6MCBvciBmaWx0ZXI6b3BhY2l0eSgwJSksIG9yIHNpbWlsYXIgU1ZHIG1lY2hhbmlzbXM6IFxuICAgICAqICAgICAgVGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuIHRvIGFuIEFULiBUZXh0IGhpZGRlbiB3aXRoIHRoZXNlIG1ldGhvZHMgY2FuIHN0aWxsIGJlIHNlbGVjdGVkIG9yIGNvcGllZCwgXG4gICAgICogICAgICBhbmQgdXNlciBhZ2VudHMgc3RpbGwgZXhwb3NlIGl0IGluIHRoZWlyIGFjY2Vzc2liaWxpdHkgdHJlZXMuICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyB2aXN1YWxseSBoaWRkZW4gb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgdGhlIG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBWaXNVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXN1YWxseUhpZGRlbihub2RlOiBOb2RlKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvLyBTZXQgUFRfTk9ERV9ISURERU4gdG8gZmFsc2UgZm9yIGFsbCB0aGUgbm9kZXMsIGJlZm9yZSB0aGUgY2hlY2sgYW5kIHRoaXMgd2lsbCBiZSBjaGFuZ2VkIHRvXG4gICAgICAgIC8vIHRydWUgd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgbm9kZSBpcyBoaWRkZW4uIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgcnVsZXMgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICAgICAgICBjb25zdCBoaWRkZW4gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTlwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoaGlkZGVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGRlZmluZWQgc3R5bGVzIG9ubHkgZ2l2ZSB0aGUgc3R5bGVzIHRoYXQgY2hhbmdlZFxuICAgICAgICAgICAgY29uc3QgY29tcF9zdHlsZXMgPSBDU1NVdGlsLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBpZiAoKGNvbXBfc3R5bGVzWydwb3NpdGlvbiddPT09J2Fic29sdXRlJyAmJiBjb21wX3N0eWxlc1snY2xpcCddICYmIChjb21wX3N0eWxlc1snY2xpcCddIGFzIGFueSkucmVwbGFjZUFsbCgnICcsICcnKT09PSdyZWN0KDBweCwwcHgsMHB4LDBweCknKVxuICAgICAgICAgICAgICAgIHx8IChjb21wX3N0eWxlc1snb3BhY2l0eSddICYmIHBhcnNlRmxvYXQoY29tcF9zdHlsZXNbJ29wYWNpdHknXSkgPCAwLjEpKSAge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgICAgICAvLyB0aGUgaGlkZGVuIENTUywgcHJvcGVydHkgb3IgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgIC8vIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgY29uc3QgaGlkID0gVmlzVXRpbC5pc05vZGVWaXN1YWxseUhpZGRlbihwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIGhpZCk7XG4gICAgICAgICAgICByZXR1cm4gaGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaWRkZW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIGhpZGRlbiBieSBDU1MgY29udGVudC12aXNpYmlsaXR5OmhpZGRlblxuICAgICAqIEF0IHRoaXMgdGltZSwgQ1NTIGNvbnRlbnQtdmlzaWJpbGl0eSBpcyBwYXJ0aWFsbHkgc3VwcG9ydGVkIGJ5IENocm9tZSAmIEVkZ2UsIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3hcbiAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gVEVNUE9SQVJJTFkgZm9sbG93cyB0aGUgQ2hyb21lIHRlc3QgcmVzdWx0czpcbiAgICAgKiAgIGlmIGNvbnRlbnQtdmlzaWJpbGl0eTpoaWRkZW5cbiAgICAgKiAgICAgIGlmIHRoZSBlbGVtZW50IGlzIGJsb2NrLWxldmVsIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgaGlkZGVuO1xuICAgICAqICAgICAgaWYgdGhlIGVsZW1lbnQgaXMgaW5saW5lIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgTk9UIGhpZGRlbjsgXG4gICAgICogXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQ29udGVudEhpZGRlbihub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgICBcblxuICAgICAgICBjb25zdCBzdHlsZSA9ICBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRlbnRfdmlzaWJpbGl0eSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJjb250ZW50LXZpc2liaWxpdHlcIik7XG4gICAgICAgIGlmIChjb250ZW50X3Zpc2liaWxpdHkgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgICAgIH0gXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKTsgXG4gICAgICAgIC8vIGlubGluZSBlbGVtZW50IG9ubHlcbiAgICAgICAgaWYgKGRpc3BsYXkgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9ICBcbiAgICAgICAgXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfQ29udGVudEhpZGRlblwiLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaXMgb2Zmc2NyZWVuIGJ5IENTUyBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0VsZW1lbnRPZmZzY3JlZW4obm9kZTogSFRNTEVsZW1lbnQpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbm9kZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSAsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgXG5cbiAgICAgICAgY29uc3QgbWFwcGVyIDogRE9NTWFwcGVyID0gbmV3IERPTU1hcHBlcigpO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhub2RlKTsgXG4gICAgICAgIGlmICghYm91bmRzKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCB0cnVlKTsgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGJvdW5kc1snaGVpZ2h0J10gPT09IDAgfHwgYm91bmRzWyd3aWR0aCddID09PSAwIHx8IChib3VuZHNbJ3RvcCddK2JvdW5kc1snaGVpZ2h0J10pIDw9IDAgfHwgKGJvdW5kc1snbGVmdCddK2JvdW5kc1snd2lkdGgnXSkgPD0gMCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBcblxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBvciBpdHMgYW5jZXN0b3IgaXMgbmF0aXZlbHkgaGlkZGVuIG9yIGFyaWEtaGlkZGVuID0gJ3RydWUnXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUhpZGRlbkZyb21BVChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlzID0gQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgIFxuXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgbGV0IGFuY2VzdG9yID0gRE9NVXRpbC5nZXRBbmNlc3RvcldpdGhBdHRyaWJ1dGUobm9kZSwgXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hpZGRlbkZyb21BVFwiLCBmYWxzZSk7ICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIG5hdGl2ZWx5IGhpZGRlbiBvciBhcmlhLWhpZGRlbiA9ICd0cnVlJ1xuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVQcmVzZW50YXRpb25hbChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG5vZGUpO1xuICAgICAgICBpZiAocm9sZSAmJiAocm9sZSA9PT0gJ25vbmUnIHx8IHJvbGUgPT09ICdwcmVzZW50YXRpb24nKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBzY3JvbGxhYmxlXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRWxlbWVudFNjcm9sbGFibGUoZWxlbTogSFRNTEVsZW1lbnQpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcbiAgICAgICAgaWYgKCFzdHlsZXMpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgeF9zY3JvbGwgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cteCcpO1xuICAgICAgICBsZXQgeV9zY3JvbGwgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cteScpO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiYmVmb3JlIG5vZGU9XCIrIGVsZW0ubm9kZU5hbWUgK1wiLCBpZD1cIitlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpICtcIiwgeF9zY3JvbGw9XCIreF9zY3JvbGwgKyBcIiwgeV9zY3JvbGw9XCIreV9zY3JvbGwpO1xuIFxuICAgICAgICAvLyBJZiBvdmVyZmxvdy15IGlzIGhpZGRlbiwgc2Nyb2xsLCBvciBhdXRvLCBhbmQgdGhlIG92ZXJmbG93LXggcHJvcGVydHkgaXMgdmlzaWJsZSAoZGVmYXVsdCksIHRoZSB2YWx1ZSB3aWxsIGJlIGltcGxpY2l0bHkgY29tcHV0ZWQgYXMgYXV0by5cbiAgICAgICAgaWYgKHhfc2Nyb2xsID09PSAndmlzaWJsZScgJiYgKHlfc2Nyb2xsID09PSAnaGlkZGVuJyB8fCB5X3Njcm9sbCA9PT0gJ3Njcm9sbCcgfHwgeV9zY3JvbGwgPT09ICdhdXRvJykpXG4gICAgICAgICAgICB4X3Njcm9sbCA9ICdhdXRvJztcblxuICAgICAgICAvLyBJZiBvdmVyZmxvdy14IGlzIGhpZGRlbiwgc2Nyb2xsLCBvciBhdXRvIGFuZCB0aGUgb3ZlcmZsb3cteSBwcm9wZXJ0eSBpcyB2aXNpYmxlIChkZWZhdWx0KSwgdGhlIHZhbHVlIHdpbGwgYmUgaW1wbGljaXRseSBjb21wdXRlZCBhcyBhdXRvLlxuICAgICAgICBpZiAoeV9zY3JvbGwgPT09ICd2aXNpYmxlJyAmJiAoeF9zY3JvbGwgPT09ICdoaWRkZW4nIHx8IHhfc2Nyb2xsID09PSAnc2Nyb2xsJyB8fCB4X3Njcm9sbCA9PT0gJ2F1dG8nKSlcbiAgICAgICAgICAgIHlfc2Nyb2xsID0gJ2F1dG8nO1xuXG4gICAgICAgIC8vIHNldHRpbmcgb3ZlcmZsb3cgdG8gY2xpcCBpbiBvbmUgZGlyZWN0aW9uIHdoZW4gaXQgaXNuJ3Qgc2V0IHRvIHZpc2libGUgb3IgY2xpcCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uIHJlc3VsdHMgaW4gdGhlIGNsaXAgdmFsdWUgYmVoYXZpbmcgYXMgaGlkZGVuLiBcbiAgICAgICAgaWYgKHhfc2Nyb2xsID09PSAnY2xpcCcgJiYgeV9zY3JvbGwgIT09ICd2aXNpYmxlJyAmJiB5X3Njcm9sbCAhPT0gJ2NsaXAnKVxuICAgICAgICAgICAgeF9zY3JvbGwgPSAnaGlkZGVuJztcbiAgICAgICAgaWYgKHlfc2Nyb2xsID09PSAnY2xpcCcgJiYgeF9zY3JvbGwgIT09ICd2aXNpYmxlJyAmJiB4X3Njcm9sbCAhPT0gJ2NsaXAnKVxuICAgICAgICAgICAgeV9zY3JvbGwgPSAnaGlkZGVuJztcblxuICAgICAgICAvLyBub3Qgc2Nyb2xsYWJsZTogbm8gc2Nyb2xsIGJhcnNcbiAgICAgICAgaWYgKCh4X3Njcm9sbCA9PT0gJ3Zpc2libGUnIHx8IHhfc2Nyb2xsID09PSAnaGlkZGVuJyB8fCB4X3Njcm9sbCA9PT0gJ2NsaXAnKVxuICAgICAgICAgICAgJiYgKHlfc2Nyb2xsID09PSAndmlzaWJsZScgfHwgeV9zY3JvbGwgPT09ICdoaWRkZW4nIHx8IHlfc2Nyb2xsID09PSAnY2xpcCcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIGZhbHNlIGlmIHRoZSBvdmVyYWxsIHNjcm9sbGFibGUgZWxlbWVudCAoY2xpZW50V2lkdGggKyBzY3JvbGxiYXJXaWR0aCBhbmQgY2xpZW50SGVpZ2h0ICsgc2Nyb2xsYmFySGVpZ2h0KSBpcyB0b28gc21hbGwgdG8gYmUgdmlzaWJsZSBvbiBzY3JlZW5cbiAgICAgICAgaWYgKE1hdGgubWF4KGVsZW0ub2Zmc2V0V2lkdGgsIGVsZW0ub2Zmc2V0SGVpZ2h0KSA8IDMwIHx8IE1hdGgubWluKGVsZW0ub2Zmc2V0V2lkdGgsIGVsZW0ub2Zmc2V0SGVpZ2h0KSA8IDE1KSAgXG4gICAgICAgICAgIHJldHVybiBmYWxzZTsgXG5cbiAgICAgICAgLy8gZmFsc2UgaWYgY29udGVudCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNjcm9sbGFibGUgY29udGFpbmVyOiBib3RoIHggYW5kIHkgc2Nyb2xsIGRpc3RhbmNlcyA8IGVsZW1lbnQncyBob3Jpem9udGFsL3ZlcnRpY2FsIHBhZGRpbmdcbiAgICAgICAgY29uc3QgcGFkZGluZ194ID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVzLnBhZGRpbmdMZWZ0LCBlbGVtKSArIENTU1V0aWwuZ2V0UGl4ZWxzRnJvbVN0eWxlKHN0eWxlcy5wYWRkaW5nUmlnaHQsIGVsZW0pO1xuICAgICAgICBjb25zdCBwYWRkaW5nX3kgPSBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1RvcCwgZWxlbSkgKyBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ0JvdHRvbSwgZWxlbSk7XG4gICAgICAgIGlmIChlbGVtLnNjcm9sbFdpZHRoIC0gIGVsZW0uY2xpZW50V2lkdGggPCAxICsgcGFkZGluZ194IFxuICAgICAgICAgICAgJiYgZWxlbS5zY3JvbGxIZWlnaHQgLSAgZWxlbS5jbGllbnRIZWlnaHQgPCAxKyBwYWRkaW5nX3kpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufSIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbmNvbnN0IF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0Y29uc3QgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdGNvbnN0IG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0aWYgKCEobW9kdWxlSWQgaW4gX193ZWJwYWNrX21vZHVsZXNfXykpIHtcblx0XHRkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0XHRjb25zdCBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIG1vZHVsZUlkICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vdjIvY29tbW9uL0NvbnRleHRcIlxuLy8gaW1wb3J0IHsgU2ltdWxhdG9yIH0gZnJvbSBcIi4vdjIvc2ltdWxhdG9yXCJcbmltcG9ydCB7IENoZWNrZXIgfSBmcm9tIFwiLi92NC9jaGVja2VyL0NoZWNrZXJcIlxuZXhwb3J0IHsgQ2hlY2tlciB9XG5leHBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5leHBvcnQgeyBDb25maWcgfSBmcm9tIFwiLi92Mi9jb25maWcvQ29uZmlnXCI7XG5leHBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5leHBvcnQgeyBTUkNvbnRyb2xsZXIgfSBmcm9tIFwiLi92NC9zaW11bGF0b3IvU1JDb250cm9sbGVyXCI7XG5leHBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL3Y0L3NpbXVsYXRvci9TUkN1cnNvclwiO1xuZXhwb3J0IHsgU1JWaWV3ZXIgfSBmcm9tIFwiLi92NC9zaW11bGF0b3IvU1JWaWV3ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRGVtbyh0aW1lb3V0PzogbnVtYmVyKSB7XG4gICAgaWYgKCF0aW1lb3V0KSB0aW1lb3V0ID0gMDtcbiAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKCk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgY2hlY2tlci5jaGVjayhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0Rlc2lnblwiXSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVwb3J0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXBvcnQpO1xuICAgICAgICAgICAgY29uc3QgdmFscyA9IHtcbiAgICAgICAgICAgICAgICBcIkZBSUxcIjogMCxcbiAgICAgICAgICAgICAgICBcIlBPVEVOVElBTFwiOiAxLFxuICAgICAgICAgICAgICAgIFwiTUFOVUFMXCI6IDIsXG4gICAgICAgICAgICAgICAgXCJQQVNTXCI6IDNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8cmVwb3J0LnJlc3VsdHMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXBvcnQucmVzdWx0c1tpZHhdLnZhbHVlWzFdID09PSBcIlBBU1NcIikge1xuICAgICAgICAgICAgICAgICAgICByZXBvcnQucmVzdWx0cy5zcGxpY2UoaWR4LS0sMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVwb3J0LnJlc3VsdHMuc29ydCgoYSxiKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGEuY2F0ZWdvcnkgIT0gYi5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jYXRlZ29yeS5sb2NhbGVDb21wYXJlKGIuY2F0ZWdvcnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYS5wYXRoW1wiYXJpYVwiXSA9PT0gYi5wYXRoW1wiYXJpYVwiXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsc1thLnZhbHVlWzFdXS12YWxzW2IudmFsdWVbMV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYS5wYXRoW1wiYXJpYVwiXS5sb2NhbGVDb21wYXJlKGIucGF0aFtcImFyaWFcIl0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGxldCBsYXN0UGF0aCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgY2F0ZWdvcnkgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVwb3J0LnJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IHJlc3VsdC5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYXRoID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IHJlc3VsdC5jYXRlZ29yeTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChyZXN1bHQuY2F0ZWdvcnkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucGF0aFtcImFyaWFcIl0gIT0gbGFzdFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdFBhdGggPSByZXN1bHQucGF0aFtcImFyaWFcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UGF0aCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChcInBhZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKGxhc3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQudmFsdWUsIHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfSk7XG4gICAgfSwgdGltZW91dCk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= +(function(window) { + window.ace_ibma = ace; +})(typeof window === 'object' ? window : this); \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.09.02/js/ace-window.js b/rule-server/src/static/archives/2026.09.02/js/ace-window.js new file mode 100644 index 000000000..b8b53eb32 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/js/ace-window.js @@ -0,0 +1,5 @@ +/*! For license information please see ace.js.LICENSE.txt */ +var ace;(()=>{"use strict";var e={9910(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIADefinitions=void 0;var i=function(){function e(){}return e.nameFromContent=function(t){return t in e.designPatterns&&e.designPatterns[t].nameFrom&&e.designPatterns[t].nameFrom.includes("contents")},e.globalProperties=["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-details","aria-flowto","aria-hidden","aria-keyshortcuts","aria-label","aria-labelledby","aria-live","aria-owns","aria-relevant","aria-roledescription","aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"],e.referenceProperties=["aria-owns","aria-controls","aria-describedby","aria-labelledby","aria-flowto","aria-activedescendant"],e.globalDeprecatedRoles=["directory","doc-biblioentry","doc-endnote"],e.globalDeprecatedProperties=["aria-grabbed","aria-dropeffect"],e.propertyDataTypes={"aria-activedescendant":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-atomic":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-autocomplete":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["inline","list","both","none","undefined"]},"aria-busy":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-checked":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-colcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-controls":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-current":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["page","step","location","date","time","true","false","undefined"]},"aria-describedby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-details":{type:"http://www.w3.org/2001/XMLSchema#idrefs"},"aria-disabled":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-dropeffect":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["copy","move","link","execute","popup","none"]},"aria-errormessage":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-expanded":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-flowto":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!1},"aria-grabbed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-haspopup":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","menu","listbox","tree","grid","dialog"]},"aria-hidden":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-invalid":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","spelling","grammar","undefined"]},"aria-keyshortcuts":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-label":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-labelledby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-level":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-live":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["off","polite","assertive"]},"aria-modal":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiline":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiselectable":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-orientation":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["horizontal","vertical","undefined"]},"aria-owns":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-placeholder":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-posinset":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-pressed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-readonly":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-relevant":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["additions","removals","text","all"]},"aria-required":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-roledescription":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-rowcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-selected":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-setsize":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-sort":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["ascending","descending","other","none"]},"aria-valuemax":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuemin":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuenow":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuetext":{type:"http://www.w3.org/2001/XMLSchema#string"}},e.designPatterns={alert:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},alertdialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},application:{container:null,props:["aria-activedescendant","aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"]},article:{container:null,props:["aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},banner:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},blockquote:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},button:{container:null,props:["aria-expanded","aria-pressed"],reqProps:null,reqChildren:null,htmlEquiv:"button | input[@type='button']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},caption:{container:["figure","grid","table","treegrid"],props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},cell:{container:["row"],props:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},checkbox:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='checkbox']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},code:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},columnheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='col']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},combobox:{container:null,props:["aria-controls","aria-activedescendant","aria-autocomplete","aria-readonly","aria-required"],reqProps:["aria-expanded"],reqChildren:[],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"]},complementary:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},comment:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},contentinfo:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},definition:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},deletion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},dialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},directory:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecated:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"doc-abstract":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-acknowledgments":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-afterword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-appendix":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-backlink":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-biblioentry":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!0,nameFrom:["author"]},"doc-bibliography":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-biblioref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-chapter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-colophon":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-conclusion":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-cover":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0},"doc-credit":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-credits":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-dedication":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-endnote":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-endnotes":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-epigraph":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-epilogue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-errata":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-example":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-footnote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-foreword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossary":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-index":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-introduction":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-noteref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-notice":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-pagebreak":{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0},"doc-pagelist":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pagefooter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-pageheader":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-part":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-preface":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-prologue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pullquote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-qna":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-subtitle":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"]},"doc-tip":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-toc":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},document:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},emphasis:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},feed:{container:null,props:null,reqProps:null,reqChildren:["article"],htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},figure:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},form:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"form",roleType:"landmark",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},generic:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"div | span",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby","aria-roledescription"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"graphics-document":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"]},"graphics-object":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!1,nameFrom:["author"]},"graphics-symbol":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},grid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-readonly","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:"table",roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},gridcell:{container:["row"],props:["aria-colindex","aria-colspan","aria-disabled","aria-errormessage","aria-expanded","aria-haspopup","aria-invalid","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"widget",nameFrom:["author","contents"]},group:{container:null,props:["aria-activedescendant"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},heading:{container:null,props:null,reqProps:["aria-level"],reqChildren:null,htmlEquiv:"h1 | h2 | h3 | h4 | h5 | h6",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},img:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},image:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},insertion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},link:{container:null,props:["aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},list:{container:null,props:null,reqProps:null,reqChildren:["listitem"],htmlEquiv:"ol | ul",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},listbox:{container:null,props:["aria-activedescendant","aria-expanded","aria-multiselectable","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["group","option"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},listitem:{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},log:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},main:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},mark:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"mark",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},marquee:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},math:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!1,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},menu:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menubar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menuitem:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemcheckbox:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemradio:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},meter:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},navigation:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},none:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},note:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},option:{container:["group","listbox"],props:["aria-selected","aria-checked","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"option",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},paragraph:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},presentation:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},progressbar:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},radio:{container:null,props:["aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='radio']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},radiogroup:{container:null,props:["aria-activedescendant","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["radio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},region:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},row:{container:["grid","rowgroup","table","treegrid"],props:["aria-activedescendant","aria-colindex","aria-expanded","aria-level","aria-posinset","aria-rowindex","aria-selected","aria-setsize"],reqProps:null,reqChildren:["cell","columnheader","gridcell","rowheader"],htmlEquiv:"tr",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},rowgroup:{container:["grid","table","treegrid"],props:[],reqProps:null,reqChildren:["row"],htmlEquiv:"tbody | tfoot | thead",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},rowheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='row']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},scrollbar:{container:null,props:["aria-orientation","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-controls","aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},search:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},searchbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='search']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},separator:{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},slider:{container:null,props:["aria-orientation","aria-readonly","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},spinbutton:{container:null,props:["aria-activedescendant","aria-readonly","aria-required","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},status:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},strong:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},subscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},suggestion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},superscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},switch:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},tab:{container:["tablist"],props:["aria-expanded","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},table:{container:null,props:["aria-colcount","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup","caption"],htmlEquiv:"table",roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tablist:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation"],reqProps:null,reqChildren:["tab"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tabpanel:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},term:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"dfn",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},textbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='text']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},time:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},timer:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},toolbar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tooltip:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tree:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation","aria-required"],reqProps:null,reqChildren:["group","treeitem"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treegrid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-orientation","aria-readonly","aria-required","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treeitem:{container:["group","tree"],props:["aria-checked","aria-expanded","aria-level","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]}},e.elementsAllowedDisabled=["button","input","select","textarea","optgroup","option","fieldset"],e.elementsAllowedRequired=["select","textarea"],e.elementsAllowedReadOnly=["textarea"],e.documentConformanceRequirement={abbr:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},address:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},article:{implicitRole:["article"],validRoles:["application","document","feed","main","none","presentation","region"],globalAriaAttributesValid:!0},aside:{implicitRole:["complementary"],validRoles:["doc-dedication","doc-example","doc-footnote","doc-glossary","doc-pullquote","doc-tip","feed","none","note","presentation","region","search"],globalAriaAttributesValid:!0},audio:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},b:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},base:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},bdi:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},bdo:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},blockquote:{implicitRole:["blockquote"],validRoles:["any"],globalAriaAttributesValid:!0},body:{implicitRole:["generic"],validRoles:null,otherDisallowedAriaAttributes:["aria-hidden"],globalAriaAttributesValid:!0},br:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},canvas:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},caption:{implicitRole:["caption"],validRoles:null,globalAriaAttributesValid:!0,allowAttributesFromImplicitRole:!1},cite:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},code:{implicitRole:["code"],validRoles:["any"],globalAriaAttributesValid:!0},col:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},colgroup:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},data:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},datalist:{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},dd:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},del:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0},details:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},dfn:{implicitRole:["term"],validRoles:["any"],globalAriaAttributesValid:!0},dialog:{implicitRole:["dialog"],validRoles:["alertdialog"],globalAriaAttributesValid:!0},dl:{implicitRole:null,validRoles:["group","list","none","presentation"],globalAriaAttributesValid:!0},dt:{implicitRole:["term"],validRoles:["listitem"],globalAriaAttributesValid:!0},em:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},embed:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},fieldset:{implicitRole:["group"],validRoles:["none","presentation","radiogroup"],globalAriaAttributesValid:!0},figcaption:{implicitRole:null,validRoles:["group","none","presentation"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},form:{implicitRole:["form"],validRoles:["none","presentation","search"],globalAriaAttributesValid:!0},head:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},hgroup:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},h1:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h2:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h3:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h4:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h5:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h6:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},hr:{implicitRole:["separator"],validRoles:["doc-pagebreak","none","presentation"],globalAriaAttributesValid:!0},html:{implicitRole:["document"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},i:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},iframe:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},ins:{implicitRole:["insertion"],validRoles:["any"],globalAriaAttributesValid:!0},kbd:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},label:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},legend:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},link:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},main:{implicitRole:["main"],validRoles:null,globalAriaAttributesValid:!0},map:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},mark:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},math:{implicitRole:["math"],validRoles:null,globalAriaAttributesValid:!0},menu:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},meta:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},meter:{implicitRole:["meter"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"],allowAttributesFromImplicitRole:!1},nav:{implicitRole:["navigation"],validRoles:["doc-index","doc-pagelist","doc-toc","menu","menubar","tablist","none","presentation"],globalAriaAttributesValid:!0},noscript:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},object:{implicitRole:null,validRoles:["application","document","img"],globalAriaAttributesValid:!0},ol:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},optgroup:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},option:{implicitRole:["option"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-selected"]},output:{implicitRole:["status"],validRoles:["any"],globalAriaAttributesValid:!0},p:{implicitRole:["paragraph"],validRoles:["any"],globalAriaAttributesValid:!0},param:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},picture:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},pre:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},progress:{implicitRole:["progressbar"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax"]},q:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},rp:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},rt:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},ruby:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},s:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-label","aria-labelledby"]},samp:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},script:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},search:{implicitRole:["search"],validRoles:["search","form","group","none","presentation","region"],globalAriaAttributesValid:!0},slot:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},small:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},source:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},span:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},strong:{implicitRole:["strong"],validRoles:["any"],globalAriaAttributesValid:!0},style:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},sub:{implicitRole:["subscript"],validRoles:["any"],globalAriaAttributesValid:!0},sup:{implicitRole:["superscript"],validRoles:["any"],globalAriaAttributesValid:!0},svg:{implicitRole:["graphics-document"],validRoles:["any"],globalAriaAttributesValid:!0},table:{implicitRole:["table"],validRoles:["any"],globalAriaAttributesValid:!0},template:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},textarea:{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0},tfoot:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},thead:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},time:{implicitRole:["time"],validRoles:["any"],globalAriaAttributesValid:!0},title:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},track:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},u:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},ul:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},var:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},video:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},wbr:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]}},e.documentConformanceRequirementSpecialTags={a:{"with-href":{implicitRole:["link"],validRoles:["button","checkbox","doc-backlink","doc-biblioref","doc-glossref","doc-noteref","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab","treeitem"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-disabled=true"]},"without-href":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},area:{"with-href":{implicitRole:["link"],validRoles:null,globalAriaAttributesValid:!0},"without-href":{implicitRole:["generic"],validRoles:["button","link"],globalAriaAttributesValid:!0}},div:{"child-dl":{implicitRole:["generic"],validRoles:["presentation","none"],globalAriaAttributesValid:!0},"no-child-dl":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},figure:{"child-figcaption":{implicitRole:["figure"],validRoles:["doc-example"],globalAriaAttributesValid:!0},"no-child-figcaption":{implicitRole:["figure"],validRoles:["any"],globalAriaAttributesValid:!0}},footer:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["contentinfo"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0}},header:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["banner"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0}},img:{"img-with-accname":{implicitRole:["img"],validRoles:["button","checkbox","doc-cover","link","menuitem","menuitemcheckbox","menuitemradio","meter","option","progressbar","radio","scrollbar","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"img-without-accname-empty-alt":{implicitRole:["presentation","none"],validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]},"img-without-accname-no-alt":{implicitRole:["img"],validRoles:["presentation","none"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]}},input:{button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"checkbox-with-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch","button"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},"checkbox-without-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},color:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},date:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"datetime-local":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},file:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"]},hidden:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},image:{implicitRole:["button"],validRoles:["checkbox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},month:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},number:{implicitRole:["spinbutton"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},password:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},radio:{implicitRole:["radio"],validRoles:["menuitemradio"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},range:{implicitRole:["slider"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"]},reset:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"search-no-list":{implicitRole:["searchbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"search-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},submit:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"tel-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"tel-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"text-no-list":{implicitRole:["textbox"],validRoles:["combobox","searchbox","spinbutton"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"text-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},time:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"url-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"url-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},week:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"default-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"default-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0}},li:{"child-of-list-role":{implicitRole:["listitem"],validRoles:null,globalAriaAttributesValid:!0},"no-child-of-list-role":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},section:{"with-name":{implicitRole:["region"],validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0},"without-name":{implicitRole:null,validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0}},select:{"no-multiple-attr-size-gt1":{implicitRole:["combobox"],validRoles:["menu"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]},"multiple-attr-size-gt1":{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]}},summary:{"first-summary-of-detail":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-disabled","aria-haspopup"]},"no-first-summary-of-detail":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tbody:{"des-table":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-grid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},td:{"des-table":{implicitRole:["cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},th:{"des-table-row-scope":{implicitRole:["rowheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-table-column-scope":{implicitRole:["columnheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-row-scope":{implicitRole:["rowheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-column-scope":{implicitRole:["columnheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tr:{"des-table":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},default:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},e.relatedAriaHtmlAttributes={"aria-checked":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["checked"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["checked"],htmlAttributeValues:null}]},"aria-disabled":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["disabled"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["disabled"],htmlAttributeValues:null}]},"aria-hidden":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]},{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["until-found"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]}]},"aria-placeholder":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["placeholder"],htmlAttributeValues:null}]},"aria-valuemax":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["max"],htmlAttributeValues:null}]},"aria-valuemin":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["min"],htmlAttributeValues:null}]},"aria-readonly":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"false","false"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"true","true"]}]},"aria-required":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["required"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["required"],htmlAttributeValues:null}]},"aria-colspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["colspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["colspan"],htmlAttributeValues:null}]},"aria-rowspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["rowspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["rowspan"],htmlAttributeValues:null}]}},e.containers=[],e}();t.ARIADefinitions=i;var a=[];for(var n in i.designPatterns){var r=i.designPatterns[n].container;if(null!==r)for(var l=0,o=r;l<o.length;l++){var s=o[l];-1==a.indexOf(s)&&a.push(s)}}i.containers=a},9955(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAMapper=void 0;var r=i(9910),l=i(3103),o=i(1686),s=i(7139),u=i(7011),d=i(5279),c=i(1560),m=i(4566),p=i(3864),h=i(1950),g=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.childrenCanHaveRole=function(e,t){return!(t in r.ARIADefinitions.designPatterns&&r.ARIADefinitions.designPatterns[t].presentationalChildren)},t.prototype.getRole=function(e){return t.nodeToRole(e)},t.prototype.getNamespace=function(){return"aria"},t.prototype.getAttributes=function(e){var i={};if(1===e.nodeType){var a=m.CacheUtil.getCache(e,"ARIAMapper::getAttributes",void 0);if(void 0!==a)return a;for(var n=e,r=0;r<n.attributes.length;++r){var l=n.attributes[r],o=l.name.toLowerCase();o.startsWith("aria-")&&(i[o.substring(5)]=l.nodeValue)}var s=e.nodeName.toLowerCase();t.applyAttrRole(n,"global",i),t.applyAttrRole(n,s,i),m.CacheUtil.setCache(e,"ARIAMapper::getAttributes",i)}else if(3===e.nodeType){var u=t.textAttrValueCalculators;for(var d in u){var c=u[d](e);null!=c&&(i[d]=c)}}return i},t.applyAttrRole=function(e,i,a){var n=t.elemAttrValueCalculators;if(i in n)for(var r in n[i])if(!(r in a)){var l=n[i][r];null!=l&&("string"!=typeof l&&(l=l(e)),a[r]=l)}},t.getAriaOwnedBy=function(e){var t=d.FragmentUtil.getOwnerFragment(e);if(!m.CacheUtil.getCache(t,"ARIAMapper::precalcOwned",!1)){for(var i=t.querySelectorAll("[aria-owns]"),a=0;a<i.length;++a)for(var n=i[a],r=n.getAttribute("aria-owns").split(/ +/g),l=function(e){var i=t.getElementById(r[e]);if(i&&!o.DOMUtil.sameNode(n,i)){for(var a=[],l=i.querySelectorAll("[aria-owns]"),s=0;s<l.length;++s)for(var u=l[s].getAttribute("aria-owns").split(/ +/g),d=0;d<u.length;++d){var c=t.getElementById(u[d]);c&&a.push(c)}if(0===a.length)return m.CacheUtil.setCache(i,"aria-owned",n),"continue";for(var h=n,g=!1;null!==h;){if(a.some(function(e){return o.DOMUtil.sameNode(h,e)})){g=!0;break}h=p.DOMWalker.parentElement(h)}g||m.CacheUtil.setCache(i,"aria-owned",n)}},s=0;s<r.length;++s)l(s);m.CacheUtil.setCache(t,"ARIAMapper::precalcOwned",!0)}return m.CacheUtil.getCache(e,"aria-owned",null)},t.prototype.getNodeHierarchy=function(e){if(!e)return[];if(1!==e.nodeType){for(var i=(s=this.getNodeHierarchy(p.DOMWalker.parentElement(e))).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0},a=[],n=0,r=s;n<r.length;n++){var l=r[n];a.push(l)}return a.push({attributes:{},bounds:this.getBounds(e),namespace:this.getNamespace(),node:e,role:this.getRole(e)||null,rolePath:i.rolePath+"/"+(this.getRole(e)||null),roleCount:{},childrenCanHaveRole:i.childrenCanHaveRole}),a}var o=e;if(!(a=m.CacheUtil.getCache(o,"ARIAMapper::getNodeHierarchy",null))){var s,u=t.getAriaOwnedBy(o);for(u||(u=p.DOMWalker.parentElement(o));u&&1!==u.nodeType;)u=p.DOMWalker.parentElement(o);for(i=(s=u?this.getNodeHierarchy(u):[]).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0};null===i.role;)i=(s=(u=t.getAriaOwnedBy(u)||p.DOMWalker.parentElement(u))?this.getNodeHierarchy(u):[])[s.length-1];var d={attributes:1===o.nodeType?this.getAttributes(o):{},bounds:this.getBounds(o),namespace:this.getNamespace(),node:o,role:this.getRole(o)||null,rolePath:"",roleCount:{},childrenCanHaveRole:!0};i.childrenCanHaveRole?d.childrenCanHaveRole=i.childrenCanHaveRole&&this.childrenCanHaveRole(o,d.role):d.role=null,null!==d.role?(i.roleCount[d.role]=(i.roleCount[d.role]||0)+1,d.rolePath=i.rolePath+"/"+d.role+"["+i.roleCount[d.role]+"]"):d.rolePath=i.rolePath,a=[];for(var c=0,h=s;c<h.length;c++)l=h[c],a.push(l);a.push(d),m.CacheUtil.setCache(o,"ARIAMapper::getNodeHierarchy",a)}return a},t.prototype.reset=function(e){t.nameComputationId=0,this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var i,a=e;i=p.DOMWalker.parentNode(a);)a=i;var n=new c.ARIAWalker(a,!1,a);do{1===n.node.nodeType&&this.getNodeHierarchy(n.node)}while(n.nextNode())},t.prototype.openScope=function(e){null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e);for(var t=0;t<this.hierarchyResults.length;++t)this.hierarchyResults[t].role&&"/"===this.hierarchyResults[t].role[0]&&(this.hierarchyResults[t].role=this.hierarchyResults[t].role?this.hierarchyResults[t].role.substring(1):null);return this.hierarchyResults},t.prototype.pushHierarchy=function(e){var t,i=(t=this.getNodeHierarchy(e))[t.length-1];this.hierarchyRole.push(i.role),null!==i.role&&this.hierarchyPath.push(i),this.hierarchyResults=t},t.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}if(t.length>0){t[t.length-1].role="/"+t[t.length-1].role;var r=p.DOMWalker.parentElement(e);this.hierarchyResults=r?m.CacheUtil.getCache(r,"ARIAMapper::getNodeInfo",[]):[]}return t},t.nodeToRole=function(e){if(3===e.nodeType)return"text";if(1!==e.nodeType)return null;var t=e;if(!t||1!==t.nodeType)return null;if(t.hasAttribute("role")&&t.getAttribute("role").trim().length>0)for(var i=0,a=t.getAttribute("role").trim().split(" ");i<a.length;i++){var n=a[i];if("presentation"===n||"none"===n){if(!s.CommonUtil.isFocusable(t))return null}else if(n in r.ARIADefinitions.designPatterns)return n}var l=u.AriaUtil.getImplicitRole(t),o=l&&0!==l.length?l[0]:null;return"presentation"===o||"none"===o?null:o},t.elemAttrValueCalculators={global:{name:function(e){var t;return null===(t=h.AccNameUtil.computeAccessibleName(e))||void 0===t?void 0:t.name}},datalist:{multiselectable:function(e){var t=e.getAttribute("id");return t&&t.length>0?(e.ownerDocument.querySelector("input[list='"+t+"']"),""+(e.getAttribute("multiple")&&("true"==e.getAttribute("multiple")||""==e.getAttribute("multiple")))):null}},h1:{level:"1"},h2:{level:"2"},h3:{level:"3"},h4:{level:"4"},h5:{level:"5"},h6:{level:"6"},input:{checked:function(e){var t=e.getAttribute("type");return"checkbox"===t||"radio"===t?""+e.checked:null},setsize:function(e){return null},posinset:function(e){return null},owns:function(e){return null}},keygen:{multiselectable:"false"},li:{setsize:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::otherlis",function(){return t.querySelectorAll("ol li, ul li, menu li")});return""+(i.length-a.length)},posinset:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;for(var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=0,n=0;n<i.length;++n){var r=i[n];if(o.DOMUtil.sameNode(t,o.DOMUtil.getAncestor(r,["ol","ul","menu"])))return""+a;++a}return null}},menuitem:{checked:function(e){return""+!(!e.getAttribute("checked")||"true"!=e.getAttribute("checked")&&""!=e.getAttribute("checked"))}},option:{selected:function(e){return""+!(!e.getAttribute("selected")||"true"!=e.getAttribute("selected")&&""!=e.getAttribute("selected"))}},progress:{valuemax:function(e){return e.getAttribute("max")||"1"},valuemin:function(e){return"0"},valuenow:function(e){return e.getAttribute("value")}}},t.textAttrValueCalculators={name:function(e){return e.nodeValue}},t.nameComputationId=0,t}(l.CommonMapper);t.ARIAMapper=g},1560(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAWalker=void 0;var a=i(5279),n=i(9955),r=i(3946),l=i(3864),o=function(){function e(e,t,i){this.root=i||e,9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,this.bEndTag=null!=t&&1==t}return e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var e=!1;do{if(e=!1,this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var t=this.node.slotOwner,i=this.node.slotIndex+1;i<t.assignedNodes().length?(this.node=t.assignedNodes()[i],this.bEndTag=!1):(this.node=t,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(l.DOMWalker.nextSiblingNotOwnedBySlot(this.node))this.node=l.DOMWalker.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var o=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var s=o.indexOf(this.node.getAttribute("id"));s===o.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[s+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!0}}else{var u=this.node,d=this.node,c=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&r.VisUtil.isNodeVisible(u)&&u.contentDocument&&u.contentDocument.documentElement){var m=this.node;this.node=u.contentDocument.documentElement,this.node.ownerElement=m}else 1===this.node.nodeType&&r.VisUtil.isNodeVisible(d)&&d.shadowRoot&&d.shadowRoot.firstChild?(m=this.node,this.node=d.shadowRoot,this.node.ownerElement=m,l.DOMWalker.assignSlots(this.node)):1===this.node.nodeType&&"slot"===d.nodeName.toLowerCase()&&c.assignedNodes().length>0?this.node=c.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!l.DOMWalker.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=l.DOMWalker.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e.prototype.prevNode=function(){var e=!1;do{if(e=!1,this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&r.VisUtil.isNodeVisible(t)&&t.contentDocument&&t.contentDocument.documentElement){var o=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=o}else 1===this.node.nodeType&&r.VisUtil.isNodeVisible(i)&&i.shadowRoot&&i.shadowRoot.lastChild?(o=this.node,this.node=i.shadowRoot,this.node.ownerElement=o,l.DOMWalker.assignSlots(this.node)):1!==this.node.nodeType&&11!==this.node.nodeType||!l.DOMWalker.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=l.DOMWalker.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(l.DOMWalker.previousSiblingNotOwnedBySlot(this.node))this.node=l.DOMWalker.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var s=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var u=s.indexOf(this.node.getAttribute("id"));u===s.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[u+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e}();t.ARIAWalker=o},6858(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AncestorUtil=void 0;var i=function(){function e(){}return e.isPresentationFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase()&&("presentation"===i.getAttribute("role")||"true"===i.getAttribute("aria-hidden")))return!0}return!1},e.isFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase())return!0}return!1},e}();t.AncestorUtil=i},5279(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FragmentUtil=void 0;var i=function(){function e(){}return e.getOwnerFragment=function(e){for(var t=e;t.parentNode&&(t=t.parentNode);)if(11===t.nodeType)return t;return e.ownerDocument},e.getById=function(e,t){return this.getOwnerFragment(e).getElementById(t)},e.getAncestor=function(e,t){var i=e.dom.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e.getAncestorWithRole=function(e,t){var i=e.aria.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e}();t.FragmentUtil=i},1043(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LangUtil=void 0;var i=[["aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","aaa","aab","aac","aad","aae","aaf","aag","aah","aai","aak","aal","aam","aan","aao","aap","aaq","aas","aat","aau","aav","aaw","aax","aaz","aba","abb","abc","abd","abe","abf","abg","abh","abi","abj","abl","abm","abn","abo","abp","abq","abr","abs","abt","abu","abv","abw","abx","aby","abz","aca","acb","acd","ace","acf","ach","aci","ack","acl","acm","acn","acp","acq","acr","acs","act","acu","acv","acw","acx","acy","acz","ada","adb","add","ade","adf","adg","adh","adi","adj","adl","adn","ado","adp","adq","adr","ads","adt","adu","adw","adx","ady","adz","aea","aeb","aec","aed","aee","aek","ael","aem","aen","aeq","aer","aes","aeu","aew","aey","aez","afa","afb","afd","afe","afg","afh","afi","afk","afn","afo","afp","afs","aft","afu","afz","aga","agb","agc","agd","age","agf","agg","agh","agi","agj","agk","agl","agm","agn","ago","agp","agq","agr","ags","agt","agu","agv","agw","agx","agy","agz","aha","ahb","ahg","ahh","ahi","ahk","ahl","ahm","ahn","aho","ahp","ahr","ahs","aht","aia","aib","aic","aid","aie","aif","aig","aih","aii","aij","aik","ail","aim","ain","aio","aip","aiq","air","ais","ait","aiw","aix","aiy","aja","ajg","aji","ajn","ajp","ajt","aju","ajw","ajz","akb","akc","akd","ake","akf","akg","akh","aki","akj","akk","akl","akm","ako","akp","akq","akr","aks","akt","aku","akv","akw","akx","aky","akz","ala","alc","ald","ale","alf","alg","alh","ali","alj","alk","all","alm","aln","alo","alp","alq","alr","als","alt","alu","alv","alw","alx","aly","alz","ama","amb","amc","ame","amf","amg","ami","amj","amk","aml","amm","amn","amo","amp","amq","amr","ams","amt","amu","amv","amw","amx","amy","amz","ana","anb","anc","and","ane","anf","ang","anh","ani","anj","ank","anl","anm","ann","ano","anp","anq","anr","ans","ant","anu","anv","anw","anx","any","anz","aoa","aob","aoc","aod","aoe","aof","aog","aoh","aoi","aoj","aok","aol","aom","aon","aor","aos","aot","aou","aox","aoz","apa","apb","apc","apd","ape","apf","apg","aph","api","apj","apk","apl","apm","apn","apo","app","apq","apr","aps","apt","apu","apv","apw","apx","apy","apz","aqa","aqc","aqd","aqg","aqk","aql","aqm","aqn","aqp","aqr","aqt","aqz","arb","arc","ard","are","arh","ari","arj","ark","arl","arn","aro","arp","arq","arr","ars","art","aru","arv","arw","arx","ary","arz","asa","asb","asc","asd","ase","asf","asg","ash","asi","asj","ask","asl","asn","aso","asp","asq","asr","ass","ast","asu","asv","asw","asx","asy","asz","ata","atb","atc","atd","ate","atg","ath","ati","atj","atk","atl","atm","atn","ato","atp","atq","atr","ats","att","atu","atv","atw","atx","aty","atz","aua","aub","auc","aud","aue","auf","aug","auh","aui","auj","auk","aul","aum","aun","auo","aup","auq","aur","aus","aut","auu","auw","aux","auy","auz","avb","avd","avi","avk","avl","avm","avn","avo","avs","avt","avu","avv","awa","awb","awc","awd","awe","awg","awh","awi","awk","awm","awn","awo","awr","aws","awt","awu","awv","aww","awx","awy","axb","axe","axg","axk","axl","axm","axx","aya","ayb","ayc","ayd","aye","ayg","ayh","ayi","ayk","ayl","ayn","ayo","ayp","ayq","ayr","ays","ayt","ayu","ayx","ayy","ayz","aza","azb","azc","azd","azg","azj","azm","azn","azo","azt","azz"],["ba","be","bg","bh","bi","bm","bn","bo","br","bs","baa","bab","bac","bad","bae","baf","bag","bah","bai","baj","bal","ban","bao","bap","bar","bas","bat","bau","bav","baw","bax","bay","baz","bba","bbb","bbc","bbd","bbe","bbf","bbg","bbh","bbi","bbj","bbk","bbl","bbm","bbn","bbo","bbp","bbq","bbr","bbs","bbt","bbu","bbv","bbw","bbx","bby","bbz","bca","bcb","bcc","bcd","bce","bcf","bcg","bch","bci","bcj","bck","bcl","bcm","bcn","bco","bcp","bcq","bcr","bcs","bct","bcu","bcv","bcw","bcy","bcz","bda","bdb","bdc","bdd","bde","bdf","bdg","bdh","bdi","bdj","bdk","bdl","bdm","bdn","bdo","bdp","bdq","bdr","bds","bdt","bdu","bdv","bdw","bdx","bdy","bdz","bea","beb","bec","bed","bee","bef","beg","beh","bei","bej","bek","bem","beo","bep","beq","ber","bes","bet","beu","bev","bew","bex","bey","bez","bfa","bfb","bfc","bfd","bfe","bff","bfg","bfh","bfi","bfj","bfk","bfl","bfm","bfn","bfo","bfp","bfq","bfr","bfs","bft","bfu","bfw","bfx","bfy","bfz","bga","bgb","bgc","bgd","bge","bgf","bgg","bgi","bgj","bgk","bgl","bgm","bgn","bgo","bgp","bgq","bgr","bgs","bgt","bgu","bgv","bgw","bgx","bgy","bgz","bha","bhb","bhc","bhd","bhe","bhf","bhg","bhh","bhi","bhj","bhk","bhl","bhm","bhn","bho","bhp","bhq","bhr","bhs","bht","bhu","bhv","bhw","bhx","bhy","bhz","bia","bib","bic","bid","bie","bif","big","bij","bik","bil","bim","bin","bio","bip","biq","bir","bit","biu","biv","biw","bix","biy","biz","bja","bjb","bjc","bjd","bje","bjf","bjg","bjh","bji","bjj","bjk","bjl","bjm","bjn","bjo","bjp","bjq","bjr","bjs","bjt","bju","bjv","bjw","bjx","bjy","bjz","bka","bkb","bkc","bkd","bkf","bkg","bkh","bki","bkj","bkk","bkl","bkm","bkn","bko","bkp","bkq","bkr","bks","bkt","bku","bkv","bkw","bkx","bky","bkz","bla","blb","blc","bld","ble","blf","blg","blh","bli","blj","blk","bll","blm","bln","blo","blp","blq","blr","bls","blt","blv","blw","blx","bly","blz","bma","bmb","bmc","bmd","bme","bmf","bmg","bmh","bmi","bmj","bmk","bml","bmm","bmn","bmo","bmp","bmq","bmr","bms","bmt","bmu","bmv","bmw","bmx","bmy","bmz","bna","bnb","bnc","bnd","bne","bnf","bng","bni","bnj","bnk","bnl","bnm","bnn","bno","bnp","bnq","bnr","bns","bnt","bnu","bnv","bnw","bnx","bny","bnz","boa","bob","boe","bof","bog","boh","boi","boj","bok","bol","bom","bon","boo","bop","boq","bor","bot","bou","bov","bow","box","boy","boz","bpa","bpb","bpd","bpe","bpg","bph","bpi","bpj","bpk","bpl","bpm","bpn","bpo","bpp","bpq","bpr","bps","bpt","bpu","bpv","bpw","bpx","bpy","bpz","bqa","bqb","bqc","bqd","bqf","bqg","bqh","bqi","bqj","bqk","bql","bqm","bqn","bqo","bqp","bqq","bqr","bqs","bqt","bqu","bqv","bqw","bqx","bqy","bqz","bra","brb","brc","brd","brf","brg","brh","bri","brj","brk","brl","brm","brn","bro","brp","brq","brr","brs","brt","bru","brv","brw","brx","bry","brz","bsa","bsb","bsc","bse","bsf","bsg","bsh","bsi","bsj","bsk","bsl","bsm","bsn","bso","bsp","bsq","bsr","bss","bst","bsu","bsv","bsw","bsx","bsy","bta","btb","btc","btd","bte","btf","btg","bth","bti","btj","btk","btl","btm","btn","bto","btp","btq","btr","bts","btt","btu","btv","btw","btx","bty","btz","bua","bub","buc","bud","bue","buf","bug","buh","bui","buj","buk","bum","bun","buo","bup","buq","bus","but","buu","buv","buw","bux","buy","buz","bva","bvb","bvc","bvd","bve","bvf","bvg","bvh","bvi","bvj","bvk","bvl","bvm","bvn","bvo","bvp","bvq","bvr","bvt","bvu","bvv","bvw","bvx","bvy","bvz","bwa","bwb","bwc","bwd","bwe","bwf","bwg","bwh","bwi","bwj","bwk","bwl","bwm","bwn","bwo","bwp","bwq","bwr","bws","bwt","bwu","bww","bwx","bwy","bwz","bxa","bxb","bxc","bxd","bxe","bxf","bxg","bxh","bxi","bxj","bxk","bxl","bxm","bxn","bxo","bxp","bxq","bxr","bxs","bxu","bxv","bxw","bxx","bxz","bya","byb","byc","byd","bye","byf","byg","byh","byi","byj","byk","byl","bym","byn","byo","byp","byq","byr","bys","byt","byv","byw","byx","byy","byz","bza","bzb","bzc","bzd","bze","bzf","bzg","bzh","bzi","bzj","bzk","bzl","bzm","bzn","bzo","bzp","bzq","bzr","bzs","bzt","bzu","bzv","bzw","bzx","bzy","bzz"],["ca","ce","ch","co","cr","cs","cu","cv","cy","caa","cab","cac","cad","cae","caf","cag","cah","cai","caj","cak","cal","cam","can","cao","cap","caq","car","cas","cau","cav","caw","cax","cay","caz","cba","cbb","cbc","cbd","cbe","cbg","cbh","cbi","cbj","cbk","cbl","cbn","cbo","cbq","cbr","cbs","cbt","cbu","cbv","cbw","cby","cca","ccc","ccd","cce","ccg","cch","ccj","ccl","ccm","ccn","cco","ccp","ccq","ccr","ccs","cda","cdc","cdd","cde","cdf","cdg","cdh","cdi","cdj","cdm","cdn","cdo","cdr","cds","cdy","cdz","cea","ceb","ceg","cek","cel","cen","cet","cey","cfa","cfd","cfg","cfm","cga","cgc","cgg","cgk","chb","chc","chd","chf","chg","chh","chj","chk","chl","chm","chn","cho","chp","chq","chr","cht","chw","chx","chy","chz","cia","cib","cic","cid","cie","cih","cik","cim","cin","cip","cir","ciw","ciy","cja","cje","cjh","cji","cjk","cjm","cjn","cjo","cjp","cjr","cjs","cjv","cjy","cka","ckb","ckh","ckl","ckm","ckn","cko","ckq","ckr","cks","ckt","cku","ckv","ckx","cky","ckz","cla","clc","cld","cle","clh","cli","clj","clk","cll","clm","clo","clt","clu","clw","cly","cma","cmc","cme","cmg","cmi","cmk","cml","cmm","cmn","cmo","cmr","cms","cmt","cna","cnb","cnc","cng","cnh","cni","cnk","cnl","cno","cnp","cnr","cns","cnt","cnu","cnw","cnx","coa","cob","coc","cod","coe","cof","cog","coh","coj","cok","col","com","con","coo","cop","coq","cot","cou","cov","cow","cox","coy","coz","cpa","cpb","cpc","cpe","cpf","cpg","cpi","cpn","cpo","cpp","cps","cpu","cpx","cpy","cqd","cqu","cra","crb","crc","crd","crf","crg","crh","cri","crj","crk","crl","crm","crn","cro","crp","crq","crr","crs","crt","crv","crw","crx","cry","crz","csa","csb","csc","csd","cse","csf","csg","csh","csi","csj","csk","csl","csm","csn","cso","csp","csq","csr","css","cst","csu","csv","csw","csx","csy","csz","cta","ctc","ctd","cte","ctg","cth","ctl","ctm","ctn","cto","ctp","cts","ctt","ctu","cty","ctz","cua","cub","cuc","cug","cuh","cui","cuj","cuk","cul","cum","cuo","cup","cuq","cur","cus","cut","cuu","cuv","cuw","cux","cuy","cvg","cvn","cwa","cwb","cwd","cwe","cwg","cwt","cya","cyb","cyo","czh","czk","czn","czo","czt"],["da","de","dv","dz","daa","dac","dad","dae","daf","dag","dah","dai","daj","dak","dal","dam","dao","dap","daq","dar","das","dau","dav","daw","dax","day","daz","dba","dbb","dbd","dbe","dbf","dbg","dbi","dbj","dbl","dbm","dbn","dbo","dbp","dbq","dbr","dbt","dbu","dbv","dbw","dby","dcc","dcr","dda","ddd","dde","ddg","ddi","ddj","ddn","ddo","ddr","dds","ddw","dec","ded","dee","def","deg","deh","dei","dek","del","dem","den","dep","deq","der","des","dev","dez","dga","dgb","dgc","dgd","dge","dgg","dgh","dgi","dgk","dgl","dgn","dgo","dgr","dgs","dgt","dgu","dgw","dgx","dgz","dha","dhd","dhg","dhi","dhl","dhm","dhn","dho","dhr","dhs","dhu","dhv","dhw","dhx","dia","dib","dic","did","dif","dig","dih","dii","dij","dik","dil","dim","din","dio","dip","diq","dir","dis","dit","diu","diw","dix","diy","diz","dja","djb","djc","djd","dje","djf","dji","djj","djk","djl","djm","djn","djo","djr","dju","djw","dka","dkg","dkk","dkl","dkr","dks","dkx","dlg","dlk","dlm","dln","dma","dmb","dmc","dmd","dme","dmf","dmg","dmk","dml","dmm","dmn","dmo","dmr","dms","dmu","dmv","dmw","dmx","dmy","dna","dnd","dne","dng","dni","dnj","dnk","dnn","dno","dnr","dnt","dnu","dnv","dnw","dny","doa","dob","doc","doe","dof","doh","doi","dok","dol","don","doo","dop","doq","dor","dos","dot","dov","dow","dox","doy","doz","dpp","dra","drb","drc","drd","dre","drg","drh","dri","drl","drn","dro","drq","drr","drs","drt","dru","drw","dry","dsb","dse","dsh","dsi","dsl","dsn","dso","dsq","dta","dtb","dtd","dth","dti","dtk","dtm","dtn","dto","dtp","dtr","dts","dtt","dtu","dty","dua","dub","duc","dud","due","duf","dug","duh","dui","duj","duk","dul","dum","dun","duo","dup","duq","dur","dus","duu","duv","duw","dux","duy","duz","dva","dwa","dwk","dwl","dwr","dws","dwu","dww","dwy","dwz","dya","dyb","dyd","dyg","dyi","dym","dyn","dyo","dyu","dyy","dza","dzd","dze","dzg","dzl","dzn"],["ee","el","en","eo","es","et","eu","eaa","ebc","ebg","ebk","ebo","ebr","ebu","ecr","ecs","ecy","eee","efa","efe","efi","ega","egl","ego","egx","egy","ehs","ehu","eip","eit","eiv","eja","eka","ekc","eke","ekg","eki","ekk","ekl","ekm","eko","ekp","ekr","eky","ele","elh","eli","elk","elm","elo","elp","elu","elx","ema","emb","eme","emg","emi","emk","emm","emn","emo","emp","emq","ems","emu","emw","emx","emy","emz","ena","enb","enc","end","enf","enh","enl","enm","enn","eno","enq","enr","enu","env","enw","enx","eot","epi","era","erg","erh","eri","erk","ero","err","ers","ert","erw","ese","esg","esh","esi","esk","esl","esm","esn","eso","esq","ess","esu","esx","esy","etb","etc","eth","etn","eto","etr","ets","ett","etu","etx","etz","euq","eve","evh","evn","ewo","ext","eya","eyo","eza","eze"],["fa","ff","fi","fj","fo","fr","fy","faa","fab","fad","faf","fag","fah","fai","faj","fak","fal","fam","fan","fap","far","fat","fau","fax","fay","faz","fbl","fcs","fer","ffi","ffm","fgr","fia","fie","fif","fil","fip","fir","fit","fiu","fiw","fkk","fkv","fla","flh","fli","fll","fln","flr","fly","fmp","fmu","fnb","fng","fni","fod","foi","fom","fon","for","fos","fox","fpe","fqs","frc","frd","frk","frm","fro","frp","frq","frr","frs","frt","fse","fsl","fss","fub","fuc","fud","fue","fuf","fuh","fui","fuj","fum","fun","fuq","fur","fut","fuu","fuv","fuy","fvr","fwa","fwe"],["ga","gd","gl","gn","gu","gv","gaa","gab","gac","gad","gae","gaf","gag","gah","gai","gaj","gak","gal","gam","gan","gao","gap","gaq","gar","gas","gat","gau","gav","gaw","gax","gay","gaz","gba","gbb","gbc","gbd","gbe","gbf","gbg","gbh","gbi","gbj","gbk","gbl","gbm","gbn","gbo","gbp","gbq","gbr","gbs","gbu","gbv","gbw","gbx","gby","gbz","gcc","gcd","gce","gcf","gcl","gcn","gcr","gct","gda","gdb","gdc","gdd","gde","gdf","gdg","gdh","gdi","gdj","gdk","gdl","gdm","gdn","gdo","gdq","gdr","gds","gdt","gdu","gdx","gea","geb","gec","ged","gef","geg","geh","gei","gej","gek","gel","gem","geq","ges","gev","gew","gex","gey","gez","gfk","gft","gfx","gga","ggb","ggd","gge","ggg","ggk","ggl","ggn","ggo","ggr","ggt","ggu","ggw","gha","ghc","ghe","ghh","ghk","ghl","ghn","gho","ghr","ghs","ght","gia","gib","gic","gid","gie","gig","gih","gii","gil","gim","gin","gio","gip","giq","gir","gis","git","giu","giw","gix","giy","giz","gji","gjk","gjm","gjn","gjr","gju","gka","gkd","gke","gkn","gko","gkp","gku","glb","glc","gld","glh","gli","glj","glk","gll","glo","glr","glu","glw","gly","gma","gmb","gmd","gme","gmg","gmh","gml","gmm","gmn","gmq","gmr","gmu","gmv","gmw","gmx","gmy","gmz","gna","gnb","gnc","gnd","gne","gng","gnh","gni","gnj","gnk","gnl","gnm","gnn","gno","gnq","gnr","gnt","gnu","gnw","gnz","goa","gob","goc","god","goe","gof","gog","goh","goi","goj","gok","gol","gom","gon","goo","gop","goq","gor","gos","got","gou","gow","gox","goy","goz","gpa","gpe","gpn","gqa","gqi","gqn","gqr","gqu","gra","grb","grc","grd","grg","grh","gri","grj","grk","grm","gro","grq","grr","grs","grt","gru","grv","grw","grx","gry","grz","gse","gsg","gsl","gsm","gsn","gso","gsp","gss","gsw","gta","gti","gtu","gua","gub","guc","gud","gue","guf","gug","guh","gui","guk","gul","gum","gun","guo","gup","guq","gur","gus","gut","guu","guv","guw","gux","guz","gva","gvc","gve","gvf","gvj","gvl","gvm","gvn","gvo","gvp","gvr","gvs","gvy","gwa","gwb","gwc","gwd","gwe","gwf","gwg","gwi","gwj","gwm","gwn","gwr","gwt","gwu","gww","gwx","gxx","gya","gyb","gyd","gye","gyf","gyg","gyi","gyl","gym","gyn","gyo","gyr","gyy","gyz","gza","gzi","gzn"],["ha","he","hi","ho","hr","ht","hu","hy","hz","haa","hab","hac","had","hae","haf","hag","hah","hai","haj","hak","hal","ham","han","hao","hap","haq","har","has","hav","haw","hax","hay","haz","hba","hbb","hbn","hbo","hbu","hca","hch","hdn","hds","hdy","hea","hed","heg","heh","hei","hem","hgm","hgw","hhi","hhr","hhy","hia","hib","hid","hif","hig","hih","hii","hij","hik","hil","him","hio","hir","hit","hiw","hix","hji","hka","hke","hkh","hkk","hkn","hks","hla","hlb","hld","hle","hlt","hlu","hma","hmb","hmc","hmd","hme","hmf","hmg","hmh","hmi","hmj","hmk","hml","hmm","hmn","hmp","hmq","hmr","hms","hmt","hmu","hmv","hmw","hmx","hmy","hmz","hna","hnd","hne","hng","hnh","hni","hnj","hnn","hno","hns","hnu","hoa","hob","hoc","hod","hoe","hoh","hoi","hoj","hok","hol","hom","hoo","hop","hor","hos","hot","hov","how","hoy","hoz","hpo","hps","hra","hrc","hre","hrk","hrm","hro","hrp","hrr","hrt","hru","hrw","hrx","hrz","hsb","hsh","hsl","hsn","hss","hti","hto","hts","htu","htx","hub","huc","hud","hue","huf","hug","huh","hui","huj","huk","hul","hum","huo","hup","huq","hur","hus","hut","huu","huv","huw","hux","huy","huz","hvc","hve","hvk","hvn","hvv","hwa","hwc","hwo","hya","hyw","hyx"],["ia","id","ie","ig","ii","ik","in","io","is","it","iu","iw","iai","ian","iap","iar","iba","ibb","ibd","ibe","ibg","ibh","ibi","ibl","ibm","ibn","ibr","ibu","iby","ica","ich","icl","icr","ida","idb","idc","idd","ide","idi","idr","ids","idt","idu","ifa","ifb","ife","iff","ifk","ifm","ifu","ify","igb","ige","igg","igl","igm","ign","igo","igs","igw","ihb","ihi","ihp","ihw","iin","iir","ijc","ije","ijj","ijn","ijo","ijs","ike","iki","ikk","ikl","iko","ikp","ikr","iks","ikt","ikv","ikw","ikx","ikz","ila","ilb","ilg","ili","ilk","ill","ilm","ilo","ilp","ils","ilu","ilv","ilw","ima","ime","imi","iml","imn","imo","imr","ims","imy","inb","inc","ine","ing","inh","inj","inl","inm","inn","ino","inp","ins","int","inz","ior","iou","iow","ipi","ipo","iqu","iqw","ira","ire","irh","iri","irk","irn","iro","irr","iru","irx","iry","isa","isc","isd","ise","isg","ish","isi","isk","ism","isn","iso","isr","ist","isu","itb","itc","itd","ite","iti","itk","itl","itm","ito","itr","its","itt","itv","itw","itx","ity","itz","ium","ivb","ivv","iwk","iwm","iwo","iws","ixc","ixl","iya","iyo","iyx","izh","izi","izr","izz"],["ja","ji","jv","jw","jaa","jab","jac","jad","jae","jaf","jah","jaj","jak","jal","jam","jan","jao","jaq","jar","jas","jat","jau","jax","jay","jaz","jbe","jbi","jbj","jbk","jbm","jbn","jbo","jbr","jbt","jbu","jbw","jcs","jct","jda","jdg","jdt","jeb","jee","jeg","jeh","jei","jek","jel","jen","jer","jet","jeu","jgb","jge","jgk","jgo","jhi","jhs","jia","jib","jic","jid","jie","jig","jih","jii","jil","jim","jio","jiq","jit","jiu","jiv","jiy","jje","jjr","jka","jkm","jko","jkp","jkr","jks","jku","jle","jls","jma","jmb","jmc","jmd","jmi","jml","jmn","jmr","jms","jmw","jmx","jna","jnd","jng","jni","jnj","jnl","jns","job","jod","jog","jor","jos","jow","jpa","jpr","jpx","jqr","jra","jrb","jrr","jrt","jru","jsl","jua","jub","juc","jud","juh","jui","juk","jul","jum","jun","juo","jup","jur","jus","jut","juu","juw","juy","jvd","jvn","jwi","jya","jye","jyy"],["ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","kaa","kab","kac","kad","kae","kaf","kag","kah","kai","kaj","kak","kam","kao","kap","kaq","kar","kav","kaw","kax","kay","kba","kbb","kbc","kbd","kbe","kbf","kbg","kbh","kbi","kbj","kbk","kbl","kbm","kbn","kbo","kbp","kbq","kbr","kbs","kbt","kbu","kbv","kbw","kbx","kby","kbz","kca","kcb","kcc","kcd","kce","kcf","kcg","kch","kci","kcj","kck","kcl","kcm","kcn","kco","kcp","kcq","kcr","kcs","kct","kcu","kcv","kcw","kcx","kcy","kcz","kda","kdc","kdd","kde","kdf","kdg","kdh","kdi","kdj","kdk","kdl","kdm","kdn","kdo","kdp","kdq","kdr","kdt","kdu","kdv","kdw","kdx","kdy","kdz","kea","keb","kec","ked","kee","kef","keg","keh","kei","kej","kek","kel","kem","ken","keo","kep","keq","ker","kes","ket","keu","kev","kew","kex","key","kez","kfa","kfb","kfc","kfd","kfe","kff","kfg","kfh","kfi","kfj","kfk","kfl","kfm","kfn","kfo","kfp","kfq","kfr","kfs","kft","kfu","kfv","kfw","kfx","kfy","kfz","kga","kgb","kgc","kgd","kge","kgf","kgg","kgh","kgi","kgj","kgk","kgl","kgm","kgn","kgo","kgp","kgq","kgr","kgs","kgt","kgu","kgv","kgw","kgx","kgy","kha","lyg","khb","khc","khd","khe","khf","khg","khh","khi","khj","khk","khl","khn","kho","khp","khq","khr","khs","kht","khu","khv","khw","khx","khy","khz","kia","kib","kic","kid","kie","kif","kig","kih","kii","kij","kil","kim","kio","kip","kiq","kis","kit","kiu","kiv","kiw","kix","kiy","kiz","kja","kjb","kjc","kjd","kje","kjf","kjg","kjh","kji","kjj","kjk","kjl","kjm","kjn","kjo","kjp","kjq","kjr","kjs","kjt","kju","kjv","kjx","kjy","kjz","kka","kkb","kkc","kkd","kke","kkf","kkg","kkh","kki","kkj","kkk","kkl","kkm","kkn","kko","kkp","kkq","kkr","kks","kkt","kku","kkv","kkw","kkx","kky","kkz","kla","klb","klc","kld","kle","klf","klg","klh","kli","klj","klk","kll","klm","kln","klo","klp","klq","klr","kls","klt","klu","klv","klw","klx","kly","klz","kma","kmb","kmc","kmd","kme","kmf","kmg","kmh","kmi","kmj","kmk","kml","kmm","kmn","kmo","kmp","kmq","kmr","kms","kmt","kmu","kmv","kmw","kmx","kmy","kmz","kna","knb","knc","knd","kne","knf","kng","kni","knj","knk","knl","knm","knn","kno","knp","knq","knr","kns","knt","knu","knv","knw","knx","kny","knz","koa","koc","kod","koe","kof","kog","koh","koi","koj","kok","kol","koo","kop","koq","kos","kot","kou","kov","kow","kox","koy","koz","kpa","kpb","kpc","kpd","kpe","kpf","kpg","kph","kpi","kpj","kpk","kpl","kpm","kpn","kpo","kpp","kpq","kpr","kps","kpt","kpu","kpv","kpw","kpx","kpy","kpz","kqa","kqb","kqc","kqd","kqe","kqf","kqg","kqh","kqi","kqj","kqk","kql","kqm","kqn","kqo","kqp","kqq","kqr","kqs","kqt","kqu","kqv","kqw","kqx","kqy","kqz","kra","krb","krc","krd","kre","krf","krh","kri","krj","krk","krl","krm","krn","kro","krp","krr","krs","krt","kru","krv","krw","krx","kry","krz","ksa","ksb","ksc","ksd","kse","ksf","ksg","ksh","ksi","ksj","ksk","ksl","ksm","ksn","kso","ksp","ksq","ksr","kss","kst","ksu","ksv","ksw","ksx","ksy","ksz","kta","ktb","ktc","ktd","kte","ktf","ktg","kth","kti","ktj","ktk","ktl","ktm","ktn","kto","ktp","ktq","ktr","kts","ktt","ktu","ktv","ktw","ktx","kty","ktz","kub","kuc","kud","kue","kuf","kug","kuh","kui","kuj","kuk","kul","kum","kun","kuo","kup","kuq","kus","kut","kuu","kuv","kuw","kux","kuy","kuz","kva","kvb","kvc","kvd","kve","kvf","kvg","kvh","kvi","kvj","kvk","kvl","kvm","kvn","kvo","kvp","kvq","kvr","kvs","kvt","kvu","kvv","kvw","kvx","kvy","kvz","kwa","kwb","kwc","kwd","kwe","kwf","kwg","kwh","kwi","kwj","kwk","kwl","kwm","kwn","kwo","kwp","kwq","kwr","kws","kwt","kwu","kwv","kww","kwx","kwy","kwz","kxa","kxb","kxc","kxd","kxe","kxf","kxh","kxi","kxj","kxk","kxl","kxm","kxn","kxo","kxp","kxq","kxr","kxs","kxt","kxu","kxv","kxw","kxx","kxy","kxz","kya","kyb","kyc","kyd","kye","kyf","kyg","kyh","kyi","kyj","kyk","kyl","kym","kyn","kyo","kyp","kyq","kyr","kys","kyt","kyu","kyv","kyw","kyx","kyy","kyz","kza","kzb","kzc","kzd","kze","kzf","kzg","kzh","kzi","kzj","kzk","kzl","kzm","kzn","kzo","kzp","kzq","kzr","kzs","kzt","kzu","kzv","kzw","kzx","kzy","kzz"],["la","lb","lg","li","ln","lo","lt","lu","lv","laa","lab","lac","lad","lae","laf","lag","lah","lai","laj","lak","lal","lam","lan","lap","laq","lar","las","lau","law","lax","lay","laz","lba","lbb","lbc","lbe","lbf","lbg","lbi","lbj","lbk","lbl","lbm","lbn","lbo","lbq","lbr","lbs","lbt","lbu","lbv","lbw","lbx","lby","lbz","lcc","lcd","lce","lcf","lch","lcl","lcm","lcp","lcq","lcs","lda","ldb","ldd","ldg","ldh","ldi","ldj","ldk","ldl","ldm","ldn","ldo","ldp","ldq","lea","leb","lec","led","lee","lef","leg","leh","lei","lej","lek","lel","lem","len","leo","lep","leq","ler","les","let","leu","lev","lew","lex","ley","lez","lfa","lfn","lga","lgb","lgg","lgh","lgi","lgk","lgl","lgm","lgn","lgq","lgr","lgt","lgu","lgz","lha","lhh","lhi","lhl","lhm","lhn","lhp","lhs","lht","lhu","lia","lib","lic","lid","lie","lif","lig","lih","lii","lij","lik","lil","lio","lip","liq","lir","lis","liu","liv","liw","lix","liy","liz","lja","lje","lji","ljl","ljp","ljw","ljx","lka","lkb","lkc","lkd","lke","lkh","lki","lkj","lkl","lkm","lkn","lko","lkr","lks","lkt","lku","lky","lla","llb","llc","lld","lle","llf","llg","llh","lli","llj","llk","lll","llm","lln","llo","llp","llq","lls","llu","llx","lma","lmb","lmc","lmd","lme","lmf","lmg","lmh","lmi","lmj","lmk","lml","lmm","lmn","lmo","lmp","lmq","lmr","lmu","lmv","lmw","lmx","lmy","lmz","lna","lnb","lnd","lng","lnh","lni","lnj","lnl","lnm","lnn","lno","lns","lnu","lnw","lnz","loa","lob","loc","loe","lof","log","loh","loi","loj","lok","lol","lom","lon","loo","lop","loq","lor","los","lot","lou","lov","low","lox","loy","loz","lpa","lpe","lpn","lpo","lpx","lra","lrc","lre","lrg","lri","lrk","lrl","lrm","lrn","lro","lrr","lrt","lrv","lrz","lsa","lsb","lsd","lse","lsg","lsh","lsi","lsl","lsm","lsn","lso","lsp","lsr","lss","lst","lsv","lsy","ltc","ltg","lth","lti","ltn","lto","lts","ltu","lua","luc","lud","lue","luf","lui","luj","luk","lul","lum","lun","luo","lup","luq","lur","lus","lut","luu","luv","luw","luy","luz","lva","lvi","lvk","lvs","lvu","lwa","lwe","lwg","lwh","lwl","lwm","lwo","lws","lwt","lwu","lww","lxm","lya","lyg","lyn","lzh","lzl","lzn","lzz"],["mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","maa","mab","mad","mae","maf","mag","mai","maj","mak","mam","man","map","maq","mas","mat","mau","mav","maw","max","maz","mba","mbb","mbc","mbd","mbe","mbf","mbh","mbi","mbj","mbk","mbl","mbm","mbn","mbo","mbp","mbq","mbr","mbs","mbt","mbu","mbv","mbw","mbx","mby","mbz","mca","mcb","mcc","mcd","mce","mcf","mcg","mch","mci","mcj","mck","mcl","mcm","mcn","mco","mcp","mcq","mcr","mcs","mct","mcu","mcv","mcw","mcx","mcy","mcz","mda","mdb","mdc","mdd","mde","mdf","mdg","mdh","mdi","mdj","mdk","mdl","mdm","mdn","mdp","mdq","mdr","mds","mdt","mdu","mdv","mdw","mdx","mdy","mdz","mea","meb","mec","med","mee","mef","meg","meh","mei","mej","mek","mel","mem","men","meo","mep","meq","mer","mes","met","meu","mev","mew","mey","mez","mfa","mfb","mfc","mfd","mfe","mff","mfg","mfh","mfi","mfj","mfk","mfl","mfm","mfn","mfo","mfp","mfq","mfr","mfs","mft","mfu","mfv","mfw","mfx","mfy","mfz","mga","mgb","mgc","mgd","mge","mgf","mgg","mgh","mgi","mgj","mgk","mgl","mgm","mgn","mgo","mgp","mgq","mgr","mgs","mgt","mgu","mgv","mgw","mgx","mgy","mgz","mha","mhb","mhc","mhd","mhe","mhf","mhg","mhh","mhi","mhj","mhk","mhl","mhm","mhn","mho","mhp","mhq","mhr","mhs","mht","mhu","mhw","mhx","mhy","mhz","mia","mib","mic","mid","mie","mif","mig","mih","mii","mij","mik","mil","mim","min","mio","mip","miq","mir","mis","mit","miu","miw","mix","miy","miz","mja","mjb","mjc","mjd","mje","mjg","mjh","mji","mjj","mjk","mjl","mjm","mjn","mjo","mjp","mjq","mjr","mjs","mjt","mju","mjv","mjw","mjx","mjy","mjz","mka","mkb","mkc","mke","mkf","mkg","mkh","mki","mkj","mkk","mkl","mkm","mkn","mko","mkp","mkq","mkr","mks","mkt","mku","mkv","mkw","mkx","mky","mkz","mla","mlb","mlc","mld","mle","mlf","mlh","mli","mlj","mlk","mll","mlm","mln","mlo","mlp","mlq","mlr","mls","mlu","mlv","mlw","mlx","mlz","mma","mmb","mmc","mmd","mme","mmf","mmg","mmh","mmi","mmj","mmk","mml","mmm","mmn","mmo","mmp","mmq","mmr","mmt","mmu","mmv","mmw","mmx","mmy","mmz","mna","mnb","mnc","mnd","mne","mnf","mng","mnh","mni","mnj","mnk","mnl","mnm","mnn","mno","mnp","mnq","mnr","mns","mnt","mnu","mnv","mnw","mnx","mny","mnz","moa","moc","mod","moe","mof","mog","moh","moi","moj","mok","mom","moo","mop","moq","mor","mos","mot","mou","mov","mow","mox","moy","moz","mpa","mpb","mpc","mpd","mpe","mpg","mph","mpi","mpj","mpk","mpl","mpm","mpn","mpo","mpp","mpq","mpr","mps","mpt","mpu","mpv","mpw","mpx","mpy","mpz","mqa","mqb","mqc","mqe","mqf","mqg","mqh","mqi","mqj","mqk","mql","mqm","mqn","mqo","mqp","mqq","mqr","mqs","mqt","mqu","mqv","mqw","mqx","mqy","mqz","mra","mrb","mrc","mrd","mre","mrf","mrg","mrh","mrj","mrk","mrl","mrm","mrn","mro","mrp","mrq","mrr","mrs","mrt","mru","mrv","mrw","mrx","mry","mrz","msb","msc","msd","mse","msf","msg","msh","msi","msj","msk","msl","msm","msn","mso","msp","msq","msr","mss","mst","msu","msv","msw","msx","msy","msz","mta","mtb","mtc","mtd","mte","mtf","mtg","mth","mti","mtj","mtk","mtl","mtm","mtn","mto","mtp","mtq","mtr","mts","mtt","mtu","mtv","mtw","mtx","mty","mua","mub","muc","mud","mue","mug","muh","mui","muj","muk","mul","mum","mun","muo","mup","muq","mur","mus","mut","muu","muv","mux","muy","muz","mva","mvb","mvd","mve","mvf","mvg","mvh","mvi","mvk","mvl","mvm","mvn","mvo","mvp","mvq","mvr","mvs","mvt","mvu","mvv","mvw","mvx","mvy","mvz","mwa","mwb","mwc","mwd","mwe","mwf","mwg","mwh","mwi","mwj","mwk","mwl","mwm","mwn","mwo","mwp","mwq","mwr","mws","mwt","mwu","mwv","mww","mwx","mwy","mwz","mxa","mxb","mxc","mxd","mxe","mxf","mxg","mxh","mxi","mxj","mxk","mxl","mxm","mxn","mxo","mxp","mxq","mxr","mxs","mxt","mxu","mxv","mxw","mxx","mxy","mxz","myb","myc","myd","mye","myf","myg","myh","myi","myj","myk","myl","mym","myn","myo","myp","myq","myr","mys","myt","myu","myv","myw","myx","myy","myz","mza","mzb","mzc","mzd","mze","mzg","mzh","mzi","mzj","mzk","mzl","mzm","mzn","mzo","mzp","mzq","mzr","mzs","mzt","mzu","mzv","mzw","mzx","mzy","mzz"],["na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","naa","nab","nac","nad","nae","naf","nag","nah","nai","naj","nak","nal","nam","nan","nao","nap","naq","nar","nas","nat","naw","nax","nay","naz","nba","nbb","nbc","nbd","nbe","nbf","nbg","nbh","nbi","nbj","nbk","nbm","nbn","nbo","nbp","nbq","nbr","nbs","nbt","nbu","nbv","nbw","nbx","nby","nca","ncb","ncc","ncd","nce","ncf","ncg","nch","nci","ncj","nck","ncl","ncm","ncn","nco","ncp","ncq","ncr","ncs","nct","ncu","ncx","ncz","nda","ndb","ndc","ndd","ndf","ndg","ndh","ndi","ndj","ndk","ndl","ndm","ndn","ndp","ndq","ndr","nds","ndt","ndu","ndv","ndw","ndx","ndy","ndz","nea","neb","nec","ned","nee","nef","neg","neh","nei","nej","nek","nem","nen","neo","neq","ner","nes","net","neu","nev","new","nex","ney","nez","nfa","nfd","nfl","nfr","nfu","nga","ngb","ngc","ngd","nge","ngf","ngg","ngh","ngi","ngj","ngk","ngl","ngm","ngn","ngo","ngp","ngq","ngr","ngs","ngt","ngu","ngv","ngw","ngx","ngy","ngz","nha","nhb","nhc","nhd","nhe","nhf","nhg","nhh","nhi","nhk","nhm","nhn","nho","nhp","nhq","nhr","nht","nhu","nhv","nhw","nhx","nhy","nhz","nia","nib","nic","nid","nie","nif","nig","nih","nii","nij","nik","nil","nim","nin","nio","niq","nir","nis","nit","niu","niv","niw","nix","niy","niz","nja","njb","njd","njh","nji","njj","njl","njm","njn","njo","njr","njs","njt","nju","njx","njy","njz","nka","nkb","nkc","nkd","nke","nkf","nkg","nkh","nki","nkj","nkk","nkm","nkn","nko","nkp","nkq","nkr","nks","nkt","nku","nkv","nkw","nkx","nkz","nla","nlc","nle","nlg","nli","nlj","nlk","nll","nlm","nln","nlo","nlq","nlr","nlu","nlv","nlw","nlx","nly","nlz","nma","nmb","nmc","nmd","nme","nmf","nmg","nmh","nmi","nmj","nmk","nml","nmm","nmn","nmo","nmp","nmq","nmr","nms","nmt","nmu","nmv","nmw","nmx","nmy","nmz","nna","nnb","nnc","nnd","nne","nnf","nng","nnh","nni","nnj","nnk","nnl","nnm","nnn","nnp","nnq","nnr","nns","nnt","nnu","nnv","nnw","nnx","nny","nnz","noa","noc","nod","noe","nof","nog","noh","noi","noj","nok","nol","nom","non","noo","nop","noq","nos","not","nou","nov","now","noy","noz","npa","npb","npg","nph","npi","npl","npn","npo","nps","npu","npx","npy","nqg","nqk","nql","nqm","nqn","nqo","nqq","nqt","nqy","nra","nrb","nrc","nre","nrf","nrg","nri","nrk","nrl","nrm","nrn","nrp","nrr","nrt","nru","nrx","nrz","nsa","nsb","nsc","nsd","nse","nsf","nsg","nsh","nsi","nsk","nsl","nsm","nsn","nso","nsp","nsq","nsr","nss","nst","nsu","nsv","nsw","nsx","nsy","nsz","ntd","nte","ntg","nti","ntj","ntk","ntm","nto","ntp","ntr","nts","ntu","ntw","ntx","nty","ntz","nua","nub","nuc","nud","nue","nuf","nug","nuh","nui","nuj","nuk","nul","num","nun","nuo","nup","nuq","nur","nus","nut","nuu","nuv","nuw","nux","nuy","nuz","nvh","nvm","nvo","nwa","nwb","nwc","nwe","nwg","nwi","nwm","nwo","nwr","nwx","nwy","nxa","nxd","nxe","nxg","nxi","nxk","nxl","nxm","nxn","nxo","nxq","nxr","nxu","nxx","nyb","nyc","nyd","nye","nyf","nyg","nyh","nyi","nyj","nyk","nyl","nym","nyn","nyo","nyp","nyq","nyr","nys","nyt","nyu","nyv","nyw","nyx","nyy","nza","nzb","nzd","nzi","nzk","nzm","nzs","nzu","nzy","nzz"],["oc","oj","om","or","os","oaa","oac","oar","oav","obi","obk","obl","obm","obo","obr","obt","obu","oca","och","ocm","oco","ocu","oda","odk","odt","odu","ofo","ofs","ofu","ogb","ogc","oge","ogg","ogo","ogu","oht","ohu","oia","oin","ojb","ojc","ojg","ojp","ojs","ojv","ojw","oka","okb","okc","okd","oke","okg","okh","oki","okj","okk","okl","okm","okn","oko","okr","oks","oku","okv","okx","okz","ola","old","ole","olk","olm","olo","olr","olt","olu","oma","omb","omc","ome","omg","omi","omk","oml","omn","omo","omp","omq","omr","omt","omu","omv","omw","omx","omy","ona","onb","one","ong","oni","onj","onk","onn","ono","onp","onr","ons","ont","onu","onw","onx","ood","oog","oon","oor","oos","opa","opk","opm","opo","opt","opy","ora","orc","ore","org","orh","orn","oro","orr","ors","ort","oru","orv","orw","orx","ory","orz","osa","osc","osi","osn","oso","osp","ost","osu","osx","ota","otb","otd","ote","oti","otk","otl","otm","otn","oto","otq","otr","ots","ott","otu","otw","otx","oty","otz","oua","oub","oue","oui","oum","oun","ovd","owi","owl","oyb","oyd","oym","oyy","ozm"],["pa","pi","pl","ps","pt","paa","pab","pac","pad","pae","paf","pag","pah","pai","pak","pal","pam","pao","pap","paq","par","pas","pat","pau","pav","paw","pax","pay","paz","pbb","pbc","pbe","pbf","pbg","pbh","pbi","pbl","pbm","pbn","pbo","pbp","pbr","pbs","pbt","pbu","pbv","pby","pbz","pca","pcb","pcc","pcd","pce","pcf","pcg","pch","pci","pcj","pck","pcl","pcm","pcn","pcp","pcr","pcw","pda","pdc","pdi","pdn","pdo","pdt","pdu","pea","peb","ped","pee","pef","peg","peh","pei","pej","pek","pel","pem","peo","pep","peq","pes","pev","pex","pey","pez","pfa","pfe","pfl","pga","pgd","pgg","pgi","pgk","pgl","pgn","pgs","pgu","pgy","pgz","pha","phd","phg","phh","phi","phk","phl","phm","phn","pho","phq","phr","pht","phu","phv","phw","pia","pib","pic","pid","pie","pif","pig","pih","pii","pij","pil","pim","pin","pio","pip","pir","pis","pit","piu","piv","piw","pix","piy","piz","pjt","pka","pkb","pkc","pkg","pkh","pkn","pko","pkp","pkr","pks","pkt","pku","pla","plb","plc","pld","ple","plf","plg","plh","plj","plk","pll","pln","plo","plp","plq","plr","pls","plt","plu","plv","plw","ply","plz","pma","pmb","pmc","pmd","pme","pmf","pmh","pmi","pmj","pmk","pml","pmm","pmn","pmo","pmq","pmr","pms","pmt","pmu","pmw","pmx","pmy","pmz","pna","pnb","pnc","pnd","pne","png","pnh","pni","pnj","pnk","pnl","pnm","pnn","pno","pnp","pnq","pnr","pns","pnt","pnu","pnv","pnw","pnx","pny","pnz","poc","pod","poe","pof","pog","poh","poi","pok","pom","pon","poo","pop","poq","pos","pot","pov","pow","pox","poy","poz","ppa","ppe","ppi","ppk","ppl","ppm","ppn","ppo","ppp","ppq","ppr","pps","ppt","ppu","pqa","pqe","pqm","pqw","pra","prb","prc","prd","pre","prf","prg","prh","pri","prk","prl","prm","prn","pro","prp","prq","prr","prs","prt","pru","prw","prx","pry","prz","psa","psc","psd","pse","psg","psh","psi","psl","psm","psn","pso","psp","psq","psr","pss","pst","psu","psw","psy","pta","pth","pti","ptn","pto","ptp","ptq","ptr","ptt","ptu","ptv","ptw","pty","pua","pub","puc","pud","pue","puf","pug","pui","puj","puk","pum","puo","pup","puq","pur","put","puu","puw","pux","puy","puz","pwa","pwb","pwg","pwi","pwm","pwn","pwo","pwr","pww","pxm","pye","pym","pyn","pys","pyu","pyx","pyy","pzn"],["qu","qua","qub","quc","qud","quf","qug","quh","qui","quk","qul","qum","qun","qup","quq","qur","qus","quv","quw","qux","quy","quz","qva","qvc","qve","qvh","qvi","qvj","qvl","qvm","qvn","qvo","qvp","qvs","qvw","qvy","qvz","qwa","qwc","qwe","qwh","qwm","qws","qwt","qxa","qxc","qxh","qxl","qxn","qxo","qxp","qxq","qxr","qxs","qxt","qxu","qxw","qya","qyp"],["rm","rn","ro","ru","rw","raa","rab","rac","rad","raf","rag","rah","rai","raj","rak","ral","ram","ran","rao","rap","raq","rar","ras","rat","rau","rav","raw","rax","ray","raz","rbb","rbk","rbl","rbp","rcf","rdb","rea","reb","ree","reg","rei","rej","rel","rem","ren","rer","res","ret","rey","rga","rge","rgk","rgn","rgr","rgs","rgu","rhg","rhp","ria","rie","rif","ril","rim","rin","rir","rit","riu","rjg","rji","rjs","rka","rkb","rkh","rki","rkm","rkt","rkw","rma","rmb","rmc","rmd","rme","rmf","rmg","rmh","rmi","rmk","rml","rmm","rmn","rmo","rmp","rmq","rmr","rms","rmt","rmu","rmv","rmw","rmx","rmy","rmz","rna","rnd","rng","rnl","rnn","rnp","rnr","rnw","roa","rob","roc","rod","roe","rof","rog","rol","rom","roo","rop","ror","rou","row","rpn","rpt","rri","rro","rrt","rsb","rsi","rsl","rsm","rtc","rth","rtm","rts","rtw","rub","ruc","rue","ruf","rug","ruh","rui","ruk","ruo","rup","ruq","rut","ruu","ruy","ruz","rwa","rwk","rwl","rwm","rwo","rwr","rxd","rxw","ryn","rys","ryu","rzh"],["sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","saa","sab","sac","sad","sae","saf","sah","sai","saj","sak","sal","sam","sao","sap","saq","sar","sas","sat","sau","sav","saw","sax","say","saz","sba","sbb","sbc","sbd","sbe","sbf","sbg","sbh","sbi","sbj","sbk","sbl","sbm","sbn","sbo","sbp","sbq","sbr","sbs","sbt","sbu","sbv","sbw","sbx","sby","sbz","sca","scb","sce","scf","scg","sch","sci","sck","scl","scn","sco","scp","scq","scs","sct","scu","scv","scw","scx","sda","sdb","sdc","sde","sdf","sdg","sdh","sdj","sdk","sdl","sdm","sdn","sdo","sdp","sdq","sdr","sds","sdt","sdu","sdv","sdx","sdz","sea","seb","sec","sed","see","sef","seg","seh","sei","sej","sek","sel","sem","sen","seo","sep","seq","ser","ses","set","seu","sev","sew","sey","sez","sfb","sfe","sfm","sfs","sfw","sga","sgb","sgc","sgd","sge","sgg","sgh","sgi","sgj","sgk","sgl","sgm","sgn","sgo","sgp","sgr","sgs","sgt","sgu","sgw","sgx","sgy","sgz","sha","shb","shc","shd","she","shg","shh","shi","shj","shk","shl","shm","shn","sho","shp","shq","shr","shs","sht","shu","shv","shw","shx","shy","shz","sia","sib","sid","sie","sif","sig","sih","sii","sij","sik","sil","sim","sio","sip","siq","sir","sis","sit","siu","siv","siw","six","siy","siz","sja","sjb","sjd","sje","sjg","sjk","sjl","sjm","sjn","sjo","sjp","sjr","sjs","sjt","sju","sjw","ska","skb","skc","skd","ske","skf","skg","skh","ski","skj","skk","skm","skn","sko","skp","skq","skr","sks","skt","sku","skv","skw","skx","sky","skz","sla","slc","sld","sle","slf","slg","slh","sli","slj","sll","slm","sln","slp","slq","slr","sls","slt","slu","slw","slx","sly","slz","sma","smb","smc","smd","smf","smg","smh","smi","smj","smk","sml","smm","smn","smp","smq","smr","sms","smt","smu","smv","smw","smx","smy","smz","snb","snc","sne","snf","sng","snh","sni","snj","snk","snl","snm","snn","sno","snp","snq","snr","sns","snu","snv","snw","snx","sny","snz","soa","sob","soc","sod","soe","sog","soh","soi","soj","sok","sol","son","soo","sop","soq","sor","sos","sou","sov","sow","sox","soy","soz","spb","spc","spd","spe","spg","spi","spk","spl","spm","spn","spo","spp","spq","spr","sps","spt","spu","spv","spx","spy","sqa","sqh","sqj","sqk","sqm","sqn","sqo","sqq","sqr","sqs","sqt","squ","sqx","sra","srb","src","sre","srf","srg","srh","sri","srk","srl","srm","srn","sro","srq","srr","srs","srt","sru","srv","srw","srx","sry","srz","ssa","ssb","ssc","ssd","sse","ssf","ssg","ssh","ssi","ssj","ssk","ssl","ssm","ssn","sso","ssp","ssq","ssr","sss","sst","ssu","ssv","ssx","ssy","ssz","sta","stb","std","ste","stf","stg","sth","sti","stj","stk","stl","stm","stn","sto","stp","stq","str","sts","stt","stu","stv","stw","sty","sua","sub","suc","sue","sug","sui","suj","suk","sul","sum","suo","suq","sur","sus","sut","suv","suw","sux","suy","suz","sva","svb","svc","sve","svk","svm","svr","svs","svx","swb","swc","swf","swg","swh","swi","swj","swk","swl","swm","swn","swo","swp","swq","swr","sws","swt","swu","swv","sww","swx","swy","sxb","sxc","sxe","sxg","sxk","sxl","sxm","sxn","sxo","sxr","sxs","sxu","sxw","sya","syb","syc","syd","syi","syk","syl","sym","syn","syo","syr","sys","syw","syx","syy","sza","szb","szc","szd","sze","szg","szl","szn","szp","szs","szv","szw","szy"],["ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","taa","tab","tac","tad","tae","taf","tag","tai","taj","tak","tal","tan","tao","tap","taq","tar","tas","tau","tav","taw","tax","tay","taz","tba","tbb","tbc","tbd","tbe","tbf","tbg","tbh","tbi","tbj","tbk","tbl","tbm","tbn","tbo","tbp","tbq","tbr","tbs","tbt","tbu","tbv","tbw","tbx","tby","tbz","tca","tcb","tcc","tcd","tce","tcf","tcg","tch","tci","tck","tcl","tcm","tcn","tco","tcp","tcq","tcs","tct","tcu","tcw","tcx","tcy","tcz","tda","tdb","tdc","tdd","tde","tdf","tdg","tdh","tdi","tdj","tdk","tdl","tdm","tdn","tdo","tdq","tdr","tds","tdt","tdu","tdv","tdx","tdy","tea","teb","tec","ted","tee","tef","teg","teh","tei","tek","tem","ten","teo","tep","teq","ter","tes","tet","teu","tev","tew","tex","tey","tez","tfi","tfn","tfo","tfr","tft","tga","tgb","tgc","tgd","tge","tgf","tgg","tgh","tgi","tgj","tgn","tgo","tgp","tgq","tgr","tgs","tgt","tgu","tgv","tgw","tgx","tgy","tgz","thc","thd","the","thf","thh","thi","thk","thl","thm","thn","thp","thq","thr","ths","tht","thu","thv","thw","thx","thy","thz","tia","tic","tid","tie","tif","tig","tih","tii","tij","tik","til","tim","tin","tio","tip","tiq","tis","tit","tiu","tiv","tiw","tix","tiy","tiz","tja","tjg","tji","tjj","tjl","tjm","tjn","tjo","tjp","tjs","tju","tjw","tka","tkb","tkd","tke","tkf","tkg","tkk","tkl","tkm","tkn","tkp","tkq","tkr","tks","tkt","tku","tkv","tkw","tkx","tkz","tla","tlb","tlc","tld","tlf","tlg","tlh","tli","tlj","tlk","tll","tlm","tln","tlo","tlp","tlq","tlr","tls","tlt","tlu","tlv","tlw","tlx","tly","tma","tmb","tmc","tmd","tme","tmf","tmg","tmh","tmi","tmj","tmk","tml","tmm","tmn","tmo","tmp","tmq","tmr","tms","tmt","tmu","tmv","tmw","tmy","tmz","tna","tnb","tnc","tnd","tne","tnf","tng","tnh","tni","tnk","tnl","tnm","tnn","tno","tnp","tnq","tnr","tns","tnt","tnu","tnv","tnw","tnx","tny","tnz","tob","toc","tod","toe","tof","tog","toh","toi","toj","tol","tom","too","top","toq","tor","tos","tou","tov","tow","tox","toy","toz","tpa","tpc","tpe","tpf","tpg","tpi","tpj","tpk","tpl","tpm","tpn","tpo","tpp","tpq","tpr","tpt","tpu","tpv","tpw","tpx","tpy","tpz","tqb","tql","tqm","tqn","tqo","tqp","tqq","tqr","tqt","tqu","tqw","tra","trb","trc","trd","tre","trf","trg","trh","tri","trj","trk","trl","trm","trn","tro","trp","trq","trr","trs","trt","tru","trv","trw","trx","try","trz","tsa","tsb","tsc","tsd","tse","tsf","tsg","tsh","tsi","tsj","tsk","tsl","tsm","tsp","tsq","tsr","tss","tst","tsu","tsv","tsw","tsx","tsy","tsz","tta","ttb","ttc","ttd","tte","ttf","ttg","tth","tti","ttj","ttk","ttl","ttm","ttn","tto","ttp","ttq","ttr","tts","ttt","ttu","ttv","ttw","tty","ttz","tua","tub","tuc","tud","tue","tuf","tug","tuh","tui","tuj","tul","tum","tun","tuo","tup","tuq","tus","tut","tuu","tuv","tuw","tux","tuy","tuz","tva","tvd","tve","tvk","tvl","tvm","tvn","tvo","tvs","tvt","tvu","tvw","tvx","tvy","twa","twb","twc","twd","twe","twf","twg","twh","twl","twm","twn","two","twp","twq","twr","twt","twu","tww","twx","twy","txa","txb","txc","txe","txg","txh","txi","txj","txm","txn","txo","txq","txr","txs","txt","txu","txx","txy","tya","tye","tyh","tyi","tyj","tyl","tyn","typ","tyr","tys","tyt","tyu","tyv","tyx","tyy","tyz","tza","tzh","tzj","tzl","tzm","tzn","tzo","tzx"],["ug","uk","ur","uz","uam","uan","uar","uba","ubi","ubl","ubr","ubu","uby","uda","ude","udg","udi","udj","udl","udm","udu","ues","ufi","uga","ugb","uge","ugn","ugo","ugy","uha","uhn","uis","uiv","uji","uka","ukg","ukh","uki","ukk","ukl","ukp","ukq","uks","uku","ukv","ukw","uky","ula","ulb","ulc","ule","ulf","uli","ulk","ull","ulm","uln","ulu","ulw","uma","umb","umc","umd","umg","umi","umm","umn","umo","ump","umr","ums","umu","una","und","une","ung","uni","unk","unm","unn","unp","unr","unu","unx","unz","uok","upi","upv","ura","urb","urc","ure","urf","urg","urh","uri","urj","urk","url","urm","urn","uro","urp","urr","urt","uru","urv","urw","urx","ury","urz","usa","ush","usi","usk","usp","uss","usu","uta","ute","uth","utp","utr","utu","uum","uun","uur","uuu","uve","uvh","uvl","uwa","uya","uzn","uzs"],["ve","vi","vo","vaa","vae","vaf","vag","vah","vai","vaj","val","vam","van","vao","vap","var","vas","vau","vav","vay","vbb","vbk","vec","ved","vel","vem","veo","vep","ver","vgr","vgt","vic","vid","vif","vig","vil","vin","vis","vit","viv","vka","vki","vkj","vkk","vkl","vkm","vkn","vko","vkp","vkt","vku","vkz","vlp","vls","vma","vmb","vmc","vmd","vme","vmf","vmg","vmh","vmi","vmj","vmk","vml","vmm","vmp","vmq","vmr","vms","vmu","vmv","vmw","vmx","vmy","vmz","vnk","vnm","vnp","vor","vot","vra","vro","vrs","vrt","vsi","vsl","vsv","vto","vum","vun","vut","vwa"],["wa","wo","waa","wab","wac","wad","wae","waf","wag","wah","wai","waj","wak","wal","wam","wan","wao","wap","waq","war","was","wat","wau","wav","waw","wax","way","waz","wba","wbb","wbe","wbf","wbh","wbi","wbj","wbk","wbl","wbm","wbp","wbq","wbr","wbs","wbt","wbv","wbw","wca","wci","wdd","wdg","wdj","wdk","wdu","wdy","wea","wec","wed","weg","weh","wei","wem","wen","weo","wep","wer","wes","wet","weu","wew","wfg","wga","wgb","wgg","wgi","wgo","wgu","wgw","wgy","wha","whg","whk","whu","wib","wic","wie","wif","wig","wih","wii","wij","wik","wil","wim","win","wir","wit","wiu","wiv","wiw","wiy","wja","wji","wka","wkb","wkd","wkl","wkr","wku","wkw","wky","wla","wlc","wle","wlg","wlh","wli","wlk","wll","wlm","wlo","wlr","wls","wlu","wlv","wlw","wlx","wly","wma","wmb","wmc","wmd","wme","wmg","wmh","wmi","wmm","wmn","wmo","wms","wmt","wmw","wmx","wnb","wnc","wnd","wne","wng","wni","wnk","wnm","wnn","wno","wnp","wnu","wnw","wny","woa","wob","woc","wod","woe","wof","wog","woi","wok","wom","won","woo","wor","wos","wow","woy","wpc","wra","wrb","wrd","wrg","wrh","wri","wrk","wrl","wrm","wrn","wro","wrp","wrr","wrs","wru","wrv","wrw","wrx","wry","wrz","wsa","wsg","wsi","wsk","wsr","wss","wsu","wsv","wtf","wth","wti","wtk","wtm","wtw","wua","wub","wud","wuh","wul","wum","wun","wur","wut","wuu","wuv","wux","wuy","wwa","wwb","wwo","wwr","www","wxa","wxw","wya","wyb","wyi","wym","wyr","wyy"],["xh","xaa","xab","xac","xad","xae","xag","xai","xaj","xak","xal","xam","xan","xao","xap","xaq","xar","xas","xat","xau","xav","xaw","xay","xba","xbb","xbc","xbd","xbe","xbg","xbi","xbj","xbm","xbn","xbo","xbp","xbr","xbw","xbx","xby","xcb","xcc","xce","xcg","xch","xcl","xcm","xcn","xco","xcr","xct","xcu","xcv","xcw","xcy","xda","xdc","xdk","xdm","xdo","xdy","xeb","xed","xeg","xel","xem","xep","xer","xes","xet","xeu","xfa","xga","xgb","xgd","xgf","xgg","xgi","xgl","xgm","xgn","xgr","xgu","xgw","xha","xhc","xhd","xhe","xhr","xht","xhu","xhv","xia","xib","xii","xil","xin","xip","xir","xis","xiv","xiy","xjb","xjt","xka","xkb","xkc","xkd","xke","xkf","xkg","xkh","xki","xkj","xkk","xkl","xkn","xko","xkp","xkq","xkr","xks","xkt","xku","xkv","xkw","xkx","xky","xkz","xla","xlb","xlc","xld","xle","xlg","xli","xln","xlo","xlp","xls","xlu","xly","xma","xmb","xmc","xmd","xme","xmf","xmg","xmh","xmj","xmk","xml","xmm","xmn","xmo","xmp","xmq","xmr","xms","xmt","xmu","xmv","xmw","xmx","xmy","xmz","xna","xnb","xnd","xng","xnh","xni","xnj","xnk","xnm","xnn","xno","xnq","xnr","xns","xnt","xnu","xny","xnz","xoc","xod","xog","xoi","xok","xom","xon","xoo","xop","xor","xow","xpa","xpb","xpc","xpd","xpe","xpf","xpg","xph","xpi","xpj","xpk","xpl","xpm","xpn","xpo","xpp","xpq","xpr","xps","xpt","xpu","xpv","xpw","xpx","xpy","xpz","xqa","xqt","xra","xrb","xrd","xre","xrg","xri","xrm","xrn","xrq","xrr","xrt","xru","xrw","xsa","xsb","xsc","xsd","xse","xsh","xsi","xsj","xsl","xsm","xsn","xso","xsp","xsq","xsr","xss","xsu","xsv","xsy","xta","xtb","xtc","xtd","xte","xtg","xth","xti","xtj","xtl","xtm","xtn","xto","xtp","xtq","xtr","xts","xtt","xtu","xtv","xtw","xty","xtz","xua","xub","xud","xug","xuj","xul","xum","xun","xuo","xup","xur","xut","xuu","xve","xvi","xvn","xvo","xvs","xwa","xwc","xwd","xwe","xwg","xwj","xwk","xwl","xwo","xwr","xwt","xww","xxb","xxk","xxm","xxr","xxt","xya","xyb","xyj","xyk","xyl","xyt","xyy","xzh","xzm","xzp"],["yi","yo","yaa","yab","yac","yad","yae","yaf","yag","yah","yai","yaj","yak","yal","yam","yan","yao","yap","yaq","yar","yas","yat","yau","yav","yaw","yax","yay","yaz","yba","ybb","ybd","ybe","ybh","ybi","ybj","ybk","ybl","ybm","ybn","ybo","ybx","yby","ych","ycl","ycn","ycp","yda","ydd","yde","ydg","ydk","yds","yea","yec","yee","yei","yej","yel","yen","yer","yes","yet","yeu","yev","yey","yga","ygi","ygl","ygm","ygp","ygr","ygs","ygu","ygw","yha","yhd","yhl","yhs","yia","yif","yig","yih","yii","yij","yik","yil","yim","yin","yip","yiq","yir","yis","yit","yiu","yiv","yix","yiy","yiz","yka","ykg","yki","ykk","ykl","ykm","ykn","yko","ykr","ykt","yku","yky","yla","ylb","yle","ylg","yli","yll","ylm","yln","ylo","ylr","ylu","yly","yma","ymb","ymc","ymd","yme","ymg","ymh","ymi","ymk","yml","ymm","ymn","ymo","ymp","ymq","ymr","yms","ymt","ymx","ymz","yna","ynd","yne","yng","ynh","ynk","ynl","ynn","yno","ynq","yns","ynu","yob","yog","yoi","yok","yol","yom","yon","yos","yot","yox","yoy","ypa","ypb","ypg","yph","ypk","ypm","ypn","ypo","ypp","ypz","yra","yrb","yre","yri","yrk","yrl","yrm","yrn","yro","yrs","yrw","yry","ysc","ysd","ysg","ysl","ysm","ysn","yso","ysp","ysr","yss","ysy","yta","ytl","ytp","ytw","yty","yua","yub","yuc","yud","yue","yuf","yug","yui","yuj","yuk","yul","yum","yun","yup","yuq","yur","yut","yuu","yuw","yux","yuy","yuz","yva","yvt","ywa","ywg","ywl","ywn","ywq","ywr","ywt","ywu","yww","yxa","yxg","yxl","yxm","yxu","yxy","yyr","yyu","yyz","yzg","yzk"],["za","zh","zu","zaa","zab","zac","zad","zae","zaf","zag","zah","zai","zaj","zak","zal","zam","zao","zap","zaq","zar","zas","zat","zau","zav","zaw","zax","zay","zaz","zba","zbc","zbe","zbl","zbt","zbu","zbw","zca","zch","zdj","zea","zeg","zeh","zen","zga","zgb","zgh","zgm","zgn","zgr","zhb","zhd","zhi","zhn","zhw","zhx","zia","zib","zik","zil","zim","zin","zir","ziw","ziz","zka","zkb","zkd","zkg","zkh","zkk","zkn","zko","zkp","zkr","zkt","zku","zkv","zkz","zla","zle","zlj","zlm","zln","zlq","zls","zlw","zma","zmb","zmc","zmd","zme","zmf","zmg","zmh","zmi","zmj","zmk","zml","zmm","zmn","zmo","zmp","zmq","zmr","zms","zmt","zmu","zmv","zmw","zmx","zmy","zmz","zna","znd","zne","zng","znk","zns","zoc","zoh","zom","zoo","zoq","zor","zos","zpa","zpb","zpc","zpd","zpe","zpf","zpg","zph","zpi","zpj","zpk","zpl","zpm","zpn","zpo","zpp","zpq","zpr","zps","zpt","zpu","zpv","zpw","zpx","zpy","zpz","zqe","zra","zrg","zrn","zro","zrp","zrs","zsa","zsk","zsl","zsm","zsr","zsu","zte","ztg","ztl","ztm","ztn","ztp","ztq","zts","ztt","ztu","ztx","zty","zua","zuh","zum","zun","zuy","zwa","zxx","zyb","zyg","zyj","zyn","zyp","zza","zzj"]],a=function(){function e(){}return e.isBcp47=function(e){return/^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(e)},e.validPrimaryLang=function(e){var t=e.toLowerCase();return t.includes("-")&&(t=t.split("-")[0]),!!t.match(/[a-z]{2,3}/)&&(3===t.length&&"q"===t.charAt(0)&&t.charCodeAt(1)>=97&&t.charCodeAt(1)<=116&&t.charCodeAt(2)>=97&&t.charCodeAt(2),i[t.charCodeAt(0)-97].includes(t))},e.matchPrimaryLang=function(e,t){var i=e;i.includes("-")&&(i=i.split("-")[0]);var a=t;return a.includes("-")&&(a=a.split("-")[0]),i.toLowerCase()===a.toLowerCase()},e}();t.LangUtil=a},3103(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CommonMapper=void 0;var a=i(3864),n=function(){function e(){this.hierarchyRole=null,this.hierarchyPath=null,this.hierarchyResults=null}return e.prototype.getBounds=function(e){return null},e.prototype.reset=function(e){this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var t=[],i=a.DOMWalker.parentNode(e);i&&9!=i.nodeType;)t.push(i),i=a.DOMWalker.parentNode(i);for(var n=0,r=t=t.reverse();n<r.length;n++){for(var l=r[n],o=[],s=l.previousSibling;s;)o.push(s),s=s.previousSibling;for(var u=0,d=o=o.reverse();u<d.length;u++){var c=d[u];this.pushHierarchy(c),this.popHierarchy()}this.pushHierarchy(l)}},e.prototype.pushHierarchy=function(e){var t=this.getRole(e)||null;if(this.hierarchyRole.push(t),null!==t){var i=this.hierarchyPath[this.hierarchyPath.length-1];i.roleCount[t]=(i.roleCount[t]||0)+1,this.hierarchyPath.push({rolePath:i.rolePath+"/"+t+"["+i.roleCount[t]+"]",roleCount:{}})}var a={};1===e.nodeType&&(a=this.getAttributes(e)),this.hierarchyResults.push({node:e,namespace:this.getNamespace(),role:t,attributes:a,rolePath:this.hierarchyPath[this.hierarchyPath.length-1].rolePath,bounds:this.getBounds(e)})},e.prototype.popHierarchy=function(){null!==this.hierarchyRole.pop()&&this.hierarchyPath.pop(),this.hierarchyResults.pop()},e.prototype.openScope=function(e){return null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e),this.hierarchyResults},e.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}return t[t.length-1].role="/"+t[t.length-1].role,this.popHierarchy(),t},e}();t.CommonMapper=n},920(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Context=t.PartInfo=t.AttrInfo=void 0;var i=function(){function e(e,t,i,a){if(this.inclusive=e,this.attr=t,this.eq=i,this.value=a,!e&&void 0!==i&&i.length>0)throw new Error("Cannot have !attr"+i+" context");if(e&&void 0!==i&&i.length>0&&(void 0===a||0===a.length))throw new Error("Cannot have equivalence check without a value")}return e.prototype.matches=function(e){var t=this,i=e.attributes;if(t.attr in i){if(t.inclusive){if(t.eq){var a=i[t.attr];if("="===t.eq)return t.value===a;if("!="===t.eq)return t.value!==a;if("~"===t.eq)return t.value===a;if("!~"===t.eq)return t.value!==a;throw new Error("Context equivalence operator not supported")}return!0}return!1}return!t.inclusive},e}();t.AttrInfo=i;var a=function(){function e(e,t,i,a,n){if(this.inclusive=e,this.namespace=t,this.role=i,this.attrs=a,this.connector=n,"*"===i&&!e)throw new Error("!* context not supported")}return e.prototype.matches=function(e,t){var i=this,a=i.namespace in e&&e[i.namespace][t]&&(e[i.namespace][t].role===i.role||"none"!==e[i.namespace][t].role&&"*"===i.role);if(!a||"*"!==i.role||"dom"!==i.namespace||"#text"!==e[i.namespace][t].role&&"/#text"!==e[i.namespace][t].role||(a=!1),i.inclusive&&!a)return!1;if(!i.inclusive&&!a)return!0;for(var n=i.attrs,r=e[i.namespace][t],l=!0,o=0,s=n;o<s.length;o++){var u=s[o];l=l&&u.matches(r)}return i.inclusive||(l=!l),l},e}();t.PartInfo=a;var n=function(){function e(e){this.contextInfo=[];for(var t=[],n=0,r=e.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g);n<r.length;n++){for(var l=r[n].match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/),o=[],s=0,u=l[3].match(/\[([^\]]+)\]/g)||[];s<u.length;s++){var d=u[s].match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/);o.push(new i("!"!==d[1],d[2].toLowerCase(),d[3],d[4]))}l[2]=l[2].toLowerCase();var c=l[2].split(":"),m="!"!==l[1],p=c.shift(),h=c.join(":"),g=new a(m,p,h,o,l[l.length-1]);t.push(g)}this.contextInfo=t}return e.cleanContext=function(e){return(e=(e=(e=(e=(e=e.toLowerCase().trim()).replace(/ +!/g," !")).replace(/ +([>+~,])/g,"$1")).replace(/([>+~,]) +/g,"$1")).replace(/ +/g," ")).trim()},e.parse=function(t){for(var i=e.splitMultiple(e.cleanContext(t)),a=[],n=0;n<i.length;++n){var r=new e(i[n]);a.push(r)}return a},e.splitMultiple=function(e){var t=[];if(e)if(-1===e.indexOf(","))t.push(e);else for(var i=0,a=e.split(",");i<a.length;i++){var n=a[i];t.push(n)}return t},e}();t.Context=n},7301(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Engine=void 0;var a=i(3864),n=i(920),r=i(4516),l=i(7507),o=i(1686),s=i(4566),u=i(461),d=i(3946),c=function(){function e(e,t){this.rule=e,this.parsedInfo=t,this.ns=this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length-1].namespace,r.Config.DEBUG&&console.log("Added Rule:",e.id,JSON.stringify(this.parsedInfo))}return e.convertNodeToSnippet=function(e){var t="";t+="<"+e.nodeName.toLowerCase();var i=e.attributes;if(null!=i)for(var a=i.length-1;a>=0;a--)"data-namewalk"!==i[a].name&&(t+=" "+i[a].name+'="'+i[a].value+'"');return t+">"},e.convertNodeToSource=function(e,t){if(void 0===t&&(t=!1),!t||!e)return null;var i="ibm-a11y-debug",n=function(e){return e&&"end"!==e.toLowerCase()?{found:!0,stop:!1,source:e}:{found:!0,stop:!0}},r=function(e){if(!e)return{found:!1};var t=null;if(e.nodeType===Node.COMMENT_NODE)t=e.nodeValue;else if(e.nodeType===Node.ELEMENT_NODE)for(var a=e.firstChild;a;){if(a.nodeType!==Node.TEXT_NODE){if(a.nodeType===Node.COMMENT_NODE){t=a.nodeValue;break}break}if(a.nodeValue&&a.nodeValue.trim().length>0)break;a=a.nextSibling}if(null!==t){var r=t.trim();if(r===i||r.startsWith(i+":")||r.startsWith(i+" ")||r.startsWith(i+"\t")){var l=r.substring(14).trimStart(),o=l.startsWith(":")?l.substring(1).trim():l.trim();return n(o)}}return{found:!1}},l=function(e){if(e.nodeType!==Node.ELEMENT_NODE)return{found:!1};var t=e.getAttribute(i);return null===t?{found:!1}:n(t.trim())},o=l(e);return o.found?o.stop?null:o.source:function(e){for(var t=e;t;){for(var i=a.DOMWalker.previousSiblingNotOwnedBySlot(t);i;){var n=r(i);if(n.found)return n.stop?null:n.source;i=a.DOMWalker.previousSiblingNotOwnedBySlot(i)}var o=a.DOMWalker.parentNode(t);if(!o||o.nodeType===Node.DOCUMENT_NODE)return null;var s=l(o);if(s.found)return s.stop?null:s.source;t=o}return null}(e)},e.prototype.run=function(t,i,a,n){var r,l=(new Date).getTime();try{r=this.rule.run(i,a,n)}catch(e){var o=e;throw console.error("RULE EXCEPTION:",this.rule.id,i.dom.rolePath,o.stack),e}var s=(new Date).getTime();r||(r=[]),r instanceof Array||(r=[r]);for(var u=[],d=0,c=r;d<c.length;d++){var m=c[d],p=t.getMessage(this.rule.id,m.reasonId,m.messageArgs),h={};for(var g in i)h[g]=i[g].rolePath;var b=this.rule.id.replace(/^(.*)\$\$\d+$/,"$1");u.push({ruleId:b,value:m.value,node:i.dom.node,path:h,ruleTime:s-l,reasonId:m.reasonId,message:p,messageArgs:m.messageArgs,apiArgs:m.apiArgs,bounds:i.dom.bounds,snippet:e.convertNodeToSnippet(i.dom.node),source:e.convertNodeToSource(i.dom.node,t.isSourceMapEnabled())})}return u},e}(),m=function(){function e(){this.mappers={},this.ruleMap={},this.wrappedRuleMap={},this.nlsMap={},this.helpMap={},this.sourceMapEnabled=!1,this.inclRules={},this.exclRules={},this.addMapper(new l.DOMMapper)}return e.getLanguages=function(){var e="undefined"!=typeof process&&void 0===process.nodeType&&process.env,t="en-US";return e&&(t=(t=e.LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES)&&t.length>0?t.split(".")[0].replace(/_/g,"-"):"en-US"),"undefined"!=typeof navigator&&navigator.languages||[t]},e.prototype.run=function(e,t){if(null===e)return Promise.reject("null document");9===e.nodeType&&(e=e.documentElement),e.ownerDocument&&(e.ownerDocument.PT_CHECK_HIDDEN_CONTENT=!1);var i=s.CacheUtil.clearCaches(e),n=new a.DOMWalker(e,!1,e,!0),r={results:[],numExecuted:0,ruleTime:0,totalTime:0},l=(new Date).getTime();for(var c in this.mappers)this.mappers[c].reset(e);var m=0,p=-1;do{m++;var h=Math.floor(m/i*100);h>p&&(i>1e4&&console.log("Progress: ".concat(h,"% (").concat(m,"/").concat(i," nodes)")),p=h);var g={};for(var c in this.mappers)n.bEndTag?g[c]=this.mappers[c].closeScope(n.node):g[c]=this.mappers[c].openScope(n.node);if(11!==n.node.nodeType&&(d.VisUtil.isNodeVisible(n.node)||"meta"===n.node.nodeName.toLowerCase()||"style"===n.node.nodeName.toLowerCase()||"datalist"===n.node.nodeName.toLowerCase()||"param"===n.node.nodeName.toLowerCase()||!o.DOMUtil.getAncestor(n.node,["body"]))){var b={};for(var _ in g){var f=g[_],v=f[f.length-1];b[_]=v}for(var A={},w=0,y=this.getMatchingRules(g);w<y.length;w++){for(var C=y[w],k=!0,R=0,x=C.rule.dependencies||[];R<x.length;R++)A[x[R]]||(k=!1);if(k){var P=[];(new Date).getTime();try{P=C.run(this,b,t,g)}catch(e){}0===P.length&&(A[C.rule.id]=!0);for(var T=0,U=P;T<U.length;T++){var I=U[T];r.results.push(I),r.ruleTime+=I.ruleTime,r.numExecuted++,I.value[1]===u.eRuleConfidence.PASS&&(A[I.ruleId]=!0)}}}}}while(n.nextNode());return s.CacheUtil.clearCaches(e),r.totalTime=(new Date).getTime()-l,Promise.resolve(r)},e.prototype.enableRules=function(e){for(var t in this.ruleMap)this.ruleMap[t].enabled=!1;for(var i=0,a=e||[];i<a.length;i++)(t=a[i])in this.ruleMap?this.ruleMap[t].enabled=!0:console.warn("WARNING: Rule Id",t,"could not be enabled.")},e.prototype.getRule=function(e){return this.ruleMap[e]},e.prototype.getRulesIds=function(){var e=[];for(var t in this.ruleMap)e.push(t);return e},e.prototype.addRules=function(e){for(var t=0,i=e;t<i.length;t++){var a=i[t];this.addRule(a,!0)}this._sortRules()},e.prototype.addRule=function(e,t){var i=n.Context.parse(e.context),a=0,r=e.id;if(r in this.ruleMap)console.log("WARNING: Rule",r,"already added to engine. Ignoring...");else{this.ruleMap[r]=e;for(var l=0,o=i;l<o.length;l++){var s=o[l],u=r;a>=1&&(u=r+"$$"+a),++a;var d=new c(e,s);this.wrappedRuleMap[u]=d;var m=d.parsedInfo.contextInfo,p=m[m.length-1],h=p.namespace+":"+p.role;p.inclusive?(this.inclRules[h]=this.inclRules[h]||[],this.inclRules[h].push(d)):(this.exclRules[h]=this.exclRules[h]||[],this.exclRules[h].push(d))}t||this._sortRules()}},e.prototype.enableSourceMap=function(e){this.sourceMapEnabled=e},e.prototype.isSourceMapEnabled=function(){return this.sourceMapEnabled},e.prototype._sortRules=function(){for(var e in this.inclRules)this.inclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0});for(var e in this.exclRules)this.exclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0})},e.prototype.addNlsMap=function(e){for(var t in e)this.nlsMap[t]=e[t]},e.prototype.addHelpMap=function(e){for(var t in e)this.helpMap[t]=e[t]},e.prototype.getMessage=function(e,t,i){var a=e.indexOf("$$");if(a>=0&&(e=e.substring(0,a)),!(e in this.nlsMap))return e;var n=this.nlsMap[e][t||0];return n?n.replace(/\{(\d+)\}/g,function(e,t,a){return i[t]}):e+"_"+t},e.prototype.getHelp=function(e,t,i){return i||(i="latest"),"".concat(r.Config.helpRoot,"/").concat(i,"/doc").concat(this.getHelpRel(e,t))},e.prototype.getHelpRel=function(e,t){var i=e.indexOf("$$");return i>=0&&(e=e.substring(0,i)),e in this.helpMap?((t=t||0)in this.helpMap[e]?this.helpMap[e][t||0]:this.helpMap[e][0])||e+"_"+t:e},e.prototype.addMapper=function(e){this.mappers[e.getNamespace()]=e},e.match=function(e,t){var i=e.parsedInfo.contextInfo,a=i.length-1,n=i[a].namespace,r=t[n][t[n].length-1],l=r.node;if(!i[a].matches(t,t[n].length-1))return!1;if(1===i.length)return!0;if(r=t[n=i[0].namespace][t[n].length-1],--a,i.slice(0,i.length-1).some(function(e){return e.namespace!==n}))return console.error("[ERROR] Rule ".concat(e.rule.id," has inconsitent parent namespaces")),!1;for(var o=t[n].length-(r.node.isSameNode(l)?2:1);o>=0&&a>=0;){var s=i[a],u=i[a].matches(t,o);if(">"===s.connector){if(!u)return!1;--a,--o}else{if(" "!==s.connector)throw new Error("Context connector "+s.connector+" is not supported");if(s.inclusive)u&&--a,--o;else{if(!u)return!1;for(var d=!1,c=o-1;!d&&c>=0;--c)d=!i[a].matches(t,c);if(d)return!1;--a}}}return-1===a},e.prototype.getMatchingRules=function(t){var i=[];function a(a){for(var n=0,r=a;n<r.length;n++){var l=r[n];l.rule.enabled&&e.match(l,t)&&i.push(l)}}for(var n in t){var r=n+":"+(t[n].length>0?t[n][t[n].length-1].role:"none");for(var l in r in this.inclRules&&a(this.inclRules[r]),this.exclRules)l!==r&&a(this.exclRules[l]);r!==n+":none"&&(r.startsWith(n+":/")?n+":/*"in this.inclRules&&a(this.inclRules[n+":/*"]):n+":*"in this.inclRules&&a(this.inclRules[n+":*"]))}return this.sortDeps(i)},e.prototype.sortDeps=function(e){for(var t=[],i=0,a=e;i<a.length;i++){var n=a[i];t.push(n)}var r=[],l={},o=!1;do{o=!1;for(var s=0;s<t.length;++s){var u=t[s];if(!(u.rule.id in l)){var d=!0;if(u.rule.dependencies&&u.rule.dependencies.length>0)for(var c=0,m=u.rule.dependencies;c<m.length;c++)m[c]in l||(d=!1);d&&(o=!0,r.push(u),l[u.rule.id]=!0,t.splice(s--,1))}}}while(o);return r},e}();t.Engine=m},4516(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;var i=function(){function e(){}return e.DEBUG=!1,e.helpRoot="https://able.ibm.com/rules/archives",e}();t.Config=i},7507(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.DOMMapper=void 0;var r=i(3103),l=i(4566),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getRole=function(e){return e.nodeName.toLowerCase()},t.prototype.getNamespace=function(){return"dom"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=0;a<i.attributes.length;++a){var n=i.attributes[a];t[n.name.toLowerCase()]=n.nodeValue}return t},t.prototype.getBounds=function(e){if(1!==e.nodeType)return null;var t=l.CacheUtil.getCache(e,"DOMMapper_Bounds",void 0);if(void 0!==t)return t;var i=1;e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.devicePixelRatio&&(i=e.ownerDocument.defaultView.devicePixelRatio);var a=e.getBoundingClientRect();if(a){var n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,r=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,o={left:Math.ceil((a.left+n)*i),top:Math.ceil((a.top+r)*i),height:Math.ceil(a.height*i),width:Math.ceil(a.width*i)};return l.CacheUtil.setCache(e,"DOMMapper_Bounds",o),o}return null},t.prototype.getUnadjustedBounds=function(e){if(1!==e.nodeType)return null;var t=l.CacheUtil.getCache(e,"DOMMapper_UnadjustedBounds",void 0);if(void 0!==t)return t;var i=e.getBoundingClientRect();if(i){var a=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,r={left:Math.ceil(i.left+a),top:Math.ceil(i.top+n),height:Math.ceil(i.height),width:Math.ceil(i.width)};return l.CacheUtil.setCache(e,"DOMMapper_UnadjustedBounds",r),r}return null},t}(r.CommonMapper);t.DOMMapper=o},1686(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMUtil=void 0;var a=i(3864),n=function(){function e(){}return e.hasParent=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName);)i=a.DOMWalker.parentElement(i);return!!i},e.getAncestor=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName.toLowerCase());)i=a.DOMWalker.parentElement(i);return i},e.sameNode=function(e,t){return e===t||(e.isSameNode?e.isSameNode(t):!e.compareDocumentPosition||0===e.compareDocumentPosition(t))},e.cleanWhitespace=function(e){return e.replace(/[ \t\r\n]/g," ").replace(/ +/g," ")},e.cleanSpace=function(e){return e.replace(/ +/g," ")},e.isInSameTable=function(t,i){if(t&&i){var a=["table"],n=e.getAncestor(t,a),r=e.getAncestor(i,a);if(null!==n&&null!=r&&e.sameNode(n,r))return!0}return!1},e.shadowRootNode=function(e){for(var t=e;null!=t&&11!==t.nodeType;)t=t.parentNode;return t},e.objectCopyWithNodeRefs=function(e){if(!e)return e;if("object"!=typeof e)return"function"==typeof e?e:JSON.parse(JSON.stringify(e));if(e instanceof Node||e.nodeType)return e;var t=void 0;if("Array"===e.constructor.name){t=[];for(var i=0,a=e;i<a.length;i++){var n=a[i];t.push(this.objectCopyWithNodeRefs(n))}}else for(var r in t={},e)t[r]=this.objectCopyWithNodeRefs(e[r]);return t},e.getAncestorWithAttribute=function(e,t,i){for(var n=a.DOMWalker.parentNode(e);null!==n;){if(1===n.nodeType&&n.getAttribute(t)===i)return n;n=a.DOMWalker.parentNode(n)}return null},e}();t.DOMUtil=n},3864(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMWalker=void 0;var a=i(3946),n=function(){function e(e,t,i,a,n){this.DEBUGIDX=0,this.indent=0,this.DEBUG=!!n,this.root=i||(e&&e.ownerDocument?e.ownerDocument.documentElement:e),9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,9===this.node.nodeType&&(this.node=this.node.documentElement),this.bEndTag=null!=t&&1==t,this.considerHidden=a||!1}return e.prototype.elem=function(){return 1===this.node.nodeType&&this.node||null},e.parentNode=function(e){if(null===e)return null;var t=e.parentNode;return e.slotOwner?t=e.slotOwner:e.ownerElement?t=e.ownerElement:t&&11===t.nodeType&&(t=t.host?t.host:null),t},e.parentElement=function(t){var i=t;do{i=e.parentNode(i)}while(i&&1!==i.nodeType);return i},e.assignSlots=function(e){for(var t=e.querySelectorAll("slot"),i=0;i<t.length;++i)for(var a=t[i],n=a.assignedNodes(),r=0;r<n.length;++r)n[r].slotOwner=a,n[r].slotIndex=r},e.firstChildNotOwnedBySlot=function(e){for(var t=e.firstChild;t&&t.slotOwner;)t=t.nextSibling;return t},e.lastChildNotOwnedBySlot=function(e){for(var t=e.lastChild;t&&t.slotOwner;)t=t.previousSibling;return t},e.nextSiblingNotOwnedBySlot=function(e){for(var t=e.nextSibling;t&&t.slotOwner;)t=t.nextSibling;return t},e.previousSiblingNotOwnedBySlot=function(e){for(var t=e.previousSibling;t&&t.slotOwner;)t=t.previousSibling;return t},e.prototype.atRoot=function(){return!this.node.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var t=this,i=function(){for(var e="",i=0;i<t.indent;++i)e+=" ";return e},n=this.node.nodeName;if(!this.node)return this.bEndTag=!1,!1;do{if(this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var r=this.node.slotOwner,l=this.node.slotIndex+1;l<r.assignedNodes().length?(this.node=r.assignedNodes()[l],this.bEndTag=!1):(this.node=r,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(e.nextSiblingNotOwnedBySlot(this.node))this.node=e.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!0}}else{var o=this.node,s=this.node,u=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(o))&&o.contentDocument&&o.contentDocument.documentElement){var d=this.node;this.node=o.contentDocument.documentElement,this.node.ownerElement=d}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(s))&&s.shadowRoot&&s.shadowRoot.firstChild?(d=this.node,this.node=s.shadowRoot,this.node.ownerElement=d,e.assignSlots(this.node)):1===this.node.nodeType&&"slot"===s.nodeName.toLowerCase()&&u.assignedNodes().length>0?this.node=u.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!e.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=e.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return this.bEndTag&&(this.indent-=2),this.DEBUG&&console.log(i()+"<".concat(this.bEndTag?"/":"").concat(this.node.nodeName,"> (from ").concat(n,") ").concat(this.DEBUGIDX++)),this.DEBUG&&this.node.slotOwner&&console.log(i()+"slotOwner: ".concat(this.node.slotOwner.nodeName)),this.DEBUG&&this.node.slotIndex&&console.log(i()+"slotIndex: ".concat(this.node.slotIndex)),this.DEBUG&&this.node.ownerElement&&console.log(i()+"ownerElement: ".concat(this.node.ownerElement.nodeName)),this.bEndTag||(this.indent+=2),!0},e.prototype.prevNode=function(){do{if(this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(t))&&t.contentDocument&&t.contentDocument.documentElement){var n=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=n}else if(1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(i))&&i.shadowRoot&&i.shadowRoot.lastChild)n=this.node,this.node=i.shadowRoot,this.node.ownerElement=n,e.assignSlots(this.node);else if(1===this.node.nodeType&&"slot"===i.nodeName.toLowerCase()&&i.assignedNodes().length>0){var r=i;this.node=r.assignedNodes()[r.assignedNodes().length-1]}else 1!==this.node.nodeType&&11!==this.node.nodeType||!e.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=e.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(this.node.slotOwner){var l=this.node.slotOwner,o=this.node.slotIndex-1;o>=0?(this.node=l.assignedNodes()[o],this.bEndTag=!0):(this.node=l,this.bEndTag=!1)}else if(e.previousSiblingNotOwnedBySlot(this.node))this.node=e.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return!0},e}();t.DOMWalker=n},8601(e,t){var i,a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eGuidelineType=t.eGuidelineCategory=t.eToolkitLevel=void 0,(n=t.eToolkitLevel||(t.eToolkitLevel={})).LEVEL_ONE="1",n.LEVEL_TWO="2",n.LEVEL_THREE="3",n.LEVEL_FOUR="4",(a=t.eGuidelineCategory||(t.eGuidelineCategory={})).ACCESSIBILITY="Accessibility",a.DESIGN="Design",a.OTHER="Other",(i=t.eGuidelineType||(t.eGuidelineType={})).DEFAULT="default",i.EXTENSION="extension"},461(e,t,i){var a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eRulesetType=t.eRuleCategory=t.eToolkitLevel=t.RuleManual=t.RulePotential=t.RuleFail=t.RuleRender=t.RulePass=t.eRulePolicy=t.eRuleConfidence=void 0,function(e){e.PASS="PASS",e.FAIL="FAIL",e.POTENTIAL="POTENTIAL",e.MANUAL="MANUAL"}(a=t.eRuleConfidence||(t.eRuleConfidence={})),function(e){e.VIOLATION="VIOLATION",e.RECOMMENDATION="RECOMMENDATION",e.INFORMATION="INFORMATION"}(n=t.eRulePolicy||(t.eRulePolicy={})),t.RulePass=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleRender=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:0,messageArgs:t||[],apiArgs:i||[]}},t.RuleFail=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.FAIL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RulePotential=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.POTENTIAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleManual=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.MANUAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}};var r=i(8601);Object.defineProperty(t,"eToolkitLevel",{enumerable:!0,get:function(){return r.eToolkitLevel}});var l=i(8601);Object.defineProperty(t,"eRuleCategory",{enumerable:!0,get:function(){return l.eGuidelineCategory}});var o=i(8601);Object.defineProperty(t,"eRulesetType",{enumerable:!0,get:function(){return o.eGuidelineType}})},7412(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.Checker=void 0;var l=i(461),o=i(7301),s=i(9955),u=i(6160),d=r(i(591)),c=i(8601),m=[],p={},h={};!function(){var e=JSON.parse(JSON.stringify(o.Engine.getLanguages()));for(var t in e.push("en-US"),d){var i=d[t];m.push(i);for(var a=e.length-1;a>=0;--a){var n=e[a];if(n in i.messages&&(p[i.id]=i.messages[n],p[i.id][0]=p[i.id].group),n in i.help){for(var r in h[i.id]={},i.help[n])h[i.id][r]="/".concat(n,"/").concat(i.help[n][r]);p[i.id][0]=p[i.id].group}}for(var l=0,s=i.rulesets;l<s.length;l++)for(var c=s[l],g=0,b=u.a11yRulesets;g<b.length;g++){var _=b[g];if(("string"==typeof c.id?[c.id]:c.id).includes(_.id))for(var f=0,v=_.checkpoints;f<v.length;f++){var A=v[f];("string"==typeof c.num?[c.num]:c.num).includes(A.num)&&(A.rules=A.rules||[],A.rules.push({id:i.id,reasonCodes:c.reasonCodes,level:c.level,toolkitLevel:c.toolkitLevel}))}}}}();var g=function(){function e(){this.guidelines=[],this.rulesets=this.guidelines,this.rulesetIds=[],this.rulesetRules={},this.ruleLevels={},this.ruleReasonLevels={},this.ruleCategory={};var e=this.engine=new o.Engine;e.addMapper(new s.ARIAMapper),e.addRules(m),e.addNlsMap(p),e.addHelpMap(h);for(var t=0,i=u.a11yRulesets;t<i.length;t++){var a=i[t];this.addRuleset(a)}}return e.prototype.addGuideline=function(e){e.id in this.rulesetRules&&this.removeGuideline(e.id),this.guidelines.push(e),this.rulesetIds.push(e.id);for(var t=[],i=0,a=e.checkpoints;i<a.length;i++){var n=a[i];n.rules=n.rules||[];for(var r=0,l=n.rules;r<l.length;r++){var o=l[r];if(!1!==o.enabled){t.push(o.id),this.ruleReasonLevels[o.id]=this.ruleReasonLevels[o.id]||{},this.ruleReasonLevels[o.id][e.id]=this.ruleReasonLevels[o.id][e.id]||{};var s=o.reasonCodes?o.reasonCodes.join("--"):"None";this.ruleReasonLevels[o.id][e.id][s]=o.level,this.ruleCategory[o.id]=this.ruleCategory[o.id]||{},this.ruleCategory[o.id][e.id]=e.category}}}this.rulesetRules[e.id]=t},e.prototype.enableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,r=0,l=a.checkpoints;r<l.length;r++)for(var o=0,s=l[r].rules;o<s.length;o++){var u=s[o];!1===u.enabled&&(n=!0,delete u.enabled)}n&&this.addGuideline(a)}},e.prototype.disableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,r=0,l=a.checkpoints;r<l.length;r++)for(var o=0,s=l[r].rules;o<s.length;o++){var u=s[o];!1!==u.enabled&&(n=!0,u.enabled=!1)}n&&this.addGuideline(a)}},e.prototype.removeGuideline=function(e){e in this.rulesetRules&&(delete this.rulesetRules[e],this.rulesets=this.guidelines=this.guidelines.filter(function(t){return t.id!==e}),this.rulesetIds=this.getGuidelineIds())},e.prototype.getGuidelines=function(){return JSON.parse(JSON.stringify(this.guidelines))},e.prototype.getGuidelineIds=function(){return this.guidelines.map(function(e){return e.id})},e.prototype.addRuleset=function(e){this.addGuideline(e)},e.prototype.enableSourceMap=function(e){this.engine.enableSourceMap(e)},e.prototype.isSourceMapEnabled=function(){return this.engine.isSourceMapEnabled()},e.prototype.check=function(e,t){var i=[];if(t){"string"==typeof t&&(t=[t]);for(var a=0,n=t;a<n.length;a++){var r=n[a];r in this.rulesetRules&&(i=i.concat(this.rulesetRules[r]))}}else i=this.engine.getRulesIds();this.engine.enableRules(i);var l=this;return this.engine.run(e).then(function(e){e.nls={};for(var i=0,a=e.results;i<a.length;i++){var n=a[i];n.ruleId in p&&(e.nls[n.ruleId]=e.nls[n.ruleId]||{0:p[n.ruleId][0]},n.reasonId in p[n.ruleId]&&(e.nls[n.ruleId][n.reasonId]=p[n.ruleId][n.reasonId]));var r=n.reasonId?n.reasonId:"None";n.value[0]=l.getReasonLevel(t,n.ruleId,r),n.category=l.getCategory(t,n.ruleId),delete n.path.css}return e})},e.prototype.getLevel=function(e,t){if(!e)return l.eRulePolicy.INFORMATION;var i=this.ruleLevels[t],a=null;if(e){if(!(t in this.ruleLevels))throw new Error("Rule triggered for which we have no rule level information: "+t);for(var n=0,r=e;n<r.length;n++){var o=r[n];o in i&&(i[o]===l.eRulePolicy.VIOLATION?a=l.eRulePolicy.VIOLATION:i[o]===l.eRulePolicy.RECOMMENDATION&&null===a?a=l.eRulePolicy.RECOMMENDATION:null===a&&(a=l.eRulePolicy.INFORMATION))}}if(null===a)throw new Error("Rule triggered for which we have no rule level information: "+t);return a},e.prototype.getReasonLevel=function(e,t,i){if(!e)return l.eRulePolicy.INFORMATION;var a=this.ruleReasonLevels[t],n=null;if(e){if(!(t in this.ruleReasonLevels))throw new Error("Rule triggered for which we have no rule level information "+t);for(var r=function(e){if(e in a){var t=new RegExp("(^|--)".concat(i,"($|--)"));Object.keys(a[e]).forEach(function(i){var r=null;"None"===i?r=a[e].None:t.test(i)&&(r=a[e][i]),null!==r&&(r===l.eRulePolicy.VIOLATION?n=l.eRulePolicy.VIOLATION:r===l.eRulePolicy.RECOMMENDATION&&null===n?n=l.eRulePolicy.RECOMMENDATION:null===n&&(n=l.eRulePolicy.INFORMATION))}),null===n&&(n=l.eRulePolicy.INFORMATION)}},o=0,s=e;o<s.length;o++)r(s[o])}if(null===n)throw new Error("Rule triggered for which we have no rule level information: "+t);return n},e.prototype.getCategory=function(e,t){var i=this.ruleCategory[t];if(!(t in this.ruleCategory))return c.eGuidelineCategory.OTHER;e||(e=this.getGuidelineIds());for(var a=0,n=e;a<n.length;a++){var r=n[a];if(r in i)return i[r]}return c.eGuidelineCategory.OTHER},e}();t.Checker=g},2297(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_target_warning=void 0;var a=i(7139),n=i(3946),r=i(5279),l=i(461),o=i(461);t.a_target_warning={id:"a_target_warning",context:"dom:a[target],dom:area[target],dom:base[target]",refactor:{WCAG20_A_TargetAndText:{Pass_0:"pass",Potential_1:"potential_warn"}},help:{"en-US":{group:"a_target_warning.html",pass:"a_target_warning.html",potential_warn:"a_target_warning.html"}},messages:{"en-US":{group:"Users should be warned in advance if their input action will open a new window",pass:"The user is warned in advance that the input action opens a new window",potential_warn:"Inform the user when their input action will open a new window"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.2.2",level:o.eRulePolicy.RECOMMENDATION,toolkitLevel:o.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var o=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(o)&&!a.CommonUtil.isTabbable(o))return null;var s={paramWinText:{value:["new window","new tab"],type:"array"}},u=o.getAttribute("target"),d="_parent"==u||"_self"==u||"_top"==u||null!=a.CommonUtil.getFrameByName(o,u);if(!d){var c=a.CommonUtil.getInnerText(o);if(o.hasAttribute("title")&&(c+=" "+o.getAttribute("title")),o.hasAttribute("aria-describedby"))for(var m=0,p=o.getAttribute("aria-describedby").trim().split(/\s+/);m<p.length;m++){var h=p[m],g=r.FragmentUtil.getById(o,h);if(g){var b=a.CommonUtil.getInnerText(g);b&&b.trim().length>0&&(c+=" "+b)}}for(var _=0;!d&&_<s.paramWinText.value.length;++_)-1!=c.indexOf(s.paramWinText.value[_])&&(d=!0)}return d?(0,l.RulePass)("pass"):(0,l.RulePotential)("potential_warn")}}},4401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_text_purpose=void 0;var a=i(461),n=i(7139),r=i(3946),l=i(461),o=i(1950);t.a_text_purpose={id:"a_text_purpose",context:"aria:link,aria:doc-biblioref",refactor:{WCAG20_A_HasText:{Pass_0:"pass",Fail_1:"fail_acc_name"}},help:{"en-US":{group:"a_text_purpose.html",pass:"a_text_purpose.html",fail_acc_name:"a_text_purpose.html"}},messages:{"en-US":{group:"Hyperlinks must have an accessible name for their purpose",pass:"Hyperlink has a description of its purpose",fail_acc_name:"Hyperlink has no link text, label or image with a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["2.4.4","4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:"c487ae",run:function(e,t){var i=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(i)||n.CommonUtil.isNodeDisabled(i))return null;var l=o.AccNameUtil.computeAccessibleName(i);return l&&l.name&&l.name.trim().length>0||n.CommonUtil.nonTabableChildCheck(i)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},4546(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.applet_alt_exists=void 0;var a=i(7139),n=i(3946),r=i(461),l=i(461);t.applet_alt_exists={id:"applet_alt_exists",context:"dom:applet",refactor:{WCAG20_Applet_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"applet_alt_exists.html",Pass_0:"applet_alt_exists.html",Fail_1:"applet_alt_exists.html",Fail_2:"applet_alt_exists.html",Fail_3:"applet_alt_exists.html"}},messages:{"en-US":{group:"<applet> elements must provide an 'alt' attribute and an alternative description",Pass_0:"Rule Passed",Fail_1:"An <applet> element does not have an 'alt' attribute that provides a short text alternative",Fail_2:"The 'alt' attribute value for an <applet> element duplicates the 'code' attribute",Fail_3:"An <applet> element provides alternative text, but does not provide inner content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;if(a.CommonUtil.attributeNonEmpty(l,"alt")){var o=l.getAttribute("alt").trim();return l.hasAttribute("code")&&o==l.getAttribute("code").trim()?(0,r.RuleFail)("Fail_2"):a.CommonUtil.hasInnerContentHidden(l)?(0,r.RulePass)("Pass_0"):(0,r.RuleFail)("Fail_3")}return(0,r.RuleFail)("Fail_1")}}},9292(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.application_content_accessible=void 0;var a=i(7011),n=i(3946),r=i(461),l=i(461);t.application_content_accessible={id:"application_content_accessible",context:"aria:application",refactor:{HAAC_Application_Role_Text:{0:"HAAC_Application_Role_Text.html",Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{0:"application_content_accessible.html",Pass_0:"application_content_accessible.html",Potential_1:"application_content_accessible.html"}},messages:{"en-US":{group:'Non-decorative static text and image content within an element with "application" role must be accessible',Pass_0:"Rule Passed",Potential_1:'Verify that the non-decorative static text and image content within an element with "application" role are accessible'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.1.1","2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){for(var l=!0,o=e.dom.node.childNodes,s=0;l&&s<o.length;s++)1===o[s].nodeType?n.VisUtil.isNodeVisible(o[s])&&(l=a.AriaUtil.hasRoleInSemantics(o[s],"document")||a.AriaUtil.hasRoleInSemantics(o[s],"article")):3===o[s].nodeType&&(l=0===o[s].nodeValue.trim().length);return l?(0,r.RulePass)("Pass_0"):(0,r.RulePotential)("Potential_1")}}},9605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.area_alt_exists=void 0;var a=i(7139),n=i(3946),r=i(461),l=i(461);t.area_alt_exists={id:"area_alt_exists",context:"dom:area",refactor:{WCAG20_Area_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"area_alt_exists.html",Pass_0:"area_alt_exists.html",Fail_1:"area_alt_exists.html"}},messages:{"en-US":{group:"<area> elements in an image map must have a text alternative",Pass_0:"Rule Passed",Fail_1:"<area> element in an image map has no text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.VisUtil.isNodeHiddenFromAT(l)?null:a.CommonUtil.attributeNonEmpty(l,"alt")?(0,r.RulePass)("Pass_0"):(0,r.RuleFail)("Fail_1")}}},3987(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_accessiblename_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946),o=i(1950),s=i(9910);t.aria_accessiblename_exists={id:"aria_accessiblename_exists",context:"aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example",help:{"en-US":{pass:"aria_accessiblename_exists.html",fail_no_accessible_name:"aria_accessiblename_exists.html",fail_no_accessible_name_image:"aria_accessiblename_exists.html",group:"aria_accessiblename_exists.html"}},messages:{"en-US":{pass:"An accessible name is provided for the element",fail_no_accessible_name:'Element <{0}> with "{1}" role has no accessible name',fail_no_accessible_name_image:'Element <{0}> with "{1}" role has no accessible name',group:"Elements with certain roles should have accessible names"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name_image"]}],act:[{"23a2a8":{fail_no_accessible_name_image:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var u=n.nodeName.toLocaleLowerCase();if("svg"!==u&&"img"!==u){if("table"===u&&n.firstElementChild&&"caption"===n.firstElementChild.nodeName.toLowerCase()&&n.firstElementChild.textContent&&n.firstElementChild.textContent.trim().length>0)return(0,a.RulePass)("pass");var d=r.AriaUtil.getRolesUndefinedByAria(n);if(d&&d.length>0)return null;var c=r.AriaUtil.getDeprecatedAriaRoles(n);if(c&&c.length>0)return null;var m=r.AriaUtil.getDeprecatedAriaAttributes(n);if(m&&m.length>0)return null;var p=r.AriaUtil.getResolvedRole(n);if(!p||!s.ARIADefinitions.designPatterns[p]||!s.ARIADefinitions.designPatterns[p].nameRequired)return null;var h=o.AccNameUtil.computeAccessibleName(n);return h&&h.name&&0!==h.name.trim().length?(0,a.RulePass)("pass"):"img"===p||"image"===p?(0,a.RuleFail)("fail_no_accessible_name_image",[n.nodeName.toLowerCase(),p]):(0,a.RuleFail)("fail_no_accessible_name",[n.nodeName.toLowerCase(),p])}}}},8631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_tabindex_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.aria_activedescendant_tabindex_valid={id:"aria_activedescendant_tabindex_valid",context:"dom:*[aria-activedescendant]",refactor:{Rpt_Aria_InvalidTabindexForActivedescendant:{pass:"pass",Fail_1:"Fail_1"}},help:{"en-US":{pass:"aria_activedescendant_tabindex_valid.html",Fail_1:"aria_activedescendant_tabindex_valid.html",group:"aria_activedescendant_tabindex_valid.html"}},messages:{"en-US":{pass:"Rule Passed",Fail_1:"The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable",group:"Element using 'aria-activedescendant' property should be tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!1,o=n.nodeName.toLowerCase();if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if(r.CommonUtil.isNodeDisabled(n))return null;if(0!==n.getAttribute("aria-activedescendant").trim().length){(l=r.CommonUtil.isTabbable(n))||(l=r.CommonUtil.getTabbableChildren(n)>0);var s=new Array;s.push(o);var u=new Array;return u.push(n.getAttribute("aria-activedescendant").split(" ").join(", ")),l?(0,a.RulePass)("pass"):(0,a.RuleFail)("Fail_1",[s.toString(),u.toString()])}}}},8025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(3946),u=i(1686);t.aria_activedescendant_valid={id:"aria_activedescendant_valid",context:"dom:*[aria-activedescendant]",refactor:{HAAC_ActiveDescendantCheck:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"aria_activedescendant_valid.html",Fail_1:"aria_activedescendant_valid.html",Fail_2:"aria_activedescendant_valid.html",Fail_3:"aria_activedescendant_valid.html",group:"aria_activedescendant_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'aria-activedescendant' property is empty",Fail_2:"The 'aria-activedescendant' property references a hidden node",Fail_3:"Element is not a combobox, and the referenced active-descendant element is not a valid descendant",group:"The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.AriaUtil.hasRoleInSemantics(n,"combobox"))return null;var d=r.AriaUtil.getAriaAttribute(n,"aria-activedescendant");if(!d||""===d.trim())return(0,a.RuleFail)("Fail_1");var c=o.FragmentUtil.getById(n,d.trim());if(!c||u.DOMUtil.sameNode(d,n))return null;if(!s.VisUtil.isNodeVisible(c))return(0,a.RuleFail)("Fail_2");if(n.contains(c))return(0,a.RulePass)("Pass_0");var m=2;if(n.hasAttribute("aria-owns"))for(var p=l.CommonUtil.normalizeSpacing(n.getAttribute("aria-owns").trim()).split(" "),h=0;h<p.length;h++)if((v=o.FragmentUtil.getById(n,p[h]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0");if(r.AriaUtil.hasRoleInSemantics(n,"textbox")&&n.hasAttribute("aria-controls")){m=3;var g=l.CommonUtil.normalizeSpacing(n.getAttribute("aria-controls").trim()).split(" ");for(h=0;h<g.length;h++){var b=o.FragmentUtil.getById(n,g[h]);if(b&&!u.DOMUtil.sameNode(b,n)&&b.contains(c))return(0,a.RulePass)("Pass_0");if(b.hasAttribute("aria-owns"))for(var _=l.CommonUtil.normalizeSpacing(b.getAttribute("aria-owns").trim()).split(" "),f=0;f<_.length;f++){var v;if((v=o.FragmentUtil.getById(n,_[f]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0")}}}return 3==m?(0,a.RuleFail)("Fail_3"):null}}},1198(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_application_label_unique={id:"aria_application_label_unique",context:"aria:application",refactor:{Rpt_Aria_MultipleApplicationLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_application_label_unique.html",fail_label_not_unique:"aria_application_label_unique.html",group:"aria_application_label_unique.html"}},messages:{"en-US":{pass:'The element with "application" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "application" role do not have unique labels',group:'Each element with "application" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"application");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8001(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_labelled=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.aria_application_labelled={id:"aria_application_labelled",context:"aria:application",refactor:{Rpt_Aria_ApplicationLandmarkLabel:{Pass_0:"pass",Fail_1:"fail_no_label"}},help:{"en-US":{pass:"aria_application_labelled.html",fail_no_label:"aria_application_labelled.html",group:"aria_application_labelled.html"}},messages:{"en-US":{pass:'The element with "application" role has a label that describes its purpose',fail_no_label:'Element with "application" role does not have a label',group:'Each element with "application" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_label")}}},5778(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_article_label_unique=void 0;var a=i(461),n=i(461),r=i(3946),l=i(7011);t.aria_article_label_unique={id:"aria_article_label_unique",context:"aria:article",refactor:{Rpt_Aria_MultipleArticleRoles_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_article_label_unique.html",fail_label_not_unique:"aria_article_label_unique.html",group:"aria_article_label_unique.html"}},messages:{"en-US":{pass:'The element with "article" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "article" role do not have unique labels',group:'Each element with "article" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"article");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8118(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_allowed=void 0;var a=i(461),n=i(461),r=i(9910),l=i(7011);t.aria_attribute_allowed={id:"aria_attribute_allowed",context:"dom:*",refactor:{Rpt_Aria_ValidProperty:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_allowed.html",Pass_0:"aria_attribute_allowed.html",Fail_1:"aria_attribute_allowed.html"}},messages:{"en-US":{group:"ARIA attributes must be valid for the element's role",Pass_0:"Rule Passed",Fail_1:"The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"5f99a7",run:function(e,t,i){var n=e.dom.node,o=n.attributes;if(o){for(var s=r.ARIADefinitions.propertyDataTypes,u="",d=0,c=0,m=o.length;c<m;c++){var p=o[c].name;l.AriaUtil.isDefinedAriaAttribute(n,p)&&(d++,s[p]||(u=0==u.length?p:u+", "+p))}return 0==d?null:0!=u.length?(0,a.RuleFail)("Fail_1",[u,n.nodeName.toLowerCase()]):(0,a.RulePass)("Pass_0")}return null}}},2242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_conflict=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.aria_attribute_conflict={id:"aria_attribute_conflict",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{fail_conflict:"aria_attribute_conflict.html",group:"aria_attribute_conflict.html"}},messages:{"en-US":{fail_conflict:'The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"',group:"An ARIA attribute must not conflict with the corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.AriaUtil.getInvalidAriaAttributes(n);if(o&&o.length>0)return null;var s=[],u=r.AriaUtil.getUserDefinedAriaAttributes(n);if(!u||0===u.length)return null;for(var d=r.AriaUtil.getConflictAriaAndHtmlAttributes(n),c=0;c<d.length;c++)s.push((0,a.RuleFail)("fail_conflict",[d[c].ariaAttr,d[c].htmlAttr])),u.includes(d[c].ariaAttr)&&l.CommonUtil.reduceArrayItemList([d[c].ariaAttr],u);return s.length>0?s:null}}},3673(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_deprecated=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_attribute_deprecated={id:"aria_attribute_deprecated",context:"dom:*",help:{"en-US":{fail_aria_role:"aria_attribute_deprecated.html",fail_aria_attr:"aria_attribute_deprecated.html",fail_role_attr:"aria_attribute_deprecated.html",group:"aria_attribute_deprecated.html"}},messages:{"en-US":{fail_aria_role:'The ARIA role "{0}" is deprecated in the ARIA specification',fail_aria_attr:'The ARIA attributes "{0}" are deprecated in the ARIA specification',fail_role_attr:'The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification',group:"No deprecated ARIA role or attribute should be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=[],o=r.AriaUtil.getDeprecatedAriaRoles(n);if(o&&o.length>0)for(var s=0;s<o.length;s++)l.push((0,a.RuleFail)("fail_aria_role",[o[s]]));var u=r.AriaUtil.getDeprecatedAriaAttributes(n);if(u&&u.length>0)for(s=0;s<u.length;s++)"any"===u[s].role?l.push((0,a.RuleFail)("fail_aria_attr",[u[s].attribute])):l.push((0,a.RuleFail)("fail_role_attr",[u[s].attribute,u[s].role]));return l.length>0?l:null}}},5080(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3946);t.aria_attribute_exists={id:"aria_attribute_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_EmptyPropertyValue:{pass:"pass",fail_empty_attribute:"fail_empty_attribute"}},help:{"en-US":{pass:"aria_attribute_exists.html",fail_empty_attribute:"aria_attribute_exists.html",group:"aria_attribute_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_empty_attribute:"The element attribute(s): '{0}' value is empty",group:"When specifying a required ARIA attribute, the value must not be empty"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["6a7281"],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)){var u=new Array,d=o.ARIADefinitions.designPatterns,c=l.CommonUtil.hasAttribute,m=0,p=r.AriaUtil.getResolvedRole(n);if(p){if(d[p]&&null!=r.AriaUtil.getRoleRequiredProperties(p,n))for(var h=r.AriaUtil.getRoleRequiredProperties(p,n),g=0,b=h.length;g<b;g++)c(n,w=h[g])?(m++,0==l.CommonUtil.normalizeSpacing(n.getAttribute(h[g])).length&&u.push(h[g])):"aria-labelledby"==h[g]?"radiogroup"==p&&c(n,"aria-label")&&(m++,0==l.CommonUtil.normalizeSpacing(n.getAttribute("aria-label")).length&&u.push("aria-label")):"aria-valuenow"==h[g]&&"progressbar"==p&&c(n,"aria-valuetext")&&(m++,0==l.CommonUtil.normalizeSpacing(n.getAttribute("aria-valuetext")).length&&u.push("aria-valuetext"));if(d[p]){var _=r.AriaUtil.getElementAriaProperty(n),f=[];f.push(p);for(var v=r.AriaUtil.getAllowedAriaAttributes(n,f,_),A=(g=0,v.length);g<A;g++){var w;"aria-checked"!=(w=v[g])&&"aria-selected"!=w&&"aria-expanded"!=w&&"aria-orientation"!=w&&"aria-level"!=w||c(n,w)&&(m++,0!=l.CommonUtil.normalizeSpacing(n.getAttribute(w)).length||u.includes(w)||u.push(w))}}var y=new Array,C=0==u.length;return y.push(u.join(", ")),0==m?null:C?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_empty_attribute",y)}}}}},183(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_redundant=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_attribute_redundant={id:"aria_attribute_redundant",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{pass:"aria_attribute_redundant.html",fail_redundant:"aria_attribute_redundant.html",group:"aria_attribute_redundant.html"}},messages:{"en-US":{pass:"The ARIA attribute is not redundant with a corresponding HTML attribute",fail_redundant:'The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"',group:"An ARIA attribute should not be redundant with a corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.AriaUtil.getInvalidAriaAttributes(n);if(l&&l.length>0)return null;var o=r.AriaUtil.getConflictAriaAndHtmlAttributes(n);if(o&&o.length>0)return null;var s=n.attributes,u=[],d=[];if(s)for(var c=0;c<s.length;c++){var m=s[c].name.trim().toLowerCase(),p=n.getAttribute(m);""===p&&(p=null),"aria-"===m.substring(0,5)?u.push({name:m,value:p}):d.push({name:m,value:p})}var h=[],g=function(e){var t=r.AriaUtil.getConflictOrOverlappingHtmlAttribute(u[e],d,"overlapping");if(null===t)return"continue";t.forEach(function(t){"Pass"===t.result?h.push((0,a.RulePass)("pass")):"Failed"===t.result&&h.push((0,a.RuleFail)("fail_redundant",[u[e].name,t.attr]))})};for(c=0;c<u.length;c++)g(c);return h.length>0?h:null}}},6805(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_required=void 0;var a=i(9910),n=i(7011),r=i(7139),l=i(461),o=i(461);t.aria_attribute_required={id:"aria_attribute_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredProperties:{Pass_0:"pass",Fail_1:"fail_missing"}},help:{"en-US":{group:"aria_attribute_required.html",pass:"aria_attribute_required.html",fail_missing:"aria_attribute_required.html"}},messages:{"en-US":{group:"The required attributes for the element with a role must be defined",pass:"The required attributes for the element with the role are defined",fail_missing:"Element with '{0}' role does not have the required ARIA attribute(s): '{1}'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:"4e8ab6",run:function(e,t,i){var o=e.dom.node,s=new Array,u=new Array,d=a.ARIADefinitions.designPatterns,c=r.CommonUtil.hasAttribute,m=n.AriaUtil.getElementAriaProperty(o),p=n.AriaUtil.getResolvedRole(o);if(p){var h=n.AriaUtil.getRoleRequiredProperties(p,o);if(d[p]&&null!==h){for(var g=n.AriaUtil.getAllowedAriaAttributes(o,p,m),b=!1,_=0,f=h.length;_<f;_++)g.includes(h[_])&&(c(o,h[_])||("aria-labelledby"==h[_]?c(o,"aria-label")&&"radiogroup"==p||(s.push(h[_]),b=!0):"aria-valuenow"==h[_]?c(o,"aria-valuetext")&&"progressbar"==p||(s.push(h[_]),b=!0):"aria-controls"==h[_]&&"combobox"==p||(s.push(h[_]),b=!0)));1==b&&u.push(p)}if(0==u.length||0==s.length)return(0,l.RulePass)("pass");var v=new Array;return v.push(u.join(", ")),v.push(s.join(", ")),(0,l.RuleFail)("fail_missing",v)}}}},1886(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_value_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910);t.aria_attribute_value_valid={id:"aria_attribute_value_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{Rpt_Aria_ValidPropertyValue:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_value_valid.html",Pass_0:"aria_attribute_value_valid.html",Fail_1:"aria_attribute_value_valid.html"}},messages:{"en-US":{group:"ARIA property values must be valid",Pass_0:"Rule Passed",Fail_1:"The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"6a7281",run:function(e,t,i){var n=e.dom.node,s=new Array,u=new Array,d=new Array,c=o.ARIADefinitions.propertyDataTypes,m=n.attributes,p=0;if(m)for(var h=0,g=m.length;h<g;h++){var b=m[h].name;if(r.AriaUtil.isDefinedAriaAttribute(n,b)){var _=c[b],f=l.CommonUtil.normalizeSpacing(m[h].nodeValue);if(p++,_&&_.values){if(-1==_.values.indexOf(f))if(-1!=_.values.indexOf("undefined")&&0==f.length);else if("http://www.w3.org/2001/XMLSchema#nmtokens"===_.type){var v=m[h].nodeValue.trim().split(" ");if(v.length>1&&v.includes("all"))s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString());else for(var A={},w=0;w<v.length;w++)""==v[w]||_.values.includes(v[w])||(A.hasOwnProperty(b)||(A[b]=!0,u.push(b)),s.push(v[w]),d.push(_.values.toString()))}else s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString())}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#int"===_.type){var y=parseInt(f);(isNaN(y)||""+y!==f)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#decimal"==_.type){var C=parseFloat(f);isNaN(C)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#boolean"==_.type){var k=f.trim().toLowerCase();"true"!==k&&"false"!==k&&(s.push(f),u.push(b))}else _&&_.type&&"http://www.w3.org/2001/XMLSchema#string"==_.type||p--}}var R=new Array,x=0==u.length;return R.push(s.join(", ")),R.push(u.join(", ")),R.push(n.nodeName.toLowerCase()),0==p?null:x?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",R)}}},4078(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_banner_label_unique={id:"aria_banner_label_unique",context:"aria:banner",refactor:{Rpt_Aria_MultipleBannerLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_banner_label_unique.html",fail_label_not_unique:"aria_banner_label_unique.html",group:"aria_banner_label_unique.html"}},messages:{"en-US":{pass:'The element with "banner" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "banner" role do not have unique labels',group:'Each element with "banner" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"banner",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5750(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_single=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_banner_single={id:"aria_banner_single",context:"dom:*[role], dom:header",refactor:{Rpt_Aria_OneBannerInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_single.html",Fail_1:"aria_banner_single.html",group:"aria_banner_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role found on the page',group:'A page, document, or application should only have one element with "banner" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"banner")?null===r.AriaUtil.getSiblingWithRoleHidden(n,"banner",!0,!0)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},85(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_tabbable=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3946);t.aria_child_tabbable={id:"aria_child_tabbable",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingFocusableChild:{pass:"pass",fail_missing_child:"fail_missing_child"}},help:{"en-US":{pass:"aria_child_tabbable.html",fail_missing_child:"aria_child_tabbable.html",group:"aria_child_tabbable.html"}},messages:{"en-US":{pass:"Rule Passed",fail_missing_child:'None of the descendent elements with "{1}" role is tabbable',group:"UI component must have at least one tabbable descendant for keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||l.CommonUtil.isNodeDisabled(n)||r.AriaUtil.containsPresentationalChildrenOnly(n)||r.AriaUtil.shouldBePresentationalChild(n))){if(r.AriaUtil.hasRole(n,{list:!0,row:!0,rowgroup:!0,table:!0,grid:!0}))return null;if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if("datalist"===n.nodeName.toLowerCase())return null;if(r.AriaUtil.isNavigationOwnedOrControlled(n))return null;var u=r.AriaUtil.getResolvedRole(n),d=!0,c=n.ownerDocument,m=l.CommonUtil.hasAttribute,p=new Array,h="",g=!1;if(o.ARIADefinitions.containers.includes(u)&&"true"!=(m(n,"aria-disabled")?n.getAttribute("aria-disabled"):"")&&!m(n,"aria-activedescendant")&&!l.CommonUtil.isTabbable(n)){var b=o.ARIADefinitions.designPatterns[u].reqChildren;if(b){g=!0,d=!1;for(var _="descendant::*[",f=0;f<b.length;f++)_+="@role='"+b[f]+"' or ";_=_.substring(0,_.length-4)+"]";for(var v=c.evaluate(_,n,l.CommonUtil.defaultNSResolver,0,null),A=v.iterateNext();A&&!d;)if(l.CommonUtil.shouldNodeBeSkippedHidden(A))A=v.iterateNext();else{if(!(d=l.CommonUtil.isTabbable(A)))for(var w=c.evaluate("descendant::*",A,l.CommonUtil.defaultNSResolver,0,null),y=w.iterateNext();y&&!d;)l.CommonUtil.shouldNodeBeSkippedHidden(y)||(d=l.CommonUtil.isTabbable(A)),y=w.iterateNext();d||(p=A.getAttribute("role").trim().split(" "),h=A.nodeName.toLowerCase()),A=v.iterateNext()}}}var C=new Array,k=new Array;return h.length>0&&p.length>0?(C.push(h),k.push(p.join(", "))):d=!0,g?d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_missing_child",[C.toString(),k.toString()]):null}}}},514(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_child_valid={id:"aria_child_valid",context:"dom:*",dependencies:["aria_role_valid","aria_descendant_valid"],help:{"en-US":{group:"aria_child_valid.html",Pass:"aria_child_valid.html",Fail_no_child:"aria_child_valid.html",Fail_invalid_child:"aria_child_valid.html"}},messages:{"en-US":{group:"An element with an ARIA role must own a required child",Pass:"An element with an ARIA role owns a required child",Fail_no_child:'The element with role "{0}" does not own any child element with any of the following role(s): "{1}"',Fail_invalid_child:'The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["bc4a75"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)&&!r.AriaUtil.containsPresentationalChildrenOnly(n)){var s=r.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=r.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=["none","presentation"];if(s.some(function(e){return u.includes(e)}))return null;if(s.includes("combobox"))return null;var d=r.AriaUtil.getRequiredChildRoles(n,!0);if(d.includes("group")){var c=d.indexOf("group");c>-1&&d.splice(c,1)}if(0==d.length)return null;var m=r.AriaUtil.getDirectATChildren(n);if(!m||0==m.length){var p=n.getAttribute("aria-busy");return p&&"true"===p?null:((v=new Array).push(s.join(", ")),v.push(d.join(", ")),(0,a.RuleFail)("Fail_no_child",v))}for(var h=new Array,g=0;g<m.length;g++){var b=r.AriaUtil.getRoles(m[g],!1);b&&0!=b.length||(b=r.AriaUtil.getImplicitRole(m[g])),b&&b.length>0&&(b.some(function(e){return d.includes(e)})||h.push(b.join(", ")))}if(h.length>0){for(var _=[],f=0;f<h.length;f++){var v;(v=new Array).push(s.join(", ")),v.push(h[f]),v.push(d.join(", ")),_.push((0,a.RuleFail)("Fail_invalid_child",v))}return _}return(0,a.RulePass)("Pass")}}}},5310(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_complementary_label_unique={id:"aria_complementary_label_unique",context:"aria:complementary",refactor:{Rpt_Aria_MultipleComplementaryLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_complementary_label_unique.html",fail_label_not_unique:"aria_complementary_label_unique.html",group:"aria_complementary_label_unique.html"}},messages:{"en-US":{pass:'The element with "complementary" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "complementary" role do not have unique labels',group:'Each element with "complementary" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"complementary");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},9083(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_complementary_label_visible={id:"aria_complementary_label_visible",context:"dom:*[role], dom:aside",dependencies:["aria_complementary_labelled"],refactor:{Rpt_Aria_ComplementaryLandmarkLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_visible.html",Fail_1:"aria_complementary_label_visible.html",group:"aria_complementary_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a visible label',group:'Each element with "complementary" role should have a visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"complementary")?l.CommonUtil.attributeNonEmpty(n,"aria-labelledby")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},6049(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_labelled=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.aria_complementary_labelled={id:"aria_complementary_labelled",context:"aria:complementary",refactor:{Rpt_Aria_ComplementaryRequiredLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_labelled.html",Fail_1:"aria_complementary_labelled.html",group:"aria_complementary_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a label',group:'Each element with "complementary" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_content_in_landmark=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(4566),s=i(3864),u=i(3946),d=i(9196);t.aria_content_in_landmark={id:"aria_content_in_landmark",context:"dom:*",refactor:{Rpt_Aria_OrphanedContent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_content_in_landmark.html",Fail_1:"aria_content_in_landmark.html",group:"aria_content_in_landmark.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Content is not within a landmark element",group:"All content must reside within an element with a landmark role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=o.CacheUtil.getCache(e.dom.node.ownerDocument,"aria_content_in_landmark",null);if(!n){(n={landmarks:{value:["banner","complementary","contentinfo","form","main","navigation","region","search"],type:"array"},possibleOrphanedWidgets:{value:["button","combobox","checkbox","grid","heading","link","list","listbox","menu","menubar","progressbar","radio","tablist","textbox","toolbar","tree","treegrid"],type:"array"},possibleOrphanedElements:{value:["p","table","input","textarea","select","button","a","ol","ul","dl","h1","h2","h3","h4","h5","h6","embed","object","area"],type:"array"},noLandmarkedRoles:{value:["alert","alertdialog","dialog","tooltip"],type:"array"},mapLandmarks:{},mapPossibleOrphanedWidgets:{},mapPossibleOrphanedElements:{},mapNoLandmarkedRoles:{}}).mapLandmarks={};for(var c=0;c<n.landmarks.value.length;++c)n.mapLandmarks[n.landmarks.value[c]]=!0;for(n.mapPossibleOrphanedWidgets={},c=0;c<n.possibleOrphanedWidgets.value.length;++c)n.mapPossibleOrphanedWidgets[n.possibleOrphanedWidgets.value[c]]=!0;for(n.mapPossibleOrphanedElements={},c=0;c<n.possibleOrphanedElements.value.length;++c)n.mapPossibleOrphanedElements[n.possibleOrphanedElements.value[c]]=!0;for(n.mapNoLandmarkedRoles={},c=0;c<n.noLandmarkedRoles.value.length;++c)n.mapNoLandmarkedRoles[n.noLandmarkedRoles.value[c]]=!0;o.CacheUtil.setCache(e.dom.node.ownerDocument,"aria_content_in_landmark",n)}var m=e.dom.node,p=m.nodeName.toLowerCase();if(!u.VisUtil.isNodeVisible(m)||null!=u.VisUtil.hiddenByDefaultElements&&null!=u.VisUtil.hiddenByDefaultElements&&u.VisUtil.hiddenByDefaultElements.indexOf(p)>-1)return(0,a.RulePass)("Pass_0");if(!l.CommonUtil.hasInnerContentHidden(m)&&-1===["area","input","embed","button","textarea","select"].indexOf(p))return(0,a.RulePass)("Pass_0");if("table"==p&&d.TableUtil.isLayoutTable(m))return null;var h=!0,g=r.AriaUtil.hasRole(m,n.mapPossibleOrphanedWidgets,!0);"link"===p&&(g=!1);var b=p in n.mapPossibleOrphanedElements;if(!g&&!b)return null;if(!(h=i.aria.map(function(e){return e.role}).filter(function(e){return e in n.mapLandmarks}).length>0)){for(var _=s.DOMWalker.parentElement(m);!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=s.DOMWalker.parentElement(_);for(_=m.nextElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.nextElementSibling;for(_=m.previousElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.previousElementSibling;if(h)return null;if(o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent",!0),h=o.CacheUtil.getCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!1)||r.AriaUtil.hasRole(m,n.mapNoLandmarkedRoles,!0)||r.AriaUtil.getAncestorWithRole(m,n.mapNoLandmarkedRoles,!0))return o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!0),null}return h?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2759(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_contentinfo_label_unique={id:"aria_contentinfo_label_unique",context:"aria:contentinfo",refactor:{Rpt_Aria_MultipleContentinfoLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_contentinfo_label_unique.html",fail_label_not_unique:"aria_contentinfo_label_unique.html",group:"aria_contentinfo_label_unique.html"}},messages:{"en-US":{pass:'The element with "contentinfo" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "contentinfo" role do not have unique labels',group:'Each element with "contentinfo" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"contentinfo",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},3141(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_misuse=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_contentinfo_misuse={id:"aria_contentinfo_misuse",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_ContentinfoWithNoMain_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_misuse.html",Fail_1:"aria_contentinfo_misuse.html",group:"aria_contentinfo_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "contentinfo" role is present without an element with "main" role',group:'Each element with "contentinfo" role is only permitted with an element with "main" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"contentinfo")?l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0).length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},5131(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_single=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_contentinfo_single={id:"aria_contentinfo_single",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_single.html",Fail_1:"aria_contentinfo_single.html",group:"aria_contentinfo_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role found on the page',group:'A page, document, or application should only have one element with "contentinfo" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"contentinfo")?r.AriaUtil.getSiblingWithRoleHidden(n,"contentinfo",!0,!0)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0"):null}}},5167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_descendant_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_descendant_valid={id:"aria_descendant_valid",context:"dom:*",dependencies:["aria_role_valid"],help:{"en-US":{group:"aria_descendant_valid.html",pass:"aria_descendant_valid.html",potential_child_implicit_role:"aria_descendant_valid.html",recommendation_no_impact_role:"aria_descendant_valid.html",fail_child_explicit_role:"aria_descendant_valid.html"}},messages:{"en-US":{group:"Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements",pass:"The element contains valid descendants",potential_child_implicit_role:'The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers',recommendation_no_impact_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers',fail_child_explicit_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["pass","potential_child_implicit_role","fail_child_explicit_role"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["recommendation_no_impact_role"]}],act:["307n5z"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)&&r.AriaUtil.containsPresentationalChildrenOnly(n)){var s=r.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=r.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=r.AriaUtil.getDirectATChildren(n);if(!(u&&u.length>0))return(0,a.RulePass)("pass");for(var d=new Array,c=new Array,m=new Array,p=0;p<u.length;p++){var h=u[p].nodeName.toLowerCase();if("img"!==h&&"svg"!==h){var g=r.AriaUtil.getRoles(u[p],!1);g&&g.length>0?(g.includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),d.push(g.filter(function(e){return"code"!==e}).join(", "))):((g=r.AriaUtil.getImplicitRole(u[p])).includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),g&&g.length>0&&c.push(g.filter(function(e){return"code"!==e}).join(", ")))}}if(d.length>0){for(var b=[],_=0;_<d.length;_++)(f=new Array).push(s.join(", ")),f.push(d[_]),b.push((0,a.RuleFail)("fail_child_explicit_role",f));return b}if(c.length>0){for(b=[],_=0;_<c.length;_++)(f=new Array).push(s.join(", ")),f.push(c[_]),b.push((0,a.RulePotential)("potential_child_implicit_role",f));return b}if(m.length>0){for(b=[],_=0;_<m.length;_++){var f;(f=new Array).push(s.join(", ")),f.push(m[_]),b.push((0,a.RulePotential)("recommendation_no_impact_role",f))}return b}}}}},8115(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_document_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_document_label_unique={id:"aria_document_label_unique",context:"aria:document",refactor:{Rpt_Aria_MultipleDocumentRoles:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_document_label_unique.html",fail_label_not_unique:"aria_document_label_unique.html",group:"aria_document_label_unique.html"}},messages:{"en-US":{pass:'The element with "document" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "document" roles do not have unique labels',group:'Each element with "document" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"document",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_eventhandler_role_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.aria_eventhandler_role_valid={id:"aria_eventhandler_role_valid",context:"dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]",refactor:{Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_eventhandler_role_valid.html",Fail_1:"aria_eventhandler_role_valid.html",group:"aria_eventhandler_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <{0}> element with '{1}' does not have a valid ARIA role specified",group:"Elements with event handlers must have a valid ARIA role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.getAncestor(n,"svg"))return null;if(r.AriaUtil.hasAnyRole(n,!0))return(0,a.RulePass)("Pass_0");if(l.CommonUtil.isfocusableByDefault(n))return(0,a.RulePass)("Pass_0");var o=new Array;o.push(n.nodeName.toLowerCase());for(var s=new Array,u=["onblur","onfocus","onchange","onclick","ondblclick","onkeydown","onkeypress","onkeyup","onmousedown","onmouseup","onmousemove","onmouseout","onmouseover","onresize"],d=0;d<u.length;++d)n.hasAttribute(u[d])&&s.push(u[d]);var c=new Array;return c.push(s.join(", ")),(0,a.RuleFail)("Fail_1",[o.toString(),c.toString()])}}},5782(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_form_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_form_label_unique={id:"aria_form_label_unique",context:"aria:form",refactor:{Rpt_Aria_MultipleFormLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_form_label_unique.html",fail_label_not_unique:"aria_form_label_unique.html",group:"aria_form_label_unique.html"}},messages:{"en-US":{pass:'The element with "form" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "form" role do not have unique labels',group:'Each element with "form" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"form",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},6731(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_graphic_labelled=void 0;var a=i(461),n=i(7011),r=i(7139),l=i(3946);t.aria_graphic_labelled={id:"aria_graphic_labelled",context:"aria:graphics-document,aria:graphics-symbol",refactor:{HAAC_Aria_SvgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_graphic_labelled.html",Pass_0:"aria_graphic_labelled.html",Fail_1:"aria_graphic_labelled.html",Fail_2:"aria_graphic_labelled.html",Fail_3:"aria_graphic_labelled.html"}},messages:{"en-US":{group:"An element with a graphics role must have a non-empty label",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" graphics role has no label',Fail_2:'Element with "{0}" graphics role has no label or an empty label',Fail_3:"Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:[{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role")||!o.getAttribute("role").includes("graphics-"))return null;var s=n.AriaUtil.getAriaLabel(o).length>0;if(!s&&"svg"===o.nodeName.toLowerCase()){var u=o.querySelector("title");s=u&&r.CommonUtil.hasInnerContent(u)}return s||(s=r.CommonUtil.attributeNonEmpty(o,"title")),s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[o.getAttribute("role")])}}},390(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_hidden_nontabbable=void 0;var a=i(7139),n=i(461),r=i(461);t.aria_hidden_nontabbable={id:"aria_hidden_nontabbable",context:"dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*",refactor:{aria_hidden_focus_misuse:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_hidden_nontabbable.html",Pass_0:"aria_hidden_nontabbable.html",Fail_1:"aria_hidden_nontabbable.html"}},messages:{"en-US":{group:"A hidden element should not contain any tabbable elements",Pass_0:"Rule Passed",Fail_1:"Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.3.1","4.1.2"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:"6cfa84",run:function(e,t,i){var r=e.dom.node,l=r.nodeName.toLowerCase();return a.CommonUtil.isTabbable(r)?(0,n.RuleFail)("Fail_1",[l]):(0,n.RulePass)("Pass_0")}}},3900(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_id_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(9910),u=i(3946);t.aria_id_unique={id:"aria_id_unique",context:"dom:*",refactor:{Rpt_Aria_ValidIdRef:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_id_unique.html",Fail_1:"aria_id_unique.html",group:"aria_id_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid",group:"The ARIA property must reference a non-empty unique id of an existing element that is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["59796f","6a7281"],run:function(e,t,i){var n=e.dom.node,d=!0,c=new Array,m=(new Array,o.FragmentUtil.getOwnerFragment(n)),p=n.attributes,h=new Array,g=0;if(p)for(var b=0,_=p.length;b<_;b++){d=!0;var f=p[b].name;if(r.AriaUtil.isDefinedAriaAttribute(n,f)){var v=s.ARIADefinitions.propertyDataTypes[f];if(v&&v.type){var A="http://www.w3.org/2001/XMLSchema#idref"==v.type;if(A||"http://www.w3.org/2001/XMLSchema#idrefs"==v.type){g++;var w=l.CommonUtil.normalizeSpacing(p[b].nodeValue).length,y=p[b].nodeValue.split(" ");if(w<1)d=!1,h.push('"'+p[b].nodeValue+'"');else if(A&&w>=1&&y.length>1){d=!1;for(var C=0,k=y.length;C<k;++C)""!=y[C]&&h.push(y[C])}if(d&&w>=1)for(var R=0,x=y.length;R<x;++R)if(y[R].length>0){var P=m.getElementById(y[R]);if((d=null!=P)&&!v.hiddenIDRefSupported&&(d=u.VisUtil.isNodeVisible(P)),d)break;""!=y[R]&&h.push(y[R])}}}d||c.push(f)}}var T=0==c.length,U=new Array,I=new Array,E=new Array;return T||(I.push(c.join(", ")),E.push(n.nodeName.toLowerCase()),h.length>0&&U.push(h.join(", "))),0==g?null:T?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[U.toString(),I.toString(),E.toString()])}}},1218(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_img_labelled=void 0;var a=i(461),n=i(7011),r=i(7139),l=i(3946);t.aria_img_labelled={id:"aria_img_labelled",context:"aria:img, aria:image",refactor:{HAAC_Aria_ImgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_img_labelled.html",Pass_0:"aria_img_labelled.html",Fail_1:"aria_img_labelled.html",Fail_2:"aria_img_labelled.html",Fail_3:"aria_img_labelled.html"}},messages:{"en-US":{group:'An element with "img" role must have a non-empty label',Pass_0:"Rule Passed",Fail_1:'Element with "img" role has no label',Fail_2:'Element with "img" role has no label or an empty label',Fail_3:"Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:["23a2a8",{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role"))return null;var s=o.nodeName.toLocaleLowerCase();if("svg"!==s&&"img"!==s){var u=n.AriaUtil.getAriaLabel(o).length>0;if(!u&&"svg"===o.nodeName.toLowerCase()){var d=o.querySelector("title");u=d&&r.CommonUtil.hasInnerContent(d)}return u||(u=r.CommonUtil.attributeNonEmpty(o,"title")),u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2")}}}},6734(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_keyboard_handler_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3946);t.aria_keyboard_handler_exists={id:"aria_keyboard_handler_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingKeyboardHandler:{pass:"pass",potential_no_keyboard_access:"potential_no_keyboard_access"}},help:{"en-US":{pass:"aria_keyboard_handler_exists.html",potential_no_keyboard_access:"aria_keyboard_handler_exists.html",group:"aria_keyboard_handler_exists.html"}},messages:{"en-US":{pass:"Rule Passed",potential_no_keyboard_access:'Verify the <{0}> element with "{1}" role has keyboard access',group:"Interactive WAI_ARIA UI components must provide keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)){var u=!0,d=u,c=n.ownerDocument,m=o.ARIADefinitions.designPatterns,p=r.AriaUtil.getRoles(n,!1);if("datalist"===n.nodeName.toLowerCase()&&p&&p.includes("listbox"))return null;for(var h=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"],g=0,b=h;g<b.length;g++){var _=b[g];if(null!=r.AriaUtil.getAncestorWithRole(n,_,!0))return null}for(var f=l.CommonUtil.hasAttribute,v=new Array,A=0;A<p.length;++A){if(m[p[A]],h.indexOf(p[A])>=0&&!(f(n,"aria-disabled")&&n.getAttribute("aria-disabled")||(u=n.hasAttribute("onkeydown")||n.hasAttribute("onkeypress")||n.hasAttribute("onkeyup"))))if(f(n,"aria-activedescendant"))u=!0;else{var w,y=o.ARIADefinitions.designPatterns[p[A]].reqChildren;if(y)for(var C=0,k=y.length;C<k;C++)for(var R="*[contains(@role,'"+y[C]+"')]",x=c.evaluate(R,n,l.CommonUtil.defaultNSResolver,0,null),P=x.iterateNext();P;){if(!(u=P.hasAttribute("onkeydown")||P.hasAttribute("onkeypress")))for(var T="descendant::*",U=(w=c.evaluate(T,P,l.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)l.CommonUtil.shouldNodeBeSkippedHidden(U)||(u=l.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext();if(!u)break;P=x.iterateNext()}else for(T="descendant::*",U=(w=c.evaluate(T,n,l.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)if(l.CommonUtil.shouldNodeBeSkippedHidden(U))U=w.iterateNext();else{var I;(u=l.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext()}}u||v.push(p[A]),!u&&d&&(d=u)}var E=new Array;E.push(n.nodeName.toLowerCase());var N=new Array;N.push(v.join(", "));var L=n.getAttribute("id");return L&&L.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(L,"'][role='combobox']"))?null:d?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_no_keyboard_access",[E.toString(),N.toString()])}}}},9973(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_landmark_name_unique=void 0;var a=i(461),n=i(461),r=i(9955),l=i(1686),o=i(5279),s=i(4566),u=i(1950),d=i(3946),c=i(7139),m=i(7011);t.aria_landmark_name_unique={id:"aria_landmark_name_unique",context:"aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form",refactor:{landmark_name_unique:{Pass_0:"pass",Fail_0:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_landmark_name_unique.html",fail_label_not_unique:"aria_landmark_name_unique.html",group:"aria_landmark_name_unique.html"}},messages:{"en-US":{pass:"Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",fail_label_not_unique:'Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label',group:"Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(d.VisUtil.isNodeHiddenFromAT(n))return null;if(null!==c.CommonUtil.getAncestor(n,["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(n,"dialog",!0))return null;var p=o.FragmentUtil.getOwnerFragment(n),h=s.CacheUtil.getCache(n.ownerDocument,"aria_landmark_name_unique",null);if(!h){h={navigationNodes:[],navigationNodesComputedLabels:[],navigationNodesParents:[],navigationNodesMatchFound:[]};for(var g=p.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'),b=Array.from(g),_=[],f=[],v=[],A=0;A<b.length;A++)d.VisUtil.isNodeHiddenFromAT(b[A])||null!==c.CommonUtil.getAncestor(b[A],["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(b[A],"dialog",!0)||v.push(b[A]);for(b=v,A=0;A<b.length;A++){for(var w=[],y=b[A].parentElement;y;)w.push(y),y=y.parentElement;for(var C=0;C<w.length;C++){var k=["ASIDE","FOOTER","FORM","HEADER","MAIN","NAV","SECTION"].includes(w[C].tagName),R=!1;if(w[C].hasAttribute("role")&&(R=["complementary","contentinfo","form","banner","main","navigation","region","search"].includes(w[C].getAttribute("role"))),k||R){_.push(w[C]);break}if(C===w.length-1){_.push(null);break}}}var x=[];for(A=0;A<b.length;A++){var P=u.AccNameUtil.computeAccessibleName(b[A]);x.push(P&&P.name&&P.name.trim().length>0?P.name.trim():"")}for(A=0;A<_.length;A++){var T=!1,U=!1;for(C=0;C<_.length;C++)if(C!==A){if(null===_[A]&&null===_[C]){if(r.ARIAMapper.nodeToRole(b[A])===r.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}else if(null===_[A]||null===_[C])continue;if(l.DOMUtil.sameNode(_[A],_[C])&&r.ARIAMapper.nodeToRole(b[A])===r.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}T||(U?f.push("pass"):f.push("null"))}h.navigationNodesComputedLabels=x,h.navigationNodes=b,h.navigationNodesParents=_,h.navigationNodesMatchFound=f,s.CacheUtil.setCache(n.ownerDocument,"aria_landmark_name_unique",h)}var I=-1;for(A=0;A<h.navigationNodes.length;A++)n.isSameNode(h.navigationNodes[A])&&(I=A);return-1===I?null:"pass"===h.navigationNodesMatchFound[I]?(0,a.RulePass)("pass",[r.ARIAMapper.nodeToRole(h.navigationNodes[I])]):"fail_label_not_unique"===h.navigationNodesMatchFound[I]?(0,a.RuleFail)("fail_label_not_unique",[r.ARIAMapper.nodeToRole(h.navigationNodes[I]),h.navigationNodesComputedLabels[I]]):null}}},5711(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_main_label_unique={id:"aria_main_label_unique",context:"aria:main",refactor:{Rpt_Aria_MultipleMainsRequireLabel_Implicit_2:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_unique.html",Fail_1:"aria_main_label_unique.html",group:"aria_main_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique labels',group:'Each element with "main" role must have unique label that describes its purposes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;for(var s=r.AriaUtil.getAriaLabel(n),u=r.AriaUtil.getAncestorWithRole(n,"document",!0),d=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0),c=null,m=0;m<d.length;++m)if(d[m]!==n&&(c=(0,a.RulePass)("Pass_0"),r.AriaUtil.getAncestorWithRole(d[m],"document",!0)===u&&r.AriaUtil.getAriaLabel(d[m])===s)){c=(0,a.RuleFail)("Fail_1");break}return c}}},3384(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_main_label_visible={id:"aria_main_label_visible",context:"dom:body",refactor:{Rpt_Aria_MultipleMainsVisibleLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_visible.html",Fail_1:"aria_main_label_visible.html",group:"aria_main_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique visible labels',group:'Each element with "main" role should have a unique visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;var s=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0);return 0===s.length||1===s.length?null:r.AriaUtil.hasUniqueAriaLabelledby(s)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2762(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_navigation_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_navigation_label_unique={id:"aria_navigation_label_unique",context:"aria:navigation",refactor:{Rpt_Aria_MultipleNavigationLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_navigation_label_unique.html",fail_label_not_unique:"aria_navigation_label_unique.html",group:"aria_navigation_label_unique.html"}},messages:{"en-US":{pass:'The element with "navigation" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "navigation" role do not have unique labels',group:'Each element with "navigation" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"navigation",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5757(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_parent_required=void 0;var a=i(461),n=i(461),r=i(9910),l=i(7011),o=i(7139),s=i(3946);t.aria_parent_required={id:"aria_parent_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredParent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_parent_required.html",Pass_0:"aria_parent_required.html",Fail_1:"aria_parent_required.html"}},messages:{"en-US":{group:"Each element with an implicit or explicit role must be contained within a valid element",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"ff89c9",run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||o.CommonUtil.isNodeDisabled(n)||l.AriaUtil.shouldBePresentationalChild(n)||s.VisUtil.isNodePresentational(n))){for(var u=!0,d=r.ARIADefinitions.designPatterns,c=new Array,m=new Array,p=0,h=i.aria.map(function(e){return e.role}),g=h[h.length-2],b=2;"none"===g;)b++,g=h[h.length-b];var _=l.AriaUtil.getResolvedRole(n);if(d[_]&&null!=d[_].container){p++,u=!1;for(var f=0,v=(m=d[_].container).length;!u&&f<v&&!(u=g===m[f]);f++);0==u&&c.push(_)}var A=new Array;A.push(c.join(", "));var w=new Array;return w.push(m.join(", ")),0==p?null:u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[A.toString(),w.toString()])}}}},5232(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_region_label_unique={id:"aria_region_label_unique",context:"aria:region",refactor:{Rpt_Aria_MultipleRegionsUniqueLabel_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_region_label_unique.html",fail_label_not_unique:"aria_region_label_unique.html",group:"aria_region_label_unique.html"}},messages:{"en-US":{pass:'The element with "region" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "region" role do not have unique labels',group:'Each element with "region" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"region");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_labelled=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_region_labelled={id:"aria_region_labelled",context:"aria:region",refactor:{Rpt_Aria_RegionLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_labelled.html",Fail_1:"aria_region_labelled.html",group:"aria_region_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "region" role does not have a label',group:'Each element with "region" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasAriaLabel(n)||l.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_allowed=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_role_allowed={id:"aria_role_allowed",context:"dom:*[role]",refactor:{Rpt_Aria_ValidRole:{Pass_0:"Pass_0",Fail_2:"Fail_2",Potential_1:"Potential_1"}},help:{"en-US":{group:"aria_role_allowed.html",Pass_0:"aria_role_allowed.html",Fail_2:"aria_role_allowed.html",Potential_1:"aria_role_allowed.html"}},messages:{"en-US":{group:"Elements must have a valid 'role' per ARIA specification",Pass_0:"Rule Passed",Fail_2:"The role '{0}' defined on the element is not valid per ARIA specification",Potential_1:"Some of the roles, '{0}', defined on the element are not valid per ARIA specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"674b10",run:function(e,t,i){var n=e.dom.node,l=n.getAttribute("role").trim().toLowerCase();if(0===l.length)return null;if(n.hasAttribute("aria-hidden")&&"true"===n.getAttribute("aria-hidden").toLowerCase())return null;var o=r.AriaUtil.getRolesUndefinedByAria(n);if(!o||0===o.length)return(0,a.RulePass)("Pass_0");var s=l.split(/\s+/);return o.length===s.length?(0,a.RuleFail)("Fail_2",[o.join(",")]):o.length>0?(0,a.RulePotential)("Potential_1",[o.join(",")]):void 0}}},4863(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_redundant=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_role_redundant={id:"aria_role_redundant",context:"dom:*[role]",help:{"en-US":{pass:"aria_role_redundant.html",fail_redundant:"aria_role_redundant.html",group:"aria_role_redundant.html"}},messages:{"en-US":{pass:"An explicitly-assigned ARIA role is not redundant with the implicit role of the element",fail_redundant:'The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element <{1}>',group:"An explicitly-assigned ARIA role should not be redundant with the implicit role of the element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.tagName.toLowerCase(),o=r.AriaUtil.getRoles(n,!1);if(o&&0!==o.length){if(!r.AriaUtil.areRolesDefined(o))return null;var s=r.AriaUtil.getImplicitRole(n);if(!s||0===s.length)return(0,a.RulePass)("pass");for(var u=[],d=0;d<o.length;d++)s.includes(o[d])?u.push((0,a.RuleFail)("fail_redundant",[o[d],l])):u.push((0,a.RulePass)("pass"));return u.length>0?u:null}}}},1440(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_search_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_search_label_unique={id:"aria_search_label_unique",context:"aria:search",refactor:{Rpt_Aria_MultipleSearchLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_search_label_unique.html",fail_label_not_unique:"aria_search_label_unique.html",group:"aria_search_label_unique.html"}},messages:{"en-US":{pass:'The element with "search" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "search" role do not have unique labels',group:'Each element with "search" role must have a unique label that describes its purpose'}},rulesets:[{id:[],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"search",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1968(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_valid=t.aria_role_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.aria_role_valid={id:"aria_role_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{aria_semantics_role:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"aria_role_valid.html",Fail_1:"aria_role_valid.html",Fail_2:"aria_role_valid.html",group:"aria_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The ARIA role '{0}' is not valid for the element <{1}>",Fail_2:"The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable",group:"ARIA roles must be valid for the element to which they are assigned"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.tagName.toLowerCase();if(1!==n.nodeType)return null;var s=r.AriaUtil.getRolesUndefinedByAria(n);if(s&&s.length>0)return null;var u=r.AriaUtil.getDeprecatedAriaRoles(n);if(u&&u.length>0)return null;var d=r.AriaUtil.getDeprecatedAriaAttributes(n);if(d&&d.length>0)return null;if(["td","th","tr"].includes(o)){var c=l.CommonUtil.isTableDescendant(i);if(null!==c&&c.length>0)return null}var m=r.AriaUtil.getUserDefinedRoles(n);if(!m||0===m.length)return null;if(m.includes("generic"))return(0,a.RuleFail)("Fail_1",["generic",o]);var p=r.AriaUtil.getInvalidRoles(n);return null===p||0===p.length?(0,a.RulePass)("Pass_0",[m.join(", "),o]):p.includes("presentation")||p.includes("none")&&l.CommonUtil.isTabbable(n)?(0,a.RuleFail)("Fail_2",[p.join(", "),o]):p.length>0?(0,a.RuleFail)("Fail_1",[p.join(", "),o]):m.length>0?(0,a.RulePass)("Pass_0",[m.join(", "),o]):null}},t.aria_attribute_valid={id:"aria_attribute_valid",context:"dom:*",dependencies:["aria_attribute_deprecated","aria_role_valid"],refactor:{aria_attribute_allowed:{Pass:"Pass",Fail_invalid_role_attr:"Fail_invalid_role_attr",Fail_invalid_implicit_role_attr:"Fail_invalid_implicit_role_attr"}},help:{"en-US":{group:"aria_attribute_valid.html",Pass:"aria_attribute_valid.html",Fail_invalid_role_attr:"aria_attribute_valid.html",Fail_invalid_implicit_role_attr:"aria_attribute_valid.html"}},messages:{"en-US":{group:"ARIA attributes should be valid for the element and ARIA role to which they are assigned",Pass:"ARIA attributes are valid for the element and ARIA role",Fail_invalid_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with ARIA role "{2}"',Fail_invalid_implicit_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with implicit ARIA role "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["5c01ea",{"46ca7f":{Pass:"pass",Fail_invalid_role_attr:"fail",Fail_invalid_implicit_role_attr:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(1!==n.nodeType)return null;var l=r.AriaUtil.getUserDefinedAriaAttributes(n);if(null===l||0===l.length)return null;var o=r.AriaUtil.getUserDefinedRoles(n),s=!0;if(o&&o.length>0){if(!r.AriaUtil.areRolesDefined(o))return null}else o=r.AriaUtil.getImplicitRole(n),s=!1;var u=n.tagName.toLowerCase(),d=r.AriaUtil.getInvalidAriaAttributes(n);return d&&0!==d.length?o.length>0?s?(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_implicit_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,"none"]):(0,a.RulePass)("Pass",[l.join(", "),u,o.join(", ")])}}},1617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_toolbar_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(4566);t.aria_toolbar_label_unique={id:"aria_toolbar_label_unique",context:"aria:toolbar",refactor:{Rpt_Aria_MultipleToolbarUniqueLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_toolbar_label_unique.html",Fail_1:"aria_toolbar_label_unique.html",group:"aria_toolbar_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "toolbar" roles do not have unique labels',group:'Each element with "toolbar" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"toolbar",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(n.ownerDocument,"aria_toolbar_label_unique",null);u||(u=r.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(n.ownerDocument,"aria_toolbar_label_unique",u));var d=r.AriaUtil.getAriaLabel(n);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_widget_labelled=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9955),s=i(5279),u=i(9910),d=i(1686);t.aria_widget_labelled={id:"aria_widget_labelled",context:"dom:*",refactor:{Rpt_Aria_WidgetLabels_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_widget_labelled.html",Pass_0:"aria_widget_labelled.html",Fail_1:"aria_widget_labelled.html"}},messages:{"en-US":{group:"Interactive component must have a programmatically associated name",Pass_0:"Rule Passed",Fail_1:"Interactive component with ARIA role '{0}' does not have a programmatically associated name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"m6b1q3",run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")&&"hidden"===n.getAttribute("type")||r.AriaUtil.getAncestorWithRole(n,"combobox")&&!r.AriaUtil.hasRoleInSemantics(n,"textbox")&&!r.AriaUtil.hasRoleInSemantics(n,"searchbox"))return null;var c=o.ARIAMapper.nodeToRole(n),m=n.nodeName.toLowerCase();if(["button","checkbox","combobox","listbox","menuitemcheckbox","menuitemradio","radio","searchbox","slider","spinbutton","switch","textbox","progressbar","link"].includes(c))return null;if("output"===m||"input"===m&&n.getAttribute("type"),!n.hasAttribute("role")&&-1!=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"].indexOf(n.nodeName.toLowerCase()))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(r.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=l.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=l.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(s.FragmentUtil.getById(n,v[A])===n)return null}for(var w=!0,y=u.ARIADefinitions.designPatterns,C=r.AriaUtil.getRoles(n,!0),k=0,R=["widget","liveRegion","window"],x=(A=0,C.length);w&&A<x;++A){var P=y[C[A]];P&&P.nameRequired&&P.roleType&&R.includes(P.roleType)&&(++k,!(w=r.AriaUtil.hasAriaLabel(n)||l.CommonUtil.attributeNonEmpty(n,"title")||l.CommonUtil.getLabelForElementHidden(n,!0))&&P.nameFrom&&P.nameFrom.indexOf("contents")>=0&&(w=l.CommonUtil.hasInnerContentOrAlt(n)),w||(w=l.CommonUtil.hasImplicitLabel(n)),w||"img"!==n.tagName.toLowerCase()||n.hasAttribute("role")||!n.hasAttribute("alt")||(w=d.DOMUtil.cleanWhitespace(n.getAttribute("alt")).trim().length>0),P.nameFrom.indexOf("prohibited"))}return 0===k?null:w?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[c])}}},3370(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.asciiart_alt_exists=void 0;var a=i(461),n=i(7139);t.asciiart_alt_exists={id:"asciiart_alt_exists",context:"dom:pre, dom:listing, dom:xmp, dom:plaintext",refactor:{RPT_Pre_ASCIIArt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"asciiart_alt_exists.html",Potential_1:"asciiart_alt_exists.html",group:"asciiart_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that ASCII art has a text alternative",group:"ASCII art must have a text alternative"}},rulesets:[],act:[],run:function(e,t,i){var r=e.dom.node;if("pre"==r.nodeName.toLowerCase()&&(r.previousSibling&&"code"==r.previousSibling.nodeName.toLowerCase()||r.getElementsByTagName("code").length>0||n.CommonUtil.getAncestor(r,"code")))return(0,a.RulePass)("Pass_0");for(var l=!0,o=n.CommonUtil.getInnerText(r),s=0,u=0,d="",c=0;l&&c<o.length;++c){var m=o.substr(c,1);/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(m)?d==m?u+=1:u=0:(/\s/.test(m)||(s+=1),u=0),d=m,(s>=5||u>=4)&&(l=!1)}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},9272(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_css_review=void 0;var a=i(461),n=i(461),r=i(7139);t.blink_css_review={id:"blink_css_review",context:"dom:style, dom:*[style]",refactor:{RPT_Blink_CSSTrigger1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"blink_css_review.html",Pass_0:"blink_css_review.html",Potential_1:"blink_css_review.html"}},messages:{"en-US":{group:"Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds",Pass_0:"Rule Passed",Potential_1:"Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getInnerText(n);n.hasAttribute("style")&&(l=n.getAttribute("style"));var o=-1==l.toLowerCase().indexOf("text-decoration:blink");return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},7735(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_elem_deprecated=void 0;var a=i(461),n=i(461);t.blink_elem_deprecated={id:"blink_elem_deprecated",context:"dom:blink",refactor:{WCAG20_Blink_AlwaysTrigger:{Fail_1:"Fail_1"}},help:{"en-US":{group:"blink_elem_deprecated.html",Fail_1:"blink_elem_deprecated.html"}},messages:{"en-US":{group:"Content that blinks persistently must not be used",Fail_1:"Content found that blinks persistently"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){return(0,a.RuleFail)("Fail_1")}}},3923(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blockquote_cite_exists=void 0;var a=i(461),n=i(461),r=i(7139);t.blockquote_cite_exists={id:"blockquote_cite_exists",context:"dom:blockquote",refactor:{RPT_Blockquote_HasCite:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"blockquote_cite_exists.html",Potential_1:"blockquote_cite_exists.html",group:"blockquote_cite_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only",group:"Use <blockquote> only for quotations, not indentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.attributeNonEmpty(n,"cite");if(!l){var o=r.CommonUtil.getDocElementsByTag(n,"cite");l=null!=o&&o.length>0}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},7521(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.canvas_content_described=void 0;var a=i(461),n=i(461),r=i(3946);t.canvas_content_described={id:"canvas_content_described",context:"dom:canvas",refactor:{HAAC_Canvas:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"canvas_content_described.html",Manual_1:"canvas_content_described.html",group:"canvas_content_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify accessibility of the <canvas> element",group:"The <canvas> element may not be accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.1.1","4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.innerHTML.trim().length>0;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RuleManual)("Manual_1")}}},1852(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.caption_track_exists=void 0;var a=i(461),n=i(461);t.caption_track_exists={id:"caption_track_exists",context:"dom:video",refactor:{HAAC_Video_HasNoTrack:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"caption_track_exists.html",Potential_1:"caption_track_exists.html",group:"caption_track_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that captions are available for any meaningful audio or provide a caption track for the <video> element",group:"A <video> element must have a text alternative for any meaningful audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!1;if("true"===n.getAttribute("aria-hidden"))return null;for(var l=n.getElementsByTagName("track"),o=0;o<l.length;++o)r=r||"captions"===l[o].getAttribute("kind");if(n.textTracks&&n.textTracks.length>0)for(o=0;o<n.textTracks.length;o++)r=r||"captions"===n.textTracks[o].kind;return r?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},799(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_active_descendant=void 0;var a=i(461),n=i(461),r=i(7011),l=i(5279),o=i(3864),s=i(4566),u=i(3946);t.combobox_active_descendant={id:"combobox_active_descendant",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_active_descendant.html",Fail_missing:"combobox_active_descendant.html",Fail_not_in_popup:"combobox_active_descendant.html",Fail_active_role_invalid:"combobox_active_descendant.html",Fail_active_not_selected:"combobox_active_descendant.html",group:"combobox_active_descendant.html"}},messages:{"en-US":{Pass:"'aria-activedescendant' is used appropriately for this combobox",Fail_missing:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist",Fail_not_in_popup:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"",Fail_active_role_invalid:"The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'",Fail_active_not_selected:"The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true",group:"'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.popupId;if(!m)return null;var h=n.getAttribute("aria-activedescendant");if(!h||0===h.trim().length)return null;var g=l.FragmentUtil.getById(n,h);if(!g)return(0,a.RuleFail)("Fail_missing",[h]);var b=!1;if(m)for(var _=new o.DOMWalker(m);!b&&_.nextNode()&&_.node!=m&&_.node!=m.nextSibling;)1===_.node.nodeType&&u.VisUtil.isNodeVisible(_.node)&&(b=_.elem().getAttribute("id")===h);var f=[];b||f.push((0,a.RulePass)("Fail_not_in_popup",[h,p]));var v=r.AriaUtil.getRoles(g,!0);return 0===["option","gridcell","row","treeitem"].filter(function(e){return v.includes(e)}).length&&f.push((0,a.RuleFail)("Fail_active_role_invalid",[h,v.join(",")])),"true"!==g.getAttribute("aria-selected")&&f.push((0,a.RuleFail)("Fail_active_not_selected",[h])),0===f.length?(0,a.RulePass)("Pass"):f}}},4614(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_autocomplete_valid=void 0;var a=i(461),n=i(461),r=i(3864),l=i(4566),o=i(3946);t.combobox_autocomplete_valid={id:"combobox_autocomplete_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_autocomplete:{Pass:"Pass",Fail_1:"Fail_1",Fail_inline:"Fail_inline"}},help:{"en-US":{Pass:"combobox_autocomplete_valid.html",Fail_1:"combobox_autocomplete_valid.html",Fail_inline:"combobox_autocomplete_valid.html",group:"combobox_autocomplete_valid.html"}},messages:{"en-US":{Pass:"The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup",Fail_1:"The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"",Fail_inline:"The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ",group:"A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d=u.popupId,c=u.popupElement,m=[];"inline"===n.getAttribute("aria-autocomplete")&&m.push((0,a.RuleFail)("Fail_inline"));var p=!0;if(c&&o.VisUtil.isNodeVisible(c)&&(p=!c.hasAttribute("aria-autocomplete"))&&c.children&&c.children.length>0)for(var h=new r.DOMWalker(c);p&&h.nextNode()&&(1!==h.node.nodeType||!o.VisUtil.isNodeVisible(h.node)||(p=!h.elem().hasAttribute("aria-autocomplete"),!h.bEndTag||h.node!==c.lastElementChild)););return p||m.push((0,a.RuleFail)("Fail_1",[d])),m.length>0?m:(0,a.RulePass)("Pass")}}},5952(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_design_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=i(4566);t.combobox_design_valid={id:"combobox_design_valid",context:"aria:combobox",refactor:{combobox_version:{"Pass_1.0":"Pass_1.0","Fail_1.1":"Fail_1.1","Pass_1.2":"Pass_1.2"}},help:{"en-US":{"Pass_1.0":"combobox_design_valid.html","Fail_1.1":"combobox_design_valid.html","Pass_1.2":"combobox_design_valid.html",group:"combobox_design_valid.html"}},messages:{"en-US":{"Pass_1.0":"The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Fail_1.1":"The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Pass_1.2":"The combobox design pattern is detected as ARIA 1.2",group:"The combobox design pattern must be valid for ARIA 1.2"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;var u,d="select"===(u=n).tagName.toLowerCase()&&"combobox"!==u.getAttribute("role")?"implicit":"input"!==u.nodeName.toLowerCase()||u.hasAttribute("type")&&"text"!==u.getAttribute("type")||!u.hasAttribute("aria-owns")||u.hasAttribute("aria-controls")?"input"!==u.nodeName.toLowerCase()&&u.hasAttribute("aria-owns")&&!u.hasAttribute("aria-controls")?"1.1":"1.2":"1.0";if("implicit"===d)return null;var c=n.tagName.toLowerCase(),m="true"===(r.AriaUtil.getAriaAttribute(n,"aria-expanded")||"").trim().toLowerCase(),p="input"===c&&(!n.hasAttribute("type")||"text"===n.getAttribute("type").toLowerCase()),h=e.dom.rolePath;if(!h)return null;var g=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});return g?(g[h]={inputElement:p?n:null,pattern:d,expanded:m},s.CacheUtil.setCache(n.ownerDocument,"combobox",g),"1.0"===d?(0,a.RulePass)("Pass_1.0"):"1.1"===d?(0,a.RuleFail)("Fail_1.1"):"1.2"===d?(0,a.RulePass)("Pass_1.2"):void 0):null}}},5395(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_focusable_elements=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7011),o=i(7139),s=i(4566),u=i(3946);t.combobox_focusable_elements={id:"combobox_focusable_elements",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_focusable_elements.html",Fail_not_tabbable:"combobox_focusable_elements.html",Fail_tabbable_child:"combobox_focusable_elements.html",group:"combobox_focusable_elements.html"}},messages:{"en-US":{Pass:"DOM focus is allowed only on the combobox element as required",Fail_not_tabbable:"The combobox element does not allow DOM focus as required",Fail_tabbable_child:"The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed",group:"Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.expanded;if(!m)return null;var h=l.AriaUtil.getRoles(m,!0)[0],g=[];if(o.CommonUtil.isTabbable(n)||g.push((0,a.RuleFail)("Fail_not_tabbable")),!1===p||"dialog"===h)return(0,a.RulePass)("Pass");var b=!0;if(m&&u.VisUtil.isNodeVisible(m)&&(b=!o.CommonUtil.isTabbable(m)&&!l.AriaUtil.getAriaAttribute(m,"aria-activedescendant"))&&m.children&&m.children.length>0)for(var _=new r.DOMWalker(m);b&&_.nextNode()&&(1!==_.node.nodeType||!u.VisUtil.isNodeVisible(_.node)||(b=!o.CommonUtil.isTabbable(_.node)&&!l.AriaUtil.getAriaAttribute(_.node,"aria-activedescendant"),!_.bEndTag||_.node!==m.lastElementChild)););return b||g.push((0,a.RuleFail)("Fail_tabbable_child")),0===g.length?(0,a.RulePass)("Pass"):g}}},1992(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_haspopup_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(4566);t.combobox_haspopup_valid={id:"combobox_haspopup_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_haspopup:{Pass:"Pass",Fail_popup_role_invalid:"Fail_popup_role_invalid",Fail_combobox_popup_role_mismatch:"Fail_combobox_popup_role_mismatch"}},help:{"en-US":{Pass:"combobox_haspopup_valid.html",Fail_popup_role_invalid:"combobox_haspopup_valid.html",Fail_combobox_popup_role_mismatch:"combobox_haspopup_valid.html",group:"combobox_haspopup_valid.html"}},messages:{"en-US":{Pass:"The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value",Fail_popup_role_invalid:'The \'role\' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"',Fail_combobox_popup_role_mismatch:"The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"",group:"The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!o)return null;var s=o[e.dom.rolePath];if(!s)return null;var u=s.popupElement,d=s.popupId;if(!u)return null;var c=r.AriaUtil.getRoles(u,!0),m=["listbox","grid","tree","dialog"].filter(function(e){return c.includes(e)});if(0===m.length)return(0,a.RuleFail)("Fail_popup_role_invalid",[c.join(","),d]);var p=m[0],h=n.getAttribute("aria-haspopup")||"listbox";return h===p||"listbox"===p&&!n.hasAttribute("aria-haspopup")?(0,a.RulePass)("Pass"):(0,a.RuleFail)("Fail_combobox_popup_role_mismatch",[h,p])}}},7955(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_popup_reference=void 0;var a=i(461),n=i(461),r=i(5279),l=i(4566),o=i(3946);t.combobox_popup_reference={id:"combobox_popup_reference",context:"aria:combobox",dependencies:["combobox_design_valid"],help:{"en-US":{group:"combobox_popup_reference.html","Pass_1.0_expanded":"combobox_popup_reference.html","Pass_1.0_collapsed":"combobox_popup_reference.html","Pass_1.2_expanded":"combobox_popup_reference.html","Pass_1.2_collapsed":"combobox_popup_reference.html","Fail_1.0_missing_owns":"combobox_popup_reference.html","Fail_1.2_missing_controls":"combobox_popup_reference.html","Fail_1.0_popup_reference_missing":"combobox_popup_reference.html","Fail_1.2_popup_reference_missing":"combobox_popup_reference.html",Fail_combobox_expanded_hidden:"combobox_popup_reference.html",Fail_combobox_collapsed_visible:"combobox_popup_reference.html"}},messages:{"en-US":{group:"The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","Pass_1.0_expanded":"The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass_1.0_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Pass_1.2_expanded":"The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass_1.2_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Fail_1.0_missing_owns":"The 'aria-owns' attribute of the expanded combobox is missing","Fail_1.2_missing_controls":"The 'aria-controls' attribute of the expanded combobox is missing","Fail_1.0_popup_reference_missing":"The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value","Fail_1.2_popup_reference_missing":"The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",Fail_combobox_expanded_hidden:"The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible",Fail_combobox_collapsed_visible:"The combobox 'aria-expanded' attribute is false, but the combobox popup is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"4e8ab6":{"Pass_1.0_expanded":"fail","Pass_1.0_collapsed":"fail","Pass_1.2_expanded":"pass","Pass_1.2_collapsed":"pass","Fail_1.0_missing_owns":"inapplicable","Fail_1.2_missing_controls":"fail","Fail_1.0_popup_reference_missing":"inapplicable","Fail_1.2_popup_reference_missing":"fail",Fail_combobox_expanded_hidden:"inapplicable",Fail_combobox_collapsed_visible:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node,s=l.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d,c,m=u.pattern,p=u.expanded;if("1.0"===m){if(!n.hasAttribute("aria-owns"))return p?(0,a.RuleFail)("Fail_1.0_missing_owns"):null;if(d=n.getAttribute("aria-owns"),!(c=r.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.0_popup_reference_missing",[d]):null}else{if("1.2"!==m)return null;if(!n.hasAttribute("aria-controls"))return p?(0,a.RuleFail)("Fail_1.2_missing_controls"):null;if(d=n.getAttribute("aria-controls"),!(c=r.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.2_popup_reference_missing",[d]):null}return u.popupId=d,u.popupElement=c,p&&!o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_expanded_hidden"):!p&&o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_collapsed_visible"):"1.0"===m?p?(0,a.RulePass)("Pass_1.0_expanded"):(0,a.RulePass)("Pass_1.0_collapsed"):p?(0,a.RulePass)("Pass_1.2_expanded"):(0,a.RulePass)("Pass_1.2_collapsed")}}},9531(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.debug_paths=void 0;var a=i(461);t.debug_paths={id:"debug_paths",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["DEBUG"],num:"1",level:a.eRulePolicy.INFORMATION,toolkitLevel:a.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var a=e.dom.node;return a.setAttribute("domPath",e.dom.rolePath),a.setAttribute("ariaPath",e.aria.rolePath),null}}},891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.detector_tabbable=void 0;var a=i(7139),n=i(461),r=i(461);t.detector_tabbable={id:"detector_tabbable",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["EXTENSIONS"],num:"1",level:r.eRulePolicy.INFORMATION,toolkitLevel:r.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var r=e.dom.node;if(!a.CommonUtil.isTabbable(r))return null;var l=i.aria[i.aria.length-1];return(0,n.RulePass)("Pass_0",[],[{name:l.attributes.name,role:l.role,tabindex:parseInt(r.getAttribute("tabindex")||"0")}])}}},7446(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.dir_attribute_valid=void 0;var a=i(461),n=i(461);t.dir_attribute_valid={id:"dir_attribute_valid",context:"dom:*[dir]",refactor:{Valerie_Elem_DirValid:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"dir_attribute_valid.html",Fail_1:"dir_attribute_valid.html",group:"dir_attribute_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Invalid value used for the 'dir' attribute",group:'\'dir\' attribute value must be "ltr", "rtl", or "auto"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node.getAttribute("dir").toLowerCase();return"ltr"==n||"rtl"==n||"auto"==n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6137(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.download_keyboard_controllable=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.download_keyboard_controllable={id:"download_keyboard_controllable",context:"dom:a[href],dom:area[href]",refactor:{HAAC_Media_DocumentTrigger2:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"download_keyboard_controllable.html",group:"download_keyboard_controllable.html"}},messages:{"en-US":{Manual_1:"Verify that the file download mechanism does not cause a keyboard trap",group:"File download mechanisms should be keyboard-operable and preserve page focus location"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("href"),s=r.CommonUtil.getFileExt(o),u=![".docx",".doc",".pdf",".odt"].includes(s);return u?null:u?void 0:(0,a.RuleManual)("Manual_1")}}},6839(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.draggable_alternative_exists=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3946);t.draggable_alternative_exists={id:"draggable_alternative_exists",context:"dom:*[draggable]",dependencies:[],help:{"en-US":{group:"draggable_alternative_exists.html",pass_undraggable:"draggable_alternative_exists.html",potential_alternative:"draggable_alternative_exists.html"}},messages:{"en-US":{group:'A draggable element must have a "single pointer" alternative',pass_undraggable:'The element "{0}" is not draggable',potential_alternative:'Ensure the draggable element "{0}" has a "single pointer" alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.7"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!l.VisUtil.isNodeVisible(r))return null;var o=r.nodeName.toLocaleLowerCase();return null!==a.CommonUtil.getAncestor(r,["pre","code","script","meta"])||"body"===o||"html"===o?null:"true"===r.getAttribute("draggable")?(0,n.RulePotential)("potential_alternative",[o]):"false"===r.getAttribute("draggable")?(0,n.RulePass)("pass_undraggable",[o]):null}}},8135(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_labelled=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=i(9910),u=i(1950);t.element_accesskey_labelled={id:"element_accesskey_labelled",context:"dom:*[accesskey]",refactor:{HAAC_Accesskey_NeedLabel:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"element_accesskey_labelled.html",Potential_1:"element_accesskey_labelled.html",group:"element_accesskey_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"The element with an assigned 'accesskey' attribute does not have an associated label",group:"An element with an assigned 'accesskey' attribute must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeVisible(n)&&!l.CommonUtil.isNodeDisabled(n)&&!l.CommonUtil.isTabbable(n)){var d=r.AriaUtil.getRoles(n,!0);if(d&&0!==d.length){var c=s.ARIADefinitions.designPatterns[d[0]];if(c&&c.nameFrom&&!c.nameRequired&&c.nameFrom&&!c.nameFrom.includes("prohibited")&&(!n.parentElement||"fieldset"!==n.parentElement.nodeName.toLowerCase())){var m=u.AccNameUtil.computeAccessibleName(n);return m&&m.name&&m.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}}}}},507(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_unique=void 0;var a=i(461),n=i(461),r=i(4566);t.element_accesskey_unique={id:"element_accesskey_unique",context:"dom:*[accesskey]",refactor:{WCAG20_Elem_UniqueAccessKey:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"element_accesskey_unique.html",Fail_1:"element_accesskey_unique.html",group:"element_accesskey_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"'accesskey' attribute value on the element is not unique",group:"'accesskey' attribute values on each element must be unique for the page"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CacheUtil.getCache(n.ownerDocument,"element_accesskey_unique",{}),o=n.getAttribute("accesskey"),s=!(o in l);return l[o]=!0,s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_attribute_deprecated=void 0;var a=i(461),n=i(461),r=["applet","basefont","center","dir","font","isindex","listing","plaintext","spacer","s","strike","u","xmp","acronym","frame","frameset","noframes","noembed","big","blink","marquee","tt"],l=["align","link","archive","background","bgcolor","clear","code","color","compact","face","hspace","language","link","noshade","nowrap","object","prompt","start","text","version","vlink","vspace"],o={td:["height","width","abbr","axis","char","charoff","height","nowrap","valign","width","align","bgcolor"],th:["height","width","abbr","axis","charoff","height","bgcolor","align","nowrap","char","valign","width"],li:["type","value","type"],ul:["type","compact"],pre:["width"],meta:["http-equiv"],a:["charset","coords","shape","rev","scheme"],link:["rev","charset","target"],img:["name","longdesc","align","hspace","vspace","border"],area:["nohref"],head:["profile"],html:["version"],iframe:["longdesc","align","frameborder","marginheight","marginwidth","scrolling"],object:["archive","code","codebase","codetype","declare","standby","align","hspace","vspace","border"],param:["type","valuetype"],script:["language"],body:["alink","background","bgcolor","link","text","vlink"],br:["clear"],caption:["align"],col:["align","char","charoff","valign","width"],div:["align"],dl:["compact"],hr:["align","noshade","size","width","align"],h2:["align"],h3:["align"],h4:["align"],h5:["align"],h6:["align"],input:["align","usemap"],legend:["align"],menu:["compact"],ol:["compact","type","type"],p:["align"],table:["bgcolor","cellpadding","cellspacing","frame","rules","width","align"],tbody:["align","char","valign","charoff"],tfoot:["align","charoff","char","valign"],thead:["char","charoff","valign","align"],tr:["align","bgcolor","char","charoff","valign"]};t.element_attribute_deprecated={id:"element_attribute_deprecated",context:"dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]",help:{"en-US":{pass:"element_attribute_deprecated.html",fail_elem:"element_attribute_deprecated.html",fail_attr:"element_attribute_deprecated.html",fail_elem_attr:"element_attribute_deprecated.html",group:"element_attribute_deprecated.html"}},messages:{"en-US":{pass:"Rule Passed",fail_elem:"The <{0}> element is deprecated in HTML 5",fail_attr:'The HTML attribute(s) "{0}" is deprecated in HTML 5',fail_elem_attr:'The HTML attribute(s) "{0}" is deprecated for the <{1}> element in HTML 5',group:"Avoid use of obsolete features if possible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("tbody"===n.nodeName.toLowerCase()&&n.hasAttribute("align"))return(0,a.RulePass)("pass");if(n.nodeName.includes("-"))return null;var s=n.nodeName.toLowerCase();if(r.includes(s))return(0,a.RuleFail)("fail_elem",[s]);for(var u=n.getAttributeNames(),d="",c=0,m=u;c<m.length;c++){var p=m[c];l.includes(p)&&(""!==d&&(d+=", "),d+=p)}if(""!==d)return(0,a.RuleFail)("fail_attr",[d]);if(d="",s in o){for(var h=0,g=u;h<g.length;h++)p=g[h],o[s]&&o[s].includes(p)&&(""!==d&&(d+=", "),d+=p);if(""!==d)return(0,a.RuleFail)("fail_elem_attr",[d,s])}return(0,a.RulePass)("pass")}}},5173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_id_unique=void 0;var a=i(461),n=i(461),r=i(5279);t.element_id_unique={id:"element_id_unique",context:"dom:*[id]",refactor:{RPT_Elem_UniqueId:{Pass_0:"pass",Fail_1:"potential_empty",Fail_2:"potential_in_use"}},help:{"en-US":{group:"element_id_unique.html",pass:"element_id_unique.html",potential_empty:"element_id_unique.html",potential_in_use:"element_id_unique.html"}},messages:{"en-US":{group:"Element 'id' attribute values must be unique within a document",pass:"Rule Passed",potential_empty:'The <{0}> element has the id "{1}" that is empty',potential_in_use:'The <{0}> element has the id "{1}" that is already in use'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"3ea0c8":{pass:"pass",potential_empty:"pass",potential_in_use:"fail"}}],run:function(e,t,i){var n=e.dom.node,l=n.getAttribute("id");return""===l?(0,a.RulePotential)("potential_empty",[n.nodeName.toLowerCase(),l]):r.FragmentUtil.getById(n,l)===n?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_in_use",[n.nodeName.toLowerCase(),l])}}},6027(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_lang_valid=t.html_lang_valid=void 0;var a=i(461),n=i(461),r=i(1043),l=i(3946),o=i(3864),s=i(1950),u=function(e){var t=e.dom.node,i=t.nodeName.toLowerCase();if(t.hasAttribute("lang"))if("html"!==i&&""===t.getAttribute("lang"));else{var a=t.getAttribute("lang");if(!r.LangUtil.validPrimaryLang(a))return 1;if(!r.LangUtil.isBcp47(a))return 2}if(t.hasAttribute("xml:lang"))if("html"!==i&&""===t.getAttribute("xml:lang"));else{if(a=t.getAttribute("xml:lang"),!r.LangUtil.validPrimaryLang(a))return 3;if(!r.LangUtil.isBcp47(a))return 4}return 0};t.html_lang_valid={id:"html_lang_valid",context:"dom:html[lang], dom:html[xml:lang]",help:{"en-US":{Pass_0:"html_lang_valid.html",Fail_1:"html_lang_valid.html",Fail_2:"html_lang_valid.html",Fail_3:"html_lang_valid.html",Fail_4:"html_lang_valid.html",group:"html_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The default human language of the page must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"fail",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"inapplicable"},bf051a:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"fail",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=u(e);return[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][n]}},t.element_lang_valid={id:"element_lang_valid",context:"dom:*[lang], dom:*[xml:lang]",help:{"en-US":{Pass_0:"element_lang_valid.html",Fail_1:"element_lang_valid.html",Fail_2:"element_lang_valid.html",Fail_3:"element_lang_valid.html",Fail_4:"element_lang_valid.html",group:"element_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The change in language of specific content must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{de46e4:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"inapplicable",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node;if("html"===n.nodeName.toLowerCase())return null;var r=u(e),d=[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][r];if(d.value[1]!==a.eRuleConfidence.PASS){var c=!1;if(null!==n.firstChild)for(var m=new o.DOMWalker(n,!1,n,!0);!c&&m.nextNode();)if(1===m.node.nodeType){var p=m.node;if(!l.VisUtil.isNodeVisible(p)||p.hasAttribute("lang"))m.bEndTag=!0;else{var h=s.AccNameUtil.computeAccessibleName(p);c=c||"img"===p.nodeName.toLowerCase()&&h&&h.name&&h.name.trim().length>0}}else c=c||3===m.node.nodeType&&m.node.nodeValue.trim().length>0;if(!c)return null}return d}}},7515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_mouseevent_keyboard=void 0;var a=i(461),n=i(461);t.element_mouseevent_keyboard={id:"element_mouseevent_keyboard",context:"dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]",refactor:{RPT_Elem_EventMouseAndKey:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"element_mouseevent_keyboard.html",Manual_1:"element_mouseevent_keyboard.html",group:"element_mouseevent_keyboard.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)",group:"All interactive content with mouse event handlers must have equivalent keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase(),l=n.hasAttribute("href")||!n.hasAttribute("ondblclick")&&!n.hasAttribute("onmousemove")&&(!n.hasAttribute("onmousedown")||n.hasAttribute("onkeydown"))&&(!n.hasAttribute("onmouseup")||n.hasAttribute("onkeyup"))&&(!n.hasAttribute("onmouseover")||n.hasAttribute("onfocus"))&&(!n.hasAttribute("onmouseout")||n.hasAttribute("onblur"))&&(!n.hasAttribute("onclick")||n.hasAttribute("onkeypress")||"a"==r||"button"==r),o=new Array;return l||(n.hasAttribute("ondblclick")&&o.push("ondblclick"),n.hasAttribute("onmousemove")&&o.push("onmousemove"),n.hasAttribute("onmousedown")&&!n.hasAttribute("onkeydown")&&o.push("onmousedown"),n.hasAttribute("onmouseup")&&!n.hasAttribute("onkeyup")&&o.push("onmouseup"),n.hasAttribute("onmouseover")&&!n.hasAttribute("onfocus")&&o.push("onmouseover"),n.hasAttribute("onmouseout")&&!n.hasAttribute("onblur")&&o.push("onmouseout"),n.hasAttribute("onclick")&&!n.hasAttribute("onkeypress")&&"a"!=r&&"button"!=r&&o.push("onclick")),l?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1",[r,o.join(", ")])}}},1704(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_orientation_unlocked=void 0;var a=i(461),n=i(461),r=i(4919),l=i(3946),o=i(4566),s=i(5279),u=i(7139);t.element_orientation_unlocked={id:"element_orientation_unlocked",context:"dom:*",help:{"en-US":{pass:"element_orientation_unlocked.html",fail_locked:"element_orientation_unlocked.html",group:"element_orientation_unlocked.html"}},messages:{"en-US":{pass:"The element is not restricted to either landscape or portrait orientation using CSS transform property",fail_locked:"The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property",group:"Elements should not be restricted to either landscape or portrait orientation using CSS transform property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["b33eff"],run:function(e,t,i){var n=e.dom.node;if(!l.VisUtil.isNodeVisible(n))return null;if(u.CommonUtil.getAncestor(n,["script","meta","title"]))return null;if(!u.CommonUtil.hasInnerContent(n))return null;var d=n.nodeName.toLowerCase(),c=s.FragmentUtil.getOwnerFragment(n),m=o.CacheUtil.getCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",null);m||(m=r.CSSUtil.getMediaOrientationTransform(c),o.CacheUtil.setCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",m));var p=[];if(Object.keys(m).forEach(function(e){Object.keys(m[e]).forEach(function(t){Object.keys(m[e][t]).length>0&&r.CSSUtil.selectorMatchesElem(n,t)&&(m[e][t].transform?p.push(m[e][t].transform):p.push(m[e][t]))})}),0===p.length)return null;for(var h=[],g=function(e){var t=p[e];if("object"==typeof t)for(var i in t)t=i+"("+t[i]+")";var l=!1;if(["rotate","rotate3d","rotateZ","matrix","matrix3d"].forEach(function(e){t.includes(e)&&(l=!0)}),!l)return"continue";var o=r.CSSUtil.getRotationDegree(t);if(0===o)return h.push((0,a.RulePass)("pass")),"continue";var s=r.CSSUtil.getDefinedStyles(n,["transform"]);s.transform&&(o+=r.CSSUtil.getRotationDegree(s.transform));var u=o%180;u<=1||u>=179?h.push((0,a.RulePass)("pass")):h.push((0,a.RuleFail)("fail_locked",[d]))},b=0;b<p.length;b++)g(b);return h.length>0?h:null}}},5053(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_scrollable_tabbable=void 0;var a=i(7139),n=i(461),r=i(3946),l=i(7011);t.element_scrollable_tabbable={id:"element_scrollable_tabbable",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_scrollable_tabbable.html",pass_tabbable:"element_scrollable_tabbable.html",pass_interactive:"element_scrollable_tabbable.html",fail_scrollable:"element_scrollable_tabbable.html"}},messages:{"en-US":{group:"Scrollable elements should be tabbable or contain tabbable content",pass_tabbable:"The scrollable element is tabbable",pass_interactive:"The scrollable element has tabbable content",fail_scrollable:"The scrollable element <{0}> with non-interactive content is not tabbable"}},rulesets:[],act:["0ssw9k"],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeVisible(o)&&!a.CommonUtil.isNodeDisabled(o))return a.CommonUtil.getAncestor(o,["iframe","svg","script","meta","style"])?null:a.CommonUtil.hasInnerContent(o)?l.AriaUtil.isNavigationOwnedOrControlled(o)?null:r.VisUtil.isElementScrollable(o)?a.CommonUtil.isTabbable(o)?(0,n.RulePass)("pass_tabbable"):a.CommonUtil.getTabbableChildren(o)>0?(0,n.RulePass)("pass_interactive"):!o.hasAttribute("tabindex")&&navigator.userAgent.indexOf("Firefox")>-1?null:(0,n.RuleFail)("fail_scrollable",[o.nodeName.toLowerCase()]):null:null}}},4681(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_role_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3864),u=i(3946);t.element_tabbable_role_valid={id:"element_tabbable_role_valid",context:"dom:*",help:{"en-US":{pass:"element_tabbable_role_valid.html",fail_invalid_role:"element_tabbable_role_valid.html",fail_no_valid_role:"element_tabbable_role_valid.html",group:"element_tabbable_role_valid.html"}},messages:{"en-US":{pass:"The tabbable element has a widget role",fail_invalid_role:"The tabbable element's role '{0}' is not a widget role",fail_no_valid_role:"The tabbable element does not have a valid widget role",group:"A tabbable element must have a valid widget role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.isNodeDisabled(n)||u.VisUtil.isNodeHiddenFromAT(n))return null;var d=n.nodeName.toLowerCase();if(d in l.CommonUtil.tabTagMap){var c=l.CommonUtil.tabTagMap[d];if("function"==typeof c&&(c=c(n)),c)return null}if(!n.hasAttribute("tabindex")||parseInt(n.getAttribute("tabindex"))<0)return null;if(r.AriaUtil.isNavigationOwnedOrControlled(n))return null;if(u.VisUtil.isElementScrollable(n))return null;var m=s.DOMWalker.parentNode(n),p=r.AriaUtil.getResolvedRole(m);if(["button","checkbox","img","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab"].includes(p))return null;var h=r.AriaUtil.getResolvedRole(n);return h?"application"===h?null:"row"===h||"separator"===h||"widget"===o.ARIADefinitions.designPatterns[h].roleType?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid_role",[h]):(0,a.RuleFail)("fail_no_valid_role")}}},8050(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_unobscured=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3946),o=i(7507),s=i(3883);t.element_tabbable_unobscured={id:"element_tabbable_unobscured",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_unobscured.html",pass:"element_tabbable_unobscured.html",potential_obscured:"element_tabbable_unobscured.html"}},messages:{"en-US":{group:"When an element receives focus, it is not entirely covered by other content",pass:"The element is not entirely covered by other content",potential_obscured:"Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.4.11"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!l.VisUtil.isNodeVisible(r)||!a.CommonUtil.isTabbable(r))return null;var u=r.nodeName.toLocaleLowerCase();if(null!==a.CommonUtil.getAncestor(r,["pre","code","script","meta"])||"body"===u||"html"===u)return null;var d=r.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=new o.DOMMapper,p=m.getUnadjustedBounds(r);if(!p||0===p.height||0===p.width)return null;var h=c.getComputedStyle(r);if(!h)return null;var g=parseInt("auto"!==h.zIndex&&h.zIndex?h.zIndex:"0"),b=d.querySelectorAll("body *:not(script):not(style):not(meta):not(link)");if(!b||0===b.length)return null;for(var _=!0,f=p.left+p.width,v=p.top+p.height,A=0;A<b.length;A++){var w=b[A],y=r.compareDocumentPosition(w);if(0===y||y&Node.DOCUMENT_POSITION_CONTAINED_BY)_=!1;else if(!(y&Node.DOCUMENT_POSITION_CONTAINS)&&l.VisUtil.isNodeVisible(w)){var C=m.getUnadjustedBounds(w);if(C&&0!==C.height&&0!==C.width&&!(C.top>p.top||C.left>p.left)){var k=C.left+C.width,R=C.top+C.height;if(!(k<f||R<v)){var x=c.getComputedStyle(w);if(x){var P=parseInt("auto"===x.zIndex||!x.zIndex||isNaN(Number(x.zIndex))?"0":x.zIndex);if(_&&P>g||!_&&P>=g){var T,U=!1;if(x.background&&"none"!==x.background&&(U=(T=s.ColorUtil.Color(x.background))&&(void 0===T.alpha||T.alpha>0)),!U&&x.backgroundColor&&(U=(T=s.ColorUtil.Color(x.backgroundColor))&&(void 0===T.alpha||T.alpha>0)),!a.CommonUtil.hasInnerContentHidden(w)&&!U)continue;return(0,n.RulePotential)("potential_obscured",[])}}}}}}return(0,n.RulePass)("pass")}}},2644(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_visible=void 0;var a=i(7139),n=i(4919),r=i(461),l=i(461),o=i(7507);t.element_tabbable_visible={id:"element_tabbable_visible",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_visible.html",pass:"element_tabbable_visible.html",potential_visible:"element_tabbable_visible.html"}},messages:{"en-US":{group:"A tabbable element should be visible on the screen when it has keyboard focus",pass:"The tabbable element is visible on the screen",potential_visible:"Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.7"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!a.CommonUtil.isTabbable(l))return null;var s=l.nodeName.toLocaleLowerCase(),u=(new o.DOMMapper).getUnadjustedBounds(l);if(!u)return null;var d=n.CSSUtil.getDefinedStylesMultiple(l,["position","clip"],["",":focus"]),c=d[""],m=d[":focus"];if(0===u.height||0===u.width)return(0,r.RulePotential)("potential_visible",[]);if("absolute"===c.position&&c.clip&&"rect(0px,0px,0px,0px)"===c.clip.replaceAll(" ","")&&!m.clip){if("input"===s&&("checkbox"===l.getAttribute("type")||"radio"===l.getAttribute("type"))){var p=a.CommonUtil.getLabelForElement(l);if(p&&!a.CommonUtil.isInnerTextEmpty(p)){var h=n.CSSUtil.getDefinedStylesMultiple(l,null,[":focus-visible",":focus-within",":checked",":focus"]),g=h[":focus-visible"],b=h[":focus-within"],_=h[":checked"];if(h[":focus"]||g||b||_)return(0,r.RulePass)("pass")}}return(0,r.RulePotential)("potential_visible",[])}if(u.top>=0&&u.left>=0)return(0,r.RulePass)("pass");var f=getComputedStyle(l),v=u.top,A=u.left;if(0===Object.keys(m).length)return(0,r.RulePotential)("potential_visible",[]);var w=["absolute","fixed"];return void 0!==m.top&&(v=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.top.replace(/\D/g,""):Number.MIN_VALUE),void 0!==m.left&&(A=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.left.replace(/\D/g,""):Number.MIN_VALUE),v>=0&&A>=0?(0,r.RulePass)("pass"):(0,r.RulePotential)("potential_visible",[])}}},429(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.embed_alt_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.embed_alt_exists={id:"embed_alt_exists",context:"dom:embed",refactor:{RPT_Embed_HasAlt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_alt_exists.html",Potential_1:"embed_alt_exists.html",group:"embed_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element has alternative content",group:"Provide alternative content for <embed> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},4617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.emoticons_alt_exists=void 0;var a=i(461),n=i(7139);t.emoticons_alt_exists={id:"emoticons_alt_exists",context:"dom:*",refactor:{WCAG20_Text_Emoticons:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"emoticons_alt_exists.html",Potential_1:"emoticons_alt_exists.html",group:"emoticons_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that emoticons have a text alternative",group:"Emoticons must have a short text alternative that describes their purpose"}},rulesets:[],act:[],run:function(e,t,i){for(var r=e.dom.node,l=[":-)",":)",":o)",":]",":3",":c)",":>","=]","8)","=)",":D","C:",":-D",":D","8D","XD","=D","=3","<=3","<=8","--!--",":-(",":(",":c",":<",":[","D:","D8","D;","D=","DX","v.v",":-9",";-)",";)","*)",";]",";D",":-P",":P",":-p",":p","=p",":-Þ",":Þ",":-b",":b",":-O",":O","O_O","o_o","8O","OwO","O-O","0_o","O_o","O3O","o0o ;o_o;","o...o","0w0",":-/",":/",":\\","=/","=\\",":S",":|","d:-)","qB-)",":)~",":-)>....",":-X",":X",":-#",":#","O:-)","0:3","O:)",":'(",";*(","T_T","TT_TT","T.T",":-*",":*","^o)",">:)",">;)",">:-)","B)","B-)","8)","8-)","^>.>^","^<.<^","^>_>^","^<_<^","D:<",">:(","D-:<",">:-(",":-@[1]",";(","`_´","D<","<3","<333","=^_^=","=>.>=","=<_<=","=>.<=","\\,,/","\\m/","\\m/\\>.</\\m/","\\o/","\\o o/","o/\\o",":&",":u"],o=!0,s="",u=r.firstChild;u;)"#text"==u.nodeName&&(s+=" "+u.nodeValue),u=u.nextSibling;if(s.trim().length>0)for(var d=0;o&&d<l.length;++d)for(var c=s.indexOf(l[d]),m=l[d].length;o&&-1!=c;)o=(o=(o=c>0&&!/\s/.test(s.substring(c-1,c))||c<s.length-m&&!/\s/.test(s.substring(c+m,c+m+1))&&!/[.,!'"?]/.test(s.substring(c+m,c+m+1)))||(":)"==l[d]||"(:"==l[d])&&/\(\:.*\:\)/.test(s))||(";)"==l[d]||"(;"==l[d])&&/\(\;.*\;\)/.test(s),c=s.indexOf(l[d],c+1);if(!o){var p=n.CommonUtil.getAncestor(r,["pre","code","script","body"]);o=null==p||"body"!=p.nodeName.toLowerCase()}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},5460(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.error_message_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(5279),o=i(3946);t.error_message_exists={id:"error_message_exists",context:"dom:*[aria-invalid=true]",refactor:{HAAC_Aria_ErrorMessage:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"error_message_exists.html",Fail_1:"error_message_exists.html",Fail_2:"error_message_exists.html",group:"error_message_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Custom error message has invalid reference 'id' value",Fail_2:"Custom error message is not visible",group:"A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.AriaUtil.getAriaAttribute(n,"aria-errormessage");if(!s)return null;var u=l.FragmentUtil.getById(n,s);return u?o.VisUtil.isNodeVisible(u)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2"):(0,a.RuleFail)("Fail_1")}}},3399(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_label_valid=void 0;var a=i(461),n=i(461),r=i(5279),l=i(4566),o=i(7139),s=i(3946),u=i(1950);t.fieldset_label_valid={id:"fieldset_label_valid",context:"aria:group",refactor:{group_withInputs_hasName:{Pass_1:"Pass_1",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_1:"fieldset_label_valid.html",Fail_1:"fieldset_label_valid.html",Fail_2:"fieldset_label_valid.html",group:"fieldset_label_valid.html"}},messages:{"en-US":{Pass_1:'Group/Fieldset "{0}" with an input has a unique name',Fail_1:"Group/Fieldset does not have an accessible name",Fail_2:'Group/Fieldset "{0}" has a duplicate name to another group',group:"Groups with nested inputs must have unique accessible name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)){var d=r.FragmentUtil.getOwnerFragment(n),c=l.CacheUtil.getCache(n.ownerDocument,"landmark_group_input",null);if(!c){c={groupsWithInputs:[],groupsWithInputsComputedLabels:[]};for(var m=d.querySelectorAll('fieldset,[role="group"]'),p=Array.from(m),h=[],g=0;g<p.length;g++)p[g].querySelector("input")&&h.push(p[g]);var b=[];for(g=0;g<h.length;g++){var _=u.AccNameUtil.computeAccessibleName(h[g]);b.push(_&&_.name&&_.name.trim().length>0?_.name.trim():"")}c.groupsWithInputs=h,c.groupsWithInputsComputedLabels=b,l.CacheUtil.setCache(n.ownerDocument,"landmark_group_input",c)}var f=!1,v="";if(!c.groupsWithInputs)return null;for(g=0;g<c.groupsWithInputs.length;g++)if(n.isSameNode(c.groupsWithInputs[g])){if(f=!0,""===c.groupsWithInputsComputedLabels[g]||null===c.groupsWithInputsComputedLabels[g])return(0,a.RuleFail)("Fail_1");for(var A=!1,w=0;w<c.groupsWithInputsComputedLabels.length;w++)g!=w&&c.groupsWithInputsComputedLabels[g]===c.groupsWithInputsComputedLabels[w]&&(A=!0);if(A)return(0,a.RuleFail)("Fail_2",[c.groupsWithInputsComputedLabels[g]]);v=c.groupsWithInputsComputedLabels[g]}return f?(0,a.RulePass)("Pass_1",[v]):null}}}},3498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_legend_valid=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.fieldset_legend_valid={id:"fieldset_legend_valid",context:"dom:fieldset",refactor:{WCAG20_Fieldset_HasLegend:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"fieldset_legend_valid.html",Fail_1:"fieldset_legend_valid.html",Fail_2:"fieldset_legend_valid.html",Fail_3:"fieldset_legend_valid.html",group:"fieldset_legend_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<fieldset> element does not have a <legend>",Fail_2:"<fieldset> element has more than one <legend>",Fail_3:"<fieldset> element <legend> is empty",group:" <fieldset> elements should have a single, non-empty <legend> as a label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n)||r.CommonUtil.isNodeDisabled(n))return null;var o=r.CommonUtil.getChildByTagHidden(n,"legend",!0,!1);return 0===o.length?(0,a.RuleFail)("Fail_1"):o.length>1?(0,a.RuleFail)("Fail_2"):0===r.CommonUtil.getInnerText(o[0]).trim().length?(0,a.RuleFail)("Fail_3"):(0,a.RulePass)("Pass_0")}}},9629(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.figure_label_exists=void 0;var a=i(461),n=i(461),r=i(3946),l=i(1950);t.figure_label_exists={id:"figure_label_exists",context:"dom:figure",refactor:{HAAC_Figure_label:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"figure_label_exists.html",Fail_1:"figure_label_exists.html",group:"figure_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <figure> element does not have an associated label",group:"A <figure> element must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=l.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[])}}},733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_font_color=void 0;var a=i(461),n=i(461);t.form_font_color={id:"form_font_color",context:"dom:form",refactor:{RPT_Font_ColorInForm:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_font_color.html",Potential_1:"form_font_color.html",group:"form_font_color.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Check color is not used as the only visual means to convey which fields are required",group:"Combine color and descriptive markup to indicate required form fields"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!0,r=e.dom.node.getElementsByTagName("font");if(null!=r)for(var l=0;l<r.length;++l)n=!r[l].hasAttribute("color");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9797(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_interaction_review=void 0;var a=i(461),n=i(461),r=i(7139);t.form_interaction_review={id:"form_interaction_review",context:"dom:form[target]",refactor:{WCAG20_Form_TargetAndText:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_interaction_review.html",Potential_1:"form_interaction_review.html",group:"form_interaction_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that interacting with content will not open pop-up windows or change the active window without informing the user",group:"User should be informed in advance when interacting with content causes a change of context"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n={paramWinText:{value:["new window"],type:"array"}},l=e.dom.node,o=l.getAttribute("target"),s="_parent"===o||"_self"===o||"_top"===o||null!=r.CommonUtil.getFrameByName(l,o);if(!s){var u=r.CommonUtil.getInnerText(l);l.hasAttribute("title")&&(u+=" "+l.getAttribute("title"));for(var d=0;!s&&d<n.paramWinText.value.length;++d)-1!=u.indexOf(n.paramWinText.value[d])&&(s=!0)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},7156(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_label_unique=void 0;var a=i(461),n=i(461),r=i(5279),l=i(4566);t.form_label_unique={id:"form_label_unique",context:"dom:label[for]",refactor:{RPT_Label_UniqueFor:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"form_label_unique.html",Fail_1:"form_label_unique.html",group:"form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control has more than one label",group:"Form controls should have exactly one label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CacheUtil.getCache(r.FragmentUtil.getOwnerFragment(n),"RPT_Label_Single",{}),s=n.getAttribute("for"),u=!(s in o);return o[s]=!0,u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3062(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_button_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3864);t.form_submit_button_exists={id:"form_submit_button_exists",context:"dom:form",refactor:{WCAG20_Form_HasSubmit:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_button_exists.html",Potential_1:"form_submit_button_exists.html",group:"form_submit_button_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the <form> element has a submit button or an image button",group:"A <form> element should have a submit button or an image button"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1;if(n.firstChild)for(var s=new l.DOMWalker(n,!0);!o&&s.prevNode()&&s.node!=n;)if(!s.bEndTag){var u=s.node.nodeName.toLowerCase();if("input"===u){var d=s.elem().getAttribute("type");d&&(d=d.toLowerCase()),o="submit"===d||"image"===d}else"button"===u?o=s.elem().hasAttribute("type")&&"submit"===s.elem().getAttribute("type").toLowerCase():1===s.node.nodeType&&(o=r.AriaUtil.hasRole(s.node,"button"))}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3827(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_review=void 0;var a=i(461);t.form_submit_review={id:"form_submit_review",context:"dom:select[onchange], dom:input[onchange]",refactor:{RPT_Form_ChangeEmpty:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_review.html",Potential_1:"form_submit_review.html",group:"form_submit_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Confirm the form does not submit automatically without warning",group:"A form should not be submitted automatically without warning the user"}},rulesets:[],act:[],run:function(e,t,i){var n=0===e.dom.node.getAttribute("onchange").trim().length;return n?null:n?void 0:(0,a.RulePotential)("Potential_1")}}},5498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_src_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.frame_src_valid={id:"frame_src_valid",context:"dom:frame, dom:iframe",refactor:{Valerie_Frame_SrcHtml:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"frame_src_valid.html",Potential_1:"frame_src_valid.html",group:"frame_src_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify <frame> content is accessible",group:"A <frame> containing non-HTML content must be made accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.attributeNonEmpty(n,"src")&&r.CommonUtil.isHtmlExt(r.CommonUtil.getFileExt(n.getAttribute("src")));return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},510(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_title_exists=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.frame_title_exists={id:"frame_title_exists",context:"dom:frame, dom:iframe",refactor:{WCAG20_Frame_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"frame_title_exists.html",Pass_0:"frame_title_exists.html",Fail_1:"frame_title_exists.html"}},messages:{"en-US":{group:"Inline frames must have a unique, non-empty 'title' attribute",Pass_0:"Rule Passed",Fail_1:"Inline frame does not have a 'title' attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:"cae760",run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=r.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7722(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_content_exists=void 0;var a=i(461),n=i(461),r=i(7139);t.heading_content_exists={id:"heading_content_exists",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",refactor:{RPT_Header_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"heading_content_exists.html",Fail_1:"heading_content_exists.html",group:"heading_content_exists.html"}},messages:{"en-US":{Pass_0:"Heading element has descriptive text",Fail_1:"Heading element has no descriptive content",group:"Heading elements must provide descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.6"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4597(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_markup_misuse=void 0;var a=i(461),n=i(461),r=i(7139);t.heading_markup_misuse={id:"heading_markup_misuse",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",dependencies:["heading_content_exists"],refactor:{RPT_Headers_FewWords:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"heading_markup_misuse.html",Potential_1:"heading_markup_misuse.html",group:"heading_markup_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the heading element is a genuine heading",group:"Heading elements must not be used for presentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.wordCount(r.CommonUtil.getInnerText(n))<=20;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},2104(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_lang_exists=void 0;var a=i(461),n=i(461),r=i(6858),l=i(1043);t.html_lang_exists={id:"html_lang_exists",context:"dom:html",refactor:{WCAG20_Html_HasLang:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3",Fail_4:"Fail_4",Fail_5:"Fail_5",Potential_5:"Potential_5",Potential_6:"Potential_6"}},help:{"en-US":{group:"html_lang_exists.html",Pass_0:"html_lang_exists.html",Fail_1:"html_lang_exists.html",Fail_2:"html_lang_exists.html",Fail_3:"html_lang_exists.html",Fail_4:"html_lang_exists.html",Fail_5:"html_lang_exists.html",Potential_5:"html_lang_exists.html",Potential_6:"html_lang_exists.html"}},messages:{"en-US":{group:"Page must identify the default language of the document with a 'lang' attribute",Pass_0:'Page language detected as "{0}"',Fail_1:"Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes",Fail_2:"Page detected as XHTML, but does not have an 'xml:lang' attribute",Fail_3:"Page detected as HTML, but does not have a 'lang' attribute",Fail_4:"Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"",Fail_5:"Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"",Potential_5:"Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type",Potential_6:"Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.1.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"fail",Fail_4:"inapplicable",Fail_5:"inapplicable",Potential_5:"inapplicable",Potential_6:"inapplicable"},"5b7ae0":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"fail",Fail_5:"pass",Potential_5:"inapplicable",Potential_6:"inapplicable"}}],run:function(e,t,i){if(r.AncestorUtil.isPresentationFrame(i))return null;var n=e.dom.node,o=n.ownerDocument.doctype?n.ownerDocument.doctype.publicId:"";o||(o="");var s=n.getAttribute("lang"),u=n.getAttribute("xml:lang");return o.includes("XHTML")&&!o.includes("1.0")?u?(0,a.RulePass)("Pass_0",[u]):(0,a.RuleFail)("Fail_2"):o.includes("XHTML")&&o.includes("1.0")?s||u?s&&u?s!==u?l.LangUtil.validPrimaryLang(s)&&l.LangUtil.validPrimaryLang(u)?l.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):s?(0,a.RulePotential)("Potential_5"):(0,a.RulePotential)("Potential_6"):(0,a.RuleFail)("Fail_1"):s?s&&u&&s!==u?l.LangUtil.validPrimaryLang(s)&&l.LangUtil.validPrimaryLang(u)?l.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):(0,a.RuleFail)("Fail_3")}}},8260(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_skipnav_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(5279);t.html_skipnav_exists={id:"html_skipnav_exists",context:"dom:html",refactor:{RPT_Html_SkipNav:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"html_skipnav_exists.html",Pass_0:"html_skipnav_exists.html",Potential_1:"html_skipnav_exists.html"}},messages:{"en-US":{group:"Provide a way to bypass blocks of content that are repeated on multiple Web pages",Pass_0:"Rule Passed",Potential_1:"Verify there is a way to bypass blocks of content that are repeated on multiple Web pages"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1,s=r.CommonUtil.getDocElementsByTag(n,"frame"),u=r.CommonUtil.getDocElementsByTag(n,"h1");if(null!=s&&s.length>0||null!=u&&u.length>0)o=!0;else for(var d=r.CommonUtil.getDocElementsByTag(n,"a"),c={},m=0;!o&&m<d.length;++m)if(d[m].hasAttribute("href")){var p=d[m].href;"string"!=typeof p&&(p=p.baseVal?p.baseVal:"");var h,g="";if((h=void 0!==n.ownerDocument.locationFromDAP&&null!=n.ownerDocument.locationFromDAP?n.ownerDocument.locationFromDAP:n.ownerDocument.location)&&(g=h.href),p.startsWith("file:///")&&(p="file:/"+p.substring(8)),g.startsWith("file:///")&&(g="file:/"+g.substring(8)),"#"==p.charAt(0)||p.startsWith(g+"#")){var b=r.CommonUtil.getFileAnchor(p);null!=l.FragmentUtil.getById(n,b)?o=!0:c[b]=!0}}else if(d[m].hasAttribute("name")){var _=d[m].getAttribute("name");-1!=_.indexOf("#")&&(_=r.CommonUtil.getFileAnchor(_)),o=_ in c}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8920(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.iframe_interactive_tabbable=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3946),o=i(7507);t.iframe_interactive_tabbable={id:"iframe_interactive_tabbable",context:"dom:iframe",dependencies:[],help:{"en-US":{group:"iframe_interactive_tabbable.html",pass:"iframe_interactive_tabbable.html",fail_invalid:"iframe_interactive_tabbable.html"}},messages:{"en-US":{group:"Iframe with interactive content should not be excluded from tab order using tabindex",pass:"The iframe with interactive content is not excluded from the tab order using tabindex",fail_invalid:"The <iframe> with interactive content is excluded from tab order using tabindex"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:["akn7bn"],run:function(e,t,i){var r=e.dom.node;if(!l.VisUtil.isNodeHiddenFromAT(r)&&!a.CommonUtil.isNodeDisabled(r)){var s=(new o.DOMMapper).getUnadjustedBounds(r);if(!s)return null;if(Math.max(s.height,s.width)<30||Math.min(s.height,s.width)<15)return null;if(!r.hasAttribute("tabindex")||parseInt(r.getAttribute("tabindex"))>=0)return(0,n.RulePass)("pass");var u=r;if(!u||!u.contentDocument||!u.contentDocument.documentElement)return null;var d=r.ownerDocument;return d&&Array.from(d.querySelectorAll("dialog")).some(function(e){return e.matches(":modal")&&!e.contains(r)})?null:a.CommonUtil.getTabbableChildren(r)>0?(0,n.RuleFail)("fail_invalid"):null}}}},1237(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagebutton_alt_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.imagebutton_alt_exists={id:"imagebutton_alt_exists",context:"dom:input",refactor:{WCAG20_Input_ExplicitLabelImage:{Pass_0:"Pass_0",Pass_1:"Pass_1",Pass_2:"Pass_2",Fail:"Fail"}},help:{"en-US":{Pass_0:"imagebutton_alt_exists.html",Pass_1:"imagebutton_alt_exists.html",Pass_2:"imagebutton_alt_exists.html",Fail:"imagebutton_alt_exists.html",group:"imagebutton_alt_exists.html"}},messages:{"en-US":{Pass_0:"Image button provides alternative text using the 'alt' attribute",Pass_1:"Image button provides alternative text using an ARIA label",Pass_2:"Image button provides alternative text using the 'title' attribute",Fail:'The <input> element of type "image" has no text alternative',group:'The <input> element of type "image" should have a text alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"59796f",run:function(e,t,i){var n=e.dom.node;return n.hasAttribute("type")&&"image"==n.getAttribute("type").toLowerCase()?l.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):r.AriaUtil.hasAriaLabel(n)?(0,a.RulePass)("Pass_1"):n.hasAttribute("title")&&n.getAttribute("title").length>0?(0,a.RulePass)("Pass_2"):(0,a.RuleFail)("Fail"):null}}},4101(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagemap_alt_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.imagemap_alt_exists={id:"imagemap_alt_exists",context:"dom:img[usemap], dom:img[ismap]",refactor:{HAAC_Img_UsemapAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"imagemap_alt_exists.html",Fail_1:"imagemap_alt_exists.html",group:"imagemap_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image map or child <area> has no text alternative",group:"An image map and each <area> element in an image map must have text alternative(s)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.CommonUtil.attributeNonEmpty(n,"alt")||!n.hasAttribute("ismap")&&!r.CommonUtil.attributeNonEmpty(n,"usemap")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},275(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_background=void 0;var a=i(461),n=i(461),r=i(3946);t.img_alt_background={id:"img_alt_background",context:"dom:*",refactor:{HAAC_BackgroundImg_HasTextOrTitle:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"img_alt_background.html",Manual_1:"img_alt_background.html",group:"img_alt_background.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify important background image information has a text alternative in system high contrast mode",group:"Background images that convey important information must have a text alternative that describes the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.ownerDocument.defaultView.getComputedStyle(n);if(null==l)return(0,a.RulePass)("Pass_0");var o=l.backgroundImage,s=!0;if(null!=o&&""!=o&&"none"!=o&&"inherit"!=o)if(null!=n.innerHTML&&0!=n.innerHTML.trim().length)s=!1;else{var u=n.getAttribute("title");null!=u&&0!=u.length&&(s=!1)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RuleManual)("Manual_1")}}},7601(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_decorative=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.img_alt_decorative={id:"img_alt_decorative",context:"dom:img[alt]",refactor:{WCAG20_Img_PresentationImgHasNonNullAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"img_alt_decorative.html",Fail_1:"img_alt_decorative.html",group:"img_alt_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image designated as decorative has non-null 'alt' attribute",group:'Image designated as decorative must have \'alt=""'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=!0;return(r.AriaUtil.hasRole(n,"presentation")||r.AriaUtil.hasRole(n,"none"))&&(o=0==n.getAttribute("alt").length),o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7541(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_misuse=void 0;var a=i(461),n=i(461),r=i(3946);t.img_alt_misuse={id:"img_alt_misuse",context:"dom:img, dom:area, dom:input",refactor:{RPT_Img_AltCommonMisuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_alt_misuse.html",Potential_1:"img_alt_misuse.html",group:"img_alt_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file name serves as a good inline replacement for the image",group:"'alt' attribute value must be a good inline replacement for the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.nodeName.toLowerCase(),o=!0;if(n.hasAttribute("alt")){var s=n.getAttribute("alt").trim();if(s.length>0){for(var u=["short description"],d=0;o&&d<u.length;++d)o=-1==s.indexOf(u[d]);if(o){var c=n.getAttribute("area"==l?"href":"src");null!=c&&(o=c.trim()!=s&&(-1==s.indexOf(".")||-1==s.indexOf(c)&&-1==c.indexOf(s)))}}}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8274(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_null=void 0;var a=i(461),n=i(461),r=i(3946),l=i(7011),o=i(7139);t.img_alt_null={id:"img_alt_null",context:"dom:img[alt]",refactor:{WCAG20_Img_TitleEmptyWhenAltNull:{Pass_0:"pass",Fail_1:"fail_decorative"}},help:{"en-US":{pass:"img_alt_null.html",fail_decorative:"img_alt_null.html",potential_aria_override:"img_alt_null.html",group:"img_alt_null.html"}},messages:{"en-US":{pass:"Neither 'aria' nor 'title' attributes are used for the decorative image",fail_decorative:"The image 'alt' attribute is empty, but the 'title' attribute is not empty",potential_aria_override:"The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute",group:"When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_decorative"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["potential_aria_override"]}],act:[{"46ca7f":{potential_aria_override:"fail"}}],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)||n.getAttribute("alt").trim().length>0?null:l.AriaUtil.getAriaLabel(n).length>0?(0,a.RulePotential)("potential_aria_override"):o.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RuleFail)("fail_decorative"):(0,a.RulePass)("pass")}}},590(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_redundant=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7139);t.img_alt_redundant={id:"img_alt_redundant",context:"dom:img[alt]",refactor:{WCAG20_Img_LinkTextNotRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"img_alt_redundant.html",Fail_1:"img_alt_redundant.html",Fail_2:"img_alt_redundant.html",Fail_3:"img_alt_redundant.html",group:"img_alt_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Link text is repeated in an image 'alt' value within the same link",Fail_2:"Link text of previous link is repeated in image 'alt' value of a link",Fail_3:"Image 'alt' value within a link is repeated in link text of the link after",group:"The text alternative for an image within a link should not repeat the link text or adjacent link text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.4.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CommonUtil.getAncestor(n,"a");if(null==o)return null;var s=n.getAttribute("alt").trim().toLowerCase();if(0==s.length)return null;var u=o.innerText,d="";if(null!=u&&(d=u.trim().toLowerCase()),!(d.length>0)){for(var c=!0,m=new r.DOMWalker(o);c&&m.prevNode()&&!("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&l.CommonUtil.attributeNonEmpty(p,"alt"));)"a"!==h||l.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=(p.innerText||p.textContent||"").trim().toLowerCase()!=s);if(!c)return(0,a.RuleFail)("Fail_2");for(m=new r.DOMWalker(o,!0);c&&m.nextNode();){var p,h;if("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&l.CommonUtil.attributeNonEmpty(p,"alt"))break;"a"!=h||l.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=p.innerText.trim().toLowerCase()!=s)}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3")}return s==d?(0,a.RuleFail)("Fail_1"):void 0}}},8925(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946),o=i(1950);t.img_alt_valid={id:"img_alt_valid",context:"dom:img",refactor:{WCAG20_Img_HasAlt:{pass:"pass",fail_blank_alt:"fail_blank_alt",fail_no_alt:"fail_no_alt",fail_blank_title:"fail_blank_title"}},help:{"en-US":{pass:"img_alt_valid.html",fail_blank_alt:"img_alt_valid.html",fail_no_alt:"img_alt_valid.html",fail_blank_title:"img_alt_valid.html",group:"img_alt_valid.html"}},messages:{"en-US":{pass:"The image has an accessible name or is correctly marked as decorative or redundant",fail_blank_alt:"Image 'alt' attribute value consists only of blank space(s)",fail_no_alt:"The image has neither an accessible name nor is marked as decorative or redundant",fail_blank_title:"The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)",group:"Images must have accessible names unless they are decorative or redundant"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"23a2a8",run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n)||o.AccNameUtil.isAccessibleNameIgnorable(n))return null;if(0!==r.AriaUtil.getAriaLabel(n).trim().length)return(0,a.RulePass)("pass");var s=n.hasAttribute("alt")?n.getAttribute("alt"):null;if(null!==s)return 0===s.length||s.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_blank_alt");var u=n.hasAttribute("title")?n.getAttribute("title"):null;if(null!==u&&0!==u.length)return 0===u.trim().length?(0,a.RuleFail)("fail_blank_title"):(0,a.RulePass)("pass");if(null===s){var d=r.AriaUtil.getResolvedRole(n,!1);return"presentation"===d||"none"===d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_alt")}return 0===s.length?(0,a.RulePass)("pass"):void 0}}},9234(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_ismap_misuse=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.img_ismap_misuse={id:"img_ismap_misuse",context:"dom:img[ismap]",refactor:{RPT_Img_UsemapValid:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_ismap_misuse.html",Potential_1:"img_ismap_misuse.html",group:"img_ismap_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Server-side image map hot-spots do not have duplicate text links",group:"Server-side image map hot-spots must have duplicate text links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=!1;if(n.hasAttribute("usemap")){var s=n.getAttribute("usemap"),u=(s=s.trim().toLowerCase()).indexOf("#");if(-1!=u&&(s=s.substr(u+1)),s.length>0)for(var d=r.CommonUtil.getDocElementsByTag(n,"map"),c=0;!o&&c<d.length;++c)o=d[c].hasAttribute("name")&&d[c].getAttribute("name").toLowerCase()==s}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_longdesc_misuse=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.img_longdesc_misuse={id:"img_longdesc_misuse",context:"dom:img[longdesc]",refactor:{RPT_Img_LongDescription2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_longdesc_misuse.html",Potential_1:"img_longdesc_misuse.html",group:"img_longdesc_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)",group:" The 'longdesc' attribute must reference HTML content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("longdesc"),s=r.CommonUtil.getFileExt(o),u=0!=s.length&&r.CommonUtil.isHtmlExt(s)||o.startsWith("#")||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("data:");return u?(0,a.RulePass)("Pass_0"):u?void 0:(0,a.RulePotential)("Potential_1")}}},591(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||a(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),n(i(2297),t),n(i(4401),t),n(i(4546),t),n(i(9292),t),n(i(9605),t),n(i(3987),t),n(i(8631),t),n(i(8025),t),n(i(1198),t),n(i(8001),t),n(i(5778),t),n(i(8118),t),n(i(2242),t),n(i(3673),t),n(i(5080),t),n(i(183),t),n(i(6805),t),n(i(1886),t),n(i(4078),t),n(i(5750),t),n(i(85),t),n(i(514),t),n(i(5310),t),n(i(9083),t),n(i(6049),t),n(i(5099),t),n(i(2759),t),n(i(3141),t),n(i(5131),t),n(i(5167),t),n(i(8115),t),n(i(5733),t),n(i(5782),t),n(i(6731),t),n(i(390),t),n(i(3900),t),n(i(1218),t),n(i(6734),t),n(i(9973),t),n(i(5711),t),n(i(3384),t),n(i(2762),t),n(i(5757),t),n(i(5232),t),n(i(1891),t),n(i(6142),t),n(i(4863),t),n(i(1440),t),n(i(1968),t),n(i(1617),t),n(i(3475),t),n(i(3370),t),n(i(9272),t),n(i(7735),t),n(i(3923),t),n(i(7521),t),n(i(1852),t),n(i(799),t),n(i(4614),t),n(i(5952),t),n(i(5395),t),n(i(1992),t),n(i(7955),t),n(i(9531),t),n(i(891),t),n(i(7446),t),n(i(6137),t),n(i(6839),t),n(i(8135),t),n(i(507),t),n(i(3566),t),n(i(5173),t),n(i(6027),t),n(i(7515),t),n(i(1704),t),n(i(5053),t),n(i(4681),t),n(i(8050),t),n(i(2644),t),n(i(429),t),n(i(4617),t),n(i(5460),t),n(i(3399),t),n(i(3498),t),n(i(9629),t),n(i(733),t),n(i(9797),t),n(i(7156),t),n(i(3062),t),n(i(3827),t),n(i(5498),t),n(i(510),t),n(i(7722),t),n(i(4597),t),n(i(2104),t),n(i(8260),t),n(i(8920),t),n(i(1237),t),n(i(4101),t),n(i(275),t),n(i(7601),t),n(i(7541),t),n(i(8274),t),n(i(590),t),n(i(8925),t),n(i(9234),t),n(i(8617),t),n(i(1939),t),n(i(7726),t),n(i(3142),t),n(i(1353),t),n(i(2631),t),n(i(8550),t),n(i(8853),t),n(i(3180),t),n(i(1382),t),n(i(953),t),n(i(2222),t),n(i(4678),t),n(i(7578),t),n(i(9964),t),n(i(6401),t),n(i(1174),t),n(i(9907),t),n(i(6032),t),n(i(5622),t),n(i(2240),t),n(i(4019),t),n(i(361),t),n(i(5960),t),n(i(5515),t),n(i(8752),t),n(i(8834),t),n(i(1025),t),n(i(9116),t),n(i(435),t),n(i(6640),t),n(i(2068),t),n(i(7322),t),n(i(5702),t),n(i(1961),t),n(i(3022),t),n(i(375),t),n(i(4658),t),n(i(4605),t),n(i(5294),t),n(i(3506),t),n(i(7475),t),n(i(8064),t),n(i(7942),t),n(i(2219),t),n(i(1473),t),n(i(1912),t),n(i(6539),t),n(i(4),t),n(i(5334),t),n(i(2173),t),n(i(8349),t),n(i(8142),t),n(i(3980),t),n(i(4701),t),n(i(18),t),n(i(9314),t),n(i(1667),t),n(i(9599),t),n(i(4672),t),n(i(4353),t),n(i(7147),t),n(i(1419),t),n(i(855),t),n(i(3420),t),n(i(408),t)},1939(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_autocomplete_valid=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.input_autocomplete_valid={id:"input_autocomplete_valid",context:"dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]",refactor:{WCAG21_Input_Autocomplete:{Pass_0:"pass",Fail_1:"fail_inappropriate",Fail_2:"fail_invalid",Fail_attribute_incorrect:"fail_incorrect"}},help:{"en-US":{group:"input_autocomplete_valid.html",pass:"input_autocomplete_valid.html",fail_inappropriate:"input_autocomplete_valid.html",fail_invalid:"input_autocomplete_valid.html",fail_incorrect:"input_autocomplete_valid.html"}},messages:{"en-US":{group:"The 'autocomplete' attribute's token(s) must be appropriate for the input form field",pass:"The 'autocomplete' attribute's token(s) is appropriate for the input form field",fail_inappropriate:"The 'autocomplete' attribute's token(s) are not appropriate for the input form field",fail_invalid:"The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type",fail_incorrect:"The 'autocomplete' attribute has an incorrect value"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"73f2c2":{pass:"pass",fail_inappropriate:"fail",fail_invalid:"pass",fail_incorrect:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(!l.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;var o=n.getAttribute("autocomplete").trim().toLowerCase(),s=o.split(/\s+/);if(0===s.length||0===o.length)return null;var u={tokensOnOff:["on","off"],tokenOptionalSection:"section-",tokensOptionalPurpose:["shipping","billing"],tokensMandatoryGroup1_password:["new-password","current-password","one-time-code"],tokensMandatoryGroup1_multiline:["street-address"],tokensMandatoryGroup1_month:["cc-exp"],tokensMandatoryGroup1_numeric:["cc-exp-month","cc-exp-year","transaction-amount","bday-day","bday-month","bday-year"],tokensMandatoryGroup1_date:["bday"],tokensMandatoryGroup1_url:["url","photo"],tokensMandatoryGroup1_text:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","organization-title","organization","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-csc","cc-type","transaction-currency","language","sex"],tokensMandatoryGroup1_all:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","new-password","current-password","organization-title","organization","street-address","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc","cc-type","transaction-currency","transaction-amount","language","bday","bday-day","bday-month","bday-year","sex","url","photo"],tokensOptionalGroup2:["home","work","mobile","fax","pager"],tokensMandatoryGroup2_tel:["tel"],tokensMandatoryGroup2_email:["email"],tokensMandatoryGroup2_url:["impp"],tokensMandatoryGroup2_text:["tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension"],tokensMandatoryGroup2_all:["tel","tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension","email","impp"],tokensOptionGroup1_webauthn:["webauthn"]},d=[];for(var c in u)d=d.concat(u[c]);var m=!1,p=!0,h=n.nodeName.toLowerCase();if(!s.every(function(e){return d.includes(e)||e.startsWith(u.tokenOptionalSection)}))return(0,a.RuleFail)("fail_incorrect");var g=n.hasAttribute("type")?n.getAttribute("type").trim().toLowerCase():"text",b=[],_=[],f=[];if("textarea"===h||"select"===h)b=u.tokensMandatoryGroup1_all,_=u.tokensMandatoryGroup2_all,"textarea"===h&&(f=u.tokensOptionGroup1_webauthn);else{if("input"!==h)return null;switch(f=u.tokensOptionGroup1_webauthn,g){case"text":case"search":b=u.tokensMandatoryGroup1_text.concat(u.tokensMandatoryGroup1_password,u.tokensMandatoryGroup1_url,u.tokensMandatoryGroup1_numeric,u.tokensMandatoryGroup1_month,u.tokensMandatoryGroup1_date),_=u.tokensMandatoryGroup2_all;break;case"password":b=u.tokensMandatoryGroup1_password;break;case"url":b=u.tokensMandatoryGroup1_url,_=u.tokensMandatoryGroup2_url;break;case"email":_=u.tokensMandatoryGroup2_email;break;case"tel":_=u.tokensMandatoryGroup2_tel;break;case"number":b=u.tokensMandatoryGroup1_numeric;break;case"month":b=u.tokensMandatoryGroup1_month;break;case"date":b=u.tokensMandatoryGroup1_date;break;default:return null}}if(s.includes("on")||s.includes("off"))return 1===s.length?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid");var v=0,A=0;return s[v].startsWith(u.tokenOptionalSection)&&s[v].length>8&&(v++,A++),s.length>v&&u.tokensOptionalPurpose.includes(s[v])&&(v++,A++),s.length>v&&(b.includes(s[v])?(m=!0,v++):(u.tokensOptionalGroup2.includes(s[v])&&v++,_.includes(s[v])&&(m=!0,v++))),s.length>A&&(u.tokensMandatoryGroup1_all.includes(s[A])?(p=!0,A++):(u.tokensOptionalGroup2.includes(s[A])&&A++,u.tokensMandatoryGroup2_all.includes(s[A])&&(p=!0,A++))),s.length>v+A&&f.includes(s[v+A])&&v++,(s.length>v&&f.includes(s[v])||s.length>A&&f.includes(s[A]))&&(v++,A++),m&&s.length===v?(0,a.RulePass)("pass"):p&&s.length===A?(0,a.RuleFail)("fail_incorrect"):(0,a.RuleFail)("fail_inappropriate")}}},7726(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_checkboxes_grouped=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3864),s=i(4566),u=i(3946),d=i(9196);t.input_checkboxes_grouped={id:"input_checkboxes_grouped",context:"dom:input[type=radio], dom:input[type=checkbox]",refactor:{WCAG20_Input_RadioChkInFieldSet:{Pass_LoneNogroup:"pass_lonenogroup",Pass_Grouped:"pass_grouped",Pass_RadioNoName:"pass_radioNoName",Fail_ControlNameMismatch:"fail_controlnamemismatch",Fail_NotGroupedOtherGrouped:"fail_notgroupedothergrouped",Fail_NotGroupedOtherNotGrouped:"fail_notgroupedothernotgrouped",Fail_NotSameGroup:"fail_notsamegroup",Potential_LoneCheckbox:"potential_lonecheckbox",Potential_UnnamedCheckbox:"potential_unnamedcheckbox"}},help:{"en-US":{group:"input_checkboxes_grouped.html",pass_lonenogroup:"input_checkboxes_grouped.html",pass_grouped:"input_checkboxes_grouped.html",pass_radiononame:"input_checkboxes_grouped.html",fail_controlnamemismatch:"input_checkboxes_grouped.html",fail_notgroupedothergrouped:"input_checkboxes_grouped.html",fail_notgroupedothernotgrouped:"input_checkboxes_grouped.html",fail_notsamegroup:"input_checkboxes_grouped.html",potential_lonecheckbox:"input_checkboxes_grouped.html",potential_unnamedcheckbox:"input_checkboxes_grouped.html"}},messages:{"en-US":{group:"Related sets of radio buttons or checkboxes should be programmatically grouped",pass_lonenogroup:"{0} grouping not required for a control of this type",pass_grouped:"{0} input is grouped with other related controls with the same name",pass_radiononame:"Radio input is not grouped, but passes because it has no name to group with other radio inputs",fail_controlnamemismatch:'{0} input found that has the same name, "{2}" as a {1} input',fail_notgroupedothergrouped:'{0} input is not in the group with another {0} with the name "{1}"',fail_notgroupedothernotgrouped:'{0} input and others with the name "{1}" are not grouped together',fail_notsamegroup:'{0} input is in a different group than another {0} with the name "{1}"',potential_lonecheckbox:"Verify that this ungrouped checkbox input is not related to other checkboxes",potential_unnamedcheckbox:"Verify that this un-named, ungrouped checkbox input is not related to other checkboxes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(u.VisUtil.isNodeHiddenFromAT(n))return null;var c=function(e){var t=l.CommonUtil.getAncestor(e,"fieldset")||r.AriaUtil.getAncestorWithRole(e,"radiogroup")||r.AriaUtil.getAncestorWithRole(e,"group")||r.AriaUtil.getAncestorWithRole(e,"grid")||r.AriaUtil.getAncestorWithRole(e,"table");return t||(t=l.CommonUtil.getAncestor(e,"table"))&&!d.TableUtil.isDataTable(t)&&(t=null),t},m=n.getAttribute("type").toLowerCase(),p=r.AriaUtil.getAncestorWithRole(n,"form")||l.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement,h=s.CacheUtil.getCache(p,"input_checkboxes_grouped",null);if(!h){h={checkboxByName:{},radiosByName:{},nameToGroup:{},numCheckboxes:0,numRadios:0};for(var g=new o.DOMWalker(p,!1,p,!0),b=[],_=[];g.nextNode();)if(!g.bEndTag&&1===g.node.nodeType&&"input"===g.node.nodeName.toLowerCase()&&u.VisUtil.isNodeVisible(g.node)){var f=g.node.getAttribute("type");"checkbox"===f?b.push(g.node):"radio"===f&&_.push(g.node)}for(var v=0;v<b.length;++v){var A=b[v];if((r.AriaUtil.getAncestorWithRole(A,"form")||l.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!l.CommonUtil.shouldNodeBeSkippedHidden(A)){var w=A.getAttribute("name")||"";(h.checkboxByName[w]=h.checkboxByName[w]||[]).push(A),h.nameToGroup[w]=h.nameToGroup[w]||c(A),++h.numCheckboxes}}for(v=0;v<_.length;++v){var y=_[v];if((r.AriaUtil.getAncestorWithRole(y,"form")||l.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!l.CommonUtil.shouldNodeBeSkippedHidden(y)){var C=y.getAttribute("name")||"";(h.radiosByName[C]=h.radiosByName[C]||[]).push(y),h.nameToGroup[C]=h.nameToGroup[C]||c(y),++h.numRadios}}s.CacheUtil.setCache(p,"input_checkboxes_grouped",h)}var k=n.getAttribute("name"),R=c(n);if(m="radio"===m?"Radio":"Checkbox",k&&""!==k){var x=(h.radiosByName[k]||[]).length,P=(h.checkboxByName[k]||[]).length;return x>0&&P>0?(0,a.RuleFail)("fail_controlnamemismatch",[m,"checkbox"===m?"radio":"checkbox",k]):"Radio"===m&&(1===h.numRadios||1===x)||"Checkbox"===m&&1===h.numCheckboxes?null===R?(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m]):"Checkbox"===m&&h.numCheckboxes>1&&1===P?null===R?(0,a.RulePotential)("potential_lonecheckbox",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?null!==h.nameToGroup[k]?(0,a.RuleFail)("fail_notgroupedothergrouped",[m,k]):(0,a.RuleFail)("fail_notgroupedothernotgrouped",[m,k]):h.nameToGroup[k]!==R?(0,a.RuleFail)("fail_notsamegroup",[m,k]):(0,a.RulePass)("pass_grouped",[m])}return"Radio"===m?null===R?(0,a.RulePass)("pass_radiononame",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?(h.checkboxByName[""]||[]).length>1?(0,a.RulePotential)("potential_unnamedcheckbox",[m]):(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m])}}},3142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_fields_grouped=void 0;var a=i(461),n=i(461),r=i(7139);t.input_fields_grouped={id:"input_fields_grouped",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_InFieldSet:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"input_fields_grouped.html",Potential_1:"input_fields_grouped.html",group:"input_fields_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Use the <fieldset> element to group logically related input elements",group:"Groups of logically related input elements should be contained within a <fieldset> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")&&"text"!=(m=n.getAttribute("type").toLowerCase())&&"file"!=m&&"password"!=m)return(0,a.RulePass)("Pass_0");if(null!=r.CommonUtil.getAncestor(n,"fieldset"))return(0,a.RulePass)("Pass_0");for(var l=r.CommonUtil.getAncestor(n,["form","body"]),o=["input","textarea","select"],s=!0,u=0;s&&u<o.length;++u)for(var d=l.getElementsByTagName(o[u]),c=0;s&&c<d.length;++c)if(!r.CommonUtil.shouldNodeBeSkippedHidden(d[c])){var m=d[c].hasAttribute("type")?d[c].getAttribute("type").toLowerCase():"text";s=d[c]==n||"text"!=m&&"password"!=m&&"file"!=m}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},1353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_haspopup_conflict=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.input_haspopup_conflict={id:"input_haspopup_conflict",context:"dom:input[list][aria-haspopup]",refactor:{input_haspopup_invalid:{Potential_1:"potential_type_misuse",Potential_2:"potential_misuse"}},help:{"en-US":{group:"input_haspopup_conflict.html",potential_type_misuse:"input_haspopup_conflict.html",potential_misuse:"input_haspopup_conflict.html",potential_list_notexist:"input_haspopup_conflict.html",fail_invalid_list_type:"input_haspopup_conflict.html",fail_invalid_list_elem:"input_haspopup_conflict.html"}},messages:{"en-US":{group:"<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute",potential_type_misuse:"The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_misuse:"The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_list_notexist:"The list attribute for the <input> element is invalid",fail_invalid_list_type:'The list attribute for the <input> element with the type "{0}" is invalid',fail_invalid_list_elem:"The list attribute for the <input> element does not reference a datalist element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n)||l.CommonUtil.isNodeDisabled(n))return null;var s=r.AriaUtil.getUserDefinedRoles(n);if(s&&s.length>0&&!s.includes("combobox"))return null;var u=["text","search","tel","url","email","date","month","week","time","datetime-local","number","range","color"],d=["file","password","checkbox","radio","submit","reset","image","hidden","button"],c=n.getAttribute("type");if(!c||0===c.trim().length)return(0,a.RulePotential)("potential_misuse");if(c=c.trim().toLowerCase(),!u.includes(c)&&!d.includes(c))return(0,a.RulePotential)("potential_misuse");if(c&&d.includes(c))return(0,a.RuleFail)("fail_invalid_list_type");var m=n.getAttribute("list");if(!m||0===m.trim().length)return(0,a.RulePotential)("potential_list_notexist");var p=n.ownerDocument.getElementById(m);return p?"datalist"!==p.nodeName.toLowerCase()?(0,a.RuleFail)("fail_invalid_list_elem"):u.includes(c)?(0,a.RulePotential)("potential_type_misuse",[c]):void 0:(0,a.RuleFail)("potential_list_notexist")}}},2631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_after=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7139);t.input_label_after={id:"input_label_after",context:"dom:input",refactor:{WCAG20_Input_LabelAfter:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_after.html",Fail_1:"input_label_after.html",Fail_2:"input_label_after.html",group:"input_label_after.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Checkbox or radio button is nested in label, so label is not after the input control",Fail_2:"Label text is located before its associated checkbox or radio button element",group:"Checkboxes and radio buttons must have a label after the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o="";if(n.hasAttribute("type")&&(o=n.getAttribute("type").toLowerCase()),"checkbox"!=o&&"radio"!=o)return null;var s=l.CommonUtil.getLabelForElementHidden(n,!0);if(null===s||!l.CommonUtil.hasInnerContentHidden(s))return null;var u,d=l.CommonUtil.compareNodeOrder(s,n);if(-2===d){u=!1;var c=new r.DOMWalker(s);for(c.node=n;!u&&c.nextNode();)u="#text"===c.node.nodeName.toLowerCase()&&c.node.nodeValue.trim().length>0||"span"===c.node.nodeName.toLowerCase()&&c.node.textContent.trim().length>0;if(!u)return(0,a.RuleFail)("Fail_1")}else if(1!=d)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8550(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_before=void 0;var a=i(461),n=i(461),r=i(7139);t.input_label_before={id:"input_label_before",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_LabelBefore:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_before.html",Fail_1:"input_label_before.html",Fail_2:"input_label_before.html",group:"input_label_before.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Text input is nested in label such that input precedes the label text",Fail_2:"Label text is located after its associated text input or <select> element",group:"Text inputs and <select> elements must have a label before the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var l=n.getAttribute("type").toLowerCase();if("text"!=l&&"file"!=l&&"password"!=l)return null}var o=r.CommonUtil.getLabelForElementHidden(n,!0);if(null==o||!r.CommonUtil.hasInnerContentHidden(o))return null;var s=r.CommonUtil.compareNodeOrder(o,n);if(-2===s){var u=r.CommonUtil.getInnerText(n);if(u&&u.trim().length>0&&r.CommonUtil.getInnerText(n).trim()===u.trim())return null;for(var d=!1,c=n.previousSibling;!d&&null!==c;)d="#text"==c.nodeName.toLowerCase()&&c.nodeValue.trim().length>0||"span"==c.nodeName.toLowerCase()&&c.textContent.trim().length>0,c=c.previousSibling;if(!d)return(0,a.RuleFail)("Fail_1")}else if(-1!=s)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8853(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946),o=i(1950);t.input_label_exists={id:"input_label_exists",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]",refactor:{WCAG20_Input_ExplicitLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_exists.html",Fail_1:"input_label_exists.html",Fail_2:"input_label_exists.html",group:"input_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control element <{0}> has no associated label",Fail_2:'Form control with "{0}" role has no associated label',group:"Each form control must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["97a4e1","e086e5"],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var s=n.nodeName.toLowerCase();if("datalist"===s)return null;var u="text";if("input"==s&&n.hasAttribute("type")?u=n.getAttribute("type").toLowerCase():("button"===s||r.AriaUtil.hasRoleInSemantics(n,"button"))&&(u="buttonelem"),"input"==s&&""==u&&(u="text"),"image"===u)return null;var d=o.AccNameUtil.computeAccessibleName(n);return d&&d.name&&d.name.trim().length>0?(0,a.RulePass)("Pass_0"):n.hasAttribute("role")&&n.getAttribute("role").trim().length>0?(0,a.RuleFail)("Fail_2",n.getAttribute("role").split(" ")):(0,a.RuleFail)("Fail_1",[s])}}},3180(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(3946),u=i(1686),d=i(1950);t.input_label_visible={id:"input_label_visible",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox",dependencies:["input_label_exists"],refactor:{WCAG20_Input_VisibleLabel:{Pass_0:"pass",Potential_1:"potential_no_label",potential_placeholder_only:"potential_placeholder_only"}},help:{"en-US":{pass:"input_label_visible.html",potential_placeholder_only:"input_label_visible.html",potential_no_label:"input_label_visible.html",group:"input_label_visible.html"}},messages:{"en-US":{pass:"The input element has an associated visible label",potential_placeholder_only:"The ‘placeholder’ is the only visible label",potential_no_label:"The input element does not have an associated visible label",group:"An input element must have an associated visible label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.5.3","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if("datalist"===c)return null;if(!s.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;if(l.CommonUtil.getAncestor(n,"table"))return null;var m=r.AriaUtil.getResolvedRole(n);if(m&&"button"===m&&"input"!==c&&"button"!==c&&!l.CommonUtil.getAncestor(n,"form"))return null;if(r.AriaUtil.getAncestorWithRole(n,"combobox")&&!(r.AriaUtil.hasRoleInSemantics(n,"textbox")||r.AriaUtil.hasRoleInSemantics(n,"searchbox")||"input"===c||"select"===c&&r.AriaUtil.hasRoleInSemantics(n,"combobox")))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(r.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=l.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=l.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(o.FragmentUtil.getById(n,v[A])===n)return null}var w=d.AccNameUtil.computeAccessibleName(n);if(("input"===c||"button"===c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"internal"===w.nameFrom||"alt"===w.nameFrom))return(0,a.RulePass)("pass");if(w&&w.name&&w.name.trim().length>0&&("text"===w.nameFrom||"title"===w.nameFrom))return(0,a.RulePass)("pass");var y=l.CommonUtil.getOnScreenInnerText(n);if(y&&0!==y.length)return(0,a.RulePass)("pass");var C=r.AriaUtil.getAllDescendantsWithRoles(n,["img","graphics-document","graphics-object","graphics-symbol"],!1,!0);if(C&&C.length>0)for(var k=0;k<C.length;k++)if(l.CommonUtil.attributeNonEmpty(C[k],"title")||l.CommonUtil.attributeNonEmpty(C[k],"alt"))return(0,a.RulePass)("pass");if(l.CommonUtil.attributeNonEmpty(n,"aria-labelledby")){var R=n.getAttribute("aria-labelledby").split(/\s+/);for(h=0;h<R.length;++h){var x=o.FragmentUtil.getById(n,R[h]);if(x&&!u.DOMUtil.sameNode(x,n)&&s.VisUtil.isNodeVisible(x)&&l.CommonUtil.hasInnerContentHidden(x))return(0,a.RulePass)("pass")}}if(("optgroup"===c||"option"==c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"content"===w.nameFrom))return(0,a.RulePass)("pass");var P=n.getAttribute("id");return P&&P.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(P,"'][role='combobox']"))?null:l.CommonUtil.attributeNonEmpty(n,"placeholder")?(0,a.RulePotential)("potential_placeholder_only"):(0,a.RulePotential)("potential_no_label")}}},1382(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_onchange_review=void 0;var a=i(461),n=i(461);t.input_onchange_review={id:"input_onchange_review",context:"dom:input[onchange], dom:textarea[onchange], dom:select[onchange]",refactor:{WCAG20_Input_HasOnchange:{Potential_1:"potential_warning"}},help:{"en-US":{potential_warning:"input_onchange_review.html",group:"input_onchange_review.html"}},messages:{"en-US":{group:"Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs",potential_warning:"Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var r=n.getAttribute("type").toLowerCase();if("hidden"===r||"submit"===r||"image"===r||"button"===r||"reset"===r)return null}return(0,a.RulePotential)("potential_warning")}}},953(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_placeholder_label_visible=void 0;var a=i(461);t.input_placeholder_label_visible={id:"input_placeholder_label_visible",context:"dom:input[placeholder], dom:textarea[placeholder]",refactor:{HAAC_Input_Placeholder:{Pass_0:"Pass_0",Potential_1:"Potential_1",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"input_placeholder_label_visible.html",Potential_1:"input_placeholder_label_visible.html",Potential_2:"input_placeholder_label_visible.html",group:"input_placeholder_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"HTML5 placeholder is the only visible label",Potential_2:"Additional visible label referenced by 'aria-labelledby' is not valid",group:"HTML5 'placeholder' attribute must not be used as a visible label replacement"}},rulesets:[],act:[],run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")){var r=n.getAttribute("type").toLowerCase();if("hidden"==r||"button"==r)return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("hidden")){var l=n.getAttribute("hidden");if(""==l||"hidden"==l.toLowerCase())return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("aria-label"))return(0,a.RulePotential)("Potential_1");if(n.hasAttribute("aria-labelledby")&&n.hasAttribute("id")){var o=n.getAttribute("id").trim();return n.getAttribute("aria-labelledby").trim().split(/\s+/).includes(o)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0")}return(0,a.RulePass)("Pass_0")}}},2222(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_content_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(5279),o=i(1686);t.label_content_exists={id:"label_content_exists",context:"dom:label",refactor:{Valerie_Label_HasContent:{Pass_Regular:"Pass_Regular",Pass_AriaLabel:"Pass_AriaLabel",Pass_LabelledBy:"Pass_LabelledBy",Fail_1:"Fail_1"}},help:{"en-US":{Pass_Regular:"label_content_exists.html",Pass_AriaLabel:"label_content_exists.html",Pass_LabelledBy:"label_content_exists.html",Fail_1:"label_content_exists.html",group:"label_content_exists.html"}},messages:{"en-US":{Pass_Regular:"<label> element has accessible name with inner content",Pass_AriaLabel:"<label> element has accessible name via 'aria-label'",Pass_LabelledBy:"<label> element has accessible name via 'aria-labelledby'",Fail_1:"The <label> element does not have descriptive text that identifies the expected input",group:"A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.hasInnerContentHidden(n))return(0,a.RulePass)("Pass_Regular");if((n.getAttribute("aria-label")||"").trim().length>0)return(0,a.RulePass)("Pass_AriaLabel");if(n.hasAttribute("aria-labelledby")){var s=l.FragmentUtil.getById(n,n.getAttribute("aria-labelledby"));if(s&&!o.DOMUtil.sameNode(s,n)&&r.CommonUtil.hasInnerContent(s))return(0,a.RulePass)("Pass_LabelledBy")}return(0,a.RuleFail)("Fail_1")}}},4678(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_name_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(3946),u=i(4919),d=i(3864);t.label_name_visible={id:"label_name_visible",context:"aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter",refactor:{WCAG21_Label_Accessible:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"label_name_visible.html",Fail_1:"label_name_visible.html",group:"label_name_visible.html"}},messages:{"en-US":{Pass_0:"Accessible name matches or contains the visible label text",Fail_1:"Accessible name does not match or contain the visible label text",group:"Accessible name must match or contain the visible label text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["2.5.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:"2ee8b8",run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;if(u.CSSUtil.isMaterialIconFont(n))return(0,a.RulePass)("Pass_0");var c=!0,m=n.nodeName.toLowerCase(),p=!1,h=null;"input"===m&&n.hasAttribute("type")&&(h=n.getAttribute("type").toLowerCase(),-1!==l.CommonUtil.form_button_types.indexOf(h)&&(p=!0));var g=r.AriaUtil.getAriaAttribute(n,"aria-labelledby");if(!g||l.CommonUtil.isIdReferToSelf(n,g)||p){var b=null;if(g&&!l.CommonUtil.isIdReferToSelf(n,g))for(var _=g.split(/\s+/),f=0;f<_.length;++f){var v=o.FragmentUtil.getById(n,_[f]);if(v){b=l.CommonUtil.getInnerText(v);break}}else b=r.AriaUtil.getAriaAttribute(n,"aria-label");if(!b)return null;var A=null;if(p&&(n.hasAttribute("value")?A=n.getAttribute("value"):"submit"===h?A="submit":"reset"===h&&(A="reset")),!A){var w=l.CommonUtil.getLabelForElementHidden(n,!0);if(!w){var y=d.DOMWalker.parentNode(n);if("label"===y.nodeName.toLowerCase()){var C=y.cloneNode(!0);w=l.CommonUtil.removeAllFormElementsFromLabel(C)}}var k=w||n;A=w||-1===["meter","output","progress","select","textarea"].indexOf(m)?l.CommonUtil.getOnScreenInnerText(k):""}var R=/[^a-zA-Z0-9]/g;A=A.replace(R," ");var x=l.CommonUtil.normalizeSpacing(A).toLowerCase();b=b.replace(R," ");var P=l.CommonUtil.normalizeSpacing(b).toLowerCase();if(x.length>1){var T=P.indexOf(x);if(T>=0&&P.length>x.length){var U=/^[0-9a-zA-Z]+$/;T+x.length<P.length&&P.charAt(T+x.length).match(U)&&(c=!1),c&&T>0&&P.charAt(T-1).match(U)&&(c=!1)}-1===T&&(c=!1)}}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7578(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_ref_valid=void 0;var a=i(461),n=i(461),r=i(5279),l=i(3946);t.label_ref_valid={id:"label_ref_valid",context:"dom:label[for]",refactor:{WCAG20_Label_RefValid:{Pass_0:"pass",Fail_1:"fail_invalid"}},help:{"en-US":{pass:"label_ref_valid.html",fail_invalid:"label_ref_valid.html",group:"label_ref_valid.html"}},messages:{"en-US":{pass:"The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element",fail_invalid:"The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element",group:"The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.getAttribute("for"),s=!1,u=r.FragmentUtil.getById(n,o);if(u){if(!l.VisUtil.isNodeVisible(u)&&!l.VisUtil.isNodeVisible(n))return null;if(s=!0,!u.hasAttribute("role")){var d=u.nodeName.toLowerCase();if(s="input"==d||"select"==d||"textarea"==d||"button"==d||"datalist"==d||"optgroup"==d||"option"==d||"keygen"==d||"output"==d||"progress"==d||"meter"==d||"fieldset"==d||"legend"==d,"input"==u.nodeName.toLowerCase()&&u.hasAttribute("type")){var c=u.getAttribute("type").toLowerCase();s="text"==c||"password"==c||"file"==c||"checkbox"==c||"radio"==c||"hidden"==c||"search"==c||"tel"==c||"url"==c||"email"==c||"date"==c||"number"==c||"range"==c||"image"==c||"time"==c||"color"==c||"datetime-local"==c||"month"==c||"week"==c}}s&&!l.VisUtil.isNodeVisible(u)&&(s=!1)}var m=[];return s||m.push(o),s?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid",m)}}},9964(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_children_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3864);t.list_children_valid={id:"list_children_valid",context:"aria:group",refactor:{HAAC_List_Group_ListItem:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"list_children_valid.html",Fail_1:"list_children_valid.html",group:"list_children_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'List component with "group" role has children that are not <listitem> elements',group:'List component with "group" role must limit children to <listitem> elements'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.DOMWalker.parentElement(n);if(!r.AriaUtil.hasRoleInSemantics(o,"list"))return null;for(var s=!0,u=n.children,d=0;s&&d<u.length;d++)s=r.AriaUtil.hasRoleInSemantics(u[d],"listitem");return s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_markup_review=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=new RegExp(/^[ \t]*[•◦▪▸►✓✗✦\-–—*o][ \t]+\S/.source+"|"+/^[ \t]*(?:\(?\d+[.)]\)?|\(?[a-zA-Z][.)]\)?|\(?(?:i{1,3}|iv|vi{0,3}|ix|xi{0,3}|xiv|xv)[.)]\)?)[ \t]+\S/i.source,"i"),u=new Set(["blockquote","center","dir","div","form","h1","h2","h3","h4","h5","h6","hr","br","menu","p","pre","table","section","article","aside","nav","header","footer","figure","figcaption","details","summary","dialog","script","style","label","ul","ol","dl","li","dt","dd"]),d=new Set(["a","abbr","acronym","b","bdo","big","br","button","cite","code","dfn","em","i","img","input","kbd","label","map","object","output","q","samp","select","small","span","strong","sub","sup","textarea","time","tt","u","var"]);function c(e){var t="";return e.childNodes.forEach(function(e){var i;if(e.nodeType===Node.TEXT_NODE)t+=null!==(i=e.nodeValue)&&void 0!==i?i:"";else if(e.nodeType===Node.ELEMENT_NODE){var a=e.nodeName.toLowerCase();d.has(a)&&(t+=c(e))}}),t.replace(/\s+/g," ")}function m(e){var t=0,i=0,a="";e.childNodes.forEach(function(e){var n,r=e.nodeName.toLowerCase();if("br"===r){var l=a.trim();return l.length>0&&(s.test(l)?t=Math.max(t,++i):i=0),void(a="")}if(e.nodeType!==Node.TEXT_NODE){if(e.nodeType===Node.ELEMENT_NODE){var o=e;if(u.has(r)){var m=a.trim();return m.length>0&&s.test(m)&&(t=Math.max(t,++i)),a="",void(i=0)}d.has(r)?a+=c(o):(i=0,a="")}}else{var p=null!==(n=e.nodeValue)&&void 0!==n?n:"";if(0===p.trim().length)return;p.split(/\r?\n/).forEach(function(e,n){if(n>0){var r=a.trim();r.length>0&&(s.test(r)?t=Math.max(t,++i):i=0),a=""}a+=e})}});var n=a.trim();return n.length>0&&s.test(n)&&(t=Math.max(t,++i)),t}function p(e){for(var t=0,i=0,a=function(e){var t=[];return function e(i){var a;if(i.nodeType===Node.TEXT_NODE)(null!==(a=i.nodeValue)&&void 0!==a?a:"").split(/\r?\n/).forEach(function(e){var i=e.trim();i.length>0&&t.push(i)});else if(i.nodeType===Node.ELEMENT_NODE){var n=i,o=n.nodeName.toLowerCase();if("br"===o)return void t.push("\0");if(u.has(o))return;if(n.getAttribute("role")){var s=r.AriaUtil.getRolesWithTypes(n,["widget"]);if(l.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","rowheader"],s),s.length>0)return}i.childNodes.forEach(e)}}(e),t.filter(function(e){return"\0"!==e})}(e);i<a.length;i++){var n=a[i];if(s.test(n)){if(++t>=2)return!0}else t=0}return!1}t.list_markup_review={id:"list_markup_review",context:"dom:*",refactor:{RPT_List_UseMarkup:{Potential_1:"Potential_1"}},help:{"en-US":{potential_list:"list_markup_review.html",group:"list_markup_review.html"}},messages:{"en-US":{potential_list:"Verify this is a list and if so, modify to use proper HTML elements for the list",group:"Proper HTML elements should be used to create a list"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,s=n.nodeName.toLowerCase();if(l.CommonUtil.isNodeDisabled(n)||o.VisUtil.hiddenByDefaultElements.includes(s))return null;if(null===l.CommonUtil.getAncestor(n,["body"]))return null;if(null!==l.CommonUtil.getAncestor(n,["script","style","label"]))return null;if("td"===s||"th"===s)return m(n)>=2||p(n)?(0,a.RulePotential)("potential_list"):null;var d=r.AriaUtil.getRolesWithTypes(n,["widget"]);return l.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","rowheader"],d),null!==r.AriaUtil.getAncestorWithRoles(n,d)?null:u.has(s)||"body"===s||"li"===s?["ul","ol","dl","menu"].includes(s)?null:m(n)>=2||p(n)?(0,a.RulePotential)("potential_list"):null:null}}},1174(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_structure_proper=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.list_structure_proper={id:"list_structure_proper",context:"dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt",refactor:{RPT_List_Misuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"list_structure_proper.html",Potential_1:"list_structure_proper.html",group:"list_structure_proper.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"List element is missing or improperly structured",group:"List elements should only be used for lists of related items"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node,s=o.nodeName.toLowerCase();if(o.children,"dl"==s){var u="",d="",c=o.firstChild;n=!0;var m=!1;if(o.children&&0!=o.children.length){for(;n&&null!=c;){if(1==c.nodeType){var p=c.nodeName.toLowerCase();if(r.AriaUtil.isPresentationalElement(c)){m=!0,c=c.nextSibling;continue}n="dd"==p||"dt"==p,""==u&&(u=p),d=p}c=c.nextSibling}n=n&&"dt"==u&&"dd"==d||n&&m}else n=!0}else if("li"==s)n=null!=l.CommonUtil.getAncestor(o,["ul","ol","dir","menu"]);else if("dd"==s||"dt"==s)n=null!=l.CommonUtil.getAncestor(o,"dl");else if(c=o.firstChild,"ul"!=s&&"ol"!=s&&"menu"!=s||o.children&&0!=o.children.length){var h=!1;for(m=!1,n=!0;n&&null!=c;)r.AriaUtil.isPresentationalElement(c)?(m=!0,c=c.nextSibling):(n=1!=c.nodeType||"li"==c.nodeName.toLowerCase()||"template"==c.nodeName.toLowerCase()&&("ul"==s||"ol"==s),h=h||1==c.nodeType&&"li"==c.nodeName.toLowerCase(),c=c.nextSibling);n=n&&h||n&&m}else n=!0;return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9907(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.marquee_elem_avoid=void 0;var a=i(461),n=i(461);t.marquee_elem_avoid={id:"marquee_elem_avoid",context:"dom:marquee",refactor:{RPT_Marquee_Trigger:{Fail_1:"Fail_1"}},help:{"en-US":{Fail_1:"marquee_elem_avoid.html",group:"marquee_elem_avoid.html"}},messages:{"en-US":{Fail_1:"Scrolling content found that uses the obsolete <marquee> element",group:"The <marquee> element is obsolete and should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){return e.dom.node,(0,a.RuleFail)("Fail_1")}}},6032(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_brief=void 0;var a=i(461),n=i(461),r=i(3946);t.media_alt_brief={id:"media_alt_brief",context:"dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]",refactor:{RPT_Media_AltBrief:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_brief.html",Potential_1:"media_alt_brief.html",group:"media_alt_brief.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Text alternative is more than 150 characters",group:"Alternative text in 'alt' attribute should be brief (<150 characters)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.getAttribute("alt").trim().length<=150;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},5622(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.media_alt_exists={id:"media_alt_exists",context:"dom:area[alt], dom:embed[alt]",refactor:{RPT_Media_AudioVideoAltFilename:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_exists.html",Potential_1:"media_alt_exists.html",group:"media_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Filename used as label for embedded audio or video",group:"Audio or video on the page must have a short text alternative that describes the media content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o="";null==(o="area"==n.nodeName.toLowerCase()?n.getAttribute("href"):n.getAttribute("src"))&&(o="");var s=r.CommonUtil.getFileExt(o),u=0!=s.length&&(r.CommonUtil.isAudioExt(s)||r.CommonUtil.isVideoExt(s)),d=n.getAttribute("alt"),c=!u||d.length>0&&-1==d.indexOf(s);return c?(0,a.RulePass)("Pass_0"):c?void 0:(0,a.RulePotential)("Potential_1")}}},2240(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_audio_transcribed=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.media_audio_transcribed={id:"media_audio_transcribed",context:"dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object",refactor:{RPT_Media_AudioTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_audio_transcribed.html",group:"media_audio_transcribed.html"}},messages:{"en-US":{Manual_1:"Provide transcripts for audio files",group:"Audio information should also be available in text form"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(o)||(n="bgsound"!=o.nodeName.toLowerCase()&&!r.CommonUtil.isAudioObjEmbedLink(o))?null:n?void 0:(0,a.RuleManual)("Manual_1")}}},4019(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_autostart_controllable=void 0;var a=i(461),n=i(461);t.media_autostart_controllable={id:"media_autostart_controllable",context:"dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound",refactor:{RPT_Embed_AutoStart:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_autostart_controllable.html",Potential_1:"media_autostart_controllable.html",group:"media_autostart_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically",group:"Mechanism must be available to pause or stop and control the volume of the audio that plays automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n,r=e.dom.node,l=r.nodeName.toLowerCase();if("bgsound"==l)n=!1;else if("param"==l){var o="";r.hasAttribute("value")&&(o=r.getAttribute("value").toLowerCase()),n=0==o.indexOf("0;")||!(-1!=o.indexOf("true")||-1!=o.indexOf("1"))}else if("embed"==l){var s;n=!0,r.hasAttribute("flashvars")&&(n=-1==(s=r.getAttribute("flashvars")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1")),n&&r.hasAttribute("src")&&(n=-1==(s=r.getAttribute("src")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1"))}if(n&&r.hasAttribute("autostart")){var u=r.getAttribute("autostart").toLowerCase();n="true"!=u&&"1"!=u}return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},361(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_keyboard_controllable=void 0;var a=i(461),n=i(461),r=i(3946);t.media_keyboard_controllable={id:"media_keyboard_controllable",context:"dom:audio, dom:video",refactor:{HAAC_Audio_Video_Trigger:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"media_keyboard_controllable.html",Manual_1:"media_keyboard_controllable.html",group:"media_keyboard_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify media using <audio> and/or <video> elements have keyboard accessible controls",group:"Media using <audio> and/or <video> elements must have keyboard accessible controls"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=!0,o=n.nodeName.toLowerCase();return"audio"!=o&&"video"!==o||(l=!1),l?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1")}}},5960(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_live_captioned=void 0;var a=i(461),n=i(461),r=i(7139);t.media_live_captioned={id:"media_live_captioned",context:"dom:embed, dom:object",refactor:{RPT_Media_VideoObjectTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_live_captioned.html",group:"media_live_captioned.html"}},messages:{"en-US":{Manual_1:"Verify captions are provided for live media (streaming video with audio)",group:"Live media (streaming video with audio) should have captions for audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!r.CommonUtil.isVideoObjEmbedLink(n);return l?null:l?void 0:(0,a.RuleManual)("Manual_1")}}},5515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_track_available=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.media_track_available={id:"media_track_available",context:"dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object",refactor:{RPT_Media_VideoReferenceTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_track_available.html",group:"media_track_available.html"}},messages:{"en-US":{Manual_1:"Verify availability of a user-selectable audio track with description of visual content",group:"Pre-recorded media should have an audio track that describes visual information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.3","1.2.5"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o;return(o="applet"!=n.nodeName.toLowerCase()&&!r.CommonUtil.isVideoObjEmbedLink(n))?null:o?void 0:(0,a.RuleManual)("Manual_1")}}},8752(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_redirect_optional=void 0;var a=i(461),n=i(461),r=i(4566);t.meta_redirect_optional={id:"meta_redirect_optional",context:"dom:meta[http-equiv][content]",refactor:{WCAG20_Meta_RedirectZero:{pass:"pass",fail:"fail",fail_longrefresh:"fail_longrefresh"}},help:{"en-US":{group:"meta_redirect_optional.html",pass:"meta_redirect_optional.html",fail:"meta_redirect_optional.html",fail_longrefresh:"meta_redirect_optional.html"}},messages:{"en-US":{group:"Page should not automatically refresh without warning or option to turn it off or adjust the time limit",pass:"Rule Passed",fail:"Check page does not automatically refresh without warning or options",fail_longrefresh:"Check page does not automatically refresh without warning or options"}},rulesets:[{id:[],num:["2.2.4","3.2.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bisz58"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var l=n.ownerDocument;if(l){if(r.CacheUtil.getCache(l,"meta_redirect_optional_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(r.CacheUtil.setCache(l,"meta_redirect_optional_done",!0),0===s?(0,a.RulePass)("pass"):s<72001?(0,a.RuleFail)("fail"):(0,a.RuleFail)("fail_longrefresh"))}}}},8834(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_refresh_delay=void 0;var a=i(461),n=i(461),r=i(4566);t.meta_refresh_delay={id:"meta_refresh_delay",context:"dom:meta[http-equiv][content]",refactor:{RPT_Meta_Refresh:{Pass_0:"pass",Potential_1:"potential_refresh"}},help:{"en-US":{group:"meta_refresh_delay.html",pass:"meta_refresh_delay.html",potential_refresh:"meta_refresh_delay.html"}},messages:{"en-US":{group:"Pages should not refresh automatically",pass:"Pages do not refresh automatically",potential_refresh:"Verify page is not being caused to refresh automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bc659a"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var l=n.ownerDocument;if(l){if(r.CacheUtil.getCache(l,"meta_refresh_delay_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(r.CacheUtil.setCache(l,"meta_refresh_delay_done",!0),0===s?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_refresh"))}}}},1025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_viewport_zoomable=void 0;var a=i(461),n=i(461);t.meta_viewport_zoomable={id:"meta_viewport_zoomable",context:"dom:meta[name][content]",refactor:{meta_viewport_zoom:{Pass_0:"pass",Potential_1:"potential_zoomable"}},help:{"en-US":{group:"meta_viewport_zoomable.html",pass:"meta_viewport_zoomable.html",potential_zoomable:"meta_viewport_zoomable.html"}},messages:{"en-US":{group:"The 'meta[name=viewport]' should not prevent the browser zooming the content",pass:"The 'meta[name=viewport]' does not prevent the browser zooming the content",potential_zoomable:"Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{b4f0c3:{pass:"pass",potential_zoomable:"fail"}}],run:function(e,t,i){var n=e.dom.node;if("viewport"!==n.getAttribute("name").toLowerCase())return null;var r=n.getAttribute("content").toLowerCase();if(!r||""===r.trim()||!r.includes("maximum-scale")&&!r.includes("user-scalable"))return null;for(var l=null,o=null,s="yes",u="2.0",d=0,c=r.split(",");d<c.length;d++){var m=c[d],p=m.trim().split("=");p.length<2||(m.includes("user-scalable")?(l=m,((s=p[1].trim()).startsWith("'")||s.startsWith('"'))&&(s=s.substring(1,s.length-1))):m.includes("maximum-scale")&&(o=m,((u=p[1].trim()).startsWith("'")||u.startsWith('"'))&&(u=u.substring(1,u.length-1).trim())))}var h=Number(s);isNaN(h)||(h>=1||h<=-1)&&(s="yes");var g;return h=Number(u),g=isNaN(h)?"yes"===u?1:.1:h<0?2:h,"yes"!==s?(0,a.RulePotential)("potential_zoomable",[l]):g<2?(0,a.RulePotential)("potential_zoomable",[o]):(0,a.RulePass)("pass")}}},9116(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.noembed_content_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.noembed_content_exists={id:"noembed_content_exists",context:"dom:noembed",refactor:{Valerie_Noembed_HasContent:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"noembed_content_exists.html",Potential_1:"noembed_content_exists.html",group:"noembed_content_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Add descriptive text to the <noembed> element",group:"<noembed> elements should contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.CommonUtil.hasInnerContentHidden(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},435(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.object_text_exists=void 0;var a=i(461),n=i(461),r=i(3946),l=i(1950);t.object_text_exists={id:"object_text_exists",context:"dom:object",refactor:{WCAG20_Object_HasText:{pass:"pass",fail_no_text_alternative:"fail_no_text_alternative"}},help:{"en-US":{group:"object_text_exists.html",pass:"object_text_exists.html",fail_no_text_alternative:"object_text_exists.html"}},messages:{"en-US":{group:"<object> element must have a text alternative for the content rendered by the object",pass:"<object> element has a text alternative",fail_no_text_alternative:"An <object> element does not have a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"8fc3b6",run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;if(n.hasAttribute("type")&&-1!==n.getAttribute("type").indexOf("text"))return null;if(n.getAttribute("role"))return null;var o=n.getAttribute("data"),s=o&&"string"==typeof o?o.substring(o.lastIndexOf(".")):"";if(".html"===s||".htm"===s)return null;var u=l.AccNameUtil.computeAccessibleName(n);return u&&u.name&&u.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_text_alternative")}}},6640(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(6858);t.page_title_exists={id:"page_title_exists",context:"dom:html",refactor:{WCAG20_Doc_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"page_title_exists.html",Pass_0:"page_title_exists.html",Fail_1:"page_title_exists.html",Fail_2:"page_title_exists.html",Fail_3:"page_title_exists.html"}},messages:{"en-US":{group:"The page should have a title that correctly identifies the subject of the page",Pass_0:"Rule Passed",Fail_1:"Missing <head> element so there can be no <title> element present",Fail_2:"Missing <title> element in <head> element",Fail_3:"The <title> element is empty (no innerHTML)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"2779a5":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail",Fail_3:"fail"}}],run:function(e,t,i){if(l.AncestorUtil.isFrame(i))return null;for(var n=e.dom.node,o=n.firstChild,s=null;null!=o&&"head"!=o.nodeName.toLowerCase();)o=o.nextSibling;for(var u=n.querySelectorAll("title"),d=0;d<u.length;++d)if(!r.CommonUtil.getAncestor(u[d],["svg"])){s=u[d];break}return null!==o||s?null===s?(0,a.RuleFail)("Fail_2"):null!=s&&r.CommonUtil.getInnerText(s).trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3"):(0,a.RuleFail)("Fail_1")}}},2068(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.page_title_valid={id:"page_title_valid",context:"dom:head dom:title",refactor:{RPT_Title_Valid:{Pass_0:"Pass_0",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"page_title_valid.html",Potential_2:"page_title_valid.html",group:"page_title_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_2:"Verify that using the filename as the page <title> value is descriptive",group:"Page <title> should be a descriptive title, rather than a filename"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getInnerText(n).trim(),o=l.toLowerCase();return o.includes(".com")||o.includes(".net")||o.includes(".org")?(0,a.RulePass)("Pass_0",[l]):0===l.length?null:/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(l)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0",[l])}}},7322(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_focus_blur_review=void 0;var a=i(461),n=i(461);t.script_focus_blur_review={id:"script_focus_blur_review",context:"dom:*[onfocus]",refactor:{WCAG20_Script_FocusBlurs:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_focus_blur_review.html",Potential_1:"script_focus_blur_review.html",group:"script_focus_blur_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify script does not remove focus from content that normally receives focus",group:"Scripting must not remove focus from content that normally receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.7","3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=-1==e.dom.node.getAttribute("onfocus").indexOf(".blur(");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},5702(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_avoid=void 0;var a=i(461),n=i(461),r=i(7139);t.script_onclick_avoid={id:"script_onclick_avoid",context:"dom:*[onclick]",dependencies:["script_onclick_misuse"],refactor:{RPT_Script_OnclickHTML2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_avoid.html",Potential_1:"script_onclick_avoid.html",group:"script_onclick_avoid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that 'onclick' events are not used in script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.getAncestor(n,"svg"))return(0,a.RulePass)("Pass_0");if(r.CommonUtil.attributeNonEmpty(n,"role"))return(0,a.RulePass)("Pass_0");var l=n.nodeName.toLowerCase(),o="a"==l||"area"==l||"input"==l;return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},1961(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_misuse=void 0;var a=i(461),n=i(461),r=i(7139);t.script_onclick_misuse={id:"script_onclick_misuse",context:"dom:*[onclick]",refactor:{RPT_Script_OnclickHTML1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_misuse.html",Potential_1:"script_onclick_misuse.html",group:"script_onclick_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Possible use of a script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.attributeNonEmpty(n,"role"),o=n.nodeName.toLowerCase();if(!(l=l||("a"==o||"area"==o)&&r.CommonUtil.attributeNonEmpty(n,"href"))){var s=[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml","location.href"],u=n.getAttribute("onclick").toLowerCase();l=!0;for(var d=0;l&&d<s.length;++d)l=-1==u.indexOf(s[d])}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},3022(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_select_review=void 0;var a=i(461),n=i(461);t.script_select_review={id:"script_select_review",context:"dom:select",refactor:{WCAG20_Select_NoChangeAction:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_select_review.html",Potential_1:"script_select_review.html",group:"script_select_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that no change of context or action occurs when selection options in this component receive focus",group:"No changes of context should occur when a selection value receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!n.hasAttribute("onchange")&&!n.hasAttribute("onfocus");return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},375(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.select_options_grouped=void 0;var a=i(461),n=i(461),r=i(7139);t.select_options_grouped={id:"select_options_grouped",context:"dom:select",refactor:{WCAG20_Select_HasOptGroup:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"select_options_grouped.html",Potential_1:"select_options_grouped.html",group:"select_options_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Group of related options may need <optgroup>",group:"Groups of related options within a selection list should be grouped with <optgroup>"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getChildByTagHidden(n,"optgroup",!1,!0).length>0||r.CommonUtil.getChildByTagHidden(n,"option",!1,!0).length<=10;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},4658(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_described=void 0;var a=i(461),n=i(461),r=i(7139),l=i(4566),o=i(3946);t.skip_main_described={id:"skip_main_described",context:"dom:body",dependencies:["skip_main_exists"],refactor:{WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"skip_main_described.html",Potential_1:"skip_main_described.html",group:"skip_main_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that if this hyperlink skips content, the description communicates where it links to",group:"The description of a hyperlink used to skip content must communicate where it links to"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s={paramSkipText:{value:["skip","jump"],type:"[string]"}},u=e.dom.node,d=u.ownerDocument;if(null===l.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&l.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",r.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=l.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){var c=d.links;if(c&&c.length>0&&o.VisUtil.isNodeVisible(c[0]))for(var m=r.CommonUtil.getInnerText(d.links[0]).toLowerCase(),p=0;!n&&p<s.paramSkipText.value.length;++p)n=-1!=m.indexOf(s.paramSkipText.value[p]);else n=!1}return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},4605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(6858),o=i(4566),s=i(3946);t.skip_main_exists={id:"skip_main_exists",context:"dom:body",refactor:{WCAG20_Body_FirstASkips_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"skip_main_exists.html",Fail_1:"skip_main_exists.html",group:"skip_main_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)',group:"Pages must provide a way to skip directly to the main content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){if(l.AncestorUtil.isPresentationFrame(i))return null;var n,u=e.dom.node,d=u.ownerDocument;if(null===o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&o.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",r.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){for(var c=r.CommonUtil.getDocElementsByTag(u,"a"),m=null,p=0;p<c.length;++p)if(c[p].hasAttribute("href")&&s.VisUtil.isNodeVisible(c[p])){m=c[p];break}var h=null;if(null!=m){var g=m.getAttribute("href"),b=g.indexOf("#");-1!=b&&(h=g.substring(b+1))}if(null!=h)for(n=null!=d.getElementById(h),p=0;!n&&p<c.length;++p)!c[p].hasAttribute("href")&&c[p].hasAttribute("name")&&c[p].getAttribute("name")==h&&(n=!0)}return n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5294(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_background_decorative=void 0;var a=i(461),n=i(461),r=i(7139);t.style_background_decorative={id:"style_background_decorative",context:"dom:style, dom:*[style]",refactor:{RPT_Style_BackgroundImage:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"style_background_decorative.html",Potential_1:"style_background_decorative.html",group:"style_background_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the CSS background image does not convey important information",group:"Images included by using CSS alone must not convey important information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.nodeName.toLowerCase(),o=!0;if("link"===l&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&(o=r.CommonUtil.triggerOnce(n,"style_background_decorative",!1)),o&&"style"===l||n.hasAttribute("style")){var s=("style"===l?r.CommonUtil.getInnerText(n):n.getAttribute("style")).match(/background:[^;]*/g);if(null!==s)for(var u=0;o&&u<s.length;++u)o=-1===s[u].indexOf("url(")}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3506(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_before_after_review=void 0;var a=i(461),n=i(461),r=i(4919);t.style_before_after_review={id:"style_before_after_review",context:"dom:style, dom:link",refactor:{WCAG20_Style_BeforeAfter:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_before_after_review.html",Pass_0:"style_before_after_review.html",Potential_1:"style_before_after_review.html"}},messages:{"en-US":{group:"Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content",Pass_0:"Rule Passed",Potential_1:"Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content"}},rulesets:[{id:[],num:"1.3.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!0;if("style"===n.nodeName.toLowerCase()){for(var o=r.CSSUtil.getCSSStyle(n),s=0;l&&s<o.length;++s)o[s].selector&&(l=-1===o[s].selector.indexOf(":before")&&-1===o[s].selector.indexOf(":after")||!("content"in o[s].values)||0===o[s].values.content.trim().length||'""'===o[s].values.content.trim()||"''"===o[s].values.content.trim()||"none"===o[s].values.content.trim()||"attr(x)"===o[s].values.content.trim()||"attr(y)"===o[s].values.content.trim());if(l)for(var u=0;u<n.ownerDocument.styleSheets.length;u++)if((_=n.ownerDocument.styleSheets[u]).ownerNode===n)try{var d=_.cssRules?_.cssRules:_.rules;if(d)for(var c=0;l&&c<d.length;c++){var m=d[c],p=void 0;if(m.type&&4===m.type){if(v=m.cssRules)for(var h=0;l&&h<v.length;h++)null!==(w=v[h]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1))}else if(m.type&&3===m.type&&(p=m).styleSheet&&(f=p.styleSheet.cssRules?p.styleSheet.cssRules:p.styleSheet.rules))for(h=0;l&&h<f.length;h++){var g=f[h];if(g.type&&4===g.type){if(v=g.cssRules)for(var b=0;b<v.length;b++)null!==(w=v[b]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1))}else null!==g.selectorText&&void 0!==g.selectorText&&(-1===(C=g.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=g.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1))}}}catch(e){}}if("link"===n.nodeName.toLowerCase()&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&n.hasAttribute("href")&&0!==n.getAttribute("href").trim().length)for(u=0;u<n.ownerDocument.styleSheets.length;u++){var _;if((_=n.ownerDocument.styleSheets[u])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(h=0;l&&h<f.length;h++){var v,A=f[h];if(A.type&&4===A.type){if(v=A.cssRules)for(b=0;l&&b<v.length;b++){var w;if(null!==(w=v[b]).selectorText&&void 0!==w.selectorText){var y=w.selectorText.toLowerCase();-1===y.indexOf(":before")&&-1===y.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1)}}}else if(null!==f[h].selectorText&&void 0!==f[h].selectorText){var C,k;-1===(C=f[h].selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=f[h].style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1)}}}catch(e){}}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},7475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_color_misuse=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3864),o=i(4566);t.style_color_misuse={id:"style_color_misuse",context:"dom:style, dom:*[style], dom:font[color], dom:link",refactor:{RPT_Style_ColorSemantics1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_color_misuse.html",Pass_0:"style_color_misuse.html",Potential_1:"style_color_misuse.html"}},messages:{"en-US":{group:"Combine color and descriptive markup to convey information",Pass_0:"Rule Passed",Potential_1:"Verify color is not used as the only visual means of conveying information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var r=e.dom.node,s=r.nodeName.toLowerCase(),u="";if("style"===s){u=a.CommonUtil.getInnerText(r).toLowerCase();for(var d=0;d<r.ownerDocument.styleSheets.length;d++)if((_=r.ownerDocument.styleSheets[d])&&_.ownerNode===r)try{for(var c=_.cssRules?_.cssRules:_.rules,m=0;m<c.length;m++){var p=c[m],h=void 0;if(p.type&&3===p.type&&(h=p).styleSheet)for(var g=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules,b=0;b<g.length;b++)u+=g[b].cssText}}catch(e){}}else if(r.hasAttribute("style"))u=r.getAttribute("style").toLowerCase();else if("link"===s&&r.hasAttribute("rel")&&"stylesheet"===r.getAttribute("rel").toLowerCase()&&r.hasAttribute("href")&&0!==r.getAttribute("href").trim().length)for(d=0;d<r.ownerDocument.styleSheets.length;d++){var _;if((_=r.ownerDocument.styleSheets[d])&&_.ownerNode===r)try{var f=_.cssRules?_.cssRules:_.rules;for(b=0;b<f.length;b++)u+=f[b].cssText}catch(e){}}var v=!0,A=u.match(/\bbackground\b/i),w=u.replace(/-color/g,"").match(/\bcolor\b/i);if(r.hasAttribute("color")||w||A){var y={em:"",strong:"",cite:"",dfn:"",code:"",samp:"",kbd:"",var:"",abbr:"",acronym:""};if(!(v=s in y||null!==a.CommonUtil.getAncestor(r,y))&&r.hasChildNodes())for(var C=new l.DOMWalker(r);!v&&C.nextNode()&&C.node!==r;)v=C.node.nodeName.toLowerCase()in y}return v||(v=o.CacheUtil.getCache(r.ownerDocument,"style_color_misuse",!1),o.CacheUtil.setCache(r.ownerDocument,"style_color_misuse",!0)),v?(0,n.RulePass)("Pass_0"):v?void 0:(0,n.RulePotential)("Potential_1")}}},8064(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_focus_visible=void 0;var a=i(7139),n=i(461),r=i(461),l=i(4919),o=i(3883);t.style_focus_visible={id:"style_focus_visible",context:"dom:*",refactor:{RPT_Style_HinderFocus1:{Potential_1:"potential_focus_not_visible"}},help:{"en-US":{group:"style_focus_visible.html",potential_focus_not_visible:"style_focus_visible.html",pass_focus_visible:"style_focus_visible.html"}},messages:{"en-US":{group:"The keyboard focus indicator should be visible when default border or outline is modified by CSS",potential_focus_not_visible:"Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'",pass_focus_visible:"The keyboard focus indicator is visible or is not changed from the browser default"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.7",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r={skipNodes:{value:["table"],type:"[string]"},checkParams:{value:["border","border-width","border-style","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","outline","outline-width","outline-color","outline-style"],type:"[string]"}},s=e.dom.node;if(!a.CommonUtil.isTabbable(s)||r.skipNodes.value.includes(s.nodeName.toLowerCase()))return null;var u=l.CSSUtil.getDefinedStylesMultiple(s,null,["",":focus",":focus-visible",":focus-within"]),d=u[""],c=[];c.push(u[":focus"]),c.push(u[":focus-visible"]),c.push(u[":focus-within"]);var m=c[0];if(Object.keys(m).length>0){if(!((d["outline-width"]||d["outline-style"])&&"0px"!==d["outline-width"]&&"none"!==d["outline-style"]||m["outline-style"]&&"none"===m["outline-style"]))return(0,n.RulePass)("pass_focus_visible");var p=!1,h=0;for(var g in m)if(r.checkParams.value.includes(g)){var b=m[g],_=d[g];if(g.includes("style")){if(p="none"===b,_&&"none"!==b&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("width")){if(h++,"initial"===b?b="2px":"thin"===b?b="1px":"medium"===b?b="2px":"thick"===b&&(b="3px"),_&&("initial"===_?_="2px":"thin"===_?_="1px":"medium"===_?_="2px":"thick"===_&&(_="3px")),b=l.CSSUtil.getPixelsFromStyle(b,s),_=l.CSSUtil.getPixelsFromStyle(_,s),0==b||b<=_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("color")){h++;var f=o.ColorUtil.ColorCombo(s);if(null===f)continue;var v=f.bg;if(!v)continue;if("initial"===b&&(b="black"),_&&"initial"===_&&(_="black"),b=o.ColorUtil.Color(b),_=o.ColorUtil.Color(_),null===b||null===_)continue;var A=b.contrastRatio(v),w=_.contrastRatio(v);if(A<3||A<=w)return(0,n.RulePotential)("potential_focus_not_visible")}else if(h++,null!=_&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}if(p&&0===h)return(0,n.RulePotential)("potential_focus_not_visible")}else for(var y in d)if(r.checkParams.value.includes(y)&&"none"!==(_=d[y]))return(0,n.RulePotential)("potential_focus_not_visible");return(0,n.RulePass)("pass_focus_visible")}}},7942(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_highcontrast_visible=void 0;var a=i(461),n=i(461),r=i(4566);t.style_highcontrast_visible={id:"style_highcontrast_visible",context:"dom:style, dom:link, dom:*[style]",refactor:{RPT_Style_Trigger2:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"style_highcontrast_visible.html",Manual_1:"style_highcontrast_visible.html",group:"style_highcontrast_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content",group:"Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.nodeName.toLowerCase();if("link"===l&&(!n.hasAttribute("rel")||"stylesheet"!==n.getAttribute("rel").toLowerCase()))return(0,a.RulePass)("Pass_0");if("style"!==l&&"link"!==l&&n.hasAttribute("style")&&0===n.getAttribute("style").trim().length)return(0,a.RulePass)("Pass_0");var o=r.CacheUtil.getCache(n.ownerDocument,"style_highcontrast_visible",!1);return r.CacheUtil.setCache(n.ownerDocument,"style_highcontrast_visible",!0),o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RuleManual)("Manual_1")}}},2219(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_hover_persistent=void 0;var a=i(461),n=i(461),r=i(7139);t.style_hover_persistent={id:"style_hover_persistent",context:"dom:style, dom:*[style], dom:*",help:{"en-US":{Pass_0:"style_hover_persistent.html",Pass_2:"style_hover_persistent.html",Potential_1:"style_hover_persistent.html",Potential_2:"style_hover_persistent.html",Potential_3:"style_hover_persistent.html",group:"style_hover_persistent.html"}},messages:{"en-US":{Pass_0:"the hover: pseudo-class is not used to display content",Pass_2:"content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element",Potential_1:"Confirm the pointer can be positioned over the displayed element, not just the trigger",Potential_2:"Confirm the pointer can be positioned over all the information displayed on hover",Potential_3:"Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger",group:"The pointer should be able to move over content displayed on hover"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["1.4.13"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!1,l=!1,o=!1,s=e.dom.node;if("style"===s.nodeName.toLowerCase()){r.CommonUtil.getInnerText(s).toLowerCase();for(var u=0;u<s.ownerDocument.styleSheets.length;++u){var d=s.ownerDocument.styleSheets[u];if(d&&d.ownerNode===s)try{for(var c=d.cssRules?d.cssRules:d.rules,m=0;m<c.length;m++){var p="",h=!1,g=!1,b="",_=!1,f=!1,v=!1,A=(c[m],c[m].cssText);if(A.match(/:hover/g)){p=A.split(":")[0];var w=A.substring(A.indexOf("+")+1);if(w=w.trim(),(A.match(/:hover \+/g)||A.match(/:hover\+/g))&&(h=!0,b=w.split(" ")[0]),A.match(/:hover \~/g)||A.match(/:hover\~/g)){g=!0;var y=A.substring(A.indexOf("~")+1);b=(y=y.trim()).split(" ")[0]}if(!h&&!g)return(0,a.RulePass)("Pass_0");if(b&&(I=w.indexOf("display:"))&&"none;"!==w.slice(I+8).trim().split(" ")[0]&&d&&d.ownerNode===s)try{for(var C=d.cssRules?d.cssRules:d.rules,k=0;k<C.length;k++){var R=c[k].cssText,x=b+" {",P=R.trim(),T=P.indexOf(x);if(P.slice(T).trim(),P.match(/margin/g)){if(!o)return o=!0,(0,a.RulePotential)("Potential_3")}else{var U=R.split(":")[0];if((U=U.split(" ")[0])===b&&R.match(/:hover/g)){var I;if(_=!0,I=R.indexOf("display:"))if(f=!0,"none;"!==w.slice(I+8).trim().split(" ")[0]){if(v=!0,""!==p&&h){var E=s.ownerDocument.getElementsByTagName(p.toUpperCase());if(b.toUpperCase()===E[0].nextElementSibling.tagName){n=!0;continue}}else if(h){if(!l){l=!0;break}continue}if(""!==p&&g){E=s.ownerDocument.getElementsByTagName(p.toUpperCase());var N=[],L=E[0].nextElementSibling;do{if(L.tagName!==b.toUpperCase())break;N.push(L)}while(L=L.nextElementSibling);var S=N.length;if(1===S)return(0,a.RulePass)("Pass_2");if(S>1)return(0,a.RulePotential)("Potential_2")}}else{if(h){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}}else{if(h){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}}}else{if(h){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_2");continue}}}}}catch(e){}}}}catch(e){}}}return n?(0,a.RulePass)("Pass_0"):l?(0,a.RulePotential)("Potential_1"):o?(0,a.RulePotential)("Potential_3"):void 0}}},1473(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_viewport_resizable=void 0;var a=i(461),n=i(461);t.style_viewport_resizable={id:"style_viewport_resizable",context:"dom:link, dom:style, dom:*[style]",refactor:{WCAG21_Style_Viewport:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_viewport_resizable.html",Pass_0:"style_viewport_resizable.html",Potential_1:"style_viewport_resizable.html"}},messages:{"en-US":{group:"Text must scale up to 200% without loss of content or functionality",Pass_0:"Rule Passed",Potential_1:"Verify that text sized using viewport units can be resized up to 200%"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.4.4","1.4.10"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!0,l=/\d+(vw|vh|vmin|vmax)/gi,o=n.nodeName.toLowerCase();if("style"===o){for(var s=0;s<n.ownerDocument.styleSheets.length;s++)if((_=n.ownerDocument.styleSheets[s]).ownerNode===n)try{var u=_.cssRules?_.cssRules:_.rules;if(u)for(var d=0;r&&d<u.length;d++){var c=u[d];if(c.type&&1===c.type){var m=c;if(m.style.fontSize){var p=(v=m.style.fontSize.trim()).match(l);v.length&&p&&(r=!1)}}else if(c.type&&3===c.type&&c.styleSheet){var h=c;if(f=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules)for(var g=0;r&&g<f.length;g++){var b=f[g];b.type&&1===b.type&&b.style.fontSize&&(p=(v=b.style.fontSize.trim()).match(l),v.length&&p&&(r=!1))}}}}catch(e){}}else if("link"===o)for(s=0;s<n.ownerDocument.styleSheets.length;s++){var _;if((_=n.ownerDocument.styleSheets[s])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(g=0;r&&g<f.length;g++){var v,A=f[g];if(A.type&&1===A.type&&A.style.fontSize)p=(v=A.style.fontSize.trim()).match(l),v.length&&p&&(r=!1)}}catch(e){}}else{var w=n.getAttribute("style");w&&(p=w.match(/font-size:\s*\d+(vw|vh|vmin|vmax)/gi))&&(r=!1)}return r?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},1912(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.svg_graphics_labelled=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.svg_graphics_labelled={id:"svg_graphics_labelled",context:"dom:svg",help:{"en-US":{group:"svg_graphics_labelled.html",pass:"svg_graphics_labelled.html",fail_acc_name:"svg_graphics_labelled.html"}},messages:{"en-US":{group:"A non-decorative SVG element must have an accessible name",pass:"The SVG element has an accessible name",fail_acc_name:"The SVG element has no accessible name"}},rulesets:[{id:["IBM_Accessibility","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"7d6734":{pass:"pass",fail_acc_name:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n)||l.VisUtil.isNodePresentational(n)||r.AccNameUtil.isAccessibleNameIgnorable(n))return null;var o=r.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},6539(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_aria_descendants=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.table_aria_descendants={id:"table_aria_descendants",context:"aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]",help:{"en-US":{group:"table_aria_descendants.html",explicit_role:"table_aria_descendants.html"}},messages:{"en-US":{group:"Table structure elements cannot specify an explicit 'role' within table containers",explicit_role:"An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CommonUtil.isTableDescendant(i);if(null!==o&&0!==o.length){var s=r.AriaUtil.getImplicitRole(n),u=r.AriaUtil.getRoles(n,!1);if(!(s&&s.length>0&&u&&u.length>0&&u.some(function(e){return s.includes(e)})))return(0,a.RuleFail)("explicit_role",[e.dom.node.nodeName.toLowerCase(),o[0].role])}}}},4(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_empty=void 0;var a=i(461),n=i(461),r=i(7139);t.table_caption_empty={id:"table_caption_empty",context:"dom:caption",refactor:{Valerie_Caption_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_empty.html",Fail_1:"table_caption_empty.html",group:"table_caption_empty.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <table> element has an empty <caption> element",group:"A <caption> element for a <table> element must contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5334(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_nested=void 0;var a=i(461),n=i(461),r=i(7139);t.table_caption_nested={id:"table_caption_nested",context:"dom:caption",refactor:{Valerie_Caption_InTable:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_nested.html",Fail_1:"table_caption_nested.html",group:"table_caption_nested.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<caption> element is not nested inside a <table> element",group:"The <caption> element must be nested inside the associated <table> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return null!=r.CommonUtil.getAncestor(n,"table")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_exists=void 0;var a=i(461),n=i(461),r=i(9196);t.table_headers_exists={id:"table_headers_exists",context:"dom:table",refactor:{RPT_Table_DataHeadingsAria:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_exists.html",Fail_1:"table_headers_exists.html",group:"table_headers_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Table has no headers identified",group:"Data table must identify headers"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.rows;if(!r.TableUtil.isDataTable(n)||null===l||0===l.length)return null;var o=r.TableUtil.tableHeaderExists(n);return null!==o?o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):void 0}}},8349(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_ref_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(1686),s=i(3946),u=i(9955);t.table_headers_ref_valid={id:"table_headers_ref_valid",context:"dom:td[headers], dom:th[headers]",help:{"en-US":{Pass_0:"table_headers_ref_valid.html",Fail_1:"table_headers_ref_valid.html",Fail_2:"table_headers_ref_valid.html",Fail_3:"table_headers_ref_valid.html",Fail_4:"table_headers_ref_valid.html",group:"table_headers_ref_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document",Fail_2:"The 'headers' attribute value \"{0}\" refers to itself",Fail_3:"The 'headers' attribute value \"{0}\" does not refer to a cell in the same table",Fail_4:'The \'headers\' attribute value "{0}" does not refer to a cell indicated with <th> or a role of "columnheader" or "rowheader"',group:"The 'headers' attribute should refer to a valid cell in the same table"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["a25f45"],run:function(e,t,i){var n=e.dom.node,d=l.CommonUtil.getAncestor(n,"table"),c=u.ARIAMapper.nodeToRole(d);if(null==d||!s.VisUtil.isNodeVisible(d)||!["table","grid"].includes(c))return null;n.nodeName.toLowerCase();var m=n.ownerDocument,p=n.getAttribute("headers");if(!p)return null;for(var h=p.split(" "),g=[],b=[],_=[],f=[],v=0;v<h.length;v++){var A=h[v];if(""!==A.trim()){var w=m.getElementById(A);if(w)if(o.DOMUtil.sameNode(w,n))b.push(A);else if(o.DOMUtil.isInSameTable(w,n)){if("th"!==w.nodeName.toLowerCase()){var y=r.AriaUtil.getRoles(w,!0);y.includes("columnheader")||y.includes("rowheader")||f.push(A)}}else _.push(A);else g.push(A)}}var C=[];return 0!=g.length&&C.push((0,a.RuleFail)("Fail_1",[g.toString()])),0!=b.length&&C.push((0,a.RuleFail)("Fail_2",[b.toString()])),0!=_.length&&C.push((0,a.RuleFail)("Fail_3",[_.toString()])),0!=f.length&&C.push((0,a.RuleFail)("Fail_4",[f.toString()])),0==C.length?(0,a.RulePass)("Pass_0"):C}}},8142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_related=void 0;var a=i(461),n=i(461),r=i(7139),l=i(4566),o=i(9196);t.table_headers_related={id:"table_headers_related",context:"dom:td, dom:th",refactor:{Valerie_Table_DataCellRelationships:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_related.html",Fail_1:"table_headers_related.html",group:"table_headers_related.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Complex table does not have headers for each cell properly defined with 'header' or 'scope'",group:"For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.CommonUtil.getAncestor(n,"table");if(null==s||!o.TableUtil.isComplexDataTable(s))return null;if(null===l.CacheUtil.getCache(n,"table_headers_related",null)){for(var u=[],d=0;d<s.rows.length;++d){var c=s.rows[d];u[d]||(u[d]=[]);for(var m=0;m<c.cells.length;++m){var p=c.cells[m];l.CacheUtil.setCache(p,"table_headers_related",d+":"+m);var h=parseInt(p.getAttribute("colspan"));h||(h=1);var g=parseInt(p.getAttribute("rowspan"));g||(g=1);for(var b=0;u[d][b];)b+=1;for(var _=0;_<g;++_){u[d+_]||(u[d+_]=[]);for(var f=0;f<h;++f)u[d+_][b+f]=p}}}var v=n.ownerDocument,A={},w={};for(d=0;d<u.length;++d){var y=!1;for(m=0;m<u[d].length;++m){var C=u[d][m],k=C.nodeName.toLowerCase();if("th"==k){if("row"==C.getAttribute("scope")?(y=!0,r.CommonUtil.attributeNonEmpty(C,"axis")||(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0)):"rowgroup"==C.getAttribute("scope")?r.CommonUtil.attributeNonEmpty(C,"axis")||(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0):"col"==C.getAttribute("scope")&&(w[m]=!0,r.CommonUtil.attributeNonEmpty(C,"axis")||(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0)),r.CommonUtil.attributeNonEmpty(C,"headers")){var R=C.getAttribute("headers").split(" ");for(_=0;_<R.length;++_)(x=v.getElementById(R[_].trim()))&&r.CommonUtil.getAncestor(x,"table")==s&&(A[l.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}else if("td"==k)if(y||w[m])A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0;else if(r.CommonUtil.attributeNonEmpty(C,"headers"))for(R=C.getAttribute("headers").split(" "),_=0;_<R.length;++_){var x;(x=v.getElementById(R[_].trim()))&&r.CommonUtil.getAncestor(x,"table")==s&&(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0,A[l.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}}l.CacheUtil.setCache(s,"table_headers_related",A)}var P=l.CacheUtil.getCache(n,"table_headers_related",null),T=l.CacheUtil.getCache(s,"table_headers_related",null),U=P&&T&&P in T;return U||"0:0"!==P||0!=r.CommonUtil.getInnerText(n).trim().length?(U||0!=s.getElementsByTagName("th").length||(!0===l.CacheUtil.getCache(s,"table_headers_related_TrigOnce",!1)?U=!0:l.CacheUtil.setCache(s,"table_headers_related_TrigOnce",!0)),U?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")):null}}},3980(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_layout_linearized=void 0;var a=i(461),n=i(461),r=i(3946),l=i(9196);t.table_layout_linearized={id:"table_layout_linearized",context:"dom:table",refactor:{RPT_Table_LayoutTrigger:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"table_layout_linearized.html",Potential_1:"table_layout_linearized.html",group:"table_layout_linearized.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify table is not being used to format text content in columns unless the table can be linearized",group:"Avoid using tables to format text documents in columns unless the table can be linearized"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=!l.TableUtil.isLayoutTable(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},4701(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_scope_valid=void 0;var a=i(461),n=i(461);t.table_scope_valid={id:"table_scope_valid",context:"dom:td[scope], dom:th[scope]",refactor:{WCAG20_Table_Scope_Valid:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"table_scope_valid.html",Fail_1:"table_scope_valid.html",Fail_2:"table_scope_valid.html",group:"table_scope_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Value provided is invalid for the 'scope' attribute",Fail_2:"The 'scope' attribute should only be used on a <th> element",group:'Value for \'scope\' attribute must be "row", "col", "rowgroup", or "colgroup"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("td"===n.nodeName.toLowerCase())return(0,a.RuleFail)("Fail_2");var r=n.getAttribute("scope").trim().toLowerCase();return/^(row|col|rowgroup|colgroup)$/.test(r)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},18(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_structure_misuse=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=i(9196);t.table_structure_misuse={id:"table_structure_misuse",context:"dom:table",refactor:{WCAG20_Table_Structure:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_structure_misuse.html",Fail_1:"table_structure_misuse.html",group:"table_structure_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The <{0}> element with "presentation" role or "none" role has structural element(s) and/or attribute(s) \'{1}\'',group:'Table elements with \'role="presentation" or \'role="none" should not have structural elements or attributes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;if(s.TableUtil.isDataTable(n))return null;if(r.AriaUtil.isNodeInGrid(n))return null;var u=[];l.CommonUtil.attributeNonEmpty(n,"summary")&&u.push(n);for(var d=n.getElementsByTagName("caption"),c=0;c<d.length;++c)if(l.CommonUtil.getAncestor(d[c],"table")==n){if(l.CommonUtil.shouldNodeBeSkippedHidden(d[c]))continue;u.push(d[c]);break}var m=n.getElementsByTagName("th");for(c=0;c<m.length;++c)if(l.CommonUtil.getAncestor(m[c],"table")==n){if(l.CommonUtil.shouldNodeBeSkippedHidden(m[c]))continue;u.push(m[c]);break}var p=n.getElementsByTagName("td");for(c=0;c<p.length;++c)if((p[c].hasAttribute("scope")||p[c].hasAttribute("headers"))&&l.CommonUtil.getAncestor(p[c],"table")==n){if(l.CommonUtil.shouldNodeBeSkippedHidden(p[c]))continue;u.push(p[c]);break}var h=n.nodeName.toLowerCase(),g=new Array,b={};for(c=0;c<u.length;c++){var _=u[c].nodeName.toLowerCase();b.hasOwnProperty(_)||("table"!=_||b.hasOwnProperty.summary?(b[_]=!0,g.push(_)):(b.summary=!0,g.push("summary")))}var f=g.join(", ");return 0==u.length?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[h,f])}}},9314(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_summary_redundant=void 0;var a=i(461),n=i(461),r=i(7139),l=i(5279),o=i(1686);t.table_summary_redundant={id:"table_summary_redundant",context:"dom:table",refactor:{WCAG20_Table_CapSummRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_summary_redundant.html",Fail_1:"table_summary_redundant.html",group:"table_summary_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The table summary duplicates the caption",group:"The table summary must not duplicate the caption"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s=e.dom.node;if(s.hasAttribute("summary"))n=s.getAttribute("summary").trim().toLowerCase();else if(s.hasAttribute("aria-describedby")){for(var u=s.getAttribute("aria-describedby").split(" "),d="",c=0;c<u.length;c++){var m=u[c];if(m){var p=l.FragmentUtil.getById(s,m);p&&!o.DOMUtil.sameNode(p,s)&&(d+=" "+r.CommonUtil.getInnerText(p).trim().toLowerCase())}}n=d}if(!n)return null;var h=s.getElementsByTagName("caption");if(0===h.length)return null;if(n.length>0){var g=r.CommonUtil.getInnerText(h[0]).trim().toLowerCase();return n.includes(g)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0")}}}},1667(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.target_spacing_sufficient=void 0;var a=i(7139),n=i(461),r=i(461),l=i(7507),o=i(4919),s=i(4566);t.target_spacing_sufficient={id:"target_spacing_sufficient",context:"dom:*",dependencies:[],help:{"en-US":{group:"target_spacing_sufficient.html",pass_spacing:"target_spacing_sufficient.html",pass_sized:"target_spacing_sufficient.html",pass_inline:"target_spacing_sufficient.html",pass_default:"target_spacing_sufficient.html",violation_spacing:"target_spacing_sufficient.html",recommendation_inline:"target_spacing_sufficient.html",potential_overlap:"target_spacing_sufficient.html"}},messages:{"en-US":{group:"The target must be sufficiently sized or spaced from other targets",pass_spacing:"The target's spacing from other targets is sufficient",pass_sized:"The target’s size is more than 24 CSS pixels",pass_inline:"The target is in a sentence or its size is otherwise constrained by the line-height of non-target text",pass_default:"The target's size is determined by the user agent and is not modified by the author",violation_spacing:'Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"',recommendation_inline:'Confirm the inline target "{0}" is sufficiently spaced from another inline target "{1}"',potential_overlap:'Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE,reasonCodes:["pass_spacing","pass_sized","pass_inline","pass_default","violation_spacing","potential_overlap"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:r.eRulePolicy.RECOMMENDATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE,reasonCodes:["recommendation_inline"]}],act:[],run:function(e,t,i){var r=e.dom.node,u=r.nodeName.toLocaleLowerCase(),d=new l.DOMMapper,c=d.getUnadjustedBounds(r);if(!c)return null;if(!a.CommonUtil.isTarget(r))return null;if(c.height>=24&&c.width>=24)return(0,n.RulePass)("pass_sized");var m=o.CSSUtil.getInlineStatus(r);if(null===m)return null;if(m.inline)return m.text?null===m.violation?(0,n.RulePass)("pass_inline"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]):null===m.violation?(0,n.RulePass)("pass_default"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]);if(o.CSSUtil.isTargetBrowserDefault(r))return(0,n.RulePass)("pass_default");var p=r.ownerDocument;if(!p)return null;var h=getComputedStyle(r);if(null===h)return null;var g=h.zIndex;g&&!isNaN(Number(g))||(g="0");var b=s.CacheUtil.getCache(p.documentElement,"target_spacing_sufficient::targets",void 0);if(void 0===b){b=[];for(var _=p.querySelectorAll("body *:not(script):not(style)"),f=0;f<_.length;f++){var v=_[f];a.CommonUtil.isTarget(v)&&b.push(v)}s.CacheUtil.setCache(p.documentElement,"target_spacing_sufficient::targets",b)}if(b&&0!==b.length){var A=!0,w=24,y=24,C=null,k=null,R=[],x=function(e){var t=b[e],i=r.compareDocumentPosition(t);if(0===i||i&Node.DOCUMENT_POSITION_CONTAINED_BY)return A=!1,"continue";if(i&Node.DOCUMENT_POSITION_CONTAINS||R.some(function(e){return e.contains(t)}))return"continue";var a=d.getUnadjustedBounds(t);if(!a)return"continue";var l=getComputedStyle(t),o="0";if(l&&((o=l.zIndex)&&!isNaN(Number(o))||(o="0")),a.top<=c.top&&a.left<=c.left&&a.top+a.height>=c.top+c.height&&a.left+a.width>=c.left+c.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:null}:{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};if(c.top<=a.top&&c.left<=a.left&&c.top+c.height>=a.top+a.height&&c.left+c.width>=a.left+a.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])}:{value:(0,n.RuleFail)("violation_spacing",[u,t.nodeName.toLowerCase()])};if((c.top>=a.top&&c.top<=a.top+a.height||c.top+c.height<=a.top&&c.top+c.height>=a.top+a.height)&&(c.left>a.left&&c.left<a.left+a.width||a.left>c.left&&a.left<c.left+c.width)||(c.top>a.top&&c.top<a.top+a.height||a.top>c.top&&a.top<c.top+c.height)&&(c.left>=a.left&&c.left<=a.left+a.width||c.left+c.width>=a.left&&c.left+c.width<=a.left+a.width))return{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};var s=24,m=24;c.width<24&&(c.top>=a.top&&c.top<=a.top+a.height||c.top<=a.top&&c.top+c.height>a.top)&&(s=Math.min(Math.abs(c.left-a.left),Math.abs(c.left-(a.left+a.width)),Math.abs(c.left+c.width-(a.left+a.width)),Math.abs(c.left+c.width-a.left))),c.height<24&&(c.left>=a.left&&c.left<=a.left+a.width||c.left<=a.left&&c.left+c.width>a.left)&&(m=Math.min(Math.abs(c.top-a.top),Math.abs(c.top-(a.top+a.height)),Math.abs(c.top+c.height-(a.top+a.height)),Math.abs(c.top+c.height-a.top))),s<w&&(w=s,C=t),m<y&&(y=m,k=t),R.push(t)};for(f=0;f<b.length;f++){var P=x(f);if("object"==typeof P)return P.value}return Math.round(c.width/2)+w<12||Math.round(c.height/2)+y<12?Math.round(c.width/2)+w<Math.round(c.height/2)+y?(0,n.RuleFail)("violation_spacing",[u,C.nodeName.toLowerCase()]):(0,n.RuleFail)("violation_spacing",[u,k.nodeName.toLowerCase()]):(0,n.RulePass)("pass_spacing")}}}},9599(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_block_heading=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3864),s=i(4919),u=i(3946);t.text_block_heading={id:"text_block_heading",context:"dom:p, dom:div, dom:br",refactor:{RPT_Block_ShouldBeHeading:{Potential_1:"potential_heading"}},help:{"en-US":{potential_heading:"text_block_heading.html",group:"text_block_heading.html"}},messages:{"en-US":{potential_heading:"Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role",group:"Heading text should use a heading element or role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.isNodeDisabled(n)||!u.VisUtil.isNodeVisible(n))return null;if(null===l.CommonUtil.getAncestor(n,["body"])||null!==l.CommonUtil.getAncestor(n,["script"]))return null;var d=0,c=n.ownerDocument.getElementsByTagName("body");if(null!=c){var m=getComputedStyle(c[0]);m&&(d=s.CSSUtil.getPixelsFromStyle(m["font-size"],c))}var p=0,h=[],g=new o.DOMWalker(n);g.nextNode();for(var b=!1;!b&&g.nextNode()&&g.node!==n&&g.node!==o.DOMWalker.parentNode(n)&&!["br","div","p"].includes(g.node.nodeName.toLowerCase());)if(g.node!==n&&!l.CommonUtil.shouldNodeBeSkippedHidden(g.node)){var _=g.node.nodeName.toLowerCase();if(3===g.node.nodeType){if(g.node.nodeValue.trim().length>0&&g.node.parentElement){var f=getComputedStyle(g.node.parentElement);if(f&&("bold"===f["font-weight"]||f["font-weight"]>=700||f["font-size"]&&f["font-size"].includes("large")||f["font-size"]&&0!==d&&s.CSSUtil.getPixelsFromStyle(f["font-size"],g.node.parentElement)>d)){var v=g.node.nodeValue.trim();(A=l.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else b=!0}}else if(1===g.node.nodeType)if("b"===_||"strong"===_||"u"===_||"font"===_){var A;v=l.CommonUtil.getInnerText(g.node),(A=l.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else{var w=r.AriaUtil.getResolvedRole(g.node);b=null!==w&&"generic"!==w&&"paragraph"!==w&&"strong"!==w||"applet"===_}}return 0==p&&(b=!0),b||(b=/[:,;\-\.]$/.test(h.join(" ").trim())),b?null:(0,a.RulePotential)("potential_heading",[h.join(" ")])}}},4672(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_contrast_sufficient=void 0;var a=i(7139),n=i(3946),r=i(3883),l=i(461),o=i(461),s=i(4919);t.text_contrast_sufficient={id:"text_contrast_sufficient",context:"dom:*",refactor:{IBMA_Color_Contrast_WCAG2AA:{Pass_0:"pass",Fail_1:"fail_contrast",Potential_1:"potential_same_color"},IBMA_Color_Contrast_WCAG2AA_PV:{pass_0:"pass",potential_1:"potential_graphic_background"}},help:{"en-US":{group:"text_contrast_sufficient.html",pass:"text_contrast_sufficient.html",fail_contrast:"text_contrast_sufficient.html",potential_same_color:"text_contrast_sufficient.html",potential_graphic_background:"text_contrast_sufficient.html",potential_text_shadow:"text_contrast_sufficient.html"}},messages:{"en-US":{group:"The contrast ratio of text with its background must meet WCAG AA requirements",pass:"The contrast ratio of text with its background meets WCAG AA requirements",fail_contrast:"Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_same_color:"The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast",potential_graphic_background:"Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_text_shadow:"Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.3",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:["afw4f7"],run:function(e,t,i){var o=e.dom.node,u=o.nodeName.toLowerCase();if(!n.VisUtil.isNodeVisible(o)||null!=n.VisUtil.hiddenByDefaultElements&&null!=n.VisUtil.hiddenByDefaultElements&&n.VisUtil.hiddenByDefaultElements.indexOf(u)>-1)return null;if(a.CommonUtil.isNodeDisabled(o))return null;if(a.CommonUtil.getAncestor(o,["svg","script","meta","style"]))return null;var d=o.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=a.CommonUtil.getNodeText(o);if(!a.CommonUtil.isShadowHostElement(o)||a.CommonUtil.isShadowHostElement(o)&&""===a.CommonUtil.getNodeText(o.shadowRoot)){if(0==m.trim().length)return null;if(0===(m=m.trim().replace(/[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g,"")).trim().length)return null}var p=o;if(a.CommonUtil.isShadowHostElement(o)){if(o.shadowRoot)for(var h=o.firstChild;h;h=h.nextSibling)if(3==h.nodeType){p=h.assignedSlot;break}if(null===p)return}var g=c.getComputedStyle(p);if(!1==("0"!==g.width&&"0"!==g.height&&"0"!==g.opacity&&"none"!==g.display&&"hidden"!==g.visibility&&"hidden"!==g.overflow&&("auto"===g.left||"absolute"===g.position&&parseInt(g.left.replace(/[^0-9.+-]/,""))>0)&&("auto"===g.left||"absolute"===g.position&&parseInt(g.top.replace(/[^0-9.+-]/,""))>0)))return null;var b=-1;if("auto"!==g.clip){var _=g.clip.toString();if(_.includes("rect"))for(var f=[],v=/\((.*)\)/g.exec(_)[1].split(", "),A=0;A<v.length;A++)f.push(v[A]);b=parseInt(f[0].replace(/px/g,""))-parseInt(f[2].replace(/px/g,"")),b=Math.abs(b)}if("absolute"===g.position&&b<7&&-1!==b)return null;var w=r.ColorUtil.ColorCombo(p);if(null!==w){var y=w.fg,C=w.bg,k=y.contrastRatio(C),R=s.CSSUtil.getWeightNumber(g.fontWeight),x=s.CSSUtil.getFontInPixels(g.fontSize,p),P=x>=24||x>=18.6&&R>=700;s.CSSUtil.containsCKJ(m)&&(P=x>=29.3||x>=24&&R>=700);var T=k>=4.5||k>=3&&P,U=w.hasBGImage||w.hasGradient,I=w.textShadow,E=a.CommonUtil.isNodeDisabled(p);if(!E){var N=a.CommonUtil.getControlOfLabel(p);N&&(E=a.CommonUtil.isNodeDisabled(N))}return!E&&"label"===u&&a.CommonUtil.isDisabledByFirstChildFormElement(p)&&(E=!0),!E&&o.hasAttribute("id")&&a.CommonUtil.isDisabledByReferringElement(p)&&(E=!0),!T&&E&&(T=!0),T?(0,l.RulePass)("pass",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):U?(0,l.RulePotential)("potential_graphic_background",[k.toFixed(2),x,R]):I?(0,l.RulePotential)("potential_text_shadow",[k.toFixed(2),x,R]):y.toHex()===C.toHex()?(0,l.RulePotential)("potential_same_color",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):(0,l.RuleFail)("fail_contrast",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient])}console.log("unable to get color combo for element: "+p.nodeName)}}},4353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_quoted_correctly=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.text_quoted_correctly={id:"text_quoted_correctly",context:"dom:*",help:{"en-US":{Pass_0:"text_quoted_correctly.html",Potential_1:"text_quoted_correctly.html",group:"text_quoted_correctly.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}",group:"Quotations should be marked with <q> or <blockquote> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!l.VisUtil.isNodeVisible(n))return null;if(null===r.CommonUtil.getAncestor(n,["body"]))return null;for(var o=!0,s=n.firstChild,u=null,d=["blockquote","q","script","style","pre","code","ruby","samp"];o&&s;){if("#text"===s.nodeName){var c=s.nodeValue,m=(c=c.replace(/(\S)'(\S)/g,"$1$2")).match(/("[^"]+")/g),p=c.match(/('[^']+')/g);if((null!==m||null!==p)&&null===r.CommonUtil.getAncestor(s,d)){if(null!=m)for(var h=0;o&&h<m.length;++h)o=r.CommonUtil.wordCount(m[h])<3;if(null!=p)for(h=0;o&&h<p.length;++h)o=r.CommonUtil.wordCount(p[h])<3;u=null===m?p.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):null===p?m.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):m.concat(p).join(", ").replace(new RegExp("\\r?\\n|\\r","g"),"")}}s=s.nextSibling}return!o&&u.length&&u.length>69&&(u=u.substring(0,32)+" ... "+u.substring(u.length-32)),o?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1",[u])}}},7147(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_sensory_misuse=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(4566),s=i(3946);t.text_sensory_misuse={id:"text_sensory_misuse",context:"dom:body, dom:body dom:*",refactor:{RPT_Text_SensoryReference:{Potential_1:"potential_position, potential_other"}},help:{"en-US":{potential_position:"text_sensory_misuse.html",potential_other:"text_sensory_misuse.html",group:"text_sensory_misuse.html"}},messages:{"en-US":{potential_position:"Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position",potential_other:"Confirm the user instruction is still understandable without the word(s) '{0}'",group:"Instructions should be meaningful without relying solely on shape, size, or location words"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if(!s.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n)||s.VisUtil.hiddenByDefaultElements.includes(c))return null;if(null===l.CommonUtil.getAncestor(n,["body"]))return null;if(null!==l.CommonUtil.getAncestor(n,["script","a","label"]))return null;var m=r.AriaUtil.getResolvedRole(n);if(m){var p=r.AriaUtil.getRolesWithTypes(n,["landmark"]);if(p&&p.includes(m))return null}var h=r.AriaUtil.getRolesWithTypes(n,["widget","heading"]);if(l.CommonUtil.concatUniqueArrayItemList(["caption","cell","code","columnheader","definition","figure","list","listitem","math","meter","row","rowgroup","rowheader","term"],h),null!==r.AriaUtil.getAncestorWithRoles(n,h))return null;for(var g="",b="",_=n.firstChild,f="";_;){if("#text"===_.nodeName){var v=_.nodeValue.trim();v.length>0&&(f+=f.length>0?", "+v:v)}_=_.nextSibling}if(f.length>0){var A=function(e,t){if(!u[t])return"";var i=o.CacheUtil.getCache(e,t+"_sensory_misuse",null);if(null==i){for(var a=u[t].value,n="(ss+|"+a[0],r=1;r<a.length;++r){var l=a[r].trim().split(" ");if(n+="|"+l[0],l.length>1)for(var s=1;s<l.length;++s)n+=" +"+l[s]}n+=")",i=new RegExp(n,"gi"),o.CacheUtil.setCache(e,t+"_sensory_misuse",i)}return i}(n.ownerDocument,"exemptText");f=f.replace(A," "),g=d(n.ownerDocument,"positionText",f),b=d(n.ownerDocument,"otherText",f)}var w=[];return g&&w.push((0,a.RulePotential)("potential_position",[g])),b&&w.push((0,a.RulePotential)("potential_other",[b])),0==w.length?null:w}};var u={positionText:{value:["top-left","top-right","bottom-right","bottom-left","top-to-bottom","left-to-right","bottom-to-top","right-to-left","right","left","above","below","top","bottom","upper","lower","corner","beside"],type:"[string]"},otherText:{value:["round","square","shape","rectangle","triangle","size","large","small","medium","big","huge","tiny","extra","larger","smaller","bigger","little","largest","smallest","biggest"],type:"[string]"},exemptText:{value:["right-click","left-click","right-clicking","right-clicks","left-clicking","left-clicks","square root","right now","off the top"],type:"[string]"}};function d(e,t,i){if(!i)return"";var a=u[t].value,n={},r=[];return i.split(/\s+/).reduce(function(e,t){for(var i=t.replace(/[.?!:;()'",`\]]+$/,""),l=t.toLowerCase().replace(/[.?!:;()'",`\]]/g,""),o=0;o<a.length;o++){var s=l.indexOf(a[o]),u=a[o].length,d=l.charAt(u+s);if(!(s<0)){var c="."==d||"?"==d||"!"==d||":"==d||";"==d||"("==d||")"==d||"'"==d||'"'==d||","==d||".`"==d||"\\"==d||"]"==d,m=!1;if(s>0){var p=l.charAt(s-1);m="-"==p||"."==p||"?"==p||"!"==p||":"==p||";"==p||"("==p||")"==p||"'"==p||'"'==p||","==p||".`"==p||"\\"==p||"]"==p}l.length!=u&&1!=c&&1!=m||(n.hasOwnProperty(i)||(n[i]=!0,r.push(i)),o=a.length)}}return e[i]=(e[i]||0)+1,e},Object.create(null)),r.join(", ")}},1419(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_spacing_valid=void 0;var a=i(461),n=i(7139),r=i(3946),l=i(4919),o=i(7507),s=/(-?[\d.]+)([a-z%]*)/;function u(e,t,i){var a;if(i.startsWith("inherit")||i.startsWith("unset")){var n=l.CSSUtil.getAncestorWithStyles(e.parentElement,((a={})[t]=["*"],a),["inherit","unset"]);if(null!==n)return l.CSSUtil.getDefinedStyles(n,[t])[t];if(i.startsWith("unset"))return"initial"}return i}function d(e,t,i,a,n,r){if(void 0===r&&(r=!1),"important"!==e.style.getPropertyPriority(t))return!0;var o=function(e){return e.substring(0,e.length-11)}(i);if("initial"===o||"normal"===o)return!1;var u=parseFloat(o);if(isNaN(u))return!0;var d=o.trim().match(s);if(!d)return!0;var c=d[1],m=d[2];if(""===m){if(r)return!(parseFloat(c)<n);if(0===parseFloat(c))return null}if(""===m&&0!==parseFloat(c))return null;var p=l.CSSUtil.convertValue2Pixels(m,c,e);return!(null!==p&&p/a<n)}t.text_spacing_valid={id:"text_spacing_valid",context:"dom:*",help:{"en-US":{pass:"text_spacing_valid.html",group:"text_spacing_valid.html",fail_letter_spacing_style:"text_spacing_valid.html",fail_word_spacing_style:"text_spacing_valid.html",fail_line_height_style:"text_spacing_valid.html"}},messages:{"en-US":{pass:"CSS !important is not used in inline style to control letter or word spacing or line height",group:"CSS !important should not be used in inline style to control letter or word spacing or line height",fail_letter_spacing_style:"CSS !important should not be used in inline ‘letter-spacing’ style",fail_word_spacing_style:"CSS !important should not be used in inline ‘word-spacing’ style",fail_line_height_style:"CSS !important should not be used in inline ‘line-height’ style"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.12"],level:a.eRulePolicy.VIOLATION,toolkitLevel:a.eToolkitLevel.LEVEL_THREE}],act:["9e45ec","24afc2","78fd32"],run:function(e,t,i){for(var c=e.dom.node,m="",p=c.childNodes,h=0;h<p.length;++h)3===p[h].nodeType&&(m+=p[h].nodeValue);if(0===m.trim().length)return null;if(r.VisUtil.isNodeHiddenFromAT(c)||n.CommonUtil.isNodeDisabled(c))return null;var g=(new o.DOMMapper).getUnadjustedBounds(c);if(!g||g.top<0||g.left<0)return null;if(n.CommonUtil.getAncestor(c,"svg"))return null;var b=getComputedStyle(c),_=parseFloat(b.getPropertyValue("font-size")),f=b.getPropertyValue("word-spacing"),v=b.getPropertyValue("letter-spacing"),A=b.getPropertyValue("line-height"),w=!0,y=!0,C=!0;if(f){var k=parseFloat(f);if(!isNaN(k)){var R=l.CSSUtil.convertValue2Pixels("px",k.toString(),c);null!==R&&R/_<.16&&(w=!1)}}if(v){var x=parseFloat(v);if(!isNaN(x)){var P=l.CSSUtil.convertValue2Pixels("px",x.toString(),c);null!==P&&P/_<.12&&(y=!1)}}if(A){var T=parseFloat(A);if(!isNaN(T)){var U=A.match(s);if(U){var I=U[1],E=U[2];""!==E&&"px"!==E||(""===E?parseFloat(I):parseFloat(I)/_)<1.5&&(C=!1)}}}if(w&&y&&C)return null;var N=l.CSSUtil.getDefinedStyles(c,["word-spacing","letter-spacing","line-height"]);if(0===Object.keys(N).length)return null;var L=[],S=N["word-spacing"];if(S){var O=d(c,"word-spacing",S=u(c,"word-spacing",S),_,.16);L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_word_spacing_style"))}var q=N["letter-spacing"];q&&(O=d(c,"letter-spacing",q=u(c,"letter-spacing",q),_,.12),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_letter_spacing_style")));var M=N["line-height"];return M&&null===l.CSSUtil.getAncestorWithStyles(c,{overflow:["auto","scroll"],"overflow-x":["auto","scroll"],"overflow-y":["auto","scroll"]})&&(O=d(c,"line-height",M=u(c,"line-height",M),_,1.5,!0),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_line_height_style"))),L.length>0?L:null}}},855(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_whitespace_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.text_whitespace_valid={id:"text_whitespace_valid",context:"dom:*",help:{"en-US":{pass:"text_whitespace_valid.html",potential_text:"text_whitespace_valid.html",group:"text_whitespace_valid.html"}},messages:{"en-US":{pass:"Rule Passed",potential_text:"Space characters should not be used to create space between the letters of a word",group:"Space characters should not be used to control spacing within a word"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getAncestor(n,["body","script","code"]);if(null==l||"body"!=l.nodeName.toLowerCase())return null;for(var o=!0,s=n.firstChild;o&&s;){if("#text"==s.nodeName){var u=s.nodeValue;o=!/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(u)}s=s.nextSibling}return o?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_text")}}},3420(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9955),s=i(3864),u=i(3946);t.widget_tabbable_exists={id:"widget_tabbable_exists",context:"aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton",refactor:{IBMA_Focus_Tabbable:{pass:"pass",fail_no_tabbable:"fail_no_tabbable"}},help:{"en-US":{pass:"widget_tabbable_exists.html",fail_no_tabbable:"widget_tabbable_exists.html",group:"widget_tabbable_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_no_tabbable:'Component with "{0}" role does not have a tabbable element',group:"Component must have at least one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!u.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)&&!r.AriaUtil.shouldBePresentationalChild(n)){if("datalist"===n.nodeName.toLowerCase())return null;for(var d=0,c=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"];d<c.length;d++){var m=c[d];if(null!=r.AriaUtil.getAncestorWithRole(n,m,!0))return null}var p=o.ARIAMapper.nodeToRole(n),h=0;if(l.CommonUtil.isTabbable(n)&&++h,h<1&&!r.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var g=new s.DOMWalker(n);h<1&&g.nextNode()&&g.node!=n;)1==g.node.nodeType&&!g.bEndTag&&l.CommonUtil.isTabbable(g.node)&&++h;return h>=1?(0,a.RulePass)("pass"):(0,a.RulePotential)("fail_no_tabbable",[p])}}}},408(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_single=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7011),o=i(7139),s=i(9955),u=i(4566),d=i(3946);t.widget_tabbable_single={id:"widget_tabbable_single",context:"aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab",refactor:{IBMA_Focus_MultiTab:{pass:"pass",potential_multiple_tabbable:"potential_multiple_tabbable"}},help:{"en-US":{pass:"widget_tabbable_single.html",potential_multiple_tabbable:"widget_tabbable_single.html",group:"widget_tabbable_single.html"}},messages:{"en-US":{pass:"Components with a widget role should have no more than one tabbable element",potential_multiple_tabbable:'Component with "{0}" role has more than one tabbable element',group:"Components with a widget role must have no more than one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!d.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)&&!l.AriaUtil.shouldBePresentationalChild(n)){var c=s.ARIAMapper.nodeToRole(n),m=0;if(o.CommonUtil.isTabbable(n)&&++m,m<2&&!l.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var p=new r.DOMWalker(n);m<2&&p.nextNode()&&p.node!=n;)1==p.node.nodeType&&!p.bEndTag&&o.CommonUtil.isTabbable(p.node)&&++m;var h=m<2;return h||u.CacheUtil.setCache(n,"widget_tabbable_single","potential_multiple_tabbable"),h?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_multiple_tabbable",[c])}}}},6160(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.a11yRulesets=void 0;var l=r(i(8855)),o=i(8601),s=[];for(var u in l)s.push(l[u]);var d={"1.1.1":"All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.","1.2.1":"For prerecorded audio-only or video-only media, an alternative provides equivalent information.","1.2.2":"Captions are provided for all prerecorded audio content in synchronized media.","1.2.3":"An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.","1.2.4":"Captions are provided for all live audio content in synchronized media.","1.2.5":"Audio description is provided for all prerecorded video content in synchronized media.","1.3.1":"Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.","1.3.2":"When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.","1.3.3":"Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.","1.3.4":"Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.","1.3.5":"The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.","1.4.1":"Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.","1.4.2":"If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.","1.4.3":"The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.","1.4.4":"Text can be resized without assistive technology up to 200 percent without loss of content or functionality.","1.4.5":"If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.","1.4.10":"Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.","1.4.11":"The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.","1.4.12":"No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.","1.4.13":"Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.","2.1.1":"All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.","2.1.2":"If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.","2.1.4":"If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.","2.2.1":"For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.","2.2.2":"For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.","2.3.1":"Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.","2.4.1":"A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.","2.4.2":"Web pages, non-web documents, and software have titles that describe topic or purpose.","2.4.3":"If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.","2.4.4":"The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.","2.4.5":"More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.","2.4.6":"Headings and labels describe topic or purpose.","2.4.7":"Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.","2.4.11":"When an element receives focus, it is not entirely covered by other content.","2.5.1":"All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.","2.5.2":"For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.","2.5.3":"For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.","2.5.4":"Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.","2.5.8":"The size of the target for pointer inputs is at least 24 by 24 CSS pixels.","2.5.7":"All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.","3.1.1":"The default human language of Web pages, non-Web documents, or software can be programmatically determined.","3.1.2":"The human language of each passage or phrase in the content can be programmatically determined.","3.2.1":"When any component receives focus, it does not initiate a change of context.","3.2.2":"Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.","3.2.3":"Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.","3.2.4":"Components that have the same functionality within a set of Web pages are identified consistently.","3.2.6":"Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.","3.3.1":"If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.","3.3.2":"Labels or instructions are provided when content requires user input.","3.3.3":"If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.","3.3.4":"For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.","3.3.7":"Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.","3.3.8":"Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.","4.1.1":"(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.","4.1.2":"For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.","4.1.3":"In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",HTML:"The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.",ARIA:"The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported."};t.a11yRulesets=[{id:"EXTENSIONS",name:"Extension Rules",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for enabling the browser extensions",type:o.eGuidelineType.EXTENSION,checkpoints:[{num:"1",name:"Extension CP 1",wcagLevel:"A",summary:"Rules for Extension"}]},{id:"IBM_Accessibility",name:"IBM Accessibility 7.3",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"IBM_Accessibility_next",name:"IBM Accessibility next",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_2",name:"WCAG 2.2 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_1",name:"WCAG 2.1 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_0",name:"WCAG 2.0 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.",checkpoints:s.filter(function(e){return("A"===e.level||"AA"===e.level)&&"2.0"===e.wcagType}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})}]},5233(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRController=void 0;var a=i(8195),n=i(7014),r=i(248),l=i(4566),o=i(2165),s=i(3946),u=i(1686),d=function(){function e(e){void 0===e&&(e=document.body),this.rootElement=e,this.liveListeners=[],this.ctrlDoc=e.ownerDocument,this.setPointOfRegard(e),this.setupMutationTracking(),console.info('[WARNING] The SRController is a new feature that is not yet "stable". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback.')}return e.getController=function(t){return void 0===t&&(t=document),this.singleton||(this.singleton=new e(t.body)),this.singleton},e.prototype.disconnect=function(){this.mutationObserver&&this.mutationObserver.disconnect()},e.prototype.findAllShadowRoots=function(e){void 0===e&&(e=document);for(var t,i=[],a=this.ctrlDoc.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,null);t=a.nextNode();){var n=t;if(n.shadowRoot){i.push(n.shadowRoot);var r=this.findAllShadowRoots(n.shadowRoot);i.push.apply(i,r)}}return i},e.prototype.setupMutationTracking=function(){var e=this;this.mutationObserver&&this.mutationObserver.disconnect();var t=this,i=new MutationObserver(function(r){for(var l=t.pointOfRegard.getNode(),o=function(e){e.removedNodes.forEach(function(t){(t.isSameNode(l)||t.contains(l))&&(console.info("Adjusting PoR due to DOM mutation removing PoR"),l=e.target)})},u=0,d=r.filter(function(e){var t;return(null===(t=e.removedNodes)||void 0===t?void 0:t.length)>0});u<d.length;u++)o(d[u]);e.setPointOfRegard(l);for(var c=function(t){t.addedNodes&&t.addedNodes.forEach(function(t){for(var a=0,n=e.findAllShadowRoots(t);a<n.length;a++){var r=n[a];i.observe(r,{childList:!0,subtree:!0,characterData:!0})}});var r=t.target,l=1===r.nodeType?r:r.parentElement;if(l&&!l.closest('[aria-busy="true"]')&&"true"!==l.getAttribute("aria-busy")){var o=(["polite","assertive"].includes(l.getAttribute("aria-live"))||"OUTPUT"===l.nodeName.toUpperCase()||["status","log","progressbar","alert","timer"].includes(l.getAttribute("role")))&&l||l.closest('[aria-live="polite"],[aria-live="assertive"],output,[role="status"],[role="log"],[role="progressbar"],[role="alert"],[role="timer"]'),u=!1,d=["additions","text"];if(o){var c=l.closest("[aria-relevant]");c&&(d=c.getAttribute("aria-relevant").split(/ +/g)),"log"===o.getAttribute("role")&&(d=["additions"]),o.hasAttribute("aria-relevant")&&(d=o.getAttribute("aria-relevant").split(/ +/g)),d.includes("all")&&(d=["additions","removals","text"]),u=3===t.target.nodeType&&d.includes("text")||t.addedNodes.length>0&&d.includes("additions")||t.removedNodes.length>0&&d.includes("removals")}if(o&&u){var m="true"===o.getAttribute("aria-atomic")||["alert","status","timer","marquee"].includes(o.getAttribute("role"));if(m||"characterData"!==t.type||3!==t.target.nodeType||s.VisUtil.isNodeHiddenFromAT(t.target.parentElement)){var p=m?o:t.target;p.liveAnnounce&&clearTimeout(p.liveAnnounce),p.liveAnnounce=setTimeout(function(){var i=[],r=d.includes("removals")&&t.removedNodes.length>0;if(m||r){var l=new a.SRCursor(p,!1),o=new a.SRCursor(p,!0);o.next(function(){return!0}),i.push((r?"[removed] ":"")+n.SRRenderer.renderRange("item",l,o))}else d.includes("additions")&&t.addedNodes.length>0&&t.addedNodes.forEach(function(e){var t=new a.SRCursor(e,!1),r=new a.SRCursor(e,!0);r.next(function(){return!0}),i.push(n.SRRenderer.renderRange("item",t,r))});for(var s=0,u=e.liveListeners;s<u.length;s++)(0,u[s])(i.join("\n"))},100)}else for(var h=0,g=e.liveListeners;h<g.length;h++)(0,g[h])(t.target.nodeValue)}}},m=0,p=r;m<p.length;m++)c(p[m])}),r=this.findAllShadowRoots(this.ctrlDoc.documentElement);r.push(this.ctrlDoc.documentElement);for(var l=0,o=r;l<o.length;l++){var u=o[l];i.observe(u,{childList:!0,subtree:!0,characterData:!0})}},e.prototype.addLiveListener=function(e){this.liveListeners.push(e)},e.prototype.removeLiveListener=function(e){this.liveListeners=this.liveListeners.filter(function(t){return t!==e})},e.prototype.getPointOfRegard=function(){return this.pointOfRegard},e.prototype.setPointOfRegard=function(t){var i;try{this.pointOfRegard=new a.SRCursor(t);var r=e.diffContainers("focus",this.pointOfRegard),l=this.pointOfRegard.getRole(),o=null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name;return{success:!0,renderingResult:n.SRRenderer.renderCurrent("focus",this.pointOfRegard,r),role:l,name:o}}catch(e){return{success:!1,renderingResult:{start:this.pointOfRegard.clone(),end:this.pointOfRegard.clone(),message:"Failed to set point of regard: ".concat(e.message)}}}},e.prototype.jumpNext=function(t){var i;l.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=r.SRNavigator.jumpNext(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||r.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No next ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}finally{console.groupEnd()}},e.prototype.jumpPrevious=function(t){var i;l.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=r.SRNavigator.jumpPrevious(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||r.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No previous ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}},e.hostIframe=function(e){var t=e.ownerDocument;if(!t||t===document)return null;try{return u.DOMUtil.getAncestor(e,["iframe"])}catch(e){return null}},e.diffContainers=function(t,i,r){var l,o,s=[],u=[];try{if((null!==(l=null==i?void 0:i.getNode().ownerDocument)&&void 0!==l?l:document)!==(null!==(o=null==r?void 0:r.getNode().ownerDocument)&&void 0!==o?o:document)){var d=e.hostIframe(i.getNode()),c=e.hostIframe(null==r?void 0:r.getNode());if(d&&!c){var m=new a.SRCursor(d,!1);(g=n.SRRenderer.renderEnter(t,m,r))&&g.trim()&&u.push(g.trim())}else if(!d&&c)m=new a.SRCursor(c,!0),(p=n.SRRenderer.renderLeave(t,m,r))&&p.trim()&&s.push(p.trim());else if(d&&c&&d!==c){var p,h=new a.SRCursor(c,!0);(p=n.SRRenderer.renderLeave(t,h,r))&&p.trim()&&s.push(p.trim());var g,b=new a.SRCursor(d,!1);(g=n.SRRenderer.renderEnter(t,b,r))&&g.trim()&&u.push(g.trim())}return{leaving:s,entering:u}}var _=i?i.getNode().ownerDocument.body||i.getNode().ownerDocument.documentElement:r?r.getNode().ownerDocument.body||r.getNode().ownerDocument.documentElement:document.body||document.documentElement,f=i?i.clone():new a.SRCursor(_),v=r?r.clone():new a.SRCursor(_);if(!f.getNode().isSameNode(v.getNode())){var A=e.commonParent(f,v);if(A){for(;A.contains(f);)u.push(n.SRRenderer.renderEnter(t,f,v)),f.parent();for(u.reverse(),u=u.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()});A.contains(v);)s.push(n.SRRenderer.renderLeave(t,v,v)),v.parent();s=s.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()})}}}catch(e){console.error(e)}return{leaving:s,entering:u}},e.commonParent=function(e,t){if(e.contains(t))return e.clone();if(t.contains(e))return t.clone();for(var i=e.clone();!i.contains(t)&&i.parent(););return i.contains(e)&&i.contains(t)?i:null},e.renderAll=function(t){var i=e.getController();i.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&i.setPointOfRegard(e)});var a=[],r=n.SRRenderer.renderCurrent(t,i.getPointOfRegard(),{entering:[],leaving:[]});r&&a.push(r.message);for(var l=!0;l;){var s=i.jumpNext(t);s.success?a.push(s.renderingResult.message):l=!1}return a},e.renderAllDetail=function(t,i){var a=e.getController(t);a.setPointOfRegard(t.body),t.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&a.setPointOfRegard(e)});var r=[],l=n.SRRenderer.renderCurrent(i,a.getPointOfRegard(),{entering:[],leaving:[]});l&&r.push(l);for(var s=!0;s;){var u=a.jumpNext(i);u.success?r.push(u.renderingResult):s=!1}return r},e.renderStructure=function(t){for(var i,n,r=["region","heading","item","tab_focus","image"],l=r.map(function(i){return e.renderAllDetail(t,i)}),s=[],u=function(){var e=null===(i=l[0][0])||void 0===i?void 0:i.start;r.forEach(function(t,i){l[i].length>0&&(!e||a.SRCursor.compare(l[i][0].start,e)<0)&&(e=l[i][0].start)});var u={},d=!1;if(r.forEach(function(t,i){u[t]="",l[i].length>0&&0===a.SRCursor.compare(l[i][0].start,e)&&(u[t]=l[i].shift().message,d=""!==u[t])}),d){var c=e.getElement(),m=c&&o.SRUtil.getUniqueSelector(c),p=null!==(n=null==c?void 0:c.ownerDocument)&&void 0!==n?n:t;m&&p.querySelector(m)&&(u.selector=m),s.push(u)}};l.some(function(e){return e.length>0});)u();return s},e}();t.SRController=d},8195(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRCursor=void 0;var a=i(3864),n=i(1950),r=i(7011),l=i(7139),o=i(2165),s=function(){function e(e,t){this.walker=new a.DOMWalker(e,t,void 0,!1),e&&this.refreshName()}return e.prototype.clone=function(){var t=new e(this.walker.node,this.walker.bEndTag);return t.role=this.role,t.name=this.name,t.preLineIndex=this.preLineIndex,t},e.prototype.refreshName=function(){1===this.walker.node.nodeType?(this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0)},e.prototype.next=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},l=n.skipCurrent,s=n.skipChildren;do{if(s&&!this.walker.bEndTag)this.walker.bEndTag=!0;else if(!this.walker.nextNode())break;if(this.refreshName(),l=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&this.isEndTag())break;l||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.previous=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},l=n.skipCurrent,s=n.skipChildren;do{if(s&&this.walker.bEndTag)this.walker.bEndTag=!1;else if(!this.walker.prevNode())break;if(this.refreshName(),l=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&!this.isEndTag())break;l||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.parent=function(e){return!!this.walker.node.parentNode&&(this.walker.node=this.walker.node.parentNode,this.walker.bEndTag=!0===e,1===this.walker.node.nodeType?(this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0),!0)},e.prototype.getCurrentOrParentByRole=function(e,t){for(var i=this,a=t?t.map(function(e){return e.toUpperCase()}):[],n=function(t){var n=t.getElement();return e.includes(i.getRole())||n&&!n.hasAttribute("role")&&a.includes(n.nodeName.toUpperCase())};!n(this)&&this.parent(););return n(this)},e.prototype.getCurrentOrParentByRoleClone=function(e,t){var i=this.clone();return i.getCurrentOrParentByRole(e,t)?i:null},e.prototype.getCurrentOrParentTabbableClone=function(){for(var e=this.clone();e;){var t=e.getElement();if(e.isStartTag()&&t&&l.CommonUtil.isTabbable(t))return e;if(!e.parent(!1))break}return null},e.prototype.getRole=function(){return this.role},e.prototype.getNameInfo=function(){return this.name},e.prototype.getName=function(){var e=this.getNameInfo();if(e&&e.name)return e.name;var t=this.getElement();if(t){var i=l.CommonUtil.getLabelForElementHidden(t,!0);if(i)return i.innerText||i.textContent}},e.prototype.setEndTag=function(e){this.walker.bEndTag=e},e.prototype.getNode=function(){return this.walker.node},e.prototype.getElement=function(){if(this.walker.node&&1===this.walker.node.nodeType)return this.walker.node},e.prototype.getParentElement=function(){if(!this.walker.node)return null;var e=this.clone();return e.walker.node=a.DOMWalker.parentElement(e.walker.node),e},e.prototype.isEndTag=function(){return this.walker.bEndTag},e.prototype.isStartTag=function(){return!this.walker.bEndTag},e.compare=function(e,t){var i,n,r=null===(i=null==e?void 0:e.walker)||void 0===i?void 0:i.node,l=null===(n=null==t?void 0:t.walker)||void 0===n?void 0:n.node;if(!r&&!l)return 0;if(!r)return 1;if(!l)return-1;if(r===l&&!e.walker.bEndTag&&!t.walker.bEndTag){var o=void 0===e.preLineIndex,s=void 0===t.preLineIndex;if(!o||!s){if(o)return-1;if(s)return 1;if(e.preLineIndex!==t.preLineIndex)return e.preLineIndex<t.preLineIndex?-1:1}}var u=r.compareDocumentPosition(l);if(1&u){for(var d=[r],c=[l],m=r;m=a.DOMWalker.parentNode(m);)d.push(m);for(m=l;m=a.DOMWalker.parentNode(m);)c.push(m);d.reverse(),c.reverse();for(var p=0;p<d.length&&p<c.length&&d[p]===c[p];)p++;if(p===d.length)return e.walker.bEndTag?1:-1;if(p===c.length)return t.walker.bEndTag?-1:1;if(p>0){var h=d[p],g=c[p],b=h.compareDocumentPosition(g);if(2&b)return 1;if(4&b)return-1}return 0}return 8&u?t.walker.bEndTag?-1:1:16&u?e.walker.bEndTag?1:-1:2&u?1:4&u?-1:0},e.prototype.contains=function(e){return this.getNode().contains(e.getNode())&&!this.isSameNode(e)},e.prototype.isSameNode=function(e){return!!e&&this.getNode().isSameNode(e.getNode())},e.prototype.hasNonEmptyName=function(){var e;return((null===(e=this.getNameInfo())||void 0===e?void 0:e.name)||"").trim().length>0},e}();t.SRCursor=s},248(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRNavigator=void 0;var a=i(3864),n=i(1950),r=i(8195),l=i(7139),o=i(3946),s=i(7011);!function(e){function t(e){var i;if(1!==e.nodeType)return!1;if(["br","iframe"].includes(e.nodeName.toLowerCase()))return!0;var n=e,r=n.ownerDocument.defaultView,l=null===(i=r.getComputedStyle(n))||void 0===i?void 0:i.display;if(l&&l.startsWith("table"))return!0;if("block"===l&&"block"!==n.style.display&&n.parentElement&&"flex"===r.getComputedStyle(n.parentElement).display)return!1;if("link"===s.AriaUtil.getResolvedRole(n,!0)){var o=new a.DOMWalker(e,!1,void 0,!1);if(o.prevNode(),!t(o.node))return!0}return["block","flex","grid","list-item"].includes(l)}function i(e){for(var t,i=(null!==(t=e.textContent)&&void 0!==t?t:"").split("\n"),a=0;a<i.length&&""===i[a].trim();)a++;for(var n=i.length-1;n>=a&&""===i[n].trim();)n--;return i.slice(a,n+1)}function u(e){return 1===e.nodeType&&"PRE"===e.nodeName.toUpperCase()}function d(e){if(!e||1!==e.nodeType)return null;var t=e;if(!t.hasAttribute("tabindex"))return null;var i=parseInt(t.getAttribute("tabindex"),10);return Number.isNaN(i)?null:i}function c(e){if(!e||1!==e.nodeType)return!1;var t=e,i=d(t);return(null===i||0===i)&&l.CommonUtil.isTabbable(t)}function m(e){return void 0===e&&(e=!0),function(t,i,a){return!!(a&&1===a.nodeType&&i&&l.CommonUtil.isTabbable(a))&&(e||c(a))}}function p(e,t){var i=((null==t?void 0:t.ownerDocument)||document).body||t;if(!i)return[];var a=new r.SRCursor(i,!1),n=f("tab_focus"),o=[],s=[],u=function(t){e(t.getRole(),!t.isEndTag(),t.getNode())&&(function(e){if(!e||1!==e.nodeType)return!1;var t=e,i=d(t);return null!==i&&i>0&&l.CommonUtil.isTabbable(t)}(t.getNode())?o.push(t.clone()):c(t.getNode())&&s.push(t.clone()))};for(u(a);a.next(function(){return!0},n);)u(a);return o.sort(function(e,t){var i=e.getElement(),a=t.getElement(),n=d(i)||0,l=d(a)||0;return n!==l?l-n:r.SRCursor.compare(e,t)}),o.concat(s)}function h(e,t){return e.findIndex(function(e){return 0===r.SRCursor.compare(e,t)})}function g(e){switch(e){case"link":return function(e,t){return t&&"link"===e};case"tab_focus":return m(!1);case"heading":return function(e,t){return t&&"heading"===e};case"h1":return function(e,t,i){return t&&"heading"===e&&"1"===i.ariaLevel};case"h2":return function(e,t,i){return t&&"heading"===e&&"2"===i.ariaLevel};case"h3":return function(e,t,i){return t&&"heading"===e&&"3"===i.ariaLevel};case"h4":return function(e,t,i){return t&&"heading"===e&&"4"===i.ariaLevel};case"h5":return function(e,t,i){return t&&"heading"===e&&"5"===i.ariaLevel};case"h6":return function(e,t,i){return t&&"heading"===e&&"6"===i.ariaLevel};case"image":return function(e,t){return t&&["img","graphics-document"].includes(e)};case"radio":return function(e,t){return t&&"radio"===e};case"button":return function(e,t){return t&&"button"===e};case"checkbox":return function(e,t){return t&&"checkbox"===e};case"combo":return function(e,t){return t&&"combobox"===e};case"list":return function(e,t){return t&&"list"===e};case"listitem":return function(e,t){return t&&"listitem"===e};case"article":return function(e,t){return t&&"article"===e};case"table":return function(e,t){return t&&"table"===e};case"paragraph":return function(e,t,i){return t&&"P"===i.nodeName.toUpperCase()};case"dom":return function(){return!0};case"item":return function(e,i,n){if(!i)return!1;if(1===n.nodeType&&"IFRAME"===n.nodeName.toUpperCase())return!1;if(u(n))return!0;if(t(n))return!0;var r=new a.DOMWalker(n,!i);return!(!r.prevNode()||!r.bEndTag)&&t(r.node)};case"region":return function(e,t,i){var a,r;return!!t&&(!!["main","navigation","form","banner","search","contentinfo"].includes(e)||"region"===e&&1===(null==i?void 0:i.nodeType)&&!!(null===(r=null===(a=n.AccNameUtil.computeAccessibleName(i))||void 0===a?void 0:a.name)||void 0===r?void 0:r.trim()))};case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}e.getPreLines=i,e.getStartFunc=g;var b=function(e){var t;try{var i=e.getNode().nodeType,n=e.getElement(),r=e.clone();if(r.setEndTag(!1),[4,8].includes(i))return{skipCurrent:!0,skipChildren:!0};if(![1,3].includes(i))return{skipCurrent:!0,skipChildren:!1};if(3===i&&!(n=e.getNode().parentElement))return o.VisUtil.isNodeHiddenFromAT(n)?{skipCurrent:!0,skipChildren:!1}:null;if(!(n.closest("body")||(t=n,t.getRootNode()instanceof ShadowRoot)))return{skipCurrent:!0,skipChildren:!1};if(n.closest("script,style"))return{skipCurrent:!0,skipChildren:!0};var l=r.getCurrentOrParentByRoleClone(["heading","link"]),u=s.AriaUtil.getResolvedRole(n),d="heading"===u||"link"===u;if(l){l.getElement();var c=l.getNameInfo();if(c&&!["content","text"].includes(c.nameFrom)){if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:!0}}else if(d);else{var m=s.AriaUtil.getResolvedRole(n);if(("img"===m||"graphics-document"===m)&&o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0}}}else{if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:1===i};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:1===i}}if("BODY"===n.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!1};if("LABEL"===n.nodeName.toUpperCase()){if(n.hasAttribute("for")&&document.getElementById(n.getAttribute("for"))&&"hidden"!==document.getElementById(n.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var p=n.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']");if(p&&"hidden"!==p.getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};if((b=n.getAttribute("id"))&&document.querySelector('[aria-labelledby~="'.concat(b,'"]')))return{skipCurrent:!0,skipChildren:!1}}var h=n.closest("label[for]"),g=h&&h.getAttribute("for");if(h&&g&&document.getElementById(g)&&"hidden"!==document.getElementById(g).getAttribute("type")&&!n.closest("a[href], [role='link'], button, [role='button']"))return{skipCurrent:!0,skipChildren:1===i};var b,_=r.getRole();if("combobox"===_&&"SELECT"!==n.nodeName.toUpperCase()&&"INPUT"!==n.nodeName.toUpperCase()&&!e.isEndTag())return{skipCurrent:!1,skipChildren:!0};if(s.AriaUtil.containsPresentationalChildrenOnly(n))return{skipCurrent:!1,skipChildren:!0};if(["link","heading"].includes(_)&&(!r.getName()||!["content","text"].includes(r.getNameInfo().nameFrom))&&!(l&&l.getNameInfo()&&["content","text"].includes(l.getNameInfo().nameFrom)))return{skipCurrent:!1,skipChildren:!0};if("LEGEND"===n.nodeName.toUpperCase())for(var f=a.DOMWalker.parentElement(e.getNode());f;){if("FIELDSET"===f.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0};f=a.DOMWalker.parentElement(f)}if(n&&"MSUP"===n.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0};if(!e.isEndTag()&&"SUMMARY"===n.nodeName.toUpperCase()){var v=n.parentElement;if(v&&"DETAILS"===v.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0}}if(!e.isEndTag()&&"DETAILS"!==n.nodeName.toUpperCase()&&!n.closest("summary")){var A=n.closest("details");if(A&&!A.hasAttribute("open"))return{skipCurrent:!0,skipChildren:!0}}if(n.closest(".ibma-sr-overlay"))return{skipCurrent:!0,skipChildren:!0};if(1===i&&!e.isEndTag()&&(b=n.getAttribute("id"))){var w=document.querySelector('[aria-controls~="'.concat(b,'"]'));if(w&&"combobox"===s.AriaUtil.getResolvedRole(w))return{skipCurrent:!0,skipChildren:!0}}return null}finally{}},_=function(e){var t=e.getNode().nodeType,i=e.getElement();if(1!==t&&3!==t)return{skipCurrent:!0,skipChildren:!1};if(3===t)return o.VisUtil.isNodeHiddenFromAT(i)?{skipCurrent:!0,skipChildren:!1}:null;if(o.VisUtil.isNodeHiddenFromAT(i))return{skipCurrent:!0,skipChildren:!0};if("IFRAME"===i.nodeName.toUpperCase()&&!e.isEndTag())return{skipCurrent:!1,skipChildren:!0};if("LABEL"===i.nodeName.toUpperCase()&&i.hasAttribute("for")&&document.getElementById(i.getAttribute("for"))&&"hidden"!==document.getElementById(i.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var a=i.closest("label[for]"),n=a&&a.getAttribute("for");return a&&n&&document.getElementById(n)&&"hidden"!==document.getElementById(n).getAttribute("type")&&!i.closest("a[href], [role='link'], button, [role='button']")?{skipCurrent:!0,skipChildren:1===t}:(e.getRole(),s.AriaUtil.containsPresentationalChildrenOnly(i)?{skipCurrent:!1,skipChildren:!0}:i&&"MSUP"===i.nodeName.toUpperCase()||i.closest(".ibma-sr-overlay")?{skipCurrent:!0,skipChildren:!0}:null)};function f(e){switch(e){case"region":case"item":return b;case"link":case"tab_focus":case"heading":case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":case"image":return _;case"radio":case"button":case"checkbox":case"combo":case"list":case"listitem":case"article":case"table":case"paragraph":case"dom":case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}function v(e,t){try{if("tab_focus"===e){var a=p(m(!0),t.getNode());if(a.length>0){var n=t.getCurrentOrParentTabbableClone(),r=n&&h(a,n)>=0?n:t.clone(),l=h(a,r);return l>=0?l+1<a.length?a[l+1].clone():null:a[0].clone()}}if("item"===e&&u(t.getNode())&&!t.isEndTag()){var o=i(t.getNode());if(void 0!==t.preLineIndex){var s=t.preLineIndex;if(s+1<o.length){var d=t.clone();return d.preLineIndex=s+1,d}var c=t.clone();c.setEndTag(!0);var b=g(e),_=f(e);return c.next(b,_)?(u(c.getNode())&&!c.isEndTag()&&(c.preLineIndex=void 0),c):null}if(o.length>0){var v=t.clone();return v.preLineIndex=0,v}}var A=t.clone(),w=g(e),y=f(e);return A.next(w,y)?("item"===e&&u(A.getNode())&&!A.isEndTag()&&(A.preLineIndex=void 0),A):null}finally{console.groupEnd()}}function A(e,t){if("tab_focus"===e){var a=t.clone(),n=g(e),r=f(e);if(a.previous(n,r))return a;var l=p(m(!0),t.getNode());if(l.length>0){var o=t.getCurrentOrParentTabbableClone(),s=o&&h(l,o)>=0?o:t.clone(),d=h(l,s);if(d>0)return l[d-1].clone()}return null}if("item"===e&&u(t.getNode())&&!t.isEndTag()&&void 0!==t.preLineIndex){if(0===t.preLineIndex){var c=t.clone();return c.preLineIndex=void 0,c}var b=t.clone();return b.preLineIndex=t.preLineIndex-1,b}var _=t.clone(),v=g(e),A=f(e);if(_.previous(v,A)){if("item"===e&&u(_.getNode())&&!_.isEndTag()){var w=i(_.getNode());_.preLineIndex=w.length>0?w.length-1:void 0}return _}return null}e.getSkipFunc=f,e.jumpCurrent=function(e,t){return("tab_focus"===e?m(!0):g(e))(t.getRole(),!t.isEndTag(),t.getNode())?t.clone():A(e,t)},e.jumpCurrentEnd=function(e,t){if("item"===e){if(u(t.getNode())&&!t.isEndTag()){i(t.getNode());var a=void 0===t.preLineIndex?0:t.preLineIndex+1,n=t.clone();return n.preLineIndex=a,[n]}return(d=v(e,t))?[d]:[]}var l=t.getNameInfo(),o=t.clone();l&&!["content","text"].includes(l.nameFrom)||o.setEndTag(!0),o.next(function(){return!0});for(var s=[],d=v("item",t);d&&r.SRCursor.compare(d,o)<0;)s.push(d),d=v("item",d);return s.push(o),"tab_focus"===e&&"link"===t.getRole()?[s[s.length-1]]:s},e.jumpNext=v,e.jumpPrevious=A}(t.SRNavigator||(t.SRNavigator={}))},7014(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRenderer=void 0;var a,n=i(7011),r=i(248),l=i(8195),o=i(2151),s=i(7242);(a=t.SRRenderer||(t.SRRenderer={})).renderEnter=function(e,t,i){for(var a=0,n=o.CONTAINER_ENTER_RULES;a<n.length;a++){var r=n[a].test(e,t,i);if(null!=r)return r}return null},a.renderLeave=function(e,t,i){for(var a=0,n=o.CONTAINER_EXIT_RULES;a<n.length;a++){var r=n[a].test(e,t,i);if(null!=r)return r}return null},a.renderCurrent=function(e,t,i){var n=r.SRNavigator.jumpCurrent(e,t);if(!n)return null;var l=r.SRNavigator.jumpCurrentEnd(e,n);l&&0!==l.length||(l=[null]);for(var o=l[l.length-1],s="",u=0,d=l;u<d.length;u++){var c=d[u],m=a.renderRange(e,n,c);if(m.trim().length>0){o=c,s=m;break}}return""===s&&(s=a.renderRange(e,n,o)),{start:n,end:o,message:(i.leaving||[]).concat(i.entering||[]).concat([s]).join(" ").replace(/\s+/g," ")}},a.renderRange=function(e,t,i){for(var a,u=t.clone(),d=[],c=!0,m=null;c;){var p=u.getElement(),h=u.getNode(),g=h.nodeType,b=n.AriaUtil.getAncestorWithRole(h,"link",!0);b&&!["content","text"].includes(null===(a=new l.SRCursor(b).getNameInfo())||void 0===a?void 0:a.nameFrom)&&(b=null);for(var _=0,f=o.SR_RULES;_<f.length;_++){var v=f[_].test(e,u);if(null!=v&&v.trim().length>0){1!==g||u.isEndTag()||"menu"!==p.getAttribute("aria-haspopup")||(v="[subMenu] "+v),"tab_focus"===e?m&&(!b||b&&m!==b)&&(v="".concat(v," ").concat((0,s.getLinkAnnouncement)(new l.SRCursor(m,!1)))):!b||m&&m===b||(v="".concat((0,s.getLinkAnnouncement)(new l.SRCursor(b,!1))," ").concat(v)),""!==v&&(m=b,d.push(v));break}}d.push([].filter(function(e){return e.trim().length>0}).join(" ")),c=u.next(function(){return!0},r.SRNavigator.getSkipFunc(e))&&l.SRCursor.compare(u,i)<0}"tab_focus"===e&&m&&d.push("".concat((0,s.getLinkAnnouncement)(new l.SRCursor(m,!1))));var A=d.filter(function(e){return e.trim().length>0}).join(" ");return A=(A=A.replace(/, \u0001([^\u0002]+)\u0002/g,function(e,t){var i='"'.concat(t,'"'),a=A.replace(e,"");return a.includes(i)||a.includes(t)?"":", ".concat(i)})).replace(/[\u0001\u0002]/g,"")}},328(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRendererRule=void 0;var i=function(){function e(e){this.ruleDefinition=e}return e.prototype.test=function(e,t,i){if(this.ruleDefinition.modes.includes(e)&&(this.ruleDefinition.roles.includes(t.getRole())||this.ruleDefinition.elems.includes(t.getNode().nodeName.toUpperCase())))for(var a=0,n=this.ruleDefinition.tests;a<n.length;a++){var r=(0,n[a])(t,i,e);if("string"==typeof r)return r}return null},e}();t.SRRendererRule=i},369(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRTableUtil=void 0;var a=i(8195);!function(e){function t(e){return!!e.getElement()&&(!!["cell","rowheader","columnheader"].includes(e.getRole())||!e.getElement().hasAttribute("role")&&["TH","TD"].includes(e.getElement().nodeName.toUpperCase()))}function i(e){return e.getCurrentOrParentByRoleClone(["cell","rowheader","columnheader"],["TD","TH"])}function n(e){if(!t(e))return 0;var i=e.getElement().getAttribute("colspan");return i?parseInt(i):1}function r(e){if(!t(e))return 0;var i=e.getElement().getAttribute("rowspan");return i?parseInt(i):1}function l(e){var i=e.getCurrentOrParentByRoleClone(["table"]);if(!i)return null;for(var a,l=i.clone(),o=[],s=[];l.next(function(){return!0})&&!l.getNode().isSameNode(i.getNode());){if(l.isEndTag()&&"row"===l.getRole())for(o.push(s),a=s,s=[];a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length]);if(!l.isEndTag()&&t(l)){for(var u=n(l),d={rowIndexStart:o.length,colIndexStart:s.length,rowspan:r(l),colspan:u,cellCursor:l.clone()},c=0;c<u;++c)s.push(d);for(;a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length])}}return o}function o(e,t){var a=i(e);t||(t=l(e));for(var n=0;n<t.length;++n)for(var r=0;r<t[n].length;++r)if(t[n][r].cellCursor.isSameNode(a))return t[n][r];return null}function s(e,t){return t>=e.colIndexStart&&t<e.colIndexStart+e.colspan}function u(e,t){return t>=e.rowIndexStart&&t<e.rowIndexStart+e.rowspan}function d(e){var t=e.getElement();return!!t&&("cell"===e.getRole()||!t.hasAttribute("role")&&"TD"===t.nodeName.toUpperCase())}e.isCursorCellRole=t,e.getCurrentOrParentCellCursor=i,e.getColSpan=n,e.getRowSpan=r,e.getTableModel=l,e.getCellModel=o,e.cellModelContainsColumn=s,e.cellModelContainsRow=u,e.getRowHeaders=function(e){return""},e.getColumnHeadersForCursor=function(t,i){if(!i&&!(i=l(t)))return"";var n=o(t,i);if(!n)return"";var r=n.cellCursor;if(!r)return"";var u=r.getElement();if(!u)return"";for(var c=[],m=n.colIndexStart;m<n.colIndexStart+n.colspan;++m)c.push({potentialColHeaders:[],existsDataCell:!1,colIdx:m});var p=[];if(u.hasAttribute("headers"))p=u.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return s(e.getCellModel(t,i),a.colIdx)})});else{for(var h=0;h<i.length;++h)for(var g=function(e){var t=e.colIdx,a=i[h][t],n=a.cellCursor,l=n.getElement();if(!a||!n||n.isSameNode(r)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0),"continue";var o=n.clone();"columnheader"===n.getRole()?(p.push(o),e.potentialColHeaders.push(o)):l.hasAttribute("role")||"TH"!==l.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0):("col"===l.getAttribute("scope")||"axis"===l.getAttribute("scope")||!l.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialColHeaders.push(o))},b=0,_=c;b<_.length;b++)g(A=_[b]);for(var f=0,v=c;f<v.length;f++){var A;(A=v[f]).existsDataCell||(A.potentialColHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialColHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.getRowHeadersForCursor=function(t,i){if(!i&&!(i=l(t)))return"";var n=o(t,i);if(!n)return"";var r=n.cellCursor;if(!r)return"";var s=r.getElement();if(!s)return"";for(var c=[],m=n.rowIndexStart;m<n.rowIndexStart+n.rowspan;++m)c.push({potentialRowHeaders:[],existsDataCell:!1,rowIdx:m});var p=[];if(s.hasAttribute("headers"))p=s.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return u(e.getCellModel(t,i),a.rowIdx)})});else{for(var h=c.reduce(function(e,t){return Math.max(e,i[t.rowIdx].length)},0),g=0;g<h;++g)for(var b=function(e){var t=e.rowIdx;if(g>=i[t].length)return"continue";var a=i[t][g],n=a.cellCursor,l=n.getElement();if(!a||!n||n.isSameNode(r)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0),"continue";var o=n.clone();"rowheader"===n.getRole()?(p.push(o),e.potentialRowHeaders.push(o)):l.hasAttribute("role")||"TH"!==l.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0):("row"===l.getAttribute("scope")||"axis"===l.getAttribute("scope")||!l.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialRowHeaders.push(o))},_=0,f=c;_<f.length;_++)b(w=f[_]);for(var v=0,A=c;v<A.length;v++){var w;(w=A[v]).existsDataCell||(w.potentialRowHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialRowHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.isDataCell=d}(t.SRTableUtil||(t.SRTableUtil={}))},2165(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRUtil=void 0;var a,n=i(7011),r=i(3946);(a=t.SRUtil||(t.SRUtil={})).isModalDialogElement=function(e){if(1!==e.nodeType)return!1;var t=e;return"dialog"===n.AriaUtil.getResolvedRole(t,!0)&&"true"===t.getAttribute("aria-modal")&&r.VisUtil.isNodeVisible(e)},a.getUniqueSelector=function e(t,i){if(void 0===i&&(i=!1),t.id)return"#".concat(CSS.escape(t.id));if(t.isSameNode(document.documentElement)||t.isSameNode(document.body))return t.tagName.toLowerCase();var a=t.tagName.toLowerCase();if(t.classList.length&&!i&&(a+=Array.from(t.classList).slice(0,3).map(function(e){return".".concat(CSS.escape(e))}).join("")),!i){if(t.hasAttribute("role")&&(a+='[role="'.concat(CSS.escape(t.getAttribute("role")||""),'"]')),t.hasAttribute("aria-label")){var n=t.getAttribute("aria-label")||"";n.length<=20&&(a+='[aria-label="'.concat(CSS.escape(n),'"]'))}"input"===t.tagName.toLowerCase()&&t.hasAttribute("type")&&(a+='[type="'.concat(CSS.escape(t.getAttribute("type")||""),'"]'))}if(t.parentElement){var r=Array.from(t.parentElement.children).filter(function(e){return e.tagName===t.tagName});if(r.length>1){var l=r.indexOf(t)+1;a+=":nth-of-type(".concat(l,")")}return"".concat(e(t.parentElement,!0)," > ").concat(a)}return a}},8107(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRViewer=t.SROverlay=void 0;var a=i(5233),n=function(){function e(e){this.srViewer=e,this.navigationModes=[{mode:"item",label:"Item"},{mode:"tab_focus",label:"Tabbable"},{mode:"heading",label:"Heading"},{mode:"region",label:"Region"}],this.createOverlay()}return e.prototype.createDOMElement=function(e,t,i){var a=this.srViewer.viewerDoc.createElement(e);if(t)for(var n in t)a[n]=t[n];if(i)for(var n in i)a.style[n]=i[n];return a},e.prototype.createOverlay=function(){var e=this;this.container=this.createDOMElement("div",{className:"ibma-sr-overlay"},{position:"fixed",bottom:"0",left:"0",width:"100%",backgroundColor:"rgba(0, 0, 0, 0.8)",color:"white",padding:"10px",zIndex:"10000",display:"flex",flexDirection:"column",gap:"10px"});var t=this.createDOMElement("div",{},{display:"flex",flexWrap:"wrap",gap:"10px"});this.navigationModes.forEach(function(i){var a=e.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"});a.appendChild(e.createDOMElement("span",{textContent:i.label+":"},{}));var n=e.createDOMElement("button",{textContent:"◀ Prev"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.navigatePrevious(i.mode)}),a.appendChild(n);var r=e.createDOMElement("button",{textContent:"Next ▶"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});r.addEventListener("click",function(){return e.srViewer.navigateNext(i.mode)}),a.appendChild(r),t.appendChild(a)});var i=this.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"}),a=this.createDOMElement("button",{textContent:"Show all"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});a.addEventListener("click",function(){return e.srViewer.showAll(!0)}),i.appendChild(a);var n=this.createDOMElement("button",{textContent:"Toggle speech"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.toggleSpeech()}),i.appendChild(n),t.appendChild(i),this.resultsDisplay=this.createDOMElement("div",{textContent:"Screen reader simulation results will appear here."},{padding:"10px",backgroundColor:"rgba(255, 255, 255, 0.1)",borderRadius:"3px",minHeight:"100px",maxHeight:"50vh",fontFamily:"monospace",overflow:"auto"}),this.container.appendChild(t),this.container.appendChild(this.resultsDisplay),this.srViewer.viewerDoc.body.appendChild(this.container)},e.prototype.displayResult=function(e,t,i){var a,n,r,l,o="";e.success,o="".concat(i.toUpperCase()," ").concat(t,": ").concat(e.renderingResult.message),null===(n=null===(a=e.renderingResult.end)||void 0===a?void 0:a.getElement())||void 0===n||n.scrollIntoView(),null===(l=null===(r=e.renderingResult.start)||void 0===r?void 0:r.getElement())||void 0===l||l.scrollIntoView(),window.scrollBy(0,-200),this.resultsDisplay.innerHTML="",this.resultsDisplay.textContent=o;var s=this.createDOMElement("button",{innerText:"Debug"},{});s.addEventListener("click",function(){var t,i;console.log(null===(t=e.renderingResult.start)||void 0===t?void 0:t.getNode(),null===(i=e.renderingResult.end)||void 0===i?void 0:i.getNode())}),this.resultsDisplay.appendChild(s)},e.prototype.displayAll=function(e){for(var t=this,i=this.createDOMElement("table",{},{}),a=this.createDOMElement("tr",{},{}),n=["region","heading","item","tab_focus"],r=0,l=["Region","Heading","Item","Tabbable"];r<l.length;r++){var o=l[r];a.appendChild(this.createDOMElement("th",{scope:"col",innerText:o},{textAlign:"left",padding:".25rem",margin:"0rem",color:"white"})),i.appendChild(a)}for(var s=function(e){var a=u.createDOMElement("tr",{},{});n.forEach(function(i){a.appendChild(t.createDOMElement("td",{innerText:e[i]},{verticalAlign:"top",border:"solid white 1px",padding:".25rem",margin:"0rem",color:"white"}))}),i.appendChild(a)},u=this,d=0,c=e;d<c.length;d++)s(c[d]);this.resultsDisplay.innerHTML="",this.resultsDisplay.appendChild(i)},e.prototype.destroy=function(){this.container&&this.container.parentNode&&this.container.parentNode.removeChild(this.container)},e}();t.SROverlay=n;var r=function(){function e(e){void 0===e&&(e=document.body),this.isStreaming=!1,this.isShowingAll=!1,this.speechEnabled=!1,this.viewerDoc=e.ownerDocument,this.controller=a.SRController.getController(this.viewerDoc),this.overlay=new n(this),this.setupKeyboardHandlers(),this.setupFocusTracking(),this.setupMutationTracking()}return e.prototype.showAll=function(e){e&&(this.isShowingAll=!0);var t=a.SRController.renderStructure(this.viewerDoc);this.overlay.displayAll(t)},e.prototype.toggleSpeech=function(){this.speechEnabled=!this.speechEnabled},e.prototype.navigateNext=function(e){this.isShowingAll=!1;var t=this.controller.jumpNext(e);this.overlay.displayResult(t,e,"next"),this.speakResult(t)},e.prototype.navigatePrevious=function(e){this.isShowingAll=!1;var t=this.controller.jumpPrevious(e);this.overlay.displayResult(t,e,"previous"),this.speakResult(t)},e.prototype.setupKeyboardHandlers=function(){var e=this;this.keyboardHandler=function(t){var i=t.target;if("INPUT"!==i.tagName&&"TEXTAREA"!==i.tagName&&"SELECT"!==i.tagName)if(t.ctrlKey)e.stopSpeech();else if(!t.altKey&&!t.metaKey)switch(t.key){case"ArrowUp":t.preventDefault(),e.navigatePrevious("item");break;case" ":e.isStreaming=!0;case"ArrowDown":t.preventDefault(),e.navigateNext("item");break;case"Enter":t.preventDefault(),e.activateCurrentElement(),e.controller.setPointOfRegard(e.viewerDoc.activeElement);break;case"H":case"h":t.shiftKey?(t.preventDefault(),e.navigatePrevious("heading")):(t.preventDefault(),e.navigateNext("heading"));break;case"R":case"r":t.shiftKey?(t.preventDefault(),e.navigatePrevious("region")):(t.preventDefault(),e.navigateNext("region"));break;case"Tab":t.shiftKey?(t.preventDefault(),e.navigatePrevious("tab_focus")):(t.preventDefault(),e.navigateNext("tab_focus"))}},this.viewerDoc.addEventListener("keydown",this.keyboardHandler)},e.prototype.speakResult=function(e){var t=this;if(this.speechEnabled){var i=new SpeechSynthesisUtterance(e.renderingResult.message);i.rate=1.5;var a=this;i.addEventListener("end",function(e){a.isStreaming&&t.navigateNext("item")}),speechSynthesis.cancel(),speechSynthesis.speak(i)}},e.prototype.stopSpeech=function(){this.isStreaming=!1,speechSynthesis.cancel()},e.prototype.setupMutationTracking=function(){var e=this,t=new MutationObserver(function(i){if(e.isShowingAll&&i.filter(function(e){return 1===e.target.nodeType&&!e.target.closest(".ibma-sr-overlay")}).length>0){t.disconnect();var a=e;a.showAll(),setTimeout(function(){a.showAll(),t.observe(e.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},1e3)}});t.observe(this.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},e.prototype.setupFocusTracking=function(){var e=this;this.focusHandler=function(t){if(t.target instanceof HTMLElement){var i=t.target;if(e.overlay&&i.closest(".ibma-sr-overlay"))return;console.group("focusHandler");var a=e.controller.setPointOfRegard(i);a.success&&(e.overlay.displayResult(a,"focus","focus"),e.speakResult(a)),console.groupEnd()}},this.viewerDoc.addEventListener("focusin",this.focusHandler)},e.prototype.activateCurrentElement=function(){var e=this.controller.getPointOfRegard().getElement();if(e){var t={success:!0,renderingResult:{message:"Activating: ".concat(e.textContent||e.nodeName),start:this.controller.getPointOfRegard(),end:this.controller.getPointOfRegard()}};this.overlay.displayResult(t,"focus","focus"),this.speakResult(t),e.focus&&e.focus(),e.click()}},e.prototype.getController=function(){return this.controller},e.prototype.destroy=function(){this.viewerDoc.removeEventListener("keydown",this.keyboardHandler),this.viewerDoc.removeEventListener("focusin",this.focusHandler),this.stopSpeech(),this.overlay.destroy()},e}();t.SRViewer=r},7242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=t.getLinkAnnouncement=t.getRoleDescription=t.quoteName=t.quoteNamePadBefore=t.quoteNamePadAfter=void 0;var a=i(8195),n=i(328),r=i(7011),l=i(9910),o=i(3864),s=i(3946);function u(e,t,i,a){return e.getName()?"".concat(c(e)).concat(t||", "):""}function d(e,t){return e.getName()?"".concat(t||", ").concat(c(e)):""}function c(e,t,i){return e.getName()?"".concat(t||'"').concat(e.getName()).concat(i||'"'):""}function m(e,t){var i=e.getElement();if(!i)return t;var a=i.getAttribute("aria-roledescription");return a&&a.trim().length>0?a.trim():t}function p(e,t){var i,a=e.getNode().href||"";i=a.startsWith(document.location.href)&&"#"===a.charAt(document.location.href.length)?"same page link":"link";var n=e.getNameInfo();return n&&!["content","text"].includes(n.nameFrom)?"tab_focus"===t?"[".concat(u(e)).concat(i,"]"):"[".concat(i).concat(d(e),"]"):"[".concat(i,"]")}function h(e,t){var i=e.getAttribute("aria-describedby");if(!i)return"";var a=i.split(/\s+/).map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){var t;return null===(t=e.textContent)||void 0===t?void 0:t.trim()}).filter(function(e){return!!e}).join(" ");return a&&0!==a.length?"item"===t?", ".concat(a,""):', "'.concat(a,'"'):""}function g(e){var t="";return(e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled"))&&(t+=", disabled"),(e.hasAttribute("readonly")||"true"===e.getAttribute("aria-readonly"))&&(t+=", read only"),(e.hasAttribute("required")||"true"===e.getAttribute("aria-required"))&&(t+=", required","SELECT"===e.nodeName.toUpperCase()&&e.validity.valueMissing&&(t+=", invalid entry")),"true"===e.getAttribute("aria-invalid")&&(t+=", invalid"),t}function b(e){var t=e.getElement();if(!t)return!1;for(var i=new o.DOMWalker(t,!1,t,!1);i.nextNode();)if(1===i.node.nodeType&&!i.bEndTag){var a=r.AriaUtil.getResolvedRole(i.node);if(a&&l.ARIADefinitions.designPatterns[a]&&"widget"===l.ARIADefinitions.designPatterns[a].roleType)return!0}return!1}t.quoteNamePadAfter=u,t.quoteNamePadBefore=d,t.quoteName=c,t.getRoleDescription=m,t.getLinkAnnouncement=p,t.RULES=[new n.SRRendererRule({roles:["button"],elems:[],modes:["item","button","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"true"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"false"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", not pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isEndTag()){var a="",n=e.getElement(),r=m(e,"button");return["menu","true"].includes(n.getAttribute("aria-haspopup"))&&(a+=", menu"),n.hasAttribute("aria-expanded")&&(a+=", ".concat("true"===n.getAttribute("aria-expanded")?"expanded":"collapsed")),a+=g(n),"[".concat(u(e)).concat(r).concat(a).concat(h(n,i),"]")}},function(e){if(e.isEndTag())return""}]}),new n.SRRendererRule({roles:["checkbox"],elems:[],modes:["item","checkbox","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a=e.getNode(),n=m(e,"checkbox"),r="";return r="mixed"===a.getAttribute("aria-checked")?"half checked":(a.hasAttribute("aria-checked")?"true"===a.getAttribute("aria-checked"):a.checked)?"checked":"not checked",r+=g(e.getElement()),"[".concat(n,", ").concat(r).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["cell","columnheader","rowheader"],elems:[],modes:["item","table"],tests:[function(e){var t;if(!e.isStartTag())return null;var i=e.getElement();if(!i)return null;var a=(null===(t=i.textContent)||void 0===t?void 0:t.trim())||"",n=new o.DOMWalker(i,!1,i,!1),s=a.length>0;if(!s)for(;n.nextNode();)if(1===n.node.nodeType&&!n.bEndTag){var u=n.node,d=r.AriaUtil.getResolvedRole(u);if(d&&l.ARIADefinitions.designPatterns[d]){s=!0;break}if("IMG"===u.nodeName.toUpperCase()&&u.hasAttribute("alt")){s=!0;break}}return s?null:"[blank]"}]}),new n.SRRendererRule({roles:["combobox"],elems:[],modes:["item","combo","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=m(e,"combo box"),i=e.getElement(),n="";if("SELECT"===e.getNode().nodeName.toUpperCase()){n=", collapsed";var r=e.getElement(),l=r.selectedIndex>=0?r.options[r.selectedIndex]:null,o="";return l&&(o=d(new a.SRCursor(l,!1),", ")),n+=g(i),"[".concat(u(e)).concat(t).concat(n).concat(o,"]")}if("INPUT"===e.getNode().nodeName.toUpperCase())return i.hasAttribute("aria-expanded")&&(n=", ".concat("true"===i.getAttribute("aria-expanded")?"expanded":"collapsed")),n+=g(i),"[".concat(u(e)).concat(t).concat(n,", has auto complete, editable, opens list]");i.hasAttribute("aria-expanded")&&(n=", ".concat("true"===i.getAttribute("aria-expanded")?"expanded":"collapsed"),i.hasAttribute("aria-autocomplete")&&(n+=", has auto complete")),n+=g(i),o="";var s=i.getAttribute("aria-controls"),c=s?document.getElementById(s):null;if(c){var p=c.querySelector("[role='option'][aria-selected='true']");p&&(o=', "'.concat((p.textContent||"").trim(),'"'))}if(!o){var h=(i.textContent||"").trim();h&&(o=', "'.concat(h,'"'))}return"[".concat(u(e)).concat(t).concat(n).concat(o,"]")}]}),new n.SRRendererRule({roles:["listbox"],elems:[],modes:["item","combo","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=m(e,"list box"),i=e.getElement(),n="";if("SELECT"===e.getNode().nodeName.toUpperCase()){var r=e.getElement(),l=Array.from(r.options).filter(function(e){return e.selected}).map(function(e){return d(new a.SRCursor(e,!1),", ")}).join("");return n+=g(i),"[".concat(u(e)).concat(t).concat(n).concat(l,"]")}n+=g(i);var o=(i.textContent||"").trim(),s=o?', "'.concat(o,'"'):"";return"[".concat(u(e)).concat(t).concat(n).concat(s,"]")}]}),new n.SRRendererRule({roles:["default"],elems:[],modes:["item"],tests:[function(e){var t;return e.isStartTag()?"!!<".concat(e.getRole(),">").concat((null===(t=e.getNameInfo())||void 0===t?void 0:t.name)+"","!!"):"!!</".concat(e.getRole(),">!!")}]}),new n.SRRendererRule({roles:["deletion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[deleted]":""}]}),new n.SRRendererRule({roles:["dialog"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[End of dialog]":"[Start of dialog".concat(d(e))}]}),new n.SRRendererRule({roles:["generic","paragraph"],elems:["DIV","SPAN","P","SECTION","ARTICLE","HEADER","FOOTER","MAIN","ASIDE","NAV","LI","TD","TH","PRE","BLOCKQUOTE","FIGURE","FIGCAPTION","DETAILS","SUMMARY"],modes:["item","tab_focus"],tests:[function(e,t,i){var a,n=e.getElement();if(!n)return null;var r=n.getAttribute("contenteditable");if("true"!==r&&""!==r)return null;if(n.hasAttribute("role"))return null;var l="paragraph"===e.getRole()||"P"===n.nodeName.toUpperCase();if(e.isEndTag())return"item"===i?l?"[out of paragraph]":"[out of section]":"";var o="";(n.hasAttribute("disabled")||"true"===n.getAttribute("aria-disabled"))&&(o=", disabled");var s=l?"paragraph":"section",d=e.getNameInfo(),c=!d||["content","text"].includes(d.nameFrom),m="tab_focus"!==i||c?"":null===(a=n.textContent)||void 0===a?void 0:a.trim(),p=m?" ".concat(m):"";return"[".concat(u(e)).concat(s,", editable").concat(o,"]").concat(p)}]}),new n.SRRendererRule({roles:["document","generic"],elems:[],modes:["item"],tests:[function(){return""}]}),new n.SRRendererRule({roles:["graphics-document"],elems:[],modes:["item","image"],tests:[function(e){var t,i;return e.isStartTag()&&!(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&""!==(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]":null},function(e){var t;return e.isStartTag()&&""===(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)?"":null},function(e){var t;return e.isStartTag()&&(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&"[graphic".concat(d(e),"]")||null},function(e){return e.isEndTag()?"":null}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&e.isStartTag())return"";if("item"===i&&e.isEndTag())return"";var a,n=e.getElement();a=n.ariaLevel?n.ariaLevel:"heading"===n.getAttribute("role")?"2":n.nodeName.substring(1);var r=e.getNameInfo();return r&&!["content","text"].includes(r.nameFrom)||(n.textContent||"").trim()?r&&!["content","text"].includes(r.nameFrom)?"[heading level ".concat(a).concat(d(e),"]"):"[heading level ".concat(a,"]"):""}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["heading","h1","h2","h3","h4","h5","h6"],tests:[function(e){if(e.isStartTag()){var t,i=e.getNode();t=i.ariaLevel?i.ariaLevel:"heading"===i.getAttribute("role")?"2":i.nodeName.substring(1);var a=e.getNameInfo();return a&&!["content","text"].includes(a.nameFrom)||(i.textContent||"").trim()?"[".concat(u(e),"heading level ").concat(t,"]"):""}return""}]}),new n.SRRendererRule({roles:["img"],elems:[],modes:["item","image"],tests:[function(e){var t,i,a;return e.isEndTag()?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""===(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?""===(null===(a=e.getNameInfo())||void 0===a?void 0:a.name)?"":"[graphic".concat(d(e),"]"):e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]"}]}),new n.SRRendererRule({roles:["insertion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[inserted]":""}]}),new n.SRRendererRule({roles:["link"],elems:[],modes:["item","region","link","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&!["content","text"].includes(null===(a=e.getNameInfo())||void 0===a?void 0:a.nameFrom)?p(e,i):null}]}),new n.SRRendererRule({roles:["listitem"],elems:[],modes:["item"],tests:[function(e){for(var t,i,a,n=o.DOMWalker.parentNode(e.getNode());void 0===i&&n;)1===n.nodeType&&((p=n).hasAttribute("role")?"list"===p.getAttribute("role")&&(i=!1,a=p):"UL"===p.nodeName.toUpperCase()?(i=!1,a=p):"OL"===p.nodeName.toUpperCase()&&(i=!0,a=p)),n=o.DOMWalker.parentNode(n);var r=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",l="";if(i){var s=1;if(a&&"OL"===a.nodeName.toUpperCase()&&a.hasAttribute("start")){var u=parseInt(a.getAttribute("start")||"1",10);s=isNaN(u)?1:u}for(var d=e.getElement(),c=o.DOMWalker.previousSiblingNotOwnedBySlot(d);c;){if(1===c.nodeType){var m=c;"listitem"!==m.getAttribute("role")&&"LI"!==m.nodeName.toUpperCase()||s++}c=o.DOMWalker.previousSiblingNotOwnedBySlot(c)}l=e.isStartTag()?"".concat(s,". ").concat(r):""}else{var p;l="LI"===(p=e.getElement()).nodeName.toUpperCase()&&"none"===window.getComputedStyle(p).listStyleType||"LI"!==p.nodeName.toUpperCase()?e.isStartTag()?"".concat(r):"":e.isStartTag()?"[bullet] ".concat(r):""}return l}]}),new n.SRRendererRule({roles:["math"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[math content]":""}]}),new n.SRRendererRule({roles:["menuitem"],elems:[],modes:["item","tab_focus","region"],tests:[function(e){var t="";if(e.isStartTag()){var i="",a=e.getElement();"true"===a.getAttribute("aria-haspopup")&&(i+=", sub-menu"),a.hasAttribute("aria-expanded")&&(i+=", ".concat("true"===a.getAttribute("aria-expanded")?"expanded":"collapsed")),t="[menu".concat(i);var n=e.getNameInfo();n&&!["content","text"].includes(n.nameFrom)&&(t+=d(e)),t+="]"}return t}]}),new n.SRRendererRule({roles:["meter"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["progressbar"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["radio"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a,n=m(e,"radio button");a=e.getElement().hasAttribute("aria-checked")?"true"===e.getElement().getAttribute("aria-checked"):e.getNode().checked;var r=g(e.getElement());return"[".concat(n,", ").concat(a?"checked":"not checked").concat(r).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["searchbox"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[".concat(u(e),"edit]"):""}]}),new n.SRRendererRule({roles:["separator"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[separator]":""}]}),new n.SRRendererRule({roles:["slider"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"slider"),n=e.getElement(),r=n.hasAttribute("aria-valuenow")?n.getAttribute("aria-valuenow"):e.getNode().value;return"[".concat(u(e)).concat(a,", ").concat(r).concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["spinbutton"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"spinbutton");return"[".concat(u(e)).concat(a,", editable").concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["tab"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(!e.isStartTag())return"";var t=m(e,"tab");return"[".concat(t).concat("true"===e.getNode().getAttribute("aria-selected")?", selected":"").concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tablist"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[group start".concat(d(e),"]"):"[group end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tabpanel"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[Tab panel start".concat(d(e),"]"):"[Tab panel end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["item","link","tab_focus","region"],tests:[function(e){var t,i,a,n;if(e.isEndTag()||!(null===(t=e.getParentElement())||void 0===t?void 0:t.getElement()))return null;var r=null===(i=e.getParentElement())||void 0===i?void 0:i.getElement();return"line-through"===r.ownerDocument.defaultView.getComputedStyle(r).textDecorationLine?"[strikethrough] ".concat((null===(a=e.getNameInfo())||void 0===a?void 0:a.name)+""," [end strikethrough]"):"".concat((null===(n=e.getNameInfo())||void 0===n?void 0:n.name)+"")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["heading"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["textbox"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){var a,n=e.getElement();if(e.isEndTag())return"item"===i&&"TEXTAREA"===n.nodeName.toUpperCase()?"[out of edit]":"";if(!e.isStartTag())return"";var r="";n.hasAttribute("placeholder")&&n.getAttribute("placeholder").trim().length>0&&(r+=", placeholder: ".concat(n.getAttribute("placeholder"))),r+=g(n);var l="TEXTAREA"===n.nodeName.toUpperCase()||"true"===n.getAttribute("aria-multiline"),o=h(n,i);if(l){var s="tab_focus"===i?null===(a=n.textContent)||void 0===a?void 0:a.trim():"",d=s?" ".concat(s):"";return"[".concat(u(e),"edit, multiline").concat(r).concat(o,"]").concat(d)}return"[".concat(u(e),"edit").concat(r).concat(o,"]")}]}),new n.SRRendererRule({roles:["treeitem"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=e.getElement(),i="[treeview item";"true"===t.getAttribute("aria-selected")&&(i+=", selected"),t.hasAttribute("aria-expanded")&&(i+="true"===t.getAttribute("aria-expanded")?", expanded":", collapsed");var a=t.getAttribute("aria-level");if(a)i+=", level ".concat(a);else{for(var n=1,l=o.DOMWalker.parentElement(t);l;){var s=r.AriaUtil.getResolvedRole(l);if("group"===s||"tree"===s)for(var u=o.DOMWalker.parentElement(l);u;){var d=r.AriaUtil.getResolvedRole(u);if("treeitem"===d){n++;break}if("tree"===d)break;u=o.DOMWalker.parentElement(u)}l=o.DOMWalker.parentElement(l)}n>1&&(i+=", level ".concat(n))}var c=t.getAttribute("aria-posinset"),m=t.getAttribute("aria-setsize");if(!c||!m){var p=0,h=0,g=o.DOMWalker.parentElement(t);if(g)for(var b=o.DOMWalker.firstChildNotOwnedBySlot(g);b;){if(1===b.nodeType){var _=b;"treeitem"===r.AriaUtil.getResolvedRole(_)&&(h++,_===t&&(p=h))}b=b.nextSibling}c=p.toString(),m=h.toString()}return i+", ".concat(c," of ").concat(m,"] ")}]}),new n.SRRendererRule({roles:[],elems:["PRE"],modes:["item"],tests:[function(e){var t,i;if(e.isEndTag())return"";if(void 0===e.preLineIndex)return null;for(var a=(null!==(t=e.getNode().textContent)&&void 0!==t?t:"").split("\n"),n=0;n<a.length&&""===a[n].trim();)n++;for(var r=a.length-1;r>=n&&""===a[r].trim();)r--;return null!==(i=a.slice(n,r+1)[e.preLineIndex])&&void 0!==i?i:""}]}),new n.SRRendererRule({roles:[],elems:["BODY"],modes:["item","tab_focus"],tests:[function(e){if(e.getNode().ownerDocument!==document)return"";var t=e.getNode().ownerDocument.title;return e.isEndTag()?"[End of document".concat(t.trim().length>0?": "+t.trim():"","]"):"[Start of document".concat(t.trim().length>0?": "+t.trim():"","]")}]}),new n.SRRendererRule({roles:[],elems:["IFRAME"],modes:["tab_focus"],tests:[function(e){if(e.isEndTag())return null;var t=e.getElement().getAttribute("role"),i="none"===t||"presentation"===t;if(i&&!e.getName())return null;var a=i?"grouping":"frame";return"[".concat(u(e)).concat(a,"]")}]}),new n.SRRendererRule({roles:[],elems:["BR"],modes:["item"],tests:[function(e){try{for(var t=e.clone();t.previous(function(){return!0})&&"BR"!==t.getNode().nodeName.toUpperCase()&&t.getNameInfo()&&0===t.getNameInfo().name.trim().length;);return"BR"===t.getNode().nodeName.toUpperCase()?"[blank]":null}catch(e){console.error(e)}}]}),new n.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:[],elems:["INPUT"],modes:["item","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&"password"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))&&"[".concat(u(e),"edit, protected").concat(h(e.getElement(),i),"]")||null},function(e,t,i){var a,n;if(e.isStartTag()&&"file"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var r=(null===(n=e.getElement())||void 0===n?void 0:n.value)||"";return r=""===r?"No file chosen":r.substring(12),"[".concat(u(e),"button").concat(h(e.getElement(),i),"] [").concat(u(e)).concat(r,"]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"color"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r=(100*Number("0x".concat(n.substring(1,3)))/Number("0xff")).toFixed(0),l=(100*Number("0x".concat(n.substring(3,5)))/Number("0xff")).toFixed(0),o=(100*Number("0x".concat(n.substring(5)))/Number("0xff")).toFixed(0);return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [").concat(r,"% red ").concat(l,"% green ").concat(o,"% blue]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"month"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0";if(n.trim().length>0){var o=new Date(n);r=""+o.getFullYear(),l=""+(o.getMonth()+1)}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"] [spin button, ").concat(r,"] [menu button] [subMenu] Show month picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"date"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0",o="0";if(n.trim().length>0){var s=new Date(n);r=""+s.getFullYear(),l=""+(s.getMonth()+1),o=""+s.getDate()}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"] / [spin button, ").concat(o,"] / [spin button, ").concat(r,"] [menu button] [subMenu] Show date picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"datetime-local"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0",o="0",s="0",d="0",c="0";if(n.trim().length>0){var m=new Date(n);r=""+m.getFullYear(),l=""+(m.getMonth()+1),o=""+m.getDate(),s=0===m.getHours()||12===m.getHours()?"12":m.getHours()<12?""+m.getHours():""+(m.getHours()-12),d=""+m.getMinutes(),c=m.getHours()>=12?"pm":"am"}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"] / [spin button, ").concat(o,"] / [spin button, ").concat(r,"] [spin button, ").concat(s,"] : [spin button, ").concat(d,"] [spin button, ").concat(c,"] [menu button] [subMenu] Show local date and time picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"time"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0",o="0";if(n.trim().length>0){var s=n.split(":"),d=parseInt(s[0]);r=0===d||12===d?"12":d<12?""+d:""+(d-12),l=s[1],o=d>=12?"pm":"am"}return"[".concat(u(e),"grouping clickable").concat(h(e.getElement(),i)," [spin button, ").concat(r,"] : [spin button, ").concat(l,"] [spin button, ").concat(o,"] [menu button] [subMenu] Show time picker [out of grouping]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"week"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0";if(n.trim().length>0){var o=n.split(/-W/);r=o[0],l=o[1]}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"], [spin button, ").concat(r,"] [menu button] [subMenu] Show week picker")}return null},function(e){var t;return"hidden"===(null===(t=e.getElement())||void 0===t?void 0:t.getAttribute("type"))?"":null},function(e){return e.isStartTag()&&"!![".concat(u(e),"input!!]").concat(e.getElement().outerHTML)||null}]}),new n.SRRendererRule({roles:[],elems:["LI"],modes:["item"],tests:[function(e){var t,i=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",a=e.getElement();return"none"===window.getComputedStyle(a).listStyleType?e.isStartTag()?"".concat(i):"":e.isStartTag()?"[bullet] ".concat(i):""}]}),new n.SRRendererRule({roles:[],elems:["MFRAC"],modes:["item"],tests:[function(e){return e.isStartTag()?"[fraction]":"[end fraction]"}]}),new n.SRRendererRule({roles:[],elems:["MROW"],modes:["item"],tests:[function(e){var t;if(!e.isStartTag()){var i=e.getCurrentOrParentByRoleClone([],["mfrac"]);return i&&(null===(t=i.getElement().querySelectorAll("mrow")[0])||void 0===t?void 0:t.isSameNode(e.getNode()))?"[over]":void 0}}]}),new n.SRRendererRule({roles:[],elems:["MSQRT"],modes:["item"],tests:[function(e){return e.isStartTag()?"[square root]":"[end root]"}]}),new n.SRRendererRule({roles:[],elems:["MSUP"],modes:["item"],tests:[function(e){var t,i;if(!e.isEndTag()){var a=(null===(t=e.getElement().querySelector("mi"))||void 0===t?void 0:t.innerHTML)||"",n=(null===(i=e.getElement().querySelector("mn"))||void 0===i?void 0:i.innerHTML)||"";return"2"===n?"".concat(a," [squared]"):"3"===n?"".concat(a," [cubed]"):"".concat(a," [to the ").concat(n,"]")}}]}),new n.SRRendererRule({roles:[],elems:["SUMMARY"],modes:["item","button","tab_focus"],tests:[function(e,t,i){var a,n;if(e.isEndTag())return"";var r=e.getElement();if(!r)return null;var l=r.parentElement;if(!l||"DETAILS"!==l.nodeName.toUpperCase())return null;var o=Array.from(l.children).find(function(e){return"SUMMARY"===e.nodeName.toUpperCase()});if(!o||!o.isSameNode(r))return null;var s=l.hasAttribute("open")?"expanded":"collapsed",u=null===(a=r.getAttribute("aria-label"))||void 0===a?void 0:a.trim(),d=(null===(n=r.textContent)||void 0===n?void 0:n.trim())||"",c=u||d,m=c?'"'.concat(c,'", '):"",p=h(r,i);return!p&&u&&d&&(p="item"===i?", ".concat(d,""):', "'.concat(d,'"')),"[".concat(m,"button, ").concat(s).concat(p,"]")}]}),new n.SRRendererRule({roles:["article","banner","blockquote","caption","cell","code","columnheader","complementary","contentinfo","figure","form","group","list","main","mark","navigation","region","row","rowheader","search","table","toolbar"],elems:[],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["paragraph","rowgroup","status","strong","subscript","superscript","term","time","none","presentation"],elems:[],modes:["item"],tests:[function(e){return""}]})]},8485(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(369),r=i(7242),l=i(7011),o=i(9910),s=i(7139);function u(e,t){var i;t&&"#text"===(null===(i=t.getNode())||void 0===i?void 0:i.nodeName)&&(t=t.clone()).previous(function(){return!0});var a=n.SRTableUtil.getTableModel(e),r=n.SRTableUtil.getCellModel(t,a),l=n.SRTableUtil.getCellModel(e,a);if(!l)return"";var o=[];if(!r||r.rowIndexStart!==l.rowIndexStart||r.rowspan!==l.rowspan){var s=n.SRTableUtil.getRowHeadersForCursor(e,a),u=s&&s.trim().length>0?'"'.concat(s,'", '):"";o.push("[".concat(u,"row ").concat(l.rowIndexStart+1).concat(l.rowspan>1?" through "+(l.rowIndexStart+l.rowspan):"","]"))}if(!r||r.colIndexStart!==l.colIndexStart||r.colspan!==l.colspan){var d=n.SRTableUtil.getColumnHeadersForCursor(e,a);u=d&&d.trim().length>0?'"'.concat(d,'", '):"",o.push("[".concat(u,"column ").concat(l.colIndexStart+1).concat(l.colspan>1?" through "+(l.colIndexStart+l.colspan):"","]"))}return o.join(" ")}t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item","article","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"article");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"banner region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item","region"],tests:[function(e){return"[blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item","region"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:["cell"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["columnheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"complementary region]"):null}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"content info region]"):null}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[section]":"[".concat((0,r.quoteNamePadAfter)(e),"form region]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item","region"],tests:[function(e){var t;if("DETAILS"===e.getNode().nodeName.toUpperCase()){var i=e.getElement();return Array.from(i.children).some(function(e){return"SUMMARY"===e.nodeName.toUpperCase()})?"":'["Details", button, '.concat(i.hasAttribute("open")?"expanded":"collapsed","]")}return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"[grouping".concat((0,r.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["tab_focus"],tests:[function(e){var t;if("DETAILS"===e.getNode().nodeName.toUpperCase()){var i=e.getElement();return Array.from(i.children).some(function(e){return"SUMMARY"===e.nodeName.toUpperCase()})?null:'["Details", button, '.concat(i.hasAttribute("open")?"expanded":"collapsed","]")}return null===e.getNameInfo()?null:(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t||t.getNode().nodeName.toUpperCase(),"")}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item","list"],tests:[function(e){for(var t,i=e.getNode(),a=document.evaluate(".//li | .//*[@role='listitem']",i,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),n=0,s=0;s<a.snapshotLength;s++){for(var u=!1,d=!1,c=a.snapshotItem(s).parentElement;c&&c!==i;){var m=l.AriaUtil.getResolvedRole(c);if("list"===m||"UL"===c.nodeName.toUpperCase()||"OL"===c.nodeName.toUpperCase()){u=!0;break}if(m&&(null===(t=o.ARIADefinitions.designPatterns[m])||void 0===t?void 0:t.presentationalChildren)){d=!0;break}c=c.parentElement}u||d||n++}return 0===n?null:"[".concat((0,r.quoteNamePadAfter)(e),"list of ").concat(n," items]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"main region]"):null}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);console.log("MENUBAR",e.isEndTag()?"/":"",e.getNode()),console.log(i,a);var n=i.snapshotLength-a.snapshotLength;return 0===n?null:"[".concat((0,r.quoteNamePadAfter)(e),"menubar with ").concat(n," items]")}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"navigation region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return null===e.getNameInfo()?null:"[grouping".concat((0,r.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if(null===e.getNameInfo())return null;if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["row"],elems:[],modes:["item","table"],tests:[function(){return""}]}),new a.SRRendererRule({roles:["rowheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"search region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item","table"],tests:[function(e){for(var t=e.clone();"table"!==t.getRole()&&t.previous(function(){return!0}););var i=t.getNode(),a=0,n=0;if(t.getNode().firstChild)for(var l=!1;t.next(function(){return!0})&&!t.getNode().isSameNode(i);){var o=t.getRole();if(t.isStartTag()){if("row"===o)++a;else if(!l&&["cell","rowheader","columnheader"].includes(o)){var s=t.getNode();n+=parseInt(s.getAttribute("colspan")||"1")}}else"row"===o&&(l=!0)}return"[table with ".concat(a," ").concat(1===a?"row":"rows"," and ").concat(n," ").concat(1===n?"column":"columns").concat((0,r.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"toolbar]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//dt",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotLength;return"[".concat((0,r.quoteNamePadAfter)(e),"definition list of ").concat(i," terms]")}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[highlighted]"}]}),new a.SRRendererRule({roles:[],elems:["IFRAME"],modes:["item"],tests:[function(e){var t=e.getElement().getAttribute("role"),i="none"===t||"presentation"===t;if(i&&!e.getName())return null;var a=i?"grouping":"frame";return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:[],elems:["PRE"],modes:["item"],tests:[function(e){return"[".concat((0,r.quoteNamePadAfter)(e),"preformatted text]")}]}),new a.SRRendererRule({roles:["article","banner","blockquote","caption","cell","columnheader","complementary","contentinfo","figure","form","group","region","row","rowheader","search","toolbar","list","main","navigation","table"],elems:[],modes:["heading"],tests:[function(){return""}]})]},2099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(7242);t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"article");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"banner region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item"],tests:[function(e){return"[out of blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"complementary region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"content info region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[out of figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[out of section]":"[out of form]"}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item"],tests:[function(e){var t;return"DETAILS"===e.getNode().nodeName.toUpperCase()?"":null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"[out of grouping]"}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//li | .//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);return 0===i.snapshotLength-a.snapshotLength?null:"[".concat((0,n.quoteNamePadAfter)(e),"out of list]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"main region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){return"[out of menubar]"}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"navigation region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return"[out of grouping]"}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item"],tests:[function(e){if(null===e.getNameInfo())return null;var t=(0,n.getRoleDescription)(e,"region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"search region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item"],tests:[function(e){return"[out of table]"}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item"],tests:[function(e){return"[out of toolbar]"}]}),new a.SRRendererRule({roles:[],elems:["ABBR"],modes:["item"],tests:[function(e){return e.getElement().hasAttribute("title")?"[".concat(e.getElement().getAttribute("title"),"]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return"[out of definition list]"}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[out of highlighted]"}]}),new a.SRRendererRule({roles:[],elems:["IFRAME"],modes:["item"],tests:[function(e){var t=e.getElement().getAttribute("role"),i="none"===t||"presentation"===t;return i&&!e.getName()?null:i?"[out of grouping]":"[out of frame]"}]}),new a.SRRendererRule({roles:[],elems:["PRE"],modes:["item"],tests:[function(e){return"[out of preformatted text]"}]}),new a.SRRendererRule({roles:["group","article","banner","blockquote","caption","complementary","contentinfo","figure","form","list","region","main","navigation","search","table","toolbar"],elems:[],modes:["region","heading"],tests:[function(){return""}]})]},2151(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CONTAINER_EXIT_RULES=t.CONTAINER_ENTER_RULES=t.SR_RULES=void 0;var a=i(7242),n=i(8485),r=i(2099);t.SR_RULES=a.RULES,t.CONTAINER_ENTER_RULES=n.RULES,t.CONTAINER_EXIT_RULES=r.RULES},1950(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.AccNameUtil=void 0;var a=i(9910),n=i(7139),r=i(7011),l=i(3946),o=i(4566),s=i(3864),u=i(1686),d=function(){function e(){}return e.computeAccessibleNameForSVGElementW3C=function(e){if(!e||"svg"!==e.nodeName.toLowerCase())return null;var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a="",o=e.querySelectorAll("text, textPath, tspan");if(o&&o.length>0&&(o.forEach(function(e){if(!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(a+=" "+t.trim())}}),""!==a.trim()))return{name:n.CommonUtil.truncateText(a.trim()),nameFrom:"svgText"};for(var s=e.querySelectorAll("a"),u=0;u<s.length;u++){var d=s[u];if(!l.VisUtil.isNodeHiddenFromAT(d)&&!l.VisUtil.isNodePresentational(d)){var c=d.getAttribute("xlink:title");if(c&&""!==c.trim())return{name:n.CommonUtil.truncateText(c),nameFrom:"svglinkTitle"}}}var m=r.AriaUtil.getAriaDescription(e);if(m&&""!==m.trim())return{name:n.CommonUtil.truncateText(m),nameFrom:"aria-description"};var p=e.querySelectorAll(":scope > desc");if(p&&p.length>0){var h="";if(p.forEach(function(e){if(!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(h+=" "+t.trim())}}),""!==h.trim())return{name:h.trim(),nameFrom:"svgDesc"}}if(e.hasAttribute("title")){var g=e.getAttribute("title");if(g&&""!==g.trim())return{name:n.CommonUtil.truncateText(g),nameFrom:"title"}}return null},e.computeAccessibleName=function(t){if(!t)return null;var i=t.nodeName.toLowerCase(),l=o.CacheUtil.getCache(t,"ELEMENT_ACCESSBLE_NAME",void 0);if(void 0!==l)return l;var s=r.AriaUtil.getAriaLabel(t);if(s&&""!==s.trim())return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"}),{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"};if(l=e.computeAccessibleNameForNativeElement(t))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",l),l;var u=r.AriaUtil.getResolvedRole(t);if(a.ARIADefinitions.designPatterns[u]&&a.ARIADefinitions.designPatterns[u].nameFrom.includes("contents")&&(l=e.computeAccessibleNameFromContent(t)))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",l),l;if(t.hasAttribute("title")){var d=t.getAttribute("title").trim();if(d&&d.trim().length>0)return d=n.CommonUtil.truncateText(d),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:d,nameFrom:"title"}),{name:d,nameFrom:"title"}}if("textarea"===i||"input"===i&&(!t.hasAttribute("type")||n.CommonUtil.input_type_with_placeholder.includes(t.getAttribute("type")))){var c=t.getAttribute("placeholder");if(c&&c.trim().length>0)return c=n.CommonUtil.truncateText(c),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:c,nameFrom:"placeholder"}),{name:c,nameFrom:"placeholder"}}return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",null),null},e.computeAccessibleNameForNativeElement=function(t){var i,a,r=t.nodeName.toLowerCase();if(n.CommonUtil.form_labelable_elements.includes(r)&&(p=n.CommonUtil.getFormFieldLabel(t))&&""!==p.trim())return{name:n.CommonUtil.truncateText(p),nameFrom:"label"};if("input"===r&&t.hasAttribute("type"))if(n.CommonUtil.form_button_types.includes(t.getAttribute("type"))){var o=n.CommonUtil.getElementAttribute(t,"value");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"value"};var s=t.getAttribute("type");if("submit"===s||"reset"===s)return{name:s,nameFrom:"internal"}}else if("image"===t.getAttribute("type")&&(b=n.CommonUtil.getElementAttribute(t,"alt"))&&""!==b.trim())return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("button"===r){if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var d=t.querySelector("img");if(d&&!l.VisUtil.isNodeHiddenFromAT(d)&&!l.VisUtil.isNodePresentational(d)&&(a=e.computeAccessibleName(d))&&a.name&&a.name.trim().length>0)return a;var c=t.querySelector("svg");if(c&&!l.VisUtil.isNodeHiddenFromAT(c)&&!l.VisUtil.isNodePresentational(c)&&(a=e.computeAccessibleName(c))&&a.name&&a.name.trim().length>0)return a}if("fieldset"===r&&(i=t.firstElementChild)&&"legend"===i.nodeName.toLowerCase()&&(v=i.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("output"===r&&t.hasAttribute("for")){var m=t.getAttribute("for").trim().split(" ");if(m&&m.length>0){for(var p="",h=0;h<m.length;h++){var g=t.ownerDocument.getElementById(m[h]);!g||u.DOMUtil.sameNode(g,t)||l.VisUtil.isNodeHiddenFromAT(g)||l.VisUtil.isNodePresentational(g)||(a=e.computeAccessibleName(g))&&a.name&&a.name.trim().length>0&&(p+=" "+n.CommonUtil.normalizeSpacing(a.name))}if(p.trim().length>0)return{name:n.CommonUtil.truncateText(p),nameFrom:"label"}}}if("summary"===r&&(v=t.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("details"===r)return(i=t.firstElementChild)&&"summary"===i.nodeName.toLowerCase()&&(a=e.computeAccessibleName(i))&&a.name&&a.name.trim().length>0?{name:n.CommonUtil.truncateText(a.name.trim()),nameFrom:"summary"}:{name:"details",nameFrom:"internal"};if("figure"===r&&(_=n.CommonUtil.getChildByTagHidden(t,"figcaption",!0,!1))&&_.length>0&&(v=_[0].innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"figcaption"};if("img"===r&&t.hasAttribute("alt")){var b=t.getAttribute("alt");return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"}}if("area"===r&&t.hasAttribute("alt")&&(b=t.getAttribute("alt"))&&b.trim().length>0)return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("table"===r){var _,f=t.firstElementChild;if(f&&"caption"===f.nodeName.toLowerCase()&&(_=f.innerText)&&_.trim().length>0)return{name:n.CommonUtil.truncateText(_),nameFrom:"caption"}}if("a"===r){var v;if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var A=t.querySelectorAll(":scope > img, :scope > svg");if(A&&A.length>0){var w="";if(A.forEach(function(t){if(!l.VisUtil.isNodeHiddenFromAT(t)&&!l.VisUtil.isNodePresentational(t)){var i=e.computeAccessibleName(t);i&&i.name&&i.name.trim().length>0&&(w+=" "+i.name.trim())}}),""!==w.trim())return{name:w.trim(),nameFrom:"alt"}}}return("optgroup"===r||"option"===r||"track"===r)&&(p=t.getAttribute("label"))&&p.trim().length>0?{name:n.CommonUtil.truncateText(p),nameFrom:"label"}:"svg"===r&&(a=e.computeAccessibleNameForSVGElementW3C(t))&&a.name&&a.name.trim().length>0?a:null},e.computeAccessibleNameForSVGElement=function(e){var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a=e.querySelector("a");if(a&&!l.VisUtil.isNodeHiddenFromAT(a)&&!l.VisUtil.isNodePresentational(a)){var o=a.getAttribute("xlink:title");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"svglinkTitle"}}var s="";if(e.querySelectorAll(":scope > *").forEach(function(e){if("svg"!==e.nodeName.toLowerCase()&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=n.CommonUtil.getInnerText(e);t&&t.trim().length>0&&(s+=t)}}),""!==s.trim())return{name:n.CommonUtil.truncateText(s),nameFrom:"svgText"};var u=r.AriaUtil.getAriaDescription(e);if(u&&u.trim().length>0)return{name:n.CommonUtil.truncateText(u),nameFrom:"aria-description"};var d=e.querySelectorAll(":scope > desc");if(d&&d.length>0){var c="";if(d.forEach(function(e){if(e&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(c+=t.trim())}}),c&&""!==c.trim())return{name:c.trim(),nameFrom:"svgDesc"}}},e.computeAccessibleNameFromContent=function(t){var i=t.nodeName.toLowerCase(),a=(r.AriaUtil.getResolvedRole(t),e.computeAccessibleNameForCSSPseudoElement(t,"before"));return null!==a&&a.name&&a.name.trim().length>0||(a=e.computeAccessibleNameForCSSPseudoElement(t,"after"))&&a.name&&a.name.trim().length>0?a:t.shadowRoot&&(a=e.computeAccessibleNameForShadowHost(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"shadow"}:"slot"===i&&(a=e.computeAccessibleNameForSlotElement(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"slot"}:(a=e.computeAccessibleNameFromChildren(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"content"}:null},e.computeAccessibleNameForCSSPseudoElement=function(e,t){var i=e.ownerDocument.defaultView.getComputedStyle(e,t);if(i){var a=i.content;if(a&&"none"!==a&&"no"!==a&&"normal"!==a&&(a=a.replace(/^"/,"").replace(/"$/,"")).trim().length>0)return{name:n.CommonUtil.truncateText(a),nameFrom:"css-"+t}}return null},e.computeAccessibleNameForShadowHost=function(t){var i="",a=t.shadowRoot;return a&&a.querySelectorAll("*").forEach(function(t){var a=e.computeAccessibleName(t);a&&a.name&&a.name.trim().length>0&&(i+=" "+a.name.trim())}),i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"shadow-host"}:null},e.computeAccessibleNameForSlotElement=function(t){var i="";if(t.assignedNodes()&&0!==t.assignedNodes().length)for(var a=0,r=t.assignedNodes();a<r.length;a++){var l,o=r[a];(l=e.computeAccessibleName(o))&&l.name&&l.name.length>0&&(i+=" "+l.name.trim())}else(l=e.computeAccessibleName(t))&&l.name&&l.name.trim().length>0&&(i+=" "+l.name.trim());return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content-slot"}:null},e.computeAccessibleNameFromChildren=function(t){for(var i="",a=new s.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){var o=a.node;if(3===o.nodeType){var u=o.parentElement;!l.VisUtil.isNodeHiddenFromAT(u)&&!l.VisUtil.isNodePresentational(u)&&o.nodeValue&&o.nodeValue.trim().length>0&&(i+=" "+o.nodeValue.trim())}else if(1===o.nodeType&&!l.VisUtil.isNodeHiddenFromAT(o)&&!l.VisUtil.isNodePresentational(o)){var d=e.computeAccessibleName(o);d&&d.name&&d.name.length>0?(i+=" "+d.name.trim(),a.bEndTag=!0):r.AriaUtil.containsPresentationalChildrenOnly(a.node)&&(a.bEndTag=!0)}}return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content"}:null},e.isAccessibleNameIgnorable=function(e){if(!e)return!1;var t=e.nodeName.toLowerCase();if("img"!==t&&"svg"!==t)return!1;var i=e.parentElement;return!(!i||!r.AriaUtil.isWidget(i)&&!r.AriaUtil.containsPresentationalChildrenOnly(i)||!r.AriaUtil.hasAriaLabel(i))},e}();t.AccNameUtil=d},7011(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,r=t.length;n<r;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.AriaUtil=void 0;var n=i(4566),r=i(9910),l=i(9955),o=i(3864),s=i(3946),u=i(7139),d=i(1950),c=i(5279),m=i(1686),p=function(){function e(){}return e.isDefinedAriaAttributeAtIndex=function(t,i){var a=t.attributes[i].name;return e.isDefinedAriaAttribute(t,a)},e.getUserDefinedAriaAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)&&t.push(n)}return t},e.getUserDefinedHtmlAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)||t.push(n)}return t},e.getUserDefinedAriaAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),r=e.getAttribute(n);""===r&&(r=null),"aria-"===n.substring(0,5)&&t.push({name:n,value:r})}return t},e.getUserDefinedHtmlAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),r=e.getAttribute(n);""===r&&(r=null),"aria-"===n.substring(0,5)||t.push({name:n,value:r})}return t},e.getAriaAttribute=function(t,i){var a=t.getAttribute(i);if(t.hasAttribute(i)&&""===a.trim())return a;if(!a){var n=t.nodeName.toLowerCase();i in e.ariaAttributeImplicitMappings&&(n in e.ariaAttributeImplicitMappings[i]?"function"==typeof(a=e.ariaAttributeImplicitMappings[i][n])&&(a=a(t)):"*"in e.ariaAttributeImplicitMappings[i]&&"function"==typeof(a=e.ariaAttributeImplicitMappings[i]["*"])&&(a=a(t)))}if(!a){var r=l.ARIAMapper.nodeToRole(t);r in e.ariaAttributeRoleDefaults&&i in e.ariaAttributeRoleDefaults[r]&&"function"==typeof(a=e.ariaAttributeRoleDefaults[r][i])&&(a=a(t))}return!a&&i in e.ariaAttributeGlobalDefaults&&(a=e.ariaAttributeGlobalDefaults[i]),a},e.isDefinedAriaAttribute=function(e,t){var i=!1;return"aria-"===t.substring(0,5)&&(i=e.hasAttribute&&e.hasAttribute(t)&&e.getAttribute(t).length>0),i},e.getResolvedRole=function(t,i){if(void 0===i&&(i=!0),!t)return null;var a=n.CacheUtil.getCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",null);if(null===a){var r=e.getUserDefinedRoles(t),l=e.getElementAriaProperty(t),o=e.getAllowedAriaRoles(t,l),s=!1;if(r&&r.length>0&&o&&o.length>0){for(var d=0;d<r.length;d++)if(o.includes("any")||o.includes(r[d])){if(o.includes("any")&&"generic"===r[d]){s=!0;continue}if(("presentation"===(a=r[d])||"none"===a)&&u.CommonUtil.isFocusable(t)){a=null;continue}break}s&&(a="generic")}if(null===a&&i){var c=e.getImplicitRole(t);a=c&&c.length>0?c[0]:void 0}n.CacheUtil.setCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",a)}return void 0!==a?a:null},e.getUserDefinedRoles=function(t){return e.getRoles(t,!1)},e.getRoles=function(t,i){var a=[];if(t&&t.hasAttribute&&t.hasAttribute("role"))for(var n=u.CommonUtil.normalizeSpacing(t.getAttribute("role").trim()).split(" "),r=0;r<n.length;++r)a.push(n[r]);if(i){var l=e.getImplicitRole(t);null!==l&&l.length>0&&u.CommonUtil.concatUniqueArrayItemList(l,a)}return a},e.getImplicitRole=function(t){if(!t||1!==t.nodeType)return null;var i=n.CacheUtil.getCache(t,"AriaUtil_ImplicitRole",null);if(!i){var a=e.getElementAriaProperty(t);if(a&&a.implicitRole){if(a.implicitRole.includes("generic")){var l=e.getUserDefinedAriaAttributes(t);if(0===l.length)return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[];var o=[],s=r.ARIADefinitions.designPatterns.generic;if(s.reqProps&&s.reqProps.length>0&&u.CommonUtil.concatUniqueArrayItemList(s.reqProps,o),a.globalAriaAttributesValid&&u.CommonUtil.concatUniqueArrayItemList(r.ARIADefinitions.globalProperties,o),s.deprecatedProps&&s.deprecatedProps.length>0&&u.CommonUtil.reduceArrayItemList(s.deprecatedProps,o),o.length>0&&!o.some(function(e){return l.includes(e)})){var d=u.CommonUtil.reduceArrayItemList(["generic"],a.implicitRole);return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",d),d}}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",a.implicitRole),a.implicitRole}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[]}return i},e.getRoleRequiredProperties=function(e,t){if(null===e)return null;if(r.ARIADefinitions.designPatterns[e]){var i=r.ARIADefinitions.designPatterns[e].reqProps;return"separator"===e.toLowerCase()&&t&&u.CommonUtil.isFocusable(t)&&(i=u.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"],i||[])),i}return null},e.hasRole=function(t,i,a){var n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var r=t.getAttribute("role").trim().split(" "),l=0;!n&&l<r.length;++l)n=r[l]in i;else for(r=t.getAttribute("role").trim().split(" "),l=0;!n&&l<r.length;++l)n=r[l]===i;if(!n&&a){var o=[],s=e.getImplicitRole(t);if(null!==s&&s.length>0)if(u.CommonUtil.concatUniqueArrayItemList(s,o),"string"!=typeof i)for(l=0;!n&&l<o.length;++l)n=o[l]in i;else for(l=0;!n&&l<o.length;++l)n=o[l]===i}return n},e.hasRoleInSemantics=function(t,i){var a=!1,n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var r=t.getAttribute("role").trim().toLowerCase().split(/\s+/),l=0;!a&&l<r.length;++l)n=!0,a=r[l]in i;else for(r=t.getAttribute("role").trim().toLowerCase().split(/\s+/),l=0;!a&&l<r.length;++l)n=!0,a=r[l]===i;if(n)return a;var o=e.getImplicitRole(t);if(null!==o&&o.length>0)if("string"!=typeof i)for(l=0;!a&&l<o.length;++l)a=o[l]in i;else for(l=0;!a&&l<o.length;++l)a=o[l]===i;return a},e.hasAnyRole=function(t,i){var a=!1;if(t&&t.hasAttribute&&t.hasAttribute("role")&&(a=!0),!a&&i){var n=e.getImplicitRole(t);null!==n&&n.length>0&&(a=!0)}return a},e.isPresentationalElement=function(e){return u.CommonUtil.valInArray(e.nodeName.toLowerCase(),["abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","a","progress","meter","basefont","big","center","strike","tt","font","blink","h1","h2","h3","h4","h5","h6","hr","blockquote","p"])},e.getAncestorWithRole=function(t,i,a){for(var n=o.DOMWalker.parentNode(t);null!==n;){if(a){if(e.hasRoleInSemantics(n,i))break}else if(e.hasRole(n,i,!1))break;n=o.DOMWalker.parentNode(n)}return n},e.getAncestorWithRoles=function(t,i){if(!t||!i||!i.length||0===i.length)return null;for(var a=t;null!==a;){var n=e.getResolvedRole(a);if(null!==n&&(i.includes(n)||i.includes("*")&&!["presentation","none"].includes(n)))return a;a=o.DOMWalker.parentNode(a)}return null},e.getRolesWithTypes=function(e,t){if(!e||!t||!t.length||0===t.length)return null;var i=n.CacheUtil.getCache(e.ownerDocument,"roles_with_given_types",null);return i&&0!==i.length||(i=[],Object.entries(r.ARIADefinitions.designPatterns).forEach(function(e){var a=e[0],n=e[1];t.includes(n.roleType)&&i.push(a)}),n.CacheUtil.setCache(e.ownerDocument,"roles_with_given_types",i)),i},e.isWidget=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"is_element_widget",null);if(null===i){var a=!1,l=e.getResolvedRole(t);return l&&r.ARIADefinitions.designPatterns[l]&&"widget"===r.ARIADefinitions.designPatterns[l].roleType&&(a=!0),n.CacheUtil.setCache(t.ownerDocument,"is_element_widget",a),a}return i},e.isNavigationOwnedOrControlled=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",null);if(null!==i&&i.length>0&&u.CommonUtil.getAncestor(t,i))return!0;var a=e.getResolvedRole(t);if(!a)return!1;var r=t.getAttribute("id");return!(!r||0===r.trim().length)&&(!!t.ownerDocument.querySelector("*[aria-controls~='".concat(r,"'], *[aria-owns~='").concat(r,"']"))&&(!!["combobox","scrollbar","button","tab","listbox","menu","menubar","radiogroup","tree","treegrid"].includes(a)&&(null===i&&(i=[]),i.push(t),n.CacheUtil.setCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",i),!0)))},e.getSiblingWithRole=function(t,i){return e.getSiblingWithRoleHidden(t,i,!1)},e.getSiblingWithRoleHidden=function(t,i,a,n){var r=null,l=!1;if(t&&i){for(r=t.nextSibling;null!==r&&!l;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(r)||(l=n?e.hasRoleInSemantics(r,i):e.hasRole(r,i,!1)),r=r.nextSibling;if(!r)for(r=t.previousSibling;null!==r&&!l;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(r)||(l=e.hasRole(r,i,n)),r=r.previousSibling}return r},e.getDescendantWithRole=function(t,i){return e.getDescendantWithRoleHidden(t,i,!1)},e.getDescendantWithRoleHidden=function(t,i,a,n){for(var r=null,l=new o.DOMWalker(t);l.nextNode()&&l.node!=t&&l.node!=t.nextSibling;)if((!a||!u.CommonUtil.shouldNodeBeSkippedHidden(l.node))&&(n?e.hasRoleInSemantics(l.node,i):e.hasRole(l.node,i,!1))){r=l.node;break}return r},e.getAllDescendantsWithRoles=function(t,i,a,n){if(i&&0!==i.length){var r=[];return i.forEach(function(i){var l=e.getAllDescendantsWithRoleHidden(t,i,a,n);l&&l.length>0&&(r=r.concat(l))}),r}},e.getAllDescendantsWithRoleHidden=function(t,i,a,n){for(var r=[],l=new o.DOMWalker(t);l.nextNode()&&l.node!=t&&l.node!=t.nextSibling;)l.bEndTag||a&&u.CommonUtil.shouldNodeBeSkippedHidden(l.node)||e.hasRole(l.node,i,n)&&r.push(l.node);return r},e.getDirectATChildren=function(t){var i=e.getRequiredChildRoles(t,!0),a=[];return e.retrieveDirectATChildren(t,i,a),a},e.retrieveDirectATChildren=function(t,i,a){var n=[];if(null!==t.children&&t.children.length>0)for(var r=0;r<t.children.length;r++)n.push(t.children[r]);var l=t.getAttribute("aria-owns");if(l){var o=t.ownerDocument;if(o){var u=l.split(" ");for(r=0;r<u.length;r++){var d=o.getElementById(u[r]);d&&n.push(d)}}}if(n.length>0){for(r=0;r<n.length;r++)if(!s.VisUtil.isNodeHiddenFromAT(n[r])&&s.VisUtil.isNodeVisible(n[r])){var c=e.getRoles(n[r],!1);null!==c&&0!==c.length||(c=e.getImplicitRole(n[r])),c&&null!==c&&c.length>0&&(c=c.filter(function(e){return"none"!==e&&"presentation"!==e})).includes("group")&&i&&i.includes("group")&&(c=c.filter(function(e){return"group"!==e})),c&&null!==c&&c.length>0?a.push(n[r]):e.retrieveDirectATChildren(n[r],i,a)}return null}return null},e.getRequiredChildRoles=function(t,i){var a=e.getRoles(t,!1);if(a&&0!==a.length||!i||(a=e.getImplicitRole(t)),!a||0===a.length)return null;var n=["none","presentation"];if(a.some(function(e){return n.includes(e)}))return null;for(var l=r.ARIADefinitions.designPatterns,o=new Array,s=0;s<a.length;++s)l[a[s]]&&null!==l[a[s]].reqChildren&&(o=u.CommonUtil.concatUniqueArrayItemList(l[a[s]].reqChildren,o));return o},e.getAriaOwnsWithRole=function(t,i){return e.getAriaOwnsWithRoleHidden(t,i,!1)},e.getAriaOwnsWithRoleHidden=function(t,i,a,n){var r=null,l=!1;if(u.CommonUtil.attributeNonEmpty(t,"aria-owns")){var o=t.getAttribute("aria-owns");if(r=c.FragmentUtil.getById(t,o),m.DOMUtil.sameNode(t,r))return null;l=a&&null!=r&&u.CommonUtil.shouldNodeBeSkippedHidden(r)?null:e.hasRole(r,i,n)}return l?r:null},e.hasAriaLabel=function(e){return u.CommonUtil.attributeNonEmpty(e,"aria-label")||u.CommonUtil.attributeNonEmpty(e,"aria-labelledby")},e.hasUniqueAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,r=!1,l=null;i&&(l=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===l&&(l={});for(var o=0;!r&&o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();r=s in l,l[s]=!0}else if(t[o].hasAttribute("aria-labelledby")){var d=t[o].getAttribute("aria-labelledby"),p=c.FragmentUtil.getById(t[o],d),h="";p&&!m.DOMUtil.sameNode(p,t[o])&&(h=e.getTextContentExcludingScripts(p));var g=u.CommonUtil.normalizeSpacing(h).toLowerCase();r=g in l,l[g]=!0}else r=!0;return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",l),!r},e.getTextContentExcludingScripts=function(e){if(!e)return"";for(var t="",i=new o.DOMWalker(e);i.nextNode()&&i.node!==e&&i.node!==e.parentNode;)if(!i.bEndTag){var a=i.node,n=a.nodeName?a.nodeName.toLowerCase():"";"script"!==n&&"style"!==n?3===a.nodeType?a.nodeValue&&a.nodeValue.trim().length>0&&(t+=" "+a.nodeValue.trim()):1===a.nodeType&&("img"===n&&a.hasAttribute("alt")||"input"===n&&"image"===a.getAttribute("type")&&a.hasAttribute("alt"))&&(t+=" "+a.getAttribute("alt").trim(),i.bEndTag=!0):i.bEndTag=!0}return t.trim()},e.getAriaLabel=function(t){if(t.hasAttribute){if(t.hasAttribute("aria-labelledby")){for(var i=t.getAttribute("aria-labelledby").trim().split(" "),a="",n=0,r=i.length;n<r;++n){var l=i[n],o=c.FragmentUtil.getById(t,l);if(o&&!m.DOMUtil.sameNode(o,t)){var s=e.getTextContentExcludingScripts(o);a+=u.CommonUtil.normalizeSpacing(s)}}return a.trim()}if(t.hasAttribute("aria-label"))return u.CommonUtil.normalizeSpacing(t.getAttribute("aria-label")).trim()}return""},e.getAriaDescription=function(t){if(!t)return"";var i="",a=t.getAttribute("aria-labelledby");if(a&&a.trim().length>0){for(var n=a.trim().split(" "),r=0,l=n.length;r<l;++r){var o=n[r],s=c.FragmentUtil.getById(t,o);if(s&&!m.DOMUtil.sameNode(s,t)){var d=e.getTextContentExcludingScripts(s);d&&d.trim().length>0&&(i+=u.CommonUtil.normalizeSpacing(d).toLowerCase())}}if(i.trim().length>0)return i.trim()}return(a=t.getAttribute("aria-description"))&&a.trim().length>0?a.trim().toLowerCase():""},e.findAriaLabelDupes=function(t){var i={};return t.forEach(function(t){i[e.getAriaLabel(t)]=(i[e.getAriaLabel(t)]||0)+1}),i},e.getLandmarkAccNames=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_Landmark_AccNames",null);if(i&&0!==i.length)return i;i=[];var r=t.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]');return 0===r.length?(n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i):(r.forEach(function(t){if(!s.VisUtil.isNodeHiddenFromAT(t)&&null===u.CommonUtil.getAncestor(t,["DIALOG"])&&null===e.getAncestorWithRole(t,"dialog",!0)){var n="",l=d.AccNameUtil.computeAccessibleName(t);l&&l.name&&l.name.trim().length>0&&(n=l.name.trim());var o=a([],r,!0).filter(function(e){return e.contains(t)&&e!==t});o.length>1&&o.forEach(function(e){var t=d.AccNameUtil.computeAccessibleName(e);t&&t.name&&t.name.trim().length>0&&(n=t.name.trim()+" "+n)});var c=e.getResolvedRole(t);i.push({elem:t,role:c,name:n})}}),n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i)},e.isLandmarkNameUnique=function(t,i,a){void 0===a&&(a=!1);var n,r=e.getLandmarkAccNames(t.ownerDocument);if(!(n="any"===i?r.find(function(e){return e.elem===t}):r.find(function(e){return e.elem===t&&e.role===i})))return null;var l=n.name;if(!a&&""===l)return null;for(var o=0;o<r.length;o++)if(r[o].elem!==t&&l===r[o].name){if("any"===i)return!0;if(r[o].role===i)return!0}return!1},e.hasUniqueAriaLabels=function(t){return e.hasUniqueAriaLabelsLocally(t,!0)},e.hasDuplicateAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,r=null,l=new Array;i&&(r=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===r&&(r={});for(var o=0;o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();r[s]=!0,s in l||(l[s]=new Array),l[s].push(t[o].nodeName.toLowerCase())}else if(t[o].hasAttribute("aria-labelledby")){for(var d=t[o].getAttribute("aria-labelledby").trim().split(" "),p="",h=0,g=d.length;h<g;++h){var b=d[h],_=c.FragmentUtil.getById(t[o],b);if(_&&!m.DOMUtil.sameNode(_,t[o])){var f=e.getTextContentExcludingScripts(_);p+=u.CommonUtil.normalizeSpacing(f).toLowerCase()}}r[p]=!0,p in l||(l[p]=new Array),l[p].push(t[o].nodeName.toLowerCase())}return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",r),l},e.hasDuplicateAriaLabels=function(t){return e.hasDuplicateAriaLabelsLocally(t,!0)},e.hasUniqueAriaLabelledby=function(e){for(var t=!1,i={},a=0;!t&&a<e.length;++a)if(e[a].hasAttribute&&e[a].hasAttribute("aria-labelledby")&&!u.CommonUtil.isIdReferToSelf(e[a],e[a].getAttribute("aria-labelledby"))){var n=u.CommonUtil.normalizeSpacing(e[a].getAttribute("aria-labelledby"));t=n in i,i[n]=!0}else t=!0;return!t},e.getElementAriaProperty=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_ElementAriaProperty",null);if(!i){var l=null;if(t.tagName?l=t.tagName.toLowerCase():t.nodeName&&(l=t.nodeName.toLowerCase()),null==(i=r.ARIADefinitions.documentConformanceRequirement[l])){var o=r.ARIADefinitions.documentConformanceRequirementSpecialTags[l];switch(l){case"a":case"area":i=t.hasAttribute("href")?o["with-href"]:o["without-href"];break;case"figure":var s=u.CommonUtil.getChildByTag(t,"figcaption");i=null!==s&&s.length>0?o["child-figcaption"]:o["no-child-figcaption"];break;case"footer":case"header":i=null!==e.getAncestorWithRole(t,"article",!0)||null!==e.getAncestorWithRole(t,"complementary",!0)||null!==e.getAncestorWithRole(t,"navigation",!0)||null!==e.getAncestorWithRole(t,"region",!0)||null!==u.CommonUtil.getAncestor(t,["article","aside","main","nav","section"])?o["des-section-article-aside-main-nav"]:o.other;break;case"img":var d=t.hasAttribute("alt")?t.getAttribute("alt"):null,c=t.hasAttribute("title")?t.getAttribute("title"):null;i=0!==e.getAriaLabel(t).trim().length||null!==d&&d.length>0||null!==c&&c.length>0?o["img-with-accname"]:null!==d?o["img-without-accname-empty-alt"]:o["img-without-accname-no-alt"];break;case"input":if(u.CommonUtil.attributeNonEmpty(t,"type")){var p=t.getAttribute("type").trim().toLowerCase();if(null==(i=o[p]))switch(p){case"checkbox":i=u.CommonUtil.attributeNonEmpty(t,"aria-pressed")?o["checkbox-with-aria-pressed"]:o["checkbox-without-aria-pressed"];break;case"email":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["email-with-list"]:o["email-no-list"];break;case"search":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["search-with-list"]:o["search-no-list"];break;case"tel":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["tel-with-list"]:o["tel-no-list"];break;case"text":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"url":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["url-with-list"]:o["url-no-list"];break;default:i=u.CommonUtil.attributeNonEmpty(t,"list")?o["default-with-list"]:o["default-no-list"]}}else i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"li":o=r.ARIADefinitions.documentConformanceRequirementSpecialTags.li,i=t.parentElement&&e.hasRoleInSemantics(t.parentElement,"list")?o["child-of-list-role"]:o["no-child-of-list-role"];break;case"section":var h=e.getAriaLabel(t);i=h&&h.trim().length>0||u.CommonUtil.attributeNonEmpty(t,"title")?o["with-name"]:o["without-name"];break;case"select":o=r.ARIADefinitions.documentConformanceRequirementSpecialTags.select,i=t.hasAttribute("multiple")||u.CommonUtil.attributeNonEmpty(t,"size")&&t.getAttribute("size")>1?o["multiple-attr-size-gt1"]:o["no-multiple-attr-size-gt1"];break;case"summary":o=r.ARIADefinitions.documentConformanceRequirementSpecialTags.summary,i=t.parentElement&&"details"===t.parentElement.nodeName.toLowerCase()&&m.DOMUtil.sameNode(a([],t.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],t)?o["first-summary-of-detail"]:o["no-first-summary-of-detail"];break;case"tbody":case"td":case"tr":i=null!==e.getAncestorWithRole(t,"table",!0)?o["des-table"]:e.getAncestorWithRole(t,"grid",!0)||e.getAncestorWithRole(t,"treegrid",!0)?o["des-grid"]:o["des-other"];break;case"th":var g=u.CommonUtil.getScopeForTh(t);i=null!==e.getAncestorWithRole(t,"table",!0)?"column"===g?o["des-table-column-scope"]:o["des-table-row-scope"]:null!==e.getAncestorWithRole(t,"grid",!0)||null!==e.getAncestorWithRole(t,"treegrid",!0)?"column"===g?o["des-grid-treegrid-column-scope"]:o["des-grid-treegrid-row-scope"]:o["des-other"];break;case"div":var b=t.parentElement;i=null!==b&&"dl"===b.nodeName.toLowerCase()?o["child-dl"]:o["no-child-dl"];break;default:i=r.ARIADefinitions.documentConformanceRequirementSpecialTags.default}}}return n.CacheUtil.setCache(t,"AriaUtil_ElementAriaProperty",i),i||null},e.getAllowedAriaRoles=function(t,i){var a=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaRoles",null);if(!a){a=[];var r;if(null!=(r=null!=i?i:e.getElementAriaProperty(t))){null!==r.implicitRole&&u.CommonUtil.concatUniqueArrayItemList(r.implicitRole,a),null!==r.validRoles&&u.CommonUtil.concatUniqueArrayItemList(r.validRoles,a);var l=e.getImplicitRole(t);l&&l.length>0&&u.CommonUtil.concatUniqueArrayItemList(r.validRoles,a)}n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaRoles",a)}return a},e.getAllowedAriaAttributes=function(t,i,l){var o=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaAttributes",null);if(!o){o=[];var s=a([],i,!0),d=t.tagName.toLowerCase(),c=[];r.ARIADefinitions.elementsAllowedDisabled.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-disabled",o)),r.ARIADefinitions.elementsAllowedRequired.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-required",o)),r.ARIADefinitions.elementsAllowedReadOnly.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-readonly",o));var m=null;if(null!=(m=null!=l&&void 0!==l?l:e.getElementAriaProperty(t))){if(null!==m.implicitRole&&(null==s||0===s.length)&&void 0===m.allowAttributesFromImplicitRole)for(var p=0;p<m.implicitRole.length;p++){var h=r.ARIADefinitions.designPatterns[m.implicitRole[p]];if(null!=h){var g=h.props;u.CommonUtil.concatUniqueArrayItemList(g,o),g=e.getRoleRequiredProperties(m.implicitRole[p],t),u.CommonUtil.concatUniqueArrayItemList(g,o),(v=h.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===m.implicitRole[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuenow","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(m.globalAriaAttributesValid){var b=r.ARIADefinitions.globalProperties;u.CommonUtil.concatUniqueArrayItemList(b,o)}}for(m&&m.otherRolesForAttributes&&m.otherRolesForAttributes.length>0&&u.CommonUtil.concatUniqueArrayItemList(m.otherRolesForAttributes,s),p=0;null!==s&&p<s.length;p++){var _=r.ARIADefinitions.designPatterns[s[p]];if(null!=_){if(!m||null===m.implicitRole||!m.implicitRole.includes(s[p])||m.implicitRole.includes(s[p])&&void 0===m.allowAttributesFromImplicitRole){var f=_.props;u.CommonUtil.concatUniqueArrayItemList(f,o),f=e.getRoleRequiredProperties(s[p],t),u.CommonUtil.concatUniqueArrayItemList(f,o)}var v;(v=_.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===s[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(s.includes("row")&&null==e.getAncestorWithRole(t,"treegrid",!0)){var A=-1;(A=o.indexOf("aria-level"))>-1&&o.splice(A,1),(A=o.indexOf("aria-setsize"))>-1&&o.splice(A,1),(A=o.indexOf("aria-posinset"))>-1&&o.splice(A,1)}if(m&&m.otherAllowedAriaAttributes&&m.otherAllowedAriaAttributes.length>0){for(var w=[],y=0;y<m.otherAllowedAriaAttributes.length;y++)if((R=m.otherAllowedAriaAttributes[y]).includes("=")){var C=R.split("=");t.getAttribute(C[0])===C[1]&&w.push(C[0])}else w.push(R);w.length>0&&u.CommonUtil.concatUniqueArrayItemList(w,o)}if(m&&m.otherDisallowedAriaAttributes&&m.otherDisallowedAriaAttributes.length>0){var k=[];for(y=0;y<m.otherDisallowedAriaAttributes.length;y++){var R;(R=m.otherDisallowedAriaAttributes[y]).includes("=")?(C=R.split("="),t.getAttribute(C[0])===C[1]&&k.push(C[0])):k.push(R)}k.length>0&&u.CommonUtil.concatUniqueArrayItemList(k,c)}o=u.CommonUtil.reduceArrayItemList(c,o),i&&0!==i.length||null!==m.implicitRole||!m.prohibitedAriaAttributesWhenNoImplicitRole||(o=u.CommonUtil.reduceArrayItemList(m.prohibitedAriaAttributesWhenNoImplicitRole,o)),n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaAttributes",o)}return o},e.getConflictOrOverlappingHtmlAttribute=function(e,t,i){var a=r.ARIADefinitions.relatedAriaHtmlAttributes[e.name];if(a){if(!e||0==e.length||!t||0==t.length)return[];var n=[],l=null;if("conflict"===i){if(!a.conflict||0===Object.keys(a.conflict).length)return null;l=a.conflict}else{if("overlapping"!==i)return null;if(!a.overlapping||0===Object.keys(a.overlapping).length)return null;l=a.overlapping}for(var o=!1,s=!1,u=0;u<l.length;u++)for(var d=l[u].ariaAttributeValue,c=l[u].htmlAttributeNames,m=l[u].htmlAttributeValues,p=0;p<t.length;p++){var h=c.indexOf(t[p].name);if(-1!==h){o=!0;var g=null===m||null===m[h]?null:m[h].split(",");null===d?(null===g||g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0):null===g?d===e.value&&(n.push({result:"Failed",attr:t[p].name}),s=!0):("VALUE"===d&&g.includes("VALUE")&&g[0]!==e.value||d===e.value&&g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0)}}return o&&!s&&n.push({result:"Pass",attr:""}),n}return null},e.containsPresentationalChildrenOnly=function(t){var i=e.getRoles(t,!1);if(i&&0!==i.length||(i=e.getImplicitRole(t)),!i||0===i.length)return!1;for(var a=0;null!==i&&a<i.length;a++){var n=r.ARIADefinitions.designPatterns[i[a]];if(null!=n&&!0===n.presentationalChildren)return!0}return!1},e.shouldBePresentationalChild=function(t){for(var i=o.DOMWalker.parentElement(t);i;){if(e.containsPresentationalChildrenOnly(i))return!0;i=l.ARIAMapper.getAriaOwnedBy(i)||o.DOMWalker.parentElement(i)}return!1},e.areRolesDefined=function(e){if(!e||0===e.length)return null;for(var t=r.ARIADefinitions.designPatterns,i=0,a=e;i<a.length;i++)if(!(a[i].toLowerCase()in t))return!1;return!0},e.getInvalidRoles=function(t){var i=e.getUserDefinedRoles(t);if(!i||0===i.length)return null;if(i&&i.includes("generic"))return["generic"];var a=e.getElementAriaProperty(t),n=e.getAllowedAriaRoles(t,a);if(!n||0===n.length)return i;var r=[];if(n.includes("any"))return[];for(var l=0;l<i.length;l++)n.includes(i[l])||r.includes(i[l])||r.push(i[l]);return r},e.getRolesUndefinedByAria=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=r.ARIADefinitions.designPatterns,l=0;l<i.length;l++)i[l]in n||a.push(i[l]);return a},e.getInvalidAriaAttributes=function(t){var i=e.getUserDefinedRoles(t),a=e.areRolesDefined(i);if(null!==a&&!a)return null;var n=[];i&&0!=i.length||(i=e.getImplicitRole(t));var r=e.getUserDefinedAriaAttributes(t),l=e.getElementAriaProperty(t),o=e.getAllowedAriaAttributes(t,i,l);if(r)for(var s=0;s<r.length;s++){var u=r[s].trim().toLowerCase();o.includes(u)||n.includes(u)||n.push(u)}return n},e.getConflictAriaAndHtmlAttributes=function(t){var i=e.getUserDefinedAriaAttributeNameValuePairs(t),a=e.getUserDefinedHtmlAttributeNameValuePairs(t),n=[];if(i&&i.length>0&&a&&a.length>0)for(var r=function(t){var r=e.getConflictOrOverlappingHtmlAttribute(i[t],a,"conflict");if(null===r)return"continue";r.forEach(function(e){"Failed"===e.result&&n.push({ariaAttr:i[t].name,htmlAttr:e.attr})})},l=0;l<i.length;l++)r(l);return n},e.getDeprecatedAriaRoles=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=r.ARIADefinitions.globalDeprecatedRoles,l=0;l<i.length;l++)n.includes(i[l])&&a.push(i[l]);return a},e.getDeprecatedAriaAttributes=function(t){if(!t)return null;var i=t.attributes,a=[];if(i)for(var n=0;n<i.length;n++){var l=i[n].name;"aria-"===l.substring(0,5)&&a.push(l)}if(0===a.length)return[];var o=[],s=r.ARIADefinitions.globalDeprecatedProperties;for(n=0;n<a.length;n++)s.includes(a[n])&&o.push({role:"any",attribute:a[n]});var u=e.getRoles(t,!1);if(u&&u.length>0)for(n=0;n<u.length;n++){var d=r.ARIADefinitions.designPatterns[u[n]];if(d){var c=d.deprecatedProps;if(c&&c.length>0)for(var m=0;m<a.length;m++)c.includes(a[m])&&o.push({role:u[n],attribute:a[m]})}}return o},e.isNodeInGrid=function(t){return null!=e.getAncestorWithRole(t,"grid")},e.navLinkKeywords=["start","next","prev","previous","contents","index"],e.rulesThatHaveToCheckHidden=["RPT_Elem_UniqueId"],e.ariaAttributeRoleDefaults={alert:{"aria-live":"assertive","aria-atomic":"true"},combobox:{"aria-haspopup":"listbox"},listbox:{"aria-orientation":"vertical"},log:{"aria-live":"polite"},menu:{"aria-orientation":"vertical"},menubar:{"aria-orientation":"horizontal"},meter:{"aria-valuemin":"0","aria-valuemax":"100"},option:{"aria-selected":"false"},progressbar:{"aria-valuemin":"0","aria-valuemax":"100"},scrollbar:{"aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},separator:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},slider:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},spinbutton:{},status:{"aria-live":"polite","aria-atomic":"true"},tab:{"aria-selected":"false"},tablist:{"aria-orientation":"horizontal"},toolbar:{"aria-orientation":"horizontal"},tree:{"aria-orientation":"vertical"}},e.ariaAttributeGlobalDefaults={"aria-atomic":"false","aria-autocomplete":"none","aria-busy":"false","aria-checked":void 0,"aria-current":"false","aria-disabled":"false","aria-dropeffect":"none","aria-expanded":void 0,"aria-grabbed":void 0,"aria-haspopup":"false","aria-hidden":void 0,"aria-invalid":"false","aria-live":"off","aria-modal":"false","aria-multiline":"false","aria-multiselectable":"false","aria-orientation":void 0,"aria-pressed":void 0,"aria-readonly":"false","aria-required":"false","aria-selected":void 0,"aria-sort":"none"},e.ariaAttributeImplicitMappings={"aria-autocomplete":{form:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},input:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},select:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},textarea:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"}},"aria-checked":{input:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},menuitem:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},"*":function(e){if(e.hasAttribute("indeterminate"))return"mixed"}},"aria-disabled":{button:function(e){return e.hasAttribute("disabled")?"true":"false"},fieldset:function(e){return e.hasAttribute("disabled")?"true":"false"},input:function(e){return e.hasAttribute("disabled")?"true":"false"},optgroup:function(e){return e.hasAttribute("disabled")?"true":"false"},option:function(e){return e.hasAttribute("disabled")?"true":"false"},select:function(e){return e.hasAttribute("disabled")?"true":"false"},textarea:function(e){return e.hasAttribute("disabled")?"true":"false"}},"aria-expanded":{details:function(e){return e.getAttribute("open")},dialog:function(e){return e.getAttribute("open")}},"aria-multiselectable":{select:function(e){if(e.hasAttribute("multiple"))return"true"}},"aria-placeholder":{input:function(e){return e.getAttribute("placeholder")},textarea:function(e){return e.getAttribute("placeholder")}},"aria-required":{input:function(e){return e.getAttribute("required")},select:function(e){return e.getAttribute("required")},textarea:function(e){return e.getAttribute("required")}}},e}();t.AriaUtil=p},4919(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CSSUtil=void 0;var a=i(4566),n=i(7139),r=i(7011),l=i(7507),o=i(3864),s=function(){function e(){}return e.selectorMatchesElem=function(e,t){if(!t||0===t.length||""===t.trim())return!1;try{if("function"==typeof e.matches)return e.matches(t);if("function"==typeof e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if("function"==typeof e.msMatchesSelector)return e.msMatchesSelector(t);if("function"==typeof e.matchesSelector)return e.matchesSelector(t);var i=e.ownerDocument||e.document;if(!i)return!1;var a=i.querySelectorAll(t);return Array.from(a).includes(e)}catch(e){return!1}},e.getComputedStyle=function(e,t){return e?e.ownerDocument.defaultView.getComputedStyle(e,t):null},e.getParsedStylesheetRules=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_ParsedStylesheetRules",null);if(t)return t;for(var i=[],n=0;n<e.styleSheets.length;++n){var r=e.styleSheets[n];try{if(r&&r.cssRules)for(var l=0;l<r.cssRules.length;++l){var o=r.cssRules[l],s=o.selectorText;if(s){var u=s.match(/^(.*)(:[a-zA-Z-]*)$/),d=!!u,c=d?u[1]:s,m=d?u[2]:"";i.push({fullRuleSelector:s,hasPseudoClass:d,selMain:c,selPseudo:m,style:o.style})}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_ParsedStylesheetRules",i),i},e.fillStyle=function(e,t){for(var i=0;i<t.length;++i){if("all"===t[i]&&t[t[i]]){for(var a=0,n=e;a<n.length;a++){var r=n[a];for(var l in r)delete r[l]}break}l=t[i];for(var o=0,s=e;o<s.length;o++){r=s[o];var u=t.getPropertyPriority(l);if(l in r&&r[l].endsWith("!important")){if("important"!==u||r[l].startsWith("inherit")||r[l].startsWith("unset"))continue;r[l]=t[l]+" !important"}else r[l]=t[l]+("important"===u?" !important":"")}}},e.getDefinedStylesInternal=function(t,i,a){for(var n={},r={},l={},o=0,s=a;o<s.length;o++){var u=s[o];r[u]={},l[u]={}}for(var d=e.getParsedStylesheetRules(t.ownerDocument),c=a.includes(":focus"),m=function(n){if(null!==i&&!i.some(function(e){return!!n.style[e]}))return"continue";var o=n.selPseudo,s=n.hasPseudoClass,u=n.selMain;if(c&&":focus"===o&&(u=u.replace(/([ >][^+~ >]+):focus-within/g,"$1")),e.selectorMatchesElem(t,u))for(var d=0,m=a;d<m.length;d++){var p=m[d],h=r[p],g=l[p];s||e.fillStyle([h,g],n.style),o===p&&e.fillStyle([g],n.style)}},p=0,h=d;p<h.length;p++)m(h[p]);for(var g=0,b=a;g<b.length;g++){u=b[g];var _=r[u],f=l[u];if(e.fillStyle([_,f],t.style),""===u)n[u]=_;else{for(var v={},A=Object.keys(f),w=0;w<A.length;w++){var y=A[w];f[y]!==_[y]&&(v[y]=f[y])}n[u]=v}}return n},e.getDefinedStylesMultiple=function(t,i,n){if(!t)return null;var r={},l=null===i?"all":i.slice().sort().join(","),o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[l],u=[];if(s){for(var d=0,c=n;d<c.length;d++)void 0!==s[g=c[d]]?r[g]=s[g]:u.push(g);if(0===u.length)return r}else s={},u=n;if(u.length>0){for(var m=e.getDefinedStylesInternal(t,i,u),p=0,h=u;p<h.length;p++){var g;r[g=h[p]]=m[g],s[g]=m[g]}o[l]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o)}return r},e.getDefinedStyles=function(t,i,n){if(!t)return null;var r=null===i?"all":i.slice().sort().join(","),l=n||"",o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[r];if(s||(s={}),void 0!==s[l])return s[l];var u=e.getDefinedStylesInternal(t,i,[l])[l];return s[l]=u,o[r]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o),u},e.getMediaOrientationTransform=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_MediaOrientationTransforms",null);if(t)return t;for(var i={},n=0;n<e.styleSheets.length;++n){var r=e.styleSheets[n];try{if(r&&r.cssRules)for(var l=0;l<r.cssRules.length;++l){var o=r.cssRules[l];if(4===o.MEDIA_RULE){var s=o;if(s&&s.media)for(var u=s.media,d=0;d<u.length;d++)if(u.item(d)){var c=u.item(d).toLocaleLowerCase(),m=i[c];m||(m={});for(var p=s.cssRules,h=0;h<p.length;++h)if(1===p[h].STYLE_RULE){var g=p[h],b=g.selectorText;if(b){for(var _={},f=g.style,v=0;v<f.length;++v){var A=f[v],w=A.toLocaleLowerCase();if("transform"===w){if("all"===A&&f[A]){_={};break}_[A]=f[A]}else"rotate"===w&&(_[A]=f[A])}Object.keys(_).length>0&&(m[b]=_)}}Object.keys(m).length>0&&(i[c]=m)}}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_MediaOrientationTransforms",i),i},e.getRotationDegree=function(e){var t=0;try{if(!e)return t;for(var i=(e=e.replaceAll(", ",",")).split(" "),a=0;a<i.length;a++){var n=i[a].trim();if(""!==n)if(n.startsWith("rotate3d")){var r=n.indexOf("("),l=n.indexOf(")");if(-1!==r&&-1!==l){var o=n.substring(r+1,l),s=void 0;if(o&&(s=o.split(",")),s&&4===s.length){if(!(d=s[3]))continue;if((d=d.trim()).endsWith("turn")){var u=d.substring(0,d.length-4);u=parseFloat(u),isNaN(u)||(t=360*u)}else d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}}else if(n.startsWith("rotate")||n.startsWith("rotateZ")){if(r=n.indexOf("("),l=n.indexOf(")"),-1!==r&&-1!==l){var d;if(!(d=n.substring(r+1,l)))continue;(d=d.trim()).endsWith("turn")?(u=d.substring(0,d.length-4),u=parseFloat(u),isNaN(u)||(t=360*u)):d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}else if(n.startsWith("matrix3d")){if(r=n.indexOf("("),l=n.indexOf(")"),-1!==r&&-1!==l&&(o=n.substring(r+1,l),s=null,o&&(s=o.split(",")),null!==s)){var c=Math.atan2(s[4],s[5]);t+=Math.round(Math.round(180*c/Math.PI))}}else n.startsWith("matrix")&&(r=n.indexOf("("),l=n.indexOf(")"),-1!==r&&-1!==l&&(o=n.substring(r+1,l),s=null,o&&(s=o.split(",")),null!==s&&(c=Math.atan2(s[1],s[0]),t+=Math.round(Math.round(180*c/Math.PI)))))}for(;t>=360;)t-=360}catch(e){throw console.log("Cannot retrieve rotation degree: "+e),e}return t},e.getPixelsFromStyle=function(t,i){if(!t)return 0;var a=t.trim().match(/(-?[\d.]+)([a-z%]*)/);if(null===a)return 0;if(""===a[2]||0===a[1])return 0;var n=e.convertValue2Pixels(a[2],a[1],i);return null===n?n:parseFloat(n)},e.convertValue2Pixels=function(e,t,i){if(0===t)return 0;e||(e="px");var a={px:function(e){return e},cm:function(e){return 37.8*e},mm:function(e){return 3.78*e},q:function(e){return.95*e},in:function(e){return 96*e},pc:function(e){return 16*e},pt:function(e){return 1.33*e},rem:function(e){return e*parseFloat(getComputedStyle(i.ownerDocument.documentElement).getPropertyValue("font-size"))},em:function(e){return e*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))},vw:function(e){return e/100*i.ownerDocument.defaultView.innerWidth},vh:function(e){return e/100*i.ownerDocument.defaultView.innerHeight},"%":function(e){return e/100*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))}};return e in a?a[e](t):null},e.isMaterialIconFont=function(t){var i={"Material Icons":"https://fonts.googleapis.com/icon?family=Material+Icons"},a=e.getDefinedStyles(t,["font-family"])["font-family"],n=!1;if(a&&a.split(",")[0].replace(/['"]+/g,"").trim()in i&&(n=!0),!n){var r=t.classList;for(var l in{"material-icons":"https://fonts.googleapis.com/icon?family=Material+Icons"})if(r.contains(l)){n=!0;break}}if(!n)return!1;for(var o=!1,s=t.ownerDocument.styleSheets,u=0;u<s.length;u++)if(s&&s.length>0&&Object.values(i).indexOf(s[u].href)>-1){o=!0;break}return o},e.getWeightNumber=function(e){var t={light:100,bold:700};return parseInt(e)||(e in t?t[e]:400)},e.getFontInPixels=function(t,i){var a=parseFloat(t);if(!a)return{"xx-small":16,"x-small":10,small:13,medium:16,large:18,"x-large":24,"xx-large":32}[t];var n=t.substring((""+a).length);return e.convertValue2Pixels(n,a,i)},e.getCSSStyle=function(e){var t="";if(null===e)return[];if(e.IBM_CSS_THB)return e.IBM_CSS_THB;if("style"===e.nodeName.toLowerCase())void 0!==(t=e.innerText)&&""!==t.trim()||(t=e.textContent);else{if(!e.hasAttribute("style"))return[];t=e.getAttribute("style")}if(null===t||0===t.trim().length)return[];var i=/\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g,a=/\s*([^{]*){([^}]*)}/g;if(-1===(t=t.replace(/(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g," ")).indexOf("{")){for(var n={},r=void 0;null!=(r=i.exec(t));)n[r[1]]=r[2].trim().toLowerCase();var l=[{selector:null,values:n}];return e.IBM_CSS_THB=l,l}l=[],r=void 0;for(var o=void 0;null!=(r=a.exec(t));){n={};for(var s=r[1],u=r[2];null!=(o=i.exec(u));)n[o[1]]=o[2].trim().toLowerCase();l.push({selector:s,values:n})}return e.IBM_CSS_THB=l,l},e.getInlineStatus=function(e){if(!e)return null;var t=getComputedStyle(e);if(!t)return null;var i={inline:!1,text:!1,violation:null};if("inline"!==t.getPropertyValue("display"))return i;i.inline=!0;var a=e.parentElement;if(!a)return i;var r=new l.DOMMapper,o=r.getUnadjustedBounds(e),s=getComputedStyle(a).getPropertyValue("display");if("block"!==s&&"inline-block"!==s)return n.CommonUtil.isInnerTextOnlyEmpty(a)||(i.text=!0),i;function u(e,t){if(e.nodeType===Node.TEXT_NODE)return e.nodeValue&&e.nodeValue.trim().length>0?"yes":"no";if(e.nodeType===Node.ELEMENT_NODE){if("br"===e.nodeName.toLowerCase())return"block";if("inline"===getComputedStyle(e).getPropertyValue("display")){if(n.CommonUtil.isTarget(e)&&o.width<24){var a=r.getUnadjustedBounds(e);return t&&Math.round(o.width/2)+o.left-a.left<24||!t&&Math.round(o.width/2)+o.left-(a.left+a.width)<24?(i.violation=e.nodeName.toLowerCase(),"violation"):"no"}return n.CommonUtil.isInnerTextOnlyEmpty(e)?"no":"yes"}return"block"}return"block"}for(var d=e.nextSibling;d;){if("yes"===(c=u(d,!0))){i.text=!0;break}if("block"===c)break;d=d.nextSibling}for(d=e.previousSibling;d;){var c;if("yes"===(c=u(d,!1))){i.text=!0;break}if("block"===c)break;d=d.previousSibling}return i},e.isTargetBrowserDefault=function(t){if(!t)return!1;var i=r.AriaUtil.getRoles(t,!1);if(i&&i.length>0)return!1;var a=e.getDefinedStyles(t,["line-height","height","width","min-height","min-width","font-size","margin-top","margin-bottom","margin-left","margin-right"]);return!(a["line-height"]||a.height||a.width||a["min-height"]||a["min-width"]||a["font-size"]||a["margin-top"]||a["margin-bottom"]||a["margin-left"]||a["margin-right"])},e.containsCKJ=function(e){return!!e&&e.trim().replace(/(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g,"").length!==e.trim().length},e.getAncestorWithStyles=function(t,i,n){void 0===n&&(n=[]);var r="AriaUtil_AncestorWithStyles_"+JSON.stringify(i)+"_"+JSON.stringify(n),l=a.CacheUtil.getCache(t,r,null);if(null!==l)return"NOT_FOUND"===l?null:l;for(var s=t;null!==s;)if(1===s.nodeType&&"http://www.w3.org/2000/svg"!==s.namespaceURI){var u=e.getDefinedStyles(s,Object.keys(i));for(var d in i){var c=u[d];if(c&&(c=c.split(" ")[0],!n.includes(c))){var m=i[d];if(m.includes("*"))return a.CacheUtil.setCache(t,r,s),s;if(m.includes(c))return a.CacheUtil.setCache(t,r,s),s}}s=o.DOMWalker.parentElement(s)}else s=o.DOMWalker.parentElement(s);return a.CacheUtil.setCache(t,r,"NOT_FOUND"),null},e.getValueUnitPair=function(e){if(!e)return null;if(Number.isInteger(e))return["px",e];var t=parseInt(e);if(isNaN(t))return null;var i=(e=e.trim().toLowerCase()).trim().match(/([a-z]+)$/),a="px";return i&&(a=i[1]),[a,t]},e}();t.CSSUtil=s},4566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CacheUtil=void 0;var a=i(1686),n=i(3864),r=function(){function e(){}return e.getCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0===a.aceCache[t]&&(a.aceCache[t]=i),a.aceCache[t]}},e.setCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),a.aceCache[t]=i,i}},e.getSetCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0!==a.aceCache[t]&&void 0!==a.aceCache[t]||(a.aceCache[t]=i()),a.aceCache[t]}},e.clearCaches=function(e){var t,i=0;delete e.ownerDocument.aceCache;var r=new n.DOMWalker(e,!1,e,!0);do{++i,delete r.node.aceCache,r.node.ownerDocument&&delete r.node.ownerDocument.aceCache}while(r.nextNode());if(e!==(null===(t=e.ownerDocument)||void 0===t?void 0:t.documentElement)){for(var l=new n.DOMWalker(e.ownerDocument.documentElement,!1,void 0,!0),o=l.node,s=void 0;s=n.DOMWalker.parentElement(o);)o=s;l.node=o;do{l.bEndTag||!a.DOMUtil.sameNode(e,l.node)?(delete l.node.aceCache,l.node.ownerDocument&&delete l.node.ownerDocument.aceCache):l.bEndTag=!0}while(l.nextNode())}return i},e}();t.CacheUtil=r},167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ClipPathUtil=void 0;var a=i(4566),n=i(4919),r=function(){function e(){}return e.isNodeVisuallyHiddenByClipPath=function(t){if(!t||1!==t.nodeType)return!1;var i=t,r=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",void 0);if(void 0!==r)return r;var l=n.CSSUtil.getComputedStyle(i),o=parseInt(l.width),s=parseInt(l.height),u=l["clip-path"];if(!u||"none"===u.trim()||""===u.trim())return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var d=(u=u.trim().replace(/\s+/g," ").toLowerCase()).indexOf("inset(");if(-1!==d){var c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")"));if(-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),1===(f=m.trim().split(" ")).length){var p=e.isClippedByInset(i,f[0],f[0],f[0],f[0]);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(2===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[0],f[1]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(3===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[1],f[2]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(4===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[2],f[3]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(-1!==(d=u.indexOf("rect("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),"auto"===(f=m.trim().split(" "))[0]&&(f[0]="0px"),"auto"===f[3]&&(f[3]="0px"),"auto"===f[1]&&(f[1]="100%"),"auto"===f[2]&&(f[2]="100%"),f[2]=Math.max(f[0],f[2]),f[1]=Math.max(f[1],f[3]);var h=parseInt(f[0]);if(isNaN(h))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))h=h*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(h)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;h=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(h>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var g=parseInt(f[3]);if(isNaN(g))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))g=g*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(g)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;g=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(g>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var b=parseInt(f[1]);if(isNaN(b))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))b=b*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(b)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;b=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}var _=parseInt(f[2]);if(isNaN(_))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))_=_*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(_)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;_=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return _-h<=e.THRESHOLD||b-g<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("xywh("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c));var f=m.trim().split(" "),v=parseInt(f[0]);if(isNaN(v))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))v=v*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(top)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;v=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(v>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var A=parseInt(f[1]);if(isNaN(A))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))A=A*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(A)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;scrollY=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(A>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var w=parseInt(f[2]);if(isNaN(w))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))w=w*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(w)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;w=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(w<=e.THRESHOLD)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0;var y=parseInt(f[3]);if(isNaN(y))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))y=y*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(y)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;y=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return y<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("circle("))){f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ");var C=parseInt(f[0]);if(isNaN(C))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))C=C*(o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("ellipse("))){if((f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ")).length>3&&"closest-side"===f[0]&&"farthest-side"===f[1]&&"at"===f[2]){if(C=parseInt(f[3]),4===f.length){if(f[3].endsWith("%"))C=C*(N=o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(5===f.length)for(var k=3;k<f.length;k++){var R=parseInt(f[k]);if(f[k].endsWith("%"))R=R*(N=3===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(R)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;R=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return R<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}var x=u.indexOf("at");if(m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==x&&(m=u.substring(u.indexOf("(")+1,x)),2!==(f=m.trim().split(" ")).length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(k=0;k<f.length;k++){if(C=parseInt(f[k]),f[k].endsWith("%"))C=C*(N=0===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}if(-1!==(d=u.indexOf("polygon("))){"nonzero"!==(f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(","))[0]&&"evenodd"!==f[0]||f.shift(),A=0,v=0;var P=!1,T=!1;for(k=0;k<f.length;k++){var U=f[k].trim().split(" ");if(2!=U.length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(var I=[0,0],E=0;E<2;E++){var N=parseInt(U[E]);if(isNaN(N))return!1;if(U[E].endsWith("%"))I[E]=0===E?N*o/100:N*s/100;else{var L;if(!(L=n.CSSUtil.getValueUnitPair(U[E])))return!1;I[E]=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}}0===k&&(v=I[0],A=I[1]),Math.abs(I[0]-v)>=e.THRESHOLD&&(P=!0),Math.abs(I[1]-A)>=e.THRESHOLD&&(T=!0)}return P&&T?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1},e.isClippedByInset=function(t,i,a,r,l){void 0===a&&(a="0px"),void 0===r&&(r="0px"),void 0===l&&(l="0px");var o=n.CSSUtil.getComputedStyle(t),s=parseInt(o.width),u=parseInt(o.height),d=parseInt(i);if(isNaN(d))return!1;if(i.endsWith("%"))d=d*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(i)))return!1;d=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(d>u)return!1;var c=parseInt(a);if(isNaN(c))return!1;if(a.endsWith("%"))c=c*s/100;else{if(!(h=n.CSSUtil.getValueUnitPair(a)))return!1;c=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(c>s)return!1;var m=parseInt(r);if(isNaN(m))return!1;if(r.endsWith("%"))m=m*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(r)))return!1;m=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(m>u)return!1;var p=parseInt(l);if(isNaN(p))return!1;if(l.endsWith("%"))p=p*s/100;else{var h;if(!(h=n.CSSUtil.getValueUnitPair(l)))return!1;p=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}return!(p>s)&&(u-(d+m)<=e.THRESHOLD||s-(c+p)<=e.THRESHOLD)},e.THRESHOLD=5,e}();t.ClipPathUtil=r},3883(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ColorObj=t.ColorUtil=void 0;var a=i(3864),n=function(){function e(){}return e.Color=function(t){if(!t)return null;if("transparent"===(t=t.toLowerCase()))return new r(255,255,255,0);if(t in e.CSSColorLookup&&(t=e.CSSColorLookup[t]),t.startsWith("rgb(")){var i=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;return null===(a=t.match(i))?null:new r(a[1],a[2],a[3])}var a;if(t.startsWith("rgba("))return i=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(a=t.match(i))?null:new r(a[1],a[2],a[3],a[4]);if("#"!=t.charAt(0))return null;4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2));var n=parseInt(t.substring(1,3),16),l=parseInt(t.substring(3,5),16),o=parseInt(t.substring(5,7),16);return new r(n,l,o)},e.ColorCombo=function(t){try{var i=t.ownerDocument;if(!i)return null;var n=i.defaultView;if(!n)return null;for(var r=[],l=t;l;)1===l.nodeType&&r.push(l),l=a.DOMWalker.parentElement(l);var o={hasGradient:!1,hasBGImage:!1,textShadow:!1,fg:null,bg:null},s=(b=n.getComputedStyle(t)).color;s||(s="black");for(var u=e.Color(s),d=/transparent|rgba?\([^)]+\)/gi,c=function(e,t,i){try{if(void 0===e.length)return e;for(var a=null,n=null,r=1;r<e.length;++r){for(var l=e[r-1],o=i.contrastRatio(e[r-1]),s=.1,u=0;s>1e-4;){for(;u+s<=1&&o>i.contrastRatio(e[r].mix(e[r-1],u+s).getOverlayColor(t));)l=e[r].mix(e[r-1],u+s).getOverlayColor(t),o=i.contrastRatio(l),u+=s;for(;u-s>=0&&o>i.contrastRatio(e[r].mix(e[r-1],u-s).getOverlayColor(t));)l=e[r].mix(e[r-1],u-s).getOverlayColor(t),o=i.contrastRatio(l),u-=s;s/=10}(null===n||n>o)&&(n=o,a=l)}return a}catch(e){console.log(e)}return t},m=e.Color("white"),p=null,h=null,g=null;r.length>0;){var b,_=r.pop();if(null!==(b=n.getComputedStyle(_))){var f=null;if(b.backgroundColor&&"transparent"!=b.backgroundColor&&"rgba(0, 0, 0, 0)"!=b.backgroundColor&&(f=e.Color(b.backgroundColor)),b.backgroundImage&&b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")){var v=b.backgroundImage.match(d);if(v){for(var A=[],w=0;w<v.length;++w)if(v[w].length){var y=e.Color(v[w]);if(void 0!==y.alpha&&y.alpha<1){var C=g||m;y=y.getOverlayColor(C)}A.push(y)}else v.splice(w--,1);f=c(A,g||m,u)}}null===p||b.opacity&&b.opacity.length>0&&parseFloat(b.opacity)<1?(null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),p=1,h=null,g=null,b.opacity&&b.opacity.length>0&&(p=parseFloat(b.opacity)),null!=f&&(h=(g=f).alpha||1,delete g.alpha,1===p&&1===h&&(o.hasBGImage=!1,o.hasGradient=!1))):null!=f&&(null===g?(h=(g=f).alpha||1,delete g.alpha):h=(g=f.getOverlayColor(g)).alpha||1,1===p&&1===h&&1===(g.alpha||1)&&f.alpha),b.backgroundImage&&"none"!=b.backgroundImage&&(b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")?o.hasGradient=!0:o.hasBGImage=!0)}}return null!=g&&delete(u=u.getOverlayColor(g)).alpha,u.alpha=(u.alpha||1)*p,u=u.getOverlayColor(m),null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),o.fg=u,o.bg=m,b.textShadow&&"none"!==b.textShadow&&(o.textShadow=!0),o}catch(e){return null}},e.CSSColorLookup={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",buttontext:"rgba(0, 0, 0, 0.847)",buttonface:"#ffffff",graytext:"rgba(0, 0, 0, 0.247)"},e}();t.ColorUtil=n;var r=function(){function e(e,t,i,a){function n(e){if("string"!=typeof e)return e;var t=e;return"%"!=(t=t.trim())[t.length-1]?parseInt(t):Math.round(2.55*parseFloat(t.substring(0,t.length-1)))}this.red=n(e),this.green=n(t),this.blue=n(i),void 0!==a&&(this.alpha="string"==typeof a?parseFloat(a):a)}return e.prototype.toHexHelp=function(e){var t=Math.round(e).toString(16);return 1===t.length?"0"+t:t},e.prototype.toHex=function(){return"#"+this.toHexHelp(this.red)+this.toHexHelp(this.green)+this.toHexHelp(this.blue)},e.prototype.contrastRatio=function(e){var t=this;void 0!==this.alpha&&(t=this.getOverlayColor(e));var i=t.relativeLuminance();if(!e.relativeLuminance){var a="";for(var n in e)a+=n+"\n";alert(e),alert(a)}var r=e.relativeLuminance();return i>r?(i+.05)/(r+.05):(r+.05)/(i+.05)},e.prototype.relativeLuminance=function(){var e=this.red/255,t=this.green/255,i=this.blue/255;return.2126*(e=e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4))},e.prototype.mix=function(t,i){if(void 0===this.alpha&&void 0===t.alpha)return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue);var a=this.alpha?this.alpha:1,n=t.alpha?t.alpha:1;return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue,i*a+(1-i)*n)},e.prototype.getOverlayColor=function(e){if(void 0===this.alpha||this.alpha>=1)return this;if(this.alpha<0)return null;if(void 0!==e.alpha&&e.alpha<1)return null;var t=this.mix(e,this.alpha);return delete t.alpha,t},e.fromCSSColor=function(t){var i=-1,a=-1,r=-1;if((t=t.toLowerCase()).startsWith("rgb(")){var l=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;if(null===(o=t.match(l)))return null;i=o[1],a=o[2],r=o[3]}else if(t.startsWith("rgba(")){var o;if(l=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(o=t.match(l)))return null;i=o[1],a=o[2],r=o[3]}else{if("#"!=t.charAt(0)){if(!(t in n.CSSColorLookup))return null;t=n.CSSColorLookup[t]}var s=function(e){for(var t={a:10,b:11,c:12,d:13,e:14,f:15},i=0,a=0;a<e.length;++a)i=16*i+parseInt(e.charAt(a)in t?t[e.charAt(a)]:e.charAt(a));return i};4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2)),i=s(t.substring(1,3)),a=s(t.substring(3,5)),r=s(t.substring(5,7))}return new e(i,a,r)},e}();t.ColorObj=r},7139(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,r=t.length;n<r;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.CommonUtil=void 0;var n=i(9910),r=i(4566),l=i(7011),o=i(1950),s=i(3946),u=i(1686),d=i(3864),c=i(5279),m=function(){function e(){}return e.wordCount=function(e){return 0===(e=e.trim()).length?0:e.split(/\s+/g).length},e.isTabbable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;if(t.hasAttribute("inert")||u.DOMUtil.getAncestorWithAttribute(t,"inert",""))return!1;if(t.hasAttribute("tabindex"))return parseInt(t.getAttribute("tabindex"))>=0;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}var n=t.getAttribute("contenteditable");return"true"===n||""===n},e.isFocusable=function(t){return"undefined"!==t&&null!==t&&e.isTabbable(t)},e.isClickable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!(!l.AriaUtil.isWidget(t)||!t.hasAttribute("tabindex"))},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e.tabIndexLEZero=function(t){if(e.hasAttribute(t,"tabindex")&&t.getAttribute("tabindex").match(/^-?\d+$/)){var i=parseInt(t.getAttribute("tabindex"));return 0===i||-1===i}return!1},e.getTabbableChildren=function(t){var i=0;if(t.firstChild||"IFRAME"===t.nodeName.toUpperCase())for(var a=new d.DOMWalker(t);a.nextNode()&&a.node!=t;)1==a.node.nodeType&&!a.bEndTag&&e.isTabbable(a.node)&&++i;return i},e.normalizeSpacing=function(e){return e?e.trim().replace(/\s+/g," "):""},e.isHtmlEquiv=function(e,t){var i=!1;if(e&&"input"===e.nodeName.toLowerCase()){var a=e.getAttribute("type").toLowerCase();a&&(-1!=t.indexOf("checkbox")?i="checkbox"===a:-1!=t.indexOf("radio")&&(i="radio"===a))}return i},e.nonExistantIDs=function(t,i){var a="";if(e.normalizeSpacing(i).length<1)return a;for(var n=i.split(" "),r=t.ownerDocument,l=0;l<n.length;l++){var o="//*[@id='"+n[l]+"']";r.evaluate(o,t,r.defaultNSResolver,0,null).iterateNext()||(a+=n[l]+", ")}return e.normalizeSpacing(a).length>=2?a.substring(0,a.length-2):""},e.getDocElementsByTag=function(e,t){var i=c.FragmentUtil.getOwnerFragment(e);t=t.toLowerCase();var a=r.CacheUtil.getCache(i,"RPT_DOCELEMSBYTAG",{});return t in a||(a[t]=i.querySelectorAll(t),r.CacheUtil.setCache(i,"RPT_DOCELEMSBYTAG",a)),a[t]},e.getChildByTag=function(t,i){return e.getChildByTagHidden(t,i,!1,!1)},e.getChildByTagHidden=function(t,i,a,n){for(var r=[],l=t.firstChild;null!=l;){if(l.nodeName.toLowerCase()===i){if((a||n&&!e.shouldCheckHiddenContent(l))&&!s.VisUtil.isNodeVisible(l)){l=l.nextSibling;continue}r.push(l)}l=l.nextSibling}return r},e.getElementsByRole=function(t,i){return e.getElementsByRoleHidden(t,i,!1,!1)},e.getElementsByRoleHidden=function(t,i,a,n){var o=null;if(null===(o=n?r.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",null):r.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE",null))){o={};for(var s=t.body;null!==d.DOMWalker.parentNode(s);)s=d.DOMWalker.parentNode(s);for(var u=new d.DOMWalker(s);u.nextNode();)if(u.elem()&&!u.bEndTag){var c=[];if(u.elem()&&u.elem().hasAttribute("role")&&(c=u.elem().getAttribute("role").split(" ")),u.elem()&&0===c.length&&n){var m=l.AriaUtil.getImplicitRole(u.node);null!==m&&m.length>0&&(c=m)}if(0===c.length)continue;if(a&&e.shouldNodeBeSkippedHidden(u.node))continue;for(var p=0;p<c.length;++p)c[p]in o||(o[c[p]]=[]),o[c[p]].push(u.node)}n?r.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",o):r.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE",o)}var h=[];if("string"==typeof i){var g=i;(i=[]).push(g)}if(i.length)for(p=0;p<i.length;++p){var b=o[i[p]];if(b)for(var _=0;_<b.length;++_)h.push(b[_])}return h},e.isTarget=function(t){if(!t||1!==t.nodeType||["html","body"].includes(t.nodeName.toLowerCase())||null!==e.getAncestor(t,["svg","pre","code","script","meta","head"])||!s.VisUtil.isNodeVisible(t)||s.VisUtil.isNodeVisuallyHidden(t)||e.isNodeDisabled(t)||s.VisUtil.isElementOffscreen(t))return!1;if(e.isClickable(t))return!0;var i=l.AriaUtil.getResolvedRole(t);if(!i)return!1;if(["listitem","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","treeitem"].includes(i)){var a=t.parentElement;if(a&&"group"===l.AriaUtil.getResolvedRole(a)&&(a=a.parentElement),a&&e.isTarget(a))return!0}return!1},e.getFileExt=function(e){var t=e.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);return null!=t&&t.length>=2?"."+t[1]:""},e.getFileAnchor=function(e){var t=e.match(/#(([^;?\.]|^$)+)([;?]|$)/);return null!=t&&t.length>=2?t[1]:""},e.checkObjEmbed=function(t,i,a){var n=t.nodeName.toLowerCase();if("object"!=n&&"embed"!=n&&"a"!=n&&"area"!=n)return!1;var r=!1;if(!r&&t.hasAttribute("type")&&(r=a(t.getAttribute("type").toLowerCase())),!r&&t.hasAttribute("codetype")&&(r=a(t.getAttribute("codetype"))),!r){var l="";"embed"===n?l=t.getAttribute("src"):"a"===n||"area"===n?l=t.getAttribute("href"):t.hasAttribute("data")&&(l=t.getAttribute("data")),null===l&&(l=""),r=i(e.getFileExt(l))}if(!r&&"object"===n)for(var o=e.getChildByTagHidden(t,"param",!1,!0),s=0;!r&&null!=o&&s<o.length;++s)r=o[s].hasAttribute("value")&&i(e.getFileExt(o[s].getAttribute("value")));return r},e.isAudioObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isAudioExt,function(e){return e.startsWith("audio")})},e.isAudioExt=function(t){return e.valInArray(t.toLowerCase(),[".aif",".aifc",".aiff",".air",".asf",".au",".cda",".dsm",".dss",".dwd",".iff",".kar",".m1a",".med",".mp2",".mp3",".mpa",".pcm",".ra",".ram",".rm",".sam",".sf",".sf2",".smp",".snd",".svx",".ul",".voc",".wav",".wma",".wve"])},e.isVideoObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isVideoExt,function(e){return e.startsWith("video")||e.startsWith("application/x-shockwave-flash")})},e.isVideoExt=function(t){return e.valInArray(t.toLowerCase(),[".asf",".avi",".divx",".dv",".m1v",".m2p",".m2v",".moov",".mov",".mp4",".mpeg",".mpg",".mpv",".ogm",".omf",".qt",".rm",".rv",".smi",".smil",".swf",".vob",".wmv",".rmvb",".mvb"])},e.isImageObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isImgExt,function(e){return e.startsWith("image")})},e.isImgExt=function(t){return e.valInArray(t.toLowerCase(),e.image_extensions)},e.isHtmlExt=function(t){return e.valInArray(t.toLowerCase(),[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml"])},e.hasTriggered=function(e,t){return r.CacheUtil.getCache(e,t,!1)},e.triggerOnce=function(e,t,i){if(i)return!0;var a=r.CacheUtil.getCache(e,t,!1);return r.CacheUtil.setCache(e,t,!0),a},e.valInArray=function(e,t){for(var i in t)if(t[i]===e)return!0;return!1},e.getAncestor=function(e,t){for(var i=e;null!==i;){var a=i.nodeName.toLowerCase();if("string"==typeof t){if(a===t.toLowerCase())break}else if(t.length){for(var n in t)if(t[n]===a)return i}else if(a in t)break;i=d.DOMWalker.parentNode(i)}return i},e.isSibling=function(e,t){if(e&&t){var i=null;for(d.DOMWalker.parentNode(e)&&d.DOMWalker.parentNode(e).firstChild&&(i=d.DOMWalker.parentNode(e).firstChild);i;){if(i===t)return!0;i=i.nextSibling}}return!1},e.isDescendant=function(e,t){for(var i=d.DOMWalker.parentNode(t);null!=i;){if(i===e)return!0;i=d.DOMWalker.parentNode(i)}return!1},e.isDisabledByFirstChildFormElement=function(t){var i=["input","textarea","select","keygen","progress","meter","output"];if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(i.includes(a.node.nodeName.toLowerCase()))return!!e.isNodeDisabled(a.node);return!1},e.isDisabledByReferringElement=function(t){for(var i=t.getAttribute("id"),a=t.ownerDocument.body;null!==d.DOMWalker.parentNode(a);)a=d.DOMWalker.parentNode(a);for(var n=new d.DOMWalker(a);n.nextNode();)if(n.node&&1===n.node.nodeType&&n.elem()&&(n.elem().getAttribute("aria-describedby")||"").split(" ").includes(i)&&e.isNodeDisabled(n.node))return!0},e.getInputLabel=function(t){return e.getLabelForElement(t)},e.getLabelForElement=function(t){return e.getLabelForElementHidden(t,!1)},e.getLabelForElementHidden=function(t,i){var a=t.getRootNode();if(!r.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",null)){for(var n={},l=e.getDocElementsByTag(t,"label"),o=0;o<l.length;++o)if(l[o].hasAttribute("for")){if(i&&!s.VisUtil.isNodeVisible(l[o]))continue;n[l[o].getAttribute("for")]=l[o]}r.CacheUtil.setCache((a.nodeType,a),"AriaUtil_LABELS",n)}if(t.hasAttribute("id")){var u=t.getAttribute("id");if(u.trim().length>0)return r.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",{})[u]}return null},e.getElementAttribute=function(e,t){if(!(t&&e&&e.hasAttribute&&e.hasAttribute(t)))return null;var i=e.getAttribute(t);if(!n.ARIADefinitions.referenceProperties.includes(t))return i;for(var a=i.split(/ +/g),r=!1,l=0;a<a.length;++l){var o=document.getElementById(a[l]);if(o&&!u.DOMUtil.sameNode(o,e)){r=!0;break}}return r?i:null},e.hasImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);return a=e.removeAllFormElementsFromLabel(a),e.hasInnerContentHidden(a)}return!1},e.getImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);a=e.removeAllFormElementsFromLabel(a);var n=e.getInnerText(a);return n&&""!==n.trim()?n.trim():null}return null},e.getFormFieldLabel=function(t){var i="",a=null,n=e.getLabelForElementHidden(t,!0);if(n)a=n.innerText;else{if(!(n=e.getAncestor(t,"label"))||"label"!==n.tagName.toLowerCase()||!e.isFirstFormElement(n,t))return null;var r=n.cloneNode(!0);r=e.removeAllFormElementsFromLabel(r),a=e.getInnerText(r)}return a&&""!==a.trim()&&(i+=a.trim()),(a=e.getLabelTextFromAttribute(n,!0))&&""!==a.trim()&&(i+=a.trim()),(a=l.AriaUtil.getAriaLabel(n))&&""!==a.trim()&&(i+=a.trim()),i.trim()},e.getLabelTextFromAttribute=function(t,i){for(var a=null,n=0;n<t.children.length;n++){var r=t.children.item(n);if(e.form_labelable_elements.includes(r.nodeName.toLowerCase())){a=r;break}}for(var c=new d.DOMWalker(t),m="";c.nextNode()&&c.node!==t;)if(c.node&&1===c.node.nodeType&&c.elem()){var p=c.elem();if(i&&(s.VisUtil.isNodeHiddenFromAT(p)||s.VisUtil.isNodePresentational(p))||a&&a.contains(p))continue;var h=l.AriaUtil.getResolvedRole(p);if("textbox"===h){var g=p.getAttribute("value");g&&g.trim().length>0&&(m+=" "+g.trim())}else if("combobox"===h||"listbox"===h){var b=p.getAttribute("aria-activedescendant")||p.getAttribute("aria-selected")||p.getAttribute("aria-checked");if(b){var _=p.ownerDocument.getElementById(b);if(_&&!u.DOMUtil.sameNode(p,_)){var f=o.AccNameUtil.computeAccessibleName(_);f&&f.name&&(m+=" "+f.name.trim())}}}else if(["progressbar","scrollbar","slider","spinbutton","meter"].includes(h)){var v=p.getAttribute("aria-valuetext");v&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("aria-valuenow"))&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("value"))&&v.trim().length>0&&(m+=" "+v.trim())}var A=l.AriaUtil.getAriaLabel(p);A&&""!==A.trim()&&(m+=" "+A.trim())}return m.trim()},e.isFirstFormElement=function(t,i){if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(-1!==e.form_labelable_elements.indexOf(a.node.nodeName.toLowerCase()))return a.node===i;return!1},e.isShadowHostElement=function(t){if(e.isShadowElement(t))return!1;for(var i=t;i;){if(i.shadowRoot)return!0;i=d.DOMWalker.parentElement(i)}return!1},e.isShadowElement=function(e){return"[object ShadowRoot]"===e.getRootNode().toString()},e.removeAllFormElementsFromLabel=function(e){for(var t=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"],i=e.childNodes,a=0;a<i.length;a++)t.indexOf(i[a].nodeName.toLowerCase())>-1&&e.removeChild(i[a]);return e},e.isIdReferToSelf=function(e,t){if(!t||""===t.trim())return!1;for(var i=t.trim().split(" "),a=0,n=i.length;a<n;++a){var r=c.FragmentUtil.getById(e,i[a]);if(r&&u.DOMUtil.sameNode(r,e))return!0}return!1},e.nodeDepth=function(e){for(var t=0,i=e;null!==i;)i=d.DOMWalker.parentNode(i),t+=1;return t},e.compareNodeOrder=function(t,i){if(t===i)return 0;var a=e.nodeDepth(t),n=e.nodeDepth(i);if(n>a){for(var r=0;r<n-a;++r)i=d.DOMWalker.parentNode(i);if(t===i)return-2}else if(a>n){for(r=0;r<a-n;++r)t=d.DOMWalker.parentNode(t);if(t===i)return 2}for(;null!=t&&null!=i&&d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i);)t=d.DOMWalker.parentNode(t),i=d.DOMWalker.parentNode(i);if(null===t||null===i||d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i))return null;for(;null!=i&&i!=t;)i=i.previousSibling;return null===i?1:-1},e.attributeNonEmpty=function(e,t){return e.hasAttribute(t)&&e.getAttribute(t).trim().length>0},e.getFrameByName=function(e,t){for(var i=[e.ownerDocument.defaultView],a=0;a<i.length;){try{if(i[a].name===t)return i[a];for(var n=0;n<i[a].frames.length;++n)try{i[a].frames[n]&&!i.includes(i[a].frames[n])&&i.push(i[a].frames[n])}catch(e){}}catch(e){}++a}return null},e.defaultNSResolver=function(e){var t;switch(e){case"html":t="http://www.w3.org/1999/xhtml";case"x2":t="http://www.w3.org/TR/xhtml2";case"x":t="http://www.w3.org/1999/xhtml";case"xhtml":t="http://www.w3.org/1999/xhtml";default:t=null}return t},e.isInnerTextOnlyEmpty=function(t){var i=t.innerText;null!=i&&0!==i.trim().length||"slot"===t.nodeName.toLowerCase()||void 0===t.textContent||(i=t.textContent);var a=!(null!==i&&i.trim().length>0);if(1===t.nodeType&&"slot"===t.nodeName.toLowerCase())for(var n=0,r=t.assignedNodes();n<r.length;n++){var l=r[n];a=a&&e.isInnerTextEmpty(l)}return a},e.getInnerText=function(e){var t=e.innerText;return null!=t&&""!==t.trim()||(t=e.textContent),t},e.getOnScreenInnerText=function(t){if(!t)return null;if(3===t.nodeType)return t.nodeValue();for(var i="",a=new d.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){if(1===a.node.nodeType&&(s.VisUtil.hiddenByDefaultElements.includes(a.node.nodeName.toLowerCase())||!s.VisUtil.isNodeVisible(a.node)||s.VisUtil.isElementOffscreen(a.node))){if("title"===a.node.nodeName.toLowerCase()&&e.getAncestor(a.node,"svg"))continue;if(a.node.nextSibling){3===a.node.nextSibling.nodeType&&a.node.nextSibling.nodeValue&&""!==a.node.nextSibling.nodeValue.trim()&&(i+=" "+a.node.nextSibling.nodeValue.trim()),a.node=a.node.nextSibling;continue}break}3===a.node.nodeType&&a.node.nodeValue&&""!==a.node.nodeValue.trim()&&(i+=" "+a.node.nodeValue.trim())}return i.trim()},e.getNodeText=function(e){if(!e)return"";for(var t="",i=e.childNodes,a=0;a<i.length;++a)3==i[a].nodeType&&(t+=i[a].nodeValue);return t},e.isInnerTextEmpty=function(t){var i=e.getInnerText(t);return!(null!=i&&i.trim().length>0)},e.hasInnerContent=function(t){var i=e.getInnerText(t),a=null!==i&&i.trim().length>0;if(null!==t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode();)a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt");return a},e.hasInnerContentHidden=function(t){return e.hasInnerContentHiddenHyperLink(t,!1)},e.svgHasName=function(t){return e.attributeNonEmpty(t,"aria-label")||e.attributeNonEmpty(t,"aria-labelledby")||!!t.querySelector(":scope > title")},e.hasInnerContentHiddenHyperLink=function(t,i){if(!t)return!1;var a=!1;if(null!=t.firstElementChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;){var r=n.node;if(!((a="img"===r.nodeName.toLowerCase()&&(e.attributeNonEmpty(r,"alt")||e.attributeNonEmpty(r,"title"))&&!s.VisUtil.isNodeHiddenFromAT(r)&&!s.VisUtil.isNodePresentational(r)||"svg"===r.nodeName.toLowerCase()&&e.svgHasName(r))||1!==r.nodeType||s.VisUtil.isNodeHiddenFromAT(r)||s.VisUtil.isNodePresentational(r)||(a=!e.isInnerTextOnlyEmpty(r))||!0!==i)){a=e.attributeNonEmpty(r,"aria-label")||e.attributeNonEmpty(r,"aria-labelledby");var l=r.ownerDocument;if(l){var o=l.defaultView;if(o){var u=o.getComputedStyle(r);a||null==u||(a=(u.backgroundImage&&u.backgroundImage.indexOf||u.content)&&e.attributeNonEmpty(r,"alt"))}}}3===r.nodeType&&d.DOMWalker.parentElement(r)===t&&(a=!e.isInnerTextEmpty(r))}else a=!e.isInnerTextEmpty(t);return a},e.hasInnerContentOrAlt=function(t){var i=e.getInnerText(t),a=null!=i&&i.trim().length>0||e.attributeNonEmpty(t,"alt");if(null!=t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;)!(a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt"))&&(l.AriaUtil.hasRole(n.node,"button",!0)||l.AriaUtil.hasRole(n.node,"textbox"))&&(l.AriaUtil.hasAriaLabel(n.node)||e.attributeNonEmpty(n.node,"title")||e.getLabelForElementHidden(n.elem(),!0))&&(a=!0);return a},e.concatUniqueArrayItem=function(e,t){return-1===t.indexOf(e)&&null!==e&&t.push(e),t},e.concatUniqueArrayItemList=function(t,i){for(var a=0;null!==t&&a<t.length;a++)i=e.concatUniqueArrayItem(t[a],i);return i},e.reduceArrayItemList=function(e,t){return t&&t.length>0&&e&&e.length>0?t.filter(function(t){return!e.includes(t)}):t},e.getScopeForTh=function(e){if(e.hasAttribute("scope")){var t=e.getAttribute("scope").toLowerCase();if("row"===t||"rowgroup"===t)return"row";if("col"===t||"colgroup"===t)return"column"}var i=a([],e.parentElement.children,!0).filter(function(e){return 1===e.nodeType&&"th"!=e.tagName.toLowerCase()});return null===i||0===i.length?"column":"row"},e.getControlOfLabel=function(t){var i=e.getAncestor(t,"label");if(i&&i.hasAttribute("for"))return c.FragmentUtil.getById(t,i.getAttribute("for"));for(var a={},n=t;n;){if(1===n.nodeType){var l=n;l.hasAttribute("id")&&(a[l.getAttribute("id")]=!0)}n=d.DOMWalker.parentNode(n)}if(0===Object.keys(a).length)return null;for(var o=1===t.nodeType?t.getAttribute("aria-labelledby"):null,s=r.CacheUtil.getSetCache(t.ownerDocument,"CommonUtil::getControlOfLabel",function(){return t.ownerDocument.querySelectorAll("*[aria-labelledby]")}),u=0;u<s.length;++u)for(var m=s[u],p=0,h=m.getAttribute("aria-labelledby").split(" ");p<h.length;p++)if(h[p]in a&&!e.isIdReferToSelf(t,o))return m;return null},e.isNodeDisabled=function(t){var i=r.CacheUtil.getCache(t,"PT_NODE_DISABLED",void 0);if(void 0!==i)return i;i=!1,3===t.nodeType&&(t=d.DOMWalker.parentNode(t));var a=t.nodeName.toLowerCase(),l=t.hasAttribute("disabled"),o=i,s=t.hasAttribute("aria-disabled")&&"true"===t.getAttribute("aria-disabled");if(o||l&&n.ARIADefinitions.elementsAllowedDisabled.indexOf(a)>-1||s)return i=!0,r.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),!0;var u=d.DOMWalker.parentNode(t);if(null!=u&&1===u.nodeType){var c=e.isNodeDisabled(u);return c&&(i=!0),r.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),c}return!1},e.shouldCheckHiddenContent=function(e){return!1},e.shouldNodeBeSkippedHidden=function(t){return!e.shouldCheckHiddenContent(t)&&!s.VisUtil.isNodeVisible(t)},e.isfocusableByDefault=function(t){return!("a"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||!("area"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||-1!==["input","select","button","textarea","option","area"].indexOf(t.nodeName.toLowerCase())},e.nonTabableChildCheck=function(t){if(!t.hasAttribute("tabindex")||-1!=parseInt(t.getAttribute("tabindex")))return!1;for(var i=new d.DOMWalker(t);i.nextNode();){var a=i.elem();if(null!==a&&a.hasAttribute("tabindex")&&-1!=parseInt(a.getAttribute("tabindex"))&&!e.hasInnerContent(a))return!1}return!0},e.hasAttribute=function(e,t){var i=!1;if(e.hasAttribute)i=e.hasAttribute(t);else if(e.attributes&&e.attributes.getNamedItem){var a=e.attributes.getNamedItem(t);i=a&&a.specified}return i},e.truncateText=function(e,t){return void 0===t&&(t=150),e&&(e=e.trim()).length>t?e.substring(0,t-1)+"...":e},e.input_type_with_placeholder=["text","search","tel","url","email","password","number"],e.input_text_types=["text","file","password","checkbox","radio","search","tel","url","email","date","number","range","time","color"],e.input_time_types=["date","month","week","time","datetime-local"],e.input_other_types=["range","color","checkbox","radio","file","image"],e.form_button_types=["button","reset","submit"],e.form_labelable_elements=["input","textarea","select","keygen","progress","meter","output","button"],e.tabTagMap={button:function(e){return!e.hasAttribute("disabled")},iframe:!0,input:function(e){if(e.hasAttribute("disabled")||"hidden"===e.getAttribute("type"))return!1;if("radio"===e.getAttribute("type")){var t=e.getAttribute("name");if(!t||0===t.trim().length)return!0;var i=e.ownerDocument.querySelectorAll("input[type='radio'][name='"+t.trim()+"']");if(0===i.length||1===i.length)return!0;for(var a=null,n=0;n<i.length;n++)i[n].checked&&(a=i[n]);return null!==a?!!u.DOMUtil.sameNode(a,e):!!u.DOMUtil.sameNode(i[0],e)}return!0},select:function(e){return!e.hasAttribute("disabled")},textarea:function(e){return!e.hasAttribute("disabled")&&"hidden"!==e.getAttribute("type")},a:function(e){return e.hasAttribute("href")},area:function(e){return e.hasAttribute("href")},audio:function(e){return e.hasAttribute("controls")},video:function(e){return e.hasAttribute("controls")},summary:function(e){return e.parentElement&&"details"===e.parentElement.nodeName.toLowerCase()&&u.DOMUtil.sameNode(a([],e.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],e)},details:function(e){return e.children&&0===a([],e.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()}).length}},e.image_extensions=[".bmp",".gif",".jpg",".jpeg",".pcx",".png"],e}();t.CommonUtil=m},9196(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.TableUtil=void 0;var a=i(3946),n=i(7011),r=i(7139),l=function(){function e(){}return e.isDataTable=function(e){return!(n.AriaUtil.hasRole(e,"none")||n.AriaUtil.hasRole(e,"presentation"))},e.isComplexDataTable=function(t){if("AriaUtil_isComplexDataTable"in t)return!!t.AriaUtil_isComplexDataTable;var i=!1;if(t&&e.isDataTable(t)){for(var a=null,n=null,l=t.getElementsByTagName("tr"),o=l.length,s=0,u=0,d=0,c=0;!i&&c<o;++c)if(a=l[c].getElementsByTagName("th"),n=l[c].getElementsByTagName("td"),u=a.length,0!==(s=n.length)){i=u>1;for(var m=0;!i&&m<u;++m)i=(a[m].hasAttribute("rowspan")||a[m].hasAttribute("colspan"))&&r.CommonUtil.getAncestor(a[m],"table")===t;for(var p=0;!i&&p<s;++p)i=(n[p].hasAttribute("rowspan")||n[p].hasAttribute("colspan")||n[p].hasAttribute("headers")&&r.CommonUtil.normalizeSpacing(n[p].getAttribute("headers")).split(" ").length>2)&&r.CommonUtil.getAncestor(n[p],"table")===t}else u>0&&++d,i=2===d;if(!i){var h=t.getElementsByTagName("thead"),g=h.length;g>0&&((i=g>1)||(i=h[0].getElementsByTagName("tr").length>1))}i||0===o||(i=u>0&&!e.tableHeaderExists(t))}return t.AriaUtil_isComplexDataTable=i,i},e.isTableCellEmpty=function(e){return!e||!a.VisUtil.isNodeVisible(e)||0===e.innerHTML.replace(/&nbsp;/g," ").trim().length},e.isTableRowEmpty=function(t){if(!t||!t.cells||0===t.cells.length||!a.VisUtil.isNodeVisible(t))return!0;for(var i=!0,n=0;i&&n<t.cells.length;n++){var r=t.cells[n];i=e.isTableCellEmpty(r)}return i},e.tableHeaderExists=function(t){var i=t.rows;if(!i||0===i.length)return null;for(var a=!0,n=i[0],l=0;a&&l<i.length;l++)(n=i[l]).parentNode&&"tfoot"===n.parentNode.nodeName.toLowerCase()||(a=e.isTableRowEmpty(n));if(a)return null;for(a=!0,l=0;a&&l<n.cells.length;l++){var o=n.cells[l];a=e.isTableCellEmpty(o)||"th"===o.nodeName.toLowerCase()}if(a)return!0;a=!0;for(var s=0;a&&s<i.length;++s)i[s].parentNode&&"tfoot"===i[s].parentNode.nodeName.toLowerCase()||(a=!i[s].cells||0===i[s].cells.length||0===i[s].cells[0].innerHTML.trim().length||"td"!=i[s].cells[0].nodeName.toLowerCase());if(a)return!0;a=!0;var u=[],d=[];for(l=0;a&&l<i.length;l++)for(var c=i[l],m=0;m<c.cells.length;m++)o=c.cells[m],e.isTableCellEmpty(o)||("td"===o.nodeName.toLowerCase()?o.getAttribute("headers")&&0!==o.getAttribute("headers").trim().length?r.CommonUtil.concatUniqueArrayItemList(o.getAttribute("headers").trim().split(" "),d):a=!1:"th"===o.nodeName.toLowerCase()&&o.getAttribute("id")&&o.getAttribute("id").trim().length>0&&r.CommonUtil.concatUniqueArrayItem(o.getAttribute("id").trim(),u));return!!(a&&u.length>0&&d.every(function(e){return u.includes(e)}))},e.isLayoutTable=function(e){return n.AriaUtil.hasRole(e,"presentation")||n.AriaUtil.hasRole(e,"none")},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e}();t.TableUtil=l},3946(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.VisUtil=void 0;var a=i(4566),n=i(1686),r=i(3864),l=i(7507),o=i(7011),s=i(4919),u=i(167),d=function(){function e(){}return e.isNodeVisible=function(t){3===t.nodeType&&(t=r.DOMWalker.parentNode(t));var i,n=t;if(1!==n.nodeType)return!0;if(!n.ownerDocument)return!0;var l=n.nodeName.toLowerCase();if(null!=e.hiddenByDefaultElements&&null!=e.hiddenByDefaultElements&&e.hiddenByDefaultElements.indexOf(l)>-1)return!1;var o=a.CacheUtil.getCache(n,"PT_NODE_HIDDEN",void 0);if(void 0!==o)return o;if(o=a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1),null===e.unhideableElements||void 0===e.unhideableElements||-1===e.unhideableElements.indexOf(l)){if(!n.ownerDocument.defaultView)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);i=n.ownerDocument.defaultView.getComputedStyle(n,null);var s=n.getAttribute("hidden"),d=o,c="boolean"==typeof n.hidden&&n.hidden;if(!i&&!c&&null==s&&!d)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);if(null!==i&&("none"===i.getPropertyValue("display")||!a.CacheUtil.getCache(n,"Visibility_Check_Parent",null)&&"hidden"===i.getPropertyValue("visibility"))||"block"!==i.getPropertyValue("display")&&(c||null!=s||d))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(e.isContentHidden(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(u.ClipPathUtil.isNodeVisuallyHiddenByClipPath(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1)}var m=r.DOMWalker.parentNode(n);if(null!=m&&1===m.nodeType){a.CacheUtil.setCache(m,"Visibility_Check_Parent",!0);var p=e.isNodeVisible(m);return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",p)}return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0)},e.isNodeVisuallyHidden=function(t){if(!t||1!==t.nodeType)return!1;var i=t,n=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN",void 0);if(void 0===n){var l=s.CSSUtil.getComputedStyle(i);if("absolute"===l.position&&l.clip&&"rect(0px,0px,0px,0px)"===l.clip.replaceAll(" ","")||l.opacity&&parseFloat(l.opacity)<.1)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",!0),!0;var o=r.DOMWalker.parentElement(i);if(!o)return!1;var u=e.isNodeVisuallyHidden(o);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",u),u}return n},e.isContentHidden=function(e){if(!e)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_ContentHidden",void 0);if(void 0!==t)return t;var i=getComputedStyle(e);return i?"hidden"!==i.getPropertyValue("content-visibility")||"inline"===i.getPropertyValue("display")?(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1)},e.isElementOffscreen=function(e){if(!e)return!0;if(1!==e.nodeType)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_Offscreen",void 0);if(void 0!==t)return t;var i=(new l.DOMMapper).getUnadjustedBounds(e);return i?0===i.height||0===i.width||i.top+i.height<=0||i.left+i.width<=0?(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0)},e.isNodeHiddenFromAT=function(t){if(!t)return!1;var i=a.CacheUtil.getCache(t,"PT_NODE_HiddenFromAT",void 0);return void 0!==i?i:e.isNodeVisible(t)&&"true"!==t.getAttribute("aria-hidden")?n.DOMUtil.getAncestorWithAttribute(t,"aria-hidden","true")?(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!1),!1):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0)},e.isNodePresentational=function(e){var t=o.AriaUtil.getResolvedRole(e);return!(!t||"none"!==t&&"presentation"!==t)},e.isElementScrollable=function(e){if(!e)return!1;var t=s.CSSUtil.getComputedStyle(e);if(!t)return!1;var i=t.getPropertyValue("overflow-x"),a=t.getPropertyValue("overflow-y");if("visible"!==i||"hidden"!==a&&"scroll"!==a&&"auto"!==a||(i="auto"),"visible"!==a||"hidden"!==i&&"scroll"!==i&&"auto"!==i||(a="auto"),"clip"===i&&"visible"!==a&&"clip"!==a&&(i="hidden"),"clip"===a&&"visible"!==i&&"clip"!==i&&(a="hidden"),!("visible"!==i&&"hidden"!==i&&"clip"!==i||"visible"!==a&&"hidden"!==a&&"clip"!==a))return!1;if(Math.max(e.offsetWidth,e.offsetHeight)<30||Math.min(e.offsetWidth,e.offsetHeight)<15)return!1;var n=s.CSSUtil.getPixelsFromStyle(t.paddingLeft,e)+s.CSSUtil.getPixelsFromStyle(t.paddingRight,e),r=s.CSSUtil.getPixelsFromStyle(t.paddingTop,e)+s.CSSUtil.getPixelsFromStyle(t.paddingBottom,e);return!(e.scrollWidth-e.clientWidth<1+n&&e.scrollHeight-e.clientHeight<1+r)},e.unhideableElements=["area","param","audio"],e.hiddenByDefaultElements=["script","link","style","head","meta","base","noscript","template","datalist"],e}();t.VisUtil=d},8855(e){e.exports=JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}')}};const t={};function i(a){const n=t[a];if(void 0!==n)return n.exports;const r=t[a]={exports:{}};return e[a].call(r.exports,r,r.exports,i),r.exports}let a={};(()=>{let e=a;Object.defineProperty(e,"__esModule",{value:!0}),e.checkDemo=e.SRViewer=e.SRCursor=e.SRController=e.DOMWalker=e.Config=e.ARIAMapper=e.Checker=e.Context=void 0;var t=i(920);Object.defineProperty(e,"Context",{enumerable:!0,get:function(){return t.Context}});var n=i(7412);Object.defineProperty(e,"Checker",{enumerable:!0,get:function(){return n.Checker}});var r=i(9955);Object.defineProperty(e,"ARIAMapper",{enumerable:!0,get:function(){return r.ARIAMapper}});var l=i(4516);Object.defineProperty(e,"Config",{enumerable:!0,get:function(){return l.Config}});var o=i(3864);Object.defineProperty(e,"DOMWalker",{enumerable:!0,get:function(){return o.DOMWalker}});var s=i(5233);Object.defineProperty(e,"SRController",{enumerable:!0,get:function(){return s.SRController}});var u=i(8195);Object.defineProperty(e,"SRCursor",{enumerable:!0,get:function(){return u.SRCursor}});var d=i(8107);Object.defineProperty(e,"SRViewer",{enumerable:!0,get:function(){return d.SRViewer}}),e.checkDemo=function(e){e||(e=0);var t=new n.Checker;setTimeout(function(){t.check(document.documentElement,["IBM_Accessibility","IBM_Design"]).then(function(e){console.log(e);for(var t={FAIL:0,POTENTIAL:1,MANUAL:2,PASS:3},i=0;i<e.results.length;++i)"PASS"===e.results[i].value[1]&&e.results.splice(i--,1);e.results.sort(function(e,i){return e.category!=i.category?e.category.localeCompare(i.category):e.path.aria===i.path.aria?t[e.value[1]]-t[i.value[1]]:e.path.aria.localeCompare(i.path.aria)});for(var a=null,n=null,r=0,l=e.results;r<l.length;r++){var o=l[r];n!==o.category&&(null!==n&&(console.groupEnd(),console.groupEnd(),a=null),n=o.category,console.group(o.category)),o.path.aria!=a&&(null!==a&&console.groupEnd(),""===(a=o.path.aria)?console.group("page"):console.group(a)),console.log(o.value,o.message)}console.groupEnd(),console.groupEnd()})},e)}})(),ace=a})(); +(function(window) { + window.ace_ibma = ace; +})(typeof window === 'object' ? window : this); \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.09.02/js/ace.js b/rule-server/src/static/archives/2026.09.02/js/ace.js new file mode 100644 index 000000000..84c259eb7 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/js/ace.js @@ -0,0 +1,2 @@ +/*! For license information please see ace.js.LICENSE.txt */ +var ace;(()=>{"use strict";var e={9910(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIADefinitions=void 0;var i=function(){function e(){}return e.nameFromContent=function(t){return t in e.designPatterns&&e.designPatterns[t].nameFrom&&e.designPatterns[t].nameFrom.includes("contents")},e.globalProperties=["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-details","aria-flowto","aria-hidden","aria-keyshortcuts","aria-label","aria-labelledby","aria-live","aria-owns","aria-relevant","aria-roledescription","aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"],e.referenceProperties=["aria-owns","aria-controls","aria-describedby","aria-labelledby","aria-flowto","aria-activedescendant"],e.globalDeprecatedRoles=["directory","doc-biblioentry","doc-endnote"],e.globalDeprecatedProperties=["aria-grabbed","aria-dropeffect"],e.propertyDataTypes={"aria-activedescendant":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-atomic":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-autocomplete":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["inline","list","both","none","undefined"]},"aria-busy":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-checked":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-colcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-controls":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-current":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["page","step","location","date","time","true","false","undefined"]},"aria-describedby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-details":{type:"http://www.w3.org/2001/XMLSchema#idrefs"},"aria-disabled":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-dropeffect":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["copy","move","link","execute","popup","none"]},"aria-errormessage":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-expanded":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-flowto":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!1},"aria-grabbed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-haspopup":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","menu","listbox","tree","grid","dialog"]},"aria-hidden":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-invalid":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","spelling","grammar","undefined"]},"aria-keyshortcuts":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-label":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-labelledby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-level":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-live":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["off","polite","assertive"]},"aria-modal":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiline":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiselectable":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-orientation":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["horizontal","vertical","undefined"]},"aria-owns":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-placeholder":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-posinset":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-pressed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-readonly":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-relevant":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["additions","removals","text","all"]},"aria-required":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-roledescription":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-rowcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-selected":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-setsize":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-sort":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["ascending","descending","other","none"]},"aria-valuemax":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuemin":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuenow":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuetext":{type:"http://www.w3.org/2001/XMLSchema#string"}},e.designPatterns={alert:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},alertdialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},application:{container:null,props:["aria-activedescendant","aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"]},article:{container:null,props:["aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},banner:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},blockquote:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},button:{container:null,props:["aria-expanded","aria-pressed"],reqProps:null,reqChildren:null,htmlEquiv:"button | input[@type='button']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},caption:{container:["figure","grid","table","treegrid"],props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},cell:{container:["row"],props:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},checkbox:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='checkbox']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},code:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},columnheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='col']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},combobox:{container:null,props:["aria-controls","aria-activedescendant","aria-autocomplete","aria-readonly","aria-required"],reqProps:["aria-expanded"],reqChildren:[],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"]},complementary:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},comment:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},contentinfo:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},definition:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},deletion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},dialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},directory:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecated:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"doc-abstract":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-acknowledgments":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-afterword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-appendix":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-backlink":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-biblioentry":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!0,nameFrom:["author"]},"doc-bibliography":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-biblioref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-chapter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-colophon":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-conclusion":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-cover":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0},"doc-credit":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-credits":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-dedication":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-endnote":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-endnotes":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-epigraph":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-epilogue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-errata":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-example":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-footnote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-foreword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossary":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-index":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-introduction":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-noteref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-notice":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-pagebreak":{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0},"doc-pagelist":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pagefooter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-pageheader":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-part":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-preface":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-prologue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pullquote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-qna":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-subtitle":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"]},"doc-tip":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-toc":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},document:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},emphasis:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},feed:{container:null,props:null,reqProps:null,reqChildren:["article"],htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},figure:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},form:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"form",roleType:"landmark",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},generic:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"div | span",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby","aria-roledescription"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"graphics-document":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"]},"graphics-object":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!1,nameFrom:["author"]},"graphics-symbol":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},grid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-readonly","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:"table",roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},gridcell:{container:["row"],props:["aria-colindex","aria-colspan","aria-disabled","aria-errormessage","aria-expanded","aria-haspopup","aria-invalid","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"widget",nameFrom:["author","contents"]},group:{container:null,props:["aria-activedescendant"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},heading:{container:null,props:null,reqProps:["aria-level"],reqChildren:null,htmlEquiv:"h1 | h2 | h3 | h4 | h5 | h6",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},img:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},image:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},insertion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},link:{container:null,props:["aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},list:{container:null,props:null,reqProps:null,reqChildren:["listitem"],htmlEquiv:"ol | ul",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},listbox:{container:null,props:["aria-activedescendant","aria-expanded","aria-multiselectable","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["group","option"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},listitem:{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},log:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},main:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},mark:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"mark",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},marquee:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},math:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!1,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},menu:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menubar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menuitem:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemcheckbox:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemradio:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},meter:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},navigation:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},none:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},note:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},option:{container:["group","listbox"],props:["aria-selected","aria-checked","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"option",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},paragraph:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},presentation:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},progressbar:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},radio:{container:null,props:["aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='radio']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},radiogroup:{container:null,props:["aria-activedescendant","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["radio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},region:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},row:{container:["grid","rowgroup","table","treegrid"],props:["aria-activedescendant","aria-colindex","aria-expanded","aria-level","aria-posinset","aria-rowindex","aria-selected","aria-setsize"],reqProps:null,reqChildren:["cell","columnheader","gridcell","rowheader"],htmlEquiv:"tr",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},rowgroup:{container:["grid","table","treegrid"],props:[],reqProps:null,reqChildren:["row"],htmlEquiv:"tbody | tfoot | thead",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},rowheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='row']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},scrollbar:{container:null,props:["aria-orientation","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-controls","aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},search:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},searchbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='search']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},separator:{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},slider:{container:null,props:["aria-orientation","aria-readonly","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},spinbutton:{container:null,props:["aria-activedescendant","aria-readonly","aria-required","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},status:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},strong:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},subscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},suggestion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},superscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},switch:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},tab:{container:["tablist"],props:["aria-expanded","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},table:{container:null,props:["aria-colcount","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup","caption"],htmlEquiv:"table",roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tablist:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation"],reqProps:null,reqChildren:["tab"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tabpanel:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},term:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"dfn",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},textbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='text']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},time:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},timer:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},toolbar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tooltip:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tree:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation","aria-required"],reqProps:null,reqChildren:["group","treeitem"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treegrid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-orientation","aria-readonly","aria-required","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treeitem:{container:["group","tree"],props:["aria-checked","aria-expanded","aria-level","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]}},e.elementsAllowedDisabled=["button","input","select","textarea","optgroup","option","fieldset"],e.elementsAllowedRequired=["select","textarea"],e.elementsAllowedReadOnly=["textarea"],e.documentConformanceRequirement={abbr:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},address:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},article:{implicitRole:["article"],validRoles:["application","document","feed","main","none","presentation","region"],globalAriaAttributesValid:!0},aside:{implicitRole:["complementary"],validRoles:["doc-dedication","doc-example","doc-footnote","doc-glossary","doc-pullquote","doc-tip","feed","none","note","presentation","region","search"],globalAriaAttributesValid:!0},audio:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},b:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},base:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},bdi:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},bdo:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},blockquote:{implicitRole:["blockquote"],validRoles:["any"],globalAriaAttributesValid:!0},body:{implicitRole:["generic"],validRoles:null,otherDisallowedAriaAttributes:["aria-hidden"],globalAriaAttributesValid:!0},br:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},canvas:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},caption:{implicitRole:["caption"],validRoles:null,globalAriaAttributesValid:!0,allowAttributesFromImplicitRole:!1},cite:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},code:{implicitRole:["code"],validRoles:["any"],globalAriaAttributesValid:!0},col:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},colgroup:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},data:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},datalist:{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},dd:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},del:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0},details:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},dfn:{implicitRole:["term"],validRoles:["any"],globalAriaAttributesValid:!0},dialog:{implicitRole:["dialog"],validRoles:["alertdialog"],globalAriaAttributesValid:!0},dl:{implicitRole:null,validRoles:["group","list","none","presentation"],globalAriaAttributesValid:!0},dt:{implicitRole:["term"],validRoles:["listitem"],globalAriaAttributesValid:!0},em:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},embed:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},fieldset:{implicitRole:["group"],validRoles:["none","presentation","radiogroup"],globalAriaAttributesValid:!0},figcaption:{implicitRole:null,validRoles:["group","none","presentation"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},form:{implicitRole:["form"],validRoles:["none","presentation","search"],globalAriaAttributesValid:!0},head:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},hgroup:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},h1:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h2:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h3:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h4:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h5:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h6:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},hr:{implicitRole:["separator"],validRoles:["doc-pagebreak","none","presentation"],globalAriaAttributesValid:!0},html:{implicitRole:["document"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},i:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},iframe:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},ins:{implicitRole:["insertion"],validRoles:["any"],globalAriaAttributesValid:!0},kbd:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},label:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},legend:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},link:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},main:{implicitRole:["main"],validRoles:null,globalAriaAttributesValid:!0},map:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},mark:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},math:{implicitRole:["math"],validRoles:null,globalAriaAttributesValid:!0},menu:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},meta:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},meter:{implicitRole:["meter"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"],allowAttributesFromImplicitRole:!1},nav:{implicitRole:["navigation"],validRoles:["doc-index","doc-pagelist","doc-toc","menu","menubar","tablist","none","presentation"],globalAriaAttributesValid:!0},noscript:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},object:{implicitRole:null,validRoles:["application","document","img"],globalAriaAttributesValid:!0},ol:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},optgroup:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},option:{implicitRole:["option"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-selected"]},output:{implicitRole:["status"],validRoles:["any"],globalAriaAttributesValid:!0},p:{implicitRole:["paragraph"],validRoles:["any"],globalAriaAttributesValid:!0},param:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},picture:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},pre:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},progress:{implicitRole:["progressbar"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax"]},q:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},rp:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},rt:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},ruby:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},s:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-label","aria-labelledby"]},samp:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},script:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},search:{implicitRole:["search"],validRoles:["search","form","group","none","presentation","region"],globalAriaAttributesValid:!0},slot:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},small:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},source:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},span:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},strong:{implicitRole:["strong"],validRoles:["any"],globalAriaAttributesValid:!0},style:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},sub:{implicitRole:["subscript"],validRoles:["any"],globalAriaAttributesValid:!0},sup:{implicitRole:["superscript"],validRoles:["any"],globalAriaAttributesValid:!0},svg:{implicitRole:["graphics-document"],validRoles:["any"],globalAriaAttributesValid:!0},table:{implicitRole:["table"],validRoles:["any"],globalAriaAttributesValid:!0},template:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},textarea:{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0},tfoot:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},thead:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},time:{implicitRole:["time"],validRoles:["any"],globalAriaAttributesValid:!0},title:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},track:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},u:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},ul:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},var:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},video:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},wbr:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]}},e.documentConformanceRequirementSpecialTags={a:{"with-href":{implicitRole:["link"],validRoles:["button","checkbox","doc-backlink","doc-biblioref","doc-glossref","doc-noteref","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab","treeitem"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-disabled=true"]},"without-href":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},area:{"with-href":{implicitRole:["link"],validRoles:null,globalAriaAttributesValid:!0},"without-href":{implicitRole:["generic"],validRoles:["button","link"],globalAriaAttributesValid:!0}},div:{"child-dl":{implicitRole:["generic"],validRoles:["presentation","none"],globalAriaAttributesValid:!0},"no-child-dl":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},figure:{"child-figcaption":{implicitRole:["figure"],validRoles:["doc-example"],globalAriaAttributesValid:!0},"no-child-figcaption":{implicitRole:["figure"],validRoles:["any"],globalAriaAttributesValid:!0}},footer:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["contentinfo"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0}},header:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["banner"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0}},img:{"img-with-accname":{implicitRole:["img"],validRoles:["button","checkbox","doc-cover","link","menuitem","menuitemcheckbox","menuitemradio","meter","option","progressbar","radio","scrollbar","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"img-without-accname-empty-alt":{implicitRole:["presentation","none"],validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]},"img-without-accname-no-alt":{implicitRole:["img"],validRoles:["presentation","none"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]}},input:{button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"checkbox-with-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch","button"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},"checkbox-without-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},color:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},date:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"datetime-local":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},file:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"]},hidden:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},image:{implicitRole:["button"],validRoles:["checkbox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},month:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},number:{implicitRole:["spinbutton"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},password:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},radio:{implicitRole:["radio"],validRoles:["menuitemradio"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},range:{implicitRole:["slider"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"]},reset:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"search-no-list":{implicitRole:["searchbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"search-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},submit:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"tel-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"tel-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"text-no-list":{implicitRole:["textbox"],validRoles:["combobox","searchbox","spinbutton"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"text-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},time:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"url-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"url-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},week:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"default-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"default-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0}},li:{"child-of-list-role":{implicitRole:["listitem"],validRoles:null,globalAriaAttributesValid:!0},"no-child-of-list-role":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},section:{"with-name":{implicitRole:["region"],validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0},"without-name":{implicitRole:null,validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0}},select:{"no-multiple-attr-size-gt1":{implicitRole:["combobox"],validRoles:["menu"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]},"multiple-attr-size-gt1":{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]}},summary:{"first-summary-of-detail":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-disabled","aria-haspopup"]},"no-first-summary-of-detail":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tbody:{"des-table":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-grid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},td:{"des-table":{implicitRole:["cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},th:{"des-table-row-scope":{implicitRole:["rowheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-table-column-scope":{implicitRole:["columnheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-row-scope":{implicitRole:["rowheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-column-scope":{implicitRole:["columnheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tr:{"des-table":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},default:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},e.relatedAriaHtmlAttributes={"aria-checked":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["checked"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["checked"],htmlAttributeValues:null}]},"aria-disabled":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["disabled"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["disabled"],htmlAttributeValues:null}]},"aria-hidden":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]},{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["until-found"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]}]},"aria-placeholder":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["placeholder"],htmlAttributeValues:null}]},"aria-valuemax":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["max"],htmlAttributeValues:null}]},"aria-valuemin":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["min"],htmlAttributeValues:null}]},"aria-readonly":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"false","false"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"true","true"]}]},"aria-required":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["required"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["required"],htmlAttributeValues:null}]},"aria-colspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["colspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["colspan"],htmlAttributeValues:null}]},"aria-rowspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["rowspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["rowspan"],htmlAttributeValues:null}]}},e.containers=[],e}();t.ARIADefinitions=i;var a=[];for(var n in i.designPatterns){var r=i.designPatterns[n].container;if(null!==r)for(var l=0,o=r;l<o.length;l++){var s=o[l];-1==a.indexOf(s)&&a.push(s)}}i.containers=a},9955(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAMapper=void 0;var r=i(9910),l=i(3103),o=i(1686),s=i(7139),u=i(7011),d=i(5279),c=i(1560),m=i(4566),p=i(3864),h=i(1950),g=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.childrenCanHaveRole=function(e,t){return!(t in r.ARIADefinitions.designPatterns&&r.ARIADefinitions.designPatterns[t].presentationalChildren)},t.prototype.getRole=function(e){return t.nodeToRole(e)},t.prototype.getNamespace=function(){return"aria"},t.prototype.getAttributes=function(e){var i={};if(1===e.nodeType){var a=m.CacheUtil.getCache(e,"ARIAMapper::getAttributes",void 0);if(void 0!==a)return a;for(var n=e,r=0;r<n.attributes.length;++r){var l=n.attributes[r],o=l.name.toLowerCase();o.startsWith("aria-")&&(i[o.substring(5)]=l.nodeValue)}var s=e.nodeName.toLowerCase();t.applyAttrRole(n,"global",i),t.applyAttrRole(n,s,i),m.CacheUtil.setCache(e,"ARIAMapper::getAttributes",i)}else if(3===e.nodeType){var u=t.textAttrValueCalculators;for(var d in u){var c=u[d](e);null!=c&&(i[d]=c)}}return i},t.applyAttrRole=function(e,i,a){var n=t.elemAttrValueCalculators;if(i in n)for(var r in n[i])if(!(r in a)){var l=n[i][r];null!=l&&("string"!=typeof l&&(l=l(e)),a[r]=l)}},t.getAriaOwnedBy=function(e){var t=d.FragmentUtil.getOwnerFragment(e);if(!m.CacheUtil.getCache(t,"ARIAMapper::precalcOwned",!1)){for(var i=t.querySelectorAll("[aria-owns]"),a=0;a<i.length;++a)for(var n=i[a],r=n.getAttribute("aria-owns").split(/ +/g),l=function(e){var i=t.getElementById(r[e]);if(i&&!o.DOMUtil.sameNode(n,i)){for(var a=[],l=i.querySelectorAll("[aria-owns]"),s=0;s<l.length;++s)for(var u=l[s].getAttribute("aria-owns").split(/ +/g),d=0;d<u.length;++d){var c=t.getElementById(u[d]);c&&a.push(c)}if(0===a.length)return m.CacheUtil.setCache(i,"aria-owned",n),"continue";for(var h=n,g=!1;null!==h;){if(a.some(function(e){return o.DOMUtil.sameNode(h,e)})){g=!0;break}h=p.DOMWalker.parentElement(h)}g||m.CacheUtil.setCache(i,"aria-owned",n)}},s=0;s<r.length;++s)l(s);m.CacheUtil.setCache(t,"ARIAMapper::precalcOwned",!0)}return m.CacheUtil.getCache(e,"aria-owned",null)},t.prototype.getNodeHierarchy=function(e){if(!e)return[];if(1!==e.nodeType){for(var i=(s=this.getNodeHierarchy(p.DOMWalker.parentElement(e))).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0},a=[],n=0,r=s;n<r.length;n++){var l=r[n];a.push(l)}return a.push({attributes:{},bounds:this.getBounds(e),namespace:this.getNamespace(),node:e,role:this.getRole(e)||null,rolePath:i.rolePath+"/"+(this.getRole(e)||null),roleCount:{},childrenCanHaveRole:i.childrenCanHaveRole}),a}var o=e;if(!(a=m.CacheUtil.getCache(o,"ARIAMapper::getNodeHierarchy",null))){var s,u=t.getAriaOwnedBy(o);for(u||(u=p.DOMWalker.parentElement(o));u&&1!==u.nodeType;)u=p.DOMWalker.parentElement(o);for(i=(s=u?this.getNodeHierarchy(u):[]).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0};null===i.role;)i=(s=(u=t.getAriaOwnedBy(u)||p.DOMWalker.parentElement(u))?this.getNodeHierarchy(u):[])[s.length-1];var d={attributes:1===o.nodeType?this.getAttributes(o):{},bounds:this.getBounds(o),namespace:this.getNamespace(),node:o,role:this.getRole(o)||null,rolePath:"",roleCount:{},childrenCanHaveRole:!0};i.childrenCanHaveRole?d.childrenCanHaveRole=i.childrenCanHaveRole&&this.childrenCanHaveRole(o,d.role):d.role=null,null!==d.role?(i.roleCount[d.role]=(i.roleCount[d.role]||0)+1,d.rolePath=i.rolePath+"/"+d.role+"["+i.roleCount[d.role]+"]"):d.rolePath=i.rolePath,a=[];for(var c=0,h=s;c<h.length;c++)l=h[c],a.push(l);a.push(d),m.CacheUtil.setCache(o,"ARIAMapper::getNodeHierarchy",a)}return a},t.prototype.reset=function(e){t.nameComputationId=0,this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var i,a=e;i=p.DOMWalker.parentNode(a);)a=i;var n=new c.ARIAWalker(a,!1,a);do{1===n.node.nodeType&&this.getNodeHierarchy(n.node)}while(n.nextNode())},t.prototype.openScope=function(e){null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e);for(var t=0;t<this.hierarchyResults.length;++t)this.hierarchyResults[t].role&&"/"===this.hierarchyResults[t].role[0]&&(this.hierarchyResults[t].role=this.hierarchyResults[t].role?this.hierarchyResults[t].role.substring(1):null);return this.hierarchyResults},t.prototype.pushHierarchy=function(e){var t,i=(t=this.getNodeHierarchy(e))[t.length-1];this.hierarchyRole.push(i.role),null!==i.role&&this.hierarchyPath.push(i),this.hierarchyResults=t},t.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}if(t.length>0){t[t.length-1].role="/"+t[t.length-1].role;var r=p.DOMWalker.parentElement(e);this.hierarchyResults=r?m.CacheUtil.getCache(r,"ARIAMapper::getNodeInfo",[]):[]}return t},t.nodeToRole=function(e){if(3===e.nodeType)return"text";if(1!==e.nodeType)return null;var t=e;if(!t||1!==t.nodeType)return null;if(t.hasAttribute("role")&&t.getAttribute("role").trim().length>0)for(var i=0,a=t.getAttribute("role").trim().split(" ");i<a.length;i++){var n=a[i];if("presentation"===n||"none"===n){if(!s.CommonUtil.isFocusable(t))return null}else if(n in r.ARIADefinitions.designPatterns)return n}var l=u.AriaUtil.getImplicitRole(t),o=l&&0!==l.length?l[0]:null;return"presentation"===o||"none"===o?null:o},t.elemAttrValueCalculators={global:{name:function(e){var t;return null===(t=h.AccNameUtil.computeAccessibleName(e))||void 0===t?void 0:t.name}},datalist:{multiselectable:function(e){var t=e.getAttribute("id");return t&&t.length>0?(e.ownerDocument.querySelector("input[list='"+t+"']"),""+(e.getAttribute("multiple")&&("true"==e.getAttribute("multiple")||""==e.getAttribute("multiple")))):null}},h1:{level:"1"},h2:{level:"2"},h3:{level:"3"},h4:{level:"4"},h5:{level:"5"},h6:{level:"6"},input:{checked:function(e){var t=e.getAttribute("type");return"checkbox"===t||"radio"===t?""+e.checked:null},setsize:function(e){return null},posinset:function(e){return null},owns:function(e){return null}},keygen:{multiselectable:"false"},li:{setsize:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::otherlis",function(){return t.querySelectorAll("ol li, ul li, menu li")});return""+(i.length-a.length)},posinset:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;for(var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=0,n=0;n<i.length;++n){var r=i[n];if(o.DOMUtil.sameNode(t,o.DOMUtil.getAncestor(r,["ol","ul","menu"])))return""+a;++a}return null}},menuitem:{checked:function(e){return""+!(!e.getAttribute("checked")||"true"!=e.getAttribute("checked")&&""!=e.getAttribute("checked"))}},option:{selected:function(e){return""+!(!e.getAttribute("selected")||"true"!=e.getAttribute("selected")&&""!=e.getAttribute("selected"))}},progress:{valuemax:function(e){return e.getAttribute("max")||"1"},valuemin:function(e){return"0"},valuenow:function(e){return e.getAttribute("value")}}},t.textAttrValueCalculators={name:function(e){return e.nodeValue}},t.nameComputationId=0,t}(l.CommonMapper);t.ARIAMapper=g},1560(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAWalker=void 0;var a=i(5279),n=i(9955),r=i(3946),l=i(3864),o=function(){function e(e,t,i){this.root=i||e,9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,this.bEndTag=null!=t&&1==t}return e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var e=!1;do{if(e=!1,this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var t=this.node.slotOwner,i=this.node.slotIndex+1;i<t.assignedNodes().length?(this.node=t.assignedNodes()[i],this.bEndTag=!1):(this.node=t,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(l.DOMWalker.nextSiblingNotOwnedBySlot(this.node))this.node=l.DOMWalker.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var o=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var s=o.indexOf(this.node.getAttribute("id"));s===o.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[s+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!0}}else{var u=this.node,d=this.node,c=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&r.VisUtil.isNodeVisible(u)&&u.contentDocument&&u.contentDocument.documentElement){var m=this.node;this.node=u.contentDocument.documentElement,this.node.ownerElement=m}else 1===this.node.nodeType&&r.VisUtil.isNodeVisible(d)&&d.shadowRoot&&d.shadowRoot.firstChild?(m=this.node,this.node=d.shadowRoot,this.node.ownerElement=m,l.DOMWalker.assignSlots(this.node)):1===this.node.nodeType&&"slot"===d.nodeName.toLowerCase()&&c.assignedNodes().length>0?this.node=c.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!l.DOMWalker.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=l.DOMWalker.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e.prototype.prevNode=function(){var e=!1;do{if(e=!1,this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&r.VisUtil.isNodeVisible(t)&&t.contentDocument&&t.contentDocument.documentElement){var o=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=o}else 1===this.node.nodeType&&r.VisUtil.isNodeVisible(i)&&i.shadowRoot&&i.shadowRoot.lastChild?(o=this.node,this.node=i.shadowRoot,this.node.ownerElement=o,l.DOMWalker.assignSlots(this.node)):1!==this.node.nodeType&&11!==this.node.nodeType||!l.DOMWalker.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=l.DOMWalker.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(l.DOMWalker.previousSiblingNotOwnedBySlot(this.node))this.node=l.DOMWalker.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var s=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var u=s.indexOf(this.node.getAttribute("id"));u===s.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[u+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e}();t.ARIAWalker=o},6858(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AncestorUtil=void 0;var i=function(){function e(){}return e.isPresentationFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase()&&("presentation"===i.getAttribute("role")||"true"===i.getAttribute("aria-hidden")))return!0}return!1},e.isFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase())return!0}return!1},e}();t.AncestorUtil=i},5279(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FragmentUtil=void 0;var i=function(){function e(){}return e.getOwnerFragment=function(e){for(var t=e;t.parentNode&&(t=t.parentNode);)if(11===t.nodeType)return t;return e.ownerDocument},e.getById=function(e,t){return this.getOwnerFragment(e).getElementById(t)},e.getAncestor=function(e,t){var i=e.dom.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e.getAncestorWithRole=function(e,t){var i=e.aria.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e}();t.FragmentUtil=i},1043(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LangUtil=void 0;var i=[["aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","aaa","aab","aac","aad","aae","aaf","aag","aah","aai","aak","aal","aam","aan","aao","aap","aaq","aas","aat","aau","aav","aaw","aax","aaz","aba","abb","abc","abd","abe","abf","abg","abh","abi","abj","abl","abm","abn","abo","abp","abq","abr","abs","abt","abu","abv","abw","abx","aby","abz","aca","acb","acd","ace","acf","ach","aci","ack","acl","acm","acn","acp","acq","acr","acs","act","acu","acv","acw","acx","acy","acz","ada","adb","add","ade","adf","adg","adh","adi","adj","adl","adn","ado","adp","adq","adr","ads","adt","adu","adw","adx","ady","adz","aea","aeb","aec","aed","aee","aek","ael","aem","aen","aeq","aer","aes","aeu","aew","aey","aez","afa","afb","afd","afe","afg","afh","afi","afk","afn","afo","afp","afs","aft","afu","afz","aga","agb","agc","agd","age","agf","agg","agh","agi","agj","agk","agl","agm","agn","ago","agp","agq","agr","ags","agt","agu","agv","agw","agx","agy","agz","aha","ahb","ahg","ahh","ahi","ahk","ahl","ahm","ahn","aho","ahp","ahr","ahs","aht","aia","aib","aic","aid","aie","aif","aig","aih","aii","aij","aik","ail","aim","ain","aio","aip","aiq","air","ais","ait","aiw","aix","aiy","aja","ajg","aji","ajn","ajp","ajt","aju","ajw","ajz","akb","akc","akd","ake","akf","akg","akh","aki","akj","akk","akl","akm","ako","akp","akq","akr","aks","akt","aku","akv","akw","akx","aky","akz","ala","alc","ald","ale","alf","alg","alh","ali","alj","alk","all","alm","aln","alo","alp","alq","alr","als","alt","alu","alv","alw","alx","aly","alz","ama","amb","amc","ame","amf","amg","ami","amj","amk","aml","amm","amn","amo","amp","amq","amr","ams","amt","amu","amv","amw","amx","amy","amz","ana","anb","anc","and","ane","anf","ang","anh","ani","anj","ank","anl","anm","ann","ano","anp","anq","anr","ans","ant","anu","anv","anw","anx","any","anz","aoa","aob","aoc","aod","aoe","aof","aog","aoh","aoi","aoj","aok","aol","aom","aon","aor","aos","aot","aou","aox","aoz","apa","apb","apc","apd","ape","apf","apg","aph","api","apj","apk","apl","apm","apn","apo","app","apq","apr","aps","apt","apu","apv","apw","apx","apy","apz","aqa","aqc","aqd","aqg","aqk","aql","aqm","aqn","aqp","aqr","aqt","aqz","arb","arc","ard","are","arh","ari","arj","ark","arl","arn","aro","arp","arq","arr","ars","art","aru","arv","arw","arx","ary","arz","asa","asb","asc","asd","ase","asf","asg","ash","asi","asj","ask","asl","asn","aso","asp","asq","asr","ass","ast","asu","asv","asw","asx","asy","asz","ata","atb","atc","atd","ate","atg","ath","ati","atj","atk","atl","atm","atn","ato","atp","atq","atr","ats","att","atu","atv","atw","atx","aty","atz","aua","aub","auc","aud","aue","auf","aug","auh","aui","auj","auk","aul","aum","aun","auo","aup","auq","aur","aus","aut","auu","auw","aux","auy","auz","avb","avd","avi","avk","avl","avm","avn","avo","avs","avt","avu","avv","awa","awb","awc","awd","awe","awg","awh","awi","awk","awm","awn","awo","awr","aws","awt","awu","awv","aww","awx","awy","axb","axe","axg","axk","axl","axm","axx","aya","ayb","ayc","ayd","aye","ayg","ayh","ayi","ayk","ayl","ayn","ayo","ayp","ayq","ayr","ays","ayt","ayu","ayx","ayy","ayz","aza","azb","azc","azd","azg","azj","azm","azn","azo","azt","azz"],["ba","be","bg","bh","bi","bm","bn","bo","br","bs","baa","bab","bac","bad","bae","baf","bag","bah","bai","baj","bal","ban","bao","bap","bar","bas","bat","bau","bav","baw","bax","bay","baz","bba","bbb","bbc","bbd","bbe","bbf","bbg","bbh","bbi","bbj","bbk","bbl","bbm","bbn","bbo","bbp","bbq","bbr","bbs","bbt","bbu","bbv","bbw","bbx","bby","bbz","bca","bcb","bcc","bcd","bce","bcf","bcg","bch","bci","bcj","bck","bcl","bcm","bcn","bco","bcp","bcq","bcr","bcs","bct","bcu","bcv","bcw","bcy","bcz","bda","bdb","bdc","bdd","bde","bdf","bdg","bdh","bdi","bdj","bdk","bdl","bdm","bdn","bdo","bdp","bdq","bdr","bds","bdt","bdu","bdv","bdw","bdx","bdy","bdz","bea","beb","bec","bed","bee","bef","beg","beh","bei","bej","bek","bem","beo","bep","beq","ber","bes","bet","beu","bev","bew","bex","bey","bez","bfa","bfb","bfc","bfd","bfe","bff","bfg","bfh","bfi","bfj","bfk","bfl","bfm","bfn","bfo","bfp","bfq","bfr","bfs","bft","bfu","bfw","bfx","bfy","bfz","bga","bgb","bgc","bgd","bge","bgf","bgg","bgi","bgj","bgk","bgl","bgm","bgn","bgo","bgp","bgq","bgr","bgs","bgt","bgu","bgv","bgw","bgx","bgy","bgz","bha","bhb","bhc","bhd","bhe","bhf","bhg","bhh","bhi","bhj","bhk","bhl","bhm","bhn","bho","bhp","bhq","bhr","bhs","bht","bhu","bhv","bhw","bhx","bhy","bhz","bia","bib","bic","bid","bie","bif","big","bij","bik","bil","bim","bin","bio","bip","biq","bir","bit","biu","biv","biw","bix","biy","biz","bja","bjb","bjc","bjd","bje","bjf","bjg","bjh","bji","bjj","bjk","bjl","bjm","bjn","bjo","bjp","bjq","bjr","bjs","bjt","bju","bjv","bjw","bjx","bjy","bjz","bka","bkb","bkc","bkd","bkf","bkg","bkh","bki","bkj","bkk","bkl","bkm","bkn","bko","bkp","bkq","bkr","bks","bkt","bku","bkv","bkw","bkx","bky","bkz","bla","blb","blc","bld","ble","blf","blg","blh","bli","blj","blk","bll","blm","bln","blo","blp","blq","blr","bls","blt","blv","blw","blx","bly","blz","bma","bmb","bmc","bmd","bme","bmf","bmg","bmh","bmi","bmj","bmk","bml","bmm","bmn","bmo","bmp","bmq","bmr","bms","bmt","bmu","bmv","bmw","bmx","bmy","bmz","bna","bnb","bnc","bnd","bne","bnf","bng","bni","bnj","bnk","bnl","bnm","bnn","bno","bnp","bnq","bnr","bns","bnt","bnu","bnv","bnw","bnx","bny","bnz","boa","bob","boe","bof","bog","boh","boi","boj","bok","bol","bom","bon","boo","bop","boq","bor","bot","bou","bov","bow","box","boy","boz","bpa","bpb","bpd","bpe","bpg","bph","bpi","bpj","bpk","bpl","bpm","bpn","bpo","bpp","bpq","bpr","bps","bpt","bpu","bpv","bpw","bpx","bpy","bpz","bqa","bqb","bqc","bqd","bqf","bqg","bqh","bqi","bqj","bqk","bql","bqm","bqn","bqo","bqp","bqq","bqr","bqs","bqt","bqu","bqv","bqw","bqx","bqy","bqz","bra","brb","brc","brd","brf","brg","brh","bri","brj","brk","brl","brm","brn","bro","brp","brq","brr","brs","brt","bru","brv","brw","brx","bry","brz","bsa","bsb","bsc","bse","bsf","bsg","bsh","bsi","bsj","bsk","bsl","bsm","bsn","bso","bsp","bsq","bsr","bss","bst","bsu","bsv","bsw","bsx","bsy","bta","btb","btc","btd","bte","btf","btg","bth","bti","btj","btk","btl","btm","btn","bto","btp","btq","btr","bts","btt","btu","btv","btw","btx","bty","btz","bua","bub","buc","bud","bue","buf","bug","buh","bui","buj","buk","bum","bun","buo","bup","buq","bus","but","buu","buv","buw","bux","buy","buz","bva","bvb","bvc","bvd","bve","bvf","bvg","bvh","bvi","bvj","bvk","bvl","bvm","bvn","bvo","bvp","bvq","bvr","bvt","bvu","bvv","bvw","bvx","bvy","bvz","bwa","bwb","bwc","bwd","bwe","bwf","bwg","bwh","bwi","bwj","bwk","bwl","bwm","bwn","bwo","bwp","bwq","bwr","bws","bwt","bwu","bww","bwx","bwy","bwz","bxa","bxb","bxc","bxd","bxe","bxf","bxg","bxh","bxi","bxj","bxk","bxl","bxm","bxn","bxo","bxp","bxq","bxr","bxs","bxu","bxv","bxw","bxx","bxz","bya","byb","byc","byd","bye","byf","byg","byh","byi","byj","byk","byl","bym","byn","byo","byp","byq","byr","bys","byt","byv","byw","byx","byy","byz","bza","bzb","bzc","bzd","bze","bzf","bzg","bzh","bzi","bzj","bzk","bzl","bzm","bzn","bzo","bzp","bzq","bzr","bzs","bzt","bzu","bzv","bzw","bzx","bzy","bzz"],["ca","ce","ch","co","cr","cs","cu","cv","cy","caa","cab","cac","cad","cae","caf","cag","cah","cai","caj","cak","cal","cam","can","cao","cap","caq","car","cas","cau","cav","caw","cax","cay","caz","cba","cbb","cbc","cbd","cbe","cbg","cbh","cbi","cbj","cbk","cbl","cbn","cbo","cbq","cbr","cbs","cbt","cbu","cbv","cbw","cby","cca","ccc","ccd","cce","ccg","cch","ccj","ccl","ccm","ccn","cco","ccp","ccq","ccr","ccs","cda","cdc","cdd","cde","cdf","cdg","cdh","cdi","cdj","cdm","cdn","cdo","cdr","cds","cdy","cdz","cea","ceb","ceg","cek","cel","cen","cet","cey","cfa","cfd","cfg","cfm","cga","cgc","cgg","cgk","chb","chc","chd","chf","chg","chh","chj","chk","chl","chm","chn","cho","chp","chq","chr","cht","chw","chx","chy","chz","cia","cib","cic","cid","cie","cih","cik","cim","cin","cip","cir","ciw","ciy","cja","cje","cjh","cji","cjk","cjm","cjn","cjo","cjp","cjr","cjs","cjv","cjy","cka","ckb","ckh","ckl","ckm","ckn","cko","ckq","ckr","cks","ckt","cku","ckv","ckx","cky","ckz","cla","clc","cld","cle","clh","cli","clj","clk","cll","clm","clo","clt","clu","clw","cly","cma","cmc","cme","cmg","cmi","cmk","cml","cmm","cmn","cmo","cmr","cms","cmt","cna","cnb","cnc","cng","cnh","cni","cnk","cnl","cno","cnp","cnr","cns","cnt","cnu","cnw","cnx","coa","cob","coc","cod","coe","cof","cog","coh","coj","cok","col","com","con","coo","cop","coq","cot","cou","cov","cow","cox","coy","coz","cpa","cpb","cpc","cpe","cpf","cpg","cpi","cpn","cpo","cpp","cps","cpu","cpx","cpy","cqd","cqu","cra","crb","crc","crd","crf","crg","crh","cri","crj","crk","crl","crm","crn","cro","crp","crq","crr","crs","crt","crv","crw","crx","cry","crz","csa","csb","csc","csd","cse","csf","csg","csh","csi","csj","csk","csl","csm","csn","cso","csp","csq","csr","css","cst","csu","csv","csw","csx","csy","csz","cta","ctc","ctd","cte","ctg","cth","ctl","ctm","ctn","cto","ctp","cts","ctt","ctu","cty","ctz","cua","cub","cuc","cug","cuh","cui","cuj","cuk","cul","cum","cuo","cup","cuq","cur","cus","cut","cuu","cuv","cuw","cux","cuy","cvg","cvn","cwa","cwb","cwd","cwe","cwg","cwt","cya","cyb","cyo","czh","czk","czn","czo","czt"],["da","de","dv","dz","daa","dac","dad","dae","daf","dag","dah","dai","daj","dak","dal","dam","dao","dap","daq","dar","das","dau","dav","daw","dax","day","daz","dba","dbb","dbd","dbe","dbf","dbg","dbi","dbj","dbl","dbm","dbn","dbo","dbp","dbq","dbr","dbt","dbu","dbv","dbw","dby","dcc","dcr","dda","ddd","dde","ddg","ddi","ddj","ddn","ddo","ddr","dds","ddw","dec","ded","dee","def","deg","deh","dei","dek","del","dem","den","dep","deq","der","des","dev","dez","dga","dgb","dgc","dgd","dge","dgg","dgh","dgi","dgk","dgl","dgn","dgo","dgr","dgs","dgt","dgu","dgw","dgx","dgz","dha","dhd","dhg","dhi","dhl","dhm","dhn","dho","dhr","dhs","dhu","dhv","dhw","dhx","dia","dib","dic","did","dif","dig","dih","dii","dij","dik","dil","dim","din","dio","dip","diq","dir","dis","dit","diu","diw","dix","diy","diz","dja","djb","djc","djd","dje","djf","dji","djj","djk","djl","djm","djn","djo","djr","dju","djw","dka","dkg","dkk","dkl","dkr","dks","dkx","dlg","dlk","dlm","dln","dma","dmb","dmc","dmd","dme","dmf","dmg","dmk","dml","dmm","dmn","dmo","dmr","dms","dmu","dmv","dmw","dmx","dmy","dna","dnd","dne","dng","dni","dnj","dnk","dnn","dno","dnr","dnt","dnu","dnv","dnw","dny","doa","dob","doc","doe","dof","doh","doi","dok","dol","don","doo","dop","doq","dor","dos","dot","dov","dow","dox","doy","doz","dpp","dra","drb","drc","drd","dre","drg","drh","dri","drl","drn","dro","drq","drr","drs","drt","dru","drw","dry","dsb","dse","dsh","dsi","dsl","dsn","dso","dsq","dta","dtb","dtd","dth","dti","dtk","dtm","dtn","dto","dtp","dtr","dts","dtt","dtu","dty","dua","dub","duc","dud","due","duf","dug","duh","dui","duj","duk","dul","dum","dun","duo","dup","duq","dur","dus","duu","duv","duw","dux","duy","duz","dva","dwa","dwk","dwl","dwr","dws","dwu","dww","dwy","dwz","dya","dyb","dyd","dyg","dyi","dym","dyn","dyo","dyu","dyy","dza","dzd","dze","dzg","dzl","dzn"],["ee","el","en","eo","es","et","eu","eaa","ebc","ebg","ebk","ebo","ebr","ebu","ecr","ecs","ecy","eee","efa","efe","efi","ega","egl","ego","egx","egy","ehs","ehu","eip","eit","eiv","eja","eka","ekc","eke","ekg","eki","ekk","ekl","ekm","eko","ekp","ekr","eky","ele","elh","eli","elk","elm","elo","elp","elu","elx","ema","emb","eme","emg","emi","emk","emm","emn","emo","emp","emq","ems","emu","emw","emx","emy","emz","ena","enb","enc","end","enf","enh","enl","enm","enn","eno","enq","enr","enu","env","enw","enx","eot","epi","era","erg","erh","eri","erk","ero","err","ers","ert","erw","ese","esg","esh","esi","esk","esl","esm","esn","eso","esq","ess","esu","esx","esy","etb","etc","eth","etn","eto","etr","ets","ett","etu","etx","etz","euq","eve","evh","evn","ewo","ext","eya","eyo","eza","eze"],["fa","ff","fi","fj","fo","fr","fy","faa","fab","fad","faf","fag","fah","fai","faj","fak","fal","fam","fan","fap","far","fat","fau","fax","fay","faz","fbl","fcs","fer","ffi","ffm","fgr","fia","fie","fif","fil","fip","fir","fit","fiu","fiw","fkk","fkv","fla","flh","fli","fll","fln","flr","fly","fmp","fmu","fnb","fng","fni","fod","foi","fom","fon","for","fos","fox","fpe","fqs","frc","frd","frk","frm","fro","frp","frq","frr","frs","frt","fse","fsl","fss","fub","fuc","fud","fue","fuf","fuh","fui","fuj","fum","fun","fuq","fur","fut","fuu","fuv","fuy","fvr","fwa","fwe"],["ga","gd","gl","gn","gu","gv","gaa","gab","gac","gad","gae","gaf","gag","gah","gai","gaj","gak","gal","gam","gan","gao","gap","gaq","gar","gas","gat","gau","gav","gaw","gax","gay","gaz","gba","gbb","gbc","gbd","gbe","gbf","gbg","gbh","gbi","gbj","gbk","gbl","gbm","gbn","gbo","gbp","gbq","gbr","gbs","gbu","gbv","gbw","gbx","gby","gbz","gcc","gcd","gce","gcf","gcl","gcn","gcr","gct","gda","gdb","gdc","gdd","gde","gdf","gdg","gdh","gdi","gdj","gdk","gdl","gdm","gdn","gdo","gdq","gdr","gds","gdt","gdu","gdx","gea","geb","gec","ged","gef","geg","geh","gei","gej","gek","gel","gem","geq","ges","gev","gew","gex","gey","gez","gfk","gft","gfx","gga","ggb","ggd","gge","ggg","ggk","ggl","ggn","ggo","ggr","ggt","ggu","ggw","gha","ghc","ghe","ghh","ghk","ghl","ghn","gho","ghr","ghs","ght","gia","gib","gic","gid","gie","gig","gih","gii","gil","gim","gin","gio","gip","giq","gir","gis","git","giu","giw","gix","giy","giz","gji","gjk","gjm","gjn","gjr","gju","gka","gkd","gke","gkn","gko","gkp","gku","glb","glc","gld","glh","gli","glj","glk","gll","glo","glr","glu","glw","gly","gma","gmb","gmd","gme","gmg","gmh","gml","gmm","gmn","gmq","gmr","gmu","gmv","gmw","gmx","gmy","gmz","gna","gnb","gnc","gnd","gne","gng","gnh","gni","gnj","gnk","gnl","gnm","gnn","gno","gnq","gnr","gnt","gnu","gnw","gnz","goa","gob","goc","god","goe","gof","gog","goh","goi","goj","gok","gol","gom","gon","goo","gop","goq","gor","gos","got","gou","gow","gox","goy","goz","gpa","gpe","gpn","gqa","gqi","gqn","gqr","gqu","gra","grb","grc","grd","grg","grh","gri","grj","grk","grm","gro","grq","grr","grs","grt","gru","grv","grw","grx","gry","grz","gse","gsg","gsl","gsm","gsn","gso","gsp","gss","gsw","gta","gti","gtu","gua","gub","guc","gud","gue","guf","gug","guh","gui","guk","gul","gum","gun","guo","gup","guq","gur","gus","gut","guu","guv","guw","gux","guz","gva","gvc","gve","gvf","gvj","gvl","gvm","gvn","gvo","gvp","gvr","gvs","gvy","gwa","gwb","gwc","gwd","gwe","gwf","gwg","gwi","gwj","gwm","gwn","gwr","gwt","gwu","gww","gwx","gxx","gya","gyb","gyd","gye","gyf","gyg","gyi","gyl","gym","gyn","gyo","gyr","gyy","gyz","gza","gzi","gzn"],["ha","he","hi","ho","hr","ht","hu","hy","hz","haa","hab","hac","had","hae","haf","hag","hah","hai","haj","hak","hal","ham","han","hao","hap","haq","har","has","hav","haw","hax","hay","haz","hba","hbb","hbn","hbo","hbu","hca","hch","hdn","hds","hdy","hea","hed","heg","heh","hei","hem","hgm","hgw","hhi","hhr","hhy","hia","hib","hid","hif","hig","hih","hii","hij","hik","hil","him","hio","hir","hit","hiw","hix","hji","hka","hke","hkh","hkk","hkn","hks","hla","hlb","hld","hle","hlt","hlu","hma","hmb","hmc","hmd","hme","hmf","hmg","hmh","hmi","hmj","hmk","hml","hmm","hmn","hmp","hmq","hmr","hms","hmt","hmu","hmv","hmw","hmx","hmy","hmz","hna","hnd","hne","hng","hnh","hni","hnj","hnn","hno","hns","hnu","hoa","hob","hoc","hod","hoe","hoh","hoi","hoj","hok","hol","hom","hoo","hop","hor","hos","hot","hov","how","hoy","hoz","hpo","hps","hra","hrc","hre","hrk","hrm","hro","hrp","hrr","hrt","hru","hrw","hrx","hrz","hsb","hsh","hsl","hsn","hss","hti","hto","hts","htu","htx","hub","huc","hud","hue","huf","hug","huh","hui","huj","huk","hul","hum","huo","hup","huq","hur","hus","hut","huu","huv","huw","hux","huy","huz","hvc","hve","hvk","hvn","hvv","hwa","hwc","hwo","hya","hyw","hyx"],["ia","id","ie","ig","ii","ik","in","io","is","it","iu","iw","iai","ian","iap","iar","iba","ibb","ibd","ibe","ibg","ibh","ibi","ibl","ibm","ibn","ibr","ibu","iby","ica","ich","icl","icr","ida","idb","idc","idd","ide","idi","idr","ids","idt","idu","ifa","ifb","ife","iff","ifk","ifm","ifu","ify","igb","ige","igg","igl","igm","ign","igo","igs","igw","ihb","ihi","ihp","ihw","iin","iir","ijc","ije","ijj","ijn","ijo","ijs","ike","iki","ikk","ikl","iko","ikp","ikr","iks","ikt","ikv","ikw","ikx","ikz","ila","ilb","ilg","ili","ilk","ill","ilm","ilo","ilp","ils","ilu","ilv","ilw","ima","ime","imi","iml","imn","imo","imr","ims","imy","inb","inc","ine","ing","inh","inj","inl","inm","inn","ino","inp","ins","int","inz","ior","iou","iow","ipi","ipo","iqu","iqw","ira","ire","irh","iri","irk","irn","iro","irr","iru","irx","iry","isa","isc","isd","ise","isg","ish","isi","isk","ism","isn","iso","isr","ist","isu","itb","itc","itd","ite","iti","itk","itl","itm","ito","itr","its","itt","itv","itw","itx","ity","itz","ium","ivb","ivv","iwk","iwm","iwo","iws","ixc","ixl","iya","iyo","iyx","izh","izi","izr","izz"],["ja","ji","jv","jw","jaa","jab","jac","jad","jae","jaf","jah","jaj","jak","jal","jam","jan","jao","jaq","jar","jas","jat","jau","jax","jay","jaz","jbe","jbi","jbj","jbk","jbm","jbn","jbo","jbr","jbt","jbu","jbw","jcs","jct","jda","jdg","jdt","jeb","jee","jeg","jeh","jei","jek","jel","jen","jer","jet","jeu","jgb","jge","jgk","jgo","jhi","jhs","jia","jib","jic","jid","jie","jig","jih","jii","jil","jim","jio","jiq","jit","jiu","jiv","jiy","jje","jjr","jka","jkm","jko","jkp","jkr","jks","jku","jle","jls","jma","jmb","jmc","jmd","jmi","jml","jmn","jmr","jms","jmw","jmx","jna","jnd","jng","jni","jnj","jnl","jns","job","jod","jog","jor","jos","jow","jpa","jpr","jpx","jqr","jra","jrb","jrr","jrt","jru","jsl","jua","jub","juc","jud","juh","jui","juk","jul","jum","jun","juo","jup","jur","jus","jut","juu","juw","juy","jvd","jvn","jwi","jya","jye","jyy"],["ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","kaa","kab","kac","kad","kae","kaf","kag","kah","kai","kaj","kak","kam","kao","kap","kaq","kar","kav","kaw","kax","kay","kba","kbb","kbc","kbd","kbe","kbf","kbg","kbh","kbi","kbj","kbk","kbl","kbm","kbn","kbo","kbp","kbq","kbr","kbs","kbt","kbu","kbv","kbw","kbx","kby","kbz","kca","kcb","kcc","kcd","kce","kcf","kcg","kch","kci","kcj","kck","kcl","kcm","kcn","kco","kcp","kcq","kcr","kcs","kct","kcu","kcv","kcw","kcx","kcy","kcz","kda","kdc","kdd","kde","kdf","kdg","kdh","kdi","kdj","kdk","kdl","kdm","kdn","kdo","kdp","kdq","kdr","kdt","kdu","kdv","kdw","kdx","kdy","kdz","kea","keb","kec","ked","kee","kef","keg","keh","kei","kej","kek","kel","kem","ken","keo","kep","keq","ker","kes","ket","keu","kev","kew","kex","key","kez","kfa","kfb","kfc","kfd","kfe","kff","kfg","kfh","kfi","kfj","kfk","kfl","kfm","kfn","kfo","kfp","kfq","kfr","kfs","kft","kfu","kfv","kfw","kfx","kfy","kfz","kga","kgb","kgc","kgd","kge","kgf","kgg","kgh","kgi","kgj","kgk","kgl","kgm","kgn","kgo","kgp","kgq","kgr","kgs","kgt","kgu","kgv","kgw","kgx","kgy","kha","lyg","khb","khc","khd","khe","khf","khg","khh","khi","khj","khk","khl","khn","kho","khp","khq","khr","khs","kht","khu","khv","khw","khx","khy","khz","kia","kib","kic","kid","kie","kif","kig","kih","kii","kij","kil","kim","kio","kip","kiq","kis","kit","kiu","kiv","kiw","kix","kiy","kiz","kja","kjb","kjc","kjd","kje","kjf","kjg","kjh","kji","kjj","kjk","kjl","kjm","kjn","kjo","kjp","kjq","kjr","kjs","kjt","kju","kjv","kjx","kjy","kjz","kka","kkb","kkc","kkd","kke","kkf","kkg","kkh","kki","kkj","kkk","kkl","kkm","kkn","kko","kkp","kkq","kkr","kks","kkt","kku","kkv","kkw","kkx","kky","kkz","kla","klb","klc","kld","kle","klf","klg","klh","kli","klj","klk","kll","klm","kln","klo","klp","klq","klr","kls","klt","klu","klv","klw","klx","kly","klz","kma","kmb","kmc","kmd","kme","kmf","kmg","kmh","kmi","kmj","kmk","kml","kmm","kmn","kmo","kmp","kmq","kmr","kms","kmt","kmu","kmv","kmw","kmx","kmy","kmz","kna","knb","knc","knd","kne","knf","kng","kni","knj","knk","knl","knm","knn","kno","knp","knq","knr","kns","knt","knu","knv","knw","knx","kny","knz","koa","koc","kod","koe","kof","kog","koh","koi","koj","kok","kol","koo","kop","koq","kos","kot","kou","kov","kow","kox","koy","koz","kpa","kpb","kpc","kpd","kpe","kpf","kpg","kph","kpi","kpj","kpk","kpl","kpm","kpn","kpo","kpp","kpq","kpr","kps","kpt","kpu","kpv","kpw","kpx","kpy","kpz","kqa","kqb","kqc","kqd","kqe","kqf","kqg","kqh","kqi","kqj","kqk","kql","kqm","kqn","kqo","kqp","kqq","kqr","kqs","kqt","kqu","kqv","kqw","kqx","kqy","kqz","kra","krb","krc","krd","kre","krf","krh","kri","krj","krk","krl","krm","krn","kro","krp","krr","krs","krt","kru","krv","krw","krx","kry","krz","ksa","ksb","ksc","ksd","kse","ksf","ksg","ksh","ksi","ksj","ksk","ksl","ksm","ksn","kso","ksp","ksq","ksr","kss","kst","ksu","ksv","ksw","ksx","ksy","ksz","kta","ktb","ktc","ktd","kte","ktf","ktg","kth","kti","ktj","ktk","ktl","ktm","ktn","kto","ktp","ktq","ktr","kts","ktt","ktu","ktv","ktw","ktx","kty","ktz","kub","kuc","kud","kue","kuf","kug","kuh","kui","kuj","kuk","kul","kum","kun","kuo","kup","kuq","kus","kut","kuu","kuv","kuw","kux","kuy","kuz","kva","kvb","kvc","kvd","kve","kvf","kvg","kvh","kvi","kvj","kvk","kvl","kvm","kvn","kvo","kvp","kvq","kvr","kvs","kvt","kvu","kvv","kvw","kvx","kvy","kvz","kwa","kwb","kwc","kwd","kwe","kwf","kwg","kwh","kwi","kwj","kwk","kwl","kwm","kwn","kwo","kwp","kwq","kwr","kws","kwt","kwu","kwv","kww","kwx","kwy","kwz","kxa","kxb","kxc","kxd","kxe","kxf","kxh","kxi","kxj","kxk","kxl","kxm","kxn","kxo","kxp","kxq","kxr","kxs","kxt","kxu","kxv","kxw","kxx","kxy","kxz","kya","kyb","kyc","kyd","kye","kyf","kyg","kyh","kyi","kyj","kyk","kyl","kym","kyn","kyo","kyp","kyq","kyr","kys","kyt","kyu","kyv","kyw","kyx","kyy","kyz","kza","kzb","kzc","kzd","kze","kzf","kzg","kzh","kzi","kzj","kzk","kzl","kzm","kzn","kzo","kzp","kzq","kzr","kzs","kzt","kzu","kzv","kzw","kzx","kzy","kzz"],["la","lb","lg","li","ln","lo","lt","lu","lv","laa","lab","lac","lad","lae","laf","lag","lah","lai","laj","lak","lal","lam","lan","lap","laq","lar","las","lau","law","lax","lay","laz","lba","lbb","lbc","lbe","lbf","lbg","lbi","lbj","lbk","lbl","lbm","lbn","lbo","lbq","lbr","lbs","lbt","lbu","lbv","lbw","lbx","lby","lbz","lcc","lcd","lce","lcf","lch","lcl","lcm","lcp","lcq","lcs","lda","ldb","ldd","ldg","ldh","ldi","ldj","ldk","ldl","ldm","ldn","ldo","ldp","ldq","lea","leb","lec","led","lee","lef","leg","leh","lei","lej","lek","lel","lem","len","leo","lep","leq","ler","les","let","leu","lev","lew","lex","ley","lez","lfa","lfn","lga","lgb","lgg","lgh","lgi","lgk","lgl","lgm","lgn","lgq","lgr","lgt","lgu","lgz","lha","lhh","lhi","lhl","lhm","lhn","lhp","lhs","lht","lhu","lia","lib","lic","lid","lie","lif","lig","lih","lii","lij","lik","lil","lio","lip","liq","lir","lis","liu","liv","liw","lix","liy","liz","lja","lje","lji","ljl","ljp","ljw","ljx","lka","lkb","lkc","lkd","lke","lkh","lki","lkj","lkl","lkm","lkn","lko","lkr","lks","lkt","lku","lky","lla","llb","llc","lld","lle","llf","llg","llh","lli","llj","llk","lll","llm","lln","llo","llp","llq","lls","llu","llx","lma","lmb","lmc","lmd","lme","lmf","lmg","lmh","lmi","lmj","lmk","lml","lmm","lmn","lmo","lmp","lmq","lmr","lmu","lmv","lmw","lmx","lmy","lmz","lna","lnb","lnd","lng","lnh","lni","lnj","lnl","lnm","lnn","lno","lns","lnu","lnw","lnz","loa","lob","loc","loe","lof","log","loh","loi","loj","lok","lol","lom","lon","loo","lop","loq","lor","los","lot","lou","lov","low","lox","loy","loz","lpa","lpe","lpn","lpo","lpx","lra","lrc","lre","lrg","lri","lrk","lrl","lrm","lrn","lro","lrr","lrt","lrv","lrz","lsa","lsb","lsd","lse","lsg","lsh","lsi","lsl","lsm","lsn","lso","lsp","lsr","lss","lst","lsv","lsy","ltc","ltg","lth","lti","ltn","lto","lts","ltu","lua","luc","lud","lue","luf","lui","luj","luk","lul","lum","lun","luo","lup","luq","lur","lus","lut","luu","luv","luw","luy","luz","lva","lvi","lvk","lvs","lvu","lwa","lwe","lwg","lwh","lwl","lwm","lwo","lws","lwt","lwu","lww","lxm","lya","lyg","lyn","lzh","lzl","lzn","lzz"],["mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","maa","mab","mad","mae","maf","mag","mai","maj","mak","mam","man","map","maq","mas","mat","mau","mav","maw","max","maz","mba","mbb","mbc","mbd","mbe","mbf","mbh","mbi","mbj","mbk","mbl","mbm","mbn","mbo","mbp","mbq","mbr","mbs","mbt","mbu","mbv","mbw","mbx","mby","mbz","mca","mcb","mcc","mcd","mce","mcf","mcg","mch","mci","mcj","mck","mcl","mcm","mcn","mco","mcp","mcq","mcr","mcs","mct","mcu","mcv","mcw","mcx","mcy","mcz","mda","mdb","mdc","mdd","mde","mdf","mdg","mdh","mdi","mdj","mdk","mdl","mdm","mdn","mdp","mdq","mdr","mds","mdt","mdu","mdv","mdw","mdx","mdy","mdz","mea","meb","mec","med","mee","mef","meg","meh","mei","mej","mek","mel","mem","men","meo","mep","meq","mer","mes","met","meu","mev","mew","mey","mez","mfa","mfb","mfc","mfd","mfe","mff","mfg","mfh","mfi","mfj","mfk","mfl","mfm","mfn","mfo","mfp","mfq","mfr","mfs","mft","mfu","mfv","mfw","mfx","mfy","mfz","mga","mgb","mgc","mgd","mge","mgf","mgg","mgh","mgi","mgj","mgk","mgl","mgm","mgn","mgo","mgp","mgq","mgr","mgs","mgt","mgu","mgv","mgw","mgx","mgy","mgz","mha","mhb","mhc","mhd","mhe","mhf","mhg","mhh","mhi","mhj","mhk","mhl","mhm","mhn","mho","mhp","mhq","mhr","mhs","mht","mhu","mhw","mhx","mhy","mhz","mia","mib","mic","mid","mie","mif","mig","mih","mii","mij","mik","mil","mim","min","mio","mip","miq","mir","mis","mit","miu","miw","mix","miy","miz","mja","mjb","mjc","mjd","mje","mjg","mjh","mji","mjj","mjk","mjl","mjm","mjn","mjo","mjp","mjq","mjr","mjs","mjt","mju","mjv","mjw","mjx","mjy","mjz","mka","mkb","mkc","mke","mkf","mkg","mkh","mki","mkj","mkk","mkl","mkm","mkn","mko","mkp","mkq","mkr","mks","mkt","mku","mkv","mkw","mkx","mky","mkz","mla","mlb","mlc","mld","mle","mlf","mlh","mli","mlj","mlk","mll","mlm","mln","mlo","mlp","mlq","mlr","mls","mlu","mlv","mlw","mlx","mlz","mma","mmb","mmc","mmd","mme","mmf","mmg","mmh","mmi","mmj","mmk","mml","mmm","mmn","mmo","mmp","mmq","mmr","mmt","mmu","mmv","mmw","mmx","mmy","mmz","mna","mnb","mnc","mnd","mne","mnf","mng","mnh","mni","mnj","mnk","mnl","mnm","mnn","mno","mnp","mnq","mnr","mns","mnt","mnu","mnv","mnw","mnx","mny","mnz","moa","moc","mod","moe","mof","mog","moh","moi","moj","mok","mom","moo","mop","moq","mor","mos","mot","mou","mov","mow","mox","moy","moz","mpa","mpb","mpc","mpd","mpe","mpg","mph","mpi","mpj","mpk","mpl","mpm","mpn","mpo","mpp","mpq","mpr","mps","mpt","mpu","mpv","mpw","mpx","mpy","mpz","mqa","mqb","mqc","mqe","mqf","mqg","mqh","mqi","mqj","mqk","mql","mqm","mqn","mqo","mqp","mqq","mqr","mqs","mqt","mqu","mqv","mqw","mqx","mqy","mqz","mra","mrb","mrc","mrd","mre","mrf","mrg","mrh","mrj","mrk","mrl","mrm","mrn","mro","mrp","mrq","mrr","mrs","mrt","mru","mrv","mrw","mrx","mry","mrz","msb","msc","msd","mse","msf","msg","msh","msi","msj","msk","msl","msm","msn","mso","msp","msq","msr","mss","mst","msu","msv","msw","msx","msy","msz","mta","mtb","mtc","mtd","mte","mtf","mtg","mth","mti","mtj","mtk","mtl","mtm","mtn","mto","mtp","mtq","mtr","mts","mtt","mtu","mtv","mtw","mtx","mty","mua","mub","muc","mud","mue","mug","muh","mui","muj","muk","mul","mum","mun","muo","mup","muq","mur","mus","mut","muu","muv","mux","muy","muz","mva","mvb","mvd","mve","mvf","mvg","mvh","mvi","mvk","mvl","mvm","mvn","mvo","mvp","mvq","mvr","mvs","mvt","mvu","mvv","mvw","mvx","mvy","mvz","mwa","mwb","mwc","mwd","mwe","mwf","mwg","mwh","mwi","mwj","mwk","mwl","mwm","mwn","mwo","mwp","mwq","mwr","mws","mwt","mwu","mwv","mww","mwx","mwy","mwz","mxa","mxb","mxc","mxd","mxe","mxf","mxg","mxh","mxi","mxj","mxk","mxl","mxm","mxn","mxo","mxp","mxq","mxr","mxs","mxt","mxu","mxv","mxw","mxx","mxy","mxz","myb","myc","myd","mye","myf","myg","myh","myi","myj","myk","myl","mym","myn","myo","myp","myq","myr","mys","myt","myu","myv","myw","myx","myy","myz","mza","mzb","mzc","mzd","mze","mzg","mzh","mzi","mzj","mzk","mzl","mzm","mzn","mzo","mzp","mzq","mzr","mzs","mzt","mzu","mzv","mzw","mzx","mzy","mzz"],["na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","naa","nab","nac","nad","nae","naf","nag","nah","nai","naj","nak","nal","nam","nan","nao","nap","naq","nar","nas","nat","naw","nax","nay","naz","nba","nbb","nbc","nbd","nbe","nbf","nbg","nbh","nbi","nbj","nbk","nbm","nbn","nbo","nbp","nbq","nbr","nbs","nbt","nbu","nbv","nbw","nbx","nby","nca","ncb","ncc","ncd","nce","ncf","ncg","nch","nci","ncj","nck","ncl","ncm","ncn","nco","ncp","ncq","ncr","ncs","nct","ncu","ncx","ncz","nda","ndb","ndc","ndd","ndf","ndg","ndh","ndi","ndj","ndk","ndl","ndm","ndn","ndp","ndq","ndr","nds","ndt","ndu","ndv","ndw","ndx","ndy","ndz","nea","neb","nec","ned","nee","nef","neg","neh","nei","nej","nek","nem","nen","neo","neq","ner","nes","net","neu","nev","new","nex","ney","nez","nfa","nfd","nfl","nfr","nfu","nga","ngb","ngc","ngd","nge","ngf","ngg","ngh","ngi","ngj","ngk","ngl","ngm","ngn","ngo","ngp","ngq","ngr","ngs","ngt","ngu","ngv","ngw","ngx","ngy","ngz","nha","nhb","nhc","nhd","nhe","nhf","nhg","nhh","nhi","nhk","nhm","nhn","nho","nhp","nhq","nhr","nht","nhu","nhv","nhw","nhx","nhy","nhz","nia","nib","nic","nid","nie","nif","nig","nih","nii","nij","nik","nil","nim","nin","nio","niq","nir","nis","nit","niu","niv","niw","nix","niy","niz","nja","njb","njd","njh","nji","njj","njl","njm","njn","njo","njr","njs","njt","nju","njx","njy","njz","nka","nkb","nkc","nkd","nke","nkf","nkg","nkh","nki","nkj","nkk","nkm","nkn","nko","nkp","nkq","nkr","nks","nkt","nku","nkv","nkw","nkx","nkz","nla","nlc","nle","nlg","nli","nlj","nlk","nll","nlm","nln","nlo","nlq","nlr","nlu","nlv","nlw","nlx","nly","nlz","nma","nmb","nmc","nmd","nme","nmf","nmg","nmh","nmi","nmj","nmk","nml","nmm","nmn","nmo","nmp","nmq","nmr","nms","nmt","nmu","nmv","nmw","nmx","nmy","nmz","nna","nnb","nnc","nnd","nne","nnf","nng","nnh","nni","nnj","nnk","nnl","nnm","nnn","nnp","nnq","nnr","nns","nnt","nnu","nnv","nnw","nnx","nny","nnz","noa","noc","nod","noe","nof","nog","noh","noi","noj","nok","nol","nom","non","noo","nop","noq","nos","not","nou","nov","now","noy","noz","npa","npb","npg","nph","npi","npl","npn","npo","nps","npu","npx","npy","nqg","nqk","nql","nqm","nqn","nqo","nqq","nqt","nqy","nra","nrb","nrc","nre","nrf","nrg","nri","nrk","nrl","nrm","nrn","nrp","nrr","nrt","nru","nrx","nrz","nsa","nsb","nsc","nsd","nse","nsf","nsg","nsh","nsi","nsk","nsl","nsm","nsn","nso","nsp","nsq","nsr","nss","nst","nsu","nsv","nsw","nsx","nsy","nsz","ntd","nte","ntg","nti","ntj","ntk","ntm","nto","ntp","ntr","nts","ntu","ntw","ntx","nty","ntz","nua","nub","nuc","nud","nue","nuf","nug","nuh","nui","nuj","nuk","nul","num","nun","nuo","nup","nuq","nur","nus","nut","nuu","nuv","nuw","nux","nuy","nuz","nvh","nvm","nvo","nwa","nwb","nwc","nwe","nwg","nwi","nwm","nwo","nwr","nwx","nwy","nxa","nxd","nxe","nxg","nxi","nxk","nxl","nxm","nxn","nxo","nxq","nxr","nxu","nxx","nyb","nyc","nyd","nye","nyf","nyg","nyh","nyi","nyj","nyk","nyl","nym","nyn","nyo","nyp","nyq","nyr","nys","nyt","nyu","nyv","nyw","nyx","nyy","nza","nzb","nzd","nzi","nzk","nzm","nzs","nzu","nzy","nzz"],["oc","oj","om","or","os","oaa","oac","oar","oav","obi","obk","obl","obm","obo","obr","obt","obu","oca","och","ocm","oco","ocu","oda","odk","odt","odu","ofo","ofs","ofu","ogb","ogc","oge","ogg","ogo","ogu","oht","ohu","oia","oin","ojb","ojc","ojg","ojp","ojs","ojv","ojw","oka","okb","okc","okd","oke","okg","okh","oki","okj","okk","okl","okm","okn","oko","okr","oks","oku","okv","okx","okz","ola","old","ole","olk","olm","olo","olr","olt","olu","oma","omb","omc","ome","omg","omi","omk","oml","omn","omo","omp","omq","omr","omt","omu","omv","omw","omx","omy","ona","onb","one","ong","oni","onj","onk","onn","ono","onp","onr","ons","ont","onu","onw","onx","ood","oog","oon","oor","oos","opa","opk","opm","opo","opt","opy","ora","orc","ore","org","orh","orn","oro","orr","ors","ort","oru","orv","orw","orx","ory","orz","osa","osc","osi","osn","oso","osp","ost","osu","osx","ota","otb","otd","ote","oti","otk","otl","otm","otn","oto","otq","otr","ots","ott","otu","otw","otx","oty","otz","oua","oub","oue","oui","oum","oun","ovd","owi","owl","oyb","oyd","oym","oyy","ozm"],["pa","pi","pl","ps","pt","paa","pab","pac","pad","pae","paf","pag","pah","pai","pak","pal","pam","pao","pap","paq","par","pas","pat","pau","pav","paw","pax","pay","paz","pbb","pbc","pbe","pbf","pbg","pbh","pbi","pbl","pbm","pbn","pbo","pbp","pbr","pbs","pbt","pbu","pbv","pby","pbz","pca","pcb","pcc","pcd","pce","pcf","pcg","pch","pci","pcj","pck","pcl","pcm","pcn","pcp","pcr","pcw","pda","pdc","pdi","pdn","pdo","pdt","pdu","pea","peb","ped","pee","pef","peg","peh","pei","pej","pek","pel","pem","peo","pep","peq","pes","pev","pex","pey","pez","pfa","pfe","pfl","pga","pgd","pgg","pgi","pgk","pgl","pgn","pgs","pgu","pgy","pgz","pha","phd","phg","phh","phi","phk","phl","phm","phn","pho","phq","phr","pht","phu","phv","phw","pia","pib","pic","pid","pie","pif","pig","pih","pii","pij","pil","pim","pin","pio","pip","pir","pis","pit","piu","piv","piw","pix","piy","piz","pjt","pka","pkb","pkc","pkg","pkh","pkn","pko","pkp","pkr","pks","pkt","pku","pla","plb","plc","pld","ple","plf","plg","plh","plj","plk","pll","pln","plo","plp","plq","plr","pls","plt","plu","plv","plw","ply","plz","pma","pmb","pmc","pmd","pme","pmf","pmh","pmi","pmj","pmk","pml","pmm","pmn","pmo","pmq","pmr","pms","pmt","pmu","pmw","pmx","pmy","pmz","pna","pnb","pnc","pnd","pne","png","pnh","pni","pnj","pnk","pnl","pnm","pnn","pno","pnp","pnq","pnr","pns","pnt","pnu","pnv","pnw","pnx","pny","pnz","poc","pod","poe","pof","pog","poh","poi","pok","pom","pon","poo","pop","poq","pos","pot","pov","pow","pox","poy","poz","ppa","ppe","ppi","ppk","ppl","ppm","ppn","ppo","ppp","ppq","ppr","pps","ppt","ppu","pqa","pqe","pqm","pqw","pra","prb","prc","prd","pre","prf","prg","prh","pri","prk","prl","prm","prn","pro","prp","prq","prr","prs","prt","pru","prw","prx","pry","prz","psa","psc","psd","pse","psg","psh","psi","psl","psm","psn","pso","psp","psq","psr","pss","pst","psu","psw","psy","pta","pth","pti","ptn","pto","ptp","ptq","ptr","ptt","ptu","ptv","ptw","pty","pua","pub","puc","pud","pue","puf","pug","pui","puj","puk","pum","puo","pup","puq","pur","put","puu","puw","pux","puy","puz","pwa","pwb","pwg","pwi","pwm","pwn","pwo","pwr","pww","pxm","pye","pym","pyn","pys","pyu","pyx","pyy","pzn"],["qu","qua","qub","quc","qud","quf","qug","quh","qui","quk","qul","qum","qun","qup","quq","qur","qus","quv","quw","qux","quy","quz","qva","qvc","qve","qvh","qvi","qvj","qvl","qvm","qvn","qvo","qvp","qvs","qvw","qvy","qvz","qwa","qwc","qwe","qwh","qwm","qws","qwt","qxa","qxc","qxh","qxl","qxn","qxo","qxp","qxq","qxr","qxs","qxt","qxu","qxw","qya","qyp"],["rm","rn","ro","ru","rw","raa","rab","rac","rad","raf","rag","rah","rai","raj","rak","ral","ram","ran","rao","rap","raq","rar","ras","rat","rau","rav","raw","rax","ray","raz","rbb","rbk","rbl","rbp","rcf","rdb","rea","reb","ree","reg","rei","rej","rel","rem","ren","rer","res","ret","rey","rga","rge","rgk","rgn","rgr","rgs","rgu","rhg","rhp","ria","rie","rif","ril","rim","rin","rir","rit","riu","rjg","rji","rjs","rka","rkb","rkh","rki","rkm","rkt","rkw","rma","rmb","rmc","rmd","rme","rmf","rmg","rmh","rmi","rmk","rml","rmm","rmn","rmo","rmp","rmq","rmr","rms","rmt","rmu","rmv","rmw","rmx","rmy","rmz","rna","rnd","rng","rnl","rnn","rnp","rnr","rnw","roa","rob","roc","rod","roe","rof","rog","rol","rom","roo","rop","ror","rou","row","rpn","rpt","rri","rro","rrt","rsb","rsi","rsl","rsm","rtc","rth","rtm","rts","rtw","rub","ruc","rue","ruf","rug","ruh","rui","ruk","ruo","rup","ruq","rut","ruu","ruy","ruz","rwa","rwk","rwl","rwm","rwo","rwr","rxd","rxw","ryn","rys","ryu","rzh"],["sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","saa","sab","sac","sad","sae","saf","sah","sai","saj","sak","sal","sam","sao","sap","saq","sar","sas","sat","sau","sav","saw","sax","say","saz","sba","sbb","sbc","sbd","sbe","sbf","sbg","sbh","sbi","sbj","sbk","sbl","sbm","sbn","sbo","sbp","sbq","sbr","sbs","sbt","sbu","sbv","sbw","sbx","sby","sbz","sca","scb","sce","scf","scg","sch","sci","sck","scl","scn","sco","scp","scq","scs","sct","scu","scv","scw","scx","sda","sdb","sdc","sde","sdf","sdg","sdh","sdj","sdk","sdl","sdm","sdn","sdo","sdp","sdq","sdr","sds","sdt","sdu","sdv","sdx","sdz","sea","seb","sec","sed","see","sef","seg","seh","sei","sej","sek","sel","sem","sen","seo","sep","seq","ser","ses","set","seu","sev","sew","sey","sez","sfb","sfe","sfm","sfs","sfw","sga","sgb","sgc","sgd","sge","sgg","sgh","sgi","sgj","sgk","sgl","sgm","sgn","sgo","sgp","sgr","sgs","sgt","sgu","sgw","sgx","sgy","sgz","sha","shb","shc","shd","she","shg","shh","shi","shj","shk","shl","shm","shn","sho","shp","shq","shr","shs","sht","shu","shv","shw","shx","shy","shz","sia","sib","sid","sie","sif","sig","sih","sii","sij","sik","sil","sim","sio","sip","siq","sir","sis","sit","siu","siv","siw","six","siy","siz","sja","sjb","sjd","sje","sjg","sjk","sjl","sjm","sjn","sjo","sjp","sjr","sjs","sjt","sju","sjw","ska","skb","skc","skd","ske","skf","skg","skh","ski","skj","skk","skm","skn","sko","skp","skq","skr","sks","skt","sku","skv","skw","skx","sky","skz","sla","slc","sld","sle","slf","slg","slh","sli","slj","sll","slm","sln","slp","slq","slr","sls","slt","slu","slw","slx","sly","slz","sma","smb","smc","smd","smf","smg","smh","smi","smj","smk","sml","smm","smn","smp","smq","smr","sms","smt","smu","smv","smw","smx","smy","smz","snb","snc","sne","snf","sng","snh","sni","snj","snk","snl","snm","snn","sno","snp","snq","snr","sns","snu","snv","snw","snx","sny","snz","soa","sob","soc","sod","soe","sog","soh","soi","soj","sok","sol","son","soo","sop","soq","sor","sos","sou","sov","sow","sox","soy","soz","spb","spc","spd","spe","spg","spi","spk","spl","spm","spn","spo","spp","spq","spr","sps","spt","spu","spv","spx","spy","sqa","sqh","sqj","sqk","sqm","sqn","sqo","sqq","sqr","sqs","sqt","squ","sqx","sra","srb","src","sre","srf","srg","srh","sri","srk","srl","srm","srn","sro","srq","srr","srs","srt","sru","srv","srw","srx","sry","srz","ssa","ssb","ssc","ssd","sse","ssf","ssg","ssh","ssi","ssj","ssk","ssl","ssm","ssn","sso","ssp","ssq","ssr","sss","sst","ssu","ssv","ssx","ssy","ssz","sta","stb","std","ste","stf","stg","sth","sti","stj","stk","stl","stm","stn","sto","stp","stq","str","sts","stt","stu","stv","stw","sty","sua","sub","suc","sue","sug","sui","suj","suk","sul","sum","suo","suq","sur","sus","sut","suv","suw","sux","suy","suz","sva","svb","svc","sve","svk","svm","svr","svs","svx","swb","swc","swf","swg","swh","swi","swj","swk","swl","swm","swn","swo","swp","swq","swr","sws","swt","swu","swv","sww","swx","swy","sxb","sxc","sxe","sxg","sxk","sxl","sxm","sxn","sxo","sxr","sxs","sxu","sxw","sya","syb","syc","syd","syi","syk","syl","sym","syn","syo","syr","sys","syw","syx","syy","sza","szb","szc","szd","sze","szg","szl","szn","szp","szs","szv","szw","szy"],["ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","taa","tab","tac","tad","tae","taf","tag","tai","taj","tak","tal","tan","tao","tap","taq","tar","tas","tau","tav","taw","tax","tay","taz","tba","tbb","tbc","tbd","tbe","tbf","tbg","tbh","tbi","tbj","tbk","tbl","tbm","tbn","tbo","tbp","tbq","tbr","tbs","tbt","tbu","tbv","tbw","tbx","tby","tbz","tca","tcb","tcc","tcd","tce","tcf","tcg","tch","tci","tck","tcl","tcm","tcn","tco","tcp","tcq","tcs","tct","tcu","tcw","tcx","tcy","tcz","tda","tdb","tdc","tdd","tde","tdf","tdg","tdh","tdi","tdj","tdk","tdl","tdm","tdn","tdo","tdq","tdr","tds","tdt","tdu","tdv","tdx","tdy","tea","teb","tec","ted","tee","tef","teg","teh","tei","tek","tem","ten","teo","tep","teq","ter","tes","tet","teu","tev","tew","tex","tey","tez","tfi","tfn","tfo","tfr","tft","tga","tgb","tgc","tgd","tge","tgf","tgg","tgh","tgi","tgj","tgn","tgo","tgp","tgq","tgr","tgs","tgt","tgu","tgv","tgw","tgx","tgy","tgz","thc","thd","the","thf","thh","thi","thk","thl","thm","thn","thp","thq","thr","ths","tht","thu","thv","thw","thx","thy","thz","tia","tic","tid","tie","tif","tig","tih","tii","tij","tik","til","tim","tin","tio","tip","tiq","tis","tit","tiu","tiv","tiw","tix","tiy","tiz","tja","tjg","tji","tjj","tjl","tjm","tjn","tjo","tjp","tjs","tju","tjw","tka","tkb","tkd","tke","tkf","tkg","tkk","tkl","tkm","tkn","tkp","tkq","tkr","tks","tkt","tku","tkv","tkw","tkx","tkz","tla","tlb","tlc","tld","tlf","tlg","tlh","tli","tlj","tlk","tll","tlm","tln","tlo","tlp","tlq","tlr","tls","tlt","tlu","tlv","tlw","tlx","tly","tma","tmb","tmc","tmd","tme","tmf","tmg","tmh","tmi","tmj","tmk","tml","tmm","tmn","tmo","tmp","tmq","tmr","tms","tmt","tmu","tmv","tmw","tmy","tmz","tna","tnb","tnc","tnd","tne","tnf","tng","tnh","tni","tnk","tnl","tnm","tnn","tno","tnp","tnq","tnr","tns","tnt","tnu","tnv","tnw","tnx","tny","tnz","tob","toc","tod","toe","tof","tog","toh","toi","toj","tol","tom","too","top","toq","tor","tos","tou","tov","tow","tox","toy","toz","tpa","tpc","tpe","tpf","tpg","tpi","tpj","tpk","tpl","tpm","tpn","tpo","tpp","tpq","tpr","tpt","tpu","tpv","tpw","tpx","tpy","tpz","tqb","tql","tqm","tqn","tqo","tqp","tqq","tqr","tqt","tqu","tqw","tra","trb","trc","trd","tre","trf","trg","trh","tri","trj","trk","trl","trm","trn","tro","trp","trq","trr","trs","trt","tru","trv","trw","trx","try","trz","tsa","tsb","tsc","tsd","tse","tsf","tsg","tsh","tsi","tsj","tsk","tsl","tsm","tsp","tsq","tsr","tss","tst","tsu","tsv","tsw","tsx","tsy","tsz","tta","ttb","ttc","ttd","tte","ttf","ttg","tth","tti","ttj","ttk","ttl","ttm","ttn","tto","ttp","ttq","ttr","tts","ttt","ttu","ttv","ttw","tty","ttz","tua","tub","tuc","tud","tue","tuf","tug","tuh","tui","tuj","tul","tum","tun","tuo","tup","tuq","tus","tut","tuu","tuv","tuw","tux","tuy","tuz","tva","tvd","tve","tvk","tvl","tvm","tvn","tvo","tvs","tvt","tvu","tvw","tvx","tvy","twa","twb","twc","twd","twe","twf","twg","twh","twl","twm","twn","two","twp","twq","twr","twt","twu","tww","twx","twy","txa","txb","txc","txe","txg","txh","txi","txj","txm","txn","txo","txq","txr","txs","txt","txu","txx","txy","tya","tye","tyh","tyi","tyj","tyl","tyn","typ","tyr","tys","tyt","tyu","tyv","tyx","tyy","tyz","tza","tzh","tzj","tzl","tzm","tzn","tzo","tzx"],["ug","uk","ur","uz","uam","uan","uar","uba","ubi","ubl","ubr","ubu","uby","uda","ude","udg","udi","udj","udl","udm","udu","ues","ufi","uga","ugb","uge","ugn","ugo","ugy","uha","uhn","uis","uiv","uji","uka","ukg","ukh","uki","ukk","ukl","ukp","ukq","uks","uku","ukv","ukw","uky","ula","ulb","ulc","ule","ulf","uli","ulk","ull","ulm","uln","ulu","ulw","uma","umb","umc","umd","umg","umi","umm","umn","umo","ump","umr","ums","umu","una","und","une","ung","uni","unk","unm","unn","unp","unr","unu","unx","unz","uok","upi","upv","ura","urb","urc","ure","urf","urg","urh","uri","urj","urk","url","urm","urn","uro","urp","urr","urt","uru","urv","urw","urx","ury","urz","usa","ush","usi","usk","usp","uss","usu","uta","ute","uth","utp","utr","utu","uum","uun","uur","uuu","uve","uvh","uvl","uwa","uya","uzn","uzs"],["ve","vi","vo","vaa","vae","vaf","vag","vah","vai","vaj","val","vam","van","vao","vap","var","vas","vau","vav","vay","vbb","vbk","vec","ved","vel","vem","veo","vep","ver","vgr","vgt","vic","vid","vif","vig","vil","vin","vis","vit","viv","vka","vki","vkj","vkk","vkl","vkm","vkn","vko","vkp","vkt","vku","vkz","vlp","vls","vma","vmb","vmc","vmd","vme","vmf","vmg","vmh","vmi","vmj","vmk","vml","vmm","vmp","vmq","vmr","vms","vmu","vmv","vmw","vmx","vmy","vmz","vnk","vnm","vnp","vor","vot","vra","vro","vrs","vrt","vsi","vsl","vsv","vto","vum","vun","vut","vwa"],["wa","wo","waa","wab","wac","wad","wae","waf","wag","wah","wai","waj","wak","wal","wam","wan","wao","wap","waq","war","was","wat","wau","wav","waw","wax","way","waz","wba","wbb","wbe","wbf","wbh","wbi","wbj","wbk","wbl","wbm","wbp","wbq","wbr","wbs","wbt","wbv","wbw","wca","wci","wdd","wdg","wdj","wdk","wdu","wdy","wea","wec","wed","weg","weh","wei","wem","wen","weo","wep","wer","wes","wet","weu","wew","wfg","wga","wgb","wgg","wgi","wgo","wgu","wgw","wgy","wha","whg","whk","whu","wib","wic","wie","wif","wig","wih","wii","wij","wik","wil","wim","win","wir","wit","wiu","wiv","wiw","wiy","wja","wji","wka","wkb","wkd","wkl","wkr","wku","wkw","wky","wla","wlc","wle","wlg","wlh","wli","wlk","wll","wlm","wlo","wlr","wls","wlu","wlv","wlw","wlx","wly","wma","wmb","wmc","wmd","wme","wmg","wmh","wmi","wmm","wmn","wmo","wms","wmt","wmw","wmx","wnb","wnc","wnd","wne","wng","wni","wnk","wnm","wnn","wno","wnp","wnu","wnw","wny","woa","wob","woc","wod","woe","wof","wog","woi","wok","wom","won","woo","wor","wos","wow","woy","wpc","wra","wrb","wrd","wrg","wrh","wri","wrk","wrl","wrm","wrn","wro","wrp","wrr","wrs","wru","wrv","wrw","wrx","wry","wrz","wsa","wsg","wsi","wsk","wsr","wss","wsu","wsv","wtf","wth","wti","wtk","wtm","wtw","wua","wub","wud","wuh","wul","wum","wun","wur","wut","wuu","wuv","wux","wuy","wwa","wwb","wwo","wwr","www","wxa","wxw","wya","wyb","wyi","wym","wyr","wyy"],["xh","xaa","xab","xac","xad","xae","xag","xai","xaj","xak","xal","xam","xan","xao","xap","xaq","xar","xas","xat","xau","xav","xaw","xay","xba","xbb","xbc","xbd","xbe","xbg","xbi","xbj","xbm","xbn","xbo","xbp","xbr","xbw","xbx","xby","xcb","xcc","xce","xcg","xch","xcl","xcm","xcn","xco","xcr","xct","xcu","xcv","xcw","xcy","xda","xdc","xdk","xdm","xdo","xdy","xeb","xed","xeg","xel","xem","xep","xer","xes","xet","xeu","xfa","xga","xgb","xgd","xgf","xgg","xgi","xgl","xgm","xgn","xgr","xgu","xgw","xha","xhc","xhd","xhe","xhr","xht","xhu","xhv","xia","xib","xii","xil","xin","xip","xir","xis","xiv","xiy","xjb","xjt","xka","xkb","xkc","xkd","xke","xkf","xkg","xkh","xki","xkj","xkk","xkl","xkn","xko","xkp","xkq","xkr","xks","xkt","xku","xkv","xkw","xkx","xky","xkz","xla","xlb","xlc","xld","xle","xlg","xli","xln","xlo","xlp","xls","xlu","xly","xma","xmb","xmc","xmd","xme","xmf","xmg","xmh","xmj","xmk","xml","xmm","xmn","xmo","xmp","xmq","xmr","xms","xmt","xmu","xmv","xmw","xmx","xmy","xmz","xna","xnb","xnd","xng","xnh","xni","xnj","xnk","xnm","xnn","xno","xnq","xnr","xns","xnt","xnu","xny","xnz","xoc","xod","xog","xoi","xok","xom","xon","xoo","xop","xor","xow","xpa","xpb","xpc","xpd","xpe","xpf","xpg","xph","xpi","xpj","xpk","xpl","xpm","xpn","xpo","xpp","xpq","xpr","xps","xpt","xpu","xpv","xpw","xpx","xpy","xpz","xqa","xqt","xra","xrb","xrd","xre","xrg","xri","xrm","xrn","xrq","xrr","xrt","xru","xrw","xsa","xsb","xsc","xsd","xse","xsh","xsi","xsj","xsl","xsm","xsn","xso","xsp","xsq","xsr","xss","xsu","xsv","xsy","xta","xtb","xtc","xtd","xte","xtg","xth","xti","xtj","xtl","xtm","xtn","xto","xtp","xtq","xtr","xts","xtt","xtu","xtv","xtw","xty","xtz","xua","xub","xud","xug","xuj","xul","xum","xun","xuo","xup","xur","xut","xuu","xve","xvi","xvn","xvo","xvs","xwa","xwc","xwd","xwe","xwg","xwj","xwk","xwl","xwo","xwr","xwt","xww","xxb","xxk","xxm","xxr","xxt","xya","xyb","xyj","xyk","xyl","xyt","xyy","xzh","xzm","xzp"],["yi","yo","yaa","yab","yac","yad","yae","yaf","yag","yah","yai","yaj","yak","yal","yam","yan","yao","yap","yaq","yar","yas","yat","yau","yav","yaw","yax","yay","yaz","yba","ybb","ybd","ybe","ybh","ybi","ybj","ybk","ybl","ybm","ybn","ybo","ybx","yby","ych","ycl","ycn","ycp","yda","ydd","yde","ydg","ydk","yds","yea","yec","yee","yei","yej","yel","yen","yer","yes","yet","yeu","yev","yey","yga","ygi","ygl","ygm","ygp","ygr","ygs","ygu","ygw","yha","yhd","yhl","yhs","yia","yif","yig","yih","yii","yij","yik","yil","yim","yin","yip","yiq","yir","yis","yit","yiu","yiv","yix","yiy","yiz","yka","ykg","yki","ykk","ykl","ykm","ykn","yko","ykr","ykt","yku","yky","yla","ylb","yle","ylg","yli","yll","ylm","yln","ylo","ylr","ylu","yly","yma","ymb","ymc","ymd","yme","ymg","ymh","ymi","ymk","yml","ymm","ymn","ymo","ymp","ymq","ymr","yms","ymt","ymx","ymz","yna","ynd","yne","yng","ynh","ynk","ynl","ynn","yno","ynq","yns","ynu","yob","yog","yoi","yok","yol","yom","yon","yos","yot","yox","yoy","ypa","ypb","ypg","yph","ypk","ypm","ypn","ypo","ypp","ypz","yra","yrb","yre","yri","yrk","yrl","yrm","yrn","yro","yrs","yrw","yry","ysc","ysd","ysg","ysl","ysm","ysn","yso","ysp","ysr","yss","ysy","yta","ytl","ytp","ytw","yty","yua","yub","yuc","yud","yue","yuf","yug","yui","yuj","yuk","yul","yum","yun","yup","yuq","yur","yut","yuu","yuw","yux","yuy","yuz","yva","yvt","ywa","ywg","ywl","ywn","ywq","ywr","ywt","ywu","yww","yxa","yxg","yxl","yxm","yxu","yxy","yyr","yyu","yyz","yzg","yzk"],["za","zh","zu","zaa","zab","zac","zad","zae","zaf","zag","zah","zai","zaj","zak","zal","zam","zao","zap","zaq","zar","zas","zat","zau","zav","zaw","zax","zay","zaz","zba","zbc","zbe","zbl","zbt","zbu","zbw","zca","zch","zdj","zea","zeg","zeh","zen","zga","zgb","zgh","zgm","zgn","zgr","zhb","zhd","zhi","zhn","zhw","zhx","zia","zib","zik","zil","zim","zin","zir","ziw","ziz","zka","zkb","zkd","zkg","zkh","zkk","zkn","zko","zkp","zkr","zkt","zku","zkv","zkz","zla","zle","zlj","zlm","zln","zlq","zls","zlw","zma","zmb","zmc","zmd","zme","zmf","zmg","zmh","zmi","zmj","zmk","zml","zmm","zmn","zmo","zmp","zmq","zmr","zms","zmt","zmu","zmv","zmw","zmx","zmy","zmz","zna","znd","zne","zng","znk","zns","zoc","zoh","zom","zoo","zoq","zor","zos","zpa","zpb","zpc","zpd","zpe","zpf","zpg","zph","zpi","zpj","zpk","zpl","zpm","zpn","zpo","zpp","zpq","zpr","zps","zpt","zpu","zpv","zpw","zpx","zpy","zpz","zqe","zra","zrg","zrn","zro","zrp","zrs","zsa","zsk","zsl","zsm","zsr","zsu","zte","ztg","ztl","ztm","ztn","ztp","ztq","zts","ztt","ztu","ztx","zty","zua","zuh","zum","zun","zuy","zwa","zxx","zyb","zyg","zyj","zyn","zyp","zza","zzj"]],a=function(){function e(){}return e.isBcp47=function(e){return/^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(e)},e.validPrimaryLang=function(e){var t=e.toLowerCase();return t.includes("-")&&(t=t.split("-")[0]),!!t.match(/[a-z]{2,3}/)&&(3===t.length&&"q"===t.charAt(0)&&t.charCodeAt(1)>=97&&t.charCodeAt(1)<=116&&t.charCodeAt(2)>=97&&t.charCodeAt(2),i[t.charCodeAt(0)-97].includes(t))},e.matchPrimaryLang=function(e,t){var i=e;i.includes("-")&&(i=i.split("-")[0]);var a=t;return a.includes("-")&&(a=a.split("-")[0]),i.toLowerCase()===a.toLowerCase()},e}();t.LangUtil=a},3103(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CommonMapper=void 0;var a=i(3864),n=function(){function e(){this.hierarchyRole=null,this.hierarchyPath=null,this.hierarchyResults=null}return e.prototype.getBounds=function(e){return null},e.prototype.reset=function(e){this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var t=[],i=a.DOMWalker.parentNode(e);i&&9!=i.nodeType;)t.push(i),i=a.DOMWalker.parentNode(i);for(var n=0,r=t=t.reverse();n<r.length;n++){for(var l=r[n],o=[],s=l.previousSibling;s;)o.push(s),s=s.previousSibling;for(var u=0,d=o=o.reverse();u<d.length;u++){var c=d[u];this.pushHierarchy(c),this.popHierarchy()}this.pushHierarchy(l)}},e.prototype.pushHierarchy=function(e){var t=this.getRole(e)||null;if(this.hierarchyRole.push(t),null!==t){var i=this.hierarchyPath[this.hierarchyPath.length-1];i.roleCount[t]=(i.roleCount[t]||0)+1,this.hierarchyPath.push({rolePath:i.rolePath+"/"+t+"["+i.roleCount[t]+"]",roleCount:{}})}var a={};1===e.nodeType&&(a=this.getAttributes(e)),this.hierarchyResults.push({node:e,namespace:this.getNamespace(),role:t,attributes:a,rolePath:this.hierarchyPath[this.hierarchyPath.length-1].rolePath,bounds:this.getBounds(e)})},e.prototype.popHierarchy=function(){null!==this.hierarchyRole.pop()&&this.hierarchyPath.pop(),this.hierarchyResults.pop()},e.prototype.openScope=function(e){return null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e),this.hierarchyResults},e.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}return t[t.length-1].role="/"+t[t.length-1].role,this.popHierarchy(),t},e}();t.CommonMapper=n},920(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Context=t.PartInfo=t.AttrInfo=void 0;var i=function(){function e(e,t,i,a){if(this.inclusive=e,this.attr=t,this.eq=i,this.value=a,!e&&void 0!==i&&i.length>0)throw new Error("Cannot have !attr"+i+" context");if(e&&void 0!==i&&i.length>0&&(void 0===a||0===a.length))throw new Error("Cannot have equivalence check without a value")}return e.prototype.matches=function(e){var t=this,i=e.attributes;if(t.attr in i){if(t.inclusive){if(t.eq){var a=i[t.attr];if("="===t.eq)return t.value===a;if("!="===t.eq)return t.value!==a;if("~"===t.eq)return t.value===a;if("!~"===t.eq)return t.value!==a;throw new Error("Context equivalence operator not supported")}return!0}return!1}return!t.inclusive},e}();t.AttrInfo=i;var a=function(){function e(e,t,i,a,n){if(this.inclusive=e,this.namespace=t,this.role=i,this.attrs=a,this.connector=n,"*"===i&&!e)throw new Error("!* context not supported")}return e.prototype.matches=function(e,t){var i=this,a=i.namespace in e&&e[i.namespace][t]&&(e[i.namespace][t].role===i.role||"none"!==e[i.namespace][t].role&&"*"===i.role);if(!a||"*"!==i.role||"dom"!==i.namespace||"#text"!==e[i.namespace][t].role&&"/#text"!==e[i.namespace][t].role||(a=!1),i.inclusive&&!a)return!1;if(!i.inclusive&&!a)return!0;for(var n=i.attrs,r=e[i.namespace][t],l=!0,o=0,s=n;o<s.length;o++){var u=s[o];l=l&&u.matches(r)}return i.inclusive||(l=!l),l},e}();t.PartInfo=a;var n=function(){function e(e){this.contextInfo=[];for(var t=[],n=0,r=e.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g);n<r.length;n++){for(var l=r[n].match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/),o=[],s=0,u=l[3].match(/\[([^\]]+)\]/g)||[];s<u.length;s++){var d=u[s].match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/);o.push(new i("!"!==d[1],d[2].toLowerCase(),d[3],d[4]))}l[2]=l[2].toLowerCase();var c=l[2].split(":"),m="!"!==l[1],p=c.shift(),h=c.join(":"),g=new a(m,p,h,o,l[l.length-1]);t.push(g)}this.contextInfo=t}return e.cleanContext=function(e){return(e=(e=(e=(e=(e=e.toLowerCase().trim()).replace(/ +!/g," !")).replace(/ +([>+~,])/g,"$1")).replace(/([>+~,]) +/g,"$1")).replace(/ +/g," ")).trim()},e.parse=function(t){for(var i=e.splitMultiple(e.cleanContext(t)),a=[],n=0;n<i.length;++n){var r=new e(i[n]);a.push(r)}return a},e.splitMultiple=function(e){var t=[];if(e)if(-1===e.indexOf(","))t.push(e);else for(var i=0,a=e.split(",");i<a.length;i++){var n=a[i];t.push(n)}return t},e}();t.Context=n},7301(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Engine=void 0;var a=i(3864),n=i(920),r=i(4516),l=i(7507),o=i(1686),s=i(4566),u=i(461),d=i(3946),c=function(){function e(e,t){this.rule=e,this.parsedInfo=t,this.ns=this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length-1].namespace,r.Config.DEBUG&&console.log("Added Rule:",e.id,JSON.stringify(this.parsedInfo))}return e.convertNodeToSnippet=function(e){var t="";t+="<"+e.nodeName.toLowerCase();var i=e.attributes;if(null!=i)for(var a=i.length-1;a>=0;a--)"data-namewalk"!==i[a].name&&(t+=" "+i[a].name+'="'+i[a].value+'"');return t+">"},e.convertNodeToSource=function(e,t){if(void 0===t&&(t=!1),!t||!e)return null;var i="ibm-a11y-debug",n=function(e){return e&&"end"!==e.toLowerCase()?{found:!0,stop:!1,source:e}:{found:!0,stop:!0}},r=function(e){if(!e)return{found:!1};var t=null;if(e.nodeType===Node.COMMENT_NODE)t=e.nodeValue;else if(e.nodeType===Node.ELEMENT_NODE)for(var a=e.firstChild;a;){if(a.nodeType!==Node.TEXT_NODE){if(a.nodeType===Node.COMMENT_NODE){t=a.nodeValue;break}break}if(a.nodeValue&&a.nodeValue.trim().length>0)break;a=a.nextSibling}if(null!==t){var r=t.trim();if(r===i||r.startsWith(i+":")||r.startsWith(i+" ")||r.startsWith(i+"\t")){var l=r.substring(14).trimStart(),o=l.startsWith(":")?l.substring(1).trim():l.trim();return n(o)}}return{found:!1}},l=function(e){if(e.nodeType!==Node.ELEMENT_NODE)return{found:!1};var t=e.getAttribute(i);return null===t?{found:!1}:n(t.trim())},o=l(e);return o.found?o.stop?null:o.source:function(e){for(var t=e;t;){for(var i=a.DOMWalker.previousSiblingNotOwnedBySlot(t);i;){var n=r(i);if(n.found)return n.stop?null:n.source;i=a.DOMWalker.previousSiblingNotOwnedBySlot(i)}var o=a.DOMWalker.parentNode(t);if(!o||o.nodeType===Node.DOCUMENT_NODE)return null;var s=l(o);if(s.found)return s.stop?null:s.source;t=o}return null}(e)},e.prototype.run=function(t,i,a,n){var r,l=(new Date).getTime();try{r=this.rule.run(i,a,n)}catch(e){var o=e;throw console.error("RULE EXCEPTION:",this.rule.id,i.dom.rolePath,o.stack),e}var s=(new Date).getTime();r||(r=[]),r instanceof Array||(r=[r]);for(var u=[],d=0,c=r;d<c.length;d++){var m=c[d],p=t.getMessage(this.rule.id,m.reasonId,m.messageArgs),h={};for(var g in i)h[g]=i[g].rolePath;var b=this.rule.id.replace(/^(.*)\$\$\d+$/,"$1");u.push({ruleId:b,value:m.value,node:i.dom.node,path:h,ruleTime:s-l,reasonId:m.reasonId,message:p,messageArgs:m.messageArgs,apiArgs:m.apiArgs,bounds:i.dom.bounds,snippet:e.convertNodeToSnippet(i.dom.node),source:e.convertNodeToSource(i.dom.node,t.isSourceMapEnabled())})}return u},e}(),m=function(){function e(){this.mappers={},this.ruleMap={},this.wrappedRuleMap={},this.nlsMap={},this.helpMap={},this.sourceMapEnabled=!1,this.inclRules={},this.exclRules={},this.addMapper(new l.DOMMapper)}return e.getLanguages=function(){var e="undefined"!=typeof process&&void 0===process.nodeType&&process.env,t="en-US";return e&&(t=(t=e.LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES)&&t.length>0?t.split(".")[0].replace(/_/g,"-"):"en-US"),"undefined"!=typeof navigator&&navigator.languages||[t]},e.prototype.run=function(e,t){if(null===e)return Promise.reject("null document");9===e.nodeType&&(e=e.documentElement),e.ownerDocument&&(e.ownerDocument.PT_CHECK_HIDDEN_CONTENT=!1);var i=s.CacheUtil.clearCaches(e),n=new a.DOMWalker(e,!1,e,!0),r={results:[],numExecuted:0,ruleTime:0,totalTime:0},l=(new Date).getTime();for(var c in this.mappers)this.mappers[c].reset(e);var m=0,p=-1;do{m++;var h=Math.floor(m/i*100);h>p&&(i>1e4&&console.log("Progress: ".concat(h,"% (").concat(m,"/").concat(i," nodes)")),p=h);var g={};for(var c in this.mappers)n.bEndTag?g[c]=this.mappers[c].closeScope(n.node):g[c]=this.mappers[c].openScope(n.node);if(11!==n.node.nodeType&&(d.VisUtil.isNodeVisible(n.node)||"meta"===n.node.nodeName.toLowerCase()||"style"===n.node.nodeName.toLowerCase()||"datalist"===n.node.nodeName.toLowerCase()||"param"===n.node.nodeName.toLowerCase()||!o.DOMUtil.getAncestor(n.node,["body"]))){var b={};for(var _ in g){var f=g[_],v=f[f.length-1];b[_]=v}for(var A={},w=0,y=this.getMatchingRules(g);w<y.length;w++){for(var C=y[w],k=!0,R=0,x=C.rule.dependencies||[];R<x.length;R++)A[x[R]]||(k=!1);if(k){var P=[];(new Date).getTime();try{P=C.run(this,b,t,g)}catch(e){}0===P.length&&(A[C.rule.id]=!0);for(var T=0,U=P;T<U.length;T++){var I=U[T];r.results.push(I),r.ruleTime+=I.ruleTime,r.numExecuted++,I.value[1]===u.eRuleConfidence.PASS&&(A[I.ruleId]=!0)}}}}}while(n.nextNode());return s.CacheUtil.clearCaches(e),r.totalTime=(new Date).getTime()-l,Promise.resolve(r)},e.prototype.enableRules=function(e){for(var t in this.ruleMap)this.ruleMap[t].enabled=!1;for(var i=0,a=e||[];i<a.length;i++)(t=a[i])in this.ruleMap?this.ruleMap[t].enabled=!0:console.warn("WARNING: Rule Id",t,"could not be enabled.")},e.prototype.getRule=function(e){return this.ruleMap[e]},e.prototype.getRulesIds=function(){var e=[];for(var t in this.ruleMap)e.push(t);return e},e.prototype.addRules=function(e){for(var t=0,i=e;t<i.length;t++){var a=i[t];this.addRule(a,!0)}this._sortRules()},e.prototype.addRule=function(e,t){var i=n.Context.parse(e.context),a=0,r=e.id;if(r in this.ruleMap)console.log("WARNING: Rule",r,"already added to engine. Ignoring...");else{this.ruleMap[r]=e;for(var l=0,o=i;l<o.length;l++){var s=o[l],u=r;a>=1&&(u=r+"$$"+a),++a;var d=new c(e,s);this.wrappedRuleMap[u]=d;var m=d.parsedInfo.contextInfo,p=m[m.length-1],h=p.namespace+":"+p.role;p.inclusive?(this.inclRules[h]=this.inclRules[h]||[],this.inclRules[h].push(d)):(this.exclRules[h]=this.exclRules[h]||[],this.exclRules[h].push(d))}t||this._sortRules()}},e.prototype.enableSourceMap=function(e){this.sourceMapEnabled=e},e.prototype.isSourceMapEnabled=function(){return this.sourceMapEnabled},e.prototype._sortRules=function(){for(var e in this.inclRules)this.inclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0});for(var e in this.exclRules)this.exclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0})},e.prototype.addNlsMap=function(e){for(var t in e)this.nlsMap[t]=e[t]},e.prototype.addHelpMap=function(e){for(var t in e)this.helpMap[t]=e[t]},e.prototype.getMessage=function(e,t,i){var a=e.indexOf("$$");if(a>=0&&(e=e.substring(0,a)),!(e in this.nlsMap))return e;var n=this.nlsMap[e][t||0];return n?n.replace(/\{(\d+)\}/g,function(e,t,a){return i[t]}):e+"_"+t},e.prototype.getHelp=function(e,t,i){return i||(i="latest"),"".concat(r.Config.helpRoot,"/").concat(i,"/doc").concat(this.getHelpRel(e,t))},e.prototype.getHelpRel=function(e,t){var i=e.indexOf("$$");return i>=0&&(e=e.substring(0,i)),e in this.helpMap?((t=t||0)in this.helpMap[e]?this.helpMap[e][t||0]:this.helpMap[e][0])||e+"_"+t:e},e.prototype.addMapper=function(e){this.mappers[e.getNamespace()]=e},e.match=function(e,t){var i=e.parsedInfo.contextInfo,a=i.length-1,n=i[a].namespace,r=t[n][t[n].length-1],l=r.node;if(!i[a].matches(t,t[n].length-1))return!1;if(1===i.length)return!0;if(r=t[n=i[0].namespace][t[n].length-1],--a,i.slice(0,i.length-1).some(function(e){return e.namespace!==n}))return console.error("[ERROR] Rule ".concat(e.rule.id," has inconsitent parent namespaces")),!1;for(var o=t[n].length-(r.node.isSameNode(l)?2:1);o>=0&&a>=0;){var s=i[a],u=i[a].matches(t,o);if(">"===s.connector){if(!u)return!1;--a,--o}else{if(" "!==s.connector)throw new Error("Context connector "+s.connector+" is not supported");if(s.inclusive)u&&--a,--o;else{if(!u)return!1;for(var d=!1,c=o-1;!d&&c>=0;--c)d=!i[a].matches(t,c);if(d)return!1;--a}}}return-1===a},e.prototype.getMatchingRules=function(t){var i=[];function a(a){for(var n=0,r=a;n<r.length;n++){var l=r[n];l.rule.enabled&&e.match(l,t)&&i.push(l)}}for(var n in t){var r=n+":"+(t[n].length>0?t[n][t[n].length-1].role:"none");for(var l in r in this.inclRules&&a(this.inclRules[r]),this.exclRules)l!==r&&a(this.exclRules[l]);r!==n+":none"&&(r.startsWith(n+":/")?n+":/*"in this.inclRules&&a(this.inclRules[n+":/*"]):n+":*"in this.inclRules&&a(this.inclRules[n+":*"]))}return this.sortDeps(i)},e.prototype.sortDeps=function(e){for(var t=[],i=0,a=e;i<a.length;i++){var n=a[i];t.push(n)}var r=[],l={},o=!1;do{o=!1;for(var s=0;s<t.length;++s){var u=t[s];if(!(u.rule.id in l)){var d=!0;if(u.rule.dependencies&&u.rule.dependencies.length>0)for(var c=0,m=u.rule.dependencies;c<m.length;c++)m[c]in l||(d=!1);d&&(o=!0,r.push(u),l[u.rule.id]=!0,t.splice(s--,1))}}}while(o);return r},e}();t.Engine=m},4516(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;var i=function(){function e(){}return e.DEBUG=!1,e.helpRoot="https://able.ibm.com/rules/archives",e}();t.Config=i},7507(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.DOMMapper=void 0;var r=i(3103),l=i(4566),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getRole=function(e){return e.nodeName.toLowerCase()},t.prototype.getNamespace=function(){return"dom"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=0;a<i.attributes.length;++a){var n=i.attributes[a];t[n.name.toLowerCase()]=n.nodeValue}return t},t.prototype.getBounds=function(e){if(1!==e.nodeType)return null;var t=l.CacheUtil.getCache(e,"DOMMapper_Bounds",void 0);if(void 0!==t)return t;var i=1;e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.devicePixelRatio&&(i=e.ownerDocument.defaultView.devicePixelRatio);var a=e.getBoundingClientRect();if(a){var n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,r=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,o={left:Math.ceil((a.left+n)*i),top:Math.ceil((a.top+r)*i),height:Math.ceil(a.height*i),width:Math.ceil(a.width*i)};return l.CacheUtil.setCache(e,"DOMMapper_Bounds",o),o}return null},t.prototype.getUnadjustedBounds=function(e){if(1!==e.nodeType)return null;var t=l.CacheUtil.getCache(e,"DOMMapper_UnadjustedBounds",void 0);if(void 0!==t)return t;var i=e.getBoundingClientRect();if(i){var a=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,r={left:Math.ceil(i.left+a),top:Math.ceil(i.top+n),height:Math.ceil(i.height),width:Math.ceil(i.width)};return l.CacheUtil.setCache(e,"DOMMapper_UnadjustedBounds",r),r}return null},t}(r.CommonMapper);t.DOMMapper=o},1686(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMUtil=void 0;var a=i(3864),n=function(){function e(){}return e.hasParent=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName);)i=a.DOMWalker.parentElement(i);return!!i},e.getAncestor=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName.toLowerCase());)i=a.DOMWalker.parentElement(i);return i},e.sameNode=function(e,t){return e===t||(e.isSameNode?e.isSameNode(t):!e.compareDocumentPosition||0===e.compareDocumentPosition(t))},e.cleanWhitespace=function(e){return e.replace(/[ \t\r\n]/g," ").replace(/ +/g," ")},e.cleanSpace=function(e){return e.replace(/ +/g," ")},e.isInSameTable=function(t,i){if(t&&i){var a=["table"],n=e.getAncestor(t,a),r=e.getAncestor(i,a);if(null!==n&&null!=r&&e.sameNode(n,r))return!0}return!1},e.shadowRootNode=function(e){for(var t=e;null!=t&&11!==t.nodeType;)t=t.parentNode;return t},e.objectCopyWithNodeRefs=function(e){if(!e)return e;if("object"!=typeof e)return"function"==typeof e?e:JSON.parse(JSON.stringify(e));if(e instanceof Node||e.nodeType)return e;var t=void 0;if("Array"===e.constructor.name){t=[];for(var i=0,a=e;i<a.length;i++){var n=a[i];t.push(this.objectCopyWithNodeRefs(n))}}else for(var r in t={},e)t[r]=this.objectCopyWithNodeRefs(e[r]);return t},e.getAncestorWithAttribute=function(e,t,i){for(var n=a.DOMWalker.parentNode(e);null!==n;){if(1===n.nodeType&&n.getAttribute(t)===i)return n;n=a.DOMWalker.parentNode(n)}return null},e}();t.DOMUtil=n},3864(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMWalker=void 0;var a=i(3946),n=function(){function e(e,t,i,a,n){this.DEBUGIDX=0,this.indent=0,this.DEBUG=!!n,this.root=i||(e&&e.ownerDocument?e.ownerDocument.documentElement:e),9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,9===this.node.nodeType&&(this.node=this.node.documentElement),this.bEndTag=null!=t&&1==t,this.considerHidden=a||!1}return e.prototype.elem=function(){return 1===this.node.nodeType&&this.node||null},e.parentNode=function(e){if(null===e)return null;var t=e.parentNode;return e.slotOwner?t=e.slotOwner:e.ownerElement?t=e.ownerElement:t&&11===t.nodeType&&(t=t.host?t.host:null),t},e.parentElement=function(t){var i=t;do{i=e.parentNode(i)}while(i&&1!==i.nodeType);return i},e.assignSlots=function(e){for(var t=e.querySelectorAll("slot"),i=0;i<t.length;++i)for(var a=t[i],n=a.assignedNodes(),r=0;r<n.length;++r)n[r].slotOwner=a,n[r].slotIndex=r},e.firstChildNotOwnedBySlot=function(e){for(var t=e.firstChild;t&&t.slotOwner;)t=t.nextSibling;return t},e.lastChildNotOwnedBySlot=function(e){for(var t=e.lastChild;t&&t.slotOwner;)t=t.previousSibling;return t},e.nextSiblingNotOwnedBySlot=function(e){for(var t=e.nextSibling;t&&t.slotOwner;)t=t.nextSibling;return t},e.previousSiblingNotOwnedBySlot=function(e){for(var t=e.previousSibling;t&&t.slotOwner;)t=t.previousSibling;return t},e.prototype.atRoot=function(){return!this.node.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var t=this,i=function(){for(var e="",i=0;i<t.indent;++i)e+=" ";return e},n=this.node.nodeName;if(!this.node)return this.bEndTag=!1,!1;do{if(this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var r=this.node.slotOwner,l=this.node.slotIndex+1;l<r.assignedNodes().length?(this.node=r.assignedNodes()[l],this.bEndTag=!1):(this.node=r,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(e.nextSiblingNotOwnedBySlot(this.node))this.node=e.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!0}}else{var o=this.node,s=this.node,u=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(o))&&o.contentDocument&&o.contentDocument.documentElement){var d=this.node;this.node=o.contentDocument.documentElement,this.node.ownerElement=d}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(s))&&s.shadowRoot&&s.shadowRoot.firstChild?(d=this.node,this.node=s.shadowRoot,this.node.ownerElement=d,e.assignSlots(this.node)):1===this.node.nodeType&&"slot"===s.nodeName.toLowerCase()&&u.assignedNodes().length>0?this.node=u.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!e.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=e.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return this.bEndTag&&(this.indent-=2),this.DEBUG&&console.log(i()+"<".concat(this.bEndTag?"/":"").concat(this.node.nodeName,"> (from ").concat(n,") ").concat(this.DEBUGIDX++)),this.DEBUG&&this.node.slotOwner&&console.log(i()+"slotOwner: ".concat(this.node.slotOwner.nodeName)),this.DEBUG&&this.node.slotIndex&&console.log(i()+"slotIndex: ".concat(this.node.slotIndex)),this.DEBUG&&this.node.ownerElement&&console.log(i()+"ownerElement: ".concat(this.node.ownerElement.nodeName)),this.bEndTag||(this.indent+=2),!0},e.prototype.prevNode=function(){do{if(this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(t))&&t.contentDocument&&t.contentDocument.documentElement){var n=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=n}else if(1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(i))&&i.shadowRoot&&i.shadowRoot.lastChild)n=this.node,this.node=i.shadowRoot,this.node.ownerElement=n,e.assignSlots(this.node);else if(1===this.node.nodeType&&"slot"===i.nodeName.toLowerCase()&&i.assignedNodes().length>0){var r=i;this.node=r.assignedNodes()[r.assignedNodes().length-1]}else 1!==this.node.nodeType&&11!==this.node.nodeType||!e.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=e.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(this.node.slotOwner){var l=this.node.slotOwner,o=this.node.slotIndex-1;o>=0?(this.node=l.assignedNodes()[o],this.bEndTag=!0):(this.node=l,this.bEndTag=!1)}else if(e.previousSiblingNotOwnedBySlot(this.node))this.node=e.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return!0},e}();t.DOMWalker=n},8601(e,t){var i,a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eGuidelineType=t.eGuidelineCategory=t.eToolkitLevel=void 0,(n=t.eToolkitLevel||(t.eToolkitLevel={})).LEVEL_ONE="1",n.LEVEL_TWO="2",n.LEVEL_THREE="3",n.LEVEL_FOUR="4",(a=t.eGuidelineCategory||(t.eGuidelineCategory={})).ACCESSIBILITY="Accessibility",a.DESIGN="Design",a.OTHER="Other",(i=t.eGuidelineType||(t.eGuidelineType={})).DEFAULT="default",i.EXTENSION="extension"},461(e,t,i){var a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eRulesetType=t.eRuleCategory=t.eToolkitLevel=t.RuleManual=t.RulePotential=t.RuleFail=t.RuleRender=t.RulePass=t.eRulePolicy=t.eRuleConfidence=void 0,function(e){e.PASS="PASS",e.FAIL="FAIL",e.POTENTIAL="POTENTIAL",e.MANUAL="MANUAL"}(a=t.eRuleConfidence||(t.eRuleConfidence={})),function(e){e.VIOLATION="VIOLATION",e.RECOMMENDATION="RECOMMENDATION",e.INFORMATION="INFORMATION"}(n=t.eRulePolicy||(t.eRulePolicy={})),t.RulePass=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleRender=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:0,messageArgs:t||[],apiArgs:i||[]}},t.RuleFail=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.FAIL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RulePotential=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.POTENTIAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleManual=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.MANUAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}};var r=i(8601);Object.defineProperty(t,"eToolkitLevel",{enumerable:!0,get:function(){return r.eToolkitLevel}});var l=i(8601);Object.defineProperty(t,"eRuleCategory",{enumerable:!0,get:function(){return l.eGuidelineCategory}});var o=i(8601);Object.defineProperty(t,"eRulesetType",{enumerable:!0,get:function(){return o.eGuidelineType}})},7412(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.Checker=void 0;var l=i(461),o=i(7301),s=i(9955),u=i(6160),d=r(i(591)),c=i(8601),m=[],p={},h={};!function(){var e=JSON.parse(JSON.stringify(o.Engine.getLanguages()));for(var t in e.push("en-US"),d){var i=d[t];m.push(i);for(var a=e.length-1;a>=0;--a){var n=e[a];if(n in i.messages&&(p[i.id]=i.messages[n],p[i.id][0]=p[i.id].group),n in i.help){for(var r in h[i.id]={},i.help[n])h[i.id][r]="/".concat(n,"/").concat(i.help[n][r]);p[i.id][0]=p[i.id].group}}for(var l=0,s=i.rulesets;l<s.length;l++)for(var c=s[l],g=0,b=u.a11yRulesets;g<b.length;g++){var _=b[g];if(("string"==typeof c.id?[c.id]:c.id).includes(_.id))for(var f=0,v=_.checkpoints;f<v.length;f++){var A=v[f];("string"==typeof c.num?[c.num]:c.num).includes(A.num)&&(A.rules=A.rules||[],A.rules.push({id:i.id,reasonCodes:c.reasonCodes,level:c.level,toolkitLevel:c.toolkitLevel}))}}}}();var g=function(){function e(){this.guidelines=[],this.rulesets=this.guidelines,this.rulesetIds=[],this.rulesetRules={},this.ruleLevels={},this.ruleReasonLevels={},this.ruleCategory={};var e=this.engine=new o.Engine;e.addMapper(new s.ARIAMapper),e.addRules(m),e.addNlsMap(p),e.addHelpMap(h);for(var t=0,i=u.a11yRulesets;t<i.length;t++){var a=i[t];this.addRuleset(a)}}return e.prototype.addGuideline=function(e){e.id in this.rulesetRules&&this.removeGuideline(e.id),this.guidelines.push(e),this.rulesetIds.push(e.id);for(var t=[],i=0,a=e.checkpoints;i<a.length;i++){var n=a[i];n.rules=n.rules||[];for(var r=0,l=n.rules;r<l.length;r++){var o=l[r];if(!1!==o.enabled){t.push(o.id),this.ruleReasonLevels[o.id]=this.ruleReasonLevels[o.id]||{},this.ruleReasonLevels[o.id][e.id]=this.ruleReasonLevels[o.id][e.id]||{};var s=o.reasonCodes?o.reasonCodes.join("--"):"None";this.ruleReasonLevels[o.id][e.id][s]=o.level,this.ruleCategory[o.id]=this.ruleCategory[o.id]||{},this.ruleCategory[o.id][e.id]=e.category}}}this.rulesetRules[e.id]=t},e.prototype.enableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,r=0,l=a.checkpoints;r<l.length;r++)for(var o=0,s=l[r].rules;o<s.length;o++){var u=s[o];!1===u.enabled&&(n=!0,delete u.enabled)}n&&this.addGuideline(a)}},e.prototype.disableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,r=0,l=a.checkpoints;r<l.length;r++)for(var o=0,s=l[r].rules;o<s.length;o++){var u=s[o];!1!==u.enabled&&(n=!0,u.enabled=!1)}n&&this.addGuideline(a)}},e.prototype.removeGuideline=function(e){e in this.rulesetRules&&(delete this.rulesetRules[e],this.rulesets=this.guidelines=this.guidelines.filter(function(t){return t.id!==e}),this.rulesetIds=this.getGuidelineIds())},e.prototype.getGuidelines=function(){return JSON.parse(JSON.stringify(this.guidelines))},e.prototype.getGuidelineIds=function(){return this.guidelines.map(function(e){return e.id})},e.prototype.addRuleset=function(e){this.addGuideline(e)},e.prototype.enableSourceMap=function(e){this.engine.enableSourceMap(e)},e.prototype.isSourceMapEnabled=function(){return this.engine.isSourceMapEnabled()},e.prototype.check=function(e,t){var i=[];if(t){"string"==typeof t&&(t=[t]);for(var a=0,n=t;a<n.length;a++){var r=n[a];r in this.rulesetRules&&(i=i.concat(this.rulesetRules[r]))}}else i=this.engine.getRulesIds();this.engine.enableRules(i);var l=this;return this.engine.run(e).then(function(e){e.nls={};for(var i=0,a=e.results;i<a.length;i++){var n=a[i];n.ruleId in p&&(e.nls[n.ruleId]=e.nls[n.ruleId]||{0:p[n.ruleId][0]},n.reasonId in p[n.ruleId]&&(e.nls[n.ruleId][n.reasonId]=p[n.ruleId][n.reasonId]));var r=n.reasonId?n.reasonId:"None";n.value[0]=l.getReasonLevel(t,n.ruleId,r),n.category=l.getCategory(t,n.ruleId),delete n.path.css}return e})},e.prototype.getLevel=function(e,t){if(!e)return l.eRulePolicy.INFORMATION;var i=this.ruleLevels[t],a=null;if(e){if(!(t in this.ruleLevels))throw new Error("Rule triggered for which we have no rule level information: "+t);for(var n=0,r=e;n<r.length;n++){var o=r[n];o in i&&(i[o]===l.eRulePolicy.VIOLATION?a=l.eRulePolicy.VIOLATION:i[o]===l.eRulePolicy.RECOMMENDATION&&null===a?a=l.eRulePolicy.RECOMMENDATION:null===a&&(a=l.eRulePolicy.INFORMATION))}}if(null===a)throw new Error("Rule triggered for which we have no rule level information: "+t);return a},e.prototype.getReasonLevel=function(e,t,i){if(!e)return l.eRulePolicy.INFORMATION;var a=this.ruleReasonLevels[t],n=null;if(e){if(!(t in this.ruleReasonLevels))throw new Error("Rule triggered for which we have no rule level information "+t);for(var r=function(e){if(e in a){var t=new RegExp("(^|--)".concat(i,"($|--)"));Object.keys(a[e]).forEach(function(i){var r=null;"None"===i?r=a[e].None:t.test(i)&&(r=a[e][i]),null!==r&&(r===l.eRulePolicy.VIOLATION?n=l.eRulePolicy.VIOLATION:r===l.eRulePolicy.RECOMMENDATION&&null===n?n=l.eRulePolicy.RECOMMENDATION:null===n&&(n=l.eRulePolicy.INFORMATION))}),null===n&&(n=l.eRulePolicy.INFORMATION)}},o=0,s=e;o<s.length;o++)r(s[o])}if(null===n)throw new Error("Rule triggered for which we have no rule level information: "+t);return n},e.prototype.getCategory=function(e,t){var i=this.ruleCategory[t];if(!(t in this.ruleCategory))return c.eGuidelineCategory.OTHER;e||(e=this.getGuidelineIds());for(var a=0,n=e;a<n.length;a++){var r=n[a];if(r in i)return i[r]}return c.eGuidelineCategory.OTHER},e}();t.Checker=g},2297(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_target_warning=void 0;var a=i(7139),n=i(3946),r=i(5279),l=i(461),o=i(461);t.a_target_warning={id:"a_target_warning",context:"dom:a[target],dom:area[target],dom:base[target]",refactor:{WCAG20_A_TargetAndText:{Pass_0:"pass",Potential_1:"potential_warn"}},help:{"en-US":{group:"a_target_warning.html",pass:"a_target_warning.html",potential_warn:"a_target_warning.html"}},messages:{"en-US":{group:"Users should be warned in advance if their input action will open a new window",pass:"The user is warned in advance that the input action opens a new window",potential_warn:"Inform the user when their input action will open a new window"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.2.2",level:o.eRulePolicy.RECOMMENDATION,toolkitLevel:o.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var o=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(o)&&!a.CommonUtil.isTabbable(o))return null;var s={paramWinText:{value:["new window","new tab"],type:"array"}},u=o.getAttribute("target"),d="_parent"==u||"_self"==u||"_top"==u||null!=a.CommonUtil.getFrameByName(o,u);if(!d){var c=a.CommonUtil.getInnerText(o);if(o.hasAttribute("title")&&(c+=" "+o.getAttribute("title")),o.hasAttribute("aria-describedby"))for(var m=0,p=o.getAttribute("aria-describedby").trim().split(/\s+/);m<p.length;m++){var h=p[m],g=r.FragmentUtil.getById(o,h);if(g){var b=a.CommonUtil.getInnerText(g);b&&b.trim().length>0&&(c+=" "+b)}}for(var _=0;!d&&_<s.paramWinText.value.length;++_)-1!=c.indexOf(s.paramWinText.value[_])&&(d=!0)}return d?(0,l.RulePass)("pass"):(0,l.RulePotential)("potential_warn")}}},4401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_text_purpose=void 0;var a=i(461),n=i(7139),r=i(3946),l=i(461),o=i(1950);t.a_text_purpose={id:"a_text_purpose",context:"aria:link,aria:doc-biblioref",refactor:{WCAG20_A_HasText:{Pass_0:"pass",Fail_1:"fail_acc_name"}},help:{"en-US":{group:"a_text_purpose.html",pass:"a_text_purpose.html",fail_acc_name:"a_text_purpose.html"}},messages:{"en-US":{group:"Hyperlinks must have an accessible name for their purpose",pass:"Hyperlink has a description of its purpose",fail_acc_name:"Hyperlink has no link text, label or image with a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["2.4.4","4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:"c487ae",run:function(e,t){var i=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(i)||n.CommonUtil.isNodeDisabled(i))return null;var l=o.AccNameUtil.computeAccessibleName(i);return l&&l.name&&l.name.trim().length>0||n.CommonUtil.nonTabableChildCheck(i)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},4546(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.applet_alt_exists=void 0;var a=i(7139),n=i(3946),r=i(461),l=i(461);t.applet_alt_exists={id:"applet_alt_exists",context:"dom:applet",refactor:{WCAG20_Applet_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"applet_alt_exists.html",Pass_0:"applet_alt_exists.html",Fail_1:"applet_alt_exists.html",Fail_2:"applet_alt_exists.html",Fail_3:"applet_alt_exists.html"}},messages:{"en-US":{group:"<applet> elements must provide an 'alt' attribute and an alternative description",Pass_0:"Rule Passed",Fail_1:"An <applet> element does not have an 'alt' attribute that provides a short text alternative",Fail_2:"The 'alt' attribute value for an <applet> element duplicates the 'code' attribute",Fail_3:"An <applet> element provides alternative text, but does not provide inner content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;if(a.CommonUtil.attributeNonEmpty(l,"alt")){var o=l.getAttribute("alt").trim();return l.hasAttribute("code")&&o==l.getAttribute("code").trim()?(0,r.RuleFail)("Fail_2"):a.CommonUtil.hasInnerContentHidden(l)?(0,r.RulePass)("Pass_0"):(0,r.RuleFail)("Fail_3")}return(0,r.RuleFail)("Fail_1")}}},9292(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.application_content_accessible=void 0;var a=i(7011),n=i(3946),r=i(461),l=i(461);t.application_content_accessible={id:"application_content_accessible",context:"aria:application",refactor:{HAAC_Application_Role_Text:{0:"HAAC_Application_Role_Text.html",Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{0:"application_content_accessible.html",Pass_0:"application_content_accessible.html",Potential_1:"application_content_accessible.html"}},messages:{"en-US":{group:'Non-decorative static text and image content within an element with "application" role must be accessible',Pass_0:"Rule Passed",Potential_1:'Verify that the non-decorative static text and image content within an element with "application" role are accessible'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.1.1","2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){for(var l=!0,o=e.dom.node.childNodes,s=0;l&&s<o.length;s++)1===o[s].nodeType?n.VisUtil.isNodeVisible(o[s])&&(l=a.AriaUtil.hasRoleInSemantics(o[s],"document")||a.AriaUtil.hasRoleInSemantics(o[s],"article")):3===o[s].nodeType&&(l=0===o[s].nodeValue.trim().length);return l?(0,r.RulePass)("Pass_0"):(0,r.RulePotential)("Potential_1")}}},9605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.area_alt_exists=void 0;var a=i(7139),n=i(3946),r=i(461),l=i(461);t.area_alt_exists={id:"area_alt_exists",context:"dom:area",refactor:{WCAG20_Area_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"area_alt_exists.html",Pass_0:"area_alt_exists.html",Fail_1:"area_alt_exists.html"}},messages:{"en-US":{group:"<area> elements in an image map must have a text alternative",Pass_0:"Rule Passed",Fail_1:"<area> element in an image map has no text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.VisUtil.isNodeHiddenFromAT(l)?null:a.CommonUtil.attributeNonEmpty(l,"alt")?(0,r.RulePass)("Pass_0"):(0,r.RuleFail)("Fail_1")}}},3987(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_accessiblename_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946),o=i(1950),s=i(9910);t.aria_accessiblename_exists={id:"aria_accessiblename_exists",context:"aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example",help:{"en-US":{pass:"aria_accessiblename_exists.html",fail_no_accessible_name:"aria_accessiblename_exists.html",fail_no_accessible_name_image:"aria_accessiblename_exists.html",group:"aria_accessiblename_exists.html"}},messages:{"en-US":{pass:"An accessible name is provided for the element",fail_no_accessible_name:'Element <{0}> with "{1}" role has no accessible name',fail_no_accessible_name_image:'Element <{0}> with "{1}" role has no accessible name',group:"Elements with certain roles should have accessible names"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name_image"]}],act:[{"23a2a8":{fail_no_accessible_name_image:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var u=n.nodeName.toLocaleLowerCase();if("svg"!==u&&"img"!==u){if("table"===u&&n.firstElementChild&&"caption"===n.firstElementChild.nodeName.toLowerCase()&&n.firstElementChild.textContent&&n.firstElementChild.textContent.trim().length>0)return(0,a.RulePass)("pass");var d=r.AriaUtil.getRolesUndefinedByAria(n);if(d&&d.length>0)return null;var c=r.AriaUtil.getDeprecatedAriaRoles(n);if(c&&c.length>0)return null;var m=r.AriaUtil.getDeprecatedAriaAttributes(n);if(m&&m.length>0)return null;var p=r.AriaUtil.getResolvedRole(n);if(!p||!s.ARIADefinitions.designPatterns[p]||!s.ARIADefinitions.designPatterns[p].nameRequired)return null;var h=o.AccNameUtil.computeAccessibleName(n);return h&&h.name&&0!==h.name.trim().length?(0,a.RulePass)("pass"):"img"===p||"image"===p?(0,a.RuleFail)("fail_no_accessible_name_image",[n.nodeName.toLowerCase(),p]):(0,a.RuleFail)("fail_no_accessible_name",[n.nodeName.toLowerCase(),p])}}}},8631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_tabindex_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.aria_activedescendant_tabindex_valid={id:"aria_activedescendant_tabindex_valid",context:"dom:*[aria-activedescendant]",refactor:{Rpt_Aria_InvalidTabindexForActivedescendant:{pass:"pass",Fail_1:"Fail_1"}},help:{"en-US":{pass:"aria_activedescendant_tabindex_valid.html",Fail_1:"aria_activedescendant_tabindex_valid.html",group:"aria_activedescendant_tabindex_valid.html"}},messages:{"en-US":{pass:"Rule Passed",Fail_1:"The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable",group:"Element using 'aria-activedescendant' property should be tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!1,o=n.nodeName.toLowerCase();if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if(r.CommonUtil.isNodeDisabled(n))return null;if(0!==n.getAttribute("aria-activedescendant").trim().length){(l=r.CommonUtil.isTabbable(n))||(l=r.CommonUtil.getTabbableChildren(n)>0);var s=new Array;s.push(o);var u=new Array;return u.push(n.getAttribute("aria-activedescendant").split(" ").join(", ")),l?(0,a.RulePass)("pass"):(0,a.RuleFail)("Fail_1",[s.toString(),u.toString()])}}}},8025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(3946),u=i(1686);t.aria_activedescendant_valid={id:"aria_activedescendant_valid",context:"dom:*[aria-activedescendant]",refactor:{HAAC_ActiveDescendantCheck:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"aria_activedescendant_valid.html",Fail_1:"aria_activedescendant_valid.html",Fail_2:"aria_activedescendant_valid.html",Fail_3:"aria_activedescendant_valid.html",group:"aria_activedescendant_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'aria-activedescendant' property is empty",Fail_2:"The 'aria-activedescendant' property references a hidden node",Fail_3:"Element is not a combobox, and the referenced active-descendant element is not a valid descendant",group:"The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.AriaUtil.hasRoleInSemantics(n,"combobox"))return null;var d=r.AriaUtil.getAriaAttribute(n,"aria-activedescendant");if(!d||""===d.trim())return(0,a.RuleFail)("Fail_1");var c=o.FragmentUtil.getById(n,d.trim());if(!c||u.DOMUtil.sameNode(d,n))return null;if(!s.VisUtil.isNodeVisible(c))return(0,a.RuleFail)("Fail_2");if(n.contains(c))return(0,a.RulePass)("Pass_0");var m=2;if(n.hasAttribute("aria-owns"))for(var p=l.CommonUtil.normalizeSpacing(n.getAttribute("aria-owns").trim()).split(" "),h=0;h<p.length;h++)if((v=o.FragmentUtil.getById(n,p[h]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0");if(r.AriaUtil.hasRoleInSemantics(n,"textbox")&&n.hasAttribute("aria-controls")){m=3;var g=l.CommonUtil.normalizeSpacing(n.getAttribute("aria-controls").trim()).split(" ");for(h=0;h<g.length;h++){var b=o.FragmentUtil.getById(n,g[h]);if(b&&!u.DOMUtil.sameNode(b,n)&&b.contains(c))return(0,a.RulePass)("Pass_0");if(b.hasAttribute("aria-owns"))for(var _=l.CommonUtil.normalizeSpacing(b.getAttribute("aria-owns").trim()).split(" "),f=0;f<_.length;f++){var v;if((v=o.FragmentUtil.getById(n,_[f]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0")}}}return 3==m?(0,a.RuleFail)("Fail_3"):null}}},1198(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_application_label_unique={id:"aria_application_label_unique",context:"aria:application",refactor:{Rpt_Aria_MultipleApplicationLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_application_label_unique.html",fail_label_not_unique:"aria_application_label_unique.html",group:"aria_application_label_unique.html"}},messages:{"en-US":{pass:'The element with "application" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "application" role do not have unique labels',group:'Each element with "application" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"application");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8001(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_labelled=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.aria_application_labelled={id:"aria_application_labelled",context:"aria:application",refactor:{Rpt_Aria_ApplicationLandmarkLabel:{Pass_0:"pass",Fail_1:"fail_no_label"}},help:{"en-US":{pass:"aria_application_labelled.html",fail_no_label:"aria_application_labelled.html",group:"aria_application_labelled.html"}},messages:{"en-US":{pass:'The element with "application" role has a label that describes its purpose',fail_no_label:'Element with "application" role does not have a label',group:'Each element with "application" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_label")}}},5778(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_article_label_unique=void 0;var a=i(461),n=i(461),r=i(3946),l=i(7011);t.aria_article_label_unique={id:"aria_article_label_unique",context:"aria:article",refactor:{Rpt_Aria_MultipleArticleRoles_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_article_label_unique.html",fail_label_not_unique:"aria_article_label_unique.html",group:"aria_article_label_unique.html"}},messages:{"en-US":{pass:'The element with "article" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "article" role do not have unique labels',group:'Each element with "article" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"article");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8118(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_allowed=void 0;var a=i(461),n=i(461),r=i(9910),l=i(7011);t.aria_attribute_allowed={id:"aria_attribute_allowed",context:"dom:*",refactor:{Rpt_Aria_ValidProperty:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_allowed.html",Pass_0:"aria_attribute_allowed.html",Fail_1:"aria_attribute_allowed.html"}},messages:{"en-US":{group:"ARIA attributes must be valid for the element's role",Pass_0:"Rule Passed",Fail_1:"The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"5f99a7",run:function(e,t,i){var n=e.dom.node,o=n.attributes;if(o){for(var s=r.ARIADefinitions.propertyDataTypes,u="",d=0,c=0,m=o.length;c<m;c++){var p=o[c].name;l.AriaUtil.isDefinedAriaAttribute(n,p)&&(d++,s[p]||(u=0==u.length?p:u+", "+p))}return 0==d?null:0!=u.length?(0,a.RuleFail)("Fail_1",[u,n.nodeName.toLowerCase()]):(0,a.RulePass)("Pass_0")}return null}}},2242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_conflict=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.aria_attribute_conflict={id:"aria_attribute_conflict",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{fail_conflict:"aria_attribute_conflict.html",group:"aria_attribute_conflict.html"}},messages:{"en-US":{fail_conflict:'The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"',group:"An ARIA attribute must not conflict with the corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.AriaUtil.getInvalidAriaAttributes(n);if(o&&o.length>0)return null;var s=[],u=r.AriaUtil.getUserDefinedAriaAttributes(n);if(!u||0===u.length)return null;for(var d=r.AriaUtil.getConflictAriaAndHtmlAttributes(n),c=0;c<d.length;c++)s.push((0,a.RuleFail)("fail_conflict",[d[c].ariaAttr,d[c].htmlAttr])),u.includes(d[c].ariaAttr)&&l.CommonUtil.reduceArrayItemList([d[c].ariaAttr],u);return s.length>0?s:null}}},3673(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_deprecated=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_attribute_deprecated={id:"aria_attribute_deprecated",context:"dom:*",help:{"en-US":{fail_aria_role:"aria_attribute_deprecated.html",fail_aria_attr:"aria_attribute_deprecated.html",fail_role_attr:"aria_attribute_deprecated.html",group:"aria_attribute_deprecated.html"}},messages:{"en-US":{fail_aria_role:'The ARIA role "{0}" is deprecated in the ARIA specification',fail_aria_attr:'The ARIA attributes "{0}" are deprecated in the ARIA specification',fail_role_attr:'The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification',group:"No deprecated ARIA role or attribute should be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=[],o=r.AriaUtil.getDeprecatedAriaRoles(n);if(o&&o.length>0)for(var s=0;s<o.length;s++)l.push((0,a.RuleFail)("fail_aria_role",[o[s]]));var u=r.AriaUtil.getDeprecatedAriaAttributes(n);if(u&&u.length>0)for(s=0;s<u.length;s++)"any"===u[s].role?l.push((0,a.RuleFail)("fail_aria_attr",[u[s].attribute])):l.push((0,a.RuleFail)("fail_role_attr",[u[s].attribute,u[s].role]));return l.length>0?l:null}}},5080(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3946);t.aria_attribute_exists={id:"aria_attribute_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_EmptyPropertyValue:{pass:"pass",fail_empty_attribute:"fail_empty_attribute"}},help:{"en-US":{pass:"aria_attribute_exists.html",fail_empty_attribute:"aria_attribute_exists.html",group:"aria_attribute_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_empty_attribute:"The element attribute(s): '{0}' value is empty",group:"When specifying a required ARIA attribute, the value must not be empty"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["6a7281"],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)){var u=new Array,d=o.ARIADefinitions.designPatterns,c=l.CommonUtil.hasAttribute,m=0,p=r.AriaUtil.getResolvedRole(n);if(p){if(d[p]&&null!=r.AriaUtil.getRoleRequiredProperties(p,n))for(var h=r.AriaUtil.getRoleRequiredProperties(p,n),g=0,b=h.length;g<b;g++)c(n,w=h[g])?(m++,0==l.CommonUtil.normalizeSpacing(n.getAttribute(h[g])).length&&u.push(h[g])):"aria-labelledby"==h[g]?"radiogroup"==p&&c(n,"aria-label")&&(m++,0==l.CommonUtil.normalizeSpacing(n.getAttribute("aria-label")).length&&u.push("aria-label")):"aria-valuenow"==h[g]&&"progressbar"==p&&c(n,"aria-valuetext")&&(m++,0==l.CommonUtil.normalizeSpacing(n.getAttribute("aria-valuetext")).length&&u.push("aria-valuetext"));if(d[p]){var _=r.AriaUtil.getElementAriaProperty(n),f=[];f.push(p);for(var v=r.AriaUtil.getAllowedAriaAttributes(n,f,_),A=(g=0,v.length);g<A;g++){var w;"aria-checked"!=(w=v[g])&&"aria-selected"!=w&&"aria-expanded"!=w&&"aria-orientation"!=w&&"aria-level"!=w||c(n,w)&&(m++,0!=l.CommonUtil.normalizeSpacing(n.getAttribute(w)).length||u.includes(w)||u.push(w))}}var y=new Array,C=0==u.length;return y.push(u.join(", ")),0==m?null:C?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_empty_attribute",y)}}}}},183(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_redundant=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_attribute_redundant={id:"aria_attribute_redundant",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{pass:"aria_attribute_redundant.html",fail_redundant:"aria_attribute_redundant.html",group:"aria_attribute_redundant.html"}},messages:{"en-US":{pass:"The ARIA attribute is not redundant with a corresponding HTML attribute",fail_redundant:'The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"',group:"An ARIA attribute should not be redundant with a corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.AriaUtil.getInvalidAriaAttributes(n);if(l&&l.length>0)return null;var o=r.AriaUtil.getConflictAriaAndHtmlAttributes(n);if(o&&o.length>0)return null;var s=n.attributes,u=[],d=[];if(s)for(var c=0;c<s.length;c++){var m=s[c].name.trim().toLowerCase(),p=n.getAttribute(m);""===p&&(p=null),"aria-"===m.substring(0,5)?u.push({name:m,value:p}):d.push({name:m,value:p})}var h=[],g=function(e){var t=r.AriaUtil.getConflictOrOverlappingHtmlAttribute(u[e],d,"overlapping");if(null===t)return"continue";t.forEach(function(t){"Pass"===t.result?h.push((0,a.RulePass)("pass")):"Failed"===t.result&&h.push((0,a.RuleFail)("fail_redundant",[u[e].name,t.attr]))})};for(c=0;c<u.length;c++)g(c);return h.length>0?h:null}}},6805(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_required=void 0;var a=i(9910),n=i(7011),r=i(7139),l=i(461),o=i(461);t.aria_attribute_required={id:"aria_attribute_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredProperties:{Pass_0:"pass",Fail_1:"fail_missing"}},help:{"en-US":{group:"aria_attribute_required.html",pass:"aria_attribute_required.html",fail_missing:"aria_attribute_required.html"}},messages:{"en-US":{group:"The required attributes for the element with a role must be defined",pass:"The required attributes for the element with the role are defined",fail_missing:"Element with '{0}' role does not have the required ARIA attribute(s): '{1}'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:"4e8ab6",run:function(e,t,i){var o=e.dom.node,s=new Array,u=new Array,d=a.ARIADefinitions.designPatterns,c=r.CommonUtil.hasAttribute,m=n.AriaUtil.getElementAriaProperty(o),p=n.AriaUtil.getResolvedRole(o);if(p){var h=n.AriaUtil.getRoleRequiredProperties(p,o);if(d[p]&&null!==h){for(var g=n.AriaUtil.getAllowedAriaAttributes(o,p,m),b=!1,_=0,f=h.length;_<f;_++)g.includes(h[_])&&(c(o,h[_])||("aria-labelledby"==h[_]?c(o,"aria-label")&&"radiogroup"==p||(s.push(h[_]),b=!0):"aria-valuenow"==h[_]?c(o,"aria-valuetext")&&"progressbar"==p||(s.push(h[_]),b=!0):"aria-controls"==h[_]&&"combobox"==p||(s.push(h[_]),b=!0)));1==b&&u.push(p)}if(0==u.length||0==s.length)return(0,l.RulePass)("pass");var v=new Array;return v.push(u.join(", ")),v.push(s.join(", ")),(0,l.RuleFail)("fail_missing",v)}}}},1886(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_value_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910);t.aria_attribute_value_valid={id:"aria_attribute_value_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{Rpt_Aria_ValidPropertyValue:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_value_valid.html",Pass_0:"aria_attribute_value_valid.html",Fail_1:"aria_attribute_value_valid.html"}},messages:{"en-US":{group:"ARIA property values must be valid",Pass_0:"Rule Passed",Fail_1:"The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"6a7281",run:function(e,t,i){var n=e.dom.node,s=new Array,u=new Array,d=new Array,c=o.ARIADefinitions.propertyDataTypes,m=n.attributes,p=0;if(m)for(var h=0,g=m.length;h<g;h++){var b=m[h].name;if(r.AriaUtil.isDefinedAriaAttribute(n,b)){var _=c[b],f=l.CommonUtil.normalizeSpacing(m[h].nodeValue);if(p++,_&&_.values){if(-1==_.values.indexOf(f))if(-1!=_.values.indexOf("undefined")&&0==f.length);else if("http://www.w3.org/2001/XMLSchema#nmtokens"===_.type){var v=m[h].nodeValue.trim().split(" ");if(v.length>1&&v.includes("all"))s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString());else for(var A={},w=0;w<v.length;w++)""==v[w]||_.values.includes(v[w])||(A.hasOwnProperty(b)||(A[b]=!0,u.push(b)),s.push(v[w]),d.push(_.values.toString()))}else s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString())}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#int"===_.type){var y=parseInt(f);(isNaN(y)||""+y!==f)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#decimal"==_.type){var C=parseFloat(f);isNaN(C)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#boolean"==_.type){var k=f.trim().toLowerCase();"true"!==k&&"false"!==k&&(s.push(f),u.push(b))}else _&&_.type&&"http://www.w3.org/2001/XMLSchema#string"==_.type||p--}}var R=new Array,x=0==u.length;return R.push(s.join(", ")),R.push(u.join(", ")),R.push(n.nodeName.toLowerCase()),0==p?null:x?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",R)}}},4078(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_banner_label_unique={id:"aria_banner_label_unique",context:"aria:banner",refactor:{Rpt_Aria_MultipleBannerLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_banner_label_unique.html",fail_label_not_unique:"aria_banner_label_unique.html",group:"aria_banner_label_unique.html"}},messages:{"en-US":{pass:'The element with "banner" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "banner" role do not have unique labels',group:'Each element with "banner" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"banner",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5750(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_single=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_banner_single={id:"aria_banner_single",context:"dom:*[role], dom:header",refactor:{Rpt_Aria_OneBannerInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_single.html",Fail_1:"aria_banner_single.html",group:"aria_banner_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role found on the page',group:'A page, document, or application should only have one element with "banner" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"banner")?null===r.AriaUtil.getSiblingWithRoleHidden(n,"banner",!0,!0)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},85(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_tabbable=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3946);t.aria_child_tabbable={id:"aria_child_tabbable",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingFocusableChild:{pass:"pass",fail_missing_child:"fail_missing_child"}},help:{"en-US":{pass:"aria_child_tabbable.html",fail_missing_child:"aria_child_tabbable.html",group:"aria_child_tabbable.html"}},messages:{"en-US":{pass:"Rule Passed",fail_missing_child:'None of the descendent elements with "{1}" role is tabbable',group:"UI component must have at least one tabbable descendant for keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||l.CommonUtil.isNodeDisabled(n)||r.AriaUtil.containsPresentationalChildrenOnly(n)||r.AriaUtil.shouldBePresentationalChild(n))){if(r.AriaUtil.hasRole(n,{list:!0,row:!0,rowgroup:!0,table:!0,grid:!0}))return null;if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if("datalist"===n.nodeName.toLowerCase())return null;if(r.AriaUtil.isNavigationOwnedOrControlled(n))return null;var u=r.AriaUtil.getResolvedRole(n),d=!0,c=n.ownerDocument,m=l.CommonUtil.hasAttribute,p=new Array,h="",g=!1;if(o.ARIADefinitions.containers.includes(u)&&"true"!=(m(n,"aria-disabled")?n.getAttribute("aria-disabled"):"")&&!m(n,"aria-activedescendant")&&!l.CommonUtil.isTabbable(n)){var b=o.ARIADefinitions.designPatterns[u].reqChildren;if(b){g=!0,d=!1;for(var _="descendant::*[",f=0;f<b.length;f++)_+="@role='"+b[f]+"' or ";_=_.substring(0,_.length-4)+"]";for(var v=c.evaluate(_,n,l.CommonUtil.defaultNSResolver,0,null),A=v.iterateNext();A&&!d;)if(l.CommonUtil.shouldNodeBeSkippedHidden(A))A=v.iterateNext();else{if(!(d=l.CommonUtil.isTabbable(A)))for(var w=c.evaluate("descendant::*",A,l.CommonUtil.defaultNSResolver,0,null),y=w.iterateNext();y&&!d;)l.CommonUtil.shouldNodeBeSkippedHidden(y)||(d=l.CommonUtil.isTabbable(A)),y=w.iterateNext();d||(p=A.getAttribute("role").trim().split(" "),h=A.nodeName.toLowerCase()),A=v.iterateNext()}}}var C=new Array,k=new Array;return h.length>0&&p.length>0?(C.push(h),k.push(p.join(", "))):d=!0,g?d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_missing_child",[C.toString(),k.toString()]):null}}}},514(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_child_valid={id:"aria_child_valid",context:"dom:*",dependencies:["aria_role_valid","aria_descendant_valid"],help:{"en-US":{group:"aria_child_valid.html",Pass:"aria_child_valid.html",Fail_no_child:"aria_child_valid.html",Fail_invalid_child:"aria_child_valid.html"}},messages:{"en-US":{group:"An element with an ARIA role must own a required child",Pass:"An element with an ARIA role owns a required child",Fail_no_child:'The element with role "{0}" does not own any child element with any of the following role(s): "{1}"',Fail_invalid_child:'The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["bc4a75"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)&&!r.AriaUtil.containsPresentationalChildrenOnly(n)){var s=r.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=r.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=["none","presentation"];if(s.some(function(e){return u.includes(e)}))return null;if(s.includes("combobox"))return null;var d=r.AriaUtil.getRequiredChildRoles(n,!0);if(d.includes("group")){var c=d.indexOf("group");c>-1&&d.splice(c,1)}if(0==d.length)return null;var m=r.AriaUtil.getDirectATChildren(n);if(!m||0==m.length){var p=n.getAttribute("aria-busy");return p&&"true"===p?null:((v=new Array).push(s.join(", ")),v.push(d.join(", ")),(0,a.RuleFail)("Fail_no_child",v))}for(var h=new Array,g=0;g<m.length;g++){var b=r.AriaUtil.getRoles(m[g],!1);b&&0!=b.length||(b=r.AriaUtil.getImplicitRole(m[g])),b&&b.length>0&&(b.some(function(e){return d.includes(e)})||h.push(b.join(", ")))}if(h.length>0){for(var _=[],f=0;f<h.length;f++){var v;(v=new Array).push(s.join(", ")),v.push(h[f]),v.push(d.join(", ")),_.push((0,a.RuleFail)("Fail_invalid_child",v))}return _}return(0,a.RulePass)("Pass")}}}},5310(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_complementary_label_unique={id:"aria_complementary_label_unique",context:"aria:complementary",refactor:{Rpt_Aria_MultipleComplementaryLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_complementary_label_unique.html",fail_label_not_unique:"aria_complementary_label_unique.html",group:"aria_complementary_label_unique.html"}},messages:{"en-US":{pass:'The element with "complementary" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "complementary" role do not have unique labels',group:'Each element with "complementary" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"complementary");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},9083(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_complementary_label_visible={id:"aria_complementary_label_visible",context:"dom:*[role], dom:aside",dependencies:["aria_complementary_labelled"],refactor:{Rpt_Aria_ComplementaryLandmarkLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_visible.html",Fail_1:"aria_complementary_label_visible.html",group:"aria_complementary_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a visible label',group:'Each element with "complementary" role should have a visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"complementary")?l.CommonUtil.attributeNonEmpty(n,"aria-labelledby")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},6049(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_labelled=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.aria_complementary_labelled={id:"aria_complementary_labelled",context:"aria:complementary",refactor:{Rpt_Aria_ComplementaryRequiredLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_labelled.html",Fail_1:"aria_complementary_labelled.html",group:"aria_complementary_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a label',group:'Each element with "complementary" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_content_in_landmark=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(4566),s=i(3864),u=i(3946),d=i(9196);t.aria_content_in_landmark={id:"aria_content_in_landmark",context:"dom:*",refactor:{Rpt_Aria_OrphanedContent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_content_in_landmark.html",Fail_1:"aria_content_in_landmark.html",group:"aria_content_in_landmark.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Content is not within a landmark element",group:"All content must reside within an element with a landmark role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=o.CacheUtil.getCache(e.dom.node.ownerDocument,"aria_content_in_landmark",null);if(!n){(n={landmarks:{value:["banner","complementary","contentinfo","form","main","navigation","region","search"],type:"array"},possibleOrphanedWidgets:{value:["button","combobox","checkbox","grid","heading","link","list","listbox","menu","menubar","progressbar","radio","tablist","textbox","toolbar","tree","treegrid"],type:"array"},possibleOrphanedElements:{value:["p","table","input","textarea","select","button","a","ol","ul","dl","h1","h2","h3","h4","h5","h6","embed","object","area"],type:"array"},noLandmarkedRoles:{value:["alert","alertdialog","dialog","tooltip"],type:"array"},mapLandmarks:{},mapPossibleOrphanedWidgets:{},mapPossibleOrphanedElements:{},mapNoLandmarkedRoles:{}}).mapLandmarks={};for(var c=0;c<n.landmarks.value.length;++c)n.mapLandmarks[n.landmarks.value[c]]=!0;for(n.mapPossibleOrphanedWidgets={},c=0;c<n.possibleOrphanedWidgets.value.length;++c)n.mapPossibleOrphanedWidgets[n.possibleOrphanedWidgets.value[c]]=!0;for(n.mapPossibleOrphanedElements={},c=0;c<n.possibleOrphanedElements.value.length;++c)n.mapPossibleOrphanedElements[n.possibleOrphanedElements.value[c]]=!0;for(n.mapNoLandmarkedRoles={},c=0;c<n.noLandmarkedRoles.value.length;++c)n.mapNoLandmarkedRoles[n.noLandmarkedRoles.value[c]]=!0;o.CacheUtil.setCache(e.dom.node.ownerDocument,"aria_content_in_landmark",n)}var m=e.dom.node,p=m.nodeName.toLowerCase();if(!u.VisUtil.isNodeVisible(m)||null!=u.VisUtil.hiddenByDefaultElements&&null!=u.VisUtil.hiddenByDefaultElements&&u.VisUtil.hiddenByDefaultElements.indexOf(p)>-1)return(0,a.RulePass)("Pass_0");if(!l.CommonUtil.hasInnerContentHidden(m)&&-1===["area","input","embed","button","textarea","select"].indexOf(p))return(0,a.RulePass)("Pass_0");if("table"==p&&d.TableUtil.isLayoutTable(m))return null;var h=!0,g=r.AriaUtil.hasRole(m,n.mapPossibleOrphanedWidgets,!0);"link"===p&&(g=!1);var b=p in n.mapPossibleOrphanedElements;if(!g&&!b)return null;if(!(h=i.aria.map(function(e){return e.role}).filter(function(e){return e in n.mapLandmarks}).length>0)){for(var _=s.DOMWalker.parentElement(m);!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=s.DOMWalker.parentElement(_);for(_=m.nextElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.nextElementSibling;for(_=m.previousElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.previousElementSibling;if(h)return null;if(o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent",!0),h=o.CacheUtil.getCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!1)||r.AriaUtil.hasRole(m,n.mapNoLandmarkedRoles,!0)||r.AriaUtil.getAncestorWithRole(m,n.mapNoLandmarkedRoles,!0))return o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!0),null}return h?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2759(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_contentinfo_label_unique={id:"aria_contentinfo_label_unique",context:"aria:contentinfo",refactor:{Rpt_Aria_MultipleContentinfoLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_contentinfo_label_unique.html",fail_label_not_unique:"aria_contentinfo_label_unique.html",group:"aria_contentinfo_label_unique.html"}},messages:{"en-US":{pass:'The element with "contentinfo" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "contentinfo" role do not have unique labels',group:'Each element with "contentinfo" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"contentinfo",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},3141(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_misuse=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_contentinfo_misuse={id:"aria_contentinfo_misuse",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_ContentinfoWithNoMain_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_misuse.html",Fail_1:"aria_contentinfo_misuse.html",group:"aria_contentinfo_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "contentinfo" role is present without an element with "main" role',group:'Each element with "contentinfo" role is only permitted with an element with "main" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"contentinfo")?l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0).length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},5131(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_single=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_contentinfo_single={id:"aria_contentinfo_single",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_single.html",Fail_1:"aria_contentinfo_single.html",group:"aria_contentinfo_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role found on the page',group:'A page, document, or application should only have one element with "contentinfo" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasRoleInSemantics(n,"contentinfo")?r.AriaUtil.getSiblingWithRoleHidden(n,"contentinfo",!0,!0)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0"):null}}},5167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_descendant_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_descendant_valid={id:"aria_descendant_valid",context:"dom:*",dependencies:["aria_role_valid"],help:{"en-US":{group:"aria_descendant_valid.html",pass:"aria_descendant_valid.html",potential_child_implicit_role:"aria_descendant_valid.html",recommendation_no_impact_role:"aria_descendant_valid.html",fail_child_explicit_role:"aria_descendant_valid.html"}},messages:{"en-US":{group:"Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements",pass:"The element contains valid descendants",potential_child_implicit_role:'The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers',recommendation_no_impact_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers',fail_child_explicit_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["pass","potential_child_implicit_role","fail_child_explicit_role"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["recommendation_no_impact_role"]}],act:["307n5z"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)&&r.AriaUtil.containsPresentationalChildrenOnly(n)){var s=r.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=r.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=r.AriaUtil.getDirectATChildren(n);if(!(u&&u.length>0))return(0,a.RulePass)("pass");for(var d=new Array,c=new Array,m=new Array,p=0;p<u.length;p++){var h=u[p].nodeName.toLowerCase();if("img"!==h&&"svg"!==h){var g=r.AriaUtil.getRoles(u[p],!1);g&&g.length>0?(g.includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),d.push(g.filter(function(e){return"code"!==e}).join(", "))):((g=r.AriaUtil.getImplicitRole(u[p])).includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),g&&g.length>0&&c.push(g.filter(function(e){return"code"!==e}).join(", ")))}}if(d.length>0){for(var b=[],_=0;_<d.length;_++)(f=new Array).push(s.join(", ")),f.push(d[_]),b.push((0,a.RuleFail)("fail_child_explicit_role",f));return b}if(c.length>0){for(b=[],_=0;_<c.length;_++)(f=new Array).push(s.join(", ")),f.push(c[_]),b.push((0,a.RulePotential)("potential_child_implicit_role",f));return b}if(m.length>0){for(b=[],_=0;_<m.length;_++){var f;(f=new Array).push(s.join(", ")),f.push(m[_]),b.push((0,a.RulePotential)("recommendation_no_impact_role",f))}return b}}}}},8115(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_document_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_document_label_unique={id:"aria_document_label_unique",context:"aria:document",refactor:{Rpt_Aria_MultipleDocumentRoles:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_document_label_unique.html",fail_label_not_unique:"aria_document_label_unique.html",group:"aria_document_label_unique.html"}},messages:{"en-US":{pass:'The element with "document" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "document" roles do not have unique labels',group:'Each element with "document" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"document",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_eventhandler_role_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.aria_eventhandler_role_valid={id:"aria_eventhandler_role_valid",context:"dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]",refactor:{Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_eventhandler_role_valid.html",Fail_1:"aria_eventhandler_role_valid.html",group:"aria_eventhandler_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <{0}> element with '{1}' does not have a valid ARIA role specified",group:"Elements with event handlers must have a valid ARIA role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.getAncestor(n,"svg"))return null;if(r.AriaUtil.hasAnyRole(n,!0))return(0,a.RulePass)("Pass_0");if(l.CommonUtil.isfocusableByDefault(n))return(0,a.RulePass)("Pass_0");var o=new Array;o.push(n.nodeName.toLowerCase());for(var s=new Array,u=["onblur","onfocus","onchange","onclick","ondblclick","onkeydown","onkeypress","onkeyup","onmousedown","onmouseup","onmousemove","onmouseout","onmouseover","onresize"],d=0;d<u.length;++d)n.hasAttribute(u[d])&&s.push(u[d]);var c=new Array;return c.push(s.join(", ")),(0,a.RuleFail)("Fail_1",[o.toString(),c.toString()])}}},5782(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_form_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_form_label_unique={id:"aria_form_label_unique",context:"aria:form",refactor:{Rpt_Aria_MultipleFormLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_form_label_unique.html",fail_label_not_unique:"aria_form_label_unique.html",group:"aria_form_label_unique.html"}},messages:{"en-US":{pass:'The element with "form" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "form" role do not have unique labels',group:'Each element with "form" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"form",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},6731(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_graphic_labelled=void 0;var a=i(461),n=i(7011),r=i(7139),l=i(3946);t.aria_graphic_labelled={id:"aria_graphic_labelled",context:"aria:graphics-document,aria:graphics-symbol",refactor:{HAAC_Aria_SvgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_graphic_labelled.html",Pass_0:"aria_graphic_labelled.html",Fail_1:"aria_graphic_labelled.html",Fail_2:"aria_graphic_labelled.html",Fail_3:"aria_graphic_labelled.html"}},messages:{"en-US":{group:"An element with a graphics role must have a non-empty label",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" graphics role has no label',Fail_2:'Element with "{0}" graphics role has no label or an empty label',Fail_3:"Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:[{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role")||!o.getAttribute("role").includes("graphics-"))return null;var s=n.AriaUtil.getAriaLabel(o).length>0;if(!s&&"svg"===o.nodeName.toLowerCase()){var u=o.querySelector("title");s=u&&r.CommonUtil.hasInnerContent(u)}return s||(s=r.CommonUtil.attributeNonEmpty(o,"title")),s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[o.getAttribute("role")])}}},390(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_hidden_nontabbable=void 0;var a=i(7139),n=i(461),r=i(461);t.aria_hidden_nontabbable={id:"aria_hidden_nontabbable",context:"dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*",refactor:{aria_hidden_focus_misuse:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_hidden_nontabbable.html",Pass_0:"aria_hidden_nontabbable.html",Fail_1:"aria_hidden_nontabbable.html"}},messages:{"en-US":{group:"A hidden element should not contain any tabbable elements",Pass_0:"Rule Passed",Fail_1:"Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.3.1","4.1.2"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:"6cfa84",run:function(e,t,i){var r=e.dom.node,l=r.nodeName.toLowerCase();return a.CommonUtil.isTabbable(r)?(0,n.RuleFail)("Fail_1",[l]):(0,n.RulePass)("Pass_0")}}},3900(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_id_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(9910),u=i(3946);t.aria_id_unique={id:"aria_id_unique",context:"dom:*",refactor:{Rpt_Aria_ValidIdRef:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_id_unique.html",Fail_1:"aria_id_unique.html",group:"aria_id_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid",group:"The ARIA property must reference a non-empty unique id of an existing element that is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["59796f","6a7281"],run:function(e,t,i){var n=e.dom.node,d=!0,c=new Array,m=(new Array,o.FragmentUtil.getOwnerFragment(n)),p=n.attributes,h=new Array,g=0;if(p)for(var b=0,_=p.length;b<_;b++){d=!0;var f=p[b].name;if(r.AriaUtil.isDefinedAriaAttribute(n,f)){var v=s.ARIADefinitions.propertyDataTypes[f];if(v&&v.type){var A="http://www.w3.org/2001/XMLSchema#idref"==v.type;if(A||"http://www.w3.org/2001/XMLSchema#idrefs"==v.type){g++;var w=l.CommonUtil.normalizeSpacing(p[b].nodeValue).length,y=p[b].nodeValue.split(" ");if(w<1)d=!1,h.push('"'+p[b].nodeValue+'"');else if(A&&w>=1&&y.length>1){d=!1;for(var C=0,k=y.length;C<k;++C)""!=y[C]&&h.push(y[C])}if(d&&w>=1)for(var R=0,x=y.length;R<x;++R)if(y[R].length>0){var P=m.getElementById(y[R]);if((d=null!=P)&&!v.hiddenIDRefSupported&&(d=u.VisUtil.isNodeVisible(P)),d)break;""!=y[R]&&h.push(y[R])}}}d||c.push(f)}}var T=0==c.length,U=new Array,I=new Array,E=new Array;return T||(I.push(c.join(", ")),E.push(n.nodeName.toLowerCase()),h.length>0&&U.push(h.join(", "))),0==g?null:T?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[U.toString(),I.toString(),E.toString()])}}},1218(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_img_labelled=void 0;var a=i(461),n=i(7011),r=i(7139),l=i(3946);t.aria_img_labelled={id:"aria_img_labelled",context:"aria:img, aria:image",refactor:{HAAC_Aria_ImgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_img_labelled.html",Pass_0:"aria_img_labelled.html",Fail_1:"aria_img_labelled.html",Fail_2:"aria_img_labelled.html",Fail_3:"aria_img_labelled.html"}},messages:{"en-US":{group:'An element with "img" role must have a non-empty label',Pass_0:"Rule Passed",Fail_1:'Element with "img" role has no label',Fail_2:'Element with "img" role has no label or an empty label',Fail_3:"Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:["23a2a8",{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role"))return null;var s=o.nodeName.toLocaleLowerCase();if("svg"!==s&&"img"!==s){var u=n.AriaUtil.getAriaLabel(o).length>0;if(!u&&"svg"===o.nodeName.toLowerCase()){var d=o.querySelector("title");u=d&&r.CommonUtil.hasInnerContent(d)}return u||(u=r.CommonUtil.attributeNonEmpty(o,"title")),u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2")}}}},6734(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_keyboard_handler_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3946);t.aria_keyboard_handler_exists={id:"aria_keyboard_handler_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingKeyboardHandler:{pass:"pass",potential_no_keyboard_access:"potential_no_keyboard_access"}},help:{"en-US":{pass:"aria_keyboard_handler_exists.html",potential_no_keyboard_access:"aria_keyboard_handler_exists.html",group:"aria_keyboard_handler_exists.html"}},messages:{"en-US":{pass:"Rule Passed",potential_no_keyboard_access:'Verify the <{0}> element with "{1}" role has keyboard access',group:"Interactive WAI_ARIA UI components must provide keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)){var u=!0,d=u,c=n.ownerDocument,m=o.ARIADefinitions.designPatterns,p=r.AriaUtil.getRoles(n,!1);if("datalist"===n.nodeName.toLowerCase()&&p&&p.includes("listbox"))return null;for(var h=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"],g=0,b=h;g<b.length;g++){var _=b[g];if(null!=r.AriaUtil.getAncestorWithRole(n,_,!0))return null}for(var f=l.CommonUtil.hasAttribute,v=new Array,A=0;A<p.length;++A){if(m[p[A]],h.indexOf(p[A])>=0&&!(f(n,"aria-disabled")&&n.getAttribute("aria-disabled")||(u=n.hasAttribute("onkeydown")||n.hasAttribute("onkeypress")||n.hasAttribute("onkeyup"))))if(f(n,"aria-activedescendant"))u=!0;else{var w,y=o.ARIADefinitions.designPatterns[p[A]].reqChildren;if(y)for(var C=0,k=y.length;C<k;C++)for(var R="*[contains(@role,'"+y[C]+"')]",x=c.evaluate(R,n,l.CommonUtil.defaultNSResolver,0,null),P=x.iterateNext();P;){if(!(u=P.hasAttribute("onkeydown")||P.hasAttribute("onkeypress")))for(var T="descendant::*",U=(w=c.evaluate(T,P,l.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)l.CommonUtil.shouldNodeBeSkippedHidden(U)||(u=l.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext();if(!u)break;P=x.iterateNext()}else for(T="descendant::*",U=(w=c.evaluate(T,n,l.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)if(l.CommonUtil.shouldNodeBeSkippedHidden(U))U=w.iterateNext();else{var I;(u=l.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext()}}u||v.push(p[A]),!u&&d&&(d=u)}var E=new Array;E.push(n.nodeName.toLowerCase());var N=new Array;N.push(v.join(", "));var L=n.getAttribute("id");return L&&L.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(L,"'][role='combobox']"))?null:d?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_no_keyboard_access",[E.toString(),N.toString()])}}}},9973(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_landmark_name_unique=void 0;var a=i(461),n=i(461),r=i(9955),l=i(1686),o=i(5279),s=i(4566),u=i(1950),d=i(3946),c=i(7139),m=i(7011);t.aria_landmark_name_unique={id:"aria_landmark_name_unique",context:"aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form",refactor:{landmark_name_unique:{Pass_0:"pass",Fail_0:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_landmark_name_unique.html",fail_label_not_unique:"aria_landmark_name_unique.html",group:"aria_landmark_name_unique.html"}},messages:{"en-US":{pass:"Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",fail_label_not_unique:'Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label',group:"Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(d.VisUtil.isNodeHiddenFromAT(n))return null;if(null!==c.CommonUtil.getAncestor(n,["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(n,"dialog",!0))return null;var p=o.FragmentUtil.getOwnerFragment(n),h=s.CacheUtil.getCache(n.ownerDocument,"aria_landmark_name_unique",null);if(!h){h={navigationNodes:[],navigationNodesComputedLabels:[],navigationNodesParents:[],navigationNodesMatchFound:[]};for(var g=p.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'),b=Array.from(g),_=[],f=[],v=[],A=0;A<b.length;A++)d.VisUtil.isNodeHiddenFromAT(b[A])||null!==c.CommonUtil.getAncestor(b[A],["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(b[A],"dialog",!0)||v.push(b[A]);for(b=v,A=0;A<b.length;A++){for(var w=[],y=b[A].parentElement;y;)w.push(y),y=y.parentElement;for(var C=0;C<w.length;C++){var k=["ASIDE","FOOTER","FORM","HEADER","MAIN","NAV","SECTION"].includes(w[C].tagName),R=!1;if(w[C].hasAttribute("role")&&(R=["complementary","contentinfo","form","banner","main","navigation","region","search"].includes(w[C].getAttribute("role"))),k||R){_.push(w[C]);break}if(C===w.length-1){_.push(null);break}}}var x=[];for(A=0;A<b.length;A++){var P=u.AccNameUtil.computeAccessibleName(b[A]);x.push(P&&P.name&&P.name.trim().length>0?P.name.trim():"")}for(A=0;A<_.length;A++){var T=!1,U=!1;for(C=0;C<_.length;C++)if(C!==A){if(null===_[A]&&null===_[C]){if(r.ARIAMapper.nodeToRole(b[A])===r.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}else if(null===_[A]||null===_[C])continue;if(l.DOMUtil.sameNode(_[A],_[C])&&r.ARIAMapper.nodeToRole(b[A])===r.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}T||(U?f.push("pass"):f.push("null"))}h.navigationNodesComputedLabels=x,h.navigationNodes=b,h.navigationNodesParents=_,h.navigationNodesMatchFound=f,s.CacheUtil.setCache(n.ownerDocument,"aria_landmark_name_unique",h)}var I=-1;for(A=0;A<h.navigationNodes.length;A++)n.isSameNode(h.navigationNodes[A])&&(I=A);return-1===I?null:"pass"===h.navigationNodesMatchFound[I]?(0,a.RulePass)("pass",[r.ARIAMapper.nodeToRole(h.navigationNodes[I])]):"fail_label_not_unique"===h.navigationNodesMatchFound[I]?(0,a.RuleFail)("fail_label_not_unique",[r.ARIAMapper.nodeToRole(h.navigationNodes[I]),h.navigationNodesComputedLabels[I]]):null}}},5711(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_main_label_unique={id:"aria_main_label_unique",context:"aria:main",refactor:{Rpt_Aria_MultipleMainsRequireLabel_Implicit_2:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_unique.html",Fail_1:"aria_main_label_unique.html",group:"aria_main_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique labels',group:'Each element with "main" role must have unique label that describes its purposes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;for(var s=r.AriaUtil.getAriaLabel(n),u=r.AriaUtil.getAncestorWithRole(n,"document",!0),d=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0),c=null,m=0;m<d.length;++m)if(d[m]!==n&&(c=(0,a.RulePass)("Pass_0"),r.AriaUtil.getAncestorWithRole(d[m],"document",!0)===u&&r.AriaUtil.getAriaLabel(d[m])===s)){c=(0,a.RuleFail)("Fail_1");break}return c}}},3384(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_main_label_visible={id:"aria_main_label_visible",context:"dom:body",refactor:{Rpt_Aria_MultipleMainsVisibleLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_visible.html",Fail_1:"aria_main_label_visible.html",group:"aria_main_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique visible labels',group:'Each element with "main" role should have a unique visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;var s=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0);return 0===s.length||1===s.length?null:r.AriaUtil.hasUniqueAriaLabelledby(s)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2762(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_navigation_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_navigation_label_unique={id:"aria_navigation_label_unique",context:"aria:navigation",refactor:{Rpt_Aria_MultipleNavigationLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_navigation_label_unique.html",fail_label_not_unique:"aria_navigation_label_unique.html",group:"aria_navigation_label_unique.html"}},messages:{"en-US":{pass:'The element with "navigation" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "navigation" role do not have unique labels',group:'Each element with "navigation" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"navigation",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5757(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_parent_required=void 0;var a=i(461),n=i(461),r=i(9910),l=i(7011),o=i(7139),s=i(3946);t.aria_parent_required={id:"aria_parent_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredParent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_parent_required.html",Pass_0:"aria_parent_required.html",Fail_1:"aria_parent_required.html"}},messages:{"en-US":{group:"Each element with an implicit or explicit role must be contained within a valid element",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"ff89c9",run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||o.CommonUtil.isNodeDisabled(n)||l.AriaUtil.shouldBePresentationalChild(n)||s.VisUtil.isNodePresentational(n))){for(var u=!0,d=r.ARIADefinitions.designPatterns,c=new Array,m=new Array,p=0,h=i.aria.map(function(e){return e.role}),g=h[h.length-2],b=2;"none"===g;)b++,g=h[h.length-b];var _=l.AriaUtil.getResolvedRole(n);if(d[_]&&null!=d[_].container){p++,u=!1;for(var f=0,v=(m=d[_].container).length;!u&&f<v&&!(u=g===m[f]);f++);0==u&&c.push(_)}var A=new Array;A.push(c.join(", "));var w=new Array;return w.push(m.join(", ")),0==p?null:u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[A.toString(),w.toString()])}}}},5232(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_region_label_unique={id:"aria_region_label_unique",context:"aria:region",refactor:{Rpt_Aria_MultipleRegionsUniqueLabel_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_region_label_unique.html",fail_label_not_unique:"aria_region_label_unique.html",group:"aria_region_label_unique.html"}},messages:{"en-US":{pass:'The element with "region" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "region" role do not have unique labels',group:'Each element with "region" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"region");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_labelled=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.aria_region_labelled={id:"aria_region_labelled",context:"aria:region",refactor:{Rpt_Aria_RegionLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_labelled.html",Fail_1:"aria_region_labelled.html",group:"aria_region_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "region" role does not have a label',group:'Each element with "region" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:r.AriaUtil.hasAriaLabel(n)||l.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_allowed=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_role_allowed={id:"aria_role_allowed",context:"dom:*[role]",refactor:{Rpt_Aria_ValidRole:{Pass_0:"Pass_0",Fail_2:"Fail_2",Potential_1:"Potential_1"}},help:{"en-US":{group:"aria_role_allowed.html",Pass_0:"aria_role_allowed.html",Fail_2:"aria_role_allowed.html",Potential_1:"aria_role_allowed.html"}},messages:{"en-US":{group:"Elements must have a valid 'role' per ARIA specification",Pass_0:"Rule Passed",Fail_2:"The role '{0}' defined on the element is not valid per ARIA specification",Potential_1:"Some of the roles, '{0}', defined on the element are not valid per ARIA specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"674b10",run:function(e,t,i){var n=e.dom.node,l=n.getAttribute("role").trim().toLowerCase();if(0===l.length)return null;if(n.hasAttribute("aria-hidden")&&"true"===n.getAttribute("aria-hidden").toLowerCase())return null;var o=r.AriaUtil.getRolesUndefinedByAria(n);if(!o||0===o.length)return(0,a.RulePass)("Pass_0");var s=l.split(/\s+/);return o.length===s.length?(0,a.RuleFail)("Fail_2",[o.join(",")]):o.length>0?(0,a.RulePotential)("Potential_1",[o.join(",")]):void 0}}},4863(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_redundant=void 0;var a=i(461),n=i(461),r=i(7011);t.aria_role_redundant={id:"aria_role_redundant",context:"dom:*[role]",help:{"en-US":{pass:"aria_role_redundant.html",fail_redundant:"aria_role_redundant.html",group:"aria_role_redundant.html"}},messages:{"en-US":{pass:"An explicitly-assigned ARIA role is not redundant with the implicit role of the element",fail_redundant:'The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element <{1}>',group:"An explicitly-assigned ARIA role should not be redundant with the implicit role of the element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.tagName.toLowerCase(),o=r.AriaUtil.getRoles(n,!1);if(o&&0!==o.length){if(!r.AriaUtil.areRolesDefined(o))return null;var s=r.AriaUtil.getImplicitRole(n);if(!s||0===s.length)return(0,a.RulePass)("pass");for(var u=[],d=0;d<o.length;d++)s.includes(o[d])?u.push((0,a.RuleFail)("fail_redundant",[o[d],l])):u.push((0,a.RulePass)("pass"));return u.length>0?u:null}}}},1440(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_search_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.aria_search_label_unique={id:"aria_search_label_unique",context:"aria:search",refactor:{Rpt_Aria_MultipleSearchLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_search_label_unique.html",fail_label_not_unique:"aria_search_label_unique.html",group:"aria_search_label_unique.html"}},messages:{"en-US":{pass:'The element with "search" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "search" role do not have unique labels',group:'Each element with "search" role must have a unique label that describes its purpose'}},rulesets:[{id:[],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"search",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1968(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_valid=t.aria_role_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.aria_role_valid={id:"aria_role_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{aria_semantics_role:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"aria_role_valid.html",Fail_1:"aria_role_valid.html",Fail_2:"aria_role_valid.html",group:"aria_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The ARIA role '{0}' is not valid for the element <{1}>",Fail_2:"The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable",group:"ARIA roles must be valid for the element to which they are assigned"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.tagName.toLowerCase();if(1!==n.nodeType)return null;var s=r.AriaUtil.getRolesUndefinedByAria(n);if(s&&s.length>0)return null;var u=r.AriaUtil.getDeprecatedAriaRoles(n);if(u&&u.length>0)return null;var d=r.AriaUtil.getDeprecatedAriaAttributes(n);if(d&&d.length>0)return null;if(["td","th","tr"].includes(o)){var c=l.CommonUtil.isTableDescendant(i);if(null!==c&&c.length>0)return null}var m=r.AriaUtil.getUserDefinedRoles(n);if(!m||0===m.length)return null;if(m.includes("generic"))return(0,a.RuleFail)("Fail_1",["generic",o]);var p=r.AriaUtil.getInvalidRoles(n);return null===p||0===p.length?(0,a.RulePass)("Pass_0",[m.join(", "),o]):p.includes("presentation")||p.includes("none")&&l.CommonUtil.isTabbable(n)?(0,a.RuleFail)("Fail_2",[p.join(", "),o]):p.length>0?(0,a.RuleFail)("Fail_1",[p.join(", "),o]):m.length>0?(0,a.RulePass)("Pass_0",[m.join(", "),o]):null}},t.aria_attribute_valid={id:"aria_attribute_valid",context:"dom:*",dependencies:["aria_attribute_deprecated","aria_role_valid"],refactor:{aria_attribute_allowed:{Pass:"Pass",Fail_invalid_role_attr:"Fail_invalid_role_attr",Fail_invalid_implicit_role_attr:"Fail_invalid_implicit_role_attr"}},help:{"en-US":{group:"aria_attribute_valid.html",Pass:"aria_attribute_valid.html",Fail_invalid_role_attr:"aria_attribute_valid.html",Fail_invalid_implicit_role_attr:"aria_attribute_valid.html"}},messages:{"en-US":{group:"ARIA attributes should be valid for the element and ARIA role to which they are assigned",Pass:"ARIA attributes are valid for the element and ARIA role",Fail_invalid_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with ARIA role "{2}"',Fail_invalid_implicit_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with implicit ARIA role "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["5c01ea",{"46ca7f":{Pass:"pass",Fail_invalid_role_attr:"fail",Fail_invalid_implicit_role_attr:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(1!==n.nodeType)return null;var l=r.AriaUtil.getUserDefinedAriaAttributes(n);if(null===l||0===l.length)return null;var o=r.AriaUtil.getUserDefinedRoles(n),s=!0;if(o&&o.length>0){if(!r.AriaUtil.areRolesDefined(o))return null}else o=r.AriaUtil.getImplicitRole(n),s=!1;var u=n.tagName.toLowerCase(),d=r.AriaUtil.getInvalidAriaAttributes(n);return d&&0!==d.length?o.length>0?s?(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_implicit_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,"none"]):(0,a.RulePass)("Pass",[l.join(", "),u,o.join(", ")])}}},1617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_toolbar_label_unique=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(4566);t.aria_toolbar_label_unique={id:"aria_toolbar_label_unique",context:"aria:toolbar",refactor:{Rpt_Aria_MultipleToolbarUniqueLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_toolbar_label_unique.html",Fail_1:"aria_toolbar_label_unique.html",group:"aria_toolbar_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "toolbar" roles do not have unique labels',group:'Each element with "toolbar" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"toolbar",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(n.ownerDocument,"aria_toolbar_label_unique",null);u||(u=r.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(n.ownerDocument,"aria_toolbar_label_unique",u));var d=r.AriaUtil.getAriaLabel(n);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_widget_labelled=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9955),s=i(5279),u=i(9910),d=i(1686);t.aria_widget_labelled={id:"aria_widget_labelled",context:"dom:*",refactor:{Rpt_Aria_WidgetLabels_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_widget_labelled.html",Pass_0:"aria_widget_labelled.html",Fail_1:"aria_widget_labelled.html"}},messages:{"en-US":{group:"Interactive component must have a programmatically associated name",Pass_0:"Rule Passed",Fail_1:"Interactive component with ARIA role '{0}' does not have a programmatically associated name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"m6b1q3",run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")&&"hidden"===n.getAttribute("type")||r.AriaUtil.getAncestorWithRole(n,"combobox")&&!r.AriaUtil.hasRoleInSemantics(n,"textbox")&&!r.AriaUtil.hasRoleInSemantics(n,"searchbox"))return null;var c=o.ARIAMapper.nodeToRole(n),m=n.nodeName.toLowerCase();if(["button","checkbox","combobox","listbox","menuitemcheckbox","menuitemradio","radio","searchbox","slider","spinbutton","switch","textbox","progressbar","link"].includes(c))return null;if("output"===m||"input"===m&&n.getAttribute("type"),!n.hasAttribute("role")&&-1!=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"].indexOf(n.nodeName.toLowerCase()))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(r.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=l.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=l.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(s.FragmentUtil.getById(n,v[A])===n)return null}for(var w=!0,y=u.ARIADefinitions.designPatterns,C=r.AriaUtil.getRoles(n,!0),k=0,R=["widget","liveRegion","window"],x=(A=0,C.length);w&&A<x;++A){var P=y[C[A]];P&&P.nameRequired&&P.roleType&&R.includes(P.roleType)&&(++k,!(w=r.AriaUtil.hasAriaLabel(n)||l.CommonUtil.attributeNonEmpty(n,"title")||l.CommonUtil.getLabelForElementHidden(n,!0))&&P.nameFrom&&P.nameFrom.indexOf("contents")>=0&&(w=l.CommonUtil.hasInnerContentOrAlt(n)),w||(w=l.CommonUtil.hasImplicitLabel(n)),w||"img"!==n.tagName.toLowerCase()||n.hasAttribute("role")||!n.hasAttribute("alt")||(w=d.DOMUtil.cleanWhitespace(n.getAttribute("alt")).trim().length>0),P.nameFrom.indexOf("prohibited"))}return 0===k?null:w?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[c])}}},3370(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.asciiart_alt_exists=void 0;var a=i(461),n=i(7139);t.asciiart_alt_exists={id:"asciiart_alt_exists",context:"dom:pre, dom:listing, dom:xmp, dom:plaintext",refactor:{RPT_Pre_ASCIIArt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"asciiart_alt_exists.html",Potential_1:"asciiart_alt_exists.html",group:"asciiart_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that ASCII art has a text alternative",group:"ASCII art must have a text alternative"}},rulesets:[],act:[],run:function(e,t,i){var r=e.dom.node;if("pre"==r.nodeName.toLowerCase()&&(r.previousSibling&&"code"==r.previousSibling.nodeName.toLowerCase()||r.getElementsByTagName("code").length>0||n.CommonUtil.getAncestor(r,"code")))return(0,a.RulePass)("Pass_0");for(var l=!0,o=n.CommonUtil.getInnerText(r),s=0,u=0,d="",c=0;l&&c<o.length;++c){var m=o.substr(c,1);/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(m)?d==m?u+=1:u=0:(/\s/.test(m)||(s+=1),u=0),d=m,(s>=5||u>=4)&&(l=!1)}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},9272(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_css_review=void 0;var a=i(461),n=i(461),r=i(7139);t.blink_css_review={id:"blink_css_review",context:"dom:style, dom:*[style]",refactor:{RPT_Blink_CSSTrigger1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"blink_css_review.html",Pass_0:"blink_css_review.html",Potential_1:"blink_css_review.html"}},messages:{"en-US":{group:"Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds",Pass_0:"Rule Passed",Potential_1:"Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getInnerText(n);n.hasAttribute("style")&&(l=n.getAttribute("style"));var o=-1==l.toLowerCase().indexOf("text-decoration:blink");return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},7735(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_elem_deprecated=void 0;var a=i(461),n=i(461);t.blink_elem_deprecated={id:"blink_elem_deprecated",context:"dom:blink",refactor:{WCAG20_Blink_AlwaysTrigger:{Fail_1:"Fail_1"}},help:{"en-US":{group:"blink_elem_deprecated.html",Fail_1:"blink_elem_deprecated.html"}},messages:{"en-US":{group:"Content that blinks persistently must not be used",Fail_1:"Content found that blinks persistently"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){return(0,a.RuleFail)("Fail_1")}}},3923(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blockquote_cite_exists=void 0;var a=i(461),n=i(461),r=i(7139);t.blockquote_cite_exists={id:"blockquote_cite_exists",context:"dom:blockquote",refactor:{RPT_Blockquote_HasCite:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"blockquote_cite_exists.html",Potential_1:"blockquote_cite_exists.html",group:"blockquote_cite_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only",group:"Use <blockquote> only for quotations, not indentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.attributeNonEmpty(n,"cite");if(!l){var o=r.CommonUtil.getDocElementsByTag(n,"cite");l=null!=o&&o.length>0}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},7521(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.canvas_content_described=void 0;var a=i(461),n=i(461),r=i(3946);t.canvas_content_described={id:"canvas_content_described",context:"dom:canvas",refactor:{HAAC_Canvas:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"canvas_content_described.html",Manual_1:"canvas_content_described.html",group:"canvas_content_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify accessibility of the <canvas> element",group:"The <canvas> element may not be accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.1.1","4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.innerHTML.trim().length>0;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RuleManual)("Manual_1")}}},1852(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.caption_track_exists=void 0;var a=i(461),n=i(461);t.caption_track_exists={id:"caption_track_exists",context:"dom:video",refactor:{HAAC_Video_HasNoTrack:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"caption_track_exists.html",Potential_1:"caption_track_exists.html",group:"caption_track_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that captions are available for any meaningful audio or provide a caption track for the <video> element",group:"A <video> element must have a text alternative for any meaningful audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!1;if("true"===n.getAttribute("aria-hidden"))return null;for(var l=n.getElementsByTagName("track"),o=0;o<l.length;++o)r=r||"captions"===l[o].getAttribute("kind");if(n.textTracks&&n.textTracks.length>0)for(o=0;o<n.textTracks.length;o++)r=r||"captions"===n.textTracks[o].kind;return r?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},799(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_active_descendant=void 0;var a=i(461),n=i(461),r=i(7011),l=i(5279),o=i(3864),s=i(4566),u=i(3946);t.combobox_active_descendant={id:"combobox_active_descendant",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_active_descendant.html",Fail_missing:"combobox_active_descendant.html",Fail_not_in_popup:"combobox_active_descendant.html",Fail_active_role_invalid:"combobox_active_descendant.html",Fail_active_not_selected:"combobox_active_descendant.html",group:"combobox_active_descendant.html"}},messages:{"en-US":{Pass:"'aria-activedescendant' is used appropriately for this combobox",Fail_missing:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist",Fail_not_in_popup:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"",Fail_active_role_invalid:"The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'",Fail_active_not_selected:"The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true",group:"'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.popupId;if(!m)return null;var h=n.getAttribute("aria-activedescendant");if(!h||0===h.trim().length)return null;var g=l.FragmentUtil.getById(n,h);if(!g)return(0,a.RuleFail)("Fail_missing",[h]);var b=!1;if(m)for(var _=new o.DOMWalker(m);!b&&_.nextNode()&&_.node!=m&&_.node!=m.nextSibling;)1===_.node.nodeType&&u.VisUtil.isNodeVisible(_.node)&&(b=_.elem().getAttribute("id")===h);var f=[];b||f.push((0,a.RulePass)("Fail_not_in_popup",[h,p]));var v=r.AriaUtil.getRoles(g,!0);return 0===["option","gridcell","row","treeitem"].filter(function(e){return v.includes(e)}).length&&f.push((0,a.RuleFail)("Fail_active_role_invalid",[h,v.join(",")])),"true"!==g.getAttribute("aria-selected")&&f.push((0,a.RuleFail)("Fail_active_not_selected",[h])),0===f.length?(0,a.RulePass)("Pass"):f}}},4614(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_autocomplete_valid=void 0;var a=i(461),n=i(461),r=i(3864),l=i(4566),o=i(3946);t.combobox_autocomplete_valid={id:"combobox_autocomplete_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_autocomplete:{Pass:"Pass",Fail_1:"Fail_1",Fail_inline:"Fail_inline"}},help:{"en-US":{Pass:"combobox_autocomplete_valid.html",Fail_1:"combobox_autocomplete_valid.html",Fail_inline:"combobox_autocomplete_valid.html",group:"combobox_autocomplete_valid.html"}},messages:{"en-US":{Pass:"The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup",Fail_1:"The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"",Fail_inline:"The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ",group:"A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d=u.popupId,c=u.popupElement,m=[];"inline"===n.getAttribute("aria-autocomplete")&&m.push((0,a.RuleFail)("Fail_inline"));var p=!0;if(c&&o.VisUtil.isNodeVisible(c)&&(p=!c.hasAttribute("aria-autocomplete"))&&c.children&&c.children.length>0)for(var h=new r.DOMWalker(c);p&&h.nextNode()&&(1!==h.node.nodeType||!o.VisUtil.isNodeVisible(h.node)||(p=!h.elem().hasAttribute("aria-autocomplete"),!h.bEndTag||h.node!==c.lastElementChild)););return p||m.push((0,a.RuleFail)("Fail_1",[d])),m.length>0?m:(0,a.RulePass)("Pass")}}},5952(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_design_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=i(4566);t.combobox_design_valid={id:"combobox_design_valid",context:"aria:combobox",refactor:{combobox_version:{"Pass_1.0":"Pass_1.0","Fail_1.1":"Fail_1.1","Pass_1.2":"Pass_1.2"}},help:{"en-US":{"Pass_1.0":"combobox_design_valid.html","Fail_1.1":"combobox_design_valid.html","Pass_1.2":"combobox_design_valid.html",group:"combobox_design_valid.html"}},messages:{"en-US":{"Pass_1.0":"The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Fail_1.1":"The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Pass_1.2":"The combobox design pattern is detected as ARIA 1.2",group:"The combobox design pattern must be valid for ARIA 1.2"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;var u,d="select"===(u=n).tagName.toLowerCase()&&"combobox"!==u.getAttribute("role")?"implicit":"input"!==u.nodeName.toLowerCase()||u.hasAttribute("type")&&"text"!==u.getAttribute("type")||!u.hasAttribute("aria-owns")||u.hasAttribute("aria-controls")?"input"!==u.nodeName.toLowerCase()&&u.hasAttribute("aria-owns")&&!u.hasAttribute("aria-controls")?"1.1":"1.2":"1.0";if("implicit"===d)return null;var c=n.tagName.toLowerCase(),m="true"===(r.AriaUtil.getAriaAttribute(n,"aria-expanded")||"").trim().toLowerCase(),p="input"===c&&(!n.hasAttribute("type")||"text"===n.getAttribute("type").toLowerCase()),h=e.dom.rolePath;if(!h)return null;var g=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});return g?(g[h]={inputElement:p?n:null,pattern:d,expanded:m},s.CacheUtil.setCache(n.ownerDocument,"combobox",g),"1.0"===d?(0,a.RulePass)("Pass_1.0"):"1.1"===d?(0,a.RuleFail)("Fail_1.1"):"1.2"===d?(0,a.RulePass)("Pass_1.2"):void 0):null}}},5395(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_focusable_elements=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7011),o=i(7139),s=i(4566),u=i(3946);t.combobox_focusable_elements={id:"combobox_focusable_elements",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_focusable_elements.html",Fail_not_tabbable:"combobox_focusable_elements.html",Fail_tabbable_child:"combobox_focusable_elements.html",group:"combobox_focusable_elements.html"}},messages:{"en-US":{Pass:"DOM focus is allowed only on the combobox element as required",Fail_not_tabbable:"The combobox element does not allow DOM focus as required",Fail_tabbable_child:"The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed",group:"Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.expanded;if(!m)return null;var h=l.AriaUtil.getRoles(m,!0)[0],g=[];if(o.CommonUtil.isTabbable(n)||g.push((0,a.RuleFail)("Fail_not_tabbable")),!1===p||"dialog"===h)return(0,a.RulePass)("Pass");var b=!0;if(m&&u.VisUtil.isNodeVisible(m)&&(b=!o.CommonUtil.isTabbable(m)&&!l.AriaUtil.getAriaAttribute(m,"aria-activedescendant"))&&m.children&&m.children.length>0)for(var _=new r.DOMWalker(m);b&&_.nextNode()&&(1!==_.node.nodeType||!u.VisUtil.isNodeVisible(_.node)||(b=!o.CommonUtil.isTabbable(_.node)&&!l.AriaUtil.getAriaAttribute(_.node,"aria-activedescendant"),!_.bEndTag||_.node!==m.lastElementChild)););return b||g.push((0,a.RuleFail)("Fail_tabbable_child")),0===g.length?(0,a.RulePass)("Pass"):g}}},1992(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_haspopup_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(4566);t.combobox_haspopup_valid={id:"combobox_haspopup_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_haspopup:{Pass:"Pass",Fail_popup_role_invalid:"Fail_popup_role_invalid",Fail_combobox_popup_role_mismatch:"Fail_combobox_popup_role_mismatch"}},help:{"en-US":{Pass:"combobox_haspopup_valid.html",Fail_popup_role_invalid:"combobox_haspopup_valid.html",Fail_combobox_popup_role_mismatch:"combobox_haspopup_valid.html",group:"combobox_haspopup_valid.html"}},messages:{"en-US":{Pass:"The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value",Fail_popup_role_invalid:'The \'role\' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"',Fail_combobox_popup_role_mismatch:"The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"",group:"The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!o)return null;var s=o[e.dom.rolePath];if(!s)return null;var u=s.popupElement,d=s.popupId;if(!u)return null;var c=r.AriaUtil.getRoles(u,!0),m=["listbox","grid","tree","dialog"].filter(function(e){return c.includes(e)});if(0===m.length)return(0,a.RuleFail)("Fail_popup_role_invalid",[c.join(","),d]);var p=m[0],h=n.getAttribute("aria-haspopup")||"listbox";return h===p||"listbox"===p&&!n.hasAttribute("aria-haspopup")?(0,a.RulePass)("Pass"):(0,a.RuleFail)("Fail_combobox_popup_role_mismatch",[h,p])}}},7955(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_popup_reference=void 0;var a=i(461),n=i(461),r=i(5279),l=i(4566),o=i(3946);t.combobox_popup_reference={id:"combobox_popup_reference",context:"aria:combobox",dependencies:["combobox_design_valid"],help:{"en-US":{group:"combobox_popup_reference.html","Pass_1.0_expanded":"combobox_popup_reference.html","Pass_1.0_collapsed":"combobox_popup_reference.html","Pass_1.2_expanded":"combobox_popup_reference.html","Pass_1.2_collapsed":"combobox_popup_reference.html","Fail_1.0_missing_owns":"combobox_popup_reference.html","Fail_1.2_missing_controls":"combobox_popup_reference.html","Fail_1.0_popup_reference_missing":"combobox_popup_reference.html","Fail_1.2_popup_reference_missing":"combobox_popup_reference.html",Fail_combobox_expanded_hidden:"combobox_popup_reference.html",Fail_combobox_collapsed_visible:"combobox_popup_reference.html"}},messages:{"en-US":{group:"The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","Pass_1.0_expanded":"The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass_1.0_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Pass_1.2_expanded":"The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass_1.2_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Fail_1.0_missing_owns":"The 'aria-owns' attribute of the expanded combobox is missing","Fail_1.2_missing_controls":"The 'aria-controls' attribute of the expanded combobox is missing","Fail_1.0_popup_reference_missing":"The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value","Fail_1.2_popup_reference_missing":"The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",Fail_combobox_expanded_hidden:"The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible",Fail_combobox_collapsed_visible:"The combobox 'aria-expanded' attribute is false, but the combobox popup is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"4e8ab6":{"Pass_1.0_expanded":"fail","Pass_1.0_collapsed":"fail","Pass_1.2_expanded":"pass","Pass_1.2_collapsed":"pass","Fail_1.0_missing_owns":"inapplicable","Fail_1.2_missing_controls":"fail","Fail_1.0_popup_reference_missing":"inapplicable","Fail_1.2_popup_reference_missing":"fail",Fail_combobox_expanded_hidden:"inapplicable",Fail_combobox_collapsed_visible:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node,s=l.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d,c,m=u.pattern,p=u.expanded;if("1.0"===m){if(!n.hasAttribute("aria-owns"))return p?(0,a.RuleFail)("Fail_1.0_missing_owns"):null;if(d=n.getAttribute("aria-owns"),!(c=r.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.0_popup_reference_missing",[d]):null}else{if("1.2"!==m)return null;if(!n.hasAttribute("aria-controls"))return p?(0,a.RuleFail)("Fail_1.2_missing_controls"):null;if(d=n.getAttribute("aria-controls"),!(c=r.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.2_popup_reference_missing",[d]):null}return u.popupId=d,u.popupElement=c,p&&!o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_expanded_hidden"):!p&&o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_collapsed_visible"):"1.0"===m?p?(0,a.RulePass)("Pass_1.0_expanded"):(0,a.RulePass)("Pass_1.0_collapsed"):p?(0,a.RulePass)("Pass_1.2_expanded"):(0,a.RulePass)("Pass_1.2_collapsed")}}},9531(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.debug_paths=void 0;var a=i(461);t.debug_paths={id:"debug_paths",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["DEBUG"],num:"1",level:a.eRulePolicy.INFORMATION,toolkitLevel:a.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var a=e.dom.node;return a.setAttribute("domPath",e.dom.rolePath),a.setAttribute("ariaPath",e.aria.rolePath),null}}},891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.detector_tabbable=void 0;var a=i(7139),n=i(461),r=i(461);t.detector_tabbable={id:"detector_tabbable",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["EXTENSIONS"],num:"1",level:r.eRulePolicy.INFORMATION,toolkitLevel:r.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var r=e.dom.node;if(!a.CommonUtil.isTabbable(r))return null;var l=i.aria[i.aria.length-1];return(0,n.RulePass)("Pass_0",[],[{name:l.attributes.name,role:l.role,tabindex:parseInt(r.getAttribute("tabindex")||"0")}])}}},7446(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.dir_attribute_valid=void 0;var a=i(461),n=i(461);t.dir_attribute_valid={id:"dir_attribute_valid",context:"dom:*[dir]",refactor:{Valerie_Elem_DirValid:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"dir_attribute_valid.html",Fail_1:"dir_attribute_valid.html",group:"dir_attribute_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Invalid value used for the 'dir' attribute",group:'\'dir\' attribute value must be "ltr", "rtl", or "auto"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node.getAttribute("dir").toLowerCase();return"ltr"==n||"rtl"==n||"auto"==n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6137(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.download_keyboard_controllable=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.download_keyboard_controllable={id:"download_keyboard_controllable",context:"dom:a[href],dom:area[href]",refactor:{HAAC_Media_DocumentTrigger2:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"download_keyboard_controllable.html",group:"download_keyboard_controllable.html"}},messages:{"en-US":{Manual_1:"Verify that the file download mechanism does not cause a keyboard trap",group:"File download mechanisms should be keyboard-operable and preserve page focus location"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("href"),s=r.CommonUtil.getFileExt(o),u=![".docx",".doc",".pdf",".odt"].includes(s);return u?null:u?void 0:(0,a.RuleManual)("Manual_1")}}},6839(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.draggable_alternative_exists=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3946);t.draggable_alternative_exists={id:"draggable_alternative_exists",context:"dom:*[draggable]",dependencies:[],help:{"en-US":{group:"draggable_alternative_exists.html",pass_undraggable:"draggable_alternative_exists.html",potential_alternative:"draggable_alternative_exists.html"}},messages:{"en-US":{group:'A draggable element must have a "single pointer" alternative',pass_undraggable:'The element "{0}" is not draggable',potential_alternative:'Ensure the draggable element "{0}" has a "single pointer" alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.7"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!l.VisUtil.isNodeVisible(r))return null;var o=r.nodeName.toLocaleLowerCase();return null!==a.CommonUtil.getAncestor(r,["pre","code","script","meta"])||"body"===o||"html"===o?null:"true"===r.getAttribute("draggable")?(0,n.RulePotential)("potential_alternative",[o]):"false"===r.getAttribute("draggable")?(0,n.RulePass)("pass_undraggable",[o]):null}}},8135(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_labelled=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=i(9910),u=i(1950);t.element_accesskey_labelled={id:"element_accesskey_labelled",context:"dom:*[accesskey]",refactor:{HAAC_Accesskey_NeedLabel:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"element_accesskey_labelled.html",Potential_1:"element_accesskey_labelled.html",group:"element_accesskey_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"The element with an assigned 'accesskey' attribute does not have an associated label",group:"An element with an assigned 'accesskey' attribute must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeVisible(n)&&!l.CommonUtil.isNodeDisabled(n)&&!l.CommonUtil.isTabbable(n)){var d=r.AriaUtil.getRoles(n,!0);if(d&&0!==d.length){var c=s.ARIADefinitions.designPatterns[d[0]];if(c&&c.nameFrom&&!c.nameRequired&&c.nameFrom&&!c.nameFrom.includes("prohibited")&&(!n.parentElement||"fieldset"!==n.parentElement.nodeName.toLowerCase())){var m=u.AccNameUtil.computeAccessibleName(n);return m&&m.name&&m.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}}}}},507(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_unique=void 0;var a=i(461),n=i(461),r=i(4566);t.element_accesskey_unique={id:"element_accesskey_unique",context:"dom:*[accesskey]",refactor:{WCAG20_Elem_UniqueAccessKey:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"element_accesskey_unique.html",Fail_1:"element_accesskey_unique.html",group:"element_accesskey_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"'accesskey' attribute value on the element is not unique",group:"'accesskey' attribute values on each element must be unique for the page"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CacheUtil.getCache(n.ownerDocument,"element_accesskey_unique",{}),o=n.getAttribute("accesskey"),s=!(o in l);return l[o]=!0,s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_attribute_deprecated=void 0;var a=i(461),n=i(461),r=["applet","basefont","center","dir","font","isindex","listing","plaintext","spacer","s","strike","u","xmp","acronym","frame","frameset","noframes","noembed","big","blink","marquee","tt"],l=["align","link","archive","background","bgcolor","clear","code","color","compact","face","hspace","language","link","noshade","nowrap","object","prompt","start","text","version","vlink","vspace"],o={td:["height","width","abbr","axis","char","charoff","height","nowrap","valign","width","align","bgcolor"],th:["height","width","abbr","axis","charoff","height","bgcolor","align","nowrap","char","valign","width"],li:["type","value","type"],ul:["type","compact"],pre:["width"],meta:["http-equiv"],a:["charset","coords","shape","rev","scheme"],link:["rev","charset","target"],img:["name","longdesc","align","hspace","vspace","border"],area:["nohref"],head:["profile"],html:["version"],iframe:["longdesc","align","frameborder","marginheight","marginwidth","scrolling"],object:["archive","code","codebase","codetype","declare","standby","align","hspace","vspace","border"],param:["type","valuetype"],script:["language"],body:["alink","background","bgcolor","link","text","vlink"],br:["clear"],caption:["align"],col:["align","char","charoff","valign","width"],div:["align"],dl:["compact"],hr:["align","noshade","size","width","align"],h2:["align"],h3:["align"],h4:["align"],h5:["align"],h6:["align"],input:["align","usemap"],legend:["align"],menu:["compact"],ol:["compact","type","type"],p:["align"],table:["bgcolor","cellpadding","cellspacing","frame","rules","width","align"],tbody:["align","char","valign","charoff"],tfoot:["align","charoff","char","valign"],thead:["char","charoff","valign","align"],tr:["align","bgcolor","char","charoff","valign"]};t.element_attribute_deprecated={id:"element_attribute_deprecated",context:"dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]",help:{"en-US":{pass:"element_attribute_deprecated.html",fail_elem:"element_attribute_deprecated.html",fail_attr:"element_attribute_deprecated.html",fail_elem_attr:"element_attribute_deprecated.html",group:"element_attribute_deprecated.html"}},messages:{"en-US":{pass:"Rule Passed",fail_elem:"The <{0}> element is deprecated in HTML 5",fail_attr:'The HTML attribute(s) "{0}" is deprecated in HTML 5',fail_elem_attr:'The HTML attribute(s) "{0}" is deprecated for the <{1}> element in HTML 5',group:"Avoid use of obsolete features if possible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("tbody"===n.nodeName.toLowerCase()&&n.hasAttribute("align"))return(0,a.RulePass)("pass");if(n.nodeName.includes("-"))return null;var s=n.nodeName.toLowerCase();if(r.includes(s))return(0,a.RuleFail)("fail_elem",[s]);for(var u=n.getAttributeNames(),d="",c=0,m=u;c<m.length;c++){var p=m[c];l.includes(p)&&(""!==d&&(d+=", "),d+=p)}if(""!==d)return(0,a.RuleFail)("fail_attr",[d]);if(d="",s in o){for(var h=0,g=u;h<g.length;h++)p=g[h],o[s]&&o[s].includes(p)&&(""!==d&&(d+=", "),d+=p);if(""!==d)return(0,a.RuleFail)("fail_elem_attr",[d,s])}return(0,a.RulePass)("pass")}}},5173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_id_unique=void 0;var a=i(461),n=i(461),r=i(5279);t.element_id_unique={id:"element_id_unique",context:"dom:*[id]",refactor:{RPT_Elem_UniqueId:{Pass_0:"pass",Fail_1:"potential_empty",Fail_2:"potential_in_use"}},help:{"en-US":{group:"element_id_unique.html",pass:"element_id_unique.html",potential_empty:"element_id_unique.html",potential_in_use:"element_id_unique.html"}},messages:{"en-US":{group:"Element 'id' attribute values must be unique within a document",pass:"Rule Passed",potential_empty:'The <{0}> element has the id "{1}" that is empty',potential_in_use:'The <{0}> element has the id "{1}" that is already in use'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"3ea0c8":{pass:"pass",potential_empty:"pass",potential_in_use:"fail"}}],run:function(e,t,i){var n=e.dom.node,l=n.getAttribute("id");return""===l?(0,a.RulePotential)("potential_empty",[n.nodeName.toLowerCase(),l]):r.FragmentUtil.getById(n,l)===n?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_in_use",[n.nodeName.toLowerCase(),l])}}},6027(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_lang_valid=t.html_lang_valid=void 0;var a=i(461),n=i(461),r=i(1043),l=i(3946),o=i(3864),s=i(1950),u=function(e){var t=e.dom.node,i=t.nodeName.toLowerCase();if(t.hasAttribute("lang"))if("html"!==i&&""===t.getAttribute("lang"));else{var a=t.getAttribute("lang");if(!r.LangUtil.validPrimaryLang(a))return 1;if(!r.LangUtil.isBcp47(a))return 2}if(t.hasAttribute("xml:lang"))if("html"!==i&&""===t.getAttribute("xml:lang"));else{if(a=t.getAttribute("xml:lang"),!r.LangUtil.validPrimaryLang(a))return 3;if(!r.LangUtil.isBcp47(a))return 4}return 0};t.html_lang_valid={id:"html_lang_valid",context:"dom:html[lang], dom:html[xml:lang]",help:{"en-US":{Pass_0:"html_lang_valid.html",Fail_1:"html_lang_valid.html",Fail_2:"html_lang_valid.html",Fail_3:"html_lang_valid.html",Fail_4:"html_lang_valid.html",group:"html_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The default human language of the page must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"fail",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"inapplicable"},bf051a:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"fail",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=u(e);return[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][n]}},t.element_lang_valid={id:"element_lang_valid",context:"dom:*[lang], dom:*[xml:lang]",help:{"en-US":{Pass_0:"element_lang_valid.html",Fail_1:"element_lang_valid.html",Fail_2:"element_lang_valid.html",Fail_3:"element_lang_valid.html",Fail_4:"element_lang_valid.html",group:"element_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The change in language of specific content must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{de46e4:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"inapplicable",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node;if("html"===n.nodeName.toLowerCase())return null;var r=u(e),d=[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][r];if(d.value[1]!==a.eRuleConfidence.PASS){var c=!1;if(null!==n.firstChild)for(var m=new o.DOMWalker(n,!1,n,!0);!c&&m.nextNode();)if(1===m.node.nodeType){var p=m.node;if(!l.VisUtil.isNodeVisible(p)||p.hasAttribute("lang"))m.bEndTag=!0;else{var h=s.AccNameUtil.computeAccessibleName(p);c=c||"img"===p.nodeName.toLowerCase()&&h&&h.name&&h.name.trim().length>0}}else c=c||3===m.node.nodeType&&m.node.nodeValue.trim().length>0;if(!c)return null}return d}}},7515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_mouseevent_keyboard=void 0;var a=i(461),n=i(461);t.element_mouseevent_keyboard={id:"element_mouseevent_keyboard",context:"dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]",refactor:{RPT_Elem_EventMouseAndKey:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"element_mouseevent_keyboard.html",Manual_1:"element_mouseevent_keyboard.html",group:"element_mouseevent_keyboard.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)",group:"All interactive content with mouse event handlers must have equivalent keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase(),l=n.hasAttribute("href")||!n.hasAttribute("ondblclick")&&!n.hasAttribute("onmousemove")&&(!n.hasAttribute("onmousedown")||n.hasAttribute("onkeydown"))&&(!n.hasAttribute("onmouseup")||n.hasAttribute("onkeyup"))&&(!n.hasAttribute("onmouseover")||n.hasAttribute("onfocus"))&&(!n.hasAttribute("onmouseout")||n.hasAttribute("onblur"))&&(!n.hasAttribute("onclick")||n.hasAttribute("onkeypress")||"a"==r||"button"==r),o=new Array;return l||(n.hasAttribute("ondblclick")&&o.push("ondblclick"),n.hasAttribute("onmousemove")&&o.push("onmousemove"),n.hasAttribute("onmousedown")&&!n.hasAttribute("onkeydown")&&o.push("onmousedown"),n.hasAttribute("onmouseup")&&!n.hasAttribute("onkeyup")&&o.push("onmouseup"),n.hasAttribute("onmouseover")&&!n.hasAttribute("onfocus")&&o.push("onmouseover"),n.hasAttribute("onmouseout")&&!n.hasAttribute("onblur")&&o.push("onmouseout"),n.hasAttribute("onclick")&&!n.hasAttribute("onkeypress")&&"a"!=r&&"button"!=r&&o.push("onclick")),l?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1",[r,o.join(", ")])}}},1704(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_orientation_unlocked=void 0;var a=i(461),n=i(461),r=i(4919),l=i(3946),o=i(4566),s=i(5279),u=i(7139);t.element_orientation_unlocked={id:"element_orientation_unlocked",context:"dom:*",help:{"en-US":{pass:"element_orientation_unlocked.html",fail_locked:"element_orientation_unlocked.html",group:"element_orientation_unlocked.html"}},messages:{"en-US":{pass:"The element is not restricted to either landscape or portrait orientation using CSS transform property",fail_locked:"The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property",group:"Elements should not be restricted to either landscape or portrait orientation using CSS transform property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["b33eff"],run:function(e,t,i){var n=e.dom.node;if(!l.VisUtil.isNodeVisible(n))return null;if(u.CommonUtil.getAncestor(n,["script","meta","title"]))return null;if(!u.CommonUtil.hasInnerContent(n))return null;var d=n.nodeName.toLowerCase(),c=s.FragmentUtil.getOwnerFragment(n),m=o.CacheUtil.getCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",null);m||(m=r.CSSUtil.getMediaOrientationTransform(c),o.CacheUtil.setCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",m));var p=[];if(Object.keys(m).forEach(function(e){Object.keys(m[e]).forEach(function(t){Object.keys(m[e][t]).length>0&&r.CSSUtil.selectorMatchesElem(n,t)&&(m[e][t].transform?p.push(m[e][t].transform):p.push(m[e][t]))})}),0===p.length)return null;for(var h=[],g=function(e){var t=p[e];if("object"==typeof t)for(var i in t)t=i+"("+t[i]+")";var l=!1;if(["rotate","rotate3d","rotateZ","matrix","matrix3d"].forEach(function(e){t.includes(e)&&(l=!0)}),!l)return"continue";var o=r.CSSUtil.getRotationDegree(t);if(0===o)return h.push((0,a.RulePass)("pass")),"continue";var s=r.CSSUtil.getDefinedStyles(n,["transform"]);s.transform&&(o+=r.CSSUtil.getRotationDegree(s.transform));var u=o%180;u<=1||u>=179?h.push((0,a.RulePass)("pass")):h.push((0,a.RuleFail)("fail_locked",[d]))},b=0;b<p.length;b++)g(b);return h.length>0?h:null}}},5053(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_scrollable_tabbable=void 0;var a=i(7139),n=i(461),r=i(3946),l=i(7011);t.element_scrollable_tabbable={id:"element_scrollable_tabbable",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_scrollable_tabbable.html",pass_tabbable:"element_scrollable_tabbable.html",pass_interactive:"element_scrollable_tabbable.html",fail_scrollable:"element_scrollable_tabbable.html"}},messages:{"en-US":{group:"Scrollable elements should be tabbable or contain tabbable content",pass_tabbable:"The scrollable element is tabbable",pass_interactive:"The scrollable element has tabbable content",fail_scrollable:"The scrollable element <{0}> with non-interactive content is not tabbable"}},rulesets:[],act:["0ssw9k"],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeVisible(o)&&!a.CommonUtil.isNodeDisabled(o))return a.CommonUtil.getAncestor(o,["iframe","svg","script","meta","style"])?null:a.CommonUtil.hasInnerContent(o)?l.AriaUtil.isNavigationOwnedOrControlled(o)?null:r.VisUtil.isElementScrollable(o)?a.CommonUtil.isTabbable(o)?(0,n.RulePass)("pass_tabbable"):a.CommonUtil.getTabbableChildren(o)>0?(0,n.RulePass)("pass_interactive"):!o.hasAttribute("tabindex")&&navigator.userAgent.indexOf("Firefox")>-1?null:(0,n.RuleFail)("fail_scrollable",[o.nodeName.toLowerCase()]):null:null}}},4681(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_role_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9910),s=i(3864),u=i(3946);t.element_tabbable_role_valid={id:"element_tabbable_role_valid",context:"dom:*",help:{"en-US":{pass:"element_tabbable_role_valid.html",fail_invalid_role:"element_tabbable_role_valid.html",fail_no_valid_role:"element_tabbable_role_valid.html",group:"element_tabbable_role_valid.html"}},messages:{"en-US":{pass:"The tabbable element has a widget role",fail_invalid_role:"The tabbable element's role '{0}' is not a widget role",fail_no_valid_role:"The tabbable element does not have a valid widget role",group:"A tabbable element must have a valid widget role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.isNodeDisabled(n)||u.VisUtil.isNodeHiddenFromAT(n))return null;var d=n.nodeName.toLowerCase();if(d in l.CommonUtil.tabTagMap){var c=l.CommonUtil.tabTagMap[d];if("function"==typeof c&&(c=c(n)),c)return null}if(!n.hasAttribute("tabindex")||parseInt(n.getAttribute("tabindex"))<0)return null;if(r.AriaUtil.isNavigationOwnedOrControlled(n))return null;if(u.VisUtil.isElementScrollable(n))return null;var m=s.DOMWalker.parentNode(n),p=r.AriaUtil.getResolvedRole(m);if(["button","checkbox","img","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab"].includes(p))return null;var h=r.AriaUtil.getResolvedRole(n);return h?"application"===h?null:"row"===h||"separator"===h||"widget"===o.ARIADefinitions.designPatterns[h].roleType?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid_role",[h]):(0,a.RuleFail)("fail_no_valid_role")}}},8050(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_unobscured=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3946),o=i(7507),s=i(3883);t.element_tabbable_unobscured={id:"element_tabbable_unobscured",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_unobscured.html",pass:"element_tabbable_unobscured.html",potential_obscured:"element_tabbable_unobscured.html"}},messages:{"en-US":{group:"When an element receives focus, it is not entirely covered by other content",pass:"The element is not entirely covered by other content",potential_obscured:"Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.4.11"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!l.VisUtil.isNodeVisible(r)||!a.CommonUtil.isTabbable(r))return null;var u=r.nodeName.toLocaleLowerCase();if(null!==a.CommonUtil.getAncestor(r,["pre","code","script","meta"])||"body"===u||"html"===u)return null;var d=r.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=new o.DOMMapper,p=m.getUnadjustedBounds(r);if(!p||0===p.height||0===p.width)return null;var h=c.getComputedStyle(r);if(!h)return null;var g=parseInt("auto"!==h.zIndex&&h.zIndex?h.zIndex:"0"),b=d.querySelectorAll("body *:not(script):not(style):not(meta):not(link)");if(!b||0===b.length)return null;for(var _=!0,f=p.left+p.width,v=p.top+p.height,A=0;A<b.length;A++){var w=b[A],y=r.compareDocumentPosition(w);if(0===y||y&Node.DOCUMENT_POSITION_CONTAINED_BY)_=!1;else if(!(y&Node.DOCUMENT_POSITION_CONTAINS)&&l.VisUtil.isNodeVisible(w)){var C=m.getUnadjustedBounds(w);if(C&&0!==C.height&&0!==C.width&&!(C.top>p.top||C.left>p.left)){var k=C.left+C.width,R=C.top+C.height;if(!(k<f||R<v)){var x=c.getComputedStyle(w);if(x){var P=parseInt("auto"===x.zIndex||!x.zIndex||isNaN(Number(x.zIndex))?"0":x.zIndex);if(_&&P>g||!_&&P>=g){var T,U=!1;if(x.background&&"none"!==x.background&&(U=(T=s.ColorUtil.Color(x.background))&&(void 0===T.alpha||T.alpha>0)),!U&&x.backgroundColor&&(U=(T=s.ColorUtil.Color(x.backgroundColor))&&(void 0===T.alpha||T.alpha>0)),!a.CommonUtil.hasInnerContentHidden(w)&&!U)continue;return(0,n.RulePotential)("potential_obscured",[])}}}}}}return(0,n.RulePass)("pass")}}},2644(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_visible=void 0;var a=i(7139),n=i(4919),r=i(461),l=i(461),o=i(7507);t.element_tabbable_visible={id:"element_tabbable_visible",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_visible.html",pass:"element_tabbable_visible.html",potential_visible:"element_tabbable_visible.html"}},messages:{"en-US":{group:"A tabbable element should be visible on the screen when it has keyboard focus",pass:"The tabbable element is visible on the screen",potential_visible:"Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.7"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!a.CommonUtil.isTabbable(l))return null;var s=l.nodeName.toLocaleLowerCase(),u=(new o.DOMMapper).getUnadjustedBounds(l);if(!u)return null;var d=n.CSSUtil.getDefinedStylesMultiple(l,["position","clip"],["",":focus"]),c=d[""],m=d[":focus"];if(0===u.height||0===u.width)return(0,r.RulePotential)("potential_visible",[]);if("absolute"===c.position&&c.clip&&"rect(0px,0px,0px,0px)"===c.clip.replaceAll(" ","")&&!m.clip){if("input"===s&&("checkbox"===l.getAttribute("type")||"radio"===l.getAttribute("type"))){var p=a.CommonUtil.getLabelForElement(l);if(p&&!a.CommonUtil.isInnerTextEmpty(p)){var h=n.CSSUtil.getDefinedStylesMultiple(l,null,[":focus-visible",":focus-within",":checked",":focus"]),g=h[":focus-visible"],b=h[":focus-within"],_=h[":checked"];if(h[":focus"]||g||b||_)return(0,r.RulePass)("pass")}}return(0,r.RulePotential)("potential_visible",[])}if(u.top>=0&&u.left>=0)return(0,r.RulePass)("pass");var f=getComputedStyle(l),v=u.top,A=u.left;if(0===Object.keys(m).length)return(0,r.RulePotential)("potential_visible",[]);var w=["absolute","fixed"];return void 0!==m.top&&(v=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.top.replace(/\D/g,""):Number.MIN_VALUE),void 0!==m.left&&(A=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.left.replace(/\D/g,""):Number.MIN_VALUE),v>=0&&A>=0?(0,r.RulePass)("pass"):(0,r.RulePotential)("potential_visible",[])}}},429(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.embed_alt_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.embed_alt_exists={id:"embed_alt_exists",context:"dom:embed",refactor:{RPT_Embed_HasAlt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_alt_exists.html",Potential_1:"embed_alt_exists.html",group:"embed_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element has alternative content",group:"Provide alternative content for <embed> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},4617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.emoticons_alt_exists=void 0;var a=i(461),n=i(7139);t.emoticons_alt_exists={id:"emoticons_alt_exists",context:"dom:*",refactor:{WCAG20_Text_Emoticons:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"emoticons_alt_exists.html",Potential_1:"emoticons_alt_exists.html",group:"emoticons_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that emoticons have a text alternative",group:"Emoticons must have a short text alternative that describes their purpose"}},rulesets:[],act:[],run:function(e,t,i){for(var r=e.dom.node,l=[":-)",":)",":o)",":]",":3",":c)",":>","=]","8)","=)",":D","C:",":-D",":D","8D","XD","=D","=3","<=3","<=8","--!--",":-(",":(",":c",":<",":[","D:","D8","D;","D=","DX","v.v",":-9",";-)",";)","*)",";]",";D",":-P",":P",":-p",":p","=p",":-Þ",":Þ",":-b",":b",":-O",":O","O_O","o_o","8O","OwO","O-O","0_o","O_o","O3O","o0o ;o_o;","o...o","0w0",":-/",":/",":\\","=/","=\\",":S",":|","d:-)","qB-)",":)~",":-)>....",":-X",":X",":-#",":#","O:-)","0:3","O:)",":'(",";*(","T_T","TT_TT","T.T",":-*",":*","^o)",">:)",">;)",">:-)","B)","B-)","8)","8-)","^>.>^","^<.<^","^>_>^","^<_<^","D:<",">:(","D-:<",">:-(",":-@[1]",";(","`_´","D<","<3","<333","=^_^=","=>.>=","=<_<=","=>.<=","\\,,/","\\m/","\\m/\\>.</\\m/","\\o/","\\o o/","o/\\o",":&",":u"],o=!0,s="",u=r.firstChild;u;)"#text"==u.nodeName&&(s+=" "+u.nodeValue),u=u.nextSibling;if(s.trim().length>0)for(var d=0;o&&d<l.length;++d)for(var c=s.indexOf(l[d]),m=l[d].length;o&&-1!=c;)o=(o=(o=c>0&&!/\s/.test(s.substring(c-1,c))||c<s.length-m&&!/\s/.test(s.substring(c+m,c+m+1))&&!/[.,!'"?]/.test(s.substring(c+m,c+m+1)))||(":)"==l[d]||"(:"==l[d])&&/\(\:.*\:\)/.test(s))||(";)"==l[d]||"(;"==l[d])&&/\(\;.*\;\)/.test(s),c=s.indexOf(l[d],c+1);if(!o){var p=n.CommonUtil.getAncestor(r,["pre","code","script","body"]);o=null==p||"body"!=p.nodeName.toLowerCase()}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},5460(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.error_message_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(5279),o=i(3946);t.error_message_exists={id:"error_message_exists",context:"dom:*[aria-invalid=true]",refactor:{HAAC_Aria_ErrorMessage:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"error_message_exists.html",Fail_1:"error_message_exists.html",Fail_2:"error_message_exists.html",group:"error_message_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Custom error message has invalid reference 'id' value",Fail_2:"Custom error message is not visible",group:"A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.AriaUtil.getAriaAttribute(n,"aria-errormessage");if(!s)return null;var u=l.FragmentUtil.getById(n,s);return u?o.VisUtil.isNodeVisible(u)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2"):(0,a.RuleFail)("Fail_1")}}},3399(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_label_valid=void 0;var a=i(461),n=i(461),r=i(5279),l=i(4566),o=i(7139),s=i(3946),u=i(1950);t.fieldset_label_valid={id:"fieldset_label_valid",context:"aria:group",refactor:{group_withInputs_hasName:{Pass_1:"Pass_1",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_1:"fieldset_label_valid.html",Fail_1:"fieldset_label_valid.html",Fail_2:"fieldset_label_valid.html",group:"fieldset_label_valid.html"}},messages:{"en-US":{Pass_1:'Group/Fieldset "{0}" with an input has a unique name',Fail_1:"Group/Fieldset does not have an accessible name",Fail_2:'Group/Fieldset "{0}" has a duplicate name to another group',group:"Groups with nested inputs must have unique accessible name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)){var d=r.FragmentUtil.getOwnerFragment(n),c=l.CacheUtil.getCache(n.ownerDocument,"landmark_group_input",null);if(!c){c={groupsWithInputs:[],groupsWithInputsComputedLabels:[]};for(var m=d.querySelectorAll('fieldset,[role="group"]'),p=Array.from(m),h=[],g=0;g<p.length;g++)p[g].querySelector("input")&&h.push(p[g]);var b=[];for(g=0;g<h.length;g++){var _=u.AccNameUtil.computeAccessibleName(h[g]);b.push(_&&_.name&&_.name.trim().length>0?_.name.trim():"")}c.groupsWithInputs=h,c.groupsWithInputsComputedLabels=b,l.CacheUtil.setCache(n.ownerDocument,"landmark_group_input",c)}var f=!1,v="";if(!c.groupsWithInputs)return null;for(g=0;g<c.groupsWithInputs.length;g++)if(n.isSameNode(c.groupsWithInputs[g])){if(f=!0,""===c.groupsWithInputsComputedLabels[g]||null===c.groupsWithInputsComputedLabels[g])return(0,a.RuleFail)("Fail_1");for(var A=!1,w=0;w<c.groupsWithInputsComputedLabels.length;w++)g!=w&&c.groupsWithInputsComputedLabels[g]===c.groupsWithInputsComputedLabels[w]&&(A=!0);if(A)return(0,a.RuleFail)("Fail_2",[c.groupsWithInputsComputedLabels[g]]);v=c.groupsWithInputsComputedLabels[g]}return f?(0,a.RulePass)("Pass_1",[v]):null}}}},3498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_legend_valid=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.fieldset_legend_valid={id:"fieldset_legend_valid",context:"dom:fieldset",refactor:{WCAG20_Fieldset_HasLegend:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"fieldset_legend_valid.html",Fail_1:"fieldset_legend_valid.html",Fail_2:"fieldset_legend_valid.html",Fail_3:"fieldset_legend_valid.html",group:"fieldset_legend_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<fieldset> element does not have a <legend>",Fail_2:"<fieldset> element has more than one <legend>",Fail_3:"<fieldset> element <legend> is empty",group:" <fieldset> elements should have a single, non-empty <legend> as a label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n)||r.CommonUtil.isNodeDisabled(n))return null;var o=r.CommonUtil.getChildByTagHidden(n,"legend",!0,!1);return 0===o.length?(0,a.RuleFail)("Fail_1"):o.length>1?(0,a.RuleFail)("Fail_2"):0===r.CommonUtil.getInnerText(o[0]).trim().length?(0,a.RuleFail)("Fail_3"):(0,a.RulePass)("Pass_0")}}},9629(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.figure_label_exists=void 0;var a=i(461),n=i(461),r=i(3946),l=i(1950);t.figure_label_exists={id:"figure_label_exists",context:"dom:figure",refactor:{HAAC_Figure_label:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"figure_label_exists.html",Fail_1:"figure_label_exists.html",group:"figure_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <figure> element does not have an associated label",group:"A <figure> element must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=l.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[])}}},733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_font_color=void 0;var a=i(461),n=i(461);t.form_font_color={id:"form_font_color",context:"dom:form",refactor:{RPT_Font_ColorInForm:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_font_color.html",Potential_1:"form_font_color.html",group:"form_font_color.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Check color is not used as the only visual means to convey which fields are required",group:"Combine color and descriptive markup to indicate required form fields"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!0,r=e.dom.node.getElementsByTagName("font");if(null!=r)for(var l=0;l<r.length;++l)n=!r[l].hasAttribute("color");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9797(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_interaction_review=void 0;var a=i(461),n=i(461),r=i(7139);t.form_interaction_review={id:"form_interaction_review",context:"dom:form[target]",refactor:{WCAG20_Form_TargetAndText:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_interaction_review.html",Potential_1:"form_interaction_review.html",group:"form_interaction_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that interacting with content will not open pop-up windows or change the active window without informing the user",group:"User should be informed in advance when interacting with content causes a change of context"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n={paramWinText:{value:["new window"],type:"array"}},l=e.dom.node,o=l.getAttribute("target"),s="_parent"===o||"_self"===o||"_top"===o||null!=r.CommonUtil.getFrameByName(l,o);if(!s){var u=r.CommonUtil.getInnerText(l);l.hasAttribute("title")&&(u+=" "+l.getAttribute("title"));for(var d=0;!s&&d<n.paramWinText.value.length;++d)-1!=u.indexOf(n.paramWinText.value[d])&&(s=!0)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},7156(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_label_unique=void 0;var a=i(461),n=i(461),r=i(5279),l=i(4566);t.form_label_unique={id:"form_label_unique",context:"dom:label[for]",refactor:{RPT_Label_UniqueFor:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"form_label_unique.html",Fail_1:"form_label_unique.html",group:"form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control has more than one label",group:"Form controls should have exactly one label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CacheUtil.getCache(r.FragmentUtil.getOwnerFragment(n),"RPT_Label_Single",{}),s=n.getAttribute("for"),u=!(s in o);return o[s]=!0,u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3062(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_button_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3864);t.form_submit_button_exists={id:"form_submit_button_exists",context:"dom:form",refactor:{WCAG20_Form_HasSubmit:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_button_exists.html",Potential_1:"form_submit_button_exists.html",group:"form_submit_button_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the <form> element has a submit button or an image button",group:"A <form> element should have a submit button or an image button"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1;if(n.firstChild)for(var s=new l.DOMWalker(n,!0);!o&&s.prevNode()&&s.node!=n;)if(!s.bEndTag){var u=s.node.nodeName.toLowerCase();if("input"===u){var d=s.elem().getAttribute("type");d&&(d=d.toLowerCase()),o="submit"===d||"image"===d}else"button"===u?o=s.elem().hasAttribute("type")&&"submit"===s.elem().getAttribute("type").toLowerCase():1===s.node.nodeType&&(o=r.AriaUtil.hasRole(s.node,"button"))}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3827(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_review=void 0;var a=i(461);t.form_submit_review={id:"form_submit_review",context:"dom:select[onchange], dom:input[onchange]",refactor:{RPT_Form_ChangeEmpty:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_review.html",Potential_1:"form_submit_review.html",group:"form_submit_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Confirm the form does not submit automatically without warning",group:"A form should not be submitted automatically without warning the user"}},rulesets:[],act:[],run:function(e,t,i){var n=0===e.dom.node.getAttribute("onchange").trim().length;return n?null:n?void 0:(0,a.RulePotential)("Potential_1")}}},5498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_src_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.frame_src_valid={id:"frame_src_valid",context:"dom:frame, dom:iframe",refactor:{Valerie_Frame_SrcHtml:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"frame_src_valid.html",Potential_1:"frame_src_valid.html",group:"frame_src_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify <frame> content is accessible",group:"A <frame> containing non-HTML content must be made accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.attributeNonEmpty(n,"src")&&r.CommonUtil.isHtmlExt(r.CommonUtil.getFileExt(n.getAttribute("src")));return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},510(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_title_exists=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.frame_title_exists={id:"frame_title_exists",context:"dom:frame, dom:iframe",refactor:{WCAG20_Frame_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"frame_title_exists.html",Pass_0:"frame_title_exists.html",Fail_1:"frame_title_exists.html"}},messages:{"en-US":{group:"Inline frames must have a unique, non-empty 'title' attribute",Pass_0:"Rule Passed",Fail_1:"Inline frame does not have a 'title' attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:"cae760",run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=r.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7722(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_content_exists=void 0;var a=i(461),n=i(461),r=i(7139);t.heading_content_exists={id:"heading_content_exists",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",refactor:{RPT_Header_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"heading_content_exists.html",Fail_1:"heading_content_exists.html",group:"heading_content_exists.html"}},messages:{"en-US":{Pass_0:"Heading element has descriptive text",Fail_1:"Heading element has no descriptive content",group:"Heading elements must provide descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.6"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4597(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_markup_misuse=void 0;var a=i(461),n=i(461),r=i(7139);t.heading_markup_misuse={id:"heading_markup_misuse",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",dependencies:["heading_content_exists"],refactor:{RPT_Headers_FewWords:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"heading_markup_misuse.html",Potential_1:"heading_markup_misuse.html",group:"heading_markup_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the heading element is a genuine heading",group:"Heading elements must not be used for presentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.wordCount(r.CommonUtil.getInnerText(n))<=20;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},2104(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_lang_exists=void 0;var a=i(461),n=i(461),r=i(6858),l=i(1043);t.html_lang_exists={id:"html_lang_exists",context:"dom:html",refactor:{WCAG20_Html_HasLang:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3",Fail_4:"Fail_4",Fail_5:"Fail_5",Potential_5:"Potential_5",Potential_6:"Potential_6"}},help:{"en-US":{group:"html_lang_exists.html",Pass_0:"html_lang_exists.html",Fail_1:"html_lang_exists.html",Fail_2:"html_lang_exists.html",Fail_3:"html_lang_exists.html",Fail_4:"html_lang_exists.html",Fail_5:"html_lang_exists.html",Potential_5:"html_lang_exists.html",Potential_6:"html_lang_exists.html"}},messages:{"en-US":{group:"Page must identify the default language of the document with a 'lang' attribute",Pass_0:'Page language detected as "{0}"',Fail_1:"Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes",Fail_2:"Page detected as XHTML, but does not have an 'xml:lang' attribute",Fail_3:"Page detected as HTML, but does not have a 'lang' attribute",Fail_4:"Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"",Fail_5:"Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"",Potential_5:"Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type",Potential_6:"Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.1.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"fail",Fail_4:"inapplicable",Fail_5:"inapplicable",Potential_5:"inapplicable",Potential_6:"inapplicable"},"5b7ae0":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"fail",Fail_5:"pass",Potential_5:"inapplicable",Potential_6:"inapplicable"}}],run:function(e,t,i){if(r.AncestorUtil.isPresentationFrame(i))return null;var n=e.dom.node,o=n.ownerDocument.doctype?n.ownerDocument.doctype.publicId:"";o||(o="");var s=n.getAttribute("lang"),u=n.getAttribute("xml:lang");return o.includes("XHTML")&&!o.includes("1.0")?u?(0,a.RulePass)("Pass_0",[u]):(0,a.RuleFail)("Fail_2"):o.includes("XHTML")&&o.includes("1.0")?s||u?s&&u?s!==u?l.LangUtil.validPrimaryLang(s)&&l.LangUtil.validPrimaryLang(u)?l.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):s?(0,a.RulePotential)("Potential_5"):(0,a.RulePotential)("Potential_6"):(0,a.RuleFail)("Fail_1"):s?s&&u&&s!==u?l.LangUtil.validPrimaryLang(s)&&l.LangUtil.validPrimaryLang(u)?l.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):(0,a.RuleFail)("Fail_3")}}},8260(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_skipnav_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(5279);t.html_skipnav_exists={id:"html_skipnav_exists",context:"dom:html",refactor:{RPT_Html_SkipNav:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"html_skipnav_exists.html",Pass_0:"html_skipnav_exists.html",Potential_1:"html_skipnav_exists.html"}},messages:{"en-US":{group:"Provide a way to bypass blocks of content that are repeated on multiple Web pages",Pass_0:"Rule Passed",Potential_1:"Verify there is a way to bypass blocks of content that are repeated on multiple Web pages"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1,s=r.CommonUtil.getDocElementsByTag(n,"frame"),u=r.CommonUtil.getDocElementsByTag(n,"h1");if(null!=s&&s.length>0||null!=u&&u.length>0)o=!0;else for(var d=r.CommonUtil.getDocElementsByTag(n,"a"),c={},m=0;!o&&m<d.length;++m)if(d[m].hasAttribute("href")){var p=d[m].href;"string"!=typeof p&&(p=p.baseVal?p.baseVal:"");var h,g="";if((h=void 0!==n.ownerDocument.locationFromDAP&&null!=n.ownerDocument.locationFromDAP?n.ownerDocument.locationFromDAP:n.ownerDocument.location)&&(g=h.href),p.startsWith("file:///")&&(p="file:/"+p.substring(8)),g.startsWith("file:///")&&(g="file:/"+g.substring(8)),"#"==p.charAt(0)||p.startsWith(g+"#")){var b=r.CommonUtil.getFileAnchor(p);null!=l.FragmentUtil.getById(n,b)?o=!0:c[b]=!0}}else if(d[m].hasAttribute("name")){var _=d[m].getAttribute("name");-1!=_.indexOf("#")&&(_=r.CommonUtil.getFileAnchor(_)),o=_ in c}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8920(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.iframe_interactive_tabbable=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3946),o=i(7507);t.iframe_interactive_tabbable={id:"iframe_interactive_tabbable",context:"dom:iframe",dependencies:[],help:{"en-US":{group:"iframe_interactive_tabbable.html",pass:"iframe_interactive_tabbable.html",fail_invalid:"iframe_interactive_tabbable.html"}},messages:{"en-US":{group:"Iframe with interactive content should not be excluded from tab order using tabindex",pass:"The iframe with interactive content is not excluded from the tab order using tabindex",fail_invalid:"The <iframe> with interactive content is excluded from tab order using tabindex"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:["akn7bn"],run:function(e,t,i){var r=e.dom.node;if(!l.VisUtil.isNodeHiddenFromAT(r)&&!a.CommonUtil.isNodeDisabled(r)){var s=(new o.DOMMapper).getUnadjustedBounds(r);if(!s)return null;if(Math.max(s.height,s.width)<30||Math.min(s.height,s.width)<15)return null;if(!r.hasAttribute("tabindex")||parseInt(r.getAttribute("tabindex"))>=0)return(0,n.RulePass)("pass");var u=r;if(!u||!u.contentDocument||!u.contentDocument.documentElement)return null;var d=r.ownerDocument;return d&&Array.from(d.querySelectorAll("dialog")).some(function(e){return e.matches(":modal")&&!e.contains(r)})?null:a.CommonUtil.getTabbableChildren(r)>0?(0,n.RuleFail)("fail_invalid"):null}}}},1237(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagebutton_alt_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.imagebutton_alt_exists={id:"imagebutton_alt_exists",context:"dom:input",refactor:{WCAG20_Input_ExplicitLabelImage:{Pass_0:"Pass_0",Pass_1:"Pass_1",Pass_2:"Pass_2",Fail:"Fail"}},help:{"en-US":{Pass_0:"imagebutton_alt_exists.html",Pass_1:"imagebutton_alt_exists.html",Pass_2:"imagebutton_alt_exists.html",Fail:"imagebutton_alt_exists.html",group:"imagebutton_alt_exists.html"}},messages:{"en-US":{Pass_0:"Image button provides alternative text using the 'alt' attribute",Pass_1:"Image button provides alternative text using an ARIA label",Pass_2:"Image button provides alternative text using the 'title' attribute",Fail:'The <input> element of type "image" has no text alternative',group:'The <input> element of type "image" should have a text alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"59796f",run:function(e,t,i){var n=e.dom.node;return n.hasAttribute("type")&&"image"==n.getAttribute("type").toLowerCase()?l.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):r.AriaUtil.hasAriaLabel(n)?(0,a.RulePass)("Pass_1"):n.hasAttribute("title")&&n.getAttribute("title").length>0?(0,a.RulePass)("Pass_2"):(0,a.RuleFail)("Fail"):null}}},4101(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagemap_alt_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.imagemap_alt_exists={id:"imagemap_alt_exists",context:"dom:img[usemap], dom:img[ismap]",refactor:{HAAC_Img_UsemapAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"imagemap_alt_exists.html",Fail_1:"imagemap_alt_exists.html",group:"imagemap_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image map or child <area> has no text alternative",group:"An image map and each <area> element in an image map must have text alternative(s)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)?null:r.CommonUtil.attributeNonEmpty(n,"alt")||!n.hasAttribute("ismap")&&!r.CommonUtil.attributeNonEmpty(n,"usemap")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},275(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_background=void 0;var a=i(461),n=i(461),r=i(3946);t.img_alt_background={id:"img_alt_background",context:"dom:*",refactor:{HAAC_BackgroundImg_HasTextOrTitle:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"img_alt_background.html",Manual_1:"img_alt_background.html",group:"img_alt_background.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify important background image information has a text alternative in system high contrast mode",group:"Background images that convey important information must have a text alternative that describes the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.ownerDocument.defaultView.getComputedStyle(n);if(null==l)return(0,a.RulePass)("Pass_0");var o=l.backgroundImage,s=!0;if(null!=o&&""!=o&&"none"!=o&&"inherit"!=o)if(null!=n.innerHTML&&0!=n.innerHTML.trim().length)s=!1;else{var u=n.getAttribute("title");null!=u&&0!=u.length&&(s=!1)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RuleManual)("Manual_1")}}},7601(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_decorative=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946);t.img_alt_decorative={id:"img_alt_decorative",context:"dom:img[alt]",refactor:{WCAG20_Img_PresentationImgHasNonNullAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"img_alt_decorative.html",Fail_1:"img_alt_decorative.html",group:"img_alt_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image designated as decorative has non-null 'alt' attribute",group:'Image designated as decorative must have \'alt=""'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=!0;return(r.AriaUtil.hasRole(n,"presentation")||r.AriaUtil.hasRole(n,"none"))&&(o=0==n.getAttribute("alt").length),o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7541(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_misuse=void 0;var a=i(461),n=i(461),r=i(3946);t.img_alt_misuse={id:"img_alt_misuse",context:"dom:img, dom:area, dom:input",refactor:{RPT_Img_AltCommonMisuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_alt_misuse.html",Potential_1:"img_alt_misuse.html",group:"img_alt_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file name serves as a good inline replacement for the image",group:"'alt' attribute value must be a good inline replacement for the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.nodeName.toLowerCase(),o=!0;if(n.hasAttribute("alt")){var s=n.getAttribute("alt").trim();if(s.length>0){for(var u=["short description"],d=0;o&&d<u.length;++d)o=-1==s.indexOf(u[d]);if(o){var c=n.getAttribute("area"==l?"href":"src");null!=c&&(o=c.trim()!=s&&(-1==s.indexOf(".")||-1==s.indexOf(c)&&-1==c.indexOf(s)))}}}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8274(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_null=void 0;var a=i(461),n=i(461),r=i(3946),l=i(7011),o=i(7139);t.img_alt_null={id:"img_alt_null",context:"dom:img[alt]",refactor:{WCAG20_Img_TitleEmptyWhenAltNull:{Pass_0:"pass",Fail_1:"fail_decorative"}},help:{"en-US":{pass:"img_alt_null.html",fail_decorative:"img_alt_null.html",potential_aria_override:"img_alt_null.html",group:"img_alt_null.html"}},messages:{"en-US":{pass:"Neither 'aria' nor 'title' attributes are used for the decorative image",fail_decorative:"The image 'alt' attribute is empty, but the 'title' attribute is not empty",potential_aria_override:"The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute",group:"When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_decorative"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["potential_aria_override"]}],act:[{"46ca7f":{potential_aria_override:"fail"}}],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)||n.getAttribute("alt").trim().length>0?null:l.AriaUtil.getAriaLabel(n).length>0?(0,a.RulePotential)("potential_aria_override"):o.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RuleFail)("fail_decorative"):(0,a.RulePass)("pass")}}},590(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_redundant=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7139);t.img_alt_redundant={id:"img_alt_redundant",context:"dom:img[alt]",refactor:{WCAG20_Img_LinkTextNotRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"img_alt_redundant.html",Fail_1:"img_alt_redundant.html",Fail_2:"img_alt_redundant.html",Fail_3:"img_alt_redundant.html",group:"img_alt_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Link text is repeated in an image 'alt' value within the same link",Fail_2:"Link text of previous link is repeated in image 'alt' value of a link",Fail_3:"Image 'alt' value within a link is repeated in link text of the link after",group:"The text alternative for an image within a link should not repeat the link text or adjacent link text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.4.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CommonUtil.getAncestor(n,"a");if(null==o)return null;var s=n.getAttribute("alt").trim().toLowerCase();if(0==s.length)return null;var u=o.innerText,d="";if(null!=u&&(d=u.trim().toLowerCase()),!(d.length>0)){for(var c=!0,m=new r.DOMWalker(o);c&&m.prevNode()&&!("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&l.CommonUtil.attributeNonEmpty(p,"alt"));)"a"!==h||l.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=(p.innerText||p.textContent||"").trim().toLowerCase()!=s);if(!c)return(0,a.RuleFail)("Fail_2");for(m=new r.DOMWalker(o,!0);c&&m.nextNode();){var p,h;if("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&l.CommonUtil.attributeNonEmpty(p,"alt"))break;"a"!=h||l.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=p.innerText.trim().toLowerCase()!=s)}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3")}return s==d?(0,a.RuleFail)("Fail_1"):void 0}}},8925(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946),o=i(1950);t.img_alt_valid={id:"img_alt_valid",context:"dom:img",refactor:{WCAG20_Img_HasAlt:{pass:"pass",fail_blank_alt:"fail_blank_alt",fail_no_alt:"fail_no_alt",fail_blank_title:"fail_blank_title"}},help:{"en-US":{pass:"img_alt_valid.html",fail_blank_alt:"img_alt_valid.html",fail_no_alt:"img_alt_valid.html",fail_blank_title:"img_alt_valid.html",group:"img_alt_valid.html"}},messages:{"en-US":{pass:"The image has an accessible name or is correctly marked as decorative or redundant",fail_blank_alt:"Image 'alt' attribute value consists only of blank space(s)",fail_no_alt:"The image has neither an accessible name nor is marked as decorative or redundant",fail_blank_title:"The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)",group:"Images must have accessible names unless they are decorative or redundant"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"23a2a8",run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n)||o.AccNameUtil.isAccessibleNameIgnorable(n))return null;if(0!==r.AriaUtil.getAriaLabel(n).trim().length)return(0,a.RulePass)("pass");var s=n.hasAttribute("alt")?n.getAttribute("alt"):null;if(null!==s)return 0===s.length||s.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_blank_alt");var u=n.hasAttribute("title")?n.getAttribute("title"):null;if(null!==u&&0!==u.length)return 0===u.trim().length?(0,a.RuleFail)("fail_blank_title"):(0,a.RulePass)("pass");if(null===s){var d=r.AriaUtil.getResolvedRole(n,!1);return"presentation"===d||"none"===d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_alt")}return 0===s.length?(0,a.RulePass)("pass"):void 0}}},9234(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_ismap_misuse=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.img_ismap_misuse={id:"img_ismap_misuse",context:"dom:img[ismap]",refactor:{RPT_Img_UsemapValid:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_ismap_misuse.html",Potential_1:"img_ismap_misuse.html",group:"img_ismap_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Server-side image map hot-spots do not have duplicate text links",group:"Server-side image map hot-spots must have duplicate text links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=!1;if(n.hasAttribute("usemap")){var s=n.getAttribute("usemap"),u=(s=s.trim().toLowerCase()).indexOf("#");if(-1!=u&&(s=s.substr(u+1)),s.length>0)for(var d=r.CommonUtil.getDocElementsByTag(n,"map"),c=0;!o&&c<d.length;++c)o=d[c].hasAttribute("name")&&d[c].getAttribute("name").toLowerCase()==s}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_longdesc_misuse=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.img_longdesc_misuse={id:"img_longdesc_misuse",context:"dom:img[longdesc]",refactor:{RPT_Img_LongDescription2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_longdesc_misuse.html",Potential_1:"img_longdesc_misuse.html",group:"img_longdesc_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)",group:" The 'longdesc' attribute must reference HTML content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("longdesc"),s=r.CommonUtil.getFileExt(o),u=0!=s.length&&r.CommonUtil.isHtmlExt(s)||o.startsWith("#")||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("data:");return u?(0,a.RulePass)("Pass_0"):u?void 0:(0,a.RulePotential)("Potential_1")}}},591(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||a(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),n(i(2297),t),n(i(4401),t),n(i(4546),t),n(i(9292),t),n(i(9605),t),n(i(3987),t),n(i(8631),t),n(i(8025),t),n(i(1198),t),n(i(8001),t),n(i(5778),t),n(i(8118),t),n(i(2242),t),n(i(3673),t),n(i(5080),t),n(i(183),t),n(i(6805),t),n(i(1886),t),n(i(4078),t),n(i(5750),t),n(i(85),t),n(i(514),t),n(i(5310),t),n(i(9083),t),n(i(6049),t),n(i(5099),t),n(i(2759),t),n(i(3141),t),n(i(5131),t),n(i(5167),t),n(i(8115),t),n(i(5733),t),n(i(5782),t),n(i(6731),t),n(i(390),t),n(i(3900),t),n(i(1218),t),n(i(6734),t),n(i(9973),t),n(i(5711),t),n(i(3384),t),n(i(2762),t),n(i(5757),t),n(i(5232),t),n(i(1891),t),n(i(6142),t),n(i(4863),t),n(i(1440),t),n(i(1968),t),n(i(1617),t),n(i(3475),t),n(i(3370),t),n(i(9272),t),n(i(7735),t),n(i(3923),t),n(i(7521),t),n(i(1852),t),n(i(799),t),n(i(4614),t),n(i(5952),t),n(i(5395),t),n(i(1992),t),n(i(7955),t),n(i(9531),t),n(i(891),t),n(i(7446),t),n(i(6137),t),n(i(6839),t),n(i(8135),t),n(i(507),t),n(i(3566),t),n(i(5173),t),n(i(6027),t),n(i(7515),t),n(i(1704),t),n(i(5053),t),n(i(4681),t),n(i(8050),t),n(i(2644),t),n(i(429),t),n(i(4617),t),n(i(5460),t),n(i(3399),t),n(i(3498),t),n(i(9629),t),n(i(733),t),n(i(9797),t),n(i(7156),t),n(i(3062),t),n(i(3827),t),n(i(5498),t),n(i(510),t),n(i(7722),t),n(i(4597),t),n(i(2104),t),n(i(8260),t),n(i(8920),t),n(i(1237),t),n(i(4101),t),n(i(275),t),n(i(7601),t),n(i(7541),t),n(i(8274),t),n(i(590),t),n(i(8925),t),n(i(9234),t),n(i(8617),t),n(i(1939),t),n(i(7726),t),n(i(3142),t),n(i(1353),t),n(i(2631),t),n(i(8550),t),n(i(8853),t),n(i(3180),t),n(i(1382),t),n(i(953),t),n(i(2222),t),n(i(4678),t),n(i(7578),t),n(i(9964),t),n(i(6401),t),n(i(1174),t),n(i(9907),t),n(i(6032),t),n(i(5622),t),n(i(2240),t),n(i(4019),t),n(i(361),t),n(i(5960),t),n(i(5515),t),n(i(8752),t),n(i(8834),t),n(i(1025),t),n(i(9116),t),n(i(435),t),n(i(6640),t),n(i(2068),t),n(i(7322),t),n(i(5702),t),n(i(1961),t),n(i(3022),t),n(i(375),t),n(i(4658),t),n(i(4605),t),n(i(5294),t),n(i(3506),t),n(i(7475),t),n(i(8064),t),n(i(7942),t),n(i(2219),t),n(i(1473),t),n(i(1912),t),n(i(6539),t),n(i(4),t),n(i(5334),t),n(i(2173),t),n(i(8349),t),n(i(8142),t),n(i(3980),t),n(i(4701),t),n(i(18),t),n(i(9314),t),n(i(1667),t),n(i(9599),t),n(i(4672),t),n(i(4353),t),n(i(7147),t),n(i(1419),t),n(i(855),t),n(i(3420),t),n(i(408),t)},1939(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_autocomplete_valid=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.input_autocomplete_valid={id:"input_autocomplete_valid",context:"dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]",refactor:{WCAG21_Input_Autocomplete:{Pass_0:"pass",Fail_1:"fail_inappropriate",Fail_2:"fail_invalid",Fail_attribute_incorrect:"fail_incorrect"}},help:{"en-US":{group:"input_autocomplete_valid.html",pass:"input_autocomplete_valid.html",fail_inappropriate:"input_autocomplete_valid.html",fail_invalid:"input_autocomplete_valid.html",fail_incorrect:"input_autocomplete_valid.html"}},messages:{"en-US":{group:"The 'autocomplete' attribute's token(s) must be appropriate for the input form field",pass:"The 'autocomplete' attribute's token(s) is appropriate for the input form field",fail_inappropriate:"The 'autocomplete' attribute's token(s) are not appropriate for the input form field",fail_invalid:"The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type",fail_incorrect:"The 'autocomplete' attribute has an incorrect value"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"73f2c2":{pass:"pass",fail_inappropriate:"fail",fail_invalid:"pass",fail_incorrect:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(!l.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;var o=n.getAttribute("autocomplete").trim().toLowerCase(),s=o.split(/\s+/);if(0===s.length||0===o.length)return null;var u={tokensOnOff:["on","off"],tokenOptionalSection:"section-",tokensOptionalPurpose:["shipping","billing"],tokensMandatoryGroup1_password:["new-password","current-password","one-time-code"],tokensMandatoryGroup1_multiline:["street-address"],tokensMandatoryGroup1_month:["cc-exp"],tokensMandatoryGroup1_numeric:["cc-exp-month","cc-exp-year","transaction-amount","bday-day","bday-month","bday-year"],tokensMandatoryGroup1_date:["bday"],tokensMandatoryGroup1_url:["url","photo"],tokensMandatoryGroup1_text:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","organization-title","organization","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-csc","cc-type","transaction-currency","language","sex"],tokensMandatoryGroup1_all:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","new-password","current-password","organization-title","organization","street-address","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc","cc-type","transaction-currency","transaction-amount","language","bday","bday-day","bday-month","bday-year","sex","url","photo"],tokensOptionalGroup2:["home","work","mobile","fax","pager"],tokensMandatoryGroup2_tel:["tel"],tokensMandatoryGroup2_email:["email"],tokensMandatoryGroup2_url:["impp"],tokensMandatoryGroup2_text:["tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension"],tokensMandatoryGroup2_all:["tel","tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension","email","impp"],tokensOptionGroup1_webauthn:["webauthn"]},d=[];for(var c in u)d=d.concat(u[c]);var m=!1,p=!0,h=n.nodeName.toLowerCase();if(!s.every(function(e){return d.includes(e)||e.startsWith(u.tokenOptionalSection)}))return(0,a.RuleFail)("fail_incorrect");var g=n.hasAttribute("type")?n.getAttribute("type").trim().toLowerCase():"text",b=[],_=[],f=[];if("textarea"===h||"select"===h)b=u.tokensMandatoryGroup1_all,_=u.tokensMandatoryGroup2_all,"textarea"===h&&(f=u.tokensOptionGroup1_webauthn);else{if("input"!==h)return null;switch(f=u.tokensOptionGroup1_webauthn,g){case"text":case"search":b=u.tokensMandatoryGroup1_text.concat(u.tokensMandatoryGroup1_password,u.tokensMandatoryGroup1_url,u.tokensMandatoryGroup1_numeric,u.tokensMandatoryGroup1_month,u.tokensMandatoryGroup1_date),_=u.tokensMandatoryGroup2_all;break;case"password":b=u.tokensMandatoryGroup1_password;break;case"url":b=u.tokensMandatoryGroup1_url,_=u.tokensMandatoryGroup2_url;break;case"email":_=u.tokensMandatoryGroup2_email;break;case"tel":_=u.tokensMandatoryGroup2_tel;break;case"number":b=u.tokensMandatoryGroup1_numeric;break;case"month":b=u.tokensMandatoryGroup1_month;break;case"date":b=u.tokensMandatoryGroup1_date;break;default:return null}}if(s.includes("on")||s.includes("off"))return 1===s.length?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid");var v=0,A=0;return s[v].startsWith(u.tokenOptionalSection)&&s[v].length>8&&(v++,A++),s.length>v&&u.tokensOptionalPurpose.includes(s[v])&&(v++,A++),s.length>v&&(b.includes(s[v])?(m=!0,v++):(u.tokensOptionalGroup2.includes(s[v])&&v++,_.includes(s[v])&&(m=!0,v++))),s.length>A&&(u.tokensMandatoryGroup1_all.includes(s[A])?(p=!0,A++):(u.tokensOptionalGroup2.includes(s[A])&&A++,u.tokensMandatoryGroup2_all.includes(s[A])&&(p=!0,A++))),s.length>v+A&&f.includes(s[v+A])&&v++,(s.length>v&&f.includes(s[v])||s.length>A&&f.includes(s[A]))&&(v++,A++),m&&s.length===v?(0,a.RulePass)("pass"):p&&s.length===A?(0,a.RuleFail)("fail_incorrect"):(0,a.RuleFail)("fail_inappropriate")}}},7726(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_checkboxes_grouped=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3864),s=i(4566),u=i(3946),d=i(9196);t.input_checkboxes_grouped={id:"input_checkboxes_grouped",context:"dom:input[type=radio], dom:input[type=checkbox]",refactor:{WCAG20_Input_RadioChkInFieldSet:{Pass_LoneNogroup:"pass_lonenogroup",Pass_Grouped:"pass_grouped",Pass_RadioNoName:"pass_radioNoName",Fail_ControlNameMismatch:"fail_controlnamemismatch",Fail_NotGroupedOtherGrouped:"fail_notgroupedothergrouped",Fail_NotGroupedOtherNotGrouped:"fail_notgroupedothernotgrouped",Fail_NotSameGroup:"fail_notsamegroup",Potential_LoneCheckbox:"potential_lonecheckbox",Potential_UnnamedCheckbox:"potential_unnamedcheckbox"}},help:{"en-US":{group:"input_checkboxes_grouped.html",pass_lonenogroup:"input_checkboxes_grouped.html",pass_grouped:"input_checkboxes_grouped.html",pass_radiononame:"input_checkboxes_grouped.html",fail_controlnamemismatch:"input_checkboxes_grouped.html",fail_notgroupedothergrouped:"input_checkboxes_grouped.html",fail_notgroupedothernotgrouped:"input_checkboxes_grouped.html",fail_notsamegroup:"input_checkboxes_grouped.html",potential_lonecheckbox:"input_checkboxes_grouped.html",potential_unnamedcheckbox:"input_checkboxes_grouped.html"}},messages:{"en-US":{group:"Related sets of radio buttons or checkboxes should be programmatically grouped",pass_lonenogroup:"{0} grouping not required for a control of this type",pass_grouped:"{0} input is grouped with other related controls with the same name",pass_radiononame:"Radio input is not grouped, but passes because it has no name to group with other radio inputs",fail_controlnamemismatch:'{0} input found that has the same name, "{2}" as a {1} input',fail_notgroupedothergrouped:'{0} input is not in the group with another {0} with the name "{1}"',fail_notgroupedothernotgrouped:'{0} input and others with the name "{1}" are not grouped together',fail_notsamegroup:'{0} input is in a different group than another {0} with the name "{1}"',potential_lonecheckbox:"Verify that this ungrouped checkbox input is not related to other checkboxes",potential_unnamedcheckbox:"Verify that this un-named, ungrouped checkbox input is not related to other checkboxes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(u.VisUtil.isNodeHiddenFromAT(n))return null;var c=function(e){var t=l.CommonUtil.getAncestor(e,"fieldset")||r.AriaUtil.getAncestorWithRole(e,"radiogroup")||r.AriaUtil.getAncestorWithRole(e,"group")||r.AriaUtil.getAncestorWithRole(e,"grid")||r.AriaUtil.getAncestorWithRole(e,"table");return t||(t=l.CommonUtil.getAncestor(e,"table"))&&!d.TableUtil.isDataTable(t)&&(t=null),t},m=n.getAttribute("type").toLowerCase(),p=r.AriaUtil.getAncestorWithRole(n,"form")||l.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement,h=s.CacheUtil.getCache(p,"input_checkboxes_grouped",null);if(!h){h={checkboxByName:{},radiosByName:{},nameToGroup:{},numCheckboxes:0,numRadios:0};for(var g=new o.DOMWalker(p,!1,p,!0),b=[],_=[];g.nextNode();)if(!g.bEndTag&&1===g.node.nodeType&&"input"===g.node.nodeName.toLowerCase()&&u.VisUtil.isNodeVisible(g.node)){var f=g.node.getAttribute("type");"checkbox"===f?b.push(g.node):"radio"===f&&_.push(g.node)}for(var v=0;v<b.length;++v){var A=b[v];if((r.AriaUtil.getAncestorWithRole(A,"form")||l.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!l.CommonUtil.shouldNodeBeSkippedHidden(A)){var w=A.getAttribute("name")||"";(h.checkboxByName[w]=h.checkboxByName[w]||[]).push(A),h.nameToGroup[w]=h.nameToGroup[w]||c(A),++h.numCheckboxes}}for(v=0;v<_.length;++v){var y=_[v];if((r.AriaUtil.getAncestorWithRole(y,"form")||l.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!l.CommonUtil.shouldNodeBeSkippedHidden(y)){var C=y.getAttribute("name")||"";(h.radiosByName[C]=h.radiosByName[C]||[]).push(y),h.nameToGroup[C]=h.nameToGroup[C]||c(y),++h.numRadios}}s.CacheUtil.setCache(p,"input_checkboxes_grouped",h)}var k=n.getAttribute("name"),R=c(n);if(m="radio"===m?"Radio":"Checkbox",k&&""!==k){var x=(h.radiosByName[k]||[]).length,P=(h.checkboxByName[k]||[]).length;return x>0&&P>0?(0,a.RuleFail)("fail_controlnamemismatch",[m,"checkbox"===m?"radio":"checkbox",k]):"Radio"===m&&(1===h.numRadios||1===x)||"Checkbox"===m&&1===h.numCheckboxes?null===R?(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m]):"Checkbox"===m&&h.numCheckboxes>1&&1===P?null===R?(0,a.RulePotential)("potential_lonecheckbox",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?null!==h.nameToGroup[k]?(0,a.RuleFail)("fail_notgroupedothergrouped",[m,k]):(0,a.RuleFail)("fail_notgroupedothernotgrouped",[m,k]):h.nameToGroup[k]!==R?(0,a.RuleFail)("fail_notsamegroup",[m,k]):(0,a.RulePass)("pass_grouped",[m])}return"Radio"===m?null===R?(0,a.RulePass)("pass_radiononame",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?(h.checkboxByName[""]||[]).length>1?(0,a.RulePotential)("potential_unnamedcheckbox",[m]):(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m])}}},3142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_fields_grouped=void 0;var a=i(461),n=i(461),r=i(7139);t.input_fields_grouped={id:"input_fields_grouped",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_InFieldSet:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"input_fields_grouped.html",Potential_1:"input_fields_grouped.html",group:"input_fields_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Use the <fieldset> element to group logically related input elements",group:"Groups of logically related input elements should be contained within a <fieldset> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")&&"text"!=(m=n.getAttribute("type").toLowerCase())&&"file"!=m&&"password"!=m)return(0,a.RulePass)("Pass_0");if(null!=r.CommonUtil.getAncestor(n,"fieldset"))return(0,a.RulePass)("Pass_0");for(var l=r.CommonUtil.getAncestor(n,["form","body"]),o=["input","textarea","select"],s=!0,u=0;s&&u<o.length;++u)for(var d=l.getElementsByTagName(o[u]),c=0;s&&c<d.length;++c)if(!r.CommonUtil.shouldNodeBeSkippedHidden(d[c])){var m=d[c].hasAttribute("type")?d[c].getAttribute("type").toLowerCase():"text";s=d[c]==n||"text"!=m&&"password"!=m&&"file"!=m}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},1353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_haspopup_conflict=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946);t.input_haspopup_conflict={id:"input_haspopup_conflict",context:"dom:input[list][aria-haspopup]",refactor:{input_haspopup_invalid:{Potential_1:"potential_type_misuse",Potential_2:"potential_misuse"}},help:{"en-US":{group:"input_haspopup_conflict.html",potential_type_misuse:"input_haspopup_conflict.html",potential_misuse:"input_haspopup_conflict.html",potential_list_notexist:"input_haspopup_conflict.html",fail_invalid_list_type:"input_haspopup_conflict.html",fail_invalid_list_elem:"input_haspopup_conflict.html"}},messages:{"en-US":{group:"<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute",potential_type_misuse:"The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_misuse:"The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_list_notexist:"The list attribute for the <input> element is invalid",fail_invalid_list_type:'The list attribute for the <input> element with the type "{0}" is invalid',fail_invalid_list_elem:"The list attribute for the <input> element does not reference a datalist element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n)||l.CommonUtil.isNodeDisabled(n))return null;var s=r.AriaUtil.getUserDefinedRoles(n);if(s&&s.length>0&&!s.includes("combobox"))return null;var u=["text","search","tel","url","email","date","month","week","time","datetime-local","number","range","color"],d=["file","password","checkbox","radio","submit","reset","image","hidden","button"],c=n.getAttribute("type");if(!c||0===c.trim().length)return(0,a.RulePotential)("potential_misuse");if(c=c.trim().toLowerCase(),!u.includes(c)&&!d.includes(c))return(0,a.RulePotential)("potential_misuse");if(c&&d.includes(c))return(0,a.RuleFail)("fail_invalid_list_type");var m=n.getAttribute("list");if(!m||0===m.trim().length)return(0,a.RulePotential)("potential_list_notexist");var p=n.ownerDocument.getElementById(m);return p?"datalist"!==p.nodeName.toLowerCase()?(0,a.RuleFail)("fail_invalid_list_elem"):u.includes(c)?(0,a.RulePotential)("potential_type_misuse",[c]):void 0:(0,a.RuleFail)("potential_list_notexist")}}},2631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_after=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7139);t.input_label_after={id:"input_label_after",context:"dom:input",refactor:{WCAG20_Input_LabelAfter:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_after.html",Fail_1:"input_label_after.html",Fail_2:"input_label_after.html",group:"input_label_after.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Checkbox or radio button is nested in label, so label is not after the input control",Fail_2:"Label text is located before its associated checkbox or radio button element",group:"Checkboxes and radio buttons must have a label after the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o="";if(n.hasAttribute("type")&&(o=n.getAttribute("type").toLowerCase()),"checkbox"!=o&&"radio"!=o)return null;var s=l.CommonUtil.getLabelForElementHidden(n,!0);if(null===s||!l.CommonUtil.hasInnerContentHidden(s))return null;var u,d=l.CommonUtil.compareNodeOrder(s,n);if(-2===d){u=!1;var c=new r.DOMWalker(s);for(c.node=n;!u&&c.nextNode();)u="#text"===c.node.nodeName.toLowerCase()&&c.node.nodeValue.trim().length>0||"span"===c.node.nodeName.toLowerCase()&&c.node.textContent.trim().length>0;if(!u)return(0,a.RuleFail)("Fail_1")}else if(1!=d)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8550(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_before=void 0;var a=i(461),n=i(461),r=i(7139);t.input_label_before={id:"input_label_before",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_LabelBefore:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_before.html",Fail_1:"input_label_before.html",Fail_2:"input_label_before.html",group:"input_label_before.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Text input is nested in label such that input precedes the label text",Fail_2:"Label text is located after its associated text input or <select> element",group:"Text inputs and <select> elements must have a label before the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var l=n.getAttribute("type").toLowerCase();if("text"!=l&&"file"!=l&&"password"!=l)return null}var o=r.CommonUtil.getLabelForElementHidden(n,!0);if(null==o||!r.CommonUtil.hasInnerContentHidden(o))return null;var s=r.CommonUtil.compareNodeOrder(o,n);if(-2===s){var u=r.CommonUtil.getInnerText(n);if(u&&u.trim().length>0&&r.CommonUtil.getInnerText(n).trim()===u.trim())return null;for(var d=!1,c=n.previousSibling;!d&&null!==c;)d="#text"==c.nodeName.toLowerCase()&&c.nodeValue.trim().length>0||"span"==c.nodeName.toLowerCase()&&c.textContent.trim().length>0,c=c.previousSibling;if(!d)return(0,a.RuleFail)("Fail_1")}else if(-1!=s)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8853(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3946),o=i(1950);t.input_label_exists={id:"input_label_exists",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]",refactor:{WCAG20_Input_ExplicitLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_exists.html",Fail_1:"input_label_exists.html",Fail_2:"input_label_exists.html",group:"input_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control element <{0}> has no associated label",Fail_2:'Form control with "{0}" role has no associated label',group:"Each form control must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["97a4e1","e086e5"],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var s=n.nodeName.toLowerCase();if("datalist"===s)return null;var u="text";if("input"==s&&n.hasAttribute("type")?u=n.getAttribute("type").toLowerCase():("button"===s||r.AriaUtil.hasRoleInSemantics(n,"button"))&&(u="buttonelem"),"input"==s&&""==u&&(u="text"),"image"===u)return null;var d=o.AccNameUtil.computeAccessibleName(n);return d&&d.name&&d.name.trim().length>0?(0,a.RulePass)("Pass_0"):n.hasAttribute("role")&&n.getAttribute("role").trim().length>0?(0,a.RuleFail)("Fail_2",n.getAttribute("role").split(" ")):(0,a.RuleFail)("Fail_1",[s])}}},3180(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(3946),u=i(1686),d=i(1950);t.input_label_visible={id:"input_label_visible",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox",dependencies:["input_label_exists"],refactor:{WCAG20_Input_VisibleLabel:{Pass_0:"pass",Potential_1:"potential_no_label",potential_placeholder_only:"potential_placeholder_only"}},help:{"en-US":{pass:"input_label_visible.html",potential_placeholder_only:"input_label_visible.html",potential_no_label:"input_label_visible.html",group:"input_label_visible.html"}},messages:{"en-US":{pass:"The input element has an associated visible label",potential_placeholder_only:"The ‘placeholder’ is the only visible label",potential_no_label:"The input element does not have an associated visible label",group:"An input element must have an associated visible label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.5.3","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if("datalist"===c)return null;if(!s.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;if(l.CommonUtil.getAncestor(n,"table"))return null;var m=r.AriaUtil.getResolvedRole(n);if(m&&"button"===m&&"input"!==c&&"button"!==c&&!l.CommonUtil.getAncestor(n,"form"))return null;if(r.AriaUtil.getAncestorWithRole(n,"combobox")&&!(r.AriaUtil.hasRoleInSemantics(n,"textbox")||r.AriaUtil.hasRoleInSemantics(n,"searchbox")||"input"===c||"select"===c&&r.AriaUtil.hasRoleInSemantics(n,"combobox")))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(r.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=l.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=l.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=l.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(o.FragmentUtil.getById(n,v[A])===n)return null}var w=d.AccNameUtil.computeAccessibleName(n);if(("input"===c||"button"===c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"internal"===w.nameFrom||"alt"===w.nameFrom))return(0,a.RulePass)("pass");if(w&&w.name&&w.name.trim().length>0&&("text"===w.nameFrom||"title"===w.nameFrom))return(0,a.RulePass)("pass");var y=l.CommonUtil.getOnScreenInnerText(n);if(y&&0!==y.length)return(0,a.RulePass)("pass");var C=r.AriaUtil.getAllDescendantsWithRoles(n,["img","graphics-document","graphics-object","graphics-symbol"],!1,!0);if(C&&C.length>0)for(var k=0;k<C.length;k++)if(l.CommonUtil.attributeNonEmpty(C[k],"title")||l.CommonUtil.attributeNonEmpty(C[k],"alt"))return(0,a.RulePass)("pass");if(l.CommonUtil.attributeNonEmpty(n,"aria-labelledby")){var R=n.getAttribute("aria-labelledby").split(/\s+/);for(h=0;h<R.length;++h){var x=o.FragmentUtil.getById(n,R[h]);if(x&&!u.DOMUtil.sameNode(x,n)&&s.VisUtil.isNodeVisible(x)&&l.CommonUtil.hasInnerContentHidden(x))return(0,a.RulePass)("pass")}}if(("optgroup"===c||"option"==c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"content"===w.nameFrom))return(0,a.RulePass)("pass");var P=n.getAttribute("id");return P&&P.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(P,"'][role='combobox']"))?null:l.CommonUtil.attributeNonEmpty(n,"placeholder")?(0,a.RulePotential)("potential_placeholder_only"):(0,a.RulePotential)("potential_no_label")}}},1382(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_onchange_review=void 0;var a=i(461),n=i(461);t.input_onchange_review={id:"input_onchange_review",context:"dom:input[onchange], dom:textarea[onchange], dom:select[onchange]",refactor:{WCAG20_Input_HasOnchange:{Potential_1:"potential_warning"}},help:{"en-US":{potential_warning:"input_onchange_review.html",group:"input_onchange_review.html"}},messages:{"en-US":{group:"Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs",potential_warning:"Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var r=n.getAttribute("type").toLowerCase();if("hidden"===r||"submit"===r||"image"===r||"button"===r||"reset"===r)return null}return(0,a.RulePotential)("potential_warning")}}},953(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_placeholder_label_visible=void 0;var a=i(461);t.input_placeholder_label_visible={id:"input_placeholder_label_visible",context:"dom:input[placeholder], dom:textarea[placeholder]",refactor:{HAAC_Input_Placeholder:{Pass_0:"Pass_0",Potential_1:"Potential_1",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"input_placeholder_label_visible.html",Potential_1:"input_placeholder_label_visible.html",Potential_2:"input_placeholder_label_visible.html",group:"input_placeholder_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"HTML5 placeholder is the only visible label",Potential_2:"Additional visible label referenced by 'aria-labelledby' is not valid",group:"HTML5 'placeholder' attribute must not be used as a visible label replacement"}},rulesets:[],act:[],run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")){var r=n.getAttribute("type").toLowerCase();if("hidden"==r||"button"==r)return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("hidden")){var l=n.getAttribute("hidden");if(""==l||"hidden"==l.toLowerCase())return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("aria-label"))return(0,a.RulePotential)("Potential_1");if(n.hasAttribute("aria-labelledby")&&n.hasAttribute("id")){var o=n.getAttribute("id").trim();return n.getAttribute("aria-labelledby").trim().split(/\s+/).includes(o)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0")}return(0,a.RulePass)("Pass_0")}}},2222(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_content_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(5279),o=i(1686);t.label_content_exists={id:"label_content_exists",context:"dom:label",refactor:{Valerie_Label_HasContent:{Pass_Regular:"Pass_Regular",Pass_AriaLabel:"Pass_AriaLabel",Pass_LabelledBy:"Pass_LabelledBy",Fail_1:"Fail_1"}},help:{"en-US":{Pass_Regular:"label_content_exists.html",Pass_AriaLabel:"label_content_exists.html",Pass_LabelledBy:"label_content_exists.html",Fail_1:"label_content_exists.html",group:"label_content_exists.html"}},messages:{"en-US":{Pass_Regular:"<label> element has accessible name with inner content",Pass_AriaLabel:"<label> element has accessible name via 'aria-label'",Pass_LabelledBy:"<label> element has accessible name via 'aria-labelledby'",Fail_1:"The <label> element does not have descriptive text that identifies the expected input",group:"A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.hasInnerContentHidden(n))return(0,a.RulePass)("Pass_Regular");if((n.getAttribute("aria-label")||"").trim().length>0)return(0,a.RulePass)("Pass_AriaLabel");if(n.hasAttribute("aria-labelledby")){var s=l.FragmentUtil.getById(n,n.getAttribute("aria-labelledby"));if(s&&!o.DOMUtil.sameNode(s,n)&&r.CommonUtil.hasInnerContent(s))return(0,a.RulePass)("Pass_LabelledBy")}return(0,a.RuleFail)("Fail_1")}}},4678(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_name_visible=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(5279),s=i(3946),u=i(4919),d=i(3864);t.label_name_visible={id:"label_name_visible",context:"aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter",refactor:{WCAG21_Label_Accessible:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"label_name_visible.html",Fail_1:"label_name_visible.html",group:"label_name_visible.html"}},messages:{"en-US":{Pass_0:"Accessible name matches or contains the visible label text",Fail_1:"Accessible name does not match or contain the visible label text",group:"Accessible name must match or contain the visible label text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["2.5.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:"2ee8b8",run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;if(u.CSSUtil.isMaterialIconFont(n))return(0,a.RulePass)("Pass_0");var c=!0,m=n.nodeName.toLowerCase(),p=!1,h=null;"input"===m&&n.hasAttribute("type")&&(h=n.getAttribute("type").toLowerCase(),-1!==l.CommonUtil.form_button_types.indexOf(h)&&(p=!0));var g=r.AriaUtil.getAriaAttribute(n,"aria-labelledby");if(!g||l.CommonUtil.isIdReferToSelf(n,g)||p){var b=null;if(g&&!l.CommonUtil.isIdReferToSelf(n,g))for(var _=g.split(/\s+/),f=0;f<_.length;++f){var v=o.FragmentUtil.getById(n,_[f]);if(v){b=l.CommonUtil.getInnerText(v);break}}else b=r.AriaUtil.getAriaAttribute(n,"aria-label");if(!b)return null;var A=null;if(p&&(n.hasAttribute("value")?A=n.getAttribute("value"):"submit"===h?A="submit":"reset"===h&&(A="reset")),!A){var w=l.CommonUtil.getLabelForElementHidden(n,!0);if(!w){var y=d.DOMWalker.parentNode(n);if("label"===y.nodeName.toLowerCase()){var C=y.cloneNode(!0);w=l.CommonUtil.removeAllFormElementsFromLabel(C)}}var k=w||n;A=w||-1===["meter","output","progress","select","textarea"].indexOf(m)?l.CommonUtil.getOnScreenInnerText(k):""}var R=/[^a-zA-Z0-9]/g;A=A.replace(R," ");var x=l.CommonUtil.normalizeSpacing(A).toLowerCase();b=b.replace(R," ");var P=l.CommonUtil.normalizeSpacing(b).toLowerCase();if(x.length>1){var T=P.indexOf(x);if(T>=0&&P.length>x.length){var U=/^[0-9a-zA-Z]+$/;T+x.length<P.length&&P.charAt(T+x.length).match(U)&&(c=!1),c&&T>0&&P.charAt(T-1).match(U)&&(c=!1)}-1===T&&(c=!1)}}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7578(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_ref_valid=void 0;var a=i(461),n=i(461),r=i(5279),l=i(3946);t.label_ref_valid={id:"label_ref_valid",context:"dom:label[for]",refactor:{WCAG20_Label_RefValid:{Pass_0:"pass",Fail_1:"fail_invalid"}},help:{"en-US":{pass:"label_ref_valid.html",fail_invalid:"label_ref_valid.html",group:"label_ref_valid.html"}},messages:{"en-US":{pass:"The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element",fail_invalid:"The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element",group:"The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.getAttribute("for"),s=!1,u=r.FragmentUtil.getById(n,o);if(u){if(!l.VisUtil.isNodeVisible(u)&&!l.VisUtil.isNodeVisible(n))return null;if(s=!0,!u.hasAttribute("role")){var d=u.nodeName.toLowerCase();if(s="input"==d||"select"==d||"textarea"==d||"button"==d||"datalist"==d||"optgroup"==d||"option"==d||"keygen"==d||"output"==d||"progress"==d||"meter"==d||"fieldset"==d||"legend"==d,"input"==u.nodeName.toLowerCase()&&u.hasAttribute("type")){var c=u.getAttribute("type").toLowerCase();s="text"==c||"password"==c||"file"==c||"checkbox"==c||"radio"==c||"hidden"==c||"search"==c||"tel"==c||"url"==c||"email"==c||"date"==c||"number"==c||"range"==c||"image"==c||"time"==c||"color"==c||"datetime-local"==c||"month"==c||"week"==c}}s&&!l.VisUtil.isNodeVisible(u)&&(s=!1)}var m=[];return s||m.push(o),s?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid",m)}}},9964(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_children_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(3864);t.list_children_valid={id:"list_children_valid",context:"aria:group",refactor:{HAAC_List_Group_ListItem:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"list_children_valid.html",Fail_1:"list_children_valid.html",group:"list_children_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'List component with "group" role has children that are not <listitem> elements',group:'List component with "group" role must limit children to <listitem> elements'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.DOMWalker.parentElement(n);if(!r.AriaUtil.hasRoleInSemantics(o,"list"))return null;for(var s=!0,u=n.children,d=0;s&&d<u.length;d++)s=r.AriaUtil.hasRoleInSemantics(u[d],"listitem");return s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_markup_review=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=new RegExp(/^[ \t]*[•◦▪▸►✓✗✦\-–—*o][ \t]+\S/.source+"|"+/^[ \t]*(?:\(?\d+[.)]\)?|\(?[a-zA-Z][.)]\)?|\(?(?:i{1,3}|iv|vi{0,3}|ix|xi{0,3}|xiv|xv)[.)]\)?)[ \t]+\S/i.source,"i"),u=new Set(["blockquote","center","dir","div","form","h1","h2","h3","h4","h5","h6","hr","br","menu","p","pre","table","section","article","aside","nav","header","footer","figure","figcaption","details","summary","dialog","script","style","label","ul","ol","dl","li","dt","dd"]),d=new Set(["a","abbr","acronym","b","bdo","big","br","button","cite","code","dfn","em","i","img","input","kbd","label","map","object","output","q","samp","select","small","span","strong","sub","sup","textarea","time","tt","u","var"]);function c(e){var t="";return e.childNodes.forEach(function(e){var i;if(e.nodeType===Node.TEXT_NODE)t+=null!==(i=e.nodeValue)&&void 0!==i?i:"";else if(e.nodeType===Node.ELEMENT_NODE){var a=e.nodeName.toLowerCase();d.has(a)&&(t+=c(e))}}),t.replace(/\s+/g," ")}function m(e){var t=0,i=0,a="";e.childNodes.forEach(function(e){var n,r=e.nodeName.toLowerCase();if("br"===r){var l=a.trim();return l.length>0&&(s.test(l)?t=Math.max(t,++i):i=0),void(a="")}if(e.nodeType!==Node.TEXT_NODE){if(e.nodeType===Node.ELEMENT_NODE){var o=e;if(u.has(r)){var m=a.trim();return m.length>0&&s.test(m)&&(t=Math.max(t,++i)),a="",void(i=0)}d.has(r)?a+=c(o):(i=0,a="")}}else{var p=null!==(n=e.nodeValue)&&void 0!==n?n:"";if(0===p.trim().length)return;p.split(/\r?\n/).forEach(function(e,n){if(n>0){var r=a.trim();r.length>0&&(s.test(r)?t=Math.max(t,++i):i=0),a=""}a+=e})}});var n=a.trim();return n.length>0&&s.test(n)&&(t=Math.max(t,++i)),t}function p(e){for(var t=0,i=0,a=function(e){var t=[];return function e(i){var a;if(i.nodeType===Node.TEXT_NODE)(null!==(a=i.nodeValue)&&void 0!==a?a:"").split(/\r?\n/).forEach(function(e){var i=e.trim();i.length>0&&t.push(i)});else if(i.nodeType===Node.ELEMENT_NODE){var n=i,o=n.nodeName.toLowerCase();if("br"===o)return void t.push("\0");if(u.has(o))return;if(n.getAttribute("role")){var s=r.AriaUtil.getRolesWithTypes(n,["widget"]);if(l.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","rowheader"],s),s.length>0)return}i.childNodes.forEach(e)}}(e),t.filter(function(e){return"\0"!==e})}(e);i<a.length;i++){var n=a[i];if(s.test(n)){if(++t>=2)return!0}else t=0}return!1}t.list_markup_review={id:"list_markup_review",context:"dom:*",refactor:{RPT_List_UseMarkup:{Potential_1:"Potential_1"}},help:{"en-US":{potential_list:"list_markup_review.html",group:"list_markup_review.html"}},messages:{"en-US":{potential_list:"Verify this is a list and if so, modify to use proper HTML elements for the list",group:"Proper HTML elements should be used to create a list"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,s=n.nodeName.toLowerCase();if(l.CommonUtil.isNodeDisabled(n)||o.VisUtil.hiddenByDefaultElements.includes(s))return null;if(null===l.CommonUtil.getAncestor(n,["body"]))return null;if(null!==l.CommonUtil.getAncestor(n,["script","style","label"]))return null;if("td"===s||"th"===s)return m(n)>=2||p(n)?(0,a.RulePotential)("potential_list"):null;var d=r.AriaUtil.getRolesWithTypes(n,["widget"]);return l.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","rowheader"],d),null!==r.AriaUtil.getAncestorWithRoles(n,d)?null:u.has(s)||"body"===s||"li"===s?["ul","ol","dl","menu"].includes(s)?null:m(n)>=2||p(n)?(0,a.RulePotential)("potential_list"):null:null}}},1174(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_structure_proper=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.list_structure_proper={id:"list_structure_proper",context:"dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt",refactor:{RPT_List_Misuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"list_structure_proper.html",Potential_1:"list_structure_proper.html",group:"list_structure_proper.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"List element is missing or improperly structured",group:"List elements should only be used for lists of related items"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node,s=o.nodeName.toLowerCase();if(o.children,"dl"==s){var u="",d="",c=o.firstChild;n=!0;var m=!1;if(o.children&&0!=o.children.length){for(;n&&null!=c;){if(1==c.nodeType){var p=c.nodeName.toLowerCase();if(r.AriaUtil.isPresentationalElement(c)){m=!0,c=c.nextSibling;continue}n="dd"==p||"dt"==p,""==u&&(u=p),d=p}c=c.nextSibling}n=n&&"dt"==u&&"dd"==d||n&&m}else n=!0}else if("li"==s)n=null!=l.CommonUtil.getAncestor(o,["ul","ol","dir","menu"]);else if("dd"==s||"dt"==s)n=null!=l.CommonUtil.getAncestor(o,"dl");else if(c=o.firstChild,"ul"!=s&&"ol"!=s&&"menu"!=s||o.children&&0!=o.children.length){var h=!1;for(m=!1,n=!0;n&&null!=c;)r.AriaUtil.isPresentationalElement(c)?(m=!0,c=c.nextSibling):(n=1!=c.nodeType||"li"==c.nodeName.toLowerCase()||"template"==c.nodeName.toLowerCase()&&("ul"==s||"ol"==s),h=h||1==c.nodeType&&"li"==c.nodeName.toLowerCase(),c=c.nextSibling);n=n&&h||n&&m}else n=!0;return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9907(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.marquee_elem_avoid=void 0;var a=i(461),n=i(461);t.marquee_elem_avoid={id:"marquee_elem_avoid",context:"dom:marquee",refactor:{RPT_Marquee_Trigger:{Fail_1:"Fail_1"}},help:{"en-US":{Fail_1:"marquee_elem_avoid.html",group:"marquee_elem_avoid.html"}},messages:{"en-US":{Fail_1:"Scrolling content found that uses the obsolete <marquee> element",group:"The <marquee> element is obsolete and should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){return e.dom.node,(0,a.RuleFail)("Fail_1")}}},6032(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_brief=void 0;var a=i(461),n=i(461),r=i(3946);t.media_alt_brief={id:"media_alt_brief",context:"dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]",refactor:{RPT_Media_AltBrief:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_brief.html",Potential_1:"media_alt_brief.html",group:"media_alt_brief.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Text alternative is more than 150 characters",group:"Alternative text in 'alt' attribute should be brief (<150 characters)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=n.getAttribute("alt").trim().length<=150;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},5622(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.media_alt_exists={id:"media_alt_exists",context:"dom:area[alt], dom:embed[alt]",refactor:{RPT_Media_AudioVideoAltFilename:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_exists.html",Potential_1:"media_alt_exists.html",group:"media_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Filename used as label for embedded audio or video",group:"Audio or video on the page must have a short text alternative that describes the media content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o="";null==(o="area"==n.nodeName.toLowerCase()?n.getAttribute("href"):n.getAttribute("src"))&&(o="");var s=r.CommonUtil.getFileExt(o),u=0!=s.length&&(r.CommonUtil.isAudioExt(s)||r.CommonUtil.isVideoExt(s)),d=n.getAttribute("alt"),c=!u||d.length>0&&-1==d.indexOf(s);return c?(0,a.RulePass)("Pass_0"):c?void 0:(0,a.RulePotential)("Potential_1")}}},2240(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_audio_transcribed=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.media_audio_transcribed={id:"media_audio_transcribed",context:"dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object",refactor:{RPT_Media_AudioTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_audio_transcribed.html",group:"media_audio_transcribed.html"}},messages:{"en-US":{Manual_1:"Provide transcripts for audio files",group:"Audio information should also be available in text form"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(o)||(n="bgsound"!=o.nodeName.toLowerCase()&&!r.CommonUtil.isAudioObjEmbedLink(o))?null:n?void 0:(0,a.RuleManual)("Manual_1")}}},4019(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_autostart_controllable=void 0;var a=i(461),n=i(461);t.media_autostart_controllable={id:"media_autostart_controllable",context:"dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound",refactor:{RPT_Embed_AutoStart:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_autostart_controllable.html",Potential_1:"media_autostart_controllable.html",group:"media_autostart_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically",group:"Mechanism must be available to pause or stop and control the volume of the audio that plays automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n,r=e.dom.node,l=r.nodeName.toLowerCase();if("bgsound"==l)n=!1;else if("param"==l){var o="";r.hasAttribute("value")&&(o=r.getAttribute("value").toLowerCase()),n=0==o.indexOf("0;")||!(-1!=o.indexOf("true")||-1!=o.indexOf("1"))}else if("embed"==l){var s;n=!0,r.hasAttribute("flashvars")&&(n=-1==(s=r.getAttribute("flashvars")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1")),n&&r.hasAttribute("src")&&(n=-1==(s=r.getAttribute("src")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1"))}if(n&&r.hasAttribute("autostart")){var u=r.getAttribute("autostart").toLowerCase();n="true"!=u&&"1"!=u}return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},361(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_keyboard_controllable=void 0;var a=i(461),n=i(461),r=i(3946);t.media_keyboard_controllable={id:"media_keyboard_controllable",context:"dom:audio, dom:video",refactor:{HAAC_Audio_Video_Trigger:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"media_keyboard_controllable.html",Manual_1:"media_keyboard_controllable.html",group:"media_keyboard_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify media using <audio> and/or <video> elements have keyboard accessible controls",group:"Media using <audio> and/or <video> elements must have keyboard accessible controls"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var l=!0,o=n.nodeName.toLowerCase();return"audio"!=o&&"video"!==o||(l=!1),l?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1")}}},5960(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_live_captioned=void 0;var a=i(461),n=i(461),r=i(7139);t.media_live_captioned={id:"media_live_captioned",context:"dom:embed, dom:object",refactor:{RPT_Media_VideoObjectTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_live_captioned.html",group:"media_live_captioned.html"}},messages:{"en-US":{Manual_1:"Verify captions are provided for live media (streaming video with audio)",group:"Live media (streaming video with audio) should have captions for audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!r.CommonUtil.isVideoObjEmbedLink(n);return l?null:l?void 0:(0,a.RuleManual)("Manual_1")}}},5515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_track_available=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.media_track_available={id:"media_track_available",context:"dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object",refactor:{RPT_Media_VideoReferenceTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_track_available.html",group:"media_track_available.html"}},messages:{"en-US":{Manual_1:"Verify availability of a user-selectable audio track with description of visual content",group:"Pre-recorded media should have an audio track that describes visual information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.3","1.2.5"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o;return(o="applet"!=n.nodeName.toLowerCase()&&!r.CommonUtil.isVideoObjEmbedLink(n))?null:o?void 0:(0,a.RuleManual)("Manual_1")}}},8752(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_redirect_optional=void 0;var a=i(461),n=i(461),r=i(4566);t.meta_redirect_optional={id:"meta_redirect_optional",context:"dom:meta[http-equiv][content]",refactor:{WCAG20_Meta_RedirectZero:{pass:"pass",fail:"fail",fail_longrefresh:"fail_longrefresh"}},help:{"en-US":{group:"meta_redirect_optional.html",pass:"meta_redirect_optional.html",fail:"meta_redirect_optional.html",fail_longrefresh:"meta_redirect_optional.html"}},messages:{"en-US":{group:"Page should not automatically refresh without warning or option to turn it off or adjust the time limit",pass:"Rule Passed",fail:"Check page does not automatically refresh without warning or options",fail_longrefresh:"Check page does not automatically refresh without warning or options"}},rulesets:[{id:[],num:["2.2.4","3.2.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bisz58"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var l=n.ownerDocument;if(l){if(r.CacheUtil.getCache(l,"meta_redirect_optional_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(r.CacheUtil.setCache(l,"meta_redirect_optional_done",!0),0===s?(0,a.RulePass)("pass"):s<72001?(0,a.RuleFail)("fail"):(0,a.RuleFail)("fail_longrefresh"))}}}},8834(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_refresh_delay=void 0;var a=i(461),n=i(461),r=i(4566);t.meta_refresh_delay={id:"meta_refresh_delay",context:"dom:meta[http-equiv][content]",refactor:{RPT_Meta_Refresh:{Pass_0:"pass",Potential_1:"potential_refresh"}},help:{"en-US":{group:"meta_refresh_delay.html",pass:"meta_refresh_delay.html",potential_refresh:"meta_refresh_delay.html"}},messages:{"en-US":{group:"Pages should not refresh automatically",pass:"Pages do not refresh automatically",potential_refresh:"Verify page is not being caused to refresh automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bc659a"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var l=n.ownerDocument;if(l){if(r.CacheUtil.getCache(l,"meta_refresh_delay_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(r.CacheUtil.setCache(l,"meta_refresh_delay_done",!0),0===s?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_refresh"))}}}},1025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_viewport_zoomable=void 0;var a=i(461),n=i(461);t.meta_viewport_zoomable={id:"meta_viewport_zoomable",context:"dom:meta[name][content]",refactor:{meta_viewport_zoom:{Pass_0:"pass",Potential_1:"potential_zoomable"}},help:{"en-US":{group:"meta_viewport_zoomable.html",pass:"meta_viewport_zoomable.html",potential_zoomable:"meta_viewport_zoomable.html"}},messages:{"en-US":{group:"The 'meta[name=viewport]' should not prevent the browser zooming the content",pass:"The 'meta[name=viewport]' does not prevent the browser zooming the content",potential_zoomable:"Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{b4f0c3:{pass:"pass",potential_zoomable:"fail"}}],run:function(e,t,i){var n=e.dom.node;if("viewport"!==n.getAttribute("name").toLowerCase())return null;var r=n.getAttribute("content").toLowerCase();if(!r||""===r.trim()||!r.includes("maximum-scale")&&!r.includes("user-scalable"))return null;for(var l=null,o=null,s="yes",u="2.0",d=0,c=r.split(",");d<c.length;d++){var m=c[d],p=m.trim().split("=");p.length<2||(m.includes("user-scalable")?(l=m,((s=p[1].trim()).startsWith("'")||s.startsWith('"'))&&(s=s.substring(1,s.length-1))):m.includes("maximum-scale")&&(o=m,((u=p[1].trim()).startsWith("'")||u.startsWith('"'))&&(u=u.substring(1,u.length-1).trim())))}var h=Number(s);isNaN(h)||(h>=1||h<=-1)&&(s="yes");var g;return h=Number(u),g=isNaN(h)?"yes"===u?1:.1:h<0?2:h,"yes"!==s?(0,a.RulePotential)("potential_zoomable",[l]):g<2?(0,a.RulePotential)("potential_zoomable",[o]):(0,a.RulePass)("pass")}}},9116(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.noembed_content_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.noembed_content_exists={id:"noembed_content_exists",context:"dom:noembed",refactor:{Valerie_Noembed_HasContent:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"noembed_content_exists.html",Potential_1:"noembed_content_exists.html",group:"noembed_content_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Add descriptive text to the <noembed> element",group:"<noembed> elements should contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.CommonUtil.hasInnerContentHidden(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},435(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.object_text_exists=void 0;var a=i(461),n=i(461),r=i(3946),l=i(1950);t.object_text_exists={id:"object_text_exists",context:"dom:object",refactor:{WCAG20_Object_HasText:{pass:"pass",fail_no_text_alternative:"fail_no_text_alternative"}},help:{"en-US":{group:"object_text_exists.html",pass:"object_text_exists.html",fail_no_text_alternative:"object_text_exists.html"}},messages:{"en-US":{group:"<object> element must have a text alternative for the content rendered by the object",pass:"<object> element has a text alternative",fail_no_text_alternative:"An <object> element does not have a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"8fc3b6",run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;if(n.hasAttribute("type")&&-1!==n.getAttribute("type").indexOf("text"))return null;if(n.getAttribute("role"))return null;var o=n.getAttribute("data"),s=o&&"string"==typeof o?o.substring(o.lastIndexOf(".")):"";if(".html"===s||".htm"===s)return null;var u=l.AccNameUtil.computeAccessibleName(n);return u&&u.name&&u.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_text_alternative")}}},6640(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(6858);t.page_title_exists={id:"page_title_exists",context:"dom:html",refactor:{WCAG20_Doc_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"page_title_exists.html",Pass_0:"page_title_exists.html",Fail_1:"page_title_exists.html",Fail_2:"page_title_exists.html",Fail_3:"page_title_exists.html"}},messages:{"en-US":{group:"The page should have a title that correctly identifies the subject of the page",Pass_0:"Rule Passed",Fail_1:"Missing <head> element so there can be no <title> element present",Fail_2:"Missing <title> element in <head> element",Fail_3:"The <title> element is empty (no innerHTML)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"2779a5":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail",Fail_3:"fail"}}],run:function(e,t,i){if(l.AncestorUtil.isFrame(i))return null;for(var n=e.dom.node,o=n.firstChild,s=null;null!=o&&"head"!=o.nodeName.toLowerCase();)o=o.nextSibling;for(var u=n.querySelectorAll("title"),d=0;d<u.length;++d)if(!r.CommonUtil.getAncestor(u[d],["svg"])){s=u[d];break}return null!==o||s?null===s?(0,a.RuleFail)("Fail_2"):null!=s&&r.CommonUtil.getInnerText(s).trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3"):(0,a.RuleFail)("Fail_1")}}},2068(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.page_title_valid={id:"page_title_valid",context:"dom:head dom:title",refactor:{RPT_Title_Valid:{Pass_0:"Pass_0",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"page_title_valid.html",Potential_2:"page_title_valid.html",group:"page_title_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_2:"Verify that using the filename as the page <title> value is descriptive",group:"Page <title> should be a descriptive title, rather than a filename"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getInnerText(n).trim(),o=l.toLowerCase();return o.includes(".com")||o.includes(".net")||o.includes(".org")?(0,a.RulePass)("Pass_0",[l]):0===l.length?null:/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(l)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0",[l])}}},7322(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_focus_blur_review=void 0;var a=i(461),n=i(461);t.script_focus_blur_review={id:"script_focus_blur_review",context:"dom:*[onfocus]",refactor:{WCAG20_Script_FocusBlurs:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_focus_blur_review.html",Potential_1:"script_focus_blur_review.html",group:"script_focus_blur_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify script does not remove focus from content that normally receives focus",group:"Scripting must not remove focus from content that normally receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.7","3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=-1==e.dom.node.getAttribute("onfocus").indexOf(".blur(");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},5702(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_avoid=void 0;var a=i(461),n=i(461),r=i(7139);t.script_onclick_avoid={id:"script_onclick_avoid",context:"dom:*[onclick]",dependencies:["script_onclick_misuse"],refactor:{RPT_Script_OnclickHTML2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_avoid.html",Potential_1:"script_onclick_avoid.html",group:"script_onclick_avoid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that 'onclick' events are not used in script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.getAncestor(n,"svg"))return(0,a.RulePass)("Pass_0");if(r.CommonUtil.attributeNonEmpty(n,"role"))return(0,a.RulePass)("Pass_0");var l=n.nodeName.toLowerCase(),o="a"==l||"area"==l||"input"==l;return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},1961(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_misuse=void 0;var a=i(461),n=i(461),r=i(7139);t.script_onclick_misuse={id:"script_onclick_misuse",context:"dom:*[onclick]",refactor:{RPT_Script_OnclickHTML1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_misuse.html",Potential_1:"script_onclick_misuse.html",group:"script_onclick_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Possible use of a script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.attributeNonEmpty(n,"role"),o=n.nodeName.toLowerCase();if(!(l=l||("a"==o||"area"==o)&&r.CommonUtil.attributeNonEmpty(n,"href"))){var s=[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml","location.href"],u=n.getAttribute("onclick").toLowerCase();l=!0;for(var d=0;l&&d<s.length;++d)l=-1==u.indexOf(s[d])}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},3022(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_select_review=void 0;var a=i(461),n=i(461);t.script_select_review={id:"script_select_review",context:"dom:select",refactor:{WCAG20_Select_NoChangeAction:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_select_review.html",Potential_1:"script_select_review.html",group:"script_select_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that no change of context or action occurs when selection options in this component receive focus",group:"No changes of context should occur when a selection value receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!n.hasAttribute("onchange")&&!n.hasAttribute("onfocus");return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},375(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.select_options_grouped=void 0;var a=i(461),n=i(461),r=i(7139);t.select_options_grouped={id:"select_options_grouped",context:"dom:select",refactor:{WCAG20_Select_HasOptGroup:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"select_options_grouped.html",Potential_1:"select_options_grouped.html",group:"select_options_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Group of related options may need <optgroup>",group:"Groups of related options within a selection list should be grouped with <optgroup>"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getChildByTagHidden(n,"optgroup",!1,!0).length>0||r.CommonUtil.getChildByTagHidden(n,"option",!1,!0).length<=10;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},4658(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_described=void 0;var a=i(461),n=i(461),r=i(7139),l=i(4566),o=i(3946);t.skip_main_described={id:"skip_main_described",context:"dom:body",dependencies:["skip_main_exists"],refactor:{WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"skip_main_described.html",Potential_1:"skip_main_described.html",group:"skip_main_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that if this hyperlink skips content, the description communicates where it links to",group:"The description of a hyperlink used to skip content must communicate where it links to"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s={paramSkipText:{value:["skip","jump"],type:"[string]"}},u=e.dom.node,d=u.ownerDocument;if(null===l.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&l.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",r.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=l.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){var c=d.links;if(c&&c.length>0&&o.VisUtil.isNodeVisible(c[0]))for(var m=r.CommonUtil.getInnerText(d.links[0]).toLowerCase(),p=0;!n&&p<s.paramSkipText.value.length;++p)n=-1!=m.indexOf(s.paramSkipText.value[p]);else n=!1}return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},4605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_exists=void 0;var a=i(461),n=i(461),r=i(7139),l=i(6858),o=i(4566),s=i(3946);t.skip_main_exists={id:"skip_main_exists",context:"dom:body",refactor:{WCAG20_Body_FirstASkips_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"skip_main_exists.html",Fail_1:"skip_main_exists.html",group:"skip_main_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)',group:"Pages must provide a way to skip directly to the main content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){if(l.AncestorUtil.isPresentationFrame(i))return null;var n,u=e.dom.node,d=u.ownerDocument;if(null===o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&o.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",r.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){for(var c=r.CommonUtil.getDocElementsByTag(u,"a"),m=null,p=0;p<c.length;++p)if(c[p].hasAttribute("href")&&s.VisUtil.isNodeVisible(c[p])){m=c[p];break}var h=null;if(null!=m){var g=m.getAttribute("href"),b=g.indexOf("#");-1!=b&&(h=g.substring(b+1))}if(null!=h)for(n=null!=d.getElementById(h),p=0;!n&&p<c.length;++p)!c[p].hasAttribute("href")&&c[p].hasAttribute("name")&&c[p].getAttribute("name")==h&&(n=!0)}return n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5294(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_background_decorative=void 0;var a=i(461),n=i(461),r=i(7139);t.style_background_decorative={id:"style_background_decorative",context:"dom:style, dom:*[style]",refactor:{RPT_Style_BackgroundImage:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"style_background_decorative.html",Potential_1:"style_background_decorative.html",group:"style_background_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the CSS background image does not convey important information",group:"Images included by using CSS alone must not convey important information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.nodeName.toLowerCase(),o=!0;if("link"===l&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&(o=r.CommonUtil.triggerOnce(n,"style_background_decorative",!1)),o&&"style"===l||n.hasAttribute("style")){var s=("style"===l?r.CommonUtil.getInnerText(n):n.getAttribute("style")).match(/background:[^;]*/g);if(null!==s)for(var u=0;o&&u<s.length;++u)o=-1===s[u].indexOf("url(")}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3506(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_before_after_review=void 0;var a=i(461),n=i(461),r=i(4919);t.style_before_after_review={id:"style_before_after_review",context:"dom:style, dom:link",refactor:{WCAG20_Style_BeforeAfter:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_before_after_review.html",Pass_0:"style_before_after_review.html",Potential_1:"style_before_after_review.html"}},messages:{"en-US":{group:"Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content",Pass_0:"Rule Passed",Potential_1:"Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content"}},rulesets:[{id:[],num:"1.3.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!0;if("style"===n.nodeName.toLowerCase()){for(var o=r.CSSUtil.getCSSStyle(n),s=0;l&&s<o.length;++s)o[s].selector&&(l=-1===o[s].selector.indexOf(":before")&&-1===o[s].selector.indexOf(":after")||!("content"in o[s].values)||0===o[s].values.content.trim().length||'""'===o[s].values.content.trim()||"''"===o[s].values.content.trim()||"none"===o[s].values.content.trim()||"attr(x)"===o[s].values.content.trim()||"attr(y)"===o[s].values.content.trim());if(l)for(var u=0;u<n.ownerDocument.styleSheets.length;u++)if((_=n.ownerDocument.styleSheets[u]).ownerNode===n)try{var d=_.cssRules?_.cssRules:_.rules;if(d)for(var c=0;l&&c<d.length;c++){var m=d[c],p=void 0;if(m.type&&4===m.type){if(v=m.cssRules)for(var h=0;l&&h<v.length;h++)null!==(w=v[h]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1))}else if(m.type&&3===m.type&&(p=m).styleSheet&&(f=p.styleSheet.cssRules?p.styleSheet.cssRules:p.styleSheet.rules))for(h=0;l&&h<f.length;h++){var g=f[h];if(g.type&&4===g.type){if(v=g.cssRules)for(var b=0;b<v.length;b++)null!==(w=v[b]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1))}else null!==g.selectorText&&void 0!==g.selectorText&&(-1===(C=g.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=g.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1))}}}catch(e){}}if("link"===n.nodeName.toLowerCase()&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&n.hasAttribute("href")&&0!==n.getAttribute("href").trim().length)for(u=0;u<n.ownerDocument.styleSheets.length;u++){var _;if((_=n.ownerDocument.styleSheets[u])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(h=0;l&&h<f.length;h++){var v,A=f[h];if(A.type&&4===A.type){if(v=A.cssRules)for(b=0;l&&b<v.length;b++){var w;if(null!==(w=v[b]).selectorText&&void 0!==w.selectorText){var y=w.selectorText.toLowerCase();-1===y.indexOf(":before")&&-1===y.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1)}}}else if(null!==f[h].selectorText&&void 0!==f[h].selectorText){var C,k;-1===(C=f[h].selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=f[h].style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(l=!1)}}}catch(e){}}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},7475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_color_misuse=void 0;var a=i(7139),n=i(461),r=i(461),l=i(3864),o=i(4566);t.style_color_misuse={id:"style_color_misuse",context:"dom:style, dom:*[style], dom:font[color], dom:link",refactor:{RPT_Style_ColorSemantics1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_color_misuse.html",Pass_0:"style_color_misuse.html",Potential_1:"style_color_misuse.html"}},messages:{"en-US":{group:"Combine color and descriptive markup to convey information",Pass_0:"Rule Passed",Potential_1:"Verify color is not used as the only visual means of conveying information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var r=e.dom.node,s=r.nodeName.toLowerCase(),u="";if("style"===s){u=a.CommonUtil.getInnerText(r).toLowerCase();for(var d=0;d<r.ownerDocument.styleSheets.length;d++)if((_=r.ownerDocument.styleSheets[d])&&_.ownerNode===r)try{for(var c=_.cssRules?_.cssRules:_.rules,m=0;m<c.length;m++){var p=c[m],h=void 0;if(p.type&&3===p.type&&(h=p).styleSheet)for(var g=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules,b=0;b<g.length;b++)u+=g[b].cssText}}catch(e){}}else if(r.hasAttribute("style"))u=r.getAttribute("style").toLowerCase();else if("link"===s&&r.hasAttribute("rel")&&"stylesheet"===r.getAttribute("rel").toLowerCase()&&r.hasAttribute("href")&&0!==r.getAttribute("href").trim().length)for(d=0;d<r.ownerDocument.styleSheets.length;d++){var _;if((_=r.ownerDocument.styleSheets[d])&&_.ownerNode===r)try{var f=_.cssRules?_.cssRules:_.rules;for(b=0;b<f.length;b++)u+=f[b].cssText}catch(e){}}var v=!0,A=u.match(/\bbackground\b/i),w=u.replace(/-color/g,"").match(/\bcolor\b/i);if(r.hasAttribute("color")||w||A){var y={em:"",strong:"",cite:"",dfn:"",code:"",samp:"",kbd:"",var:"",abbr:"",acronym:""};if(!(v=s in y||null!==a.CommonUtil.getAncestor(r,y))&&r.hasChildNodes())for(var C=new l.DOMWalker(r);!v&&C.nextNode()&&C.node!==r;)v=C.node.nodeName.toLowerCase()in y}return v||(v=o.CacheUtil.getCache(r.ownerDocument,"style_color_misuse",!1),o.CacheUtil.setCache(r.ownerDocument,"style_color_misuse",!0)),v?(0,n.RulePass)("Pass_0"):v?void 0:(0,n.RulePotential)("Potential_1")}}},8064(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_focus_visible=void 0;var a=i(7139),n=i(461),r=i(461),l=i(4919),o=i(3883);t.style_focus_visible={id:"style_focus_visible",context:"dom:*",refactor:{RPT_Style_HinderFocus1:{Potential_1:"potential_focus_not_visible"}},help:{"en-US":{group:"style_focus_visible.html",potential_focus_not_visible:"style_focus_visible.html",pass_focus_visible:"style_focus_visible.html"}},messages:{"en-US":{group:"The keyboard focus indicator should be visible when default border or outline is modified by CSS",potential_focus_not_visible:"Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'",pass_focus_visible:"The keyboard focus indicator is visible or is not changed from the browser default"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.7",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r={skipNodes:{value:["table"],type:"[string]"},checkParams:{value:["border","border-width","border-style","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","outline","outline-width","outline-color","outline-style"],type:"[string]"}},s=e.dom.node;if(!a.CommonUtil.isTabbable(s)||r.skipNodes.value.includes(s.nodeName.toLowerCase()))return null;var u=l.CSSUtil.getDefinedStylesMultiple(s,null,["",":focus",":focus-visible",":focus-within"]),d=u[""],c=[];c.push(u[":focus"]),c.push(u[":focus-visible"]),c.push(u[":focus-within"]);var m=c[0];if(Object.keys(m).length>0){if(!((d["outline-width"]||d["outline-style"])&&"0px"!==d["outline-width"]&&"none"!==d["outline-style"]||m["outline-style"]&&"none"===m["outline-style"]))return(0,n.RulePass)("pass_focus_visible");var p=!1,h=0;for(var g in m)if(r.checkParams.value.includes(g)){var b=m[g],_=d[g];if(g.includes("style")){if(p="none"===b,_&&"none"!==b&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("width")){if(h++,"initial"===b?b="2px":"thin"===b?b="1px":"medium"===b?b="2px":"thick"===b&&(b="3px"),_&&("initial"===_?_="2px":"thin"===_?_="1px":"medium"===_?_="2px":"thick"===_&&(_="3px")),b=l.CSSUtil.getPixelsFromStyle(b,s),_=l.CSSUtil.getPixelsFromStyle(_,s),0==b||b<=_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("color")){h++;var f=o.ColorUtil.ColorCombo(s);if(null===f)continue;var v=f.bg;if(!v)continue;if("initial"===b&&(b="black"),_&&"initial"===_&&(_="black"),b=o.ColorUtil.Color(b),_=o.ColorUtil.Color(_),null===b||null===_)continue;var A=b.contrastRatio(v),w=_.contrastRatio(v);if(A<3||A<=w)return(0,n.RulePotential)("potential_focus_not_visible")}else if(h++,null!=_&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}if(p&&0===h)return(0,n.RulePotential)("potential_focus_not_visible")}else for(var y in d)if(r.checkParams.value.includes(y)&&"none"!==(_=d[y]))return(0,n.RulePotential)("potential_focus_not_visible");return(0,n.RulePass)("pass_focus_visible")}}},7942(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_highcontrast_visible=void 0;var a=i(461),n=i(461),r=i(4566);t.style_highcontrast_visible={id:"style_highcontrast_visible",context:"dom:style, dom:link, dom:*[style]",refactor:{RPT_Style_Trigger2:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"style_highcontrast_visible.html",Manual_1:"style_highcontrast_visible.html",group:"style_highcontrast_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content",group:"Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.nodeName.toLowerCase();if("link"===l&&(!n.hasAttribute("rel")||"stylesheet"!==n.getAttribute("rel").toLowerCase()))return(0,a.RulePass)("Pass_0");if("style"!==l&&"link"!==l&&n.hasAttribute("style")&&0===n.getAttribute("style").trim().length)return(0,a.RulePass)("Pass_0");var o=r.CacheUtil.getCache(n.ownerDocument,"style_highcontrast_visible",!1);return r.CacheUtil.setCache(n.ownerDocument,"style_highcontrast_visible",!0),o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RuleManual)("Manual_1")}}},2219(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_hover_persistent=void 0;var a=i(461),n=i(461),r=i(7139);t.style_hover_persistent={id:"style_hover_persistent",context:"dom:style, dom:*[style], dom:*",help:{"en-US":{Pass_0:"style_hover_persistent.html",Pass_2:"style_hover_persistent.html",Potential_1:"style_hover_persistent.html",Potential_2:"style_hover_persistent.html",Potential_3:"style_hover_persistent.html",group:"style_hover_persistent.html"}},messages:{"en-US":{Pass_0:"the hover: pseudo-class is not used to display content",Pass_2:"content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element",Potential_1:"Confirm the pointer can be positioned over the displayed element, not just the trigger",Potential_2:"Confirm the pointer can be positioned over all the information displayed on hover",Potential_3:"Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger",group:"The pointer should be able to move over content displayed on hover"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["1.4.13"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!1,l=!1,o=!1,s=e.dom.node;if("style"===s.nodeName.toLowerCase()){r.CommonUtil.getInnerText(s).toLowerCase();for(var u=0;u<s.ownerDocument.styleSheets.length;++u){var d=s.ownerDocument.styleSheets[u];if(d&&d.ownerNode===s)try{for(var c=d.cssRules?d.cssRules:d.rules,m=0;m<c.length;m++){var p="",h=!1,g=!1,b="",_=!1,f=!1,v=!1,A=(c[m],c[m].cssText);if(A.match(/:hover/g)){p=A.split(":")[0];var w=A.substring(A.indexOf("+")+1);if(w=w.trim(),(A.match(/:hover \+/g)||A.match(/:hover\+/g))&&(h=!0,b=w.split(" ")[0]),A.match(/:hover \~/g)||A.match(/:hover\~/g)){g=!0;var y=A.substring(A.indexOf("~")+1);b=(y=y.trim()).split(" ")[0]}if(!h&&!g)return(0,a.RulePass)("Pass_0");if(b&&(I=w.indexOf("display:"))&&"none;"!==w.slice(I+8).trim().split(" ")[0]&&d&&d.ownerNode===s)try{for(var C=d.cssRules?d.cssRules:d.rules,k=0;k<C.length;k++){var R=c[k].cssText,x=b+" {",P=R.trim(),T=P.indexOf(x);if(P.slice(T).trim(),P.match(/margin/g)){if(!o)return o=!0,(0,a.RulePotential)("Potential_3")}else{var U=R.split(":")[0];if((U=U.split(" ")[0])===b&&R.match(/:hover/g)){var I;if(_=!0,I=R.indexOf("display:"))if(f=!0,"none;"!==w.slice(I+8).trim().split(" ")[0]){if(v=!0,""!==p&&h){var E=s.ownerDocument.getElementsByTagName(p.toUpperCase());if(b.toUpperCase()===E[0].nextElementSibling.tagName){n=!0;continue}}else if(h){if(!l){l=!0;break}continue}if(""!==p&&g){E=s.ownerDocument.getElementsByTagName(p.toUpperCase());var N=[],L=E[0].nextElementSibling;do{if(L.tagName!==b.toUpperCase())break;N.push(L)}while(L=L.nextElementSibling);var S=N.length;if(1===S)return(0,a.RulePass)("Pass_2");if(S>1)return(0,a.RulePotential)("Potential_2")}}else{if(h){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}}else{if(h){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}}}else{if(h){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_2");continue}}}}}catch(e){}}}}catch(e){}}}return n?(0,a.RulePass)("Pass_0"):l?(0,a.RulePotential)("Potential_1"):o?(0,a.RulePotential)("Potential_3"):void 0}}},1473(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_viewport_resizable=void 0;var a=i(461),n=i(461);t.style_viewport_resizable={id:"style_viewport_resizable",context:"dom:link, dom:style, dom:*[style]",refactor:{WCAG21_Style_Viewport:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_viewport_resizable.html",Pass_0:"style_viewport_resizable.html",Potential_1:"style_viewport_resizable.html"}},messages:{"en-US":{group:"Text must scale up to 200% without loss of content or functionality",Pass_0:"Rule Passed",Potential_1:"Verify that text sized using viewport units can be resized up to 200%"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.4.4","1.4.10"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!0,l=/\d+(vw|vh|vmin|vmax)/gi,o=n.nodeName.toLowerCase();if("style"===o){for(var s=0;s<n.ownerDocument.styleSheets.length;s++)if((_=n.ownerDocument.styleSheets[s]).ownerNode===n)try{var u=_.cssRules?_.cssRules:_.rules;if(u)for(var d=0;r&&d<u.length;d++){var c=u[d];if(c.type&&1===c.type){var m=c;if(m.style.fontSize){var p=(v=m.style.fontSize.trim()).match(l);v.length&&p&&(r=!1)}}else if(c.type&&3===c.type&&c.styleSheet){var h=c;if(f=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules)for(var g=0;r&&g<f.length;g++){var b=f[g];b.type&&1===b.type&&b.style.fontSize&&(p=(v=b.style.fontSize.trim()).match(l),v.length&&p&&(r=!1))}}}}catch(e){}}else if("link"===o)for(s=0;s<n.ownerDocument.styleSheets.length;s++){var _;if((_=n.ownerDocument.styleSheets[s])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(g=0;r&&g<f.length;g++){var v,A=f[g];if(A.type&&1===A.type&&A.style.fontSize)p=(v=A.style.fontSize.trim()).match(l),v.length&&p&&(r=!1)}}catch(e){}}else{var w=n.getAttribute("style");w&&(p=w.match(/font-size:\s*\d+(vw|vh|vmin|vmax)/gi))&&(r=!1)}return r?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},1912(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.svg_graphics_labelled=void 0;var a=i(461),n=i(461),r=i(1950),l=i(3946);t.svg_graphics_labelled={id:"svg_graphics_labelled",context:"dom:svg",help:{"en-US":{group:"svg_graphics_labelled.html",pass:"svg_graphics_labelled.html",fail_acc_name:"svg_graphics_labelled.html"}},messages:{"en-US":{group:"A non-decorative SVG element must have an accessible name",pass:"The SVG element has an accessible name",fail_acc_name:"The SVG element has no accessible name"}},rulesets:[{id:["IBM_Accessibility","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"7d6734":{pass:"pass",fail_acc_name:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n)||l.VisUtil.isNodePresentational(n)||r.AccNameUtil.isAccessibleNameIgnorable(n))return null;var o=r.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},6539(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_aria_descendants=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139);t.table_aria_descendants={id:"table_aria_descendants",context:"aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]",help:{"en-US":{group:"table_aria_descendants.html",explicit_role:"table_aria_descendants.html"}},messages:{"en-US":{group:"Table structure elements cannot specify an explicit 'role' within table containers",explicit_role:"An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.CommonUtil.isTableDescendant(i);if(null!==o&&0!==o.length){var s=r.AriaUtil.getImplicitRole(n),u=r.AriaUtil.getRoles(n,!1);if(!(s&&s.length>0&&u&&u.length>0&&u.some(function(e){return s.includes(e)})))return(0,a.RuleFail)("explicit_role",[e.dom.node.nodeName.toLowerCase(),o[0].role])}}}},4(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_empty=void 0;var a=i(461),n=i(461),r=i(7139);t.table_caption_empty={id:"table_caption_empty",context:"dom:caption",refactor:{Valerie_Caption_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_empty.html",Fail_1:"table_caption_empty.html",group:"table_caption_empty.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <table> element has an empty <caption> element",group:"A <caption> element for a <table> element must contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5334(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_nested=void 0;var a=i(461),n=i(461),r=i(7139);t.table_caption_nested={id:"table_caption_nested",context:"dom:caption",refactor:{Valerie_Caption_InTable:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_nested.html",Fail_1:"table_caption_nested.html",group:"table_caption_nested.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<caption> element is not nested inside a <table> element",group:"The <caption> element must be nested inside the associated <table> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return null!=r.CommonUtil.getAncestor(n,"table")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_exists=void 0;var a=i(461),n=i(461),r=i(9196);t.table_headers_exists={id:"table_headers_exists",context:"dom:table",refactor:{RPT_Table_DataHeadingsAria:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_exists.html",Fail_1:"table_headers_exists.html",group:"table_headers_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Table has no headers identified",group:"Data table must identify headers"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.rows;if(!r.TableUtil.isDataTable(n)||null===l||0===l.length)return null;var o=r.TableUtil.tableHeaderExists(n);return null!==o?o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):void 0}}},8349(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_ref_valid=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(1686),s=i(3946),u=i(9955);t.table_headers_ref_valid={id:"table_headers_ref_valid",context:"dom:td[headers], dom:th[headers]",help:{"en-US":{Pass_0:"table_headers_ref_valid.html",Fail_1:"table_headers_ref_valid.html",Fail_2:"table_headers_ref_valid.html",Fail_3:"table_headers_ref_valid.html",Fail_4:"table_headers_ref_valid.html",group:"table_headers_ref_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document",Fail_2:"The 'headers' attribute value \"{0}\" refers to itself",Fail_3:"The 'headers' attribute value \"{0}\" does not refer to a cell in the same table",Fail_4:'The \'headers\' attribute value "{0}" does not refer to a cell indicated with <th> or a role of "columnheader" or "rowheader"',group:"The 'headers' attribute should refer to a valid cell in the same table"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["a25f45"],run:function(e,t,i){var n=e.dom.node,d=l.CommonUtil.getAncestor(n,"table"),c=u.ARIAMapper.nodeToRole(d);if(null==d||!s.VisUtil.isNodeVisible(d)||!["table","grid"].includes(c))return null;n.nodeName.toLowerCase();var m=n.ownerDocument,p=n.getAttribute("headers");if(!p)return null;for(var h=p.split(" "),g=[],b=[],_=[],f=[],v=0;v<h.length;v++){var A=h[v];if(""!==A.trim()){var w=m.getElementById(A);if(w)if(o.DOMUtil.sameNode(w,n))b.push(A);else if(o.DOMUtil.isInSameTable(w,n)){if("th"!==w.nodeName.toLowerCase()){var y=r.AriaUtil.getRoles(w,!0);y.includes("columnheader")||y.includes("rowheader")||f.push(A)}}else _.push(A);else g.push(A)}}var C=[];return 0!=g.length&&C.push((0,a.RuleFail)("Fail_1",[g.toString()])),0!=b.length&&C.push((0,a.RuleFail)("Fail_2",[b.toString()])),0!=_.length&&C.push((0,a.RuleFail)("Fail_3",[_.toString()])),0!=f.length&&C.push((0,a.RuleFail)("Fail_4",[f.toString()])),0==C.length?(0,a.RulePass)("Pass_0"):C}}},8142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_related=void 0;var a=i(461),n=i(461),r=i(7139),l=i(4566),o=i(9196);t.table_headers_related={id:"table_headers_related",context:"dom:td, dom:th",refactor:{Valerie_Table_DataCellRelationships:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_related.html",Fail_1:"table_headers_related.html",group:"table_headers_related.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Complex table does not have headers for each cell properly defined with 'header' or 'scope'",group:"For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.CommonUtil.getAncestor(n,"table");if(null==s||!o.TableUtil.isComplexDataTable(s))return null;if(null===l.CacheUtil.getCache(n,"table_headers_related",null)){for(var u=[],d=0;d<s.rows.length;++d){var c=s.rows[d];u[d]||(u[d]=[]);for(var m=0;m<c.cells.length;++m){var p=c.cells[m];l.CacheUtil.setCache(p,"table_headers_related",d+":"+m);var h=parseInt(p.getAttribute("colspan"));h||(h=1);var g=parseInt(p.getAttribute("rowspan"));g||(g=1);for(var b=0;u[d][b];)b+=1;for(var _=0;_<g;++_){u[d+_]||(u[d+_]=[]);for(var f=0;f<h;++f)u[d+_][b+f]=p}}}var v=n.ownerDocument,A={},w={};for(d=0;d<u.length;++d){var y=!1;for(m=0;m<u[d].length;++m){var C=u[d][m],k=C.nodeName.toLowerCase();if("th"==k){if("row"==C.getAttribute("scope")?(y=!0,r.CommonUtil.attributeNonEmpty(C,"axis")||(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0)):"rowgroup"==C.getAttribute("scope")?r.CommonUtil.attributeNonEmpty(C,"axis")||(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0):"col"==C.getAttribute("scope")&&(w[m]=!0,r.CommonUtil.attributeNonEmpty(C,"axis")||(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0)),r.CommonUtil.attributeNonEmpty(C,"headers")){var R=C.getAttribute("headers").split(" ");for(_=0;_<R.length;++_)(x=v.getElementById(R[_].trim()))&&r.CommonUtil.getAncestor(x,"table")==s&&(A[l.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}else if("td"==k)if(y||w[m])A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0;else if(r.CommonUtil.attributeNonEmpty(C,"headers"))for(R=C.getAttribute("headers").split(" "),_=0;_<R.length;++_){var x;(x=v.getElementById(R[_].trim()))&&r.CommonUtil.getAncestor(x,"table")==s&&(A[l.CacheUtil.getCache(C,"table_headers_related",null)]=!0,A[l.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}}l.CacheUtil.setCache(s,"table_headers_related",A)}var P=l.CacheUtil.getCache(n,"table_headers_related",null),T=l.CacheUtil.getCache(s,"table_headers_related",null),U=P&&T&&P in T;return U||"0:0"!==P||0!=r.CommonUtil.getInnerText(n).trim().length?(U||0!=s.getElementsByTagName("th").length||(!0===l.CacheUtil.getCache(s,"table_headers_related_TrigOnce",!1)?U=!0:l.CacheUtil.setCache(s,"table_headers_related_TrigOnce",!0)),U?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")):null}}},3980(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_layout_linearized=void 0;var a=i(461),n=i(461),r=i(3946),l=i(9196);t.table_layout_linearized={id:"table_layout_linearized",context:"dom:table",refactor:{RPT_Table_LayoutTrigger:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"table_layout_linearized.html",Potential_1:"table_layout_linearized.html",group:"table_layout_linearized.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify table is not being used to format text content in columns unless the table can be linearized",group:"Avoid using tables to format text documents in columns unless the table can be linearized"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=!l.TableUtil.isLayoutTable(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},4701(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_scope_valid=void 0;var a=i(461),n=i(461);t.table_scope_valid={id:"table_scope_valid",context:"dom:td[scope], dom:th[scope]",refactor:{WCAG20_Table_Scope_Valid:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"table_scope_valid.html",Fail_1:"table_scope_valid.html",Fail_2:"table_scope_valid.html",group:"table_scope_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Value provided is invalid for the 'scope' attribute",Fail_2:"The 'scope' attribute should only be used on a <th> element",group:'Value for \'scope\' attribute must be "row", "col", "rowgroup", or "colgroup"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("td"===n.nodeName.toLowerCase())return(0,a.RuleFail)("Fail_2");var r=n.getAttribute("scope").trim().toLowerCase();return/^(row|col|rowgroup|colgroup)$/.test(r)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},18(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_structure_misuse=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3946),s=i(9196);t.table_structure_misuse={id:"table_structure_misuse",context:"dom:table",refactor:{WCAG20_Table_Structure:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_structure_misuse.html",Fail_1:"table_structure_misuse.html",group:"table_structure_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The <{0}> element with "presentation" role or "none" role has structural element(s) and/or attribute(s) \'{1}\'',group:'Table elements with \'role="presentation" or \'role="none" should not have structural elements or attributes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;if(s.TableUtil.isDataTable(n))return null;if(r.AriaUtil.isNodeInGrid(n))return null;var u=[];l.CommonUtil.attributeNonEmpty(n,"summary")&&u.push(n);for(var d=n.getElementsByTagName("caption"),c=0;c<d.length;++c)if(l.CommonUtil.getAncestor(d[c],"table")==n){if(l.CommonUtil.shouldNodeBeSkippedHidden(d[c]))continue;u.push(d[c]);break}var m=n.getElementsByTagName("th");for(c=0;c<m.length;++c)if(l.CommonUtil.getAncestor(m[c],"table")==n){if(l.CommonUtil.shouldNodeBeSkippedHidden(m[c]))continue;u.push(m[c]);break}var p=n.getElementsByTagName("td");for(c=0;c<p.length;++c)if((p[c].hasAttribute("scope")||p[c].hasAttribute("headers"))&&l.CommonUtil.getAncestor(p[c],"table")==n){if(l.CommonUtil.shouldNodeBeSkippedHidden(p[c]))continue;u.push(p[c]);break}var h=n.nodeName.toLowerCase(),g=new Array,b={};for(c=0;c<u.length;c++){var _=u[c].nodeName.toLowerCase();b.hasOwnProperty(_)||("table"!=_||b.hasOwnProperty.summary?(b[_]=!0,g.push(_)):(b.summary=!0,g.push("summary")))}var f=g.join(", ");return 0==u.length?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[h,f])}}},9314(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_summary_redundant=void 0;var a=i(461),n=i(461),r=i(7139),l=i(5279),o=i(1686);t.table_summary_redundant={id:"table_summary_redundant",context:"dom:table",refactor:{WCAG20_Table_CapSummRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_summary_redundant.html",Fail_1:"table_summary_redundant.html",group:"table_summary_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The table summary duplicates the caption",group:"The table summary must not duplicate the caption"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s=e.dom.node;if(s.hasAttribute("summary"))n=s.getAttribute("summary").trim().toLowerCase();else if(s.hasAttribute("aria-describedby")){for(var u=s.getAttribute("aria-describedby").split(" "),d="",c=0;c<u.length;c++){var m=u[c];if(m){var p=l.FragmentUtil.getById(s,m);p&&!o.DOMUtil.sameNode(p,s)&&(d+=" "+r.CommonUtil.getInnerText(p).trim().toLowerCase())}}n=d}if(!n)return null;var h=s.getElementsByTagName("caption");if(0===h.length)return null;if(n.length>0){var g=r.CommonUtil.getInnerText(h[0]).trim().toLowerCase();return n.includes(g)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0")}}}},1667(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.target_spacing_sufficient=void 0;var a=i(7139),n=i(461),r=i(461),l=i(7507),o=i(4919),s=i(4566);t.target_spacing_sufficient={id:"target_spacing_sufficient",context:"dom:*",dependencies:[],help:{"en-US":{group:"target_spacing_sufficient.html",pass_spacing:"target_spacing_sufficient.html",pass_sized:"target_spacing_sufficient.html",pass_inline:"target_spacing_sufficient.html",pass_default:"target_spacing_sufficient.html",violation_spacing:"target_spacing_sufficient.html",recommendation_inline:"target_spacing_sufficient.html",potential_overlap:"target_spacing_sufficient.html"}},messages:{"en-US":{group:"The target must be sufficiently sized or spaced from other targets",pass_spacing:"The target's spacing from other targets is sufficient",pass_sized:"The target’s size is more than 24 CSS pixels",pass_inline:"The target is in a sentence or its size is otherwise constrained by the line-height of non-target text",pass_default:"The target's size is determined by the user agent and is not modified by the author",violation_spacing:'Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"',recommendation_inline:'Confirm the inline target "{0}" is sufficiently spaced from another inline target "{1}"',potential_overlap:'Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE,reasonCodes:["pass_spacing","pass_sized","pass_inline","pass_default","violation_spacing","potential_overlap"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:r.eRulePolicy.RECOMMENDATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE,reasonCodes:["recommendation_inline"]}],act:[],run:function(e,t,i){var r=e.dom.node,u=r.nodeName.toLocaleLowerCase(),d=new l.DOMMapper,c=d.getUnadjustedBounds(r);if(!c)return null;if(!a.CommonUtil.isTarget(r))return null;if(c.height>=24&&c.width>=24)return(0,n.RulePass)("pass_sized");var m=o.CSSUtil.getInlineStatus(r);if(null===m)return null;if(m.inline)return m.text?null===m.violation?(0,n.RulePass)("pass_inline"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]):null===m.violation?(0,n.RulePass)("pass_default"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]);if(o.CSSUtil.isTargetBrowserDefault(r))return(0,n.RulePass)("pass_default");var p=r.ownerDocument;if(!p)return null;var h=getComputedStyle(r);if(null===h)return null;var g=h.zIndex;g&&!isNaN(Number(g))||(g="0");var b=s.CacheUtil.getCache(p.documentElement,"target_spacing_sufficient::targets",void 0);if(void 0===b){b=[];for(var _=p.querySelectorAll("body *:not(script):not(style)"),f=0;f<_.length;f++){var v=_[f];a.CommonUtil.isTarget(v)&&b.push(v)}s.CacheUtil.setCache(p.documentElement,"target_spacing_sufficient::targets",b)}if(b&&0!==b.length){var A=!0,w=24,y=24,C=null,k=null,R=[],x=function(e){var t=b[e],i=r.compareDocumentPosition(t);if(0===i||i&Node.DOCUMENT_POSITION_CONTAINED_BY)return A=!1,"continue";if(i&Node.DOCUMENT_POSITION_CONTAINS||R.some(function(e){return e.contains(t)}))return"continue";var a=d.getUnadjustedBounds(t);if(!a)return"continue";var l=getComputedStyle(t),o="0";if(l&&((o=l.zIndex)&&!isNaN(Number(o))||(o="0")),a.top<=c.top&&a.left<=c.left&&a.top+a.height>=c.top+c.height&&a.left+a.width>=c.left+c.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:null}:{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};if(c.top<=a.top&&c.left<=a.left&&c.top+c.height>=a.top+a.height&&c.left+c.width>=a.left+a.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])}:{value:(0,n.RuleFail)("violation_spacing",[u,t.nodeName.toLowerCase()])};if((c.top>=a.top&&c.top<=a.top+a.height||c.top+c.height<=a.top&&c.top+c.height>=a.top+a.height)&&(c.left>a.left&&c.left<a.left+a.width||a.left>c.left&&a.left<c.left+c.width)||(c.top>a.top&&c.top<a.top+a.height||a.top>c.top&&a.top<c.top+c.height)&&(c.left>=a.left&&c.left<=a.left+a.width||c.left+c.width>=a.left&&c.left+c.width<=a.left+a.width))return{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};var s=24,m=24;c.width<24&&(c.top>=a.top&&c.top<=a.top+a.height||c.top<=a.top&&c.top+c.height>a.top)&&(s=Math.min(Math.abs(c.left-a.left),Math.abs(c.left-(a.left+a.width)),Math.abs(c.left+c.width-(a.left+a.width)),Math.abs(c.left+c.width-a.left))),c.height<24&&(c.left>=a.left&&c.left<=a.left+a.width||c.left<=a.left&&c.left+c.width>a.left)&&(m=Math.min(Math.abs(c.top-a.top),Math.abs(c.top-(a.top+a.height)),Math.abs(c.top+c.height-(a.top+a.height)),Math.abs(c.top+c.height-a.top))),s<w&&(w=s,C=t),m<y&&(y=m,k=t),R.push(t)};for(f=0;f<b.length;f++){var P=x(f);if("object"==typeof P)return P.value}return Math.round(c.width/2)+w<12||Math.round(c.height/2)+y<12?Math.round(c.width/2)+w<Math.round(c.height/2)+y?(0,n.RuleFail)("violation_spacing",[u,C.nodeName.toLowerCase()]):(0,n.RuleFail)("violation_spacing",[u,k.nodeName.toLowerCase()]):(0,n.RulePass)("pass_spacing")}}}},9599(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_block_heading=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(3864),s=i(4919),u=i(3946);t.text_block_heading={id:"text_block_heading",context:"dom:p, dom:div, dom:br",refactor:{RPT_Block_ShouldBeHeading:{Potential_1:"potential_heading"}},help:{"en-US":{potential_heading:"text_block_heading.html",group:"text_block_heading.html"}},messages:{"en-US":{potential_heading:"Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role",group:"Heading text should use a heading element or role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.isNodeDisabled(n)||!u.VisUtil.isNodeVisible(n))return null;if(null===l.CommonUtil.getAncestor(n,["body"])||null!==l.CommonUtil.getAncestor(n,["script"]))return null;var d=0,c=n.ownerDocument.getElementsByTagName("body");if(null!=c){var m=getComputedStyle(c[0]);m&&(d=s.CSSUtil.getPixelsFromStyle(m["font-size"],c))}var p=0,h=[],g=new o.DOMWalker(n);g.nextNode();for(var b=!1;!b&&g.nextNode()&&g.node!==n&&g.node!==o.DOMWalker.parentNode(n)&&!["br","div","p"].includes(g.node.nodeName.toLowerCase());)if(g.node!==n&&!l.CommonUtil.shouldNodeBeSkippedHidden(g.node)){var _=g.node.nodeName.toLowerCase();if(3===g.node.nodeType){if(g.node.nodeValue.trim().length>0&&g.node.parentElement){var f=getComputedStyle(g.node.parentElement);if(f&&("bold"===f["font-weight"]||f["font-weight"]>=700||f["font-size"]&&f["font-size"].includes("large")||f["font-size"]&&0!==d&&s.CSSUtil.getPixelsFromStyle(f["font-size"],g.node.parentElement)>d)){var v=g.node.nodeValue.trim();(A=l.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else b=!0}}else if(1===g.node.nodeType)if("b"===_||"strong"===_||"u"===_||"font"===_){var A;v=l.CommonUtil.getInnerText(g.node),(A=l.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else{var w=r.AriaUtil.getResolvedRole(g.node);b=null!==w&&"generic"!==w&&"paragraph"!==w&&"strong"!==w||"applet"===_}}return 0==p&&(b=!0),b||(b=/[:,;\-\.]$/.test(h.join(" ").trim())),b?null:(0,a.RulePotential)("potential_heading",[h.join(" ")])}}},4672(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_contrast_sufficient=void 0;var a=i(7139),n=i(3946),r=i(3883),l=i(461),o=i(461),s=i(4919);t.text_contrast_sufficient={id:"text_contrast_sufficient",context:"dom:*",refactor:{IBMA_Color_Contrast_WCAG2AA:{Pass_0:"pass",Fail_1:"fail_contrast",Potential_1:"potential_same_color"},IBMA_Color_Contrast_WCAG2AA_PV:{pass_0:"pass",potential_1:"potential_graphic_background"}},help:{"en-US":{group:"text_contrast_sufficient.html",pass:"text_contrast_sufficient.html",fail_contrast:"text_contrast_sufficient.html",potential_same_color:"text_contrast_sufficient.html",potential_graphic_background:"text_contrast_sufficient.html",potential_text_shadow:"text_contrast_sufficient.html"}},messages:{"en-US":{group:"The contrast ratio of text with its background must meet WCAG AA requirements",pass:"The contrast ratio of text with its background meets WCAG AA requirements",fail_contrast:"Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_same_color:"The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast",potential_graphic_background:"Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_text_shadow:"Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.3",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:["afw4f7"],run:function(e,t,i){var o=e.dom.node,u=o.nodeName.toLowerCase();if(!n.VisUtil.isNodeVisible(o)||null!=n.VisUtil.hiddenByDefaultElements&&null!=n.VisUtil.hiddenByDefaultElements&&n.VisUtil.hiddenByDefaultElements.indexOf(u)>-1)return null;if(a.CommonUtil.isNodeDisabled(o))return null;if(a.CommonUtil.getAncestor(o,["svg","script","meta","style"]))return null;var d=o.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=a.CommonUtil.getNodeText(o);if(!a.CommonUtil.isShadowHostElement(o)||a.CommonUtil.isShadowHostElement(o)&&""===a.CommonUtil.getNodeText(o.shadowRoot)){if(0==m.trim().length)return null;if(0===(m=m.trim().replace(/[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g,"")).trim().length)return null}var p=o;if(a.CommonUtil.isShadowHostElement(o)){if(o.shadowRoot)for(var h=o.firstChild;h;h=h.nextSibling)if(3==h.nodeType){p=h.assignedSlot;break}if(null===p)return}var g=c.getComputedStyle(p);if(!1==("0"!==g.width&&"0"!==g.height&&"0"!==g.opacity&&"none"!==g.display&&"hidden"!==g.visibility&&"hidden"!==g.overflow&&("auto"===g.left||"absolute"===g.position&&parseInt(g.left.replace(/[^0-9.+-]/,""))>0)&&("auto"===g.left||"absolute"===g.position&&parseInt(g.top.replace(/[^0-9.+-]/,""))>0)))return null;var b=-1;if("auto"!==g.clip){var _=g.clip.toString();if(_.includes("rect"))for(var f=[],v=/\((.*)\)/g.exec(_)[1].split(", "),A=0;A<v.length;A++)f.push(v[A]);b=parseInt(f[0].replace(/px/g,""))-parseInt(f[2].replace(/px/g,"")),b=Math.abs(b)}if("absolute"===g.position&&b<7&&-1!==b)return null;var w=r.ColorUtil.ColorCombo(p);if(null!==w){var y=w.fg,C=w.bg,k=y.contrastRatio(C),R=s.CSSUtil.getWeightNumber(g.fontWeight),x=s.CSSUtil.getFontInPixels(g.fontSize,p),P=x>=24||x>=18.6&&R>=700;s.CSSUtil.containsCKJ(m)&&(P=x>=29.3||x>=24&&R>=700);var T=k>=4.5||k>=3&&P,U=w.hasBGImage||w.hasGradient,I=w.textShadow,E=a.CommonUtil.isNodeDisabled(p);if(!E){var N=a.CommonUtil.getControlOfLabel(p);N&&(E=a.CommonUtil.isNodeDisabled(N))}return!E&&"label"===u&&a.CommonUtil.isDisabledByFirstChildFormElement(p)&&(E=!0),!E&&o.hasAttribute("id")&&a.CommonUtil.isDisabledByReferringElement(p)&&(E=!0),!T&&E&&(T=!0),T?(0,l.RulePass)("pass",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):U?(0,l.RulePotential)("potential_graphic_background",[k.toFixed(2),x,R]):I?(0,l.RulePotential)("potential_text_shadow",[k.toFixed(2),x,R]):y.toHex()===C.toHex()?(0,l.RulePotential)("potential_same_color",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):(0,l.RuleFail)("fail_contrast",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient])}console.log("unable to get color combo for element: "+p.nodeName)}}},4353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_quoted_correctly=void 0;var a=i(461),n=i(461),r=i(7139),l=i(3946);t.text_quoted_correctly={id:"text_quoted_correctly",context:"dom:*",help:{"en-US":{Pass_0:"text_quoted_correctly.html",Potential_1:"text_quoted_correctly.html",group:"text_quoted_correctly.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}",group:"Quotations should be marked with <q> or <blockquote> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!l.VisUtil.isNodeVisible(n))return null;if(null===r.CommonUtil.getAncestor(n,["body"]))return null;for(var o=!0,s=n.firstChild,u=null,d=["blockquote","q","script","style","pre","code","ruby","samp"];o&&s;){if("#text"===s.nodeName){var c=s.nodeValue,m=(c=c.replace(/(\S)'(\S)/g,"$1$2")).match(/("[^"]+")/g),p=c.match(/('[^']+')/g);if((null!==m||null!==p)&&null===r.CommonUtil.getAncestor(s,d)){if(null!=m)for(var h=0;o&&h<m.length;++h)o=r.CommonUtil.wordCount(m[h])<3;if(null!=p)for(h=0;o&&h<p.length;++h)o=r.CommonUtil.wordCount(p[h])<3;u=null===m?p.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):null===p?m.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):m.concat(p).join(", ").replace(new RegExp("\\r?\\n|\\r","g"),"")}}s=s.nextSibling}return!o&&u.length&&u.length>69&&(u=u.substring(0,32)+" ... "+u.substring(u.length-32)),o?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1",[u])}}},7147(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_sensory_misuse=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(4566),s=i(3946);t.text_sensory_misuse={id:"text_sensory_misuse",context:"dom:body, dom:body dom:*",refactor:{RPT_Text_SensoryReference:{Potential_1:"potential_position, potential_other"}},help:{"en-US":{potential_position:"text_sensory_misuse.html",potential_other:"text_sensory_misuse.html",group:"text_sensory_misuse.html"}},messages:{"en-US":{potential_position:"Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position",potential_other:"Confirm the user instruction is still understandable without the word(s) '{0}'",group:"Instructions should be meaningful without relying solely on shape, size, or location words"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if(!s.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n)||s.VisUtil.hiddenByDefaultElements.includes(c))return null;if(null===l.CommonUtil.getAncestor(n,["body"]))return null;if(null!==l.CommonUtil.getAncestor(n,["script","a","label"]))return null;var m=r.AriaUtil.getResolvedRole(n);if(m){var p=r.AriaUtil.getRolesWithTypes(n,["landmark"]);if(p&&p.includes(m))return null}var h=r.AriaUtil.getRolesWithTypes(n,["widget","heading"]);if(l.CommonUtil.concatUniqueArrayItemList(["caption","cell","code","columnheader","definition","figure","list","listitem","math","meter","row","rowgroup","rowheader","term"],h),null!==r.AriaUtil.getAncestorWithRoles(n,h))return null;for(var g="",b="",_=n.firstChild,f="";_;){if("#text"===_.nodeName){var v=_.nodeValue.trim();v.length>0&&(f+=f.length>0?", "+v:v)}_=_.nextSibling}if(f.length>0){var A=function(e,t){if(!u[t])return"";var i=o.CacheUtil.getCache(e,t+"_sensory_misuse",null);if(null==i){for(var a=u[t].value,n="(ss+|"+a[0],r=1;r<a.length;++r){var l=a[r].trim().split(" ");if(n+="|"+l[0],l.length>1)for(var s=1;s<l.length;++s)n+=" +"+l[s]}n+=")",i=new RegExp(n,"gi"),o.CacheUtil.setCache(e,t+"_sensory_misuse",i)}return i}(n.ownerDocument,"exemptText");f=f.replace(A," "),g=d(n.ownerDocument,"positionText",f),b=d(n.ownerDocument,"otherText",f)}var w=[];return g&&w.push((0,a.RulePotential)("potential_position",[g])),b&&w.push((0,a.RulePotential)("potential_other",[b])),0==w.length?null:w}};var u={positionText:{value:["top-left","top-right","bottom-right","bottom-left","top-to-bottom","left-to-right","bottom-to-top","right-to-left","right","left","above","below","top","bottom","upper","lower","corner","beside"],type:"[string]"},otherText:{value:["round","square","shape","rectangle","triangle","size","large","small","medium","big","huge","tiny","extra","larger","smaller","bigger","little","largest","smallest","biggest"],type:"[string]"},exemptText:{value:["right-click","left-click","right-clicking","right-clicks","left-clicking","left-clicks","square root","right now","off the top"],type:"[string]"}};function d(e,t,i){if(!i)return"";var a=u[t].value,n={},r=[];return i.split(/\s+/).reduce(function(e,t){for(var i=t.replace(/[.?!:;()'",`\]]+$/,""),l=t.toLowerCase().replace(/[.?!:;()'",`\]]/g,""),o=0;o<a.length;o++){var s=l.indexOf(a[o]),u=a[o].length,d=l.charAt(u+s);if(!(s<0)){var c="."==d||"?"==d||"!"==d||":"==d||";"==d||"("==d||")"==d||"'"==d||'"'==d||","==d||".`"==d||"\\"==d||"]"==d,m=!1;if(s>0){var p=l.charAt(s-1);m="-"==p||"."==p||"?"==p||"!"==p||":"==p||";"==p||"("==p||")"==p||"'"==p||'"'==p||","==p||".`"==p||"\\"==p||"]"==p}l.length!=u&&1!=c&&1!=m||(n.hasOwnProperty(i)||(n[i]=!0,r.push(i)),o=a.length)}}return e[i]=(e[i]||0)+1,e},Object.create(null)),r.join(", ")}},1419(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_spacing_valid=void 0;var a=i(461),n=i(7139),r=i(3946),l=i(4919),o=i(7507),s=/(-?[\d.]+)([a-z%]*)/;function u(e,t,i){var a;if(i.startsWith("inherit")||i.startsWith("unset")){var n=l.CSSUtil.getAncestorWithStyles(e.parentElement,((a={})[t]=["*"],a),["inherit","unset"]);if(null!==n)return l.CSSUtil.getDefinedStyles(n,[t])[t];if(i.startsWith("unset"))return"initial"}return i}function d(e,t,i,a,n,r){if(void 0===r&&(r=!1),"important"!==e.style.getPropertyPriority(t))return!0;var o=function(e){return e.substring(0,e.length-11)}(i);if("initial"===o||"normal"===o)return!1;var u=parseFloat(o);if(isNaN(u))return!0;var d=o.trim().match(s);if(!d)return!0;var c=d[1],m=d[2];if(""===m){if(r)return!(parseFloat(c)<n);if(0===parseFloat(c))return null}if(""===m&&0!==parseFloat(c))return null;var p=l.CSSUtil.convertValue2Pixels(m,c,e);return!(null!==p&&p/a<n)}t.text_spacing_valid={id:"text_spacing_valid",context:"dom:*",help:{"en-US":{pass:"text_spacing_valid.html",group:"text_spacing_valid.html",fail_letter_spacing_style:"text_spacing_valid.html",fail_word_spacing_style:"text_spacing_valid.html",fail_line_height_style:"text_spacing_valid.html"}},messages:{"en-US":{pass:"CSS !important is not used in inline style to control letter or word spacing or line height",group:"CSS !important should not be used in inline style to control letter or word spacing or line height",fail_letter_spacing_style:"CSS !important should not be used in inline ‘letter-spacing’ style",fail_word_spacing_style:"CSS !important should not be used in inline ‘word-spacing’ style",fail_line_height_style:"CSS !important should not be used in inline ‘line-height’ style"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.12"],level:a.eRulePolicy.VIOLATION,toolkitLevel:a.eToolkitLevel.LEVEL_THREE}],act:["9e45ec","24afc2","78fd32"],run:function(e,t,i){for(var c=e.dom.node,m="",p=c.childNodes,h=0;h<p.length;++h)3===p[h].nodeType&&(m+=p[h].nodeValue);if(0===m.trim().length)return null;if(r.VisUtil.isNodeHiddenFromAT(c)||n.CommonUtil.isNodeDisabled(c))return null;var g=(new o.DOMMapper).getUnadjustedBounds(c);if(!g||g.top<0||g.left<0)return null;if(n.CommonUtil.getAncestor(c,"svg"))return null;var b=getComputedStyle(c),_=parseFloat(b.getPropertyValue("font-size")),f=b.getPropertyValue("word-spacing"),v=b.getPropertyValue("letter-spacing"),A=b.getPropertyValue("line-height"),w=!0,y=!0,C=!0;if(f){var k=parseFloat(f);if(!isNaN(k)){var R=l.CSSUtil.convertValue2Pixels("px",k.toString(),c);null!==R&&R/_<.16&&(w=!1)}}if(v){var x=parseFloat(v);if(!isNaN(x)){var P=l.CSSUtil.convertValue2Pixels("px",x.toString(),c);null!==P&&P/_<.12&&(y=!1)}}if(A){var T=parseFloat(A);if(!isNaN(T)){var U=A.match(s);if(U){var I=U[1],E=U[2];""!==E&&"px"!==E||(""===E?parseFloat(I):parseFloat(I)/_)<1.5&&(C=!1)}}}if(w&&y&&C)return null;var N=l.CSSUtil.getDefinedStyles(c,["word-spacing","letter-spacing","line-height"]);if(0===Object.keys(N).length)return null;var L=[],S=N["word-spacing"];if(S){var O=d(c,"word-spacing",S=u(c,"word-spacing",S),_,.16);L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_word_spacing_style"))}var q=N["letter-spacing"];q&&(O=d(c,"letter-spacing",q=u(c,"letter-spacing",q),_,.12),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_letter_spacing_style")));var M=N["line-height"];return M&&null===l.CSSUtil.getAncestorWithStyles(c,{overflow:["auto","scroll"],"overflow-x":["auto","scroll"],"overflow-y":["auto","scroll"]})&&(O=d(c,"line-height",M=u(c,"line-height",M),_,1.5,!0),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_line_height_style"))),L.length>0?L:null}}},855(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_whitespace_valid=void 0;var a=i(461),n=i(461),r=i(7139);t.text_whitespace_valid={id:"text_whitespace_valid",context:"dom:*",help:{"en-US":{pass:"text_whitespace_valid.html",potential_text:"text_whitespace_valid.html",group:"text_whitespace_valid.html"}},messages:{"en-US":{pass:"Rule Passed",potential_text:"Space characters should not be used to create space between the letters of a word",group:"Space characters should not be used to control spacing within a word"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=r.CommonUtil.getAncestor(n,["body","script","code"]);if(null==l||"body"!=l.nodeName.toLowerCase())return null;for(var o=!0,s=n.firstChild;o&&s;){if("#text"==s.nodeName){var u=s.nodeValue;o=!/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(u)}s=s.nextSibling}return o?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_text")}}},3420(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_exists=void 0;var a=i(461),n=i(461),r=i(7011),l=i(7139),o=i(9955),s=i(3864),u=i(3946);t.widget_tabbable_exists={id:"widget_tabbable_exists",context:"aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton",refactor:{IBMA_Focus_Tabbable:{pass:"pass",fail_no_tabbable:"fail_no_tabbable"}},help:{"en-US":{pass:"widget_tabbable_exists.html",fail_no_tabbable:"widget_tabbable_exists.html",group:"widget_tabbable_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_no_tabbable:'Component with "{0}" role does not have a tabbable element',group:"Component must have at least one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!u.VisUtil.isNodeHiddenFromAT(n)&&!l.CommonUtil.isNodeDisabled(n)&&!r.AriaUtil.shouldBePresentationalChild(n)){if("datalist"===n.nodeName.toLowerCase())return null;for(var d=0,c=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"];d<c.length;d++){var m=c[d];if(null!=r.AriaUtil.getAncestorWithRole(n,m,!0))return null}var p=o.ARIAMapper.nodeToRole(n),h=0;if(l.CommonUtil.isTabbable(n)&&++h,h<1&&!r.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var g=new s.DOMWalker(n);h<1&&g.nextNode()&&g.node!=n;)1==g.node.nodeType&&!g.bEndTag&&l.CommonUtil.isTabbable(g.node)&&++h;return h>=1?(0,a.RulePass)("pass"):(0,a.RulePotential)("fail_no_tabbable",[p])}}}},408(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_single=void 0;var a=i(461),n=i(461),r=i(3864),l=i(7011),o=i(7139),s=i(9955),u=i(4566),d=i(3946);t.widget_tabbable_single={id:"widget_tabbable_single",context:"aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab",refactor:{IBMA_Focus_MultiTab:{pass:"pass",potential_multiple_tabbable:"potential_multiple_tabbable"}},help:{"en-US":{pass:"widget_tabbable_single.html",potential_multiple_tabbable:"widget_tabbable_single.html",group:"widget_tabbable_single.html"}},messages:{"en-US":{pass:"Components with a widget role should have no more than one tabbable element",potential_multiple_tabbable:'Component with "{0}" role has more than one tabbable element',group:"Components with a widget role must have no more than one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!d.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)&&!l.AriaUtil.shouldBePresentationalChild(n)){var c=s.ARIAMapper.nodeToRole(n),m=0;if(o.CommonUtil.isTabbable(n)&&++m,m<2&&!l.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var p=new r.DOMWalker(n);m<2&&p.nextNode()&&p.node!=n;)1==p.node.nodeType&&!p.bEndTag&&o.CommonUtil.isTabbable(p.node)&&++m;var h=m<2;return h||u.CacheUtil.setCache(n,"widget_tabbable_single","potential_multiple_tabbable"),h?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_multiple_tabbable",[c])}}}},6160(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.a11yRulesets=void 0;var l=r(i(8855)),o=i(8601),s=[];for(var u in l)s.push(l[u]);var d={"1.1.1":"All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.","1.2.1":"For prerecorded audio-only or video-only media, an alternative provides equivalent information.","1.2.2":"Captions are provided for all prerecorded audio content in synchronized media.","1.2.3":"An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.","1.2.4":"Captions are provided for all live audio content in synchronized media.","1.2.5":"Audio description is provided for all prerecorded video content in synchronized media.","1.3.1":"Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.","1.3.2":"When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.","1.3.3":"Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.","1.3.4":"Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.","1.3.5":"The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.","1.4.1":"Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.","1.4.2":"If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.","1.4.3":"The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.","1.4.4":"Text can be resized without assistive technology up to 200 percent without loss of content or functionality.","1.4.5":"If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.","1.4.10":"Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.","1.4.11":"The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.","1.4.12":"No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.","1.4.13":"Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.","2.1.1":"All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.","2.1.2":"If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.","2.1.4":"If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.","2.2.1":"For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.","2.2.2":"For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.","2.3.1":"Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.","2.4.1":"A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.","2.4.2":"Web pages, non-web documents, and software have titles that describe topic or purpose.","2.4.3":"If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.","2.4.4":"The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.","2.4.5":"More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.","2.4.6":"Headings and labels describe topic or purpose.","2.4.7":"Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.","2.4.11":"When an element receives focus, it is not entirely covered by other content.","2.5.1":"All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.","2.5.2":"For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.","2.5.3":"For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.","2.5.4":"Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.","2.5.8":"The size of the target for pointer inputs is at least 24 by 24 CSS pixels.","2.5.7":"All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.","3.1.1":"The default human language of Web pages, non-Web documents, or software can be programmatically determined.","3.1.2":"The human language of each passage or phrase in the content can be programmatically determined.","3.2.1":"When any component receives focus, it does not initiate a change of context.","3.2.2":"Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.","3.2.3":"Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.","3.2.4":"Components that have the same functionality within a set of Web pages are identified consistently.","3.2.6":"Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.","3.3.1":"If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.","3.3.2":"Labels or instructions are provided when content requires user input.","3.3.3":"If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.","3.3.4":"For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.","3.3.7":"Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.","3.3.8":"Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.","4.1.1":"(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.","4.1.2":"For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.","4.1.3":"In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",HTML:"The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.",ARIA:"The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported."};t.a11yRulesets=[{id:"EXTENSIONS",name:"Extension Rules",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for enabling the browser extensions",type:o.eGuidelineType.EXTENSION,checkpoints:[{num:"1",name:"Extension CP 1",wcagLevel:"A",summary:"Rules for Extension"}]},{id:"IBM_Accessibility",name:"IBM Accessibility 7.3",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"IBM_Accessibility_next",name:"IBM Accessibility next",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_2",name:"WCAG 2.2 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_1",name:"WCAG 2.1 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_0",name:"WCAG 2.0 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.",checkpoints:s.filter(function(e){return("A"===e.level||"AA"===e.level)&&"2.0"===e.wcagType}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})}]},5233(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRController=void 0;var a=i(8195),n=i(7014),r=i(248),l=i(4566),o=i(2165),s=i(3946),u=i(1686),d=function(){function e(e){void 0===e&&(e=document.body),this.rootElement=e,this.liveListeners=[],this.ctrlDoc=e.ownerDocument,this.setPointOfRegard(e),this.setupMutationTracking(),console.info('[WARNING] The SRController is a new feature that is not yet "stable". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback.')}return e.getController=function(t){return void 0===t&&(t=document),this.singleton||(this.singleton=new e(t.body)),this.singleton},e.prototype.disconnect=function(){this.mutationObserver&&this.mutationObserver.disconnect()},e.prototype.findAllShadowRoots=function(e){void 0===e&&(e=document);for(var t,i=[],a=this.ctrlDoc.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,null);t=a.nextNode();){var n=t;if(n.shadowRoot){i.push(n.shadowRoot);var r=this.findAllShadowRoots(n.shadowRoot);i.push.apply(i,r)}}return i},e.prototype.setupMutationTracking=function(){var e=this;this.mutationObserver&&this.mutationObserver.disconnect();var t=this,i=new MutationObserver(function(r){for(var l=t.pointOfRegard.getNode(),o=function(e){e.removedNodes.forEach(function(t){(t.isSameNode(l)||t.contains(l))&&(console.info("Adjusting PoR due to DOM mutation removing PoR"),l=e.target)})},u=0,d=r.filter(function(e){var t;return(null===(t=e.removedNodes)||void 0===t?void 0:t.length)>0});u<d.length;u++)o(d[u]);e.setPointOfRegard(l);for(var c=function(t){t.addedNodes&&t.addedNodes.forEach(function(t){for(var a=0,n=e.findAllShadowRoots(t);a<n.length;a++){var r=n[a];i.observe(r,{childList:!0,subtree:!0,characterData:!0})}});var r=t.target,l=1===r.nodeType?r:r.parentElement;if(l&&!l.closest('[aria-busy="true"]')&&"true"!==l.getAttribute("aria-busy")){var o=(["polite","assertive"].includes(l.getAttribute("aria-live"))||"OUTPUT"===l.nodeName.toUpperCase()||["status","log","progressbar","alert","timer"].includes(l.getAttribute("role")))&&l||l.closest('[aria-live="polite"],[aria-live="assertive"],output,[role="status"],[role="log"],[role="progressbar"],[role="alert"],[role="timer"]'),u=!1,d=["additions","text"];if(o){var c=l.closest("[aria-relevant]");c&&(d=c.getAttribute("aria-relevant").split(/ +/g)),"log"===o.getAttribute("role")&&(d=["additions"]),o.hasAttribute("aria-relevant")&&(d=o.getAttribute("aria-relevant").split(/ +/g)),d.includes("all")&&(d=["additions","removals","text"]),u=3===t.target.nodeType&&d.includes("text")||t.addedNodes.length>0&&d.includes("additions")||t.removedNodes.length>0&&d.includes("removals")}if(o&&u){var m="true"===o.getAttribute("aria-atomic")||["alert","status","timer","marquee"].includes(o.getAttribute("role"));if(m||"characterData"!==t.type||3!==t.target.nodeType||s.VisUtil.isNodeHiddenFromAT(t.target.parentElement)){var p=m?o:t.target;p.liveAnnounce&&clearTimeout(p.liveAnnounce),p.liveAnnounce=setTimeout(function(){var i=[],r=d.includes("removals")&&t.removedNodes.length>0;if(m||r){var l=new a.SRCursor(p,!1),o=new a.SRCursor(p,!0);o.next(function(){return!0}),i.push((r?"[removed] ":"")+n.SRRenderer.renderRange("item",l,o))}else d.includes("additions")&&t.addedNodes.length>0&&t.addedNodes.forEach(function(e){var t=new a.SRCursor(e,!1),r=new a.SRCursor(e,!0);r.next(function(){return!0}),i.push(n.SRRenderer.renderRange("item",t,r))});for(var s=0,u=e.liveListeners;s<u.length;s++)(0,u[s])(i.join("\n"))},100)}else for(var h=0,g=e.liveListeners;h<g.length;h++)(0,g[h])(t.target.nodeValue)}}},m=0,p=r;m<p.length;m++)c(p[m])}),r=this.findAllShadowRoots(this.ctrlDoc.documentElement);r.push(this.ctrlDoc.documentElement);for(var l=0,o=r;l<o.length;l++){var u=o[l];i.observe(u,{childList:!0,subtree:!0,characterData:!0})}},e.prototype.addLiveListener=function(e){this.liveListeners.push(e)},e.prototype.removeLiveListener=function(e){this.liveListeners=this.liveListeners.filter(function(t){return t!==e})},e.prototype.getPointOfRegard=function(){return this.pointOfRegard},e.prototype.setPointOfRegard=function(t){var i;try{this.pointOfRegard=new a.SRCursor(t);var r=e.diffContainers("focus",this.pointOfRegard),l=this.pointOfRegard.getRole(),o=null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name;return{success:!0,renderingResult:n.SRRenderer.renderCurrent("focus",this.pointOfRegard,r),role:l,name:o}}catch(e){return{success:!1,renderingResult:{start:this.pointOfRegard.clone(),end:this.pointOfRegard.clone(),message:"Failed to set point of regard: ".concat(e.message)}}}},e.prototype.jumpNext=function(t){var i;l.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=r.SRNavigator.jumpNext(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||r.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No next ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}finally{console.groupEnd()}},e.prototype.jumpPrevious=function(t){var i;l.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=r.SRNavigator.jumpPrevious(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||r.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No previous ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}},e.hostIframe=function(e){var t=e.ownerDocument;if(!t||t===document)return null;try{return u.DOMUtil.getAncestor(e,["iframe"])}catch(e){return null}},e.diffContainers=function(t,i,r){var l,o,s=[],u=[];try{if((null!==(l=null==i?void 0:i.getNode().ownerDocument)&&void 0!==l?l:document)!==(null!==(o=null==r?void 0:r.getNode().ownerDocument)&&void 0!==o?o:document)){var d=e.hostIframe(i.getNode()),c=e.hostIframe(null==r?void 0:r.getNode());if(d&&!c){var m=new a.SRCursor(d,!1);(g=n.SRRenderer.renderEnter(t,m,r))&&g.trim()&&u.push(g.trim())}else if(!d&&c)m=new a.SRCursor(c,!0),(p=n.SRRenderer.renderLeave(t,m,r))&&p.trim()&&s.push(p.trim());else if(d&&c&&d!==c){var p,h=new a.SRCursor(c,!0);(p=n.SRRenderer.renderLeave(t,h,r))&&p.trim()&&s.push(p.trim());var g,b=new a.SRCursor(d,!1);(g=n.SRRenderer.renderEnter(t,b,r))&&g.trim()&&u.push(g.trim())}return{leaving:s,entering:u}}var _=i?i.getNode().ownerDocument.body||i.getNode().ownerDocument.documentElement:r?r.getNode().ownerDocument.body||r.getNode().ownerDocument.documentElement:document.body||document.documentElement,f=i?i.clone():new a.SRCursor(_),v=r?r.clone():new a.SRCursor(_);if(!f.getNode().isSameNode(v.getNode())){var A=e.commonParent(f,v);if(A){for(;A.contains(f);)u.push(n.SRRenderer.renderEnter(t,f,v)),f.parent();for(u.reverse(),u=u.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()});A.contains(v);)s.push(n.SRRenderer.renderLeave(t,v,v)),v.parent();s=s.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()})}}}catch(e){console.error(e)}return{leaving:s,entering:u}},e.commonParent=function(e,t){if(e.contains(t))return e.clone();if(t.contains(e))return t.clone();for(var i=e.clone();!i.contains(t)&&i.parent(););return i.contains(e)&&i.contains(t)?i:null},e.renderAll=function(t){var i=e.getController();i.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&i.setPointOfRegard(e)});var a=[],r=n.SRRenderer.renderCurrent(t,i.getPointOfRegard(),{entering:[],leaving:[]});r&&a.push(r.message);for(var l=!0;l;){var s=i.jumpNext(t);s.success?a.push(s.renderingResult.message):l=!1}return a},e.renderAllDetail=function(t,i){var a=e.getController(t);a.setPointOfRegard(t.body),t.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&a.setPointOfRegard(e)});var r=[],l=n.SRRenderer.renderCurrent(i,a.getPointOfRegard(),{entering:[],leaving:[]});l&&r.push(l);for(var s=!0;s;){var u=a.jumpNext(i);u.success?r.push(u.renderingResult):s=!1}return r},e.renderStructure=function(t){for(var i,n,r=["region","heading","item","tab_focus","image"],l=r.map(function(i){return e.renderAllDetail(t,i)}),s=[],u=function(){var e=null===(i=l[0][0])||void 0===i?void 0:i.start;r.forEach(function(t,i){l[i].length>0&&(!e||a.SRCursor.compare(l[i][0].start,e)<0)&&(e=l[i][0].start)});var u={},d=!1;if(r.forEach(function(t,i){u[t]="",l[i].length>0&&0===a.SRCursor.compare(l[i][0].start,e)&&(u[t]=l[i].shift().message,d=""!==u[t])}),d){var c=e.getElement(),m=c&&o.SRUtil.getUniqueSelector(c),p=null!==(n=null==c?void 0:c.ownerDocument)&&void 0!==n?n:t;m&&p.querySelector(m)&&(u.selector=m),s.push(u)}};l.some(function(e){return e.length>0});)u();return s},e}();t.SRController=d},8195(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRCursor=void 0;var a=i(3864),n=i(1950),r=i(7011),l=i(7139),o=i(2165),s=function(){function e(e,t){this.walker=new a.DOMWalker(e,t,void 0,!1),e&&this.refreshName()}return e.prototype.clone=function(){var t=new e(this.walker.node,this.walker.bEndTag);return t.role=this.role,t.name=this.name,t.preLineIndex=this.preLineIndex,t},e.prototype.refreshName=function(){1===this.walker.node.nodeType?(this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0)},e.prototype.next=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},l=n.skipCurrent,s=n.skipChildren;do{if(s&&!this.walker.bEndTag)this.walker.bEndTag=!0;else if(!this.walker.nextNode())break;if(this.refreshName(),l=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&this.isEndTag())break;l||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.previous=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},l=n.skipCurrent,s=n.skipChildren;do{if(s&&this.walker.bEndTag)this.walker.bEndTag=!1;else if(!this.walker.prevNode())break;if(this.refreshName(),l=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&!this.isEndTag())break;l||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.parent=function(e){return!!this.walker.node.parentNode&&(this.walker.node=this.walker.node.parentNode,this.walker.bEndTag=!0===e,1===this.walker.node.nodeType?(this.role=r.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0),!0)},e.prototype.getCurrentOrParentByRole=function(e,t){for(var i=this,a=t?t.map(function(e){return e.toUpperCase()}):[],n=function(t){var n=t.getElement();return e.includes(i.getRole())||n&&!n.hasAttribute("role")&&a.includes(n.nodeName.toUpperCase())};!n(this)&&this.parent(););return n(this)},e.prototype.getCurrentOrParentByRoleClone=function(e,t){var i=this.clone();return i.getCurrentOrParentByRole(e,t)?i:null},e.prototype.getCurrentOrParentTabbableClone=function(){for(var e=this.clone();e;){var t=e.getElement();if(e.isStartTag()&&t&&l.CommonUtil.isTabbable(t))return e;if(!e.parent(!1))break}return null},e.prototype.getRole=function(){return this.role},e.prototype.getNameInfo=function(){return this.name},e.prototype.getName=function(){var e=this.getNameInfo();if(e&&e.name)return e.name;var t=this.getElement();if(t){var i=l.CommonUtil.getLabelForElementHidden(t,!0);if(i)return i.innerText||i.textContent}},e.prototype.setEndTag=function(e){this.walker.bEndTag=e},e.prototype.getNode=function(){return this.walker.node},e.prototype.getElement=function(){if(this.walker.node&&1===this.walker.node.nodeType)return this.walker.node},e.prototype.getParentElement=function(){if(!this.walker.node)return null;var e=this.clone();return e.walker.node=a.DOMWalker.parentElement(e.walker.node),e},e.prototype.isEndTag=function(){return this.walker.bEndTag},e.prototype.isStartTag=function(){return!this.walker.bEndTag},e.compare=function(e,t){var i,n,r=null===(i=null==e?void 0:e.walker)||void 0===i?void 0:i.node,l=null===(n=null==t?void 0:t.walker)||void 0===n?void 0:n.node;if(!r&&!l)return 0;if(!r)return 1;if(!l)return-1;if(r===l&&!e.walker.bEndTag&&!t.walker.bEndTag){var o=void 0===e.preLineIndex,s=void 0===t.preLineIndex;if(!o||!s){if(o)return-1;if(s)return 1;if(e.preLineIndex!==t.preLineIndex)return e.preLineIndex<t.preLineIndex?-1:1}}var u=r.compareDocumentPosition(l);if(1&u){for(var d=[r],c=[l],m=r;m=a.DOMWalker.parentNode(m);)d.push(m);for(m=l;m=a.DOMWalker.parentNode(m);)c.push(m);d.reverse(),c.reverse();for(var p=0;p<d.length&&p<c.length&&d[p]===c[p];)p++;if(p===d.length)return e.walker.bEndTag?1:-1;if(p===c.length)return t.walker.bEndTag?-1:1;if(p>0){var h=d[p],g=c[p],b=h.compareDocumentPosition(g);if(2&b)return 1;if(4&b)return-1}return 0}return 8&u?t.walker.bEndTag?-1:1:16&u?e.walker.bEndTag?1:-1:2&u?1:4&u?-1:0},e.prototype.contains=function(e){return this.getNode().contains(e.getNode())&&!this.isSameNode(e)},e.prototype.isSameNode=function(e){return!!e&&this.getNode().isSameNode(e.getNode())},e.prototype.hasNonEmptyName=function(){var e;return((null===(e=this.getNameInfo())||void 0===e?void 0:e.name)||"").trim().length>0},e}();t.SRCursor=s},248(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRNavigator=void 0;var a=i(3864),n=i(1950),r=i(8195),l=i(7139),o=i(3946),s=i(7011);!function(e){function t(e){var i;if(1!==e.nodeType)return!1;if(["br","iframe"].includes(e.nodeName.toLowerCase()))return!0;var n=e,r=n.ownerDocument.defaultView,l=null===(i=r.getComputedStyle(n))||void 0===i?void 0:i.display;if(l&&l.startsWith("table"))return!0;if("block"===l&&"block"!==n.style.display&&n.parentElement&&"flex"===r.getComputedStyle(n.parentElement).display)return!1;if("link"===s.AriaUtil.getResolvedRole(n,!0)){var o=new a.DOMWalker(e,!1,void 0,!1);if(o.prevNode(),!t(o.node))return!0}return["block","flex","grid","list-item"].includes(l)}function i(e){for(var t,i=(null!==(t=e.textContent)&&void 0!==t?t:"").split("\n"),a=0;a<i.length&&""===i[a].trim();)a++;for(var n=i.length-1;n>=a&&""===i[n].trim();)n--;return i.slice(a,n+1)}function u(e){return 1===e.nodeType&&"PRE"===e.nodeName.toUpperCase()}function d(e){if(!e||1!==e.nodeType)return null;var t=e;if(!t.hasAttribute("tabindex"))return null;var i=parseInt(t.getAttribute("tabindex"),10);return Number.isNaN(i)?null:i}function c(e){if(!e||1!==e.nodeType)return!1;var t=e,i=d(t);return(null===i||0===i)&&l.CommonUtil.isTabbable(t)}function m(e){return void 0===e&&(e=!0),function(t,i,a){return!!(a&&1===a.nodeType&&i&&l.CommonUtil.isTabbable(a))&&(e||c(a))}}function p(e,t){var i=((null==t?void 0:t.ownerDocument)||document).body||t;if(!i)return[];var a=new r.SRCursor(i,!1),n=f("tab_focus"),o=[],s=[],u=function(t){e(t.getRole(),!t.isEndTag(),t.getNode())&&(function(e){if(!e||1!==e.nodeType)return!1;var t=e,i=d(t);return null!==i&&i>0&&l.CommonUtil.isTabbable(t)}(t.getNode())?o.push(t.clone()):c(t.getNode())&&s.push(t.clone()))};for(u(a);a.next(function(){return!0},n);)u(a);return o.sort(function(e,t){var i=e.getElement(),a=t.getElement(),n=d(i)||0,l=d(a)||0;return n!==l?l-n:r.SRCursor.compare(e,t)}),o.concat(s)}function h(e,t){return e.findIndex(function(e){return 0===r.SRCursor.compare(e,t)})}function g(e){switch(e){case"link":return function(e,t){return t&&"link"===e};case"tab_focus":return m(!1);case"heading":return function(e,t){return t&&"heading"===e};case"h1":return function(e,t,i){return t&&"heading"===e&&"1"===i.ariaLevel};case"h2":return function(e,t,i){return t&&"heading"===e&&"2"===i.ariaLevel};case"h3":return function(e,t,i){return t&&"heading"===e&&"3"===i.ariaLevel};case"h4":return function(e,t,i){return t&&"heading"===e&&"4"===i.ariaLevel};case"h5":return function(e,t,i){return t&&"heading"===e&&"5"===i.ariaLevel};case"h6":return function(e,t,i){return t&&"heading"===e&&"6"===i.ariaLevel};case"image":return function(e,t){return t&&["img","graphics-document"].includes(e)};case"radio":return function(e,t){return t&&"radio"===e};case"button":return function(e,t){return t&&"button"===e};case"checkbox":return function(e,t){return t&&"checkbox"===e};case"combo":return function(e,t){return t&&"combobox"===e};case"list":return function(e,t){return t&&"list"===e};case"listitem":return function(e,t){return t&&"listitem"===e};case"article":return function(e,t){return t&&"article"===e};case"table":return function(e,t){return t&&"table"===e};case"paragraph":return function(e,t,i){return t&&"P"===i.nodeName.toUpperCase()};case"dom":return function(){return!0};case"item":return function(e,i,n){if(!i)return!1;if(1===n.nodeType&&"IFRAME"===n.nodeName.toUpperCase())return!1;if(u(n))return!0;if(t(n))return!0;var r=new a.DOMWalker(n,!i);return!(!r.prevNode()||!r.bEndTag)&&t(r.node)};case"region":return function(e,t,i){var a,r;return!!t&&(!!["main","navigation","form","banner","search","contentinfo"].includes(e)||"region"===e&&1===(null==i?void 0:i.nodeType)&&!!(null===(r=null===(a=n.AccNameUtil.computeAccessibleName(i))||void 0===a?void 0:a.name)||void 0===r?void 0:r.trim()))};case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}e.getPreLines=i,e.getStartFunc=g;var b=function(e){var t;try{var i=e.getNode().nodeType,n=e.getElement(),r=e.clone();if(r.setEndTag(!1),[4,8].includes(i))return{skipCurrent:!0,skipChildren:!0};if(![1,3].includes(i))return{skipCurrent:!0,skipChildren:!1};if(3===i&&!(n=e.getNode().parentElement))return o.VisUtil.isNodeHiddenFromAT(n)?{skipCurrent:!0,skipChildren:!1}:null;if(!(n.closest("body")||(t=n,t.getRootNode()instanceof ShadowRoot)))return{skipCurrent:!0,skipChildren:!1};if(n.closest("script,style"))return{skipCurrent:!0,skipChildren:!0};var l=r.getCurrentOrParentByRoleClone(["heading","link"]),u=s.AriaUtil.getResolvedRole(n),d="heading"===u||"link"===u;if(l){l.getElement();var c=l.getNameInfo();if(c&&!["content","text"].includes(c.nameFrom)){if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:!0}}else if(d);else{var m=s.AriaUtil.getResolvedRole(n);if(("img"===m||"graphics-document"===m)&&o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0}}}else{if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:1===i};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:1===i}}if("BODY"===n.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!1};if("LABEL"===n.nodeName.toUpperCase()){if(n.hasAttribute("for")&&document.getElementById(n.getAttribute("for"))&&"hidden"!==document.getElementById(n.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var p=n.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']");if(p&&"hidden"!==p.getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};if((b=n.getAttribute("id"))&&document.querySelector('[aria-labelledby~="'.concat(b,'"]')))return{skipCurrent:!0,skipChildren:!1}}var h=n.closest("label[for]"),g=h&&h.getAttribute("for");if(h&&g&&document.getElementById(g)&&"hidden"!==document.getElementById(g).getAttribute("type")&&!n.closest("a[href], [role='link'], button, [role='button']"))return{skipCurrent:!0,skipChildren:1===i};var b,_=r.getRole();if("combobox"===_&&"SELECT"!==n.nodeName.toUpperCase()&&"INPUT"!==n.nodeName.toUpperCase()&&!e.isEndTag())return{skipCurrent:!1,skipChildren:!0};if(s.AriaUtil.containsPresentationalChildrenOnly(n))return{skipCurrent:!1,skipChildren:!0};if(["link","heading"].includes(_)&&(!r.getName()||!["content","text"].includes(r.getNameInfo().nameFrom))&&!(l&&l.getNameInfo()&&["content","text"].includes(l.getNameInfo().nameFrom)))return{skipCurrent:!1,skipChildren:!0};if("LEGEND"===n.nodeName.toUpperCase())for(var f=a.DOMWalker.parentElement(e.getNode());f;){if("FIELDSET"===f.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0};f=a.DOMWalker.parentElement(f)}if(n&&"MSUP"===n.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0};if(!e.isEndTag()&&"SUMMARY"===n.nodeName.toUpperCase()){var v=n.parentElement;if(v&&"DETAILS"===v.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0}}if(!e.isEndTag()&&"DETAILS"!==n.nodeName.toUpperCase()&&!n.closest("summary")){var A=n.closest("details");if(A&&!A.hasAttribute("open"))return{skipCurrent:!0,skipChildren:!0}}if(n.closest(".ibma-sr-overlay"))return{skipCurrent:!0,skipChildren:!0};if(1===i&&!e.isEndTag()&&(b=n.getAttribute("id"))){var w=document.querySelector('[aria-controls~="'.concat(b,'"]'));if(w&&"combobox"===s.AriaUtil.getResolvedRole(w))return{skipCurrent:!0,skipChildren:!0}}return null}finally{}},_=function(e){var t=e.getNode().nodeType,i=e.getElement();if(1!==t&&3!==t)return{skipCurrent:!0,skipChildren:!1};if(3===t)return o.VisUtil.isNodeHiddenFromAT(i)?{skipCurrent:!0,skipChildren:!1}:null;if(o.VisUtil.isNodeHiddenFromAT(i))return{skipCurrent:!0,skipChildren:!0};if("IFRAME"===i.nodeName.toUpperCase()&&!e.isEndTag())return{skipCurrent:!1,skipChildren:!0};if("LABEL"===i.nodeName.toUpperCase()&&i.hasAttribute("for")&&document.getElementById(i.getAttribute("for"))&&"hidden"!==document.getElementById(i.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var a=i.closest("label[for]"),n=a&&a.getAttribute("for");return a&&n&&document.getElementById(n)&&"hidden"!==document.getElementById(n).getAttribute("type")&&!i.closest("a[href], [role='link'], button, [role='button']")?{skipCurrent:!0,skipChildren:1===t}:(e.getRole(),s.AriaUtil.containsPresentationalChildrenOnly(i)?{skipCurrent:!1,skipChildren:!0}:i&&"MSUP"===i.nodeName.toUpperCase()||i.closest(".ibma-sr-overlay")?{skipCurrent:!0,skipChildren:!0}:null)};function f(e){switch(e){case"region":case"item":return b;case"link":case"tab_focus":case"heading":case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":case"image":return _;case"radio":case"button":case"checkbox":case"combo":case"list":case"listitem":case"article":case"table":case"paragraph":case"dom":case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}function v(e,t){try{if("tab_focus"===e){var a=p(m(!0),t.getNode());if(a.length>0){var n=t.getCurrentOrParentTabbableClone(),r=n&&h(a,n)>=0?n:t.clone(),l=h(a,r);return l>=0?l+1<a.length?a[l+1].clone():null:a[0].clone()}}if("item"===e&&u(t.getNode())&&!t.isEndTag()){var o=i(t.getNode());if(void 0!==t.preLineIndex){var s=t.preLineIndex;if(s+1<o.length){var d=t.clone();return d.preLineIndex=s+1,d}var c=t.clone();c.setEndTag(!0);var b=g(e),_=f(e);return c.next(b,_)?(u(c.getNode())&&!c.isEndTag()&&(c.preLineIndex=void 0),c):null}if(o.length>0){var v=t.clone();return v.preLineIndex=0,v}}var A=t.clone(),w=g(e),y=f(e);return A.next(w,y)?("item"===e&&u(A.getNode())&&!A.isEndTag()&&(A.preLineIndex=void 0),A):null}finally{console.groupEnd()}}function A(e,t){if("tab_focus"===e){var a=t.clone(),n=g(e),r=f(e);if(a.previous(n,r))return a;var l=p(m(!0),t.getNode());if(l.length>0){var o=t.getCurrentOrParentTabbableClone(),s=o&&h(l,o)>=0?o:t.clone(),d=h(l,s);if(d>0)return l[d-1].clone()}return null}if("item"===e&&u(t.getNode())&&!t.isEndTag()&&void 0!==t.preLineIndex){if(0===t.preLineIndex){var c=t.clone();return c.preLineIndex=void 0,c}var b=t.clone();return b.preLineIndex=t.preLineIndex-1,b}var _=t.clone(),v=g(e),A=f(e);if(_.previous(v,A)){if("item"===e&&u(_.getNode())&&!_.isEndTag()){var w=i(_.getNode());_.preLineIndex=w.length>0?w.length-1:void 0}return _}return null}e.getSkipFunc=f,e.jumpCurrent=function(e,t){return("tab_focus"===e?m(!0):g(e))(t.getRole(),!t.isEndTag(),t.getNode())?t.clone():A(e,t)},e.jumpCurrentEnd=function(e,t){if("item"===e){if(u(t.getNode())&&!t.isEndTag()){i(t.getNode());var a=void 0===t.preLineIndex?0:t.preLineIndex+1,n=t.clone();return n.preLineIndex=a,[n]}return(d=v(e,t))?[d]:[]}var l=t.getNameInfo(),o=t.clone();l&&!["content","text"].includes(l.nameFrom)||o.setEndTag(!0),o.next(function(){return!0});for(var s=[],d=v("item",t);d&&r.SRCursor.compare(d,o)<0;)s.push(d),d=v("item",d);return s.push(o),"tab_focus"===e&&"link"===t.getRole()?[s[s.length-1]]:s},e.jumpNext=v,e.jumpPrevious=A}(t.SRNavigator||(t.SRNavigator={}))},7014(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRenderer=void 0;var a,n=i(7011),r=i(248),l=i(8195),o=i(2151),s=i(7242);(a=t.SRRenderer||(t.SRRenderer={})).renderEnter=function(e,t,i){for(var a=0,n=o.CONTAINER_ENTER_RULES;a<n.length;a++){var r=n[a].test(e,t,i);if(null!=r)return r}return null},a.renderLeave=function(e,t,i){for(var a=0,n=o.CONTAINER_EXIT_RULES;a<n.length;a++){var r=n[a].test(e,t,i);if(null!=r)return r}return null},a.renderCurrent=function(e,t,i){var n=r.SRNavigator.jumpCurrent(e,t);if(!n)return null;var l=r.SRNavigator.jumpCurrentEnd(e,n);l&&0!==l.length||(l=[null]);for(var o=l[l.length-1],s="",u=0,d=l;u<d.length;u++){var c=d[u],m=a.renderRange(e,n,c);if(m.trim().length>0){o=c,s=m;break}}return""===s&&(s=a.renderRange(e,n,o)),{start:n,end:o,message:(i.leaving||[]).concat(i.entering||[]).concat([s]).join(" ").replace(/\s+/g," ")}},a.renderRange=function(e,t,i){for(var a,u=t.clone(),d=[],c=!0,m=null;c;){var p=u.getElement(),h=u.getNode(),g=h.nodeType,b=n.AriaUtil.getAncestorWithRole(h,"link",!0);b&&!["content","text"].includes(null===(a=new l.SRCursor(b).getNameInfo())||void 0===a?void 0:a.nameFrom)&&(b=null);for(var _=0,f=o.SR_RULES;_<f.length;_++){var v=f[_].test(e,u);if(null!=v&&v.trim().length>0){1!==g||u.isEndTag()||"menu"!==p.getAttribute("aria-haspopup")||(v="[subMenu] "+v),"tab_focus"===e?m&&(!b||b&&m!==b)&&(v="".concat(v," ").concat((0,s.getLinkAnnouncement)(new l.SRCursor(m,!1)))):!b||m&&m===b||(v="".concat((0,s.getLinkAnnouncement)(new l.SRCursor(b,!1))," ").concat(v)),""!==v&&(m=b,d.push(v));break}}d.push([].filter(function(e){return e.trim().length>0}).join(" ")),c=u.next(function(){return!0},r.SRNavigator.getSkipFunc(e))&&l.SRCursor.compare(u,i)<0}"tab_focus"===e&&m&&d.push("".concat((0,s.getLinkAnnouncement)(new l.SRCursor(m,!1))));var A=d.filter(function(e){return e.trim().length>0}).join(" ");return A=(A=A.replace(/, \u0001([^\u0002]+)\u0002/g,function(e,t){var i='"'.concat(t,'"'),a=A.replace(e,"");return a.includes(i)||a.includes(t)?"":", ".concat(i)})).replace(/[\u0001\u0002]/g,"")}},328(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRendererRule=void 0;var i=function(){function e(e){this.ruleDefinition=e}return e.prototype.test=function(e,t,i){if(this.ruleDefinition.modes.includes(e)&&(this.ruleDefinition.roles.includes(t.getRole())||this.ruleDefinition.elems.includes(t.getNode().nodeName.toUpperCase())))for(var a=0,n=this.ruleDefinition.tests;a<n.length;a++){var r=(0,n[a])(t,i,e);if("string"==typeof r)return r}return null},e}();t.SRRendererRule=i},369(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRTableUtil=void 0;var a=i(8195);!function(e){function t(e){return!!e.getElement()&&(!!["cell","rowheader","columnheader"].includes(e.getRole())||!e.getElement().hasAttribute("role")&&["TH","TD"].includes(e.getElement().nodeName.toUpperCase()))}function i(e){return e.getCurrentOrParentByRoleClone(["cell","rowheader","columnheader"],["TD","TH"])}function n(e){if(!t(e))return 0;var i=e.getElement().getAttribute("colspan");return i?parseInt(i):1}function r(e){if(!t(e))return 0;var i=e.getElement().getAttribute("rowspan");return i?parseInt(i):1}function l(e){var i=e.getCurrentOrParentByRoleClone(["table"]);if(!i)return null;for(var a,l=i.clone(),o=[],s=[];l.next(function(){return!0})&&!l.getNode().isSameNode(i.getNode());){if(l.isEndTag()&&"row"===l.getRole())for(o.push(s),a=s,s=[];a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length]);if(!l.isEndTag()&&t(l)){for(var u=n(l),d={rowIndexStart:o.length,colIndexStart:s.length,rowspan:r(l),colspan:u,cellCursor:l.clone()},c=0;c<u;++c)s.push(d);for(;a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length])}}return o}function o(e,t){var a=i(e);t||(t=l(e));for(var n=0;n<t.length;++n)for(var r=0;r<t[n].length;++r)if(t[n][r].cellCursor.isSameNode(a))return t[n][r];return null}function s(e,t){return t>=e.colIndexStart&&t<e.colIndexStart+e.colspan}function u(e,t){return t>=e.rowIndexStart&&t<e.rowIndexStart+e.rowspan}function d(e){var t=e.getElement();return!!t&&("cell"===e.getRole()||!t.hasAttribute("role")&&"TD"===t.nodeName.toUpperCase())}e.isCursorCellRole=t,e.getCurrentOrParentCellCursor=i,e.getColSpan=n,e.getRowSpan=r,e.getTableModel=l,e.getCellModel=o,e.cellModelContainsColumn=s,e.cellModelContainsRow=u,e.getRowHeaders=function(e){return""},e.getColumnHeadersForCursor=function(t,i){if(!i&&!(i=l(t)))return"";var n=o(t,i);if(!n)return"";var r=n.cellCursor;if(!r)return"";var u=r.getElement();if(!u)return"";for(var c=[],m=n.colIndexStart;m<n.colIndexStart+n.colspan;++m)c.push({potentialColHeaders:[],existsDataCell:!1,colIdx:m});var p=[];if(u.hasAttribute("headers"))p=u.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return s(e.getCellModel(t,i),a.colIdx)})});else{for(var h=0;h<i.length;++h)for(var g=function(e){var t=e.colIdx,a=i[h][t],n=a.cellCursor,l=n.getElement();if(!a||!n||n.isSameNode(r)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0),"continue";var o=n.clone();"columnheader"===n.getRole()?(p.push(o),e.potentialColHeaders.push(o)):l.hasAttribute("role")||"TH"!==l.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0):("col"===l.getAttribute("scope")||"axis"===l.getAttribute("scope")||!l.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialColHeaders.push(o))},b=0,_=c;b<_.length;b++)g(A=_[b]);for(var f=0,v=c;f<v.length;f++){var A;(A=v[f]).existsDataCell||(A.potentialColHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialColHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.getRowHeadersForCursor=function(t,i){if(!i&&!(i=l(t)))return"";var n=o(t,i);if(!n)return"";var r=n.cellCursor;if(!r)return"";var s=r.getElement();if(!s)return"";for(var c=[],m=n.rowIndexStart;m<n.rowIndexStart+n.rowspan;++m)c.push({potentialRowHeaders:[],existsDataCell:!1,rowIdx:m});var p=[];if(s.hasAttribute("headers"))p=s.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return u(e.getCellModel(t,i),a.rowIdx)})});else{for(var h=c.reduce(function(e,t){return Math.max(e,i[t.rowIdx].length)},0),g=0;g<h;++g)for(var b=function(e){var t=e.rowIdx;if(g>=i[t].length)return"continue";var a=i[t][g],n=a.cellCursor,l=n.getElement();if(!a||!n||n.isSameNode(r)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0),"continue";var o=n.clone();"rowheader"===n.getRole()?(p.push(o),e.potentialRowHeaders.push(o)):l.hasAttribute("role")||"TH"!==l.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0):("row"===l.getAttribute("scope")||"axis"===l.getAttribute("scope")||!l.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialRowHeaders.push(o))},_=0,f=c;_<f.length;_++)b(w=f[_]);for(var v=0,A=c;v<A.length;v++){var w;(w=A[v]).existsDataCell||(w.potentialRowHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialRowHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.isDataCell=d}(t.SRTableUtil||(t.SRTableUtil={}))},2165(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRUtil=void 0;var a,n=i(7011),r=i(3946);(a=t.SRUtil||(t.SRUtil={})).isModalDialogElement=function(e){if(1!==e.nodeType)return!1;var t=e;return"dialog"===n.AriaUtil.getResolvedRole(t,!0)&&"true"===t.getAttribute("aria-modal")&&r.VisUtil.isNodeVisible(e)},a.getUniqueSelector=function e(t,i){if(void 0===i&&(i=!1),t.id)return"#".concat(CSS.escape(t.id));if(t.isSameNode(document.documentElement)||t.isSameNode(document.body))return t.tagName.toLowerCase();var a=t.tagName.toLowerCase();if(t.classList.length&&!i&&(a+=Array.from(t.classList).slice(0,3).map(function(e){return".".concat(CSS.escape(e))}).join("")),!i){if(t.hasAttribute("role")&&(a+='[role="'.concat(CSS.escape(t.getAttribute("role")||""),'"]')),t.hasAttribute("aria-label")){var n=t.getAttribute("aria-label")||"";n.length<=20&&(a+='[aria-label="'.concat(CSS.escape(n),'"]'))}"input"===t.tagName.toLowerCase()&&t.hasAttribute("type")&&(a+='[type="'.concat(CSS.escape(t.getAttribute("type")||""),'"]'))}if(t.parentElement){var r=Array.from(t.parentElement.children).filter(function(e){return e.tagName===t.tagName});if(r.length>1){var l=r.indexOf(t)+1;a+=":nth-of-type(".concat(l,")")}return"".concat(e(t.parentElement,!0)," > ").concat(a)}return a}},8107(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRViewer=t.SROverlay=void 0;var a=i(5233),n=function(){function e(e){this.srViewer=e,this.navigationModes=[{mode:"item",label:"Item"},{mode:"tab_focus",label:"Tabbable"},{mode:"heading",label:"Heading"},{mode:"region",label:"Region"}],this.createOverlay()}return e.prototype.createDOMElement=function(e,t,i){var a=this.srViewer.viewerDoc.createElement(e);if(t)for(var n in t)a[n]=t[n];if(i)for(var n in i)a.style[n]=i[n];return a},e.prototype.createOverlay=function(){var e=this;this.container=this.createDOMElement("div",{className:"ibma-sr-overlay"},{position:"fixed",bottom:"0",left:"0",width:"100%",backgroundColor:"rgba(0, 0, 0, 0.8)",color:"white",padding:"10px",zIndex:"10000",display:"flex",flexDirection:"column",gap:"10px"});var t=this.createDOMElement("div",{},{display:"flex",flexWrap:"wrap",gap:"10px"});this.navigationModes.forEach(function(i){var a=e.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"});a.appendChild(e.createDOMElement("span",{textContent:i.label+":"},{}));var n=e.createDOMElement("button",{textContent:"◀ Prev"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.navigatePrevious(i.mode)}),a.appendChild(n);var r=e.createDOMElement("button",{textContent:"Next ▶"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});r.addEventListener("click",function(){return e.srViewer.navigateNext(i.mode)}),a.appendChild(r),t.appendChild(a)});var i=this.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"}),a=this.createDOMElement("button",{textContent:"Show all"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});a.addEventListener("click",function(){return e.srViewer.showAll(!0)}),i.appendChild(a);var n=this.createDOMElement("button",{textContent:"Toggle speech"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.toggleSpeech()}),i.appendChild(n),t.appendChild(i),this.resultsDisplay=this.createDOMElement("div",{textContent:"Screen reader simulation results will appear here."},{padding:"10px",backgroundColor:"rgba(255, 255, 255, 0.1)",borderRadius:"3px",minHeight:"100px",maxHeight:"50vh",fontFamily:"monospace",overflow:"auto"}),this.container.appendChild(t),this.container.appendChild(this.resultsDisplay),this.srViewer.viewerDoc.body.appendChild(this.container)},e.prototype.displayResult=function(e,t,i){var a,n,r,l,o="";e.success,o="".concat(i.toUpperCase()," ").concat(t,": ").concat(e.renderingResult.message),null===(n=null===(a=e.renderingResult.end)||void 0===a?void 0:a.getElement())||void 0===n||n.scrollIntoView(),null===(l=null===(r=e.renderingResult.start)||void 0===r?void 0:r.getElement())||void 0===l||l.scrollIntoView(),window.scrollBy(0,-200),this.resultsDisplay.innerHTML="",this.resultsDisplay.textContent=o;var s=this.createDOMElement("button",{innerText:"Debug"},{});s.addEventListener("click",function(){var t,i;console.log(null===(t=e.renderingResult.start)||void 0===t?void 0:t.getNode(),null===(i=e.renderingResult.end)||void 0===i?void 0:i.getNode())}),this.resultsDisplay.appendChild(s)},e.prototype.displayAll=function(e){for(var t=this,i=this.createDOMElement("table",{},{}),a=this.createDOMElement("tr",{},{}),n=["region","heading","item","tab_focus"],r=0,l=["Region","Heading","Item","Tabbable"];r<l.length;r++){var o=l[r];a.appendChild(this.createDOMElement("th",{scope:"col",innerText:o},{textAlign:"left",padding:".25rem",margin:"0rem",color:"white"})),i.appendChild(a)}for(var s=function(e){var a=u.createDOMElement("tr",{},{});n.forEach(function(i){a.appendChild(t.createDOMElement("td",{innerText:e[i]},{verticalAlign:"top",border:"solid white 1px",padding:".25rem",margin:"0rem",color:"white"}))}),i.appendChild(a)},u=this,d=0,c=e;d<c.length;d++)s(c[d]);this.resultsDisplay.innerHTML="",this.resultsDisplay.appendChild(i)},e.prototype.destroy=function(){this.container&&this.container.parentNode&&this.container.parentNode.removeChild(this.container)},e}();t.SROverlay=n;var r=function(){function e(e){void 0===e&&(e=document.body),this.isStreaming=!1,this.isShowingAll=!1,this.speechEnabled=!1,this.viewerDoc=e.ownerDocument,this.controller=a.SRController.getController(this.viewerDoc),this.overlay=new n(this),this.setupKeyboardHandlers(),this.setupFocusTracking(),this.setupMutationTracking()}return e.prototype.showAll=function(e){e&&(this.isShowingAll=!0);var t=a.SRController.renderStructure(this.viewerDoc);this.overlay.displayAll(t)},e.prototype.toggleSpeech=function(){this.speechEnabled=!this.speechEnabled},e.prototype.navigateNext=function(e){this.isShowingAll=!1;var t=this.controller.jumpNext(e);this.overlay.displayResult(t,e,"next"),this.speakResult(t)},e.prototype.navigatePrevious=function(e){this.isShowingAll=!1;var t=this.controller.jumpPrevious(e);this.overlay.displayResult(t,e,"previous"),this.speakResult(t)},e.prototype.setupKeyboardHandlers=function(){var e=this;this.keyboardHandler=function(t){var i=t.target;if("INPUT"!==i.tagName&&"TEXTAREA"!==i.tagName&&"SELECT"!==i.tagName)if(t.ctrlKey)e.stopSpeech();else if(!t.altKey&&!t.metaKey)switch(t.key){case"ArrowUp":t.preventDefault(),e.navigatePrevious("item");break;case" ":e.isStreaming=!0;case"ArrowDown":t.preventDefault(),e.navigateNext("item");break;case"Enter":t.preventDefault(),e.activateCurrentElement(),e.controller.setPointOfRegard(e.viewerDoc.activeElement);break;case"H":case"h":t.shiftKey?(t.preventDefault(),e.navigatePrevious("heading")):(t.preventDefault(),e.navigateNext("heading"));break;case"R":case"r":t.shiftKey?(t.preventDefault(),e.navigatePrevious("region")):(t.preventDefault(),e.navigateNext("region"));break;case"Tab":t.shiftKey?(t.preventDefault(),e.navigatePrevious("tab_focus")):(t.preventDefault(),e.navigateNext("tab_focus"))}},this.viewerDoc.addEventListener("keydown",this.keyboardHandler)},e.prototype.speakResult=function(e){var t=this;if(this.speechEnabled){var i=new SpeechSynthesisUtterance(e.renderingResult.message);i.rate=1.5;var a=this;i.addEventListener("end",function(e){a.isStreaming&&t.navigateNext("item")}),speechSynthesis.cancel(),speechSynthesis.speak(i)}},e.prototype.stopSpeech=function(){this.isStreaming=!1,speechSynthesis.cancel()},e.prototype.setupMutationTracking=function(){var e=this,t=new MutationObserver(function(i){if(e.isShowingAll&&i.filter(function(e){return 1===e.target.nodeType&&!e.target.closest(".ibma-sr-overlay")}).length>0){t.disconnect();var a=e;a.showAll(),setTimeout(function(){a.showAll(),t.observe(e.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},1e3)}});t.observe(this.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},e.prototype.setupFocusTracking=function(){var e=this;this.focusHandler=function(t){if(t.target instanceof HTMLElement){var i=t.target;if(e.overlay&&i.closest(".ibma-sr-overlay"))return;console.group("focusHandler");var a=e.controller.setPointOfRegard(i);a.success&&(e.overlay.displayResult(a,"focus","focus"),e.speakResult(a)),console.groupEnd()}},this.viewerDoc.addEventListener("focusin",this.focusHandler)},e.prototype.activateCurrentElement=function(){var e=this.controller.getPointOfRegard().getElement();if(e){var t={success:!0,renderingResult:{message:"Activating: ".concat(e.textContent||e.nodeName),start:this.controller.getPointOfRegard(),end:this.controller.getPointOfRegard()}};this.overlay.displayResult(t,"focus","focus"),this.speakResult(t),e.focus&&e.focus(),e.click()}},e.prototype.getController=function(){return this.controller},e.prototype.destroy=function(){this.viewerDoc.removeEventListener("keydown",this.keyboardHandler),this.viewerDoc.removeEventListener("focusin",this.focusHandler),this.stopSpeech(),this.overlay.destroy()},e}();t.SRViewer=r},7242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=t.getLinkAnnouncement=t.getRoleDescription=t.quoteName=t.quoteNamePadBefore=t.quoteNamePadAfter=void 0;var a=i(8195),n=i(328),r=i(7011),l=i(9910),o=i(3864),s=i(3946);function u(e,t,i,a){return e.getName()?"".concat(c(e)).concat(t||", "):""}function d(e,t){return e.getName()?"".concat(t||", ").concat(c(e)):""}function c(e,t,i){return e.getName()?"".concat(t||'"').concat(e.getName()).concat(i||'"'):""}function m(e,t){var i=e.getElement();if(!i)return t;var a=i.getAttribute("aria-roledescription");return a&&a.trim().length>0?a.trim():t}function p(e,t){var i,a=e.getNode().href||"";i=a.startsWith(document.location.href)&&"#"===a.charAt(document.location.href.length)?"same page link":"link";var n=e.getNameInfo();return n&&!["content","text"].includes(n.nameFrom)?"tab_focus"===t?"[".concat(u(e)).concat(i,"]"):"[".concat(i).concat(d(e),"]"):"[".concat(i,"]")}function h(e,t){var i=e.getAttribute("aria-describedby");if(!i)return"";var a=i.split(/\s+/).map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){var t;return null===(t=e.textContent)||void 0===t?void 0:t.trim()}).filter(function(e){return!!e}).join(" ");return a&&0!==a.length?"item"===t?", ".concat(a,""):', "'.concat(a,'"'):""}function g(e){var t="";return(e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled"))&&(t+=", disabled"),(e.hasAttribute("readonly")||"true"===e.getAttribute("aria-readonly"))&&(t+=", read only"),(e.hasAttribute("required")||"true"===e.getAttribute("aria-required"))&&(t+=", required","SELECT"===e.nodeName.toUpperCase()&&e.validity.valueMissing&&(t+=", invalid entry")),"true"===e.getAttribute("aria-invalid")&&(t+=", invalid"),t}function b(e){var t=e.getElement();if(!t)return!1;for(var i=new o.DOMWalker(t,!1,t,!1);i.nextNode();)if(1===i.node.nodeType&&!i.bEndTag){var a=r.AriaUtil.getResolvedRole(i.node);if(a&&l.ARIADefinitions.designPatterns[a]&&"widget"===l.ARIADefinitions.designPatterns[a].roleType)return!0}return!1}t.quoteNamePadAfter=u,t.quoteNamePadBefore=d,t.quoteName=c,t.getRoleDescription=m,t.getLinkAnnouncement=p,t.RULES=[new n.SRRendererRule({roles:["button"],elems:[],modes:["item","button","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"true"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"false"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", not pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isEndTag()){var a="",n=e.getElement(),r=m(e,"button");return["menu","true"].includes(n.getAttribute("aria-haspopup"))&&(a+=", menu"),n.hasAttribute("aria-expanded")&&(a+=", ".concat("true"===n.getAttribute("aria-expanded")?"expanded":"collapsed")),a+=g(n),"[".concat(u(e)).concat(r).concat(a).concat(h(n,i),"]")}},function(e){if(e.isEndTag())return""}]}),new n.SRRendererRule({roles:["checkbox"],elems:[],modes:["item","checkbox","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a=e.getNode(),n=m(e,"checkbox"),r="";return r="mixed"===a.getAttribute("aria-checked")?"half checked":(a.hasAttribute("aria-checked")?"true"===a.getAttribute("aria-checked"):a.checked)?"checked":"not checked",r+=g(e.getElement()),"[".concat(n,", ").concat(r).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["cell","columnheader","rowheader"],elems:[],modes:["item","table"],tests:[function(e){var t;if(!e.isStartTag())return null;var i=e.getElement();if(!i)return null;var a=(null===(t=i.textContent)||void 0===t?void 0:t.trim())||"",n=new o.DOMWalker(i,!1,i,!1),s=a.length>0;if(!s)for(;n.nextNode();)if(1===n.node.nodeType&&!n.bEndTag){var u=n.node,d=r.AriaUtil.getResolvedRole(u);if(d&&l.ARIADefinitions.designPatterns[d]){s=!0;break}if("IMG"===u.nodeName.toUpperCase()&&u.hasAttribute("alt")){s=!0;break}}return s?null:"[blank]"}]}),new n.SRRendererRule({roles:["combobox"],elems:[],modes:["item","combo","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=m(e,"combo box"),i=e.getElement(),n="";if("SELECT"===e.getNode().nodeName.toUpperCase()){n=", collapsed";var r=e.getElement(),l=r.selectedIndex>=0?r.options[r.selectedIndex]:null,o="";return l&&(o=d(new a.SRCursor(l,!1),", ")),n+=g(i),"[".concat(u(e)).concat(t).concat(n).concat(o,"]")}if("INPUT"===e.getNode().nodeName.toUpperCase())return i.hasAttribute("aria-expanded")&&(n=", ".concat("true"===i.getAttribute("aria-expanded")?"expanded":"collapsed")),n+=g(i),"[".concat(u(e)).concat(t).concat(n,", has auto complete, editable, opens list]");i.hasAttribute("aria-expanded")&&(n=", ".concat("true"===i.getAttribute("aria-expanded")?"expanded":"collapsed"),i.hasAttribute("aria-autocomplete")&&(n+=", has auto complete")),n+=g(i),o="";var s=i.getAttribute("aria-controls"),c=s?document.getElementById(s):null;if(c){var p=c.querySelector("[role='option'][aria-selected='true']");p&&(o=', "'.concat((p.textContent||"").trim(),'"'))}if(!o){var h=(i.textContent||"").trim();h&&(o=', "'.concat(h,'"'))}return"[".concat(u(e)).concat(t).concat(n).concat(o,"]")}]}),new n.SRRendererRule({roles:["listbox"],elems:[],modes:["item","combo","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=m(e,"list box"),i=e.getElement(),n="";if("SELECT"===e.getNode().nodeName.toUpperCase()){var r=e.getElement(),l=Array.from(r.options).filter(function(e){return e.selected}).map(function(e){return d(new a.SRCursor(e,!1),", ")}).join("");return n+=g(i),"[".concat(u(e)).concat(t).concat(n).concat(l,"]")}n+=g(i);var o=(i.textContent||"").trim(),s=o?', "'.concat(o,'"'):"";return"[".concat(u(e)).concat(t).concat(n).concat(s,"]")}]}),new n.SRRendererRule({roles:["default"],elems:[],modes:["item"],tests:[function(e){var t;return e.isStartTag()?"!!<".concat(e.getRole(),">").concat((null===(t=e.getNameInfo())||void 0===t?void 0:t.name)+"","!!"):"!!</".concat(e.getRole(),">!!")}]}),new n.SRRendererRule({roles:["deletion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[deleted]":""}]}),new n.SRRendererRule({roles:["dialog"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[End of dialog]":"[Start of dialog".concat(d(e))}]}),new n.SRRendererRule({roles:["generic","paragraph"],elems:["DIV","SPAN","P","SECTION","ARTICLE","HEADER","FOOTER","MAIN","ASIDE","NAV","LI","TD","TH","PRE","BLOCKQUOTE","FIGURE","FIGCAPTION","DETAILS","SUMMARY"],modes:["item","tab_focus"],tests:[function(e,t,i){var a,n=e.getElement();if(!n)return null;var r=n.getAttribute("contenteditable");if("true"!==r&&""!==r)return null;if(n.hasAttribute("role"))return null;var l="paragraph"===e.getRole()||"P"===n.nodeName.toUpperCase();if(e.isEndTag())return"item"===i?l?"[out of paragraph]":"[out of section]":"";var o="";(n.hasAttribute("disabled")||"true"===n.getAttribute("aria-disabled"))&&(o=", disabled");var s=l?"paragraph":"section",d=e.getNameInfo(),c=!d||["content","text"].includes(d.nameFrom),m="tab_focus"!==i||c?"":null===(a=n.textContent)||void 0===a?void 0:a.trim(),p=m?" ".concat(m):"";return"[".concat(u(e)).concat(s,", editable").concat(o,"]").concat(p)}]}),new n.SRRendererRule({roles:["document","generic"],elems:[],modes:["item"],tests:[function(){return""}]}),new n.SRRendererRule({roles:["graphics-document"],elems:[],modes:["item","image"],tests:[function(e){var t,i;return e.isStartTag()&&!(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&""!==(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]":null},function(e){var t;return e.isStartTag()&&""===(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)?"":null},function(e){var t;return e.isStartTag()&&(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&"[graphic".concat(d(e),"]")||null},function(e){return e.isEndTag()?"":null}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&e.isStartTag())return"";if("item"===i&&e.isEndTag())return"";var a,n=e.getElement();a=n.ariaLevel?n.ariaLevel:"heading"===n.getAttribute("role")?"2":n.nodeName.substring(1);var r=e.getNameInfo();return r&&!["content","text"].includes(r.nameFrom)||(n.textContent||"").trim()?r&&!["content","text"].includes(r.nameFrom)?"[heading level ".concat(a).concat(d(e),"]"):"[heading level ".concat(a,"]"):""}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["heading","h1","h2","h3","h4","h5","h6"],tests:[function(e){if(e.isStartTag()){var t,i=e.getNode();t=i.ariaLevel?i.ariaLevel:"heading"===i.getAttribute("role")?"2":i.nodeName.substring(1);var a=e.getNameInfo();return a&&!["content","text"].includes(a.nameFrom)||(i.textContent||"").trim()?"[".concat(u(e),"heading level ").concat(t,"]"):""}return""}]}),new n.SRRendererRule({roles:["img"],elems:[],modes:["item","image"],tests:[function(e){var t,i,a;return e.isEndTag()?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""===(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?""===(null===(a=e.getNameInfo())||void 0===a?void 0:a.name)?"":"[graphic".concat(d(e),"]"):e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]"}]}),new n.SRRendererRule({roles:["insertion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[inserted]":""}]}),new n.SRRendererRule({roles:["link"],elems:[],modes:["item","region","link","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&!["content","text"].includes(null===(a=e.getNameInfo())||void 0===a?void 0:a.nameFrom)?p(e,i):null}]}),new n.SRRendererRule({roles:["listitem"],elems:[],modes:["item"],tests:[function(e){for(var t,i,a,n=o.DOMWalker.parentNode(e.getNode());void 0===i&&n;)1===n.nodeType&&((p=n).hasAttribute("role")?"list"===p.getAttribute("role")&&(i=!1,a=p):"UL"===p.nodeName.toUpperCase()?(i=!1,a=p):"OL"===p.nodeName.toUpperCase()&&(i=!0,a=p)),n=o.DOMWalker.parentNode(n);var r=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",l="";if(i){var s=1;if(a&&"OL"===a.nodeName.toUpperCase()&&a.hasAttribute("start")){var u=parseInt(a.getAttribute("start")||"1",10);s=isNaN(u)?1:u}for(var d=e.getElement(),c=o.DOMWalker.previousSiblingNotOwnedBySlot(d);c;){if(1===c.nodeType){var m=c;"listitem"!==m.getAttribute("role")&&"LI"!==m.nodeName.toUpperCase()||s++}c=o.DOMWalker.previousSiblingNotOwnedBySlot(c)}l=e.isStartTag()?"".concat(s,". ").concat(r):""}else{var p;l="LI"===(p=e.getElement()).nodeName.toUpperCase()&&"none"===window.getComputedStyle(p).listStyleType||"LI"!==p.nodeName.toUpperCase()?e.isStartTag()?"".concat(r):"":e.isStartTag()?"[bullet] ".concat(r):""}return l}]}),new n.SRRendererRule({roles:["math"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[math content]":""}]}),new n.SRRendererRule({roles:["menuitem"],elems:[],modes:["item","tab_focus","region"],tests:[function(e){var t="";if(e.isStartTag()){var i="",a=e.getElement();"true"===a.getAttribute("aria-haspopup")&&(i+=", sub-menu"),a.hasAttribute("aria-expanded")&&(i+=", ".concat("true"===a.getAttribute("aria-expanded")?"expanded":"collapsed")),t="[menu".concat(i);var n=e.getNameInfo();n&&!["content","text"].includes(n.nameFrom)&&(t+=d(e)),t+="]"}return t}]}),new n.SRRendererRule({roles:["meter"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["progressbar"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["radio"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a,n=m(e,"radio button");a=e.getElement().hasAttribute("aria-checked")?"true"===e.getElement().getAttribute("aria-checked"):e.getNode().checked;var r=g(e.getElement());return"[".concat(n,", ").concat(a?"checked":"not checked").concat(r).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["searchbox"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[".concat(u(e),"edit]"):""}]}),new n.SRRendererRule({roles:["separator"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[separator]":""}]}),new n.SRRendererRule({roles:["slider"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"slider"),n=e.getElement(),r=n.hasAttribute("aria-valuenow")?n.getAttribute("aria-valuenow"):e.getNode().value;return"[".concat(u(e)).concat(a,", ").concat(r).concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["spinbutton"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"spinbutton");return"[".concat(u(e)).concat(a,", editable").concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["tab"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(!e.isStartTag())return"";var t=m(e,"tab");return"[".concat(t).concat("true"===e.getNode().getAttribute("aria-selected")?", selected":"").concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tablist"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[group start".concat(d(e),"]"):"[group end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tabpanel"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[Tab panel start".concat(d(e),"]"):"[Tab panel end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["item","link","tab_focus","region"],tests:[function(e){var t,i,a,n;if(e.isEndTag()||!(null===(t=e.getParentElement())||void 0===t?void 0:t.getElement()))return null;var r=null===(i=e.getParentElement())||void 0===i?void 0:i.getElement();return"line-through"===r.ownerDocument.defaultView.getComputedStyle(r).textDecorationLine?"[strikethrough] ".concat((null===(a=e.getNameInfo())||void 0===a?void 0:a.name)+""," [end strikethrough]"):"".concat((null===(n=e.getNameInfo())||void 0===n?void 0:n.name)+"")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["heading"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["textbox"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){var a,n=e.getElement();if(e.isEndTag())return"item"===i&&"TEXTAREA"===n.nodeName.toUpperCase()?"[out of edit]":"";if(!e.isStartTag())return"";var r="";n.hasAttribute("placeholder")&&n.getAttribute("placeholder").trim().length>0&&(r+=", placeholder: ".concat(n.getAttribute("placeholder"))),r+=g(n);var l="TEXTAREA"===n.nodeName.toUpperCase()||"true"===n.getAttribute("aria-multiline"),o=h(n,i);if(l){var s="tab_focus"===i?null===(a=n.textContent)||void 0===a?void 0:a.trim():"",d=s?" ".concat(s):"";return"[".concat(u(e),"edit, multiline").concat(r).concat(o,"]").concat(d)}return"[".concat(u(e),"edit").concat(r).concat(o,"]")}]}),new n.SRRendererRule({roles:["treeitem"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=e.getElement(),i="[treeview item";"true"===t.getAttribute("aria-selected")&&(i+=", selected"),t.hasAttribute("aria-expanded")&&(i+="true"===t.getAttribute("aria-expanded")?", expanded":", collapsed");var a=t.getAttribute("aria-level");if(a)i+=", level ".concat(a);else{for(var n=1,l=o.DOMWalker.parentElement(t);l;){var s=r.AriaUtil.getResolvedRole(l);if("group"===s||"tree"===s)for(var u=o.DOMWalker.parentElement(l);u;){var d=r.AriaUtil.getResolvedRole(u);if("treeitem"===d){n++;break}if("tree"===d)break;u=o.DOMWalker.parentElement(u)}l=o.DOMWalker.parentElement(l)}n>1&&(i+=", level ".concat(n))}var c=t.getAttribute("aria-posinset"),m=t.getAttribute("aria-setsize");if(!c||!m){var p=0,h=0,g=o.DOMWalker.parentElement(t);if(g)for(var b=o.DOMWalker.firstChildNotOwnedBySlot(g);b;){if(1===b.nodeType){var _=b;"treeitem"===r.AriaUtil.getResolvedRole(_)&&(h++,_===t&&(p=h))}b=b.nextSibling}c=p.toString(),m=h.toString()}return i+", ".concat(c," of ").concat(m,"] ")}]}),new n.SRRendererRule({roles:[],elems:["PRE"],modes:["item"],tests:[function(e){var t,i;if(e.isEndTag())return"";if(void 0===e.preLineIndex)return null;for(var a=(null!==(t=e.getNode().textContent)&&void 0!==t?t:"").split("\n"),n=0;n<a.length&&""===a[n].trim();)n++;for(var r=a.length-1;r>=n&&""===a[r].trim();)r--;return null!==(i=a.slice(n,r+1)[e.preLineIndex])&&void 0!==i?i:""}]}),new n.SRRendererRule({roles:[],elems:["BODY"],modes:["item","tab_focus"],tests:[function(e){if(e.getNode().ownerDocument!==document)return"";var t=e.getNode().ownerDocument.title;return e.isEndTag()?"[End of document".concat(t.trim().length>0?": "+t.trim():"","]"):"[Start of document".concat(t.trim().length>0?": "+t.trim():"","]")}]}),new n.SRRendererRule({roles:[],elems:["IFRAME"],modes:["tab_focus"],tests:[function(e){if(e.isEndTag())return null;var t=e.getElement().getAttribute("role"),i="none"===t||"presentation"===t;if(i&&!e.getName())return null;var a=i?"grouping":"frame";return"[".concat(u(e)).concat(a,"]")}]}),new n.SRRendererRule({roles:[],elems:["BR"],modes:["item"],tests:[function(e){try{for(var t=e.clone();t.previous(function(){return!0})&&"BR"!==t.getNode().nodeName.toUpperCase()&&t.getNameInfo()&&0===t.getNameInfo().name.trim().length;);return"BR"===t.getNode().nodeName.toUpperCase()?"[blank]":null}catch(e){console.error(e)}}]}),new n.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:[],elems:["INPUT"],modes:["item","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&"password"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))&&"[".concat(u(e),"edit, protected").concat(h(e.getElement(),i),"]")||null},function(e,t,i){var a,n;if(e.isStartTag()&&"file"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var r=(null===(n=e.getElement())||void 0===n?void 0:n.value)||"";return r=""===r?"No file chosen":r.substring(12),"[".concat(u(e),"button").concat(h(e.getElement(),i),"] [").concat(u(e)).concat(r,"]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"color"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r=(100*Number("0x".concat(n.substring(1,3)))/Number("0xff")).toFixed(0),l=(100*Number("0x".concat(n.substring(3,5)))/Number("0xff")).toFixed(0),o=(100*Number("0x".concat(n.substring(5)))/Number("0xff")).toFixed(0);return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [").concat(r,"% red ").concat(l,"% green ").concat(o,"% blue]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"month"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0";if(n.trim().length>0){var o=new Date(n);r=""+o.getFullYear(),l=""+(o.getMonth()+1)}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"] [spin button, ").concat(r,"] [menu button] [subMenu] Show month picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"date"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0",o="0";if(n.trim().length>0){var s=new Date(n);r=""+s.getFullYear(),l=""+(s.getMonth()+1),o=""+s.getDate()}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"] / [spin button, ").concat(o,"] / [spin button, ").concat(r,"] [menu button] [subMenu] Show date picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"datetime-local"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0",o="0",s="0",d="0",c="0";if(n.trim().length>0){var m=new Date(n);r=""+m.getFullYear(),l=""+(m.getMonth()+1),o=""+m.getDate(),s=0===m.getHours()||12===m.getHours()?"12":m.getHours()<12?""+m.getHours():""+(m.getHours()-12),d=""+m.getMinutes(),c=m.getHours()>=12?"pm":"am"}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"] / [spin button, ").concat(o,"] / [spin button, ").concat(r,"] [spin button, ").concat(s,"] : [spin button, ").concat(d,"] [spin button, ").concat(c,"] [menu button] [subMenu] Show local date and time picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"time"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0",o="0";if(n.trim().length>0){var s=n.split(":"),d=parseInt(s[0]);r=0===d||12===d?"12":d<12?""+d:""+(d-12),l=s[1],o=d>=12?"pm":"am"}return"[".concat(u(e),"grouping clickable").concat(h(e.getElement(),i)," [spin button, ").concat(r,"] : [spin button, ").concat(l,"] [spin button, ").concat(o,"] [menu button] [subMenu] Show time picker [out of grouping]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"week"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,r="0",l="0";if(n.trim().length>0){var o=n.split(/-W/);r=o[0],l=o[1]}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(l,"], [spin button, ").concat(r,"] [menu button] [subMenu] Show week picker")}return null},function(e){var t;return"hidden"===(null===(t=e.getElement())||void 0===t?void 0:t.getAttribute("type"))?"":null},function(e){return e.isStartTag()&&"!![".concat(u(e),"input!!]").concat(e.getElement().outerHTML)||null}]}),new n.SRRendererRule({roles:[],elems:["LI"],modes:["item"],tests:[function(e){var t,i=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",a=e.getElement();return"none"===window.getComputedStyle(a).listStyleType?e.isStartTag()?"".concat(i):"":e.isStartTag()?"[bullet] ".concat(i):""}]}),new n.SRRendererRule({roles:[],elems:["MFRAC"],modes:["item"],tests:[function(e){return e.isStartTag()?"[fraction]":"[end fraction]"}]}),new n.SRRendererRule({roles:[],elems:["MROW"],modes:["item"],tests:[function(e){var t;if(!e.isStartTag()){var i=e.getCurrentOrParentByRoleClone([],["mfrac"]);return i&&(null===(t=i.getElement().querySelectorAll("mrow")[0])||void 0===t?void 0:t.isSameNode(e.getNode()))?"[over]":void 0}}]}),new n.SRRendererRule({roles:[],elems:["MSQRT"],modes:["item"],tests:[function(e){return e.isStartTag()?"[square root]":"[end root]"}]}),new n.SRRendererRule({roles:[],elems:["MSUP"],modes:["item"],tests:[function(e){var t,i;if(!e.isEndTag()){var a=(null===(t=e.getElement().querySelector("mi"))||void 0===t?void 0:t.innerHTML)||"",n=(null===(i=e.getElement().querySelector("mn"))||void 0===i?void 0:i.innerHTML)||"";return"2"===n?"".concat(a," [squared]"):"3"===n?"".concat(a," [cubed]"):"".concat(a," [to the ").concat(n,"]")}}]}),new n.SRRendererRule({roles:[],elems:["SUMMARY"],modes:["item","button","tab_focus"],tests:[function(e,t,i){var a,n;if(e.isEndTag())return"";var r=e.getElement();if(!r)return null;var l=r.parentElement;if(!l||"DETAILS"!==l.nodeName.toUpperCase())return null;var o=Array.from(l.children).find(function(e){return"SUMMARY"===e.nodeName.toUpperCase()});if(!o||!o.isSameNode(r))return null;var s=l.hasAttribute("open")?"expanded":"collapsed",u=null===(a=r.getAttribute("aria-label"))||void 0===a?void 0:a.trim(),d=(null===(n=r.textContent)||void 0===n?void 0:n.trim())||"",c=u||d,m=c?'"'.concat(c,'", '):"",p=h(r,i);return!p&&u&&d&&(p="item"===i?", ".concat(d,""):', "'.concat(d,'"')),"[".concat(m,"button, ").concat(s).concat(p,"]")}]}),new n.SRRendererRule({roles:["article","banner","blockquote","caption","cell","code","columnheader","complementary","contentinfo","figure","form","group","list","main","mark","navigation","region","row","rowheader","search","table","toolbar"],elems:[],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["paragraph","rowgroup","status","strong","subscript","superscript","term","time","none","presentation"],elems:[],modes:["item"],tests:[function(e){return""}]})]},8485(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(369),r=i(7242),l=i(7011),o=i(9910),s=i(7139);function u(e,t){var i;t&&"#text"===(null===(i=t.getNode())||void 0===i?void 0:i.nodeName)&&(t=t.clone()).previous(function(){return!0});var a=n.SRTableUtil.getTableModel(e),r=n.SRTableUtil.getCellModel(t,a),l=n.SRTableUtil.getCellModel(e,a);if(!l)return"";var o=[];if(!r||r.rowIndexStart!==l.rowIndexStart||r.rowspan!==l.rowspan){var s=n.SRTableUtil.getRowHeadersForCursor(e,a),u=s&&s.trim().length>0?'"'.concat(s,'", '):"";o.push("[".concat(u,"row ").concat(l.rowIndexStart+1).concat(l.rowspan>1?" through "+(l.rowIndexStart+l.rowspan):"","]"))}if(!r||r.colIndexStart!==l.colIndexStart||r.colspan!==l.colspan){var d=n.SRTableUtil.getColumnHeadersForCursor(e,a);u=d&&d.trim().length>0?'"'.concat(d,'", '):"",o.push("[".concat(u,"column ").concat(l.colIndexStart+1).concat(l.colspan>1?" through "+(l.colIndexStart+l.colspan):"","]"))}return o.join(" ")}t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item","article","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"article");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"banner region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item","region"],tests:[function(e){return"[blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item","region"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:["cell"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["columnheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"complementary region]"):null}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"content info region]"):null}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[section]":"[".concat((0,r.quoteNamePadAfter)(e),"form region]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item","region"],tests:[function(e){var t;if("DETAILS"===e.getNode().nodeName.toUpperCase()){var i=e.getElement();return Array.from(i.children).some(function(e){return"SUMMARY"===e.nodeName.toUpperCase()})?"":'["Details", button, '.concat(i.hasAttribute("open")?"expanded":"collapsed","]")}return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"[grouping".concat((0,r.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["tab_focus"],tests:[function(e){var t;if("DETAILS"===e.getNode().nodeName.toUpperCase()){var i=e.getElement();return Array.from(i.children).some(function(e){return"SUMMARY"===e.nodeName.toUpperCase()})?null:'["Details", button, '.concat(i.hasAttribute("open")?"expanded":"collapsed","]")}return null===e.getNameInfo()?null:(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t||t.getNode().nodeName.toUpperCase(),"")}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item","list"],tests:[function(e){for(var t,i=e.getNode(),a=document.evaluate(".//li | .//*[@role='listitem']",i,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),n=0,s=0;s<a.snapshotLength;s++){for(var u=!1,d=!1,c=a.snapshotItem(s).parentElement;c&&c!==i;){var m=l.AriaUtil.getResolvedRole(c);if("list"===m||"UL"===c.nodeName.toUpperCase()||"OL"===c.nodeName.toUpperCase()){u=!0;break}if(m&&(null===(t=o.ARIADefinitions.designPatterns[m])||void 0===t?void 0:t.presentationalChildren)){d=!0;break}c=c.parentElement}u||d||n++}return 0===n?null:"[".concat((0,r.quoteNamePadAfter)(e),"list of ").concat(n," items]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"main region]"):null}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);console.log("MENUBAR",e.isEndTag()?"/":"",e.getNode()),console.log(i,a);var n=i.snapshotLength-a.snapshotLength;return 0===n?null:"[".concat((0,r.quoteNamePadAfter)(e),"menubar with ").concat(n," items]")}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"navigation region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return null===e.getNameInfo()?null:"[grouping".concat((0,r.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if(null===e.getNameInfo())return null;if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["row"],elems:[],modes:["item","table"],tests:[function(){return""}]}),new a.SRRendererRule({roles:["rowheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,r.getRoleDescription)(e,"search region");return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item","table"],tests:[function(e){for(var t=e.clone();"table"!==t.getRole()&&t.previous(function(){return!0}););var i=t.getNode(),a=0,n=0;if(t.getNode().firstChild)for(var l=!1;t.next(function(){return!0})&&!t.getNode().isSameNode(i);){var o=t.getRole();if(t.isStartTag()){if("row"===o)++a;else if(!l&&["cell","rowheader","columnheader"].includes(o)){var s=t.getNode();n+=parseInt(s.getAttribute("colspan")||"1")}}else"row"===o&&(l=!0)}return"[table with ".concat(a," ").concat(1===a?"row":"rows"," and ").concat(n," ").concat(1===n?"column":"columns").concat((0,r.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,r.quoteNamePadAfter)(e),"toolbar]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//dt",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotLength;return"[".concat((0,r.quoteNamePadAfter)(e),"definition list of ").concat(i," terms]")}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[highlighted]"}]}),new a.SRRendererRule({roles:[],elems:["IFRAME"],modes:["item"],tests:[function(e){var t=e.getElement().getAttribute("role"),i="none"===t||"presentation"===t;if(i&&!e.getName())return null;var a=i?"grouping":"frame";return"[".concat((0,r.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:[],elems:["PRE"],modes:["item"],tests:[function(e){return"[".concat((0,r.quoteNamePadAfter)(e),"preformatted text]")}]}),new a.SRRendererRule({roles:["article","banner","blockquote","caption","cell","columnheader","complementary","contentinfo","figure","form","group","region","row","rowheader","search","toolbar","list","main","navigation","table"],elems:[],modes:["heading"],tests:[function(){return""}]})]},2099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(7242);t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"article");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"banner region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item"],tests:[function(e){return"[out of blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"complementary region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"content info region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[out of figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[out of section]":"[out of form]"}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item"],tests:[function(e){var t;return"DETAILS"===e.getNode().nodeName.toUpperCase()?"":null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"[out of grouping]"}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//li | .//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);return 0===i.snapshotLength-a.snapshotLength?null:"[".concat((0,n.quoteNamePadAfter)(e),"out of list]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"main region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){return"[out of menubar]"}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"navigation region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return"[out of grouping]"}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item"],tests:[function(e){if(null===e.getNameInfo())return null;var t=(0,n.getRoleDescription)(e,"region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"search region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item"],tests:[function(e){return"[out of table]"}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item"],tests:[function(e){return"[out of toolbar]"}]}),new a.SRRendererRule({roles:[],elems:["ABBR"],modes:["item"],tests:[function(e){return e.getElement().hasAttribute("title")?"[".concat(e.getElement().getAttribute("title"),"]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return"[out of definition list]"}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[out of highlighted]"}]}),new a.SRRendererRule({roles:[],elems:["IFRAME"],modes:["item"],tests:[function(e){var t=e.getElement().getAttribute("role"),i="none"===t||"presentation"===t;return i&&!e.getName()?null:i?"[out of grouping]":"[out of frame]"}]}),new a.SRRendererRule({roles:[],elems:["PRE"],modes:["item"],tests:[function(e){return"[out of preformatted text]"}]}),new a.SRRendererRule({roles:["group","article","banner","blockquote","caption","complementary","contentinfo","figure","form","list","region","main","navigation","search","table","toolbar"],elems:[],modes:["region","heading"],tests:[function(){return""}]})]},2151(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CONTAINER_EXIT_RULES=t.CONTAINER_ENTER_RULES=t.SR_RULES=void 0;var a=i(7242),n=i(8485),r=i(2099);t.SR_RULES=a.RULES,t.CONTAINER_ENTER_RULES=n.RULES,t.CONTAINER_EXIT_RULES=r.RULES},1950(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.AccNameUtil=void 0;var a=i(9910),n=i(7139),r=i(7011),l=i(3946),o=i(4566),s=i(3864),u=i(1686),d=function(){function e(){}return e.computeAccessibleNameForSVGElementW3C=function(e){if(!e||"svg"!==e.nodeName.toLowerCase())return null;var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a="",o=e.querySelectorAll("text, textPath, tspan");if(o&&o.length>0&&(o.forEach(function(e){if(!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(a+=" "+t.trim())}}),""!==a.trim()))return{name:n.CommonUtil.truncateText(a.trim()),nameFrom:"svgText"};for(var s=e.querySelectorAll("a"),u=0;u<s.length;u++){var d=s[u];if(!l.VisUtil.isNodeHiddenFromAT(d)&&!l.VisUtil.isNodePresentational(d)){var c=d.getAttribute("xlink:title");if(c&&""!==c.trim())return{name:n.CommonUtil.truncateText(c),nameFrom:"svglinkTitle"}}}var m=r.AriaUtil.getAriaDescription(e);if(m&&""!==m.trim())return{name:n.CommonUtil.truncateText(m),nameFrom:"aria-description"};var p=e.querySelectorAll(":scope > desc");if(p&&p.length>0){var h="";if(p.forEach(function(e){if(!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(h+=" "+t.trim())}}),""!==h.trim())return{name:h.trim(),nameFrom:"svgDesc"}}if(e.hasAttribute("title")){var g=e.getAttribute("title");if(g&&""!==g.trim())return{name:n.CommonUtil.truncateText(g),nameFrom:"title"}}return null},e.computeAccessibleName=function(t){if(!t)return null;var i=t.nodeName.toLowerCase(),l=o.CacheUtil.getCache(t,"ELEMENT_ACCESSBLE_NAME",void 0);if(void 0!==l)return l;var s=r.AriaUtil.getAriaLabel(t);if(s&&""!==s.trim())return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"}),{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"};if(l=e.computeAccessibleNameForNativeElement(t))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",l),l;var u=r.AriaUtil.getResolvedRole(t);if(a.ARIADefinitions.designPatterns[u]&&a.ARIADefinitions.designPatterns[u].nameFrom.includes("contents")&&(l=e.computeAccessibleNameFromContent(t)))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",l),l;if(t.hasAttribute("title")){var d=t.getAttribute("title").trim();if(d&&d.trim().length>0)return d=n.CommonUtil.truncateText(d),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:d,nameFrom:"title"}),{name:d,nameFrom:"title"}}if("textarea"===i||"input"===i&&(!t.hasAttribute("type")||n.CommonUtil.input_type_with_placeholder.includes(t.getAttribute("type")))){var c=t.getAttribute("placeholder");if(c&&c.trim().length>0)return c=n.CommonUtil.truncateText(c),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:c,nameFrom:"placeholder"}),{name:c,nameFrom:"placeholder"}}return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",null),null},e.computeAccessibleNameForNativeElement=function(t){var i,a,r=t.nodeName.toLowerCase();if(n.CommonUtil.form_labelable_elements.includes(r)&&(p=n.CommonUtil.getFormFieldLabel(t))&&""!==p.trim())return{name:n.CommonUtil.truncateText(p),nameFrom:"label"};if("input"===r&&t.hasAttribute("type"))if(n.CommonUtil.form_button_types.includes(t.getAttribute("type"))){var o=n.CommonUtil.getElementAttribute(t,"value");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"value"};var s=t.getAttribute("type");if("submit"===s||"reset"===s)return{name:s,nameFrom:"internal"}}else if("image"===t.getAttribute("type")&&(b=n.CommonUtil.getElementAttribute(t,"alt"))&&""!==b.trim())return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("button"===r){if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var d=t.querySelector("img");if(d&&!l.VisUtil.isNodeHiddenFromAT(d)&&!l.VisUtil.isNodePresentational(d)&&(a=e.computeAccessibleName(d))&&a.name&&a.name.trim().length>0)return a;var c=t.querySelector("svg");if(c&&!l.VisUtil.isNodeHiddenFromAT(c)&&!l.VisUtil.isNodePresentational(c)&&(a=e.computeAccessibleName(c))&&a.name&&a.name.trim().length>0)return a}if("fieldset"===r&&(i=t.firstElementChild)&&"legend"===i.nodeName.toLowerCase()&&(v=i.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("output"===r&&t.hasAttribute("for")){var m=t.getAttribute("for").trim().split(" ");if(m&&m.length>0){for(var p="",h=0;h<m.length;h++){var g=t.ownerDocument.getElementById(m[h]);!g||u.DOMUtil.sameNode(g,t)||l.VisUtil.isNodeHiddenFromAT(g)||l.VisUtil.isNodePresentational(g)||(a=e.computeAccessibleName(g))&&a.name&&a.name.trim().length>0&&(p+=" "+n.CommonUtil.normalizeSpacing(a.name))}if(p.trim().length>0)return{name:n.CommonUtil.truncateText(p),nameFrom:"label"}}}if("summary"===r&&(v=t.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("details"===r)return(i=t.firstElementChild)&&"summary"===i.nodeName.toLowerCase()&&(a=e.computeAccessibleName(i))&&a.name&&a.name.trim().length>0?{name:n.CommonUtil.truncateText(a.name.trim()),nameFrom:"summary"}:{name:"details",nameFrom:"internal"};if("figure"===r&&(_=n.CommonUtil.getChildByTagHidden(t,"figcaption",!0,!1))&&_.length>0&&(v=_[0].innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"figcaption"};if("img"===r&&t.hasAttribute("alt")){var b=t.getAttribute("alt");return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"}}if("area"===r&&t.hasAttribute("alt")&&(b=t.getAttribute("alt"))&&b.trim().length>0)return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("table"===r){var _,f=t.firstElementChild;if(f&&"caption"===f.nodeName.toLowerCase()&&(_=f.innerText)&&_.trim().length>0)return{name:n.CommonUtil.truncateText(_),nameFrom:"caption"}}if("a"===r){var v;if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var A=t.querySelectorAll(":scope > img, :scope > svg");if(A&&A.length>0){var w="";if(A.forEach(function(t){if(!l.VisUtil.isNodeHiddenFromAT(t)&&!l.VisUtil.isNodePresentational(t)){var i=e.computeAccessibleName(t);i&&i.name&&i.name.trim().length>0&&(w+=" "+i.name.trim())}}),""!==w.trim())return{name:w.trim(),nameFrom:"alt"}}}return("optgroup"===r||"option"===r||"track"===r)&&(p=t.getAttribute("label"))&&p.trim().length>0?{name:n.CommonUtil.truncateText(p),nameFrom:"label"}:"svg"===r&&(a=e.computeAccessibleNameForSVGElementW3C(t))&&a.name&&a.name.trim().length>0?a:null},e.computeAccessibleNameForSVGElement=function(e){var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a=e.querySelector("a");if(a&&!l.VisUtil.isNodeHiddenFromAT(a)&&!l.VisUtil.isNodePresentational(a)){var o=a.getAttribute("xlink:title");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"svglinkTitle"}}var s="";if(e.querySelectorAll(":scope > *").forEach(function(e){if("svg"!==e.nodeName.toLowerCase()&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=n.CommonUtil.getInnerText(e);t&&t.trim().length>0&&(s+=t)}}),""!==s.trim())return{name:n.CommonUtil.truncateText(s),nameFrom:"svgText"};var u=r.AriaUtil.getAriaDescription(e);if(u&&u.trim().length>0)return{name:n.CommonUtil.truncateText(u),nameFrom:"aria-description"};var d=e.querySelectorAll(":scope > desc");if(d&&d.length>0){var c="";if(d.forEach(function(e){if(e&&!l.VisUtil.isNodeHiddenFromAT(e)&&!l.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(c+=t.trim())}}),c&&""!==c.trim())return{name:c.trim(),nameFrom:"svgDesc"}}},e.computeAccessibleNameFromContent=function(t){var i=t.nodeName.toLowerCase(),a=(r.AriaUtil.getResolvedRole(t),e.computeAccessibleNameForCSSPseudoElement(t,"before"));return null!==a&&a.name&&a.name.trim().length>0||(a=e.computeAccessibleNameForCSSPseudoElement(t,"after"))&&a.name&&a.name.trim().length>0?a:t.shadowRoot&&(a=e.computeAccessibleNameForShadowHost(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"shadow"}:"slot"===i&&(a=e.computeAccessibleNameForSlotElement(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"slot"}:(a=e.computeAccessibleNameFromChildren(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"content"}:null},e.computeAccessibleNameForCSSPseudoElement=function(e,t){var i=e.ownerDocument.defaultView.getComputedStyle(e,t);if(i){var a=i.content;if(a&&"none"!==a&&"no"!==a&&"normal"!==a&&(a=a.replace(/^"/,"").replace(/"$/,"")).trim().length>0)return{name:n.CommonUtil.truncateText(a),nameFrom:"css-"+t}}return null},e.computeAccessibleNameForShadowHost=function(t){var i="",a=t.shadowRoot;return a&&a.querySelectorAll("*").forEach(function(t){var a=e.computeAccessibleName(t);a&&a.name&&a.name.trim().length>0&&(i+=" "+a.name.trim())}),i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"shadow-host"}:null},e.computeAccessibleNameForSlotElement=function(t){var i="";if(t.assignedNodes()&&0!==t.assignedNodes().length)for(var a=0,r=t.assignedNodes();a<r.length;a++){var l,o=r[a];(l=e.computeAccessibleName(o))&&l.name&&l.name.length>0&&(i+=" "+l.name.trim())}else(l=e.computeAccessibleName(t))&&l.name&&l.name.trim().length>0&&(i+=" "+l.name.trim());return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content-slot"}:null},e.computeAccessibleNameFromChildren=function(t){for(var i="",a=new s.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){var o=a.node;if(3===o.nodeType){var u=o.parentElement;!l.VisUtil.isNodeHiddenFromAT(u)&&!l.VisUtil.isNodePresentational(u)&&o.nodeValue&&o.nodeValue.trim().length>0&&(i+=" "+o.nodeValue.trim())}else if(1===o.nodeType&&!l.VisUtil.isNodeHiddenFromAT(o)&&!l.VisUtil.isNodePresentational(o)){var d=e.computeAccessibleName(o);d&&d.name&&d.name.length>0?(i+=" "+d.name.trim(),a.bEndTag=!0):r.AriaUtil.containsPresentationalChildrenOnly(a.node)&&(a.bEndTag=!0)}}return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content"}:null},e.isAccessibleNameIgnorable=function(e){if(!e)return!1;var t=e.nodeName.toLowerCase();if("img"!==t&&"svg"!==t)return!1;var i=e.parentElement;return!(!i||!r.AriaUtil.isWidget(i)&&!r.AriaUtil.containsPresentationalChildrenOnly(i)||!r.AriaUtil.hasAriaLabel(i))},e}();t.AccNameUtil=d},7011(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,r=t.length;n<r;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.AriaUtil=void 0;var n=i(4566),r=i(9910),l=i(9955),o=i(3864),s=i(3946),u=i(7139),d=i(1950),c=i(5279),m=i(1686),p=function(){function e(){}return e.isDefinedAriaAttributeAtIndex=function(t,i){var a=t.attributes[i].name;return e.isDefinedAriaAttribute(t,a)},e.getUserDefinedAriaAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)&&t.push(n)}return t},e.getUserDefinedHtmlAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)||t.push(n)}return t},e.getUserDefinedAriaAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),r=e.getAttribute(n);""===r&&(r=null),"aria-"===n.substring(0,5)&&t.push({name:n,value:r})}return t},e.getUserDefinedHtmlAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),r=e.getAttribute(n);""===r&&(r=null),"aria-"===n.substring(0,5)||t.push({name:n,value:r})}return t},e.getAriaAttribute=function(t,i){var a=t.getAttribute(i);if(t.hasAttribute(i)&&""===a.trim())return a;if(!a){var n=t.nodeName.toLowerCase();i in e.ariaAttributeImplicitMappings&&(n in e.ariaAttributeImplicitMappings[i]?"function"==typeof(a=e.ariaAttributeImplicitMappings[i][n])&&(a=a(t)):"*"in e.ariaAttributeImplicitMappings[i]&&"function"==typeof(a=e.ariaAttributeImplicitMappings[i]["*"])&&(a=a(t)))}if(!a){var r=l.ARIAMapper.nodeToRole(t);r in e.ariaAttributeRoleDefaults&&i in e.ariaAttributeRoleDefaults[r]&&"function"==typeof(a=e.ariaAttributeRoleDefaults[r][i])&&(a=a(t))}return!a&&i in e.ariaAttributeGlobalDefaults&&(a=e.ariaAttributeGlobalDefaults[i]),a},e.isDefinedAriaAttribute=function(e,t){var i=!1;return"aria-"===t.substring(0,5)&&(i=e.hasAttribute&&e.hasAttribute(t)&&e.getAttribute(t).length>0),i},e.getResolvedRole=function(t,i){if(void 0===i&&(i=!0),!t)return null;var a=n.CacheUtil.getCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",null);if(null===a){var r=e.getUserDefinedRoles(t),l=e.getElementAriaProperty(t),o=e.getAllowedAriaRoles(t,l),s=!1;if(r&&r.length>0&&o&&o.length>0){for(var d=0;d<r.length;d++)if(o.includes("any")||o.includes(r[d])){if(o.includes("any")&&"generic"===r[d]){s=!0;continue}if(("presentation"===(a=r[d])||"none"===a)&&u.CommonUtil.isFocusable(t)){a=null;continue}break}s&&(a="generic")}if(null===a&&i){var c=e.getImplicitRole(t);a=c&&c.length>0?c[0]:void 0}n.CacheUtil.setCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",a)}return void 0!==a?a:null},e.getUserDefinedRoles=function(t){return e.getRoles(t,!1)},e.getRoles=function(t,i){var a=[];if(t&&t.hasAttribute&&t.hasAttribute("role"))for(var n=u.CommonUtil.normalizeSpacing(t.getAttribute("role").trim()).split(" "),r=0;r<n.length;++r)a.push(n[r]);if(i){var l=e.getImplicitRole(t);null!==l&&l.length>0&&u.CommonUtil.concatUniqueArrayItemList(l,a)}return a},e.getImplicitRole=function(t){if(!t||1!==t.nodeType)return null;var i=n.CacheUtil.getCache(t,"AriaUtil_ImplicitRole",null);if(!i){var a=e.getElementAriaProperty(t);if(a&&a.implicitRole){if(a.implicitRole.includes("generic")){var l=e.getUserDefinedAriaAttributes(t);if(0===l.length)return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[];var o=[],s=r.ARIADefinitions.designPatterns.generic;if(s.reqProps&&s.reqProps.length>0&&u.CommonUtil.concatUniqueArrayItemList(s.reqProps,o),a.globalAriaAttributesValid&&u.CommonUtil.concatUniqueArrayItemList(r.ARIADefinitions.globalProperties,o),s.deprecatedProps&&s.deprecatedProps.length>0&&u.CommonUtil.reduceArrayItemList(s.deprecatedProps,o),o.length>0&&!o.some(function(e){return l.includes(e)})){var d=u.CommonUtil.reduceArrayItemList(["generic"],a.implicitRole);return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",d),d}}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",a.implicitRole),a.implicitRole}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[]}return i},e.getRoleRequiredProperties=function(e,t){if(null===e)return null;if(r.ARIADefinitions.designPatterns[e]){var i=r.ARIADefinitions.designPatterns[e].reqProps;return"separator"===e.toLowerCase()&&t&&u.CommonUtil.isFocusable(t)&&(i=u.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"],i||[])),i}return null},e.hasRole=function(t,i,a){var n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var r=t.getAttribute("role").trim().split(" "),l=0;!n&&l<r.length;++l)n=r[l]in i;else for(r=t.getAttribute("role").trim().split(" "),l=0;!n&&l<r.length;++l)n=r[l]===i;if(!n&&a){var o=[],s=e.getImplicitRole(t);if(null!==s&&s.length>0)if(u.CommonUtil.concatUniqueArrayItemList(s,o),"string"!=typeof i)for(l=0;!n&&l<o.length;++l)n=o[l]in i;else for(l=0;!n&&l<o.length;++l)n=o[l]===i}return n},e.hasRoleInSemantics=function(t,i){var a=!1,n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var r=t.getAttribute("role").trim().toLowerCase().split(/\s+/),l=0;!a&&l<r.length;++l)n=!0,a=r[l]in i;else for(r=t.getAttribute("role").trim().toLowerCase().split(/\s+/),l=0;!a&&l<r.length;++l)n=!0,a=r[l]===i;if(n)return a;var o=e.getImplicitRole(t);if(null!==o&&o.length>0)if("string"!=typeof i)for(l=0;!a&&l<o.length;++l)a=o[l]in i;else for(l=0;!a&&l<o.length;++l)a=o[l]===i;return a},e.hasAnyRole=function(t,i){var a=!1;if(t&&t.hasAttribute&&t.hasAttribute("role")&&(a=!0),!a&&i){var n=e.getImplicitRole(t);null!==n&&n.length>0&&(a=!0)}return a},e.isPresentationalElement=function(e){return u.CommonUtil.valInArray(e.nodeName.toLowerCase(),["abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","a","progress","meter","basefont","big","center","strike","tt","font","blink","h1","h2","h3","h4","h5","h6","hr","blockquote","p"])},e.getAncestorWithRole=function(t,i,a){for(var n=o.DOMWalker.parentNode(t);null!==n;){if(a){if(e.hasRoleInSemantics(n,i))break}else if(e.hasRole(n,i,!1))break;n=o.DOMWalker.parentNode(n)}return n},e.getAncestorWithRoles=function(t,i){if(!t||!i||!i.length||0===i.length)return null;for(var a=t;null!==a;){var n=e.getResolvedRole(a);if(null!==n&&(i.includes(n)||i.includes("*")&&!["presentation","none"].includes(n)))return a;a=o.DOMWalker.parentNode(a)}return null},e.getRolesWithTypes=function(e,t){if(!e||!t||!t.length||0===t.length)return null;var i=n.CacheUtil.getCache(e.ownerDocument,"roles_with_given_types",null);return i&&0!==i.length||(i=[],Object.entries(r.ARIADefinitions.designPatterns).forEach(function(e){var a=e[0],n=e[1];t.includes(n.roleType)&&i.push(a)}),n.CacheUtil.setCache(e.ownerDocument,"roles_with_given_types",i)),i},e.isWidget=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"is_element_widget",null);if(null===i){var a=!1,l=e.getResolvedRole(t);return l&&r.ARIADefinitions.designPatterns[l]&&"widget"===r.ARIADefinitions.designPatterns[l].roleType&&(a=!0),n.CacheUtil.setCache(t.ownerDocument,"is_element_widget",a),a}return i},e.isNavigationOwnedOrControlled=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",null);if(null!==i&&i.length>0&&u.CommonUtil.getAncestor(t,i))return!0;var a=e.getResolvedRole(t);if(!a)return!1;var r=t.getAttribute("id");return!(!r||0===r.trim().length)&&(!!t.ownerDocument.querySelector("*[aria-controls~='".concat(r,"'], *[aria-owns~='").concat(r,"']"))&&(!!["combobox","scrollbar","button","tab","listbox","menu","menubar","radiogroup","tree","treegrid"].includes(a)&&(null===i&&(i=[]),i.push(t),n.CacheUtil.setCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",i),!0)))},e.getSiblingWithRole=function(t,i){return e.getSiblingWithRoleHidden(t,i,!1)},e.getSiblingWithRoleHidden=function(t,i,a,n){var r=null,l=!1;if(t&&i){for(r=t.nextSibling;null!==r&&!l;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(r)||(l=n?e.hasRoleInSemantics(r,i):e.hasRole(r,i,!1)),r=r.nextSibling;if(!r)for(r=t.previousSibling;null!==r&&!l;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(r)||(l=e.hasRole(r,i,n)),r=r.previousSibling}return r},e.getDescendantWithRole=function(t,i){return e.getDescendantWithRoleHidden(t,i,!1)},e.getDescendantWithRoleHidden=function(t,i,a,n){for(var r=null,l=new o.DOMWalker(t);l.nextNode()&&l.node!=t&&l.node!=t.nextSibling;)if((!a||!u.CommonUtil.shouldNodeBeSkippedHidden(l.node))&&(n?e.hasRoleInSemantics(l.node,i):e.hasRole(l.node,i,!1))){r=l.node;break}return r},e.getAllDescendantsWithRoles=function(t,i,a,n){if(i&&0!==i.length){var r=[];return i.forEach(function(i){var l=e.getAllDescendantsWithRoleHidden(t,i,a,n);l&&l.length>0&&(r=r.concat(l))}),r}},e.getAllDescendantsWithRoleHidden=function(t,i,a,n){for(var r=[],l=new o.DOMWalker(t);l.nextNode()&&l.node!=t&&l.node!=t.nextSibling;)l.bEndTag||a&&u.CommonUtil.shouldNodeBeSkippedHidden(l.node)||e.hasRole(l.node,i,n)&&r.push(l.node);return r},e.getDirectATChildren=function(t){var i=e.getRequiredChildRoles(t,!0),a=[];return e.retrieveDirectATChildren(t,i,a),a},e.retrieveDirectATChildren=function(t,i,a){var n=[];if(null!==t.children&&t.children.length>0)for(var r=0;r<t.children.length;r++)n.push(t.children[r]);var l=t.getAttribute("aria-owns");if(l){var o=t.ownerDocument;if(o){var u=l.split(" ");for(r=0;r<u.length;r++){var d=o.getElementById(u[r]);d&&n.push(d)}}}if(n.length>0){for(r=0;r<n.length;r++)if(!s.VisUtil.isNodeHiddenFromAT(n[r])&&s.VisUtil.isNodeVisible(n[r])){var c=e.getRoles(n[r],!1);null!==c&&0!==c.length||(c=e.getImplicitRole(n[r])),c&&null!==c&&c.length>0&&(c=c.filter(function(e){return"none"!==e&&"presentation"!==e})).includes("group")&&i&&i.includes("group")&&(c=c.filter(function(e){return"group"!==e})),c&&null!==c&&c.length>0?a.push(n[r]):e.retrieveDirectATChildren(n[r],i,a)}return null}return null},e.getRequiredChildRoles=function(t,i){var a=e.getRoles(t,!1);if(a&&0!==a.length||!i||(a=e.getImplicitRole(t)),!a||0===a.length)return null;var n=["none","presentation"];if(a.some(function(e){return n.includes(e)}))return null;for(var l=r.ARIADefinitions.designPatterns,o=new Array,s=0;s<a.length;++s)l[a[s]]&&null!==l[a[s]].reqChildren&&(o=u.CommonUtil.concatUniqueArrayItemList(l[a[s]].reqChildren,o));return o},e.getAriaOwnsWithRole=function(t,i){return e.getAriaOwnsWithRoleHidden(t,i,!1)},e.getAriaOwnsWithRoleHidden=function(t,i,a,n){var r=null,l=!1;if(u.CommonUtil.attributeNonEmpty(t,"aria-owns")){var o=t.getAttribute("aria-owns");if(r=c.FragmentUtil.getById(t,o),m.DOMUtil.sameNode(t,r))return null;l=a&&null!=r&&u.CommonUtil.shouldNodeBeSkippedHidden(r)?null:e.hasRole(r,i,n)}return l?r:null},e.hasAriaLabel=function(e){return u.CommonUtil.attributeNonEmpty(e,"aria-label")||u.CommonUtil.attributeNonEmpty(e,"aria-labelledby")},e.hasUniqueAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,r=!1,l=null;i&&(l=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===l&&(l={});for(var o=0;!r&&o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();r=s in l,l[s]=!0}else if(t[o].hasAttribute("aria-labelledby")){var d=t[o].getAttribute("aria-labelledby"),p=c.FragmentUtil.getById(t[o],d),h="";p&&!m.DOMUtil.sameNode(p,t[o])&&(h=e.getTextContentExcludingScripts(p));var g=u.CommonUtil.normalizeSpacing(h).toLowerCase();r=g in l,l[g]=!0}else r=!0;return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",l),!r},e.getTextContentExcludingScripts=function(e){if(!e)return"";for(var t="",i=new o.DOMWalker(e);i.nextNode()&&i.node!==e&&i.node!==e.parentNode;)if(!i.bEndTag){var a=i.node,n=a.nodeName?a.nodeName.toLowerCase():"";"script"!==n&&"style"!==n?3===a.nodeType?a.nodeValue&&a.nodeValue.trim().length>0&&(t+=" "+a.nodeValue.trim()):1===a.nodeType&&("img"===n&&a.hasAttribute("alt")||"input"===n&&"image"===a.getAttribute("type")&&a.hasAttribute("alt"))&&(t+=" "+a.getAttribute("alt").trim(),i.bEndTag=!0):i.bEndTag=!0}return t.trim()},e.getAriaLabel=function(t){if(t.hasAttribute){if(t.hasAttribute("aria-labelledby")){for(var i=t.getAttribute("aria-labelledby").trim().split(" "),a="",n=0,r=i.length;n<r;++n){var l=i[n],o=c.FragmentUtil.getById(t,l);if(o&&!m.DOMUtil.sameNode(o,t)){var s=e.getTextContentExcludingScripts(o);a+=u.CommonUtil.normalizeSpacing(s)}}return a.trim()}if(t.hasAttribute("aria-label"))return u.CommonUtil.normalizeSpacing(t.getAttribute("aria-label")).trim()}return""},e.getAriaDescription=function(t){if(!t)return"";var i="",a=t.getAttribute("aria-labelledby");if(a&&a.trim().length>0){for(var n=a.trim().split(" "),r=0,l=n.length;r<l;++r){var o=n[r],s=c.FragmentUtil.getById(t,o);if(s&&!m.DOMUtil.sameNode(s,t)){var d=e.getTextContentExcludingScripts(s);d&&d.trim().length>0&&(i+=u.CommonUtil.normalizeSpacing(d).toLowerCase())}}if(i.trim().length>0)return i.trim()}return(a=t.getAttribute("aria-description"))&&a.trim().length>0?a.trim().toLowerCase():""},e.findAriaLabelDupes=function(t){var i={};return t.forEach(function(t){i[e.getAriaLabel(t)]=(i[e.getAriaLabel(t)]||0)+1}),i},e.getLandmarkAccNames=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_Landmark_AccNames",null);if(i&&0!==i.length)return i;i=[];var r=t.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]');return 0===r.length?(n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i):(r.forEach(function(t){if(!s.VisUtil.isNodeHiddenFromAT(t)&&null===u.CommonUtil.getAncestor(t,["DIALOG"])&&null===e.getAncestorWithRole(t,"dialog",!0)){var n="",l=d.AccNameUtil.computeAccessibleName(t);l&&l.name&&l.name.trim().length>0&&(n=l.name.trim());var o=a([],r,!0).filter(function(e){return e.contains(t)&&e!==t});o.length>1&&o.forEach(function(e){var t=d.AccNameUtil.computeAccessibleName(e);t&&t.name&&t.name.trim().length>0&&(n=t.name.trim()+" "+n)});var c=e.getResolvedRole(t);i.push({elem:t,role:c,name:n})}}),n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i)},e.isLandmarkNameUnique=function(t,i,a){void 0===a&&(a=!1);var n,r=e.getLandmarkAccNames(t.ownerDocument);if(!(n="any"===i?r.find(function(e){return e.elem===t}):r.find(function(e){return e.elem===t&&e.role===i})))return null;var l=n.name;if(!a&&""===l)return null;for(var o=0;o<r.length;o++)if(r[o].elem!==t&&l===r[o].name){if("any"===i)return!0;if(r[o].role===i)return!0}return!1},e.hasUniqueAriaLabels=function(t){return e.hasUniqueAriaLabelsLocally(t,!0)},e.hasDuplicateAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,r=null,l=new Array;i&&(r=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===r&&(r={});for(var o=0;o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();r[s]=!0,s in l||(l[s]=new Array),l[s].push(t[o].nodeName.toLowerCase())}else if(t[o].hasAttribute("aria-labelledby")){for(var d=t[o].getAttribute("aria-labelledby").trim().split(" "),p="",h=0,g=d.length;h<g;++h){var b=d[h],_=c.FragmentUtil.getById(t[o],b);if(_&&!m.DOMUtil.sameNode(_,t[o])){var f=e.getTextContentExcludingScripts(_);p+=u.CommonUtil.normalizeSpacing(f).toLowerCase()}}r[p]=!0,p in l||(l[p]=new Array),l[p].push(t[o].nodeName.toLowerCase())}return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",r),l},e.hasDuplicateAriaLabels=function(t){return e.hasDuplicateAriaLabelsLocally(t,!0)},e.hasUniqueAriaLabelledby=function(e){for(var t=!1,i={},a=0;!t&&a<e.length;++a)if(e[a].hasAttribute&&e[a].hasAttribute("aria-labelledby")&&!u.CommonUtil.isIdReferToSelf(e[a],e[a].getAttribute("aria-labelledby"))){var n=u.CommonUtil.normalizeSpacing(e[a].getAttribute("aria-labelledby"));t=n in i,i[n]=!0}else t=!0;return!t},e.getElementAriaProperty=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_ElementAriaProperty",null);if(!i){var l=null;if(t.tagName?l=t.tagName.toLowerCase():t.nodeName&&(l=t.nodeName.toLowerCase()),null==(i=r.ARIADefinitions.documentConformanceRequirement[l])){var o=r.ARIADefinitions.documentConformanceRequirementSpecialTags[l];switch(l){case"a":case"area":i=t.hasAttribute("href")?o["with-href"]:o["without-href"];break;case"figure":var s=u.CommonUtil.getChildByTag(t,"figcaption");i=null!==s&&s.length>0?o["child-figcaption"]:o["no-child-figcaption"];break;case"footer":case"header":i=null!==e.getAncestorWithRole(t,"article",!0)||null!==e.getAncestorWithRole(t,"complementary",!0)||null!==e.getAncestorWithRole(t,"navigation",!0)||null!==e.getAncestorWithRole(t,"region",!0)||null!==u.CommonUtil.getAncestor(t,["article","aside","main","nav","section"])?o["des-section-article-aside-main-nav"]:o.other;break;case"img":var d=t.hasAttribute("alt")?t.getAttribute("alt"):null,c=t.hasAttribute("title")?t.getAttribute("title"):null;i=0!==e.getAriaLabel(t).trim().length||null!==d&&d.length>0||null!==c&&c.length>0?o["img-with-accname"]:null!==d?o["img-without-accname-empty-alt"]:o["img-without-accname-no-alt"];break;case"input":if(u.CommonUtil.attributeNonEmpty(t,"type")){var p=t.getAttribute("type").trim().toLowerCase();if(null==(i=o[p]))switch(p){case"checkbox":i=u.CommonUtil.attributeNonEmpty(t,"aria-pressed")?o["checkbox-with-aria-pressed"]:o["checkbox-without-aria-pressed"];break;case"email":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["email-with-list"]:o["email-no-list"];break;case"search":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["search-with-list"]:o["search-no-list"];break;case"tel":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["tel-with-list"]:o["tel-no-list"];break;case"text":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"url":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["url-with-list"]:o["url-no-list"];break;default:i=u.CommonUtil.attributeNonEmpty(t,"list")?o["default-with-list"]:o["default-no-list"]}}else i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"li":o=r.ARIADefinitions.documentConformanceRequirementSpecialTags.li,i=t.parentElement&&e.hasRoleInSemantics(t.parentElement,"list")?o["child-of-list-role"]:o["no-child-of-list-role"];break;case"section":var h=e.getAriaLabel(t);i=h&&h.trim().length>0||u.CommonUtil.attributeNonEmpty(t,"title")?o["with-name"]:o["without-name"];break;case"select":o=r.ARIADefinitions.documentConformanceRequirementSpecialTags.select,i=t.hasAttribute("multiple")||u.CommonUtil.attributeNonEmpty(t,"size")&&t.getAttribute("size")>1?o["multiple-attr-size-gt1"]:o["no-multiple-attr-size-gt1"];break;case"summary":o=r.ARIADefinitions.documentConformanceRequirementSpecialTags.summary,i=t.parentElement&&"details"===t.parentElement.nodeName.toLowerCase()&&m.DOMUtil.sameNode(a([],t.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],t)?o["first-summary-of-detail"]:o["no-first-summary-of-detail"];break;case"tbody":case"td":case"tr":i=null!==e.getAncestorWithRole(t,"table",!0)?o["des-table"]:e.getAncestorWithRole(t,"grid",!0)||e.getAncestorWithRole(t,"treegrid",!0)?o["des-grid"]:o["des-other"];break;case"th":var g=u.CommonUtil.getScopeForTh(t);i=null!==e.getAncestorWithRole(t,"table",!0)?"column"===g?o["des-table-column-scope"]:o["des-table-row-scope"]:null!==e.getAncestorWithRole(t,"grid",!0)||null!==e.getAncestorWithRole(t,"treegrid",!0)?"column"===g?o["des-grid-treegrid-column-scope"]:o["des-grid-treegrid-row-scope"]:o["des-other"];break;case"div":var b=t.parentElement;i=null!==b&&"dl"===b.nodeName.toLowerCase()?o["child-dl"]:o["no-child-dl"];break;default:i=r.ARIADefinitions.documentConformanceRequirementSpecialTags.default}}}return n.CacheUtil.setCache(t,"AriaUtil_ElementAriaProperty",i),i||null},e.getAllowedAriaRoles=function(t,i){var a=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaRoles",null);if(!a){a=[];var r;if(null!=(r=null!=i?i:e.getElementAriaProperty(t))){null!==r.implicitRole&&u.CommonUtil.concatUniqueArrayItemList(r.implicitRole,a),null!==r.validRoles&&u.CommonUtil.concatUniqueArrayItemList(r.validRoles,a);var l=e.getImplicitRole(t);l&&l.length>0&&u.CommonUtil.concatUniqueArrayItemList(r.validRoles,a)}n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaRoles",a)}return a},e.getAllowedAriaAttributes=function(t,i,l){var o=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaAttributes",null);if(!o){o=[];var s=a([],i,!0),d=t.tagName.toLowerCase(),c=[];r.ARIADefinitions.elementsAllowedDisabled.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-disabled",o)),r.ARIADefinitions.elementsAllowedRequired.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-required",o)),r.ARIADefinitions.elementsAllowedReadOnly.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-readonly",o));var m=null;if(null!=(m=null!=l&&void 0!==l?l:e.getElementAriaProperty(t))){if(null!==m.implicitRole&&(null==s||0===s.length)&&void 0===m.allowAttributesFromImplicitRole)for(var p=0;p<m.implicitRole.length;p++){var h=r.ARIADefinitions.designPatterns[m.implicitRole[p]];if(null!=h){var g=h.props;u.CommonUtil.concatUniqueArrayItemList(g,o),g=e.getRoleRequiredProperties(m.implicitRole[p],t),u.CommonUtil.concatUniqueArrayItemList(g,o),(v=h.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===m.implicitRole[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuenow","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(m.globalAriaAttributesValid){var b=r.ARIADefinitions.globalProperties;u.CommonUtil.concatUniqueArrayItemList(b,o)}}for(m&&m.otherRolesForAttributes&&m.otherRolesForAttributes.length>0&&u.CommonUtil.concatUniqueArrayItemList(m.otherRolesForAttributes,s),p=0;null!==s&&p<s.length;p++){var _=r.ARIADefinitions.designPatterns[s[p]];if(null!=_){if(!m||null===m.implicitRole||!m.implicitRole.includes(s[p])||m.implicitRole.includes(s[p])&&void 0===m.allowAttributesFromImplicitRole){var f=_.props;u.CommonUtil.concatUniqueArrayItemList(f,o),f=e.getRoleRequiredProperties(s[p],t),u.CommonUtil.concatUniqueArrayItemList(f,o)}var v;(v=_.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===s[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(s.includes("row")&&null==e.getAncestorWithRole(t,"treegrid",!0)){var A=-1;(A=o.indexOf("aria-level"))>-1&&o.splice(A,1),(A=o.indexOf("aria-setsize"))>-1&&o.splice(A,1),(A=o.indexOf("aria-posinset"))>-1&&o.splice(A,1)}if(m&&m.otherAllowedAriaAttributes&&m.otherAllowedAriaAttributes.length>0){for(var w=[],y=0;y<m.otherAllowedAriaAttributes.length;y++)if((R=m.otherAllowedAriaAttributes[y]).includes("=")){var C=R.split("=");t.getAttribute(C[0])===C[1]&&w.push(C[0])}else w.push(R);w.length>0&&u.CommonUtil.concatUniqueArrayItemList(w,o)}if(m&&m.otherDisallowedAriaAttributes&&m.otherDisallowedAriaAttributes.length>0){var k=[];for(y=0;y<m.otherDisallowedAriaAttributes.length;y++){var R;(R=m.otherDisallowedAriaAttributes[y]).includes("=")?(C=R.split("="),t.getAttribute(C[0])===C[1]&&k.push(C[0])):k.push(R)}k.length>0&&u.CommonUtil.concatUniqueArrayItemList(k,c)}o=u.CommonUtil.reduceArrayItemList(c,o),i&&0!==i.length||null!==m.implicitRole||!m.prohibitedAriaAttributesWhenNoImplicitRole||(o=u.CommonUtil.reduceArrayItemList(m.prohibitedAriaAttributesWhenNoImplicitRole,o)),n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaAttributes",o)}return o},e.getConflictOrOverlappingHtmlAttribute=function(e,t,i){var a=r.ARIADefinitions.relatedAriaHtmlAttributes[e.name];if(a){if(!e||0==e.length||!t||0==t.length)return[];var n=[],l=null;if("conflict"===i){if(!a.conflict||0===Object.keys(a.conflict).length)return null;l=a.conflict}else{if("overlapping"!==i)return null;if(!a.overlapping||0===Object.keys(a.overlapping).length)return null;l=a.overlapping}for(var o=!1,s=!1,u=0;u<l.length;u++)for(var d=l[u].ariaAttributeValue,c=l[u].htmlAttributeNames,m=l[u].htmlAttributeValues,p=0;p<t.length;p++){var h=c.indexOf(t[p].name);if(-1!==h){o=!0;var g=null===m||null===m[h]?null:m[h].split(",");null===d?(null===g||g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0):null===g?d===e.value&&(n.push({result:"Failed",attr:t[p].name}),s=!0):("VALUE"===d&&g.includes("VALUE")&&g[0]!==e.value||d===e.value&&g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0)}}return o&&!s&&n.push({result:"Pass",attr:""}),n}return null},e.containsPresentationalChildrenOnly=function(t){var i=e.getRoles(t,!1);if(i&&0!==i.length||(i=e.getImplicitRole(t)),!i||0===i.length)return!1;for(var a=0;null!==i&&a<i.length;a++){var n=r.ARIADefinitions.designPatterns[i[a]];if(null!=n&&!0===n.presentationalChildren)return!0}return!1},e.shouldBePresentationalChild=function(t){for(var i=o.DOMWalker.parentElement(t);i;){if(e.containsPresentationalChildrenOnly(i))return!0;i=l.ARIAMapper.getAriaOwnedBy(i)||o.DOMWalker.parentElement(i)}return!1},e.areRolesDefined=function(e){if(!e||0===e.length)return null;for(var t=r.ARIADefinitions.designPatterns,i=0,a=e;i<a.length;i++)if(!(a[i].toLowerCase()in t))return!1;return!0},e.getInvalidRoles=function(t){var i=e.getUserDefinedRoles(t);if(!i||0===i.length)return null;if(i&&i.includes("generic"))return["generic"];var a=e.getElementAriaProperty(t),n=e.getAllowedAriaRoles(t,a);if(!n||0===n.length)return i;var r=[];if(n.includes("any"))return[];for(var l=0;l<i.length;l++)n.includes(i[l])||r.includes(i[l])||r.push(i[l]);return r},e.getRolesUndefinedByAria=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=r.ARIADefinitions.designPatterns,l=0;l<i.length;l++)i[l]in n||a.push(i[l]);return a},e.getInvalidAriaAttributes=function(t){var i=e.getUserDefinedRoles(t),a=e.areRolesDefined(i);if(null!==a&&!a)return null;var n=[];i&&0!=i.length||(i=e.getImplicitRole(t));var r=e.getUserDefinedAriaAttributes(t),l=e.getElementAriaProperty(t),o=e.getAllowedAriaAttributes(t,i,l);if(r)for(var s=0;s<r.length;s++){var u=r[s].trim().toLowerCase();o.includes(u)||n.includes(u)||n.push(u)}return n},e.getConflictAriaAndHtmlAttributes=function(t){var i=e.getUserDefinedAriaAttributeNameValuePairs(t),a=e.getUserDefinedHtmlAttributeNameValuePairs(t),n=[];if(i&&i.length>0&&a&&a.length>0)for(var r=function(t){var r=e.getConflictOrOverlappingHtmlAttribute(i[t],a,"conflict");if(null===r)return"continue";r.forEach(function(e){"Failed"===e.result&&n.push({ariaAttr:i[t].name,htmlAttr:e.attr})})},l=0;l<i.length;l++)r(l);return n},e.getDeprecatedAriaRoles=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=r.ARIADefinitions.globalDeprecatedRoles,l=0;l<i.length;l++)n.includes(i[l])&&a.push(i[l]);return a},e.getDeprecatedAriaAttributes=function(t){if(!t)return null;var i=t.attributes,a=[];if(i)for(var n=0;n<i.length;n++){var l=i[n].name;"aria-"===l.substring(0,5)&&a.push(l)}if(0===a.length)return[];var o=[],s=r.ARIADefinitions.globalDeprecatedProperties;for(n=0;n<a.length;n++)s.includes(a[n])&&o.push({role:"any",attribute:a[n]});var u=e.getRoles(t,!1);if(u&&u.length>0)for(n=0;n<u.length;n++){var d=r.ARIADefinitions.designPatterns[u[n]];if(d){var c=d.deprecatedProps;if(c&&c.length>0)for(var m=0;m<a.length;m++)c.includes(a[m])&&o.push({role:u[n],attribute:a[m]})}}return o},e.isNodeInGrid=function(t){return null!=e.getAncestorWithRole(t,"grid")},e.navLinkKeywords=["start","next","prev","previous","contents","index"],e.rulesThatHaveToCheckHidden=["RPT_Elem_UniqueId"],e.ariaAttributeRoleDefaults={alert:{"aria-live":"assertive","aria-atomic":"true"},combobox:{"aria-haspopup":"listbox"},listbox:{"aria-orientation":"vertical"},log:{"aria-live":"polite"},menu:{"aria-orientation":"vertical"},menubar:{"aria-orientation":"horizontal"},meter:{"aria-valuemin":"0","aria-valuemax":"100"},option:{"aria-selected":"false"},progressbar:{"aria-valuemin":"0","aria-valuemax":"100"},scrollbar:{"aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},separator:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},slider:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},spinbutton:{},status:{"aria-live":"polite","aria-atomic":"true"},tab:{"aria-selected":"false"},tablist:{"aria-orientation":"horizontal"},toolbar:{"aria-orientation":"horizontal"},tree:{"aria-orientation":"vertical"}},e.ariaAttributeGlobalDefaults={"aria-atomic":"false","aria-autocomplete":"none","aria-busy":"false","aria-checked":void 0,"aria-current":"false","aria-disabled":"false","aria-dropeffect":"none","aria-expanded":void 0,"aria-grabbed":void 0,"aria-haspopup":"false","aria-hidden":void 0,"aria-invalid":"false","aria-live":"off","aria-modal":"false","aria-multiline":"false","aria-multiselectable":"false","aria-orientation":void 0,"aria-pressed":void 0,"aria-readonly":"false","aria-required":"false","aria-selected":void 0,"aria-sort":"none"},e.ariaAttributeImplicitMappings={"aria-autocomplete":{form:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},input:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},select:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},textarea:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"}},"aria-checked":{input:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},menuitem:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},"*":function(e){if(e.hasAttribute("indeterminate"))return"mixed"}},"aria-disabled":{button:function(e){return e.hasAttribute("disabled")?"true":"false"},fieldset:function(e){return e.hasAttribute("disabled")?"true":"false"},input:function(e){return e.hasAttribute("disabled")?"true":"false"},optgroup:function(e){return e.hasAttribute("disabled")?"true":"false"},option:function(e){return e.hasAttribute("disabled")?"true":"false"},select:function(e){return e.hasAttribute("disabled")?"true":"false"},textarea:function(e){return e.hasAttribute("disabled")?"true":"false"}},"aria-expanded":{details:function(e){return e.getAttribute("open")},dialog:function(e){return e.getAttribute("open")}},"aria-multiselectable":{select:function(e){if(e.hasAttribute("multiple"))return"true"}},"aria-placeholder":{input:function(e){return e.getAttribute("placeholder")},textarea:function(e){return e.getAttribute("placeholder")}},"aria-required":{input:function(e){return e.getAttribute("required")},select:function(e){return e.getAttribute("required")},textarea:function(e){return e.getAttribute("required")}}},e}();t.AriaUtil=p},4919(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CSSUtil=void 0;var a=i(4566),n=i(7139),r=i(7011),l=i(7507),o=i(3864),s=function(){function e(){}return e.selectorMatchesElem=function(e,t){if(!t||0===t.length||""===t.trim())return!1;try{if("function"==typeof e.matches)return e.matches(t);if("function"==typeof e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if("function"==typeof e.msMatchesSelector)return e.msMatchesSelector(t);if("function"==typeof e.matchesSelector)return e.matchesSelector(t);var i=e.ownerDocument||e.document;if(!i)return!1;var a=i.querySelectorAll(t);return Array.from(a).includes(e)}catch(e){return!1}},e.getComputedStyle=function(e,t){return e?e.ownerDocument.defaultView.getComputedStyle(e,t):null},e.getParsedStylesheetRules=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_ParsedStylesheetRules",null);if(t)return t;for(var i=[],n=0;n<e.styleSheets.length;++n){var r=e.styleSheets[n];try{if(r&&r.cssRules)for(var l=0;l<r.cssRules.length;++l){var o=r.cssRules[l],s=o.selectorText;if(s){var u=s.match(/^(.*)(:[a-zA-Z-]*)$/),d=!!u,c=d?u[1]:s,m=d?u[2]:"";i.push({fullRuleSelector:s,hasPseudoClass:d,selMain:c,selPseudo:m,style:o.style})}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_ParsedStylesheetRules",i),i},e.fillStyle=function(e,t){for(var i=0;i<t.length;++i){if("all"===t[i]&&t[t[i]]){for(var a=0,n=e;a<n.length;a++){var r=n[a];for(var l in r)delete r[l]}break}l=t[i];for(var o=0,s=e;o<s.length;o++){r=s[o];var u=t.getPropertyPriority(l);if(l in r&&r[l].endsWith("!important")){if("important"!==u||r[l].startsWith("inherit")||r[l].startsWith("unset"))continue;r[l]=t[l]+" !important"}else r[l]=t[l]+("important"===u?" !important":"")}}},e.getDefinedStylesInternal=function(t,i,a){for(var n={},r={},l={},o=0,s=a;o<s.length;o++){var u=s[o];r[u]={},l[u]={}}for(var d=e.getParsedStylesheetRules(t.ownerDocument),c=a.includes(":focus"),m=function(n){if(null!==i&&!i.some(function(e){return!!n.style[e]}))return"continue";var o=n.selPseudo,s=n.hasPseudoClass,u=n.selMain;if(c&&":focus"===o&&(u=u.replace(/([ >][^+~ >]+):focus-within/g,"$1")),e.selectorMatchesElem(t,u))for(var d=0,m=a;d<m.length;d++){var p=m[d],h=r[p],g=l[p];s||e.fillStyle([h,g],n.style),o===p&&e.fillStyle([g],n.style)}},p=0,h=d;p<h.length;p++)m(h[p]);for(var g=0,b=a;g<b.length;g++){u=b[g];var _=r[u],f=l[u];if(e.fillStyle([_,f],t.style),""===u)n[u]=_;else{for(var v={},A=Object.keys(f),w=0;w<A.length;w++){var y=A[w];f[y]!==_[y]&&(v[y]=f[y])}n[u]=v}}return n},e.getDefinedStylesMultiple=function(t,i,n){if(!t)return null;var r={},l=null===i?"all":i.slice().sort().join(","),o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[l],u=[];if(s){for(var d=0,c=n;d<c.length;d++)void 0!==s[g=c[d]]?r[g]=s[g]:u.push(g);if(0===u.length)return r}else s={},u=n;if(u.length>0){for(var m=e.getDefinedStylesInternal(t,i,u),p=0,h=u;p<h.length;p++){var g;r[g=h[p]]=m[g],s[g]=m[g]}o[l]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o)}return r},e.getDefinedStyles=function(t,i,n){if(!t)return null;var r=null===i?"all":i.slice().sort().join(","),l=n||"",o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[r];if(s||(s={}),void 0!==s[l])return s[l];var u=e.getDefinedStylesInternal(t,i,[l])[l];return s[l]=u,o[r]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o),u},e.getMediaOrientationTransform=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_MediaOrientationTransforms",null);if(t)return t;for(var i={},n=0;n<e.styleSheets.length;++n){var r=e.styleSheets[n];try{if(r&&r.cssRules)for(var l=0;l<r.cssRules.length;++l){var o=r.cssRules[l];if(4===o.MEDIA_RULE){var s=o;if(s&&s.media)for(var u=s.media,d=0;d<u.length;d++)if(u.item(d)){var c=u.item(d).toLocaleLowerCase(),m=i[c];m||(m={});for(var p=s.cssRules,h=0;h<p.length;++h)if(1===p[h].STYLE_RULE){var g=p[h],b=g.selectorText;if(b){for(var _={},f=g.style,v=0;v<f.length;++v){var A=f[v],w=A.toLocaleLowerCase();if("transform"===w){if("all"===A&&f[A]){_={};break}_[A]=f[A]}else"rotate"===w&&(_[A]=f[A])}Object.keys(_).length>0&&(m[b]=_)}}Object.keys(m).length>0&&(i[c]=m)}}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_MediaOrientationTransforms",i),i},e.getRotationDegree=function(e){var t=0;try{if(!e)return t;for(var i=(e=e.replaceAll(", ",",")).split(" "),a=0;a<i.length;a++){var n=i[a].trim();if(""!==n)if(n.startsWith("rotate3d")){var r=n.indexOf("("),l=n.indexOf(")");if(-1!==r&&-1!==l){var o=n.substring(r+1,l),s=void 0;if(o&&(s=o.split(",")),s&&4===s.length){if(!(d=s[3]))continue;if((d=d.trim()).endsWith("turn")){var u=d.substring(0,d.length-4);u=parseFloat(u),isNaN(u)||(t=360*u)}else d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}}else if(n.startsWith("rotate")||n.startsWith("rotateZ")){if(r=n.indexOf("("),l=n.indexOf(")"),-1!==r&&-1!==l){var d;if(!(d=n.substring(r+1,l)))continue;(d=d.trim()).endsWith("turn")?(u=d.substring(0,d.length-4),u=parseFloat(u),isNaN(u)||(t=360*u)):d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}else if(n.startsWith("matrix3d")){if(r=n.indexOf("("),l=n.indexOf(")"),-1!==r&&-1!==l&&(o=n.substring(r+1,l),s=null,o&&(s=o.split(",")),null!==s)){var c=Math.atan2(s[4],s[5]);t+=Math.round(Math.round(180*c/Math.PI))}}else n.startsWith("matrix")&&(r=n.indexOf("("),l=n.indexOf(")"),-1!==r&&-1!==l&&(o=n.substring(r+1,l),s=null,o&&(s=o.split(",")),null!==s&&(c=Math.atan2(s[1],s[0]),t+=Math.round(Math.round(180*c/Math.PI)))))}for(;t>=360;)t-=360}catch(e){throw console.log("Cannot retrieve rotation degree: "+e),e}return t},e.getPixelsFromStyle=function(t,i){if(!t)return 0;var a=t.trim().match(/(-?[\d.]+)([a-z%]*)/);if(null===a)return 0;if(""===a[2]||0===a[1])return 0;var n=e.convertValue2Pixels(a[2],a[1],i);return null===n?n:parseFloat(n)},e.convertValue2Pixels=function(e,t,i){if(0===t)return 0;e||(e="px");var a={px:function(e){return e},cm:function(e){return 37.8*e},mm:function(e){return 3.78*e},q:function(e){return.95*e},in:function(e){return 96*e},pc:function(e){return 16*e},pt:function(e){return 1.33*e},rem:function(e){return e*parseFloat(getComputedStyle(i.ownerDocument.documentElement).getPropertyValue("font-size"))},em:function(e){return e*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))},vw:function(e){return e/100*i.ownerDocument.defaultView.innerWidth},vh:function(e){return e/100*i.ownerDocument.defaultView.innerHeight},"%":function(e){return e/100*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))}};return e in a?a[e](t):null},e.isMaterialIconFont=function(t){var i={"Material Icons":"https://fonts.googleapis.com/icon?family=Material+Icons"},a=e.getDefinedStyles(t,["font-family"])["font-family"],n=!1;if(a&&a.split(",")[0].replace(/['"]+/g,"").trim()in i&&(n=!0),!n){var r=t.classList;for(var l in{"material-icons":"https://fonts.googleapis.com/icon?family=Material+Icons"})if(r.contains(l)){n=!0;break}}if(!n)return!1;for(var o=!1,s=t.ownerDocument.styleSheets,u=0;u<s.length;u++)if(s&&s.length>0&&Object.values(i).indexOf(s[u].href)>-1){o=!0;break}return o},e.getWeightNumber=function(e){var t={light:100,bold:700};return parseInt(e)||(e in t?t[e]:400)},e.getFontInPixels=function(t,i){var a=parseFloat(t);if(!a)return{"xx-small":16,"x-small":10,small:13,medium:16,large:18,"x-large":24,"xx-large":32}[t];var n=t.substring((""+a).length);return e.convertValue2Pixels(n,a,i)},e.getCSSStyle=function(e){var t="";if(null===e)return[];if(e.IBM_CSS_THB)return e.IBM_CSS_THB;if("style"===e.nodeName.toLowerCase())void 0!==(t=e.innerText)&&""!==t.trim()||(t=e.textContent);else{if(!e.hasAttribute("style"))return[];t=e.getAttribute("style")}if(null===t||0===t.trim().length)return[];var i=/\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g,a=/\s*([^{]*){([^}]*)}/g;if(-1===(t=t.replace(/(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g," ")).indexOf("{")){for(var n={},r=void 0;null!=(r=i.exec(t));)n[r[1]]=r[2].trim().toLowerCase();var l=[{selector:null,values:n}];return e.IBM_CSS_THB=l,l}l=[],r=void 0;for(var o=void 0;null!=(r=a.exec(t));){n={};for(var s=r[1],u=r[2];null!=(o=i.exec(u));)n[o[1]]=o[2].trim().toLowerCase();l.push({selector:s,values:n})}return e.IBM_CSS_THB=l,l},e.getInlineStatus=function(e){if(!e)return null;var t=getComputedStyle(e);if(!t)return null;var i={inline:!1,text:!1,violation:null};if("inline"!==t.getPropertyValue("display"))return i;i.inline=!0;var a=e.parentElement;if(!a)return i;var r=new l.DOMMapper,o=r.getUnadjustedBounds(e),s=getComputedStyle(a).getPropertyValue("display");if("block"!==s&&"inline-block"!==s)return n.CommonUtil.isInnerTextOnlyEmpty(a)||(i.text=!0),i;function u(e,t){if(e.nodeType===Node.TEXT_NODE)return e.nodeValue&&e.nodeValue.trim().length>0?"yes":"no";if(e.nodeType===Node.ELEMENT_NODE){if("br"===e.nodeName.toLowerCase())return"block";if("inline"===getComputedStyle(e).getPropertyValue("display")){if(n.CommonUtil.isTarget(e)&&o.width<24){var a=r.getUnadjustedBounds(e);return t&&Math.round(o.width/2)+o.left-a.left<24||!t&&Math.round(o.width/2)+o.left-(a.left+a.width)<24?(i.violation=e.nodeName.toLowerCase(),"violation"):"no"}return n.CommonUtil.isInnerTextOnlyEmpty(e)?"no":"yes"}return"block"}return"block"}for(var d=e.nextSibling;d;){if("yes"===(c=u(d,!0))){i.text=!0;break}if("block"===c)break;d=d.nextSibling}for(d=e.previousSibling;d;){var c;if("yes"===(c=u(d,!1))){i.text=!0;break}if("block"===c)break;d=d.previousSibling}return i},e.isTargetBrowserDefault=function(t){if(!t)return!1;var i=r.AriaUtil.getRoles(t,!1);if(i&&i.length>0)return!1;var a=e.getDefinedStyles(t,["line-height","height","width","min-height","min-width","font-size","margin-top","margin-bottom","margin-left","margin-right"]);return!(a["line-height"]||a.height||a.width||a["min-height"]||a["min-width"]||a["font-size"]||a["margin-top"]||a["margin-bottom"]||a["margin-left"]||a["margin-right"])},e.containsCKJ=function(e){return!!e&&e.trim().replace(/(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g,"").length!==e.trim().length},e.getAncestorWithStyles=function(t,i,n){void 0===n&&(n=[]);var r="AriaUtil_AncestorWithStyles_"+JSON.stringify(i)+"_"+JSON.stringify(n),l=a.CacheUtil.getCache(t,r,null);if(null!==l)return"NOT_FOUND"===l?null:l;for(var s=t;null!==s;)if(1===s.nodeType&&"http://www.w3.org/2000/svg"!==s.namespaceURI){var u=e.getDefinedStyles(s,Object.keys(i));for(var d in i){var c=u[d];if(c&&(c=c.split(" ")[0],!n.includes(c))){var m=i[d];if(m.includes("*"))return a.CacheUtil.setCache(t,r,s),s;if(m.includes(c))return a.CacheUtil.setCache(t,r,s),s}}s=o.DOMWalker.parentElement(s)}else s=o.DOMWalker.parentElement(s);return a.CacheUtil.setCache(t,r,"NOT_FOUND"),null},e.getValueUnitPair=function(e){if(!e)return null;if(Number.isInteger(e))return["px",e];var t=parseInt(e);if(isNaN(t))return null;var i=(e=e.trim().toLowerCase()).trim().match(/([a-z]+)$/),a="px";return i&&(a=i[1]),[a,t]},e}();t.CSSUtil=s},4566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CacheUtil=void 0;var a=i(1686),n=i(3864),r=function(){function e(){}return e.getCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0===a.aceCache[t]&&(a.aceCache[t]=i),a.aceCache[t]}},e.setCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),a.aceCache[t]=i,i}},e.getSetCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0!==a.aceCache[t]&&void 0!==a.aceCache[t]||(a.aceCache[t]=i()),a.aceCache[t]}},e.clearCaches=function(e){var t,i=0;delete e.ownerDocument.aceCache;var r=new n.DOMWalker(e,!1,e,!0);do{++i,delete r.node.aceCache,r.node.ownerDocument&&delete r.node.ownerDocument.aceCache}while(r.nextNode());if(e!==(null===(t=e.ownerDocument)||void 0===t?void 0:t.documentElement)){for(var l=new n.DOMWalker(e.ownerDocument.documentElement,!1,void 0,!0),o=l.node,s=void 0;s=n.DOMWalker.parentElement(o);)o=s;l.node=o;do{l.bEndTag||!a.DOMUtil.sameNode(e,l.node)?(delete l.node.aceCache,l.node.ownerDocument&&delete l.node.ownerDocument.aceCache):l.bEndTag=!0}while(l.nextNode())}return i},e}();t.CacheUtil=r},167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ClipPathUtil=void 0;var a=i(4566),n=i(4919),r=function(){function e(){}return e.isNodeVisuallyHiddenByClipPath=function(t){if(!t||1!==t.nodeType)return!1;var i=t,r=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",void 0);if(void 0!==r)return r;var l=n.CSSUtil.getComputedStyle(i),o=parseInt(l.width),s=parseInt(l.height),u=l["clip-path"];if(!u||"none"===u.trim()||""===u.trim())return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var d=(u=u.trim().replace(/\s+/g," ").toLowerCase()).indexOf("inset(");if(-1!==d){var c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")"));if(-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),1===(f=m.trim().split(" ")).length){var p=e.isClippedByInset(i,f[0],f[0],f[0],f[0]);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(2===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[0],f[1]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(3===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[1],f[2]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(4===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[2],f[3]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(-1!==(d=u.indexOf("rect("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),"auto"===(f=m.trim().split(" "))[0]&&(f[0]="0px"),"auto"===f[3]&&(f[3]="0px"),"auto"===f[1]&&(f[1]="100%"),"auto"===f[2]&&(f[2]="100%"),f[2]=Math.max(f[0],f[2]),f[1]=Math.max(f[1],f[3]);var h=parseInt(f[0]);if(isNaN(h))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))h=h*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(h)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;h=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(h>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var g=parseInt(f[3]);if(isNaN(g))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))g=g*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(g)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;g=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(g>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var b=parseInt(f[1]);if(isNaN(b))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))b=b*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(b)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;b=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}var _=parseInt(f[2]);if(isNaN(_))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))_=_*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(_)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;_=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return _-h<=e.THRESHOLD||b-g<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("xywh("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c));var f=m.trim().split(" "),v=parseInt(f[0]);if(isNaN(v))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))v=v*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(top)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;v=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(v>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var A=parseInt(f[1]);if(isNaN(A))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))A=A*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(A)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;scrollY=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(A>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var w=parseInt(f[2]);if(isNaN(w))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))w=w*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(w)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;w=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(w<=e.THRESHOLD)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0;var y=parseInt(f[3]);if(isNaN(y))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))y=y*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(y)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;y=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return y<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("circle("))){f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ");var C=parseInt(f[0]);if(isNaN(C))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))C=C*(o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("ellipse("))){if((f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ")).length>3&&"closest-side"===f[0]&&"farthest-side"===f[1]&&"at"===f[2]){if(C=parseInt(f[3]),4===f.length){if(f[3].endsWith("%"))C=C*(N=o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(5===f.length)for(var k=3;k<f.length;k++){var R=parseInt(f[k]);if(f[k].endsWith("%"))R=R*(N=3===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(R)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;R=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return R<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}var x=u.indexOf("at");if(m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==x&&(m=u.substring(u.indexOf("(")+1,x)),2!==(f=m.trim().split(" ")).length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(k=0;k<f.length;k++){if(C=parseInt(f[k]),f[k].endsWith("%"))C=C*(N=0===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}if(-1!==(d=u.indexOf("polygon("))){"nonzero"!==(f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(","))[0]&&"evenodd"!==f[0]||f.shift(),A=0,v=0;var P=!1,T=!1;for(k=0;k<f.length;k++){var U=f[k].trim().split(" ");if(2!=U.length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(var I=[0,0],E=0;E<2;E++){var N=parseInt(U[E]);if(isNaN(N))return!1;if(U[E].endsWith("%"))I[E]=0===E?N*o/100:N*s/100;else{var L;if(!(L=n.CSSUtil.getValueUnitPair(U[E])))return!1;I[E]=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}}0===k&&(v=I[0],A=I[1]),Math.abs(I[0]-v)>=e.THRESHOLD&&(P=!0),Math.abs(I[1]-A)>=e.THRESHOLD&&(T=!0)}return P&&T?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1},e.isClippedByInset=function(t,i,a,r,l){void 0===a&&(a="0px"),void 0===r&&(r="0px"),void 0===l&&(l="0px");var o=n.CSSUtil.getComputedStyle(t),s=parseInt(o.width),u=parseInt(o.height),d=parseInt(i);if(isNaN(d))return!1;if(i.endsWith("%"))d=d*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(i)))return!1;d=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(d>u)return!1;var c=parseInt(a);if(isNaN(c))return!1;if(a.endsWith("%"))c=c*s/100;else{if(!(h=n.CSSUtil.getValueUnitPair(a)))return!1;c=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(c>s)return!1;var m=parseInt(r);if(isNaN(m))return!1;if(r.endsWith("%"))m=m*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(r)))return!1;m=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(m>u)return!1;var p=parseInt(l);if(isNaN(p))return!1;if(l.endsWith("%"))p=p*s/100;else{var h;if(!(h=n.CSSUtil.getValueUnitPair(l)))return!1;p=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}return!(p>s)&&(u-(d+m)<=e.THRESHOLD||s-(c+p)<=e.THRESHOLD)},e.THRESHOLD=5,e}();t.ClipPathUtil=r},3883(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ColorObj=t.ColorUtil=void 0;var a=i(3864),n=function(){function e(){}return e.Color=function(t){if(!t)return null;if("transparent"===(t=t.toLowerCase()))return new r(255,255,255,0);if(t in e.CSSColorLookup&&(t=e.CSSColorLookup[t]),t.startsWith("rgb(")){var i=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;return null===(a=t.match(i))?null:new r(a[1],a[2],a[3])}var a;if(t.startsWith("rgba("))return i=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(a=t.match(i))?null:new r(a[1],a[2],a[3],a[4]);if("#"!=t.charAt(0))return null;4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2));var n=parseInt(t.substring(1,3),16),l=parseInt(t.substring(3,5),16),o=parseInt(t.substring(5,7),16);return new r(n,l,o)},e.ColorCombo=function(t){try{var i=t.ownerDocument;if(!i)return null;var n=i.defaultView;if(!n)return null;for(var r=[],l=t;l;)1===l.nodeType&&r.push(l),l=a.DOMWalker.parentElement(l);var o={hasGradient:!1,hasBGImage:!1,textShadow:!1,fg:null,bg:null},s=(b=n.getComputedStyle(t)).color;s||(s="black");for(var u=e.Color(s),d=/transparent|rgba?\([^)]+\)/gi,c=function(e,t,i){try{if(void 0===e.length)return e;for(var a=null,n=null,r=1;r<e.length;++r){for(var l=e[r-1],o=i.contrastRatio(e[r-1]),s=.1,u=0;s>1e-4;){for(;u+s<=1&&o>i.contrastRatio(e[r].mix(e[r-1],u+s).getOverlayColor(t));)l=e[r].mix(e[r-1],u+s).getOverlayColor(t),o=i.contrastRatio(l),u+=s;for(;u-s>=0&&o>i.contrastRatio(e[r].mix(e[r-1],u-s).getOverlayColor(t));)l=e[r].mix(e[r-1],u-s).getOverlayColor(t),o=i.contrastRatio(l),u-=s;s/=10}(null===n||n>o)&&(n=o,a=l)}return a}catch(e){console.log(e)}return t},m=e.Color("white"),p=null,h=null,g=null;r.length>0;){var b,_=r.pop();if(null!==(b=n.getComputedStyle(_))){var f=null;if(b.backgroundColor&&"transparent"!=b.backgroundColor&&"rgba(0, 0, 0, 0)"!=b.backgroundColor&&(f=e.Color(b.backgroundColor)),b.backgroundImage&&b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")){var v=b.backgroundImage.match(d);if(v){for(var A=[],w=0;w<v.length;++w)if(v[w].length){var y=e.Color(v[w]);if(void 0!==y.alpha&&y.alpha<1){var C=g||m;y=y.getOverlayColor(C)}A.push(y)}else v.splice(w--,1);f=c(A,g||m,u)}}null===p||b.opacity&&b.opacity.length>0&&parseFloat(b.opacity)<1?(null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),p=1,h=null,g=null,b.opacity&&b.opacity.length>0&&(p=parseFloat(b.opacity)),null!=f&&(h=(g=f).alpha||1,delete g.alpha,1===p&&1===h&&(o.hasBGImage=!1,o.hasGradient=!1))):null!=f&&(null===g?(h=(g=f).alpha||1,delete g.alpha):h=(g=f.getOverlayColor(g)).alpha||1,1===p&&1===h&&1===(g.alpha||1)&&f.alpha),b.backgroundImage&&"none"!=b.backgroundImage&&(b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")?o.hasGradient=!0:o.hasBGImage=!0)}}return null!=g&&delete(u=u.getOverlayColor(g)).alpha,u.alpha=(u.alpha||1)*p,u=u.getOverlayColor(m),null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),o.fg=u,o.bg=m,b.textShadow&&"none"!==b.textShadow&&(o.textShadow=!0),o}catch(e){return null}},e.CSSColorLookup={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",buttontext:"rgba(0, 0, 0, 0.847)",buttonface:"#ffffff",graytext:"rgba(0, 0, 0, 0.247)"},e}();t.ColorUtil=n;var r=function(){function e(e,t,i,a){function n(e){if("string"!=typeof e)return e;var t=e;return"%"!=(t=t.trim())[t.length-1]?parseInt(t):Math.round(2.55*parseFloat(t.substring(0,t.length-1)))}this.red=n(e),this.green=n(t),this.blue=n(i),void 0!==a&&(this.alpha="string"==typeof a?parseFloat(a):a)}return e.prototype.toHexHelp=function(e){var t=Math.round(e).toString(16);return 1===t.length?"0"+t:t},e.prototype.toHex=function(){return"#"+this.toHexHelp(this.red)+this.toHexHelp(this.green)+this.toHexHelp(this.blue)},e.prototype.contrastRatio=function(e){var t=this;void 0!==this.alpha&&(t=this.getOverlayColor(e));var i=t.relativeLuminance();if(!e.relativeLuminance){var a="";for(var n in e)a+=n+"\n";alert(e),alert(a)}var r=e.relativeLuminance();return i>r?(i+.05)/(r+.05):(r+.05)/(i+.05)},e.prototype.relativeLuminance=function(){var e=this.red/255,t=this.green/255,i=this.blue/255;return.2126*(e=e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4))},e.prototype.mix=function(t,i){if(void 0===this.alpha&&void 0===t.alpha)return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue);var a=this.alpha?this.alpha:1,n=t.alpha?t.alpha:1;return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue,i*a+(1-i)*n)},e.prototype.getOverlayColor=function(e){if(void 0===this.alpha||this.alpha>=1)return this;if(this.alpha<0)return null;if(void 0!==e.alpha&&e.alpha<1)return null;var t=this.mix(e,this.alpha);return delete t.alpha,t},e.fromCSSColor=function(t){var i=-1,a=-1,r=-1;if((t=t.toLowerCase()).startsWith("rgb(")){var l=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;if(null===(o=t.match(l)))return null;i=o[1],a=o[2],r=o[3]}else if(t.startsWith("rgba(")){var o;if(l=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(o=t.match(l)))return null;i=o[1],a=o[2],r=o[3]}else{if("#"!=t.charAt(0)){if(!(t in n.CSSColorLookup))return null;t=n.CSSColorLookup[t]}var s=function(e){for(var t={a:10,b:11,c:12,d:13,e:14,f:15},i=0,a=0;a<e.length;++a)i=16*i+parseInt(e.charAt(a)in t?t[e.charAt(a)]:e.charAt(a));return i};4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2)),i=s(t.substring(1,3)),a=s(t.substring(3,5)),r=s(t.substring(5,7))}return new e(i,a,r)},e}();t.ColorObj=r},7139(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,r=t.length;n<r;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.CommonUtil=void 0;var n=i(9910),r=i(4566),l=i(7011),o=i(1950),s=i(3946),u=i(1686),d=i(3864),c=i(5279),m=function(){function e(){}return e.wordCount=function(e){return 0===(e=e.trim()).length?0:e.split(/\s+/g).length},e.isTabbable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;if(t.hasAttribute("inert")||u.DOMUtil.getAncestorWithAttribute(t,"inert",""))return!1;if(t.hasAttribute("tabindex"))return parseInt(t.getAttribute("tabindex"))>=0;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}var n=t.getAttribute("contenteditable");return"true"===n||""===n},e.isFocusable=function(t){return"undefined"!==t&&null!==t&&e.isTabbable(t)},e.isClickable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!(!l.AriaUtil.isWidget(t)||!t.hasAttribute("tabindex"))},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e.tabIndexLEZero=function(t){if(e.hasAttribute(t,"tabindex")&&t.getAttribute("tabindex").match(/^-?\d+$/)){var i=parseInt(t.getAttribute("tabindex"));return 0===i||-1===i}return!1},e.getTabbableChildren=function(t){var i=0;if(t.firstChild||"IFRAME"===t.nodeName.toUpperCase())for(var a=new d.DOMWalker(t);a.nextNode()&&a.node!=t;)1==a.node.nodeType&&!a.bEndTag&&e.isTabbable(a.node)&&++i;return i},e.normalizeSpacing=function(e){return e?e.trim().replace(/\s+/g," "):""},e.isHtmlEquiv=function(e,t){var i=!1;if(e&&"input"===e.nodeName.toLowerCase()){var a=e.getAttribute("type").toLowerCase();a&&(-1!=t.indexOf("checkbox")?i="checkbox"===a:-1!=t.indexOf("radio")&&(i="radio"===a))}return i},e.nonExistantIDs=function(t,i){var a="";if(e.normalizeSpacing(i).length<1)return a;for(var n=i.split(" "),r=t.ownerDocument,l=0;l<n.length;l++){var o="//*[@id='"+n[l]+"']";r.evaluate(o,t,r.defaultNSResolver,0,null).iterateNext()||(a+=n[l]+", ")}return e.normalizeSpacing(a).length>=2?a.substring(0,a.length-2):""},e.getDocElementsByTag=function(e,t){var i=c.FragmentUtil.getOwnerFragment(e);t=t.toLowerCase();var a=r.CacheUtil.getCache(i,"RPT_DOCELEMSBYTAG",{});return t in a||(a[t]=i.querySelectorAll(t),r.CacheUtil.setCache(i,"RPT_DOCELEMSBYTAG",a)),a[t]},e.getChildByTag=function(t,i){return e.getChildByTagHidden(t,i,!1,!1)},e.getChildByTagHidden=function(t,i,a,n){for(var r=[],l=t.firstChild;null!=l;){if(l.nodeName.toLowerCase()===i){if((a||n&&!e.shouldCheckHiddenContent(l))&&!s.VisUtil.isNodeVisible(l)){l=l.nextSibling;continue}r.push(l)}l=l.nextSibling}return r},e.getElementsByRole=function(t,i){return e.getElementsByRoleHidden(t,i,!1,!1)},e.getElementsByRoleHidden=function(t,i,a,n){var o=null;if(null===(o=n?r.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",null):r.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE",null))){o={};for(var s=t.body;null!==d.DOMWalker.parentNode(s);)s=d.DOMWalker.parentNode(s);for(var u=new d.DOMWalker(s);u.nextNode();)if(u.elem()&&!u.bEndTag){var c=[];if(u.elem()&&u.elem().hasAttribute("role")&&(c=u.elem().getAttribute("role").split(" ")),u.elem()&&0===c.length&&n){var m=l.AriaUtil.getImplicitRole(u.node);null!==m&&m.length>0&&(c=m)}if(0===c.length)continue;if(a&&e.shouldNodeBeSkippedHidden(u.node))continue;for(var p=0;p<c.length;++p)c[p]in o||(o[c[p]]=[]),o[c[p]].push(u.node)}n?r.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",o):r.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE",o)}var h=[];if("string"==typeof i){var g=i;(i=[]).push(g)}if(i.length)for(p=0;p<i.length;++p){var b=o[i[p]];if(b)for(var _=0;_<b.length;++_)h.push(b[_])}return h},e.isTarget=function(t){if(!t||1!==t.nodeType||["html","body"].includes(t.nodeName.toLowerCase())||null!==e.getAncestor(t,["svg","pre","code","script","meta","head"])||!s.VisUtil.isNodeVisible(t)||s.VisUtil.isNodeVisuallyHidden(t)||e.isNodeDisabled(t)||s.VisUtil.isElementOffscreen(t))return!1;if(e.isClickable(t))return!0;var i=l.AriaUtil.getResolvedRole(t);if(!i)return!1;if(["listitem","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","treeitem"].includes(i)){var a=t.parentElement;if(a&&"group"===l.AriaUtil.getResolvedRole(a)&&(a=a.parentElement),a&&e.isTarget(a))return!0}return!1},e.getFileExt=function(e){var t=e.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);return null!=t&&t.length>=2?"."+t[1]:""},e.getFileAnchor=function(e){var t=e.match(/#(([^;?\.]|^$)+)([;?]|$)/);return null!=t&&t.length>=2?t[1]:""},e.checkObjEmbed=function(t,i,a){var n=t.nodeName.toLowerCase();if("object"!=n&&"embed"!=n&&"a"!=n&&"area"!=n)return!1;var r=!1;if(!r&&t.hasAttribute("type")&&(r=a(t.getAttribute("type").toLowerCase())),!r&&t.hasAttribute("codetype")&&(r=a(t.getAttribute("codetype"))),!r){var l="";"embed"===n?l=t.getAttribute("src"):"a"===n||"area"===n?l=t.getAttribute("href"):t.hasAttribute("data")&&(l=t.getAttribute("data")),null===l&&(l=""),r=i(e.getFileExt(l))}if(!r&&"object"===n)for(var o=e.getChildByTagHidden(t,"param",!1,!0),s=0;!r&&null!=o&&s<o.length;++s)r=o[s].hasAttribute("value")&&i(e.getFileExt(o[s].getAttribute("value")));return r},e.isAudioObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isAudioExt,function(e){return e.startsWith("audio")})},e.isAudioExt=function(t){return e.valInArray(t.toLowerCase(),[".aif",".aifc",".aiff",".air",".asf",".au",".cda",".dsm",".dss",".dwd",".iff",".kar",".m1a",".med",".mp2",".mp3",".mpa",".pcm",".ra",".ram",".rm",".sam",".sf",".sf2",".smp",".snd",".svx",".ul",".voc",".wav",".wma",".wve"])},e.isVideoObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isVideoExt,function(e){return e.startsWith("video")||e.startsWith("application/x-shockwave-flash")})},e.isVideoExt=function(t){return e.valInArray(t.toLowerCase(),[".asf",".avi",".divx",".dv",".m1v",".m2p",".m2v",".moov",".mov",".mp4",".mpeg",".mpg",".mpv",".ogm",".omf",".qt",".rm",".rv",".smi",".smil",".swf",".vob",".wmv",".rmvb",".mvb"])},e.isImageObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isImgExt,function(e){return e.startsWith("image")})},e.isImgExt=function(t){return e.valInArray(t.toLowerCase(),e.image_extensions)},e.isHtmlExt=function(t){return e.valInArray(t.toLowerCase(),[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml"])},e.hasTriggered=function(e,t){return r.CacheUtil.getCache(e,t,!1)},e.triggerOnce=function(e,t,i){if(i)return!0;var a=r.CacheUtil.getCache(e,t,!1);return r.CacheUtil.setCache(e,t,!0),a},e.valInArray=function(e,t){for(var i in t)if(t[i]===e)return!0;return!1},e.getAncestor=function(e,t){for(var i=e;null!==i;){var a=i.nodeName.toLowerCase();if("string"==typeof t){if(a===t.toLowerCase())break}else if(t.length){for(var n in t)if(t[n]===a)return i}else if(a in t)break;i=d.DOMWalker.parentNode(i)}return i},e.isSibling=function(e,t){if(e&&t){var i=null;for(d.DOMWalker.parentNode(e)&&d.DOMWalker.parentNode(e).firstChild&&(i=d.DOMWalker.parentNode(e).firstChild);i;){if(i===t)return!0;i=i.nextSibling}}return!1},e.isDescendant=function(e,t){for(var i=d.DOMWalker.parentNode(t);null!=i;){if(i===e)return!0;i=d.DOMWalker.parentNode(i)}return!1},e.isDisabledByFirstChildFormElement=function(t){var i=["input","textarea","select","keygen","progress","meter","output"];if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(i.includes(a.node.nodeName.toLowerCase()))return!!e.isNodeDisabled(a.node);return!1},e.isDisabledByReferringElement=function(t){for(var i=t.getAttribute("id"),a=t.ownerDocument.body;null!==d.DOMWalker.parentNode(a);)a=d.DOMWalker.parentNode(a);for(var n=new d.DOMWalker(a);n.nextNode();)if(n.node&&1===n.node.nodeType&&n.elem()&&(n.elem().getAttribute("aria-describedby")||"").split(" ").includes(i)&&e.isNodeDisabled(n.node))return!0},e.getInputLabel=function(t){return e.getLabelForElement(t)},e.getLabelForElement=function(t){return e.getLabelForElementHidden(t,!1)},e.getLabelForElementHidden=function(t,i){var a=t.getRootNode();if(!r.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",null)){for(var n={},l=e.getDocElementsByTag(t,"label"),o=0;o<l.length;++o)if(l[o].hasAttribute("for")){if(i&&!s.VisUtil.isNodeVisible(l[o]))continue;n[l[o].getAttribute("for")]=l[o]}r.CacheUtil.setCache((a.nodeType,a),"AriaUtil_LABELS",n)}if(t.hasAttribute("id")){var u=t.getAttribute("id");if(u.trim().length>0)return r.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",{})[u]}return null},e.getElementAttribute=function(e,t){if(!(t&&e&&e.hasAttribute&&e.hasAttribute(t)))return null;var i=e.getAttribute(t);if(!n.ARIADefinitions.referenceProperties.includes(t))return i;for(var a=i.split(/ +/g),r=!1,l=0;a<a.length;++l){var o=document.getElementById(a[l]);if(o&&!u.DOMUtil.sameNode(o,e)){r=!0;break}}return r?i:null},e.hasImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);return a=e.removeAllFormElementsFromLabel(a),e.hasInnerContentHidden(a)}return!1},e.getImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);a=e.removeAllFormElementsFromLabel(a);var n=e.getInnerText(a);return n&&""!==n.trim()?n.trim():null}return null},e.getFormFieldLabel=function(t){var i="",a=null,n=e.getLabelForElementHidden(t,!0);if(n)a=n.innerText;else{if(!(n=e.getAncestor(t,"label"))||"label"!==n.tagName.toLowerCase()||!e.isFirstFormElement(n,t))return null;var r=n.cloneNode(!0);r=e.removeAllFormElementsFromLabel(r),a=e.getInnerText(r)}return a&&""!==a.trim()&&(i+=a.trim()),(a=e.getLabelTextFromAttribute(n,!0))&&""!==a.trim()&&(i+=a.trim()),(a=l.AriaUtil.getAriaLabel(n))&&""!==a.trim()&&(i+=a.trim()),i.trim()},e.getLabelTextFromAttribute=function(t,i){for(var a=null,n=0;n<t.children.length;n++){var r=t.children.item(n);if(e.form_labelable_elements.includes(r.nodeName.toLowerCase())){a=r;break}}for(var c=new d.DOMWalker(t),m="";c.nextNode()&&c.node!==t;)if(c.node&&1===c.node.nodeType&&c.elem()){var p=c.elem();if(i&&(s.VisUtil.isNodeHiddenFromAT(p)||s.VisUtil.isNodePresentational(p))||a&&a.contains(p))continue;var h=l.AriaUtil.getResolvedRole(p);if("textbox"===h){var g=p.getAttribute("value");g&&g.trim().length>0&&(m+=" "+g.trim())}else if("combobox"===h||"listbox"===h){var b=p.getAttribute("aria-activedescendant")||p.getAttribute("aria-selected")||p.getAttribute("aria-checked");if(b){var _=p.ownerDocument.getElementById(b);if(_&&!u.DOMUtil.sameNode(p,_)){var f=o.AccNameUtil.computeAccessibleName(_);f&&f.name&&(m+=" "+f.name.trim())}}}else if(["progressbar","scrollbar","slider","spinbutton","meter"].includes(h)){var v=p.getAttribute("aria-valuetext");v&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("aria-valuenow"))&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("value"))&&v.trim().length>0&&(m+=" "+v.trim())}var A=l.AriaUtil.getAriaLabel(p);A&&""!==A.trim()&&(m+=" "+A.trim())}return m.trim()},e.isFirstFormElement=function(t,i){if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(-1!==e.form_labelable_elements.indexOf(a.node.nodeName.toLowerCase()))return a.node===i;return!1},e.isShadowHostElement=function(t){if(e.isShadowElement(t))return!1;for(var i=t;i;){if(i.shadowRoot)return!0;i=d.DOMWalker.parentElement(i)}return!1},e.isShadowElement=function(e){return"[object ShadowRoot]"===e.getRootNode().toString()},e.removeAllFormElementsFromLabel=function(e){for(var t=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"],i=e.childNodes,a=0;a<i.length;a++)t.indexOf(i[a].nodeName.toLowerCase())>-1&&e.removeChild(i[a]);return e},e.isIdReferToSelf=function(e,t){if(!t||""===t.trim())return!1;for(var i=t.trim().split(" "),a=0,n=i.length;a<n;++a){var r=c.FragmentUtil.getById(e,i[a]);if(r&&u.DOMUtil.sameNode(r,e))return!0}return!1},e.nodeDepth=function(e){for(var t=0,i=e;null!==i;)i=d.DOMWalker.parentNode(i),t+=1;return t},e.compareNodeOrder=function(t,i){if(t===i)return 0;var a=e.nodeDepth(t),n=e.nodeDepth(i);if(n>a){for(var r=0;r<n-a;++r)i=d.DOMWalker.parentNode(i);if(t===i)return-2}else if(a>n){for(r=0;r<a-n;++r)t=d.DOMWalker.parentNode(t);if(t===i)return 2}for(;null!=t&&null!=i&&d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i);)t=d.DOMWalker.parentNode(t),i=d.DOMWalker.parentNode(i);if(null===t||null===i||d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i))return null;for(;null!=i&&i!=t;)i=i.previousSibling;return null===i?1:-1},e.attributeNonEmpty=function(e,t){return e.hasAttribute(t)&&e.getAttribute(t).trim().length>0},e.getFrameByName=function(e,t){for(var i=[e.ownerDocument.defaultView],a=0;a<i.length;){try{if(i[a].name===t)return i[a];for(var n=0;n<i[a].frames.length;++n)try{i[a].frames[n]&&!i.includes(i[a].frames[n])&&i.push(i[a].frames[n])}catch(e){}}catch(e){}++a}return null},e.defaultNSResolver=function(e){var t;switch(e){case"html":t="http://www.w3.org/1999/xhtml";case"x2":t="http://www.w3.org/TR/xhtml2";case"x":t="http://www.w3.org/1999/xhtml";case"xhtml":t="http://www.w3.org/1999/xhtml";default:t=null}return t},e.isInnerTextOnlyEmpty=function(t){var i=t.innerText;null!=i&&0!==i.trim().length||"slot"===t.nodeName.toLowerCase()||void 0===t.textContent||(i=t.textContent);var a=!(null!==i&&i.trim().length>0);if(1===t.nodeType&&"slot"===t.nodeName.toLowerCase())for(var n=0,r=t.assignedNodes();n<r.length;n++){var l=r[n];a=a&&e.isInnerTextEmpty(l)}return a},e.getInnerText=function(e){var t=e.innerText;return null!=t&&""!==t.trim()||(t=e.textContent),t},e.getOnScreenInnerText=function(t){if(!t)return null;if(3===t.nodeType)return t.nodeValue();for(var i="",a=new d.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){if(1===a.node.nodeType&&(s.VisUtil.hiddenByDefaultElements.includes(a.node.nodeName.toLowerCase())||!s.VisUtil.isNodeVisible(a.node)||s.VisUtil.isElementOffscreen(a.node))){if("title"===a.node.nodeName.toLowerCase()&&e.getAncestor(a.node,"svg"))continue;if(a.node.nextSibling){3===a.node.nextSibling.nodeType&&a.node.nextSibling.nodeValue&&""!==a.node.nextSibling.nodeValue.trim()&&(i+=" "+a.node.nextSibling.nodeValue.trim()),a.node=a.node.nextSibling;continue}break}3===a.node.nodeType&&a.node.nodeValue&&""!==a.node.nodeValue.trim()&&(i+=" "+a.node.nodeValue.trim())}return i.trim()},e.getNodeText=function(e){if(!e)return"";for(var t="",i=e.childNodes,a=0;a<i.length;++a)3==i[a].nodeType&&(t+=i[a].nodeValue);return t},e.isInnerTextEmpty=function(t){var i=e.getInnerText(t);return!(null!=i&&i.trim().length>0)},e.hasInnerContent=function(t){var i=e.getInnerText(t),a=null!==i&&i.trim().length>0;if(null!==t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode();)a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt");return a},e.hasInnerContentHidden=function(t){return e.hasInnerContentHiddenHyperLink(t,!1)},e.svgHasName=function(t){return e.attributeNonEmpty(t,"aria-label")||e.attributeNonEmpty(t,"aria-labelledby")||!!t.querySelector(":scope > title")},e.hasInnerContentHiddenHyperLink=function(t,i){if(!t)return!1;var a=!1;if(null!=t.firstElementChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;){var r=n.node;if(!((a="img"===r.nodeName.toLowerCase()&&(e.attributeNonEmpty(r,"alt")||e.attributeNonEmpty(r,"title"))&&!s.VisUtil.isNodeHiddenFromAT(r)&&!s.VisUtil.isNodePresentational(r)||"svg"===r.nodeName.toLowerCase()&&e.svgHasName(r))||1!==r.nodeType||s.VisUtil.isNodeHiddenFromAT(r)||s.VisUtil.isNodePresentational(r)||(a=!e.isInnerTextOnlyEmpty(r))||!0!==i)){a=e.attributeNonEmpty(r,"aria-label")||e.attributeNonEmpty(r,"aria-labelledby");var l=r.ownerDocument;if(l){var o=l.defaultView;if(o){var u=o.getComputedStyle(r);a||null==u||(a=(u.backgroundImage&&u.backgroundImage.indexOf||u.content)&&e.attributeNonEmpty(r,"alt"))}}}3===r.nodeType&&d.DOMWalker.parentElement(r)===t&&(a=!e.isInnerTextEmpty(r))}else a=!e.isInnerTextEmpty(t);return a},e.hasInnerContentOrAlt=function(t){var i=e.getInnerText(t),a=null!=i&&i.trim().length>0||e.attributeNonEmpty(t,"alt");if(null!=t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;)!(a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt"))&&(l.AriaUtil.hasRole(n.node,"button",!0)||l.AriaUtil.hasRole(n.node,"textbox"))&&(l.AriaUtil.hasAriaLabel(n.node)||e.attributeNonEmpty(n.node,"title")||e.getLabelForElementHidden(n.elem(),!0))&&(a=!0);return a},e.concatUniqueArrayItem=function(e,t){return-1===t.indexOf(e)&&null!==e&&t.push(e),t},e.concatUniqueArrayItemList=function(t,i){for(var a=0;null!==t&&a<t.length;a++)i=e.concatUniqueArrayItem(t[a],i);return i},e.reduceArrayItemList=function(e,t){return t&&t.length>0&&e&&e.length>0?t.filter(function(t){return!e.includes(t)}):t},e.getScopeForTh=function(e){if(e.hasAttribute("scope")){var t=e.getAttribute("scope").toLowerCase();if("row"===t||"rowgroup"===t)return"row";if("col"===t||"colgroup"===t)return"column"}var i=a([],e.parentElement.children,!0).filter(function(e){return 1===e.nodeType&&"th"!=e.tagName.toLowerCase()});return null===i||0===i.length?"column":"row"},e.getControlOfLabel=function(t){var i=e.getAncestor(t,"label");if(i&&i.hasAttribute("for"))return c.FragmentUtil.getById(t,i.getAttribute("for"));for(var a={},n=t;n;){if(1===n.nodeType){var l=n;l.hasAttribute("id")&&(a[l.getAttribute("id")]=!0)}n=d.DOMWalker.parentNode(n)}if(0===Object.keys(a).length)return null;for(var o=1===t.nodeType?t.getAttribute("aria-labelledby"):null,s=r.CacheUtil.getSetCache(t.ownerDocument,"CommonUtil::getControlOfLabel",function(){return t.ownerDocument.querySelectorAll("*[aria-labelledby]")}),u=0;u<s.length;++u)for(var m=s[u],p=0,h=m.getAttribute("aria-labelledby").split(" ");p<h.length;p++)if(h[p]in a&&!e.isIdReferToSelf(t,o))return m;return null},e.isNodeDisabled=function(t){var i=r.CacheUtil.getCache(t,"PT_NODE_DISABLED",void 0);if(void 0!==i)return i;i=!1,3===t.nodeType&&(t=d.DOMWalker.parentNode(t));var a=t.nodeName.toLowerCase(),l=t.hasAttribute("disabled"),o=i,s=t.hasAttribute("aria-disabled")&&"true"===t.getAttribute("aria-disabled");if(o||l&&n.ARIADefinitions.elementsAllowedDisabled.indexOf(a)>-1||s)return i=!0,r.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),!0;var u=d.DOMWalker.parentNode(t);if(null!=u&&1===u.nodeType){var c=e.isNodeDisabled(u);return c&&(i=!0),r.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),c}return!1},e.shouldCheckHiddenContent=function(e){return!1},e.shouldNodeBeSkippedHidden=function(t){return!e.shouldCheckHiddenContent(t)&&!s.VisUtil.isNodeVisible(t)},e.isfocusableByDefault=function(t){return!("a"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||!("area"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||-1!==["input","select","button","textarea","option","area"].indexOf(t.nodeName.toLowerCase())},e.nonTabableChildCheck=function(t){if(!t.hasAttribute("tabindex")||-1!=parseInt(t.getAttribute("tabindex")))return!1;for(var i=new d.DOMWalker(t);i.nextNode();){var a=i.elem();if(null!==a&&a.hasAttribute("tabindex")&&-1!=parseInt(a.getAttribute("tabindex"))&&!e.hasInnerContent(a))return!1}return!0},e.hasAttribute=function(e,t){var i=!1;if(e.hasAttribute)i=e.hasAttribute(t);else if(e.attributes&&e.attributes.getNamedItem){var a=e.attributes.getNamedItem(t);i=a&&a.specified}return i},e.truncateText=function(e,t){return void 0===t&&(t=150),e&&(e=e.trim()).length>t?e.substring(0,t-1)+"...":e},e.input_type_with_placeholder=["text","search","tel","url","email","password","number"],e.input_text_types=["text","file","password","checkbox","radio","search","tel","url","email","date","number","range","time","color"],e.input_time_types=["date","month","week","time","datetime-local"],e.input_other_types=["range","color","checkbox","radio","file","image"],e.form_button_types=["button","reset","submit"],e.form_labelable_elements=["input","textarea","select","keygen","progress","meter","output","button"],e.tabTagMap={button:function(e){return!e.hasAttribute("disabled")},iframe:!0,input:function(e){if(e.hasAttribute("disabled")||"hidden"===e.getAttribute("type"))return!1;if("radio"===e.getAttribute("type")){var t=e.getAttribute("name");if(!t||0===t.trim().length)return!0;var i=e.ownerDocument.querySelectorAll("input[type='radio'][name='"+t.trim()+"']");if(0===i.length||1===i.length)return!0;for(var a=null,n=0;n<i.length;n++)i[n].checked&&(a=i[n]);return null!==a?!!u.DOMUtil.sameNode(a,e):!!u.DOMUtil.sameNode(i[0],e)}return!0},select:function(e){return!e.hasAttribute("disabled")},textarea:function(e){return!e.hasAttribute("disabled")&&"hidden"!==e.getAttribute("type")},a:function(e){return e.hasAttribute("href")},area:function(e){return e.hasAttribute("href")},audio:function(e){return e.hasAttribute("controls")},video:function(e){return e.hasAttribute("controls")},summary:function(e){return e.parentElement&&"details"===e.parentElement.nodeName.toLowerCase()&&u.DOMUtil.sameNode(a([],e.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],e)},details:function(e){return e.children&&0===a([],e.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()}).length}},e.image_extensions=[".bmp",".gif",".jpg",".jpeg",".pcx",".png"],e}();t.CommonUtil=m},9196(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.TableUtil=void 0;var a=i(3946),n=i(7011),r=i(7139),l=function(){function e(){}return e.isDataTable=function(e){return!(n.AriaUtil.hasRole(e,"none")||n.AriaUtil.hasRole(e,"presentation"))},e.isComplexDataTable=function(t){if("AriaUtil_isComplexDataTable"in t)return!!t.AriaUtil_isComplexDataTable;var i=!1;if(t&&e.isDataTable(t)){for(var a=null,n=null,l=t.getElementsByTagName("tr"),o=l.length,s=0,u=0,d=0,c=0;!i&&c<o;++c)if(a=l[c].getElementsByTagName("th"),n=l[c].getElementsByTagName("td"),u=a.length,0!==(s=n.length)){i=u>1;for(var m=0;!i&&m<u;++m)i=(a[m].hasAttribute("rowspan")||a[m].hasAttribute("colspan"))&&r.CommonUtil.getAncestor(a[m],"table")===t;for(var p=0;!i&&p<s;++p)i=(n[p].hasAttribute("rowspan")||n[p].hasAttribute("colspan")||n[p].hasAttribute("headers")&&r.CommonUtil.normalizeSpacing(n[p].getAttribute("headers")).split(" ").length>2)&&r.CommonUtil.getAncestor(n[p],"table")===t}else u>0&&++d,i=2===d;if(!i){var h=t.getElementsByTagName("thead"),g=h.length;g>0&&((i=g>1)||(i=h[0].getElementsByTagName("tr").length>1))}i||0===o||(i=u>0&&!e.tableHeaderExists(t))}return t.AriaUtil_isComplexDataTable=i,i},e.isTableCellEmpty=function(e){return!e||!a.VisUtil.isNodeVisible(e)||0===e.innerHTML.replace(/&nbsp;/g," ").trim().length},e.isTableRowEmpty=function(t){if(!t||!t.cells||0===t.cells.length||!a.VisUtil.isNodeVisible(t))return!0;for(var i=!0,n=0;i&&n<t.cells.length;n++){var r=t.cells[n];i=e.isTableCellEmpty(r)}return i},e.tableHeaderExists=function(t){var i=t.rows;if(!i||0===i.length)return null;for(var a=!0,n=i[0],l=0;a&&l<i.length;l++)(n=i[l]).parentNode&&"tfoot"===n.parentNode.nodeName.toLowerCase()||(a=e.isTableRowEmpty(n));if(a)return null;for(a=!0,l=0;a&&l<n.cells.length;l++){var o=n.cells[l];a=e.isTableCellEmpty(o)||"th"===o.nodeName.toLowerCase()}if(a)return!0;a=!0;for(var s=0;a&&s<i.length;++s)i[s].parentNode&&"tfoot"===i[s].parentNode.nodeName.toLowerCase()||(a=!i[s].cells||0===i[s].cells.length||0===i[s].cells[0].innerHTML.trim().length||"td"!=i[s].cells[0].nodeName.toLowerCase());if(a)return!0;a=!0;var u=[],d=[];for(l=0;a&&l<i.length;l++)for(var c=i[l],m=0;m<c.cells.length;m++)o=c.cells[m],e.isTableCellEmpty(o)||("td"===o.nodeName.toLowerCase()?o.getAttribute("headers")&&0!==o.getAttribute("headers").trim().length?r.CommonUtil.concatUniqueArrayItemList(o.getAttribute("headers").trim().split(" "),d):a=!1:"th"===o.nodeName.toLowerCase()&&o.getAttribute("id")&&o.getAttribute("id").trim().length>0&&r.CommonUtil.concatUniqueArrayItem(o.getAttribute("id").trim(),u));return!!(a&&u.length>0&&d.every(function(e){return u.includes(e)}))},e.isLayoutTable=function(e){return n.AriaUtil.hasRole(e,"presentation")||n.AriaUtil.hasRole(e,"none")},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e}();t.TableUtil=l},3946(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.VisUtil=void 0;var a=i(4566),n=i(1686),r=i(3864),l=i(7507),o=i(7011),s=i(4919),u=i(167),d=function(){function e(){}return e.isNodeVisible=function(t){3===t.nodeType&&(t=r.DOMWalker.parentNode(t));var i,n=t;if(1!==n.nodeType)return!0;if(!n.ownerDocument)return!0;var l=n.nodeName.toLowerCase();if(null!=e.hiddenByDefaultElements&&null!=e.hiddenByDefaultElements&&e.hiddenByDefaultElements.indexOf(l)>-1)return!1;var o=a.CacheUtil.getCache(n,"PT_NODE_HIDDEN",void 0);if(void 0!==o)return o;if(o=a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1),null===e.unhideableElements||void 0===e.unhideableElements||-1===e.unhideableElements.indexOf(l)){if(!n.ownerDocument.defaultView)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);i=n.ownerDocument.defaultView.getComputedStyle(n,null);var s=n.getAttribute("hidden"),d=o,c="boolean"==typeof n.hidden&&n.hidden;if(!i&&!c&&null==s&&!d)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);if(null!==i&&("none"===i.getPropertyValue("display")||!a.CacheUtil.getCache(n,"Visibility_Check_Parent",null)&&"hidden"===i.getPropertyValue("visibility"))||"block"!==i.getPropertyValue("display")&&(c||null!=s||d))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(e.isContentHidden(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(u.ClipPathUtil.isNodeVisuallyHiddenByClipPath(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1)}var m=r.DOMWalker.parentNode(n);if(null!=m&&1===m.nodeType){a.CacheUtil.setCache(m,"Visibility_Check_Parent",!0);var p=e.isNodeVisible(m);return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",p)}return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0)},e.isNodeVisuallyHidden=function(t){if(!t||1!==t.nodeType)return!1;var i=t,n=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN",void 0);if(void 0===n){var l=s.CSSUtil.getComputedStyle(i);if("absolute"===l.position&&l.clip&&"rect(0px,0px,0px,0px)"===l.clip.replaceAll(" ","")||l.opacity&&parseFloat(l.opacity)<.1)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",!0),!0;var o=r.DOMWalker.parentElement(i);if(!o)return!1;var u=e.isNodeVisuallyHidden(o);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",u),u}return n},e.isContentHidden=function(e){if(!e)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_ContentHidden",void 0);if(void 0!==t)return t;var i=getComputedStyle(e);return i?"hidden"!==i.getPropertyValue("content-visibility")||"inline"===i.getPropertyValue("display")?(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1)},e.isElementOffscreen=function(e){if(!e)return!0;if(1!==e.nodeType)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_Offscreen",void 0);if(void 0!==t)return t;var i=(new l.DOMMapper).getUnadjustedBounds(e);return i?0===i.height||0===i.width||i.top+i.height<=0||i.left+i.width<=0?(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0)},e.isNodeHiddenFromAT=function(t){if(!t)return!1;var i=a.CacheUtil.getCache(t,"PT_NODE_HiddenFromAT",void 0);return void 0!==i?i:e.isNodeVisible(t)&&"true"!==t.getAttribute("aria-hidden")?n.DOMUtil.getAncestorWithAttribute(t,"aria-hidden","true")?(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!1),!1):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0)},e.isNodePresentational=function(e){var t=o.AriaUtil.getResolvedRole(e);return!(!t||"none"!==t&&"presentation"!==t)},e.isElementScrollable=function(e){if(!e)return!1;var t=s.CSSUtil.getComputedStyle(e);if(!t)return!1;var i=t.getPropertyValue("overflow-x"),a=t.getPropertyValue("overflow-y");if("visible"!==i||"hidden"!==a&&"scroll"!==a&&"auto"!==a||(i="auto"),"visible"!==a||"hidden"!==i&&"scroll"!==i&&"auto"!==i||(a="auto"),"clip"===i&&"visible"!==a&&"clip"!==a&&(i="hidden"),"clip"===a&&"visible"!==i&&"clip"!==i&&(a="hidden"),!("visible"!==i&&"hidden"!==i&&"clip"!==i||"visible"!==a&&"hidden"!==a&&"clip"!==a))return!1;if(Math.max(e.offsetWidth,e.offsetHeight)<30||Math.min(e.offsetWidth,e.offsetHeight)<15)return!1;var n=s.CSSUtil.getPixelsFromStyle(t.paddingLeft,e)+s.CSSUtil.getPixelsFromStyle(t.paddingRight,e),r=s.CSSUtil.getPixelsFromStyle(t.paddingTop,e)+s.CSSUtil.getPixelsFromStyle(t.paddingBottom,e);return!(e.scrollWidth-e.clientWidth<1+n&&e.scrollHeight-e.clientHeight<1+r)},e.unhideableElements=["area","param","audio"],e.hiddenByDefaultElements=["script","link","style","head","meta","base","noscript","template","datalist"],e}();t.VisUtil=d},8855(e){e.exports=JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}')}};const t={};function i(a){const n=t[a];if(void 0!==n)return n.exports;const r=t[a]={exports:{}};return e[a].call(r.exports,r,r.exports,i),r.exports}let a={};(()=>{let e=a;Object.defineProperty(e,"__esModule",{value:!0}),e.checkDemo=e.SRViewer=e.SRCursor=e.SRController=e.DOMWalker=e.Config=e.ARIAMapper=e.Checker=e.Context=void 0;var t=i(920);Object.defineProperty(e,"Context",{enumerable:!0,get:function(){return t.Context}});var n=i(7412);Object.defineProperty(e,"Checker",{enumerable:!0,get:function(){return n.Checker}});var r=i(9955);Object.defineProperty(e,"ARIAMapper",{enumerable:!0,get:function(){return r.ARIAMapper}});var l=i(4516);Object.defineProperty(e,"Config",{enumerable:!0,get:function(){return l.Config}});var o=i(3864);Object.defineProperty(e,"DOMWalker",{enumerable:!0,get:function(){return o.DOMWalker}});var s=i(5233);Object.defineProperty(e,"SRController",{enumerable:!0,get:function(){return s.SRController}});var u=i(8195);Object.defineProperty(e,"SRCursor",{enumerable:!0,get:function(){return u.SRCursor}});var d=i(8107);Object.defineProperty(e,"SRViewer",{enumerable:!0,get:function(){return d.SRViewer}}),e.checkDemo=function(e){e||(e=0);var t=new n.Checker;setTimeout(function(){t.check(document.documentElement,["IBM_Accessibility","IBM_Design"]).then(function(e){console.log(e);for(var t={FAIL:0,POTENTIAL:1,MANUAL:2,PASS:3},i=0;i<e.results.length;++i)"PASS"===e.results[i].value[1]&&e.results.splice(i--,1);e.results.sort(function(e,i){return e.category!=i.category?e.category.localeCompare(i.category):e.path.aria===i.path.aria?t[e.value[1]]-t[i.value[1]]:e.path.aria.localeCompare(i.path.aria)});for(var a=null,n=null,r=0,l=e.results;r<l.length;r++){var o=l[r];n!==o.category&&(null!==n&&(console.groupEnd(),console.groupEnd(),a=null),n=o.category,console.group(o.category)),o.path.aria!=a&&(null!==a&&console.groupEnd(),""===(a=o.path.aria)?console.group("page"):console.group(a)),console.log(o.value,o.message)}console.groupEnd(),console.groupEnd()})},e)}})(),ace=a})(); \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.09.02/js/ace.js.LICENSE.txt b/rule-server/src/static/archives/2026.09.02/js/ace.js.LICENSE.txt new file mode 100644 index 000000000..614ccacb5 --- /dev/null +++ b/rule-server/src/static/archives/2026.09.02/js/ace.js.LICENSE.txt @@ -0,0 +1,15 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * 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. + */